Hatena::ブログ(Diary)

@vvakame の日記

2012-05-07

JsonPullParser が Maven Central Repository に入るようです

| 02:30 | JsonPullParser が Maven Central Repository に入るようです - @vvakame の日記 を含むブックマーク

イケメンの @ 閣下がリリースしているTwitter4J、有名です。Twitter4Jを利用する方はたいていmvn経由で利用していると思います。

かくいう僕も、Sengokuナントカを開発している時からMaven Central Repositoryに置いてあるTwitter4Jをmvn先生に落としてもらってきていたりしたわけです。

で、QConTokyoの控え室で yusukey 閣下がMaven Central Repositoryへの入れ方を簡単に説明してくれたのでした。

でもアホのわかめは覚えてられないので帰りの電車に乗るくらいにはもうすっかり忘れてしまったわけです。

で、GWですしいっちょやってみんべ!と一年発起して、yusukey閣下が昔書いた Maven Central Repository へのライブラリ登録方法 - #侍ズム を見て、ほうほうMaven Central Repository に取り込んでもらうにはこうするのかー…とか言ってましたらば。

この時、僕は確信しました。この人はただのヒゲダンディじゃない。身も心も真のイケメンなのだと…。

で、書いてもらったのが 【最新版】Maven Central Repository へのライブラリ登録方法 #maven - #侍ズム になります。

後はもうほんとこの手順通りやるだけでした。 500 Internal Server Error ほらこのとおり!!

ちょっと詰まったところだけ補足しておきます。

あと、僕のリクエストは [OSSRH-3460] request for creation of maven repository for JsonPullParser - Sonatype JIRA です。

yusukey 先生の 2. pgpjar署名する

手順通りに進めると、生成した鍵がmainとsubの署名用の鍵を持ってるみたいで、subの鍵を全部消す必要があった可能性があります。

色々いじくりながら試してたので本当にコレが原因でうまくいったかはあんまり自信がない…!

やり方は 403 Forbidden とか見ながら。

gpg --keyserver hkp://pool.sks-keyservers.net --send-keys(ry ってやった後に、5秒かそこらのディレイがあった後に gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys(ry で該当の鍵1件有りみたいな返答がかえってくるようになったので、何回かしつこく確認してみるといいかも。

yusukey 先生の 5. oss.sonatype.org でリリースする

一応もうちょい詳しい手順を書いておきます。 左の Build Promotion の欄の Staging Repositories を開くと、自分の groupId のがあると思うので、選択肢してClose、もう一回選択してRelease って感じでおkでした。

初めてやる場合( すでにSyncしてもらってるgroupIdがない場合 )、自分のTicketにリリース完了したよ!ってコメントを入れる必要があります。そうするとcentralへのsyncをactivateしてくれます!!

その後は2時間周期でSyncしてもらえるようですね。

ちなみに、22:55くらいにその操作をしてもらって、02:15現在まだsyncされてないっぽいです。

定期的に The Central Repository Search Engine でチェックしてぐぬぬ顔してます…。

最後に

yusukey 先生ありがとうございました!!

2011-08-04

Eclipseの活用方法についての資料書いたりライブコーディングしたりしたよ

| 23:54 | Eclipseの活用方法についての資料書いたりライブコーディングしたりしたよ - @vvakame の日記 を含むブックマーク

上記みたいな資料を作ったりしたよ。

TOPGATE社には おがわさん という魔術師が棲んでいるので、僕如きがこういうこと偉そうに書くと死んだりします。

一応、参考になりそうなものを下記に書きだしておきました。 #u_s_k

つぎゃった

http://togetter.com/li/170487

資料

http://www.slideshare.net/vvakame/eclipse-expert

ライブコーディング録画

http://www.ustream.tv/recorded/16427271

資料を見てくれた弊社のおがわさんとのとさん、ありがとうございました!

なんかライブコーディングしてるとまだまだEclipse使い込んでない感が滲み出てたりミスタッチ多かったり、補完の癖つかめてなくて誤操作してたりします。

