Gr*ワークショップ3で使用した資料
JGGUGのワークショップ第三回で
TwitterにGroovyからポストする
Google Calendarの今のタイムスタンプにつぶやきを記録する、
Google Calendarのライフログ的使い方のサンプルコードを上げました。
ひらがな->カタカナ変換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
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からは速い ただし起動は遅くなった
メソッド呼び出しが高速化した JRubyはRuby1.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 で現的的に使っていた
.net のLINQ もやっていた
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を使った