OmniAICreator/Qiita-1.07M huggingface dataset:
Splinter + PhantomJS を使って headless(GUI無し) でブラウザの挙動を制御する

Introduction
===
フロントのテストやスクレイピング、あるサイトでの処理を自動化したい等、ブラウザの挙動をハックしたいケースは多々あると思います。

でも、Mechanize は JavaScript によって制御されているサイトをうまく扱えないし、Selenium の Python-binding のメソッド名は少し冗長であるように個人的には思います。

そこで、Splinter + PhantomJS ですっきりと headless でのブラウザハックを実現したいと思います。

Splinter は Selenium 同様に、ブラウザのエミュレーションより上位のレイヤーで動作していて、各種ブラウザやフレームワークに(Firefox/zope.testbrowser/PhantomJS, etc)統一的な I/F を提供します。

Splinter を I/F として PhantomJS を使ってみるというのが今回の目的です。

Installation
====

今回は pip で Splinter を、apt で PhantomJS を導入しました。

```bash
pip install splinter
apt-get install phanomjs
```


Usage
====

Yahoo!JAPAN の検索で猫画像の URL を収集してみようと思います。

```py

# ブラウザの作成
from splinter import Browser
browser = Browser('phantomjs')

# Yahoo!JAPAN のサイトへ移動
browser.visit('http://www.yahoo.co.jp/')

# 検索ボックスに「猫」と入力
browser.find_by_name('p').first.fill(u'猫')

# 画像検索ボタンをクリック
browser.find_by_id('isearch').first.click()

# 猫画像をグリッドしている div 要素の取得
div = browser.find_by_id('gridlist').first

# グリッド内の img タグを取得して、src 属性を表示
for img in div.find_by_tag('img'):
    print img['src']
```

```
http://r04.isearch.c.yimg.jp/image?id=51fc1a75b99a36669725814b6e474e06
http://r03.isearch.c.yimg.jp/image?id=5def9b9478b5585581f2b3c3c767156f
http://r03.isearch.c.yimg.jp/image?id=43d55d1fe21ef4c4ceed9c1a2faa4dd3
...
```

無事に猫の画像を取得出来ました！！可愛いですね！！

