OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel4, Eloquentはcomposite keyに対応していない

Laravel4でEloquentを使用していたらデータの挿入でハマったのでメモっておく
http://laravel4.kore1server.com/docs/queries
http://laravel4.kore1server.com/docs/eloquent
http://stackoverflow.com/questions/17461383/how-can-i-update-data-with-eloquent-without-id-in-laravel-4

#composite keyのテーブル作成

```
:~/laravel_test$ php artisan migrate:make create_hogefuga_table
Created Migration: 2014_09_24_212126_create_hogefuga_table
Generating optimized class loader
Compiling common classes
Compiling views
```

```create_hogefuga_table.php
	・・・
	public function up()
	{
		//
		Schema::create('hogefuga',function($table)
		{
			$table->integer('hoge');
			$table->integer('fuga');
			$table->integer('bar');
			$table->timestamps();
			$table->primary(array('hoge','fuga'));
		});
	}

	public function down()
	{
		//
		Schema::drop('hogefuga');
	}
```

```
| hogefuga | CREATE TABLE `hogefuga` (
  `hoge` int(11) NOT NULL,
  `fuga` int(11) NOT NULL,
  `bar` int(11) NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`hoge`,`fuga`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
```

#モデルの作成
Eloquentでは主キーがidでない場合は上書きして設定するので以下のようにarrayを入れておく

```Hogefuga.php
class Hogefuga extends Eloquent{
      
      protected $table = 'hogefuga';
      protected $primaryKey = array('hoge','fuga');

      public function get_by_pkey($hoge,$fuga)
      {
	$hogefuga_rec = $this->where('hoge','=',$hoge)->where('fuga','=',$fuga)->get();
	return $hogefuga_rec;
      }

      public function insert_data($hoge,$fuga,$bar)
      {
	$this->hoge = $hoge;
	$this->fuga = $fuga;
	$this->bar = $bar;
	$this->save();
      }

}
```

#Routeの作成

```
Route::get('hogefuga_insert/{hoge}/{fuga}/{bar}','Hogefugabar@insert_call');
Route::get('hogefuga_look/{hoge}/{fuga}','Hogefugabar@rec_dump');
```

#Controllerの作成

```Hogefugabar.php
class Hogefugabar extends BaseController{

      public function insert_call($hoge,$fuga,$bar)
      {
	$HogefugaModel = new Hogefuga;
	$HogefugaModel->insert_data($hoge,$fuga,$bar);

	return 'inserted!';
      }

      public function rec_dump($hoge,$fuga)
      {
	$HogefugaModel = new Hogefuga;
	$recs = $HogefugaModel->get_by_pkey($hoge,$fuga);

	return $recs[0]->hoge;
      }

}
```

#レコードを入れてみる
laravel.dev:8080/hogefuga_insert/10/3/3
とかURL指定してテーブルにレコードを挿入しようとすると
something went wrongと怒られる。
しかしDBを直接見てみるとレコードは挿入されている
laravel.dev:8080/hogefuga_look/10/3にアクセスするとデータの取得は出来る

app/storage/logs/laravel.logを見てみると

```
... production.ERROR: exception 'ErrorException' with message 'PDO::lastInsertId() expects parameter ...
```
みたいなことを言われている。
Eloquentがcomposite keyに対応していないので起こるようだ。
テーブルの主キーが単一でないと今のところは$this->save()とかやってはいけないようだ。

というわけでクエリービルダーを使用してレコードを挿入するようにする

```Hogefuga.php
      public function insert_data($hoge,$fuga,$bar)
      {
	$data = array('hoge'=>$hoge,'fuga'=>$fuga,'bar'=>$bar);
	DB::table($this->table)->insert($data);
      }
```
パラメータを変えてアクセスすると、今度はエラーが無くデータを入れることができた
foreach の registerDoSEQ() について #rstatsj

