OmniAICreator/Qiita-1.07M huggingface dataset:
ajaxで画面遷移無しでコメント書き込み反映

Ajax使いの方にとって特に目新しいことはしていません。

#デモ
http://www.i-yan.com/demo/ajax_comment/

#DB (MySQL)
コメントテーブルはこんな感じ。

```mysql:tbl_comment
CREATE  TABLE IF NOT EXISTS `dbname`.`tbl_comment` (
  `comment_id` BIGINT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(20) NULL ,
  `comment` VARCHAR(255) NULL ,
  `register_date` DATETIME NULL ,
  `updated_date` DATETIME NULL ,
  `invalid` TINYINT NOT NULL DEFAULT 0 ,
  `ip_address` VARCHAR(16) NULL ,
  PRIMARY KEY (`comment_id`) ,
  INDEX `sel` (`comment_id` DESC, `invalid` ASC)
)
ENGINE = InnoDB;
```

#ServerSide API (PHP)

+ comment_get.php …コメントテーブルから10件選択してJSON形式で返す
+ comment_send.php …送られたパラメータをコメントテーブルにINSERTする

#JavaScript + HTML
HTMLは "#input-names", "#input-thanks", ".comment-list-set" の3つから成る。

```html:
<div>
	<div id="input-names">
		お名前<input type="text" name="name" value="" placeholder="入力必須"><br />
		コメント<input type="textarea" name="comment" value="" placeholder="入力必須"><br />
		<input type="button" id="send-comment" value="送信">&nbsp;<span style="color: red;" id="send-comment-error"></span>
	</div>
	<div id="input-thanks" style="display: none;">
		ありがとうございました。
	</div>
	<hr class="comment-list-set" style="display: none;">
	<h3 class="comment-list-set" style="display: none;">皆様のコメント</h3>
	<div class="comment-list-set" style="display: none;" id="comment-list">
		<!--{* コメントがある場合はここにセットされる *}-->
	</div>
	<hr>
</div>
```

JavaScriptのfunctionは２つ

+ getComment() …comment_get.phpに通信を行ないコメント一覧を読み込んで表示する
+ sendComment() …comment_send.phpに通信を行う

```js:
// ドキュメントが読み込まれた際
$(document).ready(function(){
	// 送信ボタンを押したら sendComment() を実行
	$('input#send-comment').click(function(){
		sendComment();
	});
	// 既存のコメントを読み込んで表示
	getComment();
});
// コメント送信（書き込み）
function sendComment() {
	// 未入力チェック
	if (!$('input[name=name]').val()) {
		$('#send-comment-error').text('名前を入力して下さい。');
		return false;
	}
	if (!$('input[name=comment]').val()) {
		$('#send-comment-error').text('コメントを入力して下さい。');
		return false;
	}

	$.post(
		'comment_send.php',
		{
			'name': $('input[name=name]').val(),
			'comment': $('input[name=comment]').val()
		},
		function(data){
			// 書き込みが完了したら再度コメント一覧を読み込む
			getComment();
			$('#input-names').hide('slow');
			$('#input-thanks').show('slow');
		}
	);
}
// コメント一覧受信・表示
function getComment() {
	$.get(
		'comment_get.php',
		null,
		function(data){
			// コメントリスト
			$('#comment-list').html('');
			var json = JSON.parse(data);
			if (json.length >= 1) {
				var str;
				for (var i = 0, len = json.length; i < len; i++) {
					str = json[i]['name'] + 'さん　' + json[i]['comment'];
					$('#comment-list').append($('<p/>').text(str));
				}
				$('.comment-list-set').show();
			}
		}
	);
}
```

#今後
+ jQueryの通信を $.post() で行なっているためサーバエラーを拾えません。$.ajax() に書き直してエラー制御を確立
+ 表示ブロック単位でウェブページ中のあらゆる要素をAjax化する際に必要な共通化を実施
ClojureのAhead-of-timeコンパイルについて

`-main`中から`gen-class`で定義したクラスを呼びだす以下のコードを`lein run`で実行しようとするとエラーが発生する.

````````````````clojure:src/class-ns-test/core.clj
(ns class-ns-test.core)
(gen-class :name "Hello")
;; クラスを作るにはgen-class関数を使うほか, nsの中に:gen-class symbolをkeyとするmappingの形で定義することもできる.

(defn -main [& args]
  (println (Class/forName "Hello")))
````````````````

`````````shell
$ lein run
Exception in thread main java.lang.ClassNotFoundException: Hello
````````

project.cljに:aotオプションを加えるとうまくいく.

```````````clojure:project.clj
(defproject class-ns-test "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.5.1"]]
  :aot [class-ns-test.core]  ;; <==== 追加
  :main class-ns-test.core)
```````````

`````````shell
$ lein run
Hello
````````

`:aot` とは何か.


Ahead-of-time Compilation
====================================

