OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrantばんざい

開発環境で重宝するのが、Vagrant。
多分、運用だとクラウドだけど、開発はVagrantが無いとやっていけないくらい、使っています。

Vagrantの優れている点

 1.自分のPCにサーバが作れる
 2.本番環境と同じOSの環境で開発が出来る
 3.仮想マシンのディスクイメージ丸ごとより、小さなファイルサイズで配布が可能 
 4.開発チームで同じ環境を共有することが可能
 5.環境構築をプログラムとして作成することが出来る
 6.母艦と仮想間でファイルが共有（同期）出来る
 7.ネットワークが母艦経由で外に繋がる

# 1.自分のPCにサーバが作れる

本番運用のサーバと同じOSの環境を作れるので、開発サーバーを別途iDC等に契約することなく、
自分のPC内にサーバが作れる。
オフラインな環境やネットワークが貧弱な環境でも、開発が可能。

# 2.本番環境と同じOSの環境で開発が出来る

Windowsであれ、Macであれ、Linux系の環境で動かすとなると一番怖いのは、1バイト文字以外の文字を
扱う国に生まれた定めである文字コードの対応なども、本番と同じOSということであれば一応担保が出来る。
あとは、DB周りとかWebサーバ周りとの相性とかも事前に確認が出来るので、本番環境にいざデプロイした時の
不具合の問題から少しは開放される（かも）。

# 3.仮想マシンのディスクイメージ丸ごとより、小さなファイルサイズで配布が可能

VirtualboxやVM Wareを使うので、仮想マシンのディスクイメージはある程度の大きさになるのは仕方無いが、
それでも最低必要限のファイルサイズは小さくまとまっているので、そのファイルを配布することも可能。
だいたい４GBぐらい？

# 4.開発チームで同じ環境を共有することが可能

小さいファイルなら、GitやGithubに登録してしまって、チームで共有してしまえ。ってな感じ。

# 5.環境構築をプログラムとして作成することが出来る

これは結構手間がかかるというか、時間がかかるので、個人的には半信半疑なんだけど
chefを使えば、サーバの初期設定を全てプログラミング可能。
だけど、chefを使うための環境構築で時間がかかったり、chefのレシピ（プログラミング）を
作るにも時間がかかるし、chefの実行速度も結構時間がかかる。
個人的には、シェルスクリプトを用意して仮想サーバを作った後に、仮想サーバとの共有フォルダから
仮想サーバにシェルスクリプトをコピーして、仮想サーバ内で実行するのが一番速いと思う。
今まで、何百台もサーバをセッティングしていると、直接コマンド打ってしまうのが一番速いので、
それをどこまで我慢して、プログラミング出来るかの戦いだったりするｗ

# 6.母艦と仮想間でファイルが共有（同期）出来る

Vagrantfileのオプションで、母艦のフォルダと仮想サーバのフォルダを共有（同期）することが出来るので、
PHPやRubyなどのスクリプト言語では、作業ディレクトリをこの共有フォルダに置けば、
ソースコードを修正して、Webブラウザをリロードすれば、修正が反映されるという便利！
まあ、共有フォルダが悪さをして最新のMacは動作が不安定になってしまうのが残念。。。
共有フォルダを使わなければ問題ないです。

# 7.ネットワークが母艦経由で外に繋がる

最近のvagrantのバージョンから、インターネットからアクセス可能にするサービスも。
使ったことは無いんですが、まあそこそこ使えるそうですｗ

自分が開発している環境をお客さんに見て貰いたい時とか、リモートで作業していて
開発チームのメンバーに問題点を見て貰ったり、俺のコード、機能を自慢した時とかｗ
結構、使い道ありそうですね。





まあ、あと５年は絶対に使うべき技術だと思うので、基本は押さえていた方が良いですよ。
クラウドサーバを使うとお金がかかりますが、Vagrantだと無料で使えますからね。
RPGツクールMVでLive2Dを再生してみる


