OmniAICreator/Qiita-1.07M huggingface dataset:
Androidのxmlレイアウトで画面めいっぱいに表示する方法

AndroidStudioのxmlレイアウトエディタでGUIを使ってレイアウトを作っていると、妙な余白が常に付きます。
この余白、てっきりRelativeLayoutの仕様かと思ってたのですが、そんなことなかったです。
xmlをよく読めば明白でした

```xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:paddingLeft="0dp">

        <WebView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:id="@+id/webView"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />
    </LinearLayout>
</RelativeLayout>
```


```xml

    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"

```

これ。
@dimenで定義された定数値によるpaddingが親切に自動的に挿入されていました。
この4行をRelativeLayoutから消せばぴったし画面の余白を付けずに表示することが出来ました。
Xamarinを利用したクロスプラットフォーム開発に興味あり

マイクロソフト社のエバンジェリストである渡辺さんの記事を見て、Xamarinによるクロスプラットフォーム開発に興味があります。

http://yutawatanabe.hatenablog.com/entry/ios-android-app-csharp-dotnet-xamarin

完全に無料で始められるわけではなかったが、2014/11のConnect()でVisual Studio 2013 Community EditionとXamarin Starter Editionの組み合わせで開発を始められると聞き、ワクワクしています。

http://ytabuchi.hatenablog.com/entry/2014/11/13/020208

さて、何から作り始めようか…。
[Swift]UINavigationControllerでpopとpushを同時にしたい

もしかしたら簡単な方法があるのかもしれないが詰まったのでメモ。

UINavigationControllerであるView上でpopしてpushしたい状況があった。
どういうことかと言うと、

firstViewController
　-> viewController1 <- 今ここ

から、

firstViewController
　-> viewController2 <- 次ここ

というように移動したい。普通にpushすると、

firstViewController
　-> viewController1
　　-> viewController2 <- 次ここ

となってしまい、標準のNavigationCotrollerによる戻り先が変わってくる。
言い換えると、viewController1からViewController2に移動するのだが、NavigationBarの戻るボタンではfirstViewControllerに戻って欲しい。

単にsetViewControllersを使えば解決した。

**UIViewController1.swift**

```
let ViewController2: UIViewController  = ViewController2()
let rootViewController = self.navigationController?.viewControllers.first as UIViewController
self.navigationController?.setViewControllers([rootViewController, ViewController2], animated:true)
```

現在のViewControllersを取り出して、変えたい部分だけ取り替えてsetViewControllersで移動。
もしもっと簡単なやり方あれば教えて下さい。。

※本当の目的はviewCotroller2からfirstに戻ることなので、初めは戻るボタンをカスタマイズしてやろうと試行錯誤したが、デフォルトの戻るボタンが使えない？＆戻るボタン用の画像探すの面倒だったので断念した。
※ちなみに、普通にViewController1からpop(animated:false)してすぐpushしても、popだけで止まってしまった。
Redstone.Dartをやってみた的なもの

4日目です。日付変わってから書き始めるという準備不足もいいとろころですがそれは置いといてとりあえずよろしくお願いします。

# はじめに

裏側との疎通確認するのがめんどくさかったんで簡易的なものを作ろうという感じではじめました。選定理由もシンプル・情報がそこそこありそうという2点だけです。

