2010年3月28日日曜日

OpenCLマスターへの道 - ATI Stream SDK 編 第三話

今回は、ハローワールドまでたどり着く予定。

その前に、現時点での装備品を確認しておく。

本 : 「OpenCL 入門 - マルチコア CPU ・ GPU のための並列プログラミング」
OS : Windows Vista Business 64bit SP2
CPU : AMD Phenom(tm) II X4 955 Processor 3.2GHz
メモリ : 8GB
グラフィックカード : ATI HD4890 1GB
グラフィックドライバ : ATI Catalyst Control Center バージョン 2009.1124.2131.38610
統合開発環境 : Visual C++ 2008 Express Edition
OpenCL 環境 : ATI Stream SDK v2.01 Vista & Windows 7  64bit (以下 Stream SDK と記述)

作業は、インストールした Stream SDK のドキュメント「ATI Stream SDK Getting Started Guide」にそって行うこととする。
ドキュメントを読むと、Windows 用の Stream SDK には、以下のものが含まれると書いてある。
  • OpenCL コンパイラーおよびランタイム
  • ATI CAL ヘッダーファイルおよびコンパイル用ライブラリ(CAL 用の DLL ライブラリは、現在 ATI ディスプレイドライバーの一部であり、Stream SDK には含まれない。らしい・・・)
  • 開発者用ドキュメント
  • サンプルアプリケーション
  • サンプルアプリケーションのドキュメント
  • プロファイラー(なんだろう?)
CAL 用の DLL ライブラリの辺りが気になる。ディスプレイドライバのバージョンで問題がでるかもしれず。

次に、ビルドのやり方のサンプルに取り掛かる。
インストールしたStram SDK のサンプルプログラムの、OpenCLSamples.sln ファイル(サンプルをインストールしたディレクトリの opencl の中にある)を Visula Studio で開く。

”ソリューション フォルダはこのバージョンのアプリケーションではサポートされていません。”だと!?
”ソリューション フォルダ { cl、cpp_cl、app、app(2)、SDKUtil }は使用できないものとして表示されます。” だって。ふーん

”ソリューションに関連付けられているプロパティのいくつかを読み取れませんでした。”
 ・・・ ぜんぶまとめて華麗にスルー!

Visual Studio の「ビルド」メニューから「ソリューションのビルド」を選択する。

うがっ、エラーが1個でた。どうやらファイルがコピーできないらしい。どいつだ?

samples\opencl\cl\app\BoxFilter\Debug\Win32\BuildLog.htm に出力されたエラーログを確認すると、BoxFilter_Input.bmp をコピーしている箇所のようだ。

samples\opencl\cl\app\BoxFilter の中には該当のファイルがない。しょうがないので、ファイル検索をしてみると、samples\opencl\bin\x86 の下に見つけた。
samples\opencl\cl\app\BoxFilter にコピーして、BoxFiler を右クリックして「追加」-「既存のファイル」でファイルを追加した。

再び「ビルド」メニューから「ソリューションのビルド」を選択。

今度は成功した。


では、早速実行してみる。

スタートアッププロジェクトが、BitonicSort になっていたので、そのままこれを実行してみる。

「デバッグ」メニューから「デバッグなしで開始」を選択して実行。

コマンドラインで実行されていかのような結果となった。


Unsorted Input
65 226 252 161 146 128 217 169 89 79 179 41 243 93 111 218 135 191 172 174 60 143 252 222 42 176 173 25 245 165 102 87 113 68 48 90 59 139 26 104 175 91 25 66 32 113 86 227 195 73 137 10 38 86 141 30 169 52 213 112 219 51 235 96

Executing kernel for 1 iterations
-------------------------------------------

Output
252 252 245 243 235 227 226 222 219 218 217 213 195 191 179 176 175 174 173 172 169 169 165 161 146 143 141 139 137 135 128 113 113 112 111 104 102 96 93 91 90 89 87 86 86 79 73 68 66 65 60 59 52 51 48 42 41 38 32 30 26 25 25 10



どうやらソートをするプログラムらしい。結果を見る限り大丈夫そうだ。

他も実行してみる。
HelloCL プロジェクトを右クリックして、「スタートアップ プロジェクトに設定」を選択する。

「デバッグ」メニューから「デバッグなしで開始」を選択して実行。


HelloCL!
Getting Platform Information
Creating a context AMD platform
Getting device info
Loading and compiling CL source
Running CL program
Done
Passed!


おお、動く動く!

というわけで、今回はここまで。

OpenCLマスターへの道 - ATI Stream SDK 編 第二話

