OmniAICreator/Qiita-1.07M huggingface dataset:
【３度目の正直】 Stack Overflowのクローン、 Question2Answer を CentOSにインストール

Rails の shapado, Django の Askbot のインストールに失敗して心が半分折れてましたが、やっとStack Overflowのクローンのインストールに成功したので記録として残します。

## インストール方法

ここに書いてる。
http://www.question2answer.org/install.php

## Nginx の設定

ただ上の設定だとApacheでNginxに対策がちゃんとできてないのでこんなエラーになる。

> 2013/09/11 05:16:44 [error] 32579#0: *327 FastCGI sent in stderr: "PHP message: PHP Question2Answer MySQL query error 1146: Table 'xxxxxx.qa_options' doesn't exist - Query: (SELECT 'options' AS selectkey, title, content FROM qa_options) UNION ALL (SELECT 'time', 'db_time', UNIX_TIMESTAMP(NOW()))" while reading response header from upstream, client: 180.13.120.139, server: myserver, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/www.sock:", host: "myserver"

```/etc/nginx/site-available/example.comの抜粋
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php-fpm/www.sock;
    # fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
  }

if (!-e $request_filename) {
                rewrite ^(.+)$ /index.php?qa-rewrite=$1 last;
                break;
        }
```
ここで Wordpressを動かすのには必要なかった fastcgi_split_path_info が抜けてたのが問題の原因だったらしい。

下の設定は /123/hoge みたいにきれいなURLするのに必要な設定。

## 日本語化

http://www.question2answer.org/addons.php
から日本語のファイルを落としてきて展開、出てきた `ja` フォルダを qa-lang の配下にいれる。
あとは設定画面で言語ファイルのチェックをすれば日本語が選択できるようになる。

## マルチバイトに対応

> The installed version of PHP was compiled without multibyte string support. Searching will be less effective for non-Roman characters.

日本語のメッセージはコピペし忘れてたけど、とりあえずマルチバイトサポートなしでコンパイルされてるので日本語の検索が遅いらしい。てっきりPHP本体のコンパイルしなおしでまた１時間ぐらい待たされるのかと思ったら

```
$ sudo yum install php-mbstring
$ sudo service php-fpm restart
```

だけだったのでさくっとすんだ。

## 参考

fastcgi_split_path_info ^(.+\.php)(/.+)$;
http://www.howtoforge.com/running-question2answer-on-nginx-lemp-on-debian-squeeze-ubuntu-12.10

Question2Answer mit nginx- Rewrite Rules für den Webserver « Leben des wolf-u.li
http://wolf-u.li/4361/question2answer-mit-nginx-rewrite-rules-fuer-den-webserver/

How do I enable multibyte string processing in PHP on CentOS, RedHat, etc., Linux?
http://www.colickyclown.com/a/loader.php/sites/ColickyClown/faq/00025/
コマンド打つときの左の[user@host ~] $ みたいなのに色をつける

*追記* 色々と修正。今度こそ大丈夫のはず。

コマンド打つときの左側にある部分。あれはPS1(primary prompt string)っていうらしいんですが単純に「プロンプト」だけでもOKっぽいですね。よくわからん。

さて、ここに色ついてると便利ですよね。コマンドの結果がズラズラ―っと出て何行ぐらい流れたかわからない時も画面内に収まる程度ならすぐにわかりますし。 なので色を付けてみました。

```bash:~/.bash_profile
# Set Prompt String color
lc='\[\e[1;' # lead-in character
RED=${lc}31m;
GREEN=${lc}32m
PURPLE=${lc}35m
RC=${lc}0m # reset character

if [ "$USER" = "root" ]
then
pc=$RED
else
pc=$GREEN
fi

PS1="${pc}\]\u@\h \W\\$ ${RC}\]"
```

VPS上のホスト名は `sudo hostname myhostname` で好きに変えれば良いっぽい。

## 参考

デモ対策：プロンプトを短くするやり方メモ - 情報科学屋さんを目指す人のメモ（FC2ブログ版）
http://did2.blog64.fc2.com/blog-entry-249.html

bashプロンプトに色を付ける|set color of prompt - sppr’s notes
http://d.hatena.ne.jp/sppr/20090117/1232199271

コマンドラインの左側の部分に名前はついてますか？ - QA@IT
http://qa.atmarkit.co.jp/q/2993

Overwraping lines when using ssh by osx terminal - Super User
http://superuser.com/questions/648296/overwraping-lines-when-using-ssh-by-osx-terminal/648343?noredirect=1#648343

| Red Hat
http://www.redhat.com/advice/tips/rhce/prompt.html
UbuntuでSSHでリモートホストにアクセスする時は背景色を変える

自分がどこにいるのかよくわからなくなるので背景色を変えておきましょう、というお話。
Macの方でもやってるんだからUbuntuも変えときたかったので。

## やり方

Gnome-terminal のメニューの File -> New Profile から適当にプロファイルを作って

```bash:~/.bashrc
alias -p ares='gnome-terminal --window-with-profile=Ares -x bash -c "ssh ares"; exit'
```

とすれば、`ares` と打てば別ウィンドウが開いてそのプロファイルが適用されるので間違えなくなる。

できればタブごとに背景色の変更をしたかったけど無理なご様子。

## 参考

command line - Automatically change Terminal colors on remote connection? - Ask Ubuntu
http://askubuntu.com/questions/13705/automatically-change-terminal-colors-on-remote-connection
Mac のClipMenu にアクション（JavaScript）を追加する




# 目的
ClipMenu のアクションに独自プログラム（末尾のスクリプトサンプル）を追加する。
アクションへのプログラム追加方法は、参考情報を見れば一目瞭然なので割愛して、ココには自分用のサンプルスクリプトを残す。

## [ClipMenu とは？](http://www.clipmenu.com/ja/)
* Mac 用のクリップボード履歴保持ツール。  
* 履歴保持以外にも以下の様な機能があり超絶便利なツール。
  * スニペット登録で、テンプレ的なテキストを登録できる。
  * JavaScript でアクションを登録でき、工夫次第で色々できる。


***
# 前提条件
## 環境
* OS: Mac OSX 10.8.4
* ClipMenu 0.4.3

***
# アクションスクリプトサンプル
## スクリプト内容
呼び出したアクションで日付入力プロンプトを表示させ、その表示されたプロンプトに日付を入力すると、入力日付が属する月の日付（曜日）と時間のテンプレートテキストをクリップボードに出力する。
後述の出力例とソースみたほうが早い。

### 何故に作った？
会社にメールで月報とか出すんですが、その中でその月の日毎の勤務時間も報告する必要があり、毎月以下の出力例みたいなのを書くのがめんどくさすぎるので作った。
ついでに、新規にそれ用のツールを作るのでなく、普段よく使うツールでおさめられればなお楽だなと思って、自分にとっては必須のClipMenu のアクションで書くことにした。


## 出力例
日付入力プロンプトに、"2013/09/11" と入力した場合（日付は何日であろうが構わない）：

* 09/01(日): xx:00-xx:00: 
* 09/02(月): xx:00-xx:00: 
* 09/03(火): xx:00-xx:00: 
* 09/04(水): xx:00-xx:00: 
* 09/05(木): xx:00-xx:00: 
* 09/06(金): xx:00-xx:00: 
* 09/07(土): xx:00-xx:00: 
* 09/08(日): xx:00-xx:00: 
* 09/09(月): xx:00-xx:00: 
* 09/10(火): xx:00-xx:00: 
* 09/11(水): xx:00-xx:00: 
* 09/12(木): xx:00-xx:00: 
* 09/13(金): xx:00-xx:00: 
* 09/14(土): xx:00-xx:00: 
* 09/15(日): xx:00-xx:00: 
* 09/16(月): xx:00-xx:00: 
* 09/17(火): xx:00-xx:00: 
* 09/18(水): xx:00-xx:00: 
* 09/19(木): xx:00-xx:00: 
* 09/20(金): xx:00-xx:00: 
* 09/21(土): xx:00-xx:00: 
* 09/22(日): xx:00-xx:00: 
* 09/23(月): xx:00-xx:00: 
* 09/24(火): xx:00-xx:00: 
* 09/25(水): xx:00-xx:00: 
* 09/26(木): xx:00-xx:00: 
* 09/27(金): xx:00-xx:00: 
* 09/28(土): xx:00-xx:00: 
* 09/29(日): xx:00-xx:00: 
* 09/30(月): xx:00-xx:00: 


