OmniAICreator/Qiita-1.07M huggingface dataset:
ASP.NET MVCのユニットテストを実装するときに考えたこと

ASP.NET MVCでテストを書く際に考えたことのメモ

おすすめのパッケージ

### [Moq](http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_09/aspnetmvc3_09_02.html)
テストのためのダミーオブジェクトを作成するパッケージ。

簡単な使い方

```
var mock = new Mock<IHelloModel>();
mock.Setup(x => x.Hello()).Returns("test return");

IHelloModel hello = mock.object;
```

### [ChainingAssertion](http://chainingassertion.codeplex.com/)
MsTestも手軽にいい感じにかけるパッケージ。

``` csharp
test = "test";
test.Is<string>("test"); // 成功
```

## コントローラのテスト

とりあえず、コントローラのテストを書いてみた。

``` csharp
public class HelloControllerTest
{
    [TestClass] /* テスト対象群であることを表す */
    public class Index /* テストしたいメソッド名 */
    {
        private HogeController controller;

        [TestInitialize] /* テストの初期化処理毎。テスト毎に実行される */
        public void TestInitialize()
        {
        	// コントローラを初期化
            this.controller = new HogeController();
            
        	// Indexアクションを実行する
            var result = await this.controller.Index() as ActionResult;
        }

        [TestMethod] /* テスト対象 */
        public async Task 一覧画面が表示されること()
        {
        	// 結果オブジェクトがどうなっているかを確認する
            result.IsInstanceOf<HogeResult>();
        }
    }
}
```

## テストしやすいコード
### とにかく DI (Dependency Injectyon) する

``` csharp
class HogeController
{
  private IDependencyClass _Fuga { get; set; }
  
  // 引数がないときは新しいインスタンスを注入する
  public HogeController() : this(new DependencyClass()) { }
  public HogeController(IDependencyClass fuga)
  {
    this._Fuga = fuga;
  }
}
```

そうするとモックテストがはかどる

``` csharp
...
// Helloメソッドが"hello"を返すモックを作る
var mock = new Mock<IDependencyClass>();
mock.Setup(x => x.Hello()).Returns("hello");

// 作ったモックを注入したコントローラーをテストできる
var controller = new HogeController(mock.object);
var result = controller.Index() as ActionResult;
...
```

###  意識したいこと
- DI
  - メソッドが利用しているクラスと結合しすぎてしまうため、インスタンスの生成処理は極力内部で行わない
  - 他クラスを参照する場合は、DIで利用することを意識する
  - DIモジュールをインタフェースで定義する
- 単一責任
  - 一つのメソッドに色々な処理を含めず(ifでの分岐を減らす)、責任を一つにしてメソッドを分ける
  - メソッド名と処理内容が一致しやすく読みやすくなる
- 担当の明確化
  - Sessionやリクエストの状態はControllerに任せる(Model側に意識させない)
  - ModelはDBと切り離しなるべくプレーンなクラスにする([POCO](http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic05/ef4basic05_01.html))。DBを意識させない
  - Repositoryパターンを使うといい?かも
  - ViewModelは表示に関する処理のみ記述する。値の生成などはModel側でやりたい
