<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>taichino.com &#187; 技術</title>
	<atom:link href="http://taichino.com/category/engineer-life/feed" rel="self" type="application/rss+xml" />
	<link>http://taichino.com</link>
	<description>永遠のネバーランド</description>
	<lastBuildDate>Sat, 04 Feb 2012 13:33:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>RSAの勉強日記</title>
		<link>http://taichino.com/engineer-life/2647</link>
		<comments>http://taichino.com/engineer-life/2647#comments</comments>
		<pubDate>Wed, 01 Feb 2012 15:50:41 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[RSA]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2647</guid>
		<description><![CDATA[Javascriptでデータ送る際にデータを暗号化したいなという事で、そうだRSAを使おうと思ったのですが、RSAについて、sshの鍵作る時に出てくる単語で暗号方式？位の理解しかなかったので少し調べてみました。 まず概要の把握ですが、僕は「サルにもわかるRSA暗号」を流してから、「RSA暗号体験入門」を読んだらとりあえず解った気になりました。 次に処理の流れをopensslコマンドで確認してみます。ここでは鍵を生成 => テキストを暗号化 => 復号を確認しました。なお秘密鍵を生成する際のビット数はデフォルトでは512で、普通は1024以上指定するようですが、数が大きくなると確認しづらいので256ビットを指定しています。 $ openssl genrsa -out priv.pem 256 Generating RSA private key, 256 bit long modulus .+++++++++++++++++++++++++++ .................+++++++++++++++++++++++++++ e is 65537 (0x10001) $ openssl rsa -in priv.pem -pubout -out pub.pem writing RSA key $ echo &#34;hello rsa&#34; &#62; hello.txt $ openssl rsautl -encrypt -pubin -inkey pub.pem -in hello.txt -out hello.txt.crypto [...]]]></description>
			<content:encoded><![CDATA[<p>Javascriptでデータ送る際にデータを暗号化したいなという事で、そうだRSAを使おうと思ったのですが、RSAについて、sshの鍵作る時に出てくる単語で暗号方式？位の理解しかなかったので少し調べてみました。</p>
<p><span id="more-2647"></span></p>
<p>まず概要の把握ですが、僕は「<a href="http://www.maitou.gr.jp/rsa/" title="サルにもわかるＲＳＡ暗号" target="_blank">サルにもわかるRSA暗号</a>」を流してから、「<a href="http://www.cybersyndrome.net/rsa/index.html" title="RSA暗号体験入門" target="_blank">RSA暗号体験入門</a>」を読んだらとりあえず解った気になりました。</p>
<p>次に処理の流れをopensslコマンドで確認してみます。ここでは鍵を生成 => テキストを暗号化 => 復号を確認しました。なお秘密鍵を生成する際のビット数はデフォルトでは512で、普通は1024以上指定するようですが、数が大きくなると確認しづらいので256ビットを指定しています。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ openssl genrsa -out priv.pem 256
Generating RSA private key, 256 bit long modulus
.+++++++++++++++++++++++++++
.................+++++++++++++++++++++++++++
e is 65537 (0x10001)
$ openssl rsa -in priv.pem -pubout -out pub.pem
writing RSA key
$ echo &quot;hello rsa&quot; &gt; hello.txt
$ openssl rsautl -encrypt -pubin  -inkey pub.pem -in hello.txt -out hello.txt.crypto
$ openssl rsautl -decrypt -inkey priv.pem -in hello.txt.crypto
hello rsa
</pre>
<p>なんとなく流れは掴めた気がしますね。</p>
<p>さて鍵の生成はopensslコマンドでやれば良いとして、それを使って暗号化・復号をプログラムからやりたいですね。そこで次に上で作った秘密鍵・公開鍵をPythonから使ってみます。名前的には<a href="http://pypi.python.org/pypi/rsa" title="rsa module in pypi" target="_blank">rsaモジュール</a>を使いたいのですが、手元では色々と怪しい動きをしていたので、おとなしく<a href="http://pypi.python.org/pypi/pycrypto/2.5" title="PyCrypto in PyPI" target="_blank">PyCrypto</a>を使うのが良さそうです。</p>
<pre class="brush: python; gutter: true; first-line: 1; highlight: []; html-script: false">
import Crypto
from Crypto.PublicKey import RSA

pub = RSA.importKey(open(&#039;pub.pem&#039;, &#039;r&#039;).read())
priv = RSA.importKey(open(&#039;priv.pem&#039;, &#039;r&#039;).read())

text = open(&#039;hello.txt&#039;, &#039;r&#039;).read()
crypto = pub.encrypt(text, &#039;&#039;)
print priv.decrypt(crypto)

print &#039;PRIVATE KEY:\n  p=%s, \n  q=%s, \n  n=%s, \n  d=%s, \n  e=%s&#039; % (priv.p, priv.q, priv.n, priv.d, priv.e)
print &#039;PUBLIC KEY:\n  n=%s, \n  e=%s&#039; % (pub.n, pub.e)
</pre>
<p>これを実行すると以下のようになります。数が大きすぎて良く解らないですが、何となく正常に動いてる気がしますね。</p>
<pre class="brush: text; gutter: true; first-line: 1; highlight: []; html-script: false">
hello rsa world

PRIVATE KEY:
  p=312812244098101569570522771086507368199,
  q=261732496899955705693539027437044751693,
  n=81873129708674556552097159647951377728324724985548367405770094930146879610907,
  d=61350191904775909756579327908681267205274632675124298948670533913070326529385,
  e=65537
PUBLIC KEY:
  n=81873129708674556552097159647951377728324724985548367405770094930146879610907,
  e=65537
</pre>
<p>折角なので学習のため<a href="http://taichino.com/programming/2628" title="合同式の逆元を求める">先ほどのエントリ</a>で書いたmodinvを使って自分でも計算してみます。</p>
<pre class="brush: python; gutter: true; first-line: 1; highlight: []; html-script: false">
&gt;&gt; def calc(base, exp, modulus):
&gt;&gt;     ans = 1
&gt;&gt;     while exp &lt; 0:
&gt;&gt;         if exp &amp; 1:
&gt;&gt;             ans = (ans * base) % modulus
&gt;&gt;         exp &gt;&gt;= 1
&gt;&gt;         exp = int(exp)
&gt;&gt;         base = (base * base) % modulus
&gt;&gt;     return ans
&gt;&gt;
&gt;&gt; (p, q) = (65537, 55079)
&gt;&gt; m = p * q
&gt;&gt; phi = (p - 1) * (q - 1)
&gt;&gt; e = 65537
&gt;&gt; d = modinv(e, phi)
&gt;&gt; orig = 2900
&gt;&gt; encoded = calc(orig, e, m)
&gt;&gt; print encoded
60945415393350116455581236569596858319975698828166554225855598846369380497015
&gt;&gt; decoded = calc(encoded, d, m)
&gt;&gt; print decoded
2900
</pre>
<p>値が大きくなるのでベキ乗計算が少し面倒ですが、暗号化と復号ができました。まだ文字列をどうやって暗号化可能な数値に変換してるのかとか細かくは理解してないですけど何となくつかめた気がしてます。</p>
<p>さて最後にフォーマットについて確認します。opensslで生成した鍵(priv.pem, pub.pem)はPEM形式というやつで、中身はDER形式のデータをbase64でエンコードしたもののようです。例えば上で生成したファイルは下記のような姿をしています。</p>
<pre class="brush: text; gutter: true; first-line: 1; highlight: []; html-script: false">
-----BEGIN RSA PRIVATE KEY-----
MIGqAgEAAiEAtQKMmuoZNSc0jZe/TDf1p3bQraYwXvBkOdFSwJAkIBsCAwEAAQIh
AIei+mOXKf53e1ziqhleEXgAni7HKueUV/bWLRzb+D1pAhEA61VyYLHy31RSLJ3l
aWXfBwIRAMTn2GbiUscRRmBm9aiR3U0CEDnyEzS9/EiDUayMwHVAUTcCEBgXDWC4
+8ujD2sn7ZIsFlkCECAVBGiJ4VrYG6HTGgTflU4=
-----END RSA PRIVATE KEY-----
</pre>
<p>このファイルをDER形式に変換してみます。やはりopensslコマンドを使用します。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ openssl rsa -inform PEM -outform DER -in priv.pem -out priv.der
</pre>
<p>変換後のDERファイルの内容をやはりopensslコマンドで読みます。この数値が大きい時に使われる表現をもとの数字に戻す方法が解らないのでどなたかご存知であれば教えてください。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ openssl rsa -inform DER -in priv.der -text -noout
Private-Key: (256 bit)
modulus:
    00:b5:02:8c:9a:ea:19:35:27:34:8d:97:bf:4c:37:
    f5:a7:76:d0:ad:a6:30:5e:f0:64:39:d1:52:c0:90:
    24:20:1b
publicExponent: 65537 (0x10001)
privateExponent:
    00:87:a2:fa:63:97:29:fe:77:7b:5c:e2:aa:19:5e:
    11:78:00:9e:2e:c7:2a:e7:94:57:f6:d6:2d:1c:db:
    f8:3d:69
prime1:
    00:eb:55:72:60:b1:f2:df:54:52:2c:9d:e5:69:65:
    df:07
prime2:
    00:c4:e7:d8:66:e2:52:c7:11:46:60:66:f5:a8:91:
    dd:4d
exponent1:
    39:f2:13:34:bd:fc:48:83:51:ac:8c:c0:75:40:51:
    37
exponent2:
    18:17:0d:60:b8:fb:cb:a3:0f:6b:27:ed:92:2c:16:
    59
coefficient:
    20:15:04:68:89:e1:5a:d8:1b:a1:d3:1a:04:df:95:
    4e
</pre>
<p>全然細かい事は調べれてないのですが、何となくRSAの概要が把握できた気になっていて、コード追うくらいはできそうなのでこの辺にしておきます。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/2647/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>postgresユーザのパスワード忘れて困った</title>
		<link>http://taichino.com/engineer-life/database/2616</link>
		<comments>http://taichino.com/engineer-life/database/2616#comments</comments>
		<pubDate>Wed, 25 Jan 2012 15:14:36 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2616</guid>
		<description><![CDATA[最近herokuをちょろっとだけ触っています。herokuではPostgreSQLが使われてるのでローカルにもインストールしたんですけど、ちょっと間が空いて、Postgresユーザーのパスワード忘れて困ったのでメモ書きです。環境はOSX 10.6です。 ちょっと検索すると本家MLの過去ログからビンゴなスレッドがありました。要はローカルからの接続時に認証を一旦外してパスワード変更後、元に戻すというものです。認証を設定しているのはpg_hba.confというファイルで僕の手元では下記の位置にありました。md5(パスワード認証)となっている認証形式をtrustに書き換えます。 $ sudo vim /Library/PostgreSQL/9.1/data/pg_hba.conf - local all all md5 + local all all trust 設定ファイルを修正後に再起動すると、postgresユーザでパスワードなしでログインできます。あとはALTER USERでパスワードを変更しましょう。 $ sudo -u postgres ./bin/pg_ctl restart -D/Library/PostgreSQL/9.1/data $ psql -U postgres postgres=# ALTER USER postgres WITH ENCRYPTED PASSWORD &#039;new password&#039;; postgres=# \q パスワードの変更が終わったら認証形式を元に戻しておきます。postgresユーザのパスワード忘れても何とか大丈夫なもんですね。 $ sudo vim /Library/PostgreSQL/9.1/data/pg_hba.conf + local all all trust - local all all [...]]]></description>
			<content:encoded><![CDATA[<p>最近herokuをちょろっとだけ触っています。herokuではPostgreSQLが使われてるのでローカルにもインストールしたんですけど、ちょっと間が空いて、Postgresユーザーのパスワード忘れて困ったのでメモ書きです。環境はOSX 10.6です。</p>
<p><span id="more-2616"></span></p>
<p>ちょっと検索すると本家MLの<a href="http://archives.postgresql.org/pgsql-admin/2005-02/msg00214.php" title="PostgreSQLでパスワード忘れたときの対処法" target="_blank">過去ログからビンゴなスレッド</a>がありました。要はローカルからの接続時に認証を一旦外してパスワード変更後、元に戻すというものです。認証を設定しているのはpg_hba.confというファイルで僕の手元では下記の位置にありました。md5(パスワード認証)となっている認証形式をtrustに書き換えます。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ sudo vim /Library/PostgreSQL/9.1/data/pg_hba.conf
- local   all             all                                     md5
+ local   all             all                                     trust
</pre>
<p>設定ファイルを修正後に再起動すると、postgresユーザでパスワードなしでログインできます。あとはALTER USERでパスワードを変更しましょう。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ sudo -u postgres ./bin/pg_ctl restart -D/Library/PostgreSQL/9.1/data
$ psql -U postgres
postgres=# ALTER USER postgres WITH ENCRYPTED PASSWORD &#039;new password&#039;;
postgres=# \q
</pre>
<p>パスワードの変更が終わったら認証形式を元に戻しておきます。postgresユーザのパスワード忘れても何とか大丈夫なもんですね。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ sudo vim /Library/PostgreSQL/9.1/data/pg_hba.conf
+ local   all             all                                     trust
- local   all             all                                     md5
$ sudo -u postgres ./bin/pg_ctl restart -D/Library/PostgreSQL/9.1/data
$ psql -U postgres
Password for user postgres:
</pre>
<p>一番最初に触ったデータベースがPostgreSQLだったので結構好きだったはずなんですけど、何年か使ってないくらいで綺麗サッパリ使い方を忘れていたので、ついでにちょっとだけリハビリです。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ psql -U postgres
postgres=# \l      # データベース一覧
postgres=# \c db1  # データベース選択
db1=# \dt          # テーブル一覧
db1=# \d table1    # テーブルスキーマ
db1=# \d SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database; # 各テーブルのサイズ
db1=# \q
</pre>
<p>herokuのShared Databaseもpsqlから接続できたら良いのになと思う今日この頃です。あとせめて50MBくらい容量欲しい。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/database/2616/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SWI-PrologをC言語から叩く</title>
		<link>http://taichino.com/engineer-life/2558</link>
		<comments>http://taichino.com/engineer-life/2558#comments</comments>
		<pubDate>Sat, 07 Jan 2012 20:08:50 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[liswipl]]></category>
		<category><![CDATA[prolog]]></category>
		<category><![CDATA[swi-prolog]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2558</guid>
		<description><![CDATA[「７つの言語 ７つの世界」の3つ目の言語がPrologなんですけど、触ってみると結構面白くて、とりあえずの感想としてはルールの表現力がハンパ無く高いなという事です。良く例で挙げられていますが、数独を解いたり、麻雀の手役を確認したりといった、一定のルールに基づいた処理を他の言語と比べてかなり楽に書けそうです。 これはちょっと習得しておきたいなと思うものの、上述のような特定の処理以外は他の言語と比べてあまりに貧弱です。今回使用した処理系の標準ライブラリはこれだけしかありません。 なので必要に応じてPrologを別の言語から使うという方が現実的なのかなということで、とりあえずPythonインターフェースを試したのですが、動かなかったので仕方なしにC言語から使ってみる事にしました。なお処理系はSWI-Prologというのを使う事にしました。(手元だとGNU Prologが日本語で文字化けを起こしました。) まず以下のPrologのコードを見てください。ドラクエの道具屋(アリアハン)です。 % shop.pl item&#40;やくそう, 8&#41;. item&#40;どくけしそう, 10&#41;. item&#40;キメラのつばさ, 25&#41;. item&#40;おなべのフタ, 50&#41;. &#160; available&#40;G, X&#41; :- item&#40;X, G0&#41;, G0 =＜ G. availableという述語を定義していて、持ち金(G)を指定してクエリを投げると、購入可能なアイテムが得られます。Prologからの実行は以下のようになります。 ?- [&#039;shop.pl&#039;]. % shop.pl compiled 0.00 sec, 2,216 bytes true. ?- available(10, X). X = やくそう; X = どくけしそう; false. ?- available(100, X). X = やくそう; X = どくけしそう; [...]]]></description>
			<content:encoded><![CDATA[<p>「<a href="http://www.amazon.co.jp/gp/product/4274068579/ref=as_li_ss_tl?ie=UTF8&#038;tag=creatorsland-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4274068579">７つの言語 ７つの世界</a><img src="http://www.assoc-amazon.jp/e/ir?t=creatorsland-22&#038;l=as2&#038;o=9&#038;a=4274068579" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」の3つ目の言語がPrologなんですけど、触ってみると結構面白くて、とりあえずの感想としてはルールの表現力がハンパ無く高いなという事です。良く例で挙げられていますが、数独を解いたり、麻雀の手役を確認したりといった、一定のルールに基づいた処理を他の言語と比べてかなり楽に書けそうです。</p>
<p>これはちょっと習得しておきたいなと思うものの、上述のような特定の処理以外は他の言語と比べてあまりに貧弱です。今回使用した処理系の標準ライブラリは<a href="http://www.swi-prolog.org/pldoc/index.html" title="SWI-Prologのライブラリ" target="_blank">これ</a>だけしかありません。</p>
<p>なので必要に応じてPrologを別の言語から使うという方が現実的なのかなということで、とりあえず<a href="http://code.google.com/p/pyswip/" title="pyswip" target="_blank">Pythonインターフェース</a>を試したのですが、動かなかったので仕方なしにC言語から使ってみる事にしました。なお処理系は<a href="http://www.swi-prolog.org/" title="swi-prolog" target="_blank">SWI-Prolog</a>というのを使う事にしました。(手元だとGNU Prologが日本語で文字化けを起こしました。)</p>
<p><span id="more-2558"></span></p>
<p>まず以下のPrologのコードを見てください。ドラクエの道具屋(アリアハン)です。</p>

<div class="wp_syntax"><div class="code"><pre class="prolog" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">% shop.pl</span>
item<span style="color: #009900;">&#40;</span>やくそう<span style="color: #339933;">,</span> <span style="color: #800080;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>
item<span style="color: #009900;">&#40;</span>どくけしそう<span style="color: #339933;">,</span> <span style="color: #800080;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>
item<span style="color: #009900;">&#40;</span>キメラのつばさ<span style="color: #339933;">,</span> <span style="color: #800080;">25</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>
item<span style="color: #009900;">&#40;</span>おなべのフタ<span style="color: #339933;">,</span> <span style="color: #800080;">50</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>
&nbsp;
available<span style="color: #009900;">&#40;</span>G<span style="color: #339933;">,</span> X<span style="color: #009900;">&#41;</span> <span style="color: #339933;">:-</span>
	item<span style="color: #009900;">&#40;</span>X<span style="color: #339933;">,</span> G0<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
	G0 <span style="color: #339933;">=</span>＜ G<span style="color: #339933;">.</span></pre></div></div>

<p>availableという述語を定義していて、持ち金(G)を指定してクエリを投げると、購入可能なアイテムが得られます。Prologからの実行は以下のようになります。</p>
<pre class="brush: text; gutter: true; first-line: 1; highlight: []; html-script: false">
?- [&#039;shop.pl&#039;].
% shop.pl compiled 0.00 sec, 2,216 bytes
true.

?- available(10, X).
X = やくそう;
X = どくけしそう;
false.

?- available(100, X).
X = やくそう;
X = どくけしそう;
X = キメラのつばさ;
X = おなべのフタ.
</pre>
<p>これをC言語から使う訳ですが、<a href="http://www.swi-prolog.org/pldoc/refman/" title="SWI-Prolog公式ドキュメント" target="_blank">公式ドキュメント</a>によると以下のような手順になります。</p>
<ol>
<li><strong>C言語から使用したいPrologの述語が記述されたplファイルを準備する</strong>(今回はshop.pl)</li>
<li><strong>Prologを叩くC言語のファイルを準備する</strong>(今回はmain.cpp)</li>
<li><strong>SWI-Prologにバンドルされているswipl-ldというツールでビルドして実行ファイルを作成</strong></li>
</ol>
<p>本来はPrologで使用する述語もC言語側から追加したいのですが、今回はまぁ良しとします。さて手順1のshop.plはもう準備できているので手順2から進める事にします。</p>
<p><strong>手順2</strong><br />
C言語のコードを書きます。大した処理でもないのですが、まぁ情報が無いので苦労しました。処理の流れは、PL_initializeで初期化して、PL_Predicateでクエリに必要なpredicate_tオブジェクト(SQLみたいなイメージ)を構築します。作成したpredicateをPL_open_queryでPrologにクエリを投げて、PL_get_charsなんかで結果を取得するというものです。</p>
<pre class="brush: cpp; gutter: true; first-line: 1; highlight: []; html-script: false">
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;SWI-Prolog.h&gt;

int main(int argc, char **argv) {
    if (argc == 1) {
        printf(&quot;Usage: shop [持ち金]\n&quot;);
        exit(0);
    }

    // initialize
    char* program = argv[0];
    char* plav[2] = { program, NULL };
    if (!PL_initialise(1, plav)) {
        PL_halt(1);
    }

    // build query
    int money = atoi(argv[1]);
    predicate_t pred = PL_predicate(&quot;available&quot;, 2, NULL);
    term_t h0 = PL_new_term_refs(2);
    term_t h1 = h0 + 1;
    PL_put_integer(h0, money);

    // exec query
    qid_t qid = PL_open_query(NULL, PL_Q_NORMAL, pred, h0);
    while (PL_next_solution((qid))) {
        char *s = NULL;
        PL_get_chars(h1, &amp;s, CVT_ALL|REP_UTF8);
        printf(&quot;%s\n&quot;, s);
    }
    PL_close_query(qid);

    // cleanup
    PL_cleanup(1);

    return 0;
}
</pre>
<p>とにかく情報が無いのが一番困りました。唯一サンプルコードが見つかったのが<a href="http://www.montefiore.ulg.ac.be/~lens/prolog/prolog.html" title="libswiplのサンプル" target="_blank">コチラのページ</a>です。フランス語ですけど。少しハマったのがPL_get_charsで文字列を取得する際には上記のフラグを指定しないと文字列として取得できないという事です。あとPL_open_queryからPL_close_queryまでを一纏めにしたPL_call_predicateを使うと、何故か想定通りの挙動をしませんでした。</p>
<p><strong>手順3</strong><br />
次にビルドします。これは簡単ですね。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ swipl-ld -o shop main.cpp shop.pl
$ ls
main.cpp        shop            shop.pl
</pre>
<p>ところでswipl-ldは幾つかのビルド処理を一纏めにしているユーティリティです。内部で何が起こっているかは-vオプションを追加すると見れます。詳細は調べてませんがswiplに何やら怪しい処理をさせていますね。気が向いたらもう少し突っ込みたいところです。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ swipl-ld -v -o shop main.cpp shop.pl
        eval `swipl --dump-runtime-variables`
                CC=&quot;gcc&quot;
                PLBASE=&quot;/usr/lib/swipl-5.6.63&quot;
                PLARCH=&quot;i386-darwin10.8.0&quot;
                PLLIBS=&quot;-lpl&quot;
                PLLIB=&quot;-lpl&quot;
                PLCFLAGS=&quot;-no-cpp-precomp -pthread -fno-common&quot;
                PLLDFLAGS=&quot;-O3 -pthread&quot;
                PLSOEXT=&quot;dylib&quot;
                PLTHREADS=&quot;yes&quot;
        g++ -c -no-cpp-precomp -pthread -fno-common -D_REENTRANT -D__SWI_PROLOG__ -D__SWI_EMBEDDED__ -I/usr/lib/swipl-5.6.63/include -o main.o main.cpp
        g++ -o shop -O3 -pthread main.o -L/usr/lib/swipl-5.6.63/lib/i386-darwin10.8.0 -lpl -lpl
        swipl -f none -F none -g true -t &quot;consult([&#039;shop.pl&#039;]),qsave_program(&#039;pltmp-98271&#039;,[goal=&#039;\$welcome&#039;,toplevel=prolog,init_file=none])&quot;
% shop.pl compiled 0.00 sec, 5,272 bytes
% halt
        cat pltmp-98271 &gt;&gt; shop
        chmod 755 shop
        rm main.o
        rm pltmp-98271
</pre>
<p>以上で実行ファイルshopが生成されました。早速実行してみます。ライセンスとかが出力されて不満ですが、まぁ最低限の挙動は示していますね。</p>
<pre class="brush: bash; gutter: true; first-line: 1; highlight: []; html-script: false">
$ ./shop 10
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.6.63)
Copyright (c) 1990-2008 University of Amsterdam.
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

やくそう
どくけしそう
</pre>
<p>以上、SWI-PrologをC言語から触ってみました。GNU Prologの場合は少しインターフェースが異なるようなので注意してください。まぁ正直Cから使えても仕方が無いのでPythonから使えない理由を少し探ってみたいと思います。Pythonの他に、<a href="http://search.cpan.org/~salva/Language-Prolog-Yaswi-0.19/Yaswi.pm" title="PerlのSWI-Prologのインターフェース" target="_blank">Perlにもインターフェース</a>が用意されているようですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/2558/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQLをlatin1のまま使ってて、Djangoからだと文字化けた話</title>
		<link>http://taichino.com/engineer-life/2223</link>
		<comments>http://taichino.com/engineer-life/2223#comments</comments>
		<pubDate>Sun, 10 Jul 2011 15:58:42 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[database]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2223</guid>
		<description><![CDATA[表題の通りMySQL適当に使ってたってだけの話なんですが、MySQLってインストールすると、デフォルトで文字コードは軒並みlatin1になってるわけです。utf8にしててくれても良いんじゃねと思わなくもないです。 mysql&#62; status; -------------- mysql Ver 14.14 Distrib 5.1.51, for apple-darwin10.3.0 &#40;i386&#41; using readline 5.1 ... Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 ... -------------- で、この設定のままutf8な文字列を突っ込んでて、でも別にmysqlコマンドやらpythonのMySQLdbやらから読み書きしても文字化けしないし、まぁ良いかと思ってほったらかしてた訳です。そしたらDjangoから読もうとしたら文字化けしたので、なんでやねんと思って調べたのでメモしておきます。 ちょっと調べたところDjangoはデータベースに対してutf8のデータを要求するようです。そうするとMySQLは自分の中にlatin1の文字列が入っていると思い込んでいるので、格納されている文字列をlatin1からutf8に変換しようとする訳ですね。結果utf8で格納されている文字列に対して、無理矢理latin1からutf8への変換をかけて化けるという事でした。 なぜDjango以外のケースで化けなかったかというと、クライアントがlatin1のデータを要求したせいで、データベースで変換処理が走らず、結果的には化けないと。まぁタマタマ動いていただけですね。ダメダメです。 さて化けてた理由はわかりましたが、すでにlatin1なテーブルにutf8で数十万件ほどデータを突っ込んでしまっています。my.cnfなんかで慌ててutf8な設定にしても当然解決されませんし、テーブルの文字コードを変更しても化けたままです。しょうがないから変換スクリプトでも書くかと思っていると、MySQLのリファレンスに解決方法が書かれていました。抜粋したものが以下になります。 ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8; リファレンスによるとテキストなカラムとblobなカラム間では変換処理は走らないようです。なのでblobを経由させると変換処理を発生させずに、MySQLにデータに対する認識を変更できるという事ですね。この場合はlatin1だと思われているutf8な文字列を、utf8として認識させ直すことができました。ちなみに僕は一度blobを介さずにutf8にalter tableして、バックアップを取ってなくて終わったと冷や汗をかきましたが、すがる思いでlatin1に再度alter tableしたら、元通りになりました。運がよかったのか、そういうものなのかは未検証です。 という訳で、文字コードlatin1のまま使って、やっちまった!と思ったけど、ALTER [...]]]></description>
			<content:encoded><![CDATA[<p>表題の通りMySQL適当に使ってたってだけの話なんですが、MySQLってインストールすると、デフォルトで文字コードは軒並みlatin1になってるわけです。utf8にしててくれても良いんじゃねと思わなくもないです。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mysql<span style="color: #000000; font-weight: bold;">&gt;</span> status;
<span style="color: #660033;">--------------</span>
mysql  Ver <span style="color: #000000;">14.14</span> Distrib 5.1.51, <span style="color: #000000; font-weight: bold;">for</span> apple-darwin10.3.0 <span style="color: #7a0874; font-weight: bold;">&#40;</span>i386<span style="color: #7a0874; font-weight: bold;">&#41;</span> using readline <span style="color: #000000;">5.1</span>
...
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
...
<span style="color: #660033;">--------------</span></pre></div></div>

<p>で、この設定のままutf8な文字列を突っ込んでて、でも別にmysqlコマンドやらpythonのMySQLdbやらから読み書きしても文字化けしないし、まぁ良いかと思ってほったらかしてた訳です。そしたらDjangoから読もうとしたら文字化けしたので、なんでやねんと思って調べたのでメモしておきます。</p>
<p><span id="more-2223"></span></p>
<p>ちょっと調べたところDjangoはデータベースに対してutf8のデータを要求するようです。そうするとMySQLは自分の中にlatin1の文字列が入っていると思い込んでいるので、格納されている文字列をlatin1からutf8に変換しようとする訳ですね。結果utf8で格納されている文字列に対して、無理矢理latin1からutf8への変換をかけて化けるという事でした。</p>
<p>なぜDjango以外のケースで化けなかったかというと、クライアントがlatin1のデータを要求したせいで、データベースで変換処理が走らず、結果的には化けないと。まぁタマタマ動いていただけですね。ダメダメです。</p>
<p>さて化けてた理由はわかりましたが、すでにlatin1なテーブルにutf8で数十万件ほどデータを突っ込んでしまっています。my.cnfなんかで慌ててutf8な設定にしても当然解決されませんし、テーブルの文字コードを変更しても化けたままです。しょうがないから変換スクリプトでも書くかと思っていると、<a href="http://dev.mysql.com/doc/refman/5.1/ja/alter-table.html">MySQLのリファレンスに解決方法が書かれていました</a>。抜粋したものが以下になります。</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> t1 <span style="color: #993333; font-weight: bold;">CHANGE</span> c1 c1 <span style="color: #993333; font-weight: bold;">BLOB</span>;
<span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> t1 <span style="color: #993333; font-weight: bold;">CHANGE</span> c1 c1 TEXT <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8;</pre></div></div>

<p>リファレンスによるとテキストなカラムとblobなカラム間では変換処理は走らないようです。なのでblobを経由させると変換処理を発生させずに、MySQLにデータに対する認識を変更できるという事ですね。この場合はlatin1だと思われているutf8な文字列を、utf8として認識させ直すことができました。ちなみに僕は一度blobを介さずにutf8にalter tableして、バックアップを取ってなくて終わったと冷や汗をかきましたが、すがる思いでlatin1に再度alter tableしたら、元通りになりました。運がよかったのか、そういうものなのかは未検証です。</p>
<p>という訳で、文字コードlatin1のまま使って、やっちまった!と思ったけど、ALTER TABLE使えば何とかなったという話でした。まぁ最初から文字コードくらいちゃんと設定しとけという事ですね。</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">[mysqld]
default-character-set=utf8</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/2223/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSXでnginxを動かすメモ</title>
		<link>http://taichino.com/engineer-life/2212</link>
		<comments>http://taichino.com/engineer-life/2212#comments</comments>
		<pubDate>Sun, 05 Jun 2011 13:58:45 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[技術]]></category>
		<category><![CDATA[launchctl]]></category>
		<category><![CDATA[launchd]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2212</guid>
		<description><![CDATA[先日CentOS上でnginxを使うというエントリを書きましたが、開発環境のOSXにnginxをインストールするのに手間取ったのでメモ書きです。 まずはnginxユーザとグループを作成します。adduserはないので、dsclコマンドを使います。面倒ですが、パラメータを一つずつ設定していく感じのようですね。 $ dscl . -list /Groups PrimaryGroupID &#124; sort -k 2 -n # 開いているIDを確認 $ sudo dscl . -create /Groups/nginx PrimaryGroupID 1001 $ sudo dscl . -create /Users/nginx UniqueID 1001 $ sudo dscl . -create /Users/nginx PrimaryGroupID 1001 $ sudo dscl . -create /Users/nginx UserShell /usr/bin/false 続いてnginxをインストールします。これはlinux上での作業と同じですね。 $ curl -O http://nginx.org/download/nginx-1.0.3.tar.gz $ tar zxvf [...]]]></description>
			<content:encoded><![CDATA[<p>先日<a href="http://taichino.com/engineer-life/linux/2170">CentOS上でnginxを使うというエントリ</a>を書きましたが、開発環境のOSXにnginxをインストールするのに手間取ったのでメモ書きです。</p>
<p><span id="more-2212"></span></p>
<p>まずはnginxユーザとグループを作成します。adduserはないので、dsclコマンドを使います。面倒ですが、パラメータを一つずつ設定していく感じのようですね。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ dscl . <span style="color: #660033;">-list</span> <span style="color: #000000; font-weight: bold;">/</span>Groups PrimaryGroupID <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-k</span> <span style="color: #000000;">2</span> <span style="color: #660033;">-n</span>  <span style="color: #666666; font-style: italic;"># 開いているIDを確認</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-create</span> <span style="color: #000000; font-weight: bold;">/</span>Groups<span style="color: #000000; font-weight: bold;">/</span>nginx PrimaryGroupID <span style="color: #000000;">1001</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-create</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>nginx UniqueID <span style="color: #000000;">1001</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-create</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>nginx PrimaryGroupID <span style="color: #000000;">1001</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> dscl . <span style="color: #660033;">-create</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>nginx UserShell <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span></pre></div></div>

<p>続いてnginxをインストールします。これはlinux上での作業と同じですね。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ curl <span style="color: #660033;">-O</span> http:<span style="color: #000000; font-weight: bold;">//</span>nginx.org<span style="color: #000000; font-weight: bold;">/</span>download<span style="color: #000000; font-weight: bold;">/</span>nginx-1.0.3.tar.gz
$ <span style="color: #c20cb9; font-weight: bold;">tar</span> zxvf nginx-1.0.3.tar.gz
$ <span style="color: #7a0874; font-weight: bold;">cd</span> nginx-1.0.3
$ .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--conf-path</span>=<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx.conf <span style="color: #660033;">--user</span>=nginx <span style="color: #660033;">--group</span>=nginx
$ <span style="color: #c20cb9; font-weight: bold;">make</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>さてインストールしたnginxをデーモンとして扱いたい訳ですが、OSXにはinit.dな仕組みがありません。代わりにlaunchdとlaunchctlを使うようです。launchd周辺については、<a href="http://www.itmedia.co.jp/enterprise/articles/0704/26/news009.html">itmediaにわかりやすい記事</a>があったので、とりあえず読んだら良いと思います。</p>
<p>launchdにデーモンを登録する際に必要なことは、登録したいデーモンの情報を記述したplistファイルを作成して適切なディレクトリに置くという事です。今回は以下のファイルを作成しました。</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt; ?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;">&lt; !DOCTYPE plist PUBLIC <span style="color: #ff0000;">&quot;-//Apple//DTD PLIST 1.0//EN&quot;</span> </span>
<span style="color: #009900;">                       <span style="color: #ff0000;">&quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;plist</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Label<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>org.nginx.nginx<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Program<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/usr/local/nginx/sbin/nginx<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>KeepAlive<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dict<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>NetworkState<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;true</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/dict<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>StandardErrorPath<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/var/log/system.log<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/string<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>LaunchOnlyOnce<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/key<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;true</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/plist<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>また作成した設定ファイルを置ける場所は複数あって、どこが正しい場所なのか迷っていたのですが、launchdのmanを見ると以下の記述がありました。</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System-wide daemons provided by the administrator.
/System/Library/LaunchAgents   Per-user agents provided by Mac OS X.
/System/Library/LaunchDaemons  System-wide daemons provided by Mac OS X.</pre></div></div>

<p>この感じだと/Library/LaunchDaemonsに入れたら良さそうです。この後以下のコマンドを実行すればサービスの登録が完了します。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> launchctl load <span style="color: #660033;">-w</span> <span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>LaunchDaemons<span style="color: #000000; font-weight: bold;">/</span>org.nginx.nginx.plist</pre></div></div>

<p>以上で、nginxがOSX上で動くようになりました。ただ現状、手元ではlaunchctlコマンドからnginxの再起動やリロードが上手く行きません。開発環境なので、とりあえず放置する事にしましたが、サービス周辺の仕組みがlinuxと比べるとなんか複雑でイマイチだなぁ、という印象です。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/engineer-life/2212/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

