OmniAICreator/Qiita-1.07M huggingface dataset:
「第3回オフラインリアルタイムどう書くの問題」をPHPで解く

http://nabetani.sakura.ne.jp/hena/ord3ynode/
第3回はqiitaの記事がないようです。

左右後ろに進み、どのような道筋を辿ったかを算出します。

```php
<?php

	class YNODE{
		
		// 次の方向
		private $next = [
			'BA' => ['r'=>'C', 'l'=>'D'], 'CA' => ['r'=>'D', 'l'=>'B'], 'DA' => ['r'=>'B', 'l'=>'C'],
			'AB' => ['r'=>'E', 'l'=>'C'], 'CB' => ['r'=>'A', 'l'=>'E'], 'EB' => ['r'=>'C', 'l'=>'A'],
			'AC' => ['r'=>'B', 'l'=>'F'], 'BC' => ['r'=>'F', 'l'=>'A'], 'FC' => ['r'=>'A', 'l'=>'B'],
			'AD' => ['r'=>'F', 'l'=>'E'], 'ED' => ['r'=>'A', 'l'=>'F'], 'FD' => ['r'=>'E', 'l'=>'A'],
			'BE' => ['r'=>'D', 'l'=>'F'], 'DE' => ['r'=>'F', 'l'=>'B'], 'FE' => ['r'=>'B', 'l'=>'D'],
			'CF' => ['r'=>'E', 'l'=>'D'], 'DF' => ['r'=>'C', 'l'=>'E'], 'EF' => ['r'=>'D', 'l'=>'C'],
		];
		
		/**
		* 進んだルートを求める
		* @param  String 「rrrrbllrlrbrbrr」みたいな文字
		* @return String 「ACBACABCFDEDADFC」みたいな数値
		*/
		public function get($input){
			// 現在進んでる方向
			$nowRoute = 'BA';
			// 返り値
			$ret = 'A';
			
			for($i=0; $i<strlen($input); $i++){
				// bだったら後ろに戻る
				if($input[$i] === 'b'){
					$ret .= $nowRoute[0];
					$nowRoute = strrev($nowRoute);
					continue;
				}
				
				// 次に進む
				$next = $this->next[$nowRoute][$input[$i]];
				$ret .= $next;
				$nowRoute = $nowRoute[1] . $next;
			}
			
			return $ret;
		}
		
	}
	
	// テスト
	$test = [
		['b', 'AB'],
		/* 省略 */
	];

	$ynode = new YNODE();
	foreach($test as $key=>$data){
		$answer = $ynode->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

全方向を持たせておくという原始的方法で解決。
'BA'が決まれば'CA''DA'は傾ければいいだけなので算出は可能なのですが、面倒になったのでもういいやー的な。
後ろに戻る場合も$nextに持たせておけばforループ内でわざわざ分岐する必要もないのですが、まあそちらも面倒なのでいいや的に。

かかった時間は30分程度。あっさり。
zsh ログイン時に格言を表示する

[sorin-ionescu/prezto](https://github.com/sorin-ionescu/prezto) でやってたので真似してみた。

![zsh-fortune.png](https://qiita-image-store.s3.amazonaws.com/0/10548/77c06ac0-9af8-ab4f-42b4-4e1e5289cef8.png)

# fortune コマンドをインストール

まずは格言を表示するためのコマンド `fortune` をインストールします。

以下は Mac の場合

```
$ brew install fortune
```

# zsh ログイン時に fortune を実行

`~/.zlogin` ファイルに以下のコードを追加します。
(ファイルがない場合は新規作成して下さい)

```zsh:.zlogin
# Print a random, hopefully interesting, adage.
if (( $+commands[fortune] )); then
    fortune -a
    print
fi
```

`if` 文では `fortune` コマンドの有無をチェックしています。
zsh 特有の書き方なので、`bash` や他のシェルでは `type` や `which` コマンドなどでチェックして下さい。
(zsh でも `type` や `which` でチェックしても問題ありません)

```zsh:.zlogin
# Print a random, hopefully interesting, adage.
if type fortune > /dev/null 2>&1; then
    fortune -a
    print
fi
```
print debug on Haskell

Use `unsafePerformIO`

```hs
import System.IO.Unsafe

bmi weight height  = printDebug $ weight / (height / 100)^2

bmiTell :: Double -> Double -> String

bmiTell weight height
    | bmi weight height <= skinny = "skinny"
    | bmi weight height <= normal = "normal"
    | bmi weight height <= fat    = "fat"
    where skinny = 18.5
          normal = 25.0
          fat    = 30.0

printDebug x = unsafePerformIO $ do
    print $ "bmi: " ++ (show x)
    return x

main = print $ bmiTell 65.0 171.0
```

prints:

```
"bmi: 22.229061933586404"
"bmi: 22.229061933586404"
"normal"
```
CSSをリセットした状態でIE8.jsを使うとエラーが発生する

クソハマったのでメモ。

YUI 2 Reset CSS でスタイルをリセットした状態で IE8.js を使うと、 IE6 でページを開いた時にスクリプトエラーが発生する。

どうもスタイルがリセットされてないことが前提の実装のようで、スタイルについてのプロパティ（`currentStyle`）を操作しているところで `undefined` を参照してしまいエラーが発生していた。

YUI 2 Reset CSS を使わないようにしたら、エラーが発生しなくなった。
Perl複数変数の初期化、やはりJavaみたいに変数の型は意識したいのと、きになったコト、データの構造を見るDumperの使い方

複数の変数をバスっと初期化したい場合
undefでいいなら、楽なんですが。

```pl
my ($a,$b,$c .....);
```

そして、 **undefじゃなくって** 、 **0** か **文字列** をパスパスと入れたい場合。
まぁ、めんどくさくもこうやるしかないのですかね？

```pl
my $a = 0;
my $b = 0;
my $c = 0;
```

とかやるのめんどい。

```pl
my $c = $d = $e = 0;
```

これはもう可読性が／(^o^)＼

まぁそもそもJavaみたいに、型宣言したいって気持ちが強いんですけど。。。
そうすると初期値がそれぞれ自動で違うもの入れてくれるから。

```java
int a, b, c ....;
boolean f,v,g ....;
char hoge, fuga....;
```

【インスタンス変数（メンバ変数）の型ごとのデフォ値】

| type | default value |
|:-----------------------:|:------:|
| void                       |          |
| boolean                 | false |
| char                       | 0000 |
| byte, shot, int,long | 0       |
| float, double           | 0.0    |
| 参照型                    | null    | 


詳しくは [この辺](http://www.ne.jp/asahi/hishidama/home/tech/java/type.html)



話を戻して、Perlの変数初期化の話。
そんなこんなでいろんなとこ見てたらこんなの見つけました。

```pl
my ($a, $b) = 0;
```

これは、右辺を配列と読んで、その要素を昇順に $a, $b へと入れている ということでいいのでしょうか？
で、右辺は 0 という値。。。。
$a には 0 が入り、$b にはundefが入るのではなかろうか？
みてみたらやはりこうでした。

```pl
sub main {
	my ( $a, $b ) = 0;
	print Data::Dumper->Dump([$a], ['$a']);
	print Data::Dumper->Dump([$b], ['$b']);
}
```

```pl
[oniku@yakiniku1 mino]$ perl test_mino.pl
$a = 0;
$b = undef;
```

そりゃそうだ。。。
だから、こうすればいいはず
1行にまとめられて楽ではある。

↓↓↓↓

```pl
my ($a, $b) = ( 0, 0 );
```
ElastiCacheでRedisをサポートしたのでCakePHPから使ってみた

AWSのElastiCacheでRedisがサポートされたのでCakePHPから利用した時のメモ。
ElastiCacheでRedisは今のところ2.6.3だけみたいです。

■環境
PHP5.5.1
CakrPHP2.3.8
Redis2.6.3(redis-cli用)

まずはインストールから。redis-cliという便利なものを使うためにRedisをインストール

```

### Redis
# cd /usr/local/src/
# wget http://redis.googlecode.com/files/redis-2.6.3.tar.gz
# tar zxf redis-2.6.3.tar.gz
# chown -R root.root redis-2.6.3
# cd redis-2.6.3
# make

```

次に、PHPからRedisを使うためにphpredisをインストール

```

### phpredis
# cd /usr/local/src/
# git clone https://github.com/nicolasff/phpredis.git
# cd nicolasff-phpredis-0f0661e
# phpize
# ./configure
# make && make install

```

最後に、redisを使うためにphp.iniに追記します。

```

# vi /path/php.ini
extension=redis.so
# php -m | grep redis
redis
# /etc/init.d/httpd restart

