memcachedでレアな不具合

memcachedを使っているサービスにて、ある日、データのキャッシュが更新されない現象に遭遇した。キーと値をダンプしてみたところ、タイムスタンプがおかしな値になっていた。
心当たりというと、そういえばサーバの日付がおかしくなっていた日があったような気がする。
memcachedは、利用する際にexpireを指定するのだけど、実装としては無効になるepoch値を保持するようになっている。なので未来の日付でキーが作成されてから時計が戻されると、ずっと無効にならないということのようだった。
更新されていくデータに対してキー名が変わらない、というのは、(発生頻度はともかくとして)こういう気づきにくいバグを生むのでよくない。
きっとベストプラクティス的なものがあるのだと思うが、安直に、キー名にタイムスタンプをつけて解決を図ることにした。すなわち yyyymmddhh_keyname みたいな感じである。これで仮に日付がぶっ飛んでも、おかしくなっていた間に生成されたキーを無視することができる。

ところでPHPにはMemcacheとMemcachedというライブラリがあって、Memcachedの方が新しいのだけど、手軽にキーの一覧を取る方法がなくてデバッグ時に困る。どうしろと...

Quick Fire Rapid 赤軸 届いた


赤軸2枚目。1枚目はCherry純正のG80-3600LYCで、好きなんだけど無駄に大きいのでテンキーレスがほしかった。
FILCOの赤軸テンキーレス(Majestouch Linear R Limited Edition、FKBN91MR)が、この配列いまいちだなあと思っていたら完売してしまい悲しい思いをしていたところ、Cooler Masterからほぼ同じのが出たので購入。スペックはFNキーがある以外はFILCOのとほぼ同じで、FKBN91MRの厨二病エディションといったところ。
CherryのMXスイッチの押し心地は

俗称 個人的感触
黒軸 リニア、重い
茶軸 リニアでない、軽い
赤軸 リニア、軽い

こんな感じなのだが赤軸が一番好み。PC-8001とかPC-9801のキーボードの感触に近いかも。カシャカシャしないけどメカニカルっぽい。へたった5576-002にも近いような気がする。
RealForceと比べると、RealForceはリニアでなくゴムっぽいような気がする。91UDK-Gというのを持っているんだけど45gなので少し重い。きっと30gだとちょうどよさそうなんだけどDRTCKB91UBKは買えないし。
押し心地が非常によいし場所も取らないので、しばらくこれ使う。赤軸最高!

社会人になってから始めるTopCoder

これはCompetitive Programming Advent Calendarの11日目の記事です。
Advent Calendarには入門記事が意外となさそうなのと、自分自身初心者なので、紹介記事を書きます。

きっかけ

今年の4月から競技プログラミングをはじめました。「人材獲得作戦」や「コーディングスキル判定」をやってみたらめちゃくちゃ時間がかかったりして漠然とどうにかしたいなと思っていたところ、Google Code Jam勉強会というのを取引先の人から教えてもらい参加しました。問題が面白いし、あまりにもコードが書けないのでTopCoderに登録してそれ以来はまっています。

TopCoderとは

競技プログラミングは文字通りプログラミング能力を競うものです。TopCoder競技プログラミング環境を提供する会員制サービスで、要は、コーディングの速さと正確さを競うオンラインゲームです。
競技プログラミングサイトはいくつかありますが、以下の理由でTopCoderがお勧めです。

  1. 競技時間が比較的短い
    年をとると集中力が続かないので短いほうが良いです。
  2. 頻繁に開催される
    参加できる日は多いほうが良いです。
  3. 順位づけされる
    個人練習より刺激になります。
  4. 履歴が充実している
    問題の解説や、他の人が書いたコードを読むことができます。
  5. 参加者が多い
    色々な方法で解いている人を見つけることができます。

はじめかた

ユーザ登録して、プラグインをインストールすれば誰でも参加できます。こちらの記事が大変参考になります。

参戦するまでの流れですが

  1. ブラウザにJava Runtime(JRE)をインストールする
  2. http://community.topcoder.com/tc でユーザ登録する (例えば pokutuna氏の解説記事)
  3. 上のメニューの「Algorithm Competitions」からARENAを開いてログインする
  4. プラグインをダウンロードして設定する (こちらを参照)
    必須ではないですがおそらくほとんどの人が入れています
    なおTZTesterについては更新版のほうがお勧め (例えば nitoyon氏のもの)
  5. メニュー「Practice Rooms」から「SRMs」をクリックすると、部屋の一覧が出てくるので、適当な番号のDiv2というやつを選ぶ
  6. まんなかへんの「Coding Phase」の「Select one」の250を選ぶ
  7. 解いてsubmitする
  8. 2〜3問解いてみて感触がつかめたら、本番参戦
  9. 撃沈したら「プログラミングコンテストチャレンジブック」(通称蟻本)を買って読む

こんな感じです。
ちなみに「はてな」には「TopCoder部」というグループがあり、TopCoderの日記はそちらに書いています。

FAQ1 難しそう

