OmniAICreator/Qiita-1.07M huggingface dataset:
複数台でJmeterの負荷試験を行う

#複数台でのJmeter試験

何番煎じかわからないが、Jmeterでの負荷試験を行う際の構成メモ。
OSはWindowsで構築。

## 構成

Jmeterクライアント：1台
Jmeterサーバ：2台

![Jmeter.png](https://qiita-image-store.s3.amazonaws.com/0/49877/f89f0014-c3f3-7c45-8cbe-bb91fe1e3e83.png)

## 前準備
Jmeterの実行環境を整える

### サーバ
AWSであれば、ネットワークがHigh以上のインスタンスで
メモリが7GB以上あるインスタンスをお勧めする。
Jmeterのクライアントは結果出力のため、メモリ最適化インスタンスでも問題ない。

### Java
jdkの64bitをインストールすること。
32bitだとメモリ制限あり。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

##FW
邪魔なので無効。
ポートを指定して許可したい場合は、こちらのブログが参考になります。
http://d.hatena.ne.jp/terazzo/20130819/1376929377

### AWS
ELBに向けて負荷をかける場合はPre-Warmingを忘れずに。(サポート加入必須)
http://www.slideshare.net/AmazonWebServicesJapan/20130612-aws-meisterregenerateelbpublic/47

## Jmeter
公式から最新版をダウンロードして、お好きなフォルダに配置。
http://jmeter.apache.org/download_jmeter.cgi

### ヒープサイズ調整
調整しないで実施した場合、高負荷で「OutOfMemoryError」が発生することがほとです。
Jmeterクライアント/サーバともに割り当てるメモリ量を調整して、Jmeterを起動するようにする。

```
\apache-jmeter-2.13\bin\jmeter.bat
# サーバの性能によって調整　Xms初期 Xmx最大
set HEAP=-Xms1024m -Xmx4096m
```

### リスナーの調整
長期的な負荷試験では、
詳細な情報のリスナーを取得しているとファイルに出力したとしてもメモリを食いつぶす事があります。
その際は統計レポート等などに絞るのが良い感じでした。

### Jmeterクライアント設定
Jmeter-SeverのPrivateIPを指定する

```
\apache-jmeter-2.13\bin\jmeter.properties
remote_hosts=xxx.xxx.xxx.xxx:1099,xxx.xxx.xxx.xxx:1099
```

### JMX

負荷試験を実施するシナリオはWebの仕様に合わせて作成する。
ユーザの挙動の合わせ定数タイマを設定しないとDOS攻撃のようなシナリオになるので注意。

##試験

サービスを起動する。

Jmeter-Server側で「jmeter-server.bat」
Jmeter-Clinet側で「jmeter.bat」

実行→開始(リモート)　からRemote先のIPが閲覧できていれば問題ない。

jmxを開き、スレッド数、Ramp-UP、スケジューラを設定し、試験を実行する。
Atom乗り換えメモ


ゆるい感じで使ってたEmacsからAtomへの乗り換えメモ。
個人的な記録を随時更新。

# Theme

## UI Theme

黒に紺色がいい感じの [Northem Dark Atom](https://atom.io/themes/northem-dark-atom-ui) を利用してみる。

![Northem Dark Atom](https://i.github-camo.com/73b3368a85d749af759df13597dd8449727549e9/68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f61726374696369636573747564696f2f6e6f727468656d2d6461726b2d61746f6d2d75692f6d61737465722f7265732f696d6167652f707265766965772d73637265656e73686f742e706e67)

## Syntax Theme

落ち着いた感じの [No Caffeine Syntax Theme](https://atom.io/themes/no-caffeine-syntax) を利用してみる。

![No Caffeine Syntax Theme](https://i.github-camo.com/dded818302cfec4f74179f9000fb6f9f93e69ae9/687474703a2f2f662e636c2e6c792f6974656d732f324d3245335a3243306b334b314231693267326f2f53637265656e25323053686f74253230323031342d30332d3032253230617425323030352e35302e34332e706e67)

# Package

## [open-plus](https://github.com/klorenz/atom-open-plus)
Markdownでメモ取りしているので、カーソルが乗ってるファイル名を開いてくれる機能が個人的には必須だがこのパッケージがシンプルで良さそう。

EmacsではC-c,oで開いてたので  `keymap.cson` に以下を追加。

```coffeescript
'atom-workspace':
  'ctrl-c o': "open-plus:open"
```

あと、別バッファで同時に開きたいので `~/.atompackages/open-lus/lib/open-plus.coffee` に以下を追加。

```diff
@@ -151,6 +151,9 @@
         if isBinaryFile(filename)
           return osOpen filename
 
+        pane = atom.workspace.getActivePane()
+        pane.splitRight()
+        
         # in case file already opened, initialLine and initialColumn are not
         # used. so set bufferposition here
         return atom.workspace.open(filename).then (editor) =>
```

## [block-cursor](https://atom.io/packages/block-cursor)

カーソルを見やすいブロック状にできるパッケージ。
動作と設定はとりあえずこんな感じで。

![block-cursor.gif](https://qiita-image-store.s3.amazonaws.com/0/15745/9f94685e-73d7-1b77-d0b3-ac6a58d6cb7e.gif)

## [keyboard-localization](https://atom.io/packages/keyboard-localization)

自作のパッケージがOSXでは動くのにWindowsだと動かなかったので色々調べてみるとどうやらキーマップがおかしいっぽい。
なんでもUSキーボードがハードコーディングされてるみたいなので、このパッケージを入れて `ja_JP` にしたら無事に解決。

## [comment-dwim-light](https://atom.io/packages/comment-dwim-light)

初めて作ったAtom用パッケージ。コメント周りで空気を読んでくれる。
詳細は [こちら] (http://qiita.com/nobuhito/items/4950909d28f988b3be61) 。
PHPからExcelを動かす

PHPからOLEを操る仕組みが存在します。
当然ですがWindowsサーバ、かつ該当のアプリがインストールされていることが前提です。

何故か[PHP5.4.5以降デフォルト無効になった](http://php.net/manual/ja/com.installation.php)ので、php.iniでphp_com_dotnet.dllを有効にしておきます。

```php
<?php
	$excel = New COM('excel.application');
	$excel->Visible = 1;
	$excel->WorkBooks->Add();
	
	$worksheet = $excel->Worksheets('Sheet2');
	$worksheet->Activate();
	$worksheet->Cells(1,1)->Value='hoge';
	$worksheet->Cells(1,2)->Value=10;
	$worksheet->Cells(2,2)->Value=20;
	
	$range = $worksheet->Range('B1:B2');
	$sum = $excel->WorksheetFunction->Sum($range);
	
	$excel->Quit();

	$word = New COM('word.application');
	$word->Visible = 1;
	$word->Documents->Add();
	$word->Selection->TypeText("fuga");
	$word->Quit();
```

ExcelとWordのオブジェクトを取得できます。
あとはそれに対して適当に色々できる、らしいのですが、そもそも[OLEの仕組み](https://msdn.microsoft.com/ja-jp/library/office/dn467914.aspx)がよくわからない。
COMの中身はPHPのオブジェクトではないので、リフレクション使っても何も出てきません。
具体的にどのようなメソッドがあったりするのかがわからない。
PHPからOLE使ってみたという記事もほとんど見当たらない。

RubyにWin32OLEというモジュールがあり、これが比較的記事が多いので、使い方はそれを参考にするのがいい感じっぽいです。
プロジェクトディレクトリに__init__.pyを作ったらnosetestsが通らない件について

自分用メモ。

[Python Nose Import Error - Stack Overflow](http://stackoverflow.com/questions/3073259/python-nose-import-error/3073368#3073368)

ここの通りなのですが、
実行ディレクトリ、プロジェクトディレクトリに `__init__.py` を作ると、
そこが名前で参照すべきパッケージになる (多分) ので、

```
current_dir (__init__.py があることで **パッケージディレクトリ** になる)
├ __init__.py
├─ lib
│　　├ __init__.py
│　　└ bar.py
└─ test_dir
　　├ __init__.py
　　└ test_foo.py
```

みたいなディレクトリ構成だとしたら、

```bash
$ cd current_dir
$ nosetests test_dir/test_foo.py
```

を通すには、

```python:test_foo.py
from lib import bar
from nose.tools import ok_
ok_(True, False)
```

じゃなくて、

```python:test_foo.py
from current_dir.lib import bar
from nose.tools import ok_
ok_(True, False)
```

にしないと通らない、みたいなそんな話と解釈した。

python のモジュールインポートでは、

```py
from .. import foo
from .dir import lib
```

のような書き方をするが、基本的に実行時のディレクトリがルートになる、ということが前提。
(sys.path.append は適切に使いたい)
TypeScript + mocha + power-assert-js + Sinon.JS テスト環境メモ


# 導入

## ライブラリ

```
npm i mocha power-assert espower-typescript sinon -D
```

## 型定義ファイル

```
tsd query mocha -rosa install
tsd query power-assert -rosa install
tsd query empower -rosa install
tsd query sinon -rosa install
```


# 環境内訳

## mocha

http://mochajs.org/

単体テスト用ライブラリ。`describe()`,`it()`とか書ける。

## power-assert-js

https://github.com/power-assert-js/power-assert

出力がみやすいassertライブラリ。
`assert.deepEqual(a, b)`による配列やオブジェクトの比較出力が強力。

[5分ぐらいでわかるpower assert](http://azu.github.io/slide/sakurajs/power-assert.html#/)

## espower-typescript

https://github.com/power-assert-js/espower-typescript

power-assert-jsのTypeScriptむけプラグイン。tsを自動でコンパイルしてくれる。

[2016-01-11追記]tsc1.6以降で,`Cannot read property 'text' of undefined`というエラーが出る場合は、v2系をインストールすると回避できる。 [原因](https://github.com/teppeis/typescript-simple/pull/27)

## Sinon.JS

http://sinonjs.org/

spy, mock, stubなどassertだけじゃ厳しいところをサポートしてくれるテスト用ライブラリ。

# テストコード

* 前提：nodejs環境
* test ディレクトリ以下にtsコードを置く。
 * espower-typescriptを導入する事でビルド後のjsファイルが不要。
 * テスト対象のtsファイルもコンパイルされるので便利
* tsd.d.tsへリファレンスパス通す
* BDDスタイルなら以下


```javascript:sample-test.ts
/// <reference path="../typings/tsd.d.ts" />

import * as assert from 'power-assert';
import * as mytest from '../src/mytest';

describe("Some Class", ()=>{
	context("someMethod()", ()=>{
		
		it("should return object", ()=>{
			const a = mytest.SomeClass.someMethod();
			const b = {c:0, d:"abc"};
			assert.deepEqual(a, b);
		});
	});
});

```

 * 基本的なテストはpower-assertで、複雑なものはSinon.JSを併用する
 * 各ライブラリの使い方はtsのコードになるだけであとは同じ

## テスト対象コード

 * 対象のメソッドは`public`でないといけない。
  * `private`や`protected`ではダメ
  * `static`は当然OK
 * ES6方式にexportすると以下

```javascript:mytest.ts
export namespace mytest{
	export class SomeClass{
		
		static someMethod():{c:number, d:string}{
			//...
			return {c:0,d:"abc"};
		}
	}
}
```


## コマンド

```
mocha --compilers ts:espower-typescript/guess test/*-test.ts
```

`--compilers`オプションでespower-typescriptが必須

なお`-w`オプションでwatchもできる。

```
mocha --compilers ts:espower-typescript/guess -w test/*-test.ts
```
ARのserializeにfields_forの値を突っ込む

ActiveRecordのserializeメソッドでカラムにシリアライズした値をDBに保存できるが、fields_forを使ってネストしたデータを保存してみる。

## とりあえず保存

モデルはこんな感じで

``` ruby:user.rb
class User < ActiveRecord::Base
  serialize :other, Hash 
end
```

viewはこんな感じ

``` ruby:_form.html.slim
= form_for @user do |f|
  div
    = f.text_field :name
  div
    = f.fields_for :other do |ff|
      = ff.text_field :hoge
      = ff.text_field :fuga
  div
    = f.submit
```

とりあえず保存すると以下みたいになる。

```
User.last.other => {"hoge"=>"222", "fuga"=>"3333"}
```

だけどもこのままだと編集とか仕様とするとother内容がフォームに反映できない

## 編集時に反映できるようにする

fields_forの第2引数にOpenStructのインスタンスを渡す。Hash渡すとfields_forメソッド内でfields_options扱いになる

``` ruby:_form.html.slim
= form_for @user do |f|
  div
    = f.text_field :name
  div
    = f.fields_for :other, OpenStruct.new(f.object.other) do |ff|
      = ff.text_field :hoge                   
      = ff.text_field :fuga
  div
    = f.submit
```

これで編集時にもフォームに値が反映されている
用途的にそんなに無いかもしれないが。。。
Fluentdを使ってMysqlのtableの変更検出する

## Github
https://github.com/a4t/fluent-plugin-mysql-table

## これなんだ
Fluentdを使ってMysqlのテーブルのスキーマ変更とテーブル追加、削除をフィルタリングするするプラグインを書いた
Databaseのマイグレーションがしっかりできている場合必要ないかもしれない。

## 使い方

テーブルのスキーマ変更を検知する場合

```
<source>
  type in_mysql_table
  tag mysql.table
  host mysqlserver
  username username
  password password
  database database_name
  port     3306
  interval 60 # SHOW TABLES FROM #{@database} が走るinterval
</source>

<filter mysql.table>
  type change_mysql_table
  host mysqlserver
  username username
  password password
  port     3306
  interval 1 # SHOW CREATE TABLE #{table_name} が走るinterval
  database database_name
</filter>

<match mysql.table>
  type stdout
</match>
```

```
こんな感じのQuery流す
ALTER TABLE `moge` ADD `hoge` INT  NULL  DEFAULT NULL  AFTER `id`;

2015-08-11 09:48:34 +0000 mysql.table: ["moge"]
```

テーブルが追加、削除されたの検知する場合

```
<source>
  type in_mysql_table
  tag mysql.table
  host mysqlserver
  username username
  password password
  database database_name
  port     3306
  interval 60
</source>

<filter mysql.table>
  type change_prev_record 
</filter>

<match mysql.table>
  type stdout
</match>
```

```
こんな感じのQuery流す
CREATE TABLE `moge` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2015-08-11 09:48:34 +0000 mysql.table: ["moge"]
```

## 最後に
change_prev_recordは前回のmessageとの違いを出してるだけなので、別のプラグインかなーとも思った。
Plugin書くのも非情に簡単でFluentd便利ですね。
pull reqお待ちしております！
DBまるごとの大きなダンプファイルから目的のテーブルのデータだけ取り出してリストアしたい



まあ、およそバックアップなんつーものはリストアする時の手間なんて考えて行われていない訳で。
一つのテーブルを元に戻したいだけなのに、データベース全体のバックアップだったりして、１Gとかのファイルを渡されて途方に暮れる訳である。
そういう時どうすればいいか。

まずファイルを調べる。

```bash
less -N mydb.dump
```

こうすると行数が表示されるようだ。

で、もちろん目的の単語を探す。ここではpostgresのダンプデータを想定しているので、

```bash
CREATE TABLE items (
```

の部分と、

```bash
/COPY items
```

の部分を目印に探せばよいだろう。

見つかったら行番号をメモる。

Ctrl+f でページをだぐって、切れ目の行番号をメモる。

```bash
/^$
```

でもよい。

そしたら

```bash
cat mydb.dump | sed -n '581018,581037p' > myTable.txt
```

で切り出す。
最初に切り出したcreate tableで自分のDBにテーブルを作っておいて、そこに上で切り出したCOPYコマンド部分を


```bash
psql mydb_db < myTable.txt 
```

とすればOK。
テーブルは君のものだ。
shell でディレクトリ内のファイルに対してループ処理

あるディレクトリ内でファイル一覧に対して同じ処理をしたい時のループの書き方

```bash
for file in `\find . -maxdepth 1 -type f`; do
    # TODO
done
```

``` \find . -maxdepth 1 -type f``` 
カレントディレクトリの’ファイル’のみを取得している

``` \ls -F | grep -v / ```
でもファイルを絞り込めるが実行可能ファイルに「*」がついたりする

#例
## 中身を結合してファイルに出力
```bash
for file in `\find . -maxdepth 1 -type f`; do
    cat $file >> out
done
```

## 再帰的にtxt のみファイルに出力して削除
```bash
for file in `\find . -name '*.txt'`; do
    cat $file >> out
    rm $file
done
```

## png のみ バックアップ
```bash
for file in `\find . -maxdepth 1 -name '*.png'`; do
    cp $file $file.tmp
done
```
RecyclerViewやListView内で、SurfaceViewを再利用して使う時に黒くなって困っている方へ

VineやInstagramのようにListの中で動画再生したいときってありますよね？

VideoViewを使えば、実装はそこまで難しくはないとは思いますが、
何かしら問題が発生します。。。

僕が個人的にハマっていた中の一つが、これ。
**たまに黒くなる**
ってことです。

SurfaceViewのおかげでスクロール中に他のViewを飛び越えて画面の一部が黒くなったり、
時にはスクロールして消えたはずの動画が下の方でこっそり流れていたりしました。
(こういったバグは僕だけでしょうか.....???)

この**たまに黒くなる**バグですが、ならない方法を見つけたので共有したいと思います。
治らなかったらごめんなさい......

※ちなみに補足として、このバグはVideoViewでもSurfaceView×ExoPlayerの組み合わせでも出ました。あとxmlで囲っているViewGroupをwidth:match_parent/height:match_parentにしている時に起きます。

解決策はこれ

``` xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/videoFrame"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="0.1dp"
    android:layout_marginLeft="0.1dp">

    <SquareExoVideoView
        android:id="@+id/square_video_exo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal" />

    <SquareImageView
        android:id="@+id/video_thumbnail"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal" />
</FrameLayout>
```

**大小問わない枠を付けると治ります。**
SurfaceViewをmatch_parent状態にすると、重なっている別Viewが上に来るのを難しくしてるのかな???　経験が浅いため、明確な回答が出せず申し訳ないです。。。

以上！
playのviews以下のファイルでコンパイルエラー(object HtmlFormat is not a member of package play.api.templates)

#playのviewでコンパイルエラー
```
object HtmlFormat is not a member of package play.api.templates
```

#対応
project/target/scala-2.11/twirl/mainにビルドバスを通す
![スクリーンショット 2015-08-11 6.27.15 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20307/dc42a260-63e8-8e5d-8637-b5c0715a79eb.png)
MediaScannerに登録を依頼する方法

AndroidのデフォルトのContentProviderにMediaStoreがありますが、MediaScannerが自動で登録してくれます。

ただ、自分でカメラアプリや録音アプリなどを作ってファイルを生成した時にMediaStoreに能動的に登録したいことがあります。

通常は画像なら[MediaStore.Images.Media.insertImage](http://developer.android.com/reference/android/provider/MediaStore.Images.Media.html#insertImage(android.content.ContentResolver,%20java.lang.String,%20java.lang.String,%20java.lang.String))、それ以外もContentResolverを使ってMediaStoreにinsertすることで登録できます。
ただ、exifの取得やmp3のタグの読み取りなど、システムに任せたいこともあるかと思います。

登録を依頼する方法がいくつかあるのでまとめておきます。

Lollipop以降での新しいAPIなどは見つけられていないのですが、もしあったら教えてください。

# MediaScannerConnection.scanFileを使う

[MediaScannerConnection.scanFile](http://developer.android.com/reference/android/media/MediaScannerConnection.html#scanFile(android.content.Context,%20java.lang.String[],%20java.lang.String[],%20android.media.MediaScannerConnection.OnScanCompletedListener))

一般的によく使われる方法かと思います。

```java:
MediaScannerConnection.scanFile(getActivity(),
            new String[] { file.getAbsolutePath() }, null,
            new OnScanCompletedListener() {
                @Override
                public void onScanCompleted(String path, Uri uri) {
                    Log.v("MediaScanWork", "file " + path
                            + " was scanned seccessfully: " + uri);
                }
            });
}

```

この方法は、登録完了のコールバックを受け取りたい時に有効です。
listenerはnullも許容されているのでcallbackが不要の時にも使えます。

また、複数ファイルも登録できるので便利です。


# Intent.ACTION_MEDIA_SCANNER_SCAN_FILEを使う

[Intent.ACTION_MEDIA_SCANNER_SCAN_FILE](http://developer.android.com/reference/android/content/Intent.html#ACTION_MEDIA_SCANNER_SCAN_FILE)

紹介されている例が少し少なかったですが、特にスキャン完了などを把握しなくていい時には、とてもシンプルな方法なのでオススメです。

```java:
Uri contentUri = Uri.fromFile(newFile);
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri);
context.sendBroadcast(mediaScanIntent);
```

注意点として、ファイルの絶対pathを渡した方がいいらしいです。
また、スキャンの結果がわからないので、使いどころを選びますね。

# [昔可能だった方法]全ファイルの自動検索

かつては[Intent.ACTION_BOOT_COMPLETED](http://developer.android.com/reference/android/content/Intent.html#ACTION_BOOT_COMPLETED)や[Intent.ACTION_MEDIA_MOUNTED](http://developer.android.com/reference/android/content/Intent.html#ACTION_MEDIA_MOUNTED)を発行することで、MediaScannerに全ファイルの検索を依頼することができました。
この方法ではファイルのパスさえいらないので、自アプリだけなく他のアプリのスキャン漏れも再検索してもらえます。

しかし、kitkat以降では、これらのbroadcast intentの発行権限が発行時にチェックされるようになったため、使えなくなりました。
現状は全ファイルの再検索依頼は難しそうです。

# まとめ

* MediaStoreに登録するのは[MediaStore.Images.Media.insertImage](http://developer.android.com/reference/android/provider/MediaStore.Images.Media.html#insertImage(android.content.ContentResolver,%20java.lang.String,%20java.lang.String,%20java.lang.String))などを使ったりinsertするのがもっとも確実
* ファイルの情報を十分に登録できない時などはMediaScannerServiceに依頼する
* ストレージの再検索は現状難しそう。

# 参考

* [Scan Media Files in Android](http://droidyue.com/blog/2014/01/19/scan-media-files-in-android/)
  
フレームワークの内部コードを交えた解説がされていて親切でした。


* [MediaScannerConnectionを使って画像をギャラリーに反映させる](http://techbooster.org/android/multimedia/5341/)
TurbolinksとJavaScriptの折り合い

Rails 4には、ページ遷移を高速化するためのTurbolinksという仕組みが組み込まれています。以前に、これらの枠組みについて[おおまかに触れました](http://qiita.com/jkr_2255/items/46dfc85e6e05bdf1f8e6)が、今回はJavaScriptの動作に絞って考えていきます。

# いきなりまとめ
* ページ遷移ごとに`<body>`とその中身は入れ替わる（それ以外のものはそのまま残る）
* ページ遷移ごとに`ready`が動くかは選べる
* リンク段階で止めることも可能

# Turbolinksの動作条件
まず最初に動作条件を示しておきますが、Turbolinksは、以下のように動作します。

1. まず、リンクの段階でTurbolinksに適するかチェック
2. Ajaxでリンク先をロード
3. ロードしたデータを見て、JSやCSSが合わないなど、うまく行かなければ普通の遷移にフォールバック
4. ロードしたデータから`<body>`と`<title>`を抽出して、ページに適用

## 除外されるリンク
Turbolinksの動作から除外されるリンクは以下のようなものです。

* （リンク自体の性質じゃないけど）Shift+クリック、センタークリックなど、修飾付きでリンクが選択された場合
* サイト外へのリンク[^1]
* POST、DELETEなど、GETメソッド以外の動作を指定してあるリンク
* `.html`以外の拡張子がついたファイル（設定で変更可能です）
* そのリンク自身、あるいは上位要素に`data-no-turbolink`属性を指定してあるリンク

## 除外すべきリンク
サイト内のリンクの場合、上で書いたようにいったんAjaxロードした上で、不適切なら普通の遷移に切り替えるという動作をします。そういうわけで、そもそもJSやCSSを違えたページへリンクを貼る場合、最初から除外しておいたほうがいいでしょう。

また、AngularやReactなど、フロントエンドフレームワークを動かす場合、Turbolinksは干渉してしまう危険が大きいし、もともとページ遷移も少ないのでそこまで役に立ちません。サイト全体をフロントエンドフレームワークで組む場合には、Turbolinksを止めてしまったほうが適当でしょう。

# JavaScriptの動作に与える影響
## 変わるもの、変わらないもの
Turbolinksのページ遷移の場合、`body`要素を新しいページのものに入れ替えてしまいます。そういうわけで、`body`自体やその下にある要素へ割り当てたイベントは、ページ遷移でクリアされます。一方で、

* `window`、`document`、`html`に割り当てたイベント
* JavaScriptのグローバルオブジェクト
* CSS
* タイマー（`setInterval`、`setTimeout`）

といったものは、Turbolinksのページ遷移でリセットされません。

## イベント委譲
`$(window).on('click','.selector')`のように、バブリングするイベントを`window`へ割り当ててしまうと、ページ遷移のあとにも残ってしまいます。全ページで稼働させるものならそれでいいのですが、このページでだけ適用したいという場合には、`$('body').on('click','.selector')`のように、`body`あるいはそれ以下に割り当てましょう。

## 外部スクリプト
TwitterボタンやGoogle Analyticsのように外部のスクリプトを読み込む機会も多いと思いますが、これらを動かす場合にも、Turbolinksの効果を最大限に発揮するために、

1. 読み込みコードは、それぞれが持つグローバルオブジェクト（Twitterだったら`twttr`）がない場合にのみ駆動させる
2. ページ遷移のたびに、適用させるためのメソッド（Twitterなら`twttr.widgets.load()`）を呼ぶ

のような手順をたどりましょう。

## イベントを付ける場所、コードの実行タイミング
そのままだと、jQueryの`ready`は最初のロード時にしか実行されません。これを回避するには2つの方法があります。

* `ready`以外に`page:load`のタイミングでも実行するようにハンドラをセットする
* `jquery.turbolinks`を使う

それぞれの場合に、どこでどんな処理をするか分類してみました。

| | 全体ロード時に一度だけの処理|ページ遷移のたびの処理|
|---|:--|:--|
|使い道|windowのイベントやタイマーなど、変化しない部分の処理|ページごとに各エレメントへ割り当てるイベントなど|
|`jquery.turbolinks`なしの場合の書き方| `jQuery(function(){...})` | `$(document).on('ready page:load',function(){...})`|
|`jquery.turbolinks`ありの場合の書き方| `(function(){...})()`[^2] | `ｊQuery(function(){...})`|

## `window`のイベントを、ページ固有に使う
`scroll`や`resize`など、ウインドウ単位でないと取れないイベントもありますが、このようなものをある特定のページ内で使いたい場合、

1. 全体で、`window`で拾いたいイベントに、`body`のオリジナルイベントを呼び出すような形のハンドラを入れておく
2. ページ単位のところで、`body`のオリジナルイベントにハンドラをセットする

というような流れにすることができます（各ページ単位のスクリプトから`window`にイベントをセットすると、**ページを超えて残ってしまいます**）。

## ページ認識してのスクリプト実行
Turbolinksを使う上では、全JavaScriptをつないで1ファイルにしてしまうのが大前提となっています。そういうわけで、ビューごとにスクリプトを書く場合、そのビューにあるオブジェクトなどをチェックして、**正しくなければすぐに脱出する**ように書いておかないと、無関係なページで発動してしまう危険があります（とりわけ、`body`やタイプセレクタでイベントを割り当てる場合）。

## GET送信のフォームでもTurbolinks
フォームの送信はブラウザの機能ですので、なにもしないとTurbolinksが無効となってしまいます（検索機能など、GETのレスポンスが体感的に効いてくる場面もありえます）。送信すべきデータをjQueryの`serialize()`などを使って回収して、`Turbolinks.visit(url)`とすることで、JavaScriptコードからTurbolinksによる遷移を実行できます。

[^1]: サイト内にリダイレクタがある場合、そのリダイレクト先が外部サイトであってもデータを拾ってくることがあります。特に、オープンリダイレクタを作ってしまっていた場合や、完全なる第三者のサイトにリダイレクトする場合には、XSS攻撃の危険が生じることもあります。
[^2]: 単なる即時実行ですので、別に関数に入れずに書いても構いません。
bublcam, theta, SP360　同時に撮影してみた

bublcam, Ricoh theta, Kodak SP360, 3つの360度カメラを比較しました。
3つのカメラを横に並べて、同時に撮影してます。


bublcam
https://store.hacosco.com/movies/a55ff51d-9c4c-4264-bedd-4e4256041d55

theta
https://store.hacosco.com/movies/72461dd7-7ad3-4622-a792-1602d7ae62a8

SP360
https://store.hacosco.com/movies/c5aa08fe-842b-420d-b247-815aa30dbb4c


bublcamはデカいし4つもカメラがあるので、近接（1メートル以内）だとスティッチが全くうまくいきません。30fps出るのはあり難いですが、フレーム落ちしているような（動画ファイルのプロパティ見てみたら、23フレームしかなかった）。

thetaは薄型でカメラ2つなので、スティッチはきれいですが、fpsが15までですし、画面のアラも目立ちますね。

SP360は魚眼レンズ1つなのでスティッチは不要。安定して30fpsで撮影可能なのも強みですが、半球の撮影のみです。

うーん、どれも一長一短ありますね。私はカメラの素人なので、皆様のご意見をいただければ嬉しいです！
Azure AD ディレクトリにOffice 365試用版を割り当てる

Azure ADディレクトリに対しOffice 365を割り当てる際の手順になります。

# Azure AD ディレクトリの作成
1. まずは新しいAzure ADを作成します。
![CreateAAD_1.png](https://qiita-image-store.s3.amazonaws.com/0/41379/46f80f7b-3e3c-5c81-c76c-ee2d6e8af486.png)

2. 全体管理者ユーザーを追加します。
![CreateAAD_2.png](https://qiita-image-store.s3.amazonaws.com/0/41379/06744d6e-5ddf-6afc-43b6-6d03292d649f.png)
![CreateAAD_3.png](https://qiita-image-store.s3.amazonaws.com/0/41379/f30a14de-e8d9-5c41-3fa9-923bae47cf60.png)
![CreateAAD_4.png](https://qiita-image-store.s3.amazonaws.com/0/41379/b5aca0b1-12a9-bb59-5d52-6de52e0484f1.png)

3. 一度Office 365にログインし、パスワードを再設定します。
https://login.microsoftonline.com にアクセスし、
2で設定した全体管理者ユーザでパスワードを変更しログインします。
![SnapCrab_NoName_2015-8-11_17-21-37_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/4dab3158-d877-59dd-ec10-37fcbe150e17.png)
![SnapCrab_httpsportalofficecomDefaultaspxSkipSspr=true - Internet Explorer - [InPrivate]_2015-8-11_17-26-58_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/2ab221c3-d925-5318-515f-e1773204ebcb.png)

# Office 365試用版の購入
1. Office 365管理センターメニューからサポート⇒サービスを購入するをクリックします。
![SnapCrab_NoName_2015-8-11_17-30-15_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/b6ea2b17-5285-6a4c-b70f-8fe7f340b3dd.png)

2. 試したいOffice 365プランを選択します。
今回はOffice 365 Enterprise E3の無料試用版を選択します。
![SnapCrab_NoName_2015-8-11_17-34-1_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/19605600-a5b4-fd78-e774-58279c57229b.png)
![SnapCrab_NoName_2015-8-11_17-34-45_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/f4dbc669-12f5-74e8-0c3b-1c8a68ca2ec8.png)

# 購入したライセンスをユーザに割り当て
1. Office 365管理センターメニューからユーザー⇒アクティブなユーザーをクリックします。
2. 割り当てたいユーザーを選択し、割り当て済みのライセンスにある編集リンクをクリックします。
![SnapCrab_NoName_2015-8-11_17-41-59_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/dd2b9863-ae7d-c0bf-8e76-c4c6b51e36af.png)
3. 購入したライセンスを選択し、保存をクリックします。
![SnapCrab_NoName_2015-8-11_17-43-22_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/d686b9e0-a627-94a8-ca07-f6040591aa01.png)
4. 割り当て済みのライセンスに購入したライセンスが表示されていることを確認します。
![SnapCrab_NoName_2015-8-11_17-45-3_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/41379/b02e2726-f281-235e-8d86-03df7f9a0048.png)

以上の手順でOutlookやSharePoint Onlineなどを試すことができます。

# 作成したAzure AD ディレクトリの削除
管理ポータルからでは削除ができないので、以下のURLを参考にPowerShellを使って削除してください。
http://level69.net/archives/23377
playをeclipseでデバッグする

1.consoleからポート9999でデバッグ起動

```bash
~/scalaTest % activator -jvm-debug 9999 run
```

2.eclipseから、Debug As -> Debug Configureをこんな感じで起動する![スクリーンショット 2015-08-11 5.51.14 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20307/be179373-40ad-6e06-0991-0fef127bc9a5.png)
count, length, sizeメソッドの違いと特徴を比較

配列の要素数を返り値にもつメソッドは幾つかありますが、違いってなんでしょうか？使い分けはどのようにしたらいいのでしょうか？


# countメソッド

### 構文1

```
array.count(obj)
```

**解説**

引数objと同じ要素の数を返します。引数を省略した場合は単に、配列の要素数を返します。

**例**

```rb:sample.rb
ary = [2, 4, 5, 9, 2, 2, 4, 1]
# 配列内の整数 2 の数を表示
ary.count(2)
=> 3
# 配列内の整数 3 の数を表示
ary.count(3)
=> 0
# 配列内の要素数を表示
ary.count
=> 8
```


### 構文2

```
array.count do |変数|
  処理
end
```

**解説**

1. 配列内の要素を一つ取り出す
2. `| |`内の変数に代入する
3. `処理`を行う
4. 手順2と3を配列の要素がなくなるまで繰り返す
5. 手順3で行った処理の返り値が真になった回数を最終的に返す

**例**

```rb:sample.rb
ary = [1,2,3,4,5]
ary.count do |num|
  num % 2 == 0 # 各要素が２で割り切れたら、つまり偶数なら「真」を返す
end
=> 2 # 偶数の数を返す
```


# lengthメソッド, sizeメソッド

### 構文

```
array.length
array.size
```

**解説**

これらのメソッドは単に配列の要素数を返す

**例**

```rb:sample.rb
ary = [2,3,"takashi", {title: "ときかけ", genre: "青春"}, [3,4,5]]
ary.length
=> 5 # 配列aryの要素数
ary.size
=> 5 # 配列aryの要素数
```

# ハッシュにcountメソッド, sizeメソッド, lengthメソッドを使う

**例**

```rb:sample.rb
hash = {title: "ときかけ", genre: "青春"}
hash.count
=> 2
hash.size
=> 2
hash.length
=> 2
```

**解説**

これらのメソッドはハッシュにも使用することができる。
使用するハッシュの中のキーとバリューのセットの数を返す。


# まとめ

項目|count|size|length
:-:|:-:|:-:|:-:
配列/ハッシュ|◯|◯|◯
引数もつ|◯|×|×
引数ない|要素数を返す|要素数を返す|要素数を返す
引数あり|引数と一致する要素の数える|×|×
ブロックもつ|◯|×|×
ブロックあり|ブロック内の処理の返り値が真のものを数える|×|×
OS Clone with EaseUS Todo Backup  


> 複数PC（同じスペック）に同様な開発環境を展開する際に、時間短縮する為クローンツールを使用。
> ツールを使って、クローンしたいOSディスクのGost HDDを作成して、ターゲットPCにクローンする。

# 必要なもの
ソフト：[ EaseUS Todo Backup free ](http://jp.easeus.com/backup-software/free.html)
ハード：ハードディスク（Gost HDD）
> SYSTEM所有するディスク（Cドライブ）と**同じ容量かそれ以上の容量**は必要

# Gost HDD 作成
ソースPC（開発環境完備　）にソフトをインストールし、クローンしたいHDD（Source HDD）から、Gost HDD を作成する。

![eraseus.png](https://qiita-image-store.s3.amazonaws.com/0/26321/d2f71f4f-b083-4791-c014-81cfac34c888.png)

![eraseus2.png](https://qiita-image-store.s3.amazonaws.com/0/26321/bdeae236-7111-888b-d1e6-78d3406f3728.png)

![eraseus3.png](https://qiita-image-store.s3.amazonaws.com/0/26321/3c5c1ca9-9160-4023-1784-a6fee710ab01.png)

![eraseus4.png](https://qiita-image-store.s3.amazonaws.com/0/26321/6cfd2e81-18a1-2b51-5f99-2b16479f6c92.png)

# Target HDD にクローン
ターゲットPCにをインストールし、Gost HDD を　Target HDD（Cドライブ）にクローンする

![eraseus.png](https://qiita-image-store.s3.amazonaws.com/0/26321/d2f71f4f-b083-4791-c014-81cfac34c888.png)

![eraseus5.png](https://qiita-image-store.s3.amazonaws.com/0/26321/94a3d68f-1df9-3a05-517e-80194544bdf2.png)

![eraseus6.png](https://qiita-image-store.s3.amazonaws.com/0/26321/21479ff6-be33-1fcf-781d-ff02ab6c9dbd.png)

![eraseus7.png](https://qiita-image-store.s3.amazonaws.com/0/26321/8e180ef2-dca9-abd8-0cba-ff7babff6026.png)

ソフト指示に従って、PCを再起動する。
その後、HDDのクローンが始まる。
クローンが終わったところ、PC再起動し、Windowsに入るはずですが。。。

>OSが起動できないエラーが発生する

これは、ソースPCのOSがそのままターゲットPCに使えないようです。別途、Windows　Install　CDを入れて、OSの修復作業を行えば、解決できる。

# PC設定
* PC名変更
* ライセンスKEY更新

以上。
Reactjsで改行コードをbrに変換する

# 方法1: reactjsのdangerouslySetInnerHTMLを使う方法

参考: https://facebook.github.io/react/docs/jsx-gotchas.html


~~~coffee
# sample.js.jsx.coffee:

# 改行コードをBRタグに変換
nl2br: (str) ->
  str.replace(/[\n\r]/g, "<br />")

render: ->
  ...
  <dd dangerouslySetInnerHTML={{__html: nl2br(this.state.report.description)}}></dd>
  ...
~~~

# 方法2: 改行をsplitしてjsxの配列を作成する方法

~~~coffee
# sample.js.jsx.coffee:

# 改行コードをBRタグに変換したJSXを返す
nl2brJsx: (str) ->
  lines = []
  for line in str.split("\n")
    lines.push(`<div>{line}<br/></div>`)
  lines

render: ->
  ...
  <dd>{Utils.nl2brJsx(this.state.report.description)}</dd>
  ...
~~~
[LibreOffice][Calc] 条件付き書式でテキストを使うときの注意

Mac版の4.4.5.2で確認。

# 設定

[書式]-[条件付き書式]-[条件…]から設定。

![条件書式1.png](https://qiita-image-store.s3.amazonaws.com/0/18828/be7761f8-4363-03ea-1432-43e43ef7480f.png)

こんな感じで、「赤」なら赤い背景、「緑」なら緑の背景、「青」なら青い背景にしてみる。

# 設定完了

OKを押す。

![条件書式2.png](https://qiita-image-store.s3.amazonaws.com/0/18828/14e04498-3d9b-bb2e-79f8-dfb5e92274a6.png)

...?!

# 修正

[書式]-[条件付き書式]-[管理…]から、今作った書式を選んで編集してみると、

![条件書式6.png](https://qiita-image-store.s3.amazonaws.com/0/18828/0777f324-18ab-2983-02e6-ae17fe9a0dcf.png)

勝手にシングルクォーテーションが付いているので、これをダブルクォーテーションに変更する。


![条件書式7.png](https://qiita-image-store.s3.amazonaws.com/0/18828/1803690a-9e27-dc7d-467b-423d1e15cc94.png)

# 完成

![条件書式5.png](https://qiita-image-store.s3.amazonaws.com/0/18828/3f18e71c-d489-3282-36d7-838514575c43.png)
mod_rewrite での shebang(#!) URL対応

## やりたいこと
- /foo/bar#!test1 ⇒ /foo/bar#!test2 のようなリダイレクトをしたい

## shebang(#!) ってなに？
- http://gihyo.jp/dev/clip/01/orangenews/vol62/0005
- http://ohsexybaby.com/web/843/

hash(#)、bang(!)でshebang（シバン）というもの。
　hash = フラグメント、Ajax対応
　bang = googlebotでのクロール対応
という感じですかね。

## mod_rewrite設定

shebang 以下は # でフラグメントとなるため、 apache の REQUEST_URI 変数には `/foo/bar` しか入ってこない。shebang での条件判定は実現不可なようす・・・

```apache
RewriteRule ^/foo/bar#!test1$ /foo/bar#!test2 [R]  # shebangでの条件判定はできない
RewriteRule ^/foo/bar$ /foo/bar#!test2 [R,NE]      # NEでエスケープさせないようにして転送は可能
```
activator eclipse で [error] Not a valid command: eclipse (similar: help, alias) の時の対処法

#playコンソールでeclipseしようとするとエラーでた

```bash
[scalaTest] $ eclipse
[error] Not a valid command: eclipse (similar: help, alias)
[error] Not a valid project ID: eclipse
[error] Expected ':' (if selecting a configuration)
[error] Not a valid key: eclipse (similar: deliver, licenses, clean)
[error] eclipse
[error]        ^
```

#対処
project/plugins.sbtの最終行にaddSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.5.0")を追記

```bash
vim project/plugins.sbt
##略##
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.5.0")
```

これで解決。
DNSサーバのチューニング　其の一

#再帰問い合わせ
##ホストの制限
* 接続許可するIPを記述(問い合わせの制限ではなく、再帰的問い合わせの制限)

_allow-recursion_(optionsステートメントでのみ定義有効)

```named.conf
options{
allow-recursion { localhost; localnets; ***.***.***.***/16; ***.***.***.***; };
};
```
* ACLで管理

ホストを増減させる際、ACLだけの編集で済む。

```named.conf
acl     "hosts" { localhost; localnets; ***.***.***.***/16; ***.***.***.***; };
options{
allow-recursion { hosts; };
};
```

* 再帰問い合わせ禁止

_recursion_

```named.conf
options{
recursion { none; };
};
```

#問い合わせ禁止

* 問い合わせ可能なホストを制限

options,zoneステートメントそれぞれに定義が可能
_allow-query_

```named.conf
options{
allow-query { ***.***.***.***; ACL; };
};
```

* 任意のホストからの接続拒否

_blackhole_

```named.conf
options{
blackhole { ***.***.***.***; ACL; };
};
```

#ゾーン転送
_allow-transfer_
全ゾーン情報を公開するのはリスクが大きいので、スレーブサーバ等に限定的にするのが効果的かも。
options,zoneステートメントそれぞれに定義が可能
`allow-transfer { ***.***.***.***; ACL; };`


#DNSラウンドロビン
複数台のWebサーバにデータを割り振って、負荷分散を実現する。
**負荷分散であって、冗長構成ではない。**

```/var/named/****.zone
example.com.  1M IN A ***.***.***.1
example.com.  1M IN A ***.***.***.2
example.com.  1M IN A ***.***.***.3
example.com.  1M IN A ***.***.***.4
example.com.  1M IN A ***.***.***.5
```

#バージョンを隠す
あえて公開する必要のない情報の為、隠す。

```
# dig @127.0.0.1 chaos version.bind txt
;; ANSWER SECTION:
version.bind.           0       CH      TXT     "9.8.2rc1-RedHat-9.8.2-0.30.rc1.38.amzn1"
```

```named.conf
options{
        version "\(^o^)/";
};
```

```
# dig @127.0.0.1 chaos version.bind txt
;; ANSWER SECTION:
version.bind.           0       CH      TXT     "\\(^o^)/"
```
ggplot2で積み重ね棒グラフに値を表示させたい

**2016/04/12追記: ggplot2 v2.1.0に対応するため、一部コードを修正しました**

> 本記事は [ggplot2逆引き](http://qiita.com/tags/ggplot2%E9%80%86%E5%BC%95%E3%81%8D/items) プロジェクトの一環として、Stack Oveflow の下記記事を翻訳したものです。  
> [r - Showing data values on stacked bar chart in ggplot2 - Stack Overflow](http://stackoverflow.com/questions/6644997/showing-data-values-on-stacked-bar-chart-in-ggplot2)

## Q
ggplot2で積み重ね棒グラフに値を重ねて表示したいです。私が試したのは以下のコードです:

**2016/04/12追記: ggplot2 v2.1.0で`qplot()`の仕様が変更されているようでしたので、`ggplot()`で描くように修正しました**


```r
Year      <- c(rep(c("2006-07", "2007-08", "2008-09", "2009-10"), each = 4))
Category  <- c(rep(c("A", "B", "C", "D"), times = 4))
Frequency <- c(168, 259, 226, 340, 216, 431, 319, 368, 423, 645, 234, 685, 166, 467, 274, 251)
Data      <- data.frame(Year, Category, Frequency)
library(ggplot2)
p <- ggplot(Data, aes(Year, Frequency, fill = Category)) +
  geom_bar(stat = "identity") +
  theme_bw()
p + geom_text(aes(label = Frequency), size = 3, hjust = 0.5, vjust = 3, position = "stack") 
```

![NG.example.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/227f06f4-cc86-815d-772d-4be02a8f99ff.png)

でもこのデータの値を、各部位の中央に配置したいのです。お願いします。

## A
一つのやり方として、各バーのミッドポイントを算出するというのがあります:

```r:OK_example1.R
library(ggplot2)

# calculate midpoints of bars (simplified using comment by @DWin)
Data <- ddply(Data, .(Year), transform, pos = cumsum(Frequency) - (0.5 * Frequency))

# plot bars and add text
p <- ggplot(Data, aes(x = Year, y = Frequency)) +
     geom_bar(aes(fill = Category), stat="identity") +
     geom_text(aes(label = Frequency, y = pos), size = 3)
```

![OK_example1a.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/e50588b9-2ef0-f3ab-51f3-bcfc3d47fb21.png)

データフレームにあらかじめ値を配置する高さ(y値)を算出して変数として追加し、`geom_text(aes(label = Frequency, y = pos))`とその変数を指定すれば、そのラベルは算出した位置に配置されます。


## 補足
上記のAの方法は、データフレームに新たに変数を追加することとなります。それを避けて(だいたい)真ん中にくるようになればいい、というのであれば、以下のようなコードでも可能です:

```r:vjust1.R
p <- ggplot(Data, aes(x = Year, y = Frequency)) +
  geom_bar(aes(fill = Category), stat="identity") +
  geom_text(aes(label = Frequency), size = 3, position = "stack", vjust = Frequency/75)
p
```

![vjust1a.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/8531e988-bbec-d373-cdcb-dcb4f3624c5b.png)

これは、`geom-text`の`vjust`に対して設定を加えています。このようにy値の変数を定数で補正したものを`vjust = `に投げると、割合的にずれてくれるようになります。

ただこの方法ですと、その補正する定数をどう設定したらど真ん中にくるか、はっきりとはわかりません。詳しくは[RPubs - vjustのテスト](https://rpubs.com/kazutan/vjust_test)をご覧ください。

また、この記事の元となっているStackOverflowの記事には、Hadley Wickham氏による以下のコメントがあったことも付記します:

>  Please don't. It's not a good idea to try and improve a confusing visualisation by adding text labels. Either make a table or use a better display of the data. –  hadley Jul 12 '11 at 1:10 

## 参考
- [r - Showing data values on stacked bar chart in ggplot2 - Stack Overflow](http://stackoverflow.com/questions/6644997/showing-data-values-on-stacked-bar-chart-in-ggplot2)
- [RPubs - vjustのテスト](https://rpubs.com/kazutan/vjust_test)
- [ggplot2逆引き - ggplot2 で geom_text() を使って集合棒グラフにラベルを付けたい #rstatsj - Qiita](http://qiita.com/hoxo_m/items/267ce2ab0acc319599ff)
Railsでkaminari+jQueryで無限スクロール

AJAXでの@contentsのページングは適宜行ってください。

```lang:js
$(window).scroll( function() {
     var pager = $("#read_more");
     var scrollBottom = $(window).scrollTop() + $(window).height();
     if( scrollBottom > pager.offset().top ) {
           if(!$("#read_more").hasClass("displayed")){
               $("#read_more").addClass("displayed");
               $('#read_more').trigger("click");
           }
     }
});
```

```lang:html
<div id="content_area">
  <% @contents.each do |content| %>
    <%= content.title %>
    <%= content.body %>
  <% end %>
</div>
<%= link_to_next_page '@contents', 'もっと見る', id: 'read_mores', remote: true %>
```
Dart で Torrentクライアントを作ろう(10+?) Dart で Mainline DHT を Codingしてみよう (3) FindNodeでネットワークを構築する

# FindNodeでネットワークを構築する
<hr>
* **FindNodeクエリでネットワークを構築する**
<br>
* **リスポンスを受けたらRootingTableを更新する**
<br>
<hr>

前章で、kBucketとRootingTableについては説明しました。このRootinhTableを更新しながら、実際にDHTのネットワークを組んでみましょう。


## FindNodeクエリでネットワークを構築する
Mainline DHT こと、KademliaではUDPを利用してPeerどうしが通信を行います。

DHRのネットワークを構築は、FindNodeクエリとFindNodeレスポンスのみで実現しています。

本章では、FindNodeクエリについて解説していきます。


### 指定したKIDに近い距離にあるPeerを紹介してもらう事ができる

FindNodeクエリを利用すると事で、指定したKIDともっとも距離が近いNodeを教えてもらう事ができます。

以下のようなBencodeで表現できます。

```
arguments:  
{
 "t":"aa",
 "y":"q",
 "q":"find_node", 
 "a":{
  "id" : "<nodes id>", 
  "target" : "<id of target node>"
 }
}

response: 
{
 "t":"aa",
 "y":"r",
 "r":{
  "id" : "<nodes id>",
  "nodes" : "<compact node info>"
 }
}
```

"t" は送信側が任意に決める事ができる値です。レスポンスには、送信時に指定した値が渡されます。この値を元にどのクエリのレスポンスかを判断する事がてきます。

"id"には、クエリを送信するPeerのKIDがして入ります。
"target"に指定したKIDと距離が近いPeerが帰りまする
"nodes" は、26byteのbyteデータの集まりで、20byteのPeer IDとIPとPort番号が格納されています。


### ネッワークへの参加/構築
ネットワークの構築はFindNodeクエリを利用します。我々は、自分に近いKIDを持つPeerについて詳しくなる必要があるのでした。


"id" に自分自身のPeer ID を指定して、 Node の一覧を取得します。 Rooting Table の中の上位 K個について、 FindNode を行います。この上位K個が固定されまで、 FindNod eを繰り返します。


なんども、この操作を繰り返しているうちに、DHT上でもっとも自分自身に近いPeerを発見できまます。

実際に1000こPeerを生成して、試してみると以下の分布を得ることがてきます。 Kは8としました。

<table>
<tr>
<td>Rooting Table index</td>
<td>Peerの数</td>
<td>コメント</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>自分自身です</td>
</tr>
<tr>
<td>147</td>
<td>1</td>
<td>..</td>
</tr>
<tr>
<td>154</td>
<td>1</td>
<td>..</td>
</tr>
<tr>
<td>155</td>
<td>4</td>
<td>..</td>
</tr>
<tr>
<td>156</td>
<td>4</td>
<td>..</td>
</tr>
<tr>
<td>157</td>
<td>6</td>
<td>..</td>
</tr>
<tr>
<td>158</td>
<td>8</td>
<td>..</td>
</tr>
<tr>
<td>159</td>
<td>8</td>
<td>..</td>
</tr>
<tr>
<td>160</td>
<td>8</td>
<td>..</td>
</tr>
</table>

TorrentのDHTネットワークに接続した場合も同じような結果になります。自分自身に近いNodeは、Rooting Tabe index の、l130-150くらいのところに集まります。

![circleA.jpg](https://qiita-image-store.s3.amazonaws.com/0/54192/0f97bbda-a25f-a8dc-77e3-21352c780a81.jpeg)


147というのは、かなり近くにあるPeerだとわかります。

# 次回、次次回について
次回、実際にFindNodeを実装します。

# Ref
- http://www.bittorrent.org/beps/bep_0005.html
- http://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf

# PS

Qiitaに投稿した、Torrentのチュートリアルと、この文章は、gitbookの方でメンテナンスしていきます。もう少し詳しく知りたい方はこちらを参照してください。

- GitBook なぜなにTorrent
https://nazenani-torrent.firefirestyle.net

Dart用の作成したTorrent Libraryは以下で公開しています。
- https://github.com/kyorohiro/dart_hetimatorrent
- https://github.com/kyorohiro/dart_hetimatorrent/tree/master/example/TorrentDHT

-------
Kyorohiro work

http://kyorohiro.strikingly.com
Ansible のタスクで Oracle JDK をダウンロードする

uri モジュールの HEADER_Cookie を使います。

```yaml:vars/main.yml
---
jdk_version: 7u55
jdk_build_versions:
  7u55: b13

jdk_build_version: "{{jdk_build_versions[jdk_version]}}"
jdk_rpm_url: http://download.oracle.com/otn-pub/java/jdk/{{jdk_version}}-{{jdk_build_version}}/jdk-{{jdk_version}}-linux-x64.rpm
jdk_rpm_path: "jdk-{{jdk_version}}-linux-x64.rpm"
```

```yaml:tasks/main.yml
---
- name: Download JDK
  uri:
    HEADER_Cookie="oraclelicense=a"
    dest={{jdk_rpm_path}}
    follow_redirects=all
    method=GET
    url={{jdk_rpm_url}}
```

参考
---

* http://docs.ansible.com/ansible/uri_module.html
物理サーバのディスク障害を検知した時にやってること

# これは何？

社外でもオンプレでもクラウドな時代に必要かどうかはともかく、ハードウェアベンダーなどが提供してくれているRAID周りのオペレーションに使えるユーティリティと、ユースケースのメモです。
RAIDを構築することはほとんど無いので、障害時の現状確認関連ちょこっとだけやね。

# よくあるケース

1. ディスク故障を検知
2. ユーティリティでRAIDを構成する物理ディスクの状態を確認⇨故障機器を特定
3. 問題なければ壊れたディスクをオフラインにする
4. 壊れたディスクのLEDを点灯させて、ディスク交換
5. RAIDの仮想ディスクがRebuildされるのを眺める
6. エラーが消えたら対応完了。

# omreport (Dell)

http://cavepopo.hd.free.fr/wordpress/linux/dell-server-utility-omreport/

## RAIDの状態を確認する

RAID Levelとかを確認するのに便利。

```
$ omreport omreport storage vdisk

List of Virtual Disks in the System

Controller PERC 6/i Integrated (Embedded)
ID                       : 0
Status                   : Non-Critical
Name                     : Virtual Disk 0
State                    : Degraded
HotSpare Policy violated : Not Assigned
Progress                 : Not Applicable
Layout                   : RAID-10
Size                     : 272.25 GB (292326211584 bytes)
Device Name              : /dev/sda
Bus Protocol             : SAS
Media                    : HDD
Read Policy              : No Read Ahead
Write Policy             : Write Through
Cache Policy             : Not Applicable
Stripe Element Size      : 64 KB
Disk Cache Policy        : Disabled

```

## RAIDを構成するディスクの状態を確認する

何か検知した際はまずStateを確認するところから始める。

```
$ omreport storage adisk controller=0|grep State
State                     : Online
(snip)
State                     : Failed
```

```
$ omreport storage adisk controller=0

Controller PERC 6/i Integrated (Embedded)

ID                        : 0:0:X
Status                    : Ok
Name                      : Physical Disk 0:0:X
State                     : Online
Failure Predicted         : No
Progress                  : Not Applicable
Bus Protocol              : SAS
Media                     : HDD
Capacity                  : 136.13 GB (146163105792 bytes)
Used RAID Disk Space      : 136.13 GB (146163105792 bytes)
Available RAID Disk Space : 0.00 GB (0 bytes)
Hot Spare                 : No
Vendor ID                 : DELL(tm)
Product ID                : XXXXXXXXXX
Revision                  : XXXX
Serial No.                : XXXXXXXXXXX
Negotiated Speed          : Not Available
Capable Speed             : Not Available
Manufacture Day           : XX
Manufacture Week          : XX
Manufacture Year          : XX
SAS Address               : XX

```

# MegaCLI 

こちらのBLOGにきれいにまとまっておりました。
http://d.hatena.ne.jp/mtkys+tech-memo/20121215/1355591665
UITableViewでcellとcellの間を空ける方法

1つのセクションに1セルとして、空白なヘッダービューとフッタービューでスペーシングすればいい

```swift:TableViewDelegateImpl.swift
class TableViewDelegateImpl : NSObject, UITableViewDelegate {
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 44 // 適当なセルの高さ
    }
    func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 5 // セルの上部のスペース
    }
    func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 5 // セルの下部のスペース
    }
    func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        view.tintColor = UIColor.clearColor() // 透明にすることでスペースとする
    }
    func tableView(tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) {
        view.tintColor = UIColor.clearColor() // 透明にすることでスペースとする
    }
}
```
```swift:TableViewDataSourceImpl.swift
class TableViewDataSourceImpl : NSObject, UITableViewDataSource {
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1 // 普通はここで表示したいセルの数を返すが、セクションのヘッダーとフッターでスペーシングしているので、固定で1を返す
    }
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return count // 表示したいセルの数
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        return cell // 表示したいセル
    }
}
```
HSPでシダを描画する

少し流行に乗り遅れた感がありますが，HSPでシダを描画したので載せます．

![sida.png](https://qiita-image-store.s3.amazonaws.com/0/43622/6184db9d-589d-309b-7bed-2de3c7d71041.png)


### 元ネタ
[「プログラムでシダを描画する」一覧](http://qiita.com/qt-luigi/items/b22204c7ef73260324bd)

### ソースコード
tytyさんによる[「再帰モジュール」](http://dev.onionsoft.net/seed/info.ax?id=896)が別途必要です．
ダウンロードし，m_rec.hspファイルを同じディレクトリに配置してください．

Nの値を調節すると，いい具合の時間で終わります．

```sida.hsp

#include "hsp3dish.as"
#include "m_rec.hsp"

rec_init 100000

#module

#defcfunc W1x double px, double py
return 0.836 * px + 0.044 * py

#defcfunc W1y double px, double py
return -0.044 * px + 0.836 * py + 0.169

#defcfunc W2x double px, double py
return -0.141 * px + 0.302 * py

#defcfunc W2y double px, double py
return 0.302 * px + 0.141 * py + 0.127

#defcfunc W3x double px, double py
return 0.141 * px - 0.302 * py

#defcfunc W3y double px, double py
return 0.302 * px + 0.141 * py + 0.169

#defcfunc W4x double px, double py
return 0.0

#defcfunc W4y double px, double py
return 0.175337 * py

#global

#const N 20

	screen 0, 640, 480

*main

	// 画面の書き換えを止める
	redraw 0

	color 255, 255, 255
	boxf
	
	pos 10, 10
	color 0, 0, 0
	mes "Drawing..."
	
	k = N
	x = 0.0
	y = 0.0

	rec_begin k, x, y
	
		if (0 < k) {
			rec_call k-1, W1x(x, y), W1y(x, y)
			
			if (rnd(3) == 0) :rec_call k-1, W2x(x, y), W2y(x, y)
			if (rnd(3) == 0) :rec_call k-1, W3x(x, y), W3y(x, y)
			if (rnd(3) == 0) :rec_call k-1, W4x(x, y), W4y(x, y)
		} else {
			color 0, 255, 0
			dx = int(x*ginfo_winx) + ginfo_winx/2
			dy = ginfo_winy - int(y*ginfo_winy)
			boxf dx, dy, dx+1, dy+1
		}
	rec_end

	color 255, 255, 255
	boxf 0, 0, 100, 100
	pos 10, 10
	color 0, 0, 0: mes "Finished"

	// 画面の書き換えを反映
	redraw 1

```
Ember Data 1.13のfind系の処理(主にキャッシュ)について

# 動作させた環境
* ember 1.13.3
* ember data 1.13.5
* ember cli 1.13.1

# 確認したいこと

ember data 1.13では、store の検索系の関数が統一されていますが、主にキャッシュの処理について実際に動かして確認しました。

## store の検索系の関数について

* findAll / findRecord
    * サーバもしくはstoreの保持データのどちらかを取得します。
* peekAll / peekRecord
    * storeの保持データを取得します。
* query / queryRecord
    * サーバから検索します。

上記のように、サーバから取得するか、キャッシュされているデータを取得するかの両方あり得るのは`findAll` / `findRecord` のどちらかのみなので、それらの動作について確認します。

# ソースコード

確認に使用したソースコードは、次のリポジトリにあります。
https://github.com/t-mimura/sample-ember-1-13-store-find

# 確認結果

## 前提
`adapter`の次の項目については、基本的には`false`を返すように定義しています。
（確認によっては`true`になるように制御しています。）

* [shouldReloadAll](http://emberjs.com/api/data/classes/DS.Adapter.html#method_shouldReloadAll)
* [shouldBackgroundReloadAll](http://emberjs.com/api/data/classes/DS.Adapter.html#method_shouldBackgroundReloadAll)
* [shouldReloadRecord](http://emberjs.com/api/data/classes/DS.Adapter.html#method_shouldReloadRecord)
* [shouldBackgroundReloadRecord](http://emberjs.com/api/data/classes/DS.Adapter.html#method_shouldBackgroundReloadRecord)

## どうなったか

### `reload` に `false` を設定した場合

`findAll` については常に`store`に保持されているデータを取得します。
`findRecord`については`store`に該当のレコードが保持されていなければ、最初の一家についてはサーバへ問い合わせを行います。それ以外は`store`の保持データを使います。

### `reload` に `true` を設定した場合

`findAll` / `findRecord` ともにサーバ問い合わせを行いデータ取得を行います。
`route`の model hookで利用した場合は、データ取得が解決してから画面遷移が完了します。

### `backgroundReload` の場合

[ここ](http://emberjs.com/blog/2015/06/18/ember-data-1-13-released.html#toc_better-caching-defaults-for-code-findall-code-and-code-findrecord-code)の記述を見ると`backgroundRelaod`というオプションが使えそうですが、[ソースコード](https://github.com/emberjs/data/blob/v1.13.8/packages/ember-data/lib/system/store.js#L1209-L1229)（少なくとも1.13.8）を確認するかぎりでは、そのようなオプションは利用されていない様子でしたので、`adapter` の `shouldBackgroundReloadAll` および `shouldBackgroundReloadRecord` を `true` にすることで確認をしました。

`route` の model hook で利用している場合、
backgroundReload は、サーバ問い合わせを行うものの、その戻りを待たずに画面遷移を行う。その時点では `store` にキャッシュされているデータを利用し、サーバ問い合わせの結果が戻りしだい、model （= data-bind されている画面）に反映する動きとなる。

# まとめ
ember 2.0系では、`backgroundReload`のデフォルト値が`true`になると言うことのようですし、`reload`の設定と併せて、余計なサーバ問い合わせを少なくして画面遷移をスムーズにしなさいと言う天の声なのかなと思っています。
（まあその通りなのですが）
楽しいRuby　第3章をおこなう前に。


add column

nilとは？？

nilはオブジェクトが存在しないことをあわらす特別な値です。
正規表現によりマッチングの祭ににはどこにもマッチングしなかったことを表す場合のように、メソッドが意味のある値を返すことができないときにnilが返されます。
また、配列やハッシュからデータを取りだす場合に、まだ存在していないインデックスや、キーを指定するとnilが得られます。

```
2.0.0-p643 :001 > hash = {"A" => 1, "B" => 2}
 => {"A"=>1, "B"=>2} 
2.0.0-p643 :002 > hash["C"]
 => nil 
2.0.0-p643 :003 > hash = {a: 1, b: 2}
 => {:a=>1, :b=>2} 
2.0.0-p643 :004 > hash[a]
NameError: undefined local variable or method `a' for main:Object
	from (irb):4
	from /Users/tomokitakahashi/.rvm/rubies/ruby-2.0.0-p643/bin/irb:12:in `<main>'
2.0.0-p643 :005 > hash["a"]
 => nil 
2.0.0-p643 :006 > hash[:a]
 => 1 
2.0.0-p643 :007 > ハッシュの取り出しかた間違えた。
```


```
#正規表現を学習しています。


names = ["小林", "林", "高野", "森岡"]
names.each do |name|
   if /林/ =~ name
     puts name
   end
end

# 小林　林　


#正規表現のおさらいだお＾＾

names = ["ruby", "Ruby", "rUby", "ruBy", "rubY"]
names.each do |name|
  if /ruby/ =~ name
    puts name
  end
end

#特定の文字列パターンである/ruby/のマッチングする文字列はnamesの配列の中には
#"ruby"しか存在しない。

names = ["ruby", "Ruby", "rUby", "ruBy", "rubY","rubyruby"]
names.each do |name|
  if /ruby/ =~ name
    puts name
  end
end

#特定の文字列パターンである/ruby/のマッチングする文字列は
#namesの配列には"ruby"と "rubyruby"しか格納されていない。


names = ["ruby", "Ruby", "rUby", "ruBy", "rubY"]
names.each do |name|
  if /ruby/i =~ name
    puts name
  end
end

#正規表現の「/」に続けて、「i」と書いた場合は大文字、小文字を区別せずに
#マッチングを行います。



```
jquery-MustacheというJS Template Enginを使ってみました

jquery-Mustacheというjs template enginを使ってみました。

```html
<!-- include js -->
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js"></script>
<script src="https://raw.github.com/jonnyreeves/jquery-Mustache/master/jquery.mustache.js"></script>
<script src="https://raw.github.com/janl/mustache.js/master/mustache.js"></script>

<!-- Templates in the DOM -->
<script type="text/html" id="dom-template-a">
    <p>Hello, {{name}}, did you know you can load templates direct from the DOM?</p>
</script>

<script type="text/javascript">
// Add all templates found in the DOM
$.Mustache.addFromDom();
// Render out one of the templates.
$("body").mustache('dom-template-a', { name: 'World' });
</script>

```

という感じです。
C#で画像をDBに保存するAPI

# 前提
HTMLのmultipart/form-dataで送られてきた画像について処理をする.NET APIを作る。
DB周りはEntityFrameworkを利用
DBの画像バイナリを保存する列の型はvarbinary(max)を想定

# 画像をDBにinsertする場合
下記のように定義したメソッドを利用すればOK

```csharp
public void insertToDB()
{
  Entities DB = new Entities();
  MemoryStream memory;
  var postedFiles = HttpContext.Current.Request.Files;
  foreach (string file in postedFiles)
  {
    using (memory = new MemoryStream())
    {
      postedFiles[file].InputStream.CopyTo(memory);
      DB.tImages.Add(new tImages { bImage= memory.ToArray() });
    }
  }

  DB.SaveChanges();
}
```

# 画像をDBから取得する場合

ApiControllerで下記のGetメソッドを定義してやれば画像がURLベースで利用できる

```csharp
public HttpResponseMessage Get(int id)
{
  Entities DB = new Entities();
  HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);

  result.Content = new StreamContent(new MemoryStream(DB.tImages
        .Where(img => img.id== id)
        .Select(img=> img.bImage)
        .First()));
  return result;
}
```

わりかし簡単