前回撃沈された ATI Stream SDK インストールに再チャレンジ!

インストーラーでのインストールが不調に終わったのだが、何気なしにインストーラーが解凍したインストール実行ファイル(C:\ATI\SUPPORT\streamsdk_2-0-1_win764\Setup.exe)を直接実行してみた。

言語サポートを「日本語」のまま「次へ」ボタンを押す。お、なんかいけるっぽい。


「インストール」ボタンを押す。


・・・やっぱりだめ。。。


しかたなくネットを彷徨ってみると、ここの情報によってこのパッチを当てればいいことが分かった。
早速パッチを当て、再び上記の「インストール」ボタンを押してみた。




「インストーラへようこそ」・・・・・・やったやりました!ありがとう!ありがとう!パッチ情報を載せてくれた人!

では、続きを。
折角なので「カスタム」を選択し、「次へ」ボタンを押す。




全てチェックしたまま、「次へ」ボタンを押す。



ライセンスをよく読んでから、同意できるなら「受諾する」ボタンを押す。



「Next」ボタンを押す。



インストール先を指定して、「Next」ボタンを押す。



ライセンスをよく読んでから、同意できるなら”I accept the terms in the license agreement”を選択してから、「Next」ボタンを押す。




「Install」ボタンを押す。


「Finish」ボタンを押す。


次に、サンプルのインストールが自動的に始まる。「Next」ボタンを押す。


サンプルのインストール先を指定して、「Next」ボタンを押す。


ライセンスをよく読んでから、同意できるなら”I accept the terms in the license agreement”を選択してから、「Next」ボタンを押す。


「Install」ボタンを押す。


「Finish」ボタンを押す。


次に、プロファイラーのインストールが自動的に始まる。プロファイラーってなんだろう?
とりあえず「Next」ボタンを押す。


ライセンスをよく読んでから、同意できるなら”I accept the terms in the license agreement”を選択してから、「Next」ボタンを押す。


インストール先を指定して、「Next」ボタンを押す。


「Next」ボタンを押す。


「Finish」ボタンを押す。


「終了」ボタンを押して、インストーラーを終了する。
インストール完了。長かった・・・


インストール後は、このようなディレクトリ構成になる。


以上でインストールは完了!

2010年3月20日土曜日

OpenCLマスターへの道 - ATI Stream SDK 編 第一話

Amazon にやられた。うっかり「OpenCL入門」なる本を買ってしまった。
 というわけで、無謀にも並列プログラミングに足を突っ込むことにした。

考えれば、CPUはクアッドコアだし、GPUはそこそこだし。
やっぱり並列プログラミング・だ・よ・ね!

うちの環境は AMD Phenom II X4 で ATI Radeon なので、OpenCLと言えば当然 ATI Stream SDK になるわけだす。

と言うわけで ATI Stream SDK を AMD のページから落としてくる。
うちの OS は Vista 64bit なので ati-stream-sdk-v2.01-vista-win7-64.exe を落としてきた。

 早速インストールする。
 実行すると、解凍する必要があるらしいので、適当な所に Unzip ボタンを押して解凍する。



解凍完了。OKボタンを押す



こんな画面が表示されるので、そのまま次へボタンを押す。



こんな画面が出てきた。インストール続行不能。以上おわり。



むむう。SP2 には対応していないのか?
今回は、ここで断念。

2010年2月1日月曜日

OpenOffice.org と Python マクロ 3 限目

今回は、OpenOffice.org Calc をターゲットにしてみる。

以下のソースコードを helloCald.py として保存する。

#!
# -*- coding: utf_8 -*-

import uno
from com.sun.star.beans import PropertyValue

def helloCalc():
    uri = "private:factory/scalc"
    p = PropertyValue()
    p.Name = "Hidden"
    p.Value = True
    properties = (p,)
    desktop = XSCRIPTCONTEXT.getDesktop()
    calc = desktop.loadComponentFromURL(uri, "_blank", 0, properties)

    sheets = calc.getSheets()
    sheet = sheets.getByIndex(0)
    sheet.setName("helloSheet")

    cell = sheet.getCellByPosition(1, 2)
    cell.setString("The Price")
    cell2 = sheet.getCellByPosition(1, 3)
    cell2.setValue(99.95)

    p = PropertyValue()
    p.Name = 'Overwrite'
    p.Value = True
    properties = (p,)
    calc.storeAsURL("file:///f:/helloCalc.ods", properties)
    calc.dispose()
   
