2019年4月15日月曜日

Nintendo Switch を外出先でもテレビ出力する!「ACアダプタいら~ず」


こんにちは、ふじかーです。

遊んでますか? Nintendo Switch。

ウチの息子も「スマブラ」やら「にゃんこ大戦争」やら
Switchのゲームで毎日楽しそうに遊んでいます。


さてこのSwitch、ご存知の通り
 ・自宅ではテレビにつないで 据え置き機 として
 ・外出先では 携帯機 として
両方楽しめる人気のゲーム機ですが

実家や親戚の家にSwitchを持って遊びに行ったとき
「そこのテレビに映したい」
となると、
これが残念ながらHDMIケーブルだけでは出力できません。

悲しいかな大画面テレビの前のテーブルで
ちっさい画面で遊ぶご家庭も多いんじゃないでしょうか。

テーブルモード というそうです

自宅のテレビにつないでいる 純正ドック や ACアダプタ ごと
持っていけば当然できるんですが、

いちいちコンセントやHDMIケーブルなど配線を外すのも面倒だし
ドックもACアダプタも結構大きいので持っていくのも大変。



そんなわけで 純正ドックを使わずHDMI出力する環境 を準備したときのお話。


ACアダプタいら~ず


純正ドック以外で、Switch 本体から HDMI出力する機器を探すと
「変な日本語説明のあやしい中華製変換アダプタ」
とか
「純正ドックをばらして回路基板を取り出し、付け替えるためのスタンド」
とか
いろいろ怪しいのがでてくるんですが

その中でも一番まともそうなお店として、今まで何度か買い物したことのある
秋葉原の「サンコーレアモノショップ」の変換アダプタ「ACアダプタいら~ず」を購入。

こんな商品

まぁ変換アダプタ自体は 他の怪しい中華製品 と同じOEMのようですが
 ・何かあったときにサポートしてくれそう
 ・HDMIケーブル、USB給電ケーブルなどの付属品がついている
  (他の類似製品は安いけどアダプタ単体なので、別途付属品の購入が必要)
という事で、こちらをAmazonでポチリ。


本当に「ACアダプター要らず」なのか?


さてこちらの製品の特長。

他製品は大体
「純正のACアダプタを使用してね」
という商品が多いんですが

モバイルバッテリー や テレビのUSBポートUSB(5V/1A以上)に
付属のUSBケーブルを繋げば
「ACアダプタ無しでゲームできますよ」
というもの。

ただAmazonのレビューでは、電力不足で使用できないことが多い様です。

テレビのUSBポートには出力記載が見当たらず解らなかったですが
製品が届き テレビのUSBポートにつないで試したものの、案の定テレビには何も表示されません。

純正ACアダプタを使用すると安定してテレビ出力されました。流石純正。


USB充電器を使うという結論


やはりテレビのUSBポートは電力不足なんでしょう。
ただ純正ACアダプタは前述の通り嵩張るし
充電済みモバイルバッテリーを毎回用意するのも嫌です。

結局、下記のUSB急速充電器を用意しました。
Anker 24W 2ポート USB急速充電器

テレビのUSBポートの電力不足は織込み済み。
その場合の手段として、これが安定動作することを事前に調べていました。


ここから給電して試したところ、問題なくテレビ出力成功!

とても小さいので、1セットSwitchケースに忍ばせておけば
出先のテレビの大画面で、皆でゲームを楽しむことができます。


興味がある方は、試してみて下さいな。



☆☆☆☆☆ 2020/09/25 記事更新 ☆☆☆☆☆

コメントにて本当に出力が可能かとご意見頂きましたので、
実際に出力している時の写真を載せておきますね。




2019年4月5日金曜日

Windows 7からWindows 10にアップグレードしてみた!

Windows 7の延長サポート終了まで1年を切り、Windows 10への移行を真剣に考えなければならない時期になってきました。
ということで、Windows 7からWindows 10へのアップグレードにチャレンジしてみました。

Windows 10に無料でアップグレードできる!?


