OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHPでトランザクション処理


モデル内で処理することを想定し、Memberモデル内に書いている。
例としてmembersテーブルに$dataを保存する処理

```php
	public function saveNewMember() {
		$datasource = $this->getDataSource();
		try{
			$datasource->begin();

			$data = array(
				'Member' => array(
					'name' => 'maeda',
					'email' => 'maeda@sample.com',
				));
			if (!$this->save($data)) {
				throw new Exception();
			}

			$datasource->commit();
		} catch(Exception $e) {
			$datasource->rollback();
		}
	}
```

こうした場合、以下のようになる。

```sql
	1	BEGIN
	2	INSERT INTO "public"."members" ("name", "email") VALUES ('maeda', 'maeda@sample.com')
	3	COMMIT
```

2つ目の処理を追加する。（別モデルにしてみる）
てっぺんに以下追加しておいて、

```php
App::uses('Comment', 'Model');
```


```php
	public function saveNewMember() {
		$this->Comment = new Comment();// 別モデル読み込み
		$datasource = $this->getDataSource();
		try{
			$datasource->begin();

			$data = array(
				'Member' => array(
					'name' => 'maeda',
					'email' => 'maeda@sample.com',
				));
			if (!$this->save($data)) {
				throw new Exception();
			}

			$data = array(
				'Comment' => array(
					'post_id' => '4',
					'comment' => 'res3-1',
				));
			if (!$this->Comment->save($data)) {
				throw new Exception();
			}

			$datasource->commit();
		} catch(Exception $e) {
			$datasource->rollback();
		}
	}
```

以下のように動作する。

```sql
	1	BEGIN
	2	INSERT INTO "public"."members" ("name", "email") VALUES ('maeda', 'maeda@sample.com')
	3	INSERT INTO "public"."comments" ("post_id", "comment") VALUES (4, 'res3-1')
	4	COMMIT	
```


Commentのpost_idに数字以外を入れて失敗させる。以下のようになる。

```sql
	1	BEGIN
	2	INSERT INTO "public"."members" ("name", "email") VALUES ('maeda', 'maeda@sample.com')
	3	ROLLBACK
```


つまり同じデータソースの場合は同じトランザクションになる。
Rails money-rails

Rails-Moneyはrailsでお金を扱うgem.
属性でお金を扱いたかったので、試しに利用してみました。

```rb
# Gemfile
gem 'money-rails'
```

----
モデルの作り方

```bash
bundle exec rails g Account name:string balance:money
```

テーブルにbalance_centsとbalance_currencyの２つの列が生成される。

----
config

日本円をデフォルトにする場合

```rb
# config/initialize/money.rb
MoneyRails.configure do |config|
  config.default_currency = :jpy
end
```

----
model

monetizeしないと、テーブルのカラムbalance_centsとbalance_currencyをモデルの属性balanceにひもづけてくれない。

```rb
class Account < ActiveRecord::Base
  monetize :balance_cents
end
```

----
view

モデルでmonetizeしていないと

```slim
= f.text_field :balance
```

はエラーになる。

----
参考

https://github.com/RubyMoney/money-rails
MultiDict: クローラでフォームPOSTする時にはまるなど


# MultiDict

