OmniAICreator/Qiita-1.07M huggingface dataset:
RSpec - expectの中を汚さずに複雑な検証ができるsatisfyマッチャがすごい


## やりたいこと
配列の中に数値が格納されていて、数値の桁数が全て8桁であることを検証したい。というケースがありました。

## allマッチャ
`all`というマッチャで、配列の要素全てに対してマッチャを適用できるのですが、「数値の桁数が◯桁であること」を検証してくれるマッチャはないので、自分でなんとかしないといけませんでした。

## mapで変換してから検証する
`map`メソッドを使って、数値の配列を桁数の配列に変換し、`all`マッチャに渡す方法。

```rb:xxx_spec.rb
it { expect(nums.map{|num|num.abs.to_s.size}).to all(eq 8) }
```

うーん…
なんだか気持ち悪い

## ループで回してしまう
```rb:xxx_spec.rb
it '全ての数が8桁であること' do
  nums.each do |num|
    expect(num.abs.to_s.size).to eq 8
  end
end
```

うーん…
大して変わらない

## 気持ち悪さの原因
どちらも`expect`に渡すのが、**検証したい対象を変換したもの** になっているのが気持ち悪さの原因のような気がします。

`expect`には数値を渡して、マッチャが「マイナスを取って文字列にしたら長さが8であること」を検証してくれたらいいのになあ。と思っていました。

## satisfyマッチャ
`satisfy`というマッチャを見つけました。これはブロックを受け取って、そのブロックがtrueを返すことを検証してくれます。
辞書を引いてみると、**(人を)満足させる**とか**(要件を)満たす**という意味らしいです。
これを使えば気持ち悪くない書き方ができそうです。

```rb:xxx_spec.rb
it { expect(nums).to all(satisfy {|num| num.abs.to_s.size == 8 } ) }
```

ちょっと自然な感じになりました。
ただ、カッコが多くて見づらいのでブロックを分けます。

```rb:xxx_spec.rb
be_8_digits = -> num { num.abs.to_s.size == 8 }
it { expect(nums).to all(satisfy &be_8_digits) }
```

スッキリしました。

`expect`の中が、検証すべき対象になったので、`subject`でまとめて`is_expected.to`することもできます。

## まとめ
* expectの中には、テスト対象そのものを入れたい
* マッチャのために変換したものを入れると、意味が分かりづらくなる
* satisfyマッチャを使うとブロックを使って柔軟な検証ができる！
* expectの中が汚れないので気持ちが良い
ハッシュから特定のキーのハッシュを作る


テストを書いてる時にふと気になったので検証してみた.

## 結果から言うと

Ruby2.5以降とRailsではコレが鉄板
早くてシンプル！

```ruby
months.slice(:jan, :jun, :jul)
# => {:jan=>"1月", :jun=>"6月", :jul=>"7月"}
```

### Ruby 2.4以前でRailsを使わない場合は

シンプルに書くなら

```ruby
months.select {|k,_| [:jan, :jun, :jul].include?(k) }
# => {:jan=>"1月", :jun=>"6月", :jul=>"7月"}
```

早いけど、少し長い

```ruby
keys = [:jan, :jun, :jul]
keys.each_with_object({}){|k, hash| hash[k] = months[k] if months.key?(k) }
# => {:jan=>"1月", :jun=>"6月", :jul=>"7月"}
```


### 検証

思いつく限りと、コメントで頂いた方法で検証してみた.


リテラルで表記してるから、インタプリタがうまいことやってて同じくらいの結果を期待してたけど、結構違うもんだな。

