<< 前へ | Home

4/2(土) Kotlin 1.0リリース記念勉強会 in 京都に行ってきました #kotlin_kansai #jkug

JetBrains黙認Kotlinエバンジェリストである@ngsw_taroに誘われ、4/2(土) Kotlin 1.0リリース記念勉強会 in 京都に行ってきました。

ふと気がついたら通常参加枠が満席でLT枠のみ!ちょうど良いので背水の陣ドリブンで自社システムへのKotlin導入をして勉強会に臨みました。
スライドはこちら↓

データクラスから始めるKotlin / JetBrainsに行ってきました from Yusuke Yamamoto


セッションで話したのは"左側"のみですが、会場では予想以上に"右側"を楽しんで頂けたようでなによりです!

KotlinはJavaに慣れている人にとって導入障壁が低く、かつモダンな言語の恩恵にあずかることが出来て良さそうだなーと思っていました。実際に試してみたところ予想以上にスムースに導入でき、作業を始めた当日にすんなりとプロダクションシステムに組み込むことができました。
既存のJavaのエコシステムに乗っかりやすく開発ワークフローを変える必要がなく、大変好みです。

最後にみんなでKotlinポーズ!


その他の方々のセッションの資料は以下のイベントのページに掲載されています。
4/2(土) Kotlin 1.0リリース記念勉強会 in 京都

まだまだ自分が試していない機能について紹介があり勉強になりました。自社システムで着々とKotlin化を進めていきたいと思います。
主催の関ジャバの皆様、ありがとうございました!

このエントリーをはてなブックマークに追加   

PHPカンファレンス福岡2015に行きました! #phpconfuk


PHPカンファレンス福岡2015に行きました。
生まれて初めての福岡。また近いうちに来ようと胸に誓いました。










































このエントリーをはてなブックマークに追加   

逆引きNashorn - やりたいことからNashornのサンプルコードを引く

機械校正ツールであるRedPen(ライブデモ)は、デフォルトで内蔵している沢山の校正ロジックに加え、ユーザーがカスタムロジックを実装することができます。
自分で実装するにはJavaでValidatorというクラスを拡張すれば良いのですが、間口を広げるためにJavaScriptでもロジックを実装できるようにしました。
RedPen自体はJavaで実装しており、JavaからV8などを呼び出すのは大変なのでJava8に内蔵されているJavaScriptエンジンであるNashornを使いました。

あちこちの情報をかき集めて工夫をしたので、ここにまとめておきます。
やりたいことと、実現するためのコードを逆引き的に並べています。実現方法は全部違うけれども、どのコードもHello Nashornと出力するだけです。

JavaScriptを呼び出す
JavaScriptの関数をJavaから呼び出す
JavaのstaticメソッドをJavaScriptから呼び出す
JavaScriptからJavaのオブジェクトを参照する(バインドする)
JavaScriptをコンパイルしてから呼び出す
JavaオブジェクトのメソッドをJavaScriptの標準関数のように呼び出す

簡単にビルド、実行できるようまとめたものはGitHubに置いてあります。(ASLと書いてあるけど、創造性を微塵も感じさせないコードなので好き勝手コピペしていただいても大丈夫かと)

JavaScriptを呼び出す
print関数を呼び出すだけのJavaScriptを実行します。getEngineByName()の引数はjsでもJavaScriptでもNashornでもok。
SimpleNashorn.java

public class SimpleNashorn {
public static void main(String... args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
// works also with "js" / "javascript"
ScriptEngine engine = manager.getEngineByName("nashorn");
// prints "Hello Nashorn"
engine.eval("print('Hello Nashorn');");
}
}

JavaScriptの関数をJavaから呼び出す
JavaScript内で定義してある関数をJavaコードから呼び出す。invokeFunctionの第一引数が関数名、第二引数は可変長引数で、第一引数で指定した関数に渡すパラメータを任意の個数渡せる。
InvokeJavaScriptFunctions.java
public class InvokeJavaScriptFunction {
public static void main(String... args) throws ScriptException, NoSuchMethodException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.eval("function hello(message){print(message);}");
Invocable invocable = (Invocable) engine;
// prints "Hello Nashorn"
invocable.invokeFunction("hello", "Hello Nashorn");
}
}

JavaのstaticメソッドをJavaScriptから呼び出す
Java.typeっていうNashorn固有の機能を使います。
InvokeJavaStaticMethod.java
public class InvokeJavaStaticMethod {
public static void main(String... args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
// prints "Hello Nashorn"
engine.eval("Java.type('nashornsampler.InvokeJavaStaticMethod').hello('Hello Nashorn');");
}

public static void hello(String message) {
System.out.println(message);
}
}

