Hatena::ブログ(Diary)

techlog RSSフィード

理解というものは、つねに誤解の総体に過ぎない
 「スプートニクの恋人」とか「かえるくん、東京を救う 」より

こちらになりました → http://sadah.hatenablog.com/

2013-02-02

[][][]JavaHTML5 Night で話してきた

f:id:j7400157:20130131205540j:image

JavaHTML5 Nigtht で「JavaHTML5のこれまで」と「WebSocket概要」について話してきた。


Java & HTML5 History

HTMLのスライドはこちら。

1993年からの20年を振り返ってみた。資料作りながら、感慨深い思いだった。JavaHTML5を合わせてみてみると、なかなか楽しかった。

Javaの歴史については、こんなサイトがあった。英語だけど。HTML5でパララックスなサイト。ソースを覗くとbodyにはdivとimgしかなかったw

Java 5 が2004年で、ジェネリクスや拡張forループが入ったのはもう9年前かと。同年WHATWGが発足している。

2011年には、Java SE7がリリースされ、HTML5がLast Working Draftになった。いろいろ動いた年だった。

Java も HTML も停滞していた時期があったけど、いまはどんどん変わっていくので、これからが楽しみ。


WebSocket on Glassfish

HTMLのスライドはこちら。

Glassfishを使ったWebSocketのサンプルをライブコーディングしてきた。あとはnode.jsでのWebSocketのサンプルも紹介した。

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package websocket.sample;

import javax.websocket.Session;
import javax.websocket.WebSocketEndpoint;
import javax.websocket.WebSocketMessage;

/**
 *
 * @author sada
 */
@WebSocketEndpoint("/echo")
public class NewClass {
    @WebSocketMessage
    public String echo(String message, Session session){
        return session + " "  + message;
    }
}

これはほぼ最小限のサンプルだと思う。受け取った文字列を返すだけのechoサーバ。

Javaでこれだけ短いコードでWebSocketが使えるって、なかなかすごい。


<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
        <script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
        <script>
            $(function(){
                var host = "ws://localhost:8080/WebApplication3/echo";
                var socket = new WebSocket(host);
            
                socket.onmessage = function(message){
                    console.log(message.data);
                }
                $("#sendBtn").on("click",function(){
                    message = $("#message").val()
                    socket.send(message);
                });
            });
        </script> 
    </head>
    <body>
        <h1>Hello World!</h1>
        <input type="text" id="message" />
        <button id="sendBtn">send</button>
    </body>
</html>

細かいことはこっちに書いた。

これまでもTomcatやJettyでWebSocketを仕えたけど、こうやってアノテーションベースで書けるとすごく便利。そもそもこのコードはServletでさえないし。

JavaでWebSocketのクライアントも書けるから、いろいろ活用できるところは多いと思う。なかなか楽しい。


いろいろ

Node.jsの環境構築とサンプルを動かすまで。(Macのみ)


資料は reveal.js を使って作った。PDF出力もできるので、PDFにしたものをSlideShareに上げている。HTMLの資料もあげたいけど、バギー過ぎるのでとりあえず、PDFで。


まとめ

僕が初めてプログラムを書いたのはJavaだった。大学に入ってから、授業で書いた。それから10年以上ずっとJavaを使っていた。仕事だけじゃなく、趣味としてもJavaを書いていた。

Java Hot Topicには何回も参加したし、ここでもJavaのことをいろいろ書いていた。

いまはJavaを書いてないけど、今回の勉強会のために書いてみて、Javaも変わっていってるんだ、ということを感じた。

Javaを使わなくなってから、まさかこんなふうに話をする機会があるとは思わなかった。嬉しかったし、とても光栄なことだった。エンジニアをやっていると、いろいろなところで繋がるな、と。


自分より詳しい人がたくさんいて緊張した。でも懇親会で楽しそうに話してましたねって言われて、それが嬉しかった。話している技術の楽しさが伝わるといいなと思ってやっていたので。

2011-12-29

[][]Androidで3冊

ちょっと前まで Hadoop をやっていたけど大人の事情で頓挫して、最近はAndroidをやっている。

途中のものもあるけど、以下の3冊を読んだ。Androidは本が多すぎてどれがよい本なのかさっぱりわからない。だからいろいろ借りて読んでみた。

