OmniAICreator/Qiita-1.07M huggingface dataset:
GoでJSONシリアライズ・デシリアライズ

#GoでJSONのシリアライズ・デシリアライズ

こういう形のJSONデータをやり取りする機会があったのですが、このやり取りに、今回はGoを使ってみました。

```js:JSON
{"items":[
  {"text":"name","value":0},
  {"text":"name","value":1},
  {"text":"name","value":2},
  {"text":"name","value":3},
  {"text":"name","value":4}
]}
```

## シリアライズ
まずは上記のJSON構造に合ったstructを作ります。Goの変数命名規則が問題で必要なJSONの形式に出力できない場合は、変数の型のうしろにタグを付けて任意の名前を付けます。

```go
//繰り返し要素
type ApiItem struct {
	Text   string `json:"text"`
	Value  int `json:"value"`
}

//root
type ApiList struct {
	Items []ApiItem `json:"items"`
}
```

このstructを用いてデータを生成し、encoding/jsonパッケージのjson.Marshalを使えばJSONデータが作られます。

```go
	apiList := ApiList{make([]ApiItem, 0, 10)}

	for i := 0; i < 5; i++ {
		apiList.Items = append(apiList.Items, ApiItem{"name", i})
	}

	formatBytes, err := json.Marshal(apiList)
	if err != nil {
		fmt.Println(err)
	}

	output := string(formatBytes)
	fmt.Println(output)
```

json.Marshalで得られる型は[]byteですので、読みやすいように文字列化して出力すると、こういうかたちになります。

```js:JSON
{"items":[{"text":"name","value":0},{"text":"name","value":1},{"text":"name","value":2},{"text":"name","value":3},{"text":"name","value":4}]}
```

## デシリアライズ

逆にJSONデータを受け取り変数にマッピングする場合は、json.Unmarshalを使えば良いです。

```go
	data := ApiList{}
	err = json.Unmarshal(formatBytes, &data)
	if err != nil {
		fmt.Println(err)
	}

	for _, item := range data.Items {
		fmt.Printf("text : %s, value = %d\n", item.Text, item.Value)
	}
```

json.Unmarshalの第1引数には[]byte型のJSONデータ、第2引数にはJSONデータをデシリアライズして格納したい変数へのポインタを渡します。

結果はこんな感じ。ちゃんと格納されているようです。

```
text : name, value = 0
text : name, value = 1
text : name, value = 2
text : name, value = 3
text : name, value = 4
```

Go標準のライブラリだけで、JSONのシリアライズ・デシリアライズを簡単に書くことができます。
カーソル前のキャメルケースをスネークケースに変換

スネークケースって打ちづらいですよね？
アンダースコアを余分に打たないといけないし、アンダースコアが遠くて打ちづらいし。

そこで、
アッパーキャメルケースの末尾で関数を実行すると、大文字のスネークケースに変換、
ローワーキャメルケースの末尾で関数を実行すると、小文字のスネークケースに変換
する関数を作りました。

```
UpperCamelCase
    => UPPER_CAMEL_CASE

lowerCamelCase
    => lower_camel_case
```

```scm
(global-set-key (kbd "M-u") 'camel-to-snake-backward-word)
(defun camel-to-snake-backward-word ()
  (interactive)
  (let ((case-fold-search nil)
        (s (buffer-substring
            (point) (save-excursion (forward-word -1) (point)))))
    (delete-region (point) (progn (forward-word -1) (point)))
    (insert (funcall (if (= (string-to-char s) (downcase (string-to-char s)))
                         'downcase 'upcase)
                     (replace-regexp-in-string
                      "\\([A-Z]\\)" "_\\1"
                      (store-substring s 0 (downcase (string-to-char s))))))))
```
fluentd で MySQL のレプリケーションを監視


## 設定

```:mysql_slave.conf
<source>
  type            mysql_query
  host            127.0.0.1
  port            3306
  username        watch
  interval        1m
  tag             mysql.slave
  query           SHOW SLAVE STATUS
  record_hostname yes
</source>

<match mysql.slave>
  type notifier
  <def>
    pattern     replication_stopped
    check       string_find
    warn_regexp ^$
    crit_regexp ^$
    target_keys Seconds_Behind_Master
  </def>
  <def>
    pattern        replication_delay
    check          numeric_upward
    warn_threshold 2
    crit_threshold 10
    target_keys    Seconds_Behind_Master
  </def>
</match>

<match notification.**>
  type     mail
  host     localhost
  port     25
  from     FROM
  to       TO
  subject  fluentd notification
  out_keys pattern,target_tag,target_key,level,value,message_time
</match>
```

## アラートメール例

### レプリケーション停止

```
pattern: replication_stopped
target_tag: mysql.slave
target_key: Seconds_Behind_Master
level: crit
value:
message_time: 2013-05-28 12:52:14 +0900
```

### レプリケーション遅延

```
pattern: replication_delay
target_tag: mysql.slave
target_key: Seconds_Behind_Master
level: crit
value: 40.0
message_time: 2013-05-28 13:01:14 +0900
```

