まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

CentOS にオープンソースな Microsoft Windows レイヤーアプリである Wine を導入する手順を紹介します。なお CentOS 6.5 64bit 環境を前提とします。

また Wine は各種 UNIX 環境向けに開発されており、Ubuntu ベースの Linux に対してはバイナリも提供されています。ただ今回は自分がメインで使っている CentOS に、ソースからビルドして導入する手順を紹介します。


まず、CentOS 側に必要なモジュールをあらかじめ導入しておきます(青字はインストールしている内容の説明であって、コマンドとしては入力しません):
# yum groupinstall "X Window System" "GNOME Desktop Environment" GNOMEウィンドウ環境
# yum groupinstall "Development Tools" コンパイル環境一式
# yum install libX11-devel freetype-devel 必須ライブラリ

次に Wine の最新版ソースコードを入手します。SourceForge を参照して最も新しいバージョンを確認し、そのアーカイブモジュールを wget で入手します。なお 2014.7.10 時点では安定バージョンの最新版は 1.6.2, 開発版の最新版は 1.7.21 でした。お好きな方をどうぞ(以下は1.7.21 での例):
# cd /usr/local/src
# wget http://citylan.dl.sourceforge.net/project/wine/Source/wine-1.7.21.tar.bz2
# tar xvf wine-1.7.21.tar.bz2
# rm wine-1.7.21.tar.bz2

ビルドして、インストールします:
# cd wine-1.7.21
# ./configure --enable-win64
# make
# make install

なお、上記は 64bit 環境用のコマンドです。参考程度ですが、32bit 環境の場合のコマンドは以下になります:
# cd wine-1.7.21
# ./tools/wineinstall

また 64bit 環境用では Wine の実行コマンド名が wine64 となります。このままだといくつか不具合が発生するので 32bit 環境と同じ wine というファイル名でシンボリックリンクを作成しておきます:
# cd /usr/local/bin
# ln -s wine64 wine

また、日本語環境で Wine を利用する場合、このまま次の初期設定コマンドを実行するとフォントの関係で文字化けしてしまいます。この文字化けを回避するためにフォントをコピーして用意しておきます:
# cp -R /usr/share/fonts/ipa-* ~/.wine/drive_c/windows/Fonts/


これで Wine のインストールができました。最後に(SSHなどのコマンドライン端末ではなく) GNOME 環境からWine の設定コマンドを実行して、初期設定を実行します。特に何かを変更するわけではなく、設定内容の確認を行うことと、上記のコマンドによって(文字化けなく)正しく日本語が表示されていることを確認してください:
# winecfg
2014071001


これで Wine の導入は完了です。例えば「メモ帳」を起動する場合はコマンドラインからこんな命令を実行します(最後の & を付けずに実行した場合は、起動したアプリが終了するまでコマンドラインはビジー状態になります):
# wine notepad &
2014071002


ちなみに、上記のコマンドは以下のコマンドと同じ意味です:
# wine notepad.exe &
# wine c:\\windows\\notepad.exe &

同様に、「コントロールボックス」や「レジストリエディタ」を起動するにはそれぞれこんな感じで:
# wine control & コントロールボックス
# wine regedit & レジストリエディタ
2014071003


理論上は Windows 用のアプリやインストーラーが入手できれば、それを指定して、
# wine XXX.exe &
のように実行することで CentOS 上で動くようになります。


でも上で「理論上は」と書いたように、実際は動かないアプリが多いです。動いても想定外の見栄えになることもあります。

うーん、ここで昔の色んなアプリが動いたら面白かったんだけどなあ・・・・
 

最近のマイブームの1つになっている、全文検索エンジン ElasticSearch に MySQL のデータを取り込んで、MySQL データベースの全文検索エンジンとして ElasticSearch を使う手順の紹介です。
2014070401


まず検索エンジンである ElasticSearch を導入します。日本語形態素解析エンジンである Kuromoji まで含めてのインストール手順を別エントリで紹介しているので、こちらを参照ください:
ElasticSearch に Kuromoji プラグインを導入する


また取り込み先である MySQL サーバーについても環境は構築済みであると仮定します。こちらの構築手順についても、こちらのエントリを参照ください:
CentOS に MySQL をインストール/セットアップする

なお、自分個人的には MySQL ではなく MariaDB を使って同じことをできているので、以下の内容に関しては MariaDB でも同様に可能だと思っています。


さて、ElasticSearch に MySQL データを取り込むための準備として ElasticSearch 自体のインストール後に以下のステップを行う必要があります:
1. (MySQL クライアントと)JDBC ドライバの導入
2. JDBC River プラグインのインストール


最終的には ElasticSearch の River プラグインと呼ばれる拡張機能を使って MySQL からのデータ取り込みを行います。このプラグインの動作に必要な MySQL JDBC ドライバを先にインストールしておく、というステップになります。


