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

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

2015/07

普段は MySQL 使いの自分が IBM DB2 を使おうとして、意外とハマったのが以下に紹介する2点です。

まず1点目。MySQL ではテーブル列の属性に auto_increment という指定を付与することができます:
mysql> create table langs(
  id int primary key auto_increment,
  name varchar(256)
);

この属性が付いた列はデータ挿入時に値を指定する必要がなく、定義に従ったルールでユニークな値を勝手に挿入してくれる便利な属性です(赤字はコメントです):
mysql> insert into langs( name ) values( 'Java' );  nameだけを指定してinsert
mysql> insert into langs( name ) values( 'PHP' );
mysql> insert into langs( name ) values( 'Ruby' );

mysql> select * from langs;
+----+------+
| id | name |
+----+------+
|  2 | Java | ユニークなid値が勝手に挿入されている
| 12 | PHP  |
| 22 | Ruby |
+----+------+

これと同じことを DB2 利用時にもやりたい! のですが、DB2 では create table 時に auto_increment 属性を認識してくれません。


では DB2 で同じことをするには、create table 時にどのような指定をすればよいのでしょうか?

その答がこちらです。indentity 構文を使いますが、ちと面倒:
db2> create table langs(
  id int primary key generated always as identity (start with 1 increment by 1),
  name varchar(256)
);

これをテーブル定義時に指定しておけば insert 時にはユニークな値を自動生成してくれるので楽ちんです。



2点目。同様に、MySQL では auto_increment 指定のある列に挿入された値を知りたい、と思うことがあります:
mysql> insert into langs( name ) values( 'Python' );
↑今、インサートしたこのレコードの ID 値が何だったのかを知りたい

それは LAST_INSERT_ID() で取得できました。
mysql> select last_insert_id() from langs;

これと同じことを DB2 の identity 指定した列に対してやるにはどうすればいいでしょうか?
その答は IDENTITY_VAL_LOCAL() です:
db2> select IDENTITY_VAL_LOCAL() from langs;

MySQL と DB2 で文法の違いがありますが、とりあえずはどちらも出来るということで。 

自分が迷ったのは今のところこの位ですが、Bluemix を使うユーザーが増えると必然的(?)に SQL Database や dashDB を使う人も増えると思います。DB2 をベースにしたこれらのサービスを使う時に、今回紹介したような点で戸惑う人の助けになれば幸いです。


(参考にしたページ)
http://stackoverflow.com/questions/13466347/how-to-auto-increment-in-db2
http://stackoverflow.com/questions/3087836/db2-how-to-get-the-last-insert-id-from-a-table
 

自分は自己紹介する時に「言語マニア」である、ということがあります。

ある程度モノにしている言語は日本語と英語。読むだけなら韓国語とフランス語、かじった程度ではアラビア語。かじった直後に断念したのがヒエログリフ(象形文字)。 言語という意味では更に加えて Java, PHP, JavaScript, C, C++, (Visual)Basic, LotusScript, Perl, Pascal, Fortran, CASL,  ... あたりのプログラミング言語も使えます。が、今回は前者の話です。

最近はウェブの翻訳サービスを使うことも多いのですが、外国語を勉強するには実際に使うのが近道だと思ってます。英語のアルファベットはパソコンで普通に入力できますが、フランス語アルファベットには特殊な表記をするものがあったり、韓国語のハングルに至っては普通には入力できません(よね?)。どうせならパソコンでも勉強中の文字入力をできるようにして、それらの言語でパワポの資料を作ってみたりできるとカッコいいです。


というわけで、Windows パソコンで日本語/英語以外の文字が入力できるようにするための設定方法を紹介します。ちなみに多言語入力は Windows XP 以降から標準機能として可能になっていますが、以下の紹介画面は Windows 7 です。


まずコントロールパネルを開き、「地域と言語」を選択します:
2015071901


「キーボードと言語」タブから「キーボードの変更」ボタンをクリックします:
2015071902


「全般」タブの「インストールされているサービス」には現在使うことのできる、英語以外の言語サービスの一覧が表示されます(画面では日本語だけです)。ここに韓国語を追加してみます。「追加」ボタンをクリックします:
2015071903


「韓国語」 - 「キーボード」 - 「Microsoft IME」にチェックを入れて「OK」ボタンをクリックします:
2015071904


先ほどの画面に戻り、「インストールされているサービス」に「韓国語」が追加されていることを確認します。必要であれば、同様に他の言語も追加します。最後に「適用」ボタンをクリックしてから「OK」ボタンをクリックします。これで準備は完了です:
2015071905


では実際に韓国語を入力してみます。メモ帳を起動しておきます:
2015071906


