ひらがな->カタカナ変換Groovyスクリプト

各種名簿を整理するついでに、読み仮名を統一したかったので
カタカナをひらがなに変換するGroovyスクリプトを書きました。

//  全角ひらがな -> 全角かたかな変換

def String hira2kata(String a) {
	a = a.replaceAll(/あ/,'ア').replaceAll(/い/,'イ').replaceAll(/う/,'ウ').replaceAll(/え/,'エ').replaceAll(/お/,'オ')
	a = a.replaceAll(/ぁ/,'ァ').replaceAll(/ぃ/,'ィ').replaceAll(/ぅ/,'ゥ').replaceAll(/ぇ/,'ェ').replaceAll(/ぉ/,'ォ')
	a = a.replaceAll(/か/,'カ').replaceAll(/き/,'キ').replaceAll(/く/,'ク').replaceAll(/け/,'ケ').replaceAll(/こ/,'コ')
	a = a.replaceAll(/さ/,'サ').replaceAll(/し/,'シ').replaceAll(/す/,'ス').replaceAll(/せ/,'セ').replaceAll(/そ/,'ソ')
	a = a.replaceAll(/た/,'タ').replaceAll(/ち/,'チ').replaceAll(/つ/,'ツ').replaceAll(/て/,'テ').replaceAll(/と/,'ト')
	a = a.replaceAll(/な/,'ナ').replaceAll(/に/,'ニ').replaceAll(/ぬ/,'ヌ').replaceAll(/ね/,'ネ').replaceAll(/の/,'ノ')
	a = a.replaceAll(/は/,'ハ').replaceAll(/ひ/,'ヒ').replaceAll(/ふ/,'フ').replaceAll(/へ/,'ヘ').replaceAll(/ほ/,'ホ')
	a = a.replaceAll(/ま/,'マ').replaceAll(/み/,'ミ').replaceAll(/む/,'ム').replaceAll(/め/,'メ').replaceAll(/も/,'モ')
	a = a.replaceAll(/や/,'ヤ').replaceAll(/ゆ/,'ユ').replaceAll(/よ/,'ヨ').replaceAll(/ら/,'ラ').replaceAll(/り/,'リ')
	a = a.replaceAll(/ゃ/,'ャ').replaceAll(/ゅ/,'ュ').replaceAll(/ょ/,'ョ')
	a = a.replaceAll(/る/,'ル').replaceAll(/れ/,'レ').replaceAll(/ろ/,'ロ').replaceAll(/わ/,'ワ').replaceAll(/を/,'ヲ')
	a = a.replaceAll(/ん/,'ン')
	a = a.replaceAll(/が/,'ガ').replaceAll(/ぎ/,'ギ').replaceAll(/ぐ/,'グ').replaceAll(/げ/,'ゲ').replaceAll(/ご/,'ゴ')
	a = a.replaceAll(/ざ/,'ザ').replaceAll(/じ/,'ジ').replaceAll(/ず/,'ズ').replaceAll(/ぜ/,'ゼ').replaceAll(/ぞ/,'ゾ')
	a = a.replaceAll(/だ/,'ダ').replaceAll(/ぢ/,'ヂ').replaceAll(/づ/,'ヅ').replaceAll(/で/,'デ').replaceAll(/ど/,'ド')
	a = a.replaceAll(/ば/,'バ').replaceAll(/び/,'ビ').replaceAll(/ぶ/,'ブ').replaceAll(/べ/,'ベ').replaceAll(/ぼ/,'ボ')
	a = a.replaceAll(/ぱ/,'パ').replaceAll(/ぴ/,'ピ').replaceAll(/ぷ/,'ブ').replaceAll(/ぺ/,'ペ').replaceAll(/ぽ/,'ポ')
	a = a.replaceAll(/う゛/,'ヴ')
}

//test code
assert hira2kata("あぜるばいじゃん") == "アゼルバイジャン"

元ネタにしたSEDはこちらですが、GroovyよりもSEDの方がすっきり感がありますね。

y/ぁあぃいぅうぇえぉお/ァアィイゥウェエォオ/
y/かきくけこさしすせそたちっつてとなにぬねのはひふ/カキクケコサシスセソタチッツテトナニヌネノハヒフ/
y/へほまみむめもゃやゅゆょよらりるれろわをん/ヘホマミムメモャヤュユョヨラリルレロワヲン/

s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s///g
s/う゛//g

デブサミ2009に行ってきました。

デブサミ2009に行ってきました。
http://codezine.jp/trackback/devsumi2009/