def message(msg = "", title = ""):
    desktop = XSCRIPTCONTEXT.getDesktop()
    frame = desktop.getCurrentFrame()
    win = frame.getContainerWindow()
    toolkit = win.getToolkit()
    rect = uno.createUnoStruct("com.sun.star.awt.Rectangle")
    msgbox = toolkit.createMessageBox(win, rect, "messbox", 1, title, msg)
    msgbox.execute()

g_exportedScripts = helloCalc,


 実行すると、F ドライブの直下に helloCalc.ods ファイルが作成される。
うちの環境だと、C ドライブに保存しようとすると。

com.sun.star.uno.Exception (Error during invoking function helloCalc in module file:///C:/Users/shadow/AppData/Roaming/OpenOffice.org/3/user/Scripts/python/helloCalc.py (:
  C:\Users\shadow\AppData\Roaming\OpenOffice.org\3\user\Scripts\python\helloCalc.py:29 in function helloCalc() [calc.storeAsURL("file:///c:/helloCalc.ods", properties)]
  C:\Program Files (x86)\OpenOffice.org 3\Basis\program\pythonscript.py:773 in function invoke() [ret = self.func( *args )]
))


というようなエラーが発生する。
他に D, E ドライブで試したが、問題ない。なぜ C ドライブだけだめなのだろうか?
さっぱどわがんねぇ

2010年1月30日土曜日

OpenOffice.org と Python マクロ 2 限目

今回は、OpenOffice.org Base で登録したデータベースにアクセスしてみる。

では、OpenOffice.org Base を起動する。
起動したら、適当に新規データベースを登録する。

登録されているデータベースを確認してみる。
メイン画面で、「ツール」メニュー > 「オプション」を選択する。
オプション画面が開いたら、「OpenOffice.org Base」 > 「データベース」を選択する。
「登録されたデータベース」に、いくつかデータベースがリストされているのを確認する。
ここに表示されれている登録名の一覧を表示するマクロを作成してみる。

以下のソースコードを helloDb.py としてマクロ格納先(1限目を参照)へ作成する。

#!
# -*- coding: utf_8 -*-

import uno

def helloDb():
    msg = getDataSourceNames()
    message(XSCRIPTCONTEXT.getDesktop(), msg, u"データベース一覧")

def getDataSourceNames():
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    dbc = smgr.createInstance("com.sun.star.sdb.DatabaseContext")
    dbNames = dbc.getElementNames()
    result = ""
    for name in dbNames:
        result += name + ", "
    return(result)

def message(desktop, msg = "", title = ""):
    frame = desktop.getCurrentFrame()
    win = frame.getContainerWindow()
    toolkit = win.getToolkit()
    rect = uno.createUnoStruct("com.sun.star.awt.Rectangle")
    msgbox = toolkit.createMessageBox(win, rect, "messbox", 1, title, msg)
    msgbox.execute()

g_exportedScripts = helloDb,


実行すると、メッセージダイアログに登録されたデータベース名がリストアップされているはず。


次に、データベース(ここでは”資産管理”)に登録されているクエリーの一覧を取得してみる。

データベースに適当なクエリーを登録する。
以下のソースコードを helloDbQuery.py として保存する。

#!
# -*- coding: utf_8 -*-

import uno

def helloDbQuery():
    msg = getQueryNames()
    message(XSCRIPTCONTEXT.getDesktop(), msg, u"クエリー一覧")

def getQueryNames():
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    dbc = smgr.createInstance("com.sun.star.sdb.DatabaseContext")
    ds = dbc.getByName(u"資産管理")
    con = ds.getConnection("", "")
    queries = con.getQueries()
    queryNames = queries.getElementNames()
    result = ""
    for name in queryNames:
        result += name + ", "
    return(result)

def message(desktop, msg = "", title = ""):
    frame = desktop.getCurrentFrame()
    win = frame.getContainerWindow()
    toolkit = win.getToolkit()
    rect = uno.createUnoStruct("com.sun.star.awt.Rectangle")
    msgbox = toolkit.createMessageBox(win, rect, "messbox", 1, title, msg)
    msgbox.execute()

g_exportedScripts = helloDbQuery,


実行すると、クエリー一覧が表示される。


次に、SQLを実行してみる。
(ここでは、「資産管理」データベースに「資産」テーブルを、カラム数を 3つで作成してあり、カラムタイプは、 VARCHAR 型としてある。作成した「資産」テーブルには、適当にレコードを追加しておいた。)
以下のソースコードを helloDbQueryResult.py として保存

#!
# -*- coding: utf_8 -*-

import uno

