OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryのdatepickerを非活性（disabled）にする方法

* datepickerそのものをdisabledにする

```js+php:app.js
$( "#datepicker" ).datepicker( "option", "disabled", true );
```

* 全ての日付をdisabledにする

```js+php:app.js
$( "#datepicker" ).datepicker('option','beforeShowDay',function(date){
  return false;
});
UbuntuにMozcをインストール

日本語インプットメソッドを Google 日本語入力のオープンソース版 Mozc に切り替え

http://web.loft-net.co.jp/lofttecs/ubuntu_ibus_mozc/

Anthyのサジェストの表示の調整方法が分からず（検索エンジンのサジェストとかぶってしまう）、mozcを入れてみました。

`sudo apt-get install ibus-mozc`

Ubuntuソフトウェアセンターからのインストールも試みましたが、うまくいきませんでした。
（mozcの設定画面は動きましたが、何故か肝心のmozcへの切り替えが出来ませんでした。）

右上のAnthyのアイコンもしくはキーボードのアイコンを右クリックで再起動を選択して、iBusを再起動します。

アイコンが再表示されたらクリックしてMozcを選択します。

場合によっては下記も実行したほうが良いかもしれません。
`sudo apt-get install python-appindicator`
`sudo apt-get install python-gconf`
`sudo apt-get install python-glade2`
`sudo apt-get install python-pexpect`

`sudo apt-get install ibus-gtk ibus-gtk3 ibus-qt4`

参考：
http://itpro.nikkeibp.co.jp/article/COLUMN/20120217/381925/
https://sites.google.com/site/tetsuroweb/home/software/ubuntu/tips/ibus-panel
http://qiita.com/ayihis@github/items/aa0fa3ac01888e749fba
phpとimageMagickを使ってスキャンを快適に

##背景
背景というほどたいしたものではないのですが,スキャン機が小さいもので大きい資料をスキャンしようとすると反転した形でスキャンしてしまい、それをPDFにまとめるのにめんどくさいなーとか思ってphpとimageMagickで自動化するスクリプトを組もうと思いました

##環境
php5.5.20
MacOSX10.10.3

パソコンこのまえ初期化してしまってphp環境整備してなかったので最新ではないのは許してください。お願いします。何でもしますから(何でもするとは言ってない)

##前提条件
imageMagickのインストール
スキャンするときにJPEGでスキャン

あと前提条件ではないんですが、

スキャンをするとデータが
15071-15098
のような連番になるのを利用してこのスクリプトを組んでます


##コード

```php:convert.php
<?php                                                                           
$dir = trim(fgets(STDIN));
$start = trim(fgets(STDIN));
$end = trim(fgets(STDIN));
for ($i =(int)$start; $i <= (int)$end;$i+=2){
        $file = $dir;
        $file = $file.(string)$i.'.JPG';
        $image = imagecreatefromjpeg($file);
        imageflip($image, IMG_FLIP_BOTH);
        imagejpeg($image,$dir.(string)$i.'.JPG');
        imagedestroy($image);
}
$output = shell_exec('convert '.$dir.'*.JPG ./test.pdf');
echo $output;
?>


```
##使い方
使い方もなにも見れば分かる通りなんですが、

```
$php convert.php 
```

とした後に
ディレクトリの入力
変換するデータの始めの数字
変換するデータの最後の数字
をすればconvertまでしてくれてPDFファイルのできあがりという感じです.

やっつけ仕事なので注意点がありまして
convertは指定したディレクトリでpdfを作成する.
まだ変換するデータの始めの数字は反転してるものを指定する
ということさえ守ればうまくいくはずです
AWS(RDS MySQL)の1ヶ月の利用料金を計算してみた

お世話になります。
[AWSキッチン](http://aws.lepra.jp/)のシェフです。

以前EC2の1ヶ月単位のざっくりしたコストを計算([AWS(EC2)の1ヶ月の利用料金を計算してみた](http://qiita.com/s-ushirogochi/items/2fe36514f95a31bee364))してみました。
同じようにRDS MySQLについても1ヶ月のコストを出してみました。

* 2015/11/04 1$を125円計算し、プロビジョンド IOPS（SSD）を追加しました。

##前提条件
1$：　125円
サポートプラン:　ベーシック(無料)
データ転送量：　0GB
使用率：　100%
DB：MySQL
マルチAZ : ON

今回はインスタンスタイプとディスクの種類で計算をわけました。
インスタンスタイプとディスクの種類の合計が1ヶ月の費用になります。

##計算結果（インスタンスタイプ）
### 一般的な目的
| インスタンスタイプ| 1時間あたりのコスト| 1月あたりのコスト（ドル）|1月あたりのコスト（円）|
|:-----------|------------:|------------:|------------:|
|db.t2.micro|$0.052 |$38.688 |￥4,836|
|db.t2.small|$0.104 |$77.376 |￥9,672|
|db.t2.medium|$0.208 |$154.752 |￥19,344|
|db.m3.medium|$0.240 |$178.560 |￥22,320|
|db.m3.large|$0.480 |$357.120 |￥44,640|
|db.m3.xlarge|$0.970 |$721.680 |￥90,210|
|db.m3.2xlarge|$1.930 |$1,435.920 |￥179,490|

### メモリの最適化
| インスタンスタイプ| 1時間あたりのコスト| 1月あたりのコスト（ドル）|1月あたりのコスト（円）|
|:-----------|------------:|------------:|------------:|
|db.r3.large|$0.570 |$424.080 |￥53,010|
|db.r3.xlarge|$1.140 |$848.160 |￥106,020|
|db.r3.2xlarge|$2.270 |$1,688.880 |￥211,110|
|db.r3.4xlarge|$4.540 |$3,377.760 |￥422,220|
|db.r3.8xlarge|$9.080 |$6,755.520 |￥844,440|

##計算結果（ディスクの種類）

### プロビジョンド IOPS（SSD）
* Storage $0.30 : GB あたり/月
* プロビジョニング済み IOPS $0.24 : IOPS あたり/月

#### IOPS 1GBあたり3の場合

|容量|IOPS|1月あたりのコスト（ドル）|1月あたりのコスト（円）|
|:-----------|------------:|------------:|------------:|
|100GB|300|$102.000 |￥12,750| 
|500GB|1,500|$510.000 |￥63,750| 
|1T(1,000GB)|3,000|$1,020.000 |￥127,500| 

#### IOPS 1GBあたり5の場合 

|容量|IOPS|1月あたりのコスト（ドル）|1月あたりのコスト（円）|
|:-----------|------------:|------------:|------------:|
|100GB|300|$150.000 |￥18,750| 
|500GB|2500|$750.000 |￥93,750| 
|1T(1,000GB)|5,000|$1,500.000 |￥187,500| 

#### IOPS 1GBあたり10の場合 

|容量|IOPS|1月あたりのコスト（ドル）|1月あたりのコスト（円）|
|:-----------|------------:|------------:|------------:|
|100GB|1,000|$270.000 |￥33,750| 
|500GB|5,000|$1,350.000 |￥168,750| 
|1T(1,000GB)|10,000|$2,700.000 |￥337,500| 

### General Purpose (SSD) 
* Storage $ 0.276 : GB あたり/月

|容量|1月あたりのコスト（ドル）|1月あたりのコスト（円）|
|:-----------|------------:|------------:|
|100GB|$27.600 |￥3,375| 
|500GB|$138.000 |￥17,250| 
|1T(1,000GB)|$276.000 |￥34,500| 

### Magnetic ストレージ 
* Storage $0.24 : GB あたり/月
* I/O 料金については除外

|サイズ|1月あたりのコスト（ドル）|1月あたりのコスト（円）|
|:-----------|------------:|------------:|
|100GB|$24.000|￥3,000|
|500GB|$120.000|￥15,000|
|1T(1,000GB)|$240.000|￥30,000|
Laravel4でinsert直後のidを自動取得したい件

下記のようなテーブルがあるとする。

    mysql> desc company_basic_info;
    +---------------+------------------+------+-----+---------+----------------+
    | Field         | Type             | Null | Key | Default | Extra          |
    +---------------+------------------+------+-----+---------+----------------+
    | id            | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | name          | varchar(255)     | NO   | UNI | NULL    |                |
    | kana          | varchar(255)     | NO   | UNI | NULL    |                |
    | tel           | varchar(40)      | NO   | UNI | NULL    |                |
    | fax           | varchar(40)      | NO   | UNI | NULL    |                |
    | address       | varchar(255)     | NO   | UNI | NULL    |                |
    | url           | varchar(255)     | NO   | UNI | NULL    |                |
    | establishment | date             | NO   |     | NULL    |                |
    | capital       | int(11)          | NO   |     | NULL    |                |
    +---------------+------------------+------+-----+---------+----------------+
    9 rows in set (0.00 sec)

名前や電話番号などの会社情報を入力するテーブル。
id は auto_increment なので、インサート時に自動的に振られる。
その id を取得したい場合は、

    $id = DB::getPdo()->lastInsertId();

を使う。具体的には、下記のように実装する。

    public function insert()
    {

        $name          = Input::get('name');
        $kana          = Input::get('kana');
        $tel           = Input::get('tel');
        $fax           = Input::get('fax');
        $address       = Input::get('address');
        $url           = Input::get('url');
        $establishment = Input::get('establishment');
        $capital       = Input::get('capital');

        $result =
        DB::table('company_basic_info')->insert([
                'name'         => $name,
                'kana'         => $kana,
                'tel'          => $tel,
                'fax'          => $fax,
                'address'      => $address,
                'url'          => $url,
                'establishment'=> $establishment,
                'capital'      => $capital
        ]);

        if($result){
                $id = DB::getPdo()->lastInsertId();
                echo $id;
        }

        return 'hoge';

    }

ここで、$result には、insert の結果が入る（idではない）。
insert が成功したら $result は 1 になる。
aws-sdk-go で S3 にファイルをアップロード

AWSの公式 Go SDK である [aws-sdk-go](https://github.com/awslabs/aws-sdk-go) で S3 にファイルをアップロードしてみました。

なお、このSDKはまだ正式リリースではなくAPIの仕様が変わる可能性があります（この記事は 2015/05/07 時点のものです）。

## import

```go

