OmniAICreator/Qiita-1.07M huggingface dataset:
[CakePHP2]CakeEmailの添付ファイル名が特定のメールクライアントで文字化けする件をどうにかする

※OutLook2010、Thunderbird38.3.0、GmailのWEBクライアントで確認済み
**※2022/02/08 CakePHP3.8、3.9でも動いたそうです(@ymsht @shi_design_コメント感謝です！)**

メール送信バッチなどで文字コード問題に悩む皆様お疲れ様です。
CakeEmailは元々ソコソコ色々やってくれるので楽でいいですよね。
ですが、以下の様な添付ファイルをくっつけて送ってくれってケースでファイル名の文字化けで悩んだこととかありませんか？

```php:/app/config/email.php

class EmailConfig {

	public $default = [
		'transport' => 'Mail',
		'from' => 'from@hoge.co.jp',
		'charset' => 'ISO-2022-JP-MS',
		'headerCharset' => 'ISO-2022-JP-MS',
	];
}
```

```php:/app/Console/Command/SendShell.php

class SendShell extends AppShell {

	public function send() {
		App::uses('CakeEmail', 'Network/Email');

		$CakeEmail = new CakeEmail();
		$CakeEmail->to('hoge@hoge.co.jp');
		$CakeEmail->subject('タイトル');

		$fileName = 'ほげ表.txt';
		$attachments = [
			$fileName => [
				'data' => ※バイナリデータが入ります※
			]
		];
		$CakeEmail->attachments($attachments);
		return $CakeEmail->send('本文');
	}
}

```

色々設定項目があるのに、CakeEmailはファイルの文字名にはエンコードをしてくれません。(´・ω・｀)
mb_internal_encoding()の文字コードを使ったまま送っちゃいます。
ですので、Thunderbirdでは見れるのに、OutLookで文字化けするんだけど（#^ω^）と言った苦情が入ったりしちゃいますね

```php:

		$fileName = 'ほげ表.txt';

		$fromEncoding = mb_detect_encoding($fileName));
		$toEncoding = 'ISO-2022-JP-MS';
		$fileName = mb_convert_encoding($fileName, $toEncoding, $fromEncoding);
		$attachments = [
			$fileName => [
				'data' => ※バイナリデータが入ります※
			]
		];

```

そしてこんな感じの悲しいことをしたりします…
OutLookで見れるようになって解決…！
っと思いきや今度はThunderbirdで「表」以降の文字が化けるんだけど（#^ω^）といった苦情が…
これはSJISの「表」の2バイト目が0x5Cとなり、「\」ととられてエスケープされて1バイトずつずれてしまう事による問題なようですが、詳しくは割愛します！
（他にも「目」だの「本」だのいっぱいあります）
はーこんなんクライアント側問題じゃん、サーバーサイドに言われてもしらねーよ！
ってなりたくなりますが、とりあえず以下で対処できました！

```php:

		$fileName = 'ほげ表.txt';

		$fromEncoding = mb_detect_encoding($fileName));
		$toEncoding = 'ISO-2022-JP-MS';
		$fileName = mb_encode_mimeheader(mb_convert_encoding($fileName, $toEncoding, $fromEncoding), $toEncoding);
		$attachments = [
			$fileName => [
				'data' => ※バイナリデータが入ります※
			]
		];

```

ぶっちゃけMIMEエンコードするだけです。
あとはこれをCakeEmailラップして仕込むなり、専用メソッド通してやるなりして、email.phpのheaderの文字コードと合わせてあげれば、もう文字コードで悩むことは…ない…かも。
WEBメーラーもGmailでは大丈夫でした！
もしかしたらこれでもダメなメールクライアントがあるかもしれませんがご了承下さいorz
meta keywordsについての定型文

SEOといえば、いまだにmeta keywordsを設定する（したい）人も多いはず。

```html
<meta name="keywords" content="キーワード,キーワード,キーワード">
```

ただ現在はGoogle(Yahoo!)さんなども、meta keywordsは読んでいない。
クライアントに説明する時に、毎回リソースを探して文章を作るのもめんどうなので、定型文を用意した。

---

2009年に公式の声明がありましたが、meta keywordsは、現在GoogleとYahoo!の検索エンジンでは読まれていません。
またBingにおいては、keywordsが多く記述しているとスパム判定するようになっており、マイナスの要因にしか使われていません。

## 原文

参考に2009年に公開されたGoogle公式ブログとBingの記事を記載します。

「Official Google Webmaster Central Blog: Google does not use the keywords meta tag in web ranking」
http://googlewebmastercentral.blogspot.jp/2009/09/google-does-not-use-keywords-meta-tag.html

「Blame The Meta Keyword Tag | Webmaster Blog」
http://blogs.bing.com/webmaster/2014/10/03/blame-the-meta-keyword-tag/


### 英語がわからない人に伝える時

Googleがサポートしていないメタタグは無視されます。
この記述はGoogle公式のヘルプの注釈に記載されており、Googleがサポートしているタグは下記のとおりです。

「Google がサポートしているメタタグ - Search Console ヘルプ」
https://support.google.com/webmasters/answer/79812?hl=ja

### HTMLがわかる人の時

また下記のURLはW3CのHTMLの使用ですが、SEO目的ではあてにならないことが書かれています。

「4.2 文書メタデータ — HTML5 日本語訳」
http://momdo.github.io/html5/document-metadata.html#meta-keywords

ただし念のためにキーワードを入れたいとおっしゃる場合は対応いたしますので、ご検討をよろしくお願いいたします。

---

補足&提案

---

(準備: schema.orgについて、書く)

---
vimで複数行のコメント入れたり消したりする(矩形入力・矩形選択削除)

# 複数行のコメントを入れる(矩形入力)

1. 選択を開始する行にカーソルをおいて「Ctrl + v」
2. j(下方向)でコメントする行の終端行まで移動
3. 「Shift + i」で挿入モードに切り替える
4. 「#」を入力する
    - この時は1文字だけ入力されます
5. 「Esc」

「Esc」押下後に選択した行に「#」が入力されます。

# 複数行のコメントを削除する(矩形選択削除)

1. 削除を開始する行にカーソルをおいて「Ctrl + v」
2. j(下方向)で削除する終端行まで移動
3. 「d」

「d」押下後に選択した行の1文字目が削除されます。
vimでscalaのシンタックスファイルを手動で入れる

linux機がネットにつなげない環境だったので、全て手動でscalaのシンタックスファイルを入れることに。
すぐ忘れそうなのでメモ。他のシンタックスファイルや自分が作ったシンタックスファイルを入れる時にも役立ちそう。

以下はscalaのシンタックスファイルを入れる事を例として書いていきます。

# 手順

