OmniAICreator/Qiita-1.07M huggingface dataset:
Ansistranoでdeployできるみたいなので、試作中


## Ansistrano 
https://github.com/ansistrano/deploy

##  Ansistranoのインストール
$ `ansible-galaxy install carlosbuenosvinos.ansistrano-deploy carlosbuenosvinos.ansistrano-rollback`


```
- downloading role 'ansistrano-deploy', owned by carlosbuenosvinos
- downloading role from https://github.com/ansistrano/deploy/archive/1.10.0.tar.gz
- extracting carlosbuenosvinos.ansistrano-deploy to /usr/local/etc/ansible/roles/carlosbuenosvinos.ansistrano-deploy
- carlosbuenosvinos.ansistrano-deploy was installed successfully
- downloading role 'ansistrano-rollback', owned by carlosbuenosvinos
- downloading role from https://github.com/ansistrano/rollback/archive/1.4.2.tar.gz
- extracting carlosbuenosvinos.ansistrano-rollback to /usr/local/etc/ansible/roles/carlosbuenosvinos.ansistrano-rollback
- carlosbuenosvinos.ansistrano-rollback was installed successfully
```
## playbook の準備
`example/my-playbook`

```tree:playbook
.
├── deploy.yml
├── group_vars
│   └── staging.yml
├── hosts
├── staging
└── rollback.yml
```

```file:staging
[staging]
stg.example.com
```

## playbook の実行
```staging
ansible-playbook -i staging deploy.yml
```

## rollback
```staging
ansible-playbook -i staging rollback.yml
```

## ディレクトリ構造
```tree:/var/www/app
.
├── current -> ./releases/{$timeStamp}
├── releases
│   ├── {$timeStamp}
│   ├── {過去の$timeStamp}

```
WindowsでiOS Buildしたときに「Exception: Can't symlink files on this platform」と出る問題の解決

WindowsマシンでUnity5.2.3使用時
バッチモードなどでビルドした時に以下のエラーが出る問題の原因と解決策

```text:エラー例
Exception: Can't symlink files on this platform
UnityEditor.iOS.Utils.SymlinkFile (System.String src, System.String dst)
```

これはBuildOptionsに ``` BuildOptions.SymlinkLibraries ``` を設定して
Windowsマシンで``` BuildPipeline.BuildPlayer ``` を叩くと起こる問題  
```BuildOptions.SymlinkLibraries```の設定はXcodeプロジェクトを生成する時に
ランタイムライブラリをシンボリックリンクで生成するオプション。
しかしこのオプションはWindowsには対応していないようだ。

なので下記のようにBuildOptionsにSymlinkLibrariesを含めていた場合は

```csharp:アカン例
BuildOptions option = BuildOptions.SymlinkLibraries;

BuildPipeline.BuildPlayer(scenePaths,outputPath,buildTarget,option);
```

次のような感じで修正します

```csharp:修正例
BuildOptions option = BuildOptions.None; 

if(Application.platform == RuntimePlatform.OSXEditor)
	option |= BuildOptions.SymlinkLibraries;

BuildPipeline.BuildPlayer(scenePaths,outputPath,buildTarget,option);
```

エラー文で調べると過去のUnityのBug Fixページしか出てこない上に２回も引っかかったので備忘録として。
~~そもそもWindowsでiOS Buildしないほうがいいと思うんだけどね…~~

``` BuildOptions.SymlinkLibraries ```
参考：http://docs.unity3d.com/jp/current/ScriptReference/BuildOptions.SymlinkLibraries.html
シェルにプライベートな情報を表示させない方法

qiitaにシェルの内容を含めて投稿する際に、ユーザ名やホスト名を隠したい場合があると思います。シェルの入出力だけならテキスト処理ツールを使って削除することもできますが、スクリーンショットをアップロードする場合は端末のタイトルにもこれらの情報が表示されるので、黒塗りする手間も加わります。そこで最初からプライベートな情報をプロンプトに表示させない方法を紹介します。

# 準備
次のようなファイルを作成します。

```bash:.examplerc
source ~/.bashrc 2> /dev/null
if [ "$EUID" -eq 0 ];
then
    name="root"
else
    name="user"
fi
PS1='\[\[\e]0;\a\]'"$name"'@example:\w\$ '
```
## 一応コードの説明
`EUID`は実行ユーザIDです。`UID`を使わないのは後述の`\w`の仕様に合わせるためです。
`PS1`変数は展開されてプロンプト文字列として使われるものです。

`\[\[\e]0;`~`\a\]`で囲った内容が端末のタイトルになります。今回の場合は端末のタイトルに何も表示しない（実際は"端末"と表示される）ということです。

また`\w`と`\$`は特殊文字で、それぞれカレントディレクトリと`$`(実行ユーザIDが0のときは`#`)に展開されます。


その他の利用可能なカスタマイズ用特殊文字についてはbashのマニュアルをご覧ください。

# 利用
以下のようにしてbashを起動します。

