OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリ月額課金機能審査通過への道！！


[CafeSnap](https://itunes.apple.com/jp/app/cafesnap/id910848942)というアプリで自動更新購読（Auto-renewable subscriptions）を実装したので、審査の過程でリジェクトをされた原因や、その対処法などを書いていきます。サンプルの実装は[こちら](http://qiita.com/musclemikiya/items/9b9dd15f8015653de316)を参照して下さい。

## 今回有料で使える機能
* 月刊のプレミアムコラムが購読できる
* カフェのメニュー、コーヒーの抽出方法などマニアックな検索ができる
![150528_011.png](https://qiita-image-store.s3.amazonaws.com/0/10532/c6a52ac4-9dd3-2188-7187-3722eceae26b.png "150528_011.png")

## 月額課金で気をつけること
### お気に入り/検索など、通常の機能制限だけで月額課金をさせない
あくまでも月額課金は、定期的に更新されるコンテンツに対する課金なので、通常の機能の制限のみだとリジェクト対象になります。
### リストアボタンを付ける
以前購読していたユーザーは、そのコンテンツを復元出来る状態にしておかないといけないようです。 
必要な機能かはわかりませんが、とりあえず審査向けということで設置します。


## 複数回のリジェクト
### 1回目
#### 理由
有料課金の前にログインを必須にしていたのですが、Appleからコラムや検索を行うのにログインをさせる必要はないでしょ！という指摘を受けました。 
課金状態をサーバーサイドで保持したいからログインさせたいという旨を伝えましたが、NG。
#### 対処
ログイン必須を外し、ログインしている場合のみサーバーサイドで課金状態を保持するようにしました。

### 2回目
#### 理由
リジェクトと言うよりは、下記2つの質問を受けて審査がストップしました。
#### 対処
下記の通り質問に答えたところ、2,3日後に審査が再開され、めでたくリリースすることが出来ました！

* 課金をして使える機能の質問

```
What does purchasing an Auto-Renewable subscription provide to the user?
→The user can read monthly column. Additionally the user can search cafes by various menus.
```

* コラムの更新頻度や量の質問

```
Is the content updated? How much of content is added and how often?
→Now only April version column, but we will add the May version column soon or later. At least one column will be added monthly.
```

## リリース前の確認方法
開発用のProvisioningProfileを使用しているアプリだと、本番用のProductを購入できないので、Appleが買収したTestFlightを使えば、SandBoxを使わずに通常のAppleIDでテストすることができます。ようやく買収されたメリットが！
1. アプリをAppleが提供しているTestFlight経由でDL(事前に内部テスターに追加しておく)
2. 内部テスターに登録したAppleIDで購読処理を行う(TestFlihgt経由でDLしたアプリでは課金は発生しません)
3. 購読処理が正常に完了し、機能が使えることを確認する

## まとめ
噂に聞いていたとおり、月額課金はだんだんと審査基準が厳しくなっているのか、他のアプリではできていたことができなくなっていたりと、いくつかのハードルがありました。 
特に審査期間は、1ヶ月程かかると予想しておいた方が良いでしょう。また、一度審査に通ってもコンテンツの更新頻度が悪かったり、審査する人によってはリジェクトされる可能性は十分にあり得るので、油断は禁物のようです。。
現に、いくつかのアプリは審査に通らなかったのか、いつの間にか月額課金機能がなくなっていたりするものもありますからね。。

## こだわりカフェが探せるCafeSnap
![icon.jpg](https://qiita-image-store.s3.amazonaws.com/0/10532/6295add5-0ba8-2644-f610-9dea2189eb22.jpeg "icon.jpg")

- iOS  
https://itunes.apple.com/jp/app/cafesnap/id910848942
- Andorid  
https://play.google.com/store/apps/details?id=jp.co.allabout.cafesnap
コードレビューを効率化するために

コードレビューにかかる時間が長い！
そう思ったあなたにコードレビューを効率化させるためのプラクティス
１年半くらいまえにやったけどなんかまた説明を求められたのでここに書く


# フェーズ1.
１０人超えのチームでレビュワーは３人
レビュー待ちが長蛇の列、レビューのコストも多ければ手戻りも多い。
タスクが完了するまでの時間が超長かった。

## 当時は
プルリクエストの内容はデザイン〜サーバサイドまでEnd to End
変更規模は1000行超えもザラ
タスク開始されてからプルリクエストがmergeされるまで最低１週間以上
PRのdescriptionには３行程度
レビューに入ってからmergeまで３日程度

# フェーズ2.
さすがにこれでは進行が遅すぎるのでPRを細分化

サーバサイドとデザインを分離
さらにその中でも機能を分離。たとえばCRUDでも１つずつPRにする。
とにかく細かく。
PRの規模は300行以内。
レビュワーのレビュー時の消耗が一気に減った。
また、タスクの細かさにより実装やレビューの進行も早くなった。

# フェーズ3.
レビュー時にこれはなにをやりたいんだ？
というのを理解するのに時間がかかり、レビュー時のレビュワーの消耗が激しいためdescriptionに細かく書くことにした。
issueにこのタスクでやりたいことの「意図」を書く。
issueを実装するPRのdescriptionにはこのPRでやりたい意図とその実装アプローチ、特に見て欲しいところ、懸念点を書く。
考慮した上で今回はこうしたこと、連携箇所の担当と協議し決定したことなどレビュワーが突っ込みそうなところは先回りして書く。
descriptionは10~30行まで増える

# フェーズ４
いちいちdescriptionに長文を書くのが面倒くさいのでレビュー依頼の際にレビュワー席で依頼者がdescriptionの内容を説明
レビュワーが疑問に思った点はその場で依頼者が説明。
「この書き方別メソッドに切り出したら？」
「使っているのがこことこっちの二箇所です、三箇所になったら切り出し検討します。」
レビュワーのPRタスク開始時の負荷が激減

# フェーズ5
PRの突っ込みどころがそもそもissue起票時の時点で存在しているため、レビュワーと担当者、issue起票者はissue開始時に意図とアプローチについて説明と質問、協議を行う。
そのあと担当者が単独で実装、その後レビュー。

# フェーズ6
特に仕様が複雑な箇所はレビュワーと担当者が実装も一緒にやる。
issue起票、実装、レビューを２人で同時にやる。
300行程度なら１時間かからずに起票からmergeまで進行。とにかく早い。


# ほかに気をつけたこと
syntaxやスペースの入れ忘れなど「てにをは」レベルのことは人間が気にすべきじゃない。
rubocopやhoundを入れてテスト実施時点で同時にチェックさせた
そうすることで文法スタイルの統一性とレビュワー負荷の低減を両立
python から Web ブラウザを開く方法

# 追記 (2015/05/30)
[新しい投稿](http://qiita.com/hideshis/items/1c113d21321d6d580bce)には，もう少しディープな内容が載っています．

動作環境：
* Windows 7
* Python 2.7.5

めちゃくちゃシンプル．
```Python:sample1.py
import webbrowser
url = "amazon.co.jp"
webbrowser.open(url)
```
ただし，これだとIEでWebサイトを開いてしまう．
自分の好みのブラウザ，たとえばchrome でWeb サイトを開きたいときは，
```Python:sample2.py
import webbrowser
url = "amazon.co.jp"
browser = webbrowser.get('"(chrome.exe までの絶対パス)" %s')
browser.open(url)
```
とする．
SetExpressCheckout APIのADDROVERRIDEフィールド

SetExpressCheckout APIで配送先住所を渡しているのに、そのあとPayPal決済画面に遷移してユーザーが配送先を変更してしまうと、実際の配送先とPayPalが認識する配送先住所が異なる可能性が出てきます。

上記の点を解消するために、SetExpressCheckout APIのADDROVERRIDEフィールドに”１”を設定すると、遷移後のPayPal決済画面で配送先を変更できなくなります。
hubotから@channelでメッセージを送る


hubotからSlackに、全員に向けて通知を送りたいときがあると思います。
cronを使って定時になったよとか。

その場合 `msg.send` や `robot.send` を使うと思うんですが、下記のコードだと@channelがうまくメンションになってくれません。

```coffee
robot.send {room: "general"}, "@channel: 終業時間ﾃﾞｽ"
```

こう書くとちゃんと飛びます。

```coffee
robot.send {room: "general"}, "<!channel> 終業時間ﾃﾞｽ"
```

@everyoneや@groupも同じ書き方でいけます。
ちなみに、2015/5/29時点では動きますが、将来変わるかもしれませんのでご注意を。

[How do you 'mention' users in this hubot cron script for Slack, so they can see it as notification if their notification settings are on? - Stack Overflow](http://stackoverflow.com/questions/28237052/how-do-you-mention-users-in-this-hubot-cron-script-for-slack-so-they-can-see)
リモートの 特定の git ブランチのみを削除したい（ローカルはそのままにしたい） 所要時間 1分

プルリクを投げるつもりでブランチをpushしてしまったけど、コミットがミスっていた。というパターン。
リモートのブランチだけ消してしまったほうが楽なことが多い


- リモートを origin で指定しているとすると

```
$ git push origin :(消したいブランチ名)
```

これで、ローカルのブランチはそのままで、リモートだけ消える。

あとはローカルのコミットログを
git reset --soft なりして修正して
再度ブランチをpushすればよい
[FuelPHP] 環境によってDBの接続先を切り替える

FuelPHPを使った場合に、DBの接続先を環境によって切り替えたい場合の設定方法。


##やりたいこと
環境毎に接続先サーバ、DBの設定を切り替える。


##対処
1.ドメインに応じて、読み込むdb.phpファイルを切り替える。
/fuel/app/bootstrap.phpを編集

```lang:bootstrap.php
switch (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : ''){
    case 'production.co.jp':
        //本番
        Fuel::$env = Fuel::PRODUCTION;
        break;
    case 'staging.co.jp':
        //テスト環境 
        Fuel::$env = Fuel::STAGING;
        break;
    default:
        //ローカル環境
        Fuel::$env = Fuel::DEVELOPMENT;
        break;
}
```
Fuel::PRODUCTIONなどは、読み込むDB設定ファイルの場所に関連する。

2.db.phpの修正
/fuel/app/config/配下に
/development/
/production/
/staging/
のディレクトリがあるので、それぞれを対応する環境用に修正する。
上記、bootstrap.phpにあわせると、

ローカル環境→/development/
テスト環境→/staging/
本番環境→/production/

```lang:db.php
return array(
    'dbname' => array(
        'connection'  => array(
            'dsn'        => 'mysql:host=localhost;dbname=dbname',
            'username'   => 'username',
            'password'   => 'password',
        ),
    )
);
```

コンフィグファイル、各値の取得は以下

```
\Fuel\Core\Config::load('db');
$pdo_config = \Fuel\Core\Config::get('dbname');
$pdo_username = $pdo_config['connection']['username'];
$pdo_password = $pdo_config['connection']['password'];
```


以上
botoでElasticMQに繋ぐ

# botoでElasticMQに繋ぐ

Amazon SQS のローカルでの代用。

`boto` の `connect_to_region` 使った方法はよく出てくるけど、
ローカルの ElasticMQ だと `regioninfo.SQSRegionInfo` で繋がないとならないので、それのメモ書き。

`is_secure` を `True` にすると `https` になるらしい。

## 準備

ElasticMQ は落としてきて起動しておく。
デフォルトならポートは`9324`かな。

```
$ java -jar ~/opt/elasticmq-server-0.8.8.jar
```

## 送るやつ

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

import sys
from boto.sqs import regioninfo
from boto.sqs.message import Message

AWS_ACCESS_KEY = 'TEST'   # EMQならなんでもいい
AWS_SECRET_KEY = 'TEST'   # EMQならなんでもいい

SQS_REGION     = "emq"         # EMQならなんでもいい
SQS_ENDPOINT   = "localhost"

# AWSの場合
# SQS_REGION = "ap-northeast-1"
# SQS_ENDPOINT = "sqs.ap-northeast-1.amazonaws.com"

SQS_QUEUE_NAME = 'dev_messages'
PORT = 9324     # AWSなら80 / もしくは指定しない

region = regioninfo.SQSRegionInfo(name=SQS_REGION, endpoint=SQS_ENDPOINT)
conn = region.connect(
        aws_access_key_id=AWS_ACCESS_KEY,
        aws_secret_access_key=AWS_SECRET_KEY,
        port=PORT,
        is_secure=False
    );

queue = conn.create_queue(SQS_QUEUE_NAME)
msg = Message(
    body='QUEUE TEST',
)
msg.message_attributes = {
        "name1": {
            "data_type": "String",
            "string_value": "I am a string"
        },
    }
queue.write(msg)
```

## 受けるやつ

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

import sys
from boto.sqs import regioninfo
from boto.sqs.message import Message

AWS_ACCESS_KEY = 'TEST'   # EMQならなんでもいい
AWS_SECRET_KEY = 'TEST'   # EMQならなんでもいい

SQS_REGION     = "emq"         # EMQならなんでもいい
SQS_ENDPOINT   = "localhost"

# AWSの場合
# SQS_REGION = "ap-northeast-1"
# SQS_ENDPOINT = "sqs.ap-northeast-1.amazonaws.com"

SQS_QUEUE_NAME = 'dev_messages'
PORT = 9324     # AWSなら80 / もしくは指定しない

region = regioninfo.SQSRegionInfo(name=SQS_REGION, endpoint=SQS_ENDPOINT)
conn = region.connect(
        aws_access_key_id=AWS_ACCESS_KEY,
        aws_secret_access_key=AWS_SECRET_KEY,
        port=PORT,
        is_secure=False
    );

queue = conn.get_queue(SQS_QUEUE_NAME)
queue.set_attribute('ReceiveMessageWaitTimeSeconds', 20)

import json

msgs = queue.get_messages(10)
for msg in msgs:
    print json.dumps(msg.__dict__, default=str)
    queue.delete_message(msg)
```
-assumenosideeffects class android.util.Log { <methods>; } は使っちゃダメ

この設定をすると、Logクラスのメソッドすべてが副作用がないものとして扱われます。すべてのメソッドとは、継承元のメソッドも含みます。

その結果 `Object#wait()` なども副作用なしとしてdead code eliminationの対象になり、すべての `Object#wait()` が素通りするようになります。

これを防ぐためには下記のように `<methods>` じゃなく個別に指定しないといけません。

```
-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int d(...);
    public static int i(...);
    public static int w(...);
    public static int e(...);
    public static int wtf(...);
}
```

最小確認コード: https://github.com/gfx/ProguardRemovesObjectWait
cocos2dxのProjectをEclipseでビルドすると"NDK_ROOT not defined"になる時の対処法

##問題

**.bash_profileにはAndroid NDKへのパスを設定済み**なのに、cocos2dxのProjectをEclipseでビルドすると`NDK_ROOT not defined`のエラーになってしまう。

##対処法

Eclipseで下記の設定を行う。

Projectで右クリックしてプロパティを開く。
C/C++を選ぶ。
Build->Environmentを選ぶ。

下記の設定を追加。
Name: NDK_ROOT
Value: NDKへのパスを設定
Gojiを使ってWebビーコン作る


業務でWebビーコン作る事になって折角なのでーということでGO言語使って実装してみることにした。

## 実際にやること

`Content-Type` に `image/gif`などの画像を追加して表示側では1pxの画像として配置してもらう。

## 表示側の中身

```php:index.php
<?php
setcookie("value", "適当なCookieの値");
setcookie("expire", time()+3600*24*20);
session_start();
$_SESSION['customer_id'] = 184;
$_SESSION['counter'] = $_SESSOIN['counter'] ? $_SESSION['counter'] + 1 : 0;
?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <div class="container">
    <div class="title">
      <h1>Test Title</h1>
    </div>
    <div class="body">
      <p>この下にビーコンのImageタグが入ります。</p>
      <img src="http://localhost:9090/image.gif" style="width:1px;height:1px;">
      <p>ビーコンからCookieやSessionが取れるかどうかのテスト</p>
    </div>
    <div class="footer"><span>Footer</span></div>
  </div>
</body>
</html>
```

## サーバサイド側の中身

```go:server.go
package main
import (
  "fmt"
  "flag"
  "net/http"
  "github.com/zenazn/goji"
  "github.com/zenazn/goji/web"
)

func handlerImage(c web.C, w http.ResponseWriter, r *http.Request) {
  w.Header().Set("Content-Type", "image/gif")
  for _, cookie := range r.Cookies() {
    fmt.Println(cookie.Name, cookie.Value)
  }
}

func main(){
  flag.Set("bind", ":9090")
  goji.Get("/image.gif", handlerImage)
  goji.Serve()
}
```

`interface`とか`type`辺りはまだ理解しきってない。その内徐々にアップデートしていく予定。
`go run server.go`で起動。

```bash
2015/05/29 17:16:59.870388 [] Started GET "/image.gif" from 127.0.0.1:60637
PHPSESSID 7c9ee766d94e4f25235e2512d376a870
value %E9%81%A9%E5%BD%93%E3%81%AACookie%E3%81%AE%E5%80%A4
expire 1434615419
2015/05/29 17:16:59.870453 [] Returning 200 in 33.831µs
```

`33.831μs`なんて！素敵！！
流石にPHPのセッションまでは取得出来なかった。SessionIDまではとれたけどね…Sessionはまだ頑張ってみる。

## ハマった事

### Gojiのポートを変える

`$GOPATH/src/github.com/zenazn/goji/bind/bind.go`の`WithFlag()`メソッド内で`flag.StringVar`を呼び出しているので

```go
flag.Set("bind", ":9090")
```

で、設定するとポートが変更出来た。結構悩んだ。

### Cookieを取得する

WebビーコンなのでCookieからデータを取得したい。

```go
r.Header
```

上記の様にHeaderを取得すればCookie自体も取得出来たけどテキストデータなので純粋にCookieデータを取得したい。
`net/http/cookiejar`でCookieを自由に変更出来るとの事だったんだけど値をセットする際に利用するので違った模様。
`net/http`パッケージの中に`Cookies`というメソッドがあったので利用してみたら

```go
for _, cookie := range r.Cookies() {
  fmt.Println(cookie.Name, cookie.Value)
}
```

こんな感じで簡単に出来た。

## 参考したURLなど

- [Package http](http://golang-jp.org/pkg/net/http/)
- [zenazn](https://github.com/zenazn/goji)
- [Example of serving on different port than 8000](https://github.com/zenazn/goji/issues/15)
PostgreSQLのDBを複製する方法

1つの案件で複数のカスタマイズを同時に行っている時にそれぞれ違う変更をDBに行う必要があり
同じDBを複数用意する必要があったので調べた時のメモ。
一時的なバックアップにも便利かも。


##コマンド1
```createdb -T ORG_DB_NAME NEW_DB_NAME```


##コマンド2
上記のコマンドは、DBを使用中だと怒られれるので
その場合は、下記コマンド

```
createdb NEW_DB_NAME
pg_dump -Ft ORG_DB_NAME | pg_restore -d NEW_DB_NAME
```


##備考
ORG_DB_NAME：コピー元のDB名
NEW_DB_NAME：新しく作るDB名
mac > バックスラッシュを片手で入力

バックスラッシュはoption+¥で入力できるのは知っている。
ただし、利き腕を折った状態ではoption+¥は離れすぎていて押せない。

片手で入力する方法を調べた。

#ことえり

[yuasaさん](http://www-utheal.phys.s.u-tokyo.ac.jp/~yuasa/wiki/index.php/Mac%E3%81%A7%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E6%A8%99%E6%BA%96%E3%81%A7%E5%85%A5%E5%8A%9B%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)参照

#google日本語入力

環境設定　＞　一般タブ　＞　￥キーで入力する文字
にてバックスラッシュを設定すればいい。

半角¥はENと入力し漢字変換で入力すればいい。
Memcacheでセットした値をMemcachedで取得しようとして、ハマる。

PHPでMemcacheを使うためのクラスとして

```
Memcache
```

と

```
Memcached
```

がある。

この時点で既にややこしい・・・

現場でモロモロ事情があり、Memcacheのほうでsetした値をMemcachedを使ってgetした際に上手く動かなくて、激ハマリしてしまった。

例えば、以下のようなプログラムがあったとする。

```php
$host = 'localhost';
$port = 11211;

$array = array( 'name' => 'tadasuke' );

// Memcacheインスタンス作成
$mem = new Memcache();
// Memcahce接続
$mem -> connect( $host, $port );
// 値をセット
$mem -> set( 'test', $array );
// セットした値を取得
$result = $mem -> get( 'test' );
// 接続解除
$mem -> close();

var_dump( $result );
```

出力結果はこんな感じ。

```
array(1) { ["name"]=> string(8) "tadasuke" }
```

今度はこれをMemcachedを使って取得してみる。

```php
$host = 'localhost';
$port = 11211;

$array = array( 'name' => 'tadasuke' );

// Memcacheインスタンス作成
$mem = new Memcache();
// Memcahce接続
$mem -> connect( $host, $port );
// 値をセット
$mem -> set( 'test', $array );
// セットした値を取得
$result = $mem -> get( 'test' );
// 接続解除
$mem -> close();

//var_dump( $result );

// Memcahcedインスタンス作成
$memd = new Memcached();
// Memcacheに接続
$memd -> addServer( $host, $port );

// セットした値を取得
$result = $memd -> get( 'test' );
// 接続解除
$memd -> quit();

var_dump( $result );
```

出力結果はまさかのこんな感じ。

```
int(0)
```

試しにsetする値を配列ではなくて数値や文字列にしてみたところ、MemcacheでもMemcachedでも同じように出力された。

どうも、MemcahceとMemcachedでは配列やオブジェクトをシリアライズさせる方法がが違うっぽい。

こんなん、分かるかいっ！！

というわけで、皆さん注意しましょうね。
MemcacheとMemcachedを両方使うっていうこと自体が、なかなかレアなケースだろうけど・・・
PHPで連想配列をforeachで回した時のkeyの型

```php
$array = array( '1' => 'hoge' );
```

というような連想配列があった場合、

```php
foreach ( $array as $key => $value ) {
    if ( $key === '1' ) {
        echo( 'ゲッツ!!' );
    }
}
```

とすれば「ゲッツ」が出力されるかと思いきや、実は出力されない。

```php
foreach ( $array as $key => $value ) {
    if ( $key === 1 ) {
        echo( 'ゲッツ!!' );
    }
}
```

とすると表示される。

どうもPHPのforeachの仕様として、連想配列のキーが数字だった場合、文字列として定義していても数値として扱われるらしい。

じゃあ、

```php
$array = array( 
    '1' => 'hoge'
    , 1 => 'fuga'
);
```

みたいな配列を定義したらどうなんねん！？と思ってやってみたら、がっつり上書かれて

```
Array( [1] => fuga )
```

となった。

なので、以下みたいなコードはかなり注意が必要かも。

```php
$array = array();
$array[] = 'hoge';
$array[] = 'fuga';
$array['1'] = 'foo';
```

当然、

```
Array( [0]=>hoge [1]=>foo )
```

となります。

まとめとしては、

- 通常の配列と連想配列はごっちゃにしない
- 比較にはstrcmpを使う

ということになるのかしら。
Rails の `utf8=✓` の歴史と消し方と snowman ☃

Rails の form_tag や form_for で form を作成すると `<input name="utf8" type="hidden" value="✓">` という input 要素が自動で追加されて、submit すると `utf8=✓` というパラメータが付いてくる。これの歴史と消し方を調べた。

# 歴史

Rails3 で、Internet Explorer 5、6、7、8 にパラメータを Unicode でエンコードさせるため、上記ヘルパーで作成された form に snowman というパラメータがつくようになった。詳しい経緯は[コミットログ](https://github.com/rails/rails/commit/25215d7285db10e2c04d903f251b791342e4dd6a)や、[snowman を追加した Yehuda Katz 本人による stackoverflow の回答](http://stackoverflow.com/a/3348524/3937845)に書いてある。

その当時の rails を使ったことないけど、`&#9731` って[こんなの](http://www.fileformat.info/info/unicode/char/2603/index.htm)らしいので、 `_snowman=☃` って表示されていたんですかね。

Yehuda Katz の回答に書いてあるとおり、[_snowman から _e ](https://github.com/rails/rails/commit/7171161124a2852ee7b40c5c632ba8e092c97409)になって、その後 [utf8=✓ にする](https://github.com/rails/rails/commit/c6160898c83107ba63017ad2a8b3878733267136)って言ったり、[やっぱり _utf8=☃ にする](https://github.com/rails/rails/commit/c49144b2f7b2cb9b59ea3a9cddd69de47f268ae6)って言ったりしながら、[utf8=✓ に落ち着いた](https://github.com/rails/rails/commit/483b60b9)らしい。みんな楽しそう。

# 消し方

## すべての form から utf8 を消す場合

utf8 の input タグを作っているのは[ここ](https://github.com/rails/rails/blob/v4.2.1/actionview/lib/action_view/helpers/form_tag_helper.rb#L803:L810)。

```rails/actionview/lib/action_view/helpers/form_tag_helper.rb
# Creates the hidden UTF8 enforcer tag. Override this method in a helper
# to customize the tag.
def utf8_enforcer_tag
  # Use raw HTML to ensure the value is written as an HTML entity; it
  # needs to be the right character regardless of which encoding the
  # browser infers.
  '<input name="utf8" type="hidden" value="&#x2713;" />'.html_safe
end
```

コメントに書いてあるとおり、`utf8_enforcer_tag` を上書きする。

```ruby
module ActionView
  module Helpers
    module FormTagHelper
      def utf8_enforcer_tag
        ''
      end
    end
  end
end
```

## 特定の form から utf8 を消す場合

[rails/actionview/lib/action_view/helpers/form_helper.rb](https://github.com/rails/rails/blob/v4.2.1/actionview/lib/action_view/helpers/form_helper.rb) と [rails/actionview/lib/action_view/helpers/form_tag_helper.rb](https://github.com/rails/rails/blob/v4.2.1/actionview/lib/action_view/helpers/form_tag_helper.rb) を調べた。

### form_for の場合

`form_for @model, html: { enforce_utf8: false } do |f|`

リファレンス（コメント）には enforce_utf8 オプションに false を渡すと消えると書いてあるけど、正確には html オプション に `enforce_utf8: false` を含める必要がある。

### form_tag の場合

`form_tag '/models', enforce_utf8: false do`
EmacsEmulations を VisualStudio 2010,2012,2013で・・・

EmacsEmulations はとっても便利なんだけど、VisualStudio 2010 向けにパッケージされていて2012以上ではインストールができない。

一旦解凍してターゲットのVisualStudioのバージョンを書換えて再度圧縮。拡張子を変えてやると認識するのは、 [ここ](http://kaizawa2.hatenablog.jp/entry/2014/12/23/173317) や [ここ](http://statemachine.hatenablog.com/entry/20130522/1369233834) に書かれているとおり。

もうじき新しいバージョンのVisualStudioも出るようですが、バージョン変わる度に操作するのはめんどうだし、バージョン毎にパッケージを用意するのも面倒。

XMLの対応VisualStudioを複数書いちゃえばいいんじゃないか？と思って書いてみたらうまくいったっぽいので、調子に乗って未来のバージョンも書いておけばいいんじゃないか？という、荒っぽい方法です。

XMLの修正箇所

```language:xml
    <SupportedProducts>
      <VisualStudio Version="10.0">
        <Edition>Pro</Edition>
      </VisualStudio>
    </SupportedProducts>
```

これを

```language:xml
    <SupportedProducts>
      <VisualStudio Version="10.0">
        <Edition>Pro</Edition>
      </VisualStudio>
      <VisualStudio Version="11.0">
        <Edition>Pro</Edition>
      </VisualStudio>
      <VisualStudio Version="12.0">
        <Edition>Pro</Edition>
      </VisualStudio>
      <VisualStudio Version="13.0">
        <Edition>Pro</Edition>
      </VisualStudio>
    </SupportedProducts>
```

とりあえず13あれば次のバージョンはいけるかな？

#### 追記[2015-06-16]

インストールで下記コマンドを実行。

```
"c:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\VSIXInstaller.exe" /admin EmacsExtensions.vsix
```

今のバージョンのVisualStudioの配下に入ります。
Emacs.vsk を Common7/IDE の下にコピー。
設定のエディタで、キー配置にEmacsが出てくればインストール完了。

C-h をバックスペースに割当てたい向きには、編集.1語削除 に対して C-h を割当てれば OK。元の C-h に割り当たっている「編集.置換」にショートカットが必要な場合はは別のキーを割当てるなど。


⚠️注意
--------

EmacsEmulations がすべてのバージョンの VisualStudio で使える事を保証するものではありません。あくまで、バージョンチェックをかいくぐるのみです。
ご使用は自己責任で。
Eclipse(PDO)でコード補完させるためのコメントの書き方

```php
class Hoge {
    // 何かしらの処理
}
```

というようなクラスがあり、それを

```php
class Factory {
    public static function getHogeInstance() {
        return new Hoge();
    }
}
```

みたいな感じでインスタンスを生成するファクトリークラスがあるとして、

```
$hoge = Factory::getHogeInstance();
```

ってやると、当然Hogeオブジェクトを取得できるのだけど、Eclipse的には$hogeがHogeオブジェクトだとは分からないので、コード補完してくれない。

そこで、FactoryクラスのgetHogeInstanceメソッドにPHPDocのコメントを書いてやる。

```php
class Factory {

    /**
     * Hogeオブジェクト取得
     * @return Hoge
     */
    public static function getHogeInstance() {
        return new Hoge();
    }
}
```

これで呼び出し元ではコード補完してくれるので、今まではそうやって対応してきたのだけど、これだとFactoryクラスで別のオブジェクトを返したくなった場合、返すオブジェクトの数だけ別のメソッドを作らなければいけなくなってします。

```php
new $class()
```
みたいな感じで動的にインスタンスは作成できても、コメントは動的に書きようがないので、Eclipse的にはどのオブジェクト型なのかわからず、コード補完できない。

っていう問題にかれこれ1年以上悩まされていたのだけど、昨日、遂に問題が解決した。

以下、修正コード。

**ファクトリークラス**

```php
class Factory {

    /**
     * Hogeオブジェクト取得
     * @param string $class
     * @return Ambigous
     */
    public static function getInstance( $class ) {
        return new $class();
    }
}
```

**呼び出し元**

```php
/* @var $hoge Hoge */
$hoge = Factory::getInstance( Hoge::class );
```

ポイントは呼び出し元に書いた

```php
/* @var $hoge Hoge */
```
というコメント。
こう書いてやると、メソッド内の変数でも型を指定できるので、Eclipseで補完してくれるようになります。

ちょっと長い説明になっちゃったけど、この感動が伝わったかな・・・
これでかなりコーディング量が削減できそうで、とってもゴキゲンです。
Homebrew の gdb で ELF をアレしたい

VMware のリモートデバッグ機能を使って OS X から Linux カーネルに gdb で接続したいのですが、それには ELF である `vmlinux` ファイルを gdb に読み込ませる必要があります。しかし、標準では [Homebrew の gdb](https://github.com/homebrew/homebrew-dupes/blob/master/gdb.rb) は ELF に対応していません。

# 解決策

- `--with-all-targets` を付けて `brew install` する

こういう感じです。

```
% brew install gdb --with-all-targets
==> Installing gdb from homebrew/homebrew-dupes
==> Downloading http://ftpmirror.gnu.org/gdb/gdb-7.9.tar.xz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/gdb/7.9 --with-system-readline --with-lzma --enable-targets=all --with-python=/usr
==> make
==> make install
==> Caveats
gdb requires special privileges to access Mach ports.
You will need to codesign the binary. For instructions, see:

  http://sourceware.org/gdb/wiki/BuildingOnDarwin
==> Summary
🍺  /usr/local/Cellar/gdb/7.9: 43 files, 22M, built in 6.1 minutes
```

早速 `vmlinux` をロードできるか試してみます。

```
% gdb
GNU gdb (GDB) 7.9
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin14.3.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) file vmlinux
Reading symbols from vmlinux...done.
```

というわけで、OS X の gdb で ELF をロードできました。
【超入門】linux shell　～『コマンドがみつかりません』と表示される場合はたいてい...～

Linuxで.shファイルを作成・実行するときに気をつけるべき３つのこと

○改行コードはLFに
シェルスクリプトを作成して.shファイルを作成するときに改行コードを指定せずに作成してしまうと、『コマンドがみつかりません』というエラーメッセージが表示されます
シェルスクリプト覚えはじめの頃に、結構してしまいがちなミスなので注意を...

○UTF-8で保存するときはBOM無し指定で
こちらも保存時に指定しないといけない項目
Windowsで作成したシェルをWinscp等でLinuxに移すという場面も多々あると思いますが、UTF-8で保存する際はBOMなしを指定して保存しないと実行時にエラーになります

○実行時はシェルを相対パスまたは絶対パスで指定して実行すること
例えばhome>shell配下にtext.shを配置して実行する場合にやってしまいがちなミスが
(コマンド)
  cd /home/shell
  sh test.sh

※.シェバングを記述していたらshは不要

みたいにdosライクな実行の仕方をしてしまうこと
Linuxはシェル置いてるフォルダパスが環境変数に登録されていないと実行不可になるので、相対パスや絶対パス指定で実行しましょう(いくらシェルがあるフォルダにcdしていても、上記のようなコマンドでは実行されません)

(コマンド)
  cd /home/shell
  sh ./test.sh

or

  sh /home/shell/test.sh

私自身が入門したてなため、
不備等あったらご連絡くださいませ
よろしくお願いいたします
unityでplatformによって取得できるパス

#Script
//一時領域のパス
print(Application.temporaryCachePath);
//ストリーミングアセットのパス
print(Application.streamingAssetsPath);
//Unityが利用するデータが保存されるパス
print(Application.dataPath);
//実行中に保存されるファイルがあるパス
print(Application.persistentDataPath);

#IOS:
Application.dataPath :                      Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
Application.streamingAssetsPath :   Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
Application.persistentDataPath :      Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
Application.temporaryCachePath :   Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches

#Android:
Application.dataPath :                         /data/app/xxx.xxx.xxx.apk
Application.streamingAssetsPath :      jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
Application.persistentDataPath :         /data/data/xxx.xxx.xxx/files
Application.temporaryCachePath :      /data/data/xxx.xxx.xxx/cache
#Windows:
Application.dataPath :                         /Assets
Application.streamingAssetsPath :      /Assets/StreamingAssets
Application.persistentDataPath :         C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName
Application.temporaryCachePath :      C:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName
#Mac:
Application.dataPath :                         /Assets
Application.streamingAssetsPath :      /Assets/StreamingAssets
Application.persistentDataPath :         /Users/xxxx/Library/Caches/CompanyName/Product Name
Application.temporaryCachePath :      /var/folders/57/6b4_9w8113x2fsmzx_yhrhvh0000gn/T/CompanyName/Product Name
#Windows Web Player:
Application.dataPath :             file:///D:/MyGame/WebPlayer(htmlのパス)
Application.streamingAssetsPath :
Application.persistentDataPath :
Application.temporaryCachePath :

#終わりに
gzip (gz) で圧縮保管したファイルを解凍せずに中身を見たい


ファイル内の件数だけがほしいんじゃー。

```shell-session
$ gunzip filename.gz
$ cat filename | wc -l
```

`zcat` があるじゃない。

```shell-session
$ zcat filename.gz | wc -l
```

小さな一手間、大きな差

良き圧縮Lifeを
javaws(jnlp)をリモートデバッグする方法

jnlpファイルを実行する前に、以下の環境変数を設定する。

※linux環境でやる場合
export JAVAWS_TRACE_NATIVE=1
export JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n"

※windows環境用(未検証)
set JAVAWS_TRACE_NATIVE=1
set JAVAWS_VM_ARGS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8989,server=y,suspend=n"

javawsコマンドでjnlpファイルを実行後に、
eclipseからDebug Configulationを設定し、
port番号にaddressで設定したのと同一の値を設定する。
Railsのi18nのyamlにRubyの変数を使えるようにする



I18nで使われるt(translate)関数をoverrideする

``ApplicationController``に下記を追加する

```rb:app/controllers/application_controller.rb
  # 辞書ファイル（.ymlファイル）の中でrubyコードを使えるようにする
  #
  #   ** I18nのtransate(t)メソッドをオーバライド **
  #
  def I18n.t(code, options = {})

    begin
      message_code = code
      normal_translated = super message_code, options
      translated = eval("\"#{normal_translated}\"")
      return translated
    rescue SyntaxError => ex
      return normal_translated
    end

  end
```

これでlocaleのymlファイルにruby変数を使用することができるようになります。

[``rails_config``](https://github.com/railsconfig/rails_config)などのGemを使って、

アプリケーション名を

```rb
Settings.app_name
```
で取得できるようにしておいた時、

```yaml:config/locales/devise.ja.yml
ja:
  devise:
    mailer:
      confirmation_instructions:
        subject: "【#{Settings.app_name}】アカウントの登録のご案内"
      reset_password_instructions:
        subject: "【#{Settings.app_name}】パスワードの再設定のご案内"
      unlock_instructions:
        subject: '【#{Settings.app_name}】アカウントのロック解除のご案内'
```

としておけば、Deviseがユーザ登録などの時に送る、
メールの件名に、設定したアプリケーション名を表示させることが出来ます。


結局、作成した``ApplicationController``全体では下記のようになります。

```rb:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception


  # 辞書ファイル（.ymlファイル）の中でrubyコードを使えるようにする
  #
  #   ** I18nのtransate(t)メソッドをオーバライド **
  #
  def I18n.t(code, options = {})

    begin
      message_code = code
      normal_translated = super message_code, options
      translated = eval("\"#{normal_translated}\"")
      return translated
    rescue SyntaxError => ex
      return normal_translated
    end

  end


end
```

※参考URL
http://tech.aktsk.jp/%E6%8A%80%E8%A1%93/ruby-%E6%8A%80%E8%A1%93/20111223/266
PHP5.3からPHP5.4へのアップデート

#経緯
HPをWordPressへ移行するにあたり、PHPのバージョンが古かったのでアップデートした際の覚書です。

#環境
* CentOS 6.6 64bit
* PHP 5.3


#手順
##1. 事前準備
###1.1. 現在のPHPモジュールのバージョン確認
```shell-session
# rpm -qa | grep php
php-mbstring-5.3.3-40.el6_6.x86_64
php-common-5.3.3-40.el6_6.x86_64
php-5.3.3-40.el6_6.x86_64
php-cli-5.3.3-40.el6_6.x86_64
php-pdo-5.3.3-40.el6_6.x86_64
php-mysql-5.3.3-40.el6_6.x86_64
```

###1.2. リポジトリ追加
* yumリポジトリにiusとepelを追加

```shell-session
# wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/ius-release-1.0-13.ius.el6.noarch.rpm
# wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/epel-release-6-5.noarch.rpm
# rpm -Uvh *-release*rpm
```

###1.3. リポジトリリスト確認
* リポジトリリストにiusが追加された事を確認

```shell-session
# yum repolist ius
IUS Community Packages for Enterprise Linux 6 - x86_64
```

##2. インストール
###2.1. PHP5.3の削除
```shell-session
# rpm -e php-mbstring php-common php php-cli php-pdo php-mysql --nodeps
```

###2.2. PHP5.4のインストール
```shell-session
# yum -y install php54-mbstring php54-common php54 php54-cli php54-pdo php54-mysql
Loaded plugins: fastestmirror, refresh-packagekit, security
Determining fastest mirrors
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
```
と思ったらなんかエラー出てインストールできないので確認。

####2.2.1. デバッグモードでエラー出力
```shell-session
# URLGRABBER_DEBUG=1 yum -y install php54-mbstring php54-common php54 php54-cli php54-pdo php54-mysql 2> /tmp/debug.log
```

####2.2.2. デバッグログ解析
* ログ内に下記エラーを確認

```shell-session
# cat /tmp/debug.log
~省略~
* SSL connect error
```

####2.2.3. 追加モジュールインストール
* 確認したところこ、のエラーが出る場合NSSのアップデートが必要とのことなのでアップデート実施

```shell-session
# yum --disablerepo=epel update nss
```

####2.2.4. 再度PHP5.4インストール
* 今度はうまくいきました

```shell-session
# yum -y install php54-mbstring php54-common php54 php54-cli php54-pdo php54-mysql
```

##3. 事後確認
###3.1. PHPのバージョン確認
```shell-session
# php -v
PHP 5.4.35 (cli) (built: Nov 14 2014 10:04:29)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
```

###3.2. PHPモジュール確認
```shell-session
# rpm -qa |grep php
php54-cli-5.4.35-1.ius.el6.x86_64
php54-mbstring-5.4.35-1.ius.el6.x86_64
php54-common-5.4.35-1.ius.el6.x86_64
php54-mysql-5.4.35-1.ius.el6.x86_64
php54-5.4.35-1.ius.el6.x86_64
php54-pdo-5.4.35-1.ius.el6.x86_64
```

以上！

#後記
SSLのエラーのところでかなりハマりましたｗ
スマホサイトで、target="_blank"で開いたページの電話番号リンクを踏むと勝手にタブが閉じられる


##確認端末
iPhone6
iOS 8.3
ブラウザはSafari

##サンプルコード

```html:index.html
<a href="newpage.html" target="_blank">リンク</a>
```

```html:newpage.html
<a href="tel:0120-000-000">これをクリックするとnewpage.htmlのタブが閉じる</a>
```

仕様なのかバグなのか。
ちなみに`target="_blank"`が無ければタブは閉じられません。
なんでや。。。
ngx_mrubyでちょっとひねったリバースプロキシ


今日は次のような仕様でnginxにリバースプロキシさせたかった。

- http://foo.example.higan.works/index.html で来たリクエストに対して、 (fooは任意)
- コンテンツを バックエンド `example.higan.works` の `/foo/index.html` から取ってくる。
    - バックエンドへのリクエストは => `http://example.higan.works/foo/index.html` になる


仕組みはこうしてみればいいか。

- ディレクトリ名の抽出
- `Host:`ヘッダの付け替え(バックエンドが名前ベースなので)
- uriにディレクトリ名を挟む

nginx単品でもifからの補足マッチで頑張ればできそうな気がしたが、ngx_mrubyが使える環境なので使ってみた。


```nginx
-- snip --

env UPSTREAM_DOMAIN;

-- snip --

http {

-- snip --

    server {
        listen       80;
        server_name  localhost;

        location / {
          resolver 8.8.8.8;
          mruby_set_code $backend '
            ENV["UPSTREAM_DOMAIN"]
          ';

          mruby_set_code $subdir_name '
            r = Nginx::Request.new
            subdir_name =  r.headers_in["Host"].split(".").first
            r.headers_in["Host"] = ENV["UPSTREAM_DOMAIN"]
            subdir_name
          ';

          rewrite ^(.*)$ /$subdir_name$1 break;
          proxy_pass http://$backend;
          proxy_intercept_errors on;
        }

        # redirect server error pages
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        error_page  404              /404.html;
        location = /404.html {
            root   html;
        }
        error_page  403              /403.html;
        location = /403.html {
            root   html;
        }
    }
}
```

まあ何とか読みやすい。mruby_set_code内でヘッダを付け替えるのはどーなんだろと思いつつ動いたのでよし。
Bootstrap で Popover が bind されていたら、hide したかった

popover を動的にセットすると、
popover がバインドされている要素と、バインドされていない要素ができる

リストをループして popover("hide") すると挙動が変だったので、
**バインドされている時だけ** hide にしたかった。

イベントが貼られているかを見る、という苦肉の策で乗り越えた。

```coffeescript
  _($("li")).each (item) ->
     $(item).popover("hide") if $._data(item).data?["bs.popover"]
```

popover が発動していれば、`$._data(item)` は下記みたいになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/30755/afd13155-42be-03b6-1fa4-a19738f63e40.png)

他にやりかたはないのかしら？
CakePHP3(Phinx)のMigration記述例

CakePHP3はDBスキーマの更新管理にPhinxを採用していますが、ドキュメントが少ない…。
ということで、Migrationファイルの例を書こうと思います。

一応参考：
[Cookbook 3.x - Migrations](http://book.cakephp.org/3.0/en/migrations.html)
[Phinx - Writing Migrations](http://phinx.readthedocs.org/en/latest/migrations.html)

# テーブルの追加
`change()`に書ける

```php
$table = $this->table('table_name');
$table->addColumn('name', 'string')
      ->addColumn('description', 'text')
      ->addColumn('created', 'datetime')
      ->addColumn('modified', 'datetime')
      ->create();
```

# テーブル名の変更
`change()`に書ける

```php
$table = $this->table('old_table_name');
$table->rename('new_table_name');
```

# テーブルの削除
`change()`に書けない

```php
$this->dropTable('table_name');
```

# カラムの追加
`change()`に書ける

```php
$table = $this->table('table_name');
$table->addColumn('col_name', 'integer', [
    'default' => 0,
    'limit' => 4,
    'null' => false,
    'after' => 'prev_col_name',
]);
$table->update();
```

# カラム名の変更
`change()`に書ける

```php
$table = $this->table('table_name');
$table->renameColumn('old_col_name', 'new_col_name');
```

# カラム定義の変更
`change()`に書けない

```php
$table = $this->table('table_name');
$table->changeColumn('col_name', 'integer', [
    'default' => null,
    'null' => true,
]);
```

# カラムの削除
`change()`に書けない

```php
$table = $this->table('table_name');
$table->removeColumn('col_name');
```
C# で共用体 (union) を実現するには

C / C++ には「共用体」(union) というのがありますが、C# にはありません。
ですが、属性 StructLayout(LayoutKind.Explicit) と FieldOffset を使って実現は可能です。
[MSDN にも解説があります。](https://msdn.microsoft.com/ja-jp/library/acxa5b99.aspx)

以下にサンプルを示します。

```csharp

using System;
using System.Runtime.InteropServices;

// C# 共用体のテスト
public class UnionTest
{
  public static void Main()
  {
     var bytes = new TBytes();
     bytes.Word = 0x12345678;
     Console.WriteLine("{0:x}", bytes.Byte0);  // 78
     Console.WriteLine("{0:x}", bytes.Byte1);  // 56
     Console.WriteLine("{0:x}", bytes.Byte2);  // 34
     Console.WriteLine("{0:x}", bytes.Byte3);  // 12
  }
}

// 詳しい解説
// https://msdn.microsoft.com/ja-jp/library/acxa5b99.aspx
[StructLayout(LayoutKind.Explicit)]
public struct TBytes
{
  [FieldOffset(0)]
  public byte Byte0;

  [FieldOffset(1)]
  public byte Byte1;

  [FieldOffset(2)]
  public byte Byte2;

  [FieldOffset(3)]
  public byte Byte3;

  [FieldOffset(0)]
  public uint Word;
}
```
Git で master に push する前に確認するフック書いた

何番煎じだよって感じだけど、適当にググって出てきた奴はメッセージの出し方が個人的に気に入らなかったので自分で作った。

これを .git/hooks/pre-push において実行可能権限を付けると動く。

https://gist.github.com/magicant/f0c6df045d6942087e0b

```sh
#!/bin/sh

set -Ceu

remote="${1}"
remote_url="${2}"

while IFS=' ' read -r local_ref local_sha remote_ref remote_sha
do
	if [ "${remote_ref}" != "refs/heads/master" ]
	then
		continue
	fi

	printf 'Pushing to remote "%s".\n' "${remote}" >&2
	printf 'Are you sure to push local "%s" to remote "master"? ' \
		"${local_ref#refs/heads/}" >&2
	head -n 1 /dev/tty | grep -iq '^y' || exit # return non-zero exit status
done
```
node.js/mochaでObjectをassertする

shouldを使ってテストしていたんですがshouldだとObjectが
比較出来ないようでハマりました。

```
actual = { foo:"foo", bar:"bar" };
expect = { foo:"foo", bar:"bar" };
actual.should.equal(expect);
```

どう見てもパスしそうですがAssertion Errorになります。
とりあえず、shouldでやることをやめて、assertを使うことに

```
actual = { foo:"foo", bar:"bar" };
expect = { foo:"foo", bar:"bar" };
assert.equal(actual, expect);
```

これもだめでした。以下のようにするようです。

```
actual = { foo:"foo", bar:"bar" };
expect = { foo:"foo", bar:"bar" };
assert.deepEqual(actual, expect);
```

これでやりたいことできました。
Object同士の比較は難しいですね。
ZabbixからSlackへちょっとリッチな通知をする

何番煎じか分かりませんが、zabbixからslackへアラートを通知する方法です。

# やりたいこと

* zabbixのアラート（障害時、リカバリ時両方）をslackに通知する
* slackの内容だけで分かるようにホスト名、トリガー名、アイテムの値を表示したい
* すぐzabbix-serverの画面に遷移できるようリンクを設定したい

# 既存の方法

最初にWEBで調べたのですが、大枠としての以下の2パターンが見つかりました。

* MediaTypeにslackを登録してActionのMediaからslackを選んで通知する方法
> 参考：[ZabbixからSlackに通知を送る](http://qiita.com/takashyx@github/items/3c9becf345cd58ca69bf)

* Actionのリモートコマンドでslackへ通知できるスクリプトを実行する方法
> 参考：[zabbixサーバからアラートをSlackに通知する方法](http://developersnote.jp/slack/zabbixslack.html)

前者は簡単に導入できたのですが通知内容が貧弱だったので一旦見送り。
先にMackerelのslack通知を見てたのもあって、もうちょっと情報が欲しいと思いました。

それで後者の方法を試したんですが、どうもリカバリ時にリモートコマンドが実行されないようだったのでこちらも断念。
※zabbix-server-2.4.3で試したんですが、これは仕様なんですかね？

# 設定内容

最終的に前者のMediaTypeを使い、それ用にスクリプト書きました。
Action発火時にトリガー名とかアイテムの値をスクリプトに渡すのに、第三引数にActionの本文の内容が全部はいっていたので、本文に変数（{TRIGGER.NAME}とか{ITEM.VALUE1}とか）を設定してスクリプト内でパースしてます。
※なお第一引数はMediaの通知先、第二引数はActionの件名でした。

この実装がいいのかは謎、、、引数じゃなくていい感じに環境変数に入ってくれたらいいんですけどね。

slackにはこんな感じで通知されます。
![zabbix_slack.png](https://qiita-image-store.s3.amazonaws.com/0/20274/9c768e24-b7b4-8179-78ad-ae3ef300ef68.png)

# 作ったもの
置いておきます。
通知したい内容に合わせてカスタマイズしてお使いください。
https://github.com/bageljp/zabbix-slack
Rubyの条件分岐

##if
条件を元に処理を分岐させたい場合に、ifを使う。

```
n = 2

if n.zero?
 puts '0でした'
elsif n.even?
 puts '偶数'
elsif n.odd?
 puts '奇数'
else
 puts 'わかりません'
end
```

##unless
unlessはifと逆の動きをする

```
n = 1
unless n.zero?
 puts '0ではない'
else
 puts '0です'
end
```

##then
thenは任意でつける事が可能。つけた場合に処理を１行で書ける。

```
if n.zero? then puts '0です' else puts '0ではない' end
```

##三項演算子
上記はあまり利用されないので、もっと綺麗に書くなら三項演算子を使える。

```
result = n.zero? ? '0でした' : '0ではない'
puts result
```

##後置if
else節にあたる分岐が無ければ、後置ifがつかえる。

```
puts '0だった' if n.zero?
```
readで入力待ちの時、whileと組み合わせて想定文字以外のときにエラーを表示する


## y or n の例

```
echo -n "Are you sure you want to exit the server? [y/n] > "
while :
  do
    read INPUT
    case "$INPUT" in
      "y" ) kill $SERVER_PID
            echo "Stopped WEBRick"
            break ;;
      "n" ) echo "Canceled."
            break ;;
      * )   echo "[y/n] で入力してね！" ;;
    esac
  done
```
PHPExcel で あれ？グラフが出ない？と思ったら

# PHPExcel で、あれ？グラフが出ない？と思ったら

まーマニュアルをちゃんと見なさいという話ですが、最初にちょっとハマったので、メモ的に書きます。
（今後も忘れそうなので）

```php
$writer = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel2007');

$writer->setIncludeCharts(true);   // ← こいつを忘れていました

$writer->save('/vagrant/test_chart.xlsx');
```
macのechoをシェルスクリプト内で使う時に -nオプションを使う方法


```
# シェルスクリプト内で以下のように書くと
echo -n "Are you sure you want to exit the server? [y/n] > "

# 実行時
-n Are you sure you want to exit the server? [y/n] >

(´；ω；｀)ｳｯ…
```

echoどこにあるの

```
$ whereis echo
/bin/echo
```

macの場合だけ/bin/echoを直接指定する

```
if [ `uname` = "Darwin" ]; then
    /bin/echo -n "Are you sure you want to exit the server? [y/n] > "
  else
    echo -n "Are you sure you want to exit the server? [y/n] > "
fi
```

/bin/echo を指定すると何故かうまくいく

## 追記(20150530)
```
#!/bin/sh
```

を

```
#!/bin/bash
```

とすることでコードを統一できました。
[Unity] XcodeEditor for Unityを使ってCompile Flagsを自動追加する


[XcodeEditor](https://github.com/dcariola/XCodeEditor-for-Unity)というEditorスクリプトがあります。
PostProcess関連で検索するとよく見かけるんですが、メンテナンスが数年前から止まっており、やりたいことが微妙にできない、みたいなことがあります。

今回は`Compile Flags`を、Unityのバージョンによって変更したかったのでごにょごにょしました。

だいぶ冗長な感じになっちゃいましたが、とりあえず以下の形で動作するのを確認しました。（Unity5）

## サンプルコード

```cs
private static void ProcessXCodeProject (string path)
{
    XCProject project = new XCProject (path);

    // To need to add a `-fno-objc-arc` flag if building in Unity5.
    string librariesPath  = System.IO.Path.Combine(path, "Libraries/Plugins/paty/to/targetDir");
    string[] filePathList = System.IO.Directory.GetFiles(librariesPath);

    PBXDictionary<PBXBuildFile> buildFiles = project.buildFiles;
    foreach (KeyValuePair<string, PBXBuildFile> kvp in buildFiles) {
        
        string fileName = kvp.Key;
        foreach (string targetPath in filePathList) {

            string extention = System.IO.Path.GetExtension(targetPath);
            if (extention == ".m" || extention == ".mm") {

                string targetName = System.IO.Path.GetFileName(targetPath);
                if (fileName.Contains(targetName)) {
                    PBXBuildFile file = kvp.Value;
                    file.AddCompilerFlag("-fno-objc-arc");
                }
            }
        }
    }

    project.Save ();
}
```

`XCProject`のインスタンスが`buildFiles`というメンバを持っていて、ここにどうやらビルドファイルの一覧が保持されているようです。
これを`foreach`で回してその中から該当するファイルに対して`AddCompilerFlag`を実行してフラグを追加します。

上記の例では該当ディレクトリ内のものを一括して設定したかったのでそうしていますが、特定のファイルだけ、という場合はそれをリストで持ったりしてもいいかもしれません。
MyBatisのMapper XMLでJavaの定数を使う方法


こんな感じのお店テーブルがあったとして、

```sql
CREATE TABLE Store {
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    type TINYINT NOT NULL,
    ...
}
```

typeがJavaの定数で定義されている。

```java
package foo.product.constant;

public class StoreType {
    public static final int SUPER_MARKET = 1;
    public static final int CONVENIENCE_STORE = 2;
    ...
}
```

このとき、コンビニのリストを取りたい場合のMapper XMLはこんな感じになるが、「type = 2」がマジックナンバーになっているのでよろしくない。

```xml
<select id="getConvenienceStoreList" resultType="Store">
    SELECT * FROM Store
    WHERE type = 2
    ORDER BY id
    LIMIT #{start}, #{limit}
</select>
```

MyBatisのMapper XMLはOGNLベースの式が書けるので、以下のようにすれば定数を指定できる。

```xml
<select id="getConvenienceStoreList" resultType ="Store">
    SELECT * FROM Store
    WHERE type = ${@foo.product.constant.StoreType@CONVENIENCE_STORE}
    ORDER BY id
    LIMIT #{start}, #{limit}
</select>
```

ちなみにOGNLのパースの動作確認はこんな感じで行うことができる。この場合、misc.FooクラスのFOO_INTの値が標準出力される。

```java
import org.apache.ibatis.ognl.Ognl;
import org.apache.ibatis.ognl.OgnlContext;
import org.apache.ibatis.ognl.OgnlException;

public class OgnlParseSample {
    public static void main(String[] args) throws OgnlException {
        OgnlContext context = new OgnlContext();
        Object parseExpression = Ognl.parseExpression("@misc.Foo@FOO_INT");
        System.out.println(Ognl.getValue(parseExpression, context));
	}
}
```

参考資料

- OGNL文法 http://commons.apache.org/proper/commons-ognl/language-guide.html
- OGNLパース http://okazuki.hatenablog.com/entry/20070306/1173149954
Raspberry Piでテレビを付けて動画再生

# Raspberry Piでテレビを付けて動画再生
Raspberry Piを使ってHDMIでつながったテレビの電源を入れ、動画を再生。
## 準備
- Raspberry Pi
- CEC対応TV
- HDMIケーブル

## Libcecコンパイル
以下を参考にテレビのコントロールに必要なlibcecをコンパイル
[Raspbian Libcec](https://nyxi.eu/blog/2013/04/15/raspbian-libcec/)

## スクリプト
テレビの電源オン

```bash:tvon.sh
#!/bin/sh
echo "on 0" | cec-client -s -d 1
echo "as" | cec-client -s -d 1
fbset -accel false
tvservice -o
tvservice -p
fbset -accel true -xres 1920 -yres 1080
```
参考：[tvservice](https://archlinuxjp.kusakata.com/wiki/Raspberry_Pi#HDMI_.2F_.E3.82.A2.E3.83.8A.E3.83.AD.E3.82.B0_TV_.E5.87.BA.E5.8A.9B)

動画再生

```bash:play.sh
#!/bin/sh
# 電源オン
tvon.sh
# Xスタート
sudo -u pi startx > /dev/null 2>&1 &
# 5回再生
idx=0
while [ $idx -ne 5 ]
do
    omxplayer --amp 0 -r -p -o hdmi hogehoge.mp4
    idx=`expr $idx + 1`
done
exit
```

## 予約再生
目覚まし用に予約する

```bash
$ at "06:30 24.05.15" -f /path/to/play.sh -M
```
参考：[atコマンドの使い方（指定時間にコマンドを実行する）でスケジュール実行。](http://takuya-1st.hatenablog.jp/entry/20120503/1336036427)
Atomのツリー操作をキーボードだけで行う

VimのNERDTree的に使いたいなと思ったのでメモ

## フォーカス移動
Ctrl+0

## ツリーのトグル
Cmd+\ もしくは Cmd+k Cmd+b

## 移動
|操作|キー|
|:---|:---|
|下に移動|j|
|上に移動|k|

## ディレクトリの開閉
|操作|キー|
|:---|:---|
|ファイルを開く|Enter|
|ディレクトリを開く|l もしくは Ctrl+]|
|ディレクトリを閉じる|h もしくは Ctrl+[ もしくは Ctrl+b|
|子要素全て開く|Ctrl+Alt+]|
|子要素全て閉じる|Ctrl+Alt+[|
全て開く・全て閉じるは結構処理重いです

## ディレクトリ、ファイルの追加、削除
|操作|キー|
|:---|:---|
|ファイル追加|a|
|ディレクトリ追加|Shift+a|
|削除|Backspace もしくは Delete|
|複製|d|

## おまけ
|操作|キー|
|:---|:---|
|選択要素のフルパスのコピー|Ctrl+Shift+c|
MonoDevelopでコンテキストメニュー(右クリックメニュー)をキーボードからのショートカットで開くには

MonoDevelopで、「Shift+F10」のショートカットでコンテキストメニュー(右クリックしたときに出てくる奴)を、入力カーソルの位置に呼び出すことができます。

毎度毎度、namespaceの参照のないクラスを初めて使うときにマウスで右クリックメニューを開くという苦行から開放されるためのものになります。

Macにおいては、デフォルトでShift+F10にコントロールが割り当てられているので、「システム環境設定→キーボード」より、「F1、F2などのすべてのキーを標準のファンクションキーとして使用」にチェックをいれねばなりません。
pryがインストールできなくて苦しんだ話

# この記事の対象

* Windowsユーザーだ
* RubyInstallerを使ってRubyをインストールした
* Pryがインストールできなくてwtf状態

# 結論

以下のコマンドを実行しました。

```
gem update --system 2.4.4
gem install pry pry-doc
gem update --system
```
RubyGemを2.4.4に戻してインストール。その後にGemのバージョンを戻せばOKのようです。

※自分の環境だと2.4.6(最新)がはいっていました

# 概要

pryをインストールしようとして`gem install pry`コマンドを叩くと以下の様なエラーメッセージがでました

```
>gem install pry pry-doc
ERROR:  While executing gem ... (Gem::RemoteFetcher::FetchError)
    bad response Not Found 404 (https://rubygems.global.ssl.fastly.net/quick/Marshal.4.8/pry-0.10.1-x86-mingw32.gemspec.rz)
```

詳しくはよくわかりませんでいたがRubyGemのplatformの問題らしいです。
(RubyGemのバージョンを戻すのは暫定対応っぽい)

https://github.com/rubygems/rubygems/issues/1120

# その他

* pryのgemファイルをローカルにダウンロードして`gem install --local`してみたり、platform直指定も試してみましたがだめでした。

* ~~これでwtfできるよやったね~~
get_posts('p=1');で記事を取得できない時のメモ

## あるはずの記事が出てこない

指定したIDの投稿を取得しようと`get_posts`を使用して以下の様に書いたのだけど、
何故か`$posts`には空の配列が入るのみで取得できない。

```php:before.php
<?php 
$arg =
	array(
		'p' => 1
	);
$posts = get_posts( $arg );
?>
```

## post_typeの指定が必須

どうやら`post_type`の指定は必須らしい。
記事なら`post`、固定ページなら`page`、カスタム投稿タイプならそのIDをちゃんと書こう。

```php:after.php
<?php 
$arg =
	array(
		'p' => 1,
		'post_type' => 'post' //これが要る
	);
$posts = get_posts( $arg );
?>
```
sshでのログイン情報をGrowlで表示する

~/.ssh/config に次のように書いておくと、誰がどこにどのタイミングで接続しようとしているのかが把握しやすくなります。

```:~/.ssh/config
Host *
  PermitLocalCommand yes
  LocalCommand growlnotify -t "%h" -m "%u@%l(%d) から %n に %r@%h:%p としてログインしました"
```

上の例だと冗長なので `LocalCommand growlnotify -t "%h" -m "%r@%h:%p"` ぐらいでもいいと思います。
gnawrnipでレポートに出力されるスクリーンショットに任意のタイミングのスクリーンショットを追加する方法

RSpecでのテストで物凄くお世話になっているTurnip Formatter + Gnawrnipの組み合わせ。

レポートHTMLを吐き出してくれるのですが、連続したスクリーンショットを表示してくれたり、各featureの実行時間も一覧で表示してくれたりします。

![スクリーンショット_2015-05-29_14_27_08.png](https://qiita-image-store.s3.amazonaws.com/0/39382/5c3290f2-7961-f600-ca33-fc3e70644e8b.png)

![スクリーンショット_2015-05-29_14_29_06.png](https://qiita-image-store.s3.amazonaws.com/0/39382/22e79db4-dae1-ebf4-367b-683db1932452.png)


スクリーンショットの表示の部分を担っているGnawrnipですが、たまに「あれ？ここのスクリーンショットが撮れてない・・・」ってことがあります。

そんな時に役立つTipsです。


# 手順

手順としては至って簡単です。
スクリーンショットを撮りたいところに対して以下の１行を差し込んでください。
````Gnawrnip.photographer.take_shot````

これで強制的に連続したスクリーンショットの中に上記のコードを差し込んだタイミングのスクリーンショットが入るはずです。
flash直後のrenderについて

Railsでのflash直後のrenderについて

flashの動作として、リクエストを受けたタイミングで内容を表示して消しますが、renderの時は再描画でリクエストとは見なされずに、次に画面を遷移したときにエラーなどのflashメッセージが残ってしまうことがあります。

```rb:間違った例
flash[:error] = 'Error'
render 'new'
```

これを解決するにはflash.nowメソッドを利用します。

```rb:render後にメッセージを削除
flash.now[:error] = 'Error'
render 'new'
```

とここまで書きつつもredirectとrenderの使い分けが正しくできていないような気がするので、以下に参考など。
http://ruby-rails.hatenadiary.com/entry/20140808/1407427457
ホストOSからDockerコンテナにファイルを送る方法


ホストOSからDockerコンテナにファイルを送るには docker exec を利用します。

**注意**　execオプションはDocker1.3以上が必要です。

``` bash
a.tar.gz の転送

HOST$ gzip -cd a.tar.gz | sudo docker exec -i <コンテナID> /bin/tar -C /tmp/ -xf -

/tmp の下に展開されます。

```

逆に、DockerコンテナからホストOSの場合、 docker cp を使えば素直にできます。

参考URL
https://github.com/docker/docker/issues/905
Railsでモデルに関連するSQLやAPI結果を一時的にキャッシュする


:exclamation: 
この記事には問題がありました.
`ActiveModel::Dirty#changes_applied`で変更を捨てるとその捨てられた変更がsaveの対象に上がらなくなります！
単純にidの同一性をチェックしたほうがよさそうでした. `ActiveRecord::Association`のbelongs_toも同じように変更を検知していました.
以下修正コード.

■修正コード

```ruby
class Team < ActiveRecord::Base
  def leader
    return nil unless leader_id 
    return @leader if @leader && leader_id == @leader.id
    @leader = PersonApi.find( leader_id ) # leader詳細情報取得処理
  rescue ActiveRecord::RecordNotFound, PersonApi::RecordNotFound
    nil
  end
end
```

# Goal

モデルに関連するデータを`has_one`,`has_many`のように関連付けしたいけど、DBをjoinできない状況だったり、データ元がAPIだったりするとActiveRecordアソシエーションは利用できない.
自分でメソッド実装すると、そのメソッドがよばれるたびに都度SQLやAPIリクエストが発行され非効率なのでうまい具合に結果をキャッシュしておきたい.

# Code

:exclamation: 
このコードには問題があります.
`ActiveModel::Dirty#changes_applied`で変更を捨てるとその捨てられた変更がsaveの対象に上がらなくなります！

```ruby
# leader_id: このチームのリーダーのid
class Team < ActiveRecord::Base
  def leader
    return nil unless leader_id 
    return @leader if @leader && !leader_id_changed?
    changes_applied
    @leader = PersonApi.find( leader_id ) # leader詳細情報取得処理
  rescue ActiveRecord::RecordNotFound, PersonApi::RecordNotFound
    nil
  end
end

team = Team.new
team.leader # nil

team.leader_id = 1
team.leader # PersonApi.find( 1 )が実行

team.leader # キャッシュから返される

team.leader_id = 2
team.leader
  # leader_id_changed?がtrueなので
  # PersonApi.find( 2 )が実行

team.leader
  # changes_appliedによりleader_id_changed?がfalseに
  # 戻っているのでキャッシュから返される
```

Teamモデルはleader_idのみを持ち、Leader詳細情報は別のAPI(PersonApi)を通して取得できるという前提.
インスタンス変数`@leader`が結果を持っていればそのまま返し、なければデータ取得(SQL/API)をおこなう.
leader_idが変更された場合leader情報も更新される必要があるので、正しくキャッシュを破棄したい. `ActiveModel::Dirty`によって、leader_idが変更されたかどうかを検知する.
キャッシュが更新されたら`changes_applied`で変更を捨てないと、Teamオブジェクトが永続化するまで`leader_id_changed?`がtrueになり続ける.
http://api.rubyonrails.org/classes/ActiveModel/Dirty.html#method-i-changes_applied

# Environment

```
% bundle exec rails -v
Rails 4.1.9
```
Crashlyticsをデバッグビルドでは無効化

AndroidにCrashlyticsを組み込んだところ、デバッグ中のぬるぽとかもガンガンアップロードされてしまい、困ったので調べたところ

```diff:MyApplication.java
public class MyApplication extends Application {
     @Override
     public void onCreate(){
         super.onCreate();
         
-        Fabric.with(this, new Crashlytics());
+        Crashlytics crashlytics = new Crashlytics.Builder().disabled(BuildConfig.DEBUG).build();
+        Fabric.with(this, crashlytics);
```

自動生成されたコードを↑のようにすれば、
デバッグ中にぬるぽで落ちたのとかは、サーバにアップロードされない。

＃Thanks to: http://stackoverflow.com/questions/16986753/how-to-disable-crashlytics-while-developing/27191197#27191197