<?xml version="1.0" encoding="utf-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja">
<title>dTblog | デザインとプログラムの境界をさまようブログ</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/" />
<modified>2009-11-30T17:47:10Z</modified>
<tagline>デザインから開発まで色んな局面でWebと関わる人のよもやま話。</tagline>
<id>tag:www.deftrash.com,2009:/blog//3</id>
<generator url="http://www.movabletype.org/" version="4.25">Movable Type</generator>
<copyright>Copyright (c) 2009, deftrash</copyright>

<entry>
<title>MySQLでBLOB/TEXT型カラムにインデックスを張る</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/11/mysql_keylength.html" />
<modified>2009-11-30T17:47:10Z</modified>
<issued>2009-11-30T14:01:29Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.525</id>
<created>2009-11-30T14:01:29Z</created>
<summary type="text/plain">MySQL で新たにテーブルを作ったり、プライマリキー、ユニーク制約、またはインデックスを作成する際、下記のようなエラーが発生することがあります。 ERROR ...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>db</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>MySQL で新たにテーブルを作ったり、プライマリキー、ユニーク制約、またはインデックスを作成する際、下記のようなエラーが発生することがあります。</p>

<pre class="code">
ERROR 1170 (42000): BLOB/TEXT column 'text_field' used in key specification without a key length 
</pre>

<p>結論として回避策から書くと、BLOB型またはTEXT型の場合は、インデックス作成時にキー長を明示してあげる必要があります。</p>

<pre class="code">
create index new_index on table_name(text_field(100));
</pre>

<p>このエラーは、MySQL が BLOB型もしくはTEXT型 （これらに順ずる TINYTEXT型 や LONGTEXT型を含む）のような可変長カラムでは、その先頭から最大255文字分しかインデックスできないという制約から来ているようです。解決策は上記のとおり、キー長を明示するか、変わりに255以下で <var>VARCHAR(100)</var> のようなカラムを使って、そちらをインデックスとして使うといった工夫が考えられます。</p>

<p>考えてみれば当然と言える話ではあります。</p>

<p>題目を索引することはあれど、本文を索引した書籍など見たことがないですし、そこに意味がないことは誰もが分かるでしょう。たとえ本文を索引にするとしても、冒頭の一節というのが関の山。この MySQL の仕様は、理に適っている気がします。逆に本文を索引したい、つまり全文検索用の FULLTEXT インデックスであれば、TEXT型カラムにもちろん作成することができます。</p>

<p>このエラーに遭遇したときは、上記のような解決法もひとつの手ではありますが、そもそも TEXT型カラムを主キーにしたり、インデックスを張ろうという設計が正しいかどうかを考えてみた方が良いでしょう。</p>

<p>例外は、百人一首的に冒頭の一節から引きたいか、50音順インデックスを使うようなケースだけじゃないでしょうか。LIKE 検索で、先頭数文字で引っかけたい場合。それも、通常は最低1000 レコードを超えてこないとインデックスが効いてこなかったりするので、さらにレアケースな気がします。</p>

<p>エラーが起きるとついつい今すぐで回避方法を探してしまいがちですが、そもそもエラーになるような設計が正しいかどうか考えるクセは付けておきたいもんです。結局、そういう考え方が未来の自分を救ったりするんだから。</p>

<p><br />
</p>]]>

</content>
</entry>

<entry>
<title>perl で配列に要素が含まれているか調べる方法</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/10/perl_contains.html" />
<modified>2009-10-03T08:06:03Z</modified>
<issued>2009-10-03T07:50:30Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.524</id>
<created>2009-10-03T07:50:30Z</created>
<summary type="text/plain">ある配列に特定の要素が含まれているかどうか知りたいとき、 java では List#contains が用意されていますが、どうやら perl では標準で用意さ...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>perl</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>ある配列に特定の要素が含まれているかどうか知りたいとき、 java では List#contains が用意されていますが、どうやら perl では標準で用意されていないんですね。ここら辺を自前で書くのが perl 流といったところでしょうか。</p>

<pre class="code">
#!/usr/bin/perl -l
<br />
my @array = qw/a b c d e f g/;
undef %tmp;
for (@array) { $tmp{$_} = 1; }
<br />
print $tmp{"a"} ? 'true' : 'false';
print $tmp{"h"} ? 'true' : 'false';
</pre>

<p><a href="http://www.perl.com/doc/FAQs/FAQ/oldfaq-html/Q5.5.html">数値配列で有無をチェックする場合は、vec を使う方法で軽くできるとのこと。</a></p>]]>

</content>
</entry>

<entry>
<title>perl で mkdir -p</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/09/perl_mkpath.html" />
<modified>2009-09-08T05:01:35Z</modified>
<issued>2009-09-08T04:49:17Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.523</id>
<created>2009-09-08T04:49:17Z</created>
<summary type="text/plain">perl で mkdir -p 同様のことをするには、File::Path の mkpath を使うと良いらしい。 #!/usr/bin/perl -w use...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>perl</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>perl で mkdir -p 同様のことをするには、File::Path の mkpath を使うと良いらしい。</p>

