OmniAICreator/Qiita-1.07M huggingface dataset:
iTerm2の導入と初期設定

# iTerm2とは

Mac OSで動作するターミナルエミュレータです。
標準のターミナルと比べると細かくカスタマイズできたり、いろんな機能が備わっていたりします。

# 今使用しているバージョン

2.1.4

# ダウンロード

http://www.iterm2.com

ダウンロードしたiTerm2が最新版かどうかはメニューのiTerm2 -> Check For Update...で確認することができます。

# 主なショートカット

* command + d

左右に画面分割

* command + [ or ]

分割した画面間の移動

* command + shift + d

上下に画面分割

* command + w or 「exit」

分割した画面を閉じる

* command + t

タブの生成

* command + ← or →

タブ間の移動

* command + +

オートコンプリート

* command + n

新しいウィンドウを開く

* command + Enter

全画面表示の切り替え


上記のことからこんなかんじに画面分割ができるから便利
![スクリーンショット 2015-11-23 17.36.24.png](https://qiita-image-store.s3.amazonaws.com/0/100736/6d8550bd-1e5c-50d4-d434-fc8a39d6b68a.png)


# カスタマイズ

* 透過させる
Preferences -> Profiles -> Window -> Transparencyで変えることができます。

![スクリーンショット 2015-11-23 17.17.02.png](https://qiita-image-store.s3.amazonaws.com/0/100736/31224e00-7278-9bc8-1132-0d094d24d99d.png)

![スクリーンショット 2015-11-23 17.42.12.png](https://qiita-image-store.s3.amazonaws.com/0/100736/c8dbd1ce-fd75-6df0-2881-3980cb98a5b6.png)

* ビープ音とフラッシュを消す

Preferences -> Profiles -> Terminal -> Notifications -> Silence bellにチェックをつける。

![スクリーンショット 2015-11-23 17.55.40.png](https://qiita-image-store.s3.amazonaws.com/0/100736/9d167905-71f8-501f-ebb4-5dea616ed040.png)


# 参考記事

https://codeiq.jp/magazine/2014/01/5143/
MLBの野球データのライセンスについて(MLBAM)

# MLBAM(MLB Advanced Media)配信の公式データのライセンスについて

結論から言うと、

* 非商用利用さえしなければ、個人で使うのはOKだよ（ま、マジか！）
* 個人以外の利用（法人とか？）での利用はちゃんとMLBAM(MLB Advanced Media)の許可を得てね

個人での利用はアリだそうです、どうりでRやPythonでライブラリが出ている訳ですね！

参考までにMLBAMが出しているコピーライトの原文と訳を載せますね。

## 原文

リンク：http://gd2.mlb.com/components/copyright.txt

```
The accounts, descriptions, data and presentation in the referring page (the "Materials") are proprietary content of MLB Advanced Media, L.P ("MLBAM").  
Only individual, non-commercial, non-bulk use of the Materials is permitted and any other use of the Materials is prohibited without prior written authorization from MLBAM.  
Authorized users of the Materials are prohibited from using the Materials in any commercial manner other than as expressly authorized by MLBAM.
```

## 訳

Google翻訳などでざっくり翻訳後、文面をいじっています。

意見ツッコミなどあればよろしくお願いします（特に最後の文が自信ない）。

```
当ページ(http://gd2.mlb.com/components/)内のアカウント、解説、データおよびプレゼンテーション（以下、「素材」と称す）はMLB Advanced Media社（以下、「MLBAM」）のコンテンツです。

この素材は、非商用および、ノン・バルク（？？？）での利用に限り、個人での利用が許可されますが、それ以外での利用はMLBAMの書面による事前の許可なしには禁止されています。

承認されたユーザーは、MLBAMが承認した以外での商用利用（書面にない使い方、再頒布とか？）は禁止されています。
```
C++言語でディレクトリ内のファイル一覧取得(windows編)

C++言語でよくディレクトリ内のファイルを取得したいことがあるのでまとめてみました．ファイルの一覧の取得，拡張子を指定して取得について実装例をもとに解説をしていきたいと考えています．

1. ディレクト内のファイルの一覧の取得
1. 拡張子を考慮したディレクトリ内のファイルの一覧の取得

## 拡張子を考慮したディレクト内のファイルの一覧の取得

```cpp
#include <Windows.h>
#include <vector>
#include <string>
#include <stdexcept>
std::vector<std::string> get_file_path_in_dir(const std::string& dir_name , const std::string& extension) noexcept(false)
{
	HANDLE hFind;
	WIN32_FIND_DATA win32fd;//defined at Windwos.h
	std::vector<std::string> file_names;

	//拡張子の設定
	std::string search_name = dir_name + "\\*." + extension;

	hFind = FindFirstFile( search_name.c_str() , &win32fd);

	if (hFind == INVALID_HANDLE_VALUE) {
		throw std::runtime_error("file not found");
	}

	do {
		if ( win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {
		}
		else {
			file_names.push_back(win32fd.cFileName);
			printf("%s\n", file_names.back().c_str() );

		}
	} while (FindNextFile(hFind, &win32fd));

	FindClose(hFind);

	return file_names;
}
```

　基本的には```FindFirstFile```で指定したディレクトリの調査を行います．```win32fd.cFileName```で探索したファイル名の取得を行い（ファイル名のみ），```FindNextFile```で次のファイルへと行きます．そして，最後に```FindClose```をして終了です．

**注意事項**
- ファイル名はワイルドカードで指定(C:\\\\\*.\*)する．

**参考にしたサイト**
http://d.hatena.ne.jp/s-kita/20100129/1264776052
Docker の未使用コンテナとイメージを削除

Docker で未使用のコンテナとイメージを削除するありがちなスクリプトです。

なんかいっつもやり方を忘れるのでシェルスクリプトでまとめたのですが、それすらどこに置いたか忘れがちなので自分用にメモしておきます。

```
#!/bin/bash
nonuse=`echo $(docker ps -aq | awk 'END{print NR}')`
if [ $nonuse != '0' ] ; then
  docker rm `docker ps -aq`
fi
noneimage=`echo $(docker images | awk '/^<none>/' | awk 'END{print NR}')`
if [ $noneimage != '0' ] ; then
  docker rmi $(docker images | awk '/^<none>/ { print $3 }')
fi
```

開発中は古いイメージがどんどん溜まっていくのでこういったスクリプトで一気に消してスッキリしましょう。
サブネットマスクの説明が意味不明な人向け

# サブネットマスクの説明が意味不明
2進数がうんたらかんたら、、、
10進数がうんたらかんたら、、、


# これなら理解できたサブネットマスクの説明
とりあえず、概念と仕組みの触りだけ理解できればいい人は、以下のサイトの説明を押さえておけばいいと思います。

[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 | サブネットマスク](http://wa3.i-3-i.info/word11975.html)
肥大化してしまったdockerコンテナのログを消し去る方法

結論
------------

```
cat /dev/null > /var/lib/docker/containers/${container_id}/${container_id}-json.log
```

/dev/null を流し込む

状況
---------------

dockerコンテナを運用するときに、たとえばログをホストに受け渡すために標準出力を利用することがある。`docker logs`でログが見られるようになるので便利なのだが、このログ、デフォルトでは永遠に肥大化し続けるので、だんだんディスクを圧迫してしまう。

これをお掃除しようと思った時、このファイルはホスト側の`/var/lib/docker/containers`以下に有るのだが、それ以外にコンテナ側からも参照されているため、rmコマンドで上記のパスを削除しても開放されない。そこで手っ取り早く /dev/null を流し込むのが楽。

max-size
-----------

ちなみにv1.9現在、json-fileログドライバーにはmax-sizeオプションがあるので、これを設定できる環境ではしておくのが正しい対策では有る(<https://docs.docker.com/engine/reference/logging/overview/>)。
GitHubのリポジトリを自分のPCにcloneする

公開されているリポジトリは自分のPCにclone(svnでいうとcheckout)ができます。

##clone URLの種類
- HTTPS
- SSH
- Subversion

の３種類があります。

##clone URLの確認
リポジトリのトップ画面「https\://github.com/ユーザー名/リポジトリ名」にURLとそのURLをPCのクリップボードにコピーをしてくれるボタンがあります。

##cloneする
コマンドを実行すると現在のディレクトリにリポジトリの名前のディレクトリを作成してその下にソースコードが配置されるので、ソースコードを置きたいディレクトリに移動後、コマンドを実行してください。
今回はSSH URLを使用します。

```
$ git clone #GitHubのSSH URL#
Cloning into 'Hello-World'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
Checking connectivity... done.
```
CentOSインストール

#VagrantでCentOSインストール

```
vagrant box add CentOS67 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box

mkdir centos
cd centos
vagrant init CentOS67
```

```
vagrant ssh

vi /etc/selinux/config
---
SELINUX=disabled
---

useradd -g ${username1} ${username1}
passwd ${username1}

useradd -g ${ansibleuser} ${ansibleuser}
passwd ${ansibleuser}

/etc/rc.d/init.d/iptables stop 
/etc/rc.d/init.d/ip6tables stop 
chkconfig iptables off 
chkconfig ip6tables off 

yum -y install man
yum -y groupinstall "Japanese Support"
yum -y install sysstat
yum -y install zip
yum -y install telnet
yum -y install lsof
yum -y install tcpdump
yum -y install strace
yum -y install dstat
yum -y install sshpass
yum -y install rpm-build
yum -y install bind-utils
yum -y install wget
yum -y install nc
yum -y install ntp
yum -y install bzip2
yum -y install net-snmp net-snmp-utils

chkconfig ntpd on


cat <<EOF > /etc/sysconfig/i18n 
LANG="ja_JP.UTF-8"
SYSFONT="lat0-sun16"
EOF
cat /etc/sysconfig/i18n

\cp /usr/share/zoneinfo/Japan /etc/localtime

cat <<EOF2 >/etc/sysconfig/clock
ZONE="Asia/Tokyo"
EOF2
cat /etc/sysconfig/clock

echo -e "${username1}\tALL=(ALL)\tALL" > /etc/sudoers.d/${username1}
chmod 440 /etc/sudoers.d/${username1}

yum update

passwd root
shutdown -h now



// /vargrant マウント失敗対応
sudo /etc/rc.d/init.d/vboxadd setup
AppDelegateのメソッドが呼ばれるタイミング


```swift:AppDelegate
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

	var window: UIWindow?
	
	func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {return true}

	func applicationWillResignActive(application: UIApplication) {}

	func applicationDidEnterBackground(application: UIApplication) {}

	func applicationWillEnterForeground(application: UIApplication) {}

	func applicationDidBecomeActive(application: UIApplication) {}

	func applicationWillTerminate(application: UIApplication) {}
}
```
## 起動時
application
applicationDidBecomeActive

## 終了直前
applicationWillResignActive

## 終了時
applicationDidEnterBackground

## 復帰直前
applicationWillEnterForeground

## 復帰時
applicationDidBecomeActive

## kill時
applicationWillTerminate
ssh-copy-idで渡す公開鍵を指定

## 参考

* [ssh-copy-idで公開鍵を渡す - Qiita](http://qiita.com/kentarosasaki/items/aa319e735a0b9660f1f0)

## 準備

* ~/.ssh/key_home/id_rsa.pub
* ~/.ssh/key_work/id_rsa.pub
* ~/.ssh/key_mobile/id_rsa.pub

## 一番簡単なやりかた

```bash:
ln -s ~/.ssh/key_home/id_rsa.pub ~/.pub
ssh-copy-id $@
```

## 公開鍵を渡す

```bash:~/.ssh/bin/ssh-copy-id-home
ssh-copy-id -i ~/.ssh/key_home/id_rsa.pub $@
```

```bash:~/.ssh/bin/ssh-copy-id-work
ssh-copy-id -i ~/.ssh/key_work/id_rsa.pub $@
```

```bash:~/.ssh/bin/ssh-copy-id-mobile
ssh-copy-id -i ~/.ssh/key_mobile/id_rsa.pub $@
```

## 複数公開鍵を渡す

```bash:
cat ~/.ssh/key_home/id_rsa.pub \
    ~/.ssh/key_mobile/id_rsa.pub \
    >> ~/.ssh/key_home/id_rsa.pub.all

ssh-copy-id -i ~/.ssh/key_work/id_rsa.pub.all $@
```

これで以下の公開鍵が一気に渡せる。(-i複数指定でもよい。)

* ~/.ssh/key_home/id_rsa.pub
* ~/.ssh/key_mobile/id_rsa.pub
GitHubに公開鍵を登録する

GitHubでは作成したリポジトリへのアクセス認証をSSHを利用した公開鍵認証で行います。

##SSH Keyの作成
次のように実行します。

```
$ ssh-keygen -t rsa -C "#メールアドレス#"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/xxxx/.ssh/id_rsa):#Enterを押す#
Created directory '/c/Users/xxxx/.ssh'.
Enter passphrase (empty for no passphrase):#パスワードを入力#
Enter same passphrase again:#再度パスワードを入力#
Your identification has been saved in /c/Users/xxxx/.ssh/id_rsa.
Your public key has been saved in /c/Users/xxxx/.ssh/id_rsa.pub.
The key fingerprint is:
#フィンガープリント# inakadegaebal@gmail.com
The key's randomart image is:
略
```

「C:\Users\ユーザー名\\.ssh」フォルダーに

- id_rsa
- id_rsa.pub

というファイルが生成されます。ファイル名からわかるように、拡張子がpubになっているのが公開鍵、そうではないファイルが秘密鍵になります。

##公開鍵の登録
GitHubの「Personal Settion」→「SSH Keys」から登録ができます。画面のボタンやリンク先の位置などはいつ変わるかわからないので書かないようにします。すぐ見つかると思います。
登録画面で「Title」欄にはユーザーが識別しやすいように名前を付けるだけなので何かわかりやすい名前を付けましょう。「Key」欄には生成した公開鍵を入れましょう。「id_rsa.pub」の内容をそのままコピペすれば大丈夫です。

##確認
公開鍵の登録が終わったら、GitHubとの認証と通信ができるようになったか確認してみましょう。

```
$ ssh -T git@github.com
The authenticity of host 'github.com (192.30.252.130)' can't be established.
RSA key fingerprint is #フィンガープリント#.
Are you sure you want to continue connecting (yes/no)? #yesを入力#
Warning: Permanently added 'github.com,192.30.252.130' (RSA) to the list of known hosts.
Enter passphrase for key '/c/Users/JEONG/.ssh/id_rsa':#パスワードを入力#
```
次のようなメッセージが表示されれば成功です。

```
Hi inakadegaebal! You've successfully authenticated, but GitHub does not provide shell access.
```
SwiftのDictionaryに殺される

Objc時代からある「Dictionaryにnilを代入すると、その要素が削除される」というふるまいがSwiftのOptionalと合わさるとだいぶ直感的でない気がする。

## nil代入で要素が削除される

これはまあ、わかる(そういうもの、という認識)

```swift
// nil代入で配列から要素を削除する
var dict: [String: String] = [
  "apple": "red",
  "banana": "yellow",
  "peach": "pink",
]

print(dict) // -> "[banana: yellow, apple: red, peach: pink]"

dict["banana"] = nil

print(dict) // -> "[apple: red, peach: pink]"
```

## 非Optionalな型をもつDictionaryの定義時にOptional型の変数を入れられない

これもまあ、わかる(型違うし)

```swift

var firstName: String = "Steven"
var middleName: String? = "Paul" // <- middleNameはoptional
var lastName: String = "Jobs"

var dict: [String: String] = [ // -> '[String: String?]' is not convertible to '[String: String]'
  "firstName": firstName,
  "middleName": middleName,
  "lastName": lastName,
]
```

## 定義時には入れられないけど、後からなら入れられる

"nil代入で削除されるので正しい"と"非Optionalな型にOptionalな値を入れようとするとコンパイルエラー"がぶつかってて腑に落ちない。

```swift
var firstName: String = "Steven"
var middleName: String? = "Paul" // <- middleNameはoptional
var lastName: String = "Jobs"

var dict: [String: String] = [
  "firstName": firstName,
  "middleName": "",
  "lastName": lastName,
]

dict["middleName"] = middleName // -> ちなみにmiddleNameがnilだった時はdictからmiddleName要素が消える

print(dict) // -> "[middleName: Paul, firstName: Steven, lastName: Jobs]"
```

## 要素の型がOptionalな時、nilを代入した時とOptional.Noneを代入した時挙動が違う

参考

[Swiftにnilという値は存在しない - Qiita](http://qiita.com/koher/items/cbe232782b9943715c9b)

```swift
var firstName: String = "Steven"
var middleName: String? = nil // <- middleNameだけoptional
var lastName: String = "Jobs"

var dict: [String: String?] = [
  "firstName": firstName,
  "middleName": "Some name", // <- なんか入ってる、くらいの意味
  "lastName": lastName,
]

dict["middleName"] = middleName // <- nilが代入されるように見える = 要素が消えるのでは？

print(dict) // -> "[lastName: Optional("Jobs"), firstName: Optional("Steven"), middleName: nil]" -> middleName消えてないやんけ、nil入っとるやんけ
```


> `dict["middleName"] = middleName`

ここで代入されるのは、nilではなくてString?.Noneである。ので、String?型を要素に持つdictはString?.Nomeを値として握る。要素は削除されない。

Optional bindingの知識だけだと以下の2つのコードは同じものに見えるが実際は違う。

```swift
var firstName: String = "Steven"
var middleName: String? = nil // <- middleNameだけoptional
var lastName: String = "Jobs"

var dict: [String: String?] = [
  "firstName": firstName,
  "middleName": "Some name",
  "lastName": lastName,
]

dict["middleName"] = middleName // <- ここ

print(dict) // -> "[lastName: Optional("Jobs"), firstName: Optional("Steven"), middleName: nil]"
```

```swift
var firstName: String = "Steven"
var middleName: String? = nil // <- middleNameだけoptional
var lastName: String = "Jobs"

var dict: [String: String?] = [
  "firstName": firstName,
  "middleName": "Some name",
  "lastName": lastName,
]

if let middleName = middleName {  //
  dict["middleName"] = middleName //
} else {                          // <- ここ
  dict["middleName"] = nil        //
}                                 //

print(dict) // -> "[firstName: Optional("Steven"), lastName: Optional("Jobs")]"
```

ここでハマるケースってあんまりイメージ出来ないけど、おなじに見えるコードが実は違うのに気づいて結構衝撃的だった。
ファイル書き込みの度にファイルを開いたらどれくらい遅いのか

ファイルに文字列を書き込む際に、書き込むたびにcloseするのって直感的に遅いような気がするけどどれくらい遅いのか軽く計測してみた。

  * [bench_write/bench_test.go at master · catatsuy/bench_write](https://github.com/catatsuy/bench_write/blob/master/bench_test.go)

```go
package main_test

import (
	"os"
	"testing"
)

func BenchmarkWriteEveryOpenFile(b *testing.B) {
	for i := 0; i < b.N; i++ {
		WriteEveryOpenFile("testtest\n")
	}
}

func WriteEveryOpenFile(s string) {
	file, err := os.OpenFile("tmp", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
	if err != nil {
		panic(err)
	}
	defer file.Close()
	file.WriteString(s)
}

func BenchmarkWriteOpeningFile(b *testing.B) {
	b.StopTimer()
	file, err := os.OpenFile("tmptmp", os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666)
	if err != nil {
		panic(err)
	}
	b.StartTimer()

	for i := 0; i < b.N; i++ {
		WriteOpeningFile(file, "testtest\n")
	}

	file.Close()
}

func WriteOpeningFile(f *os.File, s string) {
	f.WriteString(s)
}
```

## Macbook Pro

```
BenchmarkWriteEveryOpenFile-4      30000             48164 ns/op              72 B/op          3 allocs/op
BenchmarkWriteOpeningFile-4      1000000              1365 ns/op               0 B/op          0 allocs/op
ok      github.com/catatsuy/bench_write 4.502s
```

## Debian8(on VirtualBox)

```
BenchmarkWriteEveryOpenFile       500000              3053 ns/op              72 B/op          3 allocs/op
BenchmarkWriteOpeningFile        1000000              1382 ns/op               0 B/op          0 allocs/op
ok      _/home/vagrant/bench_write      2.969s
```

軽く計っただけだけど、MacとLinuxでかなり差があることに驚いた。Linuxであればパフォーマンスが重要なところでない限り、無理してファイルディスクリプタの使い回しをしなくてもよさそう。

パフォーマンスが必要な部分ではファイルディスクリプタの使い回しをしなければならないことは間違いない。しかしパフォーマンスが致命的な部分ではないのに無理にファイルディスクリプタを使い回そうとすると、ファイルが肥大化したときのログローテートができなくなるなど運用面で問題が出る。うまく使い分けていきたい。

あと手軽にパフォーマンスを計測すると最初はMacでやってしまいがちだけど、ちゃんとLinuxでも動かさないと正確な結果が出ないので（当たり前だけど）気をつけたい。
多段sshやscpで実行されるコマンドを表示

@fumiyas さんの以下発言が素晴らしかったのでメモ。
無駄な踏み台があるか気が付けますね。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">~/bin/ssh とかに以下の内容のシェルスクリプト置いて <a href="https://twitter.com/search?q=%24PATH&amp;src=ctag">$PATH</a> の先頭のほうに入れておくと、各ツール等がどんなコマンドライン実行するのか見えて楽しい。&#10;#!/bin/sh&#10;set -- /usr/bin/ssh &quot;$@&quot;&#10;echo &quot;$*&quot; 1&gt;&amp;2&#10;exec &quot;$@&quot;</p>&mdash; ふみやす＠シェルまおう(自称ではない) (@satoh_fumiyasu) <a href="https://twitter.com/satoh_fumiyasu/status/668661796694167554">2015, 11月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 準備

```bash:~/.ssh/bin/ssh
#!/bin/sh
set -- /usr/bin/ssh "$@"
echo "$*" 1>&2
exec "$@"
```

```bash:~/.ssh/bin/scp
#!/bin/sh
set -- /usr/bin/scp "$@"
echo "$*" 1>&2
exec "$@"
```

```bash:~/.bashrc
export $PATH=~/.ssh/bin:$PATH
```

## 実行

```bash:ssh
$ ssh raspberrypi.local
/usr/bin/ssh raspberrypi.local
/usr/bin/ssh -W raspberrypi.local:12345 fumidai
```

```bash:scp
$ scp raspberrypi.local:.bashrc .
/usr/bin/scp raspberrypi.local:.bashrc .
/usr/bin/ssh -W raspberrypi.local:12345 fumidai
.bashrc                      100% 3515     3.4KB/s   00:00
```
RailsエンジニアがオススメするATOM Packageまとめ


GitHub製のテキストエディタのATOMですが、2014年の終わりくらいに使い始めたから1年くらいになるかな？不満な点もいくつかあるけど、概ね使いやすくて気に入ってます。

Aptana => Net Beans => Sublime Text => vim => ATOM という具合に使ってきましたが、使い勝手良いから初心者でもすぐ使えるし、Packageで拡張できるからエディタにこだわりがある人にも十分対応できると思う。

今回はRailsエンジニアをやっているぼくのオススメPackageをまとめたいと思います。

## advanced-new-file
ささっと新規ファイルを作りたい時に、`cmd + alt + n`でコマンドラインっぽくディレクトリ・ファイル名をタイプしてファイルを作れる。ぼくはあんまりツリービューを使わない派なので、キータイプだけで高速にファイル作れるところが気に入ってる。

https://atom.io/packages/advanced-new-file

## rails-open-rspec
これ無しではRailsでTDDしたくないくらい神プラグイン。
現在開いているファイルから、ショートカットキー(`cmd + alt + o`)一発で対応するrspecファイルを別ペインに開いてくれる。ぼくは2ペインでコードとspecを並べて開発するスタイルなのでメチャクチャ重宝してる。

https://atom.io/packages/rails-open-rspec

GitHubのスターつけると作者が喜びます
https://github.com/harada4atsushi/rails-open-rspec


## japanese-wrap
開発しているときにはそんなに問題にならないんですが、ATOMでmarkdownでブログを書こうとすると、日本語が正しく改行されなくて、画面外にいっちゃって文章が見えなくなっちゃったりします。それをちゃんと改行されるようにするパッケージです。地味だけど必要なやつ。

https://atom.io/packages/japanese-wrap

## project-manager
複数のRailsアプリケーションを並行で開発しているとき、ATOM上でプロジェクトごと行き来したいときがあります。それを実現してくれるのがこのパッケージ。`cmd + control + p`でプロジェクトを移動します。

https://atom.io/packages/project-manager

## file-icons
エディタのタブにファイルタイプ別のアイコンが付くようになります。タブだけ見ればなんのファイルなのかすぐにわかるので便利。通常のrubyファイルなのかspecファイルなのかも判別出来るようになります。

https://atom.io/packages/file-icons

## atom-ctags
おなじみのctagsをATOMでも使用できるようにするパッケージ。ソースコード内でメソッドやクラスの記述から、定義へジャンプすることが出来るようになります。EclipseでいうF3みたいな感じですね。

https://atom.io/packages/atom-ctags

## term2
ATOM内でターミナルを開けるようになるパッケージ。ぼくが使ってたときは動作が不安定だったので結局iTerm2ばかり使ってたのであんまり使っていない。最近はどうだろうか。

https://atom.io/packages/term2

## 最後に
他にも使っているのはあるのですが、まとめてみると思ったより開拓しきれてない感があった。もうちょっと色んなパッケージ試したいですね！
Chrome拡張でCORS対応


## 概要

Chrome拡張で以下の様なCORSのエラーが出たときの対応。

```bash
XMLHttpRequest cannot load https://twitter.com/. Origin chrome-extension://olimhkjfpndfhdopbneamnekfalckinc is not allowed by Access-Control-Allow-Origin
```

## 対応

`permissions`に該当URLを追加する。

```manifest.json
...
"permissions": [
  "*://*.twitter.com/*"
],
...
```


## 参考

* <a href="https://developer.chrome.com/extensions/declare_permissions" target="_blank">Declare Permissions - Google Chrome</a>
* <a href="http://stackoverflow.com/questions/12357485/cors-chrome-extension-with-manifest-version-2" target="_blank">CORS Chrome Extension with manifest version 2 - Stack Overflow</a>
[C言語] printf系の関数に指定するフォーマット引数

数値をprintfで表示させようとした時に、こんなワーニングでコンパイラに怒られてしまうことがよくあるので、メモとして残しました。

```:warningの例(gcc)
movie_info.c:38:10: 警告: 書式 ‘%u’ は引数の型が ‘unsigned int’ であると予期されますが、第 2 引 数の型は ‘int64_t {aka long int}’ です [-Wformat=]
   printf("  <bitrate>%ud</bitrate>\n", vst->codec->bit_rate);
          ^
movie_info.c: 関数 ‘print_audio_tag’ 内:
movie_info.c:73:10: 警告: 書式 ‘%ld’ は引数の型が ‘long int’ であると予期されますが、第 2 引数の型は ‘int’ です [-Wformat=]
   printf("  <sample_rate>%ld</sample_rate>\n", ast->codec->sample_rate);
```

# 一覧

|            型   | フォーマット |
|------------------------|------|
| ssize_t                | %zd  |
| size_t                 | %zu  |
| intmax_t               | %jd  |
| uintmax_t              | %ju  |
| signed char            | %hhd |
| unsigned char          | %hhu |
| short int              | %hd  |
| unsigned short int     | %hu  |
| int                    | %d   |
| unsigned int           | %u   |
| long int               | %ld  |
| unsigned long int      | %lu  |
| long long int          | %lld |
| unsigned long long int | %llu |
【Objective-C】Core Graphicsで半円を描く


UIViewでCoreGraphicsを使って半円を描いていきたいと思います。
UIViewのサブクラス(HalfView)を作って、```- (void)drawRect:(CGRect)rect```メソッドに描画の処理を書きます。

```objective-c:halfView.m
/*
 半円をかく
 */
- (void)drawRect:(CGRect)rect {

    //現在のコンテクストを取得
    CGContextRef context = UIGraphicsGetCurrentContext();

    //透明レイヤー開始
    CGContextBeginTransparencyLayer(context, nil);
    
    //パスの描画を開始
    CGContextBeginPath(context);
    
    //開始角度
    float startAngle = -(90 * M_PI/180);
    
    //円グラフの角度
    float endAngle = startAngle + (M_PI * 2.0) * 0.5;
    
    //円弧を描画する
    CGContextMoveToPoint(context, 100, 100);
    CGContextAddArc(context, 100, 100, 100.0f, startAngle, endAngle, 0);
    CGContextClosePath(context);
    UIColor *color = [UIColor blackColor];
    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextDrawPath(context, kCGPathFill);
    
    //透明レイヤー終了
    CGContextEndTransparencyLayer(context);
    
}


```

Storyboadにて、幅200、高さ200のUIViewを作り、クラスをHalfViewにします。
![スクリーンショット 2015-11-23 14.28.45.png](https://qiita-image-store.s3.amazonaws.com/0/31587/5e0f109c-584f-8184-0b8f-1979225da569.png "スクリーンショット 2015-11-23 14.28.45.png")

##実行結果
![Simulator Screen Shot 2015.11.23 14.26.42.png](https://qiita-image-store.s3.amazonaws.com/0/31587/66938c02-7e8a-ff6c-9780-4759e104b384.png "Simulator Screen Shot 2015.11.23 14.26.42.png")


###解説

```
    //開始角度
    float startAngle = -(90 * M_PI/180);
```
 12時の方向から描画を始めたいので90度反時計回りに反転させる

 
 
円をパスで描画するメソッドは以下

```
void CGContextAddArc ( CGContextRef c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise );

```
 引数の意味は以下のとおり
 
| 引数 | 意味 | 
|:-----------|:------------|
| c       |        グラフィックスコンテキスト |
| x     |      円弧の中心になるX座標 | 
| y       |        will | 
| radius         |          円弧の半径 |  
| startAngle       |       X軸に対する円弧の開始角度（ラジアン） |
| endAngle    |    X軸に対する円弧の終了角度（ラジアン） | 
| clockwise    |     時計回りに円弧を作成する場合は1を、反時計回りに円弧を作成する場合は0を指定 | 

 
 なので以下の引数で実行すると
 
 ```
     CGContextAddArc(context, 100, 100, 100.0f, startAngle, endAngle, 0);
 ```
 contextというグラフィックスコンテキストで(x:100,y:100)の座標でstartAngleで開始、endAngleで終了する、反時計回りの円弧が描画される
下層のレイアウトのボタンを押せてしまうときの対処法


位置固定のfooterなどをつけているとき、クリックイベントを持っていないとスクロールで裏側に回ったボタンなどがfooterの上から押せてしまうことがある。




```layout.xml
<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_alignParentBottom="true"
        android:clickable="true"
        android:background="@android:color/transparent"
        />
```

そんなときは、前面に回る要素(今回はfooterだった)に```clickable="true"```をつけてやれば、クリックしたときにこの要素がイベントを取ってくれるので、背後の要素がクリックイベントをとることがなくなる。


java側から何もしないonClickListenerをつけるという手でも同じなのかな。
とにかくclickイベントを持たしてあげればよさそう。
Laravelで外部キー制約のあるテーブルを操作する。

Laravelで外部キー制約の操作につまづいたので、解決策をまとめました。

### テーブルの詳細

```php:table_sample.php
function run()
{
	Schema::create('parents', function (Blueprint $table) {
		$table->increments('id');
		$table->string('email', 60)->unique();
		$table->string('name', 30);
		$table->timestamps();
		$table->softDeletes();
	});
	Schema::create('children', function (Blueprint $table) {
		$table->increments('id');
		$table->string('email', 60);
		$table->foreign('email')->references('email')->on('parents')->onDelete('cascade');
		$table->string('name', 30);
		$table->timestamps();
		$table->softDeletes();
	});
{
```

親テーブル「parents」のemailを参照する子テーブル「children」を想定したモデルです。

#### 失敗例

上記の状態で以下のコードを実行します。

```php:seeder_fail_sample.php
public function run()
{
    Model::unguard();

    DB::table('parents')->truncate();
    $this->call('ParentsSeeder');


    Model::reguard();
}
```

このコードはシードデータを入れる際にテーブルをトランケートするといったコードになります。

```sh
$ php artisan db:seed
```

上記のコマンド」を呼び出すと、以下のエラーが出てしまいます。

```sh
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint
```

外部キー制約のためトランケートができませんって言われています。

#### 解決策

```php:seeder_success_sample.php
public function run()
{
    Model::unguard();
    
    DB::statement('SET FOREIGN_KEY_CHECKS=0;');

    DB::table('parents')->truncate();
    $this->call('ParentsSeeder');

    DB::statement('SET FOREIGN_KEY_CHECKS=1;');

    Model::reguard();
}
```

SET FOREIGN_KEY_CHECKSで外部キー制約を無視して操作をした後に元に戻します。これで外部キー制約のあるテーブルが操作できるようになります。
DBのちょっとした変更に正規表現で置換する


カラムの追加および、データの追加をするときに手作業でやるしかないか、と思ってたところで
作業効率化ではじめてちゃんと正規表現を使って置換をしてみました。



以下はcreateTableでカラムを一行追加したので、それに合わせてinsert文も変えるものです。
既存のカラムをコピーして新カラムとして追加するというだけのものなので、単純な変更なのですが、
手作業でやるとなると結構きついものがあります。


```
%s/INSERT INTO `sampleTable` (sampleCd,EditionCd,sampleNm,sampleOrdr,samplecdName,isInitCond) VALUES ('\([0-9]\+\)','\([0-9]\+\)','\([^0-9]\+\)','\([0-9]\+\)','\([^0-9]\+\)',\(.\+\));/INSERT INTO `sampleTab;le` (sampleCd,EditionCd,sampleNm,sampleOrdr,samplecdName,iInitCond) VALUES ('\1','\2','\3','\3','\4','\5',\6);/
```

vimで置換をしたので、特殊文字は基本的に```\```でエスケープしないといけないみたいです。
なんか色々試したのですがこのやり方でちゃんと通りました。もっとあると思います。

普段からこういうの取り入れる意識つけたいなぁ



http://archiva.jp/web/tool/vim_regexps.html

http://www.megasoft.co.jp/mifes/seiki/
windows > タスクバー上のエクスプローラ右クリック時に表示される「いつも表示」へのフォルダ追加 > タスクバーのエクスプローラへフォルダをドラッグ

```txt:動作確認
Windows 7 pro
```

タスクバーにあるエクスプローラ上で右クリックすると「よく使うもの」と「いつも表示」というのが表示される。ここから最近の作業フォルダへ最短でアクセスできる。

このいずれかにこれから作業するフォルダを登録したかった。

http://oshiete.goo.ne.jp/qa/6223356.html

> 「いつも表示」したいフォルダのアイコンをタスクバーのエクスプローラのボタンの上にドラッグ＆ドロップしてみたら、（「よく使うもの」を飛ばして）「いつも表示」に登録されました。お試しください。

確かにフォルダをドラッグすれば登録された。
これで作業が捗る。
[JAWS-UG CLI] API Gateway: #2 RestAPIの削除




前提条件
========


API Gatewayへの権限
--------------

API Gatewayに対してフル権限があること。


AWS CLI
-------

以下のバージョンで動作確認済

* AWS CLI 1.9.8

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.9.8 Python/2.7.5 Darwin/13.4.0 botocore/1.3.0



0. 準備
=======


## 0.1. リージョンの決定

変数の設定

  .. parsed-literal::

    export AWS_DEFAULT_REGION='\ |AWS_DEFAULT_REGION|\ '


## 0.2. 変数の確認

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       administrator-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                ap-northeast-1        env    AWS_DEFAULT_REGION
```

プロファイルが想定のものになっていることを確認します。





## 0.3. 対象APIの指定

```bash:コマンド:
aws apigateway get-rest-apis \
        --query 'items[].name'
```

```json:結果(例):
[
        "MyDemoAPI"
]
```

```bash:変数の指定:
APIGW_API_NAME='MyDemoAPI'
```

```bash:コマンド:
APIGW_API_ID=$( \
        aws apigateway get-rest-apis \
          --query "items[?name == \`${APIGW_API_NAME}\`].id" \
          --output text \
      ) \
        && echo ${APIGW_API_ID}
```

```text:結果(例):
      xxxxxxxxxx
```


1. 事前作業
===========

削除する前にかならず、削除対象の確認をしてください。


```bash:コマンド:
aws apigateway get-rest-api \
        --rest-api-id ${APIGW_API_ID}
```

```json:結果(例):
      {
        "id": "xxxxxxxxxx",
        "name": "MyDemoAPI",
        "description": "This is my API for demonstration purposes",
        "createdDate": 1445947998
      }
```


2. APIの削除
=========

```bash:変数の確認:
cat << ETX

        APIGW_API_ID: ${APIGW_API_ID}

ETX
```

```bash:コマンド:
aws apigateway delete-rest-api \
        --rest-api-id ${APIGW_API_ID}
```

```text:結果:
(戻り値なし)
```


3. 事後確認
========

```bash:コマンド:
aws apigateway get-rest-api \
        --rest-api-id ${APIGW_API_ID}
```

```text:結果:
A client error (NotFoundException) occurred when calling the GetRestApi operation: Invalid REST API identifier specified
```


# 完了
FreeBSD の ports でより早い mirror を選択する

# fastest_sites コマンドを使用する

fastest_sites コマンドは ${PORTS_DIR}/Mk/bsd.sites.mk に定義されているミラーサイトを
速い（と思われる）順に並べて出力する python スクリプトです。

fastest_sites コマンドの出力はそのまま make.conf(5) で使用できる形式なので、
出力結果のファイルを include する事でミラーサイトの選択を変更出来ます。

## Install

```shell-session
# cd /usr/ports/ports-mgmt/fastest_sites
# make install clean
```

## configure
```shell-session
# fastest_sites > /usr/local/etc/ports_sites.conf
# echo '.include "/usr/local/etc/ports_sites.conf"' >> /etc/make.conf
```

# MASTER_SITE_BACKUP を設定する

fastest_sites との兼ね合い、どのような挙動を示すか等把握できていませんが、
設定例の一つとして記述しておきます。

```/etc/make.conf
MASTER_SITE_BACKUP?=   \
        http://distcache.FreeBSD.org/ports-distfiles/${DIST_SUBDIR}/
```
Appcompat-v7のスタイル設定について忘備録

※自分がよく忘れてしまうので、残しています。ソースコード読みつつ動作確認はしていますが、あっさり目を通しただけなので正しくない(あるいは記事内容が古くなる)可能性があります。

#要点
Appcompat-v7を使っている場合に、SpinnerやAutoTextInput等のスタイルを変更したい時に、どの設定を変えたらよいか確認したい場合は、`appcompat-v7/2X.X.X/res/values/values.xml` にある`Platform.AppCompat`を確認する。

```xml:values.xml

<style name="Platform.AppCompat" parent="android:Theme">
    <item name="android:windowNoTitle">true</item>

    <item name="buttonBarStyle">@android:style/ButtonBar</item>
    <item name="buttonBarButtonStyle">@android:style/Widget.Button</item>
・・・
//以下略
```

#具体例
例えば、Spinnerの設定を変えたい場合は、 `appcompat-v7/2X.X.X/res/values/values.xml` にある`Platform.AppCompat`を確認すると、

```xml:values.xml
<style name="Platform.AppCompat" parent="android:Theme">
...
<item name="android:spinnerStyle">@style/Widget.AppCompat.Spinner</item>
...
```

となっているので、`Widget.AppCompat.Spinner`をparentにして、必要な項目について上書きすればOKです。`Widget.AppCompat.Spinner`を見てみると、

```xml:values.xml
<style name="Base.Widget.AppCompat.Spinner" parent="android:Widget.Spinner">
  <item name="android:background">@drawable/abc_spinner_mtrl_am_alpha</item>
  <item name="android:dropDownSelector">?attr/listChoiceBackgroundIndicator</item>
  <item name="android:dropDownVerticalOffset">0dip</item>
</style>
```
となっていて、 `android:background`や`android:dropDownSelector` が設定変更できるとわかります。
なので、例えば自分のアプリの values/style.xmlに以下を設定してあげます。

```xml:style.xml
<resources xmlns:android="http://schemas.android.com/apk/res/android">
  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
  <!-- 上書きする設定 -->
  <item name="android:spinnerStyle">@style/MySpinnerAppTheme</item>
以下略
  </style>
  <!-- Widget.AppCompat.Spinnerを親にして上書きする -->
  <style name="MySpinnerAppTheme" parent="@style/Widget.AppCompat.Spinner">
    <item name="android:background">@drawable/my_drop_down</item>
    <item name="android:dropDownSelector">@drawable/my_spinner_style</item>
  </style>
```

こうすると、Spinnerのスタイルをカスタマイズすることができます。
ここのUIのスタイル変更したいんだけど、どの項目変えたらいいんじゃい、という時はこの設定を思い出してみてください。
Intel Edisonでbluetoothテザリング


スマートフォンやPCに対してbluetoothテザリングを行います。大枠は Edison Bluetooth Guide のPAN(Personal Area Network)周りの設定を参照してください。connmanを使用するのがポイントです。
http://www.intel.com/support/edison/sb/CS-035381.htm

荷物を減らしてスマートフォンとEdisonのみの持ち歩きとしたいとき、かつ、人混みの環境下だとwifiより通信が安定するのがメリットでしょうか。筆者はiOSのSSHクライアントよりコンソール画面に出力する歩数計サンプルを作成した時に使用したりしています。

また、connmanを起動に組み込むと、Edison起動時にbluetoothの接続先がいれば自動的に接続します。(これ重要)

デメリットとして、出先でEdisonの接続を見失うとどうにもならなくなるときがあるので、wifiのテザリングも別途登録しておく、APモードへの切り替え等、その場でリカバリーする手段を用意しておいておいたほうがいいです。

# 用意するもの

BluetoothテザリングをONにしたスマートフォンまたはPCを用意します。
Macを使う場合、bluetoothを有効にした後、設定＞共有＞インターネット共有＞bluetooth PANにチェックを入れ、インターネット共有を開始しておきましょう。

最初はシリアル接続経由でEdisonにログインして以下の設定を行い、割り振られるIPアドレスをメモ等しながら行ったほうがよいです。ちなみにiOS9のテザリングを使った時のIPアドレスは172.20.10.xxxになります。


#connmanの起動

2行目は起動時に登録するか否かです。登録後、解除するにはenableをdisableに変更して実行します。

```
# systemctl start connman
# systemctl enable connman
```

# bluetoothの有効化

```
# rfkill unblock bluetooth
```

# デバイスのペアリング(初回のみ)

```
# bluetoothctl
> agent DisplayOnly
> default-agent
> discoverable on
> scan on
> pair 00:11:22:33:55:77 ※デバイスに合わせて変更
> trust 00:11:22:33:44:77
> exit
```

※コマンドやアドレスはタブ補完が効きます。pairがうまくいかない場合、接続先側でペアリングしてみましょう。

# テザリング接続

```
# connmanctl
> services ※ペアリングしたbluetoothと周囲のwifiが見えるはず
> connect bluetooth_001122335577_001122335566 ※テザリング側bluetoothデバイスの名前
> config bluetooth_001122335577_001122335566 autoconnect yes
> agent on *wifiの接続設定開始
> connect wifi_001122335577_001122335566 *この後、パスフレーズを聞かれるので入力
> config wifi_001122335577_001122335566 autoconnect yes
> services
*AO bluetooth_001122335577_001122335566
*AR wifi_001122335577_001122335566
> exit
```

※接続設定を保管したネットワークは先頭に’*’、自動接続する場合は’A’、接続中は’O’、接続可能は’R’が出ます。
※こちらも入力中にタブ補完が効きます。

`ifconfig`の出力にbnep0がIPアドレスが割り振られた状態で存在し、ネットワーク接続できることを確認して下さい。
また、この状態で再起動し、Edisonが起動時にbluetooth経由で再接続したら成功です。

参考
https://wiki.archlinux.org/index.php/Connman
https://01.org/connman/documentation
Intel Edison セットアップ

2015/12時点の記述です。なるべく手間を掛けずに。

# 初期設定
rootパスワード設定、ホスト名変更、wifi設定。
DHCP環境下ならMACアドレスを調べて、ルーター側で固定IP割当の設定にしたほうが楽かも。

`# configure_edison --setup`

# レポジトリのupdate
ハード周りを弄る場合、mraa、upmを最新版にアップデートしたほうがよいです。日進月歩で対応センサーが増えています(※)。

```
# vi /etc/opkg/iotkit.conf
src iotkit http://iotdk.intel.com/repos/2.0/intelgalactic
# opkg update
# opkg upgrade
```

※[Henry基板](http://www.runele.com/ca1/38/)を使っている場合、2015/9にアップデートされたupm-0.4.0でmpu9250(9軸モーションセンサ / 温度センサ)がサポートされました。mpu9150では取得できなかった温度が取得できるようになりましたが、Edison本体に近いせいで半ばCPU温度です。(ソースコードのコメントがいい味だしています。。。→自分も式を調べようとしてしまったため)

# pipのインストール

参考
https://nonnoise.github.io/Edison/python.html

```
# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
# python get-pip.py
```

こちらのレポジトリ (http://repo.opkg.net/edison/repo/core2-32/) にpython-pipがあるため、後述の「追加レポジトリの設定」に追加すればインストール可能です。(ただし、結構な数のパッケージをインストールすることに…)

# 時刻合わせ
タイムゾーンをUTCから東京に変更します。

```
# timedatectl set-timezone Asia/Tokyo
```

#ログ容量の節約
長いこと使うと容量を圧迫する(らしい)ので、再設定するに越したことはありません。

```
# echo "SystemMaxUse=4M" >> /etc/systemd/journald.conf
# systemctl stop systemd-journald
# rm -rf /var/log/journal/*
# systemctl start systemd-journald
```


# 電源オフ/ リブート

`poweroff`で電源オフ、`reboot`で再起動ですね。電源OFF後はSW1押しっぱなしで起動できます。

　
　

***

以下は必要に応じて。

# 追加レポジトリの設定
/etc/opkg/base-feeds.conf にレポジトリのURLを追加します。

```lang:/etc/opkg/base-feeds.conf
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32
src all  http://iotdk.intel.com/repos/2.0/iotdk/all
src quark  http://iotdk.intel.com/repos/2.0/iotdk/quark
src i586  http://iotdk.intel.com/repos/2.0/iotdk/i586
src x86  http://iotdk.intel.com/repos/2.0/iotdk/x86
```

※他にも http://repo.opkg.net/edison/repo/ 下を見ている例があります。

`opkg update`後、`opkg list`からパッケージを探してインストール。vimはこうしないとインストールできません。

インストールするパッケージが多い場合は、あらかじめ必要なパッケージを詰め込んだEdisonのカスタムイメージを作成するほうが楽です(特にカーネルを弄りだして再セットアップが多くなる場合)。

トラブル事例が多くお薦めしませんが、この状態で`opkg upgrade`を初回実行する場合は下記に示すように、/boot容量を増やしたほうがいいようです。

# /boot容量の拡張
/boot下を一時退避させて再パーティションすると容量が増えます。

```
# mount /boot
# mkdir /tmp/boot
# mv /boot/* /tmp/boot
# umount /boot
# mkfs.vfat /dev/mmcblk0p7
# mount /boot
# cp -a /tmp/boot/* /boot
```


***

# setup.sh

上記をまとめて行う簡単なシェルスクリプトを置いておきます。
(追加レポジトリの設定と/bootの再パーティションは含まず)
`# configure_edison --setup`後、ネットワークに参加した状態で実行して下さい。

```lang:setup.sh
#!/bin/sh

# install latest mraa and upm
echo "src iotkit http://iotdk.intel.com/repos/2.0/intelgalactic" > /etc/opkg/iotkit.conf
opkg update
opkg upgrade

# install pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

# log setting
echo "SystemMaxUse=4M" >> /etc/systemd/journald.conf
systemctl stop systemd-journald
rm -rf /var/log/journal/*
systemctl start systemd-journald

# set timezone (Tokyo)
timedatectl set-timezone Asia/Tokyo
```
LeapMotion の画像歪みを OpenCV で除去する

モチベーション：LeapMotion の画像歪みを除去したい．

制約条件：GPU に書かせるのとかめんどくさいのでお手軽にいきたい．

|Before      |After      |
|------------|-----------|
|![after.png](https://qiita-image-store.s3.amazonaws.com/0/52956/d60e83a5-43a4-b798-ae0a-dfd87e4bec46.png)|![before.png](https://qiita-image-store.s3.amazonaws.com/0/52956/f542beb2-1712-695e-a2e0-430f96b39705.png)
|

↑我が家のハムスターケージ

# Code

```cpp
#include "stdafx.h"
#include <Leap.h>
#include <opencv2\opencv.hpp>

cv::Mat warp(Leap::Image image) {
	cv::Mat_<cv::Vec3b> out(cv::Size(640, 480));
	const cv::Mat_<unsigned char> cvImage = cv::Mat(image.height(), image.width(), CV_8UC1, image.dataPointer());

	out.forEach([&](cv::Vec3b& pixel, const int pos[])-> void {
		float y = (float)pos[0] / out.rows;
		float x = (float)(pos[1] - 120) / out.rows;

		const Leap::Vector v(
			(x - image.rayOffsetX()) / image.rayScaleX() / 4 * 2,
			// 公式サイトでは tanθ = 4 までが範囲って言ってたけど，そんなに無いと思う．
			(y - image.rayOffsetY()) / image.rayScaleY() / 4 * 2,
			0);

		const auto warped = image.warp(v);

		if (warped.x > 0 && warped.x < (cvImage.cols - 1)
			&& warped.y > 0 && warped.y < (cvImage.rows - 1)) {
			// std::cout << warped << std::endl;
			pixel = cv::Vec3b::all(cvImage(warped.y, warped.x));
		}
		else {
			pixel = cv::Vec3b(0, 255, 0);
		}
	});

	return out;
}

int main()
{
	Leap::Controller controller;
	controller.setPolicy(Leap::Controller::POLICY_IMAGES);
	controller.setPolicy(Leap::Controller::POLICY_BACKGROUND_FRAMES);

	while (cv::waitKey(1) != 'q') {
		const auto frame = controller.frame();
		if (!frame.isValid()) {
			std::cout << "Frame is Invalid" << std::endl;
			continue;
		}

		const auto imageList = frame.images();

		if (imageList.isEmpty()) {
			std::cout << "imageList.isEmpty()" << std::endl;
			continue;
		}

		const auto imageL = warp(imageList[0]);
		cv::imshow("imageL", imageL);
	}
	return 0;
}

```

Depth Map が欲しいなら Intel RealSence のほうがいいですね……
クラスとオブジェクトとインスタンスの関係

# クラスとインスタンス

クラスは設計図で、インスタンスはその設計図を実体化したもの
(実体化することをインスタンス化という)。

例えば、人間という言葉を想像した時に、思い浮かべるものは、特定の誰かではなく、漠然とした人間を思い浮かべる。ただ、自分も人間だし、自分の友達や親も人間である。
この始めに思い浮かべた人間がクラスで、自分のと友達や親といった実体があるものがインスタンスと考えてもよい。

# オブジェクト指向

オブジェクト指向とは、オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方。
このオブジェクト指向によって、考えられたのが、クラスやインスタンス。

人クラス、猫クラス、家クラスなどそれぞれクラスを用意することで、それぞれの振る舞いをとらえることができるようになる。なので、クラスはオブジェクトである。

同様に、自分インスタンス、自分が飼っている猫インスタンスなどそれぞれのインスタンスを用意することで、それぞれの振る舞いをとらえることができるようになる。なので、インスタンスもオブジェクトである。

# まとめる

まとめると
・クラスはオブジェクトである。
・インスタンスはオブジェクトである。
・クラスをインスタンス化したものがインスタンス。
(クラスは設計図でインスタンスは実体化される。)

オブジェクト指向の考えに則って作られたのがクラスとインスタンスです。
結局、クラスもインスタンスもオブジェクトなのです。
"これが解けたらIQ150"みたいな計算問題のruby実装

ちょっと前に流行った"これが解けたらIQ150"みたいな計算問題

> http://matome.naver.jp/odai/2137952246025001301
> 5 + 3 = 28
> 6 + 4 = 210

これらは、左辺の通常の足し算”＋”の結果とは異なる処理結果が、右辺となる等式。

-  ↑の”通常「+」と異なる処理”という点は、演算子オーバーライドっぽい
- ruby2.1のrefinementってどうやってかくんだっけ

という内容のメモを下記します。

## 引いたのと足したのを文字列結合するあれ
> 6 + 4 = 210
> 9 + 2 = 711
> 8 + 5 = 313
> 5 + 2 = 37
> 7 + 6 = 113

「+」演算子のオーバーライドをやるんだけど、なぜかしらんが、ruby2.1 からのrefinementsでないとできんかった。

```ruby:minus_plus.rb
# ruby2.1 のrefinementsを使うFixnum拡張
module FixnumExtensions
  refine ::Fixnum do
    alias_method(:orig_plus, :+)
    def +(n)
      "#{self - n}#{self.orig_plus(n)}".to_i
    end
  end
end

[[6, 4],
 [9, 2],
 [8, 5],
 [5, 2],
 [7, 6]].each do |a, b|
  using FixnumExtensions
  puts "#{a} + #{b} = #{a + b}"
end
```

## 数字の○の数を数えるパターン
小学生向けの子供番組等で頻出すると思われるクイズ
> 8 + 8 = 4
> 1 + 0 = 1
> 5 + 5 = 0
> 66 + 99 = 4
> 333 + 222 = 0

数字の見た目に含まれる「丸」の数を数えるという仕様。

```ruby:maru.rb
module FixnumExtensions
  def maru_count(num_str)
    case num_str
    when '8' then return 2
    when /^[069]$/ then return 1
    end
    0
  end
  
  module_function :maru_count
  
  refine ::Fixnum do
    alias :orig_plus :+
    
    def to_maru_count
      self.to_s.each_char.map{|n| FixnumExtensions.maru_count(n)}.inject(:+)
    end
    
    def +(other)
      self.to_maru_count.orig_plus(other.to_maru_count)
    end
  end
end

module Maru
  using FixnumExtensions
  
  module_function
  def process

    [
     [8, 8],
     [1, 0],
     [5, 5],
     [66, 99],
     [333, 222],
     [0, 0],
     [2, 3],
     [9, 9],
     [8, 36],
     [8, 0],
     [22, 347],
     [80, 123],
    ].each do |a, b|
      puts "#{a} + #{b} = #{a + b}"
    end

  end
end

if __FILE__ == $0
  Maru::process
end
```
レポジトリの意味・イメージが湧かない人向け解説

# 「レポジトリ」のイメージが湧かんで困った
Linux環境の構築方法を学習していると、「ソフトウェアのインストール方法」を学ぶ段階で、度々「レポジトリ」という用語が出て来る。

自分は、このレポジトリという概念のイメージを掴むのに一苦労した。

# 自分はこのサイトで理解できました
そんな中で「なるほどイメージ湧きました！」と思えた解説を提供してくれたサイトがあったのでシェアします。

[外部レポジトリとは](http://oshiete.goo.ne.jp/qa/7295395.html)
[初心者の頃に知っておきたかった rpm と yum の違いと使い分け](http://blog.inouetakuya.info/entry/20111006/1317900802)

※　レポジトリの理解には「yum」「rpm」というコマンドの用途・役割も一緒に覚えると、「ソフトウェアのインストール方法」まわりの概念が総合的に理解できて覚えやすいと思ったのでそのあたりのソースも混ぜときます。
iOS Safari + Sample Web Server ではまる

boost::asio で WebServer 書いててはまった．

iOS Safari は，IP ベースでアクセスする時に，Host Header を入れておかないと画像（だけ？）がとれないっぽい．

HTTP/1.0 で通信してるにも関わらず．

iOS Safari でのみ Host は必須 Http ヘッダーの扱いなのか……よくわからん．
jsonの整形

```bash
% ls  
sample.json
% cat sample.json
{
"type": "FeatureCollection",
"features": [
{ "type": "Feature", "properties": { "pref": "富山県", "city1": "下新川郡", "city2": "朝日町"}, "geometry": { "type": "Polygon", "coordinates":[ [ [ 136.111111, 36.111111 ], [ 136.222222, 36.222222 ]]] }},
{ "type": "Feature", "properties": { "pref": "富山県", "city1": "氷見市", "city2": ""}, "geometry": { "type": "Polygon", "coordinates":[ [ [ 136.333333, 36.333333 ], [ 136.444444, 36.444444 ]]] }},
{ "type": "Feature", "properties": { "pref": "富山県", "city1": "高岡市", "city2": ""}, "geometry": { "type": "Polygon", "coordinates":[ [ [ 136.555555, 36.555555 ], [ 138.666666, 36.666666 ]]] }}
]
}
```

```              
% brew install jq
```

```
% cat sample.json | jq '.'
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "pref": "富山県",
        "city1": "下新川郡",
        "city2": "朝日町"
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              136.111111,
              36.111111
            ],
            [
              136.222222,
              36.222222
            ]
          ]
        ]
      }
    },
```
Python with MySQL

# MySQL-python
Django対応？
C-Extentionのみ
## install
`pip install MySQL-python`
gcc要る
mysql-devel要る
コンパイル走る
## demo
```python:
                slave_connection = MySQLdb.connect(host = slave_host, user = username, passwd = password, port = slave_port)
                slave_cursor = slave_connection.cursor(MySQLdb.cursors.DictCursor)
                slave_cursor.execute("SHOW SLAVE STATUS")
                slave_status = slave_cursor.fetchone()
                slave_master_log_file = slave_status["Master_Log_File"]
                seconds_behind_master = int(slave_status["Seconds_Behind_Master"])
```
cursorで `DictCursor`指定したら、row['&lt;column&gt;']で通るようになる。


# mysql-connector-python
Mysql製
pure-python版も有る(普通にいれるとそれっぽい)むしろC-Extentionは後発
最新版はpipで入らない

## install

no longer support mysql-connector-python!
use `mysql-connector-python-rf`
but ...

```
pip install mysql-connector-python-rf

Collecting mysql-connector-python-rf
  Downloading mysql-connector-python-rf-2.1.3.tar.gz (271kB)
    100% |████████████████████████████████| 274kB 1.4MB/s
Installing collected packages: mysql-connector-python-rf
  Running setup.py install for mysql-connector-python-rf ... error

    usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
       or: -c --help [cmd1 cmd2 ...]
       or: -c --help-commands
       or: -c cmd --help

    error: option --single-version-externally-managed not recognized

    ----------------------------------------
```
### solution

`pip install --egg mysql-connector-python-rf`

http://stackoverflow.com/questions/14296531/what-does-error-option-single-version-externally-managed-not-recognized-ind

### python3.6 (lambda)
`pip install mysql-connector-python`

## demo

```python:
import mysql.connector
cnx = mysql.connector.connect(host='127.0.0.1', 
                              user='root', 
                              password='huga', 
                              port='3306', 
                              database='test')
cur = cnx.cursor(buffered=True, dictionary=True)
cur.execute('show slave status')
row = cur.fetchone()
row['Seconds_Behind_Master']
#row[cols.index('Seconds_Behind_Master')]
```
普通はrow['%Column_name%']でいい感じにして欲しいときは、cursor開くときに  `dictionary=true` を指定する。
for .. in cur: 文で回すサンプルもあるが、配列(タプル)のインデックス順にだしてるだけ、select文でカラム絞りしてればいいけど。
connection.cmd_query()というのもあるけど、一発コマンドでconnection切れてしまう臭い。
Redux入門 5日目 Reduxの基本・Data Flow(公式ドキュメント和訳)


前回 [Redux入門 4日目 Reduxの基本・Stores](http://qiita.com/kiita312/items/377787c24efac64f2495)


今回はReduxのデータの流れをおさらいします。

Reduxのデータフローの基本は、一方向ということです。
すべてのReduxアプリケーションでのデータのライフサイクルは以下の4つのステップをたどります。

**1. store.dispatch(action)を呼ぶ**
![スクリーンショット 2015-11-22 23.33.31.png](https://qiita-image-store.s3.amazonaws.com/0/36813/a7a4a89b-ba3d-9907-e7c5-463a1b6952ec.png "スクリーンショット 2015-11-22 23.33.31.png")

* actionは「何をする」という内容を持ったオブジェクト。
* store.dispatch(action)はアプリケーション上のどこからでも読み出すことが出来ます。

**2. storeは受けたactionと現在保持しているstateをreducerへ渡す**
![スクリーンショット 2015-11-22 23.55.04.png](https://qiita-image-store.s3.amazonaws.com/0/36813/7404cd3c-1350-4348-072c-ebe3b43b0f87.png "スクリーンショット 2015-11-22 23.55.04.png")

* reducerはactionとstateを元に、新しいstateを作成して返すメソッド
* reducerのメソッドは副作用を起こさないものでなければならず、Aというstateに対して毎回必ずBというstateを返すような関数でなければならない
![スクリーンショット 2015-11-22 23.33.49.png](https://qiita-image-store.s3.amazonaws.com/0/36813/72509989-62dc-9fae-f681-ee4d8f49df3a.png "スクリーンショット 2015-11-22 23.33.49.png")

**3. 子reducerの返したstateを親reducerがまとめて一つのツリー状のstateを返す**
![スクリーンショット 2015-11-22 23.34.10.png](https://qiita-image-store.s3.amazonaws.com/0/36813/0dfa48b7-45b5-2c04-029b-b0cc504a60b6.png "スクリーンショット 2015-11-22 23.34.10.png")

* stateのプロパティはツリー状になっており、reducerはプロパティに対応した子reducerが処理し、また一つのツリー状のstateとして返す。
* 親reducerをどのように実装するかは自由。Reduxでは、reducerを分割するためのcombineReducers()をヘルパーとして提供しています。

**4. reducerが作成した新しいstateをstoreが保存する**![スクリーンショット 2015-11-22 23.34.22.png](https://qiita-image-store.s3.amazonaws.com/0/36813/04278c1f-1913-520f-f333-de47c1088a2b.png "スクリーンショット 2015-11-22 23.34.22.png")

* store.subscribe(listener) でリスナーを登録した場合、リスナーではstore.getState()で現在のstateを取得してreducerが呼び出される。

続き[Redux入門 6日目 ReduxとReactの連携](http://qiita.com/kiita312/items/d769c85f446994349b52)
Redux入門 4日目 Reduxの基本・Stores(公式ドキュメント和訳)

前回 [Redux入門 3日目 Reduxの基本・Reducers](http://qiita.com/kiita312/items/7fdce94912d6d9c801f8)

前回に引き続き、今回はStoresについてです。

## 2.3 Stores
Storesの役割は、

* stateを保持する
* stateへアクセスするためのgetState()を提供する
* stateを更新するためのdispatch(action)を提供する
* リスナーを登録するためのsubscribe(listener)を提供する

Reduxではstoreは必ず一つにしてください。
dataごとにロジックを分割したい場合は、storeを分割せずにreducer compositionを使用してください。

storeをつくるには、combineReducerでつくられたreducerを`createStore()`へ渡します。

```js
import { createStore } from 'redux'
import todoApp from './reducers'
let store = createStore(todoApp)
```
stateの初期値を渡したい場合にはcreateStoreの第２引数に入れます。

```js
let store = createStore(todoApp, window.STATE_FROM_SERVER)
```

ここまで来ると、UIはまだ作成されていませんがReducerとactionCreatorのテストを作ることが出来ます。

続き [Redux入門 5日目 Reduxの基本・Data Flow](http://qiita.com/kiita312/items/ae3ce31521ad24dd699f)
Crashlyticsへ追加情報も送信しよう


Crashlyticsは入れておくだけでクラッシュ時のコールスタックが表示されるので調査に便利
また追加情報も送信できる仕組みもある。

### 1. ユーザ情報を送る

``` objc
#import <Crashlytics/Crashlytics.h>

- (void)testMethod2
{
    [[Crashlytics sharedInstance] setUserEmail:@"user@email.com"];
    [[Crashlytics sharedInstance] setUserIdentifier:@"12344556789"];
    [[Crashlytics sharedInstance] setUserName:@"test user"];
    
    [[Crashlytics sharedInstance] crash];
}
```

- 結果

![スクリーンショット 2015-11-23 10.41.14.png](https://qiita-image-store.s3.amazonaws.com/0/25832/09ddd1bd-c0ab-aa93-2a8a-058bf6b42b44.png "スクリーンショット 2015-11-23 10.41.14.png")

### 2. Key,Valueで送る

``` objc
- (void)testMethod2
{
    [[Crashlytics sharedInstance] setBoolValue:YES forKey:@"boolLog"];
    [[Crashlytics sharedInstance] setFloatValue:0.12345 forKey:@"floatLog"];
    [[Crashlytics sharedInstance] setIntValue:3 forKey:@"intLog"];
    [[Crashlytics sharedInstance] setObjectValue:@"objectValue..test" forKey:@"objectLog"];
    
    [[Crashlytics sharedInstance] crash];
}
```

- 結果

![スクリーンショット 2015-11-23 10.41.49.png](https://qiita-image-store.s3.amazonaws.com/0/25832/b71b2b63-7f7d-e11c-3e9e-b93398368ecd.png "スクリーンショット 2015-11-23 10.41.49.png")

### 3. ログ情報を送る

``` objc
- (void)testMethod2
{
    CLS_LOG(@"CLS_LOG for Dict %@", @{@"key1":@"value1", @"key2":@"value2", @"key3":@"value3"});
    
    [[Crashlytics sharedInstance] crash];
}
```

- 結果

![スクリーンショット 2015-11-23 10.42.04.png](https://qiita-image-store.s3.amazonaws.com/0/25832/1f18738b-f988-0f26-1f01-6810a39da456.png "スクリーンショット 2015-11-23 10.42.04.png")

### 4. NSException以外のカスタム例外を送る

``` objc
- (void)testMethod2
{
    [[Crashlytics sharedInstance] recordCustomExceptionName:@"customEx..." reason:@"custom_reason.." frameArray:@[[CLSStackFrame stackFrameWithAddress:1234567]]];
    
    [[Crashlytics sharedInstance] crash];
}
```

- 結果

![スクリーンショット 2015-11-23 10.42.18.png](https://qiita-image-store.s3.amazonaws.com/0/25832/3ffa7e4b-1878-d778-7d48-8b785015603c.png "スクリーンショット 2015-11-23 10.42.18.png")

参考：
http://support.crashlytics.com/knowledgebase/articles/92519-how-do-i-use-logging-
http://support.crashlytics.com/knowledgebase/articles/92520-how-do-i-use-custom-keys-
http://support.crashlytics.com/knowledgebase/articles/92521-how-do-i-set-user-information-