OmniAICreator/Qiita-1.07M huggingface dataset:
Re:VIEWをこうしたい計画（私案）

合意は取れてないです。2.0くらいで…と思っているのだけれど、全部やるには時間がかかりそうだから、いっそのこといくつかに切り分けて全部やるのは3.0くらいにするべきかも。

# 「プロジェクト」の概念を明確化する

Re:VIEWはconfig.ymlとcatalog.ymlによる「書籍（≒複数の章の集合体）」を設定するところから始まるのだけれど、簡単に扱うために「章」単位でコンパイルできるようにするしくみもある。が、明確化のためには、書籍単位のデータ・ファイル作成をもっと前面に押し出すべき。

用語としては「プロジェクト」とすればいいような気がする（『はじめてのReVIEW』でも使っていたし）ので、これを公式用語にするのでどうか。

やるべきことは以下。

* review-initを使いやすくして推奨する
* ドキュメントを修正する

# Webサイト版を作れるようにする

WEBMaker（仮）を作って、Webサイト用のHTMLを吐けるようにする
Web版には以下の機能が付け加わる。

* サイトメニュー（スマホ向けにはメニュー）で目次が出る
* 次の章・前の章・トップへのリンクがつく

## templatesディレクトリを作って、HTMLのテンプレートはそちらに集約する

すでにXHTML1.0/HTML5対応で破綻気味な上に、Webサイト版を作るとどうにもならなくなりそうなので、ちゃんとテンプレート（エンジン）を使うようにする。
とりあえずERbを使えば何とかなるのでは。

# なんでも config.yml に寄せる

`config.yml`以外のオプションは極力排除する。まあ何かしら上書きはできるようにしてもいいけど、「オプションでしか指定できない」ものなくす。

具体的には、review-compileのオプションとして`--target`は残す（個別のターゲットを指定できるようにするため）けど、それ以外は`--yaml=YAML`で指定できるようにする（`--yaml`オプションについては後述）。

`catalog.yml`とか`locale.yml`も`config.yml`内の設定項目にすることで、暗黙のデフォルトではなくす（が、明示的に指定できるだけで、暗黙ではないデフォルトにはなるのかも）。

## config.ymlの`params:`でしか設定できないものはなくす

config.yml自体に項目を設けて、そちらで設定するようにする。

## config.yml を暗黙のデフォルトにする

kdmsnrさんがこういう主張をしていた気がする。
以前は「環境によってconfig.ymlを使い分ける」派だったのだけれど、それはそれでDRYじゃないというか、いろいろ考えると一つのファイルに集約させたくなりそうかな、というのが今の結論。一つに集約させるのであればデフォルトにしてもいいのかも、という気持ち。

これができると、上記のreview-compileコマンドについても、`--yaml`オプションがない場合でも`config.yml`が読み込まれるようになる。これがいいかどうかは不明だけど分かりやすくはあるかも。

## 環境を指定できるようにする

これは逆にコマンドラインオプションを増やす方向になるのだけれど、`--env sample`とか`--env printing`とかを指定できるようにして、それぞれで違う文書を生成できるようにする。

使い分けたいのは以下。

* 電子書籍版PDF、EPUB: これが標準
* 試し読み版PDF、EPUB: サンプル版で、いくつかの章のみにして（catalog.ymlを変更する）、「サンプル版はここまでです。続きは云々かんぬん」というページを突っ込む　
* 印刷版PDF:　表紙なし、モノクロ指定？（画像はどうするんだ…）。

# 国際化対応を真面目にする

ReVIEW::I18n対応がだいぶ進んだけれど、根本的なところでできていないところもあるので何とかしたい。

* review-initコマンドでは、せめて日本語用と英語用のプロジェクトを作れるようにする
    * config.yml の英語版を用意して、英語の時にはそちらが生成されるようにする

review-initのデフォルトが問題で、国際化するのであればデフォルト英語になっていた方がいいような気がするけど、日本人向けにはreview-init --lang ja とか面倒くさいだけなのでちょっと二の足を踏む。
あるいはreview-jinitコマンドとかを追加した方がいいのかも。

# parserを置き換える

遅々として進んでいないけれど細々と続けてはいます。

## インラインは入れ子にできるようにする

これは実現できそう。

## ブロックの入れ子もある程度はできるようにする

<del>これが現状うまくいっていない。</del>
**追記：**どうやらこちらも解決できそう。

ブロックといってもいくつか種類があって、少なくとも2通りの違いがある。

* ブロック内のコンテンツとしてブロックをとるもの（例: //lead{ .. //}）
* ブロック内のコンテンツとしてブロックをとらないもの（例: //emlist{ .. //}）

<del>現在は両者を区別していない。ので、うまくいっていない。</del>
**追記:** 結局、通常のブロック要素以外にコードブロック要素を導入した。こちらは入れ子を許さず、また改行などの情報も落とさないようにした。

例えばHTMLでは要素ごとにコンテンツとして何が取れるかどうかを決められる（実際HTMLのスキーマではそのように定義されている）のだが、そもそもRe:VIEWではreview-ext.rbなどで後からタグを追加する可能性があるので、要素単位で事前に指定することはできない。要素を追加するときに何かしらの区別ができるよう、しくみを追加しなければならない<del>（どうすんのがいいのかな…？）</del>。
**追記：** この件については、通常のブロック要素を定義するCompiler.defblockメソッド以外にコードブロック要素用にCompiler.defcodeblockメソッドを追加した。これを使えば、コードブロック要素は後からでも定義できる。
コードブロック要素については、パーサの実行時に要素かどうかのチェックを入れた。

## エラーチェックは後で頑張る

最初の時点ではエラーチェックは難しいというか、無理やり解釈してしまいそうな気がする…。
具体的には、中途半端なタグ「`@<br>` (`{}`がついてない)」みたいなのをそのまま通してしまいそう（エラーは出さずに、単にそういう文字列があるんだとして解釈する）。ルールを頑張ればエラーにできるはずだけど、そこまでやるのは時間がかかりそうなのでそこは後回しにしたい。


# あわせて読みたい