この3冊を読んで簡単なアプリなら作れるようになった。作り方の流れがわかって、わからないことは調べてなんとかしていけるくらい。

「はじめてのAndroidプログラミング入門 決定版」は、プログラムを書いたことのない人向け。だからJavaの文法の説明なんかもあったりする。フルカラーだし、環境の作り方やデバッグの仕方が丁寧に書かれていてわかりやすかった。でもこれを読んだだけじゃ、作れるようにはならない。

Google Androidアプリ開発ガイド」はもうちょっと実践的で、いろいろなコンポーネントの使い方を学べた。これを読んで、Androidの仕組みやアプリケーションの基本的な構造がわかった。

Android Layout Cookbook」はデザインやレイアウトに特化した本。上記2冊を読んで、内容を理解できるようになった。普通に作っていると、こんな風にレイアウトしたいと思ってもなかなかできないし、なにを設定したいいのかわからない。この本のサンプルを知ることで、レイアウトの組み方や設定の意味がわかった。


最初が大変だったけど、ある程度覚えてしまえばなんとかなった。たぶん。新しい技術を使うときは、だいたいそんなもんだけど。

Javaはある程度できるけど、GUI開発の経験はほとんどない。だからどういったものがよいコードなのかわからない。クラスの分割で悩む。あと inner class や thread を実践的に使うことがあまりなかったので、書いてて楽しい。



Google Androidアプリ開発ガイド
柳井 政和
秀和システム
売り上げランキング: 116365


Android Layout Cookbook アプリの価値を高める開発テクニック
あんざい ゆき
インプレスジャパン
売り上げランキング: 5427

2011-11-20

[][]JavaOne 2011 報告会 に行ってきた

f:id:j7400157:20111115225637p:image:w640

これに行ってきた。実ははじめてOracleのオフィスに入った。Sunのオフィスには何度も行っていたけど、Oracleになってからはなかなかタイミングが合わなくて。

オフレコ話ばかりで書けることがありません、といったことは全然なく、特にオフレコな話も無かったような気がする。

ただ会場に入った時点でビールや酎ハイの缶(それも全部500ml缶)が置かれ、セッションが始まる前にピザがテーブルに到着した。

こんなにメモを取らなかった勉強会は久しぶり。MacBook Air持っていった意味はほとんどなかった。というわけで、togetterでどうぞ。楽しかったことだけは覚えてる。

いちおう、感想。

日本で二番目に「細かい」JavaOne報告 谷本 心 @

TreeSetのところまでは覚えています。

Groovyの使いどころ 〜7つの導入パターン(2011年度版​)〜 中野 靖治 @

便利そうだけど使ったことがなくて、セッションを聞いてみるとやっぱり便利そう。

JDK7 Quiz… 木村 英一 @

勘が冴えて2問正解した。

JavaOneで一番セッション数が多かったのは… JavaFXでした 櫻庭 祐一 @

Swing is dead...

ななめ45°からみたJavaOne 末永 恭正 @

アセンブラ…

はじめてのJavaOne 上田 悠介

やっぱり一度は本場のJavaOneに行ってみたい。50万は掛けれないけど。

写真で振り返るJavaOne 櫻庭 祐一 @

ここ数年は櫻庭さんの写真でJavaOneを楽しんでいる。FacebookのJavaOneのグループ(?)でも流れていたので。


まとめ

f:id:j7400157:20111114195533j:image:w640

普通の勉強会とはちょっとちがってJavaOneの報告だし、ビール飲みながら話を聞いて、同じ席のひとと話をしたりするは楽しかった。エンジニア同士の交流にもなっていいと思う、たまにはこういうのも。

来年は日本でJavaOneが開催される。もちろん本場よりも規模は小さいけど、それでも楽しみ。

2011-09-16

[][][]Google+ APIが公開されたので試してみた

f:id:j7400157:20110916130950p:image:w640

Google+ API が公開された。まだ参照系のAPI( People.get Activities.get Activities.list )のみだけど、これからどんどん楽しくなるといいな。


APIs Explorer(APIを簡単に試せるところ)には Google+ API があったけど、 Activities.list はうまく動かなかった。People.get と Activities.get は動いた。

Google APIs Explorer

