OmniAICreator/Qiita-1.07M huggingface dataset:
cookiecutterを使ってみる


# 概要

https://github.com/audreyr/cookiecutter

Pythonプロジェクトの雛形を作成するツール
DjangoとBootstrapを使ったプロジェクトのテンプレートを用意しておいて、コマンドラインからプロジェクトを生成するといった感じで使用する
テンプレートはGitHubなどで公開されているものがある

※pipはパーミッションの問題が出る場合もあるので、その場合は前にsudoをつけて実行

# インストール

#### pipでインストールする

```
pip install cookiecutter
```

#### テンプレートを指定してプロジェクトを生成

```
cookiecutter https://github.com/audreyr/cookiecutter-pypackage.git
```
テンプレートの指定は、大体その説明にやり方が書いてあるようなので従う。
プロジェクト作成時に、プロジェクト名とかメールアドレスなどの情報が聞かれるので、答えるとプロジェクト内に反映される。
この時に、リポジトリのクローンが、~/.cookiecuttersに作られるようだ。多分キャッシュ。

### テンプレートの探し方

- GitHubでcookiecutterで検索する
- Djangoならこんなのも　https://www.djangopackages.com/grids/g/cookiecutter/

# 動かしてみる

https://github.com/pydanny/cookiecutter-django
全部入りみたいなタイプ
DBがPostgreSQLなので、MySQLに変更して使う
ドキュメントが結構しっかり書かれてる

## プロジェクトの生成

```
cd ~/dev
cookiecutter https://github.com/pydanny/cookiecutter-django.git
```

今回は「ホームディレクトリ/dev」にプロジェクトを作成することにする
質問は適当にやってもさほど問題ない。今回はmyasspとしておく
プロジェクト名のところだけ、ちょっと注意

## プロジェクトに必要なライブラリをインストール

使用するDBはPostgreSQLなので設定を一部書きかえる。
~/dev/myapps/requirements/base.txt
このファイルを編集。

psycopg2==2.5.3
この行を
MySQL-python == 1.2.5
に変更する

```
cd ~/dev/myapps 
pip install -r requirements/local.txt
```

必要なライブラリ類をまとめたテキストファイルを用意してくれているので、それを使ってインストール
このテンプレートではテスト環境、プロダクション環境などでライブラリをそれぞれ分けれるようになっている

requirementsに
test.txt
production.txt
local.txt
base.txt
がある

base.txtが全体共通ライブラリ、あとはテスト/プロダクション/ローカルで分けてある

この際、素のままでやったらPostgreSQL関連のライブラリでエラーがでた
インストールしていないせいかもしれない

## アプリケーションの設定

DBを変更する
config/settings.py
DATABASES = values.DatabaseURLValue('postgres://localhost/myapps')
これをMySQLを使ったものに変更しておく

## 起動する

#### syncdb
```
python manage.py syncdb
```

通常のsyncdbを行う
ただし、southで管理しているモデルがあるようで、これだけでは完了しない

```
python manage.py migrate
```
これで初期設定は通るようだ

#### サーバを起動する

```
python manage.py runserver
```

#### アクセスする
http://127.0.0.1:8000/

# 自分のテンプレートを作る

実際作るところまではやらなかったけど、誰かのテンプレートをforkして作るってのがお手軽な感じ
いじるのもシンプルなのならそれほど難しくなさげなので、よくプロジェクトを作る人には良さそう

# まとめ

- 会社などで、標準テンプレートなどを決めて運用する場合には良さそう
- 作りこまれたテンプレートは実装の参考にはなるけど、使うとなるとまず理解するのがめんどくさいことも
- たまにしか作らないならいらないかも(作る手間と定期的なメンテナンスが必要なため)
ファイル/ディレクトリ混じりのディレクトリで、ディレクトリだけls -l


大規模なプロジェクトのソースツリーをはじめ、個人PCの作業ディレクトリまで、最初は綺麗に分類/整理をしておこうと思っていても、気がつけばファイルとディレクトリがごちゃまぜになってしまいがち…

ちょっとした整理をしたいときに、ディレクトリだけ何があるのか把握したいときなどにちょっと迷ったので。

```bash:サンプル構成
$ ls -lF
total 0
drwxr-xr-x  11 ks  staff  374  6  7 14:24 1/
-rw-r--r--   1 ks  staff    0  6  7 14:22 2
-rw-r--r--   1 ks  staff    0  6  7 14:22 3
drwxr-xr-x  11 ks  staff  374  6  7 14:24 4/
-rw-r--r--   1 ks  staff    0  6  7 14:22 5
drwxr-xr-x  11 ks  staff  374  6  7 14:24 6/
-rw-r--r--   1 ks  staff    0  6  7 14:22 7
drwxr-xr-x  11 ks  staff  374  6  7 14:24 8/
drwxr-xr-x   2 ks  staff   68  6  7 14:22 9/
```

こんな感じのディレクトリ構成を前提に。

## lsで表示してからgrepで抽出

まずは単純に、`ls -l`の結果を`grep`でフィルタする方法

```bash:lsからgrep
$ls -l | grep '^d'
drwxr-xr-x  11 ks  staff  374  6  7 14:24 1
drwxr-xr-x  11 ks  staff  374  6  7 14:24 4
drwxr-xr-x  11 ks  staff  374  6  7 14:24 6
drwxr-xr-x  11 ks  staff  374  6  7 14:24 8
drwxr-xr-x   2 ks  staff   68  6  7 14:22 9
```

思考の流れ的にも綺麗でシンプルだと思うのですが、何となく先頭dの"文字"で引っかけるのが、余り論理的じゃ無い気がする。

なので、もう少し上手い方法が無いか考えてみます。


## findで検索してからls

先に`find`でディレクトリを検索してから`ls -l`してみます

```bash:findからls
$ find . -type d -depth 1 | xargs ls -ld
drwxr-xr-x  11 ks  staff  374  6  7 14:24 ./1
drwxr-xr-x  11 ks  staff  374  6  7 14:24 ./4
drwxr-xr-x  11 ks  staff  374  6  7 14:24 ./6
drwxr-xr-x  11 ks  staff  374  6  7 14:24 ./8
drwxr-xr-x   2 ks  staff   68  6  7 14:22 ./9
```

得られる結果はほぼほぼ同じですが、"./"が付くのが気に入らない…。

```bash:findからbasenameしてls
$ find $(pwd) -type d -depth 1 | xargs basename | xargs ls -ld
drwxr-xr-x  11 ks  staff  374  6  7 14:24 1
drwxr-xr-x  11 ks  staff  374  6  7 14:24 4
drwxr-xr-x  11 ks  staff  374  6  7 14:24 6
drwxr-xr-x  11 ks  staff  374  6  7 14:24 8
drwxr-xr-x   2 ks  staff   68  6  7 14:22 9
```

先ほどの"lsで表示してからgrepで抽出"と同様の出力が得られました。

&nbsp;

と、自己満足できたところで…

実際に使うのは"lsで表示してからgrepで抽出"なのだろうなぁ(^_^;)
CoffeeScript で namespace

簡易名前空間。

```coffeescript
# how to use
ns.namespace "foo.bar.buz", (_export) ->
  class SomeClass
    constructor: (@_name) ->
    getName: () -> @_name
  _export SomeClass

ns.namespace "other.name.space", (_export) ->
  SomeClass = ns.use "foo.bar.buz.SomeClass"
  obj = new SomeClass "myName"
  console.log obj.getName() # myName
```

実装

```coffeescript
# namespace.coffee
class NameSpace
  _root = {}

  _doUse = (root, nodes) ->
    space = root
    for node in nodes
      space = space[node] ?= {}
    space

  use: (ns) ->
    if ns is ""
      return _root
    _doUse _root, ns.split('.')

  namespace: (ns, fn) ->
    root = this.use ns
    _export = (obj, name) ->
      nodes = []
      leaf = obj.name
      if name?
        [nodes..., leaf] = name.split('.')
      space = _doUse root, nodes
      space[leaf] = obj
    fn _export
    null

@ns = new NameSpace
```
Heroku + PHP から Heroku Postgres に接続する


Heroku 環境で、PHP から、Heroku Postgres（PostgreSQL）に接続します。

## Heroku Postgres アドオンを追加

Heroku Postgres アドオンを利用します。（無料プラン（Hobby Dev）あり: 接続数上限=20 / レコード数上限=10,000 / メモリキャッシュなし）