[aot = ahead-of-time compilationについての公式ドキュメント](http://clojure.org/compilation) によると

* Clojureはon-the-fly（実行中?）にコードをJVMバイトコードにコンパイルする.
* しかし, 以下の様なケースでは事前に(ahead-of-time)コンパイルしておきたい.
  * ソースコードなしでアプリケーションを配布したい
  * アプリケーションの起動を速くしたい
  * Javaの名前ありクラスを使いたい
  * アプリケーションに実行時バイトコード変換が必要ない

aotは以下の様な方針/仕様となっている.

* Clojureの動的性質を出来るだけ失わないように設計されている
* ソースコードと生成される.classパスはJavaのclasspath規約に従う
* コンパイルはnamespace単位で指定
* fnおよびgen-classが, それぞれ1個ずつの.classファイルを生成する


また, compile関数を使うことでコード中の任意の位置でコンパイルすることも出来る. つまりproject.cljに:aotを追加する代わりに, 以下のようにも書ける.

```````clojure:src/class-ns-test/core.clj
(defn -main [& args]
  (compile 'class-ns-test.core)  ;; <==== 追加
  (println (Class/forName "Hello")))
````````
Mercurialで安全にパスワードを保存する

Mercurialでパスワードを保存するには、以下のように記述する方法があります。

```sh:~/.hgrc
[auth]
example.com.prefix = https://example.com
example.com.user = xxxxxxx
example.com.password = xxxxxxx
```

ですが、生パスワードを記述するので安全とは言えません。
そこで[Mercurial-Keyring](https://bitbucket.org/Mekk/mercurial_keyring)拡張を使います。
以下のように、この拡張を有効にしてパスワード設定を削除しておくと、初回のみパスワード入力を要求されてパスワードデータデースに保存されます。
次回からはパスワードデータデースを利用するため安全にパスワードを保管できます。

```sh:~/.hgrc
[extensions]
mercurial_keyring = /path/to/mercurial_keyring.py

[auth]
example.com.prefix = https://example.com
example.com.user = xxxxxxx
```

Windows版のTortoiseHGはこの拡張が同梱されているので、以下の設定だけで有効にできます。

```sh:Mercurial.ini
[extensions]
mercurial_keyring =
```

その他、パスワードの保存先など詳しくは[TortoiseHg v1.0.0 documentation/8.5. Mercurial-Keyring](http://tortoisehg.bitbucket.org/manual/2.8-ja/extensions.html#mercurial-keyring)に記載されているので参考にしてください。
コマンド結果をWEBブラウザで表示する君

コマンド結果をブラウザで見たかった。
と思ったけど、結果をメールで受け取ったほうが見やすい気がしてきた。

## 使い方

```bash:
$ man pager | ./web.sh

$ man pager | ./web.sh -n
-n オプションをつけると、行番号も表示。

$ ssh 192.168.87.74 tail /var/log/*log | ./web.sh
リモートのコマンド結果を表示させる場合。
```

```bash:web.sh
#!/bin/sh
TMPFILE=${HOME}/tmp.html

echo '<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"></head><body><pre>' > ${TMPFILE}


if [ "$1" = "-n" ];then
    cat -ns >> ${TMPFILE}
else
    cat -s >> ${TMPFILE}
fi
x-www-browser ${TMPFILE} 1> /dev/null
```

[download](https://github.com/tukiyo/web.sh.git)
よく使う alias 設定

メモ

### リスト

```bash:alias
alias l.='ls -d .*'
alias la='ls -A'
alias ld='ls -d'
alias ll='ls -l  --full-time'
alias ls='ls --color=auto -1 -B --group-directories-first'
alias lt='ls -lt --full-time'
```

### 編集

```bash:alias
alias vi='vi -c "set number"'
```

### ディレクトリ削除

```bash:alias
alias rmdir="rm -r"
```

### コピー

```bash:alias
alias cp="cp -p"
alias cpdir="cp -pr"
```
かんたんMacアプリ for iOSエンジニア

先日ちょっとしたMacアプリを作ったのですが、iOSアプリとの共通点や違いについて簡単にまとめてみます。

僕は業務や個人でふだんiOSアプリは作っているのですが、Macアプリは今回が初めてでした。全体としては、もちろんMac特有のお約束もあるにはあるのですが、iOSに馴れた人ならわりとすぐMacの開発が始められるという印象です。

今回作ったアプリはメニューバーに常駐するフィードリーダーで、Google Reader終了のタイミングで作りました。[見た通り](http://standmag.co)、非常にシンプルなものです。

更新された記事がレイアウトされるメインウィンドウが1枚、設定ウィンドウが1枚、インターフェースはそれくらいで、あとは記事の取得と保存にバックエンドで動くクロールマネージャがあります。

購読フィードが多い場合、クロールマネージャは適宜分割して読まれるブログを重みづけしつつ、バックグラウンドでクロールしていきます。ある程度新着がたまったら、メニューアイコンが点灯して通知してくれます。

### 共通点

なりたちとしてiOSがMac OSのサブセットなので、言語としてはもちろんSDKを構成するクラス群も多くが共通です。双方のSDKを比べると、NS接頭子のクラスはおそらくMac OS SDKからiOS SDKに移入されたもので、そのまま同じものが使えます。NSString、NSArrayなど。

UIKitはiOS固有のフレームワークで、たとえばUIViewはMac OSだとNSViewになります。新しいだけにiOSの方が微妙にリファインされている感じですが、ビューのヒエラルキーやframeでの座標指定などは同じです。

blocksやARC、オブジェクトリテラルなど、新しめの記法もiOSに限らず同様に使えます。

データモデルはCoreDataがあり、これも共通です。

なので、モデル層のライブラリなどは結構Macにも流用できます。たとえばhttp通信のAFNetworkingなども、Macで同じように使えました。

### 相違点

共通点は非常に多いのですが、Macならではの点ももちろんあります。今回気づいた範囲では、次のようなところです。

#### ウィンドウとメニュー

デスクトップアプリなので、ウィンドウとメニューバーがあります。どちらもインターフェースビルダーで作れます。ウィンドウはその上にビューを配置してアプリのプレゼンテーションを作り、メニューにはコントローラに書いたアクションを接続してやります。iOSでもおなじみの操作で、あまり迷いません。

![Xcode - コントローラ](https://qiita-image-store.s3.amazonaws.com/0/4655/b3662786-7b48-f48a-201f-d1e3a42632e5.png)

細かいところでは、ボタンの文字色を設定するところが見当たらず、ないはずないと思ってけっこう探してしまいました。MacではAttributedStringを使ってやるようです。

#### コントローラ

AppDelegateは同じですが、その先のViewControllerにあたるクラスはありません。コントローラが必要なところはNSObjectをベースに作るというやり方で、画面遷移に対応してコントローラが並んでいくiOSアプリとちょっと異なります。

今回はウィンドウ毎に作りましたが、アプリ全体で一つでも可能で、かなり自由です。コントローラを中心にUIとアクションを結んでいくやり方は同じですね。

#### Cocoa Binding

Macアプリならではという点では、Cocoa bindingというのが強力でした。これはModel - View - Controller の結合部、つなぎ目を抽象化する一種の規約というかメカニズムなんですが、その抽象化の結果、コードなしでDBのデータをテーブルビューに表示する、といったことができるようになっています。

使える場面は限られていますが、コードを書かずにデータの表示や更新ができてしまうというのはちょっと新体験で感動します。

![cocoa binding](https://qiita-image-store.s3.amazonaws.com/0/4655/3b843fd0-4178-c7af-4f73-6465b147b413.png)

上の画像は、これだけだとちょっと分かりづらいですが、Cocoa Bindingを使って購読ブログの一覧をテーブルビューに表示しています。ビュー上で編集を行うと、結果がそのままDBまで反映されます。

#### 動作確認と配布

あとは開発の周辺ですが、ちょっと作ってみて配布するというのがiOSアプリより簡単です。XcodeでRunすれば開発しているMacでアプリが動作しますし、バイナリをzipして送れば他のマシンでも動かせるし、App Storeに上げなければ審査もありません（むしろこれは、iOSの面倒くささに慣らされてしまっているのかもしれない・・）。

他方、シミュレータがないためOSのバージョン違いの確認などは面倒です。10.8と10.7でAuto Layoutの表示が微妙に違うのがわかり、旧いairを引っ張りだしてLionを入れ直したりしました。

### おまけ

ということで、iOSからMacアプリを作ってみたときに感じた共通点・相違点をまとめてみました。スマートフォンとデスクトップという違いはありますが、開発の流れとしては見た目ほどの違いはないというのが印象です。

Macユーザーは増えていますし、以前はややマイナーなイメージのあったMacアプリケーション開発も、今後はけっこう一般的になってくるかもしれません。今回のフィードリーダーもそうですが、ちょっとしたユーティリティなどを自分用に作るだけでも便利です。

おまけとして、Macのメニューバーにアイコンを出すだけの、常駐型アプリのスケルトンを上げておきます。テンプレとしてよかったらご利用ください。

メニューバーアプリのスケルトン
https://github.com/inonb/MacMenuApp

フィードリーダー Stand
http://standmag.co
「第9回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://qiita.com/Nabetani/items/7c46e8409c456e8fabd1
http://nabetani.sakura.ne.jp/hena/ord9nummake/

与えられたカードから4桁の順列を作る問題です。
解く方法は、カードから順列を作成する方法と、全数探査のふたつにおおまかにわけられるでしょう。
Rubyだとpermutationなどという反則メソッドがありますが、何故かPHPにはありません。
全数探査で解いてみます。

```php:
<?php
	class NUMMAKE{
		
		/**
		* 4桁の数を作って指定番目の値を返す
		* @param String 「13:01167」みたいな文字列
		* @return String 1109 (01167で作れる数のうち13番目)、無しの場合は「-」
		*/
		public function get($input){
			$nowCount = 0;
			
			// 入力を分解
			list($count, $tmp) = explode(':', $input);
			$tmp = str_replace('9', '6', $tmp);
			$nums = array_fill(0, 9, 0);
			for($i=0; $i<strlen($tmp); $i++){
				$nums[$tmp[$i]]++;
			}
			
			foreach(range('1000', '9999') as $int){
				$numbers = $nums;
				$str = str_replace('9', '6', $int);
				
				// 適合しなければ次に進む
				for($i=0; $i<strlen($str); $i++){
					if($numbers[$str[$i]]-- <= 0){
						continue 2;
					}
				}
				
				if(++$nowCount >= $count){
					// 規定番目がみつかった
					return (string)$int;
				}
			}
			
			// 見つからなかった
			return '-';
		}
	}
	
	// テスト
	$test = [
		['13:01167', '1109'],
		/* 省略 */
	];

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

今回は全数が9000個しかなかったので手っ取り早くforeachで回してます。
これが今度は6桁7桁の順列を作る、とかになったらカードから順列を作成する方法を取らないといけなくなるでしょう。

かかった時間は2時間程度。
最初カードから順列で作ろうとしてめんどくさいことになり、全数探査で作り直したら30分で終わったとかいう。
いまさらPHP4+Apache1.3を導入する

あまりやりたくはないのですが、お仕事的な事情でPHP4を入れないといけなくなりました。cgiで動かして同居するのもあったけど、嫌いなのでがんばってコンパイルしました。

その時のメモ

Dist: Ubuntu12.04LTS 


Apache2 + PHP5をメインにvirtualhost+proxy構成でApache1.3+PHP4にproxyする。
apache2と+php5はaptitude からどうぞ。

先にapache1.3からインストールします。

```bash
$sudo aptitude install build-essential
$ wget http://archive.apache.org/dist/httpd/apache_1.3.42.tar.bz2
$ tar bzip2 -dc apache_1.3.42.tar.bz2 | tar xvf -
$ cd apache_1.3.42
```

configureの途中で落ちるので、ライブラリをaptitudeで入れて強引にsymlinkを貼る。結局makeは通るけど、該当モジュールでエラーが起きるのでwithoutしてもよかったかも

```bash:
$ sudo aptitude install libgdbm-dev
$ ln -s /usr/include/gdbm-ndbm.h /usr/include/ndbm.h
$ ./configure --enable-module=most --enable-shared=max
$ make
```
getline周りでエラーがおきるのでさらに対応。

```bash:
$ sed -i 's/getline/apache_getline/' src/support/htdigest.c
$ sed -i 's/getline/apache_getline/' src/support/htpasswd.c
$ sed -i 's/getline/apache_getline/' src/support/logresolve.c
$ make
$ make install
```

/usr/local/apache以下にインストールされる。起動するにはapachectlをつかって行います。

```bash:
$ sudo /usr/local/apache/bin/apachectl start
```