簡単な認証処理とかで使うからそれをネタにして書こうって考えたんですが[素晴らしいサンプルが](http://redstonedart.org/2014/07/18/authentication-and-authorization/)すでにあるじゃないか・・・。
使ってみてハマるところもなかったので要点だけに絞ることにします。

# ルーティング・フィルタ

```Dart:
import 'package:redstone/server.dart' as app;

// @route

// 通常
@app.Route("/")
helloWorld() => 'Hello, World!';

// :値の部分を取得
@app.Route("/info/:company/:id")
userInfo(String company, int b) => getUser(company, id);

// 単純なGETならこっち
@app.Route("/search")
search(@app.QueryParam() keyword) => keyword;

// POST
@app.Route("/message/send", methods: const [app.POST])
sendMessage(@app.Body(app.JSON) Map msg) {
  return {
    received: true,
    response: msg['message'] == 'hello' ? 'hi ' + msg['username'] : 'hello'
  };
}

// フィルタ
// 重ねがけも可
@app.Interceptor(r'/user/private/.+')
authenticationFilter() {
  if (app.request.session['username'] == null) {
    app.chain.interrupt(statusCode: HttpStatus.UNAUTHORIZED, responseValue: {"error": "NOT_AUTHENTICATED"});
  } else {
    app.chain.next();
  }
}

```

GETとPOSTで同じようにとれればもっとよかった、そんなに問題はないけど。

何もしなければreturnする型によってコンテンツタイプが決定される。
簡単なことしかやってないからこういうのは楽できてありがたい。

| Returned Value |      Response type     |
|:--------------:|:----------------------:|
| String         | text/plain             |
| Map or List    | application/json       |
| File           | (MimeType of the file) |


# はまったところ

webを変更したあとにページみても自動更新されないことがあるから焦る。結局常にタブを2個開いている状態になった・・・。

クライアントとサーバで別ディレクトリ(あるいは別パッケージ)で作りたいけどどうすればいいかわからない。pubspec.yamlの管理が大変。

# 感想

学習コストがほぼなく、すぐに使い始められたので満足。
リファレンスの説明はもうちょっと欲しい・・・。
仕事で使うことはまだまだなさそう・・・。

明日は再度laco0416さんです。
ニュースサイトで短時間に作ってみたデータの可視化

![wn.jpg](https://qiita-image-store.s3.amazonaws.com/0/61799/f3b485ac-3e6b-4ea1-334a-b2e0b5afaccc.jpeg)
ニュースサイトで短時間に作ってみたデータの可視化

　新聞社のニュースサイトの編集をしています。凝ったコンテンツも大事ですが、突発の事件事故が起きた時も、データを可視化するような報道ができないかと思っています。

　以下の例は、技術的には単なるgifアニメですので何の参考にもなりません。この投稿では、報道目的の場合に気を付けたこと、ニュースサイトで求められるのが即応力であることなどを共有できたらと思っています。

【これはひどい】市議２０人中１５人が逮捕、を見える化してみた - withnews（ウィズニュース）
http://withnews.jp/article/f0140717000qq000000000000000W00b0401qq000010394A

　記事は青森県平川市の市議会議員が次々と逮捕されていったことを伝える内容です。記事を配信した段階では定数の4分の3が逮捕されるという異例の事態になっていました。

　議会事務局のサイトには議員の顔写真が公開されていました。サイトは更新が止まっていて、最新の議席が反映されていませんでした。クロームの「要素を検証」で記述を編集して、画像を抜いてスクリーンショットを取りました。その画像をつなげてgifアニメで表現しました。逮捕の一報から2時間くらいで配信できました。

![jpeg.jpg](https://qiita-image-store.s3.amazonaws.com/0/61799/f69b48ea-7cf9-d0e7-42db-d56cbe5de01e.jpeg)

　報道機関として気を付けた点を以下に記しておきます。
・事実の確認（記者2人1組で名前の確認、数の確認などをしました。作業時間の半分くらいを費やしました）
・画像の著作権、肖像権（今回は報道目的という範囲におさまると判断し、配信しました。芸能人のサイトなどでは同じ手法は使えなかったと思います）
・当事者への確認（サイト上の情報だけでもgifアニメは作れましたが、逮捕＝辞職ではないことなど、気を付けるべき点はあったので念のため議会事務局に電話で確認をしました）

　ニュースサイトを運営していて課題に感じるのが、リッチコンテンツの露出の仕方です。ネットの情報はフロー型でどんどん流れていってしまうので、ストック型のリッチコンテンツにはなじみません。

　ご紹介した記事のように、何か事件事故が起きたときのタイミングで、記事内のリンクなどから他のデータを可視化したコンテンツ（報道に限らず）に誘導していく。そんな姿勢が大事だと思っています。

　会社や団体の枠をこえて、優良なコンテンツを共有、ストックしておく仕組みがあれば、ニュースをきっかけにした関心の高まりに乗っかって色々な成果を広めることができるのかもしれないと思っています。
CERN開発のデータ解析ソフト「ROOT」のインストールがhomebrewで簡単にできてしまう件について



> だから Mac にしろっていったじゃん。（スタバマックカシャーンッ！）

~~~$
$ brew -v
$ brew tap homebrew/homebrew-science
$ brew info root
$ brew install root
$ root
~~~

![welcome_root.png](https://qiita-image-store.s3.amazonaws.com/0/41326/75a9f511-78e2-2e3b-6750-f16909604fce.png "welcome_root.png")




追記：pyROOT環境
------------
~~~$
$ mdfind ROOT.py
=> /usr/local/Cellar/root/5.34.24/lib/root/ROOT.py
~~~

従ってPYTHONPATHに追加する。ROOTSYSはたぶん不要。
add .bashrc

~~~.bashrc
export ROOTSYS=/usr/local/Cellar/root/5.34.24
export PYTHONPATH=$ROOTSYS/lib/root
~~~

そのあとはsourceコマンド もしくは再起動

~~~$
$ env | grep PYTHON
=> PYTHONPATH=$ROOTSYS/lib/root # or etc...
$ python -c "import ROOT;"
=> no error
~~~


> 研究よりの敷居高さなんて、時代じゃないんだよ。
プロジェクト毎に NSLog を定義すると便利

前置き
---

`NSLog` を生で使うと、往々にして結局 `NSLog` を後で剥がすハメになります。理由は以下のようなものですね。

- プロダクションでログを出したくない
- パフォーマンスに影響がある
- 沢山出てウザい
- 他の人のログが沢山出てきてウザい etc..

対策
---

しかし、デバッグのために出力しておきたいログは山ほどあります。
`#ifdef DEBUG` で頑張っても良いですが、次のようなマクロを定義するともっと便利です。

(`YOUR` などは空気を読んで置換してください)

```objc
#if YOUR_DEBUG
#define YOURLog(...) NSLog(@"YOUR_APP: %@", [NSString stringWithFormat:__VA_ARGS__]);
#else
#define YOURLog(...)
#endif
```

これを定義することで、通常の `NSLog` のように使うことができ、なおかつプリプロセッサマクロで自由に取り外しが出来る `NSLog` が作れます。リリースビルドでは勝手に消えてくれます。

```objc
YOURLog(@"Log %@", @"it!");
```

```
YOUR_APP: Log it!
```

利用風景
---

これで沢山出力することで、例えば以下のようなログが出力されます。

![687474703a2f2f692e6779617a6f2e636f6d2f35613662353764353234313061613663663831623038386635643163363731382e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/19168/79c9aaab-0431-ed30-29d9-c09e251b9548.png)


プリプロセッサマクロの設定は以下のように行います。

![687474703a2f2f692e6779617a6f2e636f6d2f36343365396133623332356138306566356162353337306432373930633861312e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/19168/e2fbc5d6-c8ff-11d6-3ff3-b17d9dfd60b2.png)

Tips
---

- モジュール毎に Prefix を分けると、視界に入れなくて良いモジュールのログを無効に出来て便利。
- モジュール毎に Prefix が付いていると、どこから来たログなのか一目瞭然で便利 (**重要**)
- ログレベルを使いたいなど、もっとコントロールしたい人は CocoaLumberjack を使いましょう。
- モジュールを作る人は特に、`NSLog` を直接使わず、このようなマクロを使ってログを出力したい。利用者にとっては、`NSLog` を除去するのだけでも難儀です。

以上です。
Firefox Developer Edition のテーマが意図せず変わってしまった場合について


# 問題
[Firefox Developer Edition](https://www.mozilla.org/ja/firefox/developer/) はもともと黒っぽいテーマなんだけど [Firebug3](http://getfirebug.com/) をインストールするとになって白くなってしまう．
「ツール > アドオン > テーマ」を見てもテーマは増えておらずデフォルトのままなのでどういうことか？

# 原因

Firefox Developer Edition のテーマは 「アドオン」のテーマではなく「開発者ツール」の設定にある．
Firebug3 を入れるとココにテーマが追加されて勝手に変わってしまう様子．

# 対応方法

「ツール > Web 開発 > 開発者ツールを表示」で開いた後に開発者ツールの右上の設定マークをクリックし，「開発ツールのテーマを選択」で 「Dark theme」にする．すると元の黒っぽいテーマに戻る．バージョンアップかわからないけどたまにまたテーマが変わるのでここで再度設定すればよい．
POH Lite4 エンジニアでも恋がしたい-転職初日にぶつかった女の子が同僚だった件 ミッション1

[ミッション1](http://qiita.com/rana_kualu/items/390f72ec444a33a41261) / [ミッション2](http://qiita.com/rana_kualu/items/e5c6cdffe8c459e76575) / [ミッション3](http://qiita.com/rana_kualu/items/4f2f05ca2ab7eb0db7be) / [共通解](http://qiita.com/rana_kualu/items/e5984759d1f81f18d3f0)

https://paiza.jp/poh/enkoi

```php
<?php
    $input = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
    $input[0]=0;
    print(array_sum($input));
```

結果。
https://paiza.jp/poh/enkoi-second/5cc1166d
いくらなんでも簡単過ぎじゃないか？

と思ったらさすがにそれで終わりではなかった模様。
続きや如何に。

というか半端な点数でのストーリーを見る方が難しそうだ。
Railsのデータロック

## トランザクション

```rb
begin
  ActiveRecord::Base.transaction do
    .
    .
    raise 'ロールバックします'
  end

  p 'コミット' # トランザクション処理を確定
rescue => e
  p 'ロールバック' # トランザクション処理を戻す
end
```

* transactionブロックの中で登録・更新処理を行う場合は、saveやupdateではなく、`save!`, `update!`を使用する。

* transactionブロックの中で複数のモデルの更新を行った後に例外を発生させると、全部のモデルがロールバックする。

## 楽観的ロック

「競合は多分起きないだろう」という前提で、データの取得時には何もせず、更新時に競合をチェックする方法。

* レコードのバージョン管理を行うため、テーブルに`lock_version`カラムを追加する。その際、デフォルト値を0にする。
* lock_versionはレコード更新時に1増える。
* lock_versionはフォームのパラメータとして送信する必要がある(hiddenでOK)。
* 更新時に、データ取得時のlock_versionと異なればエラー(ActiveRecord::StaleObjectError)を発生させる。
* 設定ファイルで `ActiveRecord::Base.lock_optimistically = false` にすると、楽観的ロックを無効にすることもできる。


## 悲観的ロック

「競合が起きるだろう」という前提で、データの取得時にデータをロックし、更新時にロックを解除する方法。「これからこのデータをいじるから、他の人はこっちの処理が終わるまで待ってね」ということ。

* トランザクションを使用する。

上記参照。

* モデルの`lock`メソッドを使用する。

```rb
User.lock.find(1)

user = User.first
user.lock!
```

* モデルの`with_lock`ブロックを使用する。

```rb
account = Account.find(10)
account.with_lock do
  account.name = 'fuga'
  account.save!
end
```

* 他のトランザクションがロックの解放待ちになるため、長く待たされるとタイムアウトになってしまう可能性もある。
* 利用できるDBMSはPostgresかMySQL。
コンポーネント属性はtypoに注意

Lightning ComponentではJavaScriptが組み合わさったことでtypoに弱くなっており、現時点ではエラーなどが追いづらい状況なので、注意が必要です。

コンポーネントの属性値について、大文字・小文字が違うケース、typoしているケースについて検証してみました。

##　検証用ソースコード
```java:SampleProp.app
<aura:application>
	<(namespace):SamplePropCmp />
</aura:application>
```

```java:SamplePropCmp.cmp
<aura:component>
    <aura:attribute name="message" type="String" default="No Click." />
    <h1>{!v.message}</h1>
    <ui:button label="Click me!" press="{!c.clickMe}"/>
</aura:component>
```

```js:SamplePropCmpController.js
({  
    clickMe : function(component, event, helper) {
        // match
        console.log(component.get("v.message"));
        component.set("v.message", 'Click Me!');
        console.log(component.get("v.message"));
        // ignore
        console.log(component.get("v.Message"));
        component.set("v.Message", 'Click Me, Twice!');
        console.log(component.get("v.Message"));
        // typo
        console.log(component.get("v.messege"));
        component.set("v.messege", 'Click Me, Three Times!');
        console.log(component.get("v.messege"));
    }
})
```

## 検証結果(Winter'15)
検証結果は下記のようになりました。大文字・小文字が違っていても問題なく値を設定・取得できます。typoしたときはエラーになりません。

| ケース | get | set |
|:------|:---:|:---:|
| 一致 | ◯  | ◯ |
| 大文字・小文字が異なる | ◯ | ◯ |
| typoで不一致 | エラーにならずundefinedが返される | エラーにならない |

## 追加検証(Spring'15)
Spring'15から大文字・小文字を区別するようになったので、追加検証を行いました。今回の検証で新たに気がついたことがありました。\<aura:attribute\>で定義されていない属性についても一度setすればgetできるようになっている点です。状況によってはますます混乱しそうな仕様なので気をつけたいところです。

| ケース | get | set | set -> get |
|:------|:---:|:---:|:---:|
| 一致 | ◯  | ◯ | ◯ |
| 大文字・小文字が異なる | undefined | ◯ | ◯ |
| typoで不一致 | undefined | ◯ | ◯ |
フォームを初期化するボタンをRailsで使う

フォームのインプット要素を全部消して空白にしてくれるすごいボタンをjavascriptで作る前に`<input type="reset">`と書いてみるべきである。
Railsには`submit_tag`や`text_field_tag`などがあるが、何故か`reset_tag`がない。
どうしてもresetボタンが欲しい夜は、以下のようなものを用いる。

```helpers/application.rb
def reset_tag(value = "Reset form", options = {})
  options = options.stringify_keys
  tag :input, { "type" => "reset", "value" => value }.update(options)
end
```

# パクリ元

[Rails / ActionView /../ form_tag_helper - Github](https://github.com/rails/rails/blob/v4.1.8/actionview/lib/action_view/helpers/form_tag_helper.rb#L433-L437)
BEM記法を以前よりもっと改善したいという思惑

この記事は[BEM記法を自分なりに改良したいという思惑](http://qiita.com/warotasan/items/bbca0b1b67ed2d6cd554)の後続記事です。

# 前回のまとめ

要点は

1. **単語の区切りに「-」や「\_」は使わず、キャメルケースを使う**
2. **Modifierには「--」は使わず、マルチクラスで表現する**
3. **上記2点より「-」「\_」「--」は使わなくて済むので、Elementを示すには見慣れない「\_\_」ではなく一番自分の見慣れた「-」を使う**
4. **マルチクラスで表現されるModifierとBlockと区別するため、Blockの最初の文字は大文字**

となります。
サンプルのBEM記法ベースのCSSをこの条件に従って書き直して比較してみると

```css:CSS_based_on_original_BEM
.hoge
.hoge__fuga-piyo
.hoge__fuga-piyo.hoge__fuga--foo_bar_baz
```

```css:CSS_based_on_my_BEM
.Hoge
.Hoge-fugaPiyo
.Hoge-fugaPiyo.fooBarBaz
```

これを次のように変えます。

# 結論

```css:CSS_based_on_my_NEW_BEM
.Hoge
.Hoge__fuga-piyo
.Hoge__fuga-piyo.foo_bar
```

## 単語の区切りに「-」や「\_」は使わず、キャメルケースを使おうと思っていました

まとめていますように、Blockであることを示すために、Blockの先頭を大文字で記述するようにしています。しかしBlockの先頭以外にも大文字があるとなんとなく見辛く感じたためやめました。単語の区切りには「-」を使うようにしました。

## 「-」「\_」「--」は使わなくて済むので、Elementを示すには見慣れない「\_\_」ではなく一番自分の見慣れた「-」を使おうと思っていました

膨大な量のHTMLやCSSの文字列の中、「-」1文字だと面積が小さく埋もれて見えないので、一度は「--」にしました。しかし「\_\_」のほうが低い位置に表示されるため、なんとなくElement（子要素）感が出て良かったので「\_\_」に戻しました。

## 実は「(attribute)\_(value)」という書き方を知りませんでした
BlockやElementやModifierの属性値についてもBEMである程度表現することができるなんて知りませんでした。

例えば「容量（属性）が500ml（属性値）のペットボトル」と「容量が1Lのペットボトル」は

```css
.Plastic-bottle_capacity_500ml
.Plastic-bottle_capacity_1L
```

という風に表せます。
（上記の「単語の区切りに『-』を使う」というのは、ここで「\_」を使うためだったのです。）

しかし僕だったら結局

```css
.Plastic-bottle.capacity_500ml
.Plastic-bottle.capacity_1L
```

とマルチクラスなModifier化してしまいますけどね。
ただ、2つの単語の意味のつながりがはっきりするのは非常に良いですね。

# けつろぉん。

前回の最後に書いたサンプルCSSを今回の記事に合わせて書き直しました。

```css
.Android {
    font-family: "Droid Sans";
}

.Android.os_kitkat {
    content: "Version 4.4";
}

.Android.os_jelly-bean {
    content: "Version 4.1-";
}

.Android__cyanogen-mod {
}

.Android.os_kitkat .Android__cyanogen-mod {
    content: "Version 11";
}

.Android.os_jelly-bean .Android__cyanogen-mod {
    content: "Version 10-";
}
```
メタ述語関数を論理操作するメタ関数

こんばんは。


今日はメタ述語関数を論理操作するメタ関数を作っていきます。
ですが、内容的には[前回](http://qiita.com/rinse_/items/12b0ac8951e6778c7abb)と似た感じで、メタ関数を生成するメタ関数を作る形になります。

なお、[エイリアステンプレートいろいろ。](http://qiita.com/rinse_/items/1fb1ddcc14bf8d530625)で紹介したメタ関数が登場しますので、ぜひ併せてお読みいただけると嬉しいです。

＊＊＊

* つまりなんじゃらほい？

メタ述語関数というのはメタ関数の述語関数です。

```
template < 
  template < class > class Pred,
  class... Args >
struct meta_count_if;

// std::is_voidを述語関数として使う
meta_count_if< std::is_void, int, char >::value; // 0
meta_count_if < std::is_void, int, void, char, void >::value; // 2
```

stlでも比較的よくお世話になるcount_ifのメタ関数バージョンを考えてみました。
(stlのものはイテレータで指定するので型リストとしてstd::tupleを使った方が良いかとも思いましたが……)
このPredに突っ込むメタ関数がメタ述語関数です。ちなみにcount_ifみたいな述語を取る関数を高階関数といいます。なので、ここでは便宜的にmeta_count_ifみたいなメタ関数をメタ高階関数と呼ぶことにします。

＊＊＊

* つまりなんじゃらほい？

メタ述語関数を論理操作というのは、つまり、述語関数の吐く値を操作して新しい述語関数を作ってやろうじゃないの、という趣旨のものです。例えば、std::is_integralを否定したメタ関数はis_not_integralです。

```
template < class Ty >
using is_not_integral = typename pred_not < std::is_integral >::template type < Ty >;
```

こんな形にします。
簡単なのでサクッとpred_notを作ってしまいましょう。

```
//
// meta-predicate-not
template <
  template < class > class Pred >
struct pred_not
{
  template < class Ty >
  using type = meta_not < Pred < Ty > >;
};
```

はい。
meta_notは[エイリアステンプレートいろいろ。](http://qiita.com/rinse_/items/1fb1ddcc14bf8d530625)で紹介した関数で、論理否定をする高階メタ関数です。std::true_typeかstd::false_typeを受け取って反転してくれます。

同様に、pred_orとpred_andも作ってみます。
わたしの力不足で少し長ったらしくなってしまいましたので、少しうんざりしちゃうかもしれません。

```
// c++14のstd::conditional_tとは違うので注意してください
template < class Ty, class Then, class Else >
using conditional_t = typename std::conditional < Ty::value, Then, Else >::type;

//
// meta-predicate-or
template <
  template < class > class Head,
  template < class > class... Body >
struct pred_or
{
  template < class Ty >
  using type =
    conditional_t <
      Head < Ty >,
      std::true_type,
      typename pred_or < Body... >::template type < Ty >
    >;
};
template <
  template < class > class Head >
struct pred_or < Head >
{
  template < class Ty >
  using type = Head < Ty >;
};

//
// meta-predicate-and
template <
  template < class > class Head,
  template < class > class... Body >
struct pred_and
{
  //
  // pred_orを利用して書きたかったけど挫折してコピペした痕跡
  template < class Ty >
  using type =
    conditional_t <
      meta_not < Head < Ty > >,
      meta_not < std::true_type >,
      typename pred_and < Body... >::template type < Ty >
    >;
};
template <
  template < class > class Head >
struct pred_and < Head >
{
  template < class Ty >
  using type = Head < Ty >;
};
```

これでpred_orとpred_andができました。
これを使えば、例えば

```
template < class Ty >
using is_const_integral = typename pred_and < std::is_const, std::is_integral >::template type < Ty >;
```

のような記述でconstかつintegralのもののみがマッチするメタ関数を生成することができます。
滅多に使うことはないと思いますが……。

余談ですが、こういうものを作るときに意外にはまりがちなのがcv修飾子と参照です。
わたしは基本的にはremove_rcvというメタ関数(参照とcv修飾子を取っ払います)を作って取っ払いますが、constだったり参照だったりを条件に組み込む場合は注意が必要ですね。
Flyway で SQL*Plus 向けのデータパッチを流したら怒られた件。


手元に Oracle がないのですが、会社で開発環境に Flyway を導入しようと思い試していたところ、以下の様な SQL 文を Flyway に食わせると ORA エラーが出ました。
(投げている SQL によって ORA-01735 だったり ORA-00935 だったり…)

```Patch.sql
INSERT INTO hoge VALUES (4, "Fuga")
/
ALTER TABLE foo DROP COLUMN bar
/
commit
/

```

会社でこれまで作っていたデータパッチは SQL*Plus や SI Object Browser で流すことを想定していたのですが、 Flyway ではこれじゃダメで、１文ずつセミコロンで区切って、スラッシュでのバッファの実行は要らないようです。

これを変えられないのでどうしようかといろいろ考えたのですが、結局はスラッシュのみの行をセミコロンのみの行に置換したパッチを作ることで回避。
自分は Gradle をつかって Flyway を走らせていたので、以下のように対処。

```build.gradle
apply plugin: 'flyway'

(中略)

task copyPatch(type: Copy) << {
    from 'fromdir'
    into 'distdir'
	filter { line ->
        line.replaceAll '^/$' ';'
    }
}

flywayMigrate.dependsOn copyPatch
```
キュレーションサービスの未来にあって欲しいもの。片説ジャーナリズム。

[データジャーナリズム Advent Calendar 2014](http://www.adventar.org/calendars/615)の4日目、深夜25時の投稿です。眠い。

#そもそもジャーナリズムとは何でしょう？
私は「ファクトを積み上げ、ストーリーを伝える事」という定義が一番しっくり来ます。
ファクトそのものを伝える事がジャーナリズムであるなら、[天気情報API](http://openweathermap.org/)で獲得した気温データをそのまま送りつける事がジャーナリズムです。
そうではなく、現在の気温と過去の気温を比較して温暖化が進んでいるというストーリーを伝える。
こっちの方がジャーナリズムですよね。

#なぜキュレーションサービスはデータジャーナリズムの文脈で語られない？
ジャーナリズムではないからだと思います。
キュレーションサービスとは、情報をまとめて共有するサービスの総称です。
SmartNewsとかGunosyとかハッカドールとか。
職人と職人が作った作品を売る業者くらいの違いを感じます。
ジャーナリズムの中間業者の立ち位置ではないでしょうか。

#それでもキュレーションサービスの方が未来を感じるのはなぜ？
価値観が多様になっているならば、価値を感じるニュースも個人によって違います。
なら、個々人に合わせたニュースコンテンツ提供が正しいあり方ですよね。
誰もが知らなくてはいけない情報があるというのは、価値観の押し付けです。
宗教の態度で、科学の態度ではないです。

#でも、キュレーションサービスの個人最適化には限界がない？
既存のコンテンツは対個人に作られたものではない訳で、どこか噛み合ってないものになりがちです。
本当の意味で噛み合うコンテンツは、ニュースを届けるその人を読者として想定するコンテンツです。
そういう意味で理想的なのは、[片説](http://ja.wikipedia.org/wiki/1000%E3%81%AE%E5%B0%8F%E8%AA%AC%E3%81%A8%E3%83%90%E3%83%83%E3%82%AF%E3%83%99%E3%82%A2%E3%83%BC%E3%83%89)です。
プロ集団が私のためにコンテンツを作ってくれるのが理想的です。

#ストーリーは人間が作らなくてはいけない？
「[ロボット・ジャーナリストの登場で記者は用済みに | 瀧口範子 | コラム＆ブログ | ニューズウィーク日本版 オフィシャルサイト](http://www.newsweekjapan.jp/column/takiguchi/2014/03/post-814.php)」にあるように、ロボットジャーナリズムは実現段階にあります。
なら、個々人に最適化したストーリーを作る事も不可能じゃないですよね。
プロ集団のプロはエンジニアリングのプロであってもいい。

#ロボットによる片説ジャーナリズム。その第1歩は？
ここまで来てステマです。
[NLP勉強会](http://tokyoscrapper.connpass.com/event/9753/)で自然言語処理を一緒に学びませんか？　
自然言語処理とは、書き言葉・話し言葉をシステムが理解できるようにするアプローチです。
システムが言葉を理解できるようになれば、片説ジャーナリズムに近づけます。
ポストMeCab/CaboChaの壁を一緒に叩いてくれる方を募集しています。
基本的な事柄でむしろウェルカムなので、ご発表をお願いします。

　

以上　よろしくお願いします。
親プロセスで設定したプロセス内環境変数を外部スクリプトから参照してみる

C# のアプリケーションで設定したプロセス内環境変数をバッチファイルや wsh で参照したいケースがあったので、テストしてみました。

また、「親プロセスのプロセス内環境変数は子プロセス実行時にコピーされる」との話だったので、ついでにテストしてみました。

```csharp:Program.cs
class Program
{
    static void Main(string[] args)
    {
        Environment.SetEnvironmentVariable("WORK", "work", EnvironmentVariableTarget.Process);
        Process proc = Process.Start("test.bat");
        proc.WaitForExit();
    }
}
```

```bat:test.bat
echo %WORK%

set WORK2=WORK2
call test2.bat

pause
```

```bat:test2.bat
echo %WORK%
echo %WORK2%

set WORK3=Work3

CScript test3.js
```

```js:test3.js
var wsh = WScript.CreateObject("WScript.Shell");
var env = wsh.Environment("Process");

WScript.Echo(env.item("WORK"));
WScript.Echo(env.item("WORK2"));
WScript.Echo(env.item("WORK3"));
```

```:output
>echo work
work

>set WORK2=WORK2

>call test2.bat

>echo work
work

>echo WORK2
WORK2

>set WORK3=Work3

>CScript test3.js
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

work
WORK2
Work3

>pause
続行するには何かキーを押してください . . .
```

このように、子は親のプロセス内環境変数も参照できるみたいです。
sails.js (0.10.x) 起動時にデータを自動的にロードして開発を効率化したい ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい | sails.js (0.10.x) で始めるアプリ開発

sails.js (0.10.x) 起動時にデータを自動的にロードして開発を効率化したい ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

**この記事では以下の絵文字を大事な個所で使用中**

 - :exclamation: 注意点
 - :boom: 予期せぬ例外やエラーメッセージ
 - :sunny: 解決方法・お役立ち情報

皆さん、sails.js 使ってますか？sails.jsはNode.jsのMVCフレームワークです。サクサクつくれるのがポイントで開発も比較的活発に行われておりまス。

Sails.js | Realtime MVC Framework for Node.js - http://sailsjs.org/

:exclamation: **sails.jsはアップデート頻度が高い⇒この記事執筆時点と仕様が異なっている可能性があるのでバージョンに注意**

# 記事の概要

sails.js にはDBのmigration機能がフレームワーク自体に組み込まれている。アプリの起動時にデータベースをリフレッシュしてくれるので便利だ（特に開発時）。ただ、テーブル自体の自動生成はできるが、テーブルに含めたいデータ（たとえばマスターデータ等）を更新することはできない。(v0.10.5 時点)

今回は何とかする方法の紹介

# :sunny: bootstrap.js に記述する

`sails lift` した際に実行される `config/botstrap.js` にデータロード処理を記述することで実現する。

:exclamation: 本番環境 production の場合に間違って処理しないように配慮はすべき

```.js
User.find({admin: true}).exec(function(err, adminUser) {
    // adminUser がいたら何もしない
    if (adminUser) { return ; }
    // いないので挿入するとか
    User.create({name:'Admin Taro', admin: true}).exec();
});
```

ということで、できたよ ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

## この方法がベストなの？

> You can use bootstrap.js currently to findOrCreate some data each time the app runs. But I'd be curious to see a proposed spec for what something more powerful might look like?

現時点での公式のコメント↑なので、今後の機能追加の可能性はあるが、とりあえずOK

# 参考資料等

同じことで困っている人はどこかにいるもの
http://stackoverflow.com/questions/24090135/loading-data-fixtures-the-first-time-a-sails-js-app-is-lifted

sails.jsのプロジェクトでもリクエストきてる
https://trello.com/c/eGIDCCtd/149-advanced-data-bootstrap
Neo4jの勉強メモ２

## CREATE
* Movieラベル付きのTheMatrixノードを作る。
* 
```
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
```

* rolesというキーに紐付く['Neo']というバリューを持つACTED_INというリレーションをもつkeanuノードを作る。そのkeanuノードはTheMatrixノードと紐付く。
* 
```
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)
```

## Find
* select句
* 
```
MATCH (nineties:Movie) RETURN *
```

* where句
* 
```
MATCH (tom {name: "Tom Hanks"}) RETURN tom
```

* 複数where句
* 
```
MATCH (nineties:Movie) WHERE nineties.released > 1990 AND nineties.released < 2000 RETURN nineties.title
```

* リレーションwhere句　その①
* 
```
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies
```

* リレーションwhere句①（左から右）
* 
```
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies
```

* リレーションwhere句①（右から左）
* 
```
MATCH (cloudAtlas {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) RETURN directors.name
```

* リレーションwhere句③（①と②の合わせ技）
* 
```
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name
```

* リレーション自体を不定にすることもできる
* 
```
MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name, Type(relatedTo), relatedTo
```

* limit句
* 
```
MATCH (people:Person) RETURN people.name LIMIT 10
```

## Solve (GraphDBならではのselect文)

* Kevin Baconから4関係分（=4hopsという）以内にhollywoodリレーションで関係のあるデータの取得
* 
```
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood) RETURN DISTINCT hollywood
```

* Kevin BaconからMeg Ryanまでで最短のパスを獲得する
* 
```
MATCH p=shortestPath(
  (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p
```

## Clean up 

* Delete all Movie and Person nodes, and their relationships
* 
```
MATCH (a:Person),(m:Movie) OPTIONAL MATCH (a)-[r1]-(), (m)-[r2]-() DELETE a,r1,m,r2
```

* レコードの確認
* 
```
MATCH (n) RETURN n
```

* limit句
* 
```
MATCH (people:Person) RETURN people.name LIMIT 10
```

## その他

* 困ったら
 
```
 :help [コマンド名称] 
 例） :help MATCH
```
##参考URL
http://neo4j.com/docs/stable/query-sql-start.html
VagrantのBOXアップデート（削除して、新規インストール）


# 1.登録してあるBOXを確認
```
vagrant box list
```

# 2.削除したいBOXを指定して、削除
```
vagrant box remove [BOX名]
```

# 3.削除されていることを確認
```
vagrant box list
```

# 4.各プロジェクトのディレクトリに移動して、仮想環境をターミネートする
```
vagrant destroy
```

# 5.BOXを更新(再取得) 
- Vagrantfileに「config.vm.box_url」が指定されていることが前提

```
vagrant up
```
フルスタックJSフレームワークMeteorのメリット＆デメリット

Meteorでアプリケーションを作ってリリースしたので、その過程で出てきた良い点と悪い点をまとめておく。

## Pros

１．インストールするだけで環境構築されている。一瞬でコードを書ける。(普通はDB、BE、FEそれぞれ構築しないといけないがその作業が皆無)


２．miniMongoと呼ばれるシステムがフロントで走っているのでサーバのMongoからとってきたデータをそのままフロントに呼び出せる。APIを叩く必要もない。全部Meteorがやってくれる。


３．ログイン処理がパッケージ化されていて、１行でログイン処理を実装できる。これはなんの誇張でもない。

４．Facebookログインだって５行くらい。

５．MVCではないのでテンプレート(いわゆるモジュール)毎にファイルを作ることが出来て管理しやすい。

６．デフォルトのフォルダ構成が明快でYomanいらず。(/client, /lib, /server, /publicなどなど)

７．Lessとかcoffeeの導入も簡単でpackageを追加するだけ。もちろんMeteorが分割して書いたLessファイルを１つにまとめてくれたりcoffeeのコンパイルもしてくれる。

８．それなりにリッチなUIも作れそう。

## Cons

１．フルスタックということは何もかもMeteorに依存してしまう。(これはProsでもあるのだけど)

２．Mongo以外の選択肢が基本的にない。

３．ルーティングの時にURLのパスを使ってDBの処理をかけたい場合(タグの名前やIDがURLに含まれてて、それでDBに検索をかける場合とか)その辺りの処理をルーターに書かないといけない。いわゆるControllerの一部がRouter内に入り込んでしまう。これはIron-Routerの問題か。

４．画像や動画を動的に同一プロダクト内に追加できない。やりたければcollectionFSを使うかMongoにそのままつっこむかどっちか。developmentの段階ではpublic以下に画像なりをnodeのAPIで書き込んでそこからデータを取り出せたのでよかったが、デプロイしちゃうとそれができなくなる。Meteorが内部でシンボリックリンクを作っているため。このせいでAWS S3デビューすることに。(これがつらかった)

５．デプロイするにはプロジェクト全体をパッケージ化しないといけない。フロントのCSSだけ変えるとかHTML１行追加するだけでもデプロイ作業が必要。

６．FacebookのOGPタグに対応してない？おそらく。

７．miniMongoはあくまでminiなので、mongoで使えるのにminiでは使えないコマンドがある。例えばdistinct()。

##結論

リリースが前提のプロダクトには二度と使わない。
最初はオールインワンのフルスタック型に魅力を感じていたが、あまりにMeteorに依存していて拡張性がない。

ただHackDayとかリリースしないものにはうってつけなフレームワーク。
Meteorが持つサーバにデプロイもできるし。URLはxxx.meteor.comとなる。CNAMEの設定で独自ドメインにも変更可能。これはすごい。

今後を考えてExpressで書き換えようか悩み中。
形態素解析ツールの辞書を追加する

wikipedia,はてなキーワードを形態素解析ツールの辞書に追加する


- [fukushimuのメモ帳 mecab辞書にwikipediaのタイトルリストを追加](http://fukushimu.blog.shinobi.jp/mecab/-mecab-%20mecab%E8%BE%9E%E6%9B%B8%E3%81%ABwikipedia%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0%20-wikipedia--%E3%81%AF%E3%81%A6%E3%81%AA%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89-)

# ■ mecab辞書作成

- [mecabにwikipediaのタイトルリストを追加する｜ミラボ](http://log.miraoto.com/2012/11/703/)

- [mecabにはてなキーワードのタイトルリストを追加する](http://log.miraoto.com/2012/11/705/)

- [元データの取得から辞書ファイルの作成までをやってくれるプログラム](https://github.com/miraoto/php.mod-mecab-dic)


以下、AWS EC2(Amazon Linux)での作業

## ○ インストール、設定

```bash
sudo yum install php-common php-devel php-cli php-pear
sudo yum install pcre-devel
sudo yum install php-mbstring
git clone https://github.com/miraoto/php.mod-mecab-dic.git
cd php.mod-mecab-dic

mkdir mkdir mod-mecab-dic/tmp
cd mod-mecab-dic/tmp
wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz
php ./mod-mecab-dic/bootstrap.php wikipedia
cd mod-mecab-dic/tmp
mv mecab-dic.dic mecab-wikipedia-dic.dic

cd mod-mecab-dic/tmp
wget http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
cd ../..
php ./mod-mecab-dic/bootstrap.php hatena
cd mod-mecab-dic/tmp
mv mecab-dic.dic mecab-hatena-dic.dic

sudo cp *.dic /usr/local/lib/mecab/dic

cd /usr/local/etc/mecab
sudo cp -p mecabrc mecabrc.orig
sudo vi mecabrc

$ diff mecabrc.orig mecabrc
8a9
> userdic = /usr/local/lib/mecab/dic/mecab-wikipedia-dic.dic,/usr/local/lib/mecab/dic/mecab-hatena-dic.dic
```

どちらかの辞書しか使わない場合は、使う辞書の記述を残して、もう一方を削除。
複数使う場合は、”.”で区切って記述。

## ○ 辞書が使えているかの確認
mecab-wikipedia-dic.dicのみを有効にした場合

```bash
[ec2-user@ip-10-0-0-44 etc]$ echo Androidアプリケーション開発 | mecab
Android     名詞,固有名詞,*,*,*,*,Android,*,*,wikipedia_word
アプリケーション     名詞,一般,*,*,*,*,アプリケーション,アプリケーション,アプリケーション
開発     名詞,サ変接続,*,*,*,*,開発,カイハツ,カイハツ
EOS
```

mecab-hatena-dic.dicのみを有効にした場合

```bash
[ec2-user@ip-10-0-0-44 ~]$ echo 天下一武道会に出場 | mecab
天下一武道会     名詞,固有名詞,*,*,*,*,てんかいちぶどうかい,テンカイチブドウカイ,テンカイチブドウカイ,hatena_word
に     助詞,格助詞,一般,*,*,*,に,ニ,ニ
出場     名詞,サ変接続,*,*,*,*,出場,シュツジョウ,シュツジョー
EOS
```

## ○ ニコニコ大百科
- [Python - ニコニコ大百科データからMeCab辞書を生成する - Qiita](http://qiita.com/nezuq/items/875ac806d9b1afb3798d)

# ■ chasen版辞書作成

- [ChaSen’s Wiki - 辞書の作り方](http://chasen.naist.jp/hiki/ChaSen/?%BC%AD%BD%F1%A4%CE%BA%EE%A4%EA%CA%FD)

- [ayaniimi213/mk-chasen-dic](https://github.com/ayaniimi213/mk-chasen-dic)
Net::LDAPを使ってみる

PerlのLDAPクライアントモジュール、Net::LDAPを使ってみる。
最小限の準備で使ってみる（dockerはセットアップ済みとする）

何はともあれサーバーが無いと接続できないので立てる。
ベースは何でもいいけれどCentOS7で。

```bash
$ docker run -i -t centos:centos7 /bin/bash
```

- openldap-serverを入れる

```bash
bash-4.2# yum install openldap-servers

```

- 接続用のパスワードを生成

```bash
bash-4.2# slappasswd -s pass -h {SSHA}
{SSHA}dasZzCG8To6Opc4B6E7vo1V0F6/NraOL
```

- パスワードを追記

```bash
hbash-4.2# vi /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
olcRootPW: {SSHA}dasZzCG8To6Opc4B6E7vo1V0F6/NraOL
```

- 起動することを確認

```bash
bash-4.2# /usr/sbin/slapd -u ldap -h "ldap:/// ldapi:///"
bash-4.2# netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      -
```

- コンテナ作成完了なのでおわる

```bash
bash-4.2# exit 
```

- イメージにコミットして使えるようにする

```bash
$ docker ps -a
ce943f69e7f9  centos:centos7  /bin/bash  About an hour ago Exited (0) 14 seconds ago
$ docker commit ce943f69e7f9 ymko/ldap
```

- ログを出しながら起動する

```bash
$ docker run -p 389:389 ymko/ldap /usr/sbin/slapd -d 256 -u ldap -h "ldap:/// ldapi:///"
54807ebd @(#) $OpenLDAP: slapd 2.4.39 (Jun  9 2014 23:23:12) $
        mockbuild@worker1.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.39/openldap-2.4.39/servers/slapd
54807ebd ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif"
54807ebd hdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2).
Expect poor performance for suffix "dc=my-domain,dc=com".
54807ebd slapd starting
```

- ようやく接続スクリプトを書く

```pl
use strict;
use warnings;
use Net::LDAP;

my $ldap = Net::LDAP->new( "localhost" ) or die $!;
my $msg  = $ldap->bind;
$msg->code && die $msg->error;

$ldap->unbind;
$ldap->disconnect;

print "end\n";
```

- 実行するとopenldapの出力がすすみましたまる。

```bash
54807ebd slapd starting
54807f3f conn=1000 fd=15 ACCEPT from IP=172.17.42.1:33459 (IP=0.0.0.0:389)
54807f3f conn=1000 op=0 BIND dn="" method=128
54807f3f conn=1000 op=0 RESULT tag=97 err=0 text=
54807f3f conn=1000 op=1 UNBIND
54807f3f conn=1000 fd=15 closed
```

ここまでだったらパスワードのくだりいらなかったか・・・

- 参考

CentOS6 OpenLDAPのインストールと基本設定
http://www.unix-power.net/linux/openldap.html

CentOS 7 : OpenLDAP : LDAPサーバーの設定 ： Server World
http://www.server-world.info/query?os=CentOS_7&p=openldap

CentOS 6.2 に OpenLDAP をインストールしてみた - Hexa's diary
http://hexa.hatenablog.com/entry/2012/02/01/010544

コンテナの働き - Docker User Guide - Qiita
http://qiita.com/zembutsu/items/c6a5070480c98ca000f7

いまさら聞けないDocker入門（2）：ついに1.0がリリース！ Dockerのインストールと主なコマンドの使い方 (3/3) - ＠IT
http://www.atmarkit.co.jp/ait/articles/1406/10/news031_3.html

テクニカルノート/認証サーバ構築/OpenLDAP/OpenLDAPを利用したユーザー認証 - Nature's Linux Tech Portal
http://tech.n-linux.com/index.php?%A5%C6%A5%AF%A5%CB%A5%AB%A5%EB%A5%CE%A1%BC%A5%C8%2F%C7%A7%BE%DA%A5%B5%A1%BC%A5%D0%B9%BD%C3%DB%2FOpenLDAP%2FOpenLDAP%A4%F2%CD%F8%CD%D1%A4%B7%A4%BF%A5%E6%A1%BC%A5%B6%A1%BC%C7%A7%BE%DA

PerlでLDAPアクセス(use Net::LDAP) - jitsu102の日記
http://d.hatena.ne.jp/jitsu102/20100122/1264169301

Net::LDAPのサンプル
http://naonao.ktkr.net/?p=248
Laravelでいくつかサービス作ってみた話

# はじめに

僭越ながらAdvent Calendarの５日目を担当させていただく初心者Laraveler @syossan27 です！
今回はLaravel4.2を使ってサービスを3つ作った話をします。

Laravelをあまり触ったことがない人向けに技術的なところにはフォーカスせず、「こんな場面でも使えるんだ！」って感じが伝われば幸いです。

# １つ目のサービス

ちょっと前に話題になったSNSサービスのelloのユーザ検索システムを作りました。
http://ello.shogai-mijuku.com/

早く話題に乗らなければ！と思い、使い慣れているLaravelを使った次第です。
結果１日かけて作成することが出来ました！

早く作れたのはLaravel Homesteadでローカル環境がサッと構築できた部分が大きかったです。

ちなみにcurl_multiの部分をゴニョゴニョしていないので、ユーザ検索にひじょーに時間がかかります・・・

# ２つ目のサービス

ソシャゲのテラバトルというアプリにいたくハマったので、勢いでテラバトルチームシミュレータを作りました。

http://terra-team.co/

こちらはシングルページなのですが、Laravelを使いました。

感想的にはほぼelloユーザ検索のサービスと同じですｗ


# 3つ目のサービス

これは前職で作ったWebサービスなのですが、履歴書の作成・管理サービスを作成しました。

https://rerec.me/


ある程度大きな規模のサービスだったのですが、この時にもLaravelは活躍してくれました。

色々あるのですが、やっぱりファサードはすごい便利でした！
パッと見での分かりやすさが開発チームに馴染んだらしく、ほとんど触ったことがなかったのに数日で皆使えるようになっていました。


# その他

Laravelはドキュメントが少ないのであまり使う気が・・・って声が周囲でちらほらあったのですが、
今では結構沢山のLaravelエントリーを皆さん書かれているので何かサービス作る上で困ることはほぼ無い環境だとは思います。

また、Twitterで分からないところを呟けばLaravel答えるマンこと@localdiskさんが質問に答えて頂けることが結構あるので、殊更詰まること無くサービスを作れるはずです。


さぁ！Laravelを使ったことのない方も是非Laravelで何か作ってみましょう！
新しくて古い：GAE/Goでガラケー（フィーチャーフォン）用ページの表示


技術において行かれないように、必死なおっさんが初めてAdvent Calendarに挑戦してみます！

# 前置き
結局、日本で展開を考えた時って、ちょっと前のものもサポートしないといけないですよね。ということで、GAE/Goを使って社内システムを作ったのですが、ガラケー(フィーチャーフォン)をサポートしないといけなかったので、その時やったことを書いておきます。

# 必要なものたち

```go:importで必要なやつ
import (

	"code.google.com/p/go.text/encoding/japanese"
	"code.google.com/p/go.text/transform"
	"github.com/gin-gonic/gin"

	"html/template"
	"fmt"
	"io/ioutil"
	"strings"

)
```

今回は、このくらいを使ってみます。もちろん、他のふつーのやつも必要なので適宜入れてください。
上の３つは、そのURLに行けば入れ方が丁寧に書いてあります。

# UA判定/ガラケー判定
いい感じにやってください。ここはガラケーに限った話じゃないと思いますので。
もし、手抜きで判定したい場合は、こんな感じ。

```go:UA判定っぽいやつ(手抜き)
func isMobileUA(ua string) bool {
	fua := [...]string{
		"DoCoMo",
		"KDDI",
		"DDIPOKET",
		"UP.Browser",
		"J-PHONE",
		"Vodafone",
		"SoftBank"}

	for i := 0; i < len(fua); i++ {
		if strings.Contains(ua, fua[i]) {
			return true
		}
	}
	return false
}
```


# ShiftJISへの文字コード変換
ガラケーといえば、やっぱふつーShiftJISですよね。ということで、変換の処理が必要です。上のimportのやつを使わせてもらって、こんな感じで実装します。

```go:ShiftJISへの変換っぽいやつ
func toSjis(str string) (string, error) {
	ret, err := ioutil.ReadAll(transform.NewReader(strings.NewReader(str), japanese.ShiftJIS.NewEncoder()))
	if err != nil {
		return "", err
	}
	return string(ret), err
}
```

# ページ表示用のとこ
今回は、"html/template"を使いました。さらに！なぜか、[Gin Web Framework](http://gin-gonic.github.io/gin/)を使わせてもらいました。ガラケーの部分だけだと使う必要がないとしても！

※古いものをサポートするコードを書くときには、コードも古めかしい感じがいいですよね。Goっぽかったり、ぽくなかったりの部分がありますが、変数名などはカッコ良くローマ字で書きましょう。例えば、UserMasterとかは、YuuzaMasutaと書くべきです。ほんとは全部大文字だとよりカッコいいです。
いにしえのプログラマの可読性のためにも！

```go:ハンドラっぽいやつ
type PejiView struct {
	Namae  string
	Hyouji string
}

func init() {

	r := gin.New()

	r.GET("/gara", handlerPoi)

	http.Handle("/", r)

}

func handlerPoi(c *gin.Context) {

	isMobile := isMobileUA(c.Request.UserAgent())

	var pv PejiView
	pv.Namae = "なまえ"
	pv.Hyouji = "表示"

	var templateName string
	if isMobile {

		pv.Namae, _ = toSjis(pv.Namae)
		pv.Hyouji, _ = toSjis(pv.Hyouji)

		templateName = "template/indexfp.html"
		t := template.Must(template.ParseFiles(templateName))
		c.Writer.Header().Set("Content-Type", "text/html; charset=Shift_JIS")
		err := t.Execute(c.Writer, pv)
		if err != nil {
			c.String(500, "era- "+err.Error())
			return
		}
	}

}
```

```xhtml:indexfp.html(ShiftJISでファイル保存してください！)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>Kakkoii Peji</title>
</head>
<body>
	<center>
	<h1>最先端のカッコいいページ！</h1>
	{{.Namae}}さん。お疲れ様です。
	<br /> {{.Hyouji}}
</center>
</body>
</html>
```

# 完成！
こんな感じで、新旧折衷のカオスなコードをどんどん作って行きましょう！
わかり始めたマイグレーション。

以上！
zshとbashでは変数の単語の分割ルールが違う

変数の値にスペースが含まれているとき、zshとbashで単語の分割ルールが違う。zshでシェルスクリプトを書くときに注意が必要になるので紹介する。

## 例1: 変数をコマンドの引数に指定する
変数の値にスペースを入れて、それをtouchコマンドの引数にしてみる。

zshの場合は変数の値が1つの単語として扱われる。なので`file1 file2`という1つのファイルが作成される。

```
% filename="file1 file2"
% touch $filename
% ls -l
-rw-r--r-- 1 mollifier mollifier 0 12月  4 10:36 file1 file2
```

bashやshの場合は変数の値が中に含まれるスペースで区切られる。なので`file1`、`file2`という2つのファイルが作成される。

```
# bashまたはshの場合
% filename="file1 file2"
% touch $filename
% ls -l
-rw-r--r-- 1 mollifier mollifier 0 12月  4 10:37 file1
-rw-r--r-- 1 mollifier mollifier 0 12月  4 10:37 file2
```

つまり、zshの場合は`touch "file1 file2"`、bashの場合は`touch "file1" "file2"`というふうに変数の値が展開される。

## 例2: コマンドを変数に代入して実行する
コマンドと引数を変数に代入して実行する場合も同じで、zshの場合は変数の値を1つのコマンドとして実行しようとする。

```
# zshの場合
% cmd="echo hoge"
% $cmd
zsh: command not found: echo hoge
```

bashやshの場合は変数の値を中に含まれるスペースで区切ってから実行する。

```
# bashまたはshの場合
% cmd="echo hoge"
% $cmd
hoge
```

## zshでbashと同じようにスペースで区切る
zshでもbashと同じように変数の値を分割することもできる。方法は2つ。

### 方法1
`SH_WORD_SPLIT`オプションを有効にすると変数を分割するルールがbashと同じになる。

```
setopt SH_WORD_SPLIT
% cmd="echo hoge"
% $cmd
hoge
```

### 方法2
変数を`${=VAR}`という形式で参照すると、`SH_WORD_SPLIT`オプションを有効にしたときと同じように変数の値が展開される。

```
% cmd="echo hoge"
% ${=cmd}
hoge
```

「方法1」はオプションを無効にするまでその設定になってしまうので、`SH_WORD_SPLIT`オプションはデフォルト(無効)のままで必要があるときだけ「方法2」のやり方で展開するのがよいと思う。

たまに、この方法を知らないと思われる人がevalしてるのを見ることがある。

```
% cmd="echo hoge"
% eval $cmd
```

evalは無理矢理な感じがするので、`${=cmd}`を使ってみてください!

## bashでもzshと同じようにスペースで区切らないようにする
bashでも変数を`"`で囲むと、zshと同じように変数の値が分割されないようになる。

```
# bashまたはshの場合
% filename="file1 file2"
% touch "$filename"
% ls -l
-rw-r--r-- 1 mollifier mollifier 0 12月  4 10:37 file1 file2
```

なので、bashまたはsh用のシェルスクリプトを書くときは、基本的には変数名を`"`で囲っておいたほうが安全。
カワイイは作れる☆自作パソコンのススメ


はじめまして[@ususmfmf](https://twitter.com/ususmfmf)です，[Usaribbon](http://www.usaribbon.net/)とかうささんとか呼ばれてます．電通大のだいがくいんでうぇぶあぷりのさーばーさいどのかいはつしえんのけんきゅうをしています．

本記事は[Tech Women Advent Calendar 2014](http://qiita.com/advent-calendar/2014/tech_women)に向けて書いた記事です．元インターン同期のしなちゃんが作ってくれた企画にのってみました♪

最近FreeNASちゃん可愛い！ってなってるので，当初はFreeNASの導入の仕方について書こうと思ったんですけど，ただのマニュアルになりそうだったので今回は自作パソコンのことについて話したいと思います．全然新鮮なネタじゃなくてなんか申し訳ないですが．ハードウェア分野の人は生暖かい心ででご覧ください．

## 可愛い物が好きな人にこそおすすめしたいパソコンづくり
### カワイイ☆はつくれる
突然ですが私はピンクが好きです．部屋の家具もピンク多め．
部屋に合うデスクトップパソコンがほしかったのですが，量販店では黒・赤・白・シルバーばかり…
可愛い物があっても，スペックが低くて条件に合わなかったり…
（ていうか可愛い工業製品のスペックが低いのなんなの？？？？？）

そんな大学入学前の春休みのわし：
「よっしゃ！！！可愛くて高性能なコンピューター買うぞ！！！検索！！」

＞＞＞＞　検索結果：　０件　＜＜＜＜

*無いならつくろうウササギス [出展：うさりぼん]*

## 自作パソコンの定義
この記事で示す自作パソコンとは **「自分でPCパーツを選んで買ってきて組み立てたマシンに，何かしらの出来合いOSをインストールして使うパソコン」** のことを指します．ウェハから自作したとかじゃないですなにそれ怖い．

## カワイイ☆はつくれた
![IMG_5889.JPG](https://qiita-image-store.s3.amazonaws.com/0/25735/e8ac8ddb-e90a-1489-496c-a2a581c9d29b.jpeg "IMG_5889.JPG")

我が子です．そこらの市販PCよりかわいいです，ピンクだから！！パーツ変えつつ現役5年目，自分で作ると愛着わきます． 
i7シリーズが出たばかりの頃だったのでi7積んで，全部で13万円くらい．
量販店で同じスペックのを見たら1.5〜2倍程度のお値段でした．しかもピンクじゃないし（半ギレ）

- 選定パーツ基準：特化型というよりは，ちょっと高性能でコスパの良いバランス型
- ストレージ構成：現在は，SSDにOS，HDD☓2にデータというかんじ

### トラブル１：ピンクのモニタが売ってない
解決策： **塗った**
塗料はプラモで使うやつ．サーフェーサーのノリがわるくて大量消費してしまった．
マスキングするのを忘れずに．換気のいいところで！！！

### トラブル２：ピンクのキーボードっで可愛いだけで利便性ェ…
解決策：奇跡的に青軸のピンクが売っていた！やったね！１１（オンライン限定）
カチャカチャカチャ

## 自作パソコンは難しくない
「自作パソコン」って一見敷居が高そうですが，そんなことはまったくないのです．
私も，作ろうと決めた時は「CPUの周波数ってなにｗｗ」ってレベルでした．
パーツさえ選んで買ってしまえば，プラモデルみたいに組み立てるだけ！

1. パーツを選んで（最重要）
1. 買ってきて
1. 組み立てて
1. OSを入れる！！

自作パソコン，楽しそうだと思いませんか？

## 作り方
### 1. どんな用途にしたいか考える
自分がどんなパソコンがほしいか想像します．
ネットサーフィン，オンラインゲーム，サウンドづくり，お絵かき，プログラミング，可愛いPC欲しい…なんでもOK！
用途によって，強化すべきパーツ（お金をかけるべきパーツ）が変わってきます．
例えば，オンラインゲームなら映像と速度重視なので，CPU・メモリ・ビデオカードにお金をかけるとかね！
私はバランスよく高性能のものが欲しかったので，予算と相談しながらパーツを選定．
一番気合いを入れたパーツはCPUで，そのかわりにサウンドカードはオンボードで妥協．（他の内訳忘れた…

### 2.予算とパーツをきめる
どんな用途にするか決まったらパーツ選びです！
とりあえず最新の動向を知るために，自作PC向けの雑誌を1冊買うことをおすすめします．
ネットで調べてもいいんですけど，雑誌のほうが最新パーツの比較情報が詳しく載っていたりするのでわかりやすい．
あとパーツ同士で相性というか，CPUに合ったパーツを選ばなきゃいけないのでその組み合わせ表も載っていることもあります．
だいたい組み立て方が特集されていることも多いので，最後までお世話になることうけあい．
高校卒業したての私はハードウェアは全くのぺーぺーで知らないことばかりでしたのでとても参考になりました．
動向がわかったらカカクコムで調べてみてもいいですね．

意外に重要なのが「電源」．電源が小さいと供給が間に合わなくてうまく動いてくれません．
どれくらいかかるか調べて，それに合う電源を買いましょう．

### 3.パーツを買いに行く
ここまでくればあとはヌルゲーです．れっつおかいもの．
決めたパーツを買って，可愛いケースを選んだり，好きなキーボードを選んだり…
組み合わせは本当にたくさん．わくわくしながらお買い物しましょう！

### 4.組み立てる
おうちに帰ったらさっそく組み立てます．広い場所で作業しましょう．
あと，パーツは静電気にとても弱いので，静電気には細心の注意をはらってください．
自分で買ったパーツを組み立てて，電源ボタンをおして，BIOSが動いた時の感動はひとしおです．ｳﾌﾌ

### まとめ：自作パソコンのメリット
- おおよその市販同スペックPCより安くつくれる
- 好きなパーツを組み合わせられる
- 好きな外見にできる
- 自分で中身がわかるのでメンテナンスしやすい，パーツを交換して長寿命
- なんだかんだで愛着がわく
- 冬は暖房になる！！！

以上，カワイイはつくれる！を実証してみました．

_花の金曜日！明日の担当はrumi1001さんです！_

* * *

### おまけその1 黒歴史
3年前につくった超適当なサイトを発掘，これで何がしたかったのかはよくわからない．
マークアップとかその他もろもろがレガシーすぎてわらう．
[ぱそこんのつくりかた](http://www.usaribbon.net/originalPC/)　（内容はこの記事とあまり変わらない）


### おまけその2　我が子と一緒
一緒にテレビデビューしたという自慢（素手で触ってるとかいうつっこみはなし）
![10731017_721560044601472_5770244667500357899_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/25735/e1b3f504-f24c-7851-051e-0191742c8c71.jpeg "10731017_721560044601472_5770244667500357899_n.jpg")
「サーバーの仮想化って何？おいしいの？」に答えてみる

# はじめに

あるところでシステム開発に詳しくない人が質問されていた内容に、自分ならどうやって答えるだろうかと思ったので説明してみるテスト。こんな感じで合ってる？

# 回答は複数ありそう

立場によって違いそうなので分けて書いてみる。あと、なんとなくAさんとBさんの会話にしてみた。

## VPSやサーバのホスティング等をやっている業者（サクラさんとか？）

### 仮想化以前
A「お客さんからサーバ利用の発注入ったよ！」
B「そしたらハード準備しないと！」
A「買ってきてセットアップして、準備…場所も食うし時間もかかるなぁ…」

### 仮想化以後
A「お客さんからサーバ利用の発注入ったよ！」
B「仮想マシンが勝手に起動するから放置しておけばいいよ。」
A「一台のハードで複数のお客さんが捌けるからハードの台数も減って、提供までの時間も減ったね。」

## サービス作成者

### 仮想化以前
A「普段ってサーバーのリソースいつも余裕あるね。」
B「うん。だってユーザのアクセスに波があるから急にアクセスが沢山来た時の為に対応できるようにしとかないといけないよ。」
A「そっか。沢山アクセスがあってサーバーが落ちるよりは余裕持ってお金払ってかないとダメなんだね。お金かかるなぁ。」

### 仮想化以後
A「え？リソースギリギリでいいの？」
B「うん。だってユーザーのアクセスが増えそうになったら数字を変えれば新しいマシンを立ち上げることもできるからさ。」
A「そっか。沢山アクセスが来そうだったら設定変えるだけでいいなんて凄いね。お金節約できるし。」
B「自動的にサーバの数が変わる仕組みもあるんだよ。」


# おしまいに

うまいこと通じるか知りたい。どうだろか。
Ruboty | 西暦年から和暦を出力する ruboty-wareki を作成しました #ruboty

# Ruboty | 西暦年から和暦を出力する ruboty-wareki を作成しました #ruboty

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
西暦年から和暦を出力する ruboty-wareki を作成しました

和暦の変換は @tomiacannondale@github さんの era_ja gem を使わせていただきます。

## <i class="fa fa-cube" style="font-size:1em;"></i> 用途
西暦年に対応する和暦を知りたい時に利用します。

## <i class="fa fa-cube" style="font-size:1em;"></i> Installation

Add this line to your application's Gemfile:

```ruby
gem 'ruboty-wareki'
```

And then execute:

    $ bundle

Or install it yourself as:

    $ gem install ruboty-wareki

## <i class="fa fa-terminal" style="font-size:1em;"></i> Commands

|Command|Pattern|Description|
|:--|:--|:--|
|convert|/wareki convert (?&lt;year&gt;.\d\{4\})\z/|get wareki from AD. ※1月1日時点の元号|
|convert_after|/wareki convert_after (?&lt;year&gt;.\d\{4\})\z/|get wareki from AD. ※12月31日時点の元号|

## <i class="fa fa-file-text-o" style="font-size:1em;"></i> Usage
### convert
* get wareki from AD. ※1月1日時点の元号

~~~bash
>ruboty wareki convert 1868
>明治01年
>ruboty wareki convert 1913
>大正02年
>ruboty wareki convert 1977
>昭和52年
>ruboty wareki convert 1989
>昭和64年
>ruboty wareki convert 1990
>平成02年
~~~

### convert_after
* get wareki from AD. ※12月31日時点の元号

~~~bash
>ruboty wareki convert 1868
>明治01年
>ruboty wareki convert 1913
>大正02年
>ruboty wareki convert 1977
>昭和52年
>ruboty wareki convert 1989
>平成01年
>ruboty wareki convert 1990
>平成02年
~~~

## <i class="fa fa-gears" style="font-size:1em;"></i> ENV

|Name|Description|
|:--|:--|
|--|--|

## <i class="fa fa-puzzle-piece" style="font-size:1em;"></i> Dependency

|Name|Description|
|:--|:--|
|era_ja gem|<i class="fa fa-github-square" style="font-size:1em;"></i> [era_ja gem](https://github.com/tomiacannondale/era_ja)|

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* [和暦を手軽に扱いたい](http://qiita.com/snoozer05/items/9b8881b09696ece05f77)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-wareki GitHub](https://github.com/tbpgr/ruboty-wareki)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-wareki RubyGems](http://rubygems.org/gems/ruboty-wareki)
Linuxでプロセスが利用可能なcpu数を数える

この記事は「[1分で実現できる有用な技術 Advent Calendar 2014](http://qiita.com/advent-calendar/2014/one-minute)」の5日目の記事です。

Linuxカーネルが認識している論理cpu数を数えるのは↓みたいな感じでも良いのですがプロセスが利用できる数とは違うので多少注意が必要です。これはプロセスに対してリソースの制限がかけられている場合があるからですね。

```
grep processor /proc/cpuinfo | wc -l
```

ということで、そんな時に[nproc(1)](http://linuxjm.sourceforge.jp/html/GNU_coreutils/man1/nproc.1.html)です。このコマンドなら現在のプロセスで使えるcpu数を知ることができます。

では実際に動かして見てみます。 下のコードはまず何もリソース制限がない状態でnprocコマンドを実行。その後に利用可能なcpuを設定してnprocを実行しています。ここではfork前にリソース制限をしてそれが子プロセスに引き継がれています。

```c
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void do_nproc(void)
{
	printf("execute nproc command\n");
	system("nproc");
}

void set_affinity(void)
{
	cpu_set_t set;
	CPU_ZERO(&set);
	CPU_SET(0, &set);
	CPU_SET(2, &set);

	sched_setaffinity(0, sizeof(set), &set);
}

int main(int argc, char **argv)
{
	pid_t pid;

	do_nproc();

	set_affinity();

	pid = fork();
	if (!pid) { // child
		cpu_set_t child_set;
		CPU_ZERO(&child_set);

		do_nproc();
		printf("sched_getaffinity\n");
		sched_getaffinity(0, sizeof(child_set), &child_set);
		printf("number of cpus: %d\n", CPU_COUNT(&child_set));

		_exit(0);
	} else if (pid > 0) {
		waitpid(pid, NULL, 0);
	} else {
		perror("fork");
	}

	return 0;
}
```
実行結果はこうなります。最初は８個のcpuが見えるけど、sched_setaffinity()でcpu数を制限したあとは２個しか見えなくなります。sched_getaffinity()はおまけです。

```
masami@saga:~$ ./a.out
execute nproc command
8
execute nproc command
2
sched_getaffinity
number of cpus: 2
```

nprocコマンドの実装については[	φ(..)メモメモ　ncproc(1)はどうやってcpu数を数えているのか](http://kernhack.hatenablog.com/entry/2014/10/11/214706)で解説したので興味のある方はこちらもどうぞm(__)m
Fluentd に bundle された in_dummy プラグイン

Fluentd に in_dummy プラグインが [bundle された](https://github.com/fluent/fluentd/pull/484)ので紹介します。v0.10.58 および v0.12 以降に同梱されています。

これは、タゴ・モリスという人が以前作った [fluent-plugin-dammydata-producer](https://github.com/tagomoris/fluent-plugin-dummydata-producer) プラグインを元に Fluentd 本体に移植したもので、Fluentd プロセス内でメッセージを生成して、動作確認をするのにご利用いただけます。

## 今までの fluent-cat を用いた動作確認

以前なら、Fluentd にテストデータを流して動作確認するには

```apache
<source>
  type forward>
</source>

<match raw.**>
  type stdout
</match>
```

のように conf を記述して、

```
$ fluentd -c fluent.conf
```

として fluentd を起動した後、

```
$ echo '{"message":"foo"}' |  fluent-cat -h localhost raw.foo
```

のように fluent-cat コマンドでデータを流して確認していたと思います。

## in_dummy プラグインを用いた動作確認

in_dummy プラグインを用いて、例えば conf を次のように記述すると、

```apache
<source>
  type dummy
  tag raw.foo
  dummy {"message":"foo"}
</source>

<match raw.**>
  type stdout
</match>
```

```
$ fluentd -c fluent.conf
2014-12-05 00:08:12 +0900 raw.foo: {"message":"foo"}
2014-12-05 00:08:13 +0900 raw.foo: {"message":"foo"}
2014-12-05 00:08:14 +0900 raw.foo: {"message":"foo"}
```

fluentd を起動しただけでデータが流れるようになります。fluent-cat を叩く必要がなくて便利ですね！

fluent-cat を叩かなくてもよいという点に加えて、conf 中に入力データのサンプルを一緒に書けるようになった点も影響が大きいかと思っています。

これにより入力データを明確に記述できるようになりましたし、自作プラグインの README に使い方を書く場合や、MLで質問に答える場合に役立ちそうです。

ユーザとして試す場合も、in_dummy プラグインで入力データも示されていれば、コピペするだけで動くので簡単ですね！

## in_dummy プラグインのオプション

in_dummy プラグインのオプションは以下のようになります。

* tag 
   
   * 必須。タグを指定します。

* rate 

   * メッセージを生成する頻度(messages / sec)を指定します。デフォルトは 1 (１秒に１メッセージ)です。

* dummy

   * 生成するダミーデータを JSON Hash 形式、または JSON Hash の Array 形式で複数メッセージを指定します。デフォルトは `{"message":"foo"}` です。

* auto_increment_key
   * 自動インクリメント機能を使用するメッセージのkeyを指定します。メッセージが生成される度に値が1増えます。

## dummer とのポジション的な違い

in_dummy プラグインは Fluentd の同一プロセス内でメッセージを生成するため Fluentd の性能検証をするのには向かないでしょう。データを生成するプロセス(ベンチマーククライアント)は別プロセスにしたいものです。

別プロセスを立ち上げて性能検証をするためには、類似のツールとして拙作の [dummer](https://github.com/sonots/dummer) というツールがあるのでそちらを利用すると良いでしょう。

## まとめ

in_dummy プラグインが bundle されました。動作確認、conf のサンプルを書く際に是非、お使いください。