def helloDbQueryResult():
    msg = getQueryResult()
    message(XSCRIPTCONTEXT.getDesktop(), msg, u"クエリー結果一覧")

def getQueryResult():
    ctx = uno.getComponentContext()
    manager = ctx.ServiceManager
    dbctx = manager.createInstance("com.sun.star.sdb.DatabaseContext")
    ds = dbctx.getByName(u"資産管理")
    conn = ds.getConnection("", "")
    stmt = conn.createStatement()

    result = stmt.executeQuery(u"SELECT * FROM \"資産\"")
    msg = ""
    while(result != None and result.next()):
        msg += result.getString(3) + ", "
    return(msg)

def message(desktop, msg = "", title = ""):
    frame = desktop.getCurrentFrame()
    win = frame.getContainerWindow()
    toolkit = win.getToolkit()
    rect = uno.createUnoStruct("com.sun.star.awt.Rectangle")
    msgbox = toolkit.createMessageBox(win, rect, "messbox", 1, title, msg)
    msgbox.execute()

g_exportedScripts = helloDbQueryResult,


実行すると、テーブルに定義したデータの3カラム目の値が全て表示される。


次に、Prepared Statement を使ってみる。
以下のソースコードを helloDbPStmt.py として保存。

#!
# -*- coding: utf_8 -*-

import uno

def helloDbPStmt():
    msg = getQueryResult()
    message(XSCRIPTCONTEXT.getDesktop(), msg, u"クエリー結果一覧")

def getQueryResult():
    ctx = uno.getComponentContext()
    manager = ctx.ServiceManager
    dbctx = manager.createInstance("com.sun.star.sdb.DatabaseContext")
    ds = dbctx.getByName(u"資産管理")
    conn = ds.getConnection("", "")

    stmt = conn.prepareStatement(u"SELECT * FROM \"資産\" WHERE \"AssetName\" like ?")
    stmt.setString(1, u"%株式%")

    result = stmt.executeQuery()
    msg = ""
    while(result != None and result.next()):
        msg += result.getString(3) + ", "
    return(msg)

def message(desktop, msg = "", title = ""):
    frame = desktop.getCurrentFrame()
    win = frame.getContainerWindow()
    toolkit = win.getToolkit()
    rect = uno.createUnoStruct("com.sun.star.awt.Rectangle")
    msgbox = toolkit.createMessageBox(win, rect, "messbox", 1, title, msg)
    msgbox.execute()

g_exportedScripts = helloDbPStmt,


実行すると、3カラム目の内容に”株式”が含まれているものを、中間一致で検索した結果が表示される。

SQL を以下のようにいじった

stmt = conn.prepareStatement(u"SELECT AssetId, 'hoge', ? FROM 資産")

実行してみると、stmt.setString メソッドの箇所で以下のようなエラーとなった
com.sun.star.uno.RuntimeException: 'ascii' codec can't encode characters in position 71-72: ordinal not in range(128), traceback follows
  C:\Program Files (x86)\OpenOffice.org 3\Basis\program\uno.py:327 in function _uno_struct__repr__() [return repr(self.__dict__["value"])]
  C:\Program Files (x86)\OpenOffice.org 3\Basis\program\pythonscript.py:28 in function lastException2String() [ret = str(excType) + ": "+str(excInstance) + "\n" + \]
  C:\Program Files (x86)\OpenOffice.org 3\Basis\program\pythonscript.py:776 in function invoke() [text = lastException2String()]


はは~ん、資産をダブルクォートで囲んでないからだなぁ、と思って以下のように変えて実行した
stmt = conn.prepareStatement(u"SELECT AssetId, 'hoge', ? FROM \"資産\"")


ブブーッ!はずれ!
エラーの内容は変わらず・・・
ウンウン唸って考えて、以下のようにカラム名をダブルクォートで囲ってみた

stmt = conn.prepareStatement(u"SELECT \"AssetId\", 'hoge', ? FROM \"資産\"")


ピンポンピンポ~ン!正解!
試しに、テーブル名のダブルクォートを外してみたら、問題なく動いた・・・なぜ?

まあ、とりあえずは、なんでもダブルクォートで囲っておくことにするか・・・


ようやく、何とかなりそうな気がしてきた。
これで野望に近づける。

まあ、要は、データベースに保存した資産の情報から、現状の資産配分を知りたいのですよ。
データが入れ子になっているので、単純な SQL では難しい・・・

OpenOffice.org と Python マクロ 1 限目

最初に Python マクロの Hello World をと思ったが・・・わからない。なんせ日本語の情報が少ない。
仕方がないので、ネット上を這いずり回った。で以下の情報ソースを確保。

