OmniAICreator/Qiita-1.07M huggingface dataset:
RPiイメージをSDへBackupする


先日、Restore方法を書いたのでBackupも書いておこうと思います。
ほとんど同じですけど。

ちなみに環境はMacBookです。

## SDカードのデバイス名をチェックする


```shell
diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   ...
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   ...
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   ...
/dev/disk3
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   ...
/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.7 GB    disk4
   1:                 DOS_FAT_32                         15.7 GB    disk4s1
```

ここでは、
/dev/disk4がそれっぽい。これを間違うと代償が大きいので注意。

## マウントをはずす

```shell
diskutil umountDisk /dev/rdisk4
```


## SDカードから吸い出す

```shell
sudo dd if=/dev/rdisk4 of=./backup.dmg bs=1m
```

これをすると、しばらくの間、だんまりになってしまい本当に仕事をしているのか不安になります。

音沙汰がなくて不安な時は、Ctrl + T で状況を確認できます。こんな感じ。

```shell
load: 1.70  cmd: dd 58676 uninterruptible 0.01u 5.13s
5924+0 records in
5924+0 records out
6211764224 bytes transferred in 224.917301 secs (27617992 bytes/sec)
```

終了したら、backup.dmgのサイズを念のためチェックしましょう。
SDカードサイズと同程度であればOK。

## 吸い出し完了後

```shell
diskutil eject /dev/disk4
Disk /dev/disk4 ejected
```

SDカードを取り外します。