<pre class="code">
#!/usr/bin/perl -w
<br />
use strict;
use warnings;
use File::Path;
<br />
my @dir = mkpath ('/data/test/1/2/3/');
for (@dir) {
    print $_ . "\n";
}
</pre>

<p>実行結果は、作成したディレクトリパスの配列。以下は、/data/test が存在していた場合の結果。</p>

<pre class="code">
/data/test/1
/data/test/1/2
/data/test/1/2/3
</pre>

<p>ラクチンです。危なく自分でループ回すところでした。</p>

<p>なかなか便利なモジュールのノウハウが蓄積されないので、やりたいことがあったら、まずはモジュールを探してみる癖を付けるようにしたいなあ。perl ってサクサク書けるので、ちょっとした処理だったら自前でサブルーチン用意してしまっているんですが、本当はもったいないですよね...。</p>

<p>学習ベースの防備録として今後モジュール関連ネタ、メモしていきます。</p>]]>

</content>
</entry>

<entry>
<title>mysql のスレーブを再構築する</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/08/mysql_slave.html" />
<modified>2009-11-29T08:53:44Z</modified>
<issued>2009-08-15T14:24:17Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.522</id>
<created>2009-08-15T14:24:17Z</created>
<summary type="text/plain">レプリケーションができていないのでログを見てみたら、「Client requested master to start replication from imp...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>db</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>レプリケーションができていないのでログを見てみたら、「Client requested master to start replication from impossible position」というエラーが出力されていた。確かに、「show slave status」で表示されるポジションが、バイナリログ内に見つからない...。</p>

<p>不整合の度合いがハンパないのと、運用から切り離されているサーバだったので、スレーブをゼロから再構築することにした。以下、そのときの手順メモ。</p>

<p>まず、マスターの更新を止めてデータをdumpします。</p>

<pre class="code">
mysql> FLUSH TABLES WITH READ LOCK;
</pre>

<p>スレーブ開始にそなえてポジションを確認。</p>

<pre class="code">
mysql> SHOW MASTER STATUS \G
         File: db01-bin.010
     Position: 5432
 Binlog_Do_DB: db_name
Binlog_Ignore: 
1 row in set (0.00 sec)
</pre>

<p>データをdumpします。</p>

<pre class="code">
$ mysqldump -uroot -hdb01 db_name > /tmp/db_name.dump
</pre>

<p>マスターの更新ロックを解除。</p>

<pre class="code">
mysql> UNLOCK TABLES;
</pre>

<p>マスター側の操作はここまで。続いて、スレーブの再構築の作業に入ります。最初に、これまでのレプリ情報を削除してしまいます。</p>

<pre class="code">
# /etc/rc.d/init.d/mysqld stop
# rm /var/lib/mysql/master.info
# rm /var/lib/mysql/relay-log.info
# /etc/rc.d/init.d/mysqld start
</pre>

<p>データベースをゼロから作るため、今までのデータベースを削除して作り直し。</p>

<pre class="code">
mysql> DROP DATABASE db_name;
mysql> CREATE DATABASE db_name;
</pre>

<p>マスターのdumpデータをリストア。</p>

<pre class="code">
# scp db01:/tmp/db_name.dump /tmp/
# mysql -uroot -hdb01 db_name < /tmp/db_name.dump
</pre>

<p>レプリケーションの設定を最新のものに。ポジションとログファイルは、先ほど「SHOW MASTER STATUS」した結果のものを使用します。</p>

<pre class="code">
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO 
  MASTER_HOST='db01',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='db01-bin.010',
  MASTER_LOG_POS=5432;
</pre>

<p>スレーブを開始します。</p>

<pre class="code">
mysql> START SLAVE;
</pre>

<p>これでレプリケーションが正常に行われるはずです。「SHOW SLAVE STATUS」やログにエラーなど発生していないことを確認しましょう。うまくいかない場合は、しかるべきときに mysqld のプロセスがきちんと停止していなかったとか、dump がうまくいっていなかったとか、そういったところだと思います。手順が少ないので、問題になる場所も限られます。</p>

<p>ここまで書いて気付いたのですが、スレーブが複数ある場合は、何もマスターの更新を止めてやる必要がないですね。そして、もっとシンプルな手順でできそう。</p>

<p>お疲れさまでした。</p>]]>

</content>
</entry>

<entry>
<title>vim で開発するときに知らないと損する小技</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/07/vim_tips.html" />
<modified>2009-07-05T15:52:58Z</modified>
<issued>2009-07-05T14:57:25Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.521</id>
<created>2009-07-05T14:57:25Z</created>
<summary type="text/plain">転職を機に perl を書くようになって以来、vim 一本で開発のすべてを行っています。 かつては、何と java を vi で書いていたこともあったし、運用で...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>linux</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>転職を機に perl を書くようになって以来、vim 一本で開発のすべてを行っています。</p>

