OmniAICreator/Qiita-1.07M huggingface dataset:
時系列解析の定常性入門

-   参考書は時系列分析の定番本 沖本先生の[経済・ファイナンスデータの計量時系列分析](http://www.asakura.co.jp/books/isbn/978-4-254-12792-8/).

定常性について理解する
======================

定常性とは?
-----------

-   定常性(stationarity)は時系列モデルの最も基本的な概念.
-   定常性の仮定のもとで基礎的な時系列モデルを構築し、そのモデルを基に非定常なモデルが構築される.
-   定常性とは、[同時分布](https://physnotes.jp/stat/jpd/)や基本統計量の時間不変性に関するものである.
-   何を不変とするかによって, 弱定常性(weak stationary)と強定常性(strong stationary)に分類される.

弱定常性の定義
--------------

> 定義1.1(弱定常性) 任意のtとkに対して,
> $$
> E(y\_t) = \\mu \\\\
> Cov(y\_t,y\_{t-k}) = E\[(y\_t - \\mu)(y\_{t-k} - \\mu)\] = \\gamma\_k 
> $$
>  が成立する場合, 過程は弱定常(weak stationary)といわれる.

-   定義から, 自己共分散は時点によらず, 時間差kにのみ依存する.
-   したがって, 任意のkに対して, *γ*<sub>*k*</sub> = *γ*<sub>−*k*</sub> の関係が成り立つ
-   自己共分散だけでなく, 自己相関も時点には依存せず, 時間差kにのみ依存する.

$$
Corr(y\_t,y\_{t-k}) = \\frac{Cov(y\_t,y\_t-k)}{\\sqrt{var(y\_t)}\\sqrt{var(y\_{t-k})}}= \\frac{\\gamma\_k}{\\gamma\_0} = \\rho\_k
$$

-   上の式の分母の分散は, 時系列での分散の意味を考えると, kによらず一定であることに注意
-   自己共分散の式において, k=0とおいたときの値が, その時系列の分散を表す
-   *ρ*<sub>*k*</sub> = *ρ*<sub>−*k*</sub>も成り立つ

### 日常用語で説明すると

-   定常性とは要するに..
    -   平均に回帰し, 長期的にはどちらに動くか予測できる
    -   自己相関は指数的に減衰し、ショックは一時的な影響
    -   トレンドはもたない
-   イメージ的に...
    -   ある値の周りをなんとなく同じような振れ方で振動しているようなデータ
    -   任意の区間を取って, フーリエ変換しても同じ結果が得られる, みたいなデータ
-   逆に, ちょっとずつある周波数成分が大きくなっていく, みたいなデータは非定常

### 素朴な疑問

-   弱定常性は有限時間のなかでどうやって判定するのだろうか？
-   期待値が一定という条件ってどういう意味なんだ？データは一回きりなのに.
-   適当な期間を区切って, 窓をスライドさせて, スライドさせても平均が不変, とするということか？
-   例えば"あ〜〜"とか発声をスペクトルアナライザでみて, それが一定以内の変動なら定常, とか
-   どれくらいの長さの窓なら妥当なのだろうか..声とかならある程度物理的な時間があるかな
-   弱定常ってことは, 時系列を構成する個々の波成分の周期が時間変動しない, 安定的ってこと?
-   イメージ的にはリアルタイムFFTをして, ずっとスペクトルが変わらない状態って感じ？
-   でもそのFFTの時間スパンはどれくらいだと妥当なのか？よくわからん。

定常なデータと非定常なデータの具体例
------------------------------------

数式だけではよくわからない。具体例をみてイメージをつかもう。
例示は理解の試金石!

### 定常過程の例

-   ホワイトノイズ
-   歴代内閣支持率(とても定常にみえないが、検定すると定常となる)
-   日経平均株価の1階差分

### 非定常過程の例

-   ランダムウォーク
-   株価
-   GDP

### 弱定常過程の代表例 -ホワイトノイズ-

> 定義1.4(ホワイトノイズ) すべての時点tにおいて
> $$
> E(\\epsilon\_t) = 0\\\\
> \\gamma\_k = E(\\epsilon\_t \\epsilon\_{t-k}) = 
> \\begin{cases}
> \\sigma^2 & k = 0 \\\\
> 0 & k \\neq 0
> \\end{cases}
> $$
>  が成立するとき、*ϵ*<sub>*t*</sub>はホワイトノイズ(white noise)と呼ばれる.

-   すべての時点において期待値が0である.
-   分散は一定値である.
-   自己相関をもたない.
-   正規過程に従うホワイトノイズは, 正規ホワイトノイズと呼ばれる.
-   正規過程とは？まだよくわからん。。
-   パワースペクトルでみると, どの周波数も同じ強度になる
-   ホワイトの由来は, 可視領域の広い範囲をまんべんなく含んだ光が白色であることによる

![](https://i.gyazo.com/093d5448cc3019ed979cf0673feacf57.png)

-   フーリエ変換してスペクトルを確認してみる

![](https://i.gyazo.com/5d55456632c2dda8408d598d56d2ccee.png)

-   確かに, すべてのスペクトルの強度がほぼ一定になっていることがわかる.

弱定常性について補足
--------------------

-   経済・ファイナンスの分野では, 単に定常性というと, 弱定常性を指すことが多い.
-   [条件付き期待値や条件付き分散](http://mathtrain.jp/condexpectation)は時変的でもよいことに注意.
-   実際の生の時系列データの殆どは定常性がないが, 差分をとったり, トレンドや季節性を取り除くことで, 定常過程に変換することが多い.
KANJAVA PARTY 2017 !!!に参加しました

[KANJAVA PARTY 2017 !!!](https://kanjava.connpass.com/event/56152/)に参加したので、完全な主観（当たり前）にて感想を書きました。

## B1: 「Spring Security にできること・できないこと」 opengl_8080さん
[発表資料](http://qiita.com/opengl-8080/items/6dc37f8b77abb5ae1642)
### まとめ
IPAの「安全なウェブサイトの作り方」に沿ったセキュリティ関連の話と言うことで、JJUGCCC 2017の[非機能要件とSpring Boot](https://speakerdeck.com/garbagetown/jjug-ccc-2017-spring-ccc-g1)と合わせて読むとより勉強になるかなと思った。
今まで、CSRFやクリックジャッキングは言葉だけで理解していたが、実際にデモを見ることで、再現方法をみてより理解できた。
Spring Securityはほんとに優秀。新規のプロジェクトでSpringを扱うなら、使うほうのが良い。
もちろん、単純に使うだけではなく責務を知った上で、その責務外は自分で解決するべき。
ということで、Securityでも出来ないことも書いてあったのがとても良かった。

## B2: 「JUnit5の味見」 山根英次さん
[発表資料](https://speakerdeck.com/eyamane/junit5falsewei-jian)
### まとめ
不安定部分が多く、JUnit5を実際に使うにはまだ早いかなとは思った。
ただし、JUnit4で不便だった部分に対する便利APIが増えるということで、安定してからつかいたい。特にAssertionの種類が増えたのは便利。Csvあたりも今使っているプロジェクトに使えそう。
資料としては、色々まとめてあるのでわからなくなったら見てみよう。
ただし、今後変更ある可能性が高いようで一部という感じ（Assertionに関しては変更少ないような気がしている）。

## B3: 「ストリーム処理ことはじめ ～ Akka Streams と RxJava」 にしかわささきさん
### まとめ
現在使っているStreamの動きと、Akka Streamとの違いが詳しく説明された。
Akka Streamでのデータの運びは理解しておくと何かに使えるかもしれない。
またSource → Flow → Sinkの考えがKafka Streamでも似ているらしいので覚えておいて損はない。
Rxについては話がなかった。以上。

## B4: 「Microservicesアーキテクチャに取り組んでみえたこと」 藤井善隆さん
[発表資料](https://speakerdeck.com/yoshiyoshifujii/microservices-architectureniqu-rizu-ndemietakoto)
### まとめ
今回一番面白い話を聞けた。
マイクロサービスとDDDの組み合わせが自分にとっては納得ができた。特にサービス一つを一つのコンテキストとして捉え、コンテキストマップを扱って実装を進めるあたり現場で使っていきたい。
サービスごとのチーム運営にも触れられていて、マイクロサービス化するにあたっての知見も得られた。
実装点でも、SPAを利用して各サービスにAPI通信するのは考えていなかったので、この考えを使わせてもらいたい。

## A5: 「DevLOVE関西からギルドワークスへの越境(仮)」 中村 洋さん
[発表資料](https://speakerdeck.com/yohhatu/devloveguan-xi-karakirutowakusuhefalseyue-jing?utm_content=buffer5e469&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)
### まとめ
DevLOVEについての話と、それを自分の姿勢について話してもらった。
実際に自分がハンドリングすることで、自分がいちばん勉強できるというのは確かに。フィードバックが一番得られるのもその通りだと思った。
「越境するために使う技術は常に磨いておく（準備しておく）必要がある。そうじゃないといざという時に周りに理解してもらえない。
ただし、やるやる詐欺はよくない。信用されなくなってしまう」
この部分は今後勉強していく上で心においておく必要があると感じた。

## A6: 「オフショア開発にも応用可能！？ リモートチームの道具箱」 粕谷大輔さん
[発表資料](https://speakerdeck.com/daiksy/kanjava-remote)
### まとめ
結論、リモートワークのむずかしい。
会社としても、優秀な人材を確保するためにリモートワークを導入しているところが多い。しかし、現場と家などのコミュニケーションを円滑にすすめるのが難しいということで、その際にやったことをまとめて話してもらった。
会社ではチャットツールをよく使うが、感情表現は大げさなほうが良いらしい。フラットな文章では不機嫌に取られることが多い。またテレビ会議でも同様に身振り手振りをしたほうが円滑に進むらしい。ちょっとやってみる。
結局のところ、リモートも使い所であり、実際に会うという機会を何度か設けないと行けないというので、コミュニケーションってホント難しい。
ios, androidのローカライズファイルを共通管理して幸せになった話


# 前書き
とあるプロジェクトでiosアプリを先行して作っていたが、一旦プロジェクトが落ち着き、運用方法の改善を考えた時に、**ローカライズファイルの管理方法がイケてないよね**という話が出たので、なにかイケてる方法を探すことになった。

# 現状の管理方法
## 流れ
![current.png](https://qiita-image-store.s3.amazonaws.com/0/175242/38396e7c-1187-5ccb-d794-2c862c917ebb.png)

## 行っていた作業
- すべてのメッセージおよび文言をExcelで管理（Sketchからすべて列挙）
- そのExcelをConfluenceで管理
- メッセージや文言を更新のたびにExcelを編集しConfluenceにアップロードする
- Slackで更新したことを共有する
- エンジニアはExcelから１つずつStringsファイルにコピーする

### 結果
**無駄な作業**が多くイケてない、それに伴って追加忘れや抜けが発生していた。

## 原因
### 何がイケてないのか？
- 管理のために**Confluenceを介してファイルのやりとり**を行う必要がある
- Confluenceにアップデート後、メンバーに**Slackでアップデートを伝える**
- Excelからstringファイルへの書き出しが**手動**であること

# アプローチ
## 改善の前提条件
今回は改善するにあたり、上司から**誰でも使える方法**を考案することを命ぜられた。
(特にデザイナーやPMなどコードを書かない人向けに)

そのため、当初は以下のようなXliffを用いた管理方法も検討したが、、、

- [Xcode 6で導入されたXLIFFによる国際化フローの使いドコロ](http://qiita.com/mono0926/items/ceda2500fe60e26e1c7c)
- [Xcode6でいろいろローカライズしよう](http://qiita.com/kenmaz/items/5effb6c1f6df999e1f2a)

使わないことになった。そもそもXliffは

- ローカライズ（翻訳）することがメインで、管理するものではない
- ios、androidを程よく一括で管理できるツールがなかった（探せばあるのかも）
- デザイナーや何も知らない人が使うことを考えると、もう少しハードルを下げたい

上記の思惑から、以下のようになった。

## 流れ
![new.png](https://qiita-image-store.s3.amazonaws.com/0/175242/557fdbf9-af36-ff0e-8b81-5e51baf8073e.png)

## 作業
- メッセージおよび文言のSpreadSheetで管理
- スプレッドシートを直接Stringファイルに書き出す（GoogleAppsScriptを用いて）

### 結果
- 今まで行っていた**Excelのアップロード・ダウンロード作業を廃止**できた
- 全員で１つのシートを管理するため、**上書きなどによる漏れを防げる**
- Slackでのアップロート通知が必要なくなった（共有という意味では必要だが）
- stringファイルへの**書き出しが自動化**できた（GoogleAppsScriptで生成コードを書く必要があります）

## 参考
こちらの方法は以下の記事を大いに参考にさせていただきました。
GoogleAppsScriptの使い方など、具体的な方法も載っていますのでぜひご覧ください。
[iOS と Androidで共通のローカライズファイルを作ろう！](http://dev.classmethod.jp/smartphone/ios-android-common-localize/)

ちなみに上記の記事だと、管理している文言およびメッセージをダウンロードするコードまでは記載がないので、自作したコードを[Github](https://github.com/crane-hiromu/googleAppScript_ToConvertLocalizedString)にあげて置きます。

## 番外編
スプレッドシートでローカライズする際に、とりあえず簡易的に行いたい方は以下を使ってみてください。
[Googleスプレッドシートで多言語に翻訳](http://qiita.com/holly_nano/items/291e91003b4e5b4464d5)

# あとがき
意外にもiosとandroidで言語ファイルを共通管理していない方が多いようで、、、
（みんなネットに公開していないだけ？検索しても全然出てこないので、、）

react nativeとか流行ってますし、そもそも作るものが共通化されていて、ある程度sourceも共通化されているなんてことも最近は増えてきたからでしょうかねぇ、、。
Railsでneo4j(v8.0以上)を使うときにmigrationでハマる

昔neo4jをRailsで使うときにmigrationが必要だった覚えがなかったのだが、いつの間にか必要になったのかもしれない。[^1]

## 環境
- Rails `5.1.2.rc1`
- Neo4j `3.2.1`
- neo4jrb `8.1.2`
- zsh `5.2(x86_64-apple-darwin16.0)`

## Migrationをしないとエラーがでる
たぶん、モデルを手動で `app/models` 以下に作って起動すると下記のようなエラーがでると思う。

```zsh
❯ bin/rails c                                                     
Running via Spring preloader in process 5942
Loading development environment (Rails 5.1.2.rc1)
irb(main):001:0> Writer.count
ETHON: Libcurl initialized
ETHON: performed EASY effective_url=http://localhost:7474/db/data/schema/constraint response_code=200 return_code=ok total_time=0.007093
 HTTP REQUEST: 14ms GET http://localhost:7474/db/data/schema/constraint (0 bytes)
ETHON: performed EASY effective_url=http://localhost:7474/db/data/schema/index response_code=200 return_code=ok total_time=0.001799
 HTTP REQUEST: 3ms GET http://localhost:7474/db/data/schema/index (0 bytes)
Neo4j::DeprecatedSchemaDefinitionError:           Some schema elements were defined by the model (which is no longer supported), but they do not exist in the database.  Run the following to create them if you haven't already:

rake neo4j:generate_schema_migration[constraint,Writer,uuid]
rake neo4j:generate_schema_migration[index,Writer,name]

And then run `rake neo4j:migrate`

(zshell users may need to escape the brackets)

        from (irb):1
irb(main):002:0> 
```

**なるほどなるほど。マイグレーションすればいいのね!**

意気揚々と
`> bin/rails neo4j:generate_schema_migration[constraint,Writer,uuid]`
を叩くと、

```zsh
> bin/rails neo4j:generate_schema_migration[constraint,Writer,uuid] 
zsh: no matches found: neo4j:generate_schema_migration[constraint,Writer,uuid]
```

**え？** zshがエラー吐いてるぞ？？(重要)
ここで、まだ原因を把握してなかったので、neo4jのmigrationのドキュメントをあさっていました。


いや〜、やっぱりv8で仕様がちょっと変わったっぽいけど、やっぱりmigrationは必要そうだな〜。

と、30分ぐらい悩んでいたのですが、もう1度コマンドを叩くと原因が分かりました。
ちゃんと説明がありましたね！
> **(zshell users may need to escape the brackets)**

>意訳(**zshユーザーはブラケットのエスケープが必要かもしれない**)

それやん！

## 解決策

`bin/rails neo4j:generate_schema_migration\[constraint,Writer,uuid\]`

これで通りました。

(bashに変更して該当コマンドを叩くのも成功しました)

## 余談
### migrationの中身
uuidのUnique制約を付けているようです。

```rb
class ForceCreateWriterUuidConstraint < Neo4j::Migrations::Base
  def up
    add_constraint :Writer, :uuid, force: true
  end

  def down
    drop_constraint :Writer, :uuid
  end
end
```

### 記事を書いてから、全く同じことでハマっている人がいたことに気づいてしまった・・・
http://qiita.com/hkengo/items/a05ccd344b61290dc6dc


[^1]: 昔アルバイトでコードを書いてるときに、railsとneo4jを使っていたのだが、ひょっとしたら先輩社員が全部migrationを済ませてくれてたから、必要がなかっただけかもしれない。今回初めてセットアップから、新規プロジェクトとしてやるので、必要になってるだけかも。
homebrew caskでDocker for Macインストール

# 前提
homebrew, homebrew caskはインストール済みであること

# 環境
OS:macOS Sierra(10.12.5)

# インストール

以下のコマンドを実行する。
```
brew cask install docker
```

# 確認

以下の様にコマンドを実行しインストールされていることを確認する。
コマンドでDockerを起動していますが、起動は任意で構いません。

```
open /Application/Docker.app
docker --version
docker-machine --version
docker-compose --version
```
WP REST API で記事を取得時のアイキャッチサイズ指定

WP REST API でアイキャッチ付きの新着記事を取得表示する際の、アイキャッチサイズの指定（忘備録）


アイキャッチ画像サイズの指定

['_embedded']['wp:featuredmedia'][0]['media_details']['sizes']['thumbnail']['source_url']

上記の['thumbnail']を

['medium']や['full']など書き換えればサイズ変更が可能。
mastodonでv1.4系にアップデートするときにassets:precompileでコケる問題に対処する

# docker-compose run --rm web rails assets:precompileでerrorが起きる問題があったのでメモしておきます。
主にさくらのVPSにて、標準インストール/CentOS7を選択しているときに高確率で出くわすと思います。
原因は、さくらのVPSが悪いんじゃなくて、dockerの設定とファイルフォーマットの問題でした。

## 以下のようなエラーが出て、プリコンパイルできない
An unexpected error occurred: "ENOTEMPTY: directory not empty, rmdir 'hoge'
ファイルが消せないのか?
はい、消せません。
### なぜか?
Centos7のファイルシステムがxfsだ!!
```
df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vda3      xfs      193G  6.2G  177G   4% /
```

### 根本的な原因はこちらです(ありがとうございます!)
[引用]
OverlayFSは上側に重ねるファイルシステムがファイルタイプを返すd_typeをサポートしていないと使えません。d_typeをサポートしないファイルシステムでOverlayするとwhiteoutファイルをDT_CHRと判定できないため、消したはずのファイル(やディレクトリ)が中途半端に見えてしまいます。
http://qiita.com/amatsus/items/aa2a58b0d5800312b6fa

## つまり、overlay+xfs(デフォルトの設定)の組み合わせはトラブル起こすのでやめましょう。
dockerインストール時にdockerのデバイスドライバを「devicemapper」にする設定をすること、
"production systems, you must use direct-lvm mode"プロダクションモードではdirect-lvmを使ってね、とコメントありますんで、こことても重要です!!
https://docs.docker.com/engine/installation/linux/centos/#install-from-a-package
http://docs.docker.jp/engine/userguide/storagedriver/selectadriver.html
https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#configure-direct-lvm-mode-for-production

今回は、手っ取り早く立ち上げるために、標準OSインストールしてフォーマットの確認を忘れていたのと、/etc/docker/daemon.jsonの設定を忘れてたことが原因です。

# 対処方法
で、どうしたかというと、ごにょごにょするのめんどくさかったので、マストドンのディレクトリごと別サーバに退避して、サーバを上記の点に注意しながら再構築して、アップデートしました。
PyMC3で、[illegal hardware instruction  python] エラー


# 現象
anoacondaでPyMCをインストールした後、import しようとしたら以下のエラー

```py3
conda install -c conda-forge pymc3
python
>>> import pymc3
[1]    3244 illegal hardware instruction  python
```

# 解決策
インストール方法が、pipかanacondaかは関係ありませんでした。
自分の場合h,pythonのバージョンを3.6.0から3.4に下げたところ、直りました。

pyenvとanacondaを同時に利用しておいたのですが、バージョンの管理が煩雑になっていたため、pyevnの利用はやめようと思います
http://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7

# 環境
MacBook Air (13-inch, Early 2014)
macOS Sierra 10.12.5
conda 4.3.22
pip 9.0.1
python 3.6
Makefile 既存のファイルの有無で変数を設定する

make でターゲットを実行する際に、ファイルの有無によって変数を切り替えるサンプルです。
サンプル内では「ファイル」を "A.txt" としています。

```Makefile
filename = A.txt
fileexists = $(shell ls | grep ${filename})
ifeq (${fileexists}, ${filename})
	message = "${filename} found"
else
	message = "${filename} not found"
endif

run:
	@echo ${message}

touch:
	@touch ${filename}

clean:
	@\rm -f ${filename}

.PHONY: run touch clean help
```

ターゲットは以下のとおりです。

| ターゲット |      実行する内容       |
|:--------:|:-----------------------|
| run      | ファイルA.txtの有無を表示 |
| touch    | ファイルA.txt を作る      |
| clean    | ファイルA.txt を削除する  |



実行結果です。
```
$ make run
A.txt not found
$ make touch
$ make run
A.txt found
```
A.txt の有無に応じて設定されたmessage が表示されています。


ここで、一度、クリーンします。
```
$ make clean
```
make のターゲットを２つ続けて実行します。touch して run します。
```
$ make touch run
A.txt not found
```
touch した結果は反映されず、A.txtが存在しない場合の結果になりました。
つまり、make 実行時点でのファイルの有無によって判断されるのは要注意です。


最後に、はまったポイントを１つだけ紹介します。
２行目を以下のように記述していて、期待した動作になりませんでした。
``` Makefile（２行目の失敗記述例）
fileexists = $(shell ls | grep $filename)
```
違いは、末尾の $**{** filename **}** に{}(波括弧?)が無く、$filename になっているところです。
これが必要な理由までは分かりません… 
動くようにできればOKということで m(_ _)m
Raspberry Pi 3 Model BにRASPBIAN JESSIE WITH PIXELをインストール

#◆Raspberry Pi 3 Model BにRASPBIAN JESSIE WITH PIXELをインストール
##１．準備するもの
　（１）10,000円くらい
　（１）Raspberry Pi 3 Model B一式
　　　・SDカード（アダプタ）、HDMIケーブル、電源ケーブル、
　　　　USBキーボード/マウス、HDMI端子のついたモニター
　　　・今回、Amazonで<a href="https://www.amazon.co.jp/kksmart-Raspberry-Model-%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4-%E3%82%B3%E3%83%B3%E3%83%97%E3%83%AA%E3%83%BC%E3%83%88%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%AD%E3%83%83%E3%83%88/dp/B01G8EZSCQ/ref=sr_1_7?ie=UTF8&qid=1498366878&sr=8-7&keywords=Raspberry+Pi">こちら</a>の一式がセットになったキットを購入した。
　（２）MacBook
　　　・OSイメージを書き込むため必要（Windowsでも問題なし）
##2.Raspberry Pi 3 Model Bの組み立て
　（１）ボードにヒートシンクを貼る
　（２）ボードと保護ケースをネジで固定する
　（３）ボードを保護ケースに収納する
##3.Raspberry Pi 3 Model BへOSイメージコピー
　（１）OSイメージのダウンロードして解凍しておく
　　　・<a href="https://www.raspberrypi.org/downloads/raspbian/" target="_blank">こちら</a>のページからRASPBIAN JESSIE WITH PIXELをダウンロード
　　　・1.5GBくらいあり、20分程度かかります
　　　・解凍後のファイル名：2017-06-21-raspbian-jessie.img
　（２）SDカードのフォーマット
　　　・消去を選択し、SDカードをフォーマット
　　　・MS-DOS(FAT)を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118007/7426e16c-2731-4dff-95a0-a074c911b6c0.png)
　（３）diskutil listでデバイス名を確認
　　　・/dev/disk2がSDカードであることが確認できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118007/d42fb51f-2aa4-4657-f6de-e3e10ff58256.png)
　（４）SDカードをアンマウント(diskutil unmountDisk /dev/disk2)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118007/adce3fd8-8add-e586-3386-e3567a5fbb4e.png)
　（５）ddコメンドでOSイメージをSDカードへ書き込み
　　　・sudo dd if=2017-06-21-raspbian-jessie.img of=/dev/rdisk2 bs=1m
　　　・デバイス名にrを付けて/dev/rdisk3/にすると10倍速く焼ける
　　　・bs=1mオプションを付けると10倍速く焼ける
　　　・ddコマンドは実行中にCtrl + Tを押すと現在の進捗を表示可能
　　　　→10分程度、気長に待つ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118007/40b1e8fb-9ae3-f77b-0c0f-6aaf4e687ccc.png)
　　　・書き込み完了後、ディスクユーティリティから確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118007/1ab250d4-e5be-3a92-b32a-55ad820627cd.png)
##4.動作確認
　（１）OSをコピーしたSDカードをMacから外し、Raspberry Piに挿す
　（２）Raspberry PiをHDMI端子のついたモニターと接続し電源起動
　（３）正常にOSが起動してくればOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118007/be491eb6-fa05-77ca-1e57-9e72a196c7f9.png)
　（４）USBキーボードがなかったため、残念ながらここまでで終了。
【cocos2d-x】パーティクルの反転表示

![20170625.jpg](https://qiita-image-store.s3.amazonaws.com/0/110583/7134c969-4c20-9b93-9dd6-9200384dcabc.jpeg)

cocos2d-xでこんなゲーム作ってる時にパーティクルに「plist」ファイルを使って作っていました。（「.plist」はWEBページ「particle2dx.com」などで作成できるパーティクルの設定ファイル）

途中で

「パーティクルの反転の仕方ってどうしたらいいんだっけか？plistファイルをもう一個作るとかはあんまり好きじゃないな」

とか思って試行錯誤したのですが、よーくリファレンス読んだら

『"setAngle"でパーティクルの発射角度を変えるだけ』

と思ったより単純な話でした。

```
//パーティクルの生成（「particle2dx.com」などで作っておいたxxxx.plistを使用する前提）
mParticle = ParticleSystemQuad::create("particles/xxxx.plist");
//パーティクルの設置
mStage->addChild(mParticle , 100, 100);
//パーティクルの反転
mParticle ->setAngle(180.0f);
//パーティクル停止
mParticle ->stopSystem();

…

//パーティクル開始
mParticle ->resetSystem();

```

小ネタですが、一応、ParticleSystemQuadのメソッドでパーティクルの設定はほとんどいじれますよー、ということで。

ここにきて、本家のドキュメントや、オープンソースだったらその中身をみて確認することもまた大事だと思わされますね。
英語は必須です。
英語が読めないくらいで立ち止まるのは僕らには許されません。

ちなみに僕は英会話はヘタクソです。
babunでパッケージアップデート後特定のコマンドが動かなくなったら

babunでupdate.batを利用しパッケージアップデート実施後、特定のコマンドを実行すると、以下のようなエラーメッセージが出る場合がある。

```
C:/Users/**/.babun/cygwin/bin/perl.exe: error while loading shared libraries: ?: cannot open shared object file: No such file or directory
```

このエラーメッセージからだと、なんのモジュールが読み込むことができないのかさっぱりわからない。
ついでに重要なコマンドが使えなくなるので大変困る。

調べてみると全く同じ現象に対応しているブログがあった。
https://blog.darkedges.com/2016/11/20/perl-exe-error-while-loading-shared-libraries-cannot-ed-object-file-no-such-file-or-directory/

上記の記事によると`cygcheck`コマンドで読み込めないモジュールを特定して、そのモジュールのパッケージを再インストールするとうまく動くらしい。

```
$ cygcheck perl                                                                          ~
Found: C:\Users\**\.babun\cygwin\bin\perl.exe
C:\Users\**\.babun\cygwin\bin\perl.exe
  C:\Users\**\.babun\cygwin\bin\cygperl5_22.dll
    C:\Users\**\.babun\cygwin\bin\cygwin1.dll
      C:\WINDOWS\system32\KERNEL32.dll
        C:\WINDOWS\system32\ntdll.dll
        C:\WINDOWS\system32\KERNELBASE.dll
    C:\Users\**\.babun\cygwin\bin\cyggcc_s-1.dll
    C:\Users\**\.babun\cygwin\bin\cygssp-0.dll
cygcheck: track_down: could not find cygcrypt-0.dll
```

自分の環境でもどうやら`cygcrypt`が読み込めないらしい。ブログの通り、`crypt`パッケージを入れなおしたら無事動いた。

```
pact remove libcrypt0 crypt
pact install crypt
```
[d3.js]誰でも使ってみよう①

D3とは、データ　ドリブン　ドキュメントの略です。

簡単にいうとjavascriptのライブラリです。
グラフ等の行がが行えます。

多少は待っているので、ひとつづつ独学で内容を説明していきたいと思います。

初心者用なので、わかっている方は見る必要がございません。

まず、使うときは、ファイル上に以下を記載するだけです。
(html上に記述するときです。)

```ruby:test.html
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>

```

D3.js - 日本語ドキュメント
http://ja.d3js.node.ws/
Summpyを使ってみた

# Summpyの使い方

## 参考
https://github.com/recruit-tech/summpy

## 環境
|項目| 説明 |
|----|----|
| OS | macOS sierra |
| パッケージ管理 | homebrew |
| pythonバージョン管理 | pyenv & virtualenv |
| python バージョン | 2.7.13 |



## インストール・設定

```
$ brew install mecab
$ brew install mecab-ipadic
$ pyenv virtualenv 2.7.13 new_2.7.13
$ pyenv local 2.7.13/envs/new_2.7.13
$ pip install summpy
$ pip install mecab-python
```

## 実行方法

サーバ起動

```
$ python -m summpy.server -h 127.0.0.1 -p 8080
```

サーバ起動後、別の端末を起動し、以下のコマンドを実行

```
$ curl http://127.0.0.1:8080/summarize\?sent_limit\=3\&text\=本日はお日柄もよく、二人の新しい門出を祝うにふさわしい…
```
iOS同士でBLE通信を行う

# Introduction
iOS同士でBLE通信をする際のサンプルコードがあったが、その発火順番とその意味がよくわからなかったので、自分の理解を高めるためにもメモとして記すことにした。

## 用語の定義
### Central
* 接続する側
* Advertiseを受けたあとに接続をし、あとはよしなにしてくれる

### Peripheral
* 接続される側。
* Advertiseをする側。

### ServiceUUID
* 簡単にいうと、サービスの識別子のUUID
* 複数のCharacteristicsUUDを持つことができる

### CharacteristicUUID
* Slack（ServiceUUID）に対するチャンネル（CharacteristicUUID）みたいなもの
* 具体的な通信内容を含む。

## 具体的な手順
### 設定
* Peripheralサイド
  * `CBPeripheralManager` を継承
  * `peripheralManager`を初期化
  * `peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager)` が発火するので、`peripheral.state` が `.poweredOn` の時に `peripheralManager` に `serviceUUID`
 と `characteristicUUID` をセットする。
* Centralサイド
  * `CBCentralManager` と `CBPeripheralManager` を継承
  * `centralManager` を初期化
  * `centralManagerDidUpdateState(_ central: CBCentralManager)` が発火するので、`central.state` が `.poweredOn` の時に `scanForPeripherals(withServices serviceUUIDs: [CBUUID]?, options: [String : Any]? = nil)` を使い、advertiseを受信する。

## 発火順番
### Peripheral アドバタイズの開始
* 設定が終わると`peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?)` が発火する。
* エラーがない場合、`PeripheralManager.startAdvertising(_ advertisementData: [String : Any]?)` を呼び周囲にアドバタイズを開始する

### Central 対象ServiceUUIDがあるか調べる
* advertiserを受けると、`centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber)`
が発火する。
* その後、 `CBPeripheral.discoverServices(_ serviceUUIDs: [CBUUID]?)`を呼び、Central側が探しているサービスがあるのかどうかを調べる

### Central 対象CharacteristicUUIDがあるか調べる
* 対象 `ServiceUUID` がアドバタイズされていた場合、`CBPeripheralDelegate.peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?)` が発火する。
* `service` 内に狙っている `characteristicUUID` があるのかを調べるために、 `CBPeripheral.discoverCharacteristics(_ characteristicUUIDs: [CBUUID]?, for service: CBService)` を呼ぶ。

### Central Characteristicからデータを読み取るリクエストを飛ばす
* 対象characteristicがあった場合 `peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?)` が発火する。
* `CBPeripheral.readValue(for characteristic: CBCharacteristic)`を用いてデータの読み取りをリクエストする。

### Peripheral レスポンスするデータを作成し、Centralに渡す
* リクエストを受けると `peripheralManager:(CBPeripheralManager *)peripheral didReceiveReadRequest:(CBATTRequest *)request` が発火する。
* `request.value` のデータを変えて、`CBPeripheralManager.respond(to request: CBATTRequest, withResult result: CBATTError.Code)` でデータを送り返す

### Central データを読み取る
* データが送られてくると、`peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?)` が発火する。
* `characteristic.value` が `Data` 形式になっているので、適切な形に解析する。

以上。
Random Forest

Random Forest
===

いつも通り、機械学習やその他色々について得た知識を
復習and記事作成の練習and個人の備忘録としてまとめていきますよ！

今回は、前回説明した「教師あり学習　分類」のアルゴリズムの一つ、
"Random Forest"について書いていきたいと思います！

⚠︎※※注意※※⚠︎  

・出来るだけ専門知識のあまりない人に対して、分かりやすく書くことを目標にしています。
　そのため、厳密に言うと間違っている部分があると思いますがご容赦ください。

・また、ネットで調べたレベルの知識がほとんどなので、
　"厳密に言うと"レベルではなく間違っている箇所があるかもしれません。。
　その場合は非常に申し訳ないです。指摘していただけると幸いです！

##### 参考サイト

[【Hivemall入門】RandomForestで毒キノコ推定モデルを作る](http://yebisupress.dac.co.jp/2015/12/01/randomforest-mushroom/)

##### 前回までの記事

・[機械学習について](http://qiita.com/AwaJ/items/950953a9c20f391e72cf)
・[教師あり学習　〜回帰〜](http://qiita.com/AwaJ/items/78de8b4738e87a57addd)
・[教師あり学習　〜分類〜](http://qiita.com/AwaJ/items/b769a5461e33ea8437a5)

決定木
---
"Random Forest"の"Forest"は、そのままの意味で"森"を表します。
"森"ということは、"木"の集まりなわけです。

その"木"が"決定木"と呼ばれるものです。

まずはこの決定木について説明します！

![決定木.png](https://qiita-image-store.s3.amazonaws.com/0/185346/defb6b31-f4d4-1cf2-123a-11944add0e3e.png)
[決定木 [wikipedia](https://ja.wikipedia.org/wiki/%E6%B1%BA%E5%AE%9A%E6%9C%A8)より]

従属変数＝目的変数　です。

画像では、ゴルフをするかしないかを予測する時の決定木になっていますね。
（上司の気まぐれでゴルフをするかどうかが決まるので予測したい、とかでしょうか？笑）

今までゴルフが開催された日のデータを、まずは天気という観点から見てみると、
例えばくもりの日には100%行われています。
なので、次の予定日の天気が曇りの場合、高い確率で開催されるであろうことが予測できます。

このように、予測したい目的変数に対して、説明変数一つの観点から見て分岐させていったものが"決定木"です。

ジニ係数
---
ではその分岐させる説明変数はどのようにして決めているのでしょうか？

先ほどの図でいくと、一番最初の分岐が"強風かどうか"では駄目だったのでしょうか？
また、湿度で分岐させる時"70%"というのはどのようにして決めたらいいのでしょうか？

それを決めるのが、"ジニ係数"と呼ばれるものです。

ジニ係数は格差を定量的に表すことの出来る値です。
所得格差を表す時によく使われるみたいですね。

<img width="300" alt="スクリーンショット 2017-06-25 5.09.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/51ce0c56-ba47-2ab2-873a-1ff0c91725fe.png">

このようなAさん〜Dさんがいるグループでは、月収が10万~57万まで存在するので、
所得格差は大きく、ジニ係数も大きくなります。

ですが、このグループを、
「AさんとBさん」、「CさんとDさん」というような、"30歳"を基準に二つのグループに分けると、

<img width="870" alt="スクリーンショット 2017-06-25 5.17.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/185346/b7f20444-9202-7500-3b7d-774cbad0a7d1.png">

というように、ジニ係数が小さくなります。

決定木では、このように、格差が小さくなるような条件を取り出すことで作られます。

ジニ係数以外にも、エントロピーやカイ二乗統計量などが用いられることもあります。


アンサンブル
---

ジニ係数を元に、天気を第一分岐とする決定木が作られたわけですが、
もしかしたら、"前日が飲み会だったか"という変数で切られた決定木のほうが有効かもしれません。

"Random Forest"は　"森"ということで、決定木は一つだけでなく大量に作られます。

そうしていくと、ある決定木では「ゴルフをする」という結論がなされ、
他の決定木では「ゴルフをしない」という結論がなされることもあるかもしれません。

その時に多数決をとって、予測を確定するのが"アンサンブル"という手法です。

100個決定木を作って70個が「ゴルフをする」という結論になったなら、
そのモデル全体での予測としては、「ゴルフをする」という予測になるわけです。

ランダムなサンプリング
---

ジニ係数とアンサンブルの話を聞いて、「おや？」と思った方がいるかもしれません。

「ジニ係数を元に決定木を作成するなら、何個決定木を作ろうとも同じ決定木が出来上がるのでは？」

その通りです。
同じデータと同じ条件で決定木を作っても意味はありません。

そこで使われるのがランダムなサンプリングです。
"Random Forest"の"Random"の部分ですね！

ここでのランダムなサンプリングには二種類あって、

・学習データから重複を許してN組のサンプル集合を抽出
・説明変数をM個の中からm個抽出

というものです。
そうして、多種多様なデータセットを作ることで、
違う決定木を大量に作ることができ、アンサンブルが効いてくる、というわけです。

まとめ
---
Random Forest とは

1. 学習データから重複を許してランダムに複数組のサンプル集合を抽出
2. 各組に対して説明変数もランダムに抽出
3. ジニ係数を計算し、決定木を作成
4. 予測時は各決定木の結果でアンサンブルに推定

となります！

あとがき
---
初めてアルゴリズムの中身を説明しましたがどうだったでしょうか？？

分かりやすく書けているといいのですが、、説明って難しい。

次は教師なし学習について書きたいと思います。

ここまで読んでいただき、ありがとうございました！
SEOのためのURL設計とApache設定

Webサイトを構築するときにURL構造をどのように整えれば良いかは最も難しい問題の一つである。<a href="http://static.googleusercontent.com/media/www.google.co.jp/ja/jp/intl/ja/webmasters/docs/search-engine-optimization-starter-guide-ja.pdf">グーグルの検索エンジン最適化スターターガイド</a>によると、トップページを基準として自然な階層構造を作ろう、URLの末端を削除した時に上位のディレクトリにきちんとアクセスできるようにしようなどと書かれている。例えば動物のサイトを作ることを考えると一階層目、即ちトップページが動物全般、そこから鳥類、哺乳類、爬虫類、両生類とカテゴリ分けをして第二階層を形成し、哺乳類からサル、犬、猫とカテゴリ分けして第三階層を形成する。URL構造としては下記のようになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86922/600d183d-f342-2772-64b1-b83e0dd2004e.png)
こうするとカテゴリ分けされ秩序立っているために、どこにどのような記事があるかが理解しやすく、またURLがユーザの手によって削られたとしても上位概念のページが表示され分かりやすい。別のメリットもある。Googleの検索エンジンはschema.orgという構造化データの記述仕様をサポートしており、その仕様に従いパン屑リストを検索結果のスニペットに表示することができる。例えば猫で検索してcat.htmlが検索エンジンの検索結果画面に表示された場合には、TOP >> 哺乳類 >> 猫　とディレクトリ構造が表示され、サイトのどこにアクセスしているのかが一目でわかり、クリック率の上昇にも寄与する。(興味があれば https://developers.google.com/search/docs/data-types/breadcrumbs を参考に)。このパン屑リストも階層構造でサイトを作成しているからこそ成せる技である。
尚、ここでのファイルシステム上の各Pathは次のようになっている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86922/5633fb61-ca42-1c42-8d87-ddbb33210a3d.png)
index.htmlはデフォルトドキュメントのため、animal.com/birds/index.htmlと指定しなくともアクセスする事ができる。(より具体的にはDirectoryIndex index.htmlとapacheに記述されている。) ただし、animal.com/birds/とanimal.com/birds/index.htmlは別URLとGoogleからは認識され、リンクポピュラリティが分散するため

```
RewriteRule ^/index.html$ / [R=301,L]
RewriteRule ^/(.*)/index.html$ /$1 [R=301,L]
```
などと記述してどちらかに統一しておくと良い。同様にwww.animal.comとanimal.comも別物とみなされるため、両方ともアクセスできるようにしている場合は片方をリダイレクトして揃える事が望ましい。

ここまでは良いのだが、このanimal.comには拡張性がない事に気付く。新しく哺乳類にクジラの記事を追加しようとwhale.htmlを追加する事は簡単にできるのだが、猫以下にシャム猫を追加しようとsiamese.htmlを作ろうとするとどうだろうか？今までのcat.htmlを/cat/に変えなければならないだろう。ところがcat.htmlが既に検索インデックスに登録されており、他からのリンクも張られているような状況だと折角の被リンクを失うために簡単には変更する事ができない。Apacheで301リダイレクトを設定してcat.htmlを/cat/へリダイレクトする事も可能であるが、毎回同じような状況になる度にApacheの設定をし直すのも効率が悪い。サイト拡張でこのような事態になるのならば最初から.htmlでアクセスさせるのはやめた方が良い。という事でmod_rewriteモジュールを用い、Apacheで次のように設定してみた。

```
    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ $1.html [L]
```

説明をすると%{REQUEST_FILENAME}は<a href="http://httpd.apache.org/docs/current/mod/mod_rewrite.html">apache.org</a>に説明があるようにファイルシステムのFull Pathを指す。%{DOCUMENT_ROOT}はVirtualHostを使用している時だけ必要になる。!-dはディレクトリが存在しない事を示す。この条件に当てはまる場合に/example/のURLでのアクセスを/example.htmlのファイルシステム上でのPathにマッピングする。
上記の例を使うと、animal.com/cat/でアクセスしてファイルシステム上に/cat/ディレクトリが存在しなければ、/cat.htmlを探すようになる。
最終的なApacheの設定は次のようになった。

```
RewriteEngine On
RewriteRule ^/index.html$ / [R=301,L]
RewriteRule ^/(.*)/index.html$ /$1 [R=301,L]
RewriteRule ^/(.*).html /$1/ [R=301,L]

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1.html [L]
```

また、最終的なURLの構造は次のようなる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86922/e053d874-64cb-324d-86d4-78efe469c6f8.png)

これにより拡張性が担保され、サイト拡大時にも適切な構造を保つ事ができる。
実践的な場で使える高精度画像分類ニューラルネットワークのコスパの良い利用

この記事は、自身のブログ、[Data Science Struggle](http://marubon-ds.blogspot.jp)を翻訳したものになる。  


#概略
今日では畳み込みニューラルネットワークは画像分類に対する最適解の一つとして認められてきている。画像の絡む様々な分野で使用されるようになっており、深層学習を学習する際のモチベーションの一つとなっているだろう。 
とはいえ、畳み込みニューラルネットワークはいくつかのルールを持っている。  

* 大量の画像を要する（タスクによってはそうでもないが）
* 学習に非常に時間がかかる
* 目標達成のための良いモデルを作るために地道で牛歩とも言えるようなステップを踏んでいくこともしばしば
* 実験と失敗を素早く回すためにハイスペック環境が必要

もちろん、畳み込みニューラルネットワークを試すことだけが目的であればライブラリから使用できるフリーデータが使えるわけだし、その手のフリーデータは様々な人が既に実験を行なっているためある程度うまくいくネットワーク情報を簡単に入手することが可能だ。問題になるのは、実際に仕事やプライベートで、設定された問題を実践的に解決していく際の畳み込みニューラルネットワークの利用だ。  
上記のルールは見た目以上に重たく目の前に立ちふさがることになる。 
そこで、Inception-v3とfine tuneの組み合わせで上記の問題を解決し、畳み込みニューラルネットワークと***ライトに***付き合っていくことで実践的な場での利用に役立てたい。 

#詳細
Inception-v3とは画像分類を行うためのモデルの一つだ。大規模なネットワークで相当量の画像により訓練済みであり、フリーで公開されているため、比較的簡単に試すことができる。fine tuneとは既にパラメーターの確定したニューラルネットを新規のデータに対応させる仕組みのことだ。 

#Inception-v3
Inception-v3は上で書いたように画像分類を行うためのモデルの一つであり、フリーで公開されている。 
おそらくはハイスペック環境で試行錯誤の下で時間をかけて作成されたネットワークだ。 

#Fine tune
どんなにInception-v3が画像分類において素晴らしいモデルであったとしても、それは、現在自分たちが対面している画像データで訓練されたものではなく、そのラベルも一致しないため、基本的に問題解決にそのままで役立てるのは難しいだろう。 
fine tuneはこの問題を解決してくれる。fine tuneとは、既にパラメーターを確定させたニューラルネットワークのラストの方の層のみを、別のデータで訓練し直し、実質的に、既存モデルの大部分と別データで訓練した新しいレイヤーの組み合わせでモデルを焼き直す仕組みだ。 
畳み込みニューラルネットワークの畳み込み層は画像から特徴を際立たせるためのものだが、そこには一種の普遍性がある。ゆえにネットワークとパラメーターの大部分は使いまわすことができ、ラストの方のレイヤーだけを新規データで対応させれば良い。 
この方法により、学習において確定させる必要のあるパラメータの数は劇的に減り、時間、必要な環境スペック、データ量を節約することができる。 

#実践
Inception-v3のfine tuneを試すのは非常に簡単だ。 

```bash
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
./configure
bazel build -c opt --copt=-mavx tensorflow/examples/image_retraining:retrain
bazel-bin/tensorflow/examples/image_retraining/retrain --image_dir IMGDIR
```

上記のコードでtensorflowの獲得、fine tune実行のためのビルド、fine tuneの実行までなされている。'IMGDIR'はネットワークのレイヤーを書き換えるために使用する自分が用意した画像のディレクトリになる。上記実行の結果であるファイルは/tmpにデフォルトで吐き出される。 

```python
import tensorflow as tf
import numpy as np

with tf.gfile.FastGFile('output_graph.pb', 'rb') as f:
	graph = tf.GraphDef()
	graph.ParseFromString(f.read())
	tf.import_graph_def(graph, name='')

with open('output_labels.txt', 'rb') as f:
	lines = f.readlines()
	labels = [str(w).replace("\n", "") for w in lines] 

with tf.Session() as sess:
		image_data = tf.gfile.FastGFile('pug.jpg', 'rb').read()
		softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
		prediction_outcome = sess.run(softmax_tensor, {'DecodeJpeg/contents:0': image_data})

		# delete empty dimension
		prediction_outcome = np.squeeze(prediction_outcome)

		label = {}

		for node_id in range(len(labels)):
			label_name = labels[node_id]
			# labels
			score = '{:.10f}'.format(prediction_outcome[node_id])
			label.update({label_name: score})
		result = {
			'scores': label
		}
		print(result)
```
output_graph.pbとoutput_labels.txtがモデルファイルだ。変数'result'が予測結果となっている。  

#まとめ
畳み込みニューラルネットワークのような、時間、物量の面で制約を持つ仕組みを実践的な場で使用していくのは難しい場面が多くある。 
fine tuneのような仕組みをうまく使って、重い仕組みをライトに使っていくことでどんどん実践的な場での問題解決に役立てていきたい。
Chromebookで開発するときは全画面モードにしよう


Chromebookでcroshを使ったり、Cloud9などのクラウドIDEを使って開発したりする際、Chrome側のキーボードショートカットが優先されてしまい、bashやVimのショートカットが利用できないシーンが多々ある。
特に困るのが[Ctrl + w]の同時押し。bashでは前の単語を削除、vimdiffでは隣のペインに移動するときのコマンドだが、なんとChromeでは**現在のタブを閉じて**しまう。

この問題の解決策が長らく分からずずっと困っていたのだが、最近になって

_**全画面モードにすればアプリケーション側のショートカットキーが優先される**_

ということが分かった。何で今まで気づかなかったんだ…

## 他OSでのChromeブラウザでは？
Windowsのみ試した。**閉じられてしまう**。
最近のChromebookのみ対応しているらしい。

## 追記

いま流行りの[Coder](https://coder.com)とかでも同様っぽいです。
`ウオアアアアアアついクセでCtrl+Wでタブ閉じようとしてブラウザのタブが閉じられたチクショオオオオオオオオ`みたいな方は是非お試しください！
Cloudant NoSQL DBへのデータインポート

Cloudant NoSQL DBへのデータの格納は、Cloudantダッシュボードからでも出来るが、１件１件入力しないとならないので手間がかかる。
csvなどからインポートすることは出来ないだろうか？
Cloudantダッシュボードからインポートをする方法がなかったのでネットで調べてみたら、[それらしき投稿](https://apiguy.tokyo/tag/cloudant/)を見つけた。
少しわかりにくかったので、もう少し詳細に書いておこうと思う。

---

インポートの手順は、こんな感じ。

1. インポートデータを準備。

1. CloudFoundryサービスのCloudantの場合
2.1. curlで、APIにデータを送信。

1. IAMサービスのCloudantの場合
3.1. curlで、APIにトークン取得コマンドの送信。
3.2. curlで、APIにデータを送信。

JSONのお作法とか、コマンドのお作法とかいろいろあるのでその辺を詳しく解説する。

#下準備
- curlを使うので、Windowsマシンなら[curlのサイト](https://curl.haxx.se/)でcurlをダウンロードしてくる。
- CloudantDBの資格情報の「url」と、IAMサービスのCloudantの場合「apikey」を調べる。
[ここが役立つ](https://qiita.com/Cheap-Engineer/items/22234978ff2de8aa14e7#cloudant%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E8%B3%87%E6%A0%BC%E6%83%85%E5%A0%B1%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B)

#インポートデータの準備
インポートするデータはJSONで用意する。以下の例の初めの３行、後ろの２行は必ず必要となる。
３行目の　"["　から後ろの２行目の "]"　の間に書かれたオブジェクトが１オブジェクト１ドキュメントとしてDBに格納されていく。以下の例だと２ドキュメントがDBに格納される。
データに全角文字を含めることは可能だが、**文字コードは「UTF-8」**とする必要がある。

```hoge.json
{
 "type": "docs",
 "docs": [
  { "item1": "hogehoge",  "item2": "あいうえお"},
  { "item1": "hoge1234",  "item2": "かきくけこ"}
 ]
}
```
#CloudFoundryサービスのCloudantの場合
##データを送信
作ったデータをAPIに送信する。
curlは作ったデータのファイルがあるディレクトリで実行する。

**書式**
`curl -d @<ファイル名> <CloudantDBサービスの資格情報のurl>/<DB名>/_bulk_docs -H "Content-Type:application/json"`

**例**
`curl -d @data_utf8.json https://userid1234:password5678@hoge-bluemix.cloudant.com/hoge_db/_bulk_docs -H "Content-Type:application/json"`

#IAMサービスのCloudantの場合
IAMサービスの場合、トークンを取得して、そのトークンを使ってデータを送信する。

##トークン取得コマンドの送信
トークン取得のコマンドをAPI送信する。

**書式**
実際には改行は入れず、一行にする。

```
curl -k -X POST --header "Content-Type: application/x-www-form-urlencoded"
 --header "Accept: application/json"
 --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey"
 --data-urlencode "apikey=<資格情報のapikeyの文字列（４０文字ほどある）>"
 "https://iam.bluemix.net/identity/token"
```

**例**

```
curl -k -X POST --header "Content-Type: application/x-www-form-urlencoded"
 --header "Accept: application/json"
 --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey"
 --data-urlencode "apikey=WRa....aWRw..9i"
 "https://iam.bluemix.net/identity/token"
```


##データを送信
作ったデータをAPIに送信する。
curlは作ったデータのファイルがあるディレクトリで実行する。

**書式**
実際には改行は入れず、一行にする。

```
curl --header "Authorization: Bearer <取得したtoken（１１００文字ほどある）>"
 --header "Accept: application/json"
 -d @<ファイル名>
 <CloudantDBサービスの資格情報のurl>/<DB名>/_bulk_docs
 -H "Content-Type:application/json"
```

**例**

```
curl --header "Authorization: Bearer WQiOiIy...eyJraWQiOiIyMDE3MT"
 --header "Accept: application/json"
 -d @data_utf8.json
 https://userid1234:password5678@hoge-bluemix.cloudant.com/hoge_db/_bulk_docs
 -H "Content-Type:application/json"
```

#おまけ
あくまでもcsvにこだわる人は、以下のサイトでcsvからJSONに変換できるので参考までに。
作成したJSONはそのままでは使えない。上記の例の初めの３行と最後の２行を付け加えることを忘れずに。

[あいぺんてっくさんのサイト](http://utils.ipentec.com/JsonConvert/CsvToJSon.aspx)

#参考

- [それらしき投稿](https://apiguy.tokyo/tag/cloudant/)
- [IAM対応されたCloudant NoSQL DBをcurlで操作する](https://qiita.com/Ra1nmaker/items/3b20e233049f778def47)
Dapperを理解する際に役立ったまとめ

業務でDapperを使う機会が増えた。理解する際に役立ったまとめを紹介します。

- ADO.NETとORMとMicro-ORM －dapper dot netを使ってみた : https://www.slideshare.net/kiyokura/adonetormmicro-orm-dapper-dot-net

Dapper(Micro ORM)を使う目的を分かりやすく紹介。

- StackExchange/Dapper : https://github.com/StackExchange/Dapper

Repository。出来ることを簡潔に紹介。

- Dapper Tutorial : http://dapper-tutorial.net/dapper

Dapperで出来ることを簡単な例と一緒に、非常にコンパクトに紹介。
ページ左のAPI一覧が便利。

- DapperのQueryMutilpeを使って結合テーブルの分割マッピングをしてみる : http://qiita.com/NetSeed/items/7e0e25757080e0259416

他のまとめでは「`QueryMultiple` は複数のSQLを1度に実行するために使います」と書いてあることが多いが、こんな使い方もあるんですね。

- Dapperについてまとめてみた: http://sweets-junkie.hatenablog.com/entry/2014/03/07/010004

日本語で、できることを最低限紹介。英語が苦手な方に。
MonoBehaviourを継承していないクラスでStartCoroutineを使う


Unityの公式TutorialのEndless Runnerにありました．


```csharp
using UnityEngine;
using System.Collections;

/// <summary>
/// This class allows us to start Coroutines from non-Monobehaviour scripts
/// Create a GameObject it will use to launch the coroutine on
/// </summary>
public class CoroutineHandler : MonoBehaviour
{
    static protected CoroutineHandler m_Instance;
    static public CoroutineHandler instance
    {
        get
        {
            if(m_Instance == null)
            {
                GameObject o = new GameObject("CoroutineHandler");
                DontDestroyOnLoad(o);
                m_Instance = o.AddComponent<CoroutineHandler>();
            }

            return m_Instance;
        }
    }

    public void OnDisable()
    {
        if(m_Instance)
            Destroy(m_Instance.gameObject);
    }

    static public Coroutine StartStaticCoroutine(IEnumerator coroutine)
    {
        return instance.StartCoroutine(coroutine);
    }
}
```

# サンプル
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// コルーチンを使うクラス
public class SampleClass
{
    public void Test()
    {
        // 使い方の例
        CoroutineHandler.StartStaticCoroutine(DebugCoroutine("test"));
    }

    // コルーチン
    IEnumerator DebugCoroutine(string t)
    {
        yield return new WaitForSeconds(2f);
        Debug.Log(t);
    }
}

// 呼び出す用
public class CoroutineSample : MonoBehaviour
{
    private void Start()
    {
        var sample = new SampleClass();
        sample.Test();
    }
}

```
Lua版 ゼロから作るDeep Learning その８［損失関数］


過去記事
--
[Lua版 ゼロから作るDeep Learning その１[パーセプトロンの実装]](http://qiita.com/Kazuki-Nakamae/items/16c82b5ac8a85d4adee3)
[Lua版 ゼロから作るDeep Learning その２［活性化関数］](http://qiita.com/Kazuki-Nakamae/items/5199447a54642620139a)
[Lua版 ゼロから作るDeep Learning その３［３層ニューラルネットワークの実装］](http://qiita.com/Kazuki-Nakamae/items/57c2977d0a9a38bdf6b8)
[Lua版 ゼロから作るDeep Learning その４［ソフトマックス関数の実装］]
(http://qiita.com/Kazuki-Nakamae/items/20e53a02a8b759583d31)
[Lua版 ゼロから作るDeep Learning その５［MNIST画像の表示］](http://qiita.com/Kazuki-Nakamae/items/6373443510f94a67e910)
[Lua版 ゼロから作るDeep Learning その5.5［pklファイルをLua Torchで使えるようにする］](http://qiita.com/Kazuki-Nakamae/items/b56c3d23fc21fdc260b0)
[Lua版 ゼロから作るDeep Learning その６［ニューラルネットワークの推論処理］](http://qiita.com/Kazuki-Nakamae/items/4a8198ec56c8a9658bd3)
[Lua版 ゼロから作るDeep Learning その７［バッチ処理］](http://qiita.com/Kazuki-Nakamae/items/3900c1f4e23a2ffdd48d)



損失関数
--
　今回は原書４章の損失関数を実装します。　
　
　スクリプトは以下のようになります。

```lua:lossfunc.lua
---２乗和誤差算出関数
-- テンソル同士の２乗和誤差(∑(yi-ti)^2)/2を求める
-- @param y 入力１、今回はNNが出力する確率リスト {Type:Tensor}
-- @param t 入力２、今回は正解ラベルリスト {Type:ByteTensor}
-- @return ２乗和誤差 {Type:number}
function mean_squared_error(y, t)
    return ( y:double() - t:double() ):pow(2):sum() * 0.5
end

local t = torch.Tensor({0,0,1,0,0,0,0,0,0,0})
local y = torch.Tensor({0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0})
print(mean_squared_error(y,t))
y = torch.Tensor({0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.5, 0.0})
print(mean_squared_error(y,t))


---交差エントロピー誤差算出関数
-- テンソル同士の交差エントロピー誤差(-∑tilogyi)を求める
-- @param y 入力１、今回はNNが出力する確率リスト {Type:Tensor}
-- @param t 入力２、今回は正解ラベルリスト {Type:ByteTensor}
-- @return 交差エントロピー誤差 {Type:number}
function cross_entropy_error(y, t)
    local delta = 1e-7
    return -torch.cmul(t:double(), ( y:double() + delta ):log() ):sum()
end

local t = torch.Tensor({0,0,1,0,0,0,0,0,0,0})
local y = torch.Tensor({0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0})
print(cross_entropy_error(y,t))
y = torch.Tensor({0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.5, 0.0})
print(cross_entropy_error(y,t))
```
```bash:出力結果
$ th lossfunc.lua
0.0975	
0.7225	
0.51082545709934	
2.3025840929945	
```


　特につまづくところもないかと思います。
　

おわりに
--

　今回は以上です。

　次回は交差エントロピー誤差をバッチ処理に対応させましょう。
　
　ありがとうございました。
Visual Basic でC#のインクリメントを使用する。

##Visual Basicでインクリメントを使用する場面
Visual BasicでプログラミングをしているとC#でいうインクリメント(i++)を使用したい場合がある。例えば配列をクラスに変換したい場合、Enumを定義するほどでもないが保守性は高くしたい場合がある。
他の場面でも使用したくなることはもちろんあるが、一例としてあげておく。

##サンプルコード
```vbnet
    Public Function CreateDto(values() As String) As Dto
        Dim dto = New Dto()
        dto.Code = values(0)
        dto.Name = values(1)
        dto.Remarks = values(2)

        Return dto
    End Function

    Public Class Dto
        Public Property Code As String
        Public Property Name As String
        Public Property Remarks As String
    End Class
```

##インクリメント使用後
拡張メソッドとしてppを定義した。処理を実行してからインクリメントするようになっている。

```vbnet
    // 拡張メソッドをImportsして使用する。
    Public Function CreateDto(values() As String) As Dto
        Dim i As Integer = 0
        Dim dto = New Dto()
        dto.Code = values(i.pp)
        dto.Name = values(i.pp)
        dto.Remarks = values(i.pp)

        Return dto
    End Function

    Public Class Dto
        Public Property Code As String
        Public Property Name As String
        Public Property Remarks As String
    End Class

// 拡張メソッドとして別モジュールで定義
Module ExtensionDefine

    <Extension()>
    Public Function pp(ByRef index As Integer) As Integer
        Dim org = index
        index += 1
        Return org
    End Function

End Module
```

##まとめ
ハードコードよりは読みにくいが保守性は上がる。例えば、Codeの上にIDが入るようにしただけで、修正前は全てのインデックスを修正しなければならい。インクリメント使用後は既存コードの修正が不要で、代入文を一つ足すだけでよい。
尚、拡張メソッドが使用できる前提のため、.Net 3.5以前のバージョンでは使用できない。

##注意事項
この記事で主題としているのは、インクリメントもどきがVisual Basicでも使用できるという点のみである。

[目次](http://qiita.com/csharpisthebest/items/57f27a33085f01211166)
SoundconverterにMP3プラグインを入れる（Ubuntu 16.04)

# soundconverter

![logo.png](https://qiita-image-store.s3.amazonaws.com/0/68673/c5c197cf-f44b-c59f-79cc-2e6fdf880203.png)

便利なサウンド変換ソフトです．
（ffmpegを使えばそんなものいらないよ，というのは承知の上ですが）

# to MP3変換を行うにはプラグインが別途必要
ソフトを起動し，設定を見ると一番下に 「MP3のプラグインが無い インストール方法はこちら」みたいなものがあります．
が，これはもう古いので話しになりません．

# プラグインは検索して入れる
リポジトリ検索
https://packages.ubuntu.com/
で **gstreamer** とでも検索すればいいでしょう．

結果としてgstreamerのuglyがいいので，これ
https://packages.ubuntu.com/xenial/gstreamer1.0-plugins-ugly

```

sudo apt install gstreamer1.0-plugins-ugly
```
これで完了．
BabelでブラウザがサポートしているECMAScriptに変換する

# Babelってなんなん？

ECMAScript2015以降を使用しているコードをブラウザがサポートしているレベルのECMAScriptに変換してくれる[トランスパイラ](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)です。
これで、class,const,let,promise,async/awaitなんかを使用できるようになります。
node.jsのバージョンが古い場合にも使えるのかな？考えたことなかったｗ

# gulpからBabelを使う

gulpはインストールされているものとします。

## gulpプラグイン インストール

+ [gulp-babel](https://github.com/babel/gulp-babel)
+ [babel-preset-latest](http://babeljs.io/docs/plugins/preset-latest/)
presetはes2015,es2016,es2017と策定された物ごとに用意されていますが、全部載せたいのでlatestを使用します。
+ [babel-polyfill](http://babeljs.io/docs/usage/polyfill/) 最新の機能をエミュレートするのに必要なライブラリです。ブラウザで使用する場合は、`node_modules/babel-polyfill/dist/polyfill.js`をhtmlで読み込む必要があります。

```
npm install --save-dev gulp-babel babel-preset-latest
```

## gulpタスク

`gulpfile.js`を以下の様に記載します。
タスクの内容は、jsフォルダ内の.jsファイルをトランスパイルして./dist/jsに出力です。

```js
'use strict';

const gulp = require('gulp');
const babel = require('gulp-babel');

gulp.task('babel', function() {
    gulp.src('./js/*.js')
        .pipe(babel({
            presets: ['latest']
        }))
        .pipe(gulp.dest('./dist/js'));
});
```

# トランスパイルの例

トランスパイル前のコード

```js
'use strict';

class Test {
    constructor() {
        console.log('Test.constructor');
    }

    log() {
        console.log('test');
    }
}

new Test().log();
```

トランスパイル後のコード

```js
'use strict';

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Test = function () {
    function Test() {
        _classCallCheck(this, Test);

        console.log('Test.constructor');
    }

    _createClass(Test, [{
        key: 'log',
        value: function log() {
            console.log('test');
        }
    }]);

    return Test;
}();

new Test().log();
```
【Electron連載】第２回 準備編ーNode.jsパッケージインストール

[↑【Electron連載（目次）】Electronでアプリ完成までのメモ](http://qiita.com/nullpointer_t/items/f74edc1f59cac42946ba)

今回はNode.jsのパッケージインストールの回やで。

#プロジェクト作成

まずはプロジェクト作成や。
適当なディレクトリに移動して作成な。

```bash:cmd
> npm init -y
```
対話形式で聞かれるのが面倒やから-yオプションを付けといたで。
アプリの名前やバージョンを対話形式で入力する場合はオプションなしで実行やで。

#必要なパッケージのインストール
最初はグローバルインストールしないでいこうと思ったんやけど、
VSCodeとの連携がうまくできなかったから、グローバルで入れることにした。

##Electron

まずは、Electronや。
これがないとはじまらへんな。

```bash:cmd
$ npm install -g electron-prebuilt
```

##TypeScript
まぁ、JavaScript一本でもええんやけど、せっかくの機会やさかい使うわ。
VSCodeが2.3.4使っていてバージョン違いますのメッセージがでるから
ここでバージョン2.3.4を指定してインストールな。

```bash:cmd
$ npm install -g typescript@2.3.4
```

#TypeScript用定義ファイル
TypeScriptでコーディングしていたらエラー出まくり、それを回避するために型定義ファイルを落としておくで。
とりあえず、Node.jsとElectron用な。

```bash:cmd
$ npm install -D @types/node
$ npm install -D @types/electron
```

#その他
開発を進むにあたって必要なパッケージが増えてきたらこっち記載するわ。

＞　[第３回　準備編ーVSCodeでデバッグ準備](http://qiita.com/nullpointer_t/items/c93700f4eb349a1f1844)
Pickleの動作をカスタマイズするためのメソッドをテストする

[pickle](https://docs.python.org/3/library/pickle.html)は、ファイルなどに保存するために、Python オブジェクトをバイト列にシリアライズするための標準ライブラリです。Pickle可能なオブジェクトはpickable、シリアライズされたバイト列からオブジェクトを再生成することをUnpickleと呼んでいます。

Pickleは、デフォルトでは`__dict__`に登録されているオブジェクトの属性をシリアライズしようとしますが、pickle用のスペシャルメソッドを定義することにより、その挙動をカスタマイズすることができます。特に、pickleするオブジェクトが、pickle出来ないオブジェクトをメンバーとして持っている場合や、そのオブジェクトが引数をとるコンストラクタで生成される場合などに使用します。

| メソッド          |  使用目的                                       |   
|:-----------------|-----------------------------------------------:|
| `__getnewargs__()` |  Unpickleする際にコンストラクタに渡す引数を指定する。|
| `__getstate__()`   |  `__dict__`ではなく、このメソッドが返すオブジェクトをpickleする。|
| `__setstate__(state)`   | pickleされていたオブジェクトをstateとして受け取り、unpickle時の処理を行う。 |

次のコードはこれらのメソッドの挙動を確認するためサンプルスクリプトです。

```py:
import pickle

class Foo:
    def __new__(self, a):
        print('in __new__:', a)
        self = object.__new__(self)
        # self.a = a
        return self
    
    def __init__(self, a):
        print('in __init__:', a)
        self.a = a

    def __getstate__(self):
        print('in __getstate__:', self.a)
        state = self.__dict__.copy()
        return state

    def __getnewargs__(self):
        print('in __getnewargs__:', self.a)
        return (2 * self.a,)

    def __setstate__(self, state):
        self.__dict__.update(state)
        print('in __setstate__:', self.a)


foo = Foo(3)
bar = pickle.dumps(foo)
baz = pickle.loads(bar)
print(baz.__dict__)
```
このスクリプトの実行結果は次のようになります。

```pycon:
in __new__: 3
in __init__: 3
in __getnewargs__: 3
in __getstate__: 3
in __new__: 6
in __setstate__: 3
{'a': 3}
```
pickleのマニュアルに書いてあるとおりですが、下記のことが分かります。

- `__getnewargs__`は、Pickleする時に呼ばれる。つまり、Unpickleされるときに`__new__`に渡す引数の情報は、Pickleされている。
- `__new__`には、`__getnewargs__`が返した値が渡されている。
- Unpicleでは`__init__`は呼ばれない。
MySQLのDB作成

開発用ローカルDB作成

    CREATE DATABASE netshare_dev;

確認

    show databases;
    ※作成したDBが出力されていることを確認

DBの中身

    use netshare_dev;

tableの確認

    show tables;
    何も作成してないのでemptyと帰ってくる

tableの作成

    create table users;
    usersテーブルの作成
プログラミング言語Go読書会#13(7.11-8)[2017/06/21]

[Go読書会 #13](https://lancers-engineer.connpass.com/event/60171/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ 7章 インタフェース
  + 7.11 型アサーションによるエラーの区別
  + 7.12 インターフェース型アサーションによる振る舞いの問い合わせ
  + 7.13 型Switch
  + 7.14 例：トークンに基づくXMLデコード
  + 7.15 ちょっとした助言
+ 8章 ゴルーチンとチャンネル


## 話題に上がった話

### 7.11 型アサーションによるエラーの区別

ここでは、最後の文言が話題になりました。

> たとえば fmt.Errorfを呼び出して、エラーメッセージがもっと長い文字列に結合されると、 PathErrorの構造体は失われます。

この発言の意味が、ぱっと見わからず、エラーメッセージが長い文字列になりすぎた故に、PathErrorの構造体情報が視認しづらくなり、情報がそれをみる人間にとって失われるという意味なんじゃ無いかと思うんですが、発言が長い文字列と失われるがどうとらえて良いのか難しいです。

### 7.12 インターフェース型アサーションによる振る舞いの問い合わせ

ここでは、型アサーションを使用してインターフェースを満足しているかどうかを判定することにより、処理を分岐させる方法がio.WriteStringを例に取って説明されていました。

```go
if _, ok := w.(WritString); ok {
  ....
}
```

あと、メソッドが満たす暗黙の想定が存在することも書かれていてそこも興味深かったです。

### 7.13 型Switch

ここでは、インターフェースの具象型の操作を隠蔽するメソッドを強調するスタイルと、インターフェースを様々な型の共用体と見なし具象型を強調するスタイルの2種類について言及されていて、型switchは後者の方です。

型アサーションによる分岐をswitch文で行う話がメインでした。switch文へ型アサーションを適用すると、データ型で分岐が出来て非常に分かりやすい書き方が出来ます。

```go
swtich x.(type) {
  case nil:
  case int,uint:
  case bool:
  case string:
  defaut:
}
```

+ [type switch](https://golang.org/doc/effective_go.html#type_switch)

### 7.15 ちょっとした助言

ここで興味深かったのは、設計の段階でインターフェースを作りすぎないことが大事でだということが書かれていた点です。抽象型であるインターフェースで設計をすすめて必要も無いのにインターフェースだらけになる設計をしてしまいがちですが、そんなことはする必要が無く2つ以上の具象型がある場合のみ必要に応じてつくれば言い問うことでした。

### 8章 ゴルーチンとチャンネル

ここでは、質問として並行プログラミングとjsの非同期処理と何が違うのですかというものが上がったので

+ [JavaScriptの非同期処理を並列処理と勘違いしていませんか？](http://qiita.com/klme_u6/items/ea155f82cbe44d6f5d88)

こちらを挙げて議論等をしました。

この辺、並列と並行どうちがうのかとか、ブロッキング、ノンブロッキングI/O、I/O多重化、fork、threadなど話し始めると切りが無いのですが、

+ [UNIXネットワークプログラミング](https://www.amazon.co.jp/gp/product/4894712059/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4894712059&linkCode=as2&tag=amesho-22&linkId=709f1977b8fd297602340acd624d7d2b)
+ [Working with Unix Processes](https://www.amazon.co.jp/gp/product/B0078VSRUE/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B0078VSRUE&linkCode=as2&tag=amesho-22&linkId=1a6ac8a661633a23c8c8821ab9574802)

など参考文献を挙げながら話を進めました。

ここまで呼んだところで、時間になりました。次回は 8.1 ゴルーチンからです。