[https://addons.heroku.com/heroku-postgresql](https://addons.heroku.com/heroku-postgresql)
[https://devcenter.heroku.com/articles/heroku-postgres-plans](https://devcenter.heroku.com/articles/heroku-postgres-plans)

```bash
$ heroku addons:create heroku-postgresql
```
（heroku addons:add は deprecated になった（コメント参照）ので、addons:create に変更）


## 環境変数から接続情報を取得

Heroku Postgres アドオンを追加すると、PostgreSQL への接続情報が環境変数`DATABASE_URL`にセットされます。

`DATABASE_URL`の内容は下記のような URL の形式になっています。

```
DATABASE_URL=postgres://xxxxx:yyyyyy@ec2-nnn-nnn-nnn-nnn.compute-1.amazonaws.com:5432/XXXXXXX
```

これを PHP の`parse_url()`でパースします。

```php
<?php
$url = parse_url(getenv('DATABASE_URL'));
```

スクリプトを実行すると、`$url`の各要素には下記のようになります。

* $url['host'] = 接続ホスト名
* substr($url['path'], 1) = 接続データベース名
* $url['user'] = 接続ユーザ名
* $url['pass'] = 接続パスワード

この内容を接続情報として利用します。

## PDO で接続する

PDO で Heroku Postgres に接続して、サーババージョンを出力しています。

```php
<?php
$url = parse_url(getenv('DATABASE_URL'));

$dsn = sprintf('pgsql:host=%s;dbname=%s', $url['host'], substr($url['path'], 1));

$pdo = new PDO($dsn, $url['user'], $url['pass']);
var_dump($pdo->getAttribute(PDO::ATTR_SERVER_VERSION));
```

実行結果

```
$ php pdo_with_heroku_postgres.php
string(5) "9.3.3"
```

## Laravel で接続する

`database.php`に接続情報をセットしています。

```php
<?php

$url = parse_url(getenv('DATABASE_URL'));

return [
    'default' => 'pgsql',

    'connections' => [
        'pgsql' => [
            'driver' => 'pgsql',
            'host' => $url['host'],
            'database' =>  substr($url['path'], 1),
            'username' => $url['user'],
            'password' => $url['pass'],
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
        ],
    ],
];
```
`ask-for' マクロ : Restart を介した引数渡し



**macro** *ask-for* (thing default &key in)

**macro** *in-reply-to* ((thing &key in)*) &body body

``` cl
;; this is a basic usage of `ask-for'.
(defun fn1 (&optional (arg (ask-for arg 1 :in fn1)))
  (print arg))
(defun fn2 ()
  (loop for i from 0 to 10 do (fn1)))
(defun fn3 ()
  (let ((lst (list :a :b :c)))
    (setf (cdddr lst) lst)
    (handler-bind ((ask-value
                    (lambda (c)
                      (when (and (eq 'arg (asked-name c))
                                 (eq 'fn1 (asked-by c)))
                        (use-value (pop lst) c)))))
      (fn2))))


;; Using `ask-for' is better than using a special variable.
;; See the following example,
;; the generator and iterator of *queue* is in the different position
(defvar *queue*)
(defun fn-special1 ()
  (print (pop *queue*)))
(defun fn-special2 ()
  (loop for i from 0 to 10 do (fn-special1)))
(defun fn-special3 ()
  (let ((*queue* (list :a :b :c)))
    (setf (cdddr *queue*) *queue*)
    (fn-special2)))


;; how about implementing with thunk and continuation?
(defvar *cont*)
(defun fn-cont1 ()
  (print (funcall *cont*)))
(defun fn-cont2 ()
  ;; In this case, someone may change the definition of `*cont*'.
  ;; This is unsafe in terms of debuggability.
  ;; The effect continues until the let binding is
  ;; unwound. Actually, the behavior of fn-cont2-2 is affected by 
  ;; fn-cont2 here.  During the debugging, the timing of unwinding
  ;; should be carefully considered.
  (setf *cont* (lambda () 1))
  (loop for i from 0 to 10 do (fn-cont1)))
(defun fn-cont2-2 ()
  (loop for i from 0 to 3 do (fn-cont1)))
(defun fn-cont3 ()
  (let ((queue (list :a :b :c))
        (*cont* (lambda () (pop queue))))
    (setf (cdddr *queue*) *queue*)
    (fn-cont2-2)
    (fn-cont2)
    (fn-cont2-2)))

;; by using restarts, we can restrict the communication stream between
;; upper and lower stack. Restart bindings are safe because
;; they cannot be modified -- it can only be wrapped around.

;; Finally, this is an exteded usage with a macro `in-reply-to'.

(defun fn3-in-reply-to ()
  (let ((lst (list :a :b :c)))
    (setf (cdddr lst) lst)
    (in-reply-to
        (((arg :in fn1) (pop lst))
         ((arg2 :in fn1) 1)
         (arg2 (pop lst)))
      (fn2))))
```

This utility is a part of guicho-utilities, available at https://github.com/guicho271828/guicho-utilities .
Heroku + PHP + SendGrid でメールを送信する


Heroku 環境で、SendGrid アドオンを使って、PHP からメールを送信します。

## SendGrid アドオンを追加

メール送信には、SendGrid アドオンを利用します。（無料プランあり: 200通/日制限）

[https://addons.heroku.com/sendgrid](https://addons.heroku.com/sendgrid)


```bash
$ heroku addons:add sendgrid
```

## Sendgrid-php を追加

PHP から SendGrid を利用するライブラリとして、Sendgrid-php を利用します。

[https://github.com/sendgrid/sendgrid-php](https://github.com/sendgrid/sendgrid-php)

`composer.json`の`require`に、以下を追加します。

```json
    "require": {
      "sendgrid/sendgrid": "2.0.5"
    }
```

`composer install` or `composer update`すると、Sendgrid-php が利用できます。

## PHPからメール送信

Sendgrid-php を利用して、PHP コードからメールを送信します。

まず、autoloader を読み込みます。

次に SendGrid の認証情報を`SendGrid`クラスのコンストラクタで指定します。認証情報は、以下の環境変数でセットされるので、これを`getenv()`で取得してセットしています。

* SENDGRID_USERNAME = 接続ユーザ名
* SENDGRID_PASSWORD = 接続パスワード

あとは、送信するメールの情報を各メソッドで指定して、最後に`send()`メソッドで送信するだけです。もちろん日本語も OK です。

```php
<?php
require __DIR__ . '/../vendor/autoload.php'; // path to vendor/

$sendgrid = new SendGrid(getenv('SENDGRID_USERNAME'), getenv('SENDGRID_PASSWORD'));
$email = new SendGrid\Email();
$email->addTo('to@exmaple.com')->
    setFrom('from@example.com')->
    setSubject('件名')->
    setText('こんにちは！');

$sendgrid->send($email);

```
'GetUserStoreForDomain' の定義がありません

# 事象
- Windows 7 Home Premium SP1
- Microsoft Visual Studio Express 2013 for Web
- Silverlightアプリケーション

```csharp
IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForDomain();
```

isolated storageを試してみようと思ったら次のエラー

>'System.IO.IsolatedStorage.IsolatedStorageFile' に 'GetUserStoreForDomain' の定義がありません．

どういうこと？


# 検証
IsolatedStorageFileクラスの中身を見たが，そこにGetUserStoreForDomainメソッドは無かった．

## .NET Frameworkのバージョンの違い―ではない
[公式](http://msdn.microsoft.com/ja-jp/library/system.io.isolatedstorage.isolatedstoragefile.getuserstorefordomain(v=vs.110).aspx)のドキュメントによればサポート対象は

- .NET Framework
  - サポート対象 : 4.5、4、3.5、3.0、2.0、1.1、1.0
- .NET Framework Client Profile
  - サポート対象 : 4、3.5 SP1

バージョンの違いだろうか，と思って[こちらのサイト](http://www.atmarkit.co.jp/ait/articles/1210/26/news086.html)でインストールされている方法で.NET Frameworkのバージョンを確認したが，
>.NET Framework 2.0 Service Pack 2 がインストール済みです
  日本語Language Pack（Service Pack 2）がインストール済みです
.NET Framework 3.0 Service Pack 2 がインストール済みです
　日本語Language Pack（Service Pack 2）がインストール済みです
.NET Framework 3.5 Service Pack 1 がインストール済みです
　日本語Language Pack（Service Pack 1）がインストール済みです
.NET Framework 4.5 がインストール済みです
　日本語Language Packがインストール済みです

と表示され，どうやら違う．

## mscorlib.dllが古い？

Visual StudioでIsolatedStorageFileの宣言を参照すると1行目に

- mscorlib.dll v5.0.5.0

と書かれていたが，このバージョンには含まれていないのだろうか？

# 解決
コントロールパネル＞プログラム＞プログラムと機能
からMicrosoft .NET Framework 4.5.1を修復することで

IsolatedStorageFileクラスにGetUserStoreForDomainメソッドが定義された．

ただし，mscorlib.dllのバージョンは4.0.0.0になった．


とりあえず動くようになったので一応解決．
しかし，どういうこと？




## 似たような問題（解決法は異なる）
- [my IsolatedStorageFile class does not contain a definition for CreateFile](http://social.msdn.microsoft.com/Forums/en-US/f8412e46-8ec4-4255-a5e3-7304555561f8/my-isolatedstoragefile-class-does-not-contain-a-definition-for-createfile?forum=netfxbcl)
Guard で spec ファイル変更時のテストが落ちる


ファイルの変更を検知して、該当する spec のみを自動でテストしてくれる便利な Guard ですが、spec ファイル更新時の自動テストがこける問題にぶちあたりました。

get メソッドがない〜なんて言われていますね。

```
11:53:09 - INFO - Running: spec/requests/system_spec.rb
F

Failures:

  1) System GET /api/system/status status が返却されていること
     Failure/Error: get '/api/system/status', format: :json
     NoMethodError:
       undefined method `get' for #<RSpec::ExampleGroups::System::GETApiSystemStatus:0x007fd779a9b480>
     # ./spec/requests/system_spec.rb:6:in `block (3 levels) in <top (required)>'

Finished in 0.00051 seconds (files took 0.39797 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/requests/system_spec.rb:5 # System GET /api/system/status status が返却されていること
Coverage report generated for RSpec to /Users/issei/repos/*****/coverage. 0.0 / 0.0 LOC (100.0%) covered.

```


# 解決策

いろいろ調べたら、どうやら rails_helper が呼ばれていないらしい。
ってことで <code>spec/spec_helper.rb</code>の configure の上に <code> require </code> を追加。

```
require 'rails_helper'
RSpec.configure do |config|
（中略）
end
```


spec を保存すると...テストが通るようになりました。

```
11:58:50 - INFO - Running: spec
**.

Pending:
  Api::SystemHelper add some examples to (or delete) /Users/issei/repos/*****/spec/helpers/api/system_helper_spec.rb

Finished in 0.02848 seconds (files took 1.64 seconds to load)
3 examples, 0 failures, 2 pending
Coverage report generated for RSpec to /Users/issei/repos/*****/coverage. 17 / 18 LOC (94.44%) covered.
```


より適切な解決策があればぜひ教えていただきたいです。

# Conclution

Add <code>require 'rails_helper'</code> at top of <code>spec_helper.rb</code>, if failed to automatic test in the case of saving file on Guard.
Property の挙動がよくわからないけど、これ仕様なのかよくわからん


よくわからない挙動。

オブジェクトのプロパティの値を見て、挙動を変えたいこんな感じのコード。

```swift
/** swift property atomic test */

class Test {
	var isRunning:Bool?

	init() {
		isRunning = false
	}

	func toggle() -> Bool {
		if isRunning {
			println("Run")
			isRunning = false
		} else {
			println("Stop")
			isRunning = true
		}
		return true
	}
}

var Tes = Test()

println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna true") // wanna true
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna false") // wanna false


```

実行

```shell
$ ./prop
isRunning => false == wanna false
Run
isRunning => false == wanna true
Run
isRunning => false == wanna false
```

期待としては isRunning の値の変化で `Stop` => `Run` となって欲しかったけど、実際は二回とも `Run` => `Run` になっている。

## 推察からした対処コード

おそらく、 `var isRunning:Bool?` としたので値があるかないかだけを見たのじゃないか、と思い下記のコードを実行

```swift
/** swift property atomic test */

class Test {
	var isRunning:Bool!

	init() {
		isRunning = false
	}

	func toggle() -> Bool {
		if isRunning {
			println("Run")
			isRunning = false
		} else {
			println("Stop")
			isRunning = true
		}
		return true
	}
}

var Tes = Test()

println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna true") // wanna true
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna false") // wanna false

```

実行

```shell
$ ./prop
isRunning => false == wanna false
Run
isRunning => false == wanna true
Run
isRunning => false == wanna false
```

期待通り動きませんでした


## 実際に期待通り動いた対処コード

```swift
/** swift property atomic test */

class Test {
	var isRunning:Bool?

	init() {
		isRunning = false
	}

	func toggle() -> Bool {
		if isRunning == true {
			println("Run")
			isRunning = false
		} else {
			println("Stop")
			isRunning = true
		}
		return true
	}
}

var Tes = Test()

println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna true") // wanna true
Tes.toggle()
println("isRunning => \(Tes.isRunning) == wanna false") // wanna false
```

実行

```shell
$ ./prop
isRunning => false == wanna false
Stop
isRunning => true == wanna true
Run
isRunning => false == wanna false
```

ちゃんと比較演算子を指定すれば、 `Stop` => `Run` となった。
Heroku + PHP でセッション情報を memcached に保存する


Heroku 環境で、PHP のセッション情報を memcached に保存するようにします。

## MemCachier アドオンを追加

memcached は、MemCachier アドオンを利用します。（無料プランあり）

[https://addons.heroku.com/memcachier](https://addons.heroku.com/memcachier)

```bash
$ heroku addons:add memcachier
```

## PHP で Memcached 拡張を利用

PHP で、Memcached 拡張のセッションハンドラを使って、セッション情報を memcached に保存するようにします。 

`composer.json`の`require`に、Memcached 拡張を追加します。

```json
    "require": {
      "ext-memcached": "*",
    }

```

## セッションハンドラ設定

PHPで、Memcached拡張のセッションハンドラを利用するように設定します。

MemCachier をアドオンに追加すると、以下の接続情報が環境変数にセットされます。

* MEMCACHIER_SERVERS = memcached ホスト
* MEMCACHIER_USERNAME = 接続ユーザ名
* MEMCACHIER_PASSWORD = 接続パスワード

これらの値を直接`.user.ini`に記述しても良いのですが、環境変数から取得したいので、PHPスクリプト内で`ini_set()`で設定します。

下記では、memcachedへの持続的接続も指定しています。

```php
<?php
ini_set('session.save_handler', 'memcached');
ini_set('session.save_path', 'PERSISTENT=pool ' . getenv('MEMCACHIER_SERVERS'));
ini_set('memcached.sess_binary', 1);
ini_set('memcached.sess_sasl_username', getenv('MEMCACHIER_USERNAME'));
ini_set('memcached.sess_sasl_password', getenv('MEMCACHIER_PASSWORD'));
```

これで設定は完了です。

あとは通常どおり`session_start()`して、`$_SESSION`に値をセットすれば、セッション情報が memcached に保存されます。
Dyno を複数にするなどして、確認してみましたが、それぞれの Dyno でセッション情報が共有できていました。
DartのオプショナルタイプとDart Editorの補完

###はじめに
[Dartで同じオブジェクトに対して様々なメソッド呼び出しやプロパティアクセスをたくさんするときに便利なカスケード演算子](http://qiita.com/zukkun/items/a68153e5ee60d40ea732)での私のコメントが長かったので記事として独立させました。

###実験

```dart
canvas.getContext('2d');
```
のようにスーパークラス型の関数が、実際にはサブクラスのオブジェクトを返すことがあります。
この場合にDart Editorによる補完がどのように働くか実験してみます。

```dart
class A {
  int a;
}

class B extends A {
  int b;
}

A fa(String t){
  if(t == 'A'){
    return new A();
  } else {
    return new B();
  }
}

void main() {
  var b1 = fa('B')..b = 1;        // (1)
  
  B   b2 = fa('B')..b = 2;        // (2)

  var b3 = fa('B') as B..b = 3;   // (3)

  B   b4 = fa('B');
  b4.b = 4;                       // (4)
  
  print('b1.b:${b1.b} b2.b=${b2.b} b3.b=${b3.b} b4.b=${b4.b}');
}
```

```
> b1.b:1 b2.b=2 b3.b=3 b4.b=4
```

###解説
(1)の```fa(’B')..```のところで、メンバ```a```とともに```b```もグレーアウトされた状態で最後の補完候補として現れます。
ここから、サブクラスのメンバは優先度を下げつつも候補としてリストする方針が見て取れます。

```var b1```は```dynamic```型ですが、仮にこれを(2)のように```B b2```に変更しても補完候補は変わりません。
```fa('B')..```の方が```b2 =```よりも先に評価されるため、変数```b2```の型情報```B```が利用できないのでしょう。

文脈的にサブクラスのオブジェクトとわかっている場合は```as```を使ってキャストすると良いようです。
(3)の例では```as B..```のところで```a```に続いて```b```がグレーアウトせずにリストされました。

なお、個人的には(3)を```) as B..b```と書いても、```) as B ..b```と書いてもスペースが気持ち悪いです。
加えて```var```と``` as ```が冗長なで、(4)の様に型情報は変数宣言に与えて、そのメンバ参照は文を分けたほうが素直だと思います。

ということで、(4)一択ですかね。

###捕捉
* (1)、(2)は動的には正しく、チェックドモードでも完走しますが、エディタやアナライザで警告が出るので非推奨です。
* ```fa('B')```を```fa('A')```に変更しても補完動作は変わりませんが、当然ながら実行時エラーです。
* Dartのキャスト```as```は基本何もしません。メモリイメージを変更することもなければ、その動的解釈を変えることもありまえん。
CoffeeScript でcontinuation Monad

最近 Continuation Monad について理解したのでその実装を順を追って考えてみたい。

# Continuation Monad
- 型 A に対して、副作用 M は次のように表される

```
M a: (a -> r) -> r
```

# ContReturn
```coffeescript
# CoffeeScript
ContReturn = (a) -> (a_to_r) -> a_to_r(a)
```
- Haskell で言うところの return
- 型 A は直接返さずに、射 `a_to_r: a -> r` を受け取って、型 R を返す。
- a_to_r というのは、型 A を受け取った後の処理を表している。

```coffeescript
# 例
ma = ContReturn 1 # ma: (a -> r) -> r
a_to_r = (a) -> "< #{a} >" # a_to_r: a -> r
ma a_to_r # output: < 1 >
```

# ContBind
```coffeescript
# CoffeeScript
ContBind = (ma, f) ->
  (b_to_r) -> 
    a_to_r = (a) -> f(a) b_to_r
    ma a_to_r
```
- Haskell で言うところの >>=
- `ma: ((a -> r) -> r)`
と
`f: a -> ((b -> r) -> r)`
を使って、
`mb: ((b -> r) -> r)`
を作り出す。
- f の引数の型は A であって MA ではないので、単純な代入ではうまくいかない

# ContFmap
- Contribution Monad 用の fmap
- fmap というのは、射 `f: a -> b` に対し `mf: ma -> mb` を作り出す仕組みで、一番有名なのはリストの map だろう。こいつは 射 f を使って、リスト [a] の各要素に f を適用する新たな関数 [a] -> [b] を作り出す。
- 全ての Monad は本質的に fmap というものを備えており、当然 Continuation Monad にもこれにあたるものが存在する。

```coffeescript
ContFmap = (f) -> (ma) ->
  a_to_mb = (a) -> ContReturn f(a)
  ContBind ma, a_to_mb
```
これだけ。
ContReturn/ContBind を別のもの、例えば ListReturn, ListBind に変えるだけで新たな fmap は作れる。

```coffeescript
generateFmap = (ret, bind) -> (f) -> (ma) ->
  a_to_mb = (a) -> ret f(a)
  bind ma, a_to_mb
```

今までコードの試し書きには python と思っていたが、 CoffeeScript 書きやすいわ。
accepts_nested_attributes_forを使う時はform_forの第１引数にModelのインスタンスを渡さないといけない


こんなModelがあるとする。

```rb
class User < ActiveRecord::Base
  has_one :user_detail
  accepts_nested_attributes_for :user_detail, allow_destroy: true
end
```

```user_detail.rb
class UserDetail < ActiveRecord::Base
  belongs_to :user
end
```

1つのページでuserとuser_detailを同時に更新したい場合に、

```user/_form.html.haml
= form_for :user, url: 'update_page_url' do |f|
  = f.text_field :param1
  = f.fields_for :user_detail |df|
    = df.text_field :detail_param_1
  = f.submit
```

とすると、次ページでuser_detailの値がうまく取れない。


半日くらいハマって、こうしたらうまくいった。。。

```user/_form.html.haml
= form_for @user, url: 'update_page_url' do |f|
  = f.text_field :param1
  = f.fields_for :user_detail |df|
    = df.text_field :detail_param_1
  = f.submit
```

そういうものなんだろうか・・・あとで詳しく調べよう。
pythonのunittestでテストを書く時、失敗する可能性のあるsetUpにはdoCleanupsを使う

unittestモジュールを利用してテストを書く際に、テストの準備をするためのfixtureを書く事がある。
tearDownはテスト関数中の例外を受け取って処理してくれるが。setUp中の例外に関しては素通りしてしまう。
失敗する可能性のあるsetUpに関してはdoCleanupsを使う。

## test fixtureについて

unittestモジュールを利用してテストを書く際に、テストの準備をするためのfixtureを書く事がある。
例えばsetUp/tearDownがそれにあたる。

以下のように書く。

```py
class Tests(unittest.TestCase):
    def setUp(self):
        print("setUp")

    def tearDown(self):
        print("tearDown")

    def test_it(self):
        print("before execute")
        _callFUT()
        print("after execute")
```

この時、以下の様な順序で実行される。

1. setUp
2. test_it
3. tearDown

tearDownは2.のテスト関数で例外が発生した場合にも呼ばれる。

```py

class Tests2(unittest.TestCase):
    def setUp(self):
        print("setUp")

    def tearDown(self):
        print("tearDown")

    def doCleanups(self):
        print("cleanup")

    def test_it(self):
        print("before execute")
        raise Exception
        print("after execute")
```

実行順序も同様。

1. setUp
2. test_it
3. tearDown

## setUpが例外を送出する場合

testのsetUpに書くコードも当然pythonコードなので、中には例外を発生する可能性のあるものも存在する。
このような場合にtearDownが実行後の後始末を保証してくれると捉えているのは危険。
事実、tearDownはsetUp中の例外には関知しない。

```py
class Tests3(unittest.TestCase):
    def setUp(self):
        print("setUp")
        raise Exception("setup")

    def tearDown(self):
        print("tearDown")

    def test_it(self):
        print("before execute")
        raise Exception("execute")
        print("after execute")
```

呼ばれるのは以下のみ

1. setUp

tearDownは呼ばれない。
この時、何らかの後処理を付加したい場合には[doCleanups](http://docs.python.jp/2/library/unittest.html#unittest.TestCase.doCleanups)を使う。
doCleanupsはsetUp,tearDown時の例外に関係なく無条件に呼ばれる。

```py
class Tests4(unittest.TestCase):
    def setUp(self):
        print("setUp")
        raise Exception("setup")

    def tearDown(self):
        print("tearDown")

    def doCleanups(self):
        print("cleanup")

    def test_it(self):
        print("before execute")
        print("after execute")
```

この場合の実行順序は

1. setUp
2. doCleanups

となる。
「プログラムでシダを描画する」をEmscriptenで描画する

>空前のシダ描画ブーム到来！？(^^;)
>あなたも得意なプログラミング言語でシダを描画してみよう！

# 「プログラムでシダを描画する」のこれまでと今後の一覧

- [「プログラムでシダを描画する」一覧](http://qiita.com/qt-luigi/items/b22204c7ef73260324bd)

# 久しぶりにC言語使った気がする

ということで、他にやることあんだろーと周囲から白い目で見られることも気にせず、Emscripten版やってみました。

やっぱり、C言語なだけあって、[WebRuby版](http://jsdo.it/kjunichi/loKS)の比ではない速度でした（違


# コード

```cpp:cedar_sdl.cpp
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>

#define N 20
#define WIDTH 500
#define HEIGHT 500

SDL_Surface *gScreen = NULL;

double w1x(double x,double y) {
  return 0.836 * x + 0.044 * y;
}

double w1y(double x,double y) {
  return -0.044 * x + 0.836 * y + 0.169;
}

double w2x(double x,double y) {
  return -0.141 * x + 0.302 * y;
}

double w2y(double x,double y) {
  return 0.302 * x + 0.141 * y + 0.127;
}

double w3x(double x,double y) {
  return 0.141 * x - 0.302 * y;
}

double w3y(double x,double y) {
  return 0.302 * x + 0.141 * y + 0.169;
}

double w4x(double x,double y) {
  return 0.0;
}

double w4y(double x,double y) {
  return 0.175337 * y;
}

double getRand() {
  return (double)rand()/RAND_MAX;
}
void cedar(int k, double x, double y) {
if(0<k) {

  //printf("%f\n",getRand());
  cedar(k-1,w1x(x, y), w1y(x, y));
  if(getRand()<0.3) {
    cedar(k - 1, w2x(x, y), w2y(x, y));
  }
  if(getRand()<0.3) {
    cedar(k - 1, w3x(x, y), w3y(x, y));
  }
  if(getRand()<0.3) {
    cedar(k - 1, w4x(x, y), w4y(x, y));
  }

} else {
  // plot
  int xx;
  int yy;

  xx = (int)(x*(WIDTH*0.9)+WIDTH/2);
  yy = (int)(HEIGHT-y*(HEIGHT*0.9));

  *((Uint32*)gScreen->pixels + yy * WIDTH + xx) = SDL_MapRGBA(gScreen->format, 0, 255, 0, 255);
}
}

extern "C" int main(int argc, char** argv) {

  SDL_Init(SDL_INIT_VIDEO);
  gScreen = SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_SWSURFACE);

  if (SDL_MUSTLOCK(gScreen)) SDL_LockSurface(gScreen);

  cedar(N,0,0);

  if (SDL_MUSTLOCK(gScreen)) SDL_UnlockSurface(gScreen);
  SDL_Flip(gScreen);

  SDL_Quit();

  return 0;
}
```

# ビルド

```shell-session
emcc cedar_sdl.cpp -o cedar.html
open cedar.html
```

## ネイティブ版

ソースを見れば分かる通り、一瞬で終了するけど。

```shell-session
clang cedar_sdl.cpp `sdl-config --cflags --libs`
./a.out
```

# デモ

- [http://jsdo.it/kjunichi/bra1](http://jsdo.it/kjunichi/bra1)

# 関連記事

- [libiconvをemscriptenでjs化し、node.jsで使った](http://abrakatabura.hatenablog.com/entry/2015/04/18/115323)
- [jsdo.itでEmscriptenを動かすときのメモ](http://abrakatabura.hatenablog.com/entry/2014/04/17/072514)
- [slコマンドのWebGL版を作ろうとしたら](http://abrakatabura.hatenablog.com/entry/2014/04/09/071724)
- [Emscriptenでファイルを読み込む](http://abrakatabura.hatenablog.com/entry/2013/10/03/120831)
- [emscriptenでOpenGL](http://abrakatabura.hatenablog.com/entry/2013/07/20/081301)
- [SLコマンドをEmscriptenでWeb化する 2014年秋編](http://abrakatabura.hatenablog.com/entry/2014/11/01/170855)

- [公式のOpenCVでWASM版のOpenCV.jsがビルドできたのnode.jsで動かそうとした件](https://abrakatabura.hatenablog.com/entry/2017/11/29/063247)
- [Node.jsでOpenCV.jsを使うためにimreadを自前で実装するには](https://abrakatabura.hatenablog.com/entry/2017/12/09/223513)
Bundler+Rspec+Pry+CiReporter+Rcov+Yardでgemを作成する

bundle gemでスタブ作成&specディレクトリ作成をします。

```
bundle gem myapp
cd myapp
mkdir spec
```

一通りファイルを編集します。

```Ruby:myapp.gemspec
  spec.add_development_dependency "ci_reporter"
  spec.add_development_dependency "rspec"
  spec.add_development_dependency "rspec-collection_matchers"
  spec.add_development_dependency "simplecov"
  spec.add_development_dependency "simplecov-rcov"
  spec.add_development_dependency "pry"
  spec.add_development_dependency "yard"
```

```Ruby:Rakefile
require "bundler/gem_tasks"

require "rspec/core"
require "rspec/core/rake_task"
RSpec::Core::RakeTask.new(:spec) do |spec|
  spec.pattern = FileList["spec/**/*_spec.rb"]
end

task :default => :spec

require "ci/reporter/rake/rspec"

RSpec::Core::RakeTask.new(:rcov) do |spec|
  spec.pattern = "spec/**/*_spec.rb"
  spec.rcov = true
end

RSpec::Core::RakeTask.new("spec:rcov") do |t|
  t.rspec_opts = ["-v"]
end

require "yard"
require "yard/rake/yardoc_task"
YARD::Rake::YardocTask.new do |t|
  t.files   = ["lib/**/*.rb"]
  t.options = []
  t.options << "--debug" << "--verbose" if $trace
end
```

```Ruby:spec/spec_helper.rb
require "rspec/collection_matchers"
require "simplecov"
require "simplecov-rcov"

SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
SimpleCov.start
```

gemをインストール＆テスト実行します。

```
bundle install
bundle exec rake spec:rcov ci:setup:rspec yard
```
タグをランダム配置＆サイズにしてなるべく重ならないように配置するjQueryプラグイン


ランダム配置を作った時に上手く行くときはきれいな形になるのだけど
失敗するとすごい重なっちゃってあんまり綺麗に見えないことがあります・・。

なので極力重ならないようにしてくれる仕組みを作ってみました。

site: http://develo.org/jquery.random
GitHub: https://github.com/kamem/jquery.random

新しく作り直してnpmに登録しました。
仕様も少し変わっています。
GitHub: https://github.com/kamem/jquery.randomElements

日本語 README
https://github.com/kamem/jquery.randomElements/blob/master/README.jp.md

仕様
---
1. 生成したい親要素をしていbodyの下に生成したい場合$('body')（※ appendされます。）
2. 画像を中身に入れたい場合は画像を指定（必要がない場合は空）
3. 生成したオブジェクトが重なっている場合は指定の数分ランダムをやり直す。

[DEMO]
[DEMO]: http://github.develo.org/jquery.randomElements/


使い方
---
	<script type="text/javascript" src="js/jquery.js"></script>
	<script type="text/javascript" src="js/jquery.random.js"></script>
	<script type="text/javascript">
		$(function(){
			$('body').random('<img src="img/img.png">');
		});
	</script>



オプション
------

### 初期設定 ###
	tagName: 'p',
	className: 'randomContent',
	content: '',
	num: 30,
	stageWidth: $content.width(),
	stageHeight: $content.height(),
	width: 100,
	height: 100,
	min: 10,
	isSize: true,
	tryCount: 10,
	adjustment: 0

* tagName {String} 生成したいタグの名前
* className {String} タグに付けるクラス名（randomContent + 連番）
* content {String} タグの中身（画像など入れ込みたい場合など）
* num {Number} 生成したいタグの個数
* stageWidth {Number} 領域の横幅
* stageHeight {Number} 領域の縦幅
* width {Number} 画像の横幅最大値 （widthとheightが同じ値の場合縦横比を保ってランダムにします。）
* height {Number}	画像の縦幅最大値
* min {Number} 画像の最小値
* isSize {Boolean} サイズをランダムにするか
* tryCount {Number} 配置が重なっていた時に再度ランダムをやり直す回数
* adjustment {Number} 重なり具合をどのぐらい許容するか
なんかおそいRubyメソッドの実行時間をプロファイリングするまでもなくささっと計測したい

```
    def super_slow_method
      sleep(999999999)
    end

    def self.timer(method)
      alias_method "#{method}_without_timer", method
      define_method("#{method}_with_timer") do |*args,&block|
        start = Time.now
        ret = send("#{method}_without_timer", *args, &block)
        $stderr.puts "#{method}: #{Time.now-start}"
        ret
      end
      alias_method method, "#{method}_with_timer"
    end
    timer :super_slow_method
```
こういうgemがありそうなものだ
PHPのbehatとzombiejsでBDDに挑戦(1)

[TDD is dead. Long live testing.]に触発されたわけではないがけど。

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

関連記事:

 * behat3とzombiejsでBDDに挑戦(1)
 * [behat3とzombiejsでBDDに挑戦(2)]
 * [behat 3.0 とzombiejsでBDDに挑戦(3)]
 * [behat 3.0とphantomjsでBDDに挑戦(4)]
 * [behat 3.0とJenkins CIでBDDに挑戦(5)]
 * [behatとChrome HeadlessでBDDを実践(6)]
[behat3とzombiejsでBDDに挑戦(1)]:http://qiita.com/dozo/items/be0ff9e9443413a32d25
[behat3とzombiejsでBDDに挑戦(2)]:http://qiita.com/dozo/items/4cb29ee55c4bd8891786
[behat 3.0 とzombiejsでBDDに挑戦(3)]:http://qiita.com/dozo/items/ec0448ffcbb703df9e43
[behat 3.0とphantomjsでBDDに挑戦(4)]:http://qiita.com/dozo/items/5a5f81061a5aade383d6
[behat 3.0とJenkins CIでBDDに挑戦(5)]:http://qiita.com/dozo/items/4de280e580bdc48c9d93
[behatとChrome HeadlessでBDDを実践(6)]:https://qiita.com/dozo/items/f023c3a4ae9c35768a65

昔からTDDを念頭にものを作ってきた。
のだが、「テストコードを書く」という行為に納得感がなく、手法をあれこれ変えてみたりしていた。
そんな折、自動テストについて調査する機会があり、そこでBDDという手法があることを知った。
BDDの詳細についてはこちらを: [エンドツーエンドテストの自動化は Cucumber から Turnip へ]

さて、ツールの選定をするわけだが、
必要なのはBDDテストツールとブラウザテストツール。
言語問わず探してみた。

##### BDDテストツール

| ツール | 言語 | 詳細 |
|:-----------|:------------|:------------|
| [Cucumber] | Ruby |RSpecよりも自然言語(英語とか日本語とかそういうの)に近いGherkin書式を使ってテストシナリオを記述できる |
| [Turnip]     | Ruby |cucumberの進化系でより読みやすくしたもの|
| [Cucumber.js] | JavaScript |cucumberのJavaScript版。発展途上で今後の進化に期待したいところ|
| [Behat] | PHP | Cucumberをインスパイアしたテストツール |
| [Codeception] | PHP | 各種テストツールを統合的に取り扱う |

#### ブラウザテストツール

| ツール | 言語 | 詳細 |
|:-----------|:-----------|:-----------|
| [Selenium] | Java  | 自動テストの定番。使いにくさも折り紙付き。 |
| [Capybara] | Ruby | 受け入れテストツール。要QTライブラリ。 |
| [Phantomjs] | node.js | JavaScriptも解析できる高性能ヘッドレスブラウザ |
| [Zombie.js] | node.js | phantomjsの簡易版 |


最初は[Turnip]で行く予定だったが、
私があまりRubyに明るくなく、インストールの段階で挫折。
node.jsなら行けるかとMocha, Jasmine, [Cucumber.js]と試すものの、内容を理解できず終了。
最後に残ったPHP製の[Behat]で行くことにした。
PHPerな私にはちょうどいいか。

### [Behat]


> PHP製のBDDツール。[Cucumber]互換のGherkin書式でテストコード（フィーチャ）を作成し、付属のヘッドレスブラウザ([Mink])を通してWebサービスのテストをすることができる。
> [Mink]はドライバを経由して[Selenium]やSahiなどの外部ツールとの連携が可能。
> バージョン３では[Turnip]書式にも対応。

ヘッドレスブラウザですが同梱の[Mink]だとHTMLは取得できてもJavaScriptを展開できない。
最近ではHTMLだけで済ますことが非常に少なく、これでは要求を満たせない。
そこでヘッドレスブラウザは外付けにすることにした。
JavaScriptを使える[Phantomjs]か[Zombie.js]で迷ったが、
多機能な[Phantomjs]で行きたかったが、[Selenium]を通さなきゃいけなかったり、ちゃんと動かなかったりと結構頑張ったが諦めた。
ということで、[zombie.js]で行くことに。

### [zombie.js]

> JavaScriptを解析できるnode.jsベースのヘッドレスブラウザ
> 軽量コンパクトな反面、機能は限定的

[Phantomjs]はまた、そのうち試そう。



さて、次回はインストールを記事にしよう。



[TDD is dead. Long live testing.]:http://david.heinemeierhansson.com/2014/tdd-is-dead-long-live-testing.html
[エンドツーエンドテストの自動化は Cucumber から Turnip へ]:http://magazine.rubyist.net/?0042-FromCucumberToTurnip
[Cucumber]:http://cukes.info
[Turnip]:https://github.com/jnicklas/turnip
[Cucumber.js]:https://github.com/cucumber/cucumber-js
[Behat]:http://behat.org/
[Behat3]:http://behat.readthedocs.org/en/latest/index.html
[Codeception]:http://codeception.com/
[Selenium]:http://docs.seleniumhq.org
[Phantomjs]:http://phantomjs.org
[Zombie.js]:http://zombie.labnotes.org
[Mink]:http://mink.behat.org
[Capybara]:http://jnicklas.github.io/capybara/
Uint8ArrayからURLを作る

# やり方

- Uint8Array#bufferを使う
- Blobのコンストラクタへの引数は「[」と「]」で囲むw

## コード例

```js
var decompressed = zlib.inflate(new Uint8Array(http.response));
var blob = new Blob([decompressed.buffer]);
var url = URL.createObjectURL(blob);
```

# Link

コード例のzlibは以下

- [ukyo/zlib-asm](https://github.com/ukyo/zlib-asm)
SwiftでUITableViewミニマムサンプル


クラス構成

* AppDelegate
* ItemListVC: 一覧ビュー
* ItemViewCell: セルビュー
* Item: モデル

```AppDelegate.swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
                            
	var window: UIWindow?

	func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
		self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
		self.window!.backgroundColor = UIColor.whiteColor()
		self.window!.makeKeyAndVisible()
		
		self.window!.rootViewController = ItemListVC()
		
		return true
	}
}
```

```ItemListVC.swift
class ItemListVC : UITableViewController, UITableViewDataSource {
	var items: Item[] = Item[]()
	
	func loadData() {
		for i in 0..100 {
			self.items.append(Item(name: "hoge \(i)"))
		}
	}
	
	override func loadView() {
		self.loadData()
	}
	
	override func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
		return 1
	}
	
	override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
		return self.items.count
	}
	
	override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
		let item = self.items[indexPath.row]
		
		let cellId = "ItemViewCell"
		var cell = tableView.dequeueReusableCellWithIdentifier(cellId) as? ItemViewCell
		if cell == nil {
			cell = ItemViewCell(style:UITableViewCellStyle.Default, reuseIdentifier:cellId)
		}
		cell?.update(item)
		return cell
	}
}
```

```ItemViewCell.swift
class ItemViewCell : UITableViewCell {
	var item: Item?
	
	func update(item: Item) {
		self.item = item;
		self.refresh()
	}
	
	func refresh() {
		self.textLabel.text = self.item?.name
	}
}
```

```Item.swift
class Item {
	var name: String

	init(name: String) {
		self.name = name
	}
}
```
LinuxMint17でPHP5.5.9をインストール

LinuxMint17が出たのでVirtualBox上にインストールしてみました。今のところ快適に動いています。

PHPが必要になったので、まずは`sudo apt-get install php5-cli`でインストール。
さーて、どのバージョンがインストールされたのかな……

```bash
$ php -v
PHP 5.5.9-1ubuntu4 (cli) (built: Apr  9 2014 17:11:57) 
```

Σ(ﾟДﾟ；

**なんと、apt-getでいきなりPHP5.5.9がインストールされる……**（以前は5.3でした）

っていうだけのお話でした。
いつから変わったんでしょう。便利になりましたねｗ
自分用AZIKチュートリアル

自分が AZIK を使えるようになりたいので作りました。
順風満帆が `jjphmzpz` で打てたら嬉しいよね。別に嬉しくない？そうですか……。

利用している環境が OS X + AquaSKK なので、同環境を前提に記述してます。
また SKK と AZIK は一部のキーバインドがバッティングしますが、
この [keymap.conf](https://github.com/temmings/dotfiles/blob/ec1f3d7a56ce2a33b84bb845bd7ed90764bbbd12/AquaSKK/keymap.conf) と [azik.rule](https://github.com/temmings/dotfiles/blob/ec1f3d7a56ce2a33b84bb845bd7ed90764bbbd12/AquaSKK/azik.rule) を利用しているものとします。
(ToggleKana を q から Q に変更してたり、tt, kk あたりを潰してたりします)
一般的な AZIK 入力とは異なるところがあるかもしれません。

# AZIK の基本中の基本

母音である *(aiueo)* の1つ下のキー *(zkjdl)* が、それぞれ *(an, in, un, en, on)* の入力に対応してる。
以上。

他にも ms で「ます」になるとか沢山あるけど、そんなのは実践で覚えていけばいいです。

# とにかく、とにかく、身体で覚えよう！

頭で考えてても仕方ない。
説明してない入力方法もいきなり出てくるけど、とにかく覚える。

| output | input |
|--------|-------|
| ごめんください | go **md** ku da **sf** |
| はいはい | **hq** **hq** |
| どうも | **dp** mo |
| たびたびすみません | **tb** **tb** su mi ma **sd** |
| ふふふ | **hf** **hf** **hf** |
| こんにちは | **kl** **nt** ha |
| こんばんは | **kl** **bn** ha |
| おねがいします | o ne **gq** si **ms** |
| ありがとうございます | a ri ga **tp** go **zv** **ms** |
| わたしも | **wt** **sm** |
| ちょっと | co **;** to |
| そう | **sp** |
| おもう | o **mp** |
| いじょうです | i **jp** **ds** |
| まるで | **mr** de |
| ひとごとのようね | **ht** **gt** no **yp** ne |
| でもね | **dm** ne |
| われわれは | **wr** **wr** ha |
| うちゅうじんやねん | u **ch** **jk** ya **nd** |
| えっ | **e** **;** |
| そんなことしんじられん | **dl** na **kt** **sk** ji ra **rd** |
| ないしょだよ | **nq** xo da yo |
| みざる きかざる いわざる | mi **zr** ki ka **zr** i wa **zr** |
| いちにちいちぜん | i ti **nt** i ti **zd** |
| そんなかんじ | **sp** na **kz** ji |
| ばいばい | **bq** **bq** |
| 開発用 | **Kq** ha tu **yp** |
| 本番用 | **Hl** **bz** **yp** |
| 進捗どうですか | **Sk** co ku `<SPC>` **dp** **ds** ka |
| 全然だめ | **Zd** **zd** `<SPC>` da me |
| 一覧 | I ti **rz** `<SPC>` |

# 最後に

いいの思い付いたら追加していきます。
2分で簡単なWeb APサーバを作る方法

srcの中のソース書き換えると自動でサーバに反映されるので楽～

1. [Leiningen](http://leiningen.org/)をインストール
2. 必要なら環境変数HTTP_PROXY, HTTPS_PROXYを設定
3. `lein new compojure sampleweb1`コマンドでプロジェクト作成（最後は適当なプロジェクト名）
4. `cd sampleweb1`で作成したプロジェクトに移動
5. `lein ring server`でサーバ起動

おわり
UnityのAndroidでコピーにはまった

# Unity Android ClipBoard Plugin
先日UnityからAndroidのクリップボードを操作しようとすると「Can't create handler inside thread that has not called Looper.prepare()」とエラーを吐く。

たぶんUIスレッドを使うなりしてLooperを初期化しないといけないのだろう。
UnityとAndroidのUIスレッドは別々のスレッドで動いているみたいだし。

そんなわけでrunOnUiThreadを使ってUIのスレッドで実行したらうまくいった。
あと、iOSは数行で書けて凄い簡単でした。

```csharp:ClipBoard.cs
using UnityEngine;
using System.Collections;

public class ClipBoard {

  public static void ExportString(string exportData){
    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");

    activity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
    {
      AndroidJavaObject clipboardManager = activity.Call<AndroidJavaObject>("getSystemService","clipboard");
      //clipboardManager.Call("setText", exportData);
      AndroidJavaClass clipDataClass = new AndroidJavaClass("android.content.ClipData");
      AndroidJavaObject clipData = clipDataClass.CallStatic<AndroidJavaObject>("newPlainText","simple text", exportData);
      clipboardManager.Call("setPrimaryClip",clipData);
    }));
  }
}

```
hello寿司コマンド

![スクリーンショット 2014-06-07 1.13.19 AM.png](https://qiita-image-store.s3.amazonaws.com/0/229/8ebe2d02-7670-38c2-2c84-70a4ff76ed74.png)

```bash:[Terminal]
sudo xcode-select -s /Applications/Xcode6-Beta.app/Contents/Developer
export SDKROOT=$(xcrun --show-sdk-path --sdk macosx)
vi main.swift
```

```swift:main.swift
#!/usr/bin/env xcrun swift -i

import Foundation

println("hello ?")
```

```bash:[Terminal]
chmod +o main.swift
./main.swift
hello ?
```

```
vi main.swif
cp main.swift ?
```
![スクリーンショット 2014-06-07 1.19.10 AM.png](https://qiita-image-store.s3.amazonaws.com/0/229/6ca2d56a-895c-f8c8-45dd-09b83676aabc.png)
任意のディレクトリに短縮名を付けて極小タイプで移動する goto コマンド

ちょっと深いけどよく移動するディレクトリに任意の短縮名を付けて、どこからでもディレクトリを移動できるようにしたら幸せじゃない？っていう趣旨のお話です。短縮名を定義すると同時に、タブ補完も効くようにしているので、極小タイプで移動、というイメージになります。

> Linux / Mac 上の bash で動作する事を意図していますが、それ以外の環境であっても上手く変更すれば動くのではないでしょうか。bash についてそんなに詳しくも無いので、突っ込み歓迎です。

さてまずは、```goto``` コマンドの定義です。お手持ちの ```.bash_profile``` やら ```.bashrc``` やらに、下記の記述を追加して下さい。

```bash
if [ -e ~/.gotocache ]; then
  rm -rf ~/.gotocache
fi
mkdir ~/.gotocache
if [ -e ~/.gotoconf ]; then
  params=""
  for line in `cat ~/.gotoconf | grep -v ^#`; do
    key=`echo ${line} | cut -d '=' -f 1`
    dir=`echo ${line} | cut -d '=' -f 2`
    params="${params} ${key}"
    echo ${dir} > ~/.gotocache/${key}
  done
  complete -W "${params}" goto
else
  complete -W "" goto
fi

goto(){
  if [ -e ~/.gotocache/${1} ]; then
    dir=`cat ~/.gotocache/${1}`
    cd ${dir}
  else
    cd ~
  fi
}
```
> Linux と Mac を前提にしていて、Mac にプリインストールされている bash のバージョンが 3 系列で、連想配列を使えないがゆえの実装になっています。

次に、ディレクトリの短縮名を定義するファイルを作ります。ホームディレクトリに ```.gotoconf``` という名前で定義ファイルを作って下さい。
```短縮名=パス``` という書式で設定を記述し、```#``` から始まる行はコメントで、空行は無視します。自分が Mac で実際に使っている例(抜粋)を下記に載せます。

```bash:.gotoconf
# Mac
applications=/Applications

# Home
home=/Users/Otchy
desktop=/Users/Otchy/Desktop
documents=/Users/Otchy/Documents
downloads=/Users/Otchy/Downloads
dropbox=/Users/Otchy/Dropbox

# Tomcat
tomcat=/Users/Otchy/workspace/apache-tomcat-7
tomcatconf=/Users/Otchy/workspace/apache-tomcat-7/conf
tomcatlogs=/Users/Otchy/workspace/apache-tomcat-7/logs
```

設定ファイルが書けたら、再ログインするか ```source ~/.bash_profile``` するなどして、先ほどの ```goto``` コマンドを有効化します。

するとターミナル上でカレントディレクトリを自分で定義した短縮名で移動することが出来るようになります。上記の例で言うと以下のようなイメージです。

```bash
$ goto ap<tab>
↓
$ goto applications<enter> -> cd /Applications

$ goto d<tab><tab>
desktop    documents  downloads  dropbox
$ goto down<tab>
↓
$ goto downloads<enter> -> cd /Users/Otchy/Downloads

$ goto tom<tab>
↓
$ goto tomcat (ここで enter すれば cd /Users/Otchy/workspace/apache-tomcat-7)
$ goto tomcatl<tab>
↓
$ goto tomcatlogs<enter> -> cd /Users/Otchy/workspace/apache-tomcat-7/logs
```

```Applications``` のような大文字を含むディレクトリへの移動が楽、tomcat のケースのように階層化されたディレクトリの場合でも、短縮名を工夫すると、タブ補完しつつ任意の深さにすぐ飛べる、というあたりが大きなメリットかと思っています。
git 改行、.gitconfig 

# git の改行でちょっとだけハマったのでメモ

## git config 
git clone したあと Windowsでファイルを編集後に push したら全行が更新対象になったでござる。まあWindowsとUnixでの改行コードが違うあれで少し困ったってなったのでその解決策です。

基本的にUnixがメインとなるので特にこだわりが無ければ改行コードは「LF」にしておきます。

```
git config --global core.autocrlf false
```

で、ok。

## .gitconfig に保存されている
autocrlf の設定は「.gitconfig」に設定されています。

Windows(msysgit)の場合は、``` C:\Users\<ユーザ名\.gitconfig``` に保存され、Unixの場合は、``` ~/.gitconfig``` に下記の書式で保存されます。

```
[core]
	quotepath = false
```

あといつものお約束コマンドも実行すると。

```
$ git config --global user.name 'your name'
$ git config --global user.email you@example.com

```

下記のように保存されます。

```
[user]
	name = your name
	email = you@example.com
[core]
	quotepath = false
	autoCRLF = false
```

### chefとか使って
毎回コマンドを打つ（１回でいいんだけどね）のが面倒なのと、仮想環境を作ったり消したりしているとコマンドをついつい忘れてしまうので仮想環境を作ったときに .gitconfig を作成するように [chef-solo](http://tsuchikazu.net/chef_solo_start/) など使って作成しておくのがベストです。
Core iシリーズIntel CPUの型番の読み方

Qiitaはプログラミングテクニックを共有する所だった気がするので、
CPUに関する話はいかがなものかしらと思ったりもするわけですが、
特定のCPUに特化したコードとかも書かなきゃいけない事はあるわけで、
まぁ無関係では無いかもみたいな感じでメモ書き程度に貼っておきます。

#基本
基本的には型番は
Core i[一桁の数字] [4桁の数字][アルファベット]
の規則で付けられている。
e.g., `Core i7 4770K`
まず、最初の一桁の数字は3か5か7である。
これは数字が大きいほど高くて性能が良い。
次の4桁の数字は、最初の一つが世代で、後ろの3つが型番である。
例のケースなら、第4世代770番である。
ただし、世代番号は第一世代の場合省略される。
e.g., `Core i7 900`
型番は大きいほど新しく性能が良い。
最後のアルファベットはちょっと複雑。
以下詳細。

#デスクトップ向け

##何もついてない場合
可もない不可もない普通のCPU。

##X
通称Extreme Edition。
ウルトラハイエンド向け。

##K
オーバークロック仕様。
グラフィック性能も上がっているらしい。
ただしクロック数などの性能は無印と同じ。

##S, T
省電力プロセッサ。TはSより更に省電力。

##R
一体型PC向け。

#ノート向け

##M
mobileの略。
特に特徴のないCPUの場合コレがつく。

##H
グラフィク性能向上版。

##Q
quad core。Core i7 for mobileは2coreだったり4coreだったりするから区別のためにつく。
らしい。

##U, Y
省電力版。クロック数も低い。
Yは更に低く、タブレットなどなど向け。

##X
同デスクトップ
Debian squeeze (6.0) LTS の使い方

squeeze-lts の apt-line を **追加** する必要があります。

例えば

    deb http://ftp.jp.debian.org/debian squeeze-lts main non-free contrib
    deb-src http://ftp.jp.debian.org/debian squeeze-lts main non-free contrib

のように追加します。

詳細は [Debian squeeze (6.0) LTS の使い方](http://blog.n-z.jp/blog/2014-06-06-squeeze-lts.html) を参照してください。
元ネタは Debian Wiki の [Using Debian squeeze (6.0) LTS](https://wiki.debian.org/LTS/Using) (英語) です。
Gradle で JavaFX をコンパイルできるようにする

Java 8 から JavaFX を標準で使えるようになりました。

ですが、JavaFX のソースコードを Gradle でコンパイルしようとすると、
「unable to resolve class javafx.scene.Parent」というような具合に
JavaFX 関連のクラスが見つからないため、コンパイルエラーになります。

## 原因：jfxrt.jar にクラスパスが通っていないから

調べてみると Gradle でコンパイルするとき、<JAVA_HOME>/lib/ext/jfxrt.jar にクラスパスが通っていないようです。

IntelliJ IDEA などの IDE で Java 8 を JDK として設定すると、
この jfxrt.jar にクラスパスが通った状態になっています。

そのため、IDE で動かすとうまく行くけれど Gradle ではビルドできないという事象になっています。

## 解決策１：JavaFX Gradle Plugin を使う

Gradle で JavaFX を使えるようにするプラグインがあります。
http://speling.shemnon.com/blog/2013/05/18/javafx-gradle-plugin-0-dot-3-0-released/

このプラグインを使おうと色々とがんばってみましたが、うまくいきませんでした。
プラグインがあるリポジトリが見つからないようでした。

ということで、以下自力で…

## 解決策２：jfxrt.jar をクラスパスに追加する

<JAVA_HOME>/lib/ext/jfxrt.jar にクラスパスが通っていないので、
クラスパスに追加するよう build.gradle の dependencies に１行追加します。

```groovy
dependencies {
    compile files("${System.properties['java.home']}/lib/ext/jfxrt.jar")
}
```

これで Gradle がコンパイルするときに JavaFX 関連のクラスを参照できるようになります。

適切な解決策かどうかわかりませんが、とりえあずビルドしたり、テストしたりできます。
T440pにUbuntu14.04を入れてwifi接続を有効にする

備忘録
ワイヤレスLANはThinkPad IEEE 802.11 b/g/n ワイヤレスLAN (WiFi準拠) + Bluetooth4.0

Ubuntu 13.10をインストールする→14.04にアップグレード（14.04を直接入れようとしたがディスクから起動しなかったので諦める）
無線が使えないことに気付いたので、以下のスレの内容を見てみる
[No wireless support for Realtek RTL8192EE](https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1239578 "No wireless support for Realtek RTL8192EE")
Larryさんが修正したカーネルバイナリをあげているようだ
というわけで取ってきてインストール

```
wget http://www.lwfinger.com/realtek_drivers/linux-headers-3.13.9_1.1_amd64.deb
wget http://www.lwfinger.com/realtek_drivers/linux-image-3.13.9_1.1_amd64.deb

sudo dpkg -i linux-headers-3.13.9_1.1_amd64.deb linux-image-3.13.9_1.1_amd64.deb
```

再起動
接続確認、よかった
[Swift]reduce<U>(initial: U, combine: (U, T) -> U) -> Uを使ってみました


```Array<String>``` に対して　```reduce<U>(initial: U, combine: (U, T) -> U) -> U``` を使ってみました。

```swift
let list = ["tokyo", "shibuya", "shinjyuku", "akasaka"]
let result = list.filter{ $0.utf16count > 5 }
  .map { $0.uppercaseString }
  .reduce(Array<String>()) {
    var temp = $0
    temp.append($1)
    return temp
  }
result
```

```initial``` で渡したものは、 ```combine``` にはimmutableで渡されるようで、以下ではエラーとなった。

```swift
  .reduce(Array<String>()) {
    $0.append($1)
    return $0
  }
```
```
Playground execution failed: error: <REPL>:44:5: error: immutable value of type 'Array<String>' only has mutating members named 'append'
    $0.append($1)
    ^  ~~~~~~
```
[Swift]自作クラスでfor...in


## 自作クラスをfor...inで使う

[Swiftでコレクションクラス](http://qiita.com/_tid_/items/ad14f8a0bf3f423a4128)を見て、自分でもちょっと試してみた。


```swift:for...in
for item in collection {
    statements
}
```

「The Swift Programming Language」によると、For-In Statement中の,
collectionはSequnceプロトコルを実装した型であるらしい。

Sequenceプロトコルは、
・メソッドgenerateを持ち、
・メソッドgenerateは”Generatorプロトコルを実装した型”のオブジェクトを返す。

また、Generatorプロトコルは”nextメソッドを持つ型”のようだ。
メソッドnextは、
・返す要素が無くなればnilを、
・それ以外のときには、それなりのオブジェクトを返せばよさそうだ。

## Generatorプロトコル

整数を１から１０まで返すクラスを例に、
Generatorプロトコルを持つクラスのほうを書いてみる。

```swift:
class Foo : Generator {
    var count = 0

    func next() -> Int? {
        if self.count < 10 {
            self.count++
            return count
        }
        return nil
    }
}
```

Generatorプロトコルは、nextメソッドを持つ（らしい）。
また、nextメソッドの返り値は、ループが終わりの場合にはnilを、
それ以外のときにはnext()の宣言のときに宣言した型（上記の例ではInt）の値を返す。

## Sequenceプロトコル

次に、Sequenceプロトコルのほうを考えてみる。

```swift:
class Bar : Sequence {
    func generate() -> Foo {
        return Foo()
    }
}
```

こちらは、generateメソッドを持つ（ようだ）。
generateの戻り値の型は、Generatorプロトコルを持つなんらかの型である必要がある。

ここでは、さきほど定義したクラスFooのオブジェクトを返している。

## 使い方

ここまで用意できたら、あとは下記のようにSequenceプロトコルを持つオブジェクトを
for...inで使えばよい。

```swift:
var bar = Bar()

for item in bar {
    println(item)
}
````

## 補足

Sequenceプロトコルを実装したクラスはコードも短いので、
Generatorプロトコルも一緒に実装してしまうのも１つの手だと思われる。

## 蛇足

ここまでのコードはすべて１つのファイルに書いてみたが、普通に動作した。
Rspec3.0.0にアップデートしたらDeprecatedが多発していたのはDraperが影響していた件

Rspec3.0.0が正式リリースしましたね！！
自分の環境では3.0.0はbeta版から使っていたのですが、`3.0.0rc1` にアップデートしたところから、以下の様なdeprecatedワーニングが多発していました。。

```
The `:example_group` key in an example group's metadata hash is deprecated. 
```

面倒くさいから放っておいていたんですが、正式リリースしたところで真剣に調べてみました。

まずはリリースノートを調べてみた
-------------------

リリースノートを見ると、`example_group` について、書かれていました。影響があるんだろうなというところで詳細はわからずじまい。。
[RSpec 2.99.0 and 3.0.0 have been released!](http://myronmars.to/n/dev-blog/2014/06/rspec-2-99-0-and-3-0-0-have-been-released)


そして、rspec-railsのリポジトリを調べていると
-------------------
Issueの中にそれっぽいのがありました。

> https://github.com/rspec/rspec-rails/issues/1035#issuecomment-43831752
It would appear that Draper::DecoratorExampleGroup is the cause:

### Draperか？？？？！


DraperのIssueを見てみた
-------------------

はい、ありました。。このIssueで取り上げられていました。
https://github.com/drapergem/draper/issues/620

そしたら、既にFixしていました。(一昨日Fixしてた。2014/06/03)
https://github.com/drapergem/draper/pull/623

Draperの最新 [v1.3.1](https://github.com/drapergem/draper/releases/tag/v1.3.1)  がリリースされているみたいなので以下の通り、Gemfileを修正しリリース版の最新にするように `bundle update` を実行します。
**Version 1.3.1 以上にすることで解決します**

```Gemfile
gem "draper"
```
これで、 ***解決した！！*** 
deprecationが出まくっていると気持ち悪いですからね。良かった！


おまけ!
------------------

と言うより [yujinakayama/transpec](https://github.com/yujinakayama/transpec) が素晴らしかったという話。

Rspec3.0への移行は手動でやっていたのですが、今回のDeprecationが発生した時に、まず疑ったのが、移行の方法が間違っているのかというところでした。
そこで、試しに Rspec3.0 へのマイグレーションツールの[yujinakayama/transpec](https://github.com/yujinakayama/transpec)を使って移行を自動で試して見ようという感じでやっていたら、これがすごかった！！！
コマンド実行して5分くらいしたら自動で全部マイグレーションして、Rspec3.0の記法に合わせて修正してくれた。こういうツールがあるっていうのはとてもやりやすいなと思いました。まだ2.0系を利用している人は試して見る価値ありです。


### さらにrspec-coreのリポジトリに、、、

以下のIssueが挙がっていました。
**`Draper`** 以外に **`Pundit`** でも同様の問題があったみたいです。
https://github.com/rspec/rspec-core/issues/1562

以上、参考になれば。