Go言語:Goroutines

Goroutinesの話

goroutine (ゴルーチン)は、Goのランタイムに管理される軽量なスレッドです。

  • go 関数呼び出しで新しいスレッドで処理される。
    • プログラムは、スレッドの処理の終了を待つわけではない。
    • 新しいスレッドで処理が始まるのに(ノンブロックの状態で)遅延がある。
  • Channelsを使うと、簡単に同期的な処理が書ける。
    • 条件を明示せずに、同期を許可する、ということらしい。
    • Channelsの操作には、channel operator <-を用いる。
    • channel <- x でChannelsに値を送信、y := <- channelで受信し変数へ値を割り当てる。
  • Channelsの生成には、makeを用いる。
    • make( chan 型 )
    • 型以外の値を送信しようとすると、cannot use xxx (type xxxの型) as type 正しい型 in sendとしてコンパイルに失敗する。

書いてみる1

Goroutines:ベーシック

sample.goの出力

  • goroutineでの処理が遅れて実行される。
  • goroutineでない処理とは並行して処理が進む。
0 second
0 first
1 second
1 first
2 second
2 first
3 second
3 first
4 second
4 first

sample.nooutput.goの出力

  • なにも出力されない。
    • プログラムのほうが早く終了する、という理解で合ってる?

sample.sleep.goの出力

  • goの呼び出しの後にsleepを入れた。
  • goroutineでの処理が先に実行される。
    • たまたま、1ミリ秒以内でgoroutineの処理が先に始まった、という方が正しいかもだが。
0 first
0 second
1 first
1 second
2 first
2 second
3 first
3 second
4 first
4 second

書いてみる2

Goroutines:ポインタ

ポインタはgoroutineでないときと同じように振る舞うらしい。

出力

1 0 1
2 0 2
3 0 1
1 1 3
2 1 4
3 1 2
1 2 5
2 2 6
3 2 3
1 3 7
2 3 8
3 3 4
1 4 9
2 4 10
3 4 5
10

書いてみる3

  • ポインタで書くより明らかにわかりやすい。
  • 同期したいタイミングが明示できる。

Goroutines:Channels

invoke Channel A
1 0 1
2 0 2
1 1 2
2 1 4
1 2 3
2 2 6
1 3 4
2 3 8
1 4 5
2 4 10
5 10
invoke Channel B
3 0 3
3 1 6
3 2 9
3 3 12
3 4 15
4 0 4
4 1 8
4 2 12
4 3 16
4 4 20
15 20

Go言語:HTTPサーバーのコーディングをしてみる

↓のslideshareのコードを写経していく。

写経させていただきました。資料ありがとうございます!

とりあえずコーディング

HTTPサーバーの写経// http://www.slideshare.net/yasi_life/ ...

構成

  • GOPATH/src/server.go
    • サーバープログラム
  • GOPATH/views/view.html
    • 表示画面のテンプレート
  • GOPATH/views/edit.html
    • 編集画面のテンプレート

まだやっていないこと

  • セキュリティとか、全然考えてない。
  • セッションも何もない。
    • 相対パスでアクセスしているので、プログラムと関係ない変なファイルにアクセスできるかもしれない。
    • とか。
  • 保存失敗した時の処理をしていない。
    • 名前に/が含まれている場合に、このコードだとno such file or directoryが出る。
    • でもそのメッセージをユーザーに返していない。

思ったこと

  • 簡単なレベルの実装であれば、すごい簡単。
    • 提供されているパッケージが充実している印象。
  • ルーティングに関数を渡すのは読みやすい。
    • JavaScript勉強していた人がGo言語やるとか、いいかも。
    • JavaScriptでイベントドリブンな実装を中心にやっていた人が、か。

Go言語:HTTPサーバーの基本

HTTPサーバーの話

  • net/httpをimportしてちょろちょろするくらいで簡単にサーバーを立ち上げられる。
  • サーバーの処理はinterfaceで定義された関数に実装していく。
    • Handleでルーティング処理と、ルーティングさせるオブジェクトの設定。
    • ServeHTTPを実装することで、出力する内容を設定できる。
    • 直接関数を設定するなら、HandleFuncを使う。
    • ListenAndServeで、HTTPサーバーの起動。
  • 実装の内容
    • HandleHandleFuncに渡される引数はhttp.ResponseWriterhttp.Request
    • HandleHandleFuncListenAndServeよりも前に定義されているもののみ、サーバーに反映される。
  • 実装を進めれば、テンプレートも使用可能。
    • また後日。

