http://cubby.seasar.org/validation.html
フィールドでクラスを継承し、必要なところだけオーバーライドして処理を記述することで Java でも多少楽ができる。そういえば Wicket でも使っていた気がする。良いコードはたくさんみよう。
再インストールしないといけない。挙動が何か違う。あのグリモンが入っていなかった。バージョンが古かった。どこから持ってきたものか忘れたので delicious から調べる。ひとつひとつダイアログを見てインストール。などの一連の行為に疲れました。
Firefox の設定と違いパスに依存するものは多分ないので git で管理することにしました。 Windows では msysgit を使います。
まずスクリプトを管理するサーバー側でリポジトリを作成します。 (/home/user/repos/ にて作業しているものとする)
$ mkdir gm_scripts $ cd gm_scripts $ git --bare init
クライアントで現在使用しているスクリプトをサーバーに登録します。 Firefox のデフォルトプロファイラの下の gm_scripts に移動してローカルリポジトリを作ります。
$ cd gm_scripts $ git init $ git add . $ git commit -a -m "initial commit"
さきほど作成したサーバーにプッシュします。
$ git remote add origin ssh://user@example.com/home/user/repos/gm_scripts $ git push origin master
同期させるクライアントの場合は今の gm_scripts はいらないので削除または待避させ、サーバーから clone します。
$ mv gm_scripts ~/tmp/ $ git clone ssh://user@example.com/home/user/repos/gm_scripts
後は同期を簡単にするためシンボリックリンク(Windows であれば linkd)やスクリプトで簡単に同期を取れるようにしておきます。
ひとまずこれで大丈夫なはずだけど更新しても push し忘れそうだなあ。それでもやってみないと分からないのでひとまず試してみようと思います。
span 要素の背景色をいじりながらスクロールする JavaScript を書いているけど、背景色をクリアしても一部分だけ描画が残ってしまうことがある。
Firefox, Safari, Opera の最新版で問題ないからきっと大丈夫!
[2009/3/12]追記
少し時間が空いてしまったけど直せた。
#hoge span {
display: block;
}
#hoge span.selected {
background-color: #fee;
}
#hoge span {
display: block;
}
#hoge span.selected {
background-color: #fee;
width: 100%;
}
width をきちんと指定することで IE8 特有だった問題が解決した。
引っ越し先にも TSUTAYA はあるんだけど狭いし品揃えが悪いし探しづらい。恋人や友人と一緒に探すプロセスでの楽しみはあるんだろうけど、一人でさっと探したいときには時間の無駄。
ブックオフや TSUTAYA みたいなところは検索システムを用意すべき。でも休日にはきっと待ち行列ができてしまうから時間削減があまりできない気がする。
そんなわけでこちら側から指定して送らせられる TSUTAYA DISCAS があるじゃないかということで申し込んだ。こうして自動化が進んで何もやらなくなることに慣れていくんだろうな。最終的に行き着くところはストリーミング配信かな。
決めるにあたってぽすれんと悩んだけど少しマイナーなアーティストを 3 組ぐらい入力して TSUTAYA の方が取り扱っていたので決めました。コミックレンタルも悪くないけど値段が今の半額ぐらいじゃないと満喫でいいのでないだろうか。
で実際に会員登録して使ってみると観たい映画、聞きたい音楽を予約リストに突っ込んでいき優先順位をつける。日に 2 回バッチが走り在庫状況と優先順位から 2 件リストアップし配送してくれる。見終わったあとにポストで返却すると予約リストからまた 2 件探し出し・・・以下ループが基本的な流れみたい。今すぐ見たい!聞きたい!という場合を除けば忙しい現代人に合った仕組みだと思います。
最初にサイズを渡すテクニックがよく知られています。
(function() {
var arrays = [1, 4, 5];
for(var i = 0, length = arrays.length; i < length; i++) {
}
})();
console.log(length);
0
あれ汚染されてる? window.length でした。
arguments.callee を使って呼び出すのがセオリーだと思います。
function requestAnonymous() {
var count = 0;
return function() {
console.log("Hello!" + count++);
if (count == 10) {
return;
}
arguments.callee();
}();
}
requestAnonymous();
名前をつけてあげると関数名で呼び出せるんですね。
function requestNaming() {
var count = 0;
return function callback() {
console.log("Hello!" + count++);
if (count == 10) {
return;
}
callback();
}();
}
requestNaming();
関数を返す場合 return function() {}; が定石なので名前をつけられることを忘れていました。あ、無名関数でなくなっていました。
A Guided Tour of emacs-git (by TSKim)
どのプラットホームに行っても同じ操作が行えるために Emacs(Vim) を使っているんですから、作業効率向上をするべしということで導入しました。
そういえば git-emacs を導入すると ido-mode が有効になるけど、タブを押して補完するときのノリにズレが生じてしまい慣れないので
(require 'git-emacs) (ido-mode nil)
として無効にしました。
tortoisegit, mssysgit が更新されてた。あー更新通知して欲しいなあと思っていたら
http://code.google.com/p/msysgit/downloads/list
Google Code フィード配信してるじゃないか。素晴らしい!
ソフトウェアの更新ってみんなどうやって知っているんだろう。アプリケーション通知、訪問、更新まとめサイト、ブログ、スクレイピング、メーリングリスト、フィード、ありすぎる。。
やはりここはフィードでお願いします。
新しいタブに開くには
Utils.openUrlInBrowser(url);
現在のタブに開くには
var browser = Utils.currentChromeWindow.getBrowser(); browser.loadURI(url);
で開けた。 Utils に欲しいなあ。
行ってきた。受けたのは以下のもの。
少し遅れた。 Cubby の途中から。
2.0-beta1 がリリース。 DI コンテナ非依存になった。 Seasar2, Guice に対応。 Spring, EJB3, Slim3 は順次対応予定。
使い手側からは変わった印象を受けない。リファクタリングして、拡張性がぐっと増した。さらっと言っていましたがこれってすごいなあと。おそらく使い手側のアプリケーションは変更せずに DI コンテナ非依存のバージョンにできる。
Maven は黒魔術と言われたりする。実際自分も使い始めて初めて行うことに関しては色々つまずいた。 Eclipse と連携したりマルチモジュールだったり、インハウスリポジトリだったり、でも一度経験すると敷居が下がると思う。まだ分からないことだらけだけど archetype を作れるぐらいになりたい。
リリースは手動は駄目。プロファイルを切り替えて自動化しよう。
和田さんのプレゼンは今回見た中で一番聞きやすかった。画像の使い方、見せ方、盛り上げ方が聞いていてうまいなあと関心してた。自分は JUnit は使っているけど TDD はやっていない。まずはやらないと何も始まらないから小さいモジュールからでも始める。おすすめの書籍を何度も紹介していた。ケントベックの テスト駆動開発入門は買う。
三本柱は本当に大事だと思う。以前会社で自動化以外のふたつは勉強会と称して発表してた。
DBFlute は使ったことがなかったけど聞いてみた。 本当に業務に特化した O/R マッパーだなあという印象を受けた。 null first/last を実装していないデータベースに対しても行えるようにするとか。
特に印象深かったのは Action のフィールドに対して SessionScope 属性がつけられるっていうのと、 Slim3 JDBC では基本的な操作以外は SQL で処理をする。
@SessionScope はいいなあ。 Map<String, Object> sessionScope で取得する際にキャストする手間がなくなるし、 Action で何のセッション情報を使いたいか明確にできる。
Slim3 JDBC は以前自分も疑問に感じていたどこから SQL にすればいいのか、ラインがあいまいになるぐらいなら SQL にすれば迷わないよね。っていうひとつの解決案になっていると感じた。このあたりは賛否両論分かれそう。自分はデータベースは SQL っていう言語があるんだから SQL で統一しちゃおうっていう考えです。
やっぱりカンファレンスや勉強会は出るとやらなきゃって気持ちになっていいなあ。今度は小さめな勉強会に出て懇親会に出たい。
今の眼鏡が 4 年弱ぐらい使い始めて少し度が合わなくなってきたので、新宿の和真に行ってきて購入してきた。
眼鏡をかけたところをモニターで正面と斜め横から画像に納めてくれるサービスがあるため第三者から見たイメージが掴みやすくていいですね。初めて行ったけど、親切に対応してくれて印象がよかった。また次も利用したいと思いました。
乱視矯正を入れたレンズにするため 1 週間ほどかかるとのこと。縁を強くみせるものなため印象が変わるかな。
最初パッドに足がないものを買おうと思ったんだけど、自分のマツゲが長くレンズに当たってしまうと指摘され、足のあるものに変えざるを得なかった。どんだけマツゲが長いんでしょう。。。
何かが足りていないと思ったらツールをきちんと管理していなかった。
仕事なりプライベートでワンライナーつくったり、数行のスクリプトを書いた後に、どこかのディレクトリに埋もれて消えていくことがほとんど。これから Git で管理していこうとは思うけど増えてきた後の索引をどうしよう。ファイルの先頭にコメント、タグみたいなものを埋め込んで find grep するのがいいのかなあ。
先日の Seasar カンファレンスでおすすめされた本を購入した。
世の中ええっ!って才能溢れるコードを書く人たちが沢山いる。自分に自信がないわけでないけど、あーこの人みたいな発想はできないな、と笑えてくることがある。
和田さんが言っていたとおりテストは才能でなくスキル。それからコードを丁寧に書くことも才能でなくスキル。才能がなくてもこれらのスキルを身につければ、そんな人たちに迷惑をかけず多少なりともサポートすることができるのではと思う。そうした才能から生み出されたコードによって世の中が少しでも便利になればと思う。
もちろん自分もそんなコードを書けるように努力し続ける。
今日は酔ってる。
LDR Notifier 1.0.1 をリリースしました。
Firefox はウィンドウごと(chrome window) に、拡張で使用するオブジェクトのインスタンスを持ち、各ウィンドウで共有する変数がある場合アクセスが面倒です。今回 jsm を使ってシングルトンで共有する手法を知りました。
前回まで通信はウィンドウごとにばらばらに行っていました。これだとサーバーに負荷をかけてしまいますし、開いているタイミングで数値が違う。これはださい。ということで jsm のシングルトンインスタンスに通信を任せて、そこにリスナーを登録して同期するようにしました。
さらに今回 jsm を利用する場合は jar の外に出さないといけないことを知りました。開発時はいちいち jar にしていられないのでまったく気づかなかったのですが、リリースするときに jar にしたところ import に失敗することが発覚。一度でもローカルで試せばよかった。というかいっそ jar にしなくてもいいのでは。
とりあえずリリースの自動化をなんとかしないといけないのが今の課題点です。
3.5 のタブをデスクトップにドラッグアンドドロップすると新しいウィンドウに分割してくれる機能がいいなあ。 youtube とかニコニコ見ているとき用に重宝しそう。
vimperator で Emacs キーバインドに近づけてやってみたけど馴染めない。仕方がないので LoL をもう一度有効にした。
まずキーオプションの Numbers を asdfqwer にして片手で済むように。ただこうすると LoL が有効になっていることに気づかずロケーションバーに移動すると asdfqwer の入力が LoL に奪われるので数字の方が混乱が少ないかも。
キーの設定は magic key の Space だけだけど、新たにタブで開きたいときにスペースを押し続けながら Ctrl キーを押すことを考えたりするのが大変なので変えた。
これでスペースを押して番号を出してスペースキーを離せる。後は移動したいキーを入力してリターンすれば開くようになった。
リターンキーを押す度に一瞬番号が出てしまうのはご愛敬ということで、あきらめました。うーん。
遊びで Cubby を使ったアプリケーションを作っています。
そのアプリケーションの中で CSRF および二重サブミットを防止するためのひとつの解決策として TokenValidator を利用しています。この Validator は Action クラスのテストでも当然検証され、テストに通過しません。これは通過するためのやっつけコードです。
protected void setupToken() {
String token = "fake token";
getRequest().addParameter(TokenHelper.DEFAULT_TOKEN_NAME, token);
Map<String, String> tokenMap = new HashMap<String, String>();
tokenMap.put(token, null);
getRequest().getSession().setAttribute(ATTR_TOKEN, tokenMap);
}
setUpXXX か processAction を実行する前に呼び出せば validator は通ります。
それなりに JavaScript で UI をサポートするようにしたところ、 jQuery を使っていてもコード量が増えてきた。 ready メソッドも膨らんできてぼちぼちなんとかしないといけないなあと感じる。増えてきたといっても 400 弱ぐらい(ready は 40 ぐらい)でまだいいのかもしれないけど、ここで放置するといつの間にか 1000 行越えて修正に時間がかかるようになるのが怖い。これからも機能が増えていくことは分かっている。
ずっと悩んでいても仕方ないのでひとまずロード時からの描画部分、ボタンクリックなどの操作周り、そのアクションによってビューが変わるアクション層(と勝手に自分で決めた名前) と、 Ajax によって取得したデータを管理、そのデータを楽に提供できるサービス層 (これも勝手に自分で決めた名前) に分離してみた。
サービス層でリアルタイムに取得したデータをコールバックでアクション層に返し描画する。取得した生データをサービスでキャッシュしておき、そのデータをいじるようにすれば DOM を直接いじることはかなり減る。
そんなこんなで ready 関数にあった関数はアクションの中に入って 20 行ぐらいになった。こうして振り返ると当たり前のことをしていなかっただけな気がしてきた。
Delicious Bookmarks アドオンの最新版が出た。
前のバージョンでは(その前までは変わらなかったという認識)複数のタグを入力すると、自分が意図した順序とは違う順序に入れ替えられていたけど直ったっぽい。サポート掲示板でも報告があったので修正したのかな。
タグの入力を mysql performance としたものが performance mysql になるとどうだろう。パフォーマンスを優先しているように受け取れると思うのは性格が細かい人だけかなあ。こっちは mysql のパフォーマンス、と意志を持って順序付けをしている人がここにいたわけで、そういう挙動に変更する場合はオプションを用意したほうが使い手は嬉しいと思う。
入力項目では逆に自動変換して欲しいものもあって、全角入力のところで半角数字を打っても大丈夫にしてくれるのは嬉しい配慮。普段気づいていない使いやすくしてくれているものをたくさん知りたい。
昨日の雷悶のコメントに返信を書こうと思ったけど、書いている間になぜかテーブルの構造について書き始めたのでエントリにした。
並べ替えられたりする場合っていうのはシステム側の勝手な都合によってしているのだけれど、では順序を記憶してくれているシステムのテーブル構造はどうなっているのだろう。 1 つのタグにつき 1 レコードにしている場合入力の順序も保存させてあげる必要があると思う。この仕組みの場合、一覧表示ではタグ一覧テーブルとの JOIN が頻繁に発生するため応答は悪くなる。
一方スペース区切りですべてのタグを 1 レコードに保存する場合、入力したとおりに保存させるのは楽だけれど今度はタグ検索時にインデックスが張れないので遅くなる。
そう考えるとタグ検索専用のテーブル(にすれば入力順位の項目は必要なくなる)と表示用のテーブルを無駄に持たせるのがいいのかなあ。
今日になって SSH 越しの git コマンドが使えなくなっていました。まず依存関係でエラーになっていたためリコンパイルしてみたものの pull, clone コマンドを叩いても以下のエラーが出ました。
git-upload-pack: command not found
git は $HOME/local/bin に置いてあるのですが、今回のエラーメッセージはパスが通っていないときに出るのは導入時で分かったのでクライアントからサーバーのパスを調べてみました。
ssh ${user}@pshared.net 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/${user}/bin
先日まで $HOME/local/bin (opt のほうがよかった)にパスが通っていたのに無くなっています。 SSH からの環境変数の書き換えを禁止にしたのかな?仕方ないので $HOME/bin から $HOME/local/bin へのシンボリックリンクを作成して、ひとまずコマンドを通しました。
delicious アドオンの最新版に追加された Awesome Bar オプション。有効にして再起動してみると、ロケーションバーに ?? を入力してさらに検索ワードを入力するとタイトル、タグ、コメントからヒットしたものを補完一覧に出してくれる! del.icio.us IncSearch の行ってくれたことをロケーションバーでできるようになっていて大変便利。
まだ動作が安定していないみたいで、再起動後に有効にならなかったりですが今後の安定化に期待大です。

いつもと同じところから手に取ったと思ったコーヒー豆が、既に挽いてあったものだった。どおりで購入時に挽きますか?と聞かれなかったわけだ。。。
うっかりしていました。
コーヒーは飲む直前に挽いたほうが絶対おいしいので、これはさくっと飲んで処分しよう。
# 雷悶 [今度飲む時は睫毛の長さに定評のあるussyって呼びますね!]
# Ussy [早く東京に来てください]