2010年12月16日木曜日

R.NETというのが出てた。

http://rdotnet.codeplex.com/

これなら.NETからもデバッグできるし、開発がラクチンになるわ。

ただ.NET4対応ということで3.5に対応していないこと。
どうしてVS2010でつくるかなー。せめて3.5にしてくれよ。

この本も欲しいな。



2010年8月7日土曜日

寺久保エレナ

明日は大学のジャズ研の時の先輩と「寺久保エレナ」を聴きに行く。

http://ameblo.jp/erenasax/
http://www.misterkellys.co.jp/

高校生のジャズアルトサックスというだけで話題になってしまう時代ですが、これがまたうまい。まだ「うまい」だけですが、将来が間違いなく期待できる逸材であることは間違いない。

自分が高校生の時もジャズアルトをやっていましたが、ほとんどコピーだけでアドリブを自由に取れる段階ではなかったのに、彼女はジャズからファンク、ロック、フュージョンまで何度もアドリブを華麗にこなす。

まだ高校生だし、「枯れる」とか「渋い」とか「深い」とかは時間がくれるとおもう。今は元気いっぱいサックスを吹いてもらいたい。そして聴いている人に元気を与えれば十分。

明日は元気をもらってきます。

eclipseでpython

eclipseの記事を見てたらPyDevを使えばeclipseでPythonできるとのこと。

http://pydev.org/index.html


eclipseを起動する
ヘルプ→新規ソフトウェアのインストールで「http://pydev.org/updates」を登録
自動的にPyDevがインストールされる
ウィンドウ→設定でPydevを選択、「Auto Config」でインストールされているPythonが自動で登録される、OK。これで準備完了。
ファイル→新規→プロジェクト、Pydev→Pydevプロジェクトを選択すると自動的にPythonのプロジェクトが作成される
srcで右クリック、新規→Pydevモジュール でモジュールファイルが作成される試しにPython2.6にインストールしてあるPybelを使ったソースを入れてみるとちゃんと補完されるし、smilesを読み込んで分子量も計算できる。
PythonのIDEとして使えるかもしんない。

eclipseのandrorid開発環境修復

久々にeclipseのandorid開発環境をいじろうとしてちょっとはまった。

状態
・SDKのアップデートで、フォルダー名が変えられない、ウィルスチェッカーを一時的に落とせ、とか言われたが、だめ。OSでもフォルダー名が変えられない。何かがひっつかんでいる感じ。
・エミュレーターが起動しない。

原因
1、マイドキュメントをC:からI:に移してた
2、android SDKフォルダーがおかしくなってた

1、のせいでエミュレーターが正常起動しなくなった。ググるとAVD ManagerはC:に設定ファイルがあるものとしてガンと言うことを聞かないらしい。OSレベルでごまかせばいけるらしいが面倒なのでC:に戻した。

2、のせいでSDKのアップデートが動かなくなった。しょうがないのでフォルダーごと移して新規にSDKを落としてフォルダーを作り直したら大丈夫になった。

ということで解決はしたものの、なにやら腑には落ちない。特に1、のところはC:しか認識できないのはどうなんだろう。

2010年8月2日月曜日

Python sqlite3を使う

import os, sqlite3

def regist():
    con = sqlite3.connect("data.db")    # 通常
    #con = sqlite3.connect('temp.db', isolation_level=None)  # 自動コミット
    #con = sqlite3.connect(":memory:")   #メモリーDB

    # テーブルを作成
    sql = u"""
create table 社員 (
  名前 varchar(10),
  年齢 integer,
  部署 varchar(200)
);
"""
    try:
        # Tableを作成
        con.execute(sql)

        # SQL
        sql = u"insert into 社員 values ('橋本', 26, '広報部')"
        con.execute(sql)
        con.commit()
        # SQL
        sql = u"insert into 社員 values (?, ?, ?)"
        con.execute(sql, (u"小泉", 35, u"営業部"))
        con.execute(sql, (u"亀井", 40, u"営業部"))
        con.commit()
        # SQL
        con.executemany(u"insert into 社員 values (?, ?, ?)",
                    [(u"堀", 44, u"営業部"),
                     (u"鈴木", 23, u"営業部")])
        con.commit()
    finally:
        con.close()
def retrieve():
    con = sqlite3.connect("data.db")    # 通常
    c = con.cursor()
    c.execute(u"select * from 社員")
    print "---------------"
    for row in c: # rowはtuple
        print row[0], row[1], row[2]

def main():
    regist()
    retrieve()
if __name__ == '__main__':
    main()

2010年8月1日日曜日

Pythonでシリアライズ

ちょっとした設定や計算の途中結果を一時保存するには便利な環境。


■marshalを使う


import os,marshal

def writedump():
    data1 = range(1,100,2)
    data2 = ['hori','suzuki','yamada']
    with open('datafile.dat','wb') as outfile:
        marshal.dump(data1,outfile)
        marshal.dump(data2,outfile)
def readdump():
    with open('datafile.dat','rb') as infile:
        print "1:" + str(marshal.load(infile))
        print "2:" + str(marshal.load(infile))
def main():
    writedump():
    readdump()

if __name__ == '__main__':
    main()


■cPickleを使う


import os,cPickle

def writedump():
    data1 = '0'*100000
    data2 = ['hori','suzuki','yamada']
    with open('datafile_pickle.dat','wb') as outfile:
        cPickle.dump(obj = data1,file = outfile, protocol = 2)
        cPickle.dump(obj = data2,file = outfile, protocol = 2)
def readdump():
    with open('datafile_pickle.dat','rb') as infile:
        print "1:" + str(cPickle.load(infile))
        print "2:" + str(cPickle.load(infile))
def main():
    writedump()
    readdump()

if __name__ == '__main__':
    main()

■さらにZip圧縮する


