谷本 心 in せろ部屋 このページをアンテナに追加 RSSフィード

2016-07-31

[]Day -1 : ラスベガスに来ました。

SpringOneに登壇するため、ラスベガスにやってきました @ です。

なんか「ラスベリガス」とか言う人が後を絶たなくて困るのですが、滑りに来たわけではありません、むしろ統べに来たという方が近く、「ラ統べガス」ですかね。

はい早速すべりました。


さてラスベガス、とても暑いです。事前調査で最高気温が40℃を越えることは知っていましたが、まぁ暑いです。ただ先週は46℃にも達したらしいですが、今週はせいぜい40℃程度なので、外にいても死ぬほどではない感じです。

よく「海外の夏は、暑くてもカラッとしてるから、日本ほど暑く感じない」とか言う人がいて、子供の頃はそれでも「んなわけない、暑いよ」とか思ってたのですが、最近ではその感覚が分かるようになりました。老けるとそういうのが分かるようになるんですかね。


なおSpringOneは8/1(月)から8/4(木)の4日間ですが、土曜日着の飛行機で来たので、土日はちょっと時間がありました。それで少しだけラスベガスらしくない観光をしてきたので、その辺りをお伝えします。


まず何はなくともSIM購入

海外に着いたらまずやるのがSIM購入ですよね? SIMないと死んでしまいますよね? アメリカではだいたいT-Mobileを使っているので、今回もT-Mobileを選びます。


事前に調べてラスベガス宿泊先の近くにはT-Mobileがないことを知っていたため、空港に着いたらホテルに向かわず、そのままT-Mobileに向かいました。Uberで$10ぐらいの所にあります。

なにげに空港の無料WiFiだけでUberを呼ぶという、ちょっと難易度高めのことをやりましたが、特に問題ありませんでした。

T-Mobileでは旅行者向けのプランとして、$30で2GB、通話1000分まで、SMSし放題のプランがあったので、迷わずこれを選びました。僕にとって最高にちょうどいいやつです。


そしてT-MobileからふたたびUberを呼び、ホテルに向かいます。僕がデカいスーツケースを持っているのを見た運転手に「ホテルに行かずに電話を買いに来たのか、良い選択だな!」って言われました。俺を誰だと思ってるんだ、せろさんだぞ。

T-Mobileからホテルまでは$8ぐらいでした。

空港からホテルまでタクシーで$30ぐらいだったと言っていた人がいたのですが、空港からT-Mobileまで$10、そこからホテルまで$8の、合計$18だったことを考えると、Uberってとんでもなく安いなと思わされます。


開幕、当たり

ラスベガスと言えば、カジノ。空港にもスロットマシンがあるぐらい、カジノの町です。僕も過去にはちょっと言えないぐらいの額を貯金してきていて、いつか利子つきで引き出せると信じています。

今回はあまりカジノに興じるつもりはないのですが、一方で、手持ちの現金がほとんどなくて困っているという問題もあります。誰かと一緒にご飯に行って、まとめてカード払いして現金を集める方法も考えましたが、まだ日本にいる人も多く、めどが立ちません。

であれば仕方ないですよね、現金を増やすために、なけなしの$20をつっこんで勝負することにしました。


・・・その結果、3ターン目でヒットしました!

f:id:cero-t:20160801021242j:image

これで何とか、ハンバーガーぐらいなら食いつなげるぐらいの現金を手に入れることができました。今回はもうカジノでは遊びません!


ニャースマンキー、そしてガーディの巣

最近の話題と言えば、ポケモンGoですよね。仕事と資料作り をサボりながら の合間を縫って、僕も少しプレイしています。

それでラスベガスポケモン事情ですが、とにかくニャースがよく出ます。空港でもホテルでも、ニャースがポッポと同じぐらいの感覚で出てきます。マンキーも同じぐらい出て、その半分ぐらいガーディが出てきます。この3種類の巣になってる感じですね。

ホテルに着いて、ものの数十分でこうなってました。

f:id:cero-t:20160801021240j:image


もしかすると別のホテルに行けば違うポケモンの巣になってるのかも知れませんが、ちょっとそこまで歩く気力はありませんでした。

それよりも北米限定のケンタロスを捕まえたいのですが、残りの期間に手に入るのでしょうか。どっかにケンタロスの巣ないかな。


ボルダリングジムもありますよ

