OmniAICreator/Qiita-1.07M huggingface dataset:
超個人的 Gradle メモ

# これは何？
仕事で Gradle 使う空気でてきたから予習メモ。主に公式ドキュメントの記述を取り出して、雑に意訳しただけ。Androd Studio に関係する情報を主に。

# この記事を信用してもいい？
基本的にだめ。絶対に[公式ドキュメント](https://docs.gradle.org/current/userguide/userguide.html)を読んだほうがいい。英語よむのきつくても頑張ろうな。

以下、本題


# Gradle メモ
詳しくは [Gradle ユーザガイド](https://docs.gradle.org/current/userguide/userguide.html)を見てね

## Gradle セットアップ
- Java 1.6 以上が必要
- gradle wrapper を使えば gradle インストール不要＆Ver指定できる。推奨

## コマンドラインで使うには
まずは[ここ](https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html?_ga=1.88902994.892534986.1481335068)を読むべし。

### タスクの実行
hoge っていう名前のタスクと fuga っていう名前のタスクを実行するにはこうする。

```
gradle hoge fuga
```

### タスクの依存関係
例えばこんなサンプルがある。

```
task compile {
    doLast {
        println 'compiling source'
    }
}

task compileTest(dependsOn: compile) {
    doLast {
        println 'compiling unit tests'
    }
}

task test(dependsOn: [compile, compileTest]) {
    doLast {
        println 'running unit tests'
    }
}

task dist(dependsOn: [compile, test]) {
    doLast {
        println 'building the distribution'
    }
}
```

distタスクはcompile, test という２つのタスクに依存している。また、testとその依存タスク自体もcompileに依存している。つまりcompileは３つのタスクから依存されている。Gradleは各タスクの依存タスクも実行してくれるが、どのタスクも必ず１度しか実行されないので注意。例えば……

```
gradle dist test
```

これを実行しても、compile タスクは１度しか実行されない。

### 指定のタスクを除外したい
次のようにする。

```
gradle dist -x test
```

こうすれば依存先である compile タスクは実行されるけど test タスクは実行されない。

## Gradle デーモン を活用すべし
Gradleでは普通、ビルドするたびJVMを起動する。その分のコストがかかる。
Gradle デーモンという仕組みを使えば、以下のメリットがある。

- gradleデーモンを使うと、毎度JVM起動する必要なくなるので低コスト。推奨
- gradleデーモンはビルドに関する情報をキャッシュしてくれるので良い
- ビルド速度上がる(15-75%短縮)

gradleデーモンはデフォルトだとoffになっている。Gradle3.0からはデフォルト有効。

## ビルド時間を調べる
` --profile`オプションを使うといい

## AndroidStudioプロジェクトの場合
以下すべてのコマンド例は、プロジェクトのルートから相対参照したもの。gradlewを使う。
### 最初にやるべきこと
まずは[ガイド](http://tools.android.com/tech-docs/new-build-system/user-guide)を読むべし。また、次のコマンドでどんなタスクがあるか一覧できる。

```
./gradlew tasks --all
```


### プロジェクトをビルドする

```
./gradlew app:build
```

### デーモンを使う
プロジェクトのルートディレクトリ直下に gradle.properties ファイルがある。gradleデーモンを有効にするには、これに次の行を書き足す。

```
org.gradle.daemon=true
```
無効にしたいならfalse。


いまはここまでしか書いてない。今後付け足すかも。
Unity AssetStoreに現れた「Vuforia AR Starter Kit」でARを体験する

[Akatsuki Advent Calendar 2016](http://qiita.com/advent-calendar/2016/aktsk)の10日目です。

こんにちは。@URAPROです。

今年も今月で終わりですね。振り返ってみると今年もいろいろと新しいものが流行りました。
つい先日「日経トレンディ ヒット商品ベスト30」というものが発表されましたが、ポケモンGOが一位になりましたね。昨年は新幹線。一昨年はアナ雪。そんなランキングで今年はあの「君の名は。」を抑えスマートフォンゲームが一位になったことが純粋にうれしいなあって思っていました。

そんなポケモンGOで広く認知されるようになったARという技術があります。
ミーハーな僕にはちょうどいいのでこの機会にARのことを調べてみます。

# ARって？
AR(Augumented Reality)は拡張現実(感)という意味です。PS VRを中心に話題沸騰中のVR(Virtual Reality)はコンピュータ上に人工的なものを作り出すものであるのに対して、ARは現実世界に対して仮想的な何か(情報とか)を加えるものです。つまり、夢があるってことです。

# 使うもの
2016/11からAssetStoreで配信が開始された「Vuforia AR Starter Kit」を利用します。(今まではVuforia for Androidとかだったようです)

![Vuforia AR Starter Kit - Asset Store - Google Chrome 2016-12-10 01.53.36.png](https://qiita-image-store.s3.amazonaws.com/0/131142/caf2b217-8221-cd41-d312-f525469be914.png)
[URL](https://www.assetstore.unity3d.com/en/#!/content/74050)

新卒である僕は「Starter」という言葉に弱いです。

# やってみる
というわけで、実際にやってみます。Unityは5.5.0f1を利用しました。

## Developer登録する
Vuforiaを利用させていただくには会員登録が必要です。
[https://developer.vuforia.com/user/register](https://developer.vuforia.com/user/register)で登録しましょう。

## license keyを発行する
登録が完了したら、[ここ](https://developer.vuforia.com/pricing)からライセンスを発行しましょう。
Sampleアプリではfreeライセンスを使用します。

↓こんな感じのものが発行できます
![License Manager _ Vuforia Developer Portal - Google Chrome 2016-12-10 12.27.37.png](https://qiita-image-store.s3.amazonaws.com/0/131142/7f351190-3d41-0766-81d4-edc81aa513a3.png)

## Importする
ここまでできたら、次はUnityで新しくプロジェクトを作って[Vuforia AR Starter Kit](https://www.assetstore.unity3d.com/en/#!/content/74050)をインポートします。
インポートするとメニューに「Vuforia」の項目がでるので、そこから「Set Sample App License key」で先ほどのライセンスキーを登録しましょう。

基本的にはここで準備完了です。
僕はものぐさで画像の印刷が面倒だなあと思ったので、この時点でAndroid実機にビルドしています。

## Sample Sceneを動かしてみる
### ImageTargets
画像を認識します。
サンプルでは、石のテクスチャ画像の上にポットを出しています。
![Screenshot_20161210-132953.png](https://qiita-image-store.s3.amazonaws.com/0/131142/c2dbfadc-e7c6-0e7c-b41d-3c1b33e1f5b3.png)

画像の角度とか位置も認識するようです。
![pot2](https://api.monosnap.com/rpc/file/download?id=dJbIUdbQqOSYiQQdZEUbiJdU3P6zW5)

### Multi-Targets
複数のテクスチャを認識します。(サンプルでは箱)
![Screenshot_20161210-134828.png](https://qiita-image-store.s3.amazonaws.com/0/131142/ebd23002-f38e-9141-5903-c2ea3ea6b1fe.png)

### Text Recognition
文字認識です。サンプルでは英字を認識しました。
![Screenshot_20161210-134828.png](https://api.monosnap.com/rpc/file/download?id=rfoJQhQb0xmodS3Z85HIDBxWgIHJCK)

楽しいですね。いろいろできそうです。

# まとめ
今回は「Vuforia AR Starter Kit」というAssetの紹介でした。
記事を書く時間の方が圧倒的に長いくらい簡単にARをUnityで利用できます。

ARには夢が詰まっているのでこれからも追いかけていきたい技術だな。と思いました。

おもしろくなってきたので続きはまた後日。

明日は@apstndbさんです。
Macで開発するときに使用するアプリ

## 2022年版を下記に書きました。

https://zenn.dev/kazuhiroito0127/articles/ea4cde71ac01b6

---

Macで開発等で使用するアプリ、これがないと作業が捗らないアプリをまとめます。

環境は　Mac OS Big Sur

# 開発時に使用するアプリ

## ターミナル

| アプリ名 | 使用中 | 内容 | 
|:-:|:-:|:-:|
| iTerm  |  ○ | 標準のターミナルアプリの代替。こっちのほうが色々機能が豊富らしい。|

## DBのGUIクライアント

| アプリ名 | 使用中 | 内容 | 
|:-:|:-:|:-:|
| Postico  |   | Postgresqlではこれだった。必要な機能はほとんどある。 |
| DBeaver | ○ | もうこれでDBのクライアントはすべておｋ |

## gitのGUIクライアント

| アプリ名 | 使用中 | 内容 | 
|:-:|:-:|:-:|
| Gitup  |  ○ | 変更点をサイドバイダイドでみれるので良い。意外に少ない。 |

## 色々をメモするアプリ

| アプリ名 | 使用中 | 内容 | 
|:-:|:-:|:-:|
| Notion  |  ○ | Markdown WYSIWYG Editorこそ真にすばらしいエディタだと思っている。やれること多いけど、コードとかもきれいにかけるのでいいです。 |

## テキストファイル編集

| アプリ名 | 使用中 | 内容 | 
|:-:|:-:|:-:|
| CotEditor  |  ○ | テキストファイルをさくっと編集したり文字を置換したりする際に便利。 |


# OS標準のショートカットでは満足できないので使用するアプリ

## アプリウインドウの移動・拡大・縮小をキーボードショットカットで可能にするアプリ

| アプリ名 | 使用中 | 内容 | 
|:-:|:-:|:-:|
| spectacle  |  ○ | 必要十分でありベストな使い心地。 |
| shiftlt  |   | ウインドウのサイズを微調整できるのが良い。 |
| Magnet |   | ウインドウのサイズを微調整したい場合結局マウスで広げないといけないのが残念。|

## アプリを終了するときのショートカットキーCmd+qを制御するアプリ

デフォルトだとアプリ終了はCommand+qであり、誤って終了することが多いので、アプリ終了コマンドを別コマンドにしたい人向け。

| アプリ名 | 使用中 |  内容 | 
|:-:|:-:|:-:|
| QBlocker | | Command+q長押ししないとアプリ終了しないように制御  | 
| Karabiner-Elements | ○ | 最強。 |

## 同一アプリ内での複数ウインドウを切り替えるキーボードショートカットを可能にするアプリ

デフォルトでもcommand+f1とかで出来たような気がするけど、押しづらいのでアプリ使う。

| アプリ名 | 使用中 |  内容 | 
|:-:|:-:|:-:|
| HyperSwitch  |○| 動作が自然でよい。OS標準にしてほしいレベル。 | 

## ランチャーアプリ

デフォルトのspotlightはなんか起動が遅いので。

| アプリ名 | 使用中 |  内容 | 
|:-:|:-:|:-:|
| Alfred  |○| 色々できるけど結局アプリ起動のためにしか使ってない。 | 

## カレンダーアプリ

メニューバーに日付とか小さいカレンダーをすぐ表示したい人向け。

| アプリ名 | 使用中 |  内容 | 
|:-:|:-:|:-:|
| Itsycal  |○| 自分の好きなフォーマットで日時や曜日や時間を表示できる。ミニカレンダーを表示できる。 |
vim-metarw でファイル名にコロンが含まれる場合に保存ができない (未解決)

解決には至っていないが、VimScript がよく分かっていない者でも原因の特定が(たぶん)出来たので、その過程を忘れないように残しておく。いわゆるタイトル詐欺。

今後、似たような事が起き得る可能性は十分にあるので。

## 環境

```console
$ uname -a
Linux desktop-arch 4.8.10-1-ARCH #1 SMP PREEMPT Mon Nov 21 11:55:43 CET 2016 x86_64 GNU/Linux
```

```console
$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Nov 15 2016 18:04:06)
適用済パッチ: 1-86
Compiled by Arch Linux
Huge 版 with GTK2 GUI.

以下略
```

## 症状

例えば下記のようなコマンドで、ファイル名にコロンが含まれるファイルを新規作成する。

```console
$ vim ~/tmp/ho:ge.md
```

編集後に `:w` で保存しようとしたところ、うんともすんとも言わない。当然 `:messeage` しても何もなく `:write` が無効化されてしまったような印象を受ける。

普段、ファイル名にコロンが含まれる場合などそうそう無いので全く気が付かなった。

※「可搬性からファイル名にコロンを使用すべきではない」という話はひとまず置いておく。

※コロンに限った話では無いかもしれないが、コロン以外の記号は試していない。

※後で気が付いだが、vim 起動時の新規作成ファイル特有のメッセージなども表示されていなかった。

## 原因の探し方

### vim 本体は正常か否か

まずは素の vim で試す。

```console
$ vim -u NONE -i NONE -N ~/tmp/ho:ge.md
```

ちゃんと保存できる。vim 自体は正常。

素の vim については [git用に素のvimを設定する - Humanity](http://tyru.hatenablog.com/entry/20110107/git_editor) が参考になった。

### 次に自分の vimrc 系の設定ファイルを疑う

おそらく保存まわりの追加処理に副作用が生じているのだろう。`autocmd` の `BufWrite` 系イベントを探る。

`vimrc` の類は `~dot/vim/rc` に用途別に分割して設置しているので [Silver Searcher](http://geoff.greer.fm/ag/) を使って全文検索を行う。

```console
$ ag --vim 'autocmd BufWrite' ~dot/vim/rc
```

副作用が生じていそうな箇所をコメントアウトし、vim を再起動させる。それを一通り繰り返す。

問題なし。

### 次にプラグインを疑う

プラグインは [NeoBundle](https://github.com/Shougo/neobundle.vim) で管理しており、実ファイルは `~dot/vim/bundle` 以下に設置している。

先程と同様に全文検索を行う。

```console
$ ag --vim 'autocmd BufWrite' ~dot/vim/bundle
```

現在は利用していない(無効化している)プラグインの実ファイルも `~dot/vim/bundle` 以下に残っているため、現在有効かつ副作用が生じていそうなプラグインを探し出すのは少々面倒だった。より効率的な方法があれば知りたい。

試行錯誤の結果、[vim-metarw](https://github.com/kana/vim-metarw) が原因らしいという事が分かった。実際に利用していたのはフォーク版の [mattn/vim-metarw](https://github.com/mattn/vim-metarw)


## どう解決するか (未処理)

1. `vim-metarw` の問題の箇所を修正
2. そもそも `vim-metarw` は [vim-metarw-redmine](http://mattn.kaoriya.net/software/vim/20121029223557.htm) でしか使っていない(たぶん)
  - 無効化してもたいして困らない(はず)
  - NeoBundle の遅延読込等で `vim-metarw-redmine` を常時有効にさせず、副作用を限定的にする

`vim-metarw` 自体メンテナンスされていないかも
YOLO(You Only Look Once)試してみた

[SSD](https://arxiv.org/abs/1512.02325)が現在最速のネットワークだと聞いて使っていたがなんとそれを上回るネットワークが発表されたらしい
それはあのYOLOの改良版とも言うべきYOLOv2
以下のようにSSDを上回るスピードと精度が報告されている
![yolo_comp.png](https://qiita-image-store.s3.amazonaws.com/0/109160/98b0fed4-51c2-a18a-c5c3-d75fd1bfac6f.png)
([サイト](http://pjreddie.com/darknet/yolo/)表より引用)
mAP, FPS共に前のYOLOを大きく上回っている
今回はこのYOLOv2の公開されている訓練済モデルで画像を認識させてみる
基本的には公式サイトにある通りに進めれば問題ない

## 今回使用する環境

以下の環境で作業を行った

* Ubuntu 14.04 LTS x86_64
* GCC 4.8.4
* CUDA 7.5
* OpenCV 2..4.8

## YOLOv2のダウンロード, コンパイル
公式サイトにある通りに進める
たった3個のコマンドを実行するだけで終わる
ライブラリ絡みで悩むことはない
他フレームワーク(Caffe, Chainer等)と比べて非常に導入しやすい印象を受けた
CUDAを有効にしたコンパイルについては[ここ](http://pjreddie.com/darknet/install/#cuda)
OpenCVを有効にしたコンパイルについては[ここ](http://pjreddie.com/darknet/install/#opencv)
これらを有効にするためにはMakefileを1行ずつ編集するだけなので簡単

* CUDAを有効化  
Makefileの1行目

```Makefile:Makefile
GPU=1
```

* cuDNNを有効化  
Makefileの2行目

```Makefile:Makefile
CUDNN=1
```

* OpenCVを有効化  
Makefileの3行目

```Makefile:Makefile
OPENCV=1
```

そして以下を実行

```shell-session
git clone https://github.com/pjreddie/darknet
cd darknet
make
```

## 訓練済みモデルのダウンロード
これも公式サイトに書いてある通りに

```shell-session
wget http://pjreddie.com/media/files/yolo.weights
```

## サンプルプログラムの実行

### 画像ファイルから認識する
公式サイトにあるように以下を実行するだけ
任意の画像ファイルを指定して認識できる
OpenCVを有効にしてコンパイルしていれば検出結果が表示される

~~`./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg`~~

2018/4/26 追記: @physics303 さんからコメントよりご指摘いただきました。
正しくは以下のようになります。

```shell-session
./darknet detect cfg/yolov2.cfg yolo.weights data/dog.jpg
```

`data`ディレクトリに入っている画像ファイル6種類を試してみた結果

![total.png](https://qiita-image-store.s3.amazonaws.com/0/109160/f5fa2627-7e39-a7b3-df34-e164d2661d13.png)

あらかじめ入っている画像だけあってかなりの検出率がうかがえる

### ウェブカメラからリアルタイム認識
CUDAとOpenCVを利用するようにコンパイルしてあることが必須
ウェブカメラを接続して実行
カメラが複数ある場合は使用するカメラ`-c <num>`オプションで選択

```shell-session
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights
```

----

あまりに簡単すぎて記事にする必要すらなかったかも…
darknetに驚き…
スタートアップへの転職先を一週間で決め、その一年後

###### 前述
Qiita AdventCalendarなので技術系ではないが、Qiitaに記載します

## はじめ

今回AdventCalendarに参加しようとしたキッカケは人生初の転職と転職してからほぼ一年になったので 
記念に参加してみました。

## 自己紹介

* 性別： 男
* 年齢： 24歳
* IT業界歴： 6年
* 社会人歴： 2年
* 転職回数： 1回

## 経歴

* 大学に入ってからすぐにSIのベンチャーで４年間プログラマーとして働く
* SIerに就職
* そして、すぐ転職し今の会社へ

## なぜ転職したか

この業界ではありきたりですが

* プログラマーとして入社したが、SIerに入ってからプログラムを組む事がなくってしまった
* 会社の事業が教育事業を始めようとしており、さらにプログラムから遠ざかる兆しがあった

## 転職

現在の会社とはWantedlyで出会い、
初見から内定、承諾まで一週間がかかりませんでした。。。と言うか掛けませんでした。

理由としては、新卒での転職なので失業保険が付かないことに加え、退社日が思ったいたよりもすぐだったためです。（退職が決定した日の翌月とか）

決め手としては社風が自分とマッチしていて、担当範囲もサーバサイドやフロントエンド、インフラと区別せずチャレンジできる裁量があった事が大きいです。


## 一年過ごしてみて

開発範囲に境界を設けていないお陰で色々な実装させてもらってます。

* Node.jsとRailsでサーバサイド書いたり
* AngularJSでフロント書いたり
* AWSでEC2インスタンスいじったり
* Pythonで解析したり

暗黙的な担当箇所はありますが、境界が無いので優先順位決めや見積もりが大変だったりしますが、
自分がどういう所が苦手で、得意なのかも分かって楽しく仕事させてもらってます。

JavaScriptが大好きな会社なので、Node.jsではES6やasync/await等の最新仕様でサーバーサイドを書けることも自分には刺激的です。
最新仕様に追従するためにレガシーなコードの対応等にも苦悩しそうですけど。

現在は新しい機能開発のためにnpmのpackageを作ったりシステムの仕様を考えたりとプログラムだけでない部分にも関わったりしています。

## まとめ

転職は事務処理等の面倒なことがあったりするかもしれませんが、
自分の環境がガラッと変わる（プログラムや開発言語もそうですが、なによりも人との関わりが）ので今すぐに転職したいとか考えていなくても
見学からも色々な刺激を得られると思います。


## 今後

来年はインフラ関係を積極的に入って、CDとか環境の整備やりたい。
Grapeを使ってRESTfulAPIを簡単作成 その3 Grape::Swagger

## Grape::Swaggerとは
grape-swaggerを使うと、grapeで作成したAPIのドキュメントが自動で生成されるようになります。
[GitHub: ruby-grape/grape-swagger](https://github.com/ruby-grape/grape-swagger)

## 目次
1.[Grapeを使ってRESTfulAPIを簡単作成 その1 Grape](http://qiita.com/Esfahan/items/90feb3ae39dde51f95fa)
2.[Grapeを使ってRESTfulAPIを簡単作成 その2 Grape::Entity](http://qiita.com/Esfahan/items/bdae2545e41588ccd1a5)
**3.Grapeを使ってRESTfulAPIを簡単作成 その3 Grape::Swagger**

## 環境
- rails 5.0.0.1
- ruby 2.3.1

## まずはgemをインストール
下記を追記

```rb:Gemfile
# api
gem 'grape'
gem 'grape-entity'
gem 'grape_logging'

group :development, :staging do
  gem 'grape-swagger'
  gem 'grape-swagger-rails'
  # markdown
  gem 'redcarpet'
  # highlight for markdown
  gem 'rouge'
end
```

bundle install

```
$ bundle install --path vendor/bundle
```

## ルーティングの設定
ドキュメントのURLが下記になるように設定します。
http://localhost:3000/docs

```rb:config/routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

  # app/api/api.rbをマウント
  mount API => '/'
+ mount GrapeSwaggerRails::Engine => '/docs' if defined? GrapeSwaggerRails
end
```

## swaggerの設定ファイルを作成
config/initializers/grape_swagger_railis.rb
このファイルを下記の内容で作成してください。

```rb:config/initializers/grape_swagger_railis.rb
if defined? GrapeSwaggerRails
  # swaggerのタイトルに表示される
  GrapeSwaggerRails.options.app_name    = "SampleApi"
  # http://localhost:3000/api/v1/swagger_doc
  GrapeSwaggerRails.options.app_url     = "/api/"
  GrapeSwaggerRails.options.url         = "v1/swagger_doc"
end
```

## resourcesの親クラスに追記
app/api/resources/v1/root.rb

```rb:app/api/resources/v1/root.rb
module Resources
  module V1
    class Root < Grape::API
      version 'v1'
      format :json
      content_type :json, 'application/json'

      # app/api/resources/v1/users.rbをマウント
      mount Resources::V1::Users

+     # swaggerの設定
+     if defined? GrapeSwaggerRails
+       add_swagger_documentation(
+         markdown: GrapeSwagger::Markdown::RedcarpetAdapter.new(render_options: { highlighter: :rouge }),
+         api_version: 'v1',
+         base_path: '',
+         hide_documentation_path: true,
+         hide_format: true)
+     end
    end
  end
end
```

## webサーバーを再起動して表示確認
これでAPIのドキュメントが見れるようになります。  
grapeで新たなエンドポイントを追加すれば、ドキュメントにも自動で追加されます。
http://localhost:3000/docs

## 参考
[RailsのAPIをswaggerでドキュメント化してみる](http://qiita.com/kitaro_tn/items/ace80a36ac3cfc060788)
HTML書くときにVSCで使っているあれやこれ

[VisualStudioCode AdventCalendar2016](http://qiita.com/advent-calendar/2016/vscode) 10日目の記事です。
すごく初心者です！よろしくお願いします。

ちょっと前置きですが、友人たちへの布教用も兼ねているのと、
私が日常でちょくちょく使ってて便利だー！と感動したものをのせてます。
他にもこれが便利だよ！とかあったら教えていただけると幸いです。

ちょっといろいろ試してないので後でいろいろ追加したいです。

<h1>Live HTML Previewer</h1>
[Live HTML Previewer](https://marketplace.visualstudio.com/items?itemName=hdg.live-html-previewer)
![スクリーンショット 2016-12-03 1.12.31.png](https://qiita-image-store.s3.amazonaws.com/0/149691/feb2269b-8a6e-dbab-141f-504c9dbd41f6.png)

私の好きなやつです。DWみたいにリアルタイムでプレビューできるので見つけたときすごくうれしかったです。

使い方は
> For side preview, use the keybinding 'ctrl+q s' or press 'F1' and type "Show side preview"
> For full preview, use the keybinding 'ctrl+q f' or press 'F1' and type "Show full preview"

Ctr+QかF1押して、>show side(full) preview と入力するだけです。簡単！
sideとfullはこんな感じになります。
<h3>side</h3>
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/149691/5f791d02-52ec-69d1-fa0a-732eae1e7ead.jpeg)


<h3>full</h3>
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/149691/b0451ff6-ffcb-f87e-abb2-aad44179b4c5.jpeg)

注意すべきはHTMLが開いているときにこのコマンド使ってねってことです。じゃないとなんか怒られました。私だけかな。
<font color='#E6E6E6'>サンプル引っ張ってきてます。h ttp://pondt.com/</font>

<h1>Color Picker</h1>
[Color Picker](https://marketplace.visualstudio.com/items?itemName=anseki.vscode-color)
Atomにもあったやつだ、多分
>A dialog box is shown by pressing Alt + C P keys or command Pick Color.

カラースライダーが出てきて指定できるやつ。

<h1>VS Color Picker </h1>
[VS Color Picker ](https://marketplace.visualstudio.com/items?itemName=lihui.vs-color-picker)
ピッカーで色が取得できちゃったりする素敵なやつです。
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/149691/8b29b848-a1ea-750e-297f-7db9fa9c8ccf.jpeg)
↑こんなのが出てきて、パレット押したらパレットで色指定、その右隣のピッカーで他から色取得ができる。よ！
使い方は
>1. After typing the character # or moving the caret after character #, the picker will be launched automatically.
>2. Execute command VS Color Picker in Command Palette(Ctrl + Shift + P or Cmd + Shift + P).
>3. Binding a key for command extension.vs-color-picker.

こういうの地味に便利。画像イメージから作るときとか。

<h1>JS-CSS-HTML Formatter</h1>
[JS-CSS-HTML Formatter](https://marketplace.visualstudio.com/items?itemName=lonefy.vscode-JS-CSS-HTML-formatter)
名前まんま。jsonにも対応。地味にjson対応は私は嬉しい。


<h1>jsonあたり</h1>
思い出したら載せたい。

<h1>おしまい</h1>
私よく忘れるんですけど、macでファンクションキー使うときはfn押しながらF1押すんですね。

あとすごく関係ないけど、VSCをUSBメモリに入れていて、同じOSの他のパソコンに差して使う、っていうやり方ができたりします。
ただ拡張機能が消えちゃったりしてるんでこれどうにかできる...はず。
USBメモリから起動できるのは地味に嬉しい。

普段はatom使ってますがVSCは軽いのでさっと何か書くか～って時に重宝してます。
軽いやつは大好きです。ペイントソフトしかり。
では十日目でした。周りにVSC使う人増えるといいなあ
ありがとうございました！
Grapeを使ってRESTfulAPIを簡単作成 その2 Grape::Entity

## Grape::Entityとは
前項のgrapeのみだと、値が全て表示されてしまいます。
そこで、grape-entityを使うと、表示項目の制限、整形をすることができます。
[GitHub: ruby-grape/grape-entity](https://github.com/ruby-grape/grape-entity)

## 目次
1.[Grapeを使ってRESTfulAPIを簡単作成 その1 Grape](http://qiita.com/Esfahan/items/90feb3ae39dde51f95fa)
**2.Grapeを使ってRESTfulAPIを簡単作成 その2 Grape::Entity**
3.[Grapeを使ってRESTfulAPIを簡単作成 その3 Grape::Swagger](http://qiita.com/Esfahan/items/35001482d3c39e27fbab)

## 環境
- rails 5.0.0.1
- ruby 2.3.1

## まずはgemをインストール
下記を追記

```rb:Gemfile
# api
gem 'grape'
gem 'grape-entity'
```

bundle install

```
$ bundle install --path vendor/bundle
```

## ディレクトリ構成
下記のディレクトリ構成にします。

```
~/sample_api/
　　├ app/api/
　　│　　　　└ api.rb
　　│　　　　└ resources/
　　│          └ v1/
　　│            └ root.rb
　　│　　　　　　  └ user.rb
　　│       └ entities/
　　│　　　　　　└ v1/
　　│　　　　　　　 └ root_entity.rb
　　│　　　　　　　 └ user_entity.rb
```

- app/api/entities/v1/root_entity.rb  
このファイル名は好きなもので構いません。  
その場合は、app/api/entities/v1/user_entity.rbで継承する親クラスの名前も適宜変更してください。

## Entityの親クラスを作成
app/api/entities/v1/root_entity.rb

```rb:app/api/entities/v1/root_entity.rb
module Entities
  module V1
    class RootEntity < Grape::Entity

    end
  end
end
```

## userAPIのEntityファイルを作成
name, email, ageのみ表示するようにします。
(created_at、updated_atは表示させない)

```rb:app/api/entities/v1/user_entity.rb
module Entities
  module V1
    class UserEntity < RootEntity
      # name, email, ageのみ表示する
      expose :name, :email, :age
    end
  end
end
```

## userAPIのファイルにEntity定義を追記
下記のようにすることで、entityの設定を反映することができます。

```rb:app/api/resources/v1/user.rb
module Resources
  module V1
    class Users < Grape::API
      resource :users do
        # /api/v1/user
        desc 'user list'
        get do
-         present User.all
+         present User.all, with: Entities::V1::UserEntity
        end

        # /api/v1/user/{:id}
        desc 'user'
        params do
          requires :id, type: Integer, desc: 'user id'
        end
        get ':id' do
-         present User.find(params[:id])
+         present User.find(params[:id]), with: Entities::V1::UserEntity
        end
      end
    end
  end
end
```

## 表示確認
http://localhost:3000/api/v1/users/
created_at、updated_atがなくなり、name, email, ageのみ表示されているはずです。

```
[

    {
        "name": "Sony",
        "email": "sony@sample.com",
        "age": 40
    },
    {
        "name": "Fredo",
        "email": "fred@sample.com",
        "age": 38
    },
    {
        "name": "Tom",
        "email": "tom@sample.com",
        "age": 35
    },
    {
        "name": "Michael",
        "email": "michael@sample.com",
        "age": 33
    },
    {
        "name": "Connie",
        "email": "connie@sample.com",
        "age": 30
    }

]
```

http://localhost:3000/api/v1/users/4

```
{

    "name": "Michael",
    "email": "michael@sample.com",
    "age": 33

}
```

次項: [Grapeを使ってRESTfulAPIを簡単作成 その3 Grape::Swagger](http://qiita.com/Esfahan/items/35001482d3c39e27fbab)

## 参考
[Grape::Entityを使用してAPIで取得できるプロパティを簡単に設定する](http://qiita.com/magaya0403/items/b2924f54c7397c8759c3)
ファイルサーバー files.pharo.org の話

時間がなかったので小ネタを。

# files.pharo.org について

http://files.pharo.org/ は[Pharo](http://pharo.org/)の古いバージョンをダウンロードする際に利用するサーバーですが、それ以外にも色々なファイルが置いてあったりするのでプレゼンをする際には以外に便利。

# Pharoのロゴ
勉強会などでPharoの紹介をする際には言語のロゴは必須ですね。
必要な場合は以下からダウンロードできます。

http://files.pharo.org/media/logo/

色々なバージョンが用意されています。

http://files.pharo.org/media/logo/logo-flat.png

**フラットデザインのPharoのロゴ**

![logo-flat.png](https://qiita-image-store.s3.amazonaws.com/0/18287/711188e0-ca2b-725b-4dd7-e81c8ac0c2bb.png)

**灯台**

個人的にはこれが好き

![icon-lighthouse-512x512.png](https://qiita-image-store.s3.amazonaws.com/0/18287/f8f36f96-6784-270e-19c6-3001e87de026.png)


# Pharoの書籍
Pharo関連の書籍がそろっている。最近は（親切になってきて・・・ゴホン・・・）色々な便利パッケージも紹介されている。

http://files.pharo.org/books/


# API仕様書？
Pharo起動させたほうが早そうですが、Pharoを詳しく知りたい電車通勤の人にはよいかもしれません。

http://files.pharo.org/doc/

Pharo 4まで用意されています。Pharo 5はまだない。

http://files.pharo.org/doc/4.0/#classView=welcome.html&classList=package/Kernel.html&packageList=package.html

# Zeroconf Script

Linuxサーバに簡単にPharoを導入するスクリプト。これも`files.pharo.org`に格納されている。

# Pharo を作っている人たちの気持ち？

Pharoを作っている人たちはきっとこんな気持ちでつくっているのだろうと思える動画。

http://files.pharo.org/media/tempest.mp4

*Smalltalkから進化し続けてきた言語Pharoは流行の波にも負けず力強く存在し続けよう* というメッセージなんでしょうかね？
GoでAESアルゴリズム(CBCモード)を使った実装をする

[前回ではAESアルゴリズムを用いた](http://ken5scal.hatenablog.com/)暗号化・復号をGoで実装してみたの続きです。

# 今日の内容
ただAESアルゴリズムによる暗号のみだと、攻撃者は暗号文を操作 => 平文を操作することができます。これを解決するための１つのやり方が、SSL/TLSにも用いられているCBC(Cipher Block Chaining)モードです。モードとは、固定長以上の平文をブロックにわけ、各ブロックを暗号化アルゴリズムで暗号化する手法をさします。

# CBCモードとはなんぞや
CBCモードは、1つ前の暗号文ブロックと平文ブロックをXORしたものを暗号化することを繰り返す手法になります。最初の暗号文ブロックを生成する際には、ランダムに生成した初期化ベクトル(IV)を平文ブロックとXORする形になります。このIVは復号時にも利用なので別途保存する必要があり、最終的に生成される暗号文にappendして保存するのが一般的らしいです。

![image](https://qiita-image-store.s3.amazonaws.com/0/59166/21b48f5f-2bd3-194f-dfaa-c4be24c87905.png)


また、復号時には1つ前の暗号文ブロックと、復号された暗号文ブロックをXORしたものが平文ブロックになります。ここでもIVが必要なので、保存した暗号文からIVを取得します。

![image](https://qiita-image-store.s3.amazonaws.com/0/59166/8572b640-b373-e7be-f3f7-4afdac3ead20.png)


これにより、攻撃者による暗号文の操作したとしても目的通りの結果にさせないことが可能になります。

# CBCモードにおける暗号文ブロックの変化に対する動き
* 破損時(暗号文ブロックの値が何らかの理由により変わった場合): 破損した暗号文ブロックにより復号される平文ブロックと、その後に復号される平文ブロックに影響します。
* ビット欠落: 欠落した暗号文ブロックにより復号される平文ブロックとその後の平文ブロックのすべて

# GoによるAES CBCモードの実装
ではGoでの実装方法を見てみましょう.

```暗号化
func EncryptByCBCMode(key []byte, plainText string) ([]byte, error) {
	if len(plainText) % aes.BlockSize != 0 {
		panic("Plain text must be multiple of 128bit")
	}

	block, err := aes.NewCipher(key); if err != nil {
		return nil, err
	}

	cipherText := make([]byte,  aes.BlockSize + len(plainText)) // 初期化ベクトルを保存するためにaes.BlockSizeを加えている
	iv := cipherText[:aes.BlockSize] // Unique iv is required
	_, err = rand.Read(iv); if err != nil {
		return nil, err
	}

	cbc := cipher.NewCBCEncrypter(block, iv)
	cbc.CryptBlocks(cipherText[aes.BlockSize:], []byte(plainText))

	return cipherText, nil
}
```

```復号
func DecryptByCBCMode(key []byte, cipherText []byte) (string ,error) {
	block , err := aes.NewCipher(key); if err != nil {
		return "", err
	}

	if len(cipherText) < aes.BlockSize {
		panic("cipher text must be longer than blocksize")
	} else if len(cipherText) % aes.BlockSize != 0 {
		panic("cipher text must be multiple of blocksize(128bit)")
	}
	iv := cipherText[:aes.BlockSize] // assuming iv is stored in the first block of ciphertext
	cipherText = cipherText[aes.BlockSize:]
	plainText := make([]byte, len(cipherText))

	cbc := cipher.NewCBCDecrypter(block, iv)
	cbc.CryptBlocks(plainText, cipherText)
	fmt.Println(plainText)
	return string(plainText), nil
}
```

```
func main() {
	cipherText, _ = EncryptByCBCMode(key, "1234567891234567") // 16bye
	fmt.Println(cipherText)
	cipherText, _ = EncryptByCBCMode(key, "12345678912345671234123412341234") // 32byte
	fmt.Println(cipherText)
        // iv(32 byte) + 16byte

	plainText, _ = DecryptByCBCMode(key, cipherText)
	fmt.Println(plainText)
        // 12345678912345671234123412341234
}
```

以上。ただ、結局16の倍数 Byteの固定長平文しか暗号化できない。ブロック暗号の仕様上、しょうがないのでが、任意の長さの平文を暗号化したいのは当然の欲求だ。その場合、(16 - 平文%16)バイト文のパディングを追加する必要がある。次回は、それをかく。
turtlebot_gazeboのシミュレーションデモを動かす

#はじめに

ROS上でTurtlebotのシミュレータを使います.

すでにあるデモを使って、大体の使い方を覚えていこうと思います。

#インストール

まずはパッケージをインストールします.
`$ sudo apt-get install ros-indigo-turtlebot-gazebo`

環境変数のロード
`$ source ~/.bashrc`

#シミュレータの立ち上げ
シミュレータを立ち上げます.
`$ roslaunch turtlebot_gazebo  turtlebot_world.launch`

すると次のような画面が表示されました.
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/84997/500de256-b996-aec1-16d7-f6e4825928b4.png)

強そう.

初回起動時は読み込みに時間がかかるのでしばらく黒い画面です.

#自律移動デモの起動
それでは次に自律移動のデモを動かしていきます。

`$ roslaunch turtlebot_gazebo amcl_demo.launch`

あれ、エラーを吐かれました.内容は以下のとおりです.

```error
while processing /opt/ros/indigo/share/turtlebot_navigation/launch/includes/amcl.launch.xml:
Invalid roslaunch XML syntax: [Errno 2] No such file or directory: u'/opt/ros/indigo/share/turtlebot_navigation/launch/includes/amcl.launch.xml'
```

`/opt/ros/indigo/share/turtlebot_navigation/launch/includes/amcl.launch.xml`なんて無いぞ！と言われてますね.

`amcl.launch.xml`を探すと、

`/opt/ros/indigo/share/turtlebot_navigation/launch/includes/amcl.launch.xml`ではなく

`/opt/ros/indigo/share/turtlebot_navigation/launch/includes/amcl/amcl.launch.xml`にありました.

#launchファイルの修正
launchファイルを書き換えましょう.

launchファイルのあるディレクトリまで移動して...
`$ roscd turtlebot_gazebo/launch/`

管理者権限でファイルを開きます.
`$ sudo vim amcl_demo.launch`

その後、10行目の
`<include file="$(find turtlebot_navigation)/launch/includes/amcl.launch.xml">`
を
`<include file="$(find turtlebot_navigation)/launch/includes/amcl/amcl.launch.xml">`
とします.

もう一度起動しましょう.

`$ roslaunch turtlebot_gazebo amcl_demo.launch`

今度はエラーもなく動いてくれたようです.

#rvizの起動

可視化ツールのrvizを起動します.
`$ rosrun rviz rviz`

起動しました.

![aaaa.png](https://qiita-image-store.s3.amazonaws.com/0/84997/d8615e43-a74f-46f0-c64b-6035c5ead3ad.png)

ここにいろいろとデータを追加していきます.

左下にある[Add]をクリックするとどのデータを表示するか選択できるダイアログが開きます.

[By display type]タグ内の[RobotModel]を選択して[OK]すると,Turtlebotがrviz上に表示されます.

[By Topic]タグ内の[/map]-[Map]を選択して[OK]すると,Mapがrviz上に表示されます.

[By Topic]タグ内の[/camera]-[/depth]-[/points]-[PointCloud2]を選択して[OK]すると,Turtlebotの視界がrviz上に表示されます.

[By Topic]タグ内の[/odom]-[Odometry]を選択して[OK]すると,オドメトリがrviz上に表示されます.

[By Topic]タグ内の[/move_base]-[/NavfnROS]-[/plan]-[Path]を選択して[OK]すると,軌道計画がrviz上に表示されます.

さて、必要なものは取り込めました.rvizはこんな画面になっているはずです.

![aaaaa.png](https://qiita-image-store.s3.amazonaws.com/0/84997/3d39e82e-4f79-7252-1fe7-615564417bfb.png)

#rviz上から動かす

rvizの上の欄の右から2番目にある,[2DNavGoal]を選択し,目標地点と目標向きをクリックで指定すると動いてくれます.

また、gazebo上のturtlebotも上のそれと同期して動きます.

![Screenshot from 2016-12-10 13:52:02.png](https://qiita-image-store.s3.amazonaws.com/0/84997/242391a4-0921-ce65-fb46-82fb92edf23e.png)

rviz上の赤い矢印は移動した際の向きの履歴です.
また,rviz左下のimageはカメラから取得したデータです.

#まとめ

rvizとgazeboでのロボットのシミュレーションデモを動かすことができました.
また、使い方もなんとなくわかった気がします.

今後はデモではなく自作のモデル,プログラムでシミュレーションできるように勉強していきます.
Perl 6 の Inline::Perl5 で Perl 5 の Algorithm::LibLinear を動かす

こんにちは、Perl 6アドベントカレンダーの10日目の投稿になります。

[Advent Calender 6日目](http://qiita.com/titsuki/items/0ee508c93d7bff149916)では"こんにちは世界！"しかできませんでした。
今日はもうちょっと実用的な例として、Inline::Perl5で[Algorithm::LibLinear](http://search.cpan.org/~sekia/Algorithm-LibLinear/lib/Algorithm/LibLinear.pm)を呼び出してSVMによる機械学習をやってみましょう！

# インストール

+ Inline::Perl5 の入れ方は [Advent Calender 6日目](http://qiita.com/titsuki/items/0ee508c93d7bff149916) を参照してください


+ Perl 5側については下記のモジュールを入れていきましょう。cpanm を使ってると仮定しています

```
 $ cpanm Algorithm::LibLinear
 $ cpanm Mouse::Util::TypeConstraints
 $ cpanm PadWalker
```

# データセットの準備

+ libsvmのサイトから[news20](http://qwone.com/~jason/20Newsgroups/)をもらってきましょう
 + https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html#news20

+ コマンド

```
$ wget https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/news20.bz2
$ bzip2 -d news20.bz2 # これはtrain用データ
$ wget https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/news20.t.bz2
$ bzip2 -d news20.t.bz2 # これはtest用データ
```

# Let's try!

## 5分割交差検定をやってみましょう

+ 下記のコードではtrainデータで5分割交差検定をやっています

```pl:svm.p6
use Algorithm::LibLinear:from<Perl5>;
use Algorithm::LibLinear::DataSet:from<Perl5>;

my $data-str = "news20".IO.slurp;
my $data-set = Algorithm::LibLinear::DataSet.load(string => $data-str);
my $learner = Algorithm::LibLinear.new;

my $accuracy = $learner.cross_validation(
    data_set => $data-set,
    num_folds => 5,
);

$accuracy.say; # accuracy が出力される
```

```bash:output
$ perl6 svm.p6
0.801004079071227
```
いけました！！！！

## predictもやってみましょう

+ 下記のような操作を行っています
  + train用データで学習
  + test用データから適当にひとつを取り出してラベルを予想させる。という操作を5回行う

```pl:svm-predict.p6
use Algorithm::LibLinear:from<Perl5>;
use Algorithm::LibLinear::DataSet:from<Perl5>;

my $train-str = "news20".IO.slurp;
my @test-lines = "news20.t".IO.lines;
my $train-set = Algorithm::LibLinear::DataSet.load(string => $train-str);
my $learner = Algorithm::LibLinear.new;
my $classifier = $learner.train(data_set => $train-set);

for ^5 {
    say '# ' ~ $_;
    my $line = @test-lines.pick;
    my ($label, *@feature) = $line.split(" ", :skip-empty);
    say "label: " ~ $label; # 正解ラベルを出力
    say "feature: " ~ @feature[^5]; # 入力した素性ベクトルを出力 (多いのでここの出力は5個にしぼってます)
    my Map $feature := Map.new(@feature>>.split(":", :skip-empty).flat);
    my $predict-label = $classifier.predict(feature => $feature);
    say "predict label: " ~ $predict-label; # SVMの予測したラベルを出力
    ''.say;
}
```

```bash:output
# 0
label: 6
feature: 40:1 159:2 926:1 1460:1 2481:1
predict label: 6

# 1
label: 3
feature: 10:1 21:1 25:1 36:1 56:1
predict label: 3

# 2
label: 18
feature: 1:1 61:1 115:1 132:1 150:1
predict label: 18

# 3
label: 19
feature: 10:3 25:1 32:2 81:1 84:6
predict label: 18

# 4
label: 20
feature: 1:1 10:1 25:2 40:2 79:1
predict label: 20

```
いけました！！！！


以上、Perl 6アドベントカレンダーの10日目の投稿、"Perl 6 の Inline::Perl5 で Perl 5 の Algorithm::LibLinear を動かす" でした。


P.S
実ははじめ、今日の記事の内容をやろうとしたときにエラーが出てしまって困ったのですが、
作者の方に相談したら解決してくださいました。
https://github.com/niner/Inline-Perl5/issues/79
ruby+sinatraでお試しRSSアンテナサイト

　[高知工科大 Advent Calendar 2016](http://www.adventar.org/calendars/1872) の10日担当のstmnです。
最初はpython画像処理しようと思っていたのですが、無性にrubyを書きたくなったのでrubyで何かしようと考えてました。あと、せっかくrubyで書くのなら「rubyならではのことしたい」ということで、以前少しだけ触ったことのあったSinatraで遊んでみることにしました。

#Sinatra
Sinatraはrubyで作成されたwebアプリケーションフレームワークです。有名なRuby on Railsと比べて手間がかからず気軽に制作に取り組めます。しかしその反面、最低限の機能しかないので自分で拡張していくことが必要になります。

#やりたいこと
とりあえず、RSS情報をとってきてブラウザ上に記事のURLなんかも表示させるってのが目的です。
RSS情報をとってくるサイトは自分が好きなペルソナのまとめからにしました。

#制作
んじゃ、作っていきます。
まずはディレクトリやファイルの配置についてこんな感じです。
今回、自分が作業をする親のディレクトリ名はsinatraにしてます。

>sinatra
　├ main.rb　　　　　　　　
　└ views
　　　 ├ layout.erb　
　 　　└ index.erb　　

#ソースコード
```ruby:main.rb
require "rubygems"
require "bundler/setup"
require "sinatra"
require 'rss_custom'

get '/' do
  # RSS情報取得
  parser = RssCustom::Parser.new("http://p5jouhoukyoku.jp/?xml")
  parser.parse
  @rss = parser
  erb :index
end
```

```erb:index.erb
<ul>
  <% @rss.contents.each do |entry| %>
    <li><a href="<%= entry.url %>"><%= entry.title %></a></li>
  <% end %>
</ul>

```

```erb:layout.erb
<!DOCTYPE html>
<html lang="ja">
<head>
  <mata charset="utf-8">
  <title>RSSアンテナ</title>
</head>
<body>
  <h1>RSSペルソナアンテナ</h1>
  <%= yield %>
</body>
</html>

```

#実行
```:console
$ruby main.rb

```
<img width="642" alt="スクリーンショット 2016-12-10 13.00.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/113331/1051b051-4e1b-f8fe-dbe9-14ec4b39ef02.png">

上記のようなものが表示されればローカルサーバーが立ち上がっています。
そのままブラウザで　[http://localhost:4567](http://localhost:4567)と打ち込んでアクセスしてみましょう。
すると下記のようなサイトに飛んでるはずです。
<img width="1280" alt="スクリーンショット 2016-12-10 10.35.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/113331/6e98c2fb-862b-9612-a62e-6821b5e5a8c1.png">

#終わりに
とりあえず表示するまでなら割と簡単にできました。ただ、現状はRSSの情報を一つのサイトからしか取得できていないので改良したいなぁと思いました。
あと間違ってる点があったら教えていただければ幸いです。
L3D cube

イルミネーションが街中に輝く季節になりましたのでLEDに関するもので気になるものがあったのでご紹介を。

# L3D cube
L3D cubeとは、フルカラーLEDを8×8×8個、合計512個搭載したキューブ状ガジェットです。PCやスマートフォンでLEDの光り方を操作できますが、Arduino言語でより自由にプログラミングできます。

## 機能
音センサー、加速度センサー、Wi-Fi機能を搭載し、モーションセンサーやArduinoとも接続可能です。キューブを動かして光り方を変えることや、周りの音や動きに合わせて光らせることが可能です。
[https://www.youtube.com/watch?v=jpvFrb7_80I](https://www.youtube.com/watch?v=jpvFrb7_80I)

## プログラム
自分でプログラミングするほかに、「[Cubetube](http://cubetube.org/)」でユーザーが作成したプログラムの共有も可能です。

Arduinoでのプログラミングはこちらをご参照下さい。
[http://qiita.com/hotchpotch/items/4497f626554de7203904](http://qiita.com/hotchpotch/items/4497f626554de7203904)


## あとがき
この製品に限らず、3次元構造のLEDを拡張して立体映像を表現するのは面白い試みだと思いましたまる
L3D cube

イルミネーションが街中に輝く季節になりました。
イルミネーションといえばLEDということで、LEDに関するもので気になるものがあったのでご紹介を。

# L3D cube
L3D cubeとは、フルカラーLEDを8×8×8個、合計512個搭載したキューブ状ガジェットです。
PCやスマートフォンでLEDの光り方を操作できますが、Arduino言語でより自由にプログラミングできます。

## 機能
音センサー、加速度センサー、Wi-Fi機能を搭載し、モーションセンサーやArduinoとも接続可能です。キューブを動かして光り方を変えることや、周りの音や動きに合わせて光らせることが可能です。
[https://www.youtube.com/watch?v=jpvFrb7_80I](https://www.youtube.com/watch?v=jpvFrb7_80I)

## プログラム
自分でプログラミングするほかに、「[Cubetube](http://cubetube.org/)」でユーザーが作成したプログラムの共有も可能です。

Arduinoでのプログラミングはこちらをご参照下さい。
[http://qiita.com/hotchpotch/items/4497f626554de7203904](http://qiita.com/hotchpotch/items/4497f626554de7203904)


## あとがき
この製品に限らず、3次元構造のLEDを拡張して立体映像を表現するのは面白い試みだと思いましたまる
Azure の Microsoft Translator を iOS とかで使う

Microsoft DataMarket にあった Microsoft Translator が Azure ポータルの Cognitive Services に移動した影響で2017年4月30日までに既存の Microsoft Translator を使っているアプリは Azure に移行する必要があります。

[移行方法はここに書いてあります.](https://translatorbusiness.uservoice.com/knowledgebase/articles/1078534-microsoft-translator-on-azure)

[以前](http://qiita.com/mironal/items/875234f044dcb192a50e) Microsoft Translator を iOS で使うライブラリを作りましたがこれも使えなくなってしまいます。

そこで今回新しく Azure 用に書き直したものを公開しました。

ライブラリの方を直すのは面倒なので gist に貼り付けました。 swift はこのぐらいの簡単なライブラリなら１つのファイルでできて楽で良いです。

https://gist.github.com/mironal/e907fa31c76adbd0b3868870a1422cc6

iOS などから Azure の Microsoft Translator を使いたい方はコピペして使ってください。

追記.

2019/4/30 で v2 のサポートが終了し、 それまでに v3 へ移行する必要があるので gist のコードを API v3 に対応したものに修正しました.

https://docs.microsoft.com/en-us/azure/cognitive-services/translator/reference/v3-0-translate
macにDockerを入れてみる

# 経緯
久しぶりに個人開発環境の構築をしたかったのでメモ。
以前はVagrantを使っていたが、OSのバージョンアップなどにより
うまく動かなくなっていたので、Dockerを試してみることに。

# 環境
mac OS X Sierra 10.12.1

# 前提条件
brew 導入済み
http://brew.sh/index_ja.html
virtualbox導入済み
http://www.oracle.com/technetwork/jp/server-storage/virtualbox/downloads/index.html

# 手順
### dockerインストール  
```
$ brew install docker
```
### docker machine をインストール  
```
$ curl -L https://github.com/docker/machine/releases/download/v0.8.2/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine && \
chmod +x /usr/local/bin/docker-machine
```
https://docs.docker.com/machine/install-machine/

### docker machine のバージョンを確認  
```
$ docker-machine version
```
### 仮想環境を作成してみる  
```
$ docker-machine create --driver vmwarefusion <ホスト名>
```
--driver virtualboxなども指定できるので、適切なものを指定します。
https://docs.docker.com/machine/get-started/
###確認 
用意した仮想環境は下記コマンドで確認可能です。

```
$ docker-machine ls
```

仮想環境に設定されている環境変数は下記コマンドで確認可能です。  
### 環境変数として設定する  
```
$ eval "$(docker-machine env <ホスト名>)"
```
### dockerコマンドを試してみる
```
$ docker $(docker-machine config <ホスト名>) run centos:7 echo hello-world
```
### 立ち上げたホストにsshで接続する  
```
$ docker-machine ssh <ホスト名>
```

### コンテナ起動してみる

開発はコンテナ内で行うことになります。

sshしたあとに下記のようにrunコマンドを実行します。

```
docker@test:~$ docker run -it centos /bin/bash
[root@84b3f502f152 /]
```
するとコンテナが立ち上がって移動します。
上記の場合は予めダウンロードしておいたcentosのイメージをいれています。
イメージの確認は下記コマンドで。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0584b3d2cf6d        5 weeks ago         196.5
```

### コンテナ内で作業を再開したい時
docker psコマンドでコンテナの確認をします。

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                           PORTS               NAMES
84b3f502f152        centos              "/bin/bash"         3 minutes ago       Exited
```
先程立ち上げた、コンテナがあります。
コンテナは一度抜けると停止状態となっているので

```
$ docker start <CONTAINER ID>
```
で立ち上げてから、

```
$ docker attach <CONTAINER_ID>
```
としましょう。作業を再開することができます。

### 作業した内容をイメージとして保存しておきたい
```
$ docker commit <CONTAINER_ID> <TAG>
```
確認する際は下記コマンドで。

```
$ docker images
```

これで環境構築はできました。
あとは好きなように弄ったり潰したり。

また、立ち上げた仮想環境を停止したり再開したりするには

```
$ docker-machine stop <ホスト名>
$ docker-machine start <ホスト名>
```

で可能です。
詳細なdocker-machineコマンドは下記から確認してみてください。
https://docs.docker.com/machine/reference/
Heroku Hiring Process: Support Engineer in Tokyo

# はじめに
2016 年 12 月から Salesforce.com で Heroku Support Engineer として働いています。皆さま、よろしくお願いします。

細かい内容は応募者、時期によって変わりますが、自分が経験した採用プロセスを紹介します。
Heroku ってどんな面接してるか気になる、他社の面接を知りたい、といった方の参考になればと思います。


# 大まかな流れ
- English Résumé
- Screening
- Tech Interview
- Starter Project  
メールや面接等、全体的に英語でやりとりします

# 詳細
## English Résumé
**Free format**
自分はポジションに役立ちそうな経験を主に書きました。最近は、職務経験をストーリーとして語るスタイルが増えてきているようです。

## Screening
履歴書から、Hiring manager が候補者を選び、面接します。
Hiring manager はサンフランシスコにいたので、 Google Hangouts を使用しました。早起きです。一般的な質疑応答で、志望動機や自分が貢献できることを丁寧に伝えようと心がけました。Screening は計 2 回あり、2 人の Hiring manager と別々の日に面接をおこないました。


## Tech Interview
実際の業務を意識した課題が出されます。それを事前に提出し、Support Engineer の方々と面接を行います。今回はそれぞれサンフランシスコとハワイで働いている方が担当されました。早起きです。課題内容は様々ですが、 Heroku に関するものは [Heroku dev center](https://devcenter.heroku.com/)、他の PaaS (Cloud foundry, Google App Engine と Azure web app) の経験が役立ちました。


## Starter Project
Heroku にプロジェクトが作成され、DB に入っている情報をもとに、何か役立ちそうなものを作る、いわゆる自由課題です。**Happy Hacking!**
何を作ってもいいんですが、Slack に専用のチャンネルを用意してくれ、そこで他の Support Engineer たちと話して Table の内容やどんなものが嬉しいのか、ざっくりとした方針を決めます。皆さん優しい。そして、発表。面接をした Manager やチームメイト、その他たくさんの方が参加してくれました。驚きと感謝！早起きです。

何を作ったか、その動機、得られた気づき、使用した技術、本番データに適用する場合の課題等、考えられるだけ準備して臨みました。


## 期間
3 ヶ月弱


## 感想
採用プロセスを通して Heroku の文化や実際に関わる人たちを知ることができ、とても楽しく、印象に残るものでした。Online での会話がほとんどなので、確実に伝えられるように、ゆっくり喋ったり、内容が分からなければ、分からないときちんと伝えることが大切だと思います。



# その他
Keiko Oda さんが Heroku に関するスライドを公開されていて、こちらも参考になると思います。
http://sssslide.com/speakerdeck.com/keiko713

Open position はこちら
Carrer: https://www.heroku.com/careers
FileMakerでカスタム関数を作ってみた

後輩の hirata に指摘をもらったので、コード部分を書き換えました（12/10 14:04)

# カスタム関数を作ってみた

ピティナでは、noguchi によるFileMakerの研修が月２回で開催されているのですが、
FileMaker初心者の私も参加しています。

今回、お題として「出退勤を管理するシステム」をFileMakerで作ってみることになりました。

その中で、労働時間を計算するのに、後ろ倒し、前倒しをする時刻計算が必要になったので、カスタム関数を使ってみました。
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/16382/b5f31e92-24f9-fbc4-cceb-43a0a70e1101.png)

## 関数の概要
たとえば、

* 09:01 ～ 09:30 に出勤したら、09:30 として扱う。（出勤は後倒し）
* 19:00 ～ 19:29 に退勤したら、19:00 として扱う。（退勤は前倒し）

みたいな処理です。

### イメージ図：後倒し時刻_時(_time; _unit; _i)
![fugo.png](https://qiita-image-store.s3.amazonaws.com/0/16382/fb90706f-d414-8b7f-6f02-39983e90a224.png)

### コード：後倒し時刻_時(_time; _unit; _i)
```
Let ([
  m = Minute ( _time );
  h = Hour ( _time );
  threshold = _i * _unit
  ];

  Case ( 
    threshold ≥ 60; h+1;
    Case (
      m = 0; h;
      m ≤ threshold ; h;
      後倒し時刻_時 ( _time; _unit; _i+1 )
    )
  )

)
```

* * *
### コード：後倒し時刻_時(_time; _unit; _i)　改修しました！！

後輩の hirata から「n時を取るだけなら、Loopする必要ないよ」と指摘をもらいました。
たしかに！！ということで、下記コードに書き直しました。

```
Let ([
  m = Minute ( _time );
  h = Hour ( _time );
  threshold = 60 - _unit
  ];

  Case ( 
    m  > threshold ; h+1;
    h
  )
)
```

閾値 = 60 - unit ですね。恥ずかしや。

* * *


## 関数の解説

### 引数解説
```
後倒し時刻_時 ( 19:01:00; 15; 0 )
```

* _time ：時刻部分は、タイムスタンプ型のフィールドを指定するイメージです。
* _unit ：ピティナでは 15分単位計算の人、30分単位計算の人がいるので単位を指定できるようにしました。
* _i ：ちょっとダサいのですが、、、初期値 0を投入します。。。げふん。

### 処理解説
まず、初めのLet関数で、、

* 引数で受け取った時刻の 分数部分 を取得
* 引数で受け取った時刻の 時刻部分 を取得
* 閾値(分)として、単位分 * ループ回数(i) を設定

次にCase文で、

* 閾値(分)が60分を超えていたら、チェック対象時刻(時) + 1を結果として返却。
* チェック対象時刻(分)が、ちょうど 0分なら、チェック対象時刻(時)を結果として返却。
* チェック対象時刻(分)が、閾値(分)未満なら、チェック対象時刻(時)を結果として返却。
* いずれとも判断がつかなければ、_i をインクリメントして、もう一度判定し直し。

という感じになります。


# 最後に
## なぜに再帰処理にしたのか
実は、FileMakerの関数では、Loop処理ができません。For とか、While がありません。
なので関数内でLoop処理をしたい場合、どうしても再帰処理で解決するしかないのです。

## あるいは
（関数ではなく）スクリプトを作成する、という方法があります。
ただし、処理結果を取得したい場合には、

- スクリプトの実行
- Get ( スクリプト結果 ) 

と、２段階にする必要があります。

また、スクリプトワークスペース（FM13では、「スクリプトの管理」）に当然ながら出てきてしまうので、
一覧性を気にする方は、フォルダ分けをするか、Lib的なファイルに作成するようにすると良いと思います。


参考になれば幸いです。
javascriptのソースコードに文字列としてhtmlなどのソースコードを埋め込む

#javascriptのソースコードにhtmlなどのソースコードを埋め込む

javascriptで文字列でソースコードを埋め込むには、そのまま埋め込む事ができない場合があります。たとえば、**( "" )ダブルクォーテーションや( '' )シングルクォーテーション、( ￥ )マークなど**をエスケープしないと、文字列としてソースコード上に記述することができません。

そこで、**javascriptで使用するエスケース済みの文字列**を作成できるWEBツールを作成したので紹介します。

#ConvertStringJS
**[ConvertStringJS](http://www.wabiapp.com/WebTools/ConvertStringJS/)** (JavaScript用にエスケープ済み文字列を生成するツール)

[![ConvertStringJS](http://www.wabiapp.com/WabiSampleSource/Qiita/images/ConvertStringJS/ConvertStringJS.png)](http://www.wabiapp.com/WebTools/ConvertStringJS/)


##使い方
**変換したいコード**のところにhtmlなどのコードを張り付けます。**変換する**を押下すると変換結果が出力されます。**変換結果を自分のコード**に張り付けてください。

変換する際に、１行で出力したり、文字列のタイプ、改行コードなども指定することができるので、自分の好きな形式で出力してください。

##公開サイト
**[http://www.wabiapp.com/WebTools/ConvertStringJS/](http://www.wabiapp.com/WebTools/ConvertStringJS/)**


#最後に
ConvertStringJSは、phpのお勉強で作成したツールです。使ってもらえると嬉しいです。

##追記
早速のご指摘で、ECMAScript6では、テンプレートリテラルなるものがあって、そっちを使った方が簡単そうです。IEや、モバイル系のAndroid、iOS9以下などのテンプレートリテラルに対応していないブラウザで実行しなければならないような時には使ってみてください。

以上、JavaScript用にエスケープ済み文字列を生成するツールの紹介でした。
JavaのGetterで参照を返すことについて

#はじめに
Javaのコードを書いていて、引数は参照の値渡しなのにメソッドの返り値は参照を返してるなーと思ったので、初投稿もかねて書いてみました。

#オブジェクトに対するGetter
Javaを書いたことある方なら、publicなフィールドは極力使わずに、Getter,Setterを作ろうみたいな話を聞いたことがあると思います。
これについてなんですが、今回はリストなどのオブジェクトを返すGetterを考えたいと思います。
まずは以下のコードから

```TestList.java
public class TestList {
	private List<String> lst;
	
	public TestList(){
		this.lst = new ArrayList<String>();
	}
	public List<String> getList(){
		return lst;
	}
	public void setList(List<String> lst){
		this.lst = lst;
	}
}
```

まぁ、Listをラッピングしているクラスですね。次にメインを作ります。

```Main.java
public class Main {

	public static void main(String[] args) {
		TestList test = new TestList();
		List<String> l = test.getList();
		l.add("a");
		l.add("b");
		for (String s: test.getList()){
			System.out.println(s);
		}
	}
}
```

これを実行すると以下のようになります。

```
a
b
```

これは外部(Main)からクラス内の<b>privateなリストを書き換えています</b>。
つまりTestListクラスを作成した人からは<b>意図されていない変更を与えること</b>ができる状況です。
これって多人数開発するとき危なくないですかね？

#解決策
外部から変更されたくない場合は以下のようにArrayListをnewしてから返すように、getListを変更してやればいいです。


```TestList.java
public class TestList {
	private List<String> lst;
	
	public TestList(){
		this.lst = new ArrayList<String>();
	}
	public List<String> getList(){
		return new ArrayList<String>(lst);
	}
	public void setList(List<String> lst){
		this.lst = lst;
	}
}
```

#結論
僕自身Getterを作成する時に上のように書くべきか、下のように書くべきかの結論はいまいち出せてないです。しかし、カプセル化という視点で見た場合下のようなコードの方が隠蔽性は高いと思います。みなさんの意見もぜひお聞かせください。
レガシーな開発プロセスからスクラムを導入したまでの話

この記事は [Gaiax Advent Calendar 2016](http://qiita.com/advent-calendar/2016/gaiax) 10日目の記事です
この1年間、開発プロセスの改善について取り組んできたのでそのことについて書きます。

# はじめに
私はGaiaxに入社してからAIRYというプロダクトに所属しています。AIRYは2014年にリニューアルしましたが、歴史としては2006年からと Gaiaxの中では長い事業になります。プロダクトは約3年前にリニューアルをして、メンバーも数回入れ替えがあったのですが、開発のプロセスは見直されることはなく伝統的に引き継がれてきていました。しかし今年に入ってから事業の成長スピードについていけないことが課題になり始めていたので2016年は開発のプロセスを見直すことにしました。

# 開発プロセスの変遷
私が事業に所属をしていたころから、進め方として営業の方や企画の方が考えた機能/企画を実装するという進め方でやっていました。開発の方も降ってくることをやるだけといういわば社内受託の状態になっていました。サービスを提供している事業に所属しているのに社内受注になっているっていうのはいいのか？ということがそもそも今回改善をしようと思ったきっかけです

## なんちゃってスクラム期
最初はカンバンを導入してタスクの見える化を行いました。誰が何をやっているのか分からない、どのくらい残っているのか分からないということがチームで課題に挙がっていたので可視化するためにカンバンを導入してやってみました。最初はこんなにもタスクがあるのか、という感じで見えるようになって頑張っていこうと思えたのですが、やる順番が分からない、日々ToDoが増えていく割には終わらないということが課題になりました。
いま思い返すと、ただ個人でやろうと思っていたことをタスクにしていただけで、本人しか内容が分からなかったり、見えている以上にタスクが多く、あまり効果はありませんでした。

**変わったこと**
- 完了までにやることが共有されるようになった
- 誰が何のタスクをやっているのかみえるようになった
- 何で止まっているのか見えるようになった
**課題**
- 本人しかわからないタスクがある
- タスクの関連が見えない（工程とか順番）

## カンバンプロセス期
なんちゃってスクラムのときはToDo/Doing/Doneのシンプルなものだったのですが、実施する順番を分かりやすくするためにプロセスごとに工程を設けたカンバンにして進めることにしました。カンバンを導入したものの今まで通り得意なこと、できることから取り掛かろうとしてしまい思った以上に終わらせるよりはじめてしまって結果的にリリースまで時間がかかってしまいます。そこでルールとして「終わらせることから始めよう」ということをおいて、取り掛かったタスクをチーム全員で終わらせに行くようにしました。リリースまで持っていけるものが増えていってはいたのですが、タスクによって進みにバラツキがでて、一部の工程でどうしても時間がかかってしまうことが課題でした。

そこで、そもそも開始からリリースまで一体どういうプロセスをたどっているのかをValue Stream Mappingに落としてみることにしました。すると結構やっていることが多く、本当にそれが必要なのかなどを話しました。あらためて見直してみるとなんでやっているんだろう？っていうタスクが多々あって儀式みたいになっているタスクまであってだいぶロスしていることがわかります。これらについて必要性の有無を議論して。タスクをなくしたり、順番を入れ替えたり統合したりしてプロセスを改善させました。

**変わったこと**
- タスクの工程と順番が見えるようになった
- 何をやったら次の工程に進めるのかみえるようになった
- 始めたタスクを終わらせるようになった
**課題**
- 時間がかかる工程がある
- 始めたのに終わらない
- 隠れたタスクがある（タスクの粒度が大きい）

## スクラムの導入
そのあとしばらくやっていたもののリリースまでのスピードは特にかわりませんでした。分析してみると１つのタスクが大きくなっていることと、期限が決まっていないものはやりすぎてしまっているということがわかりました。そこでPMOの提案でスクラムを導入しました（ここまで長かった）　　いままでのことを踏襲して、ストーリを実現するまでのタスクの洗い出しと２週間というスプリントを決めて進めるということをルールにやっています。
2ヶ月くらいやってみていますが、以前のなんちゃってスクラム期やカンバンプロセス期に比べると２週間ごとに必ず成果があげられるようになったので効果は出てきていると思います。（なによりメンバーが続けたいと言っていることがデカイ）　

**変わったこと**
- ２週間で必ず成果がでるようになった
- 計画の段階でタスクの洗い出しと共有ができるようになった

# 現状の課題
スクラムを導入したからといって全てが解決するわけではないので、いま挙っている課題をざっと。

**改善がはかどらない**
スクラムを導入してみたものの日々のタスクに追われて改善に時間がなかなかとれていません。開発チームは開発のほかに運用を持っているのですが運用についての時間はとっていません。この辺りを計画に入れてみたら良さそうです。

**誰かしか分からない情報がある**
長く事業をやっているとどうしても事情を知っている人にだけ情報が溜まりがちになってしまいます。また元々の専門分野の知識や考え方などまだまだ共有ができていないため誰かが休んだりするとそこで止まってしまうことがあります。こちらはペア作業/ペアプログラミングを導入して情報の共有をしながら進めていっています。

**なんであるのか分からない工程がある**
カンバンプロセスの時にもやったのですが何のためにやっているのか分からない/効果がなさそうな工程や作業が残っていたりします。せっかくプロセスを変えたのであればこれらも常に見直していくともっと開発のスピードが事業のスピードに追いついていけるようになると思います。

# まとめ

ざっと１年間を振り返ってみました。いまの状況になるまでなかなか紆余曲折してきましたが誰かが考えて執行するのではなくて開発チームで話して考えてここまで持ってこれたという意味ですごく意味があったことだと思います。プロセスの改善は終わりがないのですがこれからも開発チームも事業も一段と伸びていけるように進めていきたいと思います。
Springフレームワークにて、アノテーションベースConfigurationでプロファイルを設定し利用する方法

# Spring DI

## Configuration

SpringフレームワークではDIコンテナに対してConfigurationと言う設定ファイルを渡し、「こんな時には、このインスタンスを返してね」と設定する。そのConfigurationファイルの種類は３つある。

- JavaベースConfiguration
- XMLベースConfiguration
- アノテーションベースConfiguration

以下ではアノテーションベースのConfigurationについて説明する。

## アノテーションベースのConfiguration

### @Configuration
Configurationクラスであることを表す。

``` Java:AppConfig
package com.example;

@Configuration
public class AppConfig {

}

```

### @Component
DIコンテナに管理させるBeanとして、クラスを登録する。

``` Java:User
package com.example;

@Component
public class User {

  public String getName(){
    ...
  }

}
```

### @ComponentScan
@Componentが付与されたクラスをスキャンし、BeanとしてDIに登録する。スキャン対象は、パッケージとして指定することができる。先ほどのAppConfigクラスに対して、設定を行うと以下のようになる。

``` Java:Configuration
package com.example;

@Configuration
@ComponentScan("com.example")
public class AppConfig {

}
```

### アノテーションベースConfigurationのサンプルコード

以上のアノテーションを使用してDIコンテナを利用すると、以下のようなコードになる。

```Java:DemoIoC
package com.example;

public class DemoIoC {
  public static void main(String args[]){

    // DIコンテナを構築し、Configurationファイルを渡す
    AnnotationConfigApplicationContext context =
                      new AnnotationConfigApplicationContext(AppConfig.class);

    // Beanを取得
    User user = context.getBean(User.class);
    System.out.println(User.getName())
  }
}
```

## Profile設定
SpringフレームワークではConfigurationをグループ化して、プロファイルとして管理することができる。例えば、開発用のConfiguration、テスト用のConfiguration、製品用のConfigurationと、分けて管理し、Configurationを簡単に切り替えることができる。

### @Profile
プロファイルを設定する。先ほどのUserクラス階層を以下の様に変更してプロファイルを設定してみる。

```Java:User
package com.example;

public interface User {
  public String getName();
}
```

```Java:UserDummy
package com.example;

@Component
@Profile("dev") // devという名前でプロファイルを設定
public class UserDummy implements User {
  ...
}
```

```Java:UserMaster
package com.example;

@Component
@Profile("test") // testという名前でプロファイルを設定
public class UserImpl implements User {
  ...
}
```

### Profileの利用例

以上のUserクラス階層を、プロファイルを設定して利用してみる。

```Java:DemoIoC
package com.example;

public class DemoIoC {
  public static void main(String args[]){

    // DIコンテナを構築
    // プロファイルとしてdevを設定
    AnnotationConfigApplicationContext context =
                      new AnnotationConfigApplicationContext();
    context.register(AppConfig.class);
    context.getEnvironment().addActiveProfile("dev");
    context.refresh();

    // Beanを取得
    // userの実装はUserDummy
    User user = context.getBean(User.class);
    System.out.println(User.getName())
  }
}
```