## スクリプト
```入力日から月日テンプレ生成.js
//var input = clipText;
var input = prompt('日付入力：yyyy/MM/dd');

// check input date
if (!input){
   return;
}

// check input format yyyy/mm/dd
if (!input.match(/^\d{4}\/\d{2}\/\d{2}$/)) {
    return;
}

// get year
var tyear = input.substring(0,4);
// get month
var tmonth = input.substring(5,7);
if (tmonth.match(/^([0][1-9])$/)) {
    var tmonthnum = tmonth.replace("0","");
} else {
    var tmonthnum = tmonth;
}

// get all date
var alldate = new Date(tyear,tmonthnum,0).getDate();

var w = ["日","月","火","水","木","金","土"];

var returnval = new String();
for (var i = 1; i <= alldate; i++) {
    
    var d = new Date(tyear + "/" + tmonthnum + "/"+ i);

    returnval += "* ";
    returnval += tyear;
    returnval += "/";
    returnval += tmonth;
    returnval += "/";
    returnval += (i < 10)? "0" + i : i;
    returnval += "(";
    returnval += w[d.getDay()];
    returnval += ")";
    returnval += ": ";
    returnval += "xx:00-xx:00";
    returnval += ": ";
    returnval += "\n";
}

return returnval;
```
内包表記いろいろ

Pythonの便利な記法としてリスト内包表記があります．
こんな感じに，

```py
[a for a in [1, 2, 3, ]]
```

この書き方実はリスト以外にも使えます．

### dict

```py
{ a: b for a, b in [(1, 2, ), (3, 4, ), ]}
```

### set

```py
set(a for a in [1, 2, 3, ])
```

### ジェネレータの生成

```py
(a for a in [1, 2, 3, ])
```


### リスト内に特定の条件に一致するデータがあるかチェックする

```py
len([item for item in items if func(item)]) > 0
# funcは条件判定用の関数
```
githubでのCoffeeScript判定

先日、CoffeeScriptでちょこちょこしたモノを作って、github上にhostingしてみて驚いた。

コンパイル後のJavaScriptをリポジトリ内に含んでいても、CoffeeScriptのみで構成されたリポジトリの扱いとなっていたのだ

