Mac(homebrew)でGoのインストールと、Emacsの環境構築

Goの勉強のためまずHello worldEmacsの環境を構築をしたので、その記録。

この記事のゴール

  • homebrewでGoのインストール
    • godocによるドキュメントの表示
  • Hello worldを表示する
  • Emacsの環境構築
    • go-autocompleteで保管
    • M-x godocでドキュメント表示
    • goflaymakeで構文チェックなど
    • godefで定義ジャンプ

goをhomebrewでインストールする

$ brew install go

インストールされているか確認

$ go version
go version go1.2 darwin/amd64

Hello worldを書いてみる

適当な場所で以下のファイル(hello.go)を作成

package main

import "fmt"

func main() {
    fmt.Println("Hello World!")
}

ビルドして実行

$ go build hello.go
$ ./hello
Hello World!

godocをインストールしてドキュメントを表示する

godocを使うとコマンドのドキュメントを表示できるようになる。以下のように使う。

$ godoc fmt Println
PACKAGE DOCUMENTATION

package fmt
    import "fmt"



FUNCTIONS

func Println(a ...interface{}) (n int, err error)
    Println formats using the default formats for its operands and writes to
    standard output. Spaces are always added between operands and a newline
    is appended. It returns the number of bytes written and any write error
    encountered.

godocをインストールするにはgo getを使うようなんだけど、環境変数$GOPATHを設定していないとだめらしい。.zshrcなどに以下のように設定する。

# for go lang
if [ -x "`which go`" ]; then
  export GOROOT=`go env GOROOT`
  export GOPATH=$HOME/go
  export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
fi

GOROOT/binをPATH環境変数に追加しているのは、godocのコマンドのインストール先がここになるから。(通常は、GOPATH/binにインストールされるらしい)

Go 1.2 (devel) doesn't install godoc into bin · Issue #23281 · Homebrew/legacy-homebrew · GitHub

以下のコマンドでgodocをインストール。

$ go get code.google.com/p/go.tools/cmd/godoc

ちなみに、$GOPATHを設定してないと以下の様なエラーとなる。

$ go get code.google.com/p/go.tools/cmd/godoc
package code.google.com/p/go.tools/cmd/godoc: cannot download, $GOPATH not set. For more details see: go help gopath

Emacsの環境設定

次の記事を参考に必要なものをインストールした。

go側の必要なパッケージをインストールしておく。

$ go get code.google.com/p/go.tools/cmd/godoc
$ go get code.google.com/p/rog-go/exp/cmd/godef
$ go get github.com/nsf/gocode
$ go get -u github.com/dougm/goflymake

list-packagesで以下をインストールしておく

  • go-mode
  • go-autocomplete
  • auto-complete-mode(インストール済みだったので、ここでは特に説明しない)
  • flyamke(インストール済みだったので、ここでは特に説明しない)

init.elに以下を追加。

