<?xml version="1.0" encoding="utf-8" ?>

<?xml-stylesheet href="/tmtms/rssxsl" type="text/xsl" media="screen"?>

<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/tmtms/rss">
	<title>しあわせプログラマ</title>
	<link>http://d.hatena.ne.jp/tmtms/</link>
	<description>しあわせプログラマ</description>
	
	<dc:creator>tmtms</dc:creator>
	<items>
	<rdf:Seq>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tmtms/20100111/1263213332"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tmtms/20091218/1261232479"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tmtms/20090729/1249183003"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tmtms/20090712/1247418196"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tmtms/20090605/1244215294"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tmtms/20090322/1237719050"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tmtms/20090207/1234001180"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/tmtms/20090201/1233499176"/>
	</rdf:Seq>
	</items>
</channel>



<item rdf:about="http://d.hatena.ne.jp/tmtms/20100111/1263213332">
	<title>[MySQL][Ruby] Ruby/MySQL 2.9</title>
	<link>http://d.hatena.ne.jp/tmtms/20100111/1263213332</link>
	<description> Ruby から MySQL を使うための pure Ruby ライブラリ Ruby/MySQL 2.9 を公開しました。まだベータ版です。 http://github.com/tmtm/ruby-mysql/tree/2.9 前の Ruby/MySQL は 0.2.6 だったのですが、今回 2.9 とした理由は: Cライブラリ版の MySQL/Ruby 2.8.x の後継。 次は </description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>Ruby から MySQL を使うための pure Ruby ライブラリ Ruby/MySQL 2.9 を公開しました。まだベータ版です。 <a href="http://github.com/tmtm/ruby-mysql/tree/2.9" target="_blank">http://github.com/tmtm/ruby-mysql/tree/2.9</a></p>
			<p>前の Ruby/MySQL は 0.2.6 だったのですが、今回 2.9 とした理由は:</p>
			<ul>
				<li> Cライブラリ版の MySQL/Ruby 2.8.x の後継。</li>
				<li> 次は 3.0 にしたいという希望。</li>
			</ul>
			<p>…という意味があります。</p>
			<p>gem は gemcutter にあります。<a href="http://gemcutter.org/gems/ruby-mysql/versions/2.9.0" target="_blank">http://gemcutter.org/gems/ruby-mysql/versions/2.9.0</a></p>
			<p>gemcutter が設定されて入れば次のコマンドでインストールできます。</p>
<pre>
# gem install ruby-mysql -v 2.9
</pre>

			<p>対応する Ruby バージョンは 1.8.7 / 1.9.1 / 1.9.2、MySQL バージョンは 5.1.x です。</p>
			<h4>MySQL/Ruby 2.8.x との互換</h4>
			<p>以前のバージョンと異なり、MySQL/Ruby 2.8.x とほぼ互換があります。ただし以下の非互換があります。</p>
			<p>Ruby 1.8.x で使用する場合、Mysql#escape_string は、マルチバイト文字の一部として特殊記号を含むマルチバイト文字セットに対して<span style="font-weight:bold;">安全ではありません</span>。シフトJIS(sjis, cp932)等は2バイト目に「\」を含むためこの制限にあてはまります。プログラム側で独自にエスケープ処理を行うか、ストアドプロシジャを使用してください。そうでないと <span style="font-weight:bold;">SQL インジェクションの危険性があります</span>。EUC-JP や UTF-8 は問題ありません。</p>
			<p>いくつかのメソッドがありません: Mysql#debug, Mysql#change_user, Mysql#create_db, Mysql#drop_db, Mysql#dump_debug_info, Mysql#ssl_set, Mysql#reconnect</p>
			<p>Mysql#options でサポートしているオプションは次のものだけです: Mysql::INIT_COMMAND, Mysql::OPT_CONNECT_TIMEOUT, Mysql::OPT_LOCAL_INFILE, Mysql::OPT_READ_TIMEOUT, Mysql::OPT_WRITE_TIMEOUT, Mysql::SET_CHARSET_NAME. これら以外を指定すると "option not implementted" という warning が標準エラー出力に出力されます。</p>
			<p>Mysql#use_result は Mysql#store_result と同じです。つまりサーバーから一気に結果セットを読み込みます。</p>
			<h4> MySQL/Ruby 2.8.x からの改良点</h4>
			<p>Ruby 1.9.x の M17N に対応しています。mysqld へのクエリ文字列やプリペアドステートメントで与える値は mysqld との接続の文字コードに自動的に変換されます。mysqld からの結果文字列は接続文字コードとして取り出されます。</p>
			<p>Mysql::Result, Mysql::Stmt が Enumerable を include しています。</p>
			<p>ブロックなしの Mysql::Result#each, each_hash Mysql::Stmt#each, each_hash が Enumerator を返します。</p>
			<p>Mysql#charset= で接続 charset を指定できます。</p>
			<p>Mysql::Error だけでなく、エラー種別ごとにエラークラスが用意されてます。たとえば、構文エラーの場合は Mysql::ParseError など。これらのエラーは Mysql::Error の継承クラスです。</p>
			<p>他に pure Ruby 版であることのメリットとして、Ruby のマルチスレッドが同時に動くというのがあります。あるスレッドで時間のかかるクエリを実行中に他のスレッドが動くことができます。</p>
			<p>機能的な改良点ではありませんが、ライセンスは Ruby ライセンスです。Cライブラリ版の MySQL/Ruby は libmysqlclient をリンクするため、それを使用する Ruby スクリプトも GPL にするか、それが嫌なら MySQL の商用ライセンスを購入する必要がありました。Ruby/MySQL は libmysqlclient をリンクしないため、その制限はありません。</p>
			<h4> Ruby 1.9.x M17N 対応</h4>
			<p>MySQL はデータベース、テーブル、カラム毎にそれぞれ文字セットを持っています。また、サーバーとクライアントの間の接続に文字セットを持っています。接続とカラムとの間の文字セットは MySQL のサーバー側で自動的に変換されます。</p>
			<p>Ruby/MySQL では MySQL 接続の文字セットを Mysql#charset= で指定できます。または、Mysql#connect 前に Mysql#options(Mysql::SET_CHARSET_NAME) で設定します。</p>
			<p>Ruby 1.9.x では文字列はそれぞれエンコーディング(文字セット)を持っています。Ruby/MySQL で Ruby プログラムから MySQL サーバーに渡す文字列（クエリ文字列や、プリペアドステートメントのパラメータ）は自動的に接続に応じた文字セットに変換されます。</p>
			<p>MySQL サーバーから返される文字列の Ruby のエンコーディングは接続の文字セットに対応したものになります。ただし、プリペアドステートメントでは、BINARY型とBIT型のデータは ASCII-8BIT エンコーディングで返ります。</p>
			<p>例:</p>
