OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7でLinuxカーネルをソースパッケージからビルドする

しばらくぶりにLinuxカーネルパッケージをビルドすると `--without`云々をつけるのを忘れるので

## ソースパッケージの取得
SRPMを取得してインストール

```shell-session
$ cd ~/rpmbuild
$ sudo yumdownloader --destdir=SRPMS --source kernel-3.10.0-327.18.2.el7
$ sudo chown $USER. SRPMS/kernel-3.10.0-327.18.2.el7.src.rpm
$ rpm -ivh SRPMS/kernel-3.10.0-327.18.2.el7.src.rpm
```
## ビルド
パッチファイル作ったりspecファイル編集したのちに
#### mock
```shell-session
$ rpmbuild -bs SPECS/kernel.spec
$ mock --rebuild --target=`uname -m` --with kdump --without debug --without tools --without perf SRPMS/kernel-3.10.0-327.18.2.el7.bit.src.rpm
```
#### rpmbuild
```shell-session
$ sudo yum-builddep SPECS/kernel.spec
$ rpmbuild -bb --target=`uname -m` --with kdump --without debug --without tools --without perf SPECS/kernel.spec
```
ELBのヘルスチェックでデーモンプロセスの死活監視する

よくプロセス落ちててInServiceしてほしくなかったので作ってみました
https://github.com/ngc224/phck

監視するデーモンのPIDファイルパスを設定ファイルに記述して起動すると、
httpリクエストするたびにプロセスの状態をチェックして、正常時は200、監視しているプロセスが1つでも落ちていると500を返します
あとプロセスの情報を返します

通知は他の物で間に合いそうなのでいらないかな
~/.ssh/configの設定（自分用メモ）

## 概要
.ssh/config の設定内容に関する資料。

## .ssh/configとは？
.ssh/configとは、ssh経由でのリモートサーバーの接続する際に利用される設定ファイルです。

## 記載するメリット
sshコマンドでサーバにログインする際のオプション等を省略出来る。
例えば一般的な接続コマンド↓

```bash
ssh ユーザー名@hoge.example.com
```

ユーザー名とホスト名を指定する方法、これはかなり単純な例なので、メリットがあまりないが、下記のようにポート番号がデフォルト(22)では無い場合、公開鍵認証で、鍵がデフォルトの名前ではなかったりした場合、コマンドが複雑になってしまう。

```bash
# ポート名を指定する場合
ssh ユーザー名@ホスト名 -p ポート番号

# 公開鍵認証の場合
ssh ユーザー名@ホスト名 -i ~/.ssh/鍵の名前

# ポート名＆公開鍵認証の場合
ssh ユーザー名@ホスト名 -i ~/.ssh/鍵の名前 -p ポート番号
```

## 設定例

```text:~/.ssh/config
Host *
ServerAliveInterval 60
    ForwardAgent yes
    ForwardX11Trusted yes
    ControlMaster auto
    ControlPath /Users/nishimoto-keita/.ssh/.connect/%r@%h:%p
    ControlPersist 10

Host sshgw
    Hostname 206.209.100.50
    User nishimoto-keita

Host stg
    HostName 206.209.142.22
    User nishimoto-keita
    ProxyCommand ssh -W %h:%p sshgw

Host aws
    HostName 50.11.14.160
    Port 22
    User ec2-user
    IdentityFile ~/.ssh/ec2_keys.pem
```

例えば、206.209.142.22環境にSSHを行う為には、最初に踏む台サーバの206.209.100.50を経由して接続を行う必要があるのだがこちらの設定を行っておけば以下のコマンドで接続出来る。

```bash
ssh stg
```

各項目毎にそれぞれ意味があるのだが、そのあたりは時間がある時にでも追記します。
Dockerコンテナに使える「正しい」軽量init process(PID 1)まとめ