JavaScriptからJavaのオブジェクトを参照する(バインドする)
JavaScriptとJavaで相互に作用のあるコードを書くときはこんな風に。
BindJavaObject.java
public class BindJavaObject {
public static void main(String... args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.put("myObj", new BindJavaObject());
// prints "Hello Nashorn"
engine.eval("myObj.hello();");
}

public void hello(){
System.out.println("Hello Nashorn");
}
}

JavaScriptをコンパイルしてから呼び出す
JavaScriptコードを一旦Javaのバイトコードにコンパイルしてから実行します。繰り返し呼び出す場合は高速。Java8u40以降であればコンパイル結果はキャッシュされるのでJVMを再起動しても速攻でコンパイル結果が得られるらしい。
InvokeCompiledJavaScriptFunction.java
public class InvokeCompiledJavaScriptFunction {
public static void main(String... args) throws ScriptException, NoSuchMethodException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
CompiledScript compiledScript = ((Compilable) engine).compile("function hello(message){print(message);}");
compiledScript.eval();
Invocable invocable = (Invocable) engine;
// prints "Hello Nashorn"
invocable.invokeFunction("hello", "Hello Nashorn");
}
}

JavaオブジェクトのメソッドをJavaScriptの標準関数のように呼び出す
JavaオブジェクトメソッドをJavaScriptよりobj.method()ではなく、単にmethod()と呼び出したい場合はこんな風に。
(恐らく要Java8u40以降)
BindJavaMethod.java
public class BindJavaMethod {
public static void main(String... args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.put("toBeBound", new BindJavaMethod());
engine.eval("var hello = Function.prototype.bind.call(toBeBound.hello, toBeBound);");
// prints "Hello Nashorn"
engine.eval("hello('Hello Nashorn')");
}

public void hello(String message) {
System.out.println(message);
}
}


関連記事:
Heroku Buttonで簡単にHerokuにデプロイ #herokujp - #侍ズム
WebアプリケーションをIntelliJ IDEAからHerokuへデプロイする #herokujp #jbugj - #侍ズム
Java WebアプリケーションをHerokuへデプロイする #herokujp - #侍ズム
Getting Started with Java on Heroku | Heroku Dev Center
RedPen を公開しました (ベータバージョン) | Advanced Technology Lab
社内共有会で使用した RedPen 資料と進捗 | Advanced Technology Lab

このエントリーをはてなブックマークに追加   

Twitter4Jが8周年を迎えました!お祝い募集中 #twitter8j

Twitter4Jを公開したのが2007年6月9日。
Twitter4J 1.0 リリース - #侍ズム

今年でなんと8周年を迎えました。自分が開発してきた中では一番手間暇、時間を掛けているコードになります。

レートリミット、画像アップロード、ハッシュタグ、リツイート、幻のアノテーション、リスト、ストリーミングAPI・・・・そしてAPI1.1。とてつもない速度のアップデートに逐一対応してきました。

最近は新機能の追加はTwitterと連携するアプリケーションを開発している開発者達によって行われています。自分がやっているのはpull requestのレビュー/マージやLambda対応、可変長引数の導入(最近まだJava1.4互換にしていた関係で使っていなかった)など。

「クローズドベータのAPIアクセス権も一部もらっているのでそこらへんの開発はやっていかないと!」と1年前にも書いているのですが、やっていかないと!

ここ毎年活用させて頂いていますが、応援の声を物(Amazonギフト)で届けてくれるサービス、Kampa!でお祝い、応援の声を集められればと思います。

Twitter4Jでなにか楽を出来た方、勉強になったよ!応援してるよ!という方、実際にアプリ・サービスで使っているよ!という方、以下のリンクよりカンパをいただけるとうれしいです(15円からカンパできます)。




もちろんカンパをいただかなくても日頃の「ありがとう」の声、ツイートでもたくさんたくさん元気がでるので今後ともご声援をいただければ幸いです。

なお、カンパしていただく際はどなたから送られてきたか分かるよう、メッセージにお名前やハンドル、そしてもしよろしければ以下に掲載するための情報をご記入いただければと思います。(どうしてもという場合はもちろん匿名でも結構ですが)

また昨年と同じく、カンパしてくださった方・プロジェクト・企業のロゴ/リンクを随時このエントリに貼り付けていきます。
必ずしも掲載している企業やプロジェクトがTwitter4Jを活用しているわけではありません。(順不同、大小不同):

