OmniAICreator/Qiita-1.07M huggingface dataset:
ノンプログラマと初心者はコメントから書いた方がいいんじゃないか？

私はプログラマじゃないんだけど、業務上ちょっとラクするためにとか工作上必要だから、とかでちょびちょびわからないなりにプログラムを書いたりする。
でおもったのが「コメントから書いた方がいいんじゃね？」ってこと。

#対象

- プログラマじゃないけどちょっと書くよって人とかプログラムはじめたばかりの人
- だいたい100行以下くらいで書いてる人

っていうかそれ以外のことはわからん

#どうやるの？

**コードを書き始める前に先にコメントを書く**。それだけ。

もちろんコードを書いていく中でコメントはそれにあわせて変えていったらいい。
コメントを書く時点でインデントをしておくとよりみとりやすい。

#よいこと

##途中で分けわからなくならない

初心者だと「こんなかんじかな？」で書いていって、ちょっとすると、「あれ？どう考えてこうかこうとおもったんだっけ」とかなりやすい。しかも書くのが遅いからよりそういうことがおこる。けど、コメントを書いておけば「こう考えてるから今はこう書く」というのを常に持っていられる。全体像がわかっているからその場所のコードに集中することができる。

##書きやすいところから書き始められる
初心者はコードのうち「わかっている部分」が少ない。わかっていないところからはじめるのは苦しいし進まないので嫌になりやすい。かといって途中から書くと全体が見通せていなくてぐちゃぐちゃになったり書き直しになったりする。けど、コメントを書いておけば、とりあえず途中のわかるところからはじめられるので、楽しい。楽しいのでわからないところもちょっとづつやる気になって進める。

##部分的にテストしやすい
１行とか2行のコードでさえ動かないのが初心者。こまめにテストしたいところ。コメントを書いとくとテストしやすいし、テストしながら意味が分からなくなったりもしない。

##後で使いやすい
プログラマじゃないと、書いたものを人に見せる機会が少ない。とするとついついコメントを書かなくなりがちだけど、コメントを先に書いとけばもちろんそんなことはない。ノンプログラマは別に毎日コード書いてる訳じゃないのでどんどん忘れるし、基本的に動けばいいのでコード流用上等！である。未来の自分のためにコメントを書こう。

#最後に
やっぱり始めに見取り図を書いてやるとラクなきがする。あと、人にも相談しやすい。
ノンプログラマーもプログラムちこっとかけた方が世界が楽になるので、
コメント書いてコード書いたらいいと思うんだ。
gitのコマンドが長くてダルいので、 .zshrc と .gitconfig を使って短縮する。

