OmniAICreator/Qiita-1.07M huggingface dataset:
portfast設定をしないと最大50秒間通信ができなくなるよ

* oは接続されている状態、xは切断されている状態を表す。

```bash:正常時
c2960_a_Gi1/0/20 o---o server_eth0
c2960_b_Gi1/0/20 o---o server_eth1 
```

* `server_eth0`と`server_eth1`はチーミング設定済み。

## 課題

```bash:eth0を抜いた場合
c2960_a_Gi1/0/20 o---x server_eth0
c2960_b_Gi1/0/20 o---o server_eth1 
```

この時、pingは1秒も落ちない。
すかさず以下を行う。

```bash:eth0を挿してeth1を抜く
c2960_a_Gi1/0/20 o---o server_eth0
c2960_b_Gi1/0/20 o---x server_eth1 
```

するとserverは`最大50秒間`通信ができなくなる。
これはネットワーク機器がループ防止のために
1. ブロッキング
2. リスニング
3. ラーニング
4. フォワーディング
の順番で状態が移行し、それが最大50秒かかるためである。

## 解決方法

* portfastは接続先がサーバ機器であることを確認しておくこと！
  * ネットワーク機器が接続先の場合は設定してはいけません。

```apache:portfast設定
#conf t
(config)#interface Gi1/0/20
(config-if)#spanning-tree portfast
(config-if)#^Z
```

> %Warning: portfast should only be enabled on ports connected to a single
>  host. Connecting hubs, concentrators, switches, bridges, etc... to this
>  interface  when portfast is enabled, can cause temporary bridging loops.
>  Use with CAUTION
> 
> %Portfast has been configured on GigabitEthernet1/0/20 but will only
>  have effect when the interface is in a non-trunking mode.

このメッセージは警告なだけで無視して良い。

```bash:
show spanning-tree
```
node.jsでツイッタークライアント作ってみた


## 初めに

