かれ4

かれこれ4個目のブログ

metapostで、epsを作った時に拡張子が1と2とかじゃなくて.epsになるようにする

outputtemplate:="%j.%c.eps";
beginfig(1);

〜略〜

endfig;

上のようにoutputtemplateを指定すると、

元々のファイル名が
hoge.mpだったとしたら、
beginfig(1)で指定していた画像は
hoge.1.epsになる。
%jが元のファイル名の拡張子取り除いた文字列
%cがbeginfigの中
になっているっぽい

JAWS Festa Tohoku 2014へ行ってマイペースに発表してきた #jawsug #festa2014

2014年9月6日

JAWS FESTA Tohoku 2014
これで

得上竜一(とくがみりゅういち) | JAWS FESTA Tohoku 2014
これを喋ってきました。


今回しゃべるにあたって、最先端物産展というトラックだったこともあったので、
最近人工知能界隈は
Softbankpepper売るとか言ってきたり、
Google猫論文出してきたり、
人工知能学会誌の表紙が話題
になったり

と、人工知能が何やら盛り上がっているし、今自分の興味の対象が人工知能だしって言うことで、話してきました。


人工知能がそもそも何だっていうのと、人工知能が今までにどんな問題にぶつかって乗り越えてというのがあったのかという歴史と、
今の技術と、クラウドのインフラがあるからこそ解決出来る事とを考えていくと、

あら、今なら人工知能作ることなんて、自分の技術とお財布でも出来そう。身近になったものです。

しかもこれくらいの金額なら、趣味としても、ビジネスとしても成り立つんじゃない?
というお話でした。



いつも、JAWS-UGで話をする時は話を聞きに来た人のうちの2人だけがめちゃくちゃ面白いって言ってくれて、ほかはポカンとしてるくらいを目指しているのだけれど、今回ははずしました。

話の濃さをミスったという反省があるので、資料は公開しません。

Apache UIMAのサンプルを動かす

Apache UIMA面白いですね。

IBMの誇るクイズ王(ワトソン (コンピュータ) - Wikipedia)のソースコード(の一部)がASFに寄贈され、現在も開発が続いているプログラムです。

Mac OSX(10.9.4)でUIMAのサンプルを動かしてみます。

Macと言いつつほぼUnixとして使っているので、Linuxでも同様に動くはずです。

Javaの用意

まずはJavaが必要です。手元の環境ではJDKの1.8.0u5が入っていたので、この機会にJava SE Development Kit 8 - Downloadsからダウンロードして1.8.0u20を入れました。

Mac OSXの場合はJavaはインストールしても自動的に変わるわけではないので、
.profileなどに

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home

を追加しておきます。

$ java -version
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
$ javac -version
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
javac 1.8.0_20

Javaのアップデートが完了したことが確認できました。

Apache UIMAのinstall

Apache UIMA - DownloadsからApache UIMAをダウンロードしてきます。
Apache UIMAには"UIMA AS Asynchronous Scaleout"と"UIMA Java framework & SDK"がありますが、今回はローカルだけで動かすので、"UIMA Java framework & SDK"だけをダウンロードしました。

解凍して、設置した場所(手元では/usr/local/apache-uima)をUIMA_HOMEとして.profile内でexportしておきます。

UIMAを動かしてみる

UIMAには最初から色々と便利なスクリプトが用意されています。

${UIMA_HOME}/bin/documentAnalyzer.sh

実行すると↓こんなWindowが開きました。
f:id:tottokug:20140831011404p:plain

Input Directory: ${UIMA_HOME}/apache-uima/examples/data/
Input File Format: text
Character Encoding: UTF-8
Output Directory:${UIMA_HOME}/examples/data/processed
Location of Analysis Engine XML Descriptor: ${UIMA_HOME}/examples/descriptors/analysis_engine/NamesAndPersonTitles_TAE.xml
XML Tag containing Text(option): 空欄
Language: en

と入力して、Interactiveを押すと、なんか入力出来そうなフォームが出てきました。
f:id:tottokug:20140831012317p:plain

