OmniAICreator/Qiita-1.07M huggingface dataset:
SSD(Single Shot MultiBox Detector)を試す

# SSDのCaffe実装が公開されていたので試してみた

基本はREADME.mdに書いてある通りに進める
いくつか追加で行った事があるのでメモ
Ubuntu 14.04 x86_64 LTSで確認
(ハードウェアはIntel Core i7-6700K, Memory 16GB, 1x NVIDIA Geforce GTX 980 Ti)
GPU(NVIDIA CUDA)を使う場合の設定については書かないので別の情報を参考にして構築済みであることを想定している

## [GitHub](https://github.com/weiliu89/caffe/tree/ssd) からリポジトリをクローンしてssdブランチに切り替える

```shell-session
git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd
CAFFE_ROOT=$(pwd)
```

## Caffeのビルドをしてtestが通るところまで確認する

CPUのみ(GPUなし)の場合は以下の変更をする
Makefile.configの8行目: `CPU_ONLY := 1`をコメント解除

```shell-session
sudo apt-get -y install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get -y install libatlas-base-dev libopenblas-dev
sudo apt-get -y install python-skimage python-protobuf
sudo apt-get --no-install-recommends libboost-all-dev
cp Makefile.config.example Makefile.config
make all -j8
export PYTHONPATH=${CAFFE_ROOT}/python:${PYTHONPATH}
sudo sh -c "echo 'PYTHONPATH=$PYTHONPATH' > /etc/environment"
make pycaffe -j8
make test -j8
make runtest -j8
make pytest -j8
```

`make runtest`でPASSEDと表示されれば問題なし
次のステップに進む

## ネットワーク定義ファイルをダウンロードする
* [ここ](https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6) からネットワーク定義のファイルをダウンロード
* `caffe/models/VGGNet`に置く

```shell-session
wget https://gist.githubusercontent.com/weiliu89/2ed6e13bfd5b57cf81d6/raw/758667b33d1d1ff2ac86b244a662744b7bb48e01/VGG_ILSVRC_16_layers_fc_reduced_deploy.prototxt
mkdir ${CAFFE_ROOT}/models/VGGNet
mv VGG_ILSVRC_16_layers_fc_reduced_deploy.prototxt ${CAFFE_ROOT}/models/VGGNet/
```

## 訓練・テストデータのダウンロード
訓練をしない場合は必要ないのでウェブカメラのサンプル動かすだけならスキップしてよい
* PASCAL VOC2007/2012のデータセットをダウンロード, 展開する

```shell-session
mkdir ${HOME}/data
cd ${HOME}/data
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar
```

* LMDBフォーマットのデータセットを作成する

```shell-session
cd ${CAFFE_ROOT}
chmod u+x ./data/VOC0712/create_list.sh ./data/VOC0712/create_data.sh
./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh
```