<p>かつては、何と java を vi で書いていたこともあったし、運用でしばしば vi を使う機会があったので、基本的な操作は身に付いていたんですが、本格的に vi を使うようになって色々と便利な技があることを知ったのでシェアメモ。</p>

<p>まずは、文字コード変換。</p>

<pre class="code">
:e ++enc=shift_jis
:e ++enc=iso-2022-jp
:e ++enc=euc_jp
</pre>

<p>これができないと、そもそも vim 一本で開発することができないという話。テンプレ編集やメール系の開発するときに便利すぐる。</p>

<p>続いて画面分割</p>

<pre class="code">
:sp
</pre>

<p>これで画面が上下に分割して編集できます。画面を切り替える場合は、Ctrl+w を2回。プログラムを書いていて、「あ、これって他はどうしてるんだっけ？」と思って一時的に参照したい場合に便利です。</p>

<p>現在カーソルのある画面を閉じる場合は、</p>

<pre class="code">
:close
</pre>

<p>現在カーソルのある画面以外をすべて閉じて、通常モードに戻す場合は、</p>

<pre class="code">
:only
</pre>

<p>diff のように行単位で違いを眺めながら編集したい場合は、</p>

<pre class="code">
Ctrl+w → v
</pre>

<p>これで垂直分割になります。純粋に 2ファイルの diff を見るのならば、vimdiff で OK なんですが。</p>

<p>分割したそれぞれの画面で別のファイルを表示するには、その画面に切り替えて、</p>

<pre class="code">
:e ファイル名
</pre>

<p>これで、新しいファイルの編集モードに入れます。</p>

<p>ファイルを開くという意味では、編集中のファイルにあるパスにカーソルを合わせて</p>

<pre class="code">
gf
</pre>

<p>これで、そのパスにあるファイルを開くことができます。これ、ヤバイです。芋づる式にプログラムを編集できます。grep 結果をファイルにリダイレクトしておいて、あとで開いて順番に見ていきながら編集する場合に重宝しました。</p>

<p><br />
画面分割は、「screen 使えば良いんじゃないの？」という話もありますが、ちょっとした比較には vim の画面分割はダントツに力を発揮します。特に、ノートPCやサーバのコンソールのように、小さい画面で頑張らないといけない時なんかは、知っていると知らないとでは作業効率に雲泥の差が出ますよ、ホントに。</p>

<p>ということで便利技をいくつか書いてきましたが、要するに「java × eclipse の開発は便利で良かったなぁ」ということです。 vim でどんなに頑張っても、さすがにアレにはかなわないですね。<br />
</p>]]>

</content>
</entry>

<entry>
<title>MySQLのレプリ遅延の原因を調べる方法 </title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/06/mysql_repli.html" />
<modified>2009-06-07T19:34:54Z</modified>
<issued>2009-06-07T18:57:53Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.520</id>
<created>2009-06-07T18:57:53Z</created>
<summary type="text/plain">MySQLのレプリ遅延の原因には、大きく分けて、転送遅延とSQL実行遅延の2つがあります。 転送遅延は、マスタでバイナリログに出力されたSQLクエリが、スレーブ...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>db</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>MySQLのレプリ遅延の原因には、大きく分けて、転送遅延とSQL実行遅延の2つがあります。</p>

<p>転送遅延は、マスタでバイナリログに出力されたSQLクエリが、スレーブのリレーログに出力されていないケース。SQL実行遅延は、SQLクエリがリレーログに出力されたが、実行が遅れているケース。レプリ遅延時の問題の切り分けとして、まずどちらのケースに該当しているかを判断する必要があります。</p>

<h3>転送遅延の判定方法</h3>

<p>マスタでの SHOW MASTER STATUS の結果と、対象スレーブでの SHOW SLAVE STATUS の結果を比較します。比較する項目は、以下のとおり。</p>

<table class="basic">
<col span="2" width="120" />
<thead>
<tr><th>比較元(MASTER)</th><th>比較先(SLAVE)</th><th>説明</th></tr>
</thead>
<tbody>
<tr><td>File</td><td>Master_Log_File</td><td>読取対象のバイナリログファイルの比較</td></tr>
<tr><td>Position</td><td>Read_Master_Log_Pos</td><td>読取完了した位置の比較</td></tr>
</tbody>
</table>

<p>この2項目で差がある場合、転送遅延が起こっている。マスタとスレーブのサーバ間に何らかの問題が起こっていると考えられるので、その線で本質的な問題を追っていくことになります。</p>

<h3>SQL実行遅延の判定方法</h3>

<p>転送に遅延がなかった場合、こちらの調査に移ります。</p>

<p>対象スレーブでの SHOW SLAVE STATUS から、次の項目同士を比較して判断します。</p>

