OmniAICreator/Qiita-1.07M huggingface dataset:
Python3 > zip() > それぞれのイテラブルから要素を集めたイテレータを作ります。 / *zip() > zip したリストを元に戻せます

Deep Learning用フレームワークTensorFlow。
TensorFlowの機能としてtf.SequenceExampleがあり、そのコード例が以下にある。
http://www.wildml.com/2016/08/rnns-in-tensorflow-a-practical-guide-and-undocumented-features/

そのコードの中で気になったのは以下の部分。

```py
def make_example(sequence, labels):
    ...
    for token, label in zip(sequence, labels):
        fl_tokens.feature.add().int64_list.value.append(token)
        fl_labels.feature.add().int64_list.value.append(label)
```

zip()というのは時々見かける。

http://docs.python.jp/3/library/functions.html#zip
> それぞれのイテラブルから要素を集めたイテレータを作ります。

>この関数はタプルのイテレータを返し、その i 番目のタプルは引数シーケンスまたはイテラブルそれぞれの i 番目の要素を含みます。このイテレータは、入力イテラブルの中で最短のものが尽きたときに止まります。単一のイテラブル引数が与えられたときは、1 要素のタプルからなるイテレータを返します。引数がなければ、空のイテレータを返します。次と等価です:

...

以下の文法を偶然見つけた。こういうのは検索では見つからない。

> zip() に続けて * 演算子を使うと、zip したリストを元に戻せます:

```py
>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True
```
TensorFlow > link > WILDML (2016/08/21) > protocol buffers > for serializing structured data

Jupyter Notebookつきのドキュメント。

http://www.wildml.com/2016/08/rnns-in-tensorflow-a-practical-guide-and-undocumented-features/