;; PATHの設定をシェルの設定から持ってくる
;; $SHELLで設定されているシェルの設定が使われる
(when (memq window-system '(mac ns))
  (exec-path-from-shell-initialize))

;; ==============================================
;; goの設定
;; ==============================================
(when (and (require 'go-mode nil t) (executable-find "go"))
  ;; GOROOT, GOPATH環境変数を読み込む
  (let ((envs '("GOROOT" "GOPATH")))
    (exec-path-from-shell-copy-envs envs))
  ;; go-autocompleteの読み込み
  (eval-after-load "go-mode"
    '(progn
       (require 'go-autocomplete)))
  ;; goflaymakeの読み込み
  (add-to-list 'load-path (concat (getenv "GOPATH") "/src/github.com/dougm/goflymake"))
  (require 'go-flymake)

  ;; go-eldocの設定
  ;; https://github.com/syohex/emacs-go-eldoc
  (add-hook 'go-mode-hook 'go-eldoc-setup)
  (set-face-attribute 'eldoc-highlight-function-argument nil
		      :underline t :foreground "green"
		      :weight 'bold)
  )

今回、exec-path-from-shellを使って.zshrcで設定したPATHや環境変数(GOROOT, GOPATH)を読み込むようにしている。

ちなみに、exec-path-from-shellは$SHELL環境変数に設定されているシェルの環境変数をひっぱってくるらしい。デフォルトのシェルを変更するには以下のようにする(ここでは、bashからzshに変更)

$ echo $SHELL
/bin/bash

$ chsh -s /bin/zsh
# ここで再起動

# 再起動後以下のように表示されていればOK
$ echo $SHELL
/bin/zsh

そして、Emacsを起動して、hello.goを開いてみる。fmt.Pまで入力すると以下のように保管される。

godocも使える。

M-x godocとして「fmt Println」とする。

goflymake(https://github.com/dougm/goflymake)でエラーチェックなど

定義へジャンプする。
Printlnへカーソルを持ってきて「C-c C-j」でPrintlnのソースコードへジャンプする。

とりあえず今日は環境設定で終わり。次は、何かプログラムを作ってみようかな。

追記(2014/01/14)

go-eldocを追加(init.elの設定は前述の設定に追加)

@syohex さんに教えてもらったgo-eldoc(GitHub - syohex/emacs-go-eldoc: eldoc for go language)を追加。以下のようにミニバッファにメソッドの引数がでてくる。(・∀・)イイ

ポータブルでワイヤレスなスピーカー BOSE SoundLink Mini Bluetooth speaker を買った

スピーカーを全く知らない人間が、BOSEのスピーカーを買ってみた感想です。
これは、感動するほどすごい。

BOSE SoundLink Mini Bluetooth speaker
BOSE
売り上げランキング: 188
SoundLink Mini Bluetooth speaker 製品概要 | Bluetoothスピーカー | マルチメディアスピーカー | Bose ボーズ
これまで、スピーカーといえばiPhoneのスピーカーとテレビのスピーカー、5,000円くらいで買ったSONYのスピーカー、そして、PS3用のSONYのスピーカーくらいしか家にはなかったので、ずっとミニコンポ位はほしいなと思ってたんですね。しかし、置く場所もないしそんなにお金かけるほど(自分は)音楽もきかないしってことで、結局現状のまま何年も過ごしていた状態でした。

そして、なんとなく家電屋でこのBOSEのデモ機を見た時に、これだと思ったわけです。買ってみようかなと思った理由は主に以下の4つのポイントでした。

1. 小さいのに音がいい、重低音がっ

結構小さいのに、周りの音に負けない音がでてて、これから音がでてるのかって思うほどのインパクトがありました。

2. ワイヤレス(Bluetooth)で聴ける

うちの場合、だいたい音楽はiPhoneの中に入っていてそこから、SONYのスピーカーにつないで聴くか、Apple TVにAir Playで飛ばしてテレビのスピーカーで聴くかだったので、Bluetoothで飛ばして聴けるというのは魅力的でした。

3. ポータブル(持ち運び)できる

バッテリー内蔵なため、電源アダプタをはずして持ち運びできます。そんなにメリットかと思うかもしれないですが、私は、iPhoneで音楽かけながら洗濯物干したり、出かける準備をしたりしていたので簡単に持ち運べるのは結構魅力的でした。充電も付属のクレードルに載せるだけなので、ちょっと寝室に移動させて音楽聴くってときにも煩わしことがありません。ただ、クレードルに載せて充電モードにさせるのにコツがいる感じです。

安い(22,890円)

BOSEといえば、ヘッドフォンでも?2万5千円以上だった気がするのですが、こいつはそれよりもう一声安いです。結局、この音で、この大きさで、さらにポータブルでこの値段か?!ってことになったわけです。
まぁ、値段に関しては人によるってところもあるので、なんともアレですが。ちなみに、家のスピーカーたちの値段は以下の様な感じなので、順当なステップアップな感じです。

iPhoneのスピーカー

以前使っていたガラケーよりはだいぶいい音がしますが、とりあえず音が出ます程度。

テレビ(REGZA 42Z3)のスピーカー

これもとりあえず、音が出ます程度・・。

SONY SRS-M50 (5,259円)

これは値段の割にいい音がでると友達に教えてもらい購入したものです。

PlayStation3用 サラウンドサウンドシステム (22,780円)

あれ、これって昔買った時は1万6千円くらいだったのですが、今は、今回購入したBOSEのスピーカーと同じ位の値段になってますね・・。安い時に買ったんですねきっと。

これを買ったきっかけは、テレビ(REGZA 42Z3)の音がめちゃしょぼいということで、急遽買ったものです。映像の綺麗さ、ゲームに強いと謳われていたりしてかったんですが、音にはまったく力を入れてなさそうでした。

実物の写真たち

箱はこんな感じ。

箱を開けてみた1

箱をあけてみた2

本体を取り出してみた。カッコイイ・・。

同梱物。本体と充電クレードルと電源アダプターの3点。

手のひらに乗せてみた。なんとか、乗ります。ちょっと重いのでぷるぷるします。

充電クレードルと本体。このクレードルに載せるだけで充電できます。ちょっと乗せるのにコツがいるけど・・。

クレードルに載せてみた。充電が開始されると音がなります。ぴぽっ

クレードルを使わずに直接接続することも。

電源ボタンとか。左から、電源ボタン、ミュートボタン、音量下げるボタン、音量上げるボタン、Bluetoothで音を出すボタン、AUX接続で音を出すボタン。いま、どのくらいの音量かわからないのが残念。

コンセント部分

別売りのカバーを装着。ちょっとかっこ悪い気もする・・。

BOSE SoundLink Mini soft cover グリーン
BOSE
売り上げランキング: 2,241

Bluetoothで接続する

iPhoneMacbook ProからBluetoothで接続する方法を説明します。

iPhoneから再生する

ここでは、iPhoneから音楽を流してみます。
まず、電源を入れてBluetoothのボタンを押します。すると下の写真のようにランプが青く光り点滅します。

次に、iPhoneの「設定」>「Bluetooth」を開き、BluetoothをONにします。すると、以下のように「Bose Min... 接続されていません」と出てきます。

Bose Min...」をタップしてしばらくすると、「接続されました」となります。

すると、Soundlink miniの方では点滅していた青いランプが、白の点灯状態となり、ぴぽっと音がでます。これで接続完了です。あとは、iPhoneiTunesやその他アプリ(radikoやTuneIn Radioなど)から再生すればSoundlink miniから素晴らしい音がでてきます。

Macから再生する

基本的な流れはiPhoneの時と同じです。
Soundlink miniのBluetoothボタンを押し、青く点滅することを確認したら、Macの「システム環境設定」>「Bluetooth」を選択し、以下のように「ペアリング」を行います。これだけです。

ちなみに、一台の機器で接続するだけならこれらの操作は一度するだけで基本的には次回接続時には自動で接続されます(Soundlink miniの電源がOFFの時はONにする必要はあります)が、複数の機器を使って切り替えたりする場合(上記のように、iPhoneで接続したりMacで接続したり)は、切り替えるたびに上記の接続(ペアリング)設定をし直す必要があります。まとめると以下の様な感じですかね。

  • 1台の時
    • ペアリング設定は1度だけ
  • 2台以上の時
    • 接続する機器を変更したいときに接続(ペアリング)設定をし直す
  • Soundlink miniの電源がOFFになっている時
    • 電源を入れる(自動で電源は入りません)

AUXケーブルで接続する

AUXなにこれと思ったんだけど、いろいろ調べたら、テレビともつなげるということが分かりました。
うちのREGZA 42Z3の場合「ヘッドフォン」と書かれているジャックからステレオミニプラグケーブルと、Soundlink miniを接続します。

これまでのスピーカーとの違い

私のiPhoneの中にはちょっぴりしか音楽が入っていないですが、とりあえずYUIさんを流してみました。

CAN'T BUY MY LOVE (通常盤)

BOSEのスピーカーは重低音すごいですって聞きますけど、確かにすごいです、この大きさでズンズンきます。iPhoneとかでテレビで音楽聴いてても、ベースっているの?って思ってたりしましたが、ベースいるんですっていうのが、分かりましたスミマセン。今まで、音楽の半分も聞いていなかったんじゃないかと思えてきます。それほど、今までの環境と次元が違います。
低音もさることながら、YUIさんの声もめちゃクリアに聞こえます。今まで聞こえてなかった音が聞こえてくる感じです。目の前で、弾き語りしているかのように聞こえます。言い過ぎですかね。いや、これまでの環境とそれほどの差があるということです。

テレビにつないで映画を見たら

年末に買ったパシフィック・リムを見てみました。ずーんずーんずごごーんって感じです。PlayStation3用 サラウンドサウンドシステムのダイナミックモードで聴くより迫力があります。

パシフィック・リム ブルーレイ&DVDセット (3枚組)(初回限定生産) [Blu-ray]
ワーナー・ホーム・ビデオ (2013-12-11)
売り上げランキング: 13

このスピーカーでこんなに迫力でるってことは、ホームシアターとか買っちゃったらどうなるんでしょう。マンションのスペック上げないとダメかもしれません(音漏れしそうで)

ジャズを流すとおされなバーにいる気分になる

おしゃれなバーでジャズを聴いたハッキリとした記憶はないですが。印象です。小洒落たバーやカフェのちょっと気の利いたスピーカーから流れているようなアレです。
私はジャズも聴かないですが、このスピーカーを通して聴くジャズは面白いです。やっぱりベースがしっかり聞こえてくるし、いろんな楽器の音がよく聴こえてくるからだと思います。これはジャズに限った話しじゃないと思いますが。いろんな音楽を聴く楽しみがでてきた感じがします。

FMラジオでさえかっこ良く聴こえる

いや、本来カッコ良いものなんでしょうが・・。個人的なイメージとして、ラジオから流れる音はあまり良くないという印象があったので・・。
iPhoneでラジオが聴ける、RadikoというアプリでFMを聴いてみました。話し声にも深みがあります(たまたま話してた人の声がそうだったという感じではなく)。流れてくる曲もラジオの音と思えないくらいです。ラジオを聞く人の気持ちがわかる気がします。

まとめ

最初に書いたとおりスピーカーの知識がまったくない人間の感想なので、参考になるかはわかりませんが、同じような環境にいた人にはおすすめしたくなる製品です。
いい音で音楽を聴く、ただそれだけで、今までの生活ががらっと変わったような気さえしてきます。(その前に、いままでの環境が悪すぎたせいなのかもしれないですが・・)音響機器に投資する人の気持がちょっとわかった気もします。

BOSE SoundLink Mini Bluetooth speaker
BOSE
売り上げランキング: 188

MacBook Pro Mid 2010のHDDをSSDに換装したら快適になった

3年くらい前にかったMacBook Proがだいぶもっさりしてきたので、思い切ってHDDをSSDに交換することにしました。

MacBook Proのスペックはこんなの

購入したSSDSamsung SSD840EVO 250GB

交換した結果色々さくさく動くようになりました(・∀・)特に、今までネットをするだけでもひっかかりがあるようでストレスありまくりだったのが、全くなくなった。それとiTerm2を起動するのに時間がかかってたのが、すぐに起動するようになったとか。会社で使っているMacBook Airとそんなに変わらない使い心地になった気がします。いや、よかった。

交換前と交換後の比較

Xbench(http://xbench.com/)というソフトを使ったベンチマーク結果。

交換前(SATA 5400RPM 320GBの場合)

スコア 詳細
Sequential 71.56
Uncached Write 89.80 55.14 MB/sec [4K blocks]
Uncached Write 55.41 31.35 MB/sec [256K blocks]
Uncached Read 62.55 18.31 MB/sec [4K blocks]
Uncached Read 93.21 46.85 MB/sec [256K blocks]
Random 33.06
Uncached Write 12.45 1.32 MB/sec [4K blocks]
Uncached Write 66.51 21.29 MB/sec [256K blocks]
Uncached Read 64.64 0.46 MB/sec [4K blocks]
Uncached Read 98.29 18.24 MB/sec [256K blocks]

交換後(SSD840EVO 250GBの場合)

スコア 詳細
Sequential 208.08
Uncached Write 365.03 224.12 MB/sec [4K blocks]
Uncached Write 306.19 173.24 MB/sec [256K blocks]
Uncached Read 92.52 27.08 MB/sec [4K blocks]
Uncached Read 414.99 208.57 MB/sec [256K blocks]
Random 1010.15
Uncached Write 1401.52 148.37 MB/sec [4K blocks]
Uncached Write 519.96 166.46 MB/sec [256K blocks]
Uncached Read 2537.13 17.98 MB/sec [4K blocks]
Uncached Read 1076.51 199.75 MB/sec [256K blocks]

何かの間違いかと思うくらいパフォーマンスが向上してます。


色々起動時間など

内容 交換前 交換後
起動時間 66秒 20秒
Chrome起動時間 7秒 1秒
Xcode起動時間 20秒 11秒
Xcodeからエミュレータ起動 38秒 16秒
iTunes起動時間 9秒 2秒

劇的に早くなってるビビった。

いるもの

HDDの内容をそのままSSDにコピーするために、MacSSDを接続するためのケーブルが必要なので、これを使った↓

そしたら、これに入っているはずのSATA電源変換用ケーブルがなくなっていたので変換ケーブルも購入。

あとは、HDDについているネジを外すための特殊なドライバー。これがなくて、ペンチで無理やり外したりするはめに・・。

ハマったところ

換装後は「システム環境設定」>「起動ディスク」からディスクを選んでおかないと、起動に時間がかかるっぽいです。しばらく気付かなかったけど、これで、起動時間がめちゃ早くなりました・・。

Macの起動、リンゴマークが出るまでが遅い時は、システム環境設定から起動ディスクを設定してあるか確認を。~兄妹の気まずい絵日記 / もっと知りたいリンゴあれこれ

320GBのディスクから250GBのディスクにコピーしようとすると「容量が足りない」みたいなエラーになったので、320GBのディスクのパーティションを一回200GBくらいにしてからじゃないとコピーできませんでした。パーティションサイズの変更は以下のサイトが参考になりました。

【Mac】後からハードディスクのパーティションを変更(追加・削除)しました ~OS X Lionの大部屋作り~ / もっと知りたいリンゴあれこれ

最後に

色々ハマったけど、その苦労に見合う効果があったんじゃないかと。これであと2年くらいはこのマシンでやっていけそうな気がします。

あとは、Samsungのディスクの信頼性が微妙だというコメントを色々なところで見るので、バックアップとか考えとかないとアレですね。iPhoneのバックアップやソースコードとかはNASに保存するとかとか。その辺りはまた別の記事で・・。

第1回 Build Insider OFFLINE に行ってきた

6月8日は「<htmlday> 2013」ということで日本各地でWeb関連のイベントが行われたそうですよ。

ということで私はその中のひとつ「 第1回 Build Insider OFFLINE」に参加して来ました。(途中から参加なのでキーノートとランチは出来なかったけど・・。)

よりよい開発を目指すためのプロセス・ツール活用

まず最初に聞いたのがこのセッション。中村薫さんによる開発プロセスに関する自身の事例や、利用しているマイクロソフトのTFSというソフトウェアを通して感じたことを聞かせてもらいました。

Team Foundation Server - Wikipedia

TFS(Team foundation Server)しっている人と言われて、会場の8割くらい?が手をあげていたので、アウェイ感半端無かった。マイクロソフト関連のアプリケーション開発ってぜんぜんやったことないので、初耳でしたよ・・・。

TFSがどういうものかというと、私の理解によるとRedmineとJenkinsとGitが一つになったようなやつです。また、ローカルな環境にインストールして使えるTeam foundation Serverと、クラウドサービスとして展開しているTeam foundation Service(どっちもTFSなので分かりにくい)があるようで、中村さんはほとんど、TFService(クラウドの方)を使っているということでしたね。クラウドの利点である離れた場所にいる人と開発を行うってところで威力を発揮しているみたいでした。

印象に残ったのは、TFServiceは3週間毎にリリースを行なっているということ。マイクロソフトみたいな巨大な企業でさえアジャイルなプロセスが実践できているんだから、会社の規模が大きからできないよねって言い訳は出来ないよねって。なるほどねーと思いました。

Backbonejs

次に聞いたのMVCフレームワークのBackbornejsです。LINEの清水大輔さんによるセッションでした。

  • 資料はこちら

BackboneとはMV*(MVCとかMVVMとかのこと)アプリを作るためのフレームワークというかライブラリって感じらしい。フルスタックなAngularJSと違って、もっと軽量で自由度が高いそう。
また、MVCフレームワークの人気度調査では1位になっているらしい(http://caliper.io/blog/2013/Javascript-Framework-Popularity/)でもGoogleトレンドでみたらAngularJSに負けてたってことでしょんぼり。

Backbonejsは他のJSライブラリと組み合わせて使うことが一般的で、jQuery, zepto(LINEではこれをよく使っているらしい)、Ender、underscore.js, json2.jsなどをよく使っているみたい。

Backbonejsを使うと、DOMからビジネスロジックが分離されることになるのでテストが書きやすくなるらしい。jQueryだけで作っているJavaScriptのテストってすごいやりにくかったりするので、これはいいね。

AngularJS

次は金井健一さんによるAngularJSについてのセッション。

AngularJSの得意なこととして

  • CRUD系アプリケーション
  • 管理ページ・マイページ
  • 1ページで完結するアプリケーション(最近のMVCではふつう)

苦手なこととして

  • モバイル向けアプリケーション(ファイルサイズが大きい。フルスタックなので。通信コストとか)
  • ゲームなどのグラフィックの扱い(でもhttp://bombermine.com/のゲームのフレームとかステータス表示とかで使っているみたい)

モバイルは苦手みたいですが、最近タッチイベントとかスワイプイベントとか取れるようになってモバイル対応も始まっているようです。金井さんの希望としては、モバイルでは機能を少なくして、ライブラリのサイズを小さくして貰えたら、ということでした。ただ、サイズが大きくてもダウンロード型のアプリでライブラリを含めるのはありかな、ということです。

Knockout.jsとは

次は、沢渡真雪さんのKnockout.jsというライブラリのおはなし。

特徴としては

Observable

Observableとは値を監視可能な形にラップする仕組みだそうで。

  • ko.observable
  • ko.observableArray
  • ko.computed

の3つがあり、次のように使うみたい。(因みに以下は動かして見てないので、雰囲気だけ感じてください)

var value = 1; // valueが変更されたことを知るのは難しいので・・

// まず、こうしてvalueを監視可能なオブジェクトにラップします。
var value = ko.observable(1);
var value2 = value(); // value()というGetterができてる
value(1.048596); // 値をセットする(Setterができている)

// 次に、通知を受け取れるようにsubscribeでリスナーを登録します
value.subscribe(function(newvalue) { alert(newValue); });

// この状態で、valueに値をセットすると
value(30); // 変更されたことを受け取って、上で登録した関数が実行されます(30という値がalertで表示される)

// つぎに、ko.computedでobservable同様の監視可能なオブジェクトを作る。
var value3 = ko.computed(function() {
  return value() + value2();
});

// computedなやつもsubscribe可能なので、次のようにできる
value3.subscribe(function(newValue) {
  alert(newValue);
});

// ということで、依存関係を自動で追跡して更新・通知してくれる!

あと、DOMとのバインディングの機能もありますということで、これはサンプルをメモれなかったので、後で自分で試してみようかと・・。

リアルタイムWeb最前線〜Socket.IO & SignalR徹底解説

最後に聞いたのが、芝村達郎さん(26歳)のWebSocketのライブラリであるSocket.IOとSignalRのセッション。

Windowsの人はSignalR使って、それ以外のMacとかLinuxとかの人はSocket.IO使えばいいじゃん、ということでした。

  • 資料はこちら

Socket.IOの特徴としては

SignalRの特徴としては

  • ASP.NET上で動作する
  • マルチスレッドモデル
    • SignalRの方がパフォーマンスはでる
    • Socket.IOは複数のサーバを用意してコア数分動かす必要がある
  • Taskベースの非同期処理ができて開発しやすくなった
  • RPC感覚で処理をかける
  • 対応トランスポート
    • Websocket(WS2012+.NET4.5の場合だけ動く)
    • Server-Sent Events
    • Forever Frame
    • Long Polling
  • クライアント

スケールアウトが非常に難しいらしいです。単純にサーバを増やしただけではスケールしなくて、誰がどのサーバにつながっているかを管理する必要があるということでした。そこで、メッセージングサーバを使って、誰がどこにつながっているかを管理するんですが、それにはRedisやAzureサービスバスとかを使うのだそうです。これはSocket.IOとSignalRとで異なった対応方法が必要になり、以下の様な感じになるみたいです。

Socket.IO

  • 接続情報をメモリではなく外部ストレージに保存して共有(Redisを使えば)
  • 接続情報はメモリに持っている。どのクライアントがどのサーバにつないでいるかを持っている。
  • ・RedisStore
  • ・SbStore(※接続情報の共有はできない)

SignalR

  • そもそも接続情報もってない
  • 情報共有はせず、メッセージングに投げっぱなし
  • ・ SignalR.Redis
  • ・ SignalR.ServiceBus


開発のヒントとして

  • 通信頻度を下げてリソースの消費を抑える
    • 1000台のクライアントが同時接続しているとき、1クライアントが1つメッセージを送ったら1000クライアント分データを送らないといけないなど。
    • underscore.jsのthrottle/debounceを使って通信量を抑えるとか
  • ビューの更新にデータバインディング可能なライブラリを利用する
    • AngularJSとかKnockout.jsとか使う

開発をして思ったこと

  • リアルタイム性を活かせるアプリを考えることが難しい
    • チャットに変わる何かを考えたい(チャットはもういい!)
    • プッシュ通信と、クライアントの同時接続製を活かすことを考える
  • スケールアウトは難しい
    • データの同期、トランザクション数など普通のWebアプリよりパフォーマンスに関して考慮する必要がある
    • SignalRはスケールアウト時のメモリリークで長期間悩まされた(今は一応解決してみるみたい)

まとめ

今回は、興味があったけど、まだ試してないものなど色々あったので、これを機にに実践・導入していこうかなと。特に、JSのMVCフレームワークは必須な感じですね。これがないとテストどうするのって感じ・・・。
ということで、色々興味深い話が聞けました。また来年もはあると思うので(きっと)、楽しみにしてます。

Google I/O報告会に行ってきた(メモ)

5月24日に行われたGoogle I/O報告会に行ってきました。久しぶりの大きな勉強会&長丁場なので最後までいられるか心配してたんだけど、なかなか濃い内容だったので5時間あっという間だった。

発表者の方が言ってたように今回のGoogle I/Oでは特に大きな発表はなく(Google App Engine発表、というようなインパクトのあるものはなかったという程度に)、これまでの技術をより安定&洗練するためのテクニカルなところの成果発表といった感じでした。とはいえ、Googleの技術を使って開発等してる方にはなかなか充実したものだったんじゃないかと思います。(最近全然Google関連の技術に触れてないんだけど・・。)

印象に残ったのはサンフランシスコではGoogle Glassやその他サービスを作った技術者の人と話が出来たり、コードの不具合を見てもらったり出来たらしいってこと。なかなかそういう機会ってないと思うので羨ましいっすねー。来年こそはと思ったけど今日受けたTOEICの出来栄えがなかなかアレな感じなのでいつになることやらー。

技術的な所では、AndroidのVollayライブラリというやつで、ネットワークに接続して画像取ってきたりするのが便利になるらしい。(キャッシュとか、HttpClientどれつかうとかで悩まなくなるらしい)あとは、Google App Engineで使ってたDatastoreサービスが、外から(App Engine以外から)HTTP、JSONで使えるようになるらしい。これは、結構いいかも。EC2でフロントつくって裏はDatastoreとか。

ということで、今回のGoogle I/O報告会の資料などのリンクをメモっときます。

以下は自分用メモです。誤字脱字、勘違い、理解不足のため途中で諦めたような記述等多々ありますのでお気をつけください・・。

Androidセッション
Development Tool
 Android Studioが発表された
 IntelliJ IDAベースになった
 Gradle OSSのビルドシステム
 環境に応じてパッケージ名を切り替えたりできる?

Google Play
 PlayやAndroid Studioからリソースを翻訳してくれるサービス
 α版ベータ版の段階的リリース
 ユーザ数を増やすセッションとかもあった
Google Play Services
 Google Wallet
  物理的なものも販売できるようになる
 Location API
  位置情報の取得などを頑張ってやってたことをPlay Serviceがやってくれたりする

Application Design
 Structure in Android App
  エレベータピッチ、フィーチャーリストの間のユースケース
 
UI/UX
 4.2からDaydrem
  ドックアプリの汎用的なもの
 視覚障害者に対してどのように配慮すべきか

その他
 Google TV
  韓国では使われている、ビッグマーケット

Performance

1秒遅くなると
 PV9.4%へる
 直帰ユーザ8.3%増える
 コンバージョン3.5%減る
 とか

0−100ms 速い
100−300msのろま
300−1000ms
1s+メンタルコンテキストスイッチ

モバイルネットワーク
HSPA(3G)
 全部おわるまでに600ms

LTEでは240ms−500ms
 HTTPSだと +200ms

リダイレクトは絶対止めましょう
 3Gだと600ms−3500msかかるので

バッテリー
 通信の次に電池を消費する

LTEモジュールの状態遷移
 
通信モジュールが待っている時間が無駄
データ量に依存せずに必ず発生する
ビーコンはかなり危険(Pandraの例
測定ツールもある

BestPractice

データをプリフェッチ(大量に)
通信をOFFにする
ポーリングを避ける、プッシュする
データは一気に取ってくる、通信回数を減らす

Vollayネット接続ライブラリ

 Easy Fast Network
 JSON, image, text memory disk cache、デバッグ、トレース
 
 順番が変えられない、キャッシュされない
 次互換性、Apacheのライブらい(HTTCぃねt)とかの問題
 これらを解決

グラフィックの最適化
 
 フレームワークが頑張ってる
 無駄な描画をしない

 背景色はThemeで定義
 9Patchでかぶさる部分を透明にする
 
他にも色々なチェックツール


クラウド関連

PlayGame Services & GCM

AppleでいうところのGame Center
初日はゲームに関するセッションが多かった
売りげベースでゲームが多かった

Cloud Save(端末を変えても続きからプレイできるとか)
Achievements(実績)
トロフィー的な
Leaderboard(ランキング)
 サークル内の限定的なものとか
Multiplay

Androidだけでなく、WebやiOSでも利用可能
iOS用ライブラリや解説もある

Google+のIDでサインイン
iOS版ではライブラリのアップデート毎にリリースする感じになる
Android版ではPlaystoreでやってくれる?

Cloud Save
 細かいことはできない

Multiplay
 Google Serviceを介して
 つながったらP2P
 注意
  小さいデータ。JSONとかよりもPBとかを使う
  メッセージの暗号化

GCM XMPP
 自サーバとGCMでつないだ状態になるので速い
 メッセージIDなどを埋め込まないとどれがどれだかわからなくなる
 XMPPの場合はマルチキャストメッセージが使えないので、その場合はHTTPS
 アプリ側から、GCMへメッセージを送信出来る
 Play Serviceに統合された(下位互換性を保持)

質疑応答

Q. カードレイアウトについて
 今こういうUIがいいよっていうのは、ありますか?
A. あんまりセッション見てないのでわかりませんでした
 ストラクチャーアンドロイドアプリデザインのところとか
 
Q. Android OSやAndroid端末
A. Gallaxyがでた。Nexusと同じ位置づけ

Q. Androidの新しいバージョンの発表がなかった。
 今後のAndroidのロードマップやこれを強くしていこうとしているのは、なんだと思う?
A。次に進むために周りを固めている印象。

Q. Cloud Save ゲーム以外でも使える?
A. ゲーム以外でも使えます

Q。Android Studioの本格的に利用できるのはいつころ?
A. 時期は不明。EclipseとStudioどっちつかえばいいの?
 Eclipseのほうが機能がおおいので、人によってはStudioだけではだめかも
 
Q. Valayについて質問。動的な部分のキャッシングできおつけること。キャッシュがたまったらどう制御する?
A. キャッシュクリア出来る。キャッシュサイズも調整できる。

Q. LocationAPI。ヒューズどロケーションプロバイダが追加になったけど、今後は?
A. 今後はひゅーずどの方を使いなさいということ。2.2以降のデバイスであれば、ひゅーずどに以降してくださいということ。


Chrome HTMLとか

WebM Google製のオープンなビデオフォーマット
VP9を開発中
 H.264より画質が良くてサイズが小さい
 もうChromeで使える。(βで)、8/20以降、ステーブル版にくる
 YoutubeですでにVP9ビデオが公開中

Web Components In Action
 UIコンポーネントの基盤をWebに
 カスタム要素をりようできるようになる
 Ploymerフレームワーク・ライブラリ 
  Web Componentsをさらに便利に。
  Web Componentsに対応していないブラウザでもJSで保管して使えるように

Web RTC
 ブラウザかんでP2P
 Chrome限定でスクリーンキャプチャをとれる

webp

モバイルからのアクセスが増えている
画像のサイズが上がってきているので問題になってくる
サイズはJpegより最大30%くらい減るけど
エンコーディング(圧縮)5−10倍遅い
デコード:1−3倍遅い
アメリカでは従量制が多いので、サイズを減らすのがいいのではないかという方向
将来ハードウェアサポートが期待できる

requestAutocomplete()
 決済情報を保管してくれる
 

A more awesome Web, Mobile HTML , Dart

CSS
 emとかの単位。そうたい的な単位が増えたよ
 変数が使えるようになる
  var-fontColor : red;
  color: var(fontColor);
 @supports、CSSがサポートされているときはこっちを、とか
  @mediaはデバイスごとだけど
  @support (disploya: flex) { display: flex }
 postision: sticky
 ぜんたいの中の一部を表示するとか。

Multimedia
 WebRTCでスクリーンキャプチャ
 マイクの入力が取れるようになった
 Speech Api 自分が喋った内容をテキストに落としてくれるとか

Mobile HTML
 Viewport, viewport units, Flexible box module, position:sticky
  上記でスクリーンサイズに対応
 Geolocation , Offine Events, Application Cache、Storage Apis
  ユーザがどこにいるか、ネットワークが繋がっていない時とか
 入力を手伝うための機能を使う
 Navigation timing API
  むずかしかったのでよく分からなかった

 色んなハードウェアがあるけど
  Androidインテントをブラウざから
  Fullscreen、ネイティブアプリっぽいのをつくれる

Dart
 海外では意外と期待している人が多い
 JavascriptDartの比較
  言語デザイン
  大きなアプリケーションの場合
  All in one
  エラーを無視するか、警告を出すか

 DOM操作がやりやすい
 デフォルトのライブラリがjQueryっぽい
 新しいWebの機能を取り込む

 メソッド化スケーティング
 Dartせいのプレゼンツール
 メソッド名を動詞にこだわっていない


Performance, Devtools

Workspace
 Devtoolsをエディタにしてしまおう
 Elementsパネルで修正したスタイルやソースパネルで編集した内容が、そのままローカルに保存される。
SASSサポート
 Source mapが必要
 
Portfowarding
 リモートデバッギング、USBでつながっている端末とローカルのアプリを繋げることができる

Frame chart
 Javascriptのプロファイル
 どのメソッドにどれだけ時間がかかったかタイムラインで見られる

メモリ(アロケーションラッキング
 メモリの割当てをタイムラインで見られる

Show composited layer
 GPUをりようしてパフォーマンスアップ。
 アニメーションに3D表現を使うと速くなるというテクニック、
 それを視覚的にすることができる
 
上記の多くは、Chrome Canaryでないと試せない


QA

Q. Webpをモバイルで使うときどうするか
A. JavaとObjCで使う例がある


Q. Dartのサーバーサイドのセッション
A. サーバの話は出て来なかった。

Q. WebkitがブランチBlink
A.

Q. Webpについて圧縮
A. アリゴリズムについてのセッションはなかった。

Q. AndroidChromeで加速度センサーの対応状況
A. Chromeブラウザになって使えなくなった??標準ブラウザのときは使えたっぽい。


Google Cloud Platform

Compute Engine

EC2みたいな感じ
今までは、サポートに入っているひとしか使えなかったけど、一般公開された

1分単位で課金(ここはComputeEngineが有利かな)
EC2とかは1時間単位で課金される

Debian VMを使う
Small, microインスタンスを追加。
 CPUをあまりつかってない用途のものにいい
高級パケットルーティング
 1つのプロジェクトの中に複数のネットワーク、サブネッワークをつくったり、BPM
Max10TBの永続ストレージ。VMにつなげることができる

Cloud Datastore

AppEngineのDatastoreが外からも使えるようになる
JSONかPBで使えるようになった
AppEngineのDatastoreと同じ
ダウンタイムはほぼなし
Compute Engineでアプリを使って、Datastoreはこっちを使うとか
25%値下げ

AppEngine PHP

Limited preview(申し込んで許可されたひとだけが使える)
PHP5.4
Wordpressが動く
DatasotreAPIがまだ使えない
 Cloud SQLは使える
 Cloud DatastoreのJSON APIを使える

mbstringが入っていない(対応しているExtensionが少ない印象)
ファイルシステムに書き込めない
 Cloud Storageを代わりに使う
一部関数が使えない(exec, tmpfile)
C拡張は使えない

1つのアプリで複数モジュールを管理
 スケール、デプロイ、バージョン、パフォーマンスがモジュールごとに別々に管理できる

Mobile Backend Starter
 Androidのアプリからサーバがわのコードを書かずにDatasotreを使える
 コードがGithubに公開されているのでそれをもってきて使う

Big Query

AnalyticsとAdsenceをデータソースとして使えるようになる
 (Analyticsはプレミアムアカウントだけ)
Google Apps Scriptから使えるので、スプレッドシートに大量のデータをいれて
アクセス解析するとか

Google Cloud Storage

バージョン管理ができるようになった
可用性の落ちるストレージが安く提供されるようになる
 もとのデータソースをフィルタした結果を置いておくとか
ファイルを書き換えた時とかに通知するとか

gsutilコマンドを使ってcpコマンドみたいなことができる
S3のデータも同じように扱える
大きなファイルをアップロードしたいときとかに、
分割したファイルをマルチスレッドでアップロードできる
 (Cloud compsiteとかと関連)

Drive API

去年I/Oからの差分
Widgets(UI系の機能)
 Google Picker、Embeddable Sharing Dialogを出せる
ダウンロード先にGoogle Driveを選択できる

Apps Admin SDK

Directory API
 Provisionning API系を置き換えるもの
 ユーザの情報をかき集めるのが大変だった
Reports API

既存のAPIが色々Deprecatedされたので注意

Google Apps Script

Form + GAS
FormをGASで作れるようになった
Formのデザインを拡張できるようになった
Docsにもスクリプトを置けるようになった
 ヘッダ、フッタ、リストアイテムとかをいじれるようになった
 他人のカーソル位置とかも取れるようになる(予定
 ダイアログとかも出せるようになった
 サイドバー機能。ドキュメント書きながらなんかするなど。

トリガーの充実

GAS+Drive SDK
 GASだけでDriveの中身をいじれるようになった
 ディレクトリ以下のファイルの一覧を取得とか
 フォルダやファイルの検索が簡単
 
QA

Q. Google StorageにあるファイルをWebに公開できる?
A. できる。権限設定も細かくできる。

Q. DriveとStorageの住み分け
A. TB単位のデータをいれるのはStorageとか

Q. アジアにデータセンターはできる?
A. とくに発表はなかった


Q. Rubyを使えるようにな情報は?
A. 情報はきいてない。

Youtube

Youtubeを動画フラットフォームとして使って貰いたい
ライブ配信とかあった
デベロッパーからも使って貰いたい、
YoutubeLiveが個人でも使えるようになった
 パートナーシップをむず部
 チャンネル1000人以上いること
 著作権違反がないこと
Live API
 アプリからイベントを作成したりできるようになる

APIがv3になった
 結構大きな変更
TopicksAPI
 Freebaseと連携
 キーワードから動画を検索とかが簡単になった

Androiアプリの中からYoutubeを動かせるようになった
 いままでは、WebViewとかインテントで飛ばすとか
VP9を今年中に対応


Google+

Sign in
「G+ Sign in」ボタン
設置の仕方(Android , iOS、PC)

何が嬉しい?
 Google にログインするので、、
 アプリをパーソナライズ
 Googleのサービスの内外で友人が登場する
  Gogle Search ,Restful APIによる外部サイト連携

Goolgeの書くサービスのいち口をSign inにする?

Go

v1.1がでた
速くなった
 コンパイラ、リンカ、GC

GEO

Maps関連
パーソナライズ強化
素早く表示・WebGL実装
地図そのものがインターフェース
あにめーしょんとかスムーズ

Google Maps API

実装系の話

デザインが大きく変わった、機能はあんまりかわってない
8/14から新デザイン v=3.ex
11/14 v=3

Google maps Tracks API
 車両などの追跡用API
 位置の記録とGeoFenceが主な機能
  どっかのエリアに入ったら通知したりできる
 通常のユーザ(無償版)も利用できるように

QA

Q. Anroidでアカウントマネージャを使ってましたが、今後はSign inボタンになる?
A. Android向けの話だと、Sign inボタン使わなくても、
 Google Gamesの中に認証用のAPIが入っているので、それを使えうとSign inボタンはつかわなくてもできると思う


Q. Map v3の件。カスタムのピンを作っているが、デザインはどうなる?
A. フロントとシャドウとプロパティがあるけど、シャドウは今後無視されるようになる。

Q. G+、ポストができない?Developerサイトを見るとReadonlyだったけど?(APIを使ってポストする?
A. Sign inの後に認可画面がでるので、そこでちゃんと権限をしていしていたらできる

Q. Go言語。v1.1。ロックをかけるのはプログラマの責任?言語がやってくれるようになった?
A. 管理は自分でやる。コンパイル時に検出してくれる。べーすこんでぃしょん?

Chrome Packaged Apps

Chrome app v2
 ブラウザをプラットフォームとしてNativeアプリっぽいものを動かす

見た目が違う。ブラウザとは別のウィンドウで立ち上がる
定例屋のAPIをサポート、
 Socket API、USB、Blouetoothをさわれたり

YoutubeからDLNAをつかってテレビにつなげる?
今回からウェブストアで公開できるようになった

ネイティブアプリみたいなものがChromeさえインストールされてたら動く。

モバイルはどうするか
Cordova + plug-in
 (Fongapのオープンソース版?)

M29ターゲットでConsumer deploy可能に
for Android, iPhone

やるねこ0.0.6リリース

今回のリリースではウィジェットに8件表示されない時がある問題の修正を行いました。また、IS01のサポートを諦めました。その他、AdMobのSDKの更新を行いました。

すぐアップデートしなきゃといいつつ前回のリリースからちょうど1年ですね。なんですかね、これ。

https://play.google.com/store/apps/details?id=com.hironemu.yaruneko

rvmでRuby 2.0.0をMac OSX Lionに入れるときに

ちなみにbrewも使ってる場合です。
普通にインストールするとエラーになった。

$ rvm install 2.0.0

ここ(https://github.com/wayneeseguin/rvm/issues/1290)にあるようにするとインストールできるっぽいのでやってみる。

$ rvm install 2.0.0 --skip-openssl --with-opt-dir="`brew --prefix openssl`"

....省略
Error running 'make', please read /Users/hironemu/.rvm/log/ruby-2.0.0-p0/make.log
There has been an error while running make. Halting the installation.

だめぽ。ログをみてみるとなんかOpenSSLのディレクトリがないっぽい。

ld: warning: directory not found for option '-L/usr/local/Cellar/openssl/1.0.1c/lib'

brew --prefix openssl」の結果をみてみると確かに、/usr/local/Cellar/openssl/1.0.1cと表示される。どこからでてきたのこれ。ばぐなの?なおってるの?

https://github.com/mxcl/homebrew/issues/12571

とりあえず先にbrew installで最新のものを入れておく

$ brew install openssl

そしてもう一度Rubyのインストール

$ rvm install 2.0.0 --skip-openssl --with-opt-dir="`brew --prefix openssl`"

あれ、まだだめ。よく見たら違うところがエラー

/Users/hironemu/.rvm/src/ruby-2.0.0-p0/lib/fileutils.rb:111: [BUG] Stack consistency error (sp: 38, bp: 36)
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]

以下のサイトにCC=clangをつけろというのがあったのでやってみる。
http://stackoverflow.com/questions/15055457/error-while-installing-ruby2-with-rvm

$ CC=clang rvm install 2.0.0 --skip-openssl --with-opt-dir="`brew --prefix openssl`"                                                     ~
Installing Ruby from source to: /Users/hironemu/.rvm/rubies/ruby-2.0.0-p0, this may take a while depending on your cpu(s)...
ruby-2.0.0-p0 - #downloading ruby-2.0.0-p0, this may take a while depending on your connection...
ruby-2.0.0-p0 - #extracted to /Users/hironemu/.rvm/src/ruby-2.0.0-p0 (already extracted)
ruby-2.0.0-p0 - #configuring
ruby-2.0.0-p0 - #compiling
ruby-2.0.0-p0 - #installing 
Retrieving rubygems-2.0.0
######################################################################## 100.0%
Extracting rubygems-2.0.0 ...
Removing old Rubygems files...
Installing rubygems-2.0.0 for ruby-2.0.0-p0 ...
Installation of rubygems completed successfully.
Saving wrappers to '/Users/hironemu/.rvm/bin'.
ruby-2.0.0-p0 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
ruby-2.0.0-p0 - #importing default gemsets, this may take time ...
Install of ruby-2.0.0-p0 - #complete 

やったでけた。

確認

$ rvm use 2.0.0
Using /Users/hironemu/.rvm/gems/ruby-2.0.0-p0
$ ruby -v
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]

おけ。