何かとRubyの陰に隠れがちなGroovyですが、
JGGUG (Japan Grails/Groovy User Group)ジェイガクとして正式発足しました。

勉強会勉強会の デブサミ2009吉岡アワーで
山田さんがLTしている様子がUstreamで分かります (01:07:28〜)
http://www.ustream.tv/recorded/1146074

今年のデブサミクラウド系のセッションが多かったですね。
通常のクラウドの話は、ビジネス的な話が多くて食傷気味でしたが
プログラミングの視点でのディスカッションなので、新鮮でした。

ファイルの添え番号の桁を3桁に揃えるGroovyスクリプト

開始ディレクトリー以下にあるjpgファイルの添え番号の桁を3桁にそろえるGroovyスクリプト

FlashExtracht でフラッシュファイルから画像を抽出したりした時には、
フラッシュの中のjpegのファイル名か hoge[1].jpg とか hoge[11].jpg とかになって出てくるわけですが、この場合、ソートして見ようと思っても、hoge[1].jpg,hoge[10].jpg,hoge[100].jpg
の様にしか並ばないので、元々の画像の並び順に意味があった場合には、不都合が生じます。
そこでソート可能な様に全ての添え番号を3桁に揃えるGroovyスクリプトを書きました。
例えば
hoge[1].jpg --> hoge[001].jpg
hoge[11].jpg --> hoge[011].jpg
という風にリネームします。

    padLeft()を使ってコード短縮しました

// 開始ディレクトリー以下にあるjpgファイルの添え番号の桁を3桁にそろえる
// 例:hoge[10].jpg --> hoge[010].jpg
new File(".").eachFileRecurse { file -> 
   if(file.isFile() && file.name.endsWith("jpg")) { 
      name = file.getName()
      newname = name
      newname = file.getName().replaceAll(/\d+/){ it.padLeft(3, '0') }
      if (name != newname) {
         println name+" renamed to "+newname
         file.renameTo( new File(file.getParent()+"/${newname}") )
      }
   }
}

Groovyなう&ふゅーちゃーに出席しました。

Groovyなう&ふゅーちゃーに出席しました。

Groovy1.6の最新情報です。
私はまだ1.5ユーザーですが、1.6を使いたい理由は、速い、safe reference operatorが使える。
Java7との親和性も当然高まっています。

資料:

http://grails-ja.googlegroups.com/web/GroovyNowAndFuture.ppt

ustream:

http://www.ustream.tv/channel/grailscodereading-16

以下は、出席したときのメモ書き

Groovy 1.6について
エルビス演算子 ?:
三項演算子相当
A?: B とは if(A) {A} else {B}
Java7のは safe reference operator相当 Rubyの場合は .? と書く
ジョイントコンパイラ
Class A {
B b;
}
Class B extends A{}
コンパイルできなかった "groovyc -j" で実行可能

JavaScriptの様に、クラスも、インスタンスも動的にメソッド書き換え可能、
 無秩序すぎないか、
  Grailsだったらmetaclassの中でのみ動的な変更可能となっており、整理できる。

Expando Meta Class (EMC)
多重代入
分岐してもreturn省略可能 
AST変換
EMS DSL
実行時Mixed-in
ツールGrape
最初は、Javaの数十倍遅かった、
The Computer Language Bechmarks Game a.k.a "shootout"
Groovyで遅いならそこだけJava化すればよいだけ
ライブラリの性能はJavaと同じ
1.5.6までは遅かったが、1.6からは速い ただし起動は遅くなった
メソッド呼び出しが高速化した JRubyRuby1.9相当の速度
 "CallSite" cache の実装、2回目以降は、呼び出し側が保持する、みつけたmethodを再利用する 
  expandoMetaclassであっても発見容易
 "CallSite-Array"という新規な変数を持ち、探索コストがなくなる
DefaultGroovyMethod#additionals を参照
インライン展開 HotSpot Deoptimization

Grape 依存クラス自動Downloader
Maven/RubyGems みたいなもの Ivyとはモジュール管理に特化したMaven
走行中もDownloadできる
Grape.grab(group:'org.jidesoft',version:':[2.2.9)'))

Javaでもインスタンスのmetaclass変更可能
"xxx".metaClass.a ={print "hello"}
"xxx".a()

AST変換
Groovy.JDBC で現的的に使っていた
.netLINQ もやっていた
Groovyとしてsyntex errorを起こすものは変更できない
@Bindable / @Vetoable = Java.beans.propertyChangeSupport
@Singleton
@Immutable
@Delegate
@Lazy 遅延生成
@Category / @Mixin
@PackageScope
Retention Policy = Source の扱い、多分マクロの位置づけ