Windows 10への無償アップグレード期間はとっくに終了していますよね。
しかし、マイクロソフトのサイトからツールをダウンロードすると、無償でアップグレードできるようです。
なぜそうなっているのかはよく分かりません。

・Windows 10のダウンロード
https://www.microsoft.com/ja-jp/software-download/windows10


アップグレード開始!そして、安定のエラー発生


ダウンロードしたMediaCreationTool1809.exeを実行します。

「このPCを今すぐアップグレードする」を選択して進めます。






























途中、以下のディスプレイドライバーの警告画面が表示されましたが、「確認」を押して、そのまま進めました。






























PCが再起動され、Windows 10のインストールが進んでいるようでしたが、途中で中断され、Windows 7が起動してきました。
ログインすると、

0x800F0955 - 0x20003
INSTALL_UPDATES 操作中にエラーが発生したため、インストールはSAFE_OSフェーズで失敗しました

というエラー画面が表示されました。






























それならばと、ディスプレイドライバーを削除&再インストールした後、再度Windows 10をインストールしてみると、警告画面は表示されなくなったものの、結果は同じでした。

正解発表


検索してみたところ、最初に「このPCを今すぐアップグレードする」ではなく、「別のPCのインストール メディアを作成する」を選択して、インストールメディアを作成しなければならないようです。作成したインストールメディアのセットアップを実行し、その上で、更新プログラム等のダウンロードを「今は実行しない」ようにして進めれば、無事にWindows 10をインストールすることができました。(インストールにかかった時間は3~4時間です。)































おまけ


アップグレード後、Excelファイルを開こうとしたところ、一瞬開いたのち、終了するという現象に見舞われました。
一瞬開いたExcelのタイトルバーを確認すると、

XXXXX.xls [互換モード] - Excel(非商用目的) (ライセンスのない製品)

と表示されていたので、Excelの修復を実行しました。




























修復後にExcelファイルを開くと、ライセンス認証画面が表示されました。






































情報を入力し、無事Excelファイルを開くことができました。

またいつか、どこかで。

2019年3月29日金曜日

A5:SQLの便利機能

どうも、ひさびさのもりもりです。

はい、もりーとは別人です。

はい。

早速ですが、最近知った、衝撃的だったニュースです。

今回はA5:SQL Mk-2の便利な機能を紹介したいと思います。
というより、このツールをもう何年も使ってるのですが全然知らずで。。。

その機能というのが、「ソース文字列生成」と「コードストリッパー」です。

えぇぇぇぇぇっ!?
そんなん知らんかったん!?!?!?

というお声はナシでお願いします。。。

はい、知らなかったのです。。。
私もショックでした。。。
今まで、サクラなどのテキストエディタに貼っ付けて、矩形選択や正規表現の置換を駆使して頑張ってました。。。
はい。。。
まぁそんな駆使するほど難しいことでもないのですが、今回紹介する「ソース文字列生成」と「コードストリッパー」が
これまた便利のなんのって!

ご存知の方は無視してください。

ソース文字列生成


下記のようなSQLがあるとします。

SELECT *
  FROM TABLE_A
 WHERE COL1 = 'XXXX'

これをソースコードにSQL文の文字列としてコピペしたい!

そんなときはA5:SQLのSQLエディタで下記を実行するだけ!

1.SQLを選択



2.右クリック → ソース文字列生成 → ルールを選択
  ※今回はC#を例に挙げます。



3.生成された文字列を確認



4.ソースを貼り付け

var sb = new StringBuilder();

sb.Append("SELECT * ");
sb.Append("  FROM TABLE_A ");
sb.Append(" WHERE COL1 = 'XXXX' ");


そうです。
これだけなんです。

なんで今まで誰も教えてくれなかったんや~~~!!!
(いや、自分でメニューじっくり見ろよ。。。って話ですよね!すんません!)

今回はStringBuilder用の文字列を指定しましたが単純な文字列の連結やカスタムルールで作成することも可能です。

・単純な文字列の連結