さて、さっきのmoduleがずっこけるので設定をコメントアウト。あわせて80以外ポートにします。

```apache:/usr/local/apache/conf/httpd.conf
Listen 8080
Port 80

#LoadModule dbm_auth_module    libexec/mod_auth_dbm.so
#AddModule mod_auth_dbm.c

User www-data
Group www-data

<VirtualHost *:8080>
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www
    ServerName php4.example.com
...
</VirutalHost>


```
この２つをコメントアウトすると起動します。ポート番号は8080にして、apacheの起動ユーザーをapache2と一緒のwww-dataに指定。そうしないとちょっとlog周りでややこしくなっちゃう。


引き続きphpのインストール

```bash:
$ wget http://uk.php.net/distributions/php-4.4.9.tar.gz
$ ./configure --with-apxs=/usr/local/apache/bin/apxs --enable-mbstring   --enable-zend-multibyte --with-pgsql --with-mysql
$ make
$ make install
```

これで基本的にapache1.3のmoduleでインストールされます。
あとはapache2のvirtualhostで設定。

```apache:/etc/apache2/site-available/php4.example.com.conf
        ServerName      php4.example.com
        ProxyPass         / http://localhost:8080/
        ProxyPassReverse  / http://localhost:8080/
```

これで動くようになったけど、マジロストテクノロジーすぎるｗ
Kobitoさんにお願い：Qiitaの記事を取り込んで欲しい


KobitoさんKobitoさん。@pamingの願いを聞いてください。

MacBookAirで記事を書いて
　↓
Qiitaに投稿した
　↓
家に帰ったら編集がしたくなった
　↓
MacMiniの前に座る
　↓
KobitoではなくSafariを開いて編集する
　↑
なんだか悲しい

Qiitaに投稿した記事を、Kobitoに取り込む機能を付け加えて欲しいのです。
.frameworkを生成するテンプレ用ライブラリ作った

アプリを作るとき、フレームワークに分けられるものは分けた方がいい。そのとき、
.framework
と、それを取り込んだ
SampleCode
の2つが最低限必要だ。
そして、この2つを包括したworkspace。

だが、これらを1からポチポチ作って、ビルド設定などで時間を使うのはもったいない。
そこで、この私が作ったFrameworkTemplateを使えば、この問題は一発で解決する。
サクッといつでも気軽にライブラリが作れるって寸法だ。

これらがセットになった、基礎となるプロジェクトが以下だ。

https://github.com/adachic/FrameworkTemplate
にある。

使い方は簡単で、まず、gitで落とす。

で、

`./convert.sh <あなたのフレームワークの名前>`

これだけでいい。簡単だからぜひとも役立ててほしい。
大量のスクリーンショットを並べるブログを効率良く書く方法


絶賛改善中ではありますが、そこそこ流れが落ち着いたのでまとめておきます。以下、Macでの作業を想定していますので、Windowsの方はごめんなさい。

## スクリーンショットを撮る方法

方法は３つあります。

1.  標準のShift + command + 4 で範囲選択して撮影
2. Skitchを使って撮影
3. Google Chrome + Quick Markupを使って撮影

