ATOKをやめてSKKを使いはじめた
ATOKをMacを使いはじめてからずっと使っているので、そこそこ長い付き合いではあるけれど、 和英混在入力の使い勝手が悪く、いつも混在入力をするときに、ATOK自体のON/OFFをして対応してしまっていた。
この使い方は注意しないと、変な文節を学習させてしまうことになる。
例えば、
nodeよりperlが好き。
のような文章で、英語の部分ではATOKをOFFにするような入力をしていると、 「が好き」という文章をATOKに教えこませてしまう。このような意図しない学習結果が積みかさなると、普通の文章の変換も苦になるほどATOKの調子が悪くなってしまう。
そのような状態になるたびに、辞書をクリアしたり、 そもそもこのようなことを避けるために、「が」で一旦確定させるクセをつけるなどして、対応してきたが、そんなことを考えながら文章かくのであれば、もっとシンプルな、SKKのような入力方法にしちゃえばいいのではないかなーということで、とりあえず試してみることにした。
SKK入門
最初のとっかかりは、Emacsのddskkというのについてくるチュートリアルが良い、とのことなので、まずMacシステムの入力メソッドはそのままにEmacs内だけでSKKを試してみる。
それを一通り終えて、SKKの使い方が分かったところで、Mac全体でもSKKが使えるようにAquaSKKをインストール。
試してみたところEmacs内でもAquaSKKが使えるっぽいので、ddskkは別に使わなくてもいいかなーという感じで、チュートリアルそうそう、ddskkは使わなくなってしまった。 AquaSKKは、Enterで改行しない、というデフォルトで有効になっている余計なオプションを外してしまえば、あとは大体ddskkと同じような使い勝手のようだ。(SKKに詳しい人から見るといろいろ違うのかもしれないが)
入力方法自体はいたってシンプルで、すぐに覚えられる。 「困った」みたいのの変換が、まだちょっと考えないと入力できないが、まぁすぐに慣れるだろう。
しかしそれ以外にもいろいろ問題があった。
問題1. C-j がつらい
SKKは C-j
を変換確定やら日本語モードへの移行やらに使用する、言ってしまえば、SKKのメインキーである。
しかし僕はこれを改行とか、elispの評価とかに使用するのが手に染みついてしまっていて、このキーをSKKで使用するのは苦痛を伴なう。
この際だし、矯正してしまってもいいかなーともおもってしばらくがんばったが、どうにもだめなので、SKKの該当キーを C-o
に変更した。
AquaSKKのキー設定を変更するには、/Library/Input Methods/AquaSKK.app/Contents/Resources/keymap.conf
を /Users/typester/Library/Application Support/AquaSKK/keymap.conf
にコピーして、その中の、SKK_JMODE
というところを
SKK_JMODE ctrl::o
みたいな感じに修正すれば良い。
問題2. ターミナルで入力できない
入力できない、というか C-o
が効かない。ので日本語に復帰できない。(C-j
に戻してもだめだった)
uim-fep
いれろ、みたいのを見て、ウンザリしつつもインストールしたが、しばらく使っていると高確率でSEGVするのでまともに使えなかったためさらにウンザリ。
これはMacだけの現象かなーと思ってLinuxで試してみると、Linuxではうまく動いた。
ただ、日常的にターミナルで日本語入力をする場面を考えてみると、IRCをするirssiだけ。 しかも、irssiを動かしているサーバーはLinuxなので、そこにuim-fepをいれてしのぐことにした。
uim-skk でも、以下のような設定で AquaSKK と同じように C-j
を C-o
に置きかえた。
# ~/.uim
(define-key skk-on-key? '("<Control>o"))
(define-key skk-commit-key? '("<Control>o"))
(define-key skk-state-direct-no-preedit-nop-key? '("<Control>o"))
ユーザー辞書をDropboxかなにかで同期できたらいいなーとおもったが、 AquaSKKのユーザー辞書は utf-8、uim-skk のそれは euc-jp と、文字コードが違い、しかもそれを変更する方法がわからなかったので、とりあえず別々の学習になってしまってもいいか〜ってなってる。
問題3. ひらかなの小文字入力
いままでずっと「la」で「ぁ」というように l
キーで小文字入力していたが、SKKではこのキーは英字入力への切り替えキーなので使うことができない。 これもキー設定をかえてもよかったが、ここは x
を使うように矯正する方向でがんばる。
使用感
送り仮名を意識しないといけなかったり、その送り仮名が「っ」だったりするときの入力はまだまだ慣れなくて難しい。 慣れてもイメージとして、ATOKほど高速に日本語入力ができる感じはない。ATOKはやっぱり賢いのでガーーっと長文を一気に入力して一発変換という使い方をしても精度が高く、日本語だけを入力する分にはやはり最高の入力メソッドであると思う。
SKKのいいところは仕組みがシンプルなことと、実装がいっぱいあってどこでも動くところかな。
シンプルなので自分でコントロールできると思う。ATOKは学習がおかしくなってしまったらもう途方にくれるしかなかった。実装がいっぱいあるのも、AquaSKKがなくなってもEmacsがあれば大丈夫、みたいな安心感はある。
入力速度に関しては、Shiftキーを非常に多用するので、親指Shiftとかを導入したらもう少し高速に入力できるようになるのだろうかなー。
Redis布教活動報告 ISUCON 編
最近 Test::RedisServer
とかもろもろつくっててばれてるかもしれませんが、だいぶ Redis 期にありまして、最近の趣味は?っていう問いにはだいたいRedisのソースを読むことですってなくらいなのですが、 memcached とかシンプルな KVS と比べるとだいぶ機能が豊富なので使い方を迷ったりとかそういう事例もあり、周りにもう少し使える人を増やさなければ僕の書いたコードが属人化しててつらい感じになるなーっていうわけで、 布教活動をおこなっておりまして、その一環として ISUCON2 に参加してきましたのでその報告です。
前回の優勝チームに混ぜてもらった感じでだいぶついてる感じもしますが、見事連覇を果たせ、懇親会でも redis redis と連呼してきたのでだいぶ興味持った方も多いのではないでしょうか!
そんな布教活動視点から ISUCON を振り返ってみたいと思います。
Redis がつかえるかどうか
開始直後はチーム間でのコンフリクトをさけるために git push
で rev サーバーに反映ってのだけは設定しましたが、そのあとはすぐボトルネックそうなところで Redis に置き換えられる物はないか探していました。
すぐに購入トランザクションが見つかります。Redis には Set 型という集合を表す型があり、それを使うと集合のなかから排他的に一つランダムでとりだして消すというのをとても効率的に実装することができます。 ISUCON ではこのランダム条件が(チェッカーがバグでスルーしていたみたいですけど)なかなかきびしかったところだと思いますが、そこもするっと解決です。 なお、順番に購入という条件であれば双方向リストの List 型を使うのが正解でしょう。こちらも先頭or末尾からの取得&削除を排他的に行うことができます。
ついでに購入履歴も Redis にもたせておけばそこから、サイドバー(recent_sold
)とCSV吐き出しもどちらも行えそうだなと思いました。
ここまででとりあえずこの購入トランザクションだけでも Redis にうつしたら DB ロックする必要がないのでだいぶ良さそうだなと思い、redisブランチやりますとチームに宣言します。
書き換えの流れ
そしてもりもり書き換えました。
POST /admin
でMySQLにデータを流し込んだあとに stock のデータをすべて redis にコピーする。(stock:{variation_id}
というキーのSet)POST /buy
で対象の Set から一つ取り出し、order_history
という List にアーティスト名などの付属情報込みな辞書情報をPush。- サイドバーは
order_history
から最新10件を取得するように変更 - CSV書き出しは
order_history
をまるっと書き出す感じ - その他もろもろテンプレに渡してるデータをよしなに変更
といった感じですが、アプリのテストコードがないのでだいぶ変更が手探りな感じでつらかったです。とくにテンプレ周り。なおしてベンチ止まって、ベンチのエラー見て修正という…。 そんなつらいかんじや実際の作業内容は redis ブランチのコミットログを参照いただくと分かるかなと思います。
他になんかあるか?
コード見てるだけだとわからなかったので fujiwara さんにボトルネック探してもらいつつ、自分はとくにやることもないので非同期の実装を模索しておりました。 この時点ではforkモデルの限界なんじゃなかろうかと思っていて非同期にしてベンチ取ってみるか、みたいな感じでしたが、Perlで非同期にすると書き直しになるし、nodeの実装いじっててもうまく動かなくてすぐにあきらめてしまったんですが、それは fujiwara さんがテンプレのレンダリングボトルネックを見つけてくれて、そちらを直したら今までのアプリでも十分スループット(reverse proxy <-> app 間)が出ており、非同期全然意味ありませんでした。
まぁそうだよね、IOウェイトが問題になるような場合以外は非同期意味ないなーとそのとき思った次第です。
テンプレキャッシュ
組長が見つけてくれたチケットの座席表のレンダリングのボトルネック。これも Redis でキャッシュするようにしました。 Redis は単純なKVSとしてみても十分高速なのでこういう用途にも使えます。
データ永続化
これは本家ドキュメントよくまとまっております。
スナップショット(dump)と追記ログ(appendlog - MySQLのbinlog的な)の二種類の永続化方法があり、dumpはバックアップ用、復元をappendlogから、ってのがオススメな方法。
appendlog は基本的にはプロトコルログなんですが、大きくなるとバックグラウンドで最適化されて小さくなります。デフォルトでは fsync が1秒ごとに走るので最悪そこまでのデータは保全される。 書き込み毎に sync って言うのも設定でできますがパフォーマンス的につらいことになるでしょう。
これがISUCONのレギュレーションを満たしているかは定かではありませんがとりあえず fujiwara 組では1秒fsyncなappendlogでデータ永続化をしました。
また、メモリいっぱい使い切っているような大きなデータセットの場合に appendlog するは不安感ありますが、自分もまだ試したことがないので、近いうちに試したいと思っております。
まとめ
あんまりおすすめしまくっていると勘違いしちゃう人もいるかもしれないのでいちおう補足しておきますが、単純に MySQL を Redis に置き換えたら速くなる、っていうことはないです。 MySQLがいいところ、Redisがいいところ、(もちろんその他のツールも)どちらもあるので、 Pros and Cons やトレードオフを考えた上で選択するのが大事です。
僕自身も Redis つかっているといっても運用上のノウハウなどまだまだうちも足りていないのでそこはこれから精進していきたいと思います。
しかし、ISUCON楽しいですね。 #isucon のログによると
11:47 < typester> すでにだいぶたのしい
といっており、ここからずーーーっと終了までたのしかったですね。
あと珈琲ありがとうございました!
番外: Xslate の速さを実感
家帰って他の言語の実装をうごかしてみると、明らかに座席表のレンダリングが遅いんです。ブラウザで見てボトルネックって分かるレベル。 でも、Perl の実装をブラウザで見た人はあのページの遅さはテンプレートエンジンじゃなくてブラウザがレンダリングするのに時間かかってる、くらいにしか感じない気がする。 今回の罠は Xslate の速さと言っても良いのではないでしょうか。
これは gfx++ といわざるを得ませんね!
テラスモール湘南に行ってきた
11月11日に辻堂駅前にオープンしたばかりの湘南地区最大級のショッピングモール、テラスモール湘南に行ってみた。
我らが鎌倉bowlsも出店しているからその様子見もかねて。
テラスモール湘南のデリカテッセンのお店。いつもの家庭の食卓にサプライズと笑顔をお届け!
個人的には、109シネマズ(もちろんIMAXシアター付き)が入っているというのが最大のポイント。いままでは川崎まで見に行っていたからね。
ただ、懸念点は交通事情。あのあたりってそんなに道も大きくないような気がしたし、テラスモール湘南自体は2500台収容の駐車場があるらしいけど周りの交通が麻痺してしまっていたら意味がない。
実際に行ってみるとそんなに心配することもなかった。到着したのはたぶん1番混んでると思われる14時台だったけど、テラスモール湘南の少し手前から駐車場に入る列が出来ている程度の渋滞しかなかった。 ただ駐車場は屋上以外はほとんど満車状態だったから、雨の日など屋根付きのところへ駐車したいという場合には早めか遅めの時間帯に行くようにした方がいいだろう。
鎌倉から向かうには海沿いをずっと行って浜見山交番前を右折、あとはずっとまっすぐ行くとテラスモールの真ん前に出るから1番楽だと思う。帰りはそのルートは混むので模索中…。
今回は映画を見るわけでもなく施設内をぶらぶらしただけだったけど、なかなか好印象。湘南地区の人たちは横浜や都内に出る機会がだいぶ減るんじゃないかな。ここで事足りるっていう意味で。 次回は映画を見に行こうと思う。
Jobs の思い出
最初はたぶん中学生くらいの頃だったと思う。古い Macintosh をさわる機会があった時だ。
分解してみると、内部に Steve Jobs という刻印があった。 当時はインターネットがまだ普及しておらず、スティーブ・ジョブズという人のことを全く知らなかったから、エンジニアの名前なのかなーとおもったり、 もしくは Steve's job (スティーブの仕事)ってかいてあるのかなとか思っていた。筆記体で書かれててよく読めなかったのだ。
いずれにせよ、スティーブさんというのは僕の中ではエンジニアということになっていたから、数年後どういう人なのか知ったときには衝撃だった。 それと同時に製品に自らの名前を刻印するということにも妙に納得したりした(笑)
今では家中が Apple 製品であふれている。
- MacBook
- MacBook Air
- Mac mini 2台
- Time Cupsule
- AirMac Express
- AppleTV
- iPhone
- iPad
エンジニアとして、クリエーターとして、彼の妥協しないクリエイティブへの姿勢は尊敬しているし、今後それを目にすることができないのは残念でならない。
とにかく、いままでありがとう! 安らかに。
最近の活動その2 VQチェッカー
Reengo の合間に VQ チェッカーというアプリも開発していました。
これ、結構真面目に音声解析をしているのですが、もともとそういう知識をもっていたわけではないので、東京工芸大学の森山先生に監修いただいています。 基礎から解説いただいて、非常に刺激的でした。音声解析というのは僕にとっては本当に不思議な世界で計算結果がどうしてこうなるのかというところはまだよくわかっていません。今後も掘り下げていきたい分野ですね。
開発は音声が扱いやすいという理由だけでMacアプリとして開発しテストしていました。 ある程度出来たところでそれをActionScriptに移植したという流れです。MacのAudioUnitのコードは少し変更するだけでiPhoneでもそのまま動きます。したがってiPhone版もついでにつくっちゃうか!っていう流れでiPhone版もつくっちゃいました。
気軽に遊べるのでぜひ遊んでみてください!
最近の活動その1 Reengo
気づいたら3ヶ月も更新途絶えてましたが、その間ずっとiPhoneアプリを開発してました。
今年一番時間をかけ、いま現在もつきっきりで開発しているのが Reengo というアプリ。
いわゆる VoIP アプリケーションですが、Facebookアカウント連動で友達がアプリさえインストールしていればすぐに通話できるというのが特徴です。
この辺の投稿なんかはこれの伏線だったわけです。
クライアント実装は通信周りのロジックは C で書いていて、この部分は近日リリース予定の Android 版と共有して使いまわしてます。 サーバー実装は Perl と Node を適材適所使い分けております。Node の使用用途としてはいままで Perl の AnyEvent を使ってやっていた部分を Node に置き換えたというイメージで、個人的にはこれはなかなかいい選択肢なんじゃないかなーとおもってます。 技術的なところの詳細はまたどこかで別途書きたいと思ってます。
まだまだ課題があってそれを徐々につぶしているという状態ですが、ぜひ使ってみてください!
ブログ
clmemo になんか記事っぽくメモを書くのに疲れてきたので、ブログを復活させようそうしよう。
昔のエントリ見るとちゃんとメモっぽいのだけどなんでだろうなーw
3GS 購入
アプリ開発で 3GS を借りたのが最後、もうどうしてもあの速さがうらやましくなってしまって結局買ってしまった。
今まで使用していた 3G の分割のこり10ヶ月分くらいは次の請求で一括で払うことに。そのまま分割したままでもよかったが割引きかなくなるから一括で払っても変わらないからそれなら払っちゃっておいた方が良いかなーと。なんかよくわからないけどホワイトWとかなんちゃらオプションとか加入させられたのでそれはわすれないうちにオフにした。
感想としてはいままで iPhone 使ってて一番不満だったメモリ足りなすぎて重いなーって言う感じがまったくしなくなってとても快適。これが本来イメージされてた iPhone かーという感じ。 3G ユーザーはみんな乗り換えたら感動すると思う。
でも液晶の色合いがなんか 3G と違って白っぽいのはきになるなー。液晶は前の方が好み。
本体の方の色は 3G が白つかってたので黒にしたが、白の方がよかったなーと若干後悔中。iPhone の黒はなんか下品な感じがする。まぁカバーつけるから関係ないんだけど。
たこthon
というのに参加してきた。
tomyhero さんの家なのでどんだけ奇天烈な家なんだろうと思ってワクワクして言ったら予想に反してまともな家でした。でもものすごく遠い。
たこ焼き食べたり鯛焼き食べたりタコライスたべたりしてあとはハックしたりゲームしたり漫画読んだりする会らしい。
予想に反して集中できたので
- オレオレlighttpdモジュールを本番投入したり
- 前から作ろうと思ってたiPhoneアプリをガリガリ実装したり
した。iPhoneアプリはほしい機能全部はつけてないけどとりあえずそれ削れば公開はできそうだったので公開してから帰るかとおもってリリース作業してたら最後の最後で謎エラーで手間取りだめだった。今日の夜にでもアップしよう。
たこ焼き器とPS3欲しくなった。
Kindleもちょっとだけ欲しくなった。
リニューアル
clmemo を開始してから4年ほど、ずっと変えていなかったサイトをサーバーが死亡したのを機にリニューアル。
今年初めに作った nim をつかって全部静的ファイルな構成にしてみる。制限のきついレンタルサーバーならともかく、僕の環境ではまったく意味がない。最初は typester.github.com
とかでやろうとおもったけど、その後移転したくなったときリダイレクトとかできないのはいやなのでやめた。
でも自鯖はめんどくさいので prgmr.com 借りた。なかなか良い。
nim なら clmemo 以外にもコンテンツを扱えるのでぼちぼち増やしていく予定。とりあえずブログかなぁ。
しかしやっぱりサイトをいじるのは楽しい。最近はブログサービスなどが普及してきてこういうことをやる人が少なくなってしまったけどもったいないなーとおもう。