<table class="basic">
<col span="2" width="120" />
<thead>
<tr><th>比較元</th><th>比較先</th><th>説明</th></tr>
</thead>
<tbody>
<tr><td>Master_Log_File</td><td>Relay_Master_Log_File</td><td>SQLスレッドが最後に実行したバイナリログ</td></tr>
<tr><td>Read_Master_Log_Pos</td><td>Exec_Master_Log_Pos</td><td>読取完了と実行完了の位置比較</td></tr>
</tbody>
</table>

<p>スレーブ側における、I/OスレッドとSQLスレッドの処理差から、つまりSQLの実行処理がどのくらい遅れているのかを調べることができます。SQL実行遅延の場合、スレーブの負荷が何らかの理由で高まっているケースなどが考えられます。マスタに比べてスレーブサーバの処理性能が劣るような場合、更新クエリが詰まることも考えられます。結構、厄介な話。</p>

<p>SQL実行遅延の場合、ほっときゃ直るケースも多かったりするのですが、転送遅延の場合は抜本的な対策が求められることが多いような気がします。両者とも各環境に応じたノウハウの積み上げから、最終判断をする必要はありますが。</p>

<p>ちなみに、そもそもの話として、レプリ遅延を監視するには、SHOW SLAVE STATUS のSeconds_Behind_Master という項目を見る方法が手っ取りばやいです。ただ、MySQL4.1.1以降から対応らしいので、MySQL4.0系では、<a href="http://d.hatena.ne.jp/ringmaster/20080411/1207908692">こちらで紹介されているような方法</a>は良いですね。</p>

<p>SHOW MASTER STATUS 、SHOW SLAVE STATUS で見られる項目の説明については、<a href="http://dev.mysql.com/doc/refman/4.1/ja/show-slave-status.html">本家</a>が一番わかりやすいと思います。</p>

<p>良いレプリ運用ライフを！<br />
</p>]]>

</content>
</entry>

<entry>
<title>iモード2.0に見るドコモ様の不敵な態度</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/05/i20.html" />
<modified>2009-05-25T17:10:39Z</modified>
<issued>2009-05-25T15:45:12Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.518</id>
<created>2009-05-25T15:45:12Z</created>
<summary type="text/plain">cookie や javascript  に対応したことで話題の iモードブラウザ2.0 ですが、一方で搭載機種が次々に発売停止や発売延期になっているようです。...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>mobile</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>cookie や javascript  に対応したことで話題の iモードブラウザ2.0 ですが、一方で搭載機種が次々に発売停止や発売延期になっているようです。</p>

<p><a href="http://www.nttdocomo.co.jp/info/notice/page/090522_01_m.html">「docomo PRIME series N-06A」の一時販売停止及び「docomo STYLE series N-08A」の販売延期のお知らせ</a><br />
<a href="http://www.nttdocomo.co.jp/info/notice/page/090525_01_m.html">「docomo PRIME series P-07A」の一時販売停止のお知らせ</a></p>

<p>伝え聞いたところでは、月末発売予定だった SH-06A と F-09A も販売延期になる模様。</p>

<p>発売日に販売停止という異例の事態が、さらにここまで拡大してくると、「あいかわらずＮ社のデスマ品質はハンパねぇなあー」とか、笑えなくなってくる。SH あたりが本当に販売延期となると、いよいよドコモ側の仕様の問題という見方が強まるんじゃないでしょうか。いずれの機種でも、同じ脆弱性が見つかっていると聞きますし。</p>

<p>そもそもこの問題自体、発売後にコンテンツプロバイダーからの脆弱性の指摘を受けて発覚したもの。（実際、ユーザーからの問い合わせなどは今のところなし）にもかかわらず、ドコモからコンテンツプロバイダー側に一切の説明はなし。いくつかの公式サイトに聞いたところでは、詳細情報は下りてきていないそう。</p>

<p>ドコモ様の不敵っぷりは、相変わらずです。</p>

<p>正直これだけのバージョンアップなので、今回問題となっている脆弱性だけで終わるとは思えず、今後ひきつづき見つかっていくでしょう。そこを共に乗り越えていくべきコンテンツ・プロバイダーとの距離感は、iモード2.0 普及の必要条件だと思うんですが。</p>

<p>機能的には可能性があると思っている iモード2.0 なので、ぜひキャリアとコンテンツプロバイダーが連携しながら、迅速な普及を行っていって欲しいですね。</p>]]>

</content>
</entry>

<entry>
<title>iモードブラウザ2.0の衝撃</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/05/imode20.html" />
<modified>2009-05-25T17:11:26Z</modified>
<issued>2009-05-24T14:37:39Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.517</id>
<created>2009-05-24T14:37:39Z</created>
<summary type="text/plain">docomoより、かねて噂になっていた iモードブラウザ2.0 の仕様が発表されました。 iPhone や BlackBerry 、そして Android 携帯...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>mobile</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>docomoより、かねて噂になっていた <em>iモードブラウザ2.0</em> の仕様が発表されました。</p>

<p>iPhone や BlackBerry 、そして Android 携帯といったスマートフォン群の躍進を、iモードも黙って見ているわけはなかった。スマートフォン・ブラウザに対抗すべく、かゆいところに手が届く機能性を備えた、エポック・メイキングなアップデート。コンテンツ・プロバイダーへの衝撃は大きいですね。</p>