import (
	"github.com/awslabs/aws-sdk-go/aws"
	"github.com/awslabs/aws-sdk-go/aws/awsutil"
	"github.com/awslabs/aws-sdk-go/aws/credentials"
	"github.com/awslabs/aws-sdk-go/service/s3"
)
```

## Credentials

APIにアクセスするために`Credentials`オブジェクトが必要です。

環境変数から作る場合:

```go
creds := NewEnvCredentials()
```


KeyとSecretから作る場合:

```go
creds := credentials.NewStaticCredentials("Your AWS Key", "Your AWS Secret", "")
```

他にも`Provider`インタフェースを渡す関数もあるので、ネットワーク経由でKeyとSecretを取ってくるようなものや、ファイルなどから読み込むものなど、自前で実装することも出来ます。

## Config

```go
config := aws.Config{
	Credentials: creds,
	Region:      "ap-northeast-1",
}
```

`Config`にはいくつかの設定がありますが、最低限必要と思われる`Credentials`と`Region`を設定すれば他はデフォルト値で大丈夫なようです。

## S3 Client

```go
client := s3.New(&config)
```

## API

```go
params := &s3.PutObjectInput{
	Bucket:      aws.String("your_bucket_name"), // Required
	Key:         aws.String("your_s3_key"),    // Required
	ACL:         aws.String("public-read"),
	Body:        bytes.NewReader(body),
}
resp, err := client.PutObject(params)
```

`Body`には`io.ReadSeeker`を渡します。
CakePHP3のバリデーションをまとめてみた

#CakePHP3のバリデーションをまとめてみた

モデル周りも触り出すようになって何となくバリデーション周りも書き方が分かってきたのでまとめてみます。

##バリデーションの掛け方

###普通の保存(ほぼbake)
```php

//Controller
$hoge = $this->Hoges->newEntity();
if ($this->request->is('post')) {
    $hoge= $this->Hoges->patchEntity($hoge, $this->request->data);
    if ($this->Hoges->save($hoge)) {
        //OK
    } else {
        //NG
    }
}
$this->set(compact('hoge'));
```

###バリデーションのみかける
```php
//Controller
$hoge = $this->Hoges->newEntity($this->request->data);
if ($hoge->errors()) {
    //NG
} else {
    //OK
}
$this->set(compact('hoge'));
```

##バリデーションの書き方

###CakePHP標準搭載メソッドの使用
```php
//Table
public function validationDefault(Validator $validator)
{
    $validator
        //notEmptyの記述。第二引数はメッセージ
        ->notEmpty('mail', 'required mail')
        //メール形式のチェック
        ->add('mail', 'validFormat', [
            'rule' => 'email',
            'message' => 'E-mail must be valid'
        ])
    ;
    return $validator;
}
```

###独自のバリデーション①(従来のやりかたに近い)
```php
//Table
public function validationDefault(Validator $validator)
{
    $validator
        //notEmptyの記述。第二引数はメッセージ
        ->notEmpty('tel', 'required tel')
        //customって文字列は意味ありそうでない。
        //むしろtelに複数の独自メソッドをかける際には別名にする必要あり
        ->add('tel', 'custom', [
            //第一引数に$thisを指定することでTableのメソッドが指定可能。
            //ただし、色々やってみた感じだと引数が何も渡せない？
            'rule' => [$this, 'tel'],
            'message' => 'invalid tel'
        ])
    ;
    return $validator;
}

public function tel($value, $context)
{
    //boolで返さないとエラー
    return (bool) preg_match('/^[0-9]{2,5}-?[0-9]{2,5}-?[0-9]{2,5}$/', $value);
}
```

###独自のバリデーション②
```php
public function validationDefault(Validator $validator)
{
    $validator
        //独自のバリデーションルールの記載方法①
        ->add('tel', 'custom', [
            'rule' => function ($value, $context) {
                //同一Table内などのメソッドも指定可能
                return (bool) preg_match('/^[0-9]{2,5}-?[0-9]{2,5}-?[0-9]{2,5}$/', $value);
            },
            'message' => 'invalid tel'
        ])
    ;
    return $validator;
}
```

###独自のバリデーション③(本命)

```php
<?php
//App/Validation/CustomValidation.php
namespace App\Validation;
use Cake\Validation\Validation;
class CustomValidation extends Validation
{
    //メソッドはstaticである必要あり
    public static function zip1($value, $context){
        //きちんとboolで返さないとエラーになる
        return (bool) preg_match('/^[0-9]{3}$/', $value);
    }
}
```

```php
//Table
public function validationDefault(Validator $validator)
{
    //使用したい独自バリデーションを設定
    $validator->provider('custom', 'App\Validation\CustomValidation');
    $validator
        ->notEmpty('zip1', 'required zip1')
        ->add('zip1', 'custom', [
            'rule' => 'zip1',
            'provider' => 'custom',
            'message' => 'invalid zip1'
        ])
     ;
    return $validator;
}

