トップ 最新 追記

Ussy Diary


2009-09-01

[Ruby][Subversion]指定したリビジョンより後のリビジョンのファイルを一覧で出力する

少し必要になったので書きました。 xargs に渡すことを考慮して ¥0 でセパレートしています。空白のファイル名を考慮してやっていますが、実際に空白を含むファイル名に出会っていないのでうまくいくかは分かりません。

綺麗に一覧出力したい場合は puts "#{file} で。あとサブディレクトリも対象にしたい場合はオプションを -Rv にすればよさそうです。

#!/usr/bin/env ruby

r = ARGV[0].to_i
`svn ls -v`.split(/¥n/).each do |line|
  items = line.split(/¥s+/)
  rev = items[1]
  file = items[7]

  print "#{file}¥0" if rev.to_i > r && file
end

SVN 管理しているディレクトリでリビジョン 2500 以降のファイルを一覧で出力する場合。

$ ruby ~/ruby/svn_ls.rb 2500

2009-09-04

[Greasemonkey]Backlog で選択した文字列を引用するグリモン

Backlog の引用はコメントを全部引用するので、後で行単位で削除する必要があります。試しに選択した文字列を引用するグリモンを書いてみました。文字列を選択して、選択範囲を引用するボタンをクリックするとコメントに引用文字列を挿入します。

ダウンロード

ただ HTML 上に空白があったりすると、見た目通りの引用ができなかったりします。コメントの引用のみ対応ということで。

引用


2009-09-07

[jQuery]selector の指定に document は省略できた

バージョンは 1.3.2 です。サンプルの $(document) を慣例的に書いていて知りませんでした。

$(document).ready(function() {
});
$().ready(function() {
});

コードを読むとすぐに答えがあって、過去を遡ると 1.0 からその挙動(に近い)で常識っぽいです。