<p><a href="http://www.nttdocomo.co.jp/service/imode/make/content/browser/browser2/new_function/index.html">作ろうiモード：iモードブラウザ2.0新機能一覧</a></p>

<p>新機能の詳細は、上記のドコモ公式サイトをご覧いただくとして、いくつか重要な機能をピックアップしていきます。</p>

<h3>FLVとWMA 動画対応</h3>

<p>Flash Video と Windows Media ファイルに対応。FLVのプログレッシブダウンロード、WMのストリーミング配信で最大10MBまで再生可能。これまで工夫をこらした配信で盛り上がってきた携帯動画の世界も、これで一気に敷居が低くなって裾野が広がりそう。</p>

<h3>Ajax 対応</h3>

<p>JavaScript に対応というのが機能の本質。しかし、XMLHttpRequest も使用可能で、広がりは無限大の機能拡張のため、あえて「Ajax 対応」と銘打ちました。</p>

<p>実際にどのくらい従来の Javascript と互換性があるかまでは未検証ですが、ECMA-262 3rd に準拠しているなら、prototype や jquery といったライブラリも、そのまま使えるかもしれません。（ブラウザキャッシュが500KBまでなので、必要部分のみに圧縮する必要はありそう）</p>

<h3>Cookie 対応</h3>

<p>これが一番びっくりした新機能。</p>

<p><a href="http://www.ietf.org/rfc/rfc2965.txt">RFC 2965</a> 準拠の最小実装で、PCブラウザよりも制限は厳しめですが、セッション管理などを行うなら十分な仕様を満たしています。そう、ついにクッキーを使ったセッション管理ができる！</p>

<p>アクセス解析、視聴率測定、行動ターゲティングなど、幅広い展開が期待できるところ。</p>

<p>今回の対応で、ようやくdocomoでもリファラーの取得ができるようになったことを踏まえ、このあたりは非常に活発化するんじゃないでしょうか。正確な解析ができるようになって ROI を明確にできるようになれば、不況で伸び悩んでいると言われるアフィリエイト、純広枠への出稿の増加や、SEO / SEM への投資を誘導できるかも。モバイル市場拡大につながる可能性から、この cookie 対応には驚かせられました。エポック・メイキング。</p>

<p><br />
さて、今後おそらく他社のブラウザもこの機能性に追従し、上回ってくることを考えれば、PCウェブと携帯ウェブの垣根がほとんど無くなる瞬間というのも、そう遠い未来の話ではなくなるのかもしれないなーと感じています。もちろんその間には、先に挙げたスマートフォンとの競争もあるし、コンテンツプロバイダーの盛衰もあって、にわかには想像しがたい話ですが、「iモード、次の10年」という括りでは夢物語ではないはず。そうなったとき、果たして強いのはPCポータル群か、モバイルコンテンツプロバイダーか、それとも。</p>

<p>一方、現在に目を移せば、これだけの機能追加が、果たして市場にスムーズに浸透するのかという懸念がありますね。iモードブラウザ1.0 をバージョンアップできるわけではない以上、2.0 対応にどれだけのコストを割いていくかの判断を、コンテンツプロバイダーは迫られるわけで。</p>

<p>そんな折に、こんなニュース。</p>

<p><a href="http://www.nttdocomo.co.jp/info/notice/page/090522_01_m.html">「docomo PRIME series N-06A」の一時販売停止及び「docomo STYLE series N-08A」の販売延期のお知らせ </a></p>

<p>ブラウザに脆弱性があったということらしいですが、Javascript と cookie に対応したら、そういったセキュリティ面での問題がナーバスでしょう。セキュリティ対応という、コンテンツプロバイダーに求められる技術レベルが高くなれば、それも 2.0 対応コンテンツ普及への足かせとなりうるわけです。この販売停止騒動で、衝撃をくらったコンテンツプロバイダーも多かったんじゃないでしょうか？</p>

<p><br />
だらだら書いてきましたが、Android 携帯をふくめ、今年夏以降のモバイル市場の変化には敏感でありたいですね。面白くなりそうです。（その前に、某バンクが夏を超えられるかという噂も聞きますが...）</p>]]>

</content>
</entry>

