OmniAICreator/Qiita-1.07M huggingface dataset:
HaxeのMetadata

# Metadataとは

構文には直接関与しない付加的なデータです。

Hexeにおいて、大きく分けて **Compiler Metadata** と **Runtime Metadata** 2種類のMetadataがあります。

## Compiler Metadata

* 付与された対象に作用させてコンパイル結果を変更したり、コンパイル時に制約を与えたりする際に用いられます。
* 表記は *@:xxx* (xxxに識別子として使用可能な文字)です。
* 標準でいくつか用意されており、 *haxe --help-metas* とタイプすることで確認することができます。

## Runtime Metadata

* コンパイルで生成されたファイルに保存され、Metadata APIを通して取り出し、実行時に特別な振る舞いを与えたい場合に用いられます。
	* Metadata APIは、[haxe.rtti.Meta](http://api.haxe.org/haxe/rtti/Meta.html)です。
* 表記は *@xxx* です。Compiler Metadataとは異なり、@の後ろにコロンがないことに注意。

# Metadataの使い方

Metadataは、classやenumの宣言部、クラスフィールドやメソッド宣言部、およびたいていの式要素に付与することができます。

## class, enumの場合

```
@hoge
class MyHogeClass {
	...
}
```

## クラスフィールド, メソッド宣言部の場合

```
class MyHogeClass {
	@foo
	private var _x;

	@var
	public function yyy() {
		...
	}
}
```

## 式要素の場合

以下の要素については使用できることを確認できてます

* コントロールフロー
    * if / for / while(do-while) / switch / try / break / continue / return / throw / new

```
@:aaa if (x % 2 == 0) { ... }
```

* ローカルスコープ（ブロック）

```
var x = @:aaa {
	var y = 10;
	y * y;
}
```

* 変数宣言

```
@:aaa var x = 1024;

function foo(@:aaa x) { ... }
```

* ローカル関数

```
public function foo() {
	var fn = @:aaa function() { ... };
}
```

## 使えなかったところ

* 演算子の前

```
var x = 10 @:aaa + 20; // NG
```

# Metadata APIについて

APIリファレンスには、３つの関数が載っており、

* getType(...)
	* class / enumに付与したメタデータ情報を抽出する
* getFields(...) / getStatics(...)
	* クラスフィールド、メソッドから抽出。後者はstatic宣言用

と分類できます。

はて、式に付与したMetadataが取得できません。どうゆうことでしょう？
これは、Runtime Metadataがclass / enumおよびフィールド、メソッドに付与されたもののみが保存され、式に付与したMetadataは捨てられます。

式へのMetadataの付与は使い道がないのでしょうか？

否、その鍵を握るのがMacroです。

# Macro

Macroの前に、Haxeのコンパイルプロセスのおさらい。

Haxeはソースコードが与えられると、

1. 構文要素に分解(Tokenize)
2. 抽象構文木(AST)を生成
3. 型付け（型推論）
4. コード生成

の流れで処理されます。

Macroは2と3の間および、3と4の間に入り込んで、構文木に任意の変換(AST変換)を施すことができます。

2と3の間は、 クラスに *@:build* Metadataを付与することによって入り込むことができ、
ここでは型無しMacro ( *haxe.macro.Expr* )を使用して変換処理を行います。

3と4の間は、コマンドライン引数で、 *--macro xxx* を与えることで、提供されたMacro: xxxから入り込むことができ、
ここでは型付きMacro ( *haxe.macro.Type* )を使用して変換処理を行います。

いずれの場合に置いても、Macroを通して構文木としての式要素にアクセスすることができるため、Metadataを任意の変換の目印として使用することができます。

また、コンパイルプロセスないでの使用からも分かるように、使用できるのは、Compiler Metadataに限られます。

# まとめ

以上、HaxeのMetadataについて、簡単にまとめてみました。
Neo4jの勉強メモ１

##グラフデータベースとは
* プロパティを持つノードでデータとそのリレーションをあらわす

##ノードとは
* ノードとはデータを保持するレコードである
* データはノードのプロパティとして格納される
* プロパティはKV形式になっている
* プロパティはString, Number, Boolean
* Neo4j can store billions of nodes

##ラベル
* ノードにはラベルを付けることが出来る
* ノードは複数のラベルを持つことが出来る
* ラベルは一切プロパティーをもてない

##リレーションシップ
* リレーションシップはレコードがどのように紐付いているかを示す
* リレーションシップは常に方向を持っている
* リレーションシップはタイプを持っている
* リレーションシップはデータのパターンである
* リレーションシップはプロパティを持てる

##Cypher
* グラフデータを扱うためのSQL的なもの
* 
```
CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })
```
`CREATE` データを作るための宣言
`()` ノードを示す
`ee:Person` eeはデータ名称、Personはラベル名称
`{}` プロパティ宣言

```
MATCH (ee:Person) WHERE ee.name = "Emil" RETURN ee;
```
`MATCH` where句宣言みたいなもの
`(ee:Person)` 対象のノード
`WHERE` WHERE句
`ee.name = "Emil"` where句の左側的な
`RETURN` リターン

* 一度にたくさんのデータを作ることが可能
* 
```
MATCH (ee:Person) WHERE ee.name = "Emil"
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }),
(ir:Person { name: "Ian", from: "England", title: "author" }),
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }),
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }),
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir),
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb),
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally),
(rvb)-[:KNOWS]->(ally)
```

* リレーションから検索する
* 
```
MATCH (ee:Person)-[:KNOWS]-(friends)
WHERE ee.name = "Emil" RETURN ee, friends
```
`-[:KNOWS]` リレーションシップがKNOWであるかどうか
`(friends)` エミリーの友達に限定することを指定

* グラフデータの得意な検索
* 
```
MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer)
WHERE js.name = "Johan" AND surfer.hobby = "surfing"
RETURN DISTINCT surfer
```
`()` 空の丸カッコはsqlでいうところの*
`DISTINCT` sqlでいうところのdistinctと同じ。ヒットするノードへのパスが複数あるときに役立つ。

##参考URL
http://neo4j.com/docs/2.1.6/cypher-query-lang.html
FinderSyncでDropboxモドキを作る


YosemiteではDropboxがFinderと深く連携して動作するようになりました。同期ステータスを示す✅バッジは専用の場所で描画されるようになり、Dropboxディレクトリ内のアイテムを選択した時のみ専用のコンテクストメニューも表示されるようになりました。

![](https://qiita-image-store.s3.amazonaws.com/0/1866/a6cf48e7-2e05-36fb-5c91-e6147c6b6b03.png "")


これは、Yosemiteで新たに追加されたフレームワークであるFinderSyncを利用して実現されています。このFinderSyncを利用することで、Dropboxっぽい見た目のアプリを作ることができるようになります。

# FinderSyncでできること

FinderSyncの実体はApp Extensionです。FinderSyncを利用することで、特定のディレクトリに対して以下のことが実現できるようになります。

* ディレクトリ内のアイテムに対してバッジを設定する
* ディレクトリ内のアイテムが選択された時のコンテクストメニューを追加する
* Finderのツールバー項目を追加する
* ユーザがディレクトリを開いたことを検知する

FinderSyncは同期機能をもつアプリをFinder UI（と各種アプリのファイル操作パネル）と連携させるためのものであり、単体でファイルの同期機能を実現することはできません。これはコンテナアプリ側でFSEvents等のAPIを利用することで実現できるでしょう。

# FinderSyncの使い方

XcodeでCocoaアプリのプロジェクトを開き、<q>Finder Sync Extension</q>ターゲットを追加すると、FinderSyncの雛形が作成されます。FinderSyncフレームワークには`FIFinderSync`と`FIFinderSyncController`の2つのクラスしかないため、容易に全体像を把握できると思います。`FIFinderSync`のサブクラスを作成し、その中から`FIFinderSyncController`のメソッドを呼び出す形で実装します。

以下に、実装例を示します。

```swift
class MyFinderSync: FIFinderSync {

    let controller = FIFinderSyncController.defaultController()

    override init() {
        super.init()

        // 対象のディレクトリを登録する
        controller.directoryURLs = NSSet(object: NSURL(fileURLWithPath: "/Path/To/Mybox")!)

        let doneImage: NSImage! = ... // ファイルのステータスに対応するバッジ画像の生成 ✅
        controller.setBadgeImage(doneImage, label: "Done" , forBadgeIdentifier: "Done")
    }

    // アイテムが表示されるときに呼び出される
    override func requestBadgeIdentifierForURL(url: NSURL!) {
        let isDone = ... // ファイルの何らかのステータスを取得
        if (isDone) {
            // init内で用意したDoneバッジをアイテムにセットする
            controller.setBadgeIdentifier("Done", forURL: url)
        }
    }

    // 各種メニューを返す
    override func menuForMenuKind(menuKind: FIMenuKind) -> NSMenu! {
        var menu: NSMenu!
        switch menuKind {
        case .ContextualMenuForItems:
            menu = ... // ディレクトリ内のアイテムを選択した際のコンテクストメニュー
        case .ContextualMenuForContainer:
            menu = ... // 対象ディレクトリ自体を選択した際のコンテクストメニュー
        case .ContextualMenuForSidebar:
            menu = ... // サイドバーにある対象ディレクトリを選択した際のコンテクストメニュー
        case .ToolbarItemMenu:
            menu = ... // ツールバーボタンをクリックした際に表示されるプルダウンメニュー
        }
        return menu
    }

    // ツールバーにボタンを追加する場合には、下記の3メソッドをオーバーライドする

    override var toolbarItemName: String! {
        return "Mybox Sync"
    }

    override var toolbarItemToolTip: String! {
        return "Mybox Sync"
    }

    override var toolbarItemImage: NSImage! {
        let toolbarIcon: NSImage! = NSImage(named: NSImageNameCaution)
        return toolbarIcon
    }

    // 下記の2メソッドをオーバーライドすると、ユーザが対象のディレクトリ内に入るとき、出るときに通知される

    override func beginObservingDirectoryAtURL(url: NSURL!) {
        ...
    }

    override func endObservingDirectoryAtURL(url: NSURL!) {
        ...
    }

}
```

作成した`FIFinderSync`のサブクラスをInfo.plistの`NSExtensionPrincipalClass`キーの値として設定し、`NSExtensionPointIdentifier`キーの値を`com.apple.FinderSync`とすることで、FinderSync Extensionとしてビルドすることができます。

# まとめ

上記に示したような短いコードで、ハリボテではあるもののFinder上でDropboxのような見た目と挙動を実現することができ、開発者は同期機能などの実装に注力できるようになります。
BigQueryとGoogleAnalytics

# 互いにGoogleのサービスです。
さて、この２つ。
[2013年のGoogle I/Oで連携される](http://markezine.jp/article/detail/17919)と発表されて早１年。実際に使われているところをあまり聞いた事ないという人も多いのでは。
まぁ、これの使い方って社外秘だったりというところも多いのかなと思います。私自身もそんなにおおっぴらにお話しすることが出来なかったりなのですが、やんわり『こんな感じで使えるよ』ということをお話ししたいと思います。
# コストがかかるようで、コスト削減。
アクセス解析基盤を作るのって結構面倒じゃないですか？うちも無いわけじゃなかったんですけど、正直チープでした。最初からアクセス解析を意識してシステムを設計して、構築されている素晴らしいものなら良いのですが、そうじゃない場合はユーザーを認識するためにプログラムを改修したり、様々なところからログを収集して、合体させたり非常に面倒なわけですよ。しかも、それをオンラインで色んな角度で解析したいと思うとそれなりのインフラも必要なわけです。
**もう、そういうの面倒じゃないですか（笑）**
だから、うちはGoogleAnalyticsPremiumを入れました。月額$12,500かかりますけど、インフラ構築費用、システム改修費用、それに対するデータセンターとか電気代とか保守費用などなどざっくり試算してみるとトントン、もしくはコスト削減が見込めました。しかも、BigQueryが使えるのでデータ量が多くなっても気にならない！ってことです。
# どんなデータが入ってくるのか？
『ユーザー』という切り口でJSONのデータでBigQueryにデータが入ってきます。
簡単に言うとキーとしてユーザー番号みたいなものにアクセスされたURLや自然検索のキーワード、滞在時間などが枝となってぶら下がってきます。[詳しい内容はこちら。](https://support.google.com/analytics/answer/3437719?hl=ja)
いわゆるアクセス解析というものに必要なものは詰まっていると思います。特にECサイトなんかだとよだれが出るようなデータをきちんと入れてくれています。
[サンプルデータ](https://support.google.com/analytics/answer/3416091)で確認することができます。
# これで何が良いの？
実のところGAのwebインターフェイスでかなりの分析は出来るんですよ。しかも、視覚化もしてくれるし、ダッシュボードとして十分な機能は利用できるし。（笑）
じゃ、何が良いのか？**すでにあるデータと組み合わせることが出来るのです！**
自分たちが持っているデータとGoogleAnalyticsとのデータを掛け合わせることが出来るんですよ。そこで鍵になるのが、『customDimensions』と呼ばれるカラムです。
ここに自分たちのデータとGoogleAnalyticsを紐づけるキーを入れることで、バラバラだったデータが連結することができます。例えばユーザーがwebサイトにアクセスした際にcookieに一意のキーを埋め込んで、なんらかのアクションを取った際にそれを内部のDBに入れるのと同時に、GoogleAnalyticsにもデータを送信する。すると、そのアクションを行ったデータとGoogleAnalyticsのデータを組み合わせると、アクションが起こった過程や流入元などを見ることができます。このアクションというのはECサイトだと『注文完了』だったりします。**注文データと行動データがこれで結びつくわけです。**
# その他の使い方は？
私自身も手探りだったりします。
と、いうよりも分析出来るデータの量が多すぎて手が回らないというのが本音ですし、データを分析するのが僕の仕事ではないので。（笑）でも、興味があるから空いている時間を見つけてレポートを社内に出して、気に入ってもらえればツール化しているような状況です。
今やっているのはキャンペーンなどからどのぐらいコンバージョンされているかなどを見ています。GoogleAnalyticsだけでもできますが、ローカルのデータと組み合わせることで、もっと正確で詳細なデータ分析ができます。自分たちが考えていたターゲットとあっているのか？『あれ？想定していたものと違うぞ？』ということもしばしば。
あと、日本ってExcel文化じゃないですか。だからスプレッドシートで数値なんかを出してあげるとあとは勝手に現場が自分の好きなフォーマットで加工するんですよね。
[BigQueryとスプレッドシートの連携はこちらでどーぞ。](http://qiita.com/satoru_mag/items/114703d7d95b60b11c6f)
あと、自分はよくわかっていないのですが広告系も連動するようです。
# 最後に
本当に色んな使い方が出来るデータです。冒頭でも書きましたが、あまりおおっぴらにして良いのかどうかが微妙なので、このような書き方となってしまいました。ごめんなさい。この辺りは、GCP ja Nightでお話しします。
**また、GoogleAnalyticsPremiumを利用している方々はBigQueryを使わなければ、本当の真価は発揮されないと思います。**（※BigQueryに出したものをRedshiftにわざわざ持っていっているということも聞きますが、それは好みってことで。）
システム部門だけでもダメ、マーケティング部門だけでもダメ。両者が一体になって、データを色々いぢるととっても素敵になれますよ。
このようなデータがお気軽に取れるのと、大量データでも安価で超高速なBigQueryのおかげで、気が付いたら世の中で言うところのDMP（ハード売るための言葉みたいで嫌い！）というものになっているんじゃないでしょうか。っていうか身構えて『BigQueryでDMPだ！』なんて思わずに、どんなデータでもBigQueryに入れ込んで、連結させて分析していく。足りなければ後から足せば良いし、要らなければ使わないで良い。そんな気軽に使えるBigQueryが大好きということで、今日は終わり。
**って、結局またBigQuery愛かい！！！**
Azure にコントリビュートするには

これは [Azure Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/azure) 5日目の記事です。

# Azure も Github にリポジトリあります！

![Microsoft_Azure_github.png](https://qiita-image-store.s3.amazonaws.com/0/31790/e8bc2319-d4c9-910b-cb49-75f596033141.png)

.NET Framework がオープンソースになって、約一ヶ月が過ぎようとしています。実は Microsoft Azure はだいぶ前から https://github.com/Azure にて SDK 等がオープンソースで公開されています！

ということで皆さんバシバシ Pull Request を送りましょう。

## Pull Request を受け入れてもらうには、Contribution License Agreement (CLA) に署名をする必要があります
Pull Request をマージしてもらうために、一点だけ必ずしなければならないことがあります。それは Contribution License Agreement (CLA) への署名です。署名というと、紙をプリンタで出して、直筆で書いたものをスキャンして…とか面倒くさいと思うかもしれませんが、今回必要なものはGithubアカウントとメールアドレスぐらいで、紙やペンは必要ありません。簡単でしょ？

## Contribution License Agreement (CLA) への署名はたったの３ステップ
### ステップ１
署名するためには [Open Source Contribution Guidelines - Microsoft Azure Open Source](http://azure.github.io/guidelines.html) をまず熟読してください。読んだら、「Azure Contribution License Agreement (CLA)」をクリックしてください。

![Open_Source_Contribution_Guidelines_-_Microsoft_Azure_Open_Source.png](https://qiita-image-store.s3.amazonaws.com/0/31790/baa7ecf0-06e5-5554-dc20-d0ba16aa82d9.png)

### ステップ２
「Sigh in with Github」をクリックして Github アカウントでログインします。署名はこのときログインしたアカウントに紐付くので複数持っている人は間違わないように注意してください。

![Azure_Contribution_License_Agreement.png](https://qiita-image-store.s3.amazonaws.com/0/31790/78d38ada-cc7e-2cf1-7264-becc7af7156c.png)

### ステップ３
最後は必要事項に記入するだけです。Github アカウントは自動で記入されます。すべて英語で記入してください。訳は適当に私が記入したので、間違っているかもしれません。社畜が上司の許可を取るのはちょっと難しいかもしれませんね。個人事業主の場合は記入欄が消えますので簡単です。

![Azure_Contribution_License_Agreement.png](https://qiita-image-store.s3.amazonaws.com/0/31790/559e0165-1fcb-d76b-c164-deb56fd2b6c8.png)

## あとは Pull Request しまくるべし
CLAに署名が済んでいると、azurecla という bot が勝手にタグ付けしてくれて、あとは Microsoft 社員なり誰かがちゃんとレビューしてくれます。この bot はかなりクールですね。こんな感じで 署名が済んでなければ、署名してねって教えてくれるし、署名すれば署名済みにしてくれます。

![Added_loading_changed_events_funcionality_to_MobileServiceCollection_by_daemun_·_Pull_Request__395_·_Azure_azure-mobile-services.png](https://qiita-image-store.s3.amazonaws.com/0/31790/85f5f991-acb0-547d-e324-375aefa133d0.png)

実はこの辺はちょっと前までは、すべて手動で個別でメールのやりとりをしてました。CLA の署名自体も Word ファイルを添付してメールで送ったりでチョー面倒くさかったんですが、世の中便利になったもんです。
さすが生産性向上を謳う会社ですねぇ。

# Azure にコントリビュートすると何が嬉しいの？
さて、以上 CLA への署名方法を中心にご説明しましたが、実際当人には何かメリットあるわけ？と疑問に思う人もたくさんいると思います。

私が実際にコントリビュートして良かったなぁと思った例は[これ](https://github.com/Azure/azure-mobile-services/pull/288)です。

![Fixed_insert_empty_task_in_iOS-swift_app_by_nnasaki_·_Pull_Request__288_·_Azure_azure-mobile-services.png](https://qiita-image-store.s3.amazonaws.com/0/31790/cb6ca6d2-a579-527a-0cf7-b74ecf8d2b32.png)

たった一行のコード ` if (text == "") { return; } ` が、 swift らしくないって指摘してくれる人が自分の周りに何人いるでしょうか？

OSSへの貢献はOSSだけでなく、間違いなく自分の糧にもなります。英語が怖い？私の英語も見ての通り、大体1文が精々の中学生以下なもんです。一緒に英語も学んでいきましょう。
code for KORIYAMA　残り１時間で書きます。

皆さん、こんにちは！
code for KORIYAMAです。
日付が変わるまで、あと一時間を切りましたが、更新がなかったのでゲリラ的に投稿してみました！！

私たちは現在、今後のイベントについてスタッフミーティングの真っ最中！

![machi8.JPG](https://qiita-image-store.s3.amazonaws.com/0/61783/8a78349f-975c-a904-003e-691b88f4534d.jpeg)


アベントカレンダーの締め括りの25日は、我らが代表：大久保の誕生日…ということで、僭越ながらこのカレンダーの締め括りは、私たちにお任せいただければ幸いです＼(^o^)／

さて、私たちのこれまでの活動についてちょっとだけご紹介させて下さい。

●まちなかマップ作成
URL:http://koriyama.io/map/

10/18～19に郡山市で開催されたB-1グランプリを盛り上げようと、皆さんに手軽に使っていただけるマップアプリを作成しました！
今後も随時更新して成長させていく予定です。乞うご期待！！

![machi4.jpg](https://qiita-image-store.s3.amazonaws.com/0/61783/1e6f10a1-3e31-279f-e4a9-3bce09cf3d43.jpeg)

また、このマップアプリを作成するにあたり、マッピングするためのアプリも作成しました！地域のみなさんにも使って頂けるように、調整して近々公開する予定です！


●まち歩きイベント開催

マップを作成するために、市民の皆さんを募ってまち歩きイベントを開催しました！
スマホやiPhoneを持ってワイワイ行ったマッピングは、新しい発見を産みました。今後も継続して行っていく予定です。

![machi1.jpg](https://qiita-image-store.s3.amazonaws.com/0/61783/70ad86bc-09a7-7531-2476-e99638cf23de.jpeg)


立ち上がったばかりのコミュニティですが、元気に活動していきますので応援よろしくお願いしますp(^-^)q
それでは、12/25の更新をお楽しみに！！
AndroidStudioの、Layout中のIdの rename機能は使わないほうがいいのか?

AndroidStudioを使ってハマったので、愚痴がて書き残してみます。

# Layout中の idを renameすると、意図しないところまで変わることがある!

たとえば、`R.layout.fragment_hoge` の中に `R.id.error_text` があったとしましょう。
で、そのうちエラー以外の情報も表示するようになったので、 `R.id.message_text` に変えたくなったとします。そんなの AndroidStudioの refactor機能で簡単だもんね、参照してるコード上も自動的に変えてくれるし、とドヤ顔で renameしたりすると..

`R.layout.fragment_fuga` の中の `error_text` まで `message_text` に変わってる! そっちはエラーしか出さないからそのままでいいのに!!

ということになったりします。

# ある意味しょうがない
憤慨はしてみたものの、そういう動作になってしまうのもしょうがない一面はあると思います。

なにしろ、Javaソース上で `R.id.error_text` という定数があった場合、これが `fragment_hoge` の Viewをさしてるか `fragment_fuga` の Viewを指してるか一般的に見分ける方法はありません。このコードでは renameに追従するけど、このコードでは `fragment_fuga` の Viewを指してるからほっとこう、ということは自動的にはできません。いや、もしかするとそもそも両方の fragmentで同じ idの Viewがあることに依存したコードなのかもしれません。

それを考えるとツールにできる最善のことは、同じ idをつかってる Viewはすべて変更してしまいコードの整合性を保つことかもしれません。やれやれ。

# とはいうもののそんな refactoring 役に立つのか?

個人的な感想としては、そんな動作は期待してないことがおおいのではないでしょうか。

そもそも意味的に関連しない部分に同じ idをつけるなよ、というのが正しいのかもしれません。でもそれだったら最初から衝突しないように名前空間を分けられるシステムがあるべきじゃないのかなあ、という気がします。naming conventionとかで衝突しないようにするとかやめてほしいっす。

そういうことで、Androidのリソースの名前空間の愚痴になってしまいました。はい。

あと、ちょっと思いついたのは AARの中の resource idと自分のコードの idが衝突してて、かつ AARの中の resource idを参照してたりする場合どうなるんだろ? さすがに AARの中の jarが参照している idは書き変えられないだろうから、整合性のある renameできない気がしてきた。まあ、AARのなかの idをクライアントから参照することはあんまりなさそうですが。

# ということで、使わないほうがいいのかな、という気がします。

せめて衝突してた時は警告してくれるような実装になってないとこわいんじゃないですかね。
まあ、普通に Commitするまえに diffみてれば変なところを変わってるなあ、ってわかるようになるはずだけど、そんなところで手戻りするの面倒です。
Groongaの既存のデータベースの中を見る3つの方法

## はじめに

Groongaによる全文検索システムの機能を本当にざっくり分けると以下の2つになると思います。

* データベースを作成・更新する
* データベースから検索して表示する

普通は両方とも同じプロジェクトで行いますが、ちょっとそこにあったどのプロジェクトで使われているかわからないがどうやらGroongaっぽいデータベースの中身を見たいという場面もあるかもしれません。

そんなときのために、既存のデータベースを見る方法をまとめてみました。私が普段使っている方法は大きく分けて3つあります。

* Groonga本体のコマンドを使う
* 各言語バインディングでスクリプトを書く
* データベース管理ツールを使う

順番に例を見ていきますが、以下で挙げる方法はどれもデータベースファイルに対して書き込み権限が必要です。言い換えると、参照だけでなく更新もできてしまうということです。くれぐれもご注意ください。

## Groonga本体のコマンドを使う

Groonga本体がインストールされていていれば、以下のように既存のデータベースを開いて対話モードに入ることができます。もしGroongaコマンドで作られたデータベースでなく、例えばRroongaなどで作られたデータベースでも問題ありません。

    % groonga /path/to/db

対話モードに入ったら、以下のようにしてレコードを検索することができます。

    > table_list
    > column_list テーブル名
    > select テーブル名 --match_columns カラム名 --query 検索ワード

詳細は以下の文書をご覧ください。

* [4. チュートリアル - Groonga v4.0.8ドキュメント](http://groonga.org/ja/docs/tutorial.html)
* [7.3. コマンド - Groonga v4.0.8ドキュメント](http://groonga.org/ja/docs/reference/command.html)

## 各言語バインディングでスクリプトを書く

Groonga本体のコマンドを使わなくても、Groongaにはたくさんの言語バインディングがあります。それらを使ってデータベースの中を見るスクリプトを書くという方法です。

データベースを作成するのは難しそうですが、参照するだけなら簡単そうな気がしませんか？言語バインディングを使い始めるときは、まず既存のデータベースを検索するためのスクリプトを書くところから始めるのがおすすめです。

例えば、Rroongaを使えば以下のようにして検索スクリプトを書くことができます。

```ruby
require "groonga"

Groonga::Database.open("/path/to/db") do |database|
  p database.tables
  users = Groonga["Users"]  # Usersテーブルがあった場合
  p users.columns
  selected_users = users.select do |record|
    record.name =~ "検索ワード"  # nameカラムがあった場合
  end
  p selected_users.collect {|record| record._key}
end
```

## データベース管理ツールを使う

Groongaのデータベースを管理するための専用ツールを使う方法です。例えば、Rroongaには`groonga-database-inspect`というデータベースのサイズなどの情報を見られるコマンドが付属しています。去年のGroonga Advent Calendar 2013でも取り上げられていました。

* [groonga-databse-inspectを使ってMilkodeのデータ使用量を分析する - ブログのおんがえし](http://ongaeshi.hatenablog.com/entry/groonga-data-inspect)

また、これもRroongaに付属しているコマンドですが、`grndump`というデータベースをダンプするためのツールがあります。詳細は以下の記事をご覧ください。

* [groongaのデータベースをダンプ・リストアする方法 - Qiita](http://qiita.com/groonga/items/7642e9e22bcda4b4327f)
* [rroonga - Groongaのdumpとgrndumpのメモリ消費の違い - Qiita](http://qiita.com/orangain/items/6abb3e3b4e0353419fde)

あと、私が開発中の`groonga-database-viewer-gtk`というツールもあります。Rubyをお使いであれば、RubyGems.orgから以下のようにインストールできます。

    % gem install groonga-database-viewer-gtk

これは、Ruby/GTK2というGUIライブラリーを使って、Groongaのデータベースを閲覧することができるアプリケーションです。以下のように、コマンドの引数にデータベースのパスを指定するだけで起動できます。

    % groonga-database-viewer-gtk /path/to/db

こんな感じで表示されて、カラムを指定しての検索ができます。

![Screenshot from 2014-12-04 23:04:39.png](https://qiita-image-store.s3.amazonaws.com/0/17743/07f8033e-b641-8ee8-6506-af520cea3050.png)

インデックスカラムについては、現在は対象レコード数とIDリストを表示していますが、どうするのがいいかは検討中です。

![Screenshot from 2014-12-04 23:04:59.png](https://qiita-image-store.s3.amazonaws.com/0/17743/10e6250c-cd71-347f-163e-c00eaf40da37.png)

ソースコードはGitHubで公開しています。

[myokoym/groonga-database-viewer-gtk ・ GitHub](https://github.com/myokoym/groonga-database-viewer-gtk)

## おわりに

Groongaのデータベースの中を見る方法を3つ紹介しました。独自のバイナリ形式のファイルですが、意外といろいろな方法があることがわかってもらえたかと思います。みなさんも、お好きな言語で練習がてらGroongaデータベース管理ツールを作ってみてはどうでしょうか？
開発環境の導入（GBDK / Mac）

#導入環境
MacOSX 10.10.1

#手順
**1.Terminal.app起動**

**2.git clone**
GBDKは公式のでなく、Mac用パッチ付きの[こちら](https://github.com/co-me/gbdk)を使用。

```
$ git clone https://github.com/co-me/gbdk
```

**3.同梱のパッチを当てる**

```
$ cd gbdk
$ patch -p0 < macosx.patch
```

**4.Issueを見ながら修正**
[Issues · co-me/gbdk](https://github.com/co-me/gbdk/issues)

[\#1](https://github.com/co-me/gbdk/issues/1) : gbdk/sdccにbinディレクトリがないので作成

[\#2](https://github.com/co-me/gbdk/issues/2) : gbdk/maccerにMakefileがないので[ここ](https://github.com/gheja/gbdk/blob/master/maccer/Makefile)から拝借

[\#3](https://github.com/co-me/gbdk/issues/3) : gbdk/sdcc/src/SDCCy.cの2496行目のdefault:が空なのでbreak;を追加

[\#4](https://github.com/co-me/gbdk/issues/4) : gbdk/gbdk-lib/examples/gb/Makefileの1行目を変更

[\#5](https://github.com/co-me/gbdk/issues/5) : 後で

**5.make**

```
$ make
```

warningがモリモリ出ますが目を瞑ります。

**6.Issue\#5**
無事buildが終わったら、[最後のIssue](https://github.com/co-me/gbdk/issues/5)です。
今回はコピーでなく、シンボリックリンク作成で対処します。

```
sudo ln -s ~/gbdk/build/ppc-unknown-linux2.2/gbdk /opt
```

**7.exampleをbuild**

```
$ cd /opt/gbdk/examples/gb/Makefile
$ make
```

同階層に.gbファイルが生成されればok。

**8.エミュレーターでexample起動**
[VisualBoyAdvance | SourceForge.net](http://sourceforge.net/projects/vba/)

ダウンロードしたら.appを起動、galaxy.gbを選択。

**9.動いた！…が…**
下の隅が欠けてる…

![スクリーンショット 2014-11-26 19.05.49.png](https://qiita-image-store.s3.amazonaws.com/0/13118/5ae8b868-52f5-d985-361c-005a8de6fdb5.png)

謎が残るがひとまずお疲れさまでした。
開発環境の導入（GBDK / Windows）

#導入環境
Windows7 32bit

#手順
**1. 公式からダウンロード**
[Gameboy Development Kit - Browse Files at SourceForge.net](http://sourceforge.net/projects/gbdk/files/)

Looking for the latest version? Download gbdk-2.94-win32.exe をクリックしてダウンロード。


**2. 解凍**
ダウンロードした.exeを実行すると、解凍場所を聞かれるので、デフォルトのC:\gbdkへ解凍します。


**3. exampleのビルド**
C:\gbdk\examples\gb\make（.batファイル）を実行します。
黒い画面が立ち上がり、.gbファイルがもりっと生成されます。


**4. エミュレーターの導入**
とりあえずVisualboyAdvanceにします。
[VisualBoyAdvance Project Top Page - SourceForge](http://sourceforge.jp/projects/sfnet_vba/)

ダウンロード後、任意の場所に解凍。

**5. exampleの起動**
エミュレーターを起動、galaxy.gbを開くと…

**6. 動いた！**
![win.png](https://qiita-image-store.s3.amazonaws.com/0/13118/0b4f974e-bdf8-4ec1-eaa1-eab85fd96b74.png)

お疲れ様でした。
Swift CALayerのサブクラスでアニメーション

#概要

アニメーションで動く円グラフを作成したくて、
Objective-CのライブラリなどソースレビューしていましたがCALayerのサブクラスでは
自分が持つプロパティを変更されたタイミングでactionForKeyメソッドが呼ばれる。
今回はカスタムクラスとして、円グラフの開始角度/終了角度(それぞれstartAngle/endAngle)プロパティを持たせており、これらを親ビューなどから変更するとアニメーションされるらしい



```swift
//CALayerのサブクラス内
dynamic var startAngle: CGFloat = 0
dynamic var endAngle: CGFloat = 0

func makeAnimationForKey(key: String) -> CABasicAnimation{
        var anim: CABasicAnimation = CABasicAnimation()
        anim.keyPath = key
        anim.fromValue = presentationLayer().valueForKey(key)
        anim.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
        anim.duration = 0.5
        
        return anim
    }

override func actionForKey(event: String!) -> CAAction! {
     if event == "startAngle" || event == "endAngle"{   
        return makeAnimationForKey(event)
    }
    return super.actionForKey(event)
}
```

#プロパティの変更が認識されない

actionForKeyにstartAngle/endAngleのイベント文字が渡ってくるはずが
上記のようにSwiftに書き直してみると渡って来ない
おそらくKeyValueObserving的な問題のような気がするけど、そうなると
Swiftでは無理なのでしょうか
どなたかご存知の方はいらっしゃいませんか？？
BigQuery でログを月別テーブルに分けているとき「今月」や「直近XX日」のレコードを含むテーブルを指定する

BigQuery で月別にテーブルを分けていた時に、クエリを動的に生成せず「今月」や「直近10日分」を対象とした検索したかったので。

[Table wildcard function](https://cloud.google.com/bigquery/query-reference#tablewildcardfunctions) を利用すると、クエリの FROM の対象テーブルを柔軟に設定出来そうです。Table wildcard function は以下の 3 つの関数があるのですが、

 * TABLE_DATE_RANGE
 * TABLE_DATE_RANGE_STRICT
 * TABLE_QUERY

`TABLE_DATE_RANGE` と `TABLE_DATE_RANGE_STRICT` はテーブル名に YYYYMMDD 形式で日付を含む日別テーブルしか扱えないようなので、今回は `TABLE_QUERY` を利用します。

テーブル名が以下のルールだった場合、

 * apache.access201401
 * apache.access201402
 * apache.access201403
 * apache.access201404
 * ...

「今月」のテーブルを指定するには、FROM 句に次のように記述します。`TABLE_QUERY` の２番目の引数に条件式を指定するのですが、そこでは `table_id` がテーブル名を示します。

```sql:
SELECT .....
FROM TABLE_QUERY(apache, "table_id=STRFTIME_UTC_USEC(now(), 'access%Y%m')")
WHERE .....
```

「直近10日」のデータを含むテーブルは、現在時刻によって今月のテーブルだけにおさまるケースと先月のテーブルにまたがるケースがあるので、少し複雑になります。`now()` はマイクロ秒単位の時刻を返すので、10日前を指定するためにそこから 10 * 86400000000（1日のマイクロ秒数）を引いています。

```sql:
SELECT .....
FROM TABLE_QUERY(apache, "table_id=STRFTIME_UTC_USEC(now(), 'access%Y%m') or table_id=STRFTIME_UTC_USEC(now()-10*86400000000, 'access%Y%m') ")
WHERE .....
```

こうすることで、10日前が今月であれば今月のテーブルのみが対象となり、10日前が先月であれば先月と今月のテーブルが FROM の対象となります（実際には WHERE 句で直近10日分を指定する条件も必要ですが、ここでは FROM 句の指定のみに着目しています）。BigQuery はスキャンするデータ量に応じて料金がかかるので、必要なテーブルのみをスキャンすることでコストを節約することができます。
ニコニコ静画のマンガをダウンロードしてpdfにするやつ

    curl -c cookie.txt -d "mail_tel=メールアドレス" -d "password=パスワード" "https://secure.nicovideo.jp/secure/login?site=niconico"
    curl -b cookie.txt "http://seiga.nicovideo.jp/api/theme/data?theme%5Fid=87011" | grep source_url | grep -o 'http[^<]\+' | xargs wget
    convert [!cookie.txt]* seiga.pdf
    open seiga.pdf
[WIP]gitで空のbranchをpushするまでを自動化

更新が多くなった＋新しいコマンドを追加したので別記事にまとめ直しました。
http://qiita.com/KeitaMoromizato/items/23474a40d1a19994dc81

---

最近WIP PR(Work In Progress Pull Request)による開発を始めたけどプルリクエストを作るまでが面倒なので自動化してみた。

まずはaliasを作るためにconfigに追加

``` test:.git/config
[alias "create"]
	pr = "!f(){ .git/Github/create_pullrequest $1;};f"
```

上記aliasを叩いた時に実行されるコマンドを定義

``` test:.git/Github/create_pullrequest
git checkout -b $1
git commit --allow-empty -m "create PullRequest"
git push origin $1
git branch -u origin/$1 $1
```

コマンドに実行権限を付与

```text
$ chmod a+x .git/Github/create_pullrequest
```

これで以下のコマンドを叩けば、カレントブランチから新しいブランチを作ってpushまでは自動でできる。

``` text
$ git create.pr feature/test
```

create.prとか言いつつPullRequestを作成するところまでは自動化していないのでそれはまた次の機会に。

===
追記

hubコマンドを使ってPullRequestまで自動化できます。
hubコマンドを使えない方はhomebrewでインストール(Windowsの方ごめんなさい)

```
$ brew install hub
```

上で作ったファイルに１行目、６行目を追記。

``` test:.git/Github/create_pullrequest
current=`git rev-parse --abbrev-ref HEAD`
git checkout -b $1
git commit --allow-empty -m "create PullRequest"
git push origin $1
git branch -u origin/$1 $1
hub pull-request -m "$1" -b $current
```

これでPullRequestの作成まで自動化出来ます。

===
追記2

チーム開発をするときは上記スクリプトを生成するスクリプトを書きましょう。以下のスクリプトをレポジトリのどこかに置いて、cloneしたときにgitのルートディレクトリ(.gitがある場所)でスクリプトを実行します。

``` setup.sh
#!/bin/sh

echo "setup PullRequest..."

mkdir .git/Github
#create PullRequest script
cat << "EOF" > .git/Github/create_pullrequest
#!/bin/sh

current=`git rev-parse --abbrev-ref HEAD`
git checkout -b $1
git commit --allow-empty -m "create PullRequest"
git push origin $1
git branch -u origin/$1 $1
hub pull-request -m "$1" -b $current
EOF

chmod +x .git/Github/create_pullrequest

#setup gitconfig
cat << "EOF" >> .git/config
[alias "create"]
  pr = "!f(){ .git/Github/create_pullrequest $1;};f"
EOF
```
[Swift]DatePickerに日付の範囲を設定する

#datepickerを生成
```swift
@IBOutlet weak var datePicker: UIDatePicker!
```
datepickerをoutlet接続します。

#範囲を指定する
```swift
let minDateString = "2014-12-01"

var dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "YYYY-MM-DD"

var minDate = dateFormatter.dateFromString(minDateString)

datePicker.minimumDate = minDate
datePicker.maximumDate = NSDate()
```
「2014年12月1日」から「今日」までを範囲指定する場合は上のコードのようになります。
codebreak;のリポジトリにSSHでアクセスする方法


## codebreak;
> コードブレイクは、IT・Webエンジニアのコラボレーションを支援する、Gitホスティングサービスです。
> <cite>[Free Git Hosting | codebreak;](http://codebreak.com/)</cite>

[コードブレイクの特徴](https://codebreak.com/ja/contents/features/)として、無料で無制限にGitリポジトリを持てて、しかもプライベートリポジトリも無制限に作れるので重宝している。

自分のリポジトリに対するPush等にはGithubと同様に、SSH鍵によるアクセスが可能だが設定が必要だったので備忘代わりに載せておく。

設定は以下の2ステップ。

## codebreak;にSSH公開鍵を登録

[SSH公開鍵](https://codebreak.com/settings/ssh/)のページへアクセスし、自身の公開鍵を適当な名前で登録する。

Githubに登録しているものがあれば、<var>https://github.com/自分のUSERNAME.keys</var>へアクセスすれば確認できるのでコピペでOK。

## クライアント側の設定(.ssh/config)

~~~~
Host git.codebreak.com
 User USERNAME # codebreak;のユーザ名
 port 22
 Hostname git.codebreak.com
 IdentityFile ~/.ssh/id_dsa.github.com
 TCPKeepAlive yes
 IdentitiesOnly yes
~~~~

<var>IdentityFile</var>には、codebreak;に登録した公開鍵のペアとなる秘密鍵のパスを指定する。
また、Githubではユーザ名に<var>git</var>を指定するが、codebreak;では各自のユーザ名を指定する。


## 環境情報

~~~~
% inxi -SM
System:    Host: hakone.vps.sakura.ne.jp Kernel: 2.6.32-431.1.2.0.1.el6.x86_64 x86_64 (64 bit)
           Console: tty 2 Distro: CentOS release 6.6 (Final)
Machine:   System: Red Hat product: KVM v: RHEL 6.4.0 PC
           Mobo: N/A model: N/A Bios: Sea v: 0.5.1 date: 01/01/2007
~~~~

~~~~
% git --version
git version 1.7.1
~~~~
隣のプログラマーに見せたくなるWebStormの小技集

こんにちは、らこです。今日の記事では隣のプログラマに見せたくなるTipsをいくつか紹介します。使い慣れてる人はすでに知ってるかもしれません。
 
# Search Everywhere
基本中の基本ですね。ファイルでもクラスでも変数でも機能でもなんでも検索できる機能です。開くにはウィンドウ右上のルーペボタンを押すか、初期設定では「Shift->Shift」です。
![search.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/59c4ddc2-3e80-8d5e-69db-a7eb71c1ca6c.gif)

残念ながら設定の項目までは検索できないので、一旦Settingsを開いてから設定ウィンドウの中で検索します。
![search2.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/d977dbb2-c86a-e340-da17-f28e1a8fbd82.gif)

[追記]Search Everywhereの設定を変えればSettingsの中も検索できました。
Search Everywhereを開いて、右上の歯車ボタンを押すと設定画面が出ます。
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/5365dccf-de01-7b0d-a9b2-aa730f7af430.png)

一番下の Show IDE settingsを有効にすると直接Settingsの中も検索できます。

# 変数宣言を生成する
これも基本ですね。カーソルの位置にあるオブジェクトを変数にします。
![var.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/8aa21041-ce97-04c0-d68a-df56d13a5f92.gif)
デフォルトでは[Ctrl+Alt+V]です
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/2d3fb246-ae47-20e9-296b-cf3642ea3403.png)

# 行を上下に移動する
カーソルのある行（というよりは式）を上下に移動できます。デフォルトでは[Ctrl+Shift+上下キー]です
![move_state.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/29050d2b-77d3-6e9c-dd93-b17f0d85f7c4.gif)

# カラム選択
カーソルを行から列に変えられます。デフォルトでは[Alt+Shift+Insert]で切り替えです。
![column.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/51b5c886-fe34-3328-56c6-cc3eca956249.gif)

# クリップボードから貼り付ける
普通の貼付けは[Ctrl+V]ですが、[Ctrl+Shift+V]で履歴から貼り付けるの選べます。
![paste.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/6a75d032-a211-8bce-1bb8-f8ab2c84739b.gif)

# プレゼンモードを使う
WebStormにはライブコーディング用のプレゼンモードがあります。
デフォルトではキーが振られていませんので、好きなキーを当てるのをおすすめします。
![image](https://qiita-image-store.s3.amazonaws.com/0/20253/28658391-69df-a783-6f40-e736aaba0cf8.png)

プレゼンモードにするとエディタ部分だけになってフォントサイズも上がります。プロジェクターで映してもちゃんと見えます。勉強会なんかで使うと「おっ！」ってなること間違いないです。
![present.gif](https://qiita-image-store.s3.amazonaws.com/0/20253/f6128105-6d5b-df16-9529-3c9b9c13f357.gif)

----
以上、小技集でした。これは基本的なものばかりなので、物足りなかったら明日以降もアドベントカレンダーを読み続けるのをおすすめします
もっと非Prolog的Prologプログラミング

もっと非Prolog的Prologプログラミング
=====

2014/12/05 @suharahiromichi
この文章のソースコードは以下にあります。
https://github.com/suharahiromichi/prolog/blob/master/cps_fib_quiita.swi

2日目のmandel59氏による「非Prolog的Prologプログラミング」では、フィボナッチ数列を例にPureな関数型言語をPrologに変換する説明がありました。
フィボナッチ数列の計算といえば、忘れてはいけないのは、継続渡しスタイル（CPS）での計算ですね。
「継続」を引数に渡すことで、いろいろとよいことがあるのだそうです。
Prologでこれをやってみよう、というのが今日の話題です。


# 2日めのプログラム

2日目のプログラムを再掲させていただきます。



```prolog:

f(0, 0).
f(1, 1).
f(N, Y) :-
        N > 1,
        !,
        N1 is N - 1,
        f(N1, Y1),
        N2 is N - 2,
        f(N2, Y2),
        Y is Y1 + Y2.


```

# CPSの例
CPSでのフィボナッチ数列のプログラムをSchemeで書いた例を示します。これは、
http://d.hatena.ne.jp/nozom/20061014/1160814110
を参考にさせていただきました。


```scm
(define (fib_cps n k)
  (if (or (= n 1) (= n 2))
      (k 1)
      (fib_cps (- n 1)
               (lambda (v1)
                 (fib_cps (- n 2)
                          (lambda (v2)
                            (k (+ v1 v2))))))))
```

2番めの引数 ```k``` が継続です。```(k 1)``` や ```(k  (+ v1 v2))``` が継続が実際に実行される箇所です。```k```には、
```(lambda ...)``` が継続として渡されます。

```(lambda ...)``` の本体の中に ```fib_cps``` の呼び出しがあり、さらに継続があるので、ちょっと複雑なことになっています。


# Prologでは
さて、このSchemeのプログラムを2日目と同様に、Prologに書き直してみましょう。

```fib_cps(N, K, R)``` の節の最後に再帰呼び出しがあり、この部分が末尾再帰になっています。
ここでも、2番めの引数 ```K``` が継続です。継続の実行には高階述語の```call```を使用します。また、Prologには「lambda」がないので、q1とq2という述語を定義しなければいけませんでした。ちょっと残念ですね。
その継続として渡される2引数の```q1(K, N)``` や ```q2(K, V)```はどこで定義されているのだろう？と思ったひとはマニュアルで高階述語の ```call``` を調べてみましょう。きっとPrologが一層好きになるに違いありません。



```prolog:

fib_cps(1, K, R) :- !,
        call(K, 1, R).
fib_cps(2, K, R) :- !,
        call(K, 1, R).
fib_cps(N, K, R) :-
        N1 is N - 1,
        fib_cps(N1, q1(K, N), R).

q1(K, N, V, R) :-
        N2 is N - 2,
        fib_cps(N2, q2(K, V), R).
q2(K, N, V, R) :-
        V1 is N + V,
        call(K, V1, R).

fib_cps(N, R) :-
        fib_cps(N, id, R).
id(A, A).

go :-
        f(10, R1),
        fib_cps(10, R2),
        write(R1), nl,
        write(R2), nl.


```
では、実行してみましょう。

```
% swipl -f cps_fib_quiita.swi
?- go.
55
55
true .
```  


# まとめ

1. Prologでは、継続渡しスタイルのプログラムも書ける。


```
D3.js

# D3.js
[D3](http://d3js.org/), which stands for **D**ata **D**riven **D**ocuments, is a JavaScript library which allows to bind HTML elements to some data. It is therefore well-suited to create charts, and more generally speaking data visualisation related content.

## Selection
D3 selects DOM elements using CSS3 syntax. For instance, this select a paragraph with the `bodyId` id and the `paragraphClass` class:

```js
var selection = d3.select("p #bodyId .paragraphClass");
```
Then, D3 can perform various actions on this selection, for instance this is how to add a div into the DOM element:

```js
selection.append("div");
```

## Binding data
This is the core functionality of the library. Let's say we have this array of data

```js
var arrayOfData = [2, 4, 9, 10];
```
and we want to use it to create circles which size depends on the number.
First, we need to create an SVG element in which the circles will be drawn.

```js
var svg = d3.select("body").append("svg")
    .attr("width", 800)
    .attr("height", 400);
```
Then, we can select the circles even though they haven't been created yet, and bind the data to them.

```js
var svg = d3.select("body").append("svg")
    .attr("width", 800)
    .attr("height", 400);
```

The `enter` function is used to create placeholders nodes to the data that hasn't been bound yet. This piece of code

```js
circles.enter()
    .append("circle")
```
creates a circle for each element of the array, as no circle exists yet.
The next step is to actually use the data. This can be done anytime by replacing a constant by such an anonymous function

```js
function(d, i) {
    ...
}
```
where d represents the associated data element, and i the index. We can use d to calculate the size, and i for the offset:

```js
circles.enter()
    .append("circle")
    .attr({
        "cx": function(d, i) {
            return 10 + 100 * i;
        },
        "cy": 50,
        "r" : function(d, i) {
            return 2 * d;
        }
    });
```
[Here](http://jsfiddle.net/Maerig/a5egoz7j/8/) is the final result.

## Transition
D3 has a nice support for transitions. Basically one just needs to call the `transition` function. Below is atransition function for the previous example.

```js
function updateCircles() {
    var newArrayOfData = [];
    
    for(var i = 0 ; i < 4 ; ++i) {
        newArrayOfData[i] = 10 * Math.random();
    }
    circles
        .data(newArrayOfData)
        .transition()
    .attr("r", function(d) {
        return 2 * d;
    });
}
```
See full example [here](http://jsfiddle.net/Maerig/a5egoz7j/12/).
Kontrolleurとタブレットを使ってみる

##Kontrolleurとタブレットを使ってみる##

　この投稿は[VVVV Advent Calendar 2014](http://qiita.com/advent-calendar/2014/vvvv) ７日目の記事です。

　vvvvは最近知ったばかりで、プログラムの素養もない私ですが、とにかく面白いです。
　まだまだ人に教えるようなものでもないのかもしれませんが、盛り上がればよいなーと思い、参加してみました。

　Kontrolleurノードでタブレットから色々操作出来て面白かったので
　自分の力で説明できる範囲で説明しようと思います。

　私の場合、手元にNexus7がたまたまあったので、それで色々出来ないかなーって思ってやってみたら
　意外に色々出来るのでびっくりしました。なお、別にそれ以外のスマホとかでもできると思います。
　
　まず、googleplayストアから手持ちの端末にKontrolleurをインストールします。
　私の場合はnexus7を使っていますが最近のものであれば他の端末でも大丈夫だと思います。
![K_A.jpg](https://qiita-image-store.s3.amazonaws.com/0/22227/3684f041-0d3f-5db0-904d-900a80e52a94.jpeg)

　インストールして立ち上げると色々と入力項目があります。

![K_A002.jpg](https://qiita-image-store.s3.amazonaws.com/0/22227/fcd1600e-aed4-2afc-f2ac-2fc1615909a4.jpeg)

　Target IP Address:リモートするvvvvが動いているPCのIPアドレスを設定します。（設定しておきましょう）
　target UDP Port:UDPポートの指定…まんまですがとりあえず初期で44444となってますのでそのままでＯＫ

　Sticky Slider,Show Modifier,Show Labels,Show Valuesの項目については
　使用するものにチェックを入れてください。全部入れても多分問題ないです。
　Sendの項目は使用する端末の使用可能なものにチェックを入れておけば問題ないです。

　Touches　　　　  : 画面タッチのセンサ
　Magnetic Field  : 磁気センサ
　Acceleration　　: 加速度センサ
　Orientation　　 : 方位センサ

　これらを設定し、Saveすると接続されます…が、vvvvの方を何も設定していないので
　なにも画面に出ません。ここからはvvvvに移ります…といってもあとは　
　Kontrolleurノードを置いて数値を引っ張ってくるだけです。
　listening UDP Portも初期設定で44444になってますので、つながってくれるはずです。

　参考までにタッチパネルの動きにあわせてQuadが動くようなものを
　作ってみました。

![K_A004.jpg](https://qiita-image-store.s3.amazonaws.com/0/22227/4ad4ba01-0c3d-0a10-613c-b896271a70ed.jpeg)

　このパッチはTouch XY以外使用していませんが、他にもセンサが対応していれば数値を使用することが出来ます。
　方位センサ向いてる方向で色が変化する、とかカメラが動くとか、使い方は色々あると思います。

　また、タッチセンサのみ、手を離すと信号が途切れますので、Stack使わないとチラついちゃいます。
　…というかもっと良い方法があるかもしれませんので、自信ないです。
　手当たり次第にやってみて動いたからＯＫという残念な方向の解決法ですから。

　これを利用して、３Ｄシーンを作って動きまわる…みたいな事とかもできちゃいますよね、というかそのために
　作ってましたが、Touch XYを使って視点方向に動きたいけどＸＹ座標でしか移動できなくて難航中です。
![K_A005.jpg](https://qiita-image-store.s3.amazonaws.com/0/22227/daa46ffb-ab1b-dea0-abe4-fb797294bda0.jpeg)
　↑テストケース：3dsmaxからVrayでGIレンダリングしたものをマップとして焼き付けたCGモデルを
　vvvvに持ってきたもの

　
　あと、大事なこと忘れてました。
　接続されているときにvvvv側のボタンや数値等のIOBoxを選択してCtrl+Kを押すと、ふちが緑色になり、
　タッチパネル側の画面にもボタンやスライダ等が登場し、操作できるようになります。
![K_A007.jpg](https://qiita-image-store.s3.amazonaws.com/0/22227/bed363fe-2cdb-98a3-3024-f3e3f19c29b2.jpeg)


　（ネットワークの状況とかで認識しないこともあるので、やり直したりするのを推奨します）
　ダイレクトにスイッチだけとか、数値だけを操作することもできるなんて便利ですよね。
![K_A006.jpg](https://qiita-image-store.s3.amazonaws.com/0/22227/1d2ec949-6cbd-6cd4-4ee4-58ce54c0a8fe.jpeg)

イベントとかで使えるかな？
milkcocoaでリアルタイム対戦できるFPSを作った話

リアルタイム対戦のできるFPSですよ。

http://milk-cocoa.github.io/ramiel-shooting/

![スクリーンショット 2014-09-26 1.25.04.png](https://qiita-image-store.s3.amazonaws.com/0/54243/d8ef80c0-71f4-8eec-ec37-0459a573c4cd.png)

[Milkcocoa](https://mlkcca.com)はリアルタイム通信可能なバックエンドを提供してくれるサービスです。今回はMilkcocoaでオンライン対戦のできるシューティングゲームを作った話を書きます。

## なりゆき

これがわずか**3時間20分**でできました。

ずいぶん前の話ですが、9月24日に[jThree](http://jthree.jp/)の開発者に初めてお会いし、一緒に夕飯を食べ、3Dコンテンツの未来についてアツく話し合いました。１２時付近に帰宅、[jThree](http://jthree.jp/)と[milkcocoa](https://mlkcca.com)を組み合わせた、いい感じのゲームを作ろうと思い立ち、日をまたいで３時２０分に完成しました。次の日になってから、いつもお世話になっているデザイナーさんが、デザインを調整してくれました。こんな簡単に3Dゲームが作れる、jThreeに感動です！

jThreeとmilkcocoaのすばらしさを少しだけご紹介します。

## やったこと


jThreeは光源やカメラの位置をタグで記述することができます。

```html

<goml>
<head>いろいろ</head>
<body>
<scene>
  <obj style="rotateY: 1.57; position: 15 -35 -72;">
    <mesh geo="#sky" mtl="#sky-mtl" />
    <mesh geo="[type='Circle']" mtl="#ground-mtl" style="positionY: -.5; rotateX: -1.57;" />
  </obj>
  <light type="Amb" style="light-color: #f0f0f0;" />
  <light type="Dir" style="light-color: #5a5a5a; position: 1 1 1;" />
  <light type="Dir" style="light-color: #5a5a5a; position: -1 1 1;" />
  <camera style="position: 0 15 40; lookAtY: 15;"/>
</scene>
<body>
</goml>
```

そしてjQueryのように、簡単に3Dモデルを操れます。

```js

j3("scene").append('<obj id="objid" style="rotateY: 1.57; position: 15 0 0;"><mesh geo="#geoid" mtl="#mtlid" /></obj>');

j3("#objid").css("position", [ 0, 0, 0 ]);

```

milkcocoaのsend関数で、プレイヤーの位置や弾の発射を同期しています。以下は弾の発射を同期しているイメージです。弾を撃つshoot関数では、send関数を利用してデータの送信を行っています。自分も含めた複数のクライアントが、それを受け取り描画を開始します。send関数でのデータの送信から他のクライアントが受け取るまでの間隔は、平均して20ms〜30msでした。

```js

var ds_bullet = milkcocoa.dataStore("bullet");

ds_bullet.on("send", function(e) {
  draw_shooting(e.value.bullet_id, e.value.pos, e.value.vec);
});

function draw_shooting(id, pos, direction) {
  //弾を描画する処理
}

function shoot() {
  ds_bullet.send({
    bullet_id : "unique id",//id
    pos : {}//位置
    vec : {}//方向
  });
}
```

Playerの移動はちょっと難しかったです。send関数でPlayerが移動する度に位置を同期すると、１秒間に何十リクエストという通信をしてしまい、結果的に遅延が発生してしまいます。そこで１秒ごとに位置の同期を行い、前の動きから次の動きを予想するようにしています。


ソースコードはこちらです。

https://github.com/milk-cocoa/ramiel-shooting

ぜひ触ってみてください！

## まとめ

こんな簡単にオンラインゲームが作れる点は、感動ものです。

＊追記

こんなのも作りました。
マルチプレイゲームライブラリ：https://github.com/milk-cocoa/multiplay-game-with-milkcocoa
Rails&DeviseをAPI経由でサインアウト処理するコード例

Rails&Deviseをベースとしたシステムを持ち、アプリを開発する場合、JSONを使って、APIで様々な処理を実装していくこととなります。

ログインについては簡単ですが、ログアウト処理の情報が少なく困りましたので、参考コードをここに載せておきます。ログアウト処理もきちんと実装しておかないと、Sessionが残ったままで、別のメールアドレス&パスワードの組み合わせを投げても、以前のユーザー情報が返ってきますので、注意が必要です。

#/controllers/api/sessions_controller.rbの作成

DeviseのSessionsControllerを継承します。iOS側から、user_idをパラメータとしてうけて、sign_out処理を実装しています。セキュリティなど必要な処理は、別途加えてください。

```
class Api::SessionsController < Devise::SessionsController
	respond_to :json

	def destroy
		user = User.find(params[:user_id)
		if sign_out(user)
			render :json => {success: true}
		else
			render :json => {success: false}
		end
	end
end
```

#route.rbの設定

```
namespace :api do 
    devise_for :users
end
```

これで、deviseがapiディレクトリの中で動くようになります。

#iOS側からAPI通信

**http://www.hogehoge.com/api/users/sign_out**

にiOS側に保存してあるUser Idをパラメータにして投げる。

すると、サインアウト処理が行われるので、同じデバイスから別のユーザーでのログインなどができるようになります。

※間違いや足りないところがあれば指摘してください。よろしくお願いします。
【AWS】SESでメールが送信できなかったら

自分の環境(EC2)でSESがうまくいかなかったので、メモ。

環境：EC2, PHPSDK, SES

■サーバの時刻が遅れている場合

・サーバーの時刻を知る。
`$ date`

・時刻の確認
http://ja.thetimenow.com/utc/coordinated_universal_time


時間がずれていたら、手動もしくはNTPサーバーの同期させる

■手動の場合
`sudo date -s "`date --date '5 minutes' '+%F %T'`"`


念のため、ログをとるようにしておく

`/etc/ntp.conf`

`logconfig +clockall +peerall +sysall +syncall
logfile /var/log/ntp.log`
Vim Bootstrapでかんたん.vimrc生成

「やっとhjklには慣れたんだけど、今度は.vimrcが書けなくて…。」

そんなVim入門者のみなさんに朗報です。  
今日は自分の書く言語に合わせて.vimrcを自動生成してくれる便利なサイト、Vim Boostrapの紹介をします。
たぶん1分で実現できます。

# Vim Bootstrapでかんたん.vimrc生成
## Vim Bootstrapにアクセスする
![スクリーンショット 2014-12-04 20.00.08.png](https://qiita-image-store.s3.amazonaws.com/0/35647/ababa28e-9c53-42b7-ccf4-58a471e54832.png)
[Vim Bootstrap](http://vim-bootstrap.com/)にアクセスして、```Make your .vimrc now!```をクリックしましょう。

## 言語を選択する
![スクリーンショット 2014-12-04 20.06.35.png](https://qiita-image-store.s3.amazonaws.com/0/35647/406ec033-f60a-72f6-67a4-f546a474b186.png)
```Select your languages```と出てくるので、言語を選択します。
neovimを使っている人は、```Select your editor```でneovimも選択できるようです。

## .vimrcを生成しダウンロードする
![スクリーンショット 2014-12-04 20.08.04.png](https://qiita-image-store.s3.amazonaws.com/0/35647/73203c1f-8dba-80c9-23d8-a841a1cbe90e.png)
```Generate!``` ボタンを押すと、vimrcが生成され、ダウンロードされます。

## 初期設定をする
そのまま下へ行くと```Fast Installation```とあって、```this instructions```のリンクをクリックすると、[GitHubへ飛びます。](https://github.com/avelino/vim-bootstrap#installation)

Terminalを開いて、

```
mv ~/Downloads/vimrc ~/.vimrc
vim +NeoBundleInstall +qall
```

READMEの通りにコマンドを実行すると、インストール完了！
[gitやctagsが入っていない人は、事前に導入しておく必要があるようです。](https://github.com/avelino/vim-bootstrap#pre-requisites)

1から.vimrcを書くのはつらくても、これをベースに色々いじっていくと良いかもしれませんね。
良いVim生活を！
POH!4Liteが簡単すぎたので鯖を調べた

##はじめに
POHでC#はCライブラリを直接呼んだり自前で文字列数値変換するなどの行為は一部で不評を買っていた。
前回、鯖の中身がUbuntuだと気付いたのでデバイスファイル経由ならいいんじゃないかと思ったがそうでもなかった。
そしてその過程で/dev/stdoutが使えないことに気付いた。

##調査
どうやって調べればいいかについてだが以下の様にbashでコマンドを打てばよい。
![poh.png](https://qiita-image-store.s3.amazonaws.com/0/50302/ac4be100-7185-8c4c-d391-6df8390d439e.png)

```bash
;結果は
lrwxrwxrwx 1 root root 15 Dec 4 10:29 /dev/stdout -> /proc/self/fd/1 
l-wx------ 1 runner2 ubuntu 64 Dec 4 10:29 /proc/self/fd/1 -> /workspace/exec_stdout.txt 
-rw-r--r-- 1 root root 160 Dec 4 10:29 /workspace/exec_stdout.txt 
Linux 263a4c739076 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
```

上記のように/workspace/exec_stdout.txtにリダイレクトされているが肝心のwrite権が無いのでシンボリックリンクにwrite権があってもだめなのであった。
なおuserはrunnerXであり、root以外書けないexec_stdout.txtにはどうしようもない。

そしてgccとかが動くのでシェルを叩いてあらゆる言語についてcソースコンパイルして実行でクリア出来る筈である。
本当はその手を今回使うつもりだったが、課題が簡単すぎてやめた。

###ソース
今見て気付いたがheadとtailが逆？(どっちでもいいような気もする）。何故かバックするウナギと言う事にしておいてほしい。
なお、コメント部分を復帰してreadとprintfを削除すれば一応C#のみのコードになるので、実行時間を比較してみるとよいかもしれない。
ReadIntといいつつuintなのは300000x10000が21億を超えることへの対応でありリネーム忘れでもある。

```csharp
using System;
using System.IO;
using System.Runtime.InteropServices;
public class Query3
{
    [DllImport("libc")]
    static extern int read(int handle, byte[] buf, int n);
    [DllImport("libc")]
    static extern void printf(string format, uint value);
    static byte[] buf = new byte[10000000];
    static int index = 0;
    static uint ReadInt()
    {
        uint ret = 0, tmp;
        while ((tmp = buf[index++]) >= '0')
            ret = ret * 10 + (tmp - '0');
        return ret;
    }
    static void Main(string[] args)
    {
        //var f = File.OpenRead("/dev/stdin");
      // f.Read(buf, 0, 10000000);
        read(0, buf, 10000000);
        var t = ReadInt();
        var n = ReadInt();
        uint sum = 0, tail = 0, max = 0, head = 0;
        uint[] array = new uint[n];
        var loop = t;
        while ((loop--) > 0)
        {
            sum += array[tail++] = ReadInt();
        }
        max = sum;
        loop = n - t;
        while ((loop--) > 0)
        {
            sum = sum + (array[tail++] = ReadInt()) - array[head++];
            if (sum > max)
            {
                max = sum;
            }
        }
        //Console.WriteLine(max);
        printf("%u\n", max);
    }
}
```
UTF-8のファイルに一括でBOMをつけたい


リポジトリ内のcppファイルの文字コードがメチャメチャだ！
WindowsとMacどちらでも編集するから、UTF-8じゃないといけない！
でも、VisualStudioはBOMがついてないとUTF-8だと認識してくれない！！！


# 前提

- Mac
- BOM付きUTF-8にするのはcppファイルだけでいい
- 改行コードがCR+LFになっても構わない

# やり方

```
$ LC_CTYPE=C
$ LANG=C
$ find . -name "*.cpp" -type f | xargs file | grep UTF-8 | awk '/^\.[^:]+/ {print $1}' | sed -e 's/://' | xargs nkf --overwrite -w8
```

`LC_CTYPE`と`LANG`を`C`にしておかないと、全角が混じってた時に`file`コマンドが illegal byte sequence のエラーを吐くことがあるので注意。



という忘備録でした。
curlでRedmineのチケット一覧を取得

メモ

```
REDMINE_API_URL="hogehoge"
REDMINE_API_KEY="hogehoge"

REDMINE_TICKET_GET_COUNT=1

ticket_list=`curl -s "${REDMINE_API_URL}/issues.json?limit=${REDMINE_TICKET_GET_COUNT}&key=${REDMINE_API_KEY}" | /usr/local/bin/jq '.issues[] | {id,subject}'`
```
Shenの基礎その1 基本的な型

Shenについて書きます。

たぶん何回か記事を分けて書きます。

# Shenとは何か?

Shenという、Lisp方言があります。

http://www.shenlanguage.org/

Shenは強力な型システムや、関数型プログラミング言語をサポートした言語で、ポータブルに設計された言語でつ。

# 先行記事(日本語)

すでにQiitaなどにで、先行に日本語記事があるので紹介します。Shen 言語で日本語検索で調べると、2件しか出てこないのですが。

http://blog.hiyamugi.net/2012/12/04/0001

http://qiita.com/todogzm/items/04e1436c572fe708043e

# Shenの基礎

## 基本的な型について

### シンボル

Shenはquote(')は暗黙的です。たとえば,nobkzと入力すると、暗黙的に、nobkzというシンボルとして、暗黙的にquoteされます。

```
>> nobkz
nobkz
```

replに、(tc +)と、入力すれば、型が表示されます。nobkzはシンボル型ですね。

```
>> (tc +)
true
>> nobkz
nobkz : simbol
```

### 数値型

Shenでは、数字を入力すれば、number型です。

```
>> 1000
1000 : number
>> -0.5
-0.5 : number
```

四則演算

```
>> (+ 1 2 3)
6 : number
>> (- 1 2)
-1 : number
>> (* 1 2)
2 : number
>> (/ 10 3)
3.3333333333333335 : number
```

### 文字列

“”で括ると、文字列になります。

```
>> “sample"
"sample" : string
```

@sで連結したり、いろいろあります。


```
>> (@s "hello" " " "world")
"hello world" : string
>> (pos "hello" 3)
"l" : string
```


### boolean

trueと書くとシンボルにならずに、booleanです。

```
>>> true
ture : boolean
>>> false 
false : boolean
>>> (and true false)
false : boolean
>>> (or false true)
true : boolean
>>> (not false)
true : boolean
```

### リスト

リストは[]で括ります。

```
>> [1 2 (+ 1 2)]
[1 2 3] : (list number)
```

()は空リストです。

```
>> ()
[] : (list A)
```

consもあります。(cons 1 2)はtypeを表示するままだと、type errorを起します。

```
>>> (cons 1 ())
(1) : (list number)
>>> (cons 1 2)
type error 
>>> (tc -)
false : boolean
>>> (cons 1 2)
[1 | 2] 
```

また、[]の記法において|も,consと同じです。

```
>>> [2 | [3 4]]
[2 3 4]
```

head,tailで、carとcdrと同様な関数です。

```
>>> head
head : (list A) --> A
>>> (head [1 2 3])
1 : number
>>> tail
tail : (list A) --> (list A)
>>> (tail [1 2 3])
[2 3] : (list number)
```

### Vectors

Vectors型があります。

```
>> <>
<> : (vector A)
>> (@v a b c <>)
<a b c> : (vector symbol)
>> (limit (@v a b c <>))
3 : number
>> (<-vector (@v a b c d e) 3)
c : symbol
>> (vector-> (@v a b c d e) 3 a)
<a b a d e) : (vector symbol)
```

### Tuples

タプルがあります。

```
>>> (@p (+ 1 1) a)
(@p 2 a) : (number * symbol)
>> (fst (@p 1 a))
1 : number 
>> (snd (@p 1 b))
b : symbol
```

### lazy

遅延評価の型もあります。

```
>> (lazy 1)
#<FUNCTION (LAMBDA ()) {1004B8E7CB}> : (lazy number)
```

### 関数の型

関数の型は次のような表記になります。

```
>> (/. X X)
#<FUNCTION (LAMBDA (X)) {10051094CB}> : (A --> A)
```

とりあえず、基本的な型を記述しました。次回また、空いている日に構文やら、KLambdaの話とかしまつ。
ssh プロキシーを利用した多段認証と ssh ポートフォワーディング

今回もいつもと少しテーマを変えて ssh の多段アクセスの話です。

計算機資源を遠隔に置いて処理計算をおこなう場合、[二段階の認証方式にすればより安全である](http://qiita.com/ynakayama/items/24acb6eaa11b869eaa3e)話を以前しました。

また ssh ポートフォワーディングや SSH Filesystem で[複数の計算機を統合して利用する方法](http://qiita.com/ynakayama/items/e161f37454e11801b1b9)についても説明しました。

今回はこの補足で、外部から計算機資源環境を利用する際に、多段 ssh アクセスを簡易化することで効率を上げる方法を書きます。

## 二段階のログイン認証と ssh の踏み台設定

上記のリンク先で説明した通り、セキュリティを考慮するために ssh 公開鍵認証で接続する外部の踏み台サーバーと、パスワード認証で接続する内部の計算機資源による構成を考えます。

踏み台となるサーバーを公開鍵認証にしておいて、さらにそこからしか接続できない設定にしたパスワード認証のホストを奥に設置するという構成です。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/b30c11d8-fc35-3e1f-5a65-ba1bc34b7299.png)

このように二段階の認証を設定した場合、踏み台を経由して内部の計算機に外から接続するためには ~/.ssh/config に次のように書くと一発で認証できます。

```
Host gaibu.your.net
  User yourname # 踏み台サーバーのユーザー名
  Port 44444 # 踏み台サーバーのポート番号

Host naibu.your.net
  User yourname # 内部サーバーのユーザー名
  Hostname naibu # 内部サーバーのホスト名
  Port 55555 # 内部サーバーのポート番号
  ProxyCommand ssh gaibu.your.net -W %h:%p
```

これにより
1. 踏み台となる計算機に対して ssh 公開鍵認証で自動接続
2. 内部の計算機に対してパスワード認証
が一度におこなわれます。

結果的に外から ssh naibu.your.net すると内部の計算機のパスワードプロンプトに応答するだけで目的の資源にたどり着くことができます。

詳細は[こちら](http://qiita.com/ik-fib/items/12e4fab4478e360a82a1)が参考になります。

## ssh ポートフォワーディング

[以前に書いた](http://qiita.com/ynakayama/items/e161f37454e11801b1b9)通り ssh ポートフォワーディングを利用すると離れた計算機のポートをあたかも手元の計算機で動いているかのように転送することができます。これは多段 ssh を経由しても同じです。

これを利用すれば、例えば遠隔の計算機で実行している本来ローカルホストからしかアクセスできないテストサーバーのサービスを、あたかも手元の計算機で実行しているかのようにアクセスすることができたりします。

たとえば以下のコマンドでは内部計算機の 80 番ポートで起動した Web サービスを、手元の計算機の 9999 番に転送しています。

```bash
ssh -L9999:naibu.your.net:80 naibu.your.net
```

このようにすれば遠隔の計算機で開発し起動した Web アプリケーションに対して、ブラウザで localhost:9999 を開くだけでアクセスできるわけです。経路を ssh でトンネリングしていますから、安全にアクセスすることができます。

注意するべき点としては手元の計算機のテスト用のポート番号にアクセスされると遠隔の計算機のものが見えますから、外部からのアクセスを弾いておく必要があります。

(追記) heliac2000 さんより

下記の通りに -N -f オプションを指定することにより ssh プロセスが自動的にバックグラウンドになり、ポートフォワーディングのみを実行してくれるようになるとご教示いただきました。

```
ssh -N -f -L9999:naibu.your.net:80 naibu.your.net
```

一旦記事を消してしまったのでので手書きで追記しました。

## まとめ

このような二段階以上の認証構成は、企業の内部のネットワークはもちろん AWS などのクラウドを使うにあたっても非常に有用なものとなります。

ほぼ必須とも言える技術なので身に付けると良いでしょう。