var sql =
    "SELECT * "
    + "  FROM TABLE_A "
    + " WHERE COL1 = 'XXXX' ";

・カスタムルール
  先頭に「sb.AppendLine($" 」を付けて、「 ")」で閉じる



var sb = new StringBuilder();
var name = "MORI";

sb.AppendLine($" SELECT * ");
sb.AppendLine($"   FROM TABLE_A ");
sb.AppendLine($"  WHERE COL1 = '{name}' ");


サンプルのように数行だけなら全然エディタでの置換でもいいのですが、数十行のSQLになると矩形選択がまぁ面倒ですわね。
でもこれならイッパツでできます!

コードストリッパー


次は逆パターンで、ソースコードからSQLだけを抜き出します。

1.ソースのコピー

sb.AppendLine($" SELECT * ");
sb.AppendLine($"   FROM TABLE_A ");
sb.AppendLine($"  WHERE COL1 = 'XXXX' ");

2.A5:SQLのSQLエディタに貼り付けて選択



3.右クリック → コードストリッパー → XXXXのソースから~を選択



4.SQLを確認


ホンマこのツール、フリーとは思えない!

ご存知でない方は今すぐにでもご使用ください!

ではまた~



2019年3月24日日曜日

Windows電卓の実装を見てみる


お久しぶりです。やっまむーです。
プログラミングの練習で電卓を作ったことってありませんか?
私も最初の頃にコマンドライン上で動作する簡単な練習アプリを作ったことがあります。
四則演算するだけのものでしたが、動いたときは楽しかった事を覚えています。

3月6日にMicrosoftが「Windows電卓」をオープンソース化してGithubで公開しました。
たかが電卓、されど電卓。
前々から気になっていた、
「Windows電卓は普通に考える電卓と比較して何が違うのか」
を調べてみようと思います。

ソースコードを入手

さっそくGithubからソースコード一式を入手します。
https://github.com/Microsoft/calculator
公開後も更新されています

計算処理を探そう

続けてVisualStudioでソリューションを開きます。
なんか色々います。

UWP(ユニバーサルWindowsプラットフォーム)に対応しており、ソースコードはC++で書かれています。


調べていくとCalcManagerに計算関連の処理がまとめられていました。
この中で四則演算処理をしているのはscioper.cppのCCalcEngine::DoOperation()になります。

引数で演算子(operand)と左辺、右辺の数値(lhs、rhs)を受け取り、計算をしています。
左辺、右辺の型であるRationalクラスは次のようになっています。

m_p、m_qと値を二つ持っています。
なぜ二つあるのかはわかりませんが、それを意識せずに使うためにオペレータのオーバーライドを行っています。
例えば加算処理であれば、以下のようになっています。

CEngine/Rational.cpp
Rational operator+(Rational lhs, Rational const& rhs)
{
    lhs += rhs;
    return lhs;
}
Rational& Rational::operator+=(Rational const& rhs)
{
    PRAT lhsRat = this->ToPRAT();
    PRAT rhsRat = rhs.ToPRAT();

    try
    {
        addrat(&lhsRat, rhsRat, RATIONAL_PRECISION);
        destroyrat(rhsRat);
    }
    catch (DWORD error)
    {
        destroyrat(lhsRat);
        destroyrat(rhsRat);
        throw(error);
    }

    *this = Rational{ lhsRat };
    destroyrat(lhsRat);

    return *this;
}
RatPack/rat.cpp
//-----------------------------------------------------------------------------
//
//    FUNCTION: addrat
//
//    ARGUMENTS: pointer to a rational a second rational.
//
//    RETURN: None, changes first pointer.
//
//    DESCRIPTION: Does the rational equivalent of *pa += b.
//    Assumes base is internal throughout.
//
//-----------------------------------------------------------------------------

void addrat( PRAT *pa, PRAT b, int32_t precision)