String.mixin Date
assert "a".getTime() == xxxxx エポックからの時間が分かる、意味不明になりがち

マルチ代入
def (a,b) =[1,2] <-- def a=1; def b=2 のこと

if(x%2==0) {true} else {false} <-- 2カ所でreturnできる

EMC DSL 一気にメソッドが定義できる String.metaClass.define { ここにメソッドがいっぱ書ける}
 これでメソッドが中途半端に追加された状態が隠せる

Grape の annotation表記は冗長
Javaアノテーションは methodとclassのみ
MOPのリフレッシュ予定あり NG言語のコアが役に立つ

Groovy Clousureは、Methodではないので全ての処理が終わらないと終

Groovy Clousureは、Methodではないので全ての処理が終わらないと終了しない件

GCRのGroovy勉強会に行ってきました。

今回特にためになったのは、Closureの挙動について、その終了の仕方がMethodとは異なること。

つまりClosureはMethodsではないので、もらった入力は全て処理する。

 [1,2,3].each {print it; return } この出力は"123" 全て処理してから終わる
 for (it in [1,2,3]) {print it; return}   この出力は"1" ひとつの出力で終わる

もう一つ確認

1.upto(3) { print it ; if (it>1) return} この出力は"123" 全て終わってからreturnする。


returnを処理の途中で発生させても、println it の部分の処理は10まで進みます。

第16回オープンソーステクノロジー勉強会に行ってきました。

MapReduceの話を伺いにGREE Labsにお邪魔してきました

以下メモ書き

Preferred Infrastructure 太田一樹さん http://kzk9.net/ http://preferred.jp/
Sedue 分散検索エンジン

Hadoop + EC2 の分散検索
SOSP学会
200億ページ 20kb = 400TB がインターネットの全体 読み込みは100日 400GBが1000台あれば良い
プロセス起動 プロセス監視 デバッグ 最適化 
MPI = Massage Passing Interface が並列プログラミングのライブラリ 
HPCはチェックポイントを持って、同期点を確保する
Framework側で持つ
1jobあたり5プロセスが死ぬ
用途
Grep
Sort
Log analysis
Web Graph generation
Machine Learning
Inverted index Construction
Machine Learning
 K-means

Apache ツール出てきた
hadoop Distributed File System
HDFS = Master/Slave Architecture
64MB単位に分割 
 Namenode + Datanode (NamenodeはentryでSPOF)
Master = Jobtracker 事業のタスク分割 全てのTracktrackerへ定期pingを打つ
Slave = Tasktracker

Hadoop streaming は 多言語interface : Rubyからでも呼べる 

Yahoo japan は 2000ノードまでしよう
SIGIR(IR学会)
コミッターのほとんどはYahooかFacebook
はてぶもHadoop
FacebookがhiveというHadoopのラッパーを作った
GFSはAppendできるがHadoopはまだできていない
Hadoopでもlog rotation みたいな仕掛けは使える。
読み込み元のデータとの同期は、できない Latencyは、発生しうる
Javaのthread にはHadoopは勝てない、tasktrackerのlaunchとか、相当overheadがかかる。

大倉努さん http://ohkura.com  blogeye
 Hadoop + EC2
 著者推定
 データマイニングアルゴリズム
 1000万blogのうち500万ブログ
 300GBのデータマイニング
 EC2 = 10cent/hour 1時間10円
 Hadoopは後からnode追加、削除可能 障害マシンの除去可能
 S3 + mySQL使用
 クローラーは落ちやすい
 MySQLにデータを置いて重複検知 Hadoopは小さいファイルが苦手
 Index = MySQL + Senna
著者属性推定ジョブ
記事の合体
MappertがReducerに送るとき、途中で共有ファイルシステム上に置かれて、そのファイル名が渡される。
ReducerはMasterに聞いて必要なデータが揃っていたらHTTpで取りに行く
機械学習の最初の入力データは何?
ヤスタケさん
300GくらいならS3でなくEC2で間に合うかも LOCALのデータは EC2の上のデータは消える
アマゾンに1年で40万くらい払った
CRAWLのジョブはつまらない 2〜3台で間に合う
EC2の仮想マシンは、大中小とあるがどれか、1年前は1種類しかない dual coreはあまりメリットない
一台のマシンにMapperとReducerと両方入れて置いた方が良い、同じマシン内部での処理は有利
Hadoopの駄目な点、あまり再起動はない、MasterでCrawlしていたから
優先度設定が最近可能になった data lost はない。
Hadoopじゃなくては駄目な理由は?
計算力のニーズの変動が大きいのでAmazonを使った