Exercise

これ

簡単なHTTPサーバー

実行して、http://localhost:4000にアクセス。

  • レスポンスとして、各パスに適用した関数に書かれている文字列を返す。
  • プログラムを実行しているプロンプトの出力として、Servedという文字列と、http.Requestの内容が出力される。
    • リクエストの内容を取得するのも簡単そう。
  • ListenAndServeよりも後に書かれている/struct_outというAPIは実際にはアクセス出来ない。
    • net/http側の実装として404が返される。

このコンピュータ書がすごい!2015年版 の勝手なまとめ

このコンピュータ書がすごい!2015年版にいってきたので、勝手なまとめをします。何年かぶりの参加です。

19時30分スタート。(時間経過メモっておくと面白そうなので。。。)

(メモは、自分がメモりたかったものだけです。高橋さんや各出版社さんの表現から変わってるものもあると思いますが、ごめんなさい)

2014年トピック

技術書が2014年の年間で2000冊?くらいでているらしい。

イベントの内容からの個人まとめ

  • 統計・機械学習
  • チーム開発。
  • Java8。
  • AngularとかJS系のいろいろ。
  • ジョブスの漫画。
  • ピアソンがなくなって、本の出し直し。
  • 角川のasciiの技術書のブランドがdwangoに譲渡された。
  • 3Dプリンタを道具化。
  • Unity/cocos-2dx。
  • Swift
  • 関数型プログラミング

総合ランキング

5. アンダースタンディングコンピュテーション

計算理論について、rubyで説明されている。入門向け?

4. github実践入門

github(not git)の使い方。感想をpull requestで寄せることができる!笑

githuを使わせたい人は必読。

非エンジニアにgithubを使わせたいなら、Githubの教科書。

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

3. マスタリングTCP/IP入門編 第5版

2012年の本だけど、毎年ランクイン。息が長い。TCP/IPだったらこれ。

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

2. インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門

2013年の本だけど、2014年で1年間とおして売れた。

インフラエンジニアの人が設計についてまとめた本。

インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門

インフラ/ネットワークエンジニアのためのネットワーク技術&設計入門

1. リーダブルコード

一昨年も1位、去年も1位、ということで、3年連続1位。さすが。

著者の方からコメントを貰ってるらしい。ウェブサイト参照。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

時間経過

19:40。ここまで10分。

+リーダブルコード3連覇記念で3分。リーダブルコードは、毎月のランキングのどこかに必ずいる。

ここからは、2014年に出た本に限定。雑誌も極力省略。その他で注目テーマも。

月別ランキング 1月

過負荷に耐えるWebの作り方

AKBのウェブ投票システムを作った人の本。

過負荷に耐えるWebの作り方 ~国民的アイドルグループ選抜総選挙の舞台裏 (Software Design plus)

過負荷に耐えるWebの作り方 ~国民的アイドルグループ選抜総選挙の舞台裏 (Software Design plus)

JavaScriptで学ぶ関数型プログラミング

JSで、関数型っぽい書き方についての本。

JavaScriptで学ぶ関数型プログラミング

JavaScriptで学ぶ関数型プログラミング

Pythonによるデータ分析入門

データ分析を、Pythonのpandasの作者さんが、pandasを使って紹介している。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

説得とヤル気の科学

UI系の人が、行動心理学的な感じでまとめた本。

説得とヤル気の科学 ―最新心理学研究が解き明かす「その気にさせる」メカニズム

説得とヤル気の科学 ―最新心理学研究が解き明かす「その気にさせる」メカニズム

統計的学習の基礎

めちゃ分厚い、めちゃ高い本だけど、統計系の本として、がっつりしたのが出ました。

統計的学習の基礎 ―データマイニング・推論・予測―

統計的学習の基礎 ―データマイニング・推論・予測―

  • 作者: Trevor Hastie,Robert Tibshirani,Jerome Friedman,杉山将,井手剛,神嶌敏弘,栗田多喜夫,前田英作,井尻善久,岩田具治,金森敬文,兼村厚範,烏山昌幸,河原吉伸,木村昭悟,小西嘉典,酒井智弥,鈴木大慈,竹内一郎,玉木徹,出口大輔,冨岡亮太,波部斉,前田新一,持橋大地,山田誠
  • 出版社/メーカー: 共立出版
  • 発売日: 2014/06/25
  • メディア: 単行本
  • この商品を含むブログ (3件) を見る

