C++でデータベースにアクセスしてみる

 C++からDBのデータを取得する方法を書こうと思ったのですが..
 書いてみると、DBを知らない人に非常に障害の多い内容であることに気付きました..

 DBを利用できると、整理された表からデータ引用がしやすいので複雑なデータ管理ができるようになるのです。
 でも、そもそもDB利用までの事前作業(DBエンジンのインストール、データベース・テーブルの作成、プログラムからDB接続する手段の準備)がいろいろと煩雑で、ある程度サーバの理解があるような人でないと、なかなか接続までの道のりが遠く険しいものになります..

 Windows&SQLServer(のlocalDB)であっても、SQLServer&ManagementStudioのインストール、localDB設定、データベースの作成が必要です。
 またC++による接続手続きもODBCオブジェクトでラクラク!というものではないですし、接続後にはSQL文というハードルも待っています…

 とても、5~10分でラクラクデータベース入門。というような内容にはなりません。
 (どっちかというと、10日間集中強化合宿!くらいのスパルタ学習が必要でしょう…)

 なので、以下の内容はなんとなく繋ぐまでの参考程度に見てください。

 見終わった時…せめてDB活用のためには、データベースおよびSQL文についてそれなりに学習が必要になることがわかれば幸いです..

続きを読む C++でデータベースにアクセスしてみる