import os,cPickle,gzip

def writedump():
    data1 = '0'*100000
    data2 = ['hori','suzuki','yamada']
    outfile = gzip.open('datafile_pickle_zip.zip','wb')
    cPickle.dump(obj = data1,file = outfile, protocol = 2)
    cPickle.dump(obj = data2,file = outfile, protocol = 2)
    outfile.close()
def readdump():
    infile = gzip.open('datafile_pickle_zip.zip','rb')
    print "1:" + str(cPickle.load(infile))
    print "2:" + str(cPickle.load(infile))
    infile.close()
def main():
    writedump()
    readdump()

if __name__ == '__main__':
    main()




2010年6月20日日曜日

matplotlib

matplotlibはPythondeグラフが使えるようになるモジュール。

まずはnumpyを入れる。

easy_install numpy

インストール時にかなりのエラーがでるが、無視。

http://matplotlib.sourceforge.net/index.html
https://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-0.99.3/

からインストーラーをダウンロードしてインストール。

サンプルはhttp://matplotlib.sourceforge.net/gallery.html#にいっぱいあるし。
楽しいね。



2010年6月16日水曜日

AndroidでPython カメラで写真を撮って自動保存

import android
import time

droid = android.Android()

fileName = time.strftime("%Y%m%d%H%M%S")

droid.cameraTakePicture('/sdcard/My Documents/' + fileName + '.jpg')

print 'end'

2010年5月29日土曜日

PythonからTwitterに投稿

インストールは

easy_install python-twitter

Pythonからは


import twitter
api = twitter.Api(username='xxx', password='xxx')
ret = api.PostUpdate(u"Test")

2010年5月16日日曜日

HTS Desire (X06HT) のケースが来た

先日機種変したHTS Desire (X06HT) のケースが来ましたので報告を・・。

買ったのはこれです。
Leather Case for HTC Desire/HTC Bravo - Flip Type (Black)
http://www.amazon.com/gp/product/B003LAWM3Y/ref=oss_product

国内にはレザーケースがまだ出てなくて、Amazon USAではたくさん種類が出ています。

今回は黒で落ち着いた物を選択しました。モノが$23でその他もろもろ(税金や送料)が$10で$33です日本円で3000円ってとこかな。

Amazonが販売して発送が香港のショップと言うことで、安心して買えます。

今月9日に注文して来たのが今日なのでちょうど1週間で来ました。

まずは包装から。HONG KONGと書いてある通り、まじで香港からの直送です。怪しげ~。

袋を開けるとこんな感じで、ちゃんと包装されています。
開けると本体とベルト装着グッズが入っているだけで、なんの説明書もショップの広告も入っていません。ベルト装着グッズの仕方がわからなくて、ちょっと困りました。そんくらいの説明書があってもいいのにね。
で、本体を装着してみます。遊びはないのですが、レザーということですっと奥まで入ります。
必要なところがちゃんと見えるようにサイズはバッチリです。

ただ、カメラの位置には穴が開いてなく、フタのカバーを広げないと写真が取れないのがちょっとマイナス。
レザーなのでちょっと厚みがありますが、カバンに入れたりポケットに入れるときの安心があります。
ベルト装着グッズを使った感じはこんな感じ。本体側にフックをつけて、それをベルト側の洗濯バサミのようなツールに入れる仕様です。わりとがっちり噛み合せますので、万が一におちるというリスクはありません。
操作感ですが、レザーの厚みの分やや操作感が落ちてしまうのは仕方ありません。特に画面下のレザーに指が引っかかってしまうので、スクロールがちょっとしにくくなります。

ということで、メリット・デメリットはありますが、万が一の事態に対する安心感、可搬性の安心感が格段に向上しますので良い買い物だったと思います。

2010年5月5日水曜日

Androidプログラミング入門

第4章の3を読み中。バインドとコールバックは難しいわ。ヤマにさしかかってるな。

2010年5月4日火曜日

ATH-A900

メインで使っているヘッドフォンがこれ。実売で3万円くらいで、それほど高いものではない割に良い音を出します。

ヘッドフォンなんて何でも一緒と思っている方がいないとも限りませんが、一度iPodで最高音質で録音したものを持って、オーディオ専門ショップに行ってみてください。

10万くらいするヘッドフォンはびっくりするほど高音から低音まで鳴りきってます。

これに対して1万円以下のいわゆるドンシャリ系は何も考えないで聴くのにはいいけど、一度10万円のヘッドフォンを聴くと、もう聴けなくなります。

ATH-A900はちょうど中間の値段と質で、満足度が高いヘッドフォンです。

そんな中で1万程度のクセに良い音してたのがこれ。

ROXY/JBL Reference 430

スピーカーメーカーの巨星JBLがなぜかブランドROXYとコラボして作ったヘッドフォン。JBLの音がそのままヘッドフォンになったような質の高い音が出ます。ビックカメラで視聴したときは良い音すぎて驚いたほど。

残念なのはデザイン重視(?)で超派手なのと、音が漏れるので電車等では使わない方がいいかも。

あまり売っていないのですが、Apple Storeでは買えそうでした。

Androidプログラミング入門

これで本格的に勉強中。

ServiceとIntentの理解がヤマだな。

2010年4月30日金曜日

Android携帯を買った Softbank X06HT (HTC Desire)

初めてスマートフォンとやらにかえてみた。4月12日に予約して発売日の27日朝イチにGETした。Softbankの店員もよくわかってなくて、料金プランやキャンペーン内容を私が教えるという逆転現象のなか、なんとか40分ほどで機種変手続き終了。

Softbank X06HT (HTC Desire)というやつです。