<pre class="syntax-highlight">
<span class="synComment"># -*- coding:utf-8 -*-</span>
<span class="synPreProc">require</span> <span class="synSpecial">'</span><span class="synConstant">mysql</span><span class="synSpecial">'</span>
my = <span class="synIdentifier">Mysql</span>.connect(<span class="synConstant">nil</span>, <span class="synSpecial">'</span><span class="synConstant">username</span><span class="synSpecial">'</span>, <span class="synSpecial">'</span><span class="synConstant">password</span><span class="synSpecial">'</span>)
my.charset = <span class="synSpecial">'</span><span class="synConstant">cp932</span><span class="synSpecial">'</span>          <span class="synComment"># 接続の文字セットは CP932</span>
query = <span class="synSpecial">'</span><span class="synConstant">select &#34;あいう&#34;</span><span class="synSpecial">'</span>     <span class="synComment"># UTF-8 のクエリ文字列</span>
query.encoding                <span class="synComment"># =&#62; #&#60;Encoding:UTF-8&#62;</span>
col, = my.query(query).fetch  <span class="synComment"># 取り出した値は接続と同じく CP932</span>
col.encoding                  <span class="synComment"># =&#62; #&#60;Encoding:Windows-31J&#62;</span>
col                           <span class="synComment"># =&#62; CP932 で &#34;あいう&#34;</span>
</pre>

		</div>
]]></content:encoded>

	<dc:creator>tmtms</dc:creator>
	<dc:date>2010-01-11T21:35:32+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tmtms/20091218/1261232479">
	<title>[MySQL] MySQLユーザー会会2009冬</title>
	<link>http://d.hatena.ne.jp/tmtms/20091218/1261232479</link>
	<description> MySQLユーザー会会2009冬に参加。 16時前に長野の会社を出て、19時前に六本木のGREEに到着。 19時に始まるはずだった池田さんのセッションだったんだけど、プロジェクタに出力できないというトラブルが発生。 事情によりUSBが使えないPCなので、他のPCにデータを移すことも</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p><a href="http://atnd.org/events/2512" target="_blank">MySQLユーザー会会2009冬</a>に参加。</p>
			<p>16時前に長野の会社を出て、19時前に六本木のGREEに到着。</p>
			<p>19時に始まるはずだった池田さんのセッションだったんだけど、プロジェクタに出力できないというトラブルが発生。</p>
			<p>事情によりUSBが使えないPCなので、他のPCにデータを移すこともままならなず、結局自分のPCとLANケーブルと直結して、FTPでアップロードしてもらい、USBメモリに移して他のPCに持っていって…ということをしてなんとか映すことができました。35分押し。</p>
			<h4>「MySQL全文検索ことはじめ」住商情報システム 池田徹郎さん</h4>
			<p>全文検索とは…から始まり、MySQLで実装する全文検索、Tritonn の紹介という流れでした。</p>
			<p><a href="http://qwik.jp/senna" target="_blank">Senna</a> 自体開発が止まっていることとか、MySQL 5.1 への対応とかが気になっていたので質問してみました。</p>
			<p>Senna は <a href="http://groonga.org/" target="_blank">groonga</a> に進化し、Tritonn も groonga に対応し、5.1 のプラガブルストレージエンジンになる予定とのことでした。</p>
			<h4>乾杯</h4>
			<p>時間が押したおかげでピザが届いてしまったので、ここで乾杯。何かしゃべった気がします。</p>
			<h4>「おくかずほ に訊く『MySQL』」サイボウズ・ラボ おくかずほさん</h4>
			<p>坂井さんがインタビュアーでおくさんに色々聞くという趣向でした。</p>
			<p>MySQLの出会いとか、MySQLの好きなところや嫌いなところとか。</p>
			<p>Q4M に興味があったので質問してその後も個人的に話をさせてもらいました。</p>
			<h4>「XtraDB for Performance」PERCONA 木下さん</h4>
			<p>懇親会中に飛び入りで、世界でもっともInnoDBに詳しい人である木下さんが、InnoDB を拡張した XtraDB について説明しました。</p>
			<h4>その後</h4>
			<p>一通り終了してもまだ10人くらい残っていて、@tokuhirom さんとか私とか @kentokushiba さんとかがネタを披露したりして、結局会場を出たのは AM3時頃。</p>
			<p>その後は赤坂みすじ通りの店に移動して朝5時半くらいまで。ホテルとっておかなくて正解でした。</p>
			<h4>次回</h4>
			<p>この手のイベントを数ヶ月置きくらいにやりたいという話もありました。</p>
			<p>個人的には夜中まで楽しめたからいいんですけど、そうじゃない参加者にとっては今回の3000円ってのはちょっと高いんじゃないかと思いました。やっぱり基本的に無料がいいんじゃないかなと思ったり。</p>
			<p>主催者じゃないから主催者の苦労は本当にはわからないので好きなこと言ってるんですけど (^^;</p>
			<p>主催者の <a href="http://d.hatena.ne.jp/sakaik/">id:sakaik</a> さんの記事→ <a href="http://d.hatena.ne.jp/sakaik/20091219/kaikai_2009d_finished">id:sakaik:20091219:kaikai_2009d_finished</a> </p>
		</div>
]]></content:encoded>

	<dc:creator>tmtms</dc:creator>
	<dc:date>2009-12-19T23:21:19+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tmtms/20090729/1249183003">
	<title>[Ruby][MySQL] Ruby/MySQL 3.0.2 alpha</title>
	<link>http://d.hatena.ne.jp/tmtms/20090729/1249183003</link>
	<description> Ruby/MySQL 3.0.2 です。相変わらずアルファ版です。 インストール方法: # sudo gem install tmtm-ruby-mysql --source http://gems.github.com 3.0.1 からの変更点。 Ruby 1.9 対応 これまでのでもちゃんと動くんじゃないかなぁ…と漠然と思っていたのですが、全然動いてい</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>Ruby/MySQL 3.0.2 です。相変わらずアルファ版です。</p>
			<h4>インストール方法:</h4>
