OmniAICreator/Qiita-1.07M huggingface dataset:
__new__とか__init__とかを再整理

前に投稿した[記事](http://qiita.com/kou_tana77/items/f869f4f7c2e99e0bae47)が、調べては継ぎ足しを繰り返した内容だったので、少し整理して、＋αする。
（現時点でまだ理解が足りないところもあるかも）

# クラスオブジェクトとインスタンスオブジェクト

クラス絡みのオブジェクトとして、クラスオブジェクトとインスタンスオブジェクトがあり、クラス定義の終了の時点でクラスオブジェクトができる。
少しくどいけど、インスタンス生成しなくても、クラス定義を書くだけで、クラスオブジェクトができる。
１つのクラス定義に対して、クラスオブジェクトは１つだけ存在し、インスタンスオブジェクトは生成したインスタンスの数だけ存在する。

```py
class sampleCls(object):
	print "chkpnt10"		#ここはクラス定義を書いただけで実行される
	vr1 = 111
	def __new__(cls):		#__new__はインスタンス生成時に呼び出される
							#__new__が呼び出された時はインスタンスは生成されていない
							#(__new_で_インスタンスを生成する(メモリ確保する))
		print "chkpnt20"
		cls.vr2 = 222		#clsはインスタンスオブジェクトではなくクラスオブジェクト
		return super(sampleCls, cls).__new__(cls)
							#ここで復帰値として返している内容(生成している内容)が

	def __init__(self):		#__init__はインスタンス生成時に呼び出される
		print "chkpnt30"
		self.vr3 = 333		#selfはインスタンスオブジェクト
```

上記のクラスを定義しただけで、クラスオブジェクトができる(クラス定義に書かれたコードが実行される)。
インスタンスを生成すると、``__new__``、``__init__``の順で呼び出される。

``__new__``、``__init__``のそれぞれの役割は次の通り。

# &#x5f;_new__
インスタンスを生成する時に、クラスをカスタマイズするためのもの。
オーバーライドしなければ、定義されているクラスの内容でインスタンスが生成される。

# &#x5f;_init__
インスタンスを初期設定するためのもの。
&#x5f;_new__の復帰値で返されたオブジェクトに引数で指定された内容等で初期化する。

上記のようにクラスを定義すると、インスタンスを生成する度に、``cls.vr2 = 222``のコードが動く。
実際にはこのようなコードは書かないと思うけど、少し気持ち悪い。

定義したクラスのクラスオブジェクトが１つしか存在しないことを利用すると、シングルトンが実装できる。

# シングルトンのサンプル

以前、投稿した[記事](http://qiita.com/kou_tana77/items/a4fbd7c93cbbbac10ecc)のコードを再掲する。

```py
def get_sheet_data(shtnam, toprow, keyclm, lftclm, rgtclm):
    row = toprow
    while Cell(shtnam, row, keyclm).value != None:
        row += 1
    if row > toprow:
        return CellRange(shtnam, (toprow, lftclm), (row - 1, rgtclm))
    else:
        return []
```

このコードはDataNitroを使って、excelシートからデータを取得する関数。
この関数の復帰値は取得したデータをリストで返している。
このままだと行数とかカラム位置とかを計算して、特定のセルの値を参照することになるので、行とカラムを指定して該当のセルを取得するように下記のコードを書いた。

```py
class SheetData():
    def __init__(self, shtnam, toprow, keyclm, lftclm, rgtclm):
        self.data = get_sheet_data(shtnam, toprow, keyclm, lftclm, rgtclm)
        self.clmcnt = rgtclm - lftclm + 1
        print "SheetData(): __init__()"

    def getRecordCount(self):
        return len(self.data) / self.clmcnt

    def get(self, rowidx, clmidx):
        return self.data[rowidx * self.clmcnt + clmidx]
```

前置きが長くなったけど、次が実装したシングルトン(サンプル)。

```py
class CategoryStructure(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "__instance__"):
            cls.__instance__ = super(CategoryStructure, cls).__new__(cls, *args, **kwargs)
            cls._data = SheetData(u"カテゴリ構成", 3, 2, 2, 5)
        return cls.__instance__

    def getRecordCount(self):
        return self._data.getRecordCount()

    def get(self, rowidx, clmidx):
        return self._data.get(rowidx, clmidx)
```

&#x5f;_new__の第一引数がクラスオブジェクト(クラス定義に対して１つだけ存在する)であることを利用して、クラスオブジェクトに__instance__が存在しない場合のみインスタンスを生成して、生成したインスタンスを__instance__に設定する。
この時、シートからデータを取得して_dataに入れておく。
&#x5f;_instance__が存在する場合は、__instance__に設定されている内容を復帰値として返す。

更に、このクラスを継承してシングルトンを実装するためにはもう一工夫必要。
SwiftでNSUserDefaultsを使ったデータの永続化のメモ


アプリを停止させてもずっと保持しておきたい場合は、NSUserDefaultsを使うとそうしたデータを簡単に保持できます。
使い方としてはNSUserDefaultsを取得して、取得したNSUserDefaultsに対してデータを保存したり取り出したりすることでデータ保持を行います。
少ないレコード数を扱う場合に便利です。
web開発でいうクッキーくらいの扱いだといいのかな。

大量のデータを扱う場合にはこちらのCoreDataを使うのがおすすめ。
http://qiita.com/yukihamada/items/61ab1299d99fabdb9469

サンプル
========
~~~swift
var uid = NSUserDefaults.standardUserDefaults().stringForKey("uid")
    
if(uid){
    println("uid:"+uid)
}else{
    // uidを端末に記録
    NSUserDefaults.standardUserDefaults().setObject("値",forKey:"uid")
}
デフォルトの tintcolor を変更する


ボタンやテキストなど、いろんなところで出てくる tintcolor, 
青以外を使いたい時が出てきますが、毎回設定するのが面倒。。一括で設定できるところがないかと探してたら見つけました。

# global tint 
StoryBoard の Global Tint を変更すればいいらしい。

![Screen Shot 2014-06-27 at 7.40.47.png](https://qiita-image-store.s3.amazonaws.com/0/27210/ff5af460-9f4f-0a0d-81e2-cdd8f6bd87c2.png "Screen Shot 2014-06-27 at 7.40.47.png")

例えばオレンジに変更すると、

![Screen Shot 2014-06-27 at 7.44.32.png](https://qiita-image-store.s3.amazonaws.com/0/27210/6ecc2e3d-69b5-4bd7-7d30-213c2a73714a.png "Screen Shot 2014-06-27 at 7.44.32.png")

このように変更されます。

![Screen Shot 2014-06-27 at 7.44.47.png](https://qiita-image-store.s3.amazonaws.com/0/27210/e3b4b287-a145-e945-7af2-769a196b768d.png "Screen Shot 2014-06-27 at 7.44.47.png")
Unity C# JSONObjectを使って簡単なJSON文字列をパースする


### 配布元
http://wiki.unity3d.com/index.php?title=JSONObject#Download

上記URLでダウンロードしたフォルダを
Assets/Plugins 以下に配置する。

```c#
using UnityEngine;

public class Sample : MonoBehaviour {

    string msg = "{\"hoge\":\"DUMMY\",\"foo\":123,\"moge\":true}";

    void Start () {

        JSONObject json = new JSONObject(msg);

        string hoge = json.GetField("hoge").str;
        float foo = json.GetField("foo").n;
        bool moge = json.GetField("moge").b;

        Debug.Log(hoge); // DUMMY
        Debug.Log(foo); // 123
        Debug.Log(moge); // true
    }
}

```
Railsの書き方を向上させるとか自動化とか云々

なんだか知らないけど色々考えることが増えてきてしまい、残念なことになりつつあるWeb開発界隈。そろそろ「如何に書かないか」みたいな話に移行しなければ、と思っている。
使用するツール/サービスが増えるにつれ、クソみたいな独自仕様を沢山押し付けられてしまい、結果として初期学習コストが殆どになっていてやばい。
新しい仕様を理解することが仕事、みたいなことになりつつある。

Railsのnginx+unicorn設定みたいな話、一回しかやらないからといって全然自動化/簡略化されない。おおよそ全てのRailsエンジニアがこのへんの何かしらに嵌ったことがあると思うし、こんなにもみんなが通る道がなぜこんなにも整備されていないのか不思議。

こういう話は山ほどあって、うらみつらみを沢山書きたい。

あと、自動化の話。
沢山自動化してるとなんかメカメカしくて格好良いからやるけども、
CIを設定してHubot作ってついでにAWSの料金を毎日教えてくれるようにする…とかやってるだけで日が暮れてしまう。
自動化はエンジニアの美徳であることは正しいが、そもそも先に仕事を終わらせるべきであり、自動化はその後でも良い場合が多い。
性質がエンジニア的だと、往々にして自動化マニアみたいな感じになりがちで辛い。

そして残念な事実があり、自動化したいと思うことの7割は自動化してもうまみがあまりない。

色んな技術があって面白いのだけど、一つの事実があって、常にエンジニアリングは間違っていることを肝に銘じたい。
「創る」の類いの言葉は正しいけど、「エンジニアリング」は本来不要であるべきことだ。
エンジニアはエンジニアリングが不要な世界を目指さなければならない。

もっと素朴で良いと思う。
YAGNI
boot2docker + NFS + nsenter = yungsang/boot2docker

[docker - nsinit が上手く行かなくて困っていたら nsenter があまりにもあっさりだった件 - Qiita](http://qiita.com/yungsang/items/915f7c2ae6ccb239d5ee)
は、かなり恥ずかしいエントリになってしまいましたが、気を取り直して、昨日の成果をまとめて活かしたいと思います。

- `yungsang/boot2docker` に `nsenter` を標準搭載
- `nsenter` を簡単に使う為のスクリプト `docker-enter` も付属

以下がお試しする為の `Vagrantfile` になります。

```ruby:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "yungsang/boot2docker"

  config.vm.box_version = ">= 1.0.3"

  config.vm.provision :docker do |d|
    d.pull_images "yungsang/busybox"
    d.run "simple-echo",
      image: "yungsang/busybox",
      args: "-p 8080:8080",
      cmd: "nc -p 8080 -l -l -e echo hello world!"
  end

  config.vm.network :forwarded_port, guest: 8080, host: 8080
end
```

上記の `Vagrantfile` を保存して、`boot2docker` を起動します。

```
$ vagrant up
$ export DOCKER_HOST="tcp://localhost:2375"
$ docker ps -l
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS                    NAMES
5680c4535af4        yungsang/busybox:latest   nc -p 8080 -l -l -e    21 seconds ago      Up 18 seconds       0.0.0.0:8080->8080/tcp   simple-echo
$ nc localhost
hello world!
```

`hello world!` をエコーするだけのコンテナが立ち上がりました。

`boot2docker` に ssh して、`docker-enter` を使ってコンテナにログインしてみます。

```
$ vagrant ssh
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
boot2docker: 1.0.1
             nfs+nsenter : abe1fc0 - Thu Jun 26 05:52:00 UTC 2014
docker@boot2docker:~$ docker-enter
Usage: docker-enter <container id/name> [{command:-/bin/sh} [argments...]]
docker@boot2docker:~$ docker-enter $(docker ps -l -q)
nsenter --target 958 --mount --uts --ipc --net --pid --
# ps
PID   USER     COMMAND
    1 root     nc -p 8080 -l -l -e echo hello world!
   11 root     sh
   12 root     ps
# exit
docker@boot2docker:~$ exit
$ 
```

### ちなみに
`vagrant ssh -c` を使えばローカルマシンからもログインできちゃいます！

```bash
$ vagrant ssh -c 'docker-enter $(docker ps -l -q)'
nsenter --target 958 --mount --uts --ipc --net --pid --
# ps
PID   USER     COMMAND
    1 root     nc -p 8080 -l -l -e echo hello world!
    9 root     sh
   10 root     ps
# exit
$ 
```
テキストファイル(二次元配列)読み込み

```java
public static int[][] Fileimport(String adress){

		/* adress = 読み込みたいテキストファイルがある場所。
		 */

		//配列[ノード番号][ノードの要素]の配列を準備
		int Index[][] = new int[325557][];

		//ファイルの読み込み
		try{
			//ファイルのアドレスよりbrにファイルの情報を格納
			FileReader filereader = new FileReader(adress);
			BufferedReader br = new BufferedReader(filereader);

			//一行ずつ読み込んで
			String str = br.readLine();
			int count = 0;

			while(str != null){
				//strlist.add(str.split(","));
				//一行の内容を','で分割してそれぞれを[count=ノード番号]の２次元目の配列の要素として格納
				Index[count] = parseInts(str.split(","));
				//次の行を読み込み
				str = br.readLine();
				count++;
			}

			br.close();

		}catch(FileNotFoundException e){
  			System.out.println(e);
		}catch(IOException e){
			System.out.println(e);
		}

		return Index;

	}
public static int[] parseInts(String[] s){

		/* s[] = intに変換したいストリングを収めた配列
		 */

		int[] x = new int[s.length];
		for(int i = 0; i < s.length; i++){
			x[i] = Integer.parseInt(s[i]);
		}
		return x;
	}
ChatworkAPIでmessageをPOSTしてみる。


さっき書いた記事ではAPI経由でChatworkのチャットグループを取得しました。
今回はチャットグループに投稿してみたいと思います。
[ChatworkAPIにexpressからrequestモジュールで接続 - Qiita](http://go.shr.lc/1rDlXS4)


##チャットワークAPIで投稿
###サンプルリクエスト

```
curl -X POST -H "X-ChatWorkToken: YOUR API KEY" -d "body=Hello+ChatWork%21" "https://api.chatwork.com/v1/rooms/{room_id}/messages"
```

今回はPOSTですが、[前回](http://go.shr.lc/1rDlXS4)のGETと同じくAPIにはヘッダーにAPI KEY(token)を付けます。

前回の内容でチャット毎のroom_idが分かったと思うので、それをメモしておきましょう。

##前回のコードを修正&書き足してチャットワークにPOST(投稿)
requestモジュールを使います。expressは4系です。

`routes/post.js`を作りましょう。room_idとAPIキーを適宜変更して下さい。

```routes/post.js
var express = require('express');
var router = express.Router();
var request = require('request');

router.get('/', function(req, res){
	var tweet = 'こんばんわ〜';
	var room_id = 投稿したいチャットルームのid;
	var options = {
		url: 'https://api.chatwork.com/v1/rooms/'+room_id+'/messages',
		headers: {
			'X-ChatWorkToken': 'YOUR API KEY'
		},
		form: { body: tweet },
		json: true
	};

	request.post(options, function (error, response, body) {
		if (!error && response.statusCode == 200) {
			res.render('post', body);
		}else{
			console.log('error: '+ response.statusCode);
		}
	});
});

module.exports = router;
```

urlルーティング設定のためにapp.jsも書き換えます

```app.js
#８行目付近
var routes = require('./routes/index');
var users = require('./routes/users');
var post = require('./routes/post'); //←追加

#25行目付近
app.use('/', routes);
app.use('/users', users);
app.use('/post', post); //←追加
```

今回はチャットルームに投稿したメッセージidを表示させます。

```index.ejs
<!DOCTYPE html>
<html>
  <head>
    <title>Postてすと</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
  	postメッセージid: 
  	<%= message_id %>
  </body>
</html>
```

これでブラウザから`localhost:3000/post`にアクセスすると、チャットワークに`眠い`と投稿されます。

ブラウザ上にはpostされたメッセージのidが表示され、
![](http://i.gyazo.com/f4e402e1541e120c7ac7f6337dcc7fdf.png)
チャットワーク上では自分のアカウントが指定したroomで眠いと言っています。
![](http://i.gyazo.com/f78b716c07ad0055df2b48160df1cb9d.png)

こんな感じでメッセージ投稿まで出来ました! めでたし!

参考: [Node.js: request モジュールを使って POST リクエストを行う - Sarabande.jp](http://go.shr.lc/UMYDGw)
JSとCSS太りすぎてるのでデトックスしたい

デトックスしたい。

>デトックス (detox) とは、体内に溜まった毒物を排出させることである。 この呼び名は "detoxification"、解毒の短縮形である。
[http://ja.wikipedia.org/wiki/デトックス][1]
[1]: http://ja.wikipedia.org/wiki/%E3%83%87%E3%83%88%E3%83%83%E3%82%AF%E3%82%B9

何をデトックスするかというと、JSとCSS.
JSとCSSに頼りすぎていて、あまりにも太ってきています。
直近5年でサイズ推移のグラフ作ったら年率1.5倍ほど成長しているでしょう。

JSはjQueryだけで簡単に100KBいくし、お流行りになられたBootstrapさんはCSSだけで123KB.
合計で~220KBほどいきます。

ところで、ここに193KBのWebPがありますが、これは2448×3264のiPhoneで撮った写真です。
https://dl.dropboxusercontent.com/u/7817937/photo1.raw.q70.webp

2448x3264の画像が、193KB
で、jQueryとBootstrapを合わせれば、~220KB.

**iPhoneで撮った生写真より、CSSとJSのほうが重いのは絶対おかしい**

最近、JSとCSSが太ってるのが普通になってきてるので、この辺に関する感覚が麻痺しています。

また、ついでにいえば、CSSとJSはページロードで毎回パースさせているわけだから、電池を無駄に消費させてます。
ふつうの範囲ならいいです。でも、9割方使ってないjQueryやBootstrapをまるまるロードするのは、電池泥棒といってもいい蛮行でしょう。

また、重いページはユーザを待たせている意識を持ちたいです。
ページのスピードに関しては、コードや開発フローに現れにくいこともあり、あまり重要視されることがありません。
ですが、遅いページはウェイターのなかなか来ないレストランと同じです。
遅いのはそれ自体がバグ、といってもいいでしょう。

こんな感じで、よくよく考えると、CSSとJSはおおよそユーザのやりたいこととは関係がないですから、完全なオーバヘッドです。

というわけで色々捨てることにしました。

色々捨てるとブラウザ互換性について気の病む感じになりますが、そもそも~IE9を考えなければほぼ全て同じ動きをします。
そして、今現在~IE9でも動くようにサービスを作っている奇特な人は稀でしょう。
というわけで、Normalize.cssも不要です。捨てましょう。

（pixel単位でデザインが一致しなければ納得出来ない人はそもそもWebデザインに向いてないので、DTPに行った方が良いです。）

というわけで、最近絶賛CSS/JS解雇中。

Angular重すぎるので使いたくないです。
jQueryは大分前に辞めました。Zepto使ってますが解雇予定。
最低限は欲しいのでtinyquery.js(https://github.com/kaiinui/tinyquery.js )を書いて使っています。（あまりにもminimalすぎるのでいろいろ足す予定）
Normalize.cssも上記の通り外しました。

むしろ考えることが少なくなってスッキリとします。
いうほどjQuery必要な操作してないことに気付きます。

余分な装飾は常に悪です。
**すぐクラッシュする虚弱なAndroidブラウザちゃんにも優しい。**

ところで自前スクロールに一言言いたい
---

TwitterとGmailの自前スクロールクソ過ぎる。
いきなり異常なスピードで下にスクロールしたりする。
しかもすぐクラッシュする。特にTwitter！！！お前は！！
頼むからおとなしくoverflow:scroll;-webkit-overflow-scrolling:touch;使ってほしい。

あとクライアントMVCは
---

せめてCompressed 40KB代になって欲しい。
このままだと重過ぎて、GmailとかのAppCache使うような重度のSPAでしか割に合わない感ある。
処理重すぎるので、メインスレッドをブロックしないWeb Workerで動くようにもしたい。

宗教上の理由によりgzipped 14KB以上のJS/CSSを扱えないので死活問題です。

References
---

http://www.zingdesign.com/5-reasons-not-to-use-twitter-bootstrap/
Arrooow(iOSゲーム)のソルバーを作成する

iPhoneアプリの[Arrooow](https://itunes.apple.com/us/app/arrooow/id882165285?mt=8)を自動で解くプログラムを作成する。
全40ステージに対して、各ステージ平均0.6秒で解くことが出来た。
作成したプログラムは[ここ (github)](https://github.com/fbessho/ArrooowSolver/)

# Arrooowとは？
![screen568x568.jpeg](https://qiita-image-store.s3.amazonaws.com/0/43154/233d84ea-ed5f-c51a-3cb1-a21058fb13c6.jpeg)
5x5の矢印が並んでいて、矢印をタップすると、その矢印を先頭にして指す先の矢印が順に消えていく。
ただし、最低2つ以上の矢印が消えなければならない。すべての矢印を消したらステージクリア。

# なぜやるのか
![arrooow_description.png](https://qiita-image-store.s3.amazonaws.com/0/43154/27c56dd9-cfdd-652d-6a67-54b0aeebb888.png)

AppStoreの説明によれば、

> too hard for the human race...

らしい。人間にできないのなら機械にやってもらうしかない。。

# 実装
単純なdfsで実装。計算量が$25!!$程度になる気もするが、意外と1s以内にちゃんと終わる。
githubにアップロードした。(https://github.com/fbessho/ArrooowSolver/)

```java
public class Solver
{
    public List<Integer> solve(Board board)
    {
        if (board.isSolved())
            return FastList.newList();

        for (int i = 0; i < 25; i++) {
            if (board.tappable(i)) {
                List<Integer> tapSequence = solve(board.tap(i));
                if (tapSequence != null) {
                    FastList<Integer> ans = FastList.newListWith(i);
                    ans.addAll(tapSequence);
                    return ans;
                }
            }
        }

        // unsolved
        return null;
    }
}
```

# 実験例
ステージ25（下図）を解いてみる。
![stage25.png](https://qiita-image-store.s3.amazonaws.com/0/43154/d653a39c-aeb6-00ed-8875-b1bc8a53d5ff.png)


argsにボード情報を入力(上、下、右、左をそれぞれt, b, r, lで表して全行を一列に並べている）。
![intellij_args.png](https://qiita-image-store.s3.amazonaws.com/0/43154/195649d1-a176-6078-77da-84f1b295726a.png)

実行結果。
![intellij_output.png](https://qiita-image-store.s3.amazonaws.com/0/43154/cf674f00-b7c4-e27a-0648-963a5464b901.png)


結果通りのマスをタップする。最上（下）段がrow=1(5)、最左（右）列がcolumn=1(5)となる。
解けた。
![cleared.png](https://qiita-image-store.s3.amazonaws.com/0/43154/8e443c43-3883-fd5e-03e0-b7d6d2044a76.png)

# 統計
Arrooowに入っていた全40ステージを解いてみる。
Stage 5だけ探索が続き、20秒以上かかったが、その他のステージでは0.2秒未満で探索が終了している。

```bash
----- Summary -----
Max: 20436ms
Min: 484μs
Ave: 525ms

Stage  1: 38.35 ms
Stage  2: 3.354 ms
Stage  3: 6.901 ms
Stage  4: 6.122 ms
Stage  5: 20.44 s
Stage  6: 1.150 ms
Stage  7: 1.391 ms
Stage  8: 1.010 ms
Stage  9: 1.031 ms
Stage 10: 1.423 ms
Stage 11: 1.368 ms
Stage 12: 2.237 ms
Stage 13: 5.031 ms
Stage 14: 1.726 ms
Stage 15: 1.464 ms
Stage 16: 987.7 μs
Stage 17: 513.4 μs
Stage 18: 1.616 ms
Stage 19: 5.323 ms
Stage 20: 25.62 ms
Stage 21: 3.364 ms
Stage 22: 2.190 ms
Stage 23: 11.07 ms
Stage 24: 2.044 ms
Stage 25: 2.191 ms
Stage 26: 1.910 ms
Stage 27: 80.72 ms
Stage 28: 766.2 μs
Stage 29: 1.197 ms
Stage 30: 484.1 μs
Stage 31: 103.2 ms
Stage 32: 1.949 ms
Stage 33: 33.97 ms
Stage 34: 2.068 ms
Stage 35: 5.251 ms
Stage 36: 1.970 ms
Stage 37: 2.361 ms
Stage 38: 3.066 ms
Stage 39: 125.4 ms
Stage 40: 90.62 ms
```

# 展望
1. 25個の矢印をランダムに作成して解けるかどうかを判定すれば、無限（？）に問題を作成できる。
2. bfsにして最適解を求めたほうがいい？
GAE/Pでurlfetchのunittestを書く方法



以下コピペ

http://stackoverflow.com/questions/9943996/how-to-mock-ndb-get-context-urlfetch

```python
import unittest
from google.appengine.ext import testbed, ndb
from mock import patch, Mock

class MyTestCase(unittest.TestCase):

    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_urlfetch_stub()

        # mock urlrfetch service
        uf = self.testbed.get_stub('urlfetch')
        uf._Dynamic_Fetch = Mock()

    @patch('google.appengine.api.urlfetch.urlfetch_service_pb.URLFetchResponse')
    def test_make_request(self, URLFetchResponse):
        # mocking rpc response object
        response = URLFetchResponse.return_value
        response.contentwastruncated.return_value = False
        response.statuscode.return_value = 200
        response.content.return_value = 'Hello world!'        

        ctx = ndb.get_context()
        fut = ctx.urlfetch('http://google.com')
        result = fut.get_result()

        self.assertEquals(result.content, 'Hello world!')

    def tearDown(self):
        self.testbed.deactivate()
```
Swiftでデバッグマクロっぽいライブラリを作った

Objective-Cを使ったiOSアプリ開発では、C言語のプリプロセッサ命令を使って、`NSLog`を`#ifdef DEBUG`で囲むデバッグマクロのテクニックがよく利用されていました。

```
#ifdef DEBUG
    #define LOG(...)         NSLog(__VA_ARGS__)
    #define LOG_METHOD       NSLog(@"%s line %d", __func__, __LINE__)
    #define LOG_OBJECT(obj)  NSLog(@"%s=%@", #obj, obj);
#else
    #define LOG(...)
    #define LOG_METHOD
    #define LOG_OBJECT(obj)
#endif
```

Swiftでは残念ながら、C言語ほどの複雑なマクロを実装する機能はなく、
唯一できるのは、 **コマンドラインフラグ** を使って、簡単な`#if`を使う方法です。

```
OTHER_SWIFT_FLAGS = -D DEBUG
```

```
func LOG(body: String) {
#if DEBUG
    NSLog(body)
#endif
}
```

Swiftでも`__FUNCTION__`や`__LINE__`といったリテラルは健在なので、
上記Cマクロの`LOG`や`LOG_METHOD`は割りと簡単に実装できます。

が、`LOG_OBJECT`のような、「#を使った文字列化(stringification)」をコンパイル時に行うことは難しいので、これをランタイム時に<del>無理やり</del>処理してみた、というのが今回作ったライブラリの主な趣旨です。


## 今回作ったライブラリ

- https://github.com/inamiy/DebugLog


まだ、いろいろバグが多いですが、

```
LOG()

LOG("Hello World!")

LOG_OBJECT(self.window)
LOG_OBJECT(AppDelegate.self)

let int: Integer = 3
LOG_OBJECT(int)

let float: Float = 3.0
LOG_OBJECT(float)

let rect: CGRect = CGRect(x: 10, y: 20, width: 30, height: 40)
LOG_OBJECT(rect)

let range: Range = 1..3
LOG_OBJECT(range)

let nsRange: NSRange = NSMakeRange(2, 4)
LOG_OBJECT(nsRange)

let optional: Int? = nil
LOG_OBJECT(optional)
```

と実行すると、

```
[AppDelegate.application(_:didFinishLaunchingWithOptions:):43] 
[AppDelegate:45] Hello World!
[AppDelegate:47] self.window = <UIWindow: 0xb50ab50; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0xb50b3c0>; layer = <UIWindowLayer: 0xb50adc0>>
[AppDelegate:48] AppDelegate.self = DebugLogDemo.AppDelegate
[AppDelegate:51] int = 3
[AppDelegate:54] float = 3.0
[AppDelegate:57] rect = (10.0,20.0,30.0,40.0)
[AppDelegate:60] range = (1..3)
[AppDelegate:63] nsRange = (2,4)
[AppDelegate:66] optional = nil
```

といった感じに出力してくれます。

`println("mySuperDuperView = \(mySuperDuperView)")`を毎回書きたくない人に便利だと思うので、ぜひ使ってみてください。
Adobe Bridgeで選択したファイルをApplescriptで包んだJavascriptで外部アプリに渡す

```AppleScript:2ImageOptim.script
tell application "Adobe Bridge CC"
	do javascript "var myList = app.document.selections;for(var i=0; i<myList.length; i++){myList[i].openWith('/Applications/ImageOptim.app');}"
end tell
```

FastScriptから実行したかったので、do javascriptでくるんでみた。

<del>Automatorで単機能APPを作って渡せば問題なく処理できます。
ex. イメージのタイプを変更.appに複数渡しても大丈夫。</del>
だめ。一度に渡せるのは一つだけ。
Webサービスを作成するにあたり利用したツール・サービス

Webサービスを作成するにあたり利用したツール・サービス
====================

[Friends Map](http://friends-map.net/), [Export Youtube](http://export-youtube.xyz/)を作成する際に、利用したツールやサービスをメモしておく。
新しいサービスを作成する際に利用できるはず。

ツール
--------------------

### [OptiPNG](http://optipng.sourceforge.net/)

```sh:
sudo yum install -y optipng

optipng the_large_image.png
```

### [jpegoptim](https://github.com/tjko/jpegoptim)

```sh:
sudo yum install -y jpegoptim

jpegoptim the_large_image.jpg
```

### Apache Module

御三家を利用。

* mod_deflate : リソースをgzip圧縮
* mod_expires : ブラウザキャッシュ
* mod_rewrite : CakePHPを利用したので必然的に。


サービス
--------------------

### [お名前.com](http://www.onamae.com/)

ドメイン取得に利用。
**xyz**というドメインが150円と非常に安かった。


### 各種Webマスターツール

* <a href="https://www.google.com/webmasters/tools">Google Webmaster Tools</a>
* <a href="https://www.bing.com/webmaster/">Bing - Web マスター ツール</a>

使い方はまだしっかり理解できていないが、
クロール対象とするために登録した。

### [Google Analytics](https://www.google.com/analytics/)

Webサイトへのアクセス数やアクセス元都道府県、端末、アクセス先ページなどを把握できる。


### <a href="http://developers.google.com/speed/pagespeed/insights/">PageSpeed Insights</a>

Webサイトの読み込み時間を計測し、最適化案を提示してくれる。


### [Github](https://github.com/)

ソースコードのバージョン管理のために利用。
編集途中の内容を取り消したい場合に便利。


### <a href="http://www.ninja.co.jp/">忍者ツールズ</a>

**<a href="http://omatome.shinobi.jp/">忍者おまとめボタン</a>**機能を利用して、<a href="https://twitter.com/">**Twitter**</a>や<a href="https://facebook.com">**Facebook**</a>のシェアボタンを一括追加出来る。
管理ページより、それぞれのボタンがクリックされた回数を確認することも可能。


### <a href="http://form.fc2.com/">FC2メールフォーム</a>

メールフォームを簡単に作成できる。
スクリプトタグを埋め込むことで、既存のページにフォームを設置可能。
送信ボタン押下も**ajax**で動く。



### <a href="http://www.favikon.com/">favikon</a>

favicon作成ツール。

1. jpg、gif、png等のファイルをアップロードする。
1. 編集が可能。 リサイズなども出来る。
1. ダウンロード時は **ico** ファイルとしてダウンロードできる。



### <a href="http://responsive.is">Responsive.is</a>

PC、タブレット、スマートフォンのそれぞれのスクリーンサイズでWebページの表示を確認できる。



### [ ERMaster ](http://ermaster.sourceforge.net/index_ja.html)

**ER図の作図時**に最適。
無料で利用可能。

#### ライセンス

* [Apache License 2.0](http://ja.wikipedia.org/wiki/Apache_License)

#### インストール手順

* http://ermaster.sourceforge.net/index_ja.html


### [ ChatWork ](http://www.chatwork.com/ja/)

* **全社員の連絡用**に利用。

#### 制限

**フリープラン**では、以下の様な制限がある。

* グループチャットを **14** 個までしか作成できない
* 添付ファイルが **500MB** までしか保存出来ない
* **チャットの横断検索** が出来ない

**３つ目の制限が大きい。**
_Redmineを利用していても、プロジェクトを横断したチケット、ニュース、Wiki一括検索機能が協力で活用している。_
Deep Belief SDK サンプルで嵌った点


Deep Belief SDK というライブラリを知ったので早速サンプルを動かしたところ、少しハマったので備忘録として記す。
https://github.com/jetpacapp/DeepBeliefSDK


これは、スマホやタブレット、RaspberryPiのような非力なCPUでニューラルネットワークによる学習を試せる代物らしい。
サンプルでは、識別したい対象とそうでない物を一定時間カメラで撮影して学習させた後、
カメラ内に対象があるかどうかを判定することができる。

* 試したサンプル：examples/LearingExample
* 開発環境：  Xcode 5.1.1
* 実行環境： iPad mini Retina　  iOS 7.1.1


■嵌った点１：起動時に例外発生
`2014-06-27 00:04:41.363 LearningExample[252:60b] Unknown class SquareCamViewController in Interface Builder file.`
 
対策：
LerningExampleターゲット の  Build Phases  > Complile Sources にて
SquareCamViewController.m 　が入っていなかったので加えた 
　
 
■嵌った点２：[Take A Picture]ボタン押下時に例外発生
`2014-06-27 00:05:57.759 LearningExample[284:60b] -[UIBarButtonItem setTitle:forState:]: unrecognized selector sent to instance 0x1781b5a80`
 
対策：
SquareCamViewController.m にて
`[sender setTitle: @"Learning" forState:UIControlStateNormal];
`
を以下のように変更
`[sender setTitle:@"Learning”];
`
　
　　
以上の対応でめでたくサンプルが動いた。

試しにビール缶を学習させてみたところ、上手く識別できて感動した。
印象としては、対象物が拡大・縮小した分にはわりと強いが、カメラを回転させると識別しづらそうな感じ。予め回転した画像も撮っておけば結果は変わるのだろうか？

肝心のAPIを眺めるのはこれから。
Marshal.loadする時の注意点

> Ruby オブジェクトをファイル(または文字列)に書き出したり、読み戻したり する機能を提供するモジュール。 
> [Ruby 2.1.0 リファレンスマニュアル | module Marshal](http://docs.ruby-lang.org/ja/2.1.0/class/Marshal.html)

それが **Marshal** です。
オブジェクトをファイルに書きだすということで、Hashを`Marshal.dump`して文字列化したものをRedisやMongoといったデータストアに保存するという使い方があるかと思います。
（世間一般ではjsonでやることのほうが多そうなイメージがありますが）

```rb:sample1.rb
hoge = {
  foo: 'bar'
}
p str = Marshal.dump(hoge) # => "\x04\b{\x06:\bfooI\"\bbar\x06:\x06ET"
# strをデータストアに入れる
p Marshal.load(str) # => {:foo=>"bar"}
```

で、この前ハマったのが以下のパターン。

```rb:set.rb
require 'redis'
require 'date'

conf = {
  # ここにはRedisの設定が記述してあります
}
redis = Redis.new(conf)
date = Date.new(1999, 2, 24)
redis.set('key', Marshal.dump(date))
```

```rb:get.rb
require 'redis'

conf = {
  # set.rbと同様のRedisの設定が記述してあります
  # 本来はちゃんと共通のmodule化してます。
}
redis = Redis.new(conf)
Marshal.load(redis.get('key'))
# => TypeError: instance of Date needs to have method `marshal_load'
```

**えっ。**

`Marshal.dump`は

* 名前のついてないオブジェクト
* システムがオブジェクトを保持するもの

などを書きだそうとするとTypeErrorを起こすとマニュアルには記載してあります。

```rb:error_example.rb
Marshal.dump(Dir.new('/')) # Dirが「システムがオブジェクトを保持するもの」に該当している
# => TypeError: no _dump_data is defined for class Dir
```

しかし`Marshal.load`のタイミングで起きるとはどういうことだ？
と、しばしハマっていました。

で、結論ですが

```rb:get.rb
require 'redis'
require 'date' # <= これ

conf = {
  # set.rbと同様のRedisの設定が記述してあります
}
redis = Redis.new(conf)
Marshal.load(redis.get('key'))
# => #<Date: 1993-02-24 ((2449043j,0s,0n),+0s,2299161j)>
```

`Marshal.load`するときに対象のオブジェクトの状態を復元するには同じ環境になっていないといけない、という感じです。（こんな表現で伝わるか不明ですが…）

他のオブジェクトであれば割と分かりやすいエラーです。

```rb:decimal_set.rb
require 'redis'
require 'bigdecimal'

conf = {
  # ここにはRedisの設定が記述してあります
}
redis = Redis.new(conf)
decimal = BigDecimal.new('0.1234')
redis.set('key', Marshal.dump(decimal))
```

```rb:decimal_get.rb
require 'redis'

conf = {
  # decimal_set.rbと同様のRedisの設定が記述してあります
}
redis = Redis.new(conf)
Marshal.load(redis.get('key'))
# => ArgumentError: undefined class/module BigDecimal
```

これなら「あ、bigdecimalをrequireし忘れてた」となるのですが、DateはrequireせずともDateってオブジェクトがいるんですよね。

```rb
p Date # => Date
```
これのせいで余計な混乱を招いた形です。

こいつがなんなのか、よく分かっていないのですが`Date.methods`してもdateライブラリのメソッドが出てこない辺り、`require 'date'`をするとDateクラスを再オープンしてるのかなー、とか想像しています。`Date.freeze`したあとに`require 'date'`やったら`RuntimeError: can't modify frozen class`になったから多分そう。

ということで、`Marshal.load`の実行時には環境を合わせましょうね、というtipsでした。
CoffeeScriptのforで降順になるのを回避

CoffeeScriptで次のようなコードを書くとする。

```coffeescript:
for i in [0..n]
  console.log i
```

これは、次のような JavaScript に変換される。

```js:
var i, _i;

for (i = _i = 0; 0 <= n ? _i <= n : _i >= n; i = 0 <= n ? ++_i : --_i) {
  console.log(i);
}
```

`0>n` のようなケースも想定して、降順のソートもカバーしてくれるのだが、
時には`0>n`のときにはループして欲しくないような状況もあるだろう。


降順にループするのを回避するためには、次のようにコードを書く。
by を使って、ループのstepを指定している。

```coffeescript:
for i in [0..n] by 1
  console.log i
```

これは、次のような JavaScript に変換される。

```js:
var i, _i;

for (i = _i = 0; _i <= n; i = _i += 1) {
  console.log(i);
}
```

これで、降順のループを回避できた。
ChatworkAPIにexpressからrequestモジュールで接続


やっと利用申請していた[チャットワークAPI](http://developer.chatwork.com/ja/index.html)の利用許可がおりました!!
ので、実際に使ってみます。

##チャットワークAPI
このAPIは自分史上初めてのタイプでheaderにtokenをセットして送信することでGETやPOSTで値を取れます。

###サンプルリクエスト
サンプルリクエストのcurlコマンドに -Hオプションでヘッダー情報を送っているのが分かります。

```
$ curl -X GET -H "X-ChatWorkToken: YOUR API KEY" "https://api.chatwork.com/v1/rooms"
```

"X-ChatWorkToken: YOUR API KEY"という形でAPI KEYを渡します。

###node.jsから接続したらconnect ECONNREFUSEDってエラー

http.request()やhttp.get()で上手く接続出来ませんでした汗
このエラーが出てたんですけど、イマイチ分からず...エモい人教えて下さい汗

参考: [Node.js v0.10.29 Manual & Documentation](http://nodejs.org/api/http.html#http_http_request_options_callback)
参考: [Node.js Error: connect ECONNREFUSED when using http.request - Stack Overflow](http://go.shr.lc/VqZ6ik)


##expressでページアクセスした際にチャット一覧を表示
###requestモジュールでとりあえず解決
デフォルトのHTTPモジュールだと上手くいかなかったのと、
[Node.jsのchatwork接続用のモジュール](https://github.com/nanopx/chatwork-api)の内部でrequestモジュールを利用していたことから、requestモジュールを使って試したら上手くいきました。


```
$ express -e chatwork
$ cd chatwork
$ npm install
$ npm install request
```

```routes/index.js
var express = require('express');
var router = express.Router();
var request = require('request');

router.get('/', function(req, res){
	var options = {
		url: 'https://api.chatwork.com/v1/rooms',
		headers: {
			'X-ChatWorkToken': 'YOUR API KEY'
		},
		json: true
	};

	request.get(options, function (error, response, body) {
		if (!error && response.statusCode == 200) {
			
			console.log(body[0]);
			res.render('index', {data:body});
		}else{
			console.log('error: '+ response.statusCode);
		}
	});
});

module.exports = router;
```

今回はチャットルーム名とチャットルームのicon画像を表示させます。

```index.ejs
<!DOCTYPE html>
<html>
  <head>
    <title>getてすと</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <ul>
    <% data.forEach(function(val){ %>
    	<li><%/*= val.room_id*/ %></li>
    	<li><%= val.name %></li>
    	<img src="<%= val.icon_path %>" alt="">
    	<br />
    <% }) %>
  </ul>
  </body>
</html>
```

localhost:3000にアクセスすると
![](http://i.gyazo.com/e32a93afdea57c593924b5d063cd3763.png)
こんな感じでリストが表示されました! めでたし!

参考: [Requestモジュール](https://github.com/mikeal/request)
参考: [Node.js: request モジュールを使って GET リクエストを行う](http://blog.sarabande.jp/post/52095868617)

いずれはhubotでChatworkBotを作るところまでやりたいです。
DBのバックアップと復元


# データベースのバックアップ
```linux
mysqldump --add-drop-database --ignore-table=DB名.テーブル名1 --ignore-table=DB名.テーブル名2 -uユーザ名 -pパスワード -hホスト名 DB名 > ファイル名.dump
```

- `--add-drop-database`：各作成ステートメントの前に`drop table`を追加
- `--ignore-table`：dumpファイルに含めたくないテーブルを指定
- `>`の右に書いた名のファイル（←パス名込み）にバックアップ内容を書き込む
- オプション変えたければ「mysqldump オプション」で検索すればOK

# データベースのリストア（復元）
```linux
cat ファイル名.dump | mysql -uユーザ名 -pパスワード -hホスト名 DB名
```
- `|`：パイプ（`cat`で覗いたファイルの中身を`|`の右の引数に渡す）

具体的に何が起きているかはdumpファイルの中身を見ればわかる。
dumpファイルはテキスト形式のSQL文になっている。
とりあえずEmacsのCaskを晒す

```el
;; -*- mode:emacs-lisp -*-

;;; License
;;
;; This is free and unencumbered software released into the public domain.
;; 
;; Anyone is free to copy, modify, publish, use, compile, sell, or
;; distribute this software, either in source code form or as a compiled
;; binary, for any purpose, commercial or non-commercial, and by any
;; means.
;; 
;; In jurisdictions that recognize copyright laws, the author or authors
;; of this software dedicate any and all copyright interest in the
;; software to the public domain. We make this dedication for the benefit
;; of the public at large and to the detriment of our heirs and
;; successors. We intend this dedication to be an overt act of
;; relinquishment in perpetuity of all present and future rights to this
;; software under copyright law.
;; 
;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
;; IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
;; OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
;; ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
;; OTHER DEALINGS IN THE SOFTWARE.
;; 
;; For more information, please refer to [http://unlicense.org]

(source gnu)
(source melpa)
(source marmalade)

(depends-on "anzu")
(depends-on "auto-install")
(depends-on "expand-region")
(depends-on "highlight-symbol")
(depends-on "multiple-cursors")
(depends-on "wgrep")
(depends-on "exec-path-from-shell")

;; Appearance
(depends-on "color-theme-tango")
;; (depends-on "color-theme-solarized")
(depends-on "rainbow-delimiters")
(depends-on "popwin")
(depends-on "yascroll")

;; Coding
(depends-on "yasnippet")
(depends-on "flycheck")

;; Git
(depends-on "magit")
(depends-on "git-gutter-fringe+")
(depends-on "git-modes" :git "https://github.com/magit/git-modes.git")

;; File
(depends-on "open-junk-file")
(depends-on "recentf-ext")

;; Key
(depends-on "sequential-command")
(depends-on "smartrep")

;; auto-complete.el
(depends-on "auto-complete")
(depends-on "ac-c-headers")
(depends-on "ac-dabbrev")

;; helm
(depends-on "helm")
(depends-on "helm-git-grep")
(depends-on "helm-gtags")
(depends-on "helm-ls-git")
(depends-on "helm-themes")

;; progmodes
(depends-on "coffee-mode")
(depends-on "haskell-mode")
(depends-on "js2-mode")
(depends-on "json-mode")
(depends-on "markdown-mode")
(depends-on "scala-mode")
(depends-on "tuareg")
(depends-on "web-mode")
(depends-on "yaml-mode")

;;; Ruby
(depends-on "ruby-mode")
(depends-on "ruby-block")
(depends-on "ruby-end")
```

解説はまた今度。
VIM Script Object Notation (vimson) grammar

vimson serializer/deserializer 作るのにまとめ中。
間違ってたら指摘頂けると助かります。

作りました https://github.com/kamichidu/cpp-lolivimson 。
src/lolivimson.hppをコピペして使ってください。

エンコーディングはutf8、文字列中の `\xYYYY` 形式は対応しない。

```bnf:grammar.bnf
<value>
    ::= <string>
      | <number>
      | <float>
      | <list>
      | <dictionary>

<string>
    ::= <double quote> <double quoted string> <double quote>
      | <single quote> <single quoted string> <single quote>

<double quoted string>
    ::= <double quoted character> <double quoted string>
      |

<single quoted string>
    ::= <single quoted character> <single quoted string>
      |

<double quoted character>
    ::= "\" <double quote>
      | "\" "\"
      | "\" "n"
      | "\" "r"
      | "\" "t"
      | <character>

<single quoted character>
    ::= <single quote> <single quote>
      | "\"
      | <character>

<number>
    ::= <decimal number>
      | <hexadecimal number>

<float>
    ::= <decimal number> "." <decimal number>

<list>
    ::= "[" <list elements> "]"

<list elements>
    ::= <list element> "," <list elements>
      |

<list element>
    ::= <value>

<dictionary>
    ::= "{" <dictionary elements> "}"

<dicrionary elements>
    ::= <dictionary element> "," <dictionary elements>
      |

<dictionary element>
    ::= <dictionary key> ":" <dictionary value>

<dictionary key>
    ::= <string>

<dictionary value>
    ::= <value>
```
縦幅をウィンドウサイズピッタリに。[入門/メモ]


```style.js
$(function() {
	$(window).load(function(){
		var window_h = $(window).innerHeight();
		$('.mainpages').css('height',window_h+'px');
		$(window).resize(function() {
			window_h = $(window).innerHeight();
			$('.mainpages').css('height',window_h+'px');
		});
	});
});
```

指定したセレクタをウィンドウ縦と同じサイズに。

```style.js
.css('height',window_h+'px');
```

の部分で記述方法がわからず詰まっていた。
Androidで簡単にレビュー促進ダイアログを出す

手前味噌ですが[Android-Rate](https://github.com/hotchemi/Android-Rate)というライブラリを使うと､2文でレーティングダイアログが出せます｡

### インストール

最新版は0.2.0です｡

```groovy
dependencies {
  compile 'com.github.hotchemi:android-rate:0.2.0'
}
```

### 設定

ダイアログを出したいActivityの`onCreate`で下記の様にメソッドチェーンで条件を繋いで行きます｡内部ではシングルトンでインスタンスを保持しています｡

- インストールからの経過日数
- 起動回数
- ｢後で評価する｣を押してから再び出すまでの経過日数
- ｢後で評価する｣を出すか

など細かい条件指定が出来ます｡ダイアログのボタン押下時のコールバックリスナーも付けれます｡

```java
AppRate.setInstallDays(0) // default 10, 0 means install day.
    .setLaunchTimes(3) // default 10
    .setRemindInterval(2) // default 1
    .setShowNeutralButton(true) // default true
    .setDebug(false) // default false
    .setOnClickButtonListener(new OnClickButtonListener() { // callback listener.
        @Override
        public void onClickButton(int which) {
            Log.d(MainActivity.class.getName(), Integer.toString(which));
        }
    })
    .monitor(this);
```

設定したら呼びたいタイミングで以下のメソッドを呼び出して下さい｡

```java
AppRate.showRateDialogIfMeetsConditions(this);
```

### イベントトラッキング

また､特定のイベントの通過回数をトラッキングする事もできます｡
上で説明した条件設定とは独立して動作しますのでご注意下さい.

```java
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  AppRate.setEventTimes(2).monitor(this);// Event通過回数が3回以上でダイアログを出現させる
}

@Override
public void onClick() {
  AppRate.passSignificantEvent(this); // イベント回数をモニタリングする｡この場合だと3回めを通過した時にダイアログを出す
}
```

更に細かい使い方は[こちら](https://github.com/hotchemi/Android-Rate/blob/master/README.ja.md)をお読み下さい:smiley:
Zend Framework 2 のイベントをデバッグツールバーに表示する

デバッグツールバーにイベントを表示させます。

まずは、次のようにデバッグツールバーを有効にします。

 - [PHP - Zend Framework2でデバッグツールバーを利用する - Qiita](http://qiita.com/sasezakit/items/87dee03c9b365c352635 "PHP - Zend Framework2でデバッグツールバーを利用する - Qiita")

`config/autoload/zenddevelopertools.local.php` を編集して下記を追記します。

```php:zenddevelopertools.local.php
<?php
return array(
    'zenddevelopertools' => array(

        // ...snip...

        'events' => array(
            'enabled' => true,
        ),
    ),
);
```

時間やメモリの箇所にマウスをホバーすると、イベントごとの時間やメモリが表示されます。

![](https://qiita-image-store.s3.amazonaws.com/0/8734/d53156ac-43af-f112-ae83-e5b395f010ab.png)

ただし、`Zend\Mvc\Application` の bootstrap 以前や finish より後は表示されません（bootstrap でリスナーを仕込んで finish でレスポンスに結果を挿入しているため）。
todoを検索する


開発中にとりあえず…って事でコメントに`TODO: なんとか〜`とかよく書くのだけれど後でagするとすべてのファイルが検索されて面倒くさい。
masterブランチと現在のブランチの差分にあるtodoのみを検索したい。

gitに以下のエイリアスを登録

```
[alias]
	todo = !"f() { for fn in `git diff --name-only master`;do if [ -f $fn ];then git grep -i todo $fn;fi done };f"
```

`git todo`で検索できる
Androidで大きいヒープを確保する

Androidでは大きいヒープ領域を確保するための手段が提供されています。
AndroidManifext.xmlのapplicationタグにandroid:largeHeap="true"を記載するだけです。
APIlevel11から利用出来ます。

```xml
<application
     android:largeHeap="true" >
</appplication>
```

この設定をしておくとヒープが足りなくなった時に、新たに大きなヒープを確保します。
最初から大きなヒープを確保するわけではありません。
なお、確保されるヒープの大きさは端末によって異なり、ヒープが増えない端末もあります。

[android:largeHeap(API Guides)](http://developer.android.com/guide/topics/manifest/application-element.html#largeHeap)
API Guidesにも書かれていますが、どうしてもOutOfMemotyErrorが解決出来ない時にのみ設定して下さい。
基本は、設定しなくてもErrorが発生しないようメモリの使用量を抑えるべきです。
文字列を全角で左詰めする


文字列を任意の長さで左詰めすることができるljustという組み込みのメソッドがあります。
http://docs.ruby-lang.org/ja/2.0.0/method/String/i/ljust.html


以下のように使えば、表示を揃えたりするので便利です。

```ruby
[["Miyamoto", "Musashi"], ["Sasaki", "Kojiro"]].each do |name|
  puts name[0].ljust(10) + name[1]
end
```

```実行結果
Miyamoto  Musashi   
Sasaki    Kojiro
```

しかしながら、全角が混ざったりするとうまく揃わなくなってしまいます。


```ruby
[["宮本", "武蔵"], ["Sasaki", "Kojiro"]].each do |name|
  puts name[0].ljust(10) + name[1]
end
```

```実行結果
宮本        武蔵
Sasaki    Kojiro
```

このようなときは、Mojiというライブラリを使い、全角で揃えてしまえば良さそうです。以下のようにStringクラスへメソッドを追加すれば、同じような感覚で使えるでしょう。

```ruby
# $ gem install moji
require 'moji'

class String
  raise "String#ljust_to_byte method has already been defined." if method_defined?(:ljust_two_byte)
  def ljust_two_byte(width, padding = ' ')
    Moji.han_to_zen(self.ljust(width, padding).encode('utf-8'))
  end
end

[["宮本", "武蔵"], ["Sasaki", "Kojiro"]].each do |name|
  puts name[0].ljust_two_byte(10) + name[1].ljust_two_byte(10)
end
```

```実行結果
宮本　　　　　　　　武蔵　　　　　　　　
Ｓａｓａｋｉ　　　　Ｋｏｊｉｒｏ
```

Railsで使うなら、lib/ext/string.rb あたりに定義して、
config/application.rb内で

```config/application.rb
require 'ext/string'
```

すれば便利に使えそうです。
Linuxのchrome,chromiumでプロキシを通す

# 背景

Linuxでchromiumやchromeをインストールすると、プロキシ設定はシステムのものが使われます。
社内プロキシだとシステムで設定していてもうまく動作しないときがあります。
プラグインを使うことでうまくいったのでその時のメモです。

# 手順

* chromiumをプロキシオプションで起動します。

```bash
$ chromium-browser --proxy-server=http=<プロキシホスト>:<ポート> 
```

この時点で一部のサイトが見られるようになりました。
ただ、開発用途で使っているlocalhostにアクセスできなくなりました。。。
`--proxy-bypass-list`で指定できるらしい (http://www.chromium.org/developers/design-documents/network-settings) のですが、うまく動作せず。

* プラグインをインストールします。

ブックマークバーからアプリを開き右下のWebストアをクリック。
Webストアを開けない場合は、以下を試してみてください。

```bash
$ chromium-browser --proxy-server=https=<プロキシホスト>:<ポート> 
```

検索から "proxy switchysharp" を入力し、プラグインをインストールします。

* プラグインを設定します。

chromiumを`--proxy-server`オプションなしで再起動します。
右上の地球儀のアイコンをクリックし、Optionでプロキシを設定する。Proxy Profilesを設定するだけなので直感的に設定できると思います。

![proxyswitcy.png](https://qiita-image-store.s3.amazonaws.com/0/41215/e31ed3c1-3321-a439-20d8-14735438a16a.png)

プロファイルを複数設定すれば、複数のプロキシを切り替えることもできます。

プロキシの切り替えは右上の地球儀のアイコンから簡単にできます。

# その他

Proxy SwitchySharpはOSの設定を書き換えないため、今回の目的に適したプラグインでした。

普段のWindows PCではOSの設定ごと切り替えができた方がよいので、以下のProxy Switchy!を使用しています。
プロキシを切り替えるためにわざわざIEやコントロールパネルを起動しなくて済むので楽ちんです。

https://chrome.google.com/webstore/detail/proxy-switchy/caehdcpeofiiigpdhbabniblemipncjj
ナンバーマジック２

　前回とは違う方法で解きました。今回は、文字連結させて全探索する方法によって実装しました！
　

```java:

public class Main {
	int MagicNumber(String answer) {
		String[] check = {
				"YYYYYYYYNNNNNNNN",
				"YYYYNNNNYYYYNNNN",
				"YYNNYYNNYYNNYYNN",
				"YNYNYNYNYNYNYNYN",
		};
		
		for(int r = 0; r < check[0].length(); r++) {
			String judge = "";
			for(int c = 0; c < check.length; c++) {
				judge += check[c].charAt(r);
			}
			if(answer.equals(judge)) return(r + 1);
		}
		return(-1);
	}
	
	void doIt() {
		String answer = "YNYY";
		String answer2 = "YNNN";
		String answer3 = "NNNN";
		String answer4 = "YYYY";
		String answer5 = "NYNY";
		System.out.println(MagicNumber(answer5));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}

}

```

やはりこの問題はあんまりコードが複雑にならないみたいです。
擬似要素を使ってfloatを解除する


子要素に`float`かけてると、親要素の高さが潰れてしまうことがある。
たいていその原因は、cssで`clear: both`していないから。

下記のようなコードを書けば、親要素に自然な高さを持たせることができる。

```html
<div class="parent">
  <div class="child">あああ</div>
  <div class="child">いいい</div>
</div>
```

```css
.child {
	float: left;
}

.parent {
	zoom: 1; /* float解除 for IE6/7  */
}
.parent:after, .parent:before {
	content: "";
	clear: both;
	display: block;
}
```

- `:before`は、`parent`クラスの真上に当たる部分を指す
- `:after`は、`parent`クラスの真下に当たる部分を指す
- `clear: both`：浮いた状態を地に足付けさせる
- `display: block`：ブロック要素に変換しないとうまくいかない
Laravel4 アプリケーション動作環境の設定

## [detectEnvironment メソッドの変更](#1)
```php:bootstrap/start.php
$env = $app->detectEnvironment(function() {

	return array_key_exists('APPLICATION_ENV', $_SERVER)
		? $_SERVER['APPLICATION_ENV'] : 'local';

});
```

## [アプリケーション動作環境を環境変数に設定する](#2)
```apacheconf:/etc/httpd/conf.d/vhosts.conf
<VirtualHost *:80>
...
    SetEnv APPLICATION_ENV development
...
</VirtualHost>
```
上記は、httpd.conf でもいいし、.htaccess に書いてもOK

シェルから `php artisan env` を実行すると、設定した環境が確認できる。

## [動作環境ごとの設定を config ディレクトリに置く](#3)
app/config の下に、APPLICATION_ENV の値に対応したディレクトリを用意する。

<pre>
app/config
     +----- /local
     +----- /development
     .
     .
     .
</pre>

```php:app/config/local/app.php
<?php
return array(
    'debug' => true,
    'url' => 'http://localhost',
    'timezone' => 'Asia/Tokyo',
    'locale' => 'ja'
);
```
```php:app/config/development/app.php
<?php
return array(
    'debug' => true,
    'url' => 'http://dev.example.com',
    'timezone' => 'Asia/Tokyo'.
    'locale' => 'ja'
);
```

などなど

同様に app/config/環境名/database.php で、データベース・サーバーへの接続先の指定を環境ごとに変更できる。

```php:app/config/local/database.php
<?php
return array(
    'connections' => array(
        'mysql => array(
            'driver' => 'mysql',
            'host' => 'localhost',
            'database' => 'test',
            'username' => 'john',
            'password' => 'lemon',
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
    ),
);
```
```php:app/config/development/database.php
<?php
    'connections' => array(
        'mysql => array(
            'driver' => 'mysql',
            'host' => '192.168.1.35',
            'database' => 'test',
            'username' => 'paul',
            'password' => 'mcDonald',
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
    ),
);
```

## [注意](#4)
環境名で testing はユニットテストのために予約されているので使用不可。それ以外は自由に設定できる。
Vagrant | Vagrant VMware Workstation Provider の購入からVMの起動まで

# Vagrant | Vagrant VMware Workstation Provider の購入からVMの起動まで

## 概要

Vagrant VMware Workstation Provider の購入からVMの起動までの手順を説明します

## 前提

* VMware Workstation10
* Vagrant 1.5.3
* Windows7

## 手順

* Vagrant公式サイトの下記URLにてライセンスを購入する。1ライセンス $79 (2014/06/26現在)

    https://www.vagrantup.com/vmware

* 購入完了のメールが届きます

* メールにライセンスファイル( *license.lic* )のダウンロードURLがあるので、ダウンロードします

    http://license.hashicorp.com/licenses/<任意のURL>/download

* *vagrant-vmware-workstation* plugin をインストールします

~~~bash
$ vagrant plugin install vagrant-vmware-workstation
Installing the 'vagrant-vmware-workstation' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vmware-workstation (2.4.1)'!
~~~

* ライセンスを有効化します

~~~bash
$ cd %ライセンスをダウンロードしたディレクトリ%
$ vagrant plugin license vagrant-vmware-workstation license.lic
Installing license for 'vagrant-vmware-workstation'...
The license for 'vagrant-vmware-workstation' was successfully installed!
~~~

* VMWare用の Ubuntu 12.04 LTS のBOXを追加

~~~bash
$ vagrant box add vmware_precise64 http://files.vagrantup.com/precise64_vmware.box
==> box: Adding box 'vmware_precise64' (v0) for provider:
    box: Downloading: http://files.vagrantup.com/precise64_vmware.box

==> box: Successfully added box 'vmware_precise64' (v0) for 'vmware_fusion'!

$ vagrant box list | grep vmware
vmware_precise64 (vmware_fusion, 0)
~~~

公式の説明によると、 *vmware_fusion* になっていますが、 *Workstation* の場合でも問題ないとのこと。

* Vagranfileを以下の内容で作成します

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

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "vmware_precise64"
  config.vm.provider "vmware_workstation" do |v|
    v.gui = true
  end
end
~~~

* VMを起動します。

~~~bash
vagrant up --provider=vmware_workstation
~~~

無事起動しました。

![vagrant_vmware_workstation.png](https://qiita-image-store.s3.amazonaws.com/0/43480/468decfb-a4d6-8789-8f9d-a7e072988b8f.png)

※この際、cmdでもcygwinの端末でも構いませんが、ターミナルを管理者権限で起動しないと以下のエラーが発生します。

~~~
Bringing machine 'default' up with 'vmware_workstation' provider...
When using Vagrant with VMware Workstation on Windows, Vagrant must
run with administrative privileges. I realize this is not ideal,
but this is the only way to make network modifications with VMware.
Please run Vagrant in a console with Windows administrative privileges.
~~~

* sshで接続してみます

~~~bash
$ vagrant ssh
Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-virtual x86_64)

 * Documentation:  https://help.ubuntu.com/
Last login: Wed Jun 26 23:23:42 2014
~~~

## 参照
VMWare Provider購入ページ

* https://www.vagrantup.com/vmware

VMWare Providerドキュメント

* http://docs.vagrantup.com/v2/vmware/index.html
* http://docs.vagrantup.com/v2/vmware/installation.html
* http://docs.vagrantup.com/v2/vmware/installation.html
* http://docs.vagrantup.com/v2/vmware/configuration.html
RuboCop | Style/CommentAnnotation

# RuboCop | Style/CommentAnnotation

## 概要

RuboCopの「Style/CommentAnnotation」警告について。

TODOなど、アノテーションコメントの記法をチェックします。
アノテーションコメントについては、別途下記の記事を参照

[アノテーションコメント（TODO、FIXME、OPTIMIZE、HACK、REVIEW）](http://qiita.com/tbpgr/items/1c046a877c6be4d89876)

具体的には、

~~~ruby
# ANNOTATION: comment
~~~

のように、
「#」, 半角スペース, キーワード（大文字）, 半角コロン, 半角スペース, コメント
のフォーマットになっている必要があります。

## 設定値一覧

デフォルトでは下記のキーがチェック対象になっています。

* TODO
* FIXME
* OPTIMIZE
* HACK
* REVIEW

## CommentAnnotation

各設定値での検証結果をまとめます。

### 検証プログラム

comment_annotation.rb

~~~ruby
# TODO: comment
# FIXME: comment
# OPTIMIZE: comment
# HACK!: comment
# REVIEW: comment
# ORIGINAL: comment
# TODO invalid_format_no_colon
# TODO:invalid_format_no_space
# todo: invalid_format_lower_case
# ORIGINAL invalid_format_no_colon
# ORIGINAL:invalid_format_no_space
# original: invalid_format_lower_case
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
CommentAnnotation:
  Keywords:
    - TODO
    - FIXME
    - OPTIMIZE
    - HACK
    - REVIEW
~~~

~~~bash
$ rubocop comment_annotation.rb
Inspecting 1 file
C

Offenses:

comment_annotation.rb:7:3: C: Annotation keywords should be all upper case, followed by a colon and a space, then a note describing the problem.
# TODO invalid_format_no_colon
  ^^^^
comment_annotation.rb:8:3: C: Annotation keywords should be all upper case, followed by a colon and a space, then a note describing the problem.
# TODO:invalid_format_no_space
  ^^^^^
comment_annotation.rb:9:3: C: Annotation keywords should be all upper case, followed by a colon and a space, then a note describing the problem.
# todo: invalid_format_lower_case
  ^^^^^

1 file inspected, 3 offenses detected
~~~

### 実行結果 ORIGINAL をキーワードに追加した場合

.rubocop.yml

~~~yaml
CommentAnnotation:
  Keywords:
    - TODO
    - FIXME
    - OPTIMIZE
    - HACK
    - REVIEW
    - ORIGINAL
~~~

~~~bash
$ rubocop comment_annotation.rb
Inspecting 1 file
C

Offenses:

comment_annotation.rb:7:3: C: Annotation keywords should be all upper case, followed by a colon and a space, then a note describing the problem.
# TODO invalid_format_no_colon
  ^^^^
comment_annotation.rb:8:3: C: Annotation keywords should be all upper case, followed by a colon and a space, then a note describing the problem.
# TODO:invalid_format_no_space
  ^^^^^
comment_annotation.rb:9:3: C: Annotation keywords should be all upper case, followed by a colon and a space, then a note describing the problem.
# todo: invalid_format_lower_case
  ^^^^^
comment_annotation.rb:10:3: C: Annotation keywords should be all upper case, followed by a colon and a space, then a note describing the problem.
# ORIGINAL invalid_format_no_colon
  ^^^^^^^^
comment_annotation.rb:11:3: C: Annotation keywords should be all upper case, followed by a colon and a space, then a note describing the problem.
# ORIGINAL:invalid_format_no_space
  ^^^^^^^^^
comment_annotation.rb:12:3: C: Annotation keywords should be all upper case, followed by a colon and a space, then a note describing the problem.
# original: invalid_format_lower_case
  ^^^^^^^^^

1 file inspected, 6 offenses detected
~~~