```

ここからが本題。

CakePHPのキャッシュの設定は下記ファイルで行います。
/cakephp_path/app/Config/core.php
ただ、ファイルの内容を見てもRedisについての記載がありません。
「自前で組むしかないかー」なんて思っていたけど、探してみたら用意してありました。
CakePHPさん素敵すぎます。
/cakephp_path/lib/Cake/Cache/Engine/RedisEngine.php

用意してあるならそれを使うだけ。
core.phpに下記の内容を書き足します。

```php

Cache::config('default', array(
    'engine'      => 'Redis',
    'prefix'      => null,
    'duration'    => 3600,
    'probability' => 100,
    'server'      => 'xxx.xxx.xxx.cache.amazonaws.com',
    'persistent'  => true,
    'compress'    => false,
));

```

あとは必要な箇所で呼び出すだけ。
テスト用アクションを用意してアクセスしてみます。

```php

    public function test() {
        $key = 'test_key';
		if (!$data = Cache::read($key)) {
			Cache::set('duration', '600'); // キャッシュの時間調整
			Cache::write($key, array('test' => 'hoge'));
		}
	}

```

無事にセットできたか確認するためにredis-cliを使います。

```

# /usr/local/lib/redis/src/redis-cli -h xxx.xxx.apne1.cache.amazonaws.com
redis > keys *
1) "test_key"
2) "ElastiCacheMasterReplicationTimestamp"
redis > get test_key
"a:1:{s:4:\"test\";s:4:\"hoge\";}"
redis > ttl test_key
(integer) 582

```

こんな感じで値もセットできてるし、有効期間も効いています。

ただ、Redisは多機能なのに全てをサポートできてはいなさそうなので、そこはカスタマイズしていくしかなさそうです。
-[NSTask completionHandler] はメインスレッドで実行されない

`-[NSTask completionHandler]` にセットしたブロックはメインでないスレッドで実行される。必要に応じてメインスレッドにディスパッチするとよい。

```objc
task.terminationHandler = ^(NSTask *task) {
    dispatch_async(dispatch_get_main_queue(), ^{
        doSomething();
    });
};
```
LLDB で variable not available になる現象の回避策

Xcode の LLDB で

```shell-session
 (lldb) po self.objects
```

などとするとそのオブジェクト（この場合、self.objects）の中身を出力出来たりしてデバッグの際に便利だが、これが “variable not available” となってしまうことがある。これはビルド時に最適化処理が行われているからだという。（デフォルトで有効）

これは、Build Settings にて Optimization Level を “None(-O0)” にすることで回避する事が出来る。
  
　
  
参考
http://stackoverflow.com/questions/13040777/lldb-error-variable-not-available
ec2インスタンスとの接続でknown_hostsを書き込まなくする

ec2インスタンスの実態が変わるたびに、known_hostsを削除する必要が出てきます。
めんどくさくなってGoogle検索していたら解決策がありました。

http://superuser.com/questions/237625/how-to-stop-adding-ip-from-ec2-to-known-hosts-for-ssh

~/.ssh/config に以下を記述します。

```
Host *.amazonaws.com
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null 
```

これでec2のHostKey(サーバ側のkey)をチェックしないで、クライアントのknown_hostsにも書き込みません。

ただ、 **man in the middle** が可能になります。
クライアントからサーバへの経路のどこかで、サーバをなりすますことができれば、偽物のサーバにログインしていてもクライアントは気づかないことになります。

```
クライアント <=>  悪いやつ(man) <=> サーバ
```

そのリスクを理解して設定するか、消すかです。
あとは、以下のようにコマンドラインから消すことも可能です。

```
$ssh-keygen -R "ec2-wantremovecode.amazon.com"
```
Nginx の sites-enabled と site-available の違い

何も知らずに sites-enabled に設定ファイルを作成してたんですが、正しくは

site-available ディレクトリに設定ファイルを置いといて、必要な設定だけをシンボリックリンクで sites-enabled に置くのが正しいようです。

ちなみに site-available に置いとかなくても他の場所でもOK。

Capistrano とかつかって デプロイしてる場合は ~/apps/appsname/current/config/nginx.conf へのリンクを置いといたりするみたいですね。(前回作業した時は書いてあることをそのまま真似するので精一杯でよくわかってたなかった。)
特定のファイルだけtar.gzから取り出す

ファイルを指定して取り出したほうが、全部を解凍するよりよっぽど早い。

```bash:
$ ls -lh huge_log.tar.gz <- 700MBくらい。

$ tar xzf huge_log.tar.gz logs/2013-09-09.log
```
Ubuntu12.04のMySQLクライアントをmysql5.5からmysql5.6にする


リモートのMySQLサーバに対して mysqldump を実行しようとしたら、ローカルのmysqlクライアントのバージョンが5.5でサーバが5.6だと mysqldump がエラーになるという状況に遭遇。

下記の様なエラーが発生します。

>mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_QUOTE_SHOW_CREATE=1' at line 1 (1064)

というわけで、MySQLクライアントのバージョンをあげて対処することに。

ググるといろいろややこしそうな方法がいっぱいヒットするが、たぶん下記が一番手軽だと思われる。

```
sudo apt-get remove mysql-client
sudo add-apt-repository ppa:ondrej/mysql
sudo apt-get update
sudo apt-get install mysql-client-5.6
```
アニメーションを強制的に最後のフレームにする

```csharp
Animation animation;
animation["SomeAnimation"].time = animation.clip.length;
```

Animation#[] でAnimationStateを、AnimationClip#lengthでアニメーションの秒数を取得できるっぽい。

`"SomeAnimation"` のところはインスペクタを見て名前を参照する。

## 参考

http://docs.unity3d.com/Documentation/ScriptReference/Animation.html

## もっといい方法

ありそう…
Vim使用中にShellが触りたくなった時に都度Vimを終了している人へ...

ターミナルでVim使用中にがっつりShellで操作したい、けどVimshellとか入っていないよ！


そんな場合はvimを`Ctrl+z`でバックグラウンドにして、終わったら`fg`でフォアグラウンドにしてあげればいい。


同僚が都度、vimを終了させていたりするので教えてあげたり。


######  追記
ちなみに自分はtmux使っているのでこんなことはせずウィンドウを切り替えてますが、同僚がtmuxとかscreenを使わない人なので、こんなやり方あるよって教えてみました。
ffmpeg で x264 使って2passの mp4を作ろうとするとエラー

最新付近の ffmpeg で x264 使って2passの mp4を作ろうとすると `2nd pass has more frames than 1st pass` になることがあるようです。 [2013-09-09]

とりあえず -an オプションつけて音声なしにするとエラーが解消になるかも。

別々にエンコードして後で `$ ffmpeg -i video.mp4 -i audio.aac -c copy output.mp4` して結合しましょう。

## 参考

[FFmpeg-user] Segfault for 2 pass x264 encoding
http://ffmpeg.org/pipermail/ffmpeg-user/2013-January/012754.html
NSStringの最初の文字だけ大文字にするメソッド

備忘。
NSStringの最初の文字だけ大文字にする。

```objc
// 最初の文字だけ大文字にする
-(NSString *)capitalizeFirstLetter:(NSString *)string{
	NSString *capitalisedSentence = [string stringByReplacingCharactersInRange:NSMakeRange(0,1)
																	withString:[[string  substringToIndex:1] capitalizedString]];
	return capitalisedSentence;
}
```

こちらより抜粋しました。
http://stackoverflow.com/questions/7359362/uppercase-first-letter-in-nsstring
JavaScriptでイベント機能を追加するmixin

(・Θ・) oO( mixinと言うのかどうかよくわかんないけど。 )

単純に`on`と`trigger`だけ。イベントは完全一致で検索するので（手抜き）、例えば`change:name`は`change`では拾えない。

# デモ

* http://jsfiddle.net/ginpei/Kd8S9/

# コード

```js:lib/eventer.js
// By Takanashi Ginpei; MIT License
/**
 * 
 * イベントまわりの処理。
 * @mixin
 * @sample
 * var obj = _.extend({}, _eventer, {
 *   // …
 * });
 *
 * obj.on('foo', function(a, b) {
 *   console.log(a, b, this.c);  // 'A', true, 123
 * }, { c:123 });
 * obj.trigger('A', true);
 */
