OmniAICreator/Qiita-1.07M huggingface dataset:
分散SQLエンジン“Presto”のクエリチューニング

Prestoを利用し始めましたので、クエリのチューニング話も行いたいと思います。

## SELECT句のチューニング

`SELECT * FROM ...`は大変遅いので、データがあるかを確認する用途なら`SELECT COUNT(1) FROM ...`としましょう。
それでも中のデータを色々見たい場合には、カラムをなるべく限定して記述しましょう。
もちろん、`SELECT *`として取れる同じ数のカラムを指定したら同様に遅くなります。
特にvarchar型の数十文字以上の文字列が入るカラムは必要の無い限り外すべきです。格段に速くなります。

もしカラム名が分からないのであれば、WHERE句を指定せずに一瞬で結果が返ってくる次のようなクエリで確認すると速いです。
例）`SELECT * FROM ... LIMIT 1;`

## JOINのチューニング

Prestoにはcost-based JOIN optimizationsが実装されていないため、
あんまり行数の多いテーブルをJOINしてしまうと、オンメモリで処理できずに失敗（OutOfMemory）します。

### 行数の多いテーブルを先に書く

そんな時は行数の多いテーブルをFROMの先頭にして、行数の少ないテーブルをJOIN句で繋げていくと良いです。

```sql
SELECT
  *
FROM
  very_huge_table -- 大きいテーブルを先にする
  INNER JOIN 
    small_table ON 
      very_huge_table.some_id = small_table.id
```

#### WITH句を用いる

しかしながら、それでもメモリオーバーすることもあります。
そんな時はWITH句を用いることで処理を分割すると、上手く行くこともあります。
これは「共通テーブル式」や「CTE (Common Table Expression)」とも呼ばれます。

```sql
-- MySQL感覚で書いたクエリ
SELECT 
    transactions.id AS transaction_id,
    devices.id AS device_id, 
    devices.name AS device_name, 
    maker.name AS maker_name
FROM
    devices 
    INNER JOIN transactions ON devices.id = transactions.device_id AND transactions.request_type = 13
    INNER JOIN maker ON maker.id = devices.maker_id 
;

-- WITH句を使った例
WITH reduced_transactions AS (
  SELECT
    id AS transaction_id,
    device_id
  FROM
    transactions
  WHERE
    request_type = 13
)
SELECT 
  reduced_transactions.transaction_id,
  devices.id AS device_id, 
  devices.name AS device_name, 
  maker.name AS maker_name
FROM
  reduced_transactions
  INNER JOIN devices ON devices.id = reduced_transactions.device_id
  INNER JOIN maker ON maker.id = devices.maker_id 
```

#### substr()を用いる

その他、文字列でJOINするが、先頭数文字だけで区別できるのであれば、substr()を用いるのも手ですね。

```sql
-- deviceがPC,MB,SPの3種類なら先頭1文字で判定できます
SELECT
  *
FROM
  foo
  INNER JOIN
    bar 
  ON
    substr(foo.device, 1, 1) = substr(bar.device, 1, 1)
```

## WHERE句のチューニング

カーディナリティの高い(条件を大きく絞り込める)条件を先に書きましょう。
また、条件句は数が少なければ少ない方が良いです。
条件を減らしても結果が変わらないようなものであれば、削れる物を削りましょう。

その他、パーティショニングに使っているキーを指定できるならば、行った方が良いです。
例えばTreasureDataならtimeキーでパーティショニングしていますので、指定期間内のみを対象とすると速くなります。

## 型変換の技

TreasureDataが提供するPrestoには、smart_digest()というUDFがあります。
これは、文字列を短いハッシュ値に変える関数ですが、まだドキュメントに記載されていないそうです。

数値型ではなく文字列型でのJOINを行う際にはメモリ量をかなり削減できるため有用です。
利用方法としては、smart_digest(column)とします。次の解説も参考になります。

```sql
Hint: GROUP BY, JOIN and PARTITION BY consume large amount of memory especially if keys are large.
      Please try to shorten the key size using substr() or smart_digest() functions. For example:

          GROUP BY : SELECT min(key) AS key FROM rows GROUP BY smart_digest(key)
              JOIN : SELECT t1.key FROM t1 JOIN t2 ON smart_digest(t1.key) = smart_digest(t2.key)
      PARTITION BY : SELECT row_number() OVER (PARTITION BY smart_digest(key) ORDER BY time) FROM rows
```


## まとめ

他にも便利なクエリチューニングテクニックを見つけましたら、編集リクエストを頂けると幸いです。

また、TreasureData本家によるガイドも参考になります。

* Presto Performance Tuning | Treasure Data<br />
http://docs.treasuredata.com/articles/presto-performance-tuning
情報系論文の検索サービスメモ

以下は論文を検索する際に有用と思われるサイトです。誰でも利用可能なもの、有料年間登録が必要なもの、色々ありますが調べ切れていません。。。分かり次第追記していきたいです。


Google Scholar
-----
http://scholar.google.co.jp/
[登録無し・無料]
Googleによる論文検索サービス。無料で利用出来るが、論文が読めるかどうかは、リンク先次第といった所。Googleブックスで一部読める場合がある。

arXiv
-----
http://arxiv.org/
[登録無し・無料]
コーネル大学図書館が管理している論文投稿サイト。情報(計算機科学)系以外にも、数学・物理等の論文がある。基本的に誰でも論文を閲覧出来る。

ACM Computing Surveys
-----
http://surveys.acm.org/
調査中。最新動向を掴むのに有用らしい？

ACM Digital Library
-----
http://dl.acm.org/dl.cfm
調査中。有料登録(年間100ドル)すると全部の論文が読めるらしい？

IEEE Xplore Digital Library
-----
http://ieeexplore.ieee.org/Xplore/home.jsp
調査中。有料登録すると全部の論文が読めるらしい？

CiteSeerX
-----
http://citeseer.ist.psu.edu/index
調査中。

Research at Google
-----
http://research.google.com/pubs/papers.html
Googler(Google社員)が発表した論文へのリンク集。無料で読めるものもある。

CiNii Articles
-----
http://ci.nii.ac.jp/
日本の学会で発表された論文を探す場合はここ。日本語で書かれた論文もある。誰でも閲覧可能な論文もあるが、基本的には登録が必要？
大学等の教員・学生は無料、その他の個人は年間2,160円かかるらしい。

情報学広場：情報処理学会電子図書館
-----
https://ipsj.ixsq.nii.ac.jp/ej/
ユーザ登録は無料。一部有料のコンテンツがある。

参考文献
-----
論文の検索と入手 (カナダからのブログ)
http://www.kanadas.com/weblog/2006/10/post_29.html

IT系でも活用しなければ損。論文を読んで広がる知見 - ＠IT
http://www.atmarkit.co.jp/fjava/column/andoh/andoh47.html


[PDF]情報系の研究者が研究・論文執筆をする際に知らなくてはならない事や心構え
http://web.sfc.keio.ac.jp/~naoe/security/documents/naoe/research-ver2.pdf

[PDF]論文の読み方探し方(海外文献版)
http://www.rm.is.ritsumei.ac.jp/~otsuki/AboutConf2010_international.pdf

インフラエンジニア向けシステム系論文 - ゆううきブログ
http://yuuki.hatenablog.com/entry/system-papers

-----
素人なので、間違い等あればコメントで指摘して頂けると幸いです。
【iOS8】画像に緑色の線画がはいる・画像の下4分の1くらい緑色になる

容量（サイズ）が大きいと起きることがあるようなのでメモ。
解決法としては、容量を減らせばいい。

