OmniAICreator/Qiita-1.07M huggingface dataset:
API Gateway + Lambda を使って Backlog 通知を Slack で受け取る


課題管理のツールとして Backlog は便利なんですが、自分が担当者になった場合や通知対象に含まれた場合にいちいちメールで通知を受けるのは鬱陶しいので、Slack の Direct Message で受け取れるようにしてみました。

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/15611/aeeb5227-0efe-8a6f-0ca2-a40be3a76ebc.png "Slack.png")

こんな感じで、Backlog への課題の追加や更新等があった場合、bot から DM が届きます。
自分宛ての通知のみ DM で来るので、担当者が自分以外の課題に惑わされることがないので安心です。

Hubot で channel 投稿する例は既にいくつかありますが、せっかくなので API Gateway + AWS Lambda でさくっと組んでみました。

> 2017/08/10: CloudFormation 化しました

- GitHub: https://github.com/u-minor/backlog2slack

# Slack API Token の準備

Slack にメッセージを投稿するためには、API Token が必要です。
Slack の Integration で API Token が使える App (Hubot 等) を入れ、API Token をメモしておきます。
> 既に Hubot を使っているなら、既存の Hubot の API Token をそのまま利用してもOKです。


![slack_api_token.png](https://qiita-image-store.s3.amazonaws.com/0/15611/c0a296af-4492-fd37-4987-e9c0f68dd5b5.png "slack_api_token.png")

# Backlog API Key の準備

Backlog

Backlog の API にアクセスするため、Backlog 側の API Key を発行し、メモしておきます。
「個人設定」->「API」から辿れます。

![backlog_api_key.png](https://qiita-image-store.s3.amazonaws.com/0/15611/41052815-eda8-e013-c6a9-f34096ffa7d3.png "backlog_api_key.png")

# Lambda のビルド・S3 への設置

https://github.com/u-minor/backlog2slack からコードを clone し、ビルドします。

```command-line
yarn install
yarn build
```

dist 以下に `lambda.zip` ができていれば OK です。

作成した lambda.zip を 適当な S3 bucket にアップロードしておきます。
bucket 名と、パスは覚えておきましょう。

# CloudFormation でスタックを構築する

この作業で、Lambda 用 IAM Role の作成、Lambda function の作成、API Gateway 関連の設定が自動で行われます。

CloudFormation の Create stack に行き、template 選択で ローカルの `cf/stack.yml` をアップロードします。

![Create_A_New_Stack.jpg](https://qiita-image-store.s3.amazonaws.com/0/15611/4e93308a-c09d-8a22-8ee9-c097eea42ecc.jpeg "Create_A_New_Stack.jpg")

次に進むとスタック名やパラメータの設定画面になりますので、メモしておいた API Key 等を設定します。

![Create_A_New_Stack.jpg](https://qiita-image-store.s3.amazonaws.com/0/15611/77ce0428-2bdf-7733-68e2-64250f9552d8.jpeg "Create_A_New_Stack.jpg")

後は、特に何も設定せず次へ進んでいけば OK です。

> 最後の `I acknowledge that AWS CloudFormation might create IAM resources.` のチェックを入れ忘れないようにします。

# Backlog の Webhook に 作成した API を設定する

作成されたスタックの Outputs を確認すると、デプロイした API のベース URL が確認できます。

![Stack_Detail.jpg](https://qiita-image-store.s3.amazonaws.com/0/15611/716860a3-33fa-67c7-db0f-b8efe1b34d3b.jpeg "Stack_Detail.jpg")

Backlog の「プロジェクト設定」->「Webhook」に行き、Webhook を追加します。
API のベース URL に `/notify` を追加したものを登録します。

![Backlog___Sprocket_プラットフォーム_SP____Webhook.jpg](https://qiita-image-store.s3.amazonaws.com/0/15611/d55fabe6-b3a2-8ef9-a8cc-b0e9488e866f.jpeg "Backlog_Webhook.jpg")

うまく行けば、Backlog 課題の通知が Slack に流れてくるはずです。

# 補足

Backlog ユーザと Slack ユーザの連携は、メールアドレスベースで行っています。
Backlog の更新で通知があった場合、

- Backlog のプロジェクト ID を取得
- Backlog の該当プロジェクトのユーザリストを Backlog API 経由で取得
- Slack のユーザリストを Slack API 経由で取得
- 通知対象の Backlog ユーザ ID から Backlog ユーザのメールアドレスを参照
- Slack ユーザのメールアドレスをサーチし、一致する Slack ユーザを選択
- 通知先の Slack ユーザ ID を特定、DM 通知

といった処理が行われますので、Backlog と Slack のメールアドレスは一致させておく必要があります。
Appleの中間証明書の削除手順 〜 Appleさんはこっそり回答する

# はじめに

いち早く記事にまとめていただいて助かりました。
http://qiita.com/koutalou/items/25903ead2b9ef26fa4d9

2016/2/15に`Apple Worldwide Developer Relations Certification Authority`という中間証明書が期限切れを起こしたことで
>iOSアプリのXcodeからのアップロードがうまくかない

と言ったことがあったようで（個人的には特に実害なく・・・）
私が確認したのは

>appleの証明書で、"この証明書の発行者が無効です。"エラーで、WWDRの証明書をDLしてもなおらない。
>http://qiita.com/matsuyoro/items/977894d5f7558a4566d4

このタイトルのままの現象でアーカイブはできても
配布ができるできないのところで問題が起こるといろいろありそうなので
後日のためにこちらに手順を再度まとめました。

# 手順
（1）キーチェーンアクセスのキーチェーン：`システム`、分類：`証明書`を選択
![スクリーンショット 2016-02-17 15.13.10.png](https://qiita-image-store.s3.amazonaws.com/0/12362/0bdaac10-aadb-816a-e7d0-9c518618ad28.png)

何も見えません

（2）キーチェーンアクセスの`表示` > `有効期限の切れた証明書を表示`を選択
![スクリーンショット 2016-02-17 15.09.25.png](https://qiita-image-store.s3.amazonaws.com/0/12362/f46cbafc-3ac3-bf75-66a2-8f54dcf6d564.png)

（3）キーチェーンアクセスのキーチェーン：`システム`、分類：`証明書`を選択
![スクリーンショット 2016-02-17 15.14.23.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e5e4aa72-6cda-d915-07ad-c06eb2065f54.png)

期限切れになっている`Apple Worldwide Developer Relations Certification Authority`が表示されます。

（4）中間証明書を削除
![スクリーンショット 2016-02-17 15.31.28.png](https://qiita-image-store.s3.amazonaws.com/0/12362/301fbd61-4e09-77a4-6e73-ad05bccdd551.png)

（5）キーチェーンアクセスの`表示` > `有効期限の切れた証明書を隠す`を選択
![スクリーンショット 2016-02-17 15.34.43.png](https://qiita-image-store.s3.amazonaws.com/0/12362/da0ba9b0-f27e-25c1-33f9-b737b74adac3.png)

これで元通り。

#参考
https://forums.developer.apple.com/message/114003
https://developer.apple.com/support/certificates/expiration/

# さいごに
中間証明書を消さなくても通常どおりな環境もあり、そちらの環境から持っていった証明書を
該当Macで展開し

>"この証明書の発行者が無効です。"

が発生してアワワ・・・となりました。
:apple: さんから先にアナウンスがあっても良いかと思うんですよ・・・忘れた頃に地味になにか起こしてくれる。

と、おもったら・・・

https://developer.apple.com/support/certificates/expiration/
![スクリーンショット 2016-02-24 16.42.54.png](https://qiita-image-store.s3.amazonaws.com/0/12362/220d2a76-b7e8-30d3-f031-eb5c22f483d6.png)

## 参考までに
Xcode6系でビルドしているMacには2023年まで使える`Apple Worldwide Developer Relations Certification Authority`が`ログイン`にある状態で、消さなくても使えているようです。
Xcode7系でビルドしているMacには掲題の事象が発生しました。
ansible1.Xとansible2.Xの共存

# ansible2.0でエラー。。

brewでインストールしたansibleバージョンが2.0になっており、以前作ったプレイブックでエラーになってしまった。。
1.X系と2.X系では変更点もあるので、２つの環境を使えるようにする。

# 既存のansibleを削除

brewで入れたansible2.0を削除

```
$ brew uninstall ansible --force
```


# pyenv-virtualenvインストール

* pyenv
複数バージョンのPythonをインストールして切り替えられる

* pyenv-virtualenv
  同じバージョンのPythonで複数環境を切り替えできるpyenvのプラグイン

```
$ brew install pyenv-virtualenv
$ pyenv versions
* system (set by /Users/hoge/.pyenv/version)
```

pyenvを入れただけだと、system環境しか表示されない。

# 環境作成開始

### pyenvにPython2.7.10環境を作成

```
$ pyenv install 2.7.10
$ pyenv versions
* system (set by /Users/hoge/.pyenv/version)
  2.7.10
```

### virtualenvで、Python2.7.10を元にansible2環境を作成

```
$ pyenv virtualenv 2.7.10 ansible2
$ pyenv versions
* system (set by /Users/hoge/.pyenv/version)
  2.7.10
  2.7.10/envs/ansible2
  ansible2
```

* グローバルPythonをansible2に切り替える

```
$ pyenv global ansible2
$ pyenv versions
  system
  2.7.10
  2.7.10/envs/ansible2
* ansible2 (set by /Users/hoge/.pyenv/version)
$ python --version
Python 2.7.10
```

* pipコマンドのためにパスを通す

```
$ echo eval "$(pyenv init -)" >> ~/.zshrc
$ source ~/.zshrc
```

* ansible2.Xインストール

```
$ pip install ansible
$ ansible --version
```

### 同じ要領でansible1.X環境を作成

```
$ pyenv virtualenv 2.7.10 ansible1
$ pyenv versions
  system
  2.7.10
  2.7.10/envs/ansible1
  2.7.10/envs/ansible2
  ansible1
* ansible2 (set by /Users/hoge/.pyenv/version)
$ pyenv global ansible1
$ pyenv versions
  system
  2.7.10
  2.7.10/envs/ansible1
  2.7.10/envs/ansible2
* ansible1 (set by /Users/hoge/.pyenv/version)
  ansible2
$ pip install ansible==1.9.4
$ ansible --version
ansible 1.9.4
  configured module search path = None
$ python --version
Python 2.7.10
```

# ansible環境切り替え

```shell-session:ansible1を使う
$ pyenv global ansible1
```

```shell-session:ansible2を使う
$ pyenv global ansible2
```
[swift]基本構文覚え書き　キャストとか

# 環境
- Swift2.1
- xCode7.2

>`2016/02/17現在`

# 1.文字列の埋め込み
文字列の中に`\(変数名)`と書くことで、その場所が変数の値に置き換わります。

```swift:正しい例.swift
let str = "埋め込み"
print("こうやって\(str)ます。")     //こうやって埋め込みます。
```

いちいち`toString`を書いて、、ということも必要ありません。

`\`を記載しなかった場合は、下のようにそのまま出力されてしまうので注意してください。

```swift:間違い例.swift
let str = "埋め込み"
print("こうやって(str)ます。")     //こうやって(str)ます。
```

# 2.四則演算子
|記号	|演算子		|
|:---: 	|:---:	|
|	+	|	+	|
|	-	|	-	|
|	÷	|	/	|
|	×	|	*	|
|	mod	|	%	|

> mod:割ったときの余り。（例：5÷3の余りは2）



```swift:2-1.swift
let x = 1
var y = x + 2 * 3 / 2
print("y = \(y)")       //  y = 4

y %= 2
print("y mod 2 = \(y)") //  y mod 2 = 0
```

# 3.キャスト
swiftではキャストする方法がいくつかありそうです。

## 3.1 コンバージョン(Conversion)
`型(値)`という記述でキャストするやり方をコンバージョンと呼ぶらしいです。
厳密にはキャストではないらしいのですが…、後述します。

### Doube->Int

```swift:Double->Int.swift
let x: Double = 1
let y: Int = Int(x)
print("y = \(y)")   //  y = 1
```

### Int->String
```swift:Int->String.swift
let intNumber: Int = 10
let intStr: String = String(intNumber)
print("intStr = \(intStr)")
//  intStr = 10
```

### Double->String
浮動小数点型（Double）の場合は、`String()` はコンパイルエラーになりますので注意してください！
(`Swift2.0`:2016/02/17現在)

```swift:Double->String.swift
let doubleNumber: Double = 11.111
let doubleStr: String = String(doubleNumber)
// => Error
```

- - -

## 3.2 description
数値からStringに変換するときは`description`が使えます。
>・Int
>・Double　など

### Int->String

```swift:Int->String.swift
let intNumber: Int = 2
let intStr: String = intNumber.description
print("intStr = \(intStr) ")    //  intStr = 2
```

## 3.3 toなになに
**！注意！`Swift2.0`以降使えないようです。**

### toInt
>Swift2では`toInt()`が使用できなくなっており、エラーになります。

>```swift:error.swift
let str = "123"
var num = str!.toInt()//error: toInt() is unavailable
```

### toString
>こちらも`toString()`がエラーになりました。


何か間違いや内容の変化がありましたら修正します。
[Vim] 行をカンマ区切りで改行する

Javaのenumとかでよくやるのだが、いちいちインサートモードに入ってやってるのめんどくさいので置換を使おう。

例）

```
GET, POST, PUT, PATCH, DELETE;
```

コマンドモードで、**`:s/, /\r,/g`**

結果）

```
GET
,POST
,PUT
,PATCH
,DELETE;
```
duplicationエンジンを特定のパスで無効にする

[CodeClimate](https://codeclimate.com/)を使うと自動的にコードの品質を採点してくれる。潜在的なリファクタリング可能ポイントを可視化してくれるので大変便利なのだが、特にduplicationエンジンはお節介が過ぎて邪魔になることがある。

特に顕著なのはテストを書いているときだと思う。テストだとどうしても同じようなコードが出現してしまう。下手に共通化してもむしろ見通しが悪くなったりすることもある、そもそも対応するのが面倒なことも多い。

こういう場合は、engine設定に`exclude_paths`を追加することで、テストコードに対してduplicationエンジンをオフにすることができる。例えばRubyのリポジトリで、specディレクトリ以下はduplicationエンジンを切る場合はこんな感じで書く:

```yaml:.codeclimate.yml
---
engines:
  duplication:
    enabled: true
    exclude_paths:
    - spec
    config:
      languages:
      - ruby
  rubocop:
    enabled: true
```

当然ながらrubocopエンジンはspec以下も対象になる。

実はこれまで`exclude_paths`はトップレベルにしか置けなかった。つまりこういうこと:

```yaml:.codeclimate.yml
---
engines:
  duplication:
    enabled: true
    config:
      languages:
      - ruby
  rubocop:
    enabled: true
exclude_paths:
- spec
```

この場合spec以下はrubocopも走らなくなってしまう。小さな改善だが嬉しい :relaxed: 

### 参考

- [codelimate/codeclimate#308](https://github.com/codeclimate/codeclimate/pull/308)
    - この機能が追加されたPull Request。中身はごちゃごちゃ色々入っているが、その中に今回のengine単位のexclude_pathsも含まれている。
C#の正規表現でエスケープに躓いたのでメモ

# C#の正規表現でのエスケープに躓いたのでメモ
正規表現を使っている間に突然エラーが出てしまって詰まった。

## 詰まったコード

```csharp:Form1.cs
// 動く
Regex a = new Regex("^https?://");
Regex b = new Regex("#.+$");

// 動かない
Regex c = new Regex("-\d+?$");
```

## 出力されるエラー

|重大度レベル	|コード	|説明					|
|---------------|-------|---------------------------------------|
|エラー		|CS1009	|認識できないエスケープ シーケンスです。	|

## 原因
バックスラッシュがエスケープシーケンスとして認識されてしまっている。
ファイルパス等では、あからさまに臭いのですぐに気づけることが多いが、正規表現では見落としがちだ。

## 普通の回避方法 (regular string literal)
バックスラッシュをエスケープする。

```csharp:Form1.cs
Regex c_a = new Regex("-\\d+?$");
```

## いい感じの回避方法 (verbatim string literal)
文字列の前に`@`をつけることで、verbatim string literalとしエスケープ文字を無効化する。

```csharp:Form1.cs
Regex c_b = new Regex(@"-\d+?$");
```

余談だがファイルパスの表現にもverbatim string literalは便利だ。

```csharp:Form1.cs
string path = @"C:\windows\system32\";
```

## 参考
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/strings/

## 更新履歴
2018-10-14 そこそこの閲覧数なので、書き直した。
httpd等のプロセスdown時の自動再起動設定をする（cronを使う編）

いろいろなやり方は有ると思いますが、
何かの拍子にプロセスが落ちた、
もしくはアタック食らってプロセスが落ちた、
異論はあるでしょうが、とりあえずサービスダウンを短くしたい、
個人のプライベートサイトでオペレーションするの怠いのでとりあえず動いていてくれれば良いな人向け。

#検証環境
・CentOS6

#入れる
cronで1分間でpidofを使いプロセスの生き死を見て死んでたらrestartする仕組み
restartついでにメールも飛ばす感じに
*秒間でcronまわす方法とかあるけど1分くらいよかろう
*restartで変にコケた場合等はまともに動かないかもしれないので違う方法も視野に
*あと監視も入れておきましょう

```:cron:
* * * * * root /sbin/pidof httpd > /dev/null 2>&1 || (/etc/init.d/httpd restart && echo "httpd restarted." | mail -s "Process Restartttt!!!" hogehoge@hogehoge.com > /dev/null 2>&1)
```
GitHub上のディレクトリをダウンロードする

[もっとまとまっている記事](http://qiita.com/raucha/items/1219327df8a9ded494df)がすでにありました。すみません！

=== 以上追記 ====

github上にある特定のディレクトリ以下のファイルを一括でダウンロードしたい時がたまにあります。
そんな時は`git clone --depth=1`を使えばだいたい解決するんですが、そのコマンドすらも重いリポジトリってありますよね。

そんな場合は、svnコマンドでGitHubのリポジトリを操作すればできます。

## やり方

こんな感じ。

```bash
svn export https://github.com/<ユーザー名>/<リポジトリ名>/branches/<ブランチ名>/<ディレクトリパス>
```

## 2段階認証をしている場合

privateなリポジトリにアクセスする場合、ユーザー名とパスワードを聞かれます。
通常はGitHubのユーザー名とパスワードで良いのですが、2段階認証をしている場合はちょっとめんどくさいです。

まずは[Personal access tokens](https://github.com/settings/tokens)にある「Generate new token」をクリックしてTokenを生成します。
Select scopesは`repo`にチェックしておけばいいでしょう。

これで生成されたTokenをパスワードとして入力すればOKです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/3875d825-1c53-256a-03ad-04572535fdf2.png" width="80%" />


## 注意点というか制約

* svnが入っていることが必須
* 429 Too Many Requestsがたまに出る
* git-lfsは無理っぽい

制約が多いので使いドコロがあるか微妙ですね。。。

## 参考URL
[git export from github remote repository - stackoverflow](http://stackoverflow.com/questions/9609835/git-export-from-github-remote-repository)
Let's Encrypt で証明書を小刻みに自動更新


* お手軽 SSL の Let's Encrypt、便利だけど証明書の有効期限が 3ヶ月で切れるのを何とかしたい
* 証明書の更新コマンドが用意されてるので、自動更新が可能
* monthly の cron で月1回更新してもいいけど、2,3回連続で失敗したら終わる
* 公式ドキュメントには下記のようにある。（公式もネットワークトラブルやサーバダウンによる失敗を懸念している）

> We recommend running renewal scripts at least daily, at a random hour and minute. This gives the script many days to retry renewal in case of transient network failures or server outages.
> [How It Works - Let's Encrypt](https://letsencrypt.org/howitworks/#writing-your-own-renewal-script)

というわけで、なるべく公式の意に沿うようにやってみる

## 1日1回、ランダムなタイミングで証明書を更新（そして怒られる）
さすがに毎日はやり過ぎな気はしたけど

```crontab
0 2 * * * sleep $[($RANDOM % 175)+5]m; /path/to/letsencrypt-renew.sh  >/dev/null 2>&1
```
※ ログは捨ててない

```/path/to/letsencrypt-renew.sh
#!/bin/bash
SCRIPT=/usr/local/src/letsencrypt/letsencrypt-auto
WEBROOT=/path/to/webroot
DOMAIN=example.com
LOG=/var/log/letsencrypt/renew.log
 
date '+%Y-%m-%d %H:%M:%S >>>' >> $LOG
if ! $SCRIPT certonly --webroot --webroot-path $WEBROOT -d $DOMAIN --renew-by-default >> $LOG 2>&1 ; then
    echo '  Automated renewal failed' >> $LOG
    exit 1
fi
service nginx reload
```



* ランダムと言っても日中は嫌なので、02:05 〜 05:00 の間のどこかでスクリプトが実行される

何回かテストして OK ぽかったので1日待つ。

### 怒られた
1日待っても証明書が更新されてなかったのでログを見たら

> so a SAN multi-domain cert having domain1.com, www.domain1.com, domain2.com, www.domain2.comis counted as 1 certificate ? but you can only renew this SAN multi-domain cert 5 times per 7 days ?

7日に5回までのリミットがかかってるらしい。


## 5回に1回の確率で証明書を更新するスクリプトを毎日実行
スクリプトの実行自体にもリミットに引っかからない程度のランダム性をもたせてみた。
こう修正して様子見中。

```crontab
0 2 * * * sh /path/to/letsencrypt-renew.sh  >/dev/null 2>&1
```
※ ログは捨ててない

```/path/to/letsencrypt-renew.sh
#!/bin/bash
SCRIPT=/usr/local/src/letsencrypt/letsencrypt-auto
WEBROOT=/path/to/webroot
DOMAIN=example.com
LOG=/var/log/letsencrypt/renew.log
 
date '+%Y-%m-%d %H:%M:%S >>>' >> $LOG

# ececute 1/5
if [ $(($RANDOM%5)) -ne 1 ]; then
  echo '  do nothing ' >> $LOG
  exit;
fi

echo '  sleeping... ' >> $LOG

# sleep 5 - 180 min
sleep $[($RANDOM % 175)+5]m

date '+%Y-%m-%d %H:%M:%S woke up!!>>>' >> $LOG
if ! $SCRIPT certonly --webroot --webroot-path $WEBROOT -d $DOMAIN --renew-by-default >> $LOG 2>&1 ; then
    echo '  Automated renewal failed' >> $LOG
    exit 1
fi
service nginx reload
```

\# 成功/失敗の結果を Slack とかに通知したらいいと思う
wordpressのpostデータをカスタムポストを含めて、csvに出力する


最終的なsqlコマンドはこちら

```mysql
SELECT p.ID, p.post_name, p.post_title,
custom_post_01.meta_value AS custom_post_01,
custom_post_02.meta_value AS custom_post_02,
custom_post_03.meta_value AS custom_post_03
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS custom_post_01 ON p.ID = custom_post_01.post_id AND 'custom_post_01' = custom_post_01.meta_key
LEFT JOIN wp_postmeta AS custom_post_02 ON p.ID = custom_post_02.post_id AND 'custom_post_02' = custom_post_02.meta_key
LEFT JOIN wp_postmeta AS custom_post_03 ON p.ID = custom_post_03.post_id AND 'custom_post_03' = custom_post_03.meta_key
WHERE id IN (SELECT object_id from wp_term_relationships where term_taxonomy_id=1)
INTO OUTFILE '/tmp/wp_posts.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
```


この辺を調べて対応できた。
http://qiita.com/yahsan2/items/5e342818075c7d0c34f8
http://qiita.com/yahsan2/items/77bae737934a95582fef
http://qiita.com/yahsan2/items/346c821cdd14cad0a704
http://qiita.com/yahsan2/items/3b06e801c7218ea0eefc
wordpress のデータを mysql から csv に出力


```mysql
SELECT p.ID, p.post_name, p.post_title
FROM wp_posts AS p
INTO OUTFILE '/tmp/wp_posts.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
```

参考：
http://stackoverflow.com/questions/356578/how-to-output-mysql-query-results-in-csv-format
wordpressのあるカテゴリIDのポストをselect



where = でなく、IN にしないと `Subquery returns more than 1 row` のエラーがでた。

```mysql
SELECT p.ID, p.post_name, p.post_title
FROM wp_posts AS p
WHERE id IN (SELECT object_id from wp_term_relationships where term_taxonomy_id=1)
```
worpdressのデータをcustom post と合わせてselectする

wordpressのカスタムポストと合わせてセレクト

LEFT JOIN をつなげて使うことで出力できる。


```mysql

SELECT p.ID, p.post_name, p.post_title,
custom_post_01.meta_value AS custom_post_01,
custom_post_02.meta_value AS custom_post_02,
custom_post_03.meta_value AS custom_post_03
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS custom_post_01 ON p.ID = custom_post_01.post_id AND 'custom_post_01' = custom_post_01.meta_key
LEFT JOIN wp_postmeta AS custom_post_02 ON p.ID = custom_post_02.post_id AND 'custom_post_02' = custom_post_02.meta_key
LEFT JOIN wp_postmeta AS custom_post_03 ON p.ID = custom_post_03.post_id AND 'custom_post_03' = custom_post_03.meta_key
```

参考：
http://stackoverflow.com/questions/26319613/improving-a-query-using-a-lot-of-inner-joins-to-wp-postmeta-a-key-value-table
nginx の proxy_cache で、どれ位Hitしているかログに出した!

何だかんだと苦労して設定した Nginx の proxy_cache なんだけど、どれぐらい有効なのでしょうか!? いままで、よく判っていなかったのでログに出して集計できるようにした!

# Nginx の proxy_cache 設定について

ググって、頑張って設定して下さい。

# Nginx のログ出力設定

Nginx の proxy_cache で、どれぐらいヒットしたかは、  

`$upstream_cache_status`

で判ります。

nginx.conf にこんな感じで設定しましょう!

```bash:nginx.conf
log_format rt_cache '$remote_addr - $upstream_cache_status [$time_local]  '
                    '"$host" "$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';
```

自分は、サブドメインサイトが複数あるので、"$host" を埋め込みました。単一サイトor単一ログを出すなら、要らないかも。

ログファイルの設定は、こんな感じにします。

```bash:nginx.conf
access_log   /var/log/nginx/example.com.access.log;
access_log   /var/log/nginx/example.com.cache.log rt_cache;
```

# 集計しましょう!

作成された example.com.cache.log を集計します。

```bash
awk '{print $3}' /var/log/nginx/example.com.cache.log  | sort | uniq -c | sort -r
```

結果は、こんな感じに出力されます。

    8800 HIT
     779 -
    1392 BYPASS
      19 EXPIRED
    2614 MISS

ダッシュ（"-"）は、モジュールを上流側に到達しないことを意味します。最も可能性が高いというように、 403を返す404を返している事をを意味します。
IDCFクラウドのDNSでワイルドカードを利用するには

# はじめに

以下のようなサブドメインを同じホストへ割り当てたい、かつexample.comのサブドメイン名は恒久的に同じホストである（他のホストに対してサブドメインを割り当てることは考えていない）場合は、ワイルドカードを利用すると１レコード追加するだけで、割り当てられたホストにおいてexample.com配下のサブドメイン全てを扱うことが出来るようになります。

aaa.example.com
bbb.example.com
ccc.example.com

例えば、Apacheの場合はVirtualHostでServerNameに公開したいサブドメインを含めたFQDNを記述するだけで、DNSの設定変更を行うこと無く、またDNSの「浸透」を考慮すること無く、すぐにそのサブドメインでのWebコンテンツ、Webシステムの公開が可能となりますので、非常に便利です。

IDCFクラウドのDNSでは、以下の手順でワイルドカードを利用することが可能です。

# 手順

レコード名を「*」（アスタリスク）にします。
タイプはAあるいはCNAMEとします。

詳細は以下を参照ください。

![wildcard.png](https://qiita-image-store.s3.amazonaws.com/0/64876/9fb1df70-e53c-2d51-486b-f2fd0c3fcfea.png)
IDCFクラウドのDNSでサブサブドメインを追加するには

# 手順 

example.comというドメインの場合、example.comというゾーンと別にc6.example.comやc7.example.comというゾーンを追加することで、www.c6.example.comやwww.c7.example.comのようなサブサブドメイン（既存のサブドメイン配下のサブドメイン）が利用可能となります。

# 設定例

![dns.png](https://qiita-image-store.s3.amazonaws.com/0/64876/564a6622-9dc6-be44-7b2e-0a34aedf4de9.png)
cssnanoを通したらベンダープレフィックスが消えて困った時のメモ



# 今回の流れ

## gulp-minify-cssから乗り換え
[gulp-minify-css](https://www.npmjs.com/package/gulp-minify-css)でcssをminifyしてきたのですが、PostCSSへの流れと公式サイトの下記メッセージから、乗り換えを決意。

>This package has been deprecated in favor of gulp-cssnano, which should offer more advanced optimizations.


## Android2.3でレイアウト崩れ
minify前のcssでは正常なレイアウトがminify後のcssで崩れたので調査。
`-webkit-box-sizing: border-box;`のベンダープレフィックスが消えていたことが原因と判明。
※2.3では必要なんです…

なので、cssnanoについて再度確認。



# cssnano

## ベンダープレフィックスが除去できる
- [cssnano: A modular minifier based on the PostCSS ecosystem](http://cssnano.co/)

公式サイトを見てたら下記文言。
>Removal of outdated vendor prefixes

はい、Google翻訳！
>時代遅れのベンダープレフィックスの除去

時代遅れですいません。
cssnanoの機能をきちんと把握してませんでした。


## デフォルト設定ではremoveしかできぬ
- [Can't pass parameters to Autoprefixer. · Issue #69 · ben-eb/cssnano](https://github.com/ben-eb/cssnano/issues/69)

こんなコメントが。
>In cssnano by default it only removes prefixes.

設定をうまくすればなんとかなりそう。


## オプションについて
- [cssnano: Options documentation](http://cssnano.co/options/)

たくさんありますが、下記コードが目につきました。
`cssnano.process(css, {autoprefixer: false});`

falseしちゃうんですか。


## autoprefixerが使える
- [Sass Workflow Using cssnano and Autoprefixer – JimFrenette.com](http://jimfrenette.com/2016/02/sass-cssnano-autoprefixer/)

```
.pipe(cssnano({
	autoprefixer: {browsers: supported, add: true}
}))
```

削除だけではなく、オプションで普通に使えました。


## 結局止めました
```
.pipe(postcss([
	cssnano({autoprefixer: false})
]))
```

諸事情によりautoprefixerは別で走らせていて、cssnanoでは不要なので止めました。



# csswringがいいのでは説
cssnanoの多機能さに振り回されるなら、minifyについては[csswring](https://www.npmjs.com/package/csswring)がいいのでは、という話も耳にしつつ、一旦はcssnanoで続けてみることにします。
Xamarin.Forms（Android）ScrollViewの中にあるListViewをスクロールさせる

## NestedScrollingEnabledを使います
ScrollViewの中にListViewを入れた場合
既定の動作ではListViewのスクロールが効かないようです

参考 stackoverflow：[ListView inside ScrollView is not scrolling on Android](http://stackoverflow.com/questions/6210895/listview-inside-scrollview-is-not-scrolling-on-android)

解決策として**NestedScrollingEnabled**をtrueにすれば良いと書いてありました。
実際にtrueにしたらスクロールしてくれましたのでメモとして残しておきます。

以下のようなカスタムレンダラーを作成します。

```lang:C#
using Xamarin.Forms.Platform.Android;
using MyProject.Droid.Renderer;

[assembly: Xamarin.Forms.ExportRenderer(typeof(Xamarin.Forms.ListView), typeof(CustomListViewRenderer))]
namespace MyProject.Droid.Renderer
{
    public class CustomListViewRenderer : ListViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
        {
            base.OnElementChanged(e);

            this.Control.NestedScrollingEnabled = true;
        }
    }
}
```

## おまけ：そもそもスクロールしないで全ての行を一覧表示したい場合
通常ListViewを使う場合はListViewがページの唯一のコンテンツになる場合がほとんどだと思います。
そのため、あえてスクロールをしないという選択肢は通常考えられないと思いますが、
上記の例のようにScrollViewの中にあるListViewなどの場合は違います。

ListViewのように要素を繰り返して表示したいが、
スクロールしないで一覧表示する場合はどうするのかというと、
**ListViewを使うのをやめましょう。**
ListViewはスクロール前提のビューです。
このような用途に使うべきではないと私は考えます。

ASP.NETのRepeaterコントロールみたいなものは無いかと調べていたら、
XLabsでそのまんまのビューがありました。

[XLabs/Xamarin-Forms-Labs RepeaterView]
(https://github.com/XLabs/Xamarin-Forms-Labs/wiki/RepeaterView)

使い方はListViewと同じです。

 - ItemTemplateにテンプレートを定義する。
 - ItemsSourceにコレクションをバインドする。



それでも無理やりListViewでやる方法もありますが多少工夫（※）が必要です。
やり方は全行数が表示できる高さをListViewのHeightRequestに設定するだけです。
例として1行の高さが30の場合のコードは下記のようになります。

```lang:C#
private ListView listView;
private List<object> listViewItems;
protected override void OnSizeAllocated(double width, double height)
{
    base.OnSizeAllocated(width, height);
    listView.HeightRequest = listViewItems.Count * 30;
}
```
※例えばヘッダーやフッターの高さなども考慮しないと表示しきれないです。
linuxでtigをコンパイルする


apt-getで使いたいバージョンのtigがインストールできないので、自前でtigをインストールする方法

やり方は簡単だが、そのままやろうとすると日本語が文字化けして読めなくなるので、その対処法をメモ


## <i class="fa fa-download"></i> リポジトリのクローン
```bash
git clone https://github.com/jonas/tig.git
```
必要に応じて、使いたいバージョンを指定する

## <i class="fa fa-wrench"></i> コンパイル
```bash
cd tig
./autogen.sh
./configure --without-ncurses #日本語対応(必要なければ./configureだけでOK)
make
```
--without-ncursesによってマルチバイト文字の表示に対応

## <i class="fa fa-terminal"></i> インストール
```bash
sudo make install
```
インストール先を変更したい場合、make installのときに--prefixにて指定する


<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
Androidの時計をシェルスクリプトから補正する（要root）

# コマンド
```
$ adb shell "su -c 'date `date +%s`'"
```

# 説明
adbのシェルから時刻を補正するにはdateコマンドの引数にUNIXタイムを指定する．（ただしroot権限が必要）
UNIXタイムはdate +%sで取得できる．
誤差は最大1秒出てしまうので注意．

~~誤差を少なくする方法については別途書き起こす予定．~~
[こちらの記事](http://qiita.com/shinido/items/140e8a6d3ad564810cb4)にまとめました．
[AAAI16実況報告] MIT/CSAIL はCommon Lispを水中探査ロボットAIに実運用している


はい、また思いつき投稿です。
経緯を知らない方のためにもう一度。

![2016-02-14 08.53.38.jpg](https://qiita-image-store.s3.amazonaws.com/0/6090/b9ca3593-ab37-fa43-2d7a-92d8aa851b0c.jpeg)

発表のためにAAAI-16に来ています。知らない人も多いかと思いますが、IJCAIとならび、AIの国際学会で最も難関と言われる学会です。個人的には自分もA*の改善論文でPaper Award 密かに狙っていたのですが、Bidirectional Search 論文に取られてしまいました。

今日は、幸運にも MIT / CSAIL の Brian Williams 先生とお話することが出来ました。

![bw.jpeg](https://qiita-image-store.s3.amazonaws.com/0/6090/89638910-70fc-69c7-a604-4833ddea10b8.jpeg)

(100kgを超してそうな巨体です・・・でもイケメン)

この先生は、かの有名な宇宙探査機 NASA Deep Space 1 にCommon Lispで作ったシステムを載せ、成功に導いた先生です。

![ds1](https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcSZAW6xKkKqwCqMksQGBPcoTzMY1xwi11DFKCc4zrX62DZ2PoVlSw)

Common Lisp のリアルタイムコンパイル機能のおかげで、運用中に発覚したバグを(たしか木星を過ぎたあたりで) **REPLにログインし動的にhotfix** することができ、無事ミッションを達成することが出来ました。(Common Lispでは、プログラム実行中に、関数単位でプログラムをコンパイルし、メモリ中の関数ポインタを差し替えることができます。プログラム全体のコンパイル&リンクは不要です。そのため、遅延が許されない宇宙航行システムでも問題なし。) 詳細は、[論文](http://www.sciencedirect.com/science/article/pii/S000437029800068X) や、 [動画: Remote Agent: 一億キロの彼方からのデバッグ(Debugging Code from 60 Million Miles Away)](https://www.youtube.com/watch?v=_gZK0tW8EhQ) から知ることができます。

近年は、油田などの検査用の **自動** 水中探査ロボット(AUV, Autonomous Underwater Vehicle)を作っています。日本ではどこかが **リモコン式の** 探査ロボットを作って喜んでいたような気がしますが、MIT/CSAILで作っているロボットは、ケーブル無しかつ電波もGPSも使えない視界不良の深海で、カメラからの情報を元に自力でミッションの遂行プラン立案を行い、検査を行います。

![uav](http://news.mit.edu/sites/mit.edu.newsoffice/files/styles/news_article_image_top_slideshow/public/images/2015/MIT-Ocean-Robotics-2.jpg?itok=wQJ_J9rM)
http://news.mit.edu/2015/cognitive-underwater-robots-0507

このUAVは、複数のモジュールから構成されています。

1. 限られた時間・電力など、与えられた制約の中でどの観測地点をどの順序で観測するか というメタレベルの「行動計画」を行うモジュール。離散・連続混合問題を解きます。自分の研究分野です。
2. 行動計画に従うためにどのような座標で移動するかという「経路計画」を行うモジュール。RRT,RRG*などをベースにした、確率的連続空間探索を行います。自分の学部時代の研究分野。
3. 経路計画に従うためにどのようにモーター出力を行うかなどを細かく計算する「制御」モジュール。
3. 様々なセンサーモジュールなど。忘れた

詳しい内容はいずれ以下のページにProceedingsが発表されるはずです。
http://www.inf.kcl.ac.uk/staff/danmag/planhs16.html

さて、このUAV、事前に大まかな地図や海流情報は与えられますが、どちらの情報も古い情報で、間違っている可能性が大いにあります。そのため、もしも人工知能を搭載せず、つまり間違いを察知して自力で計画を立案できなければ、予想外の状況が現れた時に回収不能になってしまいます。

例えば、海流の変化によっては、必要な電力が足りなくて全ての観測ミッションを達成できないかもしれません。行動計画モジュールは、そのような想定外の状況に対しても、自ら推論を行い、可能な限りのミッションを行った上で自力で出発地点まで戻ってきます。

で、うわさではこの先生は今でもLispで書いているとは聞いていたのですが、 **本当のところどうなのかよくわからなかったので、突撃して聞いてみました！！！**

# Yes、つかっているよ。

![bw.jpeg](https://qiita-image-store.s3.amazonaws.com/0/6090/89638910-70fc-69c7-a604-4833ddea10b8.jpeg)

> 学生にプログラムを書かせると、rubyやらpythonやら、ポピュラーだが仕様のコロコロ変わるおもちゃ言語で書いたり、あるいはCやC++などメモリリークを起こすようなバグのあるプログラムを書いてくる。学生は5年で卒業して入れ替わるが、するとまた別の学生が自分の好きな言語で書こうとする。高額なロボットを運用するのに毎年仕様の変わる言語など使っていられない。だから、ANSI仕様があってかつ十分なメタプログラミングができるCommon Lispを使うと決めている。

全モジュールですか？

> 全部だ。

そこの生徒とも話してきました。

(本人の公開している画像でしたが、よく考えるとまずいかもしれないので消しました・・・)

> Lispのマクロはいいよね! VimでLisp書いてるよ。

Emacsじゃないのはちょっと残念ですが、ほんとに使われてるみたいですね。ILC (International Lisp Conference) に誘ってみたのですが、

> いや、そこまでではないかな・・・

って言われました :p

というわけで、いくつかのことがわかりました！

* Lisp はリアルなアプリケーションで使われている。それも、ウェブのようなある意味サイバーな「リアル」ではなく、「リアル・ワールド」現実世界を動くロボットで使われている。
* 身の回りにLisperが少ないとしたら、それは、<sub>(そういう優秀な研究者・プログラマが)</sub>みんな宇宙か深海に行ってしまったからである。

以上。
svnsyncでバックアップをとってみる


今さらSubversionの話。
Subversionサーバのバックアップをsvn hotcopyで取っていたら容量不足に陥ったので、別の方法を探したところ svnsync を知ったので試してみた。

参考）
http://www.caldron.jp/~nabetaro/svn/svnbook-1.4-final/svn.ref.svnsync.c.init.html

ソースリポジトリ：バックアップ元にあるリポジトリ
ミラーリポジトリ：バックアップ先にあるリポジトリ

## バックアップ先での準備
バックアップ先で以下を実施

・バックアップ用のミラーリポジトリを作る

    svnadmin create /data/backup/svn/test_repos_bk

・pre-revprop-change hookを作成する

    /data/backup/svn/test_repos_bk/hook/pre-revprop-change
    内容は以下。
    -
    #!/bin/sh
    exit 0
    -

・初期化(このリポジトリのバックアップ元のソースリポジトリを指定するイメージかな)

    svnsync init file:///data/backup/svn/test_repos_bk https://hogehoge/test_repos

## バックアップ先で同期実行
バックアップ先で以下を実施

    svnsync sync file:///data/backup/svn/test_repos_bk


---

※上記の通り、基本的にバックアップ先が主で使えるのがちょっと良い。

※この環境はバックアップ元への接続をHTTPS+LDAP認証にしているのでhttps://hogehogeにしている。
　環境によってsvnだったりsvn+sshだったりhttpだったり適宜読み替えよう。
AndroidStudioの設定をエクスポートしてインポートする方法

# 設定のエクスポート
## スタート画面でConfigureを選択
![Android_Studio_と_materials_new_html_erb_-_canvath_-____Sites_canvath_canvath_.png](https://qiita-image-store.s3.amazonaws.com/0/49347/87c16c57-5193-37f1-afb0-ae712b013a1a.png "Android_Studio_と_materials_new_html_erb_-_canvath_-____Sites_canvath_canvath_.png")

## Export Settingsを選択
![Android_Studio_と__Intellij_IDEAヘルプ_日本語訳__設定のインポートとエクスポート_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/49347/29e346a5-ecc9-722e-5167-1fd1005200ac.png "Android_Studio_と__Intellij_IDEAヘルプ_日本語訳__設定のインポートとエクスポート_-_Qiita.png")

## 出力先とファイル名を決めて選択
![Export_Settings_と_Android_Studio.png](https://qiita-image-store.s3.amazonaws.com/0/49347/9a3ae98d-bbd5-247c-e2b0-7b9015893541.png "Export_Settings_と_Android_Studio.png")


これでAndroidStudioの設定のエクスポートが出来ました。続いてインポート方法です。


# 設定のインポート
## スタート画面でConfigureを選択
![Android_Studio_と_materials_new_html_erb_-_canvath_-____Sites_canvath_canvath_.png](https://qiita-image-store.s3.amazonaws.com/0/49347/87c16c57-5193-37f1-afb0-ae712b013a1a.png "Android_Studio_と_materials_new_html_erb_-_canvath_-____Sites_canvath_canvath_.png")

## Export Settingsを選択
![Android_Studio_と__Users_kakizaki_shoichi_Dropbox_と__Intellij_IDEAヘルプ_日本語訳__設定のインポートとエクスポート_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/49347/ac586735-52fd-f2fa-d3df-f8d0da503178.png "Android_Studio_と__Users_kakizaki_shoichi_Dropbox_と__Intellij_IDEAヘルプ_日本語訳__設定のインポートとエクスポート_-_Qiita.png")

最後に先ほどエクスポートしたファイルを指定してあげれば完了です。

Mac ←→ Windowsでも出来ました。

PCのお引越し、設定のバックアップ等に役立ちそうです。
Homestead upで「default: php5-fpm: unrecognized service」

# 久しぶりにHomesteadを利用したらエラー

```
% homestead up
.....
==> default: php5-fpm: unrecognized service
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what
went wrong.
```

# Composerのグローバルの方を更新で解決。

```
% composer global remove laravel/homestead
% composer global clear-cache
% composer global require laravel/homestead
% homestead 
Laravel Homestead version 3.0.2
```
[RHEL][CentOS] OS 再起動時に /etc/sysconfig/iptables のルールが反映されない


`/etc/sysconfig/iptables` を直接変更してルールを記述したら、`service iptables save` で設定を保存するのを忘れずに。

https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sect-Security_Guide-IPTables-Saving_IPTables_Rules.html


`/etc/sysconfig/iptables` に設定を書いて、`service iptables reload` すると、ルールが反映される。

```
$ sudo vim /etc/sysconfig/iptables

$ sudo service iptables reload
$ sudo iptables -L
# /etc/sysconfig/iptables で記述したルール
```

しかし、OS 再起動時は、`iptables-restore` で設定を反映するので、`/etc/sysconfig/iptables` のルールが反映されない。

```
# OS 再起動

$ sudo iptables -L
# /etc/sysconfig/iptables が反映されない...
```

設定変更後は、`service iptables save` しておく。

```
$ sudo vim /etc/sysconfig/iptables
$ sudo service iptables save
```
【Arduino IDE使いやすくしよう】プログラミングに適したフォントに変更

Arduinoを触ったことのある方ならみんな使ったことがあるArduino IDE。Arduino本体はデバイスとしてデザイナー・アーティストに使いやすいように開発されているけど、Arduino IDEは使いづらくないですか？そこで少しでも使いやすくなるような設定を紹介します。

# OSによってフォントが見づらい
プログラミングに明るい方の間ではあるあるな「パッと見で文字が見分けられない問題」。小文字のl(エル)と大文字のI(アイ)、大文字のO(オー)と数字の0(ゼロ)などなど。Arduino IDEの標準ではまず見分けがつかない。クリソツなわけです。
![見た目がそっくり](https://qiita-image-store.s3.amazonaws.com/0/55103/053378f6-aff1-f326-42e9-cf3fa504f01f.png)

# プログラミングフォント「Myrica(ミリカ)」を使う
[プログラミングフォント Myrica / Estable](http://myrica.estable.jp/)
Myricaはプログラムの視認性を高めるために複数のフォントを組み合わせたプログラミングフォントです。こちらからフォントをダウンロードしてArduino IDEに設定します。Myrica.ttcとMyricaM.ttcがあるのですが、私は後者を選びました。

# Arduino IDEの設定ファイルを開く
Arduino IDEのメニューから[ファイル]→[環境設定]で環境設定画面を開きます。画面下に[`preferences.txt`]の記述があるのでクリックします。すると`preferences.txt`ファイルが格納されているフォルダが開くのでファイルを開きます。
![img_02.png](https://qiita-image-store.s3.amazonaws.com/0/55103/48fa2d00-24cd-fd8a-ce0c-65e8174c1bb6.png)

# preferences.txtファイルのフォント指定部分を編集
preferences.txtファイルの14行目に`editor.font=`とあるので、下記のようにインストールしたSource Han Code JPを設定してArduino IDEを再起動します。

```
editor.font=MyricaM M,plain,14
```

# これで判別できる！
どや！
![img_03.png](https://qiita-image-store.s3.amazonaws.com/0/55103/24fddcb9-0c6e-b98e-2901-69eeec724326.png)

# まとめ

## 本当は「Source Han Code JP」が使いたかった
記事「[日本語表示も考慮されたコーディング向けのフォント「Source Han Code JP」が公開](http://www.forest.impress.co.jp/docs/news/20150612_706667.html)」でも紹介されているAdobeが公開しているフォント。本当はこれを使いたかったのですが、Windowsでうまく読み込んでくれず、、、(Macではうまくいきました)

> ![Source Han Code JP](https://raw.githubusercontent.com/adobe-fonts/source-han-code-jp/master/resources/img-View.png)
> [adobe-fonts/source-han-code-jp](https://github.com/adobe-fonts/source-han-code-jp)より引用


# Arduino IDE使いやすくしようシリーズ
- [行番号を表示してエラーを追いやすく](http://qiita.com/umi_kappa/items/30c01220680f1db4014e)
- [起動時のウィンドウサイズを大きくはじめる](http://qiita.com/umi_kappa/items/15d8788f1fa83d50b8f4)
Gitbookを高速化する方法


Gitbookが流行ってそうだったのでちょっと弄っていたのですが、Chromeで激重。その原因を調べていたら下記のURLに到達しました。

[dwango/scala_text ページ遷移が遅い #8](https://github.com/dwango/scala_text/issues/8)

むむむ。どうやらレンダリングに起因しているようで、コメント欄にもあったとおりCSSを消せば良いのでは？と重い、CSSを消してみることにしました。

## gitbookでCSSを書き変える
`gitbook init`をしたディレクトリに、 `styles/website.css` というファイルを作成します。
このファイルの下記のCSSを記述します。

```css
body {
    text-rendering:auto;
    font-smoothing:none;
    font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;
    letter-spacing:.2px;
    text-size-adjust:100%;
}
```

そして、 `gitbook serve` を再起動します。

## → 結果
**早くなった**
【用語のメモ】API、パッケージとライブラリの違い



## API


よくドキュメントであるやつ。
java api ドキュメントとか、scala api ドキュメントとか。
Application Program Interfaceの略。
ここでいうAPIとは、OSが提供する機能をアプリケーションから呼び出せるようにするソフトウェアのこと。
つまり、OSに言語の機能が搭載されており、アプリケーションはOSから言語の機能を使う。　提供されている機能のことをAPIと呼ぶ。　 

## ライブラリ
ライブラリとは、汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもの。つまり、javaだと再利用可能なclassを定義したもの。

## パッケージ
javaだと、.jarという拡張子のzipファイルで、中にクラスライブラリがたくさん入っている。　
つまりクラスライブラリの集合 = パッケージ

## 参考リンク
https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA
http://sunjava.seesaa.net/article/50485694.html
UISwipeGestureRecognizerの罠と左右スワイプの実装

「罠」というと大げさに聞こえるかもしれないが、かなり長い事解決に悩まされた。
僕のように誰かがハマらないように祈って寄稿

その罠とは

## **SwipeGestureはデフォルトで右のスワイプしか検知しない**

これを知らなかった・・・！

UISwipeGestureRecognizerはデフォルトでは右のスワイプしか検知しないため、例えば左のスワイプを検知したい時は以下のように実装しなければならない。

```swift

let swipeGestureRecog = UISwipeGestureRecognizer(self, "swipeGesture")
swipeGestureRecog.direction = .Left

```
 

## 疑問

ただswipeGestureの実装をしているコードをみていると、以下のようなコードに出くわす

```swift

func swipeGesture(sender: UISwipeGestureRecognizer) {
  if sender.direction == .Right {
  } else if sender.direction == .Left {
  }
}

```

もし右のスワイプしか検知しないのであればこのコードは有効でなく、左右のスワイプを検知したければスワイプジェスチャー２つをつける必要があることになる。
そんなめんどくさいわけないはずなので何か見逃しているかもしれない・・・

と思ったけどシンプルにめんどくさいようです。複数ジェスチャーで左右スワイプを認識したい方は

http://akaimo.hatenablog.jp/entry/2015/09/13/214537

ごりごりに一つのジェスチャーで左右どちらも検知したい方は
http://good-morning-call.com/2012/05/06/uiswipegesturerecognizer%E3%81%A7%E5%85%A8%E6%96%B9%E5%90%91%E8%AA%8D%E8%AD%98%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

http://spiratesta.hatenablog.com/entry/20110801/1312165521

## 追記 左右スワイプの簡単な実装（2016/02/17)

以下のような記述をすることで簡単に左右スワイプを認識することができるようです！

```swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let rightSwipe = UISwipeGestureRecognizer(target: self, action: "didSwipe:")
        rightSwipe.direction = .Right
        view.addGestureRecognizer(rightSwipe)

        let leftSwipe = UISwipeGestureRecognizer(target: self, action: "didSwipe:")
        leftSwipe.direction = .Left
        view.addGestureRecognizer(leftSwipe)
    }

    final func didSwipe(sender: UISwipeGestureRecognizer) {

        if sender.direction == .Right {
            print("Right")
        }
        else if sender.direction == .Left {
            print("Left")
        }
    }
}

```

[Sim_progra](http://qiita.com/Sim_progra) さんありがとうございます m(_ _)m
vi ターミナル操作参考サイト

## vi コマンド
vi
http://feb19.jp/blog/archives/000226.php

## viでsudo忘れて、保存できない時の対処方
下記urlを参照
http://dev.koba206.com/?p=298

```
:w
E45: 'readonly' option is set (add ! to override)
 
:w !sudo tee %
Press ENTER or type command to continue
W12: Warning: File "Targets" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:
:q!
```
【初心者向け】playフレームワークの構造




# 目次

- 大まかな仕組み
- ディレクトリ構造の説明
- jarライブラリの説明
- sbtの説明
- 参考リンク

# 大まかな仕組み
## HTTPサーバー
クライアントがPlayアプリケーションにHTTPリクエストを送信した場合、最初にPlayフレームワークの提供する組み込みのHTTPサーバー「Netty」によって受け付けます。
Javaで開発されているOSS(ライセンスはApache License 2.0)で、イベントドリブンな非同期通信を行うアプリケーションを開発するためのフレームワークです。


## MVC

PlayはMVCパターンに基づいてます。
説明は省きます。
https://ja.wikipedia.org/wiki/Model_View_Controller


# ディレクトリ構造


![Kobito.0M3ywS.png](https://qiita-image-store.s3.amazonaws.com/0/71616/5800ea56-ba09-621c-9717-74d0f5308c7b.png "Kobito.0M3ywS.png")

Playアプリのディレクトリ構造（「Documentation: Anatomy ― Playframework」）から引用



## 解説

### conf

設定ファイルを置く場所ですが、他にもevolutions(DBスキーマ履歴管理)用のファイルも置きます。

### lib

使いたいjarライブラリを格納しますが、sbtを使って管理するのでこのディレクトリは必須ではありません。
sbtの管理外にしたいjarライブラリがある場合に置きます。


# jarライブラリの説明

javaの外部ライブラリです。　 *.jar というファイルで提供されます。
これらは、javaのクラスファイル *.class を集めて圧縮したものです。

# sbt(Simple Build Tool)とは？？

scala用のビルドツールです。　
コンパイラと、プロジェクトに必要なパッケージやライブラリの管理を行ってくれるツール

パッケージやライブラリとは？という説明はこちら↓
[【用語のメモ】API、パッケージとライブラリの違い](http://qiita.com/geshi/items/73988c3e1056bb39be9c)

# 参考リンク

http://www.atmarkit.co.jp/ait/articles/1211/29/news013_2.html
https://www.mlab.im.dendai.ac.jp/~yamada/java/ext/
http://www.casleyconsulting.co.jp/blog-engineer/scala/%E3%80%90scala%E5%88%9D%E5%BF%83%E8%80%85%E5%90%91%E3%81%91%E3%80%91sbt%E3%82%92%E8%A7%A6%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%EF%BC%81/
http://ameblo.jp/principia-ca/entry-10629939611.html
CVE-2015-7547 の PoC を試してみた

CVE-2015-7547 の PoC が公開されていたので試した。

- https://github.com/fjserna/CVE-2015-7547

PoC のコードをチェックアウトしてサーバ側を実行。

```sh
git clone https://github.com/fjserna/CVE-2015-7547.git
cd CVE-2015-7547
sudo ./CVE-2015-7547-poc.py
```

リゾルバを 127.0.0.1 に変更。

```sh
sudo cp /etc/resolv.conf{,.orig}
echo 'nameserver 127.0.0.1' | sudo tee /etc/resolv.conf
```

クライアント側を実行。

```sh
cd CVE-2015-7547
make
./CVE-2015-7547-client
```

セグる。

```
Segmentation fault (core dumped)
```

curl でも同じ。

```sh
curl http://foo.bar.google.com
# Segmentation fault (core dumped)
```

`-4` とか `-6` とかを付けて A と AAAA とのデュアルクエリにならないようにすれば大丈夫。

```sh
curl -4 --connect-timeout 10 http://foo.bar.google.com
# curl: (28) Resolving timed out after 10558 millisecond

curl -6 --connect-timeout 10 http://foo.bar.google.com
# curl: (28) Resolving timed out after 10534 milliseconds
```

dig するとおかしなパケットが返ってきている風の結果が表示された。

```sh
dig foo.bar.google.com @127.0.0.1
# ;; Truncated, retrying in TCP mode.
# ;; Got bad packet: bad label type
# 2993 bytes
# :
```

もちろん PHP の curl もセグる。

```sh
php -r '
  $ch = curl_init("http://foo.bar.google.com");
  curl_exec($ch);
'
# Segmentation fault (core dumped)
```

`CURL_IPRESOLVE_V4` とかを指定していれば大丈夫。

```sh
php -r '
  $ch = curl_init("http://foo.bar.google.com");
  curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
  curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  curl_exec($ch);
'
```

http ストリームラッパーはダメ。

```sh
php -r '
  file_get_contents("http://foo.bar.google.com");
'
# Segmentation fault (core dumped)
```

`stream_socket_client` もダメ。

```sh
php -r 'stream_socket_client("tcp://foo.bar.google.com:80");'
# Segmentation fault (core dumped)
```

`fsockopen` もダメ。

```sh
php -r 'fsockopen("foo.bar.google.com", 80);'
# Segmentation fault (core dumped)
```

`socket_connect` は `AF_UNSPEC` にする術がないので大丈夫。

- https://github.com/php/php-src/blob/9360b0c6fc3416a9de1650c0b727e2f04fb913fb/ext/sockets/sockets.c#L1420
hub+peco(fzf)でissueを確認しつつ、issue/[issue番号]でブランチを切る


<!--
[hub]: https://github.com/github/hub
[peco]: https://github.com/peco/peco
[fzf]: https://github.com/junegunn/fzf
[ghi]: https://github.com/stephencelis/ghi
-->

## hubコマンドでissueの一覧を確認する
少し前から、[hub][hub]コマンドでissueやpull requestを確認できるようになりました[^1]。

```bash
$ hub issue
    123] Sample issue ( https://github.com/user/repo/issues/123 ) # issue
    124] Sample issue2 ( https://github.com/user/repo/issues/124 ) # issue
    125] Sample PR ( https://github.com/user/repo/pull/125 ) # pull reques
```

そこで、`hub issue`と、pecoを組み合わせて、issue番号を確認しつつ、`issue/[issue番号]`でブランチを切るのを楽にしてみました。

本当はgitのサブコマンドにでも...と思っていたのですが、結局エイリアスとして、"issue/[issue番号]"を返すものを定義しました。


## 準備するもの

- Git
- [hub][hub]
- [peco][peco] or [fzf][fzf] (あるいはそれ以外、お好みで)

私が試した環境は

```bash
$ hub version
git version 2.7.1
hub version 2.2.2
```

です。

## エイリアスを追加する

以下の記述を、`~/.bashrc`、`~/.zshrc`等に追加してください！

#### peco
pecoはこちらです。

```bash:peco
git-checkout-from-issue() {
  local issues=$(hub issue 2> /dev/null | grep 'issues')
  if [ -z "$issues" ]; then
    echo "issue not found." 1>&2
    return
  fi
  local number=$(echo "$issues" | peco --query "$LBUFFER" | sed 's/^[^0-9]*\([0-9]*\).*$/\1/1')
  if [ -z "$number" ]; then
    return
  fi
  echo "issue/$number"
}
alias -g IB='$(git-checkout-from-issue)'
```

#### fzf
fzfはこちらです。自分がデフォルトで **-m(複数選択を可能にするオプション)**を指定しているので、 **+m**を入れていますが、不要なら除いて大丈夫です。

```bash:fzf
git-checkout-from-issue() {
  local issues=$(hub issue 2> /dev/null | grep 'issues')
  if [ -z "$issues" ]; then
    echo "issue not found." 1>&2
    return
  fi
  local number=$(echo "$issues" | fzf --exit-0 +m --query "$LBUFFER" | sed 's/^[^0-9]*\([0-9]*\).*$/\1/1')
  if [ -z "$number" ]; then
    return
  fi
  echo "issue/$number"
}
 alias -g IB='$(git-checkout-from-issue)'
```

## 使い方

以下のようにコマンドを打てば、issueを確認しつつ、選択したissue番号で現在のブランチからissueブランチが切られます。

```bash
$ git branch
* develop
  master

$ git checkout -b IB
# issueを選択する (例では123番を選択したことにする)
Switched to a new branch 'issue/123'

# alias g=git , co = checkout などとしていれば、
# $ g co -b IB
# で済みますね!

$ git branch
  develop
* issue/123
  master

```

もしissueが存在しない場合や、選択しないで(ctrl-c)などで中断した場合はgitのエラーが出ますが、特に変な挙動をしたりはしません。

## 切るブランチの名前を変えたい!
人や開発環境によっては、

- "issue_[issue番号]"
- "[issue番号]_issue"
- "ticket/[issue番号]"

と切りたい場合もあると思うので、その場合は`git-checkout-from-issue()`の最後の行をいい感じに変えてください！

## `hub issue`の代わりに
[ghi][ghi]というものもあるので、お好みでどうぞ！


[^1]: hub(v2.2.2)現在、issueコマンドの説明に **beta**と書いてあるので、今後制式採用、廃止、表示形式の変更があるかもです。
CVE-2015-7547のRedHat／CentOS系

自分の作業用にまとめ。

# 概要
昨年の今頃話題になったGHOSTの時は、gethostbynameでした。Apacheなどは既にこれを利用していなかったため、影響を受けなかったのですが、今回はgetaddrinfoです。多くのサーバサイドのアプリケーションが影響を受けそうです。

参考
http://blog.trendmicro.co.jp/archives/10818

# 各種情報
RedHatからのお知らせ
https://access.redhat.com/security/cve/CVE-2015-7547

日本語の情報
https://oss.sios.com/security/general-security-20160217

CentOSの情報
https://www.centos.org/forums/viewtopic.php?f=17&t=56467

# 影響を受けるバージョン

glibcのバージョン2.9以降が影響を受けます。現在リリースされているglibcで言うと、2.9～2.22が対象となります。RHELとCentOSにおける影響の有無は以下の通りです。

|OS|glibcのバージョン|影響|修正済みバージョン|
|---|---|---|---|
|RHEL(CentOS)5系|glibc-2.5|なし|-|
|RHEL(CentOS)6系|glibc-2.12|あり|glibc-2.12-1.166.el6_7.7|
|RHEL(CentOS)7系	|glibc-2.17|あり|glibc-2.17-106.el7_2.4|

4系はメンテナンス更新期限が終了しています。5系は今回影響を免れましたが、メンテナンス更新期限が2017年3月31日までです。ご注意ください。あと1年ちょっとしかありませんので、これを機に6に変えても良いかもですね……

# 確認方法
```bash:glibcのバージョンを確認
$ yum -q list installed glibc
```

```bash:glibcを利用しているプロセスを確認
$ lsof | grep 'libc-'
```

# iptables/firewalldでとりあえずふさぐ
こちらの記事が大変参考になります！
http://qiita.com/kawaz/items/1b07429b28851f997dba

# 更新方法
とりあえずフィルタリングで時間を稼いで、glibcの更新は以下の手順になります。

```bash:RHEL6、CentOS6以前の場合
$ yum clean all
$ yum update glibc
```

```bash:RHEL7、CentOS7の場合
$ yum clean all
$ yum update glibc
$ systemctl daemon-reexec
```

# 反映方法

[方法1] OSの再起動
これがベストです。出来ない場合は方法2に。

[方法2] 各種サービスを個別に再起動
影響を受けそうなサービス一覧を出すには、以下の方法でライブラリを読み込んでいるプロセスを確認します。
たぶん、一覧見たら再起動したくなると思いますが……

```bash:updateの前にglibcを使用しているプロセスを確認する
$ lsof | grep 'libc-'
```

```bash:update後にメモリ上の古いglibcを使用しているプロセス確認する
$ lsof -d DEL | grep 'libc-'
```

lsofが入っていない場合は、yum install lsofで入ります。

# その他
必要に応じてタイムゾーンの設定の見直しなどを行います。

参考
http://qiita.com/biatunky/items/231b673832a21f9f9524
nginx + php-fpm で BadGateway 502 が出た

## はじめに
FuelPHPでBadGateway 502が出てしまい悩んだ時の対処方法です。いろいろ調べた結果きモジュール的には問題ないことがわかり、結局はnginxの設定に問題がありました。

環境
FuelPHP 1.7
nginx 1.8
php-fpm-5.6 
php 5.6
Amazon Linux

## 概要
1. nginxのログの参照
2. nginxのパラメータの調整
3. nginxの再起動

## 詳細
----
#### 1. nginxのログの参照
とりあえず何がなんだかわからず起きた時が通常では出ないのですが、エラー発生時のみ発生しておりなんだこりゃって感じになってました。そこでログを参照しました。

```shell-session:/var/log/nginx/error.log 
2016/02/17 11:55:14 [error] 27407#0: *932 upstream sent too big header while reading response header from upstream, ...
```

上記のようなエラーが発生してました。どうやらバッファが足らないようです。


----
#### 2. nginxのパラメータの調整

以下のように設定しました。一旦はこれであとでもう少し調整していきたいと思います。
（参考にしたサイトで少し大きすぎると指摘を受けていますので、今は開発中でしたので最終でチューニングかなと思ってます。）

```shell-session:/etc/nginx/fastcgi_params
fastcgi_intercept_errors        on;
fastcgi_ignore_client_abort     off;
fastcgi_connect_timeout         60;
fastcgi_send_timeout            180;
fastcgi_read_timeout            180;
fastcgi_buffer_size             128k;
fastcgi_buffers                 4       256k;
fastcgi_busy_buffers_size       256k;
fastcgi_temp_file_write_size    256k;
```
----
#### 3. nginxの再起動

あとは反映させるためにnginxの再起動すればOKです。

```shell-session
sudo service nginx restart
```

## あとがき
エラー画面に転送していて結果がでず困りましたが表示できるようにはなったのでよかったです。ある程度モジュールできたらパラメータの調整しなくちゃ・・・

## その他
参考
[Nginxでupstream sent too big headerのエラー対処法](http://www.geek.sc/archives/936)

[Setting Nginx FastCGI response buffer sizes.](https://gist.github.com/magnetikonline/11312172)

## 履歴
ubuntu-12.04.5-server-i386で、sudo apt-get updateに失敗する

ubuntu-12.04.5-server-i386.isoをダウンロードして、VMWare Fusionにインストールした際、
sudo apt-get updateに失敗したのでメモ。

ubuntu12.04.5のインストールは[ここ](http://www.server-world.info/query?os=Ubuntu_12.04&p=install)を参考にしました。
タイムゾーンを、Japanにした以外は基本的にデフォルト(英語)のままインストールしていきました。


インストール後、sudo apt-get updateしようとしたら失敗・・・
###エラー内容
W: Failed to fetch bzip2:/var/lib/apt/lists/partial/jp.archive.ubuntu.com_ubuntu_dists_precise_main_source_Sources  Hash Sum mismatch


###解決策

```bash
sudo vim /etc/apt/sources.list
```
Vimで "jp."を"us."に一括変換

```
:%s/jp./us./g
```

これで、sudo apt-get updateできました。
underscoreコードリーディング（extendOwn）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##extendOwnとは


###[underscorejs.orgのextendOwn](http://underscorejs.org/#extendOwn)

こんな説明。
>####_.extendOwn(destination, *sources) Alias: assign 
>Like extend, but only copies own properties over to the destination object.

------------- 

extendににているけども、destination自身のpropertyだけをコピーします。


###[underscore.extendOwn](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1008)
コード的にはこのあたり。

```javascript

  // Assigns a given object with all the own properties in the passed-in object(s)
  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
  _.extendOwn = _.assign = createAssigner(_.keys);

```

_.assignも同じ。
_.extendは_.allKeysを用いていたが、_.extendOwnは_.keysを用いる。
allKeysはprototypeも引っ張るが、keysはそれは返ってこない。
Pythonで外部コマンドの存在チェック（`which`的な）

Pythonで外部プログラムをあつかう時、実行前に外部プログラムが存在するか確認したかったので調べました。
実行時エラーチェックもできますが、その前に利用可能なことだけ確認したいような場合を想定しています。
または、プログラムのインストールされているパスを調べたいときにも使えます。

外部プログラムは`subprocess.Popen`などで実行する前提です。
Pythonのバージョンは3.5.1と2.7.11で試しました。

## たぶん一番簡単な方法（Python3.3以上）

shutilモジュールの[which関数](http://docs.python.jp/3/library/shutil.html#shutil.which)を使います。
コマンドが実行可能であればコマンドへパスを、見つからなければ`None`を返します。

```py
import shutil

print(shutil.which('ls'))  # > '/bin/ls'
print(shutil.which('ssss'))  # > None
```

## Python3.3未満の使用を強いられている人たちへの救済

`shutil.which`はバックポートされていないのでPython 2.7では使えません。
さっさと3.5以上に移行したほうがいいと思いますが、無理な人もいると思うので、古いPythonでも使える方法を紹介します。

`distutils.spawn.find_executable`で`shutil.which`と同じことができます。
http://stackoverflow.com/questions/5226958/which-equivalent-function-in-python

```py
import distutils.spawn

print(distutils.span.find_executabl('ls'))  # > '/bin/ls'
print(distutils.span.find_executabl('ssss'))  # > None
```

これは知らないと見つからないのでは・・・
3系でもこの方法は使えますが、distutilsはマイナー扱いされてドキュメントもなくなっていました。
http://docs.python.jp/3/library/distutils.html

罠ポイントは

- `shutil`は単数形だけど`distutils`は複数形
- `import distutils`だけだと`spawn`モジュールがインポートされないので`import distuils.spawn`または`from distutils import spawn`する必要がある

などです。
[AAAI16実況配信] Tiebreaking Strategies for A* Search: How to Explore the Final Frontier

経緯を知らない方のためにもう一度。

![2016-02-14 08.53.38.jpg](https://qiita-image-store.s3.amazonaws.com/0/6090/b9ca3593-ab37-fa43-2d7a-92d8aa851b0c.jpeg)

発表のためにAAAI-16に来ています。知らない人も多いかと思いますが、IJCAIとならび、AIの国際学会で最も難関と言われる学会です。個人的には自分もA*の改善論文でPaper Award 密かに狙っていたのですが、Bidirectional Search 論文に取られてしまいました。

Bidi Search論文はすでに紹介したので、今度はおとつい自分で発表した論文のスライドをアップロードしました。

古くからの「迷信」を破る [MythBusters](https://ja.wikipedia.org/wiki/%E6%80%AA%E3%81%97%E3%81%84%E4%BC%9D%E8%AA%AC) 論文です。お納めください。

http://www.slideshare.net/asaimasataro/tiebreaking-strategies-for-a-search-how-to-explore-the-final-frontier