http://hermione.s41.xrea.com/pukiwiki/index.php?OOoPython
http://d.hatena.ne.jp/hanya_orz/20091214/p1
http://udk.openoffice.org/python/python-bridge.html
http://api.openoffice.org/docs/DevelopersGuide/DevelopersGuide.xhtml


気を取り直して作業続行。

まず、環境から整える。
  • OpenOffice.org 3.1.1
    まずこれがないとはじまらない。
  • Python 2.6.1
    マクロを作成するための、エディタとして IDLE を使いたかっただけ。単なるテキストエディタでも、eclipse の Pydev でも、とにかくテキスト編集できて、UTF-8 で保存できればなんでもよい。
IDLE からマクロ実行とかをしたかったのだが、できなかった。
OpenOffice.org は 32bit 版、Python は 64bit 版なのが悪いのかもしれない。
一応手順を書いておくが、この方法で出来る保障はないので悪しからず。
戦略としては、至って簡単。sys.path に UNO パッケージの(uno.py とかがある)場所を追加する。
IDLE 上で以下を実行してみた。(指定したパスは Vista 64bit 版での場合)

>>> import sys
>>> sys.path.append('C:\\Program Files (x86)\\OpenOffice.org 3\\Basis\\program')
>>> import uno

Traceback (most recent call last):
  File "", line 1, in
    import uno
  File "C:\Program Files (x86)\OpenOffice.org 3\Basis\program\uno.py", line 33, in
    import pyuno
ImportError: DLL load failed: %1 は有効な Win32 アプリケーションではありません。


と、怒られた。orz
懲りずに、eclipse(64bit)に Pydev を入れて、OpenOffice.org に付いてきた Python を利用しようとしたら、python.exe を指定したところで、エラーがでた。素直に 32bit にすれば問題ないのだろうが、生憎この PC は、64bit で地獄を見るためのものなので、狙い通りなのだ!

結局 IDLE は、便利なテキストエディタとして使うことにした。

では、再び気を取り直して。
マクロを格納する場所を確認する。Vista 64bit の場合は、以下に格納する。
python ディレクトリは、なかったので作成した。
<ユーザホーム>\AppData\Roaming\OpenOffice.org\3\user\Scripts\python

上記の場所に、helloWorld.py というファイル名で以下の内容を作成する。

#!
# -*- coding: utf_8 -*-

import uno

def helloWorld():
    desktop = XSCRIPTCONTEXT.getDesktop()
    frame = desktop.getCurrentFrame()
    win = frame.getContainerWindow()
    toolkit = win.getToolkit()
    rect = uno.createUnoStruct("com.sun.star.awt.Rectangle")
    title = "title"
    msg = u"メッセージ"
    msgbox = toolkit.createMessageBox(win, rect, "messbox", 1, title, msg)
    msgbox.execute()

g_exportedScripts = helloWorld,

ながい・・・もっとスマートな HelloWorld はないものか・・・
最後の g_exportedScripts は、マクロ実行画面で表示する関数を定義している。この定義をしなかった場合は、ファイル中の全ての関数がリストされる。ちなみに、行の最後のカンマは、タプル値として代入するために必要。

ファイルを作成したら、OpenOffice.org Calc (Base でも Writer でもなんでもいい)を起動して、「ツール」メニュー > 「マクロ」 > 「マクロを実行」を選択。
マクロの選択ダイアログが表示される。
ライブラリの中から、「マイマクロ」 > 「helloWorld」を選択すると、マクロ名に「helloWorld」が表示されるので、選択して「実行」ボタンを押す。
画面にメッセージダイアログが表示されれば成功。

2009年12月9日水曜日

アフィリエイト

AdSense を始めてみた。
自営業なので副収入は(もし入れば)うれしい、というのは実際あるけど、アフィリエイトというもの自体に、興味がある。

どれぐらいクリックされるのか?そもそもクリックされるのか?
そもそも、このニッチなページの需要がどれほどあるのか?
しばらく統計情報をみながらニヤニヤする日々が続くだろう。色々な意味で・・・

そもそも、アフィリエイトに興味を持った理由は、自分が気に入ったものを、如何にして他の人に伝えることができるか。ということを、考えたから。
だから私にとって、収入はおまけなのです。(おまけとはいえ、魅力的だけど・・・)

なぜ、気に入ったものを紹介したいのかというと、「なぜ誰も教えてくれなかったのか・・・」ってことが、ここ数年でかなり増えてきたから。

例えば、本。