OmniAICreator/Qiita-1.07M huggingface dataset:
vagrant packageしたboxを別のマシンに移設したときに公開鍵を設定し直す


複数マシンで同じ環境を構築したいときvagrant packageしてコピーしたりしますが、公開鍵設定し直さないとvagrant sshがこけるのでその対応。


# パターン１：vagrantの秘密鍵を使ってアクセスできるようにする

# 公開鍵を作る

~/.vagrant.d/insecure_private_keyが秘密鍵。
こいつから公開鍵を作る

```
$ ssh-keygen -yf ~/.vagrant.d/insecure_private_key > ~/.vagrant.d/insecure_private_key.pub
```

# boxに反映する

```
$ ssh-copy-id -i ~/.vagrant.d/insecure_private_key vagrant@192.168.33.10
```

# アクセスする

```
$ vagrant ssh
```


# パターン２：独自に秘密鍵・公開鍵を使ってアクセスできるようにする

# 公開鍵を作る

```
# デフォルトでいいけど、ファイル名等変更するなら覚えとく
$ ssh-keygen -t rsa
```

# boxに反映する

```
$ ssh-copy-id -i ~/.ssh/id_rsa vagrant@192.168.33.10
```

# アクセスする

```
# vagrant ssh-configの内容を~/.ssh/configに書けばもっと便利
$ ssh vagrant@192.168.33.10
```
bashとPythonとGoでのy/n処理

ちょっとしたCLIツールを作るときによく使う、`[y/n]`を表示して確認や対象指示を促す処理。それをGo,Python,bashの3つでのやりかたです。

やっていることは、
`are you okay?`と聞いて、No(n)とだけ答えたら`oh no.`、それ以外は`yeah good.`と表示します。

- メッセージの表示
- 標準入力からの`改行(Enter)`までの入力
- 前後スペーストリム
- 判別

## bash

``` bash
#!/bin/bash

read -p "are you okay?[Y/n]" ans
if [ "$ans" = "n" ]; then
  echo "oh no."
else
  echo "yeah good."
fi
```

`read`を使い、シンプルに読み込んで後はそれに対する処理を書くだけです。`read`がホワイトスペースで分割し、ansに格納します。その際に前後のホワイトスペースが除去されています。
※コメントいただいた内容をもとに編集。

## Python

``` python
from sys import stdin

print "are you okay?[Y/n]"
ans = stdin.readline()

if ans.strip() == "n":
    print "oh no."
else:
    print "yeah good."
```

bashとほぼ同じですが、1箇所違うのが、`readline()`で読み込んだ文字列は末尾に改行を含んでいます。
今回は`strip()`で一緒に除去されていますが、そうでないときは、`rstrip()`などで末尾だけとって使います。
そのまま文字列比較すると改行が一致しないので、意図しない動きになります。

## Go

``` go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	fmt.Println("are you okay?[Y/n]")
	reader := bufio.NewReader(os.Stdin)

	ans, err := reader.ReadString('\n')
	if err != nil {
		fmt.Print("input err:", err)
		os.Exit(1)
	}

	if strings.TrimSpace(ans) == "n" {
		fmt.Println("oh no.")
	} else {
		fmt.Println("yeah good.")
	}
}
```

さすがにmainやエラー処理を書く分、bash,Pythonと比べると長くなります。GoもPythonと同じく改行が含まれるので、`strings.TrimSpace()`や`strings.TrimRight()`などで適宜削除して使います。
THETA Sのシャッター音を消すシェルスクリプト

