Home

toshipon@sketch.book/blog

devlove HangarFlight 2011行ってきた

ブログ書くまでが勉強会ということでメモ書き程度ですが、書いてみようと思います。

develove HangarFlight 2011 今年で3回目です。
http://kokucheese.com/event/index/21611/

僕が参加したセッションは以下のとおりです。

  1. @agilekawabata 川端光義 氏「普通のプログラマチームによるアジャイル開発と少数精鋭によるアジャイル開発」
    • 普通のプログラマ達とアジャイルのプロジェクトをまわしたという話
      • 40名で1年間500人月の案件 共通フレームワークチーム(7名)でイテレーションを20回まわした
      • 成功の秘訣はアジャイル開発のクレドを毎朝読み合わせを行ったこと http://t.co/9voDRvtU
      • KPTを行う
      • ドキュメントを90% wikiで管理
      • 顧客のアジャイルへの理解
      • 事件(wikiが消える、地震)を乗り越えることによるチーム団結
    • 少数精鋭のプログラマ達とアジャイルのプロジェクトをまわしたという話
      • 個性が強すぎて基本的にプラクティスは通用しない。
      • 出勤時間バラバラ、ノマドの人、全員同席は基本無理
      • ただしアウトプットはすごい(3日でできると思ってたことを3時間でやってのける)
      • Railsとアジャイルの相性がよく、Railsのお陰で生産性も上がっていた
      • ツール
        • Pivotal Tracker
        • Redmine(wiki用)
        • IRC
        • Skype
        • ML
      • 大事なのはプログラミングを楽しんでもらう環境作り
  2. @kenchan  Kenichi TAKAHASHI 氏「Jenkinsの運用を中心にRailsとCI(とサーバ仮想化)について。」
    • 永和システムマネジメントさんでのCI環境の一例について
      • MacMiniをCI専用のマシンとして使っていた(空きPCを利用)。 プロジェクト毎にLXCで専用インスタンス
      • IRC上でJenkinsとコミュニケーションをしてstatus確認とかbuildをしたりしてる
      • githubのプライベートリポジトリにバージョン管理を移行しているとのこと
      • 最近はTravis CI – github専用のCIサーバ っていうのに注目している
  3. @papanda  市谷聡啓氏 sercret of moon
    • SIer -> Servicer -> SIer と渡り歩いて
      • SIerはSIer、ServicerはServicerの現場の悩みがありそれぞれ問題もある。
      • Servicer -> コンウェイの法則
      • 結局自分の観ている(絶望している)世界を作っているのは自分
      • 自分の生き方を他人任せにしないこと -> (情熱プログラマー見ろ!)
      • 自分のいる世界の存在を感じること -> (U理論)
      • 自分のメンタルモデルを感じること
      • P287! (アジャイルサムライ) 挑戦し続けることをやめてしまったらもうアジャイルではない
  4. @haradakiro Harada Kiro氏 「実践DDDQuickReplay」ライブ・ドメインモデリング!!
    • Rakutenさんのアジャイル開発実例(こうやって成功に導いたよー)
      • 見える化 -> タスクボードでタスクを管理。みんなの通り道の壁に付箋をはりまくる
      • フロアのレイアウト -> すぐに話せるようにみんな近い席
      • 成功体験を作る -> ゴールは盛大に盛り上がる -> まわりの人もチェンジを受け入れやすくなる
    • アジャイル開発を終えてメンバーの心境など
      • 気がつくと元の開発スタイルになっている
      • 一人だとなかなかアジャイルを続けられない。意識してアジャイルを続けることが大事
      • 野良アジャイル(個人タスクをアジャイルで実践する)
        • 一人カンバン
        • リリースすごろく(リリース作業をすごろくで手順管理)
        • 一人で実践し続ける

メモで残してたものを箇条書きにした程度で申し訳ないですが、、所感としては、やっぱり勉強会は毎回得るものが大きいということです。最初参加したときは転職を考えていた時期で、今はアジャイルを成功させるためにどうすればいいか悩んでいて、皆かならず歩んだ道であることなので、同じ悩みを持っている人もいるし、必ずアドバイスをしてくださる人がいるということです。

今回も前回もですが、papandaさんの話は特に心に響きます。今見えてる現状は自分が作っているものでそれを変えるのも自分ということを改めて感じました。僕が社会人になって1年目で初めて参加したJavaScriptの小さな勉強会でpapandaさんと出会ってからずっと影響されている素晴らしい人です>< (早く還元したい..) また、ワークショップでは勉強会の振り返りを行い、参加者各々で感じたことを共有しましたが、思いの共通点が沢山あって、明後日からコミットするにはどうしたらいいのかや、変化を継続するには継続させるための仕組み(フィードバックを受け続けることのできる環境作り)、一人だけでは長続きしないため、まわりを巻き込んで理解者を得ることの大切さを改めて感じました。