大規模データのマイニング

大規模=配列100億規模のデータについて、効率的にデータマイニングするにはどうする?みたいなこと。教科書みたいな。

大規模データのマイニング

大規模データのマイニング

アジャイルデータサイエンス

サンプルがあるので、ズバッとやってみたい人向け。日本語版では、fluentdとかkibanaとかの紹介も。

アジャイルデータサイエンス ―スケーラブルに構築するビッグデータアプリケーション

アジャイルデータサイエンス ―スケーラブルに構築するビッグデータアプリケーション

時間経過

19:50。

月別ランキング 2月

Webエンジニアが知っておきたいインフラの基本

どのへんでトラブって、どのへんでチューニングするかとか、運用についてとか、の本。エンジニアでインフラ分からない人におすすめ。

プログラマのためのコードパズル

コードパズルとアルゴリズムのやーつー。CodeIQでやってたものの書籍化。

プログラマのためのコードパズル ~JavaScriptで挑むコードゴルフとアルゴリズム

プログラマのためのコードパズル ~JavaScriptで挑むコードゴルフとアルゴリズム

データ可視化実践入門

d3.jsを使いつつ、データ可視化についての方法論のまとめ。

エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)

エンジニアのための データ可視化[実践]入門 ~D3.jsによるWebの可視化 (Software Design plus)

d3.js徹底入門

d3.jsの使い方がっつり。

ユーザーエクスペリエンスの測定

UX測定しづらいけど、ちゃんと測定するためにがんばる方法。メトリクスに興味がある人向け。

ユーザーエクスペリエンスの測定 (情報デザインシリーズ)

ユーザーエクスペリエンスの測定 (情報デザインシリーズ)

Webで使える!SVGファーストガイド

SVGのみについてまとめられている超レアな本。

Webで使える!SVGファーストガイド

Webで使える!SVGファーストガイド

時間経過

20:03。

月別ランキング 3月

改訂4版 図解でよく分かる ネットワークの重要用語解説

改訂版。読みやすく見やすく、入門におすすめな感じっぽい。

データベースの限界性能を引き出す技術

Oracleの話が中心(?)だが、どのように性能を引き出していくか、という点でのまとめ本。

iOSアプリテスト自動化入門

アプリのテスト大変そうなイメージだけど、どうテスト書いて、どうCIまわすのか、というところの本。

iOSアプリ テスト自動化入門

iOSアプリ テスト自動化入門

入門コンピュータ科学

ストレージからなんやら、コンピュータサイエンスについて網羅したような本。興味ある方はぜひ。

入門 コンピュータ科学 ITを支える技術と理論の基礎知識

入門 コンピュータ科学 ITを支える技術と理論の基礎知識

エンジニアのためのフィードバック制御入門

キャッシュとかサーバーとか、フィードバック制御という視点からどうしてったらよいか、ということの本。着眼点おもしろい。

エンジニアのためのフィードバック制御入門

エンジニアのためのフィードバック制御入門

時間経過

20:15。15分押し。

月別ランキング 4月

Ruby on Rails4 アプリケーションプログラミング

Railsが初めてみたいな人も含めて、どう使っていくか、みたいな本。

Ruby on Rails 4 アプリケーションプログラミング

Ruby on Rails 4 アプリケーションプログラミング

オンラインジャッジではじめるC/C++プログラミング入門

オンラインジャッジというウェブサービスを使って、C/C++を勉強していく。

オンラインジャッジではじめるC/C++プログラミング入門

オンラインジャッジではじめるC/C++プログラミング入門

C/C++セキュアコーディング 第2版

C/C++バッファロー起こさないとかデータ壊さないとか、どのようにセキュアにコーディングするのかのまとめ。

C/C++セキュアコーディング 第2版

C/C++セキュアコーディング 第2版

時間経過

20:25。

月別ランキング 5月

アルゴリズムパズル

数学系のアルゴリズムで、パズルを解きながら覚えていく。

アルゴリズムパズル ―プログラマのための数学パズル入門

アルゴリズムパズル ―プログラマのための数学パズル入門

ハッカーの楽しみ