{
    PNUMBER bot= nullptr;

    if ( equnum( (*pa)->pq, b->pq ) )
        {
        // Very special case, q's match.,
        // make sure signs are involved in the calculation
        // we have to do this since the optimization here is only
        // working with the top half of the rationals.
        (*pa)->pp->sign *= (*pa)->pq->sign;
        (*pa)->pq->sign = 1;
        b->pp->sign *= b->pq->sign;
        b->pq->sign = 1;
        addnum( &((*pa)->pp), b->pp, BASEX );
        }
    else
        {
        // Usual case q's aren't the same.
        DUPNUM( bot, (*pa)->pq );
        mulnumx( &bot, b->pq );
        mulnumx( &((*pa)->pp), b->pq );
        mulnumx( &((*pa)->pq), b->pp );
        addnum( &((*pa)->pp), (*pa)->pq, BASEX );
        destroynum( (*pa)->pq );
        (*pa)->pq = bot;
        trimit(pa, precision);

        // Get rid of negative zeros here.
        (*pa)->pp->sign *= (*pa)->pq->sign;
        (*pa)->pq->sign = 1;
        }

#ifdef ADDGCD
    gcdrat( pa );
#endif

}
こうして見るとなかなか興味深く、他の処理も解析すると勉強になりそうです。
また、UWPアプリの参考にもいいと思います。
皆さんもお時間があれば是非とも解析してみてはいかがでしょうか。

それではまた~。

2019年3月15日金曜日

MicroSDの読み書き速度を測定する


こんにちは。よっしーです。

最近、スマホ用にmicroSDを購入しました。

iPhoneはクラウド推しのためか、外部メディアすら

挿せなくなっていますが、私はAndroid派なので、

まだまだメモリーカードを使いまくりです。


で、メモリーカードって家電屋さんなんかで買うと、なかなかお値段するんですよ。

容量が大きくなるほど高くなるし、ブランドによってもかなり差があります。


なので、私はいつもコスパを重視し、レビューコメントを見つつ、

それなりに大丈夫そうなものをamazonでポチります。

今回256GBのメモリを買いましたが、お値段4980円でした。

メイドイン台湾!

聞いたこともないメーカーだったので、開封し、まずベンチマークを取ります。

CrystalDiskMark というソフトで計測しました。


パッケージには、最大読取り100MB/S、最大書込み80MB/S と謳われているので、

そこまで誤差なく仕様通りの数値が出ているなと思います。

4K動画の記録とかだと、12.5MB/S の書き込み速度が必要になってきますが、

79.52MB/S も出ているので十分耐えれるレベルだと思います。


というわけで、

最初は、聞いたことのないメーカー品で不安でしたが、

きちんと使えることがわかりました。


安心も含めて買うなら、有名ブランドのものを買うべきでしょうが、

下手な商品を買って、失敗しても自己責任。勉強代。と割り切れる人は、

こういう買い方がいいんではないでしょうか。ほんと安いですし。。。


皆さんも興味があれば買ってみてください。

もちろん自己責任で~。


ではまた~。

2019年3月11日月曜日

ASP.NETで簡単に帳票を出力する方法(DevExpress使用)

こんにちは、もりーです。

つい先日自社で、「ASP.NETで簡単に帳票出力する内容知らない」という
相談を受けました。

・自作で組む(パーツ化)
・CrystalReportsなどのツールを使用する
・etc...
など、実現方法は色々あると思いますが、
私が知っている「簡単に帳票出力する方法」についてご紹介したいと思います。
※今回は、一覧出力の帳票に関するご紹介です。

DevExpressとは

過去、私の記事でDevExpressについて簡単な紹介をさせて頂きましたが、
簡単に言うと、Microsoft .NET Framework用の開発支援ツールです。
.NET Frameworkの各コントロールを継承しており、
自作で作るとかなりの工数がかかっていたものが、
コントロールのプロパティ一つで設定/取得することができます。

本題の帳票出力サンプル

本ツールを使用すれば、帳票出力も少ないコードで効率的に実現することができます。
https://demos.devexpress.com/ASPxGridViewDemos/Exporting/Exporting.aspx