また、懇親会でお話させていただいたアジャイルコーチの原田さんがおっしゃっていた、「アジャイルで最初から上手くチーム(人)なんてまずいない」ということ、振り返りを行い、少しづつ現状を良くしていくことが大事だというアドバイスをいただき、今の自分の現場に対する不安に対するアプローチの方法が明確に見えた気がして少し安心しました。

と、いう具合にだらだらと書いてしまいましたが、とても学びのある素晴らしいイベントでした!また懲りずに(え)来年も参加しようかと思います!目標は自分もLTとかで登壇すること!

Google Buzz のつぶやきを垂れ流してみた

ただの2番煎じですが、google buzz がサービス停止するということで、google buzz のつぶやきをエクスポートしたものをストリームっぽく垂れ流すようにしました。

http://www.toshipon.com/sample/buzz/buzz/index.html

以下で google buzz のつぶやきをエクスポートできます。
https://www.google.com/takeout/

まず、ひとつひとつのつぶたきが日本語名のhtmlファイルなので、ファイル作成日でrenameします。

count = 0
Dir::foreach('./buzz') { |f|
    count = count + 1
    time = Time.now
    from = './buzz/' + f
    mt = File::mtime('./buzz/'.concat(f))
	to = './buzz/' + format("%04d", mt.year) + format("%02d", mt.month) + format("%02d", mt.day) + format("%02d", mt.min) + format("%02d", mt.sec) + ".html"
	if File::ftype(from) == "file"
       File::rename from, to
    end
}

renameしたhtmlファイルのファイル名を一括でfiles.jsonの中に一覧で取り込み
文字列置換で適当にjsonフォーマットに変換します。

ls >> files.json

その後、jsでhtmlファイルを読み込み垂れ流してみます。