## 参考
- [RPiイメージをSDへRestoreする](http://qiita.com/urakarin/items/d4a4a61e500aa8e14ef9)
- [Raspberry Pi の SD カードの準備がスッキリと納得できるようになるかもしれない話(少しだけコンピュータ・アーキテクチャっぽい話も)](http://qiita.com/UedaTakeyuki/items/4f97240b5fd7fc8a4d0b)
なぜ、〜か？に答えてくれていて、非常に納得感あります。
- [Raspberry PiのSDカードをコピーする](http://shokai.org/blog/archives/7943)

おわり。
UTF-8のままPHPでメールを送信する（閲覧環境によって文字化けしないようにする）

# ソースコード

覚え書きです。

UTF-8のままメールを送信します。最初に作成したソースコードは以下の通り、いたってシンプル。

```php:修正前
// 変数の設定
// ...

// 送信＆結果取得
$result = mail($to, $subject, $message, $headers);
```

このままではGmailでは読めても他のメーラー（Becky!）で受信した場合は文字化けしてしまいました。

↓修正後

```php:修正後
// 変数の設定
// ...

// 送信＆結果取得
ini_set("mbstring.internal_encoding","UTF-8");
mb_language("uni");
$result = mb_send_mail($to, $subject, $message, $headers);
```

文字化けが解決しました！

# 参考にしたサイト

 * http://www.securehtml.jp/utf-8/php_utf_mail.html
 * http://php.net/manual/ja/function.mail.php
リリース直前のカオスについて

リリース直前は混乱が発生しやすいのでトップダウンかつ計画主義的な体制の方が向いていると思った。
致命的なバグが発生してた時のリーダーに全てを権限を集める「帝政」への移行もスムーズだし。

日常の開発にスクラムなどのボトムアップが向いているのは、カオスが一定量までに抑えられていることと、スクラムのQCDSが比較的柔軟なことに依存している。
しかしリリース直前だとリリース告知などによって固定的になる。
そのためカオスが増大しやすいためむしろボトムアップではエネルギーのムラが出やすい。

トップダウンのほうが向いているかもしれない。
カメラで取り込んだ写真を日付ごとにフォルダ分けして整理したい。

iPhoneやデジカメから取り込んだ写真を整理したい人向けに。日付ごとにyymmdd（たとえば150706）のようなフォルダを作って、その日撮った写真をそのフォルダごとにまとめるためのスクリプトです。

```rearrenge.rb
require 'fileutils'

class Dir

  # ファイル整理
  def rearrange!
    self.each do |file|
      # 自ファイルは対象外
      if File.absolute_path(file) != File.absolute_path(__FILE__)
        # ディレクトリは対象外
         unless File.directory?(file)
          # yymmddのパスを作成
          path = File.mtime(file).strftime("%Y%m%d")[2..-1]
          # ディレクトリを生成する
          Dir.mkdir(path) unless File.exist?(path)
          FileUtils.move(file, path + "/" + file)
        end
      end
    end
  end
end

Dir.new(Dir.pwd).rearrange!.close

```
Heroku上のRails 4アプリケーションでGoogle Web Fonts を使用する

## Google Web fontsをRailsで使いたい！
Webフォント使いたいなっと思って調べてみました。


最初単純にcssファイルで@importしてみたのですが、Heroku環境ではうまく反映されませんでした。HerokuにPushした時のログではプリコンパイルはうまくいってるような事を示していたのですが・・・。

```css:app/assets/custom.css.scss
@import url('http://fonts.googleapis.com/css?family=Chango');
```

Google先生に聞いた所、以下のような外部CSSを読み込むような形でurlを指定して読み込むことができるとのことでした。

```app/views/layouts/application.html.erb
<%= stylesheet_link_tag "application", 'https://fonts.googleapis.com/css?family=Chango', :media => "all" %>
```

実際うまく反映されたのですが、フォントの種類が増えると非常にapplication.html.erbのheadがごたごたしてくるので嫌ですね・・・！１種類だけしか使わないっていう状況の方が少なそうですし。
そもそも単純なimportだとなぜ反映されないのか調べてみた所、***HerokuではGoogle web fontsのhttp urlにセキュリティパラメータが設定されていたため、https通信しか受け付けていないそうです。***

そこで、

```css:app/assets/custom.css.scss
@import url('//fonts.googleapis.com/css?family=Chango');
```
こういった感じでhttpを省略することで、http通信かhttps通信どちらかに勝手に最適化されるのこの書き方が良いみたいです。ただこれだとローカル環境で反映したときに不具合が起こるとのことで、今回のケースはしっかりhttpsと明記したほうが良さそうです。

```css:app/assets/custom.css.scss
@import url('https://fonts.googleapis.com/css?family=Chango');
```

他にもやり方があると思いますが、とりあえず今回はお手軽な感じでやってみました。

ちなみに、app/assets/fonts ディレクトリを作成して、その中のフォントファイルから反映させる方法でもできるらしいです。
こっちのほうがよりRailsらしい気もするので、今度やってみようと思います。


## 参考
* http://stackoverflow.com/questions/16948767/heroku-and-google-fonts/18216759#18216759
* http://qiita.com/su_mi/items/d3c0b5319d6b3c41db11
gitwatch > barrier() > OpenCLの同期関数

https://github.com/Itseez/opencv/commit/99aaf4030a221ffd15851a0e7723fef45aaf9ff9
をみていて

    barrier(CLK_LOCAL_MEM_FENCE);
というコードを見つけた。

barrier()って何だろうかと調べると OpenCL の同期用の関数らしい。

<hr>
http://wiki.tommy6.net/wiki/barrier

> barrier() が条件文中にあるとき、あるワークアイテムが条件文に突入して barrier() を実行するのであれば、すべてのワークアイテムがその条件文に突入しなければなりません。
WebGL　シェーダー


3次元空間を2次元画面で表示するためには座標計算と呼ばれる一連の計算が必要。
モデル変換：被写体となる物体が３次元空間のどの位置にあるのか
ビュー変換：カメラがどの位置でどの方向をむいているのか
プロジェクション変換：３次元空間のどの領域を撮影するのか

WebGLには座標変換を記述する仕組みとしてシェーダがあり、シェーダー言語のGLSLを使える。

##シェーダーとは
シェーダーとは、物体そのものがどのように見えるか、形や色や表面の模様などの設定項目。
WebGLには ***頂点シェーダー***と ***フラグメントシェーダー***の２種類がある。

***頂点シェーダー***:頂点に関する情報をもっている。（位置情報や、頂点の色など）
***フラグメントシェーダー***:どんな色を出力するのかを決める

##書き方1 頂点シェーダー
頂点シェーダーもフラグメントシェーダーも ***main***という関数の中に記述していく。
***gl_Position***に頂点データを渡す。

```
attribute vec3 position;

void main(void) {
    gl_Position = position;
}
```
***attribute***は頂点ごとに異なるデータを受け取るための仕組み（修飾子）。あらかじめデータを仕込んでおきシェーダーに渡す。

##書き方2　頂点シェーダーの座標変換
一連の座標変換を行う。
1で得た頂点データに変換行列を掛け合わせる。

```
attribute vec3 position;
uniform mat4 mvpMatrix;

void main(void) {
    gl_Position = mvpMatrix * position;
}
```

WebGL側でモデル、ビュー、プロジェクションの行列を生成し掛け合わせておいて座標変換行列を作っておき。 ***uniform***修飾子付きの変数に渡す。

##書き方3　フラグメントシェーダー
 ***varying***修飾子を使って頂点シェーダーとフラグメントシェーダーの橋渡しをする。
頂点シェーダーが持つ色の情報を、画面上の色を操作するフラグメントシェーダーに渡す必要があるため。

ーー頂点シェーダーーー

```
attribute vec4 position;
attribute vec4 color;
uniform mat4 mvpMatrix;
varying vec4 vColor

void main(void) {
    vColor = color;
    gl_Position = mvpMatrix * position;
}

```
頂点シェーダの色情報を持つcolorと橋渡しの役割を行うvarying修飾子付きのvColorを追記

ーーフラグメントシェーダーーー

```
varying vec4 vColor;

void main(void)
{
    gl_FragColor = vColor;
}
```
 ***gl_FragColor***にデータを代入。
gl_Positionと異なりgl_FragColorへの代入は必須ではないが、基本的に入れているみたい。
nginx ユーザのホームディレクトリを知りたい


## コマンド

``` bash
$ sudo -u nginx bash -c "cd; pwd;"
```

もっと簡単な方法(コメントより)

``` bash
$ echo ~nginx
```




## 結果
``` bash
[ec2-user@ip-***-**-*-*** ~]$ sudo -u nginx bash -c "cd; pwd;"
/var/lib/nginx
```

## 背景

.aws/credentials ファイルを作成する際に開発中であれば現在のユーザ（ec2-user)のホームディレクトリ下にファイルを作成すればいいが、本番では nginx ユーザとしてアプリケーションを実行するため ec2-user のホームディレクトリではなく nginx のホームディレクトリにファイルを配置したい。

## コマンドについて

> sudo -u nginx bash

別ユーザ（ここでは nginx)としてbashを実行する


> bash -c "cd; pwd;"

  -c は bash のオプション
 カレントディレクトリをホームにし、ディレクトリのパスを画面に表示する
【小ネタ】Chromeを使用している方、知ってますか・・・！？



普段、メインのブラウザとして
###**「Google Chrome」**
を使っています。



最近、 **「Google Chrome」** の面白い機能というか発見がありました！
※ **「Google Chrome」** をご使用でない方は、「へぇ〜」という感じでお読みくださいm(_ _)m


皆さん、自宅や外出先でインターネットを使用することが多いと思います。
Wi-Fiなどを使用されている方は時々、うまく接続できなくて、イライラしてりすることありませんか？


「Chrome」を使っていて、うまくインターネットに接続できなかったとき、
こんな画面表示されますよね。

![20150706_ブログ_Chrome画像①.png](https://qiita-image-store.s3.amazonaws.com/0/33479/e56b88ad-e9e8-c706-757b-cda1e7ef79c3.png "20150706_ブログ_Chrome画像①.png")




そうなんかやる気なさそうな恐竜のキャラクターが表示されます。

このキャラクターの画面が表示された時に、スペースキーを押してみてください…
そうすると…、


###なんとゲームが始まるんです笑

[![](http://img.youtube.com/vi/TutAhCsfk-E/0.jpg)](https://www.youtube.com/watch?v=TutAhCsfk-E)




これは開発者の方がイライラしないようにと、入れてくれた機能なんですかね・・・？

私はアプリとかを作成したことはありませんが、こういう遊び心があるといいなと
思いました。


おわり。
Sublime Text - Plain Text(.txt)で自分独自記法のハイライト表示

# Sublime Text3でplain text用に自分独自記法のシンタックスハイライトを作る

Sublime Textを使っていると、ソースコード以外にも会議メモや提案書の原稿や自分独自記法のToDoリストなど、plain text（.txt）でさまざまな文書を作成することがあります。
Wiki記法なりMarkDownで書くほどでもないがtxtの見栄えをわかりやすくしたい、というときに、自分独自記法に対して簡単にハイライト表示する方法です。
（ざっと対応するだけなら、15分程度で実現できます）

たとえば、plain textファイルだけど、
    `>` は課題の見出し
    `->` は対応案
    `#` はコメントアウト
という独自表記に対してハイライト表示したいとします。

# 対応方法
## AAAPackageDevパッケージのインストール
- syntax定義やsnippets、build systemなどのSublime Textの拡張作成（編集）支援パッケージ
  - （参考）https://github.com/SublimeText/AAAPackageDev
- Package Controlから普通にインストールしておきましょう

## 独自Syntax定義のテンプレート作成
- ツール -> Packages -> Package Development -> New Syntax Definitionを選択して独自Syntax定義のひな型を作成します。

こんなファイルが生成されます

```yaml:.TXT-tmLanguage.YAML-tmLanguage
# [PackageDev] target_format: plist, ext: tmLanguage
---
name: Syntax Name
scopeName: source.syntax_name
fileTypes: []
uuid: b143df37-fa63-4560-b0ce-bd6c5d57fc83

patterns:
-
...
```

このファイルをSublime Text 3/Packages/Userに以下のファイル名で保存しておきます
.TXT-tmLanguage.YAML-tmLanguage

Windows環境なら保存先のパスは以下になります 
C:\Users\\{user}\AppData\Roaming\Sublime Text 3\Packages\User


##  テンプレートファイルの編集
最初に name、scopeName、fileTypesを設定します

* name : 独自Syntaxファイルの名前（メニュー表示で利用される。好きな名前でどうぞ）
* scopeName : （対象がソースならsource、ソース以外ならtext） + 対象の拡張子
* fileTypes : Syntaxを適用するファイルの拡張子

今回はplain textが対象なので、以下のようになります

```yaml:.TXT-tmLanguage.YAML-tmLanguage
# [PackageDev] target_format: plist, ext: tmLanguage
---
name: Original Text
scopeName: text.txt
fileTypes: [txt]
uuid: b143df37-fa63-4560-b0ce-bd6c5d57fc83

patterns:
-
...
```

次は本命の部分です！
patternsの箇所に、ハイライトしたい正規表現とハイライト表示のパターンを定義していきます

* match: ハイライトしたい表現にマッチする正規表現を定義
* name : 正規表現にマッチした個所をどのようなハイライト表示とするかの定義
 * この部分きちんと理解しきれていないですが、TextMateの命名規則にマッチした文字列を定義することで、その命名にマッチしたハイライト表現になるようです
 * 具体的には以下のURLに記載されたscope nameを定義しておきます
     * https://manual.macromates.com/en/language_grammars#naming_conventions

今回は、以下のようにしました

```yaml:.TXT-tmLanguage.YAML-tmLanguage
# [PackageDev] target_format: plist, ext: tmLanguage
---
name: Original Text
scopeName: text.txt
fileTypes: [txt]
uuid: b143df37-fa63-4560-b0ce-bd6c5d57fc83

patterns:
- name: comment.line
  match: ^[\ \t]*\#(.*)

- name: constant.character
  match: ^[\ \t]*>(.*)

- name: constant.numeric
  match: ^[\ \t]*\-\>(.*)
...
```


## 独自Syntax定義のビルド
ツール -> ビルドシステム -> convert to ... を選択して、F7
[JSON to Property List] を選択してビルドすると、独自Syntaxファイルと同じディレクトリに 同名の .tmLanguage ファイルができます。

Sublime text再起動すると、表示 -> シンタックスにOriginal Textが出てきます。
では、.txtファイルを開いて作成したOriginal Textを選択してみましょう。



##  動作確認
独自Syntaxで記載した箇所の色を確認します。
気にいらないなら、独自Syntax定義ファイルのpatternsのnameの箇所の値を変更して再度ビルド・・・

* どのname表現でどんなハイライトとなるかは、利用しているカラースキーマにも依存します
* ド派手（目に痛い？）表現にしたいなら、nameの箇所にinvalid系を設定しましょう
* ハイライト表現が気に入らないなら、独自カラースキーマを定義する道もあります 


## デフォルト反映設定
plain text(.txt)ファイルを開いてる状態で、表示 -> シンタックス -> open all with current extention as から作成したOriginal textを選択します。
これでplain text（.txt）ファイルを開く場合には、作成したOriginal Syntaxが常に適用されます。



これで終了です。おつかれさまでした！
では、楽しい日本語コーディングライフを。

# 参考URL
 http://docs.sublimetext.info/en/latest/extensibility/syntaxdefs.html
次の案件ES6で書いてみたいメモ その１

次の案件ES6で書いてみようと思ったので勉強記です。

WEB+DB PRESS Vol.87　
コード部分はこちら見ながら勉強してます

![TH160_9784774173702.jpg](https://qiita-image-store.s3.amazonaws.com/0/76843/49272280-91d8-2396-55e1-653bf1d46368.jpeg)


# 0、環境構築 

とりあえずこちらで環境を整える。

ES6 で書く環境を作る（gulp + Babel 編）
http://qiita.com/hkusu/items/9b312274b3ff2913e15b

BabelというのはES6で書いたコードをES5の形式に変換してくれる
「トランスパイラ」というソースコード変換ツールらしい。

# 1、アロー関数  

functionキーワードをつかわずに関数式が書けるようになった

```js:sample
// es5 
var add = function(a, b){
	return a + b;
}

// es6
var add = (a, b) => {
	return a + b;
}
```

# 2、クラスの定義 
class構文が使えるようになりました。
(Function.prototypeの糖衣構文)

```js:sample
// es5
function Dog(aName){
	this.name = aName;
}
Dog.prototype.run = function(){
    console.log(this.name + "is run!!!!");
};

// es6
class Dog{
	// コンストラクタ
	constructor(aName){
		this.name = aName;
	}
	run(){
		console.log(this.name + "is run!!!!");
	}
}

var Hachikou = new Dog("はち公");
Hachikou.run();
// はち公 is run!!!!
```

# 3、クラスの継承 

継承します。

```js:sample
class Pochi extends Dog{
	constructor(aName, aType){
		super(aName) // 親のコンストラクタ呼び出し
		this.Type = aType;
	}
	// オーバーライド
	run(){
		console.log(this.Type + "の" + this.name + "is run!!!!");
	}
}
```

# 4、let 

letを使うことでブロックスコープの変数宣言が可能になる。

```js:sample
function hoge(condition){
	let bar = 1;
	if(condition){
		let bar = 2;
	}
	console.log(bar);
}
hoge(true);
// 1

```

# 5、const

定数です。 constを使って宣言された変数には値を代入できなくなる。

```js:sample
const foo = 1;
console.log(foo); //1
foo = 200; // エラー

```

つづく、、、かもしれない
IBからUILabelのtextに改行を入れる


![スクリーンショット 2015-07-06 11.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/43938/64eef0f6-55a6-98ca-448b-9391edf5672c.png "スクリーンショット 2015-07-06 11.25.28.png")

~~「Control + Q + Enter」で改行できる~~

### 追記（2015/07/08）
「Control + Enter」で改行できるようです。
javafxでチェックボックスと画像を連動させる

画像をクリックしたときにチェックボックスをonにするには
CheckBoxのsetGraphicにImageViewを登録する。

```
public class CheckboxApp extends Application {

	@Override
	public void start(Stage primaryStage) throws Exception {
		AnchorPane root = new AnchorPane();
		Label label = new Label();

		CheckBox check = new CheckBox();
		check.setOnAction(action -> {
            label.setText(check.isSelected() ?
                    "selected." : "not selected.");
        });


        InputStream in = CheckboxApp.class.getResourceAsStream("/images/earth.png");
        Image image = new Image(in, 60.0, 60.0, true, true);
        check.setGraphic(new ImageView(image));


		check.setLayoutX(120);
		check.setLayoutY(60);

		label.setLayoutX(120);
		label.setLayoutY(150);

		root.getChildren().add(check);
		root.getChildren().add(label);


		primaryStage.setScene(new Scene(root, 300, 240));
        primaryStage.show();
	}

	public static void main(String[] args) {
		launch(args);
	}

}
```
aws-sdkでオレオレ証明書エラーを回避する方法


実験用に立てたRiakCSに接続しようとするとSSL証明書絡みでエラーになる。
回避用のおまじない。

```js
var https = require('https');
AWS.config.httpOptions = {
  agent: new https.Agent({
    rejectUnauthorized: false
  })
};
```
aws-sdkでRiakCSへのupload時のエラーを回避する方法

aws-sdkを使ってRiakCSにマルチパードアップロードするときに403エラーでハマった時のメモ。

#原因
lib/signers/s3.js内でsignatureを生成する際に、uploadIdに含まれる`=`が`%3D`にエスケープされているせいで認証に失敗してしまっている様子。

#回避策
途中で`%3D`を`=`に戻してあげる

```js:aws-sdk-custom.js
'use strict';

var AWS = require('aws-sdk');
var inherit = AWS.util.inherit;

/**
 * @api private
 */
AWS.Signers.S3 = inherit(AWS.Signers.S3, {
  canonicalizedResource: function canonicalizedResource() {

    var r = this.request;

    var parts = r.path.split('?');
    var path = parts[0];
    var querystring = parts[1];

    var resource = '';

    if (r.virtualHostedBucket)
      resource += '/' + r.virtualHostedBucket;

    resource += path;

    if (querystring) {

      // collect a list of sub resources and query params that need to be signed
      var resources = [];

      AWS.util.arrayEach.call(this, querystring.split('&'), function (param) {
        var name = param.split('=')[0];
        var value = param.split('=')[1];
        if (this.subResources[name] || this.responseHeaders[name]) {
          var subresource = { name: name };
          if (value !== undefined) {
            if (this.subResources[name]) {
              subresource.value = value;
            } else {
              subresource.value = decodeURIComponent(value);
            }
          }
          resources.push(subresource);
        }
      });

      resources.sort(function (a, b) { return a.name < b.name ? -1 : 1; });

      if (resources.length) {

        querystring = [];
        AWS.util.arrayEach(resources, function (res) {
          if (res.value === undefined)
            querystring.push(res.name);
          else {
            // '%3D'を'='に置換
            if (res.name === 'uploadId') {
              res.value = res.value.replace(/%3D/g, '=');
            }
            querystring.push(res.name + '=' + res.value);
          }
        });

        resource += '?' + querystring.join('&');
      }

    }

    return resource;

  },
});

module.exports = AWS;
```
###使用例

```js:demo.js
var fs = require('fs');
var AWS = require('./aws-sdk-custom');
var config = require('./config.json');
var s3 = new AWS.S3(config);

var params = {
  Bucket: 'bucket',
  Key: 'key',
  Body: fs.createReadStream('./bigfile')
};

s3.upload(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

```

もっといい方法がある気がする。
かつお君へ PHPのpashword_hashでログイン処理を作成

[かつお君へ PHPのcryptでログイン処理を作成](http://qiita.com/bboobbaa/items/8a295184694bf8aece68)にて指摘を頂いたので、内容を再度まとめました。
以下を使うとSALTを固定値で指定しなくてもハッシュを作成出来ます。

* [password_hash](http://php.net/manual/ja/function.password-hash.php)
* [password_verify](http://php.net/manual/ja/function.password-verify.php)

ユーザ作成画面にて、入力されたパスワードに`password_hash()`を使います。
返り値のhashをpassとして保存します。
以前cryptの`CRYPT_BLOWFISH`でパスワードを生成していたので、アルゴリズムは`PASSWORD_BCRYPT`を指定してみました。

```php:App/Controller/User.php
public function registUser() {
    if ($this->request->is('post'))
    {
        $this->loadModel('User');
        $this->request->data['User']['pass'] = password_hash($this->request->data['User']['pass'], PASSWORD_BCRYPT);
        $this->User->save($this->request->data);
    }
}
```

照合の際は、ユーザーIDでデータをSELECTし、`password_verify()`に先ほどのhashとログイン時に入力されたpassを渡すとbooleanが返ってきます。

```php:App/Model/User.php
〜
public function checkUserLogin($id, $pass) {
    $user = $this->find('first', array('conditions' => array('id' => $id)));
    return password_verify($pass, $guide['User']['pass']);
}
```
Fluentdを使ってRDSのSlowLogをSlackに通知する

## これはなにか
RDSのSlowLogをSlackに通知したかった。
AWSのAPIで `download-db-log-file-portion` があったが通知するには使い勝手が悪かったので
MySQLのテーブルにSlowLogを保存して、それをFluentdからSELECT & Clear をすることにした。
この記事はMysqlの設定なので、他のDBの場合はよしなに変更してください。

## 使ったもの
fluent-plugin-slack : https://github.com/sowawa/fluent-plugin-slack
fluent-plugin-rds-slowlog : https://github.com/kenjiskywalker/fluent-plugin-rds-slowlog

## RDSの設定
- Parameter Group
  - slow_query_log : 1
  - long_query_time : ?秒(ご自由に)
  - log_output : TABLE

- ユーザー作成
  - CREATE USER hoge;
  - SET PASSWORD FOR 'hoge'@'%' = PASSWORD('hogehoge');
  - GRANT select ON mysql.slow_log TO hoge;
  - GRANT EXECUTE ON PROCEDURE mysql.rds_rotate_slow_log TO hoge;

## Slackの設定
- IncomingWebHookでWebhookURL取得

## Fluentdの設定

```
<source>
  type rds_slowlog
  tag rds.slow_query
  host ****************************.ap-northeast-1.rds.amazonaws.com
  username hoge
  password hogehoge
</source>

<match rds.slow_query>
  type buffered_slack
  webhook_url [WebhookURL]
  channel [channel名]
  username [通知ユーザー名]
  color danger
  message "start_time:%s\r\nuser_host:%s\r\nquery_time:%s\r\nlock_time:%s\r\nrows_sent:%s\r\nrows_examined:%s\r\ndb:%s\r\nlast_insert_id:%s\r\ninsert_id:%s\r\nserver_id:%s\r\nsql_text:%s"
  message_keys start_time,user_host,query_time,lock_time,rows_sent,rows_examined,db,last_insert_id,insert_id,server_id,sql_text
  flush_interval 1m
</match>
```

## 通知されたもの
![スクリーンショット 2015-07-06 11.07.25.png](https://qiita-image-store.s3.amazonaws.com/0/53224/ee06efd6-0ce4-e6c2-80bb-963c297e8aaa.png)


## 最後に
そのまま使うと危険なので適当に変更してください。
dockerコンテナ上の時刻同期について（NTP不使用）

#Dockerコンテナ

海外のimagesをダウンロードしてくると、時刻がUTCになっていたりlocateがJPN以外になっています。

このままだと、Dockerコンテナ上のログファイルなどの時刻がまともに取得できません。

##NTPは使えない
NTP同期を行うためにはntpdをコンテナ内で起動する必要がありますが、1プロセス＝1コンテナを原則とするDockerではntpdを起動すると他のことができなくなります。
※複数プロセスを1コンテナ内で起動する方法はいくつかありますが


##結論：/etc/localtimeを使う

```bash:
docker run -d -v /etc/localtime:/etc/localtime:ro hogehoge
```

上記のように```-v /etc/localtime:/etc/localtime:ro```を使用します。


##解説

/etc/localtimeはtimezoneのファイルのシンボリックリンクです

```bash:
[root@master ~]# ls -ltr /etc/localtime lrwxrwxrwx. 1 root root 32  6月  4 14:23 /etc/localtime -> ../usr/share/zoneinfo/Asia/Tokyo

```
コレグラフボックスライブラリ一覧【LEDs】（ver. 2.3.1）


コレグラフボックスライブラリ一覧（ver. 2.3.1）

Creation Date : 2015/7/6
Last Modified Date : 2015/7/5
 [robot start inc.](http://robotstart.co.jp/ "robot start inc.")
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
###▼LEDs（LEDライト）
-------------------------------------------------------------------------------
###　▼Creation（クリエーション）
##　　　■Color Edit（色の編集）
　　　　　- 光の三原色（R、G、B）の値(0〜255)を出力します。

　　　　　入力：onStart（バン）

　　　　　出力：onStopped（数）

　　　　　ボックス設定：色（クリックするとカラー選択ウィンドウが開きます。）

　　　　　パラメータ：なし

##　　　■Ear LEDs（耳のLED）
　　　　　- 片方の耳または両耳のLEDの強さを設定します。

　　　　　　入力：onStart（バン）

　　　　　　出力：onDone（バン）

　　　　　　ボックス設定：なし

　　　　　　パラメータ：耳LED部位（両方、左、右）
　　　　　　　　　　　　LEDの強さ（%）
　　　　　　　　　　　　持続期間（秒）

##　　　■Eye LEDs（目のLED）
　　　　　- 目のLEDを設定します。
　　　　　　色を入力するボックスを開く必要があることに注意してください。

　　　　　　入力：onStart（バン）

　　　　　　出力：onDone（バン）

　　　　　　ボックス設定：なし

　　　　　　パラメータ：目LED部位（両方、左、右）
　　　　　　　　　　　　持続期間（秒）

##　　　■Set LEDs（LEDの設定）
　　　　　- 指定したグループのLEDの輝度を設定します。

　　　　　　入力：onSet（バン）

　　　　　　出力：onReady（バン）

　　　　　　ボックス設定：なし

　　　　　　パラメータ：LEDグループ（すべてのLED、右耳のLEDなど）
　　　　　　　　　　　　LEDの強さ（%）
　　　　　　　　　　　　持続期間（秒）

##　　　■Set Single LED（1つのLEDの設定）
　　　　　- 特定のLEDの輝度を設定します。

　　　　　　入力：onSet（バン）

　　　　　　出力：onReady（バン）

　　　　　　ボックス設定：なし

　　　　　　パラメータ：LED部位（Brain0、LeftEarLedなど）
　　　　　　　　　　　　LEDの強さ（%）
　　　　　　　　　　　　持続期間（秒）

##　　　■Single Ear LED（片耳のLED）
　　　　　- 片耳のLEDの強度を設定します。

　　　　　　入力：onStart（バン）

　　　　　　出力：onDone（バン）

　　　　　　ボックス設定：なし

　　　　　　パラメータ：耳LED部位（左、右）
　　　　　　　　　　　　角度（度）
　　　　　　　　　　　　LEDの強さ（%）
　　　　　　　　　　　　持続期間（秒）

##　　　■Single Eye LED（片目のLED）
　　　　　- 片目のLEDの色を設定します。色を入力するボックスを開く必要があります。

　　　　　　入力：onStart（バン）

　　　　　　出力：onDone（バン）

　　　　　　ボックス設定：なし

　　　　　　パラメータ：目LED部位（左、右）
　　　　　　　　　　　　角度（度）
　　　　　　　　　　　　持続期間（秒）
 
--------------------------
###　▼LEDs Library（LED制御）
##　　　■Blink（点滅）
　　　　　- ロボットの目が一回点滅します。

　　　　　　入力：onStart（バン）

　　　　　　出力：onDone（バン）

　　　　　　ボックス設定：なし

　　　　　　パラメータ：なし

##　　　■Random Eyes（目の色のランダム変化）
　　　　　- ロボットの目の色がランダムに変化します。
　　　　　　注意：このボックスは自動的には終了しませんので終えるにはonStop入力
　　　　　　　　　させる必要があります。

　　　　　　入力：onStart（バン）
　　　　　　　　　onStop（バン）

　　　　　　出力：onStopped（バン）

　　　　　　ボックス設定：なし

　　　　　　パラメータ：なし

##　　　■Twinkle（点滅）
　　　　　- 選択されたLEDがパラメーターで定義された時間の間、点滅します。

　　　　　　入力：onStart（バン）
　　　　　　　　　onStop（バン）

　　　　　　出力：onStopped（バン）

　　　　　　ボックス設定：なし

　　　　　　パラメータ：LEDグループ（すべてのLED、顔LED、右耳のLEDなど）
　　　　　　　　　　　　フラッシュオンの時間（秒）
　　　　　　　　　　　　フラッシュオフの時間（秒）
　　　　　　　　　　　　作動させる時間（秒）
 
-------------------------------------------------------------------------------
MacOSXでMySQLに接続しようとして mysql_connect(): No such file or directoryの対処法

MacOSXで、PHPからMySQLに接続しようとしたらなぜかエラーが出ました。

```php:connect.php
<?php
$link = mysql_connect("localhost","userfoo","himitsu" );
var_dump($link);
```

```
PHP Warning:  mysql_connect(): No such file or directory in /Users/DQNEO/src/bitbucket.org/DQNEO/keiqui/application/connect.php on line 2
bool(false)
```

# 原因と対策

HomebrewでMySQLをインストールした場合、デフォルトの接続方式はTCPではなくUnix Domain Socketになります。

ソケットファイルが/tmp/mysql.sock というファイル名で作られているので、これをtcpのポート番号の代わりに指定すればいけます。


```php:connect.php
<?php
$link = mysql_connect("localhost:/tmp/mysql.sock","userfoo","himitsu" );
var_dump($link);
```

# 余談

mysql_connect関数はPHP5.5から非推奨になったのでMySQLiかPDO_MySQL系の関数を使いましょう。

http://php.net/manual/ja/function.mysql-connect.php
rsyslogをDocker内で動かしてもログが出ない、ときの対策メモ


はじめに
========

Docker内でちょっとSyslogを残しておきたい、ということはなきにしもあらずかと思います。
（たくさんDaemonを動かすのは良くないとされつつも・・・）
Fedora21などで yum でInstallされるデフォルトの rsyslog.conf だとログが出力されないので、その対策メモです。

症状
========

rsyslog自体はInstallされていて起動しているのに logger などで /var/log/messages に表示されない。
具体的には、
`logger hogehoge` としても `/var/log/messages` にログが出ません。

対策
=======

http://www.projectatomic.io/blog/2014/09/running-syslog-within-a-docker-container/
に書いてある方法で上手く行きました。

RHEL7やFedoraではjournald などを使う設定になっている（んだけど、大抵Dockerではjournaldは起動していない）のがダメみたいです。
そこで `/etc/rsyslogd.conf` を

* `$ModLoad imjournal` を コメントアウト
* `$OmitLocalLogging を off` にする
* `$IMJournalStateFile imjournal.state` をコメントアウト
* `$ModLoad imuxsock` が存在することを再度確認（初期設定では存在しています)

とします。rsyslogd を再起動して、 `logger hogehoge`すると今度はちゃんとログに出力されました。


Installメモ
---------------

supervisord で起動する場合、こんな感じで入れておけばOKでした。

```
yum install -y rsyslog

sed 's/$ModLoad imjournal/# $ModLoad imjournal/' -i /etc/rsyslog.conf
sed 's/$OmitLocalLogging on/$OmitLocalLogging off/' -i /etc/rsyslog.conf
sed 's/$IMJournalStateFile imjournal.state/# $IMJournalStateFile imjournal.state/' -i /etc/rsyslog.conf

cat <<EOF > /etc/supervisord.d/rsyslog.conf
[program:rsyslog]
command=/usr/sbin/rsyslogd -n -c5
autostart=true
autorestart=true
redirect_stderr=true
EOF
```
uGui メモ

間違ってるかもしれんけど残す

# ■画面サイズが小さいけどどうすんの？
　
　**・Canvas Scaler -> Ui Scale Mode -> Scale With Screen Size**
　**・Reference Resolution -> 変えてみる**
　**・Screen Match Mode -> Shrink(解像度が変わっても倍率がそれに応じて変化)**

　●Screen Match Modeは下記の方のサイトを参考（ありがたや）
　　http://indie-du.hatenablog.com/entry/2015/01/21/200000

　　▲Match Width Or Height
　　　幅か高さを基準にして拡大、縮小する。
　　　これを選択した場合、Matchの数値を変えることで、幅と高さどちら寄りの比率にするか決める。
　　▲Expand
　　　より大きな解像度の場合、画面の領域を広げる。小さな解像度の場合はそのままの大きさ。
　　▲Shrink
　　　実際の解像度におさまるように、縦横の比率を保ったまま縮小する。

# ■解像度に応じてボタンの表示位置を変化したいんやけど

　**・Anchorをいじる**
　　XminとXmaxで横幅を変更、たとえばXmin=0.1 Xmax=0.2なら横幅を１０分割した場合の１と２の間がWidthになる。
　　YminとYmaxで縦幅を変更、たとえばYmin=0.1 Ymax=0.2なら縦幅を１０分割した場合の１と２の間がHeightになる。
　　（注意点）
　　　　▲左下がX=0、y=0なのでXmin=0.1 Xmax=0.2なら左から、Ymin=0.1 Ymax=0.2なら下からの位置になる。


# ■ToggleButton(VBとかC＃のラジオボタン)

　下記を使ってToggleButtonをToggleGroupにまとめればどれか１つしかチェックできなくなる
　http://docs.unity3d.com/ja/current/Manual/script-ToggleGroup.html

　さらにAllow Switch Offにチェックがついていると、
　どれもチェックされていない状況も作れる。
方便的玩意 - Objective-C's Object Literal


Objective-C 的 object literal 已經出來很多年了，可以增進開發的進度、比較易讀，因此也用了很多年，筆記一下有哪些用法。

而這些 object literal ，前面都會跟著編譯器指令 `@` 。

*編譯器指令：compiler directives*

# NSString

這是原本就一直存在的 literal ，用法很簡單

``` objc
NSString *myString = @"Hello";
```

這樣即可。

# NSNumber

NSNumber 本身具有 class cluster 的特性，初始化的時候就可以吃各種的基本型態：

``` objc
NSNumber *integerNumber = [NSNumber numberWithInteger:76];
NSNumber *floatNumber = [NSNumber numberWithFloat:3.14];
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
```
## @

接著就可以換成

``` objc
NSNumber *integerNumber = @76;
NSNumber *floatNumber = @3.14;
NSNumber *boolNumber = @YES;
```

用了 object literal 的方式後，更加容易識別參數的數值

# NSArray

在 object literal 出來之前，NSArray 的初始化很麻煩：

``` objc
NSArray *myArray = [NSArray arrayWithObjects:object1, object2, nil];
```

不只囉唆不易閱讀，最後面還要加的 nil 這個拖油瓶在後面。畢竟 `... NSArray arrayWithObjects: ...` 雖然很容易讀懂我這個 method 要做什麼，但是對要初始化一個陣列，又變得似乎不太需要。

## @[]

有了 object literal 之後，初始化一個陣列變得很簡單乾脆。

``` objc
NSArray *myArray = @[object1, object2];
```

# NSDictionary

NSDictionary 的話更難看出來塞了什麼資料，以下是他的建構方法（還有其他建構方式，請自行參照文件）

``` objc
NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:key1, valueObject1, nil];
```

這時候不只容易搞混哪個是 key 、哪個是 value ，當塞入的參數一多，雖然可以透過分行來辨識，但是還是不是個很好的做法。

最後面一樣必須要有個 nil 這個拖油瓶。

## @{}

有了 object literal 之後，使用 NSDictionary 的生活變得更簡單了。

``` objc
NSDictionary *dictionary = @{key1: valueObject1, key2: valueObject2};
```

# Box Expression - @()

最後一個就是 box expression

這個方法會用來動態產生一個物件，會自動判定 `@([expression])` 中的 expression 結果的值是什麼，則動態回傳對應的型別，

例如

``` objc
// 等於 [NSNumber numberWithInteger:(1+1)] ，會回傳一個 NSNumber 物件
NSNumber *number1 = @(1+1);

// 等於 [NSNumber numberWithInteger:(AnEnum)] ，放入 enum 時，也會回傳 NSNumber 物件
NSNumber *state = @(AnEnum);

// 等於 [NSValue valueWithCGRect:view.frame] ，這時候是放入 CGRect ，則會回傳 NSValue 物件
NSValue value = @(view.frame);
```

# More Information

[Objective-C Literals - Clang Documentation](http://clang.llvm.org/docs/ObjectiveCLiterals.html)
[@ - NSHipster](http://nshipster.com/at-compiler-directives/)
filterを使って配列をフィルタリングする

C#のLinqみたいな機能。
もともと、Dictionaryでやればいいかと思っていたけど、
これだとforでLoopしたときに配列に追加した順番に取得できない。
展開するときに順序立つらしい。
そこでfilterを使って指定したキーのデータを取得する。

データクラス

```lang:swift
class HogeData
{
  var key = ""
  var data = ""
}
```

配列にデータを追加

```lang:swift
  var _data = HogeData()

  private func SetData()
  {
     let data1 = HogeData()
     data1.key = "key1"
     data1.data = "データ1"
     self._data.append(data1)

     let data2 = HogeData()
     data2.key = "key2"
     data2.data = "データ2"
     self._data.append(data2)
  }

```

データ取り出し

```lang:swift
private func GetData(key: String) -> HogeData
{
  var filter =
  {
    (x: HogeData) -> Bool in x.Key == key
  }
  var filterResult = self._data.filter(filter)

  return filterResult[0]
}
```
XCodeのカスタムビルドアクションで使える環境変数

XCodeのカスタムビルドアクションで利用できる環境変数の一覧は、以下のドキュメントに記載されています。

https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/0-Introduction/introduction.html

実際にどんな値が入るのか見たい場合は、以下のいずれかのコマンドを実行することで確認できます。

```
$ xcodebuild -project [プロジェクトディレクトリ] -target [対象target] -showBuildSettings
$ xcodebuild -workspace [ワークスペースディレクトリ] -scheme [対象scheme] -showBuildSettings
```

詳しくはブログにて。

http://matsukaz.hatenablog.com/entry/2015/07/06/090933
WordPressのカスタムフィールドでショートコードを利用する

WordPressには、本文内にプログラムを埋め込むときに利用できる「ショートコード」の機能があります。MW WP Formなどのフォーム系プラグインなども、この機能を利用しています。

本文の場合は、埋め込むだけで簡単に利用できますが、カスタムフィールドの場合はそのままでは利用できません。（Advanced Custom Fieldの場合は「Wygiwig」の場合は利用できます）

この場合、次のようにして画面出力をすると利用できるようになります。

```php
echo do_shortcode( get_field ( 'フィールド名' ) );
```
Terraformビルドした時の手順



## 経緯
2度目のapply実行時にaws_security_group_ruleでWarming出ていたので
ビルドしたら直ったりしないか試してみた。

いろいろ調べるともともとの原因は#2294で
対応したのが#2376だったので現時点ではWarming出るっぽい。

- https://github.com/hashicorp/terraform/issues/2294
- https://github.com/hashicorp/terraform/pull/2376

## 環境準備

### brewでMercurialとGoをインストールする

```
brew install hg
brew install go
```

### 環境変数を設定する
```
mkdir -p /work/golang #GOPATH用のディレクトリ作成
```

### PATHを通しておく
~/.zshrc

```
# Set GOPATH
export GOPATH="/work/golang"

# Set GOROOT
export GOROOT=/usr/local/opt/go/libexec

# PATH is added to the GOROOT.
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

## ビルドする
```
mkdir -p /work/golang/src/github.com/hashicorp
cd /work/golang/src/github.com/hashicorp
git clone git@github.com:hashicorp/terraform.git
cd /work/golang/src/github.com/hashicorp/terraform
make updatedeps
make
make dev
```

## 動作確認をする
```
➜ terraform git:(master) pwd
/work/golang/src/github.com/hashicorp/terraform
➜ terraform git:(master) bin/terraform -version
Terraform v0.6.1-dev (94bc96d3de7bbc78bcf0df6a7fc8db71260d49aa)
```
`laravel new` コマンドで "Undefined variable: output" とおこられたときに確認すること


Laravel をインストールするときは `composer create-project laravel/laravel --prefer-dist` でもいいんだけど、Laravel インストーラーを入れておくと `laravel new` コマンドで Laravel をインストールできるようになって楽ちん。
http://laravel.com/docs/5.1#installation

例えば公式ドキュメントの例で言うと `laravel new blog` とすれば "blog" という名前のディレクトリが作られて、その中に Laravel がインストールされる。

ところが、これをやろうとしたらなんかおこられた。

> PHP Notice:  Undefined variable: output in ~/.composer/vendor/laravel/installer/src/NewCommand.php on line 55

Composer をアップデートしたりインストーラーを入れなおしてみたりしても解決せず。

けどわかってみれば簡単な話で、既存のディレクトリ名でインストールしようとしてた。"blog" ディレクトリが存在するのに `laravel new blog` してた。

インストール先を変えて解決。
gawk 4.0 で csv をもっとうまく扱う

awkでCSVを扱うために、gawk 4.0 で `FPAT=([^,]+)|(\"[^"]+\")` を指定します。
列の値が空文字列の場合 (`,,,` みたいにカンマが連続する場合)には列数を数え損ねるのですが、`FPAT=(,?[^,]+)|(,?\"[^"]+\")` と書いたらなんかうまくいきました。

[![CC-BY-SA-4.0](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 2015-07-04 by matobaa+qiita@gmail.com

## 制限事項

* ダブルクォートの中に改行がある形式には対応していない。
* ダブルクォートをエスケープしたものには対応していない。
* 1列目以外は切り出し文字列の頭に`,`が入るので、もし加工するなら `sub(",","",$N)` してから加工して `sub("^",",",$N)` してやる必要がある。

# どういう意味? #

FPAT は gawk 4.0 以降でつかえる、フィールド切り出しルールを正規表現で指定できる変数です。

* `[^,]+` カンマ以外からなる文字列
* `\"[^"]+\"` ダブルクォートで始まり、ダブルクォートを含まない文字列をへて、ダブルクォートで終わる

# 未確認なこと #

アクションを指定しない場合に `print` を補うか、補わないかにばらつきがあるような気がする。
とりあえず、可搬性を高めるために、<tt>{next}</tt> か <tt>{print}</tt> を書いてます。
【デザインパターン】 Prototypeパターン

##概要
生成すべきオブジェクトの種類を原型となるインスタンスを使って明確にし、それをコピーすることで新たなオブジェクトの生成を行うパターン

以下の4種類のクラスからなる
1. Prototypeクラス(複製のためのインターフェイスを宣言)
2. ConcretePrototypeクラス(1.のオペレーションを実装)
3. Clientクラス(2.に複製を依頼して新たなオブジェクトを生成する)

##具体例と実装
デザインカタログ作成を例にすると

上記1~3はそれぞれ
1. 素材集クラス
2. デザイン素材集クラス
3. デザインカタログ生成クラス

が対応する。
コードの詳細は以下

```rb:clipart.rb
class Clipart
  def initialize
  end

  def clone
  end
end
```

```rb:design_clipart.rb
class DesignClipart < Clipart
  def initialize
  end

  def clone
    # デザイン素材のコピーを作成
  end
end
```

```rb:design_catalog_creator.rb
prototype = DesignClipart.new
design_sample = prototype.clone
# design_sampleを使ってカタログを作成
```


##メリット
* 生成するオブジェクトの追加や削除を実行時に行える
* パラメタ、構造を変えることでオブジェクトの仕様を変更できる
* アプリケーションのクラス構成を動的に決められる

##まとめ
オブジェクトの生成を動的に行い、システム全体で必要になるクラス数を減らすことの出来るパターン
インスタンス化を行う具現化クラスを隠蔽しているためClientオブジェクトを修正せずに特定のアプリケーション向けのクラスと協調させることが出来る
OkHttpのメインスレッドコールバックの実装


OkHttpがサンプルとして用意している[Asynchronous Get](https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/AsynchronousGet.java)レシピのように、OkHttpをバックグラウンド通信に使用した時、`Callback`クラスの`onFailuer`と`onResponse`はどちらもバックグラウンドで実行される
AndroidでOkHttpを使う場合、バックグラウンド通信しなければならない理由から、コールバックをメインスレッドで行いたい場合、毎回以下のように書く必要があった。

```java
new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
    	// do something
    }
});
```

非常にめんどくさいのと行数が無駄に増えるので、コールバックをメインスレッドで行いたい場合のコールバッククラスを実装した

```java:MainThreadCallback.java
public abstract class MainThreadCallback implements Callback {
    private static final String TAG = MainThreadCallback.class.getSimpleName();

    abstract public void onFail(final Exception exception);

    abstract public void onSuccess(final JsonObject responseBody);

    @Override
    public void onFailure(final Call call, final IOException e) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                e.printStackTrace();
                onFail(e);
            }
        });
    }

    @Override
    public void onResponse(Call call, final Response response) throws IOException {
        if (!response.isSuccessful() || response.body() == null) {
            onFailure(response.request(), new IOException("Failed"));
            return;
        }
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {                   
                    JsonObject responseBody = new Gson().fromJson(response.body().string(), JsonObject.class);
                    onSuccess(responseBody);
                } catch (IOException e) {
                    e.printStackTrace();
                    onFailure(response.request(), new IOException("Failed"));
                }
            }
        });
    }

    private void runOnUiThread(Runnable task) {
        new Handler(Looper.getMainLooper()).post(task);
    }
}
```

内部的に`Callback`インタフェースの`onFailure`と`onResponse`を実装して、実際の処理におけるコールバックの実装は`onFail`と`onSuccess`に書けばよい
これで`onFailure`と`onResponse`から勝手にメインスレッドで`onFail`と`onSuccess`がcallされる

これで、コールバックをメインスレッドで行いたい場合は`Call#enqueue`の引数に`MainThreadCallback`を与えるだけで実現できる

```java
client.newCall(request).enqueue(new MainThreadCallback() {
    @Override 
    public void onFail(Exception e) {
        e.printStackTrace();
    }

    @Override 
    public void onSuccess(JsonObject responseBody) throws IOException {
        someTextView.setText(responseBody.toString());        
    }
});
```

必要であれば、メインスレッドで行うメソッドとワーカースレッドで行うメソッドを両方抽象メソッドとして用意しておいて両方callする、みたいにしても良いかもしれない
最新のGoをインストール

## 解凍するだけの方法

* https://golang.org/dl/ から `go1.6.2.linux-amd64.tar.gz`を取得、
* `$HOME/go`に展開

```bash:amd64の場合
VERSION=1.6.2
#VERSION=1.7beta2
ARCH=amd64
#ARCH=386

wget https://storage.googleapis.com/golang/go${VERSION}.linux-${ARCH}.tar.gz
tar xzf go${VERSION}.linux-${ARCH}.tar.gz -C ~
```

```bash:~/.bashrc
export GOROOT=$HOME/go
export GOPATH=$HOME/Documents/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

* buildサイズ

|version|~/go/|helloworld|
|:--|:--|:--|
| 1.6.2 | 322M | 2.2M |
| 1.7beta2 | 252M | 1.6M |


## gvmを使う方法

```bash:
sudo apt-get install -y bison

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
source $HOME/.gvm/scripts/gvm
gvm listall
gvm install go1.6.2
gvm use go1.6.2 --default
```

```bash:
export GOPATH=$HOME/bin/gopath
go version
```
【デザインパターン】 Bridgeパターン

##概要
抽出されたクラスと実装を分離して、それらを独立して変更できるようにするパターン

以下の4種類のクラスからなる
1. Abstractionクラス(抽出されたクラスのインターフェイスを定義)
2. RefinedAbstractionクラス(1.で定義したインターフェイスを拡張する)
3. Imprementorクラス(実装を行うクラスのインターフェイスを定義する)
4. ConcreteImprementorクラス(3.で定義したインターフェイスを実装する)

##具体例と実装
様々なOSでの表計算を例にすると

上記1~4はそれぞれ
1. 表計算生成抽象クラス
2. 表計算ファイル生成クラス
3. 表計算実装抽象クラス
4. Mac表計算クラス、Windows表計算クラス

が対応する。
コードの詳細は以下

```rb:spreadsheet_generator.rb
class SpreadsheetGenerator
  def initialize(klass)
    @spreadsheet_generator = klass.new
  end

  def generate_spreadsheet(data)
    # 表計算オブジェクト出力
    @spreadsheet_generator.generate_spreadsheet(data)
  end
end
```

```rb:spreadsheet_file_generator.rb
class SpreadsheetFileGenerator < SpreadsheetGenerator
  def generate_spreadsheet_file
    # 表計算オブジェクトから表計算ファイルを作成、出力
  end
end
```

```rb:spreadsheet_generate_impl
class SpreadsheetGenerateImpl
  def generate_spreadsheet(data)
  end
end
```

```rb:mac_spreadsheet_generator
class MacSpreadsheetGenerator < SpreadsheetGenerateImpl
  def generate_spreadsheet(data)
    # dataからmacの表計算オブジェクト作成
  end
```

```rb:windows_spreadsheet_generator
class WindowsSpreadsheetGenerator < SpreadsheetGenerateImpl
  def generate_spreadsheet(data)
    # dataからwindowsの表計算オブジェクト作成
  end
```


##メリット
* インターフェイスと実装を分離し、抽出されたクラスの実装を実行時に決定できる
* インターフェイスと実装を独立に拡張出来る
* クライアントから実装の詳細を隠蔽することが出来る

##まとめ
インターフェイスと実装を分離し、それぞれを独立に拡張、提供するパターン
機能追加により生まれる拡張階層と，サポート環境追加により生まれる実装階層を，分離して別個に管理したい場合に用いる
クエリーで or と in の処理時間差を確認する (その3)

[前回](http://qiita.com/nishimry/items/8b2508f4b45d21c59ff9) の Infobright の確認で、ひょっとしてクエリーで union する方がいいのではないかと思ったので確認してみた。


## クエリー

    select
        key4,data1,data2,data3
    from
        t2
    where
        key1='aaa' and key2='bbb' and key3='ccc' and key4='ddd'
    and
        data2 >= n1 and data2 < n2
    union all
    select
        key4,data1,data2,data3
    from
        t2
    where
        key1='aaa' and key2='bbb' and key3='ccc' and key4='eee'
    and
        data2 >= n1 and data2 < n2
    union all
    ・・・
    order by
        key4,data1,data2
    ;


## 結果

** 処理時間(秒)**

| key4 数 (データ取得数) | 10 (14400)    | 20 (28800)    | 30 (43200)    |
|:----------------------|:-------------:|:-------------:|:-------------:|
| in 指定 (前回)         | 1.898         | 3.290         | 4.679         |
| union all 指定         | 2.668         | 5.355         | 7.955         |


**連結でパフォーマンス低下**



ここで、テーブルのつくりをちょっと変えてみる。

##テーブル

    mysql> show create table t3;
    +-------+-------------------------------------------------------------+
    | Table | Create Table                                                |
    +-------+-------------------------------------------------------------+
    | t3    | CREATE TABLE `t3` (
    `key5` char(200) DEFAULT NULL,  <- これまでのkey1+key2+key3+key4
    `data1` char(50) DEFAULT NULL,
    `data2` int(11) DEFAULT NULL,
    `data3` int(11) DEFAULT NULL
    ) ENGINE=InfiniDB DEFAULT CHARSET=latin1 |
 

##クエリー

    (in)
    select
        key5,data1,data2,data3
    from
        t3
    where
        data2 >= n1 and data2 < n2
    and
        (
            id='aaa'
            or
            id='bbb'
            or
            ・・・
        )
    order by
        key5,data1,data2
    ;

    (union all)
    select
        key5,data1,data2,data3
    from
        t3
    where
        data2 >= n1 and data2 < n2
    and
        id='aaa'
    union all
    select
        key5,data1,data2,data3
    from
        t3
    where
        data2 >= n1 and data2 < n2
    and
        id='bbb'
    ・・・
    order by
        key5,
        data1,
        data2
    ;


##結果

**処理時間(秒)**

| key5 数 (データ取得数) | 10 (14400)    | 20 (28800)    | 30 (43200)    |
|:----------------------|:-------------:|:-------------:|:-------------:|
| in 指定                | 4.763         | 9.111         | 13.203         |
| union all             | 2.034         | 4.149         | 6.138         |

**連結でパフォーマンス向上**


##気付き

テーブルのつくり、クエリーの書き方で、大分とパフォーマンス傾向が異なるようだ。
ただ、いずれにしても、InfiniDB で確認したときのようなパフォーマンスは出せていない。



##リンク

[クエリーで or と in の処理時間差を確認する](http://qiita.com/nishimry/items/3776417bee65ba97d316)
[クエリーで or と in の処理時間差を確認する (その2)](http://qiita.com/nishimry/items/8b2508f4b45d21c59ff9)
技術英語 > I [have no intention of] finding out. / intention / intent

引用: Q-SQUARED (STAR TREK: THE NEXT GENERATION)

> And I have no intention of finding out.

「見つけるつもりはない。」

intentionを動詞にした以下の言い方もできる。
I do not intend to find out.

<hr>
関連して思い出したのは
「そんなつもりはなかったんだ」
I did not mean it.

この反対で
I mean it. (本気だよ)
I am serious.

<hr>
ソースコードのコメントには「意図」を書くのがいいという。
intent というのを思い出したが、intent と intention の違いはalcによると

http://eow.alc.co.jp/search?q=intention&ref=wl
> intentが計画的で強い意図を表し、硬い表現なのに対し、intentionは意図を表す一般的な言葉

learnersdictionaryによると
http://www.learnersdictionary.com/qa/intent-and-intention

> <font color=red>Intention</font> implies little more than what one has in mind to do or make happen:
...
> However, <font color=red>intent</font> suggests clear reasoning or great deliberateness and is used in more formal, legal, or official-sounding language:
[フロントエンド探索1]React.jsを始めてみる（tutorialやる）


何かと話題のReact.js。
百聞は一見に如かずっつうことで一回触ろうの回。

## 事前知識

**React.jsとは**
http://qiita.com/koba04/items/4d13caf5ab4507974bf0

**React.jsとFlux**
http://qiita.com/koba04/items/b32ba449d753fdb2b597

## 今回やってみること

素直にtutorialをやってみる。
**本家**（http://facebook.github.io/react/docs/tutorial.html）
**翻訳**（http://mae.chab.in/archives/2529）

こんなのもあったよ：
**React+FluxでTodoMVCを作ってFluxについて学んでみた**
http://yutapon.hatenablog.com/entry/2015/04/27/150000

## 実践

#### 動作確認用のサーバ用意

reactの人が親切にもその辺のファイルを用意してくれているので、
[react-tutorial github](https://github.com/reactjs/react-tutorial)からrequirements.txtとserver.pyを拝借。ありがたや。
(今回はpythonでやってますが、他にも言語は選べるので好きなやつで)

```terminal
$ pip install -r requirements.txt
$ python server.py
 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
```

となればOK。（当たり前だけどブラウザで確認しても404）
public/index.htmlファイルを作成して適当に

```public/index.html
hello world!
```

とでもしてサーバリスタートすればブラウザに表示される。

#### コーディング開始

もはやチュートリアル通りなのであまり書くことはないんだけど、以下の通り。もくもくとチュートリアルをこなしていく。

* index.htmlで、react.js,JSXTransformer,jqueryを読み込む
* public/scripts/tutorial.js作成
* index.htmlでpublic/scripts/tutorial.js読み込ませる

以下を<div id="content">下のscriptタグを置き換える。

```index.html
<script type="text/jsx;harmony=true" src="scripts/tutorial.js"></script>
```

* CommentBoxコンポーネントを作成（tutorial.jsに記述）

##### checkpoint1（進捗：15%）

```
Hello, world! I am a CommentBox.
```
画面に表示されればOK.

* 同様にCommentList, CommentFormクラス追記
* Commentクラス追加
* CommentBoxにCommentList, CommentFormを紐づける

##### checkpoint2（進捗：25%）

```
Comments
Hello, world! I am a CommentList.
Hello, world! I am a CommentForm.
```
出力されること確認。都度サーバーリブート必要。

* CommentListにCommentを追加. propsを使ってCommentListからCommentのプロパティにアクセスできるようにする
* マークダウン記法を使えるようにmarked.min.jsを読み込ませる記述をindex.htmlに追加
* marked関数をCommentクラス内で使ってみる
* XSS攻撃対策を施す。markup部分を改良。

##### checkpoint3（進捗：45%）
```
Comments
Pete Hunt

This is one comment
Jordan Walke

This is another comment
```
出力確認。

* render関数前にjson定義を追加
* jsonデータを読み込みようにrender()とCommentBoxを書き換え

##### checkpoint4（進捗：60%）
表示は変わらないけど、checkpoint3と同じ内容が表示されていればOK.
心配であればjsonデータを書き換えて表示が変わるかやってみるといい。

* 今までtutorial.jsに直書きしていたdataを外部ファイル(json)から取得して表示するようにする
* renderを書き換える。```url="comments.json"```
* getInitialState()とstate追加
* ルート(publicの親階層)にデータ定義用のcomments.jsonを追加

```comments.json
[
  {"author": "Pete Hunt", "text": "This is one comment"},
  {"author": "Jordan Walke", "text": "This is *another* comment"}
]
```

* jsonを取得してstateをアップデートするajax処理を追加
* 上記の処理をloadCommentsFromServer()に切り出して、２秒ごとに実行するように書き換える


##### checkpoint5（進捗：85%）

サーバーを起動して確認するとコメントが確認できるはず。
jsonにデータを追加すると画面にも動的に反映されることが確認できる。

* フォームの改良
* CommentFormにフォーム追加、submit機能を追加
* CommentBoxにsubmitされたデータを扱う関数handleCommentSubmit()を追加。それをonCommentSubmitイベントにバインディングする
* CommentFormからコールバックを呼ぶ一文追加
* handleCommentSubmitを実装

##### checkpoint6（進捗：100%）

確認するとフォームが画面にあるはず。そこに任意の文字を入力すると画面とjsonをアップデートするようになっているはず。


以上でチュートリアルは終わりです。

今回はチュートリアルをなぞっただけで目新しいことはしてないけど、Reactの雰囲気はなんとなくつかめたかな。

にっち
Array.prototype.reduce の第二引数で sum 値を初期化しましょうという話

```js
[1,2,3].reduce(function(a,b){return a + b});// 6
```

[sum(配列の合計を求め)るとき、reduceを使うと便利](http://taiju.hatenablog.com/entry/20110331/1301535208)ですが、いくつか注意すべき点があります。

# `.length` が `0` で失敗

空の配列に`.reduce`を使用すると、例外を起こします。

```js
[].reduce(function(a,b){return a + b});
// Uncaught TypeError: Reduce of empty array with no initial value
```

これは、[第二引数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)に `0` を与えれば解決します。

```js
[].reduce(function(a,b){return a + b},0);// 0
```

# `.length` が 1 で成功、だが…

数値であれば意図通りです。

```js
[1].reduce(function(a,b){return a + b},0);// 1
```

コレクションの場合、失敗します。

```js
[{value:1}].reduce(function(a,b){return (a.value!=null? a.value: a) + b.value});
// {value: 1}
```

MDNにはこうあります。

> `var result = array.reduce(callback[, initialValue]);`
> `callback`
> 4 つの引数を取って、配列内の各値に対し実行するコールバック関数
> `previousValue`
現在処理されている配列要素の 1 つ前の要素。もしくは、`initialValue`。 `initialValue` > については、後で述べます。
> `currentValue`
> 現在処理されている配列要素
> `index`
> 現在処理されている配列要素のインデックス
> `array`
> `reduce` に呼ばれた配列
> __`initialValue`__
> `callback` の最初の呼び出しのときに、最初の実引数として用いるためのオブジェクト。
>   関数が呼び出される初回は、 `previousValue` と `currentValue` は 2 つの値のうちの 1 つを取り得ます。`reduce` 呼び出し時に、`initialValue` が与えられた場合、`previousValue` は `initialValue` と等しくなり、`currentValue` は、配列の最初の値と等しくなります。 __`initialValue` が与えられなかった場合、`previousValue` は配列の最初の値と等しくなり、`currentValue` は、2 番目の値と等しくなります。__
> [Array.prototype.reduce() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)

やはり、第二引数を与えましょう。

```js
[{value:1}].reduce(function(a,b){return (a.value!=null? a.value: a) + b.value},0);
// 1
```

`callback`の引数 `a` は数値で安定するため、 `a.value` をチェックする必要がなくなりました。

```js
[{value:1}].reduce(function(a,b){return a + b.value},0);
// 1
```

# Promiseと組み合わせて非同期の直列処理を使う

[async.waterfall](http://qiita.com/takeharu/items/84ffbee23b8edcbb2e21#1-2) のように、非同期処理を１つずつ実行したいときに、[ES6 Promises](http://caniuse.com/#feat=promises)と組み合わせて、下記のように書けます。

```js
// a、bの位置に注意
[1,2,3].reduce(function(promise,b){
  return promise.then(function(a){
    return new Promise(function(resolve){
      console.log('Start task '+b);

      setTimeout(function(){
        console.log('End task '+b);
        resolve(a + b)
      },500);
    });
  });
},Promise.resolve(0))
.then(function(total){
  console.log(total);// 6
});
```

`resolve` で次のタスクに値を渡します。`setTimeout`を、[XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest) / [fetch](http://blog.rogeriopvl.com/archives/simple-xmlhttprequests-with-window.fetch/)や[^1]、他の非同期処理などに書き換えれば、スクレイピングや、jsonの集計などに応用できます。

> 参考： [コレクションのバカ騒ぎ | Promiseアンチパターン - くじら公園](http://p-baleine.hatenablog.com/entry/2014/03/14/085536)

[^1]: まともなコード載ってるページが英語しか見つけられなかった

# まとめ

初期化しようぜ
配列"への"ポインタ・参照

ある特定の要素数の(静的)一次元配列のみを引数に取る関数を作りたいとする。
今回は例として、`int`型で`10`個の要素を持つ配列のみを引数にとる`void`型関数`foo`を作ってみる。

(多次元配列では下の論理が必ずしも通用しないらしいので今回は論じないことにする)

#とりあえず素朴に
最初はこう考えてみる。

```cpp
void foo(int a[10]){
 a[0] = 0; //アクセス例
 // 処理
}
```
使うならこんな感じ。

```c
int b[10];
foo(b);
```

でもこれはうまくいかない。次のようなコードも問題なくコンパイルを通る。

```c
int c[25]; //要素数過多
foo(c); //コンパイルは素通り
```
##敗因
配列名をコード内に書くと、配列の最初の要素へのポインタになる。
つまり配列`int a[]`について、

```c
a == &a[0]
```
`a`の型は`int*`型に過ぎず、要素数についての情報は持っていない。

#配列"への"ポインタ
ちょっと変えてみる。

```cpp
void foo(int (*a)[10]){
 *a[0] = 0; //アクセス例
 // 処理
}
```
引数は`int *a[10]`*ではなく*`int (*a)[10]`であることに注意。

使うならこんな感じ。

```c
int b[10];
foo(&b);
```
引数にアドレス演算子`&`をつけることに注意。

これなら次のような問題のある引数は弾ける。

```c
int c[25]; //要素数過多
foo(&c); //コンパイルエラー
```

##勝因
配列名に`&`を付けると、"配列そのもの"へのポインタになる。
これは型情報として要素数を持っている。
たとえば、`int a[10]`へのポインタは`int (*)[10]`型である。
要素数が一致しないと型は一致せず、コンパイルエラーを引き起こしてくれる。

#参照でも書ける
C++使いの方なら参照で書きたい、ということもあるだろう。
ポインタで書いたものを少し変えるだけでよい。

```cpp
void foo(int (&a)[10]){
 a[0] = 0;
 // 処理
}
```
使うならこんな感じ。

```c
int b[10];
foo(b);
```
参照の利点である「変数宣言以外に特別な記述が要らない」ことも生きている。

もちろん要素数の違う配列は弾いてくれる。

#テンプレートとのコンビ
要素数が型情報に含まれるということは、テンプレートの処理で要素数が取り出せる、ということだ。
たとえば次のような静的配列の要素数を返す関数。
(`constexpr`はC++11以降でないと通らないので注意)

```cpp
template <typename T,size_t size>
constexpr size_t array_size(T (&)[size]){
  return size;
}
```

(`constexpr`が使えるなら)これはCでよく見る次のマクロの完全な代替になる。

```
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
```
(`std::array`を使えば、とは言わないでほしい)
worldcupコマンドを使ってワールドカップの勝敗結果を確認してみた。

ワールドカップの試合の勝敗結果を『<a href="https://github.com/fatiherikli/worldcup">worldcup</a>』コマンドを使って確認してみました。

<h1>1.インストール</h1>
インストールは簡単。
pipで以下のコマンド入力するだけで終わり。

``` 

$ pip install worldcup

```

<h1>2.試合結果を確認</h1>
worldcupをコマンド上に入力する。

``` 

$ worldcup

```

確かに見れた。
欲を言えば誰がゴールを決めたか？ってのも確認出来れば面白いんだけどなー

![スクリーンショット 2015-07-06 3.56.52.png](https://qiita-image-store.s3.amazonaws.com/0/11200/6fa43895-debc-0c6b-cd91-262fb1fed829.png)