Dockerコンテナの「正しい」init processについては、[Docker and the PID 1 zombie reaping problem](https://blog.phusion.nl/2015/01/20/docker-and-the-pid-1-zombie-reaping-problem/)が詳しいです。

[Docker 1.13からは`--init`オプションでtini相当のinit processを仕込んでくれるようになりました](http://qiita.com/mumoshu/items/064cd93ce116d8e04169#comment-b530f8d6fbce1ed62d9f)(Thanks to @sumomonekoさん :bow:)。以下の内容は`--init`の機能が未だ利用できない場合(K8Sなどでコンテナを動かす、Docker 1.12以前、など)にのみ有効です。

# 1コンテナ単一アプリ対応・superviseなし

## tini

[tini](https://github.com/krallin/tini)

* [Handling of zombie processes would be useful](https://github.com/jenkinsci/docker/issues/54#issuecomment-98173301)
* 静的リンクしたバイナリは[1MB弱。動的リンクなら10KBくらい](https://github.com/krallin/tini#size-considerations)
* 441 stars
* 129 commits
* 20 releases
* superviseの機能はなし

## dumb-init

[dumb-init](https://github.com/Yelp/dumb-init)

* [Introducing dumb-init, an init system for Docker containers](http://engineeringblog.yelp.com/2016/01/dumb-init-an-init-for-docker.html)
* 静的リンクしたバイナリは[700KB。ただし、muslと静的リンクさせて自分でビルドすれば20KB](https://github.com/Yelp/dumb-init#building-with-musl)
* 992 stars
* 158 commits
* 13 releases
* superviseの機能はなし

# 1コンテナ複数アプリ対応・superviseあり

## runit

* 著名なbaseimage-dockerはrunitを使ってますね
  * [Baseimage-docker: A minimal Ubuntu base image modified for Docker-friendliness](http://phusion.github.io/baseimage-docker/)

## s6-overlay

[s6-overlay](https://github.com/just-containers/s6-overlay)

s6というプロセス・スーパバイザをDockerコンテナのinit processとして使うためのツール一式です。

* [S6 Made Easy, with the S6 Overlay | Tutum Blog](https://blog.tutum.co/2015/05/20/s6-made-easy-with-the-s6-overlay/)
* バイナリは[3.4MB](https://github.com/just-containers/s6-overlay#performance)
* 260 stars
* 170 commits
* 45 releases
* superviseの機能あり。
* superviseプロセスをフォアグラウンドで起動できる
* 複数アプリケーションを起動して、特定アプリをメインとしたい場合（例えば、cron、syslog、nginxを起動して、nginx以外は落ちたら再起動、nginxが落ちたらコンテナをエラー終了)はこれが唯一の選択肢?

## Dockerコンテナ内で複数アプリケーションを実行したいときに使われる他のソリューション

* [Using Honcho to Create a Multi-Process Docker Container | via @codeship](https://blog.codeship.com/using-honcho-create-multi-process-docker-container/)
  * HonchoというProcfileベースのアプリケーション用のスーパーバイザ
  * s6-overlay同様、代表的なプロセスが落ちたら、コンテナ自体を落とすことができる
  * ただし、Honchoはinit processではない…ので、「正しく」使いたいなら、他のinit processと組み合わせる必要があり。そうすると、Honchoの必要性は…？
    * プロセス毎にログがわかりやすくラベリングされるのはうれしいけど、Docker Loggingとの相性?

## おまけ: Dockerコンテナのブートストラップに使えるテンプレートシステム

環境変数に応じて、設定ファイルや実行時引数を変えてプロセスを実行したい場合、

* シェルスクリプト等でラップする
* テンプレートシステムを使う
* 上記を組み合わせる

という選択肢があります。

対象となる設定ファイルが複数であったり、変数が多かったり、プロセス数が多かったりする場合は、テンプレートシステムを利用するとよいことがあります。

* [voltgrid](https://github.com/voltgrid/voltgrid-pie)
* [entrykit](https://github.com/progrium/entrykit) (Entrykitはゾンビプロセスをkillしてくれないので、正しいinit processではない認識です。違ってたら誰かこっそりおしえてください)
* [johanhaleby/bash-templater](https://github.com/johanhaleby/bash-templater/) & [Simple templating engine in Bash](http://code.haleby.se/2015/11/20/simple-templating-engine-in-bash/)
* [confd](https://github.com/kelseyhightower/confd) (イメージサイズが20MBくらい増えて、Alpine等でがんばってるイメージが台無しになってしまいそうですが、コンテナ内の設定ファイル・テンプレートファイルの配置が規約化されていたりするなど、複雑なテンプレーティングが必要なイメージには向いている印象)
【WordPress】ショートコードを自作して使用してみる

#【WordPress】ショートコードを自作して使用してみる

***様々な記事の中で繰り返し使用するものがある場合、ショートコードを作成して都度呼び出すと便利です。ショートコードとして持っておくと、定型文の内容に修正があった場合も記事を一つずつ修正する必要がないので保守性、運用効率も良いです。
ちなみに、上記を実現するのにプラグインを使用するなど他にも色々方法はあります。が、今回は自分的にショートコードの作成方法を知りたかったのでショートコードを使用するとした。***

・function.phpにフックを追加し、ショートコードを作成。
今回は商品の値段の定価を入力すると任意の額に15%割引した値段を表示するショートコードを作成

```lang:function.php
<?php

〜〜省略〜〜

//=======================================================
// ショートコードを作成
//=======================================================
function value_price_shortcode($atts) {
	//引数を受け取る
	extract(shortcode_atts(array(
		'org_price' => 0
	), $atts));
	if($org_price){
		//15%引きの値段
    	$value_price = floor($org_price*0.85);
    	return $value_price.'円';
	}else{
		return null;
	}
}
```

・投稿記事に以下のように（[value_price org_price = 100]）ショートコードを記述
<img width="882" alt="記事投稿.png" src="https://qiita-image-store.s3.amazonaws.com/0/97158/e183c2c4-58a3-ab86-119a-8ff939143348.png">


・投稿を公開し、確認
<img width="1060" alt="ショートコード表示.png" src="https://qiita-image-store.s3.amazonaws.com/0/97158/df713683-bdc5-3ea4-c9e9-431a79801910.png">


割引された値段に"円"という文字が付与されて表示されています！

割引率を変えたい場合はショートコードから呼ばれるfunction（value_price_shortcode）の計算部分を変更すればこのショートコードを呼び出している全ての記事に反映されます。

こんな感じで色々な場面で利用できます。
GitHub「Personal access tokens」の設定方法

GitHub APIで色々やるための準備作業。
ここではリポジトリに対して操作可能なTokenを設定してみる。

# Tokenを取得する
1. [GitHub](https://github.com/)を開いて**Settings**をポチる。
![2016-06-15_173242.png](https://qiita-image-store.s3.amazonaws.com/0/120234/055b017c-2c0b-aaa4-3130-8721d70e8ed9.png)

2. 左メニューから**Developer settings**をポチる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/7c319c05-a019-b3ab-a67a-e17da4270ade.png)

3. 左メニューから**Personal access tokens**をポチる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/2d304cb7-8b97-b915-7496-1e3a0979e964.png)
**Personal access tokens**をクリックして開く画面は↓なので、1~3をやらずに下記URLを直接開いてもOK。
https://github.com/settings/developers

4. 右上の**Generate new token**ボタンをポチる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/15cc64e4-16c6-c24c-290a-efb15422668c.png)

5. 必要項目を入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/2c5879e0-1c4d-c0f1-8768-e1b6aacb5faf.png)
**Token description**にトークンの任意の名前を設定。
**Select scopes**の**repo**にチェックをつける。

6. Tokenを生成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/120234/8e7b83c4-a186-0f31-e9f7-6f735527d323.png)

7. 生成されたTokenを覚える（緑色の部分）
![2016-06-14_170115.png](https://qiita-image-store.s3.amazonaws.com/0/120234/e03bfe3a-fca3-eb8a-56b3-2995a60c2a40.png)

以上でリポジトリ操作が可能なTokenの取得が完了する。

# Tokenを忘れた場合
忘れたTokenの**Edit**ボタンから編集画面を開き、
**Regenerate toke**ボタンをポチると即座に新しいTokenを生成してくれました。

![2016-06-15_181001.png](https://qiita-image-store.s3.amazonaws.com/0/120234/57aca05e-1971-5fd9-16b5-4aa88f957c35.png)
GCEのlinuxでcronの設定


# cronとは
ジョブ(スクリプト)を実行するためのデーモンプロセス。
定期的に実行したいプログラムがあったときに、毎日自分で実行する必要はありません！

**デーモン**
LinuxやUNIXにおいてメモリ上に常駐して様々なサービスを提供するプロセスのこと。

**デーモンプロセス**
処理要求を待ち続け、要求があると自分自身をコピーしたプロセスを作り、コピーしたプロセスに処理を実行させる。

**プチ情報**
デーモンの意味は、悪魔の[demon]ではなく、守護神の[daemon]だそう。そのため、デーモンとして動作するプログラムは、伝統的にプログラムファイル名(プロセス名)の最後に[d]がつけられている。

# cronを設定する
cronを設定するためのコマンドは以下
 `crontab [-u ユーザ名] {-e|-l|-r}` 
 
| コマンド     | 内容 |
|------------:|:------------:|
|        -e |     cronのファイルを編集する     |
|        -l |    cronの内容を表示    |
|        -r |     cronの内容を削除(全部消えるので注意！) 


## cronの書き方
 `crontab -e` でcronの編集画面に移動してから下記を記入する。
 
 `* * * * * [実行コマンド]` 
 * の設定項目は左から、**[分] , [時] , [日] , [月] , [曜日]**で設定。設定可能な数値は以下。
 
| 設定項目     | 値 |
|------------:|:------------:|
| 分 | 0-59 |
| 時 | 0-23 |
| 日 | 1-31 |
| 月 | 1-12 |
| 曜日 | 0-7 (0=日, 1=月, 2=火〜7=日) |

### 【基本編】具体的にcronを書いてみる
**`55 * * * * sh /var/sample/makedir.sh`**
毎時55分に `makedir.sh` を実行。

**`55 23 * * * sh /var/sample/makedir.sh`**
毎日23時55分に実行。

**`55 23 20 * * sh /var/sample/makedir.sh`**
毎月20日の23時55分にを実行。

**`55 23 20 3 * sh /var/sample/makedir.sh`**
3月20日の23時55分にを実行。

**`55 23 * * 0 sh /var/sample/makedir.sh`**
毎週日曜日の23時55分に実行。

### 【応用編】具体的にcronを書いてみる
**`55 23,12 * * * sh /var/sample/makedir.sh`**
12時55分と23時55分に実行。

**`*/10 * * * * sh /var/sample/makedir.sh`**
10分おきに実行。

こんな感じで設定します！
毎日手でプログラムを叩く生活とはおさらばです！
Themeを使わずにAppCompt SearchViewのカスタマイゼーション

いろんな原因でthemeの使用を諦めてコードでAppcomptのSearxchViewをカスタマイズしたいです。一番詰んだのはSearchIconの削除です。ソースコードは下記の通りです。ご参考になれれば幸いです。

要注意のは```
searchView.setIconifiedByDefault(false);
```先に設定しないとSearchIconにどんなに弄っても消えないです

コード

```
 SearchView searchView = (SearchView)findViewById(.....);
// hint text color
((EditText)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)).setHintTextColor(.....);
// query text color
((EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)).setTextColor(.....);
// remove search view underbar
searchView.findViewById(android.support.v7.appcompat.R.id.search_plate).setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent));
// set close button image
((ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn)).setImageResource(.....);
// remove search icon
searchView.setIconifiedByDefault(false);
ImageView image = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon);
image.setAdjustViewBounds(true);
image.setMaxWidth(0);
image.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
image.setImageDrawable(null);
// set query hint sting
searchView.setQueryHint(.....);
```

間違ったところがあったらご指摘いただけると幸いです。
Electron1.xにしたらremoteやmenuが見つからない！

Electron 1.1.2にアップデート（`$ npm update`）したら動かなかったのでGoogle大先生に助けを求めたら、[このページ](http://akabeko.me/blog/2016/05/electron-7/)を見つけたのでメモ

`remote`を

```js
var remote = require('remote')
```

から、

```js
var remote = require('electron').remote
```

にするのと、`remote` 下のモジュール(`Menu`,`dialog`など)を`remote.require("module-name")`から`remote.moduleName`にする

※ モジュール名はlowerCamelCaseにする
（ただし、`Menu`や`MenuItem`,`BrowserWindow`などの`new`できるコンストラクタはUpperCamelCaseにすること。）
コマンドライン引数でカンマ区切りで値を受け取る時の挙動について

コマンドライン引数ARGVで値を受け取る時の挙動についてです。
ターミナルで下記のように、カンマ区切りでコマンドライン引数を渡して、受け取る時に、ARGVで配列として値を受け取れます。

```bash
$ ruby hoge.rb 1, 1, 1
```

数字を入力しても、文字列として受け取るので、数字として扱いたい場合は`to_i`メソッドで変換する必要があります。
`p ARGV`なんかで出力を確認してみると、しっかりカンマが入っているので、deleteメソッドなどでカンマを削除しようとしていました。deleteメソッドなどを使うとなぜかRspecなどでエラーが出てしまい困ったいました。
しかし、こんなことしなくてもto_iメソッドだけで数字として扱うことができました。

ここら辺の挙動がよくわからないので、もっと勉強します。
pictを使って複数パラメータを掛け合わせた有効な最少テストケースを洗い出す

複数パラメータを掛けあわせた有効なテストケースを全て網羅するのって辛いですよね
pairwiseという方法を使ってテストの質を落とさずに組み合わせに必要なテストケース数を削減することが可能です  

pairwiseを採用している[Microsoft/pict](https://github.com/Microsoft/pict)を使って有効なテストケースを洗い出す方法を確認します  

1. pictを[ダウンロード](https://github.com/Microsoft/pict)して展開
2. 手順に従い `make` -> `make test`
3. ソースとなるテキストデータを作成する

```:source.txt
week: sun, mon, tue, wed, thu, fri, sat
month: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
day: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
```
4. `./pict source.txt` で実行

```:result
week	month	day
wed	7	11
thu	5	26
(中略)
fri	7	30
mon	12	26
```

こんな感じで必要なテストケースが表示されます
全パターン網羅する場合よりは少なくなっているはずです
github で SSH の非公開鍵に紐づいているユーザーを確認する


単純なのですが以下のようにすることで、その非公開鍵に紐づいているユーザーを調べられます。
Hi の後が、紐付いているユーザーです。

```sh
$ ssh -i ~/.ssh/id_rsa git@github.com
PTY allocation request failed on channel 0
Hi takakiNG! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

```

意外と知られていなかった。。。
JavaScriptのindexOfで二つ目のindexを得る


```js
var str = 'hoge hoge hoge'; // これの二つ目のhogeの位置が知りたい
var idx = str.indexOf('hoge', str.indexOf('hoge') + 1);
console.log(idx); // 5が得られる
```
indexOfの第二引数が検索を開始する位置なので、もう一個indexOfで探した結果に+1すれば次に出現するhogeの位置がわかるということです。めんどくさいです。
CreateWebflow SOAP API with SoapUI 5.2.1


## "Create Webflow!" SOAP API with SoapUI 5.2.1

 cf. http://www.createwebflow.jp/function/api.html

![xFlow_SoapUI.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/6d2e10d7-c2eb-b16a-2128-068804f479e6.jpeg)

### doSelectWorkflowStatusWithSearch
```xml:/XFV20/services/wsWorkflowStatusManager.wsWorkflowStatusManagerHttpSoap11Endpoint/
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stat="http://status.server.soap.xFlow.itarchitects.co.jp">
   <soapenv:Header/>
   <soapenv:Body>
      <stat:doSelectWorkflowStatusWithSearch>
         <!--Zero or more repetitions:-->
         <stat:criteria>APPLYER_MEMBER_ID</stat:criteria>
         <stat:criteria>A10007</stat:criteria>
      </stat:doSelectWorkflowStatusWithSearch>
   </soapenv:Body>
</soapenv:Envelope>
```


### doSelectWorkflowMemberStatus
```xml:/XFV20/services/wsWorkflowStatusManager.wsWorkflowStatusManagerHttpSoap11Endpoint/
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stat="http://status.server.soap.xFlow.itarchitects.co.jp">
   <soapenv:Header/>
   <soapenv:Body>
      <stat:doSelectWorkflowMemberStatus>
         <!--Optional:-->
         <stat:workflowID>A10007_20160614140943258</stat:workflowID>
      </stat:doSelectWorkflowMemberStatus>
   </soapenv:Body>
</soapenv:Envelope>
```

### login
```xml:/XFV20/services/wsAuthenticationManager.wsAuthenticationManagerHttpSoap11Endpoint/
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:auth="http://auth.server.soap.xFlow.itarchitects.co.jp">
   <soapenv:Header/>
   <soapenv:Body>
      <auth:login>
         <!--Optional:-->
         <auth:userID>administrator</auth:userID>
         <!--Optional:-->
         <auth:password>administrator</auth:password>
      </auth:login>
   </soapenv:Body>
</soapenv:Envelope>
```
Wordpress カスタム投稿タイプの作り方

# まえがき
Wordpress でカスタム投稿を作るのに都度 <a href="http://wpdocs.m.osdn.jp/" target="_blank">Codex</a> 見に行ってたけど、いい加減覚えようと思い、メモ。
カンニングシートでもあるけど。

# functions.php にコードを追加
カスタム投稿タイプを作るために `functions.php` にコードを追加します。
細かい設定は <a href="http://goo.gl/Sqgk2o" target="_blank">Codex</a> を参照してください。

```php:functions.php
function create_post_type() {
  $exampleSupports = [  // supports のパラメータを設定する配列（初期値だと title と editor のみ投稿画面で使える）
    'title',  // 記事タイトル
    'editor',  // 記事本文
    'thumbnail',  // アイキャッチ画像
    'revisions'  // リビジョン
  ];
  register_post_type( 'example',  // カスタム投稿名
    array(
      'label' => 'テストカスタム投稿',  // 管理画面の左メニューに表示されるテキスト
      'public' => true,  // 投稿タイプをパブリックにするか否か
      'has_archive' => true,  // アーカイブを有効にするか否か
      'menu_position' => 5,  // 管理画面上でどこに配置するか今回の場合は「投稿」の下に配置
      'supports' => $exampleSupports  // 投稿画面でどのmoduleを使うか的な設定
    )
  );
}
add_action( 'init', 'create_post_type' ); // アクションに上記関数をフックします
```

# カスタム投稿タイプにタクソノミーを追加する
上記で追記した設定だけでもカスタム投稿タイプは出来ますが、カスタム投稿タイプに独自のタクソノミー（カテゴリ的なもの）を追加しなければならない案件が多いと思うので、更に `functions.php` にコードを追加します。
追加する位置は先程の `create_post_type()` の中に追加してください。

```php:functions.php
register_taxonomy(
  'example_taxonomy',  // 追加するタクソノミー名（英小文字とアンダースコアのみ）
  'example',  // どのカスタム投稿タイプに追加するか
  array(
    'label' => 'テストタクソノミー',  // 管理画面上に表示される名前（投稿で言うカテゴリー）
    'labels' => array(
      'all_items' => 'タクソノミー一覧',  // 投稿画面の右カラムに表示されるテキスト（投稿で言うカテゴリー一覧）
      'add_new_item' => '新規タクソノミーを追加'  // 投稿画面の右カラムに表示されるカテゴリ追加リンク
    ),
    'hierarchical' => true  // タクソノミーを階層化するか否か（子カテゴリを作れるか否か）
  )
);
```

# 追記したコードのまとめ
今回の例で言うと最終的に `functions.php` は下記のようなコードになります。

```php:functions.php
// アイキャッチ画像を有効
add_theme_support('post-thumbnails');   // カスタム投稿タイプ example で thumbnail を使うので追記

// カスタム投稿タイプ作成
function create_post_type() {
  $exampleSupports = [
    'title',
    'editor',
    'thumbnail',
    'revisions'
  ];

  // add post type
  register_post_type( 'example',
    array(
      'label' => 'テストカスタム投稿',
      'public' => true,
      'has_archive' => true,
      'menu_position' => 5,
      'supports' => $exampleSupports
    )
  );

  // add taxonomy
  register_taxonomy(
    'example_taxonomy',
    'example',
    array(
      'label' => 'テストタクソノミー',
      'labels' => array(
        'all_items' => 'タクソノミー一覧',
        'add_new_item' => '新規タクソノミーを追加'
      ),
      'hierarchical' => true
    )
  );
}

add_action( 'init', 'create_post_type' );
```
# カスタム投稿タイプ用のファイルを追加する
追加した投稿タイプを表示させるために phpファイルを作成します。
今回の例で言うと下記のようなファイルを追加します。

- `archive-example.php`　カスタム投稿タイプ「example」のアーカイブページ
- `single-example.php`　カスタム投稿タイプ「example」の記事ページ
- `taxonomy-example_taxonomy.php`　追加したタクソノミーページ

これであとは各phpファイル内で、投稿を表示させるコードを記述すれば大丈夫です。
今回はカスタム投稿タイプの作り方と言う事なので投稿を表示させるコードは割愛します。

ただ、カスタム投稿タイプは初期状態だとパーマリンクがイケてないので <a href="https://goo.gl/7ZxdN8" target="_blank">Custom Post Type Permalinks</a> というプラグインでイイ感じにしてあげてください。
プラグインの使い方は割愛します。

# 参考サイト
<a href="http://goo.gl/Sqgk2o" target="_blank">WordPress Codex日本語版（関数リファレンス/register post type）</a>
<a href="http://goo.gl/f4fyy8" target="_blank">WordPress Codex日本語版（関数リファレンス/register taxonomy）</a>
<a href="http://goo.gl/PQKa7e" target="_blank">WordPressの使い方とカスタマイズ｜WordPressの実</a>
ActiveRecord::Base.transactionブロックが正常終了する例外としない例外

## `ActiveRecord::Rollback`は正常終了するので後に書いた処理が走る

```rb

def execute
  result = false
  ActiveRecord::Base.transaction do
    # なんか処理
    raise ActiveRecord::Rollback # <= ここで例外(ActiveRecord::Rollback)は

    # いろいろ処理
    result = true
  end
  result # <= ここ通る
end
```

## `ActiveRecord::Rollback`以外は正常終了しないので後に書いた処理は走らず、該当rescueまで飛ぶ
```rb

def execute
  result = false
  ActiveRecord::Base.transaction do
    # なんか処理
    hoge.save!  # <= ここで例外(ActiveRecord::RecordInvalid)は

    foo.bar() # <= ここで例外（Custom::Error）も

    # いろいろ処理
    result = true
  end
  result # <= ここ通らない
rescue Custom::Error, ActiveRecord::RecordInvalid
  # 例外対応
end
```
WiFi.begin() で前回したAPに再接続してしまう

## 現象
[前の記事](http://qiita.com/Kaz_Macintosh/items/72ab17e46a9b2912b8d6)ではWi-Fiでアクセスポイントに接続するプログラムを書きましたが、ここで不思議な現象に遭遇しました。WiFi.begin()で指定したAPではないAPに接続してしまったのです。ちゃんとSSIDをしているのになぜ？？

そこで思い出したのは、どこかで見かけた
>WiFi.begin("","")とすると前回接続したAPに接続される

という記事。
そのときはへ〜としか思ってなかったですが、もしかして与えたパラメーターは関係無いんじゃないかと思いました。

## 実験してみる(1)
[前の記事](http://qiita.com/Kaz_Macintosh/items/72ab17e46a9b2912b8d6)のプログラムのWIFI_SSID_1に無効な内容を設定し、WIFI_SSID_2に有効な内容を設定して実行してみました。必ず1は失敗し、2に繋がるのが想定する動作です。

**結果**

+ 1回目は、1は接続失敗、2に接続成功　（期待通り）
+ リセットして2回目は、1で接続成功　（なんでやねん）
+ リセットして3回目は、1回目と同じ

なんか変！
なぜか指定したSSIDではなく、リセット前に接続していたSSIDで接続をしているようでした。これは仕様なのでしょうか・・・。そういえば WiFi.printDiag(Serial); を入れたとき、こんな出力がありました。
>Auto connect: 1

もしかしてオートコネクトが有効になっていると、与えたパラメーターに関係無く、前回の接続先に再接続してしまうのでしょうか。

## 実験してみる(2)
そういえばリセットするときにWi-Fiは接続した状態のままだったと思い、リセットをする前に切断するようにしてみました。
``` WiFi.disconnect();```

**結果**

+ 必ず1→2の順番で接続するようになった。（期待通り）

## 考察（よくわかってない）
ということで、Wi-Fiに接続したままリセット（起動）すると、WiFi.begin()は与えたパラメーターに関わらず前回接続時のAPに接続し、ちゃんと切断すると、WiFi.begin()は与えたパラメーター通りに接続する、という現象が確認できました。

「Auto connect: 1」になっているからだと言うと辻褄が合うのですが、あまりよくわかりません。
不要ファイルを低い優先度と低いI/O負荷で削除する

ディスクを圧迫してるファイルがあって消すことになりまして、その備忘録です。

#### findで対象を特定してリスト化、対象ファイルが正しいことを確認

とりあえず容量を計測してみる（以下だと8日より古い、prefix-からはじまるファイル）

```
/bin/find /path_to_dir/prefix-* -type f -mtime +8 -exec ls -lk {} \;|awk '{total +=$5};END{print total}'
```

リストにする

```
/bin/find /path_to_dir/prefix-* -type f -mtime +8 -exec ls -lk {} \;|awk '{print $10}' > 0614.txt
cat 0614.txt|head
cat 0614.txt|wc -l
```

ファイル数をみたかんじ手動をあきらめてforループすることにしました。

#### chef的にcronのMR(PR)をつくる

```
vi /path_to_recipe/del_log_batch.rb
------------------------------------------------
cron "delete local log" do
  user "root"
  command "/bin/find /path_to_dir/prefix-* -type f -mtime +8 -delete"
  hour "1"
  minute "30"
end
------------------------------------------------
git checkout -b add-dellog-cron
git add /path_to_recipe/del_log_batch.rb
git commit -m 'add cron of delete log'
git push
```
こんな感じでchefレシピを書いて適用するとcron登録されます。

#### nice,ioniceで優先度をさげてループで事前削除

合計を計ったらTBな量だったのでcronで消される前に地道に消して瞬間的なI/O負荷を避けようと。
優先度最低で、ベストエフォートでディスクI/O優先度も最低で対象ファイルをループで削除。

[その ionice、ほんとに効いてますか？](http://www.slideshare.net/narimichitakamura/ionice)　に書かれてるとおり、writeだと特殊フラグ立ててないとダメらしく効いてない可能性が高い気がするんですがまあsleepはさんでるし負荷は大丈夫でしたよ。。

`-n`で変数に値が入っていて`-f`でファイルが存在するときのみ実行する。
ファイルが無ければスキップされる為、sleep時間を変えたくて再実行の際も同じコマンドを使えます。

```
for i in `cat 0614.txt`
do 
echo $i
if [ -n $i ]
then
  if [ -f $i ];then
    nice -n 19 ionice -c 3 rm -f $i
    uptime
    sleep 8
  fi
fi
done
```

sleepの秒数はファイル数多いとその分時間がかかりまして、1000ファイル以上もあるのに40秒とかにすると帰れないことになるので注意が必要です。
一応別窓でなんとなく`iostat`などを流しておきます。

```
$ iostat 2 10000
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.47    0.00    3.70    0.00    0.00   90.83

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
xvda              2.00         0.00        16.00          0         80
xvdb              0.00         0.00         0.00          0          0
xvdc              0.00         0.00         0.00          0          0
xvdf             12.00         0.00       240.00          0       1200
```

大事なことなので2回書きますと変数の中身が入ってるかどうかはチェックしないと心配といいますか、
季節はずれの寒い話になりかねないので注意が必要です。

削除しきったらdfで容量確認と、Chef適用するとcron登録されるので確認します。

```
df -h
crontab -l
# Chef Name: delete local log
30 1 * * * /bin/find /path_to_dir/prefix-* -type f -mtime +8 -delete
```

#### 参考：
https://www.upken.jp/kb/linux-nice-ionice.html
http://blog.father.gedow.net/2012/10/23/linux-command-for-trouble/#diskio-iostat
http://www.slideshare.net/narimichitakamura/ionice
http://www.nari64.com/wp-content/uploads/2015/02/thesis_takamura.pdf
git 2.9 の Beautiful diffs を活かす設定

昨日リリースされた git 2.9 の新機能のうち [Beautiful diffs](https://github.com/blog/2188-git-2-9-has-been-released#beautiful-diffs) 関連の設定を自分の gitconfig に足してみたのでそのメモ。

# 設定ファイル
## gitconfig
`diff-highlight` が使えない場合は cat にフォールバックするとか、コピペするだけで使えるよう環境に配慮もしてみた。軽く動作確認したところ問題なく動いてる。

```diff:~/.gitconfig
diff --git a/config/git/config b/config/git/config
index 3b78506..971396f 100644
--- a/config/git/config
+++ b/config/git/config
@@ -15,6 +15,14 @@
   open = browse
 [core]
   autocrlf = false
+[pager]
+  log  = (diff-highlight 2>/dev/null || cat) | ${PAGER:-less}
+  show = (diff-highlight 2>/dev/null || cat) | ${PAGER:-less}
+  diff = (diff-highlight 2>/dev/null || cat) | ${PAGER:-less}
+[interactive]
+  diffFilter = (diff-highlight 2>/dev/null || cat)
+[diff]
+  compactionHeuristic = true
 [merge]
   ff = false
 [pull]
```

## bashrc
あとは `diff-highlight` への PATH 通しだが、無闇に PATH を追加するのは好きじゃないので PATH が通ってるはずの場所に実体への symlink を作ることにする。
また、それを各環境毎に手でファイルコピーしたりとかは絶対忘れるので、この準備作業自体も自動化しておく。

```bash:~/.bashrc
# diff-highlight がローカルにあれば使えるようにする
if ! PATH=~/bin:$PATH type -P diff-highlight >/dev/null 2>&1; then
  (
  for prefix in /usr/local /usr "$DOTFILES_LOCAL"; do
    for path in share/git-core/contrib/{,diff-highlight/}diff-highlight; do
      if [[ -f $prefix/$path && -x $prefix/$path ]]; then
        ln -sfn "$prefix/$path" "$DOTFILES_LOCAL/bin/diff-highlight"
        exit
      fi
    done
  done
  )
fi
```

ローカルに見つからなかったら最終手段で [最新の diff-highlight](https://github.com/git/git/blob/master/contrib/diff-highlight/diff-highlight) を直接DLする処理を足そうかと思ったけど、よく考えたら `diff-highlightが見つからない環境 == git-2.9未満` だろうからあっても意味ないと思ってそれはしてない。
GridEngine で、キューを追加する

# 概要

GridEngine にキューを追加したいので、調べてみた。

# 結論

```
qconf -aq キューの名前
```

このコマンドを実行すると、エディタが起動する。

## 実行ホストを追加する。

マシンをそのまま追加するときは、

```
hostlist
```

を編集する

## 編集する

```
qconf -mq 編集したいキュー
```

# 実際に使ってみて確認

## ジョブを投げる

```
echo "hostname" | qsub -q 追加したキュー
```

出力

```
Your job 144 ("STDIN") has been submitted
```

## 確認１、実行が終わる前まで

```
qstat -j 144
```

## 確認２，実行がおわったあと

```
qacct -j 144
```

queue, hostname などを確認する

# その他

## キューの一覧を見る

```
qconf -sql
```

# 参考情報

* [SGE Queues](http://www.softpanorama.org/HPC/Grid_engine/sge_queues.shtml)
DrupalでDBTNGを使った際に生成されるSQLを確認する

メモするほどでもないけど、たまに使いたいんだよな...
ってことが過去に何度かあったためメモしておく。

```php
  $query = db_select('draggableviews_structure', 'ds');
  $query->join('field_data_title_field', 'fdtf', 'ds.entity_id = fdtf.entity_id');
  $query->fields('ds', array('entity_id', 'weight'));
  $query->fields('fdtf', array('title_field_value'));
  $query->condition('fdtf.entity_type', 'node');
  $query->condition('fdtf.bundle', 'hoge');
  $query->condition('fdtf.deleted', 0);
  $query->condition('ds.view_name', 'piyo');
  $query->condition('ds.view_display', 'page');
  $query->condition('ds.args', json_encode($arguments));

  // here!!
  watchdog('DEBUG', $query->__toString(), array(), WATCHDOG_DEBUG);
  watchdog('DEBUG', dpr($query->getArguments(), TRUE), array(), WATCHDOG_DEBUG);

  $result = $query->execute()->fetchAll();
```
ESP-WROOM-02で複数ある中から接続可能なAPに接続する

## ESP-WROOM-02を使えばArduinoで簡単にWi-Fi接続ができる
今までArduinoではLチカしかやったことがなく、その後は買って満足して放置していたのですが、ESP8266というWi-Fiモジュールがあるのを知りました。1週間前にESP-WROOM-02を入手し、いろいろと遊んでいるうちに不便なところが出てきました。

## 1つのアクセスポイントにしか接続できない
異なる接続先に接続するには、そのたびにプログラム中のSSIDやパスフレーズの部分を書き換えなくてはなりません。会社、自宅、外出先（iPhoneのテザリングとか）、再コンパイル無しで繋がると便利です。

そこで、繋がるところに繋がってくれるようにしてみました。
（※ESP-WROOM-02 単体で使用）

##プログラム
```c:wifi_init.ino
#define WIFI_SSID_1  "xxxx"
#define WIFI_PASS_1  "xxxx"
#define WIFI_SSID_2  "xxxx"
#define WIFI_PASS_2  "xxxx"

void wifi_connect() {
  int i, loop;
  int stat;

  WiFi.mode(WIFI_STA);
  //WiFi.printDiag(Serial);

  while (true) {
    for (loop = 1; loop <= 2; loop++) {
      Serial.print("WiFi(");
      Serial.print(loop);
      Serial.println(") Connecting...");
      if (loop == 1) WiFi.begin(WIFI_SSID_1, WIFI_PASS_1);
      else if (loop == 2) WiFi.begin(WIFI_SSID_2, WIFI_PASS_2);

      for (i = 0; i < 50; i++) {
        stat = WiFi.status();
        if (stat == WL_DISCONNECTED) {
          delay(500);
        } else if (stat == WL_NO_SSID_AVAIL || stat == WL_CONNECT_FAILED) {
          Serial.println("WiFi Failed. Connect to another AP");
          break;  // break to for(i)
        } else if (stat == WL_CONNECTED) {
          Serial.println("WiFi connected!");
          Serial.print("IP address: ");
          Serial.println(WiFi.localIP());
          break;  // break for(i)
        }
      }
      if (stat == WL_CONNECTED) break;  // break for(loop)
      WiFi.disconnect();
      delay(1000);
    }
    if (stat == WL_CONNECTED) break;  // break while(true)
    delay(5000);
  }
}
```

## プログラムの説明
見ての通り WIFI_SSID_1 と WIFI_SSID_2 の2つのSSIDを定義しています。はじめに1に接続を試みます。指定したSSIDが見つからなかった場合や、認証エラー等で接続に失敗した場合は、即座に2に接続を試みます。もし1と2ともだめなら、5秒待機してもう一度1からやり直します。

**実行例**
> WiFi(1) Connecting...
WiFi Failed. Connect to another AP
WiFi(2) Connecting...
WiFi connected!
IP address: 192.168.0.xxx

##最後に
今回は2種類しか設定しませんでしたが、3,4,5と数を増やしていけば簡単に接続先のAPを増やせます。ちなみに私はC言語をあまり理解できていないので（おまけにQiitaも今日が初めて）、変な書き方をしているところがあるかもしれません。こうやった方がいいよ！ってゆうのがありましたら、教えていただけると嬉しいです。
バッチファイルで簡易コマンドラインランチャーを作る

素人の備忘録。

# 動機
コマンドラインランチャーがほしい。
職場のPCでソフト入れられない。
自分で作るスキルはない。

ということで適当に簡素なものを作ったところ、自分には十分なものが出来てしまい、私物のPCでもこれを使うようになってしまった…

# 解決策
## ランチャー本体
バッチファイルで簡素に作った。

```bat:A-Launcher.bat
@echo off
title A-Launcher
cd D:\A-Launcher
set lnkname=
:start
set /p lnkname=""
if /i "%lnkname%" == "q" (
    exit
) else if not %lnkname:.lnk=% == %lnkname% (
    if exist %lnkname% (
        start %lnkname%
    ) else (
        goto start
    )
) else (
    if exist %lnkname%.lnk (
        start %lnkname%.lnk
    ) else (
        goto start
    )
)
```

`title`と`cd`先のフォルダは適当に。
この例では`D:\A-Launcher`以下にショートカット(.lnkファイル)を詰め込む。
入力したショートカット名が存在すれば起動し、ない場合は入力に戻る。
qを入力すると閉じる。

適当に作った割にTabキーで補完も効くので意外と便利。
入力に.lnkが入っているかどうかで処理を分けているので、例えば`gvim.lnk`を起動したいときに、`gvim`と手入力しても、補完で`gvim.lnk`を選んでもどちらでも起動する。

バッチファイルをそのまま実行すると普段のコマンドプロンプトが開いてしまう。
バッチファイルのショートカットから起動するようにすると、ウインドウサイズをランチャ専用に記憶してくれるので便利。
文字サイズ72、幅20、高さ1などとして画面右上に置くとそれっぽいかもしれない。

![A-Launcher.png](https://qiita-image-store.s3.amazonaws.com/0/110101/3d0b3032-1d55-ae00-aea2-f31de0bbe6df.png)

## 起動の仕方
Windows純正の機能でやる場合はバッチファイルのショートカットにプロパティからショートカットキーを設定する。
AutoHotkeyなどでショートカットキーを設定してもよい。

以下は左右Shift同時押しでランチャーを起動する例。
一応多重起動はしないようにした。

**追記[2016/06/16]**
ウィンドウタイトルの指定だけではA-Launcherフォルダなどを開いているとランチャーを起動できなくなってしまうので、exeの指定も入れた。

**追記[2016/07/07]**
Shiftキー二連打でも起動したかったので修正。

```ahk:AutoHotkey_example
;; 左右のShift同時押しでランチャ起動
LShift & RShift::
    IfWinExist, A-Launcher ahk_exe cmd.exe
    {
        WinActivate, A-Launcher ahk_exe cmd.exe
    }
    Else
    {
        Run, "D:\A-Launcher\A-Launcher.lnk"
    }   
Return

;; Shift二連打でランチャ起動
$Shift::
    KeyWait, Shift, T0.3
    If (A_PriorHotkey == A_ThisHotkey) && (300 > A_TimeSincePriorHotkey)
    {
        IfWinExist, A-Launcher ahk_exe cmd.exe
        {
            WinActivate, A-Launcher ahk_exe cmd.exe
        }
        Else
        {
            Run, "D:\A-Launcher\A-Launcher.lnk"
        }
    }
    return
```

# 蛇足
なんでA-Launcherなどという名前にしたかというと、特攻野郎Aチームの工作シーンのノリで作ったからです。
飛行機だけは勘弁な！
復元ポイントをプログラムから有効にする

#復元ポイントを作成する
http://qiita.com/skuromaku/items/ef260ac286d13d2cbe11
復元ポイントを作成する方法は上記に記載した通り。
しかし、復元ポイントの機能が「無効」になっているとエラーになってしまう。

#復元ポイントを有効にする
```csharp
var obj = new System.Management.ManagementClass(@"root\default:SystemRestore");
obj.InvokeMethod("Enable", new object[] { "" });
```
これでCドライブの復元ポイントが有効になる。
他のドライブのときには```new object[] { "D" }```とかしたらええんかな？未検証。

参考
https://technet.microsoft.com/ja-jp/security/aa378858(v=vs.80)
Electronでパッケージ化させるとき

# Electronでパッケージ化
Electronで作成したプロダクトを配布する際に行うコマンド

```bash
electron-packager ./[パッケージしたいプロジェクト] [パッケージする名前] --platform=darwin,win32 --arch=x64 --version=[electronのversion] --asar
```
Gradle 2.13をalpineで動かそうとしたらエラーになった


ビルドサーバーでAlpine Linuxを使ってビルドしてたらエラーになりました。

## エラー

こんなん。

```
Unzipping /root/.gradle/wrapper/dists/gradle-2.13-bin/4xsgxlfjcxvrea7akf941nvc7/gradle-2.13-bin.zip to /root/.gradle/wrapper/dists/gradle-2.13-bin/4xsgxlfjcxvrea7akf941nvc7
Set executable permissions for: /root/.gradle/wrapper/dists/gradle-2.13-bin/4xsgxlfjcxvrea7akf941nvc7/gradle-2.13/bin/gradle

FAILURE: Build failed with an exception.

* What went wrong:
Failed to load native library 'libnative-platform.so' for Linux amd64.
```

Gradle 2.9の時は大丈夫でした。

## 解決篇

[コチラ](https://hub.docker.com/r/frolvlad/alpine-oraclejdk8/)のコメントを参照しました。
これをDockerfileに入れてビルドすればおｋ。

```
apk add --update --no-cache libstdc++
```
GORM で AUTO_INCREMENT でないプライマリキーを作成する

[GORM](https://github.com/jinzhu/gorm) ではプライマリキーが `int` だと自動的に `AUTO_INCREMENT` が付与されます。
以下は MySQL での例です。

```go
type Users struct {
	UserID int `gorm:"primary_key"`
}
```

```go
db.AutoMigrate(Users)  // CREATE TABLE `users` (`user_id` int AUTO_INCREMENT , PRIMARY KEY (`user_id`))
```

`AUTO_INCREMENT` にしたくないときは struct tag で明示的にカラムタイプを指定します。

```go
type Users struct {
	UserID int `sql:"type:int" gorm:"primary_key"`
}
```

```go
db.AutoMigrate(Users)  // CREATE TABLE `users` (`user_id` int , PRIMARY KEY (`user_id`))
```

## 参考情報

https://github.com/jinzhu/gorm/issues/1002
Jetson TX1の簡易カーネル更新手法

#目的
HostPCでカーネルビルドするたび`flash.sh`を走らせるのは
- 転送に時間が掛かる
- TX1側のファイルが全て初期化される（パッケージ等）
等の理由で、とても非効率に感じたので
もう少し楽にアップデートできないものかとスクリプトを組んでみた。

#用意するもの
- HostPC（カーネルビルド済み）
- TX1（初回flashは実施したもの）
- ネットワーク環境

#やること
TX1側に以下のスクリプトを書くだけです。

```bash:update.sh
rsync -av host@xxx.xxx.xxx.xxx:<TEGRA_KERNEL_OUT>/arch/arm64/boot .
cp -f ./boot/Image  /boot/
cp -f ./boot/zImage /boot/
rm /boot/*.dtb
cp ./boot/dts/*.dtb /boot/
rm -rf ./boot

rsync -av host@xxx.xxx.xxx.xxx:<TEGRA_MODULES_OUT>/lib .[
#初期モジュールフォルダ以外を削除する
ls -d /lib/modules/* | grep -v <default_module_dir> | xargs rm -rf
cp -rf ./lib /
rm -rf ./lib
````

あとは、コイツをsudoで実行して再起動すれば更新完了する、はず。

＜追記＞
`/lib/modules/`の中身は、必要なもの以外は消さなければならない模様
多分、gitのtagか何かでベタベタと文字列が付いて（ex: R23.2なら`modules/3.10.67-g458d45c`という感じ）
これが新しいものが優先して読み込まれるのか何なのか、複数あると想定外の挙動になる事があるので
「Sample rootfs」に入っているものと「新しくBuildしたもの」の２個だけが残るようにする。
(Host側でも、`INSTALL_MOD_PATH`に指定するディレクトリはmake前に掃除しておく）
めんどい

＜追記２＞
本記事は、eMMCブートを前提に記載しています。
その他のブート方式については未検証です。

＜追記３＞
`lib/modules/`の中身を初期状態に戻すコマンドを追加
（git使い出すと、自動化しないとやってらんないくらい面倒になってきたので）
誤動作しても当然責任は負いません

#雑記
シンボリックリンクが貼られているので、`rsync`ではなく`scp`コマンドで転送すると大変な事になりました
パスワード入力等は自動化してません、面倒なので
デバイスツリーについては、まだ良く調べてないので念のため既存のファイルを全消去しています
「Host側でスクリプト組んだ方が楽なのでは？」「シーッ！！」
【Ruby】【Docker】docker-apiでexecしたcurlコマンドで画像を保存する

[docker-api](https://github.com/swipely/docker-api)を使ってdocker上からcurlコマンドを叩き、標準出力を取得する方法です。

curlで画像を取得するURLを叩き、保存してみます。

```
container.start
chunks = ""
# curlコマンドを実行する
exec = container.exec(['curl', '--fail', 'http://hostname/image.jpg'], :tty => false, :stdin => false, :stdout => true, :stderr => false) { |stream, chunk|
  chunks << chunk if (stream == :stdout) # stdoutをchunkに入れていく
}
    
if exec[2] == 0 then # 成功していたら保存する
  fpath = “./image.jpg"
  File.delete(fpath) if (File.exist?(fpath))
  File.open(fpath, "w+b") do |f|
    f.write(chunks)
  end
end

container.stop
container.delete
```

`:tty => false, :stdout => true`
ttyをfalseにしてstdoutを受け取るのが大事。
DebianにNode.jsをインストール(自分用メモ)

DebianでNode.jsをインストールをしてみる！

###PPAを使用してインストール
~~~
$ sudo curl -sL https://deb.nodesource.com/setup | sudo bash -
## Installing the NodeSource Node.js v0.10 repo...


## Populating apt-get cache...

+ apt-get update
Hit http://ftp.jp.debian.org wheezy Release.gpg
.
.
.
Fetched 6,256 B in 7s (813 B/s)                                                                                                        
Reading package lists... Done

## Run `apt-get install nodejs` (as root) to install Node.js v0.10 and npm

$ sudo apt-get install nodejs
Reading package lists... Done
Building dependency tree       
Reading state information... Done
.
.
.

$ sudo apt-get install build-essential
Reading package lists... Done
Building dependency tree       
Reading state information... Done
.
.
.
~~~

一応コレでインストールは終わり
[C/C++][GCC] __attribute__((constructor))でmainの前後で処理を実行

`__attribute__((constructor))` の検証と使用方法まとめ
GCCの拡張のため、どこででも動作するわけではないので注意

# ソース内に含める場合

```c:main.c
#include <stdio.h>

__attribute__((constructor))
static void constructor() {
	puts("constructor");
}

__attribute__((destructor))
static void destructor() {
	puts("destructor");
}

int main(int argc, char const* argv[])
{
	puts("call main");
	return 0;
}
```

```shell-session:ビルドと実行結果
$ gcc main.c && ./a.out
constructor
call main
destructor
```

# 共有ライブラリとしてリンクする場合

```c:main.c
#include <stdio.h>

int main(int argc, char const* argv[])
{
	puts("call main");
	return 0;
}
```

```c:sharedlib.c
#include <stdio.h>

__attribute__((constructor))
static void constructor() {
	puts("constructor");
}

__attribute__((destructor))
static void destructor() {
	puts("destructor");
}
```

```shell-session:ビルドと実行結果
$ gcc -shared -fPIC sharedlib.c -o libconstructor.so
$ gcc main.c -L . -lconstructor
$ LD_LIBRARY_PATH=. ./a.out
constructor
call main
destructor
```

# LD_PRELOADを使用する場合

LD_PRELOADを使用することで、後から任意のプログラムに処理を追加することもできる

```c:main.c
#include <stdio.h>

int main(int argc, char const* argv[])
{
	puts("call main");
	return 0;
}
```

```c:preload.c
#include <stdio.h>

__attribute__((constructor))
static void constructor() {
	puts("constructor");
}

__attribute__((destructor))
static void destructor() {
	puts("destructor");
}
```

```shell-session:ビルドと実行結果
$ gcc main.c && ./a.out
call main

$ gcc -shared -fPIC preload.c -o preload.so
$ LD_PRELOAD=./preload.so ./a.out
constructor
call main
destructor
```

# `__attribute__((constructor))` が複数ある場合

`__attribute__((constructor))` が複数存在する場合でも問題なく動作する。
（ただし実行順に関しては不明、実行順に依存がある処理は避けたほうがよさそう）

```c:main.c
#include <stdio.h>

__attribute__((constructor))
static void constructor1() {
	puts("constructor1");
}

__attribute__((destructor))
static void destructor1() {
	puts("destructor1");
}

int main(int argc, char const* argv[])
{
	puts("call main");
	return 0;
}
```

```c:preload.c
#include <stdio.h>

__attribute__((constructor))
static void constructor2() {
	puts("constructor2");
}

__attribute__((destructor))
static void destructor2() {
	puts("destructor2");
}
```

```shell-session:ビルドと実行結果
$ gcc main.c && ./a.out
constructor1
call main
destructor1

$ gcc -shared -fPIC preload.c -o preload.so
$ LD_PRELOAD=./preload.so ./a.out
constructor2
constructor1
call main
destructor1
destructor2
```

# 参考
[main() の前に関数を呼ぶ - bkブログ](http://0xcc.net/blog/archives/000091.html)
[c++ - How exactly does __attribute__((constructor)) work? - Stack Overflow](http://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work)
[GCC の __attribute__((constructor)) を使ってみる：Book of Days](http://www4.big.or.jp/~kanai/MT/archives/000507.html)
[gcc - C++ static initialization vs __attribute__((constructor)) - Stack Overflow](http://stackoverflow.com/questions/8433484/c-static-initialization-vs-attribute-constructor)
【プロジェクト管理】historyファイルの方法　

プロジェクト管理する際にフォルダーの名前や変更履歴でオススメを紹介しています。
こうしたらいいよとか他にもありましたら ご連絡ください。

フォルダの作り方

[プロジェクト名]
➕[入手資料]
➕[提案資料]
➕[管理資料]
➕[作成資料]
｜➕[開発資料]
｜｜➕[リリース申請用ファイル]
｜｜｜➕[old_1-1-1]
｜｜｜｜➕[project-name_1-1-1_2016-06-09_18-13-40]
｜｜｜｜｜[history.txt](http://qiita.com/sunstripe2011/items/52a33407619fbae105a5#historytxt)
｜｜｜｜｜開発ファイル.pg
｜｜｜➕[project-name_1-1-2_2016-06-09_18-13-40]
｜｜｜➕[project-name_1-1-2_2016-06-10_11-32-51]
｜｜｜➕[project-name_1-1-2_2016-06-11_20-50-36]
➕[成果資料]
➕[納品資料]
➕[参考資料]
➕[ゴミ箱]

###history.txt

~~~history.txt
=====================
 対応内容
=====================

【環境】
dev

【開発バージョン】
開発ソフト 1.3 → 1.3.1

【更新日】
2016/06/09 18:13:40

【アプリバージョン】
1.0.0 → 1.0.1

【変更箇所】
・設定画面のデザイン変更

【バグ改修】
特になし
~~~

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/
めざせpythonライブラリマスター （58）faker

#【ライブラリ説明】
　名前や住所、テキストなどのフェイクデータを作成できる
　英語のみならず、様々な言語対応

#【プログラム】
```py:faker.py
# -*- coding: utf-8 -*-

from faker import Factory

fake = Factory.create()

print fake.name()
# Greggory King

print fake.address()
'''
12448 Thea Street
North Lovettton, KY 22164-6982
'''

print fake.text()
'''
Ratione consequatur alias natus dolores assumenda facere tempore.
Consectetur voluptatum perspiciatis omnis tempore ea ipsum.
Fugit blanditiis minima doloribus placeat sequi.
'''
```

#【参考サイト】
　[github](https://github.com/joke2k/faker)
前回のリリース時点から、新たにとりこまれるトピックブランチのマージコミットの一覧

developからトピックブランチを切って、マージするという運用を想定しています。

最新のタグの取得は[こちら](https://gist.github.com/rponte/fdc0724dd984088606b0)を参考させてもらいました。

`git log --date=short --pretty=format:"%cd [%s] <%an>" --merges  $(git describe --abbrev=0 --tags)..origin/develop`

# 追記

最新タグはこっちの方が安全？

```
git describe --tags `git rev-list --tags --max-count=1`
```
Xamarin.iOS で 100k以上のボディで通信できない問題と解決法

# 前提
この記事は以下の前提がありまーす。
## 環境
+ _OS X El Capitan 10.11.5_
+ _Xamarin Studio Version 6.0 (build 5174)_
+ _Xamarin.iOS Version: 9.8.0.323 (Xamarin Business)_

## 備考
とりあえず今現在(2016/06/15)の最新バージョン

# 問題
この問題はHttps通信の場合　PostやらPutやらで１００ｋぐらいのbodyがあるとエラーが発生します。
(Http通信も含むかどうかは知らないです。。。)

```sampleCilent.cs
  var client = new HttpClient ();
  var bodyContent = new ByteArrayContent (new byte [100 * 1024]);
  var response = await client.PostAsync ("https://hoge/post", bodyContent);
```

エラーメッセージは `Unknown Secure Transport error 'ClosedGraceful'.` でした。

#　解決法
## `Bugzilla` の引用で解決
https://bugzilla.xamarin.com/show_bug.cgi?id=41206#c28

iOSプロジェクトのオプションから iOS build -> SSL/TLS Implementation の設定を
Mono(TLS v1.0)に変更する

一応 シミュレーターの設定とデバイスの設定で分けてる場合は両方必要。

## これから
一応Bugzillaであがっているので今後解決されるのかな？
しかし 投稿の日付がリリース前ということはalpha betaの時からあるわけでそれを解決しないままリリースって…

もしくはこれ以外にbodyにセットする方法があるのかな。。。

終わり。
Excelで佐々木希を描く with Ruby

#【環境】
　windows8.1
　Excel 2013
　ruby 2.3.0
　gem 2.5.1

#【概要】
　佐々木希の写真から色の情報を取得して、Excelのセルに塗りつぶします。

#【フォルダ構成】
|---sasaki_excel
　　　　|---sasaki_excel.rb
　　　　|---sasaki.jpg（佐々木希の画像）

こちらの画像を使用しました。
![sasaki.png](https://qiita-image-store.s3.amazonaws.com/0/121997/0c3d8f11-522d-b3f8-5bb3-a60f142d2f9e.png)

#【プログラム】
　デフォルトの画像サイズではプログラムの実行時間がとんでもなく長かったため、
　画像のサイズをコード内で変更しました。
　RubyもPythonと比べてコードが短く理解しやすいのがgood!!

```rb:sasaki_excel.rb
require 'rubyXL'
require 'chunky_png'

image = ChunkyPNG::Image.from_file('sasaki.png')
# ピクセル値変更
image = image.resample_bilinear!(100, 100)

# Excel作成 & シート選択
wb = RubyXL::Workbook.new
ws = wb[0]

pul_wh = 0

for w in 0..99 do
  for h in 0..99 do
    # RGBカラーを16進数へ変換
    hex_color = ChunkyPNG::Color.to_hex(image.pixels[pul_wh])[1,6]
    ws.add_cell(w, h, '')
    # 塗りつぶし
    ws.sheet_data[w][h].change_fill(hex_color)
    # 行、列の幅変更
    ws.change_column_width(w, 0.01)
    ws.change_row_height(h, 5)
    pul_wh += 1
  end
end

wb.write("sasaki_nozomi.xlsx")
```

#【結果】
　デフォルトではこんな感じ
　<img width="514" alt="default.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/f9fbc24f-659c-ce01-45fe-fd55d401e653.png">

　手で表示倍率を変更するとこんな感じ
　<img width="224" alt="after.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/7cb9c6e7-a692-d6e8-3e62-0069a0456c40.png">

#【参考サイト】
　[rubyXL-github](https://github.com/weshatheleopard/rubyXL)
　[chunky_png](http://www.rubydoc.info/gems/chunky_png/toplevel)

#【他言語版】
　[Python版はこちら](http://qiita.com/Algebra_nobu/items/4e2b36bdb38434e183de)
　[Node.js版はこちら](http://qiita.com/Algebra_nobu/items/33781129460eb0338b1b)
HTML5 Tag Tips 強調/引用/連絡先情報

# HTML5 Tag Tips

XHTML2.0からHTML5になって定義が明確になった要素があったりするので、自分の認識違いゆえ、意図しないマークアップをしませんように・・・

## 強調編

### `strong`
テキストレベルセマンティック
**「重要性」**のみを表す要素。
strong要素自身を入れ子にして重要性の度合いを示すことができる。機会に対して重要を示すのでSEO向け。
**強調の意味はHTML5では消失**しているので注意。

### `em`
テキストレベルセマンティック
**「強調」**のみを表す要素。
音声読み上げツールで読み上げられた場合に、大きな声になることを想定。読み手に対して強く言いたいだけなのんでSEO向けには使わない。

### `i`
テキストレベルセマンティック
イタリック体にできるってだけ。原則として利用しない。

### `b`
テキストレベルセマンティック
印刷時に太字になるってだけ。原則として利用しない。

### `mark`
テキストレベルセマンティック
ハイライトされるってだけ。読み手が参照しやすいように目立たせることが目的なのでSEO向けに使わない。HTML5から追加されている。
重要なテキストのマーキングではなく、読み手の操作に関連している箇所に利用する。


## 引用編

### `blockquote`
グルーピングコンテンツ
別ソースから引用する場合に利用する。
`cite`属性で参照先URLを指定することが出来る。ただしこのURLは読み手のためのURLではない。
出典情報やfooter情報`blockquote`で囲むことが出来る。
出典の場合はマイクロデータの構文を使用して追加することも出来る。


### `cite`
テキストレベルセマンティック
本、新聞、エッセイ、詩、楽譜、歌、脚本、映画、テレビ番組、ゲーム、彫刻、絵画、映画、演劇、オペラ、ミュージカル、展示、訴訟事例報告などのタイトルに対して利用。
記事内のコメントの著者名や、検索結果のURLを表す。

### `q`
テキストレベルセマンティック
文章を引用する場合に利用する。
`cite`属性で参照先URLを指定することが出来る。
ブラウザのデフォルト機能で引用符がつくが、これを目的に利用してはならない。


## 連絡先情報編

### `address` 
セクション

> 最も近いarticleまたはbody要素の祖先の連絡先情報を表す。祖先がbody要素である場合、連絡先情報は、文書全体に適用される

問い合わせ先メールアドレスやコピーライト表記などの情報を`address`で囲んで利用することもできる。（その場合はだいたい`footer`内に配置される）

### `small`
テキストレベルセマンティック

> 副次的なコメントを表す。
> 小さな活字体は通常、免責事項、警告、法的制約、または著作権を取り上げる。小さな活字体はまた、時として帰属に対して、またはライセンス要件を満たすために使用される。

免責・警告・法的規制・著作権・ライセンス要件などの注釈や細目を表す要素。
テキストに対して使用するので、長文に対して全体を `<small> ～ </small>` で囲むような使い方はしない。
c++ builder XE4, 10.2 Tokyo > fileIO > ExcludeTrailingBackslash は、下位互換性のためにのみ用意されています。 代わりに、ExcludeTrailingPathDelimiter を使用してください。

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

フォルダ文字列の最後に「`\\`」がある場合に取り除く方法。

[パス操作ルーチン](http://docwiki.embarcadero.com/RADStudio/Seattle/ja/%E3%83%91%E3%82%B9%E6%93%8D%E4%BD%9C%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3)
には似たような2つの関数がある

- ExcludeTrailingBackslash
- ExcludeTrailingPathDelimiter 

http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.SysUtils.ExcludeTrailingBackslash

によると

> メモ： ExcludeTrailingBackslash は、下位互換性のためにのみ用意されています。 代わりに、ExcludeTrailingPathDelimiter を使用してください。

ExcludeTrailingBackslash()使用時にもビルドでは警告は表示されない。
brew から bitcoind をインストールする

公式だと、Bitcoin-QTのcask(bitcoin-core)しかないので、以下の非公式formulaeをインストールしてみる。
https://github.com/WyseNynja/homebrew-bitcoin

```
$ brew tap WyseNynja/homebrew-bitcoin
...
Tapped 9 formulae (44 files, 46.0K)
$ brew install wysenynja/bitcoin/bitcoind
...
checking for EVENT... no
configure: error: libevent not found.
...
```

libeventがないと怒られる。がlibeventはすでにbrewにてインストール済み。
/tmpに展開されていたconfigureファイルをそのまま実行してみると、特にエラーは出ないのでパス周りの問題っぽい。

調べると、`brew install`実行時に設定される環境変数`PKG_CONFIG_LIBDIR`の問題で、`/usr/local/lib/pkgconfig/libevent.pc`として存在するlibeventのパッケージファイルが参照できていないのが原因っぽい。ちなみに、brewコマンド実行時に設定される環境変数は`brew --env`で確認できる。

```
$ brew --env
HOMEBREW_CC: clang
HOMEBREW_CXX: clang++
SDKROOT: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
MAKEFLAGS: -j4
CMAKE_PREFIX_PATH: /usr/local
CMAKE_INCLUDE_PATH: /usr/include/libxml2:/System/Library/Frameworks/OpenGL.framework/Versions/Current/Headers
CMAKE_LIBRARY_PATH: /System/Library/Frameworks/OpenGL.framework/Versions/Current/Libraries
MACOSX_DEPLOYMENT_TARGET: 10.11
PKG_CONFIG_LIBDIR: /usr/lib/pkgconfig:/usr/local/Library/ENV/pkgconfig/10.11
ACLOCAL_PATH: /usr/local/share/aclocal
PATH: /usr/local/Library/ENV/4.3:/usr/bin:/bin:/usr/sbin:/sbin
```

これは次の投稿にあるように、Homebrew 0.9.3 から導入された、superenvの影響と思われる。
http://qiita.com/koshigoe/items/f0ee5b65cd9a6ccf5e36

投稿によると、install時のオプションに `--env=std`をつけることでsuperenvを回避できるらしい。
実際にsuperenvを回避して実行するとconfigureに通り、無事ビルドできた。

```
$ brew install --env=std wysenynja/bitcoin/bitcoind
==> Installing bitcoind from wysenynja/bitcoin
==> Downloading https://github.com/bitcoin/bitcoin/archive/v0.12.1.tar.gz
Already downloaded: /Users/go/Library/Caches/Homebrew/bitcoind-0.12.1.tar.gz
==> ./autogen.sh
==> ./configure --prefix=/usr/local/Cellar/bitcoind/0.12.1/libexec
==> make
	==> make install
🍺  /usr/local/Cellar/bitcoind/0.12.1: 19 files, 14.9M, built in 5 minutes 54 seconds
```
browserifyでjsxファイルをJavaScriptにトランスパイルする


[browserify](http://browserify.org/)と[babelify](https://github.com/babel/babelify)を使ってReact用のjsxファイルを変換します。

# 使う道具

- browserify
- babelify
- [babel-plugin-transform-react-jsx](https://babeljs.io/docs/plugins/transform-react-jsx/)

# 対象

## jsxファイル

```jsx:index.jsx
const React = require('react')
const ReactDOM = require('react-dom')

const App = () => <div>Hello, world!</div>

ReactDOM.render(<App />, document.querySelector('#container'))
```
をbrowserifyを使ってJavaScriptにトランスパイルします。

## 読み込むhtmlファイル

```index.html
<!DOCTYPE html>
<html>
  <body>
    <div id="container"></div>
    <script src="bundle.js"></script>
  </body>
</html>
```

# 手順

## 準備

`package.json`を作ります。

```
npm init -y
```

必要なnpmモジュールをインストールします。

```
npm i -D browserify babelify babel-plugin-transform-react-jsx react react-dom
```

babelの設定ファイルを作ります。

```js:.babelrc
{
  "plugins": ["transform-react-jsx"]
}
```

## 実行

```
node_modules/browserify/bin/cmd.js -t babelify index.jsx -o bundle.js
```

ブラウザで、index.htmlファイルを開いて`Hello, world!`が表示されたら、成功です。

# その他
以前は[reactify](https://github.com/andreypopp/reactify)というtransform moduleもありました。今は非推奨です。

# 参考
- [React入門 - Part2: Browserify/Reactify/Gulpを使う - Qiita](http://qiita.com/masato/items/35b0900e3a7282b33bf8)
- [React(JSX)開発にBrowserifyとReactifyを導入 - Umi Uyuraのブログ](http://umi-uyura.hatenablog.com/entry/2015/05/18/192815)
- [Browserify + ReactifyにWatchifyを導入してJSXの自動ビルド環境を作った - Umi Uyuraのブログ](http://umi-uyura.hatenablog.com/entry/2015/05/20/090130)
sliceやconcatを用いた配列のコピーについて

忘れてしまいそうなのでメモしておく。

jsで配列のコピーの方法として、slice()やconcat()を使ってコピーする方法がある。

本来の用途としては、配列の連結(concat)や切り出し(slice)などだが挙動が以下のようになっているので、配列のコピーとしても使われている

* 元の配列を変更はしない
* 元の配列から取り出された要素のコピーを含むシャローコピー（ 1 段階の深さのコピー）を返す


また配列の中にある値については

* 文字列や数値は、新しくコピー。元の配列に影響なし。
* オブジェクトは参照をコピー。元の配列に影響あり。

となっているよう。


```js:sample
var object = {
  a: 1,
  b: 2,
};

var arr1 = ["A", "B", object];

var arrCopy = arr1.slice();

arrCopy[1] = "C";

arrCopy[2].a = 3;

console.log(arr1);
// => [ 'A', 'B', { a: 3, b: 2 } ]

console.log(arrCopy);
// => [ 'A', 'C', { a: 3, b: 2 } ]
```