- Ruby on Rails的な思想
  - DRY (Don't repeat yourself)
    - 同じ処理は2度書かない
  - レールに乗る (ベストプラクティスから外れないようにつくる)
    - 他の人が読みやすいコードになる
    - Rails程レールはないが、規約決めるといいかも
- 個人的な見解
  - 性能より保守性
    - LINQやEntityFrameworkを積極的に使いたい
  - コードファースト
    - Dbの構造のコード化
      - DRYにもつながる
    - 自動テストの利点
      - 変更に強くなる
      - コードが読みやすくなる


## その他
MSTestを全く触ったことがないので、他にもいいパッケージなど教えてほしいです...
MacでRubyの開発環境を整えてhelloを表示するまで

先日、もくもく勉強会に参加してきた。
そこでやっとの思いでrubyの開発環境を整えることができた。
その過程を記載します！

開発環境を整えるまでの簡単流れ
1. homebrewインストール
2. rbenvをインストールする
3. ruby本体のインストール

(1)OSX用パッケージマネージャー「homebrew」をインストールする
homebrewは、rbenvをインストールするために必要です。
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
(2)rbenvをインストールする
rbenvをインストール
```brew install rbenv ruby-build```

(3)rbenvをbash_profileに保存し反映
```
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
rbenv rehash
source ~/.bash_profile
```

rbenvがインストールされているか確認
```rbenv versions```

(4)rubyのインストール(下記の例は ruby本体2.2.4をインストールしています)
```rbenv install 2.2.4 
rbenv global 2.2.4
ruby -v```

(5)rubyの実行
拡張子「.rb」のtextファイルを作成する

```ruby:hello.rb
puts("hello")
``` 

以下のコマンドを入力して実行します
```
$ ruby hello.rb 
```

以上です！
EntityFrameworkで既存データベースをコードファーストできるように設定する

[こちら](https://channel9.msdn.com/Blogs/EF/Migrations-Existing-Databases?ocid=player)を見れば一発で解決しますが、英語の長い動画なので、Qiita化需要ありそうだなと思い投稿します。

### 前提

- EF6

[EF Tools](https://www.microsoft.com/en-us/download/details.aspx?id=40762) をダウンロードする

Models配下などに`ADO.NET Entity Data Model`を追加する

![1454841991076.png](https://qiita-image-store.s3.amazonaws.com/0/51402/5ce76119-c4d5-d6c5-236f-acc70e21bfae.png)


データベースからCode Firstを選択 (EF Toolsをインストールしないとメニューが現れない)

この後、`dbo`を対象から外す

パッケージマネージャコンソールから以下を実行

```
// マイグレーションの有効化
Enable-Migrations
```

```
// 最初のマイグレーションを作成する (この時、既存DBがあるため、変更なしとするために -IgnoreChanges を指定する)
Add-Migration Initial -IgnoreChanges
```

```
// データベースを更新する
Update-Database
```

これで既存データベースをEFでいじれるようになりました。
2016年の目標

#2016年の目標（自分用メモ）

## PHPの習得
- 個人でWebアプリの開発（最低1個WEB上に公開)
    - OpenStreetMapを使用したアプリ（dots等の勉強会情報を地図上に落とし込んでみる）
    - WordPressでブログ開設（ラズベリーパイでサーバー構築) 
    
- PHP5技術者認定初級試験取得
    - 4月中に取得
    - 書籍の調達,勉強スケージュル決定(2/Mまで)
    - (参考)[ITトレメ](http://jibun.atmarkit.co.jp/scenter/ittrain/122_exam_1_q.html)

##TOEIC750点
- TOEICスコア680→750を目指す
   - 以前受験より期間が空いてるので基礎からやり直す
   - DUO, 発音練習, 瞬間英作文を繰り返す（通勤の往復どちらかで実施）
- 外国の友達最低一人つくる
   - 日常的に英語を使っている方と出会える場を探す
   - 英会話能力 > TOEICスコア
Processingでフォントのアウトラインを取得する

こちらに移行しました。

https://blog.enkatsu.org/posts/p5-font-outline/

<!--

Processing3.0.1を使用

```java:FontShpe.pde
PFont font;
PShape pShape;

void setup() {
  size(300, 200);
  //まずはPFontを生成
  font = createFont("osaka", 100);
  //次にフォントからPShapeを取得
  pShape = font.getShape('P', 1);
  //取得したままのスタイルだと表示されないので設定
  pShape.beginShape();
  pShape.strokeWeight(1);
  pShape.stroke(0);
  pShape.fill(255);
  pShape.endShape();

  background(100);

  //まずはPShapeを使って描画
  translate(100, 100);
  shape(pShape, 0, 0);
  
  //次にvertexを取り出して描画
  translate(100, 0);
  beginShape();
  for (int i = 0; i < pShape.getVertexCount(); i++) {
    vertex(pShape.getVertex(i).x, pShape.getVertex(i).y);
  }
  endShape();
}

void draw() {
}
```

こんな感じになると思う
![FontShape.png](https://qiita-image-store.s3.amazonaws.com/0/80816/8027cefa-2005-7e2f-42d8-4ef2ea95dff1.png)

バネの動きを入れるとこんな感じ

![FontShape.gif](https://qiita-image-store.s3.amazonaws.com/0/80816/b5ddebde-b3c9-d717-02c2-0c7f3d43a45c.gif)

他にも色々使えそう

-->
UWSCで指定したプログラムに文字列を送信する

# ■ cygwinを起動して、コマンド文字列を送信する

```c
Const CYGWIN_PATH = "C:\gnupack_devel-13.05-2015.07.19\startup_cygwin.exe"
Const DIRECTORY_PATH = "mkdir -p c:/work/tmp_$(date +%Y%m%d)"

// 起動する
exec(CYGWIN_PATH)
cygwinId = getid(GET_ACTIVE_WIN)

// 起動判定
if cygwinId < 0 then
exit
endif

// コマンド文字列を送信
sendstr(cygwinId, DIRECTORY_PATH)
// 実行
kbd(VK_RETURN,CLICK,100)

// 閉じる
ctrlwin(cygwinId, CLOSE2)
```
Cygwinでapt-cygのインストール

# 実行環境
- Windows7 64bit版
- Cygwin 64bit版  
※ https://cygwin.com/install.html の「setup-x86_64.exe」

# apt-cygのインストール
apt-cygは、Cygwinでアプリケーションを簡単（※）にインストールするためのツール。
※ インストールする際にsetup.exeを使わずに1コマンドで済む。

公式版は開発が止まっているらしいので、他の方がforkして作っているものをダウンロード

```shell-session
wget https://raw.github.com/kou1okada/apt-cyg/master/apt-cyg
```

実行権限を付与

```shell-session
chmod +x apt-cyg
```

PATHの通っているディレクトリへ移動

```shell-session
mv apt-cyg /usr/local/bin/
```

Cygwinの setup-x86_64.exe で利用していた last-cache と last-mirror に関する情報をを apt-cyg に引き継ぐ。

```shell-session
apt-cyg --use-setuprc
```

以上で完了。

apt-cygを用いてアプリケーション（下記例ではsl）をインストールする場合は、下記のコマンドを実施。

```shell-session
apt-cyg install sl
```

# 参考サイト
http://seesaawiki.jp/w/kou1okada/d/apt-cyg
[翻訳]ESP8266に関する無料本のご紹介

このページを翻訳した。ESP8266の無料本が配布されているらしい。
http://www.esp8266.com/viewtopic.php?f=5&t=4326

皆さん。

ESP8266に関する無料の本がダウンロードできる様になったことをアナウンスいたします。
この本は、ESP8266を広く様々な目的で利用することを簡単にするための価値ある情報が詰まっています。

今後も、この本については最新の情報に適用できるようにアップデートし、新たに発見したことやTipsなどを盛り込んでいく予定です。

この本は、下記のリンクからダウンロードすることができます。

https://leanpub.com/ESP8266_ESP32

この本は無料でダウンロードできますが、もしこの本があなたにとって価値のあるものだと感じた場合、本を購入することをお考えください。
本を購入することで、これまでの仕事に対してだけではなく、今後情報を新鮮に保つ為の未来の仕事へのサポートにもつながります。

コメントやフィードバック、誤植の指摘、追加でカバーすべき領域の提案などは歓迎します、その際はこのスレッドを使って返信してください。

Enjoy!
障害発生時の対処

# ■ プロセスが落ちたときの対処
システムログを見てみる

```shell-session
tail /var/log/messages
```
# ■ ディスク使用量が変わらない

/var/log/にあるカレントログ(ローテーションしてないログ)を削除しても、
ディスク使用量が変わらないという事象が発生
ログの出力先がなくなったことが原因?

rsyslogを再起動したところディスク使用量が変化した。

```shell-session
/etc/init.d/rsyslog restart
```
PrettyBacktrace でデバッグを楽にする

Backtrace を表示する際に、ローカル変数名や値も表示してくれるようにしてくれる Gem

# 使ってみる

README のサンプルをそのまま使う

```rb:sample.rb
def recursive n
  str = "Hi #{n}!!  " * 128
  if n > 0
    recursive n - 1
  else
    raise "bottom of recursive"
  end
end

recursive 3
```

これを実行するといつものエラー表示

```
pretty_backtrace.rb:10:in `recursive': bottom of recursive (RuntimeError)
	from pretty_backtrace.rb:8:in `recursive'
	from pretty_backtrace.rb:8:in `recursive'
	from pretty_backtrace.rb:8:in `recursive'
	from pretty_backtrace.rb:14:in `<main>'
```

PrettyBacktrace を有効にすると

```rb:sample.rb
require 'pretty_backtrace'
PrettyBacktrace.enable

def recursive n
  str = "Hi #{n}!!  " * 128
  if n > 0
    recursive n - 1
  else
    raise "bottom of recursive"
  end
end

recursive 3
```

こうなる

```
pretty_backtrace.rb:10:in `recursive' (n = 0, str = "Hi 0!!  Hi 0!!  Hi 0...): bottom of recursive (RuntimeError)
	from pretty_backtrace.rb:8:in `recursive' (n = 1, str = "Hi 1!!  Hi 1!!  Hi 1...)
	from pretty_backtrace.rb:8:in `recursive' (n = 2, str = "Hi 2!!  Hi 2!!  Hi 2...)
	from pretty_backtrace.rb:8:in `recursive' (n = 3, str = "Hi 3!!  Hi 3!!  Hi 3...)
	from pretty_backtrace.rb:14:in `<main>'
```

おー `n` と `str` の状態がよくわかる！
さらに multi line モードにすると

```rb:sample.rb
require 'pretty_backtrace'
PrettyBacktrace.enable
PrettyBacktrace.multi_line = true

...
```

Pretty！

```
pretty_backtrace.rb:10:in `recursive'
          [FILE]
             8|    recursive n - 1
             9|  else
        ->  10|    raise "bottom of recursive"
            11|  end
            12|end

          [LOCAL VARIABLES]
            n = 0
            str = "Hi 0!!  Hi 0!!  Hi 0!!  Hi 0!!  Hi 0!!  Hi 0!!  Hi 0!!  Hi 0...
: bottom of recursive (RuntimeError)
	from pretty_backtrace.rb:8:in `recursive'
          [FILE]
             6|  str = "Hi #{n}!!  " * 128
             7|  if n > 0
        ->   8|    recursive n - 1
             9|  else
            10|    raise "bottom of recursive"

          [LOCAL VARIABLES]
            n = 1
            str = "Hi 1!!  Hi 1!!  Hi 1!!  Hi 1!!  Hi 1!!  Hi 1!!  Hi 1!!  Hi 1...

	from pretty_backtrace.rb:8:in `recursive'
          [FILE]
             6|  str = "Hi #{n}!!  " * 128
             7|  if n > 0
        ->   8|    recursive n - 1
             9|  else
            10|    raise "bottom of recursive"

          [LOCAL VARIABLES]
            n = 2
            str = "Hi 2!!  Hi 2!!  Hi 2!!  Hi 2!!  Hi 2!!  Hi 2!!  Hi 2!!  Hi 2...

	from pretty_backtrace.rb:8:in `recursive'
          [FILE]
             6|  str = "Hi #{n}!!  " * 128
             7|  if n > 0
        ->   8|    recursive n - 1
             9|  else
            10|    raise "bottom of recursive"

          [LOCAL VARIABLES]
            n = 3
            str = "Hi 3!!  Hi 3!!  Hi 3!!  Hi 3!!  Hi 3!!  Hi 3!!  Hi 3!!  Hi 3...

	from pretty_backtrace.rb:14:in `<main>'
          [FILE]
            12|end
            13|
        ->  14|recursive 3
```

たった 3 行足すだけで、とっても便利！
いろいろな場面で重宝しそうですね。
Windows -> Linux へ音声転送する(要Qt5)

Windows で再生している音声を Linux に接続したスピーカーから聞く方法。
PluseAudio 設定するとか他にも手段があると思うけど、Brynhildr使うのが楽かと。

# Windows(クラアント) に Brynhildr を入れる

http://blog.x-row.net/?p=2455 から Download してきて入れるだけ。
サーバモードで起動する

# Linux(サーバ)に Qt Brynhildr を入れる

http://mcz-xoxo.cocolog-nifty.com/ から Download してきて入れるだけ。

Ubuntu 15.10 の場合は、音声再生に libqt5multimedia5-plugins が必要とのこと
http://mcz-xoxo.cocolog-nifty.com/blog/2015/11/index.html
`sudo apt-get install libqt5multimedia5-plugins` で導入できる。

あとは Qt Brynhildr から Brynhildr に接続するだけ。
デスクトップ画面の転送やコントロールが不要なら、「コントロール」から Off にできる。
LAN 環境では遅延が気にならない程度で良い感じ。
npm-scripts で使える便利モジュールたち

[npm] はパッケージ依存管理ツールであると同時に、便利なタスク・ランナーです。
本体はごく基礎的な機能だけを持ち、[npm] が管理するパッケージと Shell の力を組み合わせてタスクを定義します。「npm-scripts で利用する CLI コマンドは [npm] で管理できる」という分かりやすさが気に入っています。

npm-scripts には以下の特徴があります。

- 多くのツールが CLI を持っているためにラッパープラグインが不要です。Gulp ラッパー プラグインは非公式であることも多く、メンテナンスが継続するか不安な場合があります。
- 簡潔です。Gulp で書くと数十行だった処理が数行になるなんてこともよくあります。
- 複雑なことをするには向いていないです。
- 環境変数の扱いに難があります。

この記事では、私が npm-scripts を書くときによく利用している便利ツールたちを紹介します。
汎用的なものを集めました。

# [npm-run-all]

複数のタスクを並列・直列にまとめて実行する便利ツールです。
Glob のようなパターンマッチを使うことができます (Glob との違いは、区切り文字が`/`ではなく`:`であることです)。

```bash
$ npm-run-all foo bar baz
$ npm-run-all build:*
$ npm-run-all --parallel watch:*

$ run-s build:*  # "npm-run-all build:*" と同じです
$ run-p watch:*  # "npm-run-all --parallel watch:*" と同じです
```

また、cmd.exe と sh とで挙動が違う `&` の代わりに使うことができます。

# [cross-env]

環境変数を設定しつつ指定したコマンドを実行するツールです。

```bash
$ cross-env NODE_ENV=production babel src --out-dir lib
$ cross-env NODE_ENV=development babel src --out-dir lib --source-maps inline --watch
```

環境変数を設定する方法は cmd.exe と sh とで異なっていますが、[cross-env]はクロスプラットフォームで動作します。

# [chokidar-cli]

ファイルの変更を監視して、ファイル変更時に任意のコマンドを実行するツールです。
監視機構を内蔵していない CLI ツールと併用すると便利です。

```bash
$ chokidar "lib/**/*.js" --command "eslint lib"
```

# [opener]

ブラウザを開くツールです。
URL, 相対パスを指定できます。
また、どのブラウザで開くかも指定できます。

```bash
$ opener http://localhost:8080
$ opener ./coverage/lcov-report/index.html
$ opener chrome http://www.google.com
```

# [wait-on]

指定したファイル・URL・TCP ソケット等が使えるようになるまで待機するツールです。
前述の [opener] と組み合わせると便利です。

```json
{
    "start":        "npm-run-all --parallel start:*",
    "start:server": "node-dev server.js",
    "start:client": "wait-on http://localhost:8080 && opener http://localhost:8080"
}
```

# [cpx]

指定したファイル群を、ディレクトリ構造を保ったままコピーするツールです。
変更監視して変更時だけコピーすることもできます。

```bash
$ cpx "src/**/*.js" app --watch

# Browserify 互換の変換モジュールを噛ませることができます。
$ cpx "src/**/*.js" app -t hogehogefy --watch
```

# [if-node-version]

実行している Node.js のバージョンが指定したものだったときだけ後続するコマンドを実行します。

```bash
$ if-node-version ">=4" eslint lib
```

バージョンの指定は package.json で使うのと同じ semver 範囲指定で行います。

# [rimraf]

`rm -rf` を実行するツールです。
Windows のお供に。

```bash
$ rimraf dist coverage
```

私はよく `npm run clean` を書くために使います。

# [mkdirp]

`mkdir -p` を実行するツールです。
Windows のお供に。

```bash
$ mkdirp app/client app/server
```

# [shelljs]

複雑なことを実施したい場合には、ShellJS を利用するのがお手軽です。
Gulp のようなものを使ってもいいですが、ShellJS は CLI がそのまま使えるのでメンテ不安が少ないです。

[node]: https://nodejs.org
[npm]: https://www.npmjs.com
[chokidar-cli]: https://www.npmjs.com/package/chokidar-cli
[cpx]: https://www.npmjs.com/package/cpx
[cross-env]: https://www.npmjs.com/package/cross-env
[if-node-version]: https://www.npmjs.com/package/if-node-version
[mkdirp]: https://www.npmjs.com/package/mkdirp
[npm-run-all]: https://www.npmjs.com/package/npm-run-all
[opener]: https://www.npmjs.com/package/opener
[rimraf]: https://www.npmjs.com/package/rimraf
[shelljs]: https://www.npmjs.com/package/shelljs
[wait-on]: https://www.npmjs.com/package/wait-on
Oracle Database の ハッシュ・パーティション(HASH PARTITION) の 数 は 2の累乗 が良いそうだが、本当にそうか検証してみる。

Oracle Database の ハッシュ・パーティション(HASH PARTITION) の 数は、下記マニュアル曰く

> Oracle Database VLDBおよびパーティショニング・ガイド
> 12cリリース1 (12.1) B71291-09
> ハッシュ・パーティション化を使用する場合
> http://docs.oracle.com/cd/E57425_01/121/VLDBG/GUID-F023D3ED-262F-4B19-950A-D3C8F8CDB4F4.htm
>  > 最適なデータ分散を実現するには次の要件を満たす必要があります。
>  > 　・ 一意またはほぼ一意の列または列の組合せを選択します。
>  > 　・ 作成するパーティションの数と、各パーティションのサブパーティションの数を2の累乗にします。
>  > 　　 たとえば、2、4、8、16、32、64、128などです。

となっていて、2の累乗が(ほぼ必須の？)推奨となってます。
検証してみるやで彡(ﾟ)(ﾟ) まずは4パーティションで試してみる。


```sql:
-- テーブル作成
DROP TABLE TBL_A PURGE;
CREATE TABLE TBL_A (
  C1 NUMBER
)
PARTITION BY HASH (C1)
(
    PARTITION P1
  , PARTITION P2
  , PARTITION P3
  , PARTITION P4
);

-- データ投入
INSERT /*+ APPEND */ INTO TBL_A SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 100000;
COMMIT;

-- 各パーティションカウント
SELECT COUNT(*) FROM TBL_A PARTITION(P1);
SELECT COUNT(*) FROM TBL_A PARTITION(P2);
SELECT COUNT(*) FROM TBL_A PARTITION(P3);
SELECT COUNT(*) FROM TBL_A PARTITION(P4);
```

結果は以下の通り、ちゃんと分散してるやね彡(^)(^)

```sql:
SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P1);
  COUNT(*)
----------
     24945

SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P2);
  COUNT(*)
----------
     24956

SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P3);
  COUNT(*)
----------
     25209

SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P4);
  COUNT(*)
----------
     24890
```
こいつを 3パーティション で試してみると……

```sql:
-- テーブル作成
DROP TABLE TBL_A PURGE;
CREATE TABLE TBL_A (
  C1 NUMBER
)
PARTITION BY HASH (C1)
(
    PARTITION P1
  , PARTITION P2
  , PARTITION P3
);

-- データ投入
INSERT /*+ APPEND */ INTO TBL_A SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 100000;
COMMIT;

-- 各パーティションカウント
SELECT COUNT(*) FROM TBL_A PARTITION(P1);
SELECT COUNT(*) FROM TBL_A PARTITION(P2);
SELECT COUNT(*) FROM TBL_A PARTITION(P3);
```

結果は以下の通り、本当に偏るんすね。(;｀･ω･)

```sql:
SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P1);
  COUNT(*)
