Archive

Posts Tagged ‘Java’

集団遺伝学の統計量を計算するウェブサービス

塩基配列から得られる集団遺伝学の統計量である Tajima's D などを算出するウェブサービスを作成しました (http://seqpop.appspot.com)。フレームワークには Slim3 を使用しています。

App Engine を利用しているので,計算結果を保存しておけるし,計算したい統計量が増えた時も容易に対応できるのが強みです。 HTTP 経由で計算結果を取得・更新でき,外部アプリケーションとの連携もしやすくなっています。

現時点では配列の修正は行えませんが,今後対応できたら良いなと考えています。

サーバー, 科学 , ,

Date オブジェクトの紀元前の年をマイナスで表示する

java.util.Datejava.text.SimpleDateFormat でフォーマットするときに yyyy の様にすると紀元前でも符号は付きません。

Date date = new Date(Long.MIN_VALUE);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
String year = formatter.format(date);  // 292269055

紀元前を負符号で表示したい場合は java.text.DateFormatSymbols のインスタンスに setEras メソッドを使用します。紀元の符号の表示は G で指定します。

Date date = new Date(Long.MIN_VALUE);
DateFormatSymbols symbols = new DateFormatSymbols();
symbols.setEras(new String[] { "-", "" });
DateFormat formatter = new SimpleDateFormat("Gyyyy", symbols);
String year = formatter.format(date);  // -292269055

Tip, プログラミング

C# の列挙型がインターフェイスを実装できないのが不便

C# の列挙型は Java のそれとは異なりインターフェイスを実装することはできません。普段はあまり困ることはないのですが,困ることもあるのです。

ゲノミクスではしばしば FASTA 形式 のファイルを扱います。 FASTA 形式は核酸配列もしくはアミノ酸配列を記述したものです。

核酸やアミノ酸は限られた種類しかないので列挙型で定義するのが良いです。列挙型では switch や論理演算が行えるのが列挙型の強みです。特に FASTA 形式では N (任意の塩基) とか Z (グルタミンもしくはグルタミン酸) のようなものが出てくるので,後者が使えるのは非常に便利なのです。

public interface IAcid
{
}

[Flags]
public enum Dna // : IAcid
{
	A = 1, G = 2, C = 4, T = 8,
	N = A | G | C | T,
}

[Flags]
public enum AminoAcid // : IAcid
{
	E = 1, Q = 2,
	Z = E | Q,
}

さて,ここで「配列」という抽象クラス Sequence を考えます。 SequenceDna もしくはアミノ酸を保持するものですから,実際に使うときはジェネリックに Sequence<Dna>Sequence<AminoAcid> のように使いたいです。つまり次のような定義を行いたいわけです。

public class Sequence // where TAcid : IAcid
{
}

しかしこのままでは TAcid に制約がないため, TAcid に任意の型を代入できてしまいます。しかし,特定の列挙型 DnaAminoAcid だけを許可する方法がありません。せいぜい where TAcid : struct くらいです。

これを解決する方法はいくつかあると思います。

  1. 列挙型ではなくクラスにする (おそらく Singleton パターンを使う)。
  2. ジェネリックをやめて各列挙型に対応する Sequence のサブクラスを作成する。
  3. ジェネリックをやめて実行時に型チェックする。

最初の方法がおそらく最良の方法だと思います。ただし switch が使えなくなるのと,演算子のオーバーロードやら Enum で使えるようなメソッドを実装するのが非常に面倒です。

2 つ目の方法はクラスの関係が複雑になります。ただ今回の例のような場合では,せいぜい DNA, RNA,アミノ酸の 3 種類位しか出てこないので,管理できないまでにはならないでしょう。

最後の方法は非常に実装は簡単ですが,文明を遡る愚行でしょう。実装自体は簡単でも,いざそれを使用する際に実行時のエラーチェックが大変になると思います。書き捨てるタイプのものなら良いかもしれませんが,後々使うものなら避けた方が賢明かと思われます。

もしかしたら上に述べた以外にスマートな解決方法があるのかもしれません。 C# 3.0 からは拡張メソッドで列挙型もメソッドを擬似的に使うことができるのだから,列挙型がインターフェイスを実装できても良い気がするのですが。もしくは拡張インターフェイスみたいな。

プログラミング, 科学, 雑感 , ,

Apache FOP で日本語を含む PDF を作成する

Apache FOP (以下, FOP) はオープンソースの XSL-FO の処理系です。 XSL-FO で記述された文書を PDF やその他の形式で出力することができます。 FOP は Java で実装されています。

FOP を使うと簡単に PDF が作成できますが,日本語を用いるためにはワンステップ必要です。 FOP では容易にフォントの埋め込みが実現できます。以下の内容の設定ファイルを作成します。




	
		
			
				flate
			
			
				
			
		
	

ここでは PDF の出力しか想定していないので renderer は 1 つのみです。重要なのは fonts の部分で, auto-detect を指定することで OS にインストールされたフォントが利用できます。ちなみに OS にインストールされていないフォントを使用したい場合はフォントメトリクスの XML ファイルを作成する必要があります。

日本語を含む XSL-FO 文書を作成して適当なところで font-family 属性で適当な日本語対応フォントを指定してやれば良いです。後は FOP のコマンドラインオプションで,作成した設定ファイルを指定してやることで,日本語を含む PDF を作成することができます。

fop -c test.xconf -fo test.fo -pdf test.pdf

test.xconf は先ほど作成した設定ファイルです。先ほど述べたように指定のフォントは OS にインストールされている必要があります。

プログラミング , , ,

C# の string

恥ずかしながらつい最近知ったのですが, C# では string オブジェクトの比較は == を使えば同じ文字列に対して true を返すそうです[a]

私のように Java から移った人は結構同じ勘違いをしているのではないかと思います。 Java だと同じ文字列でも参照が違えば == での比較は false になるので。

実際以下の 2 つの C# と Java のコードは違う結果を出力します。

System.Console.WriteLine("hoge" == "hoge");  // True
System.Console.WriteLine("hoge" == new string("hoge".ToCharArray()));  // True
System.out.println("hoge" =="hoge");  // true
System.out.println("hoge" == new String("hoge".toCharArray()));  // false

ということで C# の文字列比較はタイプエラーが素早く発見できる == 演算子を使用した方が良いということです[b]

脚注

  1. string (C# リファレンス) []
  2. http://www.ailight.jp/blog/kazuk/archive/2006/01/31/11043.aspx []

Tip, プログラミング ,