## 訓練済モデルのダウンロード
[ここ](http://www.cs.unc.edu/%7Ewliu/projects/SSD/models_VGGNet_VOC0712_SSD_300x300.tar.gz) からVOC0712:SSD300の訓練済モデルをダウンロードして展開する

```shell-session
wget http://www.cs.unc.edu/%7Ewliu/projects/SSD/models_VGGNet_VOC0712_SSD_300x300.tar.gz
tar -xzvf models_VGGNet_VOC0712_SSD_300x300.tar.gz
mv models/VGGNet/VOC0712 ${CAFFE_ROOT}/models/VGGNet
```

## サンプルを動かす
* 訓練する  
`examples/ssd/ssd_pascal.py`の285行目付近の`gpus = "0,1,2,3"`を`gpus = "0"`とする

```shell-session
python examples/ssd/ssd_pascal.py
```

* ウェブカメラからの画像をリアルタイムで処理する  
CPUのみの場合は102行目を変更する

```py
solver_mode = P.Solver.GPU
```

から下記のようにする

```py
solver_mode = P.Solver.CPU
```

次のように入力してサンプル実行
Escキーで終了する

```shell-session
python examples/ssd/ssd_pascal_webcam.py
```
[Swift3] precedencegroup assignment属性の役割

# 書いたこと
* precedencegroup **assignment** 属性の役割について
* assignment属性が **false** の場合のカスタム代入演算子の動作について
* assignment属性が **true**  の場合のカスタム代入演算子の動作について

# assignment属性値の役割
カスタムの代入演算子を定義した際に、assignment属性値がtrueのprecedencegroupに属する場合、オプショナルチェーンを挟んだ代入が行えるようになります。

以下カスタムの **??=** 代入演算子を使って、
assignementがfalseのprecedencegroupに属する場合とtrueのprecedencegroupに属する場合で上記の動作を確認します。

# assignment属性値がfalseのprecedencegroupに属する場合

```
precedencegroup NoAssignmentPrecedence {
    assignment: false
}

infix operator ??=: NoAssignmentPrecedence
```

以下のようにオプショナルチェーンを挟んだ代入ができなくなる。

```
class Foo {
    var bar: Int? = nil
}

let foo: Foo? = Foo(); 

// error: cannot pass immutable value of type 'Int?' as inout argument
foo?.bar ??= 10 

```

エラーを読むと上記は以下のように評価されているようです。

```
// foo?.bar ??= 10
if let foo = foo {
    let bar = foo.bar
    bar ??= 10
}
```

# assignment属性値がtrueのprecedencegroupに属する場合

```
precedencegroup `AssignmentPrecedence` {
    assignment: true
}

infix operator ??=: `AssignmentPrecedence`
```

以下のようにオプショナルチェーンを挟んだ代入が出来るようになります。

```
class Foo {
    var bar: Int? = nil
}

let foo: Foo? = Foo(); 

// OK
foo?.bar ??= 10 
```

上記は以下のように評価されるようです。

```
// foo?.bar ??= 10 
if let foo = foo {
    foo.bar ??= 10
}
```


# ??= 演算子

```
/// nilじゃない場合代入してくれる素敵なカスタム演算子です
func ??=<T>(lhs: inout T?, rhs: T) {
    if lhs == nil { return }
    lhs = rhs
}
```

以下のように使えます。

```
infix operator ??= : AssignmentPrecedence

class Foo {
   var bar: Int? = nil
}

let foo = Foo(); foo.bar ??= 10 // foo.barに10が代入されます
```

# 参考サイト
* precedencegroupの定義  
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Declarations.html#//apple_ref/doc/uid/TP40014097-CH34-ID380
* the evolution proposal.  
https://github.com/apple/swift-evolution/blob/master/proposals/0077-operator-precedence.md
* ??=演算子について  
http://stackoverflow.com/questions/39881308/null-coalescing-assignment-operator-in-swift-3
VisualStudioCodeでGo言語開発環境を作ってみた

# gloops AdventCalender 4日目

[gloops advent calender](http://qiita.com/advent-calendar/2016/gloops) 4日目です:santa_tone2:
三日目は社長の池田の [スプレッドシートで顔写真付き座席表を作った](http://qiita.com/hideyuki_ikeda/items/f7e9697e96d411f1ae45) でした。

普段「[株式会社gloops](http://gloops.com/)」では、NativeアプリケーションをC#を使ってサーバーサイド(ASP.NET ~~)もクライアントサイド(Unity)も開発していますが、全然関係ないVisualStudioCodeでGo言語環境を作った話をします。

## 経緯
先日社内でちょっとしたプログラミングコンテストをやるとのことで、並列処理ならGoでしょ(?)
と思ったのでGoでやってみようと考えました。
で、エディタどうしようかなと思ってちょっと調べたらVisualStudioCodeでやればいい感じぽいので、環境をつくってみた話をします

Go言語に関しては素人なので、間違ってたらすいません。という先回り…

## 手順
### ダウンロード

VisualStudioCode
https://code.visualstudio.com/

golang
https://golang.org/dl/
適当にfeatured の項目からDLします

### VisualStudioCode設定

<img width="1023" alt="スクリーンショット 2016-12-04 13.09.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/52072/aacd2f5c-4429-4994-ccb8-917448207ab0.png">

Codeを開いたあと左の下の拡張機能のタブからgoで検索してインストールします。

### ディレクトリ構成

https://golang.org/doc/code.html
ここにしたがって、プロジェクトのroot直下に
bin/
pkg/
src/
のディレクトリを作ります。

### GOPATHなど
srcの下にディレクトリを切ってhoge.goを置きます。
すると上からにゅるっとGOPATH設定してね、と出てきます
<img width="1243" alt="スクリーンショット 2016-12-04 13.17.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/52072/08b36785-091c-afb9-9b00-983f47e7e78f.png">

`Set GOPATH in workspacesettings`
をクリックすると、
settings.jsonが開けません、と出るので作成をクリックするとsetting.jsonができるので、ここにrootにするディレクトリのパスを以下のように書きます。

```
{
    "go.gopath": "/path/to/root"
}
```

でcode再起動

すると今度は
<img width="1241" alt="スクリーンショット 2016-12-04 13.25.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/52072/b3d2a0cb-bd7d-628e-785f-3c3631f55384.png">

こんな感じにgolintがないですよ、と表示が出るのでinstall ALL します。
すると出力を見ると

```
Installing 10 tools
  gocode
  gopkgs
  go-outline
  go-symbols
  guru
  gorename
  godef
  goreturns
  golint
  gotests

Installing gocode SUCCEEDED
Installing gopkgs SUCCEEDED
Installing go-outline SUCCEEDED
Installing go-symbols SUCCEEDED
Installing guru SUCCEEDED
Installing gorename SUCCEEDED
Installing godef SUCCEEDED
Installing goreturns SUCCEEDED
Installing golint SUCCEEDED
Installing gotests SUCCEEDED

All tools successfully installed. You're ready to Go :).

```

のように必要なものをいろいろ入れてくれます。
これで晴れて`You're ready to Go`になったようです。

## 機能

普通のIDEレベルの機能が入ってくれます。

* 保存時に毎回formatをかける(lint)
* 変数名を書き換えできる
* メソッドにマウスオーバーで詳細確認できる
* 定義にジャンプ･参照表示ができる
* 常にコンパイルエラーがあったら表示する
* importを自動追加

などなど。


## まとめ

基本的に上からにゅるっと出て来るinfoの言いなりになってるだけで開発環境できちゃうので楽チンでした。
VisualStudioCode自体も細かくアップデートされているのでどんどん便利になってますね。

あとプロコン自体はコードがなかなか意図通りに動いてくれなくて苦戦中ですが、触ったことない言語触るのは新鮮で楽しいですね。

明日は 若手フロントエンドエンジニアの @s_ono ちゃんの登場です。

## 参考
プラグインの本体
https://github.com/Microsoft/vscode-go
C++ Builder > link > TCheckBox > AllowGrayedプロパティとState:cbGrayedについて

```txt:動作環境
C++ Builder XE4
```

TCheckBoxにStateというプロパティがあり、その値の選択肢として「cbGrayed」というのがあることに気づいた。

説明は以下が分かりやすいです。
http://afsoft.jp/program/del2010/p11_012.html

> まずは AllowGrayedプロパティでしょうか。ヘルプより。
> 「AllowGrayedプロパティが trueの場合，チェックボックスはチェック，非チェック，淡色表示の3つの状態を持つことができます。AllowGrayedプロパティが falseに設定されている場合，チェックボックスの状態は，チェックマークが付けられているか，はずされているかの 2 つのいずれかになります。」
> との事です。淡色表示というとつい Enabled が False の状態か？と思ってしまいますが違うようです。これを True にした場合の結果は、Stateプロパティで確認できるようです。

情報感謝です。
dockerインストール手順

# dockerインストール
dockerの環境を構築する機会があったため自分用のメモとして投稿
## 環境
OS : centos7  
カーネル : 3.10.0-229.el7.x86_64

## yumでインストール
1. 既存のyumパッケージを更新  
`$ sudo yum update `  
2. yumリポジトリを追加  

```
$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]  
name=Docker Repository  
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/  
enabled=1  
gpgcheck=1  
gpgkey=https://yum.dockerproject.org/gpg  
EOF  
```  
3.Dockerパッケージをインストール  
`$sudo yum install docker-engine`    
4. Dockerデーモンを開始  
`$sudo docker run hello-world`  
imageがビルドされ、コンテナが実行されればdockerが正しくインストールされたことが確認できる。
不安を解消する答え方

今回の記事はコミュニケーション Advent Calendar 2016の4日目の記事として書いています。

突然ですが、業務中に質問をされることってたくさんありますよね？
お客さんから、上司から、後輩から...

今回はそういったときに、どういう点に注意すると物事がスムーズに進むかを考えていきます。

## 質問に対するいい回答とは

質問に対するいい回答とは何でしょうか。

この問いに回答するために、「良くない回答」をしてしまったときのことを考えましょう。

このとき、きっと多くの質問者が意図が伝わっていないと感じ、言い方を変えただけの同じ内容の質問( or 粒度を変えた質問)をしてくることでしょう。
それに対して、再度自分が良くない回答をしてしまったら...
どちらかが諦めるまでこのやりとりは終わりません。

そして、気づくとびっくりするほどの時間が過ぎているはずです。
これはコミュニケーションコストがかさみ、双方にとって良くない状況のはず。

そこで、ここでは質問者から「意図をわかってくれる」と感じてもらえる回答をいい回答とします。
そういう回答ができることでお互い自分の作業にすぐ戻れるでしょう。
また、「意図をわかってくれている」と感じてもらうことは、いい信頼関係の構築につながると思います。

## 質問の裏には、不安がある

いい回答をするために、私が大事にしていること。
それはずばり、質問の裏にある、質問者の`不安`を感じ取ることです。

業務中に行われる質問の裏には、必ずと言っていいほど不安があると思います。

* お客さんからの「XX機能を追加したいのですが問題ないですか？」という質問には既存機能へ影響がないかという不安がある
* 上司からの「あとどれくらいかかりそう？」という質問にはスケジュールが遅れることへの不安がある
* 後輩からの「このやり方であっていますか？」という質問にはそのまま進むことに対する不安がある

この不安は字面だけを追っても見えてきません。その時々の状況、コンテキストにより全く違ってきます。
大事なことは、その時の状況をしっかりと捉え、質問者の不安を感じ取る、または考えることです。

## 不安を解消してあげよう

不安がどこにあるのか、がわかればあとは簡単です。
その不安を解消するための回答をしてあげましょう。

難しいなと感じる方は、まず質問に一言で、簡潔に答えましょう。
そこに不安を解消させる一文を添えればOKです。

* 「XX機能を追加したいのですが問題ないですか？」
  * 「問題あります。」 + 「ただし、Aというやり方をすれば問題ないはずです。」
      * ここで「問題あります。」だけだと`不安は解消されない`ままになってしまいます。 
      * 代替案を提示するなどして、うまく不安を解消してあげましょう。
  * 「問題ありません。」 + 「既存機能には影響なく、XX機能を追加できますよ。」
      * 繰り返すことで「意図はわかっていますよ」という安心感を与えてあげましょう。


* 「あとどれくらいかかりそう？」
  * 「8時間くらいあれば終わります。」 + 「予定通りです。」
      * 「予定通りです。」の一言があるだけで違いますね。
  * 「少し遅れていて、あと1日かかりそうです。」 + 「次の作業が予定より早く終わりそうなので問題ないはずです。」
      * 質問者が気にしているのは、最終的なスケジュールに間に合うかどうかです。
      * 遅れているなら、どうやって遅れを取り戻すかまで答えたほうがいいでしょう。

* 「このやり方であっていますか？」
  * 「問題ないよ。」 + 「私も同じやり方でするかな。」
      * きっと後輩は自信がないから質問しているのでしょう。
      * そして、この質問をされた先輩は、きっと後輩から信頼されているのでしょう。
      * この一言を添えるだけで、後輩は自分の選択に自信を持って取り組むことができるようになります。

## まとめ

まずは、質問者の不安を感じ取ることが大切です。
そして、感じ取った不安を解消し、安心感を持ってもらえるような、一言添えた回答を心がけましょう。
そのためにも、常日頃から自分だけでなく、身近にいる関係者の状況にも意識を向けて過ごしてみるといいと思います。(私自身、自分に関係あるないに関わらず、周りの会話をよく聞くように心がけています。)
Kashiwa Geeks

# はじめに

---

### はじめに

- [KOIL](http://www.31ventures.jp/)を拠点とし、IT系の勉強会を実施します。
- イベント管理は[connpass](https://kashiwano-ha-geeks.connpass.com/)にて管理してます。

---

#　背景

---

### 背景

- 主催者が柏にて起業をしまいて、一人で作業してました。
- 柏周辺でIT勉強会を検索したところ1件
    - KOILのドローン勉強会だけでした。
- ないので作ろうと思い始めました。

---

# やること

--- 

### やること

勉強会ネタを肴に手と口を動かします。

- IoT関連のネタ
    - RaspberryPi
    - Arduino
    - Drone
    - etc...

--- 

# 施設案内


--- 

![alt](http://www.31ventures.jp/wp-content/uploads/KOIL-6F05-01.png)

---

# その他

---

| ツール | 備考 |
|:------------|:-------------- |:------------|
|[Github](https://github.com/kashiwa-geeks) | |
| [facebook](https://www.facebook.com/groups/1690578607920441/) | |
| Slack | メルアド教えてください。 |

--- 

# PR 

--- 

### PR 

- KOILパーク内はドロップインかゲスト(2時間)で利用できます。
- 初めての方は、無料見学の参加いただけると嬉しいです。
- KOILファクトリーは機器使用時間で課金されます。(会員は割引あり)

# 諸注意

--- 

### 諸注意

以下のような事は予め禁止させて頂きます。
- 基本的に31Ventureさんの指示に従います。
- 目的がリクルートや商品の販売斡旋 ( 簡単な宣伝はOK )
- エンジニアに興味のない方の参加
- 本集会のモチベーションを著しく低下させる行為
- その他、本集会の目的に則さない行為

---

### では始めましょう。

- 時計回りに自己紹介しましょう。
    - お名前
    - やってること
    - 今日やること
Speech Frameworkを音声認識アプリで使ってみてのまとめ

# はじめに
iOS10で音声認識APIのSpeech Frameworkが公開されました。WWDCで公開直後にそれを聞きつけた人からお仕事をもらう機会があり、音声認識APIとしてSpeech Frameworkを使った音声認識アプリを作っているので、その体験をもとにこの記事を書いてみます。Speech Frameworkを使ったアプリ開発に興味がある人向けの記事です。

# どんなアプリを作ってる?
あまり詳しくはかけないのですが、要はアプリ利用者とアプリが対話するアプリです。あらかじめトークスクリプトを用意しておき、それに沿ってアプリが言葉を発します。アプリ利用者はそれに対して返答をし、その内容に応じてまたアプリが話して、の繰り返しです。

# Speech Frameworkを使っていて困ったこと
## ナレッジがまだまだ少ない
Appleのサンプルコードの[SpeakToMe](https://developer.apple.com/library/prerelease/content/samplecode/SpeakToMe/Introduction/Intro.html)や、Qiitaなどである程度基本的な情報は落ちてます。
しかしそれをもう少し応用しようとすると、あれ、これはどうしたらいいのかな。という点が出てきて、そういったナレッジはまだまだ少ないです。

## 単語だけだと音声認識の精度が低い
きちんとある程度の長さのフレーズで話すとかなりの精度で認識してくれます。しかしフレーズが短かったり単語だけだとあまり精度が出ません。

当たり前といえば当たり前なのですが、前後のつながりからフレーズを推測してるので今の技術的には仕方ないのかなと。ですので、もし単語を音声認識で聞き取って、それをもとに何かしたい、といったことをやろうとすると精度がボトルネックになります。

## アプリが発する言葉も認識してしまう
今回のような対話アプリですと、アプリ側も言葉を発します。アプリ側の言葉とアプリ利用者の声を区別して認識してほしいのですが現状Speech Frameworkではそれはできてません。少し調べてみると音声認識自体は近年大幅に精度が向上してきましたが、複数人の言葉が重なる会話はまだまだ困難があるようです。

本当はアプリが話してる時に少しかぶり気味でアプリ利用者が「いや、ちげぇよ！！」みたいなことをリアルタイムに行いたかったのですが、今回はやむを得ず順番に話すターン制にして回避しました。
普段使ってるSiriもそうで、Siriが話してるときはこちらは話せない仕様になってしまっています。今後の技術の発展に期待です。

## 一日に使える回数に制限がある
これはWWDC2016の時点で公開されていた情報ですが、Speech Frameworkを使った音声認識APIには利用回数に制限があります。端末ごとやアプリごとに制限があるようで明確にXXの間にXX回使ったらだめ、といったことは公開されていないようです。
確かに一日中開発をしていると、あれなんか何も認識しなくなった！となって、アプリごとの回数制限にひっかかったことが結構ありました。その場合はBundle Identifierを変更することで回避していました。
が、実際にアプリとして公開する場合、この制限が実際問題どこまでボトルネックになるのかはまだ実感できていません。わかる方いましたら教えてください。

## 話が終わったのか、途切れたのかの判断がアナログ
アプリ利用者「こんにちは、今日はいい天気ですね」
アプリ「はい、いい天気ですね」
などという会話を考えてみます。
実際の会話を考えるとテンポよくこの２つのフレーズが繋がってる必要があります。しかし、アプリ利用者がフレーズを言い終わったのか、ただ間をあけてるだけかはどう判断しましょう？
先程話したターン制ですと、アプリが返答を開始するタイミングが難しいです。
ここは、Speech Frameworkでは音声認識の中間結果を監視するする関数があるのでそれを活用します。具体的には音声認識を開始したらこの関数が頻繁に呼び出されます。ぎゃくに話が認識されてないときはその関数が呼ばれないです。ですのでこの関数が最後に呼び出されてから0.X秒たったら話が終わったと判断するようにしました。もっといい方法あれば教えていただけると助かります。そのうちAppleさんがいい関数を追加してくれることも祈ってます。

# Speech Frameworkを使っていてよかったこと
## 無償で商用利用可
Open EarsやGoogle Speech API、docomo音声認識APIなどもありますが、日本語対応されていて無償で使えて商用利用できる、となるとSpeech Framework一択となります。
## 実装がそんなに難しくない
他のAPIとの比較はできてなきく、iOSエンジニアとしての他の機能の実装との比較になりますが、そんなに難しくないです。サンプルコードを見たり動かすだけで実際の利用レベルまではそこまで橋渡しはいらないです。実際にWWDCで公開直後でほとんどネットに情報がないときにでも、サンプルコードだけを見てどうにかなりました。(どっちかというとSwift3対応のほうが厄介でした汗)

## iOS10から使えるようになったという話題性
技術的というよりはマーケティング的な観点になりますが、iOS10から公開されたSpeech Frameworkを使用する、というのはアプリを作る側としてもアプリを売り込む先としてもそれなりにひきになります。これはアプリというプロダクトそのものはもちろんですが、iOSエンジニアとしても最新技術をキャッチアップする、といった観点でもテンションが上がることかと思います。

# 参考にした情報
* [iOSアプリでの音声認識機能実装方法まとめ](http://qiita.com/satoshi0212/items/af4928b808b4fbba8091)
* [サンプルコードSpeakToMe](https://developer.apple.com/library/prerelease/content/samplecode/SpeakToMe/Introduction/Intro.html)
* [【iOS 10】Speechフレームワークで音声認識 - 対応言語は58種類！](http://qiita.com/shu223/items/ca8e62803e83e396c177)
* [【iOS10】Speech Recognition API(音声認識API)の制約まとめ
](http://qiita.com/nerd0geek1/items/af9f0555c3f6c8d878eb#_reference-1fb597fbe8bb18c9a049)
* [google先生](https://www.google.co.jp/search?q=ios+speech+framework)

# おわりに
iOS10から使えるようになったSpeech Frameworkを使ったアプリを開発してみての実体験をもとに、この記事を書かせていただきました。良かったことより困ったことのほうが質量ともに多く、まだまだ発展しがいがある技術領域だと思います。現時点でSpeech Frameworkを使うとどういうことになるか？という観点でお役に立てれば幸いです。
アトミックアップデートの更新速度について

[Solr Advent Calendar 2016](http://qiita.com/advent-calendar/2016/solr) の4日目です。


# アトミックアップデートとは
[アトミックアップデート(atomic update)](https://cwiki.apache.org/confluence/display/solr/Updating+Parts+of+Documents)とはpartial updateとも呼ばれる機能で、特定のフィールドのみをピンポイントで更新する機能です。
JSONだと下記の形式でリクエストをします。

```
{
  "id":"1",
  "price":{"set":5000} //更新したいフィールド
}
```




# アトミックアップデートの問題点
便利な機能ですが処理コストが高いというデメリットがあります。
アトミックアップデートはユニークキーで一度検索をおこない、更新対象のドキュメントから全てのフィールドを取り出して更新用のデータを生成し直します。
つまり、検索+データの生成+更新が発生することになります。
私も人づてでアトミックアップデートは遅いよと聞きつつも、どれだけ遅いのかは知らなかったので、通常の更新に比べてどれだけ更新速度に差が出るのかを調査しました。


# 調査に使ったインデックス
[前回](http://qiita.com/tkondo/items/20f5319b8ac5876ad881)と同じです

# Solrのバージョン
5.5.2


# 調査したパターン
インデックスが100万件(optimize済み)の状態から、1度の更新リクエストで1万件のデータを更新しました。
これを100回、計100万件を更新します。
この時に

1. 全てのフィールドを揃えて更新
2. sort_int1だけアップデート(set)で更新

とします。
また、どちらもcommitWithin=5000としました。


# 結果と考察
|            |  処理時間(秒)|
|:-----------|------------:|
|    パターン1|          152|
|    パターン2|          470|

パターン2では通常の更新に比べて3倍以上時間がかかりました。
また、検索とフィールドの補完を行うため、インデックスの件数が多い場合やフィールドを大量に定義している場合などはさらに更新負荷は高くなりそうです。


# まとめ
アトミックアップデートは通常の更新に比べてかなり更新速度が落ちることが分かりました。
バッチ更新などで、大量の更新リクエストを生成する場合は長時間更新負荷がかかりっぱなしの状態になりそうです。
Solr6.3系からはアトミックアップデートのパフォーマンス改善を目的とした[SOLR-9592](https://issues.apache.org/jira/browse/SOLR-9592)が入っているので、そちらのパフォーマンスを期待したいところです。
フレームワークの選定でもう辛い。

2016年現在、フレームワークが乱立しているようですね。

僕が若手PHPerだった2006年頃は、3,4種類くらいしか無かったかな？

当時の僕は、
「フレームワークねぇ… 便利らしいけど融通効かないんでしょ？遅いんでしょ？
　導入してる企業もまだ少ないし…」

というように、スレタイ読んだだけの知識だけで、FWをよく分かっていませんでした。

そして、最近調べてみて分かったのが、当時僕が開発していた物がFWでした（笑）
さらに言うとORMにあたる物を作っていたという事がわかりました。
「僕FW作ってたんだ…　でもってアレORMって言うのか、知らなかった…」

さて、本題の「僕に合うフレームワークを探す」ですが、
「ORMベースで動かして、CRUD以外の処理は拡張していく」

といった手法をとりたいと考えています。
ORMは外せないです。
ORMを作った時、かなり工数削減できたし、自作ORMだから拡張は容易だったので、不便を感じた事はありませんでした。
なのでこれからもORMを使いたいのですが、世に出ているORMは拡張しやすいのかが問題です。

最悪、シンプルなFWを採用しORMを自作する事も検討中です、、、（が、正直面倒だ！）

僕に合うFWないかなぁ…
忙しいリーダーへの声のかけ方

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の4日目の記事です。


##忙しいリーダーへの声のかけ方

忙しい現場ではマルチタスクが当たり前になっていますよね。
末端の僕ですらマルチタスクだったのでリーダークラスの会社の人は雇ってる下請けの人のタスクを全部把握してるんだからすごく大変だと思います。

たいていの場合、能力によってリーダーになったわけではなく、会社の営業力で食い込んだ地位によって作業者になるか現場監督になるかの違いが出てくるのでいろんな人がいます。
(自分の場合、かなりよいリーダーに巡り合ったと思ってます。)
とりあえず多少めんどくさい忙しい人をイラつかせない話し方について書いてみようと思います。


1．話をするタイミング
これが難しいです。
重要なのは、自分がこなしているタスクが全体の中で重要なタスクかどうか考えてみましょう。
例えば、リーダーが誰かと話しているとき、自分のタスクが一刻を争う本番障害の調査とかならじゃんじゃん割り込んで言ってよいのですが、そうではない場合は、ちょっと遠慮しましょう。
リーダーの今のタスクと自分のタスク、どっちが重いか考えてみる必要があると思います。


2．まずは何の件か話そう
　リーダーはいろいろタスクを抱え込んでいるのでいきなり話の核心から入ってもまず何のこと？状態になります。
極端な話、いきなり、「○○さん、すみません、今よろしいですか？　調べてみた結果if文の条件が間違ってます」とかではなんだっけ？となるんじゃないかと思ってます。
まずは、「○○障害調査の件ですが、どこどこの処理がバグってます」みたいにまずは何の件か宣言することが大事なんじゃないかと思ってます。
まずはざっくり伝えたいことを伝えましょう。

3．解決方法を提示しよう
　いろいろ作業していると相談したいことあると思います。
悩んだら相談と勇者部五箇条(※1)も謳っていますが、実際には解決方法を提案したうえで相談しないと、「で、どうしたいの？」って返されてしまいます。
ある程度解決方法は提示していくのが良いのかもしれません。
自分がよく言われた言葉に「言われたことだけをやるのは作業、それは仕事ではない」という言葉です。
この言葉、どうでしょう？
正直言って、俺は下請けで単価も低いんだから言われたことだけやってれば十分単価分だろって考えも正義だと思います。
しかし、正しさとはその現場のルール・慣習・因習のことを指します。
オズに登場するティック・トック(※2)ではありませんが考えろと言われたら考えましょう。

しかし、それを考えつかないときに時間を消耗するのはもっといけません。
どうにも思いつかないときは、もう無理です、わからないですと言ってしまう必要はあります。
もしかしたら怒られるかもしれませんが、そういって解決をリーダーに託してしまいましょう。
仕事全体で考えたとき、悩んでいて何も進んでませんというのは最悪の事態です。


3．不具合を発見したとき
　なにか不具合を発見した時、すぐに報告＆相談をしたくなると思います。
が、まずは、それによってどんな問題が起きるのかを示しましょう。
プログラムの不具合は原因であって結果ではありません。
その不具合を放置することでどんな問題が発生するのかを認識してもらえると思います。


---
※1
[TVアニメ結城友奈は勇者である](](http://yuyuyu.tv/special/dictionary.php))に登場する部活動、勇者部の五箇条、全文は以下の通り

・挨拶はきちんと　
・なるべく諦めない
・よく寝て、よく食べる
・悩んだら相談！
・なせば大抵なんとかなる

※2　オズの魔法使いの続編に登場するブリキの兵隊
喋るネジと歩くネジ考えるネジの三つを持ち、考えるネジを回すと頭を使った行動をとれるようになる
mysql2 が原因でbundle installにてエラーを吐く(Mac OS X)

# 問題点

Mac OS X(El Capitan)で、人様のgemを`git clone`して`bundle install`しようとしたらエラーが出てコケたので、メモ。 & 発生したエラーメッセージでググって到達した方へ向けて。

```:実行ログ
$ bundle install
...
...
...
Installing mysql2 0.4.5 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/ym/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/mysql2-0.4.5/ext/mysql2
/Users/ym/.rbenv/versions/2.3.1/bin/ruby -r ./siteconf20161204-22899-sy18n5.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
checking for rb_big_cmp()... yes
checking for mysql_query() in -lmysqlclient... no
-----
mysql client is missing. You may need to 'brew install mysql' or 'port install mysql', and try again.
-----
*** 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/ym/.rbenv/versions/2.3.1/bin/$(RUBY_BASE_NAME)
	--with-mysql-dir
	--without-mysql-dir
	--with-mysql-include
	--without-mysql-include=${mysql-dir}/include
	--with-mysql-lib
	--without-mysql-lib=${mysql-dir}/lib
	--with-mysql-config
	--without-mysql-config
	--with-mysql-dir
	--without-mysql-dir
	--with-mysql-include
	--without-mysql-include=${mysql-dir}/include
	--with-mysql-lib
	--without-mysql-lib=${mysql-dir}/lib
	--with-mysqlclientlib
	--without-mysqlclientlib

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

  /Users/ym/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.5/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/ym/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/mysql2-0.4.5 for inspection.
Results logged to /Users/ym/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/extensions/x86_64-darwin-15/2.3.0-static/mysql2-0.4.5/gem_make.out
...
...
...
An error occurred while installing mysql2 (0.4.5), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.5'` succeeds before bundling.
```

# 原因

`mysql`がOSにインストールされていないから。
と、エラーメッセージをよくよく読んだら、親切に書いてあるという。

```
-----
mysql client is missing. You may need to 'brew install mysql' or 'port install mysql', and try again.
-----
```

というわけで、発生するエラー原因は Mac OS X に限ったものではないですね。

# 解決方法

`brew install mysql` を `bundle install` する前に打つだけ。
エラーメッセージはちゃんと読みましょうね、という教訓。
SSHによるREST APIの提供で最速リーン開発できないか調査

# はじめに
ここではリモートAPIの提供方法について、簡単なやり方がないか調査した内容を記載します。下記の記事を読んでSSHでのリモートAPI提供に感化されたのが始まりです。

- [何でもSSHでやってしまいませんか？ | コンピュータサイエンス | POSTD](http://postd.cc/ssh-how-does-it-even/)

SSHでのリモートAPI提供の実装例は下記です。作ってみた結果、うまくやればかなり短期間でリモートAPI（のプロトタイプ）を提供できるのではないかと思いました。

- https://github.com/raiich/rest-sshd


# SSHでのリモートAPI提供のメリット
主に下記のメリットがあると思います。

- SSHの認証＋セキュア通信の枠組みでAPIを提供できる
- リーン的な開発で、MVPのコンセプト検証に素早く取り掛かれる
    - 性能要件などは一旦置いておいて
- 僕のような流行に疎い人でも簡単に実装できる

(パスワード認証だと逐一パスワードの入力が手間かもしれませんが)
公開鍵認証やシングルサインオンなどでSSHログインする仕組みがあれば素早くリモートAPIを提供できると思います。

ただ、多数のリクエストを受け付けたり長期運用したりするのは向かないかもしれません。


# API呼び出しイメージ
利用側からはsshコマンドの引数でAPIの引数を与えてレスポンスを得ます。

- SSHの認証の結果によりユーザーごとに異なるレスポンスも可能
- テキスト形式だけでなくバイナリを返すことも可能

```
$ ssh -p 16039 usr1@rest-sshd-host GET text
 → user1 file.
$ ssh -p 16039 usr2@rest-sshd-host GET text
→ user2 file
$ ssh -p 16039 usr2@rest-sshd-host GET image   > grp2-copy.jpg
### ==> then image can be opened
```


# 実現方法
下記のようにしてAPIサービスを立ち上げることで、SSHによるリモートAPIが提供できます。

## sshd_configの設定(ForceCommand)
SSHログインを契機として適切なレスポンスを返すために、sshdの設定ファイル(sshd_config)の `ForceCommand` を設定してあげます。

```
# in sshd_config (may be copied to another file)
ForceCommand sh /opt/rest-sshd/example/handler.sh
```

`ForceCommand` の設定により、クライアントの指定したコマンドを無視して設定したコマンドを実行できます。ここで自作のプログラムを指定することで、SSHログインに対して様々なレスポンスが可能になります。

また、ログインユーザーがAPI呼び出し以外のこと（通常のSSHログインだったらできるようなこと）を実行するのを防ぐことができます。


## 引数の取得
もともとSSHで渡された引数は `$SSH_ORIGINAL_COMMAND` に入っているので、これをForceCommandに指定したプログラム内で使用します。シェルスクリプトのプログラムから使う場合は、配列に直したり `set` コマンドで引数の置き換えをしたりします。

```
args=(${SSH_ORIGINAL_COMMAND})
filetype=${args[1]}
```


## 新規にsshd起動
既存のsshdサービスと競合しないポートで待ち受けるようにしてAPIサービスを立ち上げることで、管理者のSSHログインも可能となります：

```Shell
$ sudo /usr/sbin/sshd -p 16039 -f /opt/rest-sshd/rest_sshd_config 
```

このとき、PIDファイルが競合しないようにsshd_configファイルの設定を変えておく必要があるかもしれません。

```
# in sshd_config (may be copied to another file)
PidFile /tmp/my-sshd.pid
```
脆弱性検知ツールvulsインストール時にgo-cve-dictionaryインストールでエラーになった場合の対処方法

#2016年１２月１０日追記
vulsのREADMEではgo-cve-dictionaryのインストールにmake installを使っており、
その場合、エラーは発生しないためこの手順は不要です。
最新情報はhttps://github.com/future-architect/vuls
を参照するのが確実です。
kotakanbeさんご指摘ありがとございます。

#はじめに
脆弱性検知のためにvulsの動作確認をしていて、新しいサーバでも使えるようにしようと思ったら、go-cve-dictionaryのインストールでこけたので、それを回避する手順を書き記す。

#確認環境
|  |  |
|:-:|:-:|
|OS   | CentoS6.5  |
|go   |1.7.3   |

#エラー内容
[あなたのサーバは本当に安全ですか？今もっともイケてる脆弱性検知ツールVulsを使ってみた] (http://qiita.com/sadayuki-matsuno/items/0bb8bb1689425bb9a21c)
この手順に沿ってインストールしようとすると、go get github.com/kotakanbe/go-cve-dictionaryが以下のようなエラーでこける。

```
[root@localhost ~]# go get github.com/kotakanbe/go-cve-dictionary
package github.com/labstack/echo/engine/standard: cannot find package "github.com/labstack/echo/engine/standard" in any of:
	/usr/lib/golang/src/github.com/labstack/echo/engine/standard (from $GOROOT)
	/root/.go/src/github.com/labstack/echo/engine/standard (from $GOPATH)
[root@localhost ~]# 
```

#go-cve-dictionaryインストールエラーの原因
go-cve-dictionaryの中で"github.com/labstack/echo/engine/standard"をインポートしてるが、最新のlabstack/echoのmasterにはなく、v2.2.0以前にしか残っていない。

#go-cve-dictionaryインストール
事前にlabstack/echoのv2.2.0を$GOPATH/src/github.com以下にクローンをして、go get github.com/kotakanbe/go-cve-dictionaryを実行すれば良い。

```
$ mkdir -p $GOPATH/src/github.com/labstack 
$ cd $GOPATH/src/github.com/labstack
$ git clone https://github.com/labstack/echo
$ cd echo
$ git checkout 54a4d3140722793aa1cc430bd8a4a73aedff2783
$ go get github.com/kotakanbe/go-cve-dictionary
```

#vulsインストール
vulsインストール以降は、[あなたのサーバは本当に安全ですか？今もっともイケてる脆弱性検知ツールVulsを使ってみた] (http://qiita.com/sadayuki-matsuno/items/0bb8bb1689425bb9a21c)と同じ手順でOK。

```
$ sudo mkdir /var/log/vuls
$ sudo chown USER_NAME /var/log/vuls
$ sudo chmod 700 /var/log/vuls
$ go get github.com/future-architect/vuls
```

GOのimportの時にバージョン指定ができるといいんだけど、できないみたいなのでこの手順で回避した。
GR-CITRUSでI2C接続の2色カラーLEDマトリックスを使う

# 概要
[Adafruitの8x8モノカラーLED Matrix用のライブラリをつくった](http://qiita.com/paichi81@github/items/2f5973adedb9d42b1d3f)けど、2色にしてもさほど手間ではなさそうなので勢いにのって対応してみた。

# 使い方

GitHubの[led_matrix_8x8_Bi.rb](https://github.com/paichi81/adafruit_led_matrix)のClass定義を自分のプログラムの先頭にでもコピペする。
表示用バッファに8行分の情報を定義して、write_displayする。

### 準備&実行
[GR-CITRUSの基板ピン配置を参考](http://gadget.renesas.com/ja/product/citrus.html)にpin11,12(Wire4)からそれぞれSDA,SDCを配線。
5V, GNDをBrakeout基板に配線。

```ruby:sample.rb
m = Matrix_8x8_Bi.new({:port=>4, :addr=>0x70})
m.buffer = [
  "33333333",
  "33222233",
  "33211233",
  "33200233",
  "33211233",
  "33222233",
  "33333333",
  "00000000"
]
m.write_display
```
0: 消灯, 1:赤, 2:緑, 3:橙で表示される。


### デモ
https://www.instagram.com/p/BNlKu5aBoPu/


## 雑記
本当は基になるClassを作って継承したほうがカッコイイんだろうけど、どうもmrubyだとクラスが多くなると中間ファイルのバイト数が大きくなる(当たり前か)ぽいので、それぞれで分けた方が小さくなりそうだった。
Arduino用のプログラムを見ていると赤色用バッファと、緑色用バッファを用意して...と面倒くさそうだけど、こういうときRubyだと文字列でホイホイ操作できるので手軽やね。
メソッドの命名規則について悩む。

MVC（model-view-controller）についてです。

僕が若手PHPerだった2006年頃、「MVCって知ってる？」と聞かれ、
「MVC？　あぁ、モジュール、ビュー、コントロール　ですよね♪」
（惜しい！）

って感じでよく分かっていませんでした。
この頃はPHP4→5への移行が始まり、クラスやオブジェクト指向の学習が必要になってきた時期でもありました。

modelとcontrollerは、今でも理解できてるのか微妙ですが、
とりあえず、controller開発者がmodelの中身を見ずにメソッドを扱える事が条件(方針)だと思っています。
（現実、仕事だと役割分担がmodel開発者とcontroller開発者で分けられていない為、この方針を忘れる事は良くありますが←）


さて、本題のメソッド名です。
めんどくさがりな僕はコメントを書くのが嫌いなので、
メソッド名で全てを語ろうと命名規則を思考中です。

例えば、こんな感じのルール
{戻り値の型}{データタイプ}_{テーブル名}_{取得方法}

例：
```php
->aTable_User_all(['id'=1]);
```
model開発者は規則通りの名前でメソッドを作り、
controller開発者は規則通りのメソッド名を呼び出すだけで良く、いちいちmodelから欲しいメソッドを探す必要がなくなると思います。

このような命名規則で、Create,Read,Update,Deleteのメソッドを作っておくのは当然として、
CRUD以外のイレギュラーなメソッドの呼び出しをmodelの中身を知らない人が出来るのか？という壁にぶち当たります。
イレギュラーな処理はcontrollerに書くしかないのか…
そのまえに、CRUDに関してはORM使えばメソッドなんて作る必要ないような…

う～ん…　何が正解かわからなくなってきた。

何か良い命名規則や開発手法がありましたらご教授ください。
PHPのエラーログにHTTP POSTのパラメータを出力するコード

```php
<?php
error_log(print_r($_POST,true),0);
?>
```
* ZabbixのURL監視で正しくPOSTパラメータ渡せてるか確認する時などに
* エラーログはデフォルトでHTTPDのerror_logに出力される
APIライブラリをgo-json(改)で楽に実装する

## はじめに

[vimeo][0]のAPIライブラリを実装したときに便利だった[go-json][1]の紹介と問題点、その改良について書きます。


## 使いどころ

以下の条件が揃ったとき、[go-json][1]のありがたみが感じられます。

* APIクライアントを実装する必要がある
* レスポンスのタイプがJSONである
* APIのレスポンス内容が多い
* レスポンスのサンプル値が簡単に手に入る


## 使い方

まずは通常通りインストール

```bash
$ go get github.com/ChimeraCoder/gojson/gojson
```

ドキュメント等からJSONのレスポンス値を集め

```bash
$ ls *.json
group.json    list.json    me.json    video.json
```

[go-json][1]で構造体を一括生成します
`-pkg`はpackage名、`-name`は構造体名、`-input`変換元のJSONファイル、`-o`で出力先です

```bash:generate-struct.sh
for f in $(ls); do 
  name=$(echo $f|sed 's/.json//g')
  gojson -subStruct true -pkg vimeo -name ${name^} -input $f -o ${name}.go
done
```

また、生成時に`-subStruct`オプションを`true`にしているので
ネストしているJSONは、`Size struct{...}`ではなく別の構造体に分割されます

```json:video.json
{
  "id": "2321232",
  "created_at": "2016/12/24",
  "size": {
    "width": 400,
    "height": 860
  }
}
```

```go:video.go
package vimeo

type Video struct {
	CreatedAt string     `json:"created_at"`
	ID        string     `json:"id"`
	Size      Video_sub1 `json:"size"`
}

type Video_sub1 struct {
	Height int64 `json:"height"`
	Width  int64 `json:"width"`
}
```

## 問題点

動作には何も問題がなかったのですが、私の用途では以下の点で構造体の出力形式が不十分でした。

**その1**
ネストしたJSONを分割して出力できるのは良いのですが、生成される名前が`${nameで指定した名前}_sub${counter}`のため、
構造体の名前を一つづつ正しいものに直していかなければならない。
https://github.com/ChimeraCoder/gojson/blob/6039f74e19c1090f88a75f74700b72e539717a22/json-to-struct.go#L301

**その2**
ネストしたJSONの中には、中身が同一のものが存在するため重複して定義されてしまう。
また、重複して定義されていることを確認する方法が目grepしかなかった。

## 改良

1つ目は、多くの場合ネストする構造体の名前は呼び出し元の名前と一致するので呼び出し元の名前を使うように修正。
2つ目については、go-json側に実装すると別物になってしまうので
ネストする構造体の出力ファイルを別ファイルに吐き出し、構造体の生成後に`diff`コマンドを使う手を取りました。

実際の修正内容はこんな感じ。
https://github.com/Ladicle/gojson/pull/1/files
これを先ほどの`video.json`に対して実行すると2つのファイルが吐き出されます。

```go:00_video.go
package vimeo

type Video struct {
	CreatedAt string `json:"created_at"`
	ID        string `json:"id"`
	Size      Size   `json:"size"`
}
```

```go:01_video.go
package vimeo

type Size struct {
	Height int64 `json:"height"`
	Width  int64 `json:"width"`
}
```

はっぴー( ･⊝･ )

## おわりに

今回は構造体に焦点を当てましたが、
実装時にはリクエストの生成やエラーハンドリング、パッケージ分割などにも悩みました。
そんな時に参考にしたのは以下のライブラリです。特にstripeはコンパクトで読みやすいのでオススメです。

* https://github.com/stripe/stripe-go
* https://github.com/drone/go.stripe
* https://github.com/Azure/azure-sdk-for-go


[0]: https://developer.vimeo.com/
[1]: https://github.com/ChimeraCoder/gojson
[2]: https://github.com/ChimeraCoder/gojson/issues/14
Azure App Service へASP.NET Web アプリをコマンドプロンプトからデプロイする

# はじめに
Azure App ServiceをVisualStudioを起動せずに、コマンドプロンプトからデプロイしたい。

# 準備
下記のサイトを参考にAzure App Serviceを作成します。
　　 [Visual Studio を使用した Azure App Service への ASP.NET Web アプリのデプロイ](https://docs.microsoft.com/ja-jp/azure/app-service-web/web-sites-dotnet-get-started)

# デプロイに必要な情報を手に入れる
VisualStudioから一度デプロイを実行すると、デプロイに必要な情報が入ったファイルが作成されます。
　```C:\MyExample\MyExample\Properties\PublishProfiles\[AppServiceのリソース名].pubxml```

# Azureポータルからデプロイのためのプロファイルを手に入れる
次に、Azureポータルを開き、準備で作成したApp Serviceのプロファイルをダウンロードします。

 ```リソースグループ > [準備で作成したリソースグループ] > [AppServiceのリソース名] > 概要```

下記の**発行プロファイルの取得**をクリック
![発行プロファイルを取得.png](https://qiita-image-store.s3.amazonaws.com/0/126467/8382a45f-dcb5-3367-826f-60bc8a982d97.png)

ダウンロードしてきた**[AppServiceのリソース名].PublishSettings**の中にある**\<userPWD>**タグの内容をコピーしておきます。

# コマンドプロンプトからデプロイする
いよいよ、コマンドプロンプトからデプロイを実行します。デプロイにはMSBuildを使用します。
VisualStudio2015ではMSBuildは下記にあると思います。
　```C:\Program Files (x86)\MSBuild\14.0\Bin```
VisualStudioのバージョンによってMSBuildのパスが異なるため注意が必要です。[^1]
　　
[^1]: [Can't find msbuild.exe in visual studio 2010](http://stackoverflow.com/questions/8730919/cant-find-msbuild-exe-in-visual-studio-2010)

コマンドプロンプトを開き、下記のコマンドを実行することでデプロイできます。
 ```MSBuild C:\MyExample\MyExample.sln /p:DeployOnBuild=true /p:PublishProfile="[AppServiceのリソース名]" /p:Password=[発行プロファイルから取得したパスワード]```

準備で公開したサイトへ再度アクセスし、変更を確認します。
今回は、タイトルを"ASP.NET"から"Deploy Succeed"に変更しました。

![デプロイ成功.png](https://qiita-image-store.s3.amazonaws.com/0/126467/cf955e3a-626b-8231-b3a8-9534a0400f1b.png)

# その他
## pubxmlファイルについて
初回の作成をVisualStudioに任せてしまったので、pubxmlのファイル名が[AppServiceのリソース名]と同じです。しかし、内容さえ間違っていなければファイル名はなんでも良いようです。
また、一度pubxmlファイルを作成してしまえば他のWebアプリの発行する際にも使いまわせます。開発用とリリース用などで使い分けると便利だと思います。

## パスワードについて
今回パスワードはコマンドを実行する際に入力していますが、先ほどのpubxmlに含めることができます。
含める場合はpubxmlファイルの\<PropertyGroup>タグ内に**\<Password>タグ**を追加し**[発行プロファイルから取得したパスワード]**を入力します。

## デプロイするユーザについて
デプロイに使用するユーザとパスワードはpubxmlファイルを作成した際に自動で作られているようですが、Azureポータルから追加し使用することもできます。
![デプロイ資格情報.png](https://qiita-image-store.s3.amazonaws.com/0/126467/5f19f822-0035-f044-4e79-ff128295b30b.png)

追加した場合は、pubxmlの\<UserName>タグと\<Password>タグに情報を記述するか、2つのタグを削除しコマンド上で下記を追加するかです。
```/p:UserName=[追加したユーザ名] /p:Password=[追加したパスワード]```

# おわりに
調べ方が悪く、なかなか方法がわかりませんでした。
自分の備忘録的にまとめましたが、同様のことをやろうとしている方の参考なれば幸いです。

# 参考URL
下記のURLがとても参考になりました。ありがとうございます。
[ASP.NET Web Deployment using Visual Studio: Command Line Deployment](https://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/command-line-deployment)
[Azure App Service へのアプリのデプロイ](https://docs.microsoft.com/ja-jp/azure/app-service-web/web-sites-deploy#msbuild)
PlantUMLの成果をPDFにする

# 0. 問題点
PlantUMLはAtomやEclipseのPluginが充実していて素晴らしいのだけど、エディタやWikiが無いと見れないのはもったいない。PDF化すれば成果物をエンジニア以外とも簡単に共有できる。
しかし公式サイトに記載されているPDF化手順は面倒な上に、日本語変換がちゃんとできないという問題点がある。
http://plantuml.com/pdf

# 1. 解決方法：概要
PlantUMLでいきなりPDFを生成するのではなく、一度SVGを生成してから、InkscapeでPDFを生成する。

# 2. 解決方法：詳細
## 2-1. 環境構築
1.適当なCentOSマシンを用意し、JREまたはJDKをインストールする。

2.platuml.jarを準備する。  ※シーケンス図以外を作図する場合はGraphvizも必要。

``` bash
$ wget http://sourceforge.net/projects/plantuml/files/plantuml.jar/download
$ mv download plantuml.jar
```

3.IPAフォントをインストールする

``` bash
$ sudo yum -y install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
```

4.Inkscapeをインストールする

``` bash
$ sodo yum -y install inkscape
```

## 2-2. PDF化手順
PlantUMLでSVGを生成して、inkscapeでPDF化するだけ。

``` bash
$ java -jar plantuml.jar -svg 2-1_new.txt
$ inkscape -f 2-1_new.svg -A 2-1_new.pdf
```

シェルスクリプトでこの2行を実施するコマンドを作っても良いし、
MakeやRakeで一括変更するようにしても良い。
MacBook Pro retina mid2012（OSX 10.12.1）でスリープからの復帰が遅い時の対処法

# 症状
今までMacの復帰はものすごく速く開けると操作可能な状態でした。しかし、気づくと蓋を開けても真っ暗で、キーを押しても1-2分反応しない感じになってしまいました。
少し調べると、Macには３種類くらいのスリープモードがあるようです。私の場合はスリープ後、数時間経過すると、復帰が遅くなるようでした。
そこで、autopoweroffdelayを28800秒（8時間）から86400秒（24時間）にしました。

# 内容の確認
autopoweroffdelayが28800になっています。  

```
$ pmset -g
System-wide power settings:
Currently in use:
 standbydelay         4200
 standby              1
 halfdim              1
 hibernatefile        /var/vm/sleepimage
 powernap             0
 gpuswitch            2
 disksleep            10
 sleep                60 (sleep prevented by backupd)
 autopoweroffdelay    28800
 hibernatemode        3
 autopoweroff         1
 ttyskeepawake        1
 displaysleep         10
 acwake               0
 lidwake              1
```

# とりあえずの対処
スタンバイで遅いのかハイバーネートで遅いのかよくわからないので、以下の設定で様子見する。

```sudo pmset autopoweroffdelay 86400```

# 確認
ちゃんと86400になっています。

``` 
$ pmset -g
System-wide power settings:
Currently in use:
 standbydelay         4200
 standby              1
 halfdim              1
 hibernatefile        /var/vm/sleepimage
 powernap             0
 gpuswitch            2
 disksleep            10
 sleep                60 (sleep prevented by backupd)
 autopoweroffdelay    86400
 hibernatemode        3
 autopoweroff         1
 ttyskeepawake        1
 displaysleep         10
 acwake               0
 lidwake              1
```
# 今後の対応
これでしばらく様子を見てみて、遅くなるのがスリープ後8時間以降24時間前で治っていたら、この設定治らなかったらスタンバイの設定を見直すか。
根本的な対処法じゃないけどこれでしばらくやってみよう。
Swift愛好会合宿 – 参加録

# ノリで合宿来てしまいましたが
---
# せっかくなのでSwift書いてみよう
---
# 経緯
---
# 来る前
---
# Swift...?
---

![](https://tctechcrunch2011.files.wordpress.com/2015/06/taylor-swift-apple-music.png)

---
# 行きの電車で構文をなんとなく見る
---
# クラス
---
# 「はいはい」
---
# 静的型付け
---
# 「うんわかる」
---
# delegate
---
# 「まあなんとなく？」
---
# storyboard
---
# :innocent: 
---
# 細かいことは考えず
---
# 「Swift書けます」
---
# さて
---
# WEBエンジニアなので、WEBと絡めたい
---
# 「Firebase Realtime Database使ってみたい」
---
# チャットアプリ
---
# 作り始める
---
# が、
---
## Alamofireのインストールに1時間ハマり
---
## HTTP Requestに1時間ハマり
---
## 取得したJSONのパースにn時間ハマりそうだったので
---
# 別の方法を考える
---
# ググる
---
# 良い感じのチュートリアルを発見
---
## https://codelabs.developers.google.com/codelabs/firebase-ios-swift/#0
---
# 良さそう
---
# チュートリアルに忠実にやってみた
---
# できた
---
# https://github.com/edwardkenfox/friendlychat
---
# WEB側のアプリケーションも作って同期させよう
---
# できた
---
# https://github.com/edwardkenfox/vue-firebase-test
---
# ではここで
---
# DEMO
---
## [edwardkenfox.github.io/vue-firebase-test/](edwardkenfox.github.io/vue-firebase-test/)
---
## アプリと
<img width="392" alt="Screen Shot 2016-12-04 at 13.38.12.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/36524/093cad63-1994-43a2-ea89-28fd18ba9668.jpeg">

---

## WEBが
<img width="1440" alt="Screen Shot 2016-12-04 at 17.19.38.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/36524/e5a0680d-4aae-72cf-f266-47d2f2e0d440.jpeg">

---
## 同期してる！
---
# まとめ
---
# Swift
---
<br>
#### ・構文自体は良い感じ。固い（良い意味で）
#### ・レイアウトむずい
#### ・InterfaceBuilderやattributeなど、アプリ開発固有の部分に慣れるのに少し時間がかかりそう
---
# Firebase
---
# めっちゃ楽
---
# ありがとうございました
メール経由の監視系の通知をどのようにSlackに集約するか on AWS

こんにちは、[Goodpatch](http://goodpatch.com/jp)の[Prott](https://prottapp.com/ja/)チームでインフラを担当しています @urapico です。

今回は、メール経由で通知がくるものをどのように、[Slack](https://slack.com/) に集約するのかというお話です。主にAWSのお話でもあります。

---

サーバー監視系のソフトウェアの場合、結果をメールで通知してくるものが、いくつかあります。
例）
- [Tripwire](https://www.tripwire.co.jp/)
- [Logwatch](http://www.logwatch.org)

ただ、Prottチームでは、様々なディスカッション、CIの結果、コードレビューのメンション、DeployなどをSlack上で行っています。
なので、上記のようなソフトウェアの結果もSlackに集約できることがよりベターです。

# AWS SES :e-mail: 

まず、ソフトウェアのメールの受け先として、[AWS SES](https://aws.amazon.com/jp/ses/)を利用します。
SESは、メール送信のプラットフォームとして、非常に有名で活用している人も多いと思いますが、実は、メールを受信することも可能です。
しかも、受信可能な最大容量は、30Mと十分な容量です。

[Amazon SES を使用した E メールの受信](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/receiving-email.html)

この設定を利用すれば、SESで受信したタイミングで、[AWS SNS](https://aws.amazon.com/jp/sns/)やLambdaのfunctionなどを呼び出すということが可能です。

# Serverless Framework / AWS Lambda :zap:

次に、SESで受信した内容をどのようにSlackに通知する処理を動かすのかという点ですが、そのためだけにサーバーを構築するのも億劫ですし、ここは、今流行りのServerlessの力を借りたいと思います。今回は、[AWS Lambda](http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)を利用します。

Lambda を活用する場合、素の状態だと、以下の項目の管理が非常に厳しいです。

- コードの管理
- Lambda自身の権限管理
- テストコード、CI
- Deploy
- etc.

そこで、最近巷では、Lambdaを有効に活用ができるように、いくつかFrameworkが出てきています。
今回活用したのは、[Serverless Framework](https://serverless.com/) です。 (名前からしてすごい。。。)

![image](https://qiita-image-store.s3.amazonaws.com/0/6913/6462d71d-18e9-0851-4e6a-79e276313eb7.png)

私は、以前に素の状態で、Lambdaを使って、画像圧縮処理などを実装した経験がありましたが、その時に感じたのは、
バージョン管理や、CIなど通常のDeploy作業などと異なり、かなり属人的で、人の手がかかる所が多く、
このまま利用し続けるのは、難しいというものでした。

ただ、このServerless Frameworkを使ったところ、その不安感を拭い去ってくれるのでした。
バージョン管理や、Deployや環境ごとに、変数の値を変更したりなど、非常に簡単にこのFramework上で扱えました。

## Slackへの通知 :mailbox: 

Slackへの通知で１点気をつけないといけないことは、Slackの１ポストの容量が決まっている点です。
監視系のツールがポストしてくる量は、それを上回ることが多いため、今回は、Slackに通知すると同時に、
S3のバケットにもuploadするようにしています。

このS3に対する権限管理も　Serverless Frameworkが担ってくれます。
非常にシームレスに、Serverless のアプリケーションが構築でき、非常に満足です。

## その他にも活躍 :muscle: 

Serverless Frameworkの活躍する場は、上記以外にも、色々とあると思います。
具体的には、[AWS Cloudwatch logs](http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) などで集約したログを監視して、該当のログがあった場合に、それを加工して、Slackのチャンネルに投稿することも可能です。

# 最後に / 宿題 :pencil: 

今回、Slackに集約することができるようになりました。

ただ、このままではサーバーの数が増えると、Slackに通知される内容が多くなり、見るのも一苦労になってしまいます。
今後の宿題として、通知の量を何かしらのコントロールして、継続的に利用できるようにしていきたいと考えています。 :bow:
【Bluemix】Node-RED ｘ MongoDB@Composeを組み合わせて遊ぶ（その１）

Node-RED（Node.jsを簡単にGUIで作れるOSSのプラットフォーム）で、MongoDBをソースにしたいときのメモ。
元ネタはこちら。
https://www.compose.com/articles/power-prototyping-with-mongodb-and-node-red-2/?utm_source=vero&utm_medium=newsletter&utm_campaign=11302016&utm_content=control&utm_term=Newsletter&vero_conv=NoqddMoLM-s2lC7BfC0Jb2tnivBAqIZ17bGn0HpHOOl40KfI3iBPyJMcSXwOP7y7yagscTOTtRE5nCx_h-F1OuQsBiHC1jc5

やることは**MongoDBに入っているJSON形式のデータをhttpに表示させる**です。
これができれば、CURLコマンド等で、httpのページに対して、putとかpostをすればMongoにデータを入れることができるわけです。もしくはhtmlをちゃんと作れば、フォームに入力したデータをmongoに入れることができます。
今日はメモなのでとりあえず表示させるところまで・・。

## Node-REDの環境をBluemix上で作る
こちらの記事がわかりやすい、ちょっとインターフェースは古いですが、まあそのまんまです。
http://qiita.com/joohounsong/items/5b5241df84f910df6627#ibm-bluemix-node-red%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89

## MongoDBの環境をComposeで作る+データも入れておく
過去記事ご参照。
http://qiita.com/azzeten/items/2e3901c080aafed078eb

データはこんなかんじで入れています。
![スクリーンショット 2016-12-04 11.39.15.png](https://qiita-image-store.s3.amazonaws.com/0/119378/a14e73d0-fedd-dbd0-aacb-08c427fad0a4.png)


## では早速接続設定を・・

まず、MongoDBのノードを、Node-REDにインストールする必要があります。
右ペインの「Manage pallete」をクリックすると、左ペインが出現します。そこで「Install」タブを選択したあとに「mongodb2」で検索をかけてください。１つだけ候補が出て来るのでそれをinstall。
![スクリーンショット 2016-12-04 10.48.02.png](https://qiita-image-store.s3.amazonaws.com/0/119378/2d1e3be5-67af-8b59-59f4-f9d9c1823d46.png)

## Node-RED上でMongoDBをソースDBとして定義
左ペインに「mongodb2」と入れると、データ・ソースのアイコンとしてmongoが出てきますので、これをパレット上にドラッグ＆ドロップ。
![スクリーンショット 2016-12-04 10.46.41.png](https://qiita-image-store.s3.amazonaws.com/0/119378/1b8d6f78-b787-434e-9eb2-280f88b10a72.png)

ドラッグ＆ドロップしたアイコンの上をダブルクリックすると、右ペインが出現し、接続定義をしろと言われます。えんぴつマークをクリックするとcomposeのMongo管理画面に出てきている情報をそのままコピペします。で、AddをクリックしてDone。ペインが閉じられます。
![スクリーンショット 2016-12-04 10.51.00.png](https://qiita-image-store.s3.amazonaws.com/0/119378/d990c209-23af-be84-d2ad-31e1f0431cfa.png)

![スクリーンショット 2016-12-04 10.56.57.png](https://qiita-image-store.s3.amazonaws.com/0/119378/35d7d0ea-e49e-1d22-0460-b57c9ea2932e.png)

## mongoのデータを表示させるhttpを定義
inputノードをドラッグ・アンド・ドロップ、ダブルクリックして詳細を表示させたら/projectsという名前にします。このprojectsというページでGETが走ります。
![スクリーンショット 2016-12-04 11.03.02.png](https://qiita-image-store.s3.amazonaws.com/0/119378/3bb0a43d-9800-f4bc-f7d7-75ffc233ad7d.png)


getしたら、それを表示させるページの定義です。
で、線をつなげて完成です。右上のDEPLOYをクリックします。
![スクリーンショット 2016-12-04 11.43.43.png](https://qiita-image-store.s3.amazonaws.com/0/119378/8b708d81-025c-1400-7624-cf4e9eef1eff.png)


## 結果を確認
「http://noderedの名前.mybluemix.net/projects」
にアクセスしてみます。

![スクリーンショット 2016-12-04 11.41.49.png](https://qiita-image-store.s3.amazonaws.com/0/119378/9319143a-69ea-e1f8-6e94-dff3ea7ed712.png)

できましたーー。
地味・・！！
Amazon RekognitionをRubyから叩いてみる

僕のような迷えるAWS初心者のために。
圧倒的に成長したのでちゃんと導入から書いて編集しました。

# aws-sdk導入
```
bundle init
```

```ruby
# frozen_string_literal: true
source "https://rubygems.org"
gem "aws-sdk"
```

```
bundle install
```

# リクエスト
`detect_labels`をリクエストしてみます。

```ruby
require "aws-sdk"
Aws.config[:region] = "ap-northeast-1"
Aws.config[:access_key_id] = "****************"
Aws.config[:secret_access_key] = "***************"

rekog = Aws::Rekognition::Client.new(region: "us-east-1") # AP対応まだです?
# https://s3.amazonaws.com/hoge/dir/1.jpg
result = rekog.detect_labels({
 image: {
   s3_object: {
     bucket: "hoge",
     name: "dir/1.jpg"
   },
 }
})
result.labels.each do |label|
 puts("#{label.name} #{label.confidence}")
end
```

`max_labels`や`min_confidence`のオプションが指定できます。
S3ではなくてバイナリでリクエストすることもできそうです。

[ドキュメント](http://docs.aws.amazon.com/sdkforruby/api/Aws/Rekognition/Client.html)はこの辺にあります。

# 結果

1%のマニアックなお客様の需要に応えた看護師のフリー写真素材サイトの素材をお借りしました。
http://nurse-web.jp/photo/ 

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/21799/78343e9a-88a9-42e1-8ccc-0d6a7dff0472.jpeg)
↓

```
Human 99.27359771728516
People 99.27857208251953
Person 99.27857971191406
Nurse 50.79678726196289
Female 50.725425720214844
```

やったぜ！

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/21799/f049dc03-e55d-0d50-4f44-4bb79bea8430.jpeg)
↓

```
People 99.2396011352539
Person 99.2396011352539
Human 99.23065185546875
Head 55.16327667236328
Portrait 55.16327667236328
Selfie 54.765235900878906
Face 54.30482482910156
Female 53.51632308959961
Hair 51.61334228515625
Haircut 51.61334228515625
```

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/21799/bb90dbe3-9b9b-c913-cf3b-87971cc8ffb7.jpeg)
↓

```
Desk 98.12632751464844                                                                                         
Furniture 98.12632751464844
Table 98.12632751464844
Collage 83.7958984375
Poster 83.7958984375
Electronics 73.93887329101562
Hardware 73.93887329101562
Flyer 58.507293701171875
Brochure 54.80351257324219
Paper 54.80351257324219
Computer 54.42918395996094
LCD Screen 54.42918395996094
Laptop 54.42918395996094
Pc 54.42918395996094
Apparel 51.038368225097656
Clothing 51.038368225097656
Photo Booth 50.5786018371582
Console 50.56346130371094
```

# 注意事項
S3も同一リージョンのものを使うのが望ましいようです。今後エラーになる可能性がありそうです。
【cakephp】画面の表示がうまくいかない時

# ドキュメントルート
詳細は、こちら↓
http://book.cakephp.org/2.0/ja/deployment.html

通常は、
app/webroot/ をドキュメントルートに設定すべき。

# URLリライティング
詳細は、こちら↓
http://book.cakephp.org/2.0/ja/installation/url-rewriting.html

### ◆ Apache と mod_rewrite (と.htaccess)
CakePHP は、mod_rewrite を使用するようになっている。

※mod_rewriteの詳細についての分かり易い記事
http://www.phpbook.jp/cakephp/install/index3.html

うまく画面が表示できなくて苦労することがあり、その為の解決策を幾つか下記に提示する。

# httpd.confの確認
※これらのファイルは、ディストリビューションや Apache のバージョンによって異なる。

[確認1].htaccess のオーバーライドが許可されていること

[確認2]正確な DocumentRoot に対して AllowOverride が All に設定されていること
例を挙げると以下のようになる。

```
# Each directory to which Apache has access can be configured with respect
# to which services and features are allowed and/or disabled in that
# directory (and its subdirectories).
#
# First, we configure the "default" to be a very restrictive set of
# features.
#
<Directory />
    Options FollowSymLinks
    AllowOverride All
#    Order deny,allow
#    Deny from all
</Directory>
Apache 2.4 以上の場合、 httpd.conf やバーチャルホストの設定を以下のように 更新する必要があります。

<Directory /var/www/>
     Options FollowSymLinks
     AllowOverride All
     Require all granted
</Directory>
```

[確認3]mod_rewrite を正しく読み込んでいること。

```
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
```
↑デフォルトではコメントアウトされているので、コメントアウトを解除する。

[確認4]httpd.confは、設定を変更したら、必ずApacheを再起動すること。

[確認5].htaccess ファイルが実際に正しいディレクトリにあるか確認する。 

[確認6]
CakePHP のコピーがサイトのダウンロードセクション、
または、Gitリポジトリからのものであることを確認する。
UWPの場合、作成したbin\ARM\Debug\*.exeにはアイコンがついていない

UWPの場合、作成したbin\ARM\Debug\*.exeにはアイコンがついていない。これを目にするのは開発者だけである、という理由のためであろうし、実行環境に転送後には、たくさんの解像度に応じたアイコンを表示するので、exeにはもつ必要がない、ということでもあるのだろう。

とはいえ気になるので、なんとかならないかと考えた。
Resouce Hackerを使って、強制的にexeにアイコンを埋め込んでみようと考えた。

開いてみるが、exeにはアイコン情報がない!
VersionとManifestがあるだけ。ふむ。そうか。
それではアイコン表示できないな～。
すると、ここにアイコンがあるのは、シェル=Explorerが表示しているのか。ふむ。
ImageJにプラグインを導入する on mac os x sierra

# ImageJをMacにインストール
[ダウンロード](https://imagej.nih.gov/ij/download.html)したzipファイルを解凍し、ImageJフォルダごとApplicationsに移動する。

# Sierra上のImageJでPluginが追加できない
[MetaMorphのnd FileをimageJで開く](http://life-science-project.com/454/)を参考に同じpluginを入れた。しかしimportメニューにndファイルが出てこない。この状態だとImageJのアップデートも出来ない。
## 原因
Sierraに伴って追加されたセキュリティ機能([Gatekeeper Path Randomization](http://applech2.com/archives/macos-10-12-sierra-gatekeepr-path-randomization.html))。
要するにセキュリティを高めるための施策だが、往々にしてセキュリティを高めるときには犠牲となるものがあって、今回はImageJもその一つだった。

## 解決策
[公式サイト](https://imagej.nih.gov/ij/docs/install/osx.html)に記載あり。
> You can disable path randomization by moving ImageJ.app out of the ImageJ folder and then copying it back.

Opt(Alt)キーを押しながらImageJのアプリケーションファイルを`Applications/ImageJ`フォルダから一度出して戻す。
語彙力のなくなるブックマークレット

[クソアプリ Advent Calendar](http://qiita.com/advent-calendar/2016/kusoapp) 2016の4日目です。

# 背景
今の会社にいるエンジニアで、非常に優秀にもかかわらずリアクションが「ヤバい」「すごい」「それな」しかバリエーションが無いためにネタにされ続けている社員がいる。
そんな彼が文章を書いたらどうなるかというのをWebサイト上で再現できないかという試み。

# 概要
ブックマークレットを実行すると、閲覧中のWebサイトの語彙力が無くなってしまうというもの。

# 利用方法
1. ブックマークに下記のコードをURLとして登録する。（ブックマークレット化）
 
```script.js
javascript:void%20function(){document.body.appendChild(document.createElement(%22script%22)).src=%22//nabettu.github.io/fukasawa/script.js%22}();
```

([こちらのサイト](//nabettu.github.io/fukasawa/)でテスト出来ます)

2. 語彙力をなくしたいWebサイトでブックマークレットをポチる
3. 語彙力がなくなる。

以上です。

# サンプル

最近出た弊社の「経営理念解釈」というブログで実行してみた。
https://www.kayac.com/news/2016/12/philosophy_blog_vol3

## Before
![981e3524.png](https://qiita-image-store.s3.amazonaws.com/0/40154/8abc50fd-320c-ace3-4bca-8511a0695209.png "981e3524.png")


## After
![3cf9a4a8.png](https://qiita-image-store.s3.amazonaws.com/0/40154/72a57821-f89b-3202-979e-8fd8f6dcc556.png "3cf9a4a8.png")


# 注意点
これを実行すると、Domに紐付けられたjavascriptがリセットされますのでご注意。
それも考慮してつくってもよかったですが、まぁクソアプリなのでｗ



現場からは以上です。