まず、これは必須ではありませんが、あると確認に便利なので MySQL のクライアント環境を ElasticSearch サーバー内に構築しておきます。MySQL サーバーに接続する機能があればいいので、MySQL サーバー機能は不要で、クライアント機能だけが必要、ということになります。もし MySQL サーバーと ElasticSearch サーバーが同じサーバーだとすると、既に MySQL クライアント環境は導入済みだと思うので、インストールは不要です。 MySQL クライアントが導入されていない場合は以下のコマンドで MySQL クライアントをインストールします:
# yum install mysql
# vi /etc/my.cnf
  :
(以下の2行を追加)
[mysql]
default-character-set=utf8

MySQL クライアントが導入できた所で、取り込み元の MySQL サーバーへ接続してみます。仮に今回取り込むデータの内容が以下であると仮定します:
 MySQL サーバー: mysql.mylocal.com
 ユーザー名: username
 パスワード: password
 データベース名: mydb
 取り込む内容: samples テーブル


実際に MySQL クライアントで目的のデータベースにアクセスしてみます。ここまでが出来るようであればファイアウォールなども含めて接続準備ができているといえます:
# mysql -h mysql.mylocal.com -u username -ppassword mydb
> select * from samples;
:
:
(samples テーブルの内容)
:
: > quit


次に MySQL サーバーへ Java 環境から接続するための JDBC ドライバー(MySQL Connector/J)を導入します。ドライバー自体はこちらのサイトからダウンロードできます:
MySQL :: Download Connector/J 


ダウンロードしたファイルを展開して JAR ファイルを取り出し、/usr/share/java にコピーします:
# unzip mysql-connector-java-5.1.30.zip
# cd mysql-connector-java-5.1.30
# cp mysql-connector-java-5.1.30-bin.jar /usr/share/java

環境変数 CLASSPATH に、この JAR ファイルを追加します:
# vi /etc/bashrc
  :
(以下の1行を追加)
export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.30-bin.jar
 

# source /etc/bashrc

JDBC ドライバの準備が出来た所で River プラグインをインストールします。リポジトリを確認したところ、2014/07/01 時点での最新バージョンは 1.2.1.1 だったので、このバージョンを指定して導入します:
# /usr/share/elasticsearch/bin/plugin --install jdbc --url http://xbib.org/repository/org/xbib/elasticsearch/plugin/elasticsearch-river-jdbc/1.2.1.1/elasticsearch-river-jdbc-1.2.1.1-plugin.zip
# cp /usr/share/java/mysql-connector-java-5.1.30-bin.jar /usr/share/elasticsearch/plugins/jdbc/

これで必要なソフトウェアは揃いました。では実際に MySQL からデータを取り込んでみましょう

まず ElasticSearch 側に kuromoji を使った検索インデックス(kuromoji_sample)を作成します。インデックスの作成については別エントリでも紹介しましたが、まだこの内容を実行していない場合は以下のコマンドを実行します(コマンドは黒字部分で、青字はレスポンスを表しています):
# curl -XPUT http://localhost:9200/kuromoji_sample -d '{ "index": { "analysis": { "tokenizer": { "kuromoji_user_dict" : { "type":"kuromoji_tokenizer" } }, "analyzer": { "analyzer": { "type":"custom", "tokenizer": "kuromoji_user_dict" } } } } }'
{"acknowledged":true}

次に River を使って、作成した kuromoji_sample インデックスに MySQL データベースサーバーからデータを取り込みます:
# curl -XPUT http://localhost:9200/_river/my_jdbc_river/_meta -d '{ "type": "jdbc", "jdbc": { "url": "jdbc:mysql://mysql.mylocal.com:3306/mydb", "user": "username", "password": "password", "sql": "select * from samples", "index": "kuromoji_sample", "type": "samples" } }'
{"_index": "_river", "_type": "my_jdbc_river", "_id": "_meta", "_version": 1, "created": true}

上記入力パラメータ(JSON)の中で選択(select)の SQL を発行しています。この SQL の実行結果が ElasticSearch に取り込まれることになります。

取り込みができたら、最後に検索してみます。この例では取り込んだデータの name フィールドに「ほげほげ」が含まれているデータを検索しています:
# curl -XPOST http://localhost:9200/kuromoji_sample/_search?pretty -d '{ "query": { "query_string": { "query": "name:ほげほげ" } } }'
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 29,
    "max_score" : 3.687642,
    "hits" : [ {
      "_index" : "kuromoji_sample",
      "_id" : "XXXXXXXXXXXXXX",
      "_score" : 3.687642,
      "_source":{"id":"1234","name":"ほげほげ"}
    }, {
      "_index" : "kuromoji_sample",
        :
    } ]
  }
}

こんな感じで実現できました。

