OmniAICreator/Qiita-1.07M huggingface dataset:
Sencha はじめよう。


この記事は [Sencha Advent Calendar 2013](http://www.adventar.org/calendars/137) 15日目の記事です。

お初です。
初めて Sencha について書きます。
みなさんみたいに濃い内容をまだ書けないので、これから Sencha 始めたい人にお勧めの書籍、ブログの紹介をしたいと思います。

## 書籍

Sencha 本といえば、これでしょう。
Sencha オフィシャルトレーニングパートナーの株式会社ゼノフィが
Sencha Ext JS 2冊、Sencha Touch 1冊を刊行されています。
著者はおなじみの小堤一弘氏(@kotsutsumi)と中村久司氏(@martini3oz)です。

* [Sencha Ext JS 4 実践開発ガイド](http://www.xenophy.com/service/ext_js_guide/)
* [Sencha Ext JS 4 実践開発ガイド2](http://www.xenophy.com/service/ext_js_guide2/)
* [Sencha Touch 2 実践開発ガイド](http://www.xenophy.com/service/sencha_touch_guide/)

Amazon でも購入できます。

* [Sencha Ext JS 4 実践開発ガイド](http://www.amazon.co.jp/dp/4939061493)
* [Sencha Ext JS 4 実践開発ガイド2](http://www.amazon.co.jp/dp/4434176013)
* [Sencha Touch 2 実践開発ガイド](http://www.amazon.co.jp/dp/443418119X)

PDF版もありますが、こちらはゼノフィ社からしか購入できません。しかも書籍と同時購入で…詳しくはWebで。

Sencha Touch なら、もう1冊。

* [HTML5モバイルアプリケーションフレームワーク Sencha Touchパーフェクトガイド](http://www.amazon.co.jp/dp/4048869566)

これらの書籍を隅から隅まで読み尽くせば、あなたもSenchaマスター？
まぁ読むだけではダメですね。手を動かさないとね。

ちなみにExtJSの洋書もでるとか…

* [[PACKT] ExtJS Data-Driven Application Design(洋書) 執筆完了＆出版のお知らせ | Sencha Advent Calendar 2013 – 14日目](http://code.xenophy.com/?p=1976)
日本でも買えるのでしょうか。。。この日本語版は出るのでしょうかｗ

以上、アフィリエイトなしでの紹介でしたｗ

## Web

まずは、ここ。

* [Ext JS Docs](http://docs.sencha.com/extjs/4.2.2/)
* [Touch Sencha Docs](http://docs.sencha.com/touch/2.3.1/)

 オフィシャルドキュメントです。当然、英語です。頑張って読みましょう。。。

次は、ここ。おなじみの小堤一弘氏(@kotsutsumi)のブログ。勉強になります。

* [code:x](http://code.xenophy.com/)

そして中村久司氏(@martini3oz)のブログ

* [Sunvisor Lab. Ext JS 別館](http://extjs.sunvisor.net/)

 特に Sencha Advent Calendar 2013 5日目の記事で紹介されているハンズオン資料は、これから Sencha Touch を始めようと思っている方にオススメです。

株式会社ゼノフィ社のブログ

* [技術ノート | 株式会社ゼノフィ](http://www.xenophy.com/technology/technology_note?cat=-33)

 US Sencha社のブログを翻訳しています。Senchaの最新情報を知ることができます。

## Sencha User Group

Sencha ユーザーのためのコミュニティ Sencha User Group です。
東京、大阪、札幌で定期的に勉強会を開催しています。
Sencha の最新動向や事例・技術紹介、Sencha 開発者との交流ができるコミュニティです。

* [Japan Sencha User Group](http://www.meetup.com/Japan-Sencha-User-Group/)

Facebook のページもできました。

* [Japan Sencha UG](https://www.facebook.com/senchajp)


## まとめ

書籍、Web、Sencha User Group を紹介しました。
これから Sencha Ext JS、Sencha Touch を始めようと思っている人の参考になればうれしいです。
rstripでsuffixを文字列から取り除こうとしたら失敗した話

rstripで、指定したsuffixとマッチしたら削るみたいなことをしたかった。

```rstrip.py
'012345_1.jpg'.rstrip('_1.jpg')  #期待値: 012345        結果: 012345
'012345_9.jpg'.rstrip('_1.jpg')  #期待値: 012345_9.jpg  結果: 012345_9
'012345_11.jpg'.rstrip('_1.jpg') #期待値: 012345_11.jpg 結果: 012345
```

小一時間悩んだ結果ドキュメントにちゃんと書いてあった。
> The chars argument is not a suffix; rather, all combinations of its values are stripped
[5. Built-in Types &mdash; Python v2.7 documentation](http://docs.python.org/release/2.7/library/stdtypes.html#str.rstrip)

格好よく書けるかと思ったんだけど、結局replaceで対応した。

```replace.py
'012345_1.jpg'.replace('_1.jpg', '')  #期待値: 012345        結果: 012345
'012345_9.jpg'.replace('_1.jpg', '')  #期待値: 012345_9.jpg  結果: 012345_9.jpg
'012345_11.jpg'.replace('_1.jpg', '') #期待値: 012345_11.jpg 結果: 012345_11.jpg
```
rebase 直後に、自分が修正していたファイルが変更されたかどうかを調べる

## rebase 直後に、自分が修正していたファイルが変更されたかどうかを調べる
a - b - c
　\ d - e - f 

みたいな状態から,f上で、

    git rebase c

して、

a - b - c - d' - e' -f'

になるように  rebase したときに、

d,e,f で修正していたファイルが a,b,c で変更されていないかを調べる

---

    git diff f f' -- $(git diff --name-only a f)
(`f`(rebase前) と `f'`(rebase後) の差分を出す。ただし、`diff` の対象とするのは `a` と `f` で差分があったファイルのみ)

終わり・・・としたいところですが、このままだと汎用的に使えないのでもうちょっとコマンドを一般的にしていきます。

### コマンドの一般化
+ コマンドがみやすいように f' を 指しているブランチが f-dash というブランチ名だとします

`git diff f-dash@{1} f-dash -- $(git diff --name-only $(git merge-base f-dash@{1} f-dash) f-dash@{1})`

### 簡単な説明
+ `git diff f-dash@{1} f-dash` の部分
    + ここは単純に、rebase前とrebase後の変更点を出すための diff コマンドです。
        + `f-dash@{1}` の部分は、 `f-dash ブランチが一つ前に指していたコミット`です。(今回の場合は `f` を指している)
+ `--` 以降の部分
    + 入力したファイル名のみを diff の対象とする
+ `$(git diff --name-only $(git merge-base f-dash@{1} f-dash) f-dash@{1})` の部分
    + d, e, f で変更されたファイル名の一覧を出力するコマンドです。
    + `$(git merge-base f-dash@{1} f-dash)` の部分
        + `f-dash` と `f-dash@{1}` の共通の祖先のコミット(今回の場合は `a` )を出力するためのコマンドです。

### これを踏まえて今回の場合で同等のコマンドで書き換えると
`git diff f-dash@{1} f-dash -- $(git diff --name-only $(git merge-base f-dash@{1} f-dash) f-dash@{1})`となる
あとはこれを独自コマンドにするなりなんなりすればOK!

### 注意点
--onto や -i を利用したrebaseに対しては使えない

### まとめ
これで rebase したら知らない間にファイルが変わっていた！ということを防ぐことができる！（かもしれない！）
GentooにDockerを導入するまで


# 概要
Docker0.7からGentooでもDockerを利用できるようになりました．パッケージのインストール自体はemergeで簡単に行えますが，kernelの色々なオプションをオンにしたり，依存パッケージの設定をしたりと言った細々としたところを私の記憶の範囲でメモしておきます．

# USEフラグの設定
以下の内容を`/etc/portage/package.use`へ追記する．

    #dockerがaufsを利用するようにする
    app-emulation/docker aufs
    #Kernelソースへパッチをあてる
    sys-fs/aufs3 kernel-patch

`app-emulation/docker aufs`を指定すると，Dockerがaufsを使用してコンテナの管理を行うようになります．
恐らく他のLinuxでのDockerはこの状態が標準となっており，このUSEフラグをオンにしないとコンテナ上でコマンドを実行するのに（`docker run hoge echo hello`とかですら）20秒とかかかるようになるので気をつけましょう．

`sys-fs/aufs3 kernel-patch`は上記aufsを使用するために，Gentoo Linuxが使用するカーネルのソースコード(`gentoo-sources`)にパッチを適用するためのフラグです．
このフラグを使用せずにaufsを有効にする方法もあるようですが個人的にはこの手段が一番楽だったのでこの方法を使用しました．

#Dockerのインストール
USEフラグを設定したらいよいよDockerのインストールです．

    $emerge app-emulation/docker

ここでの注意点としては，`docker`という名前のパッケージは他にもPortage上に存在するようで，きちんと`app-emulation/docker`と指定しないとPortageに怒られます．

事前に設定していない場合はここで追加のKeywordやUSEフラグの情報が表示されるのでそれぞれ`/etc/portage/pakcage.keyword`と`/etc/portage/package.use`に追記（というかコピペ）しましょう．
その後再度`emerge`し，全てのパッケージのインストールが完了すればDockerのインストールはほぼ完了です．
最後にもう一度カーネルをコンパイルしてください．

    $cd /usr/src/linux
    $sudo make && make modules_install
    $mount /boot #私の環境の場合
    $cp arch/x86_64/boot/bzImage /boot/gentoo-3.xx.x #私の環境の場合

## トラブルシューティング
### パッケージの衝突が起きてDockerのインストールができない
恐らくあなたの使用しているシステムのバージョンが古いのが原因です．一度`emerge --deep --newuse world`をするなどしてシステムをアップデートしましょう．`etc-update`も忘れずに．

### aufs3のemerge時になんか言われて落ちる
恐らくあなたの使用しているLinuxカーネルのバージョンが古いのが原因です．
一度最新版のカーネルを構築し，そのカーネルを使用している状態でもう一度`emerge`を試みましょう

#Dockerの起動
Dockerの起動は以下のコマンドでできます．

    $/etc/init.d/docker start

起動したらきちんとDockerが動作しているかを確認しましょう．

    $docker pull centos
    $docker images

無事ビルドが完了している場合はpullしてきたCentOSコンテナの情報が表示されているはずです．

## 起動時にDockerが立ち上がるようにする
    $rc-update add docker default

## トラブルシューティング
### Dockerの起動に失敗しているような気がする
`/var/log/docker.log`を確認してみましょう．恐らく問題解決に有用な情報が書かれているはずです．

### iptablesがなんかエラーを吐いている．
恐らくiptables用のカーネルモジュールが組み込まれていないことが原因です．
NETFILTER_XT_MATCH_ADDRTYPEというカーネルモジュールを追加でコンパイルしてみましょう．

#カーネルの設定
DockerはLXCを利用しているのでLXC関連のカーネルオプションは内蔵するかモジュール化しておくのが無難です．

どのカーネルオプションを設定すればいいのか分からない人は[この辺](http://wiki.gentoo.org/wiki/LXC)を参考にしてみては如何でしょうか．

私は何も責任を持ちませんが，私が私的に使用しているDockerを動かす為だけにビルドしたGentooのKernel設定を置いておきます．
https://gist.github.com/niyaton/138821cb519a2f59116a

## check-config.sh
2014年1月から `contrib/check-config.sh` なるファイルが追加されたようです．
このスクリプトを実行すると必要なカーネル設定が行われているかどうかを自動でチェックしてくれるようなので，上手く動作しない方は一度使ってみてはいかがでしょうか．

なお，GentooにDockerをインストールした後は `/usr/share/docker/contrib/check-config.sh` にあります．
CMMotionManagerが動かないとき

```objc:motion.m

@interface MotionTestViewController ()
@property(nonatomic, strong) CMMotionManager *motionManager;

@end

@implementation MotionTestViewController
@synthesize motionManager;

- (void)viewDidLoad
{
    motionManager = [[CMMotionManager alloc] init];
    // 加速度データの更新間隔を0.1秒ごとに設定
    motionManager.accelerometerUpdateInterval = 0.1;
    // 加速度センサが利用可能かチェック
    if (motionManager.accelerometerAvailable)
    {
        [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]
                                            withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { 
                                            NSLog(@"うごくよ");
                                            }];
    }
}
```

ちゃんとCMMotionManagerはインスタンス変数で定義しましょう。

ネットのソース拾うと結構ローカルで定義しているのが多かったので
CoronaSDK Ambassadorの活動報告

こんばんは。
CoronaSDK Ambassadorの小野です。
今年も残すところ１７日となりましたね。
今年のアン活（Ambassador活動）の振り返りと新しいバージョンのCoronaSDKで気をつけることなど。。。

先ずは、今年から月１で全６回のハンズオンを新宿３丁目のテックバズ スペースさんをお借りして開催し始めました！（今日も今年の後半のハンズオン第三回をしてきました。）

もちろん夏には石巻ハッカソンのIT BootCampに行ってきたのですが、
今年は工業高校の生徒だけでなく一般参加の方もいらっしゃって。。。
なんと、女子が居た！！w

CoronaSDKの弱いところは女子力の低さだと常々思っているので、
是非石巻の子には今後もCoronaSDKでアプリ開発を続けて欲しいです♪

そして、今年は岩手にもCoronaSDKを教えに行きました。
こちらは、大学でプログラミングに触れている子たちで飲み込みが早い！
タイトなスケジュールかつマシントラブル（JDKのインストールとAPK Tool）もありながら、
それぞれオリジナルで動くものを作って頑張ってくれてました！

さらに岩手では、遠藤くん自らCoronaSDKの勉強会を主催したいとの申し出があり、
資料とサンプルプログラムを提供しました。
ますます、東北は良い流れが出来始めて熱くなっているのを感じて嬉しい限りです！！

また、今年は同じくAmbassadorでシンガポールやマレーシアで活躍されているガネサンとMeetupをしたり、
大手ゲーム会社でLuaを使って来たバリバリのプログラマーのロバートさんとイトナブ古山さんをつなぐ、
Meatup（肉会w）をしたりもしました。

そういえば、上野で唐揚げ屋さんでもMeatupしましたよ！（ちゃんと覚えてますw）
こつこつ進めているのですが。。。
来年こそは、CoronaSDKの本を”ちゃんと”出します！！（絶賛、執筆中です＞＜）

ということを書いていたら長いので、新しいバージョンの気をつける事は次回に。。。＾＾；
つづく
ゲーム制作8日目!

#今日のメニュー
・マウスについてくる新オブジェクト設計！

#マウス従属オブジェクト
マウスについてくるオブジェクトを作ります。
クラスを定義し、簡単に使用できるようにします。

ついてくる方法はいろいろ考えたのですが、
マウスのドラッグの位置を記録し、
その位置に向かって進んでいくようにします。
この方法にすることで、
マウスが動いていない場合にも、
オブジェクトは進み続けてくれます。
ドラッグのイベントに直接書く方法では、
ドラッグ中のみしか動作しないため、
ドラッグをやめたところでマウスについてきてくれなくなってしまいます。

移動量は、オブジェクトが持つ変数speedと進行方向の角度から決定します。
進行方向の角度の計算にはアークタンジェント関数を使用します。
目標地点と自身の位置の、x座標の差とy座標の差を使用することで、その角度を求めることができます。
アークタンジェント関数の返り値は-π/2～π/2であるため、
オブジェクトと目標地点の位置関係によっては、
返り値にπを加算する必要があることに注意します。
また、(y座標の差)/(x座標の差)という計算を行うため、
0除算を回避する処理も必要です。

目標地点と自身の位置が一致している場合には、
移動をやめるようにする処理を追加します。
また、移動を行ったとき、
目標地点を通り過ぎないようにする処理も追加します。
これらの処理を追加しない場合、
目標地点に到着したとたんに別の方向に一目散に進んだり、
バイブレーションしたりします。（やりました）

書いたコードは以下の感じです。

```js
			var MouseFollower=Class.create(Sprite,{
				initialize:function(imgName){
					Sprite.call(this,32,32);
					this.image=game.assets[imgName];
					this.x=WIDTH/2.;
					this.y=HEIGHT/2.;
					this.speed=4;
					this.distinateX=WIDTH/2.;
					this.distinateY=HEIGHT/2.;

					this.onenterframe=function(){
						//角度設定
						var theta;
						if(this.distinateX!=this.x){
							theta=Math.atan((this.distinateY-this.y)/(this.distinateX-this.x));
						}else{
							if(this.distinateY>this.y){
								theta=Math.PI/2;
							}
						}

						if(this.distinateX<this.x){
							theta+=Math.PI;
						}

						var speedX=this.speed*Math.cos(theta);
						var speedY=this.speed*Math.sin(theta);
						
						if(this.distinateX==this.x){
							speedX=0;
						}else if(Math.abs(this.distinateX-this.x)<Math.abs(speedX)){
							speedX=this.distinateX-this.x;
						}
						
						if(this.distinateY==this.y){
							speedY=0;
						}else if(Math.abs(this.distinateY-this.y)<Math.abs(speedY)){
							speedY=this.distinateY-this.y;
						}

						this.x+=speedX;
						this.y+=speedY;
						console.log(speedX+' '+speedY);
					}
					scene.addChild(this);
				}
			});
```

#今日の成果

[今日の成果に飛びます。](https://dl.dropboxusercontent.com/u/35809589/SnakeGame/index.html)
全面青画面がスタート画面です。
画面をクリックすると、ゲームがスタートします。
ゲーム中では左右キーで曲がることができます。
とまることはできません。
下ボタンで増殖します。
増殖したからだは時間経過で見た目に変化が現れます。
変化が最終段階に達すると右下の掲示が1増加します。
しかくいキャラがマウスについてきます。ドラッグしている間に移動した位置に移動します。
自分の体および壁に衝突すると、全面緑色のゲームオーバー画面に飛びます。
ゲームオーバー画面で画面をクリックするとスタート画面に戻ります。

#明日の予定
明日はエサを設置します。
エサを食べると成長します。
3個くらい食べないと成長できないようにしようかなと構想中です。

また、すごい勢いでソースが散らかっているので、
方法を調べてファイルを分割しようと思います。
とりあえず、作ったクラスのあたりを分けられたら、
見やすくなるかなと思います。
DJangoメモ：はじめから（テンプレートからビューを作る編）


いよいよテンプレートを使ってページを作っていきます。

### テンプレートの在処を設定 ###

###### setting.py ######

```py
TEMPLATE_DIRS = (
	'path/to/your/templates'	# どこでもいいっぽい
)
```

当然だが、設定したらちゃんとその場所を用意しないと駄目。

### テンプレートを作成 ###

テンプレートディレクトリが準備できたら、そこにさらにアプリごとのサブディレクトリを作ってその中にHTMLテンプレートを作っていく。
今回は「polls」の中にindex.htmlを作成。

###### index.html ######

```django
{% if latest_poll_list %}
    <ul>
    {% for poll in latest_poll_list %}
        <li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
```

Pythonプログラムの間にHTMLが入ってきている。{% hoge … %}から{% endhoge %}までが一つ一つの処理か。
その内側に{{ }}で囲われた部分もあるがこれはPHPでいうechoみたいなものかもしれない。HTMLにそのまま値を返す感じだと思われる。

### テンプレートをビューに指定 ###

テンプレートが出来たら、これを該当ページのビューとして設定する。

###### views.py ######

```py
from django.template import Context, loader
from polls.models import Poll
from django.http import HttpResponse

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    temp = loader.get_template('polls/index.html')
    contxt = Context({
        'latest_poll_list': latest_poll_list,  # 最新のものを表示？
    })
    return HttpResponse(temp.render(contxt))
```

また、shortcutsのモジュールを使えば以下のように短く書くこともできるらしい。

```py
from django.shortcuts import render_to_response
# これを使うことでtemplateとhttpが不要に
from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
    return render_to_response('polls/index.html',
                              {'latest_poll_list': latest_poll_list})
    # 前のコードのtempとcontxtをまとめた感じでreturnしている？
```

個人的には、長くても前の書き方のほうが好み（分かりやすいので）。
ショートカットは慣れてきてから使いたい。

***ところで、釈然としない点がふたつあったので挙げておく***

1.’-pub_date’：最初のハイフンは何を意味しているのか？

2.[:5]：同じくコロンが意味不明。

### 次回はエラー画面の設定から再開します。 ###
elixirでmeckをつかう

Elixir Advent Calendar 2013 15日目です。

pure elixirネタではないのですが、erlangとの相互運用性もelixirの良さということで、ご了承を。

[meck](http://eproxus.github.io/meck/) はmockをerlangで実現するモジュールですがelixirでも使えます

# 使いかた

自分のプロジェクトのmix.exsに

```elixir:mix.exs
        defp deps do
        [ { :meck, "~> 0.1", github: "exproxus/meck" } ]
        end
```

を入れておきます。これでmix deps.compileすることで、自分のプロジェクトでmeckが
使えるようになります。

# モックの生成

テストコード中で

```
        :meck.new(Module, [:passthrough])
```

これでModuleがモックになります。:passthroughというのは、モックとして仕込ん
でいない関数が呼ばれたときには本物を呼び出すという指定です。passthrough以外
にもいろいろ指定できるが詳しくはmeckのドキュメントを参照のこと。このままだと
ただ本物にフォワードするだけのモックなので、芸を仕込みます。

作られたモックに芸を仕込むのはいくつかの方法があります。

方法1

        :meck.expect(Module, :func, fn(args) -> returnvalue end)

関数funcに対して無名函數を対応付ける方法でです。自由度が高いが煩雑に
慣るきらいがあるので通常はもっとベタな方法をつかいます。

方法2

        :meck.expect(Module, :func, [{args_spec1, ret_spec1},
                                     {args_spec2, ret_spec2},...])

関数funcに対して引数スペックと戻り値スペックペアのリストを指定する、極
めてベタな方法です。書式だけ見ると分かりにくいかもしれないけど、実際に
書いてみると、あとで示しますが、極めてベタ。

引数スペックは、値を書けばよいが、簡単なパターンマッチも使えます。
任意の値を示す`"_"`はアトムとしての`:"_"`を用います。

戻り値スペックは、戻値の他に例外の発生などで以下の形式となります。

        ret_spec -> :meck.val(exp)   expを返す|
                    :meck.seq(list)  listの要素を順に返す| 
                    :meck.loop(list) listの要素を繰り返して返す|
                    :meck.raise(:throw, reason)  例外を発生|
                    :meck.raise(:error, reason)  エラー例外を発生|
                    :meck.raise(:exit,  reason)   exit例外を発生

例:

TargetModuleモジュールを開発することがお仕事だとします。

TargetModuleは単純なExternalModuleへのプロキシだとして、こんなかんじに
実装したとします。

```elixir:target_module.exs
    defmodule TargetModule do
      def priv(a) do
          ExternalModule.priv(a)
      end
    end
```

しかし必要なExternalModuleモジュールはまだまだ開発されていなくて、
仕様だけが決っているとします。
ExternalModule.priv/1の仕様として

        ExternalModule.priv("a") -> "a"
        ExternalModule.priv("b") -> "b"
        ExternalModule.priv({_, _}) -> "badmatch"
        ExternalModule.priv(_) -> "c"

だとします。
このような場合にTargetModule開発者のexunitはどうなるでしょうか。

exunitにはsetupとteardownがありますのでそこで初期化をします。

```elixir:target_module_test.exs
        setup do
          :meck.new(ExternalModule, [:passthrough])
          :meck.expect(ExternalModule, :priv, 
                  [
                    {["a"], :meck.val("a")},
                    {["b"], :meck.val("b")},
                    {[{:"_", :"_"}], :meck.raise(:throw, "badmatch")},
                    {[:"_"], :meck.val("c")},
                ])
                              
        end
        teardown do
            :meck.unload(ExternalModule)
        end
 ```

このように、極めてベタな感じにモックの振る舞いを記述できます。ほとんど仕様そのまま
書けるのが良いですね。もちろんコレくらいなら自前でモックを作っても同じなのですが。。。。

これでexunitを動かすとExternalModuleをモックにしたてて、終了するとアンロード
するようになります。あとは、ガシガシテストを畫いていきます。

```target_module_test.exs:elixir
      test "priv-mock" do
        assert("a" == TargetModule.priv("a"))
        assert("b" == TargetModule.priv("b"))
        assert("c" == TargetModule.priv("c"))
        assert("c" == TargetModule.priv("d"))
        assert catch_throw(TargetModule.priv({"d", "a"})) == "badmatch"
      end
 ```

こんなかんじです。

つぎは、@alucky0707 さんです!
いろいろなサービスのAPIをcurlで叩くときの認証の扱い


### Qiita

> URLのリクエストパラメタに?token=YOURTOKENのように付加してリクエストを送る．

[Qiita APIドキュメント - Qiita:Developer](http://qiita.com/docs)

なお, ユーザ名+パスワードを`/api/v1/auth`にpostすればtokenを取得できる.


### GitHub

* Basic認証, OAuth2トークン（ヘッダー or パラメータ）の3種類が使える.

```bash
$ curl -u "username" https://api.github.com
```

```bash
$ curl -H "Authorization: token OAUTH-TOKEN" https://api.github.com
```

```bash
$ curl https://api.github.com/?access_token=OAUTH-TOKEN
```


[OAuth | GitHub API](http://developer.github.com/v3/oauth/)



### webpay

* curlに-uとして渡し, ベーシック認証を利用

[curl APIドキュメント | WebPay: 開発者向けクレジットカード決済サービス](https://webpay.jp/docs/api)

> リクエスト例

 ```
$curl "https://api.webpay.jp/v1/charges" \ 
-u "test_secret_eHn4TTgsGguBcW764a2KA8Yd:"
```

> curlコマンドは、-uオプションによってベーシック認証に必要なデータの受け渡しを行います。(APIキーの後にコロン":"を付けることで、パスワードを求められることを回避できます。)


### NewRelics

* ヘッダー

> From the command line, you can use

```
curl -gH "x-api-key:REPLACE_WITH_YOUR_API_KEY" '<URL>'
```

[Getting started with the New Relic REST API - New Relic Documentation](https://docs.newrelic.com/docs/features/getting-started-with-the-new-relic-rest-api)


### Box

* ヘッダー

```
curl https://api.box.com/2.0/folders/FOLDER_ID \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
```

[Box Platform Developer Documentation](http://developers.box.com/get-started/)


### rackspace

まずcurlで"認証"

* POSTのパラメータとしてauth: { "keyxxxx" : { ...

```bash
curl -k -X POST https://identity.api.rackspacecloud.com/v2.0/tokens -d 
'{ "auth":{ "RAX-KSKEY:apiKeyCredentials":{ "username":"<username>", "apiKey":"<apikey>" } } }' -H 
"Content-type: application/json"
```

[8.2. Authentication with cURL - Cloud Files™ Developer Guide - API v1](http://docs.rackspace.com/files/api/v1/cf-devguide/content/Authentication-d1e2929.html)

* その後はヘッダーに.

```bash
$ curl -X HEAD -D - \
       -H "X-Auth-Token: fc81aaa6-98a1-9ab0-94ba-aba9a89aa9ae" \
       https://storage.clouddrive.com/v1/CF_xer7_343
```


### MongoHQ

* 普通にパラメータとして

```
curl -X GET "https://api.mongohq.com/databases/vehicles/collections/rockets/documents?_apikey=12345&limit=5"
```


### さくらクラウド

* Basic/Digest認証

> さくらのクラウドAPIはAPIキーとシークレットトークンを利用したBasic認証またはDigest認証を使用します。

[さくらのクラウド API v1.1 ドキュメント](http://developer.sakura.ad.jp/cloud/api/1.1/)


### Ebook Glue

* 普通にパラメータ

```
curl -o converted.epub \
    https://ebookglue.com/convert?token=your-api-key
```

[Ebook Conversion API Documentation | Ebook Glue](https://ebookglue.com/docs)


### Dropbox

* ヘッダー

```
$ curl https://api.dropbox.com/1/account/info -H “Authorization: Bearer <access token>”
```

[Using OAuth 2.0 with the Core API - Developer Blog - Dropbox](https://www.dropbox.com/developers/blog/45/using-oauth-20-with-the-core-api)

AccessTokeの取得までもcurlで進めることが出来る.


### Crocodoc

* パラメータ

```
$ curl "https://crocodoc.com/api/v2/document/upload" --data "token=${API_TOKEN}&url=http://web.crocodoc.com/files/test-simple.pdf"
```

[API Reference | Crocodoc](https://crocodoc.com/docs/api/)
helm-miniのバッファ検索いろいろ

# 概要
[helm](https://github.com/emacs-helm/helm)は、かの有名なanythingをforkして始まったプロジェクトで、最近はanythinguよりもこちらが主流となっています。
helmが持つ機能で一番使うものが`helm-mini`だと思います。で、普段はこの`helm-mini`で普通にファイル名を入力して検索するだけだと思いますが、割りといろんな検索が出来るのでそれの紹介をします。

# 正規表現で検索
実は正規表現が使えます。
例えば、

`.c`ファイルを探したい場合
→` \.c$`
`.php`ファイル、あるいは`.php5`ファイルを探したい場合
→`\.php5?$`

という具合です。いい例が拡張子くらいしか思い浮かばなくてこれくらいしか書いていませんが、基本的な正規表現はだいたい使えるようです。<del>ただ`{2, 3}`のように数を指定するのは出来ませんでした。</del> `\{2,3\}`のように中括弧にバックスラッシュをつけると出来ます（ @ShingoFukuyama さんコメントありがとうございます）

# バッファの内容で検索
現在開いているバッファのみですが、バッファの名前ではなくバッファの内容で検索することが出来ます。
やり方は`@`に続けて探したいワードを入力するだけです。
例えば

`require`というワードを含んだバッファを探したい場合
→`@require`

と入力することで検索できます。
また、バッファの内容で検索するのではなく普通にファイル名に`@`を含んだものを探したい場合はエスケープ（`\@`）することで検索できます（正確にはエスケープしなくてもファイル名に`@`が入っているファイルの検索も行われます。エスケープすることによってバッファ内容検索が行われなくなります。）

# 組み合わせて検索
helmはスペース区切りで検索条件を複数指定することが出来ます。
例えば、

ファイル名に`app`を含んでいる`.rb`ファイルでバッファ内に`module`というワードで始まる行があるバッファを検索する場合
→` \.rb$ @^module app`

と入れると検索できます。

# おわりに
バッファの内容で検索や正規表現で拡張子指定して検索というのは、それなりに？需要あるけど知らない人が多いんじゃないでしょうか。僕はアドベントカレンダーのネタを探してhelmのhelp読んでさっき知りました。
Berkshelfのyumレシピで古いバージョンを使用する(2.x)


昔作ったchefレシピを使ってパパっと仮想マシンを構築しようとしたところ

```

ERROR: could not find recipe epel for cookbook yum

```

とエラーが発生

調べてみたところ、ちょうど昨日yumレシピのバージョンが3.0.0に更新されたようです。

3.0.0バージョンを作りなおしてもよかったのですが、取り急ぎ2.xを使うようにBerkshelfを修正しました。

* before

```Berksfile
site :opscode

cookbook 'yum'  # 3.0.0がインストールされる
```
* after

```Berksfile
site :opscode

cookbook 'yum',  git: 'git://github.com/opscode-cookbooks/yum.git', tag: 'v2.4.4'  # 2.xの最新版である2.4.4をインストールするように指定
```

berks installを再実行すると2.4.4がインストールされます

### 参考
* [BERKSHELF](http://berkshelf.com)
* [opscode-cookbooks / yum](https://github.com/opscode-cookbooks/yum)
RSS1.0とRSS2.0で記事を取得するコード

PHPでRSS1.0、RSS2.0で記事を取得する方法です。
以下のコードで、タイトル、URL、投稿日（タイムスタンプ）がとれます。


##RSS1.0


```php
	$rss = simplexml_load_file("RSS1.0のURL");
	$array = array();
	foreach ($rss->item as $item) {
		$dc = $item->children('http://purl.org/dc/elements/1.1/');
		$array[] = array('title'=>$item -> title,'url' => $item -> link, 'date' => strtotime($dc->date));

	}
```

##RSS2.0

```php
	$rss = simplexml_load_file("RSS2.0のURL");
	$array = array();
	foreach ($rss->channel->item as $item) {
            $array[] = array('title'=>$item -> title,'url' => $item -> link,'date' => strtotime($item -> pubDate));
	}
```


##アメブロ

アメブロではRSSの間に自動的に広告が組み込まれます。
なので、上記のRSS2.0のコードで記事を取得しようとすると
広告も取得してしまいます。

幸いなことに広告のタイトルには必ずPRという文字が入るという規則性があるので、
PRが含まれていなければ配列に追加するという風に修正しています。

広告じゃなくても、
タイトルにPRが含まれていたら弾かれてしまうのが難点です。

```php
	$rss = simplexml_load_file("アメブロのRSSのURL");
	$array = array();
	foreach ($rss->channel->item as $item) {
		if(!strstr($item -> title,'PR')){//タイトルにPR（広告）が含まれていなければ配列に追加
			$array[] = array('title'=>$item -> title,'url' => $item -> link,'date' => strtotime($item -> pubDate));
		}
	}
```
Jenkins Deploy PluginでTomcatへデプロイ


[Jenkins Deploy Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Deploy+Plugin)を利用して、Tomcatへデプロイする。

## 事前準備

1. Jenkins にDeploy Pluginを入れる。
2. Tomcat へデプロイ用のユーザを作成する。( role は manager-script が必要) 

## 対応しているApplication Server 

今のところ、GrassFish,JBoss,Tomcatへ対応している。
WebLogic,WebSphereへのデプロイは専用のPluginがある。

![20130224163115.jpg](https://qiita-image-store.s3.amazonaws.com/0/30521/0211c3cb-5a93-d6c0-15f0-654b41a230b5.jpeg)

## 利用方法

warを作成するジョブを作成し、ビルド後の処理に「Deploy war / ear to a container 」を選択して必要な項目を入力。

+ WAR/EAR files ：Jenkinsのワークスペースに作成されるwarファイルのパス。正規表現で指定可能。
+ Context path ：コンテキストパス
+ Containner ：デプロイするアプリケーションサーバを指定
+ Manager user name ： Tomcatへ作成したデプロイユーザ
+ Manager password ： Tomcatへ作成したデプロイユーザパス
+ Tomcat URL ： TomcatのルートURL

![20130224162915.jpg](https://qiita-image-store.s3.amazonaws.com/0/30521/7c3ebd4b-d55f-7de1-9d55-4cde7492466c.jpeg)
dockerのカスタムベースイメージを作成する

例などにある ubuntu の base image は apt-line が archive.ubuntu.com になっていて、 apt-get install などが遅いです。

日本で使うのなら日本のミラーを使った方が良いので、 そういう base image を作ります。

base image はあまりカスタマイズせずに、 派生するイメージにDockerfile などを使って カスタマイズをした方が望ましいのですが、 ほぼ必須のものを毎回インストールするのは無駄なので、 ついでに日本語 locale を入れるというカスタマイズもしておきます。

詳細は [dockerのカスタムベースイメージを作成する](http://blog.n-z.jp/blog/2013-12-13-docker-custom-base-image.html) です。
dockerのWeb UI 3種類を比較してみた

[docker](http://www.docker.io/) の Web UI を比較してみました。

対象は以下の3種類の Web UI です。
検索すると `DockerUI` 以外が見つけにくいようなので、まとめて紹介します。

- [Shipyard](https://github.com/shipyard/shipyard)
- [Dockland](https://github.com/dynport/dockland)
- [DockerUI](https://github.com/crosbymichael/dockerui)

詳細は [dockerのWeb UI 3種類を比較してみた](http://blog.n-z.jp/blog/2013-12-15-compare-docker-web-ui.html) です。
ミニマムなdebian vagrant  boxでvnc経由での操作を可能にする

ミニマムなdebianをbox化しているが、これをvnc経由でGUI操作したいので、手順メモ

以下を参考にさせていただいた
http://redcinfo-c.blogspot.jp/2013/03/debian-vncserver.html
http://d.hatena.ne.jp/syocky/20100505/1273043644
http://d.hatena.ne.jp/hidepon_mory/20080422/1208862370
http://qiita.com/snaka/items/4fc6f83022e01daea58a

ターゲット
Debian 7.2 wheezy
http://www.debian.org/

1.xinetd、xfce4、gdm3のインストール
最初LXDEにしようとしたが、いまいち設定がわかんなかったので、逃げました。
あと、主題があるのでvnc4serverも入れます

```sh:
$sudo apt-get update
$sudo apt-get install -u -y xinetd xfce4 gdm3 vnc4server
```

2.xinetdでのvncserverの動作
動作ファイル

```sh:
# /etc/xinetd.d/xvnc
service xvnc
{
     disable = no
     socket_type = stream
     wait = no
     user = nobody
     group = tty
     server = /usr/bin/Xvnc
     server_args = -inetd -geometry 800x600 -depth 24 -query localhost -once PasswordFile=/etc/passwd_vnc
}
```

VNCのパスワード

```sh:
$ sudo vncpasswd /etc/passwd_vnc
$ sudo chown nobody.tty /etc/passwd_vnc
```

で作成

```sh:
# /etc/services
xvnc 5900/tcp # VNC Server
```

を追加

3.gdmをvncでのログインできる設定

```sh:
# 前 /etc/gdm/gdm.conf
# 今 /etc/gdm3/daemon.conf 
[xdmcp]
Enable=true
```

4.リスタート
で、リスタート

```
$sudo /etc/init.d/xinetd restart
$sudo /etc/init.d/gdm3 restart
```

5.セッション管理設定
は、なんか設定せんでも平気だった(セッション保存されたっぽい)、のでまあいいか
X Windowのセッションはリブート後も維持か?であれば未確認...いや、大丈夫だった。

6.VNCポートフォワーディング
http://qiita.com/snaka/items/4fc6f83022e01daea58a
にもありますが、Vagrantfileに

```
 config.vm.network :forwarded_port, guest: 5900, host: 15900
```

を追加(VNCのデフォは5900、でいいんだっけ?)

おまけ、VNCクライアント
(ポータブルはどっちも開発中)

TightVNC Viewer (のポータブル http://portableapps.com/node/32118 )
MobaXterm (のポータブル http://portableapps.com/node/36622 )

vagrantだとフットワーク軽くないとね。


毎度やるのは面倒なので、box化するかなぁ。
EC2の自動更新を止める


```diff:/etc/cloud/cloud.cfg
+repo_upgrade: none
-repo_upgrade: security
```

http://aws.amazon.com/jp/amazon-linux-ami/faqs/#auto_update

## 理由
nginxの1.2.7 => 1.4.3 への変更で下記の仕様が変わり、Etagが削除されてしまっていた

```
> My problem is that nginx deletes the ETag header from the response even if I
> specify proxy_pass_header ETag.
> The upstream server does return the correct headers:

The ETag header is removed if nginx changes a response returned.
That is, if you have gzip, gunzip, sub, addition, ssi or xslt
filters applied to responses returned.

```
はてなエンジニアブロガー祭りに行ってきました！



##はてなブログについて

###エンジニアのための機能

+ gist貼り付けおｋ
+ JSフリー
	+ サイドバーいじれる
+ 外部サービス連携
	+ Flickrでいい感じの写真を貼れるの初めて知った


###流行っているもの
+ 環境構築
+ JS
+ スマホアプリ
+ HTML5

###ウェブマスターツール
+ クロールの様子


###より評価されるには
+ タイトルの付け方
+ 見出しによる構造化
+ カテゴリ分類とURL
+ 記事内の内部リンクを増やす
	+ モジュールを追加でできる
+ 著者情報
	+ G+のプロフが検索結果に出る

## 高速にドッグフードを食べる方法
### ドッグフードについて
ドッグフード = 自社製品を使って、使いにくかったら直す
#### 継続的デリバリーしてる

+ 毎週リリース＋告知
+ めでたさ
+ 月〜木は毎日デプロイ

だれでもissueを追加できる

Webサービスを開発しながら使う

### 高速にドッグフードを食べる方法
はてなスターは4種類くらい作って検証した
ユーザがたくさん使っているところを自分で使う

### あらたなドッグフードを作る方法
デザイナーにモックをつくってもらう
→デザイナーがHTMLを作る

Gyazo GIFで動きを伝える

####テスト
Jenkinsで実行
全ブランチに対して行う
テスト結果をIRCに流す
→status API

開発中のブランチごとにホストを建てる
開発中にチーム内から感想をもらう

####開発したもの
・スタッフ限定で本番環境にUPして試す
→本番環境に出すと壊れてたとか事前にチェックできる

・コードレビュー必須
レビューされるつもりで書くと変なコード書けない

### ドッグフードを食べる情報収集
Kibana
	綺麗にグラフをかける

##「ブログとエンジニアと私」

###ブログを始めたきっかけ
・技術力に自信がなかったので質より量を書いた
→3ヶ月毎日書いた

・3ヶ月後たってもブクマも斧も飛んでこなかったが書く怖さが減った

### ブログをいつ書くのか？
・寝る前にブログをかく
→3hくらい

・勝負記事は8hくらいかけて書くときもある

・没ブログ記事もたくさんある
→メモをブログの記事にする感じ

###ブログを長く書いてよかったこと
・昔の自分が考えていたこととかワクワク感とかがずっと残っているのがいい
→祇の日記とかならなくしてしまって終わる

・未来の読者は自分

・デバッグした時の試行錯誤をメモっとく

・ブログで海外就職の夢がかなった
→ビザとか持ってなかったけど、ブログで書いてたら声がかかった

・転職の際にも名を知っている人がいるので、自分が何をやっているかとかをすっとばせる

・ブログを書くのは「精神と時の部屋」にいるようなもの

・ブログを英語で書いている理由は？
→日本人以外が見る可能性がある場所では、日本語はNG

・はてな記法が便利

・はてなスターがあったからブログ続けてる
語彙表の種類(パトリシアトライ/ダブル配列)に応じたMroongaの全文検索性能について

#はじめに

Mroongaでは、全文検索用語彙表のテーブルの種類は、パトリシアトライ<code>TABLE_PAT_KEY</code>で作成されます。

Groongaでは、テーブルの種類として、パトリシアトライ<code>TABLE_PAT_KEY</code>の他にダブル配列<code>TABLE_DAT_KEY</code>、ハッシュ表<code>TABLE_HASH_KEY</code>が用意されています。

ダブル配列は、パトリシアトライよりもサイズが大きくなりやすいが、キーの検索速度が速いという特徴があるようです。

また、ダブル配列は、キーを変更することができるという特徴もあり、オブジェクトの名前を変更するために、Groongaのデータベース内で利用されているそうです。

全文検索用語彙表のテーブルの種類として、パトリシアトライ<code>TABLE_PAT_KEY</code>に代えてダブル配列<code>TABLE_DAT_KEY</code>を利用すると、全文検索の性能がどのように変化するかを実験してみます。

[続きを読む](http://createfield.com/%E8%AA%9E%E5%BD%99%E8%A1%A8%E3%81%AE%E7%A8%AE%E9%A1%9E%28%E3%83%91%E3%83%88%E3%83%AA%E3%82%B7%E3%82%A2%E3%83%88%E3%83%A9%E3%82%A4/%E3%83%80%E3%83%96%E3%83%AB%E9%85%8D%E5%88%97%29%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%9FMroonga%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6 "語彙表の種類(パトリシアトライ/ダブル配列)に応じたMroongaの全文検索性能について")
NSString/NSMutableString関連のメモ


```objectivec:NSString
    // 文字列の連結.
    NSString *str1 = @"文字列1";
    NSString *str2 = @"文字列2";
    NSString *str3 = [str1 stringByAppendingString:str2];
    NSLog(@"str1[%@] str2[%@] str3[%@]", str1, str2, str3);
    
    // 文字数の取得(lengthはメソッドだけどプロパティのように書ける).
    NSLog(@"str1[%d] str2[%d] str3[%d]", [str1 length], str2.length, str3.length);
    
    // 文字列の一部を取り出す.
    NSLog(@"%@", [str3 substringFromIndex:4]);
    NSLog(@"%@", [str3 substringToIndex:4]);
    NSLog(@"%@", [str3 substringWithRange:NSMakeRange(2, 4)]);
    
    // 文字列の検索.
    NSString *target = @"1";
    NSRange range = [str3 rangeOfString:target];
    if (range.location == NSNotFound) {
        NSLog(@"%@は見つかりませんでした", target);
    }
    else {
        NSLog(@"%@は%d文字目にありました", target, range.location+1);
    }
    
    // 文字列の比較.
    if ([str1 isEqualToString:str2]) {
//    if ([[str1 lowercaseString] isEqualToString:[str2 lowercaseString]]) {
        NSLog(@"同じです");
    }
    else {
        NSLog(@"違います");
    }
    
    // 文字列の置換.
    range = NSMakeRange(2, 4);
    NSString *rep = [str3 stringByReplacingCharactersInRange:range withString:@"あいうえお"];
    NSLog(@"[%@]=>[%@]", str3, rep);
    rep = [str3 stringByReplacingOccurrencesOfString:@"列" withString:@"数"];
    NSLog(@"[%@]=>[%@]", str3, rep);
    
    // 文字列を数値やBOOL値に変換.
    NSString *strNum = @"123456789";
    NSLog(@"%d", [strNum integerValue]);
    NSString *y = @"y";
    NSString *T = @"T";
    NSLog(@"y[%@] strNum[%@] T[%@]", ([y boolValue]?@"YES":@"NO"), ([strNum boolValue]?@"YES":@"NO"), ([T boolValue]?@"YES":@"NO"));
    
    // 編集可能な文字列.
    NSMutableString *mstr = [NSMutableString stringWithCapacity:8];
    NSLog(@"%@ len[%d]", mstr, mstr.length);
    [mstr appendString:@"12345"];
    NSLog(@"%@ len[%d]", mstr, mstr.length);
    [mstr appendString:@"67890"];
    NSLog(@"%@ len[%d]", mstr, mstr.length);
    mstr = [NSMutableString string];
    NSLog(@"%@ len[%d]", mstr, mstr.length);
    [mstr setString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
    NSLog(@"%@ len[%d]", mstr, mstr.length);
    [mstr deleteCharactersInRange:NSMakeRange(5, 3)];
    NSLog(@"%@ len[%d]", mstr, mstr.length);
    [mstr insertString:@"fgh" atIndex:5];
    NSLog(@"%@ len[%d]", mstr, mstr.length);
```
libHaruでattached pdf をwindowsで作成するときのHPDF_ZLIB_ERROR(0x1066)が起こる場合

libHaru,libpng,zlibそれぞれのコンパイルについてはそれぞれのドキュメントに任せるとして...
libHaruでファイルをpdfにアタッチするとHPDF_ZLIB_ERROR(0x1066)が発生してファイルがうまく作成されなかった。
デバッカで追ってみたところzlibのdeflateInit_()の中でHPDF_ZLIB_ERROR(0x1066)が設定されていました。
設定されていたところのコードが **Z_SOLO** のifdefになっていた…

なので、zlibのVisualStudio2010のプロジェクトファイルからプリプロセッサに設定されていた **Z_SOLO** を削除もしくは、無効化をすることで期待した動作になった。

きっと、忘れるのでメモ
Thinkpad X240にDebian GNU/Linux jessieをインストールした

前使ってたノートPCのバッテリが残念なことになってしまったので、新しくThinkpad x240を購入した。　

その際にどういう設定をしたか備忘録として残しておく。他のディストリビューションでもほぼ同じようにすればいいはず。

SSD換装
===
windowsが正常にブートすることを確認した後、HDDをM4-CT256M4SSD2(firmware:000F)に換装。無事ブートした。

ベースカバーを固定しているネジは緩めてもカバーに引っかかり、完全には外れないようになっている。いくら緩めてもネジが外れないなと誤解しないように注意。またベースカバーのファンに一番近いところにある爪が外れにくくて、難儀した。この爪を外すには、下敷きを適当に切って、ボトムカバーとキーボードベゼルの間に突っ込み、てこにするのが一番良さそうだ。

Debianインストール
===
unetbootinでbootableUSBメモリを作成、UEFIからsecure bootを切って、legacy bootを有効にすると、USBメモリからブートできたので、そのままインストール。

無線カードのドライバインストール
===
/etc/apt/sources.listにcontrib, non-freeを追加。

```bash
$ aptitude install firmware-iwlwifi
```
でIntel Corporation Wireless 7260のドライバを入れられた。

どうやら7260のサポートは3.11からのようなので古いカーネルを使っている人は注意。

タッチパッドで右クリックと中クリックができるようにする。
===
なんだか右クリックと中クリックができないので、[ここ](http://mydevelopedworld.wordpress.com/2013/11/30/how-to-configure-new-lenovo-x240-touchpad-on-ubuntu-13-10/)を参考に/etc/X11/xorg.conf.d/50-sympatics.confを作成する。

注意：現状Evdev Wheel Emulationはうまく動きません。つまりtrackpointでスクロールは簡単にはできません。詳しくは以下を参照

https://bugs.freedesktop.org/show_bug.cgi?id=70780

バッテリの充電の劣化を防ぐために、充電を管理する。
===
```bash
$ "deb http://ppa.launchpad.net/linrunner/tlp/ubuntu lucid main" | sudo tee -a /etc/apt/sources.list
$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 02D65EFF
$ aptitude update
$ aptitude install tlp acpi-call-tools
```

でtlpをインストール。ivy bridge以前のthinkpadの場合は、acpi-call-toolsの代わりにtp-smapi-dkmsをインストール。

```bash
$ tlp setcharge 50 70 BAT0
$ tlp setcharge 60 80 BAT1
```
みたいに設定ができる。

この設定だと、内蔵バッテリは残量50%が下回ると充電が始まり、70%に達すると充電をやめ、リアバッテリは残量が60%を下回ると充電が始まり、80%に達すると充電をやめるようになる。
emmetのスニペット作成：$のエスケープ

VimにEmmetをインストールしたので、試しに以下のようなスニペットを作っていた。

```vim:.vimrc
let g:user_emmet_settings = { 
\    'javascript' : { 
\        'snippets'   : { 
\            'jq' : "$(function() {\n\t${cursor}${child}\n});"
\        }   
\    }   
\}
```

jQueryの

```js
$(function() {
});
```

を一発で入力してくれるスニペットなのだが、ドル記号がうまく入力されない。
具体的には'$'ではなく数字の'1'が入力されてしまう。'\$'などとしてもエスケープできない。

少し調べてみたら以下のページに書いてあった。
https://github.com/emmetio/emmet/issues/95

```vim:.vimrc
let g:user_emmet_settings = { 
\    'lang' : 'ja',
\    'javascript' : { 
\        'snippets'   : { 
\            'jq' : "\\$(function() {\n\t${cursor}${child}\n});"
\        }   
\    }   
\}
```

'$'をエスケープする時はバックスラッシュを２つ付ければ良いらしい。
画像を丸角表示する方法

画像を丸角にするやり方をググると多く出てくるのが、元のBitmapから新しい丸角Bitmapを生成してImageViewにセットする方法です。
Bitmapを加工するのではなく表示だけ丸角にした方が仕様変更にも対応しやすいし、Bitmap関連のメモリ意識や、キャッシュ戦略などへの関連性が低くなるので便利だろーと思います。

仕込み
---


参考1 
http://stackoverflow.com/questions/12675161/bitmap-repeat-rounded-corners

参考1の参考元
http://www.curious-creature.org/2012/12/11/android-recipe-1-image-with-rounded-corners/

参考1のCurvedAndTiledを参考にした丸角描画用のDrawableクラスを作成します。

```java:RoundDrawable.java

public class RoundDrawable extends Drawable{
	private final float mCornerRadius;
	private final RectF mRect = new RectF();
	private final BitmapShader mBitmapShader;
	private final Paint mPaint;

	public RoundDrawable(Bitmap bitmap, float cornerRadius) {
		mCornerRadius = cornerRadius;

		mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);

		mPaint = new Paint();
		mPaint.setAntiAlias(true);
		mPaint.setShader(mBitmapShader);
	}

	@Override
	protected void onBoundsChange(Rect bounds) {
		super.onBoundsChange(bounds);
		mRect.set(0, 0, bounds.width(), bounds.height());
	}

	@Override
	public void draw(Canvas canvas) {
		canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mPaint);
	}

	@Override
	public int getOpacity() {
		return PixelFormat.TRANSLUCENT;
	}

	@Override
	public void setAlpha(int alpha) {
		mPaint.setAlpha(alpha);
	}

	@Override
	public void setColorFilter(ColorFilter cf) {
		mPaint.setColorFilter(cf);
	}
}

```

使い方
---

Drawableの拡張なので使い道はたくさんです。
BitmapをImageViewで丸角表示させる場合の例

```java:
float cornerRadius = 6.f;
Drawable roundDrawable = new RoundDrawable(bitmap , cornerRadius);
imageView.setImageDrawable(roundDrawable);

```

おしまい

追記
---

ImageViewでscaleTypeが反映されない問題がありました。
ImageViewのソースを見てみるとBitmapDrawableを生成していたので、そっちで拡張してうまい具合にできないかなーとごにょごにょしてみるも、ごにょりきれず。

そんな矢先に名前がまんまのライブラリを発見。
https://github.com/vinc3m1/RoundedImageView

コードがシンプルで使い方も簡単でボーダーも引けるようなのでコレ良いですねっていうライブラリ紹介オチでした。
Navbarとサイドバーに置いたNavを固定させる

BootstrapでNavbarとサイドバーとして利用したNavを固定し、それ以外の部分だけ移動可能なHTMLを作ろうとしたのにハマったことのメモを。

まずNavbarについては[公式サイト](http://getbootstrap.com/components/#navbar)の説明通りにやって画面上部に固定しました。これは問題なし。

```html
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">...</nav>
```

で、次にNavbarの下で４：８で左右を区切り、左側に[Nav](http://getbootstrap.com/components/#nav)を設定して[Affix](http://getbootstrap.com/javascript/#affix)を有効にしました。ざっくりと以下のようなコードです。

```html
    <div class="col-md-4">
      <div class="sidebar-nav affix" role="complementary">
        <ul class="nav">
          <li><a href="#">一番上</a></li>
          <li><a href="#bottom">一番下</a></li>
        </ul>
      </div>
    </div>
```

右側のメインコンテンツ`col-md-8`でグリッドを指定し、それより子の要素ではグリッドをネストしたりせず、ブロック要素で区切られた文章を並べただけです。

これで`col-md-*`で想定しているサイズではうまく動作したのですが、ウィンドウサイズを小さくするとなぜかNavsの部分が右側要素の裏に隠れてしまいます。上に挙げた公式サイトでウィンドウサイズを小さくしてもらうとわかるのですが、NavがNavbarの下に動き、その下にメインコンテンツが続いて上下にスクロールするとすべて見られるようになることを期待していました。いろいろGoogleで調べてもみたのですが、ぴんとくる答えもなく、jsが原因なのかCSSが原因なのかも見極めがつきませんでした。

そこで、Chromeのデバッグツールを使って該当するNavがウィンドウサイズを変えるとCSS上でどのように変化するのかを自分のサイトとBootstrap公式サイトで比較してみました。すると、リサイズ前は`position: fixed;`だったものがウィンドウサイズを小さくすると`position: static;`に変化していました。これをヒントにBootstrap公式サイトでBootstrapに追加して使われている[docs.css](http://getbootstrap.com/docs-assets/css/docs.css)を見てみたところ、以下のような記述を見つけました。

```css
/*
 * Side navigation
 *
 * Scrollspy and affixed enhanced navigation to highlight sections and secondary
 * sections of docs content.
 */

/* By default it's not affixed in mobile views, so undo that */
.bs-sidebar.affix {
  position: static;
}

/* 中略 */

@media (min-width: 992px) {
  .bs-sidebar .nav > .active > ul {
    display: block;
  }
  /* Widen the fixed sidebar */
  .bs-sidebar.affix,
  .bs-sidebar.affix-bottom {
    width: 213px;
  }
  .bs-sidebar.affix {
    position: fixed; /* Undo the static from mobile first approach */
    top: 80px;
  }
  .bs-sidebar.affix-bottom {
    position: absolute; /* Undo the static from mobile first approach */
  }
  .bs-sidebar.affix-bottom .bs-sidenav,
  .bs-sidebar.affix .bs-sidenav {
    margin-top: 0;
    margin-bottom: 0;
  }
}
```

画面サイズに応じてaffix指定されたナビゲーションの`position`を変えているのですね。これを作成中のサイトに適用したところ、無事望むような動きをしてくれました。
Samba3.6でSMB2.0を使い気持ち速度UPしよう。

Samba4が出てるのに3.6って・・・

```diff:/etc/samba/smb.conf
[global]
+  max protocol = SMB2
```

* security = user もしくはコメントアウトであることを確認。
  * security = share ではSMB2が有効にならないとのこと。

```bash:restart
# /etc/init.d/smbd restart
```
[Ruby] Pry $(show-source/show-method)　の使い方

`Pry`ではクラス、モジュール、メソッドの定義をみることができる。
使うコマンドは`show-source`（`show-method`や`$`も使うことができる）。
ドキュメントは[こちら](https://github.com/pry/pry/wiki/Source-browsing)。

サンプル用のコード`pry_show_source.rb`を作成

```rb:pry_show_source.rb
def hello_world
	p 'hello_world'
end

class MyClass
	class << self
		def hello_world
			p 'hello_world in MyClass class'
		end

		def goodbye
			p 'goodbye in MyClass class'
		end
	end

	def hello_world
		p 'hello_world in MyClass instance'
	end
end

require 'pry'
binding.pry
```

```shell-session
$ ruby pry_show_source.rb
```

##メソッドの定義を見る
メソッド定義を確認するには`show-source method-name`とうつ。

```shell-session
[] pry(main)> show-source hello_world
# =>
From: pry_show_source.rb @ line 1:
Owner: Object
Visibility: private
Number of lines: 3

def hello_world
        p 'hello_world'
end
```

`cd`でクラスの中に入ってから`show-source`すると、クラス内でメソッドを探してくれる。インスタンスメソッド、クラスメソッドの両方を探索するが、インスタンスメソッドが優先される。

```shell-session
[] pry(main)> cd MyClass
[] pry(MyClass):1> show-source hello_world
# =>
From: pry_show_source.rb @ line 16:
Owner: MyClass
Visibility: public
Number of lines: 3

def hello_world
        p 'hello_world in MyClass instance'
end

[] pry(MyClass):1> show-source goodbye
# =>
From: pry_show_source.rb @ line 11:
Owner: #<Class:MyClass>
Visibility: public
Number of lines: 3

def goodbye
        p 'goodbye in MyClass class'
end
```

`class#method`でインスタンスメソッドを指定したり、`object.method`でオブジェクトのメソッド（クラスメソッド）を指定することもできる。

```shell-session
[] pry(MyClass):1> exit
=> MyClass
[] pry(main)> show-source MyClass#hello_world
# =>
From: pry_show_source.rb @ line 16:
Owner: MyClass
Visibility: public
Number of lines: 3

def hello_world
        p 'hello_world in MyClass instance'
end

[] pry(main)> show-source MyClass.hello_world
# =>
From: pry_show_source.rb @ line 7:
Owner: #<Class:MyClass>
Visibility: public
Number of lines: 3

def hello_world
        p 'hello_world in MyClass class'
end
```

##クラスやモジュールの定義を見る
クラス定義を確認するには`show-source class-name`とうつ。

```shell-session
[] pry(MyClass):1> show-source MyClass
# =>
From: pry_show_source.rb @ line 5:
Class name: MyClass
Number of lines: 15

class MyClass
        class << self
                def hello_world
                        p 'hello_world in MyClass class'
                end

                def goodbye
                        p 'goodbye in MyClass class'
                end
        end

        def hello_world
                p 'hello_world in MyClass instance'
        end
end
```
Apache2.4ではconfの書き方が変わりました。

Apache 2.2から2.4に上がった時にかなり変更があったんですね。[ぐぐる](https://www.google.co.jp/search?client=safari&rls=en&q=apache+2.4+%E9%81%95%E3%81%84&ie=UTF-8&oe=UTF-8&gws_rd=cr&ei=b96rUpGaMoejlQXvkIGABg)
Ubuntu13.10にて確認。

アクセス権
----------------

* AH01630: client denied by server configuration

```diff:アクセス権限
        <Directory /home/htdocs/>
-               Order allow,deny
-               allow from all
+               Require all granted
        </Directory>
```

site-enabled
----------------

* VirtualHostが有効にならない？？と思っていたら、拡張子.confを付けないといけないのですね。

```diff:site-enabled
-Include sites-enabled/
+IncludeOptional sites-enabled/*.conf
```

NameVirtualHost
-------------------

* AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf:7
* VirtualHostは普通に使うよね、ということか。

```diff:
-NameVirtualHost 80
```
円周上のCrossing(2013.9.16の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの14日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord14crosscircle/ にあります。

```hs
module Doukaku.CrossCircle (solve) where

solve :: String -> String
solve = show . (`div` 2) . sum . map (uncurry countPoints) . searchLines

countPoints :: Eq a => [a] -> [a] -> Int
countPoints [] _ = 0
countPoints (x:xs) ys = (+ countPoints xs ys) . length . filter (== x) $ ys

searchLines :: Eq a => [a] -> [([a], [a])]
searchLines = searchLines' []

searchLines' :: Eq a => [a] -> [a] -> [([a], [a])]
searchLines' _ [] = []
searchLines' ds (x:xs) = (searchLines'' [] x xs ds) ++ searchLines' (x:ds) xs

searchLines'' :: Eq a => [a] -> a -> [a] -> [a] -> [([a], [a])]
searchLines'' _ _ [] _ = []
searchLines'' ds t0 (t:ts) cp
  | t == t0   = (ds, ts ++ cp) : tails
  | otherwise = tails
  where
    tails = searchLines'' (t:ds) t0 ts cp
```

題意を素直に式に直しただけなので計算量的に無理かと思いましたが、そうでもありませんでした。`searchLines`で円上の直線を列挙します。ただし、直線は、直線の一方にある点の集合と他方にある点の集合の２つの集合によって表します。`countPoints`は直線上にできる交点の数を求めます。直線の左右の集合に同じ名前の点があれば交点が一個できますので、その数を数えているだけです。

この方法だと直線ごとに交点を数えるので一つの交点につき2回カウントしています。なので、最後に`2`で割る必要があります。

http://qiita.com/Nabetani/items/66806c9dc14a96f2fd42 に他の方の回答もありますので、見ると参考になるでしょう。
Challenging the super-linear scaling

#何の話？
“Super-linear scaling”に”challenge”ということなのだが，この”challenge”は「チャレンジする」という意味とは異なる．同じ意味の卑近な例は，ウインブルドン選手権といったテニスの試合において，in, outの判定に不服を持った選手がビデオ判定を要求する”challenge”だ．なので，タイトルは”Challenging the super-linear scaling mentioned at a [blog titled Scalability, in Graphical Form, Analyzed] (http://rhaas.blogspot.jp/2011/09/scalability-in-graphical-form-analyzed.html)”と長くなるが厳密に書かないと意味をなさないだろう．これ以降，上記のwebページを単にblogと表記する．

次は”super-linear scaling”の意味だ．このadvent calendarの読者には不要と思われるが，一応，ごく簡単に紹介しておく．通常，1（CPU）コアの性能がスループット1の場合，nコア構成のシステムではスループットがnになるのが理想だが，このようになることは殆どなく，n未満になってしまうのが普通の姿だ．ところが，nコアのスループットがnを超えてしまう，という状況（現象）を”super-linear scaling”と呼ぶ．

#加速する？
上記のblogでは，pgbenchで-S（select-only）を指定して測定した結果が”super-linear scaling”だとされている．クライアント当たりのスループットでみたとき，１クライアント時のスループットを100%とすると，32クライアントのときには150%以上になってしまうのだ．この測定結果のグラフはPostgreSQLカンファレンス（2012年2月）において，blog主による基調講演でも紹介されている．そのQ&Aにおいて”super-linear scaling”らしき現象の理由を問われた際，blog主が”I don’t know.”と答え，会場の笑いを誘ったことを今でもはっきりと覚えている．

そして，blogでは，この”super-linear scaling”について”at the higher client counts, performance appears to be increasing more than linearly as we add clients.”と述べている．「クライアント数が多くなるほど性能を加速する（ある意味，超常的な）要因が働いている」というようなニュアンスを感じる．しかし，”super-linear scaling”なんて現象には滅多にお目にかかれるものではない．四葉のクローバーを見つけるより遥かに確率は低いだろう．性能評価を長年手がけてきた立場からすると，クライアント数が少ないときに何か足を引っ張る現象が起きている，と考えるのが普通だ．

#再現できるか？
この「足を引っ張る現象」とは何か，ということになるが，blogに寄せられたコメントの中に的（のど真ん中）を射たものがあるので，ここでは直接，”super-linear scaling”もどきの挙動を示す原因については触れないでおく．その代わりとして，その原因を強く示唆する興味深い実験結果を以下に示す．

blogの実験は32コアであったが，当方で使用できるのは16コアのマシンであったので，まず，同様の現象が観測できるかどうか調べてみた．実験方法は，できるだけblog記載の方法に準拠した．下表がPostgreSQL 9.2.4で測定した結果である．

クライアント数 | スループット
---------------+------------
	     1 |   6611.74
	     2 |  12777.12
	     4 |  24969.75
	     8 |  47909.13
	    12 |  74015.65
	    14 |  86452.66
	    16 | 100139.74

4～14クライアントにおいて16クライアントとの間に”super-linear scaling”の関係が伺え，その程度は8クライアント時に最も顕著となった（47909.13*16/8 < 100139.74）．

#パラドクス？
8クライアント時には，16コアの内，8コアはbusy, 残りの8コアはidle状態となっているものと考えられる．そこで，idleの8コアを潰してみる．「潰す」といっても物理的に破壊するわけではなく（当たり前），main() { while(1); } というような無限ループを実行させるのである．なお，実際に使ったプログラムでは，Linuxのsched_setaffinity()システム・コールを使うことで無限ループが動作するコア番号を指定できるようにした．コア番号が0, 2, 4, 6, 8, 10, 12, 14の8コア上でこのプログラムを実行させておき，その状態で8クライアントのpgbenchを実行させると，スループットは51022.18となった。つまり、”super-linear scaling”状態は解消（51022.18*16/8 > 100139.74）されたのである．これより「クライアント数が少ないときに何か足を引っ張る現象が起きており，idle状態のCPUコアを潰すことでその現象の発生が抑えられた」ことが実証できたと考えてよいだろう．

何といっても，ここで興味深いのは，idle状態になっている（と思われる）CPUコアに負荷をかけた方が（＝サーバ全体としてCPU使用率を高くする方が），idle状態として空けておくよりもベンチマーク性能は高くなる，という一見パラドックス的な結果となることであろう．pgbenchを使っての性能測定において”super-linear scaling”もどきの状況を生んだ原因は，この実験結果から明白と思えるので，上で述べたとおり，ここではそれ以上の言及はしないでおく．

#Challenge成功？
さて，テニスのウインブルドン選手権では１セットにつき3回，”challenge”する権利が与えられており，”challenge”が成功するとその回数は減らない（”challenge”する権利を消費したことにならない）というルールになっている．ここで行った”challenge”は成功したと判断して貰えるであろうか．
[Ruby] Slopの使い方

コマンドラインからのオプションをパースしてくれる`Slop`の使い方。
`gem`でインストールができる。

```shell-session
gem install slop
```

使い方は`Slop.parse do ... end`で`Slop`のインスタンスを作って、後はそのインスタンスを経由してオプションの有無などを確認することができる。

```rb:slop_sample.rb
require 'slop'

opts = Slop.parse do
	banner 'Usage: slop_sample.rb [options]'

	on 'name=', 'Your name'
	on 'p', 'password', 'An optional password', argument: :optional
	on 'v', 'verbose', 'Enable verbose mode'
end

p opts.verbose?
p opts.v?
p opts.password?
p opts[:name]
p opts.to_hash
```

```shell-session
$ ruby slop_sample.rb  -v --name yui
# =>
true   (opts.verbose?)
true   (opts.v?)
false  (opts.password?)
"yui"   (opts[:name])
{:name=>"yui", :password=>nil, :verbose=>true}   (opts.to_hash)
```

`Slop.parse do ... end`に渡すブロックには引数として`Slop`のインスタンスを渡すことも可能で、そのときは次のような書き方になる。

```rb:slop_sample.rb
require 'slop'

opts = Slop.parse do |opt|
	opt.banner 'Usage: slop_sample.rb [options]'

	opt.on 'name=', 'Your name'
	opt.on 'p', 'password', 'An optional password', argument: :optional
	opt.on 'v', 'verbose', 'Enable verbose mode'
end
```

`Slop.parse`に`:help => true`を渡すと`-h`や`--help`でヘルプを出力できるようになる。

```rb:slop_sample.rb
require 'slop'

opts = Slop.parse(help: true) do |opt|
	opt.banner 'Usage: slop_sample.rb [options]'

	opt.on 'name=', 'Your name'
	opt.on 'p', 'password', 'An optional password', argument: :optional
	opt.on 'v', 'verbose', 'Enable verbose mode'
end
```

```shell-session
$ruby slop_sample.rb  -h
# =>
Usage: slop_sample.rb [options]
        --name          Your name
    -p, --password      An optional password
    -v, --verbose       Enable verbose mode
    -h, --help          Display this help message.
```
Linuxサーバに楽にログインしたい


## 概要

- できること
	- ssh接続先の指定がIPアドレスではなく、自分で決めた名前で可能になる
	- sshでのログイン時に、ユーザ/パスの入力が不要になる
- 想定する対象者
	- Linuxとかsshとかあんまり慣れてません的な方
	- **とりあえず**試してみたい方
- 想定作業時間
	- 30分ぐらい？



## 想定する状況


### ログイン先サーバ

IPアドレス | user | pass
--- | --- | ---
192.168.0.1 | foo | 1234


### 接続元の想定

user |
--- |
bar |



## sshの基本操作

`ssh 192.168.0.1`
ログインユーザは接続元の端末の現在のユーザ名が使用される（みたい）
その後、パスワードを聞かれるので、接続先ユーザのパスワードを入力
-> ログイン失敗
接続先に対してbarユーザでログインを試みたため

> たまたまbarユーザがいればログインできるかもしれないけど

`ssh foo@192.168.0.1`
IPアドレスの前にログインユーザを指定する
その後、パスワードを聞かれるので、接続先ユーザのパスワードを入力
-> ログイン成功



## 公開鍵使ってログインを楽にする


### 接続元での作業

> ＜＜ 注意 ＞＞
> すでに誰かに設定してもらっているとかの場合はやめておきましょう。
> 設定を上書きする可能性があります。

#### ssh-keygenの実行
- `ssh-keygen`を実行。
	- いろいろ聞かれるけど、とりあえずすべて未入力で`Enter`
- すると`~/.ssh/`に下記の2ファイルが作成される
	- `id_rsa`：秘密鍵
	- `id_ras.pub`：公開鍵

> ssh-keygen補足
> 作成される鍵の名称は上記id_rsaがデフォルトとなるが
> 複数のサーバに接続することを考えるとよろしくない
> （どれがどのサーバのものかわからなくなる）
> 接続先サーバのIPアドレスを指定するのが良いかも


#### ~/.ssh/configの編集
- `~/.ssh/config`を下記の様に編集（なければ作成）
	- `Host`：sshコマンドで指定する名前。お好みで。
	- `HostName`：IPアドレスを指定
	- `User`：接続で使用するユーザを指定
	- `Port`：ポート番号の指定がある場合などに指定

```~/.ssh/config
Host target_server
  HostName 192.168.0.1
  User foo
  Port 22
  IdentityFile ~/.ssh/id_rsa
```
意味としては

- `ssh target_server`と実行すると
- `192.168.0.1`のサーバの
- ポート`22`番で
- ユーザ`foo`で接続する
- その際に使用する秘密鍵のファイルは`~/.ssh/id_rsa`


### 接続先での作業

1. ~/.ssh/authorized_keysの編集
	- `~/.ssh/authorized_keys`に、上記接続元で作成した`id_rsa.pub`の内容を追記する


### 接続元から上記設定を使用してログインしてみる

`ssh target_server`
-> ログイン成功、するはず
Fluentdのconf設計で心がけていること

## 大きく２つに分ける

 - inputとoutputなどのIO系
 - fitlerやrewriteなどの処理系

前者は誤ったらすごい勢いでワーニングでたり、先行・後続に影響だしたりするので、慎重にやりたい度ことが多いです。

後者は誤ってもデータが流れてこないとか、書き換えしくじっておかしな値になるとかという具合で、影響のスコープはわりと狭くできます。ただギョーム次第で大きく変わったり複雑になったりするので、手を入れることはとても多いです。

## さらに分ける

つまりは、一般的なバッチ処理設計みたいなもので、意味のある単位に集約しましょうということ。

- 技術の問題か業務の問題か

技術的な問題なら、共通のconfつくってincludeすると捗ります。
業務的な問題なら、共通的な業務のパーツにみえて案外共通じゃなかった例がよくあるので、早すぎる最適化の罠にハマる位なら扱える範囲はベタに書いてもいいと思います。

- 業務の内容
- 業務の複雑度
- 他業務との関連度

（あとで書く）
（confを分けるのに加えて、Fluentdのプロセスを分けることにも踏み込んでいきたい）