```

##まとめ

バリデーションの書き方がだいぶ変わっているので慣れが必要な感じです・・・。

独自バリデーションについては③の方法が一番まとまって良さそうです。

これだとModelとFormの間でも簡単に共通のバリデーションルールが使える点も大きそう。

後、公式ではValidation.phpはAPP/Model/Validationとかにおいてますが、私はFormでも使いたいのでAPP直下にValidationをおいてます。

まぁ場所はお好みで・・・。
Atomショートカット

```起動
$ atom [dir/file]
```

|分類|コマンド|ショートカットキー
|---|---|---|
|タブ操作|コマンドパレット|cmd-shift-p|
|タブ操作|タブ切り替え|ctrl-tab,ctrl-shift-tab|
|タブ操作|ファイルを閉じる|ctrl-w|
|タブ操作|直前に閉じたファイルを開く|ctrl-shift-t|
|ペイン操作|フォーカス移動|cmd-k + up(down,right,left)|
|ペイン操作|ペインを閉じる|cmd-k + cmd-w|
|ペイン操作|ペイン内の他のファイルを閉じる|cmd-k + cmd-alt-w|
|ツリー操作|ツリーの表示・非表示|cmd-¥|
|ツリー操作|ツリーとバッファのフォーカス切り替え|ctrl-0|
|ツリー操作|ファイルを追加する|a|
|ツリー操作|フォルダを追加する| shift-a|
|ツリー操作|ファイルやフォルダを複製する| d|
|ツリー操作|ファイルやフォルダを移動する| m|
|ツリー操作|ファイルやフォルダを削除する| delete|
|ツリー操作|ファイルのフルパスをコピーする| ctrl-shift-c|

|分類|コマンド|ショートカットキー
|---|---|---|
|編集・表示|検索・置換パネルを開く|cmd-f|
|編集・表示|検索を実行する|cmd-g|
|編集・表示|指定行に移動する|ctrl-g|
|編集・表示|コメントイン・アウト|cmd-/|
Google Playサービスを必要なだけAndroidStudioプロジェクトに追加する

※[Setting Up Google Play Services](https://developer.android.com/google/play-services/setup.html#split)より一部抜粋。

Google Play サービスのバージョン6.5以前は全てのAPIのパッケージをアプリに組み込む必要がありました。場合によってはこれはアプリのメソッド数の制限にひっかかる原因になります。Androidでは一つのアプリあたり最大65536個のメソッドしか持つことができず、これにはあなたが書いたコード以外にフレームワークAPI、ライブラリのメソッドも含まれます。

バージョン6.5から、Google Play サービスAPIのうち必要なものだけを選択してコンパイルすることができるようになりました。たとえば、Google Fit と Android Wear APIだけを使用する場合は次のように`build.gradle`を書き換えます。

```groovy
compile 'com.google.android.gms:play-services:10.2.0'
```

をこうします。

```groovy
compile 'com.google.android.gms:play-services-fitness:10.2.0'
compile 'com.google.android.gms:play-services-wearable:10.2.0'
```

次の表は利用目的に応じたそれぞれのAPIを記載しています。いくつかのAPIはここに記載されていませんが、それらはbaseライブラリに含まれます(これはいずれかのライブラリを読み込んだ時に自動的に組み込まれます)。

Google Play services API | Description in build.gradle
--- | ---
Google+ | com.google.android.gms:play-services-plus:10.2.0
Google Account Login | com.google.android.gms:play-services-auth:10.2.0
Google Actions, Base Client Library | com.google.android.gms:play-services-base:10.2.0
Google Address API | com.google.android.gms:play-services-identity:10.2.0
Google Analytics | com.google.android.gms:play-services-analytics:10.2.0
Google Awareness | com.google.android.gms:play-services-awareness:10.2.0
Google Cast | com.google.android.gms:play-services-cast:10.2.0
Google Cloud Messaging | com.google.android.gms:play-services-gcm:10.2.0
Google Drive | com.google.android.gms:play-services-drive:10.2.0
Google Fit | com.google.android.gms:play-services-fitness:10.2.0
Google Location and Activity Recognition | com.google.android.gms:play-services-location:10.2.0
Google Maps | com.google.android.gms:play-services-maps:10.2.0
Google Mobile Ads | com.google.android.gms:play-services-ads:10.2.0
Google Places | com.google.android.gms:play-services-places:10.2.0
Mobile Vision | com.google.android.gms:play-services-vision:10.2.0
Google Nearby | com.google.android.gms:play-services-nearby:10.2.0
Google Panorama Viewer | com.google.android.gms:play-services-panorama:10.2.0
Google Play Game services | com.google.android.gms:play-services-games:10.2.0
SafetyNet | com.google.android.gms:play-services-safetynet:10.2.0
Android Pay | com.google.android.gms:play-services-wallet:10.2.0
Android Wear | com.google.android.gms:play-services-wearable:10.2.0

注意: 必要なクラスを保護するためにProGuardディレクティブがPlayサービスライブラリに含まれています。[GradleのAndroidプラグイン](https://developer.android.com/tools/building/plugin-for-gradle.html)は自動的にProGuard設定を追記します。プロジェクトを作成するとき、Android Studioは自動的にProGuard設定ファイルとbuild.gradleプロパティをProGuardのために設定します。Android  StudioでProGuardを使用するためには、`build.gradle buildTypes`で有効にしなければいけません。詳しくは[ProGuard](https://developer.android.com/tools/help/proguard.html)のトピックを参照してください。
ruby on railsのhtmlタグ除去のまとめ

かなりややこしいのでmemo（あってるかな...）

#### strip_tags
 * すべてのhtmlタグの除去
 * ```\r\n```が```&#13;\n```で出力されるので注意;

#### <%= %>
  * すべてのhtmlタグをエスケープして出力

#### h ( = html_escape)
  * すべてのhtmlタグをエスケープして出力

#### simple_format
  * 以下条件を除いて、htmlタグをエスケープせずに出力
    * scriptタグは除去される
    * 全体がpタグで囲われる
    * \nは<br />に変換
    * 連続した改行は</p><p>が付与される

#### simple_format(h())
  * 以下条件を除いて、htmlタグをエスケープして出力
    * scriptタグは除去される
    * 全体がpタグで囲われる
    * \nは<br />に変換
    * 連続した改行は</p><p>が付与される


#### raw
  * すべてのhtmlタグをエスケープせずに出力
    * つまりscriptタグが変数に入っていたらエスケープされない
    * 上記理由（参照：リファレンス）より非推奨
[MySQL] InnoDBを積極的に使わないケース

MySQLを使った開発案件では、InnoDBバンザイ、最高と言う空気が感じられますが、
状況次第ではInnoDB最高とは言えないケースに良く遭遇するので、ちょっと書いてみます。

取引先からの相談、依頼で、「うちで開発運用しているシステムで、DB重いから見て欲しい。」
と言うのが、度々あります。

root権限もらって調べると、InnoDB しか使ってない状態で、かなりのケースで
InnoDB のデータサイズが innodb_buffer_pool_size を盛大に超えています。

レスポンスタイムを保障しなければならないケースでは（保障しなくて良いケースに遭遇したこと無いですがｗ）バッファプールから溢れた時点で負けなので、毎日データ量の監視をして
溢れる前に削除可能なデータを消すか、MyISAM や Archive のテーブルに退避とか
パーティーションでお茶を濁すとかします。

基本的に調達可能なサーバーのスペックには限界が有り、予算や経費にも限界が有るので
有る物で結果を出すためには、リソースの消費量を最小限にしなければなりません。

アプリケーションやサーバーの運用担当者が、この辺のリソース管理やチューニングの
要点を知っているのであれば、全部InnoDBで作って「後は任せた！」でも良いかもしれませんが、
そうではないケースがかなり有ると思われるので、アプリ開発担当者がInnoDBで無ければならない理由を
きちんと説明できないようであれば、そのテーブルは MyISAM にして下さい。
と言うようにしています。

InnoDBとMyISAMでは、テーブル構造とデータ量が同じでも、
確保しなければならないメモリの量が数倍、設計がヒドイと10倍以上違ってきます。

理想は色々有るとは思いますが、現実問題として放置運用しか出来ていないのであれば
極端な話ですが、全部 MyISAM で作ったほうがトラブルは少ないように思います。

デフォルトのストレージエンジンが MyISAM から InnoDB になったからと言って、
MyISAM の信用性がいきなりゼロになった訳ではないからです。

なんか愚痴っぽいなｗ

これだけではアレなのでMySQLの簡単な状態確認方法を！

InnoDB のデータサイズの計測
```sql
select sum( data_length )  from information_schema.tables where engine = 'innodb';
```

InnoDB バッファプールサイズ
```sql
show variables like 'innodb_buffer_pool_size';
```

データ＞バッファ　になるとアウト！

MyISAM のキーサイズの計測
```sql
select sum( index_length ) from information_schema.tables where engine = 'myisam';
```

キーバッファサイズ
```sql
show variables like 'key_buffer_size';
```

キーサイズ＞キーバッファサイズ　になるとアウト！

MyISAM はキーさえバッファに収まっていれば良い点に注意です。
実際には MyISAM の場合、キーサイズがバッファから溢れても
結構持ちこたえます。

一番良いのは mysqltuner を使う。
https://github.com/major/MySQLTuner-perl

単純なperlスクリプトなので、ソースを読むとチューニングの要点が見えてきて勉強になります。
to_prepareブロックの中はスコープが異なっているので注意

```ruby:config/initializers/a.rb
A
```

```ruby:app/models/a.rb
module A
  Rails.application.config.to_prepare do
    B.c
  end

  module B
    def self.c
      const_set("C", 0)
    end
  end
end
```

とした場合、一見動きそうで、実際動くけど rails c から reload! で次の警告が出て A::B::C にアクセスできなくなる。

```
warning: already initialized constant A::B::C
warning: previous definition of C was here
```

A::B.c とした場合は、Railsでよく見かけるエラーに変わる。

```
ArgumentError: A copy of A has been removed from the module tree but is still active!
```

トップレベルから参照するように ::A::B.c とすると解決する。
２つのファイルから重複したデータを出力する

# cat sort uniq を使う方法
```
cat a.txt b.txt | sort | uniq -d > tmp.txt
```

# fgrep を使う場合
```
fgrep -xf a.txt b.txt > tmp.txt
```

# DanKogaiさん流
```
perl -nle '$l{$_}++;END{$l{$_}>1 and print for keys %l}' a.txt b.txt > tmp.txt
```

# 素直にコード書く
```pl
#!/usr/bin/perl

sub data {
    my $file = shift;
    open(FILE, $file) or die "$!";
    my @data = ();
    while(<FILE>) {
        chomp($_);
        push @data, $_;
    }
    close(FILE);
    return @data;
}

@file1 = data("./a.txt");
@file2 = data("./b.txt");

my %data;
my @dup = grep { $data{$_} >= 2 } grep { ++$data{$_} > 1 } (@file1, @file2);
print "$_\n" for @dup;
```
Mac覚書 スクリーンショットの撮り方

