OmniAICreator/Qiita-1.07M huggingface dataset:
MongooseでSchemaにデフォルトの配列を定義する方法

ごめんなさい。元の内容嘘でした。直接defaultに設定できます。

```js
var schema = new Schema({
    mycolumn: { 
      type: [String], 
      default: ["DefaultString1", "DefaultString2"]
    }
});
```

もしも一個だったら配列にしないでおいても融通きかせて配列にしてくれます

```js
var schema = new Schema({
    mycolumn: { 
      type: [String], 
      default: "DefaultString1"
    }
});
```

### 以下の内容は嘘です。



~~https://groups.google.com/forum/#!topic/mongoose-orm/W-fVEyx3O9A
から
https://gist.github.com/aheckmann/3801422
へ誘導されて~~

```js
var schema = new Schema({
    name: String
  , docs: { type: [docs], default: function () {
      // need to manaually add the ObjectId in this case
      return [{ name: 20, _id: new mongoose.Types.ObjectId }]
    }}
});
```

~~ようするに、defaultに関数を設定できるということだそうだ。~~

```js
var schema = new Schema({
    mycolumn: { 
      type: [String], 
      default: function () {
          return ["DefaultString1", "DefaultString2"];
      }
    }
});
```
Playでファイルアップローダー機能を実装する


playフレームワークを使ってアップローダーを作成する。
前提としてplayの空プロジェクトができているものとする。

##ルーティングの設定
routesに次の３行を追加する。

```routes
# for Uploader
GET     /up             controllers.Uploader.index
POST    /upload         controllers.Uploader.upload
```

##ビューの作成
アップローダーを行う画面を作成する。

```app/view/up.scala.html
@(message: String)

@main("Welcome to Play") {

@helper.form(action = routes.Uploader.upload, 'enctype -> "multipart/form-data"){
        <input type="file" name="file">
        <input type="submit">
}

}

```

##コントローラーの作成
アップロード用のロジックを作成する。

```app/controllers/Uploader.scala
package controllers

import play.api._
import play.api.mvc._

object Uploader extends Controller {
 
  def index = Action {
    Ok(views.html.up("アップロード成功"))
  }
 
  def upload = Action(parse.multipartFormData) { request =>
    request.body.file("file").map { file =>
      import java.io.File
      val filename = file.filename
      val contentType = file.contentType
      file.ref.moveTo(new File("/tmp", filename))
    Ok(views.html.up("アップロード成功"))
    }.getOrElse {
      Redirect(routes.Uploader.index).flashing(
        "error" -> "Missing file"
      )
    }
  }

}

```

これで次のURLにアクセスすればアップロードを行える。
http://ホスト名:9000/up
（メモ）Vagrant環境でDjango　〜　SQLite3データベースの適用まで

