OmniAICreator/Qiita-1.07M huggingface dataset:
[システム環境設定]

こんばんは小串です。ご無沙汰しております。
すみません連絡遅れました。以下の設定を完了しました。

あとはIterm2の設定になるのですが、こちらは有料のバージョンをインストールして設定する必要がありますでしょうか？

#システム環境設定

  * デスクトップとスクリーンセーバ
    * デスクトップ　無地 solid aqua blue
    * スクリーンセーバ  arabesque
  * Dock
    * サイズ -> 小より
    * 位置 -> 左
    * インジケータ・ランプ　チェック外す
    * 自動的に隠す
  * 言語とテキスト
    * google日本語入力のインストール
    * 入力ソースタブ
    * ことえりを外す -> Google日本語入力
    * ひらがなと英数のみ
  * 日付と時刻
　  * 東京に設定

  * Launch Pad
    * 使わない -> 特に設定不要

  * Mission Control
     * キーボードとマウスのショートカット
       * これは全部解除(ホットコーナーで代用)

     * ホットコーナー
       * これはかなり使える
       * 左上 アプリケーションウィンドウ
       * 右上 デスクトップ
       * 左下 -
       * 右下 -

#トラックパッド
  * ポイントとクリック -> 調べる 3本指のドラッグ チェックを外す
  * スクロールとズーム -> 全てチェックを外す
  * その他ジェスチャ -> 全てチェック外す

#ユニバーサルアクセス -> アクセシビリティ
  * マウスキーは有効にしない
  * ダブルクリックの間隔 -> 最速
    * トラックパッドオプション
      * スクロールの速さ -> 最速
      * ドラッグ -> ドラッグロック有り
  * キーボード
    * 補助装置にアクセスできるようにする　オン

#キーボード
  * キーボードタブ
    * キーのリピート　最速
    * リピート入力認識までの時間　最短
    * 修飾キー
      * CapsLock -> ^Control
      *  Control  -> アクションなし
      *  Option   -> Option
      *  Command  -> Command

  * キーボードショートカット
    * 英数入力とひらがな入力の切り替えショートカットの設定
      * 前の入力ソースを選択　^スペース
      * 入力メニューの次のソースを選択　^ + Control + スペース

  * アプリケーション
    * GoogleChrome home Shift + <-
    * PathFinder 次の枠を選択　Command + ->


 * Spotlight
    * Spotlightメニューのキーボードショートカット -> CTRL + Shift + F
    * Spotlightウィンドウのキーボードショートカット -> チェック外す

#省エネルギー
  * バッテリータブ
    * コンピュータのスリープ１時間
    * ディスプレイのスリープ１時間
    * バッテリー電源使用時はディスプレイを少し暗くするを外す
    *  電源アダプタタブ
    * コンピュータのスリープ１時間
    * ディスプレイのスリープ１時間

#サウンド
  * サウンドエフェクトタブ
    * 主音量　消音

#Finder
  * 環境設定
    * 詳細タブ
      * すべてのファイル名拡張子を表示にチェックいれる

#隠しファイル表示
  * defaults write com.apple.finder AppleShowAllFiles -bool YES
chflags nohidden ~/Library/


#Better Touch Tool
  * Advansedを選択
  * Gesture を選択
  * Trackpadタブにて以下の設定
    * four fingers swipe
    * three fingers swipe

  * General Settings
    * Launch BetterTouchToll on startup -> on
    * Set trackpad speed -> 5


#アプリケーション
  * GoogleChrome
    *  規定のブラウザに登録
    *  アプリケーションフォルダに格納
  * Google日本語入力
    *  英数とひらがなのみ 
  * DropBox
    * 後で設定
  * Witch
    * Enable WItch オン
    * Triggersタブ
      * all applicaition ^->|
    * Behaiviorタブ
      * show list right away
  * Firefox
    * Firebug WebDevelopeToolのアドオンを追加
      *  アプリケーションフォルダに格納
  * PathFinder
    * システム環境設定のキーボードショートカットにて次の枠を選択Command + -> で設定 
    * 表示タブにて負荷しファイルを表示をオン
    * 環境設定
      * 一般タブ
        * ログイン時にPathFinderを起動するをオン
        * デフォルトのファイルブラウザにするをオン
        * Pathfinderで開く:テキストエディット書類チェック外す
        * デフォルトテキストエディタMacvimに設定
      * ブラウザタブ
        * フォルダのcommnd + クリック　新規タブに開く
        * PathFinderに表示　新規のタブに表示する
        * キー操作で立てに到達したらループしてもう一方へ移動する
        * ２進法を選択
      * アピアランスタブ
        * 小さいスクロールバーを使う　オン
        * タブが一つのときはタブバーを隠す　オフ
      * Finderタブ
        * Finderのデスクトップを隠す　オン
     　* PathFinder起動時にFinderを終了する　オン
     　* Finderを終了ボタンを押下
  * YummyFTP
    * インストールのみ
Storyboardで色指定したら変な色になった

# 問題
Viewなどの背景色をStoryboardで設定した時に色が以下のように変になることがある。