![Screen Shot 2013-09-11 at 00.57.27 .jpg](https://qiita-image-store.s3.amazonaws.com/0/10009/07a6cee3-b9f7-be43-5242-ad06e6c7b5f6.jpeg)

理由として2通りの解釈が考えられる。

- CoffeeScriptから生成したJavaScriptはCoffeeScript扱いになる
- CoffeeScriptから生成したJavaScriptは判定から除外される

どちらが正しいのか気になって調べてみた。

## 結論

githubの言語のdetectionには、linguistというライブラリが利用されていて、github上方の言語の比率にもこれで推定されたデータが使われている様子。

[github/linguist](https://github.com/github/linguist)


そこで、CoffeeScript関連の記述を調べてみたところ、CoffeeScriptかどうかを判定するメソッド、`compiled_coffeescript?`を発見

[linguist/lib/linguist/generated.rb at 4741a47d213f27cae3ee8825dc78e3fe02d3d08e · github/linguist](https://github.com/github/linguist/blob/4741a47d213f27cae3ee8825dc78e3fe02d3d08e/lib/linguist/generated.rb#L89)

ソースを読み解く限り

- jsの拡張子を持つファイルのうち、ソース1行目のコメントに"Generated by"という文字列が含まれていたらCoffeeScript
- 含まれていなかったとしても、全体が`(function() {}).call(this);`に囲まれていて、かつ`_fn`,`_len`など、自動生成っぽい文字列が一定個数含まれていたらCoffeeScript

と、意外と適当な感じで判定されていました。おもしろい。

## まとめ

調べても日本語の情報がなかったので書いてみました。coffee breakの話題にもってこいなのではないでしょうか。
Go言語でWebAppの開発に必要なN個のこと


[元ネタ](http://d.hatena.ne.jp/gfx/20130909/1378741015)

あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずGo言語について知っていることを書いた。

##パッケージマネージャ
標準でついてるgoツールを使おう。必要なライブラリはリポジトリから、go getで取ってこよう。

```
go get <リポジトリ>
```

* http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies

##アプリケーションサーバ

標準パッケージの[net/httpパッケージ](http://golang.org/pkg/net/http)を使えばhttpサーバを動かすことができる。apacheやnginxで動かしたかったら、標準パッケージの[net/http/cgiパッケージ](http://golang.org/pkg/net/http/cgi/)や[net/http/fcgiパッケージ](http://golang.org/pkg/net/http/fcgi)を使えばいい。

* http://golang.org/pkg/net/http
* http://golang.org/pkg/net/http/cgi/
* http://golang.org/pkg/net/http/fcgi

##ルーティングとリクエストパラメータの処理

標準パッケージだと[net/http.Request](http://golang.org/pkg/net/http/#Request)や[net/http.ServeMux](http://golang.org/pkg/net/http/#ServeMux)あたりを使えばいける。もっと機能が欲しければ[goweb](https://github.com/stretchr/goweb)や[gorilla](http://www.gorillatoolkit.org/)も便利。

* http://golang.org/pkg/net/http/#Request
* http://golang.org/pkg/net/http/#ServeMux
* https://github.com/stretchr/goweb
* http://www.gorillatoolkit.org/

##データベース
標準でRDB用のインタフェースを[database/sqlパッケージ](http://golang.org/pkg/database/sql/)で定義している。実際は、各RDBMSの[ドライバ](https://code.google.com/p/go-wiki/wiki/SQLDrivers)使う。ORMなら[gorp](https://github.com/coopernurse/gorp)がいい[らしい](http://mattn.kaoriya.net/software/lang/go/20120914222828.htm)。

* http://golang.org/pkg/database/sql
* https://code.google.com/p/go-wiki/wiki/SQLDrivers
* https://github.com/coopernurse/gorp
* http://mattn.kaoriya.net/software/lang/go/20120914222828.htm

## ビューのレンダリング
HTMLなら標準パッケージの[html/templateパッケージ](http://golang.org/pkg/html/template)を使えば、テンプレートエンジンが使える。JSONやXMLなら標準パッケージの[encodingパッケージ](http://golang.org/pkg/encoding/)以下のパッケージを使えばいい。サードパーティ製であれば[MessagePack](https://github.com/ugorji/go/tree/master/codec)もある。

* http://golang.org/pkg/encoding/
* http://golang.org/pkg/html/template
* https://github.com/ugorji/go/tree/master/codec

## HTTPクライアント
標準パッケージの[net/http.Client](http://golang.org/pkg/net/http/#Client)を使えばいいと思う。

* http://golang.org/pkg/net/http/#Client

## テストフレームワーク
goツールの`go test`を使えばいい。
テストプログラムを書くには、標準パッケージの[testingパッケージ](http://golang.org/pkg/testing)を使う。webアプリのテストなら標準パッケージの[net/http/httptestパッケージ](http://golang.org/pkg/net/http/httptest)も使えるだろう。

* http://golang.org/doc/code.html#Testing
* http://golang.org/pkg/net/http/httptest
* http://golang.org/pkg/testing

## WAF
私個人はそんなに必要性を感じないが、[goweb](https://github.com/stretchr/goweb)は便利だと思った。

* https://github.com/stretchr/goweb

## マスコット
標準パッケージではないが、Gopher君というマスコットがかわいい。
Webアプリには関係ない。

* https://github.com/golang-samples/gopher-vector

以上。他にもあれば指摘してほしい。
[Mac]Docblockr Plugin時に日本語をコメントに入力出来ない問題の最も簡単な解決方法

まあ〜、小さい小さい小ネタです。

コメントで日本語を入力中、確定しようとしてenterを押すと
入力が消えてしまいます。
解決方法はいろいろ面倒な事をしなくてはいけなくて厄介ですが、
じつは非常に簡単に解決する方法があります。

タイトルの方が長いですが、結論は
**「shiftを押しながらenterで確定する」**
です。

keymapの編集だとか、Pluginを新たに入れるとか面倒な人におすすめで、
慣れると割と苦にならないです。
ただ、ことえりでしか確認していないですが。

google 日本語入力は
https://gist.github.com/koizuss/4521934
にkeymapを編集して対応する方法もあるみたいです。

Sublime Textは今までのIDEに比べ軽くて良いんですが、日本語周りが難ありますね。
配列の重複をはじく、もしくは重複を取り出す


重複を削除する方法はいくつか方法があるみたいですが、
filterを使用する事で非常に楽に実現出来ます

```js:duplicate_check.js
var a = [1,2,3,3,2,2,5];

// 重複を削除したリスト
var b = a.filter(function (x, i, self) {
			return self.indexOf(x) === i;
		});

// 重複のみをリスト
var c = a.filter(function (x, i, self) {
			return self.indexOf(x) !== self.lastIndexOf(x);
		});

// 重複を検出したものを重複しないでリスト
var d = a.filter(function (x, i, self) {
			return self.indexOf(x) === i && i !== self.lastIndexOf(x);
		});

console.log(a); // [ 1, 2, 3, 3, 2, 2, 5 ]
console.log(b); // [ 1, 2, 3, 5 ]
console.log(c); // [ 2, 3, 3, 2, 2 ]
console.log(d); // [ 2, 3 ]
```

ie8とかで動かないなら、PolyfillでArrayのプロトタイプを拡張してください。

* [filterのPolyfill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#Polyfill)
* [indexOfのPolyfill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Polyfill)
* [lastIndexOfのPolyfill](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf#Polyfill)


## (追記)ES2015対応

この記事も2年半前(2016/2時点)に書かれたもので、古い情報になったきたので、アップデート。
ES2015でも便利な機能も増えてきたので、それを使ってみましょう。
実戦投入は、環境によるので慎重に。

今回は、使用頻度が高い **重複を削除したリスト**のみを対象に記事を追記してみます
紹介するのは３つ。

 * アロー関数式を使った場合(基本的に処理方法は前のものと同じ)
 * filterの代わりにreduceを使った場合
 * ES2015で追加されたArray.fromとSetを使った場合

```js:duplicate_check2.js
var a = [1,2,3,3,2,2,5];

// アロー関数式
var b1 = a.filter((x, i, self) => self.indexOf(x) === i);

// reduceを使用した場合
var b2 = Object.keys(a.reduce((r, x)=>(r[x]=1, r), {})).map(x=>+x);

// Array.from & Setを使用した場合
var b3 = Array.from(new Set(a));

console.log(b1); // [ 1, 2, 3, 5 ]
console.log(b2); // [ 1, 2, 3, 5 ]
console.log(b3); // [ 1, 2, 3, 5 ]
```
PHP用Elasticsearchクライント、Elasticaを使ってみる (2)


[PHP用Elasticsearchクライント、Elasticaを使ってみる (1)](http://qiita.com/ise_daisuke/items/c018eeb5506a28f1bfde)
の続きで、作成したインデックスを検索してみる。

[gist](https://gist.github.com/ise/6509874#file-elasticasearchsample-php)


### 全件取得

```php
<?php
$client = new Client();
$index = $client->getIndex('natalie_data');
$type = $index->getType('comic_news');
$query = Query::create(new MatchAll());
```

### ソート条件指定

```php
<?php
$query->setSort(array('updated' => 'asc'));
```

### offset、取得件数指定

```php
<?php
$query->setFrom(0);
$query->setSize(15);
```

### 件数取得

```php
<?php
$resultSet = $type->search($query);
echo 'Total: ' . $resultSet->getTotalHits() . "\n";//総件数
echo 'Results: ' . count($resultSet) . "\n";//取得件数
```

### 検索結果取得

```php
<?php
foreach ($resultSet as $res) {
    $d = $res->getData();//結果を配列形式で取得
}
```

### キーワード検索、結果取得

```php
<?php
$qs = new QueryString();
$qs->setQuery('荒木飛呂彦 江口寿史');
$qs->setDefaultField('summary');
//$qs->setDefaultOperator('AND');
$query = Query::create($qs);
//マッチ箇所のハイライト設定
$query->setHighlight(array(
                           'fields' => array(
                                             'summary' => array(
                                                                'fragment_size' => 200,
                                                                'number_of_fragments' => 1,
                                                                ),
                                             ),
        ));
$resultSet = $type->search($query);

echo 'Total: ' . $resultSet->getTotalHits() . "\n";//総件数
echo 'Results: ' . count($resultSet) . "\n";//取得件数
foreach ($resultSet as $res) {
    $d = $res->getData();
    $hl = $res->getHighlights();//ハイライト部分の取得
    var_dump($d);
    var_dump($hl);
}
```

### 複数条件の設定

```php
<?php
// 8/27-8/28の記事で "マンガ" にマッチする記事
$b = new Bool();
$term = new Term();
$term->setTerm('summary', 'マンガ');
$b->addMust($term);
$range = new Range();
$range->addField('updated', array('from' => '2013-08-27', 'to' => '2013-08-28'));
$b->addMust($range);
 
$query = Query::create($b);
$resultSet = $type->search($query);
```

### 類似文(関連記事)検索

```php
<?php
$likeText = '『進撃の巨人』（しんげきのきょじん、Attack on Titan）は、諫山創による日本の漫画作品。小説・テレビアニメなどのメディアミックス展開が行われている。';
$mlt = new MoreLikeThis();
$mlt->setLikeText($likeText);
$mlt->setFields(array('title','summary'));
$mlt->setMaxQueryTerms(1);
$mlt->setMinDocFrequency(1);
$mlt->setMinTermFrequency(1);
$query = Query::create($mlt);
$resultSet = $type->search($query);
```

### 参考
- [Elasticsearchのquery dsl](http://www.elasticsearch.org/guide/reference/query-dsl/)
- [Elasticaのテストケース](https://github.com/ruflin/Elastica/tree/master/test/lib/Elastica/Test)
mysql> show grants for username@localhost; の "@localhost"を省略したい

検索でここに辿り着いた方へ、無理です。

## 理由

MySQLでは user_name が user_name@'%' に展開されるように決まってるからだそうです。残念。

## 参考

How to change default host in mysql command? - Stack Overflow
http://stackoverflow.com/questions/18718749/how-to-change-default-host-in-mysql-command/18718966?noredirect=1#18718966
MySQLでランキングを取得する際のwhereにcaseを用いてみた。

備忘録。
case文便利っす。

http://ameblo.jp/wataru420/entry-11132562539.html
ここを見て、whereにも使えるのではないかと思いやってみた。

こんなテーブルに、

```sql
CREATE TABLE `user_score` (
  `userId` int(10) unsigned NOT NULL COMMENT 'ユーザーID',
  `pointTotal` bigint(20) unsigned NOT NULL COMMENT '累計獲得pt',
  `winCountTotal` int(10) unsigned NOT NULL COMMENT '累計勝利数',
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

こんなデータを入れて、

```sql
insert into user_score (userId, pointTotal, winCountTotal) values
(118, 0, 22),
(342, 90795, 20),
(576, 25125, 19),
(386, 4200, 10),
(335, 200, 1),
(80, 200, 1),
(512, 190, 1),
(28, 236, 1),
(39, 250, 0);
```

で、

1. winCoutTotalで比較
1. winCountTotalが同じならpointTotalで比較
1. pointTotalも同じなら同順位

といった感じの優先順でランク付けしたいので、
こんな風に実行すると、

```sql
select userId,pointTotal, winCountTotal,
(select count(userId)+1
	from user_score b
	where case 
		when b.winCountTotal = a.winCountTotal then b.pointTotal > a.pointTotal else b.winCountTotal > a.winCountTotal end
) as rank
from user_score a
order by rank,pointTotal desc, userId;
```

こんな感じで取得できた。

|userId|pointTotal|winCountTotal|rank|
|-----:|---------:|------------:|---:|
|118|0|22|1|
|342|90795|20|2|
|576|25125|19|3|
|386|4200|10|4|
|28|236|1|5|
|335|200|1|6|
|80|200|1|6|
|512|190|1|8|
|39|250|0|9|
puffing-billy が返すレスポンスが途中で切れる時

[puffing-billy](https://github.com/oesmith/puffing-billy) を使うと Capybara を使ったインテグレーションテストで、JS が AJAX で接続する API サーバをモックすることができます。JS 用 webmock のような感じです。

しかし、大きなレスポンスを返そうとすると、データが切れてしまうことがあります。よく調べてみると、自分で `Content-Length` を設定すれば切れなくなることがわかりました。

```rb
body = 'Looooooooong text'
headers = { 'Content-Length' => body.bytesize }
proxy.stub(url).and_return(code: 200, body: body, headers: headers)
```

勝手に設定してくれると便利なんですけどね。VCR のように実際に外部 API にリクエストした結果を記録する機能があるので、自分でレスポンスを作るケースはあまり重視されてないのかもしれません。
MySQLのtinyint(1)にCakePHPでsave()すると、登録される値がおかしなことに…

調べてみればいくらでも情報は出てくるけれども、ハマった本人はたまらない経験でした。

MySQLのtinyint(1)のカラムにCakePHPのsaveメソッドで値を登録しようとすると
どうにも正しく値が登録されない。
save()メソッド直前までデータをダンプして追い続けたけど、値自体は正しく渡ってきている。
（tinyint(1)ならunsignedじゃなくても127まではいけるはずなのにな…）

……(・・?

どうやらCakePHPのsave()メソッドはtinyint(1)はbooleanとして扱うようです。

ググればいくらでも情報は出てきたのですが、既存で使用されているカラムの型が原因なんて思いつかず...orz

回避策は以下の2つかと。
・tinyint(1)やめる
・query()メソッドで直接SQL発行

普通にやるなら上ですかね?
setValue()とsetValueAtTime()をまとめる

After EffectsスクリプトExtendScriptでsetValue()とsetValueAtTime()が分かれてるのがめんどうなので一つに。

```coffeescript:setValueAtSmart.coffee
# キーフレームがすでに打たれているかの確認し場合によって値を実際に入れてゆく
Property::setValueAtSmart = (time, newValue) ->
  # プロパティがhiddenの場合に判別する手段がないため,tryで包む
  try
    if @numKeys is 0
      @setValue newValue
    else
      @setValueAtTime time, newValue
  catch err
    alert err
```


一応コンパイルしたのも

```js:setValueAtSmart.js
// キーフレームがすでに打たれているかの確認し場合によって値を実際に入れてゆく
Property.prototype.setValueAtSmart = function(time, newValue) {
  var err;
  try {
    if (this.numKeys === 0) {
      return this.setValue(newValue);
    } else {
      return this.setValueAtTime(time, newValue);
    }
  } catch (_error) {
    err = _error;
  }
};
```
go で override

以下の構成で thirdparty の型をオーバーライドしたいとき。

```shell-session
$GOPATH
└── src
    ├── main.go
    └── thirdparty
        └── a.go

2 directories, 2 files
```

```go:a.go
package thirdparty

import (
	"log"
)

type A struct {
	Pub string
	pri string
}

func (a A) Print() {
	log.Println(a.Pub, a.pri)
}

func (a A) Func() {
	log.Println("function called")
}

func NewA() A {
	a := A{"Public", "Private"}
	return a
}
```

この Type を拡張したい。
Print() は振る舞いを変えたい。

```go:main.go
package main

import (
	"log"
	"thirdparty"
)

type Wrap struct {
	thirdparty.A
}

func (w Wrap) Print() {
	log.Println(w.Pub)
	// log.Println(w.pri) // w.pri undefined
}

func main() {
	a := thirdparty.NewA()
	a.Print()
	w := Wrap{a}
	w.Func()
	w.Print()
}
```

これで Print() のオーバーライドになる。
A.pri にはアクセスできない点は変わらない。


あと、前に別記事で書いたけど、 w.A で埋め込んだ型にアクセスできる点と
http://golang.org/ref/spec#Struct_types この辺を気をつければいいかと。
ユーザコントロールの規定イベント

ユーザコントロールをフォームに配置してダブルクリックすると、Loadイベントをハンドルしたコードの編集画面になります。
これを、好きなイベントにする方法を紹介します。

## 実装例
ユーザコントロール内のボタン（ 名前:MyButton ）をクリックしたら、MyClick というイベントが発生するようにします。
この MyClick イベントが発生した時の処理を、既定のイベントにします。


```vbnet:MyUserControl.vb
Imports System.ComponentModel
 
<DefaultEvent("MyClick")> _
Public Class MyUserControl
    Public Event MyClick( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs)
 
    Private Sub MyButton_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) _
            Handles MyButton.Click
             
        RaiseEvent MyClick(sender, e)
    End Sub
End Class
```

引用元 : [工夫三幸堂 技術部](http://tec.kufu3kodo.info/post/60832832398/tips-vb-net-defaultevent)
Railsでajax:successのイベントがとれなかった


rails 3.2.13
jquery-rails 3.0.4

Rails 3系で簡単に非同期ボタン実装しようとするとこんな感じに出来て便利。

```erb
= link_to 'hogehoge', hogehoge_path, remote: true, id: 'hogehoge_link'
```

## 完了時に何か処理をしたくてイベントをとりたいとき

ajax:successというイベントが使える。

詳しくは、[Github rails/jquery-ujs Custom events fired during "data-remote" ](https://github.com/rails/jquery-ujs/wiki/ajax)を参照のこと

```coffeescript
$ ->
  $('#hogehoge_link').on('ajax:success', (event, data, status)->
    $(@).text('done!!')
  )
```

便利便利。

## ところが、ある日動かなくなって

ajax:completeはとれるので、statusみたら、"parseerror"吐いてた。

Railsのアクションで

```ruby
class HogeController < ApplicationController
  def hogehoge
     # do hogehoge
    render nothing: true, status: 200
  end
end
```

みたいなことしてた。
nothing: trueだとなんも出ないんで、"parseerror"になって、HTTP statusが200じゃなくてもajax:successがfireされないっぽい。ハマった。

```ruby
def hogehoge
  render json: @hoge, status: 200
end
```

とかにすれば動いたね。なかなか気づくのに苦労したのでメモしておく。
Vimで、HTMLの中身でバリデーターを変える

#言い訳#
最近の案件はIE7がほとんど淘汰されてIE8以上になりましたが、まだまだHTML5にはいけませんね。
会社ではHTML4.01 Strictを原則使用するポリシーになっていますが、一方でスマホ向け案件ではHTML5+CSS3が使い放題で色々と迷います。

HTML 4.01StrictにはAnother HTML Lintを使っていますが、こいつはHTML5に対応してくれていません。
一方、[有志](https://github.com/hokaccha/vim-html5validator)がHTML5のバリデータを叩いてくれるものを作ってくれているので、自動判別するようにしました。

といっても、HTML5独特の`DOCTYPE HTML` を検索してるだけです。

ちなみにBufWritePostで連動してるため、保存したらすぐにチェックされます。
需要があるかはわかりませんが。

##注意##

* Windowsベースで使ってるので、適当にパス等は変えて下さい。
* NeoBundle使わないやり方は適当になんとかしてください

```vim:vimrc
"vimrc上部
NeoBundle 'https://github.com/hokaccha/vim-html5validator.git'

"下のほう
au! BufWritePost *.html call TypeHTML()

function! TypeHTML()
  let html = search('<!DOCTYPE HTML>')
  if (html<1)
    "for XHTML
    autocmd! BufWritePost <buffer> :silent make
  else
    "for HTML5
    au! BufWritePost *.html :HTML5Validate
  endif
endfunction
```


```vim:$vim/compiler/htmllint.vim
if exists("current_compiler")
  finish
endif
let current_compiler = "htmllint"

if exists(":CompilerSet") != 2		" older Vim always used :setlocal
  command -nargs=* CompilerSet setlocal <args>
endif

CompilerSet makeprg=perl\ c:\htmllint.sjis\htmllint\ %
CompilerSet errorformat=%f(%l):%m
```
OSXからSSHでリモートサーバーにログインしてる時は背景色を変更する

この前、さくらのVPSにいれたはずのアプリが入ってなかったのでインストールからやり直してたら何かおかしい。何がおかしいかしばらく考えてたら「これ、リモートじゃなくてローカルじゃないですかーー！！！」と悲しい思いをしたので、もうそんなことを無くすために対策を考えました。

## SSH にログインしてる時は背景色をかえる。

というわけで「背景色を変えとけば多分気づくだろ。」という初めに思いついた対策を講じてみることにします。

`~/bin` をPATHの先頭に追加した状態で

```bash:~/bin/ssh
set_bg () {
  osascript -e "tell application \"Terminal\" to set background color of window 1 to $1"
}

on_exit () {
  set_bg "{65535, 65535,65535,65535}"
}
trap on_exit EXIT

case $HOSTNAME in
  production1|production2|production3) set_bg "{45000, 0, 0, 50000}" ;;
  *) set_bg "{45000, 55000, 60000, 50000}" ;;
esac

/usr/bin/ssh "$@"
```

しとくとOK. 

基本背景色は白でリモートサーバー上は青っぽいのになってます。

## 参考

osx - How do I make the apple terminal window auto change colour scheme when I ssh to a specific server - Stack Overflow
http://stackoverflow.com/questions/157959/how-do-i-make-the-apple-terminal-window-auto-change-colour-scheme-when-i-ssh-to
1枚の画像から複数アンカー

こんなのあるんですね、ちょっと便利

1枚の画像から複数のアンカーを設定する方法。

```html
<img src="img1.jpg" alt="IMG1" usemap="#map1">
<map name="map1">
<area shape="rect" coords="171,29,389,65" href="リンク先１" alt="link1">
<area shape="rect" coords="62,112,233,148" href="リンク先2" alt="link2" target="_blank">
</map>
```

参考：<a href="http://www.tagindex.com/html_tag/img/img_map.html">http://www.tagindex.com/html_tag/img/img_map.html</a>
AWSのSNSからiOSにpush送った


メモ。
applicationは事前に登録していた。

```ruby:
require 'aws-sdk'
device_token = 'your device token'
aws_access_key = 'your aws access key'
aws_secret_key = 'your aws secret key'
region = 'your aws region'
application_arn = 'your application arn'

AWS.config(
  access_key_id: aws_access_key,
  secret_access_key: aws_secret_key,
  region: region
)

sns = AWS::SNS.new
client = sns.client
response = client.create_endpoint(
  platform_application_arn: application_arn,
  token: device_token
)
endpoint_arn = response[:endpoint_arn]
client.publish(target_arn: endpoint_arn, message: 'hogehoge')
```
Macのターミナルでcalcを使う

以下を ./bashrc とか ./bash_profile とかに書いておく。

```
$ calc(){ awk "BEGIN{ print $* }" ;}
```

保存して再ログインしたら、以下のようにターミナルで簡単な計算が出来る。

```
$ calc 11*11
121
```
routes.rb でnew アクションに複数ステップ持たせたい時はnew methodでDRYする。

例えばオーダーをnewする際に複数ステップにわけたい時に(Wizard形式っていうんですね)

```
GET  /order/new/step1
POST /order/new/step1
POST /order/new/step2
POST /order/new/step3
POST /order/new/confirm
```

としたい場合に

```rb
resources :orders, only: [:create, :show] do
  new do
    match 'step1', via: [:get, :post]
    post 'step2'
    post 'step3'
    post 'confirm'
  end
end
```

とすることでURLを作成できる。

http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Resources.html#method-i-new
階層構造のGmailのラベルを作る

とあるメールシステムからGmailから移行した際にラベルの階層構造がうまく反映されなかったので調べてみました。

#Gmailのラベルの構造
階層構造は「/」で区切ることで表現されています。
なので例えば、「階層1」のラベルの下位ラベルとして「階層2」を作成した場合、実際は

```
「階層1」
「階層1/階層2」

```

という2つのラベルが作られていることになります。

ちなみに「階層1」のラベルがない場合は、「階層1/階層2」という一つのラベルとして扱われます。

#GoogleAppsScriptのサンプル

わざわざ書くまでもないですが。。。

```
function myFunction(){
  GmailApp.createLabel("階層1");
  GmailApp.createLabel("階層1/階層2");
}

```
これで階層1の下位ラベルとして階層2のラベルが作成されます。
なお、既に同名のラベルがある場合、ラベルは作成されず、特にエラーも返さず普通にスルーされます。

ちなみに、APIを通さなくても「階層1/階層2」のラベルがある状態で、GmailのUIから「階層1」のラベルを作れば、
自動的に階層2のラベルは階層1の下位ラベルになります。
TeraTerm接続マクロ


TeraTermからUnix系サーバーに接続するためのマクロ。
ttlファイルに記述するとダブルクリックのみで接続可能。

```接続マクロ.ttl
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
username = 'ユーザー名'
hostname = 'ホスト名'
passwdfile = 'パスワードファイル'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwdkey = username
strconcat passwdkey '@'
strconcat passwdkey hostname
getpassword passwdfile passwdkey password

msg = hostname
strconcat msg ':22 /ssh /auth=password /user='
strconcat msg username
strconcat msg ' /passwd='
strconcat msg password

connect msg
```

```鍵を使う接続マクロ.ttl
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
username = 'ユーザー名'
hostname = 'ホスト名'
passwdfile = 'パスワードファイル'
keyfile = '鍵があるパス'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

msg = 'Enter password for user '
strconcat msg username
passwdkey = username
strconcat passwdkey '@'
strconcat passwdkey hostname
getpassword passwdfile passwdkey password

msg = hostname
strconcat msg ':22 /ssh /auth=publickey /user='
strconcat msg username
strconcat msg ' /keyfile='
strconcat msg keyfile
strconcat msg ' /passwd='
strconcat msg password

connect msg
```
エラーコードの値で処理を振り分ける方法

## 準備
あらかじめどこか(APPID_Error.phpあたり)でグローバル定数でエラーコードを定義しておく。

```php:Sample_Error.php
define('E_HOGE_ERROR', 1234);
```

## エラー発生側
```php
   return Ethna::raiseError("ほげほげエラーです。", E_HOGE_ERROR);
```

## エラー受け取り側
Ethna_Error#getCode()でエラーコードを取得できる。

```php
$ret = doSomething();

if (Ethna::isError($ret)) {
    if ($ret->getCode()　＝＝＝　E_HOGE_ERROR) {
        // ほげエラーの場合
    } else {
        // それ以外のエラーの場合
    }
}
```
node.js　ファイル一覧を取得する

メモ。
以下は、カレントディレクトリから拡張子csvのファイル一覧を取得するスニペット

```js
var fs = require('fs');
fs.readdir('.', function(err, files){
	if (err) throw err;
	var fileList = [];
	files.filter(function(file){
		return fs.statSync(file).isFile() && /.*\.csv$/.test(file); //絞り込み
	}).forEach(function (file) {
		fileList.push(file);
	});
	console.log(fileList);
});
```

コメント欄にて教えてもらった方法で再掲。

```js
var fs = require('fs');
fs.readdir('.', function(err, files){
	if (err) throw err;
	var fileList = files.filter(function(file){
		return fs.statSync(file).isFile() && /.*\.csv$/.test(file); //絞り込み
	})
	console.log(fileList);
});
```
mutt

# 参考

* [日本語公式サイト(pdf)](http://www.emaillab.org/mutt/linuxjapan.html)
* [keybind](http://www.emaillab.org/mutt/1.4/doc/manual_ja-2.html)
* [FAQ](http://mutt-j.sourceforge.jp/pukiwiki/index.php?MuttFaq)
* [日本語環境の設定方法 - Version 0.6.3](http://www.emaillab.org/mutt/1.5/doc/usage-japanese.ja.html)
* [config/muttrc at master · vikke/config](https://github.com/vikke/config/blob/master/.mutt/muttrc)


# 起動方法

```bash:mailフォルダを指定して起動
$ mutt -f ~/Maildir/
```

```bash:mboxファイルを指定して起動
sudo mutt -f /var/spool/mail/user1
```

## キーバインド

* z pagedown
* Z pageup
* l (エル) フィルタリング開始
* l~F フィルタリング(重要フラグのついたメッセージのみ)
* D フィルタリング対象に削除フラグをつける
* ^ 先頭にジャンプ
* = 先頭にジャンプ
* * 最後にジャンプ

## 設定

```bash:.muttrc
set mbox_type=Maildir
set spoolfile="~/Maildir"
#set folder="~/Mail"
set folder="~/Maildir"  #閲覧専用のため、~/Mail/ を作りたくなかった。
set mbox="+mbox"
set postponed="+postponed"
set record="+outbox"
set tmpdir="~/Maildir/tmp"
set header_cache = ~/Maildir/.hcache
set rfc2047_parameters=yes # 添付ファイルを日本語にデコード

# 色付け
#color normal green default
color hdrdefault cyan default
color header yellow default ^(From|Subject):
color quoted cyan default
color signature red default
color attachment blue default
color body magenta default "(ftp|http)://[^ ]+" # point out URLs
color body magenta default [-a-z_0-9.]+@[-a-z_0-9.]+ # e-mail addresses
color search black yellow # how to hilite search patterns in the pager

# thread表示 (^P, ^N で移動ができるようになる。)
folder-hook . 'set sort=threads'
```
node-easymockの環境設定

# node-easymockとは
* http://codehum.com/stream/46030/
* WebApiの返り値を自身のPC上にサーバを立て、指定することが出来ます。

# 用途
* クライアント - サーバ開発でクライアントを先行する場合
* クライアント内でサーバからの返り値を利用したテストの作成
* json形式も対応

# 手順
1. cloneします

```git clone https://github.com/CyberAgent/node-easymock.git```
2. node-easymockディレクトリ内で下記コマンドを実行します

```npm install -g easymock```
3. ダミーデータの作成
node-easymockディレクトリ内にusers-get.jsonを作成
4. easymockの実行
```easymock```
5.動作確認
ブラウザで以下にアクセス
```http://localhost:3000/users```

# ハマった点
* nodeが0.10では動作せず、0.9を入れたら動作した。
２つ配列の要素集合が等しいか判定する

PHPには配列演算子というものがあり、２つの配列を比較することができます。

http://php.net/manual/ja/language.operators.array.php

しかしこの配列演算子（==)はキーの値も比較するので、集合として等しいかどうか判定したい場合には使えません。

```php:==演算子
$a = array( 'apple', 'banana', 'cake' );
$b = array( 'cake', 'banana', 'apple' );

echo ($a == $b) ? 'TRUE' : 'FALSE' . PHP_EOL;
```
```php：実行結果
FALSE
```
switch文は==比較なので、やはりcase文でヒットしません（する人もいないと思いますが）。

array_xxx系の関数を調べましたが、そのような目的で使用できる関数はなさそうです。
（あったら教えて下さい！）

そこで、２つの集合が等しいかどうか、キー関係なく判定する関数を作ってみました。

```php:２つの集合が等しいかどうか、キー関係なく判定する関数

<?php:array_equal_set
function array_equal_set( $a, $b )
{
	$diff_a_to_b = array_diff($a, $b);
	$diff_b_to_a = array_diff($b, $a);
	return empty($diff_a_to_b) && empty($diff_b_to_a);
}

$test_cases = array(
		/* 0 */ array( 'A', 'B', 'C' ),
		/* 1 */ array( 'A', 'C', 'B' ),
		/* 2 */ array( 'B', 'A', 'C' ),
		/* 3 */ array( 'B', 'C', 'A' ),
		/* 4 */ array( 'C', 'A', 'B' ),
		/* 5 */ array( 'C', 'B', 'A' ),
		/* 6 */ array( 'A', 'B', 'C', 'D' ),
		/* 7 */ array( 'A', 'B', 'D' ),
		/* 8 */ array( 'A', 'B', 'B' ),
		/* 9 */ array( 'A', 'B' ),
		/* 10 */ array( 'A', 'B', 'C', 'B' ),
	);

// test
$data = array( 'A', 'B', 'C' );
foreach( $test_cases as $key => $test ){
	$result = array_equal_set( $test, $data ) ? 'TRUE' : 'FALSE';
	echo "[$key]$result" . PHP_EOL;
}
```
```php：実行結果
[0]TRUE
[1]TRUE
[2]TRUE
[3]TRUE
[4]TRUE
[5]TRUE
[6]FALSE
[7]FALSE
[8]FALSE
[9]FALSE
[10]TRUE
```

　中身の処理は２つの集合の差分をarray_diffで取得し、それがA集合⇒B集合の差分、B集合⇒A集合の差分ともに空集合であることを確認しています。

　ですので、

( 'A', 'B', 'C', 'B' ) = ( 'A', 'B', 'C' )

　も真（TRUE）と判定されます。
　もちろん、２つの集合の値の順序はばらばらでも真（TRUE）と判定されます（テストケースでは[0]～[5]）。

　具体的には、クライアントから送信されるフォームの値が、本当に必要なキーを含んでいるかチェックする場合などに使えると思います。
facebookページのカバー写真をAPIで変更する方法

# AccessTokenの取得

まずは、facebookページをAPIから操作するためのAccessTokenを取得する。

## AccessTokenの取得方法

facebookページの管理権限を持っているアカウントで、```manage_page```のPermissionを付与した状態でOAuth認証を行う。

その上で、```/me/accounts```というAPIにアクセスすると、自分が管理権限を持っているfacebookページの情報が取得でき、その中にAccessTokenが含まれている。

```json
{
  "data": [
    {
      "category": "Producer",
      "name": "Sample",
      "access_token": "xxxxxxxx...",
      "perms": [
        "ADMINISTER",
        "EDIT_PROFILE",
        "CREATE_CONTENT",
        "MODERATE_CONTENT",
        "CREATE_ADS",
        "BASIC_ADMIN"
      ],
      "id": "111..."
    }
  ]
}
```

# cover写真の変更方法

cover写真の変更APIは、```/{page_id}```にPOST通信し、```cover```というパラメータにPhotoIDを渡すというもの。

直接写真をアップロードするのではなく、一度Facebook上に写真をアップし割り振られたPhotoIDを渡さないといけない、という。ああ、めんどくさい。

そのため、まずは写真アップロードAPIでページ上に写真をアップしなければいけないのだが、そうするとカバー写真にしようとしている写真が一度タイムラインに載ってしまい、ネタバレしてしまう。

facebookは一応そういったケースを想定したのかしていないのか、非公開で写真をアップする方法を提供してくれていた。

# 非公開で写真をアップロードする方法

写真アップロードは```/{page_id}/photos```にPOST通信で行うことができる。
この時、```published```というパラメータに```false```を渡すと、非公開で写真をアップロードすることができる。

```
POST https://graph.facebook.com/{page_id}/photos?
        access_token={page_access_token}&
        source={photo data}&
        published=false
```

アップロードに成功すると、PhotoIDがレスポンスで返ってくる。

```json
{
    "id": "111..."
}
```

facebookページのタイムラインやアルバムを見てみても、写真自体は存在していない。
あくまでも非公開で投稿し、PhotoIDを割り振ってもらった状態。

# 実際にCover写真を変更してみる

PhotoIDが取得できれば、後はカバー写真変更APIにこの値を渡してあげるだけである。

```
POST https://graph.facebook.com/{page_id}?
        access_token={page_access_token}&
        cover={photo_id}
```

成功すると、```true```とだけレスポンスが返ってくる。（いい加減JSONで統一してくれ）

他にも、

* カバー写真のy軸の位置を調整できる```offset_y```
* タイムラインにカバー写真を変更したということを載せるかどうかの```no_feed_story```

というパラメータがある。

# 参考ページ

https://developers.facebook.com/docs/reference/api/page/
謎のエラー

`2013-08-27 15:16:25.253 MacVim[3233:407]
Warning - conversion from 64 bit to 32 bit integral value requested within NSPortCoder,
but the 64 bit value 9223372036854775807 cannot be represented by a 32 bit value`
MacVimを使って日本語入力したらというエラーログがでたので、Google日本語入力からことえりに戻したらエラーが出なくなった
mrubyで簡単にグラフィカル＆インタラクティブなアプリケーションが作れるRubyKokuban

mrubyを使って簡単にインタラクティブなアプリが作れます。以下は文字と円を書くプログラムです。

```ruby
def draw
  text 'Hello, rubykokuban!', 100, 100
  circle 350, 100, 50
end
```

実行結果です。

![hello-demo](https://raw.github.com/ongaeshi/rubykokuban-gem/data/images/demo-01.png)

シューティングゲームも作れます。

![mouse-shooting](https://raw.github.com/ongaeshi/rubykokuban-sample/master/images/mouse_shooting.png)

サンプルコードは[こちら](https://github.com/ongaeshi/rubykokuban-sample)です。

[[続きを読む]](http://ongaeshi.hatenablog.com/entry/rubykokuban-release)
vagrantのprovisionerを自作する

vagrantのfabric provisionerを自作してみたので開発手順を書いておきます。
[hnakamur/vagrant-fabric-provisioner](https://github.com/hnakamur/vagrant-fabric-provisioner)

試行錯誤しながら作ったので、もっとよい方法があるかもしれません。その場合はぜひご指摘お願いします。

## ひな形作成

gemの名前を指定してbundle gemを実行します。

```shell-session
$ bundle gem vagrant-fabric-provisioner
      create  vagrant-fabric-provisioner/Gemfile
      create  vagrant-fabric-provisioner/Rakefile
      create  vagrant-fabric-provisioner/LICENSE.txt
      create  vagrant-fabric-provisioner/README.md
      create  vagrant-fabric-provisioner/.gitignore
      create  vagrant-fabric-provisioner/vagrant-fabric-provisioner.gemspec
      create  vagrant-fabric-provisioner/lib/vagrant/fabric/provisioner.rb
      create  vagrant-fabric-provisioner/lib/vagrant/fabric/provisioner/version.rb
```

vagrant-fabric-provisioner/lib/vagrant/fabric/provisioner.rb
を
vagrant-fabric-provisioner/lib/vagrant-fabric-provisioner.rb
に、
vagrant-fabric-provisioner/lib/vagrant/fabric/provisioner/
を
vagrant-fabric-provisioner/lib/vagrant-fabric-provisioner/
にリネームします。これをしないとプラグインが実行されませんでした。

## 実装

ビルトインのprovisionerのソース
https://github.com/mitchellh/vagrant/tree/master/plugins/provisioners
と
親クラス
https://github.com/mitchellh/vagrant/tree/master/lib/vagrant/plugin/v2
のソースを参照しつつ、実装します。

## プラグインのgemのビルド

gemspecファイルを指定してgem buildを実行します。

```shell-session
$ gem build vagrant-fabric-provisioner.gemspec 
WARNING:  description and summary are identical
  Successfully built RubyGem
  Name: vagrant-fabric-provisioner
  Version: 0.0.2
  File: vagrant-fabric-provisioner-0.0.2.gem
```

## プラグインのgemのインストール

```shell-session
$ vagrant plugin install vagrant-fabric-provisioner-0.0.2.gem 
Installing the 'vagrant-fabric-provisioner-0.0.2.gem' plugin. This can take a few minutes...
Installed the plugin 'vagrant-fabric-provisioner (0.0.2)'!
```

## プロビジョン実行

Vagrantfileには予め自分のprovisionerを実行するように設定しておきます。例えばvagrant-fabric-provisionerの場合はこんな感じです。

```Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos6.4"
  config.vm.network :private_network, ip: "192.168.33.28"
  config.vm.provision :fabric do |s|
    #s.uses_dynamic_port = true
    #s.args = ['-D', '--colorize-errors', '-H', '127.0.0.1', 'show_hostname']
    s.uses_dynamic_port = false
    s.args = ['-D', '--colorize-errors', '-H', '192.168.33.28', 'show_hostname']
  end
end
```

対象のVMは予め予めvagrant upで起動しておきます。

Vagrantfileのあるディレクトリで以下のコマンドを実行すればprovisionが走ります。

```shell-provision
$ vagrant provision
```

## 試行錯誤

プラグインは~/.vagrant.d/gems/gems/以下にインストールされています。
この例では~/.vagrant.d/gems/gems/vagrant-fabric-provisioner-0.0.2/です。
このディレクトリ内のprovisionerのrubyソース（この例ではlib/vagrant-fabric-provisioner/provisioner.rb）を編集して、```vagrant provision```を実行すれば編集した内容で実行できました。
Google Apps Scriptでスクレイピングする方法


##Google Apps Scriptとは？

以下の記事見ながら触ってみるとなんとなくわかります。

- [無料でCron！Google Apps Scriptで時間を指定してURLをリクエスト。 | きじとら](http://kijtra.com/article/cron-by-google-apps-script)



##正規表現を使えばスクレイピングできる

以下の記事見て、うおーっと思ったけどなんか違った。

- [Google DocsでWebスクレイピング:Logic+Idea](http://kaniku.seesaa.net/article/212479636.html)

できないのかなーと色々試してたらできた。

```コード.gs
function myFunction() {
  var response = UrlFetchApp.fetch("http://qiita.com");

  var myRegexp = /<title>([\s\S]*?)<\/title>/i;
  var match = myRegexp.exec(response.getContentText());
  var title = match[1];

  title = title.replace(/(^\s+)|(\s+$)/g, "");
  Logger.log(title);
}
```

ログの出力

```
[13-09-10 00:00:49:130 JST] Qiita [キータ] - プログラマの技術情報共有サービス
```

- [javascript - Google Apps Script Regex exec() returning null - Stack Overflow](http://stackoverflow.com/questions/16961953/google-apps-script-regex-exec-returning-null)
- [googleのtitleを取得するプログラム（正規表現） - Hexaの日記](http://d.hatena.ne.jp/Hexa/20060610/1149954511)
- [PHPでWEBページのタイトルを抜き出すサンプル [C!]](http://creazy.net/2008/05/php_get_page_title_sample.html)
- [複数行にマッチさせる正規表現 | You Look Too Cool](http://stabucky.com/wp/archives/4334)
- [Javascript で trim するには - Enjoi Blog](http://blog.enjoitech.jp/article/180)




##Googleの検索結果を出してみる

```コード.gs
function myFunction() {
  var response = UrlFetchApp.fetch("http://www.google.co.jp/search?q=qiita");

  var myRegexp = /<h3 class=\"r\">([\s\S]*?)<\/h3>/gi;
  var elems = response.getContentText().match(myRegexp);
  for(var i in elems) {
    var title = elems[i]
    title = title.replace(/(^\s+)|(\s+$)/g, "");
    title = title.replace(/<\/?[^>]+>/gi, "");
    Logger.log(title);
  }
}
```

ログの出力

```
[13-09-10 00:08:56:438 JST] Qiita [キータ] - プログラマの技術情報共有サービス
[13-09-10 00:08:56:439 JST] Qiita APIドキュメント
[13-09-10 00:08:56:439 JST] タグ一覧
[13-09-10 00:08:56:439 JST] The Official Qiita Blog
[13-09-10 00:08:56:439 JST] Qiita:Career
[13-09-10 00:08:56:440 JST] Qiitaについて
[13-09-10 00:08:56:440 JST] Qiita:Team
[13-09-10 00:08:56:440 JST] キータ (Qiita) on Twitter
[13-09-10 00:08:56:440 JST] Qiita(キータ) | Facebook
[13-09-10 00:08:56:441 JST] 「Qiita」とそのビジネスとは - SD Japan | (株)スタートアップ・デイティング
[13-09-10 00:08:56:441 JST] ニュースリリース: プログラマのための技術情報共有サイト「Qiita(キータ ...
[13-09-10 00:08:56:441 JST] Qiita 2-day Hackathon | PeaTiX
[13-09-10 00:08:56:442 JST] Qiita AWS Tools Hackathon | PeaTiX
```

- [ダブルクォーテーションのreplaceの方法 - JavaScript - 教えて！goo](http://oshiete.goo.ne.jp/qa/342029.html)
- [片鱗懐古のブログ: Rhinoのフィルタ演算は正規表現じゃなくても良かった](http://pieceofnostalgy.blogspot.jp/2011/03/rhino_13.html)
- [HTMLタグを除去 - Tatsuya Wiki](https://sites.google.com/site/tatsuyafukata/pg/javascript/remove-html-tag)
- [[JavaScript]String.matchとRegExp.execと後方参照 - chalcedonyの外部記憶装置・出張版](http://d.hatena.ne.jp/chalcedony_htn/20090315/1237121111)

##感想

これで定期的にサイトをチェックして特定のキーワードがあったらメールするとかのプログラムが簡単に書けそう。
Audacityを使ってWAVEファイルの音量を下げる

音声編集ソフト Audacity を使って wav の音量を下げる方法を解説します。


まず音量を下げたいwavファイルを開いて

`[Edit]->[Select]->[All]`

で音声ファイルの全体を選択します。
Ctrl + A で選択しても構いません。

次に[Effect]->[Amplify]を選択して "Amplification (dB)" の値を下げます。
[File]->[Export As Wav] で適当なファイル名をつけて出力すれば作業は完了です。
MSYSでコピー&貼りつけを行う

紙に保存してたのが出てきたので貼っておきます。
--

コマンドやアドレスをコピーして貼りつけたいことはよくあるのでしょうから、MSYSをでコピーと貼付けを行えるように設定します。

まず、msys.bat で MSYS Shell を開いて、タイトルバーを右クリックして[プロパティ]を選択してください。

プロパティ内部の[簡易編集モード]にチェックを付ければコピー&ペーストが使えるようになります。

操作方法は以下のようになっています。

コピー:文字列を選択して右クリック
貼りつけ:選択せずに右クリック

コピーするために右クリックしてもメニューは出ませんので注意してください。右クリックした時点でクリップボードにテキストがコピーされます。「貼付け」も何も選択せずに右クリックした時点でメニューが出ずにすぐに貼り付けが行われます。
MinGWをMSYSで使う

紙に保存してたのが出てきたので貼っておきます。

--

MSYSは"Minimal SYStem" の略でWindowsのコマンドプロンプト(cmd.exe)の代わりのMinGWを使うために最適のCUI環境です。

インストール画面でMSYS Basic System と MinGW Developer ToolKit にチェックを入れます。 ついでに C++ も使いたいので C++ のコンパイラにもチェックを入れます。 他にも使いたのがあればチェックを入れておいてください。

■ MinGW Compiler Suite
┣☑ C Compiler
┣☑ C++ Compiler
┣☐ Fortran Compiler
┣☐ ObjC Compiler
┗☐ Ada Compiler
☑ MSYS Basic System
☑ MinGW Developer ToolKit

MSYSをインストールしてれば
C:\MinGW\msys\1.0\msys.bat
にMSYS Shell を起動するためのバッチファイルが置かれてますので、起動してください。

起動したら
"gcc --version"
と打ってgccが動くかどうか確認しておいてください。

TIps: 簡易編集モードをオンにしてコピー&ペーストをできるようにしておいたほうが便利です。
Ansible のテンプレート(Jinja2)で部分的にテンプレート処理を無効にする

Ansible の template エンジンには [Jinja2](http://jinja.pocoo.org/docs/) が使われています。
template ファイル内にテンプレートの制御用文字列が含まれる場合があります、例えば次のような場合、 `{%` が制御の開始タグと解釈されるためエラーとなります。 Qiita Markdown では jinja の syntax lightlight にも対応してるんですね！！色分けされてダメっぽい感じがわかりますね。

```jinja:httpd.conf.j2
LogFormat "\
host:%h\t\
time:%{%Y-%m-%d %H:%M:%S}t\t\
method:%m\t\
uri:%U%q\t\
protocol:%H\t\
status:%>s\t\
referer:%{Referer}i\t\
user-agent:%{User-Agent}i\t\
size:%b\t\
vhost:%v\t\
usec:%D" ltsv

```
ここはそのまま出力したいので `{% raw %}`, `{% endraw %}` で囲みます。

```jinja:httpd.conf.j2
{% raw %}
LogFormat "\
host:%h\t\
time:%{%Y-%m-%d %H:%M:%S}t\t\
method:%m\t\
uri:%U%q\t\
protocol:%H\t\
status:%>s\t\
referer:%{Referer}i\t\
user-agent:%{User-Agent}i\t\
size:%b\t\
vhost:%v\t\
usec:%D" ltsv
{% endraw %}
```
Ansible の YAML で「:」を使う方法

Ansible で YAML ファイルの中で値の部分にコロンを入れると Syntax Error でコケます。
例えば `/etc/sudoers` を `lineinfile` モジュールで書き換えようとして `NOPASSWD:` という文字列を入れちゃうとエラーになります。バックスラッシュではエスケープできませんでした。

```
ERROR: Syntax Error while loading YAML script, ...
Note: The error may actually appear before this position: line 1, column 63
```

これを回避する方法、それはコロンを変数に入れること...

```:group_vars/all
colon: ':'
```

```yaml:NG
- lineinfile: >
    regexp='^%wheel'
    line='%wheel ALL=(ALL) NOPASSWD: ALL'
    dest=/etc/sudoers
```

```yaml:OK
- lineinfile: >
    regexp='^%wheel'
    line='%wheel ALL=(ALL) NOPASSWD{{colon}} ALL'
    dest=/etc/sudoers
```

あ、でもこの例(sudoers)の場合は `/etc/sudoers.d/` にファイルを置く方法にするのが良いと思います。
tmux でマトリックスっぽいスクリーンセーバーを表示する

tmux 上で一定時間操作しないとこんな感じになります。
画像だと分かりづらいですが文字もちゃんと動きます。

![tmux-screensaver.png](https://qiita-image-store.s3.amazonaws.com/0/10548/d50148c7-6a39-e22b-252c-7d52ad8208a2.png)

# cmatrix をインストール

まずは、`cmatrix` コマンドをインストールします。

- [CMatrix by Chris Allegretta](http://www.asty.org/cmatrix/)

Mac の場合

```
$ brew install cmatrix
```

# tmux の設定

以下の設定を `.tmux.conf` に追加して下さい。

```tmux:~/.tmux.conf
# Screensaver
set -g lock-after-time 600
set -g lock-command "cmatrix -s -b"
```

スクリーンセーバーからの復帰は、任意のキーを入力するだけです。

`lock-after-time` はロックまでの時間(秒)です。
適当に変更して下さい。

`lock-command`  に設定したコマンドは `tmux lock` コマンド時などにも使用されます。
`tmux lock` でマニュアルでスクリーンセーバーを起動することもできます。
(デフォルト値は `lock -np` です)

コマンドが存在しなくてもエラーが出たりはしないようです。
Mac で xz を使用する方法


Macではデフォルトで`xz`コマンドを使用できないため、下記の設定が必要となる。

## 環境
- OS: Mountain Lion
- Homebrew 0.9.4

## 使用方法

### xz のインストール
以下のコマンドを実行する。

```bash
$ brew install xz
```

### xz の実行
`xz --help`を実行すると、コマンド使用方法と、コマンドオプションが表示される。

``` bash
$ xz --help
Usage: xz [OPTION]... [FILE]...
Compress or decompress FILEs in the .xz format.

  -z, --compress      force compression
  -d, --decompress    force decompression
  -t, --test          test compressed file integrity
  -l, --list          list information about .xz files
  -k, --keep          keep (don't delete) input files
  -f, --force         force overwrite of output file and (de)compress links
  -c, --stdout        write to standard output and don't delete input files
  -0 ... -9           compression preset; default is 6; take compressor *and*
                      decompressor memory usage into account before using 7-9!
  -e, --extreme       try to improve compression ratio by using more CPU time;
                      does not affect decompressor memory requirements
  -q, --quiet         suppress warnings; specify twice to suppress errors too
  -v, --verbose       be verbose; specify twice for even more verbose
  -h, --help          display this short help and exit
  -H, --long-help     display the long help (lists also the advanced options)
  -V, --version       display the version number and exit
```

#### 圧縮

``` bash
$ xz -z hoge
$ xz --compress hoge
```

#### 解凍
``` bash
$ xz -d hoge.xz
$ xz --decompress hoge.xz
```

`unxz`コマンドも使用可能。

```bash
$ unxz hoge.xz
```
tsumiki.c

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord13blocktup/

他の解答例はこちら
http://qiita.com/Nabetani/items/936e7885f4c607472060

方針は、下から一列ずつ横に見ていって、水の溜まる窪みのマス目をカウントする方法です。
壁から壁までの窪みを変数`c`でカウント。
壁までたどり着いたら、変数`r`に`c`を足します。
これを繰り返して、溜まった水のマス目を求めます。

基本のアルゴリズムはこれだけなのですが、底に穴が空いているときは水が溜まらないように処理を追加する必要があります。

そこで穴が空いているかいないかを示す変数`b`を用意。
穴あり`0`、なし`1`になるように以下のように処理。`h`が高さで一回でも`h=0`だと`b=0`になります。
`b &= ( h != 0 );`
あとは、`c`を`r`に足す際に、以下のようにすれば、穴ありなら水は溜まりません。
`r += c*b;`

```c
#include <stdio.h>
#include <stdlib.h>

int solve(const char *s)
{
	int r = 0, i, j, h = 0, c = 0, b = 0;
	for( i=1; i<9; i++, b=0, c=0 ) {
		for( j=0; s[j]!='\0'; j++ ) {
			h = s[j]-'0';
			if( h > i ) {
				r += c*b;
				c = 0;
				b = 1; 
			} else {
				c++;
				b &= ( h != 0 );
			}
		}
	}
	return r;
}

void test(const char *s, const char *a)
{
	const int r = solve(s);
	printf("%d\t%s\n", r, (atoi(a)==r) ? "ok": "****NG****");
}

int main()
{
/*0*/ test( "83141310145169154671122", "24" );    
/*1*/ test( "923111128", "45" );    
/*2*/ test( "923101128", "1" );    
/*3*/ test( "903111128", "9" );    
/*4*/ test( "3", "0" );    
/*5*/ test( "31", "0" );    
/*6*/ test( "412", "1" );    
/*7*/ test( "3124", "3" );    
/*8*/ test( "11111", "0" );    
/*9*/ test( "222111", "0" );    
/*10*/ test( "335544", "0" );    
/*11*/ test( "1223455321", "0" );    
/*12*/ test( "000", "0" );    
/*13*/ test( "000100020003121", "1" );    
/*14*/ test( "1213141516171819181716151413121", "56" );    
/*15*/ test( "712131415161718191817161514131216", "117" );    
/*16*/ test( "712131405161718191817161514031216", "64" );    
/*17*/ test( "03205301204342100", "1" );    
/*18*/ test( "0912830485711120342", "18" );    
/*19*/ test( "1113241120998943327631001", "20" );    
/*20*/ test( "7688167781598943035023813337019904732", "41" );    
/*21*/ test( "2032075902729233234129146823006063388", "79" );    
/*22*/ test( "8323636570846582397534533", "44" );    
/*23*/ test( "2142555257761672319599209190604843", "41" );    
/*24*/ test( "06424633785085474133925235", "51" );    
/*25*/ test( "503144400846933212134", "21" );    
/*26*/ test( "1204706243676306476295999864", "21" );    
/*27*/ test( "050527640248767717738306306596466224", "29" );    
/*28*/ test( "5926294098216193922825", "65" );    
/*29*/ test( "655589141599534035", "29" );    
/*30*/ test( "7411279689677738", "34" );    
/*31*/ test( "268131111165754619136819109839402", "102" );
	return 0;
}
```