タイトル/名前 | 更新者 | 更新日 |
---|---|---|
Groovy/Logging/slf4j + logback | msakamoto-sf | 2013-03-09 22:55:26 |
日記/2013/03/02/今日の調べ物 | msakamoto-sf | 2013-03-02 21:11:25 |
日記/2013/02/24/本日の「あとで読む」まとめ | msakamoto-sf | 2013-02-24 23:06:37 |
日記/2013/02/17/本日のメモ | msakamoto-sf | 2013-02-17 00:20:35 |
技術/IDE/Eclipse | msakamoto-sf | 2013-02-16 17:35:03 |
技術/RCS/PrivateRepositoryWithCloudStorage(Dropbox) | msakamoto-sf | 2013-02-11 17:34:51 |
技術/RCS/Git/Tig | msakamoto-sf | 2013-02-11 12:52:25 |
技術/Android/自己署名証明書 | msakamoto-sf | 2013-02-10 22:27:17 |
技術/UNIX/screen | msakamoto-sf | 2013-02-09 19:38:50 |
日記/2013/02/07/今日の調査メモ(Grails + MongoDB, alter table と PostgreSQL, gzip,bzip2,xz,lzop,lzmaパフォーマンス比較記事) | msakamoto-sf | 2013-02-07 23:15:21 |
slf4j + logbackをGroovyで使うメモ。
公式ドキュメント重要。
slf4j1.groovy:
@Grapes([ @Grab(group='org.slf4j', module='slf4j-api', version='1.7.2'), @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.9'), ]) import groovy.util.logging.* @Slf4j class C1 { static void m1() { println 'from m1:' log.trace 'trace2' log.debug 'debug1' log.info 'info1' log.warn 'warn1' log.error 'error1' } } @Slf4j class C2 { static void m2() { println 'from m2:' log.trace 'trace2' log.debug 'debug2' log.info 'info2' log.warn 'warn2' log.error 'error2' } } C1.m1() C2.m2()
実行結果:
$ groovy slf4j1.groovy from m1: 22:41:04.295 [main] DEBUG C1 - debug1 22:41:04.299 [main] INFO C1 - info1 22:41:04.301 [main] WARN C1 - warn1 22:41:04.301 [main] ERROR C1 - error1 from m2: 22:41:04.408 [main] DEBUG C2 - debug2 22:41:04.408 [main] INFO C2 - info2 22:41:04.408 [main] WARN C2 - warn2 22:41:04.408 [main] ERROR C2 - error2
logback.groovyをclasspathのパッケージ無しで参照できるようにしておきます。
mavenとかgradle使ってるなら、"src/main/resources/"とかの直下に置いておけば、パッケージングとか実行されるときにclasspathのパッケージ無しで指定できるようにしてくれるはずです。
スクリプト実行するなら、実行するスクリプトと同じ場所に置いておけば多分大丈夫。
シンプルなlogback.groovy:
import ch.qos.logback.classic.encoder.PatternLayoutEncoder import ch.qos.logback.core.ConsoleAppender import static ch.qos.logback.classic.Level.* appender('CONSOLE', ConsoleAppender) { encoder(PatternLayoutEncoder) { pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n" } } root(TRACE, ['CONSOLE'])
これと上で紹介したslf4j1.groovyを実行する場合は、system class loaderとしてgrabを動かす必要があります。ということで、slf4j1.groovyの"@Grab"の前に以下の様な"@GrabConfig"を追加します。
@GrabConfig(systemClassLoader=true) @Grapes([ @Grab(group='org.slf4j', module='slf4j-api', version='1.7.2'), @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.9'), ]) import groovy.util.logging.* ...
slf4j1.groovyを実行してみると、TRACEレベルが有効になり、日付が入るようになりました(=用意したlogback.groovyがちゃんとロードされてます)。
$ groovy slf4j1.groovy from m1: 2013-03-09 22:44:09.107 [main] TRACE C1 - trace2 2013-03-09 22:44:09.113 [main] DEBUG C1 - debug1 2013-03-09 22:44:09.114 [main] INFO C1 - info1 2013-03-09 22:44:09.115 [main] WARN C1 - warn1 2013-03-09 22:44:09.116 [main] ERROR C1 - error1 from m2: 2013-03-09 22:44:09.260 [main] TRACE C2 - trace2 2013-03-09 22:44:09.260 [main] DEBUG C2 - debug2 2013-03-09 22:44:09.260 [main] INFO C2 - info2 2013-03-09 22:44:09.260 [main] WARN C2 - warn2 2013-03-09 22:44:09.260 [main] ERROR C2 - error2
Windows7の空き容量を増やすオーソドックスな方法:
GParsとかClojureとactorとか:
AWSとSIビジネス:
↑の資料で社内コミュニケーションで使ってると出てきた"Yammer"について:
"Yammer"という名前だけは目にしてたんですが、こういう使われ方してたんですね。
次、ClojureとSTM:
ガンダム UC、Gyaoで視聴。いや~、可変型MS多くて、動きがスゴイですね!あと1st-Z-ZZつながりのキャラのチラ見せで鼻血吹きそうです。カイ・シデンとかカイ・シデンとかカイ・シデンとか。もうカイ・シデンのチラ見せシーンはキタ━━━━(゚∀゚)━━━━!!状態でしたね。あとブライト艦長とかブライト艦長とかブライト艦長とか!あの二人、もうめっちゃ大好き!!
あと、開発ブランクがかなり精神的に重くのしかかってて、GitHubとかscreen当たり前とかVimプラグイン使えて当たり前とか複数LL言語をbrewとかvirtualenvで使いこなせて当たり前とか、「~出来て/使いこなせて/キャッチアップできて当然」モードに入って焦燥感が黄色信号になったので、慌ててひろさちやの仏教書と法句経の解説書眺め直して調律しなおしたりしてました。
どうにも、亀のように歩きが遅くて腰が重いので、なかなかWebの技術進歩スピードに開発者としてついていきづらい感じがありますな・・・。否、そもそもキャッチアップし「なければならない」と考えること自体が精神衛生上よろしくないんですけどね、仏教的には。
・・・しかし、仏教がなかったらまた焦燥感に引きずられてそのままレッドゾーンに突入してたかと思うとゾッとする・・・。
Eclipseを使う時のメモ
参考:
上記資料からコピペ
Dropboxを使ってprivateなリポジトリを共有するノウハウのメモ書き。
ひとまずはGoogleで見つかった参考リンクのまとめ書き。
Git版:
Subversion版:
Mercurial版:
Tig便利!
など。
本サイトでは、これまでAndroid上で自己署名証明書を使う技法として、証明書の検証自体を無効化する手法を紹介していました。Google検索でも"Android 自己署名証明書"等のキーワードで比較的上位に表示される状況となっているようです。
しかしながら、本サイトで紹介している手法をそのまま用いると中間者攻撃(MITM)を受ける危険が発生します。コピペなどにより外部開発者のアプリに問題が入り込むのを防ぐため、これらの記事については一旦非表示にしました。自己署名証明書を用いるにあたり、より安全な技法を見つけた場合は、そちらを紹介する形で復活させようと考えております。
参考:
GNU screen のコマンドラインオプションやキーバインドの早見表。
自分がよく使うscreenrc: https://gist.github.com/msakamoto-sf/4744713#file-screenrc
セッションの一覧:
$ screen -ls
セッションにattach:
$ screen -r [[pid.]tty[.host]] $ screen -r sessionowner/[[pid.]tty[.host]]
新しいセッションを作るときにセッション名指定:
$ screen -S セッション名
デタッチされてないセッションへアタッチ(マルチディスプレイモード)
$ screen -x -r [[pid.]tty[.host]]
screenのセッション中から、ウインドウのタイトルを指定して新しいウインドウを起動
$ screen -t xxxxxx
キーバインドは、デフォルトの "escape ^Aa" 設定のまま、"C-a"として記載してます。
C-aに続けて入力するキーは、大文字と小文字が区別されます。
基本とお助け
command | key-bind | summary |
---|---|---|
help | C-a ? | キー割り当ての表示 |
colon | C-a : | コマンド入力 |
quit | C-a C-\ | 全ウインドウ破棄 + screen終了 |
clear | C-a C | 画面クリア |
redisplay | C-a C-l or C-a l | 画面再描画 |
detach | C-a C-d or C-a d | detach |
screen利用状態の把握
command | key-bind | summary |
---|---|---|
displays | C-a | アタッチ中の画面をリスト表示 |
sessionname [name] | - | 現在のセッション名を変更する。引数なしなら現在のセッション名を表示。 |
info | C-a i | 現在のウインドウの情報を表示 |
ウインドウ操作
command | key-bind | summary |
---|---|---|
windowlist [-b] | C-a " | ウインドウを表形式で一覧表示。key-bindされてるのは"-b"付き。 |
windows | C-a C-w or C-a w | ウインドウのリストをメッセージ行に表示 |
screen | C-a C-c or C-a c | 新しいウインドウとシェルを作成 |
title [newtitle] | C-a A | 現在のウインドウのtitleを設定 |
other | C-a C-a | 直前のウインドウに切り替える。デフォルトではコマンド文字の2回繰り返し。 |
kill | C-a C-k or C-a k | 現在のウインドウを破棄 |
monitor | C-a M | 現在のウインドウの監視のON/OFF |
next | C-a space/n/C-n | 次のウインドウに切り替える |
prev | C-a bs/h/p/C-p | 前のウインドウに切り替える |
リージョン操作
command | key-bind | summary |
---|---|---|
split | C-a S | 現在のリージョンを縦に分割 |
focus | C-a tab | 次のリージョンに移動 |
remove | C-a X | 現在のリージョンを破棄 |
only | C-a Q | 現在以外のリージョンを破棄 |
fit | C-a F | ウィンドウのサイズを現在のリージョンのサイズにする |
resize = | - | 全てのリージョンを同じ高さにする |
resize max | - | 現在のリージョンの高さを最大にする |
resize min | - | 現在のリージョンの高さを最小にする |
コピー操作
command | key-bind | summary |
---|---|---|
copy | C-a [/C-[/ESC | コピーモード開始 |
paste . | C-a ] | ペースト |
コピーモードに入ったら、最初にRETURNでコピー開始点決定、次のRETURNでコピー終了点決定+コピー、が基本。
コピーモードを終了するには、コピーモード中の操作に関連付けされていないキーを何かしら押せば終了する。コピーモード中の操作はviみたいなキーバインドになってるので、個人的にはESC押せば抜けられる、と覚えます。コピーモードから抜けたら、"Copy mode aborted"というメッセージが表示されます。
使い方
".screenrc"を参考にしたサイト:
その他:
GrailsでのDB Migration Plugin : Liquibaseを使ってる。
Groovy でメール送信
PostgreSQLでのALTER TABLEのパフォーマンス
基本的には、一旦テーブルのINDEXを全部DROPしてからALTER TABLE ADD COLUMNして、終わったらINDEX付け直すのが王道みたい。この辺、内部のストレージの使用方法的にはどんな工夫をしてるのかちょっと気になる。
また、Liquibaseでテーブル列を追加するようなmigrationを行うとき、上記のようにINDEXのDROPと付け直し処理を省力化してくれるのかも検証ポイントか。
Groovy の Process クラスが、 "|" でパイプをつなげられる仕組み:
unix上での圧縮系コマンドいろいろ:gzip, bzip2, xz, lzop, lzma
今探してるのは、テキスト(それも同じフレーズが隣接して多数散らばってる)と、一部でJPEG画像などのバイナリデータが混在する1GB - 10GB(まれに30GB over)なアーカイブファイルにたいして、とにかく圧縮率が良い物。圧縮自体は夜間バッチ処理などで動作させる予定なので、CPU/メモリは、圧縮時は潤沢に使える。伸長は夜間じゃないかもしれないが、伸長速度は遅くても問題ないユースケース。
そうなってくると、xz か lzma という感じになりそう。ただ、xzのサイトの解説見ると "XZ Utils are the successor to LZMA Utils." とあるので、名前的にlzmaは実質、今ならxzで良いのかもしれない。(実際、gzip/bzip2/lzmaの比較記事は2008年、gzip/bzip2/xz/lzopの比較記事は2011年と、タイムラグがある。)
マルチコアを有効活用するpigz/pbzip2の話: