OmniAICreator/Qiita-1.07M huggingface dataset:
FuelPHPのルーティングについて

■基本的なルーティング
　　ルーティング設定は、fuel/app/config/routes.phpで行う。
　　リクエストされたURIと実行されるURIを配列で定義する。

　　return array(
　　　　'blog' => 'user/blog',
　　)

　　http://example.jp/blogにアクセスするとuserコントローラのaction_blog()メソッドが実行される。


■正規表現によるルーティング
　　ルート設定には正規表現を含めることが出来る。そのマッチした部分を右辺に代入するといったよ
　　うな、 左辺の正規表現による右辺の後方参照が利用可能。

　　:any　　　URIの任意の部分にマッチ
　　:segment　URIの1つのセグメントのみにマッチする。しかしそのセグメントは任意のものであっていい。
　　:num　　　数字にマッチ
　　:alpha　　文字にマッチ
　　:alnum　　文字と数字にマッチ

　　例：
　　　　return array (
　　　　　　'blog/(:any)' => 'blog/entry/$1',       // ①
　　　　　　'(:segment)/about' => 'test/about/$1',  // ②
　　　　　　'([0-9]{3})/detail' => 'test/id/$1',    // ③
　　　　);

　　・http://localhost/fuelphp/blog/abcにアクセスすると、:anyはURIの任意の部分なので
　　　blog/(:any)にマッチし、routingtest/entry/abcが実行される。$1は正規表現の後方参照で
　　　()で囲まれた最初の部分の値に置き換えられる。

　　・http://localhost/fuelphp/def/aboutの場合は、(:segment)/aboutにマッチしますので②のルートになる

　　・http://localhost/fuelphp/123/detailの場合は、[0-9]{3}は半角数字3文字を意味する正規表現なので③のルートになる
Airflow~インストール編~

Python3.6で動くようになっていたので下記に書き直しました
http://qiita.com/hatappi/items/0da6cc28e18fa9b5853f

## Airflowについて
[Airflow](https://github.com/airbnb/airflow)はAirbnbが開発元のOSSのJob管理ツール
[AWS re:Invent 2015](http://reinvent.awseventsjapan.com/)で話題になった模様。
Pythonで動く。

## 動作環境
* python2.7

## 事前の注意点
pythonのversionが2.6だとairflowを起動する際に、SyntaxErrorになるので注意！

## 手順

### 事前準備
最低限下記はいれておかないと
pipをいれる際にエラーになります。
```
yum install zlib-devel bzip2-devel openssl-devel gcc-c++ python-devel
```

### pythonのインストール
```
curl -O https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
tar zxf Python-2.7.6.tgz 
cd Python-2.7.6
./configure --prefix=/opt/local
make && make altinstall
export PATH=$PATH:/opt/local/bin
```

### pipインストール
```
curl -kL https://bootstrap.pypa.io/get-pip.py | python2.7
```

### mysql5.7のインストール
```
yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
yum-config-manager --disable mysql56-community
yum-config-manager --enable mysql57-community-dmr
yum install yum-utils
yum install mysql-community-server
yum install mysql-devel
```
* **Note**: rootの初期パスワードは`grep password /var/log/mysqld.log`で調べる

### Airflowインストール
`pip install airflow[mysql]`
`pip install airflow[celery]`
### 設定
```lang:airflow.cfg
sql_alchemy_conn = mysql://[usr名]:[password]@[host]:[port]/[db名]
broker_url = sqla+mysql://[usr名]:[password]@[host]:[port]/[db名]
celery_result_backend = db+mysql://[usr名]:[password]@[host]:[port]/[db名]
```


## 注意点
### pipを入れる際に`zipimport.ZipImportError: can’t decompress data; zlib not available`
これは予め`zlib-devel`をインストールしていないから起きてるのでインストールして
再度pythonのインストールからやり直してください

### pipを入れる際の`ImportError: cannot import name HTTPSHandler`
これは予め`openssl-devel`をインストールしていないから起きてるのでインストールして
再度pythonのインストールからやり直してください

### airflowを入れる際の`error: command 'gcc' failed with exit status 1`が出た時は
`mysql-devel`が入っていないので、`yum install mysql-devel`
rbenvでRubyの最新のバージョンに対応する



# 問題

```bash
% rbenv install 2.1.7
```

出力結果

```bash
ruby-build: definition not found: 2.1.7

See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build:

  brew update && brew upgrade ruby-build
```

# 解決

```bash
$ brew update && brew upgrade ruby-build
```

出力結果

```bash
Downloading ruby-2.1.7.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/f59c1596ac39cc7e60126e7d3698c19f482f04060674fdfe0124e1752ba6dd81
Installing ruby-2.1.7...
Installed ruby-2.1.7 to /Users/innova/.rbenv/versions/2.1.7
```

# 確認

```bash
$ rbenv versions
```

出力結果

```
  2.1.7
```  

# bundle更新

bundlerはrubyのバージョンごとに管理されているため、bundlerも更新する

以下のエラーがでてしまう

```bash
$ bundle install
```

出力結果

```
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.0.0-p643
  2.1.5
  2.1.6
  2.2.2
```

## 解決

```
$ gem install bundler
```

出力結果

```
Fetching: bundler-1.10.6.gem (100%)
Successfully installed bundler-1.10.6
Parsing documentation for bundler-1.10.6
Installing ri documentation for bundler-1.10.6
Done installing documentation for bundler after 5 seconds
1 gem installed
```
LAMPローカル開発環境

#VirtualBoX関係
VMを作るとき64BitOSが選べない→PCの仮想化機能を有効にする。

#環境構築1
##↓こちらがとても上手く纏まっていると思います。
CentOS7でLAMP環境(https://www.softel.co.jp/blogs/tech/archives/4997)

##/etc/php.ini変更
```
default_charset = "UTF-8"
date.timezone = "Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = auto
mbstring.substitute_character = none;
mbstring.func_overload = 0
mbstring.strict_detection = Off
mbstring.http_output_conv_mimetype=
```
ドキュメントルートの権限変更
```chown -R hoge:hogegrp /var/www/html/```
#環境構築2
##CentOS更新
```
sudo yum -y update
```
##時間の同期
chronyで時刻を同期する

##ユーザー追加
```
useradd hoge
passwd hoge
usermod -G wheel hoge
```

```
vi /etc/pam.d/su
#auth required pam_wheel.so use_uid
↓
auth required pam_wheel.so use_uid
IntelliJ ideaのメモリ設定の場所(osx)

ファイルの場所は、
/Users/[名前]/Library/Preferences/IntelliJIdea15/idea.vmoptions

中身は、

```
-Xms2048m
-Xmx4096m
-XX:MaxPermSize=1024m
-XX:ReservedCodeCacheSize=518m
-XX:+UseCompressedOops

```

こんな感じで。
brew update実行時に、tapエラーがでるときの対処方法



# 問題

```bash
local [master] % brew update
Error: Failed to update tap: caskroom/versions
Updated 5 taps (caskroom/cask, homebrew/binary, homebrew/science, homebrew/versions, peco/peco).
```

# 解決方法

## untap

```bash
$ brew untap caskroom/versions
```

出力結果

```bash
Untapping caskroom/versions... (287 files, 4.0M)
Untapped 0 formulae
```

## tap

```
$ brew tap caskroom/versions 
```

出力結果

```bash
==> Tapping caskroom/versions
Cloning into '/usr/local/Library/Taps/caskroom/homebrew-versions'...
remote: Counting objects: 363, done.
remote: Compressing objects: 100% (309/309), done.
remote: Total 363 (delta 99), reused 210 (delta 52), pack-reused 0
Receiving objects: 100% (363/363), 106.66 KiB | 0 bytes/s, done.
Resolving deltas: 100% (99/99), done.
Checking connectivity... done.
Tapped 0 formulae (381 files, 1.6M)
```

## 再実行

```bash
% brew update                 
```

出力結果

```bash
Already up-to-date.
```
AltspaceVRでセミナー参加してみて感じたこと＋VRまつり覚え書き

# 『HMDもからあげもバカ盛り！ VRまつり2015秋 Powered by G-Tune』に参加しました、オンラインで

- これです： http://panora.tokyo/3891/
- 都合が合わずオンラインからの参戦となりました。単純にYouTubeLiveでながめることになるのかなと思っておりましたが、AltVRに会場があると見かけたので参加してみました。
- 初AltspaceVRでしたが思っていたよりも自然に参加できて良かったです。

# VRまつり覚え書き

- AltVRに気をとられてメモがおろそかでしたので脳内から印象に残ってたポイントを（セミナーの情報ほしい方はtogetterのほうがオススメです： http://togetter.com/li/903641 ）
- **「KiLA」が示す個人モーキャプ時代の到来**
 - 自然なモーションキャプチャーすごい、つかってみたい
 - ニューロン壊れやすい、買うなら予備も
 - ライブカートゥーン！！！
- **HTC Viveの魅力とコンテンツ開発**
 - Viveはヴィーヴが正しい（？）発音
 - ViveはOculusと反対に信号を受け取る方式
 - Viveのスケールは3m×4m、ひろい
  - 狭い場所でやると、部屋の隅のボタンが壁の向こうで押せないとか
 - PCゲーム市場Steam
 - 90FPSはつらい
- **Hololens・Magic Leapに備えるARグラス基礎講座**
 - 昔のAR＝マーカー式
 - MagicLeapは部屋全体がマーカーに（散らかってる部屋のほうが良い！？ｗ←特異点が多くマーカーになりやすい）
- **Tokyo VR Startupsについて**
 - http://tokyovrstartups.com/
 - 開発者は審査受けよう
- **VR元年に備えたPC選びのコツ**
 - グラフィックの性能重要、ゲーミングPC買おう
 - Optimus問題
 - ひとまず製品版Oculusのはデスクトップしかない
- **進撃の巨人・360度シアター「哮」のつくりかた**
 - 10万人かぶったコンテンツ！！
 - フランスでも日本語版を1500人が体験
 - 40人同時Oculus
 - どこから見ても遠くの壁が見えるようにしたかった
 - 手動で見えない建物を消し去って軽く・・・！
 - Occlusion Culling手動・・・！
 - 巨人いっぱい出すために75fpsあきらめて60fpsだった
- **VRで変わる？ 変わらない？ アニメの未来**
 - 水島監督のVR体験談
 - 「ToyBoxで存在しないはずの壁に手をついてころんだ」
 - VR保険
 - SAOは来年きてもおかしくない！！
 - アンジェラちゃんのポリゴン数は3万

# AltspaceVRについて

- こちらです：http://altvr.com/
- OculusやLeapMotion、Kinnectなどの最新デバイス対応のバーチャルな空間で集まれる場所です
 - 最新デバイスなくてもokです。私も今回の参加時はPCだけで参加しました
- 事前にユーザー登録とクライアントダウンロードとOculusRuntimeのダウンロードが必要です！ **Oculus使わなくても必要です！！！（ここで若干はまりました）**
 - https://altvr.zendesk.com/hc/en-us support、ちゃんと読みます。。
- あと、基本は音声チャットなのでマイク用意が必要です。macについてるものを使ってましたが、キーボード叩いてるとうるさいのでちゃんと別途用意したほうがスムーズな気がしてます。

## AltVRで良かったところ

- ゲームっぽい感覚で楽しめる
- YouTubeのライブもバーチャル空間内から自然に見ることができた
- AltVRの部屋広くて探検するの楽しかった
- セミナー後にからあげ（3Dモデル）だしたり、ゲームしたりできて楽しかった
- 会話の音声がちゃんとアバターがいる方向から聞こえてきている感じで良かった

## AltVRで困ったところ、もっとこうなってほしい！というところ

- 音声問題。YouTubeのライブの音声と他の人の会話音声とのうまいバランスのとりかたがわからず、会話を聞こうとするとYouTubeの音がうるさくて参加し難かった。
- 使い方がまだ完璧ではなかったのでもしかしたらどこかのメニューにあったのかもしれないのですが、あの空間内でメモとかとれるようにしたいです
- 喋っている人が誰なのかあまり把握できなかった。アバターが光っていましたが、そちらを向かないとわからないのが少し不便でした。参加者の名前一覧と喋っているかどうかわかるものがメニューから見えたら良さそう
- 頭の上にスタンプとか簡単な感情表現出せたら面白そうでした（音声チャットなので混線すると大変で遠慮しちゃうけれど、聞いてるよ！をアピールしたりしてみたいです）
- PCから参加の人は OculusRuntimeとかインストールしなくて良いようにしてほしいです
 - 普通の（開発とかしていないような）友人誘って遊んでみようと思った時のハードルがあります。。

# バーチャル空間でのセミナー参加に関して

- アリだなー！というのが率直な感想です
- ちゃんと聴きたいときはYouTubeで。もっとカジュアルな感じで聞いたり、つぶやいたりしたいひとはAltVRで、という住み分けはおもしろいと思いました
- KinnectやLeapMotionがあると手が出たり面白かったので、せっかく参加するなら道具もしっかり準備したほうがコミュニケーションとりやすいと思いました
- あと、思ったより身構えるものじゃないなーというのが一番大きかったです。
 - オンラインゲームとかももう自然に存在する時代なのでバーチャル空間でのこういう集まりは割と自然にいけそうです
第29回山陰ITPro勉強会 参加レポート

http://sitw.techtalk.jp/sitwinfo/info29

* ハッシュタグ #sitw29
* 2015/11/20 松江オープンソースラボ


----
 NICTERグラフィカルでカッコいいです、触ってみたい
 Docker使ってましたがLXCのほうが楽ならそっちでもいい(ときもある)かも
 CTFはガッツリ参加は時間的に厳しいけど出来る人は是非

## メインセッション: 情報通信研究機構におけるネットワークセキュリティ技術の研究開発 
* NICTERの仕組み
    * ダークネット(使用されていないIPアドレス、28万個、世界最大級)を利用
        * ネットワークモニタリング
    * パケット解析
    * マルウェア解析
        * ハニーポット
    * センサーとは
        * パケットを記録するのみ
        * 数万円程度(安価になった)
    * ダークネットで何が見えているのか
        * マルウェアによるスキャン
        * DDoS攻撃の跳ね返り
        * 設定ミス
        * リフレクション攻撃の準備活動
    * 攻撃の傾向
        * 以前 80,445ポート
        * 今 23(telnet)ポート
            * IoT製品の広がり
    * http://www.nicter.jp/nw_public/scripts/index.php#nicter
    * 攻撃元IoTデバイス
        * 様々なデバイス
            * ルーター、カメラ、ヒートポンプ、アンテナ、食品加工機器...
* DAEDALUS(無差別型攻撃向)
    * マルウェア感染対策の現状
        * 防御側の限界
    * 概要
        * ある組織のIPアドレス群(ダークネットとライブネット)
        * ダークネット側で攻撃などを検知するとそれを組織に通知する
    * 地方自治体へのアラート提供
        * 自治体が使用するIPアドレス(範囲)さえ分かればアラートを提供できる
        * 年金機構のことがあってから申し込みが増えた
    * ASEANへ
    * 一般企業へ
        * 商用アラート
* NIRVANA改(標的型攻撃向)
    * 標的型攻撃
        * 以前は特定の組織や技術を持ったところがターゲットはなっていた
        * 今はそうでない企業も足がかりとして狙われるようになってきた
            * すべての人がターゲットとなり得る
    * 入口/出口対策=境界防御=>止められない
        * FW
        * IDS
        * IPS
    * http://www.nict.go.jp/press/2015/06/08-2.html
* おまけ
    * NICTの読み方は ニクト ではなく エヌ・アイ・シー・ティーが良いらしい
        * ニクト は海外で(良くない)スラングとして使われてるとか

## サブセッション1: アプリの開発検証は、LXC+Ansibleで楽ちんにやろう！
* 解決すること	
    * コンテナ技術を使ってリソース共有とOSインストールを楽にする
    * 自動構成管理ツールを使って
* Linuxコンテナ
    * Dockerは学習コストが高いから
    * それに枯れてないから追ってくのが辛い
* LXC
    * Ubuntu14.04LTSが楽
    * CentOS7だとちょっとだけ大変
* Ansible
    * 自動構成ツール
    * ネットワーク関係の設定どうするか
        * コンテナには外部からアクセスできない、ので
        * 楽なのはReverseProxy
            * ブリッジしたりしてもできるんだけど、楽じゃないから
* どうにもならない話(欠点)
    * カーネル共有するので、カーネル弄るような評価では使えない場合がある
        * Ubuntu14.04上でCentOS6動かしたら、CentOS6のカーネルはUbuntuのものなので


## サブセッション2: 僕がCTFに参加するわけ
* たけなかひろゆき さん
* CTF
    * http://www.trendmicro.co.jp/jp/sp/ctf2015_jp/
* なぜ参加するのか
    * 技術を基礎から学べる
        * しらなくても生きていける(Webサービスくらいなら作っていける)
    * 楽しくセキュリティが学べる
    * クラッカーの考え方を学べる
        * 楽しそうに事例を紹介してました
    * 人とのつながりができる

-----
## その他
* セッション外で、「Androidのファーム焼き直し時に固まってしまったが叩いたら直った」という話が聞けて面白かっです
    * GセンサーかUSBの差し込みの不良だったんじゃないかという話
    * 機械は叩いたら直る！
Lambda function内からInvokeしたユーザのcognito IDを取得する方法

cognito IDをいわゆるユーザIDのようなユニークな識別子として使っている場合、Lambda function内からcognito IDを取得したいですよね。
たったこれだけなんですが、すぐ見つかりそうで探し方が悪いのか中々見つからなかったため書いときます。

```js
exports.handler = function(event, context) {
    console.log('Cognity identity ID =', context.identity.cognitoIdentityId);
};
```

なおAWSコンソールからLambda functionをテストするなど、cognitoを経由せずにInvokeした場合は以下のようにエラーになります。要注意。

```js
TypeError: Cannot read property 'cognitoIdentityId' of undefined
```

他にも``context``にはLambda functionに関するいくつかの情報が入ってます。
ログストリーム名とかはデバッグ時に便利かも。

```js
console.log('remaining time =', context.getRemainingTimeInMillis());
// remaining time = 9876
console.log('functionName =', context.functionName);
// functionName = functionName
console.log('AWSrequestID =', context.awsRequestId);
// AWSrequestID = 1111111-aaaa-2222-bbbb-3333333333
console.log('logGroupName =', context.logGroupName);
// logGroupName = /aws/lambda/functionName
console.log('logStreamName =', context.logStreamName);
// logStreamName = 2015/11/24/[$LATEST]1234567890abcdef1234567890abcdef 
console.log('clientContext =', context.clientContext);
// clientContext = undefined
console.log('Cognity identity ID =', context.identity.cognitoIdentityId);
// cognito id: ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx
```

## 参考

http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-model-context.html
http://stackoverflow.com/questions/29928401/how-to-get-the-cognito-identity-id-in-aws-lambda
http://stackoverflow.com/questions/32325015/how-to-get-cognito-id-in-a-lambda-function
c++ builder XE4 > IDE / bug > StatusBar1.Panels[] > bdRightToLeftがまともに機能しない > (ABCDEFGHI(AAA

```txt:動作確認
C++ Builder XE4
```

StatusBarのPanelにて右付けの文字列を用意しようとした。

- BiDiMode: bdRightToLeft
- Text : ABCDEFGHI(AAA)

上記の設定をすると、実際に表示されるのは`(ABCDEFGHI(AAA`となり、最後の`)`が左右反転して先頭に来てしまう不具合がある。

最後の文字の前に数値が来た時は発生しない。数値以外（英文字、#などの文字）が最後の文字の前にあると発生する。

<hr>
ソフトのバグの裏をかいて以下のようにすると`ABCDEFGHI(AAA)`にできるが、XEのバージョンアップ時に不具合が直ると問題になりそうなのでダメ。

- BiDiMode: bdRightToLeft
- Text : (ABCDEFGHI(AAA

<hr>
別の対応方法としては、Panels[]を１つ増やして、左付けの文字とする。文字の前を別のPanelで幅調整する。

こちらはXEのバージョンアップ時にも問題ない。
AWS Elastic BeanstalkのEnvironmentリンク機能

## 2015年11月23日にEnvironment間リンクの機能がAWS Elastic Beanstalkに 追加されました。

Microservicesベースのアプリケーションを設計・開発する際に、異なるアプリケーションコンポーネント間(例えば、フロントエンドとワーカー/フロントエンドとAPI 等)にリンクを作ることが出来るようになりました。

今までは手動でコンポーネント間のリンクをハードコードしなければならず、複数のコンポーネントで構成されるアプリケーションを管理するのは難しい状態でしたが、これからは簡単にアプリケーション間の動的なリンクを設計できるようになり、テンプレートに従ってコマンド一発で、グループもしくは個別に管理できるようになります。アプリケーションコンポーネント間のリンクはAWSマネージメントコンソール、CLIもしくはSDKを使って設定可能です。

Environmentリンク機能は特定の機能を持つ複数のコンポーネントを束ねるようなマルチTierなアプリケーションに便利で、例えば、ユーザーが画像をアップロードするオンライン画像加工のようなサービスの場合、フロントエンドのコンポーネント(ユーザーがアップロードおよび画像の閲覧を行う)とバックエンドの画像加工を行うコンポーネントを簡単にリンクさせることができます。

詳細は↓のElastic Beanstalkのドキュメントをご覧ください。
- http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-cfg-links.html
- http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/ebcli-compose.html

----
なお、本投稿は私が個人的に↓を訳したものであり所属する企業や団体における公式見解ならびに公式発表ではございません。

https://aws.amazon.com/jp/about-aws/whats-new/2015/11/aws-elastic-beanstalk-adds-support-for-environment-links/
JavaFX fxmlメモ

#メモです
ただのメモを記しておきます．
誰かの参考になれば幸いです．
#FXMLのロードがうまくいかない．
FXMLの文字コードがShift-jisの場合，FXMLのロードで失敗します．
文字コードはUTF-8にしてください．
めちゃくちゃここでハマりました．
#TextArea
TextAreaを表示ようにしたいときは\<TextArea editable="false"/>とする
[勝手宣伝] 俺のWindowsに、インテルのJVMクロス開発環境入ってる。

全国の**ネイティブアプリ**ファンに向けての煽り記事:
![intel2.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/47ad06a7-5d95-13c7-87f5-5257e74b9ece.png)

WindowsだってMacだって、この子だって、インテル入ってる！
https://www.youtube.com/watch?v=Os_oRR8Ynb8

ということで、クロスプラットフォーム開発環境をインテルのMulti-OS Engine Technology Previewで整えてみることにした:

少なくとも来年５月までは無償で使える、JVM->スマフォ環境(iOS・Android他)へのクロスプラットフォーム開発環境！
![intel.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/7e063b3f-858c-f1af-75f2-d7742df5c751.png)

インストール開始...おっと、android studioは最新のものにしてからにしよう。
![intel3.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/19278477-92e3-5988-9670-8f983d8bf5c1.png)

Android環境のアップデートが超重いので、Multi-OS Engineの[リリースノート](https://software.intel.com/en-us/articles/release-notes-for-multi-os-engine-technology-preview)ちら見しつつ、以下を軽く日本語で紹介:

#Multi-OS Engine(あくまでテクノロジプレビューだからね)
- JavaでiOSとAndroid開発行けるよ。
- Intel CPUとARM　CPU  両対応。
- iOSのAPIのJavaバインディングあるよ。
- Macでもwindowsでも開発できる。
- AndroidStudioベースだよ。
- iOS UIもAndroidStudioのUIデザイナー使って、作れるよ。

![Screenshot_from_2015-11-24 10:23:18.png](https://qiita-image-store.s3.amazonaws.com/0/16455/d52ba8aa-9ee0-9407-8f32-c53aab0b222e.png)

# 立ち上げは、android studioから
![enjoy.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/5b64800c-5147-a854-e53a-ccb3a7a42810.png)

Let's enjoy!(煽り)
docker versionコマンド

## はじめに

ここでは[公式リファレンス](http://docs.docker.com/v1.7/docker/reference/commandline/version/)を参考に説明しています。
ただ、バージョンや環境等により若干挙動が異なるかもしれませんが、その点についてはご容赦ください。
また、その他のdockerサブコマンドについては[こちら](http://qiita.com/kooohei/items/8acb82c6c0bf00bfb9bb)に記載していますので、もしよければ参考にしていただければと思います。

## 使い方

Dockerのバージョン情報を表示します。

```:使い方
使い方： docker version
```

Dockerクライアントとサーバについての情報を表示します。

```bash:デフォルト
$ docker version
Client:
 Version:      1.9.0
 API version:  1.21
 Go version:   go1.4.3
 Git commit:   76d6bc9
 Built:        Tue Nov  3 19:20:09 UTC 2015
 OS/Arch:      darwin/amd64

Server:
 Version:      1.9.0
 API version:  1.21
 Go version:   go1.4.3
 Git commit:   76d6bc9
 Built:        Tue Nov  3 19:20:09 UTC 2015
 OS/Arch:      linux/amd64
```

内容としては以下となります。

```
クライアントまたはサーバ
 Dockerのバージョン
 APIのバージョン
 Gitコミット
 Go言語のバージョン
 ビルドされたされた日付
 OSとアーキテクチャーの情報
```

　もう少し詳しく説明すると、Clientに記載されている方がコマンドを発行している環境の情報です。OSがdarwinとあるので、Mac OSで実行しているのがわかります。
　また、Serverに記載されている方はDocker Machineが動いている環境です。ここでわかるのが、OSがDocker Machineはlinuxとなっているので、コマンドを発行している環境と実行している環境が違うということです。
　今回は、MacにDocker ToolboxをインストールしてDocker Machineを作成しています。なのでVirtualbox上で動いているDocker Machineにリモートアクセスしている状況となるため、このような表示になります。

以上となります。
Xcode関連のドキュメントは何処

Xcodeを開いた状態で、

* [Command]+[Shift]+[0]

か

* ```Window``` メニューの ```Documentation and API Reference```

から開く。

ちなみに、UICollectionViewのリファレンスは、以下に存在する

* ```iOS 9.0 Documentation```
    * ```User Experience```
        * ```Tables```
            * ```Reference```
                * ```UICollectionView Class Reference```
Raspberry PiでSSHの反応が悪いときに実施すること


おそらく無線LANの場合のみだとおもいますが、SSHで反応が悪くなることがよくあります。
どうもパワーマネジメント機能が問題であるようで、それをOFFにします。

```
sudo nano /etc/modprobe.d/8192cu.conf
```
私の環境の場合は元々無いファイルだったので、新規作成しました。

```
# Disable power saving
options 8192cu rtw_power_mgnt=0 rtw_enusbss=1 rtw_ips_mode=1
```

参考サイト
[Raspberry Piで無線LANの反応が悪い時の対処法](http://denshikousaku.net/fix-sluggish-response-of-raspberry-pi-wifi-adaptor)
やさしいtmuxの設定変更

プレフィックス（標準だとControl + b）のあとに「:source-file ~/.tmux.conf」と入力する。
すると標準だと画面左下に以下のように表示されるはず。
![2427834-4fb34a763ccb98d689614edd713efe325b4e9b27.png](https://qiita-image-store.s3.amazonaws.com/0/41043/e7af6ddc-af7f-0cf8-21a1-994904b21cb8.png)
Enterを押せば設定が反映される。

毎回は面倒なのでbindを設定しておく

```lang:.tmux.conf
bind r source-file ~/.tmux.conf \; display-message "Reload Config!!"
```
Raspberry Piをリモコンにする


LIRCというソフトを使用します。
ほとんど下記サイトの通りにやれば問題ありませんが、一点だけ注意事項があります。

参考サイト
[Raspberry Pi で赤外線リモコン](http://d.hatena.ne.jp/penkoba/20131228/1388243358)
[Raspberry Pi で 赤外線リモコン を受信してみよう！](https://www.eyemovic.com/blog_it/4322.php)
[赤外線学習リモコン](http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/RaspberryPi/%C0%D6%B3%B0%C0%FE%B3%D8%BD%AC%A5%EA%A5%E2%A5%B3%A5%F3/)

/etc/modulesや/etc/modprobe.d/lirc.confの変更が書かれていますが、私の環境の場合それではデバイスファイルが作られませんでした。

そこで、もう少し調べてみたところ、下記サイト
[『Raspberry Piで遊ぼう! 改訂第3版』最新情報お知らせページ]
(http://v7.com/raspi3/?page=3)

6-12 P.221 「Raspberry Piを家電の学習リモコンにしよう」
に
Raspbian 2015-01-31（NOOBS 1.3.12）以降では、LIRCを有効にするための設定方法が変更になりました。
とあります。

/etc/modules ファイルは編集不要となり、そのかわりに /boot/config.txt ファイルを編集します。
```
dtoverlay=lirc-rpi,gpio_in_pin=17,gpio_out_pin=18 
```
これでいけました。

あとは下記コマンドで動作確認できればOKです。
```
% mode2 -d /dev/lirc0
```

ちなみに、赤外線送信するときは「LED拡散キャップ」はあったほうがよさそうです。
これがないとラズパイの位置決めがシビアになります。
Invalid Soundの解決

# 不具合の事象

内部で埋め込んで使用していたmp3ファイルを、サイズを小さくするため、
外部においてロードしようとしたが「Invalid Sound」とでる。
(URLRequestを定義後、Soundクラスのインスタンスに入れる。
その後、playする)


			[Embed(source="/assets/audio/bgm/xxxxx.mp3")]
			private static const xxxxxBGM:Class;
			internal var _xxxxxBGM:Sound = new xxxxxBGM as Sound;
			
▼

			var url : URLRequest = new (LoaderProxy.host + "/assets/audio/bgm/xxxxx.mp3");
			internal var _xxxxxBGM:Sound = new Sound(url);
# 不具合の原因

Embedした位置をurl宣言に変更したが、変数LoaderProxy.hostに値が入っていないので、
エラーがでる。
url記述場所を呼びたいタイミングのところに変更すれば、エラーがなくなった。
MySQLのORDERいろいろ

# ソートするときに指定するあれこれ

## こっちで指定した順にソート
```mysql
ORDER BY field (team, "ヤクルト","巨人","阪神","広島","中日","DeNA");
```
検索時に渡した順番で表示するときなどに使う。

## NULL を最後にして昇順にソートする
```mysql
ORDER BY field IS NULL ASC

# NULL ではなく空文字の場合
ORDER BY field = "" ASC
```

データがあるものを先に表示するときに使う。

## 大文字・小文字、全角・半角、濁音・半濁音を無視してソート
```mysql
ORDER BY field COLLATE utf8_unicode_ci
```

五十音表示とかで濁音や半濁音を含んで出力するときに使う。

# 並べ替えじゃないけど、ORDERを使ってよく書くSQL

## ランダムに１件取得する
```mysql
ORDER BY RAND() LIMIT 1
```
:no_entry_sign: でもこれはなるだけ使わないほうがいいらしい（プログラム側で全件数を取得して、乱数で指定した行を取得と2回クエリーを発行するほうが「速い」）
spec-mdインストールスクリプト+変換

## 参考

* [Spec Markdown を使って技術仕様書的な Single page HTML を簡単に作る - Qiita](http://qiita.com/kumatch/items/f85ca65bdc8e72a32eca)
* [書式](http://leebyron.com/spec-md/)

## インストール

```bash:
git clone https://github.com/tukiyo/sandbox-spec-md
cd sandbox-spec-md
./conv.sh
```
【Swift2.0】特定の画面のみ画面回転を固定にしたい

※ハマったため、自分用メモになります。

#目的

全体の数画面のうち、一画面のみ画面回転時に固定にしたい。

UIViewController.swiftに記述することで個別に画面回転をさせたい。

#前提

+ UINavigationControllerが有効になっていること
+ storyboardを使用してViewを構成していること

#手段
UINavigationControllerの拡張クラスを作り、shouldAutorotate()を定義する。
AppDelegate内で特定のUIViewControllerに対してセットする。拡張先のshouldAutorotate()の返り値は常にfalseに設定する。

#理由

+ XCode > PROJECT > infoタブ > Device Orientation

のチェックボックスを設定した場合、すべての画面にPortraitやLandspaceなどの設定が影響してしまう。
このチェックボックスをすべて外し、画面回転を許可した上で個別にコードでセットすることで、特定の画面のみ画面回転するようにできるため。

#ソース

```AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
        let mainViewController: UIViewController = storyboard.instantiateInitialViewController()!
        if (isDeviceIPhone == true) {
            self.window?.rootViewController = mainViewController
            self.navigationController = UINavigationController(rootViewController: mainViewController)

            // UINavigationControllerの拡張関数を呼び出す
            self.navigationController?.shouldAutorotate()
        } else {
            self.window?.rootViewController = ViewControllerForiPad()
            self.navigationController = UINavigationController(rootViewController: mainViewControllerForIPad)
        }

        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()
        return true
    }
}
```

```ViewController.swift
extension UINavigationController {
    public override func shouldAutorotate() -> Bool {
        // 画面回転をするかしないかをBool値で返す
        // この場合回転させないため、falseをリターンする
        return false
    }
}

```

# 追記
UIViewConteoller単位に記述する方法

```ViewController.swift
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        let navi:UINavigationController = UINavigationController()
        navi.shouldAutorotate()
    }

extension UINavigationController {
    public override func shouldAutorotate() -> Bool {
        return false
    }
}

```



※ここではデバイス判定のコードは割愛
※iPhone、iPadで処理を分け、iPhoneのみ画面回転をさせたくないケース

#備考

UINavigationControllerが有効になっている場合は、UINavigationControllerのデバイス回転を拒否してあげる必要がある。その際にextensionを利用すると便利。
DockerのmonoでGUIを表示

http://postd.cc/running-gui-apps-with-docker/ を参考にUbuntu14.04 でC#のWindows.Formを動かしてみる。
「test」フォルダを作り下記の2ファイルを作成する。

```c#:test/test.cs
using System;
using System.Windows.Forms;
class Program
{
  [STAThread]
  static void Main(string[] args)
  {
    var frm = new Form();
    var btn = new Button();
    btn.Text = "Push!";
    btn.Click += delegate { MessageBox.Show("Hello"); };
    frm.Controls.Add(btn);
    Application.Run(frm);
  }
}
```

```test:test/Dockerfile 
FROM mono
 
# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/test && \
    echo "test:x:${uid}:${gid}:Test,,,:/home/test:/bin/bash" >> /etc/passwd && \
    echo "test:x:${uid}:" >> /etc/group && \
    chown ${uid}:${gid} -R /home/test
USER test
WORKDIR /home/test
COPY test.cs /home/test/
RUN mcs test.cs -r:/usr/lib/mono/4.5/System.Windows.Forms.dll
CMD mono test.exe
```

以下を実行すれば、起動する。

```bash:ubuntu
docker build -t test test
docker run -it --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:ro test
```
arduino nano ピン配置

##atmega328
![2014-01-22T16-46-01.772Z-AtMega328-Arduino.png.855x570_q85_pad_rcrop.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/8222973c-24a6-bf2b-07fc-c880f88f4643.jpeg)
##ピン
```
PB0     D8
PB1     D9 (OC1A)
PB2     D10 (SS, OC1B)
PB3     D11 (MOSI, OC2A)
PB4     D12 (MISO)
PB5     D13 (SCK)
PB6     xtal
PB7     xtal
PC0     A0
PC1     A1
PC2     A2
PC3     A3
PC4     A4 (sda)
PC5     A5 (scl)
PC6     reset
PD0     D0 (RX)
PD1     D1 (TX)
PD2     D2
PD3     D3 (OC2B)
PD4     D4
PD5     D5 (OC0B)
PD6     D6 (OC0A)
PD7     D7
ADC6    A6
ADC7    A7
AREF    AREF
```
Thymeleafでセレクトボックスを使う

# セレクトボックス &lt;select&gt; の生成

Thymeleafでは繰り返し出力をする要素に対して th:each 属性を記載します。

JSTLのforeachとは異なり、繰り返し出力を行う要素を別のタグで囲うのではなく、繰り返し出力をする要素そのものに記載しますので、HTMLのインデントで悩むことはありません。

## 実装例

```html:select.html
<div class="col-md-3">
	<select id="jobId" name="jobId">
		<option th:each="job : ${jobList}" th:value="${job.id}" th:selected="${job.id == id}" th:inline="text">[[${job.name}]]</option>
	</select>
</div>
```

この例では、jobList は java.util.List型で、この中身のクラスは id と name フィールドを持つValueObjectです。

Thymeleafで繰り返し出力を指示しているのは、&lt;select&gt;ではなく、&lt;option&gt;です。
わかりやすいですよね d(・ω・)
mac > xxxは、開発元が未確認のため開けません。> control押しながらクリック、開くを選択

```txt:動作環境
Mac OS X 10.8.5
```

Fritzingを使用してみようとして、ダウンロードして実行すると以下のエラーとなりアプリを開くことができなかった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/10ac49bc-a6b8-af43-15ea-5ceaf05e853a.png)

対応方法の参考
http://itea40.jp/technic/mac-troubles/developer-is-unconfirmed/

1. すべてのアプリケーションを許可、に設定
2. アプリを開く
3. Mac App Storeと確認済みの開発元からのアプリケーションを許可、に設定を戻す

2回目以降は３の設定でも引っかからなくなる。

上記の方法で対処したが、参考ページを見ていると

> この方法を選ぶと、どんなアプリケーションも開いてしまうため、セキュリティが低下します。よほどのことが無い限り「control」キーを使った方法で、個別に開く許可を与えていったほうが安全かと思います。

実はcontrolキー使用の方が楽だった。

> 最も簡単に解決する方法は、対象となるアプリケーションを「control」キーを押しながらクリックして「開く」を選択するだけでOK！
[JS]トラックパッドの場合のonWheelイベントの制御

# 大前提
ウェブサイトを作っていて、スクロールを起点に演出を行い場合が多々あります（ページがスライドしたりなど）。
しかし、通常のマウスと違い、MacBookとかのトラックパッドだと慣性スクロールが働いて、ユーザーがトラックパッドから指を離した後も一定時間スクロールし続けます（onWheelイベントやonScrollイベントが発火し続けます）。
これを制御したいというのが今回のテーマです。

# 失敗ケース
とりあえず以下に試してみたけどダメだったやつを。

## ググる
先人の方々がとっくに解決策を見つけてくれてるだろうと期待しましたが、ベストな策は見つかりませんでした。
同じ悩みの方はたくさん見つかったのですが……。
http://stackoverflow.com/questions/12486141/check-if-user-is-scrolling-with-trackpad

## 慣性スクロールを切る
CSSとかJSで慣性スクロールを無効化できるか探しましたが、そのようなプロパティはありませんでした。

## イベントをonceにすれば、慣性スクロールを殺せるのでは……
onWheelイベントをonceにして、初回発火だけ拾い、setTimeoutとかで一定時間後に再登録すれば
初回の時の慣性スクロールが強制キャンセルされるのではと思いましたが、見事に生きていました。

## 慣性スクロールはユーザースクロール（ユーザーがトラックパッドを触っている時のスクロール）と違い、規則的な感覚で発火しているのでは……
event.timeStamp でイベントの発火時間が取得できるので、慣性スクロール時は感覚が一定なのでは（それによりユーザースクロールによるものか否かを識別できるのでは）と思いましたが、見事にバラバラでした。

その他にも2〜3個思いついては試しましたが、すべて不発となりました。

# 成功ケース
というわけで、結果うまくいった策は以下になります。

```js

var MOUSE_WHEEL_EVENT = 'onwheel' in document ? 'onwheel' : 'onmousewheel' in document ? 'onmousewheel' : 'DOMMouseScroll';
var callback = function () {};
var isFired = false;

var sleep = 250;// ここの値はお好み。小さくしすぎると一度のユーザースクロール中に複数回発火するし、大きすぎるとそもそもcallbackが発火しない。

var delta, uintDelta, timeStamp;

// キャッシュ
callback.delta = 0;
callback.timeStamp = Date.now();

document[MOUSE_WHEEL_EVENT] = function (e) {
    e.preventDefault();

    delta = e.deltaY ? -(e.deltaY) : e.wheelDelta ? e.wheelDelta : -(e.detail);
    
    // 移動量が0の場合は無視。
    // ユーザースクロールと慣性スクロールの切り替わりの瞬間に、0が発生することがあるので、それの予防も兼ねて。
    if (!delta) {
        return;
    }

    uintDelta = Math.abs(delta);

    if (uintDelta - callback.delta > 0) {
        // 増加
        timeStamp = e.timeStamp;

        if (!isFired && timeStamp - callback.timeStamp > sleep) {
            callback();
            isFired = true;
        }

        callback.timeStamp = timeStamp;
    } else {
        // 減退
        isFired = false;
    }
    callback.delta = uintDelta;
};

```

これによってユーザースクロール１回ごとに１回のイベント発火が可能になりました。
ポイントは、ユーザースクロールと慣性スクロールの見分け方を timeStamp でなく、
スクロールの増加量によって判断しています。
ユーザースクロール中は（例外はあれど）スクロール量が段々増えていき、慣性スクロールは段々減っていきます。
なので、スクロール量が増えた初回だけcallbackを発火し、その後減退したらcallbackの発火許可（isFired）を再び与えます。
また、それだけだとユーザースクロール中にスクロール量が減退したときにcallbackが複数回発火してしまいので
timeStamp でセーフティネットを設けています。

とりあえずこれが自分が見つけられた一番使い心地（スクロール心地）の良い方法でした。
もっといい案がある場合は教えて頂けると幸いです。
技術英語 > the fare hikes [were cut in half] > snowballed > That painter is completely [unheard-of].

@ LOE > June 15, 2012

http://loe.org/shows/shows.html?programID=12-P13-00024
> and the fare hikes <font color=red>were cut in half</font>,

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

http://eow.alc.co.jp/search?q=snowball
...
> 《動》snowballs ｜ snowballing ｜ <font color=red>snowballed</font>

「雪だるま式に増えていく」を動詞snowballを使って表現できる、と10年くらい前にNHKラジオ会話で聞いた覚えがある。面白い動詞なのでその場で覚えた。


<hr>
「聞いた」関連で思い出したのは

http://eow.alc.co.jp/search?q=unheard+of
> 1. 今までに聞いたことが［も］ない、前代未聞の、知られていない（unknown）、無名の、未知の、前例のない、空前の、未曽有の

https://kotobank.jp/ejword/unheard-of
> That painter is completely <font color=red>unheard-of</font>.
そんな画家はまったく聞いたことがない.

当時(5年以上前？)聞いた元々の文章は
> Those things are unheard-of these days. 「それらは最近は耳にしない」

という英文と訳だったが、今考えると「前代未聞の」と「these days」の組合せに違和感を感じる。
JavaScript中級者への道【序】

# JavaScript中級者への道【序】

## さらっと前書き
入社1年半、悟り世代のmatsubyです。研修では半年間Javaを触っていました。
今の案件では構成管理(Git)とプログラム保守(PHP)を主に担当しています。
余暇では、あまり業務では担当することの少ないJavaScriptを勉強しています。

本稿では、クラスベースの言語しか触ったことのない人の視点から
JavaScriptを勉強する理由、長所や言語仕様に対する不満についてざっくり論じます。

次回以降にJavaScriptの中級者となる上で欠かせないであろう知識・概念について
説明することを予定しており、本稿では技術的な話はメインで触れません。

## JavaScriptを勉強する理由
1. Webアプリケーションではフロントエンドで必然的に使わざるをえないこと
2. Node.jsなど、サーバーサイドでも活躍する機会が出てきたこと
3. プロトタイプベースの言語であり、プログラミングスタイルとして幅が広がること

自分の中で食いっぱぐれが無さそうな言語だと睨んでいます。GitHubでも人気があるらしい。
ただ、活動が活発であるが故に、情報の最先端に追いつくのが大変そうな印象を受けます。

## JavaScriptの良いところ
1. 基本的な文法が簡単であること
2. ブラウザとエディターがあればすぐに動かして試せること
3. 即席でオブジェクトが作れること
4. 関数もオブジェクトの1種であり、引数として渡せること
5. 書籍やWebでの情報が充実していること

「3. 即席でオブジェクトが作れること」についてちょこっと取り上げてみると、
xという名前で値が1であるプロパティを持つオブジェクトを作ろうとした場合に
JavaとJavaScriptでどのように異なるかをコードで示してみます。

```java:Javaの場合
// あらかじめ"x"というプロパティを持つクラスを定義しておく
public class HasX {
    private int x;
    public HasX(int x) {
        this.x = x;
    }
}

public class Main {
    public static void main(String args[]) {
        // 先に用意しておいたクラスをnewすることで、初めて目的のオブジェクトが作れる
        HasX hasX = new HasX(1);
    }
}
```

```js:JavaScriptの場合(オブジェクトリテラル)
// オブジェクトを意味する"{}"にKeyとValueをセットするだけ！1行で書けた！
var hasX = { x: 1 };

// 先にオブジェクトの箱だけ用意して、後からプロパティを追加することも可能
var hasY = {};
hasY.y = 2;
```

どちらが楽かは一目瞭然ですね。
関数の引数としてオプションを持ったオブジェクトを渡す時などに非常に便利です。

ちなみにクラスベースと同じような書き方もあり、こちらの場合はあまり差異はありません。

```js:JavaScriptの場合(コンストラクター)
function HasX(x){
    this.x = x;
}

var hasX = new HasX(1);

```

## JavaScriptへの不満
1. privateやpublicといったアクセス修飾子がないこと
2. extendsやimplements(interface)といった継承・実装キーワードがないこと
3. 名前空間がサポートされていないこと
4. 処理系(ブラウザ)によって動作が違うといったことが日常茶飯事なこと
5. ~~JQuery以外のデファクトスタンダードといえるフレームワークの不在~~→(※jQueryはライブラリとのこと)

1～3で挙げたように、JavaScriptの言語仕様に対する不足感は否めません。
また、ブロックスコープが無いため、グローバル汚染に気をを付けないと大変なことに…。

しかし、言語仕様の不足に関する諸問題は、大半がコーディング技術で補えるものです。
皆同じような壁にぶつかるのか、Google先生に聞けば大抵のことは教えてくれるはず。

IEとかいうポンコツは見なかったことにしましょう。心の健康の為に。

## JavaScriptのつまづきやすそうなところ
- [関数はオブジェクトの一種](http://qiita.com/matsuby/items/3f1c59e021508ca754d0)
- [4種類のthis](http://qiita.com/matsuby/items/36ac4743d5eed2391116)
- [関数スコープ](http://qiita.com/matsuby/items/1010ae38ee6258fd8020)
- [非同期関数](http://qiita.com/matsuby/items/3dd9cfca8c7b0685e474)
- [コールバック関数](http://qiita.com/matsuby/items/3f635943f25e520b7c20)
- クロージャ
- プロトタイプ継承

最後に、本題となる「JavaScript中級者への道」において必要となる知識の中で、
自分が実際につまづいた or つまづきそうだなと思った箇所について列挙してみました。

何を持って中級者かというと、微妙な感覚値になるのですが、
自分の中では「JavaSctiptでOOPが出来る」ことだと考えています。
また、JavaScriptでは非同期処理が珍しくないので、こちらも覚える必要があるでしょう。

次回以降の投稿では、これらの話題について取り上げていきたいと思います。
目指せ！脱・初心者！
Mac 上で Docker Toolbox 使って nginx を動作させる

手元で何か書いてるときに XHR 動作させたい場合、手っ取り早く Mac OS X 標準の Apache 動作させればいいとは思うんだけど、常に上げっぱなしなのはセキュリティ的な意味で精神衛生上よくない。

ので Docker Toolbox を使って限定的なサーバーを立ち上げる。不安定になったらコンテナー作りなおせばいいし、必要なくなったらコンテナーごと破棄すればいい。こういう後始末のしやすさもメリットかも。

nginx を使うのは Docker のチュートリアルに出てきてたからというだけ。まぁなんでもいいよね。

ファイル置き場の用意
--------------------

適当に ~/docker/web/contents をファイル置き場として用意する。

```sh
cd
mkdir -p docker/web/contents
```

この下に自分で書いたものを置いていく。テスト用に適当なファイルを作っておこう。

```sh
cd docker/web/contents
echo foo > index.html
```

シンボリックリンクも大丈夫なのでモノが別の位置にある場合はリンクはってやればいい。
<ins>1.9 に上げたらシンボリックリンクを読まなくなってしまったので直下にディレクトリー作って編集しないといけない。</ins>

```sh
ln -s /path/to/awesome/web/contents ~/docker/web/contents/awesome
```

設定ファイルの用意
------------------

どうも VirtualBox の sendfile がイケてないらしく、設定で回避する必要がある。

https://github.com/hiboma/hiboma/blob/master/VirtualBoxのsendfileのバグ.md

というわけで <code>sendfile off;</code> した設定ファイルを用意する。

```conf:~/docker/web/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        off;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
```

起動
----

で、次のコマンドで起動する。 <code>--name</code> オプションの名前や <code>-p</code> オプションのポートマップ先は好きなように変えてプリーズ。

```sh
docker run  \
    -d  \
    --name web  \
    -p 8080:80  \
    -v ~/docker/web/nginx.conf:/etc/nginx/nginx.conf:ro \
    -v ~/docker/web/contents:/usr/share/nginx/html:ro   \
    --restart always
    nginx:latest
```

接続
----

<kbd>docker-machine ip &lt;machine-name&gt;</kbd> して出てきた IP アドレスにつなぐ。一番最初に作られるマシンだと 192.168.99.100 なので http://192.168.99.100:8080/ へつないで、最初に作った index.html の中身が表示されれば OK 。

Docker Compose
--------------

docker-compose.yml はこうなる。

```yml:docker-compose.yml
web:
  image: nginx:latest
  container_name: web
  volumes:
    - ~/docker/web/nginx.conf:/etc/nginx/nginx.conf:ro
    - ~/docker/web/contents:/usr/share/nginx/html:ro
  ports:
    - 8080:80
  restart: always
```
Elixirでプロセス5000万くらい作ってみた

Elixirで、表題の通り5000万プロセスぐらい作ってみた。

## Elixirで20万プロセスを作ったその後

Elixirはerlang VMをベースとした関数型の言語だ。Rubyっぽい文法も使えて便利である。erlangの特徴である、軽量のプロセスが使えるのが一つの売りである。

少し前に、[Elixirでプロセス20万位作ってみた](http://qiita.com/shibacow/items/bd0e852a2bfe75caf437) という投稿を行った。その時は、デフォルトのprocess_limitのサイズ約26万を超えて、プロセスを指定する方法がわからなかった。親切な方から、26万を超えるprocess_limitの指定方法を教えてもらったので、それならどれくらいまで行けるかと思い、5000万までプロセスを作ってみた。プロセスの単位がインフレしすぎて、実際何の単位なのかわからなくなった。


## erlangのプロセス

この場合のプロセスは、erlangで使われる軽量プロセスのことだ。プロセスはerlangの並列処理を形作っており、それぞれ別のCPUでも動作する。プロセスにすることで複数のCPUを効率的に使える。
プログラムの並列度を高める方法として、(通常の)マルチプロセス、マルチスレッド、コルーチン、rubyのfiberなどがあるが、そのような中で、erlangの軽量プロセスがどの程度並列に動くか試してみた。

通常のOSのプロセスを複数立ち上げた場合、大体数百プロセス以上は辛くなりそう。また、スレッドの場合は、数千レベルで辛くなるだろう。一方、erlangの軽量プロセスは数万のオーダーで並列化出来ることが知られている。

## 実験環境

実験環境として、AWSのm4.10largeを利用した

|インスタンスタイプ|CPU|メモリ|OS|erlang|elxir|
|:---:|:------:|:----:|:---:|:---:|:-----:|
|m4.10xlarge |40|160GiB|Ubuntu14.04|Erlang/OTP 18|1.1.1|


40CPUで160GiBだ。昔、erlangが途中で落ちてコアを吐いたことがあり、その時はメモリいっぱい使っていて、HDDのそのメモリーイメージそのまま吐いたことがあった(うろ覚え)。160GiBのコアを吐く可能性があったのでHDDDは250GB程度用意した。

erlangとElixirのバージョンは以下

```
Erlang/OTP 18 [erts-7.1] [source] [64-bit] [smp:40:40] [async-threads:10] [kernel-poll:false]

Interactive Elixir (1.1.1) - press Ctrl+C to exit (type h() ENTER for help)
```

## erlangの最大プロセス数の指定

[こちらのブログ](http://d.hatena.ne.jp/hayabusa333/20151104/elixir_erlang)にあるが、```+P 1024```などと指定すれば、最大プロセス数を設定できる。
elixirで使う場合には、

```shell-session
export ELIXIR_ERL_OPTIONS="+P 50000000"
```
と環境変数を設定すれば、最大プロセス数を指定できる。

## 5000万プロセスを作ってみる。

次のレポジトリに、今回使ったコード一式を用意した。簡単なkey-value storeを5000万個作ってそれぞれに値を入れ引き出す。簡単なプログラムだ。殆どの処理は```lib/many_process.ex```に入っている。値の取得を一回しかやらないため、多くのプロセスは一回値の出し入れをした後、休眠状態になる。

https://github.com/shibacow/elixir_many_process_test

git cloneで手に入れた後、```mk.sh```を実行

iexが立ち上がった後、次のようにした。

```shell-session
Interactive Elixir (1.1.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(bar@localhost)1> :erlang.system_info(:process_limit)
67108864
iex(bar@localhost)2> iex(bar@localhost)2> ManyProcessFactory.main(["--pnum=50000000"])
```

のようにすれば良い。

そうすると、ひたすら5000万のプロセスを作る。
5000万プロセスが出来た段階で、大体メモリは130GB位使っていた。

![top](https://i.gyazo.com/b64724d262421ef2c3eed6ca154544e9.png)



![free](https://i.gyazo.com/eb8b4497eae7ada938478e138e3f5e40.png)

## 実験結果

elixirを使えば、大体5000万プロセスくらい作れる。ただしメモリーは139GB程度使用する。

## その他Tips

### バイナリでの実行

当初は、```mix escript.build```でプログラムを作って実行していたが、

```shell-session
export ELIXIR_ERL_OPTIONS="+P 50000000"
./many_process --pnum=10000
```

みたいにして、上手くプロセス数が変更できず、仕方なくiexで立ち上げる方式を採用した。

### プロセス数とプロセスリミット

プロセス数は

```ex
psize = Enum.count(:erlang.processes)
```

で取れた。
プロセス数の上限は

```ex
plimit = :erlang.system_info(:process_limit)
```
で取れた。

### afterを使った定時実行


afterを使えば、例えば10秒毎に、プロセス数を取得するみたいな構文がかけるが、このやり方がベストプラクティスかはわからない。

https://github.com/shibacow/elixir_many_process_test/blob/master/lib/many_process.ex#L50
シェルって何？

#シェルの説明聞いてもイメージが湧かん

Wikipediaには以下のような説明がある。

```php
シェル (shell) はオペレーティングシステム (OS) のユーザーのためにインタフェースを提供するソフトウェアであり、カーネルのサービスへのアクセスを提供する。それだけではなく、この用語は非常にゆるやかに応用され、特定のコンポーネントの周辺に構築された任意のソフトウェアを含むこともある。例えば、ウェブブラウザや電子メールクライアントはHTMLレンダリングエンジンの「シェル」といわれることがある。OSの内部（カーネル）とユーザーの間にある外殻であることから、このように呼ばれる。
```

カーネル、コンポーネントなどの意味も実はよく分かっていない。。。
という人は、以下の説明を見るとちょっと合点がいくかも。

* [シェル](http://www.cc.kyoto-su.ac.jp/~hirai/text/shell.html)
* [シェルって何？](http://cmd.misty.ne.jp/basic/02.html)
hub clone でユーザー名とパスワードを聞かれないようにする

`hub clone` コマンドでクローンするときに使用されるプロトコルはデフォルトで git を使用するようになっています。そのため、クローンするだけでも GitHub のユーザー名とパスワードが要求されます。ユーザー名とパスワードを聞かれないようにするためには、下記のコマンドを実行して https プロトコルを使用するように設定します。

```
git config --global hub.protocol https
```

## 参考
https://github.com/github/hub#https-instead-of-git-protocol
Rails: バリデーションエラーをViewに表示する

Remember our .errors.full_messages from using ActiveRecord before? We'll just go through each error message and display it as part of a bulleted list:

```erb
<%= form_for @movie do |f| %>
  <% if @movie.errors.any? %>
    <div>
      <%= pluralize(@movie.errors.count, "error") %> prevented this movie from being submitted:
      <ul>
        <% @movie.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
  [...]
<% end %>
```
【mySQLでデータ分析】SQLを書いてそれっぽいデータを取ってくる。

[昨日はテーブル作ってデータをインポートするところまでやりました。](http://qiita.com/MKnkgw/items/8d4e531e0a9e88e5a041)今日はSQL書いてデータを取り出して、分析みたいなことをしてみます。
## SQLを基本からコツコツやる
昔SQL書いたことあるけど、そんな昔のことを覚えているはずはありません。というわけで、基本からコツコツやります。Sequel ProでSQL文を書いたり実行したりは、「クエリ」からできます。

- twitterテーブルから全てのカラムを取ってくる：```SELECT * FROM twitter;```
- twitterテーブルのデータ数を取ってくる：`SELECT COUNT(*) FROM twitter;`
- twitterテーブルから、tweet本文にリンクを含むデータの全てのカラムを取ってくる：```SELECT * FROM twitter WHERE tweet_text LIKE '%http%';```
- twitterテーブルの曜日ごとのデータ数を取ってくる：```SELECT DAYNAME(tweet_datetime), COUNT(*) FROM twitter GROUP BY 1;```

## 分析に必要なデータを取り出す
Twitterのデータを分析して知りたいこととして、「内容は別として、何曜日の何時頃にどんな内容をtweetすれば、みんなに見てもらえるのかなー」ということがあります。というわけで、ちょっと切り分けてみました。

- 何曜日のtweetが一番よく見られているのか
- 何曜日のtweetのURLが一番よくクリックされているのか
- 何時のtweetが一番よく見られているのか
- 何時のtweetのURLが一番よくクリックされているのか

というわけで、こちらも基本から一歩一歩。まずはURLを含んだtweetとそのインプレッション数を曜日ごとに取ってきてみます。

```
SELECT DAYNAME(tweet_datetime), impression FROM twitter WHERE tweet_text LIKE '%http%' ORDER BY 1;
```

次に、URLを含んだtweetと、そのURLクリック数を曜日ごとに取ってきてみます。

```
SELECT DAYNAME(tweet_datetime), click_URL FROM twitter WHERE tweet_text LIKE '%http%' ORDER BY 1;
```

さて、合わせて取ってきてみます。

```
SELECT DAYNAME(tweet_datetime), impression, click_URL FROM twitter WHERE tweet_text LIKE '%http%' AND tweet_text NOT LIKE '%#ssci_new%' ORDER BY 1;
```

![dayname_impression_clickURL.png](https://qiita-image-store.s3.amazonaws.com/0/55954/9066c2fc-839e-c659-6515-761a5369fb65.png)

こんな感じで出てきます。やはり、数字が並んでいただけでは意味がわからない。というわけで、平均とか標準偏差とか中央値とかを求めてみたいところです。リファレンスを眺めてると簡単に見つかったので、まずは標準偏差と平均を出してみます。

```
SELECT DAYNAME(tweet_datetime), STD(impression), AVG(impression), STD(click_URL), AVG(click_URL) FROM twitter WHERE tweet_text LIKE '%http%' GROUP BY 1;
```

![STD_AVG.png](https://qiita-image-store.s3.amazonaws.com/0/55954/3e38e8b2-65ef-e629-55e6-83e3401683dc.png)


なんだかわかったような気にはなるけれども、これから言えることは何もなさそう。とにかく中央値を知りたいところ。が、とっても残念なことにmySQLには中央値を求める関数がありません。なのでさっき求めた「URLを含んだtweetと、そのインプレッション数およびURLクリック数を曜日ごとに取ってくる」SQL文で出た結果をcsvでエクスポートし、googleスプレッドシートで中央値を求めることにします。エクスポートはウィンドウのしたの歯車っぽいアイコンからできます。

![export.png](https://qiita-image-store.s3.amazonaws.com/0/55954/4ef3b0d0-6bbf-dcde-0cc5-c305311486ae.png)

あとはcsvファイルをgoogleさんに上げて、スプレッドシートで開いて中央値求めるだけ。これで、何曜日のインプレッションが良さそうで、何曜日のクリックが多そうか、なんとなく分かるのではないかと。

## 現在の問題点
### 「URLを含むtweet」では、対象として不十分
今回はURLの含まれるtweetを対象にデータを取り出しましたが、本心ではブログのURLが含まれるtweetだけを対象にしたいです。しかし、現時点ではそれができません。twitterは文字数の関係で、自動でURLを短縮してくれています。TwitterのAnalyticsからエクスポートできるcsvには、その短縮されたURLしか載っていません。なので、そのURLを見ても、それがブログのURLなのか違うのかわかりません。

この問題は、自分では解決できないので、[hogelog](http://qiita.com/hogelog)に助けてもらいました。具体的にはtweet本文に含まれるURLを展開して、ブログのURLかそうでないかを判別し、別のテーブルに入れるプログラムを書いてもらいました。別のテーブルが絡むので、今日と同じ感じにはできないと思われます。もちろん忘れているので、次回はそこから始めます。

### 中央値を求めるだけでいいのかよく分かっていない
平均ではダメってことは分かります。インプレッションは幾何平均のほうがいいのかもしれない。クリック数はまれに0のことがあるので幾何平均ではダメ。この辺り、現在勉強中です。

## 参考にしたURL、本
- MySQL 5.6リファレンスマニュアル：https://dev.mysql.com/doc/refman/5.6/ja/
- 入門統計学 -検定から多変量解析・実験計画法まで-：http://www.amazon.co.jp/dp/B00QGK2Z4W

この統計学の本はまだ少ししか読めていません。問題点2を解決したくて読んでみているのですが、今のところ面白くてスラスラ読めます。入門者に本当にちょうど良い感じです。
Unity+OculusRuntimeでのパフォーマンスお手軽調整手順

#概要
Unity5世代+ OVRSDK0.5.0 + Oculus Runtime0.5
という環境で、MMDモデルを鑑賞したりする感じのコンテンツでのパフォーマンス調整をしてみます。


#動作環境
ターゲット：GeForceGTX870M を搭載したOptimusなWindows ノートPCで75FPS
手元にGeforce GTX860Mがあったので、これで75FPS出せるようにしておけば、おそらく大丈夫でしょう。

Optimusノート向けのOculusRiftコンテンツ開発については
現時点でもこのエントリを踏襲することになります。

2015/8現在のOculusRift+UnityのノートPC対応　開発動作環境構築
http://izm-11.hatenablog.com/entry/2015/09/02/201003

#Unityバージョン問題
調子に乗って5.2.2p4をインストールしたらOculusRuntime0.5では何をやっても動かないという罠があったのでダウングレードします。
(画面が真っ黒になります)

5.0.3p3にしましたが、5.1.x系でも大丈夫だったと思います。

#パフォーマンスチェック
##1.シーンのTerrainの負荷チェック
Terrain+OVRPlayerControllerだけのシーンを作り、75FPS張り付きなことを確認します。
![image](https://qiita-image-store.s3.amazonaws.com/0/40627/735947e0-2e76-c6ca-83cf-5cc3155480be.png)

OVRCameraRigにOVRMainMenuがアタッチされていれば、ビルドして実行したときにスペースキーを押すことでメニューが表示され。FPSが確認できます。

##2.MMDキャラクタを含む全体シーンの負荷チェック
そのまま、まずはシーン全体でビルドして、(ExtendModeでDirectToRift.exeで起動して)FPSを表示しながら見てみます。
このときに、歩き回り見回しながら、**壁を向いたり天井を見たり、地面を向いたりして、描画負荷を変えながら、どうするとFPSが落ちるか観察します**

例えばありがちなのは

- 空を見たり床を見ているときは75FPS出ていて、後ろや横を向いていても75FPS
- ただし正面を見ていると60FPSくらいに下がる
- 試した感じでは、キャラクターを視界に入れていると75FPSを割ることが分かる

みたいなパターンでしょうか。一般的に**GeForceGTX860MではMMDキャラクター3人出ていると大体負荷は限界**です。

##3.FPS落ちの原因はCPUかGPUか判断する
エディタモードでProfilerを起動しながらシーンを再生してみます。
![image](https://qiita-image-store.s3.amazonaws.com/0/40627/805fa9bc-1f98-ffcc-3141-0fd6a60e60cd.png)
大体の場合、黄緑の部分が大きいことが分かります。これは**レンダリング(GPU)が重い**状態です。

物理演算や、AI部分が重い場合は、水色が大きくなります。余談ですが上のスクリーンショットだと**Camera.Renderだけで70%**を占めてます。

よって、**GPU負荷を減らす**ことにします。

##4.お手軽なGPU負荷軽減
OvrCameraRigを以下のように変更します。
- Native Texture Scaleを 1 → 0.7 に（フレームバッファサイズを小さくする）
- Eye Texture Anti Aliesを 2 → 1 に（アンチエイリアスを切る）
- Monoscopicのチェックを入れる（両目に同じ絵を映す）
![image](https://qiita-image-store.s3.amazonaws.com/0/40627/10e7a8fa-2193-2c3f-4acd-02e4b793095d.png)

これで再度ビルドして、2.の手順でFPSが出ているかチェックをしてみます。
これで75FPS出ていれば、 Monoscopicを元に戻す→Native Texture Scaleを1に戻す　と言う感じに元に戻しながら負荷を見極めていきます。

もし、上記のチェックをしても未だ75FPS出ていない場合は、いよいよ細かいUnityのパフォーマンスと戦うことになりますが、割とこのOvrCameraRigの設定だけでも描画負荷は結構変わります。お試しください。

##補足Unity VR Supportを使っている場合
- Native Texture Scaleの代わりにこちら http://docs.unity3d.com/ScriptReference/VR.VRSettings-renderScale.html
- Monoscopicチェックボックスの代わりに  OVRManager.instance.monoscopic の値をtrueまたはfalseに

となっています。

こちらで Unity VR Supportを使用している時のプロファイラの読み方も書かれているので併せてお読みください。
UnityのVRサポートでパフォーマンスとかプロファイルとか
http://udasankoubou.blogspot.jp/2015/11/unityvr.html
SwiftでiPhoneのシェイク検知

# motionBegan, motionEnded
簡単に実装できる，motionBegan, motionEnded, motionCancelled.
XY方向のシェイクは検知できたが，Z方向のシェイク検知はされなかった．
（そもそもシェイクとはXY方向の運動を指すのでしょうか...?)

```lang:ShakeDetector.swift
/*
 * NOTICE:
 * motion detect shake for XY axis.
 * shake for Z axis wasn't detected.
 */
override func motionBegan(motion: UIEventSubtype, withEvent event: UIEvent?) {
  // start shake
  if event!.type == UIEventType.Motion && event!.subtype == UIEventSubtype.MotionShake {
      LogUtil.debugLog("Start")
   }
}
    
override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent?) {
  // end shake
  if event!.type == UIEventType.Motion && event?.subtype == UIEventSubtype.MotionShake {
     LogUtil.debugLog("End")
  }
}
    
override func motionCancelled(motion: UIEventSubtype, withEvent event: UIEvent?) {
    // invalid motion
    // ex) long time shake motion.
}
```
参考文献にあるように加速度で検知するしかない模様...


## 参考文献
[SwiftでiPhoneのシェイクを検知する](http://qiita.com/takecian/items/098ff53684b8d5501a38)
間違えやすいGA分析その1：ページ滞在時間

# テーマ:ページ滞在時間

ページ滞在時間の間違えやすい点について解説しようと思います。
ちなみにページ滞在時間を平均化したものは以下の箇所で見られます。
![スクリーンショット 2015-11-01 17.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/100736/9b14bb5c-13f4-93e0-8e1b-5a21bde29a04.png)


# 問題

次の場合、ページA, B, Cのページ滞在時間はそれぞれ何分になるでしょうか。
なお、ページA, B, Cはそれぞれトラッキングされているとします。
![スクリーンショット 2015-11-24 0.39.21.png](https://qiita-image-store.s3.amazonaws.com/0/100736/baec3850-8379-9f45-9464-cc3d9ca47fe8.png)

# 答え

A 1分、B 2分、**C 計測不可**

# 解説

きっとCで意外に思われた方が多いと思います。
ページ滞在時間はどのように算出されているのでしょうか？

ページ滞在時間は
**そのページにアクセスしてから次のページにアクセスするまでの時間の差**
を表します。

なのでページCについては終端を取得することができないので滞在時間を計算することができません。

人によっては「平均ページ滞在時間が00:00になってる！バグかな？」のように思っていた経験がある人もいると思いますがこれでその謎が解けたと思います。

ちなみにですが、離脱ではなく直帰の場合は0秒でカウントされるようです。

# 参考記事

http://naruhiko1111.com/4562.html
http://www.infact1.co.jp/staff_blog/webmarketing/seo/21222/
初めてのDropwizardチュートリアル

#Dropwizardとは
公式HPより抜粋
http://www.dropwizard.io/0.9.1/docs/
```Dropwizard is a Java framework for developing ops-friendly, high-performance, RESTful web services.```

# やること
JavaのWebアプリケーションフレームワークDropwizardのチュートリアルを書経していきます(やってることは公式HPのチュートリアルをそのまま日本語で説明しているだけです)

#環境
- 実行環境
OS: Mac OS X (10.11.1 Ei Capitan)

- 開発環境
IntelliJ IDEA 14.1.5
Java 1.8.0
Dropwizard 0.9.1
maven 3.3.3
## (注)本チュートリアルは，Mavenをビルドツールとして使っていきます

##手順
``` 
1.Mavenプロジェクトの作成
2.各種ソースコードを書経
 2.1.Configurationクラスの作成（フォローなし）
 2.2.Applicationクラスの作成（フォローなし）
 2.3.Represenationクラスの作成（フォローなし）
 2.4.Resourceクラスの作成（フォローなし）
3.ビルド
4.確認
```
という流れでやっていきます
### 1. Mavenプロジェクトの作成
IntelliJ IDEA上でMavenプロジェクトを作っていきます
![Screen Shot 2015-11-23 at 10.05.26 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9376/ecb0c955-3d48-44e9-884a-b16a7527c4fc.png)
###1.1 pom.xmlの記述
公式HPにしたがい，dropwizardの箇所をpom.xmlに追加します
``` <properties>```
```    <dropwizard.version>INSERT VERSION HERE</dropwizard.version>```
```</properties>```
私の場合，上のversionを0.9.1に設定しました

dependencyも以下のようにpom.xmlに追加します

 ``` 
      <dependencies>
        <dependency>
            <groupId>io.dropwizard</groupId>
            <artifactId>dropwizard-core</artifactId>
            <version>${dropwizard.version}</version>
        </dependency>
       </dependencies>
```

### 2.各種ソースコードを書経
これは，公式HPをみながら各自対応お願いします（時間がない方は，コピペでもいいと思います）
各種クラスの説明については公式HPに載っているので，一旦ここでは説明を端折らせてもらいます.
気になる方は公式HPまたはすでにDropwizardについて記述されたこちらの方の記事などを参照お願いします
- http://qiita.com/hina0118/items/0886ed0e1a84d6077444


### 3.ビルド
dropwizardではすべてのクラスを含んだfat jarを作成することを推奨しています．
したがって，そのようなファイルが作成できるようにpom.xmlを編集します．
ポイント1: 外部jarは署名つきのものとして扱うように<META-INF>以下を設定
ポイント2: 次のようにjarで固めるので，mainClassがどこかを明示的に指定してあげること:<mainClass></mainClass>
### 4.実行
プロジェクトのトップディクレクトリ以下で次のコマンドを実行
```java -jar target/dropwizard-examples-1.0-SNAPSHOT.jar server hello-world.yml```

http://localhost:8080/hello-world
にブラウザでアクセスすると次のようなjsonが確認できると思います
```
{
"id": 1,
"content": "Hello, Stranger!"
}
```

### 最終的な成果物は次のGithubリポジトリを参照ください
https://github.com/otokunaga2/mydropwizard-examples