```shell-session
$ bash --rcfile .examplerc
```
![shell_no_prv_info.png](https://qiita-image-store.s3.amazonaws.com/0/44208/9c2f1150-9189-59d5-e95c-8fac8bc2a736.png)


あとは存分にコマンドを呼んでコピペしてやるだけです。

zsh向けの方法とかも調べなきゃ･･･。
Windowsでのテスト用自己証明書作成

#コマンド
SET FQDN=localhost
SET CER_FILE=%FQDN%.cer
SET PVK_FILE=%FQDN%.pvk
SET PASSWORD=password

rem 証明書作成
makecert -r -pe -n "CN=%FQDN%" -sky exchange %CER_FILE% -sv %PVK_FILE%

rem pfx ファイル作成
pvk2pfx -pvk %PVK_FILE% -spc %CER_FILE% -pfx %FQDN%.pfx -pi %PASSWORD%
iOS 8以下でinsertRuleを使うときはベンダープレフィックスがないとエラーになることが


# JavaScriptからCSSへスタイルを追加できるinsertRule
普段JavaScriptからスタイルを制御するときは`element.style.display = "none"`といったふうに`style`を使うことが多いと思います。そういった中で、CSS3の`@keyframes`などは指定する要素が多く、なかなか`style`を使いづらい。そこで、CSSにスタイルを追加できる[insertRule](https://developer.mozilla.org/ja/docs/Web/API/CSSStyleSheet/insertRule)を使うことにしました。

JavaScriptから`@keyframes`の`transform`の値を操作したいときのコード。

```js
var css = document.styleSheets[0];

var scale = 0.5;

css.insertRule(
  "@keyframes show-anime{" +
  "0%{transform:translate3d(0," + (100 * scale) + "px,0);-webkit-transform:translate3d(0," + (100 * scale) + "px,0)}" +
  "20%{transform:translate3d(0," + (100 * scale) + "px,0);-webkit-transform:translate3d(0," + (100 * scale) + "px,0)}" +
  "50%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)}" +
  "75%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)}" +
  "100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)}}", 0);
```

# iOS 8以下でエラーが出るときはベンダープレフィックスをつけるべし

`insertRule`を使ってCSSに`@keyframes`を追加すると、iOS 8以下でエラーが出ます。エラーの内容は、`@keyframes`が対応していないといったものです。そこで、iOS 8以下のときはベンダプレフィックスのついた`@-webkit-keyframes`を指定するとエラーが出なくなります。

```js
// @keyframesを変数でもっておく
var cssKeyframes = "@keyframes";

if (/(iPhone)/g.test(navigator.userAgent)) {
  navigator.userAgent.match(/iPhone OS (\w+){1,3}/g);
  var osv = RegExp.$1.split("_")[0];
  if(osv <= 8) { // iOS 8以下
    // iOS 8以下の時だけベンダープレフェックスをつける
    cssKeyframes = "@-webkit-keyframes";
  }
}

var css = document.styleSheets[0];

var scale = 0.5;

// @keyframesを設定する
css.insertRule(
  cssKeyframes + " show-anime{" +
  "0%{transform:translate3d(0," + (100 * scale) + "px,0);-webkit-transform:translate3d(0," + (100 * scale) + "px,0)}" +
  "20%{transform:translate3d(0," + (100 * scale) + "px,0);-webkit-transform:translate3d(0," + (100 * scale) + "px,0)}" +
  "50%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)}" +
  "75%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)}" +
  "100%{transform:translate3d(0,0,0);-webkit-transform:translate3d(0,0,0)}}", 0);
```
logrotate で重複するパターンを指定したらだめ

logrotate で次のように重複するパターンを指定し、

**/etc/logrotate.d/ore.conf**

```conf
/var/log/ore/zzz.log {
    weekly
    rotate 3
}
/var/log/ore/*.log {
    daily
    rotate 10
}
```

さらに次の通りにログがあるときに、

```sh
mkdir -p /var/log/ore
touch /var/log/ore/aaa.log
touch /var/log/ore/zzz.log
```

logrotate を実行すると、

```sh
logrotate --debug /etc/logrotate.conf
```

次のように表示されました。

```
rotating pattern: /var/log/ore/zzz.log  weekly (3 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/ore/zzz.log
  log does not need rotating

rotating pattern: /var/log/ore/*.log  after 1 days (10 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/ore/aaa.log
  log does not need rotating
```

logrotate の設定を次のように変更すると、

```conf
/var/log/ore/*.log {
    daily
    rotate 10
}
/var/log/ore/zzz.log {
    weekly
    rotate 3
}
```

次のように結果がかわりました。

```
rotating pattern: /var/log/ore/*.log  after 1 days (10 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/ore/aaa.log
  log does not need rotating
considering log /var/log/ore/zzz.log
  log does not need rotating

rotating pattern: /var/log/ore/zzz.log  weekly (3 rotations)
empty log files are rotated, old logs are removed
No logs found. Rotation not needed.
```

この動きから推測するに、

「重複するパターンがある場合は最初の検索で見つかったログはは以降の検索で見つかっても除外される」

ということだと考えました。

----

が、ぜんぜん違いました。

logrotate の設定を次のように変更して、

```
/var/log/ore/bbb.log {
    weekly
    rotate 3
}
/var/log/ore/*.log {
    daily
    rotate 10
}
```

そしてログファイルを次のように作成すると、

```
mkdir -p /var/log/ore
touch /var/log/ore/aaa.log
touch /var/log/ore/bbb.log
touch /var/log/ore/zzz.log
```

次の結果になりました。

```
rotating pattern: /var/log/ore/bbb.log  weekly (3 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/ore/bbb.log
  log does not need rotating

rotating pattern: /var/log/ore/*.log  after 1 days (10 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/ore/aaa.log
  log does not need rotating
```

`zzz.log` が無い？

よく見たら先頭の方でエラーが表示されていました。

```
error: ore.conf:5 duplicate log entry for /var/log/ore/bbb.log
```

つまりこれは下記の動きになっています。

- `/var/log/ore/bbb.log` を検索
    - `/var/log/ore/bbb.log` を追加
- `/var/log/ore/*.log` を検索
    - `/var/log/ore/aaa.log` を追加
    - `/var/log/ore/bbb.log` を追加
        - がしかし重複しているので無視して次のパターンに

そのため `bbb.log` よりも後に発見される `zzz.log` は抜けてしまいます。

----

結論、logrotate で重複するパターンは指定してはならない。
SendGrid+Pythonでメール送信をしてみた

![is.PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/d5226ec0-8fe1-aa1d-9a88-832216a1831f.png)

さくらのクラウドでもSendGridが使えるようになり、せっかくなのでPythonからメール送信をしてみました。
ハマったというかググり力不足で陥った部分があったのでメモを残しておきます。


[Pythonでメール送信！SendGridを使って簡単に実装する方法 | ブログ | SendGrid](https://sendgrid.kke.co.jp/blog/?p=1070)

公式のサイトにチュートリアルも用意されているんですが、実はこれちょっと古い。
現在pipでインストールできるSendgridのライブラリはv3 Mail準拠のものです。ここがハマりどころで、この辺意識せずにというか気づくことなくググっていると、何故上手く動かないのか分からずドツボにはまります。（ハマりました。。。）

[Documentation>Integrate>Code Examples>v3 Mail>Python](https://sendgrid.com/docs/Integrate/Code_Examples/v3_Mail/python.html)
公式ドキュメントのv3の利用方法。まずはこちらを確認しましょう。


SendgridのダッシュボードのSettingsの項目からAPI Keyを発行します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/100935/0abf6903-a80d-9e8d-f21c-0981954e1719.png)
”Mail Send”のところにアクセス権があればメール送信出来ます。発行されたAPIキーを控えておきます。


送信側の環境準備ですがとても簡単。

```shell-session
pip install sendgrid
```

```py
import sendgrid
import os
from sendgrid.helpers.mail import *

sg = sendgrid.SendGridAPIClient(apikey="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
from_email = Email("test@example.com")
subject = "Hello World from the SendGrid Python Library!"
to_email = Email("test@example.com")
content = Content("text/plain", "Hello, Email!")
mail = Mail(from_email, subject, to_email, content)
response = sg.client.mail.send.post(request_body=mail.get())
print(response.status_code)
print(response.body)
print(response.headers)
```
公式の[チュートリアル](https://github.com/sendgrid/sendgrid-python#hello-email)通りです。
※os.environから読み出すのがナウいらしいですが今回は手軽に使いたいのでAPIキーベタ書きで。

使う前にちゃんとバージョン確認することと、ググるだけじゃなくて公式の情報にあたるようにしましょう（という自戒）
わかりやすいドキュメントを書くには 〜 全体像を把握できることが重要

# はじめに

エンジニアなら誰でもたくさんのドキュメントを読むことになります。
その中にはわかりにくいドキュメントも少なからずあると思います。

自分はわかりにくいドキュメントは「全体像が掴みにくい」ことが多いと感じています。

そこで、ここではわかりやすいドキュメントを書くための方法を「全体像を把握できるようにする」という視点でまとめてみました。

また、最後に具体例としてQiita APIドキュメントでわかりにくい点の指摘と改善をしてみました。

## ここで扱うドキュメントの種類

ここでは仕様書やリファレンスマニュアルといった類のドキュメントを想定しています。

Qiitaの投稿やブログの記事といったものでも共通する部分は多いのですが、これらには他にも重要な要素があると思うので、ここでは扱いません。

# わかりにくいドキュメント=全体像が掴めないものが多い

先ず、わかりにくいドキュメントとはどんなものでしょうか？

自分が今まで見てきた中で多かったのは、次のようなものです。

- いきなり詳細から始まっている
- 目次がない
- ページに見出しがない

目次もなくいきなり詳細から始まっていると、そのドキュメントにどんなことが書かれているのかが最後まで読まないとわかりません。
ページに見出しがない場合も、そのページに書かれていることを全て読まないとわかりません。

これらに共通している問題点は「全体像が掴みにくい」ということです。
全体像が掴めないと、いくら詳細が丁寧に書いてあってもなかなか頭に入ってきません。

# 文単体の質より全体のわかりやすさが重要

「わかりやすいドキュメントの書き方」などでググると「である調・ですます調を揃える」「主語・述語の関係に気をつける」など、文の質を上げることに着目している記事を多く見かけます。

中には誤字・脱字がないものがわかりやすいドキュメントだと書いているものもあります。

こういった文単体の質を上げることはもちろん大事なのですが、*ドキュンメトを判りやくする偽には全体象を把握できることの方がよリ需要なことです。*

# 全体像を把握しやすくする為には

では全体像を把握しやすくする為にはどうしたらいいでしょうか？
基本はわかりにくいドキュメントの逆を考えることです。

- 冒頭に概要を書く
- 目次を付ける
- 見出しを付ける

## 冒頭に概要を書く

一番重要なのは、詳細に入る前に概要を書くことです。

「本書はxxxの仕様を記述したドキュメントです。」のような定型文を書くだけでは意味がありません。
詳細の理解に役立つもの、事前に知っておくべきことなどを書きます。

具体的には次のような事を必要に応じて書きます。

- xxxとは
    - 対象システムや機能の説明を簡潔に書く
- 図・一覧
    - ドキュメントの説明対象が一望できるもの
    - システム構成図、画面構成など
    - 画面仕様書なら画面一覧、API仕様書ならAPI一覧など
- 動作環境・前提条件
- ドキュメント自体の概要
    - ドキュメントの目的
    - 対象読者
    - 記述範囲、ここでは扱わないもの
    - 他に読んでおくべきドキュメント
- 用語定義

## 目次を付ける

目次を付けることでそのドキュメントに書かれている事が一覧できるので、全体像を把握しやすくなります。
また、必要な時に読みたい箇所を素早く参照できるようになります。

エクセルやパワーポイントでもボリュームのあるドキュメントでは目次を作っておいたほうが親切です。

### エクセル

目次用のシートを作成して各シートへのリンクを作ります。
シート名だけでなく各シートの説明や付加情報も書いておくといいです。

### パワーポイント

ドキュメント全体の目次と、各セクション毎の目次を作成します。
目次というより概要を箇条書きにするイメージです。

- ドキュメント全体の目次
    - セクションの一覧を箇条書きで
- 各セクション毎の目次
    - セクションで説明する内容を箇条書きで
    - 全ページのインデックスにする必要はない

### wikiなどのWebドキュメント

自動生成の目次だけでもいいですが、ボリュームのあるドキュメントの場合は、説明を付けたり論理的にグルーピングした目次を自分で作るとわかりやすくなります。
技術書やOSSライブラリのリファレンスマニュアルなどで良く見かける書き方です。

例：

- [Django ドキュメント](https://docs.djangoproject.com/ja/1.9/)

## 見出しを付ける

### パワーポイント

見出しを省略してしまうと、そのページで何を説明しているのわからなくなります。
各ページに必ず見出しを付けるようにしましょう。

- 説明が複数ページにまたがる場合の見出しは「xxx(1/3)」のようにする
- セクションの区切りでは見出しのみのページを挿入する

### エクセル

必ずシート名をデフォルトから変更するようにしましょう。

# 具体例：Qiita APIドキュメント

最後に、[Qiita API v2ドキュメント](http://qiita.com/api/v2/docs)を具体例として取り上げて見ます。

ちょっとだけ上から目線で書きますが、決してQiitaを批判することが目的ではないのでご了承ください。

## 残念なところ

- API一覧がない
    - 初めて見た時にどんなことができるのかが最後まで読まないとわからない
    - APIの詳細を見たい時に素早く参照することができない
- Qiita:Team用APIも混在して書かれている
    - いきなり「グループ」「プロジェクト」という単語が出てくるので「Qiitaにこんなのあったっけ？」ってなる
- 認証状態(未認証/認証済)によって使えるAPIの違いがわからない
    - なんとなく予想はできるけど、詳細を見ても明記されていない

## 概要を書いてみました

ここに挙げた問題点は、概要をまとめることで解決できるので書いてみました。

[Qiita API v2 の概要](http://qiita.com/tag1216/items/b0b90e30c7e581aa2b00)


各セクションは次のような意図で書いています。

- Qiita APIとは
    - 対象を簡潔に説明することで、初めての人でも理解しやすくする
- 認証状態とユーザータイプによる違い
    - 使えるAPIが違うことを説明
    - この後の一覧でグルーピングの意味がわかるようにする
- 認証認可
- モデル一覧
- API一覧
    - 全機能が一望できるようにする
    - 目次として機能するようにリンクにする
    - 興味のないAPIを読み飛ばせるようにグルーピング

# まとめ

このように、全体像を把握できるようにすること、特に概要を書くことがドキュメントをわかりやすくなる上で重要だということがわかったと思います。

- 冒頭に概要を書く
- 目次を付ける
- 見出しを付ける

改めて見直してみると、ドキュメントを書く上での基本中の基本でしたね。
技術英語 > If you check data passed as parameters [in every conceivable way] in every conceivable place, your program will be fast and slow.

@ Code Complete (No. 7272 / 36077)

> If you check data passed as parameters <font color=red>in every conceivable way</font> in every conceivable place, your program will be fast and slow.

http://eow.alc.co.jp/search?q=conceivable
> 想像できる、考えられる、あり得る

意訳「引数として渡されるdataを、あらゆる手段かつ、あらゆる場所でチェックする場合、そのプログラムは早くもあり遅くもある」
ubuntu16.04 LTS上に Nginx/pukiwiki をインストール


# 目的
ubuntu16.04LTS上にnginx/pukiwiki環境を構築する

# 動作確認環境
VirtualBox上に構築した環境で以下のバージョンで動作確認
- ubuntu 16.04 LTS
- nginx 1.10.0
- php 7.0
- pukiwiki 1.5.1

# インストール
```bash
sudo apt-get update
sudo apt-get install nginx php-fpm
```

# Nginx設定
## 設定ファイル編集
基本的にコメントアウトで良い

```nginx:/etc/nginx/sites-available/default
server {
...
    index index.php index.html index.htm index.nginx-debian.html;

    server_name <server_domain_or_IP>;
...
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
...
    location ~ /\.ht {
        deny all;
    }
}
```
上記設定の概説
- index: indexファイルへindex.phpを追加
- server_name: サーバー名にドメインorIPアドレスを指定
- localtion ~ \.php$: phpファイルに対する挙動の設定
 - include: fastcgi-php.confをここにincludeする
 - fastcgi_pass: php-fpmのunixソケットファイルを指定
- location ~ /\.ht: .htaccessへのアクセス設定拒否

## 設定テスト
```bash
sudo nginx -t
```
設定に間違いがあった場合は、エラーメッセージが表示される
# 再起動
## PHP
```bash
sudo systemctl restart php7.0-fpm
```
## Nginx
```bash
sudo systemctl reload nginx
```
## PHP動作テスト
```php:/var/www/html/info.php
<?php
phpinfo();
```

```http
http://<server_domain_or_IP>/info.php
```

# pukiwikiインストール
```bash
cd /var/www/html/
sudo wget http://jaist.dl.osdn.jp/pukiwiki/64807/pukiwiki-1.5.1_utf8.zip
sudo unzip pukiwiki-1.5.1_utf8.zip
sudo mv pukiwiki-1.5.1_utf8 pukiwiki
sudo rm pukiwiki-1.5.1_utf8.zip
sudo chown -R www-data:www-data ./*
```

# pukiwiki設定

```php:/var/www/html/pukiwiki/pukiwiki.ini.php
$page_title = 'PukiWiki';
...
$script = 'http://<server_domain_or_IP>/pukiwiki/';
...
$adminpass = '<password>';
```
- $page_title: pukiwikiのページタイトル
- $script: pukiwikiのURL
- $adminpass: 編集用パスワード

# TODO
1. Docker化

# 参考リンク
- [How To Install Linux, Nginx, MySQL, PHP (LEMP stack) in Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04)
- [PHP-FPMでcgi.fix_pathinfo=0は必要なのか](http://satakeh.hatenablog.com/entry/2014/11/13/072048)
osx Finderで.gitignoreを表示する

.gitgnoreなど非表示ファイルを表示する。
```ターミナル.app
$ defaults write com.apple.finder AppleShowAllFiles TRUE
$ killall Finder
```

非表示にする
```ターミナル.app
$ defaults write com.apple.finder AppleShowAllFiles FALSE
$ killall Finder
```
Haskellでmain(do)内での"<-"と"let"の違い

Haskellで引っかかってしまったmain内(do内)での"<-"の自分の勘違いにつていのメモ。
`<-`は、てっきり`束縛`である`let`の代わりだと勘違いしていた。

例えば、標準入力から数値を入力して、1から入力した数値までの足し合わせる簡単な関数に数値の引数を渡したいとする。
標準入力からの値はStringなので、Intに変換したい。
そこで下記のようなコードを書いてエラーに。

~~~hs:エラーの例
reduce' i = foldr (+) 0 [1..i]

main = do
  s <- getLine
  i <- read s :: Int
  putStrLn $ show $ reduce' i
~~~

エラーは下記の通り。`i <- read s :: Int`が悪いらしい。

~~~
Couldn't match expected type IO Integer with actual type Int
In a stmt of a 'do' block: i <- read s :: Int
(以下省略)
~~~
mainのIOモナドで`s <- getLine`としているから、これは`束縛`だ…と勝手に思い込んでいた。
私が買ったHaskellの本には`<-`が詳しく書いてなく、索引にもない…。そこで、もう一つ買っておいた参考書「すごいH」な本を読むと次のように書いてある。

> 「I/OアクションgetLineを実行して、それからその結果の値をsに束縛せよ」

その後の説明を読み進めると、つまり、`getLine`は`String`型ではなく`IO String`型で、「`<- getLine`」は、「IOから文字列取り出して、左辺の変数に束縛する」という意味らしい。

じゃぁ、`read`はというと、これは`String -> a`で`IO String`ではない。これはただの関数なので`<-`を使っても束縛できるわけではない。普通に、束縛は`let`を使う。
なので、正しいコードは次の通り。

~~~hs:正しい例
reduce' i = foldr (+) 0 [1..i]
 
main = do
  s <- getLine
  let i = read s :: Int
  putStrLn $ show $ reduce' i
~~~

では、`getLine`で`<-`を使わず`let`を使ったらどうなるかというとエラー。
なぜかというと、`let s = getLine`では、`getLine`に別名を付けているというコードになってしまうらしい。
実際にGHCiで試してみる。

~~~hs
Prelude> let s = getLine
Prelude> s --("s"は"getLine"の別名なので、"getLine"が実行される)
10 --(入力待ちになるので"10"を入力してEnter)
"10" --(入力結果が表示される)
~~~

あぁ、こういうことだったのね…と。盛大に勘違いしてたので、メモメモ。
「すごいH」な本は、やっぱりすごいｗ
Hubotのエラー Cannot find module の解決法

惚れさせ男子データベースから地獄のミサワ画像を返すHubotがあると知って、手持ちのHubotに機能を追加しようと思ったけど、タイトルのエラーで詰まりかけたので投稿しました。

<b>npm</b>
https://www.npmjs.com/package/hubot-misawa

上記のURLに使い方とかが書いてあります。

<b>機能追加の手順</b>
1.npm install hubot-misawa --save ←ここでハマりました。
2."hubot-misawa" を 作成したHubotのルートディレクトリ直下にあるexternal-scripts.json に追加
3.Hubotを再度デプロイ
4.Hubotを再起動


#ERROR Error loading scripts from npm package - Error: Cannot find module 'hubot-misawa'#

[以前作成したIBM Bluemix の Hubot](http://qiita.com/Amebayashi/items/ca979ec6f925abc7713f)を手順に沿って、改修したところ、異常終了したので以下のコマンドを発行し、エラーが出ていることを確認。
```cf logs hubotdev --recent```

#解決策#
node_modules直下で以下のコマンドをコマンドプロンプトで発行して、再度デプロイする

```作成したhubot名\node_modules>npm install hubot-misawa --save```

どうやら、
npm install hubot-misawa --save
は試した限りではアプリごとにインストールしないとダメみたいです。
Linuxのyumコマンドみたいにインストールしたら、どっからでも使えるわけではない様子。

#うまく解決できたら・・・#
<b>Slackで動作確認する場合</B>
@作成したHubot名 misawa
でランダムにミサワ画像が取得できるようになります。
[Vue.js]クリックすると編集可能に切り替わるテキスト

#はじめに

- クリックすると編集可能に切り替わる
- フォーカスを外すとテキストに戻る

わりとよくあるアレをvue.jsで

#デモ
https://jsfiddle.net/b44cqueg/2/

#説明

~~~javascript:js

Vue.directive('auto-focus', {
  bind: function () {
  	var el = this.el;
    Vue.nextTick(function(){
    	el.focus();
    });
  }
});
~~~

- このカスタムディレクティブは要素がレンダリングされたときに、対象の要素にフォーカスします。
- bindした瞬間はまだ要素はレンダリングされていないので、`Vue.nextTick()`で待っています。



~~~html:html
  <div v-if="!edit" v-text="value" v-on:click="edit = true"></div>
  <input v-if="edit" type="text" 
          v-model="value" v-on:blur="edit = false"  v-auto-focus>
~~~
- レンダリングされたときにフォーカスするので、`v-show`ではなく`v-if`で切り替えています。

#コード全文
~~~javascript:js

Vue.directive('auto-focus', {
  bind: function () {
  	var el = this.el;
    Vue.nextTick(function(){
    	el.focus();
    });
  }
})

new Vue({
    el: '#app',
    data: function(){
    	return {
      	value: 'Test',
        edit: false
      }
    }
})
~~~

~~~html:html
<div id="app">
  <div class="text" v-if="!edit" v-text="value" v-on:click="edit = true"></div>
  <input v-if="edit" type="text" 
          v-model="value" v-on:blur="edit = false"  v-auto-focus>
</div>
~~~
Rails5でDBに自動生成されるテーブル、"ar_internal_metadata" とは何なのか


私の所属している開発チームでは、現在、自社サービスをRails5に移行中です。先日、ふとDBを見てみると、"ar_internal_metadata" という見慣れないテーブルが存在していることに気がつきました。テーブル情報は以下のようになっています。

#### ar_internal_metadata

|key|value|created_at|updated_at|
|---|---|---|---|
|environment|development|2016-08-13 18:42:31|2016-08-13 18:42:31|

environmentの情報を保持しているだけみたいです。

## Rails 5で追加された、DB誤爆削除防止機能だった

気になったので調べてみました。どうやら、Rails5から追加された新機能で、**DBの不用意な削除を防止するための機能**に必要なテーブルみたいです。

具体的には、environmentがproductionの時に、以下のタスクを実行すると例外が発生します(他にもあるかも)。

```
drop:all
drop
purge:all
purge
```

```
>RAILS_ENV=production rails db:drop

rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
bin/rails:5:in `require'
bin/rails:5:in `<main>'
Tasks: TOP => db:check_protected_environments
(See full trace by running task with --trace)
```

タスクを通すためには、警告にある通り、"DISABLE_DATABASE_ENVIRONMENT_CHECK=1" を指定すればOKです。

```
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:drop
```

デフォルトではproduction環境でのみ例外が発生しますが、任意に変更することも可能です。例えば、staging環境を含める場合は、"config/application.rb"に以下の記述を追加します。

```rb:config/application.rb
ActiveRecord::Base.protected_environments = %w(production staging)
```

また、現在の環境が保護されているか(db:dropで例外が発生するか)を調べるには、以下のタスクを実行すれば明らかになります。

```
>rails db:check_protected_environments # 保護されている場合は例外が発生する。
```

テーブル削除誤爆防止機能も欲しいです・・・
MySQLで全てのクエリの確認

実行環境：CentOS6.6, MySQL 5.7.11

MySQLで、クエリログを確認したい時に、下記の方法があります。
1. 実行しているクエリ：

```sql 
mysql> show full processlist\G;
*************************** 6. row ***************************
     Id: <接続識別子、これは、INFORMATION_SCHEMA.PROCESSLIST テーブルの ID カラムの値>
   User: <発行したMySQLユーザー>
   Host: <発行しているクライエントのホスト名>
     db: <データベース名>
Command: <コメンド種類：Query, Connect, Sleep等>。クエリの場合、Queryになる
   Time: <現在の状態どれだけ続いている（数秒）>
  State: <コメンドの状態:Sending data等>
   Info: <クエリ文>
```

注意： FULL キーワードを使用しない場合、Info フィールドは100 文字のみまで表示されます。
参考：https://dev.mysql.com/doc/refman/5.6/ja/show-processlist.html

2.実行したクエリ
2.1　スレッド情報から、クエリの情報を取得

```sql
mysql> select * from INFORMATION_SCHEMA.PROCESSLIST order by id desc limit 10\G;
*************************** 1. row ***************************
     ID: 
   USER: 
   HOST: 
     DB: 
COMMAND: 
   TIME: 
  STATE: 
   INFO: 
``` 

このクエリを実行したら、クエリ文（INFOコラム）と実行時間（TIME、数秒）情報が分かります。
参考：https://dev.mysql.com/doc/refman/5.6/ja/processlist-table.html

2.2 ログファイルから見えます。

```
~]# vim /etc/my.cnf
general_log=ON #クエリログが有効
general_log_file=/home/mysql_query_log/query.log #ログファイルのパース
~]# /etc/init.d/mysqld restart
```

MySQL設定ファイルの中で、general_onとgeneral_log_fileを設定して、MySQLを再起動すれば実行されているクエリがログに記録されます。
ログを確認する際、

```
~]# tail -f /home/mysql_query_log/query.log
2016-08-14T17:09:01.663883Z  982 Query 	SELECT MAX(last_run) AS last_run FROM advertise_domain
```

を実行すれば、全てのクエリが見えます。実行日時、クエリ文は確認できます。
また、検索語があれば、確認も絞り込みます。

```
~]# tail -f /home/mysql_query_log/query.log | grep "<検索語>"
```

3. 遅いクエリの確認

```
~]# vim /etc/my.cnf
slow_query_log=1 #0:無効、1:有効
slow_query_log_file=/home/mysql/mysqld-slow.log #ログファイルのパース
long_query_time=5 #５秒以上かかったクエリは遅いクエリになり、ディフォルトは10秒
~]# /etc/init.d/mysqld restart
```

このログは、実行日時、実行時間、クエリ文の確認ができます。

参考：
- https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_slow_query_log
- https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_slow_query_log_file
- https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_long_query_time

以上です。よろしくお願いします。
RedSleeve6をQEMUにインストールし開発環境にする（その4）


続き
http://qiita.com/hkato/items/7e8876f5bf20fd38c00a


# slコマンドのRPM化

slでRPM化の練習をしてみる＾＾；

## rpmbuild環境の作成

```shell-session
# yum install rpmdevtools createrepo yum-utils
```

ホームディレクトリにrpm開発ツリーを作る

```shell-session
$ rpmdev-setuptree
```

## ソース取得と依存ライブラリのヘッダーをインストール

slのtarボールを取得しSOURCESに

```shell-session
$ cd ~/rpmbuild/SOURCES/
$ wget https://github.com/mtoyoda/sl/archive/5.02.tar.gz
```

依存ライブラリのヘッダーをインストール

```shell-session
# yum install ncurses-devel
```

## SPECファイルの作成

```shell-session
$ cd ~/rpmbuild/SPECS/
$ vi sl.spec
```

作成したspecファイルはこちら、
https://gist.github.com/hkato/27f75957da21c5b9ffdfef22c9bee1fe

## ビルド
~/rpmbuild/SPECS/で実行すること

```shell-session
$ rpmbuild -ba sl.spec
```

## とりあえずローカル開発環境/QEMUに直インストール

```shell-session
$ cd ~/rpmbuild/RPMS/armv5tel/
# rpm -ivh sl-5.02-1.armv5tel.rpm 
```

## ターゲット環境にインストール

~~TODO: 帰省中なので手元にターゲット環境がないので未確認、帰ったらやる~~

コピってインストールする

```shell-session
[user@qemu ~/rpmbuild/RPMS/armv5tel]$ scp sl-5.02-1.armv5tel.rpm root@target:/tmp/
[user@qemu ~/rpmbuild/RPMS/armv5tel]$ ssh root@target
[root@target ~]# rpm -ivh /tmp/sl-5.02-1.armv5tel.rpm
```

# まとめ
こんな感じでQEMUでIO DATA RockDiskNext（やRaspberryPi/RSEL)のarmv5tel.rpmなパッケージをビルドできる。
大抵のものはspec/srpmファイルが用意されてるし、無いものはCheckinstall
http://qiita.com/tags/Checkinstall
でいけるはず。
CustomStringConvertibleについて

インスタンスプロパティをprint関数でデバッグエリアに表示させたかったので調べてみた。
クラスを以下のプロトコルに適合することによって実装できるみたい。
(表示できない理由はクラスの特性であるカプセル化の働きで、外部からインスタンスプロパティがどんな値を持っているか隠蔽しているため。だという認識だけどあってるかな。。。)

###CustomStringConvertible
`UIKit`に定義されている`Protocol`で、`description`というプロパティが定義されている。

```swift:
public protocol CustomStringConvertible {
    /// A textual representation of `self`.
    public var description: String { get }
}
```
###使ってみた
```swift:
import UIKit
//クラスを適合させる
class Example: CustomStringConvertible{
    
    let name: String
    //descriptionに表示したい文字列を定義する
    var description: String { return "nameの値は\(name)です" }
    //初期化
    init(name: String) {
        self.name = name
    }
    
}
//インスタンス化
var example = Example(name: "AAA")

print(example)


//結果 descriptionで定義された文字列が表示されるみたい
//nameの値はAAAです

```

###ちなみに実装前
```swift:
import UIKit

class Example {
    
    let name: String
    
    init(name: String) {
        self.name = name
    }
    
}

var example = Example(name: "AAA")

print(example)

//結果 クラス名が表示された
//Example

```


// A textual representation of self......
selfを文字通り表現する....
そういうこと？
実装前のprint結果でクラス名が表示されてるから、それをdescriptionで定義した文字列に置き換えますよってことか！！
なんかスッキリ。

普通に読み飛ばしてたつらい。
難なく英語読めるようになりたい。

###まとめ
`description`で定義した文字列が表示されるみたい。
文字列の中に確認したいプロパティを組み込めばOK。
今回の件で曖昧な理解だったカプセル化についての理解も深まった（若干）。
AWS WAFでHost Header +IP Addressでアクセス制限してコミュ症ウェッブアプリケーションを作ろう

俺です。

このクソ記事はこちらに置き換えらるので削除しました。さようならー
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html

死
気になったので、CSS4についてちょこっと調べてみた

ついこの間までHTML5/CSS3とか言ってたのに、最近周りでは"CSS4"とやらの話がちらほら。
気になったので少しだけ調べてみた。

# CSS4？なにそれおいしいの？
結構おいしそう。
届きそうで届かなかった、ちょっと痒い所をかけるようになった感じです。
ただ、CSSが「要素ごとにセレクタを定義してずらーっと書いていく」という自分のような初心者イメージだけでは少しややこしいかも。

## 「ここが美味しい」例１）:matches()
これまで、「CSSを書く」といったら、各種要素を片っ端から列挙していく単純作業感がありました。
が、CSS4で新規に追加された:matches()を利用すれば、恐ろしくスッキリ記述できるようです。

```main.css（これまでのCSS）
div#wrapper .content title h1,
div#wrapper .content title h2,
div#wrapper .content title h3 {
    color: #FF0000;
    margin-left: 15px;
}
```

```main.css（CSS4での記述）
div#wrapper .content title:matches(h1, h2, h3) {
    color: #FF0000;
    margin-left: 15px;
}
```

見るからにすっきりしましたね。

## 「ここが美味しい」例２）"?"セレクタ
「この要素の下に、〇〇がある場合にだけ、表示を変えたい」
という、頭がこんがらがりそうな要求も、CSSで簡単に書けるようになりました。

```index.css（例：子要素として"required"が含まれる場合のみ、表示を変えたい。）
div#wrapper .content .body ul ?li required {
    color: #FF0000;
}
```
この程度の内容であれば、別で定義したほうが後々便利じゃないかという声もありそうですが、読みやすい・使いやすいように適宜選択が必要ですね。

## 注意点
とはいえ、CSS4はまだまだブラウザ側の対応もまちまちなようで、対応状況・制限事項などを確認の上で利用する必要がありそうです。
riot.jsで、テンプレートにタグを含む文字が出力したい

# riot.jsでは、{}の中身は常にエスケープされる。

非常に安心な仕様でありがたいのだが、```<br>```なんかも使えないため、ちょっと微妙。

公式を見て、納得したような、していないような気分になったので、書いておく。
## パブリックな回避方法
```HTML:raw.tag
<raw>
  <span></span>
  this.root.innerHTML = opts.content
</raw>
```

```HTML:使う側
<raw content={memo}></raw>
```

まぁ、これぐらい縛られるほうが、ポカせずに済みそうですね。
まじめにやりたければ、raw.tagのほうでもう少し修正するとかできるでしょうし。
Lyx で張り込んだ eps のレイアウトが崩れたときの修正法

自分用メモ。

TeX で eps のレイアウトが崩れる時の修正法として、 documentclass に dvipdfmx を追加する方法が知られている。

```tex
documentclass[dvipdfmx]
```

Lyx でこれにあたる事をするにはどうすれば良いかというと、 lyx ファイルをテキストエディタか何かで開いて \endpreamble の直下に \options dvipdfmx を追加すれば良い。

```
#LyX 2.1 created this file. For more info see http://www.lyx.org/
\lyxformat 474
\begin_document
\begin_header
\textclass extbook
\begin_preamble
\usepackage{amsmath}
\end_preamble
\options dvipdfmx
```

この状態で「ファイル」「書き出し」「pLateX」を実行すると documentclass に dvipdfmx が追加された。
Unityからchatworkにメッセージを送る

Unityからchatworkにメッセージを送る。(Unity 5.4.0)
適当なオブジェクトにつけてインスペクタから`roomid`に部屋のID、`token`にAPIトークンを入れる。

```csharp
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class PostMessage : MonoBehaviour
{
    public string roomid;
    public string token;

    IEnumerator Post(string message)
    {
        string url = string.Format("https://api.chatwork.com/v1/rooms/{0}/messages", roomid);
        WWWForm form = new WWWForm();
        form.AddField("body", message);
        using (UnityWebRequest req = UnityWebRequest.Post(url, form))
        {
            req.SetRequestHeader("X-ChatWorkToken", token);

            yield return req.Send();

            if (req.isError)
            {
                Debug.Log(req.error);
            }
            else
            {
                Debug.Log(req.responseCode);
                Debug.Log(req.downloadHandler.text);
                _message = "";
            }
        }
    }

    string _message = "";

    void OnGUI()
    {
        _message = GUILayout.TextField(_message, GUILayout.Width(200));

        if (GUILayout.Button("Send"))
        {
            StartCoroutine(Post(_message));
        }
    }
}
```

## 参考

http://developer.chatwork.com/ja/
Rasberry PiをWiFiに接続する


# 説明
久々にラズパイをいじった際にWiFiを再設定したので備忘として記載。


# 検証環境
- ラスパイ本体: Rasberry Pi Model 2
- 無線子機: BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
- ルータ親機: Baffalo WSR-1166DHP2

# 実装
ネットワークの設定変更

```
$ sudo vi /etc/network/interfaces

-以下設定ファイル-

iface wlan0 inet dhcp
#iface wlan0 inet manual　←コメントアウト
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp

```

次に無線接続の設定ファイルを編集

```
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

-以下設定ファイル-

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
  ssid="ここにSSID名を入力"
  proto=WPA2
  key_mgmt=WPA-PSK
  psk="ここにPWを入力"
}

```

以上で設定変更は終了。
最後にインターフェイスをリセットして終了。
**注意点**
ラズパイは5GHz帯のネットワークに対応していない模様。
2.4GHz帯のSSIDを使用する必要あるみたい。


```
$ sudo ifdown wlan0
$ sudo ifup wlan0
```
設定内容に不備がなければ、以上で完了。
Meatierを動かしてみた

#Meatierを動かしてみました
Meatierをインストールして軽く動かしてみるまで
自分用のメモですが、比較的丁寧に書いています。

##Meatierのインストール
ほぼ、公式のREADME通りです。

###環境
```bash
$ node -v
v6.3.1

$ npm -v
3.10.7
```
###webpack2.Xのインストール

2016/08/14現在webpack2.XはBETA版なのでバージョンを指定してインストールします

#####まずはwebpackのバージョンを確認

[公式のchangelog](https://webpack.github.io/docs/changelog.html)

```bash
$ npm view webpack dist-tags
{ latest: '1.13.1', beta: '2.1.0-beta.20' }
```

#####最新バージョンの2.1.0-beta.20をインストール

```bash
$ npm install -g webpack@2.1.0-beta.20
$ npm list -depth=0 -g
/.nodebrew/node/v6.3.1/lib
├── npm@3.10.7
└── webpack@2.1.0-beta.20
```

###Rethinkdbのインストール


#####HomebrewでRethinkdbをインストール

```bash
$ brew install rethinkdb
```

#####Rethinkdbを起動

```bash
$ rethinkdb
```

###Meatierをインストール

```bash
$ git clone git@github.com:mattkrick/meatier.git
$ cd meatier
$ npm install
```

###サーバーを起動

```bash
$ npm run quickstart
```

ブラウザで　[http://localhost:3000](http://localhost:3000)　にアクセス
PhoenixFramework + Slimでインデックス付きのループをする方法


## 状況

Listの*番目で違うclassをあてたい。というケースでListのindexをどうやって取るのか？というのを考えたのでメモ。

## 環境

Elixir 1.3.1
PhoenixFramework 1.2.0
slime 0.14.0

## 解決方法

該当のListのカウントを保持し、それを最大値としたRangeを作成して、Rangeをループさせる

```
- comments_count = Enum.count(@comments)
= for i <- 0..(comments_count - 1) do
  = if i < 3 do
    do something...
  - else
    do something...
```
 

## まとめ

やりたいことは実現できているもののどうもすっきりしないので、引き続き良い方法は模索していきたい。case文使いたい！などちょっとテンプレート周りではモヤモヤが多いので、調べてわかったらQiita上にアップしていく。
Timers を使って Ruby で遅延実行・定期実行するスクリプトを作る

[Timers](https://github.com/celluloid/timers) 

プログラムを遅延実行させたり、定期実行させるのに便利な Gem です。

# 遅延実行

遅延実行させたい場合 `#after` を使います。以下のように、引数に `interval` (seconds) と実行したい内容をブロックで渡します。

```rb
timers = Timers::Group.new

puts Time.now.strftime("%M:%S") #=> 23:42

timers.after(5) { puts Time.now.strftime("%M:%S") }
timers.wait #=> 23:47
```

`#wait` はスケジュールされたタイミングまで待って、実行するメソッドです。`after` に渡した「5 秒」待って、ブロックが実行されているのがわかります。
また、`#now_and_after` メソッドも用意されていて、名前の通り、スケジュールしたタイミングと interval 後に実行されます。

```rb
timers = Timers::Group.new

puts Time.now.strftime("%M:%S") #=> 28:40

timers.now_and_after(5) { puts Time.now.strftime("%M:%S") } #=> 28:40
timers.wait #=> 28:45
```

# 定期実行

次に、定期実行させたい場合です。
定期実行させる場合は、`#every` を使います。

```rb
timers = Timers::Group.new

timers.every(2) { puts Time.now.strftime("%M:%S") }
5.times { timers.wait }
#=> 37:21
# 37:23
# 37:25
# 37:27
# 37:29
```

同じように `#now_and_every` が用意されています。

# 使用例

これだけだと、`sleep(interval)` 使えばいいじゃん。。。という感じですが、複数だったり、複雑なスケジューリングする場合に便利です。

例えば、（ありえないですが、、、）

「あなたは、ユーザーアクティビティをモニタリングをしていて、 2 秒ごとにアクティビティのデータを Slack にポストして、5 秒ごとにまとめをメールする必要があります。
しかも、Slack とメールに送信したメッセージは、ログとしてサーバーにダウンロードしておく必要があるのですが、メッセージ送信後 1 秒はインターバルを置かないとうまく取得できないことがわかっています」

と言った場合、以下のように書けます。

```rb
timers = Timers::Group.new

timers.every(2) { 
  puts "#{Time.now.strftime('%M:%S')} : post to slack"

  timers.after(1) { puts "#{Time.now.strftime('%M:%S')} : download slack" }
}

timers.every(5) { 
  puts "#{Time.now.strftime('%M:%S')} : send to mail" 

  timers.after(1) { puts "#{Time.now.strftime('%M:%S')} : download mail" }
}

loop { timers.wait }  
# =>
# 32:00 : post to slack
# 32:01 : download slack
# 32:02 : post to slack
# 32:03 : download slack
# 32:03 : send to mail
# 32:04 : post to slack
# 32:04 : download mail
# 32:05 : download slack
# 32:06 : post to slack
# 32:07 : download slack
# 32:08 : post to slack
# 32:08 : send to mail
# 32:09 : download slack
# 32:09 : download mail
# ...
```

みたいな。
いろいろ組み合わせたいときは便利！
"You don't need nerdtree" - again

Hello World, you can find a on google the same title, it is ok
the articles talks about [ctrl-p](https://github.com/ctrlpvim/ctrlp.vim), it is great!  

but ctrlp  has a problem, when you want explorer or CRUD a directory/file in specific path, ctrlp is not practical.

[Dirvis](https://github.com/justinmk/vim-dirvish)  is our complement because you can do all this things and is it like edit a file because you can use 10j or /workspace

![this.png](https://qiita-image-store.s3.amazonaws.com/0/91692/cdb4e37c-d3b4-aa8e-6351-40b6844f6376.png)


In normal mode press - and open your  current directory, well, on github you can find all the information, just try it.


also I like [ranger](https://github.com/francoiscabrol/ranger.vim) but with it you can't use commands of vim like :tabnew
npmにあるパッケージのコードをghqで管理する

ghq便利ですよね。
ghqを使うことで効率的にソースコードを管理できます。
詳しい運用は以下の記事が詳しく書かれています。

[ghqを使ったローカルリポジトリの統一的・効率的な管理について - Kentaro Kuribayashi's blog](http://blog.kentarok.org/entry/2014/06/03/135300)

さて、`node`やフロントエンドの世界にいると、npmのパッケージ名から直接レポジトリのコードをダウンロードできれば便利そうです。
`npm-src`を使うとnpmのパッケージ名から直接ghqでレポジトリを取得できます。

![screenshot.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/edb207ed-8272-3a3d-1244-7270ace7a62b.gif)


[akameco/npm-src: GHQ for npm](https://github.com/akameco/npm-src)

## インストール

もちろん`ghq`がインストールされている必要があります。

```
$ npm install --global npm-src
```

## 使い方

ghqが正しく設定できていれば、`npm-src`コマンドを叩くだけです。

```
$ npm-src --help

  ghq for npm

  Usage
    $ npm-src <package name> [string, array]

  Examples
    $ npm-src ava xo
```

## 最後に
ghqを使うと効率的にソースコードが管理できて非常にいいですね。

自分は以下のようなワークフローで活用しています。
ここでは、仮に`redux`を対象とします。

### `npm-src`でレポジトリのダウンロード

```
$ npm-src redux
```

![test3.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/db54045d-a5ac-2c3d-88dd-59e8b77e8623.gif)

[akameco/npm-src: GHQ for npm](https://github.com/akameco/npm-src)

### `ghq` + `peco`で移動

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/6c3a8a7d-86c5-0afd-9411-8b95c2e1ad35.gif)


自分は、`.zshrc`に以下のように設定しています。(ほぼgithubしか見ないのでusername/repoだけ表示されるように雑にcutしています)

```
ghq-list() {
        local repo=$(ghq list -p | cut -d "/" -f 6- | peco)
        cd "$HOME/src/github.com/$repo"
        zle && zle clear-screen
}
zle -N ghq-list
bindkey "^k" ghq-list
alias k=ghq-list
```

[motemen/ghq: Remote repository management made easy](https://github.com/motemen/ghq)
[peco/peco: Simplistic interactive filtering tool](https://github.com/peco/peco)

### `gh-home`で対象のgithubのレポジトリを開く

`gh-home`は対象のレポジトリをブラウザで開くツールです。


![test2.gif](https://qiita-image-store.s3.amazonaws.com/0/15319/b6c985fc-1f67-8eb3-b124-55ba227d098f.gif)


[sindresorhus/gh-home: Open the GitHub page of the repo in the current directory](https://github.com/sindresorhus/gh-home)

### `npm-hub`で依存するパッケージのgithubを直接確認
`npm-hub`というchromeエクステンションを使うとgithubの`readme`の下に依存しているパッケージのリストとそのレポジトリへのリンクが表示されるようになります。

ここで気になったパッケージを`npm-src`で持ってきてローカルで見たりします。

<img width="1023" alt="スクリーンショット 2016-08-14 22.49.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/15319/dcb178fa-7c89-106c-1136-a4387a611957.png">

[npmhub.org](http://npmhub.org/)


## 参考

[akameco/npm-src: GHQ for npm](https://github.com/akameco/npm-src)
[motemen/ghq: Remote repository management made easy](https://github.com/motemen/ghq)
[peco/peco: Simplistic interactive filtering tool](https://github.com/peco/peco)
[sindresorhus/gh-home: Open the GitHub page of the repo in the current directory](https://github.com/sindresorhus/gh-home)
DebianなサーバーにbyobuからSSHで繋いだ時の表示がしょぼかった

CentOSだといい感じでホスト名とかでてるんだよね。
/etc/bashrc を見ると

```
if [ "$PS1" ]; then
  if [ -z "$PROMPT_COMMAND" ]; then
    case $TERM in
(snip)
    screen*)
      if [ -e /etc/sysconfig/bash-prompt-screen ]; then
          PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen
      else
          PROMPT_COMMAND='printf "\033k%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
      fi
      ;;
(snip)
```

なので、これだね。/etc/sysconfig/bash-prompt-screenは何なのかしら？...yum providesで何か提供してるのかを探したけど入ってなかった。

## ディレクトリが~表記かどうか

```
0:henrich@centos:~-
1:henrich@debian:/home/henrich* 
```

あれ？なんでだろうターミナルでは「henrich@debian:~$ 」のように~になってるんだけど。

あ、[ディレクトリ表記が変わりまくるのが嫌な人もいる](http://piyolian.blogspot.jp/2015/08/rhel7-screen-window-title-is-annoying.html)のね。


## SSH切っても表記治らず。
現状のディレクトリ名とかになってほしいよね。

## 前回の失敗ログインが表記されてる

```
$ ssh 192.168.10.x
henrich@192.168.10.x's password: 
Permission denied, please try again.
henrich@192.168.10.x's password: 
Last failed login: Sun Aug 14 23:25:52 JST 2016 from 192.168.10.x on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sun Aug 14 23:25:39 2016 from 192.168.10.x
[henrich@centos ~]$ 
```

これもあったほうがいい気がする。
Raspberry Pi 3 でマウスを使いたい。でもBluetoothマウスしか無くて初回ペアリングできない。

![スクリーンショット 2016-08-14 22.43.17.png](https://qiita-image-store.s3.amazonaws.com/0/99604/d4025bcd-31d4-05ba-0675-d8b43e808805.png)
右上のBTアイコンが押したいのにマウスポインタが微動だにしない・・・ッ！

# そんな時は

CUIからBluetoothマウスをペアリングしましょう。

* Raspberry Pi 3 Model B
* Raspbian 4.4.16-v7+

# なお

やり方は下記に全部書いてあります。
http://www.cnet.com/how-to/how-to-setup-bluetooth-on-a-raspberry-pi-3/

# まずターミナルを

開きます。`Windows`キーや`Ctrl+Esc`などでメニューを開き、`Accessories` > `LXTerminal`を選択。

# `bluetoothctl`を実行

```sh:Shell
$ sudo bluetoothctl
```

パスワードを聞かれることがあります。変更していなければ、初期設定のスーパーユーザは下記のとおり。

* User ID: pi
* Password: raspberry

# スキャン開始

```bash
[bluetooth]# agent on
Agent registered
[bluetooth]# scan on
Discovery started
```

と2つのコマンドを実行してあげると、Bluetoothデバイスをスキャンし始めます。
マウスをつけてしばらく待てば、以下のように目当てのデバイスが見つかるはず。

```bash
[NEW] Device 00:1F:20:E0:73:90 Bluetooth Mouse M557
```

# ペアリング

```bash
[bluetooth]# pair 00:1F:20:E0:73:90
Attempting to pair with 00:1F:20:E0:73:90
```

`pair`コマンドと、出てきたデバイスのMACアドレスを入力してあげると

```bash
[CHG] Device 00:1F:20:E0:73:90 Connected: yes
...
[CHG] Device 00:1F:20:E0:73:90 Paired: yes
Pairing successful
```

となってBluetoothのペアリングが完了する。

![スクリーンショット 2016-08-14 23.01.46.png](https://qiita-image-store.s3.amazonaws.com/0/99604/0ab0dec6-0973-6d68-5549-154fd522d1ed.png)

上記のような、ペアリングしてもいいかどうかの確認ダイアログが出たら、🆗を選択。

# まとめ

Bluetoothマウスとかキーボードってちょいちょい不便よね。
Meteor or Meatier?

#MEANスタック? Meteor? Meatier?

クライアント-サーバー間のリアルタイム通信を実装しようとした時にどのようなツール群、開発環境を使うべきか色々迷った挙句 Meatier に行き着いたという話です

Githubリポジトリ：[Meatier](https://github.com/mattkrick/meatier)

##Why Meatier ?
Meatierを使うに至るまでの過程です。

###リアルタイム通信を実装するためのツールを検討
最も人気なのはsocket.ioですが今回はsocketclusterを使うことに

公式ページ：[socketcluster](http://socketcluster.io/#!/)

比較記事
https://nodejs.libhunt.com/categories/505-real-time
http://stackshare.io/stackups/simperium-vs-socket-io-vs-socketcluster

###node.jsを使ったアプリケーション開発
はじめに検討したのはMEANスタック, Meteorでした
公式ページ：
[Meatier](https://www.meteor.com/)
[mean.io](http://mean.io/#!/)
[mean.js](http://meanjs.org/)

こちらは、MeteorとMEANスタックの比較記事です。
多少Meteorよりの記事ですが参考になりました。
[MeteorとMEANの比較](http://meteor-fan.axlight.com/comparing-meteor-and-mean/)　　by Meteor Fan (日本語情報)さん

Meteorを使ってみた結果、便利なんですがツール群が一昔前のものを使っていて、かつカスタマイズ性がとても低い。
で、mean.ioは開発を始めるまでの下準備が面倒くさい。
他にいいのはないのかと探していたところMeatierを発見しました。

公式のドキュメントにMeteorとの比較が書かれていますが、比較的新しいツールを利用してるのでGood
また、
リアルタイム通信にsocketclusterを利用している
データベースがRethinkDB
フロントエンドがReact Redux
GraphQL

この辺りを見てMeatierを採用することを決めました。


次　[Meatierをインストール](http://qiita.com/shiichi/items/afcc8f1ae5210c4b3668)
RedSleeve6をQEMUにインストールし開発環境にする（その3）


続き
http://qiita.com/hkato/items/43e6b312dd5082c9a8c6

# 開発環境をインストールする

``` shell-session
# yum groupinstall "Development Tools"
グループ処理の設定をしています
base                                                     | 3.8 kB     00:00     
rsel6                                                    | 3.8 kB     00:00     
updates                                                  | 3.0 kB     00:00     
base/group_gz                                            |  580 B     00:00     
rsel6/group_gz                                           |  301 B     00:00     
警告: グループ Development Tools が存在しません。
インストールまたは更新に利用できるいくつかの要求されたグループにパッケージがありません
```

とほほ。RSELのリポジトリにはgroup設定がなされてない様子。

gccとmakeを入れてから失敗した時に個々にインストールしていくのも良いのだけど、"Development Tools"で入るものは下記の様なので、

http://www.cyberciti.biz/faq/centos-linux-install-gcc-c-c-compiler/

次の様にインストールする

```shell-session
# yum install \
flex \
gcc \
redhat-rpm-config \
strace \
rpm-build \
make \
pkgconfig \
gettext \
automake \
strace \
gdb \
bison \
libtool \
autoconf \
gcc-c++ \
binutils
```

# テスト

```shell-session
$ vim hello.c
```

```c
#include <stdio.h>

int main(void)
{
    printf("Hello ARM world!\n");
    return 0;
}
```

```shell-session
$ gcc -o hello hello.c
$ ./hello 
Hello ARM world!
$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
```

とりあえずgccは動いた。

# SCMをインストールする

忘れてた、ソースを引っ張ってこれないとね

```shell-session
# yum install git subversion
```

これで開発環境はできたかな？

続く
http://qiita.com/hkato/items/f04e2de3b140be52c98c
Git 周りの個人的ブックマーク等整理


## 本家

- [Git](https://git-scm.com/)
 - [Git - Book](https://git-scm.com/book/ja/v2)(Pro Git 第2版)

## ホスティング

- [GitHub](https://github.com/) (メジャーすぎてここに書くまでもない?)
- [Bitbucket — The Git solution for professional teams](https://bitbucket.org/)

## 自前サーバー向け

- [Code, test, and deploy together with GitLab open source git repo management software | GitLab](https://about.gitlab.com/)(ホスティングサービスもやってる)
- [GitBucket](https://github.com/gitbucket/gitbucket)
 - [たけぞう瀕死ブログ](http://takezoe.hatenablog.com/)(作者のブログ)
- [sitaramc/gitolite: Hosting git repositories -- Gitolite allows you to setup git hosting on a central server, with very fine-grained access control and many (many!) more powerful features.](https://github.com/sitaramc/gitolite)
 - [gitoliteを用いてDebianとWindowsでGitのクライアントサーバーを作成する - Qiita](http://qiita.com/mima_ita/items/8ebe45c6c2b5b967372c)

## Tips 等

- [Gitチートシート - Qiita](http://qiita.com/ktarow/items/1d8c8ae698a88b1d6f0f)
- [Pull Requestの仕方 - Qiita](http://qiita.com/Commander-Aipa/items/d61d21988a36a4d0e58b)
- [GitHubでの”Merge pull request”の弊害 | 開発手法・プロジェクト管理 | POSTD](http://postd.cc/merge-pull-request-considered-harmful/)
- [Gitチュートリアル　変更を戻す revert,reset 編](https://gist.github.com/satoshin2071/4b9a66e0a7ec18a6fa21)
- [rebase -i でコミットをまとめる - Qiita](http://qiita.com/takke/items/3400b55becfd72769214)
- [サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/)

### ブランチ・タグ

- [Gitでのブランチ管理はどうすればいいのか？ – エクスト スタッフブログ](http://blog.ext.ne.jp/?p=2229)
- [リモートのgitブランチをローカルにチェックアウトする - sessanの日記](http://sessan.hatenablog.com/entry/2012/11/04/132746)
- [【Git】TIPS: リモートブランチをチェックアウトする方法 ｜ Developers.IO](http://dev.classmethod.jp/tool/git/tips-git-checkout-remote-branch/)
- [gitでタグをもとにブランチを切る - There's an echo in my head](http://ikm.hatenablog.jp/entry/2012/12/18/130940)
- [gitのローカルbranchを作成し、リモートにpushする - sessanの日記](http://sessan.hatenablog.com/entry/2012/06/20/205036)
- [Git で不要になったリモートブランチを削除する - koogawa log](http://blog.koogawa.com/entry/2014/03/08/121751)
- [Gitで使われていないリモートブランチの整理 - Qiita](http://qiita.com/makoto_kw/items/c825e17e2a577bb83e19)
- [gitのtagをリモートにpushする || milligramme-github-io](https://milligramme.github.io/2011/12/14/git_git-tag-push.html)
RedSleeve6をQEMUにインストールし開発環境にする（その2）


続き
http://qiita.com/hkato/items/90f71ea78fd6916bfd45


# SSHを使う

まずはsshログインできないと不便だよね

## sshのPort forward

-netオプションを追加して起動

```shell-session
$ qemu-system-arm -M versatilepb \
-kernel vmlinuz-2.6.32-5-versatile \
-initrd initrd.img-2.6.32-5-versatile \
-hda redsleeve_armel_rootfs.qcow2 \
-nographic \
-append "root=/dev/sda1 console=ttyAMA0" \
-net user,hostfwd=tcp::50022-:22 \
-net nic
```

## リポジトリの更新

yum/rpmのリポジトリパスが変わってる様なので-releaseファイルをアップデートする。

```shell-session
# rpm -Uvh http://ftp.redsleeve.org/pub/el6/6.7/base/RPMS/redsleeve-release-6-20160310.el6.armv5tel.rpm
# rpm -Uvh http://ftp.redsleeve.org/pub/el6/6.7/base/RPMS/epel-release-6-20140302.noarch.rpm
```

## sshdのインストール

```shell-session
# yum install openssh-server
# chkconfig sshd on
# service sshd start
```

## ログイン

これでホスト側からログインできる様になる

```shell-session
$ ssh root@localhost -p 50022
```

# パッケージアップデート

```shell-session
# yum update
```
これでRSEL6.7になってるはず。

# 時刻関連

## タイムゾーン設定

ここら辺はCentOS/RHEL等と同じ

```shell-session
# cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

```shell-session
# vim /etc/sysconfig/clock
```

```
ZONE="Asia/Tokyo"
UTC="false"
```

```shell-session
# cp -p /etc/ntp.conf /etc/ntp.conf.orig
# vim /etc/ntp.conf
```

```diff
--- /etc/ntp.conf.orig	2016-01-21 00:14:26.000000000 +0900
+++ /etc/ntp.conf	2016-08-14 22:28:25.000000000 +0900
@@ -19,10 +19,9 @@
 
 # Use public servers from the pool.ntp.org project.
 # Please consider joining the pool (http://www.pool.ntp.org/join.html).
-server 0.rhel.pool.ntp.org iburst
-server 1.rhel.pool.ntp.org iburst
-server 2.rhel.pool.ntp.org iburst
-server 3.rhel.pool.ntp.org iburst
+server ntp1.jst.mfeed.ad.jp iburst
+server ntp2.jst.mfeed.ad.jp iburst
+server ntp3.jst.mfeed.ad.jp iburst
 
 #broadcast 192.168.1.255 autokey	# broadcast server
 #broadcastclient			# broadcast client
```

```shell-session
# service ntpd restart
```

# ログ

なんかログが一切吐かれてない様なので見てみるとrsyslogが入ってない

```shell-session
# yum install rsyslog
```

これでベースとなるLinux環境は大体できた？

続く
http://qiita.com/hkato/items/7e8876f5bf20fd38c00a
PHPをNetbeansで開発するときのセットアップ手順

# イントロ
PHPでの開発は、PHPStormが最強らしいですが、僕の開発ポリシーは全部OSSでやることなので、Netbeans推しです。
Netbeansは統合開発環境だけあって、コードのチェックなどもデフォルトで入っているので、おすすめです＾＾

# Javaのインストール
[jdk download](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)

先にJavaが必要となるので、ダウンロードしてインストールしておきます。32bitなどに注意しつつ自分の環境にあったものを入れます。

# ダウンロード
[ナイトリービルド](http://bits.netbeans.org/download/trunk/nightly/latest/)
[ロードマップ](https://netbeans.org/community/releases/roadmap.html)
PHP7に対応しているのが、2016/09月リリースの8.2なので、
今回はナイトリービルドから落としてきます。
（3か月ほど前から使っていますが、アップデートさえしなければ、ナイトリービルドは問題なかったです。）

公式に8.2が出たら、そちらを推奨ですが、ナイトリービルドも安定しているので、ナイトリービルドを普段使いしてもいいかもしません。

`※2016-10-04に、NetBeans8.2出ました♪`

# コンフィグの変更
とりあえず、フォントにエイリアスかけたいのと、デフォルトでUTF-8で開く設定にしたいので、コンフィグを変更します。変更する前に、バックアップを取っておいてください。

```bash
# C:\Program Files\NetBeans Dev 201608120002\etc\netbeans.conf

# この行の後ろに追記する。スペース区切りと
# ダブルクォーテーションがあるので、注意！！
netbeans_default_options="-J-client ...

# 追記するオプション
-J-Dawt.useSystemAAFontSettings=on -J-Dfile.encoding=UTF-8

```

# フォント変更

ツール - オプション - フォントと色

お好みのフォントで。僕のおすすめは、[miryca（源真ゴシック）](http://myrica.estable.jp/)です。

# PSRフォーマット設定

[netbeans-psr-formatting](https://github.com/bobsta63/netbeans-psr-formatting)
デフォルトのフォーマット設定がPSR準拠していないので、設定変更します。コンフィグファイルをGitで公開している方がいらっしゃるので、ありがたく使わせていただきますm(_ _)m

適用手順はGitのページに書いてあるのでそちらを参照のこと。

# エディタのカラーテーマ変更（お好みで）
[netbeans-themas](http://netbeansthemes.com/rank/)

注）先に、現在の設定をエクスポートしておくことを推奨します。
↑ダウンロードして適用します。ただし、8.2に対応していないのか？そのままでは、適用できなかったので、無理やり適用したい場合は、こうします。

* 8.2の設定をエクスポート
* エクスポートしたzipファイルを解凍
* テーマのzipファイルをダウンロード＆解凍
* 解凍したテーマのファイルを、エクスポートしたものに上書き
* 上書きした8.2の設定をzipにする
* netbeansにインポート

ナイトリービルドは大変ですね。。。来月以降は、対応してくれて、こんな苦労もなくなるのでしょうか？

# git cloneしたプロジェクトを読み込む（コードジャンプできます）
左側のプロジェクトビューで、「右クリック - プロジェクトを開く」で、cloneしたプロジェクトを指定すれば開けます。これを行うと「Ctrl + 左クリック」で関数ジャンプできるようになります。これをやらないとジャンプできないので必ずやったほうが良いと思います。

# お気に入りビューが最高

```
ウィンドウ - お気に入り
```
で、表示できます。僕は開発時に開発用フォルダを作って、そちらにcloneするようにしているのですが、お気に入りビューで、開発用フォルダを指定しておくと、clone後すぐに見えてよいです。

また、Git操作は、commitとpushはnetbeansで行って、その他のcloneやcheckoutやrebaseなどは、コマンドで行っています。特にpush時はGUIでターゲットが狙えるので間違って、masterにpushすることが無いです。（masterに直pushは、pre-pushとかで防ぐのが良いですが。。。）

ブランチ開発で、rebaseからのforce-pushを連発する人は、先にバックアップとして別フォルダにcloneしておいて、間違えたらバックアップをforce-pushすればよいです。お気に入りビューのおかげでそれがやりやすいです。IntelliJ IDEA系は、一つしかプロジェクトが開けなくて、使ってないんですよね。。。IntelliJ IDEA系は、Git操作がNetbeansよりも使いやすいですが、細かい操作をコマンドでやる人は、Netbeansぐらいで十分かと。

# あとがき
最初はEclipse派だったのですが、EclipseのGitが恐ろしいくらいに使いづらく、Netbeansに転向しました。基本的にEclipseで出来ることはできますし、Node.jsの開発もできます。個人的には、お気に入りビューが最高だと思っています。ぜひ試してみてください＾＾