init: function( selector, context ) {
    // Make sure that a selection was provided
    selector = selector || document;

$(document) が使われている理由はよく分からないです。 明示的?


2009-09-12

[Java]Seasar Conference 2009 Autumn

Doma

次世代 O/R Mapping フレームワーク。

APT によるアノテーションチェック、 SQL チェック、テーブルのカラムごとを Java オブジェクトで扱いタイプセーフを推し進めています。 AOP は実行時にしか動作確認できなかったけれど、コンパイル時に検証が行え静的な言語のメリットを活かせている印象です。

それから SELECT はすべて SQL で書くポリシーみたいです。ちゃんと SQL 流そうよという意志が伝わってきました。さくさくやるためには IDE のサポートが必要そうです。

後はリレーションを Java オブジェクトにマッピングしない、遅延ローディングをサポートしない、裏でごそごそやるのではなく、やっていることをコードで押し出す指向っぽくてこっち系好きです。

Blogopolis

構築している部分のデータの扱い方の話がすごいなー。プレゼンの見せ方がうまいなーと見ていて関心ばかりしていました。背景が暗くなって一部だけ明るくハイライトする Keynote の機能?ツール?よかったです。

あと細かいところに気をつかってサーバー、クライアントに負荷を与えないようにするチューニングお話もありました。

インフラ

自宅サーバーで運用。使っているフレームワークのメリットなどを一部ずらずらと。

  • S2Flex2
    • ByteArray(Flex) プリミティブ値、文字列をバイト列にシリアライズ ZLIB 圧縮
  • Cubby
    • レスポンスを綺麗に書ける
      • Plain Text, Image, Permanent Redirect
  • S2JDBC
    • 1 回限りの SQL を気軽にくめる
    • ただ SQL が散逸しやすい
  • Apache Solr
    • 全文検索
    • データは MySQL に保存
    • Lucene の単独使用に比べて圧倒的に簡単、便利!
      • スキーマの設計によってパフォーマンスが大きく低下

用事があってじゃんけん大会の途中で帰りました。一回も勝てませんでした。

関係者の皆様お疲れ様でした。


2009-09-17

[Seasar]Cubby でロケールを動的に切り替える

Seasar 2.4.39 + Cubby 2.0.1 で動作確認しました。

Cubby で国際化対応を考えたい場合 MessagesBehaviour インターフェースを実装したクラスを用意すればよいようです。今回は ResourceBundle の取得以外はそのまま処理を利用したいので DefaultMessagesBehaviour を継承しました。

public class ExampleMessagesBehaviour extends DefaultMessagesBehaviour {

    /**
     * {@inheritDoc}
     */
    @Override
    public ResourceBundle getBundle(final Locale locale) {
        Locale newLocale = getLocale(locale);
        return super.getBundle(newLocale);
    }

    private Locale getLocale(Locale locale) {
        // locale を取得するコード
        // HttpSession session = ThreadContext.getRequest().getSession();
        return locale;
    }
}

app-cubby.dicon

DefaultMessagesBehaviour が定義されているところを継承したクラスに変更します。

<!-- messages behaviour -->
<component class="example.ExampleMessagesBehaviour">
    <property name="baseName">"messages"</property>
</component>

これでアプリケーションにリクエストを要求するごとに、リソースを入れ替える処理のできあがりです。最後に messages_xx.properties を用意します。

あと getBundle が呼ばれる時点では Seasar から DI はされないので、もしコンポーネントを利用したい場合は SingletonS2Container から取得するなどしないといけないです。


2009-09-20

[Mac][Shell][Chrome]Mac Chromium を手動で自動アップデート

ビルド版を取りに行くのが面倒なので、最新バージョンを自動インストールするスクリプト(ワンライナー)を書いてみました。ごり押しです。

$ curl http://build.chromium.org/buildbot/snapshots/chromium-rel-mac/LATEST | \
xargs -I{} wget http://build.chromium.org/buildbot/snapshots/chromium-rel-mac/{}/chrome-mac.zip && \
unzip chrome-mac.zip && cp -rf chrome-mac/Chromium.app /Applications/Chromium.app && \
rm -rf chrome-mac && rm chrome-mac.zip

wget でなくてもいいのですけど、ファイルダウンロードは wget というおれおれルールがあるので、 mac ports からインストールしておきます。あと、もし使う人がいたら構成がいつ変わるか分からないので自己責任でお願いします。

拡張がないことも影響があると思いますけど、 Mac 版も描画がすごく速いです。


2009-09-22

[Life]うなぎパイ

うなぎパイ工場

連休なんで東海地方を少しだけうろうろしてました。とくに印象に残ったのはうなぎパイの工場見学。浜松のお土産といえばうなぎパイ。

工場見学 | 浜松のお土産 春華堂

時間にしてみれば 15 分ぐらいで見学は終わるのですが、うなぎパイが生地からコンベアに乗って、箱詰めされていくまでの行程を直接見ることができました。社員の人も下から上から見られていてサボることが一切許されない大変な環境そうでした。そうそう、入り口で名前、住所を書くと人数分のうなぎパイをただでもらえます。欠品の有効活用?こういうサービスが心を捉える気もします。

つくっている行程を撮ろうと思ったけどやっぱり撮影禁止なんで無理でした。撮ってる人いましたけど。。

連休中は高速道路料金も安くなったせいもあって、九州だったり北陸ナンバーもみました。みんな活用しているんだなあと思いつつ、工場に入るまで渋滞で 30 分ぐらいかかって、まさかのうなぎパイ渋滞。やっぱり電車がいいと思いました。でも車でないとこういうところにも来られないですね。


2009-09-26

[Seasar]Provider を切り替える

遊びで Seasar で Web アプリケーションをつくっています。そのなかでデータ変換しようと、簡単なツールをつくって main から実行しようと

SingletonS2ContainerFactory.init();
ItemService itemService = SingletonS2Container.getComponent(ItemService.class);

こんなコードで実行してみたところ init のところで実行エラー。

java.lang.UnsupportedOperationException: createRequestComponentDeployer

原因は Provider が標準の DefaultProvider を利用していて、 request/session スコープのものを取り込むときに発生するものでした。 自分で管理していないところで使われていたので、 init する前に Provider を切り替えてあげたところ、うまく動きました。

ComponentDeployerFactory.setProvider(new ExternalComponentDeployerProvider());
SingletonS2ContainerFactory.init();
ItemService itemService = SingletonS2Container.getComponent(ItemService.class);

ComponentDeployerFactory#setProvider は S2ContainerServlet からも利用されていました。なるほどなるほど。


2009-09-30

[JavaScript]format 関数

タイトルと URL をコピーする Ubiquity コマンド - Ussy Diary(2009-06-22)

以前は関数を利用するだけで、とくに気にもしていなかったのですが、 JavaScript でメッセージ出力するものを見直してみたところ、多少ずるしてすっきり書けました。

var regexp = /\{(\d)\}/g;
function format() {
  var args = Array.prototype.slice.apply(arguments);
  var s = args.shift();
  return s && s.replace(regexp, function() {
    var index = arguments[1];
    return args[index] || function() { throw new Error("arguments[" + index + "] is undefined.")} ();
  });
};

console.log(format("Hello {0}!", "JavaScript"));
console.log(format("Hello {0}!{1}", "JavaScript"));

実行結果

Hello JavaScript!
Error: arguments[1] is undefined.

以前より理解が進んでいるのかなと少し安心しました。 JavaScript のバージョンが 1.6 以上なら arguments の変換も Array.slice(arguments); でいけるのですが、 IE がまだまだ 1.5 なので駄目でした。

それから Array#join も速いみたいということで使っていましたが、最近は書かなくなりました。

理由がない限り、Array.join("") による文字列連結は使わないほうがいいみたい - latest log