* [Re:VIEWのコードハイライト改訂案](http://qiita.com/takahashim/items/e62c89ac561566c4e0da)
* [次期Re:VIEW parserに関するメモ](http://qiita.com/takahashim/items/9908e1fb4d19ad9b158f)
間違えてコミットしてしまった時の対処法


# シチュエーション
別のブランチを切ってコミットしようと思っていた差分を、誤ってコミットしてしまった時。

# 手順
まずは誤りの最新コミットを差分に戻し、別のブランチにコミットする。

## 1. 誤コミットをadd前の状態に戻す。

```
$ git reset HEAD^
```

これで一つ前のコミット直後の状態に戻る。最新のコミットだった差分はadd前の状態に戻る。

## 2. 差分を保留にしてmasterブランチへ
```
$ git stash
$ git checkout master
```

## 3. 新しいブランチを切ってチェックアウト

```
$ git branch hogehoge
$ git checkout hogehoge
```
※hogehogeは新しいブランチ名

## 4. 保留した差分をもとに戻してコミット

```
$ git stash pop
$ git commit -a
```


これでOK
PEARのインストール方法



コードスニファー入れるにあたりPEARが必要になったので入れた。「ぴあ」じゃなくて「ぺあ」って読むんだぜこれ。

# PEARとは

PHPで利用する事ができるライブラリのリポジトリ。ネットワークからライブラリをインストールできる。


# インストール

## 環境
Mac OSX 10.9.5

## PEARのインストール

```
$ sudo php /usr/lib/php/install-pear-nozlib.phar
```

以下のメッセージがでる。

```
Password:
[PEAR] Archive_Tar    - installed: 1.3.7
[PEAR] Console_Getopt - installed: 1.3.0
[PEAR] Structures_Graph- installed: 1.0.4
[PEAR] XML_Util       - installed: 1.2.1
[PEAR] PEAR           - installed: 1.9.2
Wrote PEAR system config file at: /private/etc/pear.conf
You may want to add: /usr/lib/php/pear to your php.ini include_path
```


## php.iniの作成
/etc/php.iniのファイルが存在するかどうか確認。存在しなければ以下を実行してコピーする。

```
$ sudo cp /etc/php.ini.default /etc/php.ini
```

## パス指定

###追加前

```ini:php.ini
include_path = ".:/php/includes"
```

###追加後

```ini:php.ini
include_path = ".:/php/includes:/usr/lib/php/pear"
```

## 試してみる

試しに以下のコマンドを打ってみる。

```
$ sudo pear list
```
成功したら以下のようにインストールされてるパッケージの一覧が表示される。

```
Installed packages, channel pear.php.net:
=========================================
Package          Version State
Archive_Tar      1.3.7   stable
Console_Getopt   1.3.0   stable
PEAR             1.9.4   stable
Structures_Graph 1.0.4   stable
XML_Util         1.2.1   stable
```
iframeの中身への直接アクセスを回避する



# やりたいこと

iframeのページにサイト外部から直接アクセスされてしまう事を防ぐ。URLにアクセスされたらリダイレクトされるようにする。

# 手順

## 1. headタグ内に以下のjavascript関数を設定

```javascript:template.html
<script type="text/javascript"><!--
function open_in_child(n){
		if (n == 0 && top.location.href == self.location.href){
			//トップページのURLに変更
			top.location.href='/index.html';
		}
		n++;
}
// --></script>

```



## 2. bodyタグで実行

```html:template.html

<body onLoad="open_in_child(0)">

```



以上。リダイレクト先のURLは適宜変更する。これで直接アクセスできないようになる。
PHPのファイルアップロードサイズの上限値を変更する


# 問題
PHPでファイルアップロード時にうまくいかない時はphp.iniのアップロードサイズの上限設定を疑ってみる。

# 解決手順
## PHPの設定を確認する。

phpinfo()で設定を確認する。

```php:/info.php
<?php
phpinfo();

```

以下の画像の「upload_max_filesize」という項目がアップロードサイズの上限。右がサーバーに設置してあるphp.iniで設定されている値で、左はアプリケーション側で上書きされているときの値。（現在はアプリケーション側で値を変更していないので、php.iniの値がそのまま左にも反映されている）
![スクリーンショット 0027-01-16 午後4.23.31.png](https://qiita-image-store.s3.amazonaws.com/1034/18614/d9e5c383-528e-8b0a-9856-27594b2ff6ac.png)


実際に実行時に採用されるのは左側の値なので、左が変更できればOK。

## 設定を変更する。
### ini_set()では変更できない。
php.iniのupload_max_filesizeという項目はini_set()では変更できない。変更方法は以下の３とおり。

- php.iniを変更する
- htaccessで設定する
- httpd.confで設定する

### 方法1）php.iniを変更する場合
php.iniを開いて、以下の行の値を変更する。

```php:/etc/php.ini
upload_max_filesize = 8M
```

### 方法2）htaccessで設定する
以下の行を追加する。

```/.htaccess
php_value upload_max_filesize "8M"
```

### 方法3）httpd.confで設定する
.htaccessと同様。

```/httpd.conf
php_value upload_max_filesize "8M"
```

# 完了

![スクリーンショット 0027-01-16 午後4.05.34.png](https://qiita-image-store.s3.amazonaws.com/1034/18614/75ae1f5c-192e-693f-2efb-e4c51c75c12f.png)
CakePHPのusersプラグインのDBテーブルを部分的に作り直す


# 問題
usersテーブルを誤って消してしまい、作りなおそうと思って以下を走らせたけど、、、できない。。

```
$ sh /share/app/Console/cake Migrations.migration run all --plugin Users
```

usersプラグインにはusersとuser_detailsの２つのテーブルがあるので、既にいずれかがある場合は動かないっぽい。


# 解決法
こちらのコマンドでusersテーブルだけ再生できた。

```
$ sh /share/app/Console/cake schema create users --plugin Users
```
【composer】Pluginの中身とかがごっそり消えた時の対処法


# composer を使ってるとVendorの下にあるファイルが消える

あるときorigin/masterからローカルリポジトリにpullしたら、Plugin/◯◯ディレクトリの下にあるファイルが全て消えていた。その対処法を書きました。

とりあえず、いつのまにかファイルがごっそり消えてた！そんなときはcomposerを疑おう。

# 対処法
## 1. composerのキャッシュを消す

キャッシュはホームディレクトリ直下の.composerの下のcacheディレクトリ。このcacheディレクトリごと消す。

```
$ cd 
$ cd .composer
$ rm -rf cache
```

### 2. composer update
```
$ php /share/composer.phar update
```
以上

### それでも動かないときは....

$ rm /share/composer.lock
$ php /share/composer.phar update

※composer.lockはバージョンをロックするファイル

## こんなエラーが出た時は...
```
Warning: This development build of composer is over 30 days old. It is recommended to update it by running "composer.phar self-update" to get the latest version.
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files
```
composer自体が古いのでアップデートしてあげる
```
$ php /share/composer.phar self-update
```
これの後に上記を再度実行してみる


# 起こりやすい環境
- Mac（Windowsでは起こらない）
- VirtualBoxの共有ディレクトリ（vagrantもそう）
- composerのVendorディレクトリが共有ディレクトリの中にある
pyenv-virtualenvの使い方まとめ

virtualenvwrapperというものがあって、みんなそれを使ってるみたいだ。

pythonの環境管理ツールは色々あって良く分からないのでvirtualenvだけ使った

## インストール

```
brew install pyenv-virtualenv
```

```.zshrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
```

```
pyenv install 3.4.2
pyenv global 3.4.2
pyenv versions
> system
> *3.4.2
```

## 環境作成

```
pyenv virtualenv 3.4.2 hogehoge
pyenv versions
> system
> *3.4.2
> hogehoge
```

virtualenvで切った環境とpyenvでインストールした環境が同列に出るのね

## 環境切り替え

```
cd workspace
pyenv local hogehoge # .python-version が作成される
```

## 環境削除

```
pyenv uninstall hogehoge
```
chkconfigで自動起動設定する


マスターSとスレーブSが自動同期されなくなったのでおかしいなと思っていたら、サーバーを一度落とした際にlsyncdが止まったままになってた事が発覚。自動起動させる設定にしておかなければという事でメモ。

# chkconfigコマンドを使う

## 自動起動に設定する

```
$ chkconfig lsyncd on
```
これでOK。（lsyncdの部分は任意のサービス名）


## オプション

- --list [起動スクリプト名] 現在の起動スクリプトの状態を表示。起動スクリプト名を省略した場合はすべての起動スクリプトの状態を表示。



|  ||
|:-----------|------------|
| --list [起動スクリプト名]       |現在の起動スクリプトの状態を表示。起動スクリプト名を省略した場合はすべての起動スクリプトの状態を表示。|
|--add 起動スクリプト名|スクリプトを管理対象に追加|
|--del 起動スクリプト名|スクリプトを管理対象から除外|
ELBでアクセスログをとれるようにする


ELBのマネジメントコンソールからアクセスログをとれるように設定する事ができる。ログはS3に保管される。

# マネジメントコンソールから設定
- Descriptionの[Access Logs]の項目の(Edit)をクリック
- Enable Access Logs にチェックを入れる
- Inrterval 60min
- Create the location for me 自動生成するためチェックする

![スクリーンショット 0027-01-07 午前9.49.35.png](https://qiita-image-store.s3.amazonaws.com/1034/18614/66d706d4-dba5-4e50-e1a1-d4099b138f86.png)


# かくにん
Intervalで設定した時間後にS３にアクセスするとログがあるはず！

# 参考
http://dev.classmethod.jp/cloud/aws/elb-featured-accesslog/
javascriptの連想配列と配列の違い


まだたまにわからなくなる時があるのでメモ。

## 連想配列
全てのオブジェクトは連想配列である。以下は全て同じ連想配列。

```javascript:
// 1
var obj = { hoge: 'hoge' };

// 2
var obj = { 'hoge': 'hoge' };

// 3
var obj = {};
obj.hoge = 'hoge';

// 4
var obj = {};
obj['hoge'] = 'hoge';

// 5
var obj = new Object();
obj.hoge = 'hoge';

```

これらのhogeのように連想配列のキーになるシンボルの事をプロパティという。


## 配列
配列プロトタイプを継承したオブジェクトのことである。以下は全て同じ配列。

```
// 1
var array = ['hoge', 'fuga'];

// 2
var array = new Array('hoge', 'fuga');

// 3
var array = Array('hoge', 'fuga');

// 4
var array = [];
array[0] = 'hoge';
array[1] = 'fuga';

// 5
var array = [];
array['0'] = 'hoge'
array['1'] = 'hoge'

// 6
var array = { 0: 'hoge', 1: 'fuga', length: 2 };
array.__proto__ = Array.prototype;

```


## 補足

連想配列の方は上記2,3のこの書き方がしっくり来る

```javascript:
var obj = { 'hoge': 'hoge' };

var obj = {};
obj.hoge = 'hoge';
```

配列の場合には


```javascript:
var array = ['hoge', 'fuga'];
```

はしっくり来ますがそれ以外は

```javascript:
var array = [];
```

と宣言してその配列に代入する場合には、

```javascript:
array.push('hoge')
array.push('fuga')
```


というのが多い。


### 要素をループして列挙する時の注意というか罠

[PHPと異なり，JavaScriptの連想配列とfor in構文には順序の概念がないので注意すること](http://d.hatena.ne.jp/TipsMemo+computer-technology/20140601/p1)

要素の列挙処理などで戸惑う場合は便利なユーティリティ系のライブラリを使って書いたほうがいい。

Underscore.jsの使いドコロとしては、WebAPI的とかバックエンド側のPHPから生成されるJSONフォーマットなデータを一旦まるごと受け取って、クライアント側で

- 必要な箇所だけフィルタかけて表示する
- 特定のキーでソートする（例：名前順とか、何かの数値が大きい・小さい順など）

というようなことをさせたい場合に、取得済のJSONに対して色々加工して、その後にUnderscore.jsのtemplateの機能を呼び出して画面の再描画みたいなことが出てくるとUnderscore.jsの有り難みがとても出てくるはず。
jQueryのajax()を利用すると返り値をとりたいときのやり方


# 問題

## jQueryのajaxで返り値がとれない
以下のtest()の結果はundefinedに

```javascript:
function test(){
    $.ajax({
        type: 'GET',
        url: 'http://kitagawa.keiko'
        dataType: 'text',
        success: function(response){
            return response;
        },
    	error: function(response){
            return response;
    	});
}

var result = test(); // undefined

```
## 原因
ajax()はデフォルトで非同期通信をするため。非同期通信はレスポンスが返る前に次の処理にいく。


# 解決策

基本的には2番めの方がおすすめ。

## その１．同期通信にする

async: falseとすると、同期通信になる。 ただし同期通信の場合は時間がかかる処理をすると、その間UIがロックされてしまう。なのであまりやらない方がいい。

```javascript:
function test(){
    var result = $.ajax({
        type: 'GET',
        url: 'http://kitagawa.keiko',
        async: false
    }).responseText;
    return result;
}

var result = test() //ちゃんと返り値が入ってる;
```



## その２．.done, .fail()をつかう

これだと、非同期通信のまま返り値を得ることができる。こっちの方がおすすめ。

```javascript:
function test(){
    return $.ajax({
        type: 'GET',
        url: 'http://kitagawa.keiko'
    })
}

test().done(function(result) {
    なんか処理
}).fail(function(result) {
    なんか処理
});
```




（参考）http://tkmr.hatenablog.com/entry/2014/08/08/084755
iframeの子要素を取得したいときはcontents()をつかう！


## contents()
要素のテキストノードも含めた全子要素を取得する。対象要素がiframeであれば、呼び出されるコンテンツのDocumentを選択する。


## 使い方
ex) iframeの中身のdivタグの背景色を全て黒色にする

```javascript:
$(function(){
	var iframe = $('iframe').contents();
	iframe.find('div').css('background-color', 'black');
});
```
【保存版】正規表現でエスケープが必要な文字一覧表

|エスケープ前|エスケープ後|注意点|
|:----:|:----:|:----|
|\|\\\|エスケープを行う文字そのものなので、\ だけの記述はできません。\ にマッチングさせたい場合は \\\ と記述してください。|
|*|\\*||
|+|\\+||
|.|\\.||
|?|\\?||
|{ }|\\{\\}|出現回数指定文字なのでエスケープが必要|
|( )|\\(\\)|エスケープしないと後方参照が作成される。またはグループ化される。|
|[ ]|\\[\\]|直前文字の出現回数指定文字なのでエスケープが必要|
|^|\\^|行頭を指定することになる。|
|$|\\$|行末を指定することになる。Perlの場合は、変数の先頭文字である。|
|-|\\-|[　]の中に書く場合のみエスケープが必要|
|&#124;|\\&#124;||
|/|\\/|Perlでは / が正規表現の指定になるのでエスケープが必要。言語によっては、" がエスケープ必要となる。|
scpコマンドでサーバー上のファイルorディレクトリをローカルに落としてくる


# 基本
scpは、sshを使ってネットワーク・ホスト間でファイルを安全にコピーするためのコマンド。

```
scp -i ~/.ssh/secret.pem -r ec2-user@ec2-54-00-00-00.ap-northeast-1.compute.amazonaws.com:/remote/path /local/path
```
# リモートからローカルにコピー
```
$ scp ユーザ名@リモートのホスト名:コピーしたいリモートのファイル ローカルのコピー先

$ scp user@remoteHost:/home/user/test.txt /local/path
```


# ローカルからリモートにコピー
```
$ scp コピーしたいローカルのファイルパス ユーザ名@リモートのホスト名:保存したいパス

$ scp /local/test.txt user@remoteHost:/home/user/tmp/
```

# ディレクトリごとコピーしたい場合

-rオプションを使う。（この場合はリモート→ローカル）

```
$ scp -r user@remoteHost:/remote/dir /local/dir
```

# 秘密鍵で接続しないといけない場合

```
scp -i ~/.ssh/secret.pem -r ec2-user@ec2-54-00-00-00.ap-northeast-1.compute.amazonaws.com:/remote/path /local/path
```

# こんなエラーが出た時

## not a regular file
-rオプションをつけて実行すればOK。

※-rはディレクトリ全体をコピーするオプション

## オプションの説明はこちら
http://itpro.nikkeibp.co.jp/article/COLUMN/20070723/277943/
CakePHP2でラジオボタン縦並び


# やりたいこと

![スクリーンショット 0026-11-25 午後8.06.57.png](https://qiita-image-store.s3.amazonaws.com/1034/18614/648205a4-32a9-4438-bc7f-a6d5a3be1bb8.png)

## 普通にかいたらこうなってしまう

![スクリーンショット 0026-11-25 午後8.07.15.png](https://qiita-image-store.s3.amazonaws.com/1034/18614/f3e52845-084f-1467-3797-9d302d9852d6.png)


# コード

```php:
<?php
$options = array('M' => '男性', 'F' => '女性');
$attributes = array('separator' => '<br>');
echo $this->Form->radio('gender', $options, $attributes);
?>
```

separatorとかあるの初めてしった。
CakePHP2で作ったサイトをRSSリーダーに対応する


CakePHPで作ったサイトURLをFeedlyの検索窓に入れても出てこなかったので対応方法を調べてみた。


# rss拡張子を有効に
routes.phpに以下を追加 

```php:app/Config/routes.php
Router::parseExtensions('rss');
```

# RSS配信したいページのコントローラーにコンポーネントを追加

今回の例はPostsController。

```php:app/Controller/PostsController.php
public $components = array('RequestHandler');
```

# 配信用のアクションを作成

上記コンポーネントを設定したのと同じコントローラーに設定する。

```php:app/Controller/PostsController.php
public function feed() {
    $this->Post->recursive = -1;
    $this->set('entries', $this->Post->find('all', array('order'=>'Post.created desc')));
}
```
# RSS用レイアウトを作成

```php:app/View/Layouts/rss/default.ctp
<?php
if (!isset($channel)):
	$channel = array();
endif;
if (!isset($channel['title'])):
	$channel['title'] = $title_for_layout;
endif;

echo $this->Rss->document(
	$this->Rss->channel(
		array(), $channel, $this->fetch('content')
	)
);
?>
```

# RSSのビューを作る

```php:app/View/Posts/rss/feed.ctp
<?php
$channel = array (
    'title' => 'サイトの名前', //サイトの名前
    'link' => 'http://example.com/', //サイトURL
    'guid' => 'http://example.com/', //サイトURL
    'description' => 'フィードの説明' //フィードの説明
);
$this->set('channel',$channel);
echo $this->Rss->items($posts, 'transformRSS');

function transformRSS($posts) {
    return array(
        'title' => $posts['Post']['name'], //投稿のタイトル
        'link' => array('action' => 'view', $posts['Post']['id']), //投稿の個別ページへのリンク先
        'guid' => array('action' => 'view', $posts['Post']['id']), //投稿の個別ページへのリンク先
        'description' => $posts['Post']['body'], //投稿の本文
        'pubDate' => $posts['Post']['created'] //投稿日時
    );
}
?>


```




# RSSフィードが存在することを知らせる
上記までだとFeedlyとかのRSSリーダーサービスの検索窓に、直接RSSフィードのURLを入れないと認識してくれない。

なので、検索窓にトップページのURLを入れても認識してくれるように、各ページのheadタグに以下のコードを入れる。


```php:app/View/Layouts/default.ctp
<link rel="alternate" type="application/rss+xml" href="http://hoge.com/posts/feed.rss" title="RSS2.0" />
```


# 確認

以下にアクセスして右上の検索窓にサイトのURLを入れてみる。
http://feedly.com/


![スクリーンショット 0026-11-25 午後4.19.25.png](https://qiita-image-store.s3.amazonaws.com/1034/18614/5cb64e7b-cf04-5ae7-799e-6a70a5758d6f.png)



表示されたら完了！
Macの空き容量を上手いこと増やす方法


空き容量がなくなってきた！でもどれ消せばいいかわからない！
そんな時は以下の手順をやってみると綺麗になります。

# 空き容量の確認

1. メニューの[(アップルマーク)]-[このMacについて]を選択。
![スクリーンショット 0026-11-12 午後6.01.07.png](https://qiita-image-store.s3.amazonaws.com/1034/18614/aea65a18-972c-aa48-a3f1-031ffc329e67.png)


2. [詳しい情報]を選択。
![スクリーンショット 0026-11-12 午後6.01.23.png](https://qiita-image-store.s3.amazonaws.com/1034/18614/ce282c7b-0db3-12be-b64c-fbb49c2deab2.png)

3. [ストレージ]タブを選択。
4. 空き容量を確認できる。
![スクリーンショット 0026-11-12 午後6.00.21.png](https://qiita-image-store.s3.amazonaws.com/1034/18614/b1cde147-7c80-2cc9-8a3b-21e0983157b7.png)

# 不要なファイルを削除

1. デスクトップの適当なところをクリック。
- メニューの[移動]-[ホーム]を選択。
- メニューの[表示]-[リスト]を選択。
- メニューの[表示]-[表示オプションを表示]を選ぶ。
- [サイズ]と[すべてのサイズを計算]にチェックを入れて暫く待つ。
- カラムの[サイズ]をクリックし、サイズの大きい順に並び替える。
- 現在のフォルダで、削除してもいいファイルを見つけて消す。
- サイズの大きいフォルダを順に開き、2番〜7番を繰り返す。


これでスッキリ。
CakePHPで任意のディレクトリ下にあるファイル一覧を取得する


# 簡単な使い方

```php:HogesController.php
//フォルダーユーティリティーを読み込む
App::uses('Folder', 'Utility');

public function index() {
	//インスタンスを作成
	$dir = new Folder('path/dir');
	$files = $dir->read();
}

/* 

返却される配列の[0]番目にディレクトリが格納され、[1]番目にファイルリストが格納される。

$files = array(
	[0] => array(
		[0] => 'hogedir', 
		[1] => 'fugadir', 
	),
	[1] => array(
		[0] => 'hogehoge.png', 
		[1] => 'fugafuga.png', 
		[2] => 'piyopiyo'.png
	) 
);
*/

```
こんだけ。


# 補足情報

## Folderインスタンスの生成
```
 $dir = new Folder(WWW_ROOT.'path/',true,0755);
```
- インスタンス化する際に、ディレクトリのパスを指定する。(デフォルトはapp\tmp)
- 第2引数にtrueを指定すると、ディレクトリが存在しない場合は新規作成する(デフォルトはfalse)。
- 第3引数にはディレクトリのパーミッションを指定できる。(デフォルトは0755)
【オレオレ】gulp 初期設定

## 最初
### 作業ディレクトリルートに移動

```leng:Terminal
npm init
gulp -v
[hh:mm:ss] CLI version 3.8.10
```

### CLI versionと同じversionを作業ディレクトリルートにインストール

```lang:Terminal
npm install gulp@3.8.10 --save-dev
```

## 必要なプラグインをインストール

+ sass(scssのbuild)
+ autoprefixer(ベンダープリフィックス勝手につけてくれる)
+ csscomb(cssのプロパティ順、整頓)
+ spritesmith(css spriteの自動作成)
+ styledocco(スタイルガイドの作成)

```lang:Terminal
npm install gulp-sass --save-dev
npm install gulp-autoprefixer --save-dev
npm install gulp-csscomb --save-dev
npm install gulp.spritesmith --save-dev
npm install gulp-styledocco --save-dev
```

## gulpfile.jsを作業ディレクトリルートに作成

### gulpfile.jsの中身

```js:gulpfile.js
var gulp=require('gulp');
var sass = require('gulp-sass');
var autoprefixer = require('gulp-autoprefixer');
var csscomb = require('gulp-csscomb');
var spritesmith = require('gulp.spritesmith');
var styledocco = require('gulp-styledocco');

gulp.task('styledocco', function () {
  gulp.src('dist/css/*.css')
    .pipe(styledocco({
      out: 'docs',
      name: 'styleguide'
    }));
});
gulp.task('styles', function() {
  return gulp.src('src/styles/main.css')
    .pipe(csscomb())
    .pipe(gulp.dest('./build/css'));
});

gulp.task('default', function () {
  gulp.src('sass/*.scss')
  .pipe(sass())
  .pipe(autoprefixer("last 2 version", "ie 8", "ie 7"))
  .pipe(csscomb())
  .pipe(gulp.dest('./dist/css'));
});
gulp.task('sass', function () {
  gulp.src('sass/*.scss')
  .pipe(sass())
  .pipe(autoprefixer("last 2 version", "ie 8", "ie 7"))
  .pipe(csscomb())
  .pipe(gulp.dest('./dist/css'));
});

gulp.task('sprite', function () {
    var spriteData = gulp.src('sprite/*')
        .pipe(spritesmith({
            imgName: 'sprite.png',
            cssName: 'sprite.scss'
        }));
    spriteData.img.pipe(gulp.dest('./dist/images'));
    spriteData.css.pipe(gulp.dest('sass'));
});
```

<small>※上記は自分用なのでまるっとコピーしてできなくても泣かないこと</small>

## プラグインの設定

### csscomb
.csscomb.jsonを作業ディレクトリルートに配置
### .csscomb.jsonの中身
```json:.csscomb.json
{
    "remove-empty-rulesets": true,
    "always-semicolon": true,
    "color-case": "lower",
    "block-indent": "  ",
    "color-shorthand": true,
    "element-case": "lower",
    "eof-newline": false,
    "leading-zero": false,
    "quotes": "double",
    "sort-order-fallback": "abc",
    "space-before-colon": "",
    "space-after-colon": "",
    "space-before-combinator": "",
    "space-after-combinator": "",
    "space-between-declarations": "",
    "space-before-opening-brace": "",
    "space-after-opening-brace": "",
    "space-after-selector-delimiter": "",
    "space-before-selector-delimiter": "",
    "space-before-closing-brace": "",
    "strip-spaces": true,
    "tab-size": true,
    "unitless-zero": true,
    "vendor-prefix-align": true,
    "sort-order": [ [
        "position",
        "top",
        "right",
        "bottom",
        "left"
    ]]
}
```
<small>※上記は自分用なのでまるっとコピーしてできなくても泣かないこと</small>
PHPで任意のディレクトリ下にあるファイルを一覧取得する方法


globという関数を使う。*が使えるので便利。

# 使い方

dir以下のファイルを全て取得してくれる。ファイルがひとつもない場合は空の配列が返ってくる。

```php:
foreach(glob('dir/*') as $file){
	if(is_file($file)){
		echo htmlspecialchars($file);
	}
}
```

拡張子を指定したりもできる。

```php:
foreach(glob('dir/{*.gif,*.zip,*.pdf}',GLOB_BRACE) as $file){
	if(is_file($file)){
		echo htmlspecialchars($file);
	}
}
```

引数にflagsというのをつけていろいろできる。

## 参考（公式サイト）
http://php.net/manual/ja/function.glob.php

> array glob ( string $pattern [, int $flags = 0 ] )
## flags
- GLOB_MARK - 各ディレクトリにスラッシュを追加します
- GLOB_NOSORT - ディレクトリに存在するファイルを返します (ソートはされません)。このフラグを使わない場合は、パス名をアルファベット順にソートします。
- GLOB_NOCHECK - 検索パターンにマッチするファイルが見つからない場合に、 検索パターン自身を返します
- GLOB_NOESCAPE - バックスラッシュによるメタ文字のクォートを行いません
- GLOB_BRACE - {a,b,c} を展開し「a」、「b」あるいは「c」のいずれかにマッチさせます
- GLOB_ONLYDIR - パターンにマッチするディレクトリのみを返します
- GLOB_ERR - (ディレクトリが読めないなどの) 読み込みエラー時に停止します。デフォルトではエラーは無視されます。
クーロン(cron)をさわってみるお


# まずは確認してみよう

crondが起動しているかどうか確認

```
$ service crond status
//または
$ /etc/rc.d/init.d/crond status
```
以下が表示されたらOK。

```
crond (pid  1608) を実行中...
```

## 起動してない場合

```
service crond start
// または
/etc/rc.d/init.d/crond start
```

# さっそく設定ファイルにcronの登録

## 登録

以下のコマンドでcronを登録・削除できる。

```
$ crontab -e
```


### 書き方

5分おきに/home/hoge/fuga.shを実行するという例

```
*/5 * * * * /home/hoge/fuga.sh
```

左から、[分] [時] [日] [月] [曜日] [コマンド]

- 分は0～59の数字で指定
- 時は0～23の数字で指定
- 日は1～31の数字で指定
- 月は1～12の数字で指定
- 曜日に関しても数字で指定し、0と7が日曜日、1以降は順に、月、火、水、木、金、土となる
- コマンドは、設定ファイルでパスを通していないものに関してはフルパスで指定するかカレントディレクトリからの相対パスで指定しなければならない


### 時間の書き方例

```
43 23 * * *               23:43に実行
12 05 * * * 　　          05:12に実行
0 17 * * *                17:00に実行
0 17 * * 1                毎週月曜の 17:00に実行
0,10 17 * * 0,2,3         毎週日,火,水曜の 17:00と 17:10に実行
0-10 17 1 * *             毎月 1日の 17:00から17:10まで 1分毎に実行
0 0 1,15 * 1              毎月 1日と 15日と 月曜日の 0:00に実行
42 4 1 * * 　          　 毎月 1日の 4:42分に実行
0 21 * * 1-6　　          月曜日から土曜まで 21:00に実行
0,10,20,30,40,50 * * * *　10分おきに実行
*/10 * * * * 　　　　　　 10分おきに実行
* 1 * * *　　　　　　　　 1:00から 1:59まで 1分おきに実行
0 1 * * *　　　　　　　　 1:00に実行
0 */1 * * *　　　　　　　 毎時 0分に 1時間おきに実行
0 * * * *　　　　　　　　 毎時 0分に 1時間おきに実行
2 8-20/3 * * *　　　　　　8:02,11:02,14:02,17:02,20:02に実行
30 5 1,15 * *　　　　　　 1日と 15日の 5:30に実行
```
※ちなみに全部 * だと毎分実行される。


## 登録されているcronを確認表示
以下のコマンドで確認

```
$ crontab -l
*/5 * * * * /home/hoge/fuga.sh
```



## 設定の全削除

以下のコマンドで設定全消去（要注意）

```
$ crontab -r
```


# 正しく動いているかどうか確認する方法

以下のファイルに実行結果が吐出されるので、確認すればOK。

```
# vi /var/log/cron
```

## 動いてない時に確認する事
### crondは起動しているか？
```
$ service crond status
//または
$ /etc/rc.d/init.d/crond status
```

### 実行ファイルの権限は正しいか
シェルやPerlなどのファイルを実行する場合、ファイルに実行権のパーミッションの付与を忘れないようにする。

### ファイルはフルパスで指定されているか

フルパス、または実行ファイルがあるディレクトリまでcdコマンドで移動し、相対パスでそのディレクトリを指定する。

```
00 * * * * cd /home/foo/public_html; ./foo.sh
```

## TIPS


### TIPS1: /etc/crontab

crontab -e を間違えて crontab -r とタイプしてcron消しちゃう事故がよくある。(-rはcrontabを消去するオプション。確認も求めずに綺麗に抹殺してくれる。rがキーボードのeの隣なので、油断してるとやらかす。)

/etc/crontab とか /etc/cron.d/ を使ったほうが良い。/etc/cron.d/だとファイルを分けられるので管理しやすくなる。ついでにタスク毎に実行ユーザーも指定できる。


#### /etc/crontab の書き方

ユーザー指定のパラメータ(user-name)が増えてる。/etc/cron.d/も同じ

```
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
```

### TIPS2: cronの実行結果をメールする

環境変数 MAILTO を設定するとcronの標準出力がメールで送られてくる。
cronが動いてるかどうかが常に心配なお方向け。

```
# /etc/cron.d/backup
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/
MAILTO="tektoh@gmail.com"
LANG=ja_JP.UTF-8
LC_ALL=ja_JP.UTF-8
CONTENT_TYPE=text/plain; charset=UTF-8

0 0 * * * root sh /usr/local/bin/backup.sh
```

LANG, LC_ALL, CONTENT_TYPE をちゃんと設定しないと文字化けするので注意。




## 補足


・行が増えてきたりして管理が大変

・crontab -rで消しちゃったりとかしたらまずい

ので、

gitで管理したり
http://newapps.hatenablog.com/entry/2013/09/02/172801

wheneverをいれたり
http://morizyun.github.io/blog/whenever-gem-rails-ruby-capistrano/

するといいらしい。
はじめてのシェルスクリプト


# 書いてみよう

例として、WEB上にある画像ファイルをローカルに保存するシェルスクリプト。 行頭の#!/bin/shはとりあえず何も考えず書いておく。

```sh:hello.sh
#!/bin/sh
wget https://hogehoge.com/photo.png -O /local/path/photo.png
```
### wgetについて
オプション -O [保存場所] で保存したい場所とファイル名を指定できる。

詳しくは以下を参照
[【wget】ファイルをダウンロードする](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/230995/)

# 実行するために権限を変える

```
$ chmod u+x ./hello.sh
```

# 実行

```
$ ./hello.sh
```

これで指定したローカルの場所に画像がダウンロードされる。
コマンドの履歴検索を[ ctrl+r ]でやる


## このコマンドは知ってた。

```
$ history | grep ssh
```


## ctrl+rで検索で、もっと便利に。


[ Ctrl+r ]を打つと、以下の表示が。

```
(reverse-i-search)`':
```
ここで検索したいコマンドを入力するとインクリメンタル検索してくれる。

例えば、「ssh」と入力すると過去に検索したsshコマンドの履歴が表示される。そしてそのままエンターするとコマンドが実行される。

「ssh」と入力して、最初に表示された候補以外が必要な場合はCtrl+rを入力する度にhistoryをさかのぼって候補を表示してくれる。
CakePHP2自作コンポーネントで覚えておきたいこと


## コンポーネント内で他のコンポーネントが使える

```php:app/Controller/Component/HogeComponent.php
<?php
App::uses('Component', 'Controller');
class HogeComponent extends Component {
	public $components = array('Auth');
	public function fuga() {
		return $this->Auth->user();
	}
}
```


## コンポーネントでコールバック関数
コンポーネント内で以下の関数を指定してあれば、当該コンポーネントを読み込んだコントローラー内で勝手に呼ばれる。

順番としては

> initialize -> startup -> beforeRender -> shutdown

```php:app/Controller/Component/HogeComponent.php

    public function initialize(Controller $controller) {
        // コントローラのbeforeFilterの前に呼ばれる
    }

    public function startup(Controller $controller) {
        // コントローラのbeforeFilterの直後に呼ばれる
    }

    public function beforeRender(Controller $controller) {
        // コントローラが要求されたアクションのロジックを実行した後、ビューのレンダリング前に呼ばれる
    }

    public function shutdown(Controller $controller) {
        // 出力結果がブラウザに送信される前に呼び出される
    }

    public function beforeRedirect(Controller $controller, $url, $status, $exit=true) {
        //コントローラのredirectメソッドが呼び出されるタイミングで、他のアクションより先に呼び出される
        //このメソッドがfalse を返す時、コントローラはリダイレクトを中断する
    }

```


※ただし、コンポーネント内でコンポーネントを読み込んだ場合はこれらのコンポーネントは呼ばれない。
Android Code Styleでオレオレ設定から脱却する


Android開発をある程度していくと気になるのがCode Style。
複数開発者がいたり、引き継ぎを考えて社内で共通の設定にして運用しているところがほとんどだと思いますが、プライベートだとオレオレ設定担っている方結構いるのではないでしょうか？

私もオレオレ設定でしたが、Lvも徐々に上がってきてその辺りが最近気になってきたのでまとめてみます。


まず、Android自体のCode styleは下記ページに詳細がのっています。
https://source.android.com/source/code-style.html

ここでCode Styleの設定ファイルも配布していればいいのにと思うわけですが、ないみたい。


そこでandroid界隈ではよく知られているライブラリを多くオープンソースで出している`Square`のCode Styleです。

square code style
https://github.com/square/java-code-styles


設定方法は簡単。
READMEの通り、`git clone`して`install.sh`を叩くだけ。
あとはAndroid Studioを再起動すると、Code Styleに`Square Android`が追加されているのでそちらを選択。

あとはreformatしたいコードを開いて
`Command + Option + L`

簡単ですね・・・

オレオレ設定している人は是非こちらをおすすめします。
PHP＆CakePHPでセッション保持の時間を設定する


# PHPの場合

以下を読み込んでればとりあえずセッション時間は保持される。

```php:config.php
<?php
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
ini_set('session.gc_maxlifetime', 24*60*60);
```
### それぞれの項目の説明
> session.gc_probability: (分子)
session.gc_divisor: (分母)
session.gc_maxlifetime: (保持時間)

session_start()が行われたときに、session.gc_probabilityを分子、session.gc_divisorを分母とする確率で、 session.gc_maxlifetimeよりファイル更新日付の古いファイルをsession.save_pathから削除します。

# CakePHPの場合

## 普通に設定してもなぜか反映されない(泣)

app/Config/core.phpにセッション時間指定しても、なぜか反映されない.......!!!!

```php:app/Config/core.php
//これを設定してもなぜか反映されない。
	Configure::write('Session', array(
		'defaults' => 'php',
		'timeout' => 24*60*60, //1day
		'autoRegenerate' => true,
		'ini' => array(
			'session.gc_maxlifetime' => 24*60*60, //1day
		),
	));
```


## 解決策
app/webroot/index.phpに直接設定してあげた。

```php:app/webroot/index.php
//101行目あたり
	ini_set('session.gc_probability', 1);
	ini_set('session.gc_divisor', 1);
	ini_set('session.gc_maxlifetime', 24*60*60);
```
これで反映された。若干強攻策だけど以上。
vagrant shareでvagrantの開発環境をホスティングしてHTTPアクセスできるようにする


Vagrantの開発環境がHTTP経由でアクセスできるようになる。
## どういう時に使うか

- いまの自分の開発環境での動作を誰かに見せたい
- FacebookのAPI設定等でHTTPアクセスできる環境を入れなければいけない時

## VagrantCloudでアカウント作成
https://vagrantcloud.com/

## vagrant-shareというプラグインをインストール
Vagrantfileと同じ階層まで移動してプラグインをインストールする。

```
$ cd path/to/vagrant
$ vagrant plugin install vagrant-share
```

プラグインを確認して以下が入ってたらOK。

```
$ vagrant plugin list
.
.
.
vagrant-hostsupdater (0.0.11) //これはアカウント名が入るので必ずしもこの名前ではない
vagrant-login (1.0.1, system)
vagrant-share (1.1.2)
vagrant-vbguest (0.10.0)
```

## VagrantCloudで設定したアカウントにログイン

```
$ vagrant login
```
VagrantCloudで設定したアカウントを入力

```
Username or Email: {ユーザー名かメアド}
Password (will be hidden): {パス}
```


```
$ vagrant share
```

以下のようなメッセージが出ればOK！

```
.
.
.
==> default: Your Vagrant Share is running! Name: demanding-dragon-2448
==> default: URL: http://demanding-dragon-2448.vagrantshare.com
```

http://demanding-dragon-2448.vagrantshare.com
出てきたURLにアクセスすると、開発環境と同じものがホスティングされてる！！！

以上
S3にファイルをフォルダごと一括アップロードする


s3cmdを使えばバケットを作成したりファイルやフォルダをアップロードしたり公開設定を指定したりといった事が簡単にできる。

## s3cmdをインストールする

```
$ brew install s3cmd
```

## 初期設定

```
$ s3cmd --configure
```

```
Access Key	S3のアクセスキー指定
Secret Key	S3のシークレットアクセスキーを指定
Encryption password	GPG encryptionを用いる事でデータを暗号化してくれる。（とりあえず空欄でおｋ）
Path to GPG program [/usr/bin/gpg]	GPGの場所を指定。（とりあえず空欄でおｋ）
Use HTTPS protocol [No]	S3への通信をHTTPSにするか否か
HTTP Proxy server name	Proxyを使う場合はその指定
```
あとはSave Settingで'y'と入力すれば設定完了。

## バケットの確認

これでバケット一覧が出るはず！！

```
$ s3cmd ls
```

## アップロード

```
$ s3cmd put --recursive /path/to/folder s3://<bucket-name>/path/to/folder
```

※ファイル単体をアップロードしたい場合は

```
$ s3cmd put /path/to/file s3://<bucket-name>/path/to/file
```

以上。


## 補足追記

アップロードの所は、自分は putオプションではなく、syncを使う方がメジャーかも。

## カレントディレクトリ直下のフォルダを丸ごと同期する

```
s3cmd sync . s3://BUCKETNAME/
```

## 同期したBucketのパーミッションを全て読み取り専用に変更する

```
s3cmd setacl -r --acl-public s3://BUCKETNAME
```
他人のトピックブランチをPULLする


## 利用シーン
他の人の作業途中のソースコードをPULLして確認したい時とかに。


## やること
その人のアカウントのトピックブランチに、当該作業をPUSHしてもらった後に下記を実行。

```
$ git checkout -b new_branch //自分のアカウントにトピックブランチを作成＆チェックアウト
$ git pull git@github.com:{アカウント名}/{リポジトリ名}.git {当該ブランチ名}

```

以上。

【追記】
GitHubにSSH接続できないと利用できない事が判明。
SSH接続できるようにする手順は以下の投稿を参照。
http://qiita.com/katsukii/items/9fd5bbe822904d7cdd0a
CakePHP内のメソッドをシェルでコンソールから実行する


CakePHP内のソースコードに書いたメソッドをシェルで実行する方法。データ操作やコンポーネントを使ったりもできる

## 簡単な例

以下を設定

```php:/Console/Command/HelloShell.php
<?php
class HelloShell extends AppShell {
	//モデルを使いたければこれ
    public $uses = array('User');

    public function main() {
        $user = $this->User->findByUsername($this->args[0]);
        $this->out(print_r($user, true)); //$this->outで一般出力
    }
}

```
シェルでこれを叩けばユーザー名に該当するユーザーが出力。

```
$ sh ./Console/cake hello main ユーザー名
```



(参考)http://book.cakephp.org/2.0/ja/console-and-shells.html


## コンポーネントを使いたい時

以下はACLの設定のメソッドを記述

```php:/Console/Command/SetAclShell.php
<?php
//この2行を忘れずに
App::uses('ComponentCollection', 'Controller');
App::uses('AclComponent', 'Controller/Component');
class SetAclShell extends AppShell {
	public $uses = array('Group');
    public function main() {
		//コンポーネントのインスタンス化
    	$collection = new ComponentCollection();
        $this->Acl = new AclComponent($collection);

    	$group = $this->Group;
    	//反映したい設定を記述
    	$group->id = 1; //admins
    	$this->Acl->allow($group, 'controllers');

    	$group->id = 2; //users
    	$this->Acl->allow($group, 'controllers');
    	$this->Acl->deny($group, 'controllers/Groups');
    	$this->out('all done');
    	exit;
    }
}

```

ACLコンポーネントを利用したメソッドが実行される

```
$ sh ./Console/cake set_acl main
```
特権コンテナの作成

## 参考

* [Linux Containers - LXC - はじめに](https://linuxcontainers.org/ja/lxc/getting-started/)

## 手順

```bash:
# lxc-create -t download -n privileged-centos7
Setting up the GPG keyring
Downloading the image index

---
DIST	RELEASE	ARCH	VARIANT	BUILD
---
centos	6	amd64	default	20150208_02:16
centos	6	i386	default	20150208_02:16
centos	7	amd64	default	20150208_02:16
debian	jessie	amd64	default	20150207_22:42
debian	jessie	armel	default	20150207_22:42
debian	jessie	armhf	default	20150207_22:42
debian	jessie	i386	default	20150207_22:42
debian	sid	amd64	default	20150207_22:42
debian	sid	armel	default	20150207_22:42
debian	sid	armhf	default	20150207_22:42
debian	sid	i386	default	20150207_22:42
debian	wheezy	amd64	default	20150207_22:42
debian	wheezy	armel	default	20150207_22:42
debian	wheezy	armhf	default	20150207_22:42
debian	wheezy	i386	default	20150207_22:42
fedora	19	amd64	default	20150208_01:27
fedora	19	armhf	default	20150208_01:27
fedora	19	i386	default	20150208_01:27
fedora	20	amd64	default	20150208_01:27
fedora	20	armhf	default	20150208_01:27
fedora	20	i386	default	20150208_01:27
gentoo	current	amd64	default	20150206_14:12
gentoo	current	armhf	default	20150206_14:12
gentoo	current	i386	default	20150206_14:12
opensuse	12.3	amd64	default	20141127_00:53
opensuse	12.3	i386	default	20141127_00:53
oracle	6.5	amd64	default	20150207_11:40
oracle	6.5	i386	default	20150207_11:40
plamo	5.x	amd64	default	20150207_21:36
plamo	5.x	i386	default	20150207_21:36
ubuntu	precise	amd64	default	20150208_03:49
ubuntu	precise	armel	default	20150208_03:49
ubuntu	precise	armhf	default	20150208_03:49
ubuntu	precise	i386	default	20150208_03:49
ubuntu	trusty	amd64	default	20150208_03:49
ubuntu	trusty	arm64	default	20150203_03:49
ubuntu	trusty	armhf	default	20150208_03:49
ubuntu	trusty	i386	default	20150208_03:49
ubuntu	trusty	ppc64el	default	20150208_03:49
ubuntu	utopic	amd64	default	20150208_03:49
ubuntu	utopic	arm64	default	20150203_03:49
ubuntu	utopic	armhf	default	20150208_03:49
ubuntu	utopic	i386	default	20150208_03:49
ubuntu	utopic	ppc64el	default	20150208_03:49
ubuntu	vivid	amd64	default	20150208_03:49
ubuntu	vivid	arm64	default	20150203_03:49
ubuntu	vivid	armhf	default	20150208_03:49
ubuntu	vivid	i386	default	20150208_03:49
ubuntu	vivid	ppc64el	default	20150208_03:49
---
```

* 特権コンテナとして作成したいディストリビューションを選択

```bash:
Distribution: centos
Release: 7
Architecture: amd64
Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs

---
You just created a CentOS container (release=7, arch=amd64, variant=default)

To enable sshd, run: yum install openssh-server

For security reason, container images ship without user accounts
and without a root password.

Use lxc-attach or chroot directly into the rootfs to set a root password
or create user accounts.
```

```bash:
lxc-start -n privileged-centos7
lxc-attach -n  privileged-centos7
```

特権コンテナでも[lxcのバックアップ、リストア、あとcentos7メモ - Qiita](http://qiita.com/tukiyo3/items/99ff5dc872fb94acde60#centos7)と同じ現象。。
EC2のSSH接続でPermission denied(publickey)と出た時の対処法


## 原因と解決策
次の３パターンが考えられる
1. 間違った鍵で接続しようとしている。キーペアは正しいか確認する
2. 間違ったユーザー名で接続しようとしている。正しいユーザー名かどうか確認する
3. ホスト名が間違っている。ホスト名が正しいかどうか確認する。

## これでもダメな場合
インスタンス内のSSH設定を確認
/etc/ssh/sshd_config


このあたりを確認

```
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords yes
```

設定を変えたら再起動

```
$ sudo service sshd restart
```


## 各項目補足

<b>とりあえず PubkeyAuthentication 以外は no にしておいたほうが良い。</b>

### PermitRootLogin

rootユーザーでのログインを許可する設定。基本的にnoにすべき。
アプリケーションの都合でどうしてもrootユーザーでのログインが必要な場合はMatchを使ってクライアントを絞る。

PermitRootLogin no
Match Address 10.0.0.1
    PermitRootLogin yes
PubkeyAuthentication

公開鍵認証を許可する設定。RSA鍵で認証するならyes。
noになってるとたぶんPermission denied(publickey)にはならずにパスワードを聞かれる。

### PasswordAuthentication

パスワード認証を許可する設定。yesだとブルートフォース攻撃の的に。

### PermitEmptyPasswords

パスワード認証の場合に空パスワードを許可するかどうか。
鍵のパスフレーズとは無関係。

## おまけ

### ChallengeResponseAuthentication

チャレンジレスポンス認証を許可する設定。noにしておく。
これがyesになっているとパスワードでログインできてしまう。ブルートフォース攻撃の的にされる。

### AuthorizedKeysFile

鍵認証でのログインを許可するクライアントの共有鍵を定義するファイル。通常は %h/.ssh/authorized_keys とかになってるはず。
エラーメッセージがPermission denied (publickey). って出る場合は大体このauthorized_keysに書かれている公開鍵とクライアントの鍵が合ってないのが原因。
　↓
1. 間違った鍵で接続しようとしている。キーペアは正しいか確認する
2. 間違ったユーザー名で接続しようとしている。正しいユーザー名かどうか確認する
3. ホスト名が間違っている。ホスト名が正しいかどうか確認する。
sed で上書き保存する場合の注意

sed で拡張正規表現 (Extended regular expressions) を使った際にハマったのでメモ。

## 結論

GNU sed (4.2.2) で `-r` または `-E` オプション（拡張性表現）と `-i` オプション（上書き保存）を同時に使う場合、 `-ire` や `-iE` のようにまとめて指定してはいけない。
`-i -re` や `-i -E` と別々に指定しなければならない。

**2015/02/08 追記**
`-i` に続く文字はバックアップファイルのサフィックスとして認識されてしまうため、拡張正規表現を使う場合以外でも **常に別々に指定しなければならなかった** （詳細はコメント欄を参照）。

## 確認

GNU sed のバージョンは次の通り。

```console
$ sed --version
sed (GNU sed) 4.2.2
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Jay Fenlason, Tom Lord, Ken Pizzini,
and Paolo Bonzini.
GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
```

以下のようなファイルを生成して、拡張正規表現の有無で動作の違いを確認する。

```console
$ echo "hogehoge" > sample.txt
$ cat sample.txt
hogehoge
```

### 拡張正規表現なしの場合

拡張正規表現を使用しない場合、 `-ie` のようにまとめて指定しても問題ない。

```console
$ sed -ie 's/^\(hoge\)/\1fuga/g' sample.txt
$ cat sample.txt
hogefugahoge
```

### 拡張性表現ありの場合

拡張正規表現を使用する場合、 `-ire` や `-iE` のようにまとめて指定するとうまくいかない。

```console
$ sed -ire 's/^(hoge)/\1fuga/g' sample.txt
sed: -e expression #1, char 18: invalid reference \1 on `s' command's RHS
$ cat sample.txt
hogehoge
```

一方、 `-i -re` や `-i -E` のようにオプションを別々に指定するとうまく動く。

```console
$ sed -i -re 's/^(hoge)/\1fuga/g' sample.txt
$ cat sample.txt
hogefugahoge
```
動的に追加した要素に対してclickイベントを設定する方法


clickイベントはもともとあるDOMにしかセレクタが反応しないため、動的に追加した要素に対してイベントを設定しても反応しない。

## NG例

```javascript:xxx.js
$(function() {
    $('.click').click(function(){
        // do something
    });
});
```


## 正解はこれ

```javascript:ooo.js
$(function() {
    $(document).on('click', '.click', function(){
        // do something
    });
});

// または
$(function() {
    $('.content').on('click', '.click', ～
        // do something
    });
});

```

[参考](http://qiita.com/no_silver/items/e3f67cf6c1a6f65bef82)
パスワードリマインダーにカスタムバリデーションを設定する。

#はじめに
Laravel標準のパスワードリマインダーのパスワードのバリデーションは6文字以上かどうか。
Validationクラスを使って簡単に8文字以上の半角英数記号のみっていうバリデーションをつけたかった。

#方針
LaravelにはValidationクラスという便利なものがあるので大いに使っていきまっしょい

#コード
そんなわけでコード。例として8文字以上の半角英数記号のみのバリデーションをつける
もとにしたコードは以下。バリデーションチェックするロジックのみ抜き出す。
https://github.com/CodepadME/laravel-tricks/blob/master/app/Controllers/RemindersController.php

```php:ReminderController.php

	/**
	 * Handle a POST request to reset a user's password.
	 *
	 * @return Response
	 */
	public function postReset()
	{
		$credentials = Input::only(
			'email', 'password', 'password_confirmation', 'token'
		);
		$pwRule = [
				'password'              => 'required|min:8|regex:/^[!-~]+$/',
				'password_confirmation' => 'required|min:8|same:password|regex:/^[!-~]+$/',
];

        //カスタムバリデーションルールを登録する
        Password::validator(function($credentials){
            list($password, $confirm) = [$credentials['password'], $credentials['password_confirmation']];
            $validation = Validator::make(['password' => $password, 'password_confirmation' => $confirm], $pwRule);

            return $validation->passes();
        });

		//以下続き
	}
```

#終わりに
いやーLaravelって便(ry
Swift で大きい配列によるビルド時 Segmentation fault 11 の解決法

たまには非常に大きい配列を扱うことももしかするとあるかと思います（少なくとも筆者はあります）。そこで悩まされているのはたまには配列が非常に大きい時（数千要素）、特に文法的にもなにも悪くないのですが、ビルドする時 Segmentation fault 11 になってビルドできないことがあります。

今まで筆者が使った解決法は仕方なくその配列を幾つかに分割し、各々の配列に1000個以下の要素にするようにしていましたが、先ほど根本的な解決法が見つかりました。そして意外と単純なものでした。宣言するときはちゃんと配列の型を明言することだけです。

つまりどういうことかというと、今まで筆者は殆どの場合面倒臭がってそのまま以下のように宣言してきました：

```swift
let anArray = [
	"0",
	"1",
	"2",
	…
]
```

しかしこれだと要素数が極端に増えると、恐らくビルドする時途中で配列を解析するためのリソースが足りないのか何なのかよくわかりませんがまあ Segmentation fault 11 になって死にます。しかしこれを以下のように宣言すれば万事解決です：

```swift
let anArray: [String] = [
	"0",
	"1",
	"2",
	…
]
```

もちろん複数種類の型が混ざる配列でも問題ありません、このように宣言すればOKです：

```swift
let anArray: [Any] = [
	false,
	1,
	"2",
	…
]
```

ちなみにまだ試してませんが恐らく辞書型も同じようなことが起こり、同じような方法で解決できると思います。多分。
LXC1.1でのバックアップ、リストア、あとCentOS7動作レポ

* ネットワーク設定は[LXCでbridge接続 - Qiita](http://qiita.com/tukiyo3/items/510307e76e199e64b588)を参照のこと。

## コンテナ作成

```bash:
lxc-create -n centos7 -t centos -- -R 7
```

## 起動

```bash:
lxc-start -n centos7
```

## 停止

* centos7のはstopが効かないので`-k`付ける。
* `/sbin/reboot`も同様に効かない。centos7はまだ早いかなー

```bash:
lxc-stop -k -n centos7
```

## バックアップ

```bash:
cd /var/lib/lxc/
tar czfp ~/centos7.tar.gz centos7
```

## リストア

```bash:
cd /var/lib/lxc/
lxc-stop -k -n centos7
mv centos7{,.old}
tar --numeric-owner -xzpf ~/centos7.tar.gz
```

## CentOS7

* systemd -> Failed to get D-Bus connection: Failed to authenticate in time.
* /sbin/reboot -> 応答なし
* lxc-stop -n centos7 -> 応答なし
* lxc-stop -k -n centos7 -> やっと停止
* [lxc - 特権コンテナの作成 - Qiita](http://qiita.com/tukiyo3/items/f31d434a3215938e50b3)でも上記と同じ。

## lxc-webpanel

* archlinuxで動かしてみましたが、やはりubuntu上じゃないとまともに動作しないっぽいので注意。

```bash:
pacman -S python-flask
cd /opt
git clone https://github.com/claudyus/LXC-Web-Panel
ln -s /opt/LXC-Web-Panel /etc/lwp/
cd /opt/LXC-Web-Panel
cp lwp.example.conf lwp.conf

python2 ./setup.py develop
python2 ./bin/lwp --debug
```

http://ipaddr:5000/ に admin:adminでログイン。

バックアップ位なら動作する。
![スクリーンショット 2015-02-08 15.01.08.png](https://qiita-image-store.s3.amazonaws.com/0/25728/090aabb8-6c32-92ac-e265-8dac06b1a6f1.png)

# centos5 i686

```bash:
yaourt -S --noconfirm yum
lxc-create -n centos5i686 -t centos -- -R 5 -a i686
```
Python+PyQueryでスクレイピング

# PyQuery

Pythonには[PyQuery](https://pythonhosted.org/pyquery/)というjQueryライクなAPIを提供する便利なモジュールがあります。巷ではBeautifulSoupなどが流行っているようですが、断然PyQueryの方が使い易いです。ベースはlxmlなので性能と信頼性も担保されていると思います。

コンストラクタにurlを引き渡すとフェッチまで勝手にやってくれます。HTMLの文字列を引き渡したり、ファイルオブジェクトを引き渡すこともできます。その後はjQueryのセレクター同様の文字列を指定すればマッチするエレメントをすべて取得することができます。

ラムダ式や関数を引き渡すことで、各々のエレメントを操作することも可能です。jQueryを知っている方なら何ができるか想像がつくでしょう。詳しくは[マニュアル](https://media.readthedocs.org/pdf/pyquery/latest/pyquery.pdf)をご覧ください！

## DOMの操作例

セレクトしたエレメントに対して.each()メソッドで属性をあたえて見ます。`class`はPythonの予約語なので`class_`にするとHTMLのclassになります。

```py:sample.py
from pyquery import PyQuery as pq


html = '''
<ul>
  <li> item 1 </li>
  <li> item 2 </li>
  <li> item 3 </li>
</ul>
'''

dom = pq(html)
dom('li').each(lambda index, node: pq(node).attr(class_='red', x='123'))

print dom
```

実行したところclass と　謎の属性xがセットされました。

```html
<ul>
  <li x="123" class="red"> item 1 </li>
  <li x="123" class="red"> item 2 </li>
  <li x="123" class="red"> item 3 </li>
</ul>
```

classについてはdom('li').addClass('red')でも同じことができます。

# 画像URL取得サンプル
ウェブページをアクセスして画像のURLを抽出する、サンプルプログラムを作ってみました。imgタグをセレクトして.items()でそれぞれのエレメントにアクセスします。

```py:img_scraper.py
#!/usr/bin/env python
from urlparse import urljoin
from pyquery import PyQuery as pq
from pprint import pprint

url = 'http://www.yahoo.co.jp'

dom = pq(url)
result = set()
for img in dom('img').items():
    img_url = img.attr['src']
    if img_url.startswith('http'):
        result.add(img_url)
    else:
        result.add(urljoin(url, img_url))

pprint(result)
```

結果は次のとおり

```
set(['http://i.yimg.jp/images/sicons/box16.gif',
     'http://k.yimg.jp/images/clear.gif',
     'http://k.yimg.jp/images/common/tv.gif',
     'http://k.yimg.jp/images/icon/photo.gif',
     'http://k.yimg.jp/images/new2.gif',
     'http://k.yimg.jp/images/sicons/ybm161.gif',
     'http://k.yimg.jp/images/top/sp/cgrade/iconMail.gif',
     'http://k.yimg.jp/images/top/sp/cgrade/icon_point.gif',
     'http://k.yimg.jp/images/top/sp/cgrade/info_btn-140325.gif',
     'http://k.yimg.jp/images/top/sp/cgrade/logo7.gif',
     'http://lpt.c.yimg.jp/im_sigg6mIfJALB8FuA5LAzp6.HPA---x120-y120/amd/20150208-00010001-dtohoku-000-view.jpg'])
```

imgタグの代わりにaタグを選択して、geventと組み合わせてリストを探索するようにすれば、あっという間にクローラーも作れます。

# Google Finance スクレイパー
Google Financeから、財務諸表をスクレイピングするスクリプトです。長いのでGistへのリンクだけ載せておきます。

https://gist.github.com/knoguchi/6952087
angular templateでbackground-imageを使うとtemplate自体再読み込みする不思議

angularのTemplateでbackground-image指定すると、$location.pathで遷移させているのに、html自体を再読み込みする。
（Chromeのdev toolで確認）
```
<div ng-style="{'background-image':'url({{image}})'}"></div>
```

ng-ifつけるとなおった。
```
<div ng-if="image" ng-style="{'background-image':'url({{image}})'}"></div>
```

なんでだろう？
Substance Painterの使い方 (3) 背景の入れ替え編

背景は、hdr/exrなどのダイナミックレンジを持つ画像を指定します。
画像解像度は、2048 x 1024、4096 x 2048など、2の累乗で2x1の比率の画像を指定。
ここでの背景はPBR(Physically Based Rendering)の光源にもなるもので、フォトリアル表現では非常に重要な要素となります。
背景はペイント操作に影響を与えるものではなく、Substance Painter上ではあくまでもプレビューでの見た目のためのものになります。

標準でいくつか背景画像は用意されており、切り替えることができます。

## 背景の変更

View Settingsの「Environment Map」をクリックし、ポップアップから背景にしたい画像を選択します。
![sp_img30_20150208.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/6d9d43dc-437f-4b4f-00ba-e1eac41152cd.jpeg)

## 独自の背景に変更

hdrまたはexr画像を生成し、2048 x 1024 pixelにリサイズ(4096 x 2048 pixelでもOKでした)。
メインメニューの「File」-「Import Image」で背景画像を読み込みます。

ShelfのTexturesタブを見ると、画像がプロジェクトに読み込まれているのを確認できます。
View Settingsの「Environment Map」をクリックすると、ポップアップに読み込んだ背景画像がありますのでこれを選択します。

![sp_img31_20150208.jpg](https://qiita-image-store.s3.amazonaws.com/0/62860/e795c51e-529a-f025-724f-9d7e1ab3bf1b.jpeg)
LXCでbridge接続

## 概要

![macmini.JPG](https://qiita-image-store.s3.amazonaws.com/0/25728/a46769f6-4637-10df-3c4d-5eddca1dace4.jpeg)

* [ArchLinuxインストールスクリプト作った - Qiita](http://qiita.com/tukiyo3/items/7286e7130bb45d2dc74e)を使ってインストールした。

## ネットワーク設定

### bond0

```bash:/etc/netctl/bond0
Description='Bond0 Interface'
Interface='bond0'
Connection=bond
BindsToInterfaces=(enp3s0f0)
```

```bash:/etc/modprobe.d/bonding.conf
options bonding miimon=100
options bonding mode=active-backup
```

```bash:
netctl enable bond0
```

### br0

```bash:/etc/netctl/br0
Interface=br0
Connection=bridge
BindsToInterfaces=(bond0)
IP=static
Address=('192.168.100.2/24')
Gateway='192.168.100.1'
DNS=('8.8.8.8' '8.8.4.4')
```

```bash:
netctl enable br0
```

再起動しとく。

### lxc

```bash:
lxc-create -n centos7 -t centos -- -R 7
```

```bash:/var/lib/lxc/centos7/config
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 192.168.100.4/24
lxc.network.ipv4.gateway = 192.168.100.1
lxc.network.name = eth0
```

```bash:
lxc-start -n centos7
lxc-attach -n centos7
```

インターネットに出られることを確認。


## br1を追加

br1を作って以下を追記すれば行けるんじゃないかな

```bash:/var/lib/lxc/centos7/config
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br1
lxc.network.ipv4 = 192.168.0.4/24
lxc.network.name = eth1
```