複数PC間でEclipseの設定が同期できないとなかなかカリカリにチューニングする気にならない…(´・ω・`)

2011-04-24

コードからEclipseのコードフォーマッタを利用してソースを整形する

| 15:26 | コードからEclipseのコードフォーマッタを利用してソースを整形する - @vvakame の日記 を含むブックマーク

一回調べて忘れそうだから備忘。

最初はStackoverflowで見つけたネタなんだけど簡単に見つからなかったからまぁいいや。

当初の目的としては、APTで生成したソースはいかにも機械生成ですぅぅぅっていうコードで、等価なコードを人力で書くのはつらそうだったので同じフォーマッタ使って見た目を同じにしたかった。

で、生成ソースと人力ソースの等価性を検証して、人力ソースに対してテストコードを書けばプロジェクト数1つ減るなー、と思ったんだけど src/test/java配下にあるjavaコードを文字列として取得できなさげな感じがして絶望が鬼なったので、既存の生成ソースに対してテスト書く方法のままってことになった。

与太話は置いといて…。

pom.xml

利用例

圧縮したpom.xml

多分こっちでも動くんだけど、なんかたまに実行時にエラーになったりして原因わかんない

2011-04-21

JsonPullParser 1.0 リリース

| 03:00 | JsonPullParser 1.0 リリース - @vvakame の日記 を含むブックマーク

やっと、ドキュメントっぽいものを書きました。

https://github.com/vvakame/JsonPullParser/wiki/JsonPullParser_ja

しばらくは機能追加とかはなしの予定…

個人的にはかなり使いやすいと思っています。

会社で書いているコードにもガシガシ混入していっています!

もし、使っている人がいたらぜひ教えてください。励みになるのでw

2011-04-18

appengine-deferred 0.1 作成 #appengine

| 01:15 |  appengine-deferred 0.1 作成 #appengine - @vvakame の日記 を含むブックマーク

appengine-deferred を作成しました。

https://github.com/vvakame/appengine-deferred

DeferredTask について

appengineの1.4.3からDeferredTaskという、RunnableとSerializableのサブタイプなものが追加されました。

これは、DeferredTaskをimplementしたクラスをTaskOptionのpayloadとして渡してTQを起動すると、なんかまぁ /_ah/queue/__deferred__ だかのTQとして起動される、みたいなControllerタイプではない起動の仕方のTQです。多分。

作ったもの

特定のメソッドに @Deferred をつけておくと、例外発生時に自動的にTQでの実行に切り替えてくれるライブラリを作りました。

注意事項がいくつかあるのですが、まぁ後にします。

なんで作ったか

appengine用のコードを書いていて、ある処理を冪等にするために、失敗時には非同期でリトライにする、というコードを何回も書いてきました。全体の作業時間の10%程度を占めている作業なんでないかなーと思います。

僕は、以前からある特定の処理を自動的に非同期的に実行してくれるように変換できないかなー…と思っていましたが、Controller型のTQをベースに考えると、出来なくもないけど使い方も難しく、ライブラリ自体の開発コストが多分50時間超えるだろうなー、って感じでした。

ですが、1.4.3からはDeferredTaskが追加されたのでまぁいっちょ自動化してみるかーっというわけで作りました。だいたい12時間ぐらいかかった気がします。

使い方

APTライブラリなので、APTのjarを適当にSlim3っぽく指定してください。

mvnリポジトリも一応用意してあるので、最新の appengine-deferred-usage のpom見てください。

非同期化したいメソッドに @Deferred つけるだけです。

appengine-deferred/SampleService.java at 3d651162457ed61cf9b17bd86287736d27ab0d00 ? vvakame/appengine-deferred ? GitHub

利用側

appengine-deferred/SampleServiceTest.java at 3d651162457ed61cf9b17bd86287736d27ab0d00 ? vvakame/appengine-deferred ? GitHub

アノテーションを付けたメソッドが属するクラスが SampleService とすると、自動的に SampleServiceDeferred というクラスができ、同名、同シグニチャのメソッドが定義されるので、それを呼び出すようにしてください。

想定されている例外について、DeferredUtil.throwWithValue(...) 経由で再throwすると、XxxDeferredクラスの方でキャッチされ、自動的に非同期で再実行されます。

呼び出し側ではthrowWithValueに一緒に渡した値が返ってくるので、処理が成功したか失敗したかは気にせず処理を継続することができます。

例外発生時に DeferredUtil.throwWithValue(...) で処理しなかった場合、想定外の例外ということで非同期化せず、普通に呼び出し元に伝播します。

あと、特定の例外が発生した時にメール送りたいなー、みたいな時のためになんかまぁ独自処理を追加できるようにしました。

SampleService.ownTask() とか、その辺みてください。

注意

冪等であるかを強く意識しつつ利用しないと、データの整合性が簡単に壊れちゃったりする気がします。

DeferredTaskはSerializeして投げられるので、呼出し元から渡される引数のインスタンスの状態を変更するようなメソッドを自動で非同期化すると、冪等にしたつもりでなってなくてうぎゃー!とかなったりすると思います。引数はImmutableであると考えてコードを書いたほうがいいと思います。

あとがき

多分僕が自分で使って幸せになる!ぐらいしか考えてないので、説明がだいぶ適当だと思います。

使ってみたい人がいたら、分からないところがあったら聞いてくれれば多分答えます。