<pre>
# sudo gem install tmtm-ruby-mysql --source http://gems.github.com
</pre>

			<h4> 3.0.1 からの変更点。</h4>
			<h5> Ruby 1.9 対応</h5>
			<p>これまでのでもちゃんと動くんじゃないかなぁ…と漠然と思っていたのですが、全然動いていないことが判明したので、修正しました。</p>
			<p>テストコードを RSpec で書いてしまったので Ruby 1.9 でテストしてなかったのですが、Ruby会議2009 の IRC で、最近の RSpec は Ruby 1.9 でも動くということを教えてもらったので、テストしてみたら全然動いていなかったことが判明したという…。</p>
			<h5> Mysql#list_fields 追加</h5>
			<p>「SHOW COLUMNS」や「SHOW CREATE TABLE」でも同様の情報は取れるのですが、ビミョーに違うのであった方が良いかと思って追加しました。</p>
			<p>ただし MySQL/Ruby 2.x との互換はありません。MySQL/Ruby 2.x では C API に合わせて、Mysql#list_fields はフィールド情報だけを持ち、レコードが空の Mysql::Result を返していたのですが、Ruby/MySQL 3.0 では単純に Mysql::Field の配列を返すようにしたためです。</p>
			<h4>今後</h4>
			<p>これで Ruby 1.9 でも普通に使えるようになったと思いますので、Ruby 1.9 が好きな人は使ってみてください。まあ Ruby/MySQL をベタに使う人はあまりいないと思うので、巷の O/R マッパーが対応しないとあまり関係ないのでしょうけど。</p>
			<p>今後は、速度的にボトルネックになっている部分を高速化したりするかもしれません（C で書く？）。</p>
		</div>
]]></content:encoded>

	<dc:creator>tmtms</dc:creator>
	<dc:date>2009-08-02T12:16:43+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tmtms/20090712/1247418196">
	<title>[Ruby][MySQL] Ruby/MySQL 3.0.1 alpha</title>
	<link>http://d.hatena.ne.jp/tmtms/20090712/1247418196</link>
	<description> Ruby/MySQL 3.0.1 を作りました。相変わらずアルファ版です。 インストールは次のように。 # sudo gem install tmtm-ruby-mysql --source http://gems.github.com 3.0.0 からの変更点 Mysql#query で勝手にプリペアドステートメントを使うのをやめました。いろいろと複雑に</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>Ruby/MySQL 3.0.1 を作りました。相変わらずアルファ版です。</p>
			<p>インストールは次のように。</p>
<pre>
# sudo gem install tmtm-ruby-mysql --source http://gems.github.com
</pre>

			<p>3.0.0 からの変更点</p>
			<ul>
				<li> Mysql#query で勝手にプリペアドステートメントを使うのをやめました。いろいろと複雑になってたので。ただし、クエリ文字列以外の引数がついている場合はプリペアドステートメントを使用します。</li>
			</ul>