ここでキーボードの 左Alt + Shift を押す度に使用言語が切り替わっていくはずです。韓国語を入力するには図のように "KO" と書かれた表記になるまで切り替えます。これでハングル入力モードになりました:
2015071907


日本語入力モードでも日本語と英語を切り替えて入力するように、ハングル入力モードでも同様の切り替えを意識する必要があります。ハングル入力モードで 右Alt を押す度にハングルと英語の切り替えができます。ハングルを入力する場合は「A」ではなく「가」という表記に切り替えます。
2015071908


この状態でメモ帳内で適当にキーボードを叩くと、ハングルが入力されていくはずです(ちなみにこの内容は適当に打っただけなので意味無いです):
2015071909


キーボード配列をまだ覚えていない場合はソフトウェアキーボードを参照することも可能です。そのためにはまずソフトウェアキーボードを有効にする必要があります。言語バーの▼印をクリックし、メニューから "Soft Keyboard" にチェックを入れます:
2015071910


チェックすると言語バーにソフトウェアキーボードボタンが現れます:
2015071911


ここをクリックすると画面内にソフトウェアキーボードが表示され、ここからハングルを入力することもできますし、このキーボード配列を参照しながら目的の文字をキーボード入力する(ための勉強をする)こともできます:
2015071912


同様にしてアラビア語なども導入し、言語を切り替えて入力することで多言語テキストを作成することも可能です。ちなみにアラビア語はちゃんと(?)右から左に入力されていきます:
2015071913


実際問題として、たまに外国人が日本語のローマ字変換でパワポの資料を作っているのを目の当たりにすると、それだけで尊敬してしまいます。ただでさえ難しい外国語である日本語を、それもローマ字変換とか・・・ そんな感じで自分も色んな言語が操れるようになったらいいなあ、と思ってます。


余談ですが、この多言語テキストが標準機能として入力できるようになったのは Windows XP からでした。当時アラビア語を勉強していた自分にとって Windows XP は神 OS でした。開発者としてはシステムデバッグが楽な Windows 2000 も気に入っていたのですが、この機能を知って乗り換えを決意したものでした。


今回のブログエントリは ThinkPad ユーザー向けです。


lenovo の ThinkPad のほとんどの機種には APS(Active Protection System) と呼ばれている、ハードディスク保護システムが用意されています(画面はコントロールパネル):
2015071801


世の中にはありがたい人がいてくれて、この APS 機能を SDLAccel というライブラリにして、色々なアプリケーションに応用できるようにしてくれた方がいました。このリンク先のダウンロードボタンをクリックして、SDLAccel.zip をダウンロードしてください:
https://docs.google.com/open?id=0B3tL0c24sdXwSnpLSHpwYUxHZ0k

2015071802


この zip ファイルを展開し、SDL.dll だけを取り出しておきます:
2015071803


これが(一般的に多く使われている)SDL ライブラリの APS 対応版です。これがどういう意味かは後で紹介しますが、普通の SDL.dll と置き換えて使うことができるものです。

では実際に置き換えて使ってみるための、SDL を使ったアプリケーションをダウンロードしてみましょう。例えばこの Tux Racer というゲームは SDL 対応ゲームなので、これで試してみます:



Tux Racer を SourceForge からダウンロードして、展開します:
http://sourceforge.net/projects/tuxracer/


展開後の tuxracer.exe をダブルクリックすると、普通にゲームを始めることができますが、今回はその前に一手間かけてみます。
2015071804


この Tux Racer のフォルダにある SDL.dll を SDL.dll_org にリネームし、先程ダウンロードした SDLAccel.zip から取り出した SDL.dll を同フォルダにコピーします。つまり、SDL.dll を SDLAccel.zip のものに置き換えます:
2015071805


これで準備完了です。改めて tuxracer.exe をダブルクリックしてゲームを起動してみます。

このゲームは主人公の Tux(ペンギン)を方向キーで左右に動かしてアイテムを取りつつ、上下キーでスピードを調整しながらゴールを目指す、というアクションゲームです:
2015071806


ただ SDL.dll を更新後は方向キーが使えなくなっています。代わりに APS を使ったコントロールが有効になっていて、ThinkPad 自体を前後左右に傾けることで Tux をコントロールできるようになっているはずです:
2015071807


ThinkPad 本体を落とさないように、気をつけて遊んでください。

簡単にタグクラウドっぽい UI を作れないかなあ、と思ってたら、jQuery のプラグインがありました:
jQCloud

CDN などで jQuery をロードしてから、この jQCloud の CSS および JavaScript をロードして使います。