●いまどきiPhoneじゃなくてAndroidにしたわけ

  • 最初はまじで夏~秋に出る次のiPhoneを狙っていた。でも今回の機種が出たので悩んでこっとにした。
  • iPhoneはメーカー、通信会社とも1社づつなのに対して、Androidは制限がないため、いまは複数のメーカから出ていてキャリアも全3社から出ており、今後は間違いなくシェアは逆転する。そうなるとアプリも環境もすぐにiPhoneを追い抜いて充実する。(MacとWindowsの関係と一緒です)
  • 携帯アプリを作ってみたかったが、iPhoneの場合はAppleの規制が厳しく配布するのが難しい。それに開発環境がMac+ObjectiveCという、いまどきありえない環境。それに対してAndroidはOSは何でもOK+EclipseでのJavaなのでらくちん
まだいろいろ触りまくってお試し中です。

●使ってみた感想やわかったこと


  • 機能はほとんどiPhoneと一緒、iTuneで曲管理するアプリもあったが入れてはいない。iPhone用のアプリをAndroidに移植したものが結構出ていた
    • 音楽を聞かせて曲名を当てる「Shazam」があってびっくりした
  • 標準のTwitterクライアントが使いにくい、そこで国内製の「twicca」に替えた
    • 標準のは写真がアップロードできない、Twitter検索ができない
  • フリック入力のできるSimejiを入れてみたが、私には使いにくく標準に戻した。標準のIMEでUndoができるのはうれしい
  • 充電中、本体が結構温かくなる。
  • 普通に触りまくっていると、電池がすぐなくなる。なので、画面の明るさをギリギリまで落としている。GPSとかも必要のないときは切っておく。
  • 壁紙にソフトバンクのおとうさん犬を入れて触ったらしゃべった
  • Wi-Fiについて
    • 家の無線LANにつなぐ設定がめんどうだった。SIDとパスワード(16桁)を入れるのは大変だった
    • Softbank提供の公衆無線LANの設定は最初から入っていて、アクセスポイント内に入ると勝手に繋がった
  • ケースが欲しいがまだほとんどない。UKのメーカーにいいのがあるので、問い合わせ中。
    http://www.mobilefun.co.uk/alu-leather-case-htc-desire-google-nexus-one-p23580.htm

2010年4月11日日曜日

iPhoneとAndroidを比較調査した

そろそろ携帯を変えようかと思ってiPhoneとAndroidを比較調査した。

■Androidの方がいいかなと思う点

  • 真のマルチタスク
  • 通知機能の充実によるアプリ連携性
  • Flash対応
  • Googleのクラウドサービスとの連携性
  • 開発のしやすさ、公開のしやすさ
■iPhoneの方がいいかなと思う点

  • OS、画面のCool性
  • 音楽機能
  • アプリの充実(これはそのうちAndroidに追い越される)
  • アプリの信頼性
マニアにはAndroid、普通の人はiPhoneという構図が見えてきた。

というわけで、明日にでもAndroidスマートフォン「HTC Desire(X06HT)」を予約に行く可能性大。

2010年4月6日火曜日

Listオブジェクトから特定のIndex(複数)をRemove

Listオブジェクトを使っていると、特定のIndexに相当する値を除去したくなる時があります。

単一のIndexならRemoveメソッドを使えば取り除けますが、複数の項目を同時にRemoveしようとするとうまくいきません。これはひとつの項目を除去するとListのIndexが更新されるので、次のIndexに相当する項目が変わってしまうからです。

Delegateを使ってRemoveAllメソッドを使えばできるようですが、私はこのDelegateがどうも苦手でダメなので、代わりに除去したListを返す関数を作ることで対応してます。

これってたぶん亜流なんでしょうね。



using System.Collections.Generic;
using System.Diagnostics;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create Start List
            List<int> Ints = new List<int>();
            for (int i = 0; i < 100; i += 10)
            {
                Ints.Add(i);
            }
            
            //Create Delete Index List
            List<int> Deletes = new List<int>();
            Deletes.Add(2);
            Deletes.Add(4);


            // Do Delete
            List<int> result = DeleteFromIndex(Ints, Deletes);


            // Show Result
            foreach (int value in Ints)
            {
                Debug.WriteLine(value.ToString());
            }
            foreach (int value in result)
            {
                Debug.WriteLine(value.ToString());
            }


        }
        /// <summary>
        /// Delete values from index
        /// </summary>
        /// <param name="inList">Original List</param>
        /// <param name="inDeleteIndex">Index list for deletion</param>
        /// <returns>Deleted list</returns>
        private static List<int> DeleteFromIndex(List<int> inList,List<int> inDeleteIndex)
        {
            List<int> rt = new List<int>();


            for (int i = 0; i < inList.Count; i++)
            {
                if (!inDeleteIndex.Contains(i))
                {
                    rt.Add(inList[i]);
                }
            }
            return rt;
        }
    }
}

2010年4月3日土曜日

.NET開発系ユーザミーティングに参加

.NET系のユーザミーティングに参加してみた。

2010 Community Open Day with INETA Japan - Osaka ~ Microsoft Visual Studio 2010 編 ~


主に今年出るVS2010周りの話題でした。


収穫:

  • 関数型プログラミングをサポートするF#という言語が入るらしい。HaskellとScalaの間くらいの言語
  • やろうと思えばVS上でHaskell(GHC)が動かせる
  • 並行・並列処理の組み込みが楽になる(Task Parallel Library; TPLなど)
  • どのように動かすかではなく、何をしたいかを実装しよう
  • テストプロジェクトをもっと積極的に使おう
  • プラグイン(機能拡張)の実装が簡単になる

全体感想:

  • ユーザコミュニティというのに初めて参加したが、なんとなく私のような初参加は居心地が悪かった、身内だけで盛り上がっている感じがした
  • 会全体の目的がイマイチ理解できなかった

何回か行ってみる必要がありそう。

2010年3月31日水曜日

Haskell本

本格的にHaskellの勉強を開始。

