OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby | Gviz で Reveal.js を利用したスライドサーバーの開発・運用構成図を作成する

# Ruby | Gviz で Reveal.js を利用したスライドサーバーの開発・運用構成図を作成する
## 概要
Gviz で Reveal.js を利用したスライドサーバーの開発・運用構成図を作成します。

## コード

~~~ruby
require "gviz"

Graph do
  global layout:'dot', overlap:false
  nodes fontname:'MS UI GOTHIC', fontsize:20
  server_nodes = {width: 3, height: 2, shape: :none, fontsize:40, label: ''}
  edges fontsize: 20

  node :User3, {image: "./actor.jpg", label: 'creator'}.merge(server_nodes)
  node :Kandan, {image: "./kandan.png"}.merge(server_nodes)
  node :Hubot, {image: "./hubot.jpg"}.merge(server_nodes)
  node :GitLab, {image: "./gitlab.png"}.merge(server_nodes)
  node :Browsers, {image: "./browsers.jpg"}.merge(server_nodes)
  subgraph do
    global label:'Audience'
    node :User1, server_nodes.merge({image: "./actor.jpg"})
    node :User2, server_nodes.merge({image: "./actor.jpg"})
  end
  subgraph do
    global label:'Dev_Env'
    node :revealjs
    node :yeoman, {label:'Yeoman( yo / bower / grunt )'}
    node :git
  end
  subgraph do
    global label:'Local Dev Slide Server'
    node :DevSlideServer, server_nodes.merge({image: "./slide.png"})
  end
  subgraph do
    global label:'Remote Slide Server'
    node :SlideServer, {image: "./slide.png"}.merge(server_nodes)
  end
  node :BrowsersForLocal, {image: "./browsers.jpg"}.merge(server_nodes)

  edge :Hubot_Kandan, {label: "Send slide add or update message"}
  edge :GitLab_Hubot, {label: "Notify Push Event by WebHooks"}
  edge :Hubot_SlideServer, {label: "Remote deploy"}
  edge :SlideServer_Browsers, {label: "HTTP Response"}
  edge :Browsers_SlideServer, {label: "HTTP Request"}
  edge :User1_Browsers,{label: "watch slides"}
  edge :User2_Browsers,{label: "watch slides"}
  edge :User3_yeoman, { label: "create slide" }
  edge :yeoman_DevSlideServer, { label: "auto deploy" }
  edge :User3_revealjs, { label: "use slide framework" }
  edge :DevSlideServer_BrowsersForLocal, { label: "HTTP Response" }
  edge :BrowsersForLocal_DevSlideServer, { label: "HTTP Request" }
  edge :User3_BrowsersForLocal, { label: "confirm slide" }
  edge :User3_git, { label: "commit slide repo" }
  edge :git_GitLab, { label: "push slide repo" }

  save :"slide_structures", :png
end
~~~

## 出力

