<< 前へ | Home

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

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

初心者にも上級者にもオススメ - Java最強リファレンス @yuichielectric著

Javaの最強リファレンス、その名も「Java最強リファレンス」を頂きました。



サイボウズ株式会社にてkintoneなどを開発されているエンジニア田中 裕一(@yuichielectric)さんの著書。

Java8対応をうたう本はそれなりに出始めていますが、「とりあえずJava8に追加されたAPIにいくつか触れている」「Lambda記法をちょっと解説している」だけの本も相応にあります。またLambdaに触れる章を追加しただけで、他のコードは古めかしい残念な書き方をしている残念な本があるので注意が必要です。

そしてこのリファレンス、Java5〜Java8までとかなり広範囲をカバーしています。バランスを取るのは非常に難しいはず!

章立ては以下の通りです。合計535ページの超大作!
1. Javaの概要
2. Javaの基礎
3. 文字列・正規表現
4. 配列
5. コレクション
6. リスト
7. マップ
8. セット
9. Stream
10. 数値処理
11. ファイル操作
12. 日付時刻処理
13. クラス・オブジェクト・インターフェース
14. ログ出力
15. ネットワーク
16. データベース
17. サーブレット
18. 並行処理
19. システム
20. 国際化
Appendix Eclipseを使う

「GUI以外はほとんどカバーしている」といったところ。そして肝心の解説内容を見ると「こういう風に書く、Java7以降では(Java8以降では)こういう風に書くとよりシンプルに/効率的に書ける」といった形で併記されています。道理でページ数が多いはず!

それなりのベテランJavaプログラマは、何か処理を書く際昔ながらのAPIを使って冗長になってしまい、「たぶんこれNIOを使えばもっとシンプルに書けるはずだけど・・・まぁ動くコード書けたからいっかー」と放置することも少なくないはず。(特にファイル操作周りとか)
本書はリファレンスなので、「何を行いたいか」というトピックを元に実際のコードイメージを逆引きすることができます。
そして自分が使っているJavaのバージョンに応じて適宜モダンな書き方を確認することが出来るので便利そうです。

もちろんこれからJavaをどんどん憶えていきたいという初心者にも良いでしょう。
あくまでリファレンスなので、頭から読み進めてJavaを習得する、という目的には向いていませんがある程度基礎から発展的なトピックへという順番で章立てがされています。Javaの基礎文法はとりあえず把握している、という人であればひとまず1〜8章くらいまでは分からないところは飛ばしてもいいのでざっと通して読むといいかもしれません。

個人的にはJava8で一番メリットを実感しているOptionalについて2章17項にて「NullPointerExceptionを防ぐ」として触れている点がポイント高い!

まとめとして、初心者から上級者までまんべんなくオススメできる一冊です。軽い筋トレになるボリュームで2,580円(税別)とお値頃なのも良いですね。

ボリュームがあってちょっと場所を取る本だけれども、ささっとめくって必要な情報を取り出すには紙の媒体が向いていると思います。机に一冊置いておきましょう。



惜しいのがページ両端にある章番号。20章もあるのでさすがにどの章に何が書いてあるかまで憶えることは出来ないので、パラパラっとめくる際、自分が欲しい情報が何章にあるのか確認しやすいよう、章番号だけでなくトピックについても一言添えてあるとめくりやすかった!
20章分のトピックを全てのページ両端に記載するのはレイアウト的に厳しそうだけど・・・。

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