![iOS Simulator Screen shot Apr 8, 2014, 19.12.07.png](https://qiita-image-store.s3.amazonaws.com/0/31202/89358406-2e7f-1a79-a541-3405d410d115.png)

# 解決
カラースペースがおかしいだけだった。適切なものにしてあげればOK。

![Screen Shot 2014-04-08 at 19.40.27.png](https://qiita-image-store.s3.amazonaws.com/0/31202/82892d89-ca41-f686-b1fa-e58332da87fa.png)

(と言うかここにカラースペースの設定があるの知らなかった)
SQLAlchemyでtupleを含むwhere句を使用する(バックエンド依存)

MySQLでは以下のようにtupleを使ってwhere句を書くことができる。

```mysql
select
  *
from table_schema.table t
where (t.col1, t.col2) in (
(val1, val2),
(val3, val4),
)
;
```

これをSqlAlchemyで記述する場合は、以下のようになる。

```py
from sqlalchemy import tuple_

query = session.query(table).filter(
    tuple_(table.c.col1, table.c.col2).in_(
        [(val1, val2), (val3, val4), ]
    )
)
# 当然 = も可能
query = session.query(table).filter(
    tuple_(table.c.col1, table.c.col2)
    == (val1, val2)
)
```



参考URL
http://docs.sqlalchemy.org/en/rel_0_9/core/sqlelement.html?highlight=tuple#sqlalchemy.sql.expression.tuple_
Heartbleed OpenSSL脆弱性 対処 on Ubuntu

状況など詳しくは [Heartbleed ~ OpenSSL脆弱性 (CVE-2014-0160)　まとめ - Qiita](http://qiita.com/ukitazume/items/f382bcc420dc7815684f) を参照。
ここには Ubuntu に特化して対処方法を纏める。Debian もほぼ同じでしたが。

# 対処と確認

以下の通り、更新のリストを取得し（update）、更新を実行し（upgrade）、再起動し（shutdown -r）、更新を確認（dpkg | grep）すればOK。

openssl 以外も一括で更新するコマンドになっているので、openssl 関係だけ更新したければ、2行目（ upgrade ）を `sudo apt-get install openssl libssl1.0.0` に変更して下さい。

```bash
sudo apt-get update
sudo apt-get upgrade
sudo reboot
dpkg -l | grep openssl
```

最後のコマンドの結果

```
1.0.1-4ubuntu5.12
```

といった修正済みに相当する文字列が見えればＯＫ。

バージョンごとに

- 12.04 →　libssl1.0.0 1.0.1-4ubuntu5.12
- 12.10 →　libssl1.0.0 1.0.1c-3ubuntu2.7
- 13.10 →　libssl1.0.0 1.0.1e-3ubuntu1.2

でそれぞれ修正がなされている。

参考：[USN-2165-1: OpenSSL vulnerabilities | Ubuntu](http://www.ubuntu.com/usn/usn-2165-1/)

----

ちなみに Ubuntu のバージョンの確認は

```bash
cat /etc/lsb-release
```

----

また[security - How to patch CVE-2014-0160 in OpenSSL? - Ask Ubuntu](http://askubuntu.com/questions/444702/how-to-patch-cve-2014-0160-in-openssl#comment582645_444709)によると

```bash
openssl version
```

の結果が

```
OpenSSL 1.0.1 14 Mar 2012
```

のままなのは気にしなくていいらしい。
（ ちなみに、Debian でも同じくこのバージョン表示に反映されていません…　）

#その他サーバ管理者向け便利コマンド

## 誰かサーバで大事な計算してないかな
ユーザごとにメモリの使用量確認

```bash
ps aux --sort user,-rss
```

----

もし間違ってたら遠慮なくここにコメントか [KAMEDA, Akihiro (cm3) on Twitter](https://twitter.com/cm3) まで連絡ください。
大規模ファイルツリーでsvn updateしたらついでにsvn cleanup

## 効果

.svn/ ディレクトリのサイズが減る。

## どういうこと？

全体で100MB以上のような大規模なファイルツリーをsvnで管理していると、何度も `svn update` していたらローカルにある .svn/ のサイズが元の何倍もの大きさに膨れることがある。
updateするごとに更新分が残っている？

その膨れた .svn/ を小さくするためのコマンドが `svn cleanup` 。

折角なので `svn update` するたびにその直後に `svn cleanup` すれば、.svn/ のサイズをおおよそ維持できる。

## 注意

* コマンドラインの `svn cleanup` は external のツリーまでは面倒を見てくれない。external のツリーごとに cleanup する必要がある。TortoiseSVN では externals を含めるかどうかのチェックボックスがあるので、それにチェックを付ければ externals も処理してくれる。
openssl のビルドに10分ほど手こずったので備忘録

# openssl のビルドで10分ほど手こずったので備忘録

* もってくる

```
$ wget https://www.openssl.org/source/openssl-1.0.1g.tar.gz --no-check-certificate
$ tar xvf openssl-1.0.1g.tar.gz
$ cd openssl-1.0.1g/
```

* 何か、エラー出るのでオプション付けてmakeする
* make コマンドには depend 付ける

```
$ ./config no-shared no-idea no-mdc2 no-rc5 zlib enable-tlsext no-ssl2
$ make depend
$ sudo make install
```

* ver確認

```
$ openssl version -a
```

* ビルドしたのが ```/usr/local/ssl``` にいるせいなので、リネームしてシンボリックリンク貼る

```
$ /usr/local/ssl/bin/openssl version -a
$ sudo mv /usr/bin/openssl /usr/bin/openssl.bak
$ sudo ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
```

* 改めて ver 確認

```
$ openssl version -a
OpenSSL 1.0.1g 7 Apr 2014
built on: Tue Apr  8 16:14:09 JST 2014
platform: linux-x86_64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: gcc -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/local/ssl"
```

* 手こずった理由
 * オプション付けないとダメって分かって```./config```した
 * ```make clean```するの忘れてた
 * あたしって・・ホント情弱

## 環境

```
$ cat /etc/debian_version
7.1
```
git勉強メモ



* 共有リポジトリを生成する方法

```
cd ~
mkdir shareRepo
cd shareRepo/
git init --bare --shared

//Initialized empty shared Git repository in /Users/ユーザ/shareRepo/
```

初期化のテキストが表示されてリポジトリ初期化終了

---

* ローカルリポジトリの生成
 
```
cd ..
mkdir localRepo
cd localRepo/
git clone ../shareRepo/

//warning: You appear to have cloned an empty repository.

```
空のリポジトリを生成したとテキストが表示される。

---

* 最初に設定しておく設定（コミットする際に登録される情報のため）
 
```
git config --global user.name tsukasa
git config --global user.email addiction@gmail.com
//設定ファイルが反映されているか確認
git config --global --list
```

---

* ローカルリポジトリにファイルを追加
 
```
cd ~/localRepo/shareRepo/  
echo 'hello git' > index.html
git add .
git commit -m "first Commit"

//[master (root-commit) 62e746a] first Commit
// file changed, 1 insertion(+)
//create mode 100644 index.html
```

コミットのメッセージが出力される

---

* コミットしたファイルの確認
 
```
git log
//commit 62e746aee8a3663f0ed803062034b58d4428f691
//Author: tsukasa <tsukasa@example.com>
//Date:   Tue Apr 8 17:11:41 2014 +0900
//
//   first Commit

```
---

* ローカルリポジトリで修正したファイルを共有リポジトリに反映する
 
```
git push origin master

//Counting objects: 3, done.
//Writing objects: 100% (3/3), 218 bytes | 0 bytes/s, done.
//Total 3 (delta 0), reused 0 (delta 0)
//To /Users/tsukasa/localRepo/../shareRepo/
// * [new branch]      master -> master

 ```
---

* 新しくローカルリポジトリを生成して反映の確認
 
 ```
cd ~/
mkdir localRepo2
cd localRepo2/
git clone ../shareRepo/
//Cloning into 'shareRepo'...
//done.
cd shareRepo/
ls
//index.html
```

---


* ファイルの修正(登録時と同じ)
 
```
//localRepo/index.htmlを修正したのち
git status

//On branch master
//Your branch is up-to-date with 'origin/master'.
//
//Changes not staged for commit:
//  (use "git add <file>..." to update what will be committed)
//  (use "git checkout -- <file>..." to discard changes in working directory)
//
//    modified:   index.html
//
//no changes added to commit (use "git add" and/or "git commit -a")
git add .   
git commit -m "index.html modify"
git push origin master

```

---

* 共有リポジトリからの修正分取得
 
```
cd ~//localRepo2/shareRepo
git pull

//Updating 2f37587..5db4623
//Fast-forward
//index.html | 2 ++
//1 file changed, 2 insertions(+)

```
---


* 修正したファイルの差分チェック
 
```

git diff
//diff --git a/index.html b/index.html
//index 1c5d9a9..821a6b2 100644
//--- a/index.html
//+++ b/index.html
//@@ -1,3 +1,5 @@
// hello git
// 
// ユーザー1が修正しました(修正テキスト)
//+
//+ユーザー2が修正しました（追加テキスト）
```

---


* 復元
 
```

//最新のものに復元 HEADの代わりにコミットIDを入れれば、指定したIDのファイル戻る
git reset --hard HEAD^
```
shellについて


```
# 条件式
if [ cond1 ]; then
 # 処理1
elif [ cond2 ]; then
 # 処理2
else
 # 処理3
fi

# 結合
 # &&
if [ cond1 -a cond2 ]; then
fi
 # ||
if [ cond1 -o cond2 ]; then
fi
 # !
if [ ! cond1 ]; then
fi

# 数値比較
num1 -eq num2 # =
num1 -lt num2 # <
num1 -ne num2 # !=
num1 -le num2 # <=
num1 -ge num2 # >=
num1 -gt num2 # >

# 文字列比較
$1 = $2
$1 != $2
$1 < $2
-n $1 : is not null
-z $1 : is zero

# file
-d : directory
-b : binary
-e : exist
-r : readable
-o : owner
-G : group
-g : set gid bit
-L : symboliclink
file1 -nt file2 : new then (modifytime)
file1 -ot file2 : old then (modifytime)

# case 
case 変数 in
　　　パターン1) 処理;;
　　　パターン2) 処理;;
　　　パターン3 | パターン4) 処理;;
　　　*) 処理;;
esac

# Loop
 # while

a=0
while [ $a -ne 10 ]
do
　　a=`expr $a + 1`
　　echo "${a} 回目の処理"
done

while read line
do
　　処理（${line}を処理）
done < ファイル

 # for
for i in 1 2 3;
do
 echo $i
done

# array
array=(`ls ./`);
array+=(elm1 elm2); # 追加

echo ${array[@]}; #全リストを表示
echo ${array[1]}; #2番目の要素を表示

for i in "${array[@]}";
do
	echo $i
done

echo "{#array[@]}"; # 要素数を参照

```
Facebookのいいね！ボタンを動的ロードしているページに設置する

いいねボタン(やシェアボタン)がFacebookに投稿するタイトル、画像、説明、URLは、それぞれ og:title, og:image, og:description, og:url を参照しています。

[Define an Open Graph object](https://developers.facebook.com/docs/web/tutorials/scrumptious/open-graph-object/)

[Facebookの開発者サイトのデバッグツール](https://developers.facebook.com/tools/debug)に、いいねボタンの`data-href`に指定しているURLを入力すると、そのURLをいいね、シェアしたときに取得される情報を見る事ができます。

さて、ページ遷移をせずに、Ajaxでページの一部を書き換えるようなページにおいては、`data-href`やog*をどうすればいいでしょうか。
以下に例を示します。

```example.js
// 動的コンテンツのロード
$.ajax('/path/to/fragment_contents', { id: 1 }, function (contents) {
  $('#contents').html(contents);
  FB.XFBML.parse(); // いいねボタンの再読み込み
})
```

```fragment_content.haml
.fb-like{ data: { href: "http://example.jp/base_page?id=#{@id}" } }
```

`data-href`は土台のページのURLにクエリパラメータをくっつける形にしました。
og:*は動的に変更してやれば行けるのではと思ったんですが、いいねボタンのフォームはDOMから値を取得するのではなく、Facebookのクローラーが取得したページから値を取得しているようなので、上手くいきませんでした。

したがって、上記例では`http://example.jp/base_page?id={id}`が返すHTMLに、適切なog:*が設定されていなければなりません。
ついでにidが指定されている場合は指定されたidのコンテンツがロードされるようにしておくと良い感じですね。
Twitter の Streaming API にある statuses/filter.json で 412 が返ってくる問題の進捗

以前、Twitter API にて提供されている Streaming API にてステータスコードの 412 (Precondition Failed) が返ってくる問題を、質問にて投稿いたしました。その問題自体は解決していないのですが、作ったツールが再び使えるようになったのでご報告を。
先に結論だけ述べると、「なぜ412が返ってくるのか」に関してはいまだ原因不明です（汗）。なので今後も調べるとして、
現時点での解決策は、Node.js での HTTPS リクエストにて、送信方法を POST から GET に変更した・・・・です。

公式ドキュメントで、 statuses/fileter.json は POST 以外にも GET にも対応しているらしいことが判明。
そこで POST から GET に変更したところ、かつて動いていた状態と同じ動作をするように・・・・。 
少なくとも GET が通っていることから、OAuth 認証に失敗しているわけではないと判断できました。

他のAPIで試しても同じで、POST は失敗して、GET は成功するといった状況です。
うーん・・・・実際、APIにリクエストを送信する裏側の処理自体はまったくノータッチなことを考えると、
Node.js による POST リクエスト自体に問題があるのか、Twitter API の POST に関する仕様に見落としがあるのか・・・・いまいち判断がつかない状況です。リクエスト送信の部分を、child_process を使った cURL に変更するとまた違うのかもしれません。
（ちなみに、コマンドラインから cURL を使い POST で送信する分には成功することを確認している。）

とはいえ、Twitter から情報を取得する系の API は殆ど、GET で使用できるためしばらくはこれで対応しようと思います。
コード的には以下な感じで変更しただけです。ご参考になれば・・・・。

```lang:node
// リクエストオブジェクト用のオプションを生成
var options = {
    host:    ホスト名,
    port:    443,
    path:    APIへのクエリーパス,
    method:  GET, ←　以前はPOSTだった
    headers: {
         'Authorization': 'OAuth ' + 署名が付加された認証文字列,
         'content-type':  'application/x-www-form-urlencoded'
    }
            
};
var request = https.request(options, function(response){
    // このコールバック内でデータ取得処理を行う
}
```

ご指摘などございましたら、後学のためにお教えいただけると助かります。
たのるび第2版を読んだ(2014/04/08)

# 自分が勝手に勉強になったと思って部分を抜き出し

## 変数
* 変数の値だけを比較するなら、Objectクラスのeql?とか==を使う。オブジェクトが同じかどうかを比較するなら、equalメソッドを使う
 * ただし、1.0==1はtrueでも1.0.eql? 1はfalse

## 一般的な話
* 1行が80文字を越える場合は、改行することが推奨される
 * 改行できない場合は、設計や構造自体を見なおしたほうがいいらしい
* 人に優しい字面にするために追加された特殊な構文をシンタックスシュガーといいます

## クラスなど
* メソッドが複数の引数を持つ場合は、引数リストのうち右端から順にデフォルト値を指定する
* newメソッドによってオブジェクトを生成すると、initializeメソッドが呼ばれる。このとき、newに渡した引数がそのまま渡される

* モジュールとクラスの異なる点
 * インスタンスを持つことができない
 * 継承できない

* モジュールをクラスに混ぜ合わせることを「Mix-in」という

* モジュール内では使うことができても、モジュール名.メソッド名という形式で呼び出すことはできない

## エラー
* rescue節は指定した例外クラスを補足すると同時にそのサブクラスも補足します
 * 自分で例外クラスを定義するときは、StandardErrorクラスを継承したクラスを作成して、作成したクラスを継承するのが一般的

## Numericクラス
* IntegerオブジェクトとFloatオブジェクトを計算した結果はFloatオブジェクトになります

## Arrayクラス
### 配列の作り方
* num = [1, 2, 3, 4, 5]やstr = [“a”, ”b”, ”c”, ”d"]など
* Array.newを使う
* %w
 * 要素が文字列で、空白を含まない場合
* to_aメソッド
 * それぞれのオブジェクトを配列に変換する
 * ハッシュに使うとキーと値のペアから配列を作るため、配列の配列になる
* splitメソッド
 * 他のオブジェクトを配列に変換するもう一つの方法
 * カンマや空白などで区切られた文字列から配列を作る

### 使い方
* a[]で取り出す
* a[2,3]をすると、2番目から3つ要素を取り出して長さが3の配列を作る

### メソッド
* 「<<」とpushメソッドは同じ働き
* .concatは破壊的メソッド。元の配列を保持するには、「＋」を使う

### その他
* 配列同士の結合
 * 「+」をつかうと結合できる
 * 「|」も結合だが、同じ要素があった場合にはその要素は結合しない
* 配列の初期化の注意
 * Array.new(3, [0, 0, 0])だと、3つの配列の要素すべてが同じ[0, 0, 0]を参照してしまう
 * Array.new(3){ [0, 0, 0] }のようにしないとダメ

## Stringクラス
* ヒアドキュメントを使う
 * 「<<-」を使うとインデントが揃う
* 日本語の文字列の長さを取得する場合、バイト数を返しているためsizeメソッドがそのまま使えない
 * 正規表現で同じエンコードを指定してsplitメソッドを使う
* 「<<」とconcatメソッドは同じ働き
* 文字列のインデックスによって返されるオブジェクトは文字コード
* 辞書順では「かけ」「がけ」「かこ」でも、Rubyでは「かけ」「かこ」「がけ」


## その他
* リファレンス・マニュアルの読み方
 * 一度に全部覚えようとしない(相当数あるので)
 * スーパークラスのメソッドも調べる
CakePHP: ControllerからShellプログラムを実行する方法

cakephp初日メモ。

# Controllerのアクションから、シェルクラスのメソッドを呼び出す方法。

```php
App::uses('AppShell','Console/Command');
App::uses('WatashiShell','Console/Command');
・
・
$shell = new WatashiShell();
$shell->startup();
$shell->onore();
```

## 説明

クラスの冒頭で、App::usesというお決まりの手法で、呼び出したいターゲットファイルと、（ほとんどのshellファイルが継承しているであろう）親のAppShellを読み込み。
呼び出したい対象のメソッドonore()だとして、まずstartup()を呼び出して、対象のonore()を呼び出す順番になります。

### App::uses();の記法

```php
App::uses('{対象ファイル}','{appより下から、対象のディレクトリまでのパス}');
```

# Shellのファイルごとまるっと実行させたい場合

```php
exec('php /{鯖のルートからプロジェクトルートまでのパス}/{プロジェクト名}/app/Console/cake.php {Shellプログラム名をキャメル方式からアンスコ方式にして記載} {必要あれば引数を記載} /tmp/hogehoge > /dev/null &')
```

## 例

```php
ex)
exec('php /var/www/hoge/htdocs/hogehoge/app/Console/cake.php fuga 1 /tmp/monya > /dev/null &')


ex2) もうちょっとリアルに
exec('php ' . APP . 'Console' . DS . 'cake.php fuga ' . $this->id . ' ' . Hash::get($sessionInfo, self::S_NAME_TARGET) . ' >> ' . Configure::read('FUGAPATH') . ' &');
```

### 補足

・APPについては[こちら](http://cakephp.jp/old_doc/ch11s03.html)
・DSについては[こちら](http://ameblo.jp/dirty-blog/entry-10063912767.html)

# 参考

http://tech.oga-ria.com/use-appshell-subclass-at-controller-in-cakephp/
32bit整数のビットのハミング距離を求める


符号化したデータがどれくらい違うかを求めるのに使える。

```java:
public static int getHammingDistance(int x1, int x2) {
	// 2つの整数のXORを取った結果が違いのあるビット
	int i = x1 ^ x2;

	// ビット数を計算
	// JDKのInteger#bitCount()より
	i -= (i >> 1) & 0x55555555;
	i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
	i = ((i >> 4) + i) & 0x0F0F0F0F;
	i += i >> 8;
	i += i >> 16;

	return i & 0x0000003F;
}
```
C++におけるインターフェイスと実装のパターン

## インターフェイスこそが設計の鍵

<p>そもそもインターフェイスと実装を分離する理由はインターフェイスを規定することで結合を可視化して制御しやすくすることにある。</p>
<p>お仕事ではインターフェイスを規定せずに好き勝手に呼び出すコードを多々見かける(そしてウンザリする)が、そういうコードは修正が全体に及ぶため毎度毎度コードの断片を移植して作り直す羽目になっている。これはインターフェイスをきちんと設計することで回避可能な愚行と言っていいだろう。</p>

<p>C++ではインターフェイスと実装を分離するパターンはいくつかある。基本的には多態を使うが継承関係を逆にした方が使いやすい場合もある。</p>

### インターフェイスを継承して実装する
<p>教科書通りの方法がこれ。各実装はインターフェイスの一種として扱われる。当然public継承。</p>

### 実装を継承してインターフェイスを付け足す
<p>上と真逆なので奇妙に思えるかもしれないがこの方法だと仮想関数を使わずに済むのでオーバーヘッドが皆無というメリットがある。</p>
<p>ただし、依存関係が固定的なので実装を隠すことしかできず、そのあたりの柔軟性が必要な場合には向かない。おそらくシングルトンに向いていて、例えば機種依存部分を隠蔽したりする。一般的にはprivate継承を使う。</p>
<p>ほぼ同じことは多態でも実現できるが、この方法であればオーバーヘッドなしで実現できるので関係が固定ならこの方法を使う方がメリットがある。実体を必要としないので実装とインターフェイスをソース上で分離しつつ、シングルトンのためにインスタンスを用意するというバカバカしい状況を回避できる。</p>

### 実装をテンプレートのインターフェイスへ継承する

<p>これも実装を継承するパターン。単に実装を継承するより柔軟性が高くなる。使う場面は大きく分けて二つ。</p>

* 型の付与
<p>リストやスタックのアルゴリズムを例えばvoid*で記述しておいてテンプレートで型を付与することで、テンプレートのみで書いた時のようにコードがコンパイラによってコピペされてしまうのを防げる。</p><p>この使い方ではほぼprivate継承しか使わない。</p>
* ダックタイプ
<p>適用しようとするクラス群が同じメソッドのセットを持っているなら多態を使わずに依存性注入のようなことができる。静的依存性注入とでも言うところか。</p>
<p>例えばいろんな種類のロックをRAIIで統一的に使うときにはこの方法を使う。オーバーヘッドがないのである種のロックのようにプロセッサの一命令で済んでしまうような非常に軽い操作にも使える。</p><p>一般的にはprivate継承で使う。</p>
postgressでグルーピングするときに忘れやすい関数


### 日ごと、月ごとにグルーピングする

```
Action
  .select("DATE_TRUNC('day', created_at) AS created_at")
  .group("created_at")
```

### グループングする際にUNIXTIMEで受け取る

```
Action
  .select("EXTRACT(EPOCH FROM DATE_TRUNC('day', created_at)) AS created_at")
  .group("created_at")
```

### グループングする際にカンマ区切りのIDの配列を返すようにする

```
Action
  .select("STRING_AGG(id::text, ',') AS ids")
  .select("EXTRACT(EPOCH FROM DATE_TRUNC('day', created_at)) AS created_at")
  .group("created_at")
```

### 参考
* http://www.postgresql.org/docs/9.2/static/functions-aggregate.html
double (倍精度浮動小数点数) の正規化数について、仮数部に必要なビット数を求める

（追記）「仮数部に必要なビット数」としていますが、単に仮数部の下位の0を捨てたときのビット数です。また、浮動小数点数の値には±0、±0以外の正規化数、非正規化数、±∞、非数が含まれますが、この方法で得られる値は正規化数でしか意味がありません。

```csharp:Program.cs
public static int GetPrecision(double d)
{
    // long (64ビット整数) に変換し、仮数部の52ビットのみ残す
    var frac = BitConverter.DoubleToInt64Bits(d) & 0x000fffffffffffffL;
    if (frac == 0L) return 0;

    var precision = 52;
    // 仮数部のビット表現で、連続するゼロ(Trailing Zeros)の数だけ精度を下げる
    // 参考書籍: ハッカーのたのしみ (Hacker's delight)
    if ((frac & 0x00000000ffffffffL) == 0L) { precision -= 32; frac >>= 32; }
    if ((frac & 0x000000000000ffffL) == 0L) { precision -= 16; frac >>= 16; }
    if ((frac & 0x00000000000000ffL) == 0L) { precision -= 8; frac >>= 8; }
    if ((frac & 0x000000000000000fL) == 0L) { precision -= 4; frac >>= 4; }
    if ((frac & 0x0000000000000003L) == 0L) { precision -= 2; frac >>= 2; }
    if ((frac & 0x0000000000000001L) == 0L) { precision -= 1; }
    return precision;
}
```
機械学習や統計に関する情報収集

本日は少し趣向を変えて、機械学習や統計に関する情報収集源についてまとめてみたいと思います。

## 機械学習

機械学習界隈の情報収集方法
http://d.hatena.ne.jp/kisa12012/20131215/1387082769

いきなりですが上記の記事に機械学習に関する有力な情報源がまとまっています。まずはここを参考にするのが良いかと思います。ただ情報が多すぎですので、筆者は [Wikicfp](http://www.wikicfp.com/cfp/servlet/event.showlist?lownerid=53882&ltype=w) と [arXiv.org](http://arxiv.org/list/stat.ML/recent) あたりの論文、それに[はてなブックマーク](http://b.hatena.ne.jp/search/tag?q=%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92&users=1)をチェックしています。

また論文については[機械学習の論文を探す](http://とうごろう.jp/wiki/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%81%AE%E8%AB%96%E6%96%87%E3%82%92%E6%8E%A2%E3%81%99/)にも良い情報がまとまっています。こちらも参考になります。

機械学習は日進月歩の世界ですので、最新の査読済み論文を追って概略だけでも理解する能力を身に付けると良いかと思います。

書籍としては次の 2 冊が聖書とも言える必読書で、本気で機械学習をやりたければ必ず参考になるかと思います。

パターン認識と機械学習 (上・下)
http://www.amazon.co.jp/dp/4621061224/
http://www.amazon.co.jp/dp/4621061240/

もし内容が難しすぎて理解できないという場合、数学の基礎力が足りていない可能性があります。その場合は大学・高校の数学の教科書を取り出して復習すると良いでしょう。

## Python

### NumPy

NumPy 利用ノート
http://www.geocities.jp/showa_yojyo/note/python-numpy.html

まずは基礎中の基礎である NumPy について。 Python のバージョンが少し古いですが日本語の情報がまとまっている点では貴重です。

### SciPy

Python Scientific Lecture Notes
http://scipy-lectures.github.io/

SciPy の入門用レクチャーとして優秀なサイトで、ここを見ればだいぶ参考になるかと思います。 GitHub にソースがあるので Fork して改造して動かしてみても良いでしょう。

### scikit-learn

A tutorial on statistical-learning for scientific data processing
http://scikit-learn.org/stable/tutorial/index.html

scikit-learn のチュートリアルです。ここを読めば scikit-learn について入門できるかと思います。

### matplotlib

matplotlib のガイド
http://matplotlib.org/1.3.1/contents.html

matploblib のガイドは約 1,000 ページ以上に渡る膨大なもので、上記サイトから PDF をダウンロードできます。これを参照すれば少なくとも不足は無いでしょう。

### pandas

pandas についても公式のドキュメントが充実しておりこれを見るのが良いです。開発のスピードが速いので書籍より公式情報を参照するのが良いでしょう。

pandas: powerful Python data analysis toolkit
http://pandas.pydata.org/pandas-docs/stable/

## 統計

統計学に関しては書籍に情報がまとまっており学術体系として完成度が高いです。したがいまして良書を選んで読むのが良いかと思います。

無料で情報を収集するなら、オンラインで無料で読める統計書 22 冊が以下にまとまっています。
http://id.fnshr.info/2013/08/11/online-stat-books/

Amazon で購入できる書籍としては以下のものが筆者のオススメです。

社会統計学入門 (放送大学教材)
http://www.amazon.co.jp/dp/4595313705

日本統計学会公式認定 統計検定1級対応 統計学
http://www.amazon.co.jp/dp/448902150X

「統計学入門」基礎統計学 - 東京大学教養学部統計学教室
http://www.amazon.co.jp/dp/4130420658

道具としてのベイズ統計
http://www.amazon.co.jp/dp/4534046472

ゼロから学ぶ統計解析
http://www.amazon.co.jp/dp/4061546562

R によるやさしい統計学
http://www.amazon.co.jp/dp/4274067106
FuelPHP 1.7でMongo_Db::__construct()の挙動が変わった

\Fuel\Core\Mongo_Dbが依存する[PECL::Package::mongo](http://pecl.php.net/package/mongo)の1.5以上はインスタンス作成時の new \Mongo() がなくなっています。

[* [PHP-818] - Deprecate "Mongo" in favour of MongoClient.](http://pecl.php.net/package-info.php?package=mongo&version=1.5.0alpha1 "mongo 1.5.0alpha1 - ChangeLog")

インスタンス生成時は new \MongoClient() に変更しろということですかね。

この変更はFuelPHP 1.7で取り込まれています。
多くの人はまったく気にすることはないと思いますが、FuelPHP 1.6をメンテナンスするときにちょこっと厄介。例えば、Homebrew(他のパッケージ管理ツールでも同様だと思う)でお気楽に環境を整えてしまおうとするとPECL::Package::mongoの最新が入ってしまう可能性があります。FuelPHP 1.6の\Fuel\Core\Mongo_Db::__construct()は

```php
// Let's give this a go
try
{
	$this->connection = new \Mongo(trim($connection_string), $options);
	$this->db = $this->connection->{$config['database']};
	return $this;
}
catch (\MongoConnectionException $e)
{
	throw new \Mongo_DbException("Unable to connect to MongoDB: {$e->getMessage()}");
}
```

こうなっていて、最新のPECL::Package::mongoが期待する new \MongoClient() ではありません。なので、

>Fuel\Core\PhpErrorException [ 8192 ]: Fuel\Core\Mongo_Db::__construct(): The Mongo class is deprecated, please use the MongoClient class

こんなエラーが発生してしまいます。

ということでPECL::Package::mongoはパッケージ管理ツールに頼らずに、pecl コマンドで古いバージョンをインストールしましょう。

> sudo pecl install mongo-1.4.5

こうするとバージョン 1.4.5 のPECL::Package::mongoがインストールされます。

これでFuelPHP 1.6のMongo_Dbも大丈夫。
Netbeans ＋ MySQL でグループウェア・Aipo（アイポ）の開発環境を作る

[Cocolabo](http://cocolabo.co.jp/)では社内共有を某グループウェアを利用しておりますが、人も増えてきたし、外出先からスマホで見れないし、はなっから私が使いこなせてないしで、オープンソースでなかなかイケてるUIで評判の[Aipo](http://www.aipo.com/)を導入してみたいと思います。

## Aipoとは

Aimluck社が開発している純国産のオープンソースグループウェアです。必要十分な機能とスマホにも対応しており、ビジネスシーンでも利用価値の高いグループウェアです。
http://www.aipo.com/

## 開発環境

[本家](http://doc.aipo.com/)は Eclipse + PostgreSQL を前提とした環境を想定していますが、今回は最近メジャーアップデートしたばかりの Netbeans  と MySQL を利用する前提で話を進めます。

* OS X Mavericks‎
* JDK 1.6 ([※1.6でビルドする必要があります](http://doc.aipo.com/startguide/jdk.html)）
* [Netbeans](https://ja.netbeans.org/) 8.0（mac版）
* MySQL 5.6 (homebrewでインストール）
* Tomcat (いずれGlassFishに移行させる）


## インストール

githubから最新版を取得

```bash
git clone https://github.com/aipocom/aipo.git
```

Netbeans のプロジェクトタブ上で「プロジェクトを開く」から先程cloneしてきたaipoプロジェクトを開きます。maven化されているので、簡単に開けます。

![](https://31.media.tumblr.com/9a85f1cf7de2389f224b59bf0582c84a/tumblr_inline_n3ca7iMAly1sbbu6z.jpg)

プロジェクトを開くとこんな感じ。

![](https://31.media.tumblr.com/60b496ab8a37f1de0751c02403ec8a2a/tumblr_inline_n3dwoqPKhp1sbbu6z.png)

今回はMySQLを利用するので、アイポで利用しているORM（Cayenne）の設定を変更します。幸いMySQL対応も考慮されているようで、.propertiesファイルが用意されています。

```java
aipo/oms/src/main/webapp/WEB-INF/datasource/dbcp-org001-mysql.properties  (mysql用）
aipo/oms/src/main/webapp/WEB-INF/datasource/dbcp-org001.properties  (postgres用）
```

上記ファイルをリネームします。

```bash
$ mv aipo/oms/src/main/webapp/WEB-INF/datasource/dbcp-org001.properties aipo/oms/src/main/webapp/WEB-INF/datasource/dbcp-org001-postgres.properties  
$ mv aipo/oms/src/main/webapp/WEB-INF/datasource/dbcp-org001-mysql.properties aipo/oms/src/main/webapp/WEB-INF/datasource/dbcp-org001.properties
```

Netbeans 上ではこうなります。

![](https://31.media.tumblr.com/55a103af309d26acd2fccb6aecbe96af/tumblr_inline_n3ebzbhhIk1sbbu6z.png)

### ビルド

プロジェクト窓のaipoプロジェクトを右クリックし「依存性でビルド」を選択。

![](https://31.media.tumblr.com/31ed22252a5ca0e5692531eed4efee29/tumblr_inline_n3edgw6bWF1sbbu6z.png)

Netbeansのコンソールにビルド成功が表示されれば完了。


### MySQL

こちらもMySQL用のDDLが用意されています。

```bash
aipo/sql/mysql/org001.sql
```

MySQLの構築等は割愛します。よしなに流し込みましょう。

```bash
$ mysql - u user  org001 < aipo/sql/mysql/org001.sql
```

これで、準備完了！


## デプロイ

tomcat に war をデプロイ。

※ デプロイでこける場合は、ビルド時にJDKのバージョン設定がまずい可能性があります。必ず JDK1.6 でビルドするようにしてください。

```
http://localhost:8080/aipo/portal
```

以下の画面が表示されれば成功です。

![](https://31.media.tumblr.com/d07a10690b6e78990351e8387c142c00/tumblr_inline_n3ee3r2A5i1sbbu6z.png)

素敵な画面！

## 今後の予定

弊社ではGlassFishを利用しているので、時間あったらGlassFishへの移行手順等も記載していきます。
Redmineのwikiのページ新規作成

Redmineのwikiでページの新規作成が結構面倒！
ということで一発で新規作成が出来るボタンを設置してみます。

# 通常の手段

まず通常の新規作成する場合は、

1. リンク元になるページを編集し、リンクを作成して保存
例：[[TestPage]]

2. 元ページのリンクからTestPageへのリンクを辿ると、TestPageのページ編集画面に遷移
それを編集して保存

以上になります。
これだと面倒です。

# 新規作成フォームの追加

新規作成用のフォームを追加してみます。
追加するのはwikiのサイドバー
対象のテンプレートは

<pre>
app/views/wiki/_sidebar.html.erb
</pre>

これの一番最後に

```html
<br />
<form action="<%= url_for :controller => 'wiki', :action => 'show', :id => nil %>" method="get" name="new_page">
<input name="id" type="text" value="" />
<input type="submit" value="新規作成" />
</form>
```

を追加してサーバを再起動するとwikiのサイドバーに新規作成のフォームが追加されます。
作成したいページ名を入力して新規作成をクリックするとページ編集画面に遷移すると思います。

試してみて下さい。

※redmine-2.3.1で確認済みです
Docker image を一から作る場合

色々情報が錯綜しているが、書いている現在はcontribにあるスクリプトを使うのが良さそう

* https://github.com/dotcloud/docker/tree/master/contrib

### CentOS 6.5

霊として、Ubuntu上でCentOS 6.5のイメージを作る場合。

必要なものとして、

* rinse（deb系のLinuxの上でrpm系なLinuxのシステムを作ったりするやつ）
* rpm
* rpm2cpio

がある。後者二つはaptでいいけど、rinseはできれば2.0以上がいいらしい。しかしUbuntuのディストロによってはaptでは古いやつが入る。なので普通にインストールする。

```bash
$ wget http://www.steve.org.uk/Software/rinse/rinse-2.0.1.tar.gz
$ tar xzf rinse-2.0.1.tar.gz
$ cd rinse-2.0.1
$ sudo make install
```

専用のビルド用イメージをVagrantなどで作れば良さそう。

あとは `mkimage-rinse.sh` の説明の通りのコマンドを発行すれば良い。

```bash
$ git clone https://github.com/dotcloud/docker.git
$ cd docker/contrib/
$ ./mkimage-rinse.sh pepabo/centos65-vanilla centos-6 \
      http://ftp-srv2.kddilabs.jp/Linux/packages/CentOS/6.5/os/x86_64/Packages/
```

タグ付け、インポートも勝手にしてくれる。

終わったら

```bash
$ docker run -i -t pepabo/centos65-vanilla:6.5 /bin/bash
```

とかで動くかどうか確認。必要に応じてプッシュしたりする。

### 他のディストロ

contrib に転がってるスクリプトでなんとかする、頑張る。
CoreDataにenumの値を入れる

前から疑問だったのですが、Core Data Programming Guideにやり方が書いてありました。ていうか先月の3月10日に追記されたっぽいです。

 * [Core Data Programming Guide: Non-Standard Persistent Attributes](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html)

Scalar Valuesっていうところに書いてあります。

**追記**
コメントで @ishkawa@github さんに教えてもらいましたが、enumの場合はもっと簡単というか普通に実装する方法があるみたいでした。Core Data Programming Guideに書いてあるのは、doubleやCGRectを入れる場合の方法みたいですね。ishkawaさんありがとうございました！

## 何がしたいのか

たとえばこういう列挙型を定義したとして…。

```c
typedef NS_ENUM(NSUInteger, kServiceType) {
    kServiceTypeUnkown,
    kServiceTypeTwitter,
    kServiceTypeFacebook,
    kServiceTypeTk,
};
```

こいつをCoreDataのオブジェクトで使いたくてInteger16とかの属性を作っても、アクセスする時のインターフェイスはNSNumberなのでどっかで変換したりしないといけなくてわずらわしい感じでした。ベストプラクティスってなんだろうと毎回疑問に思っていたのです。

公式のドキュメントに書いてあったやり方が簡単だったので、記録しておきます。CGRectとかも同じようにできるみたいでなかなか良い感じです。

## モデルの属性

普通に数値を入れる場合と同じく Type Integer16 とかいう感じにします。たとえばservieTypeという名前にでもしておきましょう。

![スクリーンショット 2014-04-08 16.42.10.png](https://qiita-image-store.s3.amazonaws.com/0/3336/7f6f3999-59c2-c605-7695-ebc2cfafb334.png)

## カスタムクラス

普通にNSManagedObjectを継承したクラスを作った上で、一部を変更します。クラスの外部にはenumで定義した列挙型を指定しておきます。

```diff
diff -up -ur old/SMService.h new/SMService.h
--- old/SMService.h     2014-04-08 16:46:44.000000000 +0900
+++ new/SMService.h     2014-04-08 16:46:29.000000000 +0900
@@ -6,5 +6,5 @@
 @interface SMService : NSManagedObject
 
 @property (nonatomic, retain) NSString * account;
-@property (nonatomic, retain) NSNumber * serviceType;
+@property (nonatomic) kServiceType serviceType;
 @end
```

CoreDataが自動的にprimitiveなんとかっていうメソッドを作ってくれているので、それを使ってデータの読み書きをします。警告が出るので、カテゴリで宣言を追加しておきます。

```diff
diff -up -ur old/SMService.m new/SMService.m
--- old/SMService.m     2014-04-08 16:46:48.000000000 +0900
+++ new/SMService.m     2014-04-08 16:46:32.000000000 +0900
@@ -1,9 +1,30 @@
 
 #import "SMService.h"
 
+@interface SMService (PrimitiveAccessors)
+@property (nonatomic) NSNumber *primitiveServiceType;
+@end
+
 @implementation SMService
 
 @dynamic account;
 @dynamic serviceType;
 
+- (kServiceType)serviceType {
+    [self willAccessValueForKey:@"serviceType"];
+
+    NSNumber *tmpValue = [self primitiveServiceType];
+    [self didAccessValueForKey:@"serviceType"];
+
+    return (tmpValue != nil) ? [tmpValue intValue] : kServiceTypeUnkown;
+}
+
+- (void)setServiceType:(kServiceType)value {
+    NSNumber *temp = @(value);
+
+    [self willChangeValueForKey:@"serviceType"];
+    [self setPrimitiveServiceType:temp];
+    [self didChangeValueForKey:@"serviceType"];
+}
+
 @end
```

たったこれだけの変更で直接enumの値を使えるようになりました。

SELECTする時のやり方は別に変わらないのかな。

```objc
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntity:[SMService class] context:context];
[request setPredicate:[NSPredicate predicateWithFormat:@"serviceType == %d", kServiceTypeTwitter]];
NSArray *objects = [context executeFetchRequest:request error:&error];
```
git-issueでGitHubのissueが見える様になるまで

#背景
[俺がGitHubでスターを付けたリポジトリ一覧](http://qiita.com/joker1007/items/be5dc3f3b1e93132a4f7)を眺めていて、[git-issue](https://github.com/yuroyoro/git-issue)なるものを知りました

#git-issueとは
ターミナルからGithubやRedmineのissueを見ることができます

あとは[作者のyuroyoroさんのエントリ](http://yuroyoro.hatenablog.com/entry/20120301/1330580453)を読んでください

#git-issueをGitHubのissue見るために使おうとして嵌ったところ
##設定

設定の仕方は、 http://garaemon.tumblr.com/post/23873618226/git-issue がわかりやすかったです。

###git config
例として、GitHubのgit-issueのissue（なんかややこしい）を見る場合の設定は次の様になります

```
git config issue.type github
git config issue.repo yuroyoro/git-issue
```

さらに、[pit](https://github.com/cho45/pit)で、アカウント情報を渡すのですが、最初書き方がわかりませんでした。

```
EDITOR=vim pit set github
```

すると、何か書け、という画面になるので、次の様に書きました

```
---
user: chinmo@github.com
password: (パスワード)
```

ここまでやると、

```
git issue
```

で、git-issue の issue が見える様になります

![スクリーンショット 2014-04-08 16.57.27.png](https://qiita-image-store.s3.amazonaws.com/0/19726/aec646b5-3e96-6128-ae57-7e85180c5f65.png)

## proxy認証

proxy認証に対応してなかったので、[pullreqしました](https://github.com/yuroyoro/git-issue/pull/46)
arpwatchでMACアドレスを収集

[arpwatch でMACアドレスをかき集める - いますぐ実践! Linuxシステム管理 / Vol.255](http://www.usupi.org/sysad/255.html)

```bash:インストール
$ sudo apt-get install -y arpwatch
```

```bash:ここにデータが保存される。
$ sudo cat /var/lib/arpwatch/arp.dat
```

## 検知したらメール送信する先を設定

かなりいっぱい飛んできますので注意。

```diff:/etc/arpwatch.conf
- #eth0	-m root
+ eth0	-m admin@mydomain.co.jp
```
カメラアプリを作ったらテストしておきたいポイント

以下の内容は、私の個人的な経験に基づくものです。

もっとこうやったら方がいいよ！っていうのがありましたら、コメントにお寄せください。


BACKボタンで開発中アプリを閉じて、カメラアプリを起動してみる
--

カメラアプリが起動できない場合は、開発中アプリでカメラの解放がうまくできてない可能性があります。


HOMEボタンで開発中アプリを閉じて、Android標準のカメラアプリを起動してみる
--

アプリがバックグラウンドに残っている状態でも、カメラは正しく解放されている必要があります。


カメラをプレビュー中に電源ボタンを押してOFF/ONしてみる
--

電源ボタンを押したときのライフサイクルイベントをうまくハンドリングできているか調べます。


カメラのプレビュー中にダイアログを表示する
--

ダイアログ表示中はオートフォーカスができません。オートフォーカスのタイミングを正しく制御できているかどうか確認します。


カメラをプレビュー中に画面遷移をする
--

サーフェス・ビューが正しく解放されていないと、画面が一部残ってしまうことがあります。


端末を回転してみる
--

端末の回転を正しくハンドリングできているかどうかテストします。特に、Android 4.3は要注意です。

2系・4系で試してみる
--

カメラの準備に時間がかかる端末では挙動が変わることがあります。
UbuntuにMongoDBのインストール


開発環境にMongoDBをインストールしたのでメモしておきます。

## インストール

* 公開鍵の設定

````
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
````

* /etc/apt/sources.list.d/mongodb.listの作成

````
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
````

* リポジトリのリロード

````
sudo apt-get update
````

* パッケージインストール

````
sudo apt-get install mongodb-10gen
````


## MongoDBの起動

````
sudo service mongodb start
````

## MongoDBの停止

````
sudo service mongodb stop
````

## MongoDBの再起動

````
sudo service mongodb restart
````

## webコンソール

* http://localhost:28017/

## 参考にしたURL

* http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/
MongoDBのデータ構造な簡単な操作など


MongoDBの勉強を始めたのでメモしておきます。

## MongoDBのデータ構造

````
--MongoDB
  +--データベース
  |  +--コレクション
  |  |  +--ドキュメント
  |  |  +--ドキュメント
  |  |
  |  +--コレクション
  |  |  +--ドキュメント
  | 
  +--データベース
  |  +--コレクション
````

## RDBとMongoDBのデータ構造の比較

* 以下表を参照。

| RDBでの呼称 | MongoDBでの呼称 |
|:-----------|:------------|
| database | database |
|table | collection |
|row | document |
|column | field |
|index | index |
|primary key | _id field |
* _idの値について、自動的に一意な文字列が採番されます。


## MySQLと比較したクエリ

### データベース操作

| MySQL | MongoDB |
|:-----------|:------------|
| SHOW DATABASES; | show dbs |
|USE testdb; | use testdb |
|CREATE DATABASE testdb; | useコマンドで自動生成 |
|DROP DATABASE testdb; | use testdb<br>db.dropDatabase() |
|index | index |
|DESC testdb; | なし |

### コレクション操作

| MySQL | MongoDB |
|:-----------|:------------|
| CREATE TABLE products (...); | 自動生成 または<br> db.createCollection("products") |
|ALTER TABLE products ADD ...; | 自動生成 |
|SHOW TABLES; | show collections |
|DROP TABLE products; | db.products.drop() |
|TRUNCATE TABLE products; | db.products.remove() |


### ドキュメント操作

#### 選択

| MySQL | MongoDB |
|:-----------|:------------|
| SELECT * FROM products; | db.products.find() |
| SELECT name FROM products<br>WHERE category='A'<br>AND stock<=10<br>ORDER BY name; | db.products.find(<br>{<br>category : 'A' ,<br>stock : { $lte : 10 }<br>},<br>{ name : 1 }<br>).sort({ name : 1}) |
|SELECT COUNT(*) FROM products;|db.products.count()|
|SELECT COUNT(*) FROM products<br>WHERE name LIKE "%camera%"<br>OR category='C';|db.products.find(<br>{<br>$or : [<br>{ name : /camera/ },<br>{ category : 'C' }<br>]<br>}<br>).count()|
| SELECT COUNT(stock) FROM products; | db.products.find({<br>stock : { $exists : true }<br>}).count() |
| SELECT * FROM products LIMIT 1; | db.products.findOne() |
| SELECT * FROM products LIMIT 5; | db.products.limit(5) |


#### 挿入

| MySQL | MongoDB |
|:-----------|:------------|
| INSERT INTO products<br>VALUES('A',"camera case",5); | db.products.insert(<br>{<br>category : 'A' ,<br>name : "camera case" ,<br>stock : 5<br>}<br>) |


#### 更新

| MySQL | MongoDB |
|:-----------|:------------|
| UPDATE products SET<br>stock=10<br>WHERE category='A'; | db.products.update(<br>{ category : 'A' },<br>{ $set : { stock : 10 } },<br>false,<br>true<br>) |
| UPDATE products SET<br>stock=stock+10<br>WHERE category='A';	|db.products.update(<br>{ category : 'A' },<br>{ $inc : { stock : 10 } },<br>false,<br>true<br>)|


#### 削除

| MySQL | MongoDB |
|:-----------|:------------|
| DELETE FROM products<br>WHERE name="camera case"; | db.products.remove(<br>{name : "camera case"}<br>) |


## 参考にしたサイト

* http://gihyo.jp/dev/serial/01/mongodb
boolean にvalidates_precense_of 使ったらfalseのときValidation failedで弾かれる件について

ソース見る感じ、falseのとき、validateで弾かれている気がする。

StackOverFlowでぐぐったらこんなん出て来た
http://stackoverflow.com/questions/2883823/why-does-false-invalidate-validates-presence-of

```
validates_inclusion_of :field_name, :in => [true, false]
```

と書いてあった通りにやったらいけた
CreateJSの私的まとめ


業務で触れているCreateJSについて、まとまった記事を書いていきたいので、その導入にあたる記事を書いた。

# CreateJSとは

HTML5でリッチでインタラクティブなコンテンツを作るためのJavaScriptライブラリおよびツール。

たまにゲームエンジンとして取り上げられたりするが、ゲームエンジンではない。[Platypus](https://github.com/PBS-KIDS/Platypus/)のようにCreateJSをベースにしているゲームエンジンならいくつかある。

スポンサーにAdobe、Microsoft、Mozillaなどが名を連ねているので、そのあたりは期待できそう。

URL: [CreateJS](http://www.createjs.com/#!/CreateJS)

# CreateJS suite

CreateJSに含まれる4つのJavaScriptライブラリ。それぞれcreaejsという名前空間にあるが、基本的には単体でも使える。

たまに使っていないのにとりあえず全部ロードしているアプリを見るけど、そういうのはやめた方がいい。

記事に対応するライブラリのバージョン

| library   | version |
|:----------|:-------:|
| EaselJS    | 0.7.1   |
| TweenJS   | 0.5.1   |
| SoundJS   | 0.5.2   |
| PreloadJS | 0.4.1   |


## EaselJS

canvas描画ライブラリ。最近WebGLに対応した。
<http://blog.createjs.com/webgl-support-easeljs/>

Stageに表示オブジェクト（`DisplayObject`）をくっつけていくスタイルで記述していく。Stage自体も表示オブジェクトにあたる。
Stageをルートとして表示オブジェクトのツリー構造をつくっていくあたりがActionSctiptぽいらしい（ASやったことないので適当）

setTimeoutなどのタイマーを一元管理するTickerクラスも含まれている。

### MovieClip

EaselJSで`MovieClip`クラスを使うためのプラグインのようなもの。
EaselJSとTweenJSに依存している。Toolkit for CreateJSを使う場合は必須。

MovieClipクラスを一言で言うと、タイムライン（TweenJSの`Timeline`クラス）をもった表示オブジェクト（`Container`クラス）といった感じ。

## TweenJS

Tweenライブラリ。主にTweenアニメーションとかに使う。
メソッドチェーン形式で記述して、JSのプロパティをtweeningできる。

EaselJSと一緒に使う場合は問題にならないが、EaselJSのTickerに依存しているので、単体で使う場合はTicker相当の関数などを実装する必要がある。

## SoundJS

音声再生ライブラリ。Web Audioにも対応している。
そろそろオーディオスプライトにも対応するとのこと。
<http://blog.createjs.com/audio-sprite-support-in-soundjs/>

## PreloadJS

アセットローダーライブラリ。いろいろな形式のアセットをロードできる。

> BINARY: Raw binary data via XHR
> CSS: CSS files
> IMAGE: Common image formats
> JAVASCRIPT: JavaScript files
> JSON: JSON data
> JSONP: JSON files cross-domain
> MANIFEST: A list of files to load in JSON format, see loadManifest
> SOUND: Audio file formats
> SVG: SVG files
> TEXT: Text files - XHR only
> XML: XML data


# 特徴

## イベントモデル

CreateJSのライブラリすべてに共通で入っているクラスがいくつかあって、イベント（`Event`クラス、`EventDispatcher`クラス）もその1つ。

イベント関連のクラスがそれぞれのライブラリに注入されるので、それぞれのライブラリは、イベントハンドラの設定やイベントの発火を統一的記述することができる。`addEventListener`や`removeEventListener`の話。今っぽい`on`とか`off`も使える。

## Toolkit for CreateJS

Flash Proのプラグイン。Flash CCからは標準で使える機能になっている。
Flashコンテンツをswfの代わりに、HTML、JavaScript、および画像で出力してくれる。HTML自体はテストコードみたいなもの。

アニメーターの方々にはいろいろ制約が課されるみたいですが、再現性は高くて結構使える。ただ、大規模アプリ開発ではエクスポートしてそのまま使うのはあまり現実的ではない。出力ファイルが微妙だったり、ワークフローが複雑になったりといろいろ問題がある。その辺のことは別途まとめたい。

とはいえ、これがあったからCreateJSが結構使われるようになったんだと個人的に思っている。エンジニア以外ならToolkit自体がCreateJSだと認識している人もいるのではないかと思ってる。
AngularJS generator (Yeoman) についてメモ


### 基本はこのコマンド

```
$ yo angular
```

### どういうコマンドオプションあるかはヘルプを見る

```
$ yo angular -h 
```

いま時点のバージョン(1.1.2)だと次のような感じ。

![スクリーンショット 2014-04-08 15.14.26.png](https://qiita-image-store.s3.amazonaws.com/0/35733/1e874cc6-8b77-9d6b-86b0-e841d685d2ec.png "スクリーンショット 2014-04-08 15.14.26.png")

- minify したときにおかしくならないよう `--minsafe` はつけておいた方が良さげ。
- CoffeeScript で書けるようになる `--coffee` はおすすめ。

### どんなサブジェネレータがあるか

- GitHub の `README.md` をみるのが一番はやい
	- https://github.com/yeoman/generator-angular
	- 使うときは次のような感じ

```
$ angular:filter myFilter
```
テストの中でストーリーボードを使い、さらに非同期な動作をおこなわせたいとき

ストーリーボードを使ったテストはshouldRunOnMainThreadをYESにしてメインスレッドで実行すればよいが、そのテストの中に非同期な動作が入っている場合、shouldRunOnMainThreadをYESにしてもうまくいかない。

そのようなときは下記のようにする。

```objc:ViewControllerTest.m

- (BOOL)shouldRunOnMainThread
{
//    return YES;
    return NO;
}

// 各々のテストが実行される前に呼ばれる
- (void)setUp
{
    /*
     ストーリーボードの初期化
     
     ビューのオブジェクトを作るので、メインループで実行しなければならない
     */
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    GHAssertNotNil(storyboard, @"ストーリーボードが存在しない");
    self.vc = [storyboard instantiateViewControllerWithIdentifier:@"MeasureCertainNetworking"]; // Storyboard ID
    GHAssertNotNil(self.vc, @"ビューコントローラが存在しない");
//    [self.vc loadView];
    /*
     メインループで実行する別のやり方
     */
    [self.vc performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];
}
```

これでビューコントローラのloadViewはメインスレッドでおこなわれ、別の非同期なメソッドはメインスレッド以外のスレッドで動作する。
くくく……OpenSSLがやられたか、の次に考えたこと

問: apt-get upgrade (yum upgrade) だけでいいんだろうか
きっかけ: http://heartbleed.com/
めばえ: それは愛

起動しているプロセス全部をリブートしてくれるわけではないので、それだけだと「アップデートされたライブラリは生きてるプロセスから参照され続ける」という話がありまして。

以下は一例とのことですが。

```
# lsof -d DEL | fgrep -v -e /dev/zero -e /SYSV
... (うぞうむぞう)
```

これだけだとChromeプロセスの有象無象まで出てきますけど、ヒントですので十分です。

あと、こういうのもあるんだとか

https://twitter.com/kmuto/status/453377000678240256

最近ではReVIEW界隈でも色々救ってもらう機会が増えているむとぅ神です。

```
# grep ssl /proc/[0-9]*/maps | grep deleted
... (山ほどのlibssl.so)
```

![marble_cake_uwaa.png](https://qiita-image-store.s3.amazonaws.com/0/14365/249534e1-9f72-ac6b-0698-c855326d417e.png)

手動でやる場合は、以降プロセスを殺すかサービス再起動するかすれば大体消えます。OSを丸ごとリブートするというのでも、まぁいいのか。

(めんせきそのほか: 筆者はこの記事の内容その他に責任を負い(え)ません。特にセキュリティが絡むことですので対応にはご注意ください。間違いや不足を見つけたらTwitter @amedamaまでご連絡ください。コメント欄は見てないかもしれません。適当に書いた後で不安になってめんせきそのほかがどんどん編集で増えているのは秘密です！)

* https://www.jpcert.or.jp/at/2014/at140013.html
* http://security.slashdot.jp/story/14/04/08/0943225/

(追加: 2014-04-09 8:12、9:30)

コメントいただきました。Debianのみの条件かもしれませんがさらにこういうのもあるようです

```
# apt-get install debian-goodies
# checkrestart
Found 29 processes using old versions of upgraded files
(3 distinct programs)
(3 distinct packages)
...
(以下詳細な説明)
...
These are the init scripts:
service ssh restart
service snmpd restart
service zabbix-server restart
```

強烈に有用なのは最後の部分という印象。
checkrestart自身が把握できる範囲で、何をやれば良いの一応の候補も教えてくれます。
init script周りであれば```service hoge restart```の実行を推してくれるでしょう。

分からない範囲でも対処に必要な情報は色々くれます。
例としてPython製デーモンのceleryd。こちらは```service celeryd restart```できるのですが、このツールはあくまで"python2.7-minimal"のプロセスでありinit scriptはない、と判断し、上記のような提案はされませんでした。
それでも

```
These processes do not seem to have an associated init script to restart them:
...
python2.7-minimal:
	3288	/usr/bin/python2.7
	3303	/usr/bin/python2.7
	3360	/usr/bin/python2.7
	3359	/usr/bin/python2.7
```

といった形で再起動の判断に必要な情報は提供してくれました。

なおCentOSに```checkrestart```コマンド自体があるという様子はありませんでした。
参考(古いけど): https://www.centos.org/forums/viewtopic.php?t=17947

(追記 2014-04-09 14:17)

そういやもう少し重要な場所が書かれてなかった。念の為。
「サーバ証明書の見直し等も合わせてご検討ください」
(上の話はこれまでの普通のバグでもある程度通用するけど、ここだけはHeartbleedの特徴的な部分かなぁと)
opensslのバージョン確認とアップデート(Heartbleed対応)

[OpenSSLの重大バグが発覚。インターネットの大部分に影響の可能性](http://jp.techcrunch.com/2014/04/08/20140407massive-security-bug-in-openssl-could-effect-a-huge-chunk-of-the-internet/)

バグの詳細は細かく見てないけど、アップデートしといたほうがよさそうなので手順をまとめてみる
Macとyumが使えるLinux系だけです。

# 概要
1.0.1以降にバグがある
1.0.1以降(1.0.1fと1.0.2-beta1も含む)に影響がある。
推奨される対処方法は、1.0.1gへアップグレードすること、もしくは-DOPENSSL_NO_HEARTBEATSオプションをつけて再コンパイルすること。
ただし、Linuxの場合はOSごとに対応済みバージョンが異なる場合があるので注意。多分開発元を見れば書いてあるはず。

#### 例

- AmazonLinux:openssl-1.0.1e-37.66.amzn1
- CentOS:openssl-1.0.1e-16.el6_5.7

# Mac

Mac標準のopenssl(10.9.2)
何もしていなければ0.9系だと思うのでそれなら問題ないはず

```bash:
which openssl #opensslのパスを確認 /usr/bin/openssl となってるはず
openssl version #バージョンの確認
```

homebrewのopenssl

```bash:
brew update #brewのアップデート
brew list #opensslがインストールされているか確認
brew info openssl #最新版の情報取得
brew upgrade openssl #1.0.1gへアップグレード
```

macports(今使ってないので多分)

```bash:
port outdated #アップデートがあるパッケージ一覧
sudo port upgrade openssl #アップデート
```

# Linux

```bash:
openssl version #バージョンの確認
sudo yum clean all #念のためyumのキャッシュをクリア
yum list updates #アップデートがある一覧を取得
sudo yum update openssl #opensslをアップデート
```
<del>ちなみにこれを書いている時点ではAmazonLinuxにはまだパッチは来てませんでした。</del>
http://qiita.com/tachiba/items/83e5fd31d06e6577abb3
こちらを見ると、openssl-1.0.1e-37.66.amzn1以上ならいいらしい

よく見ると、新規で起動したインスタンスは自動でインストールされるとなってます。
自分の環境で確認したところ、確かにかってに更新されていました。
AmazonLinuxならインスタンスを立ち上げ直せばそれだけでOKみたいです。すばらしい。

間違いがあったらつっこんでください。
Laravelコマンドをcrontabに登録

Laravelコマンドをcronに登録する方法をメモ。日本語のサイトが見つけきれなかったので。

Laravelのコマンドは普段こんな感じで実行されていると思う。

```

php artisan command:test

```

これを、たとえば毎週月曜0時0分に実行したい場合、
crontabを編集する

```

vi /etc/crontab

```

そして、以下を追記する

```

0 0 * * 1 root /usr/bin/php /your/file/to/path/artisan command:test

```

ポイントは、

* php
* artisan

という何気なく打っているコマンドを絶対パスで指定すること。それだけ。

ちなみにphpの実行ファイルがどこにあるかは

```

find / -name php

```

って打てば出てくるはず。

終わり。
APNSの確認ダイアログを再表示する方法


Push通知の確認ダイアログの表示タイミングを色々テストするときに、再表示させるためのデバイスの操作を毎回忘れるのでメモ。

## 手順
アプリをアンインストールして1日以上経過した状態を作りだすのが重要みたい。再起動は面倒だけど省くと上手くいかないです。

1. デバイスの時刻を自動設定から手動に変更
2. アプリをアンインストール
3. デバイスを再起動
4. iPhone の時刻を1日以上未来に手動で変更
5. デバイスを再起動
6. アプリを再インストール

## 参考
[Troubleshooting Push Notifications](https://developer.apple.com/library/ios/technotes/tn2265/_index.html)
> The first time a push-enabled app registers for push notifications, iOS asks the user if they wish to receive notifications for that app. Once the user has responded to this alert it is not presented again unless the device is restored or the app has been uninstalled for at least a day.
Heartbleed ~ OpenSSL脆弱性 (CVE-2014-0160)　まとめ

<blockquote class="twitter-tweet" lang="en"><p>update ALL the server <a href="https://twitter.com/search?q=%23heartbleed&amp;src=hash">#heartbleed</a> <a href="https://twitter.com/search?q=%23openssl&amp;src=hash">#openssl</a> <a href="https://twitter.com/search?q=%23nightshift&amp;src=hash">#nightshift</a> <a href="http://t.co/BkO2DHT8Rt">pic.twitter.com/BkO2DHT8Rt</a></p>&mdash; Andreas Kupfer (@ScottyTM) <a href="https://twitter.com/ScottyTM/statuses/453312581340389376">April 7, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## OpenSSLの脆弱性

- http://www.openssl.org/news/secadv_20140407.txt
- http://www.openssl.org/news/vulnerabilities.html#2014-0160

## 影響 

```
Heartbleedのバグは、インターネット上の誰もがOpenSSLソフトウェアの脆弱なバージョンで保護されているシステムのメモリを読み取ることができます。
```

Google translateがすごいぃ。日本語の切れ味が。原文は以下。

```
The Heartbleed bug allows anyone on the Internet to read the memory of the systems protected by the vulnerable versions of the OpenSSL software.
```



## 対象は1.0.1 and 1.0.2-beta

```
Only 1.0.1 and 1.0.2-beta releases of OpenSSL are affected including
1.0.1f and 1.0.2-beta1.
```

### チェックツール
http://filippo.io/Heartbleed/

### Versionの確認方法

```
root@host:~#  openssl  version
OpenSSL 0.9.8o 01 Jun 2010
```

## 対応方法

1. OpenSSLのUpdate
2. SSL証明書の破棄と再発行

```
影響を受けるユーザーは、OpenSSLの1.0.1gにアップグレードする必要があります。即座にできないユーザー 
アップグレードは、代わりに-DOPENSSL_NO_HEARTBEATS OpenSSLを再コンパイルすることができます。 

1.0.2は1.0.2-β2で修正される予定です。
```
完璧な日本語やないか powered by Google Translate　〜

さらに、SSL証明書を更新する必要があります。こちらに詳しく書かれています。
http://d.hatena.ne.jp/nekoruri/20140408/heartbleed

```
脆弱性のあるバージョンを使っていた場合、最悪でSSL証明書の秘密鍵が奪取されている可能性があります。この場合、現在使っているSSL証明書を失効(revoke)させ、再発行する必要があります。
```


## 状況や対応方法

### AWS ELB
https://aws.amazon.com/jp/security/security-bulletins/aws-services-updated-to-address-openssl-vulnerability/

### AWS EC2
http://qiita.com/tachiba/items/83e5fd31d06e6577abb3
http://dev.classmethod.jp/cloud/aws/awsheartbleedbug/

### Heroku
https://status.heroku.com/incidents/606

### Engine Yard
https://support.cloud.engineyard.com/entries/50554018

## 詳しく

Twitter #hartbeed
https://twitter.com/search?q=%23heartbleed&src=tyah

特設ページ
http://heartbleed.com/

DeNAのBlog　脆弱性とコードの解説
http://developers.mobage.jp/blog/2014/4/15/heartbleed

Gigazineの記事
http://gigazine.net/news/20140408-heartbleed-bug/

Techcrunchの記事
http://jp.techcrunch.com/2014/04/08/20140407massive-security-bug-in-openssl-could-effect-a-huge-chunk-of-the-internet/

修正コミット
https://github.com/openssl/openssl/commit/96db9023b881d7cd9f379b0c154650d6c108e9a3


## Thanks Thanks 

# Thanks for Neel Mehta of Google Security!!


## etc

<blockquote class="twitter-tweet" lang="en"><p>いよいよSSLもオワコンか。。。 <a href="https://twitter.com/search?q=%23heartbleed&amp;src=hash">#heartbleed</a></p>&mdash; Kenn Ejima (@kenn) <a href="https://twitter.com/kenn/statuses/453397036524527617">April 8, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script> 

w
bundlerで良く使うやつ

# bundler memo

[bundlerで困ったらここを見る] (http://bundler.io/)

## 良く使うの

### [bundle install] (http://bundler.io/v1.6/bundle_install.html)
```rb

bundle install --path=PATH

```

### [bundle config] (http://bundler.io/v1.6/bundle_config.html)

```rb

bundle config

```

bundle configでPATHが設定されてたら、２回目からは、bundleだけでbundle install --path=PATH

### [bundle exec] (http://bundler.io/v1.6/bundle_exec.html)

```rb

bundle exec COMMAND

```
Cakephpの導入時のエラー解消について


開発環境
Linux　CentOS
php 5.4
apache 2.*

putty/WinSCPを使用

１、Cacheへの書き込み権限の付与。
cakeのディレクトリ内以下で

cake/tmp/app/cache

で右クリック→プロパティ→書き込み権限の部分をすべてチェック

また下にある、再帰的に書き込み権限を与えるというチェックボックスにもチェックを入れる
（これにより、cache以下のディレクトリにも書き込み権限が与えられる。）

writableという表示は書き込み権限に関するエラーコード

これでおそらくwritableと記載してある、書き込み権限のエラーは解除されるはず。

次におそらく出てくるであろうtimezone設定のエラー。
日本で作業する場合は、

/etc/php.ini

にあるPHPの設定ファイルで

;date.timezoneと書いてある場所を探し、

(;)date.timezone = Asia/Tokyo

コメントアウトされている場合はコメントアウトをはずす。

CSSが適用されないエラーについて

mod_rewrite
.htaccess
の設定がなされていない。
（appacheはデフォルトの状態では.htaccessがNoneになっている。）

http://www.phpbook.jp/cakephp/install/index3.html
に詳細が載ってる。

app/tmpディレクトリへのアクセスの権限がない。
WinSCP上で
app/tmp
で右クリック→プロパティ→書くこみ権限のWにチェックする。
→再帰的に～をチェック
これでtmp以下のファイルにも書き込み権限が付与される。

※随時更新
※エラーの修正の仕方ほかにもありましたら教えてください。

※エラーの検索の仕方。
CakePHPの場合、エラー部分はブラウザアクセスした際にエラー項目として表示されることが多いので、エラー内容をまんまググると何かしら日本語のドキュメントにあたることがある。