- [Enumerable#each_with_object](http://docs.ruby-lang.org/ja/2.2.0/method/Enumerable/i/each_with_object.html)
- [Hash#select](http://docs.ruby-lang.org/ja/2.2.0/class/Hash.html#I_SELECT)
- [Hash#slice : active_support](https://github.com/rails/rails/blob/7ce317430601f9e041d8f715feae4297da963618/activesupport/lib/active_support/core_ext/hash/slice.rb#L21-L24)

```text:benchmark
ruby 2.2.0
                                     user     system      total        real
Enumerable#each_with_object      1.010000   0.000000   1.010000 (  1.020658)
Hash#select: out of loop         2.010000   0.000000   2.010000 (  2.027411)
Hash#select: in the loop         2.560000   0.010000   2.570000 (  2.583571)
Hash#slice: active_support       1.570000   0.010000   1.580000 (  1.590525)
```


```ruby
require 'benchmark'
require 'active_support'

puts "ruby #{RUBY_VERSION}"
n = 1000000
months = {
  jan: "1月", feb: "2月", mar: "3月", apr: "4月", may: "5月", jun: "6月",
  jul: "7月", aug: "8月", sep: "9月", oct: "10月", nov: "11月", dec: "12月"
}
Benchmark.bm(30) do |x|
  x.report("Enumerable#each_with_object") do
    keys = [:jan, :jun, :jul]
    n.times do
      keys.each_with_object({}){|k, hash| hash[k] = months[k] if months.key?(k) }
    end
  end
  x.report("Hash#select: out of loop") do
    keys = [:jan, :jun, :jul]
    n.times do
      months.select {|k,_| keys.include?(k) }
    end
  end
  x.report("Hash#select: in the loop") do
    n.times do
      months.select {|k,_| [:jan, :jun, :jul].include?(k) }
    end
  end
  x.report("Hash#slice: active_support") do
    n.times do
      months.slice(:jan, :jun, :jul)
    end
  end
end
```
Underscore.js で配列の分割を実装する

PHPでいうところの [array_chunk](https://secure.php.net/manual/ja/function.array-chunk.php) を [Underscore.js](https://underscorejs.org/) で実装する。

```lang:javascript
_.mixin({
    chunk: function(array, size) {
        return _.chain(array).groupBy(function(element, index) {
            return Math.floor(index / size);
        }).toArray().value();
    }
});

_.chunk([1, 2, 3, 4, 5, 6, 7, 8, 9], 4);

/*
[ [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9]
]
*/
```
論理設計まとめ

#論理設計
概念モデルをリレーショナルデータベースで扱える形式に変換する作業です。

#ER図
実体と実体の関係を示したものや、実体に対する操作などのことで、動詞で表現することができる。
また、属性とは、実体の特性や実体に関する情報。

![zu01.jpg](https://qiita-image-store.s3.amazonaws.com/0/59356/0184a87a-d0fd-1b16-11bf-8112ab930ae0.jpeg)


#エンティティ
一単位として扱われるデータのまとまり。

#リレーションシップ
複数のテーブルの間で特定のフィールドを関連付ける機能
複数のテーブルを連結して情報をまとめたりすることができます。


#正規化
正規化とは、データを一元管理するための理論です。

##データの正規化
データごとの属性や関連性を分析し、属性の最適なグループ化を図ることが目的です。

##関数従属
属性Aの値が決まると他の属性Bの値が一意に決まるとき、属性Bは属性Aに関数従属となります。

##完全従属
A属性B属性の間でA→Bが成立して、Aが複数の属性の集合で成り立っている場合、Aの部分集合も関数従属が成立しない状態です。

##部分従属
関数従属が成立しているが、完全従属ではない状態です。

##非正規形
現実にある伝票や帳簿などの形で存在していてるデータがあります。
これらの属性は正規化されていません。
これを非正規形といいます。

##第1正規化
属性が繰り返し出てきているグループを別の表に分解し、元表の残った行と、分解した繰り返しグループの行を一意に決められる、主キーをそれぞれ定義します。
次に、 分解した表の行と元の表と結合できるように、キー項目を定義します。

![r5151-05.gif](https://qiita-image-store.s3.amazonaws.com/0/59356/2c1f2ac8-69bc-3c4c-506b-0c02ea6c4e1d.gif)


##第2正規化
主キー列が複数の列で構成されている複合主キーがある場合、
複合主キーの一部に関数従属関係をもつ属性を別の表に分解します。
分解した表のキー項目を定義します。

![r5151-06.gif](https://qiita-image-store.s3.amazonaws.com/0/59356/8a0040a1-bbe2-6605-9f09-96d28aa61420.gif)



##第3正規化
すべての表の主キー以外の属性間の関数従属関係が対象となります。
従属関係をもつ属性別の表に分解します。
表のキー項目を定義します。

![r5151-07.gif](https://qiita-image-store.s3.amazonaws.com/0/59356/e482a4ac-5711-ec59-1ee0-f572a706c121.gif)


#URL
http://www.atmarkit.co.jp/ait/articles/1109/07/news124.html
RubyMotion の OS X アプリで Lion-style Fullscreen

なんかインターネット探してもいまいちはっきりわからなかったので。備忘録。

```rb
@mainWindow = NSWindow.alloc.initWithContentRect([[240, 180], [480, 360]],
  styleMask: NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask,
  backing: NSBackingStoreBuffered,
  defer: false)

# この1行を追加
@mainWindow.setCollectionBehavior(NSWindowCollectionBehaviorFullScreenPrimary)
```

これでウィンドウの右上のボタンが Lion の Fullscreen に対応するようになる。

![スクリーンショット 2015-02-13 17.25.02.png](https://qiita-image-store.s3.amazonaws.com/0/4384/42c640ff-970b-ccf2-ac77-8be1a6cb2590.png)

やったー。
「紙芝居」用の簡単 HTTP サーバを立てる

Web で新規に作る画面のイメージが欲しいということで HTML でモックアップページを作ってるのですが、（ファイルを直接読み込むのはいろいろアレなので）簡単な HTTP サーバが欲しい。でも本番サーバを使うわけにはいかないので、なんか手頃なのないかなぁ、と思ったら [node.js] 使えばいいんじゃん、と気が付いた。

[node.js] で（HTML ファイルを表示するだけの）簡単な HTTP サーバを立てるのには connect パッケージを使えばいいのだが、その辺に転がってる情報はちょっと古いみたいでうまく動かなかったので、今後のためにメモしておく。

- [node.js - nodejs connect cannot find static - Stack Overflow](http://stackoverflow.com/questions/24346161/nodejs-connect-cannot-find-static)
- [Node.js - Connectを使った静的ファイル配信サーバが動かなくなった - Qiita](http://qiita.com/uchiko/items/0c052c72d8ff402c3cea)

## 準備

[node.js] は 0.12 の stable が登場している。おめでとう！

- [Node v0.12.0 (Stable)](http://blog.nodejs.org/2015/02/06/node-v0-12-0-stable/)
- [2年ぶりの最新版となる「Node 0.12」がリリース | SourceForge.JP Magazine](http://sourceforge.jp/magazine/15/02/10/092000)

そうそう。会社内とかだと firewall に阻まれてたりするので、 npm のプロキシ設定を忘れずに。

- [Node.js - proxy環境下でのnpm config設定 - Qiita](http://qiita.com/tenten0213/items/7ca15ce8b54acc3b5719)

ちなみに `registry` の設定は http に変更しなくて大丈夫。

で、作業フォルダに必要なパッケージをインストールする。（言い忘れてたけど、今回は Windows 環境です。まぁどれでも関係ないけど）

```shell
C:\prototype\html>npm install connect
connect@3.3.4 node_modules\connect
├── utils-merge@1.0.0
├── parseurl@1.3.0
├── debug@2.1.1 (ms@0.6.2)
└── finalhandler@0.3.3 (escape-html@1.0.1, on-finished@2.2.0)

C:\prototype\html>npm install serve-static
serve-static@1.8.1 node_modules\serve-static
├── escape-html@1.0.1
├── utils-merge@1.0.0
├── parseurl@1.3.0
└── send@0.11.1 (destroy@1.0.3, fresh@0.2.4, ms@0.7.0, range-parser@1.0.2, depd@1.0.0, mime@1.2.11, debug@2.1.1, on-finished@2.2.0, etag@1.5.1)
```

## アプリケーションの準備

パッケージをインストールしたフォルダにアプリケーション（今回は `app.js`で。名前はご自由に）を用意する。アプリケーションの記述はこんな感じ。

```javascript:app.js
var connect = require('connect');
var serveStatic = require('serve-static');
var port = 3000;
connect().use(serveStatic(__dirname)).listen(port);
console.log('Server has started at http://localhost:' + port);
```

同じフォルダに、動作確認用の HTML ファイルも用意しておく。

```html:index.html
<!DOCTYPE html>
<html lang='ja'>
<head>
<meta charset='utf-8'>
<title>Hello World!</title>
</head>
<body>
<p>Hello World!</p>
</body>
</html>
```

余談だが、`connect` および `serve-static` では内部で `Content-Type` の値を `text/html; charset=utf-8` でハードコーディングしている。 [node.js] 標準の文字エンコーディングが UTF-8 なのでこれでいいのかもしれないが、他の文字エンコーディングの HTML ファイルでは確実に文字化けするので注意すること。きっとパッケージの中を弄れば他の文字エンコーディングにも対応できるだろうけど、ここでは踏み込まない。スマートじゃないし、どうしても他の文字エンコーディングじゃないとダメな場合は、ちゃんとしたサーバを用意したほうがいい。

## アプリケーションの起動

```shell
C:\prototype\html>node app.js
Server has started at http://localhost:3000

```

これで簡単 HTTP サーバが起動した。これでブラウザで `http://localhost:3000` にアクセスすれば “Hello World!” と表示される。おめでとう。

さて仕事に戻らないと。

[node.js]: http://nodejs.org/ "Node.js"
統計学の代表的な手法を実践する (6) 〜 ビジネスにおける分析の流れ

統計学の代表的な手法について、人気書籍「[統計学が最強の学問である実践編](http://www.amazon.co.jp/dp/4478028230)」に掲載されている[一般化線形モデルをまとめた一枚の表を最初に掲げ](http://qiita.com/ynakayama/items/bd0b65716279ae2df957)ひとつひとつ多変量解析の手法を追ってきました。今回は実際のデータを分析していくにあたり留意すべき事項をまとめます。このあたり上記書籍からの引用抜粋を含みます。

## ビジネスにおける分析の手順

今まで説明したとおり
* 量的なアウトカムに対しては重回帰分析
* 質的なアウトカムに対してはロジスティック回帰
をおこなうことでどんなアウトカムと説明変数の関係性も分析できるようになります。

手法や指標の意味がわかったあとでも、実際に使いこなそうとすると難しいところがいくつかあり、その代表的なものは「どの説明変数をいくつ使えば良いか」というインプット、「出てきた結果変数からどういう意味を読み取りどう解釈してどうアクションを取るか」というアウトプットの二大側面に整理できます。

まずはインプットからです。

### オーバーフィッティング (過学習)

過剰適合とも言います。機械学習の分野でも頻繁に登場する言葉です。意味のある説明変数だけでモデルを構築すべきところ、変数が多すぎたりモデルが複雑で自由度が高すぎるとモデルにアウトカムが当てはまりすぎてしまうという問題がおこります。機械学習の分野では訓練データセットのパターンを拾いすぎてしまい、真のモデルから遠ざかってしまうといった問題です。

これの対策として意味のある説明変数だけを回帰式に含むようにしよう変数選択法 (ステップワイズ法、クロスバリデーション法など) を用います。適切なモデルを選択するために、誤差関数に正則化項を追加して過学習を防ぐのですがこれを正則化と言います。

このとき用いられる指標としては、線形回帰なら AIC (赤池情報量基準) 、モデルの推定に最尤推定を用いるなら BIC (ベイズ情報量基準) などの例があります。

なんにせよ、より良い一般化となっているようにしなければなりません。

### 多重共線性 (通称・マルチコ)

**多重共線性 (multicolinearity)** は重回帰分析などをする際に、説明変数に似たような変数が入っておりその変数同士の相関関係が強い場合、分析結果があまり信用できなかったり意味の分からない結果になってしまう問題です。多重共線性が発生すると、本来有意でない説明変数が有意となってしまったり、他の説明変数の係数の符号が逆転してしまったりということが起こります。

これを防ぐためには目的変数との関係性をみて特に見てみたいものを 1 つ残して他の説明変数を除去するといった方法があります。このような取捨選択は分析者の主観でおこなわれる部分であり、腕前が問われるところと言えるかもしれません。

「統計学が最強の学問である」によると、因子分析やクラスター分析で量的・質的な情報を縮約することで解決の足がかりとなる、またこれらは重回帰分析・ロジスティック回帰との併用がオススメであるとしています。

### アウトプットをどうしたらよいのか

次にアウトプット。分析結果からどのように意味を読み取り、どう解釈してどうアクションするかという話です。

回帰係数の値だけでは説明変数の重要性を判断できません。どれくらい説明変数を動かせる余地があり、またどれくらい実際に動かしようがあるか、といったことを考えなければなりません。

**交互作用 (intercation)** とは、ある説明変数が目的変数に与える効果が、他の説明変数がどんな値をとるかによって異なることです。 [R では pequod パッケージを利用する](http://norimune.net/1856)ことで重回帰分析で交互作用を検討することができます。変化をつけやすい説明変数と、顧客の属性のように変化をつけにくい説明変数の交互作用を検討するといったことをします。

手順としては

1. 回帰分析で重要そうな説明変数にあたりをつける
2. ランダム化比較実験によって実証試験をする
3. 効果が実証できたのならできるだけ速く全面的に実施をする

となります。

以下は書籍 p348 ビジネスの現場で分析手法を使う手順の図の引用です。

重回帰分析・ロジスティック回帰で変数の関連性を分析
↓
結果の解釈 → 必要に応じて因子分析・クラスター分析で縮約 ↑
↓
A/B テストの検証を t 検定や z 検定で

ここから先はいかに分析の効果をビジネスに適用していくかという話になります。

ここで一冊良書を紹介いたします。

会社を変える分析の力 (講談社現代新書)
http://www.amazon.co.jp/dp/B00ENC7ON2

実際の現場で分析力をどのように活かしていくかというヒントになるかと思います。

## まとめ

統計学の王道ともいえる代表的な手法を「統計学が最強の学問である」の内容をもとに追ってみました。

ここまで一通り流れを理解すれば、あとは実際のデータの分析にあたりこれらの手法を使いこなしつつ様々な問題を解決していけば良いかと思います。
Werckerでビルド中に`failed to find target android-21 : /home/ubuntu/android-sdk-linux`と表示されたときの対策


マテリアルデザイン風の見た目にしたくてSDKのバージョンを21に更新。
で、意気揚々とビルドさせたらコケたので、メモ。

android-21が使えるように`wercker.yml`を書き換えてあげる必要があります。
`- android-sdk-update:`って項目があって、ここを編集するとビルド時に依存してるヤツを追加できたりします。

なので、ここにandroid-21を追加すればOKです。

```yml:wekcker.yml(例：書き換え前)
- android-sdk-update:
    filter: extra-google-google_play_services,extra-android-m2repository,extra-google-m2repository

```

```yml:wekcker.yml(例：書き換え後)
- android-sdk-update:
    filter: android-21,extra-google-google_play_services,extra-android-m2repository,extra-google-m2repository

```

この手のトラブルはハマると1日とか平気で潰れるので、すぐ解決して良かった。
Tera Termで接続先ショートカットの作り方

# 流れ
* .ttl ファイルを作成する
* ショートカットを作成する

# 詳細
* 適当なディレクトリに hoge.ttl といったファイルを作成する
* ファイルの中身を下記内容にする

```
; 接続(鍵認証の場合)
connect 'test.com:22 /ssh /2 /auth=publickey /user=user /passwd=password /keyfile="C:\Work\test.ppk"
```

* 適当なディレクトリに ショートカット を作成する
* 作成したショートカットのリンク先に下記内容にする

```
"C:\Program Files (x86)\teraterm\ttermpro.exe" /M=C:\Work\hoge.ttl
```
※ Cドライブ の Workフォルダ直下 に置いてあるファイルを参照しにいく場合を想定

* 出来上がったショートカットをクリックすれば、Tera Term が立ち上がり、接続される

# 備考
* 随時、他の方法も記載していきます
Rails の Model 作成時に単数形・複数形の変換がおかしい場合の対処法

# はじめに
モデル作成時に、

単数形: corpus => 複数形: corpuses 

と認識して欲しいのに、複数形と認識されてしまい、

`$ bundle exec rails g model corpus name:string, doc_count:integer`

のようなコマンドを実行すると、

```
[WARNING] The model name 'corpus' was recognized as a plural, using the singular 'corpu' instead. Override with --force-plural or setup custom inflection rules for this noun before running the generator.
```

というWARNINGが出て corpu というモデルが出来てしまった。
正しく Model が作成されるようにする。

# 誤作成したモデルの削除
下記コマンドを実行。

```
$ bundle exec rails destroy model courpu
```

# 変換内容の登録
`config/initializers/inflections.rb`を下記のように編集。

```ruby:config/initializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.irregular "corpus","corpuses"
end
```

# 結果の確認
無事作成できた。

```
$ bundle exec rails g model corpus name:string, doc_count:integer
      invoke  active_record
      create    db/migrate/20150213080836_create_corpuses.rb
      create    app/models/corpus.rb
      invoke    test_unit
      create      test/models/corpus_test.rb
      create      test/fixtures/corpuses.yml
```
【オープンデータ】大阪市のオープンデータ（学校・保育園）をPHPとJSでGoogle Map上にピン表示させる

#オープンデータとは？

オープンデータとは、広く開かれた利用が許可されているデータのことです。行政機関が保有する地理空間情報、防災・減災情報、調達情報、統計情報などの公共データを、利用しやすい形で公開することを指すのが一般的ですが、広義の意味では民間企業が保有する開かれたデータも含まれます。

#概要

大阪市が公開しているオープンデータの中から、学校や保育園のデータを用い、Google Map上に所在地をピン配置し、吹き出しウィンドウで詳細情報が確認できるようにする。


大阪市市政　オープンデータ普及促進に関する取り組みとオープンデータ一覧
http://www.city.osaka.lg.jp/toshikeikaku/page/0000250227.html

各種データについては、CC（クリエイティブコモンズ）ライセンスにおけるCC-BYで提供されています。


#PHPでCSVファイルを取得


PHPで大阪市が公開しているこちらのCSVデータを取得します。
http://www.city.osaka.lg.jp/contents/wdu090/opendata/mapnavoskdat_csv/mapnavoskdat_gakkou.csv

```ruby:PHP

<?php
setlocale(LC_ALL, 'ja_JP.UTF-8');

$data = file_get_contents("http://www.city.osaka.lg.jp/contents/wdu090/opendata/mapnavoskdat_csv/mapnavoskdat_gakkou.csv");
$data = mb_convert_encoding($data, 'UTF-8');
$temp = tmpfile();
$meta = stream_get_meta_data($temp);

fwrite($temp, $data);
rewind($temp);

$file = new SplFileObject($meta['uri']);
$file->setFlags(SplFileObject::READ_CSV);

$csv = array();

foreach ($file as $line) {
	$csv[] = $line;
}

fclose($temp);
$file = null;

```

#JSでマップに反映

取得したデータをGoogle Mapで読み込ませる為に、JSに渡します。
「JSON.parse」で一度、JSON形式に変換。

ピンと吹き出し（情報ウィンドウ）が表示できるようにする。

吹き出しに出力したデータ
・名称
・住所
・電話番号
・サイトURL


「http://maps.google.com/maps/api/js」
GoogleMapsAPIを前もって読み込んでおく

```ruby:JS

var currentInfoWindow = null;

window.onload =function () {
	
	var dat = JSON.parse('<?=json_encode($csv);?>');

	var myOptions = {
		zoom: 16,
		center: new google.maps.LatLng(34.61831244,135.5202968),
		mapTypeId: google.maps.MapTypeId.ROADMAP
	};

	var map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);
	var markers = dat;

	for(var i = 0; i < markers.length; i++) {
		var name = markers[i][2];
		var url = markers[i][11];
		var address = markers[i][5];
		var tel = markers[i][7];
		var latlng = new google.maps.LatLng(markers[i][1],markers[i][0]);
		createMarker(latlng,name,url,address,tel,map)
	}

	function createMarker(latlng,name,url,address,tel,map){

		var infoWindow = new google.maps.InfoWindow();
		var marker = new google.maps.Marker({position: latlng,map: map});


		google.maps.event.addListener(marker, 'click', function() {

			if (currentInfoWindow) {
				currentInfoWindow.close();
			}

			var info = "<h4>"+name+"</h4>"+address+"<br/>"+tel+"<br/><p><a href="+url+">"+url+"</p>";
			infoWindow.setContent(info);
			infoWindow.open(map,marker);
			currentInfoWindow = infoWindow;
			
		});
		return marker;
	}
}


```


#サンプル

ピンが配置され、クリックで情報が閲覧できます。

![スクリーンショット 2015-02-13 16.31.11.png](https://qiita-image-store.s3.amazonaws.com/0/67591/76e6640e-18fb-f5f9-5696-ec76c6b5b4aa.png)


ピンを置いてはじめてわかったことですが、大阪市が管轄してるのに、所在地が大阪市内じゃない学校がいくつかあるんですね。

![スクリーンショット 2015-02-13 16.53.29.png](https://qiita-image-store.s3.amazonaws.com/0/67591/52968fcd-5c0f-cabc-7085-7c85d242800d.png)


#発展

これはあくまで基本型です。他のデータとドッキングしたり、検索や絞り込み等、様々なことが可能になります。
活用シーンとしては、例えば、不動産サイトなどに活用できます。特にファミリー層にとっては物件の近くに学校や保育園があるのかというのは、かなり重要なポイント。視覚的に地図上に正確な情報を載せれれば、ユーザー体験の向上につながるでしょう。
そこで得られる情報は、自治体が出しているということもあって、やはり信頼性は高く、正確だと思います。
Rspecで標準出力をテストする

# captureメソッドは非推奨

標準出力テストはcaptureメソッドを使う例がよく出てくるので、それを使ってみたところ、DEPRECATION WARNINGが出てしまったので、他の方法を調べてみました。

```rb:DEPRECATION_WARNING
expect(capture(:stdout){ puts "foo" }).to eq "foo\n"

```

# output("foo\n").to_stdoutでOK

以下のように変更したら、OK!!

```rb:rspec
expect { puts "foo" }.to output("foo\n").to_stdout
```
WindowsでSensu-0.14.0-1を導入してみたが動かない時

自分が失敗していたメモなので読む場合は **注意**

# 事象
Windows環境にてSensu監視の導入を行なったところ起動に失敗
詳しい原因がわからない(自分がRuby分かっていないからで単純なことかもしれない)

出力メッセージ
文字コードに問題があるようだがconf.d配下ファイルやpluginsの文字コードをUTF-8やUTF-8Nになおしてみたが解決せず

```
{"timestamp":"2015-02-13T15:44:20.936999+0900","level":"warn","message":"loading config files from directory","directory":"C:\\opt\\sensu\\etc\\conf.d"}
{"timestamp":"2015-02-13T15:44:20.937999+0900","level":"warn","message":"loading config file","file":"C:/opt/sensu/etc/conf.d/check.json"}
{"timestamp":"2015-02-13T15:44:20.937999+0900","level":"warn","message":"loading config file","file":"C:/opt/sensu/etc/conf.d/client.json"}
C:/opt/sensu/embedded/lib/ruby/gems/2.0.0/gems/multi_json-1.10.1/lib/multi_json/adapters/json_common.rb:21:in `encode': "\xE6" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
	from C:/opt/sensu/embedded/lib/ruby/gems/2.0.0/gems/multi_json-1.10.1/lib/multi_json/adapters/json_common.rb:21:in `to_json'
以下略
```

# 環境 
- windows 2012R2 / 2008R2　
- sensu-0.14.0-1を使用

# 導入手順
1 通常の手順通りにmsiをダブルクリックしインストール

2 Windowsのgemにエラーがあるらしいのでlocalインストールによるアップグレードを実施
(手順はまた別で書くこと)

3 sensu-pluginとactivesupportの導入

```
gem install sensu-plugin  --no-ri --no-rdoc
gem install activesupport --no-ri --no-rdoc
```

4 各種ディレクトリの作成

```
mkdir etc
mkdir plugins
mkdir etc/conf.d
mkdir etc/ssl
```

5 sensu-client.xmlファイルの修正
argumentsのパスに注意

6 client.json / check.json / rabbitmq.jsonの設定
設定方法は[inokappa先生のQiitaを参照](http://qiita.com/inokappa/items/eb7fe17cde71fe008b0c)

7 Windowsのサービスへ登録

```
sc create sensu-client start= delayed-auto binPath= c:\opt\sensu\bin\sensu-client.exe DisplayName= "Sensu Client"
```

サービスから削除する際は以下を実施

```
sc qc sensu-client  (サービスの状態確認)
sc delete sensu-client (サービスの削除)
```

で、起動すると起動に失敗する。
使用しているgemのバージョンの問題か？

# 回避策
安直だけど古いバージョンを入れる。
同様の手順でsensu-0.12.6-4にしたら起動した。

詳しい原因は自分にはさっぱりなので、回避策でひとまず〆。

# 参考URL
[Sensu on Windows Server 2012 R2 on Amazon EC2](http://qiita.com/inokappa/items/eb7fe17cde71fe008b0c)
[Sensu 芸人としては外せない Windows for sensu-client を試してみる](http://qiita.com/inokappa/items/fb7f5571cc81d5e59068)
inokappa先生いつもありがとうございます
IS NOT TRUE条件つけて処理が重くなった後の試行結果

###問題発生
大したことないSQLなのにタイムアウトするぐらい時間がかかる。

```lang:PostgreSQL
SELECT count(*), columnA, columnB, columnC FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
WHERE columnA = 10
AND create_at >= '今日の日付' and create_at < '明日の日付'
AND columnD IS NOT TRUE
GROUP BY columnA, columnB, columnC
```

こんなの。

ANDで繋いだ条件のどちらか片方であれば通るが、
上記のようにするとすげえ時間かかる。


###解決策
```lang:PostgreSQL
SELECT count(*), columnA, columnB, columnC FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
WHERE columnA = 10
AND create_at >= '今日の日付' and create_at < '明日の日付'
AND columnD != TRUE
GROUP BY columnA, columnB, columnC
```

IS NOT TRUE を　!= TRUE　に変更しただけ。

開発環境は9.2.8で本番環境は9.2.2
問題が起きたのは本番環境だけ。

そもそもIS NOT ～と　!=　って同じものだと思ってたけど違うんだろうか…。
カウント数は同じなのでちょっとナゾ。
調べてわかったら続き書くかも。


###追記
もう一回元のSQLで流したら普通にできてる…
なんなんだろうほんと…

あとよく見たらcolumnDはnullとfalseが混在してて、!=だとnull取ってきてない。
⇒ != はfalseしか取ってこないんだそうな。なるへそ。

###解決策２
```lang:PostgreSQL
SELECT count(*), columnA, columnB, columnC FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
WHERE columnA = 10
AND create_at >= '今日の日付' and create_at < '明日の日付'
AND (columnD IS FALSE OR columnD IS NULL)
GROUP BY columnA, columnB, columnC
```

こうなったった。
IS NOT TRUEが鬼門だったっぽい。なんでだ？
Railsで使っているので、なんかそっち関係で間違ってた可能性も微レ存。

###追記2
思い出した。
実行計画がすごく変なことになってただけだった。
pgAdminⅢで直したんだった。
Gradle マルチプロジェクトで、特定のプラグインをapplyしているサブプロジェクトのみ設定を継承させる。


サブプロジェクトごとに異なるプラグインを適用していて、かつ特定のプラグインを適用しているプロジェクトにのみsubprojectで設定を適用させたい場合、以下のように設定できます。

```groovy:rootのbuild.gradle
subprojects { subProject ->
    group = 'jp.oreore.oreno.project'
    version = "1.0-SNAPSHOT"

    repositories {
        mavenCentral()
    }

    afterEvaluate {
        //以下のプラグインIDを含むときに特定の設定を行う
        def tPluginIds = [
                //androidアプリ
                'com.android.application', 'android',
                //androidライブラリ
                'com.android.library', 'android-library'
        ]

        //gradle 1.12以前の場合、plugins.hasPlugin、それ以降の場合、plugins.withIdが利用できます。
        //それぞれのメソッドはプラグイン識別子を指定して、プラグインがapplyされていればtrueを返します。
        //apply 'oreore.plugin'している状態で、plugins.hasPlugin('oreore.plugin')をするとtrueが返ります。
        if (tPluginIds.any { id -> subProject.plugins.hasPlugin(id) }) {
            //Androidプロジェクトのグローバル設定
            //ここでプラグインに依存する設定を書くことができます。
            android.compileSdkVersion 20
            android.buildToolsVersion "21.1.2"
        }
    }
}
```
サーバー移転のときの確認事項

サーバー移転となるとなんかいろいろあわあわするのでメモしておきます。
全部確認する必要は無いですが、とりあえず考えられるものを上げておきます。

## サーバー移転のときの確認事項

* 先にドメインだけ移管するというのは可能か（契約によってできない場合がある）。
* 上記が可能ならドメイン管理会社を教えてもらう。自社と同じならID付け替えで対応。同じでないならドメイン移管申請を出す。念のため対応できるメールアドレスが登録されているか確認もしてもらう。
* ドメイン移管の場合、ドメインの期限は移管できるくらい余裕があるか。最低1ヶ月くらい必要な場合がある。Whois使って調べられる。
* .com とかのドメイン移管申請の際、AuthCodeが必要になるのでもらう。
* メールサーバーを使っているか。
* メールアカウント一覧はあるか。
* データベースを使っているか、どんなのがあるか、バージョンはなにか。
* プログラムがあるか、どんなのがあるか、バージョンはなにか。
* サーバーにあるファイルはもらえるか、DBに入ってるデータはもらえるか（契約によってもらえない場合がある）。
* サーバーはどこを使っているか（WhoisでDNS設定を見ればたいていはわかる）、自社と同じなら、サーバーに設定してあるドメイン情報を削除してもらってすぐにこちらのサーバーでドメイン情報登録ということをしないといけないが、いつが都合がいいか。
* データはどうするか。どうしたいと思っているか。
maven-resources-pluginのフィルタリングを使って設定ファイル内で変数置換

[`pom.xml`内で`${...}`と記述することで変数置換ができる](http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Interpolation_and_Variables)ことと同様に、maven-resources-pluginのフィルタリングを利用することで設定ファイル(e.g., `system.properties`)内でも変数置換が行える。

### よくありそうなユースケース

- `pom.xml`内の`project.version`をプロパティファイル経由でプログラムが利用する
- 設定ファイルの各種パスで`project.basedir`を利用してテスト実行などではプロジェクト内で入出力を完結させる
- etc...

## そもそもmaven-resources-pluginって何ですか？

ソース以外の設定ファイルリソースなどをコピーするためのプラグイン。
http://maven.apache.org/plugins/maven-resources-plugin/

### 基本的な挙動

このプラグインが利用する項目の一部を抜粋。

```xml 
<build>
  <outputDirectory>${project.build.directory}/classes</outputDirectory>
  <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
  <resources>
    <resource>
      <directory>${project.basedir}/src/main/resources</directory>
    </resource>
  </resources>
  <testResources>
    <testResource>
      <directory>${project.basedir}/src/test/resources</directory>
    </testResource>
  </testResources>
</build>
```

- `resources:resources`ゴールで`resources`で指定しているディレクトリ以下リソースを`outputDirectory`へコピーする
- `resources:testResources`ゴールで`testResources`で指定しているディレクトリ以下リソースを`testOutputDirectory`へコピーする

単純に言えばコピーしているだけですね。

### 特定ファイルのみコピー/除外

例えば拡張子が`.txt`と`.rtf`のみコピーする場合は`includes`でパターンを指定。

```xml 
<resources>
  <resource>
    <directory>src/my-resources</directory>
    <includes>
      <include>**/*.txt</include>
      <include>**/*.rtf</include>
    </includes>
  </resource>
</resources>
```

逆に除外する場合は`excludes`でパターンを指定する。

```xml
<resources>
  <resource>
    <directory>src/my-resources</directory>
    <excludes>
      <exclude>**/*.bmp</exclude>
      <exclude>**/*.jpg</exclude>
      <exclude>**/*.jpeg</exclude>
      <exclude>**/*.gif</exclude>
    </excludes>
  </resource>
</resources>
```

## 本題：フィルタリング

フィルタリングのExamplesはこれ。
http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html


`filtering`に`true`を設定するとコピー時にフィルタリングが有効になる。

```xml 
<resources>
  <resource>
    <directory>src/main/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>
```

`system.properties`にこう書き、

```properties
version=${project.version}
```

`pom.xml`内で`<version>1</version>`となっているならば、

```properties
version=1
```

のように変換されて出力される。使える変数は`pom.xml`内と同様（のはず、明示的な言及は未確認...）。

`${project.basedir}`などももちろん利用できる。例えばログ出力パスが設定にあり、ローカル実行時は出力を`outputDirectory`以下としたければ、

```properties 
log4j.appender.C.File=${project.build.outputDirectory}/temp/a.log
```

などと書いておけばいいんじゃないでしょうか。

## まとめ

- maven-resources-pluginのフィルタリングを利用して設定ファイルなどもDRYに書きましょう
Amazon RDS for PostgreSQLで日本語を使うときにやったこと



## タイムゾーンがUTCなのでAsia/Tokyo に変更
デフォルトのパラメータグループをコピーして、タイムゾーンを日本にしたパラメータグループを新たに作る
設定後、reboot必要です。
参考：
http://recipe.kc-cloud.jp/archives/6533


## CollateとCTypeのデフォルトが en_US.UTF-8 なので変更
あとから日本語データの `order by`の順番とかが何かおかしくて気づくやつ。
DBの作成が必要です。
もし運用開始しちゃってたら一旦ダンプとってから。

```
CREATE DATABASE newdb WITH template template0 encoding 'utf8' lc_collate 'ja_JP.UTF-8' lc_ctype 'ja_JP.UTF-8';
```

もし運用するDB名が決まってたらリネーム

```
\c postgres
drop database maindb; # 最初に作られてたやつ消すとか
alter database newdb rename to maindb;
\c maindb
```
Metaioのカメラ映像をCardboard用にステレオにする

Unity MetaioSDKにはHMD用に、対象をstereoにしてくれるオプションがあるけど、
カメラ映像はstereoにしてくれないのがすげー気持ち悪かったので、お手軽にstereoにしてみた。

カメラ映像を写してるCameraは（ややこしい）
metaioSDKの中にあるDeviceCameraがCameraPlaneを見てるようなので
こいつをステレオにすれば、Cardboardで見てもステレオになるはず。

![スクリーンショット 2015-02-13 15.55.28.png](https://qiita-image-store.s3.amazonaws.com/0/29033/cdfb2cdd-4954-3f64-be9c-f2fdfe23be52.png)

DeviceCameraを左目用にして、右目カメラを追加。
名前をDeviceCameraLeftとDeviceCameraRightにしてみた。名前はなんでもいいです。

![スクリーンショット 2015-02-13 15.59.16.png](https://qiita-image-store.s3.amazonaws.com/0/29033/367f318f-fa66-8078-0ec2-b834e56956ab.png)

左目用のCameraのViewport Rectをこう
![スクリーンショット 2015-02-13 16.01.24.png](https://qiita-image-store.s3.amazonaws.com/0/29033/33f8050a-0df2-6799-79d6-19517f2393b0.png)

右目のViewport Rectをこうする
![スクリーンショット 2015-02-13 16.01.51.png](https://qiita-image-store.s3.amazonaws.com/0/29033/37f91ffd-cc7a-2b68-337b-cdea74fa14e6.png)


DeviceCameraにアタッチされてるmetaioDeviceCameraがサイズ調整をやってるみたいなので
ちょっと改造。153行目くらい。

```csharp
// update orthographic size
Camera cam = GetComponent(typeof(Camera)) as Camera;
cam.orthographicSize = getOrthographicSize(screenOrientation);
```

一個だけ処理してる部分を二個にするだけ。

```csharp
// update orthographic size
Camera cam = GetComponent(typeof(Camera)) as Camera;
cam.orthographicSize = getOrthographicSize(screenOrientation);
Camera cam2 = transform.parent.Find("DeviceCameraRight").GetComponent(typeof(Camera)) as Camera;
cam2.orthographicSize = getOrthographicSize (screenOrientation);
```


あとはCameraPlaneの位置をちょっと調整した方がいいかもしんないです。
その辺は場合によってという感じ。
Emacsで世界を滅ぼす

 1. Emacsを起動する
 2. `M-x hanoi-unix-64`を実行する
 3. 世界が終焉への道を歩み始めるので、おとなしく塔の完成を待つ
 4. 塔が完成し、世界が崩潰して滅ぶ

以上です。

![hanoi-unix-64](https://qiita-image-store.s3.amazonaws.com/0/4121/c293beab-245a-8e2b-b0fd-90da515ba810.png)


具体的な現象については[ハノイの塔 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94)をお読みください。
キーフレーズ抽出してブックマーク時のタグとして使う

# 前置き

Google Bookmark とかはてブとか使ってるけどタグつけるのめんどくさい.

# 便利なものがあった

## キーフレーズ抽出

Yahoo!JAPANデベロッパーネットワークの
[キーフレーズ抽出][y-key]を使ってタイトルを単語に分けます.
意外と形態素解析関係のAPIってないですね.

## 個人情報と引き換えにAPI利用権を得る

Yahoo!JAPAN ID とアプリケーションの登録が必要です.
Yahoo!JAPAN ID への魂の売り方はご自由に
アプリケーションの登録は[こちら][y-regi]から
魂が抜かれた気分です.

# Chrome Extention にする

説明が面倒なのでこちらを見て頑張ってください.

<a href="https://github.com/tanjo/GoogleBookmarkHelper" target="_blank">tanjo/GoogleBookmarkHelper</a>

APIキーは自分のものを使いましょう.
APIキーを変更してディレクトリをそのまま読み込むと完成です.

# はてブは？

![](http://gyazo.com/e5b8f7f657652a066c90f7f3b0be2673.png)

[はてなブックマーク GoogleChrome 拡張 - Chrome ウェブストア][hatebu-ge]

Chrome Extention に既に公式のものがあるので言及しません.
ちなみにはてブのAPIは[こちら][hatebu-api]

あと [自然言語処理技術を用いたはてなブックマークの新機能「トピック」をベータリリースしました - はてなブックマーク開発ブログ][hatena-topic] らしいのでこちらを使うとよさそうです.

# おまけ

![](http://gyazo.com/5f3ea4afeb452dfa21dcc55c5175879e.png)

最近のまとめブログのおかげでカテゴリ分類が捗りませんね.

[y-key]:http://developer.yahoo.co.jp/webapi/jlp/keyphrase/v1/extract.html
[y-regi]:https://e.developer.yahoo.co.jp/register
[hatebu-ge]:https://chrome.google.com/webstore/detail/%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF-googlechrome-%E6%8B%A1%E5%BC%B5/dnlfpnhinnjdgmjfpccajboogcjocdla?hl=ja
[hatebu-api]:http://b.hatena.ne.jp/help/entry/api
[hatena-topic]:http://bookmark.hatenastaff.com/entry/2015/02/05/190331
curlでディレクトリ階層ごとファイルをダウンロードする


とあるPDFを階層ごとダウンロードしたくてこんなパイプラインを書いてみました。

```bash
echo "http://www.hogehoge.co.jp/aaa/bbb/ccc/ddd.pdf" | \
  sed -E "s#(^http://[^/]+/)(.+)\$#./\2 \1\2#g" | \
  xargs -I {} echo "curl --create-dirs --output {}" |sh
```

こうするとダウンロードしたデータを`./aaa/bbb/ccc/ddd.pdf`に保存してくれます。
sedでURLを`./aaa/bbb/ccc/ddd.pdf http://www.hogehoge.co.jp/aaa/bbb/ccc/ddd.pdf`に分解してます。
xargsではスペースで分けてもひとつの引数として渡されちゃうみたいなのでこんな変な書き方になってます。改善案ありましたらコメントくださいませ。

MBAのコンソールで動作確認OKでした。
Self-Healing PatternによるEC2インスタンス起動失敗回避

AWSのEC2は様々な原因で起動に失敗し、Status CheckがFailureとなることがあります。
私の例ですと、ENI(Elastic Network Interface)の構成に問題が生じた(？)ことによる起動の失敗など...

そんなときのDesign for FailureとしてMulti-AZなどが考えられますが、Auto Scalingを用いたSelf-Healing Patternでも条件付ですが対処できるようです。

# Self-Healing Patternとは

- Auto Scaling GroupではインスタンスのStatus Checkに失敗すると、インスタンスの置き換えが行われることを利用

- Auto Scaling Groupの
・Minimum Size
・Maximum Size
・Desired Capacity
をすべて1に指定すると、Status Checkが失敗した際にのみインスタンスの置き換えが生じる
 -> 解決！

# 注意

Auto Scalingを使う仕様上、Self-Healing Patternを使うには、以下の条件を許容する必要があります。

・当該インスタンスはAMIからLaunchされる
・Status Checkに失敗したインスタンスはTerminateされる

この2つは裏表ですが、特に後者があるためデータの保存などに注意が必要です。
tmuxで再起動してもセッションリストア

大切に育てたsessionを守る。

## [tmux plugin manager](https://github.com/tmux-plugins/tpm)

cloneして

```
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
```

~/.tmux.conf の一番下に追記

```
run-shell '~/.tmux/plugins/tpm/tpm'
```

## [tmux-resurrect-auto](https://github.com/tmux-plugins/tmux-resurrect-auto)

自動で保存してくれるやつ。デフォルトでは60分間隔で保存するみたい。

~/.tmux.conf に追記

```
set -g @tpm_plugins '                \
  tmux-plugins/tpm                   \
  tmux-plugins/tmux-resurrect        \
  tmux-plugins/tmux-resurrect-auto   \
'
```

## 試す

設定リロード

`tmux source-file ~/.tmux.conf`

プラグインインストール

`prefix + ctrl + I`

手動で保存

`prefix + ctrl + s`

手動でリストア

`prefix + ctrl + r`

プラグインマネージャー便利。

手動で保存とか絶対忘れるに決まってる。
OSX UnityでAdreno Profilerを使う

macでAdreno Profiler使うのにちょっと手間取ったのでメモ。
環境によって違うかもしれないのであくまで参考に。

mac版Adreno Profilerなるものがあったのでダウンロードしてみたけどうんともすんとも言わない。
(´・ω・｀)ナニコレ？しぬの？
と思ったけどどうしてもwindowsで作業したくなかったので泣く泣く調べてみた。

まず中身を見ると

```shell
/Applications/AdrenoProfiler.app/Contents/MacOS/run_profiler_mac
```
これが走ってるらしいのでterminalから直接起動してみるとエラー。AdrenoProfiler.exeがないと言われる。

どうもAPP_PATHとやらがとれてないらしい。
なんか前部分でゴニョゴニョしてたけど、めんどくさいのでフルパスで入れちゃう。
macで動けばいいだけだからね！

```bash
cd "$APP_PATH/Contents/Resources"
               ↓
cd "/Applications/AdrenoProfiler.app/Contents/Resources"
```

おお、無事起動したぞ。勝った！（ほとんどなんもしてない）
と思ったら今度はADBが見つからないとか言われる。

path通ってないのかよ...
心を無にしてrun_profiler_mac内でpathを通す。
よし通った。今度こそ！

(´・ω・｀)appにprivilegesないよとか言われた...
どうやらdevelopmentbuildにするだけだとダメらしい。
player setttings の Internet Accessにチェックを入れると
android.permission.INTERNETがmanifestに設定されるみたいなので
やってみるとようやく起動。

うーん、めんどい
rsyncとlsyncdでEC2サーバーを同期する


ELBでEC2の冗長構成をとるときに、サーバー１→サーバー２に変更が自動反映されるようになります。

# 実行ユーザー作成
## 同期先サーバー

rsyncを実行するためのユーザーを作成して、書き込みを許可するためにwwwグループに追加する

```
# useradd rsync
# usermod -G www rsync 
```


sudo ができるように/etc/sudoersファイルを変更

```
# sudo visudo
```
↓これをrootの同じ設定の下に追加

```
rsync   ALL=(ALL)   ALL
```



# SSHの設定
## 同期元サーバ
鍵の作成

ルートで

```
# ssh-keygen -t rsa
```

公開鍵の取得（あとで同期先に登録するのでコピっておく）

```
# cat .ssh/id_rsa.pub
```
## 同期先サーバ
さきほど取得した鍵をauthorized_keysに登録(末尾に改行して貼り付け)

```
# cd /home/rsync
# mkdir .ssh
# cd .ssh
# touch authorized_keys
# vi authorized_keys ←ここで貼り付け 
```

権限の変更

```
# chmod 600 authorized_keys
# cd ../
# chmod 700 .ssh
```


SSHの設定変更。

```/etc/ssh/sshd_config
PubkeyAuthentication yes
```

SSHの再起動

```
# /etc/rc.d/init.d/sshd restart
```


## 同期元サーバー
接続できるか確認する


```
# ssh rsync@xxx.xxx.xxx.xxx 
```

# lsyncdの設定
## 同期元サーバー

### lsyncdのインストール
```
$ sudo yum install --enablerepo=epel lsyncd
```
### lsyncdの設定ファイル

target のとこは同期先のサーバーとディレクトリ

```conf:/etc/lsyncd.conf
settings{
        insist = true,
        statusFile = "/tmp/lsyncd.stat",
        logfile = "/var/log/lsyncd/lsyncd.log",
        statusInterval = 1,
}

sync {
   default.rsync,
   source = "/var/www/",
   target = "rsync@xxx.xxx.xxx.xxx:/var/www/",
   rsync = {
      archive = true
   }
}

```

lsyncdを再起動

```
# /etc/rc.d/init.d/lsyncd restart
```

# 確認
## 同期元サーバー

```
$ tail /var/log/lsyncd/lsyncd.log
```

これで同期元の/var/www以下に変更が生じたら、自動的に同期先に反映されるはず。
レガシーコード改善ガイド 第一章


## 変更する理由
1. 要件の追加
2. バグの修正
3. 設計の改善
4. リソース利用の最適化

## 要件の追加とバグの修正
問題なのは振る舞いが変更されるかどうかということ。

* 振る舞いの追加　→　既存の振る舞いに変更はなくバグは発生しない
* 振る舞いの変更　→　既存の振る舞いに変更があり、バグが発生する可能性がある

## 設計の改善
みんな設計を改善したいと思っていてもなかなかできないのは、それを行う過程で振る舞いが変わってしまったりしてバグを作ってしまうことになるから。

リファクタリングの作業の定石として、以下の手順がある。

1. 振る舞いが変更されていない事を保証するテストを書く
2. リファクタリングを行う
3. テストを実行してパスすることを確認する

リファクタリングは小さな構造修正を行う。一気に行わない。機能を変更すべきではない。

※ ただ全ての振る舞いを1でテストできているか把握するのが難しい

## 変更のまとめ
システムの変更作業を行った時に変わる可能性があるのは、「構造」「機能」「リソース利用」の３つ。

||要件追加|バグ修正|リファクタリング|最適化|
|:--|:--|:--|:--|:--|
|構造|変化する|変化する|変化する|-|
|新機能|変化する|-|-|-|
|機能|-|変化する|-|-|
|リソース利用|-|-|-|変化する|

（既存）機能が変化するのはバグ修正のみで、バグ修正でも変更されない既存機能に比べると変更される機能はわずか。

## 変更理由ごとに変更箇所をまとめることのメリット
#### 良い点
* 何に集中すべきなのかがわかる

#### 解決できていない点
* 集中すべきは変更箇所だけでなく、どうすれば残りの振る舞いを変えずに済ませることができるかという問題を解決する必要がある

変更を安全に行うために最も重要なことは影響範囲を理解すること。

## 危険な変更
変更を行いながら振る舞いを保つのは非常に困難、リスクを伴う
リスクを緩和するために次の３点を考慮する必要がある

1. どんな変更を行わなければならないか
2. 変更が正しく行われたことをどうすれば確認できるか
3. 何も壊していないことをどうすれば確認できるか

しかし、すべての作業をやり終えた後で、その変更が正しいこと、既存の振る舞いを壊していないことを判断できる人などいるのか？
iTunes connectで　ページにエラーが 1 個以上含まれています。　で全くわからない状態を解決



初めてiOSアプリの申請をしたのですが、よくわからず１時間以上もはまりました。

原因は、価格の設定をしてないからでした、、、、ずっとはまってました。

ページ内にエラーはないのに、なんでこれが出続けるのが不明でした。

はまらないようにUPしておきます。

エラーが 1 個以上含まれています。
というiTunes connect です。


↓このエラーがでたときの対応。

![Gyazo_-_7f45319fef177f57797318476c1d6027_png.png](https://qiita-image-store.s3.amazonaws.com/0/44315/9676d31e-29bf-98bb-c80c-6e5fa179739f.png "Gyazo_-_7f45319fef177f57797318476c1d6027_png.png")
pom.xmlの各要素デフォルト値と変数置換について

Mavenドキュメントの以下ページに関するメモです。

Introduction to the POM
http://maven.apache.org/guides/introduction/introduction-to-the-pom.html

> Project Inheritance と Project Aggregation は端折ります :p

## そもそも`POM`って何よ？

`Project Object Model`です。プロジェクト自身の情報(e.g., プロジェクト識別子, バージョン番号, 開発者名, etc...)とビルド設定(e.g., 成果物ファイル名, ソースディレクトリ, 出力ディレクトリ, 依存ライブラリ, etc...)などを記述したxmlファイルで、これを入力にMavenさんがせっせと動きます。

## Super POM

全てのPOMはSuper POMを継承します。自分のプロジェクトの`pom.xml`で指定しない値はSuper POMで定義されている値となります。

## 各要素デフォルト値

つまりSuper POMの値を確認すればOKという話。例えば`<build>`以下のデフォルト値を一部抜粋するとこの通り。

```xml
<build>
  <directory>${project.basedir}/target</directory>
  <outputDirectory>${project.build.directory}/classes</outputDirectory>
  <finalName>${project.artifactId}-${project.version}</finalName>
  <testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
  <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
  <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
  <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory>
  <resources>
    <resource>
      <directory>${project.basedir}/src/main/resources</directory>
    </resource>
  </resources>
  <testResources>
    <testResource>
      <directory>${project.basedir}/src/test/resources</directory>
    </testResource>
  </testResources>
</build>
```

`${project.artifactId}`というのは変数置換で、これは後述します。

## Minimal POM

継承されるデフォルト値以外で、必ず自分のプロジェクトで設定しなければならない値は4つのみ。最小のPOM記述は以下となる。

```xml 
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>
```

デフォルト値の一つにパッケージングタイプ(e.g., `jar`, `war`, `ear`, etc...)がある。全てのMavenプロジェクトはパッケージングタイプを持ち、そのデフォルトは`jar`になる。

> でもこれはSuper POMに記述されていない値なので、その定義などは後で調べよう...

## `pom.xml`内の変数置換

DRY(Don't Repeat Yourself)の精神で、複数箇所に書かなければいけないような値を変数化したり、pre-definedな変数を`pom.xml`内で利用できる。

```xml
<version>${project.version}</version>
```

`${...}`が変数置換される。

### Project Model Variables

`pom.xml`内のSingle value elementな値は変数として参照できる。例えば、

- `${project.groupId}`
- `${project.version}`
- `${project.build.sourceDirectory}`

のように、これらの値は`project.`とプリフィクスを持つ。

### Special Variables

`pom.xml`内に記述されているものではない特別な変数。

変数名 | 値
----- | ---
project.basedir	| プロジェクトのディレクトリパス
project.baseUri	| プロジェクトのディレクトリURI
maven.build.timestamp | ビルドを開始時点のタイムスタンプ

### Properties

ユーザー定義変数として利用できる。

```xml 
<project>
  ...
  <properties>
    <mavenVersion>2.1</mavenVersion>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-artifact</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-project</artifactId>
      <version>${mavenVersion}</version>
    </dependency>
  </dependencies>
  ...
</project>
```

`/project/properties`以下に任意の要素名で複数定義可能。特段のプリフィクスがないことがポイントか。

### 追記: Environment variables

以下ページに変数置換で使えるものの詳細が書いてある。
http://docs.codehaus.org/display/MAVENUSER/MavenPropertiesGuide

`${env.M2_HOME}`のように`env.`プリフィクスで環境変数も利用できる。

## まとめ

- POMの各要素デフォルト値が知りたくなったらSuper POMを確認しよう
- 変数置換を利用して`pom.xml`はDRYに書こう
rej.pl - 汎用多重起動防止スクリプト

汎用的に使える多重起動防止用スクリプトについて共有させていただきます。

https://github.com/kokoromati/rej.pl

## 使用イメージ
```
$ ./rej.pl -k test -c "sleep 10" &
[1] 26343
$ ./rej.pl -k test -c "sleep 3"
rej : 2015-02-13 11:27:14 : sleep 3
[1]+  終了                  ./rej.pl -k test -c "sleep 10"
```
上記の例は、test というキーを指定して sleep コマンドを実行し、１回めのコマンドが終了しないうちに２回めのコマンドを実行すると多重起動が防止（reject）される様子を表しています。

## クーロンでの使用イメージ
```
REJ=/home/kokoromati/util/rej.pl
REJLOG=/home/kokoromati/log/rej

* * * * * $REJ -k hoge -c /home/kokoromati/hoge.sh >> $REJLOG/stdo_hoge.log 2>&1
```

## 作成動機
シェルスクリプトなどをクーロンで定時実行させる場合、そのシェルスクリプトごとに多重起動防止の機能を毎回入れるのは面倒なので作りました。

## そのほかの特徴
### その１：ログが意外と便利
クーロンなどで定時実行されているコマンドは、いつ起動されていつ終了しているのか、そして多重起動防止が働いたのか否かなど、特別に記録をとるようにしない限りよくわからず見通しが悪いです。そのてん当スクリプトを使うと勝手にログを記録してくれるので調査の時に意外と役にたったりします。

```
$ ./rej.pl -k test | tail
inf : 2014-08-31 21:28:53 : AbEnd clear ...

in  : 2014-08-31 21:28:55 : sleep 3
out : 2014-08-31 21:28:56 : sleep 3 (2)
inf : 2014-08-31 21:28:56 : AbEnd alarm !!!

in  : 2015-02-13 11:27:08 : sleep 10
rej : 2015-02-13 11:27:14 : sleep 3
out : 2015-02-13 11:27:18 : sleep 10 (0)
inf : 2015-02-13 11:27:18 : AbEnd clear ...
```

### その２：異常終了時のメール機能が便利
定時実行させている処理が異常終了すると大概困ります。その異常終了をメールで知らせてくれるので便利です。異常終了が連続している場合、毎回メールを飛ばすのはそれまた困るので、メールを送るのは初回のみです。
qiita > ユーザ名を変更した時の検索結果 / マニュアル移行

もともとのユーザ名をsevenofnineとしていたのを入力のしやすさのため7of9に変更した。

これによって自分の投稿の検索がうまくいかなくなっている。

これまでの投稿は40投稿ある。

qiitaのページ左上にある「キーワードを入力」で `user:7of9`として検索した時には20投稿しか出てこない。`user:sevenofnine`として検索した時には残りの20投稿が出てくる。

ユーザ名を変更した時、検索のインデックスがうまく変更されないのだろうか。

とりあえずは
http://qiita.com/7of9/items
を見ると全部(40投稿)が表示される。ただ、自分の投稿を検索しようとすると、上記の問題にひっかかり、２つのuserで検索しないと自分の投稿が検索できないので面倒です。

<hr>
(2015年2月16日 追記)
今日見たら`user:sevenofnine`の投稿数が1つ減り、その分が`user:7of9`に追加されていたようだ。
何かのきっかけでuser情報が変更されるのかもしれないが、時間がかかりあまり好ましくない。

<hr>
(2015年2月23日 追記)
この時点でも`user:sevenofnine`の投稿数は2月16日と変わらなかった。このまま２つのユーザ名で検索というのも面倒くさい。

何か方法はないかと考えて試したのが「編集を行うこと」だった。「編集」ボタンを押して何も足さずに保存すると、その記事のユーザ名が7of9に変更された。
SnapDish画像配信サーバーとアップロードについて

料理写真をs3へ移行したので、再度、簡単に構成をまとめてみた。
この構成で月間数千万（まだ億には届いていない、行きたい）単位の画像を大中小を配信している。

# 構成
| 項目 | 内容 |
|:-----------|:------------ |
| エッジ | Cloudfront |
| オリジン | リサイズ用途 c3.large x 2 |
| フィルター | nginx_image_filterを使用 |

![Screen Shot 2015-02-13 at 12.07.49 PM.png](https://qiita-image-store.s3.amazonaws.com/0/18766/485bb7b9-b76b-b241-03f8-62d8f0e13e86.png "Screen Shot 2015-02-13 at 12.07.49 PM.png")
_GridFSを一時保存に使っているのは、過去の遺産でいずれS3へ移動する予定。_

# 画像のアップロード
* クライアントからAPPサーバー経由で画像をアップする
* アップロードスピードを体感てアップするために、一時保存領域に、先に画像をアップしておく
* 一時領域にアップが完了しIDを取得したら、画像以外とそのIDをアップしs3へ画像を移動する

# 画像の取得
* クライアントからCloudfrontに画像をリクエスト
* Cloudfrontからフィルターサーバー画像を取得しにいき、Expiresは3時間に設定
* 投稿直後の約3時間がアクセスが多いので3時間に設定
* フィルターサーバーのプロキシ経由でs3にある画像を取得しに行き、リサイズして返す
* 画像が無ければ404へ

# 課題
* Cloudfrontの費用をもっと抑えたい
* Appサーバー経由でアップロードする箇所を見直したい
* キャッシュのコントロールをもう少し整理したい

など、他にも考えるところがありそう
Autometerで選択文字列を置換：AppleScript版


応用例："x"という文字列を選択してCmd+kを押すと"\mathbf{x}"にしたい．

# Autometerで作成

- 新規作成でサービスを作る
- 「AppleScriptを実行」をつかう
 - 「選択されたテキストを出力で置き換える」をチェック
 - 「次の選択項目を受け取る」は「テキスト」
- 中身はこれ．

```AppleScript:表示するだけ
on run argv
	
	set output to ("\\mathbf{" & (item 1 of argv) & "}")
	
end run
```

- "to_mathbf"という名前で保存する．多分保存先は自動的に`/User/yourname/Library/Services/`以下．


# 次は「システム環境設定」

- 「キーボード」の「ショートカット」を開く．
- 「サービス」のどこかにto_mathbfがあるので探す．
- それにショートカットキーを割り当てる．たとえばCmd+Kに．

# では実行

何かでテキストを選択したままCmd+Kを押すと，実行される．

実行されない場合にはそのソフトを再起動してみる．


# ToDo

もっと高速化したい．1秒ぐらい．AppleScript版でも意外に遅かった．
小さなお友だちの為の　MacOsXでBASIC #14　極方程式からの正葉線 r = sin3θ


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#極方程式を媒介変数形に変形
極方程式でr=f(θ）の場合
媒介変数表示では
x=f(θ）*cos(θ)
y=f(θ）*sin(θ)
r=sin(3θ）の場合、正葉戦となります。
プログラムとしては、以下のコード

##14.BAS
```bas:14.BAS
10 DEF f(t)=SIN(3*t)
20 SET WINDOW -1,1,-1,1
30 DRAW grid
40 FOR t=0 TO 2*PI STEP PI/360
50    PLOT LINES: f(t)*COS(t), f(t)*SIN(t);
60 NEXT t
70 END
```


##実行結果
おお！きれいに描画できてます。
![スクリーンショット 2015-02-13 12.26.38.png](https://qiita-image-store.s3.amazonaws.com/0/33317/760a406a-8ebe-8b52-52ca-7503c6cb23d7.png "スクリーンショット 2015-02-13 12.26.38.png")
Autometerで選択文字列を置換：bash版


応用例："x"という文字列を選択してCmd+kを押すと"\mathbf{x}"にしたい．

# Autometerで作成

- 新規作成でサービスを作る
- 「シェルスクリプトを実行」をつかう
 - 「入力の引き渡し方法」は「stdinへ」
 - 「選択されたテキストを出力で置き換える」をチェック
 - 「次の選択項目を受け取る」は「テキスト」
- 中身はこれ．

```perl:「シェルスクリプトを実行」でperlを呼び出すだけ
perl -e 'chop( $cmd = <STDIN>); print "\\mathbf{" . $cmd . "} \n"'
```

- "to_mathbf"という名前で保存する．多分保存先は自動的に`/User/yourname/Library/Services/`以下．


# 次は「システム環境設定」

- 「キーボード」の「ショートカット」を開く．
- 「サービス」のどこかにto_mathbfがあるので探す．
- それにショートカットキーを割り当てる．たとえばCmd+Kに．

# では実行

何かでテキストを選択したままCmd+Kを押すと，実行される．

実行されない場合にはそのソフトを再起動してみる．


# ToDo

もっと高速化したい．サービスからシェルスクリプトを呼び出し，さらにperlを呼び出すので，遅い．1秒ぐらい．
CentOS6にGit v2.2.2を入れる


* http://qiita.com/tarr1124/items/77c2378291029756f478 

を参考にさせて頂きました。ありがとうございます。
自身の環境 (CentOS6) では、幾つか余分な手順が必要でしたので、再まとめ。

# 手順

> 以降、rootで作業してます.

まず、標準の ``` git version 1.7.1 ``` を消す.

```
$ yum erase perl-Git
```

GitのソースをDownload & 展開.

```
$ curl -LO https://www.kernel.org/pub/software/scm/git/git-2.2.2.tar.gz
```

展開して、Directoryに入る.

```
$ tar xzvf git-2.2.2.tar.gz
$ cd git-2.2.2/
```

ビルドに必要な外部PackageをInstallする.

```
$ yum install -y libcurl-devel
$ yum install -y perl-ExtUtils-MakeMaker
$ yum install -y expat-devel
$ yum install -y openssl-devel 
```

Git v2.2.2をビルド＆Installする.

```
$ make prefix=/usr/local all
$ make prefix=/usr/local install
```

確認してみる.

```
$ git --version

git version 2.2.2
```
Basic認証のVirtualHost上でのかけ方

## Basic認証×VirtualHostの方法が「手順」で書かれているものがなかったのでmemo

**1. バーチャルホストが記入されているファイル作成(Ex. vhost-httpd.conf)**

```
<VirtualHost *:"サービスを開いているポートNo(Ex. 80)">
    ServerName "サービスのドメイン名(Ex. example.jp)"
    DocumentRoot "サービスのドキュメントルート(Ex. /home/***)"
    <Directory **"サービスのドキュメントルート（Ex. /home/***)">
      AuthType Basic
      AuthUserFile "passの位置(Ex. /home/***/***/.htpasswd)"
      AuthName "'ユーザー名'"
      Require valid-user
  </Directory>
<virtual host>
```

**2. パスワードファイル作成**

```htpasswd -c "passを置くディレクトリ/.htpasswd" "Basic認証のユーザー名"```
```パスワード入力を求められるので入力```

**3. 試す**
実際にアクセスして上記で入力した
　* Basic認証のユーザー名
　* パスワード
で閲覧できれば成功

**参考**
http://qiita.com/WizowozY/items/e8b49552c16dfe0ff184
Slack を入れたらまず行うべきだと思う設定

Slack では相手のユーザ名を指定しての mention (言及) ができ、自分宛てのメッセージだけ通知を行う、ということができます。
また、mention を使うと Recent Mentions として一覧化することができるので、たとえば休暇明けでも大事なメッセージを流し読みすることができます。

全員がこの設定になり、それを前提にコミュニケーションするだけで体験が結構変わると思ってます。
非同期コミュニケーションをストレスなく行うためには必須の設定でしょう。

# 公式アプリをインストールする

:congratulations:  2015/03/18 に Windows 版の公式クライアントもリリースされました!

Windows/Mac/iOS/Android のそれぞれに公式アプリが用意されているので、インストールしましょう。

* [ダウンロードページ](https://slack.zendesk.com/hc/en-us/articles/201746897-Slack-apps-for-computers-phones-tablets)

Linux を使っている場合は後述の「Linux でデスクトップアプリっぽくする設定」を参照してください。

# 通知の設定

1. 画面左下の自分の自分のユーザ名のところをクリック
2. Preferences をクリック
3. Desktop Notifications の Only for Highlight Words and direct messages にチェック

![f73e64ea852c1ceefebb814cabe3c16d.png](https://qiita-image-store.s3.amazonaws.com/0/208/ae6e3297-3b7b-18ea-7b18-3e501b26bf85.png)

# Linux でデスクトップアプリっぽくする設定

デスクトップアプリは Linux には用意されていませんが、Google Chrome のアプリケーションショートカットを利用すれば、限りなくそれっぽくなります。

1. Google Chrome で Slack にログインする
2. Google Chrome のメニュー → その他のツール → アプリケーションのショートカットを作成
3. 必要なものにチェックを入れて「作成」を押す

また、Preferences デスクトップ通知も On にしましょう。
デスクトップ通知の許可を求められたら許可してください。

# 関連記事

* [何故 Skype ではなく Slack なのか](http://qiita.com/yuya_takeyama/items/948c11e184ec7cba1206)
array_randやshuffleの乱択精度を改善しよう

# `mt_rand`

PHPに精通している方はほぼ全員ご存じだと思いますが、PHPには乱数生成関数として `rand` の他に `mt_rand` というものもあります。

- [PHP Manual - rand](http://php.net/manual/ja/function.rand.php)
- [PHP Manual - mt_rand](http://php.net/manual/ja/function.mt-rand.php)

マニュアルを見る限り、後者の方が精度が良いようです。

# `mt_array_rand`, `mt_shuffle`

`array_rand` や `shuffle` は内部で `rand` を使用しています。もし `mt_rand` を使用したい場合は、自分で関数を定義する必要があります。

### 実装例

```php:mt_array_rand
function mt_array_rand(array $array, $num = 1) {
    static $max;
    if (!$max) {
        $max = mt_getrandmax() + 1;
    }
    $num = (int)$num;
    $count = count($array);
    if ($num <= 0 || $count < $num) {
        return null;
    }
    foreach ($array as $key => $_) {
        if (!$num) {
            break;
        }
        if (mt_rand() / $max < $num / $count) {
            $retval[] = $key;
            --$num;
        }
        --$count;
    }
    return !isset($retval[1]) ? $retval[0] : $retval;
}
```

```php:mt_shuffle
function mt_shuffle(array &$array) {
    $array = array_values($array);
    for ($i = count($array) - 1; $i > 0; --$i) {
        $j = mt_rand(0, $i);
        $tmp = $array[$i];
        $array[$i] = $array[$j];
        $array[$j] = $tmp;
    }
}
```

# `openssl_rand`, `openssl_array_rand`, `openssl_shuffle`

暗号学的な安全性まで求めたい場合はこちらで。

**追記: PHP7以降では[`random_int`](http://php.net/manual/ja/function.random-int.php)が使用出来ます。自分で怪しい関数を実装する必要は無くなりました。**

### 実装例

```php:openssl_rand
function openssl_rand($min = 0, $max = PHP_INT_MAX) {
    $min = (int)$min;
    $max = (int)$max;
    $range = $max - $min;
    if ($range <= 0) {
        return $min;
    }
    $log    = log($range, 2);
    $bytes  = (int)($log / 8) + 1;
    $bits   = (int)$log + 1;
    $filter = (int)(1 << $bits) - 1;
    do {
        $rand = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes))) & $filter;
    } while ($rand > $range);
    return $min + $rand;
}
```

```php:openssl_array_rand&nbsp;(openssl_randに依存)
function openssl_array_rand(array $array, $num = 1) {
    $num = (int)$num;
    $count = count($array);
    if ($num <= 0 || $count < $num) {
        return null;
    }
    foreach ($array as $key => $_) {
        if (!$num) {
            break;
        }
        if (openssl_rand() / (PHP_INT_MAX + 1) < $num / $count) {
            $retval[] = $key;
            --$num;
        }
        --$count;
    }
    return !isset($retval[1]) ? $retval[0] : $retval;
}
```

```php:openssl_shuffle&nbsp;(openssl_randに依存)
function openssl_shuffle(array &$array) {
    $array = array_values($array);
    for ($i = count($array) - 1; $i > 0; --$i) {
        $j = openssl_rand(0, $i);
        $tmp = $array[$i];
        $array[$i] = $array[$j];
        $array[$j] = $tmp;
    }
}
```

# ベンチマーク

誰か性能いいマシン持ってる人試してください(丸投げ)
【mysql】実行中のクエリ一覧

画面が固まったときにtopコマンドで見るとmysqlが100%に張り付いていて、どのSQLが原因だってときにやったことをメモ。


SQLにログインして現在実行しているSQL一覧を取得。

```sql
show processlist;

'SQL全文を表示するためには末尾に\Gをつける。
show processlist \G;
```


SQLを強制終了したい場合は、processlistのID項目でkillする。

```sql
kill ID項目
```

※Linux上でkillじゃないんで注意。

参考：[MySQLで実行中のクエリ一覧を見て、SQLを強制終了する方法](http://tech.basicinc.jp/MySQL/2013/04/20/mysql_kill_process/)
Visual Studio Community 2013でもInstallShieldLEを入手できる。

Visual Studio Community 2013でもInstallShieldLEを入手できる。

http://support.microsoft.com/kb/2900817/ja
Visual Studio 2012、2013 における InstallShield のサポートについて 
>Visual Studio 2010、Visual Studio 2012、Visual Studio 2013 では、Windows インストーラー形式のインストーラーを作成可能なプロジェクトとして、InstallShield Limited Edition を追加し使用することができます。

やった。
Vagrantで導入したUbuntuにSambaを導入してWindowsから共有する。

標準のSynced Folderは便利なのですが、パス長の制限に引っかかることがあったので、Sambaでの共有を試してみました。


## Sambaのインストール

Ubuntu側の ```/share``` ディレクトリをユーザー ```vagrant``` で共有する場合。

```
apt update
apt install samba
mkdir /share
chmod 777 /share
```

## Sambaの設定

```/etc/samba/smb.conf``` を編集します。

[global]セクションに

```
   map archive = no
```

を追加し、 ```smb.conf``` の最下部に以下を追記します。

```
[share]
   path = /share
   writeable = true
   force user = vagrant
   force group = vagrant
   guest ok = yes
   guest only = yes
```

## 共有ディレクトリへのアクセス

service smbd restart

で設定ファイルを反映させ、

Windows側からエクスプローラーで ```\\192.168.33.10\share``` にアクセスすればOK。

## smb.conf の説明

```
   map archive = no
```

これを書かないとWindows側で作成したファイルに実行属性が付いてしまう。

```
   force user = vagrant
   force group = vagrant
```

Sambaのユーザーとグループを強制的に設定する。
vagrantのデフォルトはvagrant:vagrantなのでそれで。