## 利用プラグイン
* [y-ken/fluent-plugin-mysql-query · GitHub](https://github.com/y-ken/fluent-plugin-mysql-query)
* [tagomoris/fluent-plugin-notifier · GitHub](https://github.com/tagomoris/fluent-plugin-notifier)
* [u-ichi/fluent-plugin-mail · GitHub](https://github.com/u-ichi/fluent-plugin-mail)
Eclipse 上からコマンドプロンプトを開く

Windows の話ですが、Play の開発をするとき、コマンドプロンプトを開いてプロジェクトフォルダへ移動し、`play` コマンドを実行しなければなりません。
`cmd` を実行して `cd` `cd` `cd` とやっていくのは非常にめんどくさいですね。
Eclipse で開発している場合、外部ツールの起動という便利なものがあります。

[Eclipseでコマンドプロンプトのウィンドウ(コンソール)を表示する](http://sctfarch.blogspot.jp/2012/12/eclipse.html)

これによってクリック一つでプロジェクトフォルダをコマンドプロンプトで開けるようになります。
私は以下のように設定しています。

Location: `C:\Windows\System32\cmd.exe`
Arguments: `/c start /d "${project_loc}"`

この設定をしておくと、プロジェクトを選択した状態で外部ツールの起動ボタン![外部ツールの起動.png](https://qiita-image-store.s3.amazonaws.com/0/2570/3a469605-9fd0-3962-0d02-e5bde912b44b.png)を押すと、プロジェクトフォルダにいる状態でコマンドプロンプトが開きます。

以下、私の設定画面です。

![設定画面.png](https://qiita-image-store.s3.amazonaws.com/0/2570/90d23c7d-271e-74dc-8054-53bf996c82f0.png)

以上です。ご参考まで。
OS X 10.8 で NSUserDefaults を空にするには

OS X 10.8 にはバグがあるらしく、 `NSUserDefaults` の `removePersistentDomainForName:` を呼んでも defaults が削除されない。また、 `setPersistentDomain:forName` で空の辞書をセットしても何も起こらない：

```objc
// これはダメ
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[NSBundle mainBundle].bundleIdentifier];
// これもダメ
[[NSUserDefaults standardUserDefaults] setPersistentDomain:@{} forName:[NSBundle mainBundle].bundleIdentifier];
```

唯一の手段は、空でない適当な辞書を defaults にセットし、値を取り除く方法である：

```objc
// これが正解
[[NSUserDefaults standardUserDefaults] setPersistentDomain:@{@"": @""} forName:[NSBundle mainBundle].bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@""];
```
What is `Auto packing the repository for optimum performance.'


何か git-push をした時に `Auto packing the repository for optimum performance.` と言われた。日本語サイトをサッと見ても無いし、stackoverflow にあったので、メモ書き程度の翻訳。

！！注意！！
　翻訳文は間違ってると思われるので、気をつけてね☆

原文: [what does “Auto packing the repository for optimum performance mean”?](http://stackoverflow.com/questions/8633981/what-does-auto-packing-the-repository-for-optimum-performance-mean)


## 質問の簡訳意訳:

> I'm having a problem with my git repo. For the last couple of days whenever i do a push to the server I get this "Auto packing the repository for optimum performance." message and it does not seem to go away and return the shell.

ここ最近、サーバへ git push した時に `Auto packing the repository for optimum performance` と表示されて、`git-push` の処理が終わってないように思うんだ。

> I also tried checking out to a new branch and then doing a rebase on my previous branch and then did git gc to remove the unused history objects and then did a push but still this message appears. Please let me know what's going on with my repo.

試しで、新しいブランチを作って、前のバージョンのを rebase してきて、要らない履歴を git-gc 使って消して push をしてみたけど、相変わらず出るんだ。何がどうなってるのおせーて。



## ベストアンサーの簡訳意訳:

> Short version: it means what it says, and if you just let it finish, all will be well.

簡潔に言うと: それは、ちゃんと処理は終わってるし、上手く行ってるよ。

> During most operations which can potentially increase the number of loose (unpacked) objects in the repository (including pushes), Git invokes `git gc --auto`. If there are enough loose objects (by default, at least 6700), it will then invoke `git repack -d -l` to pack them. If there are too many separate packs, it will also repack them into one.

リポジトリに、もしかしたらunpackedなオブジェクトが溜まってきているから、Git が `git gc --auto` をしてくれ、と言ってきてるのが一番の理由。デフォルトだと 6700 個なんだが、ルーズオブジェクトが大量に溜まっているなら、`git repack -d -l` をしてくれと言ってる。もし、大量の分割されたパックがあるなら、一回ほど repack をすればいいよ。


> A pack is a delta-compressed single file, containing a large number of objects. It's more efficient to store objects in packs, but it takes time to pack (compress) objects, so Git initially creates loose objects, then packs them in batches now and then, via automatic invocation of `git gc --auto`.

パックは一つのファイルを `delta-compressed` していて、大きな数値のオブジェクトとして収められている。パックにはストアオブジェクトがたくさんあるんだが、圧縮の時に時間がかかるので、Git ははじめにルーズオブジェクトを作成し、バッチ処理でパックされ、そしてその時に、`git gc --auto` が自動的に実行させる。

> If you let Git finish repacking, this won't happen again for a while. It can indeed take a while, especially if you have a lot of large binary objects, but if it's triggering, then it's a sign that it will probably drastically reduce the amount of disk space taken by the repo. If you really don't want it to happen, you can change the config parameter gc.auto. If you increase it to something much larger than 6700, it will happen less frequently, but take longer when it does. If you decrease it, it'll still have to do your current repack, but subsequently it will happen more often and finish more quickly. If you set it to 0, it will disable automatic repacking.

力尽きた

> See man git-gc (under --auto) and man git-config (under gc.auto) for more information.

詳しくは `git-gc` や `git-config` の man ページを見て。
tmux上でkarmaを実行するとエンジンがWebkitのブラウザがdisconnectedになる

タイトルに伝えたい情報が全て載ってるけど、一応詳細も書く。

```sh
$ tmux -V
tmux 1.7

$ karma --version
Karma version: 0.8.5

$ grep 'browsers ' karma.conf.js
browsers = ['Chrome'];

$ tmux

$ karma start
INFO [karma]: Karma server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 27.0 (Mac)]: Connected on socket id 2viThvtK5GZ-BEKj5ZxI
Chrome 27.0 (Mac): Executed 0 of 0 DISCONNECTED (0.117 secs / 0 secs)
WARN [Chrome 27.0 (Mac)]: Disconnected
```

![スクリーンショット 2013-05-28 11.11.53.png](https://qiita-image-store.s3.amazonaws.com/0/94/d36ceb7e-87cd-9f35-2e69-980013166ece.png)

こうなる。Safariも動かない。firefoxは動く。tmuxを使わない素のターミナルだとChromeもちゃんと動く。
PHPからPDOを使用してMySQL接続


http://jp2.php.net/manual/ja/book.pdo.php

基本的な接続フォーマット

```php
$dns = "mysql:host=127.0.0.1; dbname=db_name;charset=utf8";
$dns_id = "user_id";
$dns_pw = "password";

try {
	// MySQLサーバへ接続
	$pdo = new PDO($dns, $dns_id, $dns_pw, array(PDO::ATTR_EMULATE_PREPARES => false));

	// 処理
	
} catch(PDOException $e){
	var_dump($e->getMessage());
}
// 切断
$pdo = null;
```


単純なクエリーの実行

```php
// クエリーの実行
$sql = "SELECT id, name, address FROM members";
$statement = $pdo->query($sql);

// 結果の取得
$members = array();
foreach ($statement as $row) {
	$members[] = $row;
}
var_dump($members);

// バージョンによってはきちんとcloseしないと次のSQLが実行されない
$statement->closeCursor();
```

INSERT/UPDATE/DELETEの実行

```php
// クエリーの実行
$sql = "INSERT INTO any_table (column1, colmn2) VALUES ('apple', 12345) ";
$count = $pdo->exec($sql);

// 戻り値は実行件数。falseが返る可能性もあるので注意
echo $count;
```

トランザクション  ※ MyISAMでは不可

```php
// トランザクション開始
$pdo->beginTransaction();

// INSERTとか DELETEとか

// トランザクション完了
$pdo->commit();

// トランザクション取り消し
$pdo->rollBack();   
```




## PreparedStatement
名前つきプレスホルダにキーワードを指定した接続
bindValue()のかわりにbindParam()でも可。bindParam()はexcute()時に値を評価。

```php
// 準備
$sql = "INSERT INTO any_table (column1, colmn2) VALUES (:val1, :val2) ";
$sth = $pdo->prepare($sql);
$sth->bindValue(':val1', 'apple', PDO::PARAM_STR);
$sth->bindValue(':val2', 12345, PDO::PARAM_INT);

// 実行
$sth->execute();

// 直近の実行結果の行数を得る
$count = $sth->rowCount();
echo $count;
```


プレスホルダにキーワードを指定した接続

```php
// 準備
$sql = "INSERT INTO any_table (column1, colmn2) VALUES (?, ?) ";
$sth = $pdo->prepare($sql);
$sth-> bindValue(1, 'apple', PDO::PARAM_STR);
$sth-> bindValue(2, 12345, PDO::PARAM_INT);

// 実行
$sth->execute();

// 直近の実行結果の行数を得る
$count = $sth->rowCount();
echo $count;
```

読込

```php
$sql = "SELECT id, name, address FROM members WHERE id = ?";
$sth = $pdo->prepare($sql);
$sth->bindParam(1, $value, PDO::PARAM_STR); 

$sth->execute();
while ($row = $stmt->fetch()) {
    print_r($row);
}
```
apacheのログから必要な個所を抜き取りスクリプト（行単位）

誰でもわかるような簡単な記述ですが、ログファイルがでかくなると、エディターでは処理できなくなるので、覚書程度で。

```perr:hoge
#!/usr/bin/perl

my @log;
for my $i ( '1', '2', '3' ) {
    open( FH, "$i.log" );
    while ( my $line = <FH> ) {
        push( @log, $line ) if ( $line =~ /img/); # ここにマッチさせたいwordを追加
    }
    close(FH);

}
open( OUT, ">log.txt" );
print OUT @log;
close(OUT);

exit;
```
TypeScriptにおける Builder pattern

# TypeScriptにおける Builder pattern

[進撃の巨人OP中毒になる動画](http://www.nicovideo.jp/watch/sm20544568)を見てたら書きたくなったので。

```javascript
class Slime {
  private colorName: string;
  private dockable: bool = false;

  public color(colorName: string): void {
    this.colorName = colorName;
  }
  
  public isDockable(): void {
    this.dockable = true;
  }
  
  public isNotDockable(): void {
    this.dockable = false;
  }
}

class SlimeBuilder {
  public slime: Slime;

  public buildColor(): void { };
  public buildDockable(): void { };

  public createNewSlime() {
    this.slime = new Slime();
  }

  public getSlime(): Slime {
    return this.slime;
  }
}

class NormalSlimeBuilder extends SlimeBuilder {
  public buildColor(): void {
    this.slime.color('Blue');
  }

  public buildDockable(): void {
    this.slime.isDockable();
  }

}

class SheSlimeBuilder extends SlimeBuilder {
  public buildColor(): void {
    this.slime.color('Red');
  }

  public buildDockable(): void {
    this.slime.isNotDockable();
  }
}

class LiquidMetalSlimeBuilder extends SlimeBuilder {
  public buildColor(): void {
    this.slime.color('Metal');
  }

  public buildDockable(): void {
    this.slime.isNotDockable(); 
  }
}

class Field {
  private slimeBuilder: SlimeBuilder;

  public setSlimeBuilder(slimeBuilder: SlimeBuilder) {
    this.slimeBuilder = slimeBuilder;
  }

  public getSlime(): Slime {
    return this.slimeBuilder.getSlime();
  }

  public respawnSlime(): void {
    this.slimeBuilder.createNewSlime();
    this.slimeBuilder.buildColor();
    this.slimeBuilder.buildDockable();
  }
}

module BuilderRunner {
  export function execute() {
    var field: Field = new Field();

    var normalSlime: NormalSlimeBuilder = new NormalSlimeBuilder();
    field.setSlimeBuilder(normalSlime);
    field.respawnSlime();
    console.dir(field.getSlime());

    var sheSlime: SheSlimeBuilder = new SheSlimeBuilder();
    field.setSlimeBuilder(sheSlime);
    field.respawnSlime();
    console.dir(field.getSlime());

    var liquidMetalSlime: LiquidMetalSlimeBuilder = new LiquidMetalSlimeBuilder();
    field.setSlimeBuilder(liquidMetalSlime);
    field.respawnSlime();
    console.dir(field.getSlime());
  }
}

BuilderRunner.execute();
```

# 結果

![スクリーンショット 2013-05-28 3.54.30.png](https://qiita-image-store.s3.amazonaws.com/0/3985/2a9fad9b-d5e7-b17d-bcb3-44b21dad783b.png)
python 時間計測

```Python:laptimer.py
# -*- encoding: utf-8 -*-

__version__ = '0.0.1'


from time import time, sleep

#---------------------------------------------------------------
# LapTimer CLASS
#---------------------------------------------------------------
class LapTimer(object):

    """
    For example:

        from laptimer import LapTimer

        timer = LapTimer("TEST SCRIPT")

        timer.lap("start script")
        for i in xrange(3):
            sleep(i+1)
            timer.lap('sleep time %d sec' % (i+1))

        timer.get_lap()

    Returns:

        -------------------------
        TEST SCRIPT
           Lap : Total : message
        -------------------------
         0.000 : 0.000 : start script
         1.002 : 1.002 : sleep time 1 sec
         2.003 : 3.005 : sleep time 2 sec
         3.004 : 6.009 : sleep time 3 sec

    """

    def __init__(self, name = None):

        self.start_time = self.now_time = self.last_time = time()
        self.name       = name
        self.time_list  = []

    def lap(self, message=None):

        self.now_time   = time()
        self.lap_time   = self.now_time - self.last_time
        self.total_time = self.now_time - self.start_time
        time_list       = (self.lap_time, self.total_time, message)
        self.time_list.append(time_list)
        self.last_time = self.now_time
        return ' %5.3f - %5.3f - %s' % time_list

    def get_lap(self):

        print '-' * 25
        print '%s' % self.name
        print ' %5s : %5s : message' % ('Lap', 'Total')
        print '-' * 25
        for i in self.time_list:
            print ' %5.3f : %5.3f : %s' % i

#---------------------------------------------------------------
# TEST
#---------------------------------------------------------------
def test():

    '''
    TEST

    '''

    timer = LapTimer("TEST SCRIPT")

    timer.lap("start script")
    for i in xrange(3):
        sleep(i+1)
        timer.lap('sleep time %d sec' % (i+1))

    timer.get_lap()

if __name__ == '__main__': test()
```
同じマシンで複数のgithubアカウントを使い分ける

例えば、個人ではGithub、会社ではGHEのアカウントを持っているなどの場合、同じマシンでアカウント(コミッター名)を使い分ける方法。
単純に、`--global`を付けなければリポジトリ単位で設定できるので、使用頻度が高い方を`--global`で設定し、もう一方はリポジトリ単位で設定する。
ファイルでいうと、`--global`をつけるとhomeの設定`~/.gitconfig`に、つけないとそのリポジトリ内の設定`./.git/config`に書かれるということになる。

#####メインのアカウント(~/.gitconfig)

```
git config --global user.name "メインアカウントのユーザ名"
git config --global user.email "メインアカウントのメールアドレス"
```

#####サブのアカウント(./.git/config)

```
cd [ローカルリポジトリのディレクトリ]
git config user.name "サブアカウントのユーザ名"
git config user.email "サブアカウントのメールアドレス"
```
やったー！php-decoratorsでアノテーションvar_dumpできたよー＼(^o^)／

php-decoratorsは必ずコールバックを受け取るのが最初ちょっとやっかいですね
https://github.com/AterCattus/php-decorators

```php
<?php
namespace My{
    function var_dump($func, $args) {
        call_user_func_array('\var_dump', $args);
        return function() use ($func) {
            return call_user_func_array($func, func_get_args());
        };
    }
    
    # @var_dump(func_get_args())
    function test($name, $foo = null){
        echo 'hello', PHP_EOL;
    }
    
    test('bar');
    test('bar', 'baz');
}
```

出力は
<pre>
string(3) "bar"
hello
string(3) "bar"
string(3) "baz"
hello
</pre>
Laravelでフルパスを取得するときは...

忘れないうちにメモ。

Laravelでフルパスを取得するときは、paths.phpの中にあるpath()関数を使用するといいです。  
引数に以下のものを指定して使います。

```
array(6) {
  ["base"]=>
   "/path/to/laravel/"
  ["app"]=>
   "/path/to/laravel/application/"
  ["sys"]=>
   "/path/to/laravel/laravel/"
  ["bundle"]=>
   "/path/to/laravel/bundles/"
  ["storage"]=>
   "/path/to/laravel/storage/"
  ["public"]=>
   "/path/to/laravel/public/"
}
```

例えば、publicの中にhogeディレクトリを作る場合は

```
File::mkdir(path('public') . 'hoge');
```

っていうふうにすると、いいんじゃないかと思う。
GAE上でのTwilio

https://developers.google.com/appengine/articles/twilio

TwilioというのはWeb上から電話したりされたりするAPIを提供するサービスです。「数字の1を押せ？」とか、トーンを押すよう要求することもできます。自動音声案内や電話投票に便利です。一回あたりおいくら、という値段設定で、結構安いです

特にコーディングの手続き的な詳細については書きません。知っている人なら上の記事だけでなんとかなります。

アナウンスがあったときに「なんだそれ」(どういう連携だよ、という意味、多分)と言ってた人がいた気がします。別にGAEがTwilioとAPIレベルや課金処理のレベルで連携しているわけではないですよね、これ。単に「APIを取ってきて使えばスムーズに連携できるよ」という良いユースケースの紹介に過ぎない感じ。実際には課金はバラバラですし、ドキュメントも「あっち読め」と書いて有ります。

ただ、[キャンペーン的な自由利用の枠がゲット出来る](http://ahoy.twilio.com/googlecloudplatform)ため今はじめるのはお得、という話はありえます。GAEとTwilioの相性も私見では悪くない気がします (Python, Java, __PHP__ の例は豊富です。__PHP__の例ですはい)。このあたりはGAEヘビーユーザ的にどうか、という点は気になります。残念ながら Go言語の例 (とSDK)は、記憶の限りでは皆無です。

日本ではKDDIが[Twilio for KDDI](http://twilio.kddi-web.com/) という形でTwilioの日本ローカライズの窓口となった関係で、日本語対応が以前より良くなりました。日本の法の縛りがあるためSNSが日本で提供できてないそうなのですが、音声について言えば、海外のTwilioでは存在しなかった待望の日本語音声合成を持っています。

試しに手元でもにょもにょやった感じでは、比較的GAE初心者級の私でも、一日でGAEの復習、Twilioの復習、連携をひと通り出来ました。Twilioについては、アイディアをどうするかが課題です。
Javaで月ごと集計する際の最終日を算出する方法

Javaで月ごとの集計をする際の「月ごと」を計算する上での範囲指定方法です。

月初は簡単。指定年月以外の初期化は、日だけ1、それ以外は0で初期化すればOK。

```java
		Calendar calendar = Calendar.getInstance();
		//指定年, 指定月, 1日, 0時0分0秒
		calendar.set(year, month, 1, 0, 0, 0);
		//きっちりミリ秒も0にする
		calendar.set(Calendar.MILLISECOND, 0);
```

月末の範囲指定は、指定方法が2つあります。そのうち少々複雑な方を紹介します。
少々複雑ですが、考え方が分かれば難しいことはありません。
「指定月の翌月1日から1ミリ秒を引くと当月末になる」という方法です。

```java
	public static Date getEndOfMonth(int year, int month) {
		Calendar calendar = Calendar.getInstance();
		//指定年, 指定月, 1日, 0時0分0秒
		calendar.set(year, month, 1, 0, 0, 0);
		//翌月にする (年またぎ対応)
		calendar.add(Calendar.MONTH, 1);
		//0時0分0秒0ミリ秒 - 1ミリ秒で、月末23時59分59秒999ミリ秒にできる
		calendar.set(Calendar.MILLISECOND, 0);
		calendar.add(Calendar.MILLISECOND, -1);
		return calendar.getTime();
	}
```

翌月1日未満、という簡単な指定が出来ればそちらを採用するべきだと思います。しかし、SQLで日付の条件にbetweenを使う場合には、今回した方法を使うことになるでしょう。
logrotate の size と minsize の違い


# 簡単にまとめると

* minsize は and による条件の追加
* size は or による条件の追加


# man から引用

## minsize

<pre>
minsize size
  Log  files  are  rotated  when they grow bigger then size bytes, but not before the 
  additionally specified time interval (daily, weekly, monthly, or yearly).
  The related size option is similar except that it is mutually exclusive  with the
  time interval options, and it causes log files to be rotated without regard for the
  last rotation time.  When minsize is used, both the size and timestamp of a log 
  file are considered.
</pre>

<b>minsize</b> は ローテーションの周期を示すオプション(daily, weekly, monthly, yearly) と同時に指定した場合、logrotateコマンドを実行した時点でその周期を経過している場合<b>かつ</b>、minsize で指定したサイズを超えていたときにローテーションを実行する。

たとえば、weekly と minsize 1M の両方を指定している場合、前回のローテーションから１週間以上経過しており、かつ、そのときファイルの容量が 1M を超えていればローテーションされる。

## size

<pre>
size size
  Log  files  are rotated only if they grow bigger then size bytes. If size is
  followed by M, the size if assumed to be in megabytes.  If the k is used, the size
  is in kilobytes. So size 100, size 100k, and size 100M are all valid.
</pre>


一方、<b>size</b> を指定した場合は、ローテーション周期を経過していること<b>または</b>、ファイルの容量が size で指定したサイズを超えていればローテーションされる。

つまり、weekly と size 1M の両方を指定している場合、1週間が経過する前にファイルの容量が1Mを超えた場合、そこでローテーションが行なわれるし、前回のローテーションから1週間経過した時ファイルサイズが1M以下でもローテーションされる。

# 参考

logrotate daily and size?
http://serverfault.com/questions/391538/logrotate-daily-and-size
RSpec + Spork + FactoryGirl + Guard によるテスト環境構築

####アプリケーションを作成。

	rails new test_env
	cd test_env
-
####`Gemfile`に以下を追記。

```ruby:Gemfile
group :test do
  gem 'spork'
  gem 'guard-spork'
end

group :development, :test do
  gem 'rspec-rails'
  gem 'guard'
  gem 'guard-rspec'
  gem 'factory_girl_rails'
end
```
-
####インストール。

	bundle install
-
####`.rspec`と`spec/spec_helper.rb`を生成する。

	rails generate rspec:install
-
####Sporkを使用するように、`.rspec`に以下を追記。

```.rspec
--drb
```
-
####動作確認用に、scaffoldで`User`を生成。

	rails generate scaffold user name:string age:integer
-
####マイグレーション。

	rake db:migrate
-
####以下のようにして、`spec/spec_helper.rb`に、spork用のエントリを追加。

	spork --bootstrap
-
####`FactoryGirl`の変更を反映させるため、`spec/spec_helper.rb`に以下のように追記。

```ruby:spec/spec_helper.rb
Spork.each_run do
  # This code will be run each time you run your specs.
  FactoryGirl.reload        ### added
end
```
-
####`Guardfile`を生成。

	guard init spork
	guard init rspec
-
####`spec/factories/`以下の変更に対して対応するテストが行われるように、`Guardfile`に以下のように追記。

```ruby:Guardfile
require 'active_support/inflector'    ### added

# A sample Guardfile
# More info at https://github.com/guard/guard#readme

(中略)

  # Turnip features and steps
  watch(%r{^spec/acceptance/(.+)\.feature$})
  watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$})   { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }

  watch(%r{^spec/factories/(.+)\.rb$}) do |m|        ### added
    %W[                                              ### added
      spec/models/#{m[1].singularize}_spec.rb        ### added
      spec/controllers/#{m[1]}_controller_spec.rb    ### aaded
    ]                                                ### added
  end                                               ### added
end
```
-
####テスト用DBの準備。

	rake db:test:prepare

-
以上で、コードの変更に対して即座にテストが走る環境になる。
SCSS文字列をRubyプログラム中でCSSにコンパイルする

みなさんご存知の通り、`sass`というGemをインストールすることで、

```bash
$ gem install sass
```

以下のようにして、SCSSファイルをCSSにコンパイルできます。

```bash
$ sass input.scss output.css
```

しかし、コマンドラインでなく、Rubyプログラム中でSCSS文字列をCSS文字列にコンパイルするにはどうすればいいのでしょうか。
結論としては、以下のようにすればOKです。
（Ruby初心者なんでコードだせぇww　とか言わないでw）

```ruby
#!/usr/bin/env ruby

require 'sass'

stdinStr = "";
while line = STDIN.gets
    if (/exit/ =~ line)
        break;
    end
    stdinStr += line
end

engine = Sass::Engine.new(stdinStr, :syntax => :scss)

begin
    print engine.render
rescue => ex
    print "Line " + ex.sass_line.to_s + ": " + ex.to_s + "\n"
end
```

なんらかの事情で、コマンドラインを介さずに動的にSCSSをコンパイルしなければならない場合（Webデザイン系のWebサービスを作るときとか？）に使えるのではないでしょうか。
Core Dataにrailsのmodelみたいに自分で定義したmethodを作成する



railsはmodelに色々便利にメソッドを定義できるが、Core Dataでもできないか調べてみた。
要約すると、Entityのsubclassをカテゴリーで拡張するというのがスタンダードらしいので、それをまとめます。


とりあえず、Xcodeでrojectのひな形としてMaster Detailsを選択し、core dataを使うにcheckを入れる。

出来たprojectをいじる。

1. NSManagedObject subclassを作成する。

 	New fileで `iOS > Xore Data > NSManagedObject subclass`を選択する。
すると、`core_data_template.xcdatamodeld`で定義されたEvent entityを元にして、
`Event.h`、`Event.m`が作成される。

	`Event.h`、`Event.m`は`core_data_template.xcdatamodeld`を変更するたびに
上記の手順を踏んで作成し直す必要があるので、**直接書き換えてはいけない**。

2. カテゴリーを作成する。

	New fileで `IOS > Cocoa Touch > Objective-C category`を選択する。
Categoryに「Formatter」と入力。
Category onに「Event」と入力。
すると、`Event+Formatter.h`、`Event+Formatter.m`が作成される。

	これをいじる！

3. カテゴリーを実装する。

	一旦上記で作成したコードを表示する。

	```objc:Event.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Event : NSManagedObject
@property (nonatomic, retain) NSDate * timeStamp;
@end
```
```objc:Event.m
#import "Event.h"
@implementation Event
@dynamic timeStamp;
@end
```

	Event+Formatterは実装済みのものです。
timeStampをformatして分のところだけを表示するようにしました。

	```objc:Event+Formatter.h
@interface Event (Formatter)
-(NSString *)formatted;
@end
```

	```objc:Event+Formatter.m
	#import "Event+Formatter.h"
	@implementation Event (Formatter)
	-(NSString *)formatted{
    	NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    	[formatter setDateFormat:@"mm"];
    	NSString *dateString = [formatter stringFromDate:self.timeStamp];
    	return dateString;
	}
	@end
	```

4. MasterViewController.mでEvent+Formatterを呼び出す。

	MasterViewController.mを適宜編集する。
これだけで、modelから自分で定義したmethodが呼び出せるようになります。

	```objc:MasterViewController.m
#import "Event.h" //13行目あたり
#import "Event+Formatter.h" 
```

	```objc:MasterViewController.m
-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{//220行前後あたり
//    NSManagedObject *object = [self.fetchedResultsController　objectAtIndexPath:indexPath];
//    cell.textLabel.text = [[object valueForKey:@"timeStamp"] description];
    Event *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [object formatted];
}

	```








------------
###iOSのひな形

![iOSシミュレータのスクリーンショット 2013.05.27 17.39.31.png](https://qiita-image-store.s3.amazonaws.com/0/6561/2fec1398-6511-8000-16c2-37f5495303fd.png "iOSシミュレータのスクリーンショット 2013.05.27 17.39.31.png")

------------
###カテゴリーでメソッドを呼び出した版

フォーマットされて、分だけの表示になっている。

![iOSシミュレータのスクリーンショット 2013.05.27 17.42.31.png](https://qiita-image-store.s3.amazonaws.com/0/6561/423dc583-afad-c0cf-a188-ce09fcbf37aa.png "iOSシミュレータのスクリーンショット 2013.05.27 17.42.31.png")
ぱすわーどつくるよ！

```python:gen-pass.py
# Python3 fileencoding: utf-8

from argparse import ArgumentParser
from os import urandom
from string import printable, ascii_letters, digits


def option_parse():
    parser = ArgumentParser()
    parser.add_argument("length", type=int, nargs="?", default=12)
    parser.add_argument(
        "-c", "--charset", choices="na",
        help="a = alphabets, n = a + nums, default is printables."
    )
    return parser.parse_args()


def generate(charset, passlen):
    chars = printable[:-5]
    if charset == "a":
        chars = ascii_letters
    elif charset == "n":
        chars = digits + ascii_letters
    password = ""
    while len(password) < passlen:
        s = urandom(1)[0]
        # if Python2.x
        # s = ord(urandom(1)[0])
        if s < len(chars):
            password += chars[s]
    return password


if __name__ == "__main__":
    options = option_parse()
    charset = options.charset
    length = options.length
    print(generate(charset, length))
```

-h でヘルプ出るよ．-l で長さ指定して -c で使う文字の集合指定するよ．

```
$ python3 gen-pass.py -h
usage: gen-pass.py [-h] [-c {n,a}] [length]

positional arguments:
  length

optional arguments:
  -h, --help            show this help message and exit
  -c {n,a}, --charset {n,a}
                        a = alphabets, n = a + nums, default is printables.
$ python3 gen-pass.py
B1h(=,qW;ClW
$ python3 gen-pass.py 24 -c n
wup4sGyAb1GHp7ajE9PL5Vk0
$
```
pythonの軽量framework, Bottle

偶然pythonを使って簡単なweb applicationを作ることになったので使ってみた。

求めるものとしては

- 導入が簡単
- routingなどの最低限の機能
- template

があればよかった。ちょうど探してみるとBottleというのが良さげだったのでメモ代わりに。

とりあえずpython自体も初めて使うのでpythonのインストールから

python2系か3系か、どっちを使えばいいのかすら分からなかったのでとりあえず複数の環境を持てるpyenvを使うことに。


pyenvのinstall

```  Bash
cd ~
git clone git://github.com/yyuu/pyenv.git .pyenv

echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.zshrc
echo 'eval "$(plenv init -)"' >> ~/.zshrc
exec $SHELL -l
```

とりあえず2.7系を入れる
pip(gemみたいな?)も一緒に入ってくれるので便利

``` Bash
pyenv install 2.7.5
```

そしたらreadlineがないって言われたのでhomebrewでinstall

``` Bash
brew install readline
brew link readline
```

common problemらしく、[ここ](https://github.com/yyuu/pyenv/wiki/Common-build-problems)に他にもいろいろ書いてある


とりあえず入ったのでBottleを使う

``` Bash
pip install bottle
```
で入る。

bottleは`bottle.py`という1ファイルがすべて。そこから必要なものをimportしながら使っていくらしい。

とりあえずhello world(sampleそのまま)

``` python:hello.py
from bottle import route, run

@route('/hello/:name')
def hello(name):
	return '<h1>Hello %s!</h1>' % name

run(host='localhost', port=8080)
```

これでコマンドライン上で

``` Bash
python hello.py
```

これで [locahost:8080/hello/tak0303](locahost:8080/hello/tak0303) にアクセスすると、
`Hello tak0303!` となる。簡単。

htmlでtemplateを使いたいときは同じディレクトリに`views`というフォルダを作って、そこに入れる。

```html:show.tpl(拡張子はなんでもいいらしい)
<h1>{{name}}</h1>
```

``` python:hello.py
from bottle import route, run, template

@route('/hello/<name>')
def hello(name='unknown'):
	return template('show', name=name)

run(host='localhost', port=8080)
```
こんな感じでできる


あと、最初の状態だと、ファイルの変更時にサーバを再起動しなければならず、また、デバッグしづらく、かなり不便なので

``` Python:
run(host='localhost', port=8080, debug=True, reloader=True)
```
こうすることでブラウザ上にエラーが表示されるのと、ファイルの変更時に自動的にサーバを再起動してくれる。


参考: [http://bottlepy.org/docs/dev/index.html](http://bottlepy.org/docs/dev/index.html)
ESXi＋vyattaで仮想マシンをDHCPで使う

ESXiのなかに複数のVMを放り込んでおきたいけど、IPをたくさん用意するのがめんどいからDHCPで使用したいときの設定。
VMWare Serverだとかんたーんなんだけど、ESXiになったとたんちょっとハードルがあがる。
とりあえず対策はvyattaでDHCPサーバ＋NATしてvyatta経由で外と接続するための最低限の設定。
192.168.11.0/24がプライベートセグメント。
vyatta用のnicはManagementNetworkとは別に用意。（じゃないとESXiとsshが競合しちゃうし）

まずvSpere Clientコンソールは使いにくい（素のままじゃコピペできない）ので、さっさとSSHログインしてリモートから設定できるようにする。
■インターフェースとGWを設定、SSHのサービスを起動
vyatta@vyatta:~$ configure
vyatta@vyatta# set interfaces ethernet eth0 address 192.168.XXX.XXX/24
vyatta@vyatta# set system gateway-address 192.168.XXX.XXX
vyatta@vyatta# set interfaces ethernet eth1 address 192.168.11.254/24
vyatta@vyatta# set service ssh
vyatta@vyatta# commit
vyatta@vyatta# save

こっから先はsshでログインして。
■タイムゾーンの設定
vyatta@vyatta# set system time-zone Asia/Tokyo
vyatta@vyatta# commit
vyatta@vyatta# save

■dhcpサーバを動かしておく。
vyatta@vyatta# set service dhcp-server shared-network-name ETH1POOL subnet 192.168.11.0/24 start 192.168.11.1 stop 192.168.11.99
vyatta@vyatta# set service dhcp-server shared-network-name ETH1POOL subnet 192.168.11.0/24 default-router 192.168.11.254
vyatta@vyatta# set service dhcp-server shared-network-name ETH1POOL subnet 192.168.11.0/24 dns-server 192.168.11.254
vyatta@vyatta# set service dhcp-server shared-network-name ETH1POOL subnet 192.168.11.0/24 lease 86400
vyatta@vyatta# commit
vyatta@vyatta# save

■DHCPでふったアドレスをnatで外に出す
vyatta@vyatta# set nat source rule 10
vyatta@vyatta# set nat source rule 10 source address 192.168.11.0/24
vyatta@vyatta# set nat source rule 10 outbound-interface eth0
vyatta@vyatta# set nat source rule 10 translation address masquerade
vyatta@vyatta# commit
vyatta@vyatta# save

参考
http://sakananohone.servehttp.com/it/it00040/it00040.html
http://www.virment.com/?p=8
inline-blockで横並びした時の隙間を消す

あの隙間はletter-spacingで消せます。
これは便利。

```css:qiita.css
ul {
	text-align: center;
	letter-spacing: -.40em; /* 文字間を詰めて隙間を削除する */
}

li {
	display: inline-block;
	letter-spacing: normal; /* 文字間を通常に戻す */
}
```


ソース：[inline-blockを並べた場合に発生する「隙間」を消去するCSS](http://inspire-tech.jp/2011/06/inline_block_spaces/ "inline-blockを並べた場合に発生する「隙間」を消去するCSS")
Backbone.jsのRouterで規定のハッシュにマッチしなかった場合をハンドリングする

```javascript
Router = Backbone.Router.extend({
    routes: {
        '': 'index',
        'hoge': 'hoge',
        '*hash': 'default'
    },
    default: function(hash) {
        console.debug('default', hash);
    },
    index: function() {
        console.debug('index');
    },
    hoge: function() {
        console.debug('hoge');
    }
});

$(document).ready(function() {
    window.router = window.router || new Router();
    Backbone.history.start();
});
```
DoctrineのHYDRATE Typeの可視化

Doctrineを使っていて、よくどの結果だか忘れるので、
Array系で返ってくるHYDRATEを可視化しました。

![HYDRATE結果.png](https://qiita-image-store.s3.amazonaws.com/0/24564/b7eb393c-f534-9896-48ad-c90af7e89ce0.png)
Jenkinsを再インストール

Jenkinsは終了しておく。
クリーン状態にするには、以下を削除して、Jenkinsを再インストール。
    


* /var/cache/jenkins
* /var/lib/jenkins/


-----    
    
     # yum check-update
     # yum update

     # yum clean all
     # yum remove jenkins
    
ここで、以下の様なバックアップしといたよ。って内容のメッセージが出る

>警告: /etc/yum.repos.d/jenkins.repo は /etc/yum.repos.d/jenkins.repo.rpmsave として保存されました。
    
>警告: /etc/sysconfig/jenkins は /etc/sysconfig/jenkins.rpmsave として保存されました。

が、使わないので、削除する。（コマンドは省略）
    

###再インストール
（参照：http://pkg.jenkins-ci.org/redhat/）

     # yum clean all
     # wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
     # rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
     # yum install -y jenkins
     # service jenkins start

http://localhost:8080/
にアクセスして、いつものオッサンを確認。 
     
当然ながら、各種ジョブはなくなってクリーンな状態になってます。
特定のパッケージをyumのアップデート対象から外す


```/etc/yum.conf
exclude=パッケージ名
```

ワイルドカードを使用することも可能

```/etc/yum.conf
exclude=kernel*
```

とする。また、複数の場合はスペース区切りで以下の用に指定。

```/etc/yum.conf
exclude=mongo* redis*
```

上記のように設定することで、yumのアップデート対象のパッケージにでてこなくなる。

```
$ yum check-update
```
chefspecのattributesをassertする

cookbookをごりごり共通化していると、attributesを多用することになりがちです。
attributesを使うメリットはnode, role等から上書きできる、つまり、cookbookを利用する段になって、値を上書き出来る事です。

故に定義できる場所もattributesの他、role, node, environment等多岐に渡る上、その値を利用してrecipeで加工している場合など、書いている自分すらよくわからなくなってしまいがちです。

というわけで、chefのattributesをassertするようなテストを書きます。

```ruby:attribute_assert_recipe
if hofe == foo
  node.set[:your][:attribute] = xxxx
else
  node.set[:your][:attribute] = "value!"
end
```

こんな感じでrecipe内で分岐してattributeをセットしているとき...

```ruby:chefspec_attribute_assert
describe 'chefspec sample' do
  let (:chef_run) do
    chef_run = ChefSpec::ChefRunner.new.converge 'attribute::assert'
  end
  it 'assert attribute' do
    expect(chef_run.node[:your][:attribute]).to eql "value!"
  end
end
```

このような感じでattributeの値を取得してassertする事ができます。
EGitには装備されていないために使うGitコマンド(備忘録)

リモートブランチの削除(push)

GitHubに削除する場合

リモートブランチの確認

$ git branch -r
  origin/test_branch_2
  origin/test_branch_1
  origin/master

削除したいブランチをpush
※空のブランチをpushするってのがポイント

$ git push origin :test_branch_2


タグ作成とリモートへのpush
$ git tag test_tag
$ git push origin test_tag

全てのタグを一変にpushするときは以下でも可能
$ git push --tags origin

ローカルとリモートからタグを削除
※ブランチのときと同様、空のタグをpushするのがポイント
$ git tag -d test_tag
$ git push origin :refs/tags/test_tag
Rails 3.2 ActiveRecord の自動 EXPLAIN に関するメモ

* http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails-explain/
* http://guides.rubyonrails.org/active_record_querying.html#running-explain
* config.active_record.auto_explain_threshold_in_seconds

`logging_query_plan` に与えたブロックの実行時間が閾値を超えていた場合、`EXPLAIN`の結果がログに WARN レベルで記録される。

```ruby:activerecord-3.2.13/lib/active_record/explain.rb
    def logging_query_plan # :nodoc:
      return yield unless logger

      threshold = auto_explain_threshold_in_seconds
      current   = Thread.current
      if connection.supports_explain? && threshold && current[:available_queries_for_explain].nil?
        begin
          queries = current[:available_queries_for_explain] = []
          start = Time.now
          result = yield
          logger.warn(exec_explain(queries)) if Time.now - start > threshold
          result
        ensure
          current[:available_queries_for_explain] = nil
        end
      else
        yield
      end
    end
```

`logging_query_plan` にブロックを渡しているのは、`find_by_sql`と`to_a`である模様。

* activerecord-3.2.13/lib/active_record/querying.rb
* activerecord-3.2.13/lib/active_record/relation.rb

`find_by_sql`ではブロック内で`select_all`して得られたデータを使ってインスタンス化していて、`to_a`ではブロック内で`exec_queries`を実行している。

閾値が比較されるのは、純粋なSQL実行時間がだけではなく、ActiveRecord が必要とするモデルインスタンスを生成するまでにかかった時間も含んでいる模様。

## 余談：Rails4 の自動 EXPLAIN ##

リリースノートにあるとおり、Rails4では自動 EXPLAIN が削除された。経緯は知らない。

> Remove automatic execution of EXPLAIN queries. The option active_record.auto_explain_threshold_in_seconds is no longer used and should be removed.
> [Ruby on Rails 4.0 Release Notes](http://edgeguides.rubyonrails.org/4_0_release_notes.html)

閾値を元に自動で EXPLAIN してログに記録する機能は消えたが、explain メソッド自体は消えてない。
supports_explain? で EXPLAIN が使えるか判断でき、explain メソッドで EXPLAIN 結果を得られる。
Booコンパイラをつかって、自分で設計したプログラミング言語を.Net用に実装する。

# モチベーション

.Net (monoでも良い)上のオリジナルのプログラミング言語を作りたい。

# 方法

自分で設計したオリジナル言語からBoo構文木への変換ができれば、意味解析や実行用コード出力等は全てBooコンパイラがやってくれるはず。

[前の投稿](http://qiita.com/items/9d2a3b1e388cfebeca4c '投稿1')では、Booコンパイラパイプラインを構文解析(Parsingクラス)ステップだけにして Boo プログラムの構文木生成をしたが、今回はBooコンパイラパイプラインの中の構文解析ステップを自分言語用のコンパイラステップに置き換えて、オリジナル言語の実装をする。

# 目標とするプログラミング言語

ソースを簡単にするために、次の簡単（すぎる）言語を想定する。

```
a = 134;
> a;
b = hogehoge!; > b;
```

* Booと違ってフリーテキスト。; 記号で文を区切る。
* '=' があれば代入文。代入左辺は変数名。右辺は文字列定数直値だけ。
* '> 変数名' で変数値の出力。

# ソース

次が自分言語解析コンパイラステップのクラス。

```boo:
# 毎度のことながらこのプログラムは python ではなくて Boo ですよ。
import Boo.Lang.Parser
import Boo.Lang.Compiler
import Boo.Lang.Compiler.Steps
import Boo.Lang.Compiler.IO
import Boo.Lang.Compiler.Ast
import Boo.Lang.Compiler.Pipelines

class MyCompilerStep( ICompilerStep ):
	# コンパイラ起動時にコンテキストを受けとる
	private context as CompilerContext
	def Initialize( ctxt as CompilerContext ):
		context = ctxt

	# コンパイル実行時処理
	def Run():
		unit = context.CompileUnit
		# CompileUnit.Paramsters.Input = 入力プログラム列
		for input in context.Parameters.Input: 
			# 入力単位毎にモジュール構文木(Module)を作る。
			# モジュールに名前つけると出力名になる。
			name = input.Name;
			module = Module( LexicalInfo( name ),  name )	
			unit.Modules.Add( module )

			using r = input.Open(): # 入力を読んで解析。
				text = r.ReadToEnd()
				stmts = text.Split( char(';') )	# ';' で区切る。
				for s in stmts:
					s = s.Trim()
					continue if len(s) <= 0

					# '=' を含むなら代入文構文木をつくる。
					if s.IndexOf( '=' ) >= 0: 
						toks = s.Split( char('=') ) # '=' で左辺と右辺に分ける。
						module.Globals.Add( [|
							$(ReferenceExpression(Name:toks[0].Trim())) = $(toks[1].Trim())
						|] )
					
					# '>' で始まるなら print マクロ構文木をつくる。
					elif s.StartsWith( '>' ):
						vn = s[1:].Trim()  # '>' の後が変数名。
						module.Globals.Add( [|
							print $(ReferenceExpression(Name:vn))
						|] )
```

次は上記 MyCompilerStep を使うメインプログラム部分。

```boo
# 上のプログラムの続き

# サンプル自分言語プログラム
text = """
a = 134;
> a;
b = hogehige!; > b;
"""
c = BooCompiler()
p = c.Parameters
p.Pipeline = CompileToFile() # CompileToFile は .exe ファイル出力までするパイプライン
p.Pipeline.Replace( Parsing, MyCompilerStep() )  # Parsing クラスのコンパイラステップを自分のコンパイラステップに置き換え。
p.Input.Add( StringInput( "test1", text ) )  # テキストファイル入力なら FileInput("ファイルパス")。
ctxt = c.Run()
```

実行すると test1.exe ができる( "test1" は上記コード中で StringInput の名前として指定。FileInput() なら入力ファイル名になる)。それを実行した出力結果は次になる。

``` 
134
hogehige!
```

## 注意点

* 自分言語のコンパイルエラーを実装するなら、context.Errors にエラーを追加する。raise や assert を使うと一律 internal compiler error になるので注意。
* コンパイルエラーに正しくソース上の位置を表示させたり、デバッガで自分言語ソースをきちんとポイントさせたいなら、生成する構文木(Boo.Compiler.Ast.Nodeクラス)の LexicalInfo プロパティに、対応する入力テキスト上の位置を設定する。例えば上記最後の '>' 命令のところなら次のようにする。

```boo
node = [|
	print $(ReferenceExpression(Name:vn))
|]
node.LexicalInfo = LexicalInfo( name, 行番号 )  # '行番号' は適当になんとかする。
module.Globals.Add( node )
```

# 結論

エラー処理など全くしない簡単すぎる例だが、文字列の解析＋構文木生成＋αで .Net 用のプログラミング言語を作れるのはとても楽だと思う（言語処理系の実装でメンドクサイ部分は意味解析、コード出力、最適化なので）。

# 予告

Unityscript/C#/Boo のどれでもない自分言語を Unity 上の開発言語にできるようにしてみる。
Cloudera Impala installメモ

CDH4.2.1のHadoop、HBaseがインストールされている前提。

1. /etc/apt/source.list.dに http://archive.cloudera.com/impala/ubuntu/precise/amd64/impala/cloudera.list をwget で投げ込む
2. sudo aptitude update
3. sudo aptitude -y install impala impala-server impala-shell impala-state-store
4. sudo vi /etc/hadoop/conf/hdfs-site.xml で<pre>
  &lt;property&gt;
     &lt;name&gt;dfs.client.read.shortcircuit&lt;/name&gt;
     &lt;value&gt;true&lt;/value&gt;
  &lt;/property&gt;
  &lt;property&gt;
     &lt;name&gt;dfs.client.file-block-storage-locations.timeout&lt;/name&gt;
     &lt;value&gt;9000&lt;/value&gt;
  &lt;/property&gt;
</pre> を追記
5. sudo service impala-state-store start
6. sudo service impala-server start

確認は、
impala-shellで<pre>[localhost:21000] &gt;</pre>としてlocalhost:21000に接続できること
CDH4のUbuntu(Single Node) Installメモ

http://www.webupd8.org/2012/01/install-oracle-java-jdk-7-in-ubuntu-via.html に従い、Oracle JDKがインストールされている前提

1. visudoで /etc/sudoers に<pre>Defaults env_keep+=JAVA_HOME</pre>を追記
2. /etc/hosts の127.0.1.1を127.0.0.1に変更し、再起動。
3. <pre># ln -s /usr/lib/jvm/java-__&lt;version&gt;__-oracle /usr/lib/jvm/default-java</pre> としてシンボリックリンクを作成する。(&lt;version&gt;は6や7などのJDKのメジャーバージョン)

以降、Clouderaのドキュメントに従う。
※ sudo -u hdfs hadoop fs -mkdir /user/$USER **&&** sudo -u hdfs hadoop fs -chown $USER /user/$USER
※ sudo -u hdfs hadoop fs -mkdir /tmp **&&** sudo -u hdfs hadoop fs -chmod -R 1777 /tmp
JPEGデータからexif情報を取得する方法

とりあえず、stack over flow の情報を基に、exifデータを読み込む事が出来たので、一時的にメモ。
JPEGデータは compression quality のデータを読み込む必要があるため、URLをそのまま渡して、exifデータを読み込んだ方が早そう。後々、ImageIO,  CoreLocationについても読み込んで追加する。

###ソースコード
```objc
#import "ViewController.h"
#import <ImageIO/ImageIO.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *imgPath = [NSString stringWithFormat:@"%@/exit_test.JPG", [[NSBundle mainBundle] resourcePath]];
    CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:imgPath]), nil);
    
    NSDictionary *metadata = (NSDictionary *) CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(source, 0, NULL));
    
    //GPS Dictionary
    NSDictionary *GPSDictionary = [metadata objectForKey:(NSString *)kCGImagePropertyGPSDictionary];
}
@end
```
取得したデータ

>2013-05-27 01:33:51.685 test_exif[6363:c07] {
>    Altitude = "103.0715";
>    AltitudeRef = 0;
>    Latitude = "35.65283333333333";
>    LatitudeRef = N;
>    Longitude = "139.697";
>    LongitudeRef = E;
>    TimeStamp = "16:15:16.30";
>}
GitHub Pageでサイトを公開する

GitHub Pagesは、GitHubでHTMLなどを配置してWebサイトを公開することができる機能です。PHPなどのスクリプトは動作しませんが、Jekyllなどと組み合わせることで、Blogサイトを公開することもできます。

# アカウントを作る

もし、まだGitHubにアカウントを作っていない場合は、以下のサイトでアカウントを作ります。フリープランでも利用できます。

- [GitHub](https://github.com)

# リポジトリを作る

新しいリポジトリを作ります。この時、名前は必ず次のようにします。

> [アカウント名].github.com

![2013-05-27_01-27-20.png](https://qiita-image-store.s3.amazonaws.com/0/3977/2a44750b-8d02-f5e8-4a2b-0324579b02ec.png)

# ファイルをプッシュする

GitHubのクライアントソフトなどを使ってクローンを作り、ファイルを作成してプッシュします。

![2013-05-27_01-29-05.png](https://qiita-image-store.s3.amazonaws.com/0/3977/cf06b7c8-574c-429e-ee51-b9ebe204b4c0.png)

※ 画面は、Tower

# URLにアクセスする

後は、次のURLにアクセスすれば閲覧することができます。

> http://[アカウント名].github.com

独自ドメインを割り当てたりすることもできます。
MacにVagrant、Cent OS、apacheをインストール


手軽に仮想環境を構築できるVagrantを試しました。
VagrantでCent OSを構築、続けてCent OSにapacheをインストールして、ホストのMacからapacheのテストページを表示します。

まずVagrantのインストール。
http://downloads.vagrantup.com/ のVagrant-1.2.2.dmgをインストールしました。

インストール後、VagrantにCent OSのBoxを追加します。
BoxはVagrantで使用できる仮想環境のパッケージです。
次のサイトでBoxが配布されています(本家)。
http://www.vagrantbox.es/
また、githubでも様々なBoxがあります。
例えば「Vagrant」と「PHP」で検索すれば、Laravelの開発環境が整ったBoxなどが見つかりました。

今回は本家BoxのCent OSを追加します。
Macのターミナルから次を入力。centosという名前でBoxを追加です。
(Virtual Box用なので別途Virtual Boxはインストールが必要)

```
$ vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
```

initすると、centosの設定ファイルVagrantfileが作成されます。

```
$ vagrant init centos
```

Vagrantfileを編集して、ホストのMacから接続できるIPアドレスを設定します。
次がコメントアウトされているので、コメントを外します。

<pre>
   config.vm.network :private_network, ip: "192.168.33.10"
</pre>

centosを起動します。

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'centos'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
```