長い間すられていなかったけど、復活しました。

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか

  • 作者: ジュニア,ヘンリー・S.ウォーレン,Jr.,Henry S. Warren,滝沢徹,玉井浩,鈴木貢,赤池英夫,葛毅,藤波順久
  • 出版社/メーカー: エスアイビーアクセス
  • 発売日: 2004/09
  • メディア: 単行本
  • 購入: 35人 クリック: 732回
  • この商品を含むブログ (126件) を見る

ハイパフォーマンスブラウザネットワーキング

ウェブのパフォーマンスを稼ぐには、という視点で、レイヤーをまたいで紹介している本。役に立つ感じ。

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

OpenCVによる画像処理入門

OpenCVでの画像処理を紹介しながら、頼り過ぎ良くないということでOpenCVを使わない例も半分くらい書いている、教育的な本。

OpenCVによる画像処理入門 (KS情報科学専門書)

OpenCVによる画像処理入門 (KS情報科学専門書)

アカマイ

アカマイを知らないような人にも分かる感じ(?)で、アカマイがウェブの中でどんなことをしているのか、ということの本。

時間経過

20:39。

月別ランキング 6月

パーフェクト Ruby on Rails

中上級者でRails使ってちゃんと作っていくためには、みたいな本。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

Effective Ruby

Effective ○○のRuby板。中級者向けくらいな感じ。

Effective Ruby

Effective Ruby

絵で見てわかるシステムパフォーマンスの仕組み

絵で見てわかるシリーズの本。システムパフォーマンスに影響があるものが何でどうするのか、ということが書かれている。

絵で見てわかるシステムパフォーマンスの仕組み

絵で見てわかるシステムパフォーマンスの仕組み

世界で戦うプロダクトマネージャーになるための本

プロダクトマネージャーになるには?ということで、面接の受け答えもあります。

世界で闘うプロダクトマネジャーになるための本 ~トップIT企業のPMとして就職する方法~

世界で闘うプロダクトマネジャーになるための本 ~トップIT企業のPMとして就職する方法~

アイディアを組織に広めるための48のパターン

新技術を組織に持ち込むには、みたいなところで、抵抗とかどうするみないなこととか書かれている。

Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン

Fearless Change アジャイルに効く アイデアを組織に広めるための48のパターン

時間経過

20:54。25分押し。

月別ランキング 7月

戦略的データサイエンス入門

データマイニングの理論のエッセンスをいかにビジネスに落としこんでいくか。ニューヨーク大学の講義からの書籍化。

戦略的データサイエンス入門 ―ビジネスに活かすコンセプトとテクニック

戦略的データサイエンス入門 ―ビジネスに活かすコンセプトとテクニック

すごいErlangゆかいに学ぼう!

サーバーサイドでプログラミングが必要な人にとっての知識をErlangで説明した本。

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

リファクタリング 新装版

新装版で出し直し。中身も見なおして、Java7で書き直されて、おまけ付き。前のを持っている人にもおすすめ。

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

Linuxによる並行プログラミング入門

並行プログラミングについての簡単めに紹介。

Linuxによる並行プログラミング入門

Linuxによる並行プログラミング入門

時間経過

21:07

月別ランキング 8月

なんかいろいろ

時間経過

21:15

月別ランキング 9月

検索エンジン自作入門

実際に検索エンジンを作っている人が、仕組みと効率的なシステムをつくるための説明をしている本。

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏

実践 Selenium WebDriver

テストの自動化とか、いろいろまとまっています。

実践 Selenium WebDriver

実践 Selenium WebDriver

時間経過

21:20。(カンペ)時間がやばい。からの21:22。

月別ランキング 10月

Swift

熱血アセンブラ入門

表紙もすごいけど、内容もすごい。難しいことを考えずになんか色々やっていく感じ。アセンブラに親しむ本。

熱血!アセンブラ入門

熱血!アセンブラ入門

実践機械学習システム

Python機械学習をやってみる本。

実践 機械学習システム

実践 機械学習システム

時間経過

21:29。

月別ランキング 11月

関数プログラミング 珠玉のアルゴリズムデザイン

超難しいけど、難しい先に得るものがある。

関数プログラミング 珠玉のアルゴリズムデザイン

関数プログラミング 珠玉のアルゴリズムデザイン

角川インターネット講座

監修もすごいけど、著者もすごい。いっぱいでてる。