var _eventer = {
    _listeners: null,

    /**
     * イベントを発火させる。
     * @param {String} type
     */
    trigger: function(type /* , ... */) {
        if (this._listeners && type in this._listeners) {
            var args = Array.prototype.slice.call(arguments, 1);
            var listeners = this._listeners[type];
            for (var i=0, l=listeners.length; i<l; i++) {
                listeners[i].apply(this, args);
            }
        }
    },

    /**
     * イベントを監視する。
     * @param {String} type
     * @param {Function} listeners
     * @param {Object} [context]
     */
    on: function(type, listener, context) {
        if (context) {
            listener = listener.bind(context);
        }

        if (!this._listeners) {
            this._listeners = {};
        }

        if (!(type in this._listeners)) {
            this._listeners[type] = [];
        }

        this._listeners[type].push(listener);
    }
};
```

```js:lib/eventer.min.js
// By Takanashi Ginpei; MIT License
var _eventer={_listeners:null,trigger:function(e){if(this._listeners&&e in this._listeners){var t=Array.prototype.slice.call(arguments,1);var n=this._listeners[e];for(var r=0,i=n.length;r<i;r++){n[r].apply(this,t)}}},on:function(e,t,n){if(n){t=t.bind(n)}if(!this._listeners){this._listeners={}}if(!(e in this._listeners)){this._listeners[e]=[]}this._listeners[e].push(t)}}
```

# 使用例

```js:demo/timer.js
// イベント処理を持つオブジェクト
var timer = Object.create(_eventer);
timer.startedAt = Date.now();
timer.el = document.getElementById('timer');
timer.update = function() {
    var elTimer = this.el;
    if (elTimer.firstChild) {
        elTimer.removeChild(elTimer.firstChild);
    }
    elTimer.appendChild(document.createTextNode(Date.now()-this.startedAt));
};

// イベント発火時の処理
timer.on('changetime', timer.update, timer);

// 定期的にイベント発火
setInterval(function() {
    timer.trigger('changetime');
}, 1);
```
ファイル削除できない

```php:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset="utf-8" />
<title>ファイル削除</title>
</head>
<body>
<?php
$sD = date('Ymd', strtotime('-3 day')); // 3日前の日付
@mkdir($sD[0]);
$csv = ("http://www//files/$sD.csv");

if (file_exists($csv)) {
  if (unlink($csv)) {
    echo "<p>$csv を削除しました。</p>";
} else {
    echo "<p>$csv を削除できませんでした。</p>";
}
} else {
    echo "<p>$csv は存在しませんでした。</p>";
}
?>
</body>
</html>
```

上記ソースにて、日付を取得してファイルを削除したいのですが、
なぜか
....存在しないファイルです。
と、なります。
パーミッションの設定も済んでいるのですが、ほかに原因がわかりません。
ご教授願います。宜しくお願い致します。
Highcharts JSで数値に桁区切りのカンマを挿入する

Highcharts JSを使っていてformatterを指定する場合などで数値を3桁区切りでカンマを打ちたいときは「Highcharts.numberFormat」を使えばよい。

* http://api.highcharts.com/highcharts#Highcharts.numberFormat()

積み上げグラフに百分率を出すなら以下のような感じ。

```js
            plotOptions: {
                column: {
                    stacking: 'normal',
                    dataLabels: {
                        formatter: function() {
                            return Highcharts.numberFormat(this.y, 0, '', ',') +' ('+ Math.round(this.y*1000/this.point.stackTotal)/10 +'%)';
                        }
                    }
                }
            },
```
要素の属性一覧を書き出す



jQueryで属性一覧をはき出せなかったのでメモ

```:js

var $el = $('<div id="get1" class="test" data-aaa="aaa"><div>');
var attrs = $el.get(0).attributes;

//underscore.js
_.each(attrs,function(a){
console.log(a.name)//属性名
console.log(a.value);//属性値
});

```
sequelizeでsqlのログを何らかのロギングモジュールで出したいとき

```js
options.logging = function(args) {
  logger.debug(args);
};

var sequelize = new Sequelize(db, username,  password, options);
```

だめなパターン

```js
options.logging = logger.debug
```

functionだけを渡せばいいじゃないかと思って試したが、だめだった。幾つかのモジュールを見た感じではdebug関数（＝ログ出力関数）の中でloggerの何かを必要とする場合が多いので、エラーになる。
jpegoptimとjhead


jpegをほげほげするコマンド

```jhead poko.jpg``` でpoko.jpgのheader情報が見える

```jhead -purejpg poko.jpg``` で不要なheader情報を削除

jpegoptimは無劣化で容量を圧縮してくれる

```  jpegoptim --strip-all poko.jpg``` で

オプションはお好みで

両方共homebrewでいれられる
DoorKeeperの新着を拾い上げてみる。


```ruby
require 'net/http'
require 'json'
require 'time'

url = URI.parse('http://api.doorkeeper.jp/events?sort=published_at')
req = Net::HTTP::Get.new(url.path)
res = Net::HTTP.start(url.host) {|http|
  http.request(req)
}
events = JSON.parse(res.body)
events.each do |event|
print <<EOF
Event: #{event["event"]["title"].to_s}
Start: #{Time.parse(event["event"]["starts_at"].to_s).getlocal}
End: #{Time.parse(event["event"]["ends_at"].to_s).getlocal}
Address: #{event["event"]["address"].to_s}
Place: #{event["event"]["venue_name"].to_s}
url: #{event["event"]["public_url"].to_s}
Description: #{event["event"]["description"].to_s.gsub(/<\/?[^>]*>/, "").gsub("\n","")}


EOF
end
```
スマートフォンサイト横画面固定

```<activity 
screenOrientation="landscape">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

上記文などで使用されている"landscape"を使用してスマートフォンで閲覧の際、サイト自体を横画面固定できますでしょうか？これを書いてもサイト自体が横画面固定されないので教えていただきたいです。
Mac MySQL5.6 インストール


MacPortsを使ったインストール記事を書いたのでメモ

http://b-index.jp/mac%E3%81%ABmysql5-6%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/
Bitbucket　wikiのページのリンクを集めたHome.mdを自動生成する（＋Jenkinsで自動化する）

# BitbucketのHome.mdを自動生成

Bitbucket使っていますか？  
個人利用では主にプライベートリポジトリとして有用だと思います。
markdown対応のissue tracketやwikiもあるので、githubとの親和性もなかなかではないでしょうか。

## 問題点：作成したページ一覧を確認する手段が用意されていない

こんな素敵なBitbucketなのですが、1点問題点があります。
私は作業ログや環境情報のログなどに、リポジトリのwikiを使ってMarkdownでメモをとって記録しているのですが、
このwiki、作成したページ一覧を確認するビューもなければ、それらしき設定もないのです。
つまり、「作成したwikiのページ名を記憶なり記録してURLに打ち込まなければそのベージに飛べない」
というわけです。  

そんなわけねーだろ！と思って必死でググったりしていたのですが、2013/09/09現在でも実装されていない模様。以下issueでは「一度作ったページ見る手段がないんだけど」「都度URLコピペするしかないんですか」的なやりとりが展開されています：  
https://bitbucket.org/site/master/issue/2659/no-way-to-see-newly-online-created-wiki

## 解決策：ファイルリストからページリストを持つHome.mdを自動生成する

本題です。要は作ったページへ飛ぶことができれば良いので、それらへのリンクをHome.mdに集めてしまいます。ざっくりとこれからやることを書くと、
1. wikiをcloneしてローカルで編集する
2. このときプログラムでHome.mdを自動生成する（scala使います）
3. git push

### wikiをクローン

詳細は飛ばしますが、Bitbucketのwikiのページでclone wikiすればOKです。

### Home.md自動生成

以下コードをコピペってMDTree.scalaなどのファイルにペーストします。
*このscalaファイルはcloneしたwikiのトップディレクトリにおいてください。*

```scala:MDTree.scala
import java.io.{ File, PrintWriter }
 
def ls_r(path: String): Seq[(String, String)] = {
  val file = new File(path)
  file.listFiles().flatMap {
    case f if f.isDirectory() => ls_r(f.getPath())
    case x => List((x.getPath(), x.getName()))
  }
}
 
def linkMarkdown(url: String, name: String) = {
  "- [" + name + "]" + "(" + url + " \"" + name + "\")"
}
 
def execute(documentRoot: String, homePageName: String): Unit = {
  val file = new File(homePageName)
  if (file.exists) file.delete()
  val homePage = new PrintWriter(homePageName)
  homePage.println("""
Wiki Indexes
=========================== 
---
""")
 
  ls_r("./").filter(_._2.endsWith(".md")).foreach { a =>
    homePage.println(linkMarkdown((documentRoot.replaceAll("/$", "") + a._1.substring(1).replace("\\", "/")).replace(".md", ""), a._2.replace(".md", "")))
    homePage.flush
 
  }
  homePage.close
}
 
execute(args(0), args(1))
```
gitでcommitする前に、

`scala https://bitbucket.org/account_name/repository_name/wiki/ Home.md`

とします。これでHome.mdは各ページへのリンクを持つMarkdownファイルとなります。このあとは例のごとくリモートへプッシュしてください。Home.mdは以下のようなイメージになります。