$(function(){
	console.log("script.js start");
	$.ajax({
		url : "http://www.toshipon.com/sample/buzz/buzz/buzz/files.json",
		//dataType : "json",
		success : function(file){
			file = JSON.parse(file);
			popBuzz(file);
		}
		});
	var i = 0;
	function popBuzz(file) {
		if (file.length === i+1){ return; }
		setTimeout(function(){
			$("#content").prepend($("
  • ").load("http://www.toshipon.com/sample/buzz/buzz/buzz/"+ file[i])); i++; if ($('#content li').length > 10){$('#content li:last').remove();} popBuzz(file); }, 2000); } });
  • 簡単ですね。

    ソースはこちら。 https://github.com/toshipon/buzz

    参考
    さよなら Google Buzz

    さくらVPSでnode.jsを使ってAndroidとWebSocket通信を行う

    今node.jsでWebSocket通信を行うというのがブームになっているようなので、
    さくらVPSを使ってnode環境を構築してWebSocket通信を行なってみることにしました。

    また、個人的にはAndroidがブームなので、ネイティブなAndroidアプリからWebSocket通信を
    行うということもやってみたいと思います。

    まずはさくらVPS側のnode環境構築です。

    node.jsのインストール

    本当はnaveというnodeのバージョン管理ツールがあるので、それをインストールしてからnode環境を構築した方がよかったのですが、
    今回は時間がなかったので直接最新版をインストールする説明をします。

    まず、下準備でopensslとopenssl-develをインストール

    sudo yum install openssl openssl-devel

    node.jsをインストール

    cd ~/
    git clone git://github.com/joyent/node.git
    cd node
    ./configure 
    make
    sudo make install
    

    node.jsのパッケージマネージャーのnpmをインストール

    sudo chown -R $USER /usr/local
    curl http://npmjs.org/install.sh | sh
    sudo chown -R root /usr/local
    

    WebSocket通信を行うためのライブラリをインストール

    npm install websocket-server
    

    準備は完了したので、サーバ側の実装
    server.js

    var sys = require('sys');
    var ws = require('websocket-server');
    
    var sockets = [];
    
    var server = ws.createServer();
    
    server.addListener('listening', function(nonnection) {
            sys.puts('listening..');
    });
    server.addListener('connection', function(connection){
            sockets.push(connection);
            sys.puts('connect');
    
            connection.addListener('message', function(message){
                    sys.puts(message);
                    for (var k in sockets) {
                            if (connection != sockets[k]){
                                    sockets[k].send(message);
                            }
                    }
            });
    });
    
    // 接続が切断された際のリスナー
    server.addListener('close', function(connection){
            sys.puts('close');
    });
    // listenするポート番号を指定
    server.listen(8001);
    

    nodeサーバの起動は以下を実行。「listen..」と出てきたら完了です。

    node server.js
    

    続いてAndroid側の実装。WebSocket通信部分はweberknechtというライブラリを使用しています。

    WebSocketManager.java

    package com.toshipon.websocket.test;
    
    import java.net.URI;
    import java.net.URISyntaxException;
    
    import android.util.Log;
    import de.roderick.weberknecht.WebSocket;
    import de.roderick.weberknecht.WebSocketConnection;
    import de.roderick.weberknecht.WebSocketEventHandler;
    import de.roderick.weberknecht.WebSocketException;
    
    public class WebSocketManager {
    
    	private static WebSocket websocket;
    
    	public static void connect(String url, WebSocketEventHandler handler) {
    
    		try {
    			URI uri = new URI(url);
    			websocket = new WebSocketConnection(uri);
    
    			Log.d("DEBUG", "websocket connect start");
    			websocket.setEventHandler(handler);
    			websocket.connect();
    
    		} catch (WebSocketException wse) {
    			wse.printStackTrace();
    		} catch (URISyntaxException use) {
    			use.printStackTrace();
    		}
    	}
    
    	public static void send(String message) {
    
    		try {
    			Log.d("DEBUG", "websocket connect send");
    			websocket.send(message);
    		} catch (WebSocketException wse) {
    			wse.printStackTrace();
    		}
    	}
    
    	public static void close() {
    		try {
    			Log.d("DEBUG", "websocket connect close");
    			websocket.close();
    		} catch (WebSocketException wse) {
    			wse.printStackTrace();
    		}
     	}
    }
    

    SendMessageActivity.java

    package com.toshipon.websocket.test;
    
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import de.roderick.weberknecht.WebSocketEventHandler;
    import de.roderick.weberknecht.WebSocketMessage;
    
    public class SendMessageActivity extends Activity {
    
    	private static final String WS_URI = "ws://XXX.XX.XX.XXX:XXXX/";
    	private static final String NULLPO_KEY = "nullpo";
    	private static final String GATT_KEY = "gatt";
    
    	private static final String NULLPO_TEXT = "ぬるぽ ( ´∀`)";
    	private static final String GATT_TEXT = "ガッ (ヽ'ω`)";
    
    	private Handler handler = new Handler();
    	private Activity activity;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    	    super.onCreate(savedInstanceState);
    	    Log.d("DEBUG", "opened message window");
    	    setContentView(R.layout.message);
    	    activity = this;
    
    	    // ぬるぽボタン押下時の挙動
    	    Button nullpoBtn = (Button) findViewById(R.id.btn_null_btn);
    	    nullpoBtn.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				Log.d("DEBUG", "nullpo button clecked");
    				WebSocketManager.send(NULLPO_KEY);
    				setMessage(NULLPO_TEXT, Color.BLUE);
    			}
    		});
    
    	    // ガッボタン押下時の挙動
    	    Button gattBtn = (Button) findViewById(R.id.btn_ga_btn);
    	    gattBtn.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				Log.d("DEBUG", "gatt button clecked");
    				WebSocketManager.send(GATT_KEY);
    				setMessage(GATT_TEXT, Color.GREEN);
    			}
    		});
    
    	    // WebSocket通信開始
    	    WebSocketManager.connect(WS_URI, new WebSocketEventHandler() {
    
     			@Override
     			public void onOpen() {
     				Log.d("DEBUG", "websocket connect open");
     			}
    
     			@Override
     			public void onMessage(WebSocketMessage message) {
     				Log.d("DEBUG", "websocket message");
    
     				if (NULLPO_KEY.equals(message.getText())) {
    					setMessage(NULLPO_TEXT, Color.RED);
     				} else if (GATT_KEY.equals(message.getText())) {
     					setMessage(GATT_TEXT, Color.YELLOW);
     				}
     			}
    
     			@Override
     			public void onClose() {
     				Log.d("DEBUG", "websocket connect close");
     			}
     		});
    	}
    
    	private void setMessage(final String message, final int color) {
    		Log.d("DEBUG", "send message");
    
    		// WebSocketHandlerのonMessageは別スレッドなのでhandlerを用いてviewの書き換えを行う
    		handler.post(new Runnable(){
    	        @Override
    	        public void run() {
    	            TextView messageArea = (TextView) activity.findViewById(R.id.message_area);
    	    		messageArea.setText(message);
    	    		messageArea.setTextColor(color);
    	        }
    	    });
    
    	}
    
    	@Override
    	protected Object clone() throws CloneNotSupportedException {
    		WebSocketManager.close();
    		return super.clone();
    	}
    }
    

    ソースはgithubに置いてあります。
    https://github.com/toshipon/websocket_test_node
    https://github.com/toshipon/websocket_test_android

    ちなみにこのサンプルアプリは、他の人と「ぬるぽ」「ガッ」を双方向でやりあえるアプリです(笑)
    二人ぐらいでやりあうのがいいと思います。

    参考にしたサイト
    node.jsとnpmのインストールをしたメモ(CentOS さくらのVPS)
    Androidからnode.jsとWebSocket通信をする実装 – Nubilumの日記

    [メモ]コードレビューツールshinjikoのインストール方法

    shinjikoをwindows環境とMac環境にインストールしたので、自分のメモ用に書いておきます。

    1. インストール
      1. 前提
        1. rubyがインストールされていること。
        2. gemがインストールされていること。
        3. (Macの場合MacPortsがインストールされていること。)
      2. 事前準備(Windowsの場合)
        1. gemでの準備
          1. gem install rails -v 2.0.2
          2. gem install gettext -v 1.10.0
            ※バージョンの高いgettextが入っている場合はエラーになる場合がある。そのときはgem uninstall gettext で1.10.0より高いバージョンを削除
          3. gem install diff-lcs
          4. gem install will_paginate
          5. gem install sqlite3-ruby
          6. gem install subversion
      3. 事前準備(Unixの場合)
        1. MacPortsでの準備
          1. sudo port install subversion-rubybindings
        2. gemでの準備
          1. sudo gem install rails -v 2.0.2
          2. sudo gem install gettext -v 1.10.0
            ※バージョンの高いgettextが入っている場合はエラーになる場合がある。そのときはgem uninstall gettext で1.10.0より高いバージョンを削除
          3. sudo gem install diff-lcs
          4. sudo gem install will_paginate
          5. sudo gem install sqlite3-ruby
      4. その他ライブラリが不足している場合はこちらを参考
        • http://code.google.com/p/shinjiko/wiki/GemsList
      5. shinjiko チェックアウト
        • # svn checkout http://shinjiko.googlecode.com/svn/trunk/ shinjiko
      6. shinjiko 設定ファイル変更
        1. shinjiko/config/database.sample.yml → shinjiko/config/database.yml
          • development:
            adapter: sqlite3
            database: db/development.sqlite3
            timeout: 5000
        2. shinjiko/config/environments/development.sample.rb → shinjiko/config/environments/development.rb
      7. rakeでテーブル作成
        • # rake db:migrate
      8. shinjikoの起動
        • # ruby script/server

    [勉強会]DevLOVE HangarFlightのメモ

    気がつけば先々週の出来事ですが,, 青山オラクルセンターで開催されましたDevLoveのイベントに参加してきましたので、参加セッション3つのメモを備忘録としてまとめておきます。
    *参加セッション
    +【闇】「RIAとユーザーエクスペリエンス(闇編)」
    +【開発】「コードで学ぶ ドメイン駆動設計 入門
    +【アーキテクチャ】「Google App Engineの勘所」
    *RIAとユーザーエクスペリエンス(闇編)
    -@take3000 – http://twitter.com/#!/take3000 – http://classmethod.jp/
    -FlexやSilverlight, AjaxなどのRIAな技術が一般的になりつつあり、ユーザが求めるUIの質もあがってきている。
    -RIA開発でスピード感のある開発ができることになって、コストを圧縮できるようになってきた。でも未だにユーザエクスペリエンスが軽視されていてそれにコストを費やすということをしていないのが現状。
    -ユーザエクスペリエンス(UX)とは「速く」「間違わない」ということ
    -UXは設計の段階で専門の知識を持った人(デザイナとか)に考えてもらう必要がある。
    -UXは戦略にも活かせる。例えばyouRoomはバージョンアップによって有料会員登録したくなるようなUIになった。
    *コードで学ぶドメイン駆動設計 入門
    -@j5ik2o – http://twitter.com/#!/j5ik2o
    -[DDD][Java] DEVLOVE HangarFlight で話したスライド&ソースコードCommentsAdd Star – http://d.hatena.ne.jp/j5ik2o/20101221/1292934554
    ドメインとは、属性だけではなく振る舞いを持っている。また、不変と可変を明確にすることでバグの少ないコード設計ができる。・・・というところまで理解したのですが、詳しくはまだ正直DDDとはということを理解しきれていません>< ソースコードを公開してくださったので、そちらを実際に呼んで消化してから別の機会にまとめたいと思います。。
    *Google App Engineの勘所
    -@shin1ogawa – http://twitter.com/#!/shin1ogawa – http://www.topgate.co.jp/
    -Google App Engineで動いているウェブサービス
    –2009衆院選公式サイト
    –[google:Buyなう]
    –[google:スポーツSNS LaBOLA]
    –[google:Chan-Toru beta]
    –mixi系ソーシャルアプリ
    **勘所
    -基本ファイルアクセスやスレッド処理、ソケットの使用は禁止
    -JDK内でも使用できないライブラリもある(AWTとか使えない)
    -複数のVMで動くことが前提なので、それを意識したコードを書かないといけない
    -依存モジュール内でも制約がある
    -JDOやJPAを勉強するとGAEのデータストアを扱えるというのはGoogle様による罠。だいたいの人がハマってしまう。「インデックス」と「エンティティグループ」という考えをまず理解することが大事。(GAEのデータストアはBigTableの上にデータストアという概念を構築したもの)
    -GAEを金を払えさえすれば、自由に使えるという訳ではない。「分単位」の制限はあるし、API制限もある。
    -Slim3というデファクトスタンダードなフレームワークがある。
    -HTMLは静的で扱い、JSONやGWTでデータを返すのが一般的。
    -一定の確率で失敗するのはGAEの仕様である。
    –1/1000の確率でデータアクセスに失敗する。
    –コントローラの大元などでハンドリングしてあげる。
    –GAEでWebサービスの調子が悪くなっているのはGAEが落ちているんじゃなくてアプリが落ちていると考える。
    **お金の儲け方
    -Googleアプリケーションのプラットフォーム
    –Google Apps(300万企業ユーザが使用)
    –Google Apps Marketplace(企業向け)
    —100$で開発者登録ができる(iPhoneアプリ開発と同じ感じ)
    —Apps拡張アプリを開発して販売できる
    —アプリ売上の8割が利益
    –Chrome Marketplace(コンシューマー向け)
    –Chrome Web Store
    -エンドユーザーに近いマーケットが沢山ある。
    **狙いにくいところ
    -特定社内向け業務アプリの提案
    –クラウド、GAEの説明が大変。広い層をターゲットにする方が向いている。
    **チャンスを活かそう
    -生産性の高さがハンパない
    –だからこそ敷居を超えれば簡単。アプリケーション開発に集中できる。
    -スモールスタートしやすい。
    -自動スケールアウト
    -GAEはGoogle Apps, Marketplace向けアプリ開発との親和性が高い
    *Togetterのまとめ
    -2010/12/18 DEVLOVE HangarFlight – Winter Sortie – [http://togetter.com/li/80353]

    [Flash]Google Maps API for Flashで全画面地図表示

    技術的に難しい話等では全くなく、ただGoogle Mapsを全画面表示してヌルヌル動かせたら気持ちいいじゃない、ということで作ってみました。Google Maps API for Flashを使用してFlashオブジェクト上にGoogle Mapsを表示し、Flash Player標準機能のフルスクリーンモードを使用するという魂胆です。

    mapsample.png

    google map を表示

    個人的には19インチ以上のディスプレイで全画面表示して、地図を動かしまくるととても幸せになれます。それにしてもGoogle Mapsは地図のタイルごとにリクエストが走ってるようですが、これだけのリクエスト数をさばけるGoogleのサーバってつくづく次元が違うなと思います。

    以下、サンプルコードです。

    
    package
    
    {
    
    import com.google.maps.InfoWindowOptions;
    
    import com.google.maps.LatLng;
    
    import com.google.maps.Map;
    
    import com.google.maps.MapEvent;
    
    import com.google.maps.MapType;
    
    import com.google.maps.overlays.Marker;
    
    import com.google.maps.overlays.MarkerOptions;
    
     
    
    import flash.display.Sprite;
    
    import flash.display.StageAlign;
    
    import flash.display.StageDisplayState;
    
    import flash.display.StageScaleMode;
    
    import flash.events.MouseEvent;
    
    import flash.geom.Point;
    
     
    
     
    
    public class GoogleMapSample extends Sprite
    
    {
    
    // 緯度経度 : 東京タワー
    
    private static var LATLNG:LatLng = new LatLng( 35.658682,139.745407 );
    
    // 倍率
    
    private static const ZOOM:int = 16;
    
    // マップオブジェクト
    
    private var map:Map;
    
     
    
    public function GoogleMapSample() {
    
    // ステージ初期化
    
    stage.scaleMode = StageScaleMode.NO_SCALE;
    
    stage.align = StageAlign.TOP_LEFT;
    
     
    
    map = this.createMap();
    
    this.addChild(map);
    
     
    
    stage.addEventListener(MouseEvent.CLICK, onClickHandler);
    
    }
    
     
    
    // マップオブジェクトの生成
    
    private function createMap():Map {
    
    var map:Map = new Map();
    
    map.setSize(new Point( stage.stageWidth, stage.stageHeight));
    
    map.addEventListener(MapEvent.MAP_READY, mapReadyHandler);
    
    map.key = "ABQIAAAAiccmmCNILO3xd09xRuUlRBQTIuW28Ed72BnpVhdf4jwqbtfYRBRsXdvrvtm17NUylBfmCtX91DbTVQ"
    
    return map;
    
    }
    
     
    
    private function mapReadyHandler( event:MapEvent ):void {
    
    // マップオブジェクトのサイズの初期設定
    
    map.setCenter(LATLNG, ZOOM, MapType.NORMAL_MAP_TYPE); // ノーマルモード
    
    //map.setCenter(LATLNG, ZOOM, MapType.SATELLITE_MAP_TYPE); // 航空写真モード
    
     
    
    // マウスホイール有効
    
    map.enableScrollWheelZoom();
    
    // 滑らかなズームを有効
    
    map.enableContinuousZoom();
    
     
    
    // マーカーの追加
    
    var marker:Marker = new Marker(
    
    LATLNG,
    
    new MarkerOptions( {
    
    radius: 12,
    
    hasShadow: true
    
    })
    
    );
    
    map.addOverlay(marker);
    
    }
    
     
    
    private function onClickHandler( event:Mouse
    Event ):void {
    
    // フルスクリーン化
    
    if (stage.displayState != StageDisplayState.FULL_SCREEN) {
    
    stage.displayState = StageDisplayState.FULL_SCREEN;
    
    map.setSize(new Point( stage.stageWidth, stage.stageHeight));
    
    }
    
    }
    
    }
    
    }
    

    [FxUG]Flex勉強会#89に行ってきましたメモ

    先日(11/5(木))行われましたFlex User Groupの勉強会に行ってきました。途中参加だったのですが(会場がAdobeのオフィスから別の場所に移ってて大崎を30分ぐらい彷徨ってました><)、メモした内容などをまとめておきます。

    1. taigaさんのAdobe MAX 2009のレポート
    2. taigaさんのAIR2.0の新機能デモ
      • デスクトップ上のファイル情報をAIRで表示
      • 画像ファイルをWindowsのViewerで表示
      • USBデバイスの認識(接続と切断のイベントの取得が可能)
      • マルチタッチイベントの取得(Windows7が某番組と同じく本番で正常に動作しないw)
    3. Greg Wilson氏のFlash関連の最新情報
      1. Flash Player 10.1
        • パフォーマンスの向上(メモリ、バッテリー、CPU使用量改善)
        • マルチタッチ、ジェスチャーの対応
        • Accelerometer(加速度センサー)対応
        • 傾き認識対応
        • 複数のSWFファイルを管理可能、SWFの優先順位を決定することが可能
        • リソースの制限を管理可能(メモリ制限を検知)
        • Global Error Handling
        • マウスイベントとタッチイベントの互換性
      2. iPhone on Flash CS5
        • Flash CS5でiPhoneアプリのネイティブコードを吐き出せるようになる
        • AppStoreですでにアプリが公開されている。(South Parkのアバター作成アプリとか)
        • iPhone on Flash CS5でできないこと
          • HTMLの埋め込み(Safariを呼び出すことは可能)
          • RTMP
          • H.264 Video再生(iPhoneネイティブの動画再生呼び出しは可能)
          • SWFの動的ロード
          • Pixel Blenderを使用したSWF
        • ガーベッジコレクションはFlash側で自動で制御してくれる
        • SQLite使用可能
      3. AIR2.0
        • パフォーマンスの向上(メモリ、CPUの使用量)
        • Webkit(HTML5,CSS3対応)
      4. LiveCycle Mosaic
        • 1つのアプリケーション上にタイル状にSWF,HTMLの配置が可能
        • 複数のタイルで連携が可能
        • 年末に出荷予定
        • 主に業務系のアプリケーションのマッシュアップに利用
        • http://www.adobe.com/products/livecycle/mosaic/
      5. Tour de Flex
        • Flexアプリケーションのサンプル集
        • Flex4のサンプルも多く投入予定
        • Flash Player 10.1対応のサンプルも投入
        • サンプルソースを見ることが可能
        • Tour de FlexのAIR版アプリのDL可能
        • サンプルアプリの投稿も絶賛受付中
        • http://www.adobe.com/devnet/flex/tourdeflex/
      6. Flex + AIR2.0 + ColdFusion + LiveCycle アプリ絶賛公開中(ChessJam)
        • 世界中の人とリアルタイムでチェスの対戦ができるアプリをデモとして公開
        • デモってレベルじゃねーぞ>< 完成度高すぎるしこれタダでいいの!?
        • ソースは来週(Greg Wilson氏のブログで公開!)
        • 業務系のアプリケーションで使用するような技術で作成
        • http://chessjam.com/

    ところどころ情報が歯抜けなところがありますがご了承下さい><
    あ、あとtaigaさんからAdobe LiveCycle ES2のプレリリースDVDをAdobe MAXのお土産でいただきましたw 個人であまり使用するものじゃないので使用方法がよくわからないですが、とりあえずServerインストールしてWorkbench使ってみたりしてみます><

     

    Mitaka.rb & pgcafe Nite!!いってきた

           littlestar1

    記事にするのが遅くなりましたが、7/23(木)に行われましたMitaka.rb第三回&三鷹プログラマーズカフェ合同懇親会に行ってきました。

    Mitaka.rbには「おいしいRuby」というサブテーマ(?)があるので、三鷹の人気レストラン「リトルスター・レストラン」を貸し切って、食べまくり飲みまくりのすごくおいしい懇親会でした。でてくる食事がどれもおいしすぎでした!ビールもとてもおいしかったです!主催のysakakiさんお疲れさまでした&ありがとうございました!><

    また、プロジェクタを使ってのLTもあり、とてもおいしい(?)情報もお聞きすることができました。ursmさんのHaml/Sassのお話、btoさんの起業のお話をはじめ、Ruby以外の話も多く、とても新鮮でおもしろかったです!以下、簡単にまとめました。

    主なメニュー

    基調講演:日本Hamlの会 会長ursmさんの Haml/Sassのお話

    • htmlの冗長な記述を無くし、シンプルかつDRYなhtmlの記述ができるHamlと、同じく冗長なCSSの記述をシンプルに行えるSassの紹介
    • Railsのプラグインで提供されている。また他の言語でもいくつか実装されている。Javaはなかったかも。
    • とにかくコードの記述量が少ない!見やすい!CSSの変数とかテンプレートとかいい!
    • デザイナーとの分業が難しいけど、デザイナーがHaml/Sass書けたら強いw
    • http://d.hatena.ne.jp/ursm/20090726/1248613369

    btoさんの客員起業家のお話

    • 客員起業家とはベンチャーキャピタルをおこなっている会社と一定の条件の契約をし、自分の起業活動を支援してもらえるビジネスモデル。
    • EXIT(上場または買収)するまでが基本的な契約の期間。その後VC企業は株主の権利とかいろいろ保持できる。
    • 技術者は手に職をもってるから起業失敗したときのリスクは少ない。もっと技術者は起業するべき!
    • http://www.scribd.com/doc/17091811/EIR

    jishiha さんのWebサービス開発のすすめの話

    • Railsを開発した会社が公開している、Webアプリケーション開発のすすめ、Getting Realの紹介
    • 結構奥が深くて、なるほどーということが沢山書いてある。是非ぜんぷに目を通したい!
    • あとで行くを運営されています。行きたいところブクマできる。これは便利。

    nakataniさんの処理系を作ろうなお話

    30min. の野々村さんのお話

    Rails初心者でもたぶん動かせるRails on GAEの環境設定(for MacOSX)

    いやーRails初心者の僕がとんでもなくはまったので備忘録としてまとめておきます。
    以下、Macの標準の開発環境からGAEでRailsが動くまで。

    1. Google App Engineのアカウント取得、アプリケーション名の登録
      1. ここからGoogle App Engine 専用のアカウントを取得する。
      2. 新規アプリケーションを作成し、アプリケーションIDを発行してもらう。
    2. Railsのアップデート(2.3.3取得)
      1. rails_on_gaeプラグインのテンプレートを使用する場合、Railsのバージョンは2.3でなければいけないので、古ければバージョンアップする。
        1. gemをupdateしてからrailsのインストール。

          sudo gem update
          sudo gem install rails

        2. バージョンの確認

          rails -v
          => Rails 2.3.3 とでればOK
           

    3. MacのデフォルトのJavaのバージョンの変更
      1. Javaのバージョンが標準だと、J2SE5.0(32bit)なので、J2SE6.0(64bit)に変更します。
      2. アプリケーション=>ユーティリティ=>Java Preferences.appを開き、Javaアプリケーションで使用するJavaのバージョンの最優先するバージョンをJ2SE6.0(64bit)に変更。
    4. jrubyの取得
      1. MacPorts経由でjrubyのインストール。MacPortsがインストールされていない場合はこちらをご参考に(http://d.hatena.ne.jp/hakobe932/20061208/1165646618)

        sudo port install jruby
        jruby -v
        => jruby 1.3.1 (ruby 1.8.6p287) (2009-07-25 6586) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_13) [x86_64-java] とでればOK

    5. warblerの取得
      1. warファイルを作成するツールwarblerをインストールします。

        sudo jruby -S gem install warbler

    6. Google App Engine java sdkの取得
      1. 適当なディレクトリにSDKを配置する

        rkdir tmp  # 適当にtmpディレクトリなどを作る
        cd tmp
        wget http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.1.zip
        unzip appengine-java-sdk-1.2.1.zip 

      2. binディレクトリにパスを通しておく
        1. ユーザのルートディレクトリにて.zshrcファイルを開き、以下のテキストを記述する

          export GAEJ_HOME=tmp/appengine-java-sdk-1.2.1
          export PATH=$PATH:$GAEJ_HOME/bin

        2. ユーザのルートディレクトリにて以下のコマンドを実行。

          source /.zshrc

    7. Railsアプリの作成
      1. アプリケーションを作成する適当なワークスペースへ移動し、以下のコマンドを実行する。アプリケーション名はGoogle App Engineの管理画面で作成したアプリケーションIDを指定する。

        rails アプリケーション名 -m http://gist.github.com/103256.txt

      2. ここでひとつ、作成された アプリケーションルート/config/enviroment.rbファイルの一行目に以下の内容を記述。これがないとエラーがでちゃいます。

        require ‘lib/appengine-api.jar’
        ….

    8. warファイルの作成
      1. アプリケーションルートで以下のコマンドを実行し、warファイルを作成する。

        jruby -S warble war

      2. すると アプリケーションルート/tmp にwarファイルが作成されます。中身は特に何も入ってないけど、実行すればRailsのホーム画面はでますので確認はできます。
    9. 開発環境での実行
      1. 早速からっぽのアプリケーションを開発環境で動作確認してみます。以下のコマンドを実行します。

        dev_appserver.sh tmp/war

      2. 実行するとデフォルトでは http://0.0.0.0:8080/ で動いているかと思います。確認してみましょう。
    10. GAE環境での実行
      1. 開発環境で動作確認ができたら、GAEの環境にデプロイしてみます。以下のコマンドを実行します。

        appcfg.sh update tmp/war

    以上で、僕の環境ではなんとか動きました。後は、中身を思いのままに実装するだけです。また、今回のRails on GAEの設定はすべてあんどうさんのサイトを参考に作成しました。大変助かりました。ありがとうございます!
    http://d.hatena.ne.jp/technohippy/20090428#1240939733
    http://d.hatena.ne.jp/technohippy/20090409/1239217083
    http://gihyo.jp/dev/serial/01/ruby/0016      # あんどうさんが書かれたgihyoの記事です。

    技術書が買える新宿の本屋さん

    僕は技術書を買い漁るのが趣味といっても過言ではないぐらい、よく新宿の技術書が売ってる本屋をよく徘徊してるのですが、営業時間がまちまちなため、仕事帰りに寄ると、よく滑り込みしたり閉まってたりします。なので営業時間とか場所とかをメモがわりにまとめてみました。

     

    東口方面

    • 紀伊国屋書店新宿本店
      【住所】新宿区新宿3-17-7(地図
      【営業時間】10:00〜21:00
      【品揃え】A+

      新宿の本屋といえばここってイメージがあります。勝手に。品揃えは文句なし。
      定期的にいろんな本の特設コーナーやってるのでそれも面白かったりします。
      駅から地下通りを通って行けるので雨の日でも行きやすいです。

    • ジュンク堂書店新宿店
      【住所】東京都新宿区新宿3-29-1 新宿三越アルコット6〜8F(地図
      【営業時間】10:00〜21:00
      【品揃え】S

      技術系の品揃えは異常。SAPの誰が買うんだっていう1万越えの本も置いてます。
      それに読書用の椅子があるのでじーっくり本を読めます。

    南口方面

    • 紀伊国屋書店新宿南店
      【住所】渋谷区千駄ヶ谷5-24-2タカシマヤタイムズスクエア(地図
      【営業時間】平日・日曜|10:00〜20:00 土曜|10:00〜20:30
      【品揃え】A

      駅から微妙に遠くて営業時間が早く終わるからあんまり行かない。
      ただ、本屋自体がものすごく大きいのに、お客さんが程よく少ないので
      居心地の良さは一番。そして高島屋と紀伊国屋を結ぶ通路は
      ガラス張りで夜なんかは外の景色が奇麗です。

     

    西口方面

    • ブックファースト新宿店
      【住所】東京都新宿区西新宿1-7-3 モード学園コクーンタワー 地下1階・地下2階(地図
      【営業時間】平日 10:00〜23:00 土・日曜|10:00〜22:00 
      【品揃え】B

      去年できたばっかりでオサレなのでとっても居心地がいいです。
      唯一の営業時間22時。駅から地下通り直通なので雨の日も行きやすいです。

    • ビックカメラ新宿西口店
      【住所】東京都新宿区西新宿1-5-1 ハルク地図
      【営業時間】10:00〜21:00
      【品揃え】B

      店内の奥の方にコンピューター関連のみが置かれている。
      たしか、資格系の本が品揃えよかった気が・・・

    • ヨドバシカメラ新宿西口本店
      【住所】東京都新宿区西新宿1丁目11−1地図
      【営業時間】9:30〜21:30
      【品揃え】B(ちゃんと見てないのでたぶん・・・)

      背の低い棚がずらーっと並んでる。
      見渡しがいいけど、ちゃんと本を置いてるって感じではないかな・・・

    以上。これがすべてではないかもしれないし、多少偏見がはいってるかもしれないけど、僕がよく新宿の本屋をずらっと並べてみました。新宿でちょっとでっかい本屋で技術書沢山漁っちゃうぞ☆って方の参考に少しでもなればと思います。

     

    【追記】2010/03/07

    ブックファースト新宿店が2010年3月より平日が23時までの営業になりました!

    Home

    Search
    Feeds
    Meta

    Return to page top