最初はこちらの本を読んでた。

小さいので持ち運びに便利で、学術的な書き方で好感が持ているものの、サンプルが見にくい。もっぱら電車の中読み専用。
こちらはぶ厚いので持ち運びは無理ですがサンプルがGHC対応なので、もっぱら自宅で使ってます。

さ、がんばろ。

2010年3月10日水曜日

Python本

師匠のおすすめの本を買った。


すでに「ポケットリファレンス」をだいたい読んだ後なので復習的な感じですな。


2010年3月9日火曜日

Python csvファイルをtextファイルに変換する

こんな感じかな


# import modules
import os.path
import csv


# functions
def csv2txt(inFilePath, outFilePath):
    """csv2txt convert csv file to text file.
       Convert comma to tab."""
    # file exists check
    if not os.path.isfile(inFilePath):
        print inFilePath + " is not exist."
        return
    # file extension check
    root, ext = os.path.splitext(inFilePath)
    if ext != ".csv":
        print filepath + " is not .csv."
        return
    root, ext = os.path.splitext(outFilePath)
    if ext != ".txt":
        print filepath + " is not .txt."
        return
    # create output file
    f = open(outFilePath,'w')
    # read csv
    reader = csv.reader(file(inFilePath, 'r'))
    for row in reader:
        newline = "\t".join(row)
        f.write(newline + '\n')
    f.close()

readerにclose()がなかった。自動的に開放されるみたい。

2010年3月8日月曜日

Python 亡記録2題

■ディレクトリ
作業ディレクトリーを変更する
import os
os.chdir(パス名)
現在の作業ディレクトリーを確認する
os.getcwd()


■for関連
2つのシーケンスを同時に回す
a = [1,2,3]
b = [4,5,6,7]
for x, y in zip(a,b):
    print x, y
1 4
2 5
3 6

シーケンスでインデックスと同時に要素を取り出す
a = [5,6,7,8,9]
for i, x in enumerate(a):
    print i, x
0 5
1 6
2 7
3 8
4 9

いつも忘れちゃうんだよな。歳だな。

2010年3月6日土曜日

Python リストのソート2

最初の要素は昇順、2番目の要素は降順

>>> score1 = [2,2,1,1,1,4,4,4]
>>> score2 = [3,4,4,2,1,1,2,2,]
>>> score = zip(score1,score2)
>>> sorted(score,key=lambda x:(x[0],-x[1]),reverse=False)
[(1, 4), (1, 2), (1, 1), (2, 4), (2, 3), (4, 2), (4, 2), (4, 1)]

ほほう

Python リストのソート

>>> name
['yamada', 'suzuki', 'yokoyama', 'takai', 'kashiwagi']
>>> old
[45, 21, 78, 16, 56]
>>> height
[166, 176, 170, 155, 149]
>>> weight
[78, 67, 82, 66, 53]
>>> country
['USA', 'Japan', 'Canada', 'Korea', 'UK']
>>> db = zip(name,old,height,weight,country)
>>> sorted(db,key=lambda x:(x[0],x[1]),reverse=False)
[('kashiwagi', 56, 149, 53, 'UK'), ('suzuki', 21, 176, 67, 'Japan'), ('takai', 1
6, 155, 66, 'Korea'), ('yamada', 45, 166, 78, 'USA'), ('yokoyama', 78, 170, 82,
'Canada')]

ほう

Python リストの連結

忘れそうだから亡記録


