OmniAICreator/Qiita-1.07M huggingface dataset:
【FuelPHP】確認用の値と同じかどうかのValiadaiton

#【FuelPHP】確認用の値と同じかどうかのValiadaiton

add_ruleでmatch_fieldを使う

例
emailの入力で確認用と同じかどうかの検証
formのnameがemailとemail_re(確認用)とする

```php
//emailの入力の検証
	$val->add('email', 'email')
		->add_rule('required')
		->add_rule('match_field','email_re');

//emailの確認用の入力の検証			
	$val->add('email_re', '確認用')
		->add_rule('required');

//バリデーションメッセージは下記で設定。param:1は確認用のラベルが表示される。
	'match_field'      => '『:label』は『:param:1』と一致していません。',
Docker で特定のバージョンの PHP でのテストをおもむろに実行する

ちょっと Docker 扱う機会があったので、個人的なメモ程度に。
入門記事とか、使い方を解説する記事としてはもっと他にいい記事がいろいろあると思います。

# 今回やること

特定のバージョンの PHP がインストールされた Docker Image を用意して、手元のライブラリの PHPUnit を実行する。

具体的には PHP 5.6 を使って [yuyat\compose](https://github.com/yuya-takeyama/compose) のユニットテストを実行します。
なお、このライブラリは PHP 5.6 の新機能を使っており、5.6 以降でしか動かないものです。
(このライブラリの詳細については [PHP 5.6 の新機能を使って関数を合成する関数を実装する](http://qiita.com/yuya_takeyama/items/b65afa141327e7ccd1ac) を参照してください)

# Docker のインストール

詳細は省きますが、Mac で Homebrew を使って docker と boot2docker をインストールした環境でやっています。

# テスト対象のライブラリの取得

composer はあらかじめインストールしているものとします。

```
$ git clone git@github.com:yuya-takeyama/compose.git
$ cd compose
$ composer install
```

# Docker 上で PHPUnit を実行

以下のコマンドで実行されます。
初回は Docker Image を取得するのに数分かかりますが、2 回目以降は一瞬で実行されるようになります。

```
$ docker run -it --rm -v `pwd`:/work:ro -w /work php:5.6-cli ./vendor/bin/phpunit
PHPUnit 4.2.6 by Sebastian Bergmann.

Configuration read from /work/phpunit.xml.dist

.......

Time: 903 ms, Memory: 2.75Mb

OK (7 tests, 8 assertions)
```

以下は実行しているコマンドやオプションについて。

## `docker run`

Docker Image から新たな Container は生成して、その中でコマンドを実行する。

## `-it`

厳密には `-i` (`--interactive`) と `-t` (`--tty`) を同時に指定しているもの。

`docker run` でアドホックにコマンドを実行するときは大体これを指定する。

`-i` でホスト側の STDIN がコンテナ側にもつながる? という感じ。
インタラクティブなコマンドでの入力を待ってくれる。
`php -a` とかで試すと良い。

`-t` は `docker help` を見ると `Allocate a psuedo-TTY` となっている。
うまく説明できないけどこれなしで実行すると出力の感じが違うのでまぁつけてます。

## `--rm`

コンテナが終了したら自動的に削除する。
これをつけないとコンテナがどんどん溜まっていってディスクが圧迫されるので大体つける。

## `-v`

コンテナ側からホストの特定のディレクトリをマウントする。
この場合はコンテナ側の `/work` がホスト側のカレントディレクトリになる。

コンテナ側でファイルに書き込みを行ったらホスト側にもその変更が行われてしまうが、今回は `:ro` をつけることでリードオンリーにしているので、ファイルへの書き込みを行おうとしてもエラーになる。

## `-w`

コマンド実行時のコンテナ内におけるカレントディレクトリを指定する。

## `php:5.6-cli`

Docker Hug Registry 公式の php リポジトリから `5.6-cli` というタグの Docker Image を使用する。

使用可能なタグ一覧は以下を参照。
https://registry.hub.docker.com/_/php/tags/manage/
PHP 5.3.x から 5.6.x まで用意されている。

CLI だけのものもあれば、Apache 同梱のものもある。

## `./vendor/bin/phpunit`

コンテナ内で実行するコマンド。
今回はホスト上で `composer install` することによって生成された `./vendor/bin/phpunit` をそのままコンテナ上で実行している。

もっとちゃんとやるときは Composer をインストールした状態の Docker Image とか用意しておくと良いのだろうか。

# PHP 5.5 でも実行してみる

前述の通り、今回のライブラリは PHP 5.6 でしか動かないので 5.5 以下ではエラーになる。
以下のようにすることで、ちゃんと指定したバージョンで実行できていることがわかる。

```
$ docker run -i --rm -v `pwd`:/work:ro -w /work php:5.5-cli ./vendor/bin/phpunit

Parse error: syntax error, unexpected '.', expecting '&' or variable (T_VARIABLE) in /work/src/compose.php on line 4
```

# まとめ

今回はコマンド上で割とアドホックな形に実行してみました。
実際に使ってみる場合は、専用の Docker Image を用意したり、コマンドを自動的に実行してくれるツールだったりが必要だとは思いますが、まずはこの辺りから。
仮想DOMに思いを馳せていたらそもそもブラウザのレンダリングがわかってなかった

仮想DOMとか、react.js とか最近聞くようになりました。フロントエンドに関わるものとして、UIパフォーマンス向上を志すなら、少し触って明日の糧にしようと思っていろいろ調べていたら、そもそもブラウザのレンダリングとは何かもよくわかっていなかったので出直そうと思った、というごくつまらない話です。

# ブラウザのレンダリングとは

DOMの読み込み、リサイズ、イベント発火で再描画、くらいふわっとわかったフリになっていた。

* http://www.yoheim.net/blog.php?q=20140703 下のURLをわかりやすく解説
* http://www.html5rocks.com/ja/tutorials/internals/howbrowserswork/ ごつい
* http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/reflow-and-repaint-in-browser/ 

1. DOMツリー
2. レンダーツリー（DOM ツリーのビジュアルな側面を表します。だそうです）
3. レイアウト（Mozillaではリフローと呼ぶらしい。ややこしいから統一しろ）
4. ペイント

がブラウザが行うレンダリングの順番。

## リフロー、ペイントが発生するトリガー

* DOM ノードの追加、削除、更新
* display: none （リフローとペイント）、あるいは visibility: hidden （位置の変更は起きないので、ペイントのみ） による DOM ノードの見た目の変更
* ページ中の DOM ノードの位置の移動やアニメーション
* スタイル属性のちょっとした変更のためのスタイルシート追加
* ウィンドウサイズの変更やフォントサイズの変更、そしてスクロール など、ユーザーの操作

ユーザー操作が行われる度に、ブラウザ側のリフロー・ペイントは常時行われる（ex. スクロール、ウィンドウリサイズなど）。jsによるスタイルの変更では物によるけど、色の変更ならペイント、サイズの変更も伴うならリフロー・ペイントが発動している。DOMの追加や複製、削除では1～4までもちろん全て行う。

## ブラウザのレンダリング最適化

参照URLの文中にあるけど、jsのDOM操作で同期的に呼び出されるスタイルの上書き、例えば

```js
$('div#hoge').css('margin-left', 30)
             .css('margin-left', 50)
             .css('margin-left', 0)
             .css('margin-left', 16);