ここに何か文章を入れるようなのですが、英語で何かを書こうなんて無理なお話です。
そこでピノキオの原作のテキストを数行お借りすることにしました。

How it happened that Mastro Cherry, carpenter, found a piece of wood
that wept and laughed like a child.


Centuries ago there lived--


"A king!" my little readers will say immediately.

No, children, you are mistaken. Once upon a time there was a piece of wood. It was not an expensive piece of wood. Far from it. Just a common block of firewood, one of those thick, solid logs that are put on the fire in winter to make cold rooms cozy and warm.


I do not know how this really happened, yet the fact remains that one fine day this piece of wood found itself in the shop of an old carpenter. His real name was Mastro Antonio, but everyone called him Mastro Cherry, for the tip of his nose was so round and red and shiny that it looked like a ripe cherry.


As soon as he saw that piece of wood, Mastro Cherry was filled with joy.
Rubbing his hands together happily, he mumbled half to himself:

"This has come in the nick of time. I shall use it to make the leg of a
table."

このテキストをフォームにペーストして”Analyze”を押すと結果が確認できました。

↓の画像のように、人の名前っぽいところが抜き出せている事が分かります。
f:id:tottokug:20140831014355p:plain

こんなにも簡単にテキストの分析が出来るとはという感じで、今後も期待のUIMAのサンプルをいじって遊んでみました。



参考:
UIMA 101: 前編 - UIMAことはじめ
これがちょっと古い情報だったので、今の2.6.0でも同じように出来るのか確かめました。

DeepLearningのトレンドについて調べてみた。

最近DeepLearningに力を入れているわけですが、広く普及するのかどうか非常に気になるところです。

DeepLearningがこの数年くらいで急に盛り上がってきている気はするけど、
GoogleTrendsに聞いてみたら、なんか不思議な結果


ここまではなんとなくわかります。
といいたいところだけど、2013年の1月から急激に伸びているのがわけわからないんです。

ふとDeepLearningって2013年の1月に出来た言葉なんだっけと考えてしまうくらい急激に伸びている。実際にそれ以前にDeep Learningという言葉があったのかなかったのかちょっと見てみました。
f:id:tottokug:20140829094449p:plain
2011/01/01 - 2012/12/31に期間を絞ってみたらやっぱりそんなことはなかったです。良かった。

しかし不思議なのが次のグラフ

なぜにこんなに中国からの検索が多いのか、そして、ついで日本が多いのか、不思議ではあります。

ちなみに近そうなものとして、NeuralNetworkとMachineLearningで見てみると、色々な国で検索されている事が分かります。
Neural Network

Machine Learning


なぜDeep Learningだけ飛び抜けて中国なのかっていうのを考えていた時にふと「
Chinese room - Wikipedia, the free encyclopedia
」を思い出し、DeepLearningで結構な知見を持っているGoogleからの何かのメッセージなのかと思いました。


にしても、どうして中国からが飛び抜けて多いんだろう。。。

SpotInstanceを使ってAMIを作る時にCloudAutomatorを使うと楽できる

何かしらのAMIを作る時、本来使うインスタンスよりも高級なインスタンスを使って、
作成するとコンパイルも早いし便利ですよね。

でも、高級インスタンスを使うと時間は短くなったとしても、お高かったりします。

そんな時にはSpotインスタンス

Spotインスタンスを使ってAMIを作れば安いし、速度的にも快適なことこの上ないです。
Spotインスタンスならc3.xlargeのお値段でc3.8xlargeが使えます。

しかし、SpotインスタンスでAMIを作る時に気にしなくては行けないのは、途中で落ちてしまう事。
(私はSpotインスタンスは最低価格でしか入札しないんです。)
せっかく作ってたのに、途中で落ちてしまっては元も子もありません。

今回はCloudAutomatorを使って自動的にAMIを作り続ける事をやってみます。

まずはSQSでQueueを作ります。

そしてCloudAutomatorでSQSトリガーのジョブを作ります。
f:id:tottokug:20140827165847p:plain
こんな感じで作りました。
ここで大事なのは、トリガーになるQueueと成功時に送るQueueを同じにすることです。
これによって、永久ループが完成します。

