OmniAICreator/Qiita-1.07M huggingface dataset:
Flume NG 1.4.0 インストール

#Flume NG Install手順

##前提

* jdkがインストールされていること
* [動作環境](http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH5/latest/CDH5-Requirements-and-Supported-Versions/CDH5-Requirements-and-Supported-Versions.html)を参考に環境を用意する。
* wgetなど必要なツールはインストール済

今回は、AWS AMI ID(i-94632a92)を利用

##インストール

###"1-click Install" packageをダウンロード
`wget http://archive.cloudera.com/cdh5/one-click-install/redhat/6/x86_64/cloudera-cdh-5-0.x86_64.rpm`

###ローカルインストール
``sudo yum --nogpgcheck localinstall cloudera-cdh-5-0.x86_64.rpm``

###ローカルリポジトリの確認
`/etc/yum.repos.d/`配下に `cloudera-cdh5.repo`ファイルが作成されていることを確認する。

###Flume NG agentのインストール
`yum install flume-ng-agent -y`

###Flume NG設定ファイルの作成（コピー）
`cp /etc/flume-ng/conf/flume-conf.properties.template /etc/flume-ng/conf/flume.conf`

###起動
`/etc/int.d/flume-ng-agent start`

起動確認
正常に起動されて`flume.log`にログが出力されていることを確認する
```/var/log/flume-ng/flume.log
02 Jun 2014 23:36:43,771 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (org.apache.flume.sink.LoggerSink.process:70)  - Event: { headers:{} body: 38 31 38 30 38                                  81808 }
02 Jun 2014 23:36:43,771 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (org.apache.flume.sink.LoggerSink.process:70)  - Event: { headers:{} body: 38 31 38 30 39                                  81809 }
02 Jun 2014 23:36:43,772 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (org.apache.flume.sink.LoggerSink.process:70)  - Event: { headers:{} body: 38 31 38 31 30                                  81810 }
02 Jun 2014 23:36:43,772 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (org.apache.flume.sink.LoggerSink.process:70)  - Event: { headers:{} body: 38 31 38 31 31                                  81811 }
02 Jun 2014 23:36:43,772 INFO  [SinkRunner-PollingRunner-DefaultSinkProcessor] (org.apache.flume.sink.LoggerSink.process:70)  - Event: { headers:{} body: 38 31 38 31 32                                  81812 }
```

