OmniAICreator/Qiita-1.07M huggingface dataset:
データベース上の都道府県コードを都道府県名に変換するPHP


prefecture_table
+------------------+---------------+
| id               | prefecture_id 
+------------------+---------------+
| 1                | 1             |
| 2                | 13            |
| 3                | 14            |
+------------------+---------------+
みたいなのを

+------------------+---------------+
| id               | prefecture_id 
+------------------+---------------+
| 1                | 北海道         |
| 2                | 東京都         |
| 3                | 神奈川県       |
+------------------+---------------+

にしたいのよね。


#!/usr/bin/php
<?php


//各種設定
$ip = "IPアドレス入れて";
$user = "ユーザ名入れて";
$pass = "パスワードいれて";
$dbnm = "DB名いれて";

/**************check double insert data****************/

$db_con = mysql_connect("$ip", "$user", "$pass",true);

if(!$db_con) {
    echo "DB connect ERROR!".mysql_error($db_con);
    die();
}

$db_selected = mysql_select_db("$dbnm", $db_con);
if (!$db_selected){
    die('データベース選択失敗です。'.mysql_error());
}


mysql_set_charset('utf8');


/*******  mail_address check & user_account_ns_tag check*******/

$prefectures = array(
"北海道",
"青森県",
"岩手県",
"宮城県",
"秋田県",
"山形県",
"福島県",
"茨城県",
"栃木県",
"群馬県",
"埼玉県",
"千葉県",
"東京都",
"神奈川県",
"新潟県",
"富山県",
"石川県",
"福井県",
"山梨県",
"長野県",
"岐阜県",
"静岡県",
"愛知県",
"三重県",
"滋賀県",
"京都府",
"大阪府",
"兵庫県",
"奈良県",
"和歌山県",
"鳥取県",
"島根県",
"岡山県",
"広島県",
"山口県",
"徳島県",
"香川県",
"愛媛県",
"高知県",
"福岡県",
"佐賀県",
"長崎県",
"熊本県",
"大分県",
"宮崎県",
"鹿児島県",
"沖縄県"
);

foreach ($prefectures as $key => $area) {
	$id = $key+1;
	$sql = 'update `prefecture_table` set `prefecture_id`="'.$area.'" where `prefecture_id`="'.$id.'";';
	$data = mysql_query($sql,$db_con);
}

mysql_close($db_con);
Web Clipは登録しないとエラーでるから登録しようねって話。

エラーログに、

* apple-touch-icon.png（apple-touch-icon-precomposed.png）
* browserconfig.xml

が無いよーと出てて、色々対応したのでめも。

# apple-touch-icon.png

iPhoneとAndroid用のfavicon
PC用のページでもapple-touch-iconが要求されるっぽい

## 設置方法
1.「apple-touch-icon.png」というファイル名のPNG画像としてサイトのルートディレクトリに置く
大きさはとりあえず256×256px位
2.headに下記コードを記述

```html
<link href="http://URLが入ります/apple-touch-icon.png" 
rel="apple-touch-icon">
```

* iPhoneは記述しなくても勝手に読みにいくけど、
Androidではこの設定が必要
* precomposedというオプションは今はあまり気にしなくてもいいけど  
もしAndroid2.1に対応する場合は必要


## 気をつけること

* 透過色は真っ黒になるので注意。  
  角丸処理は勝手にやってくれるから無視。
* アイコン画像が置かれるURLにベーシック認証がかかっていると確認できない。
* URLはフルパスで記述。  
（Androidではサイトルートや相対パスだと認識しないことがある）
* Galaxyの場合は一度ブックマークで登録してからでないと、  
アイコンが反映されない