![mdtree.JPG](https://qiita-image-store.s3.amazonaws.com/0/17793/d579a954-7b86-20bc-07ab-4edbe668f522.jpeg)

# JenkinsでHome.md生成を自動化
もうちょい楽しましょう。上でやったscalaプログラム実行からpushの流れをJenkinsにまかせてしまいます。gitやscalaなど、必要なパッケージをひと通り揃えたら、以下のような設定のジョブを作ります

![jenkins.JPG](https://qiita-image-store.s3.amazonaws.com/0/17793/f5d131df-860b-ccba-cfab-184acbf1088d.jpeg)

ポイントは、

- SCMポーリングによってwikiの変更を感知して自動でHome.mdを再生成
- ビルドはすべでシェルで、git pull、scalaプログラムに実行、git pushまでの流れを実行

これで、Home.mdに関しては人間が気にしなくてよくなります。テスト的にSCMポーリング間隔を5分にしてますが、実際はwikiの使用頻度に合わせて調節してください。1日1回とかでもいいと思います。


##### TODO

* Home.mdのリンクに階層構造を反映
* 何らかのポリシーに基づくソート
コンストラクタを簡単に書く

なんかコンストラクタの書き方を簡単にする新文法が議論中っぽい。

https://wiki.php.net/rfc/automatic_property_initialization

```php
<?php
//こんな風に書けるとドリーム感いっぱい！？
class Point
{
      private $x, $y;      
      public function __construct($this->x, $this->y);
} 
```

気持ちはわからんでもない。こう、いくつか属性値があるクラスの場合、素直にコンストラクタを作ると代入文が続くので読みにくくなる。。

```php:こういう代入コードは不毛ですよね
<?php
class Foo
{
    private $a,$b,$c,$d;
    function __construct($a, $b, $c, $d)
    {
        $this->a = $a;
        $this->b = $b;
        $this->c = $c;
        $this->d = $d;
    }
}
```

現状のPHPでこれを多少なりとも簡略化したいなら、get_defined_vars()を使うとよい。

```php
<?php
class Foo
{
    private $a, $b, $c, $d;
    function __construct($a, $b, $c, $d)
    {
        foreach (get_defined_vars() as $key => $val) $this->$key = $val;
    }
}
```

なお、privateメンバは「_」から始めたいならちょっと加工すればOK。

```php
<?php
class Foo
{
    private $_a, $_b, $_c, $_d;
    function __construct($a, $b, $c, $d)
    {
        foreach (get_defined_vars() as $key => $val) $this->{"_$key"} = $val;
    }
}
```


ただ、個人的には読みにくいと思ってるし、代入の前に最低限バリデーションすることが多いので、あまり使っていない。
オフラインどう書く14回解答例 ( Ruby )

```rb
def solve(src)
    monsters = src.scan(/[BDFHJL]/)
    weapons = src.scan(/[acegik]/).uniq
    monsters.uniq.size.times.map { |_| 
        counter = 0 
        weapons.count { |k| 
            m, w = { 'a'=>['B','c'], 'c'=>['D','e'], 'e'=>['F','g'], 'g'=>['H','i'], 'i'=>['J','k'], 'k'=>['L','a'] }[k]
            if(monsters.include?(m))
                counter += monsters.count { |_| _ == m } 
                monsters.delete(m)
                weapons.delete_if { |_| _ == k }.push(w)
            end 
        }   
        counter
    }.reduce(0) { |s, x| s += x }.to_s
end

DATA.readlines.each do |line|
    no, src, expected = line.split(/\s+/)
    actual = solve(src)
    print "no => ", no, ", result => "
    puts actual.to_s == expected ? 'o' : 'x' 
end

__END__
0   gLDLBgBgHDaD    6
1   DBcDLaLgDBH 6
2   JJca    0
```
monster.c

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

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

int gpos(const char *s, const char c)
{
    return strchr(s, c)-s;
}

int solve(const char *in)
{
    const char  M[] = "BDFHJL",
                A[] = "acegik",
                G[] = "cegika";
    int r = 0;
    char *f = strdup(in);

    for( int i=0; f[i]; i++ ) {
        int ap = gpos(A,f[i]);
        for( int tap=-1; ap>=0; ap=tap, tap=-1 ) {
            for( int j=0; f[j]; j++ ) {
                int mp = gpos(M,f[j]);
                if(mp == ap) {
                    f[j] = 'X';
                    tap = gpos(A, G[mp]);
                    r++;
                }
            }
            if(tap==-1) break;
        }
    }
    free(f);
    return r;
}

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

int main()
{
/*0*/ test( "gLDLBgBgHDaD", "6" );    
/*1*/ test( "DBcDLaLgDBH", "6" );    
/*2*/ test( "JJca", "0" );    
/*3*/ test( "FJDLBH", "0" );    
/*4*/ test( "HJBLFDg", "6" );    
/*5*/ test( "HBaDLFJ", "6" );    
/*6*/ test( "DJaHLB", "2" );    
/*7*/ test( "gDLHJF", "3" );    
/*8*/ test( "cJFgLHD", "5" );    
/*9*/ test( "FFBJaJJ", "1" );    
/*10*/ test( "FJeJFBJ", "2" );    
/*11*/ test( "iJFFJJB", "3" );    
/*12*/ test( "JBJiLFJF", "5" );    
/*13*/ test( "JDiFLFBJJ", "8" );    
/*14*/ test( "BDFDFFDFFLLFFJFDBFDFFFFDDFaDBFFB", "28" );    
/*15*/ test( "DDFBFcBDFFFFFFLBFDFFBFLFDFDJDFDF", "24" );    
/*16*/ test( "FDLBFDDBFFFeFFFFFDFBLDDFDDFBFFJF", "16" );    
/*17*/ test( "FDBFFLFDFFDBBDFFBJDLFgDFFFDFFDFF", "0" );    
/*18*/ test( "FDiFLDFFFFBDDJDDBFBFDFFFBFFDFLFF", "31" );    
/*19*/ test( "FDFDJBLBLBFFDDFFFDFFFFFDDFBkFDFF", "30" );    
/*20*/ test( "HBkFFFFHBLH", "3" );    
/*21*/ test( "FBHHFFFHLaB", "2" );    
/*22*/ test( "LFHFBBcHFHF", "0" );    
/*23*/ test( "LFBHFFeFHBH", "7" );    
/*24*/ test( "LgFHHHBFBFF", "3" );    
/*25*/ test( "FFiFHBHLBFH", "0" );    
/*26*/ test( "BFHHFFHBeFLk", "10" );    
/*27*/ test( "FHFaBBHFHLFg", "5" );    
/*28*/ test( "FFgacaFg", "0" );    
/*29*/ test( "JHDaDcBJiiHccBHDBDH", "9" );    
/*30*/ test( "FHJJLckFckFJHDFF", "12" );    
/*31*/ test( "DeDHJHDFHJBLHDLLDHJLBDD", "22" );    
/*32*/ test( "gJLLLJgJgJLJL", "0" );    
/*33*/ test( "DaaaDDD", "0" );    
/*34*/ test( "HFeJFHiBiiBJeJBBFFB", "9" );    
/*35*/ test( "FJFFJDBHBHaLJBHJHDLHkLLLFFFgJgHJLHkJkB", "32" );    
/*36*/ test( "giFLBiBJLLJgHBFJigJJJBLHFLDLL", "23" );    
/*37*/ test( "cgkLJcLJJJJgJc", "2" );    
/*38*/ test( "LDFHJHcFBDBLJBLFLcFJcDFBL", "22" );    
/*39*/ test( "JJHHHkHJkHLJk", "1" );    
/*40*/ test( "kHHBBaBgHagHgaHBBB", "11" );    
/*41*/ test( "HDBFFDHHHDFLDcHHLFDcJD", "20" );    
/*42*/ test( "HFFFHeFFee", "7" );    
/*43*/ test( "gLLDHgDLgFL", "1" );    
/*44*/ test( "JJJBBaBBHBBHaLBHJ", "7" );    
/*45*/ test( "FBFBgJBDBDgF", "0" );    
/*46*/ test( "LLLLakakLakLL", "7" );    
/*47*/ test( "HeJHeJe", "0" );    
/*48*/ test( "LDFLBLLeBLDBBFFBLFBB", "4" );  
    return 0;
}
```
第14回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/43076 )を行っています。

問題は「眠れるモンスターを狩る」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord14linedung/
です。

URL とあまり関係ない内容なのは、いわゆる歴史的経緯というものなのでお気になさらぬよう。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
最近はやりのちょっとオシャレなNotFoundページを作ってみた

世間的には休日なのに仕事をしていると、脳の創造的活動を司る領域が破壊されていくような気がしてしまいます。

ある日見たWWFの404ページに感銘を受けて、いつか面白い404ページを作ってみたいと思っていました。
いい機会なのと、息抜きを兼ねて404 Not Foundページをちょっとファニーな感じに作ってみました。

**※注意：この投稿は技術的にためになるようなことは殆ど書いていません。**

## どんなNot Foundページを作ったの？
* 背景画像がランダムで選択されます。
* 背景画像に沿ったテキストが表示されます。
* 「404 Not Found」のテキストがランダムでアニメーションします。

## サンプルページ
https://googledrive.com/host/0B_lbKSmCQCj0eDBUQUpXVlVYeGc/404.html

ロード時間とか一切考慮していない
ブラウザ互換も全く気にしていないchromで試しただけ。

## 素材やライブラリについて
このNot Foundページを作るにあたって以下の素材・ライブラリを利用しています。

* ねこの壁紙
http://dora-neco.com/background.html
ねこです、ファニーです。
**ここの画像は個人利用のみOKです。**

* フォント
http://azukifont.com/index.html
フリーフォントです、ファンシーです。
**商用などで利用する場合は製作者に連絡が必要です。**

* Magic(css ライブラリ)
http://www.minimamente.com/magic-css3-animations/
cssだけでアニメーションを実現します、ファンキーです。

## ソースコード
```html:404.html
<html lang="ja">

<head>
	<meta charset="utf-8">
	<link rel="stylesheet" href="css/404.css">
	<link rel="stylesheet" href="css/magic.min.css">
	<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
	<title>404 Not Found</title>
</head>

<body>
	<div id="notfound">４０４ のっとふぁうんど。</div>
	<div class="fany-text" data-match-img="404-01.jpg">なんてことだ！ここにはあなたの望むページなんて存在しやしないんだ！！</div>
	<div class="fany-text" data-match-img="404-02.jpg">もう、ここは君の知っているあのページではないんだよ…</div>
	<div class="fany-text" data-match-img="404-03.jpg">ここにはページないから帰ってくれないかな？</div>
</body>

<script src="js/404.js"></script>

</html>
```

```js:404.js
;$(function() {
	// 背景画像リスト
	var img_list = [
		"404-01.jpg",
		"404-02.jpg",
		"404-03.jpg"
	];

	// 404テキストのアニメーションリスト
	var anim_list = [
		"puffin",
		"twisterInUp",
		"swashIn",
		"tinUpIn"
	];

	// 背景に表示する画像のインデックスを設定
	var img_list_index  = Math.floor(Math.random() * img_list.length);

	// 404テキストに設定するアニメーションのインデックスを設定
	var anim_list_index = Math.floor(Math.random() * anim_list.length);

	// 背景画像のcssを設定
	$("body")
		.css("background","url(./img/"+img_list[img_list_index]+") no-repeat center")
		.css("background-size","cover");

	// 404テキストのアニメーションクラスを設定
	$("#notfound").addClass("magictime "+anim_list[anim_list_index]);

	// 背景画像用のテキストを画面に表示
	$("div.fany-text").each(function() {
		var $this = $(this);
		if ($this.data("match-img") === img_list[img_list_index]) {
			setTimeout(function() { $this.fadeIn("slow"); }, 1500);
		}
	});
});
```

```css:404.css
@font-face {
  font-family: "uzura";
  src: url(../fonts/uzura.eot);
}
@font-face {
  font-family: "uzura";
  src: url(../fonts/uzura.ttf) format("truetype");
}
html,body {
	width:100%;
}
body {
	font-family: "uzura";
	text-align:center;
	vartical-align:middle;
}
#notfound {
	margin:20% 12%;
	padding:3% 0;
	font-size:4em;
	font-weight:bolder;
	background-color:rgba(255,255,255,0.7);
	border-radius:24px;
}
.fany-text {
	display:none;
	margin:0 24%;
	padding:1% 0;
	background-color:rgb(241,234,179);
}
```

## まとめ
これで、脳の創造的活動司る領域は保護された。
migemoを使ってEmacsライフを快適に

migemo というツールを知っていますか？

migemo を利用すると，IME を有効にしないでも日本語を検索できるようになります

Emacs から利用すると本当に便利なので使っていない方はみんな使いましょう

# インストール

    # Ubuntu
    sudo apt-get install cmigemo

    # Mac
    brew install cmigemo

とすればインストールできます

migemo は元々 Ruby で書かれていたようですが，最近の Ruby では動かないので C 言語で再実装された cmigemo を使うのが一般的です


# Emacs の設定

[EmacsでPATHの設定が引き継がれない問題をエレガントに解決する - Qiita [キータ]](http://qiita.com/catatsuy/items/3dda714f4c60c435bb25)

この記事を参考にあらかじめ PATH を通すようにしましょう

Emacs での設定を紹介します

```cl:migemo.el
(when (and (executable-find "cmigemo")
           (require 'migemo nil t))
  (setq migemo-options '("-q" "--emacs"))

  (setq migemo-user-dictionary nil)
  (setq migemo-regex-dictionary nil)
  (setq migemo-coding-system 'utf-8-unix)
  (load-library "migemo")
  (migemo-init)
)
```

普通に設定をしてしまうと cmigemo がインストールされていない状態で検索などができなくなってしまうので cmigemo が実行できる状態だけでこの設定が行われるようになっています

ただしこの切り分けは PATH の設定がうまくいっていないと正しく動きません

またこれだけだと migemo の辞書ファイルなどの設定ができていないので動きません

そこで環境によって追加の設定が必要になります

Mac の場合は以下のようになります

```cl:cocoa-emacs-migemo.el
(setq migemo-command "/usr/local/bin/cmigemo")

(setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict")

```

`(setq migemo-command "/usr/local/bin/cmigemo")` は PATH が正しく設定されていれば `(setq migemo-command "cmigemo")` でも問題ありません

Ubuntu の場合は以下のようになります

```cl:linux-migemo.el
(setq migemo-command "cmigemo")

(setq migemo-dictionary "/usr/share/cmigemo/utf-8/migemo-dict")
```

[init-loader.el と package.el を導入して快適 Emacs ライフ - Qiita [キータ]](http://qiita.com/catatsuy/items/5f1cd86e2522fd3384a0)

この記事を参考に環境毎に設定を分ければ，一つの設定を様々な環境で使えます

# IME を制御する

migemo を入れて検索をする場合は IME が無効でなければなりません

いちいちその制御を人間がやるのは効率的では無いので自動化しましょう

[EmacsでIMEと仲良くする - Qiita [キータ]](http://qiita.com/catatsuy/items/886f1e0632c0b2760fb4)

この記事を参考に IME の設定をしておいてください

Mac の設定は以下のようになります

```cl:cocoa-emacs-ime.el
;; emacs 起動時は英数モードから始める
(add-hook 'after-init-hook 'mac-change-language-to-us)

;; minibuffer 内は英数モードにする
(add-hook 'minibuffer-setup-hook 'mac-change-language-to-us)

;; [migemo]isearch のとき IME を英数モードにする
(add-hook 'isearch-mode-hook 'mac-change-language-to-us)
```

Ubuntu の設定は以下のようになります

```cl:linux-ibus.el
;; isearch 時はオフに
(add-hook 'isearch-mode-hook 'ibus-disable)

;; mini buffer ではオフに
(add-hook 'minibuffer-setup-hook 'ibus-disable)

;; インクリメンタル検索中のカーソル形状を変更する
(setq ibus-isearch-cursor-type 'hollow)
```

カーソル形状変更はおすすめの設定です

このようにすれば，minibuffer や検索するときに IME が自動で無効になります
EmacsでIMEと仲良くする

普段 vim を使っている方は IME との相性に悩まされることがあると思います

私は普段サーバーでは vim を使いますが，画面上に“：wq”なんて出てくると残念な気持ちになります

そんなあなたにおすすめしたい Emacs

ということで Emacs での IME の使い方をまとめておきます

# Mac の場合

Mac は Emacs にパッチを当てた方がよいです

[日本語環境のMacにEmacsをインストールする方法 - Qiita [キータ]](http://qiita.com/catatsuy/items/c3e4fe2e6c856c285880)

この記事を参考に適切な Emacs を入れてください

Mac での日本語入力は以下の記事が参考になります

[Cocoa Emacsの設定とカスタマイズ--Snow LeopardでEmacs 23 - builder by ZDNet Japan](http://builder.japan.zdnet.com/os-admin/sp_snow-leopard-09/20410802/)

それでは早速私の Google 日本語入力を使った場合の設定例を載せてみます

```cl:cocoa-emacs-ime.el
(setq default-input-method "MacOSX")

(mac-set-input-method-parameter "com.google.inputmethod.Japanese.base" `title "あ")

;; カーソルの色
(mac-set-input-method-parameter "com.google.inputmethod.Japanese.base" `cursor-color "red")
(mac-set-input-method-parameter "com.google.inputmethod.Japanese.Roman" `cursor-color "blue")

;; backslash を優先
(mac-translate-from-yen-to-backslash)
```

IME の設定ではありませんが，Mac では `\` を出力するのに Option キーを押しながら入力しないと円記号になってしまいます

プログラミングなどを行う場合，半角の円記号を打つことはありえないので `\` を優先する設定も行なっています

また IME が有効の時は赤，無効の時は青にカーソルの色が変わるようになっているので IME の状態が大変分かりやすいようになっています

# Ubuntu の場合

Ubuntu の場合はデフォルトで日本語入力に iBus を使っています

iBus を使う場合は [irie @ ウィキ - ibus.el](http://www11.atwiki.jp/s-irie/pages/21.html) を使うとうまく使うことができます

基本は公式サイトを読むのがいいのですが，一応私の設定も載せます

```cl:linux-ibus.el
(require 'ibus)
(add-hook 'after-init-hook 'ibus-mode-on)

;; C-SPC は Set Mark に使う
(ibus-define-common-key ?\C-\s nil)

;; IBusの状態によってカーソル色を変化させる
(setq ibus-cursor-color '("red" "blue" "limegreen"))

;; C-j で半角英数モードをトグルする
(ibus-define-common-key ?\C-j t)

;; カーソルの位置に予測候補を表示
(setq ibus-prediction-window-position t)

;; Undo の時に確定した位置まで戻る
(setq ibus-undo-by-committed-string t)

;; インクリメンタル検索中のカーソル形状を変更する
(setq ibus-isearch-cursor-type 'hollow)
```

特殊なところは，私は IME の切り替えのショートカットキーに C-j を利用しているのでその設定が追加されています

詳しくは公式サイトを参考にして欲しいのですが，`~/.Xresources` に以下のような設定が必要です

```:.Xresources
Emacs*useXIM: false
```

これで再起動をするか，`xrdb ~/.Xresources` を実行してください

# 設定を切り分ける

[init-loader.el と package.el を導入して快適 Emacs ライフ - Qiita [キータ]](http://qiita.com/catatsuy/items/5f1cd86e2522fd3384a0)

上の記事を参考に設定を切り分ければ，同じ設定ファイルで Mac/Ubuntu 両方で使用可能になります
git status で submodule の中までチェックさせたくない

submodule に大量の画像ファイルとか入れてる状態で git st とかするとマジで死にたくなるので。

```shell-session
git status --ignore-submodules
```
とかつけとくと早くなる。

ただし副作用として、submodule の中身に何か変更を加えても modified とかにならないので気づけない恐れがあるので注意。

※ そもそも大量の画像ファイルとか git で管理するのはどうなのか
herokuのデータベースをリセット/リストア/再構築する

herokuのデータベースは `$ rake db:drop` では再構築できない

#### データベースのリセット

```bash:
$ heroku pg:reset DATABASE
```

必要なら ` --app your_app_name` を追加

#### バックアップ/リストア (PG Backups add-on)

[PG Backups](https://devcenter.heroku.com/articles/pgbackups)

```bash:
# アドオン追加
heroku addons:add pgbackups

# マニュアルバックアップ
heroku pgbackups:capture

# バックアップの一覧
heroku pgbackups

# バックアップからデータをリストア
heroku pgbackups:restore HEROKU_POSTGRESQL_BLACK b251
```

#### データベースをローカルで再構築

[Importing/Exporting Heroku Postgres](https://devcenter.heroku.com/articles/heroku-postgres-import-export)

```bash:
# バックアップのダウンロード(URL
# URLを取得し、URLにアクセスしダウンロード
heroku pgbackups
heroku pgbackups:url b004

# ローカルのデータベースにリストア
rake db:create
pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d mydb latest.dump
```

`heroku pgbackups:url` では一時的に公開URLが作成され、しばらく後破棄されるみたい。
データの中身次第では注意が必要。

公開URLにさらされたdumpのURLがどのくらいの時間有効か1度実験したら、
**約10分後にはAccessDeniedになった**

同様の内容 http://qiita.com/awakia/items/b68acc78afad68a9dc8b

#### その他関連コマンド

```bash:
# pgコマンドヘルプ
heroku help pg

# データベースの情報確認
# 書き込み行数の確認など
# Rows:        10235/10000
heroku pg:info

# 環境の確認 (ENVの値など)
heroku config

# データベースマイグレーション
heroku run rake db:migrate
heroku run rake db:seed

# railsコンソール
heroku run console
> JunkData.delete_all

# ログ確認
heroku logs -t
```

#### 無料データベースの制限・課金

herokuの無料データベースは10000件の書き込みが許されている。`heroku pg:info`
容量が超えると通知が来る。
超えたままだと、約一週間後にINSERT(行の追加)が出来なくなる。

**行の削除、またはデータベースのリセット・再構築等をすれば継続して利用できるっぽい。**

個人のテストアプリなどで、ログとしての役しかしていないデータなどがあれば、
ローカルにbackupして、heroku上のものを消すなどすれば継続して使い続けられる。

---

最近、テストのアプリに対してSchedulerがらみで数ドルの請求が来るようになったが、
東京リージョンのための寄付のつもりで特に対策しないでいる。
Cocoa Applicationからxibを削除する。

環境
OSX 10.6.8
Xcode 4.2
##1. Cocoa Applicationを作成する。
##2. MainManu.xibを削除する。
##3. main.m
```objc:main.m
//
//  main.m
//  testxib
//
//  Created by  on 13/09/28.
//  Copyright (c) 2013 __MyCompanyName__. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "testxibAppDelegate.h"

int main(int argc, char * argv[])
{
    testxibAppDelegate * delegate = [[testxibAppDelegate alloc] init];
    [[NSApplication sharedApplication] setDelegate : delegate];
    [NSApp run];
    return NSApplicationMain(argc, (const char **) argv);
}
```
##4. run
[GroovyとProcessing] 環境構築とウィンドウの表示

これから[LWJGLのチュートリアル](http://www.youtube.com/playlist?list=PL19F2453814E0E315)を見ながらGroovyとProcessingに書き換えていく

一回目は[この動画](http://www.youtube.com/watch?v=0v56I5UWrYY)


## build.gradleを書く

```groovy:build.gradle
apply plugin: 'idea'
apply plugin: 'groovy'
apply plugin: 'application'

def defaultEncoding = 'UTF-8'
def jdkVersion = '1.7'
def localJars = fileTree(dir: 'lib', includes: ['*.jar'])

sourceCompatibility = jdkVersion
targetCompatibility = jdkVersion

repositories {
	mavenCentral()
}

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.1.7'
	compile localJars
}

compileGroovy {
	groovyOptions.encoding = defaultEncoding
}

idea {
	project {
		jdkName = jdkVersion
		languageLevel = jdkVersion
	}
}
```

## Processingのjarをコピー

プロジェクト直下のlibディレクトリにダウンロードしたProcessingのcore/libraryから以下のjarをコピー

- core.jar
- gluegen-rt.jar
- gluegen-rt-natives-windows-amd64.jar
- jogl-all.jar
- jogl-all-natives-windows-amd64.jar

## コードを書く

```groovy:DisplayTest.groovy
package episode001

import groovy.swing.SwingBuilder
import processing.core.PApplet

import javax.swing.JFrame

class DisplayTest extends PApplet {

    def void setup() {
    }

    def void draw() {
        background(0, 0, 0)
    }

    def static void main(args) {
        def display = new DisplayTest()
        new SwingBuilder().frame(
                title: 'Episode 1 – Display Test',
                defaultCloseOperation: JFrame.EXIT_ON_CLOSE,
                size: [640, 480], show: true) {
            widget(display)
        }
        display.init()
    }
}
```

![grocessingGL001.png](https://qiita-image-store.s3.amazonaws.com/0/17179/c4eccb81-f791-5ec7-1951-e49bf57cced4.png)
gitでsvn exportのような事をする


gitでsvn exportのようなブランチから特定のパスへのデプロイをしたいときは、git archiveを使うのが良さそう。

git archiveはフォーマットを指定しない場合はtarになるので、パイプで出力をtarに渡す。例えばmasterブランチから/var/www/html/に配置したい場合は次のようにする。

```
$ git archive master | tar -x -C /var/www/html/
```

tarコマンドのオプションは
-xはファイルの取り出し
-Cでパスを指定

tarコマンドのオプションを工夫したり、ここには書いてないけど.gitattributesで細かく指定できそう

## 参考

【 tar 】 ファイルを書庫化・展開する（拡張子.tarなど） 
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230896/

git archive で指定ファイルを除外する
http://attonblog.blogspot.jp/2012/11/git-archive.html
カーソル位置にある単語が他にもあるか確認する普通の方法

# 方法

カーソルが単語の先頭にあるなら、`C-s C-w` で、検索対象の単語を取り込んでくれる。
後は `M-s o` で occur を実行するか、通常のインクリメンタルサーチの繰り返しの要領で、 `C-s` や `C-r` を入力して検索する。

# 応用

* `C-s C-w` の後に `C-w` を入力するたびに、取り込む単語が長くなる。

* 取り込んだ単語が長くなりすぎた場合は、 `M-e` を入力すれば、ミニバッファで修正できる。

# さらに

* 過去に入力した検索文字列のヒストリーは `M-n` `M-p` で呼び出せるし、`M-TAB` で補完できる。

* 検索文字列内の英字の大小文字の違いを無視するかどうかは、`M-c` で切り替えられる。

* 検索文字列として入力した文字列を正規表現として認識させるかどうかは、`M-r` で切り替えられる。

* hi-lock-mode の色を付加する対象としたければ、`M-s h r` を入力。色の削除は `M-s h u` を入力。

# 参考

[IncrementalSearch](http://www.emacswiki.org/emacs/IncrementalSearch)
フルパスでカレントディレクトリのファイルリスト

```
$ find `pwd` -maxdepth 1 -mindepth 1
```
指定したディレクトリ自体を含まない。
[逆引きUNIXコマンド  ファイルのフルパス名を取得する方法](http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%95%E3%83%AB%E3%83%91%E3%82%B9%E5%90%8D%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.html "逆引きUNIXコマンド  ファイルのフルパス名を取得する方法")
「第1回オフラインリアルタイムどう書くの問題」をPHPで解く

http://nabetani.sakura.ne.jp/hena/1/

三目並べの勝敗を決定します。

```php
<?php
	class TICKTACKTOE{
		
		// 勝利パターン
		private $pattern = [
			'/o..o..o|^(...){0,2}ooo|o...o...o|..o.o.o../',
			'/x..x..x|^(...){0,2}xxx|x...x...x|..x.x.x../'
		];
		// プレイヤー
		private $player = ['o', 'x'];
		
		/**
		* 三目並べ
		* @param  String 「79538246」みたいな文字列
		* @return String 「x won.」みたいな文字列
		*/
		public function get($input){
			// 9文字で打ち切り
			$input = substr($input, 0, 9);
			// 初期化
			$tick = '---------';
			
			for($i=0; $i<strlen($input); $i++){
				// 既に入っていたら負け
				if($tick[$input[$i]-1] !== '-'){
					return 'Foul : '.$this->player[($i+1)%2].' won.';
				}
				
				// 該当値をセット
				$tick[$input[$i]-1] = $this->player[$i%2];
				
				// 勝っていれば終了
				if(preg_match($this->pattern[$i%2], $tick)){
					return $this->player[$i%2].' won.';
				}
			}
			
			// 引き分け
			return 'Draw game.';
		}
	}
	
	// テスト
	$test = [
		['79538246', 'x won.'],
		['35497162193', 'x won.'],
		['61978543', 'x won.'],
		['254961323121', 'x won.'],
		['6134278187', 'x won.'],
		['4319581', 'Foul : x won.'],
		['9625663381', 'Foul : x won.'],
		['7975662', 'Foul : x won.'],
		['2368799597', 'Foul : x won.'],
		['18652368566', 'Foul : x won.'],
		['965715', 'o won.'],
		['38745796', 'o won.'],
		['371929', 'o won.'],
		['758698769', 'o won.'],
		['42683953', 'o won.'],
		['618843927', 'Foul : o won.'],
		['36535224', 'Foul : o won.'],
		['882973', 'Foul : o won.'],
		['653675681', 'Foul : o won.'],
		['9729934662', 'Foul : o won.'],
		['972651483927', 'Draw game.'],
		['5439126787', 'Draw game.'],
		['142583697', 'Draw game.'],
		['42198637563', 'Draw game.'],
		['657391482', 'Draw game.'],
	];

	$ticktacktoe = new TICKTACKTOE();
	foreach($test as $key=>$data){
		$answer = $ticktacktoe->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

なんの変哲もなく、普通に正規表現で勝利パターンを引っかけてるだけです。
[勝利パターンは8種類しかない](http://qiita.com/e0232/items/d23df3c732e3b0585ece)ので別に正規表現使わなくても十分だったりしますがまあいいや。

ちなみに「o..o..o」が縦、「^(...){0,2}ooo」が横、「o...o...o」「..o.o.o..」が斜めです。
まあ見ればわかるか。
class名を抜き出してプロダクトコードとテストコードが対になっていることを確認

```ruby:qiita.rb
product_list = []
testcode_list = []
# ファイルからclass xxを抜き出す
File.open("Program.cs").each do |paragraph|
  if  /class\s*\w*/ =~ paragraph then
  	class_list =  $&.split(/\s/)
  	product_list.push(class_list[1])
  end
end

File.open("ProgramTest.cs").each do |paragraph|
  if  /class\s*\w*/ =~ paragraph then
  	class_list =  $&.split(/\s/)
  	testcode_list = class_list[1]
	
	product_list.each{|t|
		if t == testcode_list.gsub(/Test/, "")
			print t + "\t"
			print testcode_list
			print "\n"
		end
	}	
  end
end
```
GaucheのインタプリタgoshでC-hがバックスペースにならなくて困った時

goshだけに限った話ではないと思うけど。

gosh上で\<C-h>押すと「^H」とか入力されちゃって、調べてみたら以下を発見。

[まぐろ開発日記 » Blog Archive » OS X + gosh でデリートキー（バックスペース）矢印キーがきかない](http://magro.jp/blogs/tak/archives/95)

環境は MacOS 10.7.5。
rlwrapはhomebrewでインストール。

```shell-session
$ brew search rlwrap
```
rlwrapをつけてgoshを起動する。

```shell-session
$ rlwrap gosh
```

\<C-h>でバックスペースになるし、\<C-p>で履歴も呼び出せる。
[golang]XMLを読む(SAX風)

encoding/xmlパッケージはmarshalとunmarshal以外にも
普通にXMLファイルを読むのにも使える。

```go
import (
  "encoding/xml"
  "io"
)
//io.ReaderをDecoderに渡す
d := xml.NewDecoder(reader) 
for {
		token, err := d.Token()
		if err == io.EOF {
			err = nil
			break
		}
		if err != nil {
			panic(err)
		}
		switch token.(type) {
		case xml.StartElement:
			//do something
		case xml.EndElement:
			//do something
		case xml.CharData:
			//do something
		case xml.Comment:
			//do something
		case xml.ProcInst:
			//do something
		case xml.Directive:
			//do something
		default:
			panic("unknown xml token.")
		}
}

```

strictでないHTMLを読むなら

```go
d.Strict = false
d.AutoClose = xml.HTMLAutoClose
d.Entity = xml.HTMLEntity
```

とかやると幸せになれそう。

Handler作ればSAXParserみたいのも作れる。
https://github.com/kokardy/saxlike

･･････のだけど、本当はDOM(みたいなの)が欲しい。
基数を任意に変換する

基数Xの数字Nを基数Yに変換する操作は `[#Y] X#N` で表される。例えば基数7で101の数を基数13で表すと何になるか？

```zsh
% print $(( [#13] 7#101 ))
13#3B
```

大学の授業でいじわるな基数変換の問題がでた時にサクッと解けて嬉しい。

## 合わせて読みたい

- zshmisc(1) の ARITHMETIC EVALUATION
DigitalColor Meterで抽出した色をHTMLで使える形式でクリップボードにコピーする

![Screen Shot 2013-09-27 at 10.49.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/153/9f02842b-e057-9fbf-1555-014560486e8d.png)

1. [View]->[Display Values]->[as Hexdecimal]を選択する
2. 色を取りたい地点にマウスを合わせる
3. ⇧+⌘+c でコピーする
4. 好きな場所に ⌘+v で貼り付け。すると `#DCDCDC` 形式で色が貼り付けられる

すこぶる便利
TypeScriptでState Monadを実装する

HaskellとJavaScriptの学習を兼ねて、TypeScriptでState Monadを実装してみた。
Monad理解への第１歩は、State Monadに限る（ということにしよう）。

今回の目標
----------------
TypeScriptでState Monadを実装し、副作用のないスタックを実装する。

TypeScript
----------------
<http://www.typescriptlang.org/>
  
特徴

*   Microsoft製のJavaScriptのスーパーセット
*   静的型付け言語（ジェネリックスがある!）
*   クラス
*   アロー関数式

今回は静的型付けが重要。
これがないと引数の意味が伝わらない。
今回初めて使用する。
  
State Monad(Haskell)
----------------
特徴

*   状態付き計算を保管することで、副作用を無くす。

State Monad関連の実装する部分
 
```hs:Haskell
newtype State s a = State { runState :: (s -> (a,s)) } 
```
  
```hs:Haskell
instance Monad (State s) where 
    return a = State $ \s -> (a,s)
    m >>= k  = state $ \s -> let (a, s') = runState m s
                                             in runState (k a) s'
```
  
```hs:Haskell
evalState m s = fst ( runState m s )
execState m s = snd ( runState m s )
```

```hs:Haskell
instance MonadState (State s) s where 
    get   = State $ \s -> (s,s) 
    put s = State $ \_ -> ((),s) 
```

  
State Monad(TypeScript)
----------------

まずは、runStateが最終的に返す「値」と「状態」を保持するタプルを定義する。
 
```ts:TypeScript
interface Tuple2<A,B> {
  fst: A
  snd: B
}
```
  
TypeScriptには`interface`とジェネリックスがあるので、型安全なオブジェクトが簡単に定義できる。
これで型宣言が少し楽になる

次はStateクラスを定義
 
```ts:TypeScript
class State<T,X>{
  runState: (t:T) => Tuple2<X,T>
  evalState = (t:T):X => this.runState(t).fst
  execState = (t:T):T => this.runState(t).snd
  constructor(g:(t:T) => Tuple2<X,T>){
    this.runState = g
  }
  static returns<T,X>(v:X):State<T,X>{
    return new State<T,X>((t:T) => { return {fst:v, snd:t } })
  } 
  bind<B>(f: (X) => State<T,B>):State<T,B>{
    var g = (t:T) => {
      var st = this.runState(t)
      return f(st.fst).runState(st.snd)
    }
    return new State<T,B>(g)
  }
}
```
  
Haskell版State Monadの`return`、`>>=`は、TypeScript版では`returns`、`bind`メソッドとした。
TypeScriptの静的型付けにより、引数に関数を指定しても分かりやすい。

続いて、MonadStateを実装する。
Haskell版MonadStateとほぼ一緒。。。`null`。。。が。。。
 
```ts:TypeScript
class MonadState {
  static get<T>():State<T,T> {
    var g = (t:T) => {
      return { fst: t, snd: t }
    }
    return new State<T,T>(g)
  }
  static put<T>(a:T):State<T,void> {
    var g = (t:T) => {
      return { fst: null,  snd: a }
    }
    return new State<T,void>(g)
  }
}
```

スタックの準備は完了。

スタックから取り出す関数を定義する。

```ts:TypeScript
var pop = <X>():State<X,X[]> =>
  MonadState.get<X[]>()
    .bind(e => { return MonadState.put<X[]>(e.slice(1))
                          .bind(k => State.returns(e[0])) })

```

現在の値を取得し、二番目以降のデータを保存し、先頭のデータを返す。

スタックに値を設定する関数を定義する。

```ts:TypeScript
var push = <X>(i:X):State<X,X[]> =>
  MonadState.get<X[]>()
    .bind(e => MonadState.put<X[]>([i].concat(e)))
```

テスト

```ts:TypeScript
var fnc = <X>():State<X,X[]> =>
  pop()
    .bind(e => pop())
    .bind(e => push(20))
    .bind(e => pop())
    .bind(e => push(e*5))

console.log(fnc().execState([1,2,3])) //=> [100,3]
```

期待した値が返った

まとめ
----------------
静的型付け（型推論）が良い（CoffeeScriptも静的型付けにならないものか）
TypeScriptは早期開発より、手堅さ優先の言語という印象
無駄な労力を使った気がしなくもないが、State Monadの理解が少し深まる。
しかし、let定義できないし、このままの実装では使えない（笑）
OpenCFLite on Debian/GNU Linux

クロスプラットフォームで使えるCoreFoundationの互換レイヤーを開発してる頭のおかしい人がいて必要があってそれのインストールをやった。

*http://opencflite.sourceforge.net/
    *http://sourceforge.net/projects/opencflite/

(だいぶyak shavingだった……  )


```
tar zxfv opencflite-476.19.0.tar.gz
cd opencflite-476.19.0
sudo aptitude install libicu-dev uuid-dev
git clone https://github.com/valodzka/tzcode.git
./configure --with-tz-includes=./tzcod
make -j5  && sudo make install
```
Ubuntu上にgitサーバの構築


##サーバ側

まず、git, git-daemon, sysv-rc-confをinstall

> $ sudo apt-get install git
> $ sudo apt-get install git-daemon-sysvinit
> $ sudo apt-get install sysv-rc-conf

起動有無の確認

> $ sysv-rc-conf --list |grep git
git-daemon   0:off	1:off	2:on	3:on	4:on	5:on	6:off

gitリポジトリのディレクトリを変更するなら

> /etc/default/git-daemon

の設定ファイルを変更

git-daemonの起動

> $ /etc/init.d/git-daemon start

後はレポジトリを作ってclone出来るかの確認

ここで、clone出来るはずだけどconnection refusedに引っかかっていたのでsshでpath指定してcloneしたら出来た。

sshで入ったところにgitリポジトリを作り直して

>$ mkdir project.git
>$ cd project.git
>$ git --bare init --shared

##クライアント側
###クライアント側でgitの初期設定（リモートブランチの設定等）

>$ mkdir project
>$ cd project
>$ git init
>$ echo "git test" > readme
>$ git commit -am "first commit"
>$ git remote add origin ssh://Host名/path/***.git
>$ git push origin master

※remoteをタイポしてしまったときには

>$ git remote set-url origin ssh://Host名***

で変更できる。

###clone

>$ git clone ssh://Host名/path/***.git

##参考ページ
・[Gitリモートリポジトリの作り方](http://qiita.com/nekogeruge_987/items/326ba157d5552f0076be)
・[gitプロトコルでアクセスできるgitサーバをUbuntu上に構築する](http://d.hatena.ne.jp/itmammoth/20130604/1370362997)
rails の routes.rb に書く`resources :pages`の意味

routes.rbでパスとコントローラーのメソッドを関連付けるわけですが、改めてチュートリアルを見てみたら

```
resources :pages
```

って書いてる。「なんじゃこれ？」と思ったのでドキュメントを見てみた。

> RESTfulなURLを自動生成

> resources :pages
> #     pages GET    /pages(.:format)          pages#index
> #           POST   /pages(.:format)          pages#create
> #  new_page GET    /pages/new(.:format)      pages#new
> # edit_page GET    /pages/:id/edit(.:format) pages#edit
> #      page GET    /pages/:id(.:format)      pages#show
> #           PUT    /pages/:id(.:format)      pages#update
> #           DELETE /pages/:id(.:format)      pages#destroy

あー、こんな便利な物だったのか。

## 参考

resources - リファレンス - Railsドキュメント
http://railsdoc.com/references/resources
grepでマッチした文字列を置換したい

xyzzyのgresreg のように grepでマッチした文字列を置き換えたかったので調べてみた。

## やり方

*grepは使わない方が良い*

```
find /path/to/files -type f -exec sed -i 's/oldstring/new string/g' {} \;
```

sed がファイル内のスキャンをするのでgrepでスキャンしてから渡すと二度手間らしい。

## 参考

linux - How to grep and replace - Stack Overflow
http://stackoverflow.com/questions/15402770/how-to-grep-and-replace
OSXでユーザー名を変えるとrbenvがエラーになる

Macのユーザー名を変えたらrbenvがエラーを出すようになってしまったのでその対策。

## ダメだった対策

`rbenv rehash` →効果なし
`git pull` してアップグレード → やっぱり効果なし
`find . -type f -name "*.*" -print0 | xargs -0 grep "olduser"` で旧ユーザー名を検索
→ 1000行ぐらい出てきて見なかったことにする。単純に置換するだけでも直りそうな気もするけど何か抜けがあると怖い。
`rbenv install 使ってないバージョン`
→ これするなら完全新規インストールのほうがいいよね？ と思って途中でキャンセル

## 対策
入れなおします。

`$ mv ~/.rbenv ~/.rbenvold` して あとは github の説明通りに 

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ rbenv install 2.0.0-p247
$ rbenv rehash
```
したらOK。


……「したらOK」って書いたけどインストールがなかなか終わらんので本当にOKかどうかは確認してません。まあ大丈夫でしょう。


*追記* 大丈夫でした！