永久ループが完成するのは良いのですが、このままではCreateImageのAPIの戻りが成功の場合にジョブは成功とみなされ、成功しましたよのMessageがSQSに投げられてしまいます。
そうすると、またSQSトリガーなので、ジョブが実行されてしまうのですが、AMIを作っている途中にもう一度、Create Imageが呼ばれるとAPIは失敗します。=>このジョブは失敗します。

これを回避するために、2つの方法を取ります。どちらか一方でも良いですし、両方やっても良いです。

1.QueueにDelivery Derayを設定する。
f:id:tottokug:20140827165645p:plain
2.失敗時にも同じQueueにメッセージを送る。
f:id:tottokug:20140827171229p:plain

1についてはほとんどデメリットはありませんが、DeliveryDerayで設定した時間より短い時間でのAMI作成が出来ません。ただ、そんなに高頻度で作っても仕方ないと思うので、デメリットとは言えないかもしれません。

2については、ジョブを大量に消費してしまう可能性があります。プランによっては致命傷です。

ということで、1と2の両方を組合せて使う事でいい感じにAMIを作る事が出来るはずです。
世代管理の数もうまいこと調整して、環境構築の際に変な事してしまっても戻すとか使っても良いと思います。

ちょっと贅沢にCloudAutomatorを使うとこんな事が出来ました。
いちどこのジョブを作っておけば、インスタンスを変更したり、構築中なタグを用意したりすれば、ずっと使えるジョブになります。

運用ではないですが、準備段階でも使い道がありそうなCloudAutomatorでした。

ものっすごく雑なMachine Learningを使いこなすための用語紹介

Azure Machine Learningを使いこなすには、experimentのところにある色々が何かを理解しないとツライかもしれません。逆に理解して入ればAzure Machine Learningの便利さがわかるんじゃないかと思います。

ちゃんとしたAzure Machine Learningのドキュメントはこちら


日本語での呼び方はわかるけど、英語で書かれているせいで分からないなんて事もあるかと思うので、対訳をしようかとも思ったのですが、めんどくさかったので、Google翻訳に入れました。
鉄道模型とか出てるくらいの雑さです。