操作マニュアルを作成する為、スクリーンショットの撮り方を調査^^;

***
参考サイト：https://support.apple.com/ja-jp/HT5775
***

参考サイト様では、下記の４つのパターンを紹介されていました。
今回は、画面全体を撮りたかったので③でパチリ(^^)
クリップボードに撮る事も出来るんですね。

**①画面全体のスクリーンショットを撮る方法**

　「command (⌘) + shift + 3」キーを押すと
　スクリーンショットが、ディスクトップに追加される。
　（PNGファイルとして保存され、名前は「スクリーンショット (日付および時間).png」になる)

**②画面の一部のスクリーンショットを撮る方法**

　・「command (⌘) + shift + 4」キーを押して、十字ポインタをドラッグして撮りたい範囲を決める。
　・「shift」「option」または「space」バーを押しながらドラッグして、選択した領域のサイズを変更する。
　・取り消すには、マウスボタンを放す前に「escape (esc)」キーを押す。　 

**③特定のウインドウのスクリーンショットを撮る方法**
　・「command (⌘) + shift + 4」キーを押して「space」バーを押す。
　・カメラのポインタをウインドウの上に移動してハイライトし、クリックする。
　・取り消すには、クリックする前に「escape (esc)」キーを押す。

**④メニューのスクリーンショットを撮る方法**
　・メニューをクリックしてコンテンツを表示し、「command (⌘) + shift + 4」キーを押す。
　・十字ポインタを領域上にドラッグする。

　・タイトルを除いてメニューのスクリーンショットを撮るには、
　　メニューの上に移動し、「command (⌘) + shift + 4」キーおよび「space」バーを押す。
　・取り消すには、クリックする前に「escape (esc)」キーを押す。
ESP8266でLuaプログラミング(I2C編)