<pre class="syntax-highlight">
mysql.query(&#34;select 1,2,3&#34;)           # プリペアドステートメントではない
mysql.query(&#34;select ?,?,?&#34;, 1, 2, 3)  # プリペアドステートメント
</pre>

			<ul>
				<li> Mysql::Result#fetch 等が返すレコードの値は、Ruby の適切な値に変換するようにしました。</li>
			</ul>
<pre class="syntax-highlight">
mysql.query(&#34;select 123,&#39;abc&#39;&#34;).fetch  # =&#62; [123, &#34;abc&#34;]
</pre>

			<ul>
				<li> Mysql::Statement#execute も Mysql::Result を返すようにしました。正確には Mysql::Result のサブクラスですが。それに伴い Mysql::Statement#each, #fetch 等は廃止しました。</li>
			</ul>
			<p>Ruby/MySQL 3.0 全体については <a href="http://d.hatena.ne.jp/tmtms/20090322/1237719050">id:tmtms:20090322:1237719050</a> をどうぞ。</p>
			<p>MySQL/Ruby 2.x でできるのに Ruby/MySQL 3.0 でできないこと</p>
			<ul>
				<li> <a href="http://dev.mysql.com/doc/refman/5.1/ja/cursor-restrictions.html" target="_blank">サーバーサイドカーソル</a>。3.0 ではプリペアドステートメントを使っても結果レコードを一気に取ってきてしまいます。</li>
				<li> <a href="http://dev.mysql.com/doc/refman/5.1/ja/c-api-multiple-queries.html" target="_blank">マルチプルステートメント</a>。「;」で連結された複数のクエリをサーバー側で複数クエリと認識して処理する機能です。</li>
			</ul>
			<p>両方とも誰も使ってないですよね (^^;</p>
			<p>[追記]</p>
			<ul>
				<li> LOAD DATA LOCAL INFILE 命令は発行できません。</li>
				<li> my.cnf ファイルを読み込む機能がありません。</li>
			</ul>
			<p>それ以外はたいていは機能としては存在すると思います。MySQL/Ruby 2.x との互換が重要な場合には、<code>require "mysql/compat"</code> しておけば、ある程度はそれなりに動くんではないかと思います。</p>
			<p>3.0.0 から4ヶ月も経ってる割にはこの程度… まあ、実質は数日程なのですが。今後はもうちょっと更新頻度をあげたいところです。</p>
			<p>ということで、よろしければどうぞ。</p>
		</div>
]]></content:encoded>

	<dc:creator>tmtms</dc:creator>
	<dc:date>2009-07-13T02:03:16+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tmtms/20090605/1244215294">
	<title>[MySQL] table_cache, max_connections, open_files_limit の関係</title>
	<link>http://d.hatena.ne.jp/tmtms/20090605/1244215294</link>
	<description> 昔はマニュアルに書いてあったような気がしたけど、最近のマニュアルには見当たらないのでメモ。 mysqld が同時に使用可能なファイル数は open_files_limit というパラメータで指定します。ただし、mysqld は最低でも table_cache*2+max_connections+10 --- (a) は必要だと</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>昔はマニュアルに書いてあったような気がしたけど、最近のマニュアルには見当たらないのでメモ。</p>
			<p>mysqld が同時に使用可能なファイル数は open_files_limit というパラメータで指定します。ただし、mysqld は最低でも table_cache*2+max_connections+10 --- (a) は必要だと考えるので、open_files_limit が (a) よりも小さければ、黙って (a) の値まで大きくします。table_cache を2倍しているのは、MyISAM が1テーブルにつき2ファイル使用するためでしょう。10 を足しているのは標準入出力エラー出力と、ログファイル等の分でしょうか。</p>
			<p>また、max_connections*5 --- (b) の方が (a) よりも大きければ、open_files_limit は (b) になります。</p>
			<p>(a), (b) よりも現在のファイル記述子の制限値(getrlimit(2) の rlim_cur の値) --- (c) が大きければ、(c) が採用されます。</p>
			<p>open_files_limit の最大値は 65535 です。また、setrlimit(2) で open_files_limit 分のファイル記述子が割り当てられない場合(おそらくrootで起動しなかった場合)は、(c) になります。そのため結果的に (a) よりも小さな値になってしまう場合があります。open_files_limit パラメータを指定しておらず (a) よりも小さい値になった場合は、max_connections と table_cache が次のように調整されます。</p>
			<p>max_connections が open_files_limit-10-64*2 よりも大きい場合は、その値まで小さくなります。</p>
			<p>table_cache が (open_files_limit-10-max_connections)/2 よりも大きい場合は、その値まで小さくなります。ただし 64 よりは小さくなりません。</p>
			<p>この調整が行われると、エラーログに次のように出力されます。</p>
<pre>
Changed limits: max_open_files: XXX  max_connections: XXX  table_cache: XXX
</pre>
			<p>open_files_limit パラメータを指定している場合は、エラーログに次のように出力されるだけです。</p>
<pre>
Could not increase number of max_open_files to more than XXX (request: XXX)
</pre>
			<p>table_cache と max_connections の調整は行われません。この場合は稼働中にファイル記述子が足りなくなる可能性があるため、注意が必要です。</p>
			<h4>例</h4>
			<p>mysqld --max_connections=100 --table_cache=64</p>
			<p>(c) が採用される。</p>

			<table>
				<tr><th>max_connections </th><td>  100 </td></tr>
				<tr><th>table_cache     </th><td>   64 </td></tr>
				<tr><th>open_files_limit</th><td> 1024 </td></tr>

			</table>
			<p>mysqld --max_connections=1000 --table_cache=64</p>
			<p>(b) が採用される。</p>

			<table>
				<tr><th>max_connections </th><td> 1000 </td></tr>
				<tr><th>table_cache     </th><td>   64 </td></tr>
				<tr><th>open_files_limit</th><td> 5000 </td></tr>

			</table>
			<p>mysqld --max_connections=100 --table_cache=1000</p>
			<p>(a) が採用される。</p>

			<table>
				<tr><th>max_connections </th><td>  100 </td></tr>
				<tr><th>table_cache     </th><td> 1000 </td></tr>
				<tr><th>open_files_limit</th><td> 2110 </td></tr>

			</table>
			<p>mysqld --max_connections=15000 --table_cache=64</p>
			<p>(b) 15000*5=75000 だが 65535 より大きいので 65535 になる</p>

			<table>
				<tr><th>max_connections </th><td> 1000 </td></tr>
				<tr><th>table_cache     </th><td>   64 </td></tr>
				<tr><th>open_files_limit</th><td> 65535 </td></tr>

			</table>
			<p>mysqld --max_connections=100 --table_cache=40000</p>
			<p>(a) 40000*2+100+10=80110 だが 65535 より大きいので 65535 になり、max_connections, table_cache の値も調整される。</p>
<pre>
[Warning] Changed limits: max_open_files: 65535  max_connections: 100  table_cache: 32712
</pre>

			<table>
				<tr><th>max_connections </th><td>  100 </td></tr>
				<tr><th>table_cache     </th><td> 32712 </td></tr>
				<tr><th>open_files_limit</th><td> 65535 </td></tr>

			</table>
			<p>mysqld --max_connections=100 --table_cache=40000 --open_files_limit=10</p>
			<p>上と同じだが open_files_limit が指定されているので、max_connections, table_cache の値は調整されない。</p>
<pre>
[Warning] Could not increase number of max_open_files to more than 65535 (request: 80110)
</pre>

			<table>
				<tr><th>max_connections </th><td>  100 </td></tr>
				<tr><th>table_cache     </th><td> 40000 </td></tr>
				<tr><th>open_files_limit</th><td> 65535 </td></tr>
			</table>

		</div>
]]></content:encoded>

	<dc:creator>tmtms</dc:creator>
	<dc:date>2009-06-06T00:21:34+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tmtms/20090322/1237719050">
	<title>[Ruby][MySQL] Ruby/MySQL 3.0.0 alpha</title>
	<link>http://d.hatena.ne.jp/tmtms/20090322/1237719050</link>
	<description> github に Ruby/MySQL 3.0.0 を置きました。 git にも gem にも慣れてないので試行錯誤でしたが、なんとか置けたようです。 github は gemspec を置いておけば自動的に gem を作ってくれるはずなのですが、罠に嵌まってもがいてました。 GitHub では *.gemspec ファイルのバ</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>github に Ruby/MySQL 3.0.0 を置きました。</p>
			<p>git にも gem にも慣れてないので試行錯誤でしたが、なんとか置けたようです。</p>
			<p>github は gemspec を置いておけば自動的に gem を作ってくれるはずなのですが、罠に嵌まってもがいてました。</p>
			<blockquote title="GitHub で gem を自動作成させるときの注意" cite="http://d.hatena.ne.jp/kwatch/20090213/1234548372">
			<p>GitHub では *.gemspec ファイルのバージョン番号が更新されたときにのみ Gem を生成する。だから *.gemspec を最初に commit & push したときは、Gem が生成されない(バージョン番号が更新されているわけではないから)。まずは *.gemspec ファイルをバージョン 0.0.0 とかで commit & push し、そのあとバージョンを上げて commit & push し直す。</p>
			<cite><a href="http://d.hatena.ne.jp/kwatch/20090213/1234548372" target="_blank">GitHub で gem を自動作成させるときの注意</a></cite></blockquote>
			<p>gemspec のバージョンを変更して git push したらちゃんとできました。</p>
			<p>次のようにすればインストールできるはずです。</p>
