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でロード/ポインタ管理する必要があるなど
手間が増える方向になります。

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