----------
     24945

SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P2);
  COUNT(*)
----------
     49846 ★このパーティションだけ件数が多い。

SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P3);
  COUNT(*)
----------
     25209
```
CentOS7.0にJenkinsをインストールする

CentOSにJenkinsをインストールする方法は複数あります。

一番簡単な方法はダウンロードしたJenkinsのwarファイルをTomcatのようなアプリケーションサーバーに配置するだけで終わります。

ですが、今回はJenkinsの公式HPにも載っているyumを使った方法について紹介します。yumなので難しくありません。
https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Red+Hat+distributions

##OpenJDKをインストール
Jenkinsが動く必須条件としては「Java7以上がインストールされていること」があります。昔はJava6でも問題ありませんでしたが、最新バージョンのJenkinsではJava7以上が必須条件となりました。CentOSにJava7以上がインストールされていない場合はインストールしてください。ここでは、OpenJDKを使用しますが、OpenJDKに不安がある方はOracleJDKでも問題ありません。

```
# yum install java-1.8.0-openjdk
```

##yumリポジトリに追加
DefaultのyumリポジトリではJenkinsのダウンロードができないので追加します。
ここでは安定バージョン₍stable₎を利用します。

```
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
```

##RPMパッケージの公開鍵をインポート
Jenkinsのインストール時使われる公開鍵をインポートします。インストールに使うJenkinsのRPMパッケージに問題がないか₍改ざんされてないか₎をチェックするためにあります。

```
$ sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
```

##Jenkinsインストール

```
$ sudo yum install jenkins
```


##ポート変更

```
$ vi /etc/sysconfig/jenkins
-----
JENKINS_PORT="8082"
-----
```

##サービススタート

```
$ sudo service jenkins start
```

##ランレベル₍chkconfig₎に登録

```
$ sudo chkconfig jenkins on
```


これでインストールが完了しました。Jenkinsの初期設定画面を確認してください。
http://#ipadress#:8082/

初期設定の最初はパスワードを聞かれますが、画面の指示通りにサーバーでパスワードを確認して入力します。

```
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
```



※インストールの過程でApacheやTomcatのなどのWebサーバー、アプリケーションサーバーをインストールしなくても動くのはJenkinsの中にはJettyという軽量のServletコンテナが同梱されているからです。
iOSアプリをSwiftに書き換えたはなし

iOSアプリ「加賀ゆびぬき 刺し模様シミュレータ」をObjective-CからSwiftへ書き換えた記録です。
かなり雑な備忘録になりました。

XCode7 / Swift 2.0

# まずはモデル層を移植することにした

## シリアライズ

NSCodingのシリアライズは優秀だけど、それを引き継ぐにはNSObjectを継承したクラスを定義する必要があります。Swift実装で完結させるため、別の方法でシリアライズすることにしました。

SwiftのObjectからNSDictionaryを生成し、それをファイルへ保存することにしました。
Swiftの世界でJsonを扱う方法を参考にしています。

```
List 1
// Objective-C
@interface someVO : NSObject<NSCoding> 
@end
```

```
List 2
// Swift
protocol Serializable {
    init(withDictionary dictionary: NSDictionary)
    func toDictionary() -> NSDictionary
}