日曜にはボルダリングに行きました。ホテルからUberで30分程度、$20弱で行けるところにあるRed Rock Climbing Centerというところです。

ラスベガスにはRed Rock Canyonというグランドキャニオンの小規模版のような公園があって、クライミングも盛んらしく、その名前にあやかったクライミングジムです。


中はこんな感じ。ボルダリングよりロープクライミング主体なので、全体的に壁が高くなっています。

f:id:cero-t:20160801021241j:image

見てのとおりあまり広くないのですが、そんなに人も多くなく(十数人程度でした)、登るのを待たされることはほとんどありませんでした。


コースはとにかく力、技より力、力こそパワーという感じで、1時間で腕がパンパンになりました。V3〜V5ぐらいを攻略してましたが、これ日本で言うところの3級から1級ぐらいなのですよね。僕、日本だと5級(簡単な所なら4級も)ぐらいなので、あまりにも感覚が違う感じです。

アメリカだと体格の差が激しいためか、様々な体格の人に合うよう足場が多めに設定されていた感覚があります。そのおかげで攻略しやすかった気がします。


コースはあまり豊富ではないのでボルダリングガチ勢には物足りないかも知れませんが、僕には良い感じのトレーニングになりました。


そんなわけで資料づくりに戻りますね

はい、まだ1ページもできてません。

日本にいるうちにデモはおおよそできたので、進捗30%てところでしょうか。前回のJavaOneの時に比べれば、随分進んでますね!


それなのになんか明日の夕方、リハーサルらしいんですよね。いえ、PCの接続チェックなどが主なので、資料ができあがっている必要はないですが。

せめて表紙と、自己紹介と、導入ぐらいは作っておかないとね、てへぺろ

ということで、頑張ってきます。


モンテカルロより、愛を込めて。

f:id:cero-t:20160801021243j:image

@cero_t でした!

2014-12-15

[][]SqlTemplateっていうJdbcTemplateのラッパーを作ってみました。

SQLが書きたいんや!」という想いのもと、

Spring Bootと組み合わせて簡単に使える、

JdbcTemplateのラッパーライブラリを勢いで作ってみました。


GitHubに置いています。

https://github.com/cero-t/sqltemplate


JdbcTemplate / NamedParameterJdbcTemplateをベースにして、

 1. SQLファイルが使えること

 2. Date and Time APIに対応すること

 3. publicフィールドに対応すること

 4. APIが今風であること

の4つを目的にして作りました。


それならMirageでいいんじゃね? という想いは消えませんが、

Spring標準機能のみを使うことによる、政治的な使いやすさを取りました。


作りましたって言っても、ただのラッパーですので

ソースコードはすっごく小さくて、空行とコメントを入れても600行ぐらいしかありません。

ジェバンニでなくとも一晩でやってくれるぐらいのサイズです。


利用イメージ

exampleのプロジェクトも作っておきました。

https://github.com/cero-t/sqltemplate/tree/master/sqltemplate-example


使う側のソースコードは、こんな感じになります。

@Component
public class SampleProcess {
    @Autowired
    SqlTemplate query;

    public void process() {
        List<Emp> emps = query.forList("sql/selectAll.sql", Emp.class);
        emps.forEach(e -> System.out.println(e.ename));

        Emp emp = query.forObject("sql/selectByEmpno.sql", Emp.class, 7839);
        System.out.println(emp.ename);

        Map<String, Object> condition = new HashMap<>();
        condition.put("deptno", 30);
        condition.put("job", "SALESMAN");
        emps = query.forList("sql/selectByCondition.sql", Emp.class, condition);
        emps.forEach(e -> System.out.println(e.ename));
    }
}

forObjectで1件検索、forListで複数件検索。

第一引数SQLファイル名で、第二引数戻り値の型、

第三引数以降がSQLにバインドするパラメータです。


ちなみにIntelliJを使っていると、ファイル名にカーソルをあわせて

Ctrl (Command) + クリックでSQLファイルを開けるのが嬉しいですね。


SQLファイルは、こんな感じになります。

select
    *
from
    emp
inner join dept
    on emp.deptno = dept.deptno
where
    dept.deptno = :deptno
    and emp.job = :job

第三引数に指定したMapやEntityの値を、SQLパラメータとしてバインドします。

内部的にはNamedParameterJdbcTemplateに処理を委譲しているだけです。