大仏様の
[foreachパッケージで、並列化する/しないを綺麗に書き分ける](http://d.hatena.ne.jp/teramonagi/20140923/1411427677)
を読んで、私がよく使っている registerDoSEQ() について書き留めておこうと思った。

例えば、次のようなコードがあったとして

```r
cl <- makeCluster(detectCores())
registerDoParallel(cl)
foreach(i = 1:3) %dopar% {
  sqrt(i)
}
stopCluster(cl)
```

デバッグしたいときには並列化を解除したくなったりする。で、こう

```r
# cl <- makeCluster(detectCores())
# registerDoParallel(cl)
foreach(i = 1:3) %do% {
  sqrt(i)
}
# stopCluster(cl)
```

書き換えたりするのはめんどくさい。

そこで、`registerDoSEQ()` という関数があって、これは `registerDoParallel()` の代わりに使うと `foreach` を強制的に並列化解除してくれる。

これで並列化を切り替えたいときには、デバッグフラグ `debug` を用意して次のように書けばよい。

```r
debug <- TRUE

if(debug) {
  cl <- makeCluster(0)
  registerDoSEQ()
} else {
  cl <- makeCluster(detectCores())
  registerDoParallel(cl)
}
foreach(i = 1:3) %dopar% {
  print(i) # debug print
  sqrt(i)
}
stopCluster(cl)
```

ポイントは `%dopar%` を `%do%` に書き替えなくてもいいということだ。
これで並列化の切り替えを自由に行えるようになった。

ご参考まで。

### 関連記事

- [R の foreach で並列処理するとき on.exit() が便利](http://qiita.com/hoxo_m/items/f08b015bc9897d98775d)
- [R の foreach で並列処理するとき、クラスタを implicit にする](http://qiita.com/hoxo_m/items/02b82d44a09752509dc3)
- [R の foreach で並列処理するときに乱数を固定する](http://qiita.com/hoxo_m/items/6dfd7def6574fd485a6c)
- [R の foreach を自分用にカスタマイズする](http://qiita.com/hoxo_m/items/f3a3a27a9aa2fa9f7813)
- [foreach の .multicombine 引数について](http://qiita.com/hoxo_m/items/b2bdb25d60f1e806010d)
ClojureでBMI計算

clojureを思い出すために、どうでもいいコードを書く。

```clj:bmi
;; BMI計算式
(defn calc-bmi [height weight]
  (/ weight (* height height)))

(let [height 1.78 weight 52]
  (calc-bmi height weight))
```

なお、痩せ過ぎな模様
golang で S3 に大量ファイルを並列でアップロードする


概要
====

s3関連のコマンドは色々と既存のものがありますが、
javaだったり、rubyだったり、なんだかんだインストールが面倒。
大量のファイルをS3にアップロードするのに随分と時間がかかる。
複数のファイルを並列でアップロードできたらイイなというのと、
golangならインストールも実行ファイル1つだけで済むしなぁ・・・
という思いから、golangを使って「エイや！」で作って
とりあえず、動くものができました。-> https://github.com/masahide/s3cp


golangでAWS APIを使うには
=======================

goamzを使えばよさそうです。

しかしgithub上にgoamzの[forkが一杯](https://github.com/search?utf8=%E2%9C%93&q=goamz
)あり、どれが良いのか迷います。
今回は星の数等から github.com/crowdmob/goamz を選択しました。


s3へのアップロード
===============

goamzを使えば簡単です。

https://github.com/golang-samples/goamz/blob/master/s3/simple/main.go
こちらのサンプルが分かりやすいですが、もっと省略して書くと

```go:
data := []byte("Hello, Goamz!!")

auth, _ := aws.EnvAuth()
s := s3.New(auth, aws.APNortheast)
bucket := s.Bucket(bucketName)
bucket.Put("path/to/sample.txt", data, "text/plain", s3.Private, s3.Options{})
```
こんな感じでしょうか。
しかし、このままだと、
メモリ上にファイルを全部読み込むことになるので、少し工夫して`PutReader`を使います。

```go:
file, _ = os.Open("path/to/sample.txt")
defer file.Close()
fileinfo, _ = file.Stat()
bucket.PutReader("path/to", file, fileinfo.Size(), "application/octet-stream", s3.Private, s3.Options{})

```
これで、io.Readerを使ってくれるようになるので、メモリにファイルを読み込む必要がありません。


並列化
=====

これに関しては「goroutineを使う」で終わりそうなんですが、
前から興味があった「[Advanced Go Concurrency Patterns](http://talks.golang.org/2013/advconc.slide)」に出てくるような「[チャンネルのチャンネル](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#safe=off&q=golang+channel+%E3%82%92%E9%80%81%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B+channel)」を使った実装に挑戦してみました。
調べてみると、[ちょうど良さそうな記事](http://nesv.github.io/golang/2014/02/25/worker-queues-in-go.html)が見つかったので、この実装を真似て、簡単なqueueとworkerを実装しました。 

https://github.com/masahide/s3cp/blob/queueworker/queueworker/queueworker.go

参考の元記事にあるコードほぼそのままなんですが、
queueからworkerにworkを渡すディスパッチャーで [goroutineを使っている部分](https://github.com/masahide/s3cp/blob/queueworker/queueworker/queueworker.go#L142)に若干手を加えました。

この部分は、WorkQueueにworkを投げ込まれたら、すぐに無条件でgoroutineを起動することで、WorkQueueを常に空っぽに保つようになっています。
元記事ではgoroutineのコストが安いからこうしているようなことが書かれている(多分)のですが。
このままだと投げ込まれたworkの数だけgoroutineが起動する形になるので、メモリがある限りworkを受け付けてしまい、
最悪メモリ等のリソースが枯渇しそうな気がします。
幸い今回は、WorkQueueが一杯になって「待ち」が発生しても問題がありません。

というわけで、ここのgoroutine化を辞めることで、WorkQueueが一杯になったらWorkerが飽くまで待つようにしました。


追記
====

WorkQueueとWrokerQueueの残り数をカウントして処理の終了を確認しているのだけど、[WorkQueueを受け取ってWorkerQueueを受け取る部分](https://github.com/masahide/s3cp/blob/queueworker/queueworker/queueworker.go#L143)で、一瞬両方空としてカウントしてしまう瞬間が生まれそう?
なので、[Goでのパイプラインとキャンセル](http://qiita.com/sudix/items/f95ef0e5bbd0cd3d4378)で実装するのが正しそう。


追記 2014/10/13
===============


[Goでのパイプラインとキャンセル](http://qiita.com/sudix/items/f95ef0e5bbd0cd3d4378)をつかった実装に修正しました。
thread_local修飾子

systemdでは`thread_local`修飾子が使われている。`thread_local`は、C11で導入された、スレッドローカルな変数を定義するための修飾子である (参考: [C11: A New C Standard Aiming at Safer Programming](http://blog.smartbear.com/codereviewer/c11-a-new-c-standard-aiming-at-safer-programming/))。

とはいえ、かなり新しいコンパイラでないとサポートしていないので、systemdでは以下のようなマクロを定義して、サポートしていないコンパイラでは古い修飾子を使うようにしている。

```c:src/shared/macro.h
/* Define C11 thread_local attribute even on older gcc compiler
 * version */
#ifndef thread_local
/*
 * Don't break on glibc < 2.16 that doesn't define __STDC_NO_THREADS__
 * see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53769
 */
#if __STDC_VERSION__ >= 201112L && !(defined(__STDC_NO_THREADS__) || (defined(__GNU_LIBRARY__) && __GLIBC__ == 2 && __GLIBC_MINOR__ < 16))
#define thread_local _Thread_local
#else
#define thread_local __thread
#endif
#endif
```

systemdでは主にstaticローカル変数で`thread_local`を使っている。staticローカル変数を使いつつ、スレッドセーフを実現するためだと思われる。

例えば、[inhibit_what_to_string](http://cgit.freedesktop.org/systemd/systemd/tree/src/login/logind-inhibit.c#n409) というユーティリティ関数がある。

```c:src/login/logind-inhibit.c
const char *inhibit_what_to_string(InhibitWhat w) {
        static thread_local char buffer[97];

        if (w < 0 || w >= _INHIBIT_WHAT_MAX)
                return NULL;

        p = buffer;
        if (w & INHIBIT_SHUTDOWN)
                p = stpcpy(p, "shutdown:");
        if (w & INHIBIT_SLEEP)
                p = stpcpy(p, "sleep:");

        /* snip */

        return buffer;
```

エラーコードに従ってエラーメッセージのための文字列を返すのだが、static `thread_local`ローカル変数の文字列バッファを使っているので、呼び出し側は文字列を解放しなくても良い。しかも、スレッドセーフである。
Twilioなら電話の保留機能も簡単に実装可能です。

本ブログではTwilioを使って電話の保留機能を実装してみたいと思います。
今回のブログでも複数の機能を組み合わせて「電話の保留」機能を実装してみたいと思います。
オペレーターがかかってきた電話を対応する際に他の部署や担当に電話を回す作業で良く使われています。
本ブログではその機能をTwilioを使って実装してみたいと思います。 

<h3>今回使うTwilioの機能</h3>
■ 通話の更新：update
Twilioの機能には「update」というのがあります。
この機能は成立されている通話の処理を他の処理に切り替える事が可能な機能です。
通話中のCall SIDを使って他の電話に<Dial>したり案内メッセージ、音声ファイルを再生したり、プッシュ音により入力をもらったりなど様々なTwilioの機能を実装することが可能です。

■ 待機ルームを生成します。：<Enqueue>

■ 待機ルームでコールを管理します。：<Queue>
TwilioのQueueは該当通話を待機させます。

<h3>まず、保留ルームを生成します。</h3>
下のコードで、「supportRoom」というキューのルームを生成します。 

```xml:twiml-enqueue.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-jp">少々お待ちください。</Say>
  <Enqueue waitUrl="twiml-play.xml">supportRoom</Enqueue>
</Response>
```

<Dial>の<Queue>を使って、生成されたルーム「supportRoom」に電話をかけます。

```xml:twiml-enqueue.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-jp">supportRoomにお繋ぎします。</Say>
  <Dial>
    <Queue>supportRoom</Queue>
  </Dial>
</Response>
```

<h3>CallSidの取得と通話のアップデート。</h3>
Twilioは通話中の電話の処理を更新することが可能です。
下のコードを通話を更新するタイミングで実行しますと、8行目に設定されている、CallSidのコール（通話）が更新されます。

```php:twiml-call-update.php
<?php
  require_once('../Services/Twilio.php'); // Loads the library
 
  $sid = "ACxxxxxxxxxxxxxxx"; // Twilio Account Sid
  $token = "yyyyyyyyyyyyyyy"; // Twilio Auth Token
  $client = new Services_Twilio($sid, $token);
 
  $call = $client->account->calls->get("CAxxxxxxxxxyyyyyyyyyy"); // Call Sid
  $call->update(array(
    "Url" => "http://xxx.xxx.xxx.xxx/twiML/twiml-say.xml",
    "Method" => "POST"
  ));
  echo $call->to;
```

 CallSidはこのように取得することが可能です。
通話が生成された時点でTwilioはCallSidを発行することになっています。
そのCallSidを使いますと、履歴の取得はもちろん、今の状態や上記の通話更新も可能です。

```php:twiml-get-call.php
<?php
  require('../Services/Twilio.php');
 
  $account_sid = "ACxxxxxxxxxx"; // Twilio account sid
  $auth_token = "yyyyyyyyyyyyy"; // Twilio auth token
 
  $client = new Services_Twilio($account_sid, $auth_token);
 
  $call = $client->account->calls->create(
    '+8150xxxxyyyy', // Twilio電話番号
    '+8180xxxxyyyy', // 発信先電話番号
 
    'http://xxx.xxx.xxx.xxx/twiML/twiml-say.xml'
  );
  print $call->sid;
 ```

こんな流れです。
① ユーザーが050番号に電話をかけます。
② オペレーターAがその電話を対応します。
③ ユーザーからの内容を聞いて担当に繋ぐためにウェブ画面に表示されている「保留」ボタンをクリックする又は担当を選択し「通話転送」ボタンをクリックします。
④ 指定した担当に電話を転送し、ユーザーと担当が通話を継続する。
C#でがんばってみる

なんか流行ってるらしいんでC#でやってみた
->[今日も1日がんばるぞい！](http://qiita.com/giiko_/items/8c3442e8e7a83cc0b91a)
LINQ使って書いてみたかっただけ

```C#:ganbaru.cs
using System;
using System.Linq;

namespace zoi
{
    class Ganbaru
    {
        static void Main(string[] args)
        {
            string[][] dic = new string[][]{
                                new string[]{"今日","ぞい"},
                                new string[]{"も"},
                                new string[]{"１","ぞい"},
                                new string[]{"日","ぞい"},
                                new string[]{"がん","ぞい"},
                                new string[]{"ばる","ぞい"},
                                new string[]{"ぞい！"}
                            };
            int count = 0;
            string message;
            Random rand = new Random();
            do{
                message = dic.Select(
                    (lst)=>{
                        return lst[rand.Next(0, (lst.Length))];
                    }).Aggregate((s1,s2)=>s1+s2);
                Console.WriteLine(message);
                count++;
            }while(message != "今日も１日がんばるぞい！");
            Console.WriteLine("★がんばるまで {0} zoiでした★",count);
        }
    }
}
```
LINQの理解が深まって良かったです（小並感
OGP画像サイズ

**OGPの画像サイズについて、社内でよく質問されるのでメモ。**
・1200×630 px以上推奨（縦横比をなるべく1.91:1に近づける）
・最低でも 600×315
・最小サイズは 200×200

**（参照）**
・OGP画像シミュレータ | og:image Simulator
http://ogimage.tsmallfield.com/
・公式：「Object Properties」の表を参照
https://developers.facebook.com/docs/opengraph/creating-custom-stories#objecttypes
OculusRiftデモ用キューブ型持ち歩き用マシン（持ち歩けるかは根性次第

今後自分自身で色々デモをする機会が増えてくると思われるので、ゲーミングPCとして
なるべく小さく（持ち運び可能）、安上がりで済むデスクトップマシンを考えてみた。

価格は全部価格.comの最安値から端数を切り上げ。尚DVDドライブは軽量化の為無し。

ケース・マザー・電源はベアボーン。
http://kakaku.com/item/K0000690989/
23000円

CPU：Core i5 4460
http://kakaku.com/item/K0000651194/
19000円

OS：DSP版Windows7
http://kakaku.com/item/K0000614508/
10400円

SSD：256G
http://kakaku.com/item/K0000660265/
12000円

メモリ：8G
http://kakaku.com/item/K0000347976/
8100円

グラボ：2スロットの750ti
http://kakaku.com/item/K0000625234/
14800円

合計：87300円
重量：5キロ以下

ご参考まで。近々この構成で作ってみようと思います。

ちなみに、Alienware Alphaと言う選択肢もあります。持ち歩きはそっちが断然便利。
ですが、音声出力が光角型だけなのでそこだけは注意。
Railsの rake db コマンドリスト

### 実行されてないmigration

```
$ rake db:abort_if_pending_migrations
```

### データベースの文字コード

```
$ rake db:charset
```

### データベースの照合順序

```
$ rake db:collation
```

### database.ymlの内容でデータベースを作成

```
$ rake db:create
```

### database.ymlに定義してあるデータベースを全て作成

```
$ rake db:create:all
```

### createの逆

```
$ rake db:drop
```

### create:allの逆

```
$ rake db:drop:all
```

### migrationを指定STEP数だけやりなおす
- STEPの指定はSTEP=nで

```
$ rake db:migrate:redo
```

### drop、create、migrate全てやる

```
$ rake db:migrate:reset
```

### drop、create、schema.rbから復帰させる

```
$ rake db:reset
```

### migrationのバージョンをSTEP=nで戻す

```
$ rake db:rollback
```

### 現在のマイグレーションのバージョン

```
$ rake db:version
```

* * *


## 追記 2018/08/27

一番使うであろうコマンドが漏れてた！！！

### 未実行のマイグレーションファイルを全て実行する

```
$ rake db:migrate
```

## 追記 2020/01/16

@kuboon さんからコメント頂きました！あざーす！

### アプリケーションのDB周りの初期設定
```
$ rake db:setup 
```

以下の３つのコマンドを実行してくれる
1. rake:db:create 
2. rake db:schema:load
3. rake db:seed

## 関連記事

- [rbenvでRubyのバージョン管理](https://caramelcase.com/aws-rbenv-ruby/)

- [anyenvでRuby/PHPのバージョンを一元管理！](https://caramelcase.com/anyenv-rubyenv-phpenv/)

- [Railsで簡単にグラフを作成できるgemをご紹介](https://caramelcase.com/rails-graph-chartkick/)

- [Amazon EC2 初期設定 | AmazonLinuxを立ち上げたら最初にすべき10の設定 (sshログイン〜ec2-userの削除まで)](https://caramelcase.com/aws-ec2-init/)

- [AWS上でNginxを使ってWordPressの環境構築 | EC2 + WordPress + Nginx + PHP7 + Mysql5.6](https://caramelcase.com/wordpress-aws-ec2-nginx-php7-mysql/)
Hadoop を使った基盤地図情報の GeoJSON タイル変換

Hadoop を使った基盤地図情報の GeoJSON タイル変換については、数値標高データに限ってですが、ひととおり落ち着いたため、はてなブログにシェアしました。
http://hfu.hatenablog.com/entry/2014/09/24/222730
今後はベクトルデータの変換ができるようにしていきます。
iPhone 6 plus 上の Safari で box-shadow が効かない

# iPhone 6 plus で box-shadow が効かない

iPhone 6 plus 上の Safari で box-shadow が効いていなかったので検証。

## 結果

以下、[DEMO](http://jsdo.it/forty4_jp/box-shadow)をキャプチャしたもの。（見やすいように画像は加工済）

![box-shadow.png](https://qiita-image-store.s3.amazonaws.com/0/39392/3858bd42-a477-4f08-a9cd-f1d2cec957f7.png)

ブロック要素 `<div>` も画像 `<img>` も以下どちらかの指定がないと効かない。

* background-color
* border-radius

上記以外は検証していないので、他にもトリガーとなるものはあるかも。
また、検証した限り、iPhone 6 plus 上の Safari 以外ではこの現象は見当たらない。

DEMO
http://jsdo.it/forty4_jp/box-shadow

---

memo
'Mobile/12A365' と 'Mobile/12A366' という違いは何を表しているんだろ？（調べてないです）

iPhone 6 user agent
Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A365 Safari/600.1.4

iPhone 6 plus user agent
Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A366 Safari/600.1.4
Elixir 基本オペレータ

# Elixir 基本オペレータ

## 概要
Elixir の基本オペレータについて

## arithmetic operators

~~~
iex(1)> 1+2
3
iex(2)> 2-1
1
iex(3)> 2*3
6
iex(4)> 2/3
6.66666666666666629659e-01
~~~

## manipulate lists

~~~
iex(1)> ary = [1,2,3]
[1,2,3]
iex(2)> ary ++ [4,5]
[1,2,3,4,5]
iex(3)> ary -- [2,4]
[1,3]
~~~

## string concatenation 
文字列結合。これはちょっと変わってますね。

~~~
iex(1)> "hello" <> ", world"
"hello, world"
~~~

## Boolean のみの真偽判定
and, or, not を利用する

~~~
iex(1)> true and true
true
iex(2)> true and false
false
iex(3)> true or false
true
iex(4)> false or false
false
iex(5)> not true
false
iex(6)> not false
true

# and, or は Boolean に対してのみ利用可能
iex(7)> 1 and true
** (ArgumentError) argument error: 1
    :erl_eval.expr/3
~~~

## Boolean 以外も含むの真偽判定
&& , || , ! を利用する

~~~
iex(1)> true && true
true
iex(2)> true && false
false
iex(3)> false && true
false
iex(4)> 1 && true
true
iex(5)> true && 1
1
iex(6)> true || false
true
iex(7)> false || true
true
iex(8)> 1 || true
1
iex(9)> 1 || false
1
iex(10)> false || 1
1
iex(11)> true || 1
true
iex(12)> nil || 1
1
iex(13)> 1 || 1
1
iex(14)> 1 || 2
1
iex(15)> 0 || 2
0
iex(16)> !1
false
iex(17)> !nil
true
iex(18)> !""
false
iex(19)> !true
false
iex(20)> !false
true
~~~

## 比較
同値比較 : ==
同一比較（より厳密に比較） : ===
未満 : <
以下 : <=
以上 : >=
超過 : >

~~~
iex(1)> 1==1
true
iex(2)> 1==1.0
true
iex(3)> 1===1.0
false
iex(4)> 1<1
false
iex(5)> 1<2
true
~~~
vagrant上のmysqlにSequelProで接続する

忘れないため、メモります。



1. 新規の接続を作成
2. 「SSH」タブに切り替える

以下、デフォルトの設定になります。
必要に応じて設定を変更して下さい。

```
MySQL ホスト：127.0.0.1
ユーザー名：mysqlに追加したユーザー名
パスワード：mysqlに追加したパスワード
ポート：3306
```

```
SSH ホスト：127.0.0.1
SSH ユーザ：vagrant
SSH パスワード：vagrant
SSH ポート：2222
```

お疲れ様でした♪
Elixir 'hello, world' (using vagrant)

# Elixir 'hello, world' (using vagrant)

## 概要
関数型言語 Elixir 環境を Vagrant で作成して hello, world する

## 前提
* OS : Fedora18

## 手順
### Vagrantfile を編集

~~~ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
$script = <<SCRIPT
sudo yum -y install elixir
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "fedora18" # http://puppet-vagrant-boxes.puppetlabs.com/fedora-18-x64-vbox4210.box
  config.vm.provision "shell", inline: $script
end
~~~

### 起動

~~~bash
$ vagrant up
# エラーがでるので下記を実行
$ vagrant ssh
$ chmod +x /tmp/vagrant-shell && /tmp/vagrant-shell
~~~

## インストール確認

~~~bash
$ elixir -v
Elixir 0.8.3
~~~

## 対話環境 iex で hello, world する

~~~bash
$ iex
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [async-threads:0] [kernel-poll:false]

Interactive Elixir (0.8.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> IO.puts "hello, world"
hello, world
:ok
~~~

## 参照
* [Elixir Official](http://elixir-lang.org/)
プリロード中の画像を変更する


Cocos2d-JS のアプリケーションを実行して、最初に表示されるプリロード中の画像を変更してみます。

![こんなん](http://i.gyazo.com/267274d47815d8bbbc45856319e2b930.png)

## 実行環境
||バージョン|
|:--|:--|
|MacOS|10.9.5|
|Cocos2d-JS|v3.0|
|Python|2.7|
|Xcode|6.1|


## main.js

アプリケーション起動時には `main.js` が実行されます。
プリロードの処理もここで行われています。

``` javascript

/* main.js */

cc.game.onStart = function(){
    cc.view.adjustViewPort(true);
    cc.view.setDesignResolutionSize(640, 960, cc.ResolutionPolicy.SHOW_ALL);
    cc.view.resizeWithBrowserSize(true);
    cc.LoaderScene.preload(g_resources, function () {
        cc.director.runScene(new HelloWorldScene());
    }, this);
};
cc.game.run();
```

上にズラーっとコメントが書いてあり、その下に上記のようなコードが書かれているかと思います。
ここで最初のシーンの読み込みを行っています。


## cc._loaderImage を上書き

ローディングの画像は `cc._loaderImage` という変数に入っているので、 `cc.LoaderScene.preload` を実行する前にここへと画像を代入します。


``` javascript
cc._loaderImage = "data:image/png;base64,iVBOR....";
cc.LoaderScene.preload(g_resources, function () {
// リソースの読み込みが終わったら HelloWorldScene を実行
  cc.director.runScene(new HelloWorldScene());
}, this);
```


`cc._loaderImage` へ代入する画像は Base64 形式で渡さないと表示されないという点に注意しましょう。

実行すると以下の画像のようにプリロード中の画像をこちらで用意した画像に差し替えることができました。

![](http://i.gyazo.com/cf2072cb7730e2986babd976fcd53bf7.png)

## 参考
[How to change the default preloader image in cocos2d-JS 3.0 RC2](http://discuss.cocos2d-x.org/t/how-to-change-the-default-preloader-image-in-cocos2d-js-3-0-rc2/16765/4)
あなたの「振り返り」は間違えてる！？振り返りのたった一つの目的と、そのための方法。

振り返り、してますか？
問題や課題を早期に発見して、改善や方向転換をすることでプロジェクトの成功率を上げることができます。
ただし、間違ったやり方で振り返りをしてしまうと、改善につかがらないどころか、チームのモチベーションを下げかねません。

ここでは、KPTを使った正しい振り返りのやり方と、そこで使うツールをご紹介します。

# 振り返りの目的は、「成功イメージをつかむこと」
振り返りの目的は、 *プロジェクトメンバーが「成功イメージをつかむこと」* です。
プロジェクトが成功するためには、メンバーが成功するイメージを持っていなければなりません。
良い振り返りをすると、プロジェクトメンバーが成功イメージをつかむことができます。
ダメな振り返りでは、プロジェクトの問題点ばかりに焦点を当ててしまい、犯人探しをしたり、メンバーが失敗イメージを持ったり、相互に責任をかぶせ合ったりしてしまいます。結果、メンバー間の歪を生むだけで、成功には近づきません。

振り返りでは、成功イメージを持てるようにしなければなりません。
そのために、KPTをうまく活用する必要があります。

# KPTとは
KPTは振り返りのためのフレームワークです。 
Keep, Problem, Tryの頭文字をつなげたもので、Keep=良かったこと。 Problem=問題だったこと。 Try=次にやりたいこと、試してみたいこと。
を項目として洗い出すことで、自分たちの今を知り、改善を進めていく方法です。


KPTはKeepから入るようにします。自分たちのやってよかったこと、続けるべきことを最初に振り返ることで、過剰に悲観視することなく、自分たちの立ち位置を把握できるようにします。
Keepで自分たちの立ち位置を把握できたら、次にProblemを洗い出していきます。Problemは改善できるところを探すために行います。Problemで改善できるところを探したら、必ずTry化します。
Problemでやってはいけないことは、チームメンバー同士が向き合ってしまうことです。たとえば問題を発生させた人とそれをリカバリーした人が対峙するようなことがあってはいけません。あくまでチーム全体で問題に向き合い、次に進むことが必要です。
Problemから導き出したTryとは別に、試してみたいこととして別途Tryを挙げてもいいでしょう。
![振り返り.qiita.振り返り.png](https://qiita-image-store.s3.amazonaws.com/0/25176/b221e9e3-17a0-2f51-2abb-5749e3cc3ac2.png)

重要なのは、メンバー皆がチームに発生した事について、同じ認識を持ち、同じ問題に一緒に対峙することです。
そして、振り返った内容は次に活かすことで、チームが改善していること、前進していること、成功に近づいていることを認識することです。


# KPTツール
KPTを行うときは、見える化すること、そして振り返った内容を次に活かすことが重要です。
そのためにツールを利用しましょう。
[こちら](http://kpt.ukiuni.com)にフリーのツールを用意しました。
ツールを使うことで、洗いだした事を皆で共有することができます。ツールを通して課題に向き合うことで、チームメンバー全員で問題に向き合うようにしてください。
また、振り返りが終わったら、スナップショットとして記録に残すことで、自分たちが確実に前進していることを認識できるようにしてください。
振り返りは定期的に行い、２回め以降の振り返りでは前回のKPTのTryができたことを確認するようにしてから、KPTに入るようにしてください。これも、自分たちが前進していることを確認するためです。
![振り返り.qiita.次.png](https://qiita-image-store.s3.amazonaws.com/0/25176/2aa7ab1c-ddcc-36ee-b0f4-85ffda21ac6a.png)


ツールの使い方の詳しい説明は[こちら](https://github.com/ukiuni/KPT.js/blob/master/README.md)をご覧ください。


# まとめ
振り返りの目的は、発生した問題の犯人探しをすることではありません。「成功イメージをプロジェクトメンバーで共有すること」です。
KPTを使って、効果的な振り返りをしましょう。
centos6.5 yum install java1.7

忘れないため、メモります。

# 1. yumでインストールできるjdkを調べる

```
$ yum list | grep jdk
```

# 2. インストール

```
$ yum install java-1.7.0-openjdk-devel.x86_64
```

# 3. 確認

```
$ java -version
```

お疲れ様でした♪
polymorphic な私でも validates_uniqueness_of したい


# TL;DR

ポリモーフィックにしてるカラムを `_id` と `_type` に分けて、 `_id` だけを `validates_uniqueness_of` の対象にして、 `_type` は scope 側に本来対象としたいカラムと一緒に入れてしまう。

# 例

一人のユーザーがたくさんの車を持てるし、一つの車をたくさんのユーザーで共有することもできるけど、一つのユーザーに同じ車を何個も追加できてしまっては困る、というかそれは単なるバグだから防ぎたいという場合。

```ruby:ひとりのユーザーがひとつの電話を2回以上追加できないようにしたい
class UserCar < ActiveRecord::Base
  belongs_to :user
  belongs_to :car, polymorphic: true
  validates_presence_of :user, :car

  # こう書きたいところだけど、これは動かない
  # validates_uniqueness_of :car, scope: :user

  # ので、 _id と _type に分けて、 _id を対象に、 _type を scope に入れる
  validates_uniqueness_of :car_id, scope: [ :car_type, :user_id ]
end
```

この状態で `user.car << fit` とかやった時に発行される、既存行の確認クエリはこんな感じ。

```sql:発行されるクエリ
SELECT 1 AS one FROM `user_cars` WHERE (`user_cars`.`car_id` = 1 AND `user_cars`.`car_type` = 'Compact' AND `user_cars`.`user_id` = 1) LIMIT 1
```

単純に、対象カラムも scope も全部まとめて WHERE に食わせてるだけなので、「いやいや User も polymorphic で…」って場合も scope にさらに `:user_type` を足せば大丈夫。

Index ないとつらいので、

```ruby:indexが欲しい
add_index :user_cars, [ :user_id, :car_type, :car_id ], unique: true
add_index :user_cars, [ :car_type, :car_id, :user_id ], unique: true
```

とかになっているとよいですね。(というか、普通は `has_many :through` の時点で追加してるか)

# 参考文献

[APIdock の notes に書いてあった](http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of#893-Does-not-work-with-polymorphic-relations)

けど、見つけづらかったので改めてまとめました。 StackOverflow の投稿とかヒットしまくるんだけど、ドンピシャではなく。需要がニッチすぎるんや。

# というか

データベース側を `unique: true` にしてれば `validates_uniqueness_of` なくても不整合は起きないので、ここで頑張んなくても最悪死にはしません。
【CakePHP】アソシエーション

#has many
主キーが外部参照されている場合。
(デフォではidが主キーとなるが、primaryKeyで変更も可能。)

###定義
直接モデルへまたはbindModelで動的に設定する。
find()などで余計なSQLが流れないよう動的に設定するのが推奨。

```php:モデルへ定義する例
class User extends AppModel{
  public $hasMany = ['Comment'];
}
```

※bindModelは後述。

###取得結果
自身のテーブルと、それに紐づくレコードがひとまとまりで取得されるので単にjoinするよりあとの処理が楽。

```php
(
  [User] => Array
    (
      [id] => 121
      [name] => Gwoo the Kungwoo
      [created] => 2007-05-01 10:31:01
    )
  [Comment] => Array
    (
      [0] => Array
        (
          [id] => 123
          [user_id] => 121
          [title] => On Gwoo the Kungwoo
          [body] => The Kungwooness is not so Gwooish
          [created] => 2006-05-01 10:31:01
        )
      [1] => Array
        (
          [id] => 124
          [user_id] => 121
          [title] => More on Gwoo
          [body] => But what of the ‘Nut?
          [created] => 2006-05-01 10:41:01
        )
    )
)
```

###実行されるSQL
joinではなく自身のテーブルへSQLが発行された後、アソシエーション先へのSQLが実行される。そのため、パフォーマンスに問題あり。自身のテーブルでヒットするレコード数が多い場合は、joinを検討する。

###オプション

```php
$hasMany = array(
  'Comment'=>array(
    'foreignKey'=>'user_id',//アソシエーション先の外部キー。省略時、小文字のモデル名+id。
    'fields'=>['title','body'],//アソシエーション先の取得フィールド
    'className'=>'Comment',//アソシエーション先のモデル名
    'conditions'=>['del_flg'=>true],//アソシエーション先のフィルタ条件
    'order'=>array('created'),//アソシエーション先のorder条件
    'dependent'=>false,//trueにすると、紐づくアソシエーション先のレコードも削除する。
    'exclusive'=>false,//true に設定すると、関連しているすべてのオブジェクトが一つの SQL ステートメントで削除される。
    'finderQuery'=>''//アソシエーションを取り出すために、完全な SQL ステートメントを指定する。？
    'limit'=>2//アソシエーション先のlimit条件
  )
```



#belongs to
他のテーブルへ外部参照する。

###定義
直接モデルへまたはbindModelで動的に設定する。

```
class Order extends AppModel{
  public $belongsTo = ['OrderItem'];
}
```

###取得結果


###実行SQL
アソシエーション先が外部結合で取得される。

###オプション

```php
$belongsTo = array(
  'User'=>array(
    'foreignKey'=>'user_id',//外部キーとして使う自モデルのフィールド名。
    'fields'=>array('user_nm'),//アソシエーション先の取得フィールド
    'conditions'=>array(),//アソシエーション先のフィルタ条件。
    'type'=>'left',//結合の種別leftかinnerを指定できる。
  )
```


#プログラム中でアソシエーションの設定・解除

###設定
```
$this->Model->bindModel(array(
  'hasMany'=>array('アソシエーション先モデル'),
  'belongsTo'=>array('アソシエーション先モデル'),
))
```
bindModelは一度きりなので恒久的に設定する場合は、第二引数にfalseを設定する。

```
$this->Model->bindModel(array(
  'hasMany'=>array('アソシエーション先モデル'),
  'belongsTo'=>array('アソシエーション先モデル'),
),false)
```

###解除
```
$this->Model->unbindModel(array(
  'hasMany'=>array('アソシエーション先モデル'),
  'belongsTo'=>array('アソシエーション先モデル'),
))
```
【Windows】java -versionの結果が期待値と異なる

# java -versionの結果が期待値と異なる

## まえおき

この記事 [【未解決】Eclipse 4.4 でAndroidプロジェクトのビルドエラー](http://qiita.com/yutetsu/items/31edc1e0d6ade99313d2) で，結局Eclipseを再インストールしようと思ったわけですが，新しくダウンロードしたEclipseを起動しようとすると

![EclipseStartFailed.png](https://qiita-image-store.s3.amazonaws.com/0/51949/6df47b8e-d255-aebf-68a3-a0b910c9a653.png)

```text
Version 1.6.0_45 of the JVM is not suitable for this product. Version: 1.7 or greater is required.
```

と表示されて起動できませんでした．
この意味はそのまま起動には1.7以上のJavaが必要だと言われてるわけですが…

## 環境変数にはJava1.8が指定されている

もともと1.6なんて指定してたっけかなぁと思って環境変数を覗いていましたが，JAVA_HOMEもPathもJava 1.8が指定されていました．

Javaのインストール先はどちらも `C:\Program Files\Java\jdk1.*`

## java -versionの結果

しかし， `java -version` の結果は無情にも

```text
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
```

ぐぬぬ...

## javaの場所を探る

なんということでしょう！Windowsにはwhichコマンドがありません．omg.

仕方ないので，こちらの記事を参考に witch コマンドを作ります．
[whichコマンドを作る:@IT](http://www.atmarkit.co.jp/fwin2k/win2ktips/319which/which.html)

```bat:which.bat
@echo off
for %%I in (%1 %1.com %1.exe %1.bat %1.cmd %1.vbs %1.js %1.wsf) do if exist %%~$path:I echo %%~$path:I
```

### witch java の実行

```text
C:\Users\user>which java
C:\Windows\System32\java.exe
```

！？

なんか全然想像していなかったパスが表示されました．

### これに関する記事を見つけました

[java.exe の実行パスに環境変数 PATH の設定が反映されない（Windows）](http://d.hatena.ne.jp/happynow/20120521/1337599059)

> java.exe は `C:\Windows\System32` にもインストールされる。

おぅ…

> したがって、下のように PATH の設定で `%SystemRoot%\system32` が
%JAVA_HOME%\bin よりも先に位置している場合、優先されるのは前者であるから、`%SystemRoot%\system32\java.exe` が実行される。

## なるほどね．

つまり，Java実行ファイルまでのパスを通す際に， `C:\Windows\system32;` よりも前に `C:\Program Files\Java\jdk1.8.0_05\bin;` を記述しないといけないわけです．

### 結果

```text
java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)
```

何という罠
Rails4をproduction環境で動かした際に、application.cssとかapplication.jsがうごかなかったので、対処の仕方まとめ。

Rails4をproduction環境で動かした際に、application.cssとかapplication.jsがうごかなかったので、対処の仕方まとめ。


```
bundle exec db:create RAILS_ENV=production
bundle exec db:migrate RAILS_ENV=production
bundle exec unicorn_rails -D -c config/unicorn.rb -E production
```

をやる。
画像とcssとjsが読み込まれない。(logとchromeのconsoleを見て)
つまり、アセットパイプラインが動いていないので、
`config/environments/production.rb`

で
`config.serve_static_assets = true`
これで、画像は、表示されるようになった

次に、
アセットパイプラインが動いてないので、プレコンパイルされないないので、

```
  bundle exec rake assets:precompile RAILS_ENV=production 
```
をやるが、public/assetsが生成されない。<ここでだいぶ詰まった。>
最後に、「中止」ってでた。。。。。。

ので、
``` bundle exec rake assets:precompie ```

でプレコンパイルした。

動いた。 (fin)
Herokuでアプリケーションのログを出力する


たぶん常識な気もするのですが、Rails4アプリをHerokuにデプロイしていて、エラーが発生しているんだけど、`heroku logs`にエラーがでてこなくて「あれっ」と思ったのでメモしておきます。

Herokuではlogplexを使ってログを出力しているので、アプリ側でproduction環境でのログ出力を標準出力にする必要があります。

このログの対応とそれ以外にもいろいろと面倒を見てくれるので、`rails_12factor`というGemを追加しました。

Gemfileに下記を追加します。

```ruby:Gemfile
gem 'rails_12factor', group: :production
```

ローカル環境で`bundle install`して、コミットしてHerokuにデプロイします。

```bash:gemを追加してherokuへデプロイ
$ bundle install
$ commit -am"Add gem"
$ git push heroku master
```

[参考]
https://devcenter.heroku.com/articles/rails4
GitLabにGoogle Analyticsを設定する

# GitLab にGoogle Analyticsを設定する方法

AWS上にGitLabをインストールして運用しています。ふと、Google Analyticsを設定したくなったので設定方法をメモしておきます。

1. gitlab.yml を修正する
2. サービスの再起動

編集するファイルは以下の場所にあります

```
sudo vi /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
```

Google Analyticsの設定を追加します。
下の方に "4. Extra customization" ということろがあると思います。
extra:の下は空っぽ（のはず）なので下にGoogle Analyticsの設定を追加します。

```yaml:gitlab.yml
#
# 4. Extra customization
# ==========================

extra:
   google_analytics_id: 'UA-XXXXXXXX-X'
```

```
sudo gitlab-ctl restart
```

以上でAnalyticsが設定されます。
ソースコードを見てみると、出力されていますね。
Mplayerで再生中の曲をtmuxのステータスラインに表示する方法


[mplayer](http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html)

##曲の再生

まず、曲の再生はディレクトリ単位で行います。そのためには、以下の様なスクリプトを実行することにします。

`peco`を使ってますが、その箇所は、好きなインターフェイスをお使いください。あと、個人的な事情から、再生速度は2倍速にしています。

ここで重要なのは、ログを`~/Music/info.txt`に出力していることです。


```bash:mplayer_play.sh
#!/bin/bash

sea="ID_FILENAME"
dir1=$HOME/Music
rm -rf $dir1/*/.DS_Store >/dev/null 2>&1

dir2="$dir1/"`zsh -c "ls -A $dir1 | peco"`
pla=`mplayer -novideo -speed 2 -af scaletempo,volnorm -loop 20 -quiet -msglevel all=0 -identify $dir2/* > $dir1/info.txt`

#cat $dir1/info.txt | grep FILE | tail -n 1 | xargs basename | cut -b 1-6

rm $dir1/info.txt
```

##tmuxのステータスラインに曲を表示する

次に、`tmux`のステータスラインに現在再生中の曲を表示します。先ほどのログ`~/Music/info.txt`から再生中のファイル名を取得します。

```bash:~/.tmux.conf
set-option -g status-left "#(cat ~/Music/info.txt | grep FILE | tail -n 1 | xargs basename)"
```

ここで、曲名が長すぎる場合は、`cut -b 1-6`などしましょう。

##曲名を流す方法

###for文

しかし、短いスペースで全部のタイトルを表示する最もオススメな方法は、指定の文字数以内で文字列を流すことです。適当にスクリプトを書いてみます。

```bash:mplayer_name.sh
#!/bin/bash

dir=$HOME/Music
cha=`cat $dir/info.txt | grep FILE | tail -n 1 | xargs basename`
sum=`echo $cha | wc -c | tr -d ' '`

for (( i = 1; i < $sum; i=`expr $i + 4` ))
do
    a=`expr $i + 4`
    b=$i"-"$a
    cat $dir/info.txt | grep FILE | tail -n 1 | xargs basename | cut -b $b
    sleep 0.3
done
```

`mplayer`を実行中に上のスクリプトを実行すると、曲のタイトルが流れます。しかし、`for`を使っているため、そのままでは、`tmux`には使えません。

###if文


したがって、数字を保存しておいて、1個ずつ実行していく方法を採用します。スマートではないですが、一応、これで`tmux`のステータスラインに再生中の曲名を流すことができます。


文字化けする場合は、`cut -d '¥n'`を使ってみてください。その他、スペースの問題などもありますので、最終的には以下の形になりました。

```bash:mplayer_tmux.sh
#!/bin/zsh

dir=$HOME/Music
cha=`cat $dir/info.txt | grep FILE | tail -n 1 | cut -d '/' -f 6 | sed "s/\.[^.]*$//"`
# cha=`cat $dir/info.txt | grep FILE | tail -n 1 | xargs basename`
sum=`echo $cha | wc -c | tr -d ' '`
fil=$dir/info.txt
inf=$dir/info.s

if [ -e $fil ]; then
    if [ -e $inf ];then
        i=`cat $inf | tail -n 1`
        if [ $i -le $sum ]; then
            a=`expr $i + 4`
            b=$i"-"$a
            c=`cat $fil | grep FILE | tail -n 1 | cut -d '/' -f 6 | sed "s/\.[^.]*$//" | cut -c $b | tr -d '\n'` > /dev/null
            echo -ne "| ♫ $c"
            echo `expr $i + 1` >> $inf
        else
            rm $inf
        fi
    else
        echo 1 > $inf
    fi
fi
```

##tmuxのステータスラインに曲名を流す

上に書いたスクリプトを指定します。

```bash:~/.tmux.conf
set-option -g status-left "#(/path/to/mplayer_tmux.sh)"
```

一応、GIF画像撮ってみました。ステータスラインにも曲名が流れています。

![](http://lh6.ggpht.com/-QspcXAmdS90/VCKLUwFUu9I/AAAAAAAAJAU/tQ-F43X9TEg/s0/output.gif)

適当に書いたものなので、改善、調整してくれる人がいるとありがたいです。もっとスマートなやり方があったら、是非教えて下さい。また、便利なオプションあったら教えて欲しいです。


[https://github.com/syui/mplayer_script](https://github.com/syui/mplayer_script)


###拡張子を除く方法

```bash:
echo test.mp4 | sed "s/\.[^.]*$//" 
```

http://syui.github.io/blog/2014/08/02/file-rename-cli
テーブルのカラム名にガッツリ予約語使ってたら詰まった

DBにmysqlを使ってるんだけど、カラム名にORDERっていう予約語を使用してたら
jdbcManagerのupdate()使った時にエラーになって
一日潰してしまった。。。
マジ泣きたい

他にも予約語はいっぱいあるから気をつけよう
http://dev.mysql.com/doc/refman/5.1/ja/reserved-words.html

###教訓
**カラム名に予約語は使用しない**
Xcode 6 の iOS Simulator


なにやら場所が変わったみたい。

とりあえず使うためにはまず Xcode 立ち上げて、

```
Xcode -> Open Developer Tool -> iOS Simulator
```

---

追記
ここにありました。

```
/Applications/Xcode.app/Contents/Applications/iOS\ Simulator.app
```
iOS8で、[[UIScreen mainScreen] bounds]で取得したCGRectが、orientationと関係ある

iOS8で、[[UIScreen mainScreen] bounds]で取得したCGRectが、orientationと関係ある

### in iOS7
##### orientationが横の場合、
    [[UIScreen mainScreen] bounds].size.width is 320
    [[UIScreen mainScreen] bounds].size.height is 568

##### orientationが縦の場合：
    [[UIScreen mainScreen] bounds].size.width is 320
    [[UIScreen mainScreen] bounds].size.height is 568

### in iOS8
##### orientationが横の場合：
    [[UIScreen mainScreen] bounds].size.width is 568
    [[UIScreen mainScreen] bounds].size.height is 320

##### orientationが縦の場合：
    [[UIScreen mainScreen] bounds].size.width is 320
    [[UIScreen mainScreen] bounds].size.height is 568
【SMTP】telnetで直接送信する方法


メールでエラーの場合、そもそもメール送れるかを確認するためtelnetで直接メール送信する。

```
入力
telnet ホスト名 25
出力
Trying XXX.XXX.XXX.XXX...
Connected to ホスト名
～などいろいろ返る～

入力
helo クライアントドメイン名
出力
250 ホスト名

入力
mail from: 送信元
出力
250 Ok

入力
rcpt to: 送信先
出力
250 Ok

入力
data
出力
354 End data with <CR><LF>.<CR><LF>

入力
本文を入力。「Enter . Enter」で終了。
出力 
250 Ok

入力
quit
221 Bye
```

あとは送信先にメールが届いているか確認。これで問題の切り分けできる。
サブクラスの要素だけを一覧で取得する


```python
class Base(object):

	def getAttributeKeys(self):
		""" Baseを継承したクラスで定義された
			要素(メソッドやプロパティ)のキーだけを取得したい
		"""


class Child(Base):

	def __init__(self):
		self.hoge = "hoge"
	
	def fuga(self):
		pass

```
この適当な例でいうと、

```python
ch = Child()
print(ch.getAttributeKeys())   # >>> ['hoge', 'fuga']
```
みたいになって欲しい時。

## setを使って引き算する
http://stackoverflow.com/questions/7136154/python-how-to-get-subclasss-new-attributes-name-in-base-classs-method
いろいろやり方はあると思いますが、このやり方が個人的に綺麗かと。

Pythonだと集合演算が簡単に利用できるので、これを使って
```サブクラスの要素一覧 から 親クラスの要素一覧 を引く```
というような形で子クラスの一覧を取得出来ます。

```python
class Base(object):

	def getAttributeKeys(self):
		return set(dir(self.__class__)) - set(dir(Base))
```
(※ 結果はlistではなくsetになります。)

## あれこれ

```python
ch = Child()
keys = getAttributeKeys()


# attributeの値を取得してみる
key = keys[0] # keysの中から好きに選んだとする
attr = ch.getattr(self, key)


# メソッドかどうかを判定して実行
import types
if isinstance(attr, types.MethodType):
	# attrはメソッドなので実行可能
	attr()
```

サブクラスで定義したものを自動的に取り込みたい時とかにどうぞ。
Ruby の HTTPClient でよく忘れる設定



Ruby の HTTPClient を使うときに、毎回調べてるやつをまとめとく。

## タイムアウトを延したい

HTTPClient のデフォルトのタイムアウトは 60 秒に設定されている。
これを延したい場合、`HTTPClient#connect_timeout`, `HTTPClient#send_timeout`, `HTTPClient#receive_timeout` をそれぞれ設定する。

```
client.connect_timeout = 100
client.send_timeout    = 100
client.receive_timeout = 100
```

## リクエスト、レスポンスの内容を表示したい

`HTTPClient#debug_dev=` に出力先を指定する。


```
client = HTTPClient.new
client.debug_dev = STDOUT
```
Elastic Load Balancingに証明書を登録する手順


http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_server-certs.html


# AWS CLIをインストール(Macの場合)

brew install python

pip install awscli


# bash_profileに以下を追加※しなくても良いかも

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8


# credentialsを設定
aws configure

Access Key Id,Secret Access Keyなどを聞かれるので答える

例: Default regionを東京に、Default output formatをjsonにする場合

Default region name [None]: ap-northeast-1

Default output format [None]: json

# 証明書をアップロード
aws iam upload-server-certificate --server-certificate-name 証明書の名前 --certificate-body file://証明書のパス --private-key file://秘密鍵のパス --certificate-chain file://CertificateChainのパス

# アップした証明書を確認

aws iam get-server-certificate --server-certificate-name 証明書の名前

一覧

aws iam list-server-certificates

不要な証明書を削除

sudo aws iam delete-server-certificate --server-certificate-name 証明書の名前

# Elastic Load Balancing側で利用する証明書を指定
EC2のLoad BalancersのListenersを選択し、Load Balancer ProtocolにSSLを指定。
Cipher,SSL Certificateを指定する。
git-svnブランチ開発

## 1.ソースの最新化
```
git checkout <マージされるブランチ名>
git svn rebase
```

## 2.ブランチ作成・開発・コミット
```
git checkout -b <開発ブランチ名>
# 開発する
git add .
git commit -m "create hoge"
```

## 3.マージ
```
git checkout <マージされるブランチ名>
git merge --no-ff <開発ブランチ名> -m "merge hoge to XX"
```
※ no-ffオプションを付けないと、SVNへコミット先が意図せぬブランチになることがある
(fast-forwardの影響で)

## 4.SVNリポジトリへコミット
```
git svn dcommit
```

SVNリポジトリへのコミット先ブランチが正しいものか心配になったら、以下で確認。

```
git svn info --url
```

## 5.リモートブランチの削除
```
git branch -r -d topic
```
SprayのServerヘッダを変更したい


`spray.can.server.server-header`の設定をapplication.confに書くと`Server`ヘッダの内容を変更できる。


```conf:application.conf
spray.can {
  server {
    server-header = "MyServer/1.0"
  }
}
```

HTTPのヘッダはこんなかんじに。

```
GET /ping
```

レスポンス:

```http
HTTP/1.1 200 OK
Content-Length: 2
Content-Type: text/plain; charset=UTF-8
Date: Wed, 24 Sep 2014 10:17:28 GMT
Server: MyServer/1.0

ok
```
angularJSで覚えておきたいことメモ

ドットインストールのangularJSは罠と言われるぐらいangularJSは深いようなので、
わかったほうが良いであろうことと参考になりそうなurlを上から順にメモしておく。
自分も学んでいる途中なので改善していきたい。

#### なにができるのか

なにができるかざっと見ればスコープとかデータバインディングとかはわかった気になれる。
https://angularjs.org/
http://qiita.com/opengl-8080/items/2fe0a20c314b1c824cc5

#### ng-repeat, ng-click

このあたりも大抵のサンプルで出てくるのでざっとみればわかった気になれる。

#### ＄scope, ＄rootScope

＄rootScopeがある。DOM構造からscopeができる。
https://docs.angularjs.org/guide/scope

#### controller

ng-controllerでcontrollerを指定して使う。
その範囲のscopeのふるまいを決めてあげる。
https://docs.angularjs.org/guide/controller

#### DI, minify化の対応

angularJSといえばDIというくらい説明に使われる。
それに関連してminify化した時に動かなくなる場合があるので対応を覚えておく。
http://qiita.com/kawaz/items/363f430d21ec729f1b7d
DIについて
http://qiita.com/kenjiSpecial@github/items/6b7db5591bb2684058d5

#### filter

なにか処理をかませて表示したい時とか、ng-repeatで絞込たい時とか
https://docs.angularjs.org/api/ng/filter/filter
http://qiita.com/_rdtr/items/5bf69a29e33f668168cc

#### template

directiveやng-includeでhtmlのパーツを呼び出せる。
http://angularjsninja.com/blog/2013/11/19/angularjs-nginclude/

railsなら以下の様なgemもある。
https://github.com/pitr/angular-rails-templates

#### directive

繰り返しでてくるものを部品化する感じでしょうか。
controllerを重たくしないようにdirectiveに追い出せるものは追い出す。
http://angularjsninja.com/blog/2013/11/20/angularjs-custom-directives/

- compileとlinkの違い

#### service

ビジネスロジックはserviceに追い出す
http://dev.classmethod.jp/client-side/javascript/angularjs-5/
factoryとservice
http://faltc.blogspot.jp/2013/11/angularjsfactoryservice.html

#### resource

追加module。基本RESTなapiに対応したmodelっぽいものをさくっと書ける。
https://docs.angularjs.org/api/ngResource/service/$resource

#### ＄broadcast

大きなアプリケーションになってきたときにeventを伝播させる方法
http://qiita.com/sunny4381/items/aeae1e154346b5cf6009#2-4

#### router

追加module。
標準のは使いづらくてangular-ui-routerが一般的とよく聞く気がする。
https://github.com/angular-ui/ui-router

#### controllerAS

controllerが入れ子になってきた時に$parentで遡って行くより
controllerASを使ったほうがスマート。
http://qiita.com/konpyu/items/3555364eb53bbf5d91a5

#### $sce

セキュアなアプリケーションにするために基本サニタイズされていないhtmlは表示できない。
表示するときはセキュアであるという印をつけてあげる。
http://qiita.com/zoetro/items/0b01fda20f8000e485cf

### その他

#### csrf token

webフレームワーク使うなら、大抵csrf tokenをやりとりする仕組みがあるだろうから
対応してあげなきゃいけない。
http://qiita.com/giginet/items/7b5f3e0ce181c3345a55
【解決？】Eclipse 4.4 でAndroidプロジェクトのビルドエラー

# Eclipse 4.4でAndroidアプリがビルドできなくなりました

事の起こりは突然．特定のAndroidプロジェクトがビルドできなくなった．

![EclipseBuildFailed.png](https://qiita-image-store.s3.amazonaws.com/0/51949/65ba9f22-c0ea-fd2c-1dcf-d2f432c88815.png)

## エラーメッセージ

下記の通り

```text
ビルド中にエラーが発生しました。
プロジェクト 'hogehoge' でビルダー 'Java ビルダー' の実行中にエラーが発生しました。
org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding
プロジェクト 'hogehoge2' でビルダー 'Java ビルダー' の実行中にエラーが発生しました。
org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding
```

また，エラーを起こしているソースコードの先頭で

```text
内部コンパイル・エラー: java.lang.NoClassDefFoundError: org/eclipse/jdt/internal/compiler/lookup/UnresolvedAnnotationBinding 
 at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.createUnresolvedAnnotation(LookupEnvironment.java:657)
```

と表示されている

## 心当たり

どちらも [ButterKnife](http://jakewharton.github.io/butterknife/) を用いた物なので，そのあたりが怪しいと思って探りを入れていました．（エラーを起こしているソースもButterKnifeのアノテーションを用いたもの）
結果，プロジェクトのプロパティ -> Javaコンパイラー -> 注釈処理の「注釈処理を使用可能にする」のチェックを外すと正常にコンパイルできることを確認．
しかし，当然ButterKnifeは利用できなくなります．

それはこまる…

## 試したこと

* ソースコードのクリーン
    * リポジトリの物と同一に
* Eclipseの再起動
* プロジェクトのリオープン
* プロジェクトのクリーン
* Eclipseのクリーン起動

しかし一向に改善せず．Eclipseの再インストールまでしないといけないかなーと思ってます（めんどくさい上に直る保証が無いのがつらい）

ちなみにJenkinsによるビルドには成功しています．

とりあえず同じような症状が報告されている例が見当たらなかったので記事を作りました．
Eclipseを別途インストールし直して，改善したかどうかまた報告します．

## 別のEclipseを入れました

[ちょっとつまづいたけど](http://qiita.com/yutetsu/items/4891dde0771fedbb6dec) 同じワークスペースを参照させるとちゃんとビルドできました．
とはいえ，根本的な原因は不明なまま…
angular.js + coffeescriptでError: [$parse:isecdom]が出たとき

angular.jsでcoffeescriptを使用している場合は
最後にreturnを書いてあげる。

```
$scope.hoge = ->
　　$('p').hide()
　　return false
```

###理由　
コンパイル後のNG記述
returnでDOMノードの関数を返すようになっている
Error: [$parse:isecdom]というエラーが出る。

```
$scope.hoge = function() {
　return　$('p').hide();
};
```

コンパイル後のOK記述

```
$scope.hoge = function() {
　$('p').hide()
　return false
};
```

参考URL
https://docs.angularjs.org/error/$parse/isecdom
Laravel4をMacで動かしたときのメモ


# 環境構築
* PHPはMAMPものを利用(anyenvからだとハマったので割愛・・・）
* /usr/local/binあたりにシンボリックリンク
* 複数のPHP環境があるとartisan実行時にこける
* post-update-cmdにPHPのパスを絶対指定で書く
* php artisan serveでローカルサーバ動かす場合はPHP >= 5.4で

# SQLiteでmigrate
```app/config/database.php
'default' => 'sqlite'
```
* 特に変更しなければ、production.sqliteで作成
* php artisan migrateでスキーマができてればSQLiteファイル生成

# Seederを使って初期データ作成
## モデルに個別のSeederを作成
``` app/database/seeds/UserTableSeeder.php
class UserTableSeeder extends Seeder {
	public function run()
	{
		DB::table('users')->delete();
		User::create(array(
			'email' => 'info@example.com',
			'name' => 'Test Man'
		));
	}
}
```

## モデルごとのSeederを呼び出し
``` app/database/seeds/DatabaseSeeder.php
<?php

class DatabaseSeeder extends Seeder {

	public function run()
	{
		Eloquent::unguard();

		$this->call('UserTableSeeder');
	}

}
``` 

## db:seedで実行
```
php artisan db:seed
```


# コントローラー周り
## JSONを返す
``` app/routes.php
Route::get('users.json', function()
{
	$users = User::all();

	return Response::json($users);
});

```


# 疑問点
* クイックスタートは日本語の内容で
* クイックスタート通りにcreate_users_table.phpを生成
* この時、modelが生成される
* Eloquent(O/Rマッパー)を継承した状態だが、protectedでテーブル名が埋め込まれている
* クイックスタートでは自分でmodelファイル作ってるので、テーブル名の指定は不要
* FuelPHPのように実テーブル名がクラス名と合わない場合のためか
Knockout.jsのmapping plugin利用時に、JSONのデータをちょっとひねる


# ソース

```js
data = {
  name: 'Scott',
  children: [
    { id : '1', name : 'Alice' },
    { id : '2', name : 'Tarou'}
  ]
}

mapping = {
  name: {
    create: (options) ->
      return "#{options.data}!!"
  }
}

vm = ko.mapping.fromJS(data, mapping)
ko.applyBindings(vm)
```

```haml
%div{data: {bind: 'foreach: children'}}
	%p{data: {bind: 'text: name'}}
```

# 実行結果
```
Alice!!
Tarou!!
```

# nameとidをくっつけてみる
```
mapping = {
  name: {
    create: (options) ->
      return "#{options.data} : #{options.parent.id()}!!"
  }
}
```

# これで正しいのか...!?

# あと：Optionsをログで垂れ流すと色々参照できるのがわかります。
PySideのインストール覚え書き


PythonのPySideモジュールをMavericksにインストールした際の覚え書き．

```bash
$ pip install PySide
```

だけで使えるようになるものと思っていたが，２点ほど作業が必要だった．
# Qtライブラリのインストール
PySide 1.2.2はQtライブラリのバージョン４を必要とする．バージョン５ではない．

HomebrewにFormulaが用意されているので

```bash
$ brew install qt
```
にてバージョン４がインストールされる．

# おまじない
PySideをインストール後，

```bash
$ pyside_postinstall.py -install
```
を実行する必要があった．実行しなくても一見`import PySide`は問題なく通る．しかし，`from PySide import QtGui`等でエラーが発生する．

# 参考サイト
(PyPI) https://pypi.python.org/pypi/PySide#installing-pyside-on-a-mac-os-x-system
Ogaってゆー新しいXML/HTMLパーサーについて


OgaというXML/HTMLパーサーがありました。

https://github.com/YorickPeterse/oga

XML/HTMLパーサーには、標準のREXML以外にもすでにNokogiriやOxがありますが、
Rubiniusでうまく動かなかった(GVLでロックされないから？)ので、極力C拡張を使わずに作ったものだそうです。

MRIでもNokogiriのインストールは時として鬼門になったりするので、ナイスな代替があれば嬉しいかも。

## 機能とか特徴

- XMLとHTML(5)のパース  
  - DOMパース
  - ストリーム/プルパース
  - SAXパース
- 少ないメモリ消費量
- 高パフォーマンス。パフォーマンスが十分に出てなければそれはバグだ。
- XPath 1.0のサポート
- XML名前空間のサポート

らしいです。

## インストール

いつものように。

```console
$ gem install oga
```

```ruby
require 'oga'
```

## 使用例

READMEからいくつか例を載せます。
元のREADMEには他にも書いてあります。

### XML文字列をパースする

```ruby
Oga.parse_xml('<people><person>Alice</person></people>')
```

↓

```ruby
Document(
  children: NodeSet(Element(name: "people" children: NodeSet(Element(name: "person" children: NodeSet(Text("Alice"))))))
)
```

### HTML文字列をパースする

```ruby
Oga.parse_html('<link rel="stylesheet" href="foo.css">')
```

↓

```ruby
Document(
  children: NodeSet(Element(name: "link" attributes: [Attribute(name: "rel" value: "stylesheet"), Attribute(name: "href" value: "foo.css")]))
)
```

### XMLを指すIOオブジェクトを指定してパースする

ファイルなどIOオブジェクトを直接指定できます。

```ruby
handle = File.open('path/to/file.xml')

Oga.parse_xml(handle)
```

### プルパーサーでIOオブジェクトをパースする

プルパーサーも使えます。楽ちん。

```xml
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
```

```ruby
handle = File.open('path/to/file.xml')
parser = Oga::XML::PullParser.new(handle)

parser.parse do |node|
  parser.on(:text) do
    puts node.text unless node.text.strip.empty?
  end
end
```

↓

```text
Tove
Jani
Reminder
Don't forget me this weekend!
```

## 詳しい使い方

詳しい使い方はドキュメントがしっかり用意されているので、それを参照してください。

http://code.yorickpeterse.com/oga/latest/

モジュール(名前空間)とクラスの設計も明快なので、ドキュメントを順番に追えば、ソースを見る必要もなく、あまり悩むことなくやりたいことができると思います。
jQueryUIを使った並び替え機能

jQuery周りはいつもすぐに忘れてしまうのでメモしておきます。
リストをドロッグ＆ドロップで並び替えて並びの順番をDBに保存するやり方です。

# jQueryUIを使った並び替え機能の付け方

## jQueryとjQueryUIを読み込む

jQuery ajax google と検索してjQueryとjQueryUIのソースをコピペ

```example.html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/themes/smoothness/jquery-ui.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min.js"></script>
```

## 実際に表示されるリストを作る

* リスト0 [並び替え]
* リスト1 [並び替え]
* リスト2 [並び替え]

みたいなリストを表示できるようにする。それぞれのリストにはidをつける。
下記の X はDBのテーブルに入っているユニークな id の数値となるようにする。

```example.html
<ul id="examplelist">
<!--くるくる回して表示始まり-->
<li id="listitem_X" data-id="X">リストX <span class="item-drag">[並び替え]</span></li>
<!--くるくる回して表示終わり-->
</ul>
```


## jQueryの設定を書く

ドラッグできる方向は縦方向（y）のみで、ドラッグしている間は透明度を半分に、ドラッグできる箇所は<span class="item-drag">の箇所のみ、ドロップした際に並び順をポストする、という設定です。

```example.html
<script type="text/javascript">
$(function() {
	$('#examplelist').sortable({
		axis: 'y',
		opacity: 0.5,
		handle: '.item-drag',
		update: function() {
			$.post('ajax_sort_examplelist.php', {
				sortitem: $(this).sortable('serialize')
			})
		}
	});
});
</script>
```

serializeという値は、jQueryの[日本語リファレンスページ](http://stacktrace.jp/jquery/ui/interaction/sortable.html)によると
「並べ替えた順番で、Sortable アイテムに設定されたIDから、フォーム送信やajax送信できるようにシリアライズします。リクエスト送信時に、URLに追加可能なハッシュを、並べ変えた要素の順番で生成します。IDに、"-"(ハイフン)、"="(等号)、"_"（アンダースコア）があるかどうかを判別し、その文字で分割してハッシュ文字列を生成します。」
というわかるようなわからないような説明が・・・
シリアライズ、というのは、変換する、ということのようです。


## 並び替えたときのレスポンスチェック

実際どのような挙動をするかを見ます。

```ajax_sort_examplelist.php
var_dump($_POST['sortitem']);
```

としておいて、リスト1をリスト0の上部にドロップすると、
Firefox の Firebug で下記のようなレスポンスがあります。

```
string(35) "listitem[]=1&listitem[]=0&listitem[]=2"
```

list の id である listitem_X のアンダースコアの前で分割されたものが配列になって返ってくるようです。
そこで次はクエリ文字列を分解するparse_strを使ってみて、再度リストを元に戻してみます。

```ajax_sort_examplelist.php
parse_str($_POST['sortitem']);
var_dump($listitem);
```

すると下記のようなレスポンスがありますので、
これを使ってDBをアップデートします。

```
array(3) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "1"
  [2]=>
  string(1) "2"
}
```


## 並び順をDBに保存する

DBのデータが入ったテーブルの narabi という列に、並び替えた後の並び順を、リストの数だけくるくると全部アップデートします。id はレスポンスの通りです。

```ajax_sort_examplelist.php
$con = connectdb();
parse_str($_POST['sortitem']);
foreach ($listitem as $key => $val) {
	$sql = "update example_table set narabi=".$key." where id=".$val;
	mysql_query($sql, $con);
}
```