今、[LOUPE](http://lo-upe.com/)という会社でインターンやってて、GitHubのお世話になりまくりなんだけど、gitのコマンドって長くてダルいですよね。

というわけで、 .zshrc と .gitconfig に色々書いて少しでもタイプ数を減らしましょう。

##.zshrcの設定
まずは ~/.zshrc からいじっていきましょう。
他のシェルを使ってる人は適宜読み替えてください。（たぶん一緒なので）

```
alias g=git
```

まずはコレ。
今まで

```
git commit -m "Commit message"
```

みたいにやってたのが、

```
g commit -m "Commit message"
```

って感じにできるようになりました。

##.gitconfig の設定
お次は ~/.gitconfig をいじりましょう。

```
[alias]
    st = status -sb
    df = diff
    co = checkout
    b = branch
```

こうしてやれば、

```
g co -b fix-hogehoge

```

```
g b -a
```

とかみたいに、タイプ数を減らすことができます。

べんり。
エクセル実務：リストからマスタに含まれる文字列を返す

業務で関数でできないかと思ったらうまくできなかったので本めくりながらVBAをかいてみたのでメモ。
ちょっと応用してやれば最近の業務上けっこう使えそう。

#やりたいこと
リストAにぐちゃぐちゃに入った文字列から、マスタBに一致するものを抜き出す。
つまりこういうデータがあって、
![スクリーンショット 2014-08-04 20.08.02.png](https://qiita-image-store.s3.amazonaws.com/0/39559/f1226b70-0852-0979-07b1-50e407d2dbf9.png)

マスタには「リンゴ」とか「バナナ」とか「ミカン」とか入っている状態。
（もちろん業務ではそんなかわいくないけどね！っていうかデータベースにベタの文字列が入ってるのとか同じ内容が別のフィールドに入ってるのほんとやめてほしい）

#コード

```vbnet
Sub 市町村名抜出()

Dim name As String
imasta = 4
idata = 2

'最終行を取得
datalast = Worksheets("listA").UsedRange.Rows.Count
mastalast = Worksheets("masta").UsedRange.Rows.Count

'マスタの最終行まで繰り返す
Do While idata <= datalast

    'マスタの最終行まで繰り返す
    Do While imasta <= mastalast
        'マスタのimasta行目の名称をnameに格納
        name = Worksheets("masta").Cells(imasta, 3).Value

        'データシートのidata行目にnameが入っていないか確認
        '入っていた場合nameをデータシートのidata行目に格納
        If Not Worksheets("listA").Cells(idata, 37).Find(name) Is Nothing Then
            Worksheets("listA").Cells(idata, 39) = name
            Exit Do'見つかったらループ抜ける            
        '入っていなかった場合にはマスタの次の行へ
        Else
                imasta = imasta + 1
        End If
    Loop
    'マスタの最終行までいったらimastaをリセットし、データシートの次の行へ
    imasta = 4
    idata = idata + 1
    name = ""
Loop
ExcelVBAでスクリーンショットを取る方法

#コード（VBA）
```
'64bit版
Private Declare PtrSafe Sub keybd_event Lib "user32" ( _
    ByVal bVk As Byte, _
    ByVal bScan As Byte, _
    ByVal dwFlags As Long, _
    ByVal dwExtraInfo As Long _
        )

'32bit版
'Private Declare Sub keybd_event Lib "user32" ( _
    ByVal bVk As Byte, _
    ByVal bScan As Byte, _
    ByVal dwFlags As Long, _
    ByVal dwExtraInfo As Long _
        )

Public Sub 全体を撮る()
    keybd_event vbKeySnapshot, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1 Or &H2, 0&
End Sub

Public Sub アクティブ画面を撮る()
    keybd_event &HA4, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1 Or &H2, 0&
    keybd_event &HA4, 0&, &H1 Or &H2, 0&
End Sub
```

#参考サイト
[Excel VBA を学ぶなら moug モーグ | 即効テクニック | 画面をキャプチャする](http://www.moug.net/tech/exvba/0150121.html)
統計量の目視と外れ値の検出

先日は[要約統計量の可視化](http://qiita.com/ynakayama/items/c8e49343ab451188c42c)をおこない、箱ひげ図と散布図の混合プロッティングをしてみましたが、ここからデータを詳しく追っていきましょう。

## 箱ひげ図の見方

箱ひげ図 (boxplot, BP) はデータの散らばり具合を示すグラフのひとつで、 2012 年から学習指導要領、高校数学 I 「データの分析」において取り上げられています。高校数学の必修範囲です。

箱には全データの半数 (25% 〜 75%) までが含まれます。したがいまして、箱の範囲内にあるデータはその集団を代表するデータの集まり、そこから外れたひげの示すデータがやや特殊なデータとみなすことができます。こういった観点からデータの特徴を明らかにしていきます。

箱の分割線 (= 中央値) が箱のどの位置にひかれているか、箱の位置は全体のどのような範囲にあるか、ひげの末端はどこに位置するか、外れ値はどれくらいあるかということを見ていきます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/ccb93950-7fa3-685b-c68b-2443cd6787f8.png)

上の例では時系列データのある一時期において、いつもより高い値に観測されたデータが一部存在していることが伺えます。

## 細部を目視する

細かい特徴を目視で追うにあたり、いくつかのツールがありますが特にポピュラーなのは表計算ソフトを使う方法です。自由ソフトウェアとしては [LibreOffice](https://ja.libreoffice.org/) 、商用のソフトウェアとしては [Excel](http://office.microsoft.com/ja-jp/excel/) などが有名です。

結局のところ手法やツールに頼っても最終的には人間の判断を必要としますので、これらのツールを使って特徴の正体を明らかにしてきます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/805c3205-a043-63d1-580c-7b9b5b11cb11.png)

手法を駆使しながら、人間の目で見て推測可能な仮説を立てていくことになります。

## 外れ値を検出する

外れ値とは「他の値から大きく外れた値」のことです。大きく言うとたとえば

* 金融・経済 … 株価の上昇や下落など景気の変動予測につながる値
* 工学・製造 … 生産ラインでの不良品検出
* 医薬・バイオ … 薬効の有無、病原の発現など
* Web … 障害の予測、攻撃の検知など

といったように多くの分野で応用されます。

### 標準偏差による検出

データの分布を正規分布に従うと仮定したとき、標準正規分布で平均値から標準偏差の 2 倍または 3 倍離れた値を外れ値とみなす方法です。

### 多重比較法

多群のデータにおける互いに有意な差がある平均を探索する[分散分析](http://qiita.com/ynakayama/items/d332d77ae40a6827345b)、またそれと併用する Tukey の範囲検定があります。これは 2 つの平均のより大きなものからより小さなものを引き、それをデータの標準偏差で除算する方法です。

Tukey の検定は次式に従います。

```math
q_s = \frac {(\mu_A - \mu_B)} {\sigma}
```

### スミルノフ・グラブス (Smirnov-Grubbs) 検定

データ集合に正規分布を仮定、自由度 n-2 の t 分布の α / n の 100 パーせんタイルを t としたときに

```math
\frac {(n-1)^t} {\sqrt{n(n-2)+nt^2}}

```

を有意な差とみなす方法です。これは標本数 n 有意水準 α の片側棄却検定によっておこなわれます。



## まとめ

Tukey 法は検出力が強く、スミルノフ検定は外れ値検出の代表的手法です。いずれにせよ何の目的のためにどのようなデータを検出するかを明らかにしながら、さまざまな方法でデータを調査していく必要があります。
インデントが深いとリンクが表示されない。バグ?


```
- depth1
    - link: [Google](https://www.google.co.jp/)
    - depth2
       - link: [Google](https://www.google.co.jp/)
       - depth3
           - link: [Google](https://www.google.co.jp/)
           - depth4
               - link: [Google](https://www.google.co.jp/)
```

- depth1
    - link: [Google](https://www.google.co.jp/)
    - depth2
       - link: [Google](https://www.google.co.jp/)
       - depth3
           - link: [Google](https://www.google.co.jp/)
           - depth4
               - link: [Google](https://www.google.co.jp/)
IMAP サーバーに残っている特定のフォルダに入ってるメールを消すやつ

iPhone でメールを送信すると送信済みにメールデータが残っているのが鬱陶しかったので fetchmail で削除するようにしました｡

<pre>
poll imap_server
        proto imap
        timeout 30
        username imap_user_name
        password imap_password
        ssl #必要であれば
        folder Sent
        flush
</pre>
あとは iPhone からメールを送信してメールが消えるか maillog や iPhone を用いて確認すればよいでしょう｡
(もちろん別の folder を指定して削除することも可能です｡)
普段よく利用しているLinuxコマンドのまとめ

Linuxコマンドは奥が深いので、ドキュメントとしてまとめてみました。

### ディレクトリの操作

一つ前のディレクトリに戻る。

	$ cd -

ディレクトリが存在しなければ作成する。

	$ test -d /tmp/files || mkdir /tmp/files

ディレクトリの利用容量を表示する。

	$ du -hs /home/*

ディレクトリの利用容量を大きい順に表示する。

	$ sudo du -sk /var/* | sort -nr

### ファイルの操作

ファイル名に日付を付けてバックアップする。

	$ cp -ip /etc/nginx/nginx.conf{,.`date +%Y%m%d`}


連番のファイルを作成する。

	$ touch hogehoge{01..10}.txt

### findコマンド

検索結果から対象ファイルをまとめてコピーする。

	$ find . -name "*.txt" | xargs -i cp {} /tmp/

検索結果から対象ファイルをまとめて削除する。

	$ find . -name "*.txt" | xargs rm

### grepコマンド

対象ファイルからコメント行と空白行を削除して表示する。

	$ grep -v -e "^\s*#" -v -e "^\s*$" /etc/apache2/apache2.conf

複数のログファイルから特定のアクセスを抽出する。

	$ grep -ir "172.16.0.1" /var/log/*

### その他

対象ファイルの文字列を置換する。

	# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

直前に実行した引数を利用する。

	$ ls -l /etc/nginx/conf.d/
	$ cd $_

1秒おきにコマンドを実行する。

	$ watch -n1 "cat /proc/net/ip_conntrack"

80番ポートのLISTENを確認する。

	$ netstat -na | grep -e "^tcp.*:80.*LISTEN"

リモートにあるコンテンツをローカルに保存する。

	$ curl -o google.html http://www.google.com/

名前解決をする。

	$ host www.twiiter.com

### 参考リンク

- [あなたが知らないかもしれないLinuxのコマンドいろいろ | IDEA*IDEA](http://www.ideaxidea.com/archives/2008/06/linux.html)
- [個人的なShellTipsをまとめてみた - UNIX的なアレ](http://wadap.hatenablog.com/entry/2014/04/21/095549)
- [naoya_itoの火を噴いたシェルtips - Togetterまとめ](http://togetter.com/li/652438)
正規表現の基本を習得する

苦手意識を克服するためにまとめました。

### 文字クラス
|文字クラス|説明|
|---|---|
|[abc]|aかbかcのいずれか。|
|[a-z]|aからzのいずれか。|
|[^a]|aじゃない文字。|
|[^a-z]|aからzじゃない文字。|
|(abc&#124;def)|abcまたはdef。|
|\n|改行。|
|\t|タブ。|
|\d|数字。[0-9]|
|\w|英数字。[a-zA-Z0-9_]|
|\s|スペース、タブ。|

### 繰り返し
|メタ文字|説明|
|---|---|
|.|任意の1文字。|
|?|直前を0回または1回繰り返す。|
|*|直前を0回以上繰り返す。|
|+|直前を1回以上繰り返す。|
|{n}|直前をn回繰り返す。|
|{n,}|直前をn回以上繰り返す。|
|{n,m}|直前をnからm回以上繰り返す。|

### アンカー
|メタ文字|説明|
|---|---|
|^|行頭|
|$|行末|

### 参考リンク

- [はじめての正規表現](http://higashizm.sakura.ne.jp/reg/#)
- [正規表現の機能の覚書き - はてな匿名ダイアリー](http://anond.hatelabo.jp/touch/20080923015641)
- [PHP正規表現チェッカー](http://www.rider-n.sakura.ne.jp/regexp/regexp.php)
Zshで1文字のリストを展開する(brace_cclの話)

Zsh で `setopt brace_ccl` すると {} の展開されるルールが拡張され、

```zsh
$ unsetopt brace_ccl
$ echo hoge{1234a-c}
hoge{1234a-c}

$ setopt brace_ccl
$ echo hoge{1234a-c}
hoge1 hoge2 hoge3 hoge4 hogea hogeb hogec
```

みたいになる（正規表現の [1234a-c] みたいな書き方に似てる）。

- 他のルールに適合しない限り、1文字ずつ展開する。
  - {1..20} や {1,2,3} などで解釈できる場合はそちらの挙動が優先される
- 範囲指定は - で行う。

参考

- zshexpn(1) BRACE EXPANSION
VMware PlayerをGUI無しで起動する(VIX)

# 概要

VMware VIXを利用してホストOSからコマンドを叩いてゲストOSを起動する。

# 試した環境

ゲストOS：CentOS 7(64bit)
ホストOS：Windows 7(64bit)

VMware Player 6.0
VMware VIX 1.13.3 
※ホストOSはWindowsまたはLinuxのみ可
※VMware Playerは少なくともメジャーバージョンを6にすること

# 必要な物をインストールする

## VMware VIXを取得する

下記ダウンロードページからホストOSに合ったものをダウンロードする。
※VMware Playerのダウンロードページで「ドライバとツール」タブを押せばよい。

<https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/6_0|PLAYER-603|drivers_tools>

## VMware VIXをインストールする

Windowsの場合、インストーラ起動してデフォルト設定のまま実行でよい。

# スクリプトを書く

※ホストOSがWindowsの場合を書く。Linuxの場合はコマンドを適宜読み替えること。

## 定数宣言用バッチ

```vmconst.bat
@echo off

REM VIXのexeのディレクトリを指定する(デフォルトならこのまま)
set DIR_VMRUN="C:\Program Files (x86)\VMware\VMware VIX"
set CMD_VMRUN=vmrun

REM 起動したいVMのvmxファイルを絶対パスで指定する
set VMX_TARGET="C:\VM\path\to\xxxx.vmx"

@echo on
```

## 起動用バッチ
```vmstart.bat
call vmconst.bat

cd %DIR_VMRUN%
start %CMD_VMRUN% -T player start %VMX_TARGET% nogui

exit
```

※その他のvmrun.exeのオプション
-gu &#x3C;userName in guest OS&#x3E;
-gp &#x3C;password in guest OS&#x3E;

## 起動中のVMを一覧表示するバッチ

```vmlist.bat
call vmconst.bat

cd %DIR_VMRUN%
%CMD_VMRUN% -T player list %VMX_TARGET%

pause
```

## サスペンド用バッチ

```vmsuspend.bat
call vmconst.bat

cd %DIR_VMRUN%
start %CMD_VMRUN% -T player suspend %VMX_TARGET%

exit
```

※startと違ってオプション無し

## 

## 強制シャットダウン用バッチ

```vmstop.bat
call vmconst.bat

cd %DIR_VMRUN%
start %CMD_VMRUN% -T player stop %VMX_TARGET%

exit
```

※hardはホストOS側で電源ボタンを押して止めた場合と同じ(何も書かないとこちら)。
※softはゲストOS内でシャットダウンコマンドを叩いた場合と同じ(通常はこちらだが、なぜか全然終わってくれない…)。


## 他に使えるパワーコマンド

vmrun.exeのUsageより

|POWER<br>COMMAND|PARAMETERS|DESCRIPTION|
|:---------|:-----------------------|:-----------|
|start |Path to vmx file [gui&#124;nogui]|Start a VM or Team|
|stop  |Path to vmx file [hard&#124;soft]|Stop a VM or Team|
|reset |Path to vmx file [hard&#124;soft]|Reset a VM or Team|
|suspend|Path to vmx file [hard&#124;soft]|Suspend a VM or Team|
|pause|Path to vmx file|Pause a VM|
|unpause|Path to vmx file|Unpause a VM|

# 参考
「仮想サーバのCUI起動」
<http://ogeji.hatenablog.com/entry/2014/05/14/000000>

「VMPlayerのvmxをバックグラウンドで起動」
<http://m-shige1979.hatenablog.com/entry/2014/02/22/034335>

「BATファイルで環境変数を設定ファイルから読み込む方法2つ」
<http://kunst1080.hatenablog.com/entry/2014/04/07/183736>

「vmrun コマンド メモ（更新）」
<http://bibourokumikan.blog.fc2.com/blog-entry-31.html>
仮想マシンに NIC を追加する

# 概要
仮想マシンに NIC を追加したくなった状況に遭遇したのでやってみる
# 事前情報
## 物理マシン環境
* OS

```
# cat /etc/redhat-release
CentOS release 6.4 (Final)
```

## 仮想マシン環境

* OS

```
# cat /etc/redhat-release
CentOS release 6.4 (Final)
```

* 追加前 I/F

```
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:6e:64:cd brd ff:ff:ff:ff:ff:ff
    inet 10.29.8.1/20 brd 10.29.15.255 scope global eth0
    inet6 fe80::5054:ff:fe6e:64cd/64 scope link
       valid_lft forever preferred_lft forever
```

# 作業内容

1.仮想マシンのシャットダウン

```
# shutdown -h now
```

2.物理マシン(kvmホスト) で仮想マシンの xml を編集
* 追加するI/F設定は、紐付けたい br I/F と model type のみ記載。mac, address type については自動で付与されるため不要。

```
# virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     hogehoge                    シャットオフ

# virsh edit hogehoge 

+    <interface type='bridge'>
+      <source bridge='br1'/>
+      <model type='virtio'/>
+    </interface>
+    <interface type='bridge'>
+      <source bridge='br2'/>
+      <model type='virtio'/>
+    </interface>
```
3.設定を反映

```
# virsh define /etc/libvirt/qemu/hogehoge.xml
ドメイン hogehoge が /etc/libvirt/qemu/hogehoge.xml から定義されました
```

4.仮想マシンを起動

```
# virsh start hogehoge
ドメイン hogehoge が起動されました
```
5.I/F が追加されていることを確認

```
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:6e:64:cd brd ff:ff:ff:ff:ff:ff
    inet 10.29.8.1/20 brd 10.29.15.255 scope global eth0
    inet6 fe80::5054:ff:fe6e:64cd/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 52:54:00:3d:3f:e1 brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 52:54:00:27:c2:4b brd ff:ff:ff:ff:ff:ff
```
動的クエリーの文字列構築を後置ifで見やすくする


動的にクエリー文字列を構築する場合、通常はif文で文字列の追加を制御するが、if文だらけになるとどうしてもクエリー部分の可読性が低くなってしまう。
これを後置ifを使って書くと、ほんの少しだけ見やすいコードになる。

後置ifとはperl等で使える構文で、実行文の後ろに条件を書く構文の事。
書き方が違うだけで内容は全く同じ。

```:一般的なif文
if 条件 then 実行文;
```

```:後置if
実行文 if 条件;
```

後置ifが使える言語は少ないが、後置if風に書くためのビルダーを作成することで対応できる。

以下、JavaでJPQLの構築例。

## Before

```java:通常のif文で動的クエリーを組み立てる
StrinbBuilder sb = new StringBuilder();
sb.append("select u");
sb.append(" from User u");
if (followTagName != null) sb.append(" join u.followTags ft");
sb.append(" where true");
if (name != null)          sb.append(" and u.name like :name");
if (email != null)         sb.append(" and u.email like :email");
if (followTagName != null) sb.append(" and ft.name = :followTagName");
```

## After

```java:後置if風に書くためのビルダーで組み立てる
new QueryBuilder()
    .append("select u")
    .append(" from User u")
    .append(" join u.followTags ft",         followTagName != null)
    .append(" where true")
    .append(" and u.name like :name",        name != null)
    .append(" and u.email like :email",      email != null)
    .append(" and ft.name = :followTagName", followTagName != null);
```

```java:QueryBuilder.java
public class QueryBuilder {
    StringBuilder sb = new StringBuilder();
    public QueryBuilder append(String str) {
        sb.append(str);
        return this;
    }
    /**
     * conditionが真のときだけstrを追加する。
     */
    public QueryBuilder append(String str, boolean condition) {
        if (condition) append(str);
        return this;
    }
    public String toString() {
        return sb.toString();
    }
}
```
実行中のRubyのバージョンを確認する


その方法をいくつか。完全に自分用メモ。

## rubyコマンドから

多くのunixコマンドと同様です

```bash
% ruby --version 
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]
```

## 定数から

pry等から実行している状態で確認できます。

```ruby
[1] pry(main)> RUBY_VERSION                                                                                                                  
=> "2.1.2"
```

## rbenvから

ちょっと毛色が変わりますが、currentに選択されているものを確認します。

```bash
% rbenv version
2.1.2 (set by /Users/norifumi/.rbenv/version)
```

pryで内部の実装を確認する時に「ちゃんと2.1.2の実装を見てる」ことを確認したかったので調べました。
Android Best Practices for Performance メモ


# はじめに
本稿は Android Developers のドキュメントの「Best Practices for Performance」内の「Performance Tips」と「Improving Layout Performance」の簡易'メモ'です。翻訳ではありませんので、詳細はリンク先のドキュメントを確認ください。

# パフォーマンスチップス

http://developer.android.com/training/articles/perf-tips.html

## 原則
* 必要ないことはやらない
* 回避できるならメモリを割り当てない

## Tips
* 必要ないオブジェクトは作らない
http://developer.android.com/training/articles/perf-tips.html#ObjectCreation

* フィールドにアクセスしないメソッドは static にする
http://developer.android.com/training/articles/perf-tips.html#PreferStatic

* 定数には static final を使う
http://developer.android.com/training/articles/perf-tips.html#UseFinal

* クラス内でのフィールドへのアクセスに getter, setter を使わない
http://developer.android.com/training/articles/perf-tips.html#GettersSetters

* 拡張 for 文を使う
http://developer.android.com/training/articles/perf-tips.html#Loops

* 浮動小数点を使わない
http://developer.android.com/training/articles/perf-tips.html#AvoidFloat

* ライブラリを使いこなす
http://developer.android.com/training/articles/perf-tips.html#UseLibraries

（以降省略）



# レイアウトパフォーマンスを改善する

## レイアウト階層を最適化する
### レイアウトを検査する
http://developer.android.com/training/improving-layouts/optimizing-layout.html#Inspect

* Hierarchy Viewer というツールを使えばレイアウトパフォーマンスのボトルネックを検出できる
* hierarchyviewer は、\<sdk>/tools/ から起動する

### レイアウトを修正する
http://developer.android.com/training/improving-layouts/optimizing-layout.html#Revise

* narrow and deep ではなく、shallow and wide なレイアウトを作る
* layout_weight を使うときは慎重に  

### Lint を使う
http://developer.android.com/training/improving-layouts/optimizing-layout.html#Lint

* Lint ツールを使えばレイアウトの改善点を抽出できる

![](http://developer.android.com/images/training/lint_icon.png)
画像引用元：http://developer.android.com/training/improving-layouts/optimizing-layout.html#Lint




## \<include/> でレイアウトを再利用する
http://developer.android.com/training/improving-layouts/reusing-layouts.html

* \<include> タグを使う
 * android:layout_* 属性のパラメータはすべて上書きできる
 * 上書きを有効にするには、必ず android:layout_height and android:layout_width を記述すること
* \<merge> タグを使う
 * \<include> を使ってレイアウトを挿入する際、LinearLayout in LinearLayout のような冗長なレイアウト階層を回避できる



## オンデマンドで View をロードする
http://developer.android.com/training/improving-layouts/loading-ondemand.html

* ViewStub は、必要なタイミングで描画を行うため、事前に View をロードするコストがかからない
* ViewStub には android:layout 属性が必要
* ViewStub をロードする場合、setVisibility(View.VISIBLE) or inflate() メソッドをコールする



## スムーズにスクロールする ListView を作る
http://developer.android.com/training/improving-layouts/smooth-scrolling.html

* スムーズにスクロールする ListView のポイントは、メインスレッドの処理を軽減すること
* UIの描画処理以外は、AsyncTask などを使用してバックグランドスレッドで処理を行う
* "view holder"デザインパターンを利用すれば、毎回 findViewById する必要がなくなる
Readme駆動開発を和訳してみた

rebuild.fmで話にあがっていた「Readme Driven Development」について、
原文がどんな内容なのか気になったので訳してみました。

英語力が低いのでGoogle翻訳等をフル活用していますので、
間違っているところや日本語的に怪しいところなどありましたら、ご指摘お願いいたします！


# Readme駆動開発
最近TDD（テスト駆動開発）やBDD（ビヘイビア駆動開発）、エクストリームプログラミング、スクラム開発、スタンドアップミーティングなど、より良いソフトウェア開発のための様々な種類の方法論・開発手法の話題をよく耳にする。
だが、開発しているソフトウェアに対して、それらの方法論・開発手法がマッチしていない限り、全く意味は無いものになっているだろう。
別の言い方をすると、粗悪な設計書に基づいた完璧な実装のように価値がないということだ。
同じようなもので、ドキュメントの無いビューティフルな技術を用いたライブラリも似たように価値がない。
あなたのプログラムが間違った使い方をされたり、 そもそも正しい扱い方を誰も分からなければ、最悪の事態が待っているからだ。

ここまではいいでしょう。
ではどのように問題解決をしていけばいいんでしょうか？
その解決法は思ってるよりか簡単で、私の主張の上で重要なことです。

**それはまず、Readmeを書くこと。**

はじめに、あなたがコードやテスト、動作、全体の流れ、その他諸々を書く前にReadmeを書いて下さい。
分かってる、分かってる。「俺達はプログラマーなんだよ糞が！技術ライターじゃねーんだよ！」って言うんでしょ？
けど、それじゃダメなんだよ。
**Readmeを書くってことは良いソフトウェアを書くってことの重要な肝になるんだよ。**
自分のソフトウェアについて書くまでは、これから何をコーディングしていくか分からないからさ。
ウォーターフォールモデルへの反発による大きな反動と、アジャイル開発が皆に認めれれるようになった狭間でいくつか失わたものがある。
勘違いはしてほしくないが、ウォーターフォールモデルでは考え方が違いすぎる。
細かい仕様を記述している巨大システムは結局ただの細かく仕様が記述された糞なシステムになってしまうんだ。
僕らにとって仕様に従って書くことは正しいことだった。 
しかし、<b>そうやって作られるものは本来のものとは全然違う方向へ行ってしまうんだ</b>。
今、僕たちはそんな短く、糞な書き方で、完全に欠落したドキュメンテーションなプロジェクトを抱え込んでいる。
さらにそんないくつかのプロジェクトにはReadmeすらない！

これは非常に受け入れがたいことだ。
技術仕様書が全くない状態では曖昧な点がいくつか存在してしまうし、実際存在することだってあるのだ。
その曖昧な点というのは控えめなReadmeといったところだろう。 

また、ドキュメント駆動開発とReadme駆動開発とを区別することが重要になる。
RDD（Readme駆動開発）は限定的なDDD（ドキュメント駆動開発）やその一部分と考えることが出来る。
システムのイントロダクションとして読まれることを意図して、デザインドキュメンテーションを１つに制限することにより、RDDは冗長的かつ正確な仕様書のせいで疲弊させられていた「DDDウォーターフォール逆戻り症候群」から助けてくれることだろう。
また同時に、RDDによってモジュール化と小さいライブラリを保つことが期待できる。
これらの単純な補強策は正当性の確認というプロセスが少なくなり、プロジェクトを駆動させる長い道のりを正しく導いてくれるだろう。

それではReadmeファイルを書くことによって得られるいくつかの重要な利点を説明しよう。

* まずもっとも重要なのが、**プロジェクトがどんな風に組み立てられどのような公開APIが含まれるべきかを、
コードの変更というオーバーヘッドをかけずに考えられる**ということだ。
初めて自動化されたコードテストを書いている時や、別のコードベースを覗き見て全ての種類のエラーをキャッチしようと試した時の感覚は覚えてる？
プロジェクトでコードを書く前にReadmeを書くということはそういうことと全く同じ気持ちである。

* 何を実装するのか知るためにReadmeを書く副産物として、**素晴らしいドキュメントがもう目の前にある**ということだ。
また、プロジェクト開始時の興奮とモチベーションが最高潮の時にドキュメントを書くことが如何に簡単かを知ることが出来る。
さかのぼってReadmeを書くことは絶対やりにくいし、何か重要なことを見逃していないかの確認をしなくてはならない。

* もし、開発チームで働いているのならReadmeはさらなる恩恵をもたらしてくれることだろう。
もしチームの誰しもがプロジェクトが終わる前にReadmeへの情報にアクセスできるのならば、あなたのコードとインターフェイスで繋ぐ他　のプロジェクトで自信を持って開発を始めれるだろう。
定義されたインターフェイスのソートなしには、連続的か表面的な切り分けられた巨大なコードを再実装をしなければならない。

* 基本的なことを幾つか書き留めておくことで**ディスカッションを非常にシンプル**にします。 
もし何も文章化していないと、ある問題について同じ話を延々と繰り返す羽目になってしまいます。
書き留めておくという簡単な行為の提案は、既知のことを踏まえた上で議論でき、具体的な考えを皆が持つことが出来る意味がある。

真に作るということを踏まえて、プロジェクトでReadmeを書くということを考慮してみてはどうだろうか。
Readmeはあなたの素晴らしいアイデアを全て表現できる。
Readmeはあなたの創造性と表現力を証明するためにも書くべきだろう。
あなたのコードベースにおいてReadmeは最も重要な文章の一つになる。
**何をするにも最初に書こう！**

原文：
http://tom.preston-werner.com/2010/08/23/readme-driven-development.html
AWSの初期設定でrootパスワードを設定する

AWSで新規インスタンスを作成した場合、初期設定ではrootのパスワードが設定されていません。
このままだとリモートからrootログインできないため、ec2-userでリモートログイン後にrootのパスワードを設定します。

・ec2-userでリモートログイン
`ssh -i mykey.pem ec2-user@[Public IP]`

・rootユーザに昇格
`[ec2-user@ip-***-***-***-*** ~]$ sudo su -`

・パスワード変更
`[ec2-user@ip-***-***-***-*** ~]$ passwd
Changing password for user root.
New password: （パスワード入力）
Retype new password: （もう一度入力） 
passwd: all authentication tokens updated successfully.
[root@ip-***-***-***-*** ~]# 
`

できました :tada:
Xcodeのリファクタリング機能を使ってファイル名変更

**『ファイル名、変えたい時が変えどきよー。』**っていうことで。

##実際にやってみる
###変更したいファイル開く
`ViewController.h` 開く

###クラス名選択し右クリック
```objectivec

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end
````
ViewControllerを選択して右クリック

```Refactor > Rename```  

リネームのフォームが出てくるので `StartViewController` に変更。 Reviewクリック
影響ファイルの一覧を表示してくれるので確認して Saveクリック
戻せるようにスナップショット取るか確認されるので Enableクリック

###ファイル名が変わっていることを確認  

~~ViewController.h~~ → StartViewController.h
~~ViewController.m~~ → StartViewController.m

###ビルドして問題ないことを確認。
意外に簡単。
ubuntuでoracle-jdk8をインストールしておく

Oracleからダウンロードして入れてもいいけど、update-altanativesで--install とかするのが面倒だったので自分用メモ。

```bash
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
```


切り替えなどはご自由に。

```bash
$ update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
* 0            /usr/lib/jvm/java-8-oracle/jre/bin/java          1072      auto mode
  1            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      manual mode
  2            /usr/lib/jvm/java-8-oracle/jre/bin/java          1072      manual mode

Press enter to keep the current choice[*], or type selection number: 
```
You have already activated rake 10.3.2, but your Gemfile requires rake 10.3.1.

`rake db:migrate`
した時に下記エラーが起きる場合。

`rake aborted!
Gem::LoadError: You have already activated rake 10.3.2, but your Gemfile requires rake 10.3.1.`


<解決策>
`bundle update rake`

もう一度
`rake db:migrate`
してみると、通ります :tada:
chatwork で枠なしで画像を貼り付ける方法


chatworkで画像を貼り付ける際に、


![gazo1.jpg](https://qiita-image-store.s3.amazonaws.com/0/49158/c65e766a-19eb-cb5d-cc9c-1083c2459740.jpeg)

通常アップロードするとこのように枠付きでアップロードされ、
コメント等と分離した表示となります。
これから画像だけ取り出して利用したい場合の手法です。

まずはいつも通り画像貼り付け
※加工時の処理が見られたくない人は、マイチャットで実施することをオススメします。

![gazo2.jpg](https://qiita-image-store.s3.amazonaws.com/0/49158/85dbcbe4-71ca-43a9-1831-7717996ee429.jpeg)

![gazo3.jpg](https://qiita-image-store.s3.amazonaws.com/0/49158/bf3a3638-e576-d929-906e-dbc6a22bc439.jpeg)

アップされたら、編集します。

![gazo4.jpg](https://qiita-image-store.s3.amazonaws.com/0/49158/f89baec9-a4ed-dfe3-4cef-0f988fefcecd.jpeg)

![gazo5.jpg](https://qiita-image-store.s3.amazonaws.com/0/49158/8e57f055-e0e2-0189-c371-d309f220efab.jpeg)



ここから、

[preview id=XXXXXXXXX ht=150]

以外を削除


![gazo6.jpg](https://qiita-image-store.s3.amazonaws.com/0/49158/6303303d-ad2b-f0f5-94e7-f52b18cc32e6.jpeg)


これで保存すると、


![gazo7.jpg](https://qiita-image-store.s3.amazonaws.com/0/49158/407ad442-55c7-ba15-21b5-58df7a7f62bb.jpeg)

枠がなくなります、完成！！



切り抜いた[preview id=XXXXXXXXX ht=150]を
別のグループチャットで貼り付ければ、
いきなり枠なしで画像を利用することができます。
Ubuntu版Apache2でmod_rewriteを有効にする

Ubuntuのリポジトリから取得出来るApache2は
オリジナルのApache2とはディレクトリの構成や設定の方法が違うらしい。

まずはmod_rewriteが利用可能となっているかを確認する。

```shell-session
cat /etc/apache2/mods-available/rewrite.load
```

```shell-session
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
```

使えることが確認できたらa2enmodというコマンドを実行する。

```shell-session
sudo a2enmod rewrite
```

a2enmodを実行すると以下の様なメッセージが出てくる。

```shell-session
Enabling module rewrite.
To activate the new configuration, you need to run:
  service apache2 restart
```

忘れずにrestartしよう

```shell-session
sudo service apache2 restart
```
Cookie以上のユーザートラッキング技術Canvas Fingerprintingを使ってみた


##1. 概要
「Canvas Fingerprinting」というのは文字通り、Canvasという技術をつかった指紋採取をする技術のことを言います。

Webサイトにアクセスをすると、アクセスしたパソコンなどのクライアントの固有情報から指紋のようなものを生成して、それをWebサイト側がユーザーのトラッキング等に利用するというのが主な使われ方のようです。

##2. 利用状況
The Web never forgetsによると、研究者たちが調査したAlexaトップ10万サイトのうち、5.5%以上でCanvas Fingerprintingスクリプトが動作しているため今後更に広がることが予想できる。
https://securehomes.esat.kuleuven.be/~gacar/persistent/

Canvas Fingerprintingを利用しているサイト一覧
https://securehomes.esat.kuleuven.be/~gacar/sticky/index.html

##3. 技術

技術的に解説をすると、アクセスしたクライアントのブラウザやブラウザバージョン、インストールされているライブラリやフォント、解像度などの端末情報を元に、Canvasで目には見えない画像を生成し、それをそのクライアントの指紋として取得できるというもの。

但し、内部でレンダリングした画像データはそのままだとサイズが大きいので、各画像のピクセルデータをハッシュ化して、数バイト程度に落とし込んだものを正式な指紋として利用します。

canvasには任意の座標ピクセルの画素データを取得する機能があるので、フォントをレンダリングすることでOSやブラウザの情報、インストールされたフォント情報を暗に含んだ画像を、WebGLでレンダリングすることでその物理マシンのGPU（場合によってはドライバやファームウェアによっても異なるかも）を特定することができます。

具体的な仕組みとしては、
1. JavascriptのCanvasAPIで画像を生成
2. 生成した画像をデータで取得
3. 画像データをハッシュに変換してDB保存などで利用
![canvasfingerprinting2.png](https://qiita-image-store.s3.amazonaws.com/0/1418/3ad701de-f00f-23c3-b38d-d68a2f9167a1.png "canvasfingerprinting2.png")


##4. できること
今までcookieで管理したユーザーのトラッキングなどを、fingerprintを管理することで行うことができます。
cookieのようにブラウザやクライアントの設定で削除・無効などにもできないので、かなり特殊な設定をしない限りトラッキングを回避することができません。

開発者側からすれば、今まで以上にトラッキングをするのが容易且つ、高確率になるため既に世界の主要サイトでは使われ始めています。

cookieとは異なり、クライアントに依存するデータになるので、ドメインを跨いでも同じ端末の同じブラウザで閲覧する場合は、ドメインを横断して行動を特定することができるようになります。


##5. 回避方法
今のところ根本的には「追跡されるのは仕方ない」とするしかなさそうです。

①スマホでアクセスする
スマートフォンはトラッキングをされることはないそうです。
※って言ってもPCでも見ますよね。。。

② 根本解決ではないが、2014年8月段階ではこの仕組みを使っているサイトのコードがほとんどAddThisという会社のコードらしいので、AddThisのサイトからOpt-Outするのは効果があるはずです。

③ 現実的ではないが、ブラウザのJavascriptを切ればCanvasAPIが実行されないので追跡はされない。但し、多くのサイトで正常に動かない状態になるはずなので、現実的ではありませんね。

④ Canvas Fingerprintingの対策がされているブラウザがいくつかあるようですが、まだテスト段階だったり、逆にセキュリティ的にめんどくさすぎて使い物にならないものが多い。


##6. 実際に使ってみた
参照：https://github.com/Valve/fingerprintjs

##インストール方法

###①Ruby on Railsの場合
```
gem 'fingerprintjs-rails' 
bundle install
```

```application.js
//= require fingerprint
```

###②Bowerでインストール
```
bower install fingerprint
```

###③NPMでインストール
```
npm install fingerprintjs
```


##fingerprint.jsをコピー
https://github.com/Valve/fingerprintjs/blob/master/fingerprint.js

##利用方法

```fingerprint_test.js
var fingerprint = new Fingerprint().get();
// console.log(fingerprint); //fingerprintをconsoleで確認する場合はコメントアウトを外す
```

さらに固有性を増すためのオプションが二つあります。

```fingerprint_test.js
var fingerprint = new Fingerprint({canvas: true}).get();
var fingerprint = new Fingerprint({screen_resolution: true}).get();

```

二つのオプションを同時に設定することも可能。

```fingerprint_test.js
var fingerprint = new Fingerprint({
  canvas: true,
  screen_resolution: true
}).get();
```

consoleで見ると、数値データが取得できているはずなので、それを利用してユーザーのトラッキングをするのが今現状の主たる利用方法になります。
CentOS6 で libvirt をインストールしたときに作成される virbr0 を削除する


* libvirt をインストールすると下記のような default ネットワークが存在する

```
# virsh net-list
名前               状態     自動起動  永続
--------------------------------------------------
default              動作中  はい (yes)  はい (yes)
```


* 設定ファイルの中を確認

```
# virsh net-dumpxml default
<network>
  <name>default</name>
  <uuid>aae3bec9-57c0-425e-baff-0dde9de01fee</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0' />
  <mac address='52:54:00:DE:3F:8A'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254' />
    </dhcp>
  </ip>
</network>
```

* ここまでで virbr0 が定義されていることが分かるので削除する
* 削除コマンドは `virsh net-destroy default`

```
# virsh net-destroy default
ネットワーク default は強制停止されました
```

* 再起動時に有効にならないようケアしておく

```
# virsh net-autostart default --disable
ネットワーク default の自動起動設定が解除されました
```

* 自動起動が無効になっていることを確認する

```
# virsh net-list --all
名前               状態     自動起動  永続
--------------------------------------------------
default              停止状態 いいえ (no) はい (yes)
```
JetbrainsのIDEでバックスラッシュがデフォルト入力にならない


以下のページの通りに、Google日本語などで、
円マークの代わりにバックスラッシュが入力されるように設定する。
http://npnl.hatenablog.jp/entry/2013/05/29/020634


ブラウザやテキストエディタでは、
この設定でバックスラッシュがデフォルトで入力されるようになるのだが、
JetbrainのIDE(確認したのはPhpStormとRubyMine)では円マークのままになってしまう。

対処法がよく分からなかったので、
Karabiner(旧KeyRemap4MacBook)で以下のように設定して解決した。


![スクリーンショット 2014-08-04 15.06.50.png](https://qiita-image-store.s3.amazonaws.com/0/2278/bd21ec7b-085f-a70d-9abf-1a2a8d63e5e2.png "スクリーンショット 2014-08-04 15.06.50.png")
注文詳細ＡＰＩ（ＣＳＶでのLine Sub Totalの有無について）

注文詳細ＡＰＩについて質問致します。
ＣＳＶダウンロードするとある項目で、ＡＰＩのレスポンスにない項目があります。
Line Sub Total を利用したいのですが、注文詳細ＡＰＩには含まれないのでしょうか。

（http://storedoc.ec.yahoo.co.jp/s/shopping/toolmanual/orderdata/f/141.html#8
上記の「商品情報系フィールド」内、LineSubTotalに相当する値のことです。）

宜しくお願いします。
duで見つからないファイルはlsofで探そう - 見えないファイルにディスクが圧迫されてる時とかね

## このお話は？

dfで見るとディスクを19GB消費しているのに

```bash

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vol_hoge
                       26G   19G  5.1G  79% /

```

duで見るとディスクを4GBしか消費していない

```bash

$ du -hc /
(略)
4.0G     total

```

15GB分のディスクを食ってるのは誰だよ？？
って時の対処法。

## lsof で確認しよう


よくあるのは、ファイルシステム的には削除されているのに、プロセスがファイルを掴みっぱなしになっているケース。
lsofを使って、deleted となっているファイルを掴んでいるプロセスが無いかを確認します。

```bash
# lsof | head -n1
COMMAND     PID     USER   FD      TYPE             DEVICE        SIZE       NODE NAME
# lsof | grep dele
    
（略）

java      7575  user01    1w      REG              253,0 15377397982    5834380 /path/to/log/hoge_2014-05-24.log (deleted)
java      7575  user01    2w      REG              253,0 15377397982    5834380 /path/to/log/hoge_2014-05-24.log (deleted)
```

**PID:7575なプロセスが15GBほどのファイルを掴みっぱなしになっていることがわかります**



ちなみに、deletedとなっているファイルの実体を確認してみると0バイトでした。

```bash

$ ls -al /path/to/log/hoge_2014-05-24.log
-rw-r--r-- 1 user01 group01 0 Jul 27 13:40 /path/to/log/hoge_2014-05-24.log

```

## 対処方法
OSを再起動するか、該当のプロセスをkillしましょう。
サービスに影響を与えないよう、注意してくださいね。

すると、プロセスからファイルが開放され、ディスク使用量も無事減りました。
文字列のエンコードやデコードで　UTF-8、UTF_8、utf-8、UTF8　のどれを指定すればよいかで迷わない方法

URLエンコードされている文字列をUTF-8に変換することがあります。

```java
String urlEncodedString = "http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=%E6%97%A5%E6%9C%AC%E8%AA%9E";
URLDecoder.decode(urlEncodedString, "UTF-8");
```

という具合に。
このときに`URLDecoder.decode`の第2引数にはエンコーディング方式を指定しますが、UTF-8を指定したいときにどのように書けば正解なのか迷うことがあります。

ちなみに、次の4つのうち、指定すると`UnsupportedEncodingException`になるものがあります。わかりますか？

* UTF-8
* UTF_8
* utf-8
* UTF8

（もしかすると、Javaのバージョンなどによってどれが動作するかが違うかもしれません。未確認。）

# こう書けば迷わない
そもそも私たちが文字列でエンコーディング方式を指定するから、typoや動作するかのチェックに気を使うわけです。
なので、これから私はこのように書こうと思います。

```java
URLDecoder.decode(urlEncodedString, StandardCharsets.UTF_8.name());
```

`StandardCharsets.UTF_8`は`Charset`型の定数です。
`Charset`の`name`メソッドで文字セットの名称を取得することができます。
こうすれば私たちがエンコーディング方式をあらわす文字列をタイピングして直接指定しなくてよくなるので、どう書くといいかで迷わなくなります。
AngularJSでlocalStorageを使う


[ANGULAR MODULES](http://ngmodules.org/)で`localStorage`で検索すると、最も使っている人が多い *ngStorage* を使ってみました。[README](http://ngmodules.org/modules/ngStorage)の通りですが、メモっておきます。

+ Install  
```Bash:
$ bower install ngstorage
```  
+ moduleにngStorageへの依存を貼ります
  
```javascript:module
var app = angular.module('starter.controllers', ['ngStorage'])
```
+ controllerにサービスを読み込む  
SessionStorageなら`$sessionStorage`  
LoalStorageなら`$localStorage`

+ localStorageを読み込む
例えば、isEnableHogeとpositionXHogeを読み込む場合。  

```javascript:Load
$scope.$storage = $localStorage.$default({
            isEnableHoge: false,
   			 positionXHoge: 10
});
```

default()で設定しておけば、localStorageに実データがない場合はデフォルト値を使い、存在する場合はその値を使う。（helpには説明が書いてないけど、私の試した範囲だとそうなりました。）default()は使った方がいいと思います。

+ localStorageへの保存

```javascript:Save
       $scope.$storage.isEnableHoge = true; 
       $scope.$storage.positionXHoge = 34;
```

簡単です。  
最後に[ionic](http://ionicframework.com/)と組み合わせるとこんな感じでLoadすれば、アプリケーションの設定データとして使えます。

```javascript:
var app = angular.module('hoge', ['ngStorage'])

app.controller('AppCtrl', function($scope, $ionicPlatform
  $ionicPlatform.ready(function() {
		$scope.$storage = $localStorage.$default({
            isEnableHoge: false,
            positionXHoge: 10
	});
));
Octopressでよく使うコマンド一覧


よく使うコマンドがあるのでメモ
インストールとかは別のところ参照。

## ブログポストを作る
`rake new_post[ポスト名]`

## 固定ページを作る
`rake new_page[ページ名]`

## プレビュー表示する
`rake preview`
http://localhost:4000 にアクセスするとプレビューが見られます

## HTMLに書き出す
`rake generate`

## アップロードする
`rake deploy`
VagrantでAWSを利用する


## vagrant-awsのインストール

VagrantでAWSを利用するには**vagrant-aws**というナイスなプラグインがある。

```bash
vagrant plugin install vagrant-aws
```

使い方は[GitHub](https://github.com/mitchellh/vagrant-aws)で。


## Vagrantfileの設定

```ruby:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "dummy"
  config.vm.provider :aws do |aws, override|
    aws.access_key_id = "ACCESS KEY"
    aws.secret_access_key = "SECRET ACCESS KEY"
    aws.keypair_name = "KEYPAIR"
    aws.ami = "ami-a1124fa0"
    aws.region = "ap-northeast-1"
    override.ssh.username = "ubuntu"
    override.ssh.private_key_path = "/path/to/aws.pem"
  end

  config.vm.define "host1" do |m|
    m.vm.provider :aws do |aws, override|
      aws.instance_type = "t2.micro"
      aws.security_groups = ["default"]
    end
  end

end
```

Acess Key IDとSecret Access Keyが分からない場合は、[AWSのヘルプ](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSGettingStartedGuide/AWSCredentials.html)を参照。

**ami-a1124fa0**はUbuntu 14.04 LTS 64bit。

## インスタンスを立ち上げてみる

```bash
vagrant up --provider aws host1
```

実行の後、AWS Management ConsoleのEC2のInstancesで、新しいインスタンスが立ち上がっているのが確認できる。
Re:Viewで\fracを使う数式をインラインで埋め込みたい時の手順（しかもMarkDownからmd2reviewで変換する場合）

##Re:Viewとは
https://github.com/kmuto/review
シンプル記法で書籍PDFやEPUB変換できるドキュメントツール
（検索時には「rebview kmuto」などでググラビリティを高めると色々出てくる）

##何がしたかったのか

Markdownで数式を含む原稿を書き、md2reviewでreファイルに変換して、Re:ViewでPDFにする。

$\frac{1}{\sqrt2} \left|0\right\rangle+\frac{1}{\sqrt2} \left|1\right\rangle$とか、

```math
\left[
\begin{array}{cc}
\displaystyle 1 & \displaystyle 0 \\
 & \\
\displaystyle 0 & \displaystyle -1 \\
\end{array}
\right]
```
とかを描画したい。
~~Markdownで少しでも楽がしたい~~

##何ができなかったのか

\frac命令を含む数式を`@<m>`でインラインに埋め込めない。
ブロックで書いてもレイアウトが崩れる。

##対策したこと

数式を、`@<raw>{|latex| \textstyle \frac{1\\}{2\\} \left|0\right\rangle }`とインラインraw構文で書く。

ブロックは
`//raw[|latex| \textstyle \frac{1}{2} \left|0\right\rangle]`
とブロック構文で書く。

ブロック構文については、
`//texequation{
\frac{1}{\sqrt2} \left|0\right\rangle + \frac{1}{\sqrt2} \left|1\right\rangle
//}`
と書くことも可能。後述のエスケープ文字対応の必要がないため、
\being(equation)とか使いやすいのでブロック構造が中心ならこちらを使えば良いような気がする。


##注意点

閉じかっこ}がエスケープ文字で書かれている必要がある。 } -> \\}と置き換えて書く。（raw構文の場合）
(Markdown記法の都合でバックスラッシュの数が環境によって異なる数で表示されているかもしれない、実タイプはバックスラッシュ1つを閉じかっこ記号の前に付与する)

md2reviewを通してmdファイルをreファイルに変換すると、上記のエスケープ文字が消える。最初からreで書くか、変換後に打ち直すか、そこは各々の環境で対応が必要。（Markdownで楽に書くのが目的だったのでつらい）

TeXコードの冒頭に\textstyleを付ける事。スタイル指定しない場合、fracは確実に崩れる。

エスケープ周りの構文は
https://github.com/kmuto/review/blob/master/doc/format.rdoc
参照。

また、
$review-pdfmaker config.yml
後に大量に?が出て処理が停止するので、Enter押しっぱなしにしないといけない。（--ignore-errors付けても出る）
（文量が増えると押しっぱなしコストが高すぎるので誰かエラーで停止しないやり方教えてください）

##進捗
やばい

##謝辞

[@mhidaka](http://twitter.com/mhidaka)

##その他

「[Qiita　数式](https://www.google.co.jp/?gws_rd=cr&ei=32KgUu3NJoquiQf3loHIDw#q=qiita+%E6%95%B0%E5%BC%8F)」でググると5番目にこの記事が出てくるので、Webで数式書く人ってあまりいないのかなと思った。
自分がコメントをした投稿を検索する

@Qiita へは以前から「自分がコメントした投稿へのリンクを作ってくれ」と伝えているのだけど、作る気が無いようです。コメントや Thanks での Contribution 増加もしてくれないので、コメントを増やすように持っていく気が無いのでしょう。（早くStackOverflow日本語版が出ないかな、と思っていたりします。あと、検索したら [teratail【テラテイル】｜思考するエンジニアのためのQAプラットフォーム](http://teratail.com/) ってのも出てきた（けどMDエディタが劣化版なStackOverflowだた）。）

で。
自分がコメントした投稿を Qiita さんで検索できないならばググってしまえばいいじゃない、ということで Google さんで検索する方法を見つけました。
#検索キーワード
```:google
riocampos site:qiita.com -site:qiita.com/riocampos -site:qiita.com/tags
```
検索リンク先のURLはこうなります。

* https://www.google.co.jp/search?q=riocampos+site%3Aqiita.com+-site%3Aqiita.com%2Friocampos+-site%3Aqiita.com%2Ftags

もちろん `riocampos` の代わりにご自身のアカウント名を入れてください。 `-site:qiita.com/riocampos` のところにも。
##追記： @asahina_dev さん提案の検索キーワード
```:google
riocampos site:qiita.com/*/items -site:qiita.com/riocampos
```
検索リンク先のURLはこうなります。

* https://www.google.co.jp/search?q=riocampos+site%3Aqiita.com%2F*%2Fitems+-site%3Aqiita.com%2Friocampos

Google の検索範囲指定で `*` が使えるのは知らなかったです_φ(･_･ 

#解説
見れば分かるでしょうが以下の通りです。

* site: 検索範囲指定
* -site: 検索範囲除外

#最後に
こんなの使わなくても良いようにしてください>@Qiita
#追記
この検索だとストックした投稿も検索結果に含まれてしまいますねorz
コメント分が検索上位に来ると思いますので、それで我慢してください>_<
xmlのgraphical layout表示時にrendering: java.lang.System.arraycopy([CI[CII)Vが出る時の対応

Android Developer tools で、Androidでlayoutのxmlファイルが以下のようなエラーが出て表示できなくなることがある。

```
Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
```

#### 原因
layoutのレンダリングに利用しているAPIが原因。
API 20 (Android 4.4W:google wear用のAPI)には通常のAPIとくらべてwidgetがないものがある。例えばedittextは存在しない。



API 20をSDK managerを入れた状態でrendering方法でAutomatically pick bestを選択していると、API 20が利用されてしまい、上記のエラーが発生する。

#### 解決策

Automatically pick bestを解除し、API 20以外を利用する。

* 表示したいxmlを開き、Graphical Layoutタブを表示する。
* 上にあるドロイド君を選択し、Automatically pick bestチェックを外し、APIを指定する。
以下のような感じ。

![スクリーンショット 2014-08-04 12.51.54.png](https://qiita-image-store.s3.amazonaws.com/0/39433/0faf18da-9148-8662-96f9-cfbd1e75856e.png)


#### 参考
<http://stackoverflow.com/questions/24501042/android-app-in-eclipse-edit-text-not-showing-on-graphical-layout>
handy git aliases for resolving rebase/merge conflicts

よく使ってるのgit aliasを共有します。

.git/config
```
[alias]                                                                                                                                                                      
s = status  
edit-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; $EDITOR `f`" 
add-unmerged = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; git add `f`"
continue-rebase = rebase --continue
```                                                                                                 
こういう使い方でrebaseがだい楽になります。

```
$ git rebase origin/master
# あ、コンフリクトしちゃった
$ git edit-unmerged # コンフリクトしてるファイル$EDITORで開く
$ git add-unmerged # コンフリクトしてるファイルをgit addする
$ git continue-rebase　# rebaseを進む
```
Rubyでnilと1要素と配列を取るような変数に条件分岐なしでEnumarator#eachを適用する

```rb
RUBY_VERSION        # => "2.1.2"

n = nil
one = 1
array = [1, 2, 3]
empty_array = []

def double(v)
  # map は内部で each を使っている
  Array(v).map { |e| e * 2 }
end

double(n)           # => []
double(one)         # => [2]
double(array)       # => [2, 4, 6]
double(empty_array) # => []
```

`Kernel#Array` を使うとよい．
http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/m/Array.html
> arg に to_ary, to_a のいずれのメソッドも定義されていない場合は 一要素の配列 [arg] を返します。
CentOSでIPv6 を無効にするとメールが送れなくなった

恐らくpostfix以外にもいくつか影響は出てたと思いますが、とりあえず気づいたきっかけはpostfixでした。

sysctlを編集してipv6を無効にする

```
if [ `grep disable_ipv6 /etc/sysctl.conf | wc -l` -ne 2 ]; then
	cat >> /etc/sysctl.conf << EOM
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOM
fi
sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1
```

するとpostfixが立ち上がらなくなった

```
# /etc/init.d/postfix start
postfix を起動中:                                          [失敗]
```

maillogを見ると変なエラーが出ている。

```text:/var/log/maillog
postfix[22483]: fatal: parameter inet_interfaces: no local interface found for ::1
```

::1 という事はおそらくどこかでipv6の設定がされているのだろうと予想。
その結果`/etc/hosts`にipv6の設定が残ってた。

```text:/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

::1の行をコメントアウト

```text:/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

postfix起動

```
# /etc/init.d/postfix restart
postfix を起動中:                                          [  OK  ]
```

成功した。

ipv6を無効にしたらhostsのipv6の行も消しましょうという事でした。
DjangoのFormにKnockout.jsのdata-bind属性を書く際に勝手にエスケープされるケースの回避方法

こう書くと、HTML上では`valueUpdate: 'afterkeydown'`がエスケープされて`valueUpdate: &#39;afterkeydown&#39;`となり、afterkeydownが効かない。

``` python:form_exapmle1.py
from django import forms


class ExampleForm(forms.Form):
    address = forms.CharField(
        widget=forms.TextInput(
            attrs={
                'data-bind': 'value: address, valueUpdate: \'afterkeydown\''
            }
        )
    )
```

エスケープされないようにするには、[mark_safe](https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.safestring.mark_safe)を使う。

``` python:form_exapmle2.py
from django import forms
from django.utils.safestring import mark_safe


class ExampleForm(forms.Form):
    address = forms.CharField(
        widget=forms.TextInput(
            attrs={
                'data-bind': mark_safe('value: address, valueUpdate: \'afterkeydown\'')
            }
        )
    )
```

data-bind属性の中にユーザーが入力した値を埋め込む仕様であればXSS脆弱性になるので、ユーザーの入力値は手動でエスケープする必要がある。(そもそも、そういう設計は避けた方がいいとは思うけど…)

参考
http://stackoverflow.com/questions/777458/django-form-values-without-html-escape
Swiftの関数を===出来るようにする

Swiftではデフォルト状態だとtupleの比較が出来ないというのは[以前書いた](http://qiita.com/dankogai/items/85d4506ce7995db2eddf#2-3)通りだが、関数どうしも`===`できないので、出来るようにしてみた。

## [SYNOPSIS]

[SYNOPSIS]: https://github.com/dankogai/swift-operators/wiki/Functions#a-r--a-r

````swift
func peekFunc<A,R>(f:A->R)->(fp:Int, ctx:Int) {
    // let (hi, lo):(Int, Int) = reinterpretCast(f)
    typealias IntInt = (Int, Int)
    let (hi, lo) = unsafeBitCast(f, IntInt.self)
    let offset = sizeof(Int) == 8 ? 16 : 12
    let ptr  = UnsafePointer<Int>(lo+offset)
    return (ptr.memory, ptr.successor().memory)
}
@infix func === <A,R>(lhs:A->R,rhs:A->R)->Bool {
    let (tl, tr) = (peekFunc(lhs), peekFunc(rhs))
    return tl.0 == tr.0 && tl.1 == tr.1
}
````

````swift
// simple functions
func genericId<T>(t:T)->T { return t }
func incr(i:Int)->Int { return i + 1 }
var f:Int->Int = genericId
var g = f;      println("(f === g) == \(f === g)")
f = genericId;  println("(f === g) == \(f === g)")
f = g;          println("(f === g) == \(f === g)")
// closures
func mkcounter()->()->Int {
    var count = 0;
    return { count++ }
}
var c0 = mkcounter()
var c1 = mkcounter()
var c2 = c0
println("peekFunc(c0) == \(peekFunc(c0))")
println("peekFunc(c1) == \(peekFunc(c1))")
println("peekFunc(c2) == \(peekFunc(c2))")
println("(c0() == c1()) == \(c0() == c1())") // true : both are called once
println("(c0() == c2()) == \(c0() == c2())") // false: because c0() means c2()
println("(c0 === c1) == \(c0 === c1)")
println("(c0 === c2) == \(c0 === c2)")
````

## DESCRIPTION

アマツバメ本には、[Closures Are Reference Types]と明記してある。

[Closures Are Reference Types]: https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-XID_164

しかし(関数|メソッド|クロージャー)は、明らかにただの参照ではない。

````swift
class Point { var x = 0.0, y = 0.0 }
func genericID<A>(a:A)->A{ return a }

let p = Point()
let f:Int->Int = genericID

sizeofValue(p) // OS X では8
sizeofValue(f) // OS X では16
````

ただの参照である`class`とは異なり、ポインター二つ分メモリーを食っている。

それであれば、単純に`let (hi, lo) = reinterpretCast(f)`とでもして、`hi`と`lo`を比べればいいのではないかと思われるが、そうも行かない、試してみればわかるが、

````swift
let g = f
````

とした時に`g`の中身は`f`のそれとは一致しない。「Swiftのfuncは、ポインターを二つ含む構造体である」というところまでは推察できたが、それではそのポインターが何を指しているかはSwiftだけではわからない。

そんなさなか、以下のページを見つけた。

* [Function hooking in Swift](https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift)

ここまでわかれば、こちらのものだ。上記ページの著者はCを使って`func`に内包された関数ポインターを取り出しているが、上に示した通り、これはSwiftだけで達成できる。さらにclosureの同一性まで確認するためには、関数ポインターのみならずencloseされた環境へのポインターも必要となるが、これは関数ポインターのお隣さんだ。methodの場合、それが`self`へのポインターとなっている。

ちなみにこの問題、[stackoverflowで懸賞]がかけられていた。ちょっとした難問だったのだが、Cに頼らず解けたのは我ながらちょっと驚いた。

[stackoverflowで懸賞]: http://stackoverflow.com/questions/24111984/how-do-you-test-functions-and-closures-for-equality/25001045#25001045

## 何がうれしいの?

これが出来ることで、メタプログラミングの幅が広がる。funcをキーとした辞書やセットもこれで実装できるようになるし、動的に関数の実装を切り替えることすら可能となるのだ。

Enjoy!

func dankogai<Q,A>(q:Q)->A
Google AnalyticsのUS English版ランディングページは一味違う！

実は Google AnalyticsのランディングページはUS English版だけケーススタディとかいろいろ見れて楽しい。
本気で勉強したい人はUS English版のLP見たほうがいい。
US English版はGoogleの本気が見れる！
(多分、法律とか権利関係とかあるからUS以外は簡易版出してるんだろうな)

デフォルト
http://www.google.com/analytics/

US English
http://www.google.com/intl/en_us/analytics/
twitterにメールで投稿できるサービスyabminを使ってみた

https://yabm.in/ に登録し、メール投稿用メールアドレスをもらう。
linuxのmailコマンドからの投稿はなぜかbodyが空の扱いされたので
phpで投稿するようにした。

```bash:このmailコマンドでダメだった
echo "D @tukiyo3 ダイレクトメッセージテスト" | mail xxxxxxx@yabm.in -- -f tukiyo3@gmail.com
```

```php:twitter_d.php
<?php
$arrEmail=array(
	"xxxxxxxx@yabm.in",
	);

$message = "D @tukiyo3 ダイレクトメールのテスト ";
$message.= date("H:i:s Y/m/d");
$subject = "";

$headers = 'Content-type: text/plain; charset=UTF-8' . "\n";
$headers.= 'From: tukiyo3@gmail.com' . "\n";
$headers.= 'Reply-To: tukiyo3@gmail.com';
$to = implode(", ", $arrEmail);
mail($to, $subject, $message, $headers);
```

あとは用途に合わせて自分のtwitterアカウントに通知してもらいましょう。
【SauceLabs】タイムアウトを設定する

# 現象
* タイムアウトの時間はデフォルトで90秒
* 何回か回していると高確率で以下のエラーがでるようになった
* 90秒以内にSauceLabsとの接続が完了しなかったと。。 
* 自分の環境では本当に時間が足りていないのではないかという疑いが
* そこで、タイムアウトの時間をのばしてみると以降このエラーはでなくなったのでメモメモ
* 実行しているのはEC2@small instance
* なんでこんなに接続に時間がかかっているのかは不明
* ちなみにTravis+Saucelabsで動かしているときにもたまに目にした

```
[Connecting to Sauce Labs...]
  Sauce Connect failed to connect after 90 seconds (RuntimeError)
  /home/ec2-user/.rvm/gems/ruby-1.9.3-p547/gems/sauce-connect-3.4.1/lib/sauce/connect.rb:119:in `wait_until_ready'
  /home/ec2-user/.rvm/gems/ruby-1.9.3-p547/gems/sauce-3.4.9/lib/sauce/utilities/connect.rb:20:in `start'
  /home/ec2-user/.rvm/gems/ruby-1.9.3-p547/gems/sauce-cucumber-3.4.0/lib/sauce/cucumber.rb:71:in `around_hook'
  /home/ec2-user/.rvm/gems/ruby-1.9.3-p547/gems/sauce-cucumber-3.4.0/lib/sauce/cucumber.rb:162:in `Around'
```

# 対応
* sauce_helper.rbに以下を追加するだけ
 * デフォルト90 -> 270に変更

```rb:features/support/sauce_helper.rb
require 'sauce/connect'
Sauce::Connect::TIMEOUT = 270
```

* 以下のようにsauce_helper.rbに一行追加してもだめだったので注意！

```rb:features/support/sauce_helper.rb
require "sauce"
require 'sauce/capybara'
require "sauce/cucumber"

Capybara.default_driver = :sauce

Sauce.config do |c|
  c[:browsers] = [ 
    ["Windows 8", "Internet Explorer", "10"],             
    ["Windows 7", "Firefox", "20"],
    ["OS X 10.8", "Safari", "6"],                         
    ["Linux", "Chrome", nil]          
  ]
  c[:idle_timeout] = 120 # <= 90秒(デフォルト)から120秒に変更
end
```

# メモ
* sauce-connectのバージョンは3.1.0と2014/08/21現在の3.3.1とではタイムアウトまわりの部分が結構変わっていた

### 3.1.0と3.3.1との違い

```rb:lib/sauce/connect.rb
### 一部を抜粋
module Sauce
  class Connect
    TIMEOUT = 90
    def initialize(options={})
      @timeout = options.fetch(:timeout) { TIMEOUT } #<= ここが追加されている
    end

    def wait_until_ready
      start = Time.now
      while !@ready and (Time.now-start) < @timeout and @error != "Missing requirements"
        sleep 0.5
      end
...


```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください