OmniAICreator/Qiita-1.07M huggingface dataset:
【Espruino】マイコンとセンサを繋げて、人が近付いたら光る装置をJavaScriptプログラミング

電子工作知識ゼロのWeb系エンジニアがIoTに挑戦。

今回はまだ、インターネットにはつながりません。
JavaScriptで動くマイコン「Espruino」を人感センサー（焦電センサー）と繋いで、人の接近を感知してLEDを光らせる装置を作ってみたいと思います。

Espruinoのセットアップ等は、↓で記事にしています。
[Espruinoに接続してプログラムを実行](http://qiita.com/momoham/items/7b957bba9fbbfb043237)

#準備するもの
- Espruino
    - 日本では[ELEFINE](http://www.elefine.jp/SHOP/EspruinoOriginal.html)から通販で入手可能
- 人感センサー（焦電センサー）
    - 今回は[ＳＢ４１２Ａ](http://akizukidenshi.com/catalog/g/gM-09002/)というモジュールを使用しています
- LED
- ブレッドボード
- ジャンパワイヤ（オス-オス）
- ピンヘッダ
- はんだごて
- USBケーブル(A-マイクロB)

#手順
##ピンヘッダのはんだ付け
Espruinoをブレッドボードで使えるようにするため、ピンヘッダをはんだでくっつけます。
GND、Bat、3.3は電気を通すために必ずつけておく必要があります（両サイド、中央部にありますが、とりあえず片方のサイドのみでOK）。

それ以外にはA0〜C１５と書かれた穴がありますが、これらはセンサやLEDなどとデータのやりとりをするのに使うものです。今回はA0とA1しか使いませんが、ブレッドボード上で安定させるために余分につけておくと良いです。今回はB8までつけました。

![image7.JPG](https://qiita-image-store.s3.amazonaws.com/0/135266/776f0804-c992-18ae-0865-5417505b30a3.jpeg)
汚いけど、これでも通電しますよー。

##配線
1. Espruinoを、ブレッドボード上の適当なところに、ピンが縦に並ぶように挿す
2. その隣に、人感センサーモジュールを挿す
3. LEDの足の長い方をEspruinoの「A1」と同じ並びに、足の短い方をブレッドボードの「−」の列に挿す
4. ジャンパワイヤを使って接続していく
    - Espruinoの「3.3」(と並んだどこか)と、ブレッドボードの「＋」の列
    - Espruinoの「GND」(と並んだどこか)と、ブレッドボードの「−」の列
    - センサモジュールの「＋」(と並んだどこか)と、ブレッドボードの「＋」の列
    - センサモジュールの「−」(と並んだどこか)と、ブレッドボードの「−」の列
    - センサモジュールの中央のピン（と並んだとこか）と、ブレッドボードの「A0」の列
5. EspruinoとPCをUSBで接続する

![image8.JPG](https://qiita-image-store.s3.amazonaws.com/0/135266/63269dae-e9a1-9df8-fad9-aafe0c3ebb44.jpeg)
全部つなげるとこんな感じになります。

##プログラミング
Espruino IDEを使って、以下のJSをEspruinoに送り込みます。

```js
setWatch(function() {
    A1.write(1);
}, A0, {repeat:true, edge:"rising", debounce:0});

setWatch(function() {
    A1.write(0);
}, A0, {repeat:true, edge:"falling", debounce:0});
```

setWatchというのはEspruino独自の、センサーに適した関数で、[こちら](http://www.espruino.com/Reference#l__global_setWatch)に詳しい解説（英語）が載っています。
↑では、センサー(A1）が感知したらLED（A0)をつける、感知しなくなったらLEDを消す、ということを書いています。


##実験
ブレッドボードを少し離れた場所に置いて、近付いてみたり遠ざかってみたり（あるいはじっと静止してみたり）すると、LEDがついたり消えたりしました。大成功。
今のところ、電気回路の知識がなくてもなんとかなっています。

次回はいよいよ、この装置をインターネットにつなげてみたいと思います！


マイコンをインターネットにつなぐ前に必要な、WiFiモジュールのセットアップについてはこちら↓
[ESP-WROOM-02からWiFi接続してIoTなHello World](http://qiita.com/momoham/items/a5f1e2b4ff507335eb75)
RDSリードレプリカで re:dash環境をつくる(Google認証編)

## これまで
- [RDSリードレプリカで re:dash環境をつくる(インストール編)](http://qiita.com/ryusukefuda/items/5e846fb7a89c027036ee)
- [RDSリードレプリカで re:dash環境をつくる(セットアップ編)](http://qiita.com/ryusukefuda/items/f717be9fad296ea8157e)


## 今回やること
- Google Appの認証でログインするようにする

## 公式ドキュメントの手順に従ってやる
### EC2ログイン
`ubuntu` というユーザー名でログインし、`sudo su`でルート権限になっておく

基本的にいじるファイルは`/opt/redash/.env`ファイル

### クッキーのシークレットキー変更
>Update the cookie secret (important! otherwise anyone can sign new cookies and impersonate users): change “veryverysecret” in the line: export REDASH_COOKIE_SECRET=veryverysecret to something else (you can run the command pwgen 32 -1 to generate a random string).

#### 推奨されたコマンドでシークレットキー作成
`pwgen 32 -1`
返ってきたランダムの文字列をコピーして`/opt/redash/.env`の`export REDASH_COOKIE_SECRET`を変更し保存

### adminのパスワード変更
>By default we create an admin user with the password “admin”. You can change this password opening the: /users/me#password page after logging in as admin.

デフォルトのパスワード`admin`を任意のものに変更
ログインし、`/users/me#password` にアクセスし変更
ログアウトし、新しいパスワードでログインできればOK

### Google Appsのログイン設定
公式の手順に従ってやる 
http://docs.redash.io/en/latest/misc/google_developers_project.html

### キー登録
Google Developers Consoleで得たクライアントIDとクライアントシークレットを`/opt/redash/.env`に登録する

```
export REDASH_GOOGLE_CLIENT_ID=""
export REDASH_GOOGLE_CLIENT_SECRET=""
```

### 登録させるドメインを指定
>Configure the domain(s) you want to allow to use with Google Apps, by running the command:


`cd /opt/redash/current`
`sudo -u redash bin/run ./manage.py org set_google_apps_domains {ドメイン}`
成功すると`Updated list of allowed domains to: ['ドメイン']` と表示される。

### サーバーリスタート
`sudo supervisorctl restart redash_server`

### アクセスする
今までなかった `Log In with Google` が出現している。
ボタンタップしGoogleアカウントでログインできればOK
Vyattaの設定をコマンド形式でエクスポートする方法

#目的
・Vyattaの設定をコマンド形式でエクスポート

#方法
設定ファイルを保存しておいても良いが、一部だけ設定を拝借したい場合に、設定をコマンド形式でエクスポートできる

```
#設定をsetコマンド形式で出力（入力モードは問わない）
/opt/vyatta/sbin/vyatta-config-gen-sets.pl /config/config.boot

#結果
set firewall all-ping 'enable'
set firewall broadcast-ping 'disable'
set firewall config-trap 'disable'
set firewall ipv6-receive-redirects 'disable'
set firewall ipv6-src-route 'disable'
set firewall ip-src-route 'disable'
set firewall log-martians 'enable'
set ...
```

#参考
[Vyattaの初期設定 — Sugio Laboratory : ](https://hobby.sugio-garden.com/computer/network/l4403b)
VirtualBox 5.0.24/26 on Debian sidでブリッジネットワーク接続を有効にするとVMが立ち上がらない→入れなおしたら治っちゃった

# ブリッジ有効にしたら落ちる

```
仮想マシン"debian"のセッションを開けませんでした。

Failed to open/create the internal network 'HostInterfaceNetworking-eth0' (you might need to modprobe vboxnetflt to make it accessible) (VERR_SUPDRV_COMPONENT_NOT_FOUND).

Failed to attach the network LUN (VERR_SUPDRV_COMPONENT_NOT_FOUND).

Please install the virtualbox-dkms package and execute 'modprobe vboxdrv' as root (VERR_SUPDRV_COMPONENT_NOT_FOUND).

終了コード : NS_ERROR_FAILURE (0x80004005)
コンポーネント: ConsoleWrap
インターフェース: IConsole {872da645-4a9b-1727-bee2-5585105b9eed}

```

## 5.0.24を手元で5.0.26にあげても同じ。
パッケージを無理やりアップデートしてみたけど同じ。
というか、5.1シリーズ入れる前に5.0.26アップロードしてほしいな...

## 比較実験するとしたら？
* kernelバージョンを変えて起動する
* 他のマシンでもやってみる
* それでも変わらなければ他のdistroでもやってみる（Vboxのnestって出来たっけ？）

## remove -> install で直ってしまった
何が原因だったのか？...うーん。
RDSリードレプリカで Re:dash環境をつくる(セットアップ編)

## これまで
 - [RDSリードレプリカで Re:dash環境をつくる(インストール編)](http://qiita.com/ryusukefuda/items/5e846fb7a89c027036ee)

## 今回やること
Re:dashのデータソースをRDSに設定
http://docs.redash.io/en/latest/setup.html#setup

## ログイン
まずはadminでログイン
user: admin
password: admin

ログインできたらOK
データソースがないからまだ何も表示されない

## データソースをRDSに設定
Re:dashではデータソースの設定を管理画面から設定する
http://docs.redash.io/en/latest/setup.html#datasources
>you need to setup your data sources in it. Browse to /data_sources on your instance, to create new data source connection.

`右上のDBマーク → + New Data Source`

### Data Source追加
- Name: trunk-for-redash(自由)
- Type: Mysql
- Database name: MysqlのDBの名前
- Host: RDSのエンドポイントURL(`RDS → DBインスタンス選択 → 虫眼鏡マーク → エンドポイント`)
- Password: Mysqlのパスワード
- Port: RDSのポート(`RDS → DBインスタンス選択 → 虫眼鏡マーク → ポート`)
- User: Mysqlのユーザー

## 試しにクエリ発行してみる

### ダッシュボード作成
`ホーム → New Dashboard`

### クエリー作成
`Dashboard内 → New Query`
`Data Source` をさっきつくったRDSのリードレプリカにする
左側のスキーマ画面に全テーブルが表示されればうまく接続できている。
もし正しく表示されない場合はデータソースのRDSの情報が間違っている
右側のsqlを書くところにsqlかいてみる。
`select * from 〇〇`
Executeで実行すると下に見やすく整形されて結果が出力されればOK

## 次やること
[RDSリードレプリカで Re:dash環境をつくる(Google認証編)](http://qiita.com/ryusukefuda/items/fc4651f87e46c6a88ad8)
RDSリードレプリカで re:dash環境をつくる(インストール編)

## 背景
アプリケーションの管理画面で社内向けにデータを表示してたけど、もっといろいろ数字取りたい&本番のDB管理画面から叩きまくるのちょっとなぁということで [re:dash](http://redash.io/)を使うことに。
誰でもsql叩けて、それを簡単にビジュアライズできてGoolge認証付きというところが良さそうだなぁと。

## やること
1. RDSでリードレプリカ作成
2. 用意されているAMIをつかってEC2を起動

## RDSでリードレプリカ作成
`AWSログインしRDS選択 → インスタンス選択 → インスタンスの操作 → リードレプリカの作成`
 
### インスタンスの仕様
 - DBインスタンスのクラス: db.t2.micro (まずは小さいので)
 - ストレージタイプ: 汎用 SSD
 - DBインスタンス識別子: {masterの名前}-for-redash (RDSコンソール内に出るだけなのでなんでもOK)
 - データベースのポート: 3306
 
作成を押して20分くらいすると作成中→利用可能になる

### EC2インスタンス起動
公式が用意してくれているamiを使用
http://docs.redash.io/en/latest/setup.html#create-an-instance

東京なので `ap-northeast-1` のAMIを使用
https://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-plan-region.html

AMIをタップするとAWSサイトへ行きインスタンスタイプ選択画面にいく

#### インスタンスタイプ
公式ドキュメントに
>Launch the instance with from the pre-baked AMI (for small deployments t2.micro should be enough)

とかいてあるのでそれに習って `t2.micro` 選択。
セキュリティグループは後で変更する為、`確認と作成`する

#### セキュリティグループ変更
デフォルトだと `launch-wizard-2` になっているので公式ドキュメント推奨のセキュリティグループを作成してそれを作成したインスタンスにあてる
>When launching the instance make sure to use a security group, that only allows incoming traffic on: port 22 (SSH), 80 (HTTP) and 443 (HTTPS).

`EC2ダッシュボード → セキュリティグループ → 新規作成`

##### インバウンド
- SSH ポート範囲 22
- HTTP ポート範囲 80 
- HTTPS ポート範囲 443

#### インスタンスのセキュリティグループ変更
`インスタンス → 選択 → アクション → ネットワーキング → セキュリティグループの変更`

#### とりあえずアクセスしてみる
`インスタンス → パブリックDNS`
ブラウザにパブリックDNSのURLにアクセス
→ Re:dashのログイン画面が出ればインストール完了！

## EC2のIPを固定する
`EC2ダッシュボード → Elastic IP → 新しいアドレスの割り当て`

### 割り当てられたIPとインスタンスを紐付ける
`新しいIP選択 → アクション → アドレスの関連付け → インスタンス選択`

## Route53でドメイン当てる
これで一通りインストールOK。

## 次やること
- [RDSリードレプリカで re:dash環境をつくる(セットアップ編)](http://qiita.com/ryusukefuda/items/f717be9fad296ea8157e)
- [RDSリードレプリカで re:dash環境をつくる(Goolge認証編)](http://qiita.com/ryusukefuda/items/fc4651f87e46c6a88ad8)
NEW queueに入ったらメールがくるようになってた

# メール本文

```
binary:libsnapper3 is NEW.

Your package has been put into the NEW queue, which requires manual action
from the ftpteam to process. The upload was otherwise valid (it had a good
OpenPGP signature and file hashes are valid), so please be patient.

Packages are routinely processed through to the archive, and do feel
free to browse the NEW queue[1].

If there is an issue with the upload, you will receive an email from a
member of the ftpteam.

If you have any questions, you may reply to this email.
```
なお、すぐに処理された。約二時間後。

## 次は何？
Probably hub and spoke model as same as NM process should be applied to NEW queue, IMO.
libiconv.2.dylibのバージョンが古いと怒られた件


# 環境と経緯
Mac (OS X El Capitan 10.11.6)で、PHPUnitをインストール中のトラブル
最近、PHPを5.5.36にアップグレードした。
Zend Framework 2のPHPUnitサポートを試した。composerでPHPUnitをインストールするものの、バージョンが違うとランタイムエラー。これはこれで、別の話題。（うまくいったら書くかもしれないし、書かないかもしれないし・・・。組み合わせがあちこちでごちゃごちゃしすぎていて、まだ整理しきれていない。）

PHPUnitのバージョンを変えて試す途中で起きた現象。
解決策を忘れそうなのでメモ。

# 現象

`
wget https://phar.phpunit.de/phpunit.phar
`

で、最新のphpunit.pharを取得しようとしたら

```
dyld: Library not loaded: /usr/local/opt/libiconv/lib/libiconv.2.dylib
  Referenced from: /usr/local/bin/wget
  Reason: Incompatible library version: wget requires version 8.0.0 or later, but libiconv.2.dylib provides version 7.0.0
Trace/BPT trap: 5
```
と怒られてしまった。しばらく前にwgetを実行した時は、こんなこと起きなかったのに・・・。

手探りで、こんなところをググってみた。
https://github.com/Homebrew/homebrew-php/issues/2059

# 解決策（うまくいかなかった方）

`
sudo port -n upgrade --force libiconv
`

撃沈。（いや、こういうコマンドを気楽に実行しちゃうから、こういうトラブルに見舞われるのかも、と若干反省。）

# 解決策（うまくいった方）

suでスーパーユーザになる。
`
brew update
brew install libiconv
`

これだけ。わかってしまえば簡単なのだけれど。
直線位置調整 > OPアンプ > 反転増幅回路 / ゲイン1.0 / 正負電源が必要 / バイアス電圧が必要

```txt:動作環境
Analog Disocvery 2 (以下AD2)
```

関連 http://qiita.com/7of9/items/0256996d9cf94fd2abc8
関連 http://qiita.com/7of9/items/3dbec71e73d613e53699

P型MOSFET使用中に検討した電圧を反転する方法。

手持ちのOPアンプは以下のものがあった。

- 2904D ( http://akizukidenshi.com/catalog/g/gI-09216/ )
  - 単電源
- 4580D ( http://akizukidenshi.com/catalog/g/gI-00069/ )
  - 両電源

## 2904Dでの反転増幅回路

単電源の場合は電圧を反転するにはVin+の方にバイアス電圧?をかけないといけないようだ。
以下のリンクのE1に相当するものが必要。

[オペアンプを用いた片電源反転増幅器](http://tokyo-ct.net/usr/kosaka/for_students/lineTrace/operationalamplifier/operationalamplifier.html)


## 4580Dでの反転増幅回路

- 4580DのOPアンプ電源 V+とV-に+5Vと-5Vをかけた
  - AD2のSuppliesを使用し、Positive SupplyとNegative Supplyの項目を5V, -5Vとした
- 反転増幅する電圧は1.5Vの単三電池を使用
- R1, R2の抵抗は1.1k使用
- AD2と4580Dの接続はAD2側では以下を使用
  - GND
  - V-
  - V+
  - 1+: Channel 1
  - 1-: Channel 1

以下のように1.5Vが反転され-1.5Vとして測定ができた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3772ecbe-78b7-9d4c-a05e-2ffc7b65257c.png)


OPアンプについてほとんど分かっていないということが分かった6時間だった。

PチャネルMOSFETにVth(-2.0V)以上のマイナス電圧を印加しようとするためにGPIO14の3.3V電圧を反転しようとして、それにOPアンプを使おうとしたら、回路がどんどん複雑になっていきそうだ。発注したインバーターかNチャネルMOSFETを使って、簡易な回路になるように検討することにした。
ruby old signal handler

http://florianhanke.com/blog/2011/02/20/searching-with-picky-live-reloading-indexes.html

```rb
require 'pry'

puts Process.pid
trap(:INT) { puts "This is the first signal handler" }

old_handler = trap(:INT) {}
puts old_handler.source_location

trap(:INT) {
	old_handler.call
	puts "This is the second handler"
}
sleep
```

working with unix process p85
コマンドを繰り返し実行する

## 繰り返す

ノーマルモードで```@:```と打つとコマンドを繰り返し実行できます。
```10@:```と打てば10回コマンドが繰り返し実行されます。

コマンドラインモードで ```:echo localtime()``` を実行後、```@:```を連打するか1秒以上経過してから```@:```と打つと、コマンドラインに新しく現在の時刻が表示されます。

## 例

サンプルをいくつか載せます。

### サンプル1
```vim:sample1.vim
function! Insert1() abort
    normal! i1
endfunction

call feedkeys(":call Insert1()\<CR>", 't')
```

```bash:Vim起動
vim -Nu NONE -i NONE -S sample1.vim
```

Vimを起動するとバッファに1が挿入されている状態になります。
```@:```を打つと繰り返して実行されます。

但し、スクリプトの中で```@:```を実行したらE30が発生します。
一瞬でエラーメッセージが消えるのでエラーがなかったように見えますが```:message```で確認できます。
次のサンプルを試すとE30が発生します。

```vim:sample1a.vim
function! Insert1() abort
    normal! i1
endfunction

call feedkeys(":call Insert1()\<CR>", 't')
normal! @:
```

```bash:Vim起動
vim -Nu NONE -i NONE -S sample1a.vim
```

### サンプル2

```vim:sample2.vim
function! Insert1() abort
    normal! i1
endfunction

command! Insert1 :call Insert1()
```

```bash:Vim起動
vim -Nu NONE -i NONE -S sample2.vim
```

Vimを起動した後に手動で```:Insert1```を実行してください。
sample2.vimの中で```:Insert1```を実行しても繰り返しに対応できません。
```@:```を打つと```:Insert1```が繰り返されます。

### サンプル3

```vim:sample3.vim
function! Insert1() abort
    normal! i1
endfunction

command! Insert1 :call Insert1()
nnoremap <C-a> :<C-u>call feedkeys(":Insert1\r", 't')<CR>
```

```bash:Vim起動
vim -Nu NONE -i NONE -S sample3.vim
```

```Ctrl-a``` を押した後に```@:```で繰り返し実行できるようになります。

ちなみに```nnoremap```と```feedkeys```と```\<CR>```を組み合わせて書くとE114とE116が発生します。

```
nnoremap <C-a> :<C-u>call feedkeys(":Insert1\<CR>", 't')<CR>
```

```\<CR>``` の部分を ```\r``` と書けばエラーは発生しなくなります。

## 繰り返せないサンプル

.viminfoの ```コマンドライン 項目の履歴``` にコマンドを追加しても繰り返せません。

```vim:bad1.vim
call histadd(':', 'echo localtime()')
```

```:history c```で確認すると確かに```:echo localtime()```が履歴に追加されていますが繰り返せないようです。
RiotJSでpugを使う


RiotJS初心者の@dulkappaです.
久々にRiotJS書いてたら, jadeからpugにしてね, みたいなメッセージが出たり浦島状態でした.

![Kobito.uN40Bg.png](https://qiita-image-store.s3.amazonaws.com/0/51860/22d8c634-11f4-86af-8fde-a8f34591762f.png "Kobito.uN40Bg.png")

パグ可愛いな, おい.


ということで, RiotJS + gulp + pugで書きなおしたときのメモです.
といってもほとんどjadeとpugは記法が変わらないみたいなので, 一瞬だったけど.

ES2016のお作法とかわからないので, わかったらその辺もアップデートしたい.

## 構成(最小)

```
riot_sample.
├── gulpfile.js
└── src
    ├── app-todo.tag.pug
    ├── app.js
    └── index.pug
```

細かいのはリポジトリ見てね.

## 解説というかただのコード

### `gulpfile.js`

```./gulpfile.js
var gulp = require('gulp');
var browserify = require('browserify');
var riotify = require('riotify');
var pug = require('gulp-pug');
var source = require('vinyl-source-stream');
var webserver = require('gulp-webserver');

gulp.task('pug', function() {
  gulp
  .src('src/index.pug')
  .pipe(pug())
  .pipe(gulp.dest('dist/'));
});

gulp.task('browserify', function() {
  browserify({ entries: ['src/app.js'] })
  .transform(riotify, { 'template': 'pug', 'ext': 'tag.pug' })
  .bundle()
  .pipe(source('main.js'))
  .pipe(gulp.dest('dist/'));
});

gulp.task('server', ['browserify', 'pug'], function() {
  gulp
  .src('dist')
  .pipe(webserver({
    livereload: true,
    directoryListining: true,
    open: true
  }));
});

gulp.task('default', ['server']);
```

riotify使うところですが, タグファイルの拡張子が`*.tag.pug`なので, `ext`オプションで指定しています.
テンプレートも`jade`ではなく`pug`にしてます.

### `app-todo.tag.pug`

```./src/app-todo.tag.pug
app-todo
  form(onSubmit="{ add }")
    input(name="input" onkeyup="{ edit }")
    button(disabled="{ !text }") Add

  ul
    li(each="{ items }")
      label(class="{ completed: done }")
        input(type="checkbox" checked="{ done }" onClick="{ parent.toggle }")
        | { title }

  script.
    this.disabled = true;

    this.items = opts.items;

    edit(e) {
      this.text = e.target.value;
    }

    add(e) {
      if (this.text) {
        this.items.push({ title: this.text });
        this.text = this.input.value = '';
      }
    }
    
    toggle(e) {
      var item = e.item;
      item.done = !item.done;
      return true;
    }
```

RiotJS Style Guideの内容も少しずつ取り込んでいきたい.
とりあえず`<script>`タグとファイル名のとこだけ.

### `app.js`

```./src/app.js
var riot = require('riot');

require('./app-todo.tag.pug');

riot.mount('app-todo');
```

タグのマウント用(ここに載せる必要なかった).

### `index.pug`

```./src/index.pug
html(lang="ja")

head
  title Riot Sample
  meta(charset='utf-8')

body
  app-todo(items="{ [] }")
  
  script(src="main.js")
```

なんかシンタックスハイライトおかしい...

## 参考

- [riot_sample(個人的な実験用リポジトリ)](https://github.com/dulkappa/riot_sample)
- [RiotJS Style Guide](https://github.com/voorhoede/riotjs-style-guide)
- [gulp-pug](https://www.npmjs.com/package/gulp-pug)
- [【Pug】ゴリラでもわかるJade改めPug入門
](http://blog.mismithportfolio.com/web/20160326pugbegin)
ATOMのide-haskell導入手順（MacOS X）

Haskellの勉強を始めました。

個人的に、静的型付け言語で入力補完機能を使わない人はどMだと思います。
僕は、どMではないので、Atomに[ide-haskell](https://atom.io/packages/ide-haskell#requirements)を挿れました。

## HaskellのビルドツールStackの導入

まず、はじめにHaskellのビルドツールのStackを導入します。
StackにはGHCが同梱されているので、既にGHCを入れている場合は事前にアンイストールしておきます。
僕はパッケージ管理にHomebrewを使っているので、下記コマンドでアンイストールを実行します。

```shell-session:
$ brew uninstall ghc
```
次に、Stackをインストールします。

```shell-session:
$ brew install haskell-stack
```
インストールが完了したら、Setupコマンドを実行します。

```shell-session:
$ stack setup
```
Stackで導入したGHCは先頭にStackを付けて実行します。

```shell-session:
$ stack ghc test.hs
```
ただ、毎回Stackをつけるのは面倒なのでAliasを設定しておきます。
Macの場合は、~/.bashrc にエディタで追記します。
([PATHの設定方法](https://gist.github.com/disktnk/4104284))

```shell-session:
alias ghc="stack ghc"
alias ghci="stack ghci"
alias runghc="stack runghc"
```

## PATHの設定
PATHも同様に~/.bashrc にエディタで追記します。

```shell-session:
export PATH="$HOME/.local/bin:$PATH"
```
このPATHを通していないと後で導入するghc-modやhlintコマンドが利用できない。

## Stackでパッケージをインストール
ghc-modとhlintというパッケージをStack経由でインストールします。
Hlintは[lint](https://ja.wikipedia.org/wiki/Lint)のHaskellバージョンです。

```shell-session
$ stack install ghc-mod hlint
```

## Atomのインストール
[Atom](https://atom.io/)をインストールします。
インストール方法はZipを展開してアプリケーションフォルダに移動するだけ。

インストール後起動して、Atomメニューの「Install shell commands」をクリック。
これによりapmコマンドがターミナルで使えるようになります。
（apmは、ターミナル上でAtomのパッケージをインストールするためのコマンドです。）

## Atomのパッケージ導入
apm経由で以下7つのパッケージを導入します。
-ide-haskell
-ide-haskell-repl
-linter-hllint
-linter
-language-haskell
-haskell-ghc-mod
-autocomplete-haskel

以上のパッケージを以下コマンドでインストールします。

```shell-session
$ apm install ide-haskell-repl linter language-haskell linter-hlint haskell-ghc-mod autocomplete-haskell ide-haskell
```

これで、atomでHaskellのソースファイルを開けば、ide-haskellが起動するはずです。

```shell-session
$ atom test.hs
```

### 参考にした記事
- [stackとAtomでHaskell開発環境を構築する](https://exempla.jp/archives/1)
- [AtomでHaskellを扱う環境を整える](http://qiita.com/manji-0/items/463ea051f624a9a4a83a)
[Rails] Railsのformでremote => trueオプションを使ってうまくいかないときのトラブルシューティング

jsを書かずにAJAXリクエストができるformのremote => trueオプションがとても便利ですが、
初見でハマリやすいポイントがあったのでその防備録を書いておきます。

```slim
= form_tag "/comments", method: :post, remote: true do
  = text_field_tag "body"
  = submit_tag "送信"
```

## input typeがfileだとajaxリクエストにならない

素のRailsの仕様はinput[type=file]には対応していません。

以下のgemを入れることで対応できます。
https://github.com/JangoSteve/remotipart


## remote => trueにしているのにajaxリクエストにならない

リクエスト先でエラーが起きていたり、
ajaxイベントをハンドリングしている場合はJavaScriptコードでエラーが出ている可能性があります。

→ ブラウザコンソールで、"Preserve Log"を選択し、ログを監視してみましょう。

<img width="551" alt="スクリーンショット 2016-08-13 11.39.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/52847/3e6ea0d3-0d3f-224f-4094-f72dfef76a41.png">
which command相当をWindowsで実行する方法


# やりたいこと
Linuxでの`which` command相当をWindowsで実行したい。


# 結論
`where.exe <コマンド>`を実行する。 

`which`相当を実施する方法は複数ある(特にPowerShell)が、
`where.exe`はPowerShellとCommand Promptで同一コマンドで実行できるのが良い。

## 実行例
```console:PowerShell
PS C:\Users> where.exe ping
C:\Windows\System32\PING.EXE
PS C:\Users>
```

```console:Command-Prompt
C:\Users>where.exe ping
C:\Windows\System32\PING.EXE

C:\Users>
```


# 参考
Is there an equivalent of 'which' on the Windows command line? - Stack Overflow
http://stackoverflow.com/questions/304319/is-there-an-equivalent-of-which-on-the-windows-command-line
GoProの4K動画を1080pにしてiPhoneで編集したい

## 動機
GoProで4K動画を撮ったものの、iPhoneに送ってみると再生・編集ができない。
何かいい手はないものかと調べた結果、ffmpegを使って1080pに変換するのがいいのではないかと考えました。
ついでに手振れがひどかったので、vibstabの手振れ補正をかけました。

## 環境
OS: Windows10 Pro
CPU: 64bitプロセッサ

## 準備
ffmpegのホームページのDownloadから Windows builds を選択、CPUにあったstaticのビルドをダウンロードして、適当なフォルダに解凍して入れます。

解凍した中にあるff-prompt.batファイルを起動すると、binにパスの通ったプロンプトが使えて便利です。

適当なフォルダにGoPro動画を入れておきます。

## ffmpeg
一気に処理させるために下記のようなワンライナーを考えました。

```
> FOR /F "tokens=*" %G IN ('dir /b *.mp4') DO (ffmpeg -i "%G" -vf vidstabdetect -an -f null - & ffmpeg -i "%G" -vf "vidstabtransform,scale=1920:1080" -vcodec libx264 -acodec copy -crf 18 -tune film -preset slow "1080p-stab-%G")
```

`dir /b *.mp4`でmp4ファイルの入力リストを作って、`FOR /F "tokens=*" %G`で%Gにわりあて、ffmpegのインプットとします。
ffmpegでは、まず手振れの解析を行います。
`ffmpeg -i "%G" -vf vidstabdetect -an -f null - `の部分で`transforms.trf`ファイルを生成し、
`ffmpeg -i "%G" -vf "vidstabtransform,scale=1920:1080" -vcodec libx264 -acodec copy -crf 18 -tune film -preset slow "1080p-stab-%G"`で手振れ補正しつつ画面サイズを小さくしています。

`-vf "vidstabtransform,scale=1920:1080"` フィルタにvidstabtransformと1080p変換を指定
`-vcodec libx264` x264コーデックを指定
`-acodec copy` オーディオはなにもいじらない
`-crf 18 -tune film -preset slow` このあたりはお好みで
`"1080p-stab-%G"` 出力ファイル名の指定。ここではファイル名の頭に `1080p-stab-` を付けるようにしています。

後は放っておくだけ！
個人の感想ですが、デフォルト設定でも手振れがかなり抑えられ、満足のいく結果だと思いました。

## さて、iPhoneにはどうやって入れようか...
有線が使えないため、iCloud Drive経由でファイル1つ1つダウンロードしています...
【Trainer's Recipe】ターミナルをちょっと快適に扱うためのTips

このEntryは、<a href="http://gsacademy.tokyo/" target="_blank" style="text-decoration: none;">G's ACADEMY TOKYO</a>のトレーナー/チューターによる投稿記事です。
授業の中で出たちょっとした質問や疑問、トレーナーが関心のある新技術等を脈絡なく綴っていきます。

![TerminalIcon.png](https://qiita-image-store.s3.amazonaws.com/0/104065/ffe021df-ff88-dd4a-746b-98e4fd7d9914.png)


こんにちは。
元G's生の谷口と申します。

Mac使いのみなさん。「ターミナル」使ってますか？
何かと慣れが必要な黒い画面ですが、ちょっとでも快適にターミナルを操作するためのTipsを紹介したいと思います。

##コマンド入力はなるべく再利用を使う
- ターミナルを使っていて思うのは、実際にターミナルで使うコマンドがどれもこれも似通っているので、前に使ったコマンドを若干変えて使えば、毎度最初から打ち直すよりも時間短縮が望めるということです。
- なのでコマンドを打ち込む前に、直前に似たようなコマンドを打ち込んでいないか考えましょう。もしも心当たりがあった場合は、以下のどちらかを使ってみましょう。 

###矢印上キー、またはCntrl + p 
- 直前のコマンド履歴を確認するのに便利。
- ちなみに **p**は **previous（昔)**の **p**と覚えましょう
- **下矢印キー**、 **cntrl + n**で逆方向に移動することができます。(nは **new**)

###history
- 上の方法よりも広範囲のコマンド履歴を知ることができる。
- 使いたいコマンドの左側についている番号を覚えておき、 **!**の後にその番号をつけてEnterを押すと、その部分のコマンドを実行できる。
- ただ、この方法でコマンドを実行する場合、コマンド内容を変更することができないことに注意。

##コマンドの編集もショートカットを活用する
- ターミナルの特徴として、カーソル移動が矢印キーでしかできないというのがあります。なので、打ち間違いに気付いた場合は、矢印キーかbackspaceを連打する人も多いと思いますが、どうせならこのようなショートカットを活用してみるといいかもしれません。

###cntrl + a
- 行頭にカーソルを移動する。
- 変更箇所が行頭に近い場合に使うと便利。
- 逆に文末に移動したい場合は **cntrl + e**を使う。

###cntrl + u
- 現在のカーソル位置から前の箇所を削除する。
- 今まで打ち込んだのをまとめて削除してやり直したい場合などに使うと楽
- 逆に現在のカーソル位置以降の部分を削除したい時は **cntrl + k**

##ごちゃごちゃしたターミナル画面をすっきりする
- ターミナル画面でコマンドをたくさん実行すると、ターミナル画面が文字で埋め尽くされて見にくくなっていきます。
- 一旦リセットして、綺麗な画面からコマンドを実行したいと思ったら **cntrl l(エル)**を実行してみましょう。

##ドラッグアンドドロップでcd移動を行う
- ターミナルでの移動の基本は **ls**で確認してからの **cd**ですが、これを何度も繰り返して移動していくのがじれったい人にはうってつけの方法です。
- やり方は簡単で、まずは移動したい先のディレクトリをFinderで開きます。
- 次にターミナル上で **cd**とだけ打ち込んでおき、そのターミナル画面に向かってFinderの移動先のディレクトリをドラッグアンドドロップします。
- するとあら不思議。ターミナルにそこへのディレクトリが自動的に貼り付けられるので、あとはEnterで実行するだけで移動ができます。



以上、<a href="http://gsacademy.tokyo/" target="_blank" style="text-decoration: none;">G's ACADEMY TOKYO</a>チューター谷口によるTrainer's Recipeでした。
riot.jsでカスタムタグの関数と外部関数の相互呼び出し方法


riot.jsの勉強1日目ですが、カスタムタグと外部スクリプトの間でやりとりする方法がパッと見つからなかったのでメモしておきます。

カスタムタグの関数を外部から呼び出す方法
-----

以下のようなカスタムタグitemがある場合

```js
<item>
	<button onclick='{add}'>add</button>
	<table>
		<tr each='{item_list}'>
		  	<th>{ name }</th>
		</tr>
	</table>
	
	this.item_list = [];
	this.add = function(e) {
	  this.item_list.push({ name: '要素' + this.item_list.length, value: this.item_list.length});
	}
	this.addItem = function() {
	    this.item_list.push({ name: '要素' + this.item_list.length, value: this.item_list.length})
	    console.log(this)
	    this.update();
	}
</item>
```

カスタムタグitemの関数addItemは以下のように呼び出せます。
riot.mountの返り値のオブジェクトがカスタムタグのthisと同じ役割を果たします。
カスタムタグは複数記述できるので、返り値はオブジェクトの配列であることに気をつけて下さい。

```js
<script>
  var item = riot.mount('item')
  item[0].addItem();
</script>
```


全体のソースは以下のようになります。

```js

<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <script src='https://cdn.jsdelivr.net/riot/2.3/riot+compiler.min.js'></script>
    <title>RiotJS Test</title>
  </head>
  <body>
    <item></item>

    <script type="riot/tag">
      <item>
        <button onclick='{add}'>add</button>
          <table>
        <tr each='{item_list}'>
          <th>{ name }</th>
        </tr>
        </table>
        
        this.item_list = [];

        this.add = function(e) {
          this.item_list.push({ name: '要素' + this.item_list.length, value: this.item_list.length});
        }
        
        this.addItem = function() {
            this.item_list.push({ name: '要素' + this.item_list.length, value: this.item_list.length})
            console.log(this)
            this.update();
        }
      </item>
    </script>

    <script>
      var item = riot.mount('item')[0]
      item.addItem();
    </script>
  </body>

</html>

```

外部の関数をカスタムタグから呼び出す方法
-----

外部の関数は、通常の呼び出し方法で呼び出せます。
つまり、以下のような関数があった場合

```js
<script>
  function globalFunc(text) {
    console.log(text);
  }
</script>
```

カスタムタブの内部からも以下のコードで呼び出せます。

```js
globalFunc('test');
```
Google Playストアの詳細な説明文でHTMLタグを使う

[bowyer-app](https://github.com/bowyer-app)です。

Google Play Storeでは、詳細な説明文でHTMLタグ（実際のHTMLタグと少しだけ違う）が使えます。
説明文をリッチにすることで、ユーザーの目を引くと考えられます。
実際に、ストアの詳細な説明にHTMLタグを用いることによって、**ダウンロード数が向上した**と言うことを聞いたことがあります。

# 使えるタグについて
[Google Playストア上のHTMLタグについて](http://qiita.com/Sam/items/ac761c163c35a9f78862)
こちらの記事を参考にしてください。

# タグを使うにあたって注意すること
リッチにすればいいと言いますが、何でもかんでも装飾してしまっては可読性が落ちます。
また、実際に詳細な説明文を登録しても、実際にストアで見れるのは登録してから１時間かかってしまいます。
修正の反映にまた１時間かかるのはかなり面倒です。。。

# サポート出来るアプリを作りました！
そもそも、htmlタグを書くのも面倒だし、実機で確認するのに1時間待つのが嫌だったので
大まかでも確認出来るアプリを作りました。

![demo](https://raw.githubusercontent.com/bowyer-app/StorePreview/master/art/en/demo.gif)

オープンソースにて公開しています。
[StorePreview](https://github.com/bowyer-app/StorePreview)

タップで必要なタグを挿入出来るようにしてあります。
入力したタグはプレビューにてすぐに確認できるので、大まかな確認は大体これで大丈夫です。

fontに関しては、ColorPickerで色も指定出来るようにしておきました。

また、入力した文字はシェア出来るので、完成した文章はメールなどでPCに送ってストアに登録してください。

皆さんのストア最適化に少しでも役に立てればと思います。

気に入っていただければスターお願いします。
[StorePreview](https://github.com/bowyer-app/StorePreview)
GPSモジュール + Arduino の設定備忘録

#使用機器
+ GPSモジュール GYSFDMAXB
 - http://akizukidenshi.com/catalog/g/gK-09991/

+ Arduino Uno Rev3

#準備
とりあえず以下のPDFの, 外部機器との接続方法(マイコンと接続する場合)に従って接続

+ http://akizukidenshi.com/download/ds/akizuki/AE-GPS_manual_a.pdf

1PPSの, Arduinoへの接続先は, アナログ/デジタルピンならばどこでもよいから接続する.


以下のスケッチを書く(どこかのサイトからお借りしたが忘れてしまった. 思い出したら書く)

```
#include <SoftwareSerial.h>

SoftwareSerial g_gps( 6, 7 );

void setup()
{
  g_gps.begin(9600);
  Serial.begin( 9600 );
}

void loop()
{
  char c = g_gps.read();
  if( -1 != c )
  {
    Serial.print( c );
  }
}
```

+ SoftwareSerial g_gps(6,7)について
 - g_gpsはユーザー定義の関数, 6はRXピンに, 7はTXピンとして設定される
 - 参考　http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=120

#おわり
MiniGPSでも, GPSモジュールがArduinoに正しく接続できていれば動きます
[Swift] Enum(Associated Value)を利用して、処理を簡略化する

# はじめに
いまさらですが、SwiftのEnumは強力ですね。
その中のEnumのAssociated Valueについて、再度整理したいと思います。

## EnumのAssociated Valueとは？
型を問わず関連値を持つよう定義でき、
必要であれば列挙型のケースごとに異なる値の型にすることができます

実装イメージがつきづらいと思いますので、
Social frameworkの実装を例に
EnumのAssociated Valueを活用方法をご説明します。

[APIを利用した活用例は、こちら](http://qiita.com/eKushida/items/c8cf74fb390bc58388cf)

# サンプルコード

下記のenumは、
(String, UIImage?)型の関連値を持つTwitter の値、または 
(String, UIImage?)型の関連値を持つFacebook の値のいずれかを取ることができる
列挙型 SocialTypeを定義しています。

## ソーシャル投稿用のEnum
```:SocialType.swift
import Foundation
import Social

enum SocialType {

    case Twitter (text: String, image: UIImage?)
    case Facebook (text: String, image: UIImage?)

    func postText(viewController: UIViewController) {

        switch self {
        case let Twitter(text, _):
            postSocalKit(SLServiceTypeTwitter, viewController: viewController, text: text)
            break
        case let Facebook(text, _):
            postSocalKit(SLServiceTypeFacebook, viewController: viewController, text: text)
            break
        }
    }

    func postTextAndImage(viewController: UIViewController) {

        switch self {
        case let Twitter(text, image):
            postSocalKit(SLServiceTypeTwitter, viewController: viewController, text: text, image: image)
            break
        case let Facebook(text, image):
            postSocalKit(SLServiceTypeFacebook, viewController: viewController, text: text, image: image)
            break
        }
    }

    private func postSocalKit(forServiceType: String, viewController: UIViewController, text: String, image: UIImage? = nil) {

        let composeViewController = SLComposeViewController(forServiceType: forServiceType)
        composeViewController.setInitialText(text)
        composeViewController.addImage(image)
        viewController.presentViewController(composeViewController, animated: true, completion: nil)
    }
}
```

## 使用方法

```:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func didTapButton(sender: UIButton) {

        guard let image = UIImage(named: "image") else {
            return
        }

        SocialType.Facebook(text: "スマートデバイス・テクノロジー",
            image: image).postTextAndImage(self)
    }
}
```

## 参考記事
下記の記事を参考にさせて頂きました。
大変勉強になりました。

https://realm.io/jp/news/david-east-simplifying-login-swift-enums/
楽しい Swift クイズ (やや難)


## クイズ
下記の動作をする `Quiz` を実装してください。

```swift
let quiz = Quiz()
quiz.chameleon             // ❗️error: ambiguous use of 'chameleon'
quiz.chameleon as Int      // 1
quiz.chameleon as String   // "string"
quiz.chameleon as UIColor  // UIDeviceRGBColorSpace 0 1 0 1 (UIColor.greenColor())
```

## ヒント
下記のように書くと、一つめの条件が満たせません。

```
import UIKit

struct Quiz {
    var chameleon = "string"
}

let quiz = Quiz()
quiz.chameleon // "string"
```

```swift:一つめの条件
quiz.chameleon // ❗️error: ambiguous use of 'chameleon'
``` 
では、`chameleon ` はどこに？

## クイズ(おまけ)
下記の動作をする `Quiz` を実装してください。

```swift
let quiz = Quiz()
quiz.chameleon             // "string"
quiz.chameleon as Int      // 1
quiz.chameleon as String   // "string"
quiz.chameleon as UIColor  // UIDeviceRGBColorSpace 0 1 0 1 (UIColor.greenColor())
```

## 答えと解説
### 答え

```swift:クイズの答え
import UIKit

struct Quiz {}

protocol A {
    var chameleon: String { get }
}

extension A {
    var chameleon: String { return "string" }
}

protocol B {
    var chameleon: Int { get }
}

extension B {
    var chameleon: Int { return 1 }
}

protocol C {
    var chameleon: UIColor { get }
}

extension C {
    var chameleon: UIColor { return UIColor.greenColor() }
}

extension Quiz: A, B, C {}

let quiz = Quiz()
quiz.chameleon             // ❗️error: ambiguous use of 'chameleon'
quiz.chameleon as Int      // 1
quiz.chameleon as String   // "string"
quiz.chameleon as UIColor  // UIDeviceRGBColorSpace 0 1 0 1
```

```swift:クイズ(おまけ)の答え
import UIKit

struct Quiz {
    // ここを追加
    var chameleon = "string"
}

protocol A {
    var chameleon: String { get }
}

//  extension A {
//      var chameleon: String { return "string" }
//  }

protocol B {
    var chameleon: Int { get }
}

extension B {
    var chameleon: Int { return 1 }
}

protocol C {
    var chameleon: UIColor { get }
}

extension C {
    var chameleon: UIColor { return UIColor.greenColor() }
}

extension Quiz: A, B, C {}

let quiz = Quiz()
quiz.chameleon             // "string"
quiz.chameleon as Int      // 1
quiz.chameleon as String   // "string"
quiz.chameleon as UIColor  // UIDeviceRGBColorSpace 0 1 0 1
```
### 解説
protocol extension を利用して実装しました。
コードは少し長いですが、基本形は下記です。これを `chameleon ` が変身する各型のために定義します。

```swift
protocol A {
    var chameleon: String /* Int, UIColor, ... */ { get }
}
extension A {
    var chameleon: String /* Int, UIColor, ... */ { return "string" }
}
```

クイズ (おまけ) は、`Quiz ` のプロパティに `chameleon` を追加して完成です。

## 終わりに
[Twitter (@eduraaa)](https://twitter.com/eduraaa) や [gist (ezura)](https://gist.github.com/ezura) でちょくちょくコードの考察のようなものを書いています。今回はその中からクイズを出してみました。
お楽しみいただけると幸いです😄

[前回](http://qiita.com/ezura/items/d0f9e170a50062d7d104)
Git Large File Storageを使えるようにする

OS: Windows10

Git for Windows ( https://git-for-windows.github.io/ ) と 
Git Large File Storage ( https://git-lfs.github.com/ )をダウンロードしてインストールしておく

---

まずはGitの設定

```
$ git config user.name "[username]"
$ git config user.email "[hoge@mail]"
```

SSHキーを作成する

```
$ ssh-keygen
```
できたファイル```id_ira.pub```をエディタで開き、中身をコピーしてGithubのSSHに登録



Git LFSのインストール

```
$ git lfs install
```


例としてpsdファイルのトラック

```
$ git lfs track "*.psd"
```

addしてcommitしないとうまくいかないのでこれらを実行

```
$ git add [filename.psd]
$ git commit -m "[message]"
```

トラックできているかの確認

```
$ git lfs ls-files
// 指定ファイルがリストに出てくることを確認する
```

あとは普通にgitを使う
※たぶん上限は100.00MBなのでそれ以上のファイルはどのみち使えない
Windows10にVagrant 1.8.5をインストールする

[Link-Vagrant]:https://www.vagrantup.com/
[Link-Vagrant2]:https://www.vagrantup.com/downloads.html

# Vagrant 1.8.5のインストール

Windows10におけるVagrant 1.8.5のインストール手順を示す。

## Vagrant 1.8.5インストーラーのダウンロード

[Vagrant公式サイト][Link-Vagrant]へアクセスする。トップメニューから"Download"をクリックする。
![001_Vagrant公式トップ画面_ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/4247/2bfec455-60fa-6777-7b3a-c9a9ee3051f2.png)

[Vagrant公式サイト][Link-Vagrant2]から"WINDDOWS Universal (32 and 64-bit)"のリンクをクリックし、Vagrant 1.8.5インストーラをダウンロードする。
![002_Vagrant公式ダウンロード_ダウンロードリンク.png](https://qiita-image-store.s3.amazonaws.com/0/4247/ee0d34f3-ef62-9d8f-bdc1-b3927870a841.png)

## Vagrant 1.8.5インストーラーを実行する

ダウンロードしたVagrant 1.8.5インストーラ vagrant_1.8.5.msi を実行する。
![003_Vagrantダウンロードファイル.png](https://qiita-image-store.s3.amazonaws.com/0/4247/f6ae8441-f894-1c18-5cb1-8e18000fbe33.png)

[Next]をクリックする。
![004_Vagrantインストール.png](https://qiita-image-store.s3.amazonaws.com/0/4247/a2e7a93c-fa6b-3a46-a943-c718d8fd562f.png)

ライセンスへの同意文が表示される。内容を確認し、"I accept the terms in the License Agreement"の左にあるチェックボックスをオンにして[Next]をクリックする。
![005_Vagrantインストール.png](https://qiita-image-store.s3.amazonaws.com/0/4247/2b72c198-377f-6a44-093f-a7974bc465c1.png)

インストールパスが表示されるので、必要に応じて変更する。問題がなければ[Next]をクリックする。
![006_Vagrantインストール.png](https://qiita-image-store.s3.amazonaws.com/0/4247/1ad0c719-b6d7-efc5-30e1-1d06ef692fc6.png)

インストールの準備が完了したので[Install]をクリックし、インストールを開始する。
![007_Vagrantインストール.png](https://qiita-image-store.s3.amazonaws.com/0/4247/0a2abd80-701c-8e84-d432-0f61b2948a55.png)

インストールが行われるので、しばらく待つ。
![008_Vagrantインストール.png](https://qiita-image-store.s3.amazonaws.com/0/4247/95adac41-1f0a-2126-d511-d24b2e48f5ca.png)

インストールが完了する。[Finish]をしてインストーラーを終了する。
![009_Vagrantインストール.png](https://qiita-image-store.s3.amazonaws.com/0/4247/f771bf79-41ac-67c3-0c07-2569f89dea24.png)

最後にシステムの再起動が促されるので、再起動して問題なければ[Yes]をクリックし、Windowsを再起動する。[No]をクリックした場合は、再起動後にしかVagrantを使用できないようなので注意。
![010_Vagrantインストール.png](https://qiita-image-store.s3.amazonaws.com/0/4247/777a84ef-28e5-db5a-27ca-f5c3f0be6f8e.png)

以上でVirtualBox 1.8.5のインストールが完了した。

# Vagrant 1.8.5の動作確認

Vagrantはコマンドライン・プロンプトから使用する。

Windowsが再起動した後、以下のようにバージョン表示を行うオプションをつけた`vagrant`コマンドが動作するかどうかを確認する。

![011_Vagrantバージョン確認.png](https://qiita-image-store.s3.amazonaws.com/0/4247/aef44ed8-d36c-c601-b54e-b3c9f14be75d.png)

バージョンが表示され、問題なく動作することが確認できた。
zero-server maps 日本語版

# zero-server maps

2018年のふつうのウェブ地図

- **gh-pages** を使ってサーバ不要
- **mvt** と **tippecanoe** で高速軽量
- **Tangram** で素敵な可視化

---
# 例

- [地球地図日本 2.2](https://hfu.github.io/gmjp22vt) / [ソース](https://github.com/hfu/gmjp22vt)
- [地球地図米国 2.0](https://hfu.github.io/gmus20vt/) / [ソース](https://github.com/hfu/gmus20vt)
- [ユーログローバルマップ 8.0](https://hfu.github.io/gmeu80vt/) / [ソース](https://github.com/hfu/gmeu80vt)

---
# データ作成

"**ティピカヌー散開**" : データ作成のプロセスの名前

tippecanoe を使い、MVTデータを展開して静的リソースにする。

---
# ティピカヌー散開
1. Shapefile をダウンロード
2. ogr2ogr -f GeoJSON ...
3. tippecanoe ...
4. "散開"

---

# ティピカヌー散開
ステップ 1. は /vt$/ なしの他レポジトリ (例 hfu/gmjp22vt は hfu/gmjp22vt) で
ステップ 2. と 3. は各レポジトリの \_\_convert\_\_.rb で
ステップ 4. は各レポジトリの \_\_fan\_out\_\_.rb で

---

## 散開?
- MVT ファイルをレポジトリに展開する
- 次のスライドの Ruby スクリプトで。

---
```ruby:__fan_out__.rb
#...
Dir.glob('*.mbtiles') {|fn|
  Sequel.sqlite(fn)[:tiles].each {|r|
    #...
    File.open("#{t}/#{z}/#{x}/#{y}.mvt", 'w') {|w|
      w.print Zlib::GzipReader.
        new(StringIO.new(data)).read
}}}
```

---
# TODO

- [ ] improve attribution (see LICENSE for the time being)
- [ ] improve scene.yaml (need love for data)
- [ ] work on more Global Map data
zero-server maps

# zero-server maps

commonplace web maps for 2018

- no server required, by **gh-pages**
- fast and small by **mvt** and **tippecanoe**
- neat visualization by **Tangram**

---
# examples

- [Global Map Japan 2.2](https://hfu.github.io/gmjp22vt) / [source](https://github.com/hfu/gmjp22vt)
- [Global Map USA 2.0](https://hfu.github.io/gmus20vt/) / [source](https://github.com/hfu/gmus20vt)
- [EuroGlobalMap 8.0](https://hfu.github.io/gmeu80vt/) / [source](https://github.com/hfu/gmeu80vt)

---
# data development

"**tippecanoe-fan-out**" : the name of the process to develop the data.

use tippecanoe, and then extract the MVT data to make them static.

---
# tippecanoe-fan-out
1. Download the Shapefile
2. ogr2ogr -f GeoJSON ...
3. tippecanoe ...
4. "fan out"

---

# tippecanoe-fan-out
Step 1. is done in other repos without /vt$/ (e.g. hfu/gmjp22 for hfu/gmjp22vt)
Step 2. and 3. are in \_\_convert\_\_.rb in each repo.
Step 4. is in \_\_fan\_out\_\_.rb in each repo.

---

## fan out?
- To extract the MVT files to the repo.
- By the Ruby script on the next slide.

---
```ruby:__fan_out__.rb
#...
Dir.glob('*.mbtiles') {|fn|
  Sequel.sqlite(fn)[:tiles].each {|r|
    #...
    File.open("#{t}/#{z}/#{x}/#{y}.mvt", 'w') {|w|
      w.print Zlib::GzipReader.
        new(StringIO.new(data)).read
}}}
```

---
# TODO

- [ ] improve attribution (see LICENSE for the time being)
- [ ] improve scene.yaml (need love for data)
- [ ] work on more Global Map data
直線位置調整 > P型MOSFET試用 > 1.5V出力に失敗

```txt:動作環境
ESP-WROOM-02 ユニバーサル基板実装 (以下ESP8266)
Analog Disocvery 2 (以下AD2)
```

関連 http://qiita.com/7of9/items/0256996d9cf94fd2abc8

S-12用の電源として1.5V 1AをON/OFFしようとしている。
リレーではESP8266のGPIOの出力電流が170mAは無理なのでMOSFETを調べ始めた。

## P型MOSFET

MOSFETはまだよくわからないが、P型MOSFETを買ってみた。

2SJ681
http://akizukidenshi.com/catalog/g/gI-08358/

MOSFETをON/OFFするための電圧はVSGと思っていたが、実際にはVthという値でthはthresholdの略のようだ。

VSGは印加電圧の方でsource-gate間電圧のようだ。

2SJ681のVthは-0.8Vから-2.0V。この部分を理解してなかった。

## 回路図

[きむ茶工房ガレージハウス](http://www.geocities.jp/zattouka/GarageHouse/micon/circuit/FET.htm)さんの「Ｐ型ＦＥＴの接続回路」を真似した。

R1, R2の抵抗は1.1kとした。

Vccの値をS-12駆動用の1.5Vとした。ESP8266の電源にはCR123A(3V)を使っている。
この時点で間違いを生じていることは後で気づいた。

## code

以下のcodeをそのまま利用。
http://qiita.com/7of9/items/6bcce4bf70154d89c4b5

3.3secおきに300msecGPIO14のピンがHになる。

## 結果

AD2で波形を見た。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6973024a-0c38-7254-47bb-109a255d74a8.png)

3.3秒おきに画像のような振れが見えるが、1.5Vが立つことはない。

## 間違った点

2SJ681のVthが-0.8Vから-2.0Vという部分を理解してなかった。

ESP8266のGPIOは3V立つのにマイナスとは？という疑問があった。

以下のように理解した。

MOSFETにかける電圧はVSG, source-gate間電圧である。sourceを基準としたgateの電圧、と見てみる。

VSGに関して、sourceにはVccの電圧がかかっている。Vccは今回1.5Vを使用。
GPIO14をH/Lした時、Lの時はgate電圧は0V(に近い値)になり、Vccは1.5Vなので、VSGは-1.5Vとなる。
2SJ681のVthは-0.8Vから2.0Vなので、VSGが-1.5Vではうまく動かなく、今回の結果となっている。

## Vccを変えてみる

### Vcc=2.5V

AD2にはSuppliesという機能により任意の電圧を出力することができる。これにより、Vccの値を1.5V以外で試してみた。

Vccを2.5Vにした場合、GPIO14がL時にVSGは-2.5Vとなる。Vthの範囲を超えてMOSFETが動作するはず。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/259dc417-fb5e-9747-4f29-e9b2162c8170.png)

通常は2Vが出力され、3.3secごとに300msec間0Vとなる。想定した動作に近いが、Vccを2.5Vにしているのに2Vまでなのが未消化。

### Vcc=3V

Vccを3Vにしてみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/30d13659-864c-e8e0-4299-6f818c589a67.png)

通常は3Vが立って、GPIO14がHレベルの時に0Vになっている。

こちらは想定した通りの動作となった。

## TODO

今回使用したP型MOSFET 2SJ681ではVthが-0.8Vから-2.0Vである。この場合、Vccに1.5Vとした場合に正常に動かないことを理解した。

N型MOSFETにするとVcc(1.5V)に関係なく、GPIO14の電圧がVthを超えることで、動作するのだろうか。とりあえずN型MOSFETを買ってみる。

あるいは、GPIO14の出力を正負逆転するようにする、というのも可能かもしれない。
インバーター用ICを使うことになるだろうか。
http://akizukidenshi.com/catalog/g/gI-10588/

OPアンプで反転増幅回路、増幅率1としたら、手持ちで試せるだろうか。
Meteorでi18nパッケージを使う

# 概要
[![English](https://img.shields.io/badge/English-here-lightgrey.svg?style=flat)](https://www.jkawamoto.info/blogs/i18n-package-in-meteor/)
[Meteor](https://www.meteor.com/) を使った Web アプリケーションを国際化 (i18n) する際の備忘録．
[universe:i18n](https://atmospherejs.com/universe/i18n) パッケージの使い方をまとめる．

# universe:i18n
[Atmosphere](https://atmospherejs.com) に登録されている国際化パッケージの一つ．
サポートしているロケールの一覧は，[ここ](https://github.com/vazco/meteor-universe-i18n/blob/master/lib/locales.js)から確認できる．
また，JSON または YAML で翻訳対応表を渡すことができる．

インストールには，次のコマンドを実行する．

```sh
$ meteor add universe:i18n
```

インポートは，必要なスクリプトファイルで

```js
import i18n from "meteor/universe:i18n";
```

とすれば良い．

## 翻訳語の登録
翻訳対応表はファイルで与えることもできるが，API を使って個別に登録することもできる．

```js
i18n.addTranslation("ロケール", "名前空間", "キーワード", "語");
```

の形式で登録できる．

## 翻訳語ファイル
前節の様に個別に `i18n.addTranslation` 関数を使って登録するのは手間なので，
ファイルで与えることができる．
翻訳語のファイルは JSON か YAML に対応しており，
ファイル名がそれぞれ `.i18n.json` または `.i18n.yml` で終わる必要がある．
ここでは，YAML 形式を使うことにする．

翻訳ファイルは単純なキー・バリューの組み合わせを列挙する．

```ja.i18n.yml
ok: 決定
cancel: キャンセル
```

また，`_namespace` 属性を使って各ファイルが属する名前空間を指定できる．

```ja.i18n.yml
_namespace: ui
ok: 決定
cancel: キャンセル
```

各翻訳ファイルがどのロケール用のものか示すには，
ファイルのパスにロケールを含めるか，`_locale` 要素を与えるか二通りの方法がある．
ファイルを開かなければ分からない `_locale` 要素よりは，ファイルのパスを使う方が良いだろう．

ファイルパスは，

- `en-us.i18n.yml`
- `en-us/someName.i18n.yml`

などの形式がサポートされている．
これらのファイルは，`imports` 以外に置いておけば自動でインポートされる．

## 翻訳語の取得
キーワードに対応する翻訳語を取得するには，
`i18n.__(namespace, key)` メソッドを使う．

```js
i18n.__("ui", "ok"); // -> 決定
```

## ロケールの設定・変更
ロケールの設定・変更には，`i18n.setLocale(locale)` メソッドを使う．
このメソッドは，非同期で翻訳データを取得する．
`i18n.setLocale` は `Promise` を返すので，`.then` を使って新しいロケールを使った操作を行える．

# Angular-Meteor での利用
[Angular-Meteor](http://www.angular-meteor.com/) で利用する場合，
`i18n.getTranslation` メソッドをスコープに登録してテンプレートで利用する．
例えば，

```js
class AppCtrl {

  constructor() {
    this.translator = i18n.getTranslation;
  }

}
```

というコントローラを用意すれば，テンプレート側では，

```html
<md-button ng-click="$ctrl.onNext()" aria-label="$ctrl.translator('ui', 'ok')">
  {{$ctrl.translator("button", "start")}}
</md-button>
```

と利用できる．ロケールが変更されるたびに表示を変えるためには，

```js
const setLocalePromise = i18n.setLocale(locale) || i18n.setLocale("en");
setLocalePromise.then(() => {
  this.translator = i18n.getTranslation;
});
```

などとすれば良い．（上の例はロケールが見つからない場合に英語を設定している）

ただし，UI イベント以外の原因で `setLocale` を呼んだ場合（例えばコンストラクタ内など）
DOM の更新は行われない．
この場合は，`$scope.$apply()` を使う必要がある．

```js
constructor($scope) {

  const setLocalePromise = i18n.setLocale(getLang()) || i18n.setLocale("en");
  setLocalePromise.then(() => {
    $scope.$apply(() => {
      this.translator = i18n.getTranslation;
    });
  });

}
```

詳細は，[AngularJS and scope.$apply（日本語訳）](http://qiita.com/akkun_choi/items/22048f31f9add7fda2c5)を参考のこと．

# まとめ
Meteor 用国際化パッケージ [universe:i18n](https://atmospherejs.com/universe/i18n) の最低限の使い方をまとめた．
今回紹介していない API もあるので，[オリジナルのドキュメント](https://github.com/vazco/meteor-universe-i18n)も参考にされたい．
RaspberryPiのCPU情報をPythonで取得する

#開発環境
|HD|RaspberryPi B+|
|:------:|:-------:|
|OS|Raspbian GNU/Linux 8.0 (jessie)|
|Python|ver 2.7.9|

# 動機
RaspberyPi には`vcgencmd commands`という、RaspberyPiの内部情報を取得してくれる簡単なコマンドがあります。

[RPI vcgencmd usage](http://elinux.org/RPI_vcgencmd_usage)

|RPI vcgencmd commands|Means|
|:------:|:-------:|
|vcgencmd measure_temp|CPU温度|
|vcgencmd measure_clock arm|PythonCPU周波数|
|vcgencmd measure_voltsp|電圧取得|
|vcgencmd get_mem arm|CPU(arm)メモリ使用量|
|vcgencmd get_mem gpu|GPU(gpu)メモリ使用量|





以前はこれを`shell`で書いていたのですが、Pythonの方が後々のグラフ作図と相性がいいので、Pythonで外部コマンドを実行できるように書いてしまおうと、言う感じで始めました。

# ソースコード

```py
#!/usr/bin/env python$
#coding:utf-8$

#ライブラリをインポートしてくる。$
import os
import commands

#Raspbianの制御コマンド（vcgencmd）を実行$

#温度を取得するRPiコマンド
temp = commands.getoutput("vcgencmd measure_temp").split('=')
print temp[1]

#CPU周波数を取得
clock=commands.getoutput("vcgencmd measure_clock arm").split('=')
print clock[1]

#電圧を取得
volt=commands.getoutput("vcgencmd measure_volts").split('=')
print volt[1]

#CPU(arm),GPUのメモリ使用量
arm=commands.getoutput("vcgencmd get_mem arm").split('=')
print arm[1]

gpu=commands.getoutput("vcgencmd get_mem gpu").split('=')
print gpu[1]
```

実行結果

```
38.5'C
700000000
1.2000V
448M
64M
```
# ソースコード解説

外部コマンドをPythonから実行するのが**getoutput()**です。getoutput()は、コマンドを実行した結果のみを返します。getoutput()を使用する場合はcommandsモジュールをimportしてきて下さい。

```py
import commands
commands.getoutput('ls')

```
**str.split(sep)**はsepを区切り文字として、単語を分割してリストにするメソッドです。区切り文字が指定されない場合は、スペース、タブ、改行文字列で分割される特殊なルールになる事があります。
今回の場合は`=`で区切っています。理由はsplitを使わないで実行すると

```py
temp = commands.getoutput("vcgencmd measure_temp")
print temp
```

実行結果

```
temp=37.9'C
```
今回、グラフで使用する場合、使いたいのは数値だけなのでtempは余計です。
`split('=')`で文字を区切ります。

```py
temp = commands.getoutput("vcgencmd measure_temp").split('=')
print temp
```

実行結果

```
['temp', "38.5'C"]
```

この様にリストとして区別してくれるので、後は添字を指定して数値部分だけ、抜き出して表示します。尚、この時区切られた後の値は**str型**なので数値として扱う場合は**int()**で文字列を数値に変換して下さい。

```py
temp = commands.getoutput("vcgencmd measure_temp").split('=')
temp_i = int(temp[1])
```


# 参考資料
>
[RaspberryPi(Raspbian)のCPUの温度をcatを使わないで取得してみた](http://qiita.com/neipia2/items/5f3f0e6fdb55e7164deb)
[pythonで外部のシェルスクリプトやコマンドを実行する方法](http://qiita.com/ritukiii/items/60a3ac4734fc52748cee)
[文字列の分割・結合 split, join,rsplit](http://python.civic-apps.com/string-split-join/)
技術英語 > GM's decision to [pull the plug on] the EV1.

@ LOE > August 1, 2003

http://www.loe.org/shows/shows.html?programID=03-P13-00031
>GM's decision to pull the plug on the EV1.

http://ejje.weblio.jp/content/pull+the+plug+on
> …を突然中止する、…の生命維持装置をはずす

plugは電源プラグなどのことで、それをpullする、から転じて「中止する」。

電気自動車の話でpull the plugとしているのは電源コードを抜く、とかけているのだろうか。
Ext.data.field.* の Conversion と Serialization について

Ext JS の Ext.data.field.* の Conversion と Serialization についてメモっとく。モデルに何となく追加しているフィールドの動作を理解するのに重要なんではないかと。

# 継承ツリー

Ext.data.field.* の継承ツリーを掲載しとく。標準で用意されているフィールドの型は多くないが必要十分という感じ。特筆すべき点は Number が Integer を継承していることくらいかな。

![Ext.data.field.* の継承ツリー](http://www.plantuml.com/plantuml/img/Iyv9B2vMSAqeqNDAB4xbIePpKn9B4lNICbDpKlJSGAH2QaL9QbuA8RLE-VavgObvAAhHZSAkqoMn99KCRPvv9QdfgKLawFGhpKt2hH5gBdQjmIL5cNdfUEq40000)

# フィールドの型一覧

フィールドの型を表にまとめておく。`type` は Ext.data.Model でフィールドの型を指定するときに設定する値。`convert` は Ext.data.Model.set でフィールドに値を設定するときの変換で使用される関数の処理内容。`serialize` は Ext.data.Model.getData でフィールドの値を取得するときの変換で使用される関数の処理内容。

ちなみに `convert` と `serialize` は Ext.data.Model でフィールドを設定するときに上書きできる。

<table>
<tr><th>クラス</th><th>説明</th><th>type</th><th>convert</th><th>serialize</th></tr>
<tr><td>Field</td><td>型なし値のフィールド</td><td>auto</td><td>なし</td><td>なし</td></tr>
<tr><td>Boolean</td><td>真偽値のフィールド</td><td>bool</td><td>true・yes・on・1であれば true、そうでなければ false の真偽値（Boolean 型）に変換する。</td><td>なし</td></tr>
<tr><td>Date</td><td>日付値のフィールド</td><td>date</td><td> dateReadFormat か dateFormat があれば Ext.Date.parse で、なければ Date.parse で日付値（Date オブジェクト）に変換する。</td><td>dateWriteFormat か dateFormat があればそのフォーマット、なければ timestamp フォーマットを指定した Ext.Date.format で文字列値（String 型）に変換する。</td></tr>
<tr><td>Integer</td><td>整数値のフィールド</td><td>int</td><td>parseInt で整数値（Number 型の整数値）に変換する。</td><td>なし</td></tr>
<tr><td>Number</td><td>実数値のフィールド</td><td>float</td><td>parseFloat で実数値（Number 型の実数値）に変換する。</td><td>なし</td></tr>
<tr><td>String</td><td>文字列値のフィールド</td><td>string</td><td>String で文字列値（String 型）に変換する。</td><td>なし</td></tr>
</table>

# ほかのフィールドから計算されるフィールド

Ext.data.Model でフィールドを設定するときに `convert` と `serialize` 以外に `calculate` を設定できる。下記のように `calculate` はほかのフィールドから計算できるフィールドを作成するときに利用する。

```js
Ext.define('Author', {
    extend: 'Ext.data.Model',
    fields: [
        {
            type: 'string',
            name: 'firstName'
        },
        {
            type: 'string',
            name: 'lastName'
        },
        {
            type: 'string',
            name: 'fullName',
            calculate: function(data) {
                return data.firstName + ' ' + data.lastName;
            }
        }
    ]
});
```

`convert` でも同様のことができるが、その場合は依存関係を指定する必要がある。`calculate` は依存するフィールドを `calculate` に指定した関数のソースコードから自動的に判断してくれる点で便利だ。ただ正規表現でパターンマッチして判断しているだけであることは頭の片隅に置いておこう。具体的な正規表現のパターンは Ext.data.field.Field のソースコードを参照してほしい。

# フィールドのカスタム型

念のため書いておくと Ext.data.field.* を継承することでカスタム型を作成できる。単純な型は Ext.data.field.Boolean あたりのソースを参考に、複雑な型は Ext.data.field.Date あたりのソースを参考に実装すればいいと思う。なおカスタム型にはバリデーターを付与することもできる。
IntelliJ IDEAでMavenを使ったら、auto-importとreimportでハマった件

#どうなってんだ！？？
IntellJ初心者で、Springの練習をしています。
Springって"Getting Started"が充実していて、『15分でできる初めての…』をいじって遊んでいたら、急に動かなくなった。

はて…

なんか、新しく使いたいライブラリをMavenのpomファイルに書いたり消したりしていたらだぞ？？

なんと、IntellJ IDEAでは、
　・auto-importモード　→　間違えたバージョンのライブラリをimportする（おーい！）
　・re-import　→　さっき痛い目みてauto-importのチェックボックスのチェック外したら、今度は手動でpomへの変更を反映させなきゃいけない

みたい。慣れないからコントロールできないよ。とほほ。
Pythonがここまで認知されるようになった。

Interface 2016年10月号（8月25日発売）
[コンピュータ選び放題！ライブラリ使い放題！Python](http://www.kumikomi.net/interface/contents/201610.php)

![表紙](http://shop.cqpub.co.jp/hanbai/books/MIF/MIF201610l.jpg)
http://www.kumikomi.net/interface/contents/next_issue.php


番外編
[小林さんちのメイドラゴンで出てきたコード（小林さんを探せ！）](http://qiita.com/ygkn/items/6b3be1afa31e4092826e)