Div2のEasyの問題は易しく作られていますので、がんばれば解けるかと思います。そのほかはまあ難しいです。でも楽しいです。
私は適当にぐぐって、当たって砕けろ的なゆるい感じではじめました。事前の準備を真面目に考えると、学ぶことが多すぎて尻込みしてしまうと思います。

FAQ2 英語が読めません

競技プログラミング(主にTopCoder)に参加しない理由」を見ると英語だから敬遠している人も多いようです。私も英文を読むのが得意ではなく、最初の2〜3回は問題文を読むのに10分くらいかかっていました。
これは慣れるしかないのですが、おそらく10回くらい参加するとどういう意図の問題なのかはなんとなくつかめるようになってきます。20回くらい参加しましたが、最近は英文であること自体がボトルネックになることは減ってきました。題意が何かをつかめない問題もあるのですが、たぶん日本語になっていても同じだと思います。
日本語でないといやだという方には、AOJという素晴らしいサイトがあります。

FAQ3 時間帯が合いません

TopCoderが開催されるのは、(1)平日の10:00から(2)深夜の01:00から(3)土曜日、が多いようです。平日の10:00は社会人には難しいと思いますが、プログラマであれば、勉強したいのでと上司にかけあってみるのも手かと思います。もし裁量労働であれば1時間くらい都合をつけるのは可能ではないでしょうか。

FAQ4 競技プログラミングって役に立つの

業務でのコーディングに直結することはあまりないかもしれません。でも楽しいです。
トレードオフを意識してコードを書くという点では業務のコーディングに近い面もあります。
100行くらいのコードで色々な問題が解けるというのが競技プログラミングの素晴らしいところで、エラー処理や保守性というような観点で見るものではありません。1000行の仕様書を読んで10000行のテストコードを書かなければいけないとしたら萎えますし。

FAQ5 学生に勝てません

学生には勝てません。Twitterを眺めていると、最近の学生はよく勉強していて優秀だなあというのがよくわかります。学生の知識の1/100くらいでも吸収できればだいぶ実力がつきます。

FAQ6 レッドコーダーってどのくらいすごいの

TopCoderではレーティング(≒実力)により色分けされていて、赤が最上位です。目安としては、色が一段階違うと、同じ問題を解く速さが2倍くらい違います。色が二段階違うと、質的に難しい問題に取り組んでいます。
私はこの前ようやく青くなりました。まだまだですね。
参考: Petr伝説

プログラミングの楽しみ

もし競技プログラミングが合わない方でも、楽しむのが目的のプログラミングはたくさんあります。

色々チャレンジしてみると楽しいと思います!

CygwinかVMwareか

良い記事

そんな私はPutty + VMware Workstation派。

Cygwinだと困ること

ビルドできないものがあるのと、web開発だと、リリース環境との違いを意識するのが面倒。
ビルド速度については、coLinuxより速いケースもあるし、個人的にはCygwinを導入しない主因ではない。
それよりも色々気をつけないといけないという気がして、安心感がいまいち足りない。
なんだかんだでVMwareは楽。電車の中でもデバッグできるしスナップショットもある。

サスペンドすると接続切れる問題

これは重大。うろ覚えだが、Windows XP + VMware Workstation 5/6のときは、host onlyまたはNATにしていれば、ホストとゲストのSSH接続は切れなかったような記憶がある。
これがWindows 7だと、待機状態から復帰すると全ての接続が切れてしまいげんなりしていた(VMware Workstation 6と8で確認)。
が、試しにVMwareのNATの設定にあるゲストOSへのポートフォワーディングを設定して、そこ(127.0.0.1)へSSHを張ってみたところ、切れないことが判明。すごく快適になった。

PuTTYPoderosaではポートフォワーディングできない

誤解。
むしろ、PuTTYのほうが、ポートフォワーディング先がいくつかあるとき(例えば会社では直接つながるけど、自宅では会社経由でつなぐとか)に、GUIで手軽に選べると思う。
怠惰なのでクリックして選びたい。ユーザ名とかFQDNを入力したくない。

PuTTY 0.61

なんとPuTTYは四年ぶりにバージョンアップしていて、Windows 7のタスクリストに対応している。
これがあると(設定画面を経由せずに)セッションを直接選べる。


Windows Vistaまでは、スタートメニューと同列にフォルダを作成しておいて、セッションのショートカットを置けばよかった。(画像左側)
Windows 7からはこれができないようなのだが、タスクリストに入れると近い感じになった。(画像右側)
スタートメニューにPuttyを表示させておいて、右端の矢印をクリックすると、Recent Sessionsなどが選べる。矢印をクリックしないといけないのがやや面倒ではある。
Recent Sessionsだと順番がばらばらなので選びづらいが、右クリックして「いつも表示」を選べば順番が固定されるのでましになる。

PuTTYの鍵生成の問題

puttygen.exeの問題点は二つ。

  1. 1024bitを指定してもなぜか1023bitになる
  2. AESで暗号化された秘密鍵がインポートできない

なので、以下の手順で鍵を生成するとよい。

  1. Linux上)ssh-keygenにて、パスフレーズなしで秘密鍵を生成する
    コマンドは ssh-keygen -t rsa -b 1024 など
  2. puttygenでそれをインポートする(必要ならパスフレーズを設定する)
  3. Linux上で必要であれば)opensslでパスフレーズつきに変換する
    コマンドは openssl rsa -in in.key -out out.key など