class someVO : Serializable {
    // (略)
}
```

### マイグレーション

VOのクラスを変更するので、過去バージョンでシリアライズしたデータを復元する機構が必要になります。
問題になるのは、過去バージョンのデータを読込む方法です。

Objective-Cのコードで書かれた部分と、Swiftコードで書かれた部分は名前空間が別になるため、過去バージョンのデータを読込む処理は、過去バージョンのコードをそのまま使うことにしました。

同じプロジェクト内に、上記のList 1, 2のコードを両方含めるのです。

List 1のコードを使用して、過去バージョンのデータを読込む処理を__Objective-C__ で記述します。読み込み処理の結果は、VOではなく、NSDictionaryで返します。これをSwift側から呼び出すことで、過去のVOをSwift側に持ち込むことなく済みました。

## テスト

モデル層を移植すると同時に、そのテストもSwiftに書き換えることになりました。テストフレームワークとしてQuickを使っていたにも関らず、テストをObjective-Cで書いていたからです。

おかげで、副産物としてテストのリファクタリングができ、テストケースの見直しができました。(バグもみつかりました)

# Viewの移植にとりかかる

## static method は、Swiftでも static method だった

NSTimerが発火しない問題が発生した。
アホなはなしだが、同じ引数をとるコンストラクタに浮気したら、仕事しなかった。

```
// Objective-C
self.animationTimer =
            [NSTimer scheduledTimerWithTimeInterval:0.5f
                                             target:self
                                           selector:@selector(timerFired:)
                                           userInfo:nil
                                            repeats:YES];
```

```
// Swift

// めっちゃ似てるけど、これは発火しない
// self.animationTimer = NSTimer(timeInterval: 0.5, target: self, selector: "timerFired:", userInfo: nil, repeats: true)

// こっちは発火した
self.animationTimer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self,
                selector: "timerFired:", userInfo: nil, repeats: true)
```

# 振返り

だいぶ時間がたってしまったので、ざっくり振り返る。

- 旧アプリのswiftと、新アプリのswiftのバージョンが異なり、XCodeを切り替えてプロジェクトを開かなければならなかったのは、めんどうだった
    - あえて古いバージョンのswiftで書く必要性はないのだが、新旧のアプリを同じシミュレータで試すことができず、動作確認はわりと手間だった
- それなりに画面数があるなら、UITestを準備してもよかったかも
- よくテストしたつもりだったけど、ひとつだけデータのマイグレーションに失敗することがあって、緊急レビューを依頼する事態になった
    - Swiftは想定外の状態になったときに「積極的に落とす」ということを失念していた
    - カバーが必要な場面は、想定して実装する必要があった
    - 詳しくはこちら → <a href="http://ichiko-revjune.hatenablog.com/entry/2016/01/10/171011">個人アプリで起動できない不具合を出した話</a>
Windows 開発で有用なリンク集まとめ

# Microsoft公式
[マイクロソフト ランゲージ ポータル](https://www.microsoft.com/Language/ja-jp/Search.aspx)
日本語表記されている内容が英語版の OS (あるいは他の言語の OS) では、どのように表示されているのか取得できる。

# Short Cut
[File Explorer](http://www.lifehacker.jp/2016/02/160201_fileexplorer_shortcuts.html)
rails ActiveRecordでAS句を使う方法

以下のような形でas句の利用が可能。

`
result=TestTable.select("dataA as data,id")
`

result.dataでdataAが取得可能。

例えば、
dataB,dataAというカラムがあって似たような処理を後続で行いたい場合は、

AS句を使ってSQLを実行しておけば、同じ方法で(ex. result.data)取得結果にアクセス可能なので、

リファクタリングに使えるかも。

ActiveRecord AS句で検索しても何も出てこなかったのでメモ。
Let’s Encryptで証明書を発行する

無料で証明書を発行できるLet's Encryptが話題になっていたので証明書を発行してみた

# 発行手順
```
$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto certonly -a standalone -d ${YOUR_DOMAIN}
```

生成されたファイル確認

```
$ sudo ls /etc/letsencrypt/live/xxxxx.jp/
cert.pem  chain.pem  fullchain.pem  privkey.pem
```

気をつけること

- サーバに対するドメインの設定は事前にしておく
- ドメインを設定したサーバの、nginxやapacheなど80ポートを使っているプロセスがある場合は自前に止めておく
- 443ポートを開けておく

# 追記 (2015/03/27)

ec2でやっていて以下の様なエラーが出た

```
$ ./letsencrypt-auto
WARNING: Amazon Linux support is very experimental at present...
if you would like to work on improving it, please ensure you have backups
and then run this script again with the --debug flag!
```

これは、言われてるとおりに

```
$ ./letsencrypt-auto --debug
```

すれば依存関係を諸々解決してくれる

# 追記 (2015/03/28)

オプションを修正した

 - `--server` オプションは省略して良いようなので削除
 - `--agree-dev-preview` オプションは `deprecated` らしいので削除
AngularJS勉強メモ その6(APIを利用してデータ取得)

これはAngularJSを勉強した内容をまとめたものです。

# 今回したこと
* APIを用意してデータを取得

# 環境
* Ubuntu 14.04 (VirtualBox)
* AngularJS 1.4.7

# APIを用意してデータを取得

１. Railsでサーバーサイドを用意

* ここはメインじゃないからさくっと記載
 1. scaffoldでcrudができる状態にする
 2. データを用意
 3. controllerのrespond_toでフォーマットがjsonの場合はデータをto_jsonして返すようにしておく


２. 以下のようなhtmlを用意

```html
<!DOCTYPE html>
<html ng-app="testMod">
  <head>
    <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
    <meta content="utf-8" http-equiv="encoding">
    <title>api</title>
    <script src="angular.min.js"></script>
    <script src="api.js"></script>
  </head>
  <body ng-controller="testController">
    <button ng-click="test()">getData</button>

    <dl>
      <dt>タイトル</dt>
      <dd>{{ result.title }}</dd>
      <dt>値段</dt>
      <dd>{{ result.price }}</dd>
    </dl>
  </body>
</html>
```

３. 以下のようなjsを用意

```js
angular.module('testMod', [])
  .controller('testController', ['$scope', '$http', function($scope, $http){

    $scope.test = function(){
      $http.get('http://127.0.0.1:3000/books/1.json'
      ).success(function(data){
        $scope.result = data;
      })
      .error(function(data,status,headers,config){
      });
    };
  }]);
```

４. ブラウザでhtmlをみてみる
初期状態
![getAPI1.png](https://qiita-image-store.s3.amazonaws.com/0/97052/5f2c924f-a8f5-0e91-a177-a186d6ef0d21.png)

getDataを押したらデータが取得できた！
![getAPI2.png](https://qiita-image-store.s3.amazonaws.com/0/97052/071ee535-7d4d-fc6f-c9ed-a215f2f01d6e.png)

# 処理内容を確認
## $http
* リモートHTTPサーバーと通信する機能
* 使い方：$http({method: 'GET', url: '/someUrl'})
 * 引数にはmethodとurlをもつオブジェクトを渡す。今回は用意されているショートカットメソッドを使っているので、 $http.get("url")という感じで利用。


# その他メモ
* 今回はコントローラで直接使ったけど、本来はモデル側の処理だからサービスを用意すべきと思われる。
* これでようやくサーバーサイドとのやり取りができるようになった。
ElasticSearchのインストール

Mac OS Xでのインストール手順は以下

```
$ brew install Caskroom/cask/java
$ brew install elasticsearch
```

上記の方法でインストール、起動コマンドは以下

```
$ elasticsearch
```

起動後に動作確認
- ブラウザで -> http://localhost:9200
    - コマンドで -> `curl -XGET http://127.0.0.1:9200/_cluster/health/?pretty`
    -Xパラメータはリクエストのメソッド、prettyつけると見やすいように改行してくれる