ESP8266は[ファームウェア](https://github.com/nodemcu/nodemcu-firmware "nodemcu/nodemcu-firmware")を入れ換えてeLuaを動作させることが出来ます。

入手したチップはGPIOポートが2つだけ使えます。ポートが2つだけだと面白みに欠けますが、2つあればI2Cが出来そうということで試してみました。

I2Cデバイスは手元にあったL3GD20という3軸ジャイロセンサーです。

USBシリアル変換<>ESP8266<>L3GD20という接続にしてみます。

![esp8266i2c.jpg](https://qiita-image-store.s3.amazonaws.com/0/19582/fce83999-8ad6-34d1-182c-294ee2f8075b.jpeg)

回路は[Ciphersink](http://ciphersink.net/tag/esp8266 "Ciphersink")あたりを参考にするとよいでしょう。消費電流が大きいので注意しましょう。

```lua:i2c.lua
id = 0
sda = 4
scl = 3

i2c.setup(id, sda, scl, i2c.SLOW)

function read_reg(dev_addr, reg_addr)
  i2c.start(id)
  i2c.address(id, dev_addr ,i2c.TRANSMITTER)
  i2c.write(id,reg_addr)
  i2c.stop(id)
  i2c.start(id)
  i2c.address(id, dev_addr,i2c.RECEIVER)
  local c=i2c.read(id,1)
  i2c.stop(id)
  return c
end

function write_reg(dev_addr, reg_addr, dev_data)
  i2c.start(id)
  i2c.address(id, dev_addr ,i2c.TRANSMITTER)
  i2c.write(id,reg_addr)
  local c=i2c.write(id,dev_data)
  i2c.stop(id)
  return c
end

function get_accel_val(low, high)
  local val = string.byte(high) * 256 + string.byte(low)
  if (val > 32767) then
    val = -(bit.band(bit.bnot(val), 0x7fff) + 1)
  end
  return val
end

tmr.alarm(1, 3000, 1, function()
  local reg = read_reg(0x6a, 0x0f)
  print(string.byte(reg))
  write_reg(0x6a, 0x20, 0x0f)
  local vl = read_reg(0x6a, 0x28)
  local vh = read_reg(0x6a, 0x29)
  print("X:" .. get_accel_val(vl, vh))
  vl = read_reg(0x6a, 0x2a)
  vh = read_reg(0x6a, 0x2b)
  print("Y:" .. get_accel_val(vl, vh))
  vl = read_reg(0x6a, 0x2c)
  vh = read_reg(0x6a, 0x2d)
  print("Z:" .. get_accel_val(vl, vh))
end)

```

コードのアップロードと実行には、[LuaLoader for ESP8266](http://benlo.com/esp8266/ "LuaLoader for ESP8266")を使いました。![lualoader.png](https://qiita-image-store.s3.amazonaws.com/0/19582/b6658bcc-3c70-f62b-502f-5f7933d23f03.png)


どうやら問題無く使えるようです。I2Cデバイスが使えればGPIOを拡張したり出来るのでいろいろ遊べそうです。
c++ builder XE4 > udpサーバ / udpクライアント > ASCIIコード限定

```txt:動作確認
C++ builder XE4
```

### updサーバー

```server.cpp
#include <IdUDPServer.hpp>
...

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	IdUDPServer1->DefaultPort = 6000;
	IdUDPServer1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, const TIdBytes AData,
          TIdSocketHandle *ABinding)
{
	UTF8String str;
	int init_pos = 0;

	str = TEncoding::UTF8->GetString(AData, init_pos, AData.Length);
	Memo1->Lines->Add(str);
}
```

(追記 2017/02/22)
受信文字列に`<0xE2>`などのASCII以外のコードが入っている場合、strはNULLになるようだ。
例として`AAA<0xE2>`を受信したとしても、上記のstrはNULLになる。

```server.h
...
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdSocketHandle.hpp>
#include <IdUDPBase.hpp>
#include <IdUDPServer.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TIdUDPServer *IdUDPServer1;
	TMemo *Memo1;
	void __fastcall IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, const TIdBytes AData,
          TIdSocketHandle *ABinding);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
...
```

イベント
OnUDPRead = IdUDPServer1UDPRead


UTF-8でなくSJISの場合は

```
    String rcvdStr;
    Idglobal::_di_IIdTextEncoding encSJIS;

    encSJIS = IndyTextEncoding(932);

    int init_pos = 0;
	rcvdStr = encSJIS->GetString(AData, init_pos, AData.Length);

```


### udpクライアント

```client.cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	IdUDPClient1->Port = 6000;
	IdUDPClient1->Host = L"127.0.0.1";
	IdUDPClient1->Active = true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	IdUDPClient1->Send(
		Edit1->Text,
		IndyTextEncoding(TEncoding::UTF8)
		);
}
```
どこまでがLINQ？

統合言語クエリ(LINQ; Language-Integrated Query)とは、どこまでの範囲を指すか？

C#では2種類のLINQ記述方法が用意されてる。前者はコンパイル時に実質メソッド呼び出しに展開される。MSDN公式でも両者ともにLINQとしている。

* クエリ構文 (query syntax)
* メソッド構文 (method syntax)

MSDN [LINQ でのクエリ構文とメソッド構文 (C#)](https://msdn.microsoft.com/ja-jp/library/bb397947.aspx) より：

```csharp
int[] numbers = { 5, 10, 8, 3, 6, 12 };

// クエリ構文
IEnumerable<int> numQuery1 = 
    from num in numbers
    where num % 2 == 0
    orderby num
    select num;

// メソッド構文
IEnumerable<int> numQuery2 =
    numbers
    .Where(num => num % 2 == 0)
    .OrderBy(n => n);
```
gulp をごっくんごくごく #compass 編

## 環境
* OS X Yosemite 10.10.3

## 前提
* Node.js v0.11.16
* npm 2.3.0
* Compass 1.0.3 (Polaris)
* Sass 3.4.10 (Selective Steve)


## gulp をインストール

```
$ npm install --global gulp
$ npm install --save-dev gulp
```

## gulp-compass をインストール

```
$ npm install gulp-compass --save-dev
```

## compass create

いつものように Project ディレクトリとかを作って

```
$ mkdir SampleProject
$ cd SampleProject
$ compass create
```

## config.rb を編集

とりあえずこんなかんじに

```
require 'compass/import-once/activate'

http_path = "/"
css_dir = "css"
sass_dir = "sass"
images_dir = "img"
javascripts_dir = "js"
```

## gulpfile.js を作成

```
$ vim gulpfile.js
```

## 中身をかんな感じに

各種パスはご自身の環境に合わせてください

```
var gulp = require('gulp');
var compass = require('gulp-compass');

gulp.task('compass',function(){
	gulp.src('./sass/*.scss')
		.pipe(compass({
			config_file: './config.rb',
			css:'./css',
			sass:'./sass'
		}));
});

gulp.task('watch',function(){
	gulp.watch('./sass/*.scss',function(event){
		gulp.run('compass');	
	});
});


gulp.task('default',function(){
	gulp.run('watch');
});
```

## 実行

```
$ gulp
```

これでいつものように作業して勝手にコンパイルしてくれます。gulp もプラグインがガンガン増えて来ていることや、設定ファイルが Grunt よりも書きやすい、Grunt より高速(StreamAPIのおかげ？) ってことで今後も目が離せません。

gulpfile.js については詳しく触れませんが、じっくり読んでみるとある程度意味がわかるんじゃないかなぁと思います。

また、さっきも触れましたが沢山プラグインがあるので、良さげなプラグインがあればガンガン使ってみて試してみるのもいいかもです
Laravel4で特定レコードを更新（update）したい件

下記のテーブルがあるとする。

    mysql> select id,name from company_basic_info order by id;
    +----+--------+
    | id | name   |
    +----+--------+
    |  1 | TOYOTA |
    |  3 | NISSAN |
    |  4 | HONDA  |
    |  5 | MAZDA  |
    +----+--------+
    4 rows in set (0.00 sec)

ここで、id=4 のレコード、つまり HONDA を更新したい場合は、
下記のように実装する。

    DB::table('company_basic_info')->where('id',4)->update(array('name'=>'ホンダ'));

上記を実行すると、テーブルの内容は下記に書き換わる。

    mysql> select id,name from company_basic_info order by id;
    +----+-----------+
    | id | name      |
    +----+-----------+
    |  1 | TOYOTA    |
    |  3 | NISSAN    |
    |  4 | ホンダ    |
    |  5 | MAZDA     |
    +----+-----------+
    4 rows in set (0.00 sec)
nginx テスト中のキャッシュの急ぎ対応

#困り事
テスト中のサイトでhtml,cssなどを書き換えて直ぐ確認したいのに、nginx.confやmysite.conf等の設定ファイルにキャッシュの設定を何も書いていなくてもキャッシュが有効になっていて更新がなかなかされないので困る。

#前提条件
1.CentOS6にYumでnginxをインストール
2.nginx.confには手を入れず、conf.d/mysite.confを作成している

#調べてみたこと
`/var/cache/nginx/fastcgi_temp`
がYumインストール時点で作られているので既存の設定ファイルには見当たらないがキャッシュの設定はされていそう。
キャッシュディレクトリを削除するという方法をネットで見つけたが、設定ファイルに自分で書いていないので正しいキャッシュディレクトリの場所の判別が面倒。

#取り急ぎの解決策
ネットで見つけたnginxキャッシュクリアのもう一つの方法に時間経過の自動削除を待つというのがあったので持続時間をとても短くして対応した。
```mysite.conf
location /{
proxy_ignore_headers Cache-Control;
proxy_cache_valid 200 302 1m;
}
```

proxy_igonre_headersはおまじない的に追加（もしかして不必要？）
ステータスコード200と302の時に持続時間1分にしてみた。
このくらいなら我慢できる範囲。
スタティックマップAPIで、no map画像を判定する方法

YOLPのスタティックマップAPIを利用しようと思っています。

１日の利用制限をオーバーした場合には、no map画像が出力されるようなのですが、
この画像が返ってきたこと（制限オーバーであること）を判定して、別のメッセージ表示などをしたいです。
http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/static.html#error

どのような判定方法がありますか？
宜しくお願いします。
Laravel4のselectのwhereでorを使いたい件

下記のようなテーブルがあるとする。

    mysql> select id,name from company_basic_info;
    +----+-----------------------------+
    | id | name                        |
    +----+-----------------------------+
    |  1 | お試し有限会社              |
    |  5 | サンプル株式会社            |
    |  4 | なんとか証券会社            |
    |  3 | 合同会社あいうえお          |
    +----+-----------------------------+
    4 rows in set (0.00 sec)

ここで、

    $inData = DB::table('company_basic_info')->where('id',3)->orWhere('id',5)->get();

とすると、「id=3」または「id=5」となる。よって下記が取得できる。

    合同会社あいうえお
    サンプル株式会社
EC2のスナップショット取得を自動化する




# 1. コマンドラインからAWSをにアクセスできるようにする
## IAMユーザーの作成

※ この工程はEC2にアクセスできるIAMユーザーをすでに持っていれば不要。

- Consoleのメニューから[Services > IAM]をクリック
- 左メニューの[Users]をクリック
- [Create New Users]をクリックして、名前を入力して[Create]をクリック
- アクセスキーとアクセスシークレットをメモる
- IAMメニューのDashboardからUsersに戻り、Attach Policyから[AmazonEC2FullAccess]を選択。


## aws-cliの設定

IEC2サーバーにログインし、AWSにアクセスするための設定を行う。

```
$ aws configure
AWS Access Key ID [None]:＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
AWS Secret Access Key [None]: ＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
Default region name [None]: ap-northeast-1
Default output format [None]:
```

以下のコマンドで結果が取得できれば設定完了。

```
$ aws ec2 describe-instances
```



# 2. シェルスクリプトを作ってCronに設定する

## シェルスクリプトを作成

以下がスナップショットを作成するためのコマンドをシェルスクリプトに書く（vol-xxxxxxxxの部分はVolumeId）

```sh:/home/ec2-user/scripts/snapshot.sh
#!/bin/sh
aws ec2 create-snapshot -–volume-id vol-xxxxxxxx
```


## Cronの設定


```
$ crontab -e
```
末尾に以下を追加。

```
0 3 * * * /home/ec2-user/scripts/snapshot.sh
```


これで、毎日深夜３時にスナップショットを取得できる。

以上。
ユーザーストーリーis何

アジャイルソフトウェア要求(Object Oriented Selection)を読んでユーザーストーリーについていいことを書いてあったのでまとめる
http://www.amazon.co.jp/dp/4798135321

https://books.google.co.jp/books?isbn=4798135321
ここの87ページあたりから

# ユーザーストーリーを記述する言語
ユーザーストーリーはユビキタス言語で書かれます。
この言語はかつてピジン言語が狙ったものと同じく、企画サイドと開発サイドが共通で使えるより簡易な言語であり、同じ言葉で話すことで同じことを考えるようになり、共通の文化を共有する役割を果たします。

# ユーザーストーリーに書かれること
"「主語」は「ユーザーバリューを出す目的」のために「システムが提供するバリュー」を行う"
というワンセンテンスから構成されます。

# ほかのこと
TBA
まだよんでる
IMAPのRecentフラグをずっと誤解していた話


恥ずかしながら、私はずっと誤解してました。

IMAPでは、"\\Seen"(読んだ)、"\\Answered"(返信した)等、メッセージの状態を表すフラグがあります。"\\"で始まるフラグは、System flagと呼ばれ、IMAPプロトコルで標準的にサポートされるフラグです。System flagは以下の6個あります。


|フラグ名|意味|
|---|---|
|\\Seen|読んだ|
|\\Answered|返信した|
|\\Flagged|フラグ（マーク）|
|\\Deleted|削除した|
|\\Draft|下書き|
|\\Recent|最近届いた|


本題の"\\Recent"ですが、かなり特殊なフラグです。RFC3501によると

> Message is "recently" arrived in this mailbox. 
（メッセージは"最近"このメールボックスに到着した。）

という意味になります。直感的に考えると新着のメールを意味するように思えますが、そうではありません。

新着のメールも"\\Recent"フラグは付加されますが、例えば、メールボックスAからメールボックスBにメッセージをコピーしてメールボックスBに追加されたメッセージにも"\\Recent"フラグは付加されます。実際、dovecot等のIMAPサーバーではコピーによってrecentフラグが付加されることが確認出来ます。

なので、"\\Recent"フラグ付きのメールの有無だけで新着メールをチェックしているMUAは、新着メールの着信検知に失敗することがあります。IMAPでは新着メールの検出は厳密にはできないと思います。

正直、誰得な仕様な気もします。
Modelのhas_manyやbelongs_toで指定したモデルの名前を一覧で取得する方法

```ruby
pp Article.reflect_on_all_associations(:has_many).map{|a|a.name}
```

参考：
http://tnakamura.hatenablog.com/entry/2013/04/10/204648

has_manyで格納している変数探そうとしたら

```ruby
      def has_many(name, scope = nil, options = {}, &extension)
        reflection = Builder::HasMany.build(self, name, scope, options, &extension)
        Reflection.add_reflection self, name, reflection
      end  
```

とあったのでrails consoleでreflactionで始まる様なメソッド探すと、

```ruby
Article.reflect_on_aggregation
Article.reflect_on_all_associations
Article.reflect_on_association
Article.reflect_on_all_aggregations
Article.reflect_on_all_autosave_associations
Article.reflections
```

のようなメソッドがあったので、reflect_on_all_aggregationsでググって内容を把握した。
【Unity】WebGLからWebページ側の関数を呼び出す

#概要

Web Player内からWebページのJavaScriptの関数を呼び出す場合、
`Application.ExternalCall()`関数を使えば簡単に呼び出せますが、Unity5にバージョンアップしてWebGL出力が可能になってから、このあたり未着手だったので、GWの気晴らしにやってみました。

以下はそのサンプルの手順です

#Unity側

![スクリーンショット 2015-05-07 0.52.47.png](https://qiita-image-store.s3.amazonaws.com/0/67591/685fd0f9-44a6-5d5c-5f08-639a6839bcc5.png)


新規プロジェクトで、とりあえず適当にobjectを2つ作って、それぞれに赤色と青色のマテリアルをアタッチします。

更に、以下のスクリプトを上で作ったobjectにアタッチします。

```js:eventFlg


var eve = "eve";

function OnMouseDown(){ 
	 Application.ExternalCall(eve);
}

```

![スクリーンショット 2015-05-07 14.31.28.png](https://qiita-image-store.s3.amazonaws.com/0/67591/3cffe119-07f1-918a-5077-1d547a925e3a.png)

変数に"eve"を持たせているので、インスペクターでこの"eve"を"blue"に変更します。
（同じように赤のobjectは"eve"を"red"に）

これで青のobjectがクリックされれば、"blue"という名を持つ関数を呼び出すことになります。

Unityでの作業はここまで。

そのままビルド設定で、「WebGL」に変更してビルドします。

(あ、念のためビルドの前に実行して、objectをクリックしてコンソールでExternalCallが動いているか確認しておいてください)

![スクリーンショット 2015-05-07 14.39.29.png](https://qiita-image-store.s3.amazonaws.com/0/67591/795ce745-60d4-b303-79d1-cf49147007f4.png)


#Webサイト側

多少、時間がかかりますが、HTML5で出力されるので、出力された「index.html」を開いて編集します。

色々とごちゃごちゃ記述されてますが、特に気にせずに```</body>```直前の```<script></script>```タグ内に以下のコードを追記します。

```js


function red(){
  alert("red");
}

function blue(){
  alert("blue");
}

```

Unityの方で書いたスクリプトをそれぞれの関数名で呼び出します。


#実行・検証

表示されるまで、けっこう時間かかります。

![スクリーンショット 2015-05-07 14.57.56.png](https://qiita-image-store.s3.amazonaws.com/0/67591/19673a4d-edf6-913b-fb0c-2aae91aa755c.png)

青のobjectをクリックすると

![スクリーンショット 2015-05-07 14.58.02.png](https://qiita-image-store.s3.amazonaws.com/0/67591/e019713c-ad27-e889-5b14-e4b6bfedf2ad.png)

ブラウザ側でアラートが出るので、ちゃんとWebGLからWebページの関数を呼び出せてます。

Web Playerの時と何も変わらないですね。
次は逆のWebページからUnity（WebGL）の関数の呼び出しをやってみます。
php-build インストール

どうもマイクラ好きのサーバエンジニアです。

今回はphp-buildのインストール手順をメモしていこうと思います。

#### **事前に入れておく必要があるもの**
・git
php-buildをクローンするため

・[phpenv](http://qiita.com/furifan/items/981f476eb25b7fc06469)
phpを複数バージョン管理できるすぐれもの

#### **今回追加するもの**
・php-build
ダウンロード、展開、コンパイル、インストールをコマンドでやってくれるすぐれもの

#### **作業開始**
./.phpenv以下のディレクトリにpluginsフォルダを作り、そこにphp-buildをgit cloneします。
`# git clone https://github.com/CHH/php-build.git ./.phpenv/plugins/php-build`

これでpluginsにphp-buildが作成されるはずです。

次に、php-build以下のinstall.shファイルを実行します。
`# sh install.sh`
![SnapCrab_NoName_2015-5-7_14-54-48_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/82f5649d-fecb-a730-a0c1-774809f11540.png)

これでphp-buildのインストールが完了になります。

では確認しておきましょう。
`# php-build -v`
![SnapCrab_NoName_2015-5-7_14-59-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/68930/1caeb81d-a523-225f-8ad9-099ea5a6ba2e.png)

無事インストール完了できたので、今日はここまで！
Laravel4でselectにwhereをつける件

下記のようなテーブルがあるとする。

    mysql> select id,name from company_basic_info;
    +----+-----------------------------+
    | id | name                        |
    +----+-----------------------------+
    |  1 | お試し有限会社              |
    |  5 | サンプル株式会社            |
    |  4 | なんとか証券会社            |
    |  3 | 合同会社あいうえお          |
    +----+-----------------------------+
    4 rows in set (0.00 sec)

すべての会社名を取り出す場合は、

    $inData = DB::table('company_basic_info')->get();

とするのだが、特定idの会社名だけを取り出したい場合は
次のようにする。

    $inData = DB::table('company_basic_info')->where('id',3)->get();

このようにすると、

    合同会社あいうえお

だけが取得できる。

ちなみに、

    $inData = DB::table('company_basic_info')->where('id', '>=', 4)->get();

とした場合は「idが4以上」つまり、

    なんとか証券会社
    サンプル株式会社

が取得できる。
udevでデバイス名を固定する

## はじめに

カーネルで認識するデバイスファイル名は、デバイスの抜き差しを行った時に変わってしまう場合がある。
そういった場合、デバイスファイルに直接読み書きを行うプログラムを作るとデバイスファイル名が定まらないために面倒なことになる。

こっちとしては特定の機器が接続された時、特定のデバイスファイルとしてアクセスしたいのである。

`udev`の恩恵にすがると動的にデバイスファイルを作成してくれる。その作成されたデバイスファイルはカーネルが認識したデバイスファイルのリンクである。

今回は手元にあったソニーのNFCカードリーダhを使ってデバイス名を固定にしてみたのをメモ。

- ubuntu14.04

## USB情報を取得

まず、必要なのはデバイスのUSB情報にある**ベンダーID**と**プロダクトID**だ。ベンダーIDは企業ごとにあるIDでマックアドレスのベンダーコードよのうなもの。プロダクトIDは名前の通り、プロダクトのIDで企業が決めるIDである。

今回使うNFCカードリーダーを調べたところ以下の通りだった。

|vender|product|
|---|---|
|0x054c|0x06c1|

usbの接続情報をみる方法はいくつかある。

### lsusb

`lsusb`コマンドを打つとずらっと接続の情報がでる。接続したデバイスが何かを調べる場合、プリミティブな方法だが抜き差しでの表示する差分で把握する。

```sh
$ lsusb
	Bus 002 Device 002: ID 8087:8001 Intel Corp.
	Bus 003 Device 016: ID 054c:06c1 Sony Corp.
		:
	Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

割り当てられたUSB BUSがわかったら、更に詳細を表示してみる。(長いから省略)

```sh
$ lsusb -s 003:016 -v
	Bus 003 Device 022: ID 054c:06c1 Sony Corp.
		:
	  idVendor           0x054c Sony Corp.
	  idProduct          0x06c1
		:
```

### syslog

`syslog`を監視してデバイス情報を得る。

```sh
$ tail -f /var/log/syslog
	Apr 22 15:24:42 sss-trz kernel: [455013.359205] usb 3-10.3: new full-speed USB device number 22 using xhci_hcd
	Apr 22 15:24:42 sss-trz kernel: [455013.377018] usb 3-10.3: New USB device found, idVendor=054c, idProduct=06c1
	Apr 22 15:24:42 sss-trz kernel: [455013.377022] usb 3-10.3: New USB device strings: Mfr=1, Product=2, SerialNumber=4
	Apr 22 15:24:42 sss-trz kernel: [455013.377024] usb 3-10.3: Product: RC-S380/S
	Apr 22 15:24:42 sss-trz kernel: [455013.377026] usb 3-10.3: Manufacturer: SONY
	Apr 22 15:24:42 sss-trz kernel: [455013.377028] usb 3-10.3: SerialNumber: 0011179
	Apr 22 15:24:42 sss-trz kernel: [455013.378153] port100 3-10.3:1.0: NFC: Sony NFC Port-100 Series attached (firmware v1.11)
	Apr 22 15:24:42 sss-trz mtp-probe: checking bus 3, device 22: "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10.3"
	Apr 22 15:24:42 sss-trz mtp-probe: bus: 3, device: 22 was not an MTP device
```


## udevルールの作成

`/etc/udev/rules.d`にルールファイルを作成する。[書き方の詳細](https://docs.oracle.com/cd/E39368_01/e48214/ch07s03.html)

```sh
$ sudo vim /etc/udev/rules.d/80-nfc.rules
    SUBSYSTEM=="usb", ATTR{idVendor}=="054c", ATTR{idProduct}=="06c1", SYMLINK+="nfc"
```

早速抜き差ししてデバイスフォルダを見てみる

```sh
$ ls -la | grep nfc
	lrwxrwxrwx   1 root root            15  4月 22 15:55 nfc -> bus/usb/003/023
```
phpenvやphpbrewの雑な比較

PHPの複数バージョンを切り替えながら使えるようにする、ナントカenv/ナントカbrewのPHP版について。久しぶりにセットアップしたのでメモ。

昔からブログ記事はいくつかあるのだけど、比較記事があまり見つからないのでまとめておく。

## やりたいこと（前提）

一応の注釈だけど、こういう複数環境切り替え系のセットアップツールは以下を前提にしていると思う。

1. 開発環境用
2. Unix系やMac OSを想定。Windowsお断り
3. 初心者向けではない

php-buildなどでのインストールはビルドを伴うので、開発用ツールのセットアップが必要だし、インストールの時間もかかるし、何よりハマりやすい。普通は本番環境やデプロイで使うものではない。
また、大体のツールはgmakeやautotoolsの存在を前提にしているので、Windowsで動かない。Cygwinとか頑張れば可能だろうけど、、たぶんツール作者はWindowsユーザーのことを考えていない。
PHPを勉強したいだけの初心者は、素直に最新版のPHPを普通に使っておけば困らないと思う。あとでphpenvに移すのも難しくないし。

それから、私の場合はこんな前提も追加になる。

- apacheやphp-fpmは必要ない
- PHPに依存しないでPHPがインストールできる方がよい

開発程度であればPHPのビルトインウェブサーバーで可能だし、そもそもapacheを経由するテストならちゃんとテスト環境を作るはずなので、そこはphp-build等でビルドするのではなく、パッケージ版のPHPを使ってテストするべきだと思う。

## 雑な比較(2015年5月)

これ系統のツールは乱立していて、どれがデファクトと言うわけでもない。
しかも「phpenv」を名乗っているものが複数あって、これまたややこしさに拍車をかけている。

<table>
<tr>
<th>名前</th><th>特徴</th>
</tr>
<tr>
<td><a href="https://github.com/CHH/phpenv">CHH/phpenv</a></td>
<td>rbenvにパッチをあててPHP用に修正する<b>ただのスクリプト</b>。  
ビルド機能はないので、通常php-buildをプラグインとして併せて使う。<br>
<a href="https://github.com/travis-ci/travis-cookbooks/tree/master/ci_environment/phpenv">Travis-CIでも使われている</a>。
</td>
</tr>

<tr>
<td><a href="https://github.com/php-build/php-build">php-build/php-build</a></td>
<td>
phpをビルドするbashスクリプト。phpenvのプラグインとしても、これ単独でも使える。<br>
旧リポジトリ: github.com/CHH/php-build
</td>
</tr>

<tr>
<td><a href="https://github.com/laprasdrum/phpenv">laprasdrum/phpenv</a></td>
<td>最初からrbenvにCHH/phpenvのパッチをあてた状態にして、git cloneするだけでセットアップ完了できるようにしたもの。<a href="https://github.com/riywo/anyenv">riywo/anyenv</a>で採用されているが、更新が止まっている。
</td>
</tr>

<tr>
<td><a href="https://github.com/phpenv/phpenv">phpenv/phpenv</a></td>
<td>CHH/phpenvとは別物で、rbenvからのフォークのようだが、<b>2年前から更新が止まっている</b>。</td>
</tr>

<tr>
<td><a href="https://github.com/phpbrew/phpbrew">phpbrew/phpbrew</a></td>
<td>ビルド機能も付属し、extensionのインストールも細かく指定できて高機能。しかしPHPに依存しているので、ゼロからPHPをインストールするためには使えない。<br>
旧リポジトリ: github.com/c9s/phpbrew
</td>
</tr>

<tr>
<td><a href="https://github.com/virtphp/virtphp">virtphp/virtphp</a></td>
<td>pythonのvirtualenvを模したモノ、と説明にあり、PHPに依存する。php-buildと連携することもできるらしい。<br>
使ったことがないので詳しく語れない。</td>
</tr>

<tr>
<td><a href="https://github.com/kawahara/php-nabe">kawahara/php-nabe</a></td>
<td>単独でphp-build+phpenv相当の機能を有するbashスクリプト。よさげなんだけど、phpenvで満足して使わなくなってしまった…</td>
</tr>

</table>

## 結局どれを使えばいいの？

まあ、好きなのを使えばいいと思うんだけど、個人的にはTravisが採用している安心感から、CHH/phpenv+php-buildに落ち着いた。php-buildは「CHH/php-build」から「php-build/php-build」にリポジトリが移転しているので、そこだけ気を付ければ先人たちの記事を参考にインストールできると思う。

- [phpenv+php-build環境の構築と運用 - hnwの日記](http://d.hatena.ne.jp/hnw/20120828)

phpenv+php-buildの微妙なところは、コマンドが分かれているので初回セットアップが面倒な点だけど、最近はAnsibleやChefでインストール手順をまとめるのも簡単なので、気にならなくなった。
Android2系でscript読み込みが失敗するとwindow.onerrorハンドラが実行される

タイトルが全てです。以下補足です。

Android2系に限ってscriptタグが失敗するとwindow.onerrorが発生します。

(Android2系の情報は今更感ありますが…。)

```html
<head>
<script>
window.onerror = function(){
  alert('window onerror'); // Android2の場合のみ実行される
}
</script>
<script src="noexist.js"></script> <!-- 存在しないjsファイル -->
</head>
```

動的にscriptタグを追加した場合も同様です。

```js
window.onload = function() {
	var head = document.getElementsByTagName('head')[0];
	var script = document.createElement('script');
	script.setAttribute('src', 'noexist.js');
	script.onerror = function(){
		alert('script onerror'); // どのブラウザでも実行される
	}
	head.appendChild(script);
}
window.onerror = function(){
	alert('window onerror'); // Android2系のみ実行される
}
```

scriptタグの読み込み失敗時にwindow.onerrorが実行されるのは自然のようにも思えますが、Android3系からは他のブラウザに合わせたのか、window.onerrorは実行されなくなったようです。
【phpMyAdmin】テーブル内容が表示されない

ググっても出てこなかったので自分のところだけのレア事象かもしれない。

##事象
・あるテーブルを選択しても該当テーブルの内容が表示されない（表示内容が変わらない）。表示メニューを選択しても開けない。

・テーブルを右クリック「新しいタブで開く」で開くと表示される。

##原因・修正
「新しいタブで開く」で開くと、XXXXXの箇所が文字化けしていた。この文字化けが原因。

 Showing rows 0 - 24 (8929 total, クエリの実行時間 0.0002 秒) [カラム名: XXXXX - XXXXX]

どうやらソート対象のカラムと値がここに表示されるようなので、ソート対象を変更。これで表示できるようになった。

ちなみに、閉じる前のソート結果が保存される模様。
文字列の列で（全て文字化けするわけでもないようだが）ソートしてそのまま閉じないようにする。（本質的には、文字化けの対策を行うべきだけど、そこまで時間さけないので）
iPhone6の時代のviewport設定について


従来、スマートフォンの横幅といえば **320px(retina対応で640px)** というのが定説でした。
が、iPhone6の普及でそうとも言えなくなってきたのが今日このごろです。

- iPhone5の横幅は320px(retina対応で640px)
- iPhone6の横幅は375px(retina対応で750px)
- ちなみにNexus5の横幅は360px(retina対応で720px)

さてこんな環境で、viewportはどう指定するのがベストなのでしょうか。

## 前提知識
- viewportの`width`という値に、`device-width`と指定すると、スマホの画面幅 = 表示するwindowサイズ、となる。
- `width`にピクセル値（640px、とか）を入れると、表示幅はそのピクセル数になり、それで画面いっぱいになるように適宜拡大縮小される
- 古いAndroidでは、`width`にピクセル値を指定しても **そもそも効かない端末がある** 。
- 古いAndroidでは、`user-scalable`という値が`1`になっていると、拡大縮小のUIが出てきてカッコ悪いので、できれば`user-scalable=0`を書いておきたい
- が、同様に古いAndroid端末の一部では、`user-scalable`を記述すると **`width`のピクセル指定を無視してきやがる** 時がある。
- widthにピクセル値を指定するパターンでは、普通にやるとシェアボタン等が小さくなってかなしい。


## 4つのタイプ

### 320px・余白調整
- [サンプル](http://sandbox.fnobi.com/viewport.html?margin-320)
- コンテンツ幅320px
- デザインは横640pxで作ってもらう
- retina対応はCSSだけで行う
- 画面がもっと広い時は余白を増やす
- 画面がもっと狭い時（※ほぼありえない）はコンテンツ幅自体減らす or トリミング
- iPhone5・多くのAndroid端末でジャストサイズ
- `<meta name="viewport" content="width=device-width,user-scalable=0">`

### 375px・余白調整
- [サンプル](http://sandbox.fnobi.com/viewport.html?margin-375)
- コンテンツ幅375px
- デザインは横750pxで作ってもらう
- retina対応はCSSだけで行う
- 画面がもっと広い時は余白を増やす
- 画面がもっと狭い時はコンテンツ幅自体減らす or トリミング
- iPhone6でジャストサイズ
- `<meta name="viewport" content="width=device-width,user-scalable=0">`

### 640px・拡大縮小
- [サンプル](http://sandbox.fnobi.com/viewport.html?scale-640)
- コンテンツ幅640px
- デザインは横640pxで作ってもらう
- 画像は普通にあてればretina対応になる
- それを画面幅に合わせて拡大縮小
- iPhone5・多くのAndroid端末でジャストサイズ
- `<meta name="viewport" content="width=640px">`

### 750px・拡大縮小
- [サンプル](http://sandbox.fnobi.com/viewport.html?scale-750)
- コンテンツ幅750px
- デザインは横750pxで作ってもらう
- 画像は普通にあてればretina対応になる
- それを画面幅に合わせて拡大縮小
- iPhone6でジャストサイズ
- `<meta name="viewport" content="width=750px">`


## で、どれがベスト？

個人的には、「 **375px・余白調整** 」で組むのがベストだと思っています。
スマートフォンで想定しうるすべてのサイズを網羅してますし、widthのピクセル値指定が効かない端末がある以上、`device-width`を使うのが基本的にはよいのではないかと。
またシェアボタンが小さくなってしまう点についても、スマホでのみscaleをかけるなどの手段で埋め合わせできるのですが、「見えるけど押せない」等々の事例もよくききます。

てなわけでエンジニアの皆さん、基本的には **width=device-width** を使うようにしましょう！
ほいでもってデザイナのみなさま、スマホサイトは **640pxまでコンテンツ幅減らす想定をしつつ、横750pxでデザイン** して頂けると助かります。

## 参考
- [これがスマートフォン向けサイトを作るときの viewport 設定３パターンだ - てっく煮ブログ](http://tech.nitoyon.com/ja/blog/2013/02/15/viewport/)
pixi.js (V3) テクスチャの重なり順を入れ替える

CSSでDOM要素の重なり順を入れ替えるには、z-indexを使用すると思いますが、
pixiでは、(canvasでは)テクスチャの重なり順を入れ替えるメソッドや、z-indexのようなプロパティは存在しません。

テクスチャの重なり順は、コンテナに追加した順になります。
後から追加したほうが上になるという仕様です。

上記を踏まえ、下記のように処理すれば、重なり順を入れ替えることが可能です。

````texturetest.js
       //レンダラの生成
       var renderer = PIXI.autoDetectRenderer(1920,1080,{backgroundColor:0xFFFFFF});
       //DOMにレンダラを追加
       document.getElementById("pixitest").appendChild(renderer.view);
       
       //コンテナを作成
       var container=new PIXI.Container();
       //テクスチャ(Splite)保持用
　　　　 var textures={};
       //画像を読み込み
        PIXI.loader
                .add('1.png','./img/1.png');
                .add('2.png','./img/2.png');
        .load(function(loader,resources){
             //Spriteを生成してコンテナのx=0,y=0に追加していきます
             $.each(resources,function(name,resource){ //(jquery)
                   //Spriteを生成
                   var sprite=new PIXI.Sprite(resource.texture);
                   //x=0,y=0の位置に配置
　　　　　　　　　　 sprite.position.x = sprite.position.y = 0;
                   //コンテナに追加
                   container.addChild(sprite);
                   //あとで重なりを入れ替えるために保持しておく
                   textures[name]=sprite;　　　　　　
                   
             });
             //コンテナを描画。この時点では1.pngが下になります。
             renderer.render(container);  

        });

       //最初に追加した画像を上に表示する
       textureToTop('1.png');

       //指定したテクスチャを一番上に表示する
       function textureToTop(name){
             //作成したテクスチャ(sprite)の取得
             var texture= textures[name];
             //コンテナから削除する
             container.removeChild(texture);
             //コンテナに追加する
             container.addChild(texture);
　　　　　　　//コンテナを描画
             renderer.render(container); 
       }
````

以上、コンテナから削除、追加しなおしをすれば一番上になるというやり方でした。
ただ、これだと3つ以上の重なりを制御するのが面倒ですかね・・

もっといいやり方をご存じの方はコメントください。
CakePHP3のPaginator独自タグの設定が楽になった！

#CakePHP3のPaginator独自タグの設定が楽になった！

CakePHPにはデフォルトでPaginatorの機能がついていますが、そこで出力されるタグがデザインのページャと合わないことはよくあると思います。

##CakePHP2では・・・

```
<div class="paging">
    <?php echo $this->Paginator->prev('< 前', array('tag' => 'span'), null, array('class' => 'disabled')); ?>
    <?php echo $this->Paginator->numbers(array('tag' => 'span','before' => ' ','after' => ' ','separator' => '  ','modulus' => 4)); ?>
    <?php echo $this->Paginator->next('次 >', array('tag' => 'span'), null, array('class' => 'disabled')); ?>
</div>

```
こんな感じで引数に色々設定することである程度設定可能でした。

でも、限界があってデザインに合わせるために結局PaginatorHelperを継承した独自のヘルパーを作成する羽目になることなってよくありましたよね・・・

##CakePHP3では！

こんな感じで設定可能です。

###/config/paginator-templates.php
```
<?php
return [
    'nextActive' => '<span class="next"><a rel="next" href="{{url}}">{{text}}</a></span>',
    'nextDisabled' => '<span class="disabled">{{text}}</span>',
    'prevActive' => '<span class="prev"><a rel="prev" href="{{url}}">{{text}}</a></span> | ',
    'prevDisabled' => '<span class="disabled">{{text}}</span> | ',
    'number' => '<span><a href="{{url}}">{{text}}</a></span> | ',
    'current' => '<span class="current">{{text}}</span> | ',
];

```

###Controller
```
    public $helpers = [
        'Paginator' => ['templates' => 'paginator-templates']
    ];
```

###View
```
<div class="paging">
    <?= $this->Paginator->prev('<< ' . __('prev')); ?>
    <?= $this->Paginator->numbers(); ?>
    <?= $this->Paginator->next(__('next') . ' >>'); ?>
</div>
```


[参考](http://book.cakephp.org/3.0/en/views/helpers/paginator.html)



デフォルトの設定がコアのPaginatorヘルパーに設定されていますので、それを参考に独自でタグを設定するといいでしょう。

これでデザイナーさんからCakeにあわないようなデザインのページャが来ても安心！
Rails CarrierWaveを使ってみた

[Rails 超お手軽な画像アップローダー CarrierWave の使い方]
(http://www.workabroad.jp/tech/1118)
を参考にcarrierwaveを実装しました。

**注意点**
＊ImageMagickのインストールに関して
yumでインストール出来ない（Macにデフォルトでyumはない）

[MacでImageMagickがインストールできない問題]
(http://tkoyama1988.hatenablog.com/entry/2014/11/11/233943)
を参考にして
$ brew install libpng
$ brew install imagemagick
brew link は単に有効化。ここではinstallを使った。
これでオーケー。

登録される画像の場所
/public/uploads/user/image

no_image等の画像はここに入れる
/app/assets/images

##新規登録時のプロフィール画像を設定
/views/devise/registrations/new.html.erbに

```erb
<div class="field">
<%= f.label :image %><br />
<%= f.file_field :image %>
</div>  
```   
を追記して、新規登録時にプロフィール画像の設定を追加。

app/controllers/application_controller.rbに

```rb
def configure_permitted_parameters
end
```
の中に

```rb
devise_parameter_sanitizer.for(:sign_up) << :image
```
を追加。


##プロフィール画像の編集設定
下記を追記。

```erb:/views/devise/registrations/edit.html.erb
<div class="field">
<%= f.label :image %><br />
<%= f.file_field :image %>
</div>
```

```rb:app/controllers/application_controller.rb

def edit
super
end

def update
super
end

private

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:account_update) do |u|
    u.permit(:name, :email, :password, :password_confirmation, :current_password, :image)
  end
end
```