OmniAICreator/Qiita-1.07M huggingface dataset:
vagrantを使ってのsymfony環境構築

##1. Install VirtualBox.
https://www.virtualbox.org/

##2. Install Vagrant.
http://www.vagrantup.com/

##2.terminal
###2-1 vagrant box add in my pc
$ vagrant box add centos67 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box

###2-2 vagrant box check 
$ vagrant box list

###2-3 change the folder
$ cd XXXXXXXXX
XXXXXXXXX　is your folder name.
###2-3 make the vagrant init file
$ vagrant init centos67

###2-4 open the vagrant files and delete the '#' ipsetting
・before
'# config.vm.network "private_network", ip: "192.168.33.10"
・after
config.vm.network "private_network", ip: "192.168.33.10"

###2-5 exist
$ vagrant up

###2-6 open ssh
$ vagrant ssh

##3 seting ssh
###3-1 git install
sudo yum -y install git
###3-2 clone packege
git clone https://github.com/dotinstallres/centos65.git
###3-3 change path
cd centos65
###3-4 exist
./run.sh
###3-5 exit
exit
###3-6 reload  
$ vagrant reload

##4 symfony setting
###5-1
$ vagrant ssh
###5-2 composer install
$ sudo curl -LsS https://symfony.com/installer -o /usr/local/bin/symfony
###5-2 setting chmod
$ sudo chmod a+x /usr/local/bin/symfony
###5-3-1 Latest　symfony install　
$ symfony new my_project
※plese change my_project　name 
###5-3-2 Decide　symfony version install
$ symfony new my_project 2.8
※plese change my_project　name and version number. 
###5-4
$ cd my_project
※plese change 　my_project your folder name. 
###5-5 check is current path
$ pwd
example [/home/vagrant/my_project]
###5-5 check is ip address.
$ ip a
example[
~
inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
~
]
###5-6 symfony run.
$ php bin/console server:run 192.168.33.10
###5-7 check symfony on web browser.
192.168.33.10

#finish !!


##warning
※「$」はターミナル　コピーの際につけない.
※「symfony2」を参考。謝意
<a  href="https://www.amazon.co.jp/gp/product/B019BQYLF8/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B019BQYLF8&linkCode=as2&tag=yoshifcb-22">基本からしっかり学ぶ　Symfony2入門</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=yoshifcb-22&l=as2&o=9&a=B019BQYLF8" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

※ドットインストールを参考。謝意
http://dotinstall.com/

symfony本家を参考。謝意
https://symfony.com/

Let's try!!
Windows 上で、 Docker を使って Haskell を簡単に始める方法

Haskellを学習するのにPaiza.ioをよく使っていますが、標準入力を使うようなプログラムエラーになってしまいます。
Paiza.jpの問題や参考書のサンプルプログラムを書こうとするとき、PC上にHaskellの実行環境が必要になります。
WindowsにStackなどでインストールしてもよいのですが、もっと簡単にDocker上で実行させる方法を自分用にメモっておきます。
Dockerを起動して以下のコマンドを実行。

~~~docker
MINGW64 ~/work/local/docker/haskell
$ docker pull haskell
~~~

簡単なプログラムを書いてみます。5回、数値を入力してEnterを押すと合計を出すプログラムです。
プログラムの問題にありそうな「N回入力をして～」の形です。
(ファイル名:five_time_reduce.hs)

~~~haskell
import Control.Monad
main = do
  s <- replicateM 5 getLine
  putStrLn . show . foldl (+) 0 . map read $ s
~~~

実行してみます。Windowsでは`$(pwd)`の前に`/`が必要です。
5回数値を入力すると結果が表示されます。

~~~docker
MINGW64 ~/work/local/docker/haskell
$ docker run -it --rm -v /$(pwd):/app -w /app haskell runghc five_time_reduce.hs
1
2
3
4
5
15
~~~

参考URL : http://sinsoku.hatenablog.com/entry/2015/10/24/095140

以上です。
技術英語 > an operating-room technique

@ Code Complete (No. 7074 / 36077)

> an operating-room technique

続きの文章は

> Data is sterilized before it's allowed to enter the operating room.

http://ejje.weblio.jp/content/sterilize
> ...不毛にする、(…を)殺菌する

Dataをパラメータなどで渡す時に無害化する。
検索エンジン DuckDuckGo と searchcode

* https://duckduckgo.com/?q=match+js&t=lm&ia=about

Linux mint 18でFirefoxをインストールしたところ、デフォルトの検索サイトがDuckDuckGoだった。
毎度Googleに変更するのも面倒なのですこし使ってみたところ大変気に入った。

## DuckDuckGoの長所

1. エンジニア向けである
    1. 十字キーとEnterキーで操作可能。(右を押すとImage、Videoと変わる)
    2. j(下),k(上),h(検索の入力にフォーカス),l,o(カーソル下のページを表示)
    3. v(新しいウィンドウで表示), m,t(トップに移動)
1. コマンドリファレンスが表示されることがある (下の画像参照)
    2. 訪問したことのあるページにチェックマークが付く
1. 検索結果にファビコンが表示
1. 検索結果が主に英語
1. 広告がない
1. AutoPager搭載 (次のページではなく、スクロールすると下に結果が足される。)
    2. w3mで見ると、最初30件、次のページが50件、とよく分かってらっしゃる。
1. w3mで閲覧しても余計なリンクが無く選択しやすい。
1. 用意されているthemeもシンプルで悪くない

## 結果

* https://duckduckgo.com/?q=preg_match&t=lm&ia=about

![preg.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9ab53599-0239-ac3c-4a4f-46cbc2f0f048.png)

右下にyahooとあるので、検索結果はyahooから提供されているのかな