詳細は上記ページに、サンプル画面とサンプルコードがありますのでご確認頂けたらと思いますが、
ASP.NETのGridViewを継承した拡張コントロールのASPxGridViewが
「Excel出力」(※)という機能を持ち合わせているため、
WebフォームぺージでCommand定義するだけで
簡単に帳票出力することができることが分かります。
(※)その他、PDFやWordファイルなども、簡単に出力することができます。

仮に、上記のサンプルページの内容を、普通にASP.NETのPGMで組むとなると、
1.ExcelOpen
2.一覧表示しているDataSourceのデータを、ExcelWrite
3.ExcelClose
4.Download
と、(凄く簡単そうに書きましたが)わりと面倒くさいPGMが、Webフォームページ内の
コマンド1つ指定するだけで実現可能であることが分かります。

どうです?使いたくなったでしょう!?
色々凝ったものを作るとなると、PGMの改造が必要になりますが、
それでも自作で組むよりははるかに簡単であることが分かると思います。
利用してみたくなった・気になった方は、是非サンプルページなどで
色々な拡張コントロールを使用してみてください。

ではでは

2019年3月4日月曜日

ライブラリの使い方(静的リンクと2種類の動的リンク)について

こんにちは、ふじかーです。

先日現場で ライブラリのリンク方法 が話題に上がりました。

「提供いただいたライブラリが実行時に見つからず起動失敗してるようです」
「ライブラリのどの機能が呼ばれた時にエラーになってるんですかね?」
「いや、プログラム起動時にライブラリが見つからないので起動失敗してますね」
「あら、動的リンクですよね?APIコール時に探しに行くんじゃないんですか?」
「動的ですけど、リンクは起動時ですね」

ライブラリのリンク方法について説明するのにちょっと調べたので
確認した内容を整理しました。


ライブラリ


ライブラリとはご存知の通り、
 汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの(by Wikipedia)
 → ある機能を、ほかのプログラムから使用できるように部品化したファイル
といった物ですが

ライブラリは、それ自体が単独で実行されることはなく
自前プログラムからライブラリを結合して呼び出してやる必要があり、

その結合方法として
 1.静的リンク
 2.動的リンク
 3.動的ロード
があります。

1.は解りやすいんですが、
今回の会話では2.と3.がごっちゃになっていたようです。



静的リンク


プログラムのビルド時にライブラリを結合させて、
実行ファイルを作成する方法。

ライブラリは「静的ライブラリ」として自前プログラムの中に取り込まれる。
Windowsでは拡張子「.lib」、Linuxでは拡張子「.a」のファイルとなっている。

ファイルが見つからない場合、ビルドエラーとなる。




動的リンク


自前プログラムを起動させる時(メモリ上にロードする時)に、
ライブラリを結合する方法。
「起動時リンク」等と表現しているところもある。

この場合のライブラリは「動的ライブラリ」として
自前プログラムから見える(パスの通った)位置に格納しておく必要がある。
Windowsでは拡張子「.dll」、Linuxでは拡張子「.so」のファイルとなっている。

ファイルが見つからない場合、自前プログラムの起動に失敗する。




動的ロード


実行中の自前プログラムで、ライブラリの機能を使いたいタイミングで結合する方法。
「動的読み込み」「実行時リンク」等と表現しているところもある。

これも「動的リンク」の一部であり、上のと同じく
拡張子「.dll」「.so」のファイルが使用される。

自前プログラムのなかで「ライブラリ機能を使いたいタイミング」でパス指定するので
使いたい時にファイルが見つからなければ実行時エラーとなる。


また動的リンクでは
ライブラリで提供される関数をそのままコールすれば使えるんですが

動的ロードはそうはいかず
dlopen/dlsymでロード/ポインタ管理する必要があるなど
手間が増える方向になります。

用途としては
・プログラムにとって主要で外せない機能 → 動的リンク(起動時リンク)
・プログラムにとって無くても困らない機能 → 動的ロード(実行時リンク)
とするのが一般的なようです。