OmniAICreator/Qiita-1.07M huggingface dataset:
History of software for jailbroken env.


この記事は [iOS Jailbreaking Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ios-jailbreaking) の1日目の記事です。

初っ端ということでJailbroken環境向けソフトウェア/プラットフォームにまつわる懐古的な記事をお届けします。

## iPhone OS 1 (2007-2008)
App Storeも存在しなかった時期のため、配布されるソフトウェアはアプリケーションがほとんどでした。
SDKも存在しませんので、この頃のアプリ作成は難易度が高かったことでしょう。
この頃はGoogleアカウントとの同期もデフォルトでは出来なかったためGoogle Calendarと同期するソフトウェアにはお世話になってました。
![](http://i.kinja-img.com/gawker-media/image/upload/s--ZSN3zadI--/18fcd3g4rokvopng.png)

### ソフトウェア

最初期のパッケージマネージャであるInstallerが形式にAPT(dpkg)を採用したため現在もパッケージはAPTが使われています。この時rpmが採用されていた場合はrpmになっていたことでしょう。
![dbfd3691664ef25f17703eba49199e73.jpg](https://qiita-image-store.s3.amazonaws.com/0/1295/eeaad68f-dcc6-92d3-56f1-ee507eafe0ea.jpeg "dbfd3691664ef25f17703eba49199e73.jpg")

## iPhone OS 2 (2008-2009)
App Storeが登場しPrivateAPIや規約的にリリース出来ないアプリケーションを除くとアプリケーションタイプのものは設定を行うためのインターフェースとして残りました。

### ソフトウェア

App Storeの登場や、この頃にリリースされたMobileSubstrateによって徐々にいわゆるtweak（主にOSに対する各種微調整）が増えてきます。
この頃はTHEOS(Makefileフレームワーク+pre processor)が無かった為、Hooking用のコードも煩雑でMakefileもUNIXソフトウェアよろしく煩雑なものでした。

またこの頃にリリースされたJailbreak ToolのデフォルトパッケージマネージャがCydiaだったこと、その後のCydia Storeの登場、SHSHのバックアップ機能搭載によりこちらがデファクトスタンダードになります。

2008年末にはBigboss Prefsの後継であるSBSettingsがリリースされます、サードパーティのアドオン（Toggle）に対応したソフトウェアが出たのはこのあたりが初ではないでしょうか。ちなみにまだActivatorがないため独自のdaemonでステータスバースワイプを検出していたと記憶しています。

## iPhone OS 3 (2009-2010)

Cydia Storeが誕生し、App Storeとおなじく7:3の割合で利益を得ることが可能になりました。
Cydia Storeに試用期間がなかったからなのか、対抗馬として有料ソフトウェアの試用期間のあるRock Storeも登場します。
この年に登場したiPhone 3GSからファームウェアのリストアには認証が必要になり、SHSHのバックアップシステムがうまれます。

### ソフトウェア

この頃に登場したPreferenceLoaderにより簡単な設定UIはこちらに統合され、設定用アプリケーションはほぼ姿を消していきます。
また、前述のTHEOSがリリースされ面倒だったMakefileの作成簡素化、Logos pre processorにより障壁が非常に低くなりました。ものによってはMakefileは自動生成された状態から変更せず、コードはワンライナーですむほどになりました。
2009年末にはActivator（この頃はlibactivator）がリリースされジェスチャー起動によるアクションも徐々にプラットフォーム化されていきます。

## iOS 4+ (2010~

Rock StoreがCydiaによって買収・統合されます。（会社だったんだなとビックリしました）
これによりパッケージマネージャはCydiaに一本化されたと言って良いでしょう。

### ソフトウェア

この頃になると統廃合とデファクト化が完了し、ソフトウェア面では現在と大差ない状況になります。

* Cydia: APTフロントエンドパッケージマネージャ
* MobileSubstrate: Dynamic Library Loader
* PreferenceLoader: 設定用 bundle/plist Loader
* Activator: ジェスチャーによるアクション実行プラットフォーム
* THEOS: Makefileフレームワーク

ちなみにWi-Fiなどの設定ToggleプラットフォームだけはSBSettings→対抗馬NCSettings登場→両者開発終了→Flipswitch登場と変遷を経てFlipswitchが現在の標準になっています。

## まとめ
Jailbroken環境におけるパッケージマネージャまわりの流れ（Icyとか省きましたが）とソフトウェアの流れを振り返ってみました。
こうしてみるとiOS 4の時には現在まで続く環境が確立していますね。

ARMアーキテクチャでコンパイル出来れば動作させる事が出来るのでlighttpdなどのサーバサイドソフトウェアなどもあるにはありますが、ものがものですので特に主流になる事はありませんでした。PythonやRubyなどのLLを入れて遊ぶ事も出来ますがキーボードがねぇ。。

さて懐古しきったところで2日目以降は主に開発にまつわる話をしていきます。
2015年のHaxeを振り返る

2015年も終わりが近いので、今年のHaxe界隈の出来事を簡単に振り返ります。


## Ludum Dare 32のCompo部門で1位、2位、3位（4月）

Ludum Dareは世界的なゲーム制作イベントで、48時間で1人でゲームを作るCompo部門と、72時間でチームでゲームを作るJam部門があります。[第32回](http://ludumdare.com/compo/ludum-dare-32)のテーマは「An Unconventional Weapon（型破りな兵器）」。提出されたゲーム数はなんと2821個で過去最大の数でした。

そんな中、Compo部門の総合成績1位、2位、3位、5位がHaxeで制作されたゲームという結果になりました。

1位. [ＢＥＤ✰ＨＯＧＧ](http://ludumdare.com/compo/ludum-dare-32/?action=preview&uid=11474)
2位. [Badass Inc](http://ludumdare.com/compo/ludum-dare-32/?action=preview&uid=2982)
3位. [Alien Crab in the Ghostmaze](http://ludumdare.com/compo/ludum-dare-32/?action=preview&uid=16472)
5位. [Trigonoweapon](http://ludumdare.com/compo/ludum-dare-32/?action=preview&uid=10579)

1人で素早くゲームを作る用途では、Haxeはかなり強いのがうかがえます。Ludum Dareについては、Haxe Roundupでまとめが投稿されているので、Haxeでの作品を知りたい場合はそちらでみることができます。

[The Haxe Ludum Dare 32 Roundup](http://haxe.io/ld/32/)
[The Haxe Ludum Dare 33 Roundup（8月開催）](http://haxe.io/ld/33/)

Compo部門の作品はすべてソースコードが公開されているので、各ゲームエンジンのサンプルコードとしても見れるのがうれしいところです。


## Haxe 3.2リリース（5月）

Haxe3.2がリリースされました。内容については別に記事を書いているので[こちら](http://qiita.com/shohei909/items/4c2125a6ff065d9cc65f)をどうぞ。

個人的な感想としては、マクロの新機能が便利です。`addGlobalMetadata`はよく使います。

## WWX2015（5月）

パリで、Haxeの国際カンファレンスが開催されました。

[こちら](http://www.silexlabs.org/wrapping-up-wwx2015/)でビデオが公開されてます。

ビデオレコーダのTiVo社なども発表をしていて、発表スライドを[Githubにも公開しています](https://github.com/TiVo/wwx2015)。

イベントに合わせて、[Haxelibのサイト](http://lib.haxe.org/)が新しくなったりしました。


## 関数のアロー式のGithubのissueがやたら盛り上がる（6月）

GithubのIssueに[関数のラムダ式の構文の追加](https://github.com/HaxeFoundation/haxe/issues/4268)のリクエストが来ました。

Haxeは関数型っぽい側面もあるんですが、関数式の構文が長いのでそこに不満をもっている人は結構多いらしく、100件くらいの賛同レスが来てます。

しかし、Haxe創始者のNicolasは「関数型のファンが100個の+1を投稿したところで、ほとんどのHaxeユーザーがその機能を望んでるって意味じゃないよ」という趣旨の発言をしていて、乗り気じゃないのがうかがえます。なのでたぶん実装されないです。残念。


## Evoland 2リリース（9月）

http://www.evoland2.com/

Nicolas率いる[Shiro Games](http://shirogames.com/)の最新作です。

その裏側の技術については、先述のWWXで[発表がされています](http://www.silexlabs.org/the-tech-behind-evoland-2/)。

静的なゲームデータベースのツールとして[CastleDB](http://castledb.org/)を、ゲームフレームワークとして[Heaps](https://github.com/ncannasse/heaps)を紹介しています。

Haxeでシェーダーを書いてAGALとGLSLに出力するhxslなどは、なかなか興味深いです。


## Haxe Foundationが最高経営責任者の募集を始める（11月）

その経緯については以下に詳しく書かれています。

https://medium.com/@ncannasse/some-words-about-haxe-foundation-e97a4e9d7e41

内容を非常にざっくりとまとめると、

----

Haxeは技術的な観点では成功しているものの、コミュニケーションや組織など失敗している点がいくつかある。

Haxeはゲーム開発者の界隈には強いが、Haxe自体はもっと広い用途をもっている。一方で、Nicolasはゲーム開発者でありその他の領域にどうやってマーケティングすべきかわかりかねている。また、Nicolasはマネジメントよりもゲーム開発や新しい技術に興味があり、Shiro GamesもあるのでHaxe Foundationのためにフルタイムで働くこともできていない。

不足している部分を補って、Haxeを次のステップに進めるためにフルタイムで働けるCEOを探すことにした。

----

といった話のようです。かなり省略して書いたので、ちゃんと内容を知りたい人は原文をよんでください。


# 個人的な感想

機能面も足りなかった部分が補われてきて、ゲームについては事例も増えてきました。ActionScriptの代替としての正当な進化を遂げている感じがします。

とはいえ現状、サーバーサイドのフレームワークや、Mac向けのIDEなど、まだもの足りなく感じるところもあります。

今年のHaxe FoundationのCEOの募集というのは、サーバーサイドなどの分野にもいい影響がありそうで期待感のあるニュースでした。

IDEについても、今年はHaxeのIDE向け機能の強化や、Visual Studio Codeのオープンソース化などがあり、来年以降は発展の見込みがありそうかなと思うのでぜひぜひ注目したいところです。
SwiftでEnterFrameBeaconを作る


### EnterFrameBeaconとは？
EnterFrameBeaconは指定されてFPSで処理を実行する、アニメーションフレームを管理クラスです。
Swiftでは、CAnimationとかあるようですが、非常に使いづらいので簡単に動きが付けれるエンジンを用意します。

EnterFrameBeaconは今は亡きActionScriptの技術でした...アーメン。
今回は簡易版です。


### 仕組み
仕組みは簡単です。管理クラスを用意し、リスナーを保持するプロパティを持たせます。

```EnterFrameBeacon.swift

class EnterFrameBeacon: NSObject {
    
    private var _listeners:[EnterFrameDelegate] = []
}

```

リスナーにはEnterFrameDelegate(プロトコル)を関連させます。この型をもつオブジェクトを
_listenersで管理します。_listenersは静的プロパティのほうが扱いやすいです。

```EnterFrameDelegate.swift
import Foundation
import UIKit

protocol EnterFrameDelegate {
    func update()
}
```

毎フレーム処理を実行するためにはNSTimerクラスを利用します。
プロパティとして_timerを用意します。

```EnterFrameBeacon.swift
private var _timer: NSTimer!
```

EnterFrameBeaconは３つのメソッドを持ちます。

+ initialize 初期化
+ addEventListener リスナー登録
+ update 毎フレーム実行される処理

順番に見ていきます。
まずは初期化、引数でFPSを渡します。デフォルトで60が設定されます。

```EnterFrameBeacon.swift
func initialize(fps: NSTimeInterval = 60.0){
    self._timer = NSTimer.scheduledTimerWithTimeInterval(1.0 / fps, target: self, selector: "update", userInfo: nil, repeats: true)
}
```

次にリスナー登録、EnterFrameDelegateプロトコルを持つインスタンスを登録します。

```EnterFrameBeacon.swift 
    
func addEventListener(listener: EnterFrameDelegate) {
    self._listeners.append(listener)
}
```

最後に毎フレーム呼び出される処理です。    
    
```EnterFrameBeacon.swift 
func update(){
   let max = self._listeners.count
   for var i = 0; i < max; ++i {
      let obj: EnterFrameDelegate =  self._listeners[i] as EnterFrameDelegate
      obj.update()
   }
}
```


これで完了です。
実際に使う場合は、以下のようになります。

```ViewController.swift
self._beacon = EnterFrameBeacon()
self._beacon.initialize(60.0)
self._beacon.addEventListener(self)

func update(){
	// 具体的な処理
}
```

以上です。
Ryuを動かそう！ 第一回 VMを立ててmininet起動

# はじめに
本記事は、OpenFlowプロトコルのフレームワークの一つのRyuを動かしてみることを目的とした記事です。
第一回目の今回は、Ryuが提供しているVM イメージでVMを起動して、
仮想ネットワークエミュレーターminiteを起動するところまで解説します。
なお、OpenFlowってなんじゃ?やSDNなんじゃという解説は省きます。
気になる方は各々調べてください。

# 環境
Mac OSX 10.11.1

# 参考ページ
[OpenFlowチュートリアル on OSX](http://www.hogetan.net/note/network/openflow_tutorial.html)

#  VMの設定
## VirtualBoxのDownLoad & Install
[VirturlBox](https://www.virtualbox.org/wiki/Downloads)からMac用をDownLoadする。
dmgファイルを起動して、Installする。

## イメージファイルをDownLoad
[OpenFlow_Tutorial_Ryu3.6.ova](http://sourceforge.net/projects/ryu/files/vmimages/OpenFlowTutorial/)
をDownLoadする。

## VirturalBoxの起動&セットアップ
参考ページに写真による説明があるのでそちらを参照してください。
ここでは、文章で簡単に解説します。
- VirtualBox起動
- "ファイル -> インポート -> アプライアンスを開く"でDLしたイメージファイルを開く
- "左上のりんごのとなりのVirturalBox→環境設定→ネットワーク→ホストオンリーネットワーク"で右側のプラスマークを押す(おそらく参考ページの写真の順番が間違っている。次の写真)
- "作ったVMを選択→ネットワーク→アダプター2"でネットワークアダプタを有効化し割り当てで「ホストオンリーアダプター」を選択(おそらく参考ページの写真の順番が間違っている。前の写真)
- VMを起動し、user=ryu, password=ryuでログイン(**参考と違うので注意**)
- `$sudo dhclient eth1` でネットワークインターフェースを作成
- `$ifconfig eth1`で確認(19.168.56.101)
- Macに戻り、ターミナルから`$ ssh -X ryu@192.168.56.101'でVMにsshで入る
- そのターミナルから`$sudo mn --topo single,3 --mac --switch ovsk --controller remote'でmininetを起動

これでVMを立ててmininet起動まで完了です。
起動した後のお遊びについては次回解説します。
モバイルAdobe AIR開発の技術選定

# モバイルAdobe AIR開発の技術選定

最強のマルチプラットフォーム技術Adobe AIR、というといいすぎですかね。Adobe AIRを使っている開発者なら必ずしも皆が言うのは「やっぱ、Flashは作りやすいですよね」ということです。

Adobe AIRはデスクトップ(Windows, OS X)のみならず、モバイルアプリ(iOS, Android)を開発することができます。しかし、一概に「Flashを作る」といってもその作り方は何種類もあります。作り方によっては思ったようにパフォーマンスがでなかったり、開発工程が肥大化し延期に延期を重ねるという危険性もあります。そうならないためにも技術選定の参考までに、モバイルAIRそれぞれの作り方の特徴をまとめます。

## Flash Professional で開発

![](https://ics.media/wp-content/uploads/2015/06/150622_splash_flashprocc.png)

Adobe CCのひとつFlash Professional CC(通称、Flash Pro CC)を使う方法です。タイムラインとステージというデザインツールに加えて、ActionScriptも書ける便利な制作ツールです。

### メリット

- タイムラインでアニメーションを作れる
- ステージでデザインが描ける
- 簡単なActionScriptを書ける

### デメリット

- パフォーマンスが優れない
    - CPUで動くため (GPUの選択肢もあるが、限度もある)
- 中・大規模なActionScript開発に向かない

## Apache Flex フレームワークで開発

![](http://flex.apache.org/images/logo_01_fullcolor-sm.png)

Flex フレームワークはMXMLというマークアップ言語でFlashを開発できるフレームワークです。Adobe Flex 4.6まではアドビのものでしたが、手放されて今はApache Flexとして開発が継続しています。エンタープライズ方面でFlexフレームワークが使われることが多いですが、モバイルFlexも有効な選択肢の一つです。

### メリット

- 中・大規模なActionScript開発に適する
- コンポーネントが揃っているため、ツール系UIの開発が容易

### デメリット

- パフォーマンスが優れない
    - CPUで動くため (GPUの選択肢もあるが、限度もある)
- デザインの組み込みが手間
- Flexフレームワークに対する理解が必要 (学習コストが高い)


## Starlingフレームワークで開発

![](http://gamua.com/img/starling/title-logo.png?mtime=2012-02-20-0933)

FlashではGPUをより活用できる技術として「Stage3D」があります。Stage3Dを使った場合のFlashのパフォーマンスは非常に良好です。「[iOSにおけるSwift/Unity/PhoneGap/Adobe AIRのパフォーマンス比較検証 - ICS MEDIA](https://ics.media/entry/6137)」という記事ではAdobe AIR (Stage3D)はネイティブについで高いパフォーマンスを有しており、Unityよりも良好な結果が得られています。

StarlingはStage3D上にDisplayListを構築するフレームワークです。

- [Starling - The Cross Platform Game Engine](http://gamua.com/starling/)


### メリット

- パフォーマンスに優れる
    - Flashを作る上で最大のパフォーマンスを得られる

### デメリット

- デザインの組み込みが手間
    - Flash Pro CCからアセットを出力する独自ワークフローの構築が不可欠
- Starlingフレームワークに対する理解が必要 (学習コストがやや高い)
- OpenGLの特性にあわせた最適化が必要
    - レンダリング時のドローコールを抑えるなど最適化が必要
    - 電力消費を抑えたり、パフォーマンスを上げる必要がある     
- 電力消費が大きい
    - 毎フレーム、画面領域全体を描き直すので。





## StarlingとFeathersで開発

![](http://feathersui.com/images/feathers-ui-three-iphones@2x.png)

先ほどのStarlingはStage3D上にDisplayListを構築するフレームワークです。対してFeathersはStarling上のUIパーツを提供するライブラリです。


### メリット

- パフォーマンスに優れる
    - Flashを作る上で最大のパフォーマンスを得られる
- UIパーツなどのコンポーネントを利用できる

### デメリット

- デザインの組み込みが手間
- Starlingフレームワークに対する理解が必要 (学習コストがやや高い)
- Feathersフレームワークに対する理解が必要 (学習コストがやや高い)
- OpenGLの特性にあわせた最適化が必要
- 電力消費が大きい

## まとめ

メリット・デメリットをまとめると次の方針で技術選択するのが良さそうです。

- パフォーマンス優先なら「Starling + Feathers」が定番
- Flexフレームワークの知識があり、パフォーマンスを必要としないなら「モバイルFlex」
- カジュアルにミニマムアプリを作るなら「Flash Professional」

次回からはそれぞれの方法について詳しく掘り下げていきます。
AWS LambdaでPHPなどを動かした話


Node.js, Java, Python以外の言語(主にPHP)をAWS Lambdaで動かしたかった。
やったことのまとめ。

## Perlを動かした話

http://oh-sky.hatenablog.com/entry/2015/10/19/010516

AWS Lambdaの環境(Amazon Linux)にはPerlがインストールされている。
Lambda関数からperlコマンドを叩けば、perlのスクリプトを実行できる。
perlの他にも、インストールされているいろいろなコマンドを実行できる。

## PHP CLIを動かした話

<iframe src="//www.slideshare.net/slideshow/embed_code/key/LwW6qUDMdmREXC" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/oh-sky/php-55467177" title="PHPという概念が存在しない退屈な世界" target="_blank">PHPという概念が存在しない退屈な世界</a> </strong> from <strong><a href="//www.slideshare.net/oh-sky" target="_blank">Yoshihiro Ohsuka</a></strong> </div>

AWS Lambdaの環境にはPHPはインストールされていない。
でもPHPerなのでPHPを動かしたかった。
Linux用にコンパイルしたPHPコマンドをアップロードすれば、PHPが使用できる。
必要な共有ライブラリがAWS Lambdaの環境にない場合は、アップロードしてライブラリPATHを通す必要がある。

同様の方法で、AWS Lambdaにインストールされていないコマンドを実行することが可能。

## PHP Webアプリケーションを動かした話

<iframe src="//www.slideshare.net/slideshow/embed_code/key/DabfJrIEEyB5U4?startSlide=3" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/oh-sky/php-aws-lambdawebapp" title="PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編" target="_blank">PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編</a> </strong> from <strong><a href="//www.slideshare.net/oh-sky" target="_blank">Yoshihiro Ohsuka</a></strong> </div>

処理の流れ
API Gatewayでリクエストを受ける
→ AWS LambdaはPHPコマンドでbuilt-in serverを起動
→ curlコマンドでbuilt-in serverにアクセス
→ 出力されたHTMLをAPI Gatewayで返す

built-in serverの起動、built-in serverへのリクエスト・レスポンスに時間がかかり、トータルで結構待たされる。
実用的ではない。

## まとめ
Node.js, Java, Pythonをあまり知らなくても、好きな言語で書けば良い。
AWS Lambdaの内部環境が変わる可能性はあるはず。自分でコンパイルしたプログラムを動かす場合、必要な共有ライブラリが無くなるなどの理由で、突然動かなくなることがあるかもしれない。
SSH ダイナミックポートフォワード＋Socks プロキシで内部ページを閲覧する

プライベートな環境で「SSH でダイナミックポートフォワード＋SOCKS プロキシ」を使っていて、何かの節にSSH のトンネルが切れてしまい、SOCKS に引きずられてインターネットにアクセスできない悲しい事態になったので雑に自動化してみた。

```
#!/bin/sh
INTERVAL_SEC=5
echo '[SSH Proxy] Turn on socket proxy...'
networksetup -setsocksfirewallproxystate Wi-Fi on

ssh -D 1080 -N user@example.com &
SSH_TUNNEL_PID=$!
echo "[SSH Proxy] Built SSH tunnel [ PID $SSH_TUNNEL_PID ]"

function health_check() {
  while true
  do
    sleep $INTERVAL_SEC
    ps -p $SSH_TUNNEL_PID >/dev/null 2>&1
    if [ $? -eq 1 ]; then
      echo '[SSH Proxy] SSH tunnel is broken!'
      networksetup -setsocksfirewallproxystate Wi-Fi off
      echo '[SSH Proxy] Turn off socket proxy.'
      exit 0
    fi
  done
}
health_check &
exit 0
```

使うときは事前に、SOCKS プロキシの設定が必要です。SOCKS Proxy Server として `localhost:1080` を指定が必要です。

![Screen Shot 2015-12-01 at 09.00.46.png](https://qiita-image-store.s3.amazonaws.com/0/257/1b95a436-4110-0d69-b23e-5b0022476923.png)

## 補足説明

### ダイナミックポートフォワード

ターミナルでトンネルを貼る場合は、

```
ssh -D 1080 -f -N user@example.com
```

とすればOK. リモートでコマンドを実行する必要が無いので `-N` を指定して、 `-f` でバックグラウンド実行させることが多い（と思う）。

ダイナミックポートフォワード自体の設定は下記の様に指定することも可能です。

```~/.ssh/config
Host tunnel
  HostName example.com
  User user
  DynamicForward 1080
```

### Mac のネットワーク設定

コマンドラインからいろいろ弄れるみたいです。 `networksetup` コマンドをみると設定のサンプルが見られます。

めっちゃ出てくるので、

```
networksetup | grep socks -A3
```

とかやると、いい感じにSOCKS プロキシの設定方法がわかります。
npmをUbuntuに入れてみる。

インストールした先はUbuntu 15.10(wily)です。


Webを見ていると、npmはnode.jsをインストールすれば自動的にインストールされるそうだが…。apt-get してみる。

```
$ sudo apt-get install npm
...
$npm -v
1.4.21
```

念のためnpm自身をupdateしてみる。-gオプションはグローバルパッケージをupdatesするときのオプション。

```
$npm update -g npm
```

以上
コマンドラインツールの作り方

サーバの管理などでBashなどを使ってバッチ処理のスクリプトを書くことが時々あるのですが、今回はそれをElixirで行ってみようと思います。
Elixirにはelixirコマンドがあり、これを使用することでElixirのスプリクトを実行することができます。

ファイルの拡張子はElixirスクリプトの命名規則に倣って.exsとします。
最初の行にはシェバンを記述します。
標準ライブラリだけを使うのであればmix newをする必要はなく、適当な場所にファイルを作ればOKです。

```ex:hello.exs
#!/usr/bin/env elixir
IO.puts "Hello world!"
```

ファイルを保存したら、chmodコマンドで実行権限を与えて実行してみます。

```bash
$ chmod +x hello.exs
$ ./hello.exs
Hello world!
```

簡単ですね。
次はコマンドライン引数を受け取って１つづつ表示をしてみます。

```ex:argv.exs
#!/usr/bin/env elixir
System.argv()
|> Enum.each(fn(x) -> IO.puts x end)
```

```bash
$ chmod +x argv.exs
$ ./argv.exs foo bar
foo
bar
```

System.argv()はリストを返すのでEnumにある関数でデータをいろいろ加工することができます。
引数で渡された数値を足すスクリプトを作ってみます。
コマンドライン引数は文字列型なので、いったん数値型に変換してから足しあわせます。

```ex:calc.exs
#!/usr/bin/env elixir
System.argv()
|> Enum.map(fn(x) -> String.to_integer x end)
|> Enum.sum
|> IO.puts
```

```bash
$ chmod +x calc.exs
$ ./calc.exs 1 2 3 4
10
```

次はパイプでlsコマンドから出力されたディレクトリのリストをElixirスクリプトで受け取ります。
受け取った際に正規表現を使って拡張子に.exsを持つファイルだけに絞り込むようにします。

```ex:pipe.exs
#!/usr/bin/env elixir
IO.stream(:stdio, :line)
|> Enum.filter(fn(x) -> x =~ ~r/\.exs/ end)
|> Enum.each(fn(x) -> IO.write(:stdio, x) end)
```

```bash
$ chmod +x pipe.exs
$ ls -la | ./pipe.exs
-rwxr-xr-x    1 hideshi  staff    73 12  1 06:58 args.exs
-rwxr-xr-x    1 hideshi  staff   105 12  1 07:01 calc.exs
-rwxr-xr-x    1 hideshi  staff    44 12  1 06:33 hello.exs
-rwxr-xr-x    1 hideshi  staff   138 12  1 07:11 pipe.exs
```

ElixirスクリプトからOSコマンドを実行することもできます。
[この記事](http://qiita.com/darui_kara/items/755463f2c4769d1777ed)が詳しいです。

```ex:cmd.exs
#!/usr/bin/env elixir
{result, 0} = System.cmd "ls", ["-la"]
result
|> String.split("\n")
|> Enum.filter(fn(x) -> x =~ ~r/\.exs/ end)
|> Enum.each(fn(x) -> IO.puts x end)
```

```bash
$ chmod +x cmd.exs
$ ./cmd.exs
-rwxr-xr-x    1 hideshi  staff    73 12  1 06:58 args.exs
-rwxr-xr-x    1 hideshi  staff   105 12  1 07:01 calc.exs
-rwxr-xr-x    1 hideshi  staff   171 12  1 07:54 cmd.exs
-rwxr-xr-x    1 hideshi  staff    44 12  1 06:33 hello.exs
-rwxr-xr-x    1 hideshi  staff   138 12  1 07:11 pipe.exs
```

標準出力に出力していますので、その後でパイプで他のコマンドに渡すこともできます。
grepで文字列calcを含む行だけ抽出してみます。

```bash
$ ./cmd.exs |grep calc
-rwxr-xr-x    1 hideshi  staff   105 12  1 07:01 calc.exs
```

最後にコマンドラインオプションをパースしてみましょう。

```ex:opt.exs
#!/usr/bin/env elixir
System.argv
|> OptionParser.parse
|> IO.inspect
```

```bash
$ chmod +x opt.exs
$ ./opt.exs -x --debug --verbose -c foo bar
{[debug: true, verbose: true], ["bar"], [{"-x", nil}, {"-c", "foo"}]}
```

うまくパースできたようですね。

もし他にも便利な機能があればコメント頂ければと思います。
Git Tips

## rmで削除したファイルをstage(index)に上げる
```sh
git add <target> --update
```

## ローカルブランチの掃除
### tarcking branch
リモートリポジトリから削除されたブランチをローカルからも削除する。

```sh
git fetch -p
```

### local branch
雑だが、下のコマンドでリモートにマージ済みのブランチが削除される。

```sh
git branch | xargs git branch -d
```

マージされていないブランチの場合はエラーを吐いて次のブランチの削除を試行する。

```sh
error: The branch 'unmerged-branch' is not fully merged.
If you are sure you want to delete it, run 'git branch -D unmerged-branch'.
```

## サブモジュールも一緒に取ってくる
```sh
git clnoe --recursive git@github.com:hoge/fuga.git
```

## 他のブランチのファイルの変更を取り込む
```sh
git checkout <ブランチ名> -- <対象ファイルのパス>
```

## gitの管理対象から特定のファイル、ディレクトリを削除する
### ファイルも一緒に削除する
```sh
git rm [削除したいファイル]
```

### ディレクトリごと削除する
```sh
git rm -r [削除したいディレクトリ]
```

### gitの管理対象からは外すがファイルは残す
--cachedオプションを付けることにより、ファイルを残したまま管理対象から外すことができる。

```sh
git rm —-cached [削除したいファイル]
```

※ ファイルを残した場合は必ず.gitignoreに追記するように。

## マージコミットをcherry-pickする
```sh
git cherry-pick -m 1 [コミットハッシュ]
```

## cherry-pickをコミットせずに取り込む
```
$ git cherry-pick --no-commit [コミットハッシュ]
```

## コミットが属しているブランチ一覧
```sh
git branch --contains [コミットハッシュ]
```

## HEADとINDEXの差分を表示する
```sh
git diff --cached
```

## rebase時に備えてコミットを関連付けておく
rebase時にfixupする予定のコミットをするとき、下記のように対象のコミットを `fixup` オプションで指定しておく

```
$ git commit --fixup=<target commit>
```

するとrebase時に自動的にソートされてfixupコマンドが指定される

```
$ git rebase -i --autosquash <commit>

pick 0b4d33848 hoge
fixup 4e644a862 fixup! fuga
pick da7553cfe piyo
```

## 特定ファイルのログを見る

```
$ git log -p <filepath>
```

## addを取り消す（stageから除外する）
```
$ git reset HEAD <filepath>
```

## 特定ファイルのみHEADに戻す
```
$ git checkout HEAD -- <対象ファイル>
```

## untracked fileを削除する
git clean のオプションについてのまとめ | gotohayato.com - https://gotohayato.com/content/104/

```
# 強制削除
$ git clean -f

# ディレクトリが含まれる時
$ git clean -df
```
phpで動的に透過gif

# 透過gif
透過gifはツールを使えば作れるのだけどphpで動的に作れるかと調べたところ、サンプルもあったので自分なりに確認して忘れないようにメモ。

# インストール

```debian``` 系のインストール、```centos``` でも ```yum``` でモジュールは一緒かな？（未確認）

```text
# apt-get -y install php5 php5-gd
```

# サンプル

## phpサンプル

```php``` ドキュメントのサンプルをほぼそのまま。

```php:gif.php
// 新しい画像のインスタンスを作成します
$im = imagecreatetruecolor(100, 100);

// 背景を白にします
$white = imagecolorallocate($im, 255,255,255);
imagefilledrectangle($im, 0,0,99,99, $white);

// テキスト文字列を画像の上に描画します
imagestring($im, 3, 20, 20, 'GD Library', 0xFFBA00);

// 透明色を指定
imagecolortransparent($im, $white);

// 画像をブラウザに出力します
header('Content-Type: image/gif');
imagegif($im);
imagedestroy($im);                  
```

## htmlサンプル

```gif``` だけ表示しても透過の具合が分からないので、背景色を付けて呼んでみます。

```html:gif.html
<html>
<head>
</head>
<body>
<table border="1">
<tr style="background-color:#CC0066;">
    <td><img src="/gif.php"></td>
</tr>
<tr style="background-color:#CC0066;">
   <td>sample</td>
</tr>
</table>
</body>
</html>
```

## 実際の表示

同じフォルダに置いて、```gif.html```を呼ぶと透過になっていますね。

![スクリーンショット 2015-12-01 8.24.18.png](https://qiita-image-store.s3.amazonaws.com/0/12727/44ddbad9-290e-fd0a-a3c4-e882c616368d.png)


# 参考サイト
[imagecolortransparent](http://php.net/manual/ja/function.imagecolortransparent.php)
ATOMでの日本語改行問題を解決

最近ATOMを使い始めて、日本語の改行がイケてなくいらいらしたので・・・備忘のためメモ

導入手順

- [ ] Atom > PreferencesでSettingをひらく
- [ ] Soft WrapとSoft Wrap At Preferred Line Lengthにチェックをつける
- [ ] Installでjapanese-wrapを検索してインストール
- [ ] 上記すべてが終わったら、ATOMを再起動
iOS で、要素をタッチしてもクリックイベントが発生しない問題への対処


業務でウェブサイトを作成していて、iPhone、iPadでフローティングの枠外を押した時に閉じる処理が作用しないという問題に遭遇しました。

```js
$(document).on('click', function() {
	// ポップアップを閉じる処理
});
```

# 原因

HTMLで通常クリックが期待される要素以外ではイベントが発生しない。
そのため、クリックイベントを書いてもその処理が行われることがない。

## クリックされることが期待される要素

button 要素、a 要素など

## クリックされることが期待されない要素

div 要素、span 要素、p 要素 など


# 解決方法

下記の方法だけではありませんが、最も簡単と思われる方法を２つ挙げます。

## 1. cursor:pointer のスタイルを指定

こちらは問題を調べたらすぐに出てきた解決方法です。
下記の理由からこちらの解決方法をとることはやめました。

+ 実際には見えないが、カーソルが常に指型カーソルになっていると思うと、個人的には気持ち悪い


```css
<style>
.container {
  cursor:pointer;
}
</style>
```


## 2. 空のイベントハンドラを指定
html または js にどちらに書いてもかまいませんが、 __body よりも下の要素__ に指定してください。

### htmlに記述する

```html
<div class="container" onclick=""></div>
```

### jsに記述する

```js
$('.container').on('click', function(){});
```
技術英語 > they have an extremely porous [outer covering]. / outermost part of skin

@ Star Trek Voyager > ELOGIUM

新種の生物の調査にてChakotayが

> they have an extremely porous <font color=red>outer covering</font>. My guest would be that they absorb nutrients directly from space.

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=outer+part
> outermost part of skin

限定用法の「of the skin」が正しいような気がするが、分からない。未消化。
MacPortsのlibxml2とlibxsltを使ってNokogiriをインストール

Nokogiriの公式ドキュメント 
http://www.nokogiri.org/tutorials/installing_nokogiri.html#mac_os_x では、まずhomebrew 0.9.5+で依存ライブラリをインストールするように説明されているけどあえてMacPortsでインストールしてみる。

依存ライブラリは以下の3つ。

- libxml2
- libxslt
- libiconv

インストールするには以下のコマンドを実行する。

```bash
$ sudo port install libxml2 libxslt libiconv
```

MacPortsでインストールしたライブラリのヘッダは`/opt/local/include/`とかに入る。さっきインストールした依存ライブラリのヘッダの場所を`gem`に教えてあげる。`gem`コマンドや`bundle install`で指定する指定するオプションは以下のとおり。

- `--use-system-libraries=true`
- `--with-xml2-include=/opt/local/include/libxml2`
- `--with-xslt-include=/opt/local/include/libxslt`

`gem`コマンドの場合

```bash
gem install nokogiri -- --use-system-libraries=true --with-xml2-include=/opt/local/include/libxml2 --with-xslt-include=/opt/local/include/libxslt
```

`bundle install`の場合

```bash
$ bundle config build.nokogiri --use-system-libraries=true --with-xml2-include=/opt/local/include/libxml2 --with-xslt-include=/opt/local/include/libxslt
```

を実行すると以下のファイルにnokogiri用の設定が書き込まれる。

```~/.bundle/config
BUNDLE_BUILD__NOKOGIRI: "--use-system-libraries=true --with-xml2-include=/opt/local/include/libxml2 --with-xslt-include=/opt/local/include/libxslt"
```

それをふまえて以下のコマンドを実行する。

```bash
bundle install
```

## `gmkdir`に関するエラーが出た場合

ログをよく見ると`gmkdir`を叩こうとして失敗していた。

```
make: /opt/local/bin/gmkdir: No such file or directory
```

`gmkdir`はThe GNU Core Utilitiesに入っているコマンドで`mkdir`のGNU版らしい。コマンド名のprefixに`g`がついている。

The GNU Core Utilities（coreutils）をインストールすれば良いっぽい。

```
sudo port install coreutils
```
iOSのパッケージ管理ツールCocoaPodsを導入する


インストール

```
$ sudo gem install cocoapods
```

セットアップ

```
$ pod setup
Setting up CocoaPods master repo
Setup completed

$ pod --version
0.39.0
```

コマンドはこんな感じ

```
$ pod --help
Usage:

    $ pod COMMAND

      CocoaPods, the Cocoa library package manager.

Commands:

    + cache      Manipulate the CocoaPods cache
    + init       Generate a Podfile for the current directory.
    + install    Install project dependencies to Podfile.lock versions
    + ipc        Inter-process communication
    + lib        Develop pods
    + list       List pods
    + outdated   Show outdated project dependencies
    + plugins    Show available CocoaPods plugins
    + repo       Manage spec-repositories
    + search     Search for pods.
    + setup      Setup the CocoaPods environment
    + spec       Manage pod specs
    + trunk      Interact with the CocoaPods API (e.g. publishing new specs)
    + try        Try a Pod!
    + update     Update outdated project dependencies and create new Podfile.lock

Options:

    --silent     Show nothing
    --version    Show the version of the tool
    --verbose    Show more debugging information
    --no-ansi    Show output without ANSI codes
    --help       Show help banner of specified command
```

作業ディレクトリに移動しinitコマンドを打つと、Podfileが生成される

```
$ cd (pj directory)
$ pod init
```

Podfileにインストールしたいパッケージを追記

```
$ cat Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '8.0'
# Uncomment this line if you're using Swift
# use_frameworks!

target 'todoSample' do
  pod 'MagicalRecord' #追記
end

target 'todoSampleTests' do

end

target 'todoSampleUITests' do

end
```

インストールすると、Podfile.lock、Podsディレクトリ、(pj名).xcworkspaceディレクトリが生成される

```
$ pod install
```

XCodeから(pj名).xcworkspaceディレクトリをopenしてからXCodeを開きなおすと、XCode上に表示される

参考資料
[CocoaPodsの使い方、iOSライブラリの管理ツール | EasyRamble](http://easyramble.com/how-to-use-cocoapods.html)
Firefox Firemacsの主要キーアサイン

# 概略
+ 閲覧での使用は、次の主要アサインだけでも、かなり効率があがります。j,kで画面の上下、h,lでタブの左右の移動ができます。F,Bでページの画面の前後を移動できます。あと使うのは、検索バーへの移動キーくらいかと思います。
+ 入力フォームの中での編集作業は、基本的にEmacs互換となっているので、違和感はないです。
+ ボタン、フォーム移動のキーは動作しないサイトも多いです。

## 閲覧

| Key           | 内容           | メモ |
|:----------:|:------------|:------------|
|h|左タブ移動(TAB)|開かれているタブの移動
|j|ライン下移動|現在のページの中の移動
|k|ライン上移動|現在のページの中の移動
|l|右タブ移動(TAB)|開かれているタブの移動
|b|ページダウン|現在のページの中の移動
|u|ページアップ|現在のページの中の移動
|F|次のページ|現在のページから、すでに表示した次のページへの移動
|B|前のページ|現在のページから、すでに表示した前のページへの移動
|<|トップラインへの移動|現在のページの中の移動
|>|ボトムラインへの移動|現在のページの中の移動
|C-s|ページ内サーチ|
|C-x l|URLバーへの移動|
|C-x g|検索バーへの移動|

## 編集

| Key           | 内容           | メモ |
|:----------:|:------------|:------------|
|C-p|前のラインへの移動|
|C-n|次のラインへの移動|
|C-b|一文字バック|
|C-f|一文字進む|
|C-a|行頭|
|C-e|行最後|
|M-f|一単語進む|
|M-b|一単語後ろ|
|M-d|単語の削除|
|C-i|範囲指定のスタート|
|C-g|範囲指定の中止|範囲指定をやり直す
|C-w|範囲指定したところを削除|削除した部分はBuｆへ入り、C-yでコピーできる。
|M-w|範囲指定したところをbufへ|削除しないでコピーするとき使う
|C-y|Bufをペースト（コピーする）|
|C-d|次の文字を削除|
|C-h|後ろの文字を削除|
|C-k|その位置から後ろ側分の行を削除|行の途中から削除する。一行削除するときは、行頭に移動してから使用する。
|C-u|その位置から前部分の行を削除|
|M-<|トップラインへ|
|M->|ボトムラインへ|
|C-x u|やり直し|
|M-v|画面アップ|主に編集画面での画面アップ
|C-v|画面ダウン|主に編集画面での画面ダウン
|C-x t|最初の入力フィールドへの移動|
|C-x s|最初のボタンへの移動|
|C-x k|タブを閉じる|
OS X El Capitanの日本語IMが重たくなったら

OS X El Capitanをしばらく使っていると日本語入力の仮名漢字変換が使い物にならないレベルで重たくなることがある。

Activity Monitorを起動してみるとJapanese Input Methodというプロセスが変換の度にCPUを40%くらい食っていることがわかった。

これをQuitしてやったら元の早さが復活した:+1:
FileMakerをお得にはじめてみる

[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の1日目

FileMakerをはじめるためには、FileMakerを購入しなければなりません
もちろん無料評価版もありますが...
そんな時、おはじめのハードルを少しでも下げるためにお得なキャンペーンを使わない手はありません

![スクリーンショット 2015-11-13 4.39.46.png](https://qiita-image-store.s3.amazonaws.com/0/89027/a2a9761f-a21e-d109-03d6-cd46e6e7452c.png)

- 追加でもうひとつ利用できるFileMaker Pro 14またはFileMaker Pro 14 Advancedのダウンロード製品とそのライセンスキーを取得できるこのオファーをご利用いただけるのは、個人／家庭／会社もしくは組織ひとつにつき、**1回まで**に限られます。
- このオファーでは、FileMaker Pro 14もしくは FileMaker Pro 14 Advancedの**いずれかひとつだけ**対象になります。   

今回のキャンペーンは**2015年12月18日**までですが、このキャンペーンは時々やっていますし、これ以外にもいろいろお得なキャンペーンをやっていることがあるので[FileMaker公式ページ](http://www.filemaker.com/jp/)もたまにチェックしておくと良いかもです
Typed Racketの簡単過ぎる紹介 ~静的型のLisp~ (後日加筆更新予定)

さて、はじまりました。Lisp Advent Calendarです。

今回は初日であるのと、私自身,他のAdvent Calendarが被ってしまったのと、Splatoonのせいで、かなり雑を書きますがご容赦ください。(後日加筆していきます。)

最初の一日目は気楽に書いて行こうかと思います。
最近、Typed Racketをなんとなく書いているので、
なんとなく、Typed Racketを紹介して行こうかと考えています。


# Typed Racket入門

## 静的片付けのLisp?

さて、殆どのLisp方言は、動的型付けの言語であり、静的型付けのLispはなかなか珍しいですね。他に、Shenなどもあります。

### Typed Racket

typed racketはLisp系の言語でも珍しく、静的な型付け言語です。

## 簡単なサンプルと型のエラー

適当に雑な例を書いてみました。
型を付けないバージョン

```rkt 
#lang racket

(struct complex-number
  (real image))

(define (magnitude complex-number)
  (sqr (+ (expt (complex-number-real complex-number) 2)
          (expt (complex-number-image complex-number) 2))))

```


型付けバージョン

```rkt
#lang typed/racket

(struct complex-number
  ([ real : Real ]
   [ image : Real ]))

(: magnitude (-> complex-number Real))
(define (magnitude complex-number)
  (sqr (+ (expt (complex-number-real complex-number) 2)
          (expt (complex-number-image complex-number) 2))))
```

さて、エラーはこんな感じで表示されます。

```rkt
> (string-length 10)
. Type Checker: type mismatch
  expected: String
  given: Positive-Byte in: 10
```
kodi 1.5.2の日本語化ではまりました…


#はじめに
Fire TV StickへのKodiのインストールで、特に日本語化の部分についてはまったので、それをまとめています。
(Fire TVへのKodiインストール方法は、すでに情報が多数あると思いますので、そちらをご参考くださいませ :kissing_heart: )

#Why Kodi?
ラズパイ＋NASでDLNAサーバ化しましたが、dlnaでは動画のサムネイルが表示されません。
ホームビデオを見ようとしても、ファイル名は数字の羅列なのでいつ・どこで撮ったビデオか変わりません。
で、ちょうどプライムビデオ視聴用にFire TV Stickを買ったので、それにインストールして試してみました。

#kodiの日本語化

##まずは、フォントをArial Baseに
（これは情報多数のため、方法は省略）
先にこれをしておかないと、日本語が化けて表示されるそうです。

##次に日本語アドオンをインストール
（インストール方法は省略）
…が、"Install Faild"と表示され、インストールに失敗します。
何度やっても同じです。

Fire TV上でのログの見方がいまいち分からないので、原因不明でした…
（ログの見方は、後日調査予定）

##Windows上のKodiにも試してみた
Windows 8.1にKodiをインストールし、同様に日本語アドオンをインストールしてみましたが、同様に"Install Faild"の表示でした。

##Windowsのログを調べてみる
WindowsのKodiのログは、デフォルトで以下の場所にあります。

```
C:\Users\(ユーザ名)\AppData\Roaming\Kodi\kodi.log
```

ログ上では、

http://mirrors.kodi.tv/addons/isengard/resource.language.ja_jp/resource.language.ja_jp-1.0.4.zip

にアクセスし、「502 Bad Gateway」ではじかれているようでした。
（ログ保存するの忘れました… :cry: ）

Windows上のWebブラウザ(Chrome)で上記URLを直アクセスしても、同様の結果です。

#解決法
kodiのフォーラムより、他のmirrorサイトでダウンロードできる可能性があることがわかりました。
(http://forum.kodi.tv/showthread.php?tid=237874&page=3)

フォーラムの情報では、国によって正常にアクセスできる地域とそうでない地域（日本や韓国など？）に分かれているそうです。

#結果
Windows 上でしかまだ試していませんが、下記URLではzipファイルを正常にダウンロードできました。

http://trumpetti.atm.tut.fi/xbmc/addons/isengard/resource.language.ja_jp/resource.language.ja_jp-1.0.4.zip

こちらをWindowsのローカルに保存し、ローカルからKodiにインストールして無事日本語化完了です。

#おしまい

どうもお粗末様でした…
JavaScript入門 1. はじめてのJavaScript<個人メモ>

1. Hello World!をアラートに表示
 `<!DOCTYPE html>
 <html lang="ja">
 <head>
　　　<meta charset="utf-8">
　　　<title>JavaScript</title>
 </head>
 <body>
　　　<script>
　　　　　　alert("Hello World!");
　　　</script>
 </body>
 </html>`
 
2. JavaScriptのコメント
 //  1行だけのコメント
 /* 〜 */ 複数行に渡るコメント
 
3. 外部ファイルの使用
 HTMLのヘッダーに以下のリンクを挿入
 `<script type="text/javascript" src="JSファイルのパス"></script>`
AWS IoT for Arduino SDKについて


AWS IoTのAdvent Calendar 2015の１日目を担当します（[@saicologic](http://qiita.com/saicologic)）です。

[AWS IoT](https://aws.amazon.com/jp/iot/how-it-works/)使ってますか？

AWS IoTとは、さまざまなデバイスの管理やデータ通信の保護、デバイスのオフライン状態などを管理できる、AWSのクラウドサービスの一つです。まだ2015年10月8日にリリースしたばかりでβ版の状態です。

さて、このAWS IoT、他のAWSのサービスと違ってPythonとかPHPのSDKがありません。IoT用ですからね、もちろん動作させる先は、さまざまなデバイスの上です。デバイスっていうと入門的なデバイスとしてRaspberry Pi、Arduino、Intel Edison、ESP8266があります。そして、用意されているSDKは、組み込み用(Embedded C)、Javascript(Node.js)、Arduinoの３つです。

僕はさっそく手元にあるArduinoを使ってAWS IoTを早速試してみようと思いました。
みなさんも手始めにArduinoが同梱されているスターターキットを買ったのでないでしょうか？
私も買って手元に一台あります。しかし、同梱されているのはArudino Unoです。
しかし、残念ながらこのタイプのArduinoはAWS IoTで動きません！　
AWS IoTで対応しているのは、しっかりと`Arduino YUN`って書いてあります。こちら[AWS IoT デバイス SDK](https://aws.amazon.com/jp/iot/sdk/)に記載されています。Arduinoだったら何でも動くんちゃうのって思ってたんですが、調べると、[Support for ESP8266 and Arduino?](https://github.com/aws/aws-iot-device-sdk-arduino-yun/issues/2)に、書いてありました。

```
The AWS IoT device SDK needs an existing TCP/IP stack, TLS implementation and crypto library. The C-SDK (aws-iot-device-sdk-embedded-C) shows how to modify the C-SDK to run on either mbedTLS or openSSL. The implementation of TLS1.2 with mutual authentication using client certificates (as used by AWS IoT platform) requires a certain amount of memory that only few Arduinos meet.

The Arduino Yun features a 2 processor architecture where only the application sketch runs on the smaller ATmega processor while TLS, MQTT and crypto tasks are offloaded to the large controller. Thereby the Arduino Yun SDK is very specific for this particular board.
```

あーなんか、暗号処理のために、一定量のメモリーが必要って書いてありますね。また、TLS、MQTT、暗号化に必要な処理は、large controllerへオフロードしていると書いてあります。

ところで、`Arduino Yun`ってなに？

詳細はこちらの[Arduino Products](https://www.arduino.cc/en/Main/Products)に掲載されています。
[Arudino UNO](https://www.arduino.cc/en/Main/ArduinoBoardUno)は、ENTRY LEVEL。
[Arduino Yun](https://www.arduino.cc/en/Main/ArduinoBoardYun)は、INTERNET OF THINS
にカテゴリー分けされてますね。

チップと価格比較はこちら

|　|Arduino UNO R3  |Arduino YUN|
|----|-----|-----|
|Microcontroller|ATmega328P|ATmega32U4|
|Price(スイッチサイエンス)|[3240円](https://www.switch-science.com/catalog/789/)|[9990円](https://www.switch-science.com/catalog/2210/)|

AVRマイコン自体はだいたい一緒ですが、YUNには、AVRマイコンの他に、Linux Microprocessorが搭載されています。このチップがあるおかげでAWS IoTが使えるんですね。ということで、Raspberry Piを持っている人は、Node.jsが動くので、[aws-iot-device-sdk-js](https://github.com/aws/aws-iot-device-sdk-js)がおすすめです。手元にたまたまArduino YUNを持っているか、Arduino IDEで試したい！という人は、Arduino Yunを買って[aws-iot-device-sdk-arduino-yun](https://github.com/aws/aws-iot-device-sdk-arduino-yun)を試すのがいいでしょう。
私は、Raspberry Piも持っているので、次回は、aws-iot-device-sdk-jsを試して見た記事を書きたいと思います！
Live2D事始め！

[Live2D Advent Calendar 2015](http://www.adventar.org/calendars/935)の1日目の記事です！

1日目なのでLive2D入門について軽く書こうと思います。
自分が初めてLive2Dに触った時は、Live2Dのミク本で勉強しました。
2年前はまだ便利機能がなく大変でしたが、今はソフトがバージョンアップして使いやすくなっています。

#テンプレート機能で簡単モデリングしてみる
今なら5ステップぐらいで簡単にモデリングできます

１）PSDインポート
　PSDをインポートするだけでポリゴン割りが完了！
　![001.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/2d4f2745-c2e8-4ee7-4e84-725c089ac6ef.gif)

２）テンプレートを適用
　テンプレートを適用するだけでモデリング工程が大幅に短縮できます
　![002.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/ec6a6611-2e85-bf57-9fa6-67db84772a00.gif)

３）パーツを関連付ける
　パーツ関連付きがずれてるものを合わます（この場合は髪と腕が関連付いてしまってる）
　<img width="500" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/20d6ca5a-7b85-9c12-5973-e0c3ee9a7f9e.png">

４）動かしてみておかしい部分の修正
　白い点を動かしてまぶたが閉じるように修正
　<img width="300" alt="004.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/8b3c7cf7-a262-becd-4a9e-7b9b22e79f3f.png">

５）Viewerで表示する
　[Live2D Viewer](http://sites.cybernoids.jp/cubism2/tools/live2d-viewer)で表示するともうぬるぬると動いてますっ！
　![005.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/d65f5430-1964-6852-c802-1fd70cbe4237.gif)

パーツを切り分けたり絵を描く部分は大変ですが、動く所までやるとモチベーションが上がりますよ♪

#オススメの学習法
入門チュートリアルページもありますが、動画入門を見るのがおススメです。
（自分も去年Live2Dセミナーで各地を回る前にこれを見ました）

[・Live2D実習講座「2日間で基礎をマスター！」](http://sites.cybernoids.jp/cubism2/video/workshop)
<img width="460" alt="006.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/0d095768-2a23-718d-e5a1-619689322ff8.png">


上級者を目指す方はユーザチュートリアルもあるので、参考にしてみて下さい。

[・Live2D上級者に学ぼう！ユーザーチュートリアル＆メイキング](http://sites.cybernoids.jp/cubism2/user_tutorials)
![007.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/4bac4f73-0e78-d373-fcad-ef9d7c6faead.gif)

#Live2D作品を見てみる
ユーザが作ったモデルをアップできるサイトもあります。
モデルをDLして研究するのもいいと思います。

[・Live2D Library](http://library.live2d.com/)

また、TwitterでのLive2D作品など自分が集めてるので参考にしてみて下さい

[・togetter - Live2D作品とか色々](http://togetter.com/li/892057)

#セミナーや勉強会など
1人では続けられない、誰かに教えてほしい人はセミナーや勉強会に参加するといいです。
東京はちょくちょくセミナーしてます（または要望を出せば開催すると思う）

[・Live2D × After Effects 動くイラスト編（1/12）](http://connpass.com/event/10881/)
[・Live2Dモデリング部（4/25）](http://www.zusaar.com/event/12917004)
[・Live2Dプログラミング部（5/9）](http://www.zusaar.com/event/12917005)
[・初めてのLive2Dセミナー（8/6）](http://connpass.com/event/18024/)
[・絵描きさん向けLive2Dセミナー（9/26）](http://peatix.com/event/114884/)
[・初めてのLive2Dセミナー（10/9）](http://connpass.com/event/20486/)
[・絵描きさんLive2D入門講座（11/3）](https://mangaoukoku-tosa.jp/articles/page.php?ID=1342)

また、Live2Dクリエイターの方も勉強会など主催してくれてたりします。

[・Live2Dで遊んでみる会](https://enjoying-live2d.doorkeeper.jp/)
　→　Live2Dモデリング・プログラミング経験豊富な[やっちゃんさん](https://twitter.com/y_a_s_l2d)も個人参加でサポートしてくれます！

大阪なら[関ゲ部](http://kangebu.jimdo.com/)の[Live2Dお絵描き会](https://atnd.org/users/99567)がおススメ！
　→　こちらは部長のこなべさんがお絵描き兼Live2D入門を開いてくれてます！

#困ったら・・・
困ったらLive2Dフォーラムに相談してみて下さい。
英語でも日本語でも書き込んでくれればだいたい誰かがすぐ返事してくれます。

[・Live2Dコミュニティ（日本語コミュニティ）](http://forum.live2d.com/)
[・Live2D Community（英語コミュニティ）](http://community.live2d.com/)

以上、簡単な紹介記事でしたが参考になればいいです。
明日は神吉（rikak）さん、宜しくお願いしまーす！
YOUR.Sunday

# PHPFUK15

今年は6/27に行われた記念すべき第一回[PHPカンファレンス福岡](http://phpcon.fukuoka.jp/
)で基調講演をする機会をいただきました。去年の大阪に引き続いてタイトルは同じ「[全てを結ぶ力](http://koriym.github.io/blog/2015/07/01/phpconfuk2015/)」でしたが基調講演に続いて[YOUR.Sunday](https://speakerdeck.com/koriym/your-dot-sunday) というタイトルでもセッションを行いました。

その中で「解法ではなく問題を」という問いかけを行い、一つの仮定をしてみました。PHPのフレームワークは数はたくさんあるが、Webの**問題**の捉え方は同じで問題解決の構造は本質的にどれも変わらない。**解法**には方言や方針があるが重要なのは[問題をどう見るか](http://billkerr2.blogspot.jp/2009/07/iq-is-lead-knowledge-is-silver-outlook.html)ではないかというものです。

(どのフレームワークか分かりますか？）

<img width="462" alt="スクリーンショット 2015-12-01 1.18.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/3940/8323d0a0-d0dc-b5c7-0ad0-28f48585cd18.png">


# 構造を

フレームワークの本来の価値は利便性より問題解決の構造にあると考えば、新しいアイデアに基づいた新しいフレームワークの存在価値があります。

BEAR.Sundayは「RESTfulなアプリケーションは内部もRESTfulにすれば良いのでは？」というな考えが設計のベースになっていていますが、他に[Aura](http://auraphp.com/)の[ADRパターン](https://github.com/pmjones/adr)や[CQRS](http://martinfowler.com/bliki/CQRS.html)をベースにした[litecqrs-php](https://github.com/beberlei/litecqrs-php)というフレームワークを紹介しました。これらはWebの**問題**を従来とは別の捉え方で捉えたものです。PSR７ミドルウエアフレームワークも**HTTPメッセージ**を軸にして問題を捉えています。

# YOUR.Sunday

`Slim`に似たマイクロフレームワークを新たに作成する意味は薄いですが、既存の「コントローラーが"モデル"からデータを受け取ってテンプレートで表示する"MVC"」ではないもの、新しいアイデアに基づいたものや、ドメインに応じたフレームワークを作ることには意味があります。

早く簡単に記述できる利便性は確かに価値の１つですが、自分のドメインの価値は何かを改めて問い、Webの問題をよりよく解決することにも意味があります。

現在の`composer` / `Packagist`のコンポーネントはそれを後押しします。ルーターやテンプレートエンジン、DIやORMを自作する必要はありません。本来はそれらは独立したコンポーネントとして存在できるもので、密結合したフレームワークの専用品として存在しなくてもいいものです。

BEAR.Sundayのようにフレームワークを作ることもできます。それがセッションのタイトルの"YOUR.Sunday"です。一方、BEAR.Sundayを自らのドメインフレームワークのベースとして使うことができます。使用するコンポーネントをDIで束縛して、アプリケーションのユースケースをAOPで記述します。HTML WebアプリケーションからSPAに移行することがあってもコンテキストだけを変更して、アプリケーションはほぼそのまま使用することができます。

BEAR.Sundayにはその柔軟性と力があります。
サーバーのサービスを自動的にチェックするスクリプト

ホスチングサーバーほとんどは99.9%のサーバーアップタイムを保証してますが、0.1%のダウンを避けるため、あるいはサーバー混乱でapacheやmysqlが落ちるのを防止するため、このスクリプトが役に立ちます。

##Shellscriptでサービス状況を確認

```bash:servicecheck.sh
#!/bin/bash

#確認したいサービス
services=( "httpd" "mysqld" )

for service in "${services[@]}"
do
if (( $(ps -ef | grep -v grep | grep $service | wc -l) == 0 ))
then
	/etc/init.d/$service restart
fi
done
```
確認したいサービス`httpd`と`mysqld`をループしてサービスの状態を確認します。`0`は動いてない状態ですから再起動しておきます。

##再起動した際システム担当にメール送信（任意）
```bash:servicecheck.sh
#現在の時間
now=$(date +"%F %H:%M:%S")
#システム担当のメールアドレス
email="system@admin.com"

if [ $restartflg -gt 0 ]
then
	printf "services are downed and automatically restarted on $now" | 
	mail -s "System Message: service restarted" $email
fi
```
`if`行の`$restartflg`は再起動したかどうかを判断するフラッグです。先の再起動する`if`の中に`restartflg=1`、`for`の前に`restartflg=0`を書きます。つまりこうなります。

```bash:servicecheck-ver2.sh
#!/bin/bash

#確認したいサービス
services=( "httpd" "mysqld" )

restartflg=0
for service in "${services[@]}"
do
if (( $(ps -ef | grep -v grep | grep $service | wc -l) == 0 ))
then
	/etc/init.d/$service restart
	restartflg=1
fi
done

#現在の時間
now=$(date +"%F %H:%M:%S")
#システム担当のメールアドレス
email="system@admin.com"

if [ $restartflg -gt 0 ]
then
	printf "services are downed and automatically restarted on $now" | 
	mail -s "System Message: service restarted" $email
fi
```

##メモリスペースの確認（任意）
```bash:servicecheck.sh
if (( $(free -m | grep -i "mem" | awk '{print $4}') < 100 ))
then
	eval $(echo 3 > /proc/sys/vm/drop_caches)
fi
```
[メモリ・キャッシュ削除する](http://qiita.com/zayarwinttun/items/08d32ead8949f1cd9eb3) コマンドです。1行目はフリーメモリが100mbより少ない場合を確認し、真だったら一旦クリアします。

##最後はCronに追加で自動化（必須）
`crontab -e`でcronを好みのテキストエディタで編集します。

```shell-session:crontab
MAILTO=""
* * * * * bash /スクリプトの場所/servicecheck.sh
```
`sudo service crond restart`でcronを再起動します。

これでスクリプトを毎分実行するようにしました。ちなみに、cronが実行する時システムメールがデフォルトでログされます。毎分実行するので1日1440回メールが送られます。`/var/mail/ユーザー名`に書き込んちゃいますので大したことがないですが、必要ないなら1行目の`MAILTO=""`で解決できます。
**メモリ・キャッシュ削除するコマンドはroot権限が必要になりますので、cronをrootから設定しないとできないみたい。**

スクリプトを[Gist](https://gist.github.com/zayarwinttun/d5e46311afca038eddb8)からもダウンロードできますよ。

じゃねー
Cマクロによる似非lambda

C言語への感謝の正拳突き 1日目です。

#概要

タイトルは「マクロによる似非lambda」とか偉そうなことを言ってますが、
要はマクロを使って重複した宣言や記述を取り除ためのtipsの紹介です。

冗長な関数定義、switchのcase定義、structの定義
などにおける繰り返しを除去し、マクロを使って一ヶ所に纏めることができます。

似非lambdaは3ステップから構成されています。
(1) 繰り返し要素のリストを定義するマクロ
(2) 手続きを定義するマクロ
(3) リストのマクロを手続きのマクロを使って展開する
# 具体例

Dart SDK(ただしこいつはC++)から引用しました。

```C:dart/runtime/vm/method_recognizer.h

#define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \  ...(1)
  V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger, 438687793) \
  V(_IntegerImplementation, +, Integer_add, 1324179652)                        \
  V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger, 562800077)\
  ...
```

(1) CORE_INTEGER_LIB_INTRINSIC_LISTマクロによりINTRINSICの一覧を定義しています。

```C:dart/runtime/vm/intrinsifier.cc

#define SETUP_FUNCTION(class_name, function_name, destination, fp)             \  ...(2)
  if (strcmp(#class_name, "::") == 0) {                                        \
    str = String::New(#function_name);                                         \
    func = lib.LookupFunctionAllowPrivate(str);                                \
  }

  // Set up all core lib functions that can be intrisified.
  lib = Library::CoreLibrary();
  CORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION);                                ...(3)
```

(2) SETUP_FUNCTIONマクロにより、展開する手続きを定義しています。
SETUP_FUNCTIONの仮引数は4つありますが、CORE_INTEGER_LIB_INTRINSIC_LISTの実引数4つに対応しているのがポイントです。

(3)はCORE_INTEGER_LIB_INTRINSIC_LIST(SETUP_FUNCTION)の行です。
CORE_INTEGER_LIB_INTRINSIC_LISTで定義した要素分、
SETUP_FUNCTIONのifの式を展開することができます。

```C:dart/runtime/vm/intrinsifier.cc
#define EMIT_CASE(class_name, function_name, enum_name, fp)                    \  ...(2)
    case MethodRecognizer::k##enum_name:                                       \
      compiler->assembler()->Comment("Intrinsic");                             \
      enum_name(compiler->assembler());                                        \
      break;

  // Integer intrinsics are in the core library, but we dont want to
  // intrinsify when Smi > 32 bits if we are looking for javascript integer
  // overflow.
  if (!(FLAG_throw_on_javascript_int_overflow && (Smi::kBits >= 32))) {
    switch (function.recognized_kind()) {
      CORE_INTEGER_LIB_INTRINSIC_LIST(EMIT_CASE)                                 ...(3)
      default:
        break;
    }
  }

```
こちらの例は、(2)でcase式を定義し、(3)でswitchのブロック内にcase式をリスト数分展開しています。

Dart SDKはC++ですが、ソースコードを引用したのはわかりやすい名前をつけているからです。

# 注意点

(1) 非常にわかりやすいシンプルな例を上げましたが、調子にのって複雑な使い方をすると痛い目にあいます。
gcc/clangのプリプロセッサでは置換できるけれども、windows clでは置換に失敗するケースに出会うことがあります。マクロの使いすぎには注意しましょう。

(2) 思ったとおりに展開されないと思ったら、プリプロセス結果を出力しておいて目視確認です。

(3) マクロで書かれた手続きの実行時デバッグは非常に困難です。プリプロセッサで1行に置換されてしまいますし、デバッガは行単位でのstep実行しかサポートしていないからです。そのためstep実行したときに止まりSEGVするのは(3)で示した行だけです。

(4) マクロを使った小手先の共通化や抽象化より、C++のテンプレートのほうが良い場合が多いため、ModernなC++の使用を検討しましょう。

このマクロ置換方法の名前をご存知の方、教えていただけるとうれしいです。

以上
Enumerable#flat_mapの動作


[リファレンス](http://docs.ruby-lang.org/ja/2.2.0/method/Enumerable/i/collect_concat.html)では下のような説明になっています。
>各要素をブロックに渡し、その返り値を連結した配列を返します。
>ブロックの返り値は基本的に配列を返すべきです。
>
>ブロックを省略した場合は、ブロックを受けとり 上で説明した評価をし、その結果の配列を返すEnumerator オブジェクトを返します。

つまり、flatten→mapではなく、map→flatten。

```ruby
[1]pry(main)> a = [[1, 2], [3, 4], [5, 6], [7, 8]]
[2]pry(main)> a.map{|i| i.inject{|sum, j| sum += j}}.flatten
=> [3, 7, 11, 15]
[3]pry(main)> a.flat_map{|i| i.inject{|sum, j| sum += j}}
=> [3, 7, 11, 15]
```

flattenがおしりにぶら下がるようなコードは余り美しくない（主観）ので、積極的にリファクタリングしてもいいような気がします。

それから、flat_mapが導入されたことでArrayがListモナドとして働くらしいですが、そもそもListモナドって何？ と言うところからになってしまってよく判りません。自己関手の圏におけるモノイド対象ってなんですか？
Windows使いが手軽に使えるMacの小技

いよいよ始まりました！
[★若葉組のつぶやき★ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/adv_young_leaves) のトップバッターをを担当します！

# テキスト操作
・「command」はWindowsキーボードで同じような場所にある「ctrl」と同じように使える場合がほとんどです。
・少し上にある「control」ではないです。


# デスクトップ表示
・画面の四隅にマウスポインタを持っていくとデスクトップを表示してくれます。
　もう一度マウスポインタを持っていくとウィンドが戻ります。

①「システム環境設定」から「Mission Control」を選択
![1201_01.png](https://qiita-image-store.s3.amazonaws.com/0/91552/c9f358b4-f219-9828-830c-107ee36e8efc.png)

![1201_02.png](https://qiita-image-store.s3.amazonaws.com/0/91552/1ddf1f72-c320-7c93-518b-4918f754ae18.png)

②Mission Controlの左下にある「ホットコーナー」を選択
![1201_04.png](https://qiita-image-store.s3.amazonaws.com/0/91552/49ae6551-59b7-789b-ac46-49dc3f655e04.png)

③ホットコーナーでカーソルを四隅に持っていったときのアクションで「デスクトップ」を選択。
![1201_05.png](https://qiita-image-store.s3.amazonaws.com/0/91552/117d14a3-e6be-ddd3-4974-2eeda2b2b053.png)
※全画面表示ではなく、デスクトップの一部が見えている時に有効

# スクリーンショット（画像ファイル出力）
・スクリーンショットをpng形式でデスクトップに保存します。
　　画面全体　command + shift + 3
　　範囲選択　command + shift + 4

# スクリーンショット（クリップボード）
・スクリーンショットをクリップボードに保存します。
　　画面全体　command + shift + control + 3
　　範囲選択　command + shift + control + 4

# バックスラッシュ
　　＼　←これ
　　option + ¥
スレッドとマルチプロセスの比較

*半年間、MySQLを基礎からやり直すことにしたので、その間に勉強したことをQiitaに投稿していきます。*

## スレッドとマルチプロセスの大まかな違い
大きな違いとしては、子スレッドは親とヒープ（グローバルなプログラムデータ）を共有するのに対し、
子プロセスは共有しない

## スレッドのメリット・デメリット
### メリット
- メモリ使用率が低い。
- サーバグローバルデータにアクセスするのに高度なテクニックがいらない。
- 同時実行スレッドによるデータ変更の際も、相互排除ロック（ミューテック）を使用して該当セクションを保護するだけで済む。
- ヒープセグメントをコピーする必要が無いので、プロセスよりもずっと少ない時間で作成できる
- スケジューラのコンテキストスイッチでカーネルが要する時間が、プロセスよりも少ない

### デメリット
- 1つのスレッドがクラッシュするとサーバ全体に影響が及んでしまう
- プログラミングミスが起こりやすい
- スレッドサーバでの同期バグ（共有アドレス空間による）
- ミューテックス競合が起こると収拾がつかなくなる（過度なコンテキストスイッチ発生の原因になる）

## マルチプロセスのメリット・デメリット
### メリット
- 不正なサーバプロセスがあってもサーバ全体へ影響が出ない
- 1つの実行スレッドのみを頭に入れていればよいので、プログラミングミスが起きにくい
- ファントムバグ（意図的に再現できないバグ）が起きる可能性が低い為、バグの再現が容易に行える
- 個々のプロセスで専用のアドレス空間を持つ為、プロセス間での相互作用は大きくならない

### デメリット
- 子プロセスが分岐した場合、大きなメモリセグメントが不要にコピーされる可能性がある
- プロセス間でデータを共有するのに手間がいり、サーバグローバルデータへのアクセスが面倒
- プロセスの作成にカーネルにより多くのオーバヘッドを強いる
- 親プロセスのデータセグメントをコピーしなければならない
- プロセス間のコンテキストスイッチにより多くの時間を消費する

## 考察
接続ハンドラ間で、大量のデータを共有する必要がある（プログラムスキルが高い）場合は、スレッドサーバが向いてているかと個人的には思いました。
Pipelinedbとは

PipelineDBアドベントカレンダー一日目ということで、多分知らない方が多いこのストリーム処理DBについて、概略の紹介をします。
ちなみに自分はまだPipelineDBをプロダクションで使っているわけではなく、AdventCalendarの投稿はプロダクション投入に向けての調査の意味合いが強いです。

## そもそもストリーム処理がなぜ必要か
昨今のWebシステムで生成されるイベントデータやログデータといったものはfluentdなどのログコレクタの発展に伴い様々なデータストアに保存され利用されるようになってきました。
そのサイズは、場合によっては日に数億行という事例も多いですがそうしたデータの利用においては、データを抽出し整形し、DBに導入するだけでもある程度のコスト・時間が必要になってきます。
そうした事例の解決にはHadoop系のプロダクトやRedshiftやBigQueryなどのカラムナー型DBなどが利用されています。これらを使うことで、例えば日の終りに全てのログを走査して集計するなどの処理は以前ほど難しくはなくなりました。
ただし、流れているデータを5分間分だけ集計してシステムにフィードバックするような処理においてはこうしたプロダクトを利用しても間に合わない、もしくはコストに見合わないストレージが必要になることが多々あります。
例えば広告サーバ開発においては未知の商品のCTRを短時間でテストし、適正な配信に活かすためにできるだけ早いログデータの分析とフィードバックが必須となってきています。
そうした場合に、流れているデータをある程度リアルタイムに逐次処理するような仕組みとしてストリーム処理が必要とされています。ストリーム処理であれば、指定した時間枠や量のログデータのみをメモリ上（もしくはディスクの場合もあります）に保持し、小さなストレージで必要とされる処理を実行できます。

こうした用途での製品には[Norikra](http://norikra.github.io/)や[Apache Kafka](http://kafka.apache.org/)、[Amazon Kinesis](https://aws.amazon.com/jp/kinesis/)などがよく使われているのではないでしょうか。
PipelineDBはこうした製品と近しいストリーム処理の仕組みを提供します。

## PipelineDB
### 概要
Official: https://www.pipelinedb.com/
Github: https://github.com/pipelinedb/pipelinedb
Docs: http://docs.pipelinedb.com/introduction.html
紹介記事: http://jp.techcrunch.com/2015/07/08/20150707yc-alum-pipelinedb-releases-open-source-streaming-sql-database/

PipelineDBは端的に表現すると「PostgreSQL互換のクエリでストリームデータへ問い合わせ可能なDB」というと分かりやすいかと思います。
システム上に大量に流れてくるデータをPipelineDB上に流すことで、一定期間分のデータに対するSQL問い合わせを実現し、例えば「直近N時間のクリックイベントの発生数」を集計し続けるような処理が可能です。

特徴として、ストリームを流れてきたデータ自体は保持せず、作成されたContinuousViewという仕組みを通じてストリームデータの集計結果のみを保持するため、DBとしての領域はそれほど必要としません。

```
PipelineDB is designed to excel at SQL queries that reduce the cardinality of streaming datasets.
```

この一文がPipelineDBの特徴を示しており、要は流れてきたデータのカーディナリティを減らして保持することに主眼を置いています。
またストリームデータの導入から集計までの全てをSQLで完結させられることから、ETL、つまりデータの抽出・整形・導入の作業をより簡素にすることが可能です。ETLの苦労を減らすという意味ではFluentdの領域とも近く、相性が良いのではないでしょうか。また、最近はkafkaとのコネクタが出た模様で今後もこうしたコネクタが搭載されていくのではないかと思います。 [LINK](https://www.pipelinedb.com/blog/sql-on-kafka)

ちなみにPipelineDBの開発者Derek Nelsonさんは元々AdRoll社で広告系の開発をしていたとのことです。

### なぜPipelineDBを使うか
今回PipelineDBを選定した一番の理由はSQL文法がPostgreSQL互換という点です。
実務でRedshiftを利用することが多く、いわゆる[ラムダアーキテクチャ](http://lambda-architecture.net/)のような直近のデータと長期間のデータを組み合わせたような分析がやりやすいのではないかという観点でメリットを感じています。
また、データの投入がPostgreSQLで可能なことからfluentdとの連携やその他各言語との連携もし易いことも魅力ではないでしょうか。
また開発も活発であり、今後他製品との連携の強化にも期待しています。

## 次回の自分の担当分について
Advent Calendarの次回担当分では、公式が用意しているサンプルデータを元にPipelineDBを実際に使って見ようかと思います。