OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi 2 カーネルビルド(クロスコンパイル) ＆ ドライバー入替え

#概要
Raspbianにデフォルトで入っているEthernet-USB変換ICのドライバーを入れ替える必要があったので、ソースコードからドライバー（カーネルモジュール）をビルドしてデフォルトのドライバと入替えた。

ラズパイの有線LANはLAN9514というUSBハブ内蔵タイプのUSB-Ethernet変換ICを使用しており、ドライバーはカーネルに組み込まれていて、変更するにはカーネルのコンパイルが必要となる。
(モジュール化されていないのでmodprobeで入れ替えができない)

このため、実機では日が暮れてもビルドが終わらないと思うのでクロスコンパイルで作業する。
あまり需要はないと思うけど、個人的なメモとして。

#作業項目
- RaspberryPiのカーネルソースとビルドツールを取得する
- カーネルをクロスコンパイル環境でコンフィグ＆ビルド
- ドライバーのソースコードを準備する
- ビルドしたカーネルのディレクトリでドライバーをビルド
- カーネルとドライバーを実機にコピー
- モジュール依存関係の更新
- お疲れ様でした

##RaspberryPiのカーネルソースとビルドツールを取得する
冒頭に書いた通り、カーネルのリコンパイルが必要になるので、githubからカーネルを持ってきて編集します。

(事前準備としてbuild-essentials, git, libncurses5-dev, libssl-devが必要なのでapt-get installしておきます。)
適当な作業ディレクトリに移動して
`git clone https://github.com/raspberrypi/linux.git`
`git clone https://github.com/raspberrypi/tools.git`
でカーネルソースとツールを準備します。

##カーネルをクロスコンパイル環境でコンフィグ＆ビルド
toolディレクトリ下に何種類かツールチェーンがダウンロードされるので最適と思われるものを使いましょう。
今回は
`tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf`
を使用して、長くなるので
`XCC=~/wdir/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf`
として変数に入れておきました。

RaspberryPiデフォルトのコンフィグ情報は実機の/proc/config.gzにあるので、実機があるならこれを何らかの方法でコピーしてきて作業フォルダで
`zcat config.gz > .config
make ARCH=arm CROSS_COMPILE=${XCC} oldconfig`
とすると現在のビルド対象のコンフィグ情報として反映されます。