> RNNs are used for sequential data that has inputs and/or outputs at multiple time steps. Tensorflow comes with a [protocol buffer](https://developers.google.com/protocol-buffers/) definition to deal with such data: tf.SequenceExample.

上記のリンク先から
https://developers.google.com/protocol-buffers/
> Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for <font color=red>serializing structured data</font>

上記のWILDMLさんの記事にてprotocol buffersを使う利点が４つ紹介されている。
> but it comes with a few benefits that are worth it:

以降

気になるのはReusabilityとSeparation of data preprocessing and model code. 
RNNを使わないとしても(回帰のネットをするにしても）、この機能は便利かもしれない。
技術英語 > Programmers do not always use available data to [constrain their reasoning].

@ Code Complete (No. 17430 / 36077)

> Programmers do not always use available data to constrain their reasoning.

http://ejje.weblio.jp/content/reasoning
> 推理、推論、理論、論法、推理力、論拠、証明

続けて

> They carry out minor and irrational repairs, and they often don't undo the incorrect repairs.

そして技術的負債が増えていく、と。
機械学習(深層学習)で画像関連をやってみたい場合はじめに抑えておいた方がよいものは何か

職場で機械学習で画像関連をやってみたいんだけど、おすすめの本は何ですか？と聞かれてまともな回答ができなかったので、機械学習で画像関連をやりたい場合何を抑えればよいのかまとめてみる。


目次
1. 抑えておかなくてはいけない単語
2. まずコードをかいてみよう
3. 私が読んだ本

## 1. 抑えておかなくてはいけない単語
まず抑えておかないといけないのが畳み込みニューラルネットワーク(Convolutional Neural Network　以下CNNと記載)という単語です。
CNNは主に画像に関する機械学習において用いられています。
画像に関する機械学習をしたいのであれば、CNNを抑えておけば問題ありません。
CNNは最新の大規模画像認識の競技会(ILSVRC2016)でも応用されたものが使用されています。
そのため勉強したことが無駄になりません。
まずCNNというものがあるということを認識し、実際のコードがどうなっているのか調べ、コードを書いてみる。本等で理論を見るのは後でというのが一番の近道です。
コードをどの様に書けばいいのかは次項で記載します。

ILSVRCの概要は以下参照
http://qiita.com/taki_tflare/items/40bd1313d85513b4b861


## 2.まずコードをかいてみよう

機械学習(深層学習)全般に言えることですが、機械学習(深層学習)については扱っている内容が幅広く、全てを抑えることができません。かつ教科書等に記載されている内容はライブラリ(TensorFlow等)で実装されているため、使うだけではあれば詳細を抑える必要はありません。
そのため、はじめに抑えておく必要があるのは、実装されているコードを読むことです。
画像関連であれば、CNNを抑えておけばいいので、CNNのコードを書いてみましょう。

まず、CNNを扱っている以下のTensorFlowのチュートリアルをやってみましょう。
[Deep MNIST for Experts](https://www.tensorflow.org/versions/r0.11/tutorials/mnist/pros/index.html)
機械学習のベンチマークとして標準的に使われているMNISTという手書き数字認識(手書きの0から9までの数字の認識）を使用したチュートリアルがあります。
少しわかりづらいかもしれませんが、これを改造することで実践的な画像処理ができます。
頑張って理解しましょう。
英語が読みづらい方は日本語訳してくれている人がいますので、探してみましょう。
内容がわからない方は、解説してくれているページを探してみましょう。

参考になるページを一つ載せておきます。
実装してみてからコードの意味を理解するのに良いと考えます。
書籍転載：TensorFlowはじめました ― 実践！最新Googleマシンラーニング
http://www.buildinsider.net/small/booktensorflow

機械学習関連のフレームワークでは今のところTensorFlowがおすすめです。
情報入手が一番やりやすいため、とっつきやすいでしょう。
そのため上記のチュートリアルをやってみましょう。


##3.私が読んだ本
最後に本でどのような理論になっているのかさっと抑えておきましょう
私が読んだ本の概要を以下に記載します。

### 進化計算と深層学習 -創発する知能
http://shop.ohmsha.co.jp/shopdetail/000000004395/

深層学習の概要を抑えるのであれば、これがわかりやすいと思います。
深層学習に対する記載量はそれほど多くないです。
読み物としてもわかりやすいです。

### 深層学習 (機械学習プロフェッショナルシリーズ)
http://bookclub.kodansha.co.jp/product?isbn=9784061529021

深層学習について詳しく見たい場合はこれが良いでしょう。
一通り必要なことが載っています。

### 深層学習 Deep Learning (監修:人工知能学会)
http://www.kindaikagaku.co.jp/information/kd0487.htm

論文をもとに加筆訂正したものです。
上記ページで目次を見てみて、読みたいと思うようであれば、読むというのが良いと思います。

### Pythonで体験する   深層学習 
http://www.coronasha.co.jp/np/isbn/9784339028515/

タイトルで初心者向けのようにみえるかもしれないが、初心者向けではありません。
専門家が最新の技術要素の一覧として使うためのものです。
ILSVRCで使われている画像関連の技術ついて、どのようなものが使われているかを理解するには有用ですが、誤植や読みづらい文章が目立ちます。
特定のファイルのみにBasic認証をかける

特定のファイルのみにBasic認証をかける場合は以下の内容の.htaccessファイルおよび.htpasswdファイルを作成する。

# .htaccess
```vim:.htaccess
AuthUserfile /<パス>/.htpasswd
AuthGroupfile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
<Files ~ "^(<ファイル名>\.<拡張子>|<ファイル名>\.<拡張子>|<ファイル名>\.<拡張子>)$">
  satisfy any
  order allow,deny
  deny from all
</Files>
```

# .htpasswd
```vim:.htpasswd
<ユーザー名>:<BASE64、MD5等を用いて暗号化したパスワード>
```
ゲームDVRで録画機能が利用できない時の対処法：バックグラウンド録画をオフにする

[:link:Mikulus動画を簡単に撮影する方法](http://qiita.com/shiftsphere/items/b57c4a8ecb618d7164b8)の続編です。

#:dizzy_face:録画が出来ない状態にあるとき

　現在、Windows 10 のゲーム録画機能が使えたり使えなくなったりしています。
![xbox-gameBar-GLAY.png](https://qiita-image-store.s3.amazonaws.com/0/71326/c7f13ba1-5883-933f-fdf0-d4c90efd0e9c.png)
この**録画不能**状態から

![xbox-recRed.png](https://qiita-image-store.s3.amazonaws.com/0/71326/f83a6320-8078-1d29-aa97-186242a6f35c.png)
録画可能状態になるトリガーを見つけたのでシェアします。
必ずしもこれで上手くいくという訳ではないと思いますが、手元の環境では上手くいきました。


##:dizzy:解決方法
簡単5ステップ！

###:one:Xboxアプリを起動します。
`win`→`xbox`と打って`Enter`。
![xboxapp.png](https://qiita-image-store.s3.amazonaws.com/0/71326/ba8cd017-f49e-cbae-6c51-08f83ac3f206.png)

###:two:設定を開きます。
左端に並んでいるアイコンの一番下、歯車アイコンをクリック。
![xbox-app.png](https://qiita-image-store.s3.amazonaws.com/0/71326/2c363074-c424-4d91-e2ed-5fc3ef3096d1.png)

###:three:`ゲーム録画`タブをクリックします。
![xbox-app-setting-gameRec.png](https://qiita-image-store.s3.amazonaws.com/0/71326/2aa6180a-ded2-dbc0-4293-db7f16d57e98.png)

###:four:`バックグラウンドで録画`のチェックボックスをオフにします。
![xbox-app-setting-gameRec-background.png](https://qiita-image-store.s3.amazonaws.com/0/71326/e167be58-aa54-7a5d-6f16-5999ac83cf55.png)

オフにしました。
![xbox-app-setting-gameRec-background-off.png](https://qiita-image-store.s3.amazonaws.com/0/71326/be720311-f7aa-fd6a-b6a7-7ab7fc82106c.png)

###:five:mikulusを再起動します。
![xbox-recable.png](https://qiita-image-store.s3.amazonaws.com/0/71326/d03470c2-7bb2-c704-a4fc-ef781a70c644.png)
録画:red_circle:出来るようになりました。

##:worried:デメリット
　**バックグラウンド録画をオフ**にする方法なので、前もって録画開始(`alt + win + r`)を指示してあげないと録画されません。

#:question:残った謎
前回録画出来ない状況からできる状況になったときはこのオプションは全く触れていませんでした。また、ゲームDVRのバックグラウンド録画を有効にしたまま、GeForce Experience側のインスタントリプレイの有効・無効を切り替えても録画不能状態はかわりませんでした。
きっと録画不能になるトリガーは他にもあるのだと予想します。

#:thumbsup:動けば良いのだ
なにはともあれ、録画が出来るようになったのでok！
Apacheの<proxy balancer>指定の確認

## 概要
loadbalancer の指定を行うに当たって、conf の定義について、あまり理解できていなかった部分があったので、シンプルな環境で確認を行った。きっかけは、`<proxy balancer://~~>`ディレクティブに、/ が使えない事象が発生して、ちょっと腑に落ちない状況だったので。
例：`<proxy balancer://cluster/dir/service>`

### 環境
- macOS sierra(Host)
- Docker
  - apache 2つ
  - loadbalancer 1つ

## 1. Apache 環境準備
### DockerHub からImageを拝借
`docker pull eboraas/apache`

### ファイル編集用に、vimインストール

```
apt-get update
apt-get install vim
```

### 確認用のHTMLを用意
デフォルトで`/var/www/html`がホームディレクトリとなってたので、そこはそのまま使用。

```/var/www/html/index.html
<html>
<body>
It's work!! [apache#one]
</body>
</html>
```

フォルダー配下の表示確認を行うため、適当なフォルダを作成しHTMLファイルを設置。

```/var/www/html/dir_a/dir_b/index.html
<html>
<body>
[apache#one] /dir_a/dir_b/index.html
</body>
</html>
```

※同じようにして、apache2つ目も環境を構築。

## 2. loadbalancer 環境準備
### DockerHub からImageを拝借
`docker pull corba/load-balancer`

### loadbalancer 側からHTML表示確認

```
# curl http://172.17.0.22/
<html>
<body>
It's work!! [apache#one]
</body>
</html>

# curl http://172.17.0.22/dir_a/dir_b/
<html>
<body>
[apache#one] /dir_a/dir_b/index.html
</body>
</html>

# curl http://172.17.0.23/
<html>
<body>
It's work!! [apache#two]
</body>
</html>

# curl http://172.17.0.23/dir_a/dir_b/
<html>
<body>
[apache#two] /dir_a/dir_b/index.html
</body>
</html>
```

## balancer configテスト #1

```/etc/apache2/mods-availabled/proxy_balancer.conf
ProxyPass /balancer-manager !
ProxyPass / balancer://cluster/ lbmethod=bybusyness
<Proxy balancer://cluster/>
  # Balancer members
  BalancerMember http://172.17.0.22:80 route=1
  BalancerMember http://172.17.0.23:80 route=1
</Proxy>
<Location /balancer-manager>
  SetHandler balancer-manager
</Location>
```

### 更新ボタン押下で切り替わりを確認
![スクリーンショット 2016-11-06 2.41.08.png](https://qiita-image-store.s3.amazonaws.com/0/35621/75e4dda2-be1b-85ff-7623-e6a3a287fa4b.png)

![スクリーンショット 2016-11-06 2.40.19.png](https://qiita-image-store.s3.amazonaws.com/0/35621/5c1140e5-44be-ec98-3e83-8aa7139df1fa.png)


## balancer config テスト #2

```/etc/apache2/mods-availabled/proxy_balancer.conf
ProxyPass /balancer-manager !
ProxyPass / balancer://cluster/dir_a/dir_b/ lbmethod=bybusyness
<Proxy balancer://cluster/dir_a/dir_b/>
  # Balancer members
  BalancerMember http://172.17.0.22:80 route=1
  BalancerMember http://172.17.0.23:80 route=1
</Proxy>
<Location /balancer-manager>
  SetHandler balancer-manager
</Location>
```

### こっちも問題なく切り替わる事確認
![スクリーンショット 2016-11-06 2.49.33.png](https://qiita-image-store.s3.amazonaws.com/0/35621/2e633623-e062-9346-7b70-698f782ad4b2.png)

![スクリーンショット 2016-11-06 2.49.57.png](https://qiita-image-store.s3.amazonaws.com/0/35621/a72c1254-a585-54a2-37b1-d13847848fd3.png)

### 結果、"/" がディレクティブに使えないわけではなさそうだけど...
`<proxy balancer://~~>`に、パスの指定で”/”を定義する形になっても、動作する事は確認できた。ただ、本来の問題の原因がわかっていないので、引き続き調査必要です...

## 参考 
- http://qiita.com/maa0984/items/eb182fa480650b3af3bf
Jarの中のリソースファイルをどこかにコピーしたい

Javaアプリ開発では、クラスファイルやリソースファイルを一つのJarにまとめてパッケージングするのが一般的です。
MavenやGradleプロジェクトであれば、 `src/main/resources` ディレクトリに置くのが一般的でしょうか。

時々、リソースに含めたファイルをJar外にコピーして使いたいことがあります。
（設定ファイルのテンプレートを外に出したり、配布の都合で同梱していた実行ファイルを実行したいときなど）

`resources` ディレクトリに配置したファイル `hoge.txt` のURIは以下のコードで取得できます。

```kotlin
ClassLoader.getSystemResource("hoge.txt").toURI()
```

URIがわかればあとはこれを所望の場所にコピーすればいいのですが、Jarにした場合とそうでない場合で違いがあってはまりました。

# Jarにパッケージングしないでリソースを参照した時のURI

動作試験のために `./gradlew :run` とかした場合ですね。

Jarにパッケージングせずに実行した場合は、リソースのURIは `file:` プロトコルで、リソースファイルの場所を指します。

```
file:/path/to/project/build/resources/main/hoge.txt
```

このURIだと `File` クラスのコンストラクタに渡すことができるので、Kotlinの拡張メソッド [`File.copyTo()`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/copy-to.html) でコピーが可能です。

```kotlin
File(ClassLoader.getSystemResource("hoge.txt").toURI()).copyTo(destination)
```

しかしJarにパッケージングしてしまうと、URIをFileクラスコンストラクタに渡した途端に例外が出ます。

# Jarにパッケージングされたリソースを参照した時のURI

`jar:` スキームのURIが得られます。

```
jar:file:/path/to/jar/file/MyApp.jar!/hoge.txt
```

これをそのままFileのコンストラクタに渡すと ` java.lang.IllegalArgumentException: URI is not hierarchical` が発生します。

コピー元Fileが得られればコピーが楽なのですが、得られないのでそうはいきません。

どうすればいいかと言うと、リソースを開くInputStreamから内容を取り出して、コピー先ファイルに書き込んでしまえば良さそうでした。

自力でコピーメソッドを書くこともできますが、便利なメソッドがすでにあるので使わせてもらいましょう。

JDK付属の [`Files.copy()`](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html#copy-java.io.InputStream-java.nio.file.Path-java.nio.file.CopyOption...-) (Java 1.7から実装)を使うか、[Commons IO](http://commons.apache.org/proper/commons-io/)の [`FileUtils.copyURLToFile()`](http://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/FileUtils.html#copyURLToFile(java.net.URL,%20java.io.File)) か [`FileUtils.copyToFile()`](http://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/FileUtils.html#copyToFile(java.io.InputStream,%20java.io.File)) を使うのがお手軽でしょう。

```kotlin
val srcIs: InputStream = ClassLoader.getSystemResourceAsStream("hoge.txt")
val srcUrl: URL = ClassLoader.getSystemResource("hoge.txt")

// Files.copy() の場合
Files.copy(srcIs, destination.toPath())

// FileUtils.copyURLToFile()の場合
FileUtils.copyURLToFile(srcUrl, destination)

// FileUtils.copyToFile()の場合
FileUtils.copyToFile(srcIs, destination)
```


とりあえずリソースファイルはURLやURIで扱うのではなく、Streamで扱ったら間違いないようです。
ubuntuの導入(VirtualBoxでの仮想化)

#環境
MacBookPro OSX 10.10.5

#手順
##1.VirtualBoxをインストールする。
すぐ終わる。
##2.仮想マシンの設定とubuntuのインストール。
*https://www.ubuntulinux.jp/download
ここから日本語remixイメージをダウンロード。
仮想ハードディスクイメージもあるけどサポートが遅いらしいので上のisoファイルを選択。

*新規仮想マシンを作成
あんまり使う予定はないので大体こんな感じ。
負担をかけたくないのでメモリも1GB。
<img width="882" alt="スクリーンショット 2016-11-06 0.57.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/147926/8fd55566-3184-8948-6b3d-e3417f78100c.png">
<img width="882" alt="スクリーンショット 2016-11-06 0.58.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/147926/a956d890-e28e-bfc5-98d6-fd25f339c810.png">
<img width="882" alt="スクリーンショット 2016-11-06 0.58.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/147926/a50ed67d-e067-3178-01f0-a102203000a3.png">

*...スクショの取り方を調べてなかった...
のであとは適当にやったら終わりました。特に特殊な設定にはしてません。

...ちょっと遅いかも

参考:http://www.morinao-freelan.com/entry/2016/02/26/MacにVirtualBoxとUbuntuをインスールしてみた
iTerm2の導入

#iTerm2の導入と初期設定
##iTerm2とは
　iTerm2は、Terminalをより使いやすくしたアプリケーションです。

##ハードウェア
- MacBook Pro (Retina, 13-inch, Mid 2014)
- OS X Yosemite
- Terminal (zsh)

##iTerm2の導入方法
###iTerm2をインストールする
　まず、下記のURLにアクセスし、iTerm2をダウンロードします。
https://www.iterm2.com/

　Downloadsにある、ダウンロードしたファイルを解凍する。そして、iTerm2をApplicationに移動する。

　iTerm2を起動できたら、インストール完了。

##iTerm2の設定
　iTerm2 -> Preference -> Profiles -> Colors -> Color Presetsで好きなカラーにカスタマイズできます。
　Presets ->　Importで外部からダウンロードしてきたPresetsを追加することができます。
Raspberry Pi 2 B+ でbanggood.comの激安3.5インチLCDを使う。

自分用にメモ。

動機
---

* banggood.comで[激安の3.5inchタッチ液晶](http://www.banggood.com/3_5-Inch-320-X-480-TFT-LCD-Display-Touch-Board-For-Raspberry-Pi-2-Model-B-RPI-B-p-1023432.html)を買った
* しばらく放置していたけれどRapberry Piで動くようにしようと思った

方針
---

* ドライバパッチを当てたOSイメージを使うのが楽そうなのでそれでやる
* 実施環境はWindows10だけど、Windows環境ならたぶん大丈夫
    * Macならディスクライターの代わりに`dd`とか使えばいいんじゃないかな（適当）

手順
---

### OSイメージをダウンロードする

[ココ](http://www.spotpear.com/download/image/)から液晶サイズに対応したOSイメージをダウンロードする。

ダウンロードに時間がかかるので気長に（一晩放置した）。

ダウンロードしたら解凍しておく。

### イメージライターをダウンロードする

[ココ](http://www.spotpear.com/download/software/Raspberry-Pi/Win32DiskImager.zip)から`Win32DiskImager.zip`をダウンロード。

ダウンロードしたら解凍する。

### イメージライターでmicroSDに書き込む。

フォーマット済みのmicroSDを用意して（フォーマットしてなくても上書きされるはずだけど）、イメージを書き込む。

`Win32DiskImager.exe`を起動して、解凍したOSイメージ（試したときは`RPi-35inch-LCD-Raspbian-160728.img`だったけど、`160728`の部分はバージョンなので適宜読み替え）を選択する。

書き込み先ドライブがmicroSDのドライブになっていることを確認して`Write`ボタンをクリックする。

数分待てば出来上がり。

### 書き込んだmicroSDから起動。

Raspberry Piに液晶を取り付け、microSDを挿して起動する。最初は真っ白になるが1, 2分後くらいにブートログが表示され始めて起動する。

おめでとうございます。

課題
---

3.5インチ 480x320だと、普通に使うには画面が小さすぎてちょっと使いにくいので、何か考えないと。

参考
---

* http://www.spotpear.com/learn/EN/raspberry-pi/Raspberry-Pi-LCD/Drive-the-LCD.html
* http://www.spotpear.com/learn/EN/raspberry-pi/Raspberry-Pi-LCD/Install-the-image-to-your-raspberry-pi.html
Windows Phoneで拡張子を変更する方法を調べるが、わからなかった。

Windows Phoneで拡張子を変更する方法を調べるが、わからなかった。拡張子を変更するというか、ある拡張子のテキストファイルをテキストエディタで扱う方法を調べていたのだができなかった。割り当て方法が見つからない。
標準でワードが入っていたので、ワードを開いてそのファイルを開こうとしたが、ツリーを辿ることはできたものの、ファイルはフィルタリングするようで、見つけられない。
エクスプローラでクリックすると、「ストアアプリを探しますか?」となってしまう。探しても見つからないので、それでは解決にならない。これも作るしかないか。
Mac OS で git の環境構築用メモ

# SourceTree
* 公式サイト（ https://www.sourcetreeapp.com/download/ ）から入れる
* 『Install Command Line Tools』しておく。（AppStore 版にはこれがない）

# Tools
zsh 上で

```zsh
brew install hub
go get github.com/motemen/ghq && cd ghq && sudo make install && cd .. && rm -rf ghq

```

# Config
## ~/.gitconfig

```text
[push]
        default = simple
[credential]
        helper = osxkeychain
[alias]
        graph = log --graph --date=short --decorate=short --pretty=format:'\t%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
        gr = log --graph --date=short --decorate=short --pretty=format:'\t%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
        ci = commit --allow-empty
        co = checkout
        stat = status
        st = status
        whom = show --date=short -s --format=\"%Cgreen%h %Creset%cd %Cblue%cn %Creset%s\"
        all-branch = branch --all --verbose
[merge]
        ff = false
[ghq]
        root = 'path-to-root'
```



```zsh
git config --global core.editor 'subl -n -w'

cat <<__EOF > ~/.zsh/git.zsh
function peco-src () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-src
bindkey '^]' peco-src
__EOF

cat <<__EOF > ~/bin/peco-sha
#!/usr/bin/env zsh
peco --prompt 'Get SHA of >' | head -n 1 | perl -ne'/([0-9a-f]{6,})/ and print \$1;'
__EOF

chmod +x ~/bin/peco-sha
```
Elite X3の音声入力。

Elite X3の音声入力。Cortanaとかいうらしい。使ってみるが、まったく認識しない。辞書がないとか警告が一瞬出たが、次からはなくなった。なくなったのに、何度話しかけても認識しない。のどがかれた。音声認識の悪夢…。
WindowsPhone版の全画面カレンダーを探す。背景に画像を貼れるもの。

One Calendar
カレンダーアプリ。
Live(Hotmail、Live、Outlook.com)、Facebook、Exchange(Exchange、Office 365)、Gmailのアカウントを登録して各カレンダーの登録情報を扱えるらしい。Gmailは可能。
プリインストールのOutlookカレンダーは、月表示では上半分に月、下側に今日の予定を表示する。月の予定はマーキングのみで、内容を一覧できない。これがもうぜんぜんダメダメだが。
One Calendarは、全画面で表示する。予定ごとの文字数は7文字×2行の14文字。予定の種類によって、グリーン地に白抜き文字など、見やすいとはいいがたいが、まあかろうじて許容範囲か。
背景の登録は有料版のみらしい。
11月は水玉模様で、すこし寒そうな気もするが、これもまあ許容範囲。いずれ自作しよう。自作までのつなぎなので。
Androidで並列リクエストがやりたい

phpのcurl_multiみたいなことがやりたくて調べました。

結論は、これだというのは見つからなかったので、うまいやりかたをご存知な方がいらっしゃいましたら教えていただければ幸いです。

# やりたいこと
例えばですが、記事一覧取得APIを叩いたあとに、記事詳細取得APIを叩いて、条件に合う記事の詳細を複数取得したい。みたいなことがやりたいです。

# 思いつく方法
ざっとですが。

## CountDownLatchで処理がすべて終わるのを待つ。
for文でAsyncTaskなどを繰り返しAPIを叩いて、都度、処理が終わったらcountDown()するを繰り返す感じです。
これが一般的だと勝手に思ってますが、処理を強制的に止めるので個人的にはあまり好きじゃないんです。

## そもそもAPIを改修する。
これがスマートな気もしますが、外部のAPIだと難しいでしょうし、今回みたいな場合だと、詳細情報つきでレスポンスが返ってくるとなかなかの容量になったりします。

## あきらめる。
自分で書いててよくわからないですが、情報の取得が終われば都度更新をかけてやるようにすれば、Latchを使わなくてもいけることがあるかもしれません。

# おわりに
調べきれませんでした、Rxを使えば簡単にできるよとかあるかもしれません。
RxAndroidというのもあるので、そのあたりしっかり理解したいと思います。
Windows Phone用のPDFリーダーを見つける。

Windows Phone用のPDFリーダーを見つける。
背景に画像を登録できればベスト。
check pointは、

(1)scrollでなくページ送りできる。
(2)拡大してページ送りできる。
(3)背景色を変更できる。
(4)背景に画像を登録できる。

・openPDF+ 論外。縦PDFを正常に表示できない。
・Kdan ページ送りできない。
・PDF reader ページ送りできない。
・Xodo ページ送りできる。背景色を変更できる。ただし、背景色を変更するとカラーのイラストがモノクロになる。
『HARD THINGS』

2015年に流行った書籍（たぶん）で、他の書籍に浮気しつつ半年かけて読了しました。
購入時、6月のサンフランシスコ出張時に読み切ろうと思っていたのが、気づくともう11月に・・・（笑）

※以下、書籍の内容を紹介しており、ネタバレあるよ

[HARD THINGS / ベン・ホロウィッツ (著)](http://amzn.to/2fOgZWg)

## 書籍の内容構成

*ベン・ホロウィッツ*という起業家、CEOを経てベンチャーキャピタリストを努めている方の半生?を、ビジネスシーンにおける窮地に陥った時（ほとんど窮地）、それを乗り越えた時の経験について教訓と共に描かれている。

## 総括

僕自身がテクノロジー・ビジネスに携わっているため、

- 魔術的に素晴らしい製品を創造すること
- 製品を開発する為に必要なチームを維持し続けること（お金を稼ぐこと）

の狭間で揺れることがあり、どこかに良い答えがあるんじゃないかと思うことがある。

「 **その幻想をぶち殺す!!** 」ばりに、本書は「 **困難な問題を解決する答えなどない** 」ということを教えてくれる。
しかし、ネガティブな事象を乗り越えるための助言を貰えるし、結局のところ考えに考え抜いた上で「 **やってやんよ** 」しかねーなという結論にいたれたので、読み終わりは満足な一冊だった。

## 章ごとの振り返り

以下、目次ベースに簡単に振り返りってみる。

```
第1章　妻のフェリシア、パートナーのマーク・アンドリーセンと出会う
```

ベン・ホロウィッツという人物について、高校時代、奥さんとの出会いを紹介されいていくうちに、話しに引き込まれていった。

特に高校のフットボール監督の最初の訓示、

*「お前らの中には、いい加減な気持ちでここへ来た者がいるはずだ。そういうヤツらは、べらべらと愚にもつかんクソな無駄話をして、クソな時間を潰し、まともなことはやらん。フットボールのユニフォームを着ればかっこよく見えるだろうなんて思っている。そんなヤツらはどうなるか知っているか？ 辞めちまえ！」*

監督が受け入れられない行動について詳しく説明している場面、

*「練習に遅れて来る？ 辞めちまえ！ ぶつかり合いが嫌だ？ 辞めちまえ！ 全力で走らない？ 辞めちまえ！ オレをチコと呼ぶ？ 辞めちまえ！」*

など、ウダウダ言ってるくらいなら「辞めちまえ！」て思うことあるよなーとか思いつつ（笑）


また、そのちょっと乱暴な表現（原著もかな!?）も第2章以降のタイトルも自然と受け入れられていく感じ。


```
第2章　生き残ってやる
第3章　直感を信じる
```

ネットスケープ創業者 マーク・アンドリーセンと立ち上げたラウドクラウドが紆余曲折を経て倒産が視野に入った後、

*「会社の方向性に関する提言はいらなかった。今は戦時なのだ。」*

平時のCEOから戦時のCEOへ変わった様が、とても臨場感に溢れていた。

*「勝てる製品を持たない限り、生き残る道はない。...（略）... 銃には一発だけ弾が残っていて、標的に命中させなくてはならない」*

とか、僕自身も過去に「結構大きな投資をして貰っていたプロダクトをお蔵入り」にしたり「会社ごと消えてなくなる」などの経験があり、ベンの思惑通り？ 感情移入し読めました。まぁ、ベンに比べたら僕なんて（笑）。


```
第4章　物事がうまくいかなくなるとき
第5章　人、製品、利益を大切にする ー この順番で
第6章　事業継続に必須な要素
第7章　やるべきことに全力で集中する
第8章　起業家のための第一法則 ー 困難な問題を解決する法則はない
```

ベンの実体験からくるアドバイスに真剣に耳を傾ける章です。
僕個人的には、第5章と第7章が好きでした。プロダクトを作るには！？ってことを真剣に考えることができたし、1点に集中していたく感じは好きです。

```
第9章　我が人生の始まりの終わり
```

テクノロジー・ビジネスでは、事前によそうができることは非常に少なく、凡庸な製品と魔術的に素晴らしい製品との差は、社員に厳しく責任を求める会社運営と、社員が創造性を発揮するためなら必要なリスクを取ることを許す経営との差にある。

## 最後に

この内容で、1,800円はお得だと思う。
Windows環境でMTUの設定の方法

# インタフェースを確認します
ターミナルを開き、以下のコマンドを打ちます。
```
netsh interface ipv4 show interface
```

このようにインタフェース一覧が出ます。
Loopback以外のconnectedのインターフェースが接続されているインタフェースになります。

```
C:\Users\takish>netsh interface ipv4 show interface

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 18          65        1500  disconnected  Bluetooth ネットワーク接続
  9          50        1500  connected     Wi-Fi
 15          25        1500  disconnected  ローカル エリア接続* 3
```

ここではIdx 9のWi-Fiが該当するインタフェースでした。

# MTUを探索する

```
C:\Users\takish>ping -f -l 1472 -n 1 www.nic.or.jp

www.g.yahoo.co.jp [183.79.104.226]に ping を送信しています 1472 バイトのデータ:
192.168.1.1 からの応答: パケットの断片化が必要ですが、DF が設定されています。

183.79.104.226 の ping 統計:
    パケット数: 送信 = 1、受信 = 1、損失 = 0 (0% の損失)、
```


```
C:\Users\takish>ping -f -l 1473 -n 1 www.nic.or.jp

www.g.yahoo.co.jp [182.22.96.241]に ping を送信しています 1473 バイトのデータ:
パケットの断片化が必要ですが、DF が設定されています。

182.22.96.241 の ping 統計:
    パケット数: 送信 = 1、受信 = 0、損失 = 1 (100% の損失)、
```

WindwosのPingは実態としてはUDPパケットが送られているため、
（RFC的に言うとICMPで送るべきなのですが、途中のルーターなどで落とされることが多いためUDPで送ることが多いです）
IPヘッダ：20byteとEtherフレーム8byteを足したものが送出されるパケット長となります。
故にMTUは、1472+20+8=1500byte
となります。

# MTUを設定する
以下のコマンドで探索したMTUを設定します。

```
netsh interface ipv4 set interface 9 mtu=1500
```
[Swift3] 文字列操作

Swift3での文字列操作をまとめる。

# 部分文字列の取得
## 先頭文字取得
~~~
let str = "1234567890"

// 先頭文字から一文字分を進める
let index = str.index(after: str.startIndex)
let partStr = str.substring(to: index)

print(partStr)
/* 1 */
~~~

## 先頭文字以降の文字列取得
~~~
let str = "1234567890"

// 先頭文字から一文字分を進める
let index = str.index(after: str.startIndex)
let partStr = str.substring(from: index)

print(partStr)
/* 234567890 */
~~~

## 末尾文字取得
~~~
let str = "1234567890"

// 末尾文字から一文字分戻る
let index = str.index(before: str.endIndex)
let partStr = str.substring(from: index)

print(partStr)
/* 0 */
~~~

## 末尾以前までの文字列を取得
~~~
let str = "1234567890"

// 末尾文字から一文字分戻る
let index = str.index(before: str.endIndex)
let partStr = str.substring(to: index)

print(partStr)
/* 123456789 */
~~~

## 間の文字列を取得
~~~
let str = "1234567890"

let startIndex = str.index(str.startIndex, offsetBy: 3)
let endIndex = str.index(str.endIndex, offsetBy: -2)
let partStr = str.substring(with: startIndex..<endIndex)

print(partStr)
/* 45678 */
~~~
[vDSP][Swift3] ポインタの扱い

#vDSPのSwift3対策

Swift3になってから、ポインタの扱いが変わりました。
vDSPはC/C++で書かれたライブラリで、関数はポインタの引数を当てる必要があります。

特にvDSPではオリジナルなデータ型が多く、Swiftでは型のキャストを行う頻度が高いです。

ここでは、Swift3にアップデートした際に生じた問題を、少しづつまとめていければと思います。

#DSPComplex型

vDSP_ctoz()を使用して、サンプルデータをDSPSplitComplex型に格納する際に、サンプルデータ (FloatもしくはDouble)からDSPComplex型に変換する必要があります。

正確には、[Float] or [Double]型からUnsafePointer<DSPComplex>型に変換します。

以前では

```swift.swift
var buffer:[Float] = [Float](count:fftsize,repeatedValue:0.0)

/* buffer にサンプルデータ格納*/

let complexBuffer = UnsafePointer<DSPComplex>(&buffer) 
vDSP_ctoz(complexBuffer, 2, &splitComplex, 1, self.ffthalfsize)

/*FFT*/
```

というふうに行なっていました。
Swift3ではここでエラーが起こります。

ここで、

```swift3.swift

var buffer:[Float] = [Float](count:fftsize,repeatedValue:0.0)

/* buffer にサンプルデータ格納*/

let audioBufferComplex:UnsafePointer<DSPComplex> = UnsafeRawPointer(buffer).bindMemory(to: DSPComplex.self, capacity: buffer.count)
        
vDSP_ctoz(audioBufferComplex, 2, &splitComplex, 1, self.ffthalfsize)

/*FFT*/
```

Inversion FFT の場合では、とりあえず以下のように対応しました。

``` swift3.swift

var result = [Float](repeating: 0.0,count: Int(self.fftsize))
let resultAtComplex = UnsafeMutablePointer<DSPComplex>.allocate(capacity:result.count)

vDSP_fft_zrip(self.setup, &splitComplex, 1, self.log2n, FFTDirection(FFT_INVERSE))
vDSP_ztoc(&splitComplex, 1, resultAtComplex, 2, self.ffthalfsize)
        
let FloatP = UnsafeRawPointer(resultAtComplex).bindMemory(to: Float.self, capacity: result.count)
resultAtComplex.deallocate(capacity:result.count)
result = Array(UnsafeBufferPointer(start:FloatP,count:result.count))

```

他、問題や対策が見つかれば、その都度書き加えたいと思います。
cssでドットの罫線を引く（行跨ぎ対応）

# 前置き
テキストに装飾を施したいとこは割と多いかと思います。
１行の、さらに１部分であればいくらでも表現できるのですが、行を跨ぐとなると難しく、また表現も絞られます。
それでも少しでもテキストを飾るため、ドットの罫線をcssで表現してみました。

# サンプル
http://jsdo.it/bgn_nakazato/4zeMr

# 仕様
- X軸の```linear-gradient```の色指定と```background-color```の色指定を合わせることで、見えない無数の縦線を引きます。
- X軸の```background-size```を```linear-gradient```の各サイズ指定*2に指定することで、ドットのサイズを調整します。（上で引いた無数の縦線によって、横線が打ち消されドットのようになります）
- Y軸の```background-size```と```line-height```の値を合わせることで、テキスト上の正しい位置で罫線を描画します。
- ```padding-bottom```に```linear-gradient```のサイズ指定と同じ値を設定することで、テキストの最終行に罫線を描画します。
- 1pxのドットを引く場合、ieでは潰れてしまう（拡大表示をすると表示されるのですが、100%表示では非表示になる）ので、グラデーションの開始の値を1.1pxにします。

これを踏まえて、各指定を変更してカスタマイズしてください。

# 参考
CSSだけでノート風の罫線を作る（http://www.mk2-style.com/blog/archives/1387）

ありがとうございます！
Sphinx で出力フォーマットに応じて処理を分ける

 Sphinx には only ディレクティブというのがあり、出力フォーマットに応じて処理を分けることができます。
これを使用し、以下のように出力フォーマットに応じて処理を分けてみます。

- HTML で出力する場合には SVG の画像を読み込む
- LaTeX 経由で PDF を出力する場合には分割された PNG の画像を読み込む

# 記述方法

以下のように記述します。

```
.. only:: html

   .. image:: img/01.svg

.. only:: latex

   .. image:: img/01.png
   .. image:: img/01_001.png
   .. image:: img/01_002.png
```

うーん、面倒ですね。
他にも `AutoImage` という拡張もあるのですが、出力フォーマットに応じて読み込む画像を変えるということはできなさそうでした。

# 関連

- [PlantUML で出力フォーマットに応じて処理を分ける](http://qiita.com/kuttsun/items/1e0b106ad90ff47188ec)
PlantUML で出力フォーマットに応じて処理を分ける

PlantUML にはプリプロセッサの機能があり、C言語などと同じように定数定義や ifdef などが使用できます。
これを使用し、以下のように出力フォーマットに応じて処理を分けてみます。

- PNG で出力する場合には newpage により画像を分割して出力する
- PNG 以外で出力する場合には画像を分割しない

# 定数の定義の仕方

PlantUML のコード上では、以下のように定義します。

```
!define _PROJECT_NAME_ ProjectName
```

また、コマンドライン引数でも定数は定義できます。

```
> plantuml.jar -DPNG="png" hoge.puml
```

`-D` が定数定義するオプションで、その後に続く文字が定義する文字列です。
つまり、上記は以下の定義と同じ意味です。

```
!define PNG "png"
```

これで、上記のようにコマンドライン引数で定数を定義しつつ、PlantUML 内のコードに以下のように記述すれば、PNG で出力するときのみ画像が分割されることになります。

```
!ifdef PNG
newpage
!endif
```

# 関連

- [Sphinx で出力フォーマットに応じて処理を分ける](http://qiita.com/kuttsun/items/f34e7f304902222220d1)
RNN > vanilla RNN > LSTM RNNとの違い?

Recurrent Neural Networks (RNNs) 関連。

http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/

>  For now, just be aware of the fact that <font color=red>vanilla RNNs</font> trained with BPTT have difficulties learning long-term dependencies (e.g. dependencies between steps that are far apart) due to what is called the vanishing/exploding gradient problem. 

tutorialなどで耳にしてきたvanilla RNN。

http://stats.stackexchange.com/questions/226179/how-to-choose-between-plain-vanilla-rnn-and-lstm-rnn-when-modelling-a-time-serie

> How to choose between plain vanilla RNN and LSTM RNN when modelling a time series?

という質問。

色々な回答やコメントがついている。

現段階では、LSTMはRNNの学習方法？のようなものと認識していたが、vanilla RNNとLSTM RNNという２種類のものがあるのだろうか。
PowerShell から LINE Notify を送る

# 準備

[[超簡単]LINE notify を使ってみる](http://qiita.com/takeshi_ok_desu/items/576a8226ba6584864d95)
こちらの記事を参考にしてトークンを取得します。（とても参考になりました）
なお、今回の実行環境は Windows 10/PowerShell5.0 です。

# サンプル
以下、簡単なサンプルです。

```ps1:linenotify.ps1
# パラメータ設定
# Line Notify エンドポイント
$uri    =  "https://notify-api.line.me/api/notify"

# トークン
$token  = "Bearer 取得したトークン"

# トークンをリクエストヘッダ内Authorizationに指定
$header = @{Authorization=$token}

# POSTパラメータにメッセージを指定
$body   = @{message="PowerShell から LINE Notify"}

# ★リクエスト実行
$res = Invoke-RestMethod -Uri $uri -Method Post -Headers $header -Body $body 

# デバッグ用結果表示
echo $res

```

# 実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124069/5bae49c3-d57c-4b53-1462-b83200ce915a.png)
無事に送られてきました。

なお、 `echo $res` の部分では、正常時に以下の表示がされます。

```正常時出力
status message
------ -------
   200 ok     
```

`$res.status` や `$res.message` のようにアクセスできるのも便利です。


# おわりに
簡単にできて、Windows 標準で実現可能なので、活用ができるのではないでしょうか。
RNN > RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 – INTRODUCTION TO RNNS > 翻訳版にはない注記

Recurrent Neural Networks (RNNs) 
の面白そうな記事を見つけた。
http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/

以下で翻訳を見つけた。
http://qiita.com/kiminaka/items/87afd4a433dc655d8cfd

翻訳を読んでいたが、いくつかの文書は抜けている。完全翻訳でもないようだ。

具体的には、WHAT ARE RNNS?節の以下の文章の対応する翻訳が見つからないようだ。

個人的に興味をひかれた部分を色付けしてみた。

> There are a few things to note here:

> You can think of the hidden state $s_t$ as the memory of the network. $s_t$ captures information about what happened in all the previous time steps. The output at step $o_t$ is calculated solely based on the memory at time $t$. As briefly mentioned above, it’s a bit more complicated  in practice <font color=red>because $s_t$ typically can’t capture information from too many time steps ago</font>.

> Unlike a traditional deep neural network, which uses different parameters at each layer, <font color=red>a RNN shares the same parameters ($U$, $V$, $W$ above) across all steps</font>. This reflects the fact that we are performing the same task at each step, just with different inputs. <font color=red>This greatly reduces the total number of parameters we need to learn</font>.

> The above diagram has outputs at each time step, <font color=red>but depending on the task this may not be necessary</font>. For example, when predicting the sentiment of a sentence we may only care about the final output, not the sentiment after each word. Similarly, <font color=red>we may not need inputs at each time step</font>. The main feature of an RNN is its hidden state, which captures some information about a sequence.

余談
Qiitaでは数式表示にも色をつけられるようになっている。前からなのか不明だが、これは便利かもしれない。
AWSに登録してwebサーバーを立ち上げてみる

## はじめに
AWSに登録して、無料利用枠内で適当にサーバを立ててみたときのメモです。

## AWSとは
- Amazon Web Serviceの略で、amzonが運営するクラウドサービス。
- microsoftのazure、IBMのSoftLayerみたいなもの。
- 必要に応じてパブリッククラウド上のサーバやDBを簡単に増設できる。

## AWSのアカウントを作成する。

- [AWS](https://aws.amazon.com/jp/)にアクセスし、「今すぐ無料アカウントを作成」をクリックする。

<img width="1338" alt="名称未設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/142359/0362f10e-a6aa-8726-3704-043bdeb39a67.png">

- 名前やアドレス、電話番号、クレジット情報などを入力します。
- 自動音声通話によるアカウント認証があります。
- サポートプランはベーシック（無料）を選択しましょう。それ以外は有料サービス。
 
## EC2を用いて仮想サーバーを立てる。

### EC2 とは

- Amazon EC2(Amazon Elastic Compute Cloud) とは、クラウド内でサイズ変更が可能なコンピューティング処理能力を提供するウェブサービスです。
- 詳しくは、https://aws.amazon.com/jp/ec2/ 

- サインインして、サービス一覧からEC2を選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/142359/a98bf3b3-3ba8-a1ac-d145-def05d4d8f53.png)

- 画面右上に表示されているリージョンをデフォルトからアジアパシフィック(東京)に変更します。
    - リージョンとは物理的にそのサーバが位置している場所なので、日本で利用するなら普通に東京でいいと思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/142359/9369d72a-6509-f747-e5f8-dc7cf589b4f3.png)

### インスタンスを作成する

- 「インスタンスを作成」をクリックします。
- OSはAmazon Linux AMIを選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/142359/98e4dfc0-9813-a85c-fe3a-c4a46fca419f.png)

- インスタンスタイプの選択、インスタンスの設定、ストレージの追加はデフォルトのままでOK。
- インスタンスのタグ付けでは、キーに「Name」、値に何か適当な名前をつけます。
    - ここではWebserverTestとつけました。
- セキュリティグループの設定では、ルールの追加で、HTTPを追加します。

![image](https://qiita-image-store.s3.amazonaws.com/0/142359/1260a073-06f8-06c6-010b-5381db916012.png)

- 全ての設定が完了し、作成をクリックすると、キーペアの作成が求められます。
    - 適当にキーペアに名前を入力し、ローカルにダウンロードします。これは後でsshで接続する際に利用します。
- キーペアがダウンロードできたらインスタンスを作成を開始します。
 
![image](https://qiita-image-store.s3.amazonaws.com/0/142359/468ce602-eb69-4ccd-bb59-76d25920672a.png)

- インスタンスは数分(このときは3分程度)で作成されます。
- インスタンスの作成状況は、[EC2ダッシュボード] > [インスタンス]から確認できます。作成したインスタンスの状況がrunning、スタータスチェックが合格となれば作成は完了しています。

## sshで仮想サーバに接続する
### 接続情報を確認する
- EC2ダッシュボードから作成したインスタンスを右クリックして、接続をクリックし接続情報を確認します。
 
![image](https://qiita-image-store.s3.amazonaws.com/0/142359/7680ddaf-b0f8-237e-33df-9a61103c6f9c.png)

### キーファイルを配置し、接続する

- 先ほどダウンロードしたプライベートキーファイル(***.pem)をカレントディレクトリに配置します。

`chmod 400 ***.pem` （赤枠上） と入力し、キーファイルのパーミッションを設定します。

- 画面に表示されている例（赤枠下）をコピーしてターミナルに入力し、接続確認されるのでyesと入力すると、ログインができターミナルに以下の文字が表示されます。
- これで接続が完了しています。

```
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|
```

## webサーバーを立てて接続する
### 必要なツールをインストールする

- sshで接続された状態で、始めにシステムのアップデートをし、httpd、php、mysqlをインストールします。

```text:コマンド
sudo yum update
```

```text:コマンド
sudo yum -y install httpd php mysql update
```

### webサーバーの設定を行う
- webサーバーを立ち上げ、設定を行う。

```text:コマンド
sudo service httpd start
```

```text:コマンド
sudo chkconfig httpd on
```

- index.htmlを作成する。

```text:コマンド
sudo vi /var/www/html/index.html
```

```html:index.html
<html>
Hello EC2!
</html>
```

- 作成したインスタンスのパブリックDNSを入力し、ブラウザから接続すると、webページが公開されていることが確認できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/142359/dded1573-50c3-8cb4-b755-534e3a281d1b.png)

## 追記

- SSHに接続できないときは、ルートテーブルがインターネットからの送受信を許可するように設定されていないかもしれないです。以下の設定が必要です。

1. vpcのインターネットゲートウェイを新規作成して、VPCをアタッチする
2. ルートテーブルに、作成したインターネットゲートウェイを追加する（送信先は0.0.0.0/0）
Go で EventEmitter のコードを自動生成するツールを作った

# 前置き

Go で EventEmitter/Dispatcher 的なことをしたい場合、 [emission](https://github.com/chuckpreslar/emission) や [go\-pubsub](https://github.com/mattn/go-pubsub) などの既存のライブラリを使うのが最も手っ取り早いと思いますが、

[golang で event emitter/dispatcher 的なもの \| tech \- 氾濫原](https://lowreal.net/2014/08/19/1)
> リフレクションで型変換は隠蔽されているが、もしリスナーとエミッターとで型が食い違っていると、実行時エラーになる。

> 「イベント名」というパラメータが存在せず、型の選択によって自動的にディスパッチされる。よって型がマッチしなければリスナーは実行されないので、原理的に型変換の実行時エラーは発生しない (もし間違えた場合単に実行時になって「呼ばれない」ことに気付く)

で解説されている通り、上記ライブラリではコードにミスがあった場合、実行時でないとその問題が露見しません。

やはり静的型付け言語を書いている以上、コンパイル時にミスは発見できてほしい…ということで、コンパイル時に型チェックできるような EventEmitter を `go generate` で自動生成するツールがあったら、それなりに需要があるんじゃないだろうかと思い、作ってみました。

https://github.com/shiwano/genem

# インストール

```
$ go get -u github.com/shiwano/genem
```

# 使い方

ヘルプテキストをべたり。

```
genem

Usage:
  genem [options] <file>
  genem -h | --help
  genem --version

Options:
  -n, --emitter-name string      Specify the event emitter type name (default: EventEmitter).
  -o, --output-file-name string  Specify the output file name (default: event_emitter.go).
  -p, --print                    Print the generated code without file output.
  -h, --help                     Output help information.
  -v, --version                  Output version.
```

このツールは、指定した Go のファイルから lower camel case で最後に `Event` で終わる名前の struct を探してきて（例: `fooEvent`）、その struct の定義に対応した EventEmitter のコードを自動生成します。

## 例えば

以下のようなファイルを作り、

```go
//go:generate genem -n Emitter -o emitter.go $GOFILE

package event

type fooEvent struct {
	bar string
	baz int
}

type quxEvent struct {
	quux float32
}
```

`go generate` をすると、そのファイルのあるディレクトリに `emitter.go` というファイル名で以下のようなコードが自動生成されます。

```go
package event

type Emitter struct {}

func NewEmitter() *Emitter

func (_e *Emitter) EmitFooEvent(bar string, baz int)
func (_e *Emitter) AddFooEventListener(listener func(bar string, baz int))
func (_e *Emitter) AddFooEventListenerOnce(listener func(bar string, baz int))
func (_e *Emitter) RemoveFooEventListener(listener func(bar string, baz int))

func (_e *Emitter) EmitQuxEvent(quux float32)
func (_e *Emitter) AddQuxEventListener(listener func(quux float32))
func (_e *Emitter) AddQuxEventListenerOnce(listener func(quux float32))
func (_e *Emitter) RemoveQuxEventListener(listener func(quux float32))
```

生成された EventEmitter は、以下のような感じで使えます。

```go
package main

import (
	"fmt"
	"example.com/event"
)

func main() {
	e := event.NewEmitter()
	e.AddFooEventListener(func(bar string, baz int) {
		fmt.Println("foo: ", bar, baz) // Output: "foo: bar 3"
	})
	e.EmitFooEvent("bar", 3)
}
```
Xamarin.Forms の NavigationPage で戻るボタンを消す＆タイトルを変える

Xamarin.Forms で ``NavigationPage`` を使うと、 iOS では [ナビゲーションバー(UINavigationBar)](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/Bars/Bars.html#//apple_ref/doc/uid/TP40006556-CH12-SW3)、Android では [Action Bar](https://developer.android.com/design/patterns/actionbar.html) がそれぞれ使用されます。

プラットフォーム標準のナビゲーション機能が共通の定義で使えるのは便利ですが、アプリの要件によっては、カスタマイズした場面もあるでしょう。

## 戻るボタンを消す

戻るボタンを消したい場合、 Page の XAML に ``NavigationPage.HasBackButton="false"`` を追加します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
			 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
			 x:Class="WorkingWithNavigation.Page2Xaml"
			 NavigationPage.HasBackButton="false"
			 Title="Page 2">
```

コードでは、 ``NavigationPage.SetHasBackButton(page2, false)`` と書けます。

これを実行すると、下のようになります。

![](http://blog.amay077.net/assets/images/posts/customize_back_button_in_Xamarin_forms_01.gif)

Page2 に仕掛けているので、iOS では Page2 だけ、戻るボタンが表示されないのが確認できます。
Android はちょっとわかりにくいですが、ActionBar のアイコンの横に着いている ＜ のアイコンが、 Page2 だけ表示されないのが確認できます。


## 戻るボタンのタイトルを変える

iOS の UINavigationBar では、戻るボタンには前画面のタイトルが表示されます。
Xamarin.Forms の NavigationPage も同じくです。
これを変更するには、 ``NavigationPage.BackButtonTitle="たいとる"`` を使います。

要注意なのは、これを仕掛けたPageの戻るボタンタイトルが変わるのではなく、 **これを仕掛けたPageが戻り先となる場合に、戻るボタンタイトルが変わる** ということです。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
			 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
			 x:Class="WorkingWithNavigation.Page2Xaml"
			 NavigationPage.BackButtonTitle="BACK"
			 Title="Page 2">
```

コードでは、 ``NavigationPage.SetBackButtonTitle(page2, "BACK")`` と書けます。

これを実行すると、下のようになります。

![](http://blog.amay077.net/assets/images/posts/customize_back_button_in_Xamarin_forms_02.gif)

Page2 に ``BackButtonTitle="BACK"`` を仕掛けているので、Page2 ではなく、それが戻り先となる Page3 の戻るボタンが「BACK」になっています。

尚、Android では、戻るボタンは「＜」のアイコンだけなので、この機能は無視されます。

## 参考

* [Hierarchical Navigation - Xamarin](https://developer.xamarin.com/guides/xamarin-forms/user-interface/navigation/hierarchical/)
* [サンプル：Hierarchical Navigation - GitHub](https://github.com/xamarin/xamarin-forms-samples/tree/master/Navigation/Hierarchical)
* [MotzCod.es by James Montemagno — Changing iOS’s Back Button Text in Xamarin.Forms](http://motzcod.es/post/136765476207/changing-ioss-back-button-text-in-xamarinforms)
[GoogleCloudPlatform]GCEのインスタンスの情報変更時はIPが変わっちゃう

# GCEのインスタンスの情報変更時はIP変わっちゃう

自分用メモなので簡潔に書きます。
GCEのインスタンス情報（たしかマシンタイプ）変更時に、
外部IPが変わっちゃいました。


恐らくですが、IP変えずに変更するときは、
サーバに入ってinit 0とかやったほうがいいのかなとおもいます。



initでサーバ止めても課金されるのかどうかは、
今後（いつになるかはわからない）検証していこうかなと。



## 外部IPが変わるそもそもの原因

<img width="487" alt="スクリーンショット 2016-11-07 10.30.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/146205/6675f090-6ee2-b19d-ca70-d71a1f19a314.png">

外部IPをエフェメラルにしていたのが原因っぽいです。

静的IPをとるには、左上のメニューからネットワーキング→外部アドレスでIPが取れるとのことです。

apstndbさん情報ありがとうございました。

# ちょっと豆

「「microはwordpress運用するのに向いてなさそうです。」」

my.cnfに
table_definition_cache=100

入れても、一週間ほどでDBサーバーが落ちちゃいます。
まあ、遊びで入れてるし、無料試用期間があるので、今はgoogle SQL使用で落ち着いてはいますが。

ということで短いですがここまで・・・
初めてのApple Watchアプリ　〜カウントアプリ〜

Apple Watchを手に入れたので簡単なCountアプリをswiftで作ってみました。
# 実際に作ってみる
今回作ったアプリはカウントアプリです。
### コードはこんな感じです!

```ruby:InterfaceController.swift
import WatchKit
import Foundation


class InterfaceController: WKInterfaceController {

    @IBOutlet var label: WKInterfaceLabel!
    var count:Int = 0
    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        
    }
    
    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
        let fontSize = UIFont.systemFont(ofSize: 90)
        let text = String(count)
        let attrStr = NSAttributedString(string: text, attributes:[NSFontAttributeName:fontSize])
        label.setAttributedText(attrStr)
        
    }
    
    override func didDeactivate() {
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    }
    @IBAction func push() {
        count += 1
        let fontSize = UIFont.systemFont(ofSize: 90)
        let text = String(count)
        let attrStr = NSAttributedString(string: text, attributes:[NSFontAttributeName:fontSize])
        label.setAttributedText(attrStr)
    }

}
```
###　ストーリーボード
<img width="314" alt="スクリーンショット 2016-11-05 20.01.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/147814/75632abe-bd49-9a1c-feaf-92c7615c616e.png">

###　スクリーンショット
![IMG_5591.PNG](https://qiita-image-store.s3.amazonaws.com/0/147814/c288db79-63e5-9091-5d3e-2704cf6525ed.png)

#最後に
思った以上に簡単に開発できました。Apple Watchをこれからも引き続き開発していきます

#参考
 - https://ez-net.jp/article/8C/ylktGR5J/5ZZKjSNrNQac/
 - http://yuichi-dev.blogspot.jp/2014/11/applewatch-tutorial.html
Travis CI で clang++ -std=c++14 するときは

```yaml:.travis.yml
os:
  - osx
  - linux
script:
  - clang++ -std=c++14 app.cpp -o app
```

Travis CI で上記のようにしたら、linux ジョブが失敗し、以下のログが生成されました。

```
error: invalid value 'c++14' in '-std=c++14'
```

osx ジョブはちゃんと成功していました。linux 環境の clang が古いのかなと思って新しいのを入れました。

```yaml:.travis.yml
matrix:
  include:
    - os: osx
      env: CXX=clang++
    - os: linux
      env: CXX=clang++-3.8
      addons:
        apt:
          packages: clang-3.8
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.8
script:
  - $CXX -std=c++14 app.cpp -o app
```

あっさり成功しました。

おわり
RaspberryPi で NAS を作った

# 背景
写真をたくさん撮ります。
Macbook Airだと容量が少ないので、写真は外付けHDDに保存しています。
が、Macで写真を見ようとしたときに、いちいち外付けHDDを引っ張り出してきてつなぐ必要があり、だいぶめんどいので、Raspberry Piを使って Sambaサーバーを作ってみることにしました。

# やったこと
## RaspberryPi に外付けHDDをマウント
外付けHDDをUSBで接続して、デバイスファイル名を調べる

``` sh
# fdisk -l
# 色々出てきたけど、端折る

/dev/sda2  409640 3906766983 3906357344  1.8T Apple HFS/HFS+
```
マウントする

``` sh
# mkdir /mnt/hdd2
# mount /dev/sda2 /mnt/hdd2
# ls /mnt/hdd2

ファイル一覧がずらーっと
```
すごい。超簡単。

## Sambaを準備する
Samba をインストールする

``` sh
# apt-get install samba

なんかいろいろインストール的なやつが出る
```
Samba を設定する

* ゲストユーザーでもアクセスできるようにするような設定もあるけど、写真とかなのでユーザー認証が必要な設定にしておいた
* どうやら`[homes]`下に設定することで、ユーザー認証を行なった場合に利用できる部分について設定できるっぽい。

``` sh
# emacs /etc/samba/smb.conf
# ↓こういう設定を追加

[homes]
   path = /mnt/hdd2
```
Sambaでアクセスできるユーザーを追加
※ここで追加するユーザーはLinuxのシステム上にいるユーザー名である必要がある。適当なユーザー名で登録しようとするとエラーになるので注意。

```sh
# pdbedit -a user
new password: ****
retype new password: ****
Unix username:        user
NT username:          
Account Flags:        [U          ]
User SID:             XXXXXXXX
......
```
Samba を再起動して設定再読み込み

``` sh
# /etc/init.d/samba restart
[ ok ] Restarting nmbd (via systemctl): nmbd.service.
[ ok ] Restarting smbd (via systemctl): smbd.service.
[ ok ] Restarting samba-ad-dc (via systemctl): samba-ad-dc.service.
```

## Macからアクセスしてみる。
この時点で、すでにMacのfinderの「ネットワーク」のとこに RaspberryPi がいる。それをクリックして、「別名で接続」を押下。
さっき上で登録したユーザーでログインする。

フォルダ一覧が見える。
すごい、超簡単。

# おまけに
iPhoneでSambaに対応したアプリでアクセスしたら、ファイルサーバーとして利用できるようになった！
動画とか写真とか入れておくと、いつでも家の中からアクセスできるようになって、いいかんじ。
アプリによっては動画のストリーミングとかできない(一回iPhoneに落としてきてから開こうとする)ことがあるので注意したい。
VPSで動かしているVirtualBoxが重い問題

# 結論

```shell-session
$ VBoxManage modifyvm hoge --hpet on --acpi off
```

# 詳細

http://ksnctf.sweetduet.info/

で攻撃されるためのサーバーは、さくらのVPSの上のVirtualBoxで動いているCentOS 6。さくらのVPS自体はKVMで動いている[らしい](https://thinkit.co.jp/story/2011/07/15/2185)。専用のサーバーを借りる金をケチるという目的もあるが、攻撃されることが目的なので、外側で動作を制限したいという目的が大きい。仮想マシン（VM）を動かすユーザーの外向きのネットワーク接続を禁止しているので、たとえこのVMのrootが取られても、ほかのサーバーを攻撃する踏み台に使われたりすることはないはず。

このVMがとても遅い。起動するのに1時間くらいかかるし、`ls`や`cat`にも数秒かかる。エゴサをしていると「重い」という苦情が良く出てくる。すでに仮想化されているVPSの上で動いているNested Virtualization状態で、VirtualBoxを動かしているOSから見えるCPUは仮想化支援機能が無いように見えるので、仕方がないのかなと思っていたけど、改めて考えてみると、さすがに遅すぎる。

色々試してみて、このサイトに書いてあるように`--hpet on`と`--acpi off`を実行すると、まともな速度で動くようになった。`--acpi on`の状態だと重かった。ゲスト側でクロックソースを選択すれば良いのかもしれない。

[VirtualBox + CentOS6.5 + Mac で 仮想CPUの数を増やすと SSHのシェル操作が遅い - その2 - hibomaのはてなダイアリー](http://d.hatena.ne.jp/hiboma/20140330/1396184773)

ただ、VMの上で何もしていなくても、VirtualBoxのCPU使用率が50%くらいになっている。

### 試してダメだったこと

多少効果はあるのかもしれないが、速度が10%向上するとかそういう程度の話であって、起動に1時間掛かるという影響が出るものではなさそう。

- ブートオプションに`divier=10`を付ける
  - CentOS 6では意味が無い？
- `--ioapic off`
- `--paravirtprovider kvm`

### おまけ

マシになったとはいえ重いことは重いので、（可能な問題は）手元に問題ファイルを持ってきて解いて、最後にサーバーに投げるのが良いと思う。CTFの問題、手元に環境を整えるのは最初は面倒だけど、デバッガを使ったりデバッグ出力を追加したりということができるようなって結果的に早く解けることが多い。
ESCは端だが役に立つ（bash編）

最近、ESCキーがホットです。ESCキーは、bashでも役に立ちます。ここでは、私がbashのコマンドライン入力で日頃便利に使っているESCキー操作を紹介します。

## ESC+Backspace

Ctrl-Wを打つと、カーソル左の1単語を削除します。この場合の1単語は、空白区切りです。

`/path/to/some/dir`のようなパス名を入力した直後に、1ディレクトリ分（この場合は“dir”）を削除する場合には、Ctrl-WではなくESC+Backspaceを打ちます。

ESCが左手、Backspaceが右手ということで、わりといいリズムで打てます。

## ESC+.

コマンドラインで同じ引数を続けて入力することがあります。

```
$ mkdir /path/to/some/dir
$ cd /path/to/some/dir
```

そこで、2回目の引数を手で打つかわりにESC+.を打ちます。

```
$ cd 《ここでESC+.》
```

すると、前のコマンドラインの最後の引数が入ります。

```
$ cd /path/to/some/dir
```

ESC+.を繰り返すと、Ctrl-Pなどと同様に、どんどん遡ります。

これも、ESCが左手、.が右手ということで、わりといいリズムで打てます。

## ESC+Ctrl-Y

ESC+.の反対に、前のコマンドラインの最初の引数が入ります。

たとえば、こんなコマンドを実行します。

```
$ cp foo /path/to/some/dir
```

そのあと、fooをls -lしたい場合、にESC+Ctrl-Yを使います。

```
$ ls -l 《ここでESC+Ctrl-Y》
```

するとこうなります。

```
$ ls -l foo
```

これは、左手→左手+右手のリズムですね。


## 数引数

bashでのキー操作には数引数を渡すことができます。数引数の指定には、コマンドにESC+<数字>を前置します。

たとえば、ESC+3+Ctrl-Pとすると、Ctrl-Pを3回打ったのと同じことになります。

前項で紹介したESC+Ctrl-Yの場合は、数引数を指定すると、n番目の引数が現在位置に入ります。たとえば、先に次のコマンドを実行したものとします。

```
$ cp -r foo /path/to/some/dir
```

そのあとのコマンドラインで、ESC+2+ESC+Ctrl-Yを打つと、「foo」が入ります。

```
$ ls -l 《ここでESC+2+ESC+Ctrl-Y》
```

## まとめ

ほかにも[bashで使えるESCキー操作](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbCO)はありますが、とりあえずこんなところで。

ESCって便利ですね。
Canvas を使って画像をグレースケールに変換する

Canvas を使って、画像をグレースケールに変換する方法です。
処理の流れは以下の通りです。

1. Canvas に元画像を描画する
2. Canvas 上で画像をグレースケールに変換する
3. 変換した画像を base64 形式で書き出す
4. 画像の src 属性を書き換える

# ソース

```js:app.js
$(window).load(function() {
	$("img").each(function() {

		// キャンバスに画像を描画する
		var canvas = document.createElement("canvas");
		var ctx = canvas.getContext("2d");
		var img = new Image();
		img.src = $(this).attr("src");
		canvas.width = img.width;
		canvas.height = img.height;
		ctx.drawImage(img, 0, 0);

		// 画像の各ピクセルをグレースケールに変換する
		var pixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
		for (var y = 0; y < pixels.height; y++) {
			for (var x = 0; x < pixels.width; x++) {
				var i = (y * 4) * pixels.width + x * 4;
				var rgb = parseInt((pixels.data[i] + pixels.data[i + 1] + pixels.data[i + 2]) / 3, 10);
				pixels.data[i] = rgb;
				pixels.data[i + 1] = rgb;
				pixels.data[i + 2] = rgb;
			}
		}
		ctx.putImageData(pixels, 0, 0, 0, 0, pixels.width, pixels.height);

		// 画像を差し替える
		$(this).attr("src", canvas.toDataURL());
	});
});
```

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width">
	<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
	<script src="js/app.js"></script>
	<title>Image to Grayscale</title>
</head>
<body>
	<p><img src="img/photo_1.jpg"></p>
	<p><img src="img/photo_2.jpg"></p>
	<p><img src="img/photo_3.jpg"></p>
</body>
</html>
```

# 結果

![grayscale.png](https://qiita-image-store.s3.amazonaws.com/0/129344/8a5f26ae-b4b4-7c68-e91a-009dc4981c64.png)
Android端末でソフトウェアキーのナビゲーションバーの有無を判定

```java
ViewConfiguration.get(context).hasPermanentMenuKey()
```

Galaxy端末で、上手くいかないことがあった。
以下でうまくいった！
調べていくとconfig_showNavigationBarという値のナビゲーションバーの指定されているとか
どこかのライブラリの中で見たソースを参考にして書いたコード
何のライブラリかは忘れてしまった・・・

```java
public static boolean hasNavigationBar(Context context) {
    Resources res = context.getResources();
    int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");
    if (resourceId != 0) {
        String sNavBarOverride = "";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            try {
                Class c = Class.forName("android.os.SystemProperties");
                Method m = c.getDeclaredMethod("get", String.class);
                m.setAccessible(true);
vsNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
            } catch (Throwable e) {
                e.printStackTrace();
                sNavBarOverride = "";
            }
         }
         boolean hasNav = res.getBoolean(resourceId);
         // check override flag (see static block)
         if ("1".equals(sNavBarOverride))
                hasNav = false;
         else if ("0".equals(sNavBarOverride))
                hasNav = true;
                return hasNav;
         } else { // fallback
                return !ViewConfiguration.get(context).hasPermanentMenuKey();
        }
    }
```
Cocoapodsをプロジェクトから切り離したい


Cocoapodsをプロジェクトから切り離す方法をメモがてら紹介します
Twitterフォローしてください
@m_hsp

```
$ sudo gem install cocoapods-deintegrate cocoapods-clean
$ pod deintegrate
$ pod clean
$ rm Podfile
```

以上です
JIRA DJ Kanban で自分の音源を Dropbox から引き出すには？

DJ Kanban で自分の音源を使用する方法を走り書きしておきます。

正式のドキュメンテーションについては、[こちら](https://bitbucket.org/rbarnesatl/dj-kanban/wiki/Home?_ga=1.43130982.216518283.1477648383)をご覧ください。

##必要なもの

- JIRA のクラウドインスタンス
- DJ Kanban のアドオン
- Dropbox のアカウント
- mp3, wav, m4a, aac 等の音源

## 手順
JIRA DJ Kanban は、HTML5 Web Audio API を使用しているので、再生できるフォーマットのものを準備する。(mp3, wav, m4a, aac)

1. Dropbox にフォルダを作成して、音源ファイルをアップロードする
2. そのファイルのリンクを作成する　（例：https://www.dropbox.com/s/yopixr7nwewc7u7/german-shephard-daniel_simon.mp3?dl=0）
3. そのリンクを、以下のように置き換える
`https://dl.dropboxusercontent.com/s/yopixr7nwewc7u7/german-shephard-daniel_simon.mp3`
4. JIRA のチケットの説明の部分に以下のように入力する
` {"filename":"https://dl.dropboxusercontent.com/s/yopixr7nwewc7u7/german-shephard-daniel_simon.mp3"}`
5. 保存して終了

## 補足
JIRA チケットの「説明」フィールドは、音源のメタデータを JSON で管理しています。ファイルURL 以外にも以下のようなことを管理することができます。
filename - 必須項目 - 音源のURL
loopStart - オプション - 音源中のループを始める位置を秒数で設定することができます。
loopEnd - オプション - 音源中のループを終える位置を秒数で設定することができます。
bpm - オプション - BPM を設定することができます。初期設定は128 です。
gain - オプション - 1.0 と標準として、音のボリュームを調整することができます。


Happy DJs!