[css - Website displaying green corrupted jpeg images on iPhone - Stack Overflow](http://stackoverflow.com/questions/16478012/website-displaying-green-corrupted-jpeg-images-on-iphone)
mod_extract_forwardedを設定したらアクセスできなくなった

# mod_extract_forwardedを使ったらアクセスできなくなった

試験中とか地味にハマることありそうなのでメモっとく

Proxy環境化からIPアクセス制限設定のあるサーバへアクセスした際に403に変わった

下記のような構成(Proxy有・無混合)
1. [Host]->[Proxy]->[GW]->[いんたーねっと]->[EC2]
2. [Host]->[GW]->[いんたーねっと]->[EC2]

これをこんな感じにしようとしてた(ELBを挟みたい)
1. [Host]->[Proxy]->[GW]->[いんたーねっと]->[ELB]->[EC2]
2. [Host]->[GW]->[いんたーねっと]->[ELB]->[EC2]


##前提
1. Proxy環境から外部へのアクセス (ProxyIP:10.0.0.1) -> (IP:192.168.0.1)
2. アクセス先のサーバではIP制限がある(Allow from 192.168.0.1/32)
3. 設定前はアクセスが可能(GWのIPでアクセスしているため)

##事象
1. mod_extract_forwardedを設定(ELB経由時にアクセス元のIPアドレスを取得するため)
2. Proxy環境を利用しているHostからアクセスができなくなった
3. Proxy環境下にいないホストはアクセスが可能

##原因
1. mod_extract_forwardedがProxy環境のIPを接続元(GWIPでなくProxyIP)にした
2. その為Proxy環境下のホストはアクセスが出来ない(ProxyIP:10.0.0.1になるため)

##回避策
1. mod_extract_forwardedを停止する
2. Allow fromへProxyのIPを追加する

mod_extract_forwardedは利用したいので2になる
使用とかそういった都合上2がダメだったら1のmod_extract_forwardedの停止をする
Symbol からレシーバを後挿しできる Proc を得られるようにするとブロックなし Ruby が捗る

[ブロックなしRubyをやろうとすると関数型プログラ…うーんリストプロセッ、えーと感じ感じ](http://qiita.com/supermomonga/items/f22dbe021a8e79d55322)

めっちゃいい話です。

ブロックを使わずに "レシーバを未定にし、メソッドの実引数のみ部分適用した Proc オブジェクトを生成" したいことが結構あります。
できないのでつらみがある。
でも Symbol に任意の引数をあらかじめ適用しておいてからレシーバを後挿し可能な Proc というものを得ることができればよさそうな気がしますね。
そんなかんじで Symbol を拡張した話をします。

そういう記事自体はすでに以前 [blog に書いていた](http://blog.aotak.me/post/99043325606/symbol-to-proc) のですがタイムリーっぽい気がするので Qiita にも載せます。

```rb
class Symbol
  def call(*argv)
    case
    when block_given?
      -> obj { self.to_proc[obj, *argv, &proc] }
    when argv.size > 0
      -> obj { self.to_proc[obj, *argv] }
    else
      self.to_proc
    end
  end
end
 
p [[1,2,3],[2,4,6],[5,7,9]].map(&:inject.(:+))
p [[1,2,3],[2,4,6],[5,7,9]].map(&:select.(&:odd?))
p [[1,2,3],[2,4,6],[5,7,9]].map(&:slice.(1,1))
```

以前 [gist](https://gist.github.com/aoitaku/5b363ee34fffcd426d0a) に載せたコードから当該部分をまんま引っ張ってきただけです……。

引数の順番を入れ替える lambda でラップして、レシーバだけを未定なままにして Proc を得られるようにしてあります。

```
xs = (1..10)
xs.map(&:to_s.(2))
```

よさそうですね。

といっても見てのとおりちゃっちい作りなので使ってみるとこれだけだと不充分なこともあります。レシーバを後挿しにできるというかそれ以外のことはできないです。

前にこのコードを書きながらもう [lambda driver](http://yuroyoro.github.io/lambda_driver/) あるよと思ったんだけど前に書いたときは自分で手を動かすことで関数型っぽいものに対する理解が深まるんじゃないかな－かなーという感じでした。
いまこうして Qiita に載せたのは単にタイムリーっぽい気がしたからという不純な動機からだったりしますが、まあでもこれくらいの短いコードから関数型っぽいものに対する理解が深まっていけばいいなーと思ってます。

### 追記1
[続き](http://qiita.com/aoitaku/items/987765c73bcd51b89572) があります。

### 追記2
わざわざカリー化して部分適用しなくてもよかったので直しました。
OS X (10.10 Yosemite)にてLocateコマンド

		
##Locateとは
Macで使用する際のファイルを探す時のUnixコマンド `locate`
`find`はすべてのファイルを即座になめるので、遅いが、
`locate`はlocate DBのindexを見に行くので、速いが、DBを更新する必要がある。

使い方はシンプル
`locate <ファイル名>`
<>は不要です。

##しかし即座に使えない
しかしそのままでは使えません。
`locate sample`と打ってみるが、、

```locate実行

$ locate sample
> WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.

```

locate databaseがないとのことなので、
以下を実行
`sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist`

これでlocate.plistをロードしてサービスの登録


`locate`コマンドはlocateのデータベースのindexを見ているので、
定期的にindexを更新する必要があります。

ほとんどのUnixベースのOSだと、`updatedb`コマンドを打つだけですが、
OS X (10.10 Yosemite) だとコマンドラインで打っても動きません。


##locateのデータベースを更新
①ターミナルアプリを立ち上げ, iTermとか

②rootユーザになります
 `sudo su -`
 その後、パスワードを打つ
③ディレクトリの移動
`cd /usr/libexec`
④以下でlocateのデータベースを更新する
`./locate.updatedb`

五分もしないウチにlocateのデータベースが更新されます。

最後にcontrol + dでexitしておわり

一行でもいい
`sudo /usr/libexec/locate.updatedb`
ヤフーリアルタイム検索 selenium + python 

ヤフーのリアルタイム検索を自動で検索して、Firefox のタブに展開するselenium + python の script つくりました。

環境は、Mac に anaconda で python3 をいれて、selenium を install すると使えます。selenium は、anaconda をいれたあとで、pip install selenium　するとインストールできます。windows ではまだ、検証していないです。。。すみません。


```
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import sys,os,platform

# 新規タブをあけるキー操作を設定
newtab=Keys.CONTROL + 't'
# Mac かどうかの判定、キーがMac だと違う
if platform.system() == 'Darwin':
 newtab=Keys.COMMAND + 't'


# チェックする項目、気になっている事務次官、審議官クラスの官僚の名前を書きました。python2 用に、UTF８の指定をいれています。

slist=[u"西正典",u"板東久美子",u"前川喜平"]

driver = webdriver.Firefox()


for xkey in slist:
 # リアルタイム検索
 driver.get("http://realtime.search.yahoo.co.jp/realtime")
 driver.find_element_by_name("p").clear()
 driver.find_element_by_name("p").send_keys(xkey)
 driver.find_element_by_css_selector("input.b").click()
 # 最後になったら新規タブをつくらず抜ける
 if xkey == slist[-1]:
  break
 body = driver.find_element_by_tag_name("body")
 body.send_keys(newtab)
```
MacでAndroid開発中にSQLiteの中身をみたい


AndroidStudioにDBの中身が見れるEditorなかったけと思いつつ、
ファイルを直接抜いてチェックすることにした

run-asコマンドで自分のパッケージ名を入れてやれば、これでいけるはず

```
$ adb shell
shell@android:/ $ run-as com.fuga.packagename cat databases/Test.db > /sdcard/Test.db
shell@android:/ $ exit
$ adb pull /sdcard/Test.db $HOME/Documents/
```

おしまい
さくらVPSにCentOS7入れてみたログ

ほったらかしてたVPSを久々に見てると、CentOS7が出てた(気づくの遅い)ので、何が変わったのか調べてるとなんだかテンションが上がったので、作ってみることにした。

#CentOS7って何が違うの？
ぐぐったらすぐ出てくるので、調べてみてください。
自分は下記のサイトを参考にさせてもらいました。(ありがとうございます)

* http://urashita.com/archives/1538
* http://inaba-serverdesign.jp/blog/20141110/centos7.html
* http://sancc.hatenablog.com/entry/2014/08/14/215135

#さくらVPSでインストール
カスタムOSインストールを選ぶと「CentOS7」を選択することが出来ます。
インストールがわからない方はさくら公式を参照してください。

[カスタムOSインストール方法 -さくら公式-](https://help.sakura.ad.jp/app/answers/detail/a_id/2397/~/%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0os%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89---centos-7)

以下、作業メモ

##SSH接続

```
PS> SSH root@XXX.XXX.XXX.XXX
```

##ユーザー追加とパスワード設定とwheel追加

```
# useradd USER_NAME
# passwd YOUR_PASSPHRASE
# usermod -G wheel USER_NAME
```

##SELinuxをOffに

```
# getenforce　　←動作状況
Enforcing

# setenforce 0　　←一時的に無効に

# getenforce
Permissive
```

SELinux Configファイル編集

```
vi /etc/selinux/config
```

```lang:/etc/selinux/config
SELINUX=enforcing
↓　変更
SELINUX=disabled
```

##sudo権限付与とルートログイン制限

```
# visudo
```

```
## Allows people in group wheel to run all commands
# %wheel  ALL=(ALL)       ALL
↓　コメントアウト外す
%wheel  ALL=(ALL)       ALL
```

##sshdの設定

```
$ sudo vi /etc/ssh/sshd_config
```

[^1]:sshd設定項目

```lang:/etc/ssh/sshd_config

#ポート設定(10000番台以上で適当に）
Port 30XXX

#ルートログイン設定
PermitRootLogin no

#鍵認証設定
RSAAuthentication yes
PubkeyAuthentication yes

#パスワードでのログイン
PasswordAuthentication yes

```

##firewalldの設定

```
# firewall-cmd --add-service=http  ←使用するサービスにhttpを追加
success

# firewall-cmd --permanent --add-service=http  ←再起動してもhttpを使用
success

# firewall-cmd --add-port=30XXX/tcp　　←30XXXポートを追加
success

# firewall-cmd --permanent --add-port=30XXX/tcp　　←再起動しても30XXXを使用
success

# firewall-cmd --list-services　　←サービスを確認(httpが追加されてる）
dhcpv6-client http ssh

# firewall-cmd --list-ports　　←ポートの確認(30XXXが追加されてる)
30XXX/tcp

```

さらに詳しいことはこちらを参照
http://www.mk-mode.com/octopress/2014/08/09/centos-7-0-setting-of-firewall/

##公開鍵・秘密鍵の作成と転送
鍵の作成は割愛。下記参照
* Windows　http://webdev.jp.net/ssh-keygen-egit-windows/
* mac　http://webkaru.net/linux/mac-ssh-login-public-key/

```lang:Host
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
```

```lang:Cliant
$ scp -i /CLIANT/PUBKEY/PATH/ USER_NAME@XXX.XXX.XXX.XXX:~/.ssh/authorized_keys
```

```lang:Host
$ chmod 600 ~/.ssh/authorized_keys
```

この時点でパスワードログインを有効にしてるので、無効にする。
sshd設定参照[^1]

##再起動
いったんホストマシンを再起動

```
$ sudo shutdown -r now
```

###SSHが接続できない時
このあたりの記事が参考になります。
http://dev.satake7.net/posts/292


##パッケージ管理・その他

###yum

```
$ sudo yum -y update 
```

設定ファイルの場所
`/etc/yum.repos.d/CentOS-Base.repo`

###epel

```
$ sudo yum install -y epel-release
```

設定ファイルの場所
`/etc/yum.repos.d/epel.repo`

###remi

```
$ sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

設定ファイルの場所
`/etc/yum.repos.d/remi.repo`

###RPMForge

```
$ sudo rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
$ sudo rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
```
Android のエミュレータから電話をかける

Android のエミュレータには電話番号があり、他のエミュレータに電話をかけられることがわかりました。

<a href="https://qiita-image-store.s3.amazonaws.com/0/58593/b4778e1d-abc4-6a01-cc59-fe79e36d56c4.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/58593/b4778e1d-abc4-6a01-cc59-fe79e36d56c4.png" alt="emulator phone number" height="300"/></a>

他のエミュレータから **1-555-521-5554** に電話をかけます。(5554 でも同じでした。)

<a href="https://qiita-image-store.s3.amazonaws.com/0/58593/92e9fa3c-54ba-a275-fa96-0f3ef2b2b54e.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/58593/92e9fa3c-54ba-a275-fa96-0f3ef2b2b54e.png" alt="outgoing call" height="300"/></a>

すると、5554 のエミュレータが着信します。

<a href="https://qiita-image-store.s3.amazonaws.com/0/58593/23afff4d-9467-a39c-7714-d1a2ca4412a5.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/58593/23afff4d-9467-a39c-7714-d1a2ca4412a5.png" alt="outgoing call" height="300"/></a>

そして、ANSWER をタップすると通話状態になりました。

<a href="https://qiita-image-store.s3.amazonaws.com/0/58593/fa26611b-6efd-8fcc-981f-43034076ce8a.png"><img src="https://qiita-image-store.s3.amazonaws.com/0/58593/fa26611b-6efd-8fcc-981f-43034076ce8a.png" alt="outgoing call" height="300"/></a>
cocos2d-xでダウンロードした画像をファイルに保存せず表示する

1. 普通にHTTP通信で画像のデータを取ってくる
2. データから`cocos2d::Image`作る
3. `cocos2d::TextureCache`に渡してキャッシュ＆`cocos2d::Texture2D`取得する
4. `cocos2d::Sprite::createWithTexture`でSprite作る
5. `addChild`で表示する

以降は`cocos2d::Director::getInstance()->getTextureCache()->getTextureForKey(url)`でテクスチャ取得できるはず。

`ui::ImageView`の場合は、SpriteFrameCacheに登録すれば以降`ImageView::create(spriteFrameName, cocos2d::ui::TextureResType::PLIST);`という感じで作れる。

```cpp
auto url = "任意の画像のURL";
auto request = new cocos2d::network::HttpRequest();
request->setUrl(url);
request->setRequestType(cocos2d::network::HttpRequest::Type::GET);

request->setResponseCallback([this, url](cocos2d::network::HttpClient *, cocos2d::network::HttpResponse *response) {
    if (!response->isSucceed()) {return;}
    auto responseData = response->getResponseData();
    auto bytes = reinterpret_cast<unsigned char *>(&(responseData->front()));

    auto data = cocos2d::Data();
    data.copy(&(bytes.front()), bytes.size());

    auto image = new (std::nothrow) cocos2d::Image();
    if (!image) {return;}
    image->initWithImageData(data.getBytes(), data.getSize());
    auto texture = cocos2d::Director::getInstance()->getTextureCache()->addImage(image, url);

    auto spriteFrame = cocos2d::SpriteFrame::createWithTexture(texture, cocos2d::Rect(0, 0, texture->getContentSize().width, texture->getContentSize().height));
    cocos2d::SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, url); 
    CC_SAFE_RELEASE(image);

    auto sprite = cocos2d::Sprite::createWithTexture(texture);
    this->addChild(sprite);
    // or
    auto imageView = cocos2d::ui::ImageView::create(url, cocos2d::ui::TextureResType::PLIST);
    this->addChild(imageView);
});
cocos2d::network::HttpClient::getInstance()->send(request);
```
dockerでLD_PRELOADでライブラリを複数設定する

### 問題
普通のコマンドラインからLD_PRELOADを指定する場合

``` bash
LD_PRELOAD="foo.so bar.so" baz 
```
とするが、dockerでこれを真似して

``` bash
docker run --rm -e LD_PRELOAD="foo.so bar.so" ... 
```
とすると

```
Unable to find image 'bar.so":latest' locally
FATA[0000] Invalid namespace name (), only [a-z0-9_] are allowed, size between 4 and 30 
```
のように言われる。どうもイメージ名だと思っているみたいで、コマンドライン引数のパーサーのバグみたいに見えるが、まあ今のところそんなふうである。

### 解決法
[http://man7.org/linux/man-pages/man8/ld.so.8.html](http://man7.org/linux/man-pages/man8/ld.so.8.html)に
*The items of the list can be separated by spaces or colons.*
とあるので

``` bash
docker run --rm -e LD_PRELOAD=foo.so:bar.so ...
```
のようにすれば良い。
FFmpegライブラリー チュートリアル (翻訳)

　**CLIじゃないよ！ libavcodecとかの使い方だよ！**

　→[次](http://qiita.com/tottokotkd/items/d9d376d5993961627aec)

　以下の文章は、 “[An ffmpeg and SDL Tutorial](http://dranger.com/ffmpeg/ffmpeg.html)” (CC BY-SA 2.5) の翻訳です。あまりにもffmpegの学習が捗らないので、とりあえず日本語に翻訳してみようという試みです。

　サンプルプログラムは (可能な限り) swiftで書き直します。ただし翻訳の予定は未定。遅くとも年度内にはなんとか… 
　お急ぎの方は原文をご覧ください。

　ずぶの素人訳です。誤字･誤訳･誤解の指摘を大いに歓迎します！
　~~もし私が途中で力尽きたら、続きの翻訳もよろしくお願いします~~

#ffmpeg チュートリアル 
##前書
### 注意：このチュートリアルには一部、適切でなくなった部分があります。
　現時点で、第8章で利用されている `img_convert` (廃止) を `sws_scale` に変更する必要があります。私自身このチュートリアルをアップデートしたいとずっと思っていたので、これをよい機会と考えて実行するつもりです。ここ3年にわたって、沢山の方々からの提案・応答が大いに力となりました。もしあなたもEメールで助けてくださるなら嬉しく思います。このチュートリアルは遠からずアップデートされるでしょう。

**[翻訳版注記 開始]**
　*翻訳作成の時点では、その他にも廃止された関数が存在します。残念ながら翻訳者はCに疎いため、サンプルプログラムを適切に書きなおす自信がありません。*
　*そのため翻訳版では、原作品に附されたCのサンプルをそのまま掲示し、その次に訂正済みのswiftプログラムを示すこととします。C版には適切でない記述がそのまま残されていますので、注意してください。*
**[翻訳版注記 終了]**

　ffmpegは素晴らしいライブラリーであり、映像アプリケーションでも、汎用ツールすらも作ることができます。ffmpegはあなたに代わってデコード、エンコード、ストリームの合成・分離 (mux / demux) のすべてを行い、映像処理の面倒な部分を肩代わりしてくれます。これによりAVデータを扱うアプリケーションをより簡単に書くことができます。C言語で記述されたライブラリー自体はシンプルであり、高速であり、それでいて実用されているコーデックのほとんどをデコードし、あるいはエンコードしなおすことができます。

　このようにffmpegは優れているのですが、困ったことにドキュメントらしきものがほとんど存在しません。ただひとつffmpegの基礎についてのチュートリアルがあり、doxygenドキュメントがありますが、それだけです。そういう有り様なので、ffmpegについて (そしてデジタル映像・音声のアプリケーションの仕組みについて) 学んだ私は、その仕組みをドキュメントとして整え、チュートリアルにしようと決意したのです。

　ffmpegを利用するサンプルプログラムとして、ffplayというものがあります。C言語で書かれた簡単なプログラムですが、ffmpegにより完全な映像プレイヤーとして機能します。本稿はまず、オリジナルのチュートリアル (Martin Böhme著) を大いに参考にしつつ加筆したものから始めて、ffplay.c (Fabrice Bellard著) をベースとする映像プレイヤーを作るべく進んでいきます。チュートリアルの各段階でアイデアを紹介し、それをどうやるのか説明します。チュートリアルにはCのプログラムが添付されていますから、読者はこれをダウンロードし、コンパイルし、自分でやってみることができます。ソースを見ることで、実際のプログラムがどのように機能しているかを知ることができ、その使い方が分かり、チュートリアルでは詳述されない技術的詳細まで理解することができます。最終的には、1000行未満で動作する映像プレイヤーを作成できるでしょう。

　プレイヤーを作成するにあたって、AVファイルの音声と映像を出力するためにSDLを利用します。SDLはクロスプラットフォームの優れたマルチメディアライブラリーであり、MPEG再生ソフトやエミュレーター、ゲームなどで利用されています。チュートリアルのプログラムをコンパイルするためには、読者の環境に応じてSDLの開発用ライブラリーをダウンロードし、インストールする必要があります。

　このチュートリアルは、プログラミング経験のある読者を想定しています。C言語を理解し、キューやミューテックスなどのアイデアを知っていることが最低限求められます。波形などのマルチメディアの基礎知識があることも期待されますが、これについてはチュートリアル内で説明していきますので、ある程度のもので構いません。

This work is licensed under the Creative Commons Attribution-Share Alike 2.5 License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/2.5/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.  

Code examples are based off of FFplay, Copyright (c) 2003 Fabrice Bellard, and a tutorial by Martin Bohme.

**[翻訳版注記 開始]**
　上記の権利表示およびライセンス表示は原作品に附されたものです。
　翻訳者は、本訳文の全体をCC BY-SA 2.5のもとで頒布します。
**[翻訳版注記 終了]**
【解答例】Haskell Maybeモナド 超入門

[Haskell Maybeモナド 超入門](http://qiita.com/7shi/items/c7d7eec066af0fe0688d)の解答例です。

# フィボナッチ数

【問1】次の関数`fib`でエラーを回避するためMaybeモナドで書き換えてください。

```hs
import Control.Applicative

fib 0 = Just 0
fib 1 = Just 1
fib n | n > 1     = (+) <$> fib (n - 2) <*> fib (n - 1)
      | otherwise = Nothing

main = do
    print $ fib (-1)
    print $ fib 6
```
```text:実行結果
Nothing
Just 8
```

# 再実装

## bind

【問2】Maybeモナドを扱う`bind`を実装してください。

```hs
(Just a) `bind` b = b a
Nothing  `bind` _ = Nothing

main = do
    print $ Just 1 `bind` \a -> Just $ a * 2
    print $ Just 1 `bind` \a -> Nothing `bind` \b -> Just $ a * b
```
```text:実行結果
Just 2
Nothing
```

## mapMaybe

### 再帰

【問3】`mapMaybe`を再帰で再実装して、先ほどのサンプルで検証してください。

```hs
import Control.Applicative

mapMaybe _ []     = []
mapMaybe f (x:xs) = case f x of
    Just y  -> y : mapMaybe f xs
    Nothing ->     mapMaybe f xs

fact 0 = Just 1
fact n | n > 0     = (n *) <$> fact (n - 1)
       | otherwise = Nothing

facts n = ( map      fact [n, n - 1, n - 2]
          , mapMaybe fact [n, n - 1, n - 2]
          )

main = do
    print $ facts 3
    print $ facts 2
    print $ facts 1  -- cで失敗
    print $ facts 0  -- bで失敗
```
```text:実行結果
([Just 6,Just 2,Just 1],[6,2,1])
([Just 2,Just 1,Just 1],[2,1,1])
([Just 1,Just 1,Nothing],[1,1])
([Just 1,Nothing,Nothing],[1])
```

### foldr

【問4】問3の解答を`foldr`で書き換えてください。

```hs
import Control.Applicative

mapMaybe f = (`foldr` []) $ \x xs -> case f x of
    Just x' -> x':xs
    Nothing ->    xs

fact 0 = Just 1
fact n | n > 0     = (n *) <$> fact (n - 1)
       | otherwise = Nothing

facts n = ( map      fact [n, n - 1, n - 2]
          , mapMaybe fact [n, n - 1, n - 2]
          )

main = do
    print $ facts 3
    print $ facts 2
    print $ facts 1  -- cで失敗
    print $ facts 0  -- bで失敗
```
```text:実行結果
([Just 6,Just 2,Just 1],[6,2,1])
([Just 2,Just 1,Just 1],[2,1,1])
([Just 1,Just 1,Nothing],[1,1])
([Just 1,Nothing,Nothing],[1])
```

# 文字列チェック

【問5】文字列`s`が「`x`文字の連続した数字＋`y`文字の連続した大文字」で構成されるか判定する関数`numUpper x y s`を実装してください。成功した場合は`Just s`、失敗した場合は`Nothing`を返してください。余計な文字は含まないものとします。

```hs
import Data.Char
import Control.Monad

numUpper x y s = do
    guard $ length s == x + y
    guard $ length (filter isDigit $ take x s) == x
    guard $ length (filter isUpper $ drop x s) == y
    Just s

main = do
    print $ numUpper 3 2 "123AB"
    print $ numUpper 3 2 "123ABC"
    print $ numUpper 3 2 "12ABC"
```
```text:実行結果
Just "123AB"
Nothing
Nothing
```

# Alternative

【問6】文字列`s`の先頭3文字が「数字＋大文字＋小文字」または「大文字＋小文字＋小文字」で構成されるかを判定する関数`check s`を実装してください。`<|>`を使って、成功した場合は`Just s`、失敗した場合は`Nothing`を返してください。後続の文字は判定に影響しないものとします。

```hs
import Data.Char
import Control.Applicative
import Control.Monad

check s = do
    guard $ length s >= 3
    do
        guard $ isDigit $ s !! 0
        guard $ isUpper $ s !! 1
        <|> do
        guard $ isUpper $ s !! 0
        guard $ isLower $ s !! 1
    guard $ isLower $ s !! 2
    Just s

main = do
    print $ check "1"
    print $ check "2Ab"
    print $ check "Abc"
    print $ check "Ab1"
    print $ check "1AB"
```
```text:実行結果
Nothing
Just "2Ab"
Just "Abc"
Nothing
Nothing
```
Gruntfileでのwatch定義の書き方のアンチパターン

Gruntのwatchタスクの定義の書き方で上手く行かなかったのでメモ。

## つまづいた点
共通のSCSS/JSと、カテゴリ(ページ)内で使うSCSS/JSのいずれかが更新されたときにそのカテゴリに紐づくtaskを実行したいとして、下記のように書いてしまうと、共通SCSS/JS更新の際にすべてのtaskが発火しなかった。

```js:Gruntfile.js(一部)

watch: {
    watch01: {
        files: [
            'src/common/scss/*.scss',   //共通SCSS
            'src/common/js/*.js',       //共通JS
            'src/category01/scss/*scss',
            'src/category01/js/*js'
        ],
        tasks: ['task01']
    },
    watch02: {
        files: [
            'src/common/scss/*.scss',   //共通SCSS
            'src/common/js/*.js',       //共通JS
            'src/category02/scss/*scss',
            'src/category02/js/*js'
        ],
        tasks: ['task02']
    },
    //   : (略)
}
```

## 解法
下記のように、共通SCSS/JSを監視するwatchとカテゴリごとのwatchとを分けておくと、
期待通りの実行内容になる。

```js:Gruntfile.js(一部)
watch: {
    watch_default: {
        files: [
            'src/common/scss/*.scss',
            'src/common/js/*.js',
        ],
        tasks: ['default']
    },
    watch01: {
        files: [
            'src/category01/scss/*scss',
            'src/category01/js/*js'
        ],
        tasks: ['task01']
    },
    watch02: {
        files: [
            'src/category02/scss/*scss',
            'src/category02/js/*js'
        ],
        tasks: ['task02']
    },
    //   : (略)
}
```

---------------------------------------------------
よく考えれば上の例は変な書き方をしていたなあと思いましたが、
またうっかりやりそうなのでメモしておきます。
Raspberry Piの初期設定をAnsible on Macでやる

久しぶりにやると完全に忘れているので備忘録。なお、この記事で扱うのはpingが通るところまでです。

#### /etc/hosts on Mac

名前を付ける：

```text:/etc/hosts
192.168.2.3     weed-raspbmc
```

ちなみに私はMacを「インターネット共有」させて、イーサネットケーブルでMacとRaspberry Piをつなげています。Mac側のIPアドレスを「手動で設定」で「192.168.2.1」にすると、ぶら下がるマシンにはIPアドレス「192.168.2.2」、「192.168.2.3」・・・と順番に割り振られます。

hostsを反映させる：

```shell-session
$ dscacheutil -flushcache
```

#### ssh on Mac

raspbmcにsshするときはユーザはpiであることを設定する：

```text:.ssh/config
Host weed-raspbmc
        User pi
        Hostname 192.168.2.3
```

鍵を作って転送する等：

[ubuntu at u-aizu | SSHを使ってパスワードなしで接続](http://ubuntu.u-aizu.ac.jp/004/index.html)

ただし、鍵をRaspberry Piに送るには以下のようにする：

```shell-session
$ scp ~/.ssh/id_dsa.pub pi@192.168.2.3:~/
```

#### Ansible on Mac

MacにAnsibleを入れるやり方は以下の生地^H^H記事が丁寧です：

[Ansible使ってVagrantのゲストOSの構成管理する【Playbook: jenkins, node.js】 - yutaponのブログ](http://yutapon.hatenablog.com/entry/2014/04/08/102836)

無事Ansibleをインストールできたら、プロジェクトフォルダに**hosts**というファイルを作る：

```text:hosts
[target]
weed-raspbmc
```

ここでIPアドレスを指定するとユーザpiでログインしてくれず、Ansibleが動かない。

最後にpingする：

```shell-session
$ ansible -i hosts servers -m ping
```

うまくいけば`pong`と返ってくる：

```
weed-raspbmc | success >> {
    "changed": false, 
    "ping": "pong"
}
```

---
ブログやってます：[Weed software](http://weed.cocolog-nifty.com/wzero3es/)
本番環境の注文APIの証明書による認証について

本番環境の注文APIの証明書による認証について質問がございます。
「YConnectのみを利用する場合は、上記のAPIでは最大12時間で再認可が必要でしたが、YConnectと証明書を組み合わせることで最大4週間まで延長できます。」
とありますが、アクセストークンの有効期限が延長されるという事でしょうか。

API利用の流れは下記のように理解しております。
1.Authorizationエンドポイントで認可コードを取得。有効期限は600秒。
2.認可コードを渡してTokenエンドポイントでアクセストークン（有効期限3600秒）、リフレッシュトークン（有効期限4週間）を取得。
3.アクセストークンを渡してAPIを利用。

一度リフレッシュトークンを取得すれば4週間はアクセストークン更新が可能であり、その間は更新し続けられる認識です。
リフレッシュトークンが期限切れになって初めて、認可コードの取得（ログインなど）から行う必要があるのかと思っております。
証明書によって延長されるのは、どの部分が延長されるのでしょうか。
また、12時間で切れるのはどの部分でしょうか。
クラッシュログを送信してくれるCrashlyticsをiOSアプリに組み込む

クラッシュログを送信してくれるCrashlyticsをiOSアプリに組み込む

[iOS アプリのための Crashlytics](http://www.moonxseed.com/2014/01/18/ios-%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE-crashlytics/)

UIは変わっていたものの上記のサイトを見ながらポチポチやれば１時間程度で出来ました。

簡単な上に、Crashlyticsの高機能なツールを無料で使えるのが最高にCoolです。

no more sad apps !
Retrofit + RxAndroidでエラーコードを取得する

Retrofit + RxAndroidを利用した際のステータスコードは
正常(200〜299)の場合はRetrofit内の処理で切り捨てられるが
エラーの場合はThrowable内にラッピングされて返却されてくる。

```java
.getApi()
.subscribe(
    success -> //正常処理,
    e -> {
        //エラー
        if(e.getCause() instanceof RetrofitError){
            RetrofitError error = (RetrofitError)e.getCause();
            Timber.e("status = " + error.getResponse().getStatus() + ", message = " + error.getMessage());
        }else {
            Timber.e(e, e.getMessage());
        }
    }
);
```
あらゆるログを JSONable に、というご提案

これは既にたくさんの人・企業が実践していることだと思うんですが、自分の周囲に対して明文化するのを主な目的として、記事にしようと思います。

# TL;DR

ログは JSON またはそれに変換可能な LTSV のようなフォーマットで改行区切りに一次出力しよう

# JSONable とは

私の造語[^1]ですが、「JSON に変換可能である」ぐらいの意味です。
例えば、YAML, LTSV 等がそれにあたります。

これは完全に相互変換できる、というほど厳密な意味ではありません。
例えば YAML には [アンカーやエイリアス](http://magazine.rubyist.net/?0009-YAML#l10) という仕様がありますが、JSON ではそれを表現することはできません。
ですが、エイリアスを解決した上で、それを JSON に変換することはできます。

また、「JSON **に** 変換できる」かどうかが重要であって、「JSON **から** 変換できる」かどうかは重要ではありません。
例えば LTSV はネストした JSON のようなデータを表現することはできませんが、「JSON **に** 変換できる」ことに変わりはないので、ここでいう JSONable なデータ形式にあたります。

# ログを JSONable にするわけ

一般的なログのフォーマットは、必ずしも JSON や LTSV ではありませんし、多分それら以外のフォーマットのものが多数派でしょう。
TSV や CSV のものもありますし、Apache の combined のような独自形式のものが多いことと思います。

それを JSONable にすると、以下のような利点があります。

* ログフォーマットごとにパーザを用意しなくてもよくなる
* 各フィールドに名前がついているので、データそれ自体から意味を読み取りやすい (自己記述的である)
* フィールドの追加が容易である
* [jq](http://stedolan.github.io/jq/) や [jr](https://github.com/yuya-takeyama/jr)[^2] を活用することであらゆる UNIX コマンドと組み合わせることができる

# 改行区切りにこだわる理由

おもに、`tail` コマンドでの扱いやすさを目的としています。
例えば (やる人はあまりいないと思いますが) YAML は改行区切りでレコードを表現するわけではないので、おもむろに `tail -F` したときに、データの途中から出力が始まって、正しくデータを読み取れない可能性があります。

また、JSON は仕様上改行で区切ることは一切決まっていないと思いますが、改行区切りで 1 行ずつ記述することはできます。
JSON へのエンコードを行うライブラリによっては、インデントや改行を加えて prettify するものもあるので、その点は注意が必要です。

LTSV については仕様からして改行区切りであることになっているので、問題にはならないでしょう。

# おまけ: あくまで一次出力の話です

いまどきは Fluentd にデータを飛ばして、MongoDB のようなドキュメント指向データベースに保存するなど、そもそもログファイル自体書き出していない、ということもあるでしょう。
もちろんそれ自体は全く問題ではなくて、あくまでもアプリケーションからの一次出力さえ JSONable であれば、あらゆるツールと連携が可能になる、ということが大事です。
(Fluentd にさえ飛ばせれば良い、と言うこともできそうですが)

# JSONable なフォーマットが向かない領域

基本的にバイナリデータを扱う必要がある場合は向かないでしょう。
もちろん BASE64 エンコード等を利用してできなくもないですが。

まぁログにバイナリを書き出したい、という要求は私にはないので問題にならないのですが。

# ログ以外の領域について

JSON を積極的に採用する流れは Web API や JSON Schema 等いくらでもあります。
とりあえず選ぶフォーマットが何故 JSON なのか、については以前に以下のような記事を書いているので、あわせてお読みいただけると幸いです。

* [「とりあえず JSON」の根拠](http://qiita.com/yuya_takeyama/items/030eaaf80aa75eb5fb53)

[^1]: 私が世界で初めて発明した単語として主張するつもりはもちろんありません。そういう名前の [gem](https://github.com/treeder/jsonable) もありました。
[^2]: 拙作の JSON フィルタツールです。jq みたいなことが Ruby でできます。詳細は [LTSV のログを jq でフィルタする](http://qiita.com/yuya_takeyama/items/f29b37302db0ce70de0c) を参照。
ThymeleafでJavaScriptを利用する

# JavaScriptもモックのHTMLをそのまま使える

モックアップのHTMLに対して、JavaScriptで動きを仮実装するケースがあると思います。
モックアップのHTMLから実際のWebアプリケーションに変換する際に、JavaScriptの実装を切り替えないといけない…こんな苦悩もThymeleafはすこし解決してくれます。

## 動作バージョン

Thymeleaf 2.x , 3.x

## 宣言部に一工夫加えるとOK

HTML内にJavaScriptを定義する方法は、「要素の本文」を以下のように記述をするだけです。次の例はjQueryと組み合わせた例です。

```html:sample.html
<script type="text/javascript" th:inline="javascript">
/*<![CDATA[*/
$(document).ready(function() {
	$("#taskCloseButtn").bind("click" , function() {
		$("#status").val("cl");
		url = /*[[ @{/register} ]]*/ 'register.html';
		goSubmit(url);
	});
});
/*]]>*/
</script>
```

* \<script\>要素に th:inline="javascript" を追加します
* /\*<![CDATA[\*/ …… /\*]]>\*/でJavaScriptのコードを囲います
* /\*[[ …… ]]\*/で囲うことで、ThymeleafからJavaScriptコードの中へ値を出力します

例えば上記の例では、urlの部分が切り替わります。

/\*[[ @{/register} ]]\*/ は、Thymeleafがコンテキストパスも自動的に含めたURLを出力し、HTMLを直接開いた場合はregister.htmlとなります。
[メモ] CakePHP で WebAPI の実装をプラグイン上に作る

Intro
===============

* `example.com/api/v1/hoge`とか `api.example.com/v1/hoge` とかそういうのがやりたい
* プラグインとして実装にまとめたい

というわけでごにょごにょ調べたりしたときのメモ。

\* \* \* 

* 2015-03-04 続きっぽいの書きました - [[メモ] CakePHP で WebAPI っぽいルーティングしたい](http://qiita.com/kandayasu/items/e9b0c844a174d66a4c48)


Routing する
---------------

プラグインっていうと何もしないと `example.com/{プラグイン}/{コントローラ}/{アクション}` とかになってしまう。
というわけで対応。

まずはプラグインに配置したルーティング設定が有効になるようにする。
プラグインのロード時に設定しておかないと、プラグインのファイル構成の中に routes.php が存在していてもロードされない。
`app/Config/bootstrap.php` で行うプラグインの読み込みコードを次のようにする。

```php
CakePlugin::loadAll(
  array(
    'MyPlugin' => array('routes' => true)
  )
); 
```


`app/Plugin/MyPlugin/Config/routes.php` を作る。
ココでは単に、プラグインのほぼデフォルトと同じルーティングに `/api/v1` を前置きするだけの設定を行っている。
具体的にどうするかは、アプリケーションの開発戦略によるものなので、そのときどきで検討すること。
詳しくは CakePHP のドキュメントを見ると良い。


```php
$routes = Router::connect(
  '/api/v1/:plugin/:controller/:action/:id',
  array(),
  array('id' => '[0-9]+', 'pass' => array('id'))
);
```

Ajax 対応のアクションを作る
---------------

モデルのデータを検索してきて array -> JSON 文字列として変換して返す。
CakePHP で Ajax 対応メソッドを作るときのプラクティスに従い、`$this->autoRender = false;` とするのと、
`$this->request->is('ajax')` で Ajax 呼び出しが行われたかどうかを判定している。


```php
class FooController extends MyPluginAppController
{
  public function view($id) {
    $this->set('id', $id);
    return $this->render();
  }

  public function data($id)
  {
    if ($this->request->is('ajax')) {
      $this->autoRender = false;
      return json_encode(
        $this->MyPluginModel->findById($id)
      );
    }
  }
}
```

叩いてみる
---------------

アクション `foo/view` のビューから `foo/data` アクションを叩いてみる。
（暗黙的に jQuery を用いているものとする）

```php
<?php
/* app/Plugin/MyPlugin/View/Foo/view.ctp */
echo $this->Html->scriptStart(array('inline' => true)); ?> 
(function () 
{
  "use strict";
  $(document).ready(function()
  {
    var id = <?php echo $id; ?>;
    $.ajax({
      url: '/api/v1/my_plugin/foo/data/' + id,
      type: "GET",
      success: function (response) {
        console.log(response);
      },
    });
  });
})();
<?php echo $this->Html->scriptEnd(); ?>
```

いっつも思うこと
---------------

PHP のビュー変数で JavaScript を記述しているのってすげえダサみあるけど良い方法を知らない。
せめてビューでこうゆう風に書くのなんとかしたい。
CakePHP 公式のドキュメント見たり多少本を読んだりしてもここについて言及したテキストは見当たらなかったけど、みんなどうやってるんだろう。
[Swift]浮動小数点⇔文字列の変換


以外と時間がかかったのでメモ。

* `Double`型などの浮動小数点数値と文字列の相互変換は、`String`型では定義されていないため、`NSString`型を用いる必要がある

**String --> Double**(Float,Int,Int64,etc)

```lang:swift
let str: String = "3.3"

var dNum: Double = NSString(string: str).doubleValue   // 3.3
var fNum: Float  = NSString(string: str).floatValue    // 3.2999....
var iNum: Int    = NSString(string: str).integerValue  // 3
var lNum: Int64  = NSString(string: str).longLongValue // 3
var bNum: Bool   = NSString(string: str).boolValue     // true      
```

**Double --> String**

```lang:swift
let num = 3.33

var strf: String = NSString(format: "%.2f", num)
var strF: String = NSString(format: "%.2F", num)
var stre: String = NSString(format: "%.2e", num)
var strE: String = NSString(format: "%.2E", num)
var strg: String = NSString(format: "%.2g", num)
var strG: String = NSString(format: "%.2G", num)
```

* `f`(Double)以外では `F`, `e`, `E`, `g`, `G` がある→[詳細はこちら参照](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html)


## 参考

* 整数`Int`⇔文字列`String`の相互変換は、`String`型にて定義されている

**Int --> String**

```lang:swift
let num: Int = 3
var str: String = String(num)
```

**String --> Int**

```lang:swift
let str: String = "3"
var num: Int? = str.toInt()
```
コンテンツの高さをそろえたい

文字数が違ったり、写真の大きさが違った場合でも、横のコンテンツの高さをそろえたい。

様々なプラグインがあるが、jQueryのバージョンを変えたりした際に、合わなくなってしまったりしてしまうので、js/jQueryだけでかけないかと考えてみた。

以外と短くかけた。

```html
<ul class="items">
    <li class="item">あああああああああああああああ</li>
    <li class="item">いいいいいいいいいいいいい</li>
    <li class="item">ううううううううううううううううううううううううううう</li>
    <li class="item">えええええええええええええええええええ</li>
    <li class="item">おおおおおおおおお</li>
    <li class="item">かかかかかかかかかかかかかかか</li>
    <li class="item">ききき</li>
    <li class="item">くくくくくくくくくくくくくくくくくくくくくくくくくくくくくくくくくく</li>
    <li class="item">けけけけけけけけけけけけけ</li>
    <li class="item">こここここここここ</li>
</ul>
```

```css
.items{
    list-style: none;
    width: 300px;
}
.item{
    float: left;
    width: 100px;
}
```

```js
$(function(){
    var item = $('li.item');
    var itemLength,maxHeight,itemHeight;
    function setHeight(n){
        itemLength = item.length;
        item.height('auto');
        for(var i = 0; i < Math.ceil(itemLength / n); i++){
            maxHeight = 0;
            for(var j = 0; j < n; j++){
                itemHeight = item.eq(i * n + j).height();
                if(itemHeight > maxHeight) {
                    maxHeight = itemHeight;
                }
            }
            for(var k = 0; k < n; k++){
                item.eq(i * n + k).height(maxHeight);
            }
        }
    }
    setHeight(3);
});
```


例えばこんな感じ。
setHeightという関数は、"nの数字が横に並ぶ数"という条件で動く。
例えば"3"なら、横に3つずつ、4つめが下に折り返し、4列めは10つめのブロックのみの状態。

簡単に解説。
itemというclassを持っている数を数える。
itemの数をnの数で割って、繰り上げした数ループする。(縦に並ぶ列の数。ここでは4)
maxHeightの高さを0に設定する。
その中で、n回ループする。(4列の中の1列で、左からn個)
その中で、もし、maxHeightがそのitemの高さより小さかったら、上書きする。
これをn回繰り返したら、この列のheightにmaxHeightを設置する。
これを列(ここでは4)の回数繰り返す。


レスポンシブなど、可変に対応させる場合。
setHeightの関数を分岐する。


```js
$(window).on("load resize",(function(){
    var item = $('.item');
    var itemLength,maxHeight,itemHeight;
    function setHeight(n){
        //上記と同じなので省略
    }
    var winWidth = $(window).width();
    if(winWidth > 1000){
        setHeight(3);
    }else if(winWidth <= 1000 && winWidth > 768){
        setHeight(2);
    }else if(winWidth <= 768 ){
        item.height('auto');
    }
});
```


このような感じ。
一番狭いとき(横には1つしか並ばず、全て下に並ぶ場合)は、この関数を使う必要がないので、heightはautoに設定する。
関数の最初に"tem.height('auto');"と書いたのは、可変をしたり、クリックした後などに関数を使う場合、設置されたheightではなく、元々のheightを取得するため。
Pillowで読み込んだデータをOpenCVで扱えるように変換するとブルーになる話

OpenCVで細かい処理はやりたいけどファイルの入出力はPillowでやりたい！
というかOpenCVで保存するとファイルでけぇ・・。
って時ありますよね。

そんなわけでPillow -> OpenCVとOpenCV -> Pillowするサンプルを書いてみました。

```py
from PIL import Image
import cv2
import numpy as np

#PILデータで画像を読み込む
im = Image.open('t.jpg')

#OpenCVデータに変換
ocv_im = np.asarray(im)

#OpenCVで保存
cv2.imwrite("t_ocv.jpg",ocv_im)

#PILデータへ変換
pil_im = Image.fromarray(ocv_im)
#PILで保存
pil_im.save("t_pil.jpg")
```

で出てきたファイル。

t_ocv.jpg
![t_ocv.jpg](https://qiita-image-store.s3.amazonaws.com/0/44464/06923b23-c90e-2766-530c-576a0da34003.jpeg)

t_pil.jpg
![t_pil.jpg](https://qiita-image-store.s3.amazonaws.com/0/44464/c410c2fe-a50b-b9b5-177d-201e58c9197c.jpeg)


なぜかt_ocv.jpgが限りなく青に近いブルー・・・。

調べてくとOpenCVさんはカラーがRGBではなくBGR・・・なんだそれ・・・。

というわけでocv_imをRGBに変換すれば問題なし。

```py
cv2.imwrite("t_ocv.jpg",ocv_im)
```
↓
```py
cv2.imwrite("t_ocv.jpg",ocv_im[:, :, ::-1].copy())
```

解決。以上。
なぜJavaFXアプリはmain()メソッド無しで動くのか


「[JavaFXでウィンドウを表示するための最低限のコード](http://qiita.com/toshi71/items/c1ad1544cd7a05d5b8a5)」という記事の中で、JavaFXアプリケーションにはmain()メソッドは不要であると書きました。その点について少し調べてみました。


Oracleの「[JavaFX: Getting Started with JavaFX](http://docs.oracle.com/javase/8/javafx/get-started-tutorial/index.html)」というドキュメントの中に、次のような記述を発見しました。

> __The main() method is not required for JavaFX applications__ when the JAR file for the application is created with the JavaFX Packager tool, __which embeds the JavaFX Launcher in the JAR file.__ However, it is useful to include the main() method so you can run JAR files that were created without the JavaFX Launcher, such as when using an IDE in which the JavaFX tools are not fully integrated. Also, Swing applications that embed JavaFX code require the main() method.

(http://docs.oracle.com/javase/8/javafx/get-started-tutorial/hello_world.htm)

自分なりに訳してみると、

> JavaFXアプリのJARファイルがJavaFXパッケージャ・ツールを使って作成された場合、 __JARファイル内にJavaFXランチャーが埋め込まれるので、main()メソッドは必要ありません。__　しかし、JavaFXランチャーを持たないJARファイル（JavaFXツールを完全に統合していないIDEで作成されたもの）も起動させられるように、main()メソッドを記述しておくことは有用です。また、JavaFXコードを埋め込んだSwingアプリケーションにもmain()メソッドが必要です。

要は

- JavaFX Packager toolがキッチリ働いてくれればランチャーが埋め込まれるからmain()メソッドは必要ない
- でも、そうでない環境もあるから念のため書いておいた方が良い

ってことになるかと思います。なので、「最低限」を目指すわけではない通常のコーディングでは記述するようにします。
ちなみに、JavaFX Packager toolについては[こちら](http://docs.oracle.com/javafx/2/deployment/packager.htm)に詳しい説明がありました。
classが存在するか否かを判定する

jQueryには、`hasClass`というメソッドがある。


```html
<div class="hoge"></div>
```

```js
$('div').hasClass('hoge');
```

上記のように、そのタグにhogeというclassがついているかどうかを判定する。

例えば、こんなときに使える。

```html
<div class="hoge">テスト1</div>
<div>テスト2</div>
<div class="hoge">テスト3</div>
<div>テスト4</div>
<div>テスト5</div>
```

```js
$('div').click(function(){
    if($(this).hasClass('hoge')){
        $(this).css('color','red');
    }
});
```

クリックしたとき、hogeというclassがついていたら、文字色を赤くする。
など。

しかし、これではclassが存在するかどうか、を判定する場合には使えない。

そこで使えるのが、`length`。

length=長さ、個数を表すメソッドである。

これで、hogeというclassが存在しているかどうかを判定することができる。

```js
if($('.hoge').length;){
    $('body').css('background','blue');
}
```

これで、hogeというclassが存在していたら、背景色を青にする。
GitHub用に使用してるChrome Extension

# はじめに

+ 個人で使用中のChrome Extensionをまとめたもの
+ 自分とは作業背景に差異がある場合は、当てはまらない可能性が多々ある

# 目的

+ [あくしゅ](http://axsh.jp/)メンバーへの展開・共有

# 対象者

+ 開発の半分以上を[GitHub](https://github.com/)に依存している

# Chrome Extensions

## Issues

+ [GitHub Notifier - Chrome Web Store](https://chrome.google.com/webstore/detail/github-notifier/lmjdlojahmbbcodnpecnjnmlddbkjhnn)
   + 未読通知数を表示
   + [Notifications](https://github.com/notifications)へのリンク
+ [Github Checker - Chrome Web Store](https://chrome.google.com/webstore/detail/github-checker/dejgifcjoefbogdjpjokobdlddjhbich)
   + 担当Issue数を表示
   + 作業漏れ防止
   + 上限限数は30
        + 30以上の場合も30として表示される
        + 「残件30だ！」と安心してはいけない
        + 担当数を30以内に保つきっかけになる
+ [ZenHub for GitHub - Chrome Web Store](https://chrome.google.com/webstore/detail/zenhub-for-github/ogcgkffhplmphkaahpmffcafajaocjbd)
   + [Trello](https://trello.com/)のように、Issueをカードとして扱える
   + ワークフローを構築可能
        + Issueには作業中などの状態を持たせられない
        + labelで代用する方法もあるが、上手く行った試しがない
   + 2種類の料金体系
        + 全てがpublicリポジトリの場合、無料
        + privateリポジトリを含む倍、30日間無料で利用可能
+ [Github Sequence Diagrams - Chrome ウェブストア](https://chrome.google.com/webstore/detail/github-sequence-diagrams/okomebddpkofkggafolekknmhookbkcf)
   + シーケンス図を描画
   + アスキーアートでは表現し切れない表現を補助してくれる
   + 拡張機能をインストールしてないクライアントには、ヒアドキュメントとして表示される

## PullRequest

+ [Pretty Pull Requests (Github) - Chrome Web Store](https://chrome.google.com/webstore/detail/pretty-pull-requests-gith/ljnjpkadhhcdniohpfilddnhahoigdec/related)
   + ファイル毎にアコーデオンで差分内容を開閉可
   + 対象ファイル数が多い場合や変更内容が多い場合、一時的に閉じ、全体を俯瞰しやすくなる

## Commit History

+ [Github improved - Chrome Web Store](https://chrome.google.com/webstore/detail/github-improved/nkbnmpfpclijlllipmfbkkednidgngaa)
   + Commit履歴一覧ページに、diff結果を差し込める
        + 通常、Commit一覧ページには変更内容が表示されない
   + Commit履歴一覧ページ内で内容を確認まで完結可能
        + 該当する変更内容表示ページへ遷移する必要が無い

## Design

+ [github.expandinizr - Chrome Web Store](https://chrome.google.com/webstore/detail/githubexpandinizr/cbehdjjcilgnejbpnjhobkiiggkedfib/related)
   + 通常は固定幅となるが、この機能により横幅を広げられる
   + 横長ディスプレイを有効活用出来る
   + 影響範囲はGitHub.com全体
+ [Octotree - Chrome Web Store](https://chrome.google.com/webstore/detail/octotree/bkhaagjahfmjljalopjnoealnfndnagc)
   + リポジトリのTree構造を提供
   + ファイルマネージャ化
   + 必要に応じ開閉を選択可能

## Wiki

+ [GitHub Wiki Search - Chrome Web Store](https://chrome.google.com/webstore/detail/github-wiki-search/gdifdhnjmjaidbajhapmbcbnoocoeooc/related)
   + GitHub Wikiに検索窓を追加可能
   + GitHub Wikiを検索対象に入れられる
      + ページ上部の検索窓は、GitHub Wikiが検索対象外
      + GitHub Wiki内の検索窓っぽいものは、Wikiページ名が検索対象である
   + 検索キーワードをハイライト表示

## 番外編(GitHub用ではないけども重宝している拡張機能)

+ [Awesome Screenshot: キャプチャーと注釈 - Chrome ウェブストア](https://chrome.google.com/webstore/detail/awesome-screenshot-captur/alelhddbbhepgpmgidjdcjakblofbmce)
    + 閲覧ページをキャプチャ
    + ページ全体・ページ内を選択したキャプチャも可能
    + 簡単なペイントツールも内蔵しているので手順書作成に役立つ

# 参考文献

+ [GitHub を使いやすくする Chrome Extension 5 選 - Qiita](http://qiita.com/kbaba1001/items/b26157fbee95a0433495)
+ [GitHubユーザが入れるべきChrome Extensionまとめ - Qiita](http://qiita.com/dtaniwaki/items/2f34055476803b97fa8e)
+ [Githubを劇的に使いやすくしてくれるChrome Extensions - Qiita](http://qiita.com/sotayamashita/items/2cc6a32a0994b5069c7e)
java学び直しメモ part5 ～一次元配列～

##今回の内容
[前回](http://qiita.com/yuukieiu/items/0a10b035e9ccfde908cd)は，プログラミングの最重要要素の1つであるfor文についてでした．

今回は，一次元配列というデータ構造について，学習していきます．

##一次元配列とは
生徒のテストの点数をプログラム上で書くとするなら，どのように書くでしょう？

```java:TestPoint.java
int suzuki = 90;
int tanaka = 62;
int nakata = 78;
...
```

生徒が少なければいいですが，1クラス40人全員のテストの点数を別々の変数で用意すると，とても面倒に感じます．

そこで利用するのが，**一次元配列**です．
**配列**は同じ性質のもの（今回ならばテストの点数）が集まった行列，のようなものと考えるといいと思います．
一次元配列は行列なので，1つの変数に見えるのに，複数の要素をもちます．
要素を取り出すときは，○○という配列の✕✕番目，というような取り出し方をします．
わかりにくいので，図にするとこんな感じ．

![変数配列.PNG](https://qiita-image-store.s3.amazonaws.com/0/57278/4bbeda22-5723-68a1-a10d-517a36b8492d.png)

##構文
配列の宣言の方法はいくつかあります．

```java:ArrayStatement.java
int hoge[];                        // int[] hoge;と書いてもいい
hoge = new Int[要素数];

// 1行で
int hoge[] = new Int[要素数];

// 宣言と同時に代入
int hoge[] = {要素1, 要素2, 要素3};
```

int（Int）の部分をdouble（Double）やStringに変えることで，それぞれのデータ型の配列を宣言することができます．
こういうのやってると型推論言語のほうが楽だな，ってなってきます…
javaの配列は，宣言のときに要素数を決めたら，増やしたり減らしたりできないので，めっちゃ不便です．
ArrayListというものを使うと配列のような構造で要素数を増やしたり減らしたりできますが，その話はまた今度…

##要素を取り出す
配列の中の要素を取り出すには，何番目の要素を取り出すか，指定します．
このとき，要素の番号は**0番目から始まる**ことに注意します．

```java:GetElement.java
int[] hoge = {4, 8, 2, 3, 9, 7, 6};
//            0  1  2  3  4  5  6  番目

// 2 を取り出す
System.out.println(hoge[2]);

// 9 を取り出す
System.out.println(hoge[4]);

```

##要素数を得る
要素数はjavaが勝手に数えてくれています．

```java:GetElementNum.java
int[] hoge = {4, 8, 2, 3, 9, 7, 6};

// hoge の要素数を出力
System.out.println(hoge.length);
```

要素数と要素の番号の違いに注意です．
例の配列の要素番号の最大は6ですが，要素数は7です．
この違いをうまく使うことでスマートなプログラムに近づきます．（と僕は思います．）

##forと組み合わせる
配列とfor文を組み合わせてこんなことができます．

```java:ArrayAndFor.java
int[] hoge = {4, 8, 2, 3, 9, 7, 6};
//            0  1  2  3  4  5  6  番目

for (int i = 0; i < hoge.length; i++) {    // 要素数は7なので，i < 7

    // i 番目の要素を出力
    System.out.println(hoge[i]);
}
```

ここで，前回説明できなかった**拡張for文**が登場します．

```java:ExtendFor.java
int[] hoge = {4, 8, 2, 3, 9, 7, 6};

for (int x : hoge) {            // 拡張for文
    System.out.println(x);
}
```

拡張for文は，hogeの部分に指定された配列から，1つずつ要素を取り出して，xに代入する，という文です．
ループ条件を指定しなくても，配列の要素の数だけ繰り返します．
また，カウンタも必要ありません．
簡潔に書けて綺麗だと思いませんか？
for文を使うときは，大抵拡張for文でできるような使い方をするので，普通のfor文は余り使いません．
Pythonではそもそも基本のfor文が拡張for文ですし…

##おわり
配列を使うことで，変数の幅が広がって，できることが増え，綺麗にプログラムが書けるようになった気がしませんか？
（実際に配列を使うかどうかという話は別として…）
今回は一次元配列でしたが，次回は次元の壁をぶち破ります（？）
「第2期 第○回 H本読書会 in 秋葉原」無事終えて まとめ

[H本読書会](http://readhbon.doorkeeper.jp/)の開催手記をまとめて置いておくところ

[「第2期 第1回 H本読書会 in 秋葉原」無事終えて](http://qtamaki.hatenablog.com/entry/20141114/1415957644)

[「第2期 第2回 H本読書会 in 秋葉原」無事終えて](http://qtamaki.hatenablog.com/entry/20141126/1417018230)

[「第2期 第2回 H本読書会 in 秋葉原」でIntegralが気になった](http://qtamaki.hatenablog.com/entry/2014/12/08/184010)

[「第2期 第3回 H本読書会 in 秋葉原」無事終えて](http://qtamaki.hatenablog.com/entry/2014/12/11/180942)

[「第2期 第4回 H本読書会 in 秋葉原」無事終えて](http://qtamaki.hatenablog.com/entry/2015/01/16/094727)

[「第2期 第5回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/01/22/134224)

[「第2期 第6回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/01/22/134224)

[「第2期 第7回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/02/20/095032)

[「第2期 第8回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/03/11/105946)

[「第2期 第9回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/03/23/142658)

[「第2期 第10回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/04/14/100000)

[「第2期 第11回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/04/21/122228)

[「第2期 第12回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/05/23/085856)

[「第2期 第13回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/05/28/190130)

[「第2期 第14回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/06/11/122838)

[「第2期 第15回 H本読書会 in 秋葉原」無事終えて #readhbon #haskell](http://qtamaki.hatenablog.com/entry/2015/06/26/150649)

Qiitaこんな使い方ばっかりしてる。
23章 ディプロマティック・イミュニティ(外交特権)

## 23.1 目的: ベストプラクティスを採用する
ソフトウェアエンジニアリングのベストプラクティス

* ソースコードのバージョン管理
* ユニットテストや機能テストの自動化・実行
* ドキュメント、仕様書、コードコメントを書く

ベストプラクティスを怠るとプロジェクトは失敗に向けて進みだす

## 23.2 アンチパターン: SQLを特別扱いする
アプリケーション開発のルールはデータベース開発には当てはまらない
=> 「**ディプロマティック・イミュニティ(外交特権)**」

そう考えられる理由は

* データベース管理者はいくつかの開発チームを掛け持ちすることがあり、「お客さん」のように扱われる
* SQL言語がアプリケーションコード内で特殊な言語として扱われる
* アプリケーションコードを記述するときに使える高度なIDEツールがデータベース開発向けにはない
* データベースに関する知識や運用権限が1人のデータベース管理者に集中してしまう傾向にある

## 23.3 アンチパターンの見つけ方
以下のような兆候がある

* 軽量なエンジニアリングプロセスの採用
* データベース管理者をバージョン管理システムのトレーニングに呼ばない
* データベースのテーブルや列が使われているかの調べかたがわからない
* データベーススキーマ変更の適用プロセスに従っていない

## 23.4 アンチパターンを用いてもよい場合
すべてのコードにドキュメントやテストを書くのは大変ですよね？

何度も使うコードに対してはベストプラクティスを適用しましょう
その場限りのコードであれば、そうしなくてもいいでしょう

一時的なものかの判断は使い終わった後すぐに削除できるかどうか
削除できないのであれば、バージョン管理システムに保存し、ドキュメント等を書きましょう

## 23.5 解決策: 包括的に品質問題に取り組む
ソフトウェア開発者の多くが行っているテストは品質管理であり、大きなストーリーの一部でしかなく、ソフトウェアエンジニアリングのライフサイクルは品質保証を伴う
品質保証は3つの部分からなる

* プロジェクト要件の明確な定義・文書化
* 要件に対する解決策の設計・構築
* 解決策が要件を満たしていることの確認・テスト

データベース開発における品質保証

* 文書化
* バージョン管理
* テスティング

## 23.5.1 文書化
データベースの要件と実装はアプリケーションコードと同じように文書化すべき
以下のチェックリストを使って文書化しましょう

* ER図
    * テーブルとその関連を表す図
    * 列・キー・インデックスなどを記すための表記法がある
    * 図表作成用の製品のなかにはER図の表記法要素を含むものもある
* テーブル・列・ビュー
    * データベースを説明する文書も必要
    * 説明する対象
        * 参照テーブル・交差テーブル・従属テーブル
        * 列の名前やデータ型
        * ビューの目的や想定されるテーブル間の関連
* 関連(リレーションシップ)
    * スキーマ上の制約の根拠となるビジネスルール等の説明
* トリガー
    * トリガーに実装しているビジネスルール
* ストアドプロシージャ
    * どのような問題を解決するものか
    * データに対する変更を行うか
    * 入出力パラメータのデータ型と意味
* SQLセキュリティ
    * データベースユーザの定義
    * 各ユーザのアクセス権
    * システムレベルのセキュリティ対策　等
* データベースインフラストラクチャ
    * データベースの種類とバージョン
    * データベースサーバーのホスト名 等
* オブジェクトリレーショナルマッピング
    * アプリケーションコードに実装されるビジネスルール
    * データの妥当性確認・データ変換

## 23.5.2 バージョン管理
データベースサーバーが故障によって完全にダメになってしまった場合どうしますか？
変更を取りやめたい場合、どのように元に戻せばいいでしょう？

アプリケーションコードと同様にデータベースを扱うコードに対してもバージョン管理を用いましょう
バージョン管理下に入れておく、ファイル

* データ定義スクリプト
* トリガーとプロシージャ
* ブートストラップデータ
* ER図とドキュメント
* データベース管理スクリプト

## 23.5.3 テスティング
品質保証の最終パートは、品質管理です
テスティングの重要な原則の1つは独立(isolation)です
テストごとにシステムの１部分のみを検証することで、欠陥が存在する場合に、可能な限り正確に、欠陥の箇所を絞り込める

アイソレーションテストはデータベースにも適用できます
データベースの妥当性を検証するテストのためのチェックリストを以下にしめす

* テーブル・列・ビュー
    * 存在することのテストだけでなく、削除したテーブルがないことを確認する否定テストも行いましょう
* 制約
    * 制約に違反するようなステートメントを実行し、エラーになることをテストしましょう
* トリガー
    * トリガーを発動させ、それを確認するためのクエリを実行するシナリオテストをしましょう
* ストアドプロシージャ
    * アプリケーションコードのユニットテストと似ている
    * 入力およびデータの条件に応じたテストをしましょう
* ブートストラップデータ
    * 初期データ確認のクエリを実行してテストしましょう
* クエリ
    * クエリを実行し、結果が適切かを確認しましょう
* オブジェクトリレーショナルマッピング
    * バリデーション等をテストしましょう

## 23.5.4 複数のブランチを扱う
アプリケーションの開発ではバージョン管理していると思いますが、データベースはバージョン管理の対象外です。
理想は、各ブランチ向けにそれぞれデータベースインスタンスを構築することです。
データベース接続パラメータが設定できるようにしましょう
Provisioning profile is expiring のWarningを消すには

# はじめに
思い出した頃に出てくるWarning「Provisioning profile is expiring」。
Xcodeのバージョンによって解決に至るまでの道程が異なってきます。

Xcode6での対応方法です。

# 警告を出しているProfileファイルを削除
Xcode -> Preferences -> Accounts -> View Details
と辿り、警告が出ている項目を右クリックし、Finderで表示。

該当のファイルが選択されているので削除します。

# おわりに
100件以上Warningが出ていたコードを引き継ぎ、
地道に解決していって最後に残った警告がこれでした。
デベロッパーネットワーク>アプリケーションの管理>利用状況について

掲題について、利用状況タブはAPIの利用ログのような物が表示される理解で合っているでしょうか。
属性取得APIを叩いて情報取得を行っておりますが、利用状況タブは「アクセスされた履歴はありません。」のまま更新されない為、お聞きしております。
また、今後は注文APIを叩く予定です。（現在、利用申請中）
以上、宜しくお願い致します。