2007-05-01から1ヶ月間の記事一覧
select の from にテーブルを並べると、テーブル同士が総当たりで結合されます。さらにwhereで検索条件を指定して絞り込むと、内部結合した場合と同じような出力を得ることができます。 結合するテーブル mysql> select * from kittens; +----+-------+-----…
JDI(Java Debug Interface)でスレッドダンプをとります。 JDIは、その名の通り、仮想マシンのデバッガや類似システムに有用な情報を提供するJava API です。 リモートからのデバッグを標準でサポートしています。 JDK添付ですが、実装はtools.jar内にありま…
YAMLでは、参照が使えます。(参照される側をアンカー、参照する側をエイリアスといいます。)YAML(kitten.yml): --- strains: - &mike # "&<アンカー名>"でアンカーを設定 name: "三毛" description: "茶色・黒・白の3色模様です。" - &scottish-fold name: "…
FreeMarkerは汎用テンプレートエンジンです。 モデル + テンプレート → 出力 モデルには任意のオブジェクトを指定可能。モデルのメソッドを呼び出した結果を出力することもできます。 その他、基本的な制御構文(forやif)もサポート。 サンプル(文字列と数字…
JDK添付のアノテーション処理ツール「apt」を使ってみます。これを利用して、 サーバーAPIに対応するクライアントインターフェイスを作る アノテーションで示されたサービスの一覧を作る などアノテーションを元にしたソースコードやリソースの生成が可能で…
transactionを利用して、一連の更新処理をアトミックに実行します。 トランザクションを使う テーブル定義: CREATE TABLE kittens ( id int(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(255), color VARCHAR(255), age int(4) ) TYPE = InnoDB ;…
Generic type付きインスタンスをインジェクションするには、TypeLiteralを使用します。インジェクション先: import java.util.List; import com.google.inject.Inject; import com.google.inject.Singleton; class Kitten { // Generic type付きのListを受け…
アノテーションを使用して、サービスインターフェイスと実装を名前付きで関連づけます。 識別用アノテーションには、@BindingAnnotationを設定します。(設定しないとエラーになります) Moduleで、annotatedWith()またはKeyを利用して、名前付きでインスタン…
アノテーションを作ってみます。 作成 クラスやインターフェイスと同じように作成できます。「class」の代わりに「@interface」でアノテーションであることを宣言します。構文: <修飾詞> @interface <アノテーション名> { ... }サンプル(Mike.java): public …
sun.reflect.Reflection#getCallerClass( int )でメソッドの呼び出し元クラスを取得します。引数でスタックの深さを指定します。サンプル: import sun.reflect.Reflection; public class GetCallerClass { public static void main( String[] args ) { new M…
Guice組み込みのNamedアノテーションを利用して、サービスインターフェイスと実装を名前付きで関連づけます。 Moduleで「インターフェイス+名前」と、実装を関連づけ。(Names#namedはNamedアノテーションを生成するユーティリティです。) インスタンス取得時…
Guiceでは以下のインジェクション方式がサポートされています。 フィールドインジェクション コンストラクタインジェクション メソッドインジェクション(set*に限らず任意のメソッドを指定できます) フィールドインジェクション(Mii.java): import com.googl…
サービスと実装の関連付けや、スコープの指定はアノテーションで行うこともできます。サービスインターフェイス: import com.google.inject.ImplementedBy; /** * サービスのインターフェイス */ @ImplementedBy(KittenImpl.class) // 実装がKittenImplであ…
SWTを使ってJavaからWin32APIを実行し、一番手前のウインドウのタイトルを取得します。 注意:使用しているクラスはJavaDoc等では非公開になっています。今後変更されたり、サポートされなくなったりする可能性があります。 準備 SWT: The Standard Widget To…
Preferences APIでWindowsレジストリを利用できます。 注意:読み書きできるのは決められたノード以下の値です。任意のキーの値を取得したり、変更したりはできません。サンプル: Preferences root = Preferences.systemRoot(); root.put( "kitten", "mii" );…
Guiceから取得するインスタンスにインターセプタを適用します。これもModuleで明示します。サービスと実装: /** * サービスのインターフェイス */ static interface Kitten { void meow (); } /** * サービスの実装 */ static class KittenImpl implements K…
Guiceから取得するインスタンスは、デフォルトでは「毎回作成」されます。シングルトンにするにはModuleで明示します。インターフェイスと実装: /** * サービスのインターフェイス */ static interface Cat {} /** * サービスのインターフェイス */ static i…
Guiceを使ってみます。 単純なサンプル DIコンテナからサービスのインスタンスを取得するだけの単純なサンプルです。インジェクションなし。 Injector DIコンテナに該当。サービスの実装はここから取得します。 Module DICONファイルに該当。サービスと実装…
Continuationで中断した処理を再開します。 中断する場所で組み込み関数「callcc」を実行。 ブロックに渡されるContinuationを記録 後でContinuation#callを実行すると、「callcc」を実行した位置に戻って処理を再開できます。 continuation = nil puts "sta…
勉強の成果を報告するコーナーです。手始めにちょっと前に作ったWebアプリケーションを紹介します。 概要 「Mii」は、かわいい猫の写真を表示するだけのWebアプリケーションです。ご利用は以下から。>「Mii」「【反則気味】 疲れた時に効果絶大。かわいい猫…
catch,throwでネストされたブロックを一気に抜けます。throw で抜けた場合、catchの戻り値はthrowの第2引数です。 puts catch(:A) { 5.times {|i| puts "outer loop:" << i.to_s 5.times {|j| puts "inner loop:" << i.to_s << "-" << j.to_s throw :A, "can…
Hash#mergeでハッシュをマージします。ブロックが渡された場合、2つのハッシュに同じキーがあった際に実行され、ブロックを評価した値が使用されます。サンプル: h = {:a=>"a", :b=>{ :aa=>"aa" }, :c=>"c" } h2 = {:x=>"x", :b=>{ :bb=>"bb" }, :c=>"c" } #…
SQLインジェクションの脆弱性をなくすため、findでの検索条件の指定方法には注意が必要です。 ×「:conditions=>"name = '" + name + "'"」のように条件を自前で作成するのは危険。 ○「:conditions=>"name = ?", name」や「:conditions=>{:name=>name}」とす…
どうしてプログラマに・・・プログラムが書けないのか?より: 1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。 …
find_by_*で属性を条件にデータを検索できます。 find_by_* 属性を条件にして、それにマッチする最初のデータを取得 find_all_by_* 属性を条件にして、それにマッチするデータをすべて取得 データ テーブル定義: CREATE TABLE kittens ( id int(11) NOT NULL…
Hash#dupでハッシュを複製します。再帰的なコピーは行われません。(shallow copy)サンプル: h = { :a=>"aa", :b=>{ :x=>"xx", } } # 複製 h2 = h.dup p h p h2 puts "---" # 変更 h2[:a] = "edit" h2[:b][:x] = "edit" # :bの値のハッシュは共有されている。…
ActiveRecord::Base#find でテーブルからデータを検索できます。 引数に応じて以下の検索が可能です。 IDで検索 条件にマッチする最初のデータを検索 条件にマッチするすべてのデータを検索 データ テーブル定義: CREATE TABLE kittens ( id int(11) NOT NUL…
ActiveRecordで1:nリレーションのデータを扱います。 テーブル定義 CREATE TABLE kittens ( id int(11) NOT NULL auto_increment PRIMARY KEY, strain_id int(11) default NULL, name VARCHAR(255) ); CREATE TABLE strains ( id int(11) NOT NULL auto_incr…
Hpricotでスクレイピングします。 インストール gem install hpricothpricotはCで書かれた拡張ライブラリを使用しています。Cygwin環境だけかもしれませんが、インストール時に環境に合わせてコンパイルされるため、makeやgccが必要でした。 使ってみる デー…
JDK6をいれたので、JavaScriptを実行してみます。HelloWorld (JDKのサンプルの丸写し): ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("JavaScript"); engine.eval("print('Hello World')"); 出…