![slide_structures.png](https://qiita-image-store.s3.amazonaws.com/0/43480/e3f3cac1-d050-0529-91ba-7a6517885797.png)
node-ffiメモ

# 背景

npmでもnode-ffiが0.11系にも対応したので、ffmpegに付属のlibavformatを使って、動画の撮影日を調べてようとしている。

# C言語の型の対応

- char*はstring
- ポインターはffiとは別のrefパッケージを使う
- ポインターもJavaScript側では領域の確保的な操作が必要
- NULLポインターはnullでOK


# libavformatの例

とりあえず、関数を呼ぶだけのコード

```js
var ffi = require('ffi');
var ref = require('ref');

var AVFormatContext = ref.types.void;
var AVFormatContextPtr = ref.refType(AVFormatContext);
var AVFormatContextPtrPtr = ref.refType(AVFormatContextPtr);
var stringPtr = ref.refType("string");
var AVInputFormat = ref.types.void;
var AVInputFormatPtr = ref.refType(AVInputFormat);
var AVDictionary = ref.types.void;
var AVDictionaryPtr = ref.refType(AVDictionary);
var AVDictionaryPtrPtr = ref.refType(AVDictionaryPtr);

// 共有ライブラリで使いたい関数のプロトタイプ宣言？を行う。
var libavformat = ffi.Library('libavformat', {
  "av_register_all":["void",[]],
  "avformat_open_input":["int",[AVFormatContextPtrPtr, "string", AVInputFormatPtr,AVDictionaryPtrPtr]]
});

var contextPtrPtr = ref.alloc(AVFormatContextPtrPtr);
var formatPtr = ref.alloc(AVInputFormatPtr);
var dictPtrPtr = ref.alloc(AVDictionaryPtrPtr);

libavformat.av_register_all();
libavformat.avformat_open_input(contextPtrPtr,"test.mov",null,null);
var contextHandle = contextPtrPtr.deref();
console.log(contextHandle);
```

# OSXだとセグフォ

libavformatもnodeも64ビットな環境で動かしてみたら、


```text
Segmentation fault: 11
```
Python - Find out number of groups in the regex expression


Ref:
- [1] [Stackoverflow - Find out number of capture groups in Python regular expressions](http://stackoverflow.com/questions/127055/find-out-number-of-capture-groups-in-python-regular-expressions)


```python
import re

def num_groups(regex):
    return re.compile(regex).groups

some_regex_str = 'miehaha_([A-Za-z0-9_-]+)'
print num_groups(some_regex_str)  # output: 1

```
iPhone6/iPhone6 Plusの画面対応について


iPhone6/6+ついに発表になりましたね！
Xcode6もGMになり、既存のiOSプロジェクトをiPhone6/6 Plus対応する方法が明らかになってきました。

下記の内容はXcode6 GM版で検証しています。間違いなどツッコミ大歓迎です。

## 解像度まとめ

まずは解像度まとめてみました。

|| iPhone4s | iPhone5/5s | iPhone6 | iPhone6 Plus |
|:-----------|:-----------|:-----------|:------------|:------------|
|デバイスピクセル| 640 x 960  | 640 x 1136 | 750 x 1334 | 1080 x 1920(1242　x 2208)|
|論理上のピクセル| 320 x 480 | 320 x 568 | 375 x 667 | 414 x 736 |
|ピクセル密度| 326ppi | 326ppi | 326ppi | 401ppi |
|デバイス・ピクセル比| 2.0 | 2.0 | 2.0 | 3.0 |

iOSにも画面フラグメントの時代がきました。

特にややこしくしているのが、iPhone6 Plusです。ピクセル比が3倍。

iPhone6 plusのiOSシミュレーターで画面のサイズをデバッグしてみると「414 x 736」になり、3倍すると「1242 x 2208」ですが、公称では「1080 x 1920」です。ということはピクセル比は正確には@2.46とかなのかな・・・。この辺りの仕組みがまだつかめてません。

## 既存プロジェクトの対応方法

iPhone6/6+のiOSシミュレーターで、既存のiOSプロジェクトを特に何もせずにビルド、実行すると「320 x 568」いわゆるiPhone5/5sサイズを拡大したような形で表示されます。（iPadでiPhoneアプリをx2で実行したような感じ。ただiPad⇔iPhoneほどの解像度の差は低いので、そこまで違和感は感じない。）

iPhone6/6plusの本来の解像度で実行するには、Launch ImagesもしくはLaunch Screen Fileを設定する必要があるようです。

https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

Launch Imagesで設定するなら、

![スクリーンショット 2014-09-10 20.32.31.png](https://qiita-image-store.s3.amazonaws.com/0/4593/69bbf150-cbee-ae1c-670f-f3e1210500b8.png "スクリーンショット 2014-09-10 20.32.31.png")

プロジェクトファイルの「General」タブ→「App Icons and Launch Images」→「Launch Images Source」で「LaunchImage」を指定。

![スクリーンショット 2014-09-10 20.36.34.png](https://qiita-image-store.s3.amazonaws.com/0/4593/8eed5708-11c9-1dba-ce53-77b8bb039f13.png "スクリーンショット 2014-09-10 20.36.34.png")

images.xcassetsの「LaunchImage」で「iOS8.0 and Later」をチェックすれば、「Retina HD 5.5」、「Retina HD 4.7」という項目が現れて画像が設定できます。

新規プロジェクトだと、「Launch Screen File」でxibファイルを設定するように、デフォルトでなっているようなので、起動用のxibファイルを作ったほうが、4つの起動画面を画像で用意するよりスマートかもしれません。

この対応方法、iPhone4s→iPhone5のときと同じようなイメージですね。

### 追記:
起動画面をxibファイルで作成できる、「Launch Screen File」はiOS8からの機能のため、iOS7以前はxibファイルは使われないようです。

## 画像リソースの対応

iPhone6 plus用に、3倍画像を「@3x」にして配置してあげれば、そちらを参照してくれます。ない場合は「@2x」を使ってくれるようです。

これからはiOSでも画像リソースx3になりますね。[Slicy](http://macrabbit.com/slicy/)の対応に期待。

---


さて、iOS8のアプリが申請できるようになりましたが、画面の対応をどうするかの判断をしないといけないですよね。来週末にはiPhone6/6+が世の中に出そうなので、解像度の対応が間に合わない場合はとりあえず、iOS8で動作検証して新端末は「拡大表示」で行くのが現実解かもしれません。
cygwinのパス設定

cygwinのデフォルトのパスは次の通りになっている．
> /home/ユーザ名
これは普段cドライブ直下を参照したい自分としては都合が悪いため，次のような設定をした

やることは環境変数の設定
> 変数名:HOME
> /cygdrive/c

これで設定後にcygwinを立ち上げると，カレントディレクトリが/cygdrive/cになる
The Java EE 7 Tutorialのテキトー翻訳まとめ

# 概要
[きんモザ](http://www.kinmosa.com/)の影響で英語の学習意欲が高まりました。

その結果、[The Java EE 7 Tutorial](http://docs.oracle.com/javaee/7/tutorial/)を英語とJava EEの勉強を兼ねてテキトーに翻訳をするようになり、その結果をはてなブログに投稿しています。

読みたい章を読んでいるだけなので全部訳すことはないだろうけど、読んだ章が10個越えたので記念にまとめを作りました。

# Java EE 7 Tutorialと自分の翻訳エントリの対応表
|チュートリアルのセクション名|翻訳エントリへのURL|
|---|---|
|3 Resource Creation|http://kagamihoge.hatenablog.com/entry/2014/09/10/204604|
|4 Injection|http://kagamihoge.hatenablog.com/entry/2014/08/24/180240|
|18 Java API for WebSocket|http://kagamihoge.hatenablog.com/entry/2014/06/19/202338|
|19 JSON Processing|http://kagamihoge.hatenablog.com/entry/2014/06/10/223338|
|21 Introduction to Bean Validation|http://kagamihoge.hatenablog.com/entry/2014/09/19/205744|
|22 Bean Validation: Advanced Topics|http://kagamihoge.hatenablog.com/entry/2014/09/20/204235|
|23 Introduction to Contexts and Dependency Injection for Java EE|http://kagamihoge.hatenablog.com/entry/2014/08/20/200654|
|25 Contexts and Dependency Injection for Java EE: Advanced Topics|http://kagamihoge.hatenablog.com/entry/2014/08/23/182203|
|29 Building RESTful Web Services with JAX-RS|http://kagamihoge.hatenablog.com/entry/2014/09/04/204034|
|30 Accessing REST Resources with the JAX-RS Client API|http://kagamihoge.hatenablog.com/entry/2015/02/09/202639|
|31 JAX-RS: Advanced Topics and an Example|http://kagamihoge.hatenablog.com/entry/2014/09/09/202730|
|43 Creating Fetch Plans with Entity Graphs|http://kagamihoge.hatenablog.com/entry/2015/11/30/221829|
|45 Java Message Service Concepts|http://kagamihoge.hatenablog.com/entry/2015/12/27/160742 <br> http://kagamihoge.hatenablog.com/entry/2015/12/27/160955|
|51 Transactions|http://kagamihoge.hatenablog.com/entry/2014/08/27/202902|
|54 Using Java EE Interceptors|http://kagamihoge.hatenablog.com/entry/2014/09/13/154623|
|55 Batch Processing|http://kagamihoge.hatenablog.com/entry/2014/04/10/205918|
|56 Concurrency Utilities for Java EE|http://kagamihoge.hatenablog.com/entry/2014/06/22/172815|
Chef ContainerでApache用のコンテナを立ちあげるまでの全コマンド

### Chef Containerについて
http://www.getchef.com/blog/2014/07/15/release-chef-container-0-2-0-beta/

### 実行環境
* Amazon Linux AMI 2014.03.2 (HVM)

### Dockerのインストール
```
sudo yum install docker
sudo service docker start
```

#### ec2-userをdockerグループに追加
```
sudo usermod -G docker ec2-user
exit
ssh ec2-test
cat /etc/group
groups
```
※ec2-hostは~/.ssh/configに定義したHostの名前

#### Dockerの動作確認
```
docker ps
```

### ChefDK(Chef Development Kit)のインストール
```
wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.2.1-1.el6.x86_64.rpm
sudo rpm -Uvh  chefdk-0.2.1-1.el6.x86_64.rpm
```
※ChefDKは以下のURLから最新のものを指定する
http://downloads.getchef.com/chef-dk/

### knife containerのインストール
```
chef gem install knife-container
```
※インストール後にrubyのパスをPATHに含めるように言われるで、そのパスを以下のように設定する

```
echo 'export PATH="$HOME/.chefdk/gem/ruby/2.1.0/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
echo $PATH
```

### Apache用コンテナの作成&起動
```
mkdir apache
cd apache
knife container docker init test/apache2 -r 'recipe[apache2]' -z -b
knife container docker build test/apache2 -z
docker run -it -p 80:80 --name myapache1 test/apache2
```

### 確認
EC2インスタンスのPublic IPにhttpでアクセスするとApacheの画面が表示される
[RSpec3]テストデータはどこへ消えた

Rails内で作成したモジュールのテストでDBのサンプルデータが必要となり、
specファイル内で、テスト用のデータを投入する記述をしたんだけど、

```ruby
require 'rails_helper'

include モジュール

describe 'モジュール' do
  describe '#メソッド' do
    context 'XXXXXXXXXXXXXX' do
      before do
        FactoryGirl.create(:sample_data)
      end
      it 'return 0' do
        expect(メソッド(1)).to be > 0　#引数には、sample_dataのidが入る
      end
    end
  end
end
```
（sample_datasのテーブルは0レコード。idはauto_increment.）

テストを試みると
・1回目のテスト：通る
・2回目以降のテスト：そんなレコード(id=1のレコード）はないっておこられる
・test dbのsample_datasにはレコードが１つも存在しない。

なぜだ・・・・と思ってためしに手動でsample_datasにレコード挿入するとなぜかidに1でない値が挿入される。

色々調査した結果rails_helper.rb内の設定が原因であることが分かった

```ruby
...
 # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = yes 
...
```

これを

```ruby
...
 # If you're not using ActiveRecord, or you'd prefer not to run each of your
  # examples within a transaction, remove the following line or assign false
  # instead of true.
  config.use_transactional_fixtures = no
...

```

とすると、テストによってレコードが挿入されることが確認できた。

確認中だけど、下記ってことかな

・config.use_transactional_fixtures = yesの場合、テスト内データ操作がトランザクションの扱いになって、さらにコミット処理をしてあげないとデータはDBに保存されない。

・config.use_transactional_fixtures = no の場合、トランザクションははしらず、INSERTしたタイミングでレコードが保存される

・レコードが0なのに、手動INSERTでidが1以外になった理由は、auto_incrementでシーケンスの払い出しをしたにも関わらずコミットしなかったので、シーケンスが破棄され、テストの度にインクリメントした値が振り出されていた

基本的なことじゃーんだったらすいません。
MySQL の PDO::exec で select すると以降のクエリがすべて失敗する

PHP のバージョンなど。

```
PHP 5.6.0 / mysqlnd 5.0.11-dev
```

実行したコード。

```php
<?php
$dsn = 'mysql:host=127.0.0.1;dbname=test;charset=utf8';
$pdo = new PDO($dsn, "test", "pass", array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
));

$pdo->exec("select 1 from dual");
$pdo->exec("select 2 from dual");
```

発生した例外。

```
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.'
```

このエラーには見覚えがあります、`PDO::MYSQL_ATTR_USE_BUFFERED_QUERY = 0` なときに複数の結果セットを開くと発生します。

 - [mysql_use_result と Server Sent Events でデータをストリーム的にブラウザに返す - ngの日記](http://ngyuki.hatenablog.com/entry/2014/06/16/010209 "mysql_use_result と Server Sent Events でデータをストリーム的にブラウザに返す - ngの日記")

が、`PDO::MYSQL_ATTR_USE_BUFFERED_QUERY = 1` などとしても解決しません。

```php
<?php
$dsn = 'mysql:host=127.0.0.1;dbname=test;charset=utf8';
$pdo = new PDO($dsn, "test", "pass", array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => 1,
));

$pdo->exec("select 1 from dual");
$pdo->exec("select 2 from dual");
```

おそらく `PDO::exec()` した後に `mysql_store_result()` も `mysql_use_result()` も呼ばれていないために結果セットが閉じられておらず、後続の SQL が実行できないのだと思います。

なお、このとき MySQL のエラーログには次が出力されていました。

```
[Warning] Aborted connection 36 to db: 'test' user: 'test' host: '127.0.0.1' (Got an error reading communication packets)
```

これは `mysql_close` せずにクライアントプロセスを殺すと発生します。<del>つまり接続が正しく閉じられていないので mod_php や fpm だとリークしてそうです。</del> MySQL への接続はリークしていませんでした。

下記のように PDO の中身が libmysql の場合は MySQL のエラーログにはなにも記録されませんでした。

```
PHP 5.6.0 / libmysql 5.6.20
```

---

`PDO::exec()` で `select` したのが間違いだと思うので、PDO_MySQL のバグなのかどうかは微妙。。。
ひとりTDDBC（LRUCache）リファクタリング

# 前回までのあらすじ

- ひとりTDDBCをやります
- お題は[t_wadaさんのTDDBCお題スライド P.5](http://www.slideshare.net/t_wada/tddbc-exercise)
- Githubの[このリポジトリ](https://github.com/haazime/tddbc_lru_cache)で進めます
- [Vol.1](http://qiita.com/haazime/items/2c61cb10eea3c6d97e4d)
- [Vol.2](http://qiita.com/haazime/items/769e86bf81a9709f9c6a)

# リファクタリング

```rb
def []=(key, value)
  @container[key] = value
  @contained_key_order << key # ココ！
  if @capacity < @container.size # ココ！
    shape_container(reduce_contained_keys(1)) # ココ！
  end
end

def [](key)
  @contained_key_order.tap {|x| x.delete(key) } << key # ココ！
  @container[key]
end

def reduce_contained_keys(num)
  @contained_key_order.slice!(0, num) # ココ！
end
```

やっぱり、データを入れる／取り出す時に
どのキーをキャッシュすべき（```@container```に残すべき）か、```Array```を操作して管理しているのが気になります。

Arrayの実装に直接依存させないようにしたいので、別途クラスを用意し
それを使ってキーを管理するようにリファクタリングしてみます。

***もちろん、今までのテストが全てグリーンな状態でリファクタリングを始めて
終わった後も、そのままテストがオールグリーンになるように進めます！***

# Historyクラス

データの出し入れの際に***使われたキーの履歴***を表現します。

## record(key)

キーが使われたことを記録します。

## keys(capacity)

最近使われたキーをサイズ```capacity```の```Array```で返します。

# リファクタリング後

### データを入れる

```rb
def []=(key, value)
  @container[@history.record(key)] = value
  shape_container(@history.keys(@capacity))
end
```

### データを取り出す

```rb
def [](key)
  @container[@history.record(key)]
end
```

### キャッシュのサイズを変更する

```rb
def resize(new_capacity)
  if new_capacity < @capacity
    shape_container(@history.keys(new_capacity))
  end
  @capacity = new_capacity
end
```

各メソッドはこのようになりました。
キャッシュとしての振る舞いを担当する```LRUCache```と
キーの履歴を担当する```History```で
いい感じに責務が分担できたかなと思いますが、いかがでしょうか？

# Historyクラスのテスト

今回のリファクタリングによって、```History```クラスを新たに作りましたが
```History```クラスに対するユニットテストは追加していません。

# つづく

[ひとりTDDBC（LRUCache）仕様変更その2](http://qiita.com/haazime/items/b2a1937e81c24830cff7)
JScript をバッチファイル内に埋め込んでみる(shebangもどき)

できたけど、みっともない…

```javascript:foo.cmd
rem = 0 /* 
@cscript //E:JScript //nologo "%~f0" %1 %2 %3 %4 %5 %6 %7 %8 %9 & exit /b
*/
WScript.Echo("ahaha")

// vim:set filetype=javascript:
```

出力

```
<HAYAMA-PC:~>
✏ foo.cmd

[36;40;1m<HAYAMA-PC:C:\Users\Hayama>
rem = 0 /*
ahaha
```

この要らぬ出力、なんとかならんかのー。rem を @rem とかけるだけでも何とかなるんじゃが…
SimpleCovを利用してコードのカバレッジを計測する。

ともあれインストール。


```rb:Gemfile
ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] = 'YES'
gem "rspec", "~> 2.14.1"
gem "simplecov", "~> 0.8.0"
```

	$ bundle install --path vendor/bundle

RSpecの初期化をする。

	$ bundle exec rspec --init
  	create   spec/spec_helper.rb
  	create   .rspec

Bundlerでインストールしたディレクトリをフィルタリングして対象外にする。

```spec_helper.rb
require 'simplecov'

SimpleCov.start do
    add_filter "/vendor/"
end

RSpec.configure do |config|
  config.treat_symbols_as_metadata_keys_with_true_values = true
  config.run_all_when_everything_filtered = true
  config.filter_run :focus
  config.order = 'random'
end
```

テストを書く。

```spec/calc_spec.rb
require 'spec_helper'
require 'car'

describe Car do
    it "car named ferrari" do
        car = Car.new
        expect(car.name).to eq "ferrari"
    end

    it "car price 200" do
        car = Car.new
        expect(car.price).to eq 200
    end
end
```

実装する。

```lib/car.rb
class Car
    attr_accessor :name, :price

    def initialize(name="ferrari")
        @name = name
        @price = 200
    end
end
```

テストを実行をする。

```
$ bundle exec rspec
..

Finished in 0.03427 seconds
2 examples, 0 failures

Randomized with seed 36271

Coverage report generated for RSpec to /vagrant/simplecov/coverage. 5 / 5 LOC (100.0%) covered.
```

WEBrickを起動する。

```webrick.rb
require 'webrick'

params = {
    :DocumentRoot => './coverage',
    :BindAddress => '0.0.0.0',
    :Port => 8080
}

srv = WEBrick::HTTPServer.new(params)

trap(:INT){ srv.shutdown }
srv.start
```

	$ ruby webrick.rb

結果を表示する。

http://localhost:8080/

![Screen Shot 2014-09-10 at 7.09.43 AM.png](https://qiita-image-store.s3.amazonaws.com/0/2555/59f13a99-2658-d96c-99fe-ab1f58ffc040.png)

### 参考リンク

- [colszowka/simplecov](https://github.com/colszowka/simplecov)
- [class WEBrick::HTTPServer](http://docs.ruby-lang.org/ja/1.9.3/class/WEBrick=3a=3aHTTPServer.html)
コード中にUnicode文字列を表現する

ひとつきほど前に書き殴ったけど放置されてたので放流する。

## 前提

 * Unicodeは文字集合であり、文字ごとにコードポイントが割り当てられる
 * UTF-8はUnicodeをバイト列として表現するための方式([文字符号化方式 - Wikipedia](http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E7%AC%A6%E5%8F%B7%E5%8C%96%E6%96%B9%E5%BC%8F))のひとつである
 * UTF-8は文字によってバイト長が異なる
   * [UTF-8 - Wikipedia](http://ja.wikipedia.org/wiki/UTF-8)を100回読むこと
 * PHPはASCII互換であれば、エンコーディングに依存しない言語である
   * PHPの「文字列」は単なるバイト列である
 * もちろんPHPの標準ライブラリはマルチバイト文字列処理をサポートする
   * [PHP: サポートされる文字エンコーディング - Manual](http://php.net/manual/ja/mbstring.supported-encodings.php)
 * 言語コアがエンコーディングをサポートするRubyではソースファイルに不正なバイト列が含まれるとSyntaxErrorだが、PHP5では(Syntaxと矛盾しない限り)そのようなことはない
 * 現在のPHPでの標準的なエンコーディングはUTF-8である
   * これは現在のWWWではUTF-8が一般的であること、PSR-1のような統一的なコーディング規約においてUTF-8が **MUST(しなければならない)** として紹介されることによる
   * [PSR-1 基本コーディング規約（日本語）｜北海道札幌市のシステム開発会社インフィニットループ](http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html)
   * `json_encode`に含まれる文字列のエンコーディングはUTF-8でなければなりません

## 各手法の比較

## 文字列リテラル

```php
<?php
$wave_dash        = '〜';
$full_width_tilde = '～';
```

 * **pros**
   * 実行時にコストがかからない
     * コード上にバイト列が直接埋め込まれてるので
   * クラス定数(`const`)に定義することが可能
 * **cons**
    * 近年の多くのフォントでは[グリフ](http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AA%E3%83%95)で判別がつかない<sup>※ただしWindozeを除く</sup>
   * Unicodeを正しく扱ってくれないテキストエディタなどで無惨に破潰される
     * [TEditor](http://homepage3.nifty.com/~katsuhiko/delphi.html)コンポーネントベースのエディタなど
     * TeraPad, MKEditorなど古来から日本人に愛用されてきたエディタが該当するんじゃよ… 

## JSON

[Introducing JSON](http://www.json.org/)を読め。

JSONでは`\u`とUnicodeのコードポイント16進数4桁でユニコード文字を表現することができるので、これを利用する。

```php
<?php
$wave_dash        = json_decode('"\u301C"');
$full_width_tilde = json_decode('"\uFF5E"');
```

 * **pros**
   * Unicodeを正しく解釈できないエディタ/処理系に殺されることはない
   * メソッド呼び出し一回で済む
 * **cons**
   * クラス定数(`const`)に定義することができない
   * `'"xxx"'`みたいに二重括弧で括るのがわかりにくいし、コンパイラレベルのエラーにならない
   * 文字列を取得したいために`json_decode`って書いてるのが直感的ではなくバッドノウハウくささがある

## chr-implode

```php
<?php
$wave_dash       = implode('', array_map('chr', [0357, 0275, 0236]));
$full_width_dash = implode('', array_map('chr', [0343, 0200, 0234]));
```

 * **pros**
   * Unicodeを正しく解釈できないエディタ/処理系に殺されることはない
   * PHPの文字列が単なるバイナリ列だと理解してると直感的
   * JSONモジュールが無効な環境でも動作する
 * **cons**
   * クラス定数(`const`)に定義することができない
   * 一文が長く、周りくどく見える

## まとめ

 * なんかこのへんの知見が共有されてないんじゃないかと思ったので書いた
 * ぶっちゃけどれでもいい
 * ただし、
   * 筆者は`const`に定義したいのでリテラルで書くことにした
   * 数も多くないのでPHPUnitで`chr-implode`を使って作った文字列と比較して、不埒者にリテラルを破潰されるリスクを未然に防ぐことにした
 * 個人的にはJSON形式で書くとUnicode文字列、`chr-implode`で書くとUnicode文字であることを強調できる気がする(気分の問題)

## あとがき

TEditorの功罪について誰か語ってください。人類がJISコードの重力井戸の底に居た頃はこの上なく素晴らしかったのですが…

2014年の現在において、Unicode/UTF-8対応を謳っておきながら、[JIS X 0208](http://ja.wikipedia.org/wiki/JIS_X_0208)範囲外の文字を認識できないエディタの存在は邪悪だと、はっきり申し上げたい。

<hr>

## おまけ バイト列の数値表現を調べる

本文中ではUnicodeの16進表記とUTF-8の8進表記を使った。

```php
array_map("ord", str_split("〜")));
//=> array (
//       0 => 227,
//       1 => 128,
//       2 => 156,
//   )

array_map(function($n){ return "0".decoct(ord($n)); }, str_split("〜"));
//=> array (
//       0 => '0343',
//       1 => '0200',
//       2 => '0234',
//   )
)

json_encode("〜", ~JSON_UNESCAPED_UNICODE)；
#=> '"\\u301c"'
```
ビルドする際にバージョン情報を埋め込む

Golangのアプリケーションはビルドした状態で各サーバにデプロイするのが一般的だと思うが、どのバージョンがデプロイされているのか確認したくなる。ビルドする際にバージョン情報を埋め込めると良い。

## リンク時に変数を指定する

まずはバージョンを表示できるようにコードを追加しよう。`-version`オプションが指定されたらバージョン番号をプリントして出力するようにする。

```go:main.go
package main

import (
    "flag"
    "fmt"
)

var version string
var show_version = flag.Bool("version", false, "show version")

func main() {
    flag.Parse()
    if *show_version {
        fmt.Printf("version: %s\n", version)
        return
    }
    // ... snip ...
}
```

後はビルド時に変数`version`に文字列を指定するだけである。goの[ld](http://golang.org/cmd/ld/)コマンドは`-X`オプションを使用することで、初期化していない変数の値を指定することが出来る。これを利用してビルド時にバージョン情報を含める。

```
go build -ldflags "-X main.version $(git describe)" main.go
```

`main.version`はmainパッケージのversion変数ということだ。ここでは`git describe`コマンドを使用した。

実行すればちゃんとバージョンが表示されるはずだ。

```sh
$ ./main -version
version: v1.1
```

## git describe

`git describe`コマンドを使用すると、直近のtagを元にしたバージョン番号を生成してくれる。

例えば、HEADに`v1.1`というタグが打たれていれば、実行結果は次のようになる。tagにコメントを付けていない場合は、`--tags`オプションをつけると全てのtagを探索対象にしてくれる。

```sh:
$ git describe
v1.1
```

また、HEADにタグが打たれていなければ、コミット数とハッシュを元に適切なバージョン名を生成する。

```sh:
$ git describe
v1.1-2-g012abc
```

このときのフォーマットは次のようになっている。

```sh
${直近のタグ}-${タグからのコミット回数}-g${ハッシュのprefix}
```

このように何となくどのコミットがHEADだったときにbuildしたのか把握できて便利だ。

## ライセンス

本記事は下記記事を再編集しており、[CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/)でライセンスされる。

- [version control - Go: how to add git revision to binaries built? - Stack Overflow](http://stackoverflow.com/questions/15711780/go-how-to-add-git-revision-to-binaries-built)
疑似乱数生成とランダムサンプリング

## 標準モジュールで乱数を生成する

Python には標準ライブラリとして [random](http://docs.python.jp/3.4/library/random.html) モジュールが備わっており、さまざまな分布の乱数を生成することができます。これには主に次のような特長があります。

* よく使うメジャーな分布である一様分布、正規分布、対数正規分布、負の指数分布、ガンマおよびベータ分布を利用できる。
* 乱数生成器として C で実装された[メルセンヌツイスタ (MT)](http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E3%83%BB%E3%83%84%E3%82%A4%E3%82%B9%E3%82%BF) を利用している。
* Random をサブクラス化して乱数生成器を自作することもできる。

### 乱数生成例

NumPy の[ランダムサンプル関数](http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.random_sample.html#numpy.random.random_sample)では浮動小数点数または[整数](http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.random_integers.html#numpy.random.random_integers)などでの乱数生成ができます。

```py3
np.random.random_sample((5,))
#=> array([ 0.80055457,  0.19615444,  0.50532311,  0.48243283,  0.56227889])

np.random.random_sample((5,2))
#=>
# array([[ 0.59495428,  0.56194628],
#        [ 0.93675326,  0.88873404],
#        [ 0.98967746,  0.2319963 ],
#        [ 0.20625308,  0.76956028],
#        [ 0.7870824 ,  0.30181687]])
```

## データフレームのランダムな並び替え

[permutation](http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.permutation.html#numpy.random.permutation) を利用することでデータフレームのランダムな並び替えができます。

```py
df = pd.DataFrame(np.arange(10*4).reshape(10,4))
sampler = np.random.permutation(5)
#=> array([0, 2, 1, 3, 4])

df.take(sampler)
#=>
#     0   1   2   3
# 0   0   1   2   3
# 2   8   9  10  11
# 1   4   5   6   7
# 3  12  13  14  15
#4  16  17  18  19

np.random.permutation(len(df))
#=> array([6, 7, 8, 3, 9, 4, 2, 1, 0, 5])
```

## トランプを引く

52 枚のトランプの山から 10 枚引くコードを考えてみます。 [random.shuffle](https://docs.python.org/3.3/library/random.html#random.shuffle) を使えばシャッフルできますから、ここから任意の枚数を引けば良いでしょう。

```py3
# トランプの山を用意する
deck = list(
    itertools.product(list(range(1, 14)),
                      ['スペード', 'ハート', 'ダイヤ', 'クラブ']))

random.shuffle(deck) # デッキをシャッフルする

print("引いたカード:")
for i in range(10): # 10 枚のカードを引く
    print(deck[i][1] + "の " + str(deck[i][0]))

#=> 引いたカード:
# ダイヤの 6
# クラブの 3
# ハートの 10
# ダイヤの 12
# スペードの 8
# クラブの 13
# ダイヤの 13
# スペードの 5
# ハートの 12
# ダイヤの 7
```

トランプは 52 枚しか無いので random.shuffle(53) とすると IndexError になります。
Javaでパスワードをハッシュ化するのに良い方法を調べてみた

Javaでパスワードをハッシュ化するのに良い方法を調べたのでメモしておく

# 要件・方針

* 必要な全情報が攻撃者の手に入ってオフラインで解析されても困らない。
* 強力なHASH関数と、アカウント毎に違うSalt、そしてストレッチングが必要。
* SaltはHASH化されたパスワードと一緒に保管してOK
* Saltとストレッチングの処理は、独自実装ではなく既存のアルゴリズムの既存実装使う
    * PBKDF2 とか Bcrypt, Scrypt など。
    * JCA(Java Cryptography Architecture) が利用出来るなら最善だろう。そうでなければ著名プロジェクトの物を使いたい

参考

* http://www.f-secure.com/weblog/archives/00002095.html
    * 日本語訳：http://blog.f-secure.jp/archives/50564743.htm
        *「SHA-1+salt」じゃなくて、 PBKDF2, Bcrypt, PBMAC を使えってある
        *「HMAC」 は「PBMAC」の間違いだと原文にある

# Javaによる実装

## まとめ

* java7以前なら、Spring SecurityのBcrypt実装を使うのがよさそう。
* java8以降なら、JCAのPBKDF2をHMAC-SHA-256で利用。またはSpring SecurityのBcrypt実装を使うのがよさそう。


## PBKDF2

* JCA(Java Cryptography Architecture) にあるが
* Java6,7 だと「PBKDF2WithHmacSHA1」しかなく、HMAC-SHA1 となるのでお勧めできない
    * http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#SecretKeyFactory
    * http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#SecretKeyFactory
* Java8 だと任意のpseudo-random functionが選べるので、HMAC-SHA-256が使えるので良いと思われる
    * http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#SecretKeyFactory
* ※SaltはEncodeされた結果に入っているので別途保管は不要。またEncode時に自動で安全な物が生成される


## Bcrypt

* JCAにはない。
* 信頼出来るプロジェクトの実装としては、Spring (Spring Frameworkの所）の Spring Security http://projects.spring.io/spring-security/ の実装がある
    * http://docs.spring.io/spring-security/site/docs/3.2.5.RELEASE/apidocs/org/springframework/security/crypto/password/PasswordEncoder.html
    * http://docs.spring.io/spring-security/site/docs/3.2.5.RELEASE/apidocs/org/springframework/security/crypto/bcrypt/BCryptPasswordEncoder.html
* 強度はパフォーマンスとの兼ね合いなので試験して決める。できる限り強くする
* ※SaltはEncodeされた結果に入っているので別途保管は不要。またEncode時に自動で安全な物が生成される
* ※java8でもこっち使った方が強力だろう


参考:http://terasolunaorg.github.io/guideline/public_review/Security/PasswordHashing.html

## Scrypt

* JCAや著名プロジェクトによる実装がない
符号の反転

```java
int i = 5;
System.out.println((-1)*i)//-5
```


今まで符号の判定をする際には-1をかける形で書いていた記憶があったのですが
マイナス一つで符号が反転できることを言語仕様を読んでいて見つける。

[The Java Language Specification, Java SE 8 Edition](http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.15.4)

```java
int i = 5;
System.out.println(-i);//-5

int a=6,b=-5;
System.out.println(a*-b);//30
System.out.println(a/-b);//1
```
IE対策：複数クラスを使うとき


IE6で見たときにレイアウトが崩れていたため、
原因を探していたのですが、複数クラスをセレクタに指定していたためでした。
IE6では、複数クラスの実装が対応していないと調べたのにすっかり忘れていました。

忘れないためにも、記録に残しておきます。

## 前提: 複数クラス

HTML

```
<div class="a_box">A box</div>
<div class="b_box">B box</div>
<div class="a_box b_box">c box</div>
```

CSS

```
.a_box{ background-color: green;}
.b_box{ background-color: red;}
.a_box.b_box{ background-color: yellow;}
```

css側でクラス名を連結させると、
この二つのクラス（例で言うとa_boxとb_box）が指定されているスタイルだけ、中のスタイルをあてることができます。

■chrome

![1.png](https://qiita-image-store.s3.amazonaws.com/0/44278/728b2248-b3b1-9b80-e8dd-9651e724da1f.png)


# IE6

IE6ではそのままクラス名を並べると、
一番最後のクラス名単体でしか見られていません。

```
.a_box.b_box.c_box｛～｝
だと、.c_boxしか読み取っていません。
```



HTML

```
<div class="a_box"> box1</div>
<div class="b_box"> box2</div>
<div class="a_box b_box c_box"> box3</div>
```

### サンプルcss1

```
.a_box{ background-color: green;}
.b_box{ background-color: yellow;}
.a_box.c_box{ background-color: blue;}

```

■IE6

![2.png](https://qiita-image-store.s3.amazonaws.com/0/44278/6e57925c-ddfc-c99b-4d2f-d60cb1db82c4.png)



box3はc_boxのスタイルしか効いていません。
~~.a_box~~.c_box{ background-color: blue;}
↑このように。

でもこれではまだ証明にならないため、もう1パターン

### サンプルCSS2

```
.a_box{ background-color: green;}
.b_box{ background-color: yellow;}
.a_box.b_box{ background-color: orange;}
```

本来ならば、
box2は黄色ですのに、

■chrome

![3.png](https://qiita-image-store.s3.amazonaws.com/0/44278/89fd5790-5652-72ba-90c2-07e5aa304a42.png)


IE6だと、
a_boxクラスとb_boxクラスが指定されたときのみ指定されると背景色になるはずのオレンジ色になってしまっています。

■IE6

![4.png](https://qiita-image-store.s3.amazonaws.com/0/44278/06320947-5b96-a520-7a3a-326ef3832984.png)


IE6では~~.a_box~~.b_boxと読み取っているので、単純に背景色黄色をオレンジ色で上書きしてしまっています。

# バグ回避方法

このバグはセレクタの最後でクラスのスタイルの上書きをしようとした際に
発生するものらしいので、最後に別のものを追加すれば回避できます。

以下では、セレクタの最後にpを入れることで回避しています。

HTML

```
<div class="a_box"> box1</div>
<div class="b_box"> box2</div>
<div class="a_box b_box c_box"><p>box3</p></div>
```

CSS

```
.a_box{ background-color: green;}
.b_box{ background-color: yellow;}
.a_box.b_box p{ background-color: orange; margin-top: 0px;}
```

■IE6

![5.png](https://qiita-image-store.s3.amazonaws.com/0/44278/d086a676-0a67-39d5-2cb5-fe3568006a6b.png)

全てのセレクタの最後にpを入れてしまうと結局は最後に同じ名称になってしまうのでだめです。
異なる名称を入れてくださいね。
Herokuさんに「Legacy Routing End of Life」と怒られた対応（お名前.com編）

結構前からherokuを独自ドメイン割り当てて使っている人にはこんなメール来てるかもしれませんが、2014.9.29までに対応しないとサイト見えなくなりますね

要はhogehoge.heroku.com みたいなドメインは廃止するから、hogehoge.herokuapp.com を見なさいということです

じゃあお名前.comで変更だ！と久しぶりにログインしたら、「あ、ネイキッドドメイン（察し）」で分かる人には分かるハマり具合

はい、お名前.comのドメインnaviで「他のネームサーバーを利用」として、「Dozens」さんにお世話になりましょう

以下参考にさせて頂きました。

http://iiidevelop.blogspot.jp/2014/07/herokuroot.html
http://nanapi.jp/29620/

DNSはもっと簡単になるはず
http://dozens.jp/
CSSで ASC(昇順) DESC(降順)を分けたときに表示する文字を変更する。

メモ

```css
	.table > tbody > tr > th > a.asc:after {
		content: ' [asc]';
		color: black;
	}
	.table > tbody > tr > th > a.desc:after {
		content: ' [desc]';
		color: black;
	}
```
S3 Bucket に含まれる key 一覧をファイルに出力する

仕事で S3 を利用するようになった。

S3 の Key は DB に保存しており通常は問題ないが、どこかでずれるとやっかい。

そこで boto を使って、 S3 の Key 一覧をとってみた。

HEAD しか投げてなさそうなので、効率は良いと思います。

```python
#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
対象のバケットに含まれるファイル一覧を TSV に出力する。
"""
import sys
import os
import csv
from ConfigParser import SafeConfigParser
from getpass import getpass

from boto import connect_s3


AWS_CLI_CONFIG_PATH = os.path.expanduser('~/.aws/config')


def get_aws_config(config_path=AWS_CLI_CONFIG_PATH):
    """
    aws cli の config から以下のキーを返す
    - aws_access_key_id
    - aws_secret_access_key'
    """
    keys = ['aws_access_key_id', 'aws_secret_access_key']
    cfg = SafeConfigParser()
    with open(config_path, 'r') as fp:
        cfg.readfp(fp)
    return tuple(cfg.get('default', x) for x in keys)


def get_bucket(aws_access_key_id, aws_secret_access_key, bucket_name):
    """
    boto S3 bucket を返す
    """
    if not aws_access_key_id and not aws_secret_access_key:
        aws_access_key_id, aws_secret_access_key = get_aws_config()
    return connect_s3(aws_access_key_id, aws_secret_access_key).get_bucket(bucket_name)


def write_tsv(aws_access_key_id, aws_secret_access_key, bucket_name, file_name):
    """
    S3 bucket の key.name 一覧を file_name に TSV で書き出す。
    """
    # 絶対ファイルパスの決定
    file_path = os.path.abspath(file_name)

    def _writerows(rows):
        with open(file_path, 'a') as fp:
            writer = csv.writer(fp, dialect='excel-tab')
            writer.writerows(rows)

    # header の書き出し
    _writerows([('key_name', )])

    # body の書き出し
    rows = []
    for key in get_bucket(aws_access_key_id, aws_secret_access_key, bucket_name).list():
        rows.append(key.name)
        if len(rows) > 1000:
            _writerows(rows)
            rows = []
    else:
        _writerows(rows)


if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('Please specify output filename.')

    else:
        print('Please input the aws_access_key_id/aws_secret_access_key and a target bucket name.')
        print('If you don\'t input the aws_access_key_id/aws_secret_access_key, then we use awscli config.')
        aws_access_key_id = getpass('aws_access_key_id: ')
        aws_secret_access_key = getpass('aws_secret_access_key: ')
        bucket_name = raw_input('target bucket name: ')

        if not aws_access_key_id and not aws_secret_access_key and not os.path.isfile(AWS_CLI_CONFIG_PATH):
            print('Please specify the aws_access_key_id/aws_secret_access_key or create awscli config.')
            sys.exit(1)

        write_tsv(
            aws_access_key_id,
            aws_secret_access_key,
            bucket_name,
            sys.argv[1])
        print('Output: {}'.format(sys.argv[1]))
```
---------------

**すてま** 僕が所属している[会社](http://www.beproud.jp/)が[社員募集中](http://jobs.beproud.jp/)みたいです。
なんか、 Python 書いてみてーなと思った人は応募してみてくださいな。
JMeterでASP.NETアプリのテストを行う

## 説明環境

うぃんどうずでした。残念。
+ OS:Windows8.1
+ ブラウザ:IE11


## 参考サイト
大変参考になりました。ありがとうございます。

+ http://www.techscore.com/tech/Java/ApacheJakarta/JMeter/index/
+ http://d.hatena.ne.jp/language_and_engineering/20081014/1223905380
+ http://normalian.hatenablog.com/entry/20121212/1355695978


## JMeterとは

負荷テストを行うためのアプリ。[このページ](http://jmeter.apache.org/download_jmeter.cgi) からダウンロードできる。

ダウンロードしたファイルは、念のためにスペースと全角文字が含まれない場所に配置する。(c:\jmeter など)

また、JREが必要なので別途インストールしておくこと。(PATHを通しておくことも忘れずに)


## テスト対象について

+ ASP.NET製(バージョン2.0, WebForms, ViewState, ポストバックの嵐 ... )
+ ログインしての利用を前提
+ Sessionで状態管理


## 使い方(基本)

大まかな流れとしては、テスト手順の記録→テスト開始→結果確認 となる。

単純なページアクセスだけであれば、テスト手順を手動で作成するので問題ない。

今回は要ログイン・テスト手順に複雑なページ遷移が含まれるため、このような手順としている。

なお、テスト対象WEBサーバーとは別端末でのテストを推奨。(負荷負荷になって正しくテストできないよ)


### 0. JMeterの起動

<JMeterルートフォルダ>/bin/jmeterw.cmd ダブルクリックでアプリが起動する。GUIアプリなので安心！


### 1. スレッドグループの作成

テスト計画ツリー右クリック 追加→Threads(Users)→スレッドグループ 選択する。追加後、適当な名前を付けておく。


### 2.プロキシサーバーの設定

テスト手順の記録を行う準備として、HTTPプロキシサーバーを追加する。詳細手順は [このページ](http://normalian.hatenablog.com/entry/20121212/1355695978) を参照。

次に、記録時にプロキシ経由とするために、IEのインターネットオプションからプロキシサーバー設定を行う。

アドレスは127.0.0.1、ポートはHTTPプロキシサーバーと同じものを指定する。

次に「対象となるコントローラ」 から先ほど追加したスレッドグループを選択する。


### 3.テスト手順の記録

どのようなテストを行うか決まったら、HTTPプロキシサーバーの開始ボタンクリックする。

開始後に行われたHTTP通信は全て記録され、テスト手順に組み込まれるので、余計なWEBページアクセスは行わないこと。

終了ボタンクリックで記録が終了され、「対象となるコントローラー」に操作記録が吐き出される。

終了後は、IEのインターネットオプションのプロキシサーバー設定を元に戻すのを忘れないこと！！


### 4.テスト結果表示リスナーの追加

テスト計画ツリー右クリック 追加→リスナー→結果の概要を生成 を選択する。 

結果の表現毎に「結果～」「統計～」リスナーが用意されているので必要に応じて追加する。


### 5.テストの実行

実行メニューから開始を選択すると、テストが実行される。テスト前に設定内容確認のダイアログが表示されるので保存しておくとよい。

(設定を誤ると場合によっては超高負荷テストとなり、JMeterが強制終了するとのこと。もちろん設定内容も吹き飛ぶ。)


### 6.テスト結果の表示

追加したテスト結果表示リスナー, WEBサーバーの各種ログ からテスト結果を解析する。


## 使い方(応用)

随時更新

### 負荷テストを行う

スレッドグループの設定を調整することで同時アクセス数や実施回数の設定を行うことが可能。

|項目名|詳細|
|:--|:--|:--|
|スレッド数|最終的なリクエスト数|
|Ramp-Up期間(秒)|ページアクセスの間隔。スレッド数÷間隔 が1アクセスで同時に行われるリクエスト数となる。 |
|ループ回数|テストの実施回数。無限ループにチェックを入れると無限に行う。|


### リクエストパラメーターの外出し

「リクエスト毎にログインユーザーID、パスワードの組み合わせを変えたい」などに対応するため、

パラメーター情報を別ファイルから読み込むことが可能。ファイルはカンマ区切りのCSVファイルで1リクエスト時の情報を1行に記述する。

以降は下記logininfo.csvを読み込む場合について記述する。

``` logininfo.csv
user1,aaaaaa
user2,bbbbbb
user3,ccccccc
user4,dddddd
```

1. スレッドグループ右クリック 追加→設定エレメント→CSV Data Set Config を選択する。

1. 「Filename」にcsvファイルのフルパスを設定する。

1. 「Variable Names (comma-delimited)」に項目名をカンマ区切りで設定する。 ここでは "userid,password" と設定する。

1. HTTPリクエストのサンプラーでパラメーター値に ${項目名} をセットすることでcsvファイル値にアクセス可能になる。(クエリパラメーターにもセット可能)

![outparam.png](https://qiita-image-store.s3.amazonaws.com/0/7736/1d47c0b1-60f2-7365-7e5d-81f5d741b6e4.png)


### セッションを使えるようにする

初期状態ではクッキーが使えない。ということはセッションも使えない。別途設定が必要になる。

スレッドグループ右クリック 追加→設定エレメント→HTTPクッキーマネージャー を選択する。

(特に設定無しで使えたため、詳細は不明)
AndroidアプリからWi-Fiのパスワード設定を変更する

AndroidアプリからWi-Fi設定のパスワードを変更する際は以下のようにします。

```java
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
String newPassword = "hogehoge"
WifiConfiguration wifiConf = ...;  // WifiManager#getConfiguredNetworks などから取得する
int networkId = wifiConf.networkId;
wifiConf.preSharedKey = "\"" + newPassword + "\"";
if (networkId == wifiManager.updateNetwork(wifiConf)) {
	// 成功
} else {
	// 失敗
}
```

パスワードを設定する際に注意すべきなのが、**文字列の前後に`"`を付けること**です。
これを付けないと`updateNetwork`が失敗してしまいます。（戻り値が`-1`となります。）
【プログラミング48(/2 -1)手】Builder


## ポイント
作成過程を決定する「Director」 と作業インターフェースを持つ「Builder」を組み合わせることで、柔軟にオブジェクトを生成をすることができるデザインパターン。

## サンプルコード
※以下サイトと同じですので、割愛。
http://morizyun.github.io/blog/ruby-design-pattern-12-builder/

## 所感
* オブジェクト、オブジェクト生成と、生成手順を分離しようって言うお話。  
使いどころは結構ありそう。

## 参考
http://morizyun.github.io/blog/ruby-design-pattern-12-builder/
Perlのsystem()はスレッド間でワーキングディレクトリを共有しないらしい

Perl 5.20.0でのお話。

chdir()でワーキングディレクトリを変更した場合は、その影響は全スレッドに及ぶとされています。
参考URL: http://perldoc.perl.org/threads.html

しかし、system()には影響を及ぼしていないようでした。
以下のコードは起動時に/tmpに入り、5秒後に分岐スレッド内で
/procに入り、その5秒後にメインスレッドで現在位置を表示して、
join()後に/tmpに入ります。

実行すると、3では分岐スレッド内で設定した/procの影響を受けずに、元のメインスレッドの/tmpになっていました。

```pl
use threads;

chdir("/tmp");

my $thr = threads->create(sub {
  system("echo 1");
  system("pwd");
  chdir("/proc");
  system("echo 2");
  system("pwd");
  sleep(10);
});
sleep(5);
system("echo 3");
system("pwd");
$thr->join();

system("echo 4");

system("pwd");
```

Result:

```text
1
/tmp
2
/proc
3
/tmp
4
/tmp
```
中国語をピンインでソートする

中国語には「ピンイン」と呼ばれる発音に似たものがあります。
日本語を 50 音順で並べるのと同じように、中国語ではピンイン順に並べられていると気持ちが良いようです。
今回はそのピンインソートを [chinese_pinyin](https://github.com/flyerhzm/chinese_pinyin) という gem を利用して実現してみたいと思います。
（[Ruby Toolbox](https://www.ruby-toolbox.com/search?utf8=✓&q=pinyin) で検索してみると chinese_pinyin がダントツ人気でした。）


ピンインソートはこんな感じで簡単に実現できます。

```rb:pinyin.rb
require 'chinese_pinyin'

array = ["北京", "西安", "香港", "上海", "昆明", "日本"]
array.sort! do |a,b|
	Pinyin.t(a, splitter: "") <=> Pinyin.t(b, splitter: "")
end

p array # =>["北京", "昆明", "日本", "上海", "西安", "香港"]
```

どういうピンインで構成されているかを知りたい場合はこんな感じ。

```rb:pinyin.rb
require 'chinese_pinyin'

array = ["北京", "西安", "香港", "上海", "昆明", "日本"]
p array.map {|a| Pinyin.t(a, splitter: "")} # =>["beijing", "xian", "xianggang", "shanghai", "kunming", "riben"]
```

もう１つ、こちらの gem がイケてる点として、ピンインを置換する拡張ポイントが用意されていることが挙げられます。
例えば「my_pinyin.txt」のような定義ファイルを用意して「WORDS_FILE=my_pinyin.txt」のような環境変数を設定すると、そのピンインを置換することが出来ます。

```text:my_pinyin.txt
日本|nihon
香港|hongkong
```

```rb:pinyin.rb
require 'chinese_pinyin'

array = ["北京", "西安", "香港", "上海", "昆明", "日本"]
p array.map {|a| Pinyin.t(a, splitter: "")} # =>["beijing", "xian", "hongkong", "shanghai", "kunming", "nihon"]
```

なかなか素晴らしい gem だと思います。
Xcode6でViewControllerクラスを追加するメモ


どってことないことなのですが、以前と変わっていたので。

### 以前（Xcode5まで）

メニューバーのFile->New->File...から

「Objective-C class」を選んで、

![スクリーンショット 2014-09-10 16.53.39.png](https://qiita-image-store.s3.amazonaws.com/0/8868/66164573-52d5-6026-c701-d7744898ed57.png "スクリーンショット 2014-09-10 16.53.39.png")

Subclass ofに「UIViewController」選択して作りました。

![スクリーンショット 2014-09-10 16.54.11.png](https://qiita-image-store.s3.amazonaws.com/0/8868/9e8e8400-ddb0-b306-ebfc-2c45d616dc75.png "スクリーンショット 2014-09-10 16.54.11.png")

### Xcode6

メニューバーのFile->New->File...から

『Cocoa Touch Class』を選んで

![スクリーンショット 2014-09-10 16.56.19.png](https://qiita-image-store.s3.amazonaws.com/0/8868/42c53ce4-3229-b94e-9ac4-304b207ade57.png "スクリーンショット 2014-09-10 16.56.19.png")

Subclass ofに「UIViewController」選択して作ります。

![スクリーンショット 2014-09-10 16.56.47.png](https://qiita-image-store.s3.amazonaws.com/0/8868/f6ccfb4a-739c-2332-9451-b4d5fdff09ff.png "スクリーンショット 2014-09-10 16.56.47.png")

Swiftだから「Swift File」だろうと思って選んだらSubclass選ぶ画面もなく空Swiftファイルができて一瞬焦りました。
PHPで Unicode のコードポイントから文字列を出力する

サンプルコード
--------------

この方法なら、携帯電話向けの絵文字も出力可能

```php
// U+1F37A の場合
$code = '1F37A';
$bin = pack('H*', (str_repeat('0', 8 - strlen($code)) . $code));
// PHP5.4以降の場合は hex2bin() 関数が使用可能
// $bin = hex2bin(str_repeat('0', 8 - strlen($code)) . $code);

$char =  mb_convert_encoding($bin, 'UTF-8', 'UTF-32BE');
var_dump($char);
```
> 出力結果
>  => string(4) ":beer:"


### 合成文字の場合 ###

合成文字の場合は、 バイナリ文字列を結合すれば OK

```php
// U+0031 U+20E3 の場合
$code = '0031';
$code2 = '20E3';
$bin = pack('H*', (str_repeat('0', 8 - strlen($code)) . $code));
$bin2 = pack('H*', (str_repeat('0', 8 - strlen($code2)) . $code2));

$char =  mb_convert_encoding($bin . $bin2, 'UTF-8', 'UTF-32BE');
var_dump($char);
```

> 出力結果
>  => string(4) ":one:"


参考
----

 - <http://ja.wikipedia.org/wiki/Unicode6.0の携帯電話の絵文字の一覧>
Dartで時間を文字列にするにはintlを利用する


Dartで時間を文字列に変換するとき、dart:coreのDateTimeクラスにある[toStringメソ
ッド](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-core.DateTime#id_toString)では力不足なので、Dart Teamが提供しているintl pubを使います。

##intl

[intl | Pub Package Manager](https://pub.dartlang.org/packages/intl)
こちらのパッケージは日付や時間のフォーマット変換をしてくれるパッケージです。installingにしたがってインストールします。

##使用例

```dart:exmaple.dart

import 'package:intl/intl.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'dart:core';

void main(){
  var format = new DateFormat.Hms();
  var dateString = format.format(new DateTime.now());
  print(dateString);
}
```

DateFormat.~の種類は[こちら](https://pub.dartlang.org/documentation/intl/latest/intl/DateFormat-class.html#constructors)で確認できます。
Twilioなら通話ログの取得も簡単です。独自の通話ログ管理も手軽！

今回はTwilioを使って行った通話のログを取得してみたいと思います。
TwilioはRESTful APIで提供していて、今まで紹介して来た通話に関する処理はもちろんのこと、
そのコール（通話）のログも簡単に管理できます。

もちろん、ダッシュボードでも確認できます。
・Twilio管理画面ログイン → トップメニューの「ログ」をクリック

さてさて！API経由ですともっといろんな情報を取得する事が可能です！

まず、今回の紹介内容はTwilioのPHPライブラリーを使います。
PHPライブラリーについては前回投稿した記事をご覧ください。
http://qiita.com/joohounsong/items/f516f4e1f6c91572e7f5

こちらのソースコードや説明はTwilio公式ドキュメントにも公開しています。
https://jp.twilio.com/docs

<h3>日付指定</h3>
```php:call-log-completed.php
<?php
    require('Services/Twilio.php');
    
    $sid = "Twilio account SID";
    $token = "Twilio account Auth Token";
    $client = new Services_Twilio($sid, $token);

    foreach ($client->account->calls->getIterator(0, 50, array(
        "Status" => "completed",
        "StartTime" => "2013-05-23"
        )) as $call
    ) {
        echo $call->sid."<br>".$call->from."<br>";
      }
```
上のコードですと。
通話開始が「2013年5月23日」で、通話成功したコール（通話）データを取得します。

<h3>日付（期間）指定</h3>
```php:call-log-date.php
<?php
    require('Services/Twilio.php');

    $sid = "Twilio account SID";
    $token = "Twilio account Auth Token";
    $client = new Services_Twilio($sid, $token);

    foreach ($client->account->calls->getIterator(0, 50, array(
        "Status" => "completed",
        "StartTime>" => "2013-05-01",
        "StartTime<" => "2013-05-10"
        )) as $call
    ) {
        echo $call->sid;
    }
```
上のコードですと。
期間を設定して、期間の間のログを取得することも可能です。

<h3>即時取得</h3>
```php:call-log-response.php
<?php
    require("Services/Twilio.php");

    $response = new Services_Twilio();
    $to = $_POST["To"];
    $from = $_POST["From"];
    $callSid = $_POST["CallSid"];
    $callStatus = $_POST["CallStatus"];
```
このようにPOSTはもちろん、GETでも取得することが可能です。
これらのパラメーターは actionの設定が可能な動詞もしくはStatus Callback URLが設定されていると指定されているURLに自動的に送るようになっています。

例えば、下のように Dial動詞の actionに上のファイルのURLを設定すると。
Dial動詞が終了した後、自動的にすぐログデータを渡します。

```xml:dial.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Dial callerId="+8150xxxxyyyy" action="call-log-response.php">+8180xxxxyyyy</Dial>
</Response>
```
Twilioのコールログに関しては下記のページで詳しく説明していますので、こちらもご覧ください。
https://jp.twilio.com/docs/api/rest/call
Resque の「WARNING: This way of doing signal handling is now deprecated.」の対処

[resque](https://github.com/resque/resque) は言わずと知れた非同期処理を簡単に実現させてくれる gem ですが、この1.x 系を利用していると、起動時に下記のような WARNING が発生します。

>WARNING: This way of doing signal handling is now deprecated.

[こちら](http://hone.heroku.com/resque/2012/08/21/resque-signals.html) によると、これは SIGQUIT と SIGTERM のふるまいが一般的な UNIX のふるまいとは異なるために発生するらしく、一般的なふるまいに合わせるために環境変数「TERM_CHILD=1」を設定すれば良いようです。
いちいち resque の起動時に設定するのが面倒な人は下記のように設定しておきましょう。

```bash:${HOME}/.bashrc 
export TERM_CHILD=1 # for Resque
```
mysql2-cs-bind + sql-maker で、MySQLを操作するスクリプトを書く



# 概要

おもむろにテキストエディタを開いて、
DBを操作するスクリプトを書きたい時がある。
O/Rマッパを導入するのも面倒くさいし、
SQLをガリガリ書きたいし、
でもINSERT/UPDATEなどの簡単なSQLを手書きしたくない。

mysql2-cs-bind と sql-maker で快適にスクリプトが書けるようになる。

mysql2-cs-bind は、mysql2 にはない prepare statement を擬似的に行うメソッドを用意してくれている。
sql-makerのみ使うなら、`:auto_bind`オプションで済むので、このモジュールは要らないが、直接SQLを書く場合は、エスケープしてSQLに組み込むということを自動で行ってくれるので便利。

sql-makerは、ハッシュや配列のデータ構造からSQL文字列を生成してくれるモジュール。INSERT/UPDATE/DELETE と 単純なSELECTは、このモジュールで生成したほうが楽。


# インストール

mysql2-cs-bind と sql-maker をインストールするためGemfileを作成する。

```bash:shell
$ bundle init
$ vim Gemfile
```

```ruby:Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem 'sql-maker'
gem 'mysql2-cs-bind'
```

インストールする。

```bash:shell
$ bundle install
```


# スクリプトを書く

以下のような感じで、スクリプトを書くことができる。

```ruby:sample.rb
require 'sql-maker'
require 'mysql2-cs-bind'

DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASS = ''
DB_NAME = 'hogehoge'



builder = SQL::Maker.new(:driver => 'mysql')
dbh = Mysql2::Client.new(
    :host => DB_HOST,
    :username => DB_USER,
    :password => DB_PASS,
    :database => DB_NAME
)

# SELECT
sql, binds = builder.select('users', ['*'], {:id => 1})
dbh.xquery(sql, binds).each do |row|
   p row
end

# INSERT
sql, binds = builder.insert('users', {:name => 'hanako'})
dbh.xquery(sql, binds)

# UPDATE
sql, binds = builder.update('users', {:name => 'tarou'}, {:id => 1})
dbh.xquery(sql, binds)

# DELETE
sql, binds = builder.delete('users', {:id => 1})
dbh.xquery(sql, binds)
```

# 実行

```bash:shell
$ bundle exec -- ruby sample.rb
```

# 参考

mysql2-cs-bind released!
http://d.hatena.ne.jp/tagomoris/20120420/1334911716

perl の SQL::Maker (と SQL::QueryMaker) を ruby に移植した
http://blog.livedoor.jp/sonots/archives/38723820.html
boot2docker で作った VM に ssh で接続する方法

# boot2docker ssh を使う

ドキュメントに書いている標準的な使い方です。

```shell-session
% boot2docker ssh
```

# ssh コマンドを使う

boot2docker ssh 内で行われていると思われるコマンドです。

```shell-session
% ssh docker@localhost -p 2022 -i ~/.ssh/id_boot2docker
```

boot2docker は VM への ssh ポートをホスト OS の 2022 にポートフォワーディングしています。
また、ssh で使用するパスフレーズなしの秘密鍵は ~/.ssh/id_boot2docker に生成されています。
(なお、鍵を使わない場合は user:docker password:tcuser でログインできます)

# scp の使い方

ssh の接続方法が明らかになったので、scp など ssh を使った他のコマンドも用いることができます。

次の例はホスト OS 側にある local_file を VM 側にある remote_file という名前にして転送しています。

```shell-session
% scp -P 2022 -i ~/.ssh/id_boot2docker local_file docker@localhost:remote_file
```
Ember.js notifyPropertyChange ではまったのでメモ


##作り

###Controller
controllerは親子にしており、子では親のプロパティのエイリアスを貼っている
（observeHoge）

```controller.js
App.OyaController = Ember.Controller.extend({
    observeHoge: null
});

App.KoController = Ember.Controller.extend({
    needs: ['oya'],
    observeHoge: Ember.computed.alias('controllers.oya.observeHoge')
});
```


###View
子のviewで上記プロパティを参照し、observeで依存した処理を行っている。

```view.js
App.KoView = Ember.View.extend({
    change: function() {
        console.log(this.get('controller.observeHoge'));
    }.observes('controller.observeHoge')
});
```

##やりたいこと
プロパティが変わったか？に関わらず、changeを実行したかった。


```controller.js
App.KoController = Ember.Controller.extend({
    needs: ['oya'],
    observeHoge: Ember.computed.alias('controllers.oya.observeHoge'),
    actions: function(o) {
        this.set('observeHoge', o);
        // ここで、changeが毎度動いて欲しい
    }
});
```

##notifyPropertyChangeを使ってみた

そこで、notifyPropertyChangeを使ったが、以下の結果となった。

```controller.js
App.KoController = Ember.Controller.extend({
    needs: ['oya'],
    observeHoge: Ember.computed.alias('controllers.oya.observeHoge'),
    actions: function(o) {
        this.set('observeHoge', o);
        // ここで、changeが毎度動いて欲しい
        this.notifyPropertyChange('observeHoge'); // ×
        this.notifyPropertyChange('controllers.oya.observeHoge'); // ×
        this.get('controller.oya').notifyPropertyChange('observeHoge'); // ○
    }
});
```
CloudFront SSL ＋ ELB SSL 

以前は ELB で負荷分散してたんだけど、そろそろ限界を感じてきたり、世界展開などを考えて CloudFront を CDN として導入したいようなケースは結構あるように思います。

- 以前の構成：クライアント <---- https ----> ELB <---- http ----> EC2
- 改善後の構成：クライアント <---- https ----> CloudFront <---- https ----> ELB <---- http ----> EC2

例えば元々 ELB に「www.domain.com」というドメインとその SSL 証明書が配置されていた場合、クライアントからのエンドポイントは変更出来ないので「www.domain.com」の向け先を CloudFront に変更する必要があります。
ただこのとき

- CloudFront のオリジンサーバーとして ELB を設定する
- CloudFront に ELB と同じ SSL 証明書を配置する
- 「www.domain.com」の向け先を CloudFront に変更する

というような単純なステップではうまくいきません。

[Cloudfront SSL + ELB SSL, both custom SSL, returns gateway 502](https://forums.aws.amazon.com/thread.jspa?threadID=154691)

>When reviewing your CloudFront distribution it looks like your Origin is listed as the ELB's FQDN.  〜（中略）〜 Since CloudFront makes an SSL connection to your Origin using the "Origin's" domain name, this willf ail since the certificate you have is domain.ca not the ELBs FQDN.


こちらにあるように、CloudFront から ELB に接続する際、ELB の FQDN でアクセスするため、それ用の SSL 証明書でないと通信できません。
例えば東京リージョンで ELB をセットアップした場合は「xxxx.ap-northeast-1.elb.amazonaws.com」のようになるので、元々 ELB に配置されている「www.domain.com」用の SSL 証明書ではアクセス出来ないということです。

ではどうすれば良いか？ということですが、同フォーラムに解決策も書いてあります。

>Setup either a wildcard cert (*.domain.ca) or a certificate specifically for your origin (origin.domain.ca)
Modify your distribution to use the CNAME of the Origin (origin.domain.ca). Create a CNAME in Route53 for origin.domain.ca and point that to your ELBs FQDN.

ワイルドカード証明書か ELB 用の新たな証明書をゲットしてそれを利用しましょう、ELB には Route53 設定しましょう、ということが書いてあります。
今回のケースに照らし合わせて考えてみると、下記のような施策で対応できるということです。（ワイルドカード証明書のパターン）

- ワイルドカード証明書をゲットする
- CloudFront／ELB にその証明書を適用する 
- ELB に Route53 設定する（例えば「elb.domain.com」）
- CloudFront のオリジンサーバー設定を「elb.domain.com」にする
- CloudFront のエンドポイントを「www.domain.com」にする

これでクライアントからのエンドポイントは変更せず、フロントエンドに CloudFront が配置できるようになります。
めでたしめでたし。