[おなじみのadminページが表示できるようになりました。](http://qiita.com/juniskw/items/9f20af9571bf3bf6d795)

あとは普通に **INSTALLED_APPS** の **models.py** を書いて **syncdb** すればいけるだろうと思い早速やってみたのだが、ログインフォームでIDとパスワードを入力してアクセスしたところ以下のようなエラーになってしまった・・・。

>OperationalError at /admin/
>
>attempt to write a readonly database

パーミッションの問題かなと思いつつググってみると、「データベースファイルのパーミッション変えたら解決しました」って書いてあるので案の定そうだったらしい。
http://stackoverflow.com/questions/17641993/operationalerror-attempt-to-write-a-readonly-database-in-ubuntu-server

つまり書き込み権限がないとのことなので、```chmod +w your.sqlite3```でOK。

ところでUNIXのパーミッションは「１」「２」「４」の合計値で「書き込み」「読み込み」「実行」権限を表すということは何となく覚えていたのだが、どの数値がどの権限を表すのかちゃんと覚えていなかったことに気付いた。いい機会なのでググって勉強。
http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3

```ls -l your.sqlite3```で見てみると自分のデータベースファイルは

```
-rw-r--r--
```

がデフォルトのパーミッションらしかった。数字で表すと **644** 。それぞれの数字は左から「ユーザー」「グループ」「その他」を意味しているのでユーザーしか書き込みできない設定になっていたようだ。
では「グループ」と「その他」、どちらに書き込み権限を与えればいいのだろうかと思い、試した。まずは「グループ」のみに権限を付与。

```
chmod 664 your.sqlite3
```

結果、何も変わらない。

ということで今度は「その他」のみに権限を付与（この場合は **646** となる）。

>OperationalError at /admin/
>
>unable to open database file

メッセージが変わった。どうやら「その他」ユーザーとしてアクセスしているようだ（よくよく考えたら当たり前）。
**データベースファイルが開けない・・・ということは今度は実行権限だ** と思い、ひとまず **777** にしてみた（細かく検証するのが面倒になってきたので）のだが変わらず、あれ？

調べているうちにこのページに当たり解決。
http://stackoverflow.com/questions/7670289/sqlite3-operationalerror-unable-to-open-database-file

どうやらプロジェクトのディレクトリに直接データベースファイルを置くのではなく、 **db** というディレクトリを作ってその中に入れておくと動くみたいだ。
で、この場合 **どうやらyour.sqlite3のパーミッションはデフォルトのままでもOKで、dbディレクトリの方のパーミッションをいじらないと駄目だったらしい** 。
「その他」ユーザーが **7** になっていればひとまずは大丈夫っぽい（まあ潔く777でいいと思うが）。

ログイン成功。それにしてもけっこう苦戦するなあ・・・。
Google Cloud Storage ACL


[GCS ACL](https://developers.google.com/storage/docs/accesscontrol) について

Google Cloud StorageはBlobstoreと違い、ACLによるアクセス制御ができる。

## 設定できるスコープ
* Google Storage ID
* Google account email address
* Google group email address
* Google Apps domain
* Special identifier for all Google account holders
* Special identifier for all users

## Google Storage ID
Googleアカウント,Google Groupの識別するための64進数の文字列。
内部で利用しているIDのようで、意識することはない。

## Google account email address
Google Accountのemail address
1人ずつUserを登録できる。
GAEからGCSを利用する場合、GAEのaddressはこのスコープで設定する。([DefaultGcsBucket](https://developers.google.com/appengine/docs/java/googlecloudstorageclient/activate#Using_the_Default_GCS_Bucket)については設定しなくても良いようだ。)

## Google group email address
Google Groupのemail address
特定のGoogle Groupに所属しているUserにだけ利用させたい場合に設定する。

## Google Apps domain
Google Appsのdomain
特定のGoogle AppsのdomainのUserにだけ利用させたい場合に設定する。

## Special identifier for all Google account holders
Google accountにログインしているUser
Google accountにさえログインしていれば、だれでもよいという設定

## Special identifier for all users
全User
認証がない状態

# ACLを設定する対象

* Objects
* Buckets

## Objects
ファイル。
Cloud Consoleからフォルダを作ることができるが、フォルダにはACLを設定することができない。
フォルダはあくまで階層構造を表現することができるのみ。

## Buckets
バケット。
BucketのACLはあくまでそのBucketに対するもので、中に入っているObjectsには関与しない。
BucketのREADを持っていても、中のObjectのREADを持っていない場合、そのObjectを読むことはできない。

# 権限の種類

* NONE
* READ
* WRITE
* FULL_CONTROLL

## NONE
権限無し

## READ
### Objects
そのObjectをDownloadすることができる。
### Buckets
Bucketの中に入っているObject一覧を見ることができる。

## WRITE
### Objects
WRITEはObjectには設定できない。
### Buckets
Bucketの中にObjectsを書くことができる

## FULL_CONTROL
### Objects
READが可能な上に、ACLの閲覧,変更ができる。
### Buckets
READ,WRITEが可能な上に、ACLの閲覧,変更ができる。

# Default ACL
新しくファイルをUploadした場合のACLは、Bucketに設定されているDefault ACLが適用される。
**BucketのACLが設定されるわけではない**ので、注意が必要。
Default ACLはBucketの設定として保存されているので、Developers Consoleで編集したいbacketのOptionから `オブジェクトの既定の権限を編集` を選択して編集する。
もしくは、Command Line Toolである[gsutil](https://developers.google.com/storage/docs/gsutil?hl=ja)を使って、編集する。
gsutilを利用して、Default ACLを取得するためのcommandは以下。

```
gsutil defacl get gs://{your bucket name}
```


# gsutil command sample

他のcommandは[Document](https://developers.google.com/storage/docs/gsutil/commands/acl?hl=ja)を参照のこと

* 対象のbucketのACLを取得

```
gsutil acl get gs://{your bucket name}
```

* 対象のbucketにhoge@example.comのWRITE権限を追加

```
gsutil acl ch -u hoge@example.com:WRITE gs://{your bucket name}
```

* 対象のbucketのObject一覧を取得

```
gsutil ls gs://{your bucket name}
```

* Local FileをGCSにCopy

```
gsutil cp hoge.txt gs://{your bucket name}
```
the silver searcher の レシピ

## rpmからインストールするレシピ

```rb
install_path = "/usr/bin/ag"
bash "instal_the-silver-searcher" do
  user "root"
  group "root"
  code <<-EOH
rpm -ivh http://swiftsignal.com/packages/centos/6/x86_64/the-silver-searcher-0.14-1.el6.x86_64.rpm
  EOH
  not_if { ::File.exists?(install_path) }
end
```

### the_silver_searcher github

https://github.com/ggreer/the_silver_searcher


## source から インストールするレシピ

上記のレシピでもいいけど、諸事情により、ソースからインストールするレシピが必要になったので、rpmからインストールされたものを削除して、ソースからインストールするレシピを書いた。

### rpmからインストールしたのを消す
```rb
rpm_install_path = "/usr/bin/ag"
if File.exists?(rpm_install_path)
  bash "uninstall_the-silver-searcher" do
    user "root"
    group "root"
    code <<-EOH
rpm -e the-silver-searcher
    EOH
  end
end
```

### git から clone
```rb
git_clone_path = "/usr/local/src/the_silver_searcher"
source_install_path = "/usr/local/bin/ag"

git git_clone_path do
  repository "git://github.com/ggreer/the_silver_searcher.git"
  revision "master"
  action :sync
end
```

### ビルド(コンパイル)に必要なパッケージをインストール

```rb
bash "yum development tools" do
  user "root"
  group "root"
  code <<-EOH
yum -y groupinstall "Development Tools"
  EOH
  not_if { ::File.exists?(source_install_path) }
end

depend_packages = %w{pcre-devel xz-devel}
depend_packages.each do |package_name|
  yum_package package_name do
    action :install
  end
end

```

### ビルド & インストール

```rb
bash "install the_silver_searcher" do
  user "root"
  group "root"
  code <<-EOH
cd #{git_clone_path}
./build.sh
make install
  EOH
  not_if { ::File.exists?(source_install_path) }
end
```

bashで処理してるとこも、if文とか使って、冪等性を意識しております。
rspecで引数を持つ関数をstub_chainする方法


この関数をstubするには

```
Payment.order(:updated_at).where(:paid => true).count
```

こう書く

```
Payment.stub_chain(:order, :where, :count).with(:updated_at).with(:paid => true).with().and_return(10)
```

### 参考
http://stackoverflow.com/questions/8003445/rspec-stub-chains-with-arguments
iTunesからiOSデバイスのDocumentsフォルダにアクセスするためには



##xcodeでの設定

xcodeから、plistに```Application supports iTunes file sharing```を追加し、Valueを```YES```とする。


1. xcodeのプロジェクト画面左のファイルツリーを開く。

2. [プロジェクト名] - [Supporting Files] - [プロジェクト名-Info.plist]をクリック。

3. メイン画面での空白で右クリックし、"Add Row"をクリック。

4. 以下の値を入力する。

```
Key:   Application supports iTunes file sharing
Value: YES
```

##iTunesからの参照

1. iOSデバイスを接続

2. 左メニューの[DEVICES]から該当のiOSデバイスを選択

3. メイン画面から[Apps]を選択

4. "File Sharing"の"Apps"から該当のアプリケーションを選択すると、右枠の"アプリケーション名 Documents"でファイルの参照が可能。
クラス定義用のモジュールを作ってみた


いくつかjavascriptでクラス定義する時の落とし穴を投稿しました。

[クラスの落とし穴４ - Getter/Setterの実装](http://qiita.com/cocottejs/items/35e0edef71d8c0fc3348)を投稿後に、策4を簡単に取り扱うことができたらなと思っていたら、思い立ってしまってnode用のモジュールを作ってみました。

公開しているので`npm install cocotte-define`ですぐに使えます。

TypeScriptとか使わなくてもjavascriptだけでプロパティや引数の型チェックしたいなと
思ったら試してみてください

```js:
var k = new Klass();

k.name = 'foo';
k.name = 123; // 例外発生

k.setName('foo');
k.setName(123); // 例外発生
```

また、プライベート変数も簡単に取り扱えるようになっています。

詳しくは[git-README](https://github.com/yukik/cocotte-define)で。
Emacs に plsense を導入したので備忘録

# Emacs に plsense を導入したので備忘録

## plsense.el

*  el-get-install で導入。楽。

## plsense をビルドするために必要な CPAN モジュールのインストール

* Makefile.PL 叩いた時に怒られるので
 * 20140412追記

```
$ cpanm --installdeps .
$ cpanm Module::Install::CPANfile
```

* 下記手順は間違いでした

```
$ cpanm Module::Install File::Remove
 inc::Module::Install http://search.cpan.org/CPAN/authors/id/M/MI/MIYAGAWA/Module-CPANfile-1.0002.tar.gz CPAN Try::Tiny Plsense Log::Handler Params::Validate Config::Tiny Class::Std
```

## もってくる

* git clone する

```
$ git clone https://github.com/aki2o/plsense.git
```

## ビルドする

```
perl Makefile.PL
make
sudo make install
```

## PATH が通っていないので、alias 貼る

* ファイルがあるかの確認はしておく

```
if [ -f /opt/local/libexec/perl5.12/sitebin/plsense ] ; then
    alias plsense='/opt/local/libexec/perl5.12/sitebin/plsense'
fi
```

* 20140412 plenv版追記

```
if [ -d $HOME/.plenv ] ; then
    export PATH="$HOME/.plenv/versions/$(perl -v | head -n2 | cut -d' ' -f 9 | sed 's/(v\(.*\))/\1/' | tr "\n" "\0")/bin:$PATH"```
fi
```

## .emacs に追加する

 * とりあえず、Github に書かれてることそのまま

```
(require 'plsense)

;; キーバインド
(setq plsense-popup-help-key "C-:")
(setq plsense-display-help-buffer-key "M-:")
(setq plsense-jump-to-definition-key "C->")

;; 必要に応じて適宜カスタマイズして下さい。以下のS式を評価することで項目についての情報が得られます。
;; (customize-group "plsense")
```

## anything 入ってないと怒られる

 * el-get-install して入れておく
OSXでSSH Tunnelingを利用してSMTP接続を行う方法


#やりたいこと

- SSH Tunnelを利用して，外部のSMTPサーバに接続したい．
 - ```ssh``` コマンドで実現は可能 

```bash:terminal
$ ssh -i <private_key> -N -L <tunneling port>:smtp.server:25 user@smtp.server &
```

- OSXにログインした際に自動的にtunnelingをつなぎ続けてほしい． **(本題)**
 - bash_profileに設定すると毎回terminalを立ち上げる必要がある．
 - 一度接続が切れると再度実行が必要

#やったこと
- ```launchctl```を利用してsmtpに接続するjobを登録した．
 - login時に自動的に実行し，継続させるよう設定した．

#手順
以下の様にplistを作成．

```plist:~/Library/LaunchAgents/smtptunnel.plist
 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>smtptunnel</string>
	<key>UserName</key>
	<string>user_name</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/bin/ssh</string>
		<string>-i</string>
		<string>private_key</string>
		<string>-N</string>
		<string>-L</string>
		<string>xxxx:smtp.server:25</string>
		<string></string>
	</array>
	<key>KeepAlive</key>
	<true/>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>
```

`launchctl`にjobを登録．

```bash:terminal
$ launchctl -w load ~/Library/LaunchAgents/smtptunnel.plist
```

登録されたjobが動いているかを確認

```bash:terminal
$ launchctl list | grep smtp
760	-	smtptunnel
```

最後にsmtpサーバを `localhost:xxxx` に設定すれば完了．

#感想
- OSXでサービス管理をどうしてるのか今更理解できた．
- 軽いサービスならplistいじるだけでできそうなので応用効きそう．

#参考

- [SSH Tunneling SMTP on Mac OS X](http://benno.id.au/blog/2008/12/01/mac-ssh-mail-tunnel)
- [launchd.plist(5) Mac OS X Manual Page](https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html)
Clojure 演習


Gist に掲載している [Clojure 演習](https://gist.github.com/kohyama/6069032) を転載しておきます.

## Clojure Exercises / Clojure 演習

### Programming exercises frequently appeared / よくあるプログラミング課題

記述能力の高い Clojure.  
よくあるプログラミングの演習問題を Clojure で解いてみます.

* [FibBuzz](https://gist.github.com/kohyama/10346936)
* [整列アルゴリズム](https://gist.github.com/kohyama/10232624)
* [N Queen Problem / N クイーン問題](https://gist.github.com/kohyama/6068926)
* [お釣りの要らない全ての支払い方](https://gist.github.com/kohyama/5861172)
* [文字列を先頭から見て同じところまで除去](https://gist.github.com/kohyama/5857345)
* [ぷよぷよ連鎖](https://gist.github.com/kohyama/5828936)
* [三角形状の数値群で底辺に向かって総和が最大になる経路 (プロジェクトオイラー 問題 18)](https://gist.github.com/kohyama/4472647)
* [月の初めが日曜日になるのは何回? (プロジェクトオイラー 問題 19)](https://gist.github.com/kohyama/4472323)
* [行列中, 特定数の隣接要素の積の最大値 (プロジェクトオイラー 問題 11)](https://gist.github.com/kohyama/4381176)
* [数字群を辞書順に並べる (プロジェクトオイラー 問題 24)](https://gist.github.com/kohyama/4371543)
* [数を英単語で表記した場合の文字数 (プロジェクトオイラー 問題 17)](https://gist.github.com/kohyama/4335755)
* [特定数未満の素数の総和 (プロジェクトオイラー 問題 10)](https://gist.github.com/kohyama/4243539)
* [ハノイの塔](https://gist.github.com/kohyama/4039878) (Clojure, Haskell, JavaScript, CommonLisp, Scheme 比較)
* [数独](https://gist.github.com/kohyama/3951677) (Clojure, JavaScript, Scheme 比較, 英語解説)
* [無限シーケンスを用いたフィボナッチ数列](https://gist.github.com/kohyama/3937083) (Clojure, Haskell, JavaScript, CommonLisp, Scheme 比較, 英語解説)
* [FizzBuzz](https://gist.github.com/kohyama/3936925) (Clojure, Haskell, JavaScript, CommonLisp, Scheme 比較, 英語解説)
* [連続数による最長の部分数列 (4clojure 問題 53)](https://gist.github.com/kohyama/2928234)
* [ハノイの塔(過程も表示)](https://gist.github.com/kohyama/2848379)
* [逆FizzBuzz 問題](https://gist.github.com/kohyama/2709001)
* [双線形補間による二次元値の拡大縮小](https://gist.github.com/kohyama/2020060)
* [map-between](https://gist.github.com/kohyama/1708253)
* [tails](https://gist.github.com/kohyama/1708173)

###Clojure 特有のチップス
クラスの動的ロード, 文字列で与えた式の実行など, Clojure 特有の話題です.

* [An example client code to binary-communicate with a TCP server / TCP サーバとバイナリ通信するクライアントコード例](https://gist.github.com/kohyama/6458161)
* [マップの最下層の値に関数を適用](https://gist.github.com/kohyama/6089899)
* [ネストしたマップに対する操作の一般化](https://gist.github.com/kohyama/6789280)
* [参照のまとめ](https://gist.github.com/kohyama/6076544)
* [文字列で与えた式の評価](https://gist.github.com/kohyama/5964548)
* [頻出しない小ネタ](https://gist.github.com/kohyama/4256213)
* [実行時に追加したクラスパスのソースをコンパイル](https://gist.github.com/kohyama/3205162)

###ClojureScript 特有のチップス

* [ブラウザ REPL を使う最小の設定](https://gist.github.com/kohyama/6183122) (英語)
* [DOMの操作例](https://gist.github.com/kohyama/6192253)
npmモジュールをtgzに固めてインストールする

`npm pack`というサブコマンドがあるので、それを使うとモジュールをtgzにまとめる事が出来る。（いつの間にこんなサブコマンド出来てたんだ……）

```bash
$ npm pack grunt
npm http GET https://registry.npmjs.org/grunt
npm http 304 https://registry.npmjs.org/grunt
grunt-0.4.4.tgz
$ npm install ./grunt-0.4.4.tgz
```

`npm pack`に適当なモジュール名を渡してあげると、 ~~依存モジュールと一緒にダウンロードしてきてくれて、~~そのままtgzに固めてくれる。tgz展開したら依存モジュール付いてこなかった……

なのであとは`npm install`でtgzを指定してあげればお気楽簡単インストール。

どこか近いサーバにこんな感じでtgzを落としておいて、`package.json`にいい感じに書いておけば良いのかも。

インターネットに接続出来ない環境とか、プロキシに引っかかって接続できない環境とか、通信速度的に難があるとか、まあいろいろなときに使えるんじゃないでしょうか。

## 経緯とか

https://twitter.com/saisa6153/status/454117447646195712
R + pandoc + knitrBootstrapでRmdを書き出す

少しRから離れてruby書いていたら、色々バージョンが上がったりしていて驚きました。
knitrBootstrap使っているんですが、新しくなっていたので上げてみました。
環境はMacです。

## Pandocを入れる
お馴染み`brew`でhaskellを入れ、pandocを導入します。

```bash
$ brew install haskell-platform
$ cabal update
# version上がってるよ！と言われたので
$ cabal install cabal-install
$ cabal install pandoc
# path通しておきます
$ vim ~/.bash_profile
+ $HOME/.cabal/bin:$PATH
$ source ~/.bash_profile
$ pandoc -v
pandoc 1.12.3.3 # Yay!
# これが入ってないと後で怒られました
$ cabal install pandoc-citeproc
```

## Rから書き出す
先に`system('pandoc -v')`でpandocがRから呼び出せるかを確認しましょう。
見つからない場合はRが`.bash_profile`を読み込んでいないので、その場合は`.Rprofile`に`source(~/.bash_profile)`と書けば通ります。が、それが適切か不安だったりします…。

Rからpandocが読み出せれば、後は書き出せばOKです。

```r
library(knitrBootstrap)
library(rmarkdown)
render('awesome_report.Rmd', knitrBootstrap::bootstrap_document())
```

## Rstudioから書き出す
Rstudioからも書き出したいんですが、直接Rを起動した時と違う環境を読み込んでいるらしく、上手く行きません…。
Rstudioだと読み込まれてるrubyのバーションも違ったりして、「何かがおかしい…」な感じなんですが、時間もないし調査するのが面倒で取り敢えず諦めました。
まぁ普段は直接R触るので、まぁ良いや的な。
でも出来たら便利なので、Rstudioが呼び出す環境変数やらでよく纏まってる記事とかがあれば、是非教えて貰いたいです！
ActiveRecordのscopeの簡単なテストを書くときのメモ


scopeのテストを書くときどのレベルまで書くか迷いますが、ひとまずこれだけは書いときたい一番簡単なテストの書き方のメモ

`ActiveRecrod::QueryMethods`には`xxx_values`というattributeが用意されている。
これを利用する。


```ruby
class Hoge < ActiveRecord::Base
  scope :target, -> {
    group(:kind, :flag).
    order(created_at: :desc)
  }
end

describe Hoge do
  describe 'scopes' do
    describe 'target' do
      subject { Hoge.target }
      its(:group_values) { should =~ [:kind, :flag] }
      its(:order_values) { should =~ [{created_at: :desc}] }
    end
  end
end
```

まだ検証しきれていませんが、`where_values`等の場合Arelが返されたりする。

```ruby
class Hoge < ActiveRecord::Base
  scope :fuga, -> (a) { where(a: a) }
end

Hoge.fuga(10).where_values #=> [#<Arel::Nodes::Equality:0x007ffbcb89e378 @left=#<struct Arel::Attributes::Attribute relation=#<Arel::Table:0x007ffbcb03bfa0 @name="hoges", @engine=Hoge(no database connection), @columns=nil, @aliases=[], @table_alias=nil, @primary_key=nil>, name="a">, @right=10>]
```
RGB文字列を数値に変換

```el:rgb-string-to-value.el
(defun rgb-string-to-values (val)
  (interactive)
  (format " %d %d %d"
          (string-to-number  (substring val 0 2) 16)
          (string-to-number  (substring val 2 4) 16)
          (string-to-number  (substring val 4 6) 16)
          ))

; test
(rgb-string-to-values "ffffff")
(rgb-string-to-values "007ab7")
(rgb-string-to-values "cbe6f3")
(rgb-string-to-values "a4c520")
(rgb-string-to-values "eef5d3")
(rgb-string-to-values "da5019")
(rgb-string-to-values "f9dfd5")
```
等分散か否かに関わらずウェルチの t 検定を使う (べきである)

## ウェルチの検定についての概要

[昨日](http://qiita.com/ynakayama/items/a8d9da8215670b8d7317)は分散が等しくないときの検定について等分散検定→等平均検定をする手順を説明しました。

これを整理すると次のようになります。

帰無仮説

```math
σ_a^2 = σ_b^2
```

統計量と分布

```math
T = U_a^2 / U_b^2 \ge 1 \\
F(Na - 1, Nb -1)
```

なお棄却域は対立仮説において分散をどう比較するか (等しいかあるいは上回るか / 片側検定または両側検定) で変わります。

さて、今日はいきなり[昨日](http://qiita.com/ynakayama/items/a8d9da8215670b8d7317)の内容を否定するかのような話をします。

古典的な統計の教科書では 2 つの正規母集団で、母分散 σ_a^2, σ_b^2 が不明であり σ_a^2 と σ_b^2 が等しくないと判定されたとき、[ウェルチの t 検定 (Welch's t test)](http://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%AB%E3%83%81%E3%81%AEt%E6%A4%9C%E5%AE%9A) を用います。

t 検定は分散が等しいことを前提にした検定ですが、ウェルチの検定は必ずしも分散を等しいことを前提にしないという点が大きな違いです。

昨今ではこのように等分散を前提としない方法が主流になりつつあり、むしろ[ウェルチの t 検定がデフォルトの t 検定で良いのではという雰囲気もある](http://laboratoryofbiology.blogspot.jp/2013/12/welchtanovastatwing.html)ほどなのです。

次の記事及び各リンク先を読むと統計の教科書によくある等分散の検定 (F 検定) → t 検定の流れにおける問題点がつかめるかと思います。

等分散検定から t検定・分散分析（ANOVA）・ウェルチ（Welch）検定への問題点
http://note.chiebukuro.yahoo.co.jp/detail/n13859

独立 2 群間の平均値の比較の際に生じる多重性の問題について
http://www2.vmas.kitasato-u.ac.jp/lecture0/statistics/stat_info03.pdf

2 段階検定を批判し等分散を前提としない検定で統一することを推奨する論文もあります。
http://beheco.oxfordjournals.org/content/17/4/688.full

深く理解するには[ウェルチの検定の文献](http://biol09.biol.umontreal.ca/BIO2041e/Correction_Welch.pdf)もあわせて参照しましょう。

## SciPy における実装

それでは我らが SciPy ではどのようになっているのでしょう。

[scipy.stats.ttest_ind](http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.stats.ttest_ind.html) のリファレンスを読めば一目瞭然ですが equal_var パラメータに False を指定することにより等分散を前提としなくなり即ちウェルチの t 検定となります。

この t 分布の自由度 m は次のようになります。

```math
m = \frac {(\frac {S_a^2} {n_a - 1} + \frac {S_b^2} {n_b - 1})^2} { \frac {({S_a^2})^2} {{({n_a - 1})}^3} + \frac {({S_b^2})^2} {{({n_b - 1})}^3} }
```

あとは SciPy のリファレンスからそのままのやり方ですが n1 != n2 のとき t 検定とウェルチの検定でそれぞれ次のようになります。

```py3
from scipy import stats
import numpy as np
np.random.seed(12345678)

rvs1 = stats.norm.rvs(loc=5,scale=10,size=500)
rvs2 = stats.norm.rvs(loc=5, scale=20, size=100)

# スチューデントの t 検定
stats.ttest_ind(rvs1, rvs2)
# => (0.24107173714677796, 0.8095821484893867)

# ウェルチの t 検定
stats.ttest_ind(rvs1, rvs2, equal_var = False)
# => (0.15778525230427601, 0.87491760438549948)
```

また先ほどのリンク先のブログ記事にもある通り、[統計ソフト Statwing の T-Tests でもウェルチの t 検定がデフォルトである](http://docs.statwing.com/technical-notes/t-tests/)とありますね。

以上のことから、筆者としても等分散か否かに関わらず、ウェルチの t 検定を利用することを推奨します。
jQueryを使ったIE8でのセレクトボックスの切り替えでハマル

上段の選択肢を変更したら、下段の選択肢の内容が切り替わる。
そのようなUIはだれもが経験あると思います。

これを実現するため、RailsアプリでjQueryを使って実装していたのですが、IE8で上手くいかなかったので、メモ。

はじめ

```js+erb
$("#id_of_select").html("<%= escape_javascript(select_tag :id_of_select, options_for_select(@options.map {|v| [v["name"], v["code"]] }), :include_blank => true) %>");
```

のような感じで実装していた。これだとChrome、Firefox、IE11では正しく動作していたが、IE8ではセレクトボックスの選択肢が全く無くなってしまう。
どうやら、jQueryのhtml(val)でタグごと書き換えるときにうまく書き換えられず、`<select><select>...</select></select>`のようになってしまっているらしい。

下記のように書き換えることで解決した。

```js+erb
var optionsHtml = "<%= escape_javascript(options_for_select((@options.map {|v| [v['name'], v['code']] }).unshift(['','']))) %>";
$("#id_of_select").html(optionsHtml);
```

選択肢の先頭に空が入れたくて、select_tag のオプション「:include_blank => true」を指定していたのだが、options_for_selectだけにしたことで、余分な処理を書かないといけなくなった。

IEのバカヤロウ。
Rails4 系 + compass-rails を使ってる際に Rails のバージョン上げると sprockets がコケる際の対処法

Rails4 + compass-rails を使っていて、Rails を 4.0.2 から 4.0.3 とかにバージョンアップすると以下の様なエラーが発生するようになることがあります。

![Screen Shot 2014-04-10 at 13.44.06.png](https://qiita-image-store.s3.amazonaws.com/0/16746/52184fae-6083-5752-e2ef-c540aa0d039a.png)

エラーメッセージも「wrong number of arguments (2 for 1)」といった感じで身も蓋もない感じですね。  
正直どうしたらええんじゃいってなります。  

# 原因
落ち着いて、スタックトレースを見ると sprockets の呼び出しでコケてるのがわかります。

![Screen Shot 2014-04-10 at 13.48.51.png](https://qiita-image-store.s3.amazonaws.com/0/16746/82bf06e2-cada-cb2b-a915-b405c17478e7.png)

というわけで compass-rails の issue とか眺めたら、以下の pull req を見つけました。

[Locking sprockets to 2.11 and bumping the version for now.](https://github.com/Compass/compass-rails/pull/146)

sprockets 側でメソッドシグネチャが変わったのでこけちゃうんですね。

# 解決方法
上記の pull-req と同様ですが、sprockets のバージョンを `2.11.0` 以上に上がらないようにしてしまえばOKです。  
Gemfile で

    gem 'sprockets', '2.11.0'

といった感じで固定するとかですね。  
`compass-rails` の `1.1.7` でもバージョンが固定されてるので、`compass-rails` をバージョンアップして `Gemfile.lock` の整合性とるとかでもOKです。

そのうち compass-rails 側も対応してくれると思うので、まずはこの方法でワークアラウンドしておくと幸せになれると思います。
Static Cells を UITableViewController 以外で使うと Xcode 5.1 ではビルドエラーになる

`UITableView` の Static Cells は、本来 `UITableViewController` でのみ使うことができます。

しかし Xcode 5.0 以前では、Storyboard 上で、`UIViewController` に `UITableView` をはりつけて Static Cells を使うことができてしまっていました。

Xcode 5.1 では、`UITableViewController` 以外で Static Cells を使おうとした場合、ビルド時にエラーとなるようになりました。

もちろん、エラーとすべきであり、Xcode 5.1 の動作があるべき姿です。むしろ、もっと早くエラーとしてくれていれば、間違った使い方が広まることもなかっただろうに・・・。
cakePHP2.4.7の初期設定


## ファイルの準備

[cakePHP](http://cakephp.jp/)

```準備：
公式からダウンロードしたファイルをサーバーにアップロード
```

## Security.saltの設定

```Notice
Notice (1024): Please change the value of 'Security.salt' in APP/Config/core.php to a salt value specific to your application. [CORE/Cake/Utility/Debugger.php, line 845]
```

設定：

```/app/Config/core.php225行目
Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
```
文字列を適当に変更する


## Security.cipherSeedの設定

```Notice
Notice (1024): Please change the value of 'Security.cipherSeed' in APP/Config/core.php to a numeric (digits only) seed value specific to your application. [CORE/Cake/Utility/Debugger.php, line 849]
```

設定：

```/app/Config/core.php230行目
Configure::write('Security.cipherSeed', '76859309657453542496749683645');
```
乱数を適当に変更する

## timezoneの設定
```Warning
Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in /var/www/vhosts/***/httpdocs/lib/Cake/Cache/CacheEngine.php on line 61 Warning: strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in /var/www/vhosts/***/httpdocs/lib/Cake/Cache/CacheEngine.php on line 61
```

設定：

```/lib/Cake/Cache/CacheEngine.php61行目
if (!is_numeric($this->settings['duration'])) {
	date_default_timezone_set('Asia/Tokyo');
	$this->settings['duration'] = strtotime($this->settings['duration']) - time();
}
```

timezone設定を追加

## Databaseの設定
```Warning
Warning (2): include_once(/var/www/vhosts/***/httpdocs/app/Config/database.php): failed to open stream: No such file or directory [CORE/Cake/Model/ConnectionManager.php, line 67]
```

`/app/Config`内にある`database.php.default`を複製して`database.php`に変更する

## DebugKitの配置
```
DebugKit is not installed. It will help you inspect and debug different aspects of your application.
You can install it from GitHub
```

配置：

[DebugKit](https://github.com/cakephp/debug_kit)からダウンロードした`debug_kit-master`を`/app/Plugin`にアップロードして名前を`Debugkit`に変更

設定：

```app/Config/bootstrap.php
CakePlugin::load('DebugKit');
```

プラグインの読み込み設定をする
Grocerを使ってAPNsプッシュ通知をする


Rails4+ruby-2.0.0-p247
APNsのGemってググってもイマイチだったんだが、その中でもわかりやすかったGrocerを使ってみた。

Grocer -- https://github.com/grocer/grocer

ほとんどREADMEに書いてある通りで動いた。親切。
本当は、ゲートウェイの設定は、設定ファイル系に書いた方がいいんだろうな。。

```Gemfile
gem 'grocer'
```


```pusher.rb
require 'grocer'

  @@grocer_pusher = Grocer.pusher(
      certificate: File.join(Rails.root, "config", "production_apns.pem"),
      passphrase: "",
      gateway: "gateway.push.apple.com",
      port: 2195,
      retries: 3
  )

  def async_send_apns(sender_id, reciever)

    target_devices = User.find(reciever.id).devices
    if target_devices.present?
      target_devices.each do |device|
        notification = Grocer::Notification.new(
          device_token: device.token,
          alert: self.apns_for_message(sender_id),
          badge: 1,
          expiry: Time.now + 60*60*60,
          identifier: 1234,
          content_available: true,
          custom: {user_id: sender_id}
        )
        @@grocer_pusher.push(notification)
      end
    end
  end
```

アプリによっては、独自のパラメータを指定したいこともあるので、そこはcustomが用意されていて、それを使えば良さそう。

```
custom: {user_id: sender_id}
```

今回はuser_idが欲しかったので、customに追加した。
本家のREADMEに書いてあるとおり、可変でいくつかのパラメータを付与することも出来そう。↓こんな感じ

```
custom: {
    "acme2": ["bang", "whiz"]
  }
```

今回はiOSだけだったけど、passbookやsafariへのnotificationも出来るみたい。
機会があればいろいろ試してみたい。
[Haxe]OpenFL環境構築（ビルド＆実行まで）

## 目的

Haxe OpenFLの環境構築＆スケルトンアプリのビルドと実行

## 環境
Mac OSX 10.7.5

## 参考URL
http://www.openfl.org/documentation/

## 手順

### Haxeインストール
http://haxe.org/download
からHaxe3.1.2をDL＆インストールしたが結局3.1.1にした・・・
↓からDLしとほうが良いかも。
http://www.openfl.org/documentation/setup/install-haxe/

### limeインストール

```
haxelib install lime
haxelib run lime setup
```

### OpenFLインストール

```
lime install openfl
```

### プロジェクト作成

```
lime create openfl:project MyProject
```

#### 作成されるファイル

MyProject
-Assets
--openfl.svg
-Source
--Main.hx
-MyProject.hxproj
-project.xml

### ビルド

```
lime build neko
```

エラー出た・・・
```
$ lime build neko
/usr/lib/haxe/lib/openfl-native/1,2,2/flash/utils/ByteArray.hx:276: lines 276-293 : Field readDouble should be declared with 'override' since it is inherited from superclass
/usr/lib/haxe/lib/openfl-native/1,2,2/flash/utils/ByteArray.hx:276: lines 276-293 : Field readDouble overloads parent class with different or incomplete type
/usr/lib/haxe/lib/openfl-native/1,2,2/flash/utils/ByteArray.hx:276: lines 276-293 : Void -> Float should be pos : Int -> Float
/usr/lib/haxe/lib/openfl-native/1,2,2/flash/utils/ByteArray.hx:307: lines 307-324 : Field readFloat should be declared with 'override' since it is inherited from superclass
/usr/lib/haxe/lib/openfl-native/1,2,2/flash/utils/ByteArray.hx:307: lines 307-324 : Field readFloat overloads parent class with different or incomplete type
/usr/lib/haxe/lib/openfl-native/1,2,2/flash/utils/ByteArray.hx:307: lines 307-324 : Void -> Float should be pos : Int -> Float
```
どうやらHaxe3.12のバグらしい。(2014.4.8現在)
きっともうすぐ直るはず・・。
http://www.openfl.org/forums/#!/bugs:openfl-native-bytearray-w

とりあえずHaxe3.11を使うと回避できるらしい。

ここに昔のバージョンのファイルがある。。
http://hxbuilds.s3-website-us-east-1.amazonaws.com/builds/haxe/mac/

を
/usr/lib/haxe/
にコピーする。

とビルド成功したぽい。

#### 実行

```
lime test neko
```

すると

```
$ lime test neko
Called from flash/display/Graphics.hx line 247
Called from flash/Lib.hx line 190
Called from /usr/lib/haxe/std/neko/Lib.hx line 30
Uncaught exception - load.c(357) : Primitive not found : ./lime@lime_gfx_draw_tiles(4)
```
エラー出た・・・。

参考URL
http://www.openfl.org/archive/community/installing-openfl/error-running-openfl-setup-max-osx-1084/


で
結局

```
haxelib upgrade
```

したら治った。手動でHaxeを更新したのが原因かも。
無事実行できました。疲れた・・。
FuelPHP開発入門_03


Kobito導入してみました。わりと快適です。
でもフォルダ分けがしたい(´＠ω＠｀)

さて、前回はconfig.phpとdb.phpを編集しましたので、
MailとSimpleAuthを利用できるように設定していきます。

MailとSimpleAuthについては、現在fuelのデフォルトパッケージとして搭載されています。
fuel/packages/の中にあるemailとauthがそれです。

 - fuel/packages/auth/config/auth.php
 - fuel/packages/auth/config/simpleauth.php
 - fuel/packages/email/config/email.php

この３つをコピーし、fuel/app/configの下に配置し、
コピーした各ファイル書き換えていきます。

```lang:auth.php
return array(
	'driver' => 'Simpleauth',
	'verify_multiple_logins' => false,
	'salt' => 'hogehoge',
	'iterations' => 10000,
);
```

```lang:simpleauth.php

/* === 30行目付近 === */

/**
 * DB table name for the user table
 */
'table_name' => 'users',

/* === 115行目付近 === */

/**
 * Salt for the login hash
 */
'login_hash_salt' => 'hogehoge',

/**
 * $_POST key for login username
 */
'username_post_key' => 'username',

/**
 * $_POST key for login password
 */
'password_post_key' => 'password',
```

salt部分は任意の文字列に書き換えます。
table_nameは認証に使うDBのテーブル名、
username_post_keyはログインIDにあたる項目のフィールド名、
password_post_keyはパスワードに当たる項目のフィールド名です。

次にEMail設定。こちらは文字化けしないように設定を追記しただけです。

```lang:email.php
/**
 * Setup groups
 */
'setups' => array(
	'default' => array(),
    'jis' => array(	// 追記 2014.04.03
        'charset' => 'ISO-2022-JP',
        'encoding' => '7bit',
    )
),
```

そういえばソース中に日付がちょいちょい入ってますが、
リアルタイムに勉強しながら記事を書いている状態なのでご理解ください。

packagesの利用設定は、configファイルをapp/configに移動→設定書き換え、config.phpへの記述（第二回参照）がベースになっているようです。

長い、つまらない、的を得ない記事ですが続きます。続けます。
さて次はコントローラー書いていきますヽ(´＠ω＠｀)ﾉ
基本型クラスを使ったプロパティのアイデア

とっても出落ちっぽいんだけど、C++には、

```cpp
operator TYPENAME();
```
みたいに書くキャストオペレータがある。これと、

```cpp
templete<typename T> class CLASSNIZER{
public:
  //オペレータとか
private:
  T body;
}
```
みたいな基本型に対応するテンプレートと、その個別用途専用の子クラスを組み合わせて、取り出したいメンバに対応する「型」にインスタンスを代入することでメンバを取り出すというアイデア。

```cpp
class HOGE{
public:
  class TOTAL_WEIGHT_kg : public CLASSNIZER<int>{}
  operator TOTAL_WEIGHT_kg(){ return a; };
private:
  TOTAL_WEIGHT a;
}

...

HOGE hoge;

...

HOGE::TOTAL_WEIGHT_kg a(hoge);
```
みたいな感じ。この使い方はエクストリームクラスの変形でもあるので例えば「総重量をkg」単位でという意味で「TOTAL_WEIGHT_kg」みたいに型にその意味とか単位とかを乗せたりする。
Capistrano 3.1.0 / Fukagawa.rb #1 参加備忘録(1)


##経緯
[Fukagawa.rb #1](http://fukagawarb.doorkeeper.jp/events/10300)に、というよりプログラミングの勉強会に初めて参加した。
Rubyは完全初心者(というよりプログラミング初心者)でしたが、
個人的に気付いた点があったので、復習。

##[Fukagawa.rb](http://fukagawarb.doorkeeper.jp/)とは？
Shinjuku.rb に参加されていた、[rasenn](http://qiita.com/rasenn)さんが新たに始められたDevOps系Rubyツールの勉強会。

今回はタイトルのとおり、[capistrano](https://github.com/capistrano/capistrano) について。
次回は、vagrantを予定。

##備忘録
- 環境  
私のMacでは、以下環境を利用。

```
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-darwin13.0.0]
# 作業用ディレクトリとして、capistranoディレクトリを作成。
$ mkdir capistrano
$ cd capistrano
```

- 流れ
Githubの[capistrano](https://github.com/capistrano/capistrano)/README.mdをもとに勉強会が進んでいます。

- インストール

>Add this line to your application's Gemfile:
>
>```
>gem 'capistrano', '~> 3.1.0'
>```

はい、私はここからよく分かっていませんでした。汗
Gemfileを作る必要があるんですね。

以前、他のGemをインストールする時に、紹介されていた方のサイトでは、

```
gem '名前', 'バージョン'
```

となっていたので、「このバージョンのgemをインストールしてね！」と思ってましたorz
(しかも試した時はうまくいかなくてあきらめてた、というオチw)

参考：[[ruby]最初に知っておけば良かったbundlerの使い方 rails編](http://kozo002.blogspot.jp/2012/01/rubybundler.html)

勉強会とは関係ないですが、上記参考サイトで、
`bundle init`なるものがあると知ったので、そうしておく。

```
$ bundle init
Writing new Gemfile to /PATH/to/capistrano/Gemfile
$ vi Gemfile
source "https://rubygems.org"

gem 'capistrano', '~> 3.1.0'
```

としました。

```
$ bundle install
# (中略)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

$ bundle exec cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
Capified
```

というようにインストールすると、以下のようにファイル・ディレクトリが作られる。

```
$ tree
.
├── Capfile
├── Gemfile
├── Gemfile.lock
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └── capistrano
        └── tasks

5 directories, 6 files
```

まずはインストール完了。
続きとして、使い方を書く予定。

なお、2系と3系では大幅に設定方法が変わっているようで、
その違いについては(よく分かっていないので)書けませんが、
備忘録的なものを書こうと思います。


[作りながら学ぶRuby入門 第2版](http://www.amazon.co.jp/%E4%BD%9C%E3%82%8A%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6Ruby%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E4%B9%85%E4%BF%9D%E7%A7%8B-%E7%9C%9F/dp/4797371277)をせっかく買ったんだから、早く読んで勉強しろ、私。。。
Rails (ActiveRecord) で scope と joins する方法

## 答え

[ActiveRecord::SpawnMethods#merge](http://api.rubyonrails.org/classes/ActiveRecord/SpawnMethods.html#method-i-merge) を使うらしい。

## 動作確認

### 前提

```rb:db/migrate/20140410025937_create_authors.rb
class CreateAuthors < ActiveRecord::Migration
  def change
    create_table :authors do |t|
      t.string :name

      t.timestamps
    end
  end
end
```

```rb:db/migrate/20140410030000_create_books.rb
class CreateBooks < ActiveRecord::Migration
  def change
    create_table :books do |t|
      t.integer :author_id
      t.string :title
      t.datetime :published_at

      t.timestamps
    end
  end
end
```

```rb:app/models/author.rb
class Author < ActiveRecord::Base
  has_many :books
end
```

```rb:app/models/book.rb
class Book < ActiveRecord::Base
  belongs_to :author
  scope :published, -> { where(arel_table[:published_at].not_eq(nil)) }
end
```

### 実行

```bash
$ bundle exec rails c
Loading development environment (Rails 4.0.3)
irb(main):001:0> Author.joins(:books).merge(Book.published)
  Author Load (0.1ms)  SELECT "authors".* FROM "authors" INNER JOIN "books" ON "books"."author_id" = "authors"."id" WHERE ("books"."published_at" IS NOT NULL)
=> #<ActiveRecord::Relation []>
```

## 参考文献

* [Rails 3 merging scopes with joins - Stack Overflow](http://stackoverflow.com/questions/13036604/rails-3-merging-scopes-with-joins)
Mail で2行になってるSubjectを取得するには？


メール系で便利な Mail gem。
しかし２つになってしまってる日本語Subjectの場合、subjectメソッドでは一つしか取ることが出来なかった。
やり方が悪いのかな？

しょうがないからこうして採った。

```
require 'mail'
require 'nkf'

Mail.defaults do
   retriever_method(:pop3,
                    address: 'mypop',
                    port: 110,
                    user_name: 'myaccount',
                    password: 'maypass'
                    )
end

Mail.all.each do |mail|
   sub = mail[:Subject].value    #生Subjectデータ
   subject = NKF::nkf('-mw',sub) #BASE64からUTF-8へ
....
end
Vimの基礎

#Vim Tutorial
:Tutorial チュートリアル起動

##カーソル移動　
　　　　　　　h→左方向に移動
　　　　　　　l→右方向に移動
　　　　　　　j→下方向に移動
　　　　　　　k→上方向に移動

###Vimの終了
　　　　　　　[ESC] :q!  (変更を破棄)
　　　　　　　[ESC] :wq (変更を保存)

###ヘルプウィンドウの表示
　　　　　　　:help

###コマンドのヘルプ検索
　　　　　　　:help cmd

###別のウィンドウへジャンプ
　　　　　　　CTRL-W CTRL-W

###ノーマルモードに移行（間違ったり入力途中のコマンドを取り消すことができる）
　　　　　　　[ESC]

###カーソル下の文字を削除
　　　　　　　ノーマルモード [ESc] 　x

###カーソルの位置に文字を挿入
　　　　　　  i

###行末に文字を挿入
　　　　　　　A

###カーソルの位置から単語の末尾までを削除する
　　　　　　　dw

###カーソル位置から行の末尾までを削除する
　　　　　　　d$

###単語２つを削除する
　　　　　　　d2w

###行全体を削除する
　　　　　　　dd

###2行を削除する
　　　　　　　2dd

###単語２つ分カーソル移動
　　　　　　　2w

###３つ目の単語の終端にカーソルを移動
　　　　　　　3e

###行頭にカーソルを移動
　　　　　　　0

###前回の動作を取り消す
　　　　　　　u(小文字)

###行全体の変更を取り消す
　　　　　　　U(大文字)

###取り消しの取り消し
　　　　　　　CTRL-R

###最後に削除された行をカーソルの後に貼り付ける
　　　　　　　p

###カーソルの次の文字を置き換える
　　　　　　　r (ただし、アルファベットのみ)

###カーソルの位置から単語の終わりまでを変更
　　　　　　　cw (変更だけでなく挿入も行える)

###カーソルの位置から行の終わりまでを変更
　　　　　　　c$

###ファイル内での位置とファイルの詳細を表示
　　　　　　　CTRL-G

###ファイルの最下行に移動
　　　　　　　G

###(数値)行に移動
　　　　　　　数値 G

###先頭行に移動
　　　　　　　gg

###前方に語句を検索
　　　　　　　/

###後方に語句を検索
　　　　　　　?

###検索後の次の検索
　　　　　　　n

###検索後の逆方向の検索
　　　　　　　N

###検索のハイライトを消す
　　　　　　　:noh

###(,),[,],{,}などの括弧上にカーソルを置いて対となる文字へ移動
　　　　　　　%

###現在の行の最初の　old　を　new　に置換する。
　　　　　　　:s/old/new

###現在の行のすべて　old を　new　に置換する。
　　　　　　　:s/old/new/g

###2つの#間で語句を置換する(#には置き換える範囲の開始と終了の行番号を指定する)
　　　　　　　:#,#s/old/new/g

###ファイル全体で見つかるものに対して変更する
　　　　　　　:%s/old/new/g

###'c'を加えると置換の度に確認を求める
　　　　　　　:%s/old/new/gc

###ディレクトリ内の一覧を見る
　　　　　　　:!ls

###ファイルを削除
　　　　　　　:!rm [ファイル名]

###ファイルへ変更を保存
　　　　　　　:w [ファイル名]

###ビジュアルモード(範囲指定ができる)
　　　　　　　v

###選択した行を削除
　　　　　　　v → d

##'ファイル名'のテキストを挿入
　　　　　　　:r ファイル名

###カーソルの下の行が開き、挿入モードになる
　　　　　　　o(小文字だと、カーソルの下の行が挿入モード)
　　　　　　　O(大文字だと、カーソルの上の行で挿入モード)

###カーソルの次の位置からテキストを追加
　　　　　　　a

###単語の末ごとに移動
　　　　　　　e
(”a”と”i”は同じ挿入モードだが、文字が挿入される位置が異なる)

###テキストのコピー
　　　　　　　y

###テキストの貼り付け
　　　　　　　p

###置換モード
　　　　　　　R

###オプションの設定
　　　　　　　:set xxx (xxxが設定される)

###検索時に大文字小文字の区別をしない
　　　　　　　:set ic

###検索フレーズに部分マッチしている部分を表示する
　　　　　　　:set is

###マッチするすべてを強調表示する
　　　　　　　:set hls

###オプション無効
　　　　　　　:set noic

###コマンドラインを補完
　　　　　　　CTRL-D

###補完を使用
　　　　　　　[TAB]
xmlで取得するwebapiをjsonpに置換する

GitHub
https://github.com/yoh-nak/xml2jsonp

## 使い方

XMLで受け取るwebapiをjsonpに置換することでクロスオリジンポリシーを解消することができる仕組みです。

以下のようにアクセスして、URLクエリに指定したコールバック関数名とWeb APIを使ったjsonpを出力することができます。

```
http://ドメイン:3000/?callback=コールバック関数名&api=APIのURL
```

### ! 注意

APIに指定するURLは下記のサイト

http://www.tagindex.com/tool/url.html

などをつかってUTF-8でURLエンコードしたものを使用してください。

たとえば下記のAPIのURLをURLエンコードすると

```
http://wikipedia.simpleapi.net/api?keyword=HTTP&output=xml
```

以下のようになります。

```
http%3a%2f%2fwikipedia%2esimpleapi%2enet%2fapi%3fkeyword%3dHTTP%26output%3dxml
```



## インストール

### Express

```
$ npm install -g express
```


```
$ express xml2jsonp
$ cd xml2jsonp
$ npm install
```

### 依存パッケージ

```
$ npm install xmljson --save
```

## ソースコード

```json:package.json
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "3.4.8",
    "jade": "*",
    "stylus": "*",
    "xmljson": "^0.2.0"
  }
}
```

```js:app.js

/**
 * Module dependencies.
 */

var express = require('express');
var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(app.router);
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});
```

```js:routes/index.js

/*
 * GET home page.
 */

exports.index = function(req, res){

    var xml2jsonp = require('../libs/xml2jsonp');
    xml2jsonp.convert(req, res);

};
```

```js:libs/xml2jsonp.js

var http = require('http');
var xmljson = require('xmljson');

exports.convert = function(req, res){

    var testUrl = 'http://wikipedia.simpleapi.net/api?keyword=HTTP&output=xml';

    var api = decodeURIComponent(req.query.api) ? decodeURIComponent(req.query.api) : testUrl;
    var callback = req.query.callback ? req.query.callback : 'callback';

    var xml = '';

    http.get(api, function(response) {

        response.setEncoding('utf8');
        response.on('data', function(str) {
            xml += str;

            xmljson.to_json(xml, function (error, data) {

                var jsonp = callback + '(' + JSON.stringify(data) + ')';
                
                res.header('Content-Type', 'text/javascript; charset=UTF-8');
                res.send(jsonp);

            });
        });
    }).on('error', function(e){
        console.log(e.message);
    });
}
```
Vim Tutorial まとめ（akiinu）

※参考：http://uguisu.skr.jp/Windows/vi.html

#動作

## **Vimの起動と終了**

* :e ファイル名：ファイルを開く 
* ESCキー：ノーマルモード
* :wq：保存して終了
* :w：保存
* :q!：保存しないで終了
* :w ファイル名：名前をつけて保存
* :!dir：ディレクトリの一覧を表示

## **移動**

* h→左
* j→下
* k→上
* l→右
* 0→行頭
* 数字w→？個前の単語に移動
* 数字e→？個目の単語の末尾に移動

## **ファイル内での移動**

* 数字G：？行目に移動
* gg：ファイルの最初に移動
* G：ファイルの最後に移動

## **オプション**

* :set オプション名：オプションの設定
* :q：閉じる

## **ヘルプ**

* :help：ヘルプの表示

## **Vimの設定**

* _vimrc（win向け）を設定

## **コマンドの呼び出し**

* コマンドの頭文字-Ctrl-D：コマンドの呼び出し

#テキスト

## **戻す**

* u：最後のコマンドを戻す
* U：行全体の変更を戻す
* Ctrl-R：戻したものを戻す

## **テキストの挿入**

* i：カーソルの左から入力開始
* I：行頭から入力開始
* a：カーソルの右から入力開始
* A：行末から入力開始
* o：下の行から入力開始
* O：上の行から入力開始

## **テキストの削除**

* x：削除
* dw：単語の末尾まで削除
* d$：行末まで削除
* dd：行全体を削除
* d数字w：？個の単語を削除
* 数字dd：？行を削除

## **テキストの貼り付け**

* y：コピー
* p：貼り付け

## **テキストの検索**

* /<文字列>：文字列を検索する（順方向）
* ?<文字列>：文字列を検索する（逆方向）
* n：順方向へ検索する 
* N：逆方向へ検索する 
* %：(,[に対して対応する),]や}を検索 
* Ctrl-O：元の場所に戻る

## **テキストの削除と挿入**

* cw：単語の末尾までを削除し挿入
* c$：行末までを削除し挿入

## **テキストの置換**

* :s/A/B：現在行の最初のAをBに置換する 
* :s/A/B/g：現在行の全てのAをBに置換する
* :#,#s/A/B/g：？行から？行までのすべてのAをBに置換する
* :%S/A/B/g：ファイルの中の全ての検索語句を置換する
* :%s/A/B/gc：cを加えると置換の度に確認を求める
* r：カーソルの下の文字を置換
* R：単語の末尾までを置換

## **テキストの選択・保存・取込**

* v：テキストの選択
* v-:w ファイル名：選択範囲に名前を付けて保存
* :r ファイル名：ファイルの中身の取込
TortoiseGitのちょっとした使い方

要件
---
* コマンドを打つことなく、GitHubを扱う
* pullだけしたい(ローカルリポジトリのコミットをpushしない)
 * GitHub for Windowsの「sync」 はpull + pushを行うのでｘ
* 画像で視覚的にステータスが判断できる
 * git status, log等のコマンドは使わない

TortoiseGitを使ってみる
----

# 本体インストール

https://code.google.com/p/tortoisegit/wiki/Download

* version:1.8.8.0

# Language Packsダウンロード

https://code.google.com/p/tortoisegit/wiki/Download?tm=2

ページ中部のJapaneseを選択
※本体をインストールした後じゃないとインストールできない

# TortoiseGit設定

* インストールされたら右クリックでメニューが表示される

* TortoiseGit → settings
 * settingsが開かれるので、General選択
 * Language → 日本語 選択
 * OK

# pull

* 既にGitHubからcloneしてきたローカルリポジトリへ
* 右クリック → TortoiseGit → プル(ローカルへ反映)
* プルのウィンドウが開かれるので、リモートが「orgin」になっていることを確認
 * オプションはデフォルトのまま
* GitHubのユーザ名入力
* GitHubのパスワード入力

# 色々な設定

* コンテキストメニュー
 * 右クリック一発で表示するメニューを選択できる
  * 「同期」を外して、「プル」を設定

* 代替エディタ
 * デフォルトはノートパッドなので、自分のエディタに変更

* 差分ビューアー
    * 使い慣れているWinMergeに変更
Webサイトの作り方概要・バナーの作り方（akiinu）

#Webサイトの作り方概要

1．ワイヤーフレームを作成（PowerPoint）
2．全画面のデザインを作成（Photoshop）
3．スライス（Photoshop）
4．コーディング（Dreamweaver）

## Webサイトの中身

HTML＋画像＋Java＋Css　等

## HTMLの構成
```lang:Sample
<html>
<head>
 ～
</head>

<body>
  <p>テキスト</p>
  <img src="画像アドレス" />
  <a href="リンクアドレス">リンク名</a>
</body>

<footer>
 ～
</footer>
</html>

```

## スライス

* 全画面のデザインをしたものから画像ファイルを作ること（Photoshop）。
* 必要な部分が全て入るように切り取る。
* 「Web用に保存」 → Shiftキーで複数選択 → 拡張子を指定して保存
* デザイン時に画像部分・テキスト部分・タグ部分を考えてデザインすること。


#バナーの作り方

決められたサイズで伝えたい情報を伝えるにはどうするかを考えること

> 使用したもの
・http://pixlr.com/editor/
・お手本のデザイン
・桜の写真
・桜のアイコン画像

## Ⅰ　お手本のデザインを見て作る
1．新規レイヤー作成、描画ツールで帯を作成
2．新規レイヤー作成、描画ツールで円を作成
3．新規レイヤー作成、描画ツールでラインを作成
4．タイプツールでキャッチコピー・文章を作成
5．桜のアイコン画像を配置

## Ⅱ　お手本と少し違ったデザインを作る
1．フォントの変更
2．レイヤースタイルの追加
・ドロップシャドウ（桜）
・内側のシャドウ（桜）
・アウターグロー（円）
・インナーグロー（円）
3．帯にフィルター
・ハーフトーン

## Ⅲ　自由なデザインを作る
1．写真の位置を上部に
2．描画ツールで帯作成
3．フォント
4．アイコンの配置
5．写真にフィルター
・チルトシフト

## 改善点
バナーなので、クリックしたくなるような工夫をする。
→効果的なデザイン例を集めて参考にする。
Webサイトの作り方概要・バナーの作り方

#Webサイトの作り方概要

1．ワイヤーフレームを作成（PowerPoint）
2．全画面のデザインを作成（Photoshop）
3．スライス（Photoshop）
4．コーディング（Dreamweaver）

## Webサイトの中身

HTML＋画像＋Java＋Css　等

## HTMLの構成
```lang:Sample
<html>
<head>
 ～
</head>

<body>
  <p>テキスト</p>
  <img src="画像アドレス" />
  <a href="リンクアドレス">リンク名</a>
</body>

<footer>
 ～
</footer>
</html>

```

## スライス

* 全画面のデザインをしたものから画像ファイルを作ること（Photoshop）。
* 必要な部分が全て入るように切り取る。
* 「Web用に保存」 → Shiftキーで複数選択 → 拡張子を指定して保存
* デザイン時に画像部分・テキスト部分・タグ部分を考えてデザインすること。


#バナーの作り方

決められたサイズで伝えたい情報を伝えるにはどうするかを考えること

> 使用したもの
・http://pixlr.com/editor/
・お手本のデザイン
・桜の写真
・桜のアイコン画像

## Ⅰ　お手本のデザインを見て作る
1．新規レイヤー作成、描画ツールで帯を作成
2．新規レイヤー作成、描画ツールで円を作成
3．新規レイヤー作成、描画ツールでラインを作成
4．タイプツールでキャッチコピー・文章を作成
5．桜のアイコン画像を配置

## Ⅱ　お手本と少し違ったデザインを作る
1．フォントの変更
2．レイヤースタイルの追加
・ドロップシャドウ（桜）
・内側のシャドウ（桜）
・アウターグロー（円）
・インナーグロー（円）
3．帯にフィルター
・ハーフトーン

## Ⅲ　自由なデザインを作る
1．写真の位置を上部に
2．描画ツールで帯作成
3．フォント
4．アイコンの配置
5．写真にフィルター
・チルトシフト

## 改善点
バナーなので、クリックしたくなるような工夫をする。
→効果的なデザイン例を集めて参考にする。
cocos2d 描画領域に View を重ねる（3.0 rc1）

cocos2d-x 3.0 の rc0 では、広告ADを表示するときなど、cocos2d で描画している領域に Android の View を重ねる場合は popupWindow を使う必要がありました。（以下参照）
[cocos2d-x 3.0beta2(Android)で広告ADを導入してみる(NativeActivityでJava用パーツを使う)。AdStir編](http://obakesan.net/e/13)

ですが、cocos2d-x 3.0 の rc1 は、popupWindowを使わずとも addContentView で重ねることが可能になっています。

rc0 では org.cocos2dx.lib.Cocos2dxActivity が NativeActivity を extends していましたが、rc1 では 2系と同様、Activity を extends するように戻されたためです。
バナー制作メモ

#バナーの制作メモ
決められたサイズの中で、端的に伝える。

#環境
Photo editor online を使用。

#以下、メモ
・ファイルタグ→画像を開く→画像を選択

・新しいレイアをクリック→レイアを新しく作成、レイアの名前を変更。

・描画ツール→長方形、角丸長方形、円、直線を引ける

.移動ツール→指定したレイアのオブジェクトを移動させることができる。

・色の変更→ポインタを指定したい色に合わせる。また、スポイトマークを出現させるとスポイトマークを合わせた場所の色を吸い取ることができる。

・タイプツール→文字を入力できる。色、大きさ、フォントの変更など

・編集タグ→自由変形→作成したオブジェクトの大きさや形などを変更できる。

・レイヤー→層、階層。各層にあるオブジェクト毎に効果を加えたりすることができる。画像の加工・編集を容易にする。

・レイヤースタイル→オブジェクトや文字などにエフェクトを付加させる。
　　ドロップシャドウ→文字に影をつける。
　　内側のシャドウ→凹んでいるように見せることができる。
　　ベベル→ボタンのように見せることができる。
　　アウターグロー→オブジェクトより少し濃い色を指定すると、オブジェクトがぼやけたような雰囲気を作れる。
　　インナーグロー→オブジェクトより少し濃い色を指定すると、オブジェクトに立体感を演出できる。
Eclipseでターミナルでコピペしたパスからファイルを開く


ターミナルのtigなどからソースのパスをコピペしてEclipseから開くための方法

`Shift + Command + R` で出てくる `Open Resource` メニューから貼り付ければOK

相対パスの位置がズレている可能性もあるので、
ツリービューのプロジェクトのトップフォルダをクリックしてから行うと確実です。

### 参考
[In Eclipse, is there a way to open a file by typing its path and name? - Stack Overflow](http://stackoverflow.com/questions/3453438/in-eclipse-is-there-a-way-to-open-a-file-by-typing-its-path-and-name)
macにaws-cliをインストール

HomeBrewインストール済みなのを前提とする

~~~
brew install python --framework
python -V
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py
easy_install pip
pip install awscli
pip install awscli --upgrade
mkdir ~/.aws
vi ~/.aws/config
echo 'export AWS_CONFIG_FILE=~/.aws/config' >> ~/.bash_profile
source ~/.bash_profile
~~~

~/.aws/config

~~~
[default]
aws_access_key_id=(ACCESS_KEY_ID)
aws_secret_access_key=(SECRET_ACCESS_KEY)
region=ap-northeast-1
~~~
Heartbleedバグのコードを解説


今回バグってたのはheartbeat extension という機能の実装。

RFCはこちら
https://tools.ietf.org/html/rfc6520

Heartbleedバグに対する修正コミット
http://git.openssl.org/gitweb/?p=openssl.git;a=commit;h=96db9023b881d7cd9f379b0c154650d6c108e9a3

# バグ解説

``` :rfc6520

4.  Heartbeat Request and Response Messages

   The Heartbeat protocol messages consist of their type and an
   arbitrary payload and padding.

   struct {
      HeartbeatMessageType type;
      uint16 payload_length;
      opaque payload[HeartbeatMessage.payload_length];
      opaque padding[padding_length];
   } HeartbeatMessage;
```

Request,Response共にこのHeartbeatMessageを送る。

```:rfc6520
   When a HeartbeatRequest message is received and sending a
   HeartbeatResponse is not prohibited as described elsewhere in this
   document, the receiver MUST send a corresponding HeartbeatResponse
   message carrying an exact copy of the payload of the received
   HeartbeatRequest.
```

とあるので、HeartbeatResponseを返す側は送られてきたHeartbeatRequestのペイロードをコピーして返す必要がある。

今回問題となったコードはこのペイロードコピー部分。

```c:t1_lib.c
2591         /* Read type and payload length first */
2592         hbtype = *p++;
2593         n2s(p, payload);
2594         pl = p;
(中略)
2616                 memcpy(bp, pl, payload);
```

HeartbeatRequestからペイロード長(コードではpayload)を取得して、HeartbeatResponseにペイロードをコピーするためにmemcpyしているが、ペイロード長について境界チェックを行っていないため、HeartbeatRequestに記載されたペイロード長が実際のペイロード長よりも長い場合 **隣接するメモリの内容までmemcpy** してHeartbeatResponseとして送り返してしまう。

そのため攻撃者は意図的に長いペイロード長を指定することで、１回のHeartbeatにつきメモリの内容を最大約64KB覗き見ることが可能。

# 修正

```:rfc6520
   If the payload_length of a received HeartbeatMessage is too large,
   the received HeartbeatMessage MUST be discarded silently.
````

ペイロード長が長すぎる場合は破棄とあり、そのように修正されている。

```c:t1_lib.c
2596         /* Read type and payload length first */
2597         if (1 + 2 + 16 > s->s3->rrec.length)
2598                 return 0; /* silently discard */
2599         hbtype = *p++;
2600         n2s(p, payload);
2601         if (1 + 2 + payload + 16 > s->s3->rrec.length)
2602                 return 0; /* silently discard per RFC 6520 sec. 4 */
2603         pl = p;
```
mouseover イベントと mouseenter イベント

## mouseover イベントと mouseenter イベント

Sencha Ext JS で、
マウスカーソルのイベントを捕まえて、エレメントに CSS クラスを適用するなどの処理をしたいことがあります。
そんな時に、 `mouseover` イベントをリッスンしたくなります。
しかし、 `mouseover` イベントはカーソルがエレメントに乗ったときだけでなく、
ネストしたエレメントの上に乗ったときにも発火します。
最初にエレメントに乗ったときだけ発火すれば良いのにとうざく感じるかも知れません。

この場合には、 `mouseenter` イベントを代わりに使います。
これですと対象のエレメントに最初に乗っかったときだけイベントが発火します。

* [この記事の元ネタ](http://goo.gl/HBXT6T)
* [Sencha Fiddle で実験](https://fiddle.sencha.com/#fiddle/43q)