2016年8月16日火曜日

windows10 アニバーサリーUpdateでbashを試してみる

ちょいと勇気がいりましたが、windows10でanniversary updateを行い(通知が来ないので手動でやりました)、bash on windowsを試してみました。

やり方は各種サイトにありますので割愛しますが、とにかく再起動が多い!なんか懐かしい風景です。(昔はシステム更新なんかだと、こんなんばっかだった)さて肝心の"bash on windows"ですが、なんというかvirtual boxでubuntuが動いているような感じです。それとも、今はやりのコンテナに仕立ててきたのか?そんなに重くはないんですが、問題は文字コードが…
何書いてあるのかわかりません。対策をあちこち知らべましたが、どうも決め手がないようです。まだマシンによって差がでてしまうようです。

ただそれ以外は普通にubuntuが動いています!いや、これは素晴らしい。これができると、これまでプログラム作るとき、macに逃げていたのが、windowsでもやってみるか、という気になります。(それが狙いだという話もありますし)

しかし、GUIはどうするんだろう?APIが全く違うし、windowsのGUI関係のAPIの一部でもこのシステムに取り込むのは大騒ぎになるだろうし。web系のサーバに使ってくれないかな、というM$の考えなんだろうけど、まだTCP/IPのAPIが完全には機能していないらしいし、今後どうなるのかな。(個人的にはCygwinが嫌いなんで、ある程度残って欲しいんですが、かなり今の状況では怪しいです。何か使い道を考えてあげないと)
ただ無理にGUIのAPIを移植しなくてもいいと思います。今、時代はwebですべてすますのが本流なんで、GUIはブラウザにまかせてしまえばいいですから。難しいのは不安定なwindows OSの上で如何に安定して動く環境にできるかですが、こればっかりはかなり難しいかな。

PS
どうもanniversary updateにしたのは早まったようです。ファイルの移動とかでおかしな挙動が見られます。
あと肝心のbashですがどうにも日本語が表示できないので、以下の設定で動かしています。

$ LANG=en_US.UTF-8

要は英語表記でアラートとか出してね、ですね。あと、一体どういう環境になっているのかわからないのですが、コンテナでもないようで、ping、ifconfig等のネットワーク系のコマンドが実行できません。ベータ版とは聞いていますが、どんな実装になってるんだ???

2016年8月12日金曜日

SQLite3のプログラムの勉強

ちょっとSQLite3を使ったプログラムをWindowsで作るとどうなるのか調べてみたくなりました。ただ私は普段LinuxかMacでプログラムを作ることが圧倒的に多いので、まずは慣れたMac、Xcodeで作ってみます。

1. sqlite3のインストール
brewを使ってインストールしています。コマンドラインでも使えますし、ヘッダ、ライブラリも一緒にインストールしてくれます。

2. プログラムの作成
とりあえず、以下の様なプログラムを作ってみました。

とてもシンプルです。実行結果は以下の様になります。

$HOME = /Users/hogehoge
$HOME = /Users/hogehoge/ProgWork/SQLite
OPEN SUCCESS!
id: 123, name: hoge
CLOSE SUCCESS!

createがありませんが、そこはマニュアルで作っています。(プログラムに書いてもいいんですが、毎回実行するためにいちいちdbファイルを削除するのも面倒なので。)

> create table tbl_test(id integer primary key, name text);

最終的にはinsertのところをupdateに変えて、プロセス間の通信代わりに使おうと目論んでいます。

3. 注意点

  • Xcodeの設定でライブラリの追加オプション"-lsqlite"を忘れない様に。
  • 単純にやろうと思うなら、sqlite_open(), sqlite_close(), sqlite_exec()だけで済ますこともできます。ただselect文をsqlite_exec()でやろうとすると、どうしても出力をcallbackで受けないといけなくなります。callback関数を書くのが面倒だったので、非同期クエリで実装しています。(こちらも面倒だがやむを得ません)
  • sqliteはsql文の実行ではデフォルトでオートトランザクションになっています。将来的にプロセス間の通信に使うつもりなら本当は、"bgein","commit"と明確にトランザクションの指定をしてやるべきです。ただそんな複雑な通信は当面する気がなく、一方向だけ(片方がwriteして、他方はreadするだけ)のつもりなので、当面はこれでも問題はありません。
さて、これをwindowsのVisualStudioのc++で実装です。2015ではUWPアプリ(Universal Windows Platform)として、SDKにsqlite3が標準で入っているらしいです。実装もこのままでコンパイルが通りましたが、リンクでどうしてもsqlite関係の関数が「未解決の外部シンボル」と言われてしまいます。(ちゃんとwinsqlite3.libを追加のライブラリに指定しているんですが・・・)ちょいとこの問題の解決には時間がかかっています。