1は標準の方法なので特に準備無くできます。１を使う場合はスクリーンショットの保存先を変更しておくと便利でしょう。[こちら](http://takas-life.blogspot.jp/2013/03/mac.html)を参考にどうぞ。

1の弱点としてはタイマーが使えない点です。プルダウンとかの中身を撮影したい場合はこの方法が使えません。また、撮影後にモザイクを入れるとか注釈を入れるなどの加工が別作業を要するのも惜しいところ。

そこで２の登場です。Evernoteに買収される前のバージョンの方が細かいところに手が届くアプリでしたが、現在のバージョンでも良いと思います。困る点としてはEvernoteとの連携が前提のアプリのためユーザーではない人にしてみると確認のアラートがうざかったりします。

１と２については撮影し、加工をしてどこかへ保存する。。。という流れで作業を進めることになります。

3はWebアプリの撮影など限定です。機能拡張の「[QuickMarkup](https://chrome.google.com/webstore/detail/quick-markup-screen-captu/clcbnchcgjcjphmnpndoelbdhakdlfkk?hl=ja)」を利用すると範囲指定などの撮影も可能です。撮影後にぼかしを入れるなどもできました。ただしOverlayの画面ではレイヤーの関係上、正しく撮影が出来ません。また、出力されるPNGファイルがたまに恐ろしく大きいファイルになったりします。

ということで、どの方法も一長一短。決め手に欠けている状況です。
そのため、私は現在のところ状況に応じて１〜３を使い分けている感じです。

## スクリーンショット後の加工

スクリーンショットを複数の方法で撮影しているため、名前はバラバラという状況です。特定のフォルダに寄せる毎に名前を統一させて連番を手動で付けています。ちょっとどうなんだ？と思いつつも、本文を書きながらなのであまり気にならないです。

本文を書き進めながら、差し込むファイルを決めファイル名を付けて、同じファイル名を本文にも書いて行きます。

画像の採取、本文の執筆とファイル名の記載が完了したら、画像をもう一手間かけて整理します。

pngquantというソフトを利用し、画像ファイルを再圧縮かけます。こうすることで画像ファイルの品質を保ったままサイズがとても小さくなります。

pngquantのインストールはbrew経由がラクチンです。

```
$ brew install pngquant
```

私は以下のShellを用意して使ってます。

```zsh:fix.sh
pngquant ./*.png
mkdir output
mv ./*-fs8* ./output
cd output
for file in *-fs8*; 
  do mv $file `echo $file | sed 's/-fs8//'`; 
done
cd ..
mkdir before
mv ./*.png before
mv ./output/* ./
rmdir output
```
pngquantで圧縮すると、ファイル名に-fs8というのが付け加えられたファイルが生成されます。そこで、別のフォルダを作って一度そこへ移動させ、ファイル名を置換して加えられた文字を削除しています。
もとの場所にもどり、元画像をbeforeというディレクトリに移動させて、圧縮後のファイルを元の位置に戻して作業完了という流れです。

使い方は、fix.shを画像が保存されているディレクトリに作成し、ターミナルから

```
$ chmod a+x fix.sh
$ ./fix.sh
```

と実行します。

これで画像の準備は完了です。

## ブログにアップ

私はWordPressへ直接アップを行わずに[MarsEdit](http://www.red-sweater.com/marsedit/)を使っています。

このソフトを使うとオフラインでもブログが書けますし、画像をまとめてアップロードできるので便利です。

markdownで書いた本文をMarsEditで読み込み、加工後の画像を本文執筆時に書き込んだファイル名を頼りにドロップしていきます。

最後にブログに送り込んで完了です。

## 紹介＆募集

こんな流れで現在はブログを書いております。
実際に書いたブログは「[色々なクラウド上にサーバを１台作ります](http://blog.cloudninja.asia/?page_id=216)」という連載です。

連載ではクラウド上にサーバ１台を立ち上げる工程をログインから全ステップ画面付きで解説しています。今後もどんどん紹介していくので是非ご覧下さい。

あーんど、この作業はここをこうするともっと楽できるぜ！など、改善方法を思いついた方は是非コメントをお願い致します！
fluentd+bookmarkletで簡易オンラインブックマークの仕組みをつくった

fluentdにはHTTPサーバーを立ててHTTPクライアントからJSONを受け取って処理する機能がある。
ひょっとしてこれとブラウザのbookmarkletを組み合わせると便利なのでは？
さらに前述したfluent-plugin-hatena-bookmark ( http://qiita.com/yuiseki/items/ff00b3db0a2c6121f1a3 ) も組み合わせれば、はてブにクロスポストすることもできるのでは？

というわけでやってみた

```apache:
  <source>
    type http
    port 8888
    bind 0.0.0.0
    body_size_limit 32m
    keepalive_timeout 3s
  </source>
  <match bkmk.kogaidan.**>
    type copy
    <store>
      type stdout
    </store>
    <store>
      type mongo
      host localhost
      database bkmk
      collection let
    </store>
    <store>
      type hatena_bookmark
      consumer_key ****
      consumer_secret ****
      request_token ****
      request_secret ****
    </store>
  </match>
```

`<match bkmk.kogaidan.**>`のkogaidanの部分は、適当なランダム文字列に変えておくと安全。これは後程ブックマークレット側にも埋め込む必要がある。

以下、ブックマークレットの例

```js:
javascript:(function(){var json={tag:['tech','ruby'],title:document.title,url:location.href};var jsonstr=encodeURIComponent(JSON.stringify(json));var isrc='http://example.com:8888/bkmk.kogaidan?json='+jsonstr; var i=new Image();i.src=isrc;document.body.appendChild(i); })();
```

これがはてブのBookmarkletなどより便利なのは、js自体にタグが埋め込めている点。
このようなブックマークレットを事前に大量に用意しておけば、１クリックでタグを入力する手間が省ける。
コメントや時刻など、他に必要なフィールドがあれば適当に追加していくこともできそうだ。

![事前に用意すると便利](http://gyazo.com/83c5c002da50b61af70eca48fed3bc1f.png)

---------

注意してほしいのは、ブックマークレット内で呼び出しているドメイン名の部分。
ここでlocalhostなどを指定すると、ブラウザによっては外部のネットワーク上のサイトからローカルなネットワークへアクセスして怪しいことをしているのではないかと警告してくることがある（Operaはそのような挙動をする）。
そのため、ここは外部ネットワークにあるサーバーを指定するか、hostsファイルでlocalhostに適当なドメインを割り当てるなどの細工が必要。

また、fluentdはPOSTでJSONを受け取ることを期待しているのに、img要素のsrcとしてURLを指定してGETしていることにも注意が必要。
fluentdのレスポンスContent-Typeはtext/plain;なので、ブラウザによっては画像としてロードしようとするとエラーを吐くことがある（Chromeはそのような挙動をする）。
その場合は以下の記事を参考にしてfluentdのContent-Typeを書き換えれば好きにできる。

http://kozy4324.github.io/blog/2012/09/04/fluent-in-http-ex/
fluent-plugin-hatena-bookmarkつくった

いちいちgemにしてリポジトリつくるほどでもない単純なものなのでコピペではっつけておきますが

https://github.com/kkosuge/hatena-bookmark

↑このgemに依存しています。

```ruby:out_hatena_bookmark.rb
class Fluent::HatenaBookmarkOutput < Fluent::Output
  Fluent::Plugin.register_output('hatena_bookmark', self)

  config_param :consumer_key, :string
  config_param :consumer_secret, :string
  config_param :request_token, :string
  config_param :request_secret, :string

  def initialize
    super
    require 'hatena-bookmark'
  end 

  def configure(conf)
    super
    @hatebu = Hatena::Bookmark.new(
      consumer_key:    conf['consumer_key'],
      consumer_secret: conf['consumer_secret'],
      request_token:   conf['request_token'],
      request_secret:  conf['request_secret']
    )   
  end 

  def emit(tag, es, chain)
    es.each do |time, record|
      create_or_edit(record)
    end 
    chain.next
  end 

  def create_or_edit(record)
    begin
      if record['tag'].class == String
        tag = [record['tag']]
      else
        tag = record['tag']
      end
      comment = tag.map{|t| "[#{t}]"}.join('')
      res = @hatebu.create(:url => record['url'], :comment => comment)
      res_comment = res["entry"]["summary"]
      # レスポンスのsummaryが投稿した内容と同一でないとき、
      # ブックマーク済みのURLをcreateしようとしたため無視されている
      if res_comment != comment
        eid = res["entry"]["id"].split("-").last
        # 重複していないものだけtag文字列として追加する
        res_tags = res_comment.scan(/\[(.*?)\]/).map{|t| p t[0]}
        new_tags = (tag - res_tags).map{|t| "[#{t}]"}.join('')
        new_comment = "#{new_tags}#{res["entry"]["summary"]}"
        $log.info(new_comment)
        rese = @hatebu.put_edit(:eid => eid, :url => record['url'], :comment => new_comment)
      end
    rescue => e
      $log.error(e)
      $log.error('hatebu post failed')
    end
  end

end
```

これは以下のようなJSON構造がemitされてくることを期待しています。

```js:
{"tag":["tech","ruby"],"title":"hatena-bookmark | RubyGems.org | your community gem host","url":"https://rubygems.org/gems/hatena-bookmark"}
```

または

```js:
{"tag":"tech","title":"hatena-bookmark | RubyGems.org | your community gem host","url":"https://rubygems.org/gems/hatena-bookmark"}
```

titleは使ってないのであってもなくてもよい。

すでにブックマーク済みのページだった場合はタグを上書きで追加するようにした。

fluentdのin_httpのようにHTTP待ち受けする機能をつかえば、はてブのWebHook APIを受信してinputもできるようになりそうだが、いまのところ使うあてがない割には大変そうなので今回はやらない
(5)先週の小さい技術メモを全部まとめた(perl,unity,c#)

#perl
####ファイル演算子便利
 - http://www2u.biglobe.ne.jp/MAS/perl/ref/filetest.html
 - 適切なファイル情報が引けるので、existなら-eに代用出来る

　

#unity
####Object.DestroyImmediate
 - 該当のオブジェクトだけでなく、そのオブジェクトが参照してるAssetも削除してしまう(Prefabと参照関係にあったらとか
 - http://www.wallflux.com/link/167184853341463/1346967861

****

####MiniJSONのOverflowException
 - PerseするJSON文字列の構文のどこかをtypoしてる場合に起こる

****

####Bounds構造体
 - http://www.wisdomsoft.jp/45.html
 - 3D空間の範囲を指定する構造体。Rect構造体の3Dversion

　

#c\# 
####c\#のusingについて
 - 構文とディレクティブで効果が違う
 - http://msdn.microsoft.com/ja-jp/library/yh598w02(v=vs.80).aspx
 - http://msdn.microsoft.com/ja-jp/library/sf0df423(v=vs.80).aspx
 - 構文の方は、明示的に必要なくなったらGCに破棄(Dispose)する様に指定出来る

****

####call non-staic method from static
 - http://stackoverflow.com/questions/6716450/call-non-static-method-from-static-method-c-sharp
 - delegateから呼べばstaticMethodからnon-staticMethodを呼べた。

****

####列挙体やarrayで特定の要素が有るか調べたいとき
 - Collectionの中が昇順降順に並び替えられてる場合のみ,System.Array.BinarySearch使った方が速い
 - 比較する候補が300個くらいあるならBinarySearchかなという感じだけど
 - 5こしかないならContainsでいいきはする
 - 比較回数5回も比較できねーよ! BinarySearchで3回の比較になるぜ! みたいな感じ
 - 他にはIList.Countains使うのが分かりやすいかも

****

####.bundleファイルについて
 - macのパッケージングの仕組み、またはmacのshared libraryの名前
 - 前述したリソースのパッケージに使っている場合もある
 - OSXに入っているgccコンパイラには-sharedの代わりに-bundleがあるからshared library
 - https://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html#//apple_ref/doc/uid/10000123i-CH100-SW1

　

#shell
####shellのxargs
 - git ls-files --deletedでdeleteされたファイルが取れるので
 - git ls-files --deleted | xargs git rm見たいに、パイプで左辺の標準出力の結果を引数で渡せる
 - http://x68000.q-e-d.net/~68user/unix/pickup?xargs

****

####[zsh]Ctrl+wで直前の/までバックスペース
 - WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'
 - 参考：[tsakaの日記](http://d.hatena.ne.jp/tsaka/20060910/1157881880)

　

#AFXファイルとは
 - AFXファイルは主にAuto FX Photo/Graphic Edges Imageで使用されるラスターイメージファイルです。
 - 画像を加工する情報の設定ファイル的なやつっぽい
 - http://www.autofx.com/products/pge_mac/gallery2.html
HTMLファイルにテキストとしてHTMLタグを書く方法

### はじめに
* HTMLファイルにHTMLタグを書けば当然HTMLのタグとして解釈される
* HTMLとして解釈して欲しくない場合は以下のように特殊文字として書けばよい

### 記述例

```html:
<!-- こっちはHTMLのtitleタグとして解釈される -->
<title>タイトル</title>

<!-- こっちは<title>タイトル</title>と表示される -->
&lt;title&gt;タイトル&lt;/title&gt;
```

### よく使いそうな特殊文字
| 文字 | 特殊文字表記 | 備考 |
|:------ |:-------------|:--------------------|
| "<"   | &amp;lt;            | 小なり               |
| ">"   | &amp;gt;           | 大なり               |
| """    | &amp;quot;       | クォーテーション |
| "&"   | &amp;amp;       | アンパサンド      |
| "　"   | &amp;nbsp;      | スペース(空白)   |

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
ActiveRecord で手動でカラム変更後，save しても変更が反映されない


半時間ほどハマったんだよなぁ…．

ダメな例．

```works_controller.rb
@work.log << "#{Date.today.to_s}: 作業を完了しました．"
@work.save # log への変更は反映されていない！
````
良い例．

```works_controller.rb
@work.log += "#{Date.today.to_s}: 作業を完了しました．"
@work.save # log への変更が反映されている．
```

save が「変更のあったカラムのみ更新する」というエコ仕様で，カラムが変更されたかどうかの判定がこれもエコで，実際にレコードの前後の状態を比較する，なんて面倒なことはせず「代入が行われたかどうか」みたいなところでやっているらしい．
Rubyの配列操作の備忘録


以下の配列に対して色々な配列操作をしてみる。

```ruby
ary = [1,2,3,4,5]
```

## inject

eachよりもシンプルに書ける。

```ruby
# 配列の合計を計算(inject)
# ブロックの第１引数がブロック内で最後に評価した値で書き換わる
p ary.inject(0) {|sum,value| sum + value}

# 配列の合計を計算(each)
sum = 0
ary.each {|value| sum = sum + value}
p sum
```

## reduce

injectと同じ。

```ruby
# injectの別名。injectと同様の動作をする。
p ary.reduce(0) {|sum,value| sum + value}
```

## map

配列の各要素に対してブロックを実行する。

```ruby
# 配列の要素を順番に取り出し、各要素に対してブロックを実行する
p ary.map {|item| item.to_s}
p ary

p ary.map! {|item| item.to_s}
p ary
```

## collect

mapと同じ。

```ruby
# mapの別名。mapと同様の動作をする。
p ary.collect {|item| item.to_s}
p ary

p ary.collect! {|item| item.to_s}
p ary
```
適当なx86_64の勉強の仕方


```
#include <stdio.h>

void print_i(int i) {
  printf("%d\n", i);
}

int main() {
  print_i(1);
}
```

この辺をコンパイルしてみると、こんなのが作れます。

%rax %rbx %rcx %rdx %rdi %rsi %rsb %rbp 等の64bitのレジスタがあります。%raxはアキュムレータと呼ばれます。x86_64の呼び出し規約では関数の返り値が%raxに入れる事になっています。

引数も、6個くらいまでは、レジスタで渡すようになっています。それ以上の場合はスタックに積んで渡します。

x86の場合は呼び出し規約にも寄りますが、基本的にレジスタ数が少ないのでスタックに引数を積んで呼び出す事になります。

```
        ; プログラムのエリアの始まり
        .section        __TEXT,__text,regular,pure_instructions

        ; _print_iは他のプログラムからも見えます
        .globl  _print_i
        ; アラインのおまじない
        .align  4, 0x90

; 関数の始まり
; %edi に引数が入ってくるディシディシrdi rsi rdx rcx rbx rexとかだったはず
; Cのソース書いてコンパイルしてみれば分かる
; rspがスタックポインタでマシンのスタックトップを示してます。
; rbpがベースポインタといって、関数開始時のスタックポインタの位置を保存します。
; ベースポインタから上下で、ローカル変数だったり、呼び出し元の変数だったりします。
_print_i:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $16, %rsp
        ; スタックを16バイト取るおまじない

        movl    %edi, %eax
        movl    %eax, -4(%rbp)
        ; 引数をメモリに保存

        movl    -4(%rbp), %eax
        ; 引数をメモリから取り出し

        ; これ以降は可変長引数の呼び出しのゴニョゴニョ
        xorb    %cl, %cl
        leaq    L_.str(%rip), %rdx
        movq    %rdx, %rdi
        movl    %eax, %esi
        movb    %cl, %al
        callq   _printf

        ; ここから、スタックを元に戻すおまじない
        addq    $16, %rsp
        popq    %rbp
        ret ; 関数から戻る


; ここからはメイン関数
        .globl  _main
        .align  4, 0x90
_main:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $16, %rsp
        ; ここまでスタック確保


        ; 引数%ed1に1を入れて _print_iを呼び出し
        movl    $1, %eax
        movl    %eax, %edi
        callq   _print_i

        ; リターン値を設定する リターン値は %eaxに入るのです。
        movl    $0, -8(%rbp)
        movl    -8(%rbp), %eax
        movl    %eax, -4(%rbp)
        movl    -4(%rbp), %eax

        ; ここからスタック解放
        addq    $16, %rsp
        popq    %rbp
        ret

        ; データ用のセクションを開始して、%d\nをラベル付きでもつ
        .section        __TEXT,__cstring,cstring_literals
L_.str:
        .asciz   "%d\n"
```

で、この辺を理解したら、1+1をする関数を作って、アセンブラを見て見る。1-1も見てみる。1*1を、1/1をってやっていくと、それぞれに対応するアセンブラが何かがわかります。

```
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return a / b; }
```

引数の数に寄ってどう変わるかも、書いてコンパイルすれば分かります。

```
int p0() { return 0; }
int p1(int a1) { return a1; }
int p2(int a1,int a2) { return a1+a2; }
int p3(int a1,int a2,int a3) { return a1+a2+a3; }
:
```

char,short,int,long,double,float, unsigned char, unsigned short, unsigned int, unsigned longについて、同じように足し算等を書いてみるとその他の型について理解出来るはずです。

```
char add(char a, char b) { return a + b; }
```
IntelliJとGradleとVCSではまったこと

IntelliJでGradleとVCSを使うときに以下の構成に当てはまると起こる問題です。

* Gradleの構成がフラットなスタイルのマルチプロジェクトであること
* VCSにGitもしくはMercurialを使っていること

フラットなスタイルについては前に投稿した[Gradleでマルチプロジェクト](http://qiita.com/shiena/items/371fe817c8fb6be2bb1e)をご覧下さい。

この構成にしていると各モジュールをリポジトリのルートディレクトリとして扱うらしく、
変更したファイルの検出やAnnotateでコマンドの実行に失敗したりします。
この困った状況を解消するために、以下の手順でリポジトリのルートディレクトリを設定します。

1. `Settings` -> `Version Control`を開く
1. `Directory`欄が`<Project>`の`VCS`欄を`<none>`にする
1. `+`ボタンで`Directory`欄にリポジトリのルートディレクトリを追加して、`VCS`欄を`Git`もしくは`Mercurial`の使っている方を設定する

以上の設定でVCSの機能が正しく動くようになります。
PHPでTwitter botの習作（3）とりあえず完成

ギークハウス元住吉の当番お知らせ用botです。

#### 仕様
- cronで毎時巡回して8時と22時に当番に@ツイート。それ以外の時間はランダムツイート。
- 当番は毎週日曜日に交代

```php:bot.php
<?php
// twitteroauth.phpとconfig.phpを読み込む
require_once('twitteroauth/twitteroauth.php'); // onceは循環参照を防ぐ
require_once('config.php');

// クラスのインスタンス化。TwitterOAuthがクラス
$conn = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

// $members（当番順のTwitterアカウント）はconfig.phpに移動した。
// ファイルから当番を読み込むように書き換える
// ツイートテンプレはconfig.phpに移動

// 当番の判定
$now = new DateTime(); // 現在日時
$duty = $now->format('W') % 7; // 週番号を7人で割って余りで判定。月曜始まり注意。

// 次の当番。6の場合は次を0にする。土日に使う。
if ($duty == 6) {
    $nextDuty = $duty - 6;
} else {
    $nextDuty = $duty + 1;
}

// 曜日で文章を変える
switch ($now->format('D')) {
    case 'Sun':
        $dutyTw = array('@'.$members[$next_duty].' '.$temp[0],
        '@'.$members[$next_duty].' '.'明日、月曜日は'.$trash[1].$temp[3].$temp[0]);
        break;
    case 'Mon':
        $dutyTw = array('@'.$members[$duty].' '.'今日は'.$trash[1].$temp[3].$temp[1].$temp[0],
            '@'.$members[$duty].' '.'明日、火曜日は'.$trash[0].$temp[3].$temp[0]);
        break;
    case 'Tue':
        $dutyTw = array('@'.$members[$duty].' '.'今日は'.$trash[0].$temp[3].$temp[1].$temp[0],
            '@'.$members[$duty].' '.'明日、水曜日は'.$trash[2].$temp[3].$temp[0]);
        break;
    case 'Wed':
        $dutyTw = array('@'.$members[$duty].' '.'今日は'.$trash[2].$temp[3].$temp[1].$temp[0],
            '@'.$members[$duty].' '.'明日、木曜日は'.$trash[0].$temp[3].$temp[0]);
        break;
    case 'Thu':
        $dutyTw = array('@'.$members[$duty].' '.'今日は'.$trash[0].$temp[3].$temp[1].$temp[0],
            '@'.$members[$duty].' '.'明日、金曜日は'.$trash[3].$temp[3].$temp[0]);
        break;
    case 'Fri':
        $dutyTw = array('@'.$members[$duty].' '.'今日は'.$trash[3].$temp[3].$temp[1].$temp[0],
            '@'.$members[$duty].' '.'明日、土曜日は'.$trash[0].$temp[3].$temp[0]);
        break;
    case 'Sat':
        $dutyTw = array('@'.$members[$duty].' '.'今日は'.$trash[0].$temp[3].$temp[1].$temp[0],
            '@'.$members[$duty].' '.'生ごみの回収とタオルの洗濯をお願いします。1週間お疲れさまでした。'.$members[$next_duty].'明日から当番をお願いします。');
        break;
}

// 時間判定
$hour = $now->format('G');
switch ($hour) {
    case '8':
        $msg = $dutyTw[0];
        break;
    case '13':
        $msg = $timeTw[0];
        break;
    case '16':
        $msg = $timeTw[1];
        break;
    case '21':
        $msg = $dutyTw[1];
        break;
    case '23':
        $msg = $timeTw[2];
        break;
    default:
        $msg = $randTw[mt_rand(0, 10)]; // ランダムツイート
        break;
}

// 深夜はツイートしない
if ($hour <= 7) {
    $msg = NULL;
}

// test
//echo $msg;
//echo $msg;
//var_dump($duty);
//var_dump($msg);
var_dump($hour);
/*
// statusに入るのがツイートされる文章
$params = array('status' => $msg);

// TwitterOAuthクラスのpostメソッド？を呼び出す。->はアロー演算子
$result = $conn->post('statuses/update', $params);

// 結果出力
var_dump($result);
```
emacs-clang-complete-async マルチバイト文字対応

emacs-clang-complete-async が便利そうだったんで使ってみたのですが、マルチバイト文字を含んだソースだとまともに動かなかったんで、動くようにしてみました。

.el ファイルのみの変更です。

https://github.com/8bit-jzjjy/emacs-clang-complete-async
YAMLの真偽値の扱いに注意。

# 実はYAMLには型があります。

http://en.wikipedia.org/wiki/YAML#Data_types

```yaml
a: 123                     # an integer
b: "123"                   # a string, disambiguated by quotes
c: 123.0                   # a float
d: !!float 123             # also a float via explicit data type prefixed by (!!)
e: !!str 123               # a string, disambiguated by explicit type
f: !!str Yes               # a string via explicit type
g: Yes                     # a boolean True
h: Yes we have No bananas  # a string, "Yes" and "No" disambiguated by context.
```

123や"123"をinteger, stringと扱うのは普段Ruby等を使用されている方は見慣れてると思いますが、
Yesは **boolean** の扱いをされる点に注目。(Objective-Cな人は見慣れてますかね)

# それが何か問題になるの？

YAMLパーサーの中にはキーにYes(yesも)を利用すると、`"true":` という様に **キー名を変換してしまう** パーサーもあるので、命名に注意しないといけません。

## こんな感じで

![Online_YAML_Parser.png](https://qiita-image-store.s3.amazonaws.com/0/996/bab11a52-930b-2f44-6640-86741f73ac45.png)

http://yaml-online-parser.appspot.com/?yaml=yes%3A+%22Yes%22%0Ano%3A+%22No%22&type=json
Mac上でGo言語のHello World


brewが入ってなかったら入れる

## Go言語のインストール

```
brew intsall go
```

## 準備

```
mkdir go
cd go

touch hello.go
```

## Hello Worldを書く
```go:hello.go
package main

import fmt "fmt"

func main() {
    fmt.Print("Hello, world\n")
}
```

## コンパイル

```
go build hello.go
```


## 実行

```
./hello
```
Gradleでマルチプロジェクト

Gradleは単一プロジェクトだけではなく複数のプロジェクトをまとめて扱うことができて、マルチプロジェクトと呼んでいます。
マルチプロジェクトではいくつかのレイアウトがあるので、以下の3つのプロジェクトを例に書いてみます。

* `root` プロジェクトをまとめるためのプロジェクト
* `share` 共通機能をまとめたプロジェクト
* `application` アプリケーションがあるプロジェクトで`share`プロジェクトに依存しています。

`build.gradle`の書き方は[Gradle User Guide/7.3. マルチプロジェクトのJavaビルド](http://gradle.monochromeroad.com/docs/userguide/tutorial_java_projects.html#sec:examples)などが詳しいため、ここでは割愛します。

## 階層構造のレイアウト

`root`配下に`share`と`application`を配置する見た目で分かりやすいレイアウトです。
Gradleのビルドファイルである`build.gradle`と`settings.gradle`は`root`直下に配置します。

```text:Hierarchical-Layout
root/
  share/
  application/
  build.gradle
  settings.gradle
```

`settings.gradle`には`include`に続けてプロジェクト名を書きます。

```groovy:settings.gradle
include 'share', 'application'
```

## フラットなレイアウト

Eclipseなどで扱いやすいように全てのプロジェクトを同じ階層に配置するレイアウトです。
`build.gradle`と`settings.gradle`はそのままで、`share`と`application`が`root`と同じ階層にあります。
ただし、このレイアウトでは`root`以外でビルドできません。

```text:Flat-Layout
root/
  build.gradle
  settings.gradle
share/
application/
```

`settings.gradle`は`include`を`includeFlat`に変更するだけです。

```groovy:settings.gradle
includeFlat 'share', 'application'
```

### masterを使ったフラットなレイアウト

**※追記**

フラットなレイアウトの特別パターンで、`root`ディレクトリの名前を`master`にすれば他のプロジェクトからビルドできます。
この場合は同じ階層の`master`ディレクトリの中に`settings.gradle`があればマルチプロジェクトとして扱われるようです。

参考: [Gradle User Guide/第53章 ビルドのライフサイクル/53.4. 初期化](http://gradle.monochromeroad.com/docs/userguide/build_lifecycle.html#sec:initialization)

```text:Flat-Layout(master)
master/
  build.gradle
  settings.gradle
share/
application/
```

## もう1つのフラットなレイアウト

フラットなレイアウトでも各プロジェクトでビルドできるように配置したものです。
最初のフラットなレイアウトから更に`settings.gradle`を各プロジェクトと同じ階層に配置します。

```text:Another-Flat-Layout
root/
  build.gradle
share/
application/
settings.gradle
```

`settings.gradle`でルートプロジェクトの名前とディレクトリを設定します。
Gradleはカレントディレクトリに`settings.gradle`が無い場合は上位のディレクトリを順に探してくれるので、どのプロジェクトからでもビルドできるようになります。

```groovy:settings.gradle
rootProject.name = 'root'
rootProject.projectDir = new File(settingsDir, 'root')

includeFlat 'share', 'application'
```
IDE(統合開発環境)

利点
・カンマ忘れとか綴り間違いとか防げる
・関数が宣言したところを参照できる

欠点？
・大規模なプロジェクトになると重い
・日本語版じゃなかったり
・利点で挙げた補助機能とか慣れてきたら逆にうざいとかも有りそう
Windows での Vim 環境の構築方法


# はじめに

Windows 7 で Vim 環境を構築した時の手順をまとめた。
GitHub で管理している .vimrc の導入方法についても書いた。

# Vim の導入

以下のページで配布されている Vim をダウンロード。

[Vim — KaoriYa](http://www.kaoriya.net/software/vim/)

ダウンロードしたファイルを解凍し、 vim.exe を実行すれば Vim が起動する。

#  設定方法

Vim の設定は、 Linux の場合と同様にホームディレクトリ配下の .vimrc に書けば良い。

## GitHub で管理している .vimrc の導入方法

まずは、 Windows PowerShell を管理者として実行する。
そして、以下のようなコマンドを実行し、 .vimrc へのシンボリックリンクを $HOME ディレクトリ配下に作成する。

    PS C:\Users\hide> cmd /c mklink .vimrc "C:\Users\hide\dotfiles\.vimrc"

また、 NeoBundle が必要であれば、以下のようなコマンドを実行し neobundle.vim へのシンボリックリンクも作成しておく。

    PS C:\Users\hide> mkdir .vim
    PS C:\Users\hide> mkdir .vim/bundle
    PS C:\Users\hide> cmd /c mklink /D ".vim/bundle/neobundle.vim" "C:\Users\hide\dotfiles\neobundle.vim"

# 参考
 
 * [Vim — KaoriYa](http://www.kaoriya.net/software/vim/)
   * Windows 用の Vim を配布している
   * vim.org 等で配布されるオリジナルの Vim に、日本語を扱う上で便利な設定やスクリプトが追加されている

 * [vimrc, runtime の優先順位を理解して Windows と Linux で Vim の設定を共有する - teppeis blog](http://teppeis.hatenablog.com/entry/20080705/1215262928)
   * Vim の設定ファイルについて分かりやすく説明している

 * [Vimの.vimrcと.vimフォルダをDropboxを使ってWin/Macで共有する - アインシュタインの電話番号☎](http://blog.ruedap.com/entry/20110301/vim_vimrc_vimperator_dropbox_windows_mac_share)
   * Windows でのシンボリックリンクの作成方法について書いてある
formのserializeについて

formの値は取れてるのにserializeしたら空だ!っていう問題が発生。
解決法が探してもなかなか見つからなかった、というか明記されているところがなかったのでメモ(それ以前の常識か？)

```html:form.html
 <form id=regform>
    <div><input type="text" placeholder="---ID---" id="id" ></div>
    <div><input type="text" placeholder="---Name---" id="name" ></div>
    <select id="sex">
      <option>Male</option>
      <option>Female</option>
    </select>
    <div><input type="text" placeholder="---Address---" id="address" ></div>
  </form>

```

このformの中身をserializeしてajaxに放り込んでWebサービスを叩きたい

```js::form.js
var params = $('form').serialize();
$.ajax({
type: "GET",
url: $.APIendpoint + "registerContext",
data: params,
complete: function(status){
console.log("ho");
                    }
});
```

この結果はparamsの中身は空の文字列であり、もちろんエラーを吐かれた。
`var params = $('form').serialize();`
を
`var params = $('#regform').serialize();`
とかしても駄目。

serializeにはformの各要素に`name`を与えてやらなければならない。
つまりこう書き換える

```html:form.html
 <form id=regform>
    <div><input type="text" placeholder="ID" id="id" name="id" ></div>
    <div><input type="text" placeholder="Name" id="name" name="name"  ></div>
    <select id="sex" name="sex">
      <option>Male</option>
      <option>Female</option>
    </select>
    <div><input type="text" placeholder="Address" id="address" name="address" ></div>
  </form>

```

これでserializeすると
`id=&name=&sex=Male&address=`
の形で繋ぐことが出来る。

serializeのやってくれることをよくよく考えたらまあ当たり前だよねという感じですが、引っかかったので。
serializeにはidではなくnameが必須とは書いてないけどしれっとソースには見たらnameが書いてあるんですね。
Apache 2.2 / 2.4 バーチャルホスト設定ファイル テンプレート

メモ

### 2.2 

```apache:vhost.conf
<VirtualHost _default_:80>
        DocumentRoot /var/www/vhost/localhost/html
        ServerName localhost

        ErrorLog logs/localhost-error_log
        CustomLog logs/localhost-access_log common
        <Directory  /var/www/vhost >
                # default charset UTF-8
                AddDefaultCharset utf-8

                # .htaccess setting
                AllowOverride All

                # SSI OK
                # SymbolicLink OK
                Options Includes FollowSymLinks

                Order Deny,Allow
                Allow from all
        </Directory>

        <Files ~ "^\.">
                # .ht*
                # .svn*
                # .csv*
                #  etc
                Deny from all
        </Files>

        <Files ~ ".*conf.*">
                # config.inc.php
                # ****.conf
                Deny from all
        </Files>

        <Files ~ "(\.tmpl|\.tpl|\.vm|\.mayaa|\.properties|\.back|\.bk|~|[0-9]+|build.xml)$">
                # .tmpl  .tpl .vm     : Template Files
                # .mayaa .properties  : Control File
                # .back .bk *~ *n     : Backup File
                # build.xml           : Ant Build Control File
                Deny from all
        </Files>
</VirtualHost>
```
### 2.4

```apache:vhost.conf
<VirtualHost _default_:80>
        DocumentRoot /var/www/vhost/localhost/html
        ServerName localhost

        ErrorLog logs/localhost-error_log
        CustomLog logs/localhost-access_log common
        <Directory  /var/www/vhost >
                # default charset UTF-8
                AddDefaultCharset utf-8

                # .htaccess setting
                AllowOverride All

                # SSI OK
                # SymbolicLink OK
                Options +Includes +FollowSymLinks

                # aapche 2.4 change config
                # Order Deny,Allow
                # Allow from all
                Require all granted

        </Directory>

        <Files ~ "^\.">
                # .ht*
                # .svn*
                # .csv*
                #  etc
                # Deny from all
               # apache 2.4 changed
                Require all denied
        </Files>

        <Files ~ ".*conf.*">
                # config.inc.php
                # ****.conf
                # Deny from all
               # apache 2.4 changed
                Require all denied
        </Files>

        <Files ~ "(\.tmpl|\.tpl|\.vm|\.mayaa|\.properties|\.back|\.bk|~|[0-9]+|build.xml)$">
                # .tmpl  .tpl .vm     : Template Files
                # .mayaa .properties  : Control File
                # .back .bk *~ *n     : Backup File
                # build.xml           : Ant Build Control File
                # Deny from all
               # apache 2.4 changed
                Require all denied
        </Files>
</VirtualHost>

```
Rails での テーブルページングのサンプル。

kaminari を使ってページングする例を github 上で見つけた。
- https://github.com/amatsuda/kaminari_example
　This is a sample Rails 3 application showing the basic and advanced usage of Kaminari paginator

ネット上でよくみかける Kaminari でのページングでは、ページ移動する際に画面全体の再描画が発生してしまう。
しかし、上の例では、テーブル部分だけが表示更新されように作成されている。

上の例も含め、Rais3 の練習プロジェクトに 4 つのテーブルページング例を実装してみた。
　https://github.com/katoy/rails3-files
1. クライアントサイドでの paging/sort/filtering (using list.js)
2. サーバーサイドでの paging/sort (more using kaminari, remote:true)
3. サーバーサイドでの paging/sort (paging table paging using kaminari, remote:true)
4. サーバーサイドでの paging/sort (paging table using Wicegrid)

( 例 2 では Chrome に AutoPagerize の拡張機能をいれていると、autopage も効きます。)
Linux バックアップコマンド

何度も作るのでメモ

```bash:/usr/local/sbin/backup
#!/bin/sh

if test $# -eq 0
then
        echo not only arguments
        echo $0 [filename] [filename]...
        exit 1
fi

while [ $# -ne 0 ]
do
        cp -pr $1 $1.`date +%Y%m%d`
        shift
done
```
Cake2: フォームヘルパーの氏名入力のサンプル

入力欄が姓と名に分かれ、かつエラーメッセージは入力項目の下にまとめて表示するサンプル。  
たぶん、もっとスマートな方法やライブラリがあるorz

```php:cake2_form_name_input.php
echo $this->Form->input('Model.lname',
  array(
    'label' => '氏名',
    'placeholder' => '姓',
    'class' => 'input-small',
    'after' => '　',
    'div' => false,
    'error'=>false
  )
);
echo $this->Form->input('Model.fname',
  array(
    'label' => false,
    'placeholder' => '名',
    'class' => 'input-small',
    'div' => false,
    'error'=>false
  )
);
echo $this->Form->error('lname');
echo $this->Form->error('fname');
```
Cake2: フォームヘルパーのradioのサンプル

項目ごとにspan要素で包括したラジオボタンを表示するサンプル。  
たぶん、もっとスマートな方法やライブラリがあるorz

```php:cake2_form_radio.php
echo '<p class="label">質問項目</p>';
echo '<span class="radio-set">';
echo $this->Form->radio('Model.form_name',
  array(
    'ああああ',
    'いいい',
    'ううううう',
    'ええええ',
    'おおお',
    'その他'
  ),
  array(
    'legend' => false,
    'default' => '0',
    'separator' => '</span><span class="radio-set">',
  )
);
echo '</span>';
echo $this->Form->error('form_name');
```
Cake2: フォームヘルパーのselectのサンプル

地域ごとにグループ化された都道府県選択を表示するサンプル。  
たぶん、もっとスマートな方法やライブラリがあるorz

Cake1とCake2ではselectの出力方法が大幅に異なるので、英語版CookBookを参照した方がいい

```php:cake2_form_select.php
echo $this->Form->label('Model.prefecture', '都道府県');
echo $this->Form->select('Model.prefecture',
  array(
  '北海道' => '北海道',
  '東北' => array(
    '青森県' => '青森県',
    '岩手県' => '岩手県',
    '宮城県' => '宮城県',
    '秋田県' => '秋田県',
    '山形県' => '山形県',
    '福島県' => '福島県'
  ),
  '関東' => array(
    '茨城県' => '茨城県',
    '栃木県' => '栃木県',
    '群馬県' => '群馬県',
    '埼玉県' => '埼玉県',
    '千葉県' => '千葉県',
    '東京都' => '東京都',
    '神奈川県' => '神奈川県'
  ),
  '中部' => array(
    '新潟県' => '新潟県',
    '富山県' => '富山県',
    '石川県' => '石川県',
    '福井県' => '福井県',
    '山梨県' => '山梨県',
    '長野県' => '長野県',
    '岐阜県' => '岐阜県',
    '静岡県' => '静岡県',
    '愛知県' => '愛知県'
  ),
  '近畿' => array(
    '三重県' => '三重県',
    '滋賀県' => '滋賀県',
    '京都府' => '京都府',
    '大阪府' => '大阪府',
    '兵庫県' => '兵庫県',
    '奈良県' => '奈良県',
    '和歌山県' => '和歌山県'
  ),
  '中国' => array(
    '鳥取県' => '鳥取県',
    '島根県' => '島根県',
    '岡山県' => '岡山県',
    '広島県' => '広島県',
    '山口県' => '山口県',
  ),
  '四国' => array(
    '徳島県' => '徳島県',
    '香川県' => '香川県',
    '愛媛県' => '愛媛県',
    '高知県' => '高知県'
  ),
  '九州' => array(
    '福岡県' => '福岡県',
    '佐賀県' => '佐賀県',
    '長崎県' => '長崎県',
    '熊本県' => '熊本県',
    '大分県' => '大分県',
    '宮崎県' => '宮崎県',
    '鹿児島県' => '鹿児島県'
  ),
  '沖縄県' => '沖縄県',
  'Overseas' => 'Overseas'
  ),
  array(
    'empty' => false,
    'label' => '都道府県',
    'default' => '東京都'
  )
);
```
Storyboard上のUITableViewCellをxibで作る場合はregisterNib:forCellReuseIdentifier:メソッドが便利

Storyboardを使ってUITableViewのある画面を作り、そのCellを複数画面で使いまわすためにxibとして作成するときのTipsです。

UITableViewにiOS5から追加されたregisterNib:forCellReuseIdentifier:メソッドを使うことで、作成したxibをUITableViewに登録することができ、nilチェックとloadNibを必要としないシンプルなコードにすることができます。

コードで例を示すために使いまわしたいCellを"SampleTableViewCell"とします。作成するのは3つ

* SampleTableViewCell.xib
* SampleTableViewCell.h
* SampleTableViewCell.m

ここで説明するregisterNib:forCellReuseIdentifier:メソッドは、UITableViewを保持するUITableViewControllerのviewDidLoadなどで呼び出します。これによってCell用に作成したxibファイルがUITableViewに登録されます。

```objective-c:
- (void)viewDidLoad
{
    [super viewDidLoad];

    UINib *nib = [UINib nibWithNibName:@"SampleTableViewCell" bundle:nil];
    [self.tableView registerNib:nib forCellReuseIdentifier:@"Cell"];
}
```
あとはStoryboardでStaticやDynamicなCellを呼び出す時と同じように次のようにします。

```objective-c:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    SampleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    // Configure the cell...
    
    return cell;
}
```
これで下記のようにcellの再利用をnilチェックし生成する必要はありません。

```objective-c:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    SampleTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        // こういう処理は必要なくなるよと
        cell = [SampleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
          reuseIdentifier:CellIdentifier];
    }
    // Configure the cell...
    
    return cell;
}
```

なぜ再利用のチェックと生成を行う必要がないかというと、先ほどの説明通りにnibを登録してればnilを返すことがないからです。これについては[AppleのUITableViewのリファレンス](http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html)でdequeueReusableCellWithIdentifier:がnilを返す場合について下記のように言及されていましたので参考になります

* 再利用されるcellが存在しない時
* nibが登録されていない時（iOS5から)
* Classが登録されていない時（iOS5から)

つまり、nilが返るという状態は実装ミスです。実装ミスがすぐに発覚するので良いつくりといえるでしょう。

したがって、先述のメソッドによりCellが登録されることで内部キューになければ自動で生成を行なってくれるため、Cellの再利用チェックと生成のコードが必要ないわけです。余談ですがStoryboardのCellを使うようになってから再利用チェックを書く必要がなくなっていたのはStoryboardが登録の手続きを行なっていたからなんですね。

これらは当然、Storyboard+xibの時にかぎらず、UITableViewでさえあれば使えます。また、registerClass:forCellReuseIdentifier:によりクラスを指定できるためxibである必要も有りません。
undefinedを作らない

```js:
// hogeにアクセス出来ない場合はnothingを代入
var hoge = localStorage['hoge'] || "nothing"
```

値を取り出せずにundefinedなどを作ってしまうと
そのままプロパティ取得に走りこけることが多いので、
undefinedを作らない実装にしたい。

上記例のようにパイプでつないでデフォルト値をもたせることがベター。
ssh-copy-id: SSHでの公開鍵認証の設定を簡単に行う

# 概要
* サーバにログインするときパスワード毎回入力するの面倒
* 公開鍵の設定もなんかメンドクサイ
* 設定まで全部やってくれるssh-copy-idは神

# ssh-copy-id
SSHで認証する公開鍵のコピーからパーミッション設定まで全部をまとめてやってくれるコマンドです。
パーミッション設定とかしょっちゅう忘れるので、これでやっておけば安心確実です。


# 使い方

```bash:
#macだと入ってないので入れましょう
brew install ssh-copy-id

ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub user@address
```

超簡単(｀・∀・´≡｀・∀・´)
daemontoolsの設定した時のメモ

[こちらのブログを参考にしました](http://blog.bobpp.jp/2011/02/mac-homebrew-daemontools.html)


#何にハマった
 - com.github.mxcl.homebrew.daemontools.plistはxmlなんだけど、私はhomebrewの置き場所をユニークなものにしてしまっていたので、デフォルトのsvscanbootのpath指定では駄目だったので、以下のようにarray.stringの中を書き換えた。

```vim:
/Users/{UserName}/homebrew/bin/svscanboot
```

ちょっとxmlの要素名が消えてますが、string要素の中を`which svscanboot`の結果に置き換えました。


#最後に、設定が終わったらdaemontoolsを再起動しないと変更が反映されない?らしいので

```zsh:
$sudo launchctl unload path/to/com.github.mxcl.homebrew.daemontools.plist
$sudo launchctl load path/to/com.github.mxcl.homebrew.daemontools.plist
```

みたいにして再起動した。
Ruby 2.0.0-p247アップデート

* [Ruby 2.0.0-p247 リリース](http://www.ruby-lang.org/ja/news/2013/06/27/ruby-2-0-0-p247-is-released/)

----

## オプション

### `rbenv-default-gems`インストール

```
brew install rbenv-default-gems
----------
==> Installing rbenv-default-gems dependency: ruby-build
==> Downloading https://github.com/sstephenson/ruby-build/archive/v20130501.tar.gz
######################################################################## 100.0%
==> ./install.sh
  /usr/local/Cellar/ruby-build/20130501: 75 files, 336K, built in 2 seconds
==> Installing rbenv-default-gems
==> Downloading https://github.com/sstephenson/rbenv-default-gems/archive/v1.0.0.tar.gz
######################################################################## 100.0%
  /usr/local/Cellar/rbenv-default-gems/1.0.0: 4 files, 16K, built in 2 seconds
----------
```

```
vi ~/.rbenv/default-gems
----------
bundler
pry
rails
action_args
html5_validators
thin
puma
kaminari
rails_config
tapp
awesome_print
exception_notification
better_errors
binding_of_caller
pry-rails
sqlite3
rspec-rails
----------
```

----

## 0. rbenv-default-gems設定

```
cat ~/.rbenv/default-gems
----------
bundler
pry
rails
action_args
html5_validators
thin
puma
kaminari
rails_config
tapp
awesome_print
exception_notification
better_errors
binding_of_caller
pry-rails
sqlite3
rspec-rails
----------
```

## 1. brewアップデート

```
brew update
```

## 2. ruby-buildアップグレード

* 要Xcode 4.6.3

```
brew upgrade --HEAD ruby-build
----------
Error: ruby-build-HEAD already installed
----------
```

↓

```
brew install --HEAD ruby-build
```

```
brew install ruby-build
```

## 3. インストール可能リスト表示確認

```
rbenv install -l | grep 2.0.0
----------
  2.0.0-p247
----------
```

## 4. Rubyインストール

```
rbenv install 2.0.0-p247
----------
Downloading openssl-1.0.1e.tar.gz...
-> https://www.openssl.org/source/openssl-1.0.1e.tar.gz
Installing openssl-1.0.1e...
Installed openssl-1.0.1e to /Users/shu/.rbenv/versions/2.0.0-p247

Downloading ruby-2.0.0-p247.tar.gz...
-> http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
Installing ruby-2.0.0-p247...
Installed ruby-2.0.0-p247 to /Users/shu/.rbenv/versions/2.0.0-p247

Fetching: bundler-1.3.5.gem (100%)
Successfully installed bundler-1.3.5
1 gem installed
〜
Fetching: rspec-rails-2.14.0.gem (100%)
Successfully installed rspec-rails-2.14.0
5 gems installed
----------
```

## 5. デフォルト使用設定

```
rbenv global 2.0.0-p247
ruby -v
----------
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
----------
```

## 6. バージョン確認

```
rbenv versions
----------
  system
  1.9.3-p327
  1.9.3-p385
  1.9.3-p392
  2.0.0-p0
  2.0.0-p195
* 2.0.0-p247 (set by /Users/shu/.rbenv/version)
----------
```

```
rbenv version
----------
2.0.0-p247 (set by /Users/shu/.rbenv/version)
----------
```

## 7. インストールしたRubyやGemのパスを通す

```
rbenv rehash
```