PHPのエラーの種類

<h1>実行が中断される</h1>
Fatal ：　致命的なエラー
-----------------------------
■E_ERROR
実行時の致命的なエラー
⇒未定義関数の呼び出し
　すでに定義されているクラスや関数をもう一度定義している場合など
※エラーが出る時点までは実行、発生時点で終了

<h1>実行は継続するが警告がある</h1>
Warning : 警告
-----------------------------
■E_WARNING
実行時の警告
⇒関数の引数の型間違い、引数の数の間違いなど
※エラーが出た時点でその式の評価や文の実行は終わるが、以後のプログラムは実行される

Notice　：注意
-----------------------------
■E_NOTICE
WORNINGよりも重要度が低い
PHPは警告を発生するが、自動的に対処を施す
⇒初期化も代入もされていない未知の変数や定数を使用した場合など
　初期化されていない場合…自動的にNULLや0として評価される
　未定義定数…文字列とみなされる


<h1>実行されない</h1>
シンタックスエラー
-----------------------------
■E_PARSE
PHPのシンタックスエラー
⇒括弧の付け忘れ、文末のセミコロンの付け忘れなど
※ファイルを読み込んだ時点で発生、ファイルは実行されない


<h1>コーディング規約に関するエラー</h1>
■E_DEPRECATED　[PHP5.3以降]
過去のバージョンでは許されたが現バージョンでは非推奨となっている記述
将来的に廃止される記述
※実際に廃止になるまでは動く


■E_STRICT
DEPRECATEDより重要度が低い
互換性維持などのために変更した方が望ましい記述
※E_ALLに含まれない


<h1>自身でエラーを定義する</h1>
任意のタイミングで自身で設定したエラーを発生させる
例）警告
trigger_error("このファイルを実行するべきではありません",E_USER_WARNING);

ユーザ定義の致命的エラー
-----------------------------
■E_USER_ERROR

ユーザ定義の警告
-----------------------------
■E_USER_WARNING
■E_USER_NOTICE

ユーザ定義の将来廃止予定機能の警告
-----------------------------
■E_USER_DEPRECATED
Unite.vimで特定のパス指定して file_rec を実行する


デフォルトの`file_rec`オプションはカレントディレクトリが対象となるので、
ファイル数が多くなり非常に重くなってしまうことが多い。

下記のように`unite#start`という関数を使えば、
ディレクトリのパスを指定して`file_rec`を使うことができる。

```
:call unite#start([['file_rec/async', '/path/to/my_directory']]);
```


また個人的にタブを新しく開いて実行して欲しかったのと、
vim-railsを使っているので下記のように設定した。
optionを渡すには`unite#start#standard`を使えば行ける。

```
:call unite#start#standard([['file_rec/async', b:rails_root.'/app/my_directory']], {"tab":1});
```

指定できるオプションは下記のソースコード173行目で定義されている。
https://github.com/Shougo/unite.vim/blob/master/autoload/unite/variables.vim


この設定のおかげで unite-rails がcontrollersなど特定のディレクトリしか指定できなかったのが解決できた。。。
Raspberry PiでBluetooth 4 (Bluetooth Low Energy) を使えるようにする

# はじめに
iBeaconを使ってやりたいことがあり、Raspberry Pi (Model B)でBluetoothを使えるようにしました。

