2014年3月25日火曜日

Golang Cafe #22

3/23(日)に開催された「Golang Cafe #22」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、私の3名でした。

前半は、横山さんがGDG中国で使用するプロジェクターの検討会&萩野さんの質問タイムでした。

後半は、横山さんが作成されたOAuthのGoソースを「Twelve Go Best Practices」で学んだ成果を駆使して各自でエレガントに仕上げていくことになりました。

横山さんから簡単に処理の流れや解説をして頂き、いざ、ソースを見てみると...質・量ともに結構あり、結果、今回はソースの読み込みで終わってしまいました(^^;)

私は#18のOAuth2の回に参加できていない分、処理内容について理解しきれなかっため、関数化したりGoらしい記述に書き直したりして楽しんで行くことにしました。

横山さんや萩野さんのブログも是非ご覧下さい。


次回も引き続き同ソースの改善を行う会になるようです。

[2014.04.07] 横山さんと萩野さんのブログへのリンクを追加しました。

2014年3月22日土曜日

Golang Cafe #21

3/15(日)に開催された「Golang Cafe #21」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、初参加のTakeshi Yamasita さん、私の4名でした。

今回は「春の Google 勉強会 2014」へ参加する道中の「フェリーでGo」という形で開催されました。フェリーで約1時間、現地のカフェで約1時間半、「Twelve Go Best Practices(Go言語の12のベストプラクティス)」の25ページから最後まで読み進めました。

自作したAPI(関数やメソッド)内での同時実行の使用は避けましょう。

 Goでは、頭に"go "を付けて関数を呼び出すだけでその関数を同時実行できる特徴がありますが、関数を「普通に呼び出す」か「同時実行で呼び出す」かは呼び出し元の都合なので、関数内で同時実行するように実装されていると、その選択が出来なくなります。 

ゴルーチンとのやりとりにはチャンネルやチャンネル構造体を使いましょう。

 本来の見出し文は「状態を管理するためにゴルーチンを使いましょう」です。ゴルーチンによる状態遷移を制御する時はチャンネルを上手く使いましょう。28ページのチャンネルは長さゼロで生成されているため、同期をとるために使用しています。

ゴルーチンが絡んだため内容もやや難しくなり、また、長めのコードを読み解いて行くのにも時間がかかったため、フェリー内での読み進めはここで一旦終了となりました。

上陸後、会場近くのコーヒー屋さんで、再開されました。

長さを指定したチャンネルを使ってゴルーチンでのメモリリークを避けましょう。

 読み解くまでに時間がかかりました...(^^;)長さゼロのチャンネルへのアクセス中にラーが発生すると、チャンネルをブロックした状態(参照したまま)になるため、処理が終わってもガベージコレクションが効かない状態になります。そのため、長さを指定したチャネルを使うことでブロック状態を回避することができるようになります。

 この辺りは、ゴルーチンやチャンネル、はたまた、ゴルーチンの考えのもとになっているCSP(Communicating Sequential Processes)の動作や考え方を勉強して行かないと厳しいなぁ、と感じました。

別個に中止用のチャンネルを用意してゴルーチンでのメモリリークを避けましょう。

 空構造体「strunct{}」は初めてみました。別途、どこからもアクセスできないように空構造体でチャンネルを生成し、それを処理を中止させる時に使用することで、長さゼロのチャンネルを使ったゴルーチン処理でエラーが発生した際のメモリリークを回避できるようになります。

腹に落とし込むまでには何回も見直す必要がありますが、今回の資料は大変ためになりました!

詳細&技術な内容につきましては、横山さんや萩野さんのブログをご覧下さい。


次回(明日...^^;)は通常通りの開催(内容は未定)のようです。

P.S.山下さんも知的好奇心を満たすことができたようです!

2014年3月17日月曜日

春の Google 勉強会 2014

3/15(土)に開催されたGDG Shikoku様主催の「春の Google 勉強会 2014」に参加してきました。

今回は「Android」と「Go」の豪華二本立て!に加えて、さらに!講師としてグーグル株式会社 Google Developer Relations Japan 所属の荒木佑一さんと山口能迪さんが、それぞれAndroidとGoを直々に紹介して下さるという、貴重かつ贅沢な勉強会でした。

開催の告知が1週間前だったので、人が集まらないのでは?と少し心配していましたが、当日、勉強会には約20名の方々が、懇親会には約半数の方々が参加されていました。

当日のスケジュール


発表順が入れ替わりました。

16:00 - 16:40 「Android 開発 最新動向」(荒木さん)
16:40 - 16:50 休憩
16:50 - 17:35 「Goではじめる簡単Webアプリケーション」(山口さん)
17:40 - 18:30 懇親会への移動
18:30 -            GDG Shikoku 春のGoogle勉強会 懇親会

内容のご紹介(ダイジェスト)


Android 開発 最新動向

荒木さんは公の場で発表を行うのは今回が初めてだったそうです。
[Tips]:Android DevelopersサイトのURLは「http://d.android.com/」と短く書けます!

Android Studio

 機能やキーボードショートカットの紹介、など

・サポートライブラリー

 ActionBarCompat、など

Google Play Services

 Google Drive Android API、Google Play Game Services、Fused Location、Geofence、など

個人的にはAndroid Studioの安定性や導入タイミングなどが気になっていましたが、

  • ゲーム開発といったネイティブなものには、まだ厳しい。
  • ツールやアプリの開発には、そろそろ使い始められる時期。
  • でもまだ不安定であり、開発やリリースのサイクルを早くすることで対応。
    →前バージョンで作成したプロジェクトがコンパイルできなくなったりすることも。