Explorer++ patch for TortoiseSVN

Windows環境をx64に移行したら、TortoiseSVNのオーバーレイアイコンに対応したファイラーが見当たらず、やや不便。
幸いExplorer++というソースが公開されているものがあったので、アイコンを更新するようにしてみた。

diff -Naur org/Explorer++/ShellBrowser/DirectoryModificationHandler.cpp new/Explorer++/ShellBrowser/DirectoryModificationHandler.cpp
--- org/Explorer++/ShellBrowser/DirectoryModificationHandler.cpp	2011-04-23 07:43:20 +0900
+++ new/Explorer++/ShellBrowser/DirectoryModificationHandler.cpp	2011-08-27 02:41:54 +0900
@@ -448,6 +452,10 @@
 			}
 
 			FindClose(hFirstFile);
+
+			if (!bFolder) {
+				RenameItem(iItemInternal, FileName);
+			}
 		}
 		else
 		{


ついでに、ドラッグアンドドロップを禁止してみた。フォルダをクリックしようとして移動してしまうことがあるので。(というかそれを防ぐためにファイラーを使っている)

diff -Naur org/Explorer++/Explorer++/ListViewHandler.cpp new/Explorer++/Explorer++/ListViewHandler.cpp
--- org/Explorer++/Explorer++/ListViewHandler.cpp	2011-08-15 00:19:54 +0900
+++ new/Explorer++/Explorer++/ListViewHandler.cpp	2011-08-27 01:20:05 +0900
@@ -1384,6 +1384,9 @@
 
 HRESULT Explorerplusplus::OnListViewBeginDrag(LPARAM lParam,DragTypes_t DragType)
 {
+#if 1
+	HRESULT hr = DRAGDROP_S_CANCEL;
+#else
 	IDropSource			*pDropSource = NULL;
 	IDragSourceHelper	*pDragSourceHelper = NULL;
 	NMLISTVIEW			*pnmlv = NULL;
@@ -1491,6 +1494,7 @@
 	}
 
 	CoTaskMemFree(pidlDirectory);
+#endif
 
 	return hr;
 }
diff -Naur org/Explorer++/Explorer++/TreeViewHandler.cpp new/Explorer++/Explorer++/TreeViewHandler.cpp
--- org/Explorer++/Explorer++/TreeViewHandler.cpp	2011-04-26 11:51:32 +0900
+++ new/Explorer++/Explorer++/TreeViewHandler.cpp	2011-08-27 01:21:19 +0900
@@ -635,10 +635,12 @@
 		return OnTreeViewKeyDown(lParam);
 		break;
 
+#if 0
 	case TVN_BEGINDRAG:
 		/* Forward the message to the treeview for it to handle. */
 		SendMessage(m_hTreeView,WM_NOTIFY,0,lParam);
 		break;
+#endif
 
 	case TVN_GETDISPINFO:
 		SendMessage(m_hTreeView,WM_NOTIFY,0,lParam);

ThinkPad T420購入

Sandy Bridgeに期待して購入。スペック

  • Core i5 2540M 2.6GHz
  • video 1600x900 Intel HD Graphics 3000
  • memory 8GB (追加)
  • SSD Intel SSDSA2CW300G3 300GB (置換)

エクスペリエンス インデックスは 7.1/7.4/5.9/6.3/7.7

なんかキー入力がひっかかるなあと思っていたら、特定のキーが入力されたりしなかったりするという初期不良だった。サポートに電話したら、代わりのキーボード(部品)を送ってくれて翌日届いた。不良はさておき、部品単位で送ってくれるのは大変ありがたい。
元々の部品はChiconyの45N2172だったが、届いたのはNMBだった。ブログとか見ると評価は ALPS>NMB>Chicony の順らしい。正直違いはわからないが、とりあえずNMBThinkPadらしい打ち心地で、良い。
唯一の問題は、上段のキー配列が変わってしまったので、F2を打とうとするとF1が入ってしまうこと。あとEscキーが無駄にでかい。

T420sではなくT420にしたのは

  • 2.5kgくらいまでなら許容範囲
  • 薄型はファンがうるさいのでは

という理由。T420は常にファンは回ってはいるが、低負荷では無音といっていいレベル。
ここ http://www.lenovo.com/psref/pdf/tabook.pdf 見るとT420はT410より軽いとなっているが、誤記かも。

ホイールスクロールすると少しノイズが出る。グラフィック由来と思われるのでたぶん回避策はないが、ブラウザとかでは出ないので、普段は気づかない。

タスクマネージャーで見たらSynTPEnh.exeとかいうのが150MBくらいメモリを消費していたので、削除してTrackPointのドライバに差し替えてみた。なんかメモリリークで修正済みたいだが、タッチパッドを使うことはないので古きよきt4p*.exeで十分だ。

その他

  • ThinkPadらしさはまだある。
  • 液晶は青いがT400よりはましだと思う。
  • 手持ちのデスクトップマシンよりVMwareが速い。
  • Windows7でも特に問題なかった。