(追記)
config.gzが見つからない場合はconfigsモジュールをmodprobeすると出てくるようです。
>[configs moduleで/proc/config.gzを呼び出す](https://matoken.org/blog/2016/02/05/call-the-procconfig-gz-in-configs-module/)
>
>kernel buildしようと現在のconfigをコピーしようとしたところ/boot以下にも/proc/config.gzも見当たらない．こういう場合configsというモジュールを読み込むと/proc/config.gzが出来るらしい．

(追記)
実機がなくても下記のコマンドでデフォルトのconfigが作れると思います。
>KERNEL=kernel7
>make bcm2709_defconfig

このあと
`make ARCH=arm CROSS_COMPILE=${XCC} menuconfig`
で必要なコンフィグ情報を変更して該当のドライバーを組込対象から外します。

コンフィグが完了したら
`make ARCH=arm CROSS_COMPILE=${XCC}`
`make ARCH=arm CROSS_COMPILE=${XCC} modules`
でビルド。
`-j8`オプションをつけて30分くらいかかりました。

##ドライバーのソースコードを準備する
ICのメーカー(Microchip)のwebサイトからLAN9500シリーズ用のLinuxドライバーのソースコードをダウンロード、必要な修正をもにょもにょ加えます。
この辺はご自由にどうぞ。

##ビルドしたカーネルのディレクトリでドライバーをビルド
今回のドライバーはビルドスクリプトが付属していたので、その内容を書き換えて、
`make -C ~/wdir/linux ARCH=arm CROSS_COMPILE=${XCC} modules`
になるように修正します。
具体的にはbuildというファイル名のメインのスクリプトから呼ばれるbuild_scriptを変更しました。

変更後`./build`でドライバーをビルド。
公開されているドライバーのソースコードが古いためか、kernel4.4.39ではエラーが出ましたが、デバッグ関係と構造体の予約領域(reserved1)の初期化コードだったのでとりあえず全部コメントアウトで対応しました。
(ちなみにkernel3.13.0では問題なくビルドできた）

##カーネルとドライバーを実機にコピー
今回はカーネルから組込みのドライバを外しているのでドライバだけでなくカーネルごと入替えます。
まずは
`mkdir ~/wdir/modinst
make ARCH=arm CROSS_COMPILE=${XCC} INSTALL_MOD_PATH=~/wdir/modinst modules_install`
としてモジュールをまとめます。これを実機の/libにコピーします。

次にカーネル本体
`~/wdir/linux/arch/arm/boot/zImage`
を実機の/boot/kernel.imgとしてコピーします。

まずはこのカーネルが起動するか確認。
OKならLAN9500のドライバーを実機にコピー。
`~/smsc9500/smsc9500.ko
~/smsc9500/smscusbnet.ko`
を
`/lib/modules/4.4.39+/kernel/drivers/net/usb`
にコピーします。

##モジュール依存関係の更新
モジュールを追加したので
`sudo depmod`
します。

実は何かあったときのためにカーネルコンフィグで、デフォルトのsmsc95xxをモジュールとしてインストールしていたので、新しいドライバが動くことを確認できたら/etc/modprobe.d下にblacklistを作ってデフォルトのモジュールをロードしないようにします。lan9500-blaclist.confというファイル名で下記の記述をしました。
`blacklist smsc95xx`

それから/etc/modulesに新しいモジュール名smsc9500を追加しておきます。
これで再起動時に自動的に修正済みのLAN9514用ドライバがロードされます。

お疲れ様でした。
複数のgitアカウントを使い分ける

## <i class="fa fa-users" aria-hidden="true"></i> gitアカウントが煩雑

日々の業務や個人の開発などのバージョン管理において、gitは外せない日々が続いております。
ただ、使うgitアカウントが煩雑しております。。

* 社内管理は、gitlab <i class="fa fa-gitlab" aria-hidden="true"></i>
* 他社管理は、bitbucket <i class="fa fa-bitbucket" aria-hidden="true"></i>
* 個人の開発は、github <i class="fa fa-github" aria-hidden="true"></i>

などなど。。

ここで、それぞれのアカウントを分けないと、「他社管理のリポジトリ」に「社内管理で使っているハンドルネームでコミット」してしまい、トラブルなどの原因に繋がったり、恥ずかしい思いをしてしまいます。。

## <i class="fa fa-user" aria-hidden="true"></i> メインアカウント設定

業務で良く使うアカウントは、globalにアカウント情報を設定する。(~/.gitconfig)

### ~/.gitconfigへ設定

```
$ git config --global user.name "メインアカウント"
$ git config --global user.email "メインアカウントメールアドレス"
```

### 反映しているか確認

```
$ cat ~/.gitconfig

[user]
	name = メインアカウント
	email = メインアカウントメールアドレス
```




## <i class="fa fa-user-o" aria-hidden="true"></i> サブアカウント設定

頻度が低めな開発などのアカウントは、リポジトリ単位でアカウント情報を設定する。(./.git/config)
※リポジトリ内の`./.git/config`に設定する。

```
cd Project/develop
$ git config --local user.name "サブアカウント"
$ git config --local user.email "サブアカウントメールアドレス"
```

### ./.git/configへ設定

```
$ cat ./.git/config

[user]
	name = サブアカウント
	email = サブアカウントメールアドレス
```


## <i class="fa fa-refresh" aria-hidden="true"></i> アカウント反映がされているかの確認

メインアカウントとサブアカウントでそれぞれ、`git commit`した後に、`git log`で反映されているか、確認する。

```
$ git log

commit XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Author: サブアカウント <サブアカウントメールアドレス>
Date:   Xxx Xxx 00 00:00:00 2016 +0000

    add:git アカウント設定
```

## 終わりに

サブアカウントの設定を忘れていたりすると、`~/.gitconfig`の設定が適用されるので、注意が必要です。
複数アカウントを扱ってる方は一度見のしてみるのも良いかなと思います。

## 参照
* [Set Up Git] (https://help.github.com/articles/set-up-git/)

* [同一端末で、複数のGitHubアカウントを使い分ける方法] (https://github.com/youkinjoh/TrainingWebSocket/wiki/%E5%90%8C%E4%B8%80%E7%AB%AF%E6%9C%AB%E3%81%A7%E3%80%81%E8%A4%87%E6%95%B0%E3%81%AEGitHub%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95)
複数のGolangバージョンに対応したパッケージを書く

Goには[Go 1 promise of compatibility](https://beta.golang.org/doc/go1compat)があり基本的にGo1.xでAPIのインターフェースが変更されることはない．そのため過去に書いたコードを新しいGoでビルドしてもぶっ壊れることは（おそらく）ない．ただリリースごとに新しいパッケージや関数/メソッドはどんどん追加されていくため古いGoで新しいコードをビルドすることはできないことがある（例えば，標準の[context](https://golang.org/pkg/context/)パッケージを使っているコードはGo1.7以降でしかビルドすることができない）．

GoはリリースごとにGC（e.g., [Sub-millisecond GC pauses](https://groups.google.com/forum/?fromgroups#!topic/golang-dev/Ab1sFeoZg_8)）やコンパイラ（e.g, [SSAの導入](http://shinpei.github.io/blog/2016/08/13/what-ssa-brings-to-go-17/)）や各標準パッケージの改善が行われる．そのため自分は「どんどんバージョン上げていけば良い．だからパッケージも同じく最新のバージョンで動くものを提供すれば良い」と思う．がこれは個人的な思想で誰かが使える形でインターネットに公開している限りは横暴でもある．少なくとも移行期（以下の図でいうとStage2）を持たせるのが真摯な姿勢だと思う．

![](https://talks.golang.org/2016/refactor/gradual.svg)

[https://talks.golang.org/2016/refactor.article](https://talks.golang.org/2016/refactor.article)

新しいバージョンのGoを使っているユーザには新たに追加された関数/メソッドを利用可能にしつつ，古いバージョンのGoを使っているユーザのビルドを壊さないようにするには[Build Constraints](https://golang.org/pkg/go/build/#hdr-Build_Constraints)を使えば良い．

例えば以下のようなmain関数を考える．

```golang
func main() {
    fmt.Println(Hello())
}
```

このときGo1.8以降でしか使えない関数/メソッドを使った`Hello`とそれ以前のバージョン用の`Hello`を提供するには以下のように2つのファイルを準備すれば良い．

```golang 
// +build go1.8

package main

func Hello() string {
    return "Hello (after go1.8)"
}
```

```golang
// +build !go1.8

package main

func Hello() string {
	return "Hello (old version)"
}
```

`go1.8`のビルドタグを持つファイルはGo1.8以降（betaも含む）のビルドに使われ`!go1.8`のタグを持つファイルはそれ以前の古いバージョンのビルドにのみ利用される．

## まとめ

特に最近は標準パッケージが`context`対応を始めているのでこれを利用する機会は増えるのではないか．やりすぎは良くない気もするのであくまで移行期のための手段とするのが良いと思う．ある程度経ったら古いバージョンは切り捨てればいい．

## 参考

Build Constraintsについては[みんなのGo言語](https://www.amazon.co.jp/dp/477418392X)の[mattn](https://twitter.com/mattn_jp)さんの章に詳しい解説がある．またmattnさんは[go-sqlite3](https://github.com/mattn/go-sqlite3)で同様の対応をしている（[sqlite3_go18.go](https://github.com/mattn/go-sqlite3/blob/2d44decb4941c9cdf72c22297b7890faf7da9bcb/sqlite3_go18.go)）．自分も最近[go-httpstat](https://github.com/tcnksm/go-httpstat)で同様にGo1.8の対応をした（[#10](https://github.com/tcnksm/go-httpstat/pull/10)）．

標準パッケージだとxの[context](https://github.com/golang/net/tree/master/context)パッケージが同様のことをしている．
GoogleFontsの選び方の話。

#GoogleFontsの選び方の話。

GoogleFontsをいろいろ使ってみて、
選び方についてちょっとコツがつかめてきたので自分用のメモかねてのまとめ。


## GoogleFontsって、そもそも何？
という方向けに説明すると、

###GoogleFontsとは
Webフォントの一つ。
サーバー上のフォントファイルから表示されるので、
ユーザーの環境にかからわず、製作者が意図したフォントを表示することができます。

GoogleFontsはすごい。

###すごいところ
・どの環境でも（基本的には）同じように見える。
・簡単に導入できる。
・色々試せる。

※商用利用などについては各ページのライセンスを確認してくださいねっ。

実際の使い方に関しては下記の記事で詳しく解説してくださっています。
http://qiita.com/umeume66/items/e37895571086a8a26158


##フォントの選び方
さて、肝心な
フォントの選び方です。

まず、公式ページに飛びましょう。
GoogleFonts公式
https://fonts.google.com/


###公式ページでフォントを選ぶ際に知っておくといいこと
ページの右にあるチェックリストを活用すると、
フォントを選ぶのが簡単になります。
![categori.png](https://qiita-image-store.s3.amazonaws.com/0/143987/d078e514-00d0-d3d1-237d-dc40e5f11747.png)



####Categories
フォントをカテゴリごとにフィルタしてくれる。
全てのチェックを外すとかわいい顔文字が出ます。
![fontotegae.png](https://qiita-image-store.s3.amazonaws.com/0/143987/f1585828-661b-5fea-c35f-348b29fb70a0.png)

なんだこれ。
カテゴリの特徴は以下の通り。
#####serif
文字のストロークにある小さな飾り。
これがある書体はローマン体と呼ばれる。
クラシックなイメージになる。
#####san-serif
セリフがない書体。
すっきりとしたデザインになる。
日本ではゴシック体と呼ばれる。
#####display
ロゴや見出しなど、大きく綺麗に見せたいところ向きの書体。
長い文章には適していないため、タイトルやメニューにだけ
使ったほうがよさそう。
#####Handwriting
手書き風の文字。
筆記体を探すならここから探すのがよさそう。
恰好よさ重視の時向けかも。
#####monospace
等幅フォントのこと。
簡単に言うと等間隔に並べられるフォントのこと。
昔のワープロの文字の感じのフォントがほしい時はこれがおすすめ。


####Sorting
→フォントを並べかえる。
各ソートの意味は以下の通り。
#####Trending
流行っている順。
#####Popular
人気のある順。
#####Date Added
追加日が新しい順。
#####Alpabetical
アルファベット順。


####Number of styles
いくつのスタイルがあるか。
つまり、太字や細字、斜めなどがいくつあるか。
最高は18スタイル。
ページ全体で統一感を出したい時などは重宝するかも。

####Thickness
細さ。太さともいう。
極端な太字や細字を使いたい時に便利。

####Slant
傾斜度。上がれば上がるほど筆記体が占める割合が上がる気がする。
よりスタイリッシュでエレガントな書体が使いたい時向け。

####Width
幅。コンパクトにおさめたいのか、ぐんと幅をとりたいのか。



ええい、ままよ！
ロゴで使いたいからばばっと試してみたい！
という人は、下記のプレビューツールを使うといいかもしれません。
プレビューツール
http://ultra.zone/web_fonts

##おわりに。
フォント好きがGoogleFontsのページを見ていると時間がすぐにたつのでお気をつけください……。
楽しすぎる……！！
ちなみに、公式ページを日本語翻訳してみると……？
個人的にはこれがお気に入り。
![mikaduki.png](https://qiita-image-store.s3.amazonaws.com/0/143987/1c74c7ea-6dde-4aaa-a639-2448a633834c.png)
Laravelでtranspose

## Transposeとは

Rubyなどでは標準で実装されている。

```php:before.php
[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
]
```
このような配列を

```php:after.php
[
  [1, 4, 7],
  [2, 5, 8],
  [3, 6, 9],
]
```
こうする処理。超便利

## こんな時に便利Transpose
以下のような追加可能なフォームを実装するときに泣くほど便利です！

![form.gif](https://qiita-image-store.s3.amazonaws.com/0/72204/a855e214-51f8-7f29-4328-542061ef0122.gif)

## 実装

**実装場所**はメソッドが使われる以前に読み込まれる場所であればどこでもいいですが、
`php artisan make:provider`コマンドを使って
`CollectionMacroServiceProvider.php`って感じのものを作って実装すると良いでしょう。
メンドくさければ`AppServiceProvider.php`に書いちゃうのもありです。

```php:CollectionMacroServiceProvider.php
// 同じ名前のメソッドが存在しないかチェック
if (! Collection::hasMacro('transpose')) {
    /*
     * Transpose an array.
     *
     * @return \Illuminate\Support\Collection
     */
    Collection::macro('transpose', function () {
        $items = array_map(function (...$items) {
            return $items;
        }, ...$this->values());

        return new static($items);
    });
}
```

## 呼び出し

```php

// 必要な要素だけ取得
$before = collect($input_data)->only('name', 'email', 'address');

// transpose実行
$after = $before->transpose()->map(function ($data) {
    return [
        'name' => $data['0'],
        'email' => $data['1'],
        'address' => $data['2'],
    ];
});

// transpose前
dd($before);
// [
//     ['田中', '鈴木', '佐藤'],
//     ['aaa@example.com', 'bbb@example.com', 'ccc@example.com'],
//     ['東京', '大阪','福岡'],
// ];

// transpose後
dd($after);
// [
//     ['田中', 'aaa@example.com', '東京'],
//     ['鈴木', 'bbb@example.com', '大阪'],
//     ['佐藤', 'ccc@example.com','福岡'],
// ];

```


## 参考

https://adamwathan.me/2016/04/06/cleaning-up-form-input-with-transpose/

composerで入れれば楽だし他にも便利なメソッドたくさん使えます！
https://github.com/spatie/laravel-collection-macros
[C++11] Explicitly delete functions

In the C++11, there is a new feature to explicitly delete functions. With this new feature, for example we can delete the copy constructor and copy-assignment operator that compiler automatically generates for us to prevent copy operation.

### Before C++11

```cpp
class Uncopyable {
public:
    Uncopyable() {};
private:
    Uncopyable(const Uncopyable& oth);
    Uncopyable& operator=(const Uncopyable& oth);
};
```

Before C++11, this code is a solution to prevent copy operation. But it still be copyable for a friend class of `Uncopyable`.

### In C++11

```cpp
class Uncopyable {
public:
    Uncopyable() {};

    Uncopyable(const Uncopyable& oth) =delete;
    Uncopyable& operator=(const Uncopyable& oth) =delete;
};
```

In C++11, there is a more straightforward way to implement this. The `=delete` marks the function to be deleted. When you do something like this

```cpp
Uncopyable a, b;
b = a;
```

It will give you a error message at compile time.
Opensslを利用した暗号化データ送受信

## Opensslを利用した暗号化データ送受信

### 利用するファイル

* data.txt - data file to be exchanged
* key.bin - random key
* private.pem - private key
* private.pem.nopass - private key without pass phrase
* public.pem - public key

### キーペアを作成

    openssl genrsa -des3 -out private.pem 2048
    openssl rsa -in private.pem -outform PEM -pubout -out public.pem
    openssl rsa -in private.pem -out private.pem.nopass


### 送信側

1) ランダム鍵を作成

    openssl rand -base64 128 -out key.bin

2) ランダム鍵を利用し送信ファイルを暗号化する

    openssl enc -aes-256-cbc -salt -in data.txt -out data.txt.enc -pass file:./key.bin


3) 公開鍵でランダム鍵を暗号化

    openssl rsautl -encrypt -inkey public.pem -pubin -in key.bin -out key.bin.enc

4) 暗号化したファイルとランダム鍵を受信者へ送付

* data.txt.enc
* key.bin.enc


---------

### 受信側

1) 秘密鍵でランダム鍵を復号

パスフレーズあり：

    openssl rsautl -decrypt -inkey private.pem -in key.bin.enc -out key.bin.dec

パスフレーズなし：

    openssl rsautl -decrypt -inkey private.pem.nopass -in key.bin.enc -out key.bin.dec

2) ランダム鍵で暗号化したファイルを復号

    openssl enc -d -aes-256-cbc -in data.txt.enc -out data.txt.dec -pass file:./key.bin.dec
羊の数を100まで数えるけど3の倍数のときだけ山羊になって5の倍数のときに吉田羊になって3の倍数かつ5の倍数のときは吉田山羊になるシェルスクリプト

## きっかけ

今月の特集「シェル30本ノック」が初心者向けにもすごくよかったです。
なぜか、羊の数を数えるというの問題に惹かれたので例題を追加してみました。

もとの問題は 羊の数を100匹数える という問題でした。

[Software Design 2017年1月号｜技術評論社](http://gihyo.jp/magazine/SD/archive/2017/201701)

## 羊の数を100まで数えるけど3の倍数のときだけ山羊になる

if文を使って条件分岐させます。
はじめはfor文にネストされているだけでも戸惑うかもしれませんが、分解して読み解けば大丈夫。

羊もメェ〜？
いいえ、羊はベェ〜〜って感じなのです。

### 回答例

```bash:sheep_fizz.sh
#!/bin/bash

for i in `seq 1 100`; do
    if [ $(($i % 3)) == 0 ]; then
        echo "メェ〜"
    else
        echo "羊の数が $i 匹"
    fi
done
```

## 羊の数を100まで数えるけど3の倍数のときだけ山羊になって5の倍数のときに吉田羊になって3の倍数かつ5の倍数のときは吉田山羊になる

fizzbuzzですね。

bashのand条件を表す `-a` はすごくわかりにくいので嫌いです。
放牧日記は吉田羊さんのブログ。

### 回答例

```bash:sheep_fizzbuzz.sh
#!/bin/bash

for i in `seq 1 100`; do
    if [ $(($i % 3)) == 0 -a $(($i % 5)) == 0 ]; then
        echo "放牧日記（ http://ameblo.jp/hitsuji1118/ ）だメェ〜"
    elif [ $(($i % 3)) == 0 ]; then
        echo "メェ〜"
    elif [ $(($i % 5)) == 0 ]; then
        echo "放牧日記（ http://ameblo.jp/hitsuji1118/ ）！"
    else
        echo "羊の数が $i 匹"
    fi
done
```

```shell-session:output
羊の数が 1 匹
羊の数が 2 匹
メェ〜
羊の数が 4 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
メェ〜
羊の数が 7 匹
羊の数が 8 匹
メェ〜
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
羊の数が 11 匹
メェ〜
羊の数が 13 匹
羊の数が 14 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）だメェ〜
羊の数が 16 匹
羊の数が 17 匹
メェ〜
羊の数が 19 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
メェ〜
羊の数が 22 匹
羊の数が 23 匹
メェ〜
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
羊の数が 26 匹
メェ〜
羊の数が 28 匹
羊の数が 29 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）だメェ〜
羊の数が 31 匹
羊の数が 32 匹
メェ〜
羊の数が 34 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
メェ〜
羊の数が 37 匹
羊の数が 38 匹
メェ〜
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
羊の数が 41 匹
メェ〜
羊の数が 43 匹
羊の数が 44 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）だメェ〜
羊の数が 46 匹
羊の数が 47 匹
メェ〜
羊の数が 49 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
メェ〜
羊の数が 52 匹
羊の数が 53 匹
メェ〜
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
羊の数が 56 匹
メェ〜
羊の数が 58 匹
羊の数が 59 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）だメェ〜
羊の数が 61 匹
羊の数が 62 匹
メェ〜
羊の数が 64 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
メェ〜
羊の数が 67 匹
羊の数が 68 匹
メェ〜
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
羊の数が 71 匹
メェ〜
羊の数が 73 匹
羊の数が 74 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）だメェ〜
羊の数が 76 匹
羊の数が 77 匹
メェ〜
羊の数が 79 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
メェ〜
羊の数が 82 匹
羊の数が 83 匹
メェ〜
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
羊の数が 86 匹
メェ〜
羊の数が 88 匹
羊の数が 89 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）だメェ〜
羊の数が 91 匹
羊の数が 92 匹
メェ〜
羊の数が 94 匹
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
メェ〜
羊の数が 97 匹
羊の数が 98 匹
メェ〜
放牧日記（ http://ameblo.jp/hitsuji1118/ ）！
```
Swift で PostgreSQL を使う。（OSX）

# 概要

Swift で PostgreSQL を使うための最も基本的なサンプル。
OSX 向けの記事です。iOS 向けではありません。

# 前準備

## libpq のインストール
PostgreSQL を扱う Swift で書かれたライブラリは執筆時点で存在しないと思われます。
なので、本家の C ベースの libpq をインストールしてこれ経由でアクセスします。
Homebrew でインストールすることをベースに話を進めますが、Homebrew のインストールとかアップデートについては他にたくさんページがあるので割愛します。

インストール方法；
libpq は普通に PostgreSQL についてきます。なので、PostgreSQL をインストールします。

```
brew install PostgreSQL
```

## Xcode の設定

### Build Settings

OSX アプリケーションを Swift で作ったら、Build Settings で以下の指定を行います。

- Header Search Path
 - /usr/local/include/

 
### TARGETS / General
Linked Frameworks and Libraries に libpq.tbd を加えます。


### ブリッジングヘッダー
ブリッジングヘッダーを作成し、以下の内容を記述します。

```
    #include <libpq-fe.h>
```
（ブリッジングヘッダーは新規に Cocoa Class のファイルを Objective-C で作成すれば、XCodeが自動的に作成して、Build Setting にセットしてくれる。）


# 簡単なクエリの結果を表示する例

```swift

import Foundation

let wC = PQconnectdb( "host=TheHost port=ThePort user=TheUser password=ThePassword" );
guard PQstatus( wC ) == CONNECTION_OK else { NSLog( "%@", String( cString: PQerrorMessage( wC ) ) ); return }
defer { PQfinish( wC ) }

let wR = PQexec( wC, "select * from TheTable" )
guard PQresultStatus( wR ) == PGRES_TUPLES_OK else { NSLog( "%@", String( cString: PQerrorMessage( wC ) ) ); return }
let	wNumTuples = PQntuples( wR )
let	wNumFields = PQnfields( wR )
for i in 0 ..< wNumTuples {
	for  j in 0 ..< wNumFields {
		print( String( cString: PQgetvalue( wR, i, j ) ) )
	}
}
PQclear( wR )

```
Docker コンテナの時刻同期(時刻データ)について

# 前文
dockerのコンテナに対する時刻同期はどうするのか?
NTPを動かして同期してもいいが、1コンテナには1サービスというdockerのポリシーに反するし、どうなのかなぁ、、、と思っていた。
よくよく考えると、あれ? そもそもdockerってハードウェアの仮想化しないんだよなぁ、あれ? どうやってクロック信号を採っているんだ? って部分に行き着いた。
公式のドキュメントやソースコードを詳しく読めば、確実に判明はするのだけど、英語のドキュメントページの要点を斜め読みするだけだし、ソースコードを読むのはスキル的に至難の業だし、、、
そこで、自分だったらどう設計するかを考えてみる、自分だったらホストとclockデータを共有させる!
それなら確認してみましょう

# 検証作業
## 環境

- Dockerホスト : CentOS
- 検証用コンテナ : 公式のtomcatコンテナ(ベースOSはdebian)

#### ホストでの作業

```shell-session
# 最新のコンテナイメージの取得
docker pull tomcat

# コンテナの作成
docker run --name test-tomcat -p 8080:8080 -d tomcat

# コンテナの状態確認
docker ps
#=> CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
#=> 5ba5742562ee        tomcat              "catalina.sh run"   6 seconds ago       Up 5 seconds        0.0.0.0:8080->8080/tcp   test-tomcat
```
#### コンテナ側の作業

ホストのtimezoneはJST設定にしてあり、コンテナのデフォルトのUTCでは検証として面倒なのでJSTに合わせる

```shell-session
# ログイン
docker exec -ti test-tomcat /bin/bash

# コンテナにログイン後
root@5ba5742562ee:/usr/local/tomcat# ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# 現時刻確認
root@5ba5742562ee:/usr/local/tomcat# date
#=> Tue Dec 20 10:50:02 JST 2016
```

#### ホストで時刻を変更

```shell-session
# 変更
date --set "2016/12/20 09:00:00"

# 確認
date
#=> 2016年 12月 20日 火曜日 09:00:04 JST
```

#### コンテナ側で確認

```shell-session

# 確認
root@5ba5742562ee:/usr/local/tomcat# date
#=> Tue Dec 20 09:00:04 JST 2016
```

#### ホストで再度変更
```shell-session
# 変更
date --set "2016/12/20 11:00:00"

# 確認
date
#=> 2016年 12月 20日 火曜日 11:00:02 JST
```

#### コンテナ側で再度確認

```shell-session

# 確認
root@5ba5742562ee:/usr/local/tomcat# date
#=> Tue Dec 20 11:00:02 JST 2016
```

# 検証結果

dockerのコンテナはハードウェアを仮想化しないので、clockデータはホストを共有している、
そのため、ホスト側の時刻変更を即コンテナにも影響する。
つまり、ホスト側でNTPDなどで時刻同期をしていれば、コンテナ内の時刻管理は必要がない
Webエンジニアと資格取得の話

このエントリは [Classi Advent Calendar 2016](http://qiita.com/advent-calendar/2016/classi) の20日目です。

Classiでサーバサイドアプリケーションを担当している @kyottyy です。

今回は、自身の経験から「Webエンジニア×資格取得」について書いていきます。

## 資格
自身の紹介になりますが、以下の資格を取得しています。
IPAの情報処理技術者試験のみをターゲットにしていました。

| 資格 | 取得時期 |
| :--- | :--- |
| 基本情報技術者 | 平成24年秋（大学院1年生） |
| 応用情報技術者 | 平成26年秋（社会人1年目） |
| セキュリティスペシャリスト(SC) | 平成27年秋（社会人2年目） |
| ネットワークスペシャリスト(NW) | 平成28年秋（社会人3年目） |

## 資格取得のメリット
Webエンジニアの方ならご存知の通り、資格欄が増えることは
ほとんどメリットになりません。

Webエンジニアが資格取得をするメリットは、
取得のための勉強で **基礎知識が身につくこと** だと考えています。

私がIPAの資格にターゲットを絞った理由もそれで、

- ベンダーに依存しない知識を習得できる
- 試験範囲が明示されており、学習領域が明確

という点から、効率的な学習ができると考えたからです。

## 資格取得のデメリット
これは純粋に「資格取得の勉強に時間をとられる」という点です。

勤務時間を除いた余暇のリソースは有限なので、
同じ時間をコード書いたり技術書を読むことに投資したほうが効果的な場合もあります。

## 個人的な感想
資格取得を通じて基礎知識を身につけたことで
様々なメリットを享受できたと感じています。

特に感じることは、

- ドキュメントを読むのがスムーズになった
- トラブルシューティングに強くなった

という点です。

しかし、時間の使い方に正解はないため、
自分が納得出来るものに投資するのが一番だと思います。

# 最後に
[Classiではエンジニアを募集しています。](https://www.wantedly.com/companies/classi/projects)
日本の教育に興味のある方は是非お越しください！
BitbucketのPipelinesで特定ディレクトリをAWS S3へデプロイする

## やりたいこと
今までBitbucketからAWS S3へのデプロイをwerckerで行っていたが、Bitbucket PipelinesがリリースされたのでBitbucket内で完結させたい。

## 結論
先にBitbucket PipelinesのEnvironment variablesに**AWS_SECRET_ACCESS_KEY**と**AWS_ACCESS_KEY_ID**を登録しておく。
その上でbitbucket-pipelines.ymlを作成。

```yaml:bitbucket-pipelines.yml
image: python:3.5.1

pipelines:
  branches:
    develop:
      - step:
          script:
            - echo "deply to test bucket."
            - pip install awscli
            - aws s3 sync dist/ s3://バケット名 --exact-timestamps --delete
    master:
      - step:
          script:
            - echo "deply to production bucket."
            - pip install awscli
            - aws s3 sync dist/ s3://バケット名 --exact-timestamps --delete

```

上記サンプルではBitbucketのdistフォルダをデプロイ対象としている。
devlopブランチとmasterブランチで別のバケットへデプロイする想定。

## 経緯
公式のPipelinesのドキュメントを読んでみるとS3へのデプロイのサンプルがpythonで書かれている。
<https://bitbucket.org/awslabs/amazon-s3-bitbucket-pipelines-python/>
ほぼpython使ったことがないのでboto3って便利やなぁと思いながら見てみるも、ディレクトリを指定するのは面倒くさそう？と思っていたら以下の記事があったので参考にさせて頂いてawscliを使った。
[boto を使って Amason S3 に指定のフォルダをアップロードするスクリプト](http://qiita.com/naoiwata/items/acc162520f0ff04fc909)

## ミスったこと
bitbucket-pipelines.ymlのdefaultで`- pip install awscli`して、branchesで`- aws s3 sync`しようとしたが、default→branchesと順序性が保証されているわけではないみたい。
mariadbでsleepのプロセスが多くToo many open filesの対応

かたわらで起こってた事件の調査をざっくりした備忘録です。
ここに書いてるほかにはコネクションプーリングをクライアント側アプリで実装するとかかと思われ。

### sleepが多い件

wait_timeoutを短く、という記事が散見された。（set globalでオンライン更新可能）
[MySQLでToo many connectionsが起きた場合の対処方法 - わかりやすい](http://wakariyasui.hatenablog.jp/entry/2015/04/28/005109)
[システム開発の備忘録 | MｙSQL - sleepプロセスが溜まる](http://kgworks.blog47.fc2.com/blog-entry-42.html)

すでに結構短いな↓と思ったらもともと60だったのを相談して40にしてた模様。
　→show full proccesslist;見た感じはsleepは600越えだったものの
　　replication以外のユーザが40秒以上sleepしてるプロセスはなかった
　　show global status;でMax_userd_connectionsは増えてなさそうで
　　thread_cache_sizeとmax_connectionsは足りてそうだった
　　→ほかのタイムアウト値を調整しなくても大丈夫そう

```
MariaDB [(none)]> show global variables like '%timeout%';
+----------------------------+----------+
| Variable_name              | Value    |
+----------------------------+----------+
| connect_timeout            | 10       |
| deadlock_timeout_long      | 50000000 |
| deadlock_timeout_short     | 10000    |
| delayed_insert_timeout     | 300      |
| innodb_lock_wait_timeout   | 50       |
| innodb_rollback_on_timeout | OFF      |
| interactive_timeout        | 28800    |
| lock_wait_timeout          | 31536000 |
| net_read_timeout           | 30       |
| net_write_timeout          | 60       |
| slave_net_timeout          | 30       |
| thread_pool_idle_timeout   | 60       |
| wait_timeout               | 40       |
+----------------------------+----------+
13 rows in set (0.01 sec)
```

ちなみに本家の5.7だと`max_execution_time`というパラメータがありサーバサイドでクエリのタイムアウトを設定可能な模様。

[詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド（奥野幹也） ｜ 翔泳社の本](http://www.shoeisha.co.jp/book/detail/9784798147406)

しかしmariadbでは10.1でも設定できない模様↓。

[System Variable Differences Between MariaDB 10.1 and MySQL 5.7 - MariaDB Knowledge Base](https://mariadb.com/kb/en/mariadb/system-variable-differences-between-mariadb-101-and-mysql-57/)

### Too many open files対策

エラーログに出てた件。
いまは出てないけど念のためlimitを無限にしたらいいのではと。

[MariaDB on CentOS 7 - "Error in accept: Too many open files"](http://blogs.reliablepenguin.com/2015/08/28/mariadb-on-centos-7-error-in-accept-too-many-open-files)

CentOS7なので
/usr/lib/systemd/system/mariadb.service
の[service]セクションに以下を追加してsystemctlデーモンをリロードしてmariadbプロセスをリスタートする
LimitNOFILE=infinity

### mysqltuner

    `query_cache_limit (> 1M, or use smaller result sets)`

　　　→DBのキャッシュはほとんど使ってなさそうでlimit減らしてはどうか

    `innodb_buffer_pool_instances(=22)`

　　　→innodb_buffer_pool_sizeを1GBで割った商にすると効率よいとマニュアルにある
　　　　[MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.13.1.4 複数のバッファープールインスタンスの使用](https://dev.mysql.com/doc/refman/5.6/ja/innodb-multiple-buffer-pools.html)
　　　　この値は5.6では動的変更はいいえで変えるならmy.cnfに追記してmariadbの再起動が必要。
　　　　[MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数](https://dev.mysql.com/doc/refman/5.6/ja/innodb-parameters.html)

### show global status;でざっくり確認

Created_tmp_disk_tables
と
Sort_merge_passes
とかの致命的なやつは0だったのでまあ大丈夫かなと思った

http://dbstudy.info/files/20130318/tuningathon5_mysql56.pdf
http://qiita.com/tyoro/items/5436a5172b547e5e52f5

コネクションプールは商用版になんかあった気がするなと思って検索した。↓これですかね。
[MySQL :: MySQL Enterprise Scalability](https://www-jp.mysql.com/products/enterprise/scalability.html)

以上。
必殺スーパーリロード。 変更したのに更新されない！のでスーパーリロード

cssや画像ファイルを編集後ローカルで確認するとOK！
ステージングにあげたらぜんぜんだめじゃん！

要素を検証、、、古いファイルが表示されてるやん！

キャッシュ強すぎる、、、（：：）


キャッシュを毎回削除するのも面倒。

そんなときは、スーパーリロード！

#Google Chromeのスーパーリロード

##Ctrl ＋ F5　もしくは　Shift ＋ F5


これで綺麗に更新！
しつこいときつかいましょう
HTML5 canvasにバーコードを描画してみる

キャンバスを使ってバーコードの付いた帳票を印刷したい。
バーコードライブラリはいろいろ落ちているけど、うちはCODE39以外は使用しないので毎回大きなライブラリを読むのもったいない。
バーコードの仕組み自体はフォント化できるほど単純なので、勉強も兼ねて自分でバーコード関数を書いてみました。

バーコードの規格は[小林クリエイト株式会社](http://k-cr.jp/)さまの「[CODE39 基礎知識](http://k-cr.jp/content/wp-content/uploads/2013/11/457ad5ca5ce6434bb03ce1ffca89354c.pdf)」を参考にしました。

```javascript:テストコード
<html>
<head>

<style>

#canvas {
	/*キャンバスのサイズ*/
	width: 800px;
	height: 400px;
	/*描画のレンダリング方法*/
	image-rendering: pixelated;
}
</style>

<script>

//キャラクタパターン情報
var pattern = {
	'0':0xB65,'1':0xD4B,'2':0xD4D,'3':0xA9B,'4':0xD65,'5':0xACB,'6':0xACD,'7':0xDA5,'8':0xB4B,
	'9':0xB4D,'A':0xD2B,'B':0xD2D,'C':0xA5B,'D':0xD35,'E':0xA6B,'F':0xA6D,'G':0xD95,'H':0xB2B,
	'I':0xB2D,'J':0xB35,'K':0xCAB,'L':0xCAD,'M':0x95B,'N':0xCB5,'O':0x96B,'P':0x96D,'Q':0xCD5,
	'R':0x9AB,'S':0x9AD,'T':0x9B5,'U':0xD53,'V':0xD59,'W':0xAB3,'X':0xD69,'Y':0xAD3,'Z':0xAD9,
	'-':0xDA9,'.':0xB53,' ':0xB59,'$':0xA49,'/':0x949,'+':0x929,'%':0x925,'*':0xB69};

//jQueryで言う $(document).ready() のネイティブコード
document.addEventListener('DOMContentLoaded', function() {

	//バーコード化するデータ(先頭と末尾はスタート・ストップキャラ)
	var code_str = "*12345678*";
	//バーの幅
	var bar_width = 4;

	//キャンバスのコンテキストを取得
	var canvas = document.getElementById("canvas");
	var context = canvas.getContext("2d");

	context.lineWidth = bar_width;
	context.lineCap = "butt";
	context.strokeStyle = "black";
	context.font = "20px sanserif";
	context.setTransform(1, 0, 0, 1, 4, 0); //描画開始位置を右に4ピクセル移動するおまじない
	context.beginPath();

	for(var pos = 0; pos < code_str.length; pos++){
		//一文字ずつ読み込み
		var key = code_str.charAt(pos);
		//パターン情報を読み込む
		if(!pattern[key]) continue;
		var pat = pattern[key];

		//キャラクタごとの描画位置
		//文字位置 * (12ビット + キャラクタ間ギャップ) x バー幅
		var left = pos * (12 + 1) * bar_width;

		//2進数12ビットのパターン情報を1ビットずつ走査してバーを描画
		for(var i=0; i<12; i++){
			//ビットが1ならバー描画
			if( (pat & (1<<i)) > 0 ){
				//バーの X座標
				var x = i * bar_width + left;
					
				//バー描画
				context.moveTo(x, 0);
				context.lineTo(x, 100);
			}
		}
		//データの文字列を直接描画
		context.fillText(key, left + bar_width * 6, 120);
	}

	//描画情報を反映
	context.stroke();

});

</script>

</head>
<body>

<!--キャンバス-->
<canvas id="canvas" width="800" height="400"></canvas>

</body>
</html>
```

[動作サンプル](https://embed.plnkr.co/AbfYJV/)

描画結果
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/3778f1a3-c320-9d91-b2f9-db73054d1e51.png)

##キャラクタパターンについて
キャラクタパターンは、参考サイトを見ながら2進数化し、ビット演算がシンプルになるよう、逆順に並び替えた後に16進数化しています。
![image](https://qiita-image-store.s3.amazonaws.com/0/102207/0044e128-3446-3bb0-4e0e-c7fae8e1962b.png)

```javascript:
var pattern = ["101101100101", "110100101011", "101100101011", "110110010101"...];
var keys = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*";
var new_pattern = {};

for(let pat of pattern){
	pat = pat.split("") //配列化
		.reverse() //逆順化
		.join(); //再度文字列化
	pat = "0x" + parseInt(pat, 2).toString(16); //16進数化
	new_pattern[keys.charAt(new_pattern.length)] = pat; //キーと組み合わせてハッシュ化
}
```

for...of に違和感！ of じゃなくin にして欲しかった

逆順化がめんどくさいなら単純に2進数文字列にして、charAt()で一文字ずつ読み込むんでもいいと思います。(ただしデータ量は4倍になります)
Herokuでdeploy後にnode.jsでbuild処理を実行する

Herokuでdeploy時にbuildする環境を構築してみたのでそのメモ。

## ターミナルからherokuコマンドからインストール

`buildpacks:heroku/nodejs`をインストールすることでdeploy時に`npm install`が実行されるようになる。
 
```
heroku login
heroku buildpacks:clear --app APPNANE
heroku buildpacks:heroku/nodejs
```

※コマンドからではなくdashboardのアプリのsetting内にあるBuildpacksからbuildpackを追加するのも可能。
`https://dashboard.heroku.com/apps/APPNAME/settings`

デフォルトの設定だとnpm install実行時はdependenciesのmoduleしかインストールされないがdevDependenciesのmoduleもインストールしたい場合は
```
heroku config:set NPM_CONFIG_PRODUCTION=false --app
```
を実行して設定を変更しておく

## package.jsonのscript記述
npm install後の処理（主にbuild系の処理になるかと思います）をpackage.jsonに書く。

`heroku-prebuild`で`npm install`後に実行されるコマンドを指定する。
`heroku-postbuild`で`heroku-prebuild`後に実行されるコマンドを指定する。

```
}
"scripts": {
  "heroku-prebuild": "echo This runs before Heroku installs your dependencies.",
  "heroku-postbuild": "echo This runs afterwards."
}
```

ref. https://devcenter.heroku.com/articles/nodejs-support#customizing-the-build-process
筋トレによるテストステロン値向上でWebサービス作る気になった話

この記事は「<a href="http://qiita.com/advent-calendar/2016/muscle">筋肉 Advent Calendar 2016</a>」20日目の記事です。

![bulk.png](https://qiita-image-store.s3.amazonaws.com/0/21909/51a2e2f6-3c73-9fd7-1e90-3408ea348f40.png)

こんにちは、京都でWeb屋をしている<a href="https://twitter.com/sho_yamane?lang=ja">山根</a>ともうします。4日目の「<a href="https://www.sho-yamane.me/entry/2016/12/03/192434">金が筋を作る♪Web屋が筋肉につぎ込んだお金の話
</a>」を担当させて頂きまして、2回目の投稿となります。

今回は、筋肉量向上によって得られる男性ホルモン、すなわちテストステロンが我々Webエンジニアにどのような影響を及ぼし、輝かしい未来に導いてくれるかを紐解いていきたい所存です。

## テストステロンが多いときと少ないときの違い

筋力向上で得られる男性ホルモンテストステロンですが、一般的に以下のような効果が期待できると言われています。

1. 【肉体的効能】：筋力の維持
1. 【肉体的効能】：性欲や性機能の維持
1. 【肉体的効能】：動脈硬化の予防
1. 【肉体的効能】：メタボの予防
1. 【肉体的効能】：認知機能の向上
1. 【精神的効能】：やる気の向上
1. 【精神的効能】：判断力の向上
1. 【精神的効能】：決断力の向上

主に我々エンジニアにとって有意義な効果は5の「認知機能の向上」、6の「やる気の向上」ではないでしょうか。私の場合の例ですが、トレーニングを定期的に始める以前と以後では以下のような違いが見られるようになりました。

### トレーニングを定期的にはじめる前

- やる気の面：ダルい、面倒くさい、辛い、ゴロゴロしていたい
- 認知機能の面：わからない、難しい、俺には無理だorz

### トレーニングを定期的にはじめた後

- やる気の面：おっしゃやるぞ！さっさとおわらせるぞ！今日もよく働いたぞ~！！！！
- 認知機能の面：わからないけどとりあえずやってみるか！やってみたらわかってきたぞ！他の人にできて自分にできないわけがない！頭が冴える！脳が疲れにくい…！

以上のようなメンタルや認知的な面で様々なメリットをもたらしてくれました。

## 1人でWebサービスを作る気になる

上記のようにやる気に満ち溢れていた日々を送っているととあるアイデアを思いつき、いつもなら自分にはどうせ無理だとなるんですが、そのような状態にはならず、自分で作ってみるか！となりRuby on Railsの勉強をはじめました。（普段はデザイナーよりのWeb屋でWordPressでHPを作るのがメインです）

そこで開発したのが以下のWebサイトのネーミングライツの売買サービスです。

<a href="https://www.named.vc/">Named[ネームド] - ネーミングライツ(命名権)売買サイト</a>

残念ながら、ビジネスモデル的にきついととあるコンサルタントの方に言われてしまい、まあ自分で納得行くところもあったので潔く断念しました。（開発はほぼ終わっていました。）

そこでいつもならめげてしまうのですが、上記の通り根拠のない自信ややる気に満ちあふれているので、すぐさまプランBとして頭のなかにあったプロテインなどのトレーニーに必要なサプリメントの価格を比較するサイトを作成開始しました。

<img width="1277" alt="スクリーンショット 2016-12-20 11.02.24.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/21909/19987d35-2f50-2231-be86-670c37b5473e.jpeg">

<a href="https://fitout.jp/">FITOUT - プロテインサプリメントの価格比較サイト</a>

まだまだ中途半端でβ版なのですが、上記のサイトを作成することができました。

プロテインは海外のものだと、為替の変動で販売価格が流動的なので場合によっては国産のプロテインの方がオトクであったりします。またプロテインによってタンパク質の含有量が違うためにそのプロテインの値段が本当に安いのか高いのかわかりにくかったりします。そこでタンパク質1gあたりの値段も算出できるような機能も持たせております。また、プロテイン製品1gあたりのタンパク質量も比較できるようにしました。

<a href="https://fitout.jp/protein1g/">プロテイン製品1gあたりのタンパク質量比較 - FITOUT</a>

スマホ対応もまだ出来ておらず、商品情報も少ないですが、これから順次対応していくつもりですし、CGMサイトを想定して制作しているので今後ログインしてプロテインなどのレビューもして頂けるようになる予定です。

## 現状に納得のいかないエンジニアはとりあえず筋トレしてみては？

エンジニアの方で現状の生活から打破したい！という方は、是非筋トレからはじめてみてはいかがでしょうか。座り仕事ということもあり、筋肉量が少ない方は伸びしろがかなりあると思います。テストステロン値も大幅に変わるのできっと意識の変化に驚きが隠せないでしょう。

とりあえず何か具体的な目的がないというかたは来る日に迎えて筋トレをし、テストステロン値を向上させておけば作りたいモノや実現したい夢が出来たときに筋肉がブースターとしてあなたの飛躍を手助けをしてくれます。

<b>共に日本の国民総筋量を向上させ、グローバル社会で負けない日本を作っていきましょう！</b>
組み合わせの列挙

組み合わせを列挙しようとして手が止まりました。基本的なアルゴリズムのはずなのに、いざ実装しようとすると思いのほか難しいです。検索してみると同じように感じた方が多いようで、色々な実装が出て来ました。屋上屋を架すことにはなりますが、試みた実装を説明します。

【追記 2020.01.05】実装を大幅に変更しました。

# 方針

手作業で組み合わせを列挙する場合、次のように考えます。

【例】 {1,2,3,4} から2個を取り出した組み合わせ

![組み合わせ.png](https://qiita-image-store.s3.amazonaws.com/0/32057/689dc744-acd4-6b36-7e91-82ad7e6ad43d.png)

これをなるべく素直に実装してみようと考えました。

## 特徴

挙動を観察すると、次のような特徴が分かります。

* 左の数字＜右の数字（組み合わせでは順番を区別しないため、便宜的な取り決め）
* {1,2,3}のそれぞれに、それより大きい数字を組み合わせます。{4}はそれより大きい数字がないため左には来ません。

## 実装

1つ小さい数字までの組み合わせ `combination (n - 1) (k - 1)` の末尾に、それより大きい数字を追加します。

```fsharp
let rec combination n = function
| k when k < 1 -> []
| 1 -> [ for i in 1..n -> [i] ]
| k -> [ for c in combination (n - 1) (k - 1) do
         for i in (List.max c) + 1 .. n -> List.append c [i] ]

printfn "%A" (combination 4 2)
```
```text:実行結果
[[1; 2]; [1; 3]; [1; 4]; [2; 3]; [2; 4]; [3; 4]]
```

# メモ化

`n` や `k` が大きくなると構築に時間が掛かるようになります。プログラム中で何度も使う場合、結果をキャッシュしておくと効果的です。これをメモ化と呼びます。

```fsharp:F#
let memoize (f: 'k -> 'v) =
    let cache = System.Collections.Generic.Dictionary<'k, 'v>()
    fun a ->
        let b, v = cache.TryGetValue a
        if b then v else
        let ret = f a
        cache.[a] <- ret
        ret

let   curry f = fun a  b  -> f(a, b)
let uncurry f = fun(a, b) -> f a  b

let combination =
    let rec f n = function
    | k when k < 1 -> []
    | 1 -> [ for i in 1..n -> [i] ]
    | k -> [ for c in g (n - 1) (k - 1) do
             for i in (List.max c) + 1 .. n -> List.append c [i] ]
    and g = f |> uncurry |> memoize |> curry
    g
```

再帰の結果もキャッシュするため相互再帰しています。
会社でサンワサプライの『ワイヤレスマイク付き拡声器スピーカー』を買った

Stylez Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/stylez

株式会社スタイルズの Adventカレンダー 7日目です。

# 1. 購入した物

以下の拡声器を購入しました。

MM-SPAMP4【ワイヤレスマイク付き拡声器スピーカー】会議や講義、イベントなどで手軽に使えるワイヤレスマイク付き拡声器スピーカー。 - サンワサプライ株式会社
http://www.sanwa.co.jp/product/syohin.asp?code=MM-SPAMP4

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/24445206-e948-48a3-2b63-f4603c8f05db.png)


# 2. 購入した経緯

弊社の会議室は、3つにパーティションで分かれていますが、パーティションを移動して1つの会議室にすることができます。さほど広くはありませんが、横長の会議室になってしまうので、セミナーを実施するには講演者が声をある程度張り上げる必要がありました。

10分程度の話であればそれでも構えないのですが、1時間以上それを続けるのはのどに負担もかかります。
そこで、マイクとスピーカーを設置して今後のセミナー利用の利便性を上げようと考えました。

# 3. 元々設置しようとしていた音響設備

当初は、天井に埋め込み型のスピーカーを検討していました。
しかし、工事費など含めて100万円程度かかるということで、使用頻度もそこまで高くないので断念しました。

# 4. 失敗したマイク

WiiU のワイヤレスマイクを購入して、WindowsPCに接続、
Windows PCからは、HDMIで会議室のモニターに音声出力
という構成を試してみました。

Wii Uワイヤレスマイク
https://www.nintendo.co.jp/wiiu/hardware/accessories/index.html#controller10

WiiU ワイヤレスマイク ---> Windows PC ---> HDMI ---> 大型TVモニター

残念ながら、この構成ではつかえませんでした。
問題はいくつかありました。

 1. 音量のコントロールが難しい。
 2. 大型TVモニターからの音声遅延が0.1秒ほどあった。

特に2の問題が大きく、セミナーをやっていてこんな声が聞かれました。
「話者の声とスピーカー(ここでは大型TV)で拡声されている声がダブって聞こえるので
非常に聞きづらい」

みなさん、2012年にイグノーベル賞をとったスピーチジャマーというのをご存じでしょうか？

イグ・ノーベル賞に日本人　おしゃべり妨害装置　　：日本経済新聞
http://www.nikkei.com/article/DGXNASDG21008_R20C12A9000000/

これは話者に対して微妙に遅れてしゃべった声を聞かせるというものですが、
WiiUのワイヤレスマイクでも同じことが発生していました。

# 5. サンワサプライの拡声器スピーカーの良い点

* 価格  
   弊社でも気軽に購入できる価格で失敗しても何とかなるぐらいの価格  
* セッティング  
   電源を繋いでスイッチオンで使える手軽さ。誰でも1回見れば分かります。
* オーバースペックじゃない  
   さほど広くない弊社の会議室でつかうには十分の音量でした。
* 三脚マウントがついている  
   微妙に便利です。  

# 6. サンワサプライの拡声器スピーカーの悪い点

* 電波はアナログなので簡単に傍受できます。  
   あまり聞かれたくない話の会議には使わない方がいいですね。
* ワイヤレスマイクは1本だけ  
   必要な場合はミキサーを追加してマイク入力からインプットするしかないです。
* 電源がACアダプター  
   なくならないように気をつける。

# 7. まとめ

コンパクトさから言っても、外見的なデザインとしても満足しています。
ノイズなどもほとんど無いので普通の屋内での利用では問題ないでしょう。
マイク入力もあるので、マイクをデジタル化したい場合は、デジタルワイヤレスマイクを購入し、
フォンジャックのケーブルで接続すると良いでしょう。
phpbrew+nginxを使いPHP7.1の環境構築

## 環境
macOS Sierra 10.12

## phpbrewをインストール
[公式ドキュメント](https://github.com/phpbrew/phpbrew/blob/master/README.ja.md)をもとにインストールおこなってください。
[MacでのPHP開発はphpbrewが非常に良い](http://www.karakaram.com/mac-install-phpbrew)はとても参考になりました。

## PHP7.1をダウンロードする
違うバージョンを指定する場合は phpbrew known から探してください。

```bash
$ phpbrew install 7.1.0 +default +mysql +fpm +opcache +intl +iconv +mb
```

## PHPのバージョンを切り替える
一時的に PHP のバージョンを切り替えるには phpbrew use コマンドを使い、
デフォルトのバージョンを切り替えるには phpbrew switch コマンドを使います。

```bash
$ phpbrew use 7.1.0
$ phpbrew switch 7.1.0
```

## php-fpm設定
設定ファイル www.conf の該当箇所を下記に変更

```php:~/.phpbrew/php/php-7.1.0/etc/php-fpm.d/www.conf
;user = nobody
;group = nobody
 
listen = /Users/ユーザー名/.phpbrew/php/php-7.1.0/var/run/php-fpm.sock
listen.mode = 0664
listen.allowed_clients = 127.0.0.1
 
pm = static
pm.max_children = 1
pm.max_requests = 500
 
catch_workers_output = yes
```

## nginxのインストール
[nginxでバーチャルホストを設定する（Mac）](http://qiita.com/megurock/items/c40200039f6838f51d94)を参考にするとわかりやすいと思います。

## nginx設定
php-fpmからphpを動作させるためserver内に下記を追加。

```nginx:/usr/local/etc/nginx/nginx.conf
location ~ \.php(/|$) {
    fastcgi_index  index.php;
    fastcgi_pass   unix:/Users/ユーザー名/.phpbrew/php/php-7.1.0/var/run/php-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
```
php-fpm.sockが存在しない場合は phpbrew fpm コマンドを使い起動させると生成されます。

```bash
$ phpbrew fpm start
$ phpbrew fpm stop
```
Specs2で動的に複数のテストを作成する

すでにファイルにテスト対象のデータがあってそれを読み取りながらScalaのSpecs2でテストをしたいと考えた。ファイルに書かれている各々のテストケースをSpecs2の一つのテストとして扱いたいとする。動的にテストを生成した上で実行にFragment#foreachを使う。次のようになる。

```scala
import org.junit.runner.RunWith
import org.specs2.mutable.Specification
import org.specs2.runner.JUnitRunner
import org.specs2.specification.core.Fragment

class ParamSpecs extends Specification {
  "paramtest" >> {
    Fragment.foreach(Seq("1", "2", "0", "3"))(e => s"param test $e" >> {
      e.toInt must be_>=(1)
    })
  }
}
```

実行すると

```
Testing started at 10:42 ...

0 is less than 1
java.lang.Exception: 0 is less than 1
	at org.specs2.matcher.MatchResultStackTrace$class.setStacktrace(Expectations.scala:57)
	at org.specs2.mutable.Specification.setStacktrace(Specification.scala:15)
	at org.specs2.matcher.ExpectationsCreation$class.checkFailure(Expectations.scala:37)
	at org.specs2.mutable.Specification.checkFailure(Specification.scala:15)
...中略...
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

paramtest
param test 1
param test 2
param test 3
```
こんな感じの出力になる。
コマンドクロンプトのドライブ移動(Win7環境)

備忘録です。
最新記事が5年前とかになっていたので、今win7環境でやっている人で困っている人はいいかもしれません。

#Eドライブに移動をしたい！
開発用PCを買って、HDDの容量を圧迫しないようにするために(たかが知れてるけど)高速なSDカードの中でディレクトリを作ってやろうと思ったときに、そもそもドライブ移動で躓いたので書いておきます。

```
C:\>cd \d e:\
```
なぜここではバックスラッシュになるんだ…。
本当ならwin7のコマンドクロンプトではバックスラッシュが入力できず円マークになるので、この書き方がそもそもできず、「ファイル名、ディレクトリ名、またはボリューム　ラベルの構文が間違っています」と怒られてしまいます。

##実はもっと簡単だった…
移動したいドライブ名を指定してあげるだけで移動できました。
バックスラッシュの入力方法を馬鹿みたいに必死で調べてました…。

```
C:\>E:

E:\>
```
こんなに簡単に移動できました。やっと作業がはかどります。
「ドライブ名：」で移動、もう忘れません。
Dockerで作る開発環境

# Dockerで開発環境作った時の話

こんにちは。セカイエの村田です。
先週から、うさぎを飼い始めました。
名前 「あき男」　っていいます


# 経緯
自分は '2016/8/1'からセカイエにjoinしたのですが、初日って入社手続きや開発環境作ったりいろいろありますよね。
セカイエの開発環境はおなじみの「 vertualbox + vagrant 」のLAMP環境なのですが、イメージ落としたり、シェルでプロビジョニング走ったり時間がかかります。

また、最近のvagrantとvirtualboxの相性が悪く、

<img width="786" alt="スクリーンショット 2016-12-20 10.06.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/107466/7fa33034-11ce-b4e9-f668-aed8fc4f61d4.png">

vagrantが仮想マシンに接続できないとかありました..

そんな経緯から、Dockerで開発環境作れればいいかなと思ったのがきっかけです

# 環境
作りたかった環境は以下のような感じで、

<img width="1103" alt="スクリーンショット 2016-12-20 10.11.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/107466/4fa28cd6-1287-f4cc-c16f-b27d95739bb6.png">
 
Appコンテナ（PHP + Apache + CentOS） と DBコンテナ（MySQL）を切り離した構成になります


# はまったところ
起動にはなるべく手間をかけたくなかったので、「Docker-Compose」というコンテナを複数管理できるツールを利用していたのですが、コンテナが立ち上がり使用できる状態になるまでの順番がうまくコントロールできなくて、はまりました＞＜

具体的には、
アプリケーションはDBがないと動かないことが前提なので、Appコンテナが起動する前に、DBコンテナが起動されていて、且つ使用できる状態になっていなければいけないのですが、MySQLの初期処理があったりでどうしても、Appコンテナが先に立ちあがってしまう状態でした

いろいろ調べた結果、

Docker公式にもあったのですが、
<img width="1108" alt="スクリーンショット 2016-12-20 10.26.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/107466/428d0328-6c7a-470f-0e66-71372ef06568.png">

上記のようなスクリプトをentrypointにセットして、MYSQLコンテナが使える状態になるまで待つようにしました


# 今後の課題

Dockerをproduction環境でも利用できるような仕組みを整えたいと企んでいたりしてます。
今は、DockerHubとGitHubの連携もできるので、

<img width="968" alt="スクリーンショット 2016-12-20 10.30.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/107466/2b634058-50d2-0b91-cb20-7994887b397f.png">

masterにpushしたファイルの中にDockerfileが含まれていたら、Dockerhubが検知してくれて自動でコンテナイメージをビルドしてくれるので運用も楽になりそうです
Instagramでアプリ作成時にSandboxの検証ユーザーを追加する方法

Instagramではapiの審査が通る前にアプリ連携のテストをする場合、Sandboxモードでの検証となります。
Sandboxモードでは実際に公開されているユーザーの情報はapiで取得できないので、複数名の結果を取得するために、検証ユーザーを新たに追加してユーザー数を増やす必要があります。
# まずは登録したアプリを選択
https://www.instagram.com/developer/
1.developerサイトに行き、サイト上部のヘッダ内「Manage Clients」を選択し、
登録したアプリを表示。

2.登録したアプリの「MANAGE」を選択。

# SandboxのUsersを追加
![manage_client.png](https://qiita-image-store.s3.amazonaws.com/0/130708/e0c67e41-9754-9d31-9d19-555b8b1a02ee.png)

3.選択したアプリの設定画面中央部分の「Sandbox」を選択し、「Type a username and press Enter to invite」内に追加したいユーザー名を入力し、Enter。

4.「Save　Changes」をクリック。

5.アプリの一覧画面に戻るので、再度、該当アプリ内の「Sandbox」まで遷移し、先ほど追加したユーザーの状態が「pending」になっていることを確認。

#追加ユーザーの承認作業
6.追加されたユーザーがサンドボックスに招待されているので、承認するために、追加ユーザーのアカウントでdeveloperサイトにログイン。

7.サイト上部のヘッダ内「Sandbox Invites」を選択

8.先ほど招待したアプリが、「Pending Invites」内に表示されているので、「Accept」をクリック。
![sandbox_invite.png](https://qiita-image-store.s3.amazonaws.com/0/130708/606aa8dc-03c6-503e-f910-66b20c42e2aa.png)

#まとめ
これでSandboxにユーザーが追加できました！
追加したユーザー内の投稿や情報であればSandboxモードでのapiで取得できるので、複数名の情報取得テストが可能になります。
Instagramでアプリを登録する方法（Sandbox）

Instagramでアプリを登録する方法を記載いたします。

#手順
1.アプリのadminとなるInstagramアカウントを用意して、developerサイトにログイン。
https://www.instagram.com/developer/

2.画面上部ヘッダ内、「Manage Clients」をクリック

3.「Register a New Client」をクリック
![manage_cliants_new.png](https://qiita-image-store.s3.amazonaws.com/0/130708/c0bc7f86-0d95-1570-12fc-ffaed3a1b069.png)


4.アプリの情報を入力
　Application Name　:　アプリ名を入力
　　※アプリ名にInstagram、IG、insta、またはgramを使用してはいけない。
　Description　:　アプリの内容を記入
　Company Name　:　会社名
　Website URL　:　会社のURL
　Valid redirect URIs　:　有効なリダイレクトURL
　Privacy Policy URL　:　プライバシーポリシーが記載されているURL
　Contact email　:　連絡先のメールアドレス
　Type the words above　:　上記画像の単語を入力

5.すべての入力が終わったら「Register」クリック
※入力内容は後からでも編集できるので、仮の文言でも大丈夫です。

![rejister.png](https://qiita-image-store.s3.amazonaws.com/0/130708/97d1f1b3-3706-57a8-2482-37e81b2a6f9a.png)

6.登録終了！
![完成.png](https://qiita-image-store.s3.amazonaws.com/0/130708/feec7125-cb36-0b92-174a-ea9e8333c27b.png)
これでアプリの登録が完了しました！
発行されたCLIENT ID、Client Secretを使用して、実際にサンドボックスモードでAPIを使用することが可能になります。
登録内容は「MANAGE」からいつでも変更することが可能です。
pythonが入っていないホストへansible 実行 (rawモジュール)

```bash:ansibleからsshのpassword認証用
apt install -y sshpass
```

## サンプル

* BargeOS にssh鍵を置いてパスワード認証を無効にするサンプル

```rb:main.yml
main.yml 
---
- hosts: all
  sudo: yes
  gather_facts: no

  vars:
     authorized_keys: "{{ lookup('file', '../../sshprivate/authorized_keys') }}"

# ------------------------
  tasks:

  - name: .ssh/authorized_keys
    raw: |
      KEY="/home/bargee/.ssh/authorized_keys"
      install -o bargee -g bargees -m 0700 -d /home/bargee/.ssh/
      echo "{{authorized_keys}}" > $KEY
      chown bargee:bargees $KEY
      chmod 600 $KEY

  - name: /etc/ssh/sshd_config
    raw: |
      grep "PasswordAuthentication no" /etc/ssh/sshd_config \
        || (sed -i -e 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config \
            && sshd -t
            && /etc/init.d/S50sshd restart)
```

```bash:hosts
[barge]
b3 ansible_host=192.168.1.2

[all:vars]
ansible_ssh_private_key_file=~/sshprivate/id_rsa
ansible_ssh_user=bargee
ansible_ssh_port=22
```


## 注意点

* python が入っていないため
    * raw モジュールでコマンド実行する。
    * gather_facts: no
* sshパスワード認証は`--ask-pass`もしくは`-k`オプションを付ける。
    * `ansible-playbook main.yml -i hosts --ask-pass`
* yaml 書き方参考 : [Rubyist Magazine - プログラマーのための YAML 入門 (初級編)](http://magazine.rubyist.net/?0009-YAML)
LINQでメモリを節約しないと処理速度はどうなってしまうのか

本記事は、エムティーアイ Advent Calendar 2016 20日目 の記事です。

# 本記事の目的は？

備忘録です。
以前、LINQの実装ミスで、データ取得ロジックの負荷が高まって、処理速度に大きな影響を与えてしまったことがありました。
もう1ヶ月くらい前の話なのですが、どれくらいになっていたのか実際に測定して見よー、と思ったのでやってみました。

# どんな実装ミス？

下記です。
numsAとnumsBの被っている数値を、resultに格納するという簡単な処理を、修正前と修正後の2パターン書いてあります。
修整前と修正後の違いは、ToList()メソッドの呼び出しタイミングです。
もちろん、修正後の方が速く処理します。

実装時は、もう少し複雑でしたが、簡潔にかくとこんな感じです。

```C#:修整前
var numsA = Enumerable.Range(1, 100).ToList();
var numsB = Enumerable.Range(1, 100000);
var result = numsA.FindAll(a => numsB.ToList().Exists(b => b == a));
```

```C#:修整後
var numsA = Enumerable.Range(1, 100).ToList();
var numsB = Enumerable.Range(1, 100000).ToList();
var result = numsA.FindAll(a => numsB.Exists(b => b == a));
```

# 何が起こったの？

LINQは遅延評価されます。
LINQは、`IEnumerable<T>`オブジェクト以外の、何らかの結果を要求するまで、実体化しません。
上記の例では、Listのメソッドとなる.ToList()がその要求にあたります。

FindAllメソッドは、対象の要素分ループして何かしらの処理を行うメソッドです。
修正前では、numsAの要素分、毎回numsBを実体化しているので、遅くなります。

# 具体的にこれぐらい

numsB、numsAの要素数を変えて、処理時間を測定して見ました。
測定方法：`System.Diagnostics.Stopwatch`でのよくある方法で。

```C#
Stopwatch sw = new Stopwatch();
sw.Start();
//処理
sw.Stop();
```

## numsBの要素数を変えた際の処理速度の違い

まずは、実際実体化させているnumsBの要素数を100000, 1000000, 10000000と変化させます。下記のようになりました。
numsAの要素数は1000で固定しています。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/128706/6f858fd1-6e05-2d40-8487-ebd217635b88.png)

要素数が100倍になった時、~~修正後ではほぼ変わっていませんが~~、修正前では指数関数的に約70倍に伸びています。

> 追記：よく見たら間違えていました。
> 修正後ではほぼ変わっていませんが　
>  ↓ 
> 修正後の方でも、同様に指数関数的に伸びていますが、それでも1秒にはみたない程度です。

## numAの要素数を10倍にした際の処理速度の違い
numsAを100から1000に変えた時に違いは、下記のようになりました。
numsBは、先ほどの中での最大値10,000,000で固定です。

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/128706/7dc633e6-a9d4-364c-8854-42c48a0847ea.png)

ループ数が10倍になったので、修正前の方の処理時間もしっかり10倍(9.69倍）に伸びています。
修正後ではほぼ変わっていません。

想像していたような結果になりましたが、こうやって改めてみると怖いですね。

# 終わりに

知っている方からすれば、当然の事例かもしれませんが、こうやって測定してみると面白いですね。
これからもやっていこうと思います。

# 参考文献

[LINQの処理中に使うメモリを節約するには？](http://www.atmarkit.co.jp/ait/articles/1409/24/news105.html)
CSV ファイルの特定の列を取り出すのにsed とかcut とか使わない

# 結論
Perl のワンライナーを使おう。

最近、知人がこちらの記事をストックしていたので条件反射的に書きます。
[CSV ファイルの特定の列を取り出す](http://qiita.com/pekepek/items/c28bc87171983d756e32)

# やってみる
```
$ cat member.csv

id,name,age
1,taro,21
2,jiro,18
3,saburo,16
4,shiro,15
5,goro,12
```
こんなファイルがあって、IDの列だけ取り出して書きのような結果を得たいというお題です。

```
1
2
3
4
5
```

先程の記事では結論だけ書くと、cut とsed を組み合わせて

```
cut -d ',' -f 1 member.csv | sed -e '1d'
```
こうしようと書いてありました。正しいと思います。

# Perl で
```
perl -nle '@t=split(/,/);print $t[0] if $t[0] =~ /\d.*/' members.csv
```
cut & sed より少し長いですがいくつかのメリットがあります。
まず直感的ですよね。(感覚は人にもよると思いますが)

**「カンマでスプリット(分割)して、そのうちの0番目(先頭)がもし数値であれば、それを出力してね。」**

という風に、まるで自然言語を読む感覚で理解できます。
そして次のメリットとして、応用が効きます。

例えばそのID に全て `()` をつけて欲しいという依頼があれば、プログラミング的にはただの文字列の連結が追加されるだけですから、先程のを少し改良して

```
perl -nle '@t=split(/,/);print "(".$t[0].")" if $t[0] =~ /\d.*/' members.csv
```

```
(1)
(2)
(3)
(4)
(5)
```

こう書けばよいだけですし、偶数列だけ出力したいなんていわれれば

```
perl -nle '@t=split(/,/);print $t[0] if $t[0] =~ /\d.*/ && $t[0] % 2 == 0' members.csv 
```
このように改良すればよい。

```
2
4
```

# Perl はどこにでもだいたいある
最後に、cut やsed もどの環境にでもだいたいあるとは思いますが、Perl も負けじとだいたいどの環境にもあります。Mac でもLinux でも。ですから、上記のワンライナーは、Mac やUbuntu を使っている方であれば、そのまますぐに実行できます。そういう意味でもおすすめです。

cut やsed の魔法をつかいこなせるのは格好いいかもしれませんが、僕が思うに、利用範囲が狭い -> 利用頻度が低い -> 覚えにくい -> 毎回使い方をググるってことになりかねません。

その点Perl であれば応用範囲が広くて、使用頻度が高くなるので、結果的に手に馴染むと思います。いかがでしょうか。
Let's Encrypt + NGINX でLINE botを作るときの注意点を1つだけ

最近[LINEのMessaging Api](https://developers.line.me/messaging-api/overview)にさわることがあった
一方的に通知がくるものだけでなくそれに対してReplyがくるbot的なものを作る

そんな時に使うのがWebhookという機能 [公式doc](https://devdocs.line.me/ja/#webhook)　
botをルーム内にいれておくことで誰かが発信をした際にwebhookで指定したURLにpostでリクエストがくる

ただこのWebhookのURLは **https** のURLを指定しないといけない！！

最近は無料証明書が増えてきたしHerokuとか使えばhttps化した状態で使える便利な時代
でも自前のサーバーで[Let's Encrypt](https://letsencrypt.org/)を使いたい

## 話さないこと
- Let's Encryptのいれかた
  - itamae使っている人はレシピプラグイン作ったので良かったら使ってください:bow: [itamae-plugin-recipe-letsencrypt](https://rubygems.org/gems/itamae-plugin-recipe-letsencrypt)
- WebhookでPostをうけた後の処理

## まず起きたこと
現状だと [ここから](https://developers.line.me/ba) Webhookの指定ができる
URLの横の **VERIFY** ボタンから疎通するかのテストが通る
ここでsuccessが出ればOK！
しかし出ない... 代わりに **SSL certificate is invalid.**

![スクリーンショット 2016-12-20 9.02.33.png](https://qiita-image-store.s3.amazonaws.com/0/44247/d1bb9714-3513-494d-bf41-56d57cdca6c6.png)

## 何が問題だったのか
nginxのkeyの指定ミスってました
最小限の設定だけのせる

```nginx:駄目な方
listen  443 ssl;
        
ssl_certificate         /etc/letsencrypt/live/hoge.example.com/cert.pem;
ssl_certificate_key     /etc/letsencrypt/live/hoge.example.com/privkey.pem;
```

## どう解決したか

```nginx:OKな方
listen  443 ssl;
        
ssl_certificate        /etc/letsencrypt/live/hoge.example.com/fullchain.pem; #　これ
ssl_certificate_key    /etc/letsencrypt/live/hoge.example.com/privkey.pem;
```

## そもそもなんだったのか
Let's encryptを使って証明書を発行すると4つほどファイルがはかれる

サーバ証明書（公開鍵）: /etc/letsencrypt/live/[ドメイン名]/cert.pem
中間証明書: /etc/letsencrypt/live/[ドメイン名]/chain.pem
サーバ証明書と中間証明書が結合されたファイル: /etc/letsencrypt/live/[ドメイン名]/fullchain.pem
秘密鍵: /etc/letsencrypt/live/[ドメイン名]/privkey.pem

サーバー証明書と秘密鍵の指定でもhttps化はするのですが、中間証明書をはさんだほうが不正改ざんや傍受が難しくなるので
信頼度が高いということでしょうか

とりあえず無事WebhookでPostリクエストがきたので良かったです