>>> a
[0, 1, 2, 3, 4]
>>> b
['a', 'b', 'c', 'd', 'e']
>>> a+b
[0, 1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e']
>>> zip(a,b)
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e')]

Python リストの抽出

Pythonではリストの抽出にスライスに
リスト[開始位置:終了位置]
という構文を使うが、なんか慣れない。


>>> a = [0,1,2,3,4,5]
>>> a[0:3]
[0, 1, 2]

終了位置の値は返さないらしい。

なんか違和感を覚えてしまう。

2010年2月27日土曜日

PythonでOpenBabelを使う ~Pybelを使う

PybelはOpenBabelの様々なクラス・メソッドの中でよく使う物をPython用に定義したお便利環境です。

詳細は
http://openbabel.org/wiki/Using_OpenBabel_from_Python#Pybel
http://openbabel.org/pybel.html

例えばSDファイルを読み込んでMolに変換して構造を表示するのは簡単。


from pybel import *


inSdFilePath = "test.sdf"
mols = readfile("sdf", inSdFilePath)
for mol in mols:
    mol.make3D()
    mol.draw()      #OASAがインストールされていれば構造を表示する

PythonでOpenBabelを使う ~SDファイル

とりあえず基本的なやつ。

openbabeltest.py
# coding: shift-jis

from openbabel import *

def ReadSdFile(inSdFilePath="test.sdf"):
    #inSdFilePath = "test.sdf"
    conv = OBConversion()
    answer = conv.SetInAndOutFormats("sdf","can")
    mol  = OBMol()
    end_flag = conv.ReadFile(mol,inSdFilePath)
    smiles = []
    while end_flag:
        smile = conv.WriteString(mol).split('\t')[0]    # Smiles文字のみをSplitする
        smiles.append(smile)
        answer = mol.Clear()
        end_flag = conv.Read(mol)
    return smiles
    
# main
smilesStrigList = ReadSdFile()
for smiles in smilesStrigList:
    print smiles

コマンドプロンプト
I:\Python>python openbabeltest.py
ClCC(=O)NC1=C(SCC1)C(=O)OC
COC(=O)C1=C(CCS1)NC(=O)c1ccccc1
COC(=O)C1=C(CCS1)NC(=O)c1cccc(C)c1
COC(=O)C1=C(CCS1)NC(=O)c1ccccc1Cl
COC(=O)C1=C(CCS1)NC(=O)c1ccc(C)c(C)c1

PythonでOpenBabelを使う

TIBCO Spotfire3.1が欧米でリリースされ、日本国内でも近々リリースされると思います。

今回のリリースでの目玉はTextView上でのスクリプトの実行が可能になり、ガイドっぽいことができるようになるのとHeatMapのサポート、Bar&LineChartなどいろいろありますが(詳細)、地味ですがIronPythonのScriptのサポートがあります。

これを機にちょっとPythonを勉強しておこうと思って、環境を作ります。詳細はこちら

  1. Python2.6をインストール http://www.python.org/download/
    • 最新版は3.1なのですがOpenBabelで構造表示に使うPILとOASAが2.6までしか対応していないので。
  2. Pythonのパスを設定
  3. OpenBabel GUIをインストール
  4. OpenBabelのパスを通す
    1. PATHにI:\Program Files\OpenBabel-2.2.3を追加
  5. 環境変数「BABEL_DATADIR」をセット
    1. 例えば、set BABEL_DATADIR=I:\Program Files\OpenBabel-2.2.3な感じ
  6. OpenBabel Python bindingsをインストール
    1. PILとOASAをインストール、いずれもPython2.6用を入れます
    2. OpenBabelのWebにあるテストスクリプトを動かしてみる
    テストスクリプトのうち「mol.make3D()」を実行してみて、
    ==============================
    *** Open Babel Error  in OpenBabel::OBForceFieldMMFF94::ParseParamFile
      Cannot open parameter file
    こんなエラーが出る場合は、環境変数のBABEL_DATADIRが正しくセットされていない時です。コマンドプロンプトでecho %BABEL_DATADIR%とやってみてOpenBabelのGUIのインストールフォルダーが出ることを確認しましょう。

    2010年2月21日日曜日

    Haskell入門その4

    再帰処理
    ---------------------------------------
    --  Listの長さを取得する
    ---------------------------------------
    mylength          :: [a] -> Integer  -- 型宣言
    mylength []       = 0                -- リストの最後の定義
    mylength (x:xs)   = 1 + mylength xs  -- 先頭以外のリストを再帰計算
    {-
      x=最初の要素、xs=残りのリスト
      head                    :: [a] -> a
      head (x:xs)             =  x
      tail                    :: [a] -> [a]
      tail (x:xs)             =  xs

      使い方
      I:\haskell>ghci
      Prelude> :l test012.hs
      *Main> mylength [1..999]
      999
    -}

    ちょっとわかってきたような気になってきたことが示唆される

    2010年2月20日土曜日

    Haskell入門その3

    module Main
      where

    import IO
    import Random

    main = do
      hSetBuffering stdin LineBuffering
      num <- randomRIO (1::Int, 100)
      putStrLn "I'm thinking of a number between 1 and 100"
      doGuessing num

    doGuessing num = do
      putStrLn "Enter your guess:"
      guess <- getLine
      let guessNum = read guess
      if guessNum < num
        then do putStrLn "Too low!"
                doGuessing num
        else if read guess > num
        then do putStrLn "Too high!"
                doGuessing num
        else do putStrLn "You Win!"
        
    これをコンパイルしてみた

    I:\haskell>ghc --make test011.hs -o test011.exe


    なんじゃ、このバカでかいファイルは!?

    Haskell入門その2

    回帰


    {----------------------------
      N!
    -----------------------------}
    my_factorial 1 = 1
    my_factorial n = n * my_factorial (n-1)
    {----------------------------
      べき乗
      a^b
    -----------------------------}
    my_exponent a 1 = a
    my_exponent a b = a * my_exponent a (b-1)
    {----------------------------
      フィナボッチ数列
      n番目のフィナボッチ数を求める
    -----------------------------}
    fina 1 = 1
    fina 2 = 1
    fina n = fina (n-2) - fina (n-1)
    {----------------------------
      a : b
    -----------------------------}
    mult a 0 = 0
    mult a b = a + mult a (b-1)

    GHCIからhsファイルを読み込む


    I:\haskell>ghci
    Prelude> :l test008.hs
    *Main>

    Haskell入門その1

    test001.hs

    module BMI where
    type BMI = Double
    stdBMI :: BMI
    stdBMI = 22.0
    type Height = Double
    type Weight = Double
    bmi :: (Height, Weight) -> BMI
    bmi (h,w) = w / (h ^ 2)



    コマンドプロンプト


    I:\haskell>ghci test002.hs
    GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help
    Loading package ghc-prim ... linking ... done.
    Loading package integer-gmp ... linking ... done.
    Loading package base ... linking ... done.
    Loading package ffi-1.0 ... linking ... done.
    [1 of 1] Compiling BMI ( test002.hs, interpreted )
    Ok, modules loaded: BMI.
    *BMI> bmi(1.71,79.5)
    27.18785267261722



    う~む、まだ楽しくない

    2010年2月13日土曜日

    IUPAC名からSmilesを起こす

    ということで苦労しまくったIUPAC名からSmilesを起こすプロジェクトですが、最終的には以下のような流れになりました。

    1)Opsin0.5.3でIUPAC名をCMLに変換
    2)CDKでCMLをIMoleculeに変換
    3)CDKでIMoleculeからMolファイル形式に変換
    4)OpenBabelでMolファイルからSmilesに変換

    フォームアプリケーション的はコードを書きます。Smilesにするだけなら2次元構造は必要なないのですが、忘記録的に入れときます。この流れがdelegateでも動いたらOkですな。




    using System;
    using System.Windows.Forms;
    using System.IO;
    using System.Diagnostics;


    using org.openscience.cdk.io;
    using org.openscience.cdk;
    using org.openscience.cdk.interfaces;
    using org.openscience.cdk.layout;
    using java.io;


    using uk.ac.cam.ch.wwmm.opsin;
    using OpenBabel;



    namespace OpsinTest
    {
        public partial class Form1 : Form
        {
            NameToStructure nts = null;



            public Form1()
            {
                InitializeComponent();
                nts = new NameToStructure();
            }



            private void button3_Click(object sender, EventArgs e)
            {
                string IUPAC = textBox1.Text;


                try
                {
                    textBox2.Text = "";
                    Application.DoEvents();


                    // Create CML from IUPAC name (Opsin)
                    string cml = nts.parseToCML(IUPAC).toXML();
                    
                    // Convert CML to IMolecule (CDK)
                    StringBufferInputStream str_stream  = new StringBufferInputStream(cml);
                    
                    CMLReader cmlr = new CMLReader();
                    cmlr.setReader(str_stream);


                    ChemFile chemFile = new ChemFile();
                    ChemFile chem = (ChemFile)cmlr.read(chemFile);


                    IMolecule mol = chem.getChemSequence(0).getChemModel(0).getMoleculeSet().getMolecule(0);


                    // Convert from IMolecule to SD (CDK)
                    java.io.StringWriter sww = new java.io.StringWriter();
                    MDLWriter mw = new MDLWriter(sww);
                    StructureDiagramGenerator sdg = new StructureDiagramGenerator();


                    sdg.setMolecule(mol);
                    sdg.generateCoordinates();
                    mol = sdg.getMolecule();
                    mw.write(mol);
                    string sd = sww.toString();


                    // Convert from SD to smiles (OpenBabel)
                    OBMol obMol = new OBMol();
                    OBConversion obConv = new OBConversion();
                    if (!obConv.SetInAndOutFormats("mol", "can")) { return; }
                    if (!obConv.ReadString(obMol, sd)) { return; }


                    textBox2.Text = obConv.WriteString(obMol);


                    obMol.Dispose();
                    obConv.Dispose();
                    obMol = null;
                    obConv = null;
                }
                catch (Exception ex)
                {
                    string mes = ex.Message;
                    textBox2.Text = mes;


                }
            }

        }
    }

    OBConversionでメモリーリーク?

    OpenBabelの構造コンバーターの「OBConversion」はめちゃくちゃたくさんの構造フォーマットに対応した便利なConverterなんですが、どうも変な動きをすることがあります。

    たとば、下記のようにMolの配列にSmiles文字列の配列をConvertしながら入れる場合、下記のコードはVisualStudioでは特に問題ありません。

    (コードA)
    for(i=0; i < 3; i++)
    {
        OBConversion conv = new OBConversion();
        conv.SetInAndOutFormats("smi", "can");
        conv.ReadString(obMol[i], obSmi[i]);
    }

    しかし下記のコードのように、CML文字列を変換する場合、実行中は何も問題ないのですが、終了するとメモリーエラーを起こします。

    (コードB)

    for(i=0; i < 3; i++)
    {
        OBConversion conv = new OBConversion();
        conv.SetInAndOutFormats("cml", "can");
        conv.ReadString(obMol[i], obCml[i]);
    }

    これは正しくは、こうするべきです。

    (コードC)
    for(i=0; i < 3; i++)
    {
        OBConversion conv = new OBConversion();
        conv.SetInAndOutFormats("cml", "can");
        conv.ReadString(obMol[i], obCml[i]);

        conv.Dispose();
        conv = null;
    }

    つまり、使用後のOBConversionインスタンスはちゃんと破棄する必要があります。このコードでは終了しても何もエラーがなく正常に動きます。

    ただ不思議なのはコードAではメモリーエラーを起こさず、コードBではエラーを起こす点です。

    想像するにCMLのConvertで何か内部的なメモリーの破棄忘れがあって、破棄しない場合にメモリーリークを起こしているではと思ってます。

    さらにはコードCでもメモリーエラーを起こす場合があります。これはコードCを含む関数をdelegateで使う場合で、OBConversionのインスタンスが正常に破棄されず、ReadStringの箇所でメモリーエラーを起こします。

    ということで、実用問題としてOpenBabelのCML変換は使えない、という結論に達しました。

    これがわかるのに2日もかかりました。

    ということでCML変換はCDKでやることにしました。その内容はまた別に書きます。

    OpsinをC#で使う

    以前に.NETでCDKを使うで書いたように、JAVAの実行ファイル(.jarファイル)を.NETのclass library(dllファイル)にConvertする方法を使えば、いろいろなJavaの便利環境を.NETで使うことができます。

    今回は私の心の師匠のkさんのhttp://blog.kzfmix.com/entry/1214827204で使っていたOpsinを.NETで使えるか試してみました。

    Opsinは化合物のIUPAC名をCMLに変換するモジュールで、CMLからさらにSDやSmilesなどに変換することができます。これを使えば、論文や特許に記載されている化合物の文字列から構造を起こすことができるという優れものです。

    使ったOpsinはOscar3に入っているOpsin-0.5.3.jar。実は最初に0.1.0を試したのですが、どうもIUPACの認識率が低く、使い物にならんなーと思って諦めかけたのですが、このバージョンになってだいぶ良くなったので使うことにしました。

    いつもどおりにIKVMでjarをdllに変換します。このときkeyfileがあれば指定することもできます。keyfile付きで変換することで「厳格な名前」付きdllにすることができるというわけです。

    出来上がったdllをVisualStudioのC#のプロジェクトにいれます。そして

    using OpenBabel;
    using uk.ac.cam.ch.wwmm.opsin;


    NameToStructure nts = new NameToStructure();
    string cml = nts.parseToCML("4-iodobenzoic acid").toXML();


    OBMol obMol = new OBMol();
    OBConversion conv = new OBConversion();
    conv.SetInAndOutFormats("cml", "can");
    conv.ReadString(obMol, cml);
    string smiles = conv.WriteString(obMol);
    string[] smile = smiles.Split(new string[] { "\t" }, StringSplitOptions.None);
    string result = smile[0];

    こんな流れのコードを使えばIUPAC名からSmiles文字列を作ることができます。

    ただ、特許や論文のIUPAC名はけっこういい加減で、" ' - などの使い方、あるいは半角スペースの入り方でOpsinがエラーを吐くことが多いです。Opsinに渡す前にIUPAC名のCleanが必要なようです。

    またここで書いたOBConversionクラスですが、どうもメモリーリークがありそうなので、CMLの変換には使わない方が良いでしょう。このあたりについては次に・・・・

    2010年2月4日木曜日

    Spotfire DecisionSiteで.NET

    ずっとTIBCO Spotfire+C#で仕事していると、たまにSpotfire DecisionSiteのスクリプトをいじらなきゃいけなくなったときに超めんどくさくなります。

    なんといってもデバッグできない。昔はしこしこJavascriptでAlertとかログファイルに書き出したりしてなんとか構築したのに、もう戻れなくなっている。

    ということで、DecisionSiteでVisualStudio C#を使う方法を検討しました。もちろん直接Javascriptのデバッグもできるとは思いますが、それじゃ面白くないので、C#でクラスライブラリーを作ってそれを参照させることにしました。

    VisualStudio C#でクラスライブラリーを作ります。このとき「COM参照」ができるようにPropertiesを設定しておきます。

    ClassはPublicで作って普通にコンパイルするとdllとtblファイルが出来ます。この2つのファイルをDecisionSiteのガイドやツールに登録してやればJavascriptのnew ActiveX(<namespace.class名>)で使えるようになります。あとは登録したpublic methodを呼べば使えるというわけです。

    思っていたより結構気軽なので、よく使うレコードセット処理や文字列処理を入れて使う予定です。

    2010年2月2日火曜日

    TIBCO SpotfireとOracle Procedure

    TIBCO SpotfireではOracleのテーブル、ビューに加えてProcedureに対応しています。Procedureというより、REF CURSORで返されるデータセットを受け取れるといったほうが正確ですね。

    具体的には、Packageとして作成したFunctionでREF CURSORとして返すような動的なSQLを作ることで、柔軟なOracleクエリーの結果を受け取ることができます。

    これが意外と便利で、作り方によっては同じクエリーでもユーザごとに異なる結果をとったり、テーブルをまたいだ結果をとったり、ユーザ操作をハックして選択したデータに応じた結果を取得できます。

    もちろん通常の操作で、データの更新や追加、消去などをProcedureに入れることで、SpotfireからOracleのデータテーブルの操作もできます。

    一度トライしてみてください。

    2010年1月28日木曜日

    SOM

    TIBCO SpotfireでSOMをすべく、R Integrationを作ってます。

    とりあえず版はできたけど、精度が大丈夫なのかがよく分からない。DSの結果と比べて検証しなきゃ。

    2010年1月26日火曜日

    OpenBabelでOBMolインスタンスのコピー

    OpenBabelでOBMolのインスタンスをコピーする時、デバッグに苦労する現象に遭遇しました。

    OBMol mol1 = new OBMol();
    OBMol mol2 = new OBMol();
    (この間、mo1,2lの操作をする)
    mol1 = mol2;

    この代入でエラーは出ませんが、mol1のインスタンスは非常に不安定で、突然消えたりします。

    これは、mol1のインスタンスのメモリー領域がmol2で上書きされることで、(おそらく)mol1のポインターが確保されないまま操作されていることによります。たちの悪いことに、この操作でのエラーは何も出ません。

    mol1にmol2を上書きする場合は

    mol1 = new OBMol(mol2)

    として、mol1をちゃんと初期化してmol2をコピーしましょう。

    これが原因で10日ほど悩みました。

    2010年1月23日土曜日

    構造編集用の.NET Framework Class library:Hyleos

    構造編集に便利そうな.NET Framework Class libraryを見つけました。

    http://www.hyleos.net/

    このサイトが会社なのか有志なのか分かりません。少なくともOpen Sourceではなさそうです。でもFreeでの配布とのことでちょっと使ってみました。

    ここで配布しているClass libraryを使うと、構造編集用のBoxが使えて、ダブルクリックでDrawingソフトが起動し、構造の修正ができます。

    ISISのStructure Boxのような感じで、とりあえずSymyx Drawとの連動は正常に動作しました。

    構造編集ソフトとの連携が通常のようにMIMEタイプでやり取りしていればほとんどのDraw系ソフトと連携できるはずで、ISIS Drawとの連携も出来そう。

    Boxからの構造の取り出し、Smiles変換機能など、必要な機能は一通り揃っています。OpenBabelへのSmilesでの連携も確認できました。

    早速、月曜日に試してみようっと。ちゃんと動作すればTIBCO Spotfireへ組み込んでみよう。

    2010年1月20日水曜日

    Oracleでも正規表現が使える

    Oracleの格納した文字列に対して10g以上では正規表現が使えるようです。

    http://www.atmarkit.co.jp/fdb/rensai/sqlclinic01/sqlclinic01_1.html

    化合物の部分構造情報を文字列としてCLOBに格納しておいても正規表現で検索できるので何かに使えそう。

    select CompId from CompDB where REGEXP_LIKE(CompKey, 'c1ccccc1|C1CCCCC1')

    でベンゼンとシクロヘキサンを含む構造が取得できるとか。

    2010年1月19日火曜日

    TIBCO Spotfire上でsdf2smi

    っつーわけでCDKをTIBCO Spotfireに組み込んでsdf2smi、Daylightで言うところのmol2smiを作ってみました。

    とりあえず動きました。とりあえずというのは遅い!もう速くするのが課題。

    ついでに言うと、OpenBabelを使ったsmi2sdf、Daylightでいうところのsmi2molも組み込みました。こちらはそこそこ実用的な速度が出てます。

    このあたり、JavaのLibraryを少し無理に.NET Frameworkに移した影響があるのかも。
    ようはOpenBabelが早く2D変換をサポートしてくれれば済むのですが。

    2010年1月17日日曜日

    JMEも.NETで使える

    JMEも.NETで使えるらしい。

    http://chemhack.com/archives/tag/chemoinformatics/

    .NETでCDKを使う

    CDKはjavaのmolecular class libraryのようなものです。java版のpipeline pilotであるKnimeではメインのChemistry engineとして採用されています。

    CDKを.NET環境で使うためのやり方が紹介されていたのでやってみました。

    Using the CDK with the .Net framework and Mono

    まずjavaのjarファイルを.NETのクラスライブラリー化するためのツールIKVMをダウンロードします。私が落としたのは「ikvmbin-0.42.0.3」です。

    ついでCDKのjarファイルを落とします。私が落としたのは「cdk-1.2.4.1.jar」です。

    IKVMを使ってこのCDKをdll化します。
    コマンドプロンプトでikvm.exeのあるフォルダーに移動して

    ikvmc -assembly:cdk_dotnet -target:library cdk-1.2.4.1.jar

    と打つとcdk_dotnet.dllが出来ます。この際にWarningが多く出ますが無視。

    VisualStudio2008のC#のコンソールアプリケーションを作成して、参照設定にcdk_dotnet.dllを含めikvmのbinフォルダーの中のdllをすべて登録します。



    これでCDKが使えるようになりました。

    具体的なコードは上記のサンプルコードを参照してください。Molファイルを読み込んで計算値を出力してくれました。

    using System;

    namespace CDK_test
    {
        //Using aliases for convenience and to avoid importing whole
        //packages
        using FReader = java.io.FileReader;
        using TPSA = org.openscience.cdk.qsar.descriptors.molecular.TPSADescriptor;
        using LogP = org.openscience.cdk.qsar.descriptors.molecular.XLogPDescriptor;
        using DoubleResult = org.openscience.cdk.qsar.result.DoubleResult;
        using Builder = org.openscience.cdk.DefaultChemObjectBuilder;
        using IMol = org.openscience.cdk.interfaces.IMolecule;
        using MolReader = org.openscience.cdk.io.iterator.IteratingMDLReader;
        using Consts = org.openscience.cdk.CDKConstants;

        class Program
        {
            static void Main(string[] args)
            {
                FReader fReader = new FReader("C:\Test.mol");
                MolReader molReader = new MolReader(fReader, Builder.getInstance());
                IMol mol;
                DoubleResult dr;
                LogP logP = new LogP();
                TPSA tpsa = new TPSA();
                double logPVal, tpsaVal;
                string name;

                while (molReader.hasNext())
                {
                    mol = (IMol)molReader.next();
                    dr = (DoubleResult)logP.calculate(mol).getValue();
                    logPVal = dr.doubleValue();
                    dr = (DoubleResult)tpsa.calculate(mol).getValue();
                    tpsaVal = dr.doubleValue();

                    //the title of each mol in the file is the name of the mol
                    name = (String)mol.getProperty(Consts.TITLE);

                    Console.WriteLine("{0} {1} {2}", name, logPVal, tpsaVal);
                }
                Console.ReadLine();
            }
        }
    }

    今回は純粋な.NETのclass libraryしか参照していないので、そのままSpotfireのツールに出来そうです。

    2010年1月15日金曜日

    OpenBabelをTIBCO Spotfireへ実装する

    OpenBabelをTIBCO Spotfireへ実装することにしました。

    Spotfireはご存知の通り、大量データの可視化ツールですが、開発環境にC#を採用することで、適用できるツールの範囲が広がりました。

    もちろんOpenBabelの.NETモジュールを使うことでTIBCO Spotfireなら比較的簡単に実装が可能です。

    ひとつ問題があります。旧タイプのDLL(Win32 APIなどを呼び出すときの仕様)はVisualStudioでは使用可能ですが、TIBCO SpotfireのBuilderでは登録を拒否されます。このあたりは要改善事項です。

    OpenBabel .NETはこのタイプのDLLを使っているので、そのままでは登録できません。

    あれやこれやと悩んだのですが、ようやく解決策が見つかりました。DLLのファイルをいったん拡張子をtxtにします。TextファイルならSpotfireのBuilderも安心して登録することが出来るのでClientに送信が出来ます。起動するときにこれらのTextファイルの拡張子をdllに戻してやります。するとOpenBabelがちゃんとdllを認識して動作するというわけです。

    なんかウィルスの動きをミミックしているみたいで、どうゆうわけかやな気分ですが、とりあえず動きそうなんで、この仕様でがんばろうっと。

    2010年1月12日火曜日

    Smilesから2D構造を表示する

    Smiles文字列を見ただけで2D構造が浮かぶ人ようなすごい人はいいのですが、全く浮かばない私はSmilesから2D構造を表示して見たいわけです。

    通常はDaylight Toolkitのsmi2molを使ってSmilesをSDファイルに変換してからISISやSpotfireなどで見る訳ですが、WindowsとUnixを行ったり来たりするのはうざい。なんとかWindows環境だけで2D構造を起こせないかと探していたらありました。


    Indigoの中のDingoというモジュールを使えばSmilesやSmartsに加えてMolファイルやRxnファイルを読み込んで、構造を画像(PDF、PNG、SVG、HDC、Bitマップ、Metaファイル)として出力できます。とりあえず見るという目的ならこれで充分。

    しかも.NET Class LibraryもついているのでVisualStudioですぐに動かせます。TIBCO SpotfireのRendererにも転用可能です(というかもう作った)。

    これで座標の入ったMolファイルとしても出せればいいのですが、調べたところでは出来なさそう・・・。