```

こんなよく分からないコードがあるとして、ブラウザは賢いので、最後の行しかリフロー・ペイントを行わない。レンダリングの回数を減らすように最適化しているんだそうです。ブラウザ超賢い。

### ブラウザの最適化を狂わせるメソッド

* offsetTop、offsetLeft、offsetWidth、offsetHeight
* scrollTop、scrollLeft、scrollWidth、scrollHeight
* clientTop、clientLeft、clientWidth、clientHeight
* getComputedStyle()


[この人が激昂されている](http://qiita.com/damele0n/items/f4050649de023a948178)通りなんですが、

>これらのスタイルを参照（またはメソッド呼び出し）をJavaScriptから要求すると、ブラウザはその時点で最新のレンダリング結果を強制的に計算し、そしてその結果を返します。 つまり上記スタイルを参照することで、最適化のためにキューにためていたスタイル変更要求をこの時点で行ってしまうのです。

悪い例として

```js
var target = $('#fuga');
for (var i = 0; i < 100; i++) {
  var offsetLeft = target.offsetLeft;
  target.css('margin-left', offsetLeft + 1);  
}
```

ループ内で使用している、offsetLeftメソッドで都度リフロー、スタイルの再計算が強制的に行われることになる。塩梅が良くないので、初回ロード時のみ要素位置を参照し数値としてキャッシュして参照させるってことになる。コードにしたら別になんてことはない。

```js
var target = $('#fuga');
var offsetLeft = target.offsetLeft;
for (var i = 0; i < 100; i++) {
  offsetLeft += 1;
  target.css('margin-left', offsetLeft);  
}
```

ただし、動的にビューがリフロー・リペイントを繰り返しそうなスマートフォンの場合はそうもいかないと思う。

>イベントのデータを何らかの変数にキャッシュして、描画ロジックでそれを参照する

この言葉に尽きる。描画ロジックの度に`要素.scrollTop()`してたらブラウザのレンダリングに負荷がかかるというのが、ここに来てようやく腹落ちした。

## 今すぐにも出来そうなブラウザへの優しさ

### 例えば d:n はDOMに差し込む前にセットしておく

```js:bad.js
$('<div id="foobar"></div>').append('body').hide();
```

これではDOMツリー、レンダーツリー、リフロー、ペイント起きてますよね？ 起きてるんですよ。

```js:soso.js
$('<div id="foobar" style="display:none;"></div>').hide().append('body');
```

もしくは、要素をd:nするようなクラスを付与

```js:good.js
$('<div id="foobar" class="element-is_not-display"></div>').append('body');
```

することで、予め読まれたCSSOMの情報を汲んだ上でブラウザはレンダーツリーingするわけですし、描画に負荷をかけないわけです。

---

というわけで、本日は以上です。

http://www.slideshare.net/hayatomizuno/ss-23379553

このスライドも少しだけ詳しいです。
SolrをMac OS X Yosemiteにインストールする



オープンソースの全文検索エンジン「Solr」を、Mac OS X Yosemite (10.10.1)にインストールします。

## 前提条件
* Homebrewをインストールされていること
* Java 1.7以上がインストールされていること

## Solrのインストール

以下のコマンドを実行してSolrをインストールします。

```shell
$ brew install solr
```

## 起動までの下準備

以下のコマンドを実行し、ログ出力ディレクトリを作成します。（`4.10.2`の部分はインストールされたSolrのバージョンによって変わってきます。適宜置き換えてください）

```shell
$ mkdir -p /usr/local/Cellar/solr/4.10.2/example/logs/
```

## 起動 / 動作確認

以下のコマンドを実行し、Solrを起動します。

```shell
$ solr start
```


`Started Solr server on port 8983 (pid=92575). Happy searching!` と表示されたら以下のURLにアクセスします。

http://localhost:8983/solr/

以下のような管理画面が表示されれば、起動成功です。

![スクリーンショット 2014-12-28 23.34.06.png](https://qiita-image-store.s3.amazonaws.com/0/1301/555decc9-9a05-94b9-2aae-8dd27f216270.png "スクリーンショット 2014-12-28 23.34.06.png")

## 終了

Solrを終了させたいときは、以下のコマンドを実行します。

```shell
$ solr stop -all
```

これにより、起動中のすべてのSolrノードを停止させることができます。
メモ化再帰と探索をPythonとGoで実装

メモ化再帰と探索を組み合わせて実行時間を早くできる、という記事※を拝見したので、
サンプルコードをPythonとGoで実装し直してみる。

https://github.com/kazuhirokomoda/algorithm-and-data-structure/blob/master/DP_recursive.py
https://github.com/kazuhirokomoda/algorithm-and-data-structure/blob/master/DP_recursive.go

※ こちらの記事
http://www.itmedia.co.jp/enterprise/articles/1003/06/news002_5.html

Goは今回初めて触ったけど、今回の内容だったら特に問題なく馴染めた感じ。

実行時間もついでに測ってみたけど、全く同じアルゴリズムで
average execution time (10 times)
python: 23.14 [s]
go: 7.398 [s]
という感じでした。
ささっとアルゴリズムを書く時に、goも使えるようになるといいのかも。
kobito-cliにプルリク出してみた

[kobito-cli](https://github.com/suin/kobito-cli) とは，[Kobito](http://kobito.qiita.com/ja) 用のCLIツールです．
Go言語で開発されており，KobitoのアイテムのPDF化などができます．
詳しくは作者さんのエントリを参照．

  - [Go - Kobitoをちょっぴり便利にするかも知れないCLIツールを作った - Qiita](http://qiita.com/suin/items/22ef05df5b8cfab29148)

## プルリクの内容

  - [削除済みアイテムを非表示 by hico-horiuchi · Pull Request #2 · suin/kobito-cli](https://github.com/suin/kobito-cli/pull/2)

`kobito ls`というアイテム一覧を表示するコマンドがあります．
そこで削除済み(ゴミ箱)のアイテムが含まれるのが気になっていました．

KobitoではSQLiteでデータの管理をしているようです．
そこで，kobito-cliで発行されるSQLを修正すれば良いのでは，と考えました．

  - `~/Library/Containers/com.qiita.Kobito/Data/Library/Kobito/Kobito.db`

## Kobito.dbを覗く

`Kobito.db`を`sqlite3`で開いて，テーブルの情報を確認してみました．
どうやら，`ZIN_TRASH`が`1`の場合は削除されているようです．

    sqlite> select * from sqlite_master;
    table|ZITEM|ZITEM|3|CREATE TABLE ZITEM ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZIN_TRASH INTEGER, ZPRIVATE INTEGER, ZTEAM INTEGER, ZCREATED_AT TIMESTAMP, ZPOSTED_AT TIMESTAMP, ZUPDATED_AT TIMESTAMP, ZUPDATED_AT_ON_QIITA TIMESTAMP, ZBODY VARCHAR, ZKEY VARCHAR, ZLINKED_FILE VARCHAR, ZRAW_BODY VARCHAR, ZTITLE VARCHAR, ZURL VARCHAR, ZUUID VARCHAR, ZLINKED_FILE_BOOKMARK BLOB )

削除されていないアイテムでは`null`のようです．

    sqlite> select Z_PK, ZTITLE, ZIN_TRASH from ZITEM;
    1|Markdown記法チートシート|1
    2|Kobitoの変更履歴|1
    3|Kobitoアプリのフィードバック|1
    4|このアプリについて|1
    5|SensuのhandlerとしてAnsibleを使う|

SQLに`where ZIN_TRASH is null`を追加して削除済みアイテムを除いてみます．

    sqlite> select Z_PK, ZTITLE from ZITEM where ZIN_TRASH is null;
    5|SensuのhandlerとしてAnsibleを使う

上手く行きました．

## プルリクを出す

Go言語は触った程度なので，恐る恐るソースを読みます．
`cmd-ls.go`から`port-sqlite3-repository.go`を辿り，修正箇所っぽいのを発見．

```diff
- rows, err := db.Query("select Z_PK, ZTITLE, ZBODY, ZRAW_BODY from ZITEM order by ZUPDATED_AT desc")
+ rows, err := db.Query("select Z_PK, ZTITLE, ZBODY, ZRAW_BODY from ZITEM where ZIN_TRASH is null order by ZUPDATED_AT desc")
```

brewでGoをインストールし，動作したのを確認．
ビクビクしながらプルリクを出した所，無事マージされました．

@suin さん，ありがとうございます!
GoogleMapAPI のヒートマップの色を変える

レインボー

```js
    var heatmap = new google.maps.visualization.HeatmapLayer({
            fillOpacity: 1.1,
            radius: 50,
            gradient: ['#fff', '#f00', '#f80', '#8f0', '#0f0', '#0f8', '#08f', '#00f', '#80f', '#f08', 'black']
    });
    heatmap.setData(point);
    heatmap.setMap(map);
```

![rain.png](https://qiita-image-store.s3.amazonaws.com/0/40717/ecbab0f4-71bd-68ba-132f-11f4628a11a0.png)



青白

```js
    var heatmap = new google.maps.visualization.HeatmapLayer({
            fillOpacity: 1.1,
            radius: 50,
            gradient: ['white', '#00f', '#0ff']
    });
    heatmap.setData(point);
    heatmap.setMap(map);
```

![bg.png](https://qiita-image-store.s3.amazonaws.com/0/40717/1bfa2d54-4042-5dec-2e9a-cdabeaac28e9.png)
年末にLaravel5で開発しててハマったところメモ

# 対象者

Laravel4.xで使っていたソースをLaravel5に移植したら動かなくなった人
※Laravel5は12/28現在、開発版のため情報の取り扱いには注意してください。

# Paginationのlinksメソッドがない！

## エラー内容

linksメソッドなんてないぞというエラーが出る

```
ErrorException in AbstractPaginator.php line 432:
call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Support\Collection' does not have a method 'links' (View: /vagrant/resources/templates/article/list.blade.php)
```

## 解決方法

links()ではなく、render()を使う 

```php:resources/templates/article/list.blade.php
- {!! $articles->links() !!}
+ {!! $articles->render() !!}
```

参考：[Laravel 5 pagination](http://laravel.io/forum/11-13-2014-laravel-5-pagination)


## 問題を起こしたソースコード

```php:resources/templates/article/list.blade.php
{!! $articles->links() !!}
```

```php:App/Http/Controllers/ArticleController

[中略]