セガの岩﨑さん(@twtrfk)はバーチャファイターを始めとするアーケードゲームのTwitter連携にTwitter4Jを活用してくださっています。

Virtua Fighter5 Final ShowdownのTwitter連動機能について #twtr_hack from Takeshi Iwasaki

・Virtua Fighter5 Final Showdown:バーチャファイター5 ファイナルショーダウン


・初音ミク Project DIVA Arcade Future Tone


岡山で、東京で、サンフランシスコで、お世話になってます!:


@sue445作:
Azusaar!!(いつもAPIを利用させて頂いてます!)


ツイ廃あらーとの(@MulticolorWorld)、昨年に引き続き応援、ありがとうございます!
毎日0時にツイート数等の統計をツイートしてくれるサービス:

ツイ廃あらーと開発日誌 | 開発中のこととかいろいろ

Java EEについて、堀北真希さんについてたくさん情報発信してくださっているキクタローさんから。ありがとうございます!:



Groovyを初めとする最新情報を発信してくださっている@grimrose。ありがとうございます!:


ざきやまさん(@z_a_ki3)ありがとうございます!
おれろぐ #z_a_ki3


画像収集ボットなどを開発していらっしゃる@gecko655、ありがとうございます!:
・\アッカリーン/ (@akalin_kotlin)


・藤宮香織(@Fujimiya_Monday)


以前Twitter API勉強会で学習して対話できるボット、わけちを紹介してくださった@kaiba、ありがとうございます!
わけち(waketi)の紹介
あれ、なんかアイコン変わった?

ブログ:
Pokosho!

@bina1204より。いつもマラソンと英語の勉強応援してます!:
I Wanna Be β | 何事も人並みに

@jjugでいつもお世話になっている@megascus、ありがとうございます。
熊本でのご活躍をお祈りしてます!:
水まんじゅう
熊本で働いてくださるITエンジニア募集 - 水まんじゅう

@kt81より。いつもIntelliJ IDEAのご利用ありがとうございます!


@ijufumi_0810より。IntelliJ IDEAのご利用ありがとうございます!


Twitter4Jのプルリクエストもお送り頂いたことがある小宮さん(@komiya_atsushi)より、出張前のお忙しい中お祝いを。ありがとうございます。

blog.k11i.biz

http://www.slideshare.net/komiyaatsushi

自動校正ツールRedPenなどを開発してる(私もコントリビュートしてます)、@takahi_iより。ありがとうございます!

Github - RedPen

そして、RedPenをお試しいただいたこともある@kubosho_より。ありがとうございます!
I'm kubosho_


Twitter4Jにコントリビュートしてくださっている@fat_daruuuumaより。ありがとうございます!
でぶだるまは赤だるま


@zinbeより。ありがとうございます!

我らねぶた馬鹿

@morizo_999より。ありがとうございます!

I Wanna Be A Clean Corder

岩切さん(@kohsei)より。ありがとうございます!


よすけっちょさん(@aeolia)より。ありがとうございます!


@objectxplosiveより。ありがとうございます!


Twitter4JのHTTP2対応や、様々なプロパティの追加など多大なコントリビュートをしてくださっている竹内さん(@takkeより。ありがとうございます!

ついっとぺーん


大きな電話帳


黒田さん(@i2key)より。ありがとうございます!Twitter API勉強会のときからのつながり?長い!
そして最近はスプラトゥーンで一緒に遊んでいただいてます!


最近リッター3Kで打たれまくっている@eiryuより。ブログもいつも参考にさせていただいています。ありがとうございます!

コードつれづれ

いろいろな勉強会で、そしてSpring Bootの本でお世話になっている@makingより。ありがとうございます!

BLOG.IK.AM


やまもとゆうすけさん(@doenis05)より。研究室時代より5年ほど、Twitterのデータを使うときにTwitter4Jを使って頂いていたそうです。ありがとうございます!


@MegaBlackLabel)より。いつもTwitterでお世話になっております!



関連記事:
Twitter4Jが7周年を迎えました!お祝い募集中 #twitter7j
Twitter4Jが6周年を迎えました!お祝い募集中 #twitter4j6thanniversary - #侍ズム

このエントリーをはてなブックマークに追加   

最新のElasticsearchを動かしてみる。触りだけ #elasticsearchjp

実は検索エンジンの会社で働いていたことがあります。
ぶっちゃけ検索エンジンのテクノロジーの奥深くについてドップリ詳しいわけではありませんが、昨今のシステム開発に置いて検索技術の重要性は重々承知していいます。