という話を聞くことができました。もうしばらくは「イバラの道」を進むことになるようです(^^;)

Goではじめる簡単Webアプリケーション

会場にはGoを触った事がない方が多くいらっしゃいました。

・Goの概要説明

 Goの歴史、なぜGoが開発されたのか、Goが開発された目的、など

・標準のツールとパッケージ

 ツール:go fmt、godoc、など
 パッケージ:net/http、encoding/json、など

・ライブコーディング

 Hello, World → Hello, WWW → Hello, GAE
 # 順番にコードを書き換えて行かれました。

・情報源の紹介

 主要サイト(公式日本語チュートリアル、など)、メーリングリスト、など

ライブコーディングでは、Go特有の文法や記述を「気持ち悪いでしょう?」と表現されたり(^^;)コードをサジェスト機能なしで「ガシガシ」と書いて行かれたりと、山口さんがワイルドなGopher(=Go使い)を体現されていました。q@w@p

懇親会

一次会は「骨付鳥 一鶴」で親鳥&雛鳥にかぶりつきながら交流を深め合い、二次会では「手打ちうどん 鶴丸」でカレーうどんに舌鼓を打つなど、みんなで「うどん県高松市」を味わいました!


感想など


興味を持って参加された方にとっては「一粒で二度美味しい」勉強会だったと思います。

個人的には、宇野〜高松間のフェリー内で開催された「Golang Cafe #21(フェリーでGo)」にも参加したため「行き・現地・帰り」と文字通り「Go三昧」な一日となりました!

2014年3月14日金曜日

Golang Cafe #20

3/9(日)に開催された「Golang Cafe #20」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、私の3名でした。

今回は「Twelve Go Best Practices(Go言語の12のベストプラクティス)」の13ページの「Organizing your code」から読み進めました。

import文でパッケージを列挙する際は、グループ化して空行で区切って記述しましょう。

 本来の見出しは文は「重要なコードは最初に書きましょう」ですが、import文を空行でグループ化してgo fmtするとグループ単位でソートしてくれることに感動したので、つい...(^^;)

パッケージ名や関数名やメソッド名などのシグネチャーを正しく書きましょう。

 godocで出力されることを意識して、正しく書くようにしておきましょう。

命名は短めに。

 Javaを書いている方は、戸惑うかと(@o@)
 Goの設計思想の一つである「シンプルさ」から考えると納得できるのかも。

パッケージやコードやテストなど、適切に分けて書きましょう。

 手軽に試そうとすると、ついダラダラと記述してしまいがちですよね〜(^^;)
 ちなみに私はこの章で「doc.go」の存在を知りました。

再利用できそうな処理はパッケージ化しましょう。

 私がプログラミングする時は、こちらの「再利用レイヤー(App, AppParts, Generic)」を意識してモジュール化しています。

インターフェースを使って依存性を下げましょう。

 メソッドの引数を具体的な型で定義してしまうとテストケースが用意し辛くなる場合もあるので、インターフェースにして柔軟性を持たせておきましょう...ということなのですが、「具象」と「抽象」の採用判断、難しいですよね...

パッケージの独立性を保ちましょう。

 Goの場合、パッケージ名を1単語で表現しようとしている点で、自ずとカテゴリー化されるというか、複数の機能が一つのパッケージに含まれようとする曖昧さを取り除くことができるので、Goに入ってGoに従った書き方をすれば大丈夫のハズです。

個人的には、今回の部分を学習したことで、標準パッケージのドキュメントやソースを読みやすくなったと感じています。例えば、いろいろとABC順になっていることに気が付くことが出来ました。

詳細&技術な内容につきましては、横山さんや萩野さんのブログをご覧下さい。


次回は資料スライドの25ページからの予定&フェリーでGo〜 q@w@p 

[2014.03.19] 萩野さんのブログへのリンクを追加しました。

2014年3月7日金曜日

Golang Cafe #19

3/2(日)に開催された「Golang Cafe #19」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、私の3名でした。

Cafe中に時々「Goらしい書き方を知りたいよね」という話もあったりして、今回から「Twelve Go Best Practices(Go言語の12のベストプラクティス)」を読み進めて行くことになりました。
# 前回は不参加(T_T)だったので...詳しい経緯までは...(^^;)

関数やメソッドの先頭でエラー処理を行って、if文のネストを避けましょう。

 正常処理を書き進める派(?)の方には、最初、違和感があると思います。

可能な場合は処理を関数やメソッドにして重複する記述を避けましょう。

 他のプログラミング言語でも同じですね。同じような処理はまとめましょう。

型switch文を使って、型ごとに処理をしましょう。

 判断基準となる値は抽象的な型になります。Go言語だと「空interface(interface{})」ですね!

型switch文の型アサーションの結果を変数に格納する記述もあります。

 型アサーションした結果を、case文中の処理で使えるようになります。

「全て処理する」か「何も処理しない」

 Cafe中には記述内容から判断して「都度書き出すのではなくバッファリングして最後に書き出しましょう。」とつぶやいていましたが、これはトランザクションのACID特性の「Atomicity(原子性)」のことでしたね(^^;)

関数アダプター

 最初、何のことだかわからなっかのですが、萩野さんが「Javaだとこんな感じになりますよ」とサンプルを記述して下さったのを見て、デザインパターンの「Adapter」パターンの関数版だと理解できました。

詳細&技術な内容につきましては、横山さんや萩野さんのブログをご覧下さい。

次回は資料スライドの13ページの「Organizing your code」からの予定です。