public function showList() {

	// 記事を取得する
	$articles = Article::paginate(10);

	/*---------------------*/
	/* Viewへ渡すデータを構築 */
	/*---------------------*/
	$aryViewAssign = array();
	$aryViewAssign['articles'] = $articles;

	// Viewをレンダリング
	return view('article/list', $aryViewAssign);
}
```

# ヘルパー関数:link_toメソッドがない！

## エラー内容

```
Call to undefined function link_to()
```

## 解決方法

HtmlとFormのFacadeがないため。
-> フレームワークのコアモジュールから削除されたのでデフォルトでは入っていない。composer.jsonとかに記述して手動で追加する。

```javascript:composer.json
"require": {
    "laravel/framework": "~5.0",
    "illuminate/html": "~5.0", <- これを追加
}
```

```php:config/app.php
'providers' => [
・
・
・
	'Illuminate\Html\HtmlServiceProvider', 
],

'aliases' => [
・
・
・
	'Form' => 'Illuminate\Html\FormFacade',
	'Html' => 'Illuminate\Html\HtmlFacade',
]
```

## 問題を起こしたソースコード

```php:resources/templates/article/list.blade.php
{!! link_to("article/edit/$article->id", "編集", $attributes = array(), $secure = null) !!}
```

以下、随時ハマったところ追加予定
nginxでSPDY対応プロキシを作る


Goやnode.jsなどのプログラミング言語でAPIサーバーを作っても、それらをSPDYに対応するにはそれなりに追加コードが必要だったり、各種言語のライブラリに依存します。そこで、nginxを通してどんなHTTPサーバーもSPDY化してしまいます。

SPDYはnginx1.4以降で公式サポートしています。SPDYはHTTPSが必要になるので、SPDYを利用するには、SSL証明書が必要になります。

nginxのserver設定は、下記の通りです。SSL設定はmozillaなどでの推奨値と、パフォーマンス系の設定をあわせて書いています。

`ssl_certificate` と `ssl_certificate_key` は提供するドメインのものを設定します。

`proxy_pass` にAPIサーバーのローカルアドレスを設定します。

```nginx
 server {
    # SSL configuration
    listen 443 ssl spdy;
    listen [::]:443 ssl spdy;

    ssl on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!CAMELLIA;
    ssl_prefer_server_ciphers on;
    resolver 8.8.8.8;
    ssl_stapling on;
    ssl_stapling_verify on;

    ssl_certificate YOUR_CERTIFICATE.pem;
    ssl_certificate_key YOUR_CERTIFICATE.key;

    add_header Alternate-Protocol 443:npn-spdy/3;
    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";

    location / {
      proxy_pass http://localhost:3000;
    }
}
```

SPDYでのアクセスがあるかは、log_formatに`$spdy`を追加することで、access_logファイルにSPDYのバージョンが出力されます。

```nginx
  log_format main '$remote_addr - $remote_user [$time_local] '
          '"$request" $status $bytes_sent "$http_referer" '
          '"$http_user_agent" "$http_x_forwarded_for" '
          'spdy:$spdy';
  access_log /var/log/nginx/access.log main;
```

設定後、Chrome などSPDY対応のブラウザで https プロトコルでアクセスすると、SPDYでのアクセスが確認できると思います。
rsyslogが出力してくれなかった話(CentOS 7)

Postfixのログが出なくて唸っていたらそれ以前の問題だった話。CentOS 7固有？

# 状況
Cent OS 7を載せたVPSでメールサーバ(Postfix+Dovecot)を構築しようとしていたところ、送信は上手くいくが受信が上手くいかない。ログを見ようとするも/var/log/maillogに本来出るべき情報が見当たらない。ログ出力先の設定を疑って試行錯誤するも上手くいかず、よく見ると/var/log/messagesに以下のようなログを発見した。何か失敗している。

<pre>
# /var/log/messages
Dec 28 19:21:55 extentity rsyslogd: [origin software="rsyslogd" swVersion="7.4.7" x-pid="1403" x-info="http://www.rsyslog.com"] start
Dec 28 19:24:59 extentity rsyslogd-3000: sd_journal_get_cursor() failed: 'Cannot assign requested address'
</pre>

# postfixのログ出力
postfixの設定(/etc/postfix/main.cf, /etc/postfix/master.cf)上にログの出力先を記述する設定はなく、/etc/syslog.confまたは/etc/rsyslog.confに記述されている。

<pre>
# /etc/rsyslog.conf
(略)
# Log all the mail messages in one place.
mail.*                                                  -/var/log/mail/maillog
</pre>

ちょっと改変して出力先を変えているが、これでpostfixを始めとするメール関係のパッケージはすべてのログを/var/log/mail/maillogに吐き出してくれるはずだった。

# 対応
調べてみたところCentOS7固有の問題らしい。根本的な解決策はないが回避は可能。
[Bug 1088021 - Changing a VM host's time disables rsyslog file logging ](https://bugzilla.redhat.com/show_bug.cgi?id=1088021)

やること：
(1) /var/lib/rsyslog/imjournal.stateを削除
(2) rsyslogを再起動

これで改めてログを見ると今まで見えなかった分が吐き出されていた。ヤッタネ。ホストとVMの時刻の関係で起こるらしい。
仮想環境に載っているRHEL 7系で起こるそうなので、次のバージョンを待とう。
UNIXタイムスタンプからその日の23:59:59や0:00:00を取得するSQL

日時を比較してデータを取得したい時など、何時何分何秒！という厳密なものでの比較ではなく
それぞれの日の0:00:00丁度とか、23:59:59とかを使いたい時ってあると思います。
で、値を見てみたらUNIXタイムスタンプ？うわぁめんどくさそう…とか思ってしまう自分のためにSQLをメモ。


##sample

* MySQL
* table_nameテーブルのdateに下記のようなタイムスタンプが入っている場合

```
SELECT date
FROM table_name
LIMIT 3
```

> 1395988136
> 1396074906
> 1396331516

**タイムスタンプを文字列形式にする** とこんな感じですが

```
SELECT FROM_UNIXTIME(date)
FROM table_name
LIMIT 3
```

> 2014-03-28 15:28:56
> 2014-03-29 15:35:06
> 2014-04-01 14:51:56



##タイムスタンプから、それぞれの日の23:59:59を取得

```
SELECT ADDDATE(FROM_UNIXTIME(date, "%Y-%m-%d"), INTERVAL 86399 SECOND)
FROM table_name
LIMIT 3
```

> 2014-03-28 23:59:59
> 2014-03-29 23:59:59
> 2014-04-01 23:59:59

##タイムスタンプから、それぞれの日の0:00:00を取得

```
SELECT ADDDATE(FROM_UNIXTIME(date, "%Y-%m-%d"), INTERVAL 0 SECOND)
FROM table_name
LIMIT 3
```

> 2014-03-28 00:00:00
> 2014-03-29 00:00:00
> 2014-04-01 00:00:00



0:00:00での比較の場合、 **タイムスタンプを年月日のみの文字列形式にフォーマット**
でも良いのでは？とも思ったりしますが

```
SELECT FROM_UNIXTIME(date, "%Y-%m-%d")
FROM table_name
LIMIT 3
```

> 2014-03-28
> 2014-03-29
> 2014-04-01

まぁ、場合によるんでしょうか。



##おまけ：　FROM_UNIXTIME()について

そういえば、UNIXタイムスタンプを文字列形式にした際の結果ですが

> 2014-03-28 15:28:56

あれ？日本標準時（JST）だ。
UNIXタイムスタンプは協定世界時（UTC）をベースにしているはずなのに何故…？
と思ったので、以下、メモしておきます。

***

**MySQL　の　FROM_UNIXTIME()　は、
現在のタイムゾーンを反映した値を返してくる…！！**

ちょっと怖いですね(´・ω・`)
返ってきた値がUTCだと思い込まないように注意しよう…
Swift SourceKitを使ってSwiftソースコードをハイライトする