実際のタグクラウドとしての使い方は公式の README.md を参照いただきたいのですが、タグクラウドにしたい要素を配列で与えて、jQuery で読み込ませるだけです。具体的にはこんな感じです:
<html>
<head>
<title>jQCloud</title>
<!-- jQuery と jQCloud をロード -->
<script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<link rel="stylesheet" type="text/css" href="./jqcloud.css" />
<script type="text/javascript" src="./jqcloud-1.0.4.js"></script>
<script type="text/javascript">
//. タグクラウドの要素(文字と、大きさと、リンク先)を配列で用意
var word_list = [
  { text: 'クラウド', weight: 19 }
  ,{ text: 'IBM Bluemix', weight: 14, link: 'http://bluemix.net/' }
  ,{ text: 'マンホール', weight: 12, link: 'http://manholemap.juge.me/' }
  ,{ text: 'ねっぴ', weight: 9, link: 'http://neppi.co/' }
  ,{ text: 'ツイートマッパー', weight: 9, link: 'http://tweetsmapper.juge.me/' }
];

$(function(){
  //. 上記で用意した配列をタグクラウドとして表示
  $("#tagcloud").jQCloud( word_list, {
    width: 500, height: 200
  });
});
</script>
</head>
<body>

<!-- ここにタグクラウドを表示する -->
<div id="tagcloud"></div>

</body>
</html>


このページをブラウザで開くと、このようなタグクラウドが表示されるはずです。文字とその大きさは JavaScript で指定した通りになっているはずです:
2015071700


また「クラウド」という文字以外にはリンク先を指定していたので、クリックするとそれぞれに指定されたページに移動するはずです。

かなり簡単に実現できちゃいました。


自宅サーバー環境での KVM 仮想化サーバーがお亡くなりになってしまいました・・・ (ToT)

某メーカーのデスクトップPCに CentOS + KVM を導入して仮想化サーバーに使っていたのですが、初夏の温度上昇に耐えられなかったのか、うんともすんとも言わなくなってしまいました。マザーボードレベルでやられたっぽいです。ちなみに買ってまだ2年、ここのはもう買わない。

幸いにして、KVM のイメージファイルのバックアップは取っていたので、最新状態ではないにせよ救える仮想マシンもありそうです。で、別マシンを用意して CentOS + KVM を導入し、バックアップイメージファイルをインポートして起動させてみたら・・・ 期待通りに動いてくれません。。

症状として、仮想イメージ自体のインポートは成功して、KVM 内で起動はしてくれます。ただネットワーク(eth0)を認識してくれないため、ループバックアドレス(locahost)でしか使えません。もちろんインポート前には eth0 が使えていて、そのための ifcfg-eth0 などもちゃんと存在しているのに、です。単純なイメージインポートではこうなってしまうようです:
2015070401


もう少し詳しく(ifconfig -a コマンドで)調べてみると、どうも eth0 ではなく eth1 を認識している模様。ただ ifcfg-eth1 は用意していないのでネットワークとしては使えません:
2015070402



これがどういうことかというと、イメージファイルをインポートした際にネットワークインターフェースのハードウェアアドレス(MAC アドレス)が変わってしまって、eth0 ではなく eth1 として認識され、これまでの設定では正しく動かなくなってしまった、ということのようです。

対策としては2通りあります。1つは eth0 用の設定を eth1 用に書き換えて使う方法です。具体的には /etc/sysconfig/network-scripts/ 以下の ifcfg-eth0 を ifcfg-eth1 にリネームして、その中身の eth0 になっている箇所を eth1 に書き換えてリブートする方法です。この方法だと比較的簡単にできて、(eth1 をネットワークポートとして)動くことは動きます。

ただ、あくまで eth0 で動かしたい、という要望もあると思います。以下にその手順を紹介します。

まず上記の ifconfig -a コマンドの結果として、eth1 のハードウェアアドレスとして認識された結果(上記画像だと 52:54:00:9B:56:24)をメモしておきます。改めて /etc/udev/rules.d/70-persistent-net.rules をテキストエディタで開き、eth0 の ATTR{address}=="**:**:**:**:**:**" の **:**:**:**:**:** 部分をメモした内容で書き換えます:
2015070403


システムが DHCP でアドレスを割り当てられる設定になっている場合は /etc/sysconfig/network-scripts/ifcfg-eth0 を編集して、HWADDR の行をコメントアウトするか、または上記と同じ MAC アドレスの値に書き換えて保存します:
2015070405


これでシステムを再起動すると、eth0 が認識されるはずです:
2015070404


無事に KVM の CentOS イメージの引越ができました。

 

このページのトップヘ