名前を指定せずに ? を使うこともできます。

select
    *
from
    emp
where
    empno = ?

第三引数以降に指定した任意の数の基本型(String、Date、Number)をバインドします。

こちらは内部的にJdbcTemplateに委譲しているだけです。


使い方

使うための設定は一つだけ。

@Configurationアノテーションをつけたクラスに

SqlTemplateを返すメソッドを作り、@Beanアノテーションをつけます。

@Bean
SqlTemplate sqlTemplate(JdbcTemplate jdbcTemplate, NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
    return new SqlTemplate(jdbcTemplate, namedParameterJdbcTemplate);
}

この初期化の仕方は @ がpullリクエストで教えてくれました。

ありがとう!


ちなみにSqlTemplateのコンストラクタの第三引数には、

SQLファイルを読み込む際のテンプレートエンジンを指定することができます。

たとえばここで2-way SQLパーサーを指定すれば、

2-way SQLにも対応できるというスンポーです。


現時点でもFreeMarkerを使うことができるようにしているんですが、

一度も動作確認してないので、動くかどうか分かりません。てへぺろ


いまあるAPI一覧

用意したメソッドの一覧は、以下になります。

<T> T forObject(String fileName, Class<T> clazz, Object... args)
<T> T forObject(String fileName, Class<T> clazz, Map<String, Object> params)
<T> T forObject(String fileName, Class<T> clazz, Object entity)

<T> List<T> forList(String fileName, Class<T> clazz, Object... args)
<T> List<T> forList(String fileName, Class<T> clazz, Map<String, Object> params)
<T> List<T> forList(String fileName, Class<T> clazz, Object entity)

int update(String fileName, Map<String, Object> params)
int update(String fileName, Object entity)
int update(String fileName, Object... args)

戻り値をMapにする「forMap」とか

案件では欠かせない「batchUpdate」は、まだ作っていません。

委譲するだけなので、作っちゃえばいいんですけどね。


制限事項的なやつ

とりあえずコンセプト実証した程度なので、色々できません。

 1. 上に書いた通り、forMapとbatchUpdateがありません。

 2. JSR-310を使っているので、Java8でしか動きません。

 3. publicフィールドのないgetter/setterベースのJavaBeansは使えません。

 4. パッケージ名が変です。

 5. mvnリポジトリに置いてないです。

 6. README.mdちゃんと書け。


ひとまずは「こんなコンセプトでサクッとできたよ! 」っていう位置づけです。

自由に参考にしてください!

2013-10-02

[]俺様とJavaOne 2013(後編)

いよいよJavaOne最終日です。

最終日はCommunity Keynoteと、いくつかのセッションを行なうだけで

夕方ぐらいには閉幕してしまいます。


Day 5 : 子供のプログラミング、どうしていますか?

Community Keynote

最終日、最初のセッションはコミュニティキーノート、

かつては、Gosling's Toy Showなどが行なわれていたイベントですね。

このキーノートで日本の皆さんにお伝えしたい事は、ただ一つ。


#てらだよしお が、Tシャツを投げていました!


あぁ、写真とか撮ってないです、すみません。

たぶん誰か撮ってます、そっちに期待してください。


私の席からは見えませんでしたが、James GoslingもTシャツを投げていたそうなので

この瞬間、てらだよしおはJames Goslingに匹敵するエンジニアだった、ということですね!


それはさておき、

このコミュニティキーノートで一番印象に残ったのは、教育の話です。

10〜14歳の子供を対象にしたDevoxx 4 kidsというイベントの様子が紹介され、

子供が「やった、動いた!」などと言いながら、プログラミングを楽しんでいました。


また、会場にはArun Guptaの10歳の息子、Aditya Guptaが登場して、

Minecraftというゲームをハックした時の考え方などを紹介しました。

「これはEclipseという開発環境で」「左側のソースファイルの一覧があって」などと

10歳の子供が説明するだけで会場は大盛り上がりなのですが、

恐らく、彼自身はなぜ会場が盛り上がっているのか分からなかったに違いありませんw


10歳の子供が、数千人(?)の大人を相手に、

大して緊張する様子もなく、声を震わすこともなく、説明しきった様子は圧巻でした。

会場のスタンディングオベーションも、決して過大評価ではなかったと思います。

本当に素晴らしかったです。