<entry>
<title>perl でビット演算の結果を数値比較する際の注意点</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/05/perl.html" />
<modified>2009-05-13T16:45:59Z</modified>
<issued>2009-05-13T16:07:14Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.516</id>
<created>2009-05-13T16:07:14Z</created>
<summary type="text/plain">ハマったのでメモ。 perl で、ビット演算の計算結果と数値を比較する判定文を書いたら、これがうまくいかない。書いたのは、次のようなコード。 if ($var ...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>perl</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>ハマったのでメモ。</p>

<p>perl で、ビット演算の計算結果と数値を比較する判定文を書いたら、これがうまくいかない。書いたのは、次のようなコード。</p>

<pre class="code">
if ($var & 1 == 0) {
	print $var;
}
</pre>

<p>$var の値が 1 だろうが 0 だろうが、とにかく結果は 0 となって $var が出力されない。これだけシンプルだと逆に原因が特定できずに困る。</p>

<p>答えは、<a href="http://perldoc.jp/docs/perl/5.8.8/perlop.pod">「Perl の演算子と優先順位」</a>にありました。要するに、比較演算子の方が、ビット演算子より先に評価されたため、常に演算結果が 0 となっていたのでした。これは盲点。</p>

<p>ということで、以下のように修正して解決。</p>

<pre class="code">
if (($var & 1) == 0) {
	print $var;
}
</pre>

<p>このことは、特段 perl に限った話ではなくて、php でも同様だったし、java にいたってはコンパイルエラーになってしまった。（eclipse では、エラーに対して、親切に「小括弧内にビット演算命令を入れます」というヒントまで出てきた）</p>

<p>ビット演算は便利なのでよく使ってしまうんですが、評価順を意識しておかないと、思わぬバグが出てしまうことになるので、要注意ですね。<br />
</p>]]>

</content>
</entry>

<entry>
<title>movable type 4.2 にしました</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/05/movable_type_42.html" />
<modified>2009-05-12T17:31:06Z</modified>
<issued>2009-05-12T16:51:22Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.515</id>
<created>2009-05-12T16:51:22Z</created>
<summary type="text/plain">ブログを再構築しました。 2年以上、特にブログそのものに手をつけることなく、エントリばかり書いてきたのだけど、さすがに退屈になってきた。デザインも変えたいし、ス...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>software</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>ブログを再構築しました。</p>

<p>2年以上、特にブログそのものに手をつけることなく、エントリばかり書いてきたのだけど、さすがに退屈になってきた。デザインも変えたいし、スパム対策もしたいし、機能性も上げたいし、ということで<br />
思い切って大幅変更しました。</p>

<h3>movable type</h3>

<p>movable type のバージョンを、3.2 から 4.2 にアップグレードしました。<a href="http://www.movabletype.jp/documentation/upgrade/mt3_to_mt4.html">本家の記事「Movable Type 3.x から Movable Type 4 へのアップグレード 」</a>にしたがって進めて、特にはまるところもなく移行は終了。</p>

<p>ただ、そのまま移行してしまったので、テンプレート構成はMT3のときのまま。MT4らしくモジュールテンプレートをうまく使えば、カスタマイズ性が高まるのだろうけど、それは今後の課題。</p>

<h3>MySQL</h3>

<p>せっかく movable type をごっそり変えるので、合わせて MySQL も 4.0 から 5.2 にバージョンアップしました。主に性能面での改善を期待して。</p>

<p>が、しかし。</p>

<p>データの移行時に文字化けして、大ハマリしました。文字コードの関係で、単純に mysqldump した結果をリストアするのではいけないらしい。MySQL5 側の文字コードを latin1 に対応するように設定を変えて、なんとか乗り切った。ううう。</p>

<p>ちなみに本題の性能面については、ちょっとスピードアップした気がするけど、MT4 になった影響のような気もするので、まだまだ様子見。</p>

<h3>デザイン変更</h3>

<p>横幅をトータル 1000px にしました。</p>

<p>が、普段ビジネスで使用しているノート(1024×768)で見たら横スクロールが出て見づらかったので、実質 960px までスリム化しました。制作で使っている Macbook Pro だと、横が1920px もあるので感覚にぶる。危険きわまりない。今後、気をつけよう。</p>

<h3>はてなブックマーク</h3>

<p>はてなブックマーク API を使って、注目エントリーと人気エントリーをフッターに出力するようにしました。あと、各記事にブックマークしていただいたユーザ数と、ブックマーク用のアイコンも追加しました。自分もはてなユーザーで、他の人のブログで同様の機能があって便利だなーと感じていたので、そのまま自分も実装しました。</p>

<p>最近、また perl をちょいちょい書き始めたので、はてな API を使った遊びは、これからもやったりやらなかったりするかも。</p>

<h3>広告効果検証</h3>

<p>広告スペースを増やしたので、ウザイと思いますが、広告タイプごとの CTR などの数字をとりたかったのでお許しを。</p>

<p>今後、Adsense 以外の広告も掲載するかもしれません。すんません。「俺はRSSで読んでるから、別に...」という方も、そのうちRSS広告を差し込むかもしれないので、ごめんなさい。興味があるときは、クリックしてください。</p>

<p><br />
とまあ、大幅リニューアルとなりました。</p>

<p>週末に一気にやったんですが、まだ設定が完了していないところや、移行ミスしていて、みっともないところもあるかもしれません。その際は、ちょっと我慢してください。早々に片付けますので。</p>

<p>そんなわけで、引き続き deftrash をよろしくおねがいいたします。</p>]]>

</content>
</entry>