C言語のプログラミングを学ぶには

 Windowsの開発環境であれば、以下のサイトで手に入ります。(C/C++/C#/VBのプログラミングができます。)
 Visual Studio Express 2013 for Windows Desktop

【追補】
 制限はありますが、コミュニティ版という全プラットフォーム対象バージョンもありました。
 Visual Studio Community 2013

 いろいろ方法はありますが、お金を掛けず気になる部分だけ学ぶ手っ取り早い方法は、ネット上に公開されているサンプルコードを自分で動かしてみることかと思います。
 コード レシピ:サンプルコードから学ぶ

 モノによっては、タダでは環境を用意することができない場合もあるかと思います。
 自分に投資してもよいと思うことであれば、上手にお金を使うのも1つの道です。ケチりすぎも大盤振る舞いも無駄なので、そのあたりはできるだけ情報を集めて、必要なところに必要なお金を出す道を探してください。そういうのも大事な勉強です。

 コードを動かしながら学ぶ以前に、プログラム言語の文法などに馴染みのない人はいきなりC++を学ぶよりも、VB/C#などでプログラムの動きのイメージを学ぶことが先かもしれません。
 ※C/C++言語は事前の準備に比較的煩雑な面がある上に毎回実行コードの生成と実行をしないといけないので、短いコードを書いてはすぐ実行して結果を得る、というようなトライ&エラーによる学び方には向かない傾向にあります。

 ただVisualStudioはリアルタイム・デバッガが強力なので、実行用のファイルが作れるようになれば動きも追いやすく学習がそれなりに捗るようになると思います。

 ところで…

 C/C++言語を学ぶ上でつまづくポイントは、たぶん言語仕様やアルゴリズム学習などではなくて、基本ライブラリの少なさ、ビルド用の設定記述、コンパイラのワーニングやエラーへの対応などではないかと思います。特にワーニングやエラーへの対応は比較的知識や経験が求められる部分なので、プログラムを学ぶ作業とは違う労力を要求されます。
 もし学びたいのがC/C++言語そのものではなく、なんらかの汎用プログラム言語であればよい。という話であれば、JavaやPythonなど別の言語をまず学ぶことをお勧めします。

 C/C++言語のメリットは、とにかくCPUに寄り添ったレベルでのプログラム開発ができることにつきます。
 JavaやPythonの場合は、直接CPUが解釈できる機械語を出力する作りではありません。あくまでもJavaやPythonというアプリケーションがまず動いているのが条件で、その上で自分の書いたプログラムが動きます。
 C/C++言語の場合は対応するCPU向けに機械語を出力するので、CPU上で直接動くプログラムを作ることができます。

 これにより、余分なプログラムが動くメモリ領域も処理も間に挟まないプログラムが作れます。
 理論的には最少かつ最速のアプリケーションを作成することができることになりますが、ほとんどなんの助けも間に挟まれないことになるので、プログラマの技量が処理結果にもろに影響します。

 趣味や片手間でプログラムをするには効率の悪さが目立つ言語なので、よほど速度やサイズの制限がキツイ状況でない限りは、別の言語を使った方が利口な選択と言えるかもしれません..

 とか言いつつ、『連載:簡単! Visual Studio 2013入門』という啓蒙だか販促だかの記事を見つけたのでいちおう貼っておく。

Pythonの特別な命名『__*__』の幾つかについて

めも。

__name__
 Pyhonオブジェクトが持っている”名称”に、アクセスする為の特別な名前。
 Pyhonオブジェクトにはクラス、関数、値など、Pythonの扱う情報はすべて含まれる。情報により割り当てられる内容が微妙に変わるが、それらを気にすることなく情報に与えられた名前はすべて『__name__』と書くことで取得できる。

 ちなみにオブジェクト名を付けず単に『__name__』と書くと、カレント・モジュールの名称を取得できる。

 上記のコードを hoge.py という名前で保存し、コマンドプロンプトから python.exe hoge.py のように呼び出すと、結果は『__main__』と表示される。

 こんなコードが動くのも、そういうお約束があるから。

__class__
 Pyhonオブジェクトの”インスタンス”に、アクセスする為の特別な名前。
 オブジェクト生成時にベースになるオブジェクトのインスタンスが入ります。(定義されたオブジェクトは生成されることで実体化(動作可能な状態でメモリに準備)しますが、インスタンスというのは この『実体』 のオブジェクトを指す言葉です。)
 ※hogeクラスを定義・生成した場合 <class __main__.hoge at 0x########>
 ※関数定義をした場合 <type ‘function’>
 ※『a = 1』として『a.__class__』とした場合 <type ‘int’>

__dict__
 Pyhonオブジェクトが持っている辞書オブジェクトにアクセスする為の特別な名称です。
 例を示した方がはやそうなので、以下に例を示す。

 以上のように、オブジェクトのメンバのように名前を指定して、値を代入することができる辞書オブジェクトにアクセスできる。
 オブジェクトには ‘__dict__’ の名前でも当然アクセスできるので、『a.__dict__[‘hoge’]』のような書き方でも同じように値の設定・取得ができる。

__doc__
 Pyhonオブジェクトが持っている”オブジェクト説明文字列”に、アクセスする為の特別な名前。
 これも例を示した方がはやそうなので、以下に例を示す。

 予めオブジェクトに付加された説明用文字列があれば、それを取得できる。

Python dir関数(組み込み関数)

めも。

日本語公式サイトでのdir関数についての説明

オブジェクトの抱えているアトリビュートなどが列挙される。
たとえば、sysモジュールをインポートして中身を覗くと以下のような感じ。

『__*__』のようなアトリビュートが結構並んでいうことがわかる。(アスタリスク(*)部分には、なんらかの名称が収まる。)

Pythonの字句解析仕様を見ると、特別な意味を持つ名称であることがわかる。

たとえば、なにか関数を定義してdir関数でアトリビュートを列挙してみる。

いきなり特殊なパターンの説明になるが、『__name__』の場合 標準型の階層- 呼び出し可能型 (callable type) に書かれているように、実際は func_nameというアトリビュートの別名定義という特別な役割を持つ名称であることがわかる。
Pythonスクリプト中に、『hoge.__name__』のように記述すると、『__name__』記述をPythonは『func_name』という記述として処理してくれる。 本来は func_name というように書かないと認識してくれないところを、別名定義ルールのおかげで __name__ と書いても同じように認識される。

Pythonは『__*__』の形で特別な名称を管理するルールづけをしているので、そのルールに従って『__*__』定義がある場合はそのルールに従う方がコードを見る人に判りやすい記述にできる。

Pythonにて例外発生時に内容をレポートする

めも。

実行時エラーの内容をレポートして状況を把握しやすくするためにも、こういうのが必要。ということで。

sys, tracebackモジュールが必要。
また、スレッドセーフな記述として sys.exc_info()を使う事が推奨されている点に留意。

PythonからWindowsのDLLを参照するには

めも。
http://python.keicode.com/advanced/ctypes-custom-dll.php

MicrosoftのCコンパイラ環境が多少は判っていないと、ちょっとキツイかもしれないけど。。

キモとしては、下記のような感じか。
 ・PythonとDLLのアーキテクチャを合わせる(Win32(x86, 32bit), x64(amd64, 64bit))
 ・defファイルを作る(DLLから外に公開する関数を定義してあげる)
 ・ビルド用の設定を行う
  ・nmakeを使う場合は、makefileを書く(正しい設定をするように..)
  ・VisualStudioからビルドする場合は..
   ・Win32アプリケーションを選択して、DLL用のプロジェクトを作成(プロジェクトは空登録して、設定はなるべく自前で行う)
   ・アーキテクチャをPythonに合わせる
   ・ランタイムライブラリの設定(C/C++ > コード生成)を 『マルチスレッド(/MT)』に設定

ギガ単位のデータをパースする際など、Pythonでやるには重すぎる処理をCで書く時とかあるかも、ってことで。

pythonによるアトミックな操作

めも。
http://effbot.org/zone/thread-synchronization.htm

この場合の『アトミック』というのは、Wikiとか見ていただきたいです..

キモは、以下の2点。

最重要は1つ目で、2つ目に関しては銀行の預払処理みたいに並列でどんどん処理が行われるような場合に、余計な後始末を後に回った処理内で考える必要がない(=処理が簡素でバグも出にくい)ってことかなー、と。

 1.”一連の手続きの最中”に、他からの割り込みがないこと
 2.”一連の手続き”が仮に失敗しても、他からは処理自体がなかったかのように、状態復元が行われること

Python環境を設定したプロンプトを起動させる

やったことメモ。
Windows向けの話で、他のOSには関係ない話だけど..

python26_prompt.batのショートカットをデスクトップに作っておけば、ダブルクリックでPythonの環境設定済みのプロンプトを表示できる。
同じショートカットにスクリプト1つをドロップすると、プロンプトを開くと同時にスクリプトを実行する。

幾つかのバージョンやモジュール利用環境を準備する必要があるような場合に..

下記バッチファイルが想定するのは、C:/Python/Python26フォルダに Python2.6環境をインストールした場合のもの。
※PYTHONPATH設定を省いて書いているので、必要に応じてPYTHONPATHを設定する必要あり。

>python26_prompt.bat

>__python26_env.bat

予め実行に必要なモジュールの有無をチェックする

めも。
https://qt.gitorious.org/pyside/pyside-examples/source/060dca8e4b82f301dfb33a7182767eaf8ad3d024:examples/opengl/hellogl.py#LNaN-NaN

参考サイトのコードには、予めモジュールが使えることをチェックし、不足時は実行時に例外と共に必要モジュールに関する警告を出す方法が含まれている。(9行目からの try-exceptの部分)
そのような場合を想定した対応が必要な場合の参考に。

クラス継承したUIオブジェクトをQtDesignerで作ったUIに組み込む

やったことメモ。

QtDesignerで用意されているUIパーツ(例えば QListWidget)は、ファイルのドロップに対応する実装が入ってないっぽい。
なので、ファイルのドロップに対応するとなると、そのUI部品はQtDesignerの外で用意する必要が出てくる。

下記の緑の枠部分を、ファイル・ドロップ対応QListWidgetにしたい…という場合。
designer_sample

こういう場合は結構単純な解決法があって、その場所に HorizontalLayout(又は VerticalLayout)を入れておき、そのLayoutにはめ込むようにファイル・ドロップ対応QListWidgetを生成することで意図した形のものを用意できる。

designer_sample2

PySideでファイルのドロップに対応するには

お作法を説明している書き込みがあったのでメモ。
http://stackoverflow.com/questions/25603134/pyside-drag-and-drop-files-into-qlistwidget

・必要なUIオブジェクトを継承
・.setAcceptDropsメソッドに Trueを設定
・dragEnterEvent, dragMoveEvent, dropEventをドロップ対応の実装にオーバライドする

また、メンバ変数:fileDropped を用意することで、定義クラスから生成したオブジェクトに対して、QtCore.Signal.connectメソッドを利用できるようにする方法も説明されていて、いろいろ参考になります。