Google翻訳Wikipedia ggrks
Data Format Conversions データ形式の変換 ggrks
Convert to ARFF ARFFに変換 ggrks
Convert to CSV CSVへの変換 ggrks
Convert to Dataset データセットへの変換 ggrks
Convert to SVMLight なSVMLightへの変換 ggrks
Convert to TSV TSVに変換 ggrks
Data Transformation データ変換 ggrks
Filter フィルター ggrks
Apply Filter フィルタの適用 ggrks
FIR Filter FIRフィルタ ggrks
IIR Filter IIRフィルタ ggrks
Median Filter メディアンフィルタ ggrks
Moving Average Filter 移動平均フィルタ ggrks
Threshold Filter 閾値フィルター ggrks
User Defined Filter ユーザ定義フィルタ ggrks
Manipulation 操作 ggrks
Add Columns 列の追加 ggrks
Add Rows 行を追加します。 ggrks
Group Categorical Values グループカテゴリ値 ggrks
Indicator Values インジケータ値 ggrks
Join 参加 ggrks
Metadata Editor メタデータエディタ ggrks
Missing Values Scrubber 欠損値スクラバー ggrks
Project Columns プロジェクトの列 ggrks
Remove Duplicate Rows 重複行を削除する ggrks
Sample and Split サンプルとスプリット ggrks
Partition and Sample パーティションとサンプル ggrks
Split スプリット ggrks
Scale and Reduce スケールと削減 ggrks
Apply Quantization Function  量子化機能を適用します ggrks
Clip Values クリップ値 ggrks
Quantize クオンタイズ ggrks
Transform Data By Scaling スケーリングすることでデータの変換 ggrks
Feature Selection 特徴選択 ggrks
Filter Based Feature Selection フィルターベースの機能の選択 ggrks
Linear Discriminant Analysis 線形判別分析 ggrks
Machine Learning 機械学習 ggrks
Evaluate 評価する ggrks
Cross Validate Model クロス検証モデル ggrks
Evaluate Model モデルの評価 ggrks
Evaluate Recommender 推薦を評価 ggrks
Initialize Model モデルを初期化します ggrks
Classification 分類 ggrks
Multiclass Decision Forest 多クラス決定の森 ggrks
Multiclass Decision Jungle 多クラス決定ジャングル ggrks
Multiclass Logistic Regression 多クラスロジスティック回帰 ggrks
Multiclass Neural Network 多クラスニューラルネットワーク ggrks
One-vs-All Multiclass ワンVS-すべての多クラス ggrks
Two-Class Averaged Perceptron 2クラスパーセプトロンは平均化 ggrks
Two-Class Bayes Poit Machine 2クラスベイズPoit機 ggrks
Two-Class Boosted Decision Tree 2クラスブーストディシジョン·ツリー ggrks
Two-Class Decision Forest 2クラス決定の森 ggrks
Two-Class Decision Jungle 2クラス決定ジャングル ggrks
Two-Class Logistic Regression 2クラスロジスティック回帰 ggrks
Two-Class Neural Network 2クラスニューラルネットワーク ggrks
Two-Class Support Vector Machine 2クラスサポートベクターマシン ggrks
Clustering クラスタリング ggrks
K-Means Clustering K平均クラスタリング ggrks
Regression 回帰 ggrks
Bayesian Linear Regression Model ベイズ線形回帰モデル ggrks
Boosted Decision Tree Regression ブーストディシジョン·ツリー回帰 ggrks
Decision Forest Regression 意思決定森林回帰 ggrks
Linear Regression 線形回帰 ggrks
Neural Network Regression ニューラルネットワーク回帰 ggrks
Ordinal Regression 順序回帰 ggrks
Poisson Regression ポアソン回帰 ggrks
Score スコア ggrks
Assign to Clusters クラスタへの割り当て ggrks
 Score Matchbox Recommender スコアマッチボックス推薦 ggrks
Score Model スコアモデル ggrks
Train トレイン ggrks
Sweep Parameters スイープパラメータ ggrks
Train Clustering Model トレインクラスタリングモデル ggrks
Train Matchbox Recommender トレインマッチボックス推薦 ggrks
Train Model 鉄道模型 ggrks
Statistical Functions 統計関数 ggrks
Apply Math operation 数学演算を適用します ggrks
Descriptive Statistics 記述統計学 ggrks
Elementary Statistics 小学校の統計 ggrks
Hypothesis Testing T-Test 仮説検定T検定 ggrks
Linear Correlation 線形相関 ggrks
Probability Function Evaluation 確率関数評価 ggrks
Replace Discreate Values 離散的な値を交換してください ggrks
Text Analytics テキスト分析 ggrks
Feature Hashing  フィーチャーハッシュ ggrks
Named Entity Recognition 固有名詞抽出 ggrks

CloudAutomatorでWindowsInstanceのAMIを世代管理してみた

ふと、CloudAutomator でAMI作るのって当然Windows Instanceでも大丈夫だよね???

というところから試してみました。

f:id:tottokug:20140812094832p:plain
こんな感じでジョブを作って試してみました。


先に結果から言うと、完璧です。


世代管理についても
3世代目作っておいて
f:id:tottokug:20140812094233p:plain
4世代目を作ったら
f:id:tottokug:20140812094244p:plain

ちゃんと第1世代が消されています。

消し忘れによって、無駄にAMIにかかる費用がかかってしまうなんてことも防げそうです。
1つ2つならまだしも、沢山のAMIを管理している場合は世代管理の消し忘れの防止にもなりそうですし、
めんどくさい作業をやらなくても良いのはやっぱり良いなと思います。


少し気になった点として、1世代目の時だけTagがついていないのはなんでなんだろうというのがありました。

あと、好きなTagが付けられるのですが、一つしか付けられないので、おそらくNameを付けておしまいになってしまいそうです。
Cost Allocationとか使っていると、タグは複数付けられると嬉しいなと思いました。