Devoxx 4 kidsの動画や、Aditya Guptaの発表を見るにつけ、

同世代の子供を持つ親としては、そろそろ子供に楽しいプログラミングを

教えてもいいかな、という気持ちになってきましたね。


私自身、プログラミングを始めたのは、この年代だったと記憶しています。

一つの素養として身につけるには、決して早くない時期でしょう。


今度、科学未来館に行って、プログラミングできるおもちゃを買ってくるかな。


[CON4695] Java Memory Hogs

OracleのNathan Reynoldsによるセッション。

Keynoteが終われば帰る人も多い中、部屋は満席で立ち見が出るほどでした。

やっぱりメモリ系やGC系セッションは人気があります。


本当はこの前にいくつかのセッションを入れていたのですが、

Community Keynoteの後にJames Goslingとの記念写真撮影に並んでいるうちに

予約していたセッションが満席になってしまったり、

ランチで少し遠目に出ているうちに逃してしまったりなどして、

最終日のセッションはこれ一本になりました。てへぺろ


さて、

このセッションのテーマはJOverflowを使ったヒープメモリの診断です。

というかJOverflowって、ただのヒープダンプを解析できるだけではなくて、

無駄なヒープの使い方を指摘する機能まであるんですね。いいですねこれ。


このセッションでは、実際のJavaEEアプリケーションのヒープダンプを取り、

それをJOverflowで診断して検出した問題について、改善方法や結果が示されました。


たとえば英数字しか入らないStringをcharではなくbyteで保持したら

7%ぐらいメモリ効率が上がったとか

同じ文字列のStringがたくさん重複していたからString.intern()で改善したとか

空の配列やCollectionがたくさんあったからLazy初期化するようにしたとか

そういう話です。


このセッションを通して感じたことは

「JOverflowは、ヒープダンプのFindBugs」だということですね。


たとえば空のCollectionがたくさんあるとか、

同じ文字列のStringの重複がたくさんあることなどは、

理論上は「減らせば良い」わけですが、Lazy初期化やinternを使った処理を書くとなると

パフォーマンスへの影響や、可読性の低下(処理の複雑化)は多少なりあるため

なかなか全ての場所で、理論通りにコーディングするわけにもいかないと思います。


その点、JOverflowを使い、実際に動かしたアプリケーションのヒープダンプを解析することで

「本当に問題になるところ」が分かるため、実際的に改善すべきポイントを掴めるわけです。

このアプローチ、まさにENdoSnipeと同じですね!(←これが言いたかったの?)


大事なことなのでもう一度言いますが、

「JOverflowは、ヒープダンプのFindBugs」です。

ぜひ試してみましょう。


JavaOne 2013最後のセッションでしたが、かなり面白い内容でした。


JavaOneを終えて、最後に。

そんなわけで、これでJavaOne 2013は終わりです。


今年のJavaOneで一番印象的だったことは、

もちろん私自身が初めてスピーカーを務めたことですが、それを除けば、

子供へのプログラミング教育の話でした。


同世代の子を持つ私としては、

Devoxx 4 kidや、10歳のAditya GuptaによるCommunity Keynote発表などは

非常に印象的でワクワクすると同時に、負けていられないという気持ちになりました。


一方で、Javaも転換期に来たのかな、という印象もありました。


少し話はそれますが、

先日、「教育」に関する有名ブロガーのつぶやきが話題になりました。

人が教育の話をしはじめるのは、自分の成長に限界が見えた時、

要するに「自分の成長よりも、後進の成長のほうが価値がある」と考えるようになった時だ、

というアレです。


この話も踏まえると、このJavaOneで「子供の教育」の話がなされるというのは

多くのJavaの開発者たちが、あるいは、Javaそのものが転換期に来た、

悪く言えば「焼きが回った」ところにさしかかったのかな、という印象になったわけです。

いや、たぶんに感覚的な話なんですけどね。


また、今回は新しい情報がほとんどないJavaOneでしたが、

個人的に(弊社的に)言えば、Flight RecorderやMission Controlの

裏側の仕組みや、今後目指すところを聞いたことで、

ENdoSnipeの開発も改めて頑張ろうという気になりました。


ENdoSnipeを、Duke's Choice Awardをとれるぐらいの秀逸なプロダクトにしたいなと、

そんな大きな野望を持ちながら帰国の途につきました。


よし、頑張ろう!