参考サイト：[Androidは「apple-touch-icon」でいろいろハマるので要注意](http://www.tam-tam.co.jp/tipsnote/mobile/post1232.html)


# browserconfig.xml

Windows8のIE11のライブタイルで、ユーザーがサイトをピン留めするときに自動的に読み取られるファイル。

下記URLで画像とXMLファイル勝手に生成してくれる。
[Web サイトを Windows 8.1 のタイルにしよう - Web サイトをピン留めする](http://www.buildmypinnedsite.com/ja)

画像サイズが4つ分（128×128、270×270、270×558、558×558）必要なので、558×558以上でなおかつ高さ270でもトリミングしやすいファイルを用意する必要有。めんどい。

rssを設定すると、設定した画像が小さく表示され、タイトルが流れるようになるっぽい。

あと、まじめに検証したわけではないけど、
Basic認証かけていると確認できないやつかも。
（Basic認証がかかった開発環境では確認できなかったものの、本番では表示された経緯があるので。）

参考サイト：[browserconfig.xmlの作成方法](http://alc.netgamebm.com/p/187)
Mac OS X Mavericks にてWebサイト制作時にSafari5.0より前のブラウザテストを行う方法

https://browserling.com/queue?uri=http%3A%2F%2F&browser=safari&version=5.0.5

このサイトで可能。

他に実践している方法がある方はぜひともご教示ください。
JS+S3で簡易ロギング機能を実装してみる


JavaScriptメインでクライアント開発してると、利用者の操作とかのちょっとしたログを取りたいなぁと思ってもなかなか面倒です。

* ロギングのためだけにサーバを立てるのはしんどい
* リアルタイムにログを参照したいわけではない
* 統計的に把握できればよく、ログの完全性の保証は必要ない

といったような、ナンチャッテな機能で十分な場合は、S3を使った簡易ロギングが行けるのでは、と思い、実験。

大きな流れは以下の通りです。

* ロギングは、JavaScriptで$.ajax等を用いたGETリクエストを送信することで行う
	* データはGETリクエストに全て含める
* ログ飛ばし先のURLはS3 bucket URL
	* rewriteで特定ステータスコードを返す設定を行う
	* CORSの設定を行う
	* アクセスログを別bucketに残す設定を行う

## ロギング用、アクセスログ保管用のS3 bucket作成

2つbucketを作成します。1つはアクセスを受けてrewriteするための半ばダミーのもので、もう1つはS3へのアクセスログを保管するためのものです。

> S3へのアクセスログは定期的にAWSによりbucketの所定の位置に設置されますが、それ自体がS3へのHTTPアクセスになっています。ロギング用とログ保管用を同一にしてしまうと、ログ設置用のアクセスがロギング対象となり、無駄なログが増えてしまうため、2つに分けています。

* ロギング用 -> logging-sample
* ログ保管用 -> logging-sample-log

として進めます。

## bucket:logging-sampleの設定を行う

bucketのPropertiesを開き、以下の項目の設定を行います。

### Static Website Hosting

Website Hostingを有効にし、全てのリクエストに対して304を返すように設定します。

> 304にする理由は、responseデータが不要なためと、XMLHttpRequestがredirectして2度アクセスが発生しないようにするためです。

* 「Enable website hosting」にチェックします。
* 「Index Document」には、適当に「index.html」等を設定します。
* 「Edit Redirection Rules」で、以下の様なXMLを入力します。

```xml
<RoutingRules>
    <RoutingRule>
        <Condition>
            <KeyPrefixEquals>state/</KeyPrefixEquals>
        </Condition>
        <Redirect>
            <ReplaceKeyWith/>
            <HttpRedirectCode>304</HttpRedirectCode>
        </Redirect>
    </RoutingRule>
</RoutingRules>
```

これで、http(s)://logging-sample.s3-website-xxx.amazonaws.com/state/***** という任意のURLにアクセスした際に、304を返すようになります。

[HTTP Status Code:304についてはこちら](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5)

### Permissions

CORS（Cross-Origin Resource Sharing）は、ドメインを跨いだAJAXアクセスを行うための設定です。
ブラウザのJavaScriptからHTTPアクセスを行う場合、基本的にはSame-Origin Policyが働くため、外部のリソースにはアクセス出来ませんが、CORS設定を行うことでこれが可能になります。

> スマホアプリ等、ブラウザ以外からロギングを行う場合はこの設定は必要ありません。

「Permissions」の「Add CORS Configuration」をクリックし、以下のXMLを入力します。

```xml
<CORSConfiguration>
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
    </CORSRule>
</CORSConfiguration>
```
これで、任意のOriginからGETアクセス可能になります。
アクセス元のサイトが決まっている場合は、AllowedOriginを限定したほうが安全です。


### Logging

BucketのPropertiesで、

* Enabledにチェック
* Target Bucketに「logging-sample-log」を指定
* Target Prefixは空

とします。これで、アクセスログがbucket:logging-sample-logに蓄積されていきます。

## JavaScriptでログ用リクエストを送ってみる

後は、単にURLを生成して$.ajax等で送るだけです。

```javascript
$.ajax('http://logging-sample.s3-website-xxx.amazonaws.com/state/YOUR/LOGGING/PARAMS/HERE');
```

これで、1時間〜数時間後には、ログ保管用bucketにアクセスログが出力されます。
お手軽にロギングしたい場合には使えるかもしれません。


> IE8/9の場合、CORS対応するにはXDomainRequestを用いないといけないため、jQueryそのままでは厳しいです。
> 自力で実装するか、[ajaxHooks](https://github.com/jaubourg/ajaxHooks)のxdr.jsを使う等の対策が必要です。


## 注意点

[S3 Developer Guide:Server Access Logging](http://docs.aws.amazon.com/AmazonS3/latest/dev/ServerLogs.html)参照

S3のロギング機能はBest Effort方式です。

* 全てのアクセスログが記録される保証はない
* アクセスログが配置されるまでには数時間かかる可能性がある

という点を理解しておく必要があります。
通信帯域を調整できるgruntプラグインを紹介するよ


スマートフォン向けのサービスなどを開発しているとき、3G回線の様な低速な環境での振る舞いを確認しなければならないときがあります。
白ロムでWifiしか使えない場合や、パブリックなとこに置けないために実機での確認に一手間かけなければならないときもあると思います。

有名な方法としては[Charles](http://www.charlesproxy.com/)のようなローカルプロキシでスロットリングを行う方法があります。 
ただCharlesは有料なので開発している全員の環境に入れられるかと言えば少し難しいです。トライアルもありますが常用するには厳しいと思います。

もっと手軽にやりたい。。

## grunt-throttle

そこで登場するのがgrunt-throttle！

[tjgq / grunt-throttle](https://github.com/tjgq/grunt-throttle)

使い方も超簡単

### インストール

```
$ npm install grunt-throttle
```

### タスクを書く

```
throttle: {
  default: {
    remote_host: 'localhost',
    remote_port: 8000,
    local_port: 8001,
    upstream: 10 * 1024,
    downstream: 100 * 1024
  }
}
```

タスクを書いたらこんな感じで設定しといて

```
grunt.registerTask("default", ["connect", "throttle", "watch"]);
```

```
$ grunt
```

で実行してあげます。

これで8000番ポートで建ててる`localhost`のサーバの帯域をスロットリングしたやつを8001番ポートで建てれます。

`upstream`が10KB/s,`downstream`が100KB/sになります。

※ throttleのタスクを実行する時点でサーバが建っていなくても問題ないです

## 実行結果サンプル

試しにめちゃ重い画像を貼ったページの読み込み速度を見てみます。

### 通常

![スクリーンショット 2014-04-03 15.21.24.png](https://qiita-image-store.s3.amazonaws.com/0/17969/65f8ac84-d0d6-76bd-9d97-07f96c00f90a.png "スクリーンショット 2014-04-03 15.21.24.png")

10MBのページが1000msかからず表示されます。

### スロットルした方

![スクリーンショット 2014-04-03 15.21.50.png](https://qiita-image-store.s3.amazonaws.com/0/17969/10aa0e2f-e0ea-6aa4-31f8-beaf0187b8cc.png "スクリーンショット 2014-04-03 15.21.50.png")

しっかりスロットリングされて1.6minという結果。

## 複数の帯域を同時にシミュレートする

タスクを複数書けば同時にいくつものサーバを建てられます。

```
throttle: {
  server1: {
    remote_host: 'localhost',
    remote_port: 8000,
    local_port: 8001,
    upstream: 10 * 1024,
    downstream: 500 * 1024
  },
  server2: {
    remote_host: 'localhost',
    remote_port: 8000,
    local_port: 8002,
    upstream: 10 * 1024,
    downstream: 1000 * 1024
  }
}
```

段階ごとに回線速度を設定したものを用意しておけば色んな帯域での振る舞いがチェックしやすくなります。

## おわり

今回は時間計測のためにChromeで確認しましたが、スマホ実機だとリソース取得の同時接続数の上限などが異なるのでご注意ください。

※追記
gruntで建てたサーバじゃなくてもスロットリングできます。pythonのSimpleHTTPServerとか多分なんでもいけそう。

いやーめっちゃ便利。
Gsonでsnake_caseのjsonをcamelCaseのクラスで受け取る

```java:User.java
public class User {
    public int id;
    public int age;
    public String firstName;
    public String lastName;
}
```

```java
String json = "{id:3, age:30, first_name: 'hoge', last_name: 'fuga'}";
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
User user = gson.fromJson(json, User.class);
```
このSQLをリファクタリングしたい。


```sql
CREATE TABLE User (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(32)
);

CREATE TABLE Item (
    id INT NOT NULL PRIMARY KEY,
    userId INT,
    type TINYINT,
    name VARCHAR(32)
);

INSERT INTO User SET id=1, name="user1";
INSERT INTO User SET id=2, name="user2";
INSERT INTO User SET id=3, name="user3";
INSERT INTO User SET id=4, name="user4";
INSERT INTO User SET id=5, name="user5";

INSERT INTO Item SET id=1, userId=1, type=1, name="りんご";
INSERT INTO Item SET id=2, userId=1, type=2, name="白菜";
INSERT INTO Item SET id=3, userId=2, type=2, name="ホウレンソウ";
INSERT INTO Item SET id=4, userId=2, type=3, name="牛肉";
INSERT INTO Item SET id=5, userId=3, type=1, name="バナナ";
INSERT INTO Item SET id=6, userId=4, type=3, name="ソーセージ";
```

こんなデータがあったとして、Item.type=1以外のItemを持っているUser一覧(user2, user4)を取得したい。

```sql
SELECT User.* FROM Item
LEFT JOIN User ON Item.userId=User.id
WHERE User.id NOT IN (
	SELECT User.id FROM Item
	LEFT JOIN User ON Item.userId=User.id
	WHERE Item.type=1
)
GROUP BY User.id;
```

```
+------+-------+
| id   | name  |
+------+-------+
|    2 | user2 |
|    4 | user4 |
+------+-------+
```


もうちょっとシンプルにならないものか？？
OpenStack初心者でもVagrantを使ってOpenStackを体験する方法


何となくOpenStackに興味が湧いたので自分でいじってみたいなと思い、色々ググりながら自前で環境構築しようとした結果、「OpenStackのインストール難しすぎ！(というか面倒！)」という状態になりました。

[DevStack](http://devstack.org/)とかを使えば簡単に用意できるみたいな記事がちらほらあったので試してみたのですが、localrcというファイルの設定の仕方をミスしていたためか上手く動かなくて挫折していたところ、先人がVagrantを使ってDevStack環境(Havana)をUbuntu12.04LTSで動かせるようにしたリポジトリをgithubに見つけたので紹介します。

- https://github.com/TelekomLabs/vagrant-devstack

上記のリポジトリを使えば簡単にOpenStackをVirtualbox(VMware Fusionでもいいらしい)の中に用意できてこんな感じでOpenStackを体験できます。

![ログイン_-_OpenStack_Dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/13150/f41a13cc-6e4c-0382-e65e-20c78db2683b.png "ログイン_-_OpenStack_Dashboard.png")

![使用状況_-_OpenStack_Dashboard_と_vagrant-devstack_—_vagrant_precise64____devstack_—_bash_—_132×40_と_Timeline.png](https://qiita-image-store.s3.amazonaws.com/0/13150/cc7fe1bd-515b-4cc3-56c0-efeca9b9e192.png "使用状況_-_OpenStack_Dashboard_と_vagrant-devstack_—_vagrant_precise64____devstack_—_bash_—_132×40_と_Timeline.png")

詳しくは上記リポジトリのREADMEを見て貰えれば分かるかと。

READMEに書いてある必要要件(Requirements)には古めのVagrantのバージョン(1.3.5)が書いてありますが以下のバージョンでもちゃんと動いたので大丈夫だと思います。

- Virtualbox 4.3.6
- Vagrant 1.5.0

あと、コツというかVagrant1.5以上なら[Vagrant Cloud](https://vagrantcloud.com/)を利用できるはずなので、Vagrantfileの中を以下のように書き換えるとhashicorp社が用意しているUbuntu 12.04LTSのboxを入れられます。他でも使い回しが聞くboxを入れるという意味でもおすすめかと思います。

```Vagrantfile
  config.vm.box = "hashicorp/precise64"

  # 下のconfig.vm.box_urlは特に使わなくても平気なのでコメントアウトするか削除する
  # config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/precise/current/precise-server-cloudimg-amd64-vagrant-disk1.box"
end
```

あとメモリを多く確保しておいた方がおすすめだとREADMEに書いてあるので、確保するメモリの数値も書き換えた方がいいと思います。

```Vagrantfile
p.customize ["modifyvm", :id, "--memory", "2048"]
```

後はREADMEに書いてあるように`vagrant up`して色々インストールとか処理が終わったら(初期値の場合)`192.168.50.10`にアクセスすればOpenStackのログイン画面が出てきます。

OpenStackを動かしたり止めたりする方法はDevStack関連の情報を探して見てください。基本的には`vagrant ssh`で接続した後`devstack`フォルダ下にある`stack.sh`を使うと起動、`unstack.sh`を使うと停止です。

OpenStackのことを全く分からないで書いているので「ここ間違っている」とか「こうした方がもっと楽にDevStack環境用意できるよ！」というコメントがあったら歓迎です！
Winのコマンドプロンプトのコマンド（備忘録）

UNIXコマンドに慣れていたので、windowsのコマンドプロンプトのコマンドにまったく慣れていませんので備忘録として残してます。

ディレクトリ一覧を表示
ls -> dir

空ファイルの作成
touch -> type null > (filename)

※随時更新
Slimフレームワークのルート定義とアクションの外部化

<?php
	//ライブラリの読み込み
	require '../vendor/autoload.php';
	//Slimの初期化
	$app = new\Slim\Slim([]);
	//Slimにルートを登録
	$app -> get('/',function(){
		echo "Hello! World!";
	});
	//実行
	$app -> run();
?

function(){...}の部分はルートが呼び出されたときに実行される。
シェル・スクリプトで日付を加算しながら何か処理をする

例えば、オプションに日付を指定して起動するバッチで使える。

```bash:サンプルスクリプト
#!/bin/bash
START_DATE="20140101"
END_DATE="20140403"

for (( DATE=${START_DATE} ; ${DATE} < ${END_DATE} ; DATE=`date -d "${DATE} 1 day" '+%Y%m%d'` )) ; do
  echo ${DATE}
done
```
FragmentManager#executePendingTransactions() が怖くて使えないあなたへ

`Fragment`を取り扱っていると必ず出てくるのが、`FragmentManager`と`FragmentTransaction`です。

`FragmentManager`は、1 個の`Activity `につき 1 個の`FragmentManager`が居て、`Activity`のライフサイクルの巡りが尽きて死ぬまでの間、その`Activity`での`Fragment`のライフサイクル管理をしてくれます。

`Fragment`の取り扱い方としては、レイアウトに埋め込んで静的に動作させるやり方と、`Activity`が動的に`Fragment`のインスタンスを生成してレイアウトにアタッチするやり方があり、特に後者の動的にアタッチするやり方を採用した時に、`FragmentTransaction`を用いて`Fragment`のレイアウトに対する各種の操作を実行します。

さて、`FragmentTransaction`を使って動的にアタッチしようとすると、たまに以下の様な事象に出くわすことが有ります。

```
イベントのコールバック中に FragmentManager#findFragmentByTag() でアタッチした Fragment を取得しようとしたら、 FragmentTransaction#commit() したはずなのに null が返ってきた

```

`FragmentTransaction#commit()`が、即座に`Fragment`をレイアウトに反映するわけではない、ということは、Android Developers にも記載があります。

> Schedules a commit of this transaction. The commit does not happen immediately; it will be scheduled as work on the main thread to be done the next time that thread is ready.

トランザクションのコミットをスケジューリングするよ、ということなので、`commit()`メソッドが同期的に`Fragment`をアタッチするわけではない、というわけです。もう少し掘り下げると、できるだけ早く、メインスレッドが有効になってから、`commit()`された内容を実行できるように、`Handler`にメッセージを投げてスケジューリングする、という事になります。

このような状況の回避策としてあげられるのが、`FragmentManager#executePendingTransactions()`です。

このメソッドの実体は[このあたり](https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/FragmentManager.java#L1417)にあります。

ざっくりとまとめると、`FragmentTransaction#commit()`によってキューに積まれたジョブを同期的に実行し、`Fragment`のアタッチ等をその場で実行してくれる、ということをします。

ということは、メインスレッドが有効になってからできるだけ早く実行されるとはいえ、メッセージキューに積まれたメッセージの数に依存して、実際の実行されるタイミングのスケジュールが決まるということになります。

つまり、`FragmentTransaction`によるメッセージ以外に何らかのメッセージがたまった状態だと、`FragmentTransaction`による操作が実行される前に他のメッセージが処理される事になり、そのメッセージの中で`FragmentManager#findFragmentByTag()`等をすると、まだ`Fragment`がアタッチされていないので`null`が返る、ということになります。

ありがちなのは、非同期処理のコールバックでプログラスを表示する`Fragment`を非表示にしようとしたとき、プログレスを表示する`Fragment`がアタッチされるよりも前に非同期処理が終わってしまい、先にメッセージキューに積まれてしまう、という状況です。
そのような状況にならないよう、`FragmentManager#executePendingTransactions()`を使って、先に`Fragment`をアタッチしてから非同期処理を開始するように強制する、ということです。

もちろん、`Fragment`をアタッチする操作が先になるよう強制されるので、アタッチされたことを受けて何らかの振る舞いをするような場合には、注意が必要です。これはドキュメントにも記載されています。

>  Note that all callbacks and other related behavior will be done from within this call, so be careful about where this is called from.

もう、これで`FragmentManager#executePendingTransactions()`は怖くない！
メモ：操作の記録


```
qa
```

で記録開始。
操作ウィンドウに「recording」※日本語表記だと記録中
と表示される。

ここから記録したい操作を行う。

```
q
```

で記録終了。

```
@a
```

で記録した操作が再現される。

---

※ `a` は任意の識別用文字なので何でも良い。

## 応用

```
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
```

といった列を作りたい場合

`i` `1.` `esc` `qa` `yy` `p` `ctrl + a` `q` `8@a`

上記タイプで出来る。

---

※ 説明

`i (インサートモード)` `1. (テキスト入力)` `esc (インサートモード終了)` `qa (操作記録開始)` `yy (行ヤンク)` `p (ペースト)` `ctrl + a (インクリメント)` `q (操作記録完了)` `8@a (8回操作繰り返し)`
Windows環境下でのComposerの導入

1,phpの導入

◇XAMPPの導入

http://www.appachefriends.org/douwnload.html
->win環境下では、C:\XAMPP\php\php.exeとしてインストールされるので￥、コマンドプロンプト上でアクセスする場合は、Userディレクトリ以下でアクセスする。
ちなみに、XAMPPをインストールした際に、XAMPPのコントロールパネル「XAMPP　Control Panel」を使い、ダッシュボード上のShellを起動すると、\Xamppディレクトリにすでにある状態でコマンドプロンプトを動かすことができる。

◇php.iniの編集
ファイルを検索でphp.iniを検索→エディタでphp.iniを開く。

date.timezone = Asia/Tokyo
mbstring.internal_encoding = UTF-8

を記入する。
（どこでもいいが、わかりやすく自分は一番下に記述しました）

◇環境変数PATHの追加
参考：http://github.com/uzulla/how_to_setting_path_on_windows

setxコマンドを使ってコマンドラインプロントから検出。

※仮想マシン以下での設定に関してはまた書く。

2,Composerの導入

Composerとは？
PHPのライブラリをインストールするためのツール。みたいな理解。

参考：http://getcomposer.org/

作業する、プロダクト作成に使うディレクトリのトップディレクトリで
php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));"

でcomposer.pharをインストールする。
これはcomposer経由でライブラリをインストールする際に必要なファイル。

◇定義ファイルcomposer.jsonを作成する。
ここにいろんなphpのライブラリ、フレームワークのversionの情報を書き込む。

ちなみに、Slim、Twig、illuminate/Eloquentを導入する際は

{
	"require":{
		"slim/slim":"2.*",
		"slim/views":"0.1.*",
		"slim/extras":"2.0.*",
		"twig/twig":"1.*",
		"illuminate/database":"4.0.*",
		"Respect/Validation":"0.5.*"
	},
	"autoload":{
		"psr-0":{"":"lib/"}
	}
}

と書きました。

この後
php　composer.phar update
と入力すると、入力したフレームワーク、テンプレートエンジンがプロダクトのディレクトリに入ります。
vendorというディレクトリができます。

これでComposerを導入し、phpのライブラリを入れる仕組みは一通り完成。
のはず。。。（笑）
こんな感じでどうでしょう


```ruby:Vagrantfile
Vagrant.require_version ">= 1.5.0"

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"

  # Attach the current directory for Packer and Ansible
  config.vm.synced_folder ".", "/vagrant"

  # Install Packer
  config.vm.provision :shell, :inline => <<-PREPARE
    apt-get -y update
    apt-get install -y wget unzip curl

    mkdir -p /home/vagrant/packer
    cd /home/vagrant/packer
    if [ ! -e 0.5.2_linux_amd64.zip ]; then
      wget https://dl.bintray.com/mitchellh/packer/0.5.2_linux_amd64.zip
      unzip 0.5.2_linux_amd64.zip
      echo "export PATH=$PATH:/home/vagrant/packer" > /home/vagrant/.bashrc
    fi
  PREPARE

  # Use Docker provisioner to install Docker
  config.vm.provision :docker do |d|
    d.pull_images "ubuntu:13.10"
  end

  # Run Packer
  config.vm.provision :shell, :inline => <<-PACKER
    cd /vagrant
    packer build template.json
  PACKER

  # Check results
  config.vm.provision :shell, :inline => <<-RESULTS
    docker images

    docker run hexa/ubuntu/base:0.1 /opt/python/2.7.6/bin/python -V

    docker run hexa/ubuntu/base:0.1 /opt/ruby/2.1.1/bin/ruby -v
  RESULTS
end
```
Sublime Text のビルド機能で複数のコマンドを実行する

自分用メモ。
うろ覚えなので注意。
間違ってたらご指摘下さい。

Sublime Text 2 で、ビルドコマンドを設定するときに複数のコマンドを入れたい場合。
リストとかで書けたらいいのに。

Windowsは「&」
Macは「;」とか「|」で繋げて書けば良かった気がする。
もともと、複数のコマンドを1行で書く手法。

Pythonで virtualenv 使ったりするときにいいかも？

バッチを作って、それを呼び出したり、antとかを読んだりするのもいいかも。

あと、Windowsだとvirtualenv使ったりサーバー起動したりするとパイプ繋がらないとかで帰って来なくなるかもしれないので注意。
そうなったら、再起動とかタスクマネージャーでプロセスを終了させる。
nvmの導入と使い方

nvm
------
node.jsのバージョン変更を容易にするツール。


導入
----------

# インストール
gitからホームディレクトリにnvmをclone

```bash
$ git clone git://github.com/creationix/nvm.git ~/.nvm
```

# nvmコマンドを使えるように
ホームディレクトリの.bash_profileに以下の内容を記述し、ターミナルを再起動する。

```bash
# nvm
if [[ -s /Users/ホームディレクトリ/.nvm/nvm.sh ]] ; then source /Users/ホームディレクトリ/.nvm/nvm.sh ; fi
```

使えるようになった。

```bash
$ nvm --version
$ nvm v0.4.0
```

# node.jsをインストール

インストール可能なバージョンは`nvm ls-remote`コマンドで確認できる。

```bash
$ nvm ls-remote
# インストール可能なnode.jsのバージョン一覧
```

`nvm install`でインストールする。

```bash
$ nvm install v0.11.12
$ node -v
v0.11.12
```

# バージョンを変更

`nvm ls`でインストールしたバージョン一覧を表示。
この中にあるバージョンから選んで変更できる。

```bash
$ nvm ls
->  v0.10.26
    v0.11.12
```

`nvm use`でバージョンを変更する。

```bash
$ nvm use v0.11.12
Now using node v0.11.12
```

参考サイト:
http://creator.cotapon.org/articles/node-js/%E3%80%90node-js%E3%80%91nvm%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E3%81%AE%E6%96%B9%E6%B3%95
[SincStitch]Cruise Control System

[Concurrency](http://www.amazon.co.jp/dp/0470093552)
Chapter 8:Model-Based Design
より。

自動車のCruise Control Systemのモデル。
LTSAでは、
`set DisableActions = {off,brake,accelerator}`としたうえで、
モデル内で`DisableActions -> INACTIVE`とできる。
SyncStitchではどうやるんだろ。
とりあえず地道に展開した。

```scm:Definitions
(define-event engineOn)
(define-event engineOff)
(define-event on)
(define-event off)
(define-event resume)
(define-event brake)
(define-event accelerator)

(define-event speed)
(define-event enableControl)
(define-event disableControl)
(define-event clearSpeed)
(define-event recordSpeed)
(define-event setThrottle)

(define-event zoom)
```

```scm:INPUTSPEED
(define-process INPUTSPEED
  (! engineOn CHECKSPEED))

(define-process CHECKSPEED
  (alt
	(! speed CHECKSPEED)
	(! engineOff INPUTSPEED)))
```

```scm:SPEEDCONTROL
(define-process DISABLED
  (alt
	(! speed DISABLED)
	(! clearSpeed DISABLED)
	(! recordSpeed DISABLED)
	(! enableControl ENABLED)))

(define-process ENABLED
  (alt
	(! speed (! setThrottle ENABLED))
	(! recordSpeed ENABLED)
	(! enableControl ENABLED)
	(! disableControl DISABLED)))
```

```scm:CRUISECONTROLLER
(define-process INACTIVE
  (alt
	(! engineOn (! clearSpeed ACTIVE))
	(! off INACTIVE)
	(! brake INACTIVE)
	(! accelerator INACTIVE)))

(define-process ACTIVE
  (alt
	(! engineOff INACTIVE)
	(! on (! recordSpeed (! enableControl CRUISING)))
	(! off ACTIVE)
	(! brake ACTIVE)
	(! accelerator ACTIVE)))

(define-process CRUISING
  (alt
	(! engineOff INACTIVE)
	(! off (! disableControl STANDBY))
	(! brake (! disableControl STANDBY))
	(! accelerator (! disableControl STANDBY))
	(! on (! recordSpeed (! enableControl CRUISING)))))

(define-process STANDBY
  (alt
	(! engineOff INACTIVE)
	(! resume (! enableControl CRUISING))
	(! on (! recordSpeed (! enableControl CRUISING)))
	(! off STANDBY)
	(! brake STANDBY)
	(! accelerator STANDBY)))
```

これを合成することで、まずい動作を発見するぞ。
国際化、リソースの翻訳にtransifexを使う


#概要#
えー、GitHubにホスティングされているAndroid OpenPGP実装[OpenKeychain](https://github.com/openpgp-keychain/openpgp-keychain)ですが、リソースの翻訳に、[transifex](https://www.transifex.com/projects/p/openpgp-keychain/)というサービスを利用しています。

で、本来なら、手順を説明すべきところですが...私個人は翻訳参加であって、リポジトリとの連携設定とかよくわからんのです(´・ω・`)
ので、一言

#結論#
**翻訳、翻訳結果レビューに参加してくんろー。**
WPF ViewModel から Viewへの通知

WPFでは、ViewからViewModelへの通知を行う機能としてICommandインターフェイスを提供してくれていますが、
ViewModelからViewへの通知を行うための仕組みは用意されていません。

しかし、Windowをクローズしたいとか、ViewModelからViewへ通知を行いたいというケースは多いです。

## イベント（デリゲート）を利用する。

WPFにはViewModelからViewへ通知する特別な機能はありませんが、View は DataContext 経由で ViewModel への参照を
保持しているので、普通に ViewModel のパブリックなプロパティやメソッド、イベント、デレゲートにアクセスすることが
できます。ViewModelからViewへの通知はViewModelにイベント（デリゲート）を設定することで行えます。特別な機能は
必要ないということですね。

サンプルとしてViewModel から Viewをクローズするコードを示します。

## ViewModelからViewにWindowをクローズするよう通知するサンプル

```csharp:ViewModel.cs 
class ViewModel : ViewModelBase
{
    // イベント
    public event EventHandler<EventArgs> CloseView;
  
    // コマンド
    public ICommand CloseCommand { get; private set; }

    // コンストラクタ
    public ViewModel()
    {
        CloseCommand = CreateCommand(v => 
            { 
                if (CloseView != null) 
                    CloseView(this, EventArgs.Empty); 
            });
    }
}
```

```csharp:MainWindow.xaml.cs
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataContextChanged += (o, e) =>
            {
                ViewModel vm = DataContext as ViewModel;
                if (vm != null)
                {
                    vm.CloseView += (sender, arg) => { Close(); };
                }
            };

        DataContext = new ViewModel();
    }
}
```

```xml:MainWindow.xaml
<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTest"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="閉じる" FontSize="14" Padding="20,10,20,10" VerticalAlignment="Center" HorizontalAlignment="Center" Command="{Binding CloseCommand}" />
    </Grid>
</Window>
```
iPhone Safari のキャッシュが鬱陶しい時の超簡単なクリア方法

## 陥りやすい状況
- デバッグ時や制作途中のコンテンツ確認時
 - キャッシュが強すぎてクリアが面倒くさい。

## 解決策
**プライベートブラウズ機能をON** にして閲覧。

![写真 2014-04-03 12 51 34.png](https://qiita-image-store.s3.amazonaws.com/0/35733/8cd55718-6d98-cb69-c6fe-e794e5da64f4.png)
JenkinsでiOS Enterprise配布用のビルドを作成しても実機にInstallするときに失敗してハマった話


状況
====

JenkinsでEnterprise配布をしようとしていたのですが、iOS実機にDowlonadしてInstallする直前に「失敗しました」みたいなメッセージが表示されてハマっていました。
ただ、全く同じDIRでXCodeでArchiveすると成功します。

何がいけないんだ！と1日くらいハマってました。

ログを見てみると
-------------

実機のログを眺めていると「署名のVerificationに失敗した」というようなメッセージが出ています。

Jenkinsログを見ると以下の部分が怪しそうです。

```text:jenkins_log
### Checking original app
+ /usr/bin/codesign --verify -vvvv /Users/yumemi_builder/jenkins/workspace/AprilBeacon_BuildiOS/build/AprilBeacon.app
Program /usr/bin/codesign returned 1 : [/Users/yumemi_builder/jenkins/workspace/AprilBeacon_BuildiOS/build/AprilBeacon.app: a sealed resource is missing or invalid
In architecture: armv7
resource modified: /Users/yumemi_builder/jenkins/workspace/AprilBeacon_BuildiOS/build/AprilBeacon.app/Assets.car
]
Codesign check fails : /Users/yumemi_builder/jenkins/workspace/AprilBeacon_BuildiOS/build/AprilBeacon.app: a sealed resource is missing or invalid
In architecture: armv7
resource modified: /Users/yumemi_builder/jenkins/workspace/AprilBeacon_BuildiOS/build/AprilBeacon.app/Assets.car
```

まあしかし、ググってもよくわかりません。

解決方法
====

原因は、Jenkins側の設定でした。（バグのようなものだとは思いますが）。

`Xcode` -> `General build settings` -> `Generate Archive?` というcheckボックスがありますが、
これを **外す** と上記のログも出ないようになり、また、実機へのInstallも成功しました。

![AprilBeacon_BuildiOS_Config__Jenkins_.png](https://qiita-image-store.s3.amazonaws.com/0/11124/d6e36754-d9be-775c-567d-d74973e49986.png "AprilBeacon_BuildiOS_Config__Jenkins_.png")


なんとなく必要かなーと思うじゃないですか… orz


Version
======

各Versionは以下のものです。

* Jenkins: 1.5.22
* XCode Integration Plugin: 1.4.2
rbenvの導入と使い方

rbenv
--------
rubyのバージョンを使い分けることが出来る。

ruby-build 
------
rbenvのプラグイン。`rbenv install`コマンドを提供する。

導入とglobalへのrubyのインストール
--------
qiitaのこの投稿に書かれている通り。
http://qiita.com/s-yamaz@github/items/b38b330b44f517f3c77c

この投稿時のrubyは2.1.1が最新バージョン。

```bash
$ rbenv global 2.1.1
```

localへのrubyのインストール
----------
参考サイト:
http://blog.axross.org/entry/2013/12/19/221625

localで使うバージョンを、あらかじめrbenvでインストールしておく必要がある。

```bash
$ rbenv install 1.9.3-p484
```

`local`コマンドでカレントディレクトリ内でのrubyのバージョンを決める。

```bash
$ ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
$ rbenv local 1.9.3-p484
$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-darwin13.1.0]

```
Mac OS X Mavericks にてメッセージセンターに忘れそうな予定を表示させてみた。by node.js + CoffeeScript

ターミナルから通知センターへメッセージ送信が可能というのを知り。
今日中に行いたいが忘れそうな予定を定期的に実行させるようにしました。

１行のコマンドなのでcronを使う方がシンプルではあるのですが、child_processを使った事がない為、試しに作成しました。

```coffee:coffee
exec = require("child_process").exec

pushMsg = ->
  title = '定期連絡'
  message = '本日中に稼働実績を提出'
  #実行コマンド作成
  cmd = "echo 'display notification \"#{message}\" with title \"#{title}\" '| osascript"
  exec cmd, (err, stdout, stderr) ->
    console.log 'ok'

#起動時の１回
pushMsg()

#定期的に実行する
setInterval pushMsg , 1800000
```

![message.png](https://qiita-image-store.s3.amazonaws.com/0/28820/0e37f92f-5383-e440-2d0b-e6d62302ba59.png)

あとはこれをforeverか何かで起動させておけば完了です。
(ターミナルにそのままは邪魔なので...)



もっと忘れない方法を教えてください！！
Vagrantを使ってみる(Mac Mavericks)


## Vagrantインストール
公式サイトからDLして、インストール
[http://www.vagrantup.com/downloads.html](http://www.vagrantup.com/downloads.html 'Vagrant')

## VirtualBoxインストール
公式サイトからVirtualBox 4.3.10 for OS X hostsをDLして、インストール
[https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads 'VirtualBox')

## 使い方

参照元と同じように`vagrant box add`でBox追加して、`vagrant up`すると以下のようなエラーが起こった。

```
You specified a box version constraint with a direct box file
path. Box version constraints only work with boxes from Vagrant
Cloud or a custom box host. Please remove the version constraint
and try again.
```

[Vagrant Cloud Discover](https://vagrantcloud.com/discover/featured 'Vagrant cloud')ってのがあって、そこにあるBoxを使えばいいみたい。
便利！
今回は`chef/centos-6.5`を利用させてもらう。

```
$ mkdir -p ~/Vagrant/CnetOS65
$ cd ~/Vagrant/CnetOS65
$ vagrant init chef/centos-6.5  # Vagrantfileが作成される
$ vagrant up # VirtualBoxが起動！

$ vagrant ssh # 仮想環境に接続
```


##参照
* [Vagrant セットアップ (Mac)](http://qiita.com/inouet/items/b36638adc2b5772db457 'Vagrant セットアップ (Mac)')
nagios.logのtai64nlocale変換


nagios.logは以下のように、ログの時刻formatがtai64nlocaleになってる。
通常は`tail64nlocale`コマンドを通せば整形されるが、[]で囲まれてるので正常に変換されない。

```shell:nagios.log
[1396426834] Caught SIGHUP, restarting...
[1396426834] Nagios 3.2.0 starting... (PID=8813)
[1396426834] Local time is Wed Apr 02 17:20:34 JST 2014
[1396426834] LOG VERSION: 2.0
```

なのでperlワンライナーを以下の通りにやって日付を表示させると良い

```shell:nagios.log
perl -pe 's/(\d+)/localtime($1)/e' nagios.log

[Wed Apr  2 17:20:34 2014] Caught SIGHUP, restarting...
[Wed Apr  2 17:20:34 2014] Nagios 3.2.0 starting... (PID=8813)
[Wed Apr  2 17:20:34 2014] Local time is Wed Apr 02 17:20:34 JST 2014
[Wed Apr  2 17:20:34 2014] LOG VERSION: 2.0
```
UIGestureRecognizer と UIButton メモ

## 参考

http://studio.tgl.jp/blog/?p=1840
http://qiita.com/AKIHIRO_ciil/items/efb37f2aaa2136d7cca7

## 概要

UIGestureRecognizerとUIButton（など）を一緒に配置するとUIButtonが反応しない。
その場合、どうすればいいのか？

## 対応策

UIGestureRecognizerのcancelsTouchesInViewをNOにする。

```objec:header
@interface ViewController : UIViewController <UIGestureRecognizerDelegate>
```

```objc:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
    gesture.cancelsTouchesInView = NO; // この設定が必要
    gesture.delegate = self;
    [self.view addGestureRecognizer:gesture];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
     if(gestureRecognizer.view == touch.view){
          return YES;
     }else{
          return NO;
     }
}
```
Rspecでこれから生成されるインスタンスとか柔軟なstubをする方法

```rb

book.stub(:walk).and_return(true)
```

普通は上のように使うけど、テスト外とかこれから生成されるbookに対してstubしたい時がある。

`any_instance`を使うとこれから生成されるインスタンスに対してstubできる。

```rb

Human.any_instance.stub(:walk).and_return(true)
```

ちなみに`and_return`はブロックを渡せる。

```rb

Human.any_instance.stub(:walk).and_return do
  Lucky.create
end
```

さらに`with`を使って引数に対応させる。

```rb

Human.any_instance.stub(:walk).with(user, "メッセージ").and_return do
  Lucky.where(user: user.id, message: "メッセージ").create
end
```

引数ごとに定義していくのは大変なので、どうでもいいとこは`anything`が使える。

```rb

Human.any_instance.stub(:walk).with(user, anything).and_return do
  Lucky.where(user: user.id, message: "メッセージ").create
end
```

便利。
node.jsをインストールする

## 環境
- Scientific Linux 6.5
- Mac OSX 10.7, 10.9

## 前準備（Scientific Linux）
ビルドに必要なパッケージをインストールします。
飛ばして、エラーが出てきたら実行するでもいいかも。

    sudo yum install gcc-c++

## nodebrewを使ってnode.jsをインストール
1. nodebrewのインストール

        curl -L git.io/nodebrew | perl - setup

2. .zshenv/.zshrc/.bashrcにPATH設定を追加

        export PATH=$HOME/.nodebrew/current/bin:$PATH

3. rc（もしくはenv）ファイルの再読み込み

        . ~/.zshrc
4. nodeのインストール

        nodebrew install-binary v0.10.26
    - `nodebrew help` でhelpが見れます。
    - `nodebrew ls-remote` でインストール出来るバージョンの一覧を確認できます。
    - `nodebrew install VERSION` を使うとソースからビルドします。
    - `nodebrew install latest`で最新版をインストールすることができるのですが、node.jsはマイナーバージョンが偶数だと安定版なので、偶数を入れるのがオススメです。

5. 使用するnodeのを指定

        nodebrew use v0.11.12

     ※ 指定できるバージョンは`nodebrew list`で確認できます。

6. 確認

        node -v

## 参考
- [nodebrew](https://github.com/hokaccha/nodebrew)
開発者のGitワークフロー例

## 環境
    BTS : redmine   
    SCM：Git & GitLab
        統合ブランチ: develop
        トピックブランチ: iss-XXXX
    IDE： Eclipse
    Build：Gradle

## 前提条件
* [Gitをインストールしたらやること](http://qiita.com/yusukaaay/items/ea382aca58c084ea1d00) やっておく

## 修正前作業
1.  redmineのステータスを _inProgress_ に変更

1.  ローカルのdevelpの最新化
    `$ git co develop` # developブランチに切り替え
    `$ git br` # ちゃんと移動したか確認
    `$ git fetch origin` # リモートからデータ取得
    `$ git lg` # ログ確認
    `$ git rebase origin/develop` # マージ

1. トピックブランチをローカルに作成
    `$ git co -b [other_branch] [origin/other_branch]`
    例) `$ git co -b iss-1234 origin/develop`

1. eclipseクラスパスを作り直す場合
    `$ gradle cleanEclipseClasspath eclipseClasspath`

1.  修正着手前にテストスイートを実行し、ALLGreenであることを確認

## 修正
1. 修正作業を行う

1. 単体テスト

1. 動作確認

1. デグレ確認のためテストスイートを実行し、ALLGreenであることを確認

## コミット
1. コミットする前にrebase
   ` $ git fetch origin`
   ` $ git rebase origin/develop`
   ` $ git lg`

    コンフリクトした場合、
    解決後、 `$ git add` する
    その後は普通にコミット可能

1. ステージ
   ` $ git add {ファイル}`  ※ *.javaとか

1. 差分確認
    * ワークツリーとインデックスの差分  
    `$ git diff`  
    ファイル名だけ出したい場合は --name-only オプションを付ける  
    例）`$ git diff --name-only`
    * インデックスと HEAD の差分（次にコミットする差分）  
    `$ git diff --cached`
    * ワークツリーとHEADの差分  
    `$ git diff HEAD`

1. コミット
   ` $ git commit`
    L1  redmine #1234 {対応内容}
    {対応内容詳細}

## プッシュ
1.  リモートブランチにPUSH
    `$ git push ＜リモート送信先リポジトリ＞ ＜ローカル送信元ブランチ＞:＜リモート送信先ブランチ＞`
    `$ git push origin iss-1234:iss-1234`  
    ※ 強制プッシュは -f 付ける

## 修正後作業
1.  GitLabにアクセス

1.  マージリクエスト出す。
    Assign to は適宜
    Title ：{対応内容題名} 対応
    \#1234 {対応詳細}

1.  redmineのステータスを _Review_ に変更、進捗を100%に変更

        {コメント}

        マージリクエスト
        {マージリクエストURL}

## 以上
git 困ったときまとめ。よく出る。（執筆中）

## Github上のコミットを戻す方法

```git
$ git reset --hard HEAD^
```
これだと、ローカルのコミットしか戻せない。

```
$ git push -f origin HEAD^:master
$ git push -f origin HEAD^:develop　
```

このようにすればいいけど、要注意。
###安全な方法
 - GitHubのremoteを変える（git push -f origin `HEAD^`:master） 
 - 間違えたら、ローカルをプッシュ（git push origin master）
 - 大丈夫なら、ローカルも変更（git reset --hard `HEAD^`）
※Githubとローカルのmasterが同じ状態なら、`HEAD^`は同じであるはず。



##git pullでmaster以外のbranchをローカルに持ってきたい場合。
```git
$ git checkout -b new-branch origin/remote-branch
```
※git pull は現在のブランチにマージされる
remote-branchの確認方法は、

```git 
$ git branch -a
```

  
##git ignroe したのにもかかわらず、以下のエラーでてbranchを変えられない場合

```git
$ git co .
```
co = checkout


##git merge で dry-runしたい

```
$git merge --no-commit --no-ff develop
```

結果を確認した後、

```
$git reset --hard HEAD
```

##remote branchをローカルから消す方法

```git
$git branch -d old-branch

$git push origin :old-branch
```
このコロンの正体がわかった。。
参考：[今さら聞けないgit pushコマンド](http://shoma2da.hatenablog.com/entry/2014/03/08/234523)


##git branch -aしたときに、消したはずのリモートのブランチが残っている場合

```git
git remote prune origin
```
で解決
参考:[Gitでリモートブランチを消してもgit branch -aに出てくる件](http://chulip.org/entry/20120516/1337132494)
xmlをコマンドラインで再フォーマット


`xmllint`の`--format`オプションを使う。

カレント配下を一括でやるなら

```
find . -name '*.xml' | sed 's@.*@xmllint --format & > &.new \&\& mv &.new &@' | sh
```
など


### 参考
[unix - How to pretty print XML from the command line? - Stack Overflow](http://stackoverflow.com/questions/16090869/how-to-pretty-print-xml-from-the-command-line)
社会調査の推定と検定

[昨日](http://qiita.com/ynakayama/items/344dbf562a66a2aa760e)は帰無仮説について触れましたが、今日は社会調査の結果を集計してから検定に進むまでの手順を整理しておきます。

## 標本をもとに母集団を調べる

たくさんある中からいくつかを取り出して調べるとき、その元の集団を **母集団 (population)** 、取り出したサンプルを **標本 (sample)** と言います。母集団におけるただひとつの値のことを **母数 (parameter)** といい、また母集団の統計量を **母平均 u** 、 **母分散 σ^2** 、 **母比率 π** などと言います。標本の統計量に基づいて母集団の特徴を推測する手続きには主に 2 通りあります。

| 手続き           |説明          |
|:---------------|:-----------|
| 推定  | 標本統計量から母数を区間推定し母集団の統計量を推定する |
| 検定  | 母数に対するある仮説を立てた上でその仮説が真であるかどうか標本統計量に基づいて判定する |

### 区間推定と信頼区間

母集団の平均や分散があらかじめ判明しているケースはまれです。むしろそれらを調べるために適当な量の標本を抽出しているのだから当たり前のことです。ただし母数が含まれる値の範囲を推定することは必要で、これは **区間推定 (interval estimation)** と言われます。必要な情報としては次のとおりです。

1. 標本平均、標本比率
2. 標準誤差の推定値
3. 標本が分布全体の何パーセントを含むか (= 推定の誤差をどの程度まで抑えるか)

このうち 3. は信頼度と言われ、これが高いほど精度の高い推定が可能になります。よく利用されるのは 95% の信頼度です。これは 5% 程度の誤差は許容するということで、統計学の世界でよく利用される信頼度です。

ある番組の視聴率が 20% 、調査した人数が 600 (N=600) 人だったとします。この場合、上記の 1. は 0.2 であり 2. は次式の通りで 0.0163 になります。

```math
\sqrt{ [0.2 × (1-0.2)] / 600 } = 0.0163
```

そして 3. の信頼度については[標準正規分布表](https://staff.aist.go.jp/t.ihara/normsdist.html)を参照します。信頼度を 95% と設定した上で標本平均 (比率) ± z 値 × 標準誤差 = 0.2 ± 1.96 × 0.0163 から 0.168 〜 0.232 となります。つまりは 16.8% から 23.2% の範囲ということです。

この例では正規分布を仮定しましたが、母数の推測は可能な限りかたよりを無くすことが大切で、そのために **無作為抽出 (random sampling)** などがよくおこなわれます。標本抽出に何らかの意図があれば当然のことながら推定や検定の結果もおかしくなりますので、その点に注意しましょう。

### 有意水準と棄却

**有意水準 (level of significance)** は帰無仮説を棄却するかどうかを判定するための基準です。たとえば統計学的によく利用される有意水準 5% というのは、真の帰無仮説が 20 回に 1 回誤って棄却されてしまう可能性を示します。統計学的に有意であるというのは、このように多少誤りの確率を含んでいることを忘れてはなりません。決して絶対的な基準ではないのです。

有意水準は α と表記され、社会調査においては α = 0.05 または α = 0.01 に設定するケースがほとんどです。

ある番組の視聴率が 20% を期待していたのに実際に調査結果を調べてみたら 15% だったとします。調査した人数は 600 (N=600) 人です。

このときに仮説をたててみましょう。[昨日の帰無仮説の話](http://qiita.com/ynakayama/items/344dbf562a66a2aa760e)を思い出してください。どういう帰無仮説をたてるか、ちょっと考えてみましょう。

| 仮説           |説明          |
|:---------------|:-----------|
| 帰無仮説  | 母集団における視聴率は 20% のはずだ (15% という調査結果はたまたま起こりうる) 
| 対立仮説  | 母集団における視聴率は 20% ではない |

測定誤差をこえる有意な差があるかどうかを調べればいいわけです。そう考えるとおのずと仮説を導き出すことができます。

帰無仮説をもとに標本分布を考えると N=600 のとき分布全体の信頼度 95% が含まれる範囲は 16.8 〜 23.2 % です。実際の視聴率は 15% だと言われてますから、帰無仮説のもとではこの視聴率 15% が発生する確率は有意水準 5% 未満であると推定されるわけです。ですから、発生確率が低いのは帰無仮説が誤っていると判断して帰無仮説を棄却します。そして対立仮説の通り「母集団における視聴率は 20% ではない」を採択するわけです。これが検定です。

## まとめ

今回は視聴率を例とした社会調査を前提として、推定と検定について整理してみました。もちろん社会調査以外の分野でも同じことです。応用範囲の広い基礎知識なのでしっかりおさえておくのが良いでしょう。

## 参考

社会統計学入門 (放送大学教材)
http://www.amazon.co.jp/dp/4595313705
[Ruby] 絶対パス間の相対パスを作る


自作する前に捜せば、大抵あるよということで。

```ruby
path_from = Pathname('/a/b/c')
path_to = Pathname('/a/b/c/d/e')
path_to.relative_path_from(path_from).to_s
#=> "d/e"
path_to = Pathname('/a/x/y')
path_to.relative_path_from(path_from).to_s
#=> "../../x/y"
```

使えるのはRuby 1.8.1から。
git pushでremote rejectedと怒られた時にやったことメモ

サーバー１→サーバー２→クライアント（Netbeans）とgit cloneして、サーバー２に対してgit pushしようとしたら以下のようなメッセージが。

そのときにやったことメモ

```
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To ssh://hoge@example.com/home/hoge/git/
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'ssh://hoge@example.com/home/hoge/git/'
```

・サーバー２側
リモートリポジトリの設定確認

```
$ git config --get-all core.bare
false
```

上記でfalseだったらtrueにする

```
$ git config --bool core.bare true
```

ノンベアとベアってなんだろうって感じだったんですが、どうやらこういうことらしい。

ノンベアリポジトリはワーキングディレクトリあり
ベアリポジトリはワーキングディレクトリなし。更新情報のみ保持。

ワーキングディレクトリは、ファイルそのものがあるディレクトリのこと。 

いい加減gitお勉強しないといけませんね。
ディレクトリ以下のある文字列を含むファイル検索を行う


この文字列がどこのファイルに書いてあるのかを知りたいときに便利です。*の部分は*.phpみたいな感じにすると、PHPファイルからの検索をしてくれます。

```bash:
$ find . -name "*" -print0 | xargs -0 grep -i 検索したい文字列
```
submoduleの削除

参考サイト:
http://takaaki-kasai-tech.blogspot.jp/2014/02/how-to-remove-git-submodule-using-each-version.html

submoduleの削除
---------
gitのバージョンが1.8.5以上なら以下の方法で出来る。

```bash
$ git submodule deinit <消したいsubmoduleへのパス>
$ git rm <消したいsubmoduleへのパス>
```
ネットワーク遅延をコマンド1発で再現する

通信回線が遅延している状況でしか起きないバグを再現させる時に便利だったコマンドです。

```bash
$ sudo tc qdisc add dev eth0 root netem delay 100ms
```

これで、eth0の通信が全て100ms遅延するようになります。

この設定を元に戻すには、以下のコマンドを実行します。

```bash
$ sudo tc qdisc del dev eth0 root
```

帯域制限を行うツールは色々ありますが、これはコマンド一発で設定できるのが便利です。
grepで特定のディレクトリを除外する

特定の文字列を検索したくて

```bash
grep -rn 'hoge' ./
```
ってする事ありますよね？

# 今まで

バージョン管理とかしていると、.svnや.gitの中のファイルまで結果に出てきたりして、欲しい情報が埋もれてしまって読めない。
そこで、-vを駆使したり、findの結果を引っ張ってきて色々してみたりという事をしていました。

* 参考
 * [grepするときに.svnファイルを除外する](http://d.hatena.ne.jp/midori_kasugano/20100915/1284518599)

# 久しぶりにググった

で、ふとググってみたら・・・
[grepで特定ディレクトリを除外して再起検索](http://d.hatena.ne.jp/iww/20110617/grep)
> ```bash
> grep -r --exclude-dir=kernel PASSWORD *
> ```
> --exclude-dirオプションはGNU grep 2.5.2から追加された

とあるじゃないですか！！
知らなかったー（＞_＜

# 結論

```bash
grep -rn 'hoge' ./ --exclude-dir=.git
```
便利ですね〜。
ところで、僕の環境だと、man grepにこのオプション無いんですけど、なんででしょ？
ディレクトリdiffでファイル名だけ表示


-qオプションを使う

```
       -q  --brief
              Output only whether files differ.
```


例)
ディレクトリ
4.1.2/libexec/conf と 4.2/libexec/conf
で差分があるファイルを調査したい。

```
-> % diff -r 4.1.2/libexec/conf 4.2/libexec/conf
48a49
> # - If you need to set the schema, please refer to http://jira.codehaus.org/browse/SONAR-5000
53,59d53
< # Uncomment the following property if the Oracle account has permissions to access multiple schemas,
< # for example sonar schemas with different versions. In that case, use the same property during project analysis
< # (-Dsonar.jdbc.schema=<schema>)
< # The schema is case-sensitive.
< #sonar.jdbc.schema=sonar
<
<
...
```

だと大量に差分が出るが`-q`オプション追加でファイル名のみ表示になる

```
-> % diff -qr 4.1.2/libexec/conf 4.2/libexec/conf
Files 4.1.2/libexec/conf/sonar.properties and 4.2/libexec/conf/sonar.properties differ
```


### 参考
[linux - diff to output only the file names - Stack Overflow](http://stackoverflow.com/questions/6217628/diff-to-output-only-the-file-names)
JSON を jq で確認しやすくする CSNJQFormatter

普段アプリを作っていたアプリが取得した JSON データを Console に出力させています。このままでは改行がなくなっていたりシンタックスハイライトもなくて見づらかったのでこんなものを作りました。

[griffin-stewie/CSNJQFormatter](https://github.com/griffin-stewie/CSNJQFormatter "griffin-stewie/CSNJQFormatter")

以下のような文字列を返すだけの単純なもので他に機能はありません。

    cat <<'END' | jq '.' 
    {"foo":"bar"}
    END

利用シーンとしては `NSLog` にこの文字列をくわせてやると、あとで Console に出力されている文字列を Terminal にコピペしてやる感じです。実装的にも単純に文字列連結させているだけです。

デバッグ用途で気が向いたら使ってみてください。
【SQL腕試し問題】現在の部署に所属する社員の一覧を取得するSQLを書いて下さい

## はじめに
結構よくあるパターンなので知っている人は知っていると思いますが、初めて見た人は「???」となりそうなSQLの問題です。
SQLの腕試し問題として出題してみますので、みなさん奮って答えを考えてみて下さい！！


## 要件
- 社員と所属履歴という二つのモデルがある。
- 社員は1件以上の所属履歴を持つ。
- 所属履歴にはその社員がこれまでに所属してきた部署の履歴が保存される。
- 所属履歴には開始日が設定されている。
- 所属履歴が複数ある場合、開始日が最新の履歴が現在の部署を表す。 
- **現在IT部門に所属している社員の一覧を取得するにはどうすれば良いか。**

## 例

### 社員テーブル(employees)
|id|name|
|:--|:--|
|1|John|
|2|Mary|
|3|Tom|

### 所属履歴テーブル(section_histories)
|id|employee_id|start_date|section_name}
|:--|:--|:--|:--|
|1|1|2013/01/01|Sales|
|2|2|2013/01/01|IT|
|3|3|2013/01/01|IT|
|4|1|2014/01/01|IT|
|5|2|2014/01/01|Sales|

**補足**

- John(employee_id: 1)の現在の部署はIT
- Mary(employee_id: 2)の現在の部署はSales
- Tom(employee_id: 3)の現在の部署はIT

### 期待する出力結果
|employee_id|name|section_name|start_date|
|:--|:--|:--|:--|
|1|John|IT|2014/01/01|
|3|Tom|IT|2013/01/01|

**補足**

- ソート順は`employee_id`とする

## 制約等
- 推奨RDBMSはPostgreSQL 9.2.4だが、それ以外のRDBMSでも可。


## スキーマ作成用のSQL

````sql
CREATE TABLE employees (
  id integer PRIMARY KEY
  ,name varchar(50)
);

INSERT INTO employees VALUES (1,'John');
INSERT INTO employees VALUES (2,'Mary');
INSERT INTO employees VALUES (3,'Tom');

CREATE TABLE section_histories (
  id integer PRIMARY KEY
  ,employee_id integer
  ,start_date date
  ,section_name varchar(50)
);

INSERT INTO section_histories VALUES (1,1,'2013/01/01', 'Sales');
INSERT INTO section_histories VALUES (2,2,'2013/01/01', 'IT');
INSERT INTO section_histories VALUES (3,3,'2013/01/01', 'IT');
INSERT INTO section_histories VALUES (4,1,'2014/01/01', 'IT');
INSERT INTO section_histories VALUES (5,2,'2014/01/01', 'Sales');
````

## 解答方法
- 実行方法は自由ですが、[SQL Fiddle](http://sqlfiddle.com/)を使うとお手軽かもしれません。
- SQLができたら[gist](https://gist.github.com/)や[SQL Fiddle](http://sqlfiddle.com/)のURLをこの記事のコメントに貼り付けて下さい。工夫した点やアピールポイントがあればご自由にどうぞ。

![Screen Shot 2014-01-24 at 5.58.31.png](https://qiita-image-store.s3.amazonaws.com/0/7465/35410a58-e980-e142-395c-eebbe666f18f.png "Screen Shot 2014-01-24 at 5.58.31.png")

## その他
- 優勝者には素敵な商品が・・・出ません。順位を付ける予定もありません。各自、自己満足の世界でSQLを作って下さい。
- バリエーションとしてよくあるのが、所属履歴に開始日付と終了日付を持っていて未来の異動予定も予め入力できるパターンです。こちらのSQLも考えてみると勉強になるかもしれません。

## 僕の解答例
僕はこんな感じで作ってみました。
この手の解答例としては比較的スタンダードだと思うのですが、どうなんでしょう？
あ、自力で答えを考えたい人はまだ見ないで下さいね！！

- http://sqlfiddle.com/#!12/ae7cf/2
- SQL Fiddleの調子が悪いときは[こちらのgist](https://gist.github.com/JunichiIto/690e2a146b7bc1cfd5840a0739525c5d)をどうぞ。

## 最後に
それではみなさん、Let's try!!

## 過去に作ったSQL腕試し問題
- [【SQL腕試し問題！】締め切り日が近いイベントの一覧の取得するSQLを書いて下さい](http://qiita.com/jnchito/items/7d5d7e829690ea3c4d6f)
Android標準ブラウザのconsole.log()が第2引数以降を無視する件

Androidに対する愚痴のようなものが多くて恐縮だが、またそんな調子のことを書く。


```js
console.log('Androidは素晴らしい','Androidはクソだ');
```
consoleには、こんなふうに表示される。

```
Androidは素晴らしい
```

単なるテキストなら、もしかして第2引数は受け付けないのではないかと推測したかもしれない。
ところが、第2引数に、検証用のためにメソッド呼び出し結果なんか書いていたものだから、表示されない＝正常に値が返らないものだと思い込んで、無意味な原因探求をしてしまった。

### 検証端末

- GALAXY S2 - Android 4.0.1
- IS06 - Android 2.2.3

Androidのバージョンにもよるのかもしれない。
ファイルを開く／新規作成するときのタブを必ず右端に作成するプラグイン

2chでファイルを開いた際にタブを最後尾(？)に作成するプラグインがないかとの質問に、30行ほどで作れるが無いからうんたらとかいうレスがついていたので作ってみた。
　

```py3
import sublime, sublime_plugin
import time

class FlushTabRightCommand(sublime_plugin.WindowCommand):
	
	def run(self):
		views = self.window.views_in_group(self.window.active_group())
		flushed_index = len(views) - 1

		self.window.set_view_index(self.window.active_view(), self.window.active_group(), flushed_index) 		


class FlushTabRightAutoRun(sublime_plugin.EventListener):

	def on_new_async(self, view):
		time.sleep(0.01)
		view.window().run_command('flush_tab_right')

	def on_load(self, view):
		view.window().run_command('flush_tab_right')
```
　
全部で20行。
Win7+ST3(3059)でしか試していませんが、このコードを`flush_tab_right.py`とか適当なファイル名で保存して`Packages`フォルダの`User`フォルダにでも突っ込んでおけばたぶん機能すると思います(適当)
`on_new`が微妙だし、もっとスマートに書けるのかもしれないけど自分の中で一応満足したのでここで終了。
Macro(#define)に可変引数を渡す方法

___


###マクロ定義
こうしとけばログ出力マクロをDEBUGフラグだけでON/OFF切り替えできる。
マクロのコール側で意識しなくても, **関数名・行数**なども表示できる。


```hogehoge.h
#ifdef DEBUG
#define LOG_PRINT(...) log_print(__FUNCTION__, __LINE__, __VA_ARGS__) 
#else /* DEBUG */
#define LOG_PRINT(...)
#endif /* DEBUG */
```

下記はログ出力関数の実態イメージ。

```hogehoge.c

void log_print(char* func, int line, const char* format, ...)
{
	va_list arg;
	
       :
	fprintf(stdout, "[%s:%d] ", func, line);
	vastart(arg, format);
	vsprintf(stdout, format, arg);
    return;
}
```
UISplitViewControllerのマスタービュー表示/非表示を切り替える

![独自の「隠す・表示する」ボタンを配置したいけれど…](https://qiita-image-store.s3.amazonaws.com/0/5210/3be2d07e-396e-a378-f742-7c0bfcb35a93.png)

UISplitViewControllerのマスタービュー表示/非表示を、ボタンタップではなくプログラムから切り替える方法についてです。

UISplitViewControllerクラスは、-splitViewController:shouldHideViewController:inOrientation:デリゲートメソッドか、デリゲートメソッドに渡されるUIBarButtonItemオブジェクトとを使うことで、Masterビュー（左側に表示されるビュー）の表示/非表示を切り替えられます。たとえば次のようにデリゲートメソッドを実装していると、縦方向の表示のときはMasterビューを隠して画面全体でDetailビュー（右側に表示）を表示できます。

```objc
/* orientationで示す方向で、マスタービューを隠すかどうか
 * UISplitViewControllerのビュー表示時、あるいはデバイス方向を変えたときに呼ばれる
 */
- (BOOL)splitViewController:(UISplitViewController *)svc        // ← UISplitViewController
   shouldHideViewController:(UIViewController *)vc              // ← マスタービューのビューコントローラ
              inOrientation:(UIInterfaceOrientation)orientation // ← 方向(UISplitViewController)
{
    // 縦方向のときは隠す。横方向では表示
    return UIInterfaceOrientationIsPortrait(orientation);
}
```

また、別の-splitViewController:willHideViewController:withBarButtonItem:forPopoverController:デリゲートメソッドで渡されるUIBarButtonItemには、UISplitViewControllerオブジェクトとそのメソッドが、それぞれtargetとactionプロパティにセットされています。そのため、ツールバーやナビゲーションバーにセットしておけば、ユーザーの操作でマスタービューを自由に出したり消したりできます。

```objc
- (void)splitViewController:(UISplitViewController *)splitController
     willHideViewController:(UIViewController *)viewController
          withBarButtonItem:(UIBarButtonItem *)barButtonItem
       forPopoverController:(UIPopoverController *)popoverController
{
    NSLog(@"action:[%@] target:[%@]", NSStringFromSelector(barButtonItem.action), barButtonItem.target);
    // → action:[toggleMasterVisible:] target:[<UISplitViewController: 0x…>]
}
```

ところがここに問題があり、マスタービューの表示を切り替える手段がUIBarButtonItemでしか提供されず、その中で呼んでいるAPIがプライベートAPIなので、プログラムから直接呼ぶことができないのです。
「ある項目を選択したときだけ画面を広くして使いたい」「画面上のツールバーやナビゲーションバー以外のUIでボタンを設置したい」というユースケースはよくありますが、これではそんな要望には応えられません。どうしてこんな設計にしたか分かりませんが、とにかく無理なものは無理です。

ではどうしたらよいか。プライベートAPIを明示的に呼ばず安全に表示/非表示を切り替える方法は、実は簡単な方法があります。次に示すように、barButtonItemのtargetとactionプロパティの情報をそのまま使って、メッセージを送信するだけです。

```objc
// UISplitViewControllerにMasterビューの表示切り替えを要求する
// ※ barButtonItemはデリゲートメソッドで届いたときに保持しておく
[barButtonItem.target performSelector:barButtonItem.action];
```

こうすることで、UISplitViewControllerの内部APIに触れる・知ることなく目的を達成できます。任意のUIやジェスチャでも、ビューの表示を切り替えられますね。

@ikesyo さん、Twitterで困っていたときにコメントしていただき、ありがとうございました。