<entry>
<title>転職しました</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/04/post_34.html" />
<modified>2009-04-27T01:39:21Z</modified>
<issued>2009-04-26T16:04:48Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.509</id>
<created>2009-04-26T16:04:48Z</created>
<summary type="text/plain">だいぶ事後報告になりますが、前職を2月末で辞めて、3月から新しい会社に勤務しています。 受託開発のアーキテクトやプロマネ、コンサルといったところから、モバイルサ...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>misc.</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>だいぶ事後報告になりますが、前職を2月末で辞めて、3月から新しい会社に勤務しています。</p>

<p>受託開発のアーキテクトやプロマネ、コンサルといったところから、モバイルサービス系エンジニアにシフトです。畑違いも良いところで、今まで蓄積してきたノウハウが活用できなさすぎワロタ状態。ノウハウの持ち腐れはもったいないのと、自分の備忘録として、前職で会得したワザは、テキトーにここに投下していこうと思います。</p>

<p>エンジニアではあるわけですが、新しいビジネスのスキームを生み出し、利益を創出すべく動いていこうと思っています。技術バカに陥らないように。</p>]]>

</content>
</entry>

<entry>
<title>coLinuxで複数環境を作る</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/04/colinux_tap.html" />
<modified>2009-05-10T02:28:56Z</modified>
<issued>2009-04-19T14:48:26Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.508</id>
<created>2009-04-19T14:48:26Z</created>
<summary type="text/plain">自宅の開発環境の見直しをしていたのだけど、ようやくそれっぽくなってきた。 これまでは自作マシンをメインに、サーバとストレージという個人環境としては大げさな構成だ...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>software</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>自宅の開発環境の見直しをしていたのだけど、ようやくそれっぽくなってきた。</p>

<p>これまでは自作マシンをメインに、サーバとストレージという個人環境としては大げさな構成だった。新環境は、Macbook Pro が1台。色校用に外付けモニターは用意しているけど、基本はこの1台で、デザインもプログラムも資料作成も全部できるって算段です。すっごいシンプル。</p>

<p>Macbook Pro に Bootcamp で Windows を動かして、そこに coLinux をいくつか入れて開発用サーバに使っています。何か間違っている気がするけど、結構イケてます、マジで。VMWareより格段に快適です。</p>

<p>で、coLinux で複数の環境を用意する際のネットワーク設定にハマったので備忘録。</p>]]>
<![CDATA[<p>基本的なインストール方法については、こちらを参考にしました。ありがとうございます。</p>

<p><a href="http://d.hatena.ne.jp/bufferings/archive?word=%2a%5bcoLinux%2bCentOS%5d"> [coLinux+CentOS]記事一覧 - bufferings</a><br />
<a href="http://d.hatena.ne.jp/TrinityT/20080318/1205779397">coLinuxでCentOS5.1を複数環境にしてみる</a></p>

<p>今回は、次のような環境を目指しました。</p>

<p><img alt="colinux-network.png" src="http://www.deftrash.com/blog/archives/contents/colinux-network.png" width="500" height="240" alt="ネットワーク図" border="0" /></p>

<p>coLinux 群たちがいるのが、192.168.50.0/24 で、元々のネットワークとは異なるネットワークにしたいという点が、他サイトのサンプルとちょっと違うところ。今後の拡張性を考えて、分けておこうかと。</p>

<p>元の接続を共有すると、ネットワークブリッジのIPが 192.168.0.1 になってしまうので戸惑いますが、強引に好きな値に書き換えて大丈夫。ここでは、192.168.50.0/24 帯ネットワークのゲートウェイ役になってほしいので、192.168.50.1 に設定。</p>

<p><img alt="colinux-network2.png" src="http://www.deftrash.com/blog/archives/contents/colinux-network2.png" width="469" height="422" /></p>

<p>あとは、それぞれの coLinux の NIC の設定を、例えば次のようにすればOK。(CentOSの場合)</p>

<pre class="code">
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
DEVICE=eth0
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=192.168.50.101
BOOTPROTO=static
GATEWAY=192.168.50.1
</pre>

<p>これで、network を再起動すれば、お望みどおりに動作します。</p>

<p>最初ネットワークブリッジの考え方が分からずに、それぞれの coLinux に紐づく Win-TAP に　IP を割り振ったり、ネットワークブリッジに、192.168.0.1 を割り当てて、 coLinux からインターネットに接続できずに泣きそうになりました。仮想ってことで考えすぎました。</p>

<p>うーん、ネットワークは弱いな。そのうちテコ入れしよう。</p>]]>
</content>
</entry>

<entry>
<title>MySQLで実行中のSQLをキャンセルする</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/04/mysql_kill.html" />
<modified>2009-07-05T15:56:21Z</modified>
<issued>2009-04-12T14:23:37Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.507</id>
<created>2009-04-12T14:23:37Z</created>
<summary type="text/plain">誤って、巨大なテーブルの全レコードを対象にするようなクエリを投げてしまって、いつまで経っても計算結果が返ってこないことってあるじゃないですか。そんなときの話。 ...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>db</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>誤って、巨大なテーブルの全レコードを対象にするようなクエリを投げてしまって、いつまで経っても計算結果が返ってこないことってあるじゃないですか。そんなときの話。</p>