またAPIのドキュメントの examples の URL も間違っていて、うまく動かなかった。残念。でもURLはちょこっと直せばちゃんと動いた。


Google+ API の使い方

大して難しくないけど、Simple API Access の使い方を書いておく。今回は取り上げないけど、Google+ API はOAuth2にも対応している。

いまは APIのリクエスト数の制限が 1,000 queries/day なので、ご利用は計画的に。


API key を取得

f:id:j7400157:20110916130953p:image

まずは API Console からAPIを有効化して、API key を取得する。

f:id:j7400157:20110916130952p:image

確認して同意する。

f:id:j7400157:20110916130951p:image

これでAPI Keyの取得は完了。

あとはそれぞれのメソッドに対し、HTTPSでリクエストを送ればよい。


プロフィールの取得 / people.get

リファレンスはこちら。

こんな感じで id を指定するだけ。idはプロフィール画面のURLにある数字のやつ。僕の id は 107682764353690170518 になる。yourAPIKey には、さっき取得した API Key を入れる。

https://www.googleapis.com/plus/v1/people/107682764353690170518?key=<yourAPIKey>

このURLにアクセスすると、こんな感じの情報が取得できる。(長いので整形している)

{
  "kind": "plus#person",
  "id": "107682764353690170518",
  "displayName": "sada h",
  "gender": "male",
  "aboutMe": "<div>すきなこと寝ること。きらいなこと起きること。 </div><div>Javaすき。システムエンジニア。</div><div>写真すき。一眼レフ、明るい単焦点レンズすき。</div><div>鎌倉すき。鎌倉在住。</div><div>お酒すき。ワイン、ウィスキー。</div><div><br></div><div>----</div><div><div>Zen-Coding 使ってます。</div></div><div><br></div><div>Zen-Coding の Chrome Extension 作ってます。</div><div><a href=\"https://chrome.google.com/webstore/detail/iodhcpffklplnfaihoolhfbejbinhcgn\">https://chrome.google.com/<WBR>webstore/detail/<WBR>iodhcpffklplnfaihoolhfbejbinhc<WBR>gn</a></div><div><br></div><div>UserScriptも作ってます。</div><div><a href=\"http://userscripts.org/scripts/show/105015\">http://userscripts.org/<WBR>scripts/show/105015</a></div><div><br></div><div>@ITで記事を書きました。</div><div>もしも10分の1の行数でHTMLが書けたら(1/2) ─ @IT</div><div><a href=\"http://www.atmarkit.co.jp/fwcr/design/tool/zencoding01/01.html\">http://www.atmarkit.co.jp/<WBR>fwcr/design/tool/zencoding01/<WBR>01.html</a></div><div><br></div><div><br></div>",
  "url": "https://plus.google.com/107682764353690170518",
  "image": { "url": "https://lh5.googleusercontent.com/-E1jvr_nZ6mY/AAAAAAAAAAI/AAAAAAAAAfw/IYToOPlWagA/photo.jpg" },
  "urls": [
    { "value": "http://d.hatena.ne.jp/j7400157/" },
    { "value": "http://twitter.com/sada_h" },
  ],
  "placesLived": [
    { "value": "鎌倉" }
  ]
}

アクティビティの一覧の取得 / activities.list

リファレンスはこちら。

こっちも id を指定するだけ。yourAPIKey には、さっき取得した API Key を入れる。

https://www.googleapis.com/plus/v1/people/107682764353690170518/activities/public?key=<yourAPIKey>

このURLにアクセスすると、こんな感じの情報が取得できる。(長いので整形している)