###サービス自動起動設定
`chkconfig flume-ng-agent on`
自動設定の確認
```
 # chkconfig --list | grep flume-ng-agent
flume-ng-agent  0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

以上
【必須設定】GoogleAnalyticsで社内からのアクセス除外

GoogleAnalyticsのデータを、社内からあるいは開発者からのアクセスを含めないようにしたい場合の設定メモです。
不要なアクセスが目に見えているときは後からアクセス除外をするよりも最初に設定しておく方が幸せになれます、きっと。

今回利用する方法は2つです、除外したい規模にあわせてお使いください。

# IPでフィルタリングする
**メリット**は、関係者1人1人に設定をお願いする必要がない点。
**デメリット**は、個別の設定ができない点。IPが変動する場合は適用し難い点。

* **設定方法**
 * 制限したいIPを確認する
 * GoogleAnalyticsにログインして、設定を適用したいアカウントの管理画面でビューを追加する
 ![qiita_memo.png](https://qiita-image-store.s3.amazonaws.com/0/19712/121c0c42-9e7d-8182-8f6b-0bc85c849c60.png)
 * 作成したビューにIPフィルタを設定する（正規表現で書いてください。参考： https://support.google.com/analytics/answer/1034324?rd=1 ）
 ![qiita_memo2.png](https://qiita-image-store.s3.amazonaws.com/0/19712/1f17cee0-73c2-efa1-a56f-77848aeff069.png)

以上の設定により、新しいビュー（今回だと「社内アクセス除外」ビュー）をみるとフィルタリングされた結果が蓄積されます。他のビュー（今回だともともと存在していた「すべてのウェブサイトのデータ」）にはフィルタが存在しないのでフィルタリングされていないデータがたまっていきます。
最後のフィルタの作成部分を一致にすることで社内からのアクセスのみのビューも作成できるので逆パターンが欲しい方はそちらでどうぞ。
ただし、フィルタを設定した期間はそのフィルタ設定により取得しなかったデータは後から取得できない状態になるので、ビューをしっかりと分けて、 **自分で必ず確認をしてから設定する** 事をおすすめします。


# 各自のブラウザ設定でフィルタリングする
**メリット**は、小さな集団で利用する場合個別に設定が出来る点。設定自体は簡単な点。
**デメリット**は、関係者1人1人に設定をお願いする必要がある点。この設定を行うと他のサイトでのトラッキングも制限される点。

* **設定方法**
 * Google アナリティクス オプトアウト アドオン( https://tools.google.com/dlpage/gaoptout?hl=ja )をアクセスカウントをしたくないブラウザに設定する

個人開発などの場合はこちらの方が便利です。（ただし、自分でGoogleAnalyticsのアクセス確認する際には解除をしないとハマることがあるので気をつけてください）
Welcome to Swift

WWDC2014で iOSアプリの新たな開発言語
「Swift」
が発表されましたね。Cocoa と Cocoa touch なので、厳密にはMacアプリも対象ですね。

[Swift - Apple Developer]
https://developer.apple.com/swift/

とりあえず動かしてみたので、手順だけ簡単に書いておきます。

1. Xcode6 Beta をダウンロード

2. ダウンロードした dmg ファイルを展開して app ファイルをアプリケーションフォルダへコピー
※ 既にインストール済みのXcodeとはファイル名が異なるので上書きにはならないけど、デフォルトのXcodeが Beta の方になるので要注意


3. 起動しようとしたら、OS X 10.9.3 以降じゃないとダメ（自分は 10.9.2 でした）と言われたので OSをアップデード


4. Xcode6 Beta を起動（初回は時間がかかります）

5. iOS Dev Center でダウンロードしたサンプルコード（UICatalog なんちゃら）を開いてシミュレータで動かそうとしたら、UIAlertなんちゃらクラスが定義されてないとか、周辺でエラーが出てビルドが通りませんでした。

6. エラーの出てるコードをコメントアウトしたらひとまず動くようにはなりましたね


Objective-C での m ファイルが swift ファイルに置き換わって、h ファイルが不要になりました、程度かな、といった感じですが、プロジェクトの Link Binary With Libraries にFramework が一つも無いんですよね〜なんでだろ？？？
~/.ssh/configを分割して管理する

>**2021-1-26**
>[こちら](https://blog.tumf.dev/posts/diary/2021/1/2021-1-26/)にInclude対応版の記事を書きました

>**2021-1-13**
>[こちら](https://blog.tumf.dev/posts/diary/2021/1/2021-1-13/)に最新版の記事を書きました


管理するサーバが増減するたびに変更を加える`OpenSSH`の設定ファイル`~/.ssh/config`

長くなりすぎて管理しづらくなると何とかこれを分割したくなりますね？ファイルが分割できれば、`git`で管理したり、一部をメンバーとプロジェクトで共有できたりできて便利そうです。ここでは私が利用している`~/.ssh/config`の分割方法をご紹介します。

## 設定を分割する

`~/.ssh/conf.d`というディレクトリを作ってこの中に`~/.ssh/config`を分割して配置します。プロジェクトメンバーと共有したい設定は`myproject.conf`のようにシンボリックリンクで解決します。

```
~/.ssh
├── authorized_keys
├── conf.d
│   ├── config
│   ├── myproject.conf -> ~/tumf/projects/myproject/ssh.conf
│   └── myservers.conf
├── config
├── id_dsa
├── id_dsa.pub
└── known_hosts
```

すべての設定に共通するような設定は`~/.ssh/conf.d/config`においてください。

## 設定を結合する

`OpenSSH`に分割した設定を読んでくれるような機能があれば良いのですが、そのような機能は見当たらないので`~/.ssh/conf.d/*.conf`を以下のコマンドで結合します。

```bash
cat ~/.ssh/conf.d/config ~/.ssh/conf.d/*.conf
```

この結合コマンドを、`~/.ssh/conf.d`内を修正するたびに実行しても構わないのですが、この一手間を省くために私は以下のようなエリアスを設定しています。

```bash
alias ssh="cat ~/.ssh/conf.d/config ~/.ssh/conf.d/*.conf > ~/.ssh/config;ssh"
alias scp="cat ~/.ssh/conf.d/config ~/.ssh/conf.d/*.conf > ~/.ssh/config;scp"
alias git="cat ~/.ssh/conf.d/config ~/.ssh/conf.d/*.conf > ~/.ssh/config;git"
alias knife="cat ~/.ssh/conf.d/config ~/.ssh/conf.d/*.conf > ~/.ssh/config;knife"
```

---
かなりベタな感じですが `~/.ssh/conf.d`を[Bitbucket](https://bitbucket.org)あたりに`push`すると複数のクライアントで共有できて便利です。

もっといい方法があれば是非教えて下さい。
エンタープライズアプリケーションアーキテクチャパターン レイヤ化


<div class="kaerebalink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="kaerebalink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798105538/meganii-22/ref=nosim/" rel="nofollow" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51TVM1CFHKL._SL160_.jpg" style="border: none;" /></a></div><div class="kaerebalink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="kaerebalink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798105538/meganii-22/ref=nosim/" rel="nofollow" target="_blank">エンタープライズ アプリケーションアーキテクチャパターン (Object Oriented Selection)</a><div class="kaerebalink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://kaereba.com" rel="nofollow" target="_blank">カエレバ</a></div></div><div class="kaerebalink-detail" style="margin-bottom:5px;">マーチン・ファウラー 翔泳社 2005-04-21    </div><div class="kaerebalink-link1" style="margin-top:10px;"><div class="shoplinkamazon" style="display:inline;margin-right:5px"><a href="http://www.amazon.co.jp/gp/search?keywords=%83G%83%93%83%5E%81%5B%83v%83%89%83C%83Y%83A%83v%83%8A%83P%81%5B%83V%83%87%83%93%83A%81%5B%83L%83e%83N%83%60%83%83%83p%83%5E%81%5B%83%93%20&__mk_ja_JP=%83J%83%5E%83J%83i&tag=meganii-22" rel="nofollow" target="_blank" title="アマゾン" >Amazon</a></div></div></div><div class="booklink-footer" style="clear: left"></div></div>

# レイヤ化
ソフトウェア設計者が複雑なソフトウェアのシステムを分割するために使用する一般的な技法

## レイヤ化のメリット
- 他のレイヤをよくしらなくても１つのレイヤを全体として考えることができる  
e.g. イーサネットの動作方法を知らなくてもTCP上にあるFTPサービスを構築する方法を理解できる
- 同じ基本サービスの代替実装でレイヤを置き換えることができる  
e.g. FTPサービスは、イーサネット、PPP、ケーブル会社が変わったとしてもok
- レイヤ間の依存を最小限にできる  
e.g. ケーブル会社がIPを動作させる物理的な伝送システムを変更しても、FTPサービスを修正する必要はない
- レイヤは標準化に適している  
e.g. TCPとIPは、レイヤの動作方法を定義しているので標準である
- レイヤを構築すれば多くの高水準のサービスがそのレイヤを使用できる  
e.g. TCP/IPは、TFP,telnet,SSH,HTTPによって使用される。TCP/IPがなければ、高水準のプロトコルは独自の低水準のプロトコルを作成しなければいけない。


## レイヤ化のデメリット
- レイヤは一部の物事をカプセル化してしまう
- レイヤを追加するとパフォーマンスを損ねる場合がある。


**レイヤ化アーキテクチャで最も難しいのは、以下の内容を決定することである。**

- 必要なレイヤ
- 各レイヤが行うべき内容
開発者向けカンファレンス/プロダクトのキャッチコピー


好きなものがあったのでまとめてみました。大々的に使われていないもののありますが個人的に気に入った部分を抜粋しています。

# Write the code, Change the world.

WWDC 2014 
https://developer.apple.com/wwdc/

![wwdc14_banners_outside_wordmark.jpg](https://qiita-image-store.s3.amazonaws.com/0/27210/8d6acc55-1e29-7c00-23e5-337711dc4cba.jpeg "wwdc14_banners_outside_wordmark.jpg")

# Developers build the future

de:code
http://www.microsoft.com/ja-jp/events/developer/

# Use what you know, Do what you've always imagined.

Build 2011

![build.jpg](https://qiita-image-store.s3.amazonaws.com/0/27210/06bf68ce-b225-4f4b-ed8a-fbbcd4ff9cca.jpeg "build.jpg")

# Design, develop & distribute

Google I/O
https://www.google.com/events/io

# 未来はコードで創られていく(Life runs on code)

Visual Studio 2010

![vs2010.jpg](https://qiita-image-store.s3.amazonaws.com/0/27210/687de5e9-8134-32d2-7274-bf031dcb4fca.jpeg "vs2010.jpg")
Swiftの文法だけ先に学ぶ


WWDC2014、おなかいっぱいですね。やっぱり最も注目したのは新言語 Swift でしょうか。ということで、iBooks の 「The Swift Programming Language」を読んでおべんきょうします。

なお、私は英語はなんとなく読める程度なので、間違っている可能性は大いにあります。

## Hello, world

```Swift
println("Hello, World")
```

行末にセミコロンがいらない言語ですね。
ダブルクォーテーションで括ってるけど、シングルじゃないのか。

## 定数/変数

```Swift
var myVariable = 42
myVariable = 50
let myConstant = 42
```

キャメルケースがお作法かしら。
`var`で変数宣言、`let`で定数宣言、と

### 型

```Swift
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
```

値から型を判別してくれてますね。例になってる変数名に使われているimplicitは暗黙、explicitは明示の意です。
明示的には`let 変数名: 型 = 値`と。

型の変換は暗黙では行わないので、型変換が必要な場合は自分で指定する必要がある…

```Swift
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
```

この例だと`width`はIntegerのため、Stringに変換して`label`と文字列の結合をしてますね。

### 文字列中の変数呼び出し

私はPHPerなのでその例でいきますが…

```PHP
$hoge = 100;
$fuga = "hoge is $hoge";
```

これで展開されます。Swiftの場合、

```Swift
var hoge = 100
var fuga = "hoge is \(hoge)"
```

バックスラッシュ＋括弧ですね。括弧内は式も可。

### 配列/連想配列
配列はブラケットを使う

```Swift
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"

var occupations = [
	"Malcolm": "Captain",
	"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Realtions"
```

ケツカンマが許されてますね、なんとすばらしい。

空の配列を作る方法。

```Swift
let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()
```

上では型を明示的にしていますが、型を推測できるのであれば、

```Swift
shoppingList = []
```

として、空のブラケットだけで宣言できます

## 制御構文

### if

変数周りの次は制御構文っていうのはどの言語も同じですね。

```Swift
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
	if score > 50 {
		teamScore += 3
	} else {
		teamScore += 1
	}
}
teamScore
```

`for~in`がありますね。便利。`if`がすごいわかりやすい。

`if`の式は、Booleanを返すものでなければならない、と。
例えば上の例でいくと `if score {~~}` はエラーになる。

定義されてない値で動かそうとするために、`if`と`let`を一緒に使うことができ、この値はオプションとして表される？？？
ちょっとこのへん英語がよくわからない
オプションは値が入っているか、値が見当たらないことを示すため`nil`が入っている

```swift
var optionalString: String? = "Hello"
optionalString == nil

var optionalName: String? = "Chatii"
var greeting = "Hello"

if let name = optionalName {
	greeting = "Hello, \(name)"
}
```

例文読んでもイマイチわかんないな…。続ける。

> EXPERIMENT
> 
> Change optionalName to nil. What greeting do you get? Add an else clause that sets a different greeting if optionalName is nil.
>
> 抜粋：: Apple Inc. “The Swift Programming Language”。 iBooks. https://itun.es/jp/jEUH0.l

`optionalName`を`nil`にしたら`greeting`はどうなるか？
optionalNameがnilの場合、異なるgreetingをセットする`else`を加える。

？？？何をいってるのかわかってない

### switch

```Swift
let vegetable = "red pepper"
switch vegitable {
case "celery":
	let comment = "~~~"
case "cucumber", "watercress":
	let comment = "~~~"
case let x where x.hasSuffix("pepper"):
	let comment = "\(x)"
default:
	let comment = "default comment"
```

breakがなく、複数にあてたいときはカンマ区切りでOK、と
WWDC 2014のメモ

WWDC2014を観ながら大変ざっくりと，適当にメモしたやつです.


# Movie

* 開発者をテーマにした映像
* 一般利用者がiOS開発者に対してどう思ってるか
* 一般利用者はどう使っているか

# ティム・クック登壇

# OS X
* MavericksはWindows8よりも普及率が早い．

* __OS X Yosemite__

## 変更点
* デザインはフラットデザインに変更されている．
* Dockのデザインも3Dからフラットに．
* 透明感がある．
* フォントも変更されている．
* ダークボード追加．
	* 白ベースのインターフェイスを黒色ベースのインターフェイスに変更出来る??
* spotlightの検索ウィンドウが画面中央に表示されるようになった．
* iTunesStoreとかも検索出来るように

## iCloud Drive
* FinderからiCloudに保存されているドキュメントを見れるようになった．
* Windowsからも見れちゃう．

## Mail
* 容量の大きいファイルを送る時にメールサーバーに拒否られてもiCloud経由で送れる
* 画像ファイルの簡単な編集が可能になった．

## Safari
* タブ自体をフォルダ分け出来ちゃう．

## Instant Hotspot
* 設定が容易になった

## iPhoneにかかってきた電話がMacでも通知されるようになった．

## MacのアドレスブックやWebサイトなどの電話番号もクリックで電話をかけられるようになった．

## リリースに関して
* Developer Previewは今日から．
* 一般ユーザ向けにもOS X βプログラムが夏から開始される．
* 価格は無料．

# iOS
* __iOS 8__

## 変更点
* 通知センターからメッセージを直接返信出来るようになった．
* SpotlightでAppStoreとかiTunesStoreとかからも検索出来るようになった．

## QuickType
* 予測タイプ的な感じ?
* 日本語も対応!

## Health

## FamilySharing
* カレンダー，写真，リマインダー，位置情報，本，音楽，ムービーなどを家族で共有出来る．(6人までOK)

## リリースに関して
* Betaは今日から!


## iOS (開発者視点)
* 新しいプログラミング言語出してきた！
* Swift
URLを引っこ抜くやつ

昔、はるか昔、チョメチョメな画像を集めるときに重要なテクニックでした。
wgetやcurlは自主規制にしています。

## lynx
lynxでナイス。

```shell-session
$ lynx --dump http://b.hatena.ne.jp | awk '$2 ~/^http/ { print $2 }'
```

rubyでOK!
相対パス絶対パスは気にしないと短いね。

```rb
Nokogiri::HTML(open('http://b.hatena.ne.jp')).css('a').each {|link|
  puts link.attr(:href)
}
```

ここではベンチは重要ではないけど一応。

```shell-session
$ time lynx --dump http://b.hatena.ne.jp | awk '$2 ~/^http/ { print $2 }' > /dev/null

real    0m0.145s
user    0m0.050s
sys     0m0.026s

$ time ./get_urls.rb > /dev/null

real    0m0.359s
user    0m0.223s
sys     0m0.052s

```
clang_completeがライブラリのロードに失敗したとき@mac

clang-3.5 via macports 

`g:clang_library_path`を正しく設定してもロードに失敗する。以下のような感じのエラーがでる。

```vim
Referenced from: /opt/local/libexec/llvm-3.5/lib/libclang.dylib
Reason: image not found
```

dylibの依存関係が解決できないらしい。パスが@executable_path(なんそれ?)からの相対パス。
https://github.com/Rip-Rip/clang_complete/issues/39

`install_name_tool`を使うと上を変更できる。
http://mactkg.hateblo.jp/entry/2012/05/03/202549

```zsh
$ sudo install_name_tool -change '@executable_path/../lib/libLLVM-3.5.dylib' /opt/local/libexec/llvm-3.5/lib/libLLVM-3.5svn.dylib   /opt/local/libexec/llvm-3.5/lib/libclang.dylib
```

エラーメッセージ消える。補完もできる。

てかMacめんどい。

少し経ったら似たようなロードエラーが起きたので以下も実行。

```zsh
$ sudo install_name_tool -change '@rpath/libLLVM-3.5.0svn.dylib' /opt/local/libexec/llvm-3.5/lib/libLLVM-3.5.0svn.dylib  /opt/local/libexec/llvm-3.5/lib/libclang.dylib
```
「刺身の上にタンポポをのせる仕事」からの卒業 - 自動化・省力化すべき仕事達

# 自動化・省力化すべき仕事達
* `~/.ssh/known_hosts`から、インストールし直したマシンを削除する仕事
* preseedを使わずUbuntuをインストールする仕事
* Ubuntu Serverインストール後コンソールで、`/etc/ssh/sshd_config`の`PermitRootLogin without-password`を`PermitRootLogin yes`に変更して`service ssh restart`する仕事

## タンポポじゃなく食菊なんですね
[刺身の上にタンポポをのせる仕事の採用試験に受かったお！！！！！](http://applepolishing.blog.fc2.com/blog-entry-377.html)
tmux+iTerm2設定

表題の組み合わせでターミナルの環境を作りました。
個人的にハマったところと解消法法、および便利だと思う設定を記載します。

## .tmux.conf

### prefixをデフォルトから(`C-b`)を変えたい

prefixのデフォルトの`C-b`はEmacsのキーバインドとぶつかるので`C-t`に変更。また`<prefix> r`で.tmux.confをリロードする。

```
unbind C-b
set -g prefix C-t
#私は設定していませんが、prefixを連続で押すとprefixのキーを押したことにする設定の方が多いです。
#bind C-t send-prefix

unbind r
bind r source-file ~/.tmux.conf \; display-message "~/.tmux.conf is reloaded"
```

### 使いやすいキーバインドに変える

よく使う操作は押しやすいキーバインドを設定した方がよいです。`.tmux.conf`を編集し`<prefix> r`を押すだけで反映されます。

```
bind 0 kill-pane
bind 1 kill-pane -a
bind 2 split-window -v
bind 3 split-window -h
bind t new-window
bind w kill-window
bind l next-window
bind h previous-window
bind a kill-window -a
bind q kill-session
```

### prefixを押さずに操作したい

`bind -n`でprefixなしのキーバインドを設定できます。

```
bind -n C-o  select-pane -t :.+
```

### prefixを押さずに操作したい(その2)

`bind -r`で設定した操作は二度目以降prefixを省略できます。例えば`C-t C-l C-l`で二つ右のwindowに移動できます。

```
bind -r C-o select-pane -t :.+
bind -r C-l next-window
bind -r C-h previous-window
bind -r C-t new-window
bind -r C-w kill-window

#次の操作の受付時間はデフォルト0.5秒ですが変更できます。下記で1秒になります。
set -g repeat-time 1000
```

### ステータスバーをカスタマイズしたい

* ステータスバーを上に表示
* 色をブラウザのタブ風の灰色＋白（選択中のタブ）に変更しています。
* windowの間に`|`を挟むと若干見やすい気がします。
* windowのindexを指定して移動することがないので表示させていません。

```
set -g status-position top
set -g status-fg black
set -g status-bg colour246
set -g window-status-current-fg black
set -g window-status-current-bg colour255
set -g window-status-format " #W |"
set -g window-status-current-format " #W |"
set -g status-left ""
set -g status-right "#[fg=black][#S]"
```

### マウスを使いたい

下記設定でマウスを使ったスクロールと範囲選択ができるようになります。

```
set -g mode-mouse on
set -g mouse-utf8 on
set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on
```


### windowの履歴の行数を増やす

```
set -g history-limit 10000
```

### Escを押したときすぐ反応させる

```
set -s escape-time 0
```

## iTerm2の設定

### 指定した色が表示されないとき

iTerm2上でtmuxのステータスバーなどを256色で表示するため環境変数`TERM`を変更します。
iTerm2の`Preferences -> Profiles -> Terminal -> Report Terminal Type`を`xterm-256color`に変更。

```bash
$ echo ${TERM}
xterm # 変更前
xterm-256color # 変更後
```

### コピー＆ペースト

上記の設定だと範囲選択と`Cmd-c`によるコピーができませんが、`Option`を押しながら範囲選択するとコピーできます。

## エイリアス

よく使うtmuxコマンドにはaliasを設定すると便利です。

```bash
alias a='alias'
a t="tmux"
a tl="t ls"
function ta() {
  if [ -z $1 ]; then
    t a
  else
    t a -t $1
  fi
}
function tk() {
  if [ -z $1 ]; then
    t kill-session
  else
    t kill-session -t $1
  fi
}
```
Postfix + Dovecot


[dovecot](http://www.dovecot.org/)
[postfix](http://www.postfix.org/)
##postfix

インストール

```
# yum -y postfix
```

dovecotが使えるか確認

```
# postconf -a
cyrus
dovecot
```

###saslauthdの起動設定
```
# chkconfig --list saslauthd
saslauthd      	0:off	1:off	2:off	3:off	4:off	5:off	6:off
```

saslauthd が起動している場合には停止します。

```
# service saslauthd stop
saslauthd を停止中:                                        [  OK  ]
```


```/etc/postfix/main.cf
# smtpd
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
```

```
# chkconfig --add postfix
# chkconfig postfix on
```
##Dovecot
Dovecot(ダヴコット)

###インストール

```
# yum -y dovecot
```

```
# doveconf -n > dovecot-new.conf
```

```/etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login
!include auth-passwdfile.conf.ext                                |~
```

```/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/mail
```

```/etc/dovecot/conf.d/10-ssl.conf
ssl = no
```

```
# dovecotpw -s CRAM-MD5
Enter new password:
Retype new password:
{CRAM-MD5}9bde2235538debe003(適当。実際はもっと長い)
```

```
service auth {
  # auth_socket_path points to this userdb socket by default. It's typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Its default
  # permissions make it readable only by root, but you may need to relax these
  # permissions. Users that have access to this socket are able to get a list
  # of all usernames and get results of everyone's userdb lookups.
  #unix_listener auth-userdb {
    #mode = 0600
    #user =
    #group =
  #}

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Auth process is run as this user.
  #user = $default_internal_user
}
```

```
# doveadm pw -s CRAM-MD5 -p password_text
{CRAM-MD5}b886583547b95cdc00787f360498c3c37ac6eed08ec910b5b4bd1484e8ec2b26
```
Phalcon で Plugin クラスを使う

# Plugin クラス

Plugin は EventManager などに `attach()` させて処理を埋め込む感じで使うらしい．

下記のものは例．実験した限りだと `attach()` した順番で呼ばれるので，アクションが実行される前，あるいはされた後のフィルタとして使える？（[javax.servlet.Filter](http://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html) や  [Play2 の play.mvc.api.Filter](http://www.playframework.com/documentation/2.1.4/api/scala/index.html#play.api.mvc.Filter)， [Rails のフィルタ](http://railsdoc.com/references/filter) のような）
サンプルからこう使うんだろうなぁという推測でやったような感じ．

```php
<?php

namespace Timeline\Frontend;

use Phalcon\Loader;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\ModuleDefinitionInterface;
use Timeline\Frontend\Plugins\Header;

class Module implements ModuleDefinitionInterface
{
    public function registerAutoloaders()
    {
        $loader = new Loader();
        $loader->registerNamespaces(array(
            'Timeline\Frontend\Plugins' => __DIR__.'/plugins/',
        ));
        $loader->register();
    }

    public function registerServices($di)
        $di['dispatcher'] = function() use ($di) {
            $eventsManager = $di->getShared('eventsManager');
            $eventsManager->attach('dispatch', new Header($di));

            $dispatcher =  new Dispatcher();
            $dispatcher->setEventsManager($eventsManager);

            return $dispatcher;
        };
    }
}
```

```php
<?php

namespace Timeline\Frontend\Plugins;

use Phalcon\Events\Event;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\User\Plugin;

class Header extends Plugin
{
    public function beforeDispatch(Event $event, Dispatcher $dispatcher)
    {
        $this->response->setHeader('X-Frame-Options', 'SAMEORIGIN');
        $this->response->setHeader('X-Content-Type-Options', 'nosniff');
    }

}
```

Header がちゃんと付与されているかの確認．

```bash
$ curl -s -I http://localhost/ | egrep "X-Frame-Options|X-Content-Type-Options"
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
```

# 参考文献

Plugin と Component はどう違うの？

> Plugin vs Component: what's the difference? - Discussion - Phalcon Framework
>
> http://forum.phalconphp.com/discussion/383/plugin-vs-component-what-s-the-difference-

プラグインを使った例

> チュートリアル 2: INVOについて説明します — Phalcon 1.3.1 documentation
>
> http://docs.phalconphp.com/ja/latest/reference/tutorial-invo.html

プラグインとして実装する場合の例（ACL を使う）

> PHP - Implementing an API ACL in Phalcon
>
> http://www.rogerethomas.com/blog/php-implementing-an-api-acl-in-phalcon

紛らわしい記述だけど昔のドキュメントに "should not" と書かれていたらしい．今は気にしなくて良い様子．

> WHY Plugins should not extend the class Phalcon\Mvc\User\Plugin? - Discussion - Phalcon Framework
>
> http://forum.phalconphp.com/discussion/49/why-plugins-should-not-extend-the-class-phalcon-mvc-user-plugin-

上記の修正に対するコミットだと思う．

> Re-adding 1.0.0 · 94eb834 · phalcon/docs
>
> https://github.com/phalcon/docs/commit/94eb8342acfa895224754dc3f9d746a9fc36beb0#diff-13
面白い数学

いや〜、進数変換は出来てるんですが、そこからがうまくいかない。解法が違うのだろうか・・・。全探索が未だに出来ていないという事実に押しつぶされてしまいそうです。（だがくじけない）これはもう、ひたすら全探索解いて頭に刷り込ませるしかないですね！！（白目）最初、ArrayList使えばメモリ節約出来るのでは・・・？と考えましたが、結局最後にint型配列に入れこむという処理が出てくるので、そのままやろうと考えました。ポジティブ思考で行こう！！俺は出来る！俺は出来る！！いけるぞ！！俺！

問題元：SRM150 Div2 Level2

```java:
public class Interesting {	
	
	public static int[] digits(int base) {
		int[] ret = new int[1000];
		for(int r = 1; r < 1000; r++) {
			int sum = 0, num = r;
			while(num != 0) {
				sum += num % base;
				num /= base;
			}
//			System.out.println("sum:" + sum); //DEBUG
			System.out.println("r:" + r + ", sum:" + sum);
			if(sum != 0 && sum != 1) {
				if(r % sum == 0)
					ret[sum]++;
			}
		}
		return(ret);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final int base = 10;
		
		int[] ans = digits(base);
		for(int r = 0; r < ans.length; r++) {
			if(ans[r] > 0)
				System.out.print(r + " ");
		}
	}
}


```

解決策１（４重ループによる全探索）

```java:
public static int[] digits(int base) {
		ArrayList<Integer> v = new ArrayList<Integer>();
		
		for(int n = 2; n < base; n++) {
			boolean ok = true;
			for(int k1 = 0; k1 < base; k1++) {
				for(int k2 = 0; k2 < base; k2++) {
					for(int k3 = 0; k3 < base; k3++) {
						if((k1 + k2* base + k3 * base * base) % n == 0 && (k1 + k2 + k3) % n != 0) {
							//nの倍数の数で、各桁の和がnの倍数えなければ、このときのnは除外する
							ok = false;
							break;
						}
					}
					if(!ok) break;
				}
				if(!ok) break;
			}
			if(!ok) v.add(n);
		}
		int[] ans = new int[v.size()];
		for(int r = 0; r < v.size(); r++) ans[r] = v.get(r);
		
		return(ans);
	}
	
```

解決策２（数式を用いて、処理を減らしたやり方）
数式：
a　× n^2 + b　× n^1 + c
a × (n - 1)^2 + (b - 2a) × (n - 1) + (a + b + c)
((a × (n - 1) + b - 2a) × (n - 1)) + (a + b + c)

```java:
public static int[] digits(int base) {
		Vector<Integer> v = new Vector<Integer>();
		
		for(int r = 2; r < base; r++) {
			if((base - 1) % r == 0) v.add(r);
		}
		int[] ans = new int[v.size()];
		for(int r = 0; r < v.size(); r++) {
			ans[r] = v.get(r);
		}
		return(ans);
	}
```
Xamarin.FormsのDependencyService.Get<T>()はSingletonなのか？


## DependencyServiceとは

DependencyServiceはXamarin 3.0で追加されたXamarin.Formsに含まれる、依存性注入のための仕組みです。ドキュメントはこちら。

[Accessing Native Features via the DependencyService](http://developer.xamarin.com/guides/cross-platform/xamarin-forms/dependency-service/)


## DependencyServiceの使い方

ドキュメントを要約すると以下のような感じです。

1. Sharedプロジェクトでインターフェースを定義。
2. 各プラットフォームのプロジェクトでインターフェースを実装。
3. assemblyに付けるDependencyという属性でインターフェースの実装クラスを宣言。
4. `DependencyService.Get<T>()`でインスタンスを取ってきて使う。

## 結論：DependencyService.Get&lt;T&gt;()のパラメータで変わる

`DependencyService.Get<T>()`の引数に`DependencyFetchTarget.GlobalInstance`を指定すると常に同じインスタンスを取得できます。これはデフォルト引数でもあるため、何も指定しない場合も同じ結果になります。

新しいインスタンスを取得したい場合は、引数に`DependencyFetchTarget.NewInstance`を指定します。


## 検証

新規にUniversal Xamarin.Forms Project(PCL)を作成します。

Sharedプロジェクトにインターフェースを定義。

```ICounter.cs
namespace FormsDI
{
	public interface ICounter
	{
		int GetCurrent();
		int CountUp();
	}
}
```

実装クラスAndroid側。

```Counter_Android.cs
using Xamarin.Forms;
using FormsDI;
using FormsDI.Android;

[assembly : Dependency(typeof(Counter_Android))]

namespace FormsDI.Android
{
	public class Counter_Android : ICounter
	{
		private int count = 0;

		public Counter_Android ()
		{
		}

		public int GetCurrent()
		{
			return count;
		}

		public int CountUp()
		{
			return ++count;
		}
	}
}
```

実装クラスiOS側。

```Counter_iOS.cs
using Xamarin.Forms;
using FormsDI;
using FormsDI.iOS;

[assembly : Dependency(typeof(Counter_iOS))]

namespace FormsDI.iOS
{
	public class Counter_iOS : ICounter
	{
		private int count = 0;

		public Counter_iOS ()
		{
		}

		public int GetCurrent()
		{
			return count;
		}

		public int CountUp()
		{
			return ++count;
		}
	}
}
```

Sharedプロジェクトにメインページ定義とDependencyService取得のコードを追加します。

```MainPage.cs
using Xamarin.Forms;

namespace FormsDI
{
	public class MainPage : ContentPage
	{
		public MainPage ()
		{
			var count = new Button {
				Text = "Click Me!",
				VerticalOptions = LayoutOptions.CenterAndExpand,
				HorizontalOptions = LayoutOptions.CenterAndExpand,
			};
			count.Clicked += (sender, e) => {
				count.Text = 
					DependencyService.Get<ICounter>(
//						DependencyFetchTarget.NewInstance
						DependencyFetchTarget.GlobalInstance
					).CountUp()
					+ " times clicked!";
			};
			Content = count;
		}
	}
}
```

```App.cs
using System;
using Xamarin.Forms;

namespace FormsDI
{
	public class App
	{
		public static Page GetMainPage ()
		{	
			return new MainPage ();
		}
	}
}
```

MainPage.cs中の`DependencyFetchTarget.NewInstance`と`DependencyFetchTarget.GlobalInstance`をコメントアウトで切り替えながら実行してみてください。

`DependencyFetchTarget.NewInstance`を指定するとボタンを押す度に新しいインスタンスが取得されるためカウントが進みませんが、`DependencyFetchTarget.GlobalInstance`を指定すると毎回同じインスタンスを取得できるため、カウントが加算されていく様子を確認できると思います。


## サンプルダウンロード

GitHubに置いておきますので[こちら](https://github.com/P3PPP/FormsDI/tree/master)からどうぞ。
LESS 圧縮時にライセンスを削除しない。

`lessc --compress` した時に、消したくないコメントがある、
[公式サイト](http://lesscss.org/)のマニュアルには載っていない気がする。
がとりあえず BootStrap のコードを読んでいたら[それっぽいの](https://github.com/twbs/bootstrap/blob/master/dist/css/bootstrap.min.css)を発見。

コメントブロックを `/*!` で始めれば良さそう。

### `!` 無し

```normal.less
/* COPYRIGHT hoge */
@base: #f938ab;