# 1.Bluetooth アダプタ
このために購入したBluetoothアダプタは、Bluetooth 4.0+EDR/LE対応のIODATA [USB-BT40LE](http://www.iodata.jp/product/interface/bluetooth/usb-bt40le/index.htm)。
使用チップがBroadcom BCM20702なので、Raspbian wheezyでもそのままで大丈夫でしょう。lsusbコマンドで確認してみます。

```
$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0a5c:21e8 Broadcom Corp. 
```
認識されていますね。

# 2.Bluetoothドライバのインストール
hcitoolが入っていなかったので、Bluetoothパッケージをインストールします。
参考）[Install Bluetooth Dongle on Raspberry Pi](https://rasspberrypi.wordpress.com/2012/09/03/install-bluetooth-dongle-on-raspberry-pi/)

```
$sudo apt-get install bluetooth
```
hcitoolコマンドでiBeacon(Bluetooth Low Energy)デバイスをスキャンしてみます。

```
$ sudo hcitool lescan
LE Scan ...
D1:7F:7E:12:34:56 (unknown)
```
無事検出できました。
注）Bluetoothアドレスは改変しています。

# 3.Python 2.7.9のインストール

PythonでiBeanconを検出するプログラムを作るつもりです。
このRaspberry Piには2.7.3がインストールされていたので2.7系の最新版である、2.7.9をインストールします。
参考）[Raspberry Piに最新版の各種ツール・言語・ライブラリをインストールする](http://qiita.com/kb10uy/items/976a52f687bcb7745fc7)

```
$ wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
$ tar xvf Python-2.7.9.tgz
$ cd Python-2.7.9
$ ./configure
$ make
$ sudo make install
```
pythonを起動してバージョンを確認します。

```
$ python
Python 2.7.9 (default, Feb  6 2016, 12:56:09) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```
バージョン2.7.9になっていました。

# 4.BlueZのインストール
PythonでBluetoothを扱うため、Bluetoothプロトコルスタック BlueZをインストールします。
参考）[iBeacon Raspberry Pi Scanner in Python](http://www.switchdoc.com/2014/08/ibeacon-raspberry-pi-scanner-python/)のInstalling blueZ on the Raspberry Pi

最新版は5.37なので、それをインストールします。

```
$ sudo apt-get install libusb-dev 
$ sudo apt-get install libdbus-1-dev 
$ sudo apt-get install libglib2.0-dev --fix-missing
$ sudo apt-get install libudev-dev 
$ sudo apt-get install libical-dev
$ sudo apt-get install libreadline-dev
$ sudo apt-get install libdbus-glib-1-dev

$ sudo mkdir bluez
$ cd bluez
$ sudo wget www.kernel.org/pub/linux/bluetooth/bluez-5.37.tar.gz
$ sudo gunzip bluez-5.37.tar.gz
$ sudo tar xvf bluez-5.37.tar
$ cd bluez-5.37
$ sudo ./configure --disable-systemd
$ sudo make
$ sudo make install

$ sudo apt-get install python-bluez

$ sudo shutdown -r now
```

インストールが完了したらhciconfigコマンドを見てみましょう。

```
$ hciconfig
hci0:	Type: BR/EDR  Bus: USB
	BD Address: 5C:F3:70:01:23:45  ACL MTU: 1021:8  SCO MTU: 64:1
	UP RUNNING PSCAN 
	RX bytes:1724 acl:0 sco:0 events:92 errors:0
	TX bytes:1364 acl:0 sco:0 commands:87 errors:0
```
vagrant パッケージ化

vagrantのインスタンスを作成して、初期設定をするのが面倒なので初期設定終わった後の状態をパッケージ化してみました。

## パッケージ化
引数とかいろいろあるけどよくわからないので、`vagrant package` のみで。

```
# Vagrantfile のあるディレクトリに移動
$ vagrant package
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: /Users/hogehoge/vagrant/hogehoge/package.box
$ ls
Vagrantfile	package.box
```
> package.box というファイルができました

## box に登録
```
$ vagrant box add {box名} package.box
```

## 確認
```
$ vagrant box list
centos6.4             (virtualbox, 0)
ubuntu-14.04          (virtualbox, 0)
{box名}               (virtualbox, 0)
```

## ちなみに box の削除
```
$ vagrant box remove {box名}
```
でも `~/.vagrant.d/boxes/`ディレクトリにはのこっているので、こちらも消します。
```
$ rm -rf ~/.vagrant.d/boxes/{box名}
```
Docker のプライベートリポジトリを v2 にお引越し

以前 [「自分用の Docker Registry を作る」](http://qiita.com/rerofumi/items/b710037ede6f68c0cb18) という記事で、自分用のプライベートリポジトリを作成し、長らく便利に使っていました。
Docker の registry コンテナも V2.0 になって久しく、push/pull の度に「v1 api は古いよ！」と余計なおせっかいを焼いてくる始末。
そろそろ V2 に移行しようかといった作業時のメモです。

記載時点(Feb.07.2016) での情報となります。

# 問題点

Docker イメージとして提供されている registry (v1) と registry:2 (v2) の間にデータの互換性はなく、リポジトリデータを永続化していてもそれを流用することができません。

なので、旧リポジトリのデータをバックアップし、真っ新な v2 のリポジトリを作ったうえで再登録するといったお引っ越し作業が必要になります。

# 手順

更新するプライベートリポジトリサーバーとは別に、イメージをいったん全部対比させる Docker ホストを 1つ用意します。
全イメージをコピーする先ですのでストレージの空き容量にご注意ください。

1. リポジトリ上のイメージ名一覧を取得
2. 退避先 Docker ホストで全 image を 1つずつ pull
3. プライベートリポジトリを v2 に更新
4. 退避先 Docker ホストから全 image を 1つずつ push

なんのことはないこれだけの地味な作業です。

v2 リポジトリを新サーバーとして刷新した場合、マシン名(URL)が異なると「そのままpushするだけ」ができなくなりますのでご注意ください。

# 注意点

## 全イメージ名の取得法
registry API の search でイメージ名を取得しても良いのですが、ボリュームで永続化している場合は 'repository/library/' 以下のイメージディレクトリ名を一覧として使えます。

## registry v2 の永続化
v1 の時は registry 内のディレクトリポイント ```/tmp/registry``` をボリュームにすることで永続化をしていました。
v2 で同様にするためのディレクトリポイントは ```/var/lib/registry``` になります。

早期では ```/tmp/registry-dev``` だった事があるらしく、WEBを検索すると引っかかりますが。現在は ```/var/lib/registry``` となっているようです。
参照: https://docs.docker.com/registry/deploying/
IntelliJ 自分用メモ

IntelliJ使うにあたってのメモ

徐々に追記していきます

#### 空白の表示
Setting -> Editor -> General -> Appearance
"Show whitespaces"チェックボックスをON

#### 矩形選択
Altキー＋ドラッグ

#### 自動保存のオン・オフ
Setting -> Appearance & Behavior -> System Settings
Synchronizationで設定

#### 未保存ファイルが分かるよう表示する
Setting -> Editor -> General -> Editor Tabs
"Mark modified tabs with asterisk"にチェックON

#### キーバインド

Left,Down,Up,Right
Ctrl + h,j,k,lに割り当てる

Type Hierarchy
Ctrl + h がLeftになっているので代わりにAlt + hを割り当てる

Close
Ctrl + w

Split Vertically
Ctrl + t

Split Horizontally
Ctrl + Shift + t
vagrant で ubuntu14.04環境作成

## ubuntu-14.04 のboxをインストール
```
$ vagrant box add ubuntu-14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box
```

## ubuntuインスタンス準備
### インスタンス作成
```
$ mkdir -p vagrant/ubuntu
$ cd vagrant/ubuntu
$ vagrant init ubuntu-14.04
```
### IPアドレスを割り当ててみる
```
$ vim Vagrantfile
+ config.vm.network "private_network", ip: "192.168.33.99"
```
### 割り当てたIPアドレスにhostsを設定してみる
```
$ sudo /etc/hosts
+ 192.168.33.99   hogehoge
```

## ubuntuインスタンスを使ってみる
### ubuntuインスタンス起動
```
$ vagrant up
```
### ubuntuインスタンスに接続
```
$ vagrant ssh
```
### ubuntuインスタンスにユーザーを追加
```
[ubuntu] $ sudo adduser user_name
```
### ubuntuインスタンスの追加したユーザーにsudo権限を追加
```
[ubuntu] $ sudo gpasswd -a user_name sudo
```
## ホスト名を設定
```
[ubuntu] $ sudo hostname hogehoge.net
[ubuntu] $ sudo vim /etc/hostname 
hogehoge.net
```

## その他
* [ubuntumインスタンスのSSH接続](http://blog.f13.jp/post/25843309875/ubuntussh%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A7%E8%AA%8D%E8%A8%BC%E9%8D%B5%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E3%81%BF%E3%82%92%E8%A8%B1%E5%8F%AF)
htmlでaspect to fill, aspect to fitを実現する

## Aspect to fill, Aspect to fitとは

carrierwaveだと`resize_to_fill`, `resize_to_fit`に対応。
どちらも画像のアスペクト比を保つが、矩形への収め方が異なる。
わりと使用頻度は多いと思うのでヘルパーとかを用意すると楽です。


### 元画像

<img src='https://qiita-image-store.s3.amazonaws.com/0/18927/305de761-69d1-f2ab-3fa6-464b12ac35f7.jpeg' width='300' />

矩形が`600x480`のとき

#### Aspect to fitの場合

<img src='https://qiita-image-store.s3.amazonaws.com/0/18927/0f7e85b3-ea9c-8f68-0a89-1bc7ebec9e05.png' width='500' />

画像がすべて収まるように配置される。

#### Aspect to fillの場合

<img src='https://qiita-image-store.s3.amazonaws.com/0/18927/14f17ac7-5e09-980b-9c19-6e3ed26f8d0c.png' width='500' />

領域をすべて埋めるように画像が拡大されて配置される。



## cssで実現するには？

画像を`background-image`で指定したあと、`background-size`の値を`contain`か`cover`にする。`contain`はFillに、`cover`はFitに対応します。


## サンプル(Railsの場合)

background imageを指定するのが面倒なのでビューヘルパーを定義しておく。

```ruby:app/helpers/image_helper.rb
module ImageHelper
  def background_image_tag(path, html_options = {})
    html_options = html_options.merge(
      style: "background-image: url('#{path}')"
    )
    content_tag 'span', '', html_options
  end
end
```

cssをmixinにしておく。

```sass
@mixin aspectToFit
  background-size: contain
  background-repeat: no-repeat
  background-position: center center
  background-color: black

@mixin aspectToFill
  background-size: cover
  background-repeat: no-repeat
  background-position: center center
```

あとはviewでタグを呼び出して、mixinを適応する。


```slim
.productImage
  = background_image_tag photo.picture.url, class: 'photo'
```

```sass
.photo
  @include aspectToFill
```


## 注意点

- `background-size`はIE~8,9あたりでは動かない気がするので注意してください。
HTTPスタブを簡単に実装できるライブラリを書いてみました

アプリを作っていて、サーバーサイドのAPIが未完成な状態で、クライアントサイドの実装を進めたいことってよくあると思います。あるある！

レスポンスの形式はなんとなく決まってるけど、APIできてないし困ったなーという時、想定されれるレスポンスをアプリのローカルで偽装できるライブラリを作ってみました。

[Github - yukiasai/Kagee](https://github.com/yukiasai/Kagee)

# はじめに

まず最初に強調しておきたいことは、このライブラリはHTTPリクエストに対するレスポンスを偽装するということです。
ローカルで偽装するため、どこかにサーバーを立てる必要もなく、簡単にスタブの実装を埋め込むことが出来ます。

# 使い方

アプリケーションが起動した時、`MockProtocol.register()`を呼び出し、擬装用のプロトコルを起動します。

``` swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    MockProtocol.register()
    return true
}
```

その後、HTTPリクエストに対するレスポンスをどんどん定義していきましょう。

``` swift
Mock.install().request(url: "/").response(200, body: nil, header: nil)
```

上記の例は
> `/` というパスに`GET`リクエストを送信した際、ステータスコードが`200`のレスポンスが返ってくるよ

という意味になります。もちろん`POST`,`PUT`,`DELETE`も定義出来ますし、`Body`や`Header`の定義、`400`や`500`のエラーも定義できます。

通信の処理は普段通り`NSURLSession`や`Alamofire`で実装しましょう。

#### NSURLSession

``` swift
let request = NSURLRequest(URL: NSURL(string: "/")!)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
session.dataTaskWithRequest(request) { data, response, error in
    let httpResponse = response as! NSHTTPURLResponse
    // Status code is 200 !!!
    ex.fulfill()
}.resume()
```

#### Alamofire

``` swift
Alamofire.request(.GET, "/").response { _, response, _, _ in
    // Status code is 200 !!!
}
```

## Body

レスポンスBodyの種類は以下をサポートしています

* JSON
* File
* Text (String)
* NSData

例えばJSON、Fileだと下記のように記述します。

#### JSON

`[String: AnyObject]`をレスポンスとして返します。

``` swift
let json: [String: AnyObject] = ["name": "yukiasai", "age": 28]
Mock.install().request(url: someUrl).response(200, body: JSON(json), header: nil)
```

#### File

Bundleなどに存在するファイルの中身をレスポンスとして返します。

``` swift
let fileUrl: NSURL = NSURL(string: "path/to/file")!
Mock.install().request(url: someUrl).response(200, body: File(fileUrl), header: nil)
```

また、レスポンスを動的に生成するハンドラを定義することも可能です。

``` swift
Mock.install().request(url: someUrl).response { request -> Response in
    let response = NSHTTPURLResponse(URL: request.URL!, statusCode: 200, HTTPVersion: nil, headerFields: nil)!
    let data = "12345".dataUsingEncoding(NSUTF8StringEncoding)
    return .Success(response, data)
    // or return .Failure(error)
}
```

## Speed

通信状態を定義することでレスポンスのスピードを変えることが出来ます。

``` swift
Mock.install().request(url: url)
    .response(200, body: File(fileUrl), header: nil)
    .speed(.Wifi)
```

サポートされたスピードは以下のとおりです。

``` swift
public enum Speed {
    case Prompt
    case Wifi      // 45Mbps
    case Mobile4G  // 10Mbps
    case Mobile3G  // 1Mbps
    case Edge      // 200kbps
    case Custom(bps: Double)   // Custom speed
}
```

# 終わりに

ぜひ使ってみてください！
Angular 4でcanvas要素を扱う方法

# Angular 4の話

[Angular](https://angular.io/)でHTML5の`canvas`要素とどうやったら連携できるのか調べてみました。TypeScript 2.2, Angular 4での書き方です。


## 動作サンプル

動作サンプルはPlunkerにアップしておきました。

- [Angular 4 Example - How to use Canvas Element](https://plnkr.co/edit/9LX15YbGFCrghJP6HyWI)

## 手順の解説

1. `template`内のセレクターにID値を割り当てておく。ID値の割り当て方はAngularの記法を使う。(例 : `<canvas #hoge></canvas>`)
2. クラスでは`AfterViewInit`インターフェースを`implements`キーワードで指定。これによって`ngAfterViewInit ()`メソッド(ライフサイクル)の実装が義務付けられる。
3. クラスのメンバー変数に`ViewChild`アノテーションでID値を使って関連付けを行う。
4. `ngAfterViewInit ()`メソッドでは`canvas`要素の参照がとれるようになるになる。このとき、`nativeElement`プロパティーがその名のとおりHTML要素の生エレメントとなる。

## 具体的なコードサンプル

生HTML5 Canvasを制御するコードです。最もシンプルな例なので、コードも少なく参考にしやすいかと思います。

```ts
import {AfterViewInit, Component, DoCheck, ViewChild} from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <div>
      <canvas #myCanvas width="400" height="400"></canvas>
      <div>
        幅 <input type="range" min="1" max="400" [(ngModel)]="rectW"/><br/>
        高さ <input type="range" min="1" max="400" [(ngModel)]="rectH"/><br/>
        塗りの色 <input type="color" [(ngModel)]="rectColor" placeholder="color" value="{{rectColor}}"/>
      </div>
    </div>
  `,
  styles: [`canvas {
    background: lightgray;
  }`]
})
export class AppComponent implements AfterViewInit, DoCheck {
  rectW = 100;
  rectH = 100;
  rectColor = '#FF0000';
  context: CanvasRenderingContext2D;

  @ViewChild('myCanvas') myCanvas;

  ngAfterViewInit() {
    // 参照をとれる
    const canvas = this.myCanvas.nativeElement;
    this.context = canvas.getContext('2d');

    this.draw();
  }

  /** 値の変更時を監視するライフサイクルイベント */
  ngDoCheck() {
    this.draw();
  }

  /** Canvas要素を更新します。 */
  draw() {
    const ctx = this.context;
    if (ctx) {
      ctx.clearRect(0, 0, 400, 400);
      ctx.fillStyle = this.rectColor;
      ctx.fillRect(0, 0, this.rectW, this.rectH);
    }
  }
}

```

## 具体的な事例

Webサイト「[HTML5製のデザインツール Particle Develop - ICS](http://ics-web.jp/projects/particle-develop/)」の開発で、この手法で実装しました。画面左側のHTML5 Canvasの実装は直接APIを叩くのではなく、フレームワークとして「[CreateJS](https://ics.media/tutorial-createjs/index.html)」を使っています。

![](http://ics-web.jp/projects/particle-develop/images/preview.png)

## 展望

`canvas`要素を使えばグラフ描画やビジュアライゼーションに役立ちます。Angularはコンポーネント思考なので、`canvas`要素を内包したコンポーネントが増えればみんなハッピーになるような気がします。

## 変更履歴

- 2017/04/20 : Angular 2 BetaからAngular 4へ変更しました
Bitnami RedmineにStrangeWill-redmine-inline-attach-screenshot-c61c1c38cc7a installをplugin（bundle成功）した経緯を記録



### GitHubからinline-attach-screenshotをDL
DLしたファイルを
c:\bitnami\redmine2.6-1.0\apps\redmine\htdocs\plugins
にフォルダごと置く

### 例によってhtdocsでbundle実行
* cd C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs
* C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>bundle exec rake redmine:plugins:migrate RAILS_ENV=production
* 'bundle' is not recognized as an internal or external command,
operable program or batch file.

う～、やっぱbundleコマンド認識されない

念のためRedmineをStopさせてからもう一度やってみる
が、結果は同じでbundle is not recognized


---で、翌日Oct 7, 2015

### そもそもPathが通ってない？可能性
* C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>bundle -v
* 'bundle' is not recognized as an internal or external command,
operable program or batch file.

でdirを変えbinへ移動
* C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>cd　C:\Bitnami\redmine-2.6.1-0\ruby\bin
* C:\Bitnami\redmine-2.6.1-0\ruby\bin>bundle -v
* DL is deprecated, please use Fiddle
* Bundler version 1.7.0

DLはdeprecated、Fiddle使え・・は[local_avatars install]()で調べ済み
なので無視すると
bundleのverが返り、bunldeあるじゃん、通るじゃない！

そもそもbundleって何？？
を調べるとGemに行きあたる、GemはLiblaryのようなもので・・・
と言うことで
ローカルにインストール済みの gem の一覧を見たいときは list コマンドを使います。
$ gem list

C:\Bitnami\redmine-2.6.1-0\ruby>gem list

 LOCAL GEMS

bigdecimal (1.1.0)
io-console (0.3)
json (1.5.5)
minitest (2.5.1)
rake (0.9.2.2)
rdoc (3.9.5)

・・・て、bundleないじゃない
bundleはGemじゃないのか？

やっぱPath通ってない可能性
* コンピュータ＞システムのプロパティ＞システムの詳細設定＞環境変数
（コンパネ＞システム＞詳細設定・・でも良い）
* 変数名PATHを確認


* 変数値はC:\ProgramData\Oracle\Java\javapath;C:\Ruby19\bin;C:\Program Files\PHP\v5.5;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Citrix\ICAService\;C:\Program Files\Citrix\System32\;C:\Program Files\Common Files\Hitachi;C:\Program Files\Hitachi\PKI Enrollment Service Client\bin;C:\BitNami\redmine-3.0.3-0\ruby\bin;C:\BitNami\redmine-3.0.3-0\imagemagick


C:\Ruby19\bin;　はRuby 1.9を先にインストールしていたから
で横道だが不要なのでアンインストールとPath削除

redmine2.6-2.0ないじゃない
思い当たるは、redmine2.6-2.0の後にver-upでredmine-3.0.3-0を追加インスコしたから
なんとそれでredmine2.6-2.0のPATHが上書きされた・・・と理解
* C:\BitNami\redmine-3.0.3-0\ruby\bin;C:\BitNami\redmine-3.0.3-0\imagemagick　をredmine-2.6.1-0に変更

ちなみにredmine-3.0.3-0\imagemagickがずっと削除できなかったのはPATHが通っているからフォルダ削除できなかった
Bitnami Redmineでredmine_local_avatars installをやってみた、結果インスコできなかったを記録

Pulginを2つ目、この前に[Templete plugin](http://qiita.com/ihopeyoufunit/items/1fcf16576f9be62981db)を入れたRedmine2.6-1.0環境に追加トライ

### GitHubからファイルをDL
* c:\bitnami\redmine2.6-2.0\apps\redmine\htdocs\plugins
にフォルダごと置く

### どうせrakeでは動かないはず、でbundle execで実施して見る
dirはhtdocs
* cd C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs
* C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>bundle exec rake redmine:plugins:migrate RAILS_ENV=production
* 'bundle' is not recognized as an internal or external command,
operable program or batch file.

bundle認識できね～よ　・・と言われても
この前のIssue Template PluginではOKだったのに

### dirをpluginsに変えてbundle execを実施して見る
・・が同じくダメ（当然か）

### 先にrubyで通して見る
* C:\Bitnami\redmine-2.6.1-0\ruby\bin>bundle exec rake redmine:plugins:migrate RAILS_ENV=production
* DL is deprecated, please use Fiddle
Could not locate Gemfile

・・と言われ、
でもbunldeは認識されているよう

### dirをhtdocsにしてbundle execを実施して見る
* cd C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs

・・が同じく'bundle' is not recognized・・か（変化なし）

### ダメもとでrakeで実施して見る
* C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>rake redmine:plugins:migrate RAILS_ENV=production
* rake aborted!

・・もやっぱダメ（当然だ）

### bundle updateを実施して見る
* 'bundle' is not recognized as an internal or external command,
operable program or batch file.

・・なので、そもそもbundleが認識されてない？
でもrubyでは通っているのに？？
やっぱりPluginインスコが2つ目だから？？？
（この前にIssue Templateを入れたので）

行き詰まりネットを調べると
意識的にPluginする”もの”を指定する方法、があるような
* C:\Bitnami\redmine-2.6.1-0\apps\redmine\htdocs>bundle exec rake redmine:plugins:migrate RAILS_ENV=production **Migrating redmine_local_avatars**

・・でもまたまた'bundle' is not recognized
諦めて冷静に、そもそも

### **なぜにhtdocsではbundleが通らない？**

C:\Bitnami\redmine-2.6.1-0でもbundleが通らない
htdocs\pluginsでも通らない
htdocs\plugins\redmine_local_avatarsでも通らない

当たり前、bundleが通らなければインスコできないじゃん
不思議だ、前のTemplete pluginで通ったのは何だったんだ？偶然の訳はので何か理由があるはずだがRuby良く分かってないので判明もできず

さあ次いってみよう！・・で[inline-attach-screenshot](http://qiita.com/ihopeyoufunit/items/27dc25d426cdd99fe37a)のインスコに走る　（・・で、Avatarはその後に無事インスコ完）
【iOS】【Objective-C】WKWebView切り替えた時のメモ(タイトル・URLの取得編)

関連リンク：[【iOS】【Objective-C】WKWebView切り替えた時のメモ(WKNavigationDelegate編)](http://qiita.com/kitanoow/items/3f287d89d5c69dc13ed4)

UIWebViewにおいてタイトルを取得する際に、今まで謎の実装を行っていた。

このあたりりは、WKWebViewにおいて改善されたよう。
合わせて、URLも。


#UIWebViewの場合

完了時に実行される、delegateメソッドにおいて

```objc

-(void)webViewDidFinishLoad:(UIWebView *)webView{
    NSString* title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
    NSString* url = [webView stringByEvaluatingJavaScriptFromString:@"document.URL"];
    //こっちでも可
    NSString* url2 = [[[webView request] URL] absoluteString];
    
}

```

タイトルについては、javascriptの実行が必要という謎の実装を行ってました。


#WKWebViewの場合

```objc

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
    NSString* title = webView.title;
    NSString* url = [[webView URL] absoluteString];
}

```

というところ。
Debian GNU/Linux 8.3のBOINCで特定プロジェクトと通信できない場合の一時対処

# Debian GNU/Linux 8.3のBOINCで特定プロジェクトと通信できない場合の一時対処 #

## 症状 ##

Debian GNU/Linux 8.3にアップデートしてからBOINCでWorld Community GridとEinstein@Homeのデータが受信できなくなった。

* プロジェクトを追加しようとしても"Please try again later"と表示される。
* すでに追加されている場合は"Peer certificate cannot be authenticated with given CA certificates"と表示されWU(宿題)がダウンロードできない。

## 原因 ##

BOINC界隈では以前にもこの手の問題があったらしく、原因はOpenSSLパッケージの証明書らしい。

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813468

## 一時対処 ##

OpenSSLパッケージがアップデートされるのを待つ間稼働するため以下の対処を行いました。

公式クライアントの証明書ファイルとDebianパッケージのファイルを入れ替えるという対処です。
OpenSSLパッケージ関連のファイルをいじるわけではないので安全(BOINCのみ有効)。

```shell-session
$ cd /tmp
$ wget http://boinc.berkeley.edu/dl/boinc_7.2.42_x86_64-pc-linux-gnu.sh
$ bash boinc_7.2.42_x86_64-pc-linux-gnu.sh
$ su
# mv /var/lib/boinc-client/ca-bundle.crt /var/lib/boinc-client/ca-bundle.crt.old
# cp /tmp/BOINC/ca-bundle.crt /var/lib/boinc-client/
# /etc/init.d/boinc-client restart
# exit
```

これでWorld Community GridとEinstein@Homeに通信できるようになりました。
PhpStormからFTPでアップロードするときになんとかtimestampという警告が出る現象の解決方法

#現象
PhpStormでRemote Hostの設定を行いFTPでファイルをアップロードすると、アップロードはできているのだが以下のような警告が出る。

[2016/MM/DD hh:mm] Upload to hoge
[2016/MM/DD hh:mm] Failed to change timestamp of the file '○○○/○○○.html'
[2016/MM/DD hh:mm] Upload to hoge completed in less than a minute: 1 file transferred (28.3 Kb/s)

#解決策
ググッたらまさに同じ現象の解決策があった。下の参考サイト1個目。
メニュー Tools>Deployment>Options で Preserve files timestamps のチェックを外すと警告が出なくなった。
"Preserve files timestamps" はローカルのファイルの更新日時をそのまま引き継いでサーバにアップロードするという設定かな。サーバ側がそれに対応してないから警告が出てたみたいな。

#参考サイト
[【PHPStorm】FTPアップロードでタイムスタンプが更新できないエラー | お仕事募集中:](http://www.mikame.net/pr/archives/759)
[PhpStormからFTPでファイルをアップロードすると時間がずれる(23275)｜teratail:](https://teratail.com/questions/23275)
ElasticSearchでpluing install時に java.security.InvalidAlgorithmParameterException

CentOSでElasticSearchのプラグインをインストールしようとしたらと失敗した

`--verbose` を付けて実行すると `java.security.InvalidAlgorithmParameterException` でコケている場合の対処方法

# 結論

`# yum update`

以上。

より厳密には、`# yum update nss`が鍵

# 蛇足

InvalidAlgorithmParameterExceptionでググると、「OpenJDK固有の問題」、みたいな記事が多く出てくるせいで惑わされた

yum updatesしたタイミングによって陥る問題なせいであまりメジャーな事象じゃないせいかそんなに情報もないような

そんななか詳細に調査している記事
 [Troubleshooting story - Java HTTP client crashes on connections | BackSlasher](http://blog.backslasher.net/java-ssl-crash.html)

`nss` パッケージが怪しいことを突き止めてる調査方法が勉強になる
わかりにくいSiddhiをガチで本気で使ってみた。

どうも、ishida(@kojiisd)です。

AWS IoTアドベントカレンダーを書くためにQiitaアカウントを取り、それ以来全く使っていなかったのでそろそろ使おうかと改心。

最近割とガチで[Siddhi](https://github.com/wso2/siddhi)を使い始めたのですが、情報がなさ過ぎて思うように進まない！

そもそも技術ではよくある、発表されたら誰かが翻訳して、、、という流れもなければ外人が「使ってみた」を公開しているわけでもなく、かなり嵌ったわけです。

というわけで、そんな経験をメモ。あくまで自分の理解です。

#概要
CEPでリアルタイムストリームデータ処理をしている中で、スライドウィンドウと閾値を設けて判定を加えたりできる技術。

Esperも技術解としては存在するが、パフォーマンス的にSiddhiの方が優秀（らしい）

#基礎
とある処理から流れてきているデータをマージしたり計算したりして、結果新しい処理の流れを生み出す、というコンセプト。

よくあるサンプル

```
from StockExchangeStream[volume <10]
insert into StockQuoteStream symbol, volume
```

上記はStockExchangeStreamというストリーム処理の流れを受けて、volumeパラメータが10より小さいものを抽出し、StockQuoteStreamという名前付けされた新しいStreamに対して、symbolとvolumeパラメータを追加する、という意味。
→結果、新しいStockQuoteStreamという名前の流れが生成される。
　→別のSiddhiでこの名前を流入元として指定することが可能。

実際には、上記のQueryを実行する前に、StrockExchnageStreamの定義が必要になるので、
以下のようなdefineをする必要がある。
QueryEditorを利用すると、この辺を自動的に実施してくれるっぽい。

```
define stream StockExchangeStream (symbol string, price float, volume int );
```

#注意点

1. 使える予約語に注意。SQLと似ているが、少しずつ違う。WHERE句が使えないなど、Conditionの用い方は気を付けること。
2. 「;」のつける位置に注意。defineのブロックの最後は改行、insertのブロックの最後も改行。それ以外の文末は「;」にしないとSyntax Errorが発生する。

計算結果のストリームを受け取り、その中で100より大きい計算結果が10分間の間に5回より多く発生した場合にresultStreamというストリームに結果を書き込むQueryは以下。

```
define stream inStream(id string, calcResult float,timestamp long);
define stream inDisStream(id string, calcResult float,timestamp long)

@info(name='streamQuery')from inStream[calcResult>100] select id, calcResult, timestamp 

insert into inDisStream;
from inDisStream[count(id)>5]#window.time(10 min) select avg(calcResult) as avgResult 

insert into resultStream
```

#感想
いやぁ、わかりづらい。Java使ってる身としては処理を書く順番など感覚が所々違っているので、理解するのに時間がかかりました。