{
 "kind": "plus#activityFeed",
 "nextPageToken": "eJx9UzFIw0AU_ ...",
 "selfLink": "https://www.googleapis.com/plus/v1/people/107682764353690170518/activities/public?",
 "nextLink": "https://www.googleapis.com/plus/v1/people/107682764353690170518/activities/public?maxResults=...",
 "title": "Plus Public Activity Feed for sada h",
 "updated": "2011-09-16T04:43:17.752Z",
 "id": "tag:google.com,2010:/plus/people/107682764353690170518/activities/public",
 "items": [
  {
   "kind": "plus#activity",
   "title": "今日はGoogle+ API祭りだね!! http://googlecode.blogspot.com/2011/09/getting-started-on-google-api.html ht...",
   "published": "2011-09-16T00:58:33.000Z",
   "updated": "2011-09-16T00:58:34.466Z",
   "id": "z13bfr2pwv3tw1d1d23kjbpzwoy4uxai204",
   "url": "https://plus.google.com/107682764353690170518/posts/7uX4T3w7pow",
   "actor": {
    "id": "107682764353690170518",
    "displayName": "sada h",
    "url": "https://plus.google.com/107682764353690170518",
    "image": {
     "url": "https://lh5.googleusercontent.com/-E1jvr_nZ6mY/AAAAAAAAAAI/AAAAAAAAAAA/V0zxFDohKp8/photo.jpg"
    }
   },
   "verb": "post",
   "object": {
    "objectType": "note",
    "content": "今日はGoogle+ API祭りだね!!<br /><a href=\"http://googlecode.blogspot.com/2011/09/getting-started-on-google-api.html\" >http://googlecode.blogspot.com/2011/09/getting-started-on-google-api.html</a><br /><a href=\"http://d.hatena.ne.jp/technohippy/20110916#1316131817\" >http://d.hatena.ne.jp/technohippy/20110916#1316131817</a><br /><a href=\"https://groups.google.com/group/google-social-developers-japan/browse_thread/thread/ce6f266fb1a61994#\" >https://groups.google.com/group/google-social-developers-japan/browse_thread/thread/ce6f266fb1a61994#</a>",
    "url": "https://plus.google.com/107682764353690170518/posts/7uX4T3w7pow",
    "replies": { "totalItems": 0 },
    "plusoners": { "totalItems": 2 },
    "resharers": { "totalItems": 0 },
    "attachments": [
     {
      "objectType": "article",
      "displayName": "Getting started on the Google+ API - The official Google Code blog",
      "content": "Getting started on the Google+ API",
      "url": "http://googlecode.blogspot.com/2011/09/getting-started-on-google-api.html"
     },
     {
      "objectType": "photo",
      "image": {
       "url": "http://images0-focus-opensocial.googleusercontent.com/gadgets/proxy?container=focus&gadget=a&resize_h=100&url=http%3A%2F%2F3.bp.blogspot.com%2F-JJJfH4o5F9c%2FTnJEHO9CZHI%2FAAAAAAAAAyM%2FFgOmjuAKc-A%2Fs1600%2Fresized%252Bheadshot.jpg",
       "type": "image/jpeg"
      },
      "fullImage": {
       "url": "http://3.bp.blogspot.com/-JJJfH4o5F9c/TnJEHO9CZHI/AAAAAAAAAyM/FgOmjuAKc-A/s1600/resized%2Bheadshot.jpg",
       "type": "image/jpeg"
      }
     }
    ]
   },
   "provider": { "title": "Google+" },
   "access": {
    "kind": "plus#acl",
    "items": [ { "type": "public" } ]
   }
  },
  ...
 ]
}

アクティビティの取得 / activities.get

リファレンスはこちら。

最初これの使い方がわからなくて、ちょっと苦労した。こんな URL でアクセスするけど、ActivityID に何をいれればよいのかわからなかった。

https://www.googleapis.com/plus/v1/activities/<activityId>?key=<yourAPIKey>

いろいろ試してみると、さっき activities.list で取得した json で、items配列のオブジェクトに id があって、これをいれる。さっきの json だと、こんな値だった。activities.list 以外から id を取得する方法ってないのかな…。

"id": "z13bfr2pwv3tw1d1d23kjbpzwoy4uxai204",

これで ActivityIDもわかった。yourAPIKey には、さっき取得した API Key を入れる。

https://www.googleapis.com/plus/v1/activities/z13bfr2pwv3tw1d1d23kjbpzwoy4uxai204?key=yourAPIKey

このURLにアクセスすると、こんな感じの情報が取得できる。(長いので整形している)