.box {
  color: saturate(@base, 5%);
  border-color: lighten(@base, 30%);
}
```

```normal.css
.box{color:#fe33ac;border-color:#fdcdea}
```


### `!` 有り

```bang.less
/*! COPYRIGHT hoge */
@base: #f938ab;

.box {
  color: saturate(@base, 5%);
  border-color: lighten(@base, 30%);
}
```

```bang.css
/*! COPYRIGHT hoge */.box{color:#fe33ac;border-color:#fdcdea}
```
Ubuntu Server 14.04(Trusty)構築時に微妙にハマりやすいポイント/Tips


## Debian-Installerでハマる
* network-consoleモジュール使用時のパスワード内に記号を含めるとログイン出来ない?!  
https://wiki.debian.org/DebianInstaller/NetworkConsole
* ` ssh installer@ホスト` このユーザー名指定を忘れてしまう。特にMacクライアントで作業してると自分がrootでないことをすっかり忘れてる
* 再インストール時にLVM関連ボリュームが消せないんで、事前に消しておくか「ガイドによるパーティショニング」でディスク全部を選び無理やり消して回る (が、preseedみたいに残骸を一発で消したい)
* RAIDはその中を上書き削除すれば消せるが、swapにしてたRAIDボリュームが今消せなくってrebootして負け
* preseedマスターして「刺し身タンポポ」卒業したいけど、その前にVagrantマスターしないと
* 14.04(Trusty)から下記のようになってるんで、いきなりsshログイン出来ない

````/etc/ssh/sshd_config
PermitRootLogin without-password
````

* 14.04(Trusty)のRAIDインストール後起動時に、`Error: diskfilter writes are not supported`と出るがほっておいても起動するんで気にしない。気にする場合は、  
https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1274320/comments/34

## Tips
*RAID構築後

````
同期速度確認
sysctl dev.raid.speed_limit_max
sysctl dev.raid.speed_limit_min

変更
sysctl -w dev.raid.speed_limit_max=値
sysctl -w dev.raid.speed_limit_min=値

同期状況確認
watch -n1 cat /proc/mdstat
````

その他[RAID resync/rebuild関係](http://www.cyberciti.biz/tips/linux-raid-increase-resync-rebuild-speed.html)
最新のiOSの機能を古いiOSバージョンで試す方法

# 古いバージョンに対応したいなぁ

最新のXcode (5.1.1) では、通常simulatorが6.0までしか入りません。

しかし、ビルドバージョンは4.3まで指定できる！
じゃあ一度くらい動かしてみたい！

# 試したこと

今回試してみたことは、最新のiAd.frameworkに付属している、ADClientを古いバージョンのiOSで動かしてみるということです。

# やりかた

まず、最新のxcodeのディレクトリからファイルを引っ張ってきます。

```zsh

$ Latest="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks/iAd.framework"
$ Older="/Applications/Xcode5.0.2.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks/iAd.framework"
$ cd $Older
$ mv $Latest/Headers/ADClient.h Headers
$ mv iAd bck_iAd # バックアップの作成
$ cp $Latest/iAd . 
```

もし実機でもテストしたいという際は、パスを以下のようにするとできます。
```iPhoneSimulator.platform →　iPhoneOS.platform
```

このようにすると、動きました。
まぁ、当たり前っちゃ当たり前ですね。
RでSTAP細胞を探す

```{r}
n <- length(LETTERS)
      
while(1){
  x <- do.call(paste, c(as.list(LETTERS[sample(1:26, 4, replace=T)]), sep=""))
  print(paste(x, "細胞"))
  if(x == "STAP"){
    print("陽性かくにん！")
    print("よかった☆")
    break
  }
}
```
「第14回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://qiita.com/Nabetani/items/66806c9dc14a96f2fd42
http://nabetani.sakura.ne.jp/hena/ord14crosscircle/
円周上のCrossing

正直さっぱりわからなかったので諦めて他人の解答を見たのだが、余計わからなかった。
とりあえず1文字追加するごとに増える本数を数え上げるという形式で実装してみたところ、後半の問題が時間がかかりすぎて終わらないという有様に。
どうすればいいんだろう。

```php
<?php
	class CROSSCIRCLE{
		/**
		* 円周上のCrossing
		* @param String 「aabbca1bcb」みたいな文字列
		* @return int 「14」みたいな数値
		*/
		public function get($input){
			// 初期値
			$count = 0;
			
			// 頭からくるくる
			for($i=0; $i<strlen($input)-1; $i++){
				$pos = $i+2;
				// 先に同じ文字が見つかれば
				while(($pos = strpos($input, $input[$i], $pos)) !== false){
					// 該当の文字で左右に区切る
					$c1 = count_chars(substr($input, $i+1, $pos-$i-1), 1);
					$c2 = count_chars(substr_replace($input, '', $i, $pos-$i+1), 1);
					// 左右に同じ文字があれば、文字数の積が交点の数
					foreach($c1 as $key=>$val){
						if(isset($c2[$key])){
							$count += $val*$c2[$key];
						}
					}
					$pos++;
				}
			}
			// 半分
			return $count/2;
		}
	}
	
	// 以下はテスト
	$test = [
		['aabbca1bcb', '14'],
		['111ZZZ', '0'],
		['v', '0'],
		['ww', '0'],
		['xxx', '0'],
		['yyyy', '1'],
		['zzzzz', '5'],
		['abcdef', '0'],
		['abcaef', '0'],
		['abbaee', '0'],
		['abcacb', '2'],
		['abcabc', '3'],
		['abcdabcd', '6'],
		['abcadeabcade', '23'],
		['abcdeedcba', '0'],
		['abcdeaedcba', '8'],
		['abcdeaedcbad', '16'],
		['QQQQXXXX', '2'],
		['QwQQmQXmXXwX', '14'],
		['111222333', '0'],
		['aaAAaA', '4'],
		['121232313', '12'],
		['1ab1b', '1'],
		['abcdefbadcfe', '12'],
		['abxcdefbadcfex', '14'],
		['dtnwtkt', '0'],
		['mvubvpp', '0'],
		['moggscd', '0'],
		['kzkjzpkw', '2'],
		['fbifybre', '1'],
		['rrrfjryki', '1'],
		['wrbbdwsdwtx', '2'],
		['vvucugvxbvgx', '9'],
		['ojkjzyasjwbfjj', '5'],
		['ggffyuxnkyypifff', '5'],
		['vcgtcqlwrepwvkkogl', '4'],
		['xeqtmmgppwcjpcisogxbs', '4'],
		['lukltpeucrqfvcupnpxwmoj', '6'],
		['zpzswlkkoqwwndwpfdpkhtzgtn', '31'],
		['bkfeflagfvluelududqjcvfyvytfw', '45'],
		['rvqbhfmcjjqlpqzulzerxgyowiwrfkmhw', '26'],
		['qyxvpdtoeexbqsethwjwmqszcxxjnsdoeaet', '144'],
		['rjmsgmswhcolmpbhmpncziymydyalrcnevsrespj', '133'],
		['oxetnyjzjbysnwktfwzndlejfndsqeetsnjvsicyjehd', '395'],
		['wzvddnddzogywcqxbyvagbzmsmtcmrrlbnebmvhaemjouaqim', '219'],
		['karhphxcxqgsyorhusbumbqzocuzvnwzwcpxgsksrviihxrgsrhji', '461'],
		['oxgbononhqdxzmkysgijwvxljpaazmgkurkpffeuwywwuyxhyfkicgyzyc', '441'],
		['sdgsrddwsrwqthhdvhrjhgtxwgurgyiygtktgtughtogzaqmcafkljgpniddsvb', '1077'],
		['qemhecchkgzhxmdcsltwhpoyhkapckkkzosmklcvzkiiucrvzzznmhjfcdumuflavxik', '1711'],
		['ffqmsirwpxrzfkbvmmfeptkbhnrvfcywthkwkbycmayhhkgvuyecbwwofwthlmzruphrcujwhr', '2440'],
	];

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

普通に数えた。

まず1文字目の'a'に注目。
次に出てくる'a'を探すと、2文字目の'a'は間に線を引けないのでパス。
次の'a'は6文字目なので、そこで文字列を分解して'abbc'と'1bcb'を得る。
分解した文字のうち、'a'と'1'は片方にしかないので線を引けない。
'c'は左右に1つずつなので交点数は1*1=1。
'b'は左右に2つずつなので交点数は2*2=4。
次の'a'は存在しない、これで1文字目の'a'については終了。

次に1文字目の'a'に注目。
とまあ繰り返していって全部の合計を出した。
実行時間は0.1秒以下になった。はやい。

なお、最後の$pos++をwhile条件に突っ込もうとすると何故かWarningが発生します。
Javascript でtry-catchは使ってはダメ

##内容
ネストが深かったり、return面倒だったりtry-catchを使いたくなる時があるかもしれません。
ただし、高速なWebアプリケーションを作るなら絶対使わないようにしましょう。

##テストケース
http://jsperf.com/try-catch-vs-if-vs-inline-if

```javascript:try-catch
try {
 a
}catch(e) {
 a = {};
}
delete a;
``` 

```javascript:if
if (typeof a === "undefined") {
  a = {};
}
delete a;
```
##手元の結果
ifで処理したほうが30倍くらい速かったです。
インラインで書いてみましたがあまり変わりませんでした。
[XNA][PhysX] BulletXをPhysXに置き換える（DOING）

# はじめに
BulletXは、MMDX作者の方がXNA用にポーティングされたC#オンリーの実装です。
長年使わせていただいていましたが、動きがぽよんぽよんしている問題があり、どうにかしたいと思っていました。
試しにBulletSharpにしてみたのですが、何かまずかったのか、かくかくな物理になりましたので、却下。
そこで、対抗馬でありC#の実装がありサンプルも素晴らしかったPhysXを使えないかともやもやしていたところ、ひょんなことからLeapMotionを手に入れ、一気にモチベーションアップしたので、置き換えてみることにしました。

# BulletからPhysX
サンプルが素晴らしかったPhysX.Netの2.8を使います。
https://github.com/stilldesign/PhysX.Net

目的はMMDXの物理エンジンを置き換えることなので、MMDXで使っていない機能は不要です。
MMDXでは、モデルのジョイントの実装にGeneric6DofSpringConstraintを使っているのですが、PhysXでも同じのがあるので、やった、簡単だ、と思ったのが間違いでした。

設定できるパラメータが全然違います。
BulletではジョイントにXYZ方向の最大値最小値の制限を設定できるのですが、PhysXではTwistMotionだけにHigh/Lowが設定できて、他はValueだけ。
PhysXはマイナーなのか、ググってもまともな情報はなし。
公式の方の仕様もなし。MSDNを見習ってほしいものです。
唯一の日本語書籍と思われる某先生の本もさらってみたのですが、肝心なところが書いていません。

# MMD for Unityを参考にする
途方に暮れていたところ、UnityがPhysXを使っているという情報をゲットしました。
残念ながらUnityの本には特に書いてなかったのですが、Unityなら動いているMMDの実装があるではないですか。
さっそく失礼して拝見してみたところ、ありました。やりました。
他のパラメータも同様に参考にさせてもらいましたが、PhysXのバージョンが違うのか、ところどころパラメータが違います。
ジョイントがゆっくり外れたり、ジョイントの端が空間に固定されたり、springやdampingなどの設定がおかしかったり、まだまだいろいろありますが、とりあえず、少しずつ動くようになってきました。
まずはここまで。

ソースコード：
https://github.com/yhirano-/STFW/tree/master/SLPhysics
mod_deflateでネットワーク転送量を削減

Apahceのモジュール「mod_deflate」以前使ったのでまとめたyo!



# mod_deflateモジュール
送信するコンテンツを圧縮するモジュール。

## メリット
コンテンツを圧縮することでネットワーク帯域を節約できる。

## デメリット
コンテンツを圧縮する際にCPUをある程度使う。

## 導入の基準
CPUに余裕があって、ネットワーク帯域の負荷を軽減したい場合に導入する。

```httpd.conf
LoadModule deflate_module modules/mod_deflate.so
SetOutputFilter DEFLATE
DeflateCompressionLevel 7
```


SetOutputFilterは、リクエストに対するレスポンスを送る前に処理するフィルタ設定。
DEFLATEを指定するとすべてのコンテンツに対して圧縮する設定。
INCLUDEを指定するとSSI(Server Side Includes)を有効化。
複数設定したい場合はセミコロンでつなぐ。

DeflateCompressionLevelは、1～9まで設定できる。
1が最も圧縮率が小さく、9が最も圧縮率が大きい。

設定いれたらApache再起動でモジュールロード。
画像を好みの位置でトリミングする / Rails + jQuery UI draggable

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2095">元の記事はコチラ</a>
- - - - - - - - - - - 
画像を投稿させるサービスで、ユーザーが推奨サイズ比率ではない画像をアップロードした場合、好みの位置でトリミングさせるやつを考えてみた。TwitterとかFacebookのカバー写真をアップロードした時のアレです。今回はズームとか無しで、縦方向のみの位置調整にしてみました。（画像のwidthは100%）

　　
画像をトリミングして保存するわけでなく、単に画像位置を動かして、表示範囲以外は見えなくする方法を取っています。切り取ってしまうと、他のレイアウトで使う時に困ることもあるので、個人的にはこの方法が好みです。
　　

###準備

自分はRailsを使っているので、こんな感じ。

Gemfile

```
gem 'jquery-ui-rails'
```

　　

assets/javascripts/application.js

```
//= require jquery
//= require jquery.ui.widget
//= require jquery.ui.droppable
```

　　
###考え方

![drag-and-drop](http://image.workabroad.jp/upload/2014/144/workabroad.jpg)

Rails側はこんな感じ。
PostモデルとImageモデルがあって、Postはサムネイル画像を1枚持ちます。
（Post belongs to image）
画像の位置はimage_posでpostsテーブルに保存します。


models/post.rb

```
class Post < ActiveRecord::Base
	belongs_to :image
end

```

　　
見た目の例は、こんなのです。
CSSは適当なので、環境に合わせて変更してください。

views/posts/edit.html.erb

```erb

	<div class="image_attach">
		<%= f.hidden_field :image_id, id: "thumb", data: { draggable: true } %>
		<%= f.hidden_field :image_pos %>
		<% if post.image.present? %>
			<%= image_tag "http://workabroad.jp/image.jpg", style: "top: #{post.image_pos}%" %>
		<% end %>
	</div>

```

　　
assets/stylesheets/posts.css.scss

```scss
.image_attach {
  height: 300px;
  overflow: hidden;
  position: relative;
  img {
    width: 100%;
    position: absolute;
    top: 0;
  }
}

```
　　

###Javascriptで実装する

使い回しが効くように、外部ファイルにしました。

assets/javascripts/common.js.coffee

```coffee

class window.Image

	# Draggable
	@enable_drag: ->
		img = $('.image_attach img')
		box = $('.image_attach')
		pos = $('#post_image_pos')

		$('.image_attach img').draggable({
			axis: "y"
			stop: (event, obj) ->
				# Set position
				range = img.height() - box.outerHeight()
				moved = obj.position.top / box.height() * 100 
				# Top max
				if img.position().top > 0
					img.css('top', '0px')
					moved = 0
				# Bottom max
				if Math.abs($(this).position().top) > range
					img.css('top', '-' + range + 'px')
					moved = -range / box.height() * 100 

				pos.val(moved)
		})

```

　　
assets/javascripts/posts.js.coffee

```coffee

ready = ->
	# Draggable
	if $('#thumb').data('draggable') == true
		Image.enable_drag()

# For turbolinks
$(document).ready(ready)
$(document).on('page:load', ready)

```

ドラッグが終了するタイミング（ドロップ）で、```f.hidden_field :image_pos``` の値を変更しているだけです。今回はレスポンシブデザインを想定しているので、保存する値はpxでなくて、%にしました。

あとはViewで画像を表示する時に、``` image_pos``` の値を ```style="top: #{post.image_pos}%"``` のように挿入すればいいかと。
　　





 → <a href="http://workabroad.jp/posts/2095">http://workabroad.jp/posts/2095</a>
Vagrantでconcrete5日本語版の環境をセットアップする

#推薦ページご紹介

concrete5 日本語の Vagrant ファイルを作りました - Qiita
http://qiita.com/katzueno/items/5612615278e7a0fbc382

Vagrantfileを手で更新しなくても良くなったようです。

----

#概要
vagrant-concrete5/README.md at master · miya0001/vagrant-concrete5 · GitHub
https://github.com/miya0001/vagrant-concrete5/blob/master/README.md

concrete5日本語版をインストールした環境を作りたかったので、上記URLを基に、自分に理解できるレベルに落としつつ、日本語にしてみた。

#前提
- 環境はMac
- VirtualBoxがインストールされている
- Vagrantがインストールされている

#手順
- Chef Development Kitをインストールする
- Vagrantのomnibusプラグインをインストールする
- gitでリポジトリをクローンする
- クローンしたディレクトリ```vagrant-concrete5```にカレントディレクトリを移動する
- CookBooksをインストールする
- ```Vagrantfile```の下記部分を変更する

```
            :git_repository => 'https://github.com/concrete5japan/concrete5.git',
            :git_revision   => '5.6.3.1.ja',
```

最新バージョンが何かは、concrete5 Japan 日本語公式サイトにて確認する。

- ```vagrant up```を実行
- ```http://127.0.0.1:8080/```にアクセス

#参考
以下のページを参考にさせていただきました。感謝いたします。

miya0001/vagrant-concrete5 · GitHub
https://github.com/miya0001/vagrant-concrete5

さぁconcrete5を勉強しよう。Vagrantでconcrete5構築環境作ってみた。 | Aistear Engineer Blog β
http://engineer.aistear.info/573

concrete5 Japan 日本語公式サイト
http://concrete5-japan.org/
プロジェクトGit運用手順まとめ


# 本記事について

現在プロジェクトでGitを利用しているが、運用フローが確立されておらず非効率な状態になっているため、効率的なフローで運用する手順を明確にするために、Git運用手順をまとめる。

# Git運用手順

## masterの取得 (git clone)

```Bash
cd /GIT_CHECKOUT_DIR/
git clone git@github.com:hogehoge/hogehoge.git
```

## 開発ブランチの作成 (git checkout)

開発ブランチを `master` から作成する。
ブランチ名は説明的な名前とすること。
（例: rename-wrong-class, add-payment-module）

```Bash
cd hogehoge
git checkout -b 作成するブランチ名
```

※ブランチの情報を確認する場合は

```Bash
git branch -a
```

## コード修正

思う存分にコードを編集しましょう。

## ローカルコミット (git commit)

```Bash
git status # git管理下にあるファイルの状態を確認
git add ファイル指定 # 編集したファイルをコミット対象に登録する
git commit # vimが立ち上がり、コミットメッセージを入力して保存、vimを閉じるとコミットが完了する
```

## masterに入っている修正をブランチに取り込む

### ローカルのmasterを最新にする (git pull)

編集作業中にmasterにコミットが入ることは多々あるので、masterに入っている修正を修正ブランチに取り込む。
この時、修正したファイルは全てローカルブランチにコミットし、修正ブランチは編集中のファイルが無い状態にしておくこと。

```Bash
git checkout master # masterに移動
git pull # masterの状態を最新にする
```

### 修正ブランチでrebase実施 (git rebase)

```Bash
git checkout - # 一つ前にいたブランチに戻る この例では修正ブランチに戻る
git rebase master # リベースを実施する
```

#### コンフリクトが発生した場合

```Bash
vim /PATH_TO_FILE/conflict.file # コンフリクトしたファイルを手動マージ
```

コンフリクトしたファイル全てをマージ後

```Bash
git add /PATH_TO_FILE/conflict.file # 手動マージしたファイルをadd
git rebase --continue
```

#### rebase前の状態に戻したい時

```Bash
git rebase --abort
```

## 修正ブランチをremoteにpush (git push)

rebaseが正常に完了したら、remoteにpushする

```Bash
git push origin pushするローカルブランチ名:remoteのブランチ名
```

## Pull Requestを送る

正常にremoteにpushされたかをGitHub画面から確認し、問題無ければPull Requestを作成する

## Pull Requestのマージ

Github上で送信されているPull Requestを確認し、問題無ければマージする
※このとき、マージされたブランチは削除してしまってOK

### 注意点

Pull Requestを作成する際は必ずコンフリクトが発生しない状態にすること
Github上でAuto MergeができないPull RequestはRejectする

## ちょっと便利なTips

よく使うコマンドはshellのaliasにしておくといいかも。

```Bash:.bashrc
alias gc='git checkout'
alias gb='git branch'
```

とかとか。
eclipseでプッシュ通知実装していた人がandroid studioに乗り換えるときにつまずくこと

# 前提

 - eclipseでAndroidアプリを作っていた
 - google play service SDKを使っていた
 - android studioをセットアップしたので、eclipseで作ったプロジェクトをimportしたい

# どこでつまずくのか

この[Set Up Google Play Service SDK](http://developer.android.com/google/play-services/setup.html)をご覧いただくと、

Install the Google Play Service SDK
の項目の４ステップ目に、eclipseを使用する場合のみの設定が書かれている

google-play-service_libというプロジェクトをコピーしておいて、
プッシュ通知を利用するプロジェクトにリファレンスを設定するというもの。

この外部プロジェクトへのリファレンス設定があるeclipse製プロジェクトを、
Android Studioでimportしようとすると、
そんなプロジェクトないよ！ってエラーがでる。

そこで、eclipseで作成していたプロジェクトの中にある、
project.propertiesをテキストエディタで開いて、

以下の設定があれば削除する
<pre>
android.library.reference.1=../google-play-services_lib
</pre>

これを行えば、android studioへのインポートが可能になるはず。
では、android studioでgoogle play service を使う場合は
どうするのか

SDKマネージャーを開いて

 - Google Play Service SDK
 - Google Repository

をインストールする。
英語のドキュメント読んでいたら、
特に２つ目のGoogle Repositoryに気づかなくて、
ちょっとはまっていました。

へっぽこアプリエンジニアのつまずきポイントなんて、
みなさん華麗にスルーしているかもしれませんが、

誰かの役に立てれば幸いです。

（ちゃんと図とかいれようかなぁ。。。）
InternetExplorer10 クラッシュ

# InternetExplorer10 クラッシュ
障害対策メモ
発症機：Windows7（32ビット, 64ビット）

## 症例：iexplore.exe
Windows7機のIEをバージョンアップ後、起動直後にクラッシュする現象。

## 検証：mmc.exe
コントロールパネル->管理ツール->イベントツール
イベントログ見てもあまりよくわからない。
チェックする項目。
・グラボのスペック、最新のドライバが適応されているか。（GPUアクセラレータ由来のため）

## 対策：GPUレンタリング無効
コントロールパネル->インターネットオプション->インターネットのプロパティ
を起動し詳細設定から、アクセラレータによるグラフィック下記を変更
GPUレンタリングではなく、ソフトウェアレンタリングを使用する　オン

その他
自動クラッシュ回復機能を有効にする　オフ

上記設定を変更することで起動時のクラッシュを回避。

## 原因：GPU
GPU支援を使用していることによる不具合の可能性あり。
古いPCやドライバが古いもの、相性などもある可能性あり。

## その他
ダウングレードは、コントロールパネル->Windowsの機能の有効化または無効化で消した後、
インストールされた更新プログラムを表示から、
Internet Explorer 10 ja-JP Language Pack
Windows Internet Explorer 10
の順に削除

アップグレードは基本パッケージをMSDNから拾ってくる。
[XNA][LeapMotion] Skeletal Trackingを使う

# はじめに
指の動きをキャプチャーしたい欲求があり、初めはたくさん持っているKinectでやろうと思ったのですが、いろいろハードルが高そうだったのでやめました。
http://cvrlcode.ics.forth.gr/handtracking/

ということで、遅ればせながらLeapMotionで指の検出をやってみることにしました。
プラットフォームは時代遅れのXNAです。

# V1
最初はV1で試したのですが、思ったより全然だめでした。
センサーが下にあるので、いわゆる握手のような形状をキャプチャーしようとすると、指同士が重なってうまく検出されません。
当然といえば当然ですが……。

# V2
KinectみたいにIKを入れたらいいんじゃないかと思っていたら、そんなV2が出ました。
https://developer.leapmotion.com/

Skeltal Trackingというものです。
上のリンク先にいくつかデモがあるのですが、V1から比べると雲泥の差です。
というわけで、これをXNAに組み込んでみました。

# XNAに適用
公式にはUnity/C#という扱いです。XNA……。
でも座標系はそのままXNAに適用できます。
使い方も同じです。
最近のSDKはとっても簡単ですね。
まずは座標だけ取り込んでみました。

ソースコード：
https://github.com/yhirano-/STFW/blob/master/SLLeap/SLLeap.cs
アフィン変換/平行移動だって変換行列で

図形情報はベクトルで考えるときれいにプログラミングできるというコツを書きました。
* [座標系 - 図形情報を扱うのに大事なことは、全部高校で教わった - Qiita](http://qiita.com/yuba/items/2f35d1e5e162f44fc1b3)
その続編として、高校で習わなかった **アフィン変換** を使うと図形の回転・ズーム・移動がすべて行列で表現できて便利になるのをご紹介します。

拡大縮小と回転には変換行列、これは高校で習いました
==
座標をベクトルで表せば、特定の行列をかけるだけで拡大縮小と回転ができると習いました。
横にx倍、縦にy倍のズームは$\left(\begin{array}{ccc} x & 0 \\\\ 0 & y\end{array}\right)$で、
原点を中心にθ度の回転は$\left(  \begin{array}{ccc}   \cos \theta & -\sin \theta  \\\\ \sin \theta & \cos \theta \end{array}\right)$です。

試しにやってみましょう。(10,10)を横に2倍、縦に0.5倍でズームすると
$\left(  \begin{array}{ccc}   2 & 0  \\\\ 0 & 0.5 \end{array}\right)\left(  \begin{array}{ccc}   10  \\\\ 10 \end{array}\right)=\left(  \begin{array}{ccc}   20  \\\\ 5 \end{array}\right)$

(10,10)を90°回転させると
$\left(  \begin{array}{ccc}   0 & -1  \\\\ 1 & 0 \end{array}\right)\left(  \begin{array}{ccc}   10  \\\\ 10 \end{array}\right)=\left(  \begin{array}{ccc}   -10  \\\\ 10 \end{array}\right)$

行列による座標変換のいいところは、変換行列同士を掛け合わせてしまうことができることです。何段階かの変換も、その行列を掛け合わせてたった一つの行列にできるので、記述も簡潔になるしなにより計算が早い。不可逆な変換でなければ、逆行列を求めることで逆変換も簡単に記述できます。

でも、回転とズームだけではたいした変換はできませんね。やはり水平移動がないと……　水平移動は、無理なのかな？

余分な一次元が、水平移動を可能にする
==
2次元のベクトルに2×2行列を掛けるだけの変換では、水平移動を記述することはできません。が、余分な一次元を加えることで、簡単にそれが実現できてしまうのです。
余分な一次元ってなに？
それは、座標(a,b)をこう書くことです――(a,b,1)。
ダミーの次元を付け加えて、値を1としておく。これだけです。座標が3次元表示になるから、変換行列は3×3になりますね。
ズームと回転の変換行列は、こうなります。
$\left(  \begin{array}{ccc}   x & 0 & 0  \\\\ 0 & y & 0 \\\\ 0 & 0 & 1 \end{array}\right)\left(  \begin{array}{ccc}   a  \\\\ b \\\\ 1 \end{array}\right)=\left(  \begin{array}{ccc}   ax  \\\\ by \\\\ 1 \end{array}\right)$
$\left(  \begin{array}{ccc}   \cos \theta & -\sin \theta & 0 \\\\ \sin \theta & \cos \theta & 0 \\\\0&0&1\end{array}\right)\left(  \begin{array}{ccc}   a\\\\ b\\\\1\end{array}\right)=\left(  \begin{array}{ccc}   a\cos \theta -b\sin \theta \\\\ a \sin \theta + b \cos \theta \\\\ 1 \end{array} \right) $
2×2のときの変換行列の右と下に0を詰め込んだだけですね。これで、ダミーの3次元表示を回転＆ズームできます。

次に平行移動。ここで初めて、3×3行列の余った場所を使います。
$\left(  \begin{array}{ccc}   1 & 0 & x  \\\\ 0 & 1 & y \\\\ 0 & 0 & 1 \end{array}\right)\left(  \begin{array}{ccc}   a  \\\\ b \\\\ 1 \end{array}\right)=\left(  \begin{array}{ccc}   a+x  \\\\ b+y \\\\ 1 \end{array}\right)$
うわ、ほれぼれするくらい簡潔に移動が記述できましたね！

使い道
==
ダミーの次元を加えるというこのアフィン変換、初めて知った人にはかなりトリッキーなやり方に思えるかもしれません。でもこれは、図形を扱うシステムではわりとよく使われる技法です。
例えばPostScriptでは平面図形やフォントをアフィン変換するため3×3行列を使います。Direct3Dだと、空間図形の座標は4次元表示。3次元の図形を移動するには4×4行列を使うんですね。

（本人ブログ記事 http://sampo.hatenadiary.jp/entry/20070921/p1 を改題再編集しました）
Git 自分まとめ

# Git勉強 自分まとめ
ネットにつながっているときは、常にGitを勉強したい。ジブンまとめ。

### 考え方
> [ForkしてからPull Requestをするまでの流れ](http://kik.xii.jp/archives/179)
> [GitHub で プルリクエスト を マージ する方法](http://garafu.blogspot.jp/2013/10/github.html)

### リンク
> [Github勉強会](http://www.slideshare.net/FromAtom/github-26243260)
>[Git のカスタマイズ - Git の設定](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E8%A8%AD%E5%AE%9A#%E6%9B%B8%E5%BC%8F%E8%A8%AD%E5%AE%9A%E3%81%A8%E7%A9%BA%E7%99%BD%E6%96%87%E5%AD%97)
>[TortoiseGit を使って Git でバージョン管理する](http://www.shirokuro331.net/cobalt/?p=840)
>[Github-flowを分かりやすく図解してみた](http://b.pyar.bz/blog/2014/01/22/github-flow/#github-flow)
>[GitHub初心者はForkしない方のPull Requestから入門しよう](http://blog.qnyp.com/2013/05/28/pull-request-for-github-beginners/)
>[図とコマンドで分かる！ git-flowによる開発の流れと使い方 (1/2)](http://www.atmarkit.co.jp/ait/articles/1401/06/news013.html)
>[手軽に設置できるGithubクローン「GitBucket」を使ってみよう](http://news.mynavi.jp/column/ide/162/)
>[【読書感想文】GitHub実践入門 ~Pull Requestによる開発の変革を読み終えました。](http://www.absolute-keitarou.net/blog/?p=1281)
vagrantメモ（自分用）

#基礎知識
以下にあるvagrantコマンドは、カレントディレクトリがどこであるかが重要。Vagrantfileがあるディレクトリで実行することが必要のようです。

#vagrant up
仮想マシンが起動してくる。

#vagrant destroy
起動している仮想マシンを削除する。

#vagrant ssh
仮想マシンにログインする

#参考
- [Vagrant体験入門ハンズオン手順 - 2014/04/24 DevLove関西 - Qiita](http://qiita.com/shin1x1/items/3288d9de7f04192b6ad8)
Hive de CSV(TSV) – もっと賢いUDF

UDFを継承したクラスではなく、GenericUDFを継承するともっといい感じになるようだ。(今回の場合)
ということで、[前回](http://qiita.com/unksato/items/fb10c42ef0def6c308fe)作成した`ArrayStringToStringUDF`をStringなArrayでなくても良いように改変してみる。

`GenericUDF`を継承した`ArrayToObjectUDF`クラスを作成する。

`GenericUDF`を継承した場合、基本的には以下の2つのメソッドのオーバーライドで機能を実現する。

### initialize

UDFに与えられた引数の確認(数や型)と戻り値のObjectInspector返却を行うメソッド。

```java
@Override
public ObjectInspector initialize(ObjectInspector[] args)
		throws UDFArgumentException {
	
	if(args.length != 2){
		throw new UDFArgumentException("_FUNC_ expects exactly 2 arg");
	}
	
	if(args[0].getCategory() != Category.LIST){
		throw new UDFArgumentException("The 1st arg needs to be array but an arg of type "+ args[0].getTypeName() + " was given.");
	}

	if(!(args[1] instanceof IntObjectInspector)){
		throw new UDFArgumentException("The 2nd arg needs to be integer but an arg of type "+ args[1].getTypeName() + " was given.");
	}
	
	listOI = (ListObjectInspector)args[0];
	intOI = (IntObjectInspector)args[1];

	GenericUDFUtils.ReturnObjectInspectorResolver returnOI = new GenericUDFUtils.ReturnObjectInspectorResolver(true);
	returnOI.update(listOI.getListElementObjectInspector());
	
	converter = ObjectInspectorConverters.getConverter(listOI.getListElementObjectInspector(), returnOI.get());

	return returnOI.get();
}
```

引数の数、引数の型など確認。今回はARRAYの中身は問わないので、args[0]に関してはCategoryの確認のみとなっている。
`listOI(ListObjectInspector)`と`intOI(IntObjectInspector)`はクラスのメンバ変数として定義しており、`evaluate`で値の取得に使用する。
また、`converter(Converter)`もクラスメンバとして定義しており、`evaluate`で値の返却に利用する。

### evaluate

実際にUDFへ渡された引数を元に値の返却を行うメソッド。

```java
@Override
public Object evaluate(DeferredObject[] args) throws HiveException {
	if(args.length != 2){
		return null;
	}
	
	if(args[0].get() == null){
		return null;
	}
	
	if(listOI == null || intOI == null){
		throw new HiveException("Invalid ObjectInspector.");
	}
	
	List<?> values = (List<?>)(listOI.getList(args[0].get()));
	int num = intOI.get(args[1].get());
	
	if(values == null || values.size() < num + 1){
		return null;
	}
	
	return converter.convert(values.get(num));
}
```

引数が2である事を確認して、ARRAYの確認とinitialize時に取得しているはずのObjectInspectorの確認をした後に、Listから該当箇所のObjectをgetしてConverterでconvertして返却。


出来た！これでINTなARRAYもSTRINGなARRAYもSTRUCTなARRAYも怖くない！
注）と言いつつSTRUCTなARRAYは試していません、、、大丈夫かな（汗）


いや、まぁこの手の事はHiveがネイティブでサポートしてくれるのが一番良いと思うのだけども、そんなに需要が無いのかなぁ(-_-)