OmniAICreator/Qiita-1.07M huggingface dataset:
Windows+PowerShellでPython3.6の環境構築

# 他にもPythonの環境構築の記事いっぱいあるんだけど・・・

はい、私も食傷気味です。
以下の条件にあったインストール方法がみつかならなかったので、備忘録として残しておきます。

* Windows
* Anacondaを使わない
* 仮想環境を使う
* コンソールはPowerShellを使う

# なぜAnacondaを使わないのか？

察してください

# なぜPowerShell？

Python3.6からコンソールエンコーディングがUTF-8になり、ロングパスにも対応するみたいなので、これを機会に旧石器時代のコマンドプロンプトから脱出しようという試みです。

# 仮想環境にはvenv

virtualenvwrapper-powershellがPython2.7にしか対応していないことと、virtualenvwrapper-winがPowerShellに対応していないので、これを機にvenvを使ってみることにします。

# Install

[公式サイト](https://www.python.org/downloads/windows/)からダウンロードしてインストール。

デフォルトのインストールパスが長すぎるため、私は`C:\Python36`に変更しました。

# 実行ポリシーの変更

PowerShellを起動して以下を実行します。この作業は1回のみでOKです。

```PowerShell
Set-ExecutionPolicy Unrestricted -Force -Scope CurrentUser
```

# 仮想環境(venv)

## 仮想環境の作成
```PowerShell
python3 -m venv <仮想環境名>
```

## 仮想環境の切り替え

* Activate  

```PowerShell
~\<仮想環境名>\Scripts\Activate.ps1
```

* Deactivate  

```PowerShell
deactivate
```

Pythonで仮想環境といえばvirtualenvが定番でしたが、venvでも十分いけそうな感じです。

# 参考
> python.jp 〉 環境構築ガイド 〉 Windows環境のPython
> http://www.python.jp/install/windows/index.html

> python.jp 〉 環境構築ガイド 〉 Windows環境のPython
> http://www.python.jp/install/windows/virtualenv.html#h_install_windows_virtualenv_2erst_5
初心者〜初級者のためのEmacs-Helm事始め : 後編

# 対象
Emacs及びHelmの初心者〜初級者を対象にしています. これを書いているのは初級者です.

# あらまし
[初心者〜初級者のためのHelm事始め : 前編](http://qiita.com/jabberwocky0139/items/86df1d3108e147c69e2c)
の続きです. 
# A Package in a league of its own: `Helm`

スルーしたコマンドがいくつかあります. 別のコマンドで代用可能だと感じたものが主です:

* 正規表現はそんなに喋れることないなあ...
* registerはkill-ringで代用可？
* eshellは重いしなあ...あんまり使わないや

## コマンド: `helm-resume`

**キーバインド**:
**\<prefix\> b** (デフォルトでは**C-x c**. この記事の設定では**C-c h**)

**解説**: 
これは直前まで開いていたhelmセッションとミニバッファの履歴をレジュームするコマンドです. これは複雑なコマンドを入力するときに便利です. ちょっとコマンドを間違えちゃったりしてもコマンド全部を入力し直す必要はありません. 

## コマンド: `helm-all-mark-rings`

**キーバインド**:
**\<prefix\> C-c SPC** (デフォルトでは**C-x c**. この記事の設定では**C-c h**)ですが, コレだと長いので以下のバインドがいいでしょう:

```emacs-lisp
(global-set-key (kbd "C-h SPC") 'helm-all-mark-rings)
```

**解説**:
`mark-ring`と`global-mark-ring`をセットしたところにジャンプすることができます. もちろんインターフェイスはhelmで. マークは**C-SPC**でつけられます.

## コマンド: `helm-top`

**キーバインド**:
**\<prefix\> t** (デフォルトでは**C-x c**. この記事の設定では**C-c h**)

**解説**:
UNIXの`top`コマンドをhelmインターフェイスで扱えるようにするものです. 以下のコマンドでプロセスをキルできます:

|Key      | Binding             |
|---------|---------------------|
| **[f1]**| Kill(SIGTERM)       |
| **[f2]**| Kill(SIGKILL)       |
| **[f3]**| Kill(SIGINT)        |
| **[f4]**| Kill(Choose signal) |

さらに以下のような`helm-top`専用のコマンドもあります:

|Key      | Binding             |
|---------|---------------------|
| **C-c C-u**| `helm-top`をリフレッシュ       |
| **M-C**| **コマンド名**でソート       |
| **M-P**| **CPU使用率**でソート        |
| **M-U**| **ユーザー**でソート |
| **M-M**| **メモリ占有率**でソート |

## コマンド: `helm-surfraw`

**キーバインド**:
**\<prefix\> s** (デフォルトでは**C-x c**. この記事の設定では**C-c h**)

**解説**:
`surfraw`はコマンドラインからウェブの検索(GoogleとかGoogleとか...)ができるUNIXのコマンドです. `helm-surfraw`はそれをhelmインターフェイスで扱えます. 

> EmacsからのWeb検索というと`eww`ですが, テキストベースなのでちょっと不便です. この`helm-surfraw`を使うとフルブラウザの検索をEmacsからオペレートできます. ただし, Emacsの標準ブラウザがewwになっているのでChrome(FirefoxとかOperaとか...)に変更しましょう:

```emacs-lisp
 (setq helm-surfraw-default-browser-function 'browse-url-generic
      browse-url-generic-program "google-chrome")
```

## コマンド: `helm-google-suggest`

**キーバインド**:
**\<prefix\> C-c g** (デフォルトでは**C-x c**. この記事の設定では**C-c h**)ですが, コレだと長いので以下のバインドがいいでしょう:

```emacs-lisp
(global-set-key (kbd "C-c h g") 'helm-google-suggest)
```

**解説**:
入力したパターンについてインタラクティブにGoogleのサジェストを候補に出してくれます. また, そのパターンについてGoogle・Wikipedia・Youtube・Google Map...などで検索をかけることができます. 候補が出てくるまでにすこし時間がかかるかもしれません. 

> 検索をかけるブラウザはEmacsで設定されているブラウザになります. `helm-surfraw`の節で設定をしていればChromeで開くことになります. 

## コマンド: `helm-color`

**キーバインド**:
**\<prefix\> c** (デフォルトでは**C-x c**. この記事の設定では**C-c h**)

**解説**:
カラーマップを`helm-color`で検索できます. 色の名前とそのカラーコードをkill-ringに追加したり, バッファに挿入したりできます. 


# あとがき

今回はかなり端折ってしまいました. Helmのメインコマンドは前半に固まっていたので, 後半は随分とライトな感じで...画像も載せていません. 息切れでございます. 

後編のMVPは`helm-surfraw`と`helm-google-suggest`でしょうか. 最近リリースされたEmacs25.1ではWebKitがサポートされ, **Emacs上でフルブラウザが動くという衝撃的な機能が追加されました**が, いかんせん使い勝手はまだまだです. `helm-surfraw`はEmacs内で完結はしないものの, フルブラウザによるWeb検索をEmacs上でオペレートすることができるという点で便利だなーと思いました. 

おそらくこの記事に載せたもの以外にも便利なコマンドがたくさんあることでしょう. 是非さがしてみてください.
kintone 電子回路シミュレータ ToolBoxカスタマイズ

#SimcirJS のToolBox をカスタマイズ
[kintone 電子回路シミュレータ](http://qiita.com/rex0220/items/b7f3eb1d584bee0bc8c6) の続きです。

kintone アプリで、ToolBox をカスタマイズして、部品を追加できるようにしてみた。
とりあえず、簡単に部品登録・流用が可能になったと思われる。

#ToolBox の表示

SimcirJS で、toolbox オプションを指定しないで表示すると、下記の規定ToolBox が表示される。


![2017-01-07_10h21_24.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d8788ff3-053d-78f8-3c1e-85d1769018ca.png)

#ToolBox の定義

「CTL+クリック」で設定内容をJSON形式で表示すると、既定の設定内容を確認できる。

```
{
  "width":800,
  "height":400,
  "showToolbox":true,
  "toolbox":[
    {"type":"In"},
    {"type":"Out"},
    {"type":"Joint"},
    {"type":"DC"},
    {"type":"LED"},
    {"type":"PushOff"},
    {"type":"PushOn"},
    {"type":"Toggle"},
    {"type":"BUF"},
    {"type":"NOT"},
    {"type":"AND"},
    {"type":"NAND"},
    {"type":"OR"},
    {"type":"NOR"},
    {"type":"EOR"},
    {"type":"ENOR"},
    {"type":"OSC"},
    {"type":"7seg"},
    {"type":"16seg"},
    {"type":"4bit7seg"},
    {"type":"RotaryEncoder"},
    {"type":"BusIn"},
    {"type":"BusOut"},
    {"type":"RS-FF"},
    {"type":"JK-FF"},
    {"type":"T-FF"},
    {"type":"D-FF"},
    {"type":"8bitCounter"},
    {"type":"HalfAdder"},
    {"type":"FullAdder"},
    {"type":"4bitAdder"},
    {"type":"2to4BinaryDecoder"},
    {"type":"3to8BinaryDecoder"},
    {"type":"4to16BinaryDecoder"}
  ],
  "devices":[
  ],
  "connectors":[
  ]
}
```


#ToolBox の設定

simcir.js にある registerDevice　で、部品を登録

```
  var registerDevice = function(type, factory, deprecated) {
    if (typeof factory == 'object') {
      factory = createDeviceRefFactory(factory);
    }
    factories[type] = factory;
    if (!deprecated) {
      defaultToolbox.push({type: type});
    }
  };
```

ToolBox に追加は、simcir 表示時のパラメータで指定。

```
        data['toolbox'] = getInitToolBox();
...
        data['toolbox'].push( { "type":pasrtsname });         
...
        $('.simcir').each(function() {
          var $placeHolder = $(this);
          simcir.setupSimcir($placeHolder, data );
        });

```


##規定部品の設定処理

部品の設定は、部品タイプによって、３ヶ所に分かれている。

###simcir.js では、端子部品を設定

- In
- Out
- Joint

###simcir-basicset.js では、基本部品を設定
部品の動作と描画を行っている。
部品の組合せで実現できないものは、ここにロジックと描画処理を登録する。

- DC
- LED
- PushOff
- PushOn
- Toggle
- BUF
- NOT
- AND
- NAND
- OR
- NOR
- EOR
- ENOR
- OSC
- 7seg
- 16seg
- 4bit7seg
- RotaryEncoder
- BusIn
- BusOut

###simcir-library.js では、部品を組合せた部品を設定
基本部品および既に登録された部品を組合せることができる

- RS-FF
- JK-FF
- T-FF
- D-FF
- 8bitCounter
- HalfAdder
- FullAdder
- 4bitAdder
- 2to4BinaryDecoder
- 3to8BinaryDecoder
- 4to16BinaryDecoder

 
#ToolBox カスタマイズのしくみ

simcir-library.js　で、設定されている部品を、置き換え・追加してカスタマイズする。

- 部品グループアプリに、必要な部品を登録する。

![electoric1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/366f1a20-89c2-3007-714c-8777918601c0.png)


- 電子回路アプリで、部品グループを指定するとその部品データを読み込み、ToolBox に登録する。
- ToolBox に追加された部品が表示され、使用可能になる。

![2017-01-07_22h06_36.png](https://qiita-image-store.s3.amazonaws.com/0/100572/3035ad5a-f308-b236-3e9e-d9d6c2cb4569.png)

※部品が複雑になれば、それだけjson データ量が増えるが、どの程度まで実用範囲になるかは、未検証。
CloudFrontでHTTP2を設定する

## CloudFrontにHTTP2をサポート

[AmazonのCloudFrontでHTTP2のサポート](https://aws.amazon.com/jp/about-aws/whats-new/2016/09/amazon-cloudfront-now-supports-http2/?sc_channel=em&sc_campaign=Launch_RN20160913&sc_publisher=aws&sc_medium=em_21202&sc_content=launch_la_nontier1&sc_country=JP&sc_geo=JAPN&sc_category=mult&sc_outcome=launch&mkt_tok=eyJpIjoiTldNd1pHRTRaV05sWlRJMyIsInQiOiJqMGdmeGJRXC9OSUVjOWxzNkduVURpRUhZV0lUbWZ4WjR5QlwvTG1SSHRBdzI3Z3V1eU1tR3dGZnFGd1RKZlFHYzVcL0s0c1hKQTBFbTM1ZXZwMEFlTWZoa1Rjdm5NVnJLc0NSb2pOMEt2YTF4WT0ifQ%3D%3D)されたので、早速設定してみた。とても単純だった。

## 方法

### CloudFrontのディストリビューションにアクセス

<img width="871" alt="スクリーンショット 0028-09-15 9.03.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/64427/51889e15-42cc-ff03-76c4-71014683c5d3.png">

### HTTP/2, HTTP/1.1, HTTP/1.0を選択後保存

### ディストリビューションのStatusがIn ProgressからDeployedになるのを待つ
<img width="1249" alt="スクリーンショット 0028-09-15 9.10.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/64427/1ba69b64-6a19-98de-d411-c2357c58bd01.png">

だいたい５分〜１０分ぐらいかかる。

##チェックの方法

Firefoxの[アドオン](https://addons.mozilla.org/ja/firefox/addon/spdy-indicator/)かChromeの[アドオン](https://chrome.google.com/webstore/detail/spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin)を使えばチェックができる。

ちなみに下記はFirefoxの場合。下記のように緑色の雷マークが出たらHTTP2対応されていることになる。

<img width="769" alt="スクリーンショット 0029-01-07 20.21.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/64427/a081d343-e38c-f348-d461-f05fc5ad7023.png">

こちらはChromeでの場合
<img width="847" alt="スクリーンショット 0029-01-07 20.22.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/64427/efe94d9b-53ce-8b23-916b-bc5b91da2010.png">

AWSは本当になんでも簡単にできるなぁ。
MacのVimでクリップボード連携を有効にする(El Capitan対応)


## 問題点
- Mac標準で利用できる`/usr/bin/vim`(`vi`実行時も、本コマンドが実行される)では、他アプリとクリップボードを連携できない
- OS X 10.11 El Capitanから新しくセキュリティ機能が追加され、sudoをつけても`/usr/bin`配下の既存の`vi`、`vim`コマンドを上書きできない

## 対処手順
1. 標準vimがクリップボード連携できないことを確認

	```shell-session
	% /usr/bin/vim --version | grep clipboard
	-clipboard       +iconv           +path_extra      -toolbar
	+eval            -mouse_dec       +startuptime     -xterm_clipboard
	```

1. Homebrewを使ってVimを入れる

	```bash
	brew update
	brew install vim
	```

1. インストールしたvimがクリップボード連携できるか確認する

	```shell-session
	$ /usr/local/Cellar/vim/8.0.0134/bin/vim --version | grep clipboard
	+clipboard       +job             +path_extra      +user_commands
	+eval            +mouse_dec       +statusline      -xterm_clipboard
	```

1. 既存のvimを置き換えるための操作

	2. Macを再起動し、`Command+R`を押してリカバリーモードで起動 
	2. メニューから`ユーティリティ`->`ターミナル`を選択し、ターミナルを起動
	2. 現在のSystem Integrity Protectionの状態を確認

		```shell-session
		# csrutil status
		System Integrity Protection status: enabled.
		```

	2. System Integrity Protectionを無効化

		```shell-session
		# csrutil disable
		Successufully disabled System Integrity Protection. Please restart the machine for the changes to take effect.  
		# reboot
		```

	2. System Integrity Protectionの状態を確認(reboot後)

		```shell-session
		% csrutil status
		System Integrity Protection status: disabled.
		```


1. 既存のvimを置き換え

	```bash
	sudo mv /usr/bin/vim /usr/bin/old_vim                                                                                                                                           
	sudo ln /usr/local/Cellar/vim/8.0.0134/bin/vim /usr/bin/
	```


1. `~/.vimrc`に以下の設定を追加

	```vim
	set clipboard+=unnamed
	```
Docekr for AWS/Azure のベース、Moby Linuxを素の状態で起動してSSHログインする。


Docker for AWS(以下D4a)はDocker社が用意したAMIを含む、Swarmクラスタを作るためのCloudFormationテンプレートです。

ここで使われるAMIはAlpineがベースのMoby Linuxというやつで、D4aのテンプレートを無改造で使用すると、インスタンスへのSSHログインは専用のDockerコンテナに入ります。
この方式では、ホスト(manager/worker)に適用しておきたいカスタマイズがあるケースでは、テンプレートに直接試すのが少々面倒でした。

ちょっと試したい追加設定があるたびに、CloudFormationのテンプレートを改造していてはラチがあかないので、あたりをつけるまでは直接触って影響などみたいなーという時に、AMIを単品で起動してしまうこともできます。

ちなみに、beta10までは申請済みのAWSアカウントにSharedの状態でアクセス権が与えられていましたが、beta11以降は気付いたら`Community AMIs`に公開しているようなので、一応誰でも起動してよくなったみたいです。


![EC2_Management_Console.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/6108eb38-7c22-ac50-cde1-7afc7c118aab.jpeg "EC2_Management_Console.jpg")

(なんかbeta15、2つある。。)

> 名前をよく間違えるとかで、割と適当にアップしている模様です。`ec2 describe-images`でオーナーIDと作成日時を一応チェックしてから使いましょう。

## 単品起動にUserScriptを適用する


※ Boot2Dockerも一応Mobyでしたが、EC2で直接触って試したいこともあったりします。

D4aでログイン用のDockerイメージのHistoryを参考に、次のような感じでUserScriptを突っ込んで起動します。

```
#!/bin/sh
docker kill shell-aws
apk add --update bash openssh ca-certificates sudo curl jq
echo -e "Port 22\nClientAliveInterval 180\nPasswordAuthentication no\n" >> /etc/ssh/sshd_config

rc-update add sshd
/etc/init.d/sshd start
echo -e "\ndocker ALL=(ALL) NOPASSWD: ALL\n" >> /etc/sudoers 
```

> 追記2017.9： いつのまにやらshell-awsコンテナが起動するようになっているので、 `docker kill shell-aws` で止めます。
 
あとはストレージを適当に増やしておきましょう。

## SSHでMobyにログイン

ログインユーザは`docker`です。

```
$ ssh docker@52.91.xxx.xxx

...

Welcome to Moby, based on Alpine Linux.
ip-10-0-11-114:~$ id
uid=1001(docker) gid=50(docker) groups=50(docker),50(docker)
```

SSHログインできました。

## D4aのMobyカスタマイズ例

例えば、DockerコンテナからEC2のメタデータを取れないようにしたいとか、そういう設定を試してみるのにつかえます。

通常は次のように、EC2のインスタンス上でDockerコンテナを稼働させると、いつものメタデータAPIを参照することができます。

```
$ docker run -it --rm alpine wget http://169.254.169.254/latest/meta-data/ -O - | head
Connecting to 169.254.169.254 (169.254.169.254:80)
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
local-hostname
```

えーと、これが見れるようでは困るケースもあるわけです。CI用に貸し出してるとかで。

いくつか情報を拾ったりつつ(どこだったか忘れた。。)、とりあえずPREROUTINGでごまかすことが可能ぽかったので試してみます。到達しないようにしちゃうと。

```
$ sudo iptables -t nat -I PREROUTING -i docker0 -p tcp -d 169.254.169.254 --dport 80 -j DNAT --to-destination 1.1.1.1
$ sudo iptables -t nat -I PREROUTING -i docker_gwbridge -p tcp -d 169.254.169.254 --dport 80 -j DNAT --to-destination 1.1.1.1
```

無事、DockerコンテナからEC2メタデータを隠蔽することができたようです。

```
$ docker run -it --rm alpine wget http://169.254.169.254/latest/meta-data/ -T 10 -O -
Connecting to 169.254.169.254 (169.254.169.254:80)
wget: download timed out
```

あとは、今回成功した`iptables`のコマンドをテンプレートのUserScriptに仕込めばよいはず、と。

----

以下おまけ。


何かの拍子で再起動した時にも適用されるよう、一応`local.d`にも仕込んでおく場合、こんな感じですかね。

```
$ sudo rc-update add local default

$ cat <<"EOL" | sudo tee -a /etc/local.d/block_metadata.start
iptables -t nat -I PREROUTING -i docker0 -p tcp -d 169.254.169.254 --dport 80 -j DNAT --to-destination 1.1.1.1
iptables -t nat -I PREROUTING -i docker_gwbridge -p tcp -d 169.254.169.254 --dport 80 -j DNAT --to-destination 1.1.1.1
EOL

$ sudo chmod +x /etc/local.d/block_metadata.start
```

ただ、今回試したbeta15用のAMIは(AutoScaleGroupで捨てるのが前提だから？)、そもそもrebootしたらSTOPのまま上がってこないので、自動適用の成否はわからんです。
.jarなどの実態が圧縮ファイル(zip)なファイルをWindows7で.zipと同様に扱わせる方法

# はじめに
Windows7の (file) explorerでは、zipファイルを明示的に展開することなく、通常のフォルダと同じように、その中身を確認することができますよね。
(もちろん内部的には展開してるんですが)

　一方jarファイルは、実質的にはzipファイルですけど、こちらはzipファイルのように中身を確認することはできません。
7zip等が入ってればコンテキストメニューからできますが、zipファイルのように、(file) explorer内で完結することはできません。
(あとは、WinMergeなどで差分を取ったりも、普通にやったらできないと思います。)

そういうことをやりたい人向けの記事です。

# *注意*
その代わりに、jarファイルをダブルクリックで実行、ということはできなくなります。

# やり方

※管理者権限が必要です

1. 管理者権限でコマンドプロンプトを起動  
スタートメニュー上などのコマンドプロンプトのアイコン右クリック→管理者として起動
2. 以下のコマンドを実行 
 
```bat
assoc .jar=CompressedFolder
```

(この辺りをいじれば、「拡張子なしファイルをテキストエディタと関連づける」とかもできます。)

# 感想
調べてる時はなかなか方法にたどり着けなかったのに、わかってから調べると普通に検索でヒットするので知ってることと知らないことの差は大きいなぁと思いました。

# ちなみに……
Windows10ではデフォルトでこうなってますね！！！
PostgreSQLのバージョン毎の接続時のパラメータ

C言語でPostgreSQLに接続するAPIのパラメータについて調べました。PHPのpdo_pgsqlやRubyのruby-pgなど、libpqをラップしている他の言語のライブラリでもおそらく同様のパラメータが使えると思います。

ドキュメントから拾ってきたので正しいかどうかはわかりません。

ポイント

- `client_encoding`は9.1から
- `application_name`は9.0から

尚これらは古いバージョンでは、`client_encoding=utf8 application_name=app_name`の代わりに
`options='-c client_encoding=utf8 -c application_name=app_name'`と書くことができます。

```
7.2
[
    "host",
    "hostaddr",
    "port",
    "dbname",
    "user",
    "password",
    "options",
    "tty",
    "requiressl"
]
7.3
[
    "connect_timeout"
]
8.2
[
    "sslmode",
    "krbsrvname",
    "service"
]
8.3
[
    "gsslib"
]
8.4
[
    "sslcert",
    "sslkey",
    "sslrootcert",
    "sslcrl"
]
9.0
[
    "application_name",
    "fallback_application_name",
    "keepalives",
    "keepalives_idle",
    "keepalives_interval",
    "keepalives_count"
]
9.1
[
    "client_encoding",
    "requirepeer"
]
9.2
[
    "sslcompression"
]
9.3
[]
9.4
[]
9.5
[]
9.6
[]
```


ソース

```php
<?php
require __DIR__.'/vendor/autoload.php';

use Goutte\Client;

$versions = [
    "7.2",
    "7.3",
    "8.2",
    "8.3",
    "8.4",
    "9.0",
    "9.1",
    "9.2",
    "9.3",
    "9.4",
    "9.5",
    "9.6",
];

$client = new Client();

$previous = [];
foreach ($versions as $version) {
    $crawler = $client->request('GET', "https://www.postgresql.org/docs/$version/static/libpq-connect.html");

    $params = $crawler->filterXpath("//dl/dt/tt[text()=\"host\"]/../../dt/tt")
        ->extract(["_text"]);
    
    echo PHP_EOL, $version, PHP_EOL;
    echo json_encode(
        array_values(array_diff($params, $previous))
        , JSON_PRETTY_PRINT
    );
    $previous = $params;
}
```
Seeduino V3.0 (Atmega 328P) 


Arduino Duemilanove互換

* [Seeeduino_v3.0](http://wiki.seeedstudio.com/wiki/Seeeduino_v3.0)
* [Switch Science : Seeduino V3.0](https://www.switch-science.com/catalog/980/)

## 設定補足

* 「M_RST_AUTO」 : 通常は「AUTO」で利用．（「M」側ではSketch upload時にオートリセットがかからない)
* 「3V3_VCC_5V」スイッチは、「3V3」側でマイコンチップ等が3.3V電源に接続され、「5V」側で5V電源に接続されます。搭載されたマイ コンチップのATmega328Pを16MHzで動作させるには、4.5V以上の電源を求められていますので、3.3Vでの動作は保証されません。通常は 「5V」側でご使用ください。 
*  電源系ピンソケットの「RST」脇にADC6,ADC7が拡張されていますが、Arduino Uno R3などのArduino 1.0 Pinoutとは接続先が違っていますので、ご注意ください。(JapaninoのA6,A7と同じです)
PythonコードからC++コードを作りたい！

GoogleによってPythonコードをGoに変換するGrumpyが公開されました。

[Google Open Source Blog: Grumpy: Go running Python!][1]
[google/grumpy: Grumpy is a Python to Go source code transcompiler and runtime.][2]

Pythonには標準でastモジュールがあり、構文解析結果に直接触ることが可能です。

```py3
import ast
node = ast.parse('''
def main() -> int:
    print("Hello World!")
    return 0
''')

print(ast.dump(node))
# Module(body=[FunctionDef(name='main', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='Hello World!')], keywords=[])), Return(value=Num(n=0))], decorator_list=[], returns=Name(id='int', ctx=Load()))])
```

Grumpyでも構文木をNodeVisitorで訪問しながらコードを生成しているようです。
ざっくりと読むと、Visitorで訪問した結果を文字列で返しているようです。

## py2cpp

<https://github.com/mugwort-rc/py2cpp>

C++でも同じようなことがしたいと思って少し前にpy2cppというツールを作りかけていたことを思い出しました。

個人的には移植コードを書く際、移植先言語のお約束の構文に読み替えることが多いのですが、その処理をどう表現するか悩み、NodeVisitorで訪問時にTransformer（先処理）とHook（後処理）の2段階で変換し、wrapped Nodeを出力することで後からいろいろこねくり回せるようにしてみました。
（`tuple`を`std::make_tuple`で出力したり、`**`演算子を`std::pow`に置き換えたり…。）

### Hello World

```
$ cat samples/helloworld.py
def main() -> int:
    print("Hello World!")
    return 0

$ python -m py2cpp samples/helloworld.py
#include "py2cpp/py2cpp.hpp"

int main() {
    std::cout << "Hello World!" << std::endl;
    return 0;
}
```

### range-based for

```
$ cat samples/range.py
def main() -> int:
    x = 0
    for i in range(100):
        x += i
    print(x)
    return 0

$ python -m py2cpp samples/range.py
#include "py2cpp/py2cpp.hpp"

int main() {
    x = 0;
    for (auto i : py2cpp::range(100)) {
        x += i;
    }
    std::cout << x << std::endl;
    return 0;
}
```

一番最初の`x = 0`の型が抜けているのが問題ですが、それ以外は違和感のないC++コードが吐けていると思います。
型の情報については後から情報を与えるか、この部分に関してはautoでも十分だと思うので、改良したいと思います。

`py2cpp::range`はVariadic Templatesを使用して`boost::irange`を呼び出すaliasです。

### 型ヒント

```
$ cat samples/add.py
def add(x: float, y: float) -> float:
    return x + y

def main() -> int:
    print("2.0 + 3.0 =", add(2.0, 3.0))
    return 0

$ python -m py2cpp samples/add.py
#include "py2cpp/py2cpp.hpp"

double add(double x, double y) {
    return x + y;
}

int main() {
    std::cout << "2.0 + 3.0 =" << add(2.0, 3.0) << std::endl;
    return 0;
}
```

Python 3.5からPEP483の型ヒントが取り入れられました。

これにより、関数の引数と返り値に型情報を付与することが出来ます。

かなりよさげな挙動をしているのではないでしょうか？

単純なロジックのプログラムであれば、Pythonで書いてC++に変換し、boost.pythonや[pybind11][4]を用いてPythonで呼び出す未来も近いかもしれません。

## ライセンス

py2cpp自体はGPLv3で公開しています。

py2cppを用いて出力された生成物はGCCの生成物と同様に**GPL感染することはありません**。

include下のpy2cpp.hppはBoost Software Licenseで公開しています。

## プルリク募集中

型の決定やビルトイン関数の実装など、やることいっぱいだなーと思いながら放置していたのを思い出したところなので、私と同様にPythonコードをC++にしたい人はばしばし編集してプルリクを送っていただけると助かります。
プルリクは日本語だと助かります。Gitのコメントを見ていただければ分かるように英語は不自由です…。

## 参考

[本の虫：GoogleがGoによるPython実装、Grumpyを発表][3]

[1]: https://opensource.googleblog.com/2017/01/grumpy-go-running-python.html
[2]: https://github.com/google/grumpy
[3]: https://cpplover.blogspot.jp/2017/01/googlegopythongrumpy.html
[4]: https://github.com/pybind/pybind11
ESP8266 / 電子工作 > 消費電流を測定しようとした (失敗) > IV変換用抵抗 / 電流センサについて

http://qiita.com/7of9/items/171a85605c08bd3b4a72
の記事で気になったESP8266の消費電流。

「電流から電圧に変換して、Anaglog Discovery2で電圧測定すればいい」と安易に思った。
そして失敗した。

## IV変換

### 抵抗の選定失敗

- 電源部分のGNDラインに10Ω抵抗を入れた
  - 10Ωの選定理由: 200mAの時2V程度になり、測定しやすそう
  - 結果: 電源電圧は3Vから1.59VになりESP8266はまともに起動しなくなった

LEDなどの制限抵抗を思い出した。
$V_F = IR$の分だけ、電圧降下が生じる。
つまりRの大きさに応じて電圧降下が生じてしまい、ESP8266起動に必要な電源電圧が確保できなくなっていた。

### リンク

http://bril-tech.blogspot.jp/2013/08/blog-post_9.html
に良さそうな情報がありました。

免責事項に留意して、参考にさせていただきます。

5年ほど前に大先輩とともに電流測定した時を思い出した。

- セメント抵抗(5Wのもの)を使った
- セメント抵抗が高温になるため、灰皿のようなものの上にセメント抵抗を置いて測定した

<font color=red>**このあたり扱いには注意が必要。**</font>

(追記 2017/01/09)
セメント抵抗の温度について表が掲載されている。
http://www.op316.com/tubes/tips/b460.htm
> （２）部品単体での熱管理の検討

## 電流センサー

### 使われているセンサー

別途、以下のページなどを見ていて、電流センサーが気になった。
http://qiita.com/applepine1125/items/29a894b8dd7af088df6a
http://qiita.com/osamasao/items/a38707465e8f8a9948ed

製品はこちら。
http://akizukidenshi.com/catalog/g/gP-08960/

「これを用いてESP8266の消費電力を測定してはどうか」と考えたが、

http://akizukidenshi.com/catalog/g/gP-08960/
> 分割型のＡＣ電流センサー（分割型カレントトランス）です。

DC電流の測定ではなかった。

### リンク

以下に電流センサーの種類が紹介されている。

https://www.hioki.co.jp/jp/products/listUse/?category=39

> CT方式電流センサの測定原理
>  交流のみ測定可能です（直流は測定できません）
...
> ホール素子方式電流センサの測定原理
> 直流から交流(数kHz)まで測定可能です
...

など。

ホール素子の場合はDC電流も測定できそう、程度までは理解した。

ESP8266の電流測定をするには、もう少し情報の整理が必要だろう。
Digisparkを動かす



# Digispark

DigisparkはUSBに直接挿せるマイコン(ATTiny85). ソフトでUSB制御.
keyboardやmouseのエミュレートなど得意
* [digiStump : Digispark Development board](http://digistump.com/products/1)
* [Digispark - The tiny, Arduino enabled, usb dev board!](https://www.kickstarter.com/projects/digistump/digispark-the-tiny-arduino-enabled-usb-dev-board/description)
* (参考) [安価なUSB直挿しマイコンDigisparkのススメ](http://qiita.com/erukiti/items/74a848489ec102841b66)

# 購入

* [HiLetgo Digispark Kickstarter ATTINY85 Digispark 超小型Arduino互換](https://www.amazon.co.jp/gp/product/B00VM5M4W4/ref=od_aui_detailpages00?ie=UTF8&psc=1) (183円)
>一応、ちゃんと使えてますが、クローンだとP5がリセットピンになっているようなので、そこだけ要注意です。
DigisparkのQ&Aフォーラムでは、クローンではP5がI/Oに使えずリセットになっているのが有ると書かれてました。

* rev.3 というのはclone?!

# 設定

http://homemadegarbage.0t0.jp/digispark-1
http://digistump.com/wiki/digispark/tutorials/connecting

* host側にドライバ(というかlibusb)をinstall 
https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/DigistumpDrivers.zip
* ArduinoIDEにboard設定を追加する (http://digistump.com/package_digistump_index.json)
  * Digistump AVR Boards
  * Digispark (Default – 16.5mhz)

# Digisparkへの書き込み

>Digisparkにはリセットボタンがないため、書込みボタンをクリック後”Plug in device now…”と表記されてからDigisparkをUSBポートに差し込む。問題がなければ書き込みが開始する。
いちいち抜き差し面倒なのでダイソーのスイッチ付きUSBコネクタや延長コードがあると便利です。

* HUB経由だと書き込みうまく動作せず．PC直結でうまく書き込めた．
* ArduinoIDEなしで単体でつないでも認識繰り返すだけで正解
* シリアルportは割り当てされないため未設定でよい．

# 詳細

[Differences (from the Arduino) and limitations](https://digistump.com/wiki/digispark/tutorials/basics)
http://digistump.com/wiki/digispark/quickref

Pin outs:

All pins can be used as Digital I/O
Pin 0 → I2C SDA, PWM (LED on Model B)
Pin 1 → PWM (LED on Model A)     ★ 手元のDigisparkはModel A
Pin 2 → I2C SCK, Analog In
Pin 3 → Analog In (also used for USB+ when USB is in use)
Pin 4 → PWM, Analog (also used for USB- when USB is in use)
Pin 5 → Analog In

Many existing libraries will not work with the Digispark: For I2C devices check out the TinyWireM library, which makes it super simple to port an I2C based device library over to use with the Digispark.

# sample

```
#include "DigiKeyboard.h"

void setup() {
  // don't need to set anything up to use DigiKeyboard
  pinMode(1  , OUTPUT);
}


void loop() {
  // this is generally not necessary but with some older systems it seems to
  // prevent missing the first character after a delay:
  DigiKeyboard.sendKeyStroke(0);

  // Type out this string letter by letter on the computer (assumes US-style
  // keyboard)
  digitalWrite(1, HIGH);  
  DigiKeyboard.println("ryu!");

  DigiKeyboard.delay(500);
  digitalWrite(1, LOW);  
  
  // It's better to use DigiKeyboard.delay() over the regular Arduino delay()
  // if doing keyboard stuff because it keeps talking to the computer to make
  // sure the computer knows the keyboard is alive and connected
  DigiKeyboard.delay(5000);
}
```
[Rails]404/500などのエラーページって結局どうすればいいの？

![404error.png](https://qiita-image-store.s3.amazonaws.com/0/157554/649aad29-da53-5b82-2a6a-410a8c46f8e0.png)

Railsでアプリケーションを開発している時にふと、「そういえば404エラーのページってどうやって作るんだろう」と思い調べてみました。



**この記事は、2020/03に[自身のブログ内](https://cpx.business/articles/how-to-create-an-error-page/)に移行しました。**
zshのextended history fileをマージする

Dropboxでzshの履歴を管理していると、confilicted copyができることがある。

しかし、zshのextended_historyオプションを有効にしてあれば、historyファイルは以下のように実行時の時刻が記録される。(参照:[zshのマニュアル](http://zsh.sourceforge.net/Doc/Release/Options.html#index-EXTENDEDHISTORY))


```zsh
: 1483789382:0;cd ~/Dropbox
#:(実行時のunix time):(実行時間);(コマンド)
```


そこで、時刻順にextended historyファイルをマージするスクリプトを書いたのでおいておく。

```python
#!/usr/bin/env python3

# License: MIT

import argparse
import re
import sys

parser = argparse.ArgumentParser(description='merge')
parser.add_argument('files', metavar='file', nargs='+', help='zsh extended history files')
args = parser.parse_args()

p = re.compile(b':([ 0-9]*):([0-9]+);(.*)', re.S)
def get_lines(fp):
        histories = set()
        i = iter(fp.readlines())
        for line in i:
                date, time, command = p.match(line).groups()
                date = int(date)

                while len(command)>1 and command[-2] == b'\\'[0]:
                        command += next(i)
                histories.add((date, time, command))
        return histories

histories = set()
for f in args.files:
        with open(f, 'rb') as fp:
                histories.update(get_lines(fp))

for date,time,command in sorted(histories, key=lambda r: r[0]):
        print(":{:11}:".format(date), end="")
        sys.stdout.flush()
        sys.stdout.buffer.write(time)
        sys.stdout.buffer.write(';')
        sys.stdout.buffer.write(command)

```

使い方はこんな感じ

```bash
./merge .zsh_history *.zsh_history >merged_history
mv merged_history > .zsh_history
```

追記:
[偉大なる先駆者](http://blog.umasaka.com/archives/1710)の存在を忘却していました。
wordpressのAll In One SEO PackのSEOカスタムフィールドにxmlrpcで投稿するとき、嵌った

wordpress側でコードの追記が必要だった。

# wordpress側の修正
```
./wp-includes/functions.php
```
のファイル末尾に、以下の記述を追加

```php
// All in One SEO PackのXMLRPCによる投稿を許可する
function allow_aioseo($meta_key, $meta_type = null) {
  if ( substr( $meta_key,0,9 ) == '_aioseop_' ) $protected = FALSE;
  else $protected = ( '_' == $meta_key[0] );

  return $protected;
}
add_filter('is_protected_meta', 'allow_aioseo');
```
カラム名の先頭がアンダースコアだとこういったカスタマイズが必要らしい。。

嵌った。
自分でHTTPSサーバを立てて、通信内容を復号化するまでに参考にしたリンクメモ

# 前提
- サーバはAmazonLinux
- クライアントはWin10/WireShark
- ドメインは持ってる

# SSL証明書取得
Let’s EncryptとZeroSSLで、もっと簡単にSSL証明書を用意する ｜ Developers.IO http://dev.classmethod.jp/cloud/zerossl-june-2016/

# サーバ立てる
Amazon LinuxのApache 2.4にSSL証明書を設定してみた ｜ Developers.IO http://dev.classmethod.jp/cloud/aws/amazonlinux-apache24-ssl/

# パケットキャプチャして復号化する
HTTPSのパケットをwiresharkで見てみる - Qiita http://qiita.com/toshihirock/items/acbf9800f7e784118e46



以上。先人たちの足跡に感謝。
シーザー暗号


#概要
シーザー暗号は古代ローマの軍事的指導者ガイウス・ユリウス・カエサル（英語読みシーザー）が使用したことから呼ばれる
最も知られた暗号方式の一つです。

参考
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7)

常設CTFなどでは初歩の初歩として出されることがあります。

#暗号化の方法
暗号化の方法はいたって単純で平文を決められた文字数（これが秘密鍵にあたる）だけ辞書順にシフトします。
例えば3文字ずらすのであれば

平文   暗号文
A  =>  D
といった形になります。

暗号文   平文
D      =>  A

復号の時は逆のことをやるので3文字前にずらします。
ROT13と言われる暗号方式は13字ずらしたものになります。

参考
[ROT13 - Wikipedia](https://ja.wikipedia.org/wiki/ROT13)

#解読方法

この暗号の解読の仕方ですが26種類しかパターンがないので総当たりで簡単に平文は求まります。
ではこの時平文になったことをどのように機械的に判断すればいいでしょうか

今回は英文に焦点を当てますが考え方はほかでも利用できます。
英語は辞書を見ればわかる通りできやすい文字があります（eが最も使用されるなど）

ここから各文字の出現頻度の割合をあらかじめ求めておき
復号した平文に出てくる文字の出現頻度との差分を求め最も差分が少ないものが
正しく復号されたものとみなすといった形になります。

理論だけでは想像しづらいと思うので実際のコードをお見せします。

```python
# -*- coding: utf-8 -*-

#i文字ずらしたときのシーザー暗号を解読する

#各アルファベットの出現頻度
general_frequency = [0.08167, 0.01492, 0.02782, 0.04253, 0.12702, 0.02228, 0.02015, 0.06094, 0.06966, 0.00153, 0.00772, 0.04025, 0.02406, 0.06749, 0.07507, 0.01929, 0.00095, 0.05987, 0.06327, 0.09056, 0.02758, 0.00978, 0.02360, 0.00150, 0.01974, 0.00074]

# ある文章のアルファベットの出現頻度とgeneral_frequencyを乗算して出現頻度が一致したときの値
pmatch = 0.065

#ある文章のアルファベットの出現頻度をリストで返す
def freqanalysis(text):
    l = [0] * 26
    for i in xrange(len(text)):
        if 'A' <= text[i] and text[i] <= 'Z':
            c = ord(text[i]) - ord('A')
            l[c] = l[c] + 1
        elif 'a' <= text[i] and text[i] <= 'z':
            c = ord(text[i]) - ord('a')
            l[c] = l[c] + 1
        else:
            continue
    s = float(sum(l))
    l = [float(n)/s for n in l]
    return l

#アルファベットをi文字シフトしたときの文字を返す。アルファベット以外はそのまま
def shift(c, i):
    if 'A' <= c and c <= 'Z':
        return chr((ord(c) - ord('A') + i) % 26 + ord('A'))
    if 'a' <= c and c <= 'z':
        return chr((ord(c) - ord('a') + i) % 26 + ord('a'))
    return c

#出現頻度との一致具合を計算する
def freq(text, i):
    plain = [shift(n, i)  for n in text]
    fr = freqanalysis(plain)
    ret = 0
    for j in xrange(26):
        ret += general_frequency[j] * fr[j]
    return ret

#0~25文字ずらしたとき最も出現頻度が近いものを返す。
def findkeyletter(text):
    freqs = [abs(pmatch - freq(text, n)) for n in xrange(26)]
    return freqs.index(min(freqs))

with open('ciphertext') as fh:
    ciphertext = fh.read()

key = findkeyletter(ciphertext)
plain = [shift(n, key)  for n in ciphertext]
print "".join(plain)
```

ciphertextの中に復号したい文章を入れておき実行します。
findkeyletterで1～25文字ずらしたときの出現頻度の差分の中で最も差分の少ないずらす文字数を返し
文章をその文字数だけずらしたものを返します

この方法の難点は復号したい文章があまりに短い場合は正確に復号できないことです

この暗号方式は26種類の総当たりで破れますが
これを発展させたものにヴィジュネル暗号というものがあります。
jsdoでFM変調、復調。　その２

#概要
jsdoでFM変調、復調やってみた。
復調アルゴリズムは、オリジナルです。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/e/b/Z/ebZD.jpg?t=1483757701)

#成果物
http://jsdo.it/ohisama1/ebZD

#成果物2
音が出ます。
http://jsdo.it/ohisama1/AVYM
jsdoでFM変調、復調。

#概要
jsdoでFM変調、復調してみた。
復調アルゴリズムは、googleのラジオ。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/W/B/0/WB01.jpg?t=1483495943)

#成果物
http://jsdo.it/ohisama1/WB01

#成果物2
音声で聞けます。
http://jsdo.it/ohisama1/Oql4
SSL証明書の期限が切れたのでLet's Encryptの証明書に変えた

## What's this?

個人で運営している [PRESENT4229](https://present4229.com/) というサイトのSSL証明書の期限が切れたので、無料でHTTPS対応出来る [Let's Encrypt](https://letsencrypt.jp/) の証明書に変えてみました。

この記事はその作業の備忘録です。
結論から言うと、めっちゃ簡単に出来ました。置き換えだけなら数分で終わると思います。

## 前提

### 経緯

PRESENT4229というサイトはうるう日（2月29日）限定のサイトなので、正直サービス稼働していないうるう日以外はHTTPS対応しなくてもまぁいいんだけど、このご時世常時SSL化したほうがいいかなと思いつつ、稼働していないのにコストかけるのもなと思い、そう言えば、Let's Encryptが去年から正式に使えるようになっていたことを思い出し、光の速さでやってみたのであります。

なお、Let's Encryptの説明については割愛させていただきます。

### 環境

環境は以下です。

* さくらVPS
* CentOS6系
* Nginx1.8系

## Let's Encrypt証明書への更新方法

では早速VPSにSSHログインして更新していきましょう。

### STEP1：ダウンロード

```
$ git clone https://github.com/letsencrypt/letsencrypt
```

いい感じの場所で `git clone` してください。

### STEP2：インストール

```
$ cd letsencrypt/
$ ./letsencrypt-auto --help
```

Pythonなど諸々インストールします。
インストールが完了すると、helpが表示されます。

### STEP3：セットアップ

```
$ ./letsencrypt-auto certonly --webroot -w nginxのドキュメントルートパス / -d present4229.com -d www.present4229.com
```

ドメイン部分は適当に置き換えてください。
上記コマンドを実行すると、GUIが起動して、メールアドレスの入力を求められますので、適当なメールアドレスを入力してください。
そして、利用規約に同意したら、証明書の取得がはじまります。

取得が完了すると、以下のようなメッセージが表示され、鍵の場所などが表示されます。

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/present4229.com/fullchain.pem. Your cert will
   expire on 2017-04-06. To obtain a new or tweaked version of this
   certificate in the future, simply run letsencrypt-auto again. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to xxxxxxxxx@hogehoge.com.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

### STEP4：Nginx設定変更

今回は置き換えなので鍵のパスを変更するだけです。

```default.conf（変更箇所のみ抜粋）
#ssl config
    ssl_certificate  /etc/letsencrypt/live/present4229.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/present4229.com/privkey.pem;
```

### STEP5：Nginx再起動

そして、Nginxを再起動すれば無料のHTTPSライフが手に入ります。

```
# service nginx restart
```

![image](https://qiita-image-store.s3.amazonaws.com/0/48990/6d2f9c0d-585f-e899-6cfb-53f178190f02.png)

### STEP6：cron設定

最後に、Let's Encryptは3ヶ月で証明書の期限が切れるので、cronで自動で更新されるようにしておきます。（root権限で設定してください）

```
00 05 01 * * /hoge/fuga/letsencrypt/letsencrypt-auto renew && service nginx restart
```

letsencryptまでのパスは適宜変更してください。

## まとめ

超簡単！

## 参考サイト

* 光の速さのWEBサーバー(nginx)をlet's encryptでSSL化及びHTTP/2化。ついでにセキュリティ評価をA＋にする。
  * http://qiita.com/sak_2/items/ff835b669c0a7e110b09
* Let’s Encryptの証明書をnginxに設定してhttps化した
  * https://tsuchikazu.net/lets-encrypt-nginx/
* Let’s EncryptのSSL証明書で、安全なウェブサイトを公開
  * http://knowledge.sakura.ad.jp/knowledge/5573/
リーンスタートアップの仮説検証とMVPキャンバス


最近、作っているプロダクトで、MVPってなんぞや？みたいな議論になったので、調べてみました。
面白かったので、まとめてみます。

Twitterでも、フロントエンドに関する事や、アメリカでのエンジニア経験に関してツイートしているので、よかったらフォローお願いします。
Twitter: @hellokenta_ja

- [元記事はこちら](http://www.standardinc.jp/reflection/article/lean-startup-mvp/)
- リーンの概念を一言で表すと、最小リソースで、最大限の顧客に対する学びを得ること
- MVPを作る上で、考えなければならないことがいくつかあり、それをまとめたものを **MVPキャンバス**と呼んでいます。

## MVPキャンバスとは？
MVPキャンバスは、もともと、AppSociallyの高橋氏とRecruitのMTLが共同で開発したもので、一言で言えば「仮説を元に何を学び、そのために何を作るのか」の具体化を手助けしてくれるフレームです

### MVPを行う上で大事な事
- 小さくトライして小さく失敗し、学ぶこと
- リスクに対する失敗コストを最小化すること
- 全ては仮説であること。
- 仮説に対して効果的な検証方法を考え行うこと

### 事前に
#### ビジネス仮説について
- 現状把握を実施
- 実証できていること、出来ていない事を明確にする
- リスクの高さをもとに実証すべき仮説の優先度をつける
- 優先度が一番高い仮説に対して、以下を行う

### MVP Canvas項目
- Hypothesis：仮説
- What to Learn/Goal : 何を学ぶのか
- Type of MVP : MVPのタイプ（紙プロト、インタビュー、A/Bテスト、動くデモなど）
- What to Build/How to Validate the Hypothesis with MVP : 何を作るのか、どうやってそのMVPで実証するのか
- Criteria of Validation : 仮説実証に必要なデータ、条件
- Cost of Developing MVP : MVP構築に必要なコスト
- Time of Validating Hypothesis : 仮説検証に必要な時間
- Estimate of Future Risk/Chance : 発生する将来のリスク
- 結果と、得た学び

**仮説検証をするのは、目の前の不確実なものを確かなものにしていくためであり、そのために必要なのは発見や学びです。**
- 実証のフロー：Build - Measure - Learn
- 検証方法を考えるフロー：Learn - Measure - Build
- 仮説から何を学びたいのか？というのが1番の軸にあり、そのためにはどのような方法で、何を測れば知ることができ、そのためには何を作れば良いのか？という思考プロセスが必要。

## Dropboxの例
- Hypothesis：仮説
  - 自動同期できるオンラインストレージを提供すれば、人々は利用する
- What to Learn/Goal : 何を学ぶのか
  - 多くのストレージサービスが既にある中で、利用したいと思う人が本当にいるのか
- Type of MVP : MVPのタイプ（紙プロト、インタビュー、A/Bテスト、動くデモなど）
  - デモ動画、フォーム付きLP
- What to Build/How to Validate the Hypothesis with MVP : 何を作るのか、どうやってそのMVPで実証するのか
  - デモ用の動画と登録フォームを載せたLPを作成し、アーリーアダプタにアプローチｄけいそうなハッカーニュースに投稿する。
- Criteria of Validation : 仮説実証に必要なデータ、条件
  - 動画再生数○回
  - 登録人数○人
- Cost of Developing MVP : MVP構築に必要なコスト
  - 5日
- Time of Validating Hypothesis : 仮説検証に必要な時間
  - 1週間
- Estimate of Future Risk/Chance : 回避できる・発生する将来のリスク
  - サイト構築のリスク回避
- 結果と、得た学び
  - 1夜にして75000人の登録リストと、多くの要望コメントが寄せられた
  - このアイディアに利用したいと思う人が大勢いることが証明でき、開発に入れる状態だとわかった
Webpackで外部ライブラリを読み込む方法

# Webpackで外部ライブラリを読み込む方法
参照：[https://webpack.github.io/docs/code-splitting.html]()

最近Webpackに興味を持ちはじめて、勉強しているのですが、外部ライブラリをうまく読み込む方法がわかったのでメモします。

```webpack.config.js
var path = require('path');
var webpack = require('webpack');

module.exports = {
	entry: {
		// 外部ライブラリを読み込むvendorとページごとのjs作成
		'vendor': ['bootstrap-loader', 'backbone-fetch-cache'],
		'app/index': path.join(__dirname, '/src/app/index.js')
	},
	output: {
		filename: path.join(__dirname, '/build/[name].js')
	},
	
	/* 他の設定（ここでは省略） */

	plugins: [
		// この設定をするとvendorの中身は他のentryでは読み込まれない
		new webpack.optimize.CommonsChunkPlugin('vendor', 'build/vendor.js'),
		// webpack.ProvidePluginを使用すると、指定した変数名でライブラリを使用できるようになる
		// 以下の例だと、$, jQuery, window.jQueryでjqueryを使用することができる
		new webpack.ProvidePlugin({
			$: 'jquery',
			jQuery: 'jquery',
			'window.jQuery': 'jquery'
		}),
		new webpack.ProvidePlugin({
			kb: 'knockback'
		}),
		new webpack.ProvidePlugin({
			moment: 'moment'
		})
	],
	resolve: {
		extensions: ['', '.js']
	}
};
```

js読み込みはこんな感じ。これでライブラリ読み込み用のjsとアプリケーション用のjsとで分けることができる。

```index.html
<script type="text/javascript" src="vendor.js"></script>
<script type="text/javascript" src="app/index.js"></script>
```
GAE/Go でGoogle Cloud Storageのフォルダ内のディスク容量を取得する

表題の通り、Google App Engine上のGoアプリから
Google Cloud Storage上のあるフォルダ内のディスク容量を取得しようと思います。

まだ、GAE/Go初心者ですが、試してみたら色々とありましたのでメモしておきます。

storageを試す前に、Hello Worldなどチュートリアルを試して、
cloud shellを使っていましたが、storageを使う段階になって
~~cloud shellでデプロイできなくなりました。~~
出来ました。 [参照](http://qiita.com/llby/items/a5b1df7e87871713dcb6)

チュートリアルを試している時は、旧appengineパッケージを使っていて
`go get` もする事がなく、cloud shell上に必要なものが揃っています。

しかし、storageを使うには、 `cloud.google.com/go/storage` が必要になり
新appengine（ `google.golang.org/appengine` ）も必要になります。（多分）

本格的に開発していくためには、新appengineの方がいいと思うので移行しました。
移行の方法については、下記ページを参考にさせていただきました。
http://qiita.com/pside/items/72337bb5ac6571b238a4

~~そうして、新appengineに移行すると、 cloud shellは使えなくなります。（多分）~~
~~なので、~~ 諦めてローカルPCからデプロイします。
（手間的には、そんなに変わらない気がします。）

そんなこんながあり、いよいよコードですが

```
import (
    "golang.org/x/net/context"

    "google.golang.org/appengine/log"
    "google.golang.org/api/iterator"
    "cloud.google.com/go/storage"
)

const bucketname = "hoge"

func GetUserItemSize(c context.Context, prefix string, size *int64) {
  client, err := storage.NewClient(c)
  if err != nil {
    log.Debugf(c, "Failed to get client: %v", err)
    return
  }

  var sum int64
  sum = 0
  query := &storage.Query{Prefix: prefix}
  bucket := client.Bucket(bucketname)
  it := bucket.Objects(c, query)
  for {
    obj, err := it.Next()
    if err == iterator.Done {
      break
    }
    if err != nil {
      log.Debugf("listBucket: unable to list bucket %s: %v", bucketName, err)
      return
    }
    log.Debugf(c, "objAttrs %v\n", obj)
    sum += obj.Size
  }
  *size = sum
}
```

こんな感じになりました。
もっといい方法があるとか、間違いがあれば教えてください。
パケットフィルタリングの設定

パケットフィルタリングの設定の確認

```bash
# /sbin/iptables -L --line-number
```

設定ファイルを変更

```bash
# vi /etc/sysconfig/iptables
```

変更した内容を反映

直接へファイルを変更した時はこのコマンド

```bash
# service iptables restart
```

iptables -l で変更した時はこっちのコマンド

```bash
# /sbin/service iptables save
```
Python IDEのSpyderにKv言語のシンタックスハイライトを追加する

## 概要
Python IDEであるSpyderは、現時点ではKv言語のシンタックスハイライトに未対応のようです．
Spyderがシンタックスハイライターとして使用しているPygmentsに新たにlexer（ハイライト規則）を追加した際のメモです．

## 環境

- Windows10 64bit
- Python 3.5.2 | Anaconda custom (64-bit)
- Spyder 3.0.2
- Pygments 2.1.3

## lexerファイルのダウンロード
lexerファイルとはPygmentsのハイライト規則が示されたPythonスクリプトファイルです．
以下のリンク先よりGitHub上のソースコードを取得します．

kivy/highlight.py at master · kivy/kivy
https://github.com/kivy/kivy/blob/master/kivy/extras/highlight.py

## ファイル名の変更と保存
`highlight.py`は`kv.py`にファイル名を変更し、`\site-packages\pygments\lexers`フォルダ下に保存します．

## lexerファイルの編集
ダウンロードした状態そのままでは使用できないため`kv.py`ファイルを編集します．以下の文を1行追加し、上書き保存します．

```python:kv.py
__all__ = ['KivyLexer']
```

追加した後の`kv.py`ファイルの例は以下の通りです．

```python:kv.py
...
import sys

__all__ = ['KivyLexer']

class KivyLexer(RegexLexer):
...
```

## lexerマッピングの再構築
`kv.py`を`Pygments`に認識させるため、lexerマッピングの再構築を行います．

```bat:cmd.exe
> cd C:\Program Files\Anaconda3\Lib\site-packages\pygments\lexers
> python _mapping.py
...
pygments.lexers.javascript
pygments.lexers.julia
pygments.lexers.jvm
pygments.lexers.kv
pygments.lexers.lisp
pygments.lexers.make
pygments.lexers.markup
...
=== 400 lexers processed.
```

以上で完了です．
Spyderを起動すると、拡張子が`.kv`であるファイルがシンタックスハイライトされます．

## 参考
 - Write your own lexer — Pygments http://pygments.org/docs/lexerdevelopment/
 - syntax highlighting - How is syntaxhighlighters.py called by Spyder IDE? - Stack Overflow http://stackoverflow.com/questions/33462949/how-is-syntaxhighlighters-py-called-by-spyder-ide
 - How to install a new lexer in pygments? - Stack Overflow http://stackoverflow.com/questions/22321702/how-to-install-a-new-lexer-in-pygments
VSCodeでCtrl+Shift+A(orE)で行頭・行末までのテキスト選択を有効化する


SublimeTextで効いていた以下の操作を有効化するためのキー設定。
個人的に無いと不便かつ毎回設定を忘れるのでメモ。

- Ctrl+Shift+A : 現在のカーソル位置から行頭まで選択
- Ctrl+Shift+E : 現在のカーソル位置から行末まで選択

以下はついでに入れておいた

- Ctrl+Shift+→ : 現在のカーソル位置から次の単語の先頭まで選択/選択解除
- Ctrl+Shift+← : 現在のカーソル位置から前の単語の末尾まで選択/選択解除

### 手順


1. cmd+K→cmd+Sで`keybinding.json`を開く
2. 以下をユーザ設定側に追加


```json
[{
  "key": "ctrl+shift+a",
  "command": "cursorHomeSelect",
  "when": "editorTextFocus"
}, {
  "key": "ctrl+shift+e",
  "command": "cursorEndSelect",
  "when": "editorTextFocus"
}, {
  "key": "ctrl+shift+left",
  "command": "cursorWordStartLeftSelect",
  "when": "editorTextFocus"
}, {
  "key": "ctrl+shift+right",
  "command": "cursorWordEndRightSelect",
  "when": "editorTextFocus"
}]
```
Rails5 APIモードでJbuilderを使いたい時の追加設定〜APIサーバ構築〜

## 背景

現在ネイティブアプリをreact-nativeで製作していて、APIサーバーを建てている。既存DBに乗っかる形で開発しているため、色々とややこしい。

複数モデルの情報を組み合わせて、jsonを返したかったのでJbuilderを採用することにした。APIモードでJbuilderを使う際の情報があまりないので、メモ書き程度に残しておく。

### バージョン

```
Rails 5.0.1
ruby 2.3.1
jbuilder 2.6.1
```

### 手順1: Jbuilderのインストール

デフォルトではコメントアウトされているので、外してinstallしてあげる。以下の部分


```Gemfile

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
```

そしてbundle install。

### 手順２：Controllerに追加記述する内容

単純にDBに登録されている情報を全て返すようなcontrollerを記述するならば、Jbuilderを使わなければ、以下のようになるはず。

```app/controllers/XXX_controller.rb
class PostersController < ApplicationController
  before_action :set_poster, only: [:show, :update, :destroy]

  # GET /posters
  def index
    @xxxs = XXX.all

    render json: @xxxs
  end
end
```

これでは勝手にJbuilderを読んでくれないので、renderの部分を書き直す必要がある。

```app/controllers/XXX_controllers.rb
class PostersController < ApplicationController
  before_action :set_poster, only: [:show, :update, :destroy]

  def index
    @xxxs = XXX.all

    # 追記した部分
    render 'index', formats: 'json', handlers: 'jbuilder'
  end
end
```

一定条件のもと省略できるのもあるから適当に試してみるのをおすすめします。

これで、jbuilder用のViewを作って、そこに内容を記入していけばよい。もちろんroutesの設定も忘れずに。

```app/views/XXX/index.json.jbuilder
json.extract! @xxxs
```


この本に若干jbuilderに関する記述があるのでおすすめ。
[パーフェクトRuby on Rails](http://amzn.to/2j1jUJT)
electron-vueでPhotonをインストール


Electronアプリ作成時に有用なUI toolkitのPhotonをelectron-vue環境で使う際の導入方法です。

https://github.com/connors/photon

<img width="1233" alt="スクリーンショット 2017-01-07 17.23.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/89348/a408f924-5766-10f4-a36a-ae70261e24b3.png">

## インストール

プロジェクトディレクトリで`npm install`するのではなく`~/project-dir/app`でインストールする。

```
$ npm install --save https://github.com/connors/photon
```
`--save`でローカルインストール

## インポート

`app`配下の`node_modules`にphotonが入っていれば`app/src/main.js`に以下を追加する。

```
import 'photon/dist/css/photon.css'
```

以上です。
Herokuでgulpのwebserverをそのまま使う

自分でサクッとherokuで一旦公開したいときに
いつも迷うのでメモしておこうと思います。

Herokuでアプリを作っている、Herokuにpcからログインできる状態を前提にしています。

GitHubに上げている場合は「Deploy」
「App connected to GitHub」からリポジトリを選択して下さい。



herokuにログイン
--

### ログイン
	heroku login
	
	Enter your Heroku credentials.
	Email: メールアドレス
	Password (typing will be hidden): 
	Authentication successful.
	
### ログアウト
	
	heroku logout
	Local credentials cleared.

herokuのアプリのHOSTを変更
---

	heroku config:set --app <アプリ名> HOST=0.0.0.0
	
pagekage.jsonのdevDependenciesをインストールするために
---
	heroku config:set NPM_CONFIG_PRODUCTION=false



package.jsonのscripts
---

1. priinstallでbuildするようにする。
2. startでサーバーを起動する

--
	
	"scripts": {
		"postinstall": "$(npm bin)/gulp build --minify=true",
		"start": "$(npm bin)/gulp webserver",
	},

基本的にはdeployされるとnpminstallされそのあとにpostinstallが走り
終わったらstartが実行されるという流れのようです。
	  

gulpのserverの設定を変更する
---

	gulp.task('webserver', () => {
		connect.server({
			root: config.dest,
			livereload: true,
			host: process.env.HOST || 'localhost',
			port: process.env.PORT || 8000
		});
	});


もろもろ設定が終わったら	
--

herokuの「Manual deploy」より「Deploy Branch」 を押して現在のリポジトリをデプロイしましょう。



参考
--
* [Heroku上でもgulp-webserverを使う](http://qiita.com/unarist/items/500ccf266655c09fd877)
* [sprocketsではなくnodejsを使うRailsアプリをHerokuにデプロイする方法](http://qiita.com/yuku_t/items/8fd7551dc0418bf59aae)
最外郭法（MCP）で行動圏を推定＆重複割合を計算

最外郭法（Minimum Convex Polygon: MCP）で個体ごとの行動圏を推定し、
それぞれの個体ペアでどれくらい行動圏が重複するかを計算する。
カーネル推定の場合は adehabitatHR の kerneloverlaphr を使えばよいが、
MCP の場合は便利な関数がないような気がする。
というわけで試してみた。

## とにかく推定＆計算
いつものように UTM に変換した動物の位置情報を sp 形式に変換した後、
adehabitatHR の mcp、rgeos の gArea と gIntersection で簡単に計算できる。

```mcp_overlap.R
library(adehabitatHR)
library(rgdal)
library(maptools)
library(rgeos)

# 1-2 列目に xy 座標、3 列目に ID を入れたファイルを読み込む
d<-read.csv(適切なファイル)

# sp 形式に変換
d_sp<-SpatialPoints(d[,c(1:2)], proj4string=CRS("+init=epsg:32652"))
d_sp<-data.frame(d_sp)
idd_sp<-data.frame(d[3])
coordinates(idd_sp)<-d_sp

# 早速 MCP
# デフォルトでは 95% MCP が推定される 
hr<-mcp(idd_sp[,1],percent=100,unin="m",unout="ha")
# shp ファイルを出力
writePolyShape(hr,"homerange_mcp")

# 行動圏面積を計算
# byid = TRUE で ID ごとの行動圏面積を計算
hr_area<-gArea(hr,byid=TRUE)

# 重複面積を計算
# byid = TRUE で全 ID ペアの重複面積を計算
overlap<-gIntersection(hr,hr,byid=TRUE)
overlap_area<-gArea(overlap,byid=TRUE)
```

### 推定された行動圏
だいたいこんなかんじ。いたってふつう。
![mcp_overlap_edited.jpg](https://qiita-image-store.s3.amazonaws.com/0/153729/604fdd03-2e34-8f65-1280-589143fdd9bc.jpeg)


##データをひとつのデータフレームにまとめたい
これが意外とめんどうだった。
以下のようなデータフレームを得ることを目標とした。
ratio1 列は id1 の行動圏にしめる id1 と id2 の重複域の面積割合を示している。
![image](https://qiita-image-store.s3.amazonaws.com/0/153729/1624b48d-a2f1-a438-fdd6-0dac41c02dd8.png)

```R:データをまとめる
# まずは overlap_area
# "id1 id2" というラベルがついているので、スペース前後で切り分けて split_name というリストを得る
split_name<-strsplit(names(overlap_area)," ")
# リスト内の各ベクトルの 1 番目と 2 番目の要素をそれぞれベクトルとしてまとめる
id1<-sapply(split_name,'[',1)
id2<-sapply(split_name,'[',2)
# データフレームでまとめる
d_overlap<-data.frame(overlap_area,id1,id2)

# 次に hr_area
# ラベルを取り出した後、データフレームでまとめる
d_hr<-data.frame(hr_area,names(hr_area))
# d_overlap と d_hr を id1 で merge したいので列の名前を変更
colnames(d_hr)[2]<-"id1"

# id1 で merge する
d_all<-merge(d_overlap,d_hr,by="id1")
# 行動圏面積にしめる重複面積の割合を計算
d_all$ratio1<-d_all$overlap_area/d_all$hr_area
```

（もっと丁寧な説明をする気力が出てきたら追記するかも）
（よりスマートにできる方法があったらおしえてください）

##参考にしたページ
adehabitatHR
https://cran.r-project.org/web/packages/adehabitatHR/adehabitatHR.pdf
Home Range Estimation in R: the adehabitatHR Package
https://cran.r-project.org/web/packages/adehabitatHR/vignettes/adehabitatHR.pdf
rgeos
https://cran.r-project.org/web/packages/rgeos/rgeos.pdf
apply系関数の使い方
http://takenaka-akio.org/doc/r_auto/list.html
【Unity拡張】AnimatorControllerの作成からアタッチまでを自動化する

#はじめに
UnityでAnimatorを使おうとした場合、以下の作業を行う必要があります。

メニューからAnimatorControllerを作成
-> 作成した.controllerをAnimatorコンポーネントへアタッチ

この作業がめんどくさかったので、エディター拡張で自動化してみました。

#ソースコード 
以下のスクリプトをプロジェクトのEditorフォルダ以下へ入れてください。

```AnimatorInspector.cs
using UnityEngine;
using UnityEditor;
using UnityEditor.Animations;

[CustomEditor(typeof(Animator))]
public class AnimatorInspector : Editor
{
    public override void OnInspectorGUI()
    {
        var animator = target as Animator;
        if (animator.runtimeAnimatorController == null)
        {
            if (GUILayout.Button("Create"))
            {
                CreateAnimatorController();
            }
        }
        this.DrawDefaultInspector();
    }

    /// <summary>
    /// AnimatorController作成 
    /// </summary>
    void CreateAnimatorController()
    {
        string fullpath = EditorUtility.SaveFilePanel("AnimatorController作成", "Assets", "New AnimatorController", "controller");
        if (fullpath.Length == 0) { return; }

        string path = "Assets" + fullpath.Substring(Application.dataPath.Length);

        //非常に単純なAnimatorControllerを生成するEditor拡張コード
        //http://qiita.com/RyotaMurohoshi/items/c1f29f9afbce910c5438
        AnimatorController controller = AnimatorController.CreateAnimatorControllerAtPath(path);

        // AnimatorコンポーネントにAnimatorControllerをアタッチ
        var animator = target as Animator;
        animator.runtimeAnimatorController = (RuntimeAnimatorController)controller;
        Debug.Log("Create: " + path, controller);
    }
}
```

#結果

上記のスクリプトをプロジェクトに入れるとAnimatorコンポーネントにボタンが一つ追加されます。
<img width = 640 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/d584229b-0b09-9d88-11ad-17bfaedfc8c6.png">

<br>
Createボタンを押して保存を押せば、あとは controller作成->Animatorへのアタッチ を自動でやってくれます。楽ちんです(完
<img width = 640  src = "https://qiita-image-store.s3.amazonaws.com/0/44288/9b594190-da3f-1e13-ee1c-b96ae8278254.gif">

#参考
非常に単純なAnimatorControllerを生成するEditor拡張コード
http://qiita.com/RyotaMurohoshi/items/c1f29f9afbce910c5438