1. この[scala.vim](https://github.com/derekwyatt/vim-scala/blob/master/syntax/scala.vim)をlinux機へ転送。うちはめんどくさかったので直接ターミナルで貼り付けて作った。
2. vimを起動→「`:echo $VIMRUNTIME`」
3. 「`:q`」でvimを出て、上で得た結果のディレクトリへ移動。
4. その配下の「syntax」ディレクトリへ移動。
5. 先ほど作った「scala.vim」をここにコピー。
6. 一つ上の階層に戻り、「filetype.vim」をvimで編集。
7. 以下をどこかに入れる。

```vim:
" scala
au BufNewFile,BufRead *.scala       setf scala
```

終わり。

試しに.scalaファイルを開くとハイライトされている。
※vimで「syntax on」にしていること。

「filetype.vim」を直接いじりたくない人は「`vim ~/.vimrc`」で設定ファイルを開き、以下を追加する。

```vim:
au BufRead,BufNewFile *.scala  set filetype=scala
```
Groongaで学ぶ全文検索 2015-10-16


#スキーマ設計をやってみる

## スキーマ設計とは
良い感じに検索できるようにtableとcloumnを定義する事


## スキーマ設計手順

### 1.まずは何が返ってきて欲しいかを決める
記事、コメント、電子書籍など

### 2.何で検索したいかを決める
記事、コメントなど

### 3.返ってきて欲しいもののtableを作る
電子書籍ならBooks
記事ならPosts
など

### 4.検索したいものをcolumnにする
書籍ならtitle
著者ならauthor
など

## 例題の設計

### 例題

ユーザーが広告を検索するケースを想定
広告データの情報：ID,名前、説明、画像など

### 1.まずは何が返ってきて欲しいかを決める
広告のリストが返ってきて欲しい

### 2.何で検索したいかを決める
広告名と説明

### 3.返ってきて欲しいもののtableを作る
広告なのでAdsというtableを作成する

#### テーブルの選び方

Groongaにはテーブルがいくつかある
どのテーブルもID=レコードを識別する番号を持っている

+ ハッシュテーブル:キーがある
+ パトリシアトライ:キーがある
+ ダブルアレイトライ:キーがある
+ 配列(アレイ)：キーはないがIDは持っている
→削除するとIDは使いまわされるので注意

後から消さないなら配列、後から消すならキーがあるものを選択する事。

テーブルについての資料
http://groonga.org/ja/docs/reference/tables.html


### 4.検索したいものをcolumnにする

まず説明で検索できるように
descというcolumnを作成する

#### カラムの種類

スカラー：単体の値、今回説明は一個しかないのでこちらを使う
ベクター[配列]：タグなど複数の値の場合に利用する


## 例題を実際に検索してみる

※下記などを参考にGroongaがインストールされている事。
http://groonga.org/ja/docs/install/mac_os_x.html#homebrew

### 1. テーブル作成とカラム作成

```create.txt
table_create --name Advs --flags TABLE_HASH_KEY --key_type UInt32
column_create --table Advs --name desc --flags COLUMN_SCALAR --type Text
```


* type：テーブルの型など
* Groongaのコマンドのルールは上記のように
「操作対象 操作」となっている
* マニュアルhttp://groonga.org/ja/docs/reference/commands/table_create.html
* マニュアル[]がついているものは省略可能なもの


```
$ groonga -n ./advs.db < create.txt
```

### 2. データをロード

```load.txt
load --table Advs
[
    {"_key": 1, "desc":"美味しいピザ" },
    {"_key": 2, "desc":"美味しいピザ2" },
    {"_key": 3, "desc":"美味しいピザ3" },
    {"_key": 4, "desc":"美味しいピザ4" },
]

```

```
$ groonga advs.db < load.txt
```

* マニュアルhttp://groonga.org/ja/docs/reference/commands/load.html

### 3. 確認

```
$ groonga advs.db dump
table_create Advs TABLE_HASH_KEY UInt32
column_create Advs desc COLUMN_SCALAR Text

load --table Advs
[
["_key","desc"],
[1,"美味しいピザ"],
[2,"美味しいピザ2"],
[3,"美味しいピザ3"],
[4,"美味しいピザ4"]
```

### 4. 検索

```
$ groonga advs.db select --table Advs --query desc:@ピザ3
[[0,1444999444.82913,0.00431203842163086],[[[1],[["_id","UInt32"],["_key","UInt32"],["desc","Text"]],[3,3,"美味しいピザ3"]]]]
```

## その他メモ

* idはどのテーブルもUint32
* 広告の情報とは別に出しても良いテーブルがある場合
→出しても良いものだけをテーブルに入れる形が高速、n件取得したいなどの要件を満たせる。
ファビコンまとめ



参考[wikipedia](http://ja.wikipedia.org/wiki/Favicon)

##ファビコンって？
　favorite + icon = favicon。もともとはIEの「お気に入りに追加ｌ」で表示される用のアイコンだった。最近のブラウザとかでは、お気に入りだけじゃなく、ページのタブとかにファビコンを読み込むがスタンダードになってきてるんで、お気に入り専用アイコンっていうもともとの意味は消えつつある。

## サイトへの導入

サイト共通で使うならルートに`favicon.ico`という名前で設置すればOK

ページごとに指定したいなら以下のコードを.

````
<link rel="shortcut icon" href="./favicon.ico" />
<link rel="icon" type="image/vnd.microsoft.icon" href="./favicon.ico”>
````

### 準ファビコン

Webclipアイコン
````
<link rel="apple-touch-icon" href="webclip.png" />
````

※ コードの見やすさのために各アイコンは相対パスで記述していますが、万全を期すならiconのURLはドメインを含む絶対パスでの記述をおすすめします。



## ファビコンファイルの作り方

### サイズについて

サイズは環境によって諸々ある。面倒であれば32pxで作っとけ、みたいな感じ。

32pxで作る中で具体的に問題が出てきたら、マルチアイコンを検討。

フォーマットは`ico`がオススメみたい。

### icoの作り方

お手軽に済ませるなら、Macの人はプレビューアプリを使ってなんとかなるようです(ちゃんと最後まで読む)。
http://www.msng.info/archives/2011/12/how-to-create-favicon-with-mac.php


参考：
http://goalist.hatenablog.jp/entry/2014/06/10/092452
http://liginc.co.jp/web/design/material/16853
hamlでハッシュロケットを使わない記法について書きたい

# hamlとは
HTMLを簡単に素早く書くことができるニューフェイス。

## 例
```erb:application.html.erb
<!DOCTYPE html>
<html>
<head>
  <title>TestJs</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

```

```haml:application.html.haml
!!! 5
%html
  %head
    %title
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true
    = javascript_include_tag 'application', 'data-turbolinks-track' => true
    = csrf_meta_tags
  %body
    = yield

```

# ハッシュロケットとは
`=>`
↑これ

どうも古い書き方らしい


# 書き方
シンボル型で書き換えるだけ
` 'class' => hoge `
これを↓
` class: hoge `


## 問題
シンボル型のキーにはハイフンが入っているとまずい。
`data-turbolinks-track: true`
↑これはダメ

## 解決策
こうするといいらしい
`data: { turbolinks: { track: true }}`


# 完成
```haml:application.html.haml
!!! 5
%html
  %head
    %title
    = stylesheet_link_tag    'application', media: 'all', data: { turbolinks: { track: true }}
    = javascript_include_tag 'application', data: { turbolinks: { track: true }}
    = csrf_meta_tags
  %body
    = yield

```


# 所感
`{}`の数でエラー吐かれまくって泣きそうになった。
hamlに関してはまだいろいろよくわかっていないので頑張りたい。
メモ Thread.sleep();

▪️スレッド

スレッドとは、プログラムを実行している主体（例えて言うなら１人の人間）です。すべてのプログラムはスレッドによって実行されています。１つのスレッドは、ひとりの人間がプログラムを１行ずつ読んでプログラムの流れを追いかけるように、命令を１つずつ解釈し処理を実行していきます。

スレッド（Thread）とはもともと「糸」という意味ですが、プログラムの実行は、糸をたぐるように順番に命令が実行されていくため、そのような名前がついています。１つのスレッドはあくまでも１本の糸であり、２つの処理を同時に行うことはありません。
thread→糸、筋道、脈絡

▪️Thread.sleep();
プログラムを・・・秒間一時的に止める
(例)Thread.sleep(3000);
プログラムを3秒間一時的に止める

sleep(long millis, int nanos) 
          システムタイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数に指定されたナノ秒数を加算した間、スリープ (実行を停止) させます。

sleep(long millis) 
          システムタイマーとスケジューラが正確であることを前提として、現在実行中のスレッドを、指定されたミリ秒数の間、スリープ (一時的に実行を停止) させます。
Haskellでエイトクイーン

```hs:eightqueens.hs

-- % echo 8 | runhaskell eightqueens.hs

import Control.Applicative
import Data.List

main :: IO ()
main = interact $ unlines . map (>>= show) . (\n -> queens n n [] [] []) . read

queens :: Int -> Int -> [Int] -> [Int] -> [Int] -> [[Int]]
queens _ 0 _ _ _ = [[]]
queens n i ls hs rs = [ q : qs |
        q <- [0 .. n - 1] \\ (ls ++ hs ++ rs),
        qs <- queens n (i - 1) (pred <$> q : ls) (q : hs) (succ <$> q : rs) ]
```

あとで説明とgithubへのリンクをつけよう。
SupervisorでPythonのWebアプリをデーモン化する

awsでPythonのWebアプリをTornadoフレームワークを使って開発していたときに、awsで起動させているWebアプリがよく寝る（アプリが落ちる）ので、デーモン化して無休で働かせ（常時起動）て、もし寝たとしても起こす（アプリ再起動）ようにしたときのメモ。

## Supervisorとは 

[Supervisor](http://supervisord.org/)はPython製の軽量なプロセス管理ツール。

## 手順

手順は以下のような感じ。
作業は全てaws上のubuntu14.04で行っています。

### インストール

Supervisorは`apt-get`でも`pip`でもインストールできるのですが、とりあえず、Ubuntuで`apt-get`でインストールする方法を記載しておきます。

※インストール方法によって、設定ファイルの場所が変わってくるので注意しましょう。apt-getの場合 *`/etc/supervisor/conf.d/`*

* Ubuntu (apt-get) の場合

```
$ sudo apt-get install supervisor
```

インストールされたことを確認。バージョンは`3.0b2`が入ったみたい。

```
$ supervisord -v
3.0b2

$ sudo supervisorctl version
3.0b2
```

### 設定

Supervisorの設定ファイル（confファイル）にWebアプリ起動のための情報を書きます。
*`/etc/supervisor/conf.d/`* にconfファイルを作成します。

```
$ sudo vim /etc/supervisor/conf.d/tornado.conf
```

中身は以下のようにしました。Supervisorに管理させるプロセスとしての名前は**tornado**にしました。

```conf:tornado.conf
[program:tornado]  ; プロセスの名前
directory=/home/ubuntu/tornado-app  ; 作業ディレクトリ
command=/home/ubuntu/tornado-app/venv/bin/python /home/ubuntu/tornado-app/server.py --port=3000  ; 起動コマンド
numprocs=1  ; 起動インスタンス数？
autostart=true  ; autostartする
autorestart=true  ; 自動で再起動させる
user=ubuntu  ; 起動ユーザ
redirect_stderr=true  ; 標準エラーを出力する
stdout_logfile=/var/log/supervisor/tornado.log  ; ログファイルの出力先
```

Webアプリはあらかじめ、`/home/ubuntu/tornado-app` にgit clone済みだとします。

* (参考)Supervisorを使わない場合の起動方法
ちなみにSupervisorを使わない場合、つまり、ターミナルからWebアプリを起動させる場合は以下のコマンドで起動させていました。

```
$ cd ~/tornado-app
$ source venv/bin/activate  # virtualenvをactivate
(venv)$ python server.py --port=3000 &
```

あと、Supevisorの設定ファイルの書き方は[Supervisor configuration](http://supervisord.org/configuration.html#program-x-section-settings)を参考にしてください。

### supervisorの起動、設定ファイルの読み込み

`service supervisor`コマンドを使ってSupervisorを起動します

Supervisor自体の再起動します。

```
$ sudo service supervisor restart
```

Supervisor自体が起動しているか確認します。

```
$ sudo service supervisor status
 is running
```

### プロセスの起動、管理

`supervisorctl`コマンドでプロセスを管理します。


confファイルを変更した場合、かならず再読み込み（reread）が必要になります。
confファイルの読み込みは以下のコマンド。

```
$ sudo supervisorctl reread
```

あとはSupervisorで管理しているWebアプリを起動させます。

```
$ sudo supervisorctl start tornado  # 起動
```

Webアプリが起動しているか確認。

```
$ sudo supervisorctl status  # ステータス確認
tornado                          RUNNING    pid 3414, uptime 0:07:19
```

起動した！

ちなみに、停止と再起動は以下のとおりです。

```
$ sudo supervisorctl stop tornado  # 停止
$ sudo supervisorctl restart tornado  # 再起動
```

その他、supervisorctlのコマンドは[こちら](http://papix.hatenablog.com/entry/2015/08/05/131113)が参考になりました。

## 参考
* http://supervisord.org/
* http://papix.hatenablog.com/entry/2015/08/05/131113
Dockerを起動したら、エラーになったときの解決法（Kitematic）

## 現象
[Docker ToolBox](https://www.docker.com/toolbox)のWindows版をインストールして、Kitematicで起動したら、99%で止まって、しばらくしたらエラーが発生。

## 解決策
hostsファイルに「127.0.0.1 localhost」を追記する。
(Windows7であればC:\WINDOWS\System32\drivers\etc配下にある。他の環境はすみませんが調べてません)

まずはエラー画面を閉じて、コマンドプロンプトを開く。

次に、下記コマンドを実行。

```
$ docker-machine rm -f default //defaultはbox名
```

その後に下記コマンドを実行。

```
$ docker-machine create -d virtualbox default

//実行後
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env default
```

この後、Kitematicを開いたら、「Connect to Docker Hub」という次の画面が表示された。
scriptコマンドをある程度バレないように仕込む方法

自分の調べ方が甘かったのか、思ったより検索に引っかからなかったので書きます。

[script](
http://linuxjm.osdn.jp/html/util-linux/man1/script.1.html
)コマンドを利用するとコマンドの実行履歴+標準出力をファイルへ保存することが出来ますが、

 * 手動でしたくない
 * exit 2回打ちたくない
 * セキュリティのためにやるわけではないのでお手軽にできる範囲でやりたい

という要件で探していました。

今回書いたスクリプトになります。zsh向けです。

```bash:/etc/zprofile
logfile=/tmp/$(date +%Y%m%d%H%M%S)_$(whoami).log
if [ ! -e $logfile ]
then
  script -q $logfile
  exit
fi
```

`/etc/zprofile`に書いておけばログイン時に1度だけ呼ばれるので無限ループになりません。とりあえずぶっこんでおきました。
exit2回打たないといけない問題はexitを直後に書いておけば良いです。
psすればすぐバレるしkillしたら止まるので、これによってセキュリティが向上するということはありません。ご留意ください。
iOSアプリのArchiveでdoes not contain bitcodeと言われる解決方法

XcodeからアプリがArchiveできなくて困りました。あるある(☝ ՞ਊ ՞)

# ビルドが通りません＼(^o^)／
`does not contain bitcode.`と言われてビルドできません。

```
FBSDKCoreKit(FBSDKGraphRequestPiggybackManager.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

# Enable BitcodeをNoにする
Build Settings > Build OptionsからのEnableBitcodeがYesになっていました。

<img width="77%" alt="スクリーンショット 2015-10-20 22.18.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/1624/e5dfc8f8-15aa-47a7-13e1-d3ad4b6c0587.png">


こちらをNoにします。

# 再度Archive
今度はArchiveが成功しました＼(^o^)／
会員向けのコンテンツのLogin確認まわりを実装してみる

## 会員向けコンテンツの前にログインさせたい

メンバー向けのコンテンツの前にログインをはさみたいのですが、そのあたりを継承をつかって実装してみました。
また使う機会がありそうなのでメモを残しておきます。

例えば下記のような感じです。

MemberContentsControllerを継承していれば表示前にログインチェックがはしり、
ログイン後にページを表示するといった動きです。

下記のような感じで実装したい。

```rb
class MymgController < MemberContentsController
  def index
  end

  def show
  end

  def menu
  end
end
```

##会員向けコンテツの場合はログイン有無を確認

もしログインしてなければログインページ遷移、といった動きをいれます。

このコントローラを会員向けのコントローラに継承さることでそのコントローラに遷移前にログイン状態を確認させています。

```rb:member_contents_controller
class MemberContentsController < ApplicationController
  before_action :checkLogin

  def checkLogin
    #helperでログインチェック
    if !view_context.login?
      session[:member_contents_path] = request.fullpath
      return redirect_to login_url
    end
  end
end
```




##ログイン後に戻るページを取得する。

トップページからもログインさせたいので大元のコントローラのフィルタで戻りパスを取得します。

```rb:appication_controller
class ApplicationController < ActionController::Base
  before_action :getPath,:authenticate_user

  def getPath
    session[:member_contents_path] = request.fullpath
  end
```

ただしLoginページに関してはそこに戻したくないので、
除外します。

他に同様のページがあれば同じ対応をします。

```rb:LoginController
class LoginController < ApplicationController
  def getPath
    #何もしない
  end

  def in
    
    path = session[:member_contents_path]
    #保存したパスがあれば
    if path.blank?
        redirect_to root_path
    else
        session[:member_contents_path] = nil
        redirect_to path
    end
  end

end
```

読みやすさを考えると設定などに会員向けとそうじゃないページをまとめてそこで制御したほうがいいような気がします。
ただエンジニア的にはクラスファイルを一目みただけでコンテンツが会員向けであることがわかるので、
対応はしやすいと思います。

何かよりよい方法があればコメントお願いします。
git flow よく使うコマンド メモ

### [初期化]
```shell-session
git clone
git flow init -d
```

### [featureの新規作成]
- ローカルのfeatureの作成
- オリジナルへの登録

```shell-session
git flow feature start <name>
git add/commit
git flow feature publish <name>
```

### [他担当の作ったfeatureを自分のローカルにpull]
- オリジナルのfeatureをローカルにpull
- オリジナルへのpush

```shell-session
git flow feature pull origin <name>
git push origin feature/<name>
```

### [オリジナルのfeatureを自分のローカルにマージ]
- オリジナルのfeatureをローカルにrebase<br>
※コンフリクトが発生したら解消する

```shell-session
git pull --rebase origin feature/<name>
```

### [featureの終了とdevelopへのマージ]
- オリジナルのdevelopをローカルにrebase<br>
※ローカルのdevelopを最新化
- ローカルのfeatureをfinish<br>
※ローカルのdevelopにローカルのfeatureがマージされる<br>
- オリジナルのdevelopにpush
- オリジナルのfeatureを削除

```shell-session
git pull --rebase origin develop
git flow feature finish <name>
git push origin develop
git push origin :feature/<name>
```
### [export]
```shell-session
git archive develop | tar -x -C /xxxxx
```

### [commitの取り消し]
```shell-session
git reset --soft 1a01328135f2c0eed8f0fe55a357096853820761
git reset --hard 1a01328135f2c0eed8f0fe55a357096853820761
```

### [diff]
```shell-session
git diff br1:foo/bar.txt br2:hoge/fuga.txt

git log services.defs #特定ファイルのコミットログを参照する
git diff 6cd3311982b6622a292a43eb15700cd653b7b3ad services.defs　#比較したいコミットハッシュを指定する

git show HEAD^:config/defs/services.defs #1つ前
git show HEAD^^:config/defs/services.defs　#2つ前
```

### [rollback]
```shell-session
git checkout 6cd3311982b6622a292a43eb15700cd653b7b3ad services.defs
git checkout HEAD^^ services.defs
```
要素が増えるとarray_mergeが遅すぎたので角括弧構文で追加するべき【整数キー】【重複あり】

# <i class="fa fa-check-circle-o"></i> 結論

**追記：コメント欄要参照**
`array_merge`は要素数が増えるほどパフォーマンスが低下する。
キーが重要でなく、重複整数をキーを変え追加したいならば[^1]
角括弧構文`$array[] = 値`を使用すれば、パフォーマンスが低下しない

# <i class="fa fa-file-text-o"></i> 参考文献

[配列結合演算子, array_merge, array_replace を徹底比較]
お世話になっております。
すごく見やすいです。

# <i class="fa fa-cubes"></i> やりたかったこと

`preg_match_all`の一致したキーワードを重複を認めつつ１次元配列に集めたい。
並び順、キーは重要でない。

`preg_match_all`の結果は第三引数の`$array[0]`内に、整数キーで格納される。
`+`では整数の重複が無視され、`array_replace`では上書きされてしまう。
重複整数でも追加されるのは`array_merge`だけだったので、`array_merge`にしたところ、回数が増えるごとに極端に遅くなってしまった。

# <i class="fa fa-code"></i> 検証コード

```php:array_merge

$start = microtime(true);
for ($i = 0, $all = array(); $i < 10000; ++$i) {
    //$rand = rand();
    $rand = '1234567890';
    $matches = array();
    preg_match_all('/123|456|789/', $rand, $matches);
    $before = microtime(true);
    $all = array_merge($all, $matches[0]);
    if (($i % 1000) == 0) {
        echo printf("%.12f", (microtime(true) - $before)) . PHP_EOL;
    }
}

//var_dump($all);
echo "End\n";
echo printf("%.12f", (microtime(true) - $start)) . PHP_EOL;
//diff用
file_put_contents('/tmp/merge',print_r($all, true));

```

```php:push

$start = microtime(true);
for ($i = 0, $all = array(); $i < 10000; ++$i) {
    //$rand = rand();
    $rand = '1234567890';
    $matches = array();
    preg_match_all('/123|456|789/', $rand, $matches);
    $before = microtime(true);
    foreach($matches[0] as $value) {
        $all[] = $value;
    }
    if (($i % 1000) == 0) {
        echo printf("%.12f", (microtime(true) - $before)) . PHP_EOL;
    }
}

//var_dump($all);
echo "End\n";
echo printf("%.12f", (microtime(true) - $start)) . PHP_EOL;
//diff用
file_put_contents('/tmp/push',print_r($all, true));


```

## <i class="fa fa-play"></i> 結果

```

# php merge.php
0.00001382827814
0.00059795379614
0.00156402587914
0.00243592262314
0.00324916839614
0.00408887863214
0.00526213645914
0.00667285919214
0.00805711746214
0.00815606117214
End
48.14117693901115
# php push.php
0.00001621246314
0.00000190734914
0.00000095367414
0.00000095367414
0.00000214576714
0.00000095367414
0.00000095367414
0.00000119209314
0.00000095367414
0.00000309944214
End
0.05467796325714
# diff merge push -s
ファイルmergeとpushは同一


```

`array_merge`が不利ないじわるな条件でしたが、
恐らく`array_merge`は添字振り直しで時間を食われている？
一方`$array[] = 値`では処理時間に配列数は関係ないように見える。
出力自体は一緒なので、値だけ欲しければ`$array[] = 値`が良さそう。


***

文字列キーが重複しないこと前提の場合、`array_merge`と

```php
foreeach($array as $key => $var) {
    $all[$key] = $var
}
```

どちらが早いかも気になる。


***

キーワードと出現回数をカウントアップしたら結果配列の結合は不要じゃないかな？
そっちの方が遅いかな？



[配列結合演算子, array_merge, array_replace を徹底比較]:http://qiita.com/mpyw/items/578e1a14879e679d2141

[^1]: 重複整数を無視、上書きしないならば
iOS9でUIAlertControllerのテキストカラーを変更する

iOS8ではUIAlertControllerのテキストカラーを変更するときには以下のコードで対応することができました。

```objectivec:ios8
[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor greenColor]];
```

iOS9では上記のコードでは色は反映されません。
iOS9でテキストカラーを変更するには以下のことを行います。

* UIAlertControllerを継承したクラスを作成する
* 継承したクラスのviewWillLayoutSubviewsでtintColorを設定する

```objectivec:ios9(表示するとき)
	//UIAlertControllerを継承したクラスを使います
    MyUIAlertController* ac = [MyUIAlertController alertControllerWithTitle:@"title"
                                                                message:@"message"
                                                         preferredStyle:UIAlertControllerStyleActionSheet];
    
    [ac addAction:[UIAlertAction actionWithTitle:@"item1"
                                           style:UIAlertActionStyleDefault
                                         handler:^(UIAlertAction * action) {
                                             
                                         }]];
    
    [ac addAction:[UIAlertAction actionWithTitle:@"cancel"
                                           style:UIAlertActionStyleCancel
                                         handler:^(UIAlertAction * action) {
                                             
                                         }]];
    
    ac.view.tintColor = [UIColor greenColor];//tintColorを設定する
    
    [self presentViewController:ac animated:YES completion:^{
        
    }];
```

これだと初期表示時には色が変わりますが、アイテムをハイライトしたときにデフォルトの色に戻ってしまいます。
なので、継承したクラス(ここではMyUIAlertController)側で制御する必要があります。

```objectivec:ios9(継承クラス側)
- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    
    self.view.tintColor = [UIColor greenColor];
}
```
これで、ハイライトしたときにも設定したtintColorが反映されます。
上記のコードでiOS8でも動作することを確認しています。

もっとスマートなやり方があれば教えて下さい。
Oprofileによるボトルネックの調査 メモ

### インストール
```shell-session
$ yum install oprofile
```

### 使い方
```shell-session
$ opcontrol --reset  #プロファイル結果をクリア
$ opcontrol --start  ＃プロファイル開始
$ opcontrol --stop   ＃プロファイル終了
```

### 結果の確認
```shell-session
$ opreport   ＃ システム全体ののプロファイル結果
$ opreport -l /home/trae/bin/traepktd    ＃指定プログラムのプロファイル結果（サマリ）
$ opannotate -a /home/trae/bin/traepktd    ＃指定プログラムのプロファイル結果（詳細）
```

下記の例だと、"hl_xxxxx"がかなりのボトルネックになっている。
"hl_xxxxx"に性能改善対策がうてれば、実行速度の向上が見込める。

```shell-session
CPU: Intel Architectural Perfmon, speed 3466.91 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask of 0x00 (No unit mask) count 100000
samples  %        symbol name
1384167  11.0792  hl_xxxxx
755803    6.0496  tcp_mxxxxx
723457    5.7907  http_Pxxxxxxx
637085    5.0994  pkt_xxxxxxxx
566604    4.5352  pkt_xxxxxxxx
453462    3.6296  .plt
415683    3.3272  pkt_ipxxxxxxxxxx
396182    3.1711  pkt_ifxxxxxxxxxx
373027    2.9858  pkt_tcpxxxxxxxxx
364275    2.9157  ut_xxxxxxxxx
342519    2.7416  http_xxxxxxxxxxxx
315162    2.5226  ux_xxxxxxxxxxx
～
```

ソースの該当箇所を確認。
forループの中のmemcmpをどうにかすればよさげなのが判断できる。

```c
/* 
 * Command line: opannotate -s ./xxxxxxxx
 * 
 * Interpretation of command line:
 * Output annotated source file with samples
 * Output all files
 * 
 * CPU: Intel Architectural Perfmon, speed 3466.91 MHz (estimated)
 * Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask of 0x00 (No unit mask) count 100000
 */
/* 
 * Total samples for file : "/home/xxxxxxxx.c"
 * 
 * 910908 16.8646
 */
～
               :uint64_t hl_xxxxx(hl_t *hl, void *key)
～
 64052  1.1859 :	for (ridx = __hl_bkt(hl)[hl_hash(key, db->klen, 1981) % db->bnum];
 87402  1.6182 :		ridx > 0;
     2 3.7e-05 :		ridx = *__hl_rec_syn(hl, ridx)) {
～
273682  5.0670 :		if (memcmp((void *)__hl_rec(hl, ridx), key, db->klen) == 0) {
               :			dprint("key matched at "REC_FMT"\n", REC_ARG(hl, ridx));
～
               :	}
～
  3205  0.0593 :}
```
SAVONで返ってきたresponseのXMLをパースする

SAVON 2 で SOAP client。先ず最初にやるであろう、server からの response の処理についてです。

SAVON はいろいろとよろしくやってくれてあまりに簡単なので、コーディングの本番は response に対してどのようなコードを書くかだと思います。

その response ですが、response は xml で返ってくると思うので、それをどのようにパースするかが最初にやることだと思います。一番手っ取り早いのは以下の方法。

```rb
client = Savon.client(wsdl: './XXXXX.wsdl',
                      endpoint: "https://XXXXX/Service",
                      namespace: "http://www.XXXXX/Service")

response = client.call( :get_hogege,
                        message: { foo: '12345' }
                      )
```

として返ってきた response は普通に body のかなにハッシュとして入っている。よって、

```rb
pp response.body[:stoks]
```

などとすれば response の xml にはいった値を取得できるはずです。
Apacheログをrubyで扱うときの正規表現


fluentdそのままですがいつも忘れるのでメモ。

```
format = /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*) [^ ]* "(?<agent>[^\"]*)"$/
m = format.match(line)
puts m[:host] # 192.168.0.1
puts m[:time] # 10/Jul/2013:13:53:15 +0900
```
Windows版 Apache 2.4 でBasic認証が出来なかった件（解決済み）

　初投稿。まだ Markdown にも慣れていないため Qiita の使い方、勉強します。

　2015年10月現在、ApacheのWindows版はソースコードのみで、バイナリは公式サイトから配布されていない。（2014年末からその方針の模様）
　Windows版Apache インストールに関する検索は、軒並み10年以上前の記事であり、路頭に迷う人もいるだろうなぁと思った次第。

***

　解決したので、以下に要約を。

- 公式サイトに紹介されている有志のページからバイナリをダウンロード
- htpasswd.exe では正常な暗号化が行われないため、http://www.htaccesstools.com/htpasswd-generator-windows/ で作成した内容を使う
- .htaccess のパスワードファイルについてはフルパスで書く

***

【詳細】
　バイナリ版については、有志がコンパイルし配布しているサイトが、Apache公式サイトで紹介されているので、そちらから選びダウンロード。
　　http://www.apachelounge.com/download/
　執筆時点の最新版を導入するにあたり、VC14をインストールする必要があるが、このあたりはインストーラーが促してくれるため、あまり迷うことはないだろうから省略。
　僕は見てないけど、こちらが参考になるかもです。
　　https://www.youtube.com/watch?v=LL2HXgxk6-Q


C:\Apache24　というフォルダにインストールし、サービスとして稼働させるべく、以下のコマンドを実行。

`C:\Apache24\bin\httpd.exe -k` 


　httpd.conf や、.htaccess については、.htaccess の有効化やIndexオプションなどの設定が必要になるが、そのあたりは古くから紹介されている内容と変わらないので省略。

　問題はBasic認証がスムーズに出来なかった事。

`C:\Apache24\bin\htaccess.exe -c C\:aaa\.htpasswd hogehoge
New password: ********
Re-type password: ********
Adding password for user hogehoge`

　ところが、作成された .htapasswd を確認すると、MD5 形式では無い……　実際アクセスしても、HTTP500エラーが返ってきた。
　htpasswd.exe の他のオプションで、もしかしたら上手く行くかもしれないけど、以下のサイトで、生成した内容で上手く行った。

　http://www.htaccesstools.com/htpasswd-generator-windows/


　そして .htacess には以下の様にフルパスで、.htpasswd の場所を記述`AuthUserFile C:\aaa\bbb\.htpasswd`

　これにて解決。

　実は、Windows だけどシンボリックリンクを使ってディレクトリ構築をしている部分があるので、その点が影響していた可能性もある。だけど、htpasswd.exe の生成内容は明らかに違っていたからなぁ……

　精査できたら追記します。


***


　小規模ながら、ファイルサーバーとしてブラウザからでもアクセスできるようにしておきたいため、FTPSの導入だけでなく、Apache でファイルダウンロードが可能なサーバーを構築した。
　Linux で構築すれば良いじゃないかという声も聞こえてきそうだが、扱っているファイルには日本語ファイル名が多く、ファイルコピーなどをSSHでコマンドレベルで行うのはちょいと不便。Linuxで運用していた時期もあったが、Windows版しか出ていない（もしくは安定的に動いてくれない）他の常駐系ソフトも使いたいので、Windowsに戻し稼働させることにした。

　開発だったら、仮想化でLinuxを使おうという風潮は重々承知しているけど、このような使い方をしている人も未だに居るということで。
Valgrindによるメモリーリーク調査 メモ

### インストール
```shell-session
$ yum install valgrind
```

### 実行例
```shell-session
$valgrind -v --error-limit=no --leak-check=full --show-reachable=no ./hogehoe 2>&1 | tee valgrind.log
```
- -v<br>
詳細表示
- --error-limit=no<br>
エラー追跡をやめない
- --leak-check=full<br>
メモリリークを最大限チェックする
- --show-reachable=no<br>
still reachableをエラーをレポートに表示しない。
- --trace-children=yes<br>
子プロセスまで追跡する。<br>

### 結果確認
- definitely lost<br>
- メモリリークしている。
- possibly lost<br>
メモリリークしているかも？
- still reachable<br>
解放できるメモリを解放していない。<br>
レポートが邪魔なら--show-reachable=yesを使用しない。<br>
※"still reachable"はlibc++が自前で使うメモリプール分なので気にする必要はないらしい。
- suppressed<br>
メモリリークエラーが抑制されている。

```shell-session
==15737== LEAK SUMMARY:
==15737==    definitely lost: 0 bytes in 0 blocks
==15737==    indirectly lost: 0 bytes in 0 blocks
==15737==      possibly lost: 0 bytes in 0 blocks
==15737==    still reachable: 8,391,702 bytes in 29 blocks
==15737==         suppressed: 0 bytes in 0 blocks
```
```shell-session
==27880== 152,222 (112 direct, 152,110 indirect) bytes in 2 blocks are definitely lost in loss record 31 of 34
==27880==    at 0x4E18140: calloc (vg_replace_malloc.c:418)
==27880==    by 0x45E747: cfg_init (confuse.c:1100)
==27880==    by 0x445D70: tr_config_load (tr_config.c:152)
==27880==    by 0x406123: main (pr_main.c:201)
```
Amazon API Gatewayで文字列をクォーテーションなしで返却する

Amazon API Gatewayで文字列を返却する時はダブルクォーテーションで囲まれてしまう。

```
$ curl https://alstvax2jk.execute-api.ap-northeast-1.amazonaws.com/prod/str
"string"
```

これをクォーテーションなしで返却するには以下の設定が必要。

1. GET/POST等の`Resources`の`Method Execution`で`Integration Response`をクリック
![Screenshot 2015-10-20 20.53.51.png](https://qiita-image-store.s3.amazonaws.com/0/27157/7519a1ba-d380-dd2f-f77a-23d6156848d6.png)

2. `Mapping Templates`の`Content-Type`に`application/json`を追加
![Screenshot 2015-10-20 21.19.58.png](https://qiita-image-store.s3.amazonaws.com/0/27157/a5740011-85bd-4366-e9dd-35d0d1e068ac.png)

3. `Output Passthrough`を`Mapping Template`にし、templateで`$input.path('$')`と設定
![Screenshot 2015-10-20 20.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/27157/e66ca3e9-2483-6c8b-a26c-321aa4634180.png)

4. `✓`ボタンで保存

5. Deploy

これでOK。

```
$ curl https://alstvax2jk.execute-api.ap-northeast-1.amazonaws.com/prod/str
string
```

早くawscliで出来るようになりたい。。


参考：
https://forums.aws.amazon.com/thread.jspa?messageID=678603
ImageMagickってなんでmagicじゃなくてmagickなの？？？　って思ったから調べた

結論：厨二っぽくてかっこいいから、imageとmagickの発音に共通点があって面白いから

アレイスター・クロウリーは、1913年に発表された『第四の書』第二部において魔術の表記を magic から Magick に転換した。これは自分の提唱する魔術を手品や洗練されていない旧来の魔術から区別するために、19世紀以前に用いられた近代英語の古い綴りを復活させたものであった[5]。英語では magic(k) の一般的な発音は [mædʒɪk] であるが、クロウリー流の Magick の場合には mage-ick [meɪdʒɪk] と発音する人もいる[6]。クロウリーの提唱した"Magick"概念の内容については魔術 (セレマ)を参照。

https://ja.wikipedia.org/wiki/%E8%BF%91%E4%BB%A3%E8%A5%BF%E6%B4%8B%E5%84%80%E5%BC%8F%E9%AD%94%E8%A1%93

魔術 (Magick) は、アレイスター・クロウリーのセレマの文脈においては、〔非日常的な〕儀式魔術のみならず、意志の日常的な行為をも含めて、「〈意志〉に応じて変化を生ぜしめる科学にして技芸である」と定義される。クロウリーは次のように書いた。「いかなる対象にも、その対象にとって本来的に可能である限りの変化を起こすことは理論的に可能である[1]。」 ジョン・サイモンズ（英語版）とケネス・グラント（英語版）はこれにもっと深いオカルト的意味を付与している。

https://ja.wikipedia.org/wiki/%E9%AD%94%E8%A1%93_(%E3%82%BB%E3%83%AC%E3%83%9E)

久しぶりに見返してみて気づいたんだけど、この記事作成したの自分の誕生日なんだけど、こいつ自分の誕生日になにやってるの
Railsのフォームデータを配列とハッシュ構造で取得する方法

配列内にハッシュが入った形式でのフォームデータ取得例。要するにネストしたパラメータの取得方法です。
例は、フォームのチェックボックスでチェックした値とそれに紐づくテキスト情報を取得する方法です。

## view側のフォーム例

```
# slim
= hidden_field_tag 'hoge_task[tasks][][hoge_id]', hoge_id
= check_box_tag 'hoge_task[tasks][][checked]', 1, false, { disabled: false }
= hoge_name
= text_area_tag 'hoge_task[tasks][][note]', note
```

注意:checkboxを先頭に持っていくとチェックされていない時値が入らないため、値がずれて取得してしまうので、常にフィールドが送信されるテキストやhiddenを先頭に持っていくようにした方がいい。

## Strong Parameters

```
params.require(:hoge_task).permit(tasks: [%w(hoge_id checked note)])
```

## 取得結果

```
 "hoge_task"=>
  {"tasks"=>
    [{"hoge_id"=>"1", "note"=>"aaaaaa"},
     {"hoge_id"=>"2", "checked"=>"1", "note"=>"bbbbbbbbbbbb"},
     {"hoge_id"=>"3", "note"=>"ccccccccccc"}]}
```
Qiitaへ記事を投稿する際の基本的な手順

弊社の若手プログラマーにQiitaへ記事を投稿してもらう際の基本的な手順を下記に記載いたします。

- まず手書きで本文のアウトラインを書く
- ソースコードを書いて、動作することを確かめる
- エディタで本文の清書を作成する
- ソースコードから必要な内容をコピー&ペーストする
技術英語 > I believe with a relatively few minor modifications, the transporter system could be used to retrieve a sample of the metreon cloud surrounding Rinax. > To what end?

@ Star Trek Voyager > JETREL

科学者であるJETRELがJaneway艦長に装置の改良を申し出る。それに対するJanewayの言葉。

> [JETREL] I believe with a relatively few minor modifications, the transporter system could be used to retrieve a sample of the metreon cloud surrounding Rinax.
 
> [Janeway] <font color=red>To what end?</font>

「何のために?」

a sample of the metreon cloudを何故取得したいのか、という疑問。

<hr>
http://ejje.weblio.jp/content/to+what+end

> 1. For what purpose

<font color=red>For what purpose</font>とも言い換えできそう。

<hr>
Herokuにログインしようとしたら「Unable to verify certificate, please set ... 」みたいなこと言われた

centOS(6.7)で、Railsのプロジェクトを作ってHerokuにupしようとした時に起きました。
例のごとく、「 heroku login 」を実行したら以下のようなエラーが。

```
$ heroku login
Installing Heroku Toolbelt v4... !    Heroku client internal error.
 !    Search for help at: https://help.heroku.com
 !    Or report a bug at: https://github.com/heroku/heroku/issues/new

    Error:       Unable to verify certificate, please set `Excon.defaults[:ssl_ca_path] = path_to_certs`, `ENV['SSL_CERT_DIR'] = path_to_certs`, `Excon.defaults[:ssl_ca_file] = path_to_file`, `ENV['SSL_CERT_FILE'] = path_to_file`, `Excon.defaults[:ssl_verify_callback] = callback` (see OpenSSL::SSL::SSLContext#verify_callback), or `Excon.defaults[:ssl_verify_peer] = false` (less secure). (Excon::Errors::SocketError)
    Command:     heroku login
    Version:     heroku-toolbelt/3.42.20 (x86_64-linux) ruby/2.1.6
    Error ID:    cde4cdcf90fd4d688d8d2bbb1ccacf3c
```

なんだか
　「certファイルとかその辺設定せぇや！」
みたいなことを言われてるっぽいです。

それらを設定すれば解決するかもですが、とりあえず　SSL認証をさせない方法で回避しました。
以下のように　「HEROKU_SSL_VERIFY=disable」を付け加えればSSL認証を行わずに実行してくれます。

```
$ HEROKU_SSL_VERIFY=disable heroku login
Enter your Heroku credentials.
Email: *****@****.com
Password (typing will be hidden): 
Logged in as *****@****.com
```

でけた！！
アプリの総ファイル数やコードの総行数を表示してみる

がんばって作ったアプリ、今何行コードを書いたか知りたいことありますよね。
clocを使って調べてみましょう。

#Homebrewのインストール

```Treminal.app
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
<参照>
http://brew.sh/index_ja.html

# clocのインストール
```lang:Terminal.app
$ brew install cloc
```

# clocの実行

```lang:Terminal.app
$ cloc /Desktop/アプリのフォルダ

    2200 text files.
    1320 unique files.                                          
     989 files ignored.

http://cloc.sourceforge.net v 1.64  T=9.03 s (134.4 files/s, 11841.7 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Objective C                    259           8956           5159          37445
C/C++ Header                   646          10475          17622          16255
D                              276              0              0           4422
Objective C++                   17            827            302           3682
C++                              1            164            156            754
Swift                            3             65             33            212
Bourne Shell                     7             32             19            179
JSON                             4              0              0            154
-------------------------------------------------------------------------------
SUM:                          1213          20519          23291          63103
-------------------------------------------------------------------------------

```

こんな感じで出力されます。
たくさん書きゃいいってもんじゃないですが、気になった人はぜひ調べてみてはいかがでしょうか。
VirtualBox (Windows10) 上に Debian/Jessie をセットアップする (インストール編1 )


インストール編は画像ばっかりでページが大きくなってしまったので2つに分けようと思います。

1. BIOS の設定と仮想マシンの作成・設定
2. Debian を仮想マシンにインストール

今回は "1. BIOS の設定と仮想マシンの作成・設定" です。

# BIOS の設定

なにも考えずに VisualBox で仮想マシンを作ろうとすると、
ゲストOS に 64bit OS が選択できず、ハマります。

こちら => http://did2memo.net/2015/07/10/virtualbox-64-bit-os/ などを参考に BIOS で `Intel Virtualization Technology` を `Enable` (つまり `有効`) にしておいてください。

これは ゼッタイ です。

# 仮想マシンの作成

![inst0.png](https://qiita-image-store.s3.amazonaws.com/0/97187/95834259-945e-d8a2-a4c6-f53af57c6cf1.png)

画像はインチキですが、 `新規` から仮想マシンの作成に入ってください。

![inst1.png](https://qiita-image-store.s3.amazonaws.com/0/97187/7687144e-b63a-a218-2d5d-8ed5a1193f9e.png)

`debian` と書くと勝手にタイプやバージョンが入ります

![inst2.png](https://qiita-image-store.s3.amazonaws.com/0/97187/9ca0ccf6-e5b8-2dd9-d32b-402bbb998a85.png)

メモリーサイズは許す限り大きめがいいかもしれません。
ホストも同時にゴリゴリ使うなら話は別ですが...

![inst3.png](https://qiita-image-store.s3.amazonaws.com/0/97187/f1c297d9-d48b-92b8-dae1-6507508f094e.png)

そのまま

![inst4.png](https://qiita-image-store.s3.amazonaws.com/0/97187/cafb823e-9c86-de46-f448-628238522d88.png)

そのまま

![inst5.png](https://qiita-image-store.s3.amazonaws.com/0/97187/27cdde18-8718-f98f-9b73-a668a91bd414.png)

そのまま

![inst6.png](https://qiita-image-store.s3.amazonaws.com/0/97187/5c333207-d19f-c86f-5d35-99c0bb96702c.png)

ちょっと大きめに取りましょう、せめて 32 or 64 GBほしいですね。
あとから、サイズを大きくすることも可能ですが、正直めんどくさい作業です。

`作成` ボタンを押すと仮想マシンができましたね♪

# 仮想マシンの設定

![inst0.png](https://qiita-image-store.s3.amazonaws.com/0/97187/95834259-945e-d8a2-a4c6-f53af57c6cf1.png)

この画像もインチキですが、作成した仮想マシンを選択して `設定` を行いましょう。

![inst7.png](https://qiita-image-store.s3.amazonaws.com/0/97187/711f3000-bc6e-a15c-c119-ebe2c8abbfc3.png)

`プロセッサー数`も可能な限り大きいほうがいいでしょう。
ただ、どれだけ debian のインストール速度に貢献するんでしょうかね...?

![inst8.png](https://qiita-image-store.s3.amazonaws.com/0/97187/489bd726-63eb-e283-a036-796f110b9d99.png)

これもインストール後でいい内容ですが、なんとなく先に設定しています。

ビデオメモリーのアップや 3D アクセラレーションの有効化などは、Gnome3 の滑らかな動きに貢献するので設定しておくのがおすすめです。

![inst9.png](https://qiita-image-store.s3.amazonaws.com/0/97187/878ad09b-e680-3593-6cfa-86474c0e88f0.png)

**準備編** でダウンロードした `debian-8.2.0-amd64-DVD-1.iso` をここで指定します。

`******.iso.torrent`ではありませんよ。uTorrent などを使ってダウンロードした iso ファイルを指定します。

設定はこれにておわりです。 `OK` を押して閉じてください。

# 仮想マシンの起動

![inst0.png](https://qiita-image-store.s3.amazonaws.com/0/97187/95834259-945e-d8a2-a4c6-f53af57c6cf1.png)

またもインチキ画像ですが、設定した仮想マシンを選択して `起動` しましょう。

![inst10.png](https://qiita-image-store.s3.amazonaws.com/0/97187/953c6653-7a26-c329-254f-868ac48fd9fb.png)

こんなポップアップが出てきても心配はありません。

`debian-8.2.0-amd64-DVD-1.iso` が設定されていること見て安心して`起動` を押しましょう。

さあ、installer boot menu が出てきてワクワクしてきましたね?

![debian-vm1.png](https://qiita-image-store.s3.amazonaws.com/0/97187/3b8bb9f4-8a3d-a021-4d4c-6e8311186ad0.png)

次回は debian installer についてです。


インストール編2 へつづく...
順列の生成

#順列の生成
itertoolsのpermutationをつかって順列の生成
itertoolsはイテレータ生成のモジュールです。
##
```test_permutation.py
import itertools
print('permutations(range(4))   : ', list(itertools.permutations(range(4) ) ) )
print('permutations(range(4), 2): ', list(itertools.permutations(range(4), 2 ) ) )
```
> permutations(range(4))   :  [(0, 1, 2, 3), (0, 1, 3, 2), (0, 2, 1, 3), (0, 2, 3, 1), (0, 3, 1, 2), (0, 3, 2, 1), (1, 0, 2, 3), (1, 0, 3, 2), (1, 2, 0, 3), (1, 2, 3, 0), (1, 3, 0, 2), (1, 3, 2, 0), (2, 0, 1, 3), (2, 0, 3, 1), (2, 1, 0, 3), (2, 1, 3, 0), (2, 3, 0, 1), (2, 3, 1, 0), (3, 0, 1, 2), (3, 0, 2, 1), (3, 1, 0, 2), (3, 1, 2, 0), (3, 2, 0, 1), (3, 2, 1, 0)]
permutations(range(4), 2):  [(0, 1), (0, 2), (0, 3), (1, 0), (1, 2), (1, 3), (2, 0), (2, 1), (2, 3), (3, 0), (3, 1), (3, 2)]

こんな感じで簡単に順列を生成できます。第一引数にiterableなもの、第二引数を入れると数列の数を決めれます。

###
この順列生成には受け取ったiterableなもの(listとか)位置しか考慮していないので、同じ数等を含んでいた場合に重複してしまいます。
例えば、`[1,2,2]`を渡すと、`1,2,2`は`.permutations`内では`0,1,2`としか考えられていない。
なので、同じ数が現れることを考慮されていません。
解決策としては、set()で重複をなくすのが一番手っ取り早いです。
set()にすると数列が大きくなった場合にメモリをすごく使うことになるので注意です。
gulp シリーズ3 〜watch編〜

さて、gulp-sassをインストールしたのはいいものの、毎回ターミナルからコマンドを打つのは面倒だ。自動化したい。

そこで、watchタスクの出番。

今回追加したタスクは下記のみ。

```js

gulp.task('default', function(){
	gulp.watch('develop/sass/**/*.scss', ['sass']);
});
```

gulpがwatchメソッドを持っているため、gulp.watchの1文を追加するだけでsassタスクを随時監視してくれる。お便利。

しかもdefaultタスクとして登録しておけば、```gulp```とターミナルに打つだけでOK。

現在までのgulpfile.jsはこの通り。

```js

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function(){
	gulp.src('develop/sass/**/*.scss')
		.pipe(sass({
			outputStyle: 'expanded'
		}))
		.pipe(gulp.dest('httpdocs/css/'));
});

gulp.task('default', function(){
	gulp.watch('develop/sass/**/*.scss', ['sass']);
});

```

今日はここまで。
Ruby on Railsでバリデーションエラーメッセージを個別で取得


バリデーションのエラーが発生している状態で

```
@base=
  #<Hoge:0x007fa48ba76e08
   id: nil,
   text: nil,
   created_at: nil,
   updated_at: nil>,
 @messages=
  {:text=>["を入力してください"]}
```


全てのエラーメッセージは`obj.errors.full_messages`で取得

```
[11] pry(main)> hoge.errors.full_messages
=> [
 "メッセージを入力してください",
]
```

個別のエラーメッセージは`full_messages_for(Slymbol)`で取得できる

```
[13] pry(main)> hoge.errors.full_messages_for(:text)
=> ["メッセージを入力してください"]
```
[baserCMS]load_schema と write_schema でDB内のテーブルを簡単に更新する

baserCMSには、load_schema と write_schema を管理画面から簡単に利用できる仕組みが「実は」あります。
それについてご紹介です。

## 想定している対象者
- baserCMSでウェブサイトを制作をしている方
- baserCMSのプラグインを開発してる方
- baserCMSのプラグインを、これから作ってみようと思ってる方
- PHPer

## スキーマファイル
DBのテーブル構造を定義しているファイルです。こんなのです。
https://github.com/baserproject/basercms/blob/master/lib/Baser/Config/Schema/pages.php


## load_schema
作成したスキーマファイルを、管理画面からアップロードするだけで、DB内のテーブルを作成・構造変更・削除 ができる機能です。

- /admin/tools/load_schema とURLを叩いてアクセスします。
- 「作成、構造変更、削除」内から目的とする処理を選択します。
- 作成していたスキーマファイルをアップロードします。
- 「読み込み」ボタンで読み込みを実行します。
- おわり

### これを知っておくと何が便利なのか？
プラグインを作成中に、あとからテーブルの追加が必要になった場合に、アップデータを作成せずとも、ここからファイルをアップしたら作成されるので便利です。
変更にも便利です。

## write_schema
利用中のDBのテーブル構造を定義したスキーマファイルを、管理画面からダウンロードできる機能です。
生成するテーブルはひとつでも複数でも指定できます。

- /admin/tools/write_schema とURLを叩いてアクセスします。
- ダウンロードしたいテーブルを選択します。
- 「生成」ボタンを押下すると、ファイルが落ちてきます。
- おわり

### これを知っておくと何が便利なのか？
phpMyAdmin とか SequelPro 等でテーブルを作成した内容を、プラグインに同梱しておくためのスキーマファイルとして作成するのに便利です。
構造変更した際も、これなら簡単に再度生成できます。


## 参考記事
- http://basercms.net/manuals/3/programmers/4.html#section4
RaspBerry Piの初期設定

このあいだ秋月電子でRaspberry pi 2 Bを購入した。初期設定について、それぞれのサイトではいろいろやり方を掲載しているが、知識点をまとめてメモしておく。

# 材料

+ RaspBerry Pi (できればB+以上)
+ 容量8G以上のmicroSD Card(最低でも4G確保しておく。16Gでclass10のものは、OSをインストールする際3.3Mb/sの書き込み速度があるので非常に助かる。しかもアキバではすでに千円切っている)
+  マウス、キーボード(できれば無線マウス、キーボードのセット。RasPiはHubなしにUSB4つしかない、後ほどwifiやBluetoothを挿すスペースがなくなる)
+  モニター(HDMIの使えるテレビも可)
+  無線LAN子機(個人はELECOMのWDC-150SU2を使っている。)もしくはLANケーブル
+  自分用のパソコンとインターネットの接続…

# 方法
## パソコンでの操作
+ まずは、面倒を省けるために[ここ](https://www.raspberrypi.org/downloads/)で「NOOBS」という便利道具をダウンロードする。(ケーブルでインターネットにつなげた場合以外はLite版を使わない。1G弱程度のzipファイル、意外に結構時間かかった)。
+ microSDカードをフォーマットする。FAT32で結構だ。もしRasPiのOSの再インストールの場合は[ここ](http://blog.soramimi.jp/?p=66)の方法でSD Formatter 4.0を使ってフォーマットする。
+ 先ほどダウンロードしたNOOBSのzipをフォーマット済みのSDカードへ解凍して、SDカードをRasPiに装着する。

##RaspBerry Piを立ち上がる
+ HDMIやマウス、キーボード諸々を装着する。
+ パソコンのUSBまたは2A以上容量のUSB充電器からRasPiへ給電する。
+ この時、モニター画面に表示する指示に従って進む。但し、英語状態で行うこと。でなければ、ひどく文字化けすることがある。
+ インストール完了したら、自動的にrebootされ、RaspbianのGUIが立ち上がる。

##フォントと入力とソフトの更新
+ まずはOSをアップデートする。Terminalを立ち上げて以下のコマンドを入れる。```sudo rpi-update```　(余談だが、Linuxのコピペは選ぶことはコピー、マウスミドルボタンはペースト)
+ 次にapt-getもアップデートする。```apt-get update```
+ そしてフォントを入れる。(日本語と中国語2種類のフォントを用意した。漢字のカバー率を考えてみると、中国語フォントの方をお勧めする。)
    + 日本語フォント
     ``` sudo apt-get -y install fonts-vlgothic ```(-y入れないとあとはYを自力で入力する羽目になる)
    + 中国語フォント
     ``` sudo apt-get -y install ttf-wqy-zenhei```
+ 続いては日本語入力。(ついでに中国語入力も入れた)。その後手動設定が必要になるが、[ここ](http://ryus.co.jp/blog/raspberrypi2-4/)を参考にすればよい
    
```
 sudo apt-get -y install ibus-anthy ibus-pinyin
```
+ 最後はすべてのアプリケーションを網羅してアップグレードする。(10/22追伸：vimも入れ直さないと後色々苦労するので```sudo apt-get -y vim```も一応入れておく)

```
sudo apt-get -y upgrade
```

##言語、タイムゾーン、キーボードとSSHの設定
+ 現地化設定。```sudo raspi-config```で全部セレクトできるが、```sudo dpkg-reconfigure locales```で表示言語、```dpkg-reconfigure keyboard-configuration```でキーボード、```dpkg-reconfigure tzdata```でタイムゾーンをそれぞれ設定できる。バッチ処理も可能なので、[ここ](http://oswald.hatenablog.com/entry/2014/01/27/201105)を参考にして。(10/21追伸:上記の方法はアクセス許可の不備があるので、[ここ](http://qiita.com/tukiyo3/items/b2642370352ebffb5480)の記事をみる
+ 設定する時、スペースキーはセレクトで、タブキーでOKを押す。
+ SSH設定```sudo raspi-config```のAdvanced Optionメニューで設定する。
+ すべて終わったら、```reboot```する

# 考察 
　今回初めてRaspberry PiのようなOSをもっているマイコンを扱うので、いろいろ迷った。意外にいろいろついていて便利だった。YouTubeは遅いが見れて[HTML5test](https://html5test.com/)でのテストも344点もあった。これからBluetoothもテストする予定である。
WordPressで投稿記事のページ送りをする

#初めに
今回は,WordPressの投稿記事を表示して行ってある程度表示したら次のページといったようなページ送りするといったもの実装して結構使いそうだなと思ったのでここにまとめておく.

#query_posts( $arg )
このWordPressAPIを実行すると,have_posts()などのAPIで使用できるように記事を取得してくれる.
$arg変数に様々なパラメーターをつけることで取得する記事を選択できる.
[query_posts で指定できるパラメーター](http://www.understandard.net/wordpress/wp009.html)
に色々書いてあったのでそこを参考にするといいかと思う.

#posts_nav_link( $sep, $prelabel, $nextlabel );
$sep -> $prelabelと$nextlabelの間に表示する文字列  
$prelabel -> 一ページ戻るリンクに表示する文字列  
$nextlabel -> 一ページ進むリンクに表示する文字列  

    posts_nav_link( ' | ', 'Prev', 'Next' );
を実行すると進むページがあって戻るページがあると以下のように表示される.

    Prev | Next

また,戻るページがないと$prelabelが表示されず,逆に進むページがないと$nextlabelが表示されない.また,いずれかもしくは両方のページがない場合は$sepも表示されない.

#実装

    //現在のページ数を取得する.
    $paged = get_query_var('paged');
    
    //posts_per_pageで取得する投稿記事数と
    //pagedで現在のページ(ページに合わせて表示する記事を取得する)を指定している.
    query_posts( 'posts_per_page=20&paged=' . $paged );
    
    if( have_posts() ) :
      while( have_posts() ) :
        the_title();    //ここに好きな処理を実行する.
      endwhile;
    endif;

    //このAPIでPrev, Nextがaタグのようにして戻る進むが表示される.
    posts_nav_link( ' | ', 'Prev', 'Next' );
    
    //公式ドキュメントでquery_postsを実行して用が済んだらこのAPIを実行しろと書いてある.
    wp_reset_query();
Karma で XHR で Binary File を読み込む Unit Test を書く / TypeScript による Alembic の読み込み 3

#前回
[Karma で XHR で Binary File 読み込む時の問題 / TypeScript による Alembic の読み込み 2](http://qiita.com/wokia/items/63a99bd8675172e774f1)

#Karma Web-Server からの Binary File Read は危険.
XHR を利用して Karma に用意されている Web-Server から Binary File を arraybuffer を読み込むと、問題が起こる事が分かった. 実際にどういった事がおこるかは[前回](http://qiita.com/wokia/items/63a99bd8675172e774f1)を参照.

さらに、前回は先頭の 1 byte が被害を受けている様に書いたが、最上位ビットが立っている全ての byte が被害にあう様だ. 状況からいって、何らかのエンコード処理を強制的に受けているっぽい. さすがにこれは場当たり的な対応では回避できないので、根本的な対応が必要になった.

#XHR の宛先だけを変える.
Alembic の読み込み処理を作りたいので、Binary File を扱う部分は変えられない. 必然的に、XHR は必要になる. また、Unit Test も外せないし Karma+Jasmine+PhantomJS の組み合わせは、今実装している内容にはとても良い.

なので、現状の環境は維持しつつ、XHR に対して正しく返答してくれる先を用意する事にした. 具体的には、Karma とは別に XHR に返答してくれる Web-Server を事前にたてておき、Unit Test での XHR はそちらに送る事で、XHR で Binary File を受け取りつつ現状の Test 環境を維持できると考えた.

#XHR の宛先を立てる.
現状、gulp を用いた build 環境を構築しているので、gulp で使える用途にあった module を探した. いくつか選択肢があったが、人気が高そうだった gulp-connect を使う事にした.
https://www.npmjs.com/package/gulp-connect

gulp-connect は、gulp API のコンセプトとあっていないという事から deprecated になっている様だ. 現在は gulp API にあわせて書き直された gulp-webserver というのもあるらしい.
https://www.npmjs.com/package/gulp-webserver

ただ、そもそも karma が gulp API にそっていないし、karma の現状の呼び出し方から考えると明示的に Server を止められた方が良いと思うため、今回は gulp-connect を利用している.

また、XHR に返答して貰わないといけないので、CORS (Cross-origin resource sharing) に対応している必要がある. 下記の module を利用する事で、gulp-connect でたてた Web-Server を CORS に対応させる事ができる.
https://www.npmjs.com/package/cors

#gulp task を作る.
もともと、karma を起動している直前で、gulp-connect を利用して Unit Test で利用したい Binary File を管理する Web-Server をたて、全ての Test が終了したら Web-Server を落とす、という task を用意したい. 下記の様に task を書く事で実現できた.

```js
gulp.task('test', ['compile-spec-typescript'], function(done) {
	connect.server({
		root: 'spec',
		port: 8000,
		middleware: function() {
			return [cors()];
		}
	});

	karma.server.start({
		configFile: __dirname + '/karma.conf.js',
		singleRun: true
	}, function(exitCode) {
		connect.serverClose();
		done();
	})
})
```

それぞれの module のおかげで、とても簡潔にかける. すばらしい !!

ちなみに、karma の呼び出し方が現在は非推奨な形にしているのはわざと. 推奨されている書き方だと、Test に失敗した場合に例外が発生して、それ以降の Test が何故かキャンセルされてしまう. 非推奨の形だと、ちゃんと Test 自体は継続してくれるので、こうしている….

#Unit Test から XHR を送る.
http://localhost:8000 として XHR を受け取る Web-Server をたてたので、宛先をそれに合わせて書き換える. 下記の様に書く事で問題なく動作した.

```js:
describe('File read test using XMLHttpRequest', function() {
	var request = new XMLHttpRequest();

	beforeAll(function (done) {
		request.open('GET', 'http://localhost:8000/assets/test.bin', true);

		request.responseType = 'arraybuffer';
		request.addEventListener('loadend', function () {
			done();
		});

		request.send();
	})

	it('Read binary files?', function() {
		expect(request.status).toBe(200);
		expect(request.response).toEqual(jasmine.any(ArrayBuffer));

		var buffer = <ArrayBuffer>request.response;
		expect(buffer.byteLength).toBe(8);
	})
})
```

現在、jasmine 2.0 を利用しているので beforeAll で XHR を発行して同期をとっているが、jasmine 1.0 の場合は runs/waitFor を使って発行する事になると思う.

上記では Test していないが、もちろん内容も正しく帰ってくるようになり、アドホックな対応も書く必要がなくなった.

#という訳で
つづく…

次回こそ Alembic の中身に…. っていうか、HDF5 って凄くめんどくさい. Ogawa に完全以降してから始めれば良かったかも….