<pre class="code">
mysql> show processlist;
+----+------+---------------+------+---------+------+-------+------------------+
| Id | User | Host          | db   | Command | Time | State | Info             |
+----+------+---------------+------+---------+------+-------+------------------+
|  9 | root | localhost     | NULL | Query   |    0 | NULL  | show processlist |
| 10 | root | localhost     | NULL | Sleep   |    1 |       | NULL             |
+----+------+---------------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)
</pre>

<p>processlist では、現在実行中のスレッドを一覧表示することができる。1列目の Id はスレッドID。時間のかかっているSQLがあれば、Info にそのクエリが表示されるはずなので、その Id を調べて Kill すれば、スレッドを強制終了することができる。</p>

<pre class="code">
mysql> kill 10;
</pre>

<p>ターミナルコンソールから Ctrl+C でキャンセルしたつもりになっていたのに、ロードアベレージがぐんぐん伸びていって焦って、ようやくこの方法を知ることになったのは、ここだけの秘密。</p>

<p>ほら、PostgreSQL だと Ctrl+C でクエリはキャンセルできるし、接続はプロセスで見れるから、mysql ビギナーの自分はこの挙動に驚きました、という話です。メモメモ。</p>]]>

</content>
</entry>

<entry>
<title>javascriptで簡単に経過ミリ秒を取得する方法</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/02/javascript_date_milli.html" />
<modified>2009-07-05T16:00:28Z</modified>
<issued>2009-02-26T03:32:30Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.506</id>
<created>2009-02-26T03:32:30Z</created>
<summary type="text/plain">javascript で日付をミリ秒に変換したい場合、 var date = new Date(); alert(date.getTime()); // 123...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>javascript</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>javascript で日付をミリ秒に変換したい場合、</p>

<pre class="code">
var date = new Date();
alert(date.getTime());
// 1235619446796
</pre>

<p>とするのが一般的だと思うのだけど、jquery を見ていたら、すっごいシンプルなやり方が書いてあった。</p>

<pre class="code">
alert(+new Date());
// 1235619446796
</pre>

<p>日付インスタンスの頭に「+」を付けるだけ！日付オブジェクトは、四則演算するときに自動的にミリ秒変換して数値として計算するようだ。なるほど、うまいところを突いたなあ。さっすが jquery だ。</p>

<p>ちなみに「+」を取ると、単に Date#toString() の結果が出力されます。</p>

<pre class="code">
alert(new Date());
// Thu Feb 26 12:38:04 UTC+0900 2009
</pre>

<p>でも、こうして書いてよくよく考えると、getTime() でも、そんなに面倒じゃない気がしてきた。すごく面倒くさがり屋さんにはオススメです！</p>]]>

</content>
</entry>

<entry>
<title>IFRAME では src 属性を必ず指定した方が良いわけ</title>
<link rel="alternate" type="text/html" href="http://www.deftrash.com/blog/archives/2009/02/iframe_src_1.html" />
<modified>2009-07-05T15:59:35Z</modified>
<issued>2009-02-03T13:11:35Z</issued>
<id>tag:www.deftrash.com,2009:/blog//3.505</id>
<created>2009-02-03T13:11:35Z</created>
<summary type="text/plain">SSL環境で、IFRAME の src 属性に値がない場合、IE6 では下記の警告メッセージが表示されてしまう。なんか、このメッセージには以前も困らされた気がす...</summary>
<author>
<name>deftrash</name>
<url>http://www.deftrash.com/</url>
<email>dtadmin@deftrash.com</email>
</author>
<dc:subject>html / css</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://www.deftrash.com/blog/">
<![CDATA[<p>SSL環境で、IFRAME の src 属性に値がない場合、IE6 では下記の警告メッセージが表示されてしまう。なんか、このメッセージには以前も困らされた気がするなあ。</p>

<p>このページにはセキュリティで保護されている項目と保護されていない項目が含まれています。保護されていない項目を表示しますか？</p>

<p>...と言われましても、保護されていない項目を埋め込んだ記憶が無いのですが。</p>

<p><a href="http://support.microsoft.com/kb/261188/ja">解決策は、本丸に書いてありました。</a></p>

<pre class="code">
&lt;!-- iframe id="layer"&gt;&lt;/iframe --&gt;
&lt;iframe src="/?scid=dummy.htm" id="layer"&gt;&lt;/iframe&gt;
</pre>

<p>何でも良いから、src を書いておけば大丈夫なようです。そもそもこの施策だって、IEのバグに対応するために...ごにょごにょ。</p>

<p>それにしても、自分は初めて遭遇したんだけれども、本丸にあるってことは結構有名な問題なんだろうか。助かりました。</p>]]>

</content>
</entry>

</feed>