[Rivulet](http://rivulet.bruwbird.com/)は、HTML/node.jsをベースとしたツイッタークライアントです。socket.ioを使って、リアルタイム更新を行っています。
streamingを使うとapi制限から解放されるからいいですよね。



![Rivulet-logo.png](https://qiita-image-store.s3.amazonaws.com/0/51350/cab292ce-5216-3d59-17d1-5f87aa3b12a6.png)

### Stuff

1. [node.js version 0.10.26](http://nodejs.jp/)
2. [express version 3.4.8](http://expressjs.com/)  
2. [ejs version 0.8.5](http://embeddedjs.com/)
3. [passport version 0.2.0](http://passportjs.org/)
4. [socket.io version 0.9.16](http://socket.io/)
5. [node_twitter version 0.2.9](https://github.com/jdub/node-twitter)
6. [jQuery version 2.1.1](http://jquery.com/)
7. [Bootstrap version 3.1.1](http://getbootstrap.com/)
8. [less.js version 1.7.0](http://lesscss.org/)
9. [underscore.js version 1.6.0](http://underscorejs.org/)
      
## 使い方

[github](https://github.com/YusukeShimizu/Rivulet)からソースコードをクローンして、自身のPCをサーバーとして動作させることができます。以下を参考にしてください。

    $ git clone https://github.com/YusukeShimizu/Rivulet.git
    $ cd Rivult
    $ vi config.json
    $ node app.js

お使いのブラウザで、

> [http://localhost:5000/](http://localhost:5000/)

にアクセスしてください。

### Note

* [nodejs.org](http://nodejs.org/)より、node.js v0.10.xをインストールしてください。
* クローンするには[Git Hub](https://github.com/)アカウントが必要となります。
* Consumer Key/Secretが必要です。[https://dev.twitter.com/](https://dev.twitter.com/)より取得可能です。
* MySQLによるsession管理を行っています。[MySQL](http://www-jp.mysql.com/)より環境を用意してください。
サブディレクトリに配置したコントローラについて

FuelPHPはコントローラをサブディレクトリに配置してそれに対応したURLで呼び出すことができる。

```controller/hoge/foo.php
class Controller_Hoge_Foo extends Controller
{
    public function action_index() {
        echo "Controller_Hoge_Fooのaction_indexが呼び出されました";
        exit;
    }

    public function action_bar() {
        echo "Controller_Hoge_Fooのaction_barが呼び出されました";
        exit;
    }
}
```

上のコントローラの action_index に対応するURLは
http://example.com/hoge/foo

action_bar に対応するURLは
http://example.com/hoge/foo/bar

となる。


この状態で、上位ディレクトリに Controller_Hoge が存在し、action_foo が定義されていた場合に、

```controller/hoge.php
class Controller_Hoge extends Controller
{
    public function action_index() {
        echo "Controller_Hogeのaction_indexが呼び出されました";
        exit;
    }

    public function action_foo() {
        echo "Controller_Hogeのaction_fooが呼び出されました";
        exit;
    }
}
```

Controller_Hoge_Foo.action_index と Controller_Hoge.action_foo のどちらが呼び出されるのかやってみた。

結果

http://example.com/hoge

```
Controller_Hogeのaction_indexが呼び出されました
```

http://example.com/hoge/foo

```
Controller_Hoge_Fooのaction_indexが呼び出されました
```

http://example.com/hoge/foo/bar

```
Controller_Hoge_Fooのaction_barが呼び出されました
```

サブディレクトリが優先して呼び出されるらしく、Controller_Hoge.action_foo は呼び出されなかった。
プロキシ環境下でVirtualBoxを使うときの設定メモ

会社のPCでVirtualBox使おうとしたときにプロキシ関係の設定で嵌ったのでメモ。

VirtualBoxへOSをインストールする手順は省いています。そこは適当にググってください。
便宜上、CentOS6.5で説明します。

・VirtualBox起動後、[ファイル(F)]->[環境設定(P)]とクリックします。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/3898/033c2dfd-2971-ec59-891c-b0a5b806e5fa.png)

<p>
・[VirtualBox - 設定]で
(1)プロキシーの項目をクリック
(2)[プロキシーを有効化(E)]にチェックを入れる
(3)ホスト名、ポート番号を指定する
(4)OKをクリックする

![02.png](https://qiita-image-store.s3.amazonaws.com/0/3898/d38487da-9d3b-2b37-b24f-5f7252a7f634.png)

<p>
OSを立ち上げ、以下のようにコマンドを実行する。

```
# echo "export HTTP_PROXY=http://proxy.sample.com:8080" >> /etc/profile.d/proxy.sh
# echo "export FTP_PROXY=http://proxy.sample.com:8080" >> /etc/profile.d/proxy.sh
# chmod +x /etc/profile.d/proxy.sh
# source /etc/profile.d/proxy.sh
```

あるいは単に~/.bashrcに追記する。

```
$ echo "export HTTP_PROXY=http://proxy.sample.com:8080" >> ~/.bashrc
$ echo "export FTP_PROXY=http://proxy.sample.com:8080" >> ~/.bashrc
$ source ~/.bashrc
```

以上。
Elasticsearchにコネクションが確立できない

Elasticsearchにコネクションが確立できない

# 問題
POST、GETでする分には問題ないが
なぜかElasticsearchのClient API使うとElasticsearchのコネクション
がはれない壁にあたる

## 調査方法
Client API経由でのパケット解析

## 原因
Client APIはTCP通信。
社内ネットワークはプロキシ経由なのでレイヤが違う。
Luceneクエリ


## ドキュメントに入っているデータ(インデックス分割)
| id          | name       | rank         |
|:------------|-----------:|:------------:|
| 1           | AAA        | C            |
| 2           | BBB        | C            |
| 3           | CCC        | A            |
| 4           | AAAA       | A            |
| 5           | BBBB       | B            |
| 6           | CCCC       | A            |
| 7           | ABC        | B            |
| 8           | ABCD       | B            |
| 9           | zoo        | B            |
| 10          | soo        | B            |

## ワイルドカード
<pre>
/* 全て */
name:*

/* 0 個以上の任意の文字 */
name:A*A        // id=1(name=AAA), id=4(name=AAAA)

/* 1個の任意の文字 */
name:A?A        // id=1(name=AAA)
</pre>

## 論理演算子
<pre>
/* AND */
name:A*A AND rank:A       // id=4(name=AAAA, RANK=A)
name:A*A && rank:A        // id=4(name=AAAA, RANK=A)

/* OR */
name:A*A OR rank:A        // id=1, 3, 4, 6 (name=AAA, name=AAAA, rank=A)
name:A*A || rank:A        // id=1, 3, 4, 6 (name=AAA, name=AAAA, rank=A) 

/* NOT */
name:A*A AND NOT rank:A       // id=1(name=AAA, RANK=C)
name:A*A AND !rank:A          // id=1(name=AAA, RANK=C)

/* + */
name:A*A AND NOT rank:A       // id=1(name=AAA, RANK=C)
name:"mike" AND -language:"eng"


</pre>

## 範囲検索
<pre>
rank:[3 TO 6]        // rank=3以上、6以下 
rank:{3 TO 6}        // rank=3より大きい、6未満
rank:[3 TO 6}        // rank=3以上、6未満
rank:[* TO 6]        // rank=6以下
rank:[3 6]           // rank=3または6
</pre>

## あいまい検索
<pre>
name:zoo~0.5         // id=9(name=zoo), 10(name=soo)
</pre>

## 重みづけ(キャレット)
<pre>
rank:C^4 OR rank:A         // rank=Aで一致したデータより、rank=Cがスコアが高くなる
</pre>
iOS8.1.1でNUMBERからBOOLへのCAST注意点

JSON通信時などに、int値をboolにキャストする場合があると思いますが、
下記の方法では、iOS8.1.1からおかしくなる場合があります。
（シミュレーターではうまくいっているが、実機ではおかしくなったりします）

```json:JSON内容
{
    myself = 1;
    "id" = 123;
}
```

myself値をBOOLにキャスト

```objc++
BOOL bTest = (BOOL)[dict objectForKey:@"myself"];
```
この場合、FALSEになる場合があります。
そのため、下記方法で行いましょう。

```objc++
BOOL bTest = [[dict objectForKey:@"myself"] boolValue];
```
Bitbucketでチームを作ってメンバーを追加するまでの流れ

プライベートリポジトリを作成するのに便利なBitbucketだけれど、普段使い慣れていないと最初の導入でつまづくのでメモ。

# グループを作る
アカウント作成の際に個人ではなくグループで作成すればOK

# グループにメンバーを追加する
画面右上のManage Teamをクリックし
![4ef73645da129ba8df82e6d4f459b46a.png](https://qiita-image-store.s3.amazonaws.com/0/41027/6eccd55e-3e2f-0fc9-fd14-cfc3eb987d95.png)

User groupsにアクセス。
![66fbf1f6b664840ac7e108e83189bfee.png](https://qiita-image-store.s3.amazonaws.com/0/41027/473db9fb-eee5-bd4d-2811-090a61c8e958.png)

するとグループ管理画面が出てくるので、ここで追加したい人のメールアドレスを入れて送信。
![8168876b5fa542bacf1e5d425d6cdb86.png](https://qiita-image-store.s3.amazonaws.com/0/41027/57f569ab-ae32-c00d-d917-899cdd3cdcc3.png)

メール送信時に相手がBitbucketのアカウントを持っていないとうまく認証できないので、その場合はアカウントを取ってもらってから送信する。
先に送信してしまうと認証されても「送信済」のままステータスが変わらない場合があるので、右端のバツボタンを押して再送信すると、ステータスが切り替わって閲覧できる。

## おまけ
リポジトリを作成するときは、リポジトリ＞作成の上、名前を切り替えればOK。油断していると自分に紐づいて慌てます…
![07e58260594481648da8d5a7ee3852e8.png](https://qiita-image-store.s3.amazonaws.com/0/41027/e5040e7b-2f31-b2d8-73dc-a261147de3d9.png)

また、せっかくプライベートにしてもTeam Settingでプライベート表示にしておかないとチームは表示されてしまうので注意。
Proxmox 4.3でbonding + bridge

## 設定

<img width="574" alt="スクリーンショット 2016-12-08 1.55.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/25728/37ded4f6-a3c8-4ef3-3bc9-4166c0052b53.png">


OSを再起動すると適用される。

> balance-rr・・・デフォルト。ラウンドロビン通信
> active-backup・・・正常系／待機系
> balance-xor・・・MACアドレスの値で通信ポートを判断
> broadcast・・・全てのNICでパケットを送出
> 802.3ad・・・・・・802.3ad規格のネットワーク負荷分散
> balance-tlb・・・送信のみ負荷分散する。受信は1つのNICを利用
> balance-alb・・・送信、受信ともに負荷分散する。

```rb:/etc/network/interfaces

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

iface eth0 inet manual

iface eth1 inet manual

iface eth2 inet manual

iface eth3 inet manual

auto bond0
iface bond0 inet manual
	slaves eth2 eth3
	bond_miimon 100
	bond_mode active-backup

auto bond1
iface bond1 inet manual
	slaves eth0 eth1
	bond_miimon 100
	bond_mode active-backup

auto vmbr0
iface vmbr0 inet static
	address  192.168.10.4
	netmask  255.255.255.0
	gateway  192.168.10.1
	bridge_ports bond0
	bridge_stp off
	bridge_fd 0

auto vmbr1
iface vmbr1 inet static
	address  192.168.0.4
	netmask  255.255.255.0
	bridge_ports bond1
	bridge_stp off
	bridge_fd 0
```

## 確認

```bash:
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0
```

## active-backupの切り替え試験

* eth0を抜くとeth1がActiveに切り替わることを確認。
* eth0を挿すとeth1がActiveのままであることを確認。
* eth1を抜くとeth0がActiveに切り替わることを確認。
* eth1を挿すとeth0がActiveのままであることを確認。
WindowsサーバにインストールしたInfoBrightに外部から接続出来なかった時の対処



Windowsのファイヤーウォールでブロックされてました。
このコマンドで一発でポートの許可ができます。

あとは、外部接続用ユーザ作っていなかったり、AWSの場合はセキュリティグループの設定がわるかったりすることもあります。


##ファイヤーウォール許可


```
netsh advfirewall firewall add rule name="InfoBright Server" action=allow protocol=TCP dir=in localport=5029
```

![kobito.1416720146.026898.png](https://qiita-image-store.s3.amazonaws.com/0/19316/479b4128-b5e2-9ef8-0b44-8aa596b9046b.png "kobito.1416720146.026898.png")
Debugモード以外でiOSのBackground Fetch をすぐ発生させる方法


Background Fetchの動作確認をするにあたって、Release BuildでArchiveしたアプリで確認したいというケースがあり、手っ取り早く動作確認する方法を模索したところ、以下のような方法で発生しやすく感じましたので備忘録として投稿します。
まだ他にも条件があるかもしれないので、この手順でBackground Fetchが発生しない端末はあるかもしれません。

Debug時のBackground Fetchの動作確認は以下の投稿がわかりやすいです。
http://qiita.com/griffin_stewie/items/8371c09059b3ba7bb202


## 手順
###１．対象アプリを起動。
###２．対象アプリをバックグラウンドへ遷移→フォアグラウンドへ遷移を１０回程繰り返す。
###３．対象アプリのバックグラウンドへ遷移。
* 対象アプリはアプリケーションスイッチャーには残しておく。アプリケーションスイッチャーから削除するとバックグラウンドフェッチが発生しない。

###４．設定アプリで 一般 → 日付と時刻をタップ。
![IMG_2841_part.PNG](https://qiita-image-store.s3.amazonaws.com/0/37373/9ebe2a2e-1d10-e0d7-a330-5bc4d6094db8.png "IMG_2841_part.PNG")


###５．自動設定 OFFにして、日時を１日以上進める。
![IMG_2841.PNG](https://qiita-image-store.s3.amazonaws.com/0/37373/5e6d7f4c-7578-b410-be79-6c7f76253bcf.png "IMG_2841.PNG")


###６．１０秒くらい放置。これでBackground Fetchが発生する。

# まとめ
他にやり方があれば、ぜひ教えてくださいm(_ _)m
ローカルの軸をワールド空間上でのベクトルに合わせる回転行列


カメラの座標空間（いわゆるビュー座標空間）への変換は、通常の回転行列と異なります。

結論から言うと、以下のような行列になります。
（X軸(1, 0, 0)、Y軸(0, 1, 0)、Z軸(0, 0, 1)をワールド空間のWX(WXx, WXy, WXz)、WY(WYx, WYy, WYz)、WZ(WZx, WZy, WZz)という姿勢に変換する行列）

```math
\begin{vmatrix}
WXx &WYx &WZx \\
WXy &WYy &WZy \\
WXz &WYz &WZz
\end{vmatrix}
```

となります。

とても分かりやすいですね。
なんか値をそのまま配置してるだけなので、最初はそんな簡単なものでいいの？
という感じでしたが、それぞれの軸を計算してみると納得のものです。

試しにX軸(1, 0, 0)がWX(WXx, WXy, WXz)に変換されるか計算してみると、

```math
\begin{vmatrix}
WXx &WYx &WZx \\
WXy &WYy &WZy \\
WXz &WYz &WZz
\end{vmatrix}
\times
\begin{vmatrix}
1 \\
0 \\
0
\end{vmatrix}
```

```math
x = (WXx * 1) + (WYx * 0) + (WZx * 0) = WXx \\
y = (WXy * 1) + (WYy * 0) + (WZy * 0) = WXy \\
z = (WXz * 1) + (WZy * 0) + (WZz * 0) = WXz
```

なので、とある座標空間をすでに計算済の別の座標空間に合わせる場合は、とてもシンプルに行列が作れることになります。
ビュー座標変換以外でもたまに出てくるので、覚えておくと内容を追うのがスムーズになります。

Unityでは、まさにこれを利用して接空間にライトベクトルを変換するマクロが書かれていました。
Postfix + Dovecot でメールサーバ構築（Gmailと連携）

# Postfix + Dovecot でメールサーバを構築してみた。

#### 参考にさせて頂いたページ
* http://centossrv.com/postfix.shtml
* http://park1.wakwak.com/~ima/centos_postfix_relay0001.html
* http://www.postfix-jp.info/trans-2.3/jhtml/postconf.5.html

#### 環境
* サクラVPS
* CentOS 6.4
* postfix-2.6.6
* dovecot-2.0.9
* cyrus-sasl-2.1.23

## Postfixの設定(Gmailと連携)
/etc/postfix/main.cfを編集。

```
myhostname = mail.test.com
mydomain = test.com
myorigin = $mydomain

inet_interfaces = all
inet_protocols = ipv4

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

unknown_local_recipient_reject_code = 550

mynetworks_style = 192.168.32.0/23, 127.0.0.0/8
mynetworks = 192.168.32.0/23, 127.0.0.0/8

relay_domains = $mydestination
relayhost = [smtp.gmail.com]:587

home_mailbox = Maildir/

smtpd_banner = $myhostname ESMTP unknown

smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_sasl_security_options = 
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt

smtpd_tls_auth_only = no
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

message_size_limit = 10485760
 
```

## GmailのSASL認証準備
```
>vi /etc/postfix/sasl_passwd
[smtp.gmail.com]:587 test@gmail.com:password
>postmap hash:/etc/postfix/sasl_passwd
>postfix reload
```

## サービス再起動
```bash
>service postfix restart
```


### 構築時に詰まったところ。
Gmailの認証が通らない

/var/log/maillogを確認。

```
(SASL authentication failed; server smtp.gamil.com[74.125.23.109] said: 534-5.7.9 Application-specific password required. Learn more at?534 5.7.9 http://support.google.com/accounts/bin/answer.py?answer=185833 1sm2519459pdw.87 - gstmp)
```

/etc/postfix/sasl_passwdに連携するGmailのアカウントのmail-address:passwordを記入する必要性があるが、全く認証が通らずに外部にメールが送れなかった・・・。
ので、
Gmailのセキュリティ設定でアプリケーション用パスワードを取得し、記入することで解決できた。

### ちょっとした詰まるところ
* サービスが立ち上がっているか
* ポートが開いているか
  * SMTP:25
  * POP3:110
* mynetworksの設定がホストアドレスになっていないか
* myhostnameが名前解決できるようにDNS設定できているか

****

## Dovecotの設定

/etc/dovecot/10-auth.confを編集。

```
disable_p;aintext_auth = no
```

/etc/dovecot/10-mail.confを編集。

```
mail_location = maildir:~/Maildir
```

## サービス再起動

```
service dovecot restart
```
Fcitxを使っている環境で左CtrlキーとCapsLockキーを入れ替える

Fcitxは[xmodmapの設定を上書きします](https://fcitx-im.org/wiki/FAQ#Unexpected_keyboard_layout_change)。左CtrlキーとCapsLockを入れ替える程度だと（GNOMEやKDEの）設定ツールを使えばよいとFAQには書いていますが、私が使っているMATEでは設定しても上書きされてしまうようです。

Fcitx 4.2.7以降では~/.Xmodmapが存在すればロードしてくれるので、そのファイルに左CtrlキーとCapsLockキーを入れ替える設定を書くと大丈夫なようです。

```:~/.Xmodmap
keycode  37 = Caps_Lock NoSymbol Caps_Lock
keycode  66 = Control_L Caps_Lock Control_L Caps_Lock

```

この書式を解釈しているだけみたいで、特殊なキーの設定を変えるときにでもClearはしなくても問題なさそう。
bitbucketからGitHubに移行してみた

# Issuesの移行

- [bitbucket_issue_migration](https://github.com/vbabiy/bitbucket_issue_migration)のpythonスクリプトを試してみたけどSSL v3廃止に伴うエラー？で動作せず。

- [haysclark/bitbucket_issue_migration](https://github.com/haysclark/bitbucket_issue_migration)のforkで対応されていたのでこっちを使う。

- 上記スクリプトはbitbucketのprivateレポジトリに対応してない。移行元がprivateレポジトリなので、[issue](https://github.com/vbabiy/bitbucket_issue_migration/issues/8)を参考にちょっとスクリプト書き換え。

- 試してみたら、日本語コメントでエラーになってしまった。

```
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 8: ordinal not in range(128)
```

- ググったらStackOverflowに答えがあったので2行追加
http://stackoverflow.com/questions/21393758/unicodedecodeerror-ascii-codec-cant-decode-byte-0xe5-in-position-0-ordinal

```
reload(sys)
sys.setdefaultencoding("utf-8") 
```

- [書き換え後のスクリプトはここ](https://github.com/pomu0325/bitbucket_issue_migration/blob/spike/migrate.py)

# レポジトリの移行

GitHub公式のImporterで問題無し

# 注意事項

- ~~先にIssuesを移行完了しておかないと、コミットログ内の#42とかがissueへのリンクにならないので順番重要~~ -> ~~順番通りやってもなぜかリンクにならないコメントが時々あった~~ -> ちょっと待ったらリンクになったのでタイムラグあるぽい
"Configuration with name 'default' not found"が出た時の対応

何度かハマっているのでメモ。

##状況
Android Studioに手動でライブラリを追加した時。
例)
1. app/modules配下に<https://developers.facebook.com/docs/android>からダウンロードしてきたSDK(facebook-android-sdk)をそのまま配置する。
2. settings.gradleやbuild.gradleにモジュールの設定をする 

```groovy:settings.gradle
include ':app'
include ':modules:facebook-android-sdk'

```

```groovy:build.gradle
dependencies {
    compile 'com.android.support:support-v4:21.0.0'
    compile 'com.android.support:appcompat-v7:21.0.2'
    compile project(':modules:facebook-android-sdk')
}
```

3.gradle syncすると、以下のようなメッセージがでて、ビルドが通らない
Configuration with name 'default' not found

##原因
facebook-android-sdk自体がsampleも含んだひとつのプロジェクトであるのが原因。
ファイル構成として
facebook-android-sdk/
└CONTRIBUTING.mdown
└LICENSE.txt
└NOTICE.txt
└README.mdown
└bin
└build.gradle
└docs
└facebook
└gradle
└gradlew
└gradlew.bat
└libs
└samples
└settings.gradle

となっているわけなのですが,ライブラリとして利用する場合は、facebookだけが必要なモジュールです。

##解決方法
1. facebook-android-sdk/配下のfacebook/をアプリのプロジェクトのapp/modules配下におきます。

2. facebook-android-sdk/配下にあるgradle,gradlew,gradlew.batをfacebook/配下にコピーします。(不要かもしれませんが一応)

3. 設定を直します。ディレクトリ名を直します。
 
```groovy:settings.gradle
include ':app'
include ':modules:facebook'

```

```groovy:build.gradle
dependencies {
    compile 'com.android.support:support-v4:21.0.0'
    compile 'com.android.support:appcompat-v7:21.0.2'
    compile project(':modules:facebook')
}
```

これでgradle syncし直したらうまくいくようになります。
今回の例はfacebook SDKですが、他のプロジェクトでもライブラリを追加する時は同様です。
MACからRDC for MacでAWSのWindowsサーバに接続できなくなっていた


結論から言うと、
Windows 8.1ベースはRDC for Macではなく、
Microsoft Remote Desktopを使うようになったみたいです。
接続できなくてかなり焦りました。。

##Microsoft Remote Desktopのダウンロード

> https://itunes.apple.com/jp/app/microsoft-remote-desktop/id715768417?mt=12


![スクリーンショット 2014-11-23 12.05.25.png](https://qiita-image-store.s3.amazonaws.com/0/19316/e0681a7b-f3a7-91c7-6457-662268ac7a59.png "スクリーンショット 2014-11-23 12.05.25.png")

  
  
  
## こんなアイコンです
  

![スクリーンショット 2014-11-23 12.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/19316/b4e04853-d70a-9301-e8c2-8be8c81cc443.png "スクリーンショット 2014-11-23 12.05.10.png")
  


## 起動するとこんな感じです


![スクリーンショット 2014-11-23 12.04.45.png](https://qiita-image-store.s3.amazonaws.com/0/19316/85cb2880-c89c-a6bb-435f-7a1b30cf776d.png "スクリーンショット 2014-11-23 12.04.45.png")
Ansibleノウハウメモ　～目次～

Ansibleについてのノウハウをここにまとめていく

# Ansible Docs モジュール日本語訳

## Commands Modules

### scriptモジュール
- scriptモジュールは、ローカルのシェルスクリプトをリモート上で実行する
- http://qiita.com/moiwasaki/items/818c783dfe86eadb99fc

### shellモジュール
- shellモジュールは、シェル(/bin/sh)を実行する
- http://qiita.com/moiwasaki/items/bc3ce9da7f4aa2a80d61

## Files Modules

### copyモジュール
- copyモジュールはローカルにあるファイルをリモートにコピーする。
- http://qiita.com/moiwasaki/items/80a3b36c972b8ee4dac7

### fileモジュール
- fileモジュールは、ファイル/シンボリックリンク/ディレクトリの設定や削除をします。他の多くのモジュールはfileモジュールと同じオプションをサポートする。
- http://qiita.com/moiwasaki/items/e2c843e255c81a65746c

### replaceモジュール
- replaceモジュールは、ファイル内で一致するパターンの置き換えをする。
- http://qiita.com/moiwasaki/items/b6268f8f958d67afc546

### templateモジュール
- tempalteモジュールは、指定したテンプレートのファイルを設置する
- http://qiita.com/moiwasaki/items/b26ef26b76c0389fa4e3

## Packaging Modules

### yumモジュール
- yumモジュールは、yumパッケージマネージャによるパッケージやグループのインストール、アップグレード、削除、一覧表示を実行する。
- http://qiita.com/moiwasaki/items/689094df944027f9c38f

## System Modules

### serviceモジュール
- serviceモジュールは、serviceコマンドを実行する
- http://qiita.com/moiwasaki/items/c320c7073a7ef086c5c9

### userモジュール
- userモジュールは、ユーザーアカウントとユーザー属性を管理する。
- http://qiita.com/moiwasaki/items/bab0f4c8d0dbf361afa4



# Tips
Ansible ～scriptモジュール～


Ansible Documentationのscriptモジュールのメモです。


# Ansible Documentation

## 概要
- scriptモジュールは、ローカルのシェルスクリプトをリモート上で実行する

## オプション
|頻度|パラメータ |必須|デフォルト値|選択肢 |説明                                                                                                       |
|:--:|:----------|:--:|:----------:|:-----:|:----------------------------------------------------------------------------------------------------------|
|    |creates    |no  |-           |-      |指定したファイル名が既に存在する場合、シェルスクリプトを実行しない。                                       |
|※  |free_form  |yes |-           |-      |実行するシェルスクリプトのローカルパスの指定。free_formというオプション名はつけず、パスを書き始めれば良い。|
|    |removes    |no  |-           |-      |指定したファイル名が存在しない場合、シェルスクリプトを実行しない。                                         |


## 例
```yaml:example.yml
# Example from Ansible Playbooks
- script: /some/local/script.sh --some-arguments 1234

# Run a script that creates a file, but only if the file is not yet created
- script: /some/local/create_file.sh --some-arguments 1234 creates=/the/created/file.txt

# Run a script that removes a file, but only if the file is not yet removed
- script: /some/local/remove_file.sh --some-arguments 1234 removes=/the/removed/file.txt
```

# 参考
- Ansible Documentation  
http://docs.ansible.com/script_module.html
Ansible ～shellモジュール～

Ansible Documentationのshellモジュールのメモです。


# Ansible Documentation

## 概要
- shellモジュールは、シェル(/bin/sh)を実行する

## オプション
|頻度|パラメータ |必須|デフォルト値|選択肢 |説明                                                                                     |
|:--:|:----------|:--:|:----------:|:-----:|:----------------------------------------------------------------------------------------|
|※  |chdir      |no  |-           |-      |コマンドを実行する前にcdコマンドでディレクトリを移動する。                               |
|    |creates    |no  |-           |-      |指定したファイル名が既に存在する場合、コマンドを実行しない。                             |
|    |executable |no  |-           |-      |実行するシェルを絶対パスで指定する。                                                     |
|※  |free_form  |yes |-           |-      |実行するコマンドの指定。free_formというオプション名はつけず、コマンドを書き始めれば良い。|
|    |removes    |no  |-           |-      |指定したファイル名が存在しない場合、コマンドを実行しない。                               |
|    |warn       |no  |true        |-      |『no』または『false』を指定した場合、コマンド警告を出さない。                            |


## 例
```yaml:example.yml
# Execute the command in remote shell; stdout goes to the specified
# file on the remote.
- shell: somescript.sh >> somelog.txt

# Change the working directory to somedir/ before executing the command.
- shell: somescript.sh >> somelog.txt chdir=somedir/

# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# somedir/somelog.txt doesn't exist.
- shell: somescript.sh >> somelog.txt
  args:
    chdir: somedir/
    creates: somelog.txt
```

# 参考
- Ansible Documentation  
http://docs.ansible.com/shell_module.html
Ansible ～serviceモジュール～


Ansible Documentationのserviceモジュールの内容のメモです。

# Ansible Documentation

## 概要
- serviceモジュールは、serviceコマンドを実行する

## オプション
|頻度|パラメータ       |必須|デフォルト値      |選択肢                                               |説明                                              |
|:--:|:--------------  |:--:|:----------------:|:---------------------------------------------------:|:-------------------------------------------------|
|    |arguments(args?) |no  |-                 |-                                                    |引数の指定。                                      |
|※  |enabled          |no  |-                 |yes<br>no                                            |マシン起動時に自動起動させるか。                  |
|※  |name             |yes |-                 |-                                                    |サービスの名前。                                  |
|    |pattern          |no  |-                 |-                                                    |?                                                 |
|    |runlevel         |no  |default           |-                                                    |ランレベルの指定。                                |
|    |sleep            |no  |-                 |-                                                    |サービスを再起動する場合に指定秒数スリープさせる。|
|※  |state            |no  |-                 |started<br>stopped<br>restarted<br>reloaded          |started: サービスを開始する<br>stopped: サービスを停止する<br>restarted: サービスを再起動する<br>reloaded: サービスを再読み込みする|


## 例
```yaml:example.yml
# Example action to start service httpd, if not running
- service: name=httpd state=started

# Example action to stop service httpd, if running
- service: name=httpd state=stopped

# Example action to restart service httpd, in all cases
- service: name=httpd state=restarted

# Example action to reload service httpd, in all cases
- service: name=httpd state=reloaded

# Example action to enable service httpd, and not touch the running state
- service: name=httpd enabled=yes

# Example action to start service foo, based on running process /usr/bin/foo
- service: name=foo pattern=/usr/bin/foo state=started

# Example action to restart network service for interface eth0
- service: name=network state=restarted args=eth0
```

# 参考
- Ansible Documentation  
http://docs.ansible.com/service_module.html
zsh-syntax-highlightingをoh-my-zshで利用する

zshででのコマンドプロンプトの表示をリアルタイムで色付けしてくれる[zsh-syntax-highlighting](https://github.com/zsh-users/zsh-syntax-highlighting)を入れてみました。

以下のような表示結果になります。

![スクリーンショット 2014-11-23 10.39.44.png](https://qiita-image-store.s3.amazonaws.com/0/19783/07b3cf65-501a-e08e-2d0e-deb0935fb906.png)

pathの通っているコマンドは青色、通っていないコマンドは赤で表示されます。
また(個人的にこれが一番いいのですが)クォーテーションマークで囲った文字列が色付けされます。
(わかりづらいですが、藤色で`hello, world`が色付けされています)

### インストール方法

私はoh-my-zshを利用しているので、それのpluginに追加する形でzsh-syntax-highlightingをインストールします。

```
cd ~/.oh-my-zsh/custom/plugins
git clone git://github.com/zsh-users/zsh-syntax-highlighting.git
```

`$HOME/.zshrc`のpluginsにzsh-syntax-highlightingを追加します

```
plugins=(git ssh-agent ruby gem zsh-syntax-highlighting)
```

変更を反映させます

```
source ~/.zshrc
```

これで色がついていたら完了です！
NSStringEncoding と IANA 文字列とを相互に変換する


# 目的

Cocoa フレームワークで使われる ```NSStringEncoding``` と Web などで使われる ```IANA 文字列``` とを相互に変換する方法です。

> たとえば ```UTF8``` 文字セットを ```NSStringEncoding``` で表現すると ```NSUTF8StringEncoding``` になり、```IANA 文字列``` で表現すると ```utf-8``` になります。


# IANA 文字列 を NSStringEncoding に変換する

```IANA 文字列``` を ```NSStringEncoding``` に変換するには、```IANA 文字列``` をいったん ```CFStringEncoding``` にして、それを ```NSStringEncoding``` にします。

```swift
let charset = "utf-8"
let cfEncoding = CFStringConvertIANACharSetNameToEncoding(charset)
let nsEncoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding)
```

# NSStringEncoding を IANA 文字列に変換する

```NSStringEncoding``` から ```IANA 文字列``` への変換は、```NSStringEncoding```　をいったん ```CFStringEncoding``` にしてから、それを ```IANA 文字列``` にします。

```swift
let nsEncoding = NSUTF8StringEncoding
let cfEncoding = CFStringConvertNSStringEncodingToEncoding(nsEncoding)
let charset = CFStringConvertEncodingToIANACharSetName(cfEncoding)
```

---

[詳細と留意点] http://ez-net.jp/article/CA/fPXLe9NO/BrX0FGCxLZsQ/
[Shader] 一般的なブレンドの計算値


ブレンドを指定する際、どういうブレンドをするとどうなるか、というのをメモ。

例はOpenGL。

**アルファブレンド**

```
src = GL_SRC_ALPHA
dst = GL_ONE_MINUS_SRC_ALPHA
```


**加算**

```
src = GL_SRC_ALPHA
dst = GL_ONE
```


**乗算**

```
src = GL_ZERO
dst = GL_SRC_COLOR
```


**反転**

```
src = GL_ONE_MINUS_DST_COLOR
dst = GL_ZERO
```


**スクリーン**

```
src = GL_ONE_MINUS_DST_COLOR
dst = GL_ONE
```


**排他的論理和**

```
src = GL_ONE_MINUS_DST_COLOR
dst = GL_ONE_MINUS_SRC_COLOR
```
apigenのメタパッケージを作ってインストールしやすくする

phpDocumentorが余りにも使いづらいので、代わりにApiGenを使ってAPIドキュメントを作っています。

[ApiGen | API documentation generator for PHP 5.3+](http://apigen.org/)

しかしApiGenはApiGenで、一時期メンテナンスが止まっていたせいもあって、パッケージのインストールに難があります。

この記事を書いている時点で、Composerを使って以下のようにインストールしようとすると、失敗します(!) どうも依存関係が壊れているようで。

```bash
$ composer require --dev 'apigen/apigen:*'
```


[PHP - ApiGenを利用し続けるためのバッドノウハウ - Qiita](http://qiita.com/tadsan/items/75bd63d7121d0b941c2b)

こちらの記事を参考に使い続けていたのですが、いい加減面倒くさくなってきたので、バージョンを固定したメタパッケージを作ってみました。

[hirak/apigen2.8.0 - Packagist](https://packagist.org/packages/hirak/apigen2.8.0)

apigen/apigenの代わりにこっちをrequireすると、すんなりインストールできるはず。

```bash
$ composer require --dev 'hirak/apigen2.8.0:*'
```

中身は単にバージョンを固定しているだけなので、vendor/bin/apigen.phpとしてapigenコマンドがインストールされます。

apigen本家の方は、4系を今開発しているようなので、そのうちこんなバッドノウハウは必要なくなるかもしれません。
DockerのPrivate Registryをちょっとだけ使いやすくしてみる

<h1>はじめに</h1>
　今ではDocker HUBもプライベートで登録できますが、クラウドに大切なデータを置きたくないという企業ユーザーもまだ多いと思います。そんな時こそ、プライベートリポジトリを使うのかな〜と思うのですが、これがイマイチ使いにくいように思います。
　Dockerクライアントには、imagesやcontainersを登録・削除したり詳細を表示する方法が存在していますが、Private Registryにはその方法がないし、自分だけで使うしかないのか〜というところが背景です。

<h1>次善策</h1>
　と言ったものの、色々と探すと、全くない訳ではありませんでした。
　http://docs.docker.com/reference/api/docker_remote_api/
　上記にあるAPIを利用する方法です。Private Registry専用という訳ではないのでしょうが、ホスト名・ポート番号で利用できるという点で、この用途での利用も想定されていると思われます。（上記ドキュメントでも記載されているけれど、デフォルトのdockerデーモンはAF_UNIXを使っているしね。）
　
そこで、以下のようなスクリプトを.bashrcとかに入れておきます。

```.bashrc
rdock()
{
  if [ $# -lt 1 ]; then
    echo usage : rdock host
    return
  fi
  local hname
  hname=$1

  curl -s -X GET http://$hname/v1/search | tr '"' '\n' | grep library | cut -b 9-
}
```

$ rdock hostname:5000
centos
jpetazzo/nsenter

と、こんな感じにPrivate Registryに入っているimageを取得する事ができるので、それを元に、dockerクライアントを利用してcontainerを作る事ができわけです。

<h1>そこで、あと一歩</h1>
まぁ、自分一人ならこれでも良いけど、チーム内とかで利用するとなれば、ブラウザとかで参照できた方が良いよね。さらに、誰かが作成したimageがどんなもので、どう利用するかといった情報がないと使いにくいかなと思う訳です。Docker HUBでも色々と付加情報を追加できるしね。

https://github.com/0bara/docker-registry-ui
ちょっと、いや、かなり、laravelを使っている意味がないような実装をしてしまっていて、あれな感じなのですが、時間があれば、もう少しそれっぽくしたいと考えていますが、とりあえず感満載ですw

上記を利用して、せっかくなので、dockerで動作するようにしてみました。それが、以下にあるDockerfileです。
https://github.com/0bara/docker-registry-websystem

![スクリーンショット_2014-11-23_2_28_40.png](https://qiita-image-store.s3.amazonaws.com/0/16828/2f7d9dd0-d51b-8ea2-e9f7-c8eaf07e5874.png)

<h1>準備</h1>
<h2>Private Registry</h2>
まずは、Private Registryを作っておいてください。これについては、色々と記事になっているので、それを参考にしていただく事にします。基本は以下で良いのですが、containerイメージ格納エリアをホスト側に用意した方が良いです。

$  sudo docker run -d -p 5000:5000 samalba/docker-registry

<h2> 起動 </h2>
$ git clone https://github.com/0bara/docker-registry-websystem.git
$ sudo docker build -t drwsys:1.0 docker-registry-websystem
$ sudo docker run -p 8080:80 -d drwsys:1.0

<h2> proxy </h2>
apache httpdの場合の設定

``` /etc/httpd/conf.d/srv.conf
$ cat /etc/httpd/conf.d/srv.conf 
ProxyPass /repo http://localhost:8080/

<Location /repo/>
  # mod_proxy_html
  ProxyPassReverse https://localhost:8080/
  RequestHeader unset Accept-Encoding
  ProxyPassReverseCookiePath / /repo/
</Location>
```

上記の設定により、http://hostname/repo/ でアクセスできるようになります。
<h2> firewall </h2>
ローカル Registryにアクセスする為のポートを開ける必要があります。これに関しては具体的な方法は各自ご確認ください。

<h1> 使い方 </h1>
表示するだけなら、ブラウザで「 http://hostname/repo/ 」のURLにアクセスすればよい。各イメージ名、タグごとにTitle/Descriptionを設定可能としている。Title/Descriptラベルの右側領域をタップすると、入力可能なテキストが表示される。

<h1> 最後に </h1>
今のところ、使い勝手としては、それほど良くないとは思いますw 登録内容が増加した時に検索ができないなど色々と改善点がありますが、ご容赦を。
また、既に同様のものがあれば教えてください。

「プライベートリポジトリ」って表現はおかしいので修正しました（照
改行無し終端テキストを扱う

# 問題

この問題、解けるだろうか?

> 標準入力から与えられるテキストデータで、見出し行（インデント無しで大文字1単語だけの行と定義）を除去するフィルターを作れ。
>
> **ただし、それ以外の変化は一切させないこと。** 例えば入力テキストデータの最後が改行で終わっていない場合は、出力テキストデータも改行で終わらせてはならない。

問題文の前半だけなら簡単だ。grepコマンド1個で簡単に書けてしまう。

```bash:grep一発でできる
$ printf 'PROLOGUE\nA long time ago...\n' | grep -v '^[A-Z]\{1,\}$'
A long time ago...
$ 
```

だがテキストが改行コードで終わってない場合は、加工後の文字列にも勝手に改行コードを付けてはいけない。つまり次のような動きだ。

```bash:こういう動きをするをANSWER部分のコード作れというのがこの問題
$ printf 'PROLOGUE\nA long time ago...\n' | ANSWER
A long time ago...
$ 
$ printf 'PROLOGUE\nA long time ago...' | ANSWER
A long time ago...$ 
```

テキストを出力する時、**多くのUNIXコマンドでは行末に自動的に改行コードが付加される**ので一筋縄ではいかないというわけだ。

さて、どうやるか。

# Thinking time

　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：
　：

# こたえ

```bash:
(cat -; echo)          |
grep -v'^[A-Z]\{1,\}$' |
awk 'BEGIN{
       ORS="";
       OFS="";
       getline line;
       print line;
       dlm=sprintf("\n");
       while (getline line) {
         print dlm,line;
       }
     }'
```

つまり、加工をするコマンド（この例では`grep -v'^[A-Z]\{1,\}$'`）の前に

```bash:
(cat -; echo)
```

をパイプで挿み、加工をするコマンドの後に、

```bash:
awk '
BEGIN{
  ORS="";
  OFS="";
  getline line;
  print line;
  dlm=sprintf("\n");
  while (getline line) {
    print dlm,line;
  }
}
'
```

をパイプ越しに追加すればよい。

## ただしsedは例外

もし見出し行を除去するフィルターをsedコマンドで`sed '/^[A-Z]\{1,\}$/d'`と思いついていたとして、それを活用するのならこう答えるのが無難だ。

```bash:
(cat -; echo)          |
sed '/^[A-Z]\{1,\}$/d' |
grep '^'               | # (結局grep使っているけど)これが更に必要
awk 'BEGIN{
       ORS="";
       OFS="";
       getline line;
       print line;
       dlm=sprintf("\n");
       while (getline line) {
         print dlm,line;
       }
     }'
```

**GNU版のsedは、改行無し終端テキストに改行コードを付けずに出力する**ことがわかった。テキストの最後に改行コードを付け足すsed実装も存在する中で、どちらでも動くようにするには、sedの後ろに`grep '^'`などと、必ずテキスト終端に改行を付け足すコマンドを挿んで、挙動を揃える必要がある。

## その他、改行コードを**付けない**フィルターコマンド

cat、dd、head、tail、trなど。

これらは、元々改行コードを付けないコマンドなので本Tipsのような細工は不要だ。

# 解説

多くのUNIXコマンドは、改行が無いと途中のコマンドが勝手に改行を付けてしまうが、それは困る。そこで先手を討って先に改行を付けてしまう。そうすると、途中に通すコマンドが勝手に改行を付けることは無くなる。そして最後に末端の改行を取り除けばいいというわけだ。

というわけで、前後に追加したコマンドはそれぞれ、元のテキストデータの最後に改行コードを1つ付加し、最後にそれを取り除くということをやっている。最初の付加をしているコードは分かりやすいだろうが、最後の除去をしているコードはどうやっているのか。

AWKコマンドの性質を1つ利用している。AWKコマンドは、printfで改行記号`\n`を付けなかったり、組み込み変数ORS（出力レコード区切り文字）を空にしたりすれば行末に改行コードを付けずにテキストを出力できる。後ろに追加したAWKはこの性質を利用し、普段なら改行コードを出力した時点で行ループを区切るところを、行文字列を出力して改行コードを出力する手前で行ループを一区切りさせるようにしてしまう。

そうすると一番最後の行のループだけは不完全になり、最後の行の文字列の後ろに改行コードが付かないことになる。

しかし、予め余分に改行を1個（つまり余分な1行）を付けておいたので、不完全になるのはその余分な1行ということになる。結果、元データの末端に改行が含まれていなければ末端には改行が付かないし、あれば付く。

言葉では分かり難いかもしれないが、図で解説するとこんな感じだ。

```text:
str_1<LF>
str_2<LF>
  :
str_n<LF有ったり無かったり>
```

↓(末端に改行コードを付加)

```text:
str_1<LF>
str_2<LF>
  :
str_n<LF有ったり無かったり><LF>
```

↓(加工する。各行末に必ず改行コードがあるので、勝手に付加されない)

```text:
STR_1<LF>
STR_2<LF>
  :
STR_n<LF有ったり無かったり><LF>
```

↓(各行末の改行コードが次行の行頭に移動したように扱う)

```text:
STR_1
<LF>STR_2
  :
<LF>STR_n<LF有ったり無かったり>
<LF>
```

↓(最終行の改行をトル)

```text:
STR_1
<LF>STR_2
  :
<LF>STR_n<LF有ったり無かったり>
```

||(これってつまり……)

```text:
STR_1<LF>
STR_2<LF>
  :
STR_n<LF有ったり無かったり>
```

ちょっと不思議な気もするが、そういうことだ。
IRKitのマニュアルセットアップ


公式アプリを使わないでセットアップする場合のメモ。IRKit Internet APIを使って外部からIRKitを操作するまでの手順。公式ページだと1手づつ進めるのにページを行ったりきたりしないといけないので、時系列に並べた。

## APIキーの取得

```bash
$ curl -i -d "email=hagino.3000@gmail.com" "https://api.getirkit.com/1/apps"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Sat, 22 Nov 2014 16:40:21 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 92
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-Content-Type-Options: nosniff

{"message":"You will receive an email shortly, please click the URL in it to get an apikey"}%
```

指定したメールアドレスに確認メールが届くのでそこからAPIキーを入手できる。

## ClientKeyの取得

APIKeyを使う。

```bash
$ curl -i -d "apikey=$MY_API_KEY" "https://api.getirkit.com/1/clients"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Sat, 22 Nov 2014 16:42:59 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 48
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-Content-Type-Options: nosniff

{"clientkey":"$MY_CLIENT_KEY"}%
```

## DeviceKeyの取得

ClientKeyを使う。

```bash
$ curl -i "https://api.getirkit.com/1/devices" -d "clientkey=$MY_CLIENT_KEY"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Sat, 22 Nov 2014 17:23:39 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 94
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-Content-Type-Options: nosniff

{"devicekey":"$MY_DEVICE_KEY","deviceid":"$MY_DEVICE_ID"}%
```

## Wifi接続先の指定

DeviceKeyとwifi接続情報を使う。

まず

1. リクエストボディのシリアライズ、[このページ](http://jsdo.it/mash/keyserializer-test)のJSコードをコピペして実行すれば良い。
1. 作業マシンをIRKitのwifiに接続する、IRKitのwifi APが無い場合はIRKit本体をリセットする。
1. IRKitの箱に添付されているwifi APのパスワードを入力する
1. IRKitのwifiに接続できた事を確認する

この時IRKitのIPアドレスは 192.168.1.1 になる。この状態で次のコマンドで /wifi を叩く。

```bash
$ curl -i "http://192.168.1.1/wifi" -d '$SERIALIZED_BODY'
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.2.0.g424fa95
Content-Type: text/plain
```

ランプが青の点灯になればOK。作業マシンをIRKitのwifiネットワークから外して元のネットワークに戻す。

## リモート接続の確認

ClientKeyとDeviceIdを使う。

これは外部のIRKitサーバーから、IRKitへの疎通確認である。hostnameが返ってこればIRKit Internet API経由でIRKitを操作できる。

```bash
$ curl -i "https://api.getirkit.com/1/door" \
     -d 'clientkey=$MY_CLIENT_KEY' \
     -d 'deviceid=$MY_DEVICE_ID'

HTTP/1.1 200 OK
Server: ngx_openresty
Date: Sat, 22 Nov 2014 17:38:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 24
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With
X-Content-Type-Options: nosniff

{"hostname":"IRKitXXXF"}%
```
Web サイトに Twitter / GitHub への リンク・フォローボタン等を追加する

# Web サイトに Twitter / GitHub への リンク・フォローボタン等を追加する
## 概要
Web サイトに Twitter / GitHub への リンク・フォローボタン等を追加します

## Twitter
### ツイートボタン
下記 URL でボタン追加用のコードを取得します。
https://about.twitter.com/ja/resources/buttons

私の GitHub のパーソナルページに Twitter へのリンクボタン を作成してみます

~~~html
<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://tbpgr.github.io/" data-text="Tbpgr Personal Page" data-via="tbpgr" data-lang="ja" data-size="large">ツイート</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
~~~

配置してみました

![twitter_link.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9b931271-27c9-bfc0-5e17-1318329b77f1.png)

### ウィジェットの配置
Twitter 公式クライアントの設定 => ウィジェット => 新規作成を選択 し、コードを取得します。

~~~html
<a class="twitter-timeline" href="https://twitter.com/tbpgr" data-widget-id="536218452210372608">@tbpgrさんのツイート</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
~~~

配置してみました

![twitter_tl.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3a86014b-7378-ec91-f716-478dd9cbfec7.png)

## GitHub
### GitHub の自アカウントへのリンク
Font Awesome のアイコンを利用します。

[Font Awesome | github icon](http://fortawesome.github.io/Font-Awesome/icon/github-square/)

埋め込みコードは以下です。

~~~html
<a href="https://github.com/tbpgr"
    target="_blank"
    title="tbpgrのGitHubページを開く">
  <i class="fa fa-github-square" style="color: black;font-size:2em"></i>
</a> 
~~~

配置してみました

![github_link.png](https://qiita-image-store.s3.amazonaws.com/0/43480/651c102e-bef7-ffa0-0e7c-efd02ff91dc7.png)

### GitHub フォローボタンの配置
[buttons.github](https://buttons.github.io/) を利用します。

~~~html
<!-- Place this tag where you want the button to render. -->
<a class="github-button" href="https://github.com/tbpgr" data-style="mega" data-count-href="/tbpgr/followers" data-count-api="/users/tbpgr#followers">Follow @tbpgr</a>
~~~

そして、 body タグが閉じる直前に下記を追加します

~~~html
<!-- Place this tag right after the last button or just before your close body tag. -->
<script async defer id="github-bjs" src="https://buttons.github.io/buttons.js"></script>
~~~

その他

* Watch
* Star
* Fork
* Issue
* Download

ボタンを作成可能です。

![github_follow.png](https://qiita-image-store.s3.amazonaws.com/0/43480/02fd51bf-9eeb-449c-b38b-12e3ecad84bc.png)

## 参照
[tbpgr GitHub Personal Page](http://tbpgr.github.io/)
[tbpgr GitHub](https://github.com/tbpgr)
[Font Awesome](http://fortawesome.github.io/Font-Awesome/)
[Font Awesome | github icon](http://fortawesome.github.io/Font-Awesome/icon/github-square/)
[Twitter Buttons](https://about.twitter.com/ja/resources/buttons)
Railsのマイグレーション番号を自分で管理してみた(ソロ開発)

今回の開発(趣味開発)で、Railsのマイグレーションバージョンを手動で管理するようにしました。

![migrate-versions.png](https://qiita-image-store.s3.amazonaws.com/0/13836/7a4af81e-c433-854d-8347-dbff4d02f22e.png)

こんな感じ。

---

開発初期って、結構**「あー。このカラムも必要だなー…」**ってなるので。マイグレーションファイルを作った後に。

その度にいちいち`rails g migration add_column ...`とするのは結構面倒・・・と言うよりも**「マイグレーションファイルが大量に作られるのがうざい(そして後々見た時、量が多すぎて訳が分からない…)」**。

あと新たにDB作ったりリセットする時にすごーく時間がかかる(schema.rbに頼らずマイグレーションを行う場合)。

マイグレーションファイルの先頭番号は整数で6桁としたのですが、連番ではなく、飛び飛びで番号を書いています。


なんでかって言うと、途中にマイグレーションを**「あっ。」**って差し込んだりするからですね。「あっ」て。

通常のマイグレーション生成では完全に時系列なので起こりえないのですが、後からマイグレーションを遡って治したりするので、こういう事が起こるわけです(しかも結構がっつり外部キー追加しちゃったりする)。

そしてどうも、Rails4からなのか(昔は出来なかった気がする…)途中に差し込まれたマイグレーションがあっても、`rake db:migrate`で流してくれる(昔=3系の時は、一番最後のバージョンしか見てくれてなかった…気がする、記憶違い…？)。

ので、`rake db:migrate:up VERSION=xxx`とかイチイチ指定しなくていい。素敵！！

---

使ってる感じでは、悪く無いです。
マイグレーションとかも自由に遡ったり出来るし、後から見た時にもわかりやすいし綺麗。

昔のマイグレーション直した時も、何回かロールバックすればいい話だと思います(STEP=xとかで)。でも大体古いの程修正は入りにくい(仕様として固まってる)ので、そんなに大量にロールバックする事はないですね。

リリースしちゃうとこういう管理は出来ませんが、リリースするまで、及びリリースとリリースの間ではこういう運用をやってみるのも、アリだと思います。

---

追記: リリースする毎に一番上位の桁数上げるとかやってみようかなー。そういうのも面白いかも。
今後の運用に乞うご期待！
Amazon の Product Advertising API を使う

# Product Advertising API
Amazonの商品情報を検索できるAPI

## 公式のJava実装
http://docs.aws.amazon.com/AWSECommerceService/latest/DG/AuthJavaSampleSig2.html

## Scalaで書いてみる

```scala:amazon.scala
import java.io.UnsupportedEncodingException
import java.net.URLEncoder
import java.text.SimpleDateFormat
import java.util.{TimeZone, Calendar}
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import org.apache.commons.codec.binary.Base64
import scala.collection.SortedMap
import scala.collection.immutable.TreeMap
import scala.io.Source
import scala.collection.JavaConversions._

/**
 * Created by FScoward on 2014/11/21.
 */
class Amazon {
  private val accessKey = "秘密"
  private val secretAccessKey = "秘密"
  private val HMAC_SHA_256 = "HmacSHA256"
  private val UTF8_CHARSET = "UTF-8"
  private val REQUEST_URI = "/onca/xml"
  private val REQUEST_METHOD = "GET"
  private val endpoint = "ecs.amazonaws.jp"

  // 初期化
  val mac = {
    val secretAccessKeyBytes = secretAccessKey.getBytes(UTF8_CHARSET)
    val secretKeySpec = new SecretKeySpec(secretAccessKeyBytes, HMAC_SHA_256)
    val mac = Mac.getInstance(HMAC_SHA_256)
    mac.init(secretKeySpec)
    mac
  }

  def sign(params: Map[String, String]) = {
    val sortedParams = TreeMap.empty[String, String] ++ params ++ Map("AWSAccessKeyId" -> accessKey, "Timestamp" -> timestamp)
    val canonicalQS = canonicalize(sortedParams)
    val toSign = s"""$REQUEST_METHOD\n$endpoint\n$REQUEST_URI\n$canonicalQS"""
    val sig = percentEncodeRfc3986(hmac(toSign))
    val url = s"""http://$endpoint$REQUEST_URI?$canonicalQS&Signature=$sig"""
//    Source.fromURL(url)
    println(url)
  }

  // hmac 生成
  private def hmac(stringToSign: String) = {
    try {
      val data = stringToSign.getBytes(UTF8_CHARSET)
      val rawMac = mac.doFinal(data)
      new String(new Base64().encode(rawMac))
    } catch {
      case e: UnsupportedEncodingException => throw new RuntimeException(UTF8_CHARSET + "is unsupported!", e)
    }
  }

  // タイムスタンプ生成
  private def timestamp = {
    new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") {
      this.setTimeZone(TimeZone.getTimeZone("GMT"))
    }.format(Calendar.getInstance.getTime)
  }

  // 整形
  private def canonicalize(sortedParamMap: SortedMap[String, String]) = {
    val builder = new StringBuilder
    sortedParamMap.entrySet().iterator().foreach{ kvpair => 
      builder.append(percentEncodeRfc3986(kvpair.getKey))
      builder.append("=")
      builder.append(percentEncodeRfc3986(kvpair.getValue))
      builder.append("&")
    }
    builder.deleteCharAt(builder.lastIndexOf("&"))
    builder.toString
  }

  // + * %7E を変換
  private def percentEncodeRfc3986(string: String): String = {
    try {
      URLEncoder.encode(string, UTF8_CHARSET)
        .replace("+", "%20")
        .replace("*", "%2A")
        .replace("%7E", "~")
    } catch {
      case e: UnsupportedEncodingException => string
    }
  }
}
```

Scalaっぽい書き方とは？
誰か教えて下さい。
Django形式のテンプレートファイルにjsonデータを適用するコマンドラインツールdteを作った

# なぜ

動的に設定ファイルを作るときに単純な変数展開程度ならシェルスクリプトのヒアドキュメントで十分ですが、ループが必要になるとテンプレートエンジンを使いたくなってきます。

ということで、[Djangoテンプレート言語]( https://docs.djangoproject.com/en/dev/topics/templates/ )のテンプレートファイルにjsonデータを適用するコマンドラインツールを作ってみました。

ソースは
https://github.com/hnakamur/dte
にあります。

# インストール

OS X, Linux, WindowsではバイナリファイルをダウンロードすればOKです。

OS X

```
curl -O https://hnakamur.github.io/dte/download/darwin_amd64/dte
```

Linux 64bit

```
curl -O https://hnakamur.github.io/dte/download/linux_amd64/dte
```

Linux 32bit

```
curl -O https://hnakamur.github.io/dte/download/linux_386/dte
```

Windows 64bit

```
curl -O https://hnakamur.github.io/dte/download/windows_amd64/dte
```

Windows 32bit

```
curl -O https://hnakamur.github.io/dte/download/windows_386/dte
```

# 使い方の例

example/data.json

```
{
  "persons": [
    {"name": "Alice"},
    {"name": "Bob"},
    {"name": "Charlie"}
  ]
}
```

example/hello.tpl

```
{% for person in persons %}{% if not forloop.First %}
{% endif %}Hello, {{ person.name }}!{% endfor %}
```

実行例

```
$ ./dte -j example/data.json example/hello.tpl
Hello, Alice!
Hello, Bob!
Hello, Charlie!
```
Goのtext/template形式のテンプレートファイルにjsonデータを適用するコマンドラインツールtteを作った

# なぜ

動的に設定ファイルを作るときに単純な変数展開程度ならシェルスクリプトのヒアドキュメントで十分ですが、ループが必要になるとテンプレートエンジンを使いたくなってきます。

ということで、[Goのtext/template形式]( http://golang.org/pkg/text/template/ )のテンプレートファイルにjsonデータを適用するコマンドラインツールtteを作ってみました。
tteはtext template executorの略です。

ソースは
https://github.com/hnakamur/tte
にあります。

# インストール

OS X, Linux, WindowsではバイナリファイルをダウンロードすればOKです。

OS X

```
curl -O https://hnakamur.github.io/tte/download/darwin_amd64/tte
```

Linux 64bit

```
curl -O https://hnakamur.github.io/tte/download/linux_amd64/tte
```

Linux 32bit

```
curl -O https://hnakamur.github.io/tte/download/linux_386/tte
```

Windows 64bit

```
curl -O https://hnakamur.github.io/tte/download/windows_amd64/tte
```

Windows 32bit

```
curl -O https://hnakamur.github.io/tte/download/windows_386/tte
```

# 使い方の例

example/data.json

```
{
  "persons": [
    {"name": "Alice"},
    {"name": "Bob"},
    {"name": "Charlie"}
  ]
}
```

example/single.tpl

```
{{ range $i, $_ := .persons }}{{ if gt $i 0 }}
{{ end }}Hello, {{ .name }}!{{ end }}
```

実行例

```
$ ./tte -j example/data.json example/single.tpl
Hello, Alice!
Hello, Bob!
Hello, Charlie!
```
特定のメソッドの存在を調べるメタ関数


特定の宣言のメンバ関数があるかどうかを調べられるメタ関数が必要だったので作ってみた。
これがあれば、例えば以下のようなメタ関数を定義することができる。

```cpp
// range-based for loopsが利用可能かどうか
template< class T >
struct is_ranged
  : typename std::integral_constant< bool,
      has_begin< typename T::const_iterator (T::*)() const >::value && // 読み取り専用のbegin()を持っている
      has_end< typename T::const_iterator (T::*)() const >::value >::type {}; // 読み取り専用のend()を持っている

template< class T >
struct is_ranged< T[] > : std::true_type {}; // 生配列は問答無用でOK
```

上の例では、`has_begin`と`has_end`というメタ関数が必要です。メンバ関数の宣言を受け取るので、オーバーロードなどにも完全に対応しているのが特徴です。しかしその関数名ごとに何度も定義しなおしてやらなければならないのが面倒ですね。
以下に`has_func`メタ関数を示します。名前さえ変えてしまえばどんなメソッドにも対応することができますので、マクロを用意すると楽になると思います。

```cpp
//
// determine if MemfunType is available
template< class MemfunType >
struct _has_func
{
private:
  static std::false_type confirm(...);
  template< class U >
  static auto confirm(U u)->decltype(
    static_cast< MemfunType >(&U::METHOD),
    std::true_type());

public:
  static constexpr bool value = decltype(
      confirm(std::declval< rinse::owner_t< MemfunType > >()))::value;
};
template< class MemfunType >
struct has_func
  : rinse::meta_bool< _has_func< MemfunType >::value > {};
```
日時のフォーマット（ISO 8601）

日付や時間の情報をやり取りするフォーマットはいくつも存在します。
APIなどで利用するのにシンプルで分かりやすいものは ISO 8601 です。

# ISO 8601

|Format|Time zone|Sample|Sample2|
|---|---|---|---|
|`yyyy-MM-ddTHH:mm:ss`|日本標準時(JST)|2014-10-10T13:50:40+09:00|20141010T135040+0900|
|~|協定世界時(UTC)|2014-10-10T04:50:40Z|20141010T045040Z|

ISO 8601 の中でも書き方は色々とありますが

* 年月日と時間
* タイムゾーンに対応
* 年は4桁（2桁では年が確定できない）
* 単位は秒まで（ミリ秒も可能だが桁数が定まっていないため）

という条件から利用しやすいフォーマットです。

# 利用実例

* YouTube Data API
 * https://developers.google.com/youtube/v3/docs/videos?hl=ja

* AWS (Amazon Web Services) の一部のサービス

* Kintone
 * https://cybozudev.zendesk.com/hc/ja/articles/201941754-REST-API%E3%81%AE%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98#step6