![theme.png](https://qiita-image-store.s3.amazonaws.com/0/25728/817ac154-2d71-123e-8a3c-c49fa9ab0387.png)


## searchcodeというコード検索サイトも優秀

いままでGithubで検索していたが、こちらの方が自分の欲しい結果を見つけやすいかも。

* https://searchcode.com/?q=preg_match

![codesearch.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c3c1b135-fa4a-f23d-a6ab-fc9c7116a6c7.png)
pythonでAM変調、復調

#概要
pythonで、AM変調、復調やってみた。
復調は、IQ復調。
#写真
![py.jpeg](https://qiita-image-store.s3.amazonaws.com/0/18104/f855695f-c752-e7a2-de94-aa112c3c8caf.jpeg)

#サンプルコード
```
import numpy as np
import scipy.signal as sg
import matplotlib.pyplot as plt

sample_rate = 48000.
nsamples = 320
F_1KHz = 1000.
A_1KHz = 1.0
F_15KHz = 15000.
A_15KHz = 0.5
F_14KHz = 14800.
A_14KHz = 0.8
t = arange(nsamples) / sample_rate
vin = A_1KHz * sin(2 * pi * F_1KHz * t) 
vam = (A_1KHz * sin(2 * pi * F_1KHz * t) + 1.0) * A_15KHz * sin(2 * pi * F_15KHz * t)
i1 = vam * np.cos(2 * np.pi * F_14KHz * t)
q1 = vam * np.sin(2 * np.pi * F_14KHz * t)
nyq_rate = sample_rate / 2.
cutoff_hz = 6000.0
numtaps = 29
lpf = firwin(numtaps, cutoff_hz / nyq_rate)
i2 = sg.lfilter(lpf, 1, i1)
q2 = sg.lfilter(lpf, 1, q1)
o = np.sqrt(i2 * i2 + q2 * q2) 
fig = plt.figure(1)
ax = fig.add_subplot(311)
ax.plot(vin[1:300])
ax = fig.add_subplot(312)
ax.plot(vam[1:300])
ax = fig.add_subplot(313)
ax.plot(o[1:300])
fig.set_tight_layout(True)
plt.show()
```
Swift3.0での16進数色指定(#FFFなど)でのUIColor生成

初投稿です。Swift3の名前規則が安定してきたので、本格的にiOSとSwiftでの開発を始めました。今回はAndroidやCSSでよく使う16進数色指定をUIColorで使えるようにします。

Xcode8 beta5で動作確認しています。

##文字列を数値に変換するコード

まずは16進数文字列を数値に変換します。

```swift
var numstr = "FFFFFF"   // "FFFFFF"
var num = Int(numstr, radix: 16) ?? 0   // 16777215
```

なお、数値を16進数文字列に変換する時はこう。

```swift
var strnum = 255   // 255
var str = String(strnum, radix: 16)   // "ff"
```

システムではFは小文字を使うようなので、プログラムは小文字で統一します。

##UIColorを拡張する

UIColorを生成時に色を指定するので、Initializerとして定義します。

```swift
extension UIColor {
    convenience init(hex32: UInt32) {
        let alpha = CGFloat((hex32 >> 24) & 0xff) / 0xff
        let red = CGFloat((hex32 >> 16) & 0xff) / 0xff
        let green = CGFloat((hex32 >> 8) & 0xff) / 0xff
        let blue = CGFloat(hex32 & 0xff) / 0xff
        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }
}
UIColor(hex32: 0xff888888)   // r 0.533 g 0.533 b 0.533 a 1.0
```

これに、0xFFFなど指定用のInitializerも追加して、16進数文字列のInitializerから呼び出すようにすれば完成。

```swift
extension UIColor {
    convenience init(hex16: UInt16) {
        let alpha = CGFloat((hex16 >> 12) & 0xf) / 0xf
        let red = CGFloat((hex16 >> 8) & 0xf) / 0xf
        let green = CGFloat((hex16 >> 4) & 0xf) / 0xf
        let blue = CGFloat(hex16 & 0xf) / 0xf
        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }
    convenience init(hex32: UInt32) {
        let alpha = CGFloat((hex32 >> 24) & 0xff) / 0xff
        let red = CGFloat((hex32 >> 16) & 0xff) / 0xff
        let green = CGFloat((hex32 >> 8) & 0xff) / 0xff
        let blue = CGFloat(hex32 & 0xff) / 0xff
        self.init(red: red, green: green, blue: blue, alpha: alpha)
    }
    convenience init?(hexString: String) {
        if !hexString.hasPrefix("#") {
            return nil
        }
        var hexStr = hexString
        hexStr.remove(at: hexStr.startIndex)
        switch hexStr.characters.count {
        case 3:
            hexStr = "f" + hexStr
            fallthrough
        case 4:
            guard let hex16 = UInt16(hexStr, radix: 16) else {
                return nil
            }
            self.init(hex16: hex16)
        case 6:
            hexStr = "ff" + hexStr
            fallthrough
        case 8:
            guard let hex32 = UInt32(hexStr, radix: 16) else {
                return nil
            }
            self.init(hex32: hex32)
        default:
            return nil
        }
    }
}

UIColor(hex16: 0xf888)   // r 0.533 g 0.533 b 0.533 a 1.0
UIColor(hexString: "#888888")   // r 0.533 g 0.533 b 0.533 a 1.0
UIColor(hexString: "#333")   // r 0.2 g 0.2 b 0.2 a 1.0
```
３桁４桁６桁８桁の16進数色指定に対応。
hex16やhex32を使わないならprivateに設定してください。
swift3での文字列操作は煩雑だが慣れるしかなさそう。
MySQLの#1273のエンコードエラーについて

今日も壁にぶち当たり、解決に要した時間が６時間ほど。
今回はデータベースのエンコードが原因だったようです。

同じようなエラーに当たった際のため、メモを残します。

##今回のエラー内容
phpmysql error - #1273 - #1273 - Unknown collation: 'utf8mb4_general_ci'

phpmysql error - #1273 - #1273 - Unknown collation: 'utf8mb4_unicode_ci'

このようなエラーがでました。
データベースのエンコードとサーバー？のエンコードが違って表示できないよ、みたいなエラーかなと思いました。


##解決方法
`database_interface.lib.php`を編集します。
これがutf8mb4形式のエンコードを指定する原因コードだったようです。

別のファイル名を持っている場合もあるようなので、場合によって似たようなファイルを探すことで解決できることもありそうです。
(DatabaseInterface.class.phpなどもこの仲間)

utfmb4などでファイル内検索して、適当なところを見つけたら

```php:
if (PMA_MYSQL_INT_VERSION >  50503) {
        $default_charset = 'utf8mb4';
        $default_collation = 'utf8mb4_general_ci';
    } else {
        $default_charset = 'utf8';
        $default_collation = 'utf8_general_ci';
    }
```

このようなif文があったりするところを

```php:
//if (PMA_MYSQL_INT_VERSION >  50503) {
    //    $default_charset = 'utf8mb4';
    //    $default_collation = 'utf8mb4_general_ci';
    //} else {
        $default_charset = 'utf8';
        $default_collation = 'utf8_general_ci';
    //}
```
このようにコメントアウトしてしまいます。
細かい理由は考えていません。こうしたら解決しましたというメモ。
ご利用は自己責任でお願いします。

もう少し慣れたら理由もわかるといいなと。。



##参考にさせてもらったページ
[phpmysql error - #1273 - #1273 - Unknown collation: 'utf8mb4_general_ci'](http://stackoverflow.com/questions/21190523/phpmysql-error-1273-1273-unknown-collation-utf8mb4-general-ci)
Linuxで固定IP設定（設定ファイル・コマンド）

# 設定内容

家電量販店等で売られている一般的な家庭用ルータによるNAT環境を想定しています。ここでは以下のように設定します。

|項目|値|備考|
|---|---|---|
|NIC名|eth0|NICや環境により異なります。eno1,ens3,enps2p3等。|
|IPアドレス|192.168.11.100|LANで使われていないIP|
|ネットマスク|255.255.255.0|ネットワークアドレス:192.168.11.0/24 プレフィックス:24|
|ゲートウェイ|192.168.11.1|ルータのLAN側IPアドレス|
|DNSサーバ1|192.168.11.1|ルータのDNSフォワーディング|
|DNSサーバ2|8.8.8.8|Google Public DNS|

DNS設定が不要な場合もありますが、一応書いときます。
ルータのDNSフォワーディングが無効の場合でもGoogleのDNSサーバを見に行くようにします。
デフォルトではルータのDHCPサーバが起動していると思いますが、今回は使いません。
※しかし可能であれば、DHCPサーバのMACアドレス登録機能でIP固定化する方法を激しくお勧めします!!!
設定するIPアドレスがLAN上で使われていないこと、ネットマスクが正しい事を事前に確認してください。

# 設定確認方法
確認にはsudo権限は不要です。

```
$ ip a                     #"address"は短縮可
$ ip address show dev eth0 #NIC指定表示 

$ ifconfig         #起動中のNICを表示
$ ifconfig -a      #DOWN中のNICも表示
$ ifconfig eth0    #NIC指定表示

$ ping 192.168.11.1  #ゲートウェイにパケットが届くことを確認
$ ping 8.8.8.8       #外部ネットワークのDNSサーバにパケットが届くことを確認
$ ping google.com    #名前解決されることを確認
```

# 設定ファイルを編集するタイプ
※個人的には古いと言われても再起動後も設定が残るこの方法が好きです。
静的IPアドレスを設定するファイルは、Debian系とRedHat系で異なります。

### Debian系(Ubuntu,Raspbian等)
※RaspbianのJessieからはこの方法ではうまくいきません。dhcpcdによる設定が推奨されています。

```:/etc/network/interfaces
auto eth0
iface eth0 inet static
   address 192.168.11.100
   netmask 255.255.255.0
   gateway 192.168.11.1
   dns-nameservers 192.168.11.1 8.8.8.8
```

複数のNICの設定を一つのファイルに書けるので楽ですよねぇ。。
設定を反映させるには、

```
# /etc/init.d/networking restart
or
# service networking restart
or
# systemctl restart networking
```

かOS再起動で反映されます。
反映されない場合は、設定にミスがあるはずです。

### RedHat系(CentOS,Fedora等)
以下の行を追記。

```:/etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes    #rewrite:no->yes
IPADDR=192.168.11.100
PREFIX=24
GATEWAY=192.168.11.1
DNS1=192.168.11.1
DNS2=8.8.8.8
```

複数NICの場合は、NICごとに別々のファイル設定が必要です。その場合は、GATEWAYやDNSの設定を/etc/sysconfig/networkに書きましょう。また、GATEWAYはデフォルトルートなので、一つしか設定できません。
設定を反映させるには、

```
# /etc/init.d/network restart
or
# service network restart
or
# systemctl restart network
```

かOS再起動で反映されます。

# コマンドで設定するタイプ

コマンドで設定する場合は、以下の3つのコマンドがあります。

+ ip (iproute2)
+ nmcli (NetworkManager)
+ ifconfig (net-tools)

まず、ipとifconfigではDNSサーバを設定できないので、ここでは直接/etc/resolv.confに書きます。

※注意点として、CentOS7のminimalではデフォルトでnet-toolsパッケージが入っていないため、ifconfigコマンドがありません。ifconfigやnetstat等を使う場合はyum等でnet-toolsを入れる必要があります。

※また、UbuntuにはNetworkManagerが入っていないので、nmcliを使うにはaptでNetworkManagerを入れる必要があります。

個人的にはコマンドで設定せざるを得ない時はipコマンドを使ってます。
設定時にはデバイスがDOWNの状態で、ローカルにおいてroot又はsudo権限で作業しているものとします。

### ip (iproute2)

```
# ip address add 192.168.11.100/24 dev eth0
# ip link set eth0 up
# echo "nameserver 192.168.11.1" >> resolv.conf
# echo "nameserver 8.8.8.8" >> resolv.conf
```

### nmcli (NetworkManager)

```
# nmcli connection add type eth0 ifname eth0 con-name eth0
# nmcli connection modify eth0 ipv4.addresses "192.168.11.100/24 192.168.11.1"
# nmcli connection modify eth0 ipv4.dns "192.168.11.1 8.8.8.8"
# nmcli c down eth0
# nmcli c up eth0
```

### ifconfig (net-tools)

```
# ifconfig eth0 192.168.11.100
# ifconfig eth0 up
# echo "nameserver 192.168.11.1" >> resolv.conf
# echo "nameserver 8.8.8.8" >> resolv.conf
```

# あとがき
"静的IP"と"固定IP"の違いがよくわかってないのですが、自分はなんとなく、設定ファイルで設定した場合は"静的IP"、それ以外(DHCPやコマンドとか)は固定IPと呼んでます。
OSS(オープンソースソフトウェア）評価モデル

オープンソースソフトウェアの評価をする事になって、国内に基準となるものが少なかったので調査してみた。
気が向けば翻訳する予定。

評価シートを翻訳してみました。
※Google Transratorで
https://drive.google.com/open?id=1xunj2DGKv2FYB_HxFXqNFDABmWJOfVttwGB5Fbzusmw

今後はオープンソースソフトウェアはこの評価資料で評価していく予定。

#Evaluating Free / Open Source Software Projects
https://jgbarah.gitbooks.io/evaluating-foss-projects/content/index.html

#Software Evaluation: Criteria-based Assessment
https://www.software.ac.uk/sites/default/files/SSI-SoftwareEvaluationCriteria.pdf
phpの閉じタグ

#ハシカみたいなもの
PHPの閉じタグは省略しろっていう主張が多数派になったのはいつだろう、大昔のif(10==i)論争を思い出す。
if(i==10)のつもりでif(i=10)って書くとバグに悩むよ、if(10==i)って書いてれば、うっかりif(10=i)って書いた時に処理系がエラーはいてくれるよ、っていう話だ。
結局if(i=10)で警告出してくれる処理系が一般的になった頃には議論にならなくなったと思う。

閉じタグ論争もいずれ、テキスト出力をしない宣言してあれば警告を出す方向で落ち着く気もする。
そうなってくれないかな。

やっぱり、開いたタグは閉じたいじゃん。
Cisco IOS Local保存されるPasswordの設定

# 1. はじめに
念願のCatalyst3750が我が家に届きました。
前から知りたかった、Password関連の正しい設定方法を勉強します。

# 2. 前提
扱うのはLocal（＝Config）に保存されるPasswordのみです。
つまりTacacsやRadiusなどのリモート管理サーバは扱いません。

# 3. 先に回答を書く
現時点で「正解」と思われる方法を先に書いておきます。

Loginパスワードの設定方法（Console接続）

```
Switch(config)#username Jinnai73 secret [consolepassword]
Switch(config)#line console 0
Switch(config-line)#login local
```

Enableパスワードの設定方法
```Switch(config)#enable secret [enablepassword]```

# 4. 他の設定方法を知る
上記以外の方法で設定してある環境も多いでしょうから、他の方法も見ていきましょう。

## 4-1. Loginパスワード
下記のように、line console 0にパスワードを書く方法があります。

```
Switch(config)#line console 0
Switch(config-line)#password [consolepassword]
Switch(config-line)#login
```

この方法の問題点は、「Passwordがconfigの中に平文で記述されてしまう」という点です。
show runで確認してみましょう。

```
Switch#sh run | b line
line con 0
 password [consolepassword]
 login
```
確かにそのまま見えてしまっていますね。


これを平文ではなく暗号化で書き込む方法もあります。
service password-encryptionコマンドを使うことによって、平文で保存されることはなくなります。

```
Switch(config)#service password-encryption
Switch#sh run | b line
line con 0
 password 7 07342243401A160912020A1F173D24362C0E
 login
```

はい、暗号化されました。
しかし残念ながら、この方法はCisco非推奨です。
passwordの後ろにある7の数字、これは続く文字列がヴィジュネル暗号で暗号化されていることを意味しています。

>Any Cisco IOS configuration file that contains encrypted passwords must be treated with the same care that is used for a cleartext list of those same passwords.

引用元：http://www.cisco.com/c/en/us/support/docs/ip/access-lists/13608-21.html

ということでpasswordコマンドは平文で駄目、service password-encryptionを併用して暗号化しても駄目、ということになります。
Ciscoの推奨は、暗号化ではなくhashでパスワードを保存することであり、そのための方法が

```
username Jinnai73 secret [password]
```

です。この場合、[password]はmd5でhash化されてconfigに保存されます。
似たような方法ですが、

```
username Jinnai73 password [password]
```

とやってservice password-encryptionで暗号化する方法は非推奨です。

## 4-2. Enableパスワード
上記と全く同様の議論になります。
`enable password`コマンドは駄目で、`enable secret`を使いましょう、ということです。

# 5. おわりに
Catalystスイッチ1日目ですが、なかなか勉強になりました。
username passwordは職場でも使ってしまっているので「これからどうしようかなあ」と頭を抱えております。
React.js - componentWillReceiveProps内でpropsにアクセスする方法

# componentWillReceiveProps内でpropsにアクセスする方法

こんな感じで渡されたhogeに

```
<Piyo hoge={foo} />
```

componentWillReceiveProps内でアクセスするには

```
var Piyo = React.createClass({
  componentWillReceiveProps: (huga)=>{
    this.props.hoge; // ダメ(未更新)
    huga.hoge;       // よろしい
  },
  render: ()=>{ return (<div>{this.props.hoge}</div>); }
});
```

となる。
Sphinxドキュメントにトラッキングコードを追加する

# 概要
[sphinx_rtd_theme](https://github.com/snide/sphinx_rtd_theme) を使った[Sphinx](http://www.sphinx-doc.org/en/stable/) ドキュメントにトラッキングコードを追加する方法の備忘録．

# 方法
sphinx_rtd_theme の [`layout.html`](https://github.com/snide/sphinx_rtd_theme/blob/master/sphinx_rtd_theme/layout.html)にある，`extrabody` ブロックを使う．

作成中ドキュメントの `_template` ディレクトリに次のような内容の `layout.html` を作成する．

```html+django:layout.html
{% extends "!layout.html" %}

{% block extrabody %}
  <script>
    トラッキングコードを埋め込むスクリプト
  </script>
{% endblock %}
```

`{% extends "!layout.html" %}` で sphinx_rtd_theme の `layout.html` を拡張することを宣言し，`extrabody` の内容を定義している． 

後はコンパイルすれば良い．

# 参考
- [Google AnalyticsやGoogle Adsenceを貼りたい](http://sphinx-users.jp/reverse-dict/html/google.html)
Swiftで文字列を繰り返す


RubyやPythonでできる文字列を指定した回数だけ繰り返して文字列を作るやつ

```
文字列 * 回数
```
をSwiftでもやりたくなった。



```swift
func * (lhs: String, rhs: Int) -> String {
    var newStr = ""
    for _ in 1...rhs {
        newStr += lhs
    }
    return newStr
}

"無駄！" * 10
```

無駄にワンライナー

```swift
func * (lhs: String, rhs: Int) -> String {
    
    return (1...rhs).reduce(""){ $0.0 + lhs }

}

"無駄！" * 10
```

演算子オーバーロードとか普段使わないのでなんか満足！
terraformを使ってAWSのauto recoveryを設定する


## バージョン
- Terraform v0.7.0
- AWSのドキュメントは 2016/08/11時点

## コード

``` aws.tf
variable "aws_access_key" {}
variable "aws_secret_key" {}
variable "aws_default_region" {}
variable "subnet_id" {}
variable "security_groups" {}
variable "key_name" {}

variable "const" {
  default = {
    count = 2
  }
}
provider "aws" {
  access_key    = "${var.aws_access_key}"
  secret_key    = "${var.aws_secret_key}"
  region        = "${var.aws_default_region}"
}


resource "aws_instance" "web" {
  count         = "${lookup(var.const, "count")}"
  ami           = "ami-6869aa05"
  instance_type = "m3.medium"
  subnet_id     = "${var.subnet_id}"
  security_groups =  ["${split(",", var.security_groups)}"]
  monitoring = true
  key_name      = "${var.key_name}"
  tags {
    Name = "${format("web%02d", count.index + 1)}"
  }
}

# Cloud watch
# 1分ごとに2回失敗するとリカバリが走る
# http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/UsingAlarmActions.html
# namespace: https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/aws-namespaces.html
# dimenstion: http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/ec2-metricscollected.html#ec2-metric-dimensions
resource "aws_cloudwatch_metric_alarm" "recovery" {
  alarm_name            = "recovery ${format("web%02d", count.index + 1)}"
  comparison_operator   = "GreaterThanOrEqualToThreshold"
  evaluation_periods    = 1
  metric_name           = "StatusCheckFailed_System"
  namespace             = "AWS/EC2"
  period                = 60
  statistic             = "Minimum"
  threshold             = 2
  alarm_actions         = ["arn:aws:automate:${var.aws_default_region}:ec2:recover"]
  dimensions = {
    InstanceId = "${element(aws_instance.web.*.id, count.index)}"
  }
  count                 = "${lookup(var.const, "count")}"
  # テスト用
  insufficient_data_actions = ["arn:aws:automate:${var.aws_default_region}:ec2:recover"]
  # webに依存させる
  depends_on            = ["aws_instance.web"]
}

```
SSH経由で分割ダウンロードが出来た場合、果たしてそれは速くなるのか。（LFTP pgetの紹介）

事の始まりはこちら"[急いでダウンロードしたい時はwgetやcurlじゃなくてaxelを使おう](http://qiita.com/sarumonera/items/2b30999d7d41a4747d74)"で紹介されている[AXEL](https://github.com/eribertomota/axel)です。これと同じように、SSH経由でもリモートサーバから分割ダウンロードを行うことで高速化を図ることは出来ないか、というのを調べてみました。

## LFTPのpget

そこでいろいろ調べてみたところ、どうやら[LFTP](https://lftp.yar.ru/)の`pget`が良いらしい。ということで早速インストールしてヘルプを読んでみることに。

```
$ lftp
lftp :~> help pget
Usage: pget [OPTS] <rfile> [-o <lfile>]
Gets the specified file using several connections. This can speed up transfer,
but loads the net heavily impacting other users. Use only if you really
have to transfer the file ASAP.

Options:
 -c  continue transfer. Requires <lfile>.lftp-pget-status file.
 -n <maxconn>  set maximum number of connections (default is is taken from
     pget:default-n setting)
 -O <base> specifies base directory where files should be placed
lftp :~> quit
```

Usageの概要の部分を読んでみると **「転送スピードを上げることはできますが、ネットへ重い負荷をかけるので他のユーザへ影響がでます。どうしても必要な時にだけ使って下さい」** とのこと。なかなか期待ができます。

## LFTPのインストール

LFTPはパッケージ・マネージャで簡単にインストールできます。

```
## Macの場合
$ brew install lftp

## Ubuntuの場合
$ sudo apt-get install lftp

## CentOSの場合
$ sudo yum install lftp
```

## HTTP経由で分割ダウンロードしてみる

冒頭で紹介したリンク先にある例をお借りしますが、CentOS 7のミニマム・イメージを１０分割でダウンロードする場合のコマンドはこうなります。

```
$ lftp -e 'pget -c -n 10 http://mirror.fairway.ne.jp/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso && quit'
```

**速いです。** 僕が試したところ、AXELよりもpgetの方が若干速いという結果になりました。ただ、何度も何度も試したわけではないのでそこは誤差の範囲内だと思っています。それと`-c`オプションを付けておくと、途中でキャンセルやフェイルした後でもダウンロードを再開することができます。

> **注意:** くどいかもしれませんが、複数のセッションを張って帯域を圧迫するので他のユーザに迷惑をかけることになります。その点を認識したうえで必要に応じて使って下さい。それはAXELも同じですね。

## SSH経由で分割ダウンロードしてみる

ひとまずリモート・サーバ(例えば`192.168.10.101`)の`user1`のホーム・ディレクトリに`CentOS-7-x86_64-Minimal-1511.iso`を保存したと仮定します。それをいつも通りscpを使ってダウンロードする場合はこうなりますね。

```
$ scp user1@192.168.10.101:CentOS-7-x86_64-Minimal-1511.iso .
```

それをLFTPのpgetを使って10分割ダウンロードする場合はこうなります。

```
$ lftp -e 'pget -c -n 10 CentOS-7-x86_64-Minimal-1511.iso && quit' sftp://user1:DUMMY@192.168.10.101
```

`DUMMY`の部分はパスワードですが、SSH鍵認証が設定済みであれば`DUMMY`のままで大丈夫です。パスワード認証が失敗すると自動的にSSH鍵認証に切り替わる仕組みになっています。（* パスワードを省略するとパスワード・プロンプトが出てきます。）

では計測結果ですが、**SSH経由の場合は分割ダウンロードしても速くなりませんでした。** 残念。。。よく考えてみると理由は単純で、SSHは1対1の通信だからです。分割してセッションを増やしたとしても１対１であることがボトルネックになってしまいます。ただ、DNSラウンドロビンか何らかの方法で１つのドメイン名に対して複数のサーバーへSSHのセッションを張れるのであれば、速くなる可能性はあります。

最後になりますが、ご覧のとおりLFTPはインタラクティブなツールなので、シェル上でワンライナーにするためには`-e`オプションと`&& quit`で挟む一手間があります。その点は仕方ありませんが、LFTPには`pget`だけではなく、`mirror`などのすごく便利なコマンドがあるので、知っておくと重宝すると思います。mirrorとpgetを組み合わせて使うこともできます。

## 参考リンク

- [Using lftp with ssh-agent](http://unix.stackexchange.com/questions/181781/using-lftp-with-ssh-agent)
- [lftp to accelerate ftp / http download speed under Linux and UNIX](http://www.cyberciti.biz/tips/linux-unix-download-accelerator.html)
大量のファイルを Nearline Storage にtarで固めながらアップロードする

SubversionのHomeフォルダをまるごとNearline Storageへアップロードしていたのだが、流石にファイル数が多くてコピーだけで5$/monthかかるようになってしまっていたので試験的に導入。

```
tar cf - ~/* | /usr/local/bin/gsutil cp - gs://[bucket-url]/`date +%Y%m%d-%H%M%S`.tar
```

いわゆるワンライナー。複数転送はできないので時間がかかってしまうが、仕方ない。

```
tar czf - ~/* | /usr/local/bin/gsutil cp - gs://[bucket-url]/`date +%Y%m%d-%H%M%S`.tar.gz
```
も可能っぽい。
iOS 12時間制設定時に SwiftyDropbox がクラッシュする問題への対処

## 問題

'16/8/11 現在、SwiftyDropbox 最新版の v3.2.0 では、iOS の日時設定を12時間制にした状態でクラッシュするという問題があります (原因は NSDateFormatter に locale が設定されておらず、地域によって日時の parse が失敗するからです。詳細は [Technical Q&A QA1480 - NSDateFormatter and Internet Dates](https://developer.apple.com/library/ios/qa/qa1480/_index.html) を参照。)

このバグは [Issue 47](https://github.com/dropbox/SwiftyDropbox/issues/47)で報告されていますが、現時点ではまだ修正されていません。修正パッチのプルリクエストも送ったのですが、まだ取り込んでもらえていないようです。

## 対処方法

暫定対処になりますが、私が修正したバージョンを[Github で公開](https://github.com/tmurakam/SwiftyDropbox/tree/feature/fix-issue47)していますので、こちらを使えば問題は発生しなくなります。以下のように Podfile に記述して pod install すれば OK です。

```ruby:Podfile
#pod 'SwiftyDropbox'
pod 'SwiftyDropbox', :git => 'https://github.com/tmurakam/SwiftyDropbox.git', :branch => 'feature/fix-issue47'
```

いずれ本家側で修正されると思いますので、その際は記述を戻してください。
API Connect (LoopBack) でUserモデルが作れない際の対処

# 背景
API Connectのウィザードを使ってUserという名前のモデルを作ると、怒られてしまいます。

```bash
$ apic create --type model
? Enter the model name: User
? Select the data-source to attach User to: memory (memory)
? Select model's base class PersistedModel
? Expose User via the REST API? Yes
? Custom plural form (used to build REST URL):
? Common model or server only? server
Validation error: invalid ModelDefinition
 - name: is not unique
Error: The `ModelDefinition` instance is not valid. Details: `name` is not unique (value: "User")
```

ちなみに、userという名前であれば通ります（後述しますが、推奨されていません）。

# 原因
LoopBackが最初からUserというモデルを用意しており、それと名前が被るため作成することができません。

# 対処
LoopBackのドキュメントに書かれています。

> You must create your own custom model (named something other than "User," for example "Customer" or "Client") that extends the built-in User model rather than use the built-in User model directly.  The built-in User model provides a great deal of commonly-used functionality that you can use via your custom model.

> https://docs.strongloop.com/display/public/LB/Using+built-in+models#Usingbuilt-inmodels-Usermodel

日本語訳すると、↓のような感じです。

> ビルトインのUserモデルを直接使うのではなく、"User"以外の名前（例えば"Customer"や"Client"）でUserモデルを継承したカスタムモデルを作って使わなければなりません。
> ビルトインのUserモデルは、通常使われるものより多くの機能を持っているからです。

また、先頭のUを小文字にしたuserモデルは作れますが、ドキュメントで釘を刺されています。

> To avoid confusion, it's also best to avoid "user" with a lowercase "u" .

> https://docs.strongloop.com/display/public/LB/Extending+built-in+models#Extendingbuilt-inmodels-ExtendingmodelsusingJSON

一応訳すと、↓のような感じです。

> 混乱を避けるため、小文字のuを使ったuserという名前も付けないようにしましょう。


# 結論
というわけで、CustomerやClientという名前のモデルを作り、Userモデルを継承するのがベストな方法のようです。

# 所感
もうちょっと被らない名前にして欲しかったんですが……。
【メモ】JSライブラリ集


随時更新

## カルーセル

- [slick](http://kenwheeler.github.io/slick/)
	- 王道

- [bxslider](http://bxslider.com/)
	- slick使い始めてからは２番手
	- http://matome.naver.jp/odai/2137652675696337801

- [liteAccordion](http://stitchui.com/liteaccordion/)
	- 水平アコーディオン


## メニュー

- [Pure Drawer](http://mac81.github.io/pure-drawer/index.html)
	- シンプルなドロワーメニュー
	- [ドロワーメニューまとめ](http://ichimaruni-design.com/2015/07/drawer-jquery-css/)

- [Mega Dropdown](https://codyhouse.co/gem/mega-dropdown/)
	- 大規模サイト向けドロップダウンメニュー

## ツールチップ

- [PowerTip](https://stevenbenner.github.io/jquery-powertip/)
	- 一般的
- [intro.js](http://introjs.com/)
	- チュートリアル表示

## ズーム

- [Magnifier.js](https://github.com/mark-rolich/Magnifier.js)
	- Amazonの商品画像のズームに近いイメージ

- [jQzoom](http://coursesweb.net/jquery/jqzoom-image-magnifier_jp)
	- サムネイルクリックで画像を切り替えられる


## フォーム

- [jqTransform](http://www.dfc-e.com/metiers/multimedia/opensource/jqtransform/)
	- フォームを一瞬で良い感じにする

## スクロール
- [jquery.inview](https://github.com/protonet/jquery.inview)
	- 要素がページに入ったら何かさせるプラグインの王道
	- [ウィンドウ内に要素が表示されたときに処理を行う](http://on-ze.com/archives/2679)
- [scrollInTurn.js](http://creator.aainc.co.jp/archives/5357)
	- 要素がページの中に入ってきたらfadeInさせる
- [sweet-scroll.js](https://github.com/tsuyoshiwada/sweet-scroll)
	- スムーススクロールのライブラリ
	- [ES6フレンドリーなスムーススクロール「sweet-scroll.js」を作りました](http://webdesign-dackel.com/2015/12/17/sweet-scroll/)


## アニメーション

- [velocity.js](http://julian.com/research/velocity/)
	- 王道
- [anime.js](http://anime-js.com/)
	- 新入り

## ポップアップ
- [ColorBox](http://www.webantena.net/javascriptjquery/jquery-plugin-colorbox/)

- [prettyphoto](http://www.no-margin-for-errors.com/projects/prettyphoto-jquery-lightbox-clone/)

## 音

- [Howler.js](https://howlerjs.com/)
	- 王道

- [Boombox.js](http://cyberagent.github.io/boombox.js/)
	- ブラウザ間の差異を吸収（最近は多くのブラウザがweb audioに対応しているので、使わないほうが上手くいくケースが増えてる）

- [Recorder.js](https://github.com/mattdiamond/Recorderjs)
	- 音声録音 -> wav変換

- [Tone.js](https://tonejs.github.io/)
	- 決まった音階を簡単に奏でることができる

## トラッキング

- [tracking.js](https://trackingjs.com/)
	- カメラで動きを検知

- [clmtrackr](https://github.com/auduno/clmtrackr)
	- フェイストラッキング
webpack の CommonsChunkPlugin は Global を汚すのでぷち注意

# tl;dr

```webpackJsonp``` の Global 名を変更するオプションは ```output.jsonpFunction```.
自分のとこと何らかの事情で同居する外製 js が共に webpack を使い、共に CommonsChunkPlugin を使い、共にデフォルト設定のままだと Global 名が衝突して上書きされて惨劇が起こる。
自分とこのサービスを表す特異な名前にしておくとぶつかりづらいと思う。
https://webpack.github.io/docs/configuration.html#output-jsonpfunction

# 前置き

* うちのサービスでは webpack を使ってる
* webpack の標準 plugin である CommonsChunkPlugin を使ってる。この plugin は multi entry points なサイトで効果的。複数 entry points 間で共通の module を 1 file に集めてくれる
* 世は js を concatenate して 1 page で読み込む js は出来るだけ減らすのが主流。その状況で multi entry points だと共通で利用する module も各 entry point ごとにくっつけてしまいサイズが大きくなる。あと uglify も毎回実行されて production 設定での transpile がクソ遅くなる。それらのデメリットを軽減してくれる
* see https://github.com/webpack/webpack/tree/master/examples/multiple-commons-chunks
* この plugin は entry points ごとに必要な module を　Global object に入れる。つまり Global 汚染する。デフォルトではこの名前は ```webpackJsonp```

# ある日の出来事

同僚「weakbosonさん、A社のjs SDK使うとエラーが出るんですけど。」
私「えー、なんてエラー？」
同僚「undefined is not function とかなんとか。A社SDKの中でエラーが出てます。」
私「うちのCommonsChunkとA社SDKの読み込み順を変えるとどうなる？」
同僚「今度はうちのjsの中でエラーが出て動かなくなりました。」
私「……だいたい察しがついた。」

調べて設定のことを知るとデフォルト設定のままだったのカコワルイなあと思い、こちらが退きました。
Windows/Google日本語入力+HHKBでMac風の英字/かな変換をする


# はじめに

## HHKBの「全角/半角」キー

HHKBのデフォルトの設定では、左の「Win」と書いてあるキーが全角/半角キーになっており、これを押すと英字とひらがなが入れ替わります。

Windowsではこのキーをよく使うのですが、この位置に「全角/半角」キーがあるのは非常に使いづらいです。

## Windows と Mac を両方使っている場合

また、MacとWindowsを両方使っている場合、Macでは「英数」キーと「かな」キーを使って入力切り替えをするため、頭の切り替えが必要になります。

# WindowsでもMacと同じ感覚で全角/半角を切り替えたい

そこで、Windwos/Google日本語入力の設定を変更し、Macの「英数」「かな」キーと同じキーバインドにしてみました。

左Winキーの隣にあるキー（「無変換」キー）に英字を割り当てて、右Winキーの隣にあるキー（「変換」キー」）にかなを割り当てます。

# 設定方法

## 設定画面の開き方

1. 右下、Google日本語入力の「A」とか「あ」とか出ている部分を右クリックして「プロパティ」を開く
2. 「一般」タブの「キー設定」に「キー設定の選択」という項目がある
3. 「MS-IME」を選択した上で横の「編集」ボタンを押す。

## 設定内容

### Before

最初はこんな設定になってると思います。

|モード|入力キー|コマンド|
|:--|:--|:--|
|直接入力|Henkan|再変換|
|入力文字なし|Muhenkan|次のかな文字種に入力切替|

### After

以下のように設定変更します

|モード|入力キー|コマンド|
|:--|:--|:--|
|直接入力|Henkan|IMEを有効化|
|入力文字なし|Muhenkan|IMEを無効化|

以上で設定は終了です。

* HHKBのスペースキーの左のキーで英字入力（N みたいな形のキー）
* HHKBのスペースキーの右のキーで日本語入力（O みたいな形のキー）

になっているかと思います。
【数A】文系卒社会人が統計・機械学習を理解するために勉強した

#サマリ
統計・機械学習を理解するために数学の知識が足らず勉強を始めました。その経緯などは[「文系卒が統計・機械学習を理解するための数学勉強方法」](http://qiita.com/FukuharaYohei/items/0a66c37091dc27c71fe6)を参照ください。
また、数Ⅰについては[「【数Ⅰ】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/78ec8690043b34d39020)を参照ください。
※2003年以前の学習指導要領に準拠しています。

|項目|内容 |
|:-----------------|:------------------|
| 総勉強時間        |            **12h**(約2週間) |
| 使用教材        |[長岡先生の授業が聞ける高校数学の教科書数学 (考える大人の学び直しシリーズ)](http://amzn.to/2nueRau) <br> 数Aは約130ページの内容です。|
| 勉強開始前の状態 |数学の勉強は高校以来やっていない状態。数学は嫌いではないが、高校2年生くらいで授業についていくのが辛くなってきていました。ちなみに高校が付属校なので大学受験はしていません。<br>数Ⅰは同じ教材で学習済み。|
#やった内容
###1. 集合と論理
集合：ある性質を満たすものの全体を１つのものと見なしたとき、それを**集合**と呼びます。「1から100までの自然数」といったのが集合の例です。
統計のもととなるデータは集合であり、**記述統計を理解するうえで重要**な内容です。
論理は命題に対して真・偽を判定したり、逆・対偶などの内容です。
詳しくは[リンク先](https://ja.wikibooks.org/wiki/%E9%AB%98%E7%AD%89%E5%AD%A6%E6%A0%A1%E6%95%B0%E5%AD%A6A/%E9%9B%86%E5%90%88%E3%81%A8%E8%AB%96%E7%90%86)を参照ください。さほど時間をかけずに理解できました。
###2. 順列と組み合わせ
####場合の数
**ある事柄について起こり得るすべての場合を数え上げた時の総数を場合の数**と呼びます。サイコロを2個転がしてでる目の組み合わせなどです。
####順列
**いくつかのものを順序性を考慮して1列にしたものを順列と呼びます**。3種類の硬貨を左から順に並べた時の場合の数などが順列にあたります。
$n$個から$r$個をとった順列を$\begin{eqnarray}{}_n P _r\end{eqnarray}$で表現し、以下の形で計算できます。
>```math
\begin{eqnarray}{}_n P _r\end{eqnarray} = \frac{n!}{(n-r)!}
```

「!」は**階乗**と呼び、$n! = n(n-1)\cdots3・2・1$で計算します($0!=1$)。
詳細は[リンク先](http://juken-mikata.net/how-to/mathematics/permutation.html)を参照ください。
####組合せ
順列とは異なり、順序性を考慮しないものが組合せです。「10人の中から3人を選ぶ場合の数」などです。
$n$個から$r$個をとった組合せを$\begin{eqnarray}{}_n C _r\end{eqnarray}$で表現し、以下の形で計算できます。
>```math
\begin{eqnarray}{}_n C _r\end{eqnarray} = \frac{n!}{r!(n-r)!}
```

また、ここで**[パスカルの三角形](https://ja.wikipedia.org/wiki/%E3%83%91%E3%82%B9%E3%82%AB%E3%83%AB%E3%81%AE%E4%B8%89%E8%A7%92%E5%BD%A2)**や**[二項定理](https://ja.wikipedia.org/wiki/%E4%BA%8C%E9%A0%85%E5%AE%9A%E7%90%86)**を学びます。
###3. 確率
「確率とその基本性質」・「独立な試行とその確率」と「期待値」の3つの内容です。統計の基礎なので重要ですが、逆に統計基礎を勉強済みならスキップしてもいいと思います。
###4. 平面図形
**三角形と円の定理が18もあります** :weary: 「中点連携定理」や「方べきの定理」などです。ひとつひとつは、そこまで難しくないのですが、組合せて問題を解く場合には時間がかかります。あまりに多いのでここには載せません。数Bのベクトルでも使う基礎的内容なので、重要だとは思いますが暗記まではしませんでした。

#感想
**だいたいは、そんなに難しくもなく、すいすいと勉強できました。**「平面図形」のみ、少し難しく時間がかかりました。逆に「確率」は、統計の基礎的知識を持っていたので非常に簡単に感じました。
**全般的に統計にダイレクトに関係する内容が多いので、統計・機械学習を理解する上で数学を勉強する人にはいい基礎勉強**です。
[「【数Ⅱ】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/5647cde590902cc42ec4)に続きます。
ansibleのosx_defaultsモジュールの設定項目一覧

#ansible osx_defaultsとは？
OSXのシステム環境設定から設定する各種項目をansibleから扱うためのモジュール
[osx_defaults - Ansible Documentation](http://docs.ansible.com/ansible/osx_defaults_module.html)

#現在の設定一覧
```
$ defaults read
{
    "Apple Global Domain" =     {
        AppleActionOnDoubleClick = Maximize;
        AppleAntiAliasingThreshold = 4;
        AppleLanguages =         (
            ja,
            en
        );
        AppleLocale = "ja_JP";
        AppleMiniaturizeOnDoubleClick = 0;
        NSPersonNameDefaultDisplayNameOrder = 0;
        NSPersonNameDefaultShortNameFormat = 0;
        NSPersonNameDefaultShouldPreferNicknamesPreference = 0;
        NSPreferredWebServices =         {
            NSWebServicesProviderWebSearch =             {
                NSDefaultDisplayName = Google;
                NSProviderIdentifier = "com.google.www";
            };
        };
        NSUserDictionaryReplacementItems =         (
        );
        "com.apple.springing.delay" = "0.5";
        "com.apple.springing.enabled" = 1;
        "com.apple.trackpad.forceClick" = 1;
    };
    "com.apple.AddressBook" =     {
        ABBirthDayVisible = 1;
        ABMetaDataChangeCount = 6;
        ABMetadataLastOilChange = "2016-08-11 09:12:03 +0000";
        ABVersion = 1419;
    };
    "com.apple.AppleMultitouchMouse" =     {
        MouseButtonDivision = 55;
        MouseButtonMode = OneButton;
        MouseHorizontalScroll = 1;
        MouseMomentumScroll = 1;
        MouseOneFingerDoubleTapGesture = 0;
        MouseTwoFingerDoubleTapGesture = 3;
        MouseTwoFingerHorizSwipeGesture = 2;
        MouseVerticalScroll = 1;
        UserPreferences = 1;
        version = 1;
    };
…
```

GitHubでplaybookを公開してくれている人のサンプルに設定変更したい項目の記載がない場合は自分で探すしかないため、上記コマンドを実行して

- ドメイン(e.g. com.apple.AppleMultitouchMouse)
- キー(e.g. MouseMomentumScroll）

を特定していく。

ぶっちゃけシステム環境設定から手動で設定したほうが早いのだが、どうしても自動化したい自動化マニアの方には需要あるかもしれない。なければ爆発する。
CentOS Command Cheat Sheet

# <i class="fa fa-television" style="font-size:1em;"></i> はじめに

CentOSで使用するコマンドで忘れがちなものを纏めました。

# <i class="fa fa-television" style="font-size:1em;"></i> 環境

<i class="fa fa-caret-right" style="font-size:1em;"></i> OS : CentOS 7.2.1511

# <i class="fa fa-television" style="font-size:1em;"></i> 前提

<i class="fa fa-caret-right" style="font-size:1em;"></i> 基本的なLinuxコマンド

# <i class="fa fa-television" style="font-size:1em;"></i> 参考

なし

# <i class="fa fa-television" style="font-size:1em;"></i> 解説

## バージョン確認

```text:実行
# cat /etc/redhat-release
```

```text:結果
CentOS Linux release 7.2.1511 (Core)
```

アーキテクチャ（32ビット/64ビット）の確認を行うには下記コマンドを実行します。
出力結果に【x86_64】と表示されていれば64ビットOSが動作しています。
出力結果に【i386】や【i686】のように、【i〇86】の表記であれば32ビットOSとなります。

```text:実行
# uname -m
```

```text:結果
x86_64
```

## IPアドレス確認

```text:実行
# ip address show
```

```text:結果
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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
       valid_lft forever preferred_lft forever
    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 00:15:5d:0b:0c:05 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.18/24 brd 192.168.11.255 scope global dynamic eth0
       valid_lft 171631sec preferred_lft 171631sec
    inet6 fe80::215:5dff:fe0b:c05/64 scope link
       valid_lft forever preferred_lft forever
```

## ルーティングテーブル確認

```text:実行
# ip route
```

```text:結果
default via 192.168.11.1 dev eth0  proto static  metric 100
192.168.11.0/24 dev eth0  proto kernel  scope link  src 192.168.11.18  metric 100
```
bash on windowsはConEmuで使うと良い見た目

# コマンドプロンプトの見た目はあまり良くないではないか？
この記事を書こうと思ったきっかけはbash on windowsを使ってる時にコマンドプロンプトの見た目が気になったからである。

特に、私はvimのカラースキーマでhybridというのを使っており、そちらが256色表示に対応していないと使用できないのである。私はこのカラースキーマに慣れすぎているため、ここで使えなくのは痛い。

# 解決策：ConEmuからbashを使う
そこでConEmuを使うと上記の問題を解決できることがわかった。
https://osdn.jp/projects/conemu/

起動方法はConEmu上でbashと打てば良い

ConEmuであれば256色表示が対応しているし動きも悪くないのでしばらくはこれを使っていこうかと思う
Macで再起的にファイルを検索してBOMを取り除く

BOMの入ったHTMLファイルがたくさんコミットされていて、ページが崩れていたので一気に置換しようと思ったが、なかなかうまくできなかったのでメモ残しときます。

```
find . -type f -print0 | xargs -0 awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}' | xargs perl -pi -e 's/^\xEF\xBB\xBF//g'
```

sedで同じファイルで上書きするのがなかなかできなくて[この辺](http://stackoverflow.com/questions/12696125/sed-edit-the-file-in-place)を参考にperlを使いました。

StackOverFlowでよく見かける下記はうまく動かなかった。理由は詰めていないがMacだからかな？

```
find . -type f -exec sed '1s/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;
```

http://stackoverflow.com/questions/204765/elegant-way-to-search-for-utf-8-files-with-bom
Rails omniauth-facebookでFirst_nameとLast_name、Genderを取得する

## 前提
omniauth-facebookでfacebookログイン自体は完成していること(順序逆ですが、そのうちFacebookログインについても書きます)。

## やりたいこと
デフォルトでは取得出来ないFacebookログイン時にuserのFirst_nameとLast_name、Genderを取得する。

## 実装

```Ruby
// models/user.rb
def self.from_omniauth(auth)
    user = User.where('email = ?', auth.info.email).first
    if user.blank?
      user = User.new
    end
    //ここにbinding.pryでAPIから何が取得できているか確認しながら作業するのがオススメです。
    user.facebook_uid   = auth.uid
    user.name  = auth.info.name
    user.email = auth.info.email
    user.first_name = auth.extra.raw_info.first_name
    user.last_name = auth.extra.raw_info.last_name
    user.gender = auth.extra.raw_info.gender
    user.facebook_icon  = auth.info.image
    user.facebook_token      = auth.credentials.token
    user.facebook_expires_at = Time.at(auth.credentials.expires_at)
    user
  end
```
modelのuser.rbに以下を追加します。
・`user.first_name = auth.extra.raw_info.first_name`
・`user.last_name = auth.extra.raw_info.last_name`
・`user.gender = auth.extra.raw_info.gender`
※ usersテーブルに`first_name`、`last_name`、`gender`カラムを作っていない場合は、
`rails g migration AddColumnToUsers first_name last_name gender`とすればカラムを作成できます。
コメントでも書きましたが、binding.pryで処理を止めて、`auth`とpryに入力すれば取得しているデータを確認出来るので、いいかと思います。


```Ruby
# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET_KEY'], info_fields: 'first_name, last_name, gender'
end
```

環境変数の後に`info_fields`を追加してあげます。

以上でfirst_nameとlast_name、genderを取得できます。
Windows 10のAnniversary Updateが思いの外凄かった。

# 概要
2016年08月02日から提供され始めたWindows10のAnniversary Updateが思いのほか凄かったので書き貯め。

# Windows 10 Anniversary Updateの入手
基本的には自動で順次適用されていきますが、今すぐ更新を適用したい場合には[Windows 10の更新履歴（Microsoft）](https://support.microsoft.com/ja-jp/help/12387/windows-10-update-history)ページからWindows 10アップグレードアシスタントが入手可能です。
起動して操作を進めていくと、以下のように更新が適用されていきます。
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/05301f6c-2550-703f-f056-78c94ccb5826.jpeg)


PCが何度か再起動して更新が終了したら、設定>更新とセキュリティ>開発者向けの項目から「開発者モード」を選択する。
![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/9c9996ef-83f1-4094-af96-b84d99db277d.jpeg)

無事開発者モードへの設定が完了したら、Windowsの機能の有効化または無効化から、Windows Subsystem for Linux (Beta)を有効化。
![007.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/15b713fc-a3c7-6c9a-2e96-0d4628db9d13.jpeg)

最後に、コマンドプロンプトから"bash"を実行することで
機能のインストールが開始されます。
あとは、指示に従って入力を進めれば完了です。
![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/123978fc-959e-e1ee-5da9-daf390e907b9.jpeg)
![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/cfe4e1e1-c280-cbb8-2218-7db3b0f4591b.jpeg)

# 少し使ってみた
とりあえず、emacsでファイルを開いてみる。
![009.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/99782875-d42b-f868-babf-cd1887806b80.jpeg)

![010.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/a012c1ee-e8f4-b49c-8ccb-a08a3b58ae8a.jpeg)

全体的に日本語対応が微妙なようですが、それを除けば全く問題なさそうですね。
今後に期待です。
Unity5.4からBuildPipeline.BuildPlayerメソッドにEditorBuildSettingsScene[]なオーバーロードが加わった

多くの新機能が追加されたUnity5.4。待ちに待ったUnity5.4。

そんなUnity5.4では、BuildPipelineクラスのBuildPlayerメソッドに、EditorBuildSettingsSceneの配列を引数にとるものが追加さました。

apkやXcode Projectなどのビルド成果物を生成するBuildPipelineクラスのBuildPlayerメソッドは、Unity5.4以前では、次のように書く必要がありました。

```csharp:
// ビルド対象シーンのパスの配列
string[] scenes = EditorBuildSettings
    .scenes
    .Where(it => it.enabled)
    .Select(it => it.path)
    .ToArray();

// 先のビルド対象シーンのパスの配列を引数にとるBuildPipeline.BuildPlayerメソッド
string errorMessage = BuildPipeline.BuildPlayer(
    levels: scenes,
    locationPathName: outputPath,
    target: BuildTarget.Android,
    options: BuildOptions.None);
```

BuildPipeline.BuildPlayerには、ビルド対象のシーンの`パス`を渡す必要がありました。EditorBuildSettings.scenesプロパティは、EditorBuildSettingsSceneの配列型なので、それをパスに変換する必要がありました。普通にEditorBuildSettingsSceneの配列を渡したくないですか？

Unity5.4からBuildPipeline.BuildPlayerメソッドにEditorBuildSettingsScene[]なオーバーロードが加わったので、次のように記述することができます。

```csharp:
// ビルド対象シーンの配列
EditorBuildSettingsScene[] scenes = EditorBuildSettings
    .scenes
    .Where(it => it.enabled)
    .ToArray();

// 先のビルド対象シーンの配列を引数にとるBuildPipeline.BuildPlayerメソッド
string errorMessage = BuildPipeline.BuildPlayer(
    levels: scenes,
    locationPathName: outputPath,
    target: BuildTarget.Android,
    options: BuildOptions.None);
```

地味な改良ですが、うれしいですね。

* [UNITY 5.4リリース – 新機能のご紹介](http://blogs.unity3d.com/jp/2016/07/28/unity-5-4-is-out-heres-whats-in-it/)
* [スクリプトリファレンス BuildPipeline.BuildPlayer](https://docs.unity3d.com/ScriptReference/BuildPipeline.BuildPlayer.html)
* [Unity 5.4 リリースノート](https://unity3d.com/jp/unity/whats-new/unity-5.4.0)
ディレクトリごとに環境変数を設定するdirenvをMacで使う



環境変数をディレクトリごとに切り替えたい時に便利だったのでメモっておきます
環境はOS X El Capitan(10.11.4)でbrew使ってます

[GitHub direnv](https://github.com/direnv/direnv#setup "GitHub direnv")

## インストール

homebrew使ってインストールします

`brew install direnv`


## 設定

お使いのshellに合わせて設定ファイルを変えてください
僕はzshを使っているので

`.~/zshrc`の一番下に追加しました

```.zshrc:.zshrc
export EDITOR="vim"
eval "$(direnv hook zsh)"
```

設定読み込み
`source ~/.zshrc`

EDITORはterminal上で`direnv edit .`する時に選択されるエディタです、vim使います

## 使い方

特定の環境変数を試したいディレクトリを作成

例えば
`mkdir ~/test_direnv`

test_direnvに入って

`direnv edit .`

するとvimが立ち上がって.envrcの編集中になります


$GOPATHをいつもとは違う設定にしたい場合
※test_direnv以外のディレクトリで普段のGOPATHが例えば以下のようだったとして

```
echo $GOPATH

>> /Users/oshikawatakashi/golang
```

.envrcを次のように編集して保存すると

```.zshrc:.zshrc
export GOPATH=`pwd`
```

test_direnvの中でだけは

```
echo $GOPATH

>> /Users/oshikawatakashi/test_direnv
```

このように変更されています、他のディレクトリで出力すると元のままです

※こんなエラーが出る時

<pre>
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
</pre>

言われたとおりにこちらのコマンドを実行して解決

`direnv allow`



## 所感
プロジェクトごとにGOPATH切り替える時にかなり便利です



## 参考
こちらの記事です

[direnvを使おう](http://qiita.com/kompiro/items/5fc46089247a56243a62 "direnvを使おう")
Rails5のAPIモードを超速で試す


install
-----

```
gem update --system
gem install rails
```

Rails API アプリケーションを作る
-----

```
rails new rails-api --api
```

`--api` がキモ。この指定でAPIモードになる。


APIを作る
-----

適当にusersのAPIを作る

```
rails g scaffold users
```

Rails4の時同様、コントローラー、モデルができるがAPIモードなのでビューはできない。
コントローラーはこんな感じ。

```UserController.rb
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :update, :destroy]

  # GET /users
  def index
    @users = User.all

    render json: @users
  end

  # GET /users/1
  def show
    render json: @user
  end
  
  #・・・略
end
```

早速動かす
-----

```
rails db:migrate
```

`rake` ではなく `rails` になっている。慣れていこう。

```
rails s
```

確認

```
curl http://localhost:3000/users
```

データ入れてないので空のArrayが返ってきた。

```
[]
```


まとめ
-----

ここまでの所要時間わずか数分！！！はっや！！
とりあえず動いたのでこれから深く追っていく

以上！！
CentOS7 パッケージ管理（yum）の設定



# 概要
yumの設定を行う。レポジトリの追加等。


# レポジトリの優先順位を決めるプラグインを導入

標準リポジトリと追加リポジトリの両方から提供されている重複パッケージは、標準リポジトリ提供のものを優先するようにプラグインを入れておく。

```bash:yum-plugin-prioritiesのインストール
sudo yum -y install yum-plugin-priorities

<出力結果>
（中略）
インストール:
  yum-plugin-priorities.noarch 0:1.1.31-42.el7

完了しました!
```


# EPELレポジトリを追加 

以下のコマンドで追加のレポジトリを登録する。

```bash:EPELレポジトリの追加
sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
sudo yum -y install epel-release

<出力結果>
（中略）
インストール:
  epel-release.noarch 0:7-9

完了しました!
```

以下のコマンドで追加のレポジトリを無効化する。

```bash:EPELレポジトリの無効化
sudo sed -i.`date "+%Y%m%d"` -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo
```


# CentOS SCLo Software collectionsレポジトリを追加 

以下のコマンドで追加のレポジトリを登録する。

```bash:SCLoレポジトリの追加
sudo yum -y install centos-release-scl-rh centos-release-scl

<出力結果>
（中略）
インストール:
  centos-release-scl.noarch 0:2-2.el7.centos                centos-release-scl-rh.noarch 0:2-2.el7.centos

完了しました!
```

以下のコマンドで追加のレポジトリを無効化する。

```bash:SCLoレポジトリの無効化
sudo sed -i.`date "+%Y%m%d"` -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-SCLo-scl.repo 
sudo sed -i.`date "+%Y%m%d"` -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
```


# Remi's RPMレポジトリを追加 

以下のコマンドで追加のレポジトリを登録する。

```bash:Remiレポジトリの追加
sudo rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

<出力結果>
（中略）
インストール:
  remi-release.noarch 0:7.3-2.el7.remi

完了しました!
```

以下のコマンドで追加のレポジトリを無効化する。

```bash:Remiレポジトリの無効化
sudo sed -i.`date "+%Y%m%d"` -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/remi-safe.repo
```

# 追加レポジトリからのインストール方法 

なお原則、追加レポジトリは無効化しておき、以下のオプションで有効化する。

```bash:追加リポジトリからのインストール方法
sudo yum --enablerepo=[Repo Name] install [Package Name]
```

# 次の手順

[sudoの設定](https://qiita.com/mattsun/items/90f037fb9f83b5b9cf10)

以上
Vuforiaのサンプルコードを動かす


[Vuforia](https://developer.vuforia.com/)は無料で使えるARアプリ開発用のライブラリ。
iOS版のサンプルを動かすのに、少し手間取ったのでメモ。

### 環境
* Xcode: Version 7.3.1
* サンプルコード: vuforia-samples-core-ios-6-0-112.zip
* SDK: vuforia-sdk-ios-6-0-112.zip

---
## 事前準備
1. Vuforiaにアカウントを登録する
  * [公式サイト](https://developer.vuforia.com/)右上のRegistから登録
1. VuforiaのSDKをダウンロードする
  * [公式サイト](https://developer.vuforia.com/downloads/sdk)
1. Vuforiaのサンプルコードをダウンロードする
  * [公式サイト](https://developer.vuforia.com/downloads/samples)のCore Features

## 設定
### SDKの設定
1. vuforia-samples-core-ios-6-0-112.zip を展開する
  * 展開後: VuforiaSamples-6-0-112
1. vuforia-sdk-ios-6-0-112.zip を展開する
  * 展開後: vuforia-sdk-ios-6-0-112
1. vuforia-sdk-ios-6-0-112の以下のファイルをVuforiaSamples-6-0-112直下にコピーする
  * vuforia-sdk-ios-6-0-112/build/include -> VuforiaSamples-6-0-112/include
  * vuforia-sdk-ios-6-0-112/build/lib -> VuforiaSamples-6-0-112/lib
1. VuforiaSamples-6-0-112のVuforiaSamples.xcodeprojをXcodeで開く
1. ライブラリを追加
  1. Show the Project navigatorでプロジェクトを開く
  1. VuforiaSamplesの上で右クリック
  1. 「Add Files to "VuforiaSamples"...」を押下
  1. 上で追加した「include」「lib」を選択して「add」を押下
1. ライブラリのリンクを設定
  1. Show the Project navigatorでプロジェクトを開く
  1. VuforiaSamples -> TARGETSのBuild Settings -> Search Pathsへ移動
  1. Header Search Pathsに以下を設定
     * $(PROJECT_DIR)/include
  1. Library Search Pathsに以下を設定
     * $(PROJECT_DIR)/lib

### License Keyの発行
1. Vuforiaの[公式サイト](https://developer.vuforia.com/)右上のLoginからログイン
1. 「Develop」タブを開く
1. 『Add License Key』ボタンを押下
1. Project Type, AppName, Device を入力し「Next」ボタンを押下
1. 「By clicking "Confirm" below,　〜〜」のチェックボックスにチェクを入れて、『Confirm』ボタンを押下
1. Name列にある作成したAppNameのリンクを開く
1. License Keyが発行されている

### License Keyの設定
1. SampleApplicationSession.mmの- (void)initVuforiaInBackgroundにキーを設定する


```Objective-C
- (void)initVuforiaInBackground
{
    // Background thread must have its own autorelease pool
    @autoreleasepool {
        Vuforia::setInitParameters(mVuforiaInitFlags, "");
```
 ↓

```Objective-C
- (void)initVuforiaInBackground
{
    // Background thread must have its own autorelease pool
    @autoreleasepool {
        NSString *key = @"ライセンスキー";
        Vuforia::setInitParameters(mVuforiaInitFlags,[key UTF8String]);
```
## ビルド/サンプル実行
1. Xcodeの「▶︎」押下でサンプルを実行
2. Image Targets -> ナビゲーションバー右の「Start」を押下
3. PCのブラウザで「[Stones, Chips and Tarmac](https://developer.vuforia.com/sites/default/files/sample-apps/targets/imagetargets_targets.pdf)」のPDFを開く
4. 端末をPDFにかざす
  * ティーポットが表示されれば成功
IPFSのP2Pネットワークを特定のノードのみで構成する手順


現在、私は、ひっそりこっそりIPFSとEthereumを使用したシステムを作っております。

開発していると、当然、開発中のお恥ずかしいデータをpublicなP2Pネットワークに撒き散らしたくないという熱い思いが湧いてきます。
なので、私は、EthereumについてはPrivate Blockchain、IPFSについては限定したノードのみで構成されるP2Pネットワークを作る、という形にしています。

今日は山の日、でもボク暇な日、たまにはQiitaに投稿してみるか・・・ということで、
上記のIPFSネットワーク構成する手順について、気合３割弱程度で書いてみます。

## １．ノードIDをゲット

ノードとなる各マシンのIDを下記コマンドでゲットします。

```shell-session
ipfs id
```
すると、JSON形式でノードの情報が表示されます。こんな感じ。

```json
{
	"ID": "〜",
	"PublicKey": "〜",
	"Addresses": [
		"/ip4/127.0.0.1/tcp/4001/ipfs/〜",
		"/ip4/192.168.XXX.XXX/tcp/4001/ipfs/〜",
		"/ip4/10.XXX.XXX.XXX/tcp/18030/ipfs/〜"
	],
	"AgentVersion": "go-libp2p/0.1.0",
	"ProtocolVersion": "ipfs/0.1.0"
}
	
```

この中の、"Addresses" 要素のネットワーク形成にイケてる方（LAN内で閉じるなら多分２番目）のアドレスを控えます。ここは敢えて紙に。鉛筆で。

## ２．ノードIDをセット

下記にIPFSの設定ファイルが配置されています。

```shell
(ユーザディレクトリ)/.ipfs/config
unix系なら ~/.ipfs/config
```

開くと、これまたJSON形式の情報がイッパイ表示されます。
その中にある"Bootstrap"要素のリストを、控えたノードリストで置き換えます。

```json
{
     "Bootstrap": [
       "〜",
       "〜" 
     ],
}
```
そして全力で保存。

## ３．ノードIDをチェック

各マシンのIPFSデーモンを再起動します。
繋がっているかどうかを下記コマンドでチェック。

```shell-session
ipfs swarm peers
```

うまく繋がっていれば、こんな感じで怒涛の勢いでノードリストが表示されます。

```shell-session
/ip4/192.168.XXX.XXX/tcp/4001/ipfs/〜
/ip4/192.168.XXX.XXX/tcp/4001/ipfs/〜
/ip4/192.168.XXX.XXX/tcp/4001/ipfs/〜
```

以上。
ウィンドウのリサイズ時の処理


REVISION: '78'

cameraのaspect、rendererのsizeを一緒に更新する必要がある。

```javascript
function onResize() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
}
// listen to the resize events
window.addEventListener('resize', onResize, false);
```

> 参考
[初めてのThree.js 第2版――WebGLのためのJavaScript 3Dライブラリ](https://www.oreilly.co.jp/books/9784873117706/)