自分の会社では今はカッコイイことをしておらず、永続ストアはGoogle Docs、Excel(!!!)、H2データベースにあり検索エンジンは導入できていません。

日々あらゆるデータソースを探し回っている残念な状態です。

当然ながらこれから検索エンジンを導入するならばElasticsearchを使うのが自然な流れだよね、と思いつつ手を動かせていなかったので背水の陣でElasticsearch Advent Calendar 2014にエントリした次第です。

前置きが長くなりますがもう少し前置きがあります。今弊社には実はElasticsearchの社員がおり、毎日左隣でElasticsearch、kibana、logstashをいじっているのを目にしています。楽しそうです。

自分のElasticsearchの経験は、一度Elasticsearchの勉強会中に内職してTwitterのsampleストリーム(全ツイートの1%程度を受け取れる)をフィードするのを作った程度。フィードするだけで検索できていません!

これも一年前の話なので、最新版ではだいぶ変わっているかな?ということで触ってみました。

しかし時間があまりない!
とりあえずドキュメントをフィードして簡単に検索するのをREST APIを使ってやってみます!

1. Elasticsearchの起動
elasticsearch.orgよりダウンロード。展開してbinディレクトリのelasticsearchコマンドを叩くだけ。
推奨JVMは知らないけどJava1.8.0_25ですんなり起動しました。
9200番がREST APIの口になるみたいです。

2. ドキュメントのフィード
ツイートのデータっぽいのをcurlコマンドで3件だけフィードします。スキーマレスなので事前にスキーマの定義なし。いきなりJSONを突っ込めばOK。

23:52 ~ $ curl -XPUT 'http://localhost:9200/tweets/tweet/1' -d '{
> "text": "this is a tweet",
> "screen_name": "yusuke",
> "tweet_id": "1"
> }'
{"_index":"tweets","_type":"tweet","_id":"1","_version":4,"created":false}
23:52 ~ $
23:52 ~ $ curl -XPUT 'http://localhost:9200/tweets/tweet/2' -d '{
> "text": "this is also tweet",
> "screen_name": "johtani",
> "tweet_id": "2"
> }'
{"_index":"tweets","_type":"tweet","_id":"2","_version":3,"created":false}
23:52 ~ $
23:52 ~ $ curl -XPUT 'http://localhost:9200/tweets/tweet/3' -d '{
> "text": "yet another つぶやき",
> "screen_name": "mike_neck",
> "tweet_id": "3"
> }'
{"_index":"tweets","_type":"tweet","_id":"3","_version":3,"created":false}

これで3件のツイートが入りました。

3. 検索
同じくcurlコマンドで検索します。
23:53 ~ $ curl -XGET http://localhost:9200/tweets/tweet/_search -d'
> {
> "query":
> {
> "match":{"screen_name":"yusuke"}
> }
> }'
{"took":2,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.30685282,"hits":[{"_index":"tweets","_type":"tweet","_id":"1","_score":0.30685282,"_source":{
"text": "this is a tweet",
"screen_name": "yusuke",
"tweet_id": "1"
}}]}}

screen_nameがyusukeのツイートだけを検索できましたね!
ぶっちゃけJava APIを使ったときより直感的に扱えました。最新版のJava APIは見ていないのでわかりませんが、わかりやすくなってるといいなー。
これからもっと触ってみます!

このエントリーをはてなブックマークに追加   

ポータブル、2TBのHDDが9,880円

ベアドライブよりも安いわけわからない値段だけどポチった。
悩んでるときは年内の配送予定だったけど、ポチったらお届け予定日が1月20日に。
悩むくらいなら今すぐポチ!

このエントリーをはてなブックマークに追加   

明日11/12(水)、12:30〜13:00 #モイめし に出演いたします

標記の通り、明日ツイキャスの社長、赤松さんと対談ランチ?企画である#モイめしにお邪魔させていただきます。

11月12日12:30からツイキャス生放送!ゲストは山本裕介氏【30分対談Liveモイめし】 - エンジニアtype
打合せもまだなのでどんな話になるかわかりませんが、是非ご試聴ください。

コメントにも極力反応できるようがんばります!






関連記事:
TwitCasting - Stream Live Video on Twitter and Facebook
リアルタイム動画配信『ツイキャス』が、世界展開を視野にあえてやること、やらないこと【連載:NEOジェネ!】 - エンジニアtype

このエントリーをはてなブックマークに追加