sshで接続します。

```
$ vagrant ssh
```

apacheのインストール、自動起動の設定、起動。

```
$ sudo yum install httpd
$ sudo  sudo chkconfig --level 345 httpd on
$ sudo /etc/init.d/httpd start
```

ポート80を外側からアクセスできるようにiptablesを設定。

```
$ sudo vi /etc/sysconfig/iptables
```

次の行を追加して保存します。

<pre>
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
</pre>

そしてiptablesを再起動。

```
$ sudo /etc/init.d/iptables restart
```

これでMacのブラウザから192.168.33.10にアクセスするとApacheのテストページが表示されます。
ゆるふわgit2 ～「とりあえずリポジトリ」から、必要なフォルダだけ別リポジトリに抽出～

# 対象
+ [前回](http://qiita.com/items/b3e960f48e6262f4386c)からちょっとステップアップしたい
+ なんだかちょっとgitに慣れてきた気がする
+ フォルダで管理していたファイルたちを別リポジトリとして抽出したい

という人が対象です

# 目的
## とりあえずで適当にコミットしていたリポジトリから特定のフォルダを、コミット履歴そのままに別リポジトリに切り分ける

# 注意事項
+ 元となるリポジトリの規模によっては時間がかかるので、時間に余裕があるときにやるのがいいと思います。
+ 元となるリポジトリは一切変更されませんが、最初は念のためcloneしたリポジトリでの実行をおすすめします

# 手順

gitでまるまる管理してる `/c/repos/Toriaezu/` フォルダ（抽出元リポジトリ）から、 
`source`フォルダ(`/c/repos/Toriaezu/source/`)を、
`/c/repos/source/` レポジトリへ抽出する場合
※パス形式は Windows版のSource Treeについてくるシェル(MINGW)の形式になっているので適宜読み変えてください

+ まっさらなbareリポジトリを準備する。(抽出先となるリポジトリ)
    + `git init --bare `　を　`/c/repos/source/`　で実行。
+ `/c/repos/Toriaezu/` で下記のコマンドを実行する
    + `git subtree push /c/repos/source/ master --prefix source/`
    + (git subtree push `抽出先リポジトリ` `抽出元リポジトリのpushしたいブランチ` --prefix `抽出するフォルダ`)
+ /c/repos/source/　をcloneし抽出されていることを確認

# まとめ
+ とりあえず一つのフォルダをまるまるgitで管理していても、あとから必要なフォルダだけ抽出するのはびっくりするほど簡単
+ もしかしたらあとで抽出したくなるかも、と思ったら、フォルダ構成だけしっかり管理しておけば大丈夫
+ 上記の事さえおさえておけば、もうなにもこわくない。

## おまけ
### どんなふうに抽出されるのか確認だけしたい人向け
今回この記事の確認のために作成したリポジトリ
[抽出元](https://github.com/kyanro/yf-git-2-1)
[抽出先](https://github.com/kyanro/yf-git-2-2)

上記のネットワーク
[抽出元](https://github.com/kyanro/yf-git-2-1/network)
[抽出先](https://github.com/kyanro/yf-git-2-2/network)
autojumpでディレクトリ移動を効率化する


## About autojump
カレントディレクトリに縛られずに最近移動したディレクトリを指定して移動することが出来る。

Railsのようなディレクトリ構成が地味に複雑なフレームワークを利用するときなどとても便利。
コマンドラインで新しいセッションを開いた時に既に開いているセッションのカレントディレクトリに一発で移動できたりするのも超絶便利。

## HowTo
既に`app`, `controller`, `view`というディレクトリに移動したとして、カレントディレクトリに関係なく

```
$ j con [Tab] # Tabを押すことでcontorollerが補完される
```
でそのディレクトリに移動できる。

現在移動できるディレクトリ一覧はこれで見られる。

```
$ j -s
```



## Installing
### MacPortsの場合
（多分Homeblewの場合も同様）

```
sudo port install autojump
```
途中で以下のスクリプトを`.zshrc`に追加するような支持が出るのでそのようにする。

```
export FPATH="$FPATH:/opt/local/share/zsh/site-functions/"
if [ -f /opt/local/etc/profile.d/autojump.zsh ]; then
    . /opt/local/etc/profile.d/autojump.zsh
fi
```

補完が聞かない等の不具合が出る場合は以下の命令を上記スクリプトの下に追記する。

```
autoload -U compinit && compinit
```
俺的Go研まとめ 一覧


追記：
ここにまとめられている内容は[githubのリポジトリ](https://github.com/goken/goken)に移動しました。

Go研を個人的にまとめています。
随時更新していきます。

* [vol.0](http://qiita.com/items/061e3bdf37e1a2454fbf) 2013/04/24
* [vol.1](http://qiita.com/private/ce053f1ff89b9f7ae4cd) 2013/05/15
Spinachの紹介

GitLabのテストは、もともとは[Cucumber](https://github.com/cucumber/cucumber)で記述されていましたが、可読性に優れているということで[Spinach](https://github.com/codegram/spinach)で全面的に書き直されました。
Spinachについては日本語の情報がほとんどないので、参考までにCucumberからSpinachに書き直された際のPull Requestを紹介します。

- [Cucumber ⇒ Spinach](https://github.com/gitlabhq/gitlabhq/pull/1426)

蛇足ですが、日本語に訳すとCucumberは「きゅうり」でSpinachは「ほうれん草」となります。
0 と 1 で保存されたフィールドを'True'、'False' の文字列で取得する。

#概要
フラグを1,0で管理している項目を、
ASP.NET のGridView のチェックボックスにそのまま読み込もうとしたら、
True,False で判定できずにエラーで落ちました。

対応として、
無理やりSQLサーバ 側でTRUE,FALSEの文字列を返すようにしました。

#サーバ構成：
　Windows Server
　ASP.NET (VB.NET、ODBC接続）
　Postgresql

#経緯
Google先生に聞いてみると、
REPLACEとか、Translateとかあったけど、自分の環境ではうまく動きませんでした。
何かの設定かもしれないけど、ODBC接続していて、ODBCで使えるスカラ関数の一覧を
見つけることができず、賢いやり方は諦めて、、、
えいやっとPostgreSQLに関数自作して対応しちゃったＹＯＯ

#ソース
```sql:関数の作成内容(IS_TRUE)
/*------------------------------------------------------------*
* IS_TRUE
*
* 1だったらTrueの文字列を返し、それ以外はFalseを返す関数。
*
* 2013 KurokoSin
*------------------------------------------------------------*/
DROP FUNCTION IS_TRUE( BIGINT );

CREATE FUNCTION IS_TRUE( BIGINT ) RETURNS VARCHAR AS '
DECLARE
    is_one ALIAS FOR $1;
    rtn VARCHAR(5);
BEGIN
    rtn = FALSE::varchar;
    IF (is_one IS NOT NULL and is_one = 1) THEN
        rtn = TRUE::varchar;
    END IF;

    RETURN rtn;
END;
' LANGUAGE 'plpgsql'; 

```

```sql:使い方
select  IS_true(h.fugafuga)
  from  hogehoge h
;
```

標準の関数とか、もっといいやり方があれば教えて下さい。