OmniAICreator/Qiita-1.07M huggingface dataset:
WebAudioの勉強するなら「Web Audio School」が良さそう #webaudio (プレゼン)


## はじめに

* [WebAudio.Tokyo #3](https://webaudiotokyo.connpass.com/event/48120/)にて煽られたので即興でプレゼンを作っています。

* 楽しそうだったのでNodeSchoolのWeb Audio Schoolのカンタンな紹介です。

---

## 自己紹介

![](https://i.gyazo.com/499778e4fe9d3b535420261bcc03f5fd.png)

---

### 僕と音楽

* 小学校6年間 エレクトーン
* 高校でベースとギターをかじる
* けど特になにも身についてない
* WebAudioむずい

---
### `#iotlt`

* IoTLT 主催してます。
* 1/30にソフトバンク本社でやります。
* https://iotlt.connpass.com/event/45884/

![](https://i.gyazo.com/77d1a04e8616911e1a7c276c77e009b2.png)

---

### 僕とWebAudio

* IoTLTvol4で発表してた [MakeyMakeyで○○と○○をつなげてみた話 (第4回 #iotlt : 5分)](https://speakerdeck.com/n0bisuke/makeymakeyde-to-wotunagetemitahua-di-4hui-number-iotlt-5fen)
* セクハラインターフェイス https://vimeo.com/41101694
* [MakeyMakey](http://www.makeymakey.com/)でSIに挑戦 

![](https://i.gyazo.com/43139cbf7bdc0de8d08b42f03043d983.png)

* [実際の様子](https://goo.gl/photos/ERaPTEVdAks4z5kf8)

---

## NodeSchool

https://nodeschool.io/

![](https://i.gyazo.com/299db8c48c34593b518e3340b716194b.png)

* Node.jSの学習向けツール
* CLI実行
* npmでインストール

---

### NodeSchoolの代表的なレッスン

![](https://camo.githubusercontent.com/17955d1d684a9a0b3fd9d5d863393e6e952cc3b4/68747470733a2f2f7261772e6769746875622e636f6d2f72766167672f6c6561726e796f756e6f64652f6d61737465722f6c6561726e796f756e6f64652e706e67)

* learnyounode
* javascripting
* How to npm
* stream-adventure
* Elementary Electron
* NodeBots Workshop

---

## Web Audio School

![](https://i.gyazo.com/2ac4cd771acaafdb91b931a8962a6c0a.png)

* WebAudioを学べるNodeSchoolのレッスン
* https://github.com/mmckegg/web-audio-school

---

### インストール

```bash
$ npm install -g web-audio-school
```

起動

```bash
$ web-audio-school
Starting server...
```

CLIかと思いきや...

---

### NodeSchoolでは珍しいGUIツール

* http://localhost:9966/ でサーバー起動
* ブラウザ上でコーディング

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

* 問題文を元に回答を右上のエディタに記述
* 右下の`verify`で答え合わせをする

* 成功すると...`verified!`という表示になります。

![](https://i.gyazo.com/0d2c35510db5845113e1e9eb6bf77cfd.png)

---

### 第１問を解いてみる

* 第１問の問題はざっくりいうと「`sawtooth`の音を流そう」という内容です。

```
oscillator.type = 'sawtooth'
```

という行を差し込めばOKです。

![](https://i.gyazo.com/0a8cea72f684f647e07d13d1d164654d.gif)

* 実行すると同じ波形と音を確認できます。

---

## 宣伝: NodeSchool Tokyoやるよ

* NodeSchoolのレッスンをみんなでもくもくする会
* メンターがいるので分からないことは聞けます。
* 次回 1/29 @レバレジーズ
* https://nodejs.connpass.com/event/45720/

![](https://i.gyazo.com/265d48212a1f8a705af81161a1825adf.png)

---

## まとめ

* WebAudioの勉強するなら「Web Audio School」が良さそう
	* 追記: Webサイトだけでもできるみたい -> https://mmckegg.github.io/web-audio-school/
* 1/29 NodeSchoolきてね
* 1/30 IoTLTきてね
リファクタリングを進めていく

リファクタリングを進めていく。
十分な単体テストをしてリファクタリングしていかなくてはならない。

自分ならもっと上手に書けるのにという場合でも、今あるコードを壊さないことが大事。

> [「橋を燃やすな原則」](http://qiita.com/nonbiri15/items/46312304fe8d4bb75276)


単体テストしやすいライブラリは、外部仕様の設計が大切です。よい外部仕様を作成することは、手離れのよいライブラリになって、自分の作業を減らしていくことにつながります。

> [手離れのいい外部仕様を作成しよう](http://qiita.com/nonbiri15/items/9f58dd25a0a6efb91de6)

ヘッダファイルは、外部への約束です。ですから約束する(記述する)内容は最小限にします。そして約束の内容がテキストファイルとして人が読んでわかるものにします。ですからDoxygenのdocumentation コメントは .cppファイルではなく、ヘッダファイルに記載します。

> [ヘッダファイルの記述は最小限に](http://qiita.com/nonbiri15/items/78f6ae4102beb03196c1)


一連のモジュールの設計が妥当かどうかをチェックするには、ヘッダファイルの依存関係を確認することです。ヘッダファイルが名前空間やディレクトリ構造を持っている場合には、それらの依存関係も見てみます。それらが交互に依存している場合には、設計が何か変である可能性が高いと思われます。Doxygenを使いながら設計と実装の妥当性を検証していきましょう。

> [Doxygenでヘッダファイルの依存関係を確認しよう](http://qiita.com/nonbiri15/items/8e734ff15555c7ebea9e)


開発をすすめていく中では、その仕様が開発のしやすいものになっているかが重要です。開発の経験が少ないマネジャーの場合には、開発のしにくい仕様を作成してしまう場合があります。そのような判断間違いをしやすい事例をいくつか示し、どういう理由で間違いと考えるのかを述べています。

> [開発のしやすさを重視した仕様を作成しよう](http://qiita.com/nonbiri15/items/439a9a3d7638aee2f38d)


モジュールの関数を作成する場合には、「関数が多ければ便利でいい」というわけではないことを単一責務の原理にしたがって、次のようにまとめました。

> [単一責務の原理(Single Responsibility Principle)を守るとバグに苦しむことが減る](http://qiita.com/nonbiri15/items/3a79fdc9a61203132368)


次の３つの記事は、いずれもよいデータ構造を使うことで、コードは簡潔になり、データ構造の操作（例：データ追加、データの検索）とロジックのコードが区別しやすくなることの利点を指摘していて、STLなどの標準的なデータ構造を積極的に活用すべきと主張しています。

> [データ構造の操作とロジックのコードは区別しよう。](http://qiita.com/nonbiri15/items/98684bda5bb17bc5f03e)
 [よいデータ構造でコードを簡潔にする](http://qiita.com/nonbiri15/items/f7dd16f156265fb85adf)
 [std::map型を使って見通しのよいコーディングをしよう](http://qiita.com/nonbiri15/items/ff739d455377bc1bc9ed)


次の記事はmap型を使えば、switch文を使う必要はなくなり、一連の記述の可読性が大幅に向上し、分岐が増えたときでも保守しやすいことを述べています。

> [私はswitch文が嫌い](http://qiita.com/nonbiri15/items/4cb1b317fcb88f270a55)


モジュールの設計がどこかしら変で、再利用性をそこなっている例の１つとしてextern があります。
そのextern を削除する設計の変更方法を示しました。
> [extern をC++のライブラリから取り除く](http://qiita.com/nonbiri15/items/6c2ed44b9852c9bf8e37)


問題のあるソースコードの１つは、マクロ定数の多すぎるヘッダファイルです。その引き起こす問題と対策とを示しました。
> [マクロ定数が多すぎる。](http://qiita.com/nonbiri15/items/a39e15b7bdc9d85b9f97)
> [マクロ定数が多すぎるへの対策](http://qiita.com/nonbiri15/items/140ab866d4b6ef017f50)



さらに、リファクタリングをしていくためのコツを以下に示します。変数のスコープを少しでも狭めることは、ソースコードの理解をしやすいものにすることだと主張しています。

> [変数のスコープを少しでも狭める](http://qiita.com/nonbiri15/items/8fd23415dbde2de61828)


不幸にして長すぎる関数を読んで保守する必要を生じたときのヒントを示しました。
>  [長すぎる関数を短くするヒント](http://qiita.com/nonbiri15/items/a3063fd572421bebfd88)
 [深すぎるif文for文の入れ子を書き換える](http://qiita.com/nonbiri15/items/1cdeb9ea5eb51e7e84e3)


これらの記事が、あなたの関わっている開発でのリファクタリングをしやすくするものであれば幸いです。

---

### 執筆後1年以上経過しての付記

#### 自動ビルド・自動テストを活用すること。
[継続的インテグレーション(デリバリー)サービスを利用しないという罪悪](https://qiita.com/nonbiri15/items/17b37664f94d4b1784aa)
#### リファクタリングに適したエディタ・統合環境を使おう
#### 名前大事：適切な名前をつけることで、ドキュメンテーションコメントさえ不要にすること。

#### 最新の文法が用意している機能を使って、間違いが入りにくいコーディングを進めること。
DLL関係のメモ書き


普段JavaでWeb開発していますが、2年1回ぐらいの頻度でDLLを修正する必要があります。
そのメモ書きです。


### DLLの依存関係を調べる
Visual Studioのdumpbinコマンドで確認できます。

```bat
dumpbin.exe /DEPENDENTS ファイル名
```

http://yohshiy.blog.fc2.com/blog-entry-65.html
https://msdn.microsoft.com/ja-jp/library/e16161bd.aspx

当たり前ですが、依存するDLLが存在しないと、動きません。
b.dllを参照しているa.dllがあって、このa.dllをJavaから実行するとします。
このとき、b.dllがないと「a.dllが見つからない」という旨のメッセージが表示されます。
私はこのエラーに悩まされ、「依存するDLLがないだけ」と気づくのに結構時間を使ってしまいました。

### MSVCP100.dllが見つからない
「MSVCP100.dllが見つからない」という旨のエラーメッセージが出た場合の対処。
Microsoft Visual C++2010 再頒布可能パッケージを、インストールすればよいです。

http://fromthree.ddo.jp/fromthree/pcrescue/003001/MSVCP100.html
gem install pg でこけたときの対処


## 環境

macOS 10.12.2

## 起こったこと

`$ bundle install` でこける。原因は次の `$ gem install pg` でこけること。

```
$ gem install pg -v '0.17.1'
gem install pg -v '0.17.1'
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
	ERROR: Failed to build gem native extension.

    current directory: /Users/username/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/pg-0.17.1/ext
/Users/username/.rbenv/versions/2.3.0/bin/ruby -r ./siteconf20170112-35370-1f9ehrz.rb extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/username/.rbenv/versions/2.3.0/bin/$(RUBY_BASE_NAME)
	--with-pg
	--without-pg
	--with-pg-config
	--without-pg-config
	--with-pg_config
	--without-pg_config
	--with-pg-dir
	--without-pg-dir
	--with-pg-include
	--without-pg-include=${pg-dir}/include
	--with-pg-lib
	--without-pg-lib=${pg-dir}/lib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/username/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-16/2.3.0-static/pg-0.17.1/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/username/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/pg-0.17.1 for inspection.
Results logged to /Users/username/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-16/2.3.0-static/pg-0.17.1/gem_make.out
```

`pg_config` や `libpq-fe.h` がないとのこと。

## 対処

調べると postgresql を入れれば良いらしい。

```
$ brew install postgresql
```

これで通った

```
$ gem install pg -v '0.17.1'
Building native extensions.  This could take a while...
Successfully installed pg-0.17.1
invalid options: -f fivefish
(invalid options are ignored)
Parsing documentation for pg-0.17.1
Installing ri documentation for pg-0.17.1
Done installing documentation for pg after 1 seconds
1 gem installed
```

## 参考

- http://qiita.com/kiyodori/items/aa13cea7fe96e417d133
git log を見やすく

## 参考

https://github.com/Shinpeim/introduction-to-git/blob/master/05_branch.md

## 方法

```
$ git config --global alias.graph "log --graph --date-order --all --pretty=format:'%h %Cred%d %Cgreen%ad %Cblue%cn %Creset%s' --date=short"
```

とすると次回から


```
$ git graph
```

で見やすく表示してくれる。
SSH 鍵作ってみた


Mac で SSH 公開鍵と秘密鍵を作成

## 作ってみる（これでも良い？）

```bash:
➜  ~ ls -al ~/.ssh
ls: /Users/username/.ssh: No such file or directory
➜  ~ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa):
Created directory '/Users/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/username/.ssh/id_rsa.
Your public key has been saved in /Users/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXX username@watashinonamaenoMacBook-Pro.local
The key's randomart image is:
XXXXXXXXXXX
➜  ~ ls  ~/.ssh
id_rsa     id_rsa.pub
```

これでもできたが、色々なところでメールアドレスを入力って書かれている。
メールアドレスを入力しないと上のように `username@watashinonamaenoMacBook-Pro.local` のようなものが生成されてこれが使われる。

## もう一度作ってみる（より良い）

```bash:
➜  ~ ssh-keygen -t rsa -C "myadress@email.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa):
/Users/usernameusername/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/username/.ssh/id_rsa.
Your public key has been saved in /Users/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXX myadress@email.com
The key's randomart image is:
XXXXXXXXXXX
```

途中で Overwrite するか聞いてくれる。


## 公開鍵をクリップボードにコピー

```
$ pbcopy < ~/.ssh/id_rsa.pub
```


## 参考

- http://freak-da.hatenablog.com/entry/20100901/p1
- http://chi-kun.hatenablog.com/entry/2016/06/13/220943
SQLアンチパターン：プアマンズ・サーチエンジン(貧者のサーチエンジン)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- 全文検索を行う

## SQL について

- SQL(および SQL の背後にあるリレーショナル理論)の原則の 1 つは、列の値がアトミックであること
  - 値が別の値と比較できること
  - 部分文字列の比較はSQLにとって非効率

# アンチパターン

- パターンマッチ述語を使用する
  - LIKE
  - 正規表現（MySQL は日本語に対応していない）
  - テーブルスキャンになる（インデックスは使えない）のでパフォーマンスの低下

## 用いてもいいパターン

- 使用頻度が極めて低い
- 単純なケース

# 解決策

- 適切なツールを使用する
  - SQL の代わりに専用の全文検索エンジンを使うこと
  - ベンダーごとに全文検索エンジンがある
  - サードパーティのもある

# まとめ

問題を解決するために、必ずしも SQL を使う必要はありません。

# 感想

全文検索は、専用のを使いましょう！

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
Ｄ言語拡張機能(code-d 0.16.0)のアップデート(Windows)

# Ｄ言語拡張機能(code-d 0.16.0)のアップデート(Windows)

code-d 0.16.0 + workspace-d 2.10.0 released (2017/1/22)されたので試してみました。

新規にVSCodeからインストールする場合は[ここを参照](http://qiita.com/sfujita/items/24c47b68f15d24f0c03e)


## Topics

- import 文の追加支援機能がおもしろい(Auto-Fix for issues like missing imports)
- コンパイルエラーがなくなると自動的にビルドします

![vscode_auto_import_fix.gif](https://raw.githubusercontent.com/SeijiFujita/quiita_works/master/using_vscode_02/pics/vscode_auto_import_fix.gif)



## Ｄ言語拡張機能のインストールとアップデート
初めてインストールする場合もツール類を実行できる環境を作った後に VSCode の拡張機能のインストールを行うことでスムーズに
インストールできると思います。

0. 各種ツールをビルドしPATHを通す
0. VSCode の拡張機能で dlang を検索し "D Programing Language(code-d)" をインストールまたはアップデートを行う
0. VSCode メニューの ファイル -> 基本設定 -> ユーザ設定 ->  D configration 設定を確認
0. 以上でインストール・アップデートは終了



## 各種ツールをビルドしPATHを通す
ビルドするには git, dmd, ldc2 が必要です。workspace-d は ldc2 でビルドする必要があると assert 文が入っているので深くは追及していない


- workspace-d  https://github.com/Pure-D/workspace-d
- DCD  https://github.com/Hackerpilot/DCD
- dfmt  https://github.com/Hackerpilot/dfmt.git
- Dscanner  https://github.com/Hackerpilot/Dscanner
- Dscanner は dub でビルド出来ないので Dscanner/build.bat を使用(64bit でビルドするには -m64 を追加する必要がある)


以下の Build.bat は git clone -> コンパイル -> できたバイナリを Binディレクトリに集めるので PATH を通してください。

```bat:Build.bat

git clone https://github.com/Pure-D/workspace-d.git
git clone https://github.com/Hackerpilot/DCD.git
git clone https://github.com/Hackerpilot/dfmt.git
git clone --recursive https://github.com/Hackerpilot/Dscanner.git

@rem git clone --recursive https://github.com/Pure-D/workspace-d.git
@rem git clone --recursive https://github.com/Hackerpilot/DCD.git
@rem git clone --recursive https://github.com/Hackerpilot/dfmt.git
@rem git clone --recursive https://github.com/Hackerpilot/Dscanner.git

if not exist bin mkdir Bin

pushd workspace-d
dub build --compiler=ldc2 --arch=x86_64 --combined --build=release
@rem dub build --compiler=dmd  --arch=x86_64 --combined --build=release
@rem dub build --compiler=dmd  --arch=x86_64 --build=release
if ERRORLEVEL 1 goto :eof
copy workspace-d.exe ..\bin
popd

rem goto :eof

pushd DCD
dub build --compiler=dmd --combined --arch=x86_64 --build=release --config=client
if ERRORLEVEL 1 goto :eof
dub build --compiler=dmd --combined --arch=x86_64 --build=release --config=server
if ERRORLEVEL 1 goto :eof
copy dcd-client.exe ..\bin
copy dcd-server.exe ..\bin
popd

rem goto :eof

pushd dfmt
dub build --compiler=dmd  --arch=x86_64 --combined --build=release
if ERRORLEVEL 1 goto :eof
copy dfmt.exe ..\bin
@rem call build.bat
popd

pushd Dscanner
@rem dub build --compiler=dmd  --arch=x86_64 --combined --build=release
call build.bat
if ERRORLEVEL 1 goto :eof
copy dscanner.exe ..\bin
@rem call build.bat
@rem dub.json -> "libdparse": "0.7.0-beta.1",
popd

pause
```

----

- location https://github.com/SeijiFujita/quiita_works/tree/master/using_vscode_02


tag: dlang,VSCode,Visual Studio Code
filename: using_vscode_02.md
last update: 2017/01/25
Lost connection to iPhoneのエラーについて

# 結論
Xcodeのバグかもしれません。
自分は開発環境が「Xcode7」iPhoneのバージョンが「iOS9」の場合、このエラーが起こりました。
それ以外のケースでも同じくバグが起こるかもしれないので、一度自分の開発環境を確認をしてみてください。
iPhoneの端末を変更してみたり、XcodeやiPhoneのアップデートを行うとすんなり治るかもしれないです。

# おわりに
自分もこの症状にハマり、急に実機デバッグができなくなって焦りました。
ソースを変えていないのにデバッグできなくなった場合は、一度自分の開発環境を確認し直して見て下さい。
Mac のデスクトップで常にグリッドに沿うようにする


## 方法

デスクトップで `command+j` して、表示順序を「グリッドに沿う」に変更

![スクリーンショット 2017-01-09 23.17.04.png](https://qiita-image-store.s3.amazonaws.com/0/155820/46a35f0e-59a3-344c-589c-f45a572cbb91.png "スクリーンショット 2017-01-09 23.17.04.png")

これで Finder のフォルダ内もグリッドに沿うようになることを期待したがそうはならず...

## 参考

- http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-disable-the-icon-grid-of-macos-finder.html
PostgreSQLでDB設計する際のおれおれルール


PostgreSQLでDB設計する際、私が決めているルールです。

# データ型

### 数値型

* 整数の場合は、基本INTEGER
* 「絶対に2byte範囲の整数」であると言える項目はSMALLINT。たとえば国を表すIDなど。
* 連番用の項目は、SERIAL/BIGSERIAL。
* 小数の場合は、基本NUMERIC。

### 文字列型
* 基本VARCHAR
* 備考やファイルパスなど、200文字以上ありそうな場合はTEXT
http://lets.postgresql.jp/documents/technical/text-processing/1

### 真偽値
* 真偽値はBOOLEAN。CHAR(1)などを使わない
* NOT NULL制約ならば、DEFAULT句も使用する

# 制約
できる限り制約を付けること

* 主キー制約
* 外部キー制約
* check制約

# その他

### コメント
下記の項目にはコメントをつけること
* 全てのテーブル、ビュー、関数、スキーマ
* 全ての列
* 自分で作成した制約
技術書を買う前に

この前、社畜ちゃんの漫画を読んでいて、

![後輩ちゃんの独り立ち5話](https://qiita-image-store.s3.amazonaws.com/0/112259/a0ecac28-9dbe-c16e-99f5-348d6bfc578f.jpeg)

[©ビタワン／社畜ちゃん](https://syachiku-chan.com/)

この、本屋見つける→勉強しようと思う→どれがいいかわからないが買うということを、自分も社会人になった当初やったな、誰でも通る道かねと思いだしつつ、だいたい後悔してたので、書いておきます

## 対象
* いまいち勉強の方向性のわからない新社会人
* いわゆる技術書レビューを読んで、本を買おうとする人

## 先輩に聞く
まず、一番最初に何を読めば良いかわからない場合直属の先輩に聞きましょう。理由は以下です

* 先輩はあなたのレベルを把握している
* 先輩は業務に必要な知識が何かを把握している
* やる気アピール

先輩は、コードレビューや教育に当たっているため、あなたのレベルを把握しているはず。なので、レベルに合わせた本をおすすめしてくれるでしょう。また、先輩のおすすめ本は先輩が重要に思うことが書かれている可能性が高いです。後、やる気アピールは重要

これで4000円の業務に使わないPHPの本が埃をかぶるのを防げます

もし、何か読みたい本がある場合、先輩もですが、社内の人に聞くと良いと思われます

* 運が良ければ借りて費用を浮かせられる
* なくても運が良ければ会社の費用で買える

名著と呼ばれるものであれば、誰かが持っていたり、全員が読むために会社で買うこともあります
聞いておけば、買った後に、同僚がリーダブルコーディングを持っていたなどの発覚を防げます
また、誰も読んでいない場合、勉強会を開くなども可能です。
もし、それで手元に置きたい場合、買えば良いと思います

借りた場合の欠点として

* 借りた以上、読むことを期待される。
* 先輩に依存する
* 古い

貸す(もしくは会社で買う)ということは先輩は読むと思っています。なので、礼儀としてちゃんと読んで返しましょう
もし、どうしても、読むのが無理な場合

* レベル的に難しかったと言う(内容のレベルを把握する必要はあるけれども)
* 少し、読んでみて、知りたい内容と別だったので、別の本を貸してもらう。
* (本によるが)ネットでまとめてあったりするので、それを読んで内容を把握して読んだふり

と言う方法があるにはあります
 
先輩に依存するというのは、いわゆるコードの書き方や業務に関連する知識ならまだしも、知っておくべきだけど、業務には関連しないこと、または先輩が軽視していることは教えてもらえない可能性があります。ただ、それはある程度学んできたら、何を知るべきか、どれを読むべきかの取捨選択ができてくるので、それからで良いと思います

古いのは単純に内容が古いです。私がこの前、先輩に借りたEffective Javaは第1版でした。(現在は第2版)

## 本屋で買う?
先輩が持っていない、もしくは、先輩のおすすめがもうない場合等、自分で買う場合になると思います
そういう場合、よくあるお薦め書籍○選等から考えて選んで読めばよいですが、考えることは2点

* 書籍で買うかpdfで買うか
* そもそも、買うかのか

書籍で買うかpdfで買うか
例えば、先輩等と勉強会したいや記事を書きたいなど、何か書きたい場合はpdfの方が便利です。個人的には紙の技術書はいらないと思うくらい。欠点は、pdfがない事が多い、中古では買えないから高いことでしょうか

また、現在ネット上で無料で学べることは多いです。(それが良いかは別として)名著であればあるほど、ネット上でまとまっている可能性が高いです
しっかり書いてある、補足的な部分があるなど、本には本の良さがあるので、一概にネットの方が良いとは言えないのですが、もし、知りたい事柄のアプローチの内の一つや、なんでもよいから勉強したいというのであれば、別アプローチを考えてみるのもアリです

##勉強会
もし、同じレベル(同期)がいる場合、片方がリーダブルコーディングを読み、片方がEffectiveJavaを読み、互いにまとめた項目を勉強会した方が早いです
どこで見たかは失念してしまいましたが、個人で高めていくより、成長の早いチームを作り、その中で個々人の成長スピードを上げる方が大切みたいなことをどこかで読んだような

##まとめ
というわけで、何かあった場合、先輩が信用できないとか、ダメな人でない限り、聞いてしまった方が良いです
そのうち、技術書を読んでたり、ネットの記事を読んでいるうちに、なんとなく、自分に足りないところや、何を勉強したいのかというのが見えてきます
何か技術書を買うというのは、それからで良いと思います
新人のうちなんて、色んな情報がありすぎて、何を学べば良いか技術書って大抵高いのですが、とりあえず買ったら、使わなかったということもそれなりにあります
個人的には、そのお金で、マウスやキーボードを買う方が、個人的には良いんじゃないかなぁと、思うわけです

最後になりましたが、ビタワンさん。引用をご承諾いただき、誠にありがとうございます。
Perlの正規表現で行頭の空白文字を消してみる

Perlで文字列を整形する方法の覚え書きパート1。

#行頭の空白文字を消す

```trim.pl
use strict;
use warnings;

while (my $line = <>) {
    #改行を削除
    chomp $line;

    #先頭の空白を削除
    $line =~ s/^\s+//;

    #標準出力にプリント
    print "$line\n";
    }
```
シェルで`$ perl hoge.pl text`ってやると、`text`が一行ずつ`$line`に読み込まれる。そして、正規表現でパターンを指定して置換する。`$line =~ s/^\s+//;`の`~\s+`で行頭にある1文字以上の空白文字にマッチさせ、`//`で削除している。
先頭に空白がある行を含むサンプルファイルをつくってトリムしてみよう。

```space.txt
  01 23 35
aa bb cc
 foo foo boo
```

実行。

```bash
$ perl trim.pl space.txt

01 23 35
aa bb cc
foo foo boo
```
先頭のスペースが消えた。
My Alexa の知見１　"Can"t find the skill"  

# はじめに
この投稿は私がラズパイで自作Alexaを開発した知見を投稿するシリーズ（にしようと思っている）です。
同じ現象に当たった時の助けになればいいなと思ったので、始めることにしました。

# 現象
カスタムスキルが呼べない。
いつも、僕の alexa は **Can"t find the skill** と悲しい答えを返してくる。

[Echosim](https://echosim.io/) で試すと正しくスキルを呼んでくれる。

# 解決方法
[developer.amazon.com](https://developer.amazon.com) で 別の[セキュリティプロファイル](https://github.com/alexa/alexa-avs-sample-app/wiki/Create-Security-Profile) を作成し、
再認証させる。

# 原因
同じセキュリティプロファイルを複数のデバイスで使い回している。

### 詳しく
自作デバイスからAlexaにアクセスするためには、デバイスが自分の持つAmazon.comアカウントへアクセスできるよう、セキュリティプロファイルを通して、アクセス許可を提供する必要がある。
この時に、 [developer.amazon.com](https://developer.amazon.com) で作成したセキュリティプロファイルが使われる。

この認証操作は、HTTPリクエストによって行うのだが、このメッセージの中には、***デバイスのシリアルナンバー***を埋め込む必要がある

```json
{
    "alexa:all": {
        "productID": "{{productId}}",
        "productInstanceAttributes": {
            "deviceSerialNumber": "{{deviceSerialNumber}}"
        }
    }
}
```

シリアルナンバーが重複すると、alexaがスキルを呼ぶ際にプロファイルを選べなくなり、スキルを見つけることができなくなる。
いろんなデバイスで試していて、「プロファイルを使い回せばいいやー」でやってしまうと、これにハマる。

[詳しいドキュメントはこちら（英語）](https://developer.amazon.com/public/solutions/alexa/alexa-voice-service/docs/authorizing-your-alexa-enabled-product-from-a-website)


## 再認証の手順
再認証のステップは、クライアントの実装により異なるので言及できないのですが、Amazon公式サンプルの手順を補足として載せておきます。

### 補足
Amazon公式:[alexa-avs-sample-app](https://github.com/alexa/alexa-avs-sample-app) 
[ラスパイ版](https://github.com/alexa/alexa-avs-sample-app/wiki/Raspberry-Pi#step-5-update-the-install-script-with-your-credentials)
[MAC版](https://github.com/alexa/alexa-avs-sample-app/wiki/Mac#6---run-the-sample-app)

## 補足２ 解決までのステップ
それはそれは長い道のりだった。。。（ただの苦労話です。読み物としてどうぞ。）

１２月から、ずっと僕のアレクサはスキルを呼び出してくれなかった。
Webを漁ったら「UK対応したからじゃない？」とか、「バグだよ。今Amazonが直してるよ」などなど、右往左往する記事にばかり当たる。

どうにもいかなくなって、昨年のre:Inventでアレクサのすごい人に聞いてみたりもした。

それでもうまくいかない。

ふと、Echosim.io で試す。。。呼べる！！！！

Amazon公式サンプルで試す。セキュリティプロファイルは、自作のalexaで作った時のものを試す。呼べる！！！

ラズパイに戻って、同じセキュリティプロファイルで再認証してみる。やっぱり呼べない。

Amazon公式サンプルで試す。。。。呼べなくなってる！？

そしてドキュメントを漁る。

シリアルナンバー。。。。？

仮説が立つ。
セキュリティプロファイル：デバイス＝１：１

そして検証。確信に変わる。

ここまで長かった。。。。

同じ悩みを持ってる人がいて、これで解決できたなら嬉しい限りです。
wordpressで記事がnotFoundになる。

wordpressを使っていてブログを書いてアクセスしてみると

```
http://ドメイン名/2017/01/23/1/
```

を開いた時に、「not Found」と表示されます。

これは、2017/01/23/1/(パーマリンク)がapacheに無視されちゃってるのが原因です。

```
$ cd /etc/httpd/conf/
$ sudo vim httpd.conf
```
で

```
<Directory "/var/www/html/wordpress">
AllowOverride none
</Directory>
```
の部分のnoneをAllに変更します。

```
AllowOverride All
```
に変更します（これによって.htaccessが無視されます。安全な初期設定としてこうされている）
![image](https://qiita-image-store.s3.amazonaws.com/0/144904/b0fa1b2e-843b-f29a-11b9-a5645ec3645e.png)

これによってパーマリンクもきちんと表示されるようになります。

#参考
http://itsukara.hateblo.jp/entry/2016/03/24/011102
PHP の max_execution_time は、いい加減に書かれたスクリプトがサーバーの負荷を上げることを防止するのに役立ちますが、超いい加減に書かれた スクリプトがサーバーの負荷を上げることを防止するのには役立ちません

# PHP はいい加減なスクリプトからサーバを守ります

PHP には `max_execution_time` という、いい加減なスクリプトからサーバを守る設定が存在します。

[マニュアル](http://php.net/manual/ja/info.configuration.php#ini.max-execution-time) によると

> スクリプトがパーサにより強制終了されるまでに許容される最大の時間を秒単位で指定します。

そして、

> この命令は、いい加減に書かれたスクリプトがサーバーの負荷を上げることを防止するのに役立ちます。 

と続きます。
要するに、うっかり無限ループとかを書いてしまったとしても所定の時間が来たら止めてくれるわけです。

```php
for ($i = 0; $i < 10; $j++) {
    // いい加減
}
```

色んな意味で、さすが PHP と言わざるを得ません。恥ずかしながら、私も稀にお世話になります。

# PHP は超いい加減なスクリプトからはサーバを守れません

しかし、マニュアルを読み進めると

> 最大実行時間は、システムコール、ストリーム操作等の影響を受けません。

と記載されています。さらに

> より詳細な情報については、[set_time_limit()](http://php.net/manual/ja/function.set-time-limit.php) 関数の説明を参照ください。

とあるので、`set_time_limit` の説明を読むと

> 関数 set_time_limit() と設定ディレクティブ max_execution_time は、 このスクリプト自体の実行時間にのみ影響を与えます。 system() を用いたシステムコール、ストリーム操作、 データベースクエリ等のスクリプト実行以外で発生する処理にかかった時間は スクリプトが実行される最大時間を定義する際には含まれません。 ただし、Windows ではこれは当てはまりません。 計測された時間は実際の時間と等しくなります。

とあります。
要するに、「実行時間」とは「ユーザCPU時間」のことなのです。なので

```php
for ($i = 0; $i < 10; $j++) {
    // 超いい加減
    sleep(1);
}
```

うっかりこんなことをしてしまうと、sleep している間は「ユーザCPU時間」は増えませんから（ループ内に sleep 以外の処理がどれだけあるかにもよりますが）いつまでたってもループし続けるはめになってしまいます。
みなさんくれぐれもお気をつけ下さい。
Lumenでtinkerを使う

小ネタです。

最近は[Laravel](https://laravel.com/)より[Lumen](https://lumen.laravel.com/)を使うことが多くなってきました。マイクロサービスアーキテクチャでサービスを作ろうとするとAPIを大量に作ることになりますので、Laravelのような何から何までいたせりつくせりなフレームワークはちょっと大げさなんですよね。

そんなシンプルかつ軽量で大変気に入ってるLumenですが、 `artisan` のコマンドが大幅に削られており、あろうことかデバッグに大変重宝する `tinker` が削らています。

これは困った。と思った皆さんに朗報。ありがたいことにLumen に `tinker`　を追加するモジュールを作ってくれた人がいます。

https://github.com/vluzrmos/lumen-tinker


# インストール

```
$ composer require vluzrmos/tinker
```

または`composer.json`に

```
"vluzrmos/tinker": "~1.3.0"
```

に追加して、 `composer update`を実行。

その後、`bootstrap/app.php` にサービスのロードを追加するだけです。

```php:bootstrap/app.php
/*
|--------------------------------------------------------------------------
| Register Service Providers
|--------------------------------------------------------------------------
|
| Here we will register all of the application's service providers which
| are used to bind services into the container. Service providers are
| totally optional, so you are not required to uncomment this line.
|
*/

// $app->register(App\Providers\AppServiceProvider::class);
// $app->register(App\Providers\AuthServiceProvider::class);
// $app->register(App\Providers\EventServiceProvider::class);
$app->register(Vluzrmos\Tinker\TinkerServiceProvider::class);
```

これで `artisan tinker`が使えるようになります。

```shell
$ ./artisan tinker
Psy Shell v0.8.1 (PHP 7.0.13-0ubuntu0.16.10.1 — cli) by Justin Hileman
>>> 
```

## ちなみに
公式のドキュメントでは、サービスのロードは

```
Add the Service Provider to the artisan file:
```

と"artisan file"に追加しろ。と記述されています。

もちろん、`bootstrap/app.php`だとHTTPアクセスの場合も読み込まれてしまうので、そのオーバーヘッドを避けるためでしょうが、artisanファイルはcomposerで管理されているファイルなのでLumen本体のアップデートでもとに戻ってしまう可能性があります。

ということで個人的には `bootstrap/app.php`　に記述して、どうしてもオーバヘッドが無視できない場合はコメントアウトするか、

```php:bootstrap/app.php
// $app->register(App\Providers\AppServiceProvider::class);
// $app->register(App\Providers\AuthServiceProvider::class);
// $app->register(App\Providers\EventServiceProvider::class);
if(env('APP_DEBUG')){
    $app->register(Vluzrmos\Tinker\TinkerServiceProvider::class);
}
```

みたいにすることをオススメしたいところです。

# 追記(2019/05/27)
**現在では公式のtinkerが提供されていますので、こちらを使いましょう。**
[laravel/tinker](https://github.com/laravel/tinker)
【MASCHINE　Learning】　Linear Regression with One Variable

package samples.string.japanese;
public class ZenkakuAlphabetToHankakuAlphabet {
  public static String zenkakuAlphabetToHankaku(String s) {
    StringBuffer sb = new StringBuffer(s);
    for (int i = 0; i < sb.length(); i++) {
      char c = sb.charAt(i);
      if (c >= 'ａ' && c <= 'ｚ') {
        sb.setCharAt(i, (char) (c - 'ａ' + 'a'));
      } else if (c >= 'Ａ' && c <= 'Ｚ') {
        sb.setCharAt(i, (char) (c - 'Ａ' + 'A'));
      }
    }
    return sb.toString();
  }
  public static void main(String[] args) {
    System.out.println(zenkakuAlphabetToHankaku("☆Ｊａｖａプログラミング☆"));
  }
}![screencapture-coursera-org-learn-machine-learning-exam-QeJ50-linear-regression-with-one-variable-1485179272026.png](https://qiita-image-store.s3.amazonaws.com/0/121250/db338d91-d5db-aa5d-2b5e-6f31693e3812.png)
macOS Sierra: キーバインドのカスタマイズ(Karabinerからの移行)




Sierraで、KarabinerやSeilが使えない問題への対処

## まとめ

* Seilは、Karabiner-Elementsに統合された
* Karabiner -> 機能限定版のKarabinar-Elementsを利用
* Caps <-> Ctrlキーの変換は、OSの設定で





## まず、SeilとKarabinerのアンインストール

どちらのアプリもアプリを立ち上げ、Misc & Uninstallタブを開き、Uninstallのボタンをクリックして、アンインストーラーを起動して、削除


### Seilのアンインストール方法

* [Seil - OS X用のソフトウェア](https://pqrs.org/osx/karabiner/seil.html.ja#uninstall)


## Caps Lock <-> Ctrlキーの変更


> 1. アップルメニュー＞「システム環境設定」と選択し、「キーボード」をクリックします。
> 2.「キーボード」をクリックしてから、「修飾キー」をクリックします。
> 3. 変更する各修飾キーのポップアップメニューをクリックしてから、動作を選択します。

[macOS Sierra: 修飾キーを変更する](https://support.apple.com/kb/PH25240?viewlocale=ja_JP&locale=ja_JP)


## IME On/Off


自分の場合、Ctrl-Oで切り替えをしたい

### ⌘英かな、で設定する

* [macOS 10.12 Sierraで⌘(Command)ボタンひとつで英かなをトグルさせる - Qiita](http://qiita.com/is0me/items/146beb1d3c5efdd3bb9d)


### IMESwitcher

macOS Siera 10.12で動作するか不明

[kan/ime-switcher: IME switch key manager for macOS](https://github.com/kan/ime-switcher)


### OSのシステム環境設定で、設定する

この場合、ひらがな、カタカナなどから選択する形になる。
入力ソースを2つだけにする。と複数から選ぶようなことをしなくて済む。

1. アップルメニュー →「システム環境設定」
2.「ショートカット」タブをクリック
3.左メニューから「入力ソース」を選択
4.前のソースを選択で、好きなキーを入力

> caps lockと左controlの入れ替え：修飾キーの設定を変える
> Ctrl-Oで日本語入力切り替え：キーボードショートカットの設定「前の入力ソースに切り替える」のバインドを変える

Ref. [Karabinerもkeyhacも捨てました。macOS Sierraのキーボード設定について。 | しま★りん.blog @ayurina](https://blog.ayurina.net/2016/10/02/karabiner%E3%82%82keyhac%E3%82%82%E6%8D%A8%E3%81%A6%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82macos-sierra%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84/)


## emacs キーバインドの設定ファイルを導入する

[Global Emacs Key Bindings for OS X](https://gist.github.com/cheapRoc/9670905#file-emacskeybinding-dict)

上記にある EmacsKeyBinding.dictを以下に置く。

~/Library/KeyBindings/DefaultKeyBinding.dict

上記を行ってから、アプリを再起動。(PCの再起動は不要らしい)


## Karabiner-Elementsのインストール


[Karabiner - OS X用のソフトウェア](https://pqrs.org/osx/karabiner/index.html.ja)


* [tekezo/Karabiner-Elements: The next generation Karabiner for macOS Sierra](https://github.com/tekezo/Karabiner-Elements)


key repeatがなくなっている?


## 代替ツール

* KeyHac for Mac
* [⌘英かな](https://ei-kana.appspot.com/)
* [Hammerspoon](http://www.hammerspoon.org/)
* [Keyboard Maestro 7.3.1: Work Faster with Macros for Mac OS X](https://www.keyboardmaestro.com/main/)


## KeyHac for Macを利用


[Home · crftwr/keyhac Wiki](https://github.com/crftwr/keyhac/wiki)


* [keyhac for Mac の開発環境を整える - Qiita](http://qiita.com/kuy/items/b003edc64a4017772227)
* [macOS Sierra + Keyhacでキーバインドをカスタマイズ - Qiita](http://qiita.com/kentaro/items/d004a11cc74ac5c59f36)


## Hammerspoon


* [Karabiner 使えない対策: Hammerspoon で macOS の修飾キーつきホットキーのキーリマップを実現する - Qiita](http://qiita.com/naoya@github/items/81027083aeb70b309c14)
* [Hammerspoonで macOS Sierra + Xcode に emacs ライクなキーバインドを設定した - Qiita](http://qiita.com/y-sakata/items/0006ba2a838355da7b5e)


## etc

* [macOS SierraでKarabinerが動かなくて困っている人に贈る代替ソフトウェア](http://hitoriblog.com/?p=44850)
* [Karabinerが使えないOSX Sierraで頑張る | 道具眼日誌：古田-私的記録](http://do-gugan.com/~furuta/archives/2016/12/osx-sierra-karabiner-elements.html)
* [macOS Sierra で Karabiner が使えない問題にどう対処したか - Qiita](http://qiita.com/naoya@github/items/56a34be85710f4ed5531)
地理座標の微小距離計算（Braun投影）

こんにちは。
地理座標系（経度、緯度、楕円体高）を使って、十分に近い２点間の近似距離は、微小量三成分（地球楕円体接平面上でのENU方向成分）の長さから計算します（$dr=\sqrt{dE^2+dN^2+dU^2}$）[^1]、離心率 $e$、地球長半径 $R$）：

```math
\begin{align}
dE &= \left(\frac{R}{\sqrt{1-e^2\sin^2 \phi }}+h\right) \cos \phi \,  d \lambda  \\
dN &= \left(\frac{R\ (1- e^2)}{\left(1-e^2 \sin^2 \phi\right)^{3/2}}+h\right) \, d \phi \\
dU &=  dh
\end{align}
```

### Braun投影
この係数に現れる緯度$\phi$の三角関数を無くすことを考えました。考えた方法は、緯度$\phi$を使う代わりに、

```math
\chi = \tan \frac{\phi}{2}
```
という変換された変数を使うことにします[^2] [^3]。これはBraun投影図法と呼ばれる[円筒図法](https://en.wikipedia.org/wiki/Map_projection#Cylindrical)の一種です。下記のように$\chi$の四則計算式に置き換えられます。

[^1]: 「[回転楕円体面上（地球表面上）の距離などの計算](https://qiita.com/kkdd/items/c50715b0a418687f297d)」
[^2]: 参考 "[Tangent half-angle formula](https://en.wikipedia.org/wiki/Tangent_half-angle_formula#Identities)" (Wikipedia)
[^3]: $\phi=0$ ($\chi=0$) では、$dE = \left(R+h\right) \, d\lambda$、$dN = 2 \, \left(R \,\left(1-e^2\right) + h\right) \, d\chi$ となります。


```math
\begin{align}
d \phi &= \frac{2}{1 + \chi^2} \,d \chi \\
\cos \phi &= \frac{1 - \chi^2 }{1 + \chi^2}\\ 
\sin \phi &= \frac{2 \chi}{1 + \chi^2} 
\end{align}
```

### Haversine formula
[Haversine formula](https://en.wikipedia.org/wiki/Haversine_formula)（下記） の三角関数（の一部）を置き換えてみました。

```math
\operatorname{hav}\left(\frac{d}{R}\right) = \operatorname{hav}(\phi_2 - \phi_1) + \cos(\phi_1) \cos(\phi_2)\operatorname{hav}(\lambda_2-\lambda_1)
```


```math
\begin{align}
\operatorname{hav} \left(\phi_1-\phi_2\right) &= \frac{1}{2} \left( 1 - \cos \phi_1 \cos \phi_2 - \sin \phi_1 \sin \phi_2\right) \\
&= \frac{\left(\chi_1-\chi_2\right)^2}{\left(1+\chi_1^2\right) \left(1+\chi_2^2\right)} \\
\end{align}
```

### Parametric (or reduced) latitude

[parametric (or reduced) latitude](https://en.wikipedia.org/wiki/Latitude#Reduced_.28or_parametric.29_latitude) $\beta$ についても書き換えてみました。

```math
\begin{align}
\tan \frac{\beta}{2} &= \frac{2 \chi \sqrt{1-e^2}}{1-\chi^2 + \sqrt{\left(1-\chi^2\right)^2+4 \chi^2 \left(1-e^2\right)}} \\
\tan \beta  &= \sqrt{1-e^2} \tan \phi
\end{align}
```
[Swift3]SegmentedControlでViewを切り替える

# やりたいこと

SegmentedControlで複数のViewを切り替えたい場面はよくあると思うので、忘備録として書き残しておきます。

## 画面の用意
最初に、以下のようにStoryBoardでNavigationControllerを追加します。
NavigationControllerを追加したらViewControllerにSegmentedControlを設置しましょう。
また、今回切り替える子ViewControllerはコード上で作成することにします。


<img width="995" alt="スクリーンショット 2017-01-23 0.14.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/134764/6d7e5f92-b9d9-2c1a-b416-cfb8bba2131c.png">

##SegmentedControlの準備
SegmentedControlのSegueをViewControllerに作成しましょう。IBActionを作成するときはTypeをAnyではなくUISegmentedControlに設定することでダウンキャストせずに受け取ることができます。

<img width="330" alt="スクリーンショット 2017-01-23 0.23.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/134764/31b3f327-e61c-a942-36a4-50e2a5d68cbf.png">


##ViewController

ソースは以下になります。今回の例ではMapViewController,ListViewControllerという2つのVCを作成し、setupでそれらのviewを追加しています。

SegmentedControlがタップされると、引数であるsenderからselectedSegmentIndexでタップした項目を取得することができます。Indexは左から順に振られています。

switch文で項目に応じたviewを最前面に移動させて画面切り替えを行っています。


```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    var MapVC:MapViewController = MapViewController()
    var ListVC:ListViewController = ListViewController()
    
    @IBOutlet weak var segmentButton: UISegmentedControl!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setup()
        
    }
    
    
    func setup(){
        segmentButton.setTitle("Map", forSegmentAt: 0)
        segmentButton.setTitle("List", forSegmentAt: 1)
        
        MapVC.view.backgroundColor = UIColor.cyan
        ListVC.view.backgroundColor = UIColor.magenta
        
        self.view.addSubview(ListVC.view)
        self.view.addSubview(MapVC.view)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
    @IBAction func segmentButton(_ sender: UISegmentedControl) {
        
        switch sender.selectedSegmentIndex {
        case 0:
            self.view.bringSubview(toFront: MapVC.view)
        case 1:
            self.view.bringSubview(toFront: ListVC.view)
        default:
            print("")
        }
    }
}
```

実行すると以下のようにシアンの画面が表示され、SegmentedControlをタップするとマゼンタの画面を表示することができます。

<img width="300" alt="スクリーンショット 2017-01-23 21.18.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/134764/a6a86a12-1d4f-2b5a-ed95-e9e614e0c0c3.png">　<img width="300" alt="スクリーンショット 2017-01-23 21.19.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/134764/6d34b6a3-4944-9478-2cb5-add2739088cd.png">
[TouchDesigner] 便利なショートカット

![td_final.png](https://qiita-image-store.s3.amazonaws.com/0/127402/fa19171f-e2f9-04d3-d012-c6d67ecdb82d.png)

# エディター上
- P : オペレータのパラメータを表示非表示。
- O : 左下に表示されるオペレータの外観を表示非表示。
- C : カラーパレットの表示非表示。オペレータの色を自由に変更できる。

# オペレーター選択中
- A : アクティブ化
- B : バイパス切り替え
- H : すべてのオペレータを画面内に収まるように表示
- Shift + H : 選択中のオペレータを全面表示
- R : オペレータのレンダーフラグを立てる
- D : オペレータのディスプレイフラグを立てる
- Ctrl + C : オペレータをコピー
- Ctrl + V : コピーしたオペレータをペースト
- Ctrl + Shift + V : マウスの位置でコピーしたオペレータをペースト
MeshBakerとLightMappingでSetPassCallsをなるべく減らす

#概要
MeshBaker
https://www.assetstore.unity3d.com/jp/#!/content/5017
と
LightMappingを使って負荷(SetPass Callsやポリゴンや頂点数)をなるべく減らそうという試みです。

メモ書き的なノリなので、「こうしたらできました。」というのを雑に書きます。

#最終結果
SetPass Callsが33
Tris 2.9k
Verts 6.3k
↓
SetPass Callsが2
Tris 2.0k
Verts 5.4k
になりました。

#最初の状態
![CropperCapture[254].png](https://qiita-image-store.s3.amazonaws.com/0/88657/c0c49a1d-d1d0-e48d-ff77-c8990843afa8.png)

超適当にMaterialをつけたPlaneやらCubeやらを配置します。
PointLightはBaking:Mixedにしてあります。

この時のStatsはこんな感じ
![CropperCapture[256].png](https://qiita-image-store.s3.amazonaws.com/0/88657/a427dd11-78a5-8671-e6bf-86a73d52b8c2.png)

#改善する
##MeshBakerでまとめる準備をする
GameObject->CreateOther->MeshBaker->MultiMesh and MaterialBaker
でMeshBakeの準備をする。
↓
OpenTools For Adding Objectsをクリック
↓
楽をするためAnalyse…のタブでSelect Folder For …でフォルダを選択しておく。
↓
List Shaders in sceneで列挙
↓
GenerateBakerを押す。 

以上の流れをふまえた図↓
![CropperCapture[251].png](https://qiita-image-store.s3.amazonaws.com/0/88657/c2cd7a9f-393e-7a5d-dd26-36f34ee28b90.png)

##Meshをくっつける
生成されたMeshBaker-Standard-LM-1でBakeMaterials Into Combined materialを押す
↓
ちょっと処理が入るのでそれが完了したらそれの子にあるMeshBakerをInspectorに表示
↓
**LightMapping UVsをIgnore UV2からGenerate_new_UV2_Layoutに変更する。**
↓
Bakeボタンを押す（MeshBaker設定の図↓）
![CropperCapture[252].png](https://qiita-image-store.s3.amazonaws.com/0/88657/401a9197-9022-83cf-75d4-6ed03236b130.png)

##Meshが焼けた
CombinedMesh-MeshBaker-meshが生成される。
↓
元のPlaneやらCubeやらを消して確かめよう
↓
![CropperCapture[259].png](https://qiita-image-store.s3.amazonaws.com/0/88657/494188fd-7dd2-8e01-b4d0-bebbba7b4836.png)
いい感じですね。
![CropperCapture[257].png](https://qiita-image-store.s3.amazonaws.com/0/88657/e90698ad-0787-7192-8c9d-c45ff24983d4.png)
SetPassCalls5！さすがMeshBakerさん。

##LightMapを焼く。
結合したMesh(CombinedMesh-MeshBaker-mesh)のInspectorを開いて右上のStaticをチェック。
↓
Window->Lightingを開く
↓
LightMappingの設定は適当に。(Atlasサイズは大きめに撮ったけど)
↓
適当に焼くので最初から適当に値を設定してBakedGIにチェックを入れてBuildする。
↓
暫く待つ
↓
![CropperCapture[261].png](https://qiita-image-store.s3.amazonaws.com/0/88657/047532b0-32f0-7482-848b-c0aff9d52d78.png)
![CropperCapture[263].png](https://qiita-image-store.s3.amazonaws.com/0/88657/efacd8b1-d6ea-bec5-d8a1-48bb2b088fb3.png)
SetPassCallsは2になって
TrisとVertsも減りました。
WiMAX2+をUbuntuからUSBで使う

## 環境
OS: Ubuntu 14.04
機種:Huwei W01
## ケース1
UbuntuとUSBと繋ぐ
-> すぐ認識される．終わり＼(^o^)／

## ケース2
繋いだだけでは認識されない場合．
ProductIDが間違って認識されているので，以下の設定で正しいプロダクトIDとして認識できるようにする．

```bash
sudo apt-get install usb-modeswitch
tar xzf /usr/share/usb_modeswitch/configPack.tar.gz 12d1:1f01
mv 12d1:1f01 /etc/usb_modeswitch.d/
sudo gedit /etc/usb_modeswitch.d/12d1:1f01
```
`gedit`で以下のとおりに書き換える(DefaultVendor,DefaultProductを追記している)

```py
# Huawei E353 (3.se) and others
DefaultVendor= 0x12d1
DefaultProduct= 0x1f01
TargetVendor=0x12d1
TargetProductList="14db,14dc"
MessageContent="55534243123456780000000000000011062000000101000100000000000000"
NoDriverLoading=1
```
その後以下のコマンドで接続できる．もしかしたら再起動はいるかも．
`sudo usb_modeswitch -c /etc/usb_modeswitch.d/12d1:1f01`


## 参考
http://blog.kawauso.com/?p=748
http://blog.37to.net/2009/01/ubuntuemobiled21lc/
すごいErlangゆかいに学んだメモ第15章 レイジ・アゲインスト・ザ・有限ステート・マシーン


Erlang には有限ステートマシンを実装するための、`gen_fsm` が用意されている。

## 要点まとめ
- gen_server の「状態」とは、どういう変更が加えられてきたか、という累積的なもの。
- gen_fsm の「状態」とは、FSMがいまどのステート(状態)にいるか、ということを表す。
	- ステートによって決まるものは、あるイベントが送られてきた際のコンテキスト。
		- ステートとは、関数。
		- あるイベントがステートへ送られるとは、ある引数(イベント)で関数(ステート)を実行するということ
		- つまり、`イベントが送られた際のコンテキスト`というのは、どの関数(ステート)その引数(イベント)を待ち受けているのか？ということを表す。

## gen_fsm の概要図

![gen_fsm の紹介.png](https://qiita-image-store.s3.amazonaws.com/0/4428/1627924a-383a-2c5f-1e12-110618e97479.png "gen_fsm の紹介.png")

### 状態(ステート) とは
- `StateName` とは、ある状態(ステート)を表すプレースホルダ(変数名のような感じ)
	- ステートは関数。
		- ステートを実行し、別のステート(StateName) へ遷移したり、しなかったりする。
- StateName/2 は非同期イベントを処理する
	- 引数は Event(イベントとして遅れらてきた実際にメッセージ) と StateData(呼び出し先に渡されたデータ)
- StateName/3 は同期イベントを処理する
	- 引数は Event, From, StateData

### グローバルなステート
- 現在の状態(ステート)に関係なく実行されるもの
	- handle_event は非同期のグローバルイベントを処理する
	- handle_sync_event は同期のグローバルイベントを処理する

### イベントの判断
あるイベントがグローバルイベントなのか、特定の状態に対してなのか、は呼び出す関数で判断する。

StateName(通常のステート) へは

- gen_fsm:send_event/2 で非同期イベント
- gen_fsm:send_event/2-3 で同期イベント
よって send_event が使われていたらある StateName の関数へイベントが送られる。

handle_event, handle_sync_event、つまりグローバルイベントへは

- gen_fsm:send_all_state_event/2 同期
- gen_fsm:sync_send_all_state_event/2-3 非同期
Github上のプルリクエストをローカルに取り込む

<!---


--->

リポジトリをフォークした後でフォーク元に魅力的なプルリクエストがあった場合、それを取り込みたくなりますよね。hubコマンドを使えばプルリクエストをパッチとして扱い、ローカルのリポジトリに取り込めます。


```sh:hubコマンドのインストール
$ brew install hub
```

hubコマンドが使えるようになります。エイリアスなどでgitという名前でhubを実行するようにすることもあります(私はそれが気持ち悪く感じるのでしませんが)。


`hub am -3 プルリクエストのURL` という形式で指定すると、パッチが当たります。以下はslateというライブラリをフォークした後で、フォーク元のプルリクエストを取り込んでいる例です。

```sh:パッチを当てる
$ hub am -3 https://github.com/timClicks/slate/pull/32
Applying: Fix tests on python 3.5
Applying: add a .gitignore file
Applying: Convert README to reStructuredText so it looks better on github
Applying: Fix unit tests
Applying: Fix demo code
Applying: Fix setup.py so it uses README.rst as readme file
```

便利ですね。
C++Siv3D入門講座 Vol.09 new・delete・基底・派生クラス

# C++Siv3D入門講座

##newとdelete

newを使うと、プログラムの実行中にメモリを確保し、オブジェクトを生成できる。
newすると生成したオブジェクトへのポインタが返ってくる。生成したオブジェクトを見失わないように、ポインタを格納する変数を用意する必要がある。

```cpp
#include <iostream>

class MyClass{
public:
	int x;

	MyClass(int _x):
	x(_x)
	{
	}

};

int main(){

	MyClass* ptr = new MyClass(32);
	
	std::cout << "MyClassのxの値 : " << ptr->x << std::endl;
	
	return 0;
}
```

deleteを使うと、プログラム実行中にnewで確保された領域を開放することが出来る。
deleteには開放する領域のポインタを渡す。
下の例では、xの値を表示した後deleteするので、メイン関数を抜ける前にデストラクタが呼ばれる。
deleteされた後にptrのxの値を表示するとカオスな値が入っている（動作未定義）。見てみよう。
deleteしなかったらデストラクタがいつ呼ばれるか確認してみよう。

```cpp
#include <iostream>

class MyClass{
public:
	int x;
	
	MyClass(int _x):
	x(_x)
	{
		std::cout << "コンストラクタが呼ばれました" << std::endl;
	}
	
	~MyClass(){
		std::cout << "デストラクタが呼ばれました" << std::endl;
	}
};

int main(){
	std::cout << "メイン関数に入りました" << std::endl;

	MyClass* ptr = new MyClass(12);
	
	std::cout << "MyClassのxの値 : " << ptr->x << std::endl;
	
	delete ptr;

	std::cout << "メイン関数を抜けました" << std::endl;

	return 0;
}
```

##演習問題(コンソール)

1. 以下のようなクラスを定義した。MyClassへのポインタのvectorを用意し、適当な値のa(0~10ぐらい)を持ったデータ10個をnewで生成・格納し、表示した後にaが5以下の要素を削除せよ。  

>ヒント：vectorの要素のMyClassへのポインタを削除しただけでは動的に確保した領域は解放されていない。
>現時点ではremove_ifを使うとdeleteを呼べないので、whileとeraseを使って削除をすること。  


```cpp
#include <iostream>

class MyClass{
public:
	int a;

	MyClass(int _a):
		a(_a)
	{
	}
};
```


> ヒント：remove_ifを用いた形式だと、削除する要素それぞれに対してdeleteを行えないので、Vol6で紹介したwhileループを用いた形式でvectorの要素を削除するとよい。

	auto it = vec.begin();
	while(it != vec.end()){
		if(条件){
			it = vec.erase(it);
		}else{
			it++;
		}
	}


##基底クラスと派生クラス

クラスを継承することで、新しいクラスを定義することが出来る。  
継承元のクラスを基底クラス、継承先のクラスを派生クラスという。  
派生クラスは基底クラスのメンバを持つ。  

下の例の場合DerivedクラスがBaseクラスを継承している。

```cpp
#include <iostream>

class Base{
public:
	Base(int _x):
		x(_x)
	{
	}
	int x;
	void show(){
		std::cout << "x:" << x << std::endl;
	}
};

class Derived : public Base{
public:
	Derived(int _x):
		Base(_x)
	{
	}
};


int main(){

	Base obj_b(12);
	obj_b.show();

	Derived obj_d(23);
	obj_d.show();

	return 0;
}
```

>書き方

```cpp
class 派生クラス名 : アクセス 基底クラス名{
public:
	派生クラス名(引数1,引数2, ...):
		基底クラス名(引数1,引数2, ...)
	{
	}
};
```

上記の基底クラス名(引数1,引数2, ...)　で基底クラスのコンストラクタを呼ぶことが出来る。
基底クラス名(引数1,引数2, ...)　には基底クラスに渡す引数を書く。
アクセスがpublicだと基本クラスのpublicメンバが派生クラスのpublicメンバに、privateだと基本クラスのpublicメンバが派生クラスのprivateメンバになる。

##演習問題(Siv3D)
今回はEnemyを複数出すだけなので、前半課題とは別に、サンプルプロジェクトを元にを作った方が楽かもしれない。
以下のようなEnenyクラスを用意した。


>Enemy.h

```cpp
#pragma once
#include <Siv3D.hpp>

class Enemy {
public:
	static const double Radius;

	Vec2 pos;
	Vec2 velocity;
	Enemy(const Vec2& _pos);
	void update();
	void draw();
};
```

>Enemy.cpp

```cpp
# include "Enemy.h"

const double Enemy::Radius = 30.0;

Enemy::Enemy(const Vec2& _pos):
	pos(_pos),
	velocity(RandomVec2(5.0))
{
}

void Enemy::update() {
	pos += velocity;
}

void Enemy::draw() {
	Circle(pos, Radius).draw(Color(255, 0, 0));
}

```

1. Enemy型へのポインタを要素に持つvectorを用意し、newを使って敵を複数生成せよ。 

1. 画面外に行った敵を削除せよ。newで動的確保した領域もdeleteで解放すること。

## リンク
[前の回-Vol.08 GameManagerクラス・前半課題](http://qiita.com/yagiri000/items/e520029a0db9a349de84)
[次の回-Vol.10 仮想関数・ポリモーフィズム](http://qiita.com/yagiri000/items/fcf08b0fdf5cb5091fc9)
[TouchDesigner] 起動されるテキストエディタを好きなものに変える

![td_final.png](https://qiita-image-store.s3.amazonaws.com/0/127402/3c909dc8-9449-461d-9f32-f88a6db202f6.png)

TouchDesignerのスクリプティングでは、任意のテキストエディタを使用することができます。

- Editメニュー -> Preferences
- "DATs"タブ -> TextEditor

ここから、好きなテキストエディタの.exeファイルを選択します。

-------------------------------------
自分はAtom派なので、一応Atomのデフォルト保存場所まで記載しておきます。

```
C:/Users/(user名)/AppData/Local/atom/(atomバージョン)/atom.exe
```

尚、AppDataはWindows標準設定では隠しファイルで見えませんので、隠しファイルの表示を行っておいてください。
ES2015～2017に無い初見殺しコード3つ紹介

皆さんもうES2015は大丈夫でしょうか？（私はいまだに理解が怪しいものがあります）
今回はES2015にもES2016にもES2017にもまだない、
だけどよく見る構文を3つ紹介したいと思います。

# Rest/Spread Properties (stage-3)  
spread operatorのオブジェクト版（初見殺しと言いつつ、1つめは大したことなかった）。
配列や関数の引数に対する（...）はES2015で追加されたんですが、
オブジェクトに対する（...）はまだ正式な仕様になっていません。
（...）をオブジェクトに対して使うと、以下のようなコードが書けるようになります。

```js
// Rest Properties
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x; // 1
y; // 2
z; // { a: 3, b: 4 }

// Spread Properties
let n = { x, y, ...z };
n; // { x: 1, y: 2, a: 3, b: 4 }
```

Rest Propertiesは残りのプロパティを変数に入れる構文です。
逆にSpread Propertiesの方は中身のプロパティを展開するような振る舞いをします。
Spread Propertiesの方はオブジェクトをコピーするのによく使いますね。

# Class and Property Decorators (stage-2)  
@関数 の形式で記述するデコレータもよく見るんですが、
これは知らずに見ると初見殺しなコードじゃないでしょうか。
例えば次のようなコードは...

```js
@bar
class Foo{
}
```

やってることは以下と同じです（説明が雑ですね）

```js
class Foo{
}
bar(Foo);
```

やってることはシンプルで、直後のクラスに対して装飾しているだけです。
分かるとコードの見通しが良くなって良いですね。

ちなみに複数つけると...

```js
@bar;
@baz;
class Foo{
}
```

以下のようにbaz -> barの順に評価されます。  

```js
class Foo{
}
bar(baz(Foo));
```


# Function Bind Syntax (stage-0)
bind operator (::) も知らずに出くわすと「なにこれ！？」となると思います（私はなりました）。
用途はbindやcall関数などでthis参照を縛るときの糖衣構文になります。
これはまだstage-0（アイデア段階）なんですが、便利なので既に結構使われています。

例えば次のような変数を定義したとして...

```js
var foo = {
  baz: function(){
    console.log(this);
  }
}
var bar = function(){
  console.log(this);
}
```

以下のような感じで使います。

```js
// オブジェクト::関数 の形式
foo::bar;
foo::bar();

// ::オブジェクト.メソッド の形式
::foo.baz;
::foo.baz();
```

上記はそれぞれ次のコードと同じ意味合いになります。

```js
// オブジェクト::関数 の形式
bar.bind(foo);
bar.call(foo);

// ::オブジェクト.メソッド の形式
foo.baz.bind(foo);
foo.baz.call(foo);
```

特に ::オブジェクト.メソッド の方はclass内でthis参照を縛るのによく使ってるのを見ますね。
this参照を縛らない場合、以下のコードでbaz関数ではwindowが表示されますが...

```js
class Foo {
  baz(){
    console.log(this); // window
  }
  bar(){
    setTimeout(this.baz, 100);
  }
}

new Foo().bar();
```

:: をつけるだけで簡単にthisを自分にすることができます。

```js
class Foo {
  baz(){
    console.log(this); // Foo
  }
  bar(){
    setTimeout(::this.baz, 100); // ::this.baz は this.baz.bind(this) の意味  
  }
}

new Foo().bar();
```


以上、よく見るけどまだあまり解説を見ない構文3つをご紹介しました。
これがわかれば、あとはなんとなくコード読めるかなーという気がします。
Canvas で矢印を描く

# はじめに

Canvas である程度汎用的にいろいろな矢印を描くライブラリを作ったので紹介します。

# デモ&ライブラリ

最終的にこんなかんじでいろいろな形状の矢印を描くことができるようになりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/d96a8f80-54e3-3c3a-4d84-8324f1076884.png)

* デモ https://frogcat.github.io/canvas-arrow/
* GitHub https://github.com/frogcat/canvas-arrow

# 使い方

```example.html
<script src="https://frogcat.github.io/canvas-arrow/canvas-arrow.js"></script>

...
<script>
var context = canvas.getContext("2d");
context.beginPath();
context.arrow(0, 0, 200, 100, [0, 5, -20, 5, -20, 15]);
context.fill();
</script>

```

`https://frogcat.github.io/canvas-arrow/canvas-arrow.js` は CanvasRenderingContext2D の prototype に arrow メソッドを追加します。
arrow メソッドの APIはこんなかんじです。

```
context.arrow(startX,startY,endX,endY,controlPoints);
```

* **startX** : 始点の X 座標
* **startY** : 始点の Y 座標
* **endX** : 終点の X 座標
* **endY** : 終点の Y 座標
* **controlPoints** : 矢印形状を指定するための制御点の配列

controlPoints には [x1,y1,x2,y2,x3,y3...] といったように制御点の X,Y 座標値が格納されます。
座標値の意味は下図のとおり。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/58b8a03c-493f-6f8e-c81b-766cbee35b21.png)

* x 座標が正の場合には start からの相対座標、負の場合には end からの相対座標と見なす
* 終点の真上・真下を指定したい場合には `-Number.MIN_VALUE` などのとても小さな負の値を指定します

# 解説

結構短いコードです。

```canvas-arrow.js
(function(target) {
  if (!target || !target.prototype)
    return;
  target.prototype.arrow = function(startX, startY, endX, endY, controlPoints) {
    var dx = endX - startX;
    var dy = endY - startY;
    var len = Math.sqrt(dx * dx + dy * dy);
    var sin = dy / len;
    var cos = dx / len;
    var a = [];
    a.push(0, 0);
    for (var i = 0; i < controlPoints.length; i += 2) {
      var x = controlPoints[i];
      var y = controlPoints[i + 1];
      a.push(x < 0 ? len + x : x, y);
    }
    a.push(len, 0);
    for (var i = controlPoints.length; i > 0; i -= 2) {
      var x = controlPoints[i - 2];
      var y = controlPoints[i - 1];
      a.push(x < 0 ? len + x : x, -y);
    }
    a.push(0, 0);
    for (var i = 0; i < a.length; i += 2) {
      var x = a[i] * cos - a[i + 1] * sin + startX;
      var y = a[i] * sin + a[i + 1] * cos + startY;
      if (i === 0) this.moveTo(x, y);
      else this.lineTo(x, y);
    }
  };
})(CanvasRenderingContext2D);
```


1. 一旦制御点座標系で矢印のポリゴンを作る
2. そのポリゴンをアフィン変換して始点・終点座標系に投影する
3. 結果を moveTo/lineTo で描画

# まとめ

**Canvas arrow** で検索すると <http://stackoverflow.com/questions/808826/draw-arrow-on-canvas-tag> こんなかんじでソリューションはあるのですが、矢印の形を変えるたびに座標変換やら三角関数やらを考えるのは精神衛生上よくありません。大きなライブラリに依存するのもちょっと、という場合に役に立つかもしれません。