{
 "kind": "plus#activity",
 "title": "今日はGoogle+ API祭りだね!! http://googlecode.blogspot.com/2011/09/getting-started-on-google-api.html ht...",
 "published": "2011-09-16T00:58:33.000Z",
 "updated": "2011-09-16T00:58:34.466Z",
 "id": "z13bfr2pwv3tw1d1d23kjbpzwoy4uxai204",
 "url": "https://plus.google.com/107682764353690170518/posts/7uX4T3w7pow",
 "actor": {
  "id": "107682764353690170518",
  "displayName": "sada h",
  "url": "https://plus.google.com/107682764353690170518",
  "image": {
   "url": "https://lh5.googleusercontent.com/-E1jvr_nZ6mY/AAAAAAAAAAI/AAAAAAAAAAA/V0zxFDohKp8/photo.jpg"
  }
 },
 "verb": "post",
 "object": {
  "objectType": "note",
  "content": "今日はGoogle+ API祭りだね!!<br /><a href=\"http://googlecode.blogspot.com/2011/09/getting-started-on-google-api.html\" >http://googlecode.blogspot.com/2011/09/getting-started-on-google-api.html</a><br /><a href=\"http://d.hatena.ne.jp/technohippy/20110916#1316131817\" >http://d.hatena.ne.jp/technohippy/20110916#1316131817</a><br /><a href=\"https://groups.google.com/group/google-social-developers-japan/browse_thread/thread/ce6f266fb1a61994#\" >https://groups.google.com/group/google-social-developers-japan/browse_thread/thread/ce6f266fb1a61994#</a>",
  "url": "https://plus.google.com/107682764353690170518/posts/7uX4T3w7pow",
  "replies": { "totalItems": 0 },
  "plusoners": { "totalItems": 2 },
  "resharers": { "totalItems": 0 },
  "attachments": [
   {
    "objectType": "article",
    "displayName": "Getting started on the Google+ API - The official Google Code blog",
    "content": "Getting started on the Google+ API",
    "url": "http://googlecode.blogspot.com/2011/09/getting-started-on-google-api.html"
   },
   {
    "objectType": "photo",
    "image": {
     "url": "http://images0-focus-opensocial.googleusercontent.com/gadgets/proxy?container=focus&gadget=a&resize_h=100&url=http%3A%2F%2F3.bp.blogspot.com%2F-JJJfH4o5F9c%2FTnJEHO9CZHI%2FAAAAAAAAAyM%2FFgOmjuAKc-A%2Fs1600%2Fresized%252Bheadshot.jpg",
     "type": "image/jpeg"
    },
    "fullImage": {
     "url": "http://3.bp.blogspot.com/-JJJfH4o5F9c/TnJEHO9CZHI/AAAAAAAAAyM/FgOmjuAKc-A/s1600/resized%2Bheadshot.jpg",
     "type": "image/jpeg"
    }
   }
  ]
 },
 "provider": { "title": "Google+" },
 "access": {
  "kind": "plus#acl",
  "items": [ { "type": "public" } ]
 }
}

まとめ

API少ないし、参照系だけなので簡単だった。簡単なうちに勉強しておくと、あとあと楽になるかな。

本当は Client Library を使ったサンプルも載せようと思ったけど、だいぶ長くなったやめた。

.NET / GWT / Java / Objective-C / PHP / Python / Ruby のライブラリがすでに公開されている。beta や alpha だけど。

さらに Java / PHP / Python / Ruby についてはスターターキットとして、サンプルコードが公開されている。言語によって異なるけど、Webアプリケーションや、コマンドラインアプリーケーションのサンプルがある。

Javaでは Command line / Google AppEngine / J2EE web application / Android のサンプルが公開されている。すごすぎ。

サンプルの充実度で、Googleの本気度もわかる気がした。


参考URL

みなさん仕事が早いですね…。

2011-05-28

[][][]JavaからRubyへ

JavaからRubyへ」を読了した。けっこう流し読み。

この本が出版されてから約4年が経った。当時とはJavaやRubyの立ち位置は、それぞれ微妙に変わっている。だからこそ興味深い内容だった。

変わらない部分としては、新しい技術を導入するときのリスクマネジメントだと思う。本書ではRubyを、Railsを導入するにはどうしたらいいのかが描かれているが、ある程度は他の言語を導入するときでも約に立つ情報だと思う。

この本の内容とは関係ないけど、最近Rubyをちょっと勉強し始めていて、思ったよりも好きになれそうな感じがしている。いい感じ。


JavaからRubyへ ―マネージャのための実践移行ガイド
Bruce A. Tate
オライリー・ジャパン
売り上げランキング: 396129