OmniAICreator/Qiita-1.07M huggingface dataset:
cocos2d-html5 で spy-js を使ってみる

phpstorm8 や webstorm8 で spy-js が使えるようになったらしいので試しに cocos2d-js のサンプルで使ってみる．ココで使ってるのは Cocos2d-JS html5 engine の部分． 

# 起動するまで

Intellij IDEA で git のリポジトリからプロジェクト作る機能を使うか下記のように手動で取ってきて Open する．

```
$ git clone git://github.com/cocos2d/cocos2d-js.git --recursive
```

起動するまでは[ここらへん](http://qiita.com/laco0416/items/985044f0019ebef6cb2c#2-4)と同じ．

Chrome などで開くときは，サンプルは samples/js-moonwarriors などにあるのでこの index.html を開く．

起動すると下記のような感じで使うことが出来る．

![4f4f6639.png](https://qiita-image-store.s3.amazonaws.com/0/6975/6a350503-92bb-57c3-4caf-41b972ceed0b.png)

# Tracking Exclusion

## イベントスタックが多い問題の対応

使ってみるとわかると思うが cocos2d-js で spy-js を使うとイベントの詳細を見ようとしても基本的に cocos2d-js で使われているファイルがイベントスタックに表示されるため，自分がコーディングした部分を見つけるのが大変だったりする．


![936d1b99.png](https://qiita-image-store.s3.amazonaws.com/0/6975/daa35aa8-a52c-68ff-d518-9cc9b985742a.png)


そこで spy-js は[Tracking Exclusion](http://blog.jetbrains.com/webstorm/2014/04/spy-js-webstorm-secret-service/#settings)で不要なイベントやファイルをフィルタすることが出来る． Exclude したものはそれ以下のものが全て表示されなくなるのではなく対象ファイルだけ表示されなくなるのでライブラリとかをトレースに表示する必要がないならライブラリごとフィルタしてしまってよさそう．

たとえばこのように設定すると

![6675e613.png](https://qiita-image-store.s3.amazonaws.com/0/6975/b27926f2-6c07-3673-9f16-23f4fd3ccd28.png)

さっきの大量のトレースが減る．

![d67872c9.png](https://qiita-image-store.s3.amazonaws.com/0/6975/423cd412-86c1-2375-bbaa-f569cdd4f366.png)

## イベントが貯まって消えてしまう問題の対応

また external や devicemotion などのイベントが大量に発行されてみたいイベントが見つけにくくなる．さらに一度に表示されるイベントは 1000 件程度で特定のイベントのトレース見てても 1000 件消えた時点で消えてしまう．消えてしまうとトレースもできなくなるのでとても面倒．

![8084181a.png](https://qiita-image-store.s3.amazonaws.com/0/6975/d5323aaa-dd42-732e-b4e4-9aa71fd07341.png)

なのでほしいイベントがとれたら全部除外するフィルタを設定するとよさそう．

![feb70d11.png](https://qiita-image-store.s3.amazonaws.com/0/6975/784166ec-15b3-2b54-37c9-4ab0d7878fda.png)

## その他

* ちなみに socket.io のイベントも見られるので サーバクライアントで socket.io 使ってる場合は追跡めっちゃ楽になる．
* node.js をサーバ側のアプリとして使っててそちらでも spy-js を使ってる場合，このフィルタ選択は共有されてしまい，クライアントとサーバでそれぞれ別のフィルタを使えない．同時に使う場合はうまくしないとほしいイベントも消えてしまうかも．
* バグっぽいが ”Remove All” を使って消すとその後のイベントが全くキャッチされなくなる．されなくなったらブラウザで開いてるページを再読み込みするとまた表示される．
![screenshot 2014-09-20 10.46.18.png](https://qiita-image-store.s3.amazonaws.com/0/6975/ad812cbc-cd83-4f1e-b022-4c2f8ff45386.png)
* フィルタ出来るのはイベント単位またはファイル単位となっている様子．なので同じファイル内で同じイベントの処理をいろいろ追加してる場合はファイルを分けるという対応をすることで対応はできる．うまく検索する機能がほしい場合は[このチケット](https://youtrack.jetbrains.com/issue/WEB-13284) に vote しよう．


# 参考文献

> Spy-js: WebStorm secret service | JetBrains WebStorm Blog
> http://blog.jetbrains.com/webstorm/2014/04/spy-js-webstorm-secret-service/#settings

> WebStorm+Spy-jsの使い方 - Qiita
> http://qiita.com/laco0416/items/985044f0019ebef6cb2c
curlでOracle JDKを取得する


## はじめに

curlでOracle JDKを取得する方法を記述します。

JDKのダウンロードには、ライセンス(Oracle Binary Code License Agreement for Java SE)への同意が必要となります。
同意できる場合のみダウンロードしてください。

## 環境

* CentOS 6.5
* curl 7.19.7

## JDKを取得する

単純にダウンロードするJDKのURLを指定すると、HTMLがダウンロードされてしまいます。
cookieを送信することで、期待通りにJDKをダウンロードできるようになります。

```shell
$ curl -LO -b "oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.rpm"
```
上記では、Java SE Development Kit 7u55をダウンロードしています。


リンクのURLは以下のページから確認をおこなえます。

* Java SE 8
[Java SE 8 Archive Downloads](http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html)

* Java SE 7
[Java SE 7 Downloads](http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html)

## 参考

* [Linuxでjdkをwgetする方法](http://qiita.com/hajimeni/items/67d9e9b0d169bf68d1c9)
* [Manual -- curl usage explained](http://www.hcn.zaq.ne.jp/___/unix/curl_manual.html)
MacbookAirをネットワークブートサーバにする君作った

* [iPXEでCentOS5,6インストーラをboot - Qiita](http://qiita.com/tukiyo3/items/bdb4d28d4fa7059c5d14)

# download

* [dnsmasq.ipxe](https://github.com/tukiyo/dnsmasq.ipxe)

# 環境

* dnsmasq (`brew install dnsmasq`)
  * DHCPサーバ、TFTPサーバ
* [iPXE](http://ipxe.org)、[ROM-o-matic.eu | Generate iPXE images | open source network boot firmware](https://rom-o-matic.eu/)
  * PXE BOOTイメージ
* MacbookAir + [usb nic](http://buffalo.jp/products/catalog/network/lua3-u2-atx/)
* HTTPサーバ + [CloneZilla](http://sourceforge.jp/projects/sfnet_clonezilla/releases/)
  * HTTPサーバのためTFTPより3倍くらい転送速度が早い

## 構成図

![ネットワーク図.png](https://qiita-image-store.s3.amazonaws.com/0/25728/299e3c28-15cf-849f-4bae-f0d8cdcef57c.png)

# 準備

1. brew install dnsmasq
1. Macbook AirにUSB LANアダプターを接続 (en4として認識される)
1. en4のIPアドレスを192.168.9.9に設定
1. USB LANアダプターと、ネットワークブートさせたいPCをLANケーブルで直繋ぎする


## CloneZillaをネットワークブートさせたい場合

1. cd clonezilla
1. ./extract_clonezilla_i486.sh

を実行し、以下ファイルが作成される。

* filesystem.squashfs
* initrd.img
* vmlinuz

# 起動/終了

## 起動の仕方

1. ./startup.sh で起動、ctrl+Cでdnsmasq停止

## 終了の仕方

1. ./stop.sh で子プロセス終了

# 注意点

* CentOS7はネットワークブート成功していない。後日対応するかも
* PXEブートの途中で止まる場合、PXEブートイメージを切り替えてください。

```diff:dnsmasq.conf
  # PXEブート完了しない場合は、以下切り替えて試すこと。
- dhcp-boot=undionly.kpxe
+ dhcp-boot=ipxe.kkpxe
  #dhcp-boot=ipxe.kkkpxe
```

* インターネット共有をしていると以下エラーが出るので同時にはしないこと。

> dnsmasq: failed to bind DHCP server socket: Address already in use

![インターネット共有.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f6c26db8-c9d1-2d6c-5f8a-6aee8d9bd61a.png)

# デフォルトゲートウェイの変更

```bash:
route add default gw 192.168.xxx.xxx
```
historyとawkでライフロググラフ


自分のコマンド履歴をグラフ風にしてながめてみたい

# 準備

historyログに日時を追加と件数を増やす

```
$ echo "### history" >> ~/.bash_profile
$ echo "HISTTIMEFORMAT='%y/%m/%d %H:%M:%S '" >> ~/.bash_profile
$ echo "HISTSIZE=100000" >> ~/.bash_profile
```

準備完了！

# 人気コマンドランキング(俺)

```
history | awk '{h[$4]++}END{for(i in h){print h[i],i|"sort -rn|head -20"}}' |awk '!max{max=$1;}{r="";i=s=60*$1/max;while(i-->0)r=r"#";printf "%15s %5d %s %s",$2,$1,r,"\n";}'
```

結果例

```
            git   105 ############################################################
            npm    77 ############################################
             vi    72 ##########################################
             ls    66 ######################################
             cd    64 #####################################
        history    30 ##################
            pwd    13 ########
            nvm     9 ######
             rm     8 #####
     node-debug     8 #####
           exit     8 #####
             cp     8 #####
           sudo     6 ####
             sh     6 ####
           find     6 ####
           echo     6 ####
           brew     6 ####
           perl     5 ###
            mvn     5 ###
        express     5 ###
```

# 日別コマンド数グラフ(俺)

```
history | awk '{h[$2]++}END{for(i in h){print h[i],i|"sort -k 1|head -20"}}' |awk '!max{max=$1;}{r="";i=s=60*$1/max;while(i-->0)r=r"#";printf "%15s %5d %s %s",$2,$1,r,"\n";}'
```

結果はサンプル少ないので省略

# まとめ
- 楽しいw
- 次は日別コマンドランキングを集計してgoogleトレンド風に推移をみれるようにしてみる
Windows環境でGitBucket

## サーバー側の設定

### JRE のインストール
<http://www.oracle.com/technetwork/java/javase/downloads/index.html> から JRE(jre-7u*-windows-*.exe) をダウンロードしてインストール。

### Tomcat のインストール
1. <http://tomcat.apache.org/download-70.cgi> から「32-bit/64-bit Windows Service Installer」をダウンロード。
2. インストール先（例:`C:/tomcat`）を指定してインストール。

#### GitBucketの検索キーワードが文字化けしないようにする対策
conf/server.xml を、下記の通り変更する。

    <Connector port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443" />

↓

    <Connector port="8080" protocol="HTTP/1.1"
        connectionTimeout="20000"
        redirectPort="8443"
        URIEncoding="UTF-8"
        useBodyEncodingForURI="true" />

### GitBucket のインストール
1. <https://github.com/takezoe/gitbucket/releases> から gitbucket.war をダウンロード。
2. システム環境変数に `GITBUCKET_HOME` を設定（例：`D:/GitBucket`）。
3. `C:\tomcat\webapps` にwarファイルを配置。
4. <http://****:8080/gitbucket> へ接続して動作することを確認。

## クライアント側の設定
### git for windows のインストール
1. <http://msysgit.github.io/> からインストーラをダウンロードして実行。
2. 「Select Components」で、
    - 「Windows Explorer integration」のチェックを外す。
    - 「Associate .sh files to be run with Bash」のチェックを外す。
    - 「Use a TrueType font in all console windows (not only for Git Bash)」のチェックが外れていることを確認。
3. 「Adjusting your PATH environment」で「Use Git from the Windows Command Prompt」を選択。
4. 「Configuring the line ending conversions」で「Checkout as-is, commit as-is」等を選択。（使用部署での方針に合わせて設定）

#### ユーザー名とメールアドレスの設定
`c:\<ユーザー名>\.gitconfig` に以下を追記。

    [user]
        name = <名前>
        email = <メールアドレス>

#### エディタをサクラエディタに変更
`c:\<ユーザー名>\.gitconfig` に以下を追記。

    [core]
        editor = 'C:/Program Files (x86)/sakura/sakura.exe' -CODE=4

#### mergetool の設定
`c:\<ユーザー名>\.gitconfig` に以下を追記。

    [merge]
        tool = WinMerge
    [mergetool "WinMerge"]
        cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' //r //e //u //wl //wr \"$LOCAL\" \"$BASE\"  \"$REMOTE\" //o  \"$MERGED\"
    [mergetool]
        keepBackup = false

### WinMerge のインストール
3方向マージ機能を使うため、バージョンは`2.14.0-jp-29`以降であること

1. <http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html> からダウンロードしてインストール。
2. オプション > バックアップファイル > バックアップフォルダを選択し、適当なバックアップフォルダを設定。

### GitBucket からダウンロードしたZIPファイル内の日本語ファイル名が文字化けする場合の対応
<http://support.microsoft.com/kb/2704299/ja> の修正プログラムをあてる。

## 参考
- [日本語を含むZIPファイルを文字化けせず解凍する方法](http://qiita.com/hoo89@github/items/46dcd8134061c392772f)
- [Re: Gitのdiff・mergeをgitconfigだけでWinMergeにする](http://takanosho.wordpress.com/2012/12/25/git-merge-tool-using-winmerge/)
[SQLメモ] テーブルいっぱいあるとき検索する


```sql
SHOW TABLES LIKE '%hoge%';
```

もちろん、こんなでも大丈夫。

```sql
SHOW TABLES LIKE "%hoge%";
```

### 蛇足

`'`でも`"`でもいいよ。って言われるときは、どうしても、その違いはなんですか？って思う。


> If the ANSI_QUOTES SQL mode is enabled, string literals can be quoted only within single quotation marks because a string quoted within double quotation marks is interpreted as an identifier.
(from MySQL Documentation)

ANSI_QUOTESモードだと`"`が使えない。

そもそも、ANSI_QUOTESなんて、よくわからないから、まあいいや。

それと、`'`や`"`を文字列として扱いたいときは、

```sql
'This is "Hoge".'
```
とかでもいいし、`\`でエスケープもできる。

（参照）
http://dev.mysql.com/doc/refman/5.1/en/string-literals.html

PHPとかと同じ感じでした。ありがとうございました。
whereにSQLの文字列を渡したくない！


## なんで文字列を渡したくないのか
* なんとなく文字列で渡すというのが地に足がついてない感じでイヤ
* DBの種類を変えると動かなくなる可能性がある
* `merge`ができないことがある

## 例えばこんなの書きたくない
### 比較演算
```rb
target_age = 30
User.where('age >= ?', target_age)
```

### or
```rb
target_name1 = '山田'
target_name2 = '田中'
User.where('name=? OR name=?', target_name1, target_name2)
```

### like
```rb
target_letter = '田'
User.where('name like ?', "%#{target_letter}%")
```

## Arel::tableを使う
ActiveRecordは内部でArelというSQL生成用ライブラリを使用している。
直接使うこともできるので、Arelで作ったSQLを文字列の代わりにwhereに渡してやろう、ということ。

### 比較演算
```rb
target_age = 30
User.where(User.arel_table[:age].gt(target_age))
```

ちなみに、
* = (equal) : `eq`
* < (less than) : `lt`
* <= (less than equal) : `lteq`
* > (greater than) : `gt`
* >= (greater than equal) : `gteq`

### or
```rb
target_name1 = '山田'
target_name2 = '田中'
User.where(User.arel_table[:name].eq(target_name1).or(User.arel_table[:name].eq(target_name2)))
```

### like
```rb
target_letter = '田'
User.where(User.arel_table[:name].matches("%#{target_letter}%"))
```

## Squeelを使えばもっといい感じに！
`Arel::table`でもとりあえず当初の目的は達成できたけど、如何せん長い…
Gemを入れてよければ、`Squeel`を使えばスッキリ書ける。

### 比較演算
```rb
target_age = 30
User.where{age >= target_age}
```

`()`ではなく`{}`を使う。

### or
```rb
target_name1 = '山田'
target_name2 = '田中'
User.where{(name == target_name1) | (name == target_name2)}
```

`||`ではなく`|`。
ちなみにandも`&&`ではなく`&`。

### like
```rb
target_letter = '田'
User.where{name =~ "%#{target_letter}%"}
```

これだけ見ると`Squeel`の完全勝利に見えるけど、
`Arel::table`だとSQLの生成式を関数化して、複数箇所で使いまわせたりして便利だったりするのかな。

## 参考
[ActiveRecord4でこんなSQLクエリどう書くの? Arel編](http://labs.timedia.co.jp/2013/10/activerecord4sql-arel.html)
[ActiveRecord4でこんなSQLクエリどう書くの？ Squeel編](http://labs.timedia.co.jp/2013/11/activerecord4sql-squeel.html)

[activerecord-hackery/squeel](https://github.com/activerecord-hackery/squeel)
ソースタイリング

タイル地図で、ソースデータがウェブ地図タイルと異なる矩形単位で管理されている場合どういうふうにウェブサーバでリリースしていくことが楽になるか。

目指すべき理想の世界では、ソースデータもウェブ地図タイルと同じ矩形単位で生きていくべくであるが、それは当面無理である。とはいえ安易な解としてデータベースに飛びついてしまえば、パフォーマンス上・セキュリティ上の大きな軛になる。この状況では、決してデータベースに飛びついてはならない。

この場合の手法をメモしておく。ソースタイリングと仮称する。

レイヤーコンポジションと同じ手法を用いる。URLインタフェース的には Mapzen Vector Tile Services の {layers} 指定で表現されるような方法だ。リクエストの際に複数のレイヤを指定する。レスポンスでは両方のレイヤが接続(cat)されて返ってくる。

このエントリでは余談になるが、GeoJSONベクトルタイルデータの場合タイルの cat は簡単で、冒頭の {"type": "FeatureCollection", "features: [ と、末尾の ]} を外して UNIX cat し、cat した後に全体の前後に、さきほど外したものをつければよい。

本題に戻ると、ソースデータの矩形単位でXYZタイルセットを作る。ウェブ地図でタイルがcallされたときに、そのタイル番号のタイルについて、すべてのソースデータごとのツリーにあるタイルを cat すればよい。

ソースデータの単位の個数が多い場合には、どのタイル番号にはどのソースデータがかかるかを示すタイルセットを中間的に持てば、空打ちを削減できる。これは、ココタイルの発想である。

以上、記載所要時間は7分であった。
IE10 で Flexible Box を JavaScript から使うときの注意点


## IE10, IE11, Chrome, Firefox で正しく動く例

```css:CSS
.flex-box {
    flex: 1 1 1px;
    flex-grow: 1;
    flex-shrink: 1;
    flex-basis: 1px;
}
```

```js:JavaScript
$('.flex-box').css('flex'); // 取得
$('.flex-box').css('flex', '1 1 1px'); // 変更
```

## IE10 だけ動かない例

IE11, Chrome, Firefox は正しく動きます。

```js:JavaScript
// 取得
$('.flex-box').css('flex-grow');
$('.flex-box').css('flex-shrink');
$('.flex-box').css('flex-basis');

// 変更
$('.flex-box').css('flex-grow', 1);
$('.flex-box').css('flex-shrink', 1);
$('.flex-box').css('flex-basis', 1);
```

IE10 だけ JavaScript から flex-grow, flex-shrink, flex-basis プロパティの取得・変更ができないようです。

```js:JavaScript
console.log(document.body.style);
```

上記のコードで有効なスタイルを列挙してみましたが確かに IE10 だけ flex-grow, flex-shrink, flex-basis がありませんでした。

## 対応策

```js:JavaScript
// 取得
var grow = $('.flex-box').css('flex').split(' ')[0];
var shrink = $('.flex-box').css('flex').split(' ')[1];
var basis = $('.flex-box').css('flex').split(' ')[2];

// 変更
$('.flex-box').css('flex', grow + ''); // grow を変更
$('.flex-box').css('flex', basis); // basis を変更
$('.flex-box').css('flex', grow + ' ' + basis + 'px'); // grow と basis を変更
$('.flex-box').css('flex', grow + ' ' + shrink); // grow と shrink を変更
$('.flex-box').css('flex', grow + ' ' + shrink + ' ' + basis + 'px'); // すべて変更
```

これなら IE10, IE11, Chrome, Firefox で正しく動きます。

CSS プロパティが正しく動くのに JavaScript から同じプロパティが動かないなんて思わなくてだまされた。
iPhoneアプリにCrittercism入れてみた。


クラッシュログを収集するサービス、[Crittercism](http://www.crittercism.com/)です。

[Quickstart](http://docs.crittercism.com/quickstart.html#quickstart)に従って入れてみました。

### Step1 サインアップ

最初の30日間は無料でフル機能使えるようです。
必要項目入力して登録。
クレジットカードの登録は不要。

### Step2 アプリ登録

ログインして「Register A NEW APP」からアプリを登録します。
今回はiOSアプリを登録。

### Step3 SDKインストール

Cocoapodsでインストールできます。

Podfileに下記追記して

```Podfile
pod 'CrittercismSDK'
```

インストール。

```
$ pod install
```

今回はCrittercismSDK (4.3.7)が入りました。

### Step4 初期設定

AppDelegate.mに下記追加。
APP IDは管理画面の「App Settings」ってとこにあります。

```AppDelegate.m
// 追加
#import "Crittercism.h"

・・・

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // 追加
  [Crittercism enableWithAppID: @"YOUR-APP-ID"];
  
  ...

}

```

導入は以上

### Step5 クラッシュログ送信

あとはわざとクラッシュさせてみれば管理画面で確認できます。

```objectivec
// わざとクラッシュ
[[NSArray array] objectAtIndex:0];
```

使い方はまた今度。
データ分析と統計処理の基本的な手順の整理 (3)

[昨日](http://qiita.com/ynakayama/items/7917f0f5eb556862642c)の話の最後で社会統計の 3 つのポイントを挙げましたが今日はその 1 つ目です。

## データの分布を把握する

データの分布に関しては[散布度で分布の散らばりを表す](http://qiita.com/ynakayama/items/4aea442c9c6644d4da71)という内容で書きました。

データには離散変数と連続変数がありますが、離散変数の散らばりを示すには主に **度数分布表 (frequency distribution)** を用いることが多いでしょう。

分布における位置とは、ある変数の特定の値が、当該変数の分布のどこに位置するかという意味です。これを表すにはパーセンタイルや分位数といったものを利用します。特に代表的な値が中央値と第一および第三四分位数です。

分位数とは、各カテゴリーが均等な比率になるように観測値を分割する値を指します。四分位とは観測値を 25% ずつに分割した値です。たとえばグループを十分割すれば十分位数、三分割すれば三分位数となります。

また、四分位数の 25 〜 75% の範囲を四分位範囲と呼びます。分布の形状にもよりますが、この範囲外を外れ値とみなすという単純な方法もあります。

## 標準得点 (z-score)

[正規化](http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E5%8C%96)は異なる基準の変数を互いに比較可能なように次元をそろえることです。

正規化の方法にはさまざまな方法がありますが、よく利用されるのが、確率分布関数で横軸を線形変換し平均を 0 、分散を 1 に変換する方法です。これを **標準得点 (standard score)** または **z 得点** と言います。

これは多変量解析の前処理としてもよく利用されます。

標準得点の使いところとしては、例えば毎日集計されるニュース情報の相対的な位置を求め、これを日々の他のデータと比較すると言ったふうに使います。

```py
# SciPy で標準得点を求める
from scipy import stats
zscore = stats.zscore(df[1]) # データフレームの特定の列から z-score を求める
df[9] = zscore # この例では 9 列目に求めた標準得点を格納
```

ある日においてバズワードが発生し特定の単語が大量にあふれたとしても、どのニュースも同じキーワードを掲げているならば、それはまとまった上位集団として扱えば良いわけです。

たとえば以下のニューストップ 10 を見ると「仲間由紀恵」や「iOS 8」でバズが発生していることが一目瞭然です。この場合、これらのキワードを含むニュースが上位に集中しやすいので、これらの標準得点もほどほどになるわけです。

```
1       【速報】仲間由紀恵結婚　お相手は俳優　田中哲司　 - ネットの海の渚にて
2       iOS 8をiPhone 4SやiPad 2に入れるとどれだけ遅くなるのか？ - GIGAZINE
3       速報：アップル iOS 8 提供開始。新機能・改善点リスト - Engadget Japanese
4       iOS 8 特集 ｜ 特集カテゴリー ｜ Developers.IO
5       iOS 8で手書き日本語入力が可能に--MetaMoji、「mazec for iOS」を提供開始 - CNET Japan
6       iOS 8 の新機能のサンプルコード集『iOS8-Sampler』を公開しました - Over&Out その後
7       【特別寄稿】慰安婦問題の現状と安倍新内閣におけるこれからの対応 - 元外交官･東郷和彦 (1/2)
8       仲間由紀恵が田中哲司との結婚を発表「今まで通り仕事に励む」
9       仲間由紀恵が田中哲司と結婚 交際6年13歳差婚と日刊スポーツが報じる
10      業界内では手が早い? 仲間由紀恵の結婚相手・田中哲司「お泊り」前科
```

みんなが試験で高得点を取ったら偏差値はそれほどでも無いのと一緒です。

## まとめ

今回は分布の把握についてざっくりと説明しました。これはそれほど難しくないのですが、分布の形状からモデルを推定するとなるとぐっと必要な知識が増えてきます。
CakePHPのshellとかcake bakeがエラーになる時

他の環境で作ったCakePHPをそのままコピーして使っている時なんかに発生する。

自分のappのConsole/cake.phpの以下を今の環境に合わせて書き換える。
これはWindowsでxamppで作ったCakePHPなのでそのパスになっている。
OSXでは動くはずがない。

```php
	ini_set('include_path', $root . PATH_SEPARATOR . 'C:' . $ds . 'xampp' . $ds . 'htdocs' . $ds . 'demo' . $ds . 'Vendor' . $ds . 'cakephp' . $ds . 'cakephp' . $ds . 'lib' . PATH_SEPARATOR . ini_get('include_path'));

```

キャッシュフォルダーのパーミッションを変える

```bash
sudo chmod 0777 /Users/hoge/demo/app/tmp/cache/persistent/
sudo chmod 0777 /Users/hoge/demo/app/tmp/cache/models/
sudo chmod 0777 /Users/hoge/demo/app/tmp/cache/
```

core.phpを編集。以下を追加。

```php
  	 Cache::config('default', array(
 		'engine' => 'File', //[required]
  		'mask' => 0666, //[optional]
 	));
```

だから、あー、Composerで落として、bake projectするところまでやってから、あと、git cloneすればいいんんだろう、おそらく。
最初にリポジトリを作るところからよく考えてやらないといけない。

http://book.cakephp.org/2.0/ja/installation/advanced-installation.html
gulp-watch で、監視対象のファイルが新しく増えた場合も検知させる


gulp に最初から内蔵されている `gulp.watch()` は、ファイルの変更については監視してくれるが、ファイルの新規追加や削除については監視してくれない？？ (少なくとも僕の環境では、新規ファイルを作っても反応してくれなかった)

ということで、gulp-watch プラグインを使う。

https://github.com/floatdrop/gulp-watch

#### gulpfile.coffee

```coffeescript
watch = require 'gulp-watch'

gulp.task 'watch', ->
  watch 'css/**/*.scss', ->
    gulp.start 'css'

gulp.task 'css', ->
  # css のコンパイルを行う
```

gulp-watch プラグインでは、監視対象となるファイルが新しく増えた場合などでも反応してくれた。

にしても、色々ググってたけど "gulp.watch()" と "gulp-watchプラグイン" が別物とはなかなか気づけず、ちょっとハマった…
Unityをインストール

※自分用の実行メモ・備忘録です。
[超詳しい記事が既にある](http://qiita.com/hiroyuki_hon/items/0718a50e6569b6c5037a)のでそっち見た方がいいです。

私はずっとWebでぺちぱーやってて、動きがあるものといえばせいぜい[MinecraftのMOD](http://forum.minecraftuser.jp/viewtopic.php?f=13&t=4917)作ってる程度なので専門外甚だしいのですが、今時のIT土方ならポリゴンくらい操れないとね、ということでUnityに手を出してみる。
せっかくGeForceGTX770買ったことだし。

まず[Unity](http://ja.wikipedia.org/wiki/Unity_(%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3))とはなにか、一回書けばWindows以外にもAndroidやiPhone、家庭用ゲーム機でも動かせるゲームを作れるゲームエンジンらしい。
昔Write onceなんとかいう言葉を聞いたことがあるような気がしますが気のせいでしょう。

まずは[Unity Web Player](http://japan.unity3d.com/webplayer/)のインストール。
これは作ったアプリをブラウザ上で動かせるというFlashみたいなプラグインです。
アプリを公開してる人もたくさんいるので、遊んでみるだけでも入れておくといいかも。

次に本体をダウンロード。
https://store.unity3d.com/
http://unity3d.com/unity/download
本格的に仕事でフル機能を使う場合は1500ドルですが、機能制限版はフリーです。
個人レベルならそっちでも十分でしょう。
バージョンは4.5.2f1でした。
インストールオプションは全てデフォルトのまま。
インストールサイズはなんと4.4ギガバイト。
初回起動時にアカウント作成が必要ですが、適当に進める。
プロジェクトが開始されたら開発スタート！
とても簡単にインストール終了。

よく考えたらC++もC#も素人だった。
golangを基礎から学ぶ　関数編


## 関数は複数の戻り値をもつことができる
golangの目新しい特徴のひとつとして数えられている。
関数は、括弧でリストすることで複数の値を持かえすことができる。返された値は、変数リストへ代入して格納する。
(int, int) が返す値を括弧でリストしている部分。
func 関数名 引数 戻り値 の順番になる。

```
func f(a int, b int) (int, int) {
    c := a + b
    d := a * b
    return c, d	    
}

func main() {
    a := 100
    b := 100
    c,d := f(a, b)
    fmt.Println(c)
    fmt.Println(d)
}
```

output

```
200
10000
```

戻り値を複数定義できる形式はエラーハンドリングにも一役かっている

```
func doSomething(input int) (result string, err error) {
    switch {
    case input < 0:
        return "", fmt.Errorf("%d is minus value", input)
    case input < 10:
        return "less than 10", nil
    default:
        return "greater than 10", nil
    }
}

func main() {
    if r, err := doSomething(-1); err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(r)
    }
}
```

output

```
-1 is minus value
```

## 匿名関数
golangは匿名関数をサポートしている


funcから始まる関数リテラルは匿名関数をあらわし、変数に代入することが可能。

```
func main() {
    fn := func() {
        fmt.Println("hello")
    }
    fn()
}
```

output

```
hello
```

匿名関数を関数の引数にとしてわたすことも可能

```
func sumOf(f func(int) int, n, m int) int {
    a := 0
    for ; n <=  m; n++ {
        a += f(n)
    }
    return a
}

func main() {
    square := func(x int) int { return x * x }
    fmt.Println(square(10))
    a := func(x int) int { return x * x }(10)
    fmt.Println(a)
    fmt.Println(sumOf(square, 1, 100))
    fmt.Println(sumOf(func(x int) int { return x * x }, 1, 100))
}
```

output

```
100
100
338350
338350
```

## クロージャ

関数リテラルはクロージャになっている。
そのため関数リテラル内から外側の関数内で定義した変数を参照可能になる。
これらの変数は外側の関数と、関数リテラル間で共有され、これらからアクセス可能な限り存続する。

```
func main() {
    x := 5
    fn := func() {
        fmt.Println("x is", x)
    }
    fn()
    x++
    fn()
}
```

output

```
x is 5
x is 6
```





```
func intSeq() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}

func main() {
    nextInt := intSeq()
    
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    fmt.Println(nextInt())
    newInts := intSeq()
    fmt.Println(newInts())
}
```

output

```
1
2
3
1
```

## 参考
[golang で複数のエラーをハンドリングする方法](http://mattn.kaoriya.net/software/lang/go/20140416212413.htm)

[お気楽 Go 言語プログラミング入門](http://www.geocities.jp/m_hiroi/golang/abcgo05.html)

[Function Types in Go (golang)](http://jordanorelli.com/post/42369331748/function-types-in-go-golang)
Spring BootでカスタムValidatorにInjectionしたい時の設定

以下のようにコンテナからInjectionされた値(Bean)を使ったカスタムValidatorがあったとする。

```java:MyConstraintValidator.java
/**
 * コンテナで"hoge"に登録された文字列と一致するか検証する。
 */
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {
    @Autowired
    private String hoge;
    @Override
    public void initialize(MyConstraint paramA) {
    }
    @Override
    public boolean isValid(String value, ConstraintValidatorContext paramConstraintValidatorContext) {
        Objects.requireNonNull(hoge);
        return Objects.equals(value, hoge);
    }
}
```

このValidatorにInjectionして使うには、Springのドキュメントで[ここらへん](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#validation-beanvalidation-spring)を見ると以下のような設定が必要になる。

```xml
<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
```
@Configurationなクラスで設定する場合はこうなる。

```java
@Bean
public javax.validation.Validator localValidatorFactoryBean() {
   return new LocalValidatorFactoryBean();
}
```

コントローラでバリデーションする場合なんかには上記だけでも良いが、Hibernateで使う場合には以下の設定でEntityManagerFactoryに**Validatorの参照**を渡す必要がある。
http://stackoverflow.com/questions/2712345/jsr-303-dependency-injection-and-hibernate

```xml
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
 <property name="jpaPropertyMap">
  <map>
   <entry key="javax.persistence.validation.factory" value-ref="validator" />               
  </map>
 </property>
</bean>
```

これをSpring Bootで設定する場合、SpringBootのドキュメントで[ここ](http://docs.spring.io/spring-boot/docs/1.1.6.RELEASE/reference/htmlsingle/#common-application-properties)を見るとapplication.propertiesで```spring.jpa.properties.*```にJPAプロパティを指定すればいいのだがなんか嫌な予感。。。

```properties:application.properties
spring.jpa.properties.javax.persistence.validation.factory=validator
```
これでは**"validator"という文字列**を設定しているだけなのでエラーになってしまう。試しにクラス名を指定してみてもダメ。

```console
Caused by: org.hibernate.cfg.beanvalidation.IntegrationException: Given object was not an instance of javax.validation.ValidatorFactory[java.lang.String]
```

Beanの参照を設定するにはプロパティファイルではだめぽなので@Configurationなクラスで設定するしかなさそう。

```java
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, DataSource dataSource, JpaProperties jpaProperties) {

        LocalContainerEntityManagerFactoryBean factory = builder
                .dataSource(dataSource)
                .packages(Application.class)
                .persistenceUnit("default")
                .properties(jpaProperties.getHibernateProperties(dataSource))
                .build();

        Map<String, Object> jpaPropertyMap = new HashMap<>();
        jpaPropertyMap.put("javax.persistence.validation.factory", validator());
        factory.setJpaPropertyMap(jpaPropertyMap);
        return factory;
    }
```
LocalContainerEntityManagerFactoryBeanの生成部分はJpaBaseConfiguration.entityManagerFactory()のソースを参考にした。

やりたい事は```jpaPropertyMap.put("javax.persistence.validation.factory", validator();```の1行だけなんだけど、もっといいやり方はないんだろうか？
Golang と Syslog


http://golang.org/pkg/log/syslog/


```go
func NewLogger(p Priority, logFlag int) (*log.Logger, error)
```

か

```go
func New(priority Priority, tag string) (w *Writer, err error)
```

を使う

#sample

```go
package main

import (
  "runtime"

  "log"
  "log/syslog"
)

func main() {

  logger, err := syslog.New(syslog.LOG_NOTICE|syslog.LOG_USER, "my-daemon")
  if err != nil {
    panic(err)
  }
  log.SetOutput(logger)

  log.Println("num gogoutine:", runtime.NumGoroutine())
}
```

marvericks で /var/log/system.log に出力されているのを確認。


#チラ裏

http://golang.org/pkg/log/#SetOutput

```go
func SetOutput(w io.Writer)
```

io.Writer 装備すればなんでもいいのか！ 納得。
iOSアプリのDL数を自動取得する方法

アプリのダウンロード数を楽に取得したいと思って、下記のように自動取得してslackに通知するようにしました。

## 事前準備
### AccessTokenの取得  
売上のトレンド→レポートから取得します

![スクリーンショット 2017-08-18 16.30.22.png](https://qiita-image-store.s3.amazonaws.com/0/10532/b95aec40-c829-4685-baf4-1802c0666889.png)

### vendor_idの取得
AccessTokenを発行後、上記画面にTeam名+vendor_idが表示されるはずです。されない場合は更新などしてください。  
ソースを準備した後に下記コマンドでも取得可能です。  

```
java -jar Reporter.jar p=Reporter.properties Sales.getVendors
```

## ソースの準備
* 下記のページにあるDownloadリンクからzipファイルをDLして解凍  
https://help.apple.com/itc/appsreporterguide/e3#/itc0f2481229
* Reporter.propertiesの中身を書き換える


### 下記取得用shellの例

```sh
IFS=$'\t'
# for mac
DATE=`date -v-2d +"%Y%m%d"`
# for centos
#DATE=`date --date '2 day ago' +%Y%m%d`
VENDOR_NO=
ORIGINAL_FILE="S_D_${VENDOR_NO}_${DATE}.txt"
NEW_FILE="S_D_${VENDOR_NO}_${DATE}.tsv"

# itunes storeからレポートファイル取得
java -jar Reporter.jar p=Reporter.properties Sales.getReport ${VENDOR_NO}, Sales, Summary, Daily, ${DATE}

# DLしたファイルをリネーム
gunzip ${ORIGINAL_FILE}.gz
mv ${ORIGINAL_FILE} ${NEW_FILE}

count=0
i=0

# TSVから各地域のDL数を合計
while read LINE; do
    # 1行目はタイトルなのでスキップ
    if [ "$i" -ne 0 ]
    then
        tsvList=(`echo "$LINE"`)
        let count=${count}+tsvList[7]
    fi
    let i=${i}+1
done < ${NEW_FILE}
rm ${NEW_FILE}

echo ${count}

# Slackに通知
payload='payload={"channel": "#channel-name", "username": "DL教えてbot", "text": "昨日のダウンロード者数は:'$count'", "icon_emoji": ":ghost:"}'
curlScript="curl -X POST --data '"$payload"' https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxx"
eval ${curlScript}
```

### アプリリースしたので、ぜひダウンロードお願いします！！
https://itunes.apple.com/jp/app/cafesnap/id910848942
ActiveRecordのwhereでBETWEENを実現する


ActiveRecordで、SQLでいうところの`BETWEEN`ってどう書くんだろうと調べてみたら、
なんとwhereでRangeオブジェクトを渡すといいみたい。

```
User.where(age: 20..29)
# => SELECT "users".* FROM "users"  WHERE "users"."age" BETWEEN 20 AND 29
#    が発行される
```

ちなみに20...30と書くとちょっと泥臭い感じになる。あたりまえだけど。

```
User.where(age: 20...30)
# => SELECT "users".* FROM "users"  WHERE "users"."age" >= 20 AND "users"."age" < 30
#    が発行される
```

もちろんTimeオブジェクトでも同じことができて、

```
User.where(created_at: 1.year.ago..Time.current)
# => SELECT "users".* FROM "users"  WHERE "users"."created_at" BETWEEN '2013-09-19 13:23:22.700389' AND '2014-09-19 13:23:22.700657'
#    が発行される
```

これは便利！
[デザイナー向け] iPhoneアプリに必要な画像・アイコン

#アプリに組み込むアイコン画像

例）iOS6以降に対応するアプリはiOS6, 7, 8全てのファイルを用意して下さい。
　　iOS7以降に対応するアプリはiOS7, 8全てのファイルを用意して下さい。


|系列|サイズ(px)|iOS6|iOS7|iOS8|ファイル名の例|利用箇所|
|:--|:--|:--:|:--:|:--:|:--|:--|
|57系|57x57, 114x114|◯|☓|☓|`icon-57.png`, `icon-57@2x.png`|iPhoneメインアイコン|
|60系|120x120|☓|◯|☓|`icon-60@2x.png`|iPhoneメインアイコン|
|60系|180x180|☓|☓|◯|`icon-60@3x.png`|iPhoneメインアイコン|
|72系|72x72, 144x144|◯|☓|☓|`icon-72.png`, `icon-72@2x.png`|iPadメインアイコン|
|76系|76x76, 152x152|☓|◯|◯|`icon-76.png`, `icon-76@2x.png`|iPadメインアイコン|
|29系|29x29|◯|◯|◯|`icon-29.png`|iPhone Spotlight(iOS6), iPhone設定(iOS6), iPad設定(iOS7,8)|
|29系|58x58|◯|◯|◯|`icon-29@2x.png`|iPhone設定(iOS6, 7), iPad設定(iOS6, 7, 8)|
|29系|87x87|☓|☓|◯|`icon-29@3x.png`|iPhone設定|
|40系|40x40|☓|◯|◯|`icon-40.png`|iPad Spotlight(iOS7, 8)|
|40系|80x80|☓|◯|◯|`icon-40@2x.png`|iPhone Spotlight(iOS7), iPad Spotlight(iOS7, 8)|
|40系|120x120|☓|☓|◯|`icon-40@3x.png`|iPhone Spotlight(iOS8)|
|50系|50x50, 100x100|◯|☓|☓|`icon-50.png`, `icon-50@2x.png`|iPad Spotlight,iPad設定|

◯：必要　☓：不要
ファイル名は例ですのでご自由に変更して下さい。
画像は角丸にする必要はありません。

# 申請時に登録するアイコン画像

|系列|サイズ(px)|ファイル名の例|
|:--|:--|:--|
|512系|1024x1024|`iTunesArtwork@2x.png`|

# アプリに組み込むスプラッシュ画像(縦)

|端末|サイズ(幅px x 高px)|ファイル名の例|備考|
|:--|:--|:--|:--|:--|
|〜iPhone3GS|320x480|`Default.png`|〜iOS6|
|iPhone4/4s|640x960|`Default@2x.png`|iOS4〜|
|iPhone5/5s|640x1136|`Default-568h@2x.png`|iOS6〜|
|iPhone6|750x1334|`Default-667h@2x.png`|iOS8〜|
|iPhone6Plus|1242x2208|`Default-736h@3x.png`|iOS8〜|

# 申請時に登録するアプリ説明画像

72dpi, RGB, 透過無し、JPEGかPNG形式。

|端末画面サイズ|画像サイズ（幅×高さ）|最大枚数|必要？|
|:--|:--|:--|:--|
|3.5インチ|640x920, 640x960, 960x600, 960x640|5枚|最低１枚必要|
|4インチ|640x1096, 640x1136, 1136x600, 1136x640|5枚|最低１枚必要|
|4.7インチ|750x1334, 1334x750|5枚|iPhone6の画面サイズに対応したアプリでは最低１枚必要|
|5.5インチ|1242x2208, 2208x1242|5枚|iPhone6 Plusの画面サイズに対応したアプリでは最低１枚必要|

# 申請時に登録するアプリ動画

|端末画面サイズ|動画サイズ（幅×高さ）|最大数|必要？|
|:--|:--|:--|:--|
|4インチ|1920x1080, 1136x640, 1080x1920, 640x1136|1|任意|
|4.7インチ|1334x750, 750x1334|1|任意|
|5.5インチ|1920x1080, 1080x1920|1|任意|

動画フォーマットの詳細
https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Appendices/Properties.html#//apple_ref/doc/uid/TP40011225-CH26-SW14

# アイコン リサイズツール
Web
[MakeAppicon](http://makeappicon.com/)
[App Icon Resizer](https://resizeappicon.com/)

アプリ(Mac)
[Icon Set Creator](https://itunes.apple.com/jp/app/icon-set-creator/id939343785?mt=12)
[IconKit](https://itunes.apple.com/us/app/iconkit-icon-resizer-for-app/id507135296?mt=12)

# アイコン テンプレート
[Photoshop](http://appicontemplate.com/)
[Illustrator](http://dev.classmethod.jp/references/ios7-icon-template-ai/)

# 参考資料

iTunes Connect App Properties
https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Appendices/Properties.html

iOS Human Inteface Guidelines - Icon and Image Size
https://developer.apple.com/library/IOs/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix.html
node.js + expressでjsonが文字化け


### レスポンスのjsonが文字化けした時の対応

今回は面倒な変換とかいらなかった

#### res.charsetに設定

```
res.charset = 'utf-8'
res.json(results);

```

結果はorz

```
{"title":"J笘�笘�笘�"}
```

#### ヘッダーに設定する

```
res.header("Content-Type", "application/json; charset=utf-8");
res.json(results);
```


# いけたよ！

```
{"title":"J★A★C★K"}
```
JavaScript でタイムゾーン名を取得する方法

JavaScript で `Asia/Tokyo` や `America/Los_Angeles` のような IANA Time Zone Database で定義されたタイムゾーン名を取得する方法ですが、

## 結論

結論から言うと、**正確に取得する方法はありません。**

JavaScript の Date には、タイムゾーン名を取得する API がないからです。

```js
var date = new Date();
date.toString();           // => "Fri Sep 19 2014 04:49:59 GMT-0700 (Pacific Daylight Time)"
date.getTimezoneOffset();  // => 420
```

- Date を文字列化すると夏時間も考慮したタイムゾーンの名前が出力されて惜しい感じですが、仕様が決まっているわけではないのでブラウザ毎に違っていて使えません
- Date.getTimezoneOffset() は、UTC からのオフセットを分単位（でも正負は逆）で返しますが、タイムゾーン名を引けるわけではないのでやはり使えません。一口に UTC-0700 といっても、夏時間のある・なしを加味してその地域を特定するのは厄介な問題です

## 代替案

とはいえ、世の中には同じ問題を抱えている人がいるもので、ブラウザ実行環境のタイムゾーンを予測するライブラリは存在します。

- [jsTimezoneDetect](https://bitbucket.org/pellepim/jstimezonedetect)

```js
var name = jstz.determine().name();
name;

// (UTC+09:00) 大阪、札幌、東京
//     => "Asia/Tokyo"
// (UTC-08:00) 太平洋標準時 (米国およびカナダ)
//     => "America/Los_Angeles"
// (UTC-07:00) 山地標準時 (米国およびカナダ)
//     => "America/Denver"
// (UTC-07:00) アリゾナ
//     => "America/Phoenix"
```

あらかじめライブラリ内に定義した地域ごとの夏時間の有無やオフセットの情報と、Date.getTimezoneOffset() などを組み合わせて、最もそれらしい地域を算出しているようです。

アリゾナは夏時間を採用していない珍しい州なのですが、UTC からのオフセットが同じ7時間の山地標準時ときちんと区別できていることが分かります。すごいです。

## 注意事項

- jsTimezoneDetect は、本家にも書いてあるとおり、タイムゾーンが完全に同じ地域の都市（ex. ベルリンとストックホルム）を区別できるわけではないので、そのような用途には向きません。 **「ユーザーにタイムゾーン名を指定させたくないけど、サーバー側でユーザーの（ローカル時間に従った日時計算をするために）タイムゾーン名を知りたい」** という用途で効果を発揮すると思います
- 私もまだがっつり使ったわけではないので、確実にオススメできる情報というわけではありません。試してみた範囲ではわりと正確に予測できていると思いますが、自己責任でご利用ください（メンテナンスも止まってしまっている模様）
UnityでOculusに使えるGUI 「VRGUI」のご紹介

OculusでOnGUIを使うとビルドした時にうまくいかなかったので
調べたらVRGUIというのが見つかったので試したらうまくいきました。
使い方は、簡単です。

ログインして「Unity GUI Package + Example」からVRGUI.zipをダウンロードしてください。
https://developer.oculusvr.com/forums/viewtopic.php?f=37&t=4944

MonoBehaviourを継承しているのでOnGUIと書き方は変わらない感じでした。

```csharp:VRGuiSample
public class VRGuiSample : VRGUI
{
   public override void OnVRGUI()
   {
      GUILayout.BeginArea(new Rect(0f, 0f, Screen.width, Screen.height));
      if (GUILayout.Button("Click Me!"));
      GUILayout.EndArea();
   }
}
```
"YYYYMMDDHHMMSS"を各単位に分解する簡単な方法

# "20140919190454"→"2014年9月19日 19時4分54秒"が面倒くさい!

このような文字列変換をしたい場合、あなたならどうやるだろうか?

```sh:substrがたくさん出てきて面倒くさい!
echo 20140919190454 |
awk '
  Y = substr($0, 1,4);
  M = substr($0, 5,2);
  D = substr($0, 7,2);
  h = substr($0, 9,2);
  m = substr($0,11,2);
  s = substr($0,13,2);
  printf("%d年%d月%d日 %d時%d分%d秒\n",Y,M,D,h,m,s);
'
```

と書けばできることはできるが、substr()何個も書くのは面倒くさいし、長ったらしい。なんとかならないか。

# substr()を2個のsedに代えればいい

ちょっと頭を捻ってみよう。正規表現で2ケタずつの数字に分解した後、最初の4個は戻してやればいい。sedを2回カマせて、こんなふうに。

```sh:sedを2個使って分解する
$ echo 20140919190454          |
> sed 's/[0-9][0-9]/ &/g'      | # ちなみに入力データが最初から最後まで数字とわかっているなら
> sed 's/ \([0-9][0-9]\) /\1/'   # "[0-9]"を"."と書き換えてもっと簡単にしてもいい
2014 09 19 19 04 54
$ 
```

あとは、AWKコマンドに食わせる。AWKに食わせた時点で各単位の数字が`$1`～`$6`へ自動的に分かれて格納されているので、好きなフォーマットでprintfしておしまい。

まとめるとこうなる。

```sh:sedで各単位に分解、AWKで自由な書式に
$ echo 20140919190454                                            |
> sed 's/[0-9][0-9]/ &/g'                                        | 
> sed 's/ \([0-9][0-9]\) /\1/'                                   |
> awk '{printf("%d年%d月%d日 %d時%d分%d秒\n",$1,$2,$3,$4,$5,$6);}'
2014年9月19日 19時4分54秒
$ 
```

## AWK一発でもできる。

マルチプロセッサー（コア）環境で有利に働くので、上記のようにsed-sed-AWKと、3つのコマンドプロセスに分担させることを勧めるが、それがイヤならAWK一発でも一応できる。gsub()とsub()とsplit()を駆使し、もう少し頭を捻る。

```sh:sedで各単位に分解、AWKで自由な書式に
$ echo 20140919190454           |
> awk '
>   # ↓2ケタ分解の際、今度は後ろにスペースを付ける
>   gsub(/[0-9][0-9]/, "& ");
>   sub(/ /, "");
>   split($0, t);
>   printf("%d年%d月%d日 %d時%d分%d秒\n",t[1],t[2],t[3],t[4],t[5],t[6]);
> }'
2014年9月19日 19時4分54秒
$ 
```

ちょっとはスマートになったでしょ?
ChefのCookbookからとりあえずAttributeを読み込む

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

[Chefのソース](https://github.com/opscode/chef)に結合テスト用のサンプルCookbookがあります。


```
$ tree kitchen-tests/cookbooks/webapp/
kitchen-tests/cookbooks/webapp/
├── Berksfile
├── README.md
├── attributes
│   └── default.rb
├── metadata.rb
├── recipes
│   └── default.rb
└── templates
    └── default
        ├── index.html.erb
        └── index.php.erb

4 directories, 7 files
```

`attributes/default.rb`ってのがありますね。

```kitchen-tests/cookbooks/webapp/attributes/default.rb 
default['apache']['remote_host_ip'] = '127.0.0.1'

default['mysql']['version'] = "5.5"

default['webapp']['database'] = 'webapp'
default['webapp']['db_username'] = 'webapp'
default['webapp']['path'] = '/var/www/'
```

外部プログラムから使うこともあるかもしれないので、`attributes/default.rb`を読んでみます。


## Pryで

```
## とりあえずChefを読みます
[1] pry(main)> require 'chef'
=> true

## Nodeオブジェクトをつくります
[2] pry(main)> node = Chef::Node.new
=> #<Chef::Node:0x007f88e30ab7c0
 @attributes={},
 @chef_environment="_default",
 @name=nil,
 @override_runlist=#<Chef::RunList:0x007f88e30ab6f8 @run_list_items=[]>,
 @primary_runlist=#<Chef::RunList:0x007f88e30ab770 @run_list_items=[]>,
 @run_state={}>


## #from_fileでattributeファイルを読みます
[3] pry(main)> node.from_file('kitchen-tests/cookbooks/webapp/attributes/default.rb')
=> "/var/www/"


## default.rbの分がnodeに格納されました。
[4] pry(main)> node[:mysql]
=> {"version"=>"5.5"}

[5] pry(main)> node[:webapp][:db_username]
=> "webapp"
```



ファイルだけ読んでも仕方ないという場合は、ChefClient終了時の状態を丸ごとレポートハンドラでjsonダンプしとけば使いまわせるんじゃないかな。
xcodeで Apple LLVM error が出た時の対処


xcodeをアップデートしたりすると

```
Apple LLVM error
```

```
fatal error: file '/Applications/ ~~~~~~~~~ .pch' was built
```

みたいなエラーで、cocoapodsでインストールしたやつらでコケてはまって対処忘れるのでメモ

## 対処法
```
rm ~/Library/Developer/Xcode/DerivedData/ModuleCache/*
```

以上
GenymotionとAppium Inspectorを接続する

# 概要
AppiumからGenymotionのAVDは起動できないが、あらかじめAVDを起動しておけば認識してくれる

# Appiumの設定
## Android Setting
Android Settingを下記のように設定する
### ApplicaitonSetting
|App Path|Package|Wait for Package|Launch Activity| Activity|
|:-:|:-:|:-:|:-:|:-:|
|.apkのパス|AndroidManifest.xmlのpackage|左記と同じ(※1)|AndroidManifest.xmlの起動時のActivity|左記と同じ(※1)|

## Launch Device
起動できないので、設定しない

## Capabilities
* GenymotionのAVDの情報を入力する。
* DeviceNameは適当でかまわないが必須です。

## Advanced
* Android SDK PathにAndroid SDKのパスを設定する(※2)

# Genymotionの設定
設定でADBを※2のパスに設定する

# 実行方法
1. GenymotionでAVDを起動する
2. Appiumを起動する
3. Launchボタンを押す
3. Inspectorボタンを押す

# 注釈
※1 内容は不明ですが、とりあえず動きました。
※2 Android SDKのtoolsとplatform-toolsにPATHを通してもAppium側でadbを認識しないので設定した。
g++ -std=c++11　でc++11のコンパイルができないとき

g++のバージョンが古い場合があります。
g++のバージョンを確認してみて、4.6などのバージョンの時は古いので
以下の方法でGCC4.8系列に変えてあげましょう。
http://venuschjp.blogspot.jp/2013/11/c11gcc.html
SSHの接続が遅いとき


CsntOS6.5をインストールした時に、SSHの接続がパスワード入力からログインまで、時間がかかったので対処法を確認。

下記の対応で接続が早くなった。

```/etc/ssh/sshd_config
UseDNS=no
```

```
service sshd restart
```

sshd_configに上記を追加して、SSHを再起動したら解消されました。

遅い原因はいろいろあるらしい。

ちなみに、

```
ssh -v hoge@xxx.xxx.xxx.xxx
```

で、デバッグメッセージの表示が出来るらしい。
知らんかった・・・。

***
参考サイト
[sshの接続確立が遅い場合の対処方法](http://d.hatena.ne.jp/yuyarin/20090410/1239298235)
Pandocでmarkdown→PDFスライドへの変換


スライド等を作成するときに次のような場面で困る時がある。

- Power PointとKeynoteでレイアウトが異なる
- バージョン管理できない
- PDF出力するのがめんどい

という訳で代替方法を探していました。

調べてみると結構色々な方法がありましたが、
Mac OS Xユーザとしてはbrewで管理したいということもあり、
**`Pandoc+beamer`**を採用することにしました。

メリットとしては下記が挙げられると思います。

- バージョン管理ができる
- markdownなので人間にも見やすい
- コマンドラインを使用できるので自動化ができる

# 前提条件
- Homebrewがインストールされていること

# 準備
## Luaのインストール
```console:
$ brew install lua
```

## Homebrew経由でPandocのインストール
```console:
$ brew install pandoc
```

## MacTexのインストール
```console:
$ brew cask install mactex
```

ここではインストールに失敗したのでDLしたインストーラを直接実行した
インストーラのパスは`/Library/Caches/Homebrew`でした。


## 記述方法
通常のmarkdownとは異なり、スライドでページごとに記述するため、

オリジナルのmarkdownとか違う下記のような記述をする

```
% Title
% Author
% Date

# Page2 Title

## Page2 Title
- hogehoge
- fugafuga
```


## markdown→PDFスライドへの変換

```console:
$ pandoc -t beamer ./sample.md -o ./sample.pdf
```

これでおk。

ページごとのヘッダとフッタを追加できれば言うことなしなんですがねー...
GROUP BY を使用せずに HAVING を使う

例えば下記のように複雑な条件に基づいてレコードを抽出する場合、WHERE を使うと残念なことになります。

```sql
SELECT
    T.id,
    (
        CASE
            WHEN /*難解極まりない条件1*/ false THEN 1
            WHEN /*難解極まりない条件2*/ false THEN 2
            WHEN /*難解極まりない条件3*/ false THEN 3
            ELSE 0
        END
    ) AS stat
FROM
    tbl T
WHERE
    (
        CASE
            WHEN /*難解極まりない条件1*/ false THEN 1
            WHEN /*難解極まりない条件2*/ false THEN 2
            WHEN /*難解極まりない条件3*/ false THEN 3
            ELSE 0
        END
    ) = 2
```

とても保守性が低いと思います。
WHERE を無くして `stat` を使用してアプリケーションレイヤーで絞り込むことも出来ますが、そうするとページング処理等がやりたい場合、とても非効率なことになります(データベースレイヤーでの LIMIT が使用できないため)。

こんなとき、HAVING 句を使うとエイリアス名が使えるため、シンプルに記述することが出来ます。

```sql
SELECT
    T.id,
    (
        CASE
            WHEN /*難解極まりない条件1*/ false THEN 1
            WHEN /*難解極まりない条件2*/ false THEN 2
            WHEN /*難解極まりない条件3*/ false THEN 3
            ELSE 0
        END
    ) AS stat
FROM
    tbl T
HAVING
    stat = 2
```

どうも GROUP BY がなくても HAVING 句が使える模様。

※ もともと件数が少ない or インデックスが使われないであろう状況を想定
※ mysql 5.5.36 で実験。他のバージョン、RDBMS は分からない
RailsでRestfulのAPIでのHTTPステータスコードど応答内容について


RailsでRestfulのAPIを実装していて、createのときに成功した際にstatusを:createdにしていたので、updateを実装したときにstatusを:updatedとかにしてしまい、テストが通らなくて小一時間ほど悩んでしまいました。

簡単にHTTPステータスコードと応答内容をどうしといたほうがいいのかメモを残しておきます。

## 基本的なリソースに対する操作

Railsのコントローラで下記のメソッドのときのステータスコードと応答の内容は実際のAPIの受け側でどうしたいかにもよってくるかと思いますが、だいたい下記のようになるのではないでしょうか。

* create
* update
* destroy

### create

statusはcreated(201)を返して、新しく作成したオブジェクトを返します。

```ruby
render status: :created
```

実際の作成された中身はビューにjbuilderとかで記述します。
APIの受け側でidが新しく発行されるので、その情報を返してあげます。

### update

updateのときはHTTP的にはPUTなので、下記参照すると200か204を返す必要があります。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

たいがいAPIの受け側で特に中身は必要ないと思うので下記のように記述します。

```ruby
head :no_content
```


### destroy

destroyのときはHTTP的にはDELETEなので、updateと同様に200か204を返す必要があります。また、DELETEの場合は、処理だけ受け付けて実際の消去をしない場合は202を返すみたいです。

Railsで記述するのは、updateと同様に下記のようにします。

```ruby
head :no_content
```


## RailsのHTTPステータスコードシンボル

RailsのHTTPステータスコードシンボルに関しては下記がいい感じでまとまっています。

http://futureshock-ed.com/2011/03/04/http-status-code-symbols-for-rails/

以上です。
Androidのビルド環境構築でSDKのパッケージインストールを自動化するメモ


Android SDKでCUIからのパッケージ(?)インストールがちょっとわかりにくかったのでメモ。

## SDKのインストール

下記から拾ってきて適当にインストール。

http://developer.android.com/sdk/index.html

## パッケージ名の取得

最初にインストールしたいパッケージの名前を取得する。
予め分かってたらやんなくていい。

android toolsにパスが通った状態で以下のコマンドを実行。

```
android list sdk -u -a -e
```

androidコマンドで`-u`または`--no-ui`を付けるとCUIで実行できる。

`-a`または`--all`を付けるとインストール可能なパッケージが全部表示される。

`-e`または`--extended`を付けるとSDKの詳細が表示される。

表示されたパッケージの一覧から、後述の`android update sdk`コマンドの`-t`オプションで指定するためのパッケージid又はパッケージ名を取得する。

```
----------
id: 1 or "tools"
     Type: Tool
     Desc: Android SDK Tools, revision 23.0.2
----------
id: 2 or "platform-tools"
     Type: PlatformTool
     Desc: Android SDK Platform-tools, revision 20
----------
id: 3 or "build-tools-20.0.0"
     Type: BuildTool
     Desc: Android SDK Build-tools, revision 20
----------
id: 4 or "build-tools-19.1.0"
     Type: BuildTool
     Desc: Android SDK Build-tools, revision 19.1
----------
```

例えばandroid toolsをインストールしたいときは`-t`オプションに`1`または`tools`を指定する。

(確認してないけど並び順見る限りid変動しそうなのでパッケージ名で指定した方がよさげ)


## パッケージのインストール

```
echo y | android update sdk -u -a -t ${target}
```

`android update sdk`を使うと`-t`オプションで指定したターゲットがインストールできる。
対話型になっていて途中で確認を求められるので、自動化したいときは`echo y`をパイプで渡してあげるといいっぽい。

複数指定したいときはカンマで区切る。

```
echo y | android update sdk -u -a -t tools,platform-tools
```

何も指定せず`android update sdk`だけやるとインストール時間とファイルサイズが非常に大きくなるので注意。

ビルドするだけならTypeがSystemImageとかSourceになってるものは入れなくて良い。

## 確認環境

* CentOS6.5
* android-sdk_r23.0.2

## おまけ

ansibleでandroid環境作った時の断片的な何か

https://gist.github.com/mikesorae/2f979daf6f00219159d5
fetchmany で fetch する

時々使うので自分のメモ的に。

定義

```py
def fetchmany(cursor, size=1000):
    """
    1000件づつ fetch する
    """
    while True:
        rows = cursor.fetchmany(size)
        if not rows:
            break
        for row in rows:
            yield row
```

利用

```py
# cursor を取得
import MySQLdb
conn = MySQLdb.connect()
conn.cursorclass = MySQLdb.cursors.DictCursor  # select した結果を dict で取りたい時等
cursor = conn.cursor()

# 検索
cursor.execute('SELECT foo FROM bar WHERE baz = %s', ('piyo', ))
for row in fetchmany(cursor):
    print(row['foo'])
```

参考

- [元ネタ: Use generators for fetching large db record sets (Python recipe) ](http://code.activestate.com/recipes/137270-use-generators-for-fetching-large-db-record-sets/)
- [PEP 249](http://legacy.python.org/dev/peps/pep-0249/)

僕が所属している[会社](http://www.beproud.jp/)が[社員募集中](http://jobs.beproud.jp/)みたいです。なんか、 Python 書いてみてーなと思った人は応募してみてくださいな。 (すてま)
GEBEN on EmacsでPHPのリモートデバッグ

**「EmacsでもPHPをリモートデバッグしたい！ステップ実行したい！Vimに負けたくない！」**

という、誰かの心の声が聞こえたので、久しぶりにGEBENの設定をしてみました。

[GEBEN on Emacs](https://code.google.com/p/geben-on-emacs/)

![スクリーンショット 2014-09-19 17.56.37.png](https://qiita-image-store.s3.amazonaws.com/0/808/08914f06-0022-1f45-13e8-464fb8b320e0.png)

ちなみに前回は挫折しています。

## 前提

- CentOS上のLAMP環境 ( `http://example.com/` )
- 同じCentOS上にEmacsをインストールして開発

## インストール

### Xdebug

今回は `yum` でインストールします

    $ sudo yum install -y php-pecl-xdebug --enablerepo=epel

インストール後に `/etc/php.d/xdebug.ini` を設定します

    zend_extension=/usr/lib64/php/modules/xdebug.so
    xdebug.remote_enable = true
    xdebug.remote_handler = dbgp
    xdebug.remote_host = 127.0.0.1 ; リモートのEmacsからデバックしたいならIPアドレスを適切に変更しましょう
    xdebug.remote_port = 9000

httpdをリスタートしてXdebugは設定完了です。

### GEBEN

GEBENは(いつの間にか)MELPAに対応していますのでコマンドで簡単にインストールできます。

    M-x package-install geben

## 使い方

    M-x geben

で、Emacsが9000番ポートでXdebugからの通信を待ち受けます。

そして、おもむろにブラウザから `?XDEBUG_SESSION_START=1` をつけてアクセス

    http://example.com/?XDEBUG_SESSION_START=1

するとステップ実行が開始されます。簡単！

詳しいキー操作は[README](https://code.google.com/p/geben-on-emacs/source/browse/trunk/README)を見てもらうとして

よく使うキー操作を紹介します

- `SPC` ...ステップイン/ステップオーバ
- `i` ...ステップイン
- `o` ...ステップオーバ
- `g` ...実行
- `c` ...カーソル位置まで実行
- `b` ...ブレークポイントを設定
- `u` ...ブレークポイントを解除
- `U` ...ブレークポイントを全て解除
- `v` ...変数内部を別画面で表示 ( `q` で戻れます)

Emacsの待ち受けを終了するときは `M-x geben-end` です。

### CakePHPで該当コントローラの処理までステップ実行するのがつらい！

最近のフレームワークはルータやディスパッチャが頑張りますから、「該当ファイルまで `SPC` 連打」とか死ねます。

そういうときは `M-x geben-open-file` で対象ファイルを開き、 `c` でカーソル位置まで実行させましょう。( `M-x find-file` ではないのがポイントです )

## というわけで

よいEmacs開発ライフを！
ctrlp.vim の設定例

# ctrlp.vim の設定例

### オプション設定
```vim
" デフォルトのマッピングを無効化(default:'<C-p>')
let g:ctrlp_map = '<Nop>'

" 対象ファイル最大数(default:10000)
let g:ctrlp_max_files  = 100000

" 検索対象の最大階層数(default:40)
let g:ctrlp_max_depth = 10

" vim終了時にキャッシュクリアしない(default:1)
let g:ctrlp_clear_cache_on_exit = 0

" 検索ウィンドウの設定
" :help g:ctrlp_match_window
let g:ctrlp_match_window = 'bottom,order:btt,min:1,max:10,results:50'

```


### キーマッピング
```vim

" カレントディレクトリを基準に検索
nnoremap <silent> <Space>cf :CtrlPCurWD<CR>

" カレントバッファのルートディレクトリを基準に検索(root:自動認識)
nnoremap <silent> <Space>cF :CtrlPRoot<CR>

" 最近使ったファイルから検索
nnoremap <silent> <Space>cr :CtrlPMRUFiles<CR>

```

### 検索窓表示中に使えるキー

|キー|動作|
|:-:|:-:|
|&lt;F5&gt;|キャッシュファイルを再構築|
|&lt;C-r&gt;|正規表現モードに切り替え(fuzzyモードとトグルする)|
|&lt;C-p&gt;|検索キーワードをさかのぼれる|
|&lt;C-n&gt;|上記の逆|
【Rails】曜日フォーマット


以下から落としたja.ymlを使っている場合、
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml
こんな感じにLocaleが設定されていると思います。

```yml:config/locales/ja.yml
ja:
  date:
    formats:
      default: ! '%Y/%m/%d'
      long: ! '%Y年%m月%d日(%a)'
      short: ! '%m/%d'
```

これをビューで表示させる場合、
以下のように書きます。

```ruby:view
<%= l(hoge.created_at, format: :long) %>
# => 2014年09月19日(金)
```
iOS8のSafariでフォトライブラリの画像データにアクセスできた！

# 追記（2014/9/26）

- [iOS 8.0.2でフツーにSafariからフォトライブラリにアクセスできるようになった - Qiita](http://qiita.com/kjunichi/items/58b4681b387c4d9a4638)

追記ここまで

# 背景

iOS8でMobile SafariがWebGLに対応したので、さっそく、iPhoneのフォトライブラリ
の写真をテクスチャーに貼り付けてみようとしたら出来なかった。

どうやら、iOS8のSafariでは、普通にはフォトライブラリの画像データにアクセス
出来なくなってしまった模様。

# 解決方法

対象のページのHeadタグ内に以下を記述する。

```
<meta name="apple-mobile-web-app-capable" content="yes">
```

Mobile Safariで対象のURLを開き、ホーム画面に追加

ホーム画面に保存したアイコンをタップして、対象のページが表示され、
ここで、ファイル選択のボタンをクリックすると、ダイアログが表示され、
これに「許可する」と答えると、フォトライブラリの画像ファイルのデータを取得できるようになる。

# サンプル作った

- [iOS8でトーラスにカメラロールの写真を貼り付ける - jsdo.it](http://jsdo.it/kjunichi/s4tI)

# Link

- [iOS 8 and iPhone 6 for web developers and designers: next evolution for Safari and native webapps | Breaking the Mobile Web](http://www.mobilexweb.com/blog/safari-ios8-iphone6-web-developers-designers)

ここのBugs and problemsに載っていた。

- [iOS8.0で、カメラ画像をFileReaderで読み込もうとするとエラー？ | hifive開発者ブログ](http://blog.htmlhifive.com/2014/09/18/ios8-cannot-load-image-by-filereader/)

自分以外でもこの問題を取り上げていた方

- [アイコンとURL指定してフルスクリーン化するやつ #iOS - jsdo.it](http://jsdo.it/kjunichi/x9pa)

このツールで、任意のページをWebClip化できる。

# 関連記事

- [#iOS6 フルスクリーンにするとGPSが使えない！](http://abrakatabura.hatenablog.com/entry/2012/09/28/085500)
- [非アプリでiPhoneのカメラロールの写真を扱う](http://abrakatabura.hatenablog.com/entry/2013/01/16/065630)
- [iOS11でWebRTCがiPhoneのSafariで使えるのか試した](http://abrakatabura.hatenablog.com/entry/2017/09/23/092127)
ansibleで 'FAILED: Host key for server does not match!'



ansible.cnf で host_key_checking = False にする


#### hostsでssh先に複数同じホストがある場合
```
# cat hosts 
[local]                    
127.0.0.1

[webservers]
docker  ansible_ssh_port=22 ansible_ssh_host=192.168.1.5
ssh1    ansible_ssh_port=2222 ansible_ssh_host=192.168.1.5
ssh2    ansible_ssh_port=2223 ansible_ssh_host=192.168.1.5
```


```
# ansible-playbook -i hosts site.yml --check
PLAY [all nodes] **************************************************************

GATHERING FACTS *************************************************************** 
fatal: [ssh1] => {'msg': 'FAILED: Host key for server 192.168.1.5 does not match!', 'failed': True}
fatal: [ssh2] => {'msg': 'FAILED: Host key for server 192.168.1.5 does not match!', 'failed': True}
ok: [docker]
```

#### ansible.cfg 変更

```
#diff -u /etc/ansible/ansible.cfg_ /etc/ansible/ansible.cfg
--- /etc/ansible/ansible.cfg_   2014-08-07 08:36:30.000000000 +0900
+++ /etc/ansible/ansible.cfg    2014-09-19 17:34:11.678637384 +0900
@@ -36,7 +36,7 @@
 #roles_path    = /etc/ansible/roles
 
 # uncomment this to disable SSH key host checking
-#host_key_checking = False
+host_key_checking = False
 
 # change this for alternative sudo implementations
 sudo_exe = sudo
/etc/ansible/zabbix #
```

#### OK

```
# ansible-playbook -i hosts site.yml --check

PLAY [all nodes] **************************************************************

GATHERING FACTS ***************************************************************
ok: [ssh1]
ok: [docker]
ok: [ssh2]
```