<pre class="syntax-highlight">
<span class="synComment"># sudo gem install tmtm-ruby-mysql --source http://gems.github.com</span>
</pre>

			<p>…と言っておいてなんですが、Ruby/MySQL 3.0.0 はアルファ版なので、ヒトバシラー以外は使ってはいけません。</p>
			<h4> 特徴等</h4>
			<p>Ruby/MySQL は Ruby から MySQL を使用するためのライブラリです。</p>
			<ul>
				<li> MySQL/Ruby と異なり Ruby で書かれているのでコンパイルの必要はありません。</li>
				<li> Ruby ライセンスです。libmysqlclient は使用していないので GPL ライセンスに縛られません。</li>
				<li> Ruby 1.9 の M17N に対応しています。</li>
				<li> Ruby/MySQL 0.x とも MySQL/Ruby 2.x とも互換はありません。</li>
				<li> まともなドキュメントがありません (ぉ</li>
				<li> MySQL/Ruby 2.x よりも遅いです。たぶん。</li>
			</ul>
			<h4> 使用例</h4>
<pre class="syntax-highlight">
<span class="synIdentifier">Mysql</span>.connect(<span class="synSpecial">&#34;</span><span class="synConstant">mysql://user:passwd@server:3306/dbname</span><span class="synSpecial">&#34;</span>) <span class="synStatement">do</span> |<span class="synIdentifier">my</span>|
  my.query(<span class="synSpecial">&#34;</span><span class="synConstant">select col1,col2 from tblname</span><span class="synSpecial">&#34;</span>).each <span class="synStatement">do</span> |<span class="synIdentifier">col1, col2</span>|
    p col1, col2
  <span class="synStatement">end</span>
  my.query(<span class="synSpecial">&#34;</span><span class="synConstant">insert into tblname (col1,col2) values (?,?)</span><span class="synSpecial">&#34;</span>, <span class="synConstant">123</span>, <span class="synSpecial">&#34;</span><span class="synConstant">abc</span><span class="synSpecial">&#34;</span>)
<span class="synStatement">end</span>
</pre>

			<h4> 接続</h4>
			<p>Mysql.new は Mysql オブジェクトを生成するだけでサーバーに接続はしません。Mysql.connect または Mysql#connect を使用してください。</p>
			<p>Mysql.connect の引数には上記のようなURI 文字列の他に、URI オブジェクト、Hash 等を使用できます。</p>
<pre class="syntax-highlight">
<span class="synComment"># URI文字列</span>
<span class="synIdentifier">Mysql</span>.connect(<span class="synSpecial">&#34;</span><span class="synConstant">mysql://user:passwd@server/dbname</span><span class="synSpecial">&#34;</span>)

<span class="synComment"># URIオブジェクト</span>
<span class="synIdentifier">Mysql</span>.connect <span class="synIdentifier">URI</span>.parse(<span class="synSpecial">&#34;</span><span class="synConstant">mysql://user:passwd@server/dbname</span><span class="synSpecial">&#34;</span>)

<span class="synComment"># Hash</span>
<span class="synIdentifier">Mysql</span>.connect(<span class="synIdentifier">:host=</span>&#62;<span class="synSpecial">&#34;</span><span class="synConstant">server</span><span class="synSpecial">&#34;</span>, <span class="synIdentifier">:user=</span>&#62;<span class="synSpecial">&#34;</span><span class="synConstant">user</span><span class="synSpecial">&#34;</span>, <span class="synIdentifier">:password=</span>&#62;<span class="synSpecial">&#34;</span><span class="synConstant">passwd</span><span class="synSpecial">&#34;</span>, <span class="synIdentifier">:db=</span>&#62;<span class="synSpecial">&#34;</span><span class="synConstant">dbname</span><span class="synSpecial">&#34;</span>)

<span class="synComment"># 以前の形式</span>
<span class="synIdentifier">Mysql</span>.connect(<span class="synSpecial">&#34;</span><span class="synConstant">server</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">user</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">passwd</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">dbname</span><span class="synSpecial">&#34;</span>)
</pre>

			<p>Mysql.new または Mysql.connect にブロックを渡すと、ブロックを抜ける時に自動的に接続を切断します。</p>
			<h4> クエリ</h4>
			<p>Mysql#query でクエリを発行します。<del datetime="2009-07-22T07:44:49+09:00">クエリ文字列が "sel" で始まる場合はプリペアドステートメントとして実行します。</del>（3.0.1で廃止）<del datetime="2009-07-22T07:44:49+09:00">プリペアドステートメント</del>クエリの結果は MySQL の型に応じた Ruby オブジェクトになります。以前とは異なり文字列だけとは限りません。</p>
<pre class="syntax-highlight">
my.query(<span class="synSpecial">&#34;</span><span class="synConstant">select 123,'abc'</span><span class="synSpecial">&#34;</span>).fetch <span class="synComment"># =&#62; [123, &#34;abc&#34;]</span>
</pre>

			<p>また Mysql#query に引数が２つ以上ある場合もプリペアドステートメントとして実行します。</p>
<pre class="syntax-highlight">
my.query(<span class="synSpecial">&#34;</span><span class="synConstant">insert into tblname (col1,col2) values (?,?)</span><span class="synSpecial">&#34;</span>, <span class="synConstant">123</span>, <span class="synSpecial">&#34;</span><span class="synConstant">abc</span><span class="synSpecial">&#34;</span>)
</pre>

			<p>もちろん、プリペアドステートメントを明示して実行することもできます。</p>
<pre class="syntax-highlight">
stmt = my.prepare(<span class="synSpecial">&#34;</span><span class="synConstant">select ?,?</span><span class="synSpecial">&#34;</span>)
stmt.execute <span class="synConstant">123</span>, <span class="synSpecial">&#34;</span><span class="synConstant">abc</span><span class="synSpecial">&#34;</span>
stmt.fetch  <span class="synComment"># =&#62; [123, &#34;abc&#34;]</span>
</pre>

			<p><del datetime="2009-07-22T07:44:49+09:00">プリペアドステートメントを使用したくない場合は Mysql#simple_query を使用します。クエリの結果は文字列になります。</del>(3.0.1で廃止)</p>
<pre class="syntax-highlight">
my.simple_query(<span class="synSpecial">&#34;</span><span class="synConstant">select 123,'abc'</span><span class="synSpecial">&#34;</span>).fetch <span class="synComment"># =&#62; [&#34;123&#34;, &#34;abc&#34;]</span>
</pre>

			<h4> エラー</h4>
			<p>MySQL/Ruby 2.x では例外クラスはすべて Mysql::Error で、エラー種別を判定したい場合は、rescue した後、Mysql::Error#errno を見る必要がありました。Ruby/MySQL 3.0 ではエラーの種類毎に例外クラスが存在するので、rescue でエラーを振り分けできます。まあ、今までがひどかったのですけどね。</p>
<pre class="syntax-highlight">
<span class="synStatement">begin</span>
  my.query(<span class="synSpecial">&#34;</span><span class="synConstant">....</span><span class="synSpecial">&#34;</span>)
<span class="synStatement">rescue</span> <span class="synIdentifier">Mysql</span>::<span class="synIdentifier">DupEntry</span>
  ...
<span class="synStatement">rescue</span> <span class="synIdentifier">Mysql</span>::<span class="synIdentifier">ParseError</span>
  ...
<span class="synStatement">rescue</span> <span class="synIdentifier">Mysql</span>::<span class="synIdentifier">NoSuchTable</span>
  ...
<span class="synStatement">end</span>
</pre>

			<h4> Charset</h4>
			<p>Ruby 1.9 では文字列の encoding/charset の自動変換を行います。</p>
			<p>特に charset を指定しない場合は MySQL サーバー接続時にサーバーから得られた charset(mysqld の default-character-set パラメータ)を Mysql#charset に保持します。</p>
			<p>charset を指定するには Mysql#charset= を使用します。</p>
<pre class="syntax-highlight">
my.charset = <span class="synSpecial">&#34;</span><span class="synConstant">utf8</span><span class="synSpecial">&#34;</span>
</pre>

			<p>クライアントからサーバーに送られるクエリやデータの文字列は、自動的に Mysql#charset に変換されます。また、サーバーからクライアントに送られる文字列は Mysql#charset に対応する Ruby のエンコーディング文字列として返されます。変換できない場合はエラーになります。</p>
			<p>mysqld の default-character-set パラメータが latin1 の場合(これは mysqld のデフォルト値です)、次のスクリプトを実行すると Encoding::UndefinedConversionError 例外が発生します。</p>
<pre class="syntax-highlight">
<span class="synComment"># -*- coding:utf-8 -*-</span>
<span class="synPreProc">require</span> <span class="synSpecial">&#34;</span><span class="synConstant">mysql</span><span class="synSpecial">&#34;</span>
<span class="synIdentifier">Mysql</span>.connect(...) <span class="synStatement">do</span> |<span class="synIdentifier">my</span>|
  p my.query(<span class="synSpecial">&#34;</span><span class="synConstant">select 'あいう'</span><span class="synSpecial">&#34;</span>).fetch
<span class="synStatement">end</span>
</pre>

			<p>次のように charset を指定すればエラーになりません。なお、Mysql#charset= に指定できる文字列は Ruby のエンコーディング名ではなく、MySQL の charset 名なので "utf-8" ではなく "utf8" です。</p>
<pre class="syntax-highlight">
<span class="synComment"># -*- coding:utf-8 -*-</span>
<span class="synPreProc">require</span> <span class="synSpecial">&#34;</span><span class="synConstant">mysql</span><span class="synSpecial">&#34;</span>
<span class="synIdentifier">Mysql</span>.connect(...) <span class="synStatement">do</span> |<span class="synIdentifier">my</span>|
  my.charset = <span class="synSpecial">&#34;</span><span class="synConstant">utf8</span><span class="synSpecial">&#34;</span>
  p my.query(<span class="synSpecial">&#34;</span><span class="synConstant">select 'あいう'</span><span class="synSpecial">&#34;</span>).fetch
<span class="synStatement">end</span>
</pre>

			<p>サーバーから取り出される文字列はデータベース上の charset に関係なく、Mysql#charset に対応するエンコーディングの Ruby 文字列になります。</p>
			<p>たとえば次のようなテーブルとレコードがある場合、</p>
<pre class="syntax-highlight">
mysql&#62; <span class="synStatement">show</span> <span class="synStatement">create</span> <span class="synStatement">table</span> t\G
*************************** <span class="synConstant">1</span>. <span class="synStatement">row</span> ***************************
       <span class="synStatement">Table</span>: t
<span class="synStatement">Create</span> <span class="synStatement">Table</span>: <span class="synStatement">CREATE</span> <span class="synStatement">TABLE</span> `t` (
  `euc` <span class="synType">char(</span><span class="synConstant">10</span><span class="synType">)</span> <span class="synStatement">CHARACTER</span> SET eucjpms <span class="synStatement">DEFAULT</span> <span class="synSpecial">NULL</span>,
  `sjis` <span class="synType">char(</span><span class="synConstant">10</span><span class="synType">)</span> <span class="synStatement">CHARACTER</span> SET cp932 <span class="synStatement">DEFAULT</span> <span class="synSpecial">NULL</span>,
  `utf8` <span class="synType">char(</span><span class="synConstant">10</span><span class="synType">)</span> <span class="synStatement">CHARACTER</span> SET utf8 <span class="synStatement">DEFAULT</span> <span class="synSpecial">NULL</span>
) ENGINE=<span class="synStatement">MyISAM</span> <span class="synStatement">DEFAULT</span> CHARSET=latin1

mysql&#62; <span class="synStatement">select</span> euc,<span class="synIdentifier">hex(euc)</span>,sjis,<span class="synIdentifier">hex(sjis)</span>,utf8,<span class="synIdentifier">hex(utf8)</span> <span class="synStatement">from</span> t\G
*************************** <span class="synConstant">1</span>. <span class="synStatement">row</span> ***************************
      euc: あいう
 <span class="synIdentifier">hex(euc)</span>: A4A2A4A4A4A6
     sjis: あいう
<span class="synIdentifier">hex(sjis)</span>: 82A082A282A4
     utf8: あいう
<span class="synIdentifier">hex(utf8)</span>: E38182E38184E38186
</pre>

			<p>それぞれのカラムは、異なる charset の文字列が格納されていますが、Ruby から次のように取り出した場合はすべて UTF-8 文字列になります。</p>
<pre class="syntax-highlight">
<span class="synComment"># -*- coding:utf-8 -*-</span>
<span class="synPreProc">require</span> <span class="synSpecial">&#34;</span><span class="synConstant">mysql</span><span class="synSpecial">&#34;</span>
<span class="synIdentifier">Mysql</span>.connect(...) <span class="synStatement">do</span> |<span class="synIdentifier">my</span>|
  my.charset = <span class="synSpecial">&#34;</span><span class="synConstant">utf8</span><span class="synSpecial">&#34;</span>
  rec = my.query(<span class="synSpecial">&#34;</span><span class="synConstant">select * from t</span><span class="synSpecial">&#34;</span>).fetch
  rec.each{|<span class="synIdentifier">c</span>| p c, c.encoding}
<span class="synStatement">end</span>
</pre>

			<p>結果:</p>
<pre>
&#34;あいう&#34;
#&#60;Encoding:UTF-8&#62;
&#34;あいう&#34;
#&#60;Encoding:UTF-8&#62;
&#34;あいう&#34;
#&#60;Encoding:UTF-8&#62;
</pre>

			<p>なお、BINARY型や BLOB型のデータは charset によらず、そのままのバイト列で取り出せます。Ruby 文字列のエンコードは ASCII-8BIT になります。</p>
			<h4> おわりに</h4>
			<p>MySQL/Ruby と比べて遅かったり、非互換があったりしますが、Ruby 1.9 の M17N がちゃんと扱えるのはこれだけなので、Ruby 1.9 な人はこれを使ってみるのもいいと思います。</p>
			<p>ただ、上にも書きましたが、まだアルファ版なので、今後非互換な変更が入る可能性もあります。</p>
			<p>まあ、フツーの人は Rails とか O/Rマッパー経由で使うだろうから、あまり関係ないでしょうけどね。</p>
		</div>
]]></content:encoded>

	<dc:creator>tmtms</dc:creator>
	<dc:date>2009-03-22T19:50:50+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tmtms/20090207/1234001180">
	<title>[MySQL] MySQL 5.1 InnoDB が遅い</title>
	<link>http://d.hatena.ne.jp/tmtms/20090207/1234001180</link>
	<description> Rubyist Magazine 25号が出ました。Ruby 1.9.1 についての有用な記事が盛りだくさんです。 「Ruby 1.9 で Web アプリを想定したベンチマークをとってみた」は「言語の速度がそのままアプリケーションの速度になるわけではない」ということについて、実際にベンチマークを測</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p><a href="http://jp.rubyist.net/magazine/?0025" target="_blank">Rubyist Magazine 25号</a>が出ました。Ruby 1.9.1 についての有用な記事が盛りだくさんです。</p>
			<p>「<a href="http://jp.rubyist.net/magazine/?0025-Ruby19_Performance" target="_blank">Ruby 1.9 で Web アプリを想定したベンチマークをとってみた</a>」は「言語の速度がそのままアプリケーションの速度になるわけではない」ということについて、実際にベンチマークを測定して説明しています。</p>
			<p>その中の「データベースを使ったベンチマーク」で使われてたベンチマークプログラムを自分でも試してみました。</p>
			<p>測定環境: ThinkPad X61, Ubuntu 8.10, Ruby 1.8.7, MySQL 5.0.67</p>
<pre>
$ ruby -s blog-bench.rb -N=500
      user     system      total        real
  5.830000   0.640000   6.470000 ( 23.872301)
</pre>

			<p>なぜか記事の結果よりも、Ruby の時間が多く、MySQL の時間が少ないです。</p>
			<p>クエリに USE INDEX を追加するオプションをつけてみました。</p>
<pre>
$ ruby -s blog-bench.rb -N=500 -useindex
      user     system      total        real
  5.390000   0.650000   6.040000 ( 12.675880)
</pre>

			<p>MySQL の使用時間は半分くらいになりました。</p>
			<p>試しに MySQL を 5.1.31 にしてみました。…いつまでたっても終わらない…。</p>
			<p>N=500 を N=100 にしたら 5.0.67 と同じくらいの時間で終わりました。</p>
<pre>
$ ruby -s blog-bench.rb -N=100
      user     system      total        real
  1.270000   0.130000   1.400000 ( 24.704081)
$ ruby -s blog-bench.rb -N=100 -useindex
      user     system      total        real
  1.140000   0.110000   1.250000 ( 24.831864)
</pre>

			<p>500 から 100 にしたので、Ruby の時間はちゃんと 1/5 になったのですが、MySQL の時間は変わりません。つまり 5.0.67 と比べて 5倍くらい時間がかかってることになります。また、-useindex をつけても変化ありませんでした。</p>
			<p>どうやら使用されているインデックスが異なるためのようです。</p>
			<p>5.0.67:</p>
<pre>
mysql&#62; explain select &#42; from blog_comments where entry_id in (4994,4984,4974,4964,4954,4944,4934,4924,4914,4904) order by id&#92;G
&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 1. row &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;
           id: 1
  select_type: SIMPLE
        table: blog_comments
         type: range
possible_keys: blog_comments_entry_id
          key: blog_comments_entry_id
      key_len: 4
          ref: NULL
         rows: 20
        Extra: Using where; Using filesort
</pre>

			<p>5.1.31:</p>
<pre>
mysql&#62; explain select &#42; from blog_comments where entry_id in (4994,4984,4974,4964,4954,4944,4934,4924,4914,4904) order by id&#92;G
&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 1. row &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;
           id: 1
  select_type: SIMPLE
        table: blog_comments
         type: index
possible_keys: blog_comments_entry_id
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 10123
        Extra: Using where
</pre>

			<p>これだと1万行もあるテーブルから10個のキーのレコードを抜き出すのにフルスキャンしてそうな…。</p>
			<p> -useindex 時に、強制的に blog_comments_entry_id を使用するように変更してみたら、5.0.67 とほぼ同じになりました。</p>
<pre>
$ ruby -s blog-bench.rb -N=500 -useindex
      user     system      total        real
  5.510000   0.620000   6.130000 ( 12.852172)
</pre>

			<p>ちなみに blog_comments を InnoDB から MyISAM に変更してみたら -useindex つけなくても速いです。</p>
<pre>
$ ruby -s blog-bench.rb -N=500
      user     system      total        real
  6.490000   0.710000   7.200000 ( 12.015570)
</pre>

			<p>MySQL のオプティマイザの仕様変更なのかバグなのか InnoDB 特有の罠なのかはわかりませんが、データベースのチューニングは一筋縄ではいきませんな…。</p>
		</div>
]]></content:encoded>

	<dc:creator>tmtms</dc:creator>
	<dc:date>2009-02-07T19:06:20+09:00</dc:date>
</item>
<item rdf:about="http://d.hatena.ne.jp/tmtms/20090201/1233499176">
	<title>[Ruby][MySQL] MySQL/Ruby 2.8.1</title>
	<link>http://d.hatena.ne.jp/tmtms/20090201/1233499176</link>
	<description> Ruby 1.9.1 がリリースされました。が、MySQL/Ruby は 1.9 に対応してませんでした。気づいてませんでした… orz。 とりあえず、Ruby 1.9.1 でもコンパイルと簡単なテストを通るようにしてみたものを、MySQL/Ruby 2.8.1 としてリリースしました。 ダウンロードはこの辺から</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p><a href="http://www.ruby-lang.org/ja/news/2009/01/30/ruby-1-9-1-released/" target="_blank">Ruby 1.9.1 がリリースされました</a>。が、MySQL/Ruby は 1.9 に対応してませんでした。気づいてませんでした… orz。</p>
			<p>とりあえず、Ruby 1.9.1 でもコンパイルと簡単なテストを通るようにしてみたものを、MySQL/Ruby 2.8.1 としてリリースしました。</p>
			<p>ダウンロードはこの辺から。</p>
			<p><a href="http://rubyforge.org/frs/?group_id=4550" target="_blank">http://rubyforge.org/frs/?group_id=4550</a></p>
			<p>Ruby 1.9 の大きな特徴である M17N についてはまったく対応してません。なので、データベースから取り出した文字列は、全部 ASCII-8BIT になります…と思います…たぶん…。</p>
			<p>Ruby 1.9.1 と MySQL 5.1 のリリースに合わせて、Ruby/MySQL 3.0 をリリースしようとこっそりたくらんでいたのですが、全然間に合ってません… (--;</p>
			<p>予定しているのは MySQL/Ruby ではなく Ruby/MySQL です。ややこしいのですが (^^; MySQL/Ruby は MySQL 付属の libmysqlclient を使用した C 言語で書かれている Ruby の拡張ライブラリですが、Ruby/MySQL はすべて Ruby で記述されたライブラリです。つまりコンパイル不要です。</p>
			<p>C ではなく Ruby で書いてあると速度が心配なのですが、Ruby 1.9 なのでなんとかなるんじゃないかと楽観してます。うまくいったら C版の MySQL/Ruby は 2.8.x で終了です。</p>
			<p>今のところ次のような感じになる予定です。</p>
			<ul>
				<li> Mysql.new の引数に URI 形式 "mysql://user:pass@hostname:port/db" を受け付ける。</li>
				<li> Mysql.new にブロックを渡したら、ブロックから抜ける時に Mysql#close する。</li>
				<li> mysqld の charset と ruby の encoding との間で文字列を自動変換する。</li>
				<li> クエリは基本的にプリペアドステートメント。Mysql#query("select ?,?,?", 1, 2, 3) のような感じで記述できる。</li>
				<li> 結果セットは Enumeratable</li>
				<li> サーバエラーは、エラーの種類毎に独立したクラス（今はすべて Mysql::Error）。</li>
				<li> libmysqlclient を使用しないので、GPL 汚染を気にしなくてよい（たぶん現状でも問題ないはずだけど…）。</li>
				<li> たぶん、たくさんの非互換 (^^;</li>
			</ul>
			<p>Ruby から MySQL を使っている人でも、直接 Mysql クラスを使っている人は少ないと思うので、どう変わろうと興味がない人ばかりかもしれませんけど。</p>
		</div>
]]></content:encoded>

	<dc:creator>tmtms</dc:creator>
	<dc:date>2009-02-01T23:39:36+09:00</dc:date>
</item>
</rdf:RDF>
