OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10 Hyper-VとVMware Workstation 12 Playerの共存

共存での問題
---
Windows 10でHyper-Vの役割を有効化しているPCでVMware Workstation Playerを共存させて利用する場合、何の手も施さないとVMware Workstation Playerから以下の様なエラーメッセージが表示され、機能を利用する事が出来ない。

![image](https://qiita-image-store.s3.amazonaws.com/0/112606/282e0e06-e0e6-1194-a2b8-ead3220587db.png)

対処方法
---
有効化したHyper-Vの役割を無効化したくない為、ブート構成データを編集し、Hyper-Vの有効化/無効化を切り替え、VMware Workstation Playerを利用する。

Hyper-V無効化
---
**※「管理者として実行」からバッチ実行し、編集を有効化する為にPCの再起動が必要となる。**

```lang:Disable_Hyper-V.bat
@echo on
C:\Windows\System32\bcdedit.exe /set hypervisorlaunchtype off
pause
C:\Windows\System32\shutdown.exe -r -f -t 0
```

Hyper-V有効化
---
**※「管理者として実行」からバッチ実行し、編集を有効化する為にPCの再起動が必要となる。**

```lang:Enable_Hyper-V.bat
@echo on
C:\Windows\System32\bcdedit.exe /set hypervisorlaunchtype auto
pause
C:\Windows\System32\shutdown.exe -r -f -t 0
```

利用環境
---
Windows 10 Pro
VMware Workstation 12 Player (12.1.0 build-3272444)
【R】多重比較（TukeyHSD）

※統計・Rどちらも初心者なので、間違いなどあれば指摘をお願いします。

#Rを使用して多重比較を行う

多重比較を行いたいときの方法。
複数の群をそれぞれ比較して、アルファベットをつける。

##環境
- Mac Book Air (Mavericks 10.9.5)
- R (version 3.2.3)

##手順
1. パッケージmultcompのインストール
2. データの読み込み
3. ANOVA検定で分散を確認
4. TukeyHSD

##スクリプト
```lang:TukeyHSD
#パッケージの読み込み
library("multcomp", lib.loc="/Library/Frameworks/R.framework/Versions/3.2/Resources/library")

#データの読み込み
data <- read.csv("~/Documents/data.csv", header=TRUE)
#行に名前をつける（csvファイルの列名でも問題ない場合は省略可）
data2 <- data.frame(ch=data$地点,solid=data$固体,liquid=data$液体,gas=data$気体)

#ANOVA検定で分散を確認
##aov(比較したい項目~群の名前, data=データフレーム名）
aov <- aov(solid~ch, data=data2)
#検定の結果を出力
anova(aov)

#Tukey検定を実施
result <- glht(aov, linfct = mcp(ch = "Tukey"))
cld(taju29, level = 0.05)
```


##結果の見方
```lang:filename
##ANOA検定の結果
> anova(aov)
Analysis of Variance Table

Response: soild
          Df  Sum Sq Mean Sq F value    Pr(>F)    
ch        13 1008.08  77.545  42.297 4.832e-16 ***
Residuals 31   56.83   1.833                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#帰無仮説: 分散に差があり、その差は誤差に比べて有意である
#"***"と表示されているので、帰無仮説が採択され、今回の測定値の平均値には差があるといえる
#よって、多重比較を行うことは適当である

##多重比較の結果
地点1   地点2  地点3  地点4     地点5   地点6   地点7  地点8   地点9  地点10 地点11   地点12   地点13 地点14 
 "bce"   "ce"    "f"    "f"   "de"   "ab"    "e"   "ac"  "ace"   "ce"    "a"    "e"    "e"  "acd" 


```
※2016/03/01 編集済み（指摘ありがとうございます）

##参考
[統計ソフト「R」を用いて多重比較し、アルファベットを付ける方法](http://aonori1118.hatenablog.com/entry/2015/01/02/010501)
Rでtrying to use CRAN without setting a mirrorと言われたら

# 概要

パッケージを入れようとして、以下のようなエラーメッセージにあうことがある。
新規に環境を作ったときなど。

```
trying to use CRAN without setting a mirror
```

# 結論1、設定ファイルに書く

~/.Rprofile

```
options(repos = structure(c(CRAN = "http://cran.ism.ac.jp/")))
```

# 結論2、インストール時に指定する。

```
install.packages('RUnit', repos = "http://cran.us.r-project.org")
```
printf 整数の桁そろえ、0埋め メモ

oFいじっててつまずいたのでメモです。
C言語ばりばりの方々には基礎すぎるかもですが

覚え方→ **%桁数d**

```c:sample
    int a = 10000;
    int b = 500;

    printf("aは%5dです",a); // aは10000です
    printf("bは%5dです",b); // bは  500です
```


0埋めしたい場合
覚え方→ **%0桁数d** 

```c:sample

    int a = 10000;
    int b = 500;

    printf("aは%05dです",a); // aは10000です
    printf("bは%05dです",b); // bは00500です
    printf("bは%04dです",b); // bは0500です
```
RailsでハマるIDとコードのお話

ワタシ、もともとネットワークエンジニアだったのですが、なぜか業務アプリを作ることになってしまいました。10年ちょっと前は、となりのERPチームは大変だなー、と思っていたんですが。

そして、なりゆきで始めたプログラマとしては最底辺におります。その最底辺の悩みを紹介します。

業務アプリの世界は、殺伐としています。ユーザー部署の要望が、ロジックエラーだらけで素直に実装するとエライことになるんです。ERP導入失敗はだいたい語り尽くされた感がありますが、親身なERPエンジニアが居るところほど失敗してしまうんじゃないかと思います。

もし、業務に対して「ここ違うんじゃないですか？」などと口答えをすると、ソロバンで計算してた時代の大先輩から「おまえ若造が何を言うかー」とげんこつが飛んできそうな雰囲気なのです。

そして、転職したらなぜかワタシがベトナム人と一緒に業務アプリを作ることに。そして、悩んだのはやっぱり泥臭い別のところでした。

# レガシーシステムの自然キーと、いまどきフレームワークの人工キー

古いシステムは、だいたい自然キーを主キーに使っています。

具体的に言うと、0で始まったり、AとかLとかZとかの文字列型。教科書ではたぶんこんな感じだったんですね。銀行コードとかの例が分かりやすいでしょう。

**統一金融機関コード**

```
0005 三菱東京UFJ銀行
0009 三井住友銀行
```


固定長のデータ時代の名残なのでしょう。弊社のDBにも、そういう主キーのIDがありました。これをそのまま使い続けると、いまどきのフレームワーク(Rails)の良さが全く生きません。

いまどきのフレームワークは、人工キーで自動採番された整数型が主です。1から自動でインクリメントされていく感じです。100までいって、レコードをクリアすると1にはもどらず、1-100が欠番で101からスタートします。コレを見ると、自然キーで誤解できないように指定したほうがいいなと自分でも思います。

**失敗した設計その１**

```
Banksテーブル
  id(pk) integer(ここには0005とか入らない)
  name string

Peopleテーブル
  id(pk) integer
  name string
  bank_id integer(ここには0005とか入らない)
```

ここで、Bank.idに0とかGとかで始まる文字列をぶち込むわけにはいかないのです。魔改造したらいきなり負の遺産になります。ためしに0005をぶち込んだら、みごとに000が綺麗に切り取られて”5"になりました。

# どうやって折り合いをつけるか

伝統的な設計にもとづいてPKに自然キーを使うと、あとで非常にめんどくさいというか、Railsで使うのは無理です。

テーブル間のrelationshipを考えると、何らかの形で人工キーをつかったフレームワークのデフォルトに乗る必要があります。

Rails1.2.4時代に業務システムを最初に作った時はシステムIDとローカル設定のIDを分けてみました。
初心者なのでアホでした。もちろん、_idが予約語なので動きません。

**失敗した設計その２（うごかない）**

```
Banksテーブル
  id(pk) integer
  local_id string(ここには0005とか入る)
  name string

Peopleテーブル
  id(pk) integer
  name string
  bank_local_id string(ここには0005とか入る)
```

_idは規約でNGだよって覚えた結果、こんなふうにしました。 localidっていう接尾語、どう考えてもイケていません。あのころのワタシにはこれが限界でした。


**失敗した設計その３（うごくけど、いけてない）**

```
Banksテーブル
  id(pk) integer
  localid string(ここには0005とか入る)
  name string

Peopleテーブル
  id(pk) integer
  name string
  bank_localid string(ここには0005とか入る)
```

このダメダメなDBがずっと生き残ってるのがもう申し訳なくて、Salesforce化してくれたときは本当に嬉しかったです（すでに異動してましたが）

このシステムは野良ツールとして生をうけ、なぜか社内公式トレーニング対象になったのにだれも正式なエンジニアがアサインされずに5年くらい第一線で活躍しました。貢献をちゃんと評価してください。


# 自然キーはキーだと思わないほうがいい。

そしてGYAOにやってきて、あれから5年ぶりくらいに、予算を書く仕事から自分でコードを書く仕事になってしまいました。そして再度、この大して重要じゃないんだけれども、気になる問題にぶつかったのです。

そこで再度考えなおして、検索するときは自然キーで、自動でrelationshipやeager loadingするときは人工キーで行うのがちょうどいい落とし所だろうと思うようになりました。

# 英語が少しできるようになって、ようやくハラオチする解決策が

伝統的に、hogehogeIDと呼ばれていた番号体系の名前を、RailsのDB内部ではcodeという名前に変えてみました。

```
Banksテーブル
  id(pk) integer
  code string(ここには0005とか入る)
  name string

Peopleテーブル
  id(pk) integer
  name string
  bank_id integer(ここには12とか入る)
```

関連を組むと、People.bank.nameとかでRailsの仕組みを生かして銀行名が引けます。
銀行を探すときは、bank = Bank.where(code: “0005”)みたいな感じで検索すれば、昔ながらの番号体系で探しだすことができます。

# エンジニアの最大の弱点は、英語でした。

さんざん悩んだオチは、「エンジニアは英語がダメ」ということでした。社内で使われてたIDは、Railsの世界で通用するIDではなかったのです。

じゃあ、どうしたらよかったかといえば、codeと読んでおけばよかったのです。そういえば銀行のコードは、「統一金融機関コード」といいました。

最初から、これがcodeだったら整数でも文字列でもなにを放り込んでも違和感ゼロです。これで、ようやくレガシーシステムを現代化する切り口が開けた気がします。

自分がコードを設計するときは、あとのエンジニアが悩まないように気楽にほげほげIDなんて名前は付けないことにします。結局、英語で生まれたコンピューター技術なので、英語で考えてればこんなアホな問題にハマることは無かったということでした。

結論：いけてるDB設計ができるように、みんな英語を勉強しよう
Chromebookで開発環境を整えるためにしたこと

## ChromeOSでの開発環境を整える

Chromebook Pixel 2015を開発環境として購入したものの、ChromeOSで開発できるようにするには少し手間だったのでメモ書き。

* 開発者モードに切り替える
    * データが消えるので真っ先にやる！
* chromebrewを入れる
* vimのインストールと設定
* プログラムを実行できるようにマウントし直す

## 開発者モードに切り替える

まずは開発者モードに切り替えます。
ChromeOSはターミナルでcroshが使えますが、開発者向けのOSではないので、通常だとほぼ何もできません。
また、開発者モードに切り換えする時にローカルのデータやアカウントの連携情報などがすべて吹っ飛ぶので、開発環境として使いたい人は何よりもまず先に開発者モードに切り替えましょう（何度もGmailアカウントにログインする羽目になります）。

一応手順を書いておきますが、ChromeOS 開発者モードでググった方が画像とかあって分かりやすいかと思います。

### リカバリ画面

電源を落とします。

次にESC + 再読み込み(最上段→の右にある&#x27F3;こんな感じの奴)+電源ボタンで起動してリカバリ画面に入ります。

    Chrome OS missing or damaged.

こんな感じの物騒なメッセージが出ればリカバリ画面です。

Ctrl+Dを押し、次の画面でEnterを押します。

### 確認画面


次の画面でまたCtrl+Dを押します。

ビープ音が鳴ったり上にカウントダウンが出たりいろいろします。

それらが終わった後スペースキーを押すとデータが消されて初めの状態に戻ります。

### 最初の設定

キーボードや言語、アカウント紐付けなど最初の設定を行ってください。

### 開発モードになっているか確認方法

ChromeOSの設定が終わったら、ブラウザを開いてCtrl+Alt+Tでターミナルを開きます。
タブ内にchroshが立ち上がるので、以下のようにしてshellを起動します。

    $ shell

開発者モードでない場合はここで見つからないとか言われてshellが起動しません。もう一度やり直しましょう。起動したら成功です。

## chromebrewを入れる

パッケージ管理ソフトを入れます。
またインストール時にさまざまな開発環境を入れてくれるので、大体はこれで事足ります。

    $ wget -q -O - https://raw.github.com/skycocker/chromebrew/master/install.sh | bash

結構時間がかかりますが、gitとかgccとかpython3とかperlとかいろいろ入ります（が後述するようにvimとかlessはないです）。

インストールが終わると。crewコマンドが使えるようになります。

## vimのインストールと設定

vimとlessはインストール時に入らないので入れます。
またvimは初期設定しないと使い辛いので最低限設定しておきます。

    $ crew install less
    $ crew install vim

次に最低限の設定をします。

    $ vim ~/.vimrc

設定内容は以下です。

    set number
    set title
    set ambiwidth=double
    set tabstop=4
    set expandtab
    set shiftwidth=4
    set smartindent
    set nrformats-=octal
    set virtualedit=block
    set whichwrap=b,s,[,],<,>
    set backspace=indent,eol,start

とりあえずコピペしておけば入力モードでカーソルが変な入力文字になったりしなくなります。
タブスペース周りはお好みで。

## プログラムを実行できるようにマウントし直す

ChromeOSでは基本自作プログラムが実行できません。
/usr/local/bin以下では実行可能なので、そこにディレクトリを作って利用する(ホームディレクトリからリンクを張る)、という手段もありますが、Goのインストールをしようとしたら[公式Wiki](https://github.com/golang/go/wiki/ChromeOS)に次のような記述がありました。

    sudo mount -i -o remount,exec /home/chronos/user/

マウント時に実行できないようにしてるので、実行権限与えて再マウントすればOKということらしいです。ChromeOSもGoも同じGoogle製なので、これがGoogle的公式なやり方と思われます。
ダウンロードしたファイルは/home/chronos/user/Downloads/ですし、/home/chronos/user/以下を実行できるようにしておけば問題ないでしょう。

こちらはshell起動時に再マウントするように設定しておきます。

    $ vim ~/.bashrc

さっきのコマンドを最下行に追加します。

    sudo mount -i -o remount,exec /home/chronos/user/

これで/home/chronos/user/以下でプログラムが実行できるようになります。

ここまで設定すれば、最低限の開発環境が整ったと思いますので、あとはいろいろしてみてください。

2016/02/29現在、以下の環境インストールに関してはちょっと工夫が必要です。

* Go言語
    * crew install go は失敗するので、公式のやり方でインストールする(バージョンもcrewは1.4に対しこちらは最新が使えるので、手動で入れましょう)。
    * https://github.com/golang/go/wiki/ChromeOS
* Node.js
    * ~~crewからnodejsが消えているので、こちらも手動で入れる必要があるようです。~~
    * [ChromeOSにNode.jsをnvmでインストールする](http://qiita.com/Hiroki_M/items/f1af64fa0d6807d1cbb0) 記事書きました。nvm経由で入れるとインストールが簡単です。

----

## ちょっとどうでもいいこと

USキーボードのPixelがほしかったのでUS Amazonで輸入したところ、USキーボードじゃなくてUKだったorz（どこにもUKって書いてなかったぞ）
ただ、キーボードをUS、日本語入力もキーボードをUSにしておけばUSキーボードと同じ配列で入力できるので、とりあえず問題なし。

Ctrl+スペースで日本語入力と切り替えが可能です。

## もうちょっとどうでもいいこと

ブラウザの艦これが動くのでFlashは動くっぽいことが分かったものの、JavaがないのでMinecraft等は動かない模様。
croutonを入れてLinux入れてその上でなら動くっぽい。
複数のサーバでインタラクティブにコマンドを実行する

最初 ssh username@hostname "コマンド" の形式で動いていたけど、途中でvirtualenvのworkonを実行すると「command not found」と言われたのでRubyで並列実行してみた。
Ruby便利ー

```ruby
# ruby 2.1.5
require 'pty'
require 'expect'

def run console, host
    timeout = 10
    PTY.spawn "ssh #{host}" do |r, w, pid|
        w.sync = true
        r.expect console, timeout do
            w.puts "date"
        end
        r.expect console, timeout do |capture|
            # captureは[マッチした文字列, 正規表現のキャプチャ1, ...]
            lines = capture[0].split "\n"

            # linesの1行目は前回実行したコマンド、最終行はプロンプトなので削る
            return lines.slice(1, lines.size - 2).join "\n"
        end
    end
end

def main console, hosts
    $expect_verbose = false
    threads = []
    result = {}

    hosts.each do |host|
        threads << Thread.start do
            result[host] = run console, host
        end
    end
    threads.each do |thread|
        thread.join
    end

    result.keys.sort.each do |host|
        puts "#{host} : #{result[host]}"
    end
end

if __FILE__ == $0
    console = /\$$/
    hosts = (1..10).map{|n| "username@example-#{n}.com"}
    main console, hosts
end
```
改行コードの確認


Unix系のサーバ上で動作させるスクリプトをWindows端末で作成することが多い。
Windows上で作成するときに忘れがちな `改行コード` 。

誤った `改行コード` のままサーバに作成したスクリプトを配置して実行してもきちんと動作しない。
サーバにスクリプトを配置した時は下記のコマンドを実行して、 `改行コード` が正しいか確認した方が良い。

-
# 1.コマンド

下記のコマンドにて改行コードを確認できる。

````コマンド
$ od -c [ファイル名]
````

それぞれの改行コードは下記のように表示される。

| OS         | 改行コード | 「od -c」での見え方 |
|------------|------------|---------------------|
| Unix       | LF         | \n                  |
| Mac（OSX） | LF         | \n                  |
| Mac（OS9） | CR         | \r                  |
| Windows    | CR+LF      | \r\n                 |

-
# 2.実行例

テスト用に下記の3ファイルを準備。

````
tests-MBA:test $ ll
total 48
-rw-r--r--@ 1 test  staff  20  2 29 20:05 test001	★Unix版
-rw-r--r--@ 1 test  staff  20  2 29 20:05 test002	★OSX版
-rw-r--r--@ 1 test  staff  24  2 29 20:05 test003	★Windows版
tests-MBA:test test$ 
````

実行結果は下記の通り。

````
tests-MBA:test test$ od -c test001
0000000    t   e   s   t  \n   t   e   s   t  \n   t   e   s   t  \n   t
0000020    e   s   t  \n                                                
0000024
tests-MBA:test test$ 
tests-MBA:test test$ 
tests-MBA:test test$ od -c test002
0000000    t   e   s   t  \r   t   e   s   t  \r   t   e   s   t  \r   t
0000020    e   s   t  \r                                                
0000024
tests-MBA:test test$ 
tests-MBA:test test$ 
tests-MBA:test test$ od -c test003
0000000    t   e   s   t  \r  \n   t   e   s   t  \r  \n   t   e   s   t
0000020   \r  \n   t   e   s   t  \r  \n                                
0000030
tests-MBA:test test$ 
````
A5:SQL Mk-2をWindows7にインストールする手順

# やりたいこと

* A5:SQL Mk-2 x64 を Windows7 にインストールする。

## 前提環境

* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64

## インストールするソフトウェア

* A5:SQL Mk-2: 2.11.4 (x64)

## 手順

### 圧縮ファイルをダウンロード

[Vector - A5:SQL Mk-2](http://www.vector.co.jp/soft/dl/winnt/business/se422726.html) で A5:SQL Mk-2(x64 edition) 2.11.4 (x64) の **ダウンロードページへ** を選択し、圧縮ファイルをダウンロードします。

### 解凍

**a5m2_2.11.4_x64.zip** を解凍します。
1. 解凍先のディレクトリ: C:\Program Files\a5m2_2.11.4_x64

### 起動する実行ファイルのショートカットを配置

これは実行ファイルのショートカットをデスクトップに配置するだけです。
1. 実行ファイル: C:\Program Files\a5m2_2.11.4_x64\A5M2.exe
2. A5M2.exe を実行

### A5:SQL Mk-2 設定情報保存先の選択

1. [設定ファイル]ボタンを選択

### A5:SQL Mk-2 64bit edition (Portable mode) Version 2.11.4

1. [はい(Y)]ボタンを選択

### 起動パスワードの設定

1.　新パスワード: 任意
2.　新パスワード(確認): 任意
3.　[OK]ボタンを選択

### A5:SQL Mk-2 64bit edition (Portable mode) Version 2.11.4

1. [OK]ボタンを選択

### 完了
{} に to_json をかましまくる

```rb
> {}.to_json.to_json.to_json.to_json.to_json.to_json.to_json.to_json.to_json.to_json
=> "\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"{}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""
```
pythonで巨大なファイルをソートする


`subprocess.Popen`の挙動の勉強になったので、忘れないようにメモ

pythonで巨大なファイルを扱うときは、全てをメモリに載せないよう、イテレータを使っての逐次処理を非常に頻繁に行う。
が、`sorted()`関数は巨大なファイルに対しては使えない。これはイテレータをリストに変換してから処理を行うため。

巨大なファイルをソートしたいときはUnixシステム側のsortを使う

```py3

import subprocess
def sorted_file_generator(filename):
    proc = subprocess.Popen(['sort', filename], stdout=subprocess.PIPE)
    while True:    # while を使って1行ずつ受け取る
        line = proc.stdout.readline()
        if line:
            yield line.decode('utf-8').strip()    # 返り値はバイトコードなのでデコードする
        else:
            break

```

この例はpython3です。
2の場合は、バイトの取り扱いが違うはず
Spring bootでSSL（HTTPS）を有効にする

### はじめに
以下のURLを和訳しただけです。
[https://www.drissamri.be/blog/java/enable-https-in-spring-boot/](https://www.drissamri.be/blog/java/enable-https-in-spring-boot/)
簡単でした。

### Step1. SSL証明書を取得する
本番の場合はどこか適切なところでお金を払ってSSL証明書を取得してください。
開発版なら以下のようにして作れます。Linuxで作るか、Windowsでもcygwinがあれば作れます。

```
keytool -genkey -alias tomcat
 -storetype PKCS12 -keyalg RSA -keysize 2048
 -keystore keystore.p12 -validity 3650

Enter keystore password:mypassword
 Re-enter new password:mypassword
 What is your first and last name?
 [Unknown]:
 What is the name of your organizational unit?
 [Unknown]:
 What is the name of your organization?
 [Unknown]:
 What is the name of your City or Locality?
 [Unknown]:
 What is the name of your State or Province?
 [Unknown]:
 What is the two-letter country code for this unit?
 [Unknown]:
 Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
 [no]: yes
```

### Step2. HTTPSを有効化する
設定ファイルに書くだけです。

```application.properties
server.port: 8443
server.ssl.key-store: keystore.p12
server.ssl.key-store-password: mypassword
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat
```

`keystore.p12`の場所は任意の場所に置けそうです。デフォルトではプロジェクトホームを探します。

あとは`https://localhost:8443`にアクセスしてみてください。

### Step3. HTTPからHTTPSへリダイレクトする
試していないので省略
DateTimeクラスで平日のリスト

自分用メモです。
PHPで用意されてるDateTimeクラスだと自然言語的な感じで欲しい日付が取れたりする。しかし、平日が欲しいときに平日くださいと入れても出てこない。なんともならず苦肉の策です。もうちょっと簡単にならないかなー。


```php:DateTime.php
$date_list = [];
	$week_day = ['日', '月', '火', '水', '木', '金', '土'];
for ($i=0; $i < 31; $i++) {
	$date = new DateTime('+'.(String)$i.'days');
	if ((int)$date->format('w') !== 0 && (int)$date->format('w') !== 6) {
		$year = $date->format('Y');
		$month = $date->format('m');
		$day = $date->format('d');
		$youbi = $date->format('w');

		$date_list[] = $year.'年'.$month.'月'.$day.'日'.$week_day[$youbi].'曜日';
	}
}

```
アンドロイドで特定条件だとPDFファイルが開けなかった件について

#アンドロイドで特定条件だとPDFファイルが開けなかった件について

## 現象

かなり限定的な状況ですが

- アンドロイドデフォルトのブラウザを使用
- 日本語ファイル名のPDFをダウンロードして開く
- 開くのはアンドロイドデフォルトのPDFリーダー
- ヘッダーの「Content-Type」が「application/octet-stream」

以上の条件が集まるとなんとPDFが開けないという問題が発生！

「ファイルを開くことができません」などと言われる・・・。

とりあえず該当の箇所は、CakePHP1.3のMediaViewを利用してダウンロード。

## 検証

- ファイル名を半角英数に変更

＞ 開ける・・・

- app/webrootにおいて直接ダウンロード

＞ 開ける・・・

- iphone

＞ 開ける・・・

- アンドロイドのAdobeReaderで開いてみる

＞ 開ける・・・

## という訳で

[Live HTTP Headers](https://addons.mozilla.org/ja/firefox/addon/live-http-headers/)で監視して、ヘッダーが「application/octet-stream」なことが変だなーとずっと思って

- ヘッダーを無理やり「Content-Type」を「application/pdf」に設定

＞ 開けた！

## 原因

CakePHP1.3のMediaViewですが、[この辺](https://github.com/cakephp/cakephp/blob/1.3.21/cake/libs/view/media.php#L149)にずばり今回の問題が！

・・・`'download' => true`だと問答無用で「application/octet-stream」かよ・・・

CakePHP2はソースを追ってませんが、こんな動作せずにちゃんとアンドロイドで開けたので多分だいじぶ・・・。

社内で

```
＿人人人人人人人＿
＞　CakePHP1.3　＜
￣Y^Y^Y^Y^Y^Y￣
```

とか言われて悲しくなったけど強く生きる。

## まとめ

ファイルダウンロード時のContent-Typeはちゃんと指定しましょう！(当たり前)
Warning: Orphan instanceを回避する

Haskellの型クラスを実装する際、Orphan instanceという警告が出ることがある。以下が警告の例。

```
Foundation.hs:204:10: Warning:
    Orphan instance: instance PersistUserCredentials User
    To avoid this
        move the instance declaration to the module of the class or of the type, or
        wrap the type with a newtype and declare the instance on the new type.
```

この警告が出るのは、instanceを宣言しているモジュールが、型が宣言されているモジュールでも型クラスが宣言されているモジュールでもない場合（orphan=孤児）。

これを解消するにはinstance宣言を移動するか、あるいはnewtypeで新しい型を作り出して、その型に対してinstance宣言を追加する。

しかし、このどちらの解決策も取れないケースが、存在するかもしれない。

熟考の末、Orphan instance警告を無理に消すのが不適切だという結論が出た場合、以下のプラグマを書くことで抑制できる。

```hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
```
Java、Android初心者向けへの参考資料まとめ

本ページでは、プログラミング初心者向けに学習サイトやリファレンス、コーディング規約などの情報をまとめています。

# 参考になるサイト・参考書集

参考書を買わなくても、入門サイトを通して無料で学習できます。
下記サイトがおすすめです。
本勉強会では触れられていない部分も書かれていますので、目を通しておくとよいかもしれません。

[・Java入門]
(http://www.javadrive.jp/start/)
[・Java 入門｜TECHSCORE]
(http://www.techscore.com/tech/Java/JavaIntro/index/)
[・一番かんたんなJava入門]
(http://nobuo-create.net/)
[・Java入門 (全23回)]
(http://dotinstall.com/lessons/basic_java)

ネットを見てもよくわからない、どこからやればいいかわからない方は参考書の購入をおすすめします。
下記の参考書がおすすめです。

[・スッキリわかるJava入門 第2版 (スッキリシリーズ)](http://www.amazon.co.jp/dp/484433638X/ref=zg_bs_515820_1)

# リファレンス

リファレンスとは、機能や仕様についてまとめてある辞書のようなものです。
Javaには様々な機能があり、それらをすべて覚えるのは不可能です。例えば、あるメソッドについて使い方や処理内容を調べる場合、リファレンスを活用して調べてみましょう。
[・Java™ Platform, Standard Edition 7 API 仕様](http://docs.oracle.com/javase/jp/7/api/)

# コーディング規約

どのプログラミング言語にも、コーディング規約が存在します。コーディング規約とは、読みやすいコードを書くためのルールのことです。
読みやすいコードを書くことで、後のメンテナンスが楽になるなどのメリットがあります。
時間のあるときに、ぜひ目を通しておいてください(特に命名規則のあたりは見ておいたほうが良いです)。
ただし、会社によって異なる場合がありますのでご注意ください。
[・Java コーディング標準]
(http://www.objectclub.jp/community/codingstandard/CodingStd.pdf)

# Android Studio、Eclipseのショートカットキー

ショートカットキーを有効活用することで、効率よくプログラミング作業を進めることができます。
以下は私がよく使うショートカットキーです。他にもいろいろあるので、興味のある方は調べてみてください。

## Mac OSXの場合
| 入力キー | 説明 |
|:-----------|:------------|
| Command + c | コピー |
| Command + v | 貼り付け(ペースト) |
| Command + x | 切り取り(カット) |
| Command + a | 全て選択 |
| Command + z | 1つ前の状態に戻る |
| Command + s | 保存 |

## Windowsの場合
| 入力キー | 説明 |
|:-----------|:------------|
| Ctrl + c | コピー |
| Ctrl + v | 貼り付け(ペースト) |
| Ctrl + x | 切り取り(カット) |
| Ctrl + a | 全て選択 |
| Ctrl + z | 1つ前の状態に戻る |
| Ctrl + s | 保存 |

開発でEclipseやAndroid Studioを使用する場合、それぞれ独特のショートカットキーが用意されています。下記サイトが参考になります。
[・Eclipse(エクリプス)良く使うショートカットキー]
(http://www.shikaku-pass.com/sjcp6/eclipse-shortcutkey.html)
[・Android Studio ショートカットキーリスト for Mac](http://qiita.com/Tazake/items/5c725a8b68d13271d43d)

# エラーの解決方法

プログラミングをやる上で、エラーは避けては通れません。
エラーを解決する方法としては下記が挙げられます。

・エラー内容をGoogleで検索する
・デバッグ機能を使い、プログラムの流れをチェックする
・質問サイトに投稿する
・わかる人に聞く(最終手段)

## 質問サイト

質問サイトは主に下記サイトがあります。
[・Stack Overflow]
(http://stackoverflow.com/)
[・teratail【テラテイル】]
(https://teratail.com/)

## デバッグ

デバッグとは、プログラムを実行しながら、ソースコードの誤りを探すことです。
デバッグの詳細に関しては、下記サイトを参考にしてみてください。
[・EclipseによるJavaアプリケーションのデバッグ]
(http://www.oki-osk.jp/esc/eclipse3/eclipse-debug.html)
[・Androidの便利なデバッグ手法](http://qiita.com/kazy/items/252bfc2d88d8899a95d5)
[・[Android Studio] 開発を始める前に知っておきたい基本的な使いかた](http://dev.classmethod.jp/smartphone/android/android-studio-basic/)
javascript:Dateにフォーマッター追加

prototype拡張して

```javascript:
Date.prototype.toFormattedString = function(format, weeks) { 
if (weeks == undefined) weeks = ["sun","mon","tue","wed","thu","fri","sat"];
return format.replace(/yyyy/g, this.getFullYear())
.replace(/MM/g, this.getMonth()+1)
.replace(/dd/g, this.getDate())
.replace(/E/g, weeks[this.getDay()]);};
```

呼び出す

```javascript
var d = new Date();
console.log(d.toFormattedString("yyyy-MM-dd(E)"))
```

以上。
renderとredirect_toの違い

redirect_toはアクションを経由してビューを出力するのに対して、

renderはアクションを経由せずそのままビューを出力する。


なので、renderを使う時はそのrender先のビューで使う変数は
そのrenderのメソッド内で定義しなければならない。


render先が別コントローラーのビューだったりする場合に注意が必要。
Raspberry piをエミュレートする（Mac / QEMU / Raspbian）

MacでRaspberry piをエミュレートできたのでメモしておきます。
普段、VMWare Fusionを使ってるいるので、Raspbianもインストールできると思ったのですができませんでした。
それで、調べたらQEMUならできそうなのでやってみました。


#やったこと

###QEMUのインストール
brew install qemu

###QEMUの起動（失敗）
[qemu-kernel](https://github.com/dhruvvyas90/qemu-rpi-kernel)をダンロード、解凍
[公式](https://www.raspberrypi.org/downloads/raspbian/)から、2016-02-09-raspbian-jessie-lite.imgをダウンロード、解凍

```shell-session
~ cd ~/Downloads
~ qemu-system-arm -kernel kernel-qemu-4.1.13-jessie -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2016-02-09-raspbian-jessie-lite.img
```
起動できない・・・

```shell-session
~ cd ~/Downloads
~ qemu-system-arm -kernel kernel-qemu-4.1.7-jessie -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2016-02-09-raspbian-jessie-lite.img
```
起動できない・・・


###QEMUの起動（成功）
raspbian-jessieでは起動できない？ようなので、前のバージョンのraspbian-wheezyをインストールすることにしました。
[qemu-kernel](ps://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu)をダウンロード
[2015-05-05-raspbian-wheezy.zip](http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2015-05-07/)をダウンロード、解凍

####初回起動
```shell-session
qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash" -hda 2015-05-05-raspbian-wheezy.img
```

######/etc/ld.so.preload 編集

```
#/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so
```

######/etc/udev/rules.d/90-qemu.rules 作成

```
KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"
```

#####終了
````
# exit
````


####起動

````shell-session
qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2015-05-05-raspbian-wheezy.img
````
sqlite3をWindows7にインストールする手順

# やりたいこと

* sqlite3 を Windows7 にインストールする。

## 前提環境

* OS: Microsoft Windows 7 Professional 6.1.7601 Service Pack 1 (SP1) ビルド 7601 x64
* [Ruby: 2.2.4 (x64)](http://qiita.com/bu-son/items/abc9a100f5ab11063212) インストール済み


## インストールするソフトウェア

* sqlite3: 3.11.0 2016-02-15 17:29:24

## 手順

### 圧縮ファイルをダウンロード

[SQLite Download Page](https://sqlite.org/download.html) で **sqlite-tools-win32-x86-3110000.zip** を選択し、圧縮ファイルをダウンロードします。

### 解凍

**sqlite-tools-win32-x86-3110000.zip** を解凍します。
1. 解凍先のディレクトリ: C:\sqlite-tools-win32-x86-3110000

### sqlite3の実行ファイルをRubyのインストール先に配置

**sqlite3.exe** をRubyのインストール先に移動します。

1. 移動元: C:\sqlite-tools-win32-x86-3110000\sqlite3.exe
2. 移動先: C:\Ruby22-x64\bin\sqlite3.exe

### インストール後の確認

コマンドプロンプト(cmd)で下記のコマンドを実行します。

```bat:cmd.exe
sqlite3 -version　:: <= 実行するコマンド
3.11.0 2016-02-15 17:29:24 3d862f207e3adc00f78066799ac5a8c282430a5f
```

### 完了
xfs error


VirtualBoxのlinuxがxfs_errorで起動しないとき

GParted Live imageダウンロード
起動ディスクに設定
xfs_repair -Lv /dev/[name]

nameにはerrorが起きているファイルを指定。
エラーが起きているときは起動時に下記のようなエラーが出るはずなので、dm-0だとわかる
XFS (dm-0): Failed to recover EFIs
擬似的にPOSTでリダイレクトする


諸事情により POST で受けて POST へリダイレクトする必要が生じたのですが、どうやら一筋縄ではいかないようです。

- [POST をリダイレクトすると GET になる件について調べた](http://kiririmode.hatenablog.jp/entry/20131202/p1)
- [redirect_to using POST in rails](http://stackoverflow.com/questions/985596/redirect-to-using-post-in-rails)

そこで、応急処置として自動で submit する form を利用して擬似的に POST を POST でリダイレクトさせてみました。

# 実装例
creat アクションのあと、POST で 完了画面を描画するという処理を実装してみます。

## From
特定の URL へ自動で submit するだけの必要最低限のものを準備します。

```slim:app/views/shared/redirect_form.html.slim
doctype html
html
  head
  body onLoad="document.forms[0].submit()"
    = form_tag @redirect_path
```

## Controller
リダイレクト先の URL を渡し、redirect 用 form を render します。
この先、layout は不要ですので、false を渡しておきます。

```ruby:app/controllers/hoges_controller.rb
class HogesController < ApplicationController
  def create
    @hoge = Hoge.create(hoge_params)
    
    if @hoge.save
      @redirect_path = completed_hoges_path
      render "shared/redirect_form", layout: false
    else
      render :new
    end
  end
end
```

## Routes
本題と関係ないですが、描画する complete アクションは以下のように設定しています。

```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :hoges do
    collection do
      post "completed", to: "hoges#complete"
    end
  end
end
```

これで、僅かに白い画面が描画された後、/hoges/completed へ POST リクエストが送られる、POST での擬似的なリダイレクトが実現できました。

# まとめ
邪道感は拭えませんが、手間はかなり少ない手法だと思います。

また、世の中の POST 後に一瞬だけ白くなって完了画面に遷移するサイトって、このへんの POST で受けて POST で別ページを表示したい都合なのかなぁとやってて思いました。

もう少しスマートな方法がありましたらご教示ください :bow:
Requeue時のキューの挿入順序について

https://www.rabbitmq.com/semantics.html

>Message ordering guarantees

>Section 4.7 of the AMQP 0-9-1 core specification explains the conditions under which ordering is guaranteed: messages published in one channel, passing through one exchange and one queue and one outgoing channel will be received in the same order that they were sent. RabbitMQ offers stronger guarantees since release 2.7.0.

>Messages can be returned to the queue using AMQP methods that feature a requeue parameter (basic.recover, basic.reject and basic.nack), or due to a channel closing while holding unacknowledged messages. Any of these scenarios caused messages to be requeued at the back of the queue for RabbitMQ releases earlier than 2.7.0. From RabbitMQ release 2.7.0, messages are always held in the queue in publication order, even in the presence of requeueing or channel closure.

2.7.0から仕様が変更になり、リキューされたキューは一番最後尾に追加されるのではなくキュー内の元居た場所に戻されるようになる。
この仕様変更によりキュー内での順序性がより強く保証されることになるが、ワーカーのエラーを誘発するような変なメッセージがいると、そいつが延々とワーカーをブロックしつづける危険性がある。

単純にリキューするのではなく、DeadLetterQueueの活用も検討するとよいかもしれない。

http://www.rabbitmq.com/dlx.html
Raspberry Pi ディスプレイの余白をなくす

Raspberry Piをモニターに出力した時、全画面表示されず周りに余白？ができます。
この余白を消す記事はたくさんありますが、情報が錯綜しているため、自分の環境で実現したことを記事にします。
僕の環境では、下記を実行しただけで全画面表示が実現できました。

```bash
$ sudo raspi-config


9 Advanced Options
↓
A1 Overscan
↓
<Disable>
```

これで再起動するだけです。
他の設定値をいじらなくても試せるため、ぜひ試してみてください。
VCCWとWordMoveでWordPressの開発環境を便利に！


##WordMoveの機能
開発環境と本番環境の間でのWordPress環境の **PUSH** と **PULL**です。
開発環境での作業はテーマやプラグインをGitで管理し、WordPressサイトは自体はWordMoveを使って一気に本番環境にPUSHすることができます。
(既に出来ている本番環境と同様の開発環境を作るためにPULLを使うことも出来る)

WordMoveの **PUSH/PULL** は環境すべてを一気にやるだけではなく、テーマだけ、プラグインだけ、アップロードファイルだけ、データベースだけといったことも可能。

データベースの内容をPUSH/PULLする際には、開発環境と本番環境でのURLの違い（wordpress-local.comとwordpress.com）も対応してくれる。

##Movefileを編集する
`vagrant up` した直後のMovefileは、開発環境側の設定だけがされており本番環境側の設定が空白になっています。なので、本番環境側の設定を追記する必要がある。

```
staging:
  vhost: "本番環境のURL"
  wordpress_path: "WordPressが導入されているディレクトリ" # use an absolute path here
 
  database:
    name: "データベース名"
    user: "MySQLのユーザ名"
    password: "MySQLのパスワード"
    host: "localhost"
 
  ssh:
    host: "SSHホスト"
    user: "SSHユーザ名"
  #   password: "password" # password is optional, will use public keys if available.
    port: 22 # Port is optional
    rsync_options: "--verbose" # Additional rsync options, optional
```

(WordMoveでは本番環境へのファイル転送の方法として、SSHとFTPが使える)

##WordMoveを使う
```
vagrant ssh
 
（以下、ゲスト側で）
cd /Vagrant
wordmove pull --all
```

##コマンド
`wordmove -h` でコマンドがでてきます！

##参考
https://firegoby.jp/archives/5644
http://private.hibou-web.com/archives/5415

##やりたい
Github から WordPress のテーマを自動更新するとめちゃくちゃ快適だった
https://torounit.com/blog/2016/01/20/2176/
VCCWでWordPressのローカル開発環境を構築


##VCCW
まずはこれにそって進める。(カスタマイズなんかも下のほうに記載されてる)
http://vccw.cc/

**miya0001さんが作った**
Github:https://github.com/naokomc/vagrant-chef-centos-wordpress/blob/master/README-ja.md


###VCCWの主要な中身
LAMP環境
WP-CLI
Node.js（grunt、gulp）
git/Subversion
Sass
WordMove


###こんなエラーが起きた！！少しハマった。

```
An error occurred in the underlying SSH library that Vagrant uses.
The error message is shown below. In many cases, errors from this
library are caused by ssh-agent issues. Try disabling your SSH
agent or removing some keys and try again.
 
If the problem persists, please report a bug to the net-ssh project.
 
timeout during server version negotiating
```

以下のVagrantfileのコードをコメントアウトする。

```
vb.customize ['modifyvm', :id, '--natdnshostresolver1', 'on']
```

コメントアウトしたら、VirtualBoxで起動しちゃってるやつを一旦削除して、もう一回 `vagrant up`

少し時間がかかるけど、完了したら http://192.168.33.10/ にアクセス。
http://192.168.33.10/wp-admin/ で管理画面にログインできる。
Username: admin
Password: admin

参考:http://hacknote.jp/archives/16835/


##デプロイ手順はこんな感じ
vccw環境の用意
WordMove設定ファイルの用意（FTPの接続情報、本番環境のDB接続情報などの設定）
ローカル環境へプル
テーマ／プラグイン開発
本番環境へデプロイpush

##コマンド
VirtualBoxからGUIてきに操作できるけど、ターミナルで操作する場合は `vagrant -h` で調べればOK。

##日本語化
Vagrantfileと同じディレクトリに `site.yml` というファイルを設置して以下のように記述。

```
lang: ja
```

参考:https://firegoby.jp/archives/6109


##参考
http://www.slideshare.net/akinoritateyama/wordbenchvagrant?next_slideshow=1
http://codechord.com/2015/05/vccw-wordmove-wordpress/
http://qiita.com/naru0504/items/58011181f2c271808c7f
http://xxxx7.com/2015/02/23/100002
C#でフォルダ内のすべてのファイルを取得してツリーを記述する処理書いたんで自分用にメモ((φ(･д･｡)


Unityでプラグインを作成したり、パッケージングした時に、 ReadMeを作らなければならない事が多く、
毎回ファイルツリー書いてるのアホみたいなので、いい加減自動化した。
出力はUnityのDebug.Logでやってるけど、別の書き方すればおｋ。

ロジックは使えまわせそうなので、メモ


##出力結果
```
Assets
	┣ Dir1/
	┃	┣ File11
	┃	┣ File12
	┃	┣ File13
	┃	┣ Dir14/
	┃	┃	┣ Dir141/
	┃	┃	┃	┣ File1411
	┃	┃	┃	┣ File1412
	┃	┃	┃	┣ File1413
	┃	┃	┃	┣ File1412
	┃	┃	┗ Dir142/
	┃	┃		┗ File1421
	┃	┗ Dir15/
	┃		┗ File151
	┗ Dir2/
		┗ File21
```


##実際の処理
関数名が適当なのはご愛嬌。


```cs:Sample.cs
	public static void aaaa()
	{
		string result = "";
		GetFileTree ( ref result );
		Debug.Log( result );
	}
	
	private static void GetFileTree( ref string result, string root = null, string ex = "" )
	{
		// folder 
		if( root == null )
		{	
			root = Application.dataPath;
			result += getFile( root );
			ex += "\t";
		}
		string[] paths = Directory.GetDirectories( root, "*", SearchOption.TopDirectoryOnly );
		string[] files = Directory.GetFiles( root, "*", SearchOption.TopDirectoryOnly );
		List<string> children = new List<string>();
		children.AddRange(files);
		children.AddRange(paths);
		children.RemoveAll((s) => { return s.EndsWith( ".meta" ); } );
		for( int i = 0; i < children.Count; ++i )
		{
			string prefix = ex;
			string path  = children[i];
			// pathがフォルダかどうか
			bool   isDir = File.GetAttributes( path ).Equals( FileAttributes.Directory );
			// 第五のファイルかどうか
			bool   isEnd = i == children.Count - 1;
			if( isDir )
			{
				// フォルダなので、自分をRootに再帰呼び出し。
				if( !isEnd )
				{
					result += "\n" + ex + "┣ " + getFile( path ) + "/";
					prefix += "┃\t";
				}
				else
				{
					result += "\n" + ex + "┗ " + getFile( path ) + "/";
					prefix += "\t";
				}
				
				GetFileTree( ref result, path, prefix );
			}
			else
			{

				// ファイルなので、ファイル名を記述
				result += "\n" + ex + ( isEnd ? "┗ " : "┣ " ) + getFile( path );
			}
		}

	}

	private static string getFile( string path )
	{
		string[] strs = path.Split( "/"[0] );
		if( path.EndsWith( "/" ) )
		{
			return strs[ strs.Length - 2 ];
		}
		return strs[ strs.Length-1 ];
	}
c++ builder > インデックス付きコンポーネントのデバッグ > 案:フォーカス移動 / ヒント使用 / 構造使用 / オブジェクトインスペクタ使用

```txt:動作確認
C++ Builder XE4
```

デザイン実装後のデバッグ方法の案。

関連 http://qiita.com/7of9/items/312157c93766faf461ce

各項目に対して50個のコンポーネントを追加して、そのコンポーネントにインデックス付きの名前をつけるとする。
(XX_min51, ..., XX_min100)
(XX_max51, ..., XX_max100)
(XX_status51, ..., XX_status100)
(XX_check51, ..., XX_check100)
(XX_target51, ..., XX_target100)
[名前は実際のものとは変えている]

上記の追加コンポーネント(50 x 6 = 300)に対して、名前付けは手作業でしており、その作業が失敗するのをどう見つけるか。

### 案1 > フォーカス移動

ボタンを用意して、ボタン押下時にインデックスを増やしながらFocusを移動していく。
見ていくなかでフォーカスの動きがおかしい場合は、そのあたりのコンポーネントの名前付けが失敗している。

時間ができたときにでも実装しよう。


### 案2 > ヒント使用

ShowHintを使う案も考えた。
以下のコードをFormShow()において実行すれば、TEditのすべてのコンポーネントがHintにてそのコンポーネント名を見れるようになる。

問題はHintの表示に3秒弱程度かかること。

300 * 3秒 = 900秒 = 15分。
こちらの案は小数のコンポーネントでしか使えそうにない。

```
	TComponent *ptarget;

	for (int idx=0; idx<ComponentCount; idx++) {
		ptarget = this->Components[idx];
		if (dynamic_cast<TEdit *>(ptarget) == NULL) {
			continue;
		}
		TEdit *edtPtr = (TEdit *)ptarget;
		edtPtr->ShowHint = true;
		edtPtr->Hint = edtPtr->Name;
	}

```

### 案3 > 構造ウィンドウ使用

「構造」というウィンドウを使用すると早かった。

- 構造ウィンドウにてカウントアップさせる先頭の項目（例：XX_min51)を選択
- 画面のデザインを見ながら矢印を下に移動する
  - デザインのフォーカスが番号順に移動する
  - 移動がおかしいところが名前づけ失敗

300個のチェックの所要時間 5分程度

さらに早い方法が見つかった。

- デザイン上にてカウントアップさせる先頭の項目（例：XX_min51)を選択
- 構造ウィンドウをクリック
  - デザインで選択した項目にフォーカスが移っている
- 画面のデザインを見ながら矢印を下に移動する
  - デザインのフォーカスが番号順に移動する
  - 移動がおかしいところが名前づけ失敗

300個のチェックの所要時間 2分程度


### 案4 > オブジェクトインスペクタ使用

構造ウィンドウすら使用しない方法があった。

- デザイン上にてカウントアップさせる先頭の項目（例：XX_min51)を選択
- オブジェクトインスペクタの名前の部分を見ながら矢印下を連打(項目が縦の場合)
  - 名前の変化の仕方がおかしいところが名前付け失敗

IDEの使い方をまだまだ理解していないというのがいまさらながらわかってきた。
PostgreSQLでCSVからUpdateをかける

insertの場合は`\copy`コマンドを使えばいいのだが、updateの場合はそうはいかないみたい。

- [sql - How to update selected rows with values from a CSV file in Postgres? - Stack Overflow](http://stackoverflow.com/questions/8910494/how-to-update-selected-rows-with-values-from-a-csv-file-in-postgres)

↑のstack overflowの回答にある通り、

## やり方

1. updateしたいCSVデータを一旦`tmp`テーブルを作成しそこにインポート
2. `tmp`データのデータでUpdateしたいテーブルに`update`をかける

例えば以下のようにする。

```sql
-- Create tmp table (セッション内のみ有効なテーブル):
create temp table tmp (id int, issuedate__c datetime)

-- Import data from csv:
\copy tmp from '/path/to/file.csv' with null '' csv;

-- Update table from tmp
update
    "users"
set
    id = tmp.id,
    created_at = tmp.created_at
where
    "users".id = tmp.id

-- これはやらなくてもセッションが切れたと時に自動で削除される
drop table tmp;
```

### ！注意！
ここで注意なのが、アップデートかけたいレコード数が巨大な場合、`temp_buffers`の値を大きくし、`tmpテーブル`にインデックスを張らないと処理落ちしてしまう、とのこと。

```sql
-- Set temp_buffer:
SET temp_buffers = 500MB;  -- example value

-- Add index to the temporary table:
CREATE INDEX tmp_id_idx ON tmp(id);

-- Analyze indexes info
ANALYZE tmp;
```
gitで特定期間内で自分が加えた変更量を数える

# 状況

対外的に自分の活動量を説明するために、リポジトリ内で自分がどの程度のコード改変を行ったのかカウントする必要に駆られる時がある。

# 対策

gitの特定リポジトリ内でコミットログを漁り自分の改変量を数えるスクリプトを書いた。
期間について引数で与えても良いんだけれど年に一度書き換える程度で動くのでハードコーディングになってしまった。

```git_counter.rb:
#!/usr/bin/env ruby
require 'json'
arr = `git log --since=2015-04-01 --until=2016-02-29 --no-merges --pretty=full --numstat`.split("\n")

target = ARGV[0]

commit = []
until arr.empty? do
  buffer = []
  buffer << arr.shift
  until arr.empty? do
    buffer << arr[0]
    if arr[0] =~ /^commit .*$/
      break
    end
    arr.shift
  end
  commit << buffer
end

commit_log = commit.map{|log|
  ret = {
    commit: log[0].split(" ")[1],
    author: /Author: ([^<]*?)</i.match(log[1])[1][0..-2],
    email: /Author: .*<(.*?)>/i.match(log[1])[1],
    message: log[4],
    append: log[6].split("\t")[0],
    delete: log[6].split("\t")[1]
  }
  append = log[6..-1].map{|n| n.split("\t")[0].to_i}.inject(0){|sum, i| sum+=i}
  delete = log[6..-1].map{|n| n.split("\t")[1].to_i}.inject(0){|sum, i| sum+=i}
  ret[:append] = append
  ret[:delete] = delete
  ret
}

target_commit = commit_log.select{|a| a[:author] =~ /#{target}/i}

statics = {
  commits: target_commit.length,
  append: target_commit.inject(0){|sum, i| sum += i[:append]},
  delete: target_commit.inject(0){|sum, i| sum += i[:delete]}
}

puts statics.to_json
```

# 使い方

このスクリプトにパスを通しておいて

```bash:
 $ git_counter.rb kumagi
```

などと打てば

```shell-session:
{"commits":105,"append":3893,"delete":1284}
```

こんな感じに結果が得られる。
ActiveRecordのfind_eachでorderを指定できるようにする


# はじめに

大量のレコードを扱うときに便利な find_each は order での順序指定ができません。その理由は http://qiita.com/yugo-yamamoto/items/5569c037e8917fdb59ae にある通り。

とはいえ、簡易なアプリを作成するにあたって find_each_with_order があったら良いなぁというので探してみたらこんな記事を見つけたので http://grosser.it/2009/09/09/activerecord-find_each_with_order-find_each-with-order/ rails4で使えるように書きなおしました。

見ての通り、limitとoffsetを使うのでパフォーマンスを求める場面では使えません。全件持ってくるのはメモリ的に無理だけど、多少効率悪いのは問題ない、くらいな状況では使っても良いかも。

# ソース

こんな感じ

```rb
class ActiveRecord::Base
  def self.find_each_with_order(options={})
    page = 1
    limit = options[:limit] || 1000

    while
      offset = (page-1) * limit
      batch = limit(limit).offset(offset)
      page += 1

      batch.each{|x| yield x }

      break if batch.size < limit
    end
  end
end
```

使うときは下記の感じで。

```
User.order("followers desc").find_each_with_order do |user|
   # 処理
end

```
Qiita::Teamに古い記事であることを表示するChromeExtensionをつくりました

# TL;DR
- Qiita::Teamにその記事が古いことであることを表示するChromeExtensionを作りました
- 1年以上Qiita::Teamを運用し、記事の誤読が起きてきているので、それを避けられるようにする目的です

<img width="1048" alt="old_notice.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/3447/44202c27-74d3-9c15-d230-643a526e5676.jpeg">


# source
- https://github.com/tknzk/qiita_team_chrome_extension
- https://github.com/tknzk/qiita_team_chrome_extension/releases

# 仕組み
- ソースをみてもらうとわかりますが、```teamArticle_header_date``` から更新日時を取得して365日以上前だったら注意文を表示する仕組みです


# インストール方法
- chrome web storeに公開してるので、そこからインストールしてください
    - https://chrome.google.com/webstore/detail/qiitateam-oldest-article/ccpkmdhmlbobamolciaamjcdbgadjmfb?hl=ja&gl=JP&authuser=1
 
- ~~releaseページにある ``` qiita_team_chrome_extension.crx ``` をダウンロードして ``` chrome://extensions ``` にドラッグ/ドロップするとインストールできます~~

<img width="1123" alt="drop_extension.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/3447/6e114dde-c266-6996-b3cd-967ecc9a43c2.jpeg">

<img width="1101" alt="add_extensions.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/3447/8401db95-cdb2-74e8-abe1-2930adaad3f1.jpeg">
Android タブごとにWebViewを切り替える簡単な方法

iOSで実装していると、タブごとにViewControllerが別れるので自然と[UI|WK]WebViewのインスタンスも別れますよね。
最初はめんどくさいと思っていたのですが、タブごとに別れていると、タブがバックグラウンドに入ったタイミングでWebViewをリロードできたりして便利です。

同じことをAndroidでもできないかと試行錯誤した結果をお届け。


## layout.xmlでWebViewを複数用意する

```layout.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >  
    <WebView  
     android:id="@+id/webview1"  
     android:layout_width="fill_parent"   
     android:layout_height="wrap_content"   
 />  
    <WebView  
     android:id="@+id/webview2"  
     android:layout_width="fill_parent"   
     android:layout_height="wrap_content"   
     android:visibility="gone"
 />  
</LinearLayout> 
```


はい。
もうすでにデオチ感満載ですが、タブ切り替え時にvisibilityを切り替えるだけです。


## WebViewのvisibilityを切り替える

```java
.
.
WebView webView1 = (WebView) findViewById(R.id.webview1);
WebView webView2 = (WebView) findViewById(R.id.webview2);
.
.
.
///タブ切り替え時
webView1.setVisibility(View.GONE);
webView2.setVisibility(View.VISIBLE);
.
.
```


これならレイアウトの組み立ての役割をxmlに集約したままにできます。
一部をコード側で生成とかあまりしたくないですよね。

ご参考まで。
Emacs 上で LaTeX 文書中から命令を正規表現置換で除去

たとえば \red{...} というコマンドを取り除きたいとします。
C-M-% を押下して Query replace regexp に

```
\\red{\([^{]*?\)}
```

と打鍵して Query replace regexp \\red{\([^{]*?\)} with に

```
\1
```

と打鍵します。候補が強調表示されるので置き換えをするか指示をします。

# ポイント
* `[^{]` という正規表現を用いることで誤った置き換えを防ぎます。例. \red{\textbf{太字}普通} → \textbf{太字普通}
* `*?` という正規表現で貪欲照合にします。次の例が起きないようにします。例. \textbf{\red{ここ}続き} → \textbf{ここ}続き

# 参考ページ
* https://www.emacswiki.org/emacs-test/RegularExpression
Linux初心者が覚えておきたい用語


# ロードアベレージ
（実行可能にもかかわらず）実行待ちになっているプロセス数。
システム負荷の参考値になる。
topコマンドで確認が可能。

# バッファキャッシュ
空きメモリがある場合に、Linuxはディスクアクセスを高速化するためにメモリを利用する。
これをバッファキャッシュと呼ぶ。
実際に使われているメモリはバッファキャッシュを除外した値で確認する必要がある。
freeコマンドで確認が可能。

# Swap
メモリが不足すると、ディスクの一部が仮想メモリとして利用される。
これをスワップと呼ぶ。
スワップが頻発している場合、メモリの増設等を検討すべき。
freeコマンドで確認が可能。

# ウェルノウンポート
TCP/IPの主要なプロトコルで使用されているポート番号のこと。
well-knownポートは1023番以下に分布しているため、well-knownポートをもたないプロトコルを使用するアプリケーションは1024以降のポートを使用することが慣例となっている。

| ポート番号 | プロトコル | 説明 |
|:-----------|:-----------|:-----------|
| 20, 21 | FTP | ファイル転送 |
| 22 | SSH | リモート接続 |
| 23 | telnet | リモート接続 |
| 25 | SMTP | メール |
| 53 | DNS | DNSサーバ |
| 80 | HTTP | Web |
| 110 | POP3 | メール |
| 443 | HTTPS | Web |

# 参考
http://booklog.jp/item/1/4798038164
Linux弱者が覚えきれないコマンド

よく使うんだけど、毎回調べてるような気がするコマンドまとめ。。

# ファイル・ディレクトリ操作
| 操作 | 概要 | 補足 |
|:-----------|:-----------|:-----------|
| cp -r ディレクトリA ディレクトリB | ディレクトリAをディレクトリBの中にコピーする |ディレクトリのコピーはrオプションが必要|
| rm -rf ディレクトリA | ディレクトリAを確認なしに削除する |fオプションを使うと確認なしで削除|
| chown 所有者 ファイルA | ファイルAの所有者を変更する ||
| chown -R 所有者 ディレクトリA | ディレクトリAの所有者を中身のファイルもまとめて変更する ||
| chmod アクセス権 ファイルA | ファイルAのアクセス権を変更する | r:4, w:2, x:1|
| find 検索場所 -name ファイル名 -type f | 検索場所から指定したファイル名を探す |typeをdにするとディレクトリが対象になる|
| grep 文字列 ファイル名 | 指定したファイル名から指定した文字列を探す | findの結果はxargsで受け取れる |
| nkf -g ファイルA | ファイルAの文字コードを推定する ||
| scp ファイルA ユーザA@ホストA:ディレクトリ | リモートのサーバにファイルをコピーする | scp ~/hoge.txt user1@hoge.co.jp:~/work/ |
| ln -nfs リンク先 リンク（名） | シンボリックリンクを作成する | 削除は「unlink リンク名」 |

# シェル操作
| 操作 | 概要 | 補足 |
|:-----------|:-----------|:-----------|
| export 変数名 | 指定した変数を環境変数にする ||
| printenv | 環境変数の一覧を表示する ||

# ファイルの圧縮、解凍
| 操作 | 概要 | 補足 |
|:-----------|:-----------|:-----------|
| gzip ファイルA | ファイルを圧縮する |.gzファイルが対象|
| gunzip 圧縮ファイルA | ファイルAを解凍する ||
| bzip2 ファイルA | ファイルを圧縮する |.bz2ファイルが対象|
| bunzip2 圧縮ファイルA | ファイルAを解凍する ||
| tar cvzf ファイルA ディレクトリA | ディレクトリAのアーカイブをファイルAとして作成する |zオプションをつけるとgzipとして圧縮も行う（.tar.gz）|
| tar xvzf ファイルA | 圧縮アーカイブファイルAを展開する ||


# ネットワーク操作
| 操作 | 概要 | 補足 |
|:-----------|:-----------|:-----------|
| ssh -i 秘密鍵のパス 接続先ホスト名 | ssh接続する | [ssh公開鍵認証を実装する](http://qiita.com/HamaTech/items/21bb9761f326c4d4aa65)|
| ifconfig | IPアドレスを確認する | 一般ユーザの場合PATHが通ってなければ /sbin/ifconfig |
| netstat -at | TCP接続の一覧を表示する ||

# ユーザー管理
| 操作 | 概要 | 補足 |
|:-----------|:-----------|:-----------|
| su - ユーザー名 | 指定したユーザーになる |-をつけると、変身するユーザーのホームディレクトリに移動する|

# プロセス操作とシステム監視
| 操作 | 概要 | 補足 |
|:-----------|:-----------|:-----------|
| ps aux | すべてのプロセスを表示する ||
| kill PID | 指定したPIDのプロセスを終了する ||
| kill -KILL PID | 指定したPIDのプロセスを終了する ||
| top | システムとプロセスの状態をモニタする ||
| free | メモリとスワップの情報を表示する ||
| df -H | ディスクの使用情報を表示する |Hオプションをつけると単位が分かりやすい|
| vmstat 秒数 回数 | メモリーやCPUの情報を指定した秒間隔と回で表示する |プロセスの内訳は見れないが、スナップショットが残るので時間の経過を追いやすい。|

# 日付
| 操作 | 概要 |
|:-----------|:-----------|
| date | 日付を表示 |
| date -d '1 days' | 明日の日付を表示 |
| date -d '1 days ago' | 昨日の日付を表示 |
| date "+%Y%m%d%H%M%S" | 書式指定（20160407020312） |

# その他
| 操作 | 概要 |
|:-----------|:-----------|
| curl リクエストURL | パラメータは --data-urlencode　でURLエンコードできる。 |
| pbcopy < コピーしたい内容 | (Macのみ)クリップボードにコピーする。 |

# 参考
http://booklog.jp/item/1/4798038164
http://qiita.com/takeoverjp/items/bb1576e90a8a495db4b3
連番のリソースを、いい感じに引っ張ってくる

# 連番のリソース名から、リソースIDを取得したい
リストビューなんかで、
連番の画像なんかを表示したい時に、
うまいことpositionとかからリソースIDをひっぱってこれないかなー
とおもって、やってみました。

たとえば、

・postionが0の時、question_01.png,
・positionが1のとき、question_02.png,
・positionが11のとき、question_12.png
...

といった画像のリソースIDを、
drawableからひっぱってくるときには、
下記の通りにすればできます。

```java
// リソースの名前の数字
int qn = (position % 20) + 1;
// リソース名を生成
String prefixRes = String.format("question_%02d", qn);
// リソース名からリソースIDをひっぱってくる
int resId = res.getIdentifier(prefixRes, "drawable", context.getPackageName());
```

これで、ソースコードもすっきりします。
top を打った時に出てくるプロセス名を工夫したい

# なに？
[sidekiq](https://github.com/mperham/sidekiq) を`ps` などのコマンドで見てみると

```
ps auxf | grep sidekiq
    (略)  |   \_ sidekiq 3.5.4 rails_app [25 of 25 busy]
```

こういう感じで `sidekiq [use thread of thread_pool_size]` と表示してくれる。
これってどうなってるのかなー面白そうだなーと思って調べてみた結果。

# 結論
https://github.com/mperham/sidekiq/blob/81ecefdfef8b1aebae8315648b5d22d10a1e4adc/lib/sidekiq/launcher.rb#L65-L68

```rb
100000.times do |i|
  $0 = "INDEX_OF_#{i}"
  sleep 1
end
```

```
$ watch 'ps -ef | ag INDEX_OF'
 0:00.13 INDEX_OF_7 # ここが変わっていく
```

へー :memo: 

# 何ぞ？
`$0` は自プロセスの名前を表す変数。なのでここに代入すると名前が変わる。
[詳細はこ↑こ↓をみて。どうぞ。](http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/v/PROGRAM_NAME.html)
分散不均一検定

　線形回帰分析をする時、誤差項が同じ分布に従うという条件があります。分散不均一の場合、一般線形モデル（GLM、General linear model）で分析することが知られています。分散不均一性を検出する方法は、いくつあります。今日は、例を挙げて、Breusch–Pagan検定を紹介します。
　Breusch–Pagan検定は、下記URLに参考してください。ここで説明しません。
　　　https://en.wikipedia.org/wiki/Breusch%E2%80%93Pagan_test

簡単に説明します。図Total、A、B、C、D、Eは豆腐の生産量を表しています。生産量を目的関数と、気温、気温差、降水量を説明変数とし、モデル構築します。
![分散不均一11.png](https://qiita-image-store.s3.amazonaws.com/0/114190/8d621c37-0b52-8064-0bec-36f9a32b912d.png)

図Total、A、B、C、D、Eの真ん中部分の変動は激しい。一方、気温、気温差、降水量の変動はそんなに差はない。直観に、誤差項の分散は同じではないと判断します。では、検定してみましょう。

![分散不均一.png](https://qiita-image-store.s3.amazonaws.com/0/114190/3a1b9eb4-0f17-0aa9-ad94-fbc03e76a7b2.png)

検定の結果は、分散不均一であることが分かりました。

コードを添付します。

```ruby:BP.rb
# データの読み取り
tofu<-read.csv("tofu.csv",header=T,sep=",",fill=T)
# 欠損値の処理
tofu<-tofu[-(51:52),]
tofu<-tofu[-46,]  
BP<-matrix(0,1,6)
colnames(BP)<-c("total","A","B","C","D","E")
for (i in 1:6) {
  # 回帰
  R<-lm(tofu[,i]~tofu[,7]+tofu[,8]+tofu[,9])
  x<-as.matrix(tofu[,6:9])
  x[,1]<-1
  xx<-as.matrix(R$coefficients)
  # 残差の自乗を計算する
  u2<-(tofu[,2]-x%*%xx)^2  
  # 補助式の回帰
  RR<-lm(u2~tofu[,7]+tofu[,8]+tofu[,9])    
  # BP検定の補助回帰式の決定係数
  R2<-summary(RR)$r.squared    
  BP[1,i]<-nrow(tofu)*R2
}
# True⇒分散均一  False⇒分散不均一
BP<=qchisq(0.05,3,lower.tail=FALSE)
```
Javaでクイックソート

```java:QuickSort.java
import java.util.Arrays;

public class QuickSort {
	public static void main(String[] args) {
		int[] arr = {4, 5, 1, 6, 9, 2, 8, 3, 7, 0};
		Arrays.stream(quickSort(arr, 0, arr.length-1)).forEach(
				e -> System.out.println(e));
	}
	public static int[] quickSort(int[] arr, int left, int right) {
		if(left<=right) {
			int p = arr[(left+right)/2];
			int l = left;
			int r = right;
			while(l <= r) {
				while(arr[l] < p) l++;
				while(arr[r] > p) r--;
				
				if(l<=r) {
					int tmp = arr[l];
					arr[l] = arr[r];
					arr[r] = tmp;
					l++;
					r--;
				}
			}
			
			quickSort(arr, left, r);
			quickSort(arr, l, right);
		}
		return arr;
	}
}
```
PHPUnitのテストコードを書いてresponseに変数が入らない

## はじめに
PHPUnitのテストコードを書いてresponseに変数が入らなかった時のメモです。
※PHPUnitを用いてITに近い形で行っています。

環境
FuelPHP 1.7
Smarty
※PresenterをカスタムしSmartyと連携させてます。

Smartyへの連携方法は以下の記事の通りです。（そのうちソース上げて綺麗にします・・・）
[FuelPHP Smarty](http://qiita.com/mogetarou/items/afcb3df68779ed31cd9c)

## 概要
PhpUnitでテストコードを記述した際にViewに設定した値が取得できませんでした。ソースを追った結果renderが呼び出されていなかったのが落ちでした。

1. ControllerでPresenterへ値を受け渡し（ValidateエラーをPresenterに渡す）
2. PresenterのBeforeで値を設定（Validateで発生したエラー内容を受け取り表示する）

こんどrenderの呼ばれるタイミング調べよう。（てか昔調べたけど忘れてる・・・）

## 対応方法
----
値をチェックする前にrenderを動かせばいいので以下のロジックをチェックする前に呼べばOK。（なんかスマートなやり方じゃないけど・・・）

```php
$response->body->__toString();
```

## あとがき
今回のプロジェクトで性質上、デザインの調整が長引きあとから作成され追加されることからとりあえずViewを仮にはめViewに値が設定されているかどうかを確認するために行いました。
一応あとは正しくViewをはめてくれれば問題ないはず！と思ってます。

## その他
参考
[fuelPHPでPHPUnitを使ったユニット・コントローラーテストをするには](http://qiita.com/masahikoofjoyto/items/206e6f8d5b0aa7126678)

## 履歴
デスクワークにお勧めのお薬

仕事に集中するためにお薬出しておきますね。

###頭痛
ロキソニン(第一類)

###花粉症(鼻炎)
アレジオン(第二類)

###花粉症(目のかゆみ)
マイティア アルピタット EXα(第二類)

###メモ
今はネット通販で医薬品が購入できて便利。