![猫画像](http://r04.isearch.c.yimg.jp/image?id=51fc1a75b99a36669725814b6e474e06)


Tips
====

DOM の要素の検索に用意されているメソッドは次のとおりです。

```py
browser.find_by_css('h1')
browser.find_by_xpath('//h1')
browser.find_by_tag('h1')
browser.find_by_name('name')
browser.find_by_id('firstheader')
browser.find_by_value('query')
```

リンクは次のメソッドで探せます。

```py
browser.find_link_by_text('Link for Example.com')
browser.find_link_by_partial_text('for Example')
browser.find_link_by_href('http://example.com')
browser.find_link_by_partial_href('example')
```


これらのメソッドの結果はすべてリストで返ってくるので、実際の要素を取り出すには、イテレーションするか、インデックスを指定してアクセスしましょう。先頭の要素に関しては .first で取得できます。

```py

elements = browser.find_by_tag('div')
for e in elements: e.click()
elements.first.click()
```

要素の属性には辞書のように \_\_getitem\_\_ で取得できます。

```py

image_links = [image['src'] for image in browser.find_by_tag('img')]

```

References
====
Splinter Documentation (https://splinter.readthedocs.org/en/latest/)
PhantomJS (http://phantomjs.org/)
複数のChromeウィンドウで同時に異なる言語設定（i18nテストに便利）


Chromeの「連絡先」機能を使うことで、ウィンドウ毎に異なる言語設定(Accept-Language)でブラウジングできます。国際化（i18n）ウェブサイトのテストに便利です。

なお、以下の説明では、日本語をプライマリ言語として利用しているものとします。

## 設定手順

### 1. Chromeに "English" ユーザーを追加する。

![設定_と_設定_と_Google_について.png](https://qiita-image-store.s3.amazonaws.com/0/26039/c9035307-c03b-03dd-0c44-91b88c6c065e.png "設定_と_設定_と_Google_について.png")

### 2. "English" ユーザーで新しいウィンドウを開く。

![全画面_2015_02_09_18_38.png](https://qiita-image-store.s3.amazonaws.com/0/26039/6511a2c1-cb9e-980f-675d-e39de247c335.png "全画面_2015_02_09_18_38.png")

### 3. "English" ユーザーのプライマリ言語を英語にする。

![設定_-_言語_と_設定_-_言語_と_複数のChromeウィンドウで同時に異なる言語設定でi18nデバッグする方法.png](https://qiita-image-store.s3.amazonaws.com/0/26039/23990f19-94dd-5fe6-3b5b-632b8a993541.png "設定_-_言語_と_設定_-_言語_と_複数のChromeウィンドウで同時に異なる言語設定でi18nデバッグする方法.png")

### 4. "English" ユーザーで新しいウィンドウを開く。

![About_Google_と_Google_について_と_Google_について.png](https://qiita-image-store.s3.amazonaws.com/0/26039/ee0cfca7-ebf2-8419-6a59-cdc534ef37fb.png "About_Google_と_Google_について_と_Google_について.png")
githubで鍵の登録

githubの鍵認証でパーミッション設定に混乱させられたのでメモ

また、id_rsa以外の鍵を使いたい場合は`~/.ssh/config`ファイルを作成して以下のように設定すればよいらしい。
とりあえず、これでうまくいった。

パーミッションの設定
---------------------------

|ディレクトリ（ファイル)|パーミッション|タイプ|
|:---:|:---:|:---:|
|/home/\<user name\>|755|d|
|.ssh|700|d|
|secret key|600|f|
|config|600|f|

configファイルの中身
-------------------------
```lang:~/.ssh/config
Host github.com
HostName github.com
User git
IdentityFille ~/.ssh/kke_rsa　'各々の秘密鍵'
Port 22
```

対応する公開鍵はgithubのアカウントに登録されていることを前提にしているので、登録していない人は登録しないとダメです。
PHPでCSVファイルをアップロードする(そして配列に変換)


アップロードフォーム↓

```php:index.html
<form action="upload.php" method="post" enctype="multipart/form-data">
  CSVファイル：<br />
  <input type="file" name="csvfile" size="30" /><br />
  <input type="submit" value="アップロード" />
</form>
```


アップロード先に指定したファイル内の処理↓

```php:upload.php
if (is_uploaded_file($_FILES["csvfile"]["tmp_name"])) {
  $file_tmp_name = $_FILES["csvfile"]["tmp_name"];
  $file_name = $_FILES["csvfile"]["name"];

  //拡張子を判定
  if (pathinfo($file_name, PATHINFO_EXTENSION) != 'csv') {
    $err_msg = 'CSVファイルのみ対応しています。';
  } else {
    //ファイルをdataディレクトリに移動
    if (move_uploaded_file($file_tmp_name, "../../data/uploaded/" . $file_name)) {
      //後で削除できるように権限を644に
      chmod("../../data/uploaded/" . $file_name, 0644);
      $msg = $file_name . "をアップロードしました。";
      $file = '../../data/uploaded/'.$file_name;
      $fp   = fopen($file, "r");

	  //配列に変換する
      while (($data = fgetcsv($fp, 0, ",")) !== FALSE) {
        $asins[] = $data;
      }
      fclose($fp);
      //ファイルの削除
      unlink('../../data/uploaded/'.$file_name);
    } else {
      $err_msg = "ファイルをアップロードできません。";
    }
  }
} else {
  $err_msg = "ファイルが選択されていません。";
}
```
CakePHPで日付入力フォームを英語から日本語に変える方法


```php:xxx.ctp
echo $this->Form->input('birthday', array(
	'dateFormat' => 'YMD', 
	'maxYear' => date('Y'), 
	'minYear' => date('Y')-100, 
	'monthNames' => false, 
	'label' => array('text' => '誕生日')
));
```
リンククリックでファイルをダウンロードさせる（PHP）



```php:download.php

<?php
//パス
$fpath = './a.jpg';
//ファイル名
$fname = '画像名.jpg';

header('Content-Type: application/force-download');
header('Content-Length: '.filesize($fpath));
header('Content-disposition: attachment; filename="'.$fname.'"');
readfile($fpath);

```


↑このファイルにリンクを貼れば勝手にダウンロードされる。
CakePHPでsaveAllする時の注意点



## 保存する配列の形式

```php:
$data = array(
    'User' => array(
        0 => array(
            'name' => 'foo',
            'age' => 25
        ),
        1 => array(
            'name' => 'bar',
            'age' => 26
        )
    )
);
```

## 以下のようにセット

```
$this->User->saveAll($data['User']);
```

これ↓だと保存できないので注意。
$this->User->saveAll($data);
vimの使い方まとめ


チュートリアル $ vimtutor

##各モード

- 入力モード (i) → ESCで戻る


- コマンドモード (:) → ESCで戻る


- ビジュアルモード (v) → ESCで戻る
範囲選択ができる


##よく使うコマンド

- vim終了 (:q)

- 上書き保存 (:w)

- 名前をつけて保存 (:w 新しいファイル名)
e.g.):w index2.html

- 変更を保存せずに強制的に終了 (:q!)

- 他のファイルを開く (:e ファイル名)

- 操作の取り消しとその逆 (u/control + r)

- 直前の操作を繰り返す (.)

##移動系コマンド
- 上下左右 (k/l/j/h)

- 先頭に戻る (gg)

- 最後尾に行く (G)

- 画面単位の移動 (control + f/control + b)

- 単語単位の移動 (w/b)

- 行頭/行末へ移動　(^/$)

- 行きたい文字列までジャンプ (f + 文字列)

##テキスト編集コマンド

- カット (x/dd/5dd)
ddで行単位カット,x/ddの前に数字で文字数/行数指定カット

- コピー (yy/3yy)

- 貼り付け (p)

##検索・置換コマンド

- 検索 (/検索語)
検索語が複数ある場合は(n/N)で上下にカーソル移動。

- 今カーソルの下にある単語と同じ語句を検索 (*/#)
*で上に#で下に。

- 同じ行の置換 (:s/検索語/置換語)

- 同じ行の複数置換 (:s/検索語/置換語/g)

- ファイル全体に適用(:%s/検索語/置換語/g)

- ファイル全体に適応するが、一つひとつ確認してくる (:%s/検索語/置換語/gc)

- 複数タブの中身を一斉置換 (:tabdo %s/検索語/置換語)

##ウィンドウ関連コマンド

- 上下に分割 (:sp)

- 左右に分割 (:vs)

- 画面間移動 (control + w)

- 画面を閉じる (:close)

- タブを作る (:tabnew)

- タブの中でファイルを開く (:tabe ファイル名)

- タブを閉じる (:tabclose)

- タブの切り替え (gt)

- 複数ファイルをタブで開く (vim -p file1.html file2.php)

- 複数タブの中身を一斉置換 (:tabdo %s/検索語/置換語)

##プログラミングで使えるコマンド

- 対応する{}までジャンプ (%)

- インデントを整列 (=)
(gg V G)で全選択した後に(=)で全体インデント整列

- 関数などの候補一覧を表示 (control + n)

- まとめて挿入 
(control + vで選択, Iで一番上に挿入, ESC)


- タグの中身を変える(c,i,t)
・変更/削除/挿入 (c/d/y)
・中身/全体 (i/a)
・タグ/""/()/[] (t/"/(/[)

- 行番号の表示 (:set number/nonumber)

- コードの色分け(:syntax on/off)

- タブの間隔を設定(:set tabstop=文字数)

- 検索で大文字小文字を区別しなくなる(:set ignorecase/noignorecase)


##ビジュアルモード

- 文字単位の選択 (v)

- 行単位の選択 (V)

- 矩形選択 (control + v)

- テキスト全選択 (gg)(V)(G)
行頭→ビジュアルモード→行末
wgetの使い方いろいろ




## 使用例

Webサーバーからファイルをダウンロードする

```
$ wget http://www.xxxxx.co.jp/file.tar.gz 
```

リトライ回数を5回に設定してFTPサーバーからファイルをダウンロードする。

```
$ wget -t 5 ftp://ftp.xxxxxx.co.jp/file.tar.gz 
```


FTPサーバーのdirディレクトリ以下を全て取得する

```
$ wget -r ftp://ftp.xxxxxx.co.jp/dir/ 
```

Webサーバーから5段階までリンクをたどりながらファイルを入手する

```
$ wget -l 5 -L http://www.xxxxx.co.jp/index.html 
```

png画像のみを入手する

```
$ wget -A .png http://www.xxxxx.co.jp/index.html 
```


-P オプションをで保存先ディレクトリを指定する

```
$ wget http://example.com/hoge.tar.gz -P /tmp
```



## ミラーサイトを作る場合に便利なオプション

|オプション|	説明|
|:-----------|:------------|
|-p, --page-requisites|	ページを適切に表示するために必要な関連ファイルを取得する。|
|-r, --recursive|	再帰的に取得する。|
|-l, --level|	再帰の深さ（1 以上）を指定。0 は無限に再帰する。
|-k, --convert-links|	リンクの URL をミラー先をポイントするように修正する。
|-K, --backup-converted|	URL 修正前のファイルを保存する。
|-N, --timestamping|	修正があったファイルのみを再取得する。


- 特に、-k を指定する場合は、同時に -K を指定しないと、-N によるタイムスタンプ比較がうまく機能しない場合がある。
- -r を指定しない時は、指定ページのみを取得する。
- -p を付加することで、そのページを表示するために必要な画像ファイルなどを追加で取得する。
- -r を指定した場合は、-l N で N クリック先の画面まで取得する。
JavaScriptでnewを使わずnewを再現する




```js

/**
 * usage
 *   var obj = _new(Constructor, arg1, arg2, arg3);
 */
function _new(Constructor /* ...args */) {
    if(typeof Constructor !== "function") {
        throw TypeError();
    }

    var args = Array.prototype.slice.call(arguments, 1);
    var obj = Object.create(Constructor.prototype);
    var objc = Constructor.apply(obj, args);

    if(objc == null) {
        return obj;
    }

    switch(typeof objc) {
        case "number":
        case "string":
        case "boolean":
            return obj;
        default:
            return objc;
    }
}

// Cクラス
function C(c) {
    this.c = c;
}

var c = _new(C, "hello");
console.log(c.c);               // => hello
console.log(c instanceof C);    // => true


// Cクラスを継承したDクラス
function D(c, d) {
    C.call(this, c);
    this.d = d;
}

D.prototype = Object.create(C.prototype);

var d = _new(D, "hello", " world");
console.log(d.c + d.d);         // => hello world
console.log(d instanceof C);    // => true
console.log(d instanceof D);    // => true



// オブジェクトを返すコンストラクタのEクラス
function E(e) {
    this.e = e;
    return [1, 2, 3];
}

var e = _new(E, "hello");
console.log(e.e);               // undefined
console.log(e);                 // [1, 2, 3]


```
EBSボリュームの容量を増やす







# 容量を増やす

## 1. インスタンスを停止させる

[Actions]から[Stop]を選択。

![スクリーンショット 2015-02-09 17.03.31.png](https://qiita-image-store.s3.amazonaws.com/0/18614/bf8a4c55-7284-7fe3-19ca-c4230e20d47c.png "スクリーンショット 2015-02-09 17.03.31.png")


## 2. スナップショットを作成する

拡張するボリュームのスナップショットを作成する。


### EBSのIDを確認
さきほどストップさせたインスタンスの詳細から、EBSのIDを確認する。青文字/dev/xvdaをクリックすると、EBSIDが確認できる。

![スクリーンショット 2015-02-09 17.13.01.png](https://qiita-image-store.s3.amazonaws.com/0/18614/0f9fe362-6211-f73a-8cda-fc8dbb56014b.png "スクリーンショット 2015-02-09 17.13.01.png")

### スナップショットの作成

左側メニューのVolumesをクリック。

![スクリーンショット 2015-02-09 17.06.23.png](https://qiita-image-store.s3.amazonaws.com/0/18614/36f5a0d4-7cae-1890-b62c-f441f629ef68.png "スクリーンショット 2015-02-09 17.06.23.png")

[Volume ID]がさきほど確認したEBSのIDと同じものにチェックを入れる。

![スクリーンショット_2015-02-09_17_16_03.png](https://qiita-image-store.s3.amazonaws.com/0/18614/d51a6958-7df0-2463-4ef9-3cca069ace09.png "スクリーンショット_2015-02-09_17_16_03.png")

[Actions]から[Create Snapshot]を選択。適当にNameとDescriptionを入れてCreate。


## 3. スナップショットから新しいボリュームを作成する
左側メニューのSnapshotsをクリック。

![スクリーンショット 2015-02-09 17.22.55.png](https://qiita-image-store.s3.amazonaws.com/0/18614/ce3662d2-25b8-dfae-0117-479b9c56a24f.png "スクリーンショット 2015-02-09 17.22.55.png")

作成したスナップショットのステータスが [pending]から[completed] に変わるのを待つ。変わったらスナップショットを選択し、[Actions]から[Create Volume] をクリックする。

ボリュームタイプと容量のサイズを選んで、Create。

※ボリュームタイプについてはこちら参照（http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSVolumeTypes.html）

## 4. 古いボリュームをデタッチして新しいボリュームをアタッチする。
古いボリュームを右クリックし、[Detach Volume]を選択する。

新しいボリュームを右クリックし、[Attach Volume]を選択する。


## 6. インスタンスを再起動する。

左側メニューから[Instances]をクリックして、該当インスタンスを選択。[Start]をクリックして起動する。


以上。

# (おまけ)容量の確認
以下のコマンドで容量確認。


```
$ df -h
```
Subversionをインストールする

とある案件で、Subversionによるファイル管理が必要になったので
その時の流れをメモ

# インストール
必要なものをインストールしちゃいましょう

## Subversion本体
[Apache™ Subversion®](http://subversion.apache.org/packages.html)のダウンロードページから
自分のOSにあわせたやつを選んでDL
インストーラーからインストールするいつもの流れで完了、基本Nextを選択すれば問題なしです

## クライアントツール
今回はTortoiseSVNを利用
英語はよくわからないので、LanguagePackを利用して日本語化もしちゃいます
[TortoiseSVN](http://tortoisesvn.net/downloads.html)
真ん中辺りにあるLanguagePackからJapaneseを選択
こちらもいつもの流れで完了

## 日本語化
何でもいいのでフォルダを右クリック、メニューから「TortoiseSVN」→「Settings」を選択
General→Languageのプルダウンから日本語を選択するとOK

![settings.jpg](https://qiita-image-store.s3.amazonaws.com/0/37027/cf58b9a9-347a-61a5-b8ae-02fd7903a142.jpeg)

そこに”日本語”がいらっしゃらない場合はLanguagePackをDLできていないので、前項に戻ってやり直そう

# リポジトリを作る
ついでなので、リポジトリの作り方も。。。

任意の場所にディレクトリを作り右クリック、メニューから「SVNチェックアウト」を選択
リポジトリのURLとチェックアウト先のディレクトリを設定して完了

後は良しなにお願いしますー
Packerで作ったAMIにServerspecを適用してちゃんとできたか確認する

* shellなりcloud-initなりでプロビジョニング
* ローカルにあるServerspecのテストケース一式をアップロード
* ExecでServerspecを実行する

こんな手順。

なお、Packerはプロバイダに依存せずプロビジョニングができるので、AWSのAMIだけでなくOpenStackやら何やらにも使えるのでは。

### `設定.json`

```json:settei.json
{
...
  "provisioners": [
    {
      "type": "shell",
      "script": "provisioners/setup.sh",
      "execute_command": "{{ .Vars }} sudo -E sh '{{ .Path }}'"
    },
    {
      "type": "file",
      "source": "serverspec",
      "destination": "/tmp"
    },
    {
      "type": "shell",
      "script": "provisioners/run-serverspec.sh",
      "execute_command": "{{ .Vars }} sudo -E sh '{{ .Path }}'"
    }
  ]
}
```

`sudo` 云々は[公式にある](https://www.packer.io/docs/provisioners/shell.html) sudoさせる設定。

### Serverspecする

プロジェクトの `serverspec/` 以下に `serverspec-init` などで **Exec** 設定のプロジェクトを用意しておこう。

`run-serverspec.sh` はこんな感じで。

```bash:run-serverspec.sh
#!/bin/bash

yum -y -q install rubygem-bundler
cd /tmp/serverspec
bundle install --path vendor/bundle
bundle exec rake spec

rm -rf /tmp/serverspec
yum -y -q remove rubygem-bundler
```

![スクリーンショット 2015-02-09 17.34.43.png](https://qiita-image-store.s3.amazonaws.com/0/569/41f402db-afa4-c9b5-b99d-df2efedae1b5.png)


### 参考

* http://www.morethanseven.net/2014/01/01/testing-packer-created-images-with-serverspec/
MySQLまとめ　その4

#PROCEDURE使い方
ProcedureとはMySQLにおけるコードの一連の処理を名前をつけて関数のように使うことができるもの。

##作成
Procedureを使ってテーブルの中身を表示させる。

    delimiter //
    CREATE PROCEDURE プロシージャ名
    BEGIN
    SELECT * FROM REGION;
    END
    //

BEGINとENDの間にコードを書きます。

![Selection_007.png](https://qiita-image-store.s3.amazonaws.com/0/59356/6df9f085-2d97-8401-b2e3-4779254d855d.png)


##呼び出し
CALL できれば結果を表示される。

    CALL プロシージャ名;

![Selection_002.png](https://qiita-image-store.s3.amazonaws.com/0/59356/334da63e-47ce-98c4-f37a-d319c6edf2b0.png)

先ほど作成したProcedureを呼び出してテーブルの中身を表示させることができた。

##一覧表示
作成したプロシージャの一覧を表示


    SHOW PROCEDURE STATUS;

![Selection_006.png](https://qiita-image-store.s3.amazonaws.com/0/59356/b7967410-9af6-4801-b2f6-530a840569b9.png)


##確認
作成したプロシージャの詳細を表示

    SHOW CREATE PROCEDURE プロシージャ名;

![Selection_008.png](https://qiita-image-store.s3.amazonaws.com/0/59356/d88039a3-52b7-fef5-c74d-bc2ae1bbd651.png)


##削除
作成したプロシージャを削除

    DROP PROCEDURE プロシージャ名;

#URL
http://qiita.com/setsuna82001/items/e742338eb93e3a48ba46

#ビュー(view)
ビューとはselect文などを作成する際、コードを抜き出し別のテーブルのように扱うことができるもの

##ビューの作成



コード

    CREATE VIEW view名 
    AS 抜き出したコード;

参照テーブル


![Selection_009.png](https://qiita-image-store.s3.amazonaws.com/0/59356/68e0ff53-dc43-0406-aa7d-7ab0c97281ff.png)
参照したテーブルをid >= 100の条件で表示させる。


viewコード

![Selection_010.png](https://qiita-image-store.s3.amazonaws.com/0/59356/54631b57-8c05-cd2c-784c-86f9914a87b6.png)
条件のid >= 100の条件に当てはまる内容を表示できた。

#URL
http://www.dbonline.jp/mysql/view/

#Trigger
Triggerとは、データの変更などによってあらかじめ指定した処理を自動的に実行する機能です。

##Triggerの作成
記述するにはBEGIN END文の間に使ってコードを書きます。

    DELIMITER //
    CREATE TRIGGER (trigger名) AFTER DELETE ON (table名) FOR EACH ROW
    BEGIN
    DELETE FROM (table名) ... ;
    INSERT INTO (table名) ... ;
    END;
    //

    DELIMITER ;

##Triggerの削除
    drop trigger (trigger名);

##Triggerの一覧
    show triggers;

![Selection_012.png](https://qiita-image-store.s3.amazonaws.com/0/59356/3bbac2e8-715f-5a19-a84b-bc494c371db0.png)
作成したトリガの情報が作成されています。

    Trigger    トリガ名
    Event      トリガの種類(INSERT, UPDATE, DELETE)
    Table      対象テーブル
    Statement  実行するSQL文
    Timing     タイミング(BEFORE, AFTER)



#URL
http://www.dbonline.jp/mysql/trigger/index1.html

#MySQL CSVファイル入出力
CSVファイルをMySQLに接続しテーブルに値を取り込む。
##入力

コード解説

    LOAD DATA INFILE "(ファイル名)" 
    INTO TABLE (テーブル名) 
    FIELDS TERMINATED BY '(区切り文字)' 
    ENCLOSED BY '"';

コード

    LOAD DATA LOCAL INFILE "c:/data.csv" 
    INTO TABLE data FIELDS 
    TERMINATED BY ',' 
    ENCLOSED BY '"';

CSVファイルの中身

80,|"sample7"
90,|"sample8"
100,|"sample9"

![Selection_013.png](https://qiita-image-store.s3.amazonaws.com/0/59356/a0491376-d1fe-5fa3-2990-a18310b19116.png)




##出力
コード解説

    SELECT * FROM テーブル名 
    INTO OUTFILE "ファイル名" 
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '囲み文字の指定';

コード

    SELECT * FROM data
    INTO OUTFILE "c:/data" 
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"';

出力結果

 id  | item      
-----+-----------
  80 | "sample7" 
  90 | "sample8" 
 100 | "sample9" 



#URL
http://sasuke.main.jp/sqlcsv.html

##エラー時　ファイルが見つからない場合
    mysql --local-infile=1 
    -uUser1 
    -pPasswordA 
    databaseD
deviseのユーザー登録に項目を追加する。


## やりたいこと
deviseのユーザー登録時に独自の入力項目を追加する.

## 環境
* ruby 2.1.3
* rails 4.1.6
* devise 3.4.1

## 手順
1. usersテーブルに独自に追加する項目のカラムを追加する。

2. deviseのregistrations_controllerにパラムを追加する

```ruby:registrations_controller.rb
def sign_up_params
     devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email ...) }
     super
end
```

3.　ユーザー登録フォームに項目を追加
PSGIで.cgiプログラムを動かすときはshebangに注意しよう

plenv + cpanmな環境でMovableTypeをPSGIで動かそうとしたのですが、

`plackup mt.psgi` で起動した後、
ブラウザで mt.cgiにアクセスしたところ、
* mt.cgi　→ mt-upgrade.cgi にリダイレクト
* mt-upgrade.cgiが `DBD::mysql`を見つけられなくてエラー

という現象に遭遇しました。(starmanで起動しても同じエラー)

エラーメッセージを見てみると、`@INC`がplenvのそれではなくsystem perlのデフォルトのライブラリパスになっていました。

plackupの-Iオプションでライブラリパスを指定しても、スクリプト内のuse libの引数をいじってみても効果なし。

## 原因はshebangでした。

２時間ほど格闘したあげく、原因がわかりました。
.cgiファイルのshebangが原因で、system perlの上で動いてしまっていました。

```diff
diff --git a/mt-upgrade.cgi b/mt-upgrade.cgi
index 8e3c540..70da90c 100755
--- a/mt-upgrade.cgi
+++ b/mt-upgrade.cgi
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl

 # Movable Type (r) Open Source (C) 2001-2013 Six Apart, Ltd.
 # This program is distributed under the terms of the
diff --git a/mt.cgi b/mt.cgi
index 20b6de9..198f88b 100755
--- a/mt.cgi
+++ b/mt.cgi
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl
```

一括で置換するにはこうすればOKです。

```
find . -name '*.cgi' | xargs perl -pi -e 's|#!/usr/bin/perl -w|#!/usr/bin/env perl|'
```

これで直りました。


~/.plenv/shims/plackupから起動してるんだから.cgiファイルのシェバンは無効だろうと思い込んでいたのですが、どうやらPSGIでcgiファイルを読み込むとシェバンが優先されてしまうようです。

PSGIの仕様なんでしょうか？
Redmineの履歴付きCSVエクスポート(縦)

Redmineの履歴付きCSVエクスポート(縦)
===

はじめに
---
Redmineは便利ですがオフラインの環境で打ち合わせをやる時などはCSV出力してExcelで印刷したりしたいこともあると思います。
しかし、デフォルトのCSVエクスポートでは履歴がつかないので、この用途には使い物になりません。

プラグインがあったけど・・・
---
探してみると[こんな](https://github.com/suer/redmine_export_with_journals)プラグインを公開してくれている方がいて感激です。
大体用途にあっているのですが、唯一、履歴が同一行の末尾にひたすら横についていきます。

履歴は数十に渡ることもざらですので、Excelで開くとものすごく横長なファイルになります。
惜しい、実に惜しい。

ちょっと直しました。
---
そこで横ではなく縦につくように修正した[フォーク](https://github.com/shouta-dev/redmine_export_with_journals/tree/vertical)を作成しました。

下記のような感じに出力されます。

### upstream

```
1,aaaa,bbb,ccc,ddd,journal1,journal2,journal3
2,AAAA,BBB,CCC,DDD
```

### this fork

```
1,aaaa,bbb,ccc,ddd,journal1
"","","","","",journal2
"","","","","",journal3
2,AAAA,BBB,CCC,DDD
```

入れたのは[このコミット](https://github.com/shouta-dev/redmine_export_with_journals/commit/907b47cc18ad752d7df6a3b04a6c4c50f7d42cf8)位でほとんどそのままですが。

インストール
---
使いたい方は下記の手順で行けるはずです。

1. $ cd REDMINE_ROOT/plugins
2. $ git clone https://github.com/shouta-dev/redmine_export_with_journals.git
3. $ git checkout vertical
4. restart redmine

終わりに
---
ほぼ他人のふんどしですが、要望にはまる人がいたら使ってみてください。
CakeDC Search plugin が MySQL server version for the right syntax to use near 'validateSearch' at line 1で動かない時

CakephpのCakeDC Search plugin を使おうとしたときに

```
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'validateSearch' at line 1
```
と言われて動かないときは


```php
public $uses = array('今のコントローラーのモデル', 'User', 'Page');
```

今のコントローラーのモデルを最初に書くと治る。
UIButtonなどの同時タップを禁止する再帰メソッド


# 前置き

UIButtonなどの同時タップにより起きる不具合は多い。

例えば、UINavigationControllerなどを使っている画面で、pushするボタンを同時タップすれば同時に2つのViewControllerがpushされ、意図した画面階層にならなくなる。

（私はこれを”ViewController階層が破壊された”と表現している）

# 同時タップを禁止する

それを防ぐには簡単で、UIViewで定義されているexclusiveTouchをtrueにしてあげれば良い。

```swift
button1.exclusiveTouch = true
button2.exclusiveTouch = true
```

これで`button1`と`button2`の同時タップは禁止される。

# 再帰的に適用する

こんな感じで簡単にできるものなのだが、いかんせん __面倒な上に設定漏れがあったらアウト__ である。

そもそも __同時タップを有効にしたい方が稀__ なので、デフォルトですべての同時タップを禁止したいくらいである。

というわけで以下のように再帰的に適用するコードを書くと便利な気がした。

```swift
import UIKit

extension UIViewController {
    
    func exclusiveAllTouches() {
        self.exclusiveTouches(self.view)
    }
    
    private func exclusiveTouches(view: UIView) { // 再帰関数
        for view in view.subviews {
            let aView = view as UIView
            aView.exclusiveTouch = true
            self.exclusiveTouches(aView)
        }
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.exclusiveAllTouches() // これを呼ぶだけで同時タップが防げる
        
        // TODO: 同時タップを許したいViewだけ個別にexclusiveTouchをfalseに
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

```

# おまけ

Swift使いだったら以下のように書くのがスマート（たぶん）

```swift
extension UIViewController {
    
    func exclusiveAllTouches() {
        self.applyAllViews { $0.exclusiveTouch = true }
    }
    
    func applyAllViews(apply: (UIView) -> ()) {
        apply(self.view)
        self.applyAllSubviews(self.view, apply: apply)
    }
    
    private func applyAllSubviews(view: UIView, apply: (UIView) -> ()) {
        let subviews = view.subviews as [UIView]
        subviews.map { (view: UIView) -> () in // Swiftのmapって戻り値なくても大丈夫なのね（ちょっと不気味
            apply(view)
            self.applyAllSubviews(view, apply: apply)
        }
    }
}
```
Image replacement 2015（いわゆる画像置換）


様々な画像の置換方法があるのですが、2015年02月時点で色々と（IE8対応しつつ SPもワンソースで）安定して使える方法は以下かなと。

```html:html
<h3 class="nir section02__sub_title">Image replace</h3>
```

に対して

```CSS:CSS
.nir { /* Only single line text / IE8 capable */
	line-height: 1em;
	overflow: hidden;
}
.nir:after {
	display: block;
	line-height: 0;
	margin-top: -1em;
}
.stitle_replace:after {
	content: url(../img/image_replace.png);
}

@media screen and (max-width: 640px) {

/* SPではテキストを使う場合 */
.stitle_replace {
	line-height: 1.8;
	overflow: auto;
/* do decolate as you like */
}
.stitle_replace:after {
	content: none;
}

/* SPでも画像を当てる場合 */
.stitle_replace:after {
	content: "";
	display: block;
	width: 100px;
	height: 100px;
	background-image: url(../img/image_replace_2x.png);
	background-size: cover;
}

} /* media */

```

としておく。

テキストの高さを1行分に抑えるので、長い文章には向かない。
Image replacement は あくまでも見出し等をグラフィカルに表現したい場合のみ行うものと判断するので、とりあえずコレで運用。
テンプレートエンジンをjadeからectにしてみたらエラーが出なくてつまづいた。(expressのエラーハンドリングについて)


# error.ectがあるせいでエラーが表示されない。

error.jadeをerror.ectにしておいたものだから、
error.ectが **正常に** 表示されている。

```エラー時のページ表示
extends layout block content h1= message h2= error.status pre #{error.stack}
```

って表示されるだけでerror内容が不明。

そこで、error.etcの中身もetcの記法に書き換えて…。

```error.etc
<% extend 'layout' %>
<%= @message %>
```

で、エラーが表示されて原因が特定できた。

#おまけ

app.jsにerrorハンドリングが以下のように書いてあるから、
console.logとかで出すことも出来る。

```myapp/app.js
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
	app.use(function(err, req, res, next) {
		console.log(err); //追加
		res.status(err.status || 500);
			res.render('error', {
			message: err.message,
			error: err
		});    
	});        
}    
```

タイトル長いね。
Ruby on Railsチュートリアル中のメモ

#詰まったとことか
 http://railstutorial.jp/ にそって学習中に詰まったところのメモを残しておく。

## 1章
- Versionまわり 
 - Herokuに対応してないバージョン等ある
 - $ rvm hogehogeでなんとか  

## 2章

- $ rails generate scaffold User name:string email:string
 -  /Users/Hiroki/Documents/RoR/demo_app/config/environments/development.rb:1:in \`<top (required)>': undefined method `configure' for # <DemoApp::Application:0x007fa07c345c28> (NoMethodError)
     - http://stackoverflow.com/questions/23388205/rails-generate-scaffold-error
     - development.rb の1行目の修正

- $ rails s
 - DEPRECATION WARNING: You didn't set config.secret_key_base. Read the upgrade documentation to learn more about this new config option. (called from service at /Users/Hiroki/.rvm/rubies/ruby-2.0.0-p598/lib/ruby/2.0.0/webrick/httpserver.rb:138)  
     - http://takeg.hatenadiary.jp/entry/2014/10/24/015803
     - secret_token.rbの作成

- $ git push heroku master
 - NoMethodError: undefined method \`configure' for #<DemoApp::Application:0x007fa758b2f5f0>remote: /tmp/build_3bd2a4b4e12a86d2d7e35e2dace3b754/config/environments/production.rb:1:in `<top (required)>’
     - http://mocolab.com/?p=979
     - production.rbの1行目の修正
     - pushされるのはcommit後のものなので、修正 → commit → push しないとダメ…
 - NoMethodError: undefined method `dump_schema_after_migration=' for ActiveRecord::Base:Class
     - http://mocolab.com/?p=979
     - production.rb の最終行をコメントアウト

- $ heroku run rake db:migrate
 - Running \`rake db:migrate` attached to terminal... up, run.3476       Timeout awaiting dyno, see https://devcenter.heroku.com/articles/one-off-dynos#timeout-awaiting-process
     - http://stackoverflow.com/questions/14892200/cant-heroku-run-rake-db-migrate-through-my-ap...
     - $ heroku run:detached rake db:migrate に修正

## 3章
- $ bundle install
 - Bundler could not find compatible versions for gem "sprockets-rails":
  In snapshot (Gemfile.lock):
    sprockets-rails (2.2.4)
  In Gemfile:
    rails (= 4.0.5) ruby depends on
      sprockets-rails (~> 2.0.0) ruby
Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
 - $ bundle updateをするといくつかgem install しろみたいなことを言われた
     - 赤文字が消えるまでgem installしたらbundle installもできた

- $ rails generate rspec:install
 - /Users/Hiroki/Documents/RoR/sample_app/config/environments/development.rb:1:in `<top (required)>': undefined method `configure' for #<SampleApp::Application:0x007f8698ca0de8> (NoMethodError)
     - development.rb の一行目の修正(2章と同様)

- $ bundle exec rspec spec/requests/static_pages_spec.rb
 - /Users/Hiroki/Documents/RoR/sample_app/config/environments/test.rb:1:in `<top (required)>': undefined method `configure' for #<SampleApp::Application:0x007fec45018798> (NoMethodError)
     - config/environments/test.rbの一行目修正(いつもの)

## 4章
とくになし

## 5章
とくになし

## 6章
とくになし

## 7章
- http://localhost:3000/users/1 にアクセスしたとき
 - `cannot load such file -- bcrypt  `
 - railsを再起動する

## 8章
- とくになし

## 9章
- edit.html.erb作成後のテスト実行
 - 24行目 <%= gravatar_for @user %>がタイポ
 - <%= gravator_for @user %>に修正
[Ruby]the method expand_path in File class



```ruby
    # File.expand_path(file_name [, dir_string] )  ->  abs_file_name
    #  
    # Converts a pathname to an absolute pathname. Relative paths are
    # referenced from the current working directory of the process unless
    # <i>dir_string</i> is given, in which case it will be used as the
    # starting point. The given pathname may start with a
    # ``<code>~</code>'', which expands to the process owner's home
    # directory (the environment variable <code>HOME</code> must be set
    # correctly). ``<code>~</code><i>user</i>'' expands to the named
    # user's home directory.
    # 
    #    File.expand_path("~oracle/bin")           #=> "/home/oracle/bin"
    #    File.expand_path("../../bin", "/tmp/x")   #=> "/bin"
    def self.expand_path(p1, p2 = v2)
        #This is a stub, used for indexing
    end
    
    
```

    
把一个路径名转换为绝对的路径!
如果没有给` dir_string` 的话,相对路径是根据当前工作目录来处理的.
    
这么说, 第一个字符串里的东西是要从后面给的那个字符串表示的位置执行的位置移动操作.
举个例子:

```ruby

File.expand_path("../../bin", "/tmp/x")
# 我当前在`/tmp/x`.我要往上2级然后到`/ bin` 目录..
#最后的结果就是达到一个路径字符串'/bin/'   

> "/bin"
            
#看看我们的想法是否正确,如果我们这样呢?

File.expand_path("../../bin", "/tmp/x/x")

#会得到什么呢? 按照我们之前的理解,肯定就是从`/ tmp/x/x` 往上2级到 `bin`  目录.
#也就是`/tmp/bin` 了.
#结果呢

> "/tmp/bin"

```

还有一个地方需要注意哦的就是,如果当前在执行这个方法的位置,虽然它是一个文件,但是它算一级目录.

```ruby                                         
`-a
  `-aa
    `-a.rb
 -b
  `-b.rb
 
``` 

在什么的目录结构下,我们要从`b.rb` require `a.rb`,应该是这样写的:

```ruby

require File.expand_path("../../a/aa/a", __FILE__)
```

意思就是当前这个 b.rb 文件虽然感觉上它往上一级就到了根目录,但是其实它本身也是包含在内的.所以需要往上2级,它自身包含在内的.


就是这个意思了,可是我总是每次看到这个方法名就迷糊,为什么是` expand_path` 呢!
springを1.3.0にしたらgit指定のgemを読み込めなくなる場合の対処法

```diff:bin/spring
@@ -9,7 +9,7 @@ unless defined?(Spring)

   if match = Bundler.default_lockfile.read.match(/^GEM$.*?^    spring \((.*?)\)$.*?^$/m)
     ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR)
-    ENV["GEM_HOME"] = ""
+    ENV["GEM_HOME"] = nil
     Gem.paths = ENV

     gem "spring", match[1]
```

のようにbin/springで `ENV["GEM_HOME"]` に `nil` を代入するように変更するとspringを起動できるようになる。

## 詳細

まとまっていないが、問題発生から調査過程などを適当にメモとして残す。

[rails/spring](https://github.com/rails/spring)のバージョンを1.3.0にあげたら、突然railsを起動できなくなった。

```console
$ rails c
git://github.com/activeadmin/activeadmin.git (at 9fac110) is not yet checked out. Run `bundle install` first.
```

activeadminは直接github上のリポジトリを指定していて、どうやらrubygemsを経由せずにgitリポジトリを直接参照している場合に問題が発生するっぽい。

```rb:Gemfile
gem 'activeadmin', github: 'activeadmin', ref: '9fac1106ca'
```

bundlerの中で[エラー文字列を出力している箇所](https://github.com/bundler/bundler/blob/13f56970165613af53c7ab9b785527da2d98d890/lib/bundler/source/git.rb#L188-L193)から深堀りしていくと、非常に気が付きにくいが、環境変数の `GEM_HOME` が突然切り替わりbundlerの読み込みパスが変わり、その結果デフォルトで指定されている正しいパスが上書きされておかしくなっていた。

そこでなんとなく `git grep GEM_HOME` したところbin/springだけがヒットした。そこでふと今日springのバージョンを1.2.0から1.3.0に上げたことを思い出したので、再度[差分を確認した](https://github.com/rails/spring/compare/v1.2.0...v1.3.0)ところ、[怪しいコミット](https://github.com/rails/spring/commit/666db7ddbdf990f9ef03cc52c872c4e402cc543d)を発見し、試しに本記事の先頭にあるように変更してみたところ、railsを起動できるようになったことを確認した。
Linux上のcakePHP2からSQLServerへ接続するときのベタープラクティス

##結論
https://github.com/rchavik/datasources
ここからMSSQLを拾ってきて使えばいいと思うよ。

##前提
アプリケーションOS　=> Linux
言語　=> PHP5.2以上
フレームワーク => cakePHP2系列
DBサーバー => SQLServer

既にSQLServerとPHPは連携済みとする

##問題点

cakePHPのSQLserverへの接続は[pdo-sqlsrv](http://php.net/manual/ja/ref.pdo-sqlsrv.php)を前提としているらしい。
しかし、pdo-sqlsrvは.dll形式しか存在せず、つまりwindowsサーバー上にアプリケーションが載っていないとコレは利用できない。

##解決策

選択肢

1. [cakePHPのDatasourceとかを書き換えてpdolib経由でSQLServerを利用する](http://hanhans.net/blog/hanhan/2014/05/01/linux%E7%92%B0%E5%A2%83%E3%81%A7cakephp2%E3%82%92sqlserver%E3%81%AB%E3%81%A4%E3%81%AA%E3%81%90/)
2. githubからmssql対応のコードを引っ張ってくる
3. その他

たぶんどっちでもある程度の解決は出来る。
がどれも全く異なる対処方法をとっているので、絶対にコレがいい！とはいえないが、
簡単なのは2番の選択肢

1は意外と書き換えが大変。あと、記事内にサブクエリが発行できないとか書いてある。それは困る

ということで、今回はgithubからmssqlを引っ張ってきて対応。

##手法

https://github.com/rchavik/datasources/tree/mssql-2.0 
上記から

[Mssql.php](https://github.com/rchavik/datasources/blob/mssql-2.0/Model/Datasource/Database/Mssql.php) をapp/Model/Datasource/Database/Mssql.php
[NativeDriverSource.php](https://github.com/rchavik/datasources/blob/mssql-2.0/Model/Datasource/NativeDriverSource.php) をapp/Model/Datasource/NativeDriverSource.php
に設置する

あとはいつもどおりに
Config/database.phpを書き換えますが、以下の変更が必須です。

```
	public $default = array(
-		'datasource' => 'Database/Mysql',
+		'datasource' => 'Database/Mssql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'database_name',
		'prefix' => '',
		//'encoding' => 'utf8',
	);
```

とすると見事に動くと思います。
abstract Method

abstract Methodの実現方法

インターフェイスで子クラスを固めてbuild時にエラーにするほうがベターな気はしますが、
インターフェイスは子クラス側でいれるので親クラスをつくった人の思いが伝わらず、
使われずに実装されてしまう危険性があります。（実際ありました。）

せめてテスト時に発覚するように実行時エラーにしようという試みです。

気持ち的には、buildでエラーにしたいのですが、typescriptの進化を待て、といったところでしょうか。

```ts
    export class MultiDeviceView<TModel extends Backbone.Model> extends Backbone.View<TModel>{

        public touchRender(options?:any):MultiDeviceView<TModel>{
            throw new Error("You must implement touchRender");
            return this;

        }

        public pcRender():MultiDeviceView<TModel>{
            throw new Error("You must implement pcRender");
            return this;
        }

        public render():MultiDeviceView<TModel>{
            if (this.sm.isTouch()){
                return this.touchRender();
            }else{
                return this.pcRender();
            }
        }
    }

```
通过`bundle viz`来生成依赖树图



通常我们使用` bundler` 来管理 ruby 项目的依赖. 而通过` bundle list` 可以查看当前的` gem`list. 而我想看看目前的 gem 之前的依赖情况,怎么办, 我` bundle -h` 一下,搜索了` dependency`, 发现了这个选项:

> `bundle viz`

说是可以查看依赖情况.
遂就` bundle viz` 一下,
结果提示我没有安装`ruby-graphviz`这个 gem. 好继续安装这个

> `bundle install ruby-graphviz`

结果又提示,我没有安装这个`graphviz`

> GraphViz not installed or dot not in PATH. Install GraphViz or use the 'path' option
Please install GraphViz. On a Mac with homebrew, you can run `brew install graphviz`.

好家伙,还挺麻烦的. 到这里,发现这个` graphviz` 是什么东东呢.不知道,
google 一下, 原来

>http://zh.wikipedia.org/wiki/Graphviz
> Graphviz （英文：Graph Visualization Software的缩写）是一个由AT&T实验室启动的开源工具包，用于绘制DOT语言脚本描述的图形。它也提供了供其它软件使用的库。Graphviz是一个自由软件，其授权为Eclipse Public License。其Mac版本曾经获得2004年的苹果设计奖[2]。

官网:http://www.graphviz.org/

不错的,不明觉厉!

有` homebrew` 很好办的:

`brew install graphviz`

搞定.这下可以了吧.

在 rails 项目的根目录执行

> bundle viz

好家伙,提示直接默认生成了一个` png`文件. 很牛逼的样子, 各种依赖生成的一个图形,很不错! 试试!
CakePHP3でURLリンクを書く方法

Cake1,Cake2とやりかたが変わっていたのでメモ。

Cake3でURLリンクを書く方法は2つあります。(他にもあるかもしれないです)

① Htmlヘルパーを使う方法（リンクタグ全体をヘルパーで作成）

```Template/~/*.ctp
<?php echo $this->Html->link('タスク詳細ページ', ['controller'=>'Task', 'action'=>'detail', 'taskId' => 77], ['class'=>'something']); ?>
```


② Urlヘルパーを使う方法(URL部分だけヘルパーで作成)

```Template/~/*.ctp
<a href="<?php echo $this->Url->build(['controller'=>'Task', 'action'=>'detail', 'taskId' => 77]); ?>" class="something">タスク詳細ページ</a>

```

個人的には②の方法の方が誰にでも使いなれたHTMLタグで書ける部分が多くなるので、②の方法で記述しています(クラス指定などURLの部分以外はCakeを分かってない人でも読める)。
revel入れたいのにgo getが進まなかった

## どういうわけか
```bash
[vagrant@localhost ~]$ go get github.com/revel/revel
```
ここで止まる（何も出ない）

## 環境
```bash
[vagrant@localhost ~]$ cat /etc/redhat-release
Scientific Linux release 6.3 (Carbon)

[vagrant@localhost ~]$ go version
go version go1.4.1 linux/amd64
```

## 原因？
手動で手順を追ってみたところ、どうもgit cloneが途中で止まるのが原因っぽい。

```bash
[vagrant@localhost ~]$ git clone https://gopkg.in/fsnotify.v1
Initialized empty Git repository
```
↑ここで止まる

## 対応：gitを更新する
yumで入れたgitが1.7だったので、2.3にしたら動くようになった。

```bash
sudo yum -y install gcc libcurl-devel expat-devel perl-ExtUtils-MakeMaker gettext
wget https://www.kernel.org/pub/software/scm/git/git-2.3.0.tar.gz
tar xzvf git-2.3.0.tar.gz
cd git-2.3.0
make prefix=/usr/local/git all
make prefix=/usr/local/git install
echo 'export PATH=/usr/local/git/bin:$PATH' > /etc/profile.d/git.sh
```

いつも古いブラウザしね！！とか言ってるんだから、古いgit使うなってことですかね。。。
根本的な原因がコレなのかは謎っぽい。
JenkinsのBuild FlowでMask Passwordを利用してみる

Jenkinsで[Build Flow Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Build+Flow+Plugin)と[Mask Passwords Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Mask+Passwords+Plugin)便利に使っている。
しかし、Build Flow PluginからMask Passwords Pluginで設定したパスワードが利用できない。

そこでgroovyで直接Mask Password Pluginで設定した値をとってくるようにしてみた。
プラグインのバージョンアップで利用できなくなったり、正式に対応されたりというのはありそう。
試してみた各プラグインのバージョンはこちら

 * Build Flow Plugin：0.17
 * Mask Passwords Plugin：2.7.2

```groovy
def getMaskPassword(key) {
  def descriptor = jenkins.model.Jenkins.instance.getBuildWrapper("MaskPasswordsBuildWrapper")
  def pairs = descriptor.getConfig().getGlobalVarPasswordPairs()
  for (pair in pairs) {
    if (pair.getVar() == key) {
      return pair.getPassword() 
    }
  }
}

println getMaskPassword("password")
```
sporkでNameError: uninitialized constant RSpec::Core::CommandLineになる時の対処法

railstutorialの「[3.6.3Spork を使ったテストの高速化](http://railstutorial.jp/chapters/static-pages?version=4.0#sec-spork)」で、特にバージョンを指定しないでsporkを突っ込んで動かしてた。

* gem 'spork-rails'
* gem 'guard-spork'

一応バージョンを確認すると以下の通り。

```
$ gem list spork
```

* guard-spork (2.1.0)
* spork (1.0.0rc4)
* spork-rails (4.0.0)

guard-sporkなんかは1世代変わってる。
その状態で

```
$ bundle exec spork --bootstrap
```

を動かすと、spec/spec_helper.rbに追記されるので、追記される内容を適宜spec/rails_helper.rbに記載。
で、その状態で

```
$ bundle exec spork
$ bundle exec rspec spec/requests/static_pages_spec.rb --drb
```

すると掲題の「NameError: uninitialized constant RSpec::Core::CommandLine」となる。

対応法は、
[replace CommandLine with Runner for RSpec 3.0.0.rc1](https://github.com/manafire/spork/commit/38c79dcedb246daacbadb9f18d09f50cc837de51#diff-937afaa19ccfee172d722a05112a7c6fL6)
にある通りを試すと、

~/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/spork-1.0.0rc4/lib/spork/test_framework/rspec.rb
の内容を書き換える。

一応動いた、が、gem本体直すのってどうよという感じで一旦spork使うのは見送ろうと思う。
QNAP TS-220の初期ユーザとパスワード


巷で話題（と思ってる）のNAS、QNAP TS-220。

インストール時に自らハマった点ですが、画面に出てきたのを見過ごしたのかな……。
工場出荷設定（開封の義を済ませた直後）からすぐにファームアップしてQTS4.1にしたときのユーザは以下のとおり。

ユーザ名：*amdin*
パスワード：*admin*

**myQNAPcloudを使うためにサインアップしたユーザ名とパスワードではない**のでご注意を！
concrete5 でよく使う site.php の設定値

### MySQL 関連の設定を変更したい

```php
// MySQL のサーバ名
define('DB_SERVER', 'localhost');

// MySQL のユーザ名
define('DB_USERNAME', 'user');

// MySQL のパスワード
define('DB_PASSWORD', 'password');

// MySQL のデータベース名
define('DB_DATABASE', 'db_name');
```

### 左上にある concrete5 のロゴを変更したい

テスト環境と本番環境を別ロゴに設定しておくと見分けやすい。

```php
define('WHITE_LABEL_LOGO_SRC', 'http://localhost/logo_menu.png');
```

### ログイン後に表示されるニュースを表示されなくしたい

```php
define('ENABLE_NEWSFLOW_OVERLAY', false);
```

### リストのページングパラメタを ccm_paging_p から page へ変更したい

```php
define('PAGING_STRING', 'page');
```
Block化進化したUIAlertView


iOS 7まで、提示や警告また簡単な選択や入力などの目的で、UIAlertViewを使うことは当然です。今はiOS 8とともにUIAlertControllerが後継者といて出現したが、古いシステムバージョンの対応のためUIAlertViewが捨てられUIAlertControllerに切り替えることはできません。では、なぜその機能に切り替えることが必要でしょうか。個人的に見ると、delegateを使うUIAlertViewはblockを代わりに使うUIAlertControllerに、delegateに依頼することで、複数のUIAlertViewが一つのdelegateを共用すると、みな一つの方法で処理し、コードがわかりにくいとなる可能性があります。

UIAlertControllerはblockを利用してその不便を避けます。つまり、その展示する画面と動作は独立し、ほかの実体に関わりがなくなります。利点がわかっているうえで、旧時代のUIAlertViewにそれをつけばいいではないかという点がでます。

結果として、その考え方を実現しました。Block化進化したUIAlertViewとして、SinriAlertViewを実装してテストを行いました。実用できるので発表しました。ソースコードはそのリンクにあります。リンクは、
http://www.everstray.com/news/news.php?newsCode=MjAxNTAyMDkxMzM2MjVbU2lucmlBbGVydFZpZXcsIEJsb2NrLUJhc2VkIEFsZXJ0IFZpZXcgZm9yIGlPU11FdmVyc3RyYXkubG9

使用例は以下の通りです。普通の例は含められると思って、入力するための例を提供しました。

    SinriAlertView * sav=[[SinriAlertView alloc]initWithTitle:NSLocalizedString(@"_CashingCoupon_InputBox_Title", @"Cashing Coupon")
                                                      message:NSLocalizedString(@"_CashingCoupon_InputBox_Message", @"Input your coupon code to cashing.")
                                            cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
                                            otherButtonTitles:NSLocalizedString(@"Confirm", @"Confirm"),nil];
    [sav setClickHandler:^(UIAlertView *sinriAlertView, NSInteger buttonIndex) {
        NSLog(@"SinriAlertView　ボタン index=%ld",buttonIndex);
        if (buttonIndex == 1) {
            UITextField *tf=[sinriAlertView textFieldAtIndex:0];
            NSString* cashCode = tf.text;
            NSLog(@"SinriAlertView コード：%@",cashCode);
        }
    }];
    sav.alertViewStyle = UIAlertViewStylePlainTextInput;
    [[sav textFieldAtIndex:0] setKeyboardType:UIKeyboardTypeNumberPad];
    [[sav textFieldAtIndex:0] becomeFirstResponder];
    [sav show];
    
つまり、できる限り利点を利用しましたと思います。また何か補足が教えていただけると幸いです。
Powで http://app-name.dev のようなURLにアクセスするとThis webpage is not availableになる場合の解決策


##問題

Rails x Powで開発していて、今まで http://app-name.dev のようなURLで開発サーバーにアクセスできていたのに、ある日突然 "This webpage is not available" というエラーメッセージが出てアクセスできなくなる。

![Screen Shot 2015-02-09 at 14.32.12.png](https://qiita-image-store.s3.amazonaws.com/0/7465/b052ba47-e2c4-5791-bcd8-a8754f67af12.png "Screen Shot 2015-02-09 at 14.32.12.png")

```text
The server at app-name.dev can't be found, because the DNS lookup failed. DNS is the network service that translates a website's name to its Internet address. This error is most often caused by having no connection to the Internet or a misconfigured network. It can also be caused by an unresponsive DNS server or a firewall preventing Google Chrome from accessing the network.
Error code: DNS_PROBE_FINISHED_NXDOMAIN
```

### 2015.4.20 この問題のトリガーはMac OS Xのアップデートかも？

Mac OS X 10.10.3にアップデートしたらまたこの問題が発生しました。
この記事を公開する数日前にも10.10.2が公開されているので、OS Xをアップデートするとこの問題が発生する可能性が高いです。

##解決策

Powを再インストールする。

```bash
curl get.pow.cx/uninstall.sh | sh

curl get.pow.cx | sh
```

##関連？（未確認）

- [新たに三つのgTLDがルートゾーンに追加](https://www.nic.ad.jp/ja/icann/topics/2014/20141222-01.html)
- [Pow will need a new TLD soon #386](https://github.com/basecamp/pow/issues/386)

## Special thanks to

[西脇.rb＆神戸.rb](http://nishiwaki-koberb.doorkeeper.jp/)の @spring_aki さん＆ @youcune さん！

<blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/jnchito">@jnchito</a> まさに昨日それなってました。 <a href="https://twitter.com/spring_aki">@spring_aki</a> さんの教えにしたがって pow のインストールをやり直しました。。</p>&mdash; なかにしゆう (@youcune) <a href="https://twitter.com/youcune/status/564655067089735680">February 9, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
HTTPのPOSTされているデータをtcpdumpでキャプチャする

postからなにが送られて来ているのかさくっと見たかったのでtcpdumpしてみた。
自分の為のメモとして残しておく。

```
sudo tcpdump -A 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
```


参考になったページ
http://stackoverflow.com/questions/4777042/can-i-use-tcpdump-to-get-http-requests-response-header-and-response-body
画像をcssで白黒にし、マウスオーバーでカラーをつける

HTML
```
<img src="http://www.placekitten.com/400/300" />
```

CSS
```
img{
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");
    filter: gray;
    -webkit-filter: grayscale(100%);
}
img:hover {
    filter: none;
    -webkit-filter: grayscale(0%);
}
```

これだけでOK
大事なことなのでもう一度言いますが、現状SwiftのOptimization LevelはNONEにするのが安全。。

by @mixiappwchr

こちらの記事でちらっと書いたのですが
[Swiftを使ってみて直面した闇。現時点で現場でSwiftを採用すべきかどうかの判断材料]
(http://qiita.com/appwatcher/items/50295e82ab0095902aaa)

Swift のOptimization のバグのせいで、Releaseバージョンのみアプリがクラッシュする現象がおきて、
無事にApple審査Rejectされました。。

Releaseビルドできっちり確認しろよと言われれば、それまでですが、、、

現状はOptimization LevelはNoneを推奨します。。
早く治してくれ。。

![スクリーンショット 2015-02-09 14.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/37731/c10f3862-bd7c-6769-b571-1b8ae6f97e71.png)
VirtualBoxをインストール後にVMware上の仮想マシンがネットワークに接続できない場合の対策

# 現象
VagrantやChef Soloを使って、開発環境の統一について検討しようと思い、VirtualBoxをPCにインストールしたのですが、その直後から、普段使っていたVMware上のUbuntuがネットワークに接続できなくなってしまいました。

# 原因

原因としては、VMWareの方で、ブリッジするホストのネットワークアダプタの選択で、VirtualBoxのアダプタが選択されているため、つながらなくなる事態が発生しているようです。

![image](https://qiita-image-store.s3.amazonaws.com/0/27707/4bc10bf6-17dd-c730-d2a0-20bfe32479f3.png)

# 対策

ハードウェアからネットワークアダプタを選択し、右の[アダプタの設定]を選択します（下図）。

![無題クリップ_020915_015138_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/ff2ee1c1-8658-9773-16d1-e181b6cd8818.jpeg)

その後、`VirtualBox Host-Only Ethernet Adapter`の部分のチェックを外してOKします。

![無題クリップ_020915_015303_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/15462890-dee1-fcb5-3dc3-acaf6eb8411e.jpeg)

これで解決しました。

![image](https://qiita-image-store.s3.amazonaws.com/0/27707/4a36e04c-6e8e-3e1a-45dd-535fe92af789.png)

# 参考
- [Virtualbox：ホストオンリーネットワークに接続できない対処 | よしまさのブログ](http://blog.offline-net.com/2014/03/30/virtualbox-host-only-network-unable-to-connect/)
MQTTとは

## 背景
* [Ruby東京プレゼンテーション2015](http://www.digitalfukuoka.jp/events/60?locale=ja) に参加した
 * 時間：　2015-01-30(金) 13:30 - 18:00
* 今回のセミナー参加したから、「MQTT」という言葉は、初耳だった

## MQTTとは
* Message Queuing　Telemetry Transportの略称
* IoTやM2M向けに開発された軽量プロトコル
* デバイスから少量的なデータの送受信や3Gなど不安定的なネットワーク環境に最適化される
* クライアントとサーバ側に、いろいろな言語で書かれている

#### サイト
* 公式サイト
 * http://mqtt.org
* 現在のバージョン
 * [MQTT Version 3.1.1](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html)
* githubとwiki
 * https://github.com/mqtt
 * https://github.com/mqtt/mqtt.github.io/wiki

## 機能
#### publisher
* メッセージをbrokerへの送信側

#### subscriber
* メッセージをbrokerからの受信側

#### topic
* subscriber側に、指定しているtopicだけを受信することができる
* 例えば、/datacenter/harumi/floor/42/temperatureを指定したら、subscriberがその温度を受信できる

#### broker
* topicに登録していたsubscriberに対して、messageの配信を行う.

#### will
* ここでのWillは「遺言」の意味
* publisher側が、意図しない理由で切断された場合に、このWillで指定されたtopicとmessageをsubscriberに送信する

#### retain
* topicごとに最後にpublishされたmessageをMQTTサーバーが保持しておき、新しいsubscriberにそのmessageを渡す機能


## サーバー

#### mosquitto

* [An Open Source MQTT v3.1 Broker](http://mosquitto.org/)

#### apache apollo
* http://activemq.apache.org/apollo/

#### MQTT as a Service sango
* https://sango.shiguredo.jp/

* http://akane.shiguredo.jp/

#### IBM MessageSight
* http://www.ibm.com/developerworks/jp/websphere/library/connectivity/ms_mqttintro


## クライアント
* https://github.com/mqtt/mqtt.github.io/wiki/libraries
 * ruby, javaなどのMQTTクライアント
MogokでPush時にアクセスエラーが出る



``` sh
$ git push mogok master
fatal: unable to access 'https://git.mogok.jp/fg.git/': The requested URL returned error: 403
```

gitのURLにユーザ名を追加すればOK.

``` sh
$ vim .git/config

[remote "mogok"]
-    url = https://git.mogok.jp/rank.git
+    url = https://ユーゼ名@git.mogok.jp/rank.git
```
package.elで導入するSKK

SKKについて
==================================================
みなさんEmacsを使っていますか？
今回はSKKについて書こうと思います。
SKKといえば、その変態的な入力方法で名高いEmacsLisp製のインプットメソッドで、歴史も十分ある枯れたソフトウェアです。Emacs歴の長い人からみれば、何を今更書く必要があるのかと思うでしょうが、最近ついにMELPAに登録され、導入する手間が随分楽になったので、今まで導入に億劫になっていた人に是非導入をおすすめしたく書くことにした次第です。

インストール方法
--------------------------------------------------
1. _.emacs_ か _init.el_ にMELPAのリポジリを登録します。

    ```el
    (add-to-list 'package-archives '("melpa"."http://melpa.org/packages/") t)
    ```
2. `M-x package-install ddskk`を実行します。
3.  _.emacs_ か _init.el_ にskkの設定を加えます。

    ```el
    (when (require 'skk nil t)
      (global-set-key (kbd "C-x j") 'skk-auto-fill-mode) ;;良い感じに改行を自動入力してくれる機能
      (setq default-input-method "japanese-skk")         ;;emacs上での日本語入力にskkをつかう
      (require 'skk-study))                              ;;変換学習機能の追加
    ```

使い方
--------------------------------------------------
ここでは、上記の通り設定をしたと仮定します(ではなくても大体同じです。)
### SKKの仕組み
`Shift+[a-z]`で漢字入力モードの開始され、▽が単語の先頭に表示されます。
単語の入力が終わったら、`Space`を押し、変換を行ないます。変換中は、▼が表示されます。
変換中にqを押すとカタカナになります。変換を終えるには`Tab`か、`Shift+新しい入力`で始めることで出来ます。送り仮名の入力は独特です。送り仮名に入る直前に`Shift`を押してから入力をすると
自動で変換モードに入ります。実例を挙げます。

```text
Watashi noNamae ha,Toyotomi Hideyoshi desu. => 私の名前は、豊臣秀吉です。
KaKekko deIttou Shou woToRi masita。        => 駆けっこで一等賞を取りました。
```
辞書登録について。もし変換候補に自分の望むものがない場合は登録出来ます。
`辞書登録：`というプロンプトが出ますので、そこに入力して登録しましょう。次の入力より追加されます。
基本の日本語入力は以上です。次に入力モードについてです。
SKKに漢字のほかにカタカナや(半角/全角)英数を入するモード専用のモードが用意されています。
それぞれのモードに入るには、かなモードから、`q`、`l`、`L`を入力することで、入ることが出来ます。
かなモードに戻るには、それぞれ`q`、`C-j`、`C-j`で戻ることが出来ます。
以上のことを下にまとめます。

|キーバンド　　　  | 機能                         |
|:-------------:|:----------------------------:|
| `Control-\`   | SKKモードの起動                |
| `Control-x j` | SKKモードの起動(自動改行)       |
| `Shift-[a-z]` | 漢字入力モードの開始            |
| `Space`       | 漢字変換モードの開始            |
| `Tab`         | 漢字変換候補の決定              |
| `q`           | カタカナ入力モードの(開始/終了)  |
| `l`/`L`       | (半角/全角)英数入力モードの開始  |
| `Control-j`   | (半角/全角)数入力モードの終了    |

おそらく日常遣いではこれで十分でしょう。もし、より深く知りたくなったなら、
`M-x skk-tutorial`を実行してみてください。素晴しい解説があります。

参考
--------------------------------------------------
- http://dic.nicovideo.jp/a/skk (参考例が豊富で解り易いです。)