MySQL の like 節を使った単純検索をしていた頃と比べると、以前は localhost 内の MySQL に対して検索していたのでネットワークによる遅延はほとんどなかったはずで、今回作ってみた環境はリモートの ElasticSearch 環境にアクセスしているので、ネットワークの遅延影響がでるはずです。

にも関わらず、検索パフォーマンスは 10 倍程度になりました。これはでかい!

ElasticSearch の検索パターンやその API 実行方法についてはいずれまたプログに書く予定です。


 

オープンベータが続けられてきた IBM Bluemix が 7/1 にGA(Generally Available)を迎えました:
IBM Bluemix General Availability! 
2014070101


同時にこれまでの無料トライアル期間も終了しました。今後、新たに利用申し込みをすると1ヶ月間の無料トライアル期間が与えられます。 またこれまで無料トライアルを使っていたユーザーは自動的に1ヶ月間の無料トライアルアカウントが引き継がれて、これまで Bluemix 上で作成したアプリはまだそのまま有効になっている模様です。


まだ一部の情報しか公開されていないようですが、分かる範囲でその内容を、個人的な感想も交えて紹介します。なお以下の情報は 2014/07/01 現在の情報であり、今後変更の可能性があることをご了承ください。

もっともインパクトの大きな発表は、これまで公開されていなかった IBM Bluemix の利用価格が一部発表されていることです:
IBM Bluemix : pricing
2014070102


ランタイム(ウェブアプリケーションサーバー)は利用メモリで課金され、メモリ1GBを1時間使うごとに US$0.07 と記載されています。単純にメモリ1GBのサーバーを1ヶ月(=30日)使うと仮定すると、
  0.07 * 24 * 30 = 50.4
なので月額 US$50.4 課金される、ということになると思います。
2014070103


なおランタイムはデフォルト状態ではこの半分の 512MB メモリで稼働します。なのでデフォルトのまま使うとアプリサーバー1台あたり、この半分の US$25.2 ということになります。

またプライスリストを見る限り、無料枠が提供されているように思えます。ランタイムの無料枠については
  375 GB-hours per month (shared across all runtimes)
と記載されています。解釈を間違っていたらどなたか指摘いただきたいのですが、これは
  全ランタイム合計で、月に 375 時間/GB のメモリ利用までは無料
という意味だと思います。

仮に1ヶ月を30日とすると、1ヶ月は 720 時間あります。1GB メモリのマシンを1ヶ月続けて使うと 720 時間/GB 使うことになります。これだと無料枠(375)を超えてしまいます。

でも(デフォルトの) 512MB メモリのマシンであれば、1ヶ月続けて使っても 360 時間/GBなので無料枠で収まることになります(1ヶ月=31日計算でもギリギリOK)。つまりアプリケーションサーバーのランタイムはデフォルトの 512MB メモリサーバーを1台使い続ける分には無料枠内で使える、ということだと思っています。 

あるいは計算上は 256MB メモリのサーバーを2台使い続けることも無料枠内でできる、とも言えます。まあ、256MB でアプリケーションサーバーがまともに動くかどうかはわかりませんが・・・


一方、サービスについては「一部のみ価格が公開された」という印象です。例えばビッグデータ用 DBaaS である BLUAcceleration の記載はまだないので、BLUAcceleration の利用価格はよくわかりません。

ただ IBM ソフトウェアを使ったサービスに関しても無料枠が設定されているように見受けられます。例えば SQL database サービスは IBM DB2 をバックエンドに使える DBaaS ですが、価格欄には
  $30.00 USD/Instance
  2 GB free per instance.
と記載されています。
2014070104


この 2GB はおそらくディスク容量だと思うので、「2GB のデータまでは無料」と解釈できます。本当だとしたら、本来有償製品である DB2 を、2GB まで無料で、しかも DBaaS 環境で使える、ということになり、これはかなりお得な気がしています。 「課金が始まったら絶対高いに決まってる」と思っていたので、いい意味で期待を大きく裏切られました。

ちなみに、先日僕がブログで公開したオンライン TwiML エディターは Bluemix 上で動いていますが、アプリケーションサーバーは Liberry for Java で、バックエンドデータベースはこの SQL Database を使ってます。アプリケーションサーバーのメモリを 512MB 以内にしておけば無料枠内で稼働を続けることができそうです。

この SQL Database 以外にも Git Hosting など無料で提供されるサービスが他にもあり、無料枠内だけでもそこそこ使えるパブリック CloudFoundry 環境、と言えそうな条件です。これは使わないと損ですね。


なお本家 CloudFoundry の価格はメモリ 1 GB あたり一時間 US$0.03 です。これだけを見ると Bluemix の半分以下に見えます。ただ Bluemix は上述のように無料で使える各種サービスが充実していて、それらを組み合わせて使うことを考えると、一概に Bluemix が高いとはいえなくなると思っています。


このページのトップヘ