複数選択があり得るので、[werkzeug](http://werkzeug.pocoo.org/) のMultiDictを使ってみる:

```
$ pip install werkzeug
```

リストからdict:

```py
>>> from werkzeug.datastructures import MultiDict
>>> MultiDict([('a',1), ('a', 2), ('a', 3)])
MultiDict([('a', 1), ('a', 2), ('a', 3)])
```

追加:

```py
>>> d.update({'a': '4'})
>>> d
MultiDict([('a', 1), ('a', 2), ('a', 3), ('a', '4')])
```

更新

```py
>>> d['a']=5
>>> d
MultiDict([('a', 5)])
```


# BeautifulSoupでフォームデータを取得

[BeautifulSoupのselect()](http://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors)でHTMLからフォームを取得:

```py
    def form_data(self, form_node):
        ''' form_node : HTMLからselect()したformノード
        '''

        data = MultiDict(list(
           (t['name'], t.get('value', '')) 
           for i in ['text', 'hidden', 'password', ]
           for t in form_node.select('input[type=%s]' % i)
        ) + list(
           (t['name'], t.text) 
           for t in form_node.select('textarea')
        ) + list(
           (t['name'], t.get('value', '')) 
           for t in form_node.select('input[checked]' % i)
        ) + list(
            (s.parent['name'], s.get('value', s.text))
            for s in form_node.select('option[selected]')
        ))  

        # TODO: "file", "image", 
        # TODO: HTML5 -- input(list) and datalist

        return data
```

# requestsでPOSTすると最初のパラメータしかわたっていない

[requests](http://docs.python-requests.org/en/latest/)はMultiDictに対応しているということなのだが、手持ちの環境で動かない。。。

しょうがないので、とりあえずdictに変換して対応:

```py
>>> dict(d.lists())
{'a': [1, 2, 3, '4']}
```

```py
    def post(self, uri, data):

        if isinstance(data, MultiDict):
            data = dict(data.lists())

        self.res = self.req.post(
            uri, data=data,
            verify=False, allow_redirects=False)
        self.last_uri = uri
```
meteorで簡単なアプリをちゃんと作る。


# はじめに

meteorで簡単なアプリはすごく簡単に作れる。

```
meteor create a_simple_app
```

これだけで、ボタンをクリックすると数字が増える、っていうWebアプリが作られるようになってる。

今回、この簡単なアプリをちゃんとしようと思う。

ここでいう、ちゃんと、は

* 増えた数字をサーバーで保存
* ログイン管理をして登録ユーザーのみ数字を増やせる
* 不正なDB操作をさせない

等であり、実際的なアプリを作る際には必要であろう要素である。
あとcoffeescriptを使う。好きだから。

# 中略（気が向いたら書く）

# 完成

http://my_first_meteor.meteor.com

https://github.com/ymmtmdk/my_first_meteor
UnityでUVを移動して左右対称にする

3Dの頂点情報は、テクスチャやシェーダーなどの位置を判別するのにUVというものを使ってまるみなどによる面のゆがみなどを調整することができます。
このUVを使ってテクスチャーを左右対称にしようって考え方です。

UVは、コンポーネントのMesh Filterを使ってmeshFilter.mesh.uvで
uvポイントの位置を調整する事ができます。

それでは、こちらのテクスチャを左右対称にしてみましょう。
![スクリーンショット 2014-09-21 12.15.35.png](https://qiita-image-store.s3.amazonaws.com/0/38279/dbc5148f-3dea-06ef-fdc2-b0638d22a3ec.png)

真ん中を中心に左側のUVを右側へ移動することで左右対称にする事ができます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/38279/b986576a-f678-3ff7-4e58-23c4065ffd63.png)

それでは、オブジェクトを用意しましょう。
Unityのデフォルトだとめっちゃたくさんメッシュがあって
UVを管理するのがメンドクサイので3Dソフトでシンプルなメッシュ数にします。

こんな感じ。
![スクリーンショット 2014-09-21 12.40.51.png](https://qiita-image-store.s3.amazonaws.com/0/38279/4f172e4b-f5a8-ad48-3577-b6cdeba613e3.png)

Unity以外に使えないよ！って初心者の方用にこのデータを
githubに上げておくので使って下さい。
https://github.com/amano-kiyoyuki/sample/model/plane.fbx

では、このモデルに以下のスクリプトを入れて下さい。
※UVを左右対称にする一個手前の事については、以下のサイトさんをご参考にして下さい。とても詳しく説明されています。
http://narudesign.com/devlog/unity-mesh-vertix-uv-1/

```C#:
using UnityEngine;
using System.Collections;

public class SymmetrieUV : MonoBehaviour {
    void Start()
    {
　　　　　//メッシュデータを調べる
        Mesh mesh = gameObject.GetComponent<MeshFilter>().mesh;
        for(int i = 0; i < mesh.vertices.Length; i++)
        {
            print("vertices[" + i + "] : " + mesh.vertices[i]);
        }        
        for(int i = 0; i < mesh.uv.Length; i++)
        {
            print("uv[" + i + "] : " + mesh.uv[i]);
        }
        for(int i = 0; i < mesh.triangles.Length; i++)
        {
            print("triangles[" + i + "] : " + mesh.triangles[i]);
        }

       //メッシュフィルターに変更したUVを入れる
        MeshFilter meshFilter = gameObject.GetComponent<MeshFilter>();
        Vector2[] newUV = new Vector2[9];

        /*そのまま貼付けた場合のUV
        newUV [0] = new Vector2(0.0f, 0.0f);
        newUV [1] = new Vector2(0.0f, 0.5f);
        newUV [2] = new Vector2(0.5f, 0.0f);
        newUV [3] = new Vector2(0.5f, 0.5f);
        newUV [4] = new Vector2(1.0f, 0.0f);
        newUV [5] = new Vector2(1.0f, 0.5f);
        newUV [6] = new Vector2(0.0f, 1.0f);
        newUV [7] = new Vector2(0.5f, 1.0f);
        newUV [8] = new Vector2(1.0f, 1.0f);
        */

　　　　 //左右対称にする。
        newUV [0] = new Vector2(1.0f, 0.0f);//左下を右下へ移動
        newUV [1] = new Vector2(1.0f, 0.5f);//左から右へ移動
        newUV [2] = new Vector2(0.5f, 0.0f);
        newUV [3] = new Vector2(0.5f, 0.5f);        
        newUV [4] = new Vector2(1.0f, 0.0f);
        newUV [5] = new Vector2(1.0f, 0.5f);
        newUV [6] = new Vector2(1.0f, 1.0f);//左上から右上へ移動
        newUV [7] = new Vector2(0.5f, 1.0f);
        newUV [8] = new Vector2(1.0f, 1.0f);
        meshFilter.mesh.uv = newUV;

    }
}

```

これを貼付ければ

![スクリーンショット 2014-09-21 13.02.18.png](https://qiita-image-store.s3.amazonaws.com/0/38279/213f90e0-6259-419e-8b99-d28d4c3bb062.png)

っとこのようになります。
CoreOSをさくらVPSサーバに入れようとして嵌ったのでメモ

## 参考にしたところ

[さくらのVPSにCoreOSをインストールしてDocker専用機にする](http://qiita.com/yujiod/items/dc154120c4df2e938111)
[CoreOSのトラブル対応](http://qiita.com/tukiyo3/items/debaf8a1e3ba6f4b4c33)
[CoreOS install to a VPS](http://blog.mapstrata.com/coreos-install-to-a-vps/)
[Introduction to networkd, network management from systemd](https://coreos.com/blog/intro-to-systemd-networkd/)

## 何で嵌ったか

下記を参考にして進めれば、さくっとインストールできるだろう。とか思ってたら案外嵌った。
[さくらのVPSにCoreOSをインストールしてDocker専用機にする](http://qiita.com/yujiod/items/dc154120c4df2e938111)

理由は systemd をまったく理解していなかったため（今もほとんど理解できてはいないけど）

## 嵌ったところ

isoイメージからブートして、

```shell-session:shell
$ sudo vi /etc/systemd/network/static.network
[Match]
Name=ens3

[Network]
Address=<IPアドレス>/<サブネットマスク>
Gateway=<ゲートウェイ>
DNS=<DNS1>
DNS=<DNS2>
```

```shell-session:shell
$ sudo systemctl restart systemd-networkd
```

で、ネットワークサービス再起動すれば、ネットワークつながるだろうと思っていたらつながらない。

いろいろやってわかったのだが、理由はどうやら ``Name=ens3`` でマッチするデバイスが見つからなかったかららしい。
ためしに``Name=ens*``や``enp2s0``等としてみたが同様だった。

この ens3 とか enp2s0 とかはどうやら udev が割り振ってくれるデバイス名のエイリアスらしいがどこを
みたらこのデバイス名のエイリアスが分かるのか、分からなかった。

```shell-session:shell
$ ifconfig
```

で見てみると、普通に eth0、eth1、eth2 などよく知ったエイリアスになっていたので、普通に
``Name=eth0`` と変えただけでOKだった。

※ eth0 等のでの指定はboot毎に対応するネットワークデバイスが変わる可能性があるので推奨されていません。

## その他分かった点等

### static.network の編集

iso イメージからのブートだとQEMU のコンソールが日本語キーボードを認識しないので、
``/etc/systemd/network/static.network`` を編集するのはめんどくさい。

どうせこのときだけなので、

```shell-session:shell
sudo ifconfig <network port> <ip address> netmask <netmask>  
sudo route add default gw <default gateway IP>
```

として、ネットワークインタフェースを直接編集して

```shell-session:shell
$ sudo vi /etc/resolv.conf
name server <DNS1>
```

と直接いじってしまったほうが少しは楽なように思った。

### cloud-config に間して

```yaml:cloud-config
#cloud-config

write_files:
  - path: /etc/systemd/network/static.network
    permissions: 0644
    content: |
      [Match]
      Name=eth0

      [Network]
      Address=<IPアドレス>/<サブネットマスク>
      Gateway=<ゲートウェイ>
      DNS=<DNS1>
      DNS=<DNS2>

ssh_authorized_keys:
  - ssh-rsa ABCDABCDABCDABCDABCDABCDABCDABCDABCD...
```

と static.network に直接 write_files で書いてしまうと最初の boot時の
ネットワークサービス立ち上げ時に設定反映が間に合わないので

```yaml:cloud-config
#cloud-config

coreos:  
  units:
    - name: static.network
      content: |
        [Match]
        Name=eth0

        [Network]
        Address=<IPアドレス>/<サブネットマスク>
        Gateway=<ゲートウェイ>
        DNS=<DNS1>
        DNS=<DNS2>

ssh_authorized_keys:
  - ssh-rsa ABCDABCDABCDABCDABCDABCDABCDABCDABCD...
```

と units を書いたほうが良い。

### ssh で入れなくなった場合

上記、network 設定や ssh_authorized_keys の設定でへまをすると、boot後
coreos に入れなくなってしまうがそんなときは

reboot してすぐ KVM/QEMU console が立ち上がる前に shift などを押して
boot:　プロンプトを出し ```boot: boot_kernel coreos.autologin``` とすれば
コンソールから自動ログインすることができる。
ここで、上記ネットワーク設定等が反映されているか確認する。
コマンドラインでランダムな10文字を得る方法


## はじめに
パスワードなどのよくランダムな文字列が欲しくなるのですが、毎回調べて毎回忘れるので備忘として書いておきます。

## ランダムな10文字を得るコマンドその1

```bash
 openssl rand -base64 12 | fold -w 10 | head -1
```

### 解説
 MacOS X、Amazon Linuxで確認しましたが、 **openssl**は標準で入っていました。 **openssl** の **-base64** オプションは4バイト単位でしか出力してくれないので、 **fold**で10文字毎に改行した後、 **head**で最初の行を表示しています。

## ランダムな10文字を得るコマンドその2

```bash
 cat /dev/urandom | base64 | fold -w 10 | head -n 1
```

### 解説
**/dev/urandom**からランダムな数列をとってきて **base64**で変換後、あとは最初の方法と同じですね。

##ランダムな10文字を得るコマンドその3

```bash
date +%s | shasum | base64 | fold -w 10 | head -1
```

### 解説
こちらはいわゆるEPOCHタイムをハッシュして **base64**という形ですが、時間は推測しやすいのであまりよくない例だとおもいます。


##参考

[10 Ways to Generate a Random Password from the Command Line](http://www.howtogeek.com/howto/30184/10-ways-to-generate-a-random-password-from-the-command-line/)
SwiftでUITableViewCellの高さを動的に変更する

iOS8では以前と比べて簡単にUITableViewCellの高さを動的に変更することが可能となった。

![スクリーンショット 2014-09-21 10.51.04.png](https://qiita-image-store.s3.amazonaws.com/0/49443/10697ff4-65b7-f408-50a4-867f7776c1f1.png)

Xcode6.0からStoryboardのレイアウト方法が大幅に改善され、Autolayoutをバンバン使っていく流れになると思うので、ここでもAutolayoutを使用して作業を進めていく。

以前のようにHeightを計算する作業がなくなりStoryboard上で全ての作業を終えることが出来るのは本当にありがたい。

## Storyboardでの設定

Cell上に好きなように要素を配置して、高さが可変なUILabelのLinesを0にする。
これでUILabelが複数行対応となる。

![スクリーンショット 2014-09-21 10.25.25.png](https://qiita-image-store.s3.amazonaws.com/0/49443/2f231aea-84e5-b99c-708a-269214916fe1.png)

次に、可変となるUILabelにConstraintsを設定する。
具体的には周りの要素との距離を設定するだけ。

![スクリーンショット 2014-09-21 10.28.31.png](https://qiita-image-store.s3.amazonaws.com/0/49443/635f4e22-d90d-bcc1-867b-c90b8308f983.png)

Storyboardでの設定は以上。

## ViewControllerでの記述

self.tableView.estimatedRowHeightにはStoryboard上でのCellの高さを入力すればいい。
大事なのはself.tableView.rowHeight = UITableViewAutomaticDimensionで、これでCellの高さを自動的に決定するようになる。

```swift:これが大事
self.tableView.estimatedRowHeight = 90
self.tableView.rowHeight = UITableViewAutomaticDimension
```

ViewControllerの中身

```swift:ViewController
class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    var articles: Array<Article>?
    
    override func viewDidLoad() {
        super.viewDidLoad()
                
        self.tableView.estimatedRowHeight = 90
        self.tableView.rowHeight = UITableViewAutomaticDimension

        articles = [
        Article(title: "私わたくしはその人を常に先生と呼んでいた。だからここでもただ先生と書くだけで本名は打ち明けない。", userName: "夏目漱石"),
        Article(title: "この書の世に出づるにいたりたるは、函館にある秦慶治氏、及び信濃にある神津猛氏のたまものなり。労作終るの日にあたりて、このものがたりを二人の恩人のまへにさゝぐ。", userName: "島崎藤村"),
        Article(title: "散文に二種あると考へてゐるが、一を小説、他を作文とかりに言つておく。", userName: "坂口安吾"),
        Article(title: "機敏な晩熟児といふべき此の男が、現に存するのだから僕は機敏な晩熟児が如何にして存るママかその様を語らうと思ふ。", userName: "中原中也")
        ]
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int  {
        return articles!.count
    }
    
    func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {
        let cell: MyTableViewCell = tableView?.dequeueReusableCellWithIdentifier("Cell") as MyTableViewCell
        cell.article = articles?[indexPath.row]
        cell.layoutIfNeeded()
        return cell;
    }
}
```

終わり。
SSHで接続できない時の対処法


##はじめからつまづき
サーバーのお勉強がてらさくらVPSを借りました。
ドットインストールさんの動画を見てやっていましたが、Macのターミナルからssh接続できませんでした。
そこでその場合の対処法をメモしておきます。

##対処法
さくらvpsさんからしばらくしたら届く２通目のメールに記載されているipアドレスをつかってMacのターミナルから接続するとエラーメッセージが出ました。


```
% ssh root@**********(ipアドレス)
ssh: connect to host ********* port 22: Connection refused
```


エラーメッセージから察するにサーバのポートが開いてないみたい。
といううことで、さくらvpsのリモートコントロールパネルのリモートコンソールからポート開放しました。

調べてみたところポート開放するには
iptablesの設定を行えばいいそう。
私の環境ではiptablesファイルは最初はありませんでした。

vimでファイルを編集します。

```
% vim /etc/sysconfig/iptables
```

以下のコードを貼り付け

```
*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
 
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# SSH, HTTP, FTP1, FTP2, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport XXXXX -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306  -j ACCEPT
 
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
 
COMMIT
```

下記のコマンドで設定反映

```
% /etc/rc.d/init.d/iptables/restart
```

空白や余分な改行が入ると設定できないそう。
動かない場合は、別のサイトさんのをコピーしたりしてみてください。

##最後に
少し調べたところOSはCentOSって書いてあるが、
さくらインターネットコントロールパネルでみるとFreeBSDとなっているんですがこれはどういうことでしょう。
いろいろOSがあるのかな。まあ練習目的だしなんでもいいけれど。

sshのport番号22でいいのかいいのか？変えよう
やっと次の動画に進める（笑）

WindwosのTera Termからはポート開放せずにできたけれどもなんだろう。Macからターミナル接続できるようになりました。
TerraformでDigitalOcean上にdroneを作成


# 概要
TerraformでDigitalOcean上にdroneを作成

# 説明
## terraform 
 Terraform は、インフラの構築・変更・バージョン変更を行うツール

## digitalocean
1時間1円から使えるシンプルなクラウドホスティング

## drone
drone.ioのオープンソース版
droneは、ホスト型継続的インテグレーションサービス。自動的に構築、テスト、コードに変更を加えるように展開するためにプロジェクトを設定できる.

# 前準備
参考記事
[Terraform を Digital Ocean で触ってみた (初級編)](http://qiita.com/voluntas/items/5d06157cfb01b7e2dfa5)
[TerraformでDigitalOceanのdroplet作成](http://qiita.com/masayuki_oguni/items/9092ec6e98f144a8e914)

# tarraformのプラン
```
variable "api_token" {}
variable "ssh_public_key" {}
variable "ssh_private_key" {}
variable "ssh_fingerprint" {}

provider "digitalocean" {
  token = "${var.api_token}"
}

resource "digitalocean_droplet" "drone" {
    image = "5900200"
    name = "drone"
    region = "sgp1"
    size = "512mb"
    private_networking = true
    ssh_keys = [
      "${var.ssh_fingerprint}"
    ]
    connection {
      user = "root"
      type = "ssh"
      key_file = "${var.ssh_private_key}"
      timeout = "2m"
    }
    provisioner "remote-exec" {
      inline = [
        "export PATH=$PATH:/usr/bin",
        "sudo apt-get update",
        "wget http://downloads.drone.io/latest/drone.deb",
        "sudo dpkg -i drone.deb"
      ]
    }
    provisioner "local-exec" {
        command = "echo ${digitalocean_droplet.drone.ipv4_address} >> ${digitalocean_droplet.drone.name}_ip.txt"
    }
}
```

# 実行
```
terraform apply  -var "ssh_private_key=$HOME/.ssh/id_rsa" -var "ssh_public_key=$HOME/.ssh/id_rsa.pub" -var "api_token=$DIGITALOCEAN_API_TOKEN" -var "ssh_fingerprint=$SSH_FINGERPRINT"
```
実行が成功すると実行ディレクトリに以下のファイルが作成されます
drone_ip.txt
書いてあるIPを使用して,以下のページを表示すると初期設定ができます
 http://ip/install

# メモ
+ image = "5900200"は2014/09/21のdocker インストール済みイメージのため適当に修正してください。
Homekit使ってて出るエラー

```
 0     case AlreadyExists
 1     case NotFound
 2     case InvalidParameter
 3     case AccessoryNotReachable
 4     case ReadOnlyCharacteristic
 5     case WriteOnlyCharacteristic
 6     case NotificationNotSupported
 7     case OperationTimedOut
 8     case AccessoryPoweredOff
 9     case AccessDenied
10     case ObjectAssociatedToAnotherHome
11     case ObjectNotAssociatedToAnyHome
12     case ObjectAlreadyAssociatedToHome
13     case AccessoryIsBusy
14     case OperationInProgress
15     case AccessoryOutOfResources
16     case InsufficientPrivileges
17     case AccessoryPairingFailed
18     case InvalidDataFormatSpecified
19     case NilParameter
20     case UnconfiguredParameter
21     case InvalidClass
22     case OperationCancelled
23     case RoomForHomeCannotBeInZone
24     case NoActionsInActionSet
25     case NoRegisteredActionSets
26     case MissingParameter
27     case FireDateInPast
28     case RoomForHomeCannotBeUpdated
29     case ActionInAnotherActionSet
30     case ObjectWithSimilarNameExistsInHome
31     case HomeWithSimilarNameExists
32     case RenameWithSimilarName
33     case CannotRemoveNonBridgeAccessory
34     case NameContainsProhibitedCharacters
35     case NameDoesNotStartWithValidCharacters
36     case UserIDNotEmailAddress
37     case UserDeclinedAddingUser
38     case UserDeclinedRemovingUser
39     case UserDeclinedInvite
40     case UserManagementFailed
41     case RecurrenceTooSmall
42     case InvalidValueType
43     case ValueLowerThanMinimum
44     case ValueHigherThanMaximum
45     case StringLongerThanMaximum
46     case HomeAccessNotAuthorized
47     case OperationNotSupported
48     case MaximumObjectLimitReached 
49     case AccessorySentInvalidResponse
50     case StringShorterThanMinimum
51     case GenericError
52     case SecurityFailure
53     case CommunicationFailure
54     case MessageAuthenticationFailed
55     case InvalidMessageSize
56     case AccessoryDiscoveryFailed
57     case ClientRequestError
58     case AccessoryResponseError
59     case NameDoesNotEndWithValidCharacters
60     case AccessoryIsBlocked
61     case InvalidAssociatedServiceType
62     case ActionSetExecutionFailed
63     case ActionSetExecutionPartialSuccess
64     case ActionSetExecutionInProgress
65     case AccessoryOutOfCompliance
66     case DataResetFailure
67     case NotificationAlreadyEnabled
68     case RecurrenceMustBeOnSpecifiedBoundaries
69     case DateMustBeOnSpecifiedBoundaries
70     case CannotActivateTriggerTooFarInFuture
71     case RecurrenceTooLarge
72     case ReadWritePartialSuccess
73     case ReadWriteFailure
74     case NotSignedIntoiCloud
75     case KeychainSyncNotEnabled
76     case CloudDataSyncInProgress
77     case NetworkUnavailable
78     case AddAccessoryFailed
79     case MissingEntitlement
```
markdown2bootstrapの変換でコードがQiita書式に対応していなかったので修正した


ちょっと頑張ったけど全然ダメな箇所もあって力尽きた。

* [成果物 download](https://github.com/tukiyo/markdown2bootstrap)

## 修正内容

![before_after.png](https://qiita-image-store.s3.amazonaws.com/0/25728/fc8c1652-949c-1df2-2696-faf266f578ef.png "before_after.png")



# オリジナルの使い方

* [renier/markdown2bootstrap](https://github.com/renier/markdown2bootstrap)

```bash:インストール
npm install markdown2bootstrap
```

```bash:markdown->html変換
cp -a node_modules/markdown2bootstrap/bootstrap .
node_modules/.bin/markdown2bootstrap doc1.md
```

doc1.htmlが生成される。

```bash:タイトルを付けたい場合
node_modules/.bin/markdown2bootstrap -h true doc1.md
```
wgetのオプション

クローラーとしてのwgetオプションをメモ。

# wgetオプション

```shell-session
$ wget -r -l1 -w2 --random-wait -A jpg,png,gif -H -p -k http://example.com/
```

| オプション | 機能 |
|----------|------|
| -r | 再帰ダウンロードの実行 |
| -l | 最初のページからリンクを辿る回数 |
| -w N | ダウンロードごとにN秒待つ |
| -random-wait | -wで指定した数の0.5〜1.5倍の時間待つ |
| -A LIST | 拡張子で指定したファイルのみを取得 |
| -H | 他のドメインもクロールする |
| -p | HTMLを表示するのに必要な画像・音声やCSSなどもダウンロード |
| -k | ダウンロードしたファイルを相対URLに変換してくれる |
PHPでもがんばるぞい

完全にインスパイアされた: [Ruby - 今日も1日がんばるぞい！ - Qiita](http://qiita.com/giiko_/items/8c3442e8e7a83cc0b91a)

```php
<?
$dic = [["今日","ぞい"],["も"],["1","ぞい"],["日","ぞい"],["がん","ぞい"],["ばる","ぞい"],["ぞい！"]];
$i=0;
do{
  $res='';
  foreach($dic as $v)
  {
    $res.=$v[array_rand($v)];
  }
  $i++;
  echo $res.PHP_EOL;
} while($res!=="今日も1日がんばるぞい！");
echo "? がんばるまで {$i} zoiでした?";

```

```shell-session:result
$ php zoi.php
ぞいも1ぞいぞいばるぞい！
ぞいも1日がんばるぞい！
今日もぞいぞいぞいばるぞい！
ぞいも1ぞいぞいばるぞい！
ぞいも1ぞいがんぞいぞい！
今日もぞいぞいぞいぞいぞい！
今日も1ぞいがんばるぞい！
ぞいも1日がんばるぞい！
ぞいもぞいぞいぞいばるぞい！
ぞいもぞいぞいぞいばるぞい！
ぞいもぞい日ぞいぞいぞい！
ぞいもぞい日ぞいぞいぞい！
ぞいもぞいぞいぞいばるぞい！
今日も1日ぞいぞいぞい！
ぞいも1ぞいぞいばるぞい！
今日もぞい日ぞいぞいぞい！
今日もぞい日ぞいばるぞい！
ぞいもぞい日ぞいばるぞい！
ぞいも1日がんぞいぞい！
今日もぞいぞいぞいばるぞい！
ぞいも1日ぞいぞいぞい！
今日もぞいぞいがんぞいぞい！
ぞいも1ぞいがんばるぞい！
ぞいもぞいぞいぞいぞいぞい！
ぞいもぞい日がんぞいぞい！
今日も1日がんばるぞい！
? がんばるまで 26 zoiでした?
```

ごめんなさい丸パクリでした。

##がんばる！

![](https://pbs.twimg.com/media/BswuTdaCQAAQCkg.jpg:large)
今日も1日がんばるぞい！

![スクリーンショット 2014-09-21 4.18.16.png](https://qiita-image-store.s3.amazonaws.com/0/29945/be56fe5b-4ea6-ae86-311b-0c28663b02e1.png)


```rb
# -*- encoding: utf-8 -*-
dic = [["今日","ぞい"],["も"],["1","ぞい"],["日","ぞい"],["がん","ぞい"],["ばる","ぞい"],["ぞい！"]]
count = 0

loop do
    arr = dic.map do |arr|
        arr.sample
    end
    puts arr.join
    count += 1
    break if arr.join == "今日も1日がんばるぞい！"
end

puts "? がんばるまで #{count} zoiでした?"
```


###がんばる

![zoi.png](https://qiita-image-store.s3.amazonaws.com/0/29945/9e4bd52c-3fc3-a7c2-e8d2-b9911db5b5c8.png "zoi.png")
Unityで超シンプルで超カンタンに”揺れもの”の実装

今回は、「揺れもの」について。

ひとむかし前は、「揺れもの」ってちょっとだけハードルが高いものだったんだけども、Unityの登場ですっごく身近なものになりました。
そんな「揺れもの」について説明します。

※揺れものとは、3DCGで髪の毛、スカート、カーテン、振り子など
読んで字のごとく物理シュミレーションで揺れる表現をする総称です。

以下から解説！
--

今回使うのは、Fixed JointとHinge Joint(ヒンジ)を使いました。
http://docs-jp.unity3d.com/Documentation/Components/class-HingeJoint.html

![スクリーンショット 2014-09-21 2.40.04.png](https://qiita-image-store.s3.amazonaws.com/0/38279/ba81cfbc-bdee-6cb1-118f-27346fb5473c.png)
※鉄球と鎖にはRigidbodyをつけてください。

サンプル画像のように鎖にくっついた鉄球を揺らす表現を作ります。
鉄球と鎖は適当な感じで用意しています。
![スクリーンショット 2014-09-21 2.54.46.png](https://qiita-image-store.s3.amazonaws.com/0/38279/3cfb3af8-5e41-428c-278f-0dbfd9860331.png)



鉄球と鎖を選択して、Fixed Jointを選択。
これで、鉄球と鎖が固定化されました。
![スクリーンショット 2014-09-21 2.55.55.png](https://qiita-image-store.s3.amazonaws.com/0/38279/45d6261d-b321-6122-56e8-d69a183e9c9e.png)

次に鎖と鎖をつなぐには、Hinge Jointを使います。
![スクリーンショット 2014-09-21 2.57.30.png](https://qiita-image-store.s3.amazonaws.com/0/38279/8cddd760-0658-1475-904e-3ed37f695379.png)


鎖を選択して、Hinge Joint。
InspectorのConnected Bodyに次の鎖（つなぎたいオブジェクト）を入れる。
この鎖を鎖がある分繰り返します。
また、当然ですが最後の鎖には、Connected Bodyは入れなくて問題ありません。
![スクリーンショット 2014-09-21 2.58.43.png](https://qiita-image-store.s3.amazonaws.com/0/38279/87d748d7-5d3b-c12e-6890-63a3e7b4f3cd.png)

はい！これで終わります。
はやい！しかも、スクリプトいっさい不要でした！

＜出来上がりの動画＞
http://youtu.be/zMlUAIKQBOg 


＜Hinge Jointの設定について＞
Ancher:軸の位置
Axis:軸の方向
Use Spring;ばね運動をするかどうか
Spring:ばねの戻ろうとする力
Damper:ばねの重さ
Target Position:戻る時の力
Use Moter：Jointへ常に力を加えた状態にする。
rbenv を使っているなら rbenv-gem-rehash を使おう

#すぐさま rbenv-gem-rehash を入れよう
Qiita で「rbenv を使って Ruby をインストールした」記事は **毎日1回以上** あります。にも関わらず、そのほとんどが「Rails などをインストールしたら `rbenv rehash` します」と書いている。
**なぜ rbenv-gem-rehash を入れないんだ。**

>Never run rbenv rehash again. This rbenv plugin automatically runs rbenv rehash every time you install or uninstall a gem.
もう二度と `rbenv rehash` しなくていい。 gem をインストール/アンインストールする度に、この rbenv プラグインが自動的に `rbenv rehash` する。
[sstephenson/rbenv-gem-rehash](https://github.com/sstephenson/rbenv-gem-rehash)

#インストール
もちろん rbenv インストール済みとします。
##Mac以外

```bash
$ git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
```
##Mac で Homebrew を使って rbenv をインストールした場合

```bash
$ brew install rbenv-gem-rehash
```
#もう rbenv rehash を忘れても良いんだ！
忘れちまえ！

# 2014/12/25追記：
[この Pull Request で rbenv-gem-rehash プラグインが不要になった](https://github.com/sstephenson/rbenv/pull/638)との[投稿](http://qiita.com/dagezi/items/e95b5c6dee6a9728e8c6#comment-9ed84c38709ad6d077ee)もみました（状況未確認）。
初めてPHPのフレームワーク（Yii）を使ってみる　その５

会員情報登録フォームがなんとなく完成に近づいてきました
しかし、郵便番号の横にある「あのボタン」がありません！
というわけで、今回はYiiでのjavascriptの組み込み方、呼び出し方を勉強します

***

#郵便番号から住所を補完するjavascript
郵便番号から住所を補完するJavaScriptはたくさんあるようだが、今回はコレを採用
[JavaScriptで郵便番号を住所に変換（DB不要、Google日本語入力APIからJSONPで取得） - GAddress Finder](http://0-oo.net/sbox/javascript/gaddress-finder)
gaddress-finder.jsをダウンロードして/htdocs/ec_site/js/フォルダにおさめる

使い方は、GAddressFinder.set()の第１引数に郵便番号フィールドのID、第２引数に住所フィールドのIDを入れるだけ
しかし、引数を渡さないといけないせいで、`		<?php echo CHtml::button('住所入力', array('title'=>'住所入力', 'onclick'=>'adressFinder.set("zip","address");')); ?>`がうまくエスケープできない。バックスラッシュでエスケープできないかとか、色々試してみたが、なんだかうまくいかない。
行き詰まっていたところ、とある方からアドバイスをいただき、すんなりと解決した

#Yiiにjavascriptを組み込む
こちらが大変参考になった
[Yii JavaScriptソース、ファイルの組み込みについて](http://web.mt-systems.jp/archives/421)
[How to use JavaScript with CHtml button() on a Yii page](http://stackoverflow.com/questions/15149796/how-to-use-javascript-with-chtml-button-on-a-yii-page)

javascriptを呼び出すところは、viewかcontrollerがいいらしい
今回はフォームで使うのでもちろん_form.phpで呼び出す
CClientScript::POS_HEADと指定することで、ファイル内のどこに書いても、&lt;head&gt; &lt;/head&gt;内で呼び出してくれる
後半の直書きしているスクリプトはJQueryで、IDがaddressFinder1のボタンをクリックした時にGAddressFinder()が実行される。これだと引数も自由に渡せる

```php:/userProfile/_form.php
<?php
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/js/gaddress-finder.js', CClientScript::POS_HEAD);
Yii::app()->clientScript->registerScript('register_gaddress_finder', "
	$('#addressFinder1').click(function () {
		GAddressFinder.set('UserProfile_zipcode', 'UserProfile_address');
	});
	$('#addressFinder2').click(function () {
		GAddressFinder.set('UserProfile_deliverable_zipcode', 'UserProfile_deliverable_address');
	});
", CClientScript::POS_READY); // ここをPOS_READYにしないと動かないので注意
?>

...

	<div class="row">
		<?php echo $form->labelEx($model,'zipcode'); ?>
		<?php echo $form->textField($model,'zipcode',array('size'=>10,'maxlength'=>10)); ?>
		<?php echo $form->error($model,'zipcode'); ?>
		<?php echo CHtml::button('住所入力', array('title'=>'住所入力', 'id'=>'addressFinder1')); ?>
	</div>

...

	<div class="row">
		<?php echo $form->labelEx($model,'deliverable_zipcode'); ?>
		<?php echo $form->textField($model,'deliverable_zipcode',array('size'=>10,'maxlength'=>10)); ?>
		<?php echo $form->error($model,'deliverable_zipcode'); ?>
		<?php echo CHtml::button('住所入力', array('title'=>'住所入力', 'id'=>'adsressFinder2')); ?>
	</div>

...
```

***

これで、郵便番号を入力して横のボタンをポチッとするだけで、あ～ら簡単、住所が入力されました。
ページのHMLを確認すると、ちゃんとjQueryも読み込んでくれています。
次は、...
まだ決めてないですｗｗ
Macでデフォルトのアプリケーションを変更する


備忘録として

mdファイルを開くときのデフォをMouでなくて、Macdownにしたいと思ったので、

1.右クリック
2.「情報を見る」
3.「このアプリケーションで開く：」でアプリを選択
4.その後「すべてを変更...」を選択  
でデフォルトをMacdownに設定できた。


![スクリーンショット 2014-09-21 0.58.05.png](https://qiita-image-store.s3.amazonaws.com/0/17535/3299664f-c379-0316-474f-c514409d83bc.png "スクリーンショット 2014-09-21 0.58.05.png")
![スクリーンショット 2014-09-21 0.58.42.png](https://qiita-image-store.s3.amazonaws.com/0/17535/f5eac3bf-becb-20fd-cd9e-d1533d6d302f.png "スクリーンショット 2014-09-21 0.58.42.png")
![スクリーンショット 2014-09-21 0.59.20.png](https://qiita-image-store.s3.amazonaws.com/0/17535/e2e59e4c-fae4-f316-a12f-39a1c7a0f6ee.png "スクリーンショット 2014-09-21 0.59.20.png")

参考記事：  
http://tokyo.secret.jp/macs/app_change.html
tabplot

こんにちは。
[tabplot](http://cran.r-project.org/web/packages/tabplot/index.html) を見てなるほどと思いました（= a rectangular stacked histogram)。

そこで自分でもPythonを使って書いて見ました。また第一種過誤（α）対第二種過誤（β）のプロットでは検定の性能の挙動が見られます[^1]。

[^1]: なお検出力（１ーβ）をプロットするとROC曲線です。

![tabplot.jpg](https://qiita-image-store.s3.amazonaws.com/0/54617/f33ca503-1187-ecea-b0f9-3a0dc21b3922.jpeg)

```python
import pylab

def tabbar(data):
    import random
    n = len(data)
    target = [list(map(lambda x: [x, i], y)) for i, y in enumerate(data)]
    target = sum(target, [])
    random.shuffle(target)
    target.sort(key=lambda x:x[0])
    histdata = [[] for i in range(n)]
    for i in range(len(target)):
        histdata[target[i][1]] += [float(i) / (len(target) - 1)]
    return histdata

data = [mu + sigma*pylab.randn(n) for mu, sigma, n in zip([0.15, 0.25], [0.04,0.05], [5000,15000])]
#pylab.hist(data, histtype='barstacked', rwidth=1)
pylab.hist(tabbar(data), histtype='barstacked', rwidth=1)
pylab.show()

```
iOS8アップデートでアプリへのプッシュ通知でハマる点

iOS7対応で既に盛大に苦しんだ方はハマってないはずですが…
iOS8でAPNsへデバイス登録する際のメソッドが変わった、とは別の話です。

※予めお断りしておきますが、検証は各自でお願いします。
（自分はiOS Appのdeveloperでもなんでもないです）

## iOS8アップデートとプッシュ通知

アプリをインストールした状態でiOSをアップデートした場合にプッシュ通知でハマる場合がある

### こんなアプリがハマる

アプリ内部にデバイストークンが無い場合のみAPNsにデバイス登録&トークン発行するアプリ
（実質、初回起動時のみしかデバイス登録しないタイプのアプリ）

### なぜハマるか

iOSアップデート後、再度APNsへのデバイス登録を行わなければプッシュ通知が行えない
※ちなみに再登録後のデバイストークンはiOSアップデート前と同じ

なので、APNsへのデバイス登録が必要なのだが、上記のハマるタイプのアプリでは、
iOSアップデートしてもアプリの内部データはそのままのため、
内部にトークンがあると認識しているので再度のデバイス登録は行わない

つまり、再度デバイス登録を行いたいのに、そのためのトリガーが無いという状態になる

### 必要な対応

再度デバイス登録を行うためのトリガーを、内部デバイストークンの有無とは別に設計する
公開がiOSアップデートに間に合わなかった場合はアプリのアップデートで対応する


## AWSのSNSで通知を送っている場合

盛大に二重にハマる可能性がある

### こんなサーバサイドアプリがハマる

上記iOS8対応が後手になってしまった場合、かつ、
再インストール/リセマラ対策してないサーバサイドアプリ
（get-endpoint-attributes→delete-endpoint→create-platform-endpoint）

### なぜハマるか

SNSでは、何度か通知に失敗した場合、endpointがdisableになる
※一度disableになってしまったendpointは、以降どれだけpublishしてもAPNsが叩かれることはない

前述の通り、デバイスを再度APNsに登録した場合でも、デバイストークンは文字列上変化が無いため、SNSのendpointも変化なし

既にendpointがある状態で同一のトークンでcreate-platform-endpointしてもendpointは作り直されないため、disableの状態は続く

iOSアプリ側の8対応が後手になってしまった場合、アップデート公開までにdisableなendpointが大量生産されているはず

### 必要な対応

再インストール対策を取ると同時に、disableになってしまったendpoint全てについて、
get-endpoint-attributes→delete-endpoint→create-platform-endpointによるendpointの作り直し、または
set-endpoint-attributesでEnabled=trueにして復活させる


## 追記

改めてPush Notificationプログラミングガイドを読んでみると、
https://developer.apple.com/jp/devcenter/ios/library/documentation/RemoteNotificationsPG.pdf

* アプリを起動するたびにトークンのリクエスト（デバイス登録）をしなければならない
* デバイストークンはOSがキャッシュしているのでアプリではキャッシュするべきでない

と書いてあった。。。

とはいえ、ガイド通りに実装していた場合でも周りの様子を察するに、
iOSアップデート後、初回起動（をトリガーとしたデバイス登録が完了する）まで、プッシュ通知は有効にならない様子。
Supervisorの起動スクリプト


最新版の [Supervisor](http://supervisord.org/) を pip でインストールした際に起動スクリプトが無かったので、[こちら](https://gist.github.com/mhayes/866900)を参考に作成しました。

```bash:/etc/init.d/supervisord
# Source function library.
. /etc/rc.d/init.d/functions

supervisorctl="/usr/bin/supervisorctl"
supervisord="/usr/bin/supervisord"
name="supervisor-python"

[ -f $supervisord ] || exit 1
[ -f $supervisorctl ] || exit 1

RETVAL=0

start() {
    echo -n "Starting $name: "
    $supervisord -c /etc/supervisord.conf
    RETVAL=$?
    if [ $RETVAL -eq 0 ]
    then
      echo -e "SUCCESS"
    else
      echo -e "FAILED"
    fi
    return $RETVAL
}

stop() {
    echo -n "Stopping $name: "
    $supervisorctl shutdown
    RETVAL=$?
    if [ $RETVAL -eq 0 ]
    then
      echo -e "SUCCESS"
    else
      echo -e "FAILED"
    fi
    return $RETVAL
}

status() {
  $supervisorctl status
}

case "$1" in
    start)
        start
        ;;

    stop)
        stop
        ;;

    restart)
        stop
        count=0
        while [ $count -ne 30 ]
        do
            ret=`$supervisorctl status > /dev/null 2>&1 ; echo $?`
            if [ $ret -eq 0 ]
            then
                echo -e ""
                break
            fi
            echo -n "."
            count=`expr $count + 1`
            sleep 1s
        done
        start
        ;;

    status)
        status
        ;;
esac

exit $REVAL
```
Macでinstalldが暴走したらstoreagentを殺せ

しばらくオフっていたMacbook Airを起動してしばらく待っていると、ファンが突然全力で回転を初めて、機体がとても熱くなったまま収まる気配がなくなってしまった。

##ひとまずアクティビティモニタを開く

アクティビティモニタを起動すると、installdがCPU 300%を使ってますと。
確かにしばらく起動してなかったから何かしらのアップデートが行われようとしているんだろうが、それにしてもこんなにCPUが張り付くことはないはず。

AppStoreでは、OSXとXcode、それからMS OneNoteのアップデートを使用としていた。
怪しいのは前者２つ、しかもXCodeの方が怪しい。
OSXのアップデートでこんなことになっているならもっと話題になってそうだから。

##Google先生に聞く

先生に尋ねた所、次のような事を教えてくれた。
http://scheyeniam.blogspot.jp/2011/08/how-to-revive-mac-app-store-when-its.html

AppStore関連のエージェントがXCodeインストール時に何だかうまくいなかくなるらしい。
（ちゃんと読んでない）

とりあえずゾンビを殺せ（なんか矛盾している言い方だな）ということらしい。

##ゾンビを殺す

殺すお目当てはstoreagent

1. AppStoreを開いているのであれば終了しておく
2. アクティビティモニタを開く
3. 右上の検索でstoreagentを探す
4. storeagentをリストから選択して左上の強制終了ボタンで停止
5. AppStoreを再度起動してアップデートを再開する

ひとまず私はこれで無事に全てのアップデートが完了しました。
PHImageManager - requestImageForAsset が二回 handler を呼ぶ事案

新生 `ALAssetsLibrary` であるところの `PHPhotoLibrary` ですが、まあ互換性をぶち壊したのもさることながら多少理解し難い API にもなっている所があります。

### `- requestImageForAsset` が二回 handler を呼ぶ

`PHImageManager - requestImageForAsset:targetSize:contentMode:options:resultHandler:` こいつの `resultHandler` は二回以上呼ばれます。

というのも、解像度が低い画像を先に渡して、あとから取得した解像度の高い画像を渡す、という仕様になっているようです。
想定用途は、「画像の取得には時間がかかるから、サムネイルを表示してお茶を濁してくれ」ということらしいですね。

また、二回と書きましたが取得するサイズによっては数回に渡って `resultHandler` を渡す可能性があります。

というわけで、画像を取ってきて xx する、といった処理にこいつを使うと想定外の動作をする可能性があります。注意が必要です。
冪等な操作でも、例えばフィルタ等重い処理が複数回走るとアプリの体験を損なう可能性があります。

これを防止する方法としては、次の 3 つがあります。

#### 解決策1 - `info` の `PHImageResultIsDegradedKey` を見る

`resultHandler` の第二引数である `info` に、 `PHImageResultIsDegradedKey` で `BOOL` が入っているのでこいつを見ます。
コードとしては、

```objc
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage *result, NSDictionary *info) {
    BOOL isDegraded = [info[PHImageResultIsDegradedKey] boolValue];
    if (isDegraded == YES) { return; }

    // なんかする
}];
```

### 解決策2 - `PHImageRequestOptions` で `deliveryMode` を設定する

Option の `deliveryMode` でこれを制御しているらしいので、こいつを `PHImageRequestOptionsDeliveryModeHighQualityFormat` に設定すれば必ず指定したサイズの画像を持ってきてくれるようになります。

コードとしては

```objc
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
    
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage *result, NSDictionary *info) {
    // なんかする
}];
```

### 解決策3 - `- requestImageDataForAsset` を使う

`- requestImageDataForAsset:options:resultHandler:` は今の所一回しか呼ばないような感じなので、こっちを使うと変に悩みません。ただしサイズの指定は出来ません。

### まとめ

次は Apple 様が `ALAssetsLibrary` をぶち壊しになられた事案について書きたいと思います。

#### 参考資料

- Image Result Info Keys - PHImageManager Class Reference : https://developer.apple.com/library/ios/documentation/Photos/Reference/PHImageManager_Class/index.html#//apple_ref/doc/constant_group/Image_Result_Info_Keys
RubyMotionでAndroidアプリを試してみる


rubymotionがpublic betaでAndroidに対応しました。

せっかくなので、さっそく試してみました。

基本的にdeveloper centerのドキュメント通りにやっていればできますが、ちょっと素直につまづいたところもあるので念のため

# RubyMotionでAndroidをつかえるようにする

まだpublic betaなので、以下のコマンドで使ってAndroid beta版をインストールします

```shell-session:
$ sudo motion update --pre
```

# SDKとNDKの設定

.bash_profile等に以下を書いて、SDKとNDKの設定をします。

```bash:
export RUBYMOTION_ANDROID_SDK=~/android-rubymotion/sdk
export RUBYMOTION_ANDROID_NDK=~/android-rubymotion/ndk
```

これは、使っているAndroidのSDK/NDKの場所を指定してあげればいいと思いますが、
developer centerにも書いてあるとおり、Mac OS X 64bit NDKの32bitターゲットを使ってください。64bitターゲット版は対応してないので、使わないでください。
僕はNDKを入れ直しました。

# プロジェクト作成とビルド

```shell-session:
$ motion create --template=android Hello
```

とすると、Helloというプロジェクトを作成します。
そして、

```shell-session:
$ cd Hello
$ rake
```

でビルドができます。

ただ、自分の環境だと、SDKのバージョンがandroid-Lになってしまうのですが、ndkの32ビットターゲットはandroid-Lに対応してないので、

```shell-session:
    ERROR! It looks like your version of the NDK does not support API level L. Switch to a lower API level or install a more recent NDK.
```

と出てしまいました。
そこで、使用するSDK versionを19に変更して対応しました。
Rakefileにapi_versionを書いてあげればよいです。

```ruby:Rakefile
Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'Hello'
  app.api_version = '19'
end
```

これで、お使いの端末をつなげる、もしくはエミュレータを起動してRakeコマンドを叩けばアプリを動かせます。

# サンプル

サンプルは下記にあるので、参考にするといいでしょう。
https://github.com/HipByte/RubyMotionSamples/tree/master/android

見てみると、RubyでAndroidのアプリを書く感じがわかります。
Android開発をしている人は、SDKの使い方のノウハウがそのまま生かせそうです。
GulpでTypeScriptとSASS/COMPASSをコンパイルする

GulpでTypeScriptとSASS/COMPASSをコンパイルするタスクを書きました。

使用しているgulpのプラグインは

[gulp-tsc](https://github.com/kotas/gulp-tsc)
[gulp-compass](https://github.com/appleboy/gulp-compass)
[gulp-plumber](https://github.com/floatdrop/gulp-plumber)
[gulp-watch](https://github.com/floatdrop/gulp-watch)

```js:gulpfile.js

var gulp = require('gulp');
var typescript = require('gulp-tsc');
var compass = require('gulp-compass');
var plumber = require('gulp-plumber');

//TypeScriptのタスク
gulp.task('typescript',function(){
	gulp.src(['src/ts/**/*.ts'])
		.pipe(plumber()) //エラーしてもウォッチを途中でやめないための処理
		.pipe(typescript({module:"amd"})) //コンパイルする処理 moduleで出力するモジュールを指定
		.pipe(gulp.dest('src/js')); //ファイル出力先を指定
});

//Compassのタスク
gulp.task('compass',function(){
	gulp.src(['../stylesheets/sass/**/*.scss'])
		.pipe(plumber())
		.pipe(compass({ //コンパイルする処理
			config_file : '../stylesheets/sass/config.rb',
			comments : false,
			css : '../stylesheets',
			sass: '../stylesheets/sass/'
		}));
});

//watchのタスク
gulp.task('watch',function(){
	gulp.watch('src/ts/**/*.ts',function(event){
		gulp.run('typescript');
	});
	gulp.watch('../stylesheets/sass/**/*.scss',function(event){
		gulp.run('compass');
	});
});

//defaultで実行するタスクを設定
gulp.task('default',function(){
	gulp.run('watch');
});

```

Gruntに比べるとjavascriptらしく書けるので結構使いやすい。
gulp-plumberはエラーが起きても途中で止まらないようにするプラグインで.pipe(plumber())をコンパイルする前に追加する。
リーンスタートアップ説明資料


## はじめに

リーンスタートアップについてチームのメンバーに伝えるための個人的な資料です


## まずは資料(SlideShareより)

http://www.slideshare.net/leanstartupjp/ss-8602991?next_slideshow=2

<iframe src="//www.slideshare.net/slideshow/embed_code/8602991" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/leanstartupjp/ss-8602991" title="はじめてのリーンスタートアップ" target="_blank">はじめてのリーンスタートアップ</a> </strong> from <strong><a href="//www.slideshare.net/leanstartupjp" target="_blank">Lean Startup Japan LLC</a></strong> </div>

## なぜリーンスタートアップが生まれたのか

従来のマネジメント
ロケットの打ち上げ : 精密に計画を立てて、リソースを投入してプロダクトを開発する
(計画・仮説が正しいことが前提)

リーンスタートアップ
車の運転 : プロジェクトを走らせながら仮説を検証し、都度計画を見直しながら進む
(計画・仮説を常に検証し続ける前提)


スタートアップのような、まだ世に存在しないプロダクトを作る場合、

- そもそも市場やら競合やらの正確なデータがない
	- やってみないとわからない部分が多い
- 資金がない
	- つまり時間がない

→ 今までのマネジメント手法では上手くいかなかった

なので、上記(スタートアップ)のような条件で上手くマネジメントできる手法が編み出された

## 考え方

![zu01.jpg](https://qiita-image-store.s3.amazonaws.com/0/7694/0a930e4a-17a8-0cf9-4521-fbda03084250.jpeg "zu01.jpg")

- 小さな失敗を重ねる
	- 結果的にムダを省く
- 顧客開発モデル + アジャイル開発
	- 顧客開発: 「建物の外に出よ」

## 大まかなフェーズ

### 1, 課題/解決フィット

解決に値する課題はあるか？

* それは顧客が必要としているものですか？ (必要性)
* 顧客はお金を支払ってくれますか？(あるいは誰が) (成長性)
* それは解決可能ですか？ (実現性)

定性的な顧客観察
インタビュー

→ MVPを作るための"最低限の機能"を引き出す



### 2, 製品/市場フィット

誰かに必要とされるものを構築したか？

* MVPを構築し、どれだけ課題を解決しているかテストする

### 3, スケール

どうやって成長を加速させるのか？

## 参考

![ダウンロード.jpeg](https://qiita-image-store.s3.amazonaws.com/0/7694/89938e44-2724-fc07-e9e0-94efab74644d.jpeg "ダウンロード.jpeg")

![ダウンロード (1).jpeg](https://qiita-image-store.s3.amazonaws.com/0/7694/6a8fbed7-6de9-bac7-1e02-49d0cbc7d5fc.jpeg "ダウンロード (1).jpeg")
Android で jquery.customSelect を使う際に気をつけること


http://adam.co/lab/jquery/customselect/

```select ``` 要素を装飾するときに使うプラグインです。

非常に便利ですが、Android4.x系で使う際は要注意。

## タップのハイライトの高さが要素いっぱいにならない

このプラグインは、適用した ```select``` 要素に ```-webkit-appearance: menulist-button;``` を指定するのですが、
Android4.x系ではこの指定がされた要素には ```height``` が効かないみたいです。

そのため文字サイズ分の高さしか確保できず、表示上のセレクトボックスの高さとタップハイライトのエリアが合わなくなってしまう。

## 解決法

```css
jquery.customSelect を適用した要素 {
	-webkit-appearance: none !important;
}
```
warp clock

systemdに`clock_reset_timewarp` ([当該コード](http://cgit.freedesktop.org/systemd/systemd/tree/src/shared/clock-util.c#n139)) という謎の処理を行なう関数があったので調べてみた。

settimeofday(2)でタイムゾーンを設定するだけの処理だけど、そこに書かれているコメントが意味深なのである。

```c:src/shared/clock-util.c
        /*
         * The very first call to settimeofday() does time warp magic. Do a
         * dummy call here, so the time warping is sealed and all later calls
         * behave as expected.
         */

```

これが何を意味しているのかはsettimeofday(2)の[マニュアル](http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/gettimeofday.2.html) ([英語版](http://linux.die.net/man/2/settimeofday)) に書いてあるのだが、Linuxのsettimeofdayは妙な動作をするらしい。

>Linux では、 settimeofday() システムコールに関連して、独特の「クロックのズレ (warp clock)」が存在する場合がある。 これは (ブート後の) 最初の呼び出しで tz 引き数が NULL でなく、 tv 引き数が NULL で tz_minuteswest フィールド が 0 でない場合に起こる (この場合 tz_dsttime フィールドは 0 にすべきである)。 このような場合、 settimeofday() は CMOS クロックが地方時 (local time) であり、 UTC システム時間を得るためには、tz_minuteswest の分だけ増加させなくてはなら ないとみなしてしまう。 疑いもなく、この機構を使うことは良い考えではない。
> [Man page of GETTIMEOFDAY](http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/gettimeofday.2.html)より引用

ちょっと分かりにくいが、どうもLinuxはブート直後の最初のsettimeofday(2)でCMOSの時間がローカルタイムかどうか判定しているらしい。そして、ローカルタイムと判断した場合は、以降のgettimeofday(2)でローカルタイム補正をした値を返すようになるようだ。systemdは補正がかからないようにするために0 (`DST_NONE`)を設定している。(普通は補正はユーザランドでやるはず。)

initならではの処理だなーと思った。
[Swift]Xcode6.1で確認済み！Hello Worldの次に試したい！超簡単にFacebook投稿 ！

### 参考サイト

[[最新版]Xcode6 Version 6.0.1で確認済み！SwiftをHello Worldする方法](http://qiita.com/g08m11/items/6c9264fddde2379371fe)

[[Swift]Xcode Version 6.0.1で確認済み！Hello Worldの次に試したい！超簡単にwebViewを表示してみる](http://qiita.com/g08m11/items/7ca36a6782e7f10a8237)


## 1・新規ProjectをSingleViewで作成する

ここではFacebookSampleというプロジェクト名で作成しています。


![スクリーンショット 2014-09-20 21.37.52.png](https://qiita-image-store.s3.amazonaws.com/0/15812/4d75f2db-f720-7f98-c5f2-e69c57995a7c.png)

![スクリーンショット 2014-09-20 21.38.18.png](https://qiita-image-store.s3.amazonaws.com/0/15812/2800164b-496a-7eb7-c77d-2858fe57b5df.png)

![スクリーンショット 2014-09-20 21.38.31.png](https://qiita-image-store.s3.amazonaws.com/0/15812/ebc44f49-7e4f-64db-a88a-0f68a54d8d7e.png)



## ２・view Controllerを以下のように修正する。（画面のボタンなどはソース内で生成しています。）

```swift
//
//  ViewController.swift
//  FacebookSample
//
//  Created by g08m11 on 2014/09/20.
//  Copyright (c) 2014年 Bloc. All rights reserved.
//

import UIKit
import Social

class ViewController: UIViewController {
  
  var myComposeView : SLComposeViewController!
  
  override func viewDidLoad() {
    
    super.viewDidLoad()
    
    // Facebook用のUIBUtton作成。この時varを省略すると未初期化ということでエラーとなるので注意。
    var myFacebookButton = UIButton(frame: CGRectMake(0, 0, 200, 50))
    myFacebookButton.backgroundColor = UIColor.lightGrayColor()
    myFacebookButton.setTitle("Facebook", forState: UIControlState.Normal)
    myFacebookButton.setTitleColor(UIColor.redColor(), forState: UIControlState.Normal)
    myFacebookButton.addTarget(self, action: "postToFacebook:", forControlEvents: UIControlEvents.TouchUpInside)
    myFacebookButton.layer.cornerRadius = 20.0
    myFacebookButton.layer.position = CGPointMake(self.view.frame.width/2, 200)
    
    // buttonをviewに追加
    self.view.addSubview(myFacebookButton)
  }
  
  func postToFacebook(sender : AnyObject) {
    
    //ServiceTypeをFacebookに指定。
    myComposeView = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
    
    //投稿するテキストを指定
    myComposeView.setInitialText("こちらはSwiftでiosシュミレータから送られています")
    
    //投稿する画像を指定
    myComposeView.addImage(UIImage(named: "kura.png"))
    
    //myComposeViewの画面遷移
    self.presentViewController(myComposeView, animated: true, completion: nil)
  }
  
  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }
}

```

### point
 - import Socialが必要
 - 画面遷移にpresentViewControllerを使用


## ３・用意した画像、テキストが表示されれば成功


![text_sample_1.gif](https://qiita-image-store.s3.amazonaws.com/0/15812/1edea466-94da-bf64-8786-9ecd2405b223.gif)


<br>
9/15の歌姫庭園で頒布してわかったこと(キャッチコピーについて)

# 経緯
* チラシをサークル周囲に展開しているが、認知の手段として弱い。
* チラシをみて興味を持たせる前に、認知させる第一弾の手段が必要である。

# 制約
* 声に出せないものはすべきではない。
* 超恥ずかしい
* 大声を連発すると一気に体力を消耗する

# 知見
* 体力消耗を鑑みて、終売まで保たせるために、連続発生はピーク時にとどめるべきである。
* 連続で2時間が限度であり、それを超えると行動の続行に問題が生じる
* 5.7.5のリズムを重視すべきである。
* 声に出せない恥ずかしいセリフはチラシに書くべきである。
* チラシはabout6枚展開できる。1枚はお品書きにあてるので残り5枚に書くべき。

# で、結局どうなった
* 「100円で3回使える 実際 実用的」
東京メトロ オープンデータ活用コンテスト サンプルコードのデモ 他

# 東京メトロ オープンデータ活用コンテスト

[東京メトロ１０周年](http://tokyometro10th.jp/)を記念して、東京メトロのオープンデータを活用したアプリケーション開発コンテストが開かれています。

- [オープンデータ活用コンテスト](http://tokyometro10th.jp/future/opendata/index.html)

上記ページによると、提供されるデータは以下のようです。

```
・東京メトロ全線の列車位置、遅延時間等に係るデータを提供
※データは1分ごとに配信
　▶ 方向(どこ方面行きか)
　▶ 列車番号
　▶ 列車種別(各停、特急、急行、快速、臨時) ※非営業列車(試運転、回送)は公開しない
　▶ 始発駅・行先駅
　▶ 所属会社(どの鉄道事業者の車両か)
　▶ 在線位置(ホーム、駅間の2区分)
　▶ 遅延時間(5分以上の遅延を「遅延」として表示)
・ 上記データに加え列車・施設に関する多様なデータを提供
（従前より東京メトロのホームページで公開している情報を、データ形式を変えて提供） 
　▶ 列車情報（列車時刻表、運賃表、駅間所要時間、各駅の乗降人員数、女性専用車両）
　▶ 施設情報（バリアフリー情報、駅出入口情報、車両ごとの最寄り施設・出入口案内）
```

面白そうですね。

## 応募
応募の際には、本名、会社名、住所などを登録しました。

2日かかる事を覚悟しろと言われましたが、１日後に登録完了メールが来ました。

## アクセストークン
登録完了メールが来たら、アクセストークンが使えるようになります。（多分）
アクセストークンは、[開発者サイト](https://developer.tokyometroapp.jp/)から取得します。

## サンプルコード
[開発者サイト](https://developer.tokyometroapp.jp/samplecode) にて、サンプルコードが公開されています。

アクセストークンの外部ファイル化を済ませたコードをアップロードしたので、よければご利用ください。

- ソース
  - [betahikaru/tokyometroapp-samplecode](https://github.com/betahikaru/tokyometroapp-samplecode)
- サンプル１のデモ on Heroku
  - http://tokyometroapp-samplecode.herokuapp.com/
  - ※YAMLファイルに定義された駅（大手町、東京）しか受け付けません。

## ニュース
APIの仕様変更や種々の連絡事項は[ニュース](https://developer.tokyometroapp.jp/news)ページに掲載されるようです。

ちなみに最新のニュースは、```公開日時 2014年09月20日(土) 01時55分00秒 +0900```という状態です。お疲れさまです。。。

## フォーラム
分からない事があったら、開発者サイトの[フォーラム](https://developer.tokyometroapp.jp/forum/forums)に質問を投稿しましょう。
ただし、中の人の内容の確認が済むまで公開されないようです。

たとえば、「作成したアプリのソースを公開しても良いか」という質問に対して、運営の方から「アクセストークンを公開しなければよい」という回答が来たりします。
基本的に情報は規約やAPI仕様のページに記載していますが、解釈が難しかったりする情報は聞いてみても良いのかもしれません。
また、障害やバグっぽい報告も結構上がっていたりします。

## おわりに
審査基準は「東京メトロをご利用になるお客様の生活がより便利でより快適になるようなアプリであるか」だそうです。
開発者用のAPIお試しページとか作って、東京メトロを使っているであろう東京在住プログラマの皆さんの役に立つよう頑張ります（？）
iOS8でUITableViewCell.contentViewに仕込んだUIGestureRecognizerから、操作元のUITableViewCellにアクセスする方法

# UITableViewCellにUIGestureRecognizerを仕込んでる人は注意したほうがいいかも

```objc++
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
```

のなかでこんなかんじに

```objc++
UILongPressGestureRecognizer *lpg = [[UILongPressGestureRecognizer alloc]
                                              initWithTarget:self
                                              action:@selector(cellLongTapped:)];
[cell.contentView addGestureRecognizer:lpg];   
```

contentViewにUILongPressGestureRecognizerなんかを仕込んで
セルをロングタップした際に、cellの中身を見てごにょごにょしたい！というときに注意です。

# UIGestureRecognizerから操作元のUITableViewCell見たいときに、iOS6,7,8でやり方が違う
```objc++
- (void)cellLongTapped:(UILongPressGestureRecognizer *)sender
{
        UITableViewCell *cell = nil;
        if (7.0 <= IOS_VERSION && IOS_VERSION < 8.0){
            //ios7.XXの処理            
            cell = (UITableViewCell *)[[sender.view superview] superview];
        }
        else{
            //iOS6,8での処理
            cell = (UITableViewCell *)[sender.view superview];
        }
}
```
上記の例だと、これでロングタップされたcellをUITableViewCellで受け取れます
なんでiOS7だけ違うんだろう・・？？
9/15の歌姫庭園で頒布してわかったこと(併売について)

# 前提
* デレマスの同人誌を頒布している同人作家は東方の同人誌を頒布していた経歴がある
* 弊サークルでは東方Projectsの同人作品のほかに、共通のプラットフォーム上で動くファミリー化された作品を求めている

# 仮説
* デレマスと東方の購入層は重複しているのではないか？
* デレマスの即売会で東方作品を頒布すれば頒布数が見込めるのではないか
* 同様に東方の即売会でデレマス作品を頒布すれば頒布数が見込めるのではないか

# 実施
* デレマス作品が完売したのに対し、東方作品は1つも頒布できなかった

# 考察
* サークルによる人間はデレマスの作品を求めていたのであって東方は求められていなかった
* 今後デレマスの即売会で東方作品を頒布しても実績は見込めないと思われる
* 同様に東方の即売会でデレマス作品を頒布しても実績は見込めないと思われる