最初はspine を試す予定だったのですがもう再生できたみたいですね。
そこで似てるLive2Dを試してみました。
結論言うとバグありますが表示するところまでできました（アニメもします
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/mYgTbE2oL-o/0.jpg)](http://www.youtube.com/watch?v=mYgTbE2oL-o)

![bandicam 2015-12-08 00-26-25-709.gif](https://qiita-image-store.s3.amazonaws.com/0/75247/d14bc78b-773f-98e7-6632-d2184d2c9c9b.gif)
（gif convertしたら小さい…

#Live2D SDK Cubism
Live2dのwebGL版が公開されてたので組み込み簡単かなぁと思ってました。
ところがLive2Dのmocとmtnバイナリファイルのファイルフォーマットは公開されていません。
そのうえ一番重要なwebGLを使っての描画部分が圧縮されて隠蔽されてました。
ユーザーに関数詳細を意識させないという点はよいと思うのですが
実際にwebGLライブラリに組み込む場合は既存の描画系とバッティングするのは目に見えています。
unity版も見ましたが、エンジン標準の描画系から外れて非常に扱いづらい印象を受けました。
とはいえ一般ユーザや小規模事業者であれば無料なのは非常に大きなメリット。
一手間かかるもののゲームのクオリティは格段に上がることでしょう。


#pixi.js v2に組み込み
ひとまずpixi.js v2のexample1-BasicsでLive2dサンプルのSimpleを動かすところから始めました。
表示はすんなりできましたがLive2DModel.draw内部でwebgl contextが書き換えられているようです。
pixi.jsはwebgl context が書き換えられてることに気付けないので表示がおかしくなるようです。
アプローチとしてはdraw 直前にpixi.js側はflushしたうえでgl contextの内容を保持してdrawのあと復帰しなくてはいけません。

gl contextの内容を保持・戻すの箇所が分からなかったので
ダミーのshader持ったPIXI.Spriteを描画して、pixi.jsにwebGL context変えてと知らせるような方法にしました（左上の黒いのがRGBSplitFilterシェーダーのやつです

#RPGツクールMVに組み込み

https://dl.dropboxusercontent.com/u/7527575/qiita/Live2DTest.zip
一番上のyoutube 版のプロジェクトzipにしておきました。
pluginは登録順に気をつけないと依存関係のエラーでます（一個にまとめるべきなんでしょう
live2d.min.jsの.min.jsが拡張子と誤認されるので適当にリネームしてやります。



```js:rpg_scene.js
Scene_Title.prototype.create = function() {
    Scene_Base.prototype.create.call(this);
    this.createBackground();
    this.createForeground();
    this.createlive2d();// 新規追加
    this.createWindowLayer();
    this.createCommandWindow();
};

Scene_Title.prototype.createlive2d = function(){
    this.live2DMgr = new LAppLive2DManager();
    this.live2DMgr.reloadFlg = true;
    this.live2DMgr.count++;

    var model = this.live2DMgr.createModel();
    model.load( Graphics._renderer.gl, LAppDefine.MODEL_HARU);
    this.addChild(model);
};
```

pixi.jsはScene への登録順が描画順となるのでそれっぽい箇所に挿入してやります。
エディタから実行するとなぜかエラーになりLive2Dキャラが表示されません。
index.html直接再生だと正常です（brackets からもOK
原因は分かりません。

```js:rpg_scene.js
Scene_Title.prototype.terminate = function() {
    Scene_Base.prototype.terminate.call(this);
    SceneManager.snapForBackground();
    
    this.live2DMgr.releaseAll(Graphics._renderer.gl);
    Graphics._renderer.shaderManager.setShader(Graphics._renderer.shaderManager.complexPrimitiveShader);
    Graphics._renderer.gl.disable(Graphics._renderer.gl.CULL_FACE);
};
```

Live2Dは自前でGL texture を確保しているため、自前で解放する必要があります。
シーンを抜ける前にlive2DMgr.releaseAllしてやります。
（Pixi.jsのtextureを継承して管理してもよかったかも


`setShader`は、pixi.jsにshaderが変わったことを知らせるためにわざと呼んでいます。
設定するshaderは絶対使われないダミーシェーダーにすべきですが、今回は内蔵のcomplexPrimitiveShaderでお茶を濁してます。

Live2D内部でカリングが有効になってることがあるため
`gl.disable(Graphics._renderer.gl.CULL_FACE)`を呼んで無効化しておきます。


#その他注意点

Live2Dはtexture を作成する時に
`gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 1);	//imageを上下反転`
を呼んでいます。
ピクセルストレージモードの設定らしいのですが、これ以降webGLがtextureを上下反転してよみこんでしまいます。
なのでtexture作成し終わったら設定を元に戻します（PIXI.js側で反転設定使う可能性もあるので注意、普通は使わないけど
`gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);`




ひとまずRPGツクールMVでLive2Dは再生可能と分かりました。
Live2Dの全機能を使うにはまだまだやることがありそうです。
やる気のあるwebGL使いは色々教えて下さい；
Integration - HipChatで安心して滑るための技術

全国2,000万人の滑るのを恐れて何も言えないで怯えている皆様、こんばんワールド。
冬の寒さも深まってまいりまして、一部では道が凍結したり、足元を気をつけなければ、うっかり滑ってしまう季節になってまいりました。

滑ると言いましても、全てに於いて悪いこととは限らないものでございます。
そう、コミュニケーションに於きましては、役立つのであります。


本日は、この冬を快適に滑るために[HipChat Integration](https://www.hipchat.com/docs/apiv2/addons)を利用して作成した`/dajare`コマンドをご紹介いたします。

# Integrationって何？

![Integration](https://www.hipchat.com/img/docs/how_integrations_work.png)
> [HipChat integrations](https://www.hipchat.com/docs/apiv2/addons)より引用

HipChat Integration は、HipChat のルームへの投稿やユーザーの参加などのイベントをウェブフックとして連携する仕組み、またはその仕組を利用したサーバーのことです。

昨今流行りのChatOpsを実現する仕組みとして利用できます。
ChatOpsと聞くと、Hubotなどのボットを思い浮かべる方も多いかと思います。
Integrationを利用する利点としては、

1. Webアプリケーション開発の技術で作成可能
2. ボット用のアカウントやOAuth認証トークンの発行などのちょっと面倒くさい準備が不要
3. 複数のルームへの展開が容易

といったものがあります。


# セットアップ手順

## Room の選択

まずはWebのHipChatに[ログイン](https://www.hipchat.com/sign_in)し、Integrationを設定したいRoomへ行きます。

![Kobito.1HU9vA.png](https://qiita-image-store.s3.amazonaws.com/0/3662/b64ed130-76b9-0193-fb90-844b7933c7a7.png "Kobito.1HU9vA.png")


## BYO Integration を選択

![HipChat_-_Integrations.png](https://qiita-image-store.s3.amazonaws.com/0/3662/7b0103fd-6206-690e-2666-cb1527bfd88f.png "HipChat_-_Integrations.png")


## Itegration の名前を設定

BYO Integrationの名前を設定します。
ここでは、とりあえずDajareとしておきます。

![Kobito.loWdOo.png](https://qiita-image-store.s3.amazonaws.com/0/3662/1284192e-4f47-d810-08eb-0702387a66a0.png "Kobito.loWdOo.png")


## コマンドを設定

`Add a command` にチェックを入れると、コマンド名やIntegration のWebhookのエンドポイントを入力できます。

`Enter your slash command` には使いやすいコマンド名を入れましょう。`/dajare` で構いませんが、`/d` など短いコマンド名に設定しておくと、iPhoneなどモバイルクライアントから気軽に滑れるようになります。

![Kobito.DJQXMn.png](https://qiita-image-store.s3.amazonaws.com/0/3662/f5b66d9f-d2c5-8f0e-680f-d8d8104d819d.png "Kobito.DJQXMn.png")

# さぁ、滑ってみよう。

おめでとうございます。
これで滑るための準備は完了です。普段の何気ない会話に、ちょっと `/dajare` を付けることで、誰も傷つけることなく、HipChatのルームにも冷たい空気が押し寄せることでしょう。

![HipChat.png](https://qiita-image-store.s3.amazonaws.com/0/3662/7a2a5f72-b083-ce87-3bbf-fedecc24616a.png)

# ソース

ここまでご紹介した`dajare` コマンドを提供するDajare は、MITライセンスでオープンソースとして公開しております。

* [satoryu/dajare - Github](https://github.com/satoryu/dajare)

BYO Integrationとして登録すると、例えば、

![HipChat.png](https://qiita-image-store.s3.amazonaws.com/0/3662/fa2ab522-829b-83d8-8b68-f757de27f5da.png)

などのように、企業秘密に相当することで滑ろうとすると、そのメッセージがDajareサーバーに送らることになるため、コンプライアンス上のリスクを懸念されることと思います。
そのような場合、自社でDajareサーバーを構築することで、リスクを回避した上で滑ることが可能です。

# 最後に

HipChat Integration を利用した、`/dajare` コマンドを提供するDajareサーバーと、それをBYO IntegrationとしてHipChatのルームに設定する方法について、ご紹介しました。

コミュニケーションの円滑化は、ビジネス及び開発すすめる上で重要なアクションであります。
逆に、コミュニケーションの取りづらい環境では、もちろん、社員同士のコラボレーションなどは望めることはなく、緩やかに衰退してく組織となりえます。
コミュニケーションを円滑にするための活動の1つとして、発言の敷居を下げることがあげられます。
「こんなことを言っても良いんだ」という空気を組織内に醸成することで、発言を引き出すことが期待できます。その1つの具体的な方法として、ダジャレという、一見どうしようもないことを発する活動があります。
しかしながら、これを多様し過ぎると、発言者に対して、「この人は大したことを言わない人なのではないだろうか」という誤解や、人間関係を悪化させる可能性もあります。
このような問題を解決しつつ、本来、ダジャレに求められた発言の敷居を下げる効果を最大限に発揮させるため、Dajareサーバー及び`/dajare` コマンドが有効ではないかと考えております。

皆様が、円滑に滑れることを期待しております。
右エンターキーが左手側にあるキーボード

## 右エンターキーが左手側にあるキーボード

右エンターキーとは，テンキーにあるエンターキーのことです．
（一般的にテンキーは右側にあるため）

利き手が右手の場合，右手はマウスやトラックボールに占領されてしまうため，
フルキーボード（テンキーのあるタイプ）はオススメしません．

どうしても数字入力を快適にしたい場合やショートカットキーとしてテンキーを使っている場合，
外付けテンキーやゲーミング片手用キーボードを左に配置するのをオススメします．

元々，電卓も左で打って，右手で解答を速記と言う感じだったと思います．
特殊キーで0の位置がおかしかったり123列と789列が天地逆のタイプも使い易いようにリマップしましょう．

かなり特殊ですが，左側にテンキーのあるフルキーボードも存在します．
別途外付けキーボードを追加したくない人は探してみるのも手かもしれません…
Android Studio 使うなら Git と連係しておきましょうという話


これは [スピカ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/spika) の８日目(12/8)の投稿です。今回は、これから Android Studio で開発を始めようという方 / Git をまだ利用してない方を対象に、Android Studio 使うなら Git と連係しておきましょうという話です。

チームでのアプリ開発ではもちろんですが、仮に個人アプリの開発やソロでの開発であっても、 Git を履歴管理として利用すると何かと便利です。

> 私の手元の Android Studio のバージョンは `1.5` ですが、このあたりはあまりバージョンによって変わることはないかと思います。

## まず Git 連係を有効にする

[VCS] メニューから [Enable Version Control Integration...] を選択し、

![スクリーンショット 2015-12-07 22.07.59.png](https://qiita-image-store.s3.amazonaws.com/0/35733/17aee67f-bce4-a5cc-8efd-d05aad158a3a.png "スクリーンショット 2015-12-07 22.07.59.png")

プルダウンから [Git] を選択します。

![スクリーンショット 2015-12-07 22.08.30.png](https://qiita-image-store.s3.amazonaws.com/0/35733/58f63ea8-ea66-5b96-c5a0-5a05275d93f4.png "スクリーンショット 2015-12-07 22.08.30.png")

すると Android Studio の左下に [Version Control] タブが出現し、ここからファイルのコミットや修正の取り消し(Revert)が出来るようになります。

![スクリーンショット_2015-12-07_22_26_38.png](https://qiita-image-store.s3.amazonaws.com/0/35733/9a695f26-437e-6290-ce89-bf0aff1c791d.png "スクリーンショット_2015-12-07_22_26_38.png")

コミット後にコードを変更すると、変更箇所に印がつきます。

![スクリーンショット_2015-12-07_22_28_18.png](https://qiita-image-store.s3.amazonaws.com/0/35733/335e8af6-c91d-b1ec-8d8c-fe4f893ddbad.png "スクリーンショット_2015-12-07_22_28_18.png")

ファイル全体の変更箇所を確認するには、下図のメニューアイコンをクリックします。

![スクリーンショット_2015-12-07_22_30_49.png](https://qiita-image-store.s3.amazonaws.com/0/35733/04daa46c-bd41-4d01-8140-a1f8af330d1e.png "スクリーンショット_2015-12-07_22_30_49.png")

すると差分が表示されます。

![スクリーンショット 2015-12-07 22.31.50.png](https://qiita-image-store.s3.amazonaws.com/0/35733/8a80c417-3588-cf78-f824-131038209283.png "スクリーンショット 2015-12-07 22.31.50.png")

## 履歴の色々な見方

[Log] タブでは、履歴をツリー表示で確認できます。

![スクリーンショット_2015-12-07_22_25_24.png](https://qiita-image-store.s3.amazonaws.com/0/35733/835c1a6e-fbd8-de16-ebc9-6cd341ec4bbc.png "スクリーンショット_2015-12-07_22_25_24.png")

ファイル毎の履歴を見るには、下図のメニューアイコンをクリックします。

![スクリーンショット_2015-12-07_22_30_49 2.png](https://qiita-image-store.s3.amazonaws.com/0/35733/3300d963-bbc6-74e9-26fb-73f8e39b389d.png "スクリーンショット_2015-12-07_22_30_49 2.png")

すると、このファイルに加えられた変更の履歴が表示されます。履歴をダブルクリックでそのコミットで加えられた変更の差分が表示されます。

![スクリーンショット 2015-12-07 22.33.15.png](https://qiita-image-store.s3.amazonaws.com/0/35733/762aaeb7-f881-898b-7ad9-819b06e7edcb.png "スクリーンショット 2015-12-07 22.33.15.png")

過去の変更履歴を気にしながらコードを書きたい場合もあります。その場合はコードの左のエリアを右クリックし [Annotate] を選択します。

![スクリーンショット_2015-12-07_22_33_47.png](https://qiita-image-store.s3.amazonaws.com/0/35733/d8970bce-62cd-bb65-a4c3-8f9d4222be64.png "スクリーンショット_2015-12-07_22_33_47.png")

すると各行がどのコミットで変更されたかが表示されます。何気にこれが便利だったりします。

![スクリーンショット_2015-12-07_22_34_57.png](https://qiita-image-store.s3.amazonaws.com/0/35733/82b9a774-e1e1-5e96-72bc-79fbedbd2512.png "スクリーンショット_2015-12-07_22_34_57.png")

## おわりに

基本的な内容となりましたが、Android Studio での Git 連係について簡単に説明しました。

仮に個人アプリの開発やソロでの開発であっても、コードの履歴管理として Git は有用です。 

また Git はコマンドから扱う派の方であっても、上記のように Android Studio での履歴表示はとても分かりやすいので、是非つかってみてもらえればと思います。
React Native - Reflux

# Refluxjs

[reflux/refluxjs](https://github.com/reflux/refluxjs)はFluxの実装の１つです。2015年12月時点での最有力FluxアーキテクチャはReduxですが、RefluxもStarが4000以上あるレポジトリで、Facebook Fluxとの違いは下記のようになります。

1. dispacherはない
2. actionがListenableでstoreからListenできる
3. storeにswitch文を必要としない
4. Action creatorを必要としない

このようにfacebook/fluxを簡略化した形で書けるのが利点になります。Constantも書く必要がないのでファイルを行ったり来たりしなくて良いのでコードを書く上で非常に助かります。(Facebook fluxを書いてみると分かりますが、これが意外と面倒でタイポする確率も上がり、生産的ではないです)

それでは見てみましょう。

## Installation

```
$ npm install reflux —save
```

## Directory Structure

ディレクトリは下記のようになります。dispatcher, constantがなくスッキリします。

```
app/
├── app.js
├── actions
│   └── UserActions.js
├── components
│   ├── FacebookLoginView.js
│   └── TabBarView.js
└── stores
    └── UserStore.js
```

### Action

Actionは非常にシンプルでconstantと同じような感覚で書きます。

```
import Reflux from 'reflux';

let userActions = Reflux.createActions([
    "currentStatus",
]);

export default userActions;
```

### Store

Storeも非常にシンプルでswitch文を必要としません。ポイントとしてActionをListenしているとこです。アクションが実行された時にStoreにあるメソッド, Actionで指定した名前にonを付け先頭の文字を大文字にしたもの(action:currentStatus, store: **onC**urrentStatus)が実行されます。

下記のコードの補足ですが、React NativeはBabelでtransformしているのでカジュアルにasyncが使えます。これは非常に強力で同期的にしかもシンプルに非同期処理を書けます！

```
import { AsyncStorage } from 'react-native';
import Reflux from 'reflux';
import userActions from '../actions/UserActions';

let USER = "USER";
let userStore = Reflux.createStore({

  listenables: userActions,

  async onCurrentStatus() {
    try {
      let value = await AsyncStorage.getItem(USER);
      this.trigger(value);
    } catch(error){
      concole.log("Error: Faild to AsyncStorage.getItem(USER)");
    }
  }
});

export default userStore;
```

### Component

コンポーネント側も非常に楽です。Mount処理でStoreをsubscribe/unsubscribeしてます。
そして、Storeで`trigger()`が呼ばれた時にコンポーネントの変更処理がonCurrentStatus()で行われます。

```
import React, { Navigator, View } from 'react-native';
import FacebookLoginView from './components/FacebookLoginView';
import TabBarView from './components/TabBarView';
import userActions from './actions/UserActions';
import userStore from './stores/UserStore';


let app = React.createClass({

  getInitialState(){
    return { current_route: null };
  },

  componentDidMount(){
    this.unsubscribe = userStore.listen(this.onCurrentStatus);
    userActions.currentStatus();
  },

  componentWillUnmount(){
    this.unsubscribe();
  },

  onCurrentStatus(userInfo){
    this.state.current_route = userInfo ?  "user-info" : "authentiate";
  },
  ....
});

export default app;
```

## Summary

今回紹介したRefluxを使うことでコード量を少なくFluxアーキテクチャを実装できます。Fluxアーキテクチャの採用時に検討してみるのも良いと思います。

明日はいよいよFluxアーキテクチャの本命Reduxを紹介します。
サルでもわかるgit stash

# はじめに
gitで開発する上でとても便利なgit stashについて書きます。git stashを既に知っている人はどうでもいい内容です。知らない人は参考にしてください。

# こんなときにどうぞ
* ブランチAでタスクAの開発中に別のタスクBを急ぎで頼まれた！Aの開発途中なのにーっ！となった時に使います。
* ブランチAでコミットしていない時にBブランチを新たに作って、ブランチBに切り替えをしようとすると・・・

```
error: You have local changes to 'filename'; cannot switch branches.
```

はい。怒られます。Aブランチはぐちゃぐちゃだしコミットできるまで至っていない。
→git stashを使おう！

# 使い方
## 1.編集途中のソースを一時的に退避

```
git stash （または git stash save）
```
saveは省略可能です。これだけでもブランチ名と最後にコミットした内容で保存されます。

それでも自分でわかりやすいコメントにしたい時は？


```
git stash save "your comment"
```
という感じで自分の好きなコメントを入れることができます。

## 2.退避した内容を確認します。

```
git list 
```
先ほど保存した内容が出てきます。

```
stash@{0}: WIP on branch_a: 8b2c698 コメントコメント
```

## 3.AブランチからBブランチに切り替えて作業します
```
git checkout branch_b

Switched to branch 'branch_b'
```

今度はエラーなしでブランチが切り替わりました。
ブランチBでタスクBの開発をします。

タスクBの開発をMasterブランチにマージしてタスクBが無事終了。

## 4.そして再びAブランチに

Ｂタスクも終わったのでAタスクに戻ります。

```
git checkout branch_a
```
git stashの内容を確認します。

```
git stash list 
```
先ほど保存した内容が出てきます。

```
stash@{0}: WIP on branch_a: 8b2c698 コメントコメント
```

前回の保存内容を適用します。

```
git stash apply stash@{0}

git status
```

途中で保存していたタスクAのソースが復活します。

## 4.保存したリストを削除

復活したので、stashのリストは削除しちゃいましょ。
リストがたまるとどれがどのタスクがわからなくなってしまうので、復活した後は削除しちゃいます。

```
git stash drop stash@{0}
```

先ほどのapplyとdropが一緒になったコマンドもあります。

```
git stash pop stash@{0}
```

復活したと同時に削除されます。
applyとdrop使うか、pop使うかお好きなほうをどうぞ。

そして、優雅にタスクAの開発の続きをやります。

とても便利なgit stashについてでした。

おしまーい。
【FileMaker】TODOリストを作って改良していこう(3)ー業務設計をする

みなさんは、FileMakerでアプリケーションを作るとき、頭に思い浮かんだのをそのまま作ってませんか？
すぐ実装できるところはFileMakerのいいところなのですが、やはりシステムとして作るときは
やりたいことが
・どんな画面で
・どんな機能を盛り込むか
ということを設計してから作っていきましょう。
なんでかというと、思いつきで作ると、要望されたことが実装する段階で漏れが出てくるかもしれないからです。

FileMakerのいいところとして、すぐに実装できるところと書きましたが、全てをすぐに実装する必要はないのです。
小さな要望から実装していって、大きなシステムに育て上げるようにしていけばいいのです。
これは、よく言う「スパイラル開発」ですね。

スパイラル開発は、中心となる軸（やりたいこと）は変わっていませんが、小さく開発したことをベース（土台）に徐々に大きくしていく開発なので、やりたいことをすぐに実装できるFileMakerにぴったりの開発手法だと思います。

さぁ、ここから、スパイラル開発のスタートです。

# 画面遷移と要望割り当て

まずは、[最初](http://qiita.com/tyuma/items/cb8cba65e6f6c187b6a9)に出てきた要望を書き出してみましょう。
要望は、「業務要件」といいます。
この出てきた業務要件をシステムに落とす（作り上げる）ために、どのような画面が必要で、どのような遷移をしてユーザビリティを高めればいいのか、などをわかりやすくまとめていきます。
（本当はもっと色々図を描きますが）

![スクリーンショット 2015-12-03 17.41.14.png](https://qiita-image-store.s3.amazonaws.com/0/60538/29cac796-c566-7ec7-a849-0f241e6e12df.png)
こんな↑簡単な図でいいのです。
要件をまとめて、今回実装する部分を明確にしましょう。

こういう風に書き出していくと、どんな画面が必要で、どんな機能を実装し、画面間の行き来（画面遷移）はどうするかが一目でわかります。

# 状態遷移

次に、TODO項目がどういう状態でシステムの中で処理されていくかを設計していきましょう。

それぞれのTODO項目が作成されてから、TODOが完了するまでの状態を確認します。
これを、状態遷移といいます。
![スクリーンショット 2015-12-05 11.00.30.png](https://qiita-image-store.s3.amazonaws.com/0/60538/d05177c4-57f1-b3f7-3961-a4e1a8d4bd9a.png)

今回は、TODO項目だけの状態を考えましたが、システム開発では、例えば見積書が納品書になり、請求書になりと状態を変えていきます。このとき、見積書が今後の納品につながるのかそれとも没になったのか、また、納品までに至る過程（製造・外部発注・梱包などの状態）においてどういう状況を監視していかなければならないのか、などを分析していきます。
この業務分析のとき、「フラグ」とかつけて考えたい衝動に駆られますが、業務分析では業務に関することのみを分析し、その結果を実装に関する開発仕様に落とし込んでいきますので、どう実装しようか、ということは頭から抜いてください。
業務分析をすることで、その後の開発が例えばFileMakerなのか、PHPなのか、Javaなのか、言語を選ばずに開発設計ができ、業務と実装を分けて考えることができます。

その他、考えずらかったら、フローチャートで設計していってもいいです。
![スクリーンショット 2015-12-05 11.19.27.png](https://qiita-image-store.s3.amazonaws.com/0/60538/6fa04e46-2792-b425-84c5-be32a3fb3109.png)

FileMakerではすぐに実装できることから、設計と実装が同時進行していきがちですが、設計８割：実装２割で開発していくと、後戻りが少なく、かつスパイラルにしていっても設計がしっかりとしていると追加もこわくありません。

ちなみに、こういう図は、なにもExcelで一生懸命線をひっぱらなくていいんですよ。
[cacoo](https://cacoo.com/lang/ja/home)という、システム開発では必須の図が描ける、オンラインのドロー・ツールがあるので、ぜひとも活用してみてください。
今回の図もcacooで描いています。
cacooは、複数人で共有もできますので、プロジェクトチームなどで使うときも誰がどのような図を描いたか、修正したか、そして、webベースなのでチャットしながらシステム図を描き上げることができます。
効率いいですよ！

では、いよいよ開発設計へいきましょう！
EmacsのCtrlキーの押し方

Emacsを使い始めると小指が気になります。
Ctrlキーの押し方について調べてみたところいろいろと流派があるようなので、簡単にまとめました。まだまだありそうですが、Emacsを使っていて小指が痛くなってきたり違和感を感じるようでしたら、違う押し方を試してみてはいかがでしょうか？


流派一覧
--------

- 小指の指先で押すよ派
    - Ctrlキーは左下/右下にあるよ派
        - CtrlキーとCaps Lockキーは入れ替えないよ派
        - CtrlキーとCaps Lockキーは入れ替えるよ派
    - CtrlキーはAの左にあるよ派
- 小指の付け根（手のひら）で押すよ派
- 小指の関節で押すよ派
- 親指で押すよ派
    - JIS派
    - KINESIS派
- 足で押すよ派


解説
----

### 1. 小指の指先で押すよ派 ###
#### 1.1. Ctrlキーは左下/右下にあるよ派 ####
##### 1.1.1. CtrlキーとCaps Lockキーは入れ替えないよ派 #####
いわゆる普通のキーボードを普通に使っている方たちです。
それゆえ小指の痛みが発生する可能性が高いです。

##### 1.1.2. CtrlキーとCaps Lockキーは入れ替えるよ派 #####
いわゆる普通のキーボードを普通に使っていたが、
ある原因(例：小指の痛み)のためこの使い方にシフトした可能性が高い方たちです。


参考
- [Macキーボード配列の改造計劃](http://qiita.com/yubais/items/bace9b3ebaae283046d3)
- [Windows で\[Ctrl\]と\[CapsLock\]キーを入れ替える](http://qiita.com/rohinomiya/items/b02ddee1c1992011e81a)
- [キーボードレイアウトカスタマイズ（by xmodmap）](http://qiita.com/nida_001/items/bdc265028b9c083c0aca)


#### 1.2. CtrlキーはAの左にあるよ派 ####
入れ替えるくらいなら最初からそうなっているキーボードを買ってしまえ！という方や、Mac Book Airを買ったらそうなっていたという方がいます。


### 2. 小指の付け根（手のひら）で押すよ派 ###
いわゆる普通のキーボードを普通に使っていたが、
ある原因(例：小指の痛み)のためこの使い方にシフトした可能性が非常に高い方たちです。

Ctrlキーを押しても小指が自由になるためホームポジションがずれないという利点があります。

キーストロークの浅いキーボードだと押しにくい場合があります。


参考
- [激速！IMEのショートカット](http://qiita.com/RelaxTools/items/1a91b4a2a6189cb4e6d8)


### 3. 小指の関節で押すよ派 ###
いわゆる普通のキーボードを普通に使っていたが、
ある原因(例：小指の痛み)のためこの使い方にシフトした、
Emacsを常用している可能性が高い方です。

![押し方](http://quadruple-a.com/keys/ctrl.jpg)
https://www.reddit.com/r/emacs/comments/38j71d/i_want_to_use_emacs_because_it_appears_to_be_the/ より


私もこの押し方です。
プログラムを書いているとき等は普通にAの上に左小指を置いていますが、いったん落ち着いてソースを見るときなどは小指をくるっと丸めてCtrlキーの上に置いています。

Ctrlキーと小指で押すキーは以下のようになっているので、あまり困りません。

- Ctrl-Q
  あまり押さない
- Ctrl-A
  左薬指でカバー可能
- Ctrl-Z
  押さない

### 4. 親指で押すよ派 ###
#### 4.1. JIS派 ####
いわゆる普通のキーボードを普通に使っていたが、ある原因(例：小指の痛み)のためこの使い方にシフトした可能性が非常に高い方たちです。
EmacsでSKKを使っている可能性が高いです。

無変換キーなどをCtrlキーに割り当てることで実現しています。


参考
- [xkbで無変換にctrlを割り当てる](http://qiita.com/tetsutan/items/bfa5768c3d618ca35d4a)


#### 4.2. KINESIS派 ####
キーボードにこだわりがある方たちです。普通に親指にあたる部分にCtrlキーがあります。いちどさわってみたいものです。

### 5. 足で押すよ派 ###
KINESISが販売しているものがあります。
http://www.edikun.co.jp/kinesis_footswitch/index.htm

Googleで"Emacs footpedal"でイメージ検索するといろいろと出てきます。


参考文献
--------

- [How to Avoid the Emacs Pinky Problem](http://ergoemacs.org/emacs/emacs_pinky.html)
CodeIgniterにレイアウト層を追加してみる

Railsに取り組んでからCodeIgniterもまた使うようになったのですが、Railsにあって便利そうなものをCodeIgniterにも取り入れて、快適に書けるよう進めていっています。今回は、そんなことをしたうちの1つ、レイアウト層の導入について取り上げてみます。

# レイアウトって？
Railsをやっている人ならご存知だと思いますが、Railsで各コントローラーから呼び出すビューには、基本的に`<body>`の一部しか書かれていません。その外側の`<!DOCTYPE>`とか`<html>`とかは、別な「レイアウト」ファイルに書いてあって、ビューはその中に表示されることになります。

実際にサイトを作る上で、（JavaScriptとかCSSなどは別として）各ページごとにレイアウトが違うことはまずないですし、各個のビューからは決まりきった部分の描画をまったく省略できるので、すっきり書けるようになります。

# 描画を乗っ取る`_output`
それでは、このような機構をCodeIgniterに組み込むには、どうすればいいでしょうか。CodeIgniterには、ビューでの出力が終わった後、それを最終形にする前に呼び出される`_output`というメソッドがあるので、ここに仕掛けてみることにします。

まずは、レイアウト制御用の`Layout`クラスを用意します。

```php:libraries/Layout.php
<?php

class Layout{
    private $_ci;
    private $_name = 'default';
    private $_parameters = array('title' => '', 'h1' => '');

    public function __construct(){
        $this -> _ci = & get_instance();
    }

    public function set_template($name){
        $this -> _name = $name;
    }

    public function set_parameter($key, $val){
        $this -> _parameters[$key] = $val;
    }

    public function __set($key, $val) {
        $this -> set_parameter($key, $val);
    }

    public function render($content, $return = FALSE){
        $this -> _parameters['_content'] = $content;
        return $this -> _ci -> load -> view('layouts/' . $this ->
_name, $this -> _parameters, $return);
    }
}
```
レイアウトのレンダリングにも通常のビューと同じ仕組みを使って、そしてレイアウトからは`$_content`で中に出力すべき内容を取得できるようになっています。また、`title`や`h1`などレイアウトに渡すべき引数がいくつかあるので、マジックメソッドで制御できるようにしてあります。

そして、これを呼ぶ`MY_Controller`は以下のようになります。

```php:core/MY_Controller.php
class MY_Controller extends CI_Controller{

    public function __construct(){
        parent::__construct();
        // オートロードで設定してもOK
        $this -> load -> library('layout');
    }

    protected $_use_layout = TRUE;

    public function use_layout($value){
        $this -> _use_layout = $value;
    }

    //出力ハンドラ
    public function _output($content){
        if($this -> _use_layout) {
            $content = $this -> layout -> render($content, TRUE);
        }
        echo $content;
    }
    
}
```

見ての通り、`use_layout`がTRUEならレイアウトを挟んで出力している、それだけです。

## 検討課題
まだ作りかけなので、考慮すべきことがいくつかあります。

* JavaScript、CSSのハンドリング
* HTML以外を出力する場合、Content-typeを切り替えるだけでレイアウトを無効にする
D言語くんの繁殖についての仮説

この記事は、D言語くん Advent Calender 2015に投稿したものです
http://qiita.com/advent-calendar/2015/d-man

#D言語くんの分裂

![dmanumareta20001-0318.gif](https://qiita-image-store.s3.amazonaws.com/0/100657/5ea43b29-d022-0b0c-3794-831100ab5703.gif)



　我々が目にするD言語くんの姿は、お腹の無い、**中空**の状態である。産まれて数秒後に、すぐにお腹を押し出して分裂してしまうからである。お腹があるのは繁殖（分裂）をしていない個体である。この特性から、D言語くんは**並列でふえることができない**。よって繁殖期のD言語くんは**常に1匹**である。もしお腹があるD言語くんを見つけても、そっとしておいてあげよう。

#分裂の方向
生物の分裂には、方向による分類がある。
・体の前後の軸に沿って分かれる**縦分裂**
・体が前後の軸を横切って分かれる**横分裂**

D言語くんの分裂はどちらにもあてはまらず、いわば**筒分裂**とも言うべき形態をとり、特筆に値する。

#D言語くん発生の起源
おせちのカマボコに魂が宿り、フラミンゴみたいに藻を食べて全身が赤くなったと考えられる。
C#で高速なTCPサーバを実装するためのasync/await入門

C#でTCPサーバを実装するにはいくつか方法があります。
まずTCPサーバの実装方法毎の比較をし、その中でも記述量とパフォーマンスのバランスに優れたasync修飾子の使い方を紹介をします。

## 実装方法の比較[^1]
|実装方法      |行数|難易度|秒間リクエスト数|
|-------------|-------|-------|-------|-------|
|[async/await](https://github.com/hythof/csharp_tcp_server_benchmark/blob/master/src/CSharpResearchTcpServer/AwaitServer.cs)  |101|易しい|56,916|
|[非同期ソケット](https://github.com/hythof/csharp_tcp_server_benchmark/blob/master/src/CSharpResearchTcpServer/AsyncSocketServer.cs)|170|難しい|68,272|
|[ThreadPool](https://github.com/hythof/csharp_tcp_server_benchmark/blob/master/src/CSharpResearchTcpServer/ThreadPoolServer.cs)   |98|易しい|51,129|
速度を求めるなら非同期ソケット、開発のし易さならasync修飾子という使い分けが良さそうな結果です。
という訳でasyncについて使い方などを見ていきます

## async修飾子を使うと非同期処理が簡単
以下のコードは1秒間処理を遅延させるTask.Delay(1000)を合計100回実行していますが、処理は1秒足らずで終了し、計算結果も正しく表示されます。 [^2]
従来でも ThreadPool.QueueUserWorkItem などを使えば時間のかかる処理をバックグラウンドに回すことは出来ましたが、この例の様に100個の非同期処理を「待ち合わせる」というのはここまで簡単には書けませんでした。

```csharp
using System;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    public static void Main()
    {
        var tasks = Enumerable.Range(1, 100).Select(run).ToArray();
        Task.WaitAll(tasks);
        Console.WriteLine(tasks.Sum(x => x.Result));
    }
    
    static async Task<int> run(int n)
    {
        await timeConsumingWork().ConfigureAwait(false);
        return n * 2;
    }
    
    static Task timeConsumingWork()
    {
        return Task.Delay(1000);
    }
}
```

## 非同期ソケットがやっと扱いやすくなった
[非同期ソケット](https://github.com/hythof/csharp_tcp_server_benchmark/blob/master/src/CSharpResearchTcpServer/AsyncSocketServer.cs)は170行も実装に使っていますが、[async/await](https://github.com/hythof/csharp_tcp_server_benchmark/blob/master/src/CSharpResearchTcpServer/AwaitServer.cs)は101行とコンパクトにまとまってます。
また、try/catchの範囲も非同期ソケットはコールバック関数を使っているため一括りに例外を補足できないのに対して、async/awaitの方はいつも通りの記述ができています。

## という訳でasync/awaitオススメです
直感的に書けて読めるのでC#の非同期通信はasync修飾子をゴリゴリ使って書くのがよさそうです。パフォーマンスも悪くありませんし。


[^1]: ThreadPoolはThreadPool.SetMinThreads()でworkerスレッドを同時接続数と同等程度に設定しないと上記の性能が出ませんでした。また検証に使ったコードを[github](https://github.com/hythof/csharp_tcp_server_benchmark)に置いています。
[^2]: [wandbox](http://melpon.org/wandbox/permlink/84ops8ZJj5etGreH)でコードを実行
private(set)とArrayのappendメソッド

Swiftにはprivate(set)という修飾子があります。
これは外部からの代入を防ぐ修飾子です。

```swift
class MyClass {
    private(set) var value = 0
    
    func setValue(value: Int) {
        self.value = value // エラーにならない
    }
}

MyClass().value = 1 // エラーになる
```

private(set)は代入だけでなくArrayのappendメソッド等にも有効です。

```swift
class MyClass {
    private(set) var value = [Int]()
}

MyClass().value.append(1) // エラーになる
```

## なぜappendメソッドも呼べなくなるか
appendがmutatingなメソッドだからです。
mutatingなメソッドは内部で自身の再代入を行っています。

再代入するのでsetの一種と見なされてエラーになったのだと思われます。

```swift
// 多分下のような実装
mutating func append(element: Generator.Element) {
    self = self + [element]
}
```

実際にメモリ番地を調べた所、append前と後で変更されていました。

```swift
var arr = [Int]()
print(unsafeAddressOf(arr)) // 0x00007fa002611f40
arr.append(1)
print(unsafeAddressOf(arr)) // 0x00007fa00268cac0
```

## didSetとArrayのappendメソッド
private(set)の話と同様で、Arrayのappendメソッドを呼んだ時にdidSetも走ります。

```swift
class MyClass {
    var value = [Int]() {
        didSet {
            print("didSet")
        }
    }
}

MyClass().value.append(1)
```
Gunosyのフロントエンド

この記事はGunosy Advent Calendar 2015の8日目の記事です。

お疲れ様です。おはようございます。[@axross](https://twitter.com/axross_)といいます。シングルページアプリケーション書いてメシを食わせてもらっている人間です。

今日は、「Gunosyでフロントエンド」って言葉がピンと来ない方が多いなという印象があるので、そのあたりの話をしようと思います。

## Gunosyのフロントエンド領域

Gunosyは今はiOS/Androidアプリケーションを主体としてサービスを展開していますが、[Web版](https://gunosy.com/)もあったりします。また、iOS/Androidアプリケーション内にも、「[グノシーマンガ](https://gunosy.co.jp/news/43)」といったコンテンツがあり、これはWebViewにを用いて提供しています。

Gunosyは結構早い段階から[React](https://facebook.github.io/react/)を採用しており、既にいくつかのプロジェクトはReactによって作られています。僕がコミットしているのは、だいたいこの領域です。

## デザイナーとフロントエンドの連携

フロントエンド開発で凝ったことをしようとすると、だいたいデザイナーとの連携が障害となります。たとえば、ReactのJSX(XMLライクなシュガーを取り入れたJavaScriptシンタックス)をデザイナーに書かせるのか？などです。

幸いにも、Gunosyのデザイナーはプログラミング方面にも高い能力を有している人が多く、[PhotoshopのPSDファイルからReactのElement吐き出しのスクリプトを書ける人](https://speakerdeck.com/tyshgc/rapid-react-prototyping-react-dot-jsdeuidezainpurototaipuwozuo-ru)など、中々のバケモノがいたりして、わりと不便なくやらせてもらえています。

## どんなことを大事にしているか

Gunosyのプロジェクトの多くは、小さくスタートし、改善を繰り返すことで成長してきました。僕もエンジニアとして、変更に強いアプリケーション基盤作りは大事だと思っています。

僕たちがReactを使うのは、イケてるからではありません。パフォーマンスが良いからでもありません。堅牢で柔軟なアプリケーションを構築するのに適した手段だからです。仕様変更に対して嫌な顔をせずに、ユーザーのために地道な改善を繰り返すのにReactが最も向いているからです。

## 最後に

共感できる方、興味のある方は[@axross](https://twitter.com/axross_)までご一報ください。メシでも行きましょう。

次の日は@aibouがDSLについて話すようです。
ORMのOllie使用方法

# ORMのOllie使用方法

## Ollie
https://github.com/pardom/Ollie

#インストール
1.gradleの設定
　TOPレベルのbuild.gradleのdependenciesに
　classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'を追加

　アプリレベルのbuild.gradleで
　apply plugin: 'com.android.application'の下に
　apply plugin: 'com.neenbedankt.android-apt'を追加
　dependenciesに下記を追加
　compile 'com.michaelpardo:ollie:0.3.1'
　provided 'com.michaelpardo:ollie-compiler:0.3.1'

2.DBの初期化
DBとversionを指定
```java:MainActivity
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //DB初期化
        Ollie.with(getApplicationContext())
                .setName("DBNAME") 
                .setVersion(1) //version
                .setLogLevel(Ollie.LogLevel.FULL)
                .init();
    }
```

※Ollieの所でAlt + Enterでクラスをimportしてください

3.テーブルの作成
Modelクラスを継承してテーブルを作成する。

```java:Recipient
@Table("recipient")
public class Recipient extends Model {

    //プライマリキーはAIの_id。自動で生成される

    @Column("name")
    public String name;

    @Column("email")
    public String email;

    @Column("is_delivery")
    public Integer is_delivery;
}
```
4.インサート
Modelのオブジェクトを生成して、値を設定しsave()

```java:SecondActivity
        Recipient recipient   = new Recipient();
        recipient.name        = "tester";
        recipient.email       = "test@test.com";
        recipient.is_delivery = 1;
        recipient.save();
```

5.レコードの取得
fromの所にテーブルのクラス名を設定する。

```java:SecondActivity
        Recipient recipientData = Select.from(Recipient.class).fetchSingle();
        Log.d("dbData", recipientData.email);
```

導入が簡単♪
~~随時更新予定~~
→複数の検索条件の時にwhereメソッドを連続で使用できないっぽいので、DBFlowに乗り換えます。
DBFlowはこちら↓
http://qiita.com/kiimiiis/items/603524744f312a24e3f0
CoreOsの dockerに insecure-registry環境変数追加


## 環境情報
[coreos-vagrant](https://github.com/coreos/coreos-vagrant)
CoreOS alpha (899.1.0)

## 経緯
coreos上のdockerに、private docker registry(insecure registry)に対して、docker pull/pushできるようにしたい

## coreos-vagrant/user-dataを作成
以下の内容でuser-dataを作成し、
vagrant halt ->  vagrant destroy -> vagrant up

```text
#cloud-config

coreos:
  units:
    - name: "docker.service"
      drop-ins:
        - name: "50-insecure-registry.conf"
          content: |
            [Service]
            Environment='DOCKER_OPTS=--insecure-registry="host:port"'
```

```text
host: private docker registryが動いているサーバのホスト名
port: private docker registryのポート
```

## 参考
[Using a registry without SSL configured部分](https://coreos.com/os/docs/latest/registry-authentication.html)
WPFデスクトップアプリでDirect2Dを使う

#はじめに
WPFのデスクトップアプリでDirect2D描画をしたいと思ったのですが、検索しても情報が古かったりいまいち良い方法が見当たりません。
割と新しめのは

- [Win2D](https://github.com/Microsoft/Win2D): ユニバーサルアプリ前提なら
- [WPFDXInterop](https://github.com/Microsoft/WPFDXInterop): pre-release(2015/12/27時点)。今後はこれが本命？

あたりですが、今回はデスクトップアプリで使いたかったのと[SharpDX](http://sharpdx.org/)を試してみたい、ということでWPFコントロールを作ってみました。
（とはいえ大半のソースは古いSharpDX/SlimDXのWPF向けサンプルソースから持ってきてるので、今回の作業はDirectX11環境向けの調整とソースの整理、nugetパッケージ化くらいです）

この記事を書いているときに気づきましたが、SharpDXはDirectX12対応の3.0.0がリリースされたようです。
時間が出来たら今回作ったコントロールも対応させるかもしれません。

(2016/1/2追記)
SharpDXのバージョンを3.0.0に上げてリリース(D2dControl 1.1.5)しました。
とりあえずSharpDX側の名前空間変更を反映しただけで、Direct2Dの新機能(`DrawGradientMesh`とか`DrawInk`とか？)はよくわからないので未対応です…

#動作確認環境
- Windows10 / DirectX11
- Visual Studio 2015
- SharpDX 2.6.3

# リンク
[Github](https://github.com/dalance/D2dControl)
[Nuget](https://www.nuget.org/packages/D2dControl/)

# 使い方
[サンプルソース](https://github.com/dalance/D2dControl/tree/master/Sample)を見れば大体わかるかと思います。
基本的には`D2dControl`を継承したクラスを作り、`Render`内で`target`に対してDirect2Dの描画関数を呼ぶだけです。
通常描画の前後で`BeginDraw`/`EndDraw`を呼ぶ必要がありますが、基底クラス側で呼んでいるのでここでは必要ありません。

```csharp
    class TestControl : D2dControl.D2dControl {
        public override void Render( RenderTarget target ) {
            target.Clear( Color4.Black );
        }
    }
```

また、`RenderTarget`に依存するリソース（ブラシなど）を格納するためのリソースキャッシュも提供しています。
`Render`内でリソースの生成を行うと、これは毎フレーム呼ばれるのでパフォーマンス上よろしくないです。
だからと言ってメンバとして保持すると`target`が変わった際に例外で落ちます。
（実際Controlのリサイズ等で`target`は再生成されます）
というわけで`resCahce`に`RenderTarget`を引数とするリソース生成用delegateを渡せば`target`更新時のリソース再生成などをやってくれるようになっています。

```csharp
    class TestControl : D2dControl.D2dControl {
        public TestControl() {
            resCache.Add( "Brush", t => new SolidColorBrush( t, Color4.White ) );
        }

        public override void Render( RenderTarget target ) {
            var brush = resCache["Brush"] as Brush;
            target.DrawRectangle( new RectangleF( 10, 10, 10, 10 ), brush );
        }
    }
```
Particle Photonにdfu-utilを使ってファームウェアを書き込む方法

Arduino互換機のParticle Photonに対してdfu-utilを使い、USBケーブル経由でファームウェアを書き込む方法の覚え書き。

## dfu-utilのセットアップ

Mac OSXならHomebrewが便利。

```
$ brew update
$ brew install dfu-util
```

## デバイスの接続と確認

Particle Photonを「DFUモード」にして、USBケーブルを使ってMacと接続します。
DFUモードにする方法は[こちら](https://docs.particle.io/guide/getting-started/modes/photon/#dfu-mode-device-firmware-upgrade-)を参照。
USBケーブルを接続したら`dfu-util -l`で認識されているかどうか確認します。以下は出力例。

```
$ dfu-util -l
dfu-util 0.8
...
Found DFU: [2b04:d006] ver=0200, devnum=8, cfg=1, intf=0, alt=1, name="@DCT Flash   /0x00000000/01*016Kg", serial="00000000010C"
Found DFU: [2b04:d006] ver=0200, devnum=8, cfg=1, intf=0, alt=0, name="@Internal Flash   /0x08000000/03*016Ka,01*016Kg,01*064Kg,07*128Kg", serial="00000000010C"
```

## ファームウェアの書き込み

本家のファームウェアリポジトリの[リリースページ](https://github.com/spark/firmware/releases)から必要なファームウェアをダウンロードします。
リリースノートに書き込み用のコマンドも記述されています。以下はv0.4.7の場合。

```
$ dfu-util -d 2b04:d006 -a 0 -s 0x8020000 -D system-part1-0.4.7-photon.bin
...
DfuSe interface name: "Internal Flash   "
Downloading to address = 0x08020000, size = 249740
Download	[=========================] 100%       249740 bytes
Download done.
File downloaded successfully
$ dfu-util -d 2b04:d006 -a 0 -s 0x8060000:leave -D system-part2-0.4.7-photon.bin
...
DfuSe interface name: "Internal Flash   "
Downloading to address = 0x08060000, size = 169832
Download	[=========================] 100%       169832 bytes
Download done.
File downloaded successfully
```

2ファイルともに書き込めたら成功です。たぶん。
Swiftでゲーム作り！！ SpriteKitフレームワークの紹介

今日はSpriteKitというゲーム作成用のフレームの紹介をしていきたいと思います。

## SpriteKitとは
iOS7で出たゲーム作り用のフレームワークです。
ゲーム作りに必要なSKNode・SKActionなどの様々な便利クラスを提供してくれます。

![iOSgameDEV3_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/61598/63406649-934c-be4a-b5b1-3159819c4067.jpeg)

## SpriteKitのサンプルを動かしてみる
早速XcodeでSpriteKitのサンプルを動かしてみます。
新規プロジェクト作成画面でGameを選択します。

![スクリーンショット 2015-12-27 22.18.58.png](https://qiita-image-store.s3.amazonaws.com/0/61598/b6eeaf28-4ef1-9bcb-7034-04de279a3a9e.png)

作成されたプロジェクトを動かすと「画面タップで飛行機が出現するアプリ」が動いているかと思います。

![スクリーンショット 2015-12-27 22.22.32.png](https://qiita-image-store.s3.amazonaws.com/0/61598/2137e69f-f8b5-9517-ddd0-c46839be0b52.png)

## SpriteKitの機能
今動かしたサンプルを元にSpriteKitの機能について書いていきます。
まずは主要なクラスや機能について書いていきます。

### 画面を構成するクラス
SpriteKitでは画面をSKSceneクラスを使って表します。

SKSceneはゲーム以外のアプリのUIViewControllerのようなものです。
その上にSKNode(UIViewのようなもの)を配置していく事で画面を作成します。

SKSceneを画面に表示する方法ですが、UIViewControllerのviewプロパティーにSKSceneを貼り付ける事で画面にSKSceneを表示しています。

### 画面タッチイベント
画面がタッチされた時はtouchesBeganメソッドが呼ばれるので、それを使って画面タッチイベントを取得します。
touchesBeganはUIKitの機能なのですが、SKSceneがUIResponderを継承しているために使うことができます。

### フレーム毎に呼ばれるメソッド
SKSceneのupdateメソッドはフレーム毎に呼ばれます。
その為画面をフレーム毎に更新したい時はupdateメソッドに処理を書いていきます。

## その他の機能
サンプルでは使われていないのですが、まだまだ便利機能があるので簡単に紹介していきます。

### 物理演算
SpriteKitは重力や衝突といった物理法則を演算するの為のエンジンを備えています。

### 3Dゲーム
SceneKitというフレームワークを使う事で3Dゲームを作る事ができます。
こちらはiOS8から使える機能です。

### Pathfinding機能
iOS9で登場したGameplayKitを使えばPathfindingという機能を使う事ができます。
これは障害物情報と開始位置・終了位置を与えれば自動で開始→終了の最短ルートを出してくれるというものです。
GameplayKitでは他にもミニマックス法を実現する機能やStateMachine機能など面白い機能が多々あります。

## SpriteKitの長所
最後にゲーム作りで有名なUnityやCocos2Dと比較したSpriteKitの長所を書いていきます。

SpriteKitの最大の特徴は、iOSアプリの開発環境がそのまま使える点かと思います。
サンプルで紹介したようにSpriteKitはXcodeでSwiftを使って開発するのでCocoaPodsも使う事ができます。
その為DBライブラリや通信ライブラリも普段使っているものを使う事ができます。
それと広告・GoogleAnalytics等の外部SDKの導入も設定が比較的簡単なこともありiOSアプリ開発者にとっての学習コストは低いと思っています。

しかしUnityやCocos2Dと違ってAndroid対応ができない・UnityのAssetStoreのような素材が豊富な環境がないという弱点もあります。
そういった長所・短所があるので、iOS開発者が初めてゲームを作る場合はSpriteKit、慣れてきたらUnityを使うというスタイルが良いと思っています。

## まとめ
簡単ではありますがSpriteKitについて書いてみました。
ゲームを作る際の参考にでもして頂けると幸いです。

宣伝になってしまうのですが、[「SpriteKitでタワーディフェンスを作る」](http://www.atmarkit.co.jp/ait/kw/ios_game_dev.html)という連載を書いているのでゲーム作りに興味持ちましたらこちらも読んで見てもらえると嬉しいです。
gccをソースからビルド／インストールする

# 目的
configureスクリプトでMakefileを生成してビルド／インストールする場合、
1. ソースを取得し、
2. ./configureでMakefileを生成し、
3. makeでビルドし、
4. make installでインストール完了。

しかし、gccには./configureの追加オプションや追加の手順があるため、
gccをソースからビルド／インストールする手順をここに記す。

## 1. ソースを取得
https://gcc.gnu.org/mirrors.html
を参考にソースを取得したいURLを選択。

```bash:ftp.tsukuba.wide.ad.jpからgcc-4.8.5をダウンロード
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.5/gcc-4.8.5.tar.gz
```

## 2. 圧縮ファイルを解凍し、移動
```
tar xzf gcc-4.8.5.tar.gz
cd gcc-4.8.5
```

## 3. gccのビルドに必要なモジュールをダウンロード
```bash
./contrib/download_prerequisites
```

## 4. ビルド用のディレクトリを作成し、移動
```bash
mkdir build
cd build
```

## 5. configureスクリプトを実行し、Makefileを生成
```bash
../configure --enable-languages=c,c++ --prefix=/usr/local --disable-bootstrap --disable-multilib
```

>### configureオプション
https://gcc.gnu.org/install/configure.html

>|オプション名|説明|
|---|---|
|--enable-languages|gccのビルド対象言語|
|--prefix|make install実行時のインストール先ディレクトリ|
|--disable-bootstrap|通常は3回ビルドを行って検証を行うが、ビルド時間短縮のため、1回だけにする|
|--disable-multilib|64bit環境だとgnu/stubs-32.hでエラーが発生するので、指定|

## 6. ビルド
```bash
make > /dev/null
```

> 標準出力のリダイレクト先を**/dev/null**にすることで
標準出力に表示される情報を抑制する

## 7. インストール
```bash:root権限を持つuserで実行
make install > /dev/null
```

## 8. 確認
```bash
/usr/local/bin/gcc -v
/usr/local/bin/g++ -v
```

> ビルドしたバージョンと同じバージョンが表示されていれば、作業完了。
電子工作 > フォトトランジスタ > リミッタ回路 > 1.09V上限にできた

http://qiita.com/7of9/items/12ea577a999dab3b996e
で使用しているフォトトランジスタのI-V変換後の電圧が1V以上になる問題の対応。


## トランジスタ２つでの回路

http://qiita.com/7of9/items/e7ada5496d2a57ad5b31
のリンク先で紹介されているトランジスタ２つを使用する回路を試したが、抵抗を680Ωで試したところ、1.39Vの上限電圧となった。

どうも回路の理解がまだまだ。


## LED２つでの回路

別途、以下の「リミッタ回路」というものを見つけた。
http://www.nahitech.com/nahitafu/mame/mame3/lim.html

実際に試した回路は以下。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b8b174fc-463b-6ca7-2b0e-b4b3760dd484.png)

* 回路図の940nmという値は実際には正しくない。fritzingの扱いがまだよくわからず文字を消せなかった。


ブレッドボードで試したところ、Voutの上限電圧(フラッシュライトの光をあてた時）が1.09Vとなった。

希望していた1.0Vにかなり近い。

電圧に上限を設けるという仕組みについては、ダイオードのVFを使って電圧降下させればいいと教えてもらってL-53F3BTを購入したが、２つのダイオードを相対する方向に向けて接続するとは思わなかった。
underscoreコードリーディング（first）


underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##firstとは


###[underscorejs.orgのfirst](http://underscorejs.org/#first)

こんな説明。
>####_.first(array, [n]) Alias: head, take 
Returns the first element of an array. Passing n will return the first n elements of the array.


```javascript

_.first([5, 4, 3, 2, 1]);
=> 5

```

------------- 

配列の最初の値を返却します。nがあれば最初からn番目までの配列を返します。


###[underscore.first](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L453)

コード的にはこのあたり。


```javascript

  // Get the first element of an array. Passing **n** will return the first N
  // values in the array. Aliased as `head` and `take`. The **guard** check
  // allows it to work with `_.map`.
  _.first = _.head = _.take = function(array, n, guard) {
    if (array == null) return void 0;
    if (n == null || guard) return array[0];
    return _.initial(array, array.length - n);
  };

```

_.firstも _.headも _.take にもエイリアスがはってある
arrayがnullの場合はvoid 0(undefined)を返す
nがnullもしくはguardが存在する場合、元の配列のarray[0]を返す
それ以外の場合は_.initialを用いて、arrayからn番目までの値を生成して返す。（_.initialは配列全体に対して後ろからn番目までを除外するため、length-nとなる）
Atlas-SoC FPGAデータの書き方

#FPGAの書き込みの仕組み
Atlas-SoCではSDカードからFPGAを書くようだ。
linuxが起動する前のu-bootの起動時に書き込むとログが出ている。
![18.png](https://qiita-image-store.s3.amazonaws.com/0/99409/cfa75ab6-482e-9e2b-8d89-c48a8a186735.png)

SDカードのFAT16領域の
 ATLAS_SOC_GHRD/output_files/ATLAS_SOC_GHRD.rbf
が読み込まれているようだ。
#GUIで作ってみる
[CUIのスクリプトを実行](http://qiita.com/new3bon/items/1d7349f9bb0c2d6228a1)した後に出てくる
ATLAS_SOC_GHRD.qpf
をquartusで開き、コンパイルする。
成功するとsofファイルが出てくる。
SDカードにもsofファイルが入ってるけど、sofは使われていないようだ。
ログにあるようにrbfファイルが必要。
File - Convert Programming Files
でsofファイルからrbfに変換する。
![16.png](https://qiita-image-store.s3.amazonaws.com/0/99409/e7a7edf1-499f-c5a0-cf5c-e3a01e533c9f.png)
できたファイルをSDカードのFAT16領域に置くと、SDカードからの起動時に読み込まれるようになる。
でも、デフォルトで作るとこんな風にエラーが出る。
![19.png](https://qiita-image-store.s3.amazonaws.com/0/99409/740bf14f-cd0c-f3d0-199d-63b97df6a856.png)

スクリプトでは作られているのでどうやって作っているか調べてみる。
mks/quartus.mkにあった。

```
$$(QUARTUS_RBF_$1): %.rbf: %.sof
	$(ECHO) $$(QUARTUS_RBF_$1)
	quartus_cpf -c -o bitstream_compression=on $$< $$@ 2>&1 | tee logs/$$(notdir $$@).log	
```

compressonをかける必要があるようだ。
GUIのPropertiesでcompressonを有効にする。
![17.png](https://qiita-image-store.s3.amazonaws.com/0/99409/73a19b10-cd2d-f912-8cd7-98e8ddf42bd2.png)
これでLinuxが起動するようになった。

#FPGAデータを変えてみる
起動するだけでおもしろくないのでLEDが勝手にチカチカするように変更してみる。
ghrd_top.vのLEDに接続している部分の
`assign fpga_led_pio = fpga_led_internal;`
をコメントアウトして、以下に書き換える。

```
reg  [31:0] led_test;
assign fpga_led_pio = led_test[31:24];
always @(posedge fpga_clk1_50)
begin
	led_test <= led_test+1;
end
```

50MHzを分周するので１秒だと25bitぐらい必要。
今回は32bitのカウンタの上位8bitをLEDに表示するようにした。

これをコンパイルして変換したrbfファイルをSDカードに書き込み、
電源を入れ直してu-bootが起動すると勝手にLEDがピコピコするようになる。
AtlasのWebインターフェイスは動かなくなるけどね。
hogeって何？

高校時代の先生が「hogehoge」、「piyopiyo」と言っていたのを思い出したのと同時にそういや会社の新人に「hogeって何すか？」って聞いてきたことがあったので簡単にまとめてみる。

1.hogeとは
ググってみたらhogeってのはメタ構文変数と言うらしい。
とりあえずそこになんでも入れていい的な感じだとおおざっぱに覚えていたが、ちゃんと命名されているんだとちょっと感動した。

2.メタ構文変数って何個あるの？
自身が知っているのは「hogehoge」や「piyopiyo」程度だろうと思っていたけど、これまたググったらいっぱいあってちょっとびっくりした。さすがに数えるのは面倒なんでぜひ、ググッて下さい。

3.使い方は？
とりあえず変数の中に文字でも入れておきたい場合、仮置きのようにしとくのが一般的らしい。
例)

```
user_name = 'hogehoge';
```

4.終わりに
会社の新人に説明できない自分が嫌だったのを思い出したので書いてみたが、まだまだ知らないことだらけなのでちょっと勉強しようかと思って自分用メモにしておこうと思う。
あープログラムって素晴らしいな！(社畜道を極めたい)
論理削除したレコードをActive Admin側で表示されないようにする

Itemクラスのdeleted_atがnil値でなければ削除済みとしている場合、下記を定義すればよい。
（もともとdefault_scopeを切っていれば何もせずに表示されなくなるというか多分そうやるべき）

```
ActiveAdmin.register Item do
...
  scope_to do
    Class.new do
      def self.items
        Item.where(deleted_at: nil)
      end
    end
  end
...
end
```
DigitalOceanのCoreOSセットアップメモ

DigitalOceanのCoreOSのセットアップメモ。
CoreOSはDockerを使うのにベースとなるOS。
CoreOSの上でDockerのコンテナが動くイメージ。

## セットアップ
スペックは一番低いやつでOK。
OSはCoreOSを選択。
SSHキーは登録したものを設定。　これがcoreの公開鍵に設定される。

## ログイン

```shell-session
$ ssh -i 秘密鍵 core@IPアドレス
```
※初期のログインユーザー名が`core`なことに注意。

## パスワード変更

デフォルトではパスワードがないのでかけましょう

```shell-session
$ sudo passwd core
```
## sshのポートを変更する
デフォルトのままだと無用なアタックをたくさん受けるのでポートを変更する。
そして CentOS などと違って `/etc/ssh/sshd_config` ってわけじゃない。

[公式ドキュメント](https://coreos.com/os/docs/latest/customizing-sshd.html) を参照して作業する。

### 設定変更ファイル

```shell-session
$ sudo cp /usr/lib/systemd/system/sshd.socket /etc/systemd/system/sshd.socket

$ sudo vim /etc/systemd/system/sshd.socket
```

`ListenStream` の部分を変更


### 変更を反映

```shell-session
$ sudo systemctl daemon-reload
```

これでsshdのポートが変わる。

## Dockerの起動
これはこれでまた別のQiitaにまとめる。
zsh でrootか一般ユーザか表示をする




zshでrootか一般ユーザかわからなかったので、メモ



* 引用元 [Artificial truth · My zsh configuration](https://dustri.org/b/my-zsh-configuration.html)

```
##
# Prompt
##
setopt PROMPT_SUBST     # allow funky stuff in prompt
color="blue"
if [ "$USER" = "root" ]; then
    color="red"         # root is red, user is blue
fi;
prompt="%{$fg[$color]%}%n%{$reset_color%}@%U%{$fg[yellow]%}%m%{$reset_color%}%u %T %B%~%b "
RPROMPT='${vim_mode} ${vcs_info_msg_0_}'
```
GitLab Mattermostを入れてみた

# GitLab Mattermost
Mattermostはオンプレミスでも利用可能なオープンソースのSlackクローンです。
GitLab 7.14のOmnibus packageからMattermostが含まれるようになりました。
GitLabの認証システムを使用できるため、LDAP認証などをMattermostで使えるようになります。

# 環境
* Ubuntu 14.04
* GitLab CE 8.3 Omnibus package
* URL
    * GitLab http://gitlab.yourdomain
    * Mattermost http://gitlab.yourdomain:9999

#  インストール
[GitLabのダウンロードページ](https://about.gitlab.com/downloads/)を参考に、Omnibus packageをインストールします。
Mattermostもインストールされますが、デフォルトでは無効化されています。

# 設定
GitLabとMattermostの設定は/etc/gitlab/gitlab.rbに書きます。

## GitLabの設定
external_urlにGitLabのアドレスを指定します。
ここを設定しないと、MattermostでGitLabのSSOが使えません。

````
# /etc/gitlab/gitlab.rb
external_url 'http://gitlab.yourdomain'
````
## Mattermostの設定
[GitLab MattermostのDocument](http://doc.gitlab.com/omnibus/gitlab-mattermost/)を参考にMattermostを有効化します。
上のリンクでは、1つのサーバー環境でGitLabとMattermostを運用する場合はそれぞれにドメインを用意するよう書かれていますが、同じドメインで別のポートを指定することもできるため、今回はそちらを使用します。

````
# /etc/gitlab/gitlab.rb
mattermost_external_url 'http://gitlab.yourdomain:9999'
````

設定が完了したら、sudo gitlab-ctl reconfigureを[2回実行](http://forum.mattermost.org/t/solved-after-gitlab-mattermost-install-nothing-but-logo-is-shown/639/3)します。


http://gitlab.yourdomain:9999 を開いてMattermostのページが表示されたらとりあえずの設定は完了です。

![2015-12-27_21h51_15.png](https://qiita-image-store.s3.amazonaws.com/0/107231/84773dcd-7e61-0354-7197-bc18e3774e71.png)
FTP Server on CentOS7 を構築する

KVM ゲスト OS インストール用の iso ファイル等を Windows 環境からアップロードするために FTP Server を構築する

vsftpd をインストール

```
# yum install vsftpd
```

設定ファイル編集

```
# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #匿名アクセス無効
chroot_local_user=YES #ホームディレクトリより上位へのアクセス禁止
chroot_list_enable=YES #ホームディレクトリより上位へのアクセス許可リストを有効化
chroot_list_file=/etc/vsftpd/chroot_list #アクセス許可リスト
listen=YES #IPv4でリッスンする
listen_ipv6=NO #IPv6はリッスンしない
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem #サーバ証明書
```

ユーザリストに ftp 接続用ユーザを追加

```
# vi /etc/vsftpd/user_list
testuser
```

chroot_list ユーザのリスト作成

```
# vi /etc/vsftpd/chroot_list
testuser
```

サーバ証明書作成

```
# cd /etc/pki/tls/certs/
# make vsftpd.pem
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 -set_serial 0 ; \
cat $PEM1 >  vsftpd.pem ; \
echo ""    >> vsftpd.pem ; \
cat $PEM2 >> vsftpd.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
...............+++
......................+++
writing new private key to '/tmp/openssl.XjyYCB'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Sinagawa
Organization Name (eg, company) [Default Company Ltd]:xxx.com
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:ftp.xxx.com
Email Address []:root@xxx.com
```

vsftpd 起動

```
# systemctl start vsftpd
```

vsftpd の自動起動設定

```
# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
```

ファイアウォールの設定

```
# firewall-cmd --add-service=ftp
success
# firewall-cmd --add-service=ftp --permanent
success
# firewall-cmd --list-services
dhcpv6-client ftp ssh
```


root で ftp 接続したい場合は、ftpusers の root をコメントアウトする

```
# vi /etc/vsftpd/ftpusers
#root
```

root での ftp 接続はセキュリティの観点から許可されておらず、/etc/pam.d/vsftpd の 3 行目で拒否設定されている

```
# vi /etc/pam.d/vsftpd
#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      password-auth
account    include      password-auth
session    required     pam_loginuid.so
session    include      password-auth
```
Swift 2.0 で MaterialKit を使用する方法


以下の記事で紹介されているMaterialKitというライブラリがよさげだったので、
使ってみることに
[iOSの開発でお気に入りのライブラリN選](http://qiita.com/u651601f/items/08500df9246a6c208241)

[MaterialKit](https://github.com/nghialv/MaterialKit)

## インストール
ReadMeを見ていたらCocoapodsで入れれるみたいなので、
Podfileを書く

```:Podfile
platform :ios, "8.0"
use_frameworks!

pod 'MaterialKit'
```

そしてpod install してビルドしてみると・・・・大量のエラーが。

![スクリーンショット 2015-12-27 21.02.03.png](https://qiita-image-store.s3.amazonaws.com/0/55219/450ac83b-ad2c-ea14-8a2e-cf61fdd3352e.png)



どうやらSwift 2.0 で使う場合には :head を指定してあげないとだめみたいです
(参考：https://github.com/nghialv/MaterialKit/issues/45)
まだSwift 2.0 対応版がリリースされてないのかな

Podfileを以下のように修正し、再インストール

```:Podfile
platform :ios, "8.0"
use_frameworks!

pod 'MaterialKit', :head
```

エラーもでなくなり、綺麗にビルドできました〜

## 感想
Carthage に対応してくれないかな〜とか思ったり。
PRは出てましたけどね
FreeNAS 9.3 jail に h2o をインストール

NL54L + FreeNAS に http サーバを仕込みたい。なぜならば、サーバ用マシンが他に無いから:sweat: しかしながら FreeNAS に手を入れたくはありません。というわけで、jail で仮想マシンを作って仕込みます。可能な限り軽量なのが望ましいので、nginx より更に高速と最近噂の h2o をインストールしてみました。

# インストール
難しい事は何もありませんでした。 `pkg install h2o` でOK。

それから `/etc/rc.conf` の末尾に1行追加。

```/etc/rc.conf
h2o_enable="YES"
```

実験用に用意した設定ファイルは下記。

```/usr/local/etc/h2o.conf
user: www
pid-file: /var/run/h2o.pid
access-log: /var/log/h2o/h2o-access.log
error-log: /var/log/h2o/h2o-error.log
listen: 80
file.dirlisting: on
hosts:
  test.example.com:
    paths:
      "/":
        file.dir: "/media/www/test"
```

FreeNAS で用意したストレージ上に適当なデータセットを作成。それを jail の add storage で /media/www に設定。jail 内で `/media/www/test/index.html` を用意しました。

DNSサーバに test.example.com を設定し、クライアントマシンからwebブラウザで http://test.example.com/index.html を表示できればOK！:+1:

# 設定

openssl で鍵ファイルを用意して…とかは後日。
MacのVimでシンタックスハイライトを有効にする

普段はほとんどLinuxで開発しているから気づかなかったけど、MacのVimを利用している時に同じ.vimrcだとシンタックスハイライトしてくれなくて困ったので対応方法を調べてみた。


# 最初の対応

シンタックスハイライトを明示的に有効にする。

```vimrc:.vimrc
:syntax on
```

標準アプリのターミナル上ではシンタックスハイライトが有効になったけど、普段使いのiTerm2では有効にならなかった。

# iTerm2用の設定

```vimrc:.vimrc
:set term=xterm-256color 
:syntax on
```
これでiTerm2でも有効になった。

# MacOSXに限定する

有効になったけど.vimrcはLinuxと共用してるので念のため判定処理を追加した。

```vimrc:.vimrc
let OSTYPE = system('uname')
if OSTYPE == "Darwin\n" 
  :set term=xterm-256color 
  :syntax on 
endif 
```

参考リンク
http://vim.wikia.com/wiki/Turn_on_syntax_coloring_in_Mac_OS_X
http://shkh.hatenablog.com/entry/2012/06/17/222936