追記(2015/12/08): [SourceKitt](https://github.com/apple/swift/tree/master/tools/SourceKit)のソースコードが公開されたので、安心して使ってつかってよさそうです。めでたい。

[sourcekitten](https://github.com/jpsim/sourcekitten)という、Swift SourceKitのフロントエンドがあります。これを使うと、おそらくXcodeが内部的に使っているものと同じコード解析エンジンをつかってSwiftソースコードをハイライトできます。ただし、これはXcode/Swift toolchainの非公開APIなので、いつまで安定して使えるかはわかりません。

インストールはsourcekittenを `git clone` して `./install.sh` をするだけ。これでsourcekittenをビルドして `/usr/local/bin/sourcekitten` にコマンドとしてインストールします。

これで、たとえば次のようなSwiftソースコードがあるとします。

```swift
import func Foundation.NSLog

class C {}

// Using Foundation
NSLog("Hello, Swift!")
```

これを `sourcekitten --syntax hello.swift` で処理すると次のようなJSONになります。

```swift
[
  {
    "offset" : 0,
    "length" : 6,
    "type" : "source.lang.swift.syntaxtype.keyword"
  },
  {
    "offset" : 7,
    "length" : 4,
    "type" : "source.lang.swift.syntaxtype.keyword"
  },
  {
    "offset" : 12,
    "length" : 10,
    "type" : "source.lang.swift.syntaxtype.identifier"
  },
  {
    "offset" : 23,
    "length" : 5,
    "type" : "source.lang.swift.syntaxtype.identifier"
  },
  {
    "offset" : 30,
    "length" : 5,
    "type" : "source.lang.swift.syntaxtype.keyword"
  },
  {
    "offset" : 36,
    "length" : 1,
    "type" : "source.lang.swift.syntaxtype.identifier"
  },
  {
    "offset" : 42,
    "length" : 20,
    "type" : "source.lang.swift.syntaxtype.comment"
  },
  {
    "offset" : 62,
    "length" : 5,
    "type" : "source.lang.swift.syntaxtype.identifier"
  },
  {
    "offset" : 68,
    "length" : 15,
    "type" : "source.lang.swift.syntaxtype.string"
  }
]
```

それぞれのtokenにtypeが与えられていますね。たとえばHTML化は次のようなスクリプトでできるでしょう。すべてのtokenにtypeが与えられるわけではないので、tokenのリストを末尾からもとのソースコードに適用することでtypeが与えられているtokenだけ処理するようにしています。

```pl
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;

use JSON ();

chomp(my $sourcekitten = `which sourcekitten`);
$sourcekitten or die "sourcekitten(1) is not installed.\n";

foreach my $file (@ARGV) {
    my $source = do {
        open my($in), "<", $file;
        local $/;
        <$in>;
    };
    my $json = `"$sourcekitten" --syntax "$file"` or die "failed to parse";

    foreach my $syntax(reverse @{JSON::decode_json($json)}) {
        my $offset = $syntax->{offset};
        my $length = $syntax->{length};
        my $type = $syntax->{type};

        my $class = (split /\./, $type)[-1];

        my $token = substr($source, $offset, $length);
        substr($source, $offset, $length, qq{<span class="$class">$token</span>});
    }

    print $source;
}
```

前述のhello.swiftを処理すると次のようになります。あとはCSSて適当に色を付けるだけですね。

```html
<span class="keyword">import</span> <span class="keyword">func</span> <span class="identifier">Foundation</span>.<span class="identifier">NSLog</span>

<span class="keyword">class</span> <span class="identifier">C</span> {}

<span class="comment">// Using Foundation
</span><span class="identifier">NSLog</span>(<span class="string">"Hello, Swift!"</span>)
```
Windows 使いの Mac 初導入 | Menu を Keyboard で操作 #win2mac

# <i class="fa fa-windows" style="font-size:1em;"></i> Windows 使いの <i class="fa fa-apple" style="font-size:1em;"></i> Mac 初導入 | Menu を Keyboard で操作
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Menu を Keyboard で操作
## <i class="fa fa-windows" style="font-size:1em;"></i> Windows では
Windows では, 

alt , 任意のキー

でメニューの操作が可能です。
キーボードの操作はマウスより早く行うことができます。
マウスなんて触ってたら日が暮れて :last_quarter_moon_with_face: しまいます。

## <i class="fa fa-apple" style="font-size:1em;"></i> Mac では
Ctrl + F2 でメニューバーの操作を行うことができます。
ただし、事前に設定が必要です。

### <i class="fa fa-cube" style="font-size:1em;"></i> 事前設定
* システム環境設定を開きます

![system_env_settings.png](https://qiita-image-store.s3.amazonaws.com/0/43480/87114855-ed12-e3b0-e673-6d3f17dd99dc.png)

* キーボードタブのチェックボックスを全てチェックします

![keyboard_settings_keyboard.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c1c0e9d8-2a7d-8c10-c2fd-90e7283cbcbc.png)

* ショートカットタブのチェックボックスを全てチェックし、「すべてのコントロール」のラジオボタンを有効化します

![keyboard_settings_shortcut.png](https://qiita-image-store.s3.amazonaws.com/0/43480/0c1b2447-9838-f942-555d-bf84aec32918.png)

### <i class="fa fa-check-circle" style="font-size:1em;"></i> 動作確認
* 操作前

![sublime0.png](https://qiita-image-store.s3.amazonaws.com/0/43480/726db8ae-ab94-aad0-c3c7-7c1fb8020d1e.png)

* Ctrl + F2 で Apple のアイコンにフォーカスがあたった

![sublime1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9dea264e-6531-461d-62b1-83f16c9c3c20.png)

* V, Enter の順にキー入力すると、 V のメニューが開いた

![sublime2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/e4e89c3b-c907-13b2-704c-7da247e6847c.png)
Versionnerの使い方

概要
---

Metacelloパッケージの作成、編集、デプロイのためのGUIである[Versionner](http://chercheurs.lille.inria.fr/~demarey/Tech/Versionner)の使い方のメモです。

Versionnerとは
---

Pharoで複数パッケージにまたがったり、他のパッケージに依存して開発する時にはMetacello構成パッケージを使う。VersionnerはMetacello構成パッケージを作成/編集/デプロイするためのGUIである。

[Versionner](http://chercheurs.lille.inria.fr/~demarey/Tech/Versionner)はChristophe Demarey氏が開発したMetacelloパッケージをハンドリングするためのGUIである。これを使うと、Metacelloを使った開発がとても楽になる、優れものである。

Versionnerのインストール
---

インストールは簡単。Metacello Configuration Browserで「Versionner」を検索するとすぐに出てくる。「Load Stable Version」で一発でインストールできる。

![スクリーンショット 2014-12-28 20.22.00.png](https://qiita-image-store.s3.amazonaws.com/0/59918/680a392e-6375-4774-da1b-5cc7e3800b11.png)

Versionnerを開く
---

Toolsメニューの「Versionner」を選択するとVersionnerが立ち上がる。

![スクリーンショット 2014-12-28 20.23.30.png](https://qiita-image-store.s3.amazonaws.com/0/59918/97479a46-2ee1-3233-fe80-315db0e56cbd.png)

![スクリーンショット 2014-12-28 20.25.46.png](https://qiita-image-store.s3.amazonaws.com/0/59918/e5a03f65-2e89-1791-16a7-114a91f0222a.png)

Metacello構成パッケージを作る。
---

「New Project」を押すと、プロジェクト名を聞かれる。パッケージのprefixを答える。

![スクリーンショット 2014-12-28 20.26.48.png](https://qiita-image-store.s3.amazonaws.com/0/59918/bc93268b-d8a3-8183-975f-dfe2942cd3cd.png)

すると、ConfigurationOf<パッケージ名>の内容を編集するGUIが開く。

![スクリーンショット 2014-12-28 20.28.27.png](https://qiita-image-store.s3.amazonaws.com/0/59918/7d64a8a0-f523-916a-ab46-f01cc3d6327a.png)

0.1-baselineバージョンが開発版の構成として自動的に作成される。左側のVersionsリストで0.1-baselineを選択すると、そのバージョンの構成内容を編集できる。Packages Addを押すと、その構成に含めるべきパッケージを選択して追加することができる。

![スクリーンショット 2014-12-28 20.30.17.png](https://qiita-image-store.s3.amazonaws.com/0/59918/bfce3fff-a929-6aee-88dc-233cbdd4ee20.png)

同様に、パッケージグループや依存する外部パッケージも編集できる。

「Release version」ボタンを押すと、stable版を作成できる。

レポジトリにURLを入力するか、右側のボタンを押してレポジトリ一覧からブラウズして選択する。

「Commit the project」ボタンを押すと、各パッケージに更新分があれば自動的にレポジトリに更新バージョンを保存した上で、最新バージョンで構成したConfigurationOf<パッケージ名＞を保存する。

簡単に最新パッケージを参照したMetacello構成パッケージを作成し保存することができる。

Metacello構成パッケージを修正する。
---

現在利用しているMetacello構成パッケージをVersionnerから参照できる。

![スクリーンショット 2014-12-28 20.40.19.png](https://qiita-image-store.s3.amazonaws.com/0/59918/a92747ba-f313-a1d3-2529-7efe360c916b.png)


プロジェクトに新しくパッケージを追加したり、依存する外部パッケージを追加した場合には、Open projectを押すと、新規作成した時と同じGUIで構成内容を編集することができる。 

まとめ
---
MetacelloではConfigurationOf<パッケージ名>クラスを同名パッケージでMonticelloレポジトリに格納しておく。従来はConfigurationOf<パッケージ名>クラスは既存のものをコピーして作成する必要があったが、適切なコピペ元を選ぶ必要があったり、コピーするメソッド数も多かったりして、ちょっと一手間だった。また、各パッケージの更新とConfigurationOf<パッケージ名>の更新をきちんと対応させる必要があった。Versionnerはそれらの作業をとても楽にするConfigurationOf<パッケージ名>専用クラスブラウザである。
マージソート

『[基礎から学ぶデータ構造とアルゴリズム](http://www.amazon.co.jp/dp/4320122437/chintara-22)』「4.5 マージソート」の勉強メモです。自分なりに咀嚼したソート手順とサンプルコード（Ruby）をまとめています。

1. 数字列を真ん中で二つの部分列に分割する
2. 二つの部分列をそれぞれ整列する。これを再帰的に行う
3. 整列済みの部分列をマージする

```rb
def merge_sort(a, n)
  return if n <= 1

  # a の前半をソート
  m = n / 2
  merge_sort a, m

  # a の後半を b にコピーしてソート
  b = a[m..(n - 1)]
  merge_sort b, n - m

  # a の前半を a の後半にコピー
  a[(n - m)..(n - 1)] = a[0..(m - 1)]

  # a の後半と b を大小比較しつつマージ
  ri = 0
  ai = n - m
  bi = 0
  while bi < n - m
    if ai < n && a[ai] <= b[bi]
      a[ri] = a[ai]
      ai += 1
    else
      a[ri] = b[bi]
      bi += 1
    end
    ri += 1
  end
end

a =  [10, 25, 75, 5, 30, 35, 15, 90, 65, 80, 50, 45]
merge_sort(a, a.size)
p a
```

```
[5, 10, 15, 25, 30, 35, 45, 50, 65, 75, 80, 90]
```

# リンク

* [バブルソート、選択ソート、挿入ソート](http://qiita.com/iwamot/items/8b884dbcd9eda358503e)
* [シェルソート](http://qiita.com/iwamot/items/5414ee54ad4c53d0529f)
* [クイックソート](http://qiita.com/iwamot/items/a13e4e1a73960ff0c4e7)
自分用gem作成チートシート


# 初期ファイル生成
## コマンド
```bash
bundle gem GEM_NAME
```

## 実行例
```bash
$ bundle gem mygem
      create  mygem/Gemfile
      create  mygem/Rakefile
      create  mygem/LICENSE.txt
      create  mygem/README.md
      create  mygem/.gitignore
      create  mygem/mygem.gemspec
      create  mygem/lib/mygem.rb
      create  mygem/lib/mygem/version.rb
Initializing git repo in /Users/nownabe/mygem
```

# gemspec編集
## 基本
`mygem.gemspec`の`TODO`になってる部分を編集する。

## 依存Gem
依存Gemを追加するときは次のように追加する。

```Ruby
spec.add_dependency "itamae", "~> 1.1.1"
```

開発中のみGemが必要な場合は次のように追加する。

```Ruby
spec.add_development_dependency "serverspec", "~> 2.7.1"
```

## サンプル
```ruby:mygem.gemspec
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'mygem/version'

Gem::Specification.new do |spec|
  spec.name          = "mygem"
  spec.version       = Mygem::VERSION
  spec.authors       = ["MyName"]
  spec.email         = ["xxx@yyy.zzz"]
  spec.summary       = %q{MyGem}
  spec.homepage      = "https://github.com/nownabe/mygem"
  spec.license       = "MIT"

  spec.files         = `git ls-files -z`.split("\x0")
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
  spec.require_paths = ["lib"]
  
  spec.add_dependency "itamae", "~> 1.1.1"

  spec.add_development_dependency "bundler", "~> 1.7"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "serverspec", "~> 2.7.1"
end
```

# ビルド
## コマンド
```bash
rake build
```

# リリース
## 準備
rubygemsに登録しておく必要がある。
https://rubygems.org/sign_up

登録したら証明書をダウンロードする。

```bash
$ curl -u nownabe https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials
$ chmod 600 ~/.gem/credentials
```

これは初めてRubygemsにリリースするときだけでOK。

## コマンド
```bash
rake release
```

## 実行例
```bash
$ git commit -am "first commit"
$ bundle exec rake release
mygem 0.0.1 built to pkg/mygem-0.0.1.gem.
Tagged v0.0.1.
Pushed git commits and tags.
Pushed mygem 0.0.1 to rubygems.org.
```
Xcodeでデバッグ時に変数の日本語が読めない場合の対応(手抜きVer.)

# はじめに
NSDictionaryやNSArrayに日本語が含まれていると、ログ出力時や変数の中身を覗いた時に”\U3042″といった表記になり、読む事ができません。

この文字化け(正確には文字化けではないけれど)現象。

以下は、単純に文字化け内容を知りたいだけ、という方のための情報です。

エレガントに解決するならばこちらが非常に参考になります！
http://qiita.com/yusuga_/items/85437eba2623f6ffbdbd
MethodSwizzlingを用い解決しています。
貴重な情報の共有ありがとうございます。

# ログ出力内容をテキストエディタにコピペ

コンソールの内容を選択しテキストエディタに貼り付けます。
"\U3042..."の部分のみでも、コンソールの内容すべてでも。

# 置換

"\U"を"%u"に全置換します。

# Unicodeデコード

楽をするため、オンラインの変換サービスを利用しましょう。

http://www.benricho.org/moji_conv/16-URLencode_Unicode.html
「・エンコード/デコードする文字列を入力」に置換後の文字列をペーストし「↓デコード(複合)」

複合された内容が表示されます。

# おわりに
文字化け状態のログを貰った時や、周りで困っている人がいた時、何かの参考になりましたら幸いです。
CentOSのvimからMacのクリップボードにコピーする方法 (一番簡単なヤツ)


vimというより、ターミナルもしくはiTermの文字をコピーする方法です。

`alt` + コピーしたい文字列をドラッグ

以上！ドラッグを離した時点でコピー完了になります。


##こんな簡単なコマンドだけど・・

Mac側にコピーしたい！！と思ってググったときに、
vimのclipboard設定の記事がたくさん出てきて、記事を追っては設定失敗して時間消費したので、ここに記録しておきます。（自分のやり方が悪いと思うのですが。。）
とりあえず、altでコピーできるなら十分だ！というひとは使っていただければ

##別の方法でクリップボードにコピーする(未成功)

調べたログとして残しておきます。

[【Vim】【Mac】Vimのヤンクでクリップボードにコピーする](http://sea-mountain.hatenablog.jp/entry/20110421/1303362772)
.vimrcの設定でも可能とのこと！
-clipboardを+にしないといけないのですが、わたしはここではまってあきらめています。ごめんなさい。

###-clipboardを+clipboardにするには・・？
Mac上でvimを使っている人はMacPortを使っている下記の記事でいけそう。
[コンソールVimのヤンクでMacのクリップボードにコピー](http://qiita.com/us10096698/items/f656b89ee7d0d02d37cb)
CentOS上なのでMacPortが使えず。。

vim7.3をインストールすれば、自動で+clipboardになるらしい
[CentOS 6.3にVim 7.3をインストールする](http://qiita.com/muniere/items/0569d05d470c5d3dc51b)
インストールはできたけどいまだに-clipboard…orz
（オプションの設定が必要だったのかも）

この後もgvimを入れようとしたり、いろいろしましたが挫折。。
当分は`alt`+ドラッグでいいかな。アドバイスもらえたら嬉しいです。
ardrone 2.0 x Firefox OS

何とも巡りあわせが良くて、運よく先日au Firefox OS搭載端末fx0の新製品発表会に参加させていただきました。「つくる自由」のアピールとして、実際にfx0と何か作ってデモする企画があり、ハッカソン形式で出し物をやりました。ハッカソンチームとして3組参加したのですが、私がいた「シマダイ」チームの全体的な話については、[上野さんの記事](http://uenoshin.hatenablog.com/entry/2014/12/27/150918)がとてもよくまとまっています。

まず ardrone 2.0 を Firefox OS で飛ばしました。最初に集まって何しようか？という話になった時に「…ドローン」と小菅さんが呟いたのに「おっしゃ、それやろう」ということで。単に飛ばしたかったから飛ばしたという。飛ばすだけなら iOS や android 使うほうが環境が整っていて良いです。

デモで使ったプログラムと簡単なセットアップ方法は [bitbucket のリポジトリ](https://bitbucket.org/hiroaki_kawai/drone_proxy)に置きました。ard_arm デーモンは、root が取れる端末であれば自動起動するように起動スクリプトに差し込んでおくと便利です。fx0 の場合は adb shell が切れてもプロセスが生き残るので、ユーザ権限で動かしてデモしました。

ardrone の制御には UDP を使います。このために中継デーモンを作らざるを得ませんでした（ TCP なら全て b2g 上で実装できた）。ざっくりとしたシステム構成については ARDrone [SDK 2.0.1](https://projects.ardrone.org/boards/1/topics/show/5346) 同梱の pdf に記載されています。pdf は網羅的では*ない*ので、必要に応じて sdk のソースコードを読みます。比較的丁寧に .h ファイルに解説が書いてあるので、それを手がかりにして ard.go を書きました。

ard_arm デーモンは b2g 側の UI と websocket や http で通信します。つまり ard_arm は websocket,http と UDP の中継デーモンとなっています。

NAVDATA とはドローンの状態を表す構造体で、UDPパケットで定常的に流れてきます。AT Command は操縦やフラグ変更のコマンド群です。最初 AT Command を単に送ればいいと思ったのですが、目を通すと NAVDATA と AT Command の二つを使うのが最小セットで、両方必要です。

```
 +--------------------+             +------------------------+
 | ARDrone  UDP 5554 ----NAVDATA-----> UDP 5554   Firefox OS |
 |          UDP 5556 <---AT Command--- UDP 5556              |
 +--------------------+             +------------------------+
```

デモの後半は、ドローンをカメラとして使いましたが、カメラの接続は UDP ではなく TCP で接続します。ただし PaVE という独自フォーマットに H.264 が格納された形でやってくるので、変換が必要です。今回のデモでは SDK 付属プログラムをそのまま使いました。ビデオ時の接続はこんな感じになります（個人的には mpegts/UDP で流してくれたほうが嬉しかった…）。

```
 +--------------------+             +----------------+
 | ARDrone  UDP 5554 ----NAVDATA-----> UDP 5554   PC |
 |          UDP 5556 <---AT Command--- UDP 5556      |
 |          TCP 5555 ----PaVE--------> TCP any       |
 +--------------------+             +----------------+
```

SDK 付属プログラムの注意点としては、Linux の場合 intel architecture が大前提になっていることです。一度 raspberry pi で動作させたのですが、アセンブラコードの呼び出し部分を arm に手動で振り替えないといけませんでした。デモ時は Fedora 21 x86_64 を使いました。
lxc-snapshot

LXCは，Linuxのためのコンテナ仮想化ツールである．lxc-snapshotは，LXCコンテナのスナップショットを管理するためのツールである．本記事では，lxc-snapshotの使い方について概説する．

# スナップショットを作成する
lxc-snapshotでは，コンテナファイルシステムのスナップショットを作成することができる．ここでは，btrfsをバックエンドとしたときのスナップショットの作成について説明する．btrfsは，ファイルシステムレベルでのスナップショット作成に対応している．lxc-snapshotはbtrfsに対応しているので，この2者を組み合わせて使うと，高速かつ小容量でスナップショットを実現することができる．

仮に，```c1```というコンテナが存在するとする．```c1```コンテナのスナップショットは，次のコマンドにより作成することができる．スナップショット名は，指定が無い場合は```snap0```というような形式になる．

```
# lxc-snapshot -n c1
```

スナップショット名を指定したい場合は，```lxc-snapshot -n c1 newsnap```というように指定する．実際にスナップショットが作成されているかどうかは，次のコマンドにより確認することができる．

```
# lxc-snapshot -n c1 -L
snap0 (/var/lib/libvirt/lxcsnaps/c1) 2014:12:28 19:10:26
```

これは，```/var/lib/libvirt/lxcsnaps/c1/snap0```に，```c1```のルートファイルシステムのスナップショット```snap0```が存在するという意味である．スナップショットは，btrfsのサブボリュームとして作成される．作成されたスナップショットの概要を次に示す．

```
# ls /var/lib/libvirt/lxcsnaps/c1/snap0
config	fstab  rootfs  ts
# ls /var/lib/libvirt/lxcsnaps/c1/snap0/rootfs
bin   dev  home  lib64	mnt  proc  run	 selinux  sys  usr
boot  etc  lib	 media	opt  root  sbin  srv	  tmp  var
# btrfs subvolume list /
...
ID 423 gen 651825 top level 258 path var/lib/libvirt/lxcsnaps/c1/snap0/rootfs
...
```

# スナップショットから復元する
lxc-snapshotは，作成したスナップショットから，コンテナを過去の状態に復元することができる．前セクションで作成したスナップショットを復元することを考える．コンテナ```c1```は，あらかじめ停止しておく．このとき，次のようなコマンドにより，コンテナ```c1```をスナップショット```snap0```の状態に戻すことができる．

```
# sudo lxc-snapshot -n chef-0.umireon.info -r snap0
```

# まとめ
lxc-snapshotは，LXCコンテナのスナップショットの作成および復元を行うことができる．
【CentOS6】「LC_CTYPE: cannot change locale (UTF-8): そのようなファイルやディレクトリはありません」が出たときの対処法



##現象

・centOS全体で、日本語が文字化けする
　（`git log`でコミットログの日本語読めないのが辛い）
・ログイン毎にwarningが出る

```
Welcome to your Vagrant-built virtual machine.
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): そのようなファイルやディレクトリはありません
```

・`locale`コマンドを叩いても警告

```
[vagrant@localhost ~]$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: LC_ALL?????????????????????: ??????????????????????
LANG=ja_JP.utf8
LC_CTYPE=UTF-8
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=
```

##原因
そもそも日本語化しようとして、
`/etc/sysconfig/i18n`
このファイルに、
`LANG="ja_JP.utf8"`
を書き加えたのち、警告が出るようになった

LC_CTYPEの設定が足りていない？


##対処法

一時回避はこれでできた
`export LC_CTYPE='ja_JP.UTF-8'`
しかし再起動すると戻ってしまう。

これを永続的に設定するには、再び下記ファイルを編集する

`sudo vim /etc/sysconfig/i18n`

```i18n
LANG="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"　←これを追加
SYSFONT="latarcyrheb-sun16"
```

再起動すれば、もうwarningは出ないはず！

localeを叩いても警告はでません。

```
[vagrant@localhost ~]$ locale
LANG=ja_JP.UTF-8
LC_CTYPE=ja_JP.UTF-8
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```
phpspec2.1の新機能 - 仮実装の自動生成

仮実装（Fake It）とは。テストをグリーンにするために一旦単に定数を返すような実装を行い、グリーンになることを確認してから実装を行うことです。

「テスト駆動開発入門」よると

> 仮実装は、ロッククライミングで頭上にピトンを打つようなものである。
> まだそこには達していない（テストはあるが、コード構造は間違っている）。
> しかし、そこに到達すれば、安全だと分かる（テストが以前として動作している）。

さてphpspec2.1ではこの仮実装を自動生成できます。まず以下のようなSpecを作り、

```php:spec/MarkdownSpec.php
<?php

namespace spec;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;

class MarkdownSpec extends ObjectBehavior
{
    function it_converts_plain_text_to_html_paragraphs()
    {
        $this->toHtml("Hi, there")->shouldReturn("<p>Hi, there</p>");
    }
}
```

このSpecを実行すると、いろいろ聞かれてSUSのひな形が生成されるのは従来通りです。

```
$ vendor/bin/phpspec run
...
  Do you want me to create `Markdown` for you?
                                                               [Y/n]
...
  Do you want me to create `Markdown::toHtml()` for you?
                                                               [Y/n]
```

```php:src/Markdown.php
<?php

class Markdown
{

    public function toHtml($argument1)
    {
        // TODO: write logic here
    }
}
```

phpspec2.1で追加された`--fake`オプション付きで実行するとこのようなSpecが出力されます。

```
$ vendor/bin/phpspec run --fake
...
  Do you want me to make `Markdown::toHtml()` always return '<p>Hi,
  there</p>' for you?
                                                               [Y/n]
...
```

```php:src/Markdown.php
<?php

class Markdown
{

    public function toHtml($argument1)
    {
        return '<p>Hi, there</p>';
    }
}
```
Bootstrap Material Button 書いた

![スクリーンショット 2014-12-28 19.11.45.png](https://qiita-image-store.s3.amazonaws.com/0/2846/f5abaa8c-5430-25a4-eb92-840dc9a64a51.png)

冬季休暇の勝手宿題として使えそうなライブラリでも作ってみようと思いたち、第一弾にBootstrapでAndroidのMaterialデザインに採用されているメニューボタンのアニメーションを利用出来る様にしてみました。  

基本的にはCSSファイルを読み込んでHTMLコードを記載すれば動くと思います。  
.navbarの.navbar-header内で.navbar-brandを真ん中に配置し、左右にaタグで.navbar-header-left、.navbar-header-rightで配置すれば.navbar内で利用出来るかと思います。  

.btnと一緒に利用すればボタンの中で利用出来ます。

サンプルは[こちら](http://fromkk.me/materialbutton/)に配置しておきました。  

コードは[こちら（Github）](https://github.com/fromkk/BootstrapMaterialButton)です。  

今のところ、cross、arrow-left、arrow-right、triangle、rect、dialの6つを用意してあります。

細かい所が気になるのでその内微調整しようかと思っています。

何かバグや要望あればコメント下さい。
[lua5.1]文字列の桁揃え

string.formatは数字の桁揃えしかできないので下記のように行った。

1. 6文字以上のものは先頭から6文字までを抽出。
2. 6文字以下のものは末尾にスペースを追加する。

という場合

```lua
  local len = string.len(str) -- 文字数をカウント
  if 6 > len then -- もし6文字より少なければ
    len = 6 - len -- その数を求めて
    for i = 1, len do -- 差の分だけスペースを追加する
      str = str.." "
    end
  end
  str = string.sub(str, 1, 6) -- 先頭から6文字までを抽出
```
[lua5.1]テーブルのソート

Luaでは関数が用意されていないため、ソート用の配列を作成し並べる必要がある。

```lua
function tableSort(obj)  
  local sortkey = {}
  local n = 0
  for k,v in pairs(obj) do
    n = n + 1
    sortkey[n] = k
  end
  table.sort(sortkey,function(a,b)
    return tonumber(a) < tonumber(b)
  end)
  return sortkey
end
```
MacOSX に QEMU をインストールする

# はじめに
ARM の開発環境が欲しかったから、
MacOSX(Yosemite) に、QEMU をインストールしてみる。

# 環境
MacOSX (Yosemite)
Homebrew version 0.9.5

# インストール
Homebrew でインストールする。

```
$ brew install qemu
```

# 終わりに
書くまでもなかった。
PHPで指定された曜日が直前1週間以内だと何月何日かを取得する

先日、直前1週間以内で特定の曜日の日付を取得する必要があったので、その時書いた処理を拡張し最近1週間以内で指定された曜日が何月何日かを取得する関数を書いてみました。

## 日付の求め方
直前1週間以内で特定の曜日の日付を求める場合、 Datetime オブジェクトにある DateTime::format('w') を利用して、以下のように求めることができます（[参考](http://qiita.com/and8-tamura/items/6cf148ed50b71b27c887)）。

### 特定の曜日が日曜日の場合

日曜日の場合どの日から計算しても今週の日付になることから、今日の日付から日曜日の日付までの差を求めることで計算できます。

1. 今日が日曜日から何日たっているか求める
1. 今日の日付から 1. で求めた日数分引く

```php:test1.php
<?php
  function get_last_date_from_dow($dow = 0){
    $today = new Datetime();
    $days_from_dow = $today->format('w') - $dow;
    return $today->sub(new DateInterval('P'.$days_from_dow.'D'));
  }
```

### 特定の曜日がその他の曜日の場合
その他の曜日の場合、場合によっては求める日付が先週になることがあります。
その場合、先ほどの求め方だと **-n日** の差が出てしまうため、先ほどの 2. で日数を足すことになっていまいます。そのため、先週の日数を考慮した上で日付を求める場合少し工夫が必要になります。
曜日の特性に着目すると、以下のことが言えます。

* 7日周期
* 各曜日は同じ順番で出てくる

これらを踏まえると、先週の日付を求める場合、以下に示すように週の終わりから特定の曜日が何日経っているかを求め、今日が日曜日から何日たっているか求めれば、うまくいきそうです。

1. 特定の曜日が週の終わりから何日たっているか求める
1. 今日が日曜日から何日たっているか求める
1. 今日の日付から 2. で求めた日数分引く


```php:test2.php
<?php
  function get_last_date_from_dow($dow){
    $today = new Datetime();
    $days_from_dow = 7 - $dow + $today->format('w');
    return $today->sub(new DateInterval('P'.$days_from_dow.'D'));
  }
```

しかし、この求め方では問題が生じてしまいます。先週の日付を求めようとするときの問題を解消するために、上記の求め方を出しましたが、今度は求める日付が今週の日付であった場合に先週の日付が求まってしまう、すなわち7日分余計に引いてしまうという問題が生じていまいます。
改めて、曜日の特性に着目して考えると、先ほど求めた日数から7の剰余を取れば、7日分余計に引いてしまう部分は解消できそうです。
最終的な求め方は以下になります

1. 特定の曜日が週の終わりから何日たっているか求める
1. 今日が日曜日から何日たっているか求める
1. 1. と 2. の和から7の剰余を求める
1. 今日の日付から 3. で求めた日数分引く

## デモ
https://paiza.io/projects/5qceqpxYiAd2cRCrWtGV-Q

## ソースコード
```php:test3.php
<?php
    /**
     * 指定された曜日が最近1週間以内だと何月何日かを取得する
     * 曜日の数字が0〜6の整数でない時falseを返す
     * @param int $dow 曜日(day of week)の整数(0〜6)
     * @return Datetime|bool
     **/ 
    function get_last_date_from_dow($dow){
        try {
            if(is_int($dow) && $dow >= 0 && $dow < 7){
                $today = new Datetime();
                $days_from_dow = (7 - $dow + $today->format('w')) % 7;
                return $today->sub(new DateInterval('P'.$days_from_dow.'D'));
            } else{
                throw new Exception('引数には0〜6の整数のみ使用できます');
            }
        } catch (Exception $e) {
            echo '例外: '.$e->getMessage().PHP_EOL;
            return false;
        }
    }
```

## 参考文献
[【PHP】指定した日の週の週初めの日付を取得するロジック](http://qiita.com/and8-tamura/items/6cf148ed50b71b27c887)
【jQuery】Webサイトのコーディングがラクになるライブラリ型プラグイン

#共通ナビゲーション設計やレガシィブラウザ対応もラクラク

もっとHTMLに手を加えず簡単にWebサイトが作れないか。
というのをコンセプトに[luck2.js](https://github.com/sawadays0118/luck2js)というjQueryプラグインを制作しました。 

##概要/ダウンロード
Githubのページをご覧下さい。
https://github.com/sawadays0118/luck2js

このプラグインはyuga.js TT Customの改変にあたります。
基本的な使い方は変わっておりませんので、製作者様のマニュアルも参考にしていただくようお願いします。

yuga.js TT Custom - yuga.jsの個人的なカスタマイズ
http://etc.dounokouno.com/yuga.js-TT-Custom/


##対応ブラウザ
ie6以上


##基本機能

プラグインの主な機能一覧です。

* ロールオーバー
* 外部リンクの自動設定
* スムーススクロール
* グロナビ、サブナビの自動カレント表示
* タブ機能（リンク設定で直接指定のタブにアクセス可）
* CSS擬似クラスのサポート（:first-child,:last-child,:nth-child(),:nth-child(n)）
* アイコン付与
* 列ごとにボックスの高さを揃える(fixHeight.js)
* プレースホルダー
* 簡易トグル
非 Angular.js サイトでも Protractor でテスト

Protractor は Angular.js 専用というわけではなく、Angular.js を使っていないサイトでも使用することができました。ポイントは browser.ignoreSynchronization = true を設定するのと、要素の選択に findElement を使うところです。

WordPress プラグインの管理画面のテストをするために以下の様なコードを使ってます。beforeEach は Jasmine の仕組みで、ここにテストの準備のために実行するコードを書きます。

```js
describe('SWE setting screen', function() {
    it('WP login', function() {
        browser.get('http://localhost/wp-login.php');

        browser.findElement(By.id('user_login')).sendKeys('admin');
        browser.findElement(By.id('user_pass')).sendKeys('password');
        browser.findElement(By.id('wp-submit')).click();

        expect(browser.getTitle()).toMatch(/^Dashboard/);
    });
});

beforeEach(function() {
    browser.ignoreSynchronization = true;
});
```

簡単ですが、Protractor でテストを書き始めることができた記念ということで。

[参考: Protractor - Testing Angular and Non Angular Sites](http://ng-learn.org/2014/02/Protractor_Testing_With_Angular_And_Non_Angular_Sites/)
Qiita の記事タイトル命名時にコンテキストを明示する #qiita #esa_io

# Qiita の記事タイトル命名時にコンテキストを明示する
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Qiita の記事タイトル命名時にコンテキストを明示することについて

## No Context Information

:fire::fire::fire:
:fire::walking::telephone_receiver: ( 非常口が閉まっているんだけど鍵ってどこ？ )
:fire::fire::fire:

－－－－－－－－－－－－－－－－－－－－－

:walking::telephone_receiver: ( 非常口がどうかしたの？今忙しいからあとでね。ガチャ )

## With Context Information

:fire::fire::fire:
:fire::walking::telephone_receiver: ( 今オフィスが火事でテラヤバス。非常口が開かないから鍵の場所おしえれ )
:fire::fire::fire:

－－－－－－－－－－－－－－－－－－－－－

:walking::telephone_receiver: ( マジスカ！倉庫のすぐ横にあるッス。すぐに消防車を呼ぶッス )

## <i class="fa fa-cube" style="font-size:1em;"></i> カテゴリ = コンテキストの明示
Twitter など、Qiita の記事が拡散される際は基本的にタイトルのみで拡散されることになります。
そのため、タイトルだけで何のカテゴリの話か推測出来る必要があります。

## <i class="fa fa-cube" style="font-size:1em;"></i> タイトル
記事のタイトルに対象カテゴリのキーワードも含めるようにしています。
書いている本人は何のカテゴリか分かって書いていますが、
実際にツイートなどで情報が出まわる際に、タイトルにカテゴリが含まれていないと何の話だか分かりません。

また、フォーマットを決めて情報を発信していると、
読む側が読みやすいのでは？
と思っています。

そのため、基本的に記事タイトルの頭にカテゴリを付与し、
パイプで区切って詳細を記述するフォーマットを愛用しています。

~~~
Ruby | アノテーションコメント（TODO、FIXME、OPTIMIZE、HACK、REVIEW）
~~~

など。

ただし、記事詳細の出だしもカテゴリと同じ名前から始まっていると繰り返しがうるさい印象になります。

~~~
Ruby | Ruby 2.2.0 の新規フィーチャーをネチっこくおさわりする #ruby
~~~

そのため、こういった場合はカテゴリのフォーマットを削除しています。

~~~
Ruby 2.2.0 の新規フィーチャーをネチっこくおさわりする #ruby
~~~

## :memo: 戯言
この手の話は Qiita::Team や esa.io 等を利用したナレッジ共有の際のテクニックの1つとしても役に立ちます。

Qiita::Team や esa.io 等を利用している場合、 Slack や Idobata などのチャットツールと連携しているケースが多いと思います。
その際も、 Qiita から Twitter への通知と同様に、基本的には記事のタイトルが表示されます。
（ツールによっては、タイトルに続く記事内容を一定量プレビューしたりしますが）

タイトルにカテゴリを含んでおくと、通知先のチャットツールで記事の内容を類推しやすくなります。
esa.io は、この手の手法を効率良く行なうのに役立つ機能を複数持っていて、

* 記事タイトルをスラッシュ区切りにするとカテゴリになる [^1]
    * 階層化されているため、抽象度の大きいところから記事内容を素早く理解しやすい
* 投稿テンプレートの利用で、記事タイトル・記事内容ともに体裁を統一しやすい [^2]

など、使いやすいです。

## :books: 脚注
[^1]: [esa.io 公式 | 記事の書き方 | 記事タイトルについて](https://docs.esa.io/posts/15#0-3-0)
[^2]: [esa.io に emoji 見出しの投稿テンプレートを作成する #esa_io](http://qiita.com/tbpgr/items/2010ce4b89365f42211f)
Twitter 連携を意識して Qiita の記事タイトルの末尾に魚のフン 🐟💩 のようにハッシュタグをつける #qiita #twitter

# <i class="fa fa-twitter" style="font-size:1em;"></i> Twitter 連携を意識して Qiita の記事タイトルの末尾に魚のフン :tropical_fish::poop: のようにハッシュタグをつける
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
<i class="fa fa-twitter" style="font-size:1em;"></i> Twitter 連携を意識して Qiita の記事タイトルの末尾にハッシュタグをつける慣習について

## <i class="fa fa-cube" style="font-size:1em;"></i> ハッシュタグをつける理由
Qiita の記事を書いた後、自分で情報を拡散する場合も他の訪問者が拡散する場合も
大抵は Tweet ボタンか はてなブックマーク ボタンから行うと思います。
この際に、タイトルの末尾に
.
.
.
**魚のフン :tropical_fish::poop: のように**
.
.
.
.
.
**3匹の子豚 :pig::pig2::pig_nose: を追いかける狼 :wolf: のように**
.
.
.
.
.
**最終コーナーを回ったナリタブライアン :racehorse: のように**
.
.
.
.
.
**マリオのあとについてくるテレサ :ghost: のように**
.
.
.
.
.
**ST○P 細胞を追い求める 小○方さん :person_frowning: のように**
.
.
.
.
.
.
**ハッシュタグ**をぶら下げておきます。

すると拡散対象のテンプレートに
ハッシュタグも含まれることになります。

これにより、特定のハッシュタグにアンテナを張っている想定読者に対して
情報が届きやすくなります。

## <i class="fa fa-flask" style="font-size:1em;"></i> 記事タイトルとツイートの例
* 記事タイトル

![qiita_title_hash_tag1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/13530481-5dae-6a77-023a-e19c4dbdceb9.png)

* ツイート

![qiita_title_hash_tag2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/d6975c72-deb8-1195-4c7e-047f6683d17a.png)
CentOS で iptables start して「ファイアウォールルールを適用中」で止まる対処法

`service iptables start` し、「ファイアウォールルールを適用中（英語環境では Applying firewall rules）」で止まって動かなくなってしまいました。調べても同様の現象が出てこなかったので書いておきます。

止まるときに /var/log/message に下記のような出力がされていました。

```text:/var/log/message
Dec 28 16:21:52 (サーバー名) kernel: OUTPUT DROPPED: IN= OUT=eth0 SRC=(サーバーIPアドレス) DST=(自宅で契約しているプロバイダのIPアドレス) LEN=212 TOS=0x10 PREC=0x00 TTL=64 ID=28597 DF PROTO=TCP SPT=(SSHDのポート番号) DPT=43382 WINDOW=266 RES=0x00 ACK PSH URGP=0
```

よくわかってないんですが、処理が完了したことを知らせるパケットが飛ぶんですかね？　それを iptables で DROP してしまっているのが原因ぽいです。

SSHD のポート番号から出て行くパケットを許可すれば良さそうですが、今回はサーバから OUTPUT するパケットを ACCEPT することで解決しました。

```bash
# iptables -P OUTPUT  ACCEPT
```
PythonでOpenCVを使う@Mac

# PythonでOpenCVを使う
散々ハマったのでやり方を簡単にまとめておきます。
...でも簡単です。

## 環境
Mac 10.9.4 
Python 2.7.8
OpenCV 2.4.9

## 手順
あらかじめnumpyをインストール済みであればOpenCVインストール時にOpenCVのディレクトリ（brewでインストールしたなら/usr/local/Cellar/opencv/バージョン/）にcv.pyとcv2.pyというPythonのライブラリが入っています。
やることはひとつ。使用しているPythonのsite-packagesディレクトリ以下にこれらのシンボリックリンクを張ってやるだけです。

以下、OpenCVのインストールから。

```
brew tap homebrew/science
```

次に、numpyが入っているかどうか確認して下さい。virtualenvで仮想環境を利用している場合も同様。numpyがインストール済みであることを確認して、

```
brew install opencv
```

次に、今利用しているPythonのsite-packagesディレクトリに移動して、以下のコマンドでシンボリックリンクをはってください。つまり、virtualenvを使っていないのであれば、例えば

```
cd /Library/Python/2.7/site-packages/
```

virtualenvを使っているのであれば、例えば

```
cd ~/.virtualenv/環境名/lib/python2.7/site-packages 

```
あとは以下のコマンドをでシンボリックリンクをはってやるだけ！

```
ln -s /usr/local/Cellar/opencv/2.4.9/lib/python2.7/site-packages/cv.py cv.py
ln -s /usr/local/Cellar/opencv/2.4.9/lib/python2.7/site-packages/cv2.so cv2.so
```

以下のようにインポートしてエラーが出なければ成功です！

```
➜  ~  python
Python 2.7.8 (default, Oct 16 2014, 05:18:45) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv
>>> import cv2

```

segmentation faultが出た場合、シンボリックリンクがはれていません。cv.pyとcv2.pyをsite-packages以下にコピーするだけだとこうなります。コピーしただけでは肝心のOpenCV本体とつながらないんだと思います。ご注意を。

そもそもcvなんていうライブラリはないよというエラーが出た場合、OpenCVをインストールした時にPythonのパッケージが同時にインストールされていない可能性が高いので、一度OpenCVをアンインストールし、numpyがインストールされていることを確認した上でもう一度チャレンジしてみてください。

## 参考
正直に言うと、virtualenvのくだり以外はそのままです。OpenCVをPythonでつかう！っていう記事は沢山ありますが、以下のリンクが一番簡潔で良かったです。
<a href="https://jjyap.wordpress.com/2014/05/24/installing-opencv-2-4-9-on-mac-osx-with-python-support/">Installing OpenCV 2.4.9 on Mac OSX with Python Support</a>
XojoでUnicode正規化

XojoでUnicode正規化をするメソッドです。
XojoにはNSStringクラスがないのですけど、CFStringRefで代用できるんですね。
String型からとくに変換する必要もないので、かなり便利。

```vbnet

Function toNFC (s as String) As String
  // NFCの場合
  
  If s.LenB=0 then Return ""
  
  Declare function precomposedStringWithCanonicalMapping lib "Cocoa" selector "precomposedStringWithCanonicalMapping" (targetStr as CFStringRef) as CFStringRef
  
  Return precomposedStringWithCanonicalMapping(s)
End Function
```

4種類の正規化形式は以下の通り。
* NFC -> precomposedStringWithCanonicalMapping
* NFD -> decomposedStringWithCanonicalMapping
* NFKC -> precomposedStringWithCompatibilityMapping
* NFKD -> decomposedStringWithCompatibilityMapping