THETA Sになって、これまでのPTP/IPではなく、HTTPベースであるGoogleのOpen Spherical Camera APIになった（[公式ドキュメント](https://developers.theta360.com/ja/docs/v2/api_reference/)）。

CURLなどHTTPコマンドを使えば、シェルからTHETA Sを制御できるので、まず手始めにTHETA Sのシャッター音を消すシェルスクリプトを書いてみる。

curlで3回THETA SにHTTP POSTしていて、それぞれのPOSTで、

1. sessionの開始
1. ボリュームの最小化
1. sessionの終了

を実行している。

```
#!/bin/bash
CMD="curl http://192.168.1.1/osc/commands/execute -s -H \"Accept: application/json\" -H \"Content-type: application/json;charset=utf-8\" -X POST -d"
SID=`${CMD} '{"name":"camera.startSession"}'| sed -E "s/^.*\"sessionId\":\"([^\"]*)\".*$/\1/"`
${CMD} "{\"name\":\"camera.setOptions\",\"parameters\":{\"sessionId\":\"${SID}\",\"options\":{\"_shutterVolume\":0}}}"
${CMD} "{\"name\":\"camera.closeSession\",\"parameters\":{\"sessionId\":\"${SID}\"}}"
```

ちなみにシャッター音の制御は、THETA S独自の拡張（[公式ドキュメント](https://developers.theta360.com/ja/docs/v2/api_reference/options/_shutter_volume.html)）。

(2016/01/14追記)
[Node.jsで使えるTHETA S用モジュールを公開](http://qiita.com/horihiro/items/fcede0708f990319b7aa)しました。

(2016/03/04追記)
[オフィシャルアプリ](https://theta360.com/ja/support/download/)（Sも無印も）で、音量調整がでるようになりましたね。
このスクリプトはもう不要かな。
AWS IoTのレイテンシーを測ってみた（２）

AWS IoTのレイテンシーについて、[前回の記事](http://qiita.com/okapin/items/107f76de6643a03b9ad3)を書いた後、継続して計測していたところ、顕著な変動があることが分かったので、追加投稿します。
# 計測方法

- [前回の記事](http://qiita.com/okapin/items/107f76de6643a03b9ad3)と同様にPublish/Subscribe間のLatencyを計測しました。
<img width="240" alt="PubSubTestEnv.png" src="https://qiita-image-store.s3.amazonaws.com/0/70819/5fe78ee0-2523-b7c6-e1ad-ba8598c1947b.png">


- 測定間隔は前回の４秒から１０分に変更し、約５日間計測しました。

|項目|内容|
|:-----------|------------|
|ツール実行環境|ap-northeast-1 t2.micro Instance|
|使用ツール|nodejs版AWS IoT device sdk|
|使用モジュール|examples/device-example.jsにタイムスタンプを追加して使用|
|レイテンシー算出方法|Publish時、Subscribe時それぞれでタイムスタンプを記録して、その差を使用|

# 計測条件

|項目|前回|今回|
|:-----------|------------|------------|
|実行間隔|4秒|600秒|
|実行回数|200回x2|710回x2|

# 結果

- それぞれのデバイスで計測値が顕著に変化する現象が見られました。
- レイテンシーが変化するタイミングと同タイミングに、デバイス＝サーバ間のコネクション再接続が発生しているケースが見られました。
- 前回の計測期間を通した平均レイテンシーは、50msとなり、前回の平均22msから倍増しました。
- 今回の計測期間では、平均値が12ms〜89msの間で大きく変動する結果となりました。
- 以下のチャートでは、対向する２つのデバイスのそれぞれを赤と青に色分けして示しています。

- Publish/Subscribe レイテンシー推移

![awsIoTresponse.png](https://qiita-image-store.s3.amazonaws.com/0/70819/0030efe1-a933-991e-6580-ed10f912dc8a.png)

- Publish/Subscribe レイテンシー集計結果

||前回|今回|
|:-----------|------------|------------|
| 平均(Sec) | 0.022 |0.050|
| 90パーセンタイル(Sec) | 0.032 |0.087|

- Publish/Subscribe レイテンシーヒストグラム

![AWS_IOT_ResponseHistgram.png](https://qiita-image-store.s3.amazonaws.com/0/70819/a77a5da7-6c9e-b447-d965-ac057c5a50ac.png)

レイテンシーの変動要因は、いろいろ想像できますが、このレベルの変動はあるものだと考えるのが良さそうです。
通常の使い方では、さらにAWSに往復するための回線遅延が加わるので、それも考慮する必要があります。
何れにしても、Publish/Subscribeの基本的な使い方では、ユーザの操作感などに顕著に影響するような顕著な遅延は見られませんでした。
今後チャンスがあったら、より大規模なケースも試してみようと思います。

[前回の記事：AWS IoTのレイテンシーを測ってみた（１）](http://qiita.com/okapin/items/107f76de6643a03b9ad3)
El Capitan(10.11)でCocoaPodsが使えなくなった時の対応


## 解答
```
$ sudo gem install -n /usr/local/bin cocoapods
$ pod setup
$ pod install
```

## 解答に至るプロセス
* 久しぶりにiOSのコーディングを楽しもうかと、リポジトリからチェックアウトして、pod installとエラー

```
$ pod install
-bash: pod: command not found
```

* OSのメジャーアップデートもしちゃったし、cocoapodsも再インストールか？と思って、今まで通りのコマンドを打つとエラー

```
$ sudo gem install cocoapods
-bash: pod: command not found
```

* 再インストールしても、パスが通っていないみたいなので、パスを指定して再々インストール

```
$ sudo gem install -n /usr/local/bin cocoapods
```

* インストールはうまくいったが、Podのリポジトリが見つからないと……。

```
$ pod install
[!] Error installing ASIHTTPRequest
[!] /usr/bin/git clone https://github.com/pokeb/asi-http-request.git
```

* podの再セットアップ

```
$ pod setup
```

* pod install成功。

```
$ pod install
Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Installing ASIHTTPRequest (1.8.2)
~~
```

というか、ここからがスタートなんだけど。
IFTTTのMakerを使ってRaspberry Piから定期的に部屋の温度をトリガする

#はじめに
Raspberry PiにUSB温度計を接続して、muninやM2Xに定期的に測定値を投げる方法を紹介したが、今回はIFTTTのMakerチャンネルを活用して、IFTTTのIf This Then ThatのThisをmakerチャンネルで実現。Thatを変えて、色々な場所に測定値を飛ばせるようにした。

遊んだ時の記事は以下を参照してほしい。
[RASPBERRYPIにUSB温度計をつけて、MUNINでグラフ化](http://barbarossa.no-ip.org/wp/?p=155)
[M2Xで部屋の温度を記録する](http://barbarossa.no-ip.org/wp/?p=185)

#準備
Raspberry PiにUSB温度計を接続して、temperコマンドで利用可能にするまでの手順は、上記の[RASPBERRYPIにUSB温度計をつけて、MUNINでグラフ化](http://barbarossa.no-ip.org/wp/?p=155)で紹介したので、こちらを参考にしてほしい。

##IFTTT側の設定
Makerチャンネル経由で測定値を送る準備をする。
Makerチャンネルでキーを生成して、トリガがかけられるようにしておく。
あとは、curlでPUTすればOK。
![スクリーンショット 2015-10-25 09.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/95484/8efbe17c-e43b-eb80-92a3-78d2ad8feb85.png)

How To Trigger Evensでトリガのテストが可能。
生成されたキーがURLに入っている。
{event}の箇所が、IFTTTでレシビを作った際に「どのトリガなのか？」を区別する箇所になる。
つまり、Makerチャンネルを1つ作っておけば、レシピ作成時に複数のトリガを同時にかけることができる。
![スクリーンショット 2015-10-25 09.52.301.png](https://qiita-image-store.s3.amazonaws.com/0/95484/ae8c057b-f898-d8d1-c403-1926a6a9635d.png)

##Raspberry Pi側の設定
こちらは、cronから定期的に温度を投げるようにすればOK。
IFTTTの思想的に「定期的に」や「一定の時間になったら」という条件をつけた瞬間に、それがThisになってしまうので、「定期的に」「なにか」を「なにか」へ、を実現するためには誰かが定期的にトリガをかけてやる必要がある。
そこでRaspberry Pi側はcronでIFTTTのMakerチャンネルにトリガをかけるようにすればよい。

```bash
#!/bin/sh

temp_date=$(/usr/bin/temper | cut -f1 -d',') 
temp_val=$(/usr/bin/temper | cut -f2 -d',') 

curl -X POST -H "Content-Type: application/json" -d "{\"value1\":\"$temp_date\",\"value2\":\"$temp_val\"}" https://maker.ifttt.com/trigger/{YOUR EVENT}/with/key/{YOUR KEY}
```

こんな感じのスクリプトを書いて、cronで動作させる。
/etc/cron.dに以下のような感じで15分おきにトリガするようにしてみた。
スクリプトの場所は自分が作った場所へ適宜変更よろしく。

```bash
#!/bin/sh
*/15  *   * * *     root  /home/pi/temper/usb_temp.sh
```

temperコマンドを叩くと、以下のように「取得時間」「温度」が表示される。
これをcutで分解し、curlコマンドでIFTTTにValue1に取得時間、Value2に温度を入れて投げる。
そうすると、IFTTTから値を取り出してThenThatできる。

```bash
pi@raspberrypi2 ~ $ sudo temper
2015-10-25 10:05:02,26.92
```

#IFTTTでレシピを作る
準備が完了したらレシピを作り、好きな場所に定期的に送られてくる室温を保存する。
今回はGoogleスプレッドシートへの保存と、Wolfram Data Dropへの保存をやってみた。
![レシピ.png](https://qiita-image-store.s3.amazonaws.com/0/95484/7d05ec82-9f27-c2e1-a7b2-340cef93fa8d.png)

##レシピ作成時の設定
Event Nameに固有のイベント名を入力する。
この名称がMakerチャンネルでイベントを識別するための名称となる。
curlコマンドで投げたURLに使われている所ね。（以下の{YOUR EVENT}の箇所）

```bash
curl -X POST -H "Content-Type: application/json" -d "{\"value1\":\"$temp_date\",\"value2\":\"$temp_val\"}" https://maker.ifttt.com/trigger/{YOUR EVENT}/with/key/{YOUR KEY}
```
![レシピ詳細.png](https://qiita-image-store.s3.amazonaws.com/0/95484/43b50c5f-cb46-dcdb-fd0c-75c9a8632f76.png)

##Googleスプレッドシートへの出力結果
こんな感じ。バッチリですな。いえい。
![sheet.png](https://qiita-image-store.s3.amazonaws.com/0/95484/349b96f7-f640-1f95-e2c1-0133141d4657.png)

#さいごに
IFTTTの魅力爆発なMakerチャンネルは活用すべしって感じ。
Slackに投げるもよし、twitterでつぶやくもよし。この辺りの楽しさがIFTTTの良い所。
単純にcurlで投げても面白いのだが、IFTTTのMakerに投げることで、ThenThatを変えて複数の効果を簡単に得られる感じがとてもいいですな。

Netatmo ウェザーステーションもIFTTT連携できるチャンネルがあるが、「ある一定の室温になったら」というトリガしかなく、「ある時間の温度、湿度、気圧のデータをどこかに」はIFTTT単体では無理。
そのような場合もNetatmoのWebAPIをRaspberry Piから叩いて、同じようにMakerチャンネルに投げればOKなので、俄然とNetatmoが欲しくなってしまう。
Write-Hostに複数の引数を指定できた

[MSのTechNetにあるWrite-Hostの説明](https://technet.microsoft.com/ja-jp/library/ee177031.aspx)は非常に簡潔で、

- 表示したいリテラルをひとつ、直接指定する

- 表示の際に文字色と背景色を指定できる

- 実行後の改行をキャンセルする"-nonewline"オプションがある

の三つだけが書かれています。

## 変数だって指定できるしコマンドの実行結果だって指定できる
変数に関しては、まぁ敢えて説明されなくても**普通にできる**と思っちゃうよね。

``` powershell
(*'-') >> $msg="Hello world!"
(*'-') >> Write-Host $msg
Hello world!
```

じゃあコマンドの実行結果は？

``` powershell
(*'-') >> Write-Host Get-Date
Get-Date
```

…失敗。てかクォートしなくてもリテラル指定できるのか。

``` powershell
(*'-') >> Write-Host (Get-Date)
2015/10/25 9:42:45
```

正解はこう。コマンドを丸括弧で括ると実行結果に置き換わって`Write-Host`に渡される。

## 値も変数も実行結果も一緒くたに指定できた
[素数判定のスクリプト](https://gist.github.com/Takeru-chan/7095b29e128c6357ca7e)を書いてみた。

``` powershell
(*'-') >> ./isPrime.ps1 201510250953
NOT prime.
```

これを使ってたとえば1から10について素数判定した結果を表示する時。

``` powershell
(*'-') >> foreach ($n in 1..10) { Write-Host $n "is" (./isPrime.ps1 $n)}
1 is Not Applicable.
2 is Prime.
3 is Prime.
4 is NOT prime.
5 is Prime.
6 is NOT prime.
7 is Prime.
8 is NOT prime.
9 is NOT prime.
10 is NOT prime.
```

このように`Write-Host`に対して続けざまに引数を与えると、すべて連続して表示してくれる。しかもご丁寧に空白で区切って。

ということに今朝気づいた。
IoTあるじゃん特別セミナーに参加した

# セミナーの基本情報
* 時間：２０１５年１０月０３日
* 場所：日本マイクロソフト株式会社品川本社セミナールームA
* 申し込み：http://connpass.com/event/20534/
* 参加費：　無料 (無料ドリングもゲットできるよ)


# 概要
* Steve Mellor氏は、IoT（Internet of Things）の意味と枠組みを講演する
 * http://www.iiconsortium.org/index.htm
* IoTあるじゃんの活動紹介やIoTに関する技術情報を紹介する


# 内容

## [Steve Mellor氏](http://www.iiconsortium.org/staff.htm)は、IoT（Internet of Things）の意味と枠組みを講演する

### わかっていること
* IoTは、どうな物、どうなシステムじゃなくて、概念である。Web2.0に似てるはず。時代のワードである。
* Steve Mellor氏は、主にIoTを説明するじゃなくて、[IIC](http://www.iiconsortium.org/)のスタッフとして、IICと言うのは何かことを説明した
* ここから、IICについて説明する

### IIC

IICとは

* Industrial Internet Consortiumの略称
* アメリカの複数企業が協業してソリューションの構築を目指す団体
 * AT&T,Cisco,GE,Intel,IBM
 * [ここ](http://www.iiconsortium.org/cgi-bin/iicmembersearch.pl)から、Founderをサーチできる 
* 成立：2014年３月
* 提出した概念： インダストリアルインターネット
 * ドイツ政府は、似てる概念も提出した： industry 4.0


### Industial Internet(インダストリアルインターネット)

* https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%80%E3%82%B9%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88
* 三つのwave
 * Industrial Revolution
 * Internet Revolution
 * Industrial Internet Revolution


### industry 4.0

* ドイツでは同様の取り組みとしてインダストリー4.0が政府主体で提唱されている
* 四つのステップ
 * 第1次産業革命 : 機械工業の導入による産業の変革
 * 第2次産業革命 : 電力による大量生産
 * 第3次産業革命 : コンピューターによる生産の制御
 * 第4次産業革命 : industry 4.0



## IoTあるじゃんの活動紹介やIoTに関する技術情報を紹介する

* 今後は、いろいろなIoTに関する活動を運営する予定


## 感想

### IoTの分類

* IoTの応用を考えて、主に以下の三つの部分が分かれると思う
 * application
 * operation
 * analysis
* 種類によって、システムの構成が違うことがあると思う

### analysis

* センサーやデバイス処理されたデータを分析する
* 大体にリアルタイム分析やデータを詰めて定期的な分析
* リアルタイムの分析が、システムの性能要求が高くて、AMQPやMQTTなどサーバーとリアルタイムでデータ分散処理できるサービス(AWS Kinesis)が必要
* データを詰めて定期的な分析が、システムの性能要求が高くなくて、データ処理速くない場合は、HTTPSを使っても大丈夫と思う、GAなどデータ保存と可視化サービスも利用できると思う

### aplication

* センサーやデバイス処理されたデータより、ユーザは、何かことために、利用できるようにする
* リアルタイム性の要求が高くなると思う
* 応用：デバイス管理
    * サーバー監視と同じように、デバイスのメモリ、CPU、ストレージなどシステム情報を貰える
    * もしアプリが何か変なことであれば、リモート操作でテストや対応できるようにしたい。サーバー側にSSHでアクセスして、コントロールできるが、デバイスがよくアクセスできないので、いい方法やいいプロトコルを考えないといけない
    * ユーザにデバイスを渡す前に、デバイスとシステム連携などのテストとユーザはデバイスをもらう時に、確認や初期化など作業が必要である

### operation

* システムのリアルタイム性の要求が一番高い。
* そのために、いろいろなサービスがある
    * AWS IoT
    * Google Pub/Sub
    * Azure IoT Hub

### IoT時代のシステム開発、運用、保守

* Web時代と比較して、開発とテストが、ブラウザ、アプリ、サーバーだけじゃなくて、デバイス、分析なども確認しないといけない
* 運用と保守の方は、デバイスの管理や障害対応など作業も増えるはずだと思う
* 分析の方は、ユーザと交流して、データ分析して最終にユーザ営業広大目的を達成できるようにする。
Raspberry PiからPushBulletにPushする

[PushBullet](https://www.pushbullet.com/)の[create-push](https://docs.pushbullet.com/#create-push)を参考に

```push2bullet.sh
#!/bin/bash
AccessToken=[MyPushbulletAccessToken]
curl --header "Access-Token: ${AccessToken}" \
     --header 'Content-Type: application/json' \
     --data-binary "{\"body\": \"$2\" ,\"title\": \"$1\" ,\"type\":\"note\"}" \
     --request POST \
     https://api.pushbullet.com/v2/pushes
```

```lang:使用例
./push2bullet.sh Title MessageBody
```
![push2bullet.sh.png](https://qiita-image-store.s3.amazonaws.com/0/89027/193d6164-50da-78c8-413a-90afbbac0fc8.png)
winAppDev > WPF / WinForms

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
2.1 簡単なGUIアプリケーションの例

> .NET Frameworkには、WindowsフォームとWPF (Windows Presentation Foundation)と呼ばれる２つのGUIフレームワークがあります。

「Windowsフォーム」は、「Windows Forms」「WinForms」などで検索してもいい。

<hr>
それぞれのadvantageの比較
http://www.wpf-tutorial.com/about-wpf/wpf-vs-winforms/

<hr>
pros and cons

[INFRANGISTICS](http://www.infragistics.com/community/blogs/devtoolsguy/archive/2015/04/17/windows-presentation-foundation-vs-winforms.aspx)

<hr>
http://stackoverflow.com/questions/57909/when-creating-a-new-gui-is-wpf-the-preferred-choice-over-windows-forms)

AndyLさんによる回答の要約

  - 通常の開発にいきなり使わず、事前調査しなさい
  - 顧客のPCのintegrated graphics chips setsがサポートされているか意識しなさい
  - grounds-up developmentを含むか検討しなさい
  - (WPF移行時に)生産効率が落ちるのを考慮しなさい
  - 色々な実装方法が使えるようになる一方、（可読性が落ちるので）メンテナンスが大変ですよ (FizzBin nature)
Rack経由でWEBrickのBindAddressを変更するにはHostオプションを使う

Rackでは1.6以降デフォルトのBindAddressがlocalhostになった。
そのため、Webで公開するためにはBindAddressを変更する必要がある。

WEBrickサーバのオプションは```BindAddress```だけどRackのWEBrickハンドラーのオプションは```Host```で上書きされているので注意。

https://github.com/rack/rack/blob/1-6-stable/lib/rack/handler/webrick.rb#L29


```rb
  options = {
   :Host => '0.0.0.0',
   :Port => 3333
  }
Rack::Handler::WEBrick.run App, options
```
csharp > string > .Join() > msg = string.Join(", ", aaa, bbb, i);


http://ideone.com/LfWAhP

```test.cs
using System;

public class Test
{
	public static void Main()
	{
		string msg;
		string aaa = "AAA";
		string bbb = "BBB";
		int i = 314;
		msg = string.Join(", ", aaa, bbb, i);
		Console.WriteLine(msg);
	}
}
```

```txt:結果
Success	time: 0.04 memory: 23936 signal:0
AAA, BBB, 314
```

","などで連結できる。

`aaa + "," + bbb + "," + i`と書くよりは見やすいのかもしれない。
csharp / LINQ > WhereやSelectなどのメソッドは、１要素ずつ処理されます

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
7.3 LINQ

> ...WhereやSelectなどのメソッドは、１要素ずつ処理されます。

```test.cs
using System;
using System.Linq;

class Program
{
  static int GetValue()
  {
    System.Threading.Thread.Sleep(100);
    return 0;
  }

  static void Main() 
  {
    var q = Enumerable.Range(0, 10).Select(x => GetValue());

    // ...

    foreach (var x in q.ToArray()) // 1秒フリーズ
    {
       Console.WriteLine(DateTime.Now.Millisecond);
    }
  }
}
```

qをvarで代入した時には100ミリ秒のSleepは起きず、.ToArray()でxに入れる段階でSleepが起きるようだ。
Jekyllでjsonからハッシュのキーを取得する方法


下記のようなオブジェクトを走査しようとした際にキーの取得の仕方に迷った。

```_data/sample.json
{
	"key1": ["value1-1", "value1-2"],
	"key2": ["value2-1", "value2-2"]
}
```

for文で回す際に下記のように`hash[0]`で取得できた。値は`hash[1]`で取る。

```sample.html
<ul>
{% for sample_hash in site.data.sample %}
{% assign key = sample_hash[0] %}
{% assign values = sample_hash[1] %}
	<li>{{ key }}
		<ul>
		{% for value in values %}
			<li>{{ value }}</li>
		{% endfor %}
		</ul>
	</li>
{% endfor %}
</ul>
```

下記のように出力されます。

```出力結果
<ul>
    <li>key1
        <ul>
            <li>value1-1</li>
            <li>value1-2</li>
        </ul>
    </li>
    <li>key2
        <ul>
            <li>value2-1</li>
            <li>value2-2</li>
        </ul>
    </li>
</ul>
```
技術英語 > to the point of insubordination / on the verge of a meltdown

@ Star Trek Voyager > LEARNING CURVE

反抗した部下についての報告でTuvokが言った言葉

> He became extremely angry, <font color=red>to the point of insubordination</font>.

http://eow.alc.co.jp/search?q=to+the+point+of
> 〔程度・度合い・段階などが〕～まで、～のところまで、～するまでに、～するくらいに、～と言える［言ってよい］ほどに、～と思われるほど

http://eow.alc.co.jp/search?q=insubordination
> 〔上位者に対する〕不服従

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=on+the+verge+of
> on the verge of a meltdown
> 《be ～》崩壊寸前である、株価暴落の瀬戸際に立たされる
electronでsocket.ioを使うとレンダープロセスでrequireできない?!

# 背景

[IPアドレスを取得するNode.jsのモジュールを自作してelectronを動かしているPCのアドレスを表示して、スマホからこのアドレスにアクセスしてその後、socket.ioでWebSocket通信させようと試み](http://abrakatabura.hatenablog.com/entry/2015/10/24/113659)ていた。

ところが、レンダープロセスで、requireして自作のnpmモジュールが読み込めない。


# socket.ioはfile://だと上手くいかない

通常のElectronではメインプロセスが話のコードで

```js
mainWindow.loadUrl('file://'+__dirname+'/index.html');
```

という具合に、file://でレンダープロセスのlocation.hrefを指定する。
ところが、socket.ioだと、この指定だと、動かない。真面目に、コード読んでないが、
おそらくsocket.ioのクライアントが話のコードでlocation.hrefに依存した処理がある模様。これがfile://だとダメで、httpもしくは、httpsを指定する必要がある。

ということで、socket.ioを使う場合、以下の様になる。

```js
mainWindow.loadUrl('http://127.0.0.1:3000');
```

# レンダープロセスではfile://

ところが、レンダープロセスではhttp://やhttps://では、
requireで任意のモジュールが呼び出せない。
not foundとエラーとなってしまう。

# 対策

## メインプロセス側

メインプロセス側で__dirnameにpackage.jsonのmainに指定したjsへのパスが格納されている様なので、これをレンダープロセス側に渡す。

```js
mainWindow.loadUrl('http://127.0.0.1:3000/s?d='+__dirname);
```

## レンダープロセス側

```js
module.paths.push(location.search.slice(3)+'/node_modules');
const localip = require('node-ore-module');
```

# 参考資料

- https://github.com/atom/electron/issues/2631
- https://github.com/atom/electron/issues/2539

# 関連記事

- [Electronで自分のIPアドレスをLAN内のiPhoneに通知するには](/entry/2015/10/24/113659)
- [Raspberry Piの温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた](/entry/2018/06/16/070747)
- [ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと](/entry/2016/01/09/134348)
- [ElectronでmacOSのDockやWindowsのタスクバーに独自のアイコンを表示するには - non vorrei lavorare](/entry/2018/08/20/202928)
- [Tensorflowのclassify_image.pyにElectronでGUIを被せてみた](/entry/2017/02/05/134054)
- [lisp版ElectronのCeramicを動かした](/entry/2015/09/08/071602)
rake db:migrate で「the column 'type' is reserved」エラーが出た話

Rails でマイグレーション実行しようとしたときのエラー。

## エラーメッセージ
```
$ bundle exec rake db:migrate
rake aborted!
ActiveRecord::SubclassNotFound: The single-table inheritance mechanism failed to locate the subclass: 'Migrations'. This error is raised because the column 'type' is reserved for storing the class in case of inheritance. Please rename this column if you didn't intend it to be used for storing the inheritance class or overwrite ActiveRecord::SchemaMigration.inheritance_column to use another column for that information.
```

「the column 'type' is reserved for storing the class in case of inheritance.」というエラー。

## データベース確認
```
mysql> desc schema_migrations;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| class   | varchar(255) | NO   |     | NULL    |                |
| type    | varchar(50)  | NO   |     | NULL    |                |
| created | datetime     | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
```

schema_migrations テーブルに type というカラムがあり、この単語が予約語であるため、「the column 'type' is reserved for storing the class in case of inheritance.」と言われていた。

結論を言うと、この schema_migrations テーブルは Rails 用のマイグレーション管理テーブルではなく、 CakeDC/migrations (CakePHP のマイグレーションプラグイン) が扱うマイグレーション管理テーブルなのであった。


## Rails のマイグレーション管理テーブルの定義は以下
```
mysql> desc schema_migrations;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| version | varchar(255) | NO   | PRI | NULL    |       |
+---------+--------------+------+-----+---------+-------+
1 row in set (0.00 sec)
```

こっちがあるべき姿。

## おしまい
schema_migrations のテーブル定義を見てすぐ違いに気づければ良かったんだけど、普段見るものじゃないのでなかなか気づけなかった。。

何故こんな混ざり現象が起こってしまったのかというと、これは完全にプロジェクト事情なのだけど、データベースの定期更新バッチを Rails で作り、ウェブインターフェースを CakePHP で作る、というハイブリッドな構造にしていたことが混乱の原因だった。

そのプロジェクトは基本的にマイグレーションは CakePHP で行う方針で固めていたのだけど、ひさしぶりに触ったときにはそんな方針忘れており、何も考えずに Rails 側のマイグレーションを実行しようとしてしまい、エラーが発生していた、という経緯。

しょうもないミスだけどけっこうドハマリしてしまったので記録を残しておく。
ログなどテキストファイルの特定の列の数えて傾向を知る方法

# はじめに  
ログは時間ごとに出ます。
ログ解析などで秒や分単位でログ出力を簡単に見て集計したいことがあります。
CSVなどのデータから列ごと値の出力傾向を足し算して出したいことがあります。
これまではExcelにログを貼り付けて列を抜き出して足し算を出力していました。
しかしログが膨大な場合は計算が遅くてイマイチでした。

# コマンド

`grep 検索したい文字列  ファイル名 | awk -F , '{print $列番号}' | sort | uniq -c``

検索したい文字列やファイル名が決まっている時は

`awk -F , '{print $列番号}' ファイル名 | sort | uniq -c`

区切り文字が半角スペースの時は

`awk '{print $列番号}' ファイル名 | sort | uniq -c`

パイプ（|）前の出力結果を確認しながらパイプをつないでいくと理解しやすいようです。
MacのFinderでファイルパスをコピーしてからターミナル.appやiTerm2.appにテキストをエスケープしてペーストする時のショートカットキーの違いを見つけたので、備忘録として。


El capitan 10.11.1
Terminal.app
iTerm2.app

## 動機
iTerm2.appでディレクトリを移動したい時などに、Finderでファイルパスをコピー&ペーストで行おうとした時に、``No such file or directory`` とエラーとなってしまうことで、いろいろ調べてみた。

## 原因
ディレクトリネームにスペースがあることでエラーとなることが判明。

例

	% cd /Users/Home/Desktop/Test Dir

	% cd Volumes/Macintosh HD2/TestDir
	


## 対処方法
スペースの前に ``\`` バックスラッシュや、パスを ``" "`` で囲むことで認識されるようになることが解った。

---

**ターミナル.appの場合** 

1.通常の ``⌘v`` でパスをペースト 
``% cd /Volumes/Macintosh HD2/TestDir`` 
その後で、
``% cd "/Volumes/Macintosh HD2/TestDir"`` か、
``% cd "/Volumes/Macintosh\ HD2/TestDir`` と、手動で追加する。


2.メニュー⇨編集⇨「テキストをエスケープしてペースト」で選択する方法と、``control+command+v`` ショートカットキーでペーストする方法。

	% cd /Volumes/Macintosh\ HD2/TestDir


上記の例のように、スペースの前にエスケープとしてバックスラッシュが追加された状態でペーストされます。

**参考サイト**
[「ターミナル」で空白文字を含むディレクトリやファイルを扱うときに便利な小技](http://macperson.net/terminal_escape_paste/)


---

**iTerm2.appの場合**

iTerm2.appでは「テキストをエスケープしてペースト」での方法を見つけることができなかったのと、``control+command+v`` でのペーストにも対応していない、手動で訂正するのも合理的じゃない気がする、なんとかターミナル.appのように一発でペーストがしたいという気持ちのまま、下記のサイトを参考にしてみた。

**参考サイト**
[MacOSX - FinderでファイルをコピーしてからTerminalにペーストすると絶対パスがペーストされる - Qiita](http://qiita.com/takc923/items/00565c5b9e5992b462da)

上記サイトで紹介していたzshの設定で、URLを自動でエスケープしてくれるという

	autoload -U url-quote-magic
	zle -N self-insert url-quote-magic
	
を、.zshrcに設定して試してみましたが、設定方法を間違ってしまったのかうまくいきませんでした。

---

### 偶発的な起こり

iTerm2.appでなんとか方法はないものかとあれこれ試していた時、`option+command+v` で、スペースの前にバックスラッシュが入った状態でペーストされました。

やっと方法を見つけたぞ！　　よっしゃー！　　


## まとめ
改めて、ファイルネームやホルダーネームにはスペースは使わない方が良いと思ったのと、
多分みんな知っているのかなと思いつつも、いくらググっても見つけることができずいたのが、対応できる方法が見つかり解決できたのが良かったと思い安堵してます。
C++ : ラムダ式のみでの再帰文


以前、Cocos2d-xを利用する際に再帰文を書こうとしたらやり方がよくわかんなかったので調べた。


```
int main()
{
    std::function<void(int)> hoge = [&hoge](int i)
    {
        if(i == 5) return ;
        printf("%d", i);
        hoge(++i);
    };
    
    hoge(0);
}
```

重要なのはどうキャプチャするか。

[=]での代入だと、初期化が完了していない段階でキャプチャするのでnullを代入することになり、
ラムダ内での自身の呼び出しに失敗する。

正解は[&]での参照で自身をキャプチャする方法。
こうすることでラムダのみで再帰を実現することが出来ます。

以下おまけ。

```
auto hoge = [&hoge]()
{
        
};
```
これは無理。
ラムダで宣言する場合、コンパイル時に型が決まっていないといけないけれど、これだと同時に型不明のオブジェクトをキャプチャすることになって型解決できずにエラーになる。

```
template<T>
std::function<void()> hogehoge = [&hogehoge](T)
{
        
};
```
これも無理。
そもそもテンプレートがラムダ式に適用出来ないから当然。

残念。C98で止まってる人もC++11を楽しんでる人もそこまで。さよならー

###けどC++14なら全て解決する。

autoでのラムダ宣言も許されるしテンプレート化も可能。

ほとんどどっかに書いてあったことの受け売りだけど、要約するとCocos2d-xをC++14で書ける環境って良いですよね。
C++楽しいです。
gem install mysql エラー対処メモ

## gem install mysql でエラー
```
# gem install mysql
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
        ERROR: Failed to build gem native extension.
…
checking for mysql_ssl_set()... *** 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.
…
/usr/local/rbenv/versions/2.2.2/lib/ruby/2.2.0/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
…
extconf failed, exit code 1
…
```

## 対処
「You have to install development tools first.」
とあるのでそれっぽいものをインスコ。

```
# yum -y install mysql-devel
…
Installed:
  mysql-devel.x86_64 0:5.5.46-1.el6.remi                                             

Complete!
```

## 対処後
```
# gem install mysql
Building native extensions.  This could take a while...
Successfully installed mysql-2.9.1
Parsing documentation for mysql-2.9.1
Installing ri documentation for mysql-2.9.1
Done installing documentation for mysql after 1 seconds
1 gem installed
```

解決。
RCSB PDB の search API を使う


## 初めに

http://www.rcsb.org/pdb/software/rest.do の、[Advanced Search](http://www.rcsb.org/pdb/search/advSearch.do) を使おうとして少しはまったのでメモ。

## 用途
PDBコードとかタンパク質のシーケンスとかを入れると、マッチしたPDBへのリンクを返してくれたりする。

## 基本的な使い方
http://www.rcsb.org/pdb/rest/search に、以下の様な xml を HTTP POST するだけ。認証とかは不要。

```xml
<orgPdbQuery>
<queryType>org.pdb.query.simple.SequenceQuery</queryType>
<sequence>VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGKKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR</sequence>
<searchTool>blast</searchTool>
<sequenceIdentityCutoff>70</sequenceIdentityCutoff>
</orgPdbQuery>

```

こんな感じでマッチしたPDBコード一覧が返ってくる。
> 1A00:1 1A01:1 1A0U:1 1A0Z:1 1A3N:1 1A3O:1 1A9W:1 1ABW:1 1ABY:1 1AJ9:1 1B86:1 1BAB:1 1BBB:1 1BIJ:1 1BUW:1 (中略)  6HBW:1 

## ハマったこと
以下の2点を守らないと、トップページ?のHTMLが返ってくる。

* POSTするxmlは、実際にはこんな感じでエンコードしないといけない。 

>%3CorgPdbQuery%3E%0D%0A%3CqueryType%3Eorg.pdb.query.simple.SequenceQuery%3C%2FqueryType%3E%0D%0A%3Csequence%3EVLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGKKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR%3C%2Fsequence%3E%0D%0A%3CsearchTool%3Eblast%3C%2FsearchTool%3E%0D%0A%3CsequenceIdentityCutoff%3E70%3C%2FsequenceIdentityCutoff%3E%0D%0A%3C%2ForgPdbQuery%3E

* そのことをHTTPのヘッダに書いてやらないといけない。

```
content-type : application/x-www-form-urlencoded; charset=UTF-8
```

## 終わりに
xmlをエンコードするとかWebAPIでは常識なんでしょうか…。
だいぶ使う人が限られるAPIだとは思いますが、そのへんのこともわかりやすく書いておいて欲しかった…。
(もし書いてあったら教えて下さい)
[UniRx]購読を停止する

# 背景
UniRxを使用しているときに`Subscribe`の内部で`Subscribe`を終わらせたくなることがたまにあります。

```csharp
Observable.EveryUpdate()
    .Subscribe(_ =>
    {
        if (/* 何かの条件 */)
        {
            // ここでSubscribeをやめたい
        }
    });
```

こういう場合、以下の二つの方法で解決することができます。

## 方法1 TakeUntilを使う
`TakeUntil`を使う方法ではとある条件になった時に値を流すストリームを作成し,それを停止判定に使います。

```csharp
var hoge = Observable.EveryUpdate()
    .Where(_ => /* 何かの条件 */)
Observable.EveryUpdate()
    .TakeUntil(hoge)
    .Subscribe(_ =>
    {
        // 何かの処理
    });
```

### サンプル(クリックされた時に停止)
```csharp
var click = Observable.EveryUpdate()
    .Where(_ => Input.GetmouseButtonDown(0));
Observable.EveryUpdate()
    .TakeUntil(click)
    .Subscribe(l => Debug.Log(l));
```


## 方法2 IDisposableをキャプチャする
方法1は厳密には`Subscribe`の中から購読を停止しているわけではありません。
`Subscribe`の中から購読を停止するためには`Subscribe`の戻り値を`Dispose`する必要があります。
そこで`Subscribe`の戻り値を変数に格納し、その変数をラムダ式でキャプチャすれば購読を停止することができます。

```csharp

// SingleAssignmentDisposableを使う方法
var disposable = new SingleAssignmentDisposable();
disposable.Disposable = Observable.EveryUpdate()
    .Subscribe(_ =>
    {
        if (/* 何かの条件 */)
        {
            disposable.Dispose();
        }
    });

// CompositeDisposablを使う方法
// 複数のストリームを同時に止めることができる
var disposables = new CompositeDisposable();
Observable.EveryUpdate()
    .Subscribe(_ =>
    {
        if (/* 何かの条件 */)
        {
            disposables.Dispose();
        }
    })
    .AddTo(disposables);
Observable.EveryUpdate()
    .Subscribe(_ => /* ... */)
    .AddTo(disposables);
```

# おまけ
`First`を使用すると値が一度流れると購読を停止することができます。
しかし`First`のソースを読んでも`Dispose`する処理はすぐには見つかりません。

```csharp
// FirstCoreのソースを引用
static IObservable<T> FirstCore<T>(this IObservable<T> source, bool useDefault)
{
    return Observable.Create<T>(observer =>
    {
        return source.Subscribe(x =>
        {
            observer.OnNext(x);
            observer.OnCompleted();
        }, observer.OnError,
        () =>
        {
            if (useDefault)
            {
                observer.OnNext(default(T));
                observer.OnCompleted();
            }
            else
            {
                observer.OnError(new InvalidOperationException("sequence is empty"));
            }
        });
    });
}
```

しかし、`First`を使用すると購読が停止されるためどこかで`Dispose`を呼んでいるはずです。
答えは`Observable.Create`に渡す関数の第一引数である`observer`にあります。
`observer`は`IObserver<T>`と定義されていますが、実際のクラスは`AnonymouseObserver`なことが多いです。
そしてこの`AnonymouseObserver`の`OnCompleted`に`Dispose`処理があります。

```csharp
// AnonymouseObserverのソースを引用
// disposableはObservable.Createに渡した関数の戻り値を格納したSingleAssignmentDisposable

public void OnCompleted()
{
    if (Interlocked.Increment(ref isStopped) == 1)
    {
        try
        {
            onCompleted();
        }
        finally
        {
            disposable.Dispose();
        }
    }
}
```
haxeの中に生のjsを書く。

`untyped __js__`をつかって以下のように書けば良い。
複数行のstringも大丈夫なので、以下のような感じに書ける。

```hx:jsinhaxe.hx

var hoge:Int = 0;
var fuga:String = "";
untyped __js__("
 hoge=10+10;
 fuga =  'test ' +hoge;
");
        
trace(hoge); //20
trace(fuga); //test 20

```

ここで試せる！
http://try.haxe.org/#2Ff76
Macのfont suitcaseタイプのフォントをttfに変換する

MacにインストールされているfontをUnityなどで使いたい場合、/Library/Fonts/以下にttfやotfが存在する場合はそのまま使えるが、font suitcaseタイプ（拡張子なし）の場合は、ttfまたはotfフォーマットに変換する必要がある。この記事ではttfに変換する方法を紹介する。

## font suitcaseからdfontを抽出
以下のコマンドライン操作でfont suitcaseからdfontファイルを作成する。
```
$ cd <フォントが存在するディレクトリ>
$ cat <フォントファイル名>/..namedfork/rsrc > any_name.dfont
```

## dfontsplitterでdfont->ttfに変換
dfontsplitterは[ここ](http://peter.upfold.org.uk/projects/dfontsplitter)か、brew caskなどでインストールできる。
dfontファイルをドラッグ&ドロップ->Convertボタンでttfが作成できる。
Arduino + ドットマトリクスLEDで文字表示

通常、ドットマトリクスLEDは一列毎に高速に表示を切り替えることで図形の表示を行います。
使用するドットマトリクスLEDのデータシートがない場合、手荒ですが次の手順でピンの配置を調べることが可能です（８x８を超えるようなマトリクスは下記の限りではありません）。

１. 3V-GNDから引っ張ってきた線を、左上のドットが光るまで手当たり次第にピンにつないでみる
２. １の状態になったら、次は３Vからもう一本配線を出して、一番上の列、左から２番目（左上の隣）が光るまで手当たり次第ピンにつないでみる
３. ２で左から２番目が光らなかった場合は、GNDから引っ張ってきた線で２と同様のことを試す。
４. ２でいけた場合は３Vを、３でいけた場合はGNDからの線を使って、横１列全て光るまで繰り返す
５. １で見つけた配線のどちらか片方を外すと１ライン全てが消えると思います。そのときに残っている配線が、横１ラインを表現するためのピンです。
６. ５で外した配線を残りのピンに手当たり次第につなぎ、上から２番目のラインがすべて光る場所を探します。同様にすべてのラインについて探します。
７. ５で外した場所と６で見つけた場所が、各ラインを表現するためのピンです。

各制御ピンの場所が見つかったら配線し、１ラインごとに表示をしていきます。
下記の例では、5x7のドットマトリクス、
横１列の信号ピンが1,3,10,7,8
各ラインの信号ピンが12,11,2,9,4,5,6です

```
#define ANAPIN 0
#define BITTOP 0  // 1,3,10,7,8
#define LINETOP 5 // 12,11,2,9,4,5,6
#define CKPIN 13
#define ON_DELAY 2
#define SLEEPCMD delay // sleep 

int dat[] = {
  B00000,
  B00010,
  B00100,
  B01100,
  B10100,
  B00100,
  B00100,
};
int myHigh, myLow;
int timer;

// the setup function runs once when you press reset or power the board
void setup() {
  myHigh = CATHODE ? LOW : HIGH;
  myLow = !myHigh;
  timer=0;
  for(int i = 0; i< 5; ++i){
    pinMode(BITTOP+i, OUTPUT);
  }
  for(int i = 0; i< 7; ++i){
    pinMode(LINETOP+i, OUTPUT);
  }
  pinMode(CKPIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  int aval = analogRead(ANAPIN);
  aval = (aval-512)*0.1;
//  timer+=aval;
  int v=(timer/100);
  if(v<0){
    v+=70000;
  }
  int cnt = v%7;
  for(int i = 0; i< 7; ++i){
    setLine(LINETOP+i,dat[(cnt+i)%7]);
    SLEEPCMD(ON_DELAY);
  }
}

void setLine(int _pin, int _val){
  for(int i = 0; i< 7; ++i){
    digitalWrite(LINETOP+i, (_pin==LINETOP+i)?myLow:myHigh);
  }
  for(int i = 0; i< 5; ++i){
    digitalWrite(BITTOP+i, (_val>>(4-i))&1?myHigh:myLow);
  }
  digitalWrite(CKPIN, (_val>>0)&1 ? myHigh:myLow);
}
```

`//  timer+=aval;`
のコメントを外すと、A0に接続したボリューム抵抗等を変化させて垂直同期ズレのような効果を出すことができます。

https://youtu.be/G002_UglJeU

![スクリーンショット 2015-10-25 0.38.14.png](https://qiita-image-store.s3.amazonaws.com/0/59911/20004746-8971-ad17-ecd1-901ba800280d.png)
[短文]Pythonで簡単なGUIを超手軽に使いたい人のためのeasygui

あんまり知られていないようなので、ご紹介です。
http://easygui.sourceforge.net/

#これはなに？
簡単なメッセージボックスやYes, Noを問うダイアログ、開く/保存するファイル名を問うダイアログ、文字や数字、パスワードなどを入力させるダイアログ……などを、極めて簡単に作れるPythonのライブラリです。Python2, Python3どちらでも使えます。

複雑なGUIアプリを作るのには向いていませんが、ひとつやふたつユーザの入力がほしい、エラーをGUIで表示したいなど、ちょっとした用途には便利だと思います。

##利点
* とにかく簡単。
* 関数をひとつ呼び出すだけでGUIが出てくる。
* ましてや、GUIのためにクラスを作ったりする必要なんてない。
* マルチプラットフォーム。

##欠点
* 標準ライブラリではないので、インストールは必要。
* 凝ったGUIは作れない。

#インストール方法
`pip install easygui`

#使い方
[チュートリアル](http://easygui.sourceforge.net/tutorial.html)や[API](http://easygui.sourceforge.net/api.html)がわかりやすいです。

適当にいくつか使ってみると、こんな感じ。

```py
from easygui import *
name = enterbox("Input your name", default="Guido")
msgbox("Hello, " + name)
if ynbox("あなたは18歳以上ですか？"):
    age = integerbox("何歳ですか？", lowerbound=18, upperbound=10000)
filename = fileopenbox("ファイルを開く")
```
ユニバーサルアプリで暗号化

Windows API では、.NetのAPIから大きく変更されているようです。[hibaraさんの記事](http://qiita.com/hibara/items/c9096376b1d7b5c8e2ae)を参考にしてみたのですが、`AesManaged`をはじめとしたクラスはユニバーサルWindowsアプリの開発では利用できませんでした。

そこで、記事を参考に同様のことをWindows APIで行ってみます。

# 暗号化

`SymmetricAlgorithmNames.AesCbcPkcs7`で取得した`SymmetricKeyAlgorithmProvider`を用いると、CBCでPKCS7なAES暗号を利用することができます。

```csharp
private static readonly string ALGORITHM_NAME = SymmetricAlgorithmNames.AesCbcPkcs7;

private IBuffer toEncryptedBuffer(IBuffer buffer, string rawPassword, out IBuffer salt, out IBuffer iv)
{
	// https://msdn.microsoft.com/en-us/library/windows/apps/windows.security.cryptography.core.symmetrickeyalgorithmprovider.aspx
	SymmetricKeyAlgorithmProvider algorithm = SymmetricKeyAlgorithmProvider.OpenAlgorithm(ALGORITHM_NAME);

	salt = CryptographicBuffer.GenerateRandom(32);
	var derviedKey = createDerviedKey(algorithm, rawPassword, salt);

	iv = CryptographicBuffer.GenerateRandom(algorithm.BlockLength);

	return CryptographicEngine.Encrypt(derviedKey, buffer, iv);
}
```

`createDerviedKey`メソッドではキーの生成を行います。元の記事では Rfc2898DeriveBytes を利用していますが、[RFC2898とPBKDF2は同じアルゴリズムを指しています](https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rfc2898derivebytes(v=vs.110).aspx)。

```csharp
private const uint SALT_ITERATION_COUNT = 10000;

private CryptographicKey createDerviedKey(SymmetricKeyAlgorithmProvider algorithm, string rawPassword, IBuffer salt)
{
    KeyDerivationAlgorithmProvider pbkdf2 = KeyDerivationAlgorithmProvider.OpenAlgorithm(KeyDerivationAlgorithmNames.Pbkdf2Sha256);
    IBuffer passwordBuffer = CryptographicBuffer.ConvertStringToBinary(rawPassword, BinaryStringEncoding.Utf8);
    CryptographicKey key = pbkdf2.CreateKey(passwordBuffer);

    KeyDerivationParameters parameters = KeyDerivationParameters.BuildForPbkdf2(salt, SALT_ITERATION_COUNT);

    IBuffer derviedKeyMaterial = CryptographicEngine.DeriveKeyMaterial(key, parameters, 32);
    return algorithm.CreateSymmetricKey(derviedKeyMaterial);
}
```

暗号化前に圧縮をかける定石は、これまで通り`DeflateStream`が使えます。

# 複合

先ほどの`createDerviedKey`を使ってほとんど似たようなコードで複合することができます。

```csharp
private IBuffer toDecryptedBuffer(IBuffer buffer, string rawPassword, IBuffer salt, IBuffer iv)
{
    SymmetricKeyAlgorithmProvider algorithm = SymmetricKeyAlgorithmProvider.OpenAlgorithm(ALGORITHM_NAME);

    var derviedKey = createDerviedKey(algorithm, rawPassword, salt);

    return CryptographicEngine.Decrypt(derviedKey, buffer, iv);
}
```

解凍は`IBuffer.AsStream()`を使ってStreamにした後に`DeflateStream`に通します。

こちらも誤ったパスワードで複合した際のチェックを行っていませんが、だいたいは解凍時におかしくなってエラーになるっぽいです。

# 全体のプロジェクト

暗号化されたテキストを読み書きできるツールを作ってみました。

https://github.com/utisam/encedit
android-caffe-demoを動かす時に躓いたこと

こういう類のアプリでは珍しく(?)助け舟がなかったので自分が助け舟になれればと思って書きます。

[`caffe-android-demo`](https://github.com/sh1r0/caffe-android-demo)を使えるかどうか検討していたのですが、
そこで躓いたこととその解決法を幾つか書いていきます。

#### 1. 動かしたはいいけど写真を撮ったらぬるぽ出て落ちる
これはSONYのExperia Z4を使っていた時のバグです(しかもモデルを入れ忘れていた)。
確か`fileUri`が`null`だったと思います。
なんとか回避する方法を探していたのですが、いつの間にか出なくなってしまったので解決策は分かりません。
また、原因も分からないまま問題が解決してしまいました。

#### 2. モデル入れたら画面が黒くなったり復活したりして最終的に落ちる
これもExperia Z4でのバグです。
どうやらモデルの読み込みをしているようなのですが、何故か失敗しているらしく画面がいつまで経っても描画されませんでした。
その時は思いつきもしなかったのですが、別スレッドで動かすと上手くいくかもしれません。
また、Nexus5を使うとうまくいったので、ここからはそれでデモアプリの実行をしています。

#### 3. ぬるぽは出なくなったけど撮り終わった後とか画像選んだ後になぜか落ちる
これはモデルを入れていないのが原因です.
[`caffe-android-lib`](https://github.com/sh1r0/caffe-android-lib)の*Usage*を実行すれば動くようになります。

#### 4. DeadObjectExceptionが出て落ちる
これも最初の躓きと同様、いつの間にか直っていたので原因も解決策も分かりませんでした。
ただ、`DeadObjectException`はメッセンジャーのホストまたはクライアントが死んでる(多分GCに持って行かれてる)時に出るようなので、
もしかしたらそれが原因かもしれません。

#### 5. 最後に
これまで僕は、先人の方々が書いた記事にたくさんお世話になってきました。
ですが、今回に限ってはどうやら僕が先人になってしまったようです。
この記事を書いたのは、先人への憧れと、先人になりたいというぼんやりした夢があったからです
なるべく分かりやすく詳細に書いたつもりではありますが、分からなかったらごめんなさい。
少しでも`caffe-android`を使う方のお力になれれば幸いです。
Visual Studio 2015でNodeの最新版を認識させる

# 問題点
Visual Studio 2015ではインストールする際にオプションでGitやNodeをインストールできます。
実はこのNodeは`PATH`に追加されません。

インストール先は以下の場所になっています。

```
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\External\git\git.exe

C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\External\node.cmd
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\External\npm.cmd
```

そしてこの`Web Tools\External`にあるNodeとnpmはバージョンが古いです。

- Node 0.10.31
- npm 1.4.9

そのためNode 4.0以降でなくともこのバージョン以上の指定がされている場合、Visual Studioでインストールしようとした際にエラーとなります。
そこで別にインストールしているであろうNodeの最新版を認識させられるようにしましょう。

# 対処法
`オプション --> プロジェクトおよびソリューション --> 外部Webツール`
初期設定では以下の画像のようになっています。
![vs2015_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/6295/6bb65394-ecf7-7979-ec7f-be5ddfab6951.png)

`Web Tools\External`が`PATH`より優先されているので、`PATH`の順位を上げましょう。
![vs2015_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/6295/4d51a6d2-bd24-2c1f-72c7-ad1ebb6956df.png)


これによって`PATH`にあるNodeのほうが`Web Tools\External`より優先されます。
(初期設定ではNodeやnpmはPATHよりも優先度が高く、Gitは優先度が低いのはなぜなんですかね...)

# 参考資料
- [Upgrading NPM in Visual Studio 2015 – Western Devs](http://www.westerndevs.com/upgrading-npm-in-visual-studio-2015/)
JSQMessagesViewControllerで吹き出しの横に発言時刻を表示する

[JSQMessagesViewController](https://github.com/jessesquires/JSQMessagesViewController)は、iOSでチャットなどの会話画面を作るときに便利なライブラリです。かなり多機能なのですが、それでも機能が足りないときに追加するのは結構大変です。今回は「吹き出しの横に発言時刻を表示する」という機能の実装方法について記録していきます。

![jsqmessagesviewcontroller.png](https://qiita-image-store.s3.amazonaws.com/0/75307/5787a932-e9df-d61a-9aa0-53fb39232dea.png)

# 方法

1. 通常のJSQMessagesViewControllerに含まれる受信用と送信用のxibファイルを、プロジェクトにコピーする。さらにUILabelを追加する
2. 受信用と送信用のクラスを継承して作成して、UILabelと接続しておく
3. [セルのカスタマイズ方法](https://github.com/jessesquires/JSQMessagesViewController#customize-your-cells)と同じタイミングで、追加したクラスを取得。
4. 接続したUILabelに日付を設定する

# サンプル

サンプルコードはこちらです。
https://github.com/nakaken0629/JSQMessagesSample
gulpのインストール

#gulpとは
フロントエンドのタスクを自動化してくれる

#インストール方法

```lang:
$ sudo yum -y install epel-release
$ sudo yum -y install nodejs npm
$ sudo npm install gulp -g
```
##インストールができたかの確認
```lang:
$ node -v
$ npm -v
$ gulp -v
```
HTML でなんか作るとき便利なやつ


## Font Awesome
[Font Awesome](https://fortawesome.github.io/Font-Awesome/)

```html
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
```

## Google Hosted Libraries

[Hosted Libraries](https://developers.google.com/speed/libraries/)

```html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
```

```html
```
Monaca 開発メモ


## CSS必須項目と内容

```CSS
body, html{
    height: 100%;
}

body {
    margin: 0; // 初期マージン殺し
    box-sizing: border-box; // スクロースするな
    height: 100%; // スクロースするな
    font-family: Robot, sans-serif; // フォント
    // -webkit-tap-highlight-color: rgba(0, 0, 0, 0) // 要素タッチした際の色 殺し
    -webkit-touch-callout:none; // ポップアップメニュー殺し
    -webkit-user-select:none; // 要素選択殺し 副作用あり
}
```
[ハイブリッドアプリを作成するときにいつも書くようにしているCSSプロパティいくつか！](http://blog.asial.co.jp/iphone/1147)

+ タッチしたときの色は殺したいがiPhoneのwebkitは擬似要素:activeが使えないので入れておかないとタッチがわからない
ionic を使えるようになりたい


## やりたいこと
AngularJSとあわせてゴリゴリ動くやつ

## 導入
[ionic導入編](http://qiita.com/yu_0105/items/ab07a380207c8ac59493)

## チュートリアル
[The Ionic Book](http://ionicframework.com/docs/guide/)

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Todo</title>
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">

    <link href="lib/ionic/css/ionic.css" rel="stylesheet">

    <script src="lib/ionic/js/ionic.bundle.js"></script>

    <!-- Needed for Cordova/PhoneGap (will be a 404 during development) -->
    <script src="cordova.js"></script>
</head>
<body>
    <ion-side-menus>
        <ion-side-menu-content></ion-side-menu-content>
        <ion-side-menu side="left"></ion-side-menu>
    </ion-side-menus>
</body>
</html>
```
root 状態からunrootのロムを焼く


リカバリーモードに入る

```
adb reboot recovery
```

ブートローダーに入る


```Bash
fastboot flash bootloader bootloader.img # これだけディレクトリが浅い

fastboot flash cache cache.img
fastboot flash system system.img
fastboot flash boot boot.img

fastboot reboot
```

userdata を焼くとデータがぶっ飛ぶ
recovery を焼くとカスタムリカバリーがぶっ飛ぶ
PythonでGUI, PyQtを使って作ってみる


[PyQt4 Download](https://riverbankcomputing.com/software/pyqt/download)

```bash
$mv -r ~/Qt /Applications/Qt

```

[PyQtでPython3のGUIプログラミング (Mac OS X)](http://www.atsuhiro-me.net/python/dev/pyqt-mac)
ここはコンパイル済みの使ってるみたい

[MacでPyQt5をインストールして動かすまで](http://blog.y-ino.com/mac-python-pyqt5-install/)
JavaScript入門を勉強しなおした


## リファレンス
[Mozilla Developer Network | JavaScript](https://developer.mozilla.org/ja/docs/Web/JavaScript)

## データ型の種類
+ 文字列
+ 数値
+ 真偽値 true / false
+ オブジェクト
	+ 配列
	+ 関数
	+ 組込みオブジェクト
+ undifined
+ null

## 真偽値
+ 文字列: 空文字列以外 true
+ 数値: 0 か NaN 以外ならtrue
+ true / false
+ object: null 以外だったらtrue
+ undefined, null -> false

## ユーザに対する情報提供

+ alert
	+ ok
+ confirm
	+ ok -> true
	+ cancel -> false
+ prompt(message, placeholder)
	+ 入力値
	+ null

## setInterval setTimeout

```JavaScript
var i = 0;

setInterval(fuction(){
	console.log(i++);
}, 1000); //ミリ秒

show = function() {
  console.log(i++)
   var timer_id = setTimeout(function() {
    show();
  }, 1000);
  
  if (i > 3){
    clearTimeout(timer_id);
  }
}

show();

```

setInterval 簡単 前の処理の終了を気にしない

setTimeout x秒後に1回

## 文字列オブジェクト 文字列リテラル

```JavaScript
var str = "Hello!"; //文字列リテラル
var str2 = new String("World!"); //文字列オブジェクト

```

文字列リテラルに対してメソッドが使えるのは，実行系が文字列リテラルを部分的に文字列オブジェクトとして解釈し実行してくれるから

## Mathオブジェクト

```JavaScript
Math.ceil(5.3) // 6
Math.floor(5.3) // 5
Math.round(5.3) // 5
Math.random() // random(0~1)
```

## DOM

```JavaScript
console.dir(window);

window.location.href = "http://example.com";

window.document === document // 同じ
```

## elemnet の style 変更

```JavaScript
e.style.color = "red"; // 直接
e.className = "myStyle" // スタイル指定
```

## オブジェクトの追加

```JavaScript
var greet = document.createElement("p");
var text = document.createTextNode("Hello, World!");
document.body.appendChild(greet).appendChild(text);
```
CSS入門を勉強しなおした


## セレクタってこんなに種類あったのか

```CSS
a, b { ; } /* aとb */
a b { ; } /* aの下にあるbすべて */
a > b { ; } /* aの直下のbのみ */
a + b { ; } /* aの次に来るbのみ */

ab { ; } /* aようそかつbセレクタのみ */
a#b { ; } /* idがb */
a.b { ; } /* classがb */

a[b] { ; } /* aタグのうちb要素があるもののみ */

a[b="c"] { ; } /* aタグのうちb属性の値がcのもの */

a[b~="c"] { ; } /* aタグのうちb属性の値にcが含まれるもの */
```

## 擬似クラス

擬似的なクラス（クラスに対して適用）

```CSS
ul li:first-child { ; } /* ulの下の初めのli */

a:link { ; } /* 未訪問のリンク */
a:visited { ; } /* 訪問済みのリンク */
a:hover { ; } /* カーソルが乗ったとき */
a:active { ; } /* クリックしたとき */
/* 優先順位気をつける */

a:focus { ; } /* フォーカスがついたとき */
```

## 擬似要素

あるクラスの値を分解し部分的にスタイルを適用

```CSS
p:first-line { ; } /* 1行目 */
p:first-lettr { ; } /* 初めの1文字 */

p:before {
  content: "a";
}  /* 要素の前に文字列aを追加 */

p:after {
  content: "b";
}  /* 要素の後に文字列bを追加 */

```

## 詳細度

詳細度が高いスタイルが優先される

詳細度は
1. style=""
2. id
3. 属性/擬似クラス
4. 要素/擬似要素
の値で決まる

詳細度が同じ場合は後から宣言されたほうが強い

!importantつけると最優先

```CSS
p { color: skyblue !important; }
```

## プロパティの値
+ px ピクセル
+ em 親要素のx倍
+ % 親要素のx%


## 色の指定
```CSS
p { color: blue; }
p { color: #00f; }
p { color: #0000FF; }
p { color: rgb(0, 0, 255); }
p { color: rgb(0%, 0%, 100%); }
```


## width と height
```CSS
body, html{ height: 100% } /* これあるといい */

div {
  height: 50%; /* heightは親要素の高さが明示的でなくてはならない */
}
```

## padding margin

+ paddingはborderの中
+ marginはborderの外

初期値でbodyにmargingがある．初期化する場合

```CSS
body { margin: 0; }
```

### marginの相殺

上下でmarginが設定された場合

小さい方は無視される


## listのスタイル
```CSS
/*
- list-style-type: disc/circle/squire/decimal/lower-alph
- list-style-image: url('./url.png')
- list-style-position: inside/outside マーカの位置
*/
ul { list-style: disc; } /* 省略可能 */
```

## cursor

```CSS
.help { cursor: help; }
.gragme { cursor: move; }
.clickme { cursor: pointer; }
.smile {cursor: url('url.png'), auto; }
/* 画像がないときはautoにする */
```

## backgroud

```CSS
body {
  backgroud-attachment: scroll; /* ついてこない */
  backgroud-attachment: fixed; /* ついてくる */
  backgroud: url('url.png') no-repeat; /* 省略形 */
}
```

## disply

+ 下に並ぶ要素 ブロックボックス ブロックレベル要素
+ 右に並ぶ要素 インラインボックス インラインレベル要素

```CSS
/*
dislplay
- block
- inline
- list-item
- inline-block
- none
*/
```

インラインにすると，幅と高さの指定が無効になる

inline-blockは両立できる

## position
```CSS
/*
position
- static 初期値 左上合わせ
- relative
- fixed スクロールしてもついてくる windowの左上から
- absolute 親要素がstaticのとき window左上から それ以外のときは親要素左上から
*/

div.item {
  position: relative;
  top: 10px;
  left: 10px;
}
```

## z-index

大きいほうが上

## overflow
```CSS
/*
overflow
- visible
- hidden
- scroll
*/
```

## line-height､vertical-align

## float
要素の配置の流れから指定した要素を外す

imageにfloat: rightをつけると 右に寄り，それ以外の要素はimageが無い様に振る舞う

floatを付けた要素には幅を指定しなければならない（推奨）

float rightした次の要素を左に回りこませない場合

clear rightする
HTML入門を勉強しなおした


[ドットインストール HTML入門](http://dotinstall.com/lessons/basic_html_v3)

## 忘れてた項目，知らなかった項目
### meta linkタグ
### セクション
### アウトライン
### リストの意味
+ ol
+ ul
+ li
+ dl
+ dt
+ dd

### HTML5から使える属性
### 文字列参照
+ 文字列参照
+ 数値参照

### コンテンツモデル

[W3C-HTML5](http://www.w3.org/TR/html5/)
勉強しよう
結局Pythonのディレクトリ構成ってどうしたら良いのか


```bash
myPackage/                 
|
+--README.txt             
|
+--setup.py               
|
+--myPackage/              
   |
   +--__init__.py
   |
   +--いろいろ.py
```

##setup.py書いて実行すると生成される？

[Pythonライブラリをパッケージ化する](http://diveintopython3-ja.rdy.jp/packaging.html)
electronとpythonで幸せGUI構築


##作業メモ

```bash
$python --version
Python 3.4.3
$python -m venv GXtunes
$cd GXtunes
$source ./bin/activate
$pip install --upgrade pip

```

##参考ってか引用元
[Electron as GUI of Python Applications](https://www.fyears.org/2015/06/electron-as-gui-of-python-apps.html)
おソースコードを印刷したい


##整形する

これだと文字サイズ変更できないみたい

```Bash
$pr a.txt
```

[【pr】印刷用にファイルを整形する](http://itpro.nikkeibp.co.jp/article/COLUMN/20131209/523512/)

##PostScriptにする

```Bash
$a2ps a.txt
```

[【a2ps】テキストファイルをPostScript形式に変換する](http://itpro.nikkeibp.co.jp/atcl/column/14/230520/090800013/)


##印刷する

```Bash
$lp a.txt
```

[【lp】プリンタで印刷する](http://itpro.nikkeibp.co.jp/atcl/column/14/230520/090800011/)

##なんだかんだ

```Bash
$a2ps --prologue=color --line-numbers=1 file.hs -o out.ps
$ps2pdf -sPAPERSIZE=a4 out.ps out.pdf
$lp out.pdf
```

今んとこの最高傑作 日本語はダメ

```Bash
$Lang=c a2ps -M a4 --prologue=color --line-numbers=1 -o - input.txt|ps2pdf -sPAPERSIZE=a4 - o.pdf
```

##本命登場？ enscript

```Bash
$enscript --highlight=objc --color --line-numbers --fancy-header --landscape --columns=2 -o outpus.ps Document.m
```
[enscriptでソースコードをカラー印刷](http://news.mynavi.jp/column/osxhack/029/)
結局に日本語はダメ
IDEの外部エディタとしてgvimを指定する方法。 (Windows向け)

# 概要
普段からvim使っているとIDEのテキストエディタ使うのしんどいですよね！

調べなくてもわかるような内容かも知れないですが、備忘録として。

※逐次追記予定

# 環境別設定方法


## Unity
### 設定方法
Edit -> Preferences
![ss_220.png](https://qiita-image-store.s3.amazonaws.com/0/97611/7a87bdfa-b4da-178c-8dde-98a8b5383398.png)
「External Script Editor」 に gvim.exe を指定。
「External Script Editor Args」 に `"$(File)" +$(Line)` を指定。

## Visual Studio Express
### 設定方法
ツール -> 外部ツール

追加ボタンを押して、
「タイトル」は適当に、
「コマンド」には gvim.exe を、
「引数」には `$(ItemPath) +$(CurLine)` を指定。
![ss_221.png](https://qiita-image-store.s3.amazonaws.com/0/97611/413d7e97-6634-6948-0e0b-7ab6472d80be.png)

### (おまけ) ショートカットキーの設定
ツール -> オプション -> 環境 -> キーボード
![ss_222.png](https://qiita-image-store.s3.amazonaws.com/0/97611/18ad2ece-7bc5-17c3-182d-2706f11f3927.png)
コマンドリストの中から、「ツール.外部コマンド*」というアイテムを選択します。
※何番になるかは、上で設定した「外部ツール -> メニューの内容」のリストの何番目かに依存します。
　(今回は「エラー検索(&K)」に続いて「gvim」を2番目に登録したので、コマンド名は「ツール.外部コマンド2」です。)

「使用する場所」は任意で選択。

「ショートカットキー」に好きなキーを指定し、割り当てボタンを押せば登録完了！