時間経過

21:35。(くらい。メモし損ねた。)

月別ランキング 12月

Rubyのしくみ Ruby Under a Microscope

コードというよりは、Rubyの挙動を紹介しつつ、中身を説明している。cruby以外にもjrubyとかも紹介。

Rubyのしくみ -Ruby Under a Microscope-

Rubyのしくみ -Ruby Under a Microscope-

システムテスト自動化 標準ガイド

自動化の技法ケーススタディ

システムテスト自動化 標準ガイド (CodeZine BOOKS)

システムテスト自動化 標準ガイド (CodeZine BOOKS)

  • 作者: Mark Fewster,Dorothy Graham,テスト自動化研究会,伊藤望,玉川紘子,長谷川孝二,きょん,鈴木一裕,太田健一郎,森龍二,近江久美子,永田敦,吉村好廣,板垣真太郎,浦山さつき,井芹洋輝,松木晋祐,長田学,早川隆治
  • 出版社/メーカー: 翔泳社
  • 発売日: 2014/12/16
  • メディア: 大型本
  • この商品を含むブログ (2件) を見る

Python言語によるプログラミングイントロダクション

MITでの教科書?Python2で書かれている。

Python言語によるプログラミングイントロダクション: 世界標準MIT教科書

Python言語によるプログラミングイントロダクション: 世界標準MIT教科書

時間経過

21:39。

終了

21:45 お疲れ様でした。ありがとうございました!

個人的すぎるメモ:読んでみたい本

そういえば、Go言語の本は全然なかったなぁ

Go言語:iota

interfaceを理解しようと調べていると、なぜかちょいちょいiotaを使った例が出てくるので、まずはiotaについて調べる。

Go言語の日本語サイトの説明によると

Go言語での定数の列挙にはiota列挙子を使います。iotaは式の一部となって、かつその式は暗黙的に繰り返すことができるので値の複雑なセットも簡単に作成することができます。

とのこと。

実際にどんな振る舞いをするか。

iota

0
1
2
3
0
2
4
6
8
10
12
14
1
2
4
8

ちなみに、説明の引用元では定数ということが書いてあったので、関数内で使ってみる(コードのコメントアウト部分)

# command-line-arguments
./sample.go:56: undefined: iota

ということで使えない。

Go言語:メソッド定義

メソッドの話

  • Go言語にはクラスはない。
  • 代わりに、構造体にメソッドを定義することで、同様のことが可能。
  • 構造体以外にも、任意の型に定義することも可能。
    • 他のパッケージの構造体へのメソッド定義は不可。
    • 基本型への直接のメソッド定義は不可。
  • メソッド定義する際のレシーバが、ポインタか値かで、振る舞いが異なる。
    • 値を呼び出すして演算するのみであれば、違いはない。(パターンによるかもしれないけど)
    • 値をフィールドにセットするような演算の場合、結果が異なる。
      • 値のレシーバーにセットしても、結果が反映されない。

試してみた。

構造体へのメソッド定義

よくわかっていないこと

interfaceの概念はわかるけど、Go言語での使いどころがいまいちわかっていない。もう少し勉強!

Go言語:switch

switchの話。

  • ifステートメントと同じで、条件式にカッコは不要。
  • ifステートメントと同じで、変数のスコープを持つ。
  • swtichステートメントの条件式は省略することが可能。
    • rubyのcase文と同じような書き方が可能。
  • switch caseには、数値以外に、文字列などの値や、論理演算、関数の実行などを記述可能。
    • swtich caseの評価は順番に、該当するものが存在するまで続く。
    • 該当するものがあれば、評価が終わるので、全ては実行されない。
  • Go言語のswitchは、他の言語のそれと違って、自動的にbreakされる。
    • この挙動も、rubyのcase文と同じ。
  • 自動的にbreakされたくない場合は、caseの処理の最後に、fallthroughを記述する。
    • fallthroughは、次のswitch caseは評価されずに、そのcaseの中の処理が実行される。
  • 該当するswitch caseが存在しない場合は、defaultに飛ぶ。
    • defaultはなくても良い。

試してみた

switchの挙動

patternA
zero called
one called
1
patternB
zero called
one called
1
2
  • patternAでは、自動的にbreakされていることがわかる。
  • patternBで、fallthroughの次のswitch caseの評価がされずに、その中の処理が実行されていることがわかる。