OmniAICreator/Qiita-1.07M huggingface dataset:
vCenter Serverの無い状態でVMをクローンしたい！／ovftoolコマンドを使ったESXi to ESXiなVMコピー


# はじめに

vCenter Serverが無い。。。だけどVMをクローンしたい！
そんな時に便利なovftoolコマンドを使ったESXi to ESXi(自分 to 自分)なVMコピーを紹介。

![ovftool+vSphere.png](https://qiita-image-store.s3.amazonaws.com/0/10852/578166f7-491c-a46c-fd77-734c3aa35fd3.png)

# 環境
* クライアントOS : Mac OS X El Capitan 11.11.2
    * クライアントOSはWindows、Linuxが選択出来ますが動作に差は無いと思います。
* ovftool : 4.1.0
* ESXi : VMware ESXi 6.0.0 build-3073146

# ovftoolを使ってみる

## ovftoolコマンドのインストールを確認

```zsh
$ /Applications/VMware\ OVF\ Tool/ovftool --version
VMware ovftool 4.1.0 (build-2459827)
```

## ESXi to ESXi(自分 to 自分)なVMコピー

### 環境情報
* ESXiホストIPアドレス：`192.168.0.100`
* ESXiホストユーザ名：`root`
* ESXiホストユーザパスワード：`hoge##123`
* コピー先データストア名：`Local Datastore`
* コピー先仮想ディスクフォーマット：`thin` #シンプロビジョニングを利用する
* コピー先ネットワークラベル：`VM Network`
* コピー元仮想マシン名：`CentOS_6.7_64bit`
* コピー先仮想マシン名：`VMCopyTest`

### コマンド凡例

```zsh
$ ovftool --datastore="[コピー先データストア名]" --diskMode="[コピー先仮想ディスクフォーマット]" --network="[コピー先ネットワークラベル]" --name="[コピー先仮想マシン名]" vi://[ESXiホストユーザ名]:[ESXiホストユーザパスワード]@[ESXiホストIPアドレス]/[コピー元仮想マシン名] vi://[ESXiホストユーザ名]:[ESXiホストユーザパスワード]@[ESXiホストIPアドレス]
```

### 実際に実行してみる

* コマンドライン上での表示

    ```zsh
    $ /Applications/VMware\ OVF\ Tool/ovftool --datastore="Local Datastore" --diskMode="thin" --network="VM Network" --name="VMCopyTest" vi://root:hoge##123@192.168.0.100/CentOS_6.7_64bit vi://root:hoge##123@192.168.0.100
    
    Opening VI source: vi://root@192.168.0.100:443/CentOS_6.7_64bit
    Opening VI target: vi://root@192.168.0.100:443/
    Deploying to VI: vi://root@192.168.0.100:443/
    Transfer Completed
    Completed successfully
    ```
* ESXiタスクの表示
![Export-importtask2.png](https://qiita-image-store.s3.amazonaws.com/0/10852/9eed10ec-ad3a-fc22-df73-0520fd3bce04.png)
    * ExportとImportが同じ時間で開始して同じ時間で終了している

### 小ネタ
* コマンド実行時に`--powerOn`引数を追加しておけば、VMコピー完了後に電源ONまでしてくれます。
* 世の中には、ESXi上で動作するovftoolなんてのも存在している。それを使うとESXi単体でVMコピーが出来てしまう。

# 参考文献
* [OVF Tool Documentation](https://www.vmware.com/support/developer/ovf/)
* [VMware Open Virtualization Format Tool 4.1.0 Download](https://my.vmware.com/group/vmware/details?productId=491&downloadGroup=OVFTOOL410#product_downloads)
    * 注意）ダウンロードにはMyVMware（取得維持費無料）のアカウントを求められる事があります。
Cakephp：独自Validationのデバッグ

まだ勉強中なのでやり方が乱暴なんですが、もっと良い方法をご存知でしたら教えて下さい。

#1. バリデーションのデバッグ方法
##1.1. バリデーションエラーを表示する
###1.1.1 モデルでエラーメッセージを定義する
```Model/名前.php
public $validate = array(
                'original' => array(
                        'timestamp' => array(
                                'rule'    => '/正規表現/',
                                'message' => 'バリデーションエラーだよ'
                        )
                  )
```

###1.1.2 ビューでエラーメッセージを出力する
```View/名前/add.ctp
echo $this->Form->error('名前.original');
```

##1.2 実際に渡ってきているデータをdebug.logに書き出す

###1.2.1 CakeValidationRule.phpをいじる

logメソッドを利用するためCakeValidationRuleクラスをObjectの小クラスにする

```lib/Cake/Model/Validator/CakeValidationRule.php
class CakeValidationRule extends Object{
```

次に、279行に次を挿入する

```lib/Cake/Model/Validator/CakeValidationRule.php
$this->log("Data under validation: ".$data[$field],LOG_DEBUG);
```

これで、バリデーション実行時にdebug.logにバリデーション対象のデータが書き込まれる
CentOS 5 とか 6 とかでバックアップのつもりで ifcfg-eth0.save みたいなファイルを作ると死ぬ

`/etc/sysconfig/network-scripts/` に `ifcfg-eth0.bak` のようなサフィックスが `.bak` なファイルがあっても無視されます。たしか MAC アドレスが変わった時とかに元のファイルがそのような名前で退避されていた気がします（CentOS 5 とか 6 とかで）。

がしかし、これは `.bak` というサフィックスが特別扱いされているのであって、同じような感覚で `ifcfg-eth0.save` みたいなファイルをバックアップのつもりで作成すると死にます。

```console
# cp -a /etc/sysconfig/network-scripts/ifcfg-eth0{,.save}
# service network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:                                [  OK  ]
Bringing up interface eth0.save:                           [  OK  ]
```

`ifcfg-eth0.save` も有効な設定ファイルと認識されます。バックアップとしてコピーしたのなら `DEVICE=eth0` という内容を含んでいると思うので、`eth0` が２回初期化されることになります。

----

`/etc/init.d/network` で次のように `ifcfg-XXX` ファイルが検索されます。

```sh
# find all the interfaces besides loopback.
# ignore aliases, alternative configurations, and editor backup files
interfaces=$(ls ifcfg* | \
            LANG=C sed -e "$__sed_discard_ignored_files" \
                       -e '/\(ifcfg-lo$\|:\|ifcfg-.*-range\)/d' \
                       -e '/ifcfg-[A-Za-z0-9#\._-]\+$/ { s/^ifcfg-//g;s/[0-9]/ &/}' | \
            LANG=C sort -k 1,1 -k 2n | \
            LANG=C sed 's/ //')
```

`$__sed_discard_ignored_files` は `/etc/init.d/functions` で次のように定義されています。

```sh
# A sed expression to filter out the files that is_ignored_file recognizes
__sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
```

なので、`ifcfg-eth0.bak` だと無視されますが、`ifcfg-eth0.save` だと含まれます。

`ifcfg-ethX` とか `ifcfg-bondX` とか `ifcfg-ethX:X` みたいな決まった規則のファイル名だけ認識されるものだと勘違いしていました・・・
Seleniumを使用して(テスト自動化でなく)意識の低い自動化をしたお話

## はじめに
PhantomJSを使用してこの自動化を少し改善したお話を投稿しました([Qiita記事](http://qiita.com/ex_SOUL/items/642cedd84e60599b5add))

# 背景
ログインが必要な某社内システムでは、定期的なパスワード変更が強制されています。
そして、新パスワードは旧パスワードとは異なっていなければなりません。
私は意識が低く、面倒が嫌いなので、パスワードの定期変更は面倒くさく感じてしまいます。
(パスワードの定期変更の有効性は諸説ありますがそれはまた別のお話)
なんとかこの定期的に必要になる作業を自動化できないかと考えました。

# 前提
* Windowsマシンであること
* Rubyがインストール済みであること
* firefoxがインストール済みであること
* firefoxのプラグイン「[Selenium IDE](http://www.seleniumhq.org/projects/ide/)」がインストール済みであること
* Rubyのgem「[selenium-webdriver](https://rubygems.org/gems/selenium-webdriver)」がインストール済みであること

# 結果
Seleniumを使用して、以下を自動化しました。

1. Seleniumを使用して、某社内システムにログイン
1. パスワード変更画面に移動してパスワードを変更
1. ログアウト
1. 再度某社内システムへログイン
1. パスワード変更画面に遷移してパスワードを元のパスワードに変更
1. ログアウト
1. 終了

上記処理をRubyで作成し、タスクスケジューラにて定期的に実行しています。

# やったこと
* firefoxのプラグイン「Selenium IDE」を使用して某社内システムでのパスワード変更作業をテストケースとして自動記録
* 記録されたテストケースをRuby形式でエクスポート
* 自動記憶されたものだけで動作するか確認(動作せず)
自動記録は全ての操作を記録してくれるわけではないので、一部の操作は手動で追記が必要です
今回はフレーム間移動を手動で追記しました。
フレーム移動は`switch_to.frame("FRAME_NAME")`で可能です。
* 処理を追記したrbファイルが正常に動作するか確認(動作確認OK)
* 正常動作を確認したrbファイルをタスクスケジューラに登録
本来ならパスワード変更期限以内に一度だけ実行すればいいのですが、タスクじスケジューラの機能ではうまく組めなかったので、1ヶ月に一度、平日のお昼休憩中に実行するように登録しました。
昼休憩時に作業している可能性も考え、無操作の時間が5分以上の場合のみ実行するという設定も追加しました(未検証)

# 成果と課題など
## 成果
1. (多分)楽になった
パスワードの強制変更の期限が割りと長いのでまだ実感はありませんが多分楽になると思います。

1. Seleniumの勉強になった
今回の自動化を通して、フレーム間の移動方法を知りました。
そのうち業務でも使えればと思っています。

## 課題

1. 無操作時間とはいえ、ブラウザが直接起動する
Seleniumを使用する以上仕方ないこととは思いますが、ブラウザが起動するのはちょっとイケてないと感じます。某社内システムにAPI等が備わっていれば別の手段もあるかもしれませんがAPIは多分無いです(未調査)

1. 定期実行が妥協の産物
これも仕方ないかなと思っています。高機能なスケジューリングツールをこのためだけに(ローカルPCに)導入するのはマシンスペック的にも無いというのが今の判断です。

## 注意
この自動化は、正直褒められたものではないです。むしろ非推奨だと思います。
大企業で同じことをやると情シス部門から怒られるかもしれません。
また、これは単なる予想ですが、仮にこのような自動化を勤怠システム等で実施した場合は、懲罰レベルの怒られ方をするかもしれません。ご注意ください。
アルゴリズム1000本ノック #7. 2 Sum

#### Problem
本問も [LeetCode](https://leetcode.com/problems/two-sum/) から拝借しています.

```
与えられた整数配列Aと1つの整数Kに対して, Aの中からその合計値がKとなるような
2つの整数を見つけ, それが先頭から何番目かを小さい順に配列の形で返却せよ.
（条件を満たす2つの整数は, 必ず配列A内に1組だけ存在するものと考えて良い）

入力: numbers={2, 7, 11, 15}, target=9
出力: [1, 2]
```

#### Solution
すべての組み合わせを総当りでチェックしていくと計算量 `O(N^2)` を要するので, 効率的な解き方が必要.

配列 `A` を先頭から順番に見ていき,  値とそれが先頭から何番目であるかをハッシュマップに格納していきます. こうすることで, 今見ている値に対して `K - A[i]` を満たすような値が既にあったかを,   同じハッシュマップから検索 することで`O(1)`で検出可能になるところがキーポイントですね.

Python版コード:

```py
class Solution(object):
    def twoSum(self, nums, target):
        m = {} # store existence of each character
        for i, num in enumerate(nums):
            v = target - num
            if v not in m:
                m[num] = i + 1
            else:
                return [m[v], i+1]
```

計算量は `O(N)`, 空間量も `O(N)` となります( N は配列Aの長さ）.

Java版コード:

```java

public class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> m = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            int diff = target - num;
            if (m.containsKey(diff)) {
                return new int[] {m.get(diff), i+1};
            }
            m.put(num, i+1);
        }
        return new int[2];
    }
}
```
[Python] GUIアプリケーション作成ツールwxpython[準備編]

#wxPython
GUIアプリ作るためのツール
※`wxPython`をこれからやる上で必要そうな情報を集めたまとめ的なものです。コードとかはなんにも書いてないのであしからず。

##とりあえずインストール
`pip`を使ってインストールします

```wxpython.install
$ pip search wxPython
wxPython  -  Cross platform GUI toolkit for Python
$ pip install wxPython
$
$ python --version
Python 3.4.3
$ python -c "import wx; print(wx.version())"
3.0.3.dev1830+0b5f910 osx-cocoa (phoenix)
```
簡単ですね、ここでは、`Python3.4.3`でやっていこうと思います。（何か不具合が起きたら2系のものを使います。）

##参考になりそうなサイト
1.[wxPython](http://www.wxpython.org/index.php)
・とりあえずwxPythonのHP、ダウンロード方法・アップデート情報等書いてあります（英語）。英語ですね。。。

2.[wxPython tutorial](http://zetcode.com/wxpython/)
zetcodeのサイトですね、テトリスの実装例が載っているのである程度知識ある人はこれ見たほうが早いかと。
[wxPythonチュートリアル](http://wxpython.at-ninja.jp/)に翻訳版がありますが、ページにTODOの文字が見えるので訳し終えてないっぽい。わからないところあれば、英語の方のサイト見ましょう。

3.[Python-izm GUI](http://www.python-izm.com/contents/gui/)
Python-izmはpythonチュートリアルが載っているサイトです。このサイト一周するとPythonの基礎学べます。これはその中のGUIの項目に例としてwxPythonがあります。

4.[The wxPython マニュアル](http://www-acc.kek.jp/epics_gr/products/wxPythonManual/wxPythonManual-J.html)
こちらにも、細かくいろいろ書いてあります。wxPythonがそもそもどうゆうものなのかとかも書いてあるので、詳しくそういうことを知りたい方はここがよいかも？
こちらのサイトにもしっかり基礎の部分は書いてあります。

5.[wxPyWiki How to learn wxPython](http://www-acc.kek.jp/epics_gr/products/wxPythonManual/wxPythonManual-J.html)
ここには、いろいろテンプレート等が書いてあるので結構参考になるかと思われます。英語で書かれています。

##まとめ
今回紹介したサイトを元に勉強していきたいと思います。
何か他に参考になるサイト等や実装例があれば教えていただけると助かります。
Connect Arduino and iPhone via ble4.0

BDMで作っていたEveryTouchをスマホを使って実現するのに必要だったので、ble4.0モジュールである浅草ギ研のBLESerial2で、ArduinoとiPhoneの通信を試みた。
http://www.robotsfx.com/robot/BLESerial2.html
を参考にArduinoとbleモジュールを接続。ただし、Arduinoがble4.0で受信した信号をパソコンで見たいので、TX/RXは空けたい。そこで、SoftwareSerialを使い、ArduinoのD12をRX、D13をTXとしてbleモジュールにつなぐ。
モジュールの電源は3.3Vであることに注意!

Arduinoのプログラムは以下
http://blog.livedoor.jp/sce_info3-craft/archives/9072219.html を参考にさせて頂いた。

```c++:ble4.0_test.cpp
#include <SoftwareSerial.h>

#define BT_RX 10
#define BT_TX 11
#define LED 13

int rsvData = 0;
int sersorVal = 0;

SoftwareSerial btSerial(BT_RX, BT_TX);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  btSerial.begin(9600);
  pinMode(LED, OUTPUT);  
}

void loop() {
  // put your main code here, to run repeatedly:
  if(btSerial.available() > 0){
    rsvData = btSerial.read();
    Serial.println(rsvData);
    if( rsvData == 1 ){
      digitalWrite(LED, HIGH);
    } else if( rsvData == 0 ){
      digitalWrite(LED, LOW);
    }
  }
}
```

これをArduinoに焼き付けて、iPhoneでLightBlueというアプリを立ち上げる。

やってみるものの、上手く行かない。
説明書をよく見ると、bleモジュールのTXはAruduinoのTX、RXはArduinoのRXにつなぐようにという指示が書いてあった。単純に接続が逆だった。配線を入れ替えると、上手くいった。

試しに、ble経由で数字をiPhoneにかえしてみる。

```c++:ble4.0_test2.cpp
#include <SoftwareSerial.h>

#define BT_RX 10
#define BT_TX 11
#define LED 13

int rsvData = 0;
int sersorVal = 0;

SoftwareSerial btSerial(BT_RX, BT_TX);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  btSerial.begin(9600);
  pinMode(LED, OUTPUT);  
}

void loop() {
  // put your main code here, to run repeatedly:
  
  if(btSerial.available() > 0){
    rsvData = btSerial.read();
    if( rsvData == 1 ){
      digitalWrite(LED, HIGH);
      Serial.write("hello\n");
      btSerial.write(0x12);
    } else if( rsvData == 0 ){
      digitalWrite(LED, LOW);
      Serial.write("good night\n");
      btSerial.write(0x11);
    }
  }
}

```

ちゃんと返却値もiPhoneに届いている。
LightBlueは結構便利なアプリでした。これで、手元のボタン押したらiPhoneで画像処理を開始するみたいなことができそう。
【自分メモ】Djangoの準備〜起動


### 前提
- python 3.5がインストールされていること
- virtualenvがインストールされていること

### 仮想環境の準備
```bash:~/
$ mkdir -p ~/app/virtualenv
$ cd ~/app/virtualenv
$ virtualenv -p python3.5 project_name
$ ls -l
total 0
drwxr-xr-x  5 user_name  group_name  170 12 28 22:28 project_name
```

### 仮想環境を使用する
```bash:~/
$ . ~/app/virtualenv/project_name/bin/activate
$ python --version
Python 3.5.0
```

### Djangoのインストール
```bash:~/
$ pip install django
Collecting django
  Using cached Django-1.9-py2.py3-none-any.whl
Installing collected packages: django
Successfully installed django-1.9
```

### 作業ディレクトリの作成
```bash:~/
$ mkdir -p ~/app/projects/project_name
```

### プロジェクトの作成
```bash:~/app/projects/project_name
$ cd ~/app/projects/project_name
$ django-admin.py startproject project_name
```

```出来上がるファイル一覧
├── run.sh
└── project_name
    ├── manage.py
    └── project_name
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
```

### 起動コマンドの作成
```bash:run.shを作成する
$ vim run.sh
```
```shell:run.sh(起動コマンドを設定)
python ./project_name/manage.py runserver
```
```bash:実行権限をつける
$ chmod +x run.sh
```

### DB
```bash:~/app/projects/project_name
$ python ./project_name/manage.py migrate
```

### 初期ユーザの作成
```bash:~/app/projects/project_name
$ python ./project_name/manage.py createsuperuser
```

### 起動
```bash:run.sh
$ ./run.sh
```

### ブラウザからアクセス
http://localhost:8000

- 以下のような画面が表示される
![スクリーンショット 2015-12-29 0.19.20.png](https://qiita-image-store.s3.amazonaws.com/0/52545/024fc265-1442-1bc1-3b68-2fd89c27eaf4.png "スクリーンショット 2015-12-29 0.19.20.png")


http://localhost:8000/admin

- 以下のような管理画面のログインが表示される

![スクリーンショット 2015-12-29 0.19.09.png](https://qiita-image-store.s3.amazonaws.com/0/52545/1706ba39-0a8c-f125-b53f-2cf5ebc3137f.png "スクリーンショット 2015-12-29 0.19.09.png")

- ログイン後の画面表示

![スクリーンショット 2015-12-29 0.18.53.png](https://qiita-image-store.s3.amazonaws.com/0/52545/ca9b9501-c269-e3e5-9c42-353ec6a1a600.png "スクリーンショット 2015-12-29 0.18.53.png")
フロー状態じゃにゃいけどプログラミングする習慣について

## ページについて

下記の参考ページにインスパイアされて、思いつきで書きました。
あと、ページ書かないと画像の上限が上がらないってネットにあったので書きました。
他意はありません。

参考ページ：[プログラミングでフロー状態に入るための習慣について](http://futurismo.biz/archives/5665)

※ 元のページはその通りだと思います。茶化したり、Disたりしたいわけではありません。
怒らせたらすみません。

## 対象者

なかなか、プログラムのコーディング時間を取れないプレイングマネージャーに捧ぐ
下記ページからもインスパイアさせていただいております。

参考ページ：[あるエンジニアの緩慢な死、あるいはエンジニア35歳定年説](http://qiita.com/shinichinomura/items/da9d53f8e3f31df96e7a)

## 姿勢は自由にする

席に座ってても、コーディングと関係ない作業があるので、
背骨とか大切ですが、自由な姿勢をとる。でもやることはやる

## 音楽を聞かない

割り込みで話しかけてくるので、集中せずにボケーーと頭を空っぽにしておく or 普通の状態にしておく
会話はなる早で終わるように頑張る

音楽を聴かないことで

* ヘッドフォンorイヤホンを外す動作の削減
* 相手の話かけにくさ度の低減

仏アピールしましょう！！

## 飲み物

お年を召されている方は、お茶とかドロドロしていないサラサラしたものにしましょう。
年には勝てません。（著者はブラックコヒーは苦手です）

## 瞑想（迷走）

トイレに行って、いろいろリセットしましょう。可能なら、設計をしましょう

## 入力デバイス

マウス、キーボード 自分の好きなものを揃えましょう。
資料作成にマウスは必需品です。せめて自分の好きなものにしましょう（涙）

## 普通でもエレガントにするには

ここまでくれば、あとはコードを書くだけです。

1. 設計をする（トイレとか空き時間で・・・）
2. 書く（レビューポイントをある程度見つけて置く）
3. コードと話す（自分でレビューする）
 - ダメな時：コードがダメだよと教えてくれます
 - いい　時：おそらく、コードは無口なはずです

## まとめ

外界と遮断が難しいのですから、それに抗うことなくコーディングを行いましょう。

* 平常心でエレガントなコードが書けるようにしましょう。
* 平常心＝フローと騙してコーディングを行いましょう。

それでエレガントなコードが書けるようになれば、フロー時はもっとすごいことに！！
なっているはずです。。。
正規表現リテラルは早いのか？


[togetter 正規表現が構文として必要かどうかという話から](http://togetter.com/li/603521)

[プログラミング言語における正規表現リテラルの必要性について](http://blog.kazuhooku.com/2013/12/blog-post.html)

古い話だが、だいたいこんな感じのことが書いてある



>正規表現リテラルがないと、正規表現を適用する度ごとに、毎回正規表現をコンパイルするコードを書きがちです。これは、実行速度を大幅に悪化させます。<b>正規表現リテラルがあれば、正規表現を言語処理系側でコンパイルして使い回すことができる</b>ので、実行速度が向上します。

<span style="font-size:x-small">http://blog.kazuhooku.com/2013/12/blog-post.html より。強調部原文ママ</span>



本当だろうか？
正規表現リテラルは、ほとんど単に、シュガーシンタックスとして実装されてるのではないだろうか？？


### 実験してみた

（追記：デバッグコンソールでブラウザ実行/静的jsでブラウザ実行/node.jsで実行）

```javascript:test.js
var str = "abfdfaerajofajo39u82ini98c9a434428jm3nicaa3e"

// ■ループ内で Newする
var t  = Date.now();
for(var i=0; i<1000000; i++){
    (new RegExp("[A-ZＡ-Ｚア-ロｱ-ﾛあ-れ]{1}(.{0,2})?[\-－.]?[0-9０-９]{2}[\-－.]?[abａｂ]")).test(str);
}

console.log(Date.now() - t); 
// 33.584秒/27.6213秒/0.262秒



// ■ループ内で リテラル：Newより早いはず
var t  = Date.now();

var str = "abfdfaerajofajo39u82ini98c9a434428jm3nicaa3e"
for(var i=0; i<1000000; i++){
    /[A-ZＡ-Ｚア-ロｱ-ﾛあ-れ]{1}(.{0,2})?[\-－.]?[0-9０-９]{2}[\-－.]?[abａｂ]/.test(str);
}

console.log(Date.now() - t); 
// 32.345秒/0.762秒/0.071秒


// ■1回だけ Newする
var t  = Date.now();
var rx = new RegExp("[A-ZＡ-Ｚア-ロｱ-ﾛあ-れ]{1}(.{0,2})?[\-－.]?[0-9０-９]{2}[\-－.]?[abａｂ]");
for(var i=0; i<1000000; i++){
    rx.test(str);
}

console.log(Date.now() - t); 
// 5.406秒/0.682秒/0.065秒



// ■1回だけ リテラル：１回だけのNewと同じ速度のはず
var t  = Date.now();
var rx = /[A-ZＡ-Ｚア-ロｱ-ﾛあ-れ]{1}(.{0,2})?[\-－.]?[0-9０-９]{2}[\-－.]?[abａｂ]/;

var str = "abfdfaerajofajo39u82ini98c9a434428jm3nicaa3e"
for(var i=0; i<1000000; i++){
    rx.test(str);
}

console.log(Date.now() - t); 
// 5.297秒/0.622秒/0.067秒


```



あ、あれー！？


**全然ダメじゃん！**

追記： **デバッグコンソールダメじゃん！**　あとループ内での正規表現リテラルは早い。
27.6213秒 -> 0.762秒 とか、 0.262秒 -> 0.071秒 に減少する。ループ内でNewすることはない





### 結論


すくなくともjavascriptにおいては、 **正規表現リテラルをループ内で使っても速度は変わらない** みたいです。
（予想外だったので何回か試したけど、ほぼ同じ結果です）
**「正規表現リテラルを使えば早くなる！」** とか言う人は笑ってあげましょう。


**正規表現リテラルは早い！**です

やっぱり**ループ内で百万回Newする**のと比べて**正規表現リテラルは10-100倍早い**と言えそうです。
また、**正規表現リテラルの速度は1回だけNewするのとほぼ等しい**です。ただ、厳密には0.1-0.001秒くらい遅い。

あと、**デバッグコンソールを使うと最適化が無効になる**事もわかりました。
密码管理软件Enpass介绍

![](https://enpass.io/static/media/uploads/wpcool/pc0.png)
[Enpass](https://enpass.io)是一款密码管理工具，用户可以把一些需要记住的帐号和密码保存在这里，它采用了军用级加密术，保证了密码帐号的安全，将密码都存在这里，那么就只需要记住该软件的密码就行咯，不用担心手机掉了密码就没了的问题，因为这个是跨平台的工具，在PC上也能查找。
<!--more-->
![screen800x500.jpeg](https://ooo.0o0.ooo/2015/12/28/568146d9457d1.jpeg)
另外,桌面版的客户端都是免费的,包含PC,Mac和Linux,移动版的话是一个平台10美金永久使用.相对`Lastpass`和`1Password`厚道多了..  
![](https://enpass.io/static/media/uploads/linux/lin10.png)
当然也支持 Firefox/Chrome的插件
数据同步方面,支持几个主流的网盘,只可惜在国内只有OneDrive可以正常使用了.当然程序可以设置代理服务器,如果有`技巧`的话,我还是推荐使用Dropbox来同步.
![设置_2015-12-28_22-23-32.png](https://ooo.0o0.ooo/2015/12/28/56814687ad840.png)
pyenvよく使うコマンド

pyenvでよく使うコマンドを記載


現在のバージョンを表示

```
$pyenv version
```

インストール済みのpythonのバージョン一覧

```
$pyenv versions
```



インストールが可能なバージョンの一覧

```
$pyenv install -l
```

2.*.*のインストール

```
$pyenv install 2.*.*
```

ローカル環境に2.*.*を適用

```
$pyenv local 2.*.*
```

hogeという名前で2.*.*の開発環境を生成

```
$pyenv virtualenv 2.*.* hoge
```

hogeをアクティブにする

```
$pyenv activate hoge
```

アクティブになっている開発環境を終了する

```
$pyenv deactivate
```


Pythonインタープリタのデフォルトのバージョンを設定する

```
$ pyenv global 3.4.1
```

カレントディレクトリに.python-versionを作成し，そのバージョンに設定(globalより優先される)

```
$ pyenv local 2.7.9
```

以上
クローラー構築の際に気をつけたいこと

この記事は [CAMPHOR- Advent Calender 2015](http://advent.camph.net/) 延長戦、29日目の記事です。

今回はスクレイピングについてです。スクレイピングのやり方なんかは他にたくさん記事が上がっているのでそういうのはやめて、昔クローラーとしてたくさんのサイトを継続的にスクレイピングして回っていた(~~google botかな？~~)ときに経験したことについて書いていこうかなと思っています。これからクローラーを構築しようとしている方の参考になればと。

## DOS攻撃をしない
基本ですね。スクレイピングをするときはサーバーへの負荷も考えて、あまり一度にたくさんのリクエストを送らないようにしましょう。

## サイトのリニューアルを検知
webサイトは時として何の前触れもなくリニューアルがされて全く違う構造になることがあります。ECサイトなんかは企業の買収や合併も激しく、リニューアルも頻繁に行われることでしょう。イケイケなテック企業だったら突然フロントエンドにReact.jsを導入したりすることでしょう。ですので、そういったときにすぐ気づけるよう、大きくDOM構造が変わった時やそれまで取得できていた情報が取得できなかったときには検知できるようにしておきましょう。

## 情報の更新
店舗やホテルの予約状況、商品の在庫数や価格など、ページの情報は日々変化していきます。こちらで持っている情報も更新できるように一意の値をつけて管理したいです。ページのURLだけで判断すると、キャンペーンなどのLPから来た場合には通常とURLが異なるなどの場合に対応ができません。品番や店舗コードなどの一意の値で管理したいところです。(とはいえ、大規模リニューアルの際にはそれすらも変わることがあります...)

## リダイレクト
商品が売り切れたり店舗がなくなったときに違う商品や店舗のページにリダイレクトをかけるようにしているサイトがあります。また、ステータスコード200を返して404 Not Foundと表示されたページに誘導したりといったサイトもあります。h1タグの内容をチェックするなどの対策も考えておきましょう。

## イベント発火・Ajax通信
静的なHTMLを取得してスクレイピングというのが通用しないサイトがあります。クリックイベントによるAjax通信が必要な場合などです。どうにかしてイベントを発火しましょう。選択肢としては [PhantomJS](http://phantomjs.org) やそれをラップした [CasperJS](http://casperjs.org) を使うなどがあるかと思います。諦めず戦いましょう。

##### 関連リンク
- [【連載】CasperJS でスクレイピング (1) - CasperJS の基本](http://d.hatena.ne.jp/scientre/20140405/casperjs)
- [CasperJSで動的ページをスクレイピング、あるいは毎月100円ゲットする方法について] (http://blue1st.hateblo.jp/entry/2014/11/09/064556)


## クエリパラメータに注意
少し細かい話になりますが、ページ番号をクエリパラメータに含めたりする場合( http://example.com?page=2 など)に、最後のページの数字より大きい数字を指定した場合にページ内容が最後のページのまま変化しないということがあります。スクレイピングが終わらなくなってしまいます。大抵の場合は最後ページ以降への導線がなかったりするので、リンクが存在するかチェックしましょう。

## まとめ

いかがでしたか？スクレイピングを継続してやるのは結構大変です。とはいえ欲しい情報を勝手に取ってきてくれるのはなかなか爽快なものです。
最近は [AirbnbScrape](https://github.com/hamelsmu/AirbnbScrape) というのを教えてもらったのですが、Airbnbのスクレイピングなんかは面白そうでぼくもやってみたいなぁと思っています。

明日の30日目は3回目の @ryota-ka の記事です！
reduxでの大きなreducerの分割方法について


今回は前回の[reduxでのstate管理について](http://qiita.com/rchaser53/items/41a6a149ca00cf405eca)で記述した
*1つのIdに紐づくstateが大量に作成された結果、巨大なaction,reducerファイルができてしまった*
という問題をどのように解決したかについてまとめていきたいと思います。

前回も記述しましたが実際にredux使ってみると小さなaction,reducerファイルと一つのIdに紐づく大きなaction,reducerができました。その解決策は至ってシンプルなものでした。stateを分割しそれぞれに同じIdを振っただけです。

下のような形です。こんな感じのstateを

```
unitState = {
	id:"testId",
	stateA:{
		aaa,
		bbb,
		(以下略)
	},
	stateB:{
		ccc,
		ddd,
		(以下略)
	},
	(以下略)
}
```

下のように分割しました。

```
stateA = {
		id:"testId",
		aaa,
		bbb,	
		(以下略)
} 

stateB = {
		id:"testId",
		ccc,
		ddd,
		(以下略)
	},
(以下略)
```

stateA,stateBなどなど全部reducerファイルを持つわけですが、それに全部追加用と削除用のcaseを追加しました。
	
```reducerStateA.js
// stateADefinitionはstateAの定義ファイル
import stateADefinition from "stateADefinition";

export default function stateA(state = initialState.stateA, action) {
    switch (action.type) {
        case ActionTypes.ADD_UNIT:
			// 追加処理
			return Object.assign({}, state, { [action.id]: stateADefinition[unitType] });
		case ActionTypes.DELETE_UNIT:
			// 削除処理
			let tempObj = Object.assign({}, state);
			delete tempObj[action.id];
			return tempObj;

		(他の処理は略)
        default:
            return state;
    }
};
```

```reducerStateB.js
import stateADefinition from "stateBDefinition";
import * as Immutable from "immutable";

export default function stateB(state = initialState.stateB, action) {
    switch (action.type) {
        case ActionTypes.ADD_UNIT:
			// 追加処理は略
		case ActionTypes.DELETE_UNIT:
			// 削除処理は略

		(他の処理は略)
        default:
            return state;
    }
};
```

actionは下のような形になります。

```action.js
// ひたすらActionTypesが定義されている
import ActionTypes from 'ActionTypes';

function addUnit(id,unitType){
	return {
		type:ActionTypes.ADD_UNIT,
		id,
		unitType
	}
}

function deleteUnit(id){
	return {
		type:ActionTypes.DELETE_UNIT,
		id
	}
}
```

dispatchされたactionは全てのreducerファイルに届くので、追加 or 削除したい際は好きなファイルでaddUnitかdeleteUnitを呼ぶだけでOKでした。オブザーバーパターンとか考える必要すらなかったです。
ちなみに必要ないかもしれないですがstateADefinitionはこんな感じのファイルです。

```stateADefinition.js
const definition = {
	squareType:{
			aaa:"A1",
			bbb:"B1",
			(略)
		  },
	circleType:{
			aaa:"A2",
			bbb:"B2",
			(略)
		},
	(略)
};
export default definition;
```

各unitのstateの定義が設定されています。actionでidと一緒に渡したunitのtypeを使ってunitの定義を取得します。皆が自由に新しいunitの定義を追加できます。
新規にstateを追加したい際も同様にreducerとdefinitionファイルを追加するだけです。拡張性がreduxの売りだと聞きましたが、確かにその通りかなと思いました。

さらに言えばreduxについて良くしらなくても定義ファイルの追加、変更はできます。少し話はずれますがaction,reducerも単なる関数なので結構簡単にテストが書けます。仕事の分割が非常にやりやすいなというのが開発をしていての現実的な感想です。
[jQuery mobile] buttonタグでPopUpを開く方法

jQuery mobileでポップアップを開く時は通常&lt;a&gt;タグにdata-rel属性で指定しますが、
フレームワーク等の縛りなどでbuttonタグを使いたい場合の回避策をまとめます。


#NGな書き方
```html
<button data-rel="popup" onClick="location.href='#popup'">ポップアップを開く</button>
```

#回避策
```html
<!-- ポップアップ本体 -->
<div id="popup" data-role="popup">
<!-- 省略 -->
</div>

<!-- 1.非表示のリンクを作る -->
<div style="display:none;">
	<!-- data-transitionやdata-position-toなどを付けたい場合はここでつける -->
	<a href="#popup" data-rel="popup" id="hiddenBtn">
		<!-- 中身は空でおｋ -->
	</a>
</div>


<!-- 2.Buttonタグを設置 -->
<button id="popupBtn">ポップアップを開く</button>
```

あとは、ボタンが押された時にaタグのクリックイベントを発火させればポップアップが開きます。

```js
$(function(){
	$('#popupBtn').on('click', function(){
		//Clickイベントを発火させる
		$('#hiddenBtn').click();//※cは小文字なので注意
	});
}


// モバイルサイトならClickイベントではなく、Tapイベントを使うと表示速度の面で効果的
$('#popupBtn').on('tap', function(){
	$('#hiddenBtn').click();
});

```
pyenv-vertualenvでcondaのenvを特定ディレクトリに適用する

Jupyter notebookを開きたいとか特定のディレクトリでcondaを開きたい時有りますよね。
pyenvでinstallしたcondaがベースなら、[pyenv-vertualenv](https://github.com/yyuu/pyenv-virtualenv)で便利にconda envも対応できます！

こういう設定がある時

```shell-session
$ conda env list                                                                                                          ✭ ◼
# conda environments:
#
analysis              *  /Users/chezou/.pyenv/versions/anaconda3-2.1.0/envs/analysis
root                     /Users/chezou/.pyenv/versions/anaconda3-2.1.0
```

これで設定をすれば、行ける

```shell-session
$ pyenv local anaconda3-2.1.0/envs/env-name
```

便利
bashでの移動キーバインド（まとめメモ）

bashでショートカットをなかなか使えていないので（すぐ忘れちゃうので）、一度まとめてみました。  
基本的に備忘用なので、すでによく使っているもの([Ctrl]+[l]とか)や、特に不要だと思うもの(deleteと同じ動作とか)については記載を省いています。

## カーソル移動系
- [Ctrl]+[a] : 行の先頭に移動
- [Ctrl]+[e] : 行の末尾に移動
- [Esc]+[f] : １単語右側にカーソルを移動
- [Esc]+[b] : １単語左側にカーソルを移動

エスケープとの組み合わせという珍しいショートカットが使えるようです。  


## 切り取り貼り付け系
- [Ctrl]+[k] : カーソル右側を全て切り取り
- [Ctrl]+[u] : カーソル左側を全て切り取り
- [Ctrl]+[w] : カーソル左側にある１単語を切り取り
- [Esc] + [d] : カーソル右側にある１単語を切り取り
- [Ctrl]+[y] : ペースト

</br>
まずはこのくらいを使いこなせるようにします。
あるURLにアクセスすると別のディレクトリを参照する



# やりたいこと

- Passengerを利用してRailsアプリをApacheにのせている
- `/hoge` にアクセスするとドキュメントルート外にある`/var/html/hoge`にアクセスしてほしい
- `/var/html/hoge` には `.htaccess`があるのでそれを有効にする

# やったこと

`Alias`を使って `/var/html/hoge`を見に行くようにする。
`/var/html/hoge/.htacess`を有効にするため`AllowOverride All`をつけた

```bash:/etc/httpd/conf/httpd.conf

<VirtualHost *:80>
  ServerName foo.com
  DocumentRoot /var/html/foo/public
  
  <Directory /var/www/html/foo/public >
    AllowOverride All
    Order allow, deny
    Allow from all
  </Directory>
  # Alias で指定
  Alias /hoge /var/html/hoge
  <Directory /var/html/hoge>
  	# passenger を有効にしない
    PassengerEnabled off
    # /var/html/hoge/.htaccess を使用
    AllowOverride ALl
  </Directory>
</VirtualHost>

```

して `service httpd restart`で再起動

# 参考

[Rails Passenger and PHPmyadmin Issue | Poetry of Programming](http://kiran.gnufied.org/2010/12/23/rails-passenger-and-phpmyadmin-issue/)

[mod_alias - Apache HTTP サーバ バージョン 2.4](http://httpd.apache.org/docs/current/ja/mod/mod_alias.html#alias)

[Configuration reference - Apache - Passenger Library](https://www.phusionpassenger.com/library/config/apache/reference/#example)
並行処理プログラミング：スレッドプールを使う

#スレッドプールを利用する
###スレッドプールを使うときに覚えておく事
- スレッドプールはタスクが同質で独立しているときにいちばん有効に使う事ができる。
- 実行中の全てのタスクが、ワークキューの上にいるタスクの結果を待つ場合、**スレッドの飢餓状態デッドロック**がおきる。
下記のThreadDeadLockクラスでは必ずデッドロックが発生する。ExecutorServiceとFutureは非常に便利だが、<span style="color:red">getメソッド使用するとサブタスクの処理が完了するまでメインスレッドをブロック</span>し、サブタスクが完了してから値が返される。

```
public class ThreadDeadLock{
    ExecutorService exec = Executors.newSingleThreadExecutor();
    
    public class RenderPageTask implements Callable<String>{
            public String Call() throws Exception{
                Future<String> header, footer;
                header = exec.submit(new LoadFileTask("header.html"));
                footer = exec.submit(new LoadFileTask("footer.html"));
                String page = renderBody();
                return header.get() + page + footer.get(); //デッドロックが発生、タスクはサブタスクの結果を待ち続ける。
            }
    }
}

```

- スレッドプールが大きすぎる事と、小さすぎることを避ける。
    - 計算が主なタスクでは、仮にスレッド数Nとすると「N+1」スレッドが最も効率的に利用できる。(ページフォールトなどで休止する為に一つ余分にスレッドを用意する)

###ThreadPoolExecutorを構成する
- ThreadPoolExecutorはExecutorsクラスが提供しているファクトリメソッド(newCachedThreadPool,newFixedThreadPool...)が返すExecutorの実装クラスの共通のベースクラス
- Coreプールサイズ(常に維持しようとするスレッド数)、最大プールサイズ、キープアライブ時間の3つがスレッドの作成と破壊を支配する
    - newFixedThreadPoolはコアプールサイズと最大プールサイズの両方をリクエストされたプールサイズにセット、タイムアウトは無限
    - newCachedThreadPoolはコアプールサイズ0,最大プールサイズ無限、タイムアウト1分
    - newSingleThreadPoolはタスクが並行に実行されない事を保証し、スレッド拘束によるスレッドセーフ性を満たす
- ThreadPoolExecutorでは実行を待つタスクを入れるためにBlockingQueueが使われる。キューが満杯のときにリクエストされたタスクをどうするかは飽和ポリシーがある。
- スレッドプールがスレッドを作るときにはThreadFactoryインタフェースを用いる

```
public interface ThreadFactory{
    Thread newThread(Runnable r);
}
```

###ThreadPoolExecutorを拡張する
- ThreadPoolExecutorは拡張される前提で設計されているのでサブクラスがオーバライドできる"フック"を提供している。beforeExecute,afterExecute,terminatedなどのフックをオーバライドして、ThreadPoolExecutorの機能を拡張できる。
- beforeExecutor,afterExecutorはタスクを実行するスレッドの中で呼ばれるため、ログ記録、監視、統計収集の目的に使える。

```
public class TimingThreadPool extends ThreadPoolExecutor{
    private final ThreadLocal<Long> startTime = new ThreadLocal<Long>();
    private final Logger log = Logger.getLogger("TimingThreadPool");
    private final AtomicLong numTasks = new AtomicLong();
    private final AtomicLong totalTime = new AtomicLong();

    protected void beforeExecute(Thread t, Runnable r){
        super.beforeExecute(t,r);
        log.fine(String.format("Thread $s: start %s",t));
        startTime.set(System.nanoTime());
    }

    protected void afterExecute(Runnable r, Throwable t){
        try{
            long endTime = System.nanoTime();
            long taskTime = endTime - startTime.get();
            numTasks.addAndGet(taskTime);
            log.fine(String.format("Thread %s:end %s, time = %dns",t,r,taskTime));
        }finally{
            super.afterExecute(r,t);
        }
    }

    protected void terminated(){
        try{
            log.info(String.format("Terminated: avg time=%dns",totalTime.get()/numTasks.get()));
        }finally{
            super.terminated();
    }
}

```
ApacheでBasic認証をするhtpasswdのコマンド


htpasswdはBasic認証を利用してページのアクセスを制限をするコマンド。

# ユーザの追加 (初回)


```bash:

# htpasswd -c 保存先 ユーザ名

$ htpasswd -c /foo/.htpasswd user1


```

# ユーザの追加（2回目以降）

```bash:

# htpasswd 保存先 ユーザ名

$ htpasswd /foo/.htpasswd user2


```

# ユーザの削除

```bash:

# htpasswd -D 保存先 ユーザ名
$ htpasswd -D /foo/.htpasswd user1

```

# 参考

[htpasswd - Manage user files for basic authentication - Apache HTTP Server Version 2.4](http://httpd.apache.org/docs/2.4/ja/programs/htpasswd.html)
document.getElementById()...の代わり. querySelectorのメモ

#querySelectorの使い方メモ

cssセレクタのように書く

```js

document.querySelector("#hoge");                // id が hoge の要素を取得
document.querySelector("section>h2");           // section 直下の h2 を取得
document.querySelector("input[type='submit']"); // type が submit の要素を取得
document.querySelector(".foo");                 // class が foo の最初の要素を取得
document.querySelectorAll(".foo");              // class が foo の要素を配列として全て取得
document.querySelectorAll(".foo, .bar");        // class が foo もしくは bar の要素を配列として全て取得
```
WindowsPCに、PROXYサーバを立てる


# BlackJumboDog
http://www.forest.impress.co.jp/library/software/blackjmbdog/

# 設定
http://ganbarepc.blog32.fc2.com/blog-entry-324.html

オプション(O)
↓
プロキシサーバ(P)
↓
ブラウザ(B)
↓
クライアントから見たポート確認
（多分デフォルト8080）
↓
ACLに許可したいセグメントを追加

# 起動と停止
起動/停止(S)
Sassの@eachを使ってタブ実装をするCSS思いついた


CSSとHTMLでやるこういうタブの実装
![JS_Bin.png](https://qiita-image-store.s3.amazonaws.com/0/7307/c2a04885-7240-ad5f-c527-01056fab6657.png "JS_Bin.png")

選択されているものを`.active`などのクラスをつけて色を変えるような実装についての思いつき。

### いつもやる感じのやつ
普通にBootstrapを習ったやり方をするとこんな具合

```html
<ul id="list1">
    <li>AAAA</li>
    <li class="active">BBBB</li>
    <li>CCCC</li>
</ul>
```

```scss
#list1{
  li{
    cursor: pointer;
    display: inline-block;
    border: 1px gray solid;
    border-bottom: 0px;
    padding: 10px;
  }
  .active{
    background: #ccb;
  }
}
```

これをサーバーサイドで何らかやろうとすると、だいたいこんな感じになると思う。今回はjadeを使って再現

```jade
- var activeTab = "bbbb"
- var tabs = ["aaaa", "bbbb", "cccc"]
ul#list1
  each tab,i in tabs
    li(class=(tab == activeTab ? "active" : "" ))= tab        
```
だいたいこんな感じになる。


### 思いついたやつ
もしかしてこれ、scssの`@each`とかある今ならもうちょっといい感じに出来たりするんじゃね？って思って考えてみた

```html
<ul id="list2" class="active-bbbb"> <!-- 親で指定する -->
    <li class="tab-aaaa">AAAA</li>
    <li class="tab-bbbb">BBBB</li>
    <li class="tab-cccc">CCCC</li>
</ul>
```
```scss
#list1{
  li{
    cursor: pointer;
    display: inline-block;
    border: 1px gray solid;
    border-bottom: 0px;
    padding: 10px;
  }
  $tabs: aaaa, bbbb, cccc; // 利用するタブを並べる
  @each $tab in $tabs{
    &.active-#{$tab}{
      .tab-#{$tab}{ // 親と一致したらactive化する
        background: #ccb; 
      }
    }
  }
}
```

CSS化するとこんな感じ

```css
#list1 li {
  cursor: pointer;
  display: inline-block;
  border: 1px gray solid;
  border-bottom: 0px;
  padding: 10px;
}

#list1.active-aaaa .tab-aaaa {
  background: #ccb;
}

#list1.active-bbbb .tab-bbbb {
  background: #ccb;
}

#list1.active-cccc .tab-cccc {
  background: #ccb;
}
```

テンプレ的にはこんな感じ

```jade
- var activeTab = "bbbb"
- var tabs = ["aaaa", "bbbb", "cccc"]
ul#list2(class="active-" + activeTab)    
  each tab,i in tabs
    li(class="tab-" + tab)= tab
```

`<li>`でのロジックが消えてくれた。
今回の簡易な例だとあんまり恩恵が見えないが、`<li>`の中身が複雑で別途パーシャル化しないといけないとかの時には使えるかもしれない
tee コマンド for windows

職場に酷いスクリプトがあったのでカッとなって作った。

おそらく監視ツール(JP1?)が標準出力を記録するからという理由で標準出力に出したい勢力と、従来通り実行ログに落としたいという勢力の妥協点だと思われる。

ヘッダは man のパクリです。

```vbnet
' ==================================================================================================
' 名前
'   tee - 標準入力から読んだ内容を標準出力とファイルに書き出す
' 
' 書式
'   tee [/a] [/append] [file...]
'   tee [/?] [/help] [/version]
' 
' 説明
'   tee コマンドは標準入力を、標準出力と引数で与えられた全てのファイルとにコピーする。
'   何らかのデータをパイプに送るとき、同時にそのコピーを保存しておきたいときに便利だろう。
'   存在しないファイルに書き出そうとすると、このファイルは作成される。もしすでに存在しているファイルに
'   書き出そうとすると、 /a オプションを使わない限り、以前の内容は上書きされる。
' 
' オプション
'   /a, /append
'       ファイル内容を上書きせずに、標準入力をファイルに追加する。
'   /?, /help
'       標準出力に使用方法のメッセージを出力して正常終了する。
'   /v, /version
'       標準出力にバージョン情報を出力して正常終了する。
' 
' 注意
'   動作には .NET Framework 1.1 以上(System.Collections.ArrayList) が必要
' 
' ==================================================================================================

option explicit

' =========
' parameter
' =========
dim iomode
iomode = 2 ' for writing


' ===============
' parse arguments
' ===============
dim i, arg
i = 0
do while i < WScript.Arguments.count
    arg = WScript.Arguments.Item(i)
    if left(arg, 1) <> "/" then exit do
    select case arg
    case "/a", "/append"
        iomode = 8 ' for appending
    case "/?", "/help"
        call WScript.Echo("tee - 標準入力から読んだ内容を標準出力とファイルに書き出す")
        call WScript.Echo("使用法： tee [option]... [files]...")
        call WScript.Quit(0)
    case "/v", "/version"
        call WScript.Echo("tee version 0.1")
        call WScript.Quit(0)
    end select
    i = i + 1
loop


' ==========================
' get file objects to output
' ==========================
dim fso, file, files
set fso = CreateObject("Scripting.FileSystemObject")
set files = CreateObject("System.Collections.ArrayList")
do while i < WScript.Arguments.Count
    arg = WScript.Arguments.Item(i)
    on error resume next
        set file = fso.OpenTextFile(arg, iomode, true)
        if err.number <> 0 then
            call WScript.StdErr.WriteLine("[" & err.number & "] " & err.description & "'" & fso.GetAbsolutePathName(arg) & "'")
        else
            call files.Add(file)
        end if
    on error goto 0
    i = i + 1
loop


' ================================
' output stdin to stdout and files
' ================================
dim stdin, line
set stdin = WScript.Stdin
do while not stdin.AtEndOfStream
    line = stdin.ReadLine()
    call WScript.Echo(line)
    for each file in files
        call file.WriteLine(line)
    next
loop
```
Railsの開発でちょっと忘れそうなTipsまとめ


[最近やった開発](http://y-temp4.hatenablog.com/entry/I_made_a_Web_service_that_bookmark_to_Hatena_bookmark_the_article_you_have_stock_in_Qiita)で、つまづいたことなどを共有しておきます。

## DBを使わない時の設定

色々と参考記事を見つけた。

[DB不要のRailsアプリの作り方](http://qiita.com/h7kayama/items/8b0870716777494f8c31)

[rails new で作成したテンプレートの、DBを使わない設定とそうでない場合の違い - ux00ffの日記](http://d.hatena.ne.jp/ux00ff/20120229/1330502390)

最終的には後者でやりました。

```
$ rails new APP_NAME -O 
```

便利。

## Rails開発環境の構築(Mac)

[Rails開発環境の構築（複数バージョン共存可能）（Homebrew編）](http://qiita.com/emadurandal/items/e43c4896be1df60caef0)

を参考にして今回は環境構築した。

今まではvagrantを使うか、使わない時はmac環境でやるにしてもかなり適当だったため、かなり参考になった。

## Ymlファイルの読み込み

`config/hoge.yml`の読み込みは以下のように行う。

```
Hoge = YAML.load(File.read("#{Rails.root}/config/hoge.yml"))[Rails.env]
```

このファイルは`config/initializers`に配置する。

## DBと関係がないform

[【ruby】ActiveModelを使ってDBと関係ないFormを作成する【Rails】](http://tanihiro.hatenablog.com/entry/2014/01/09/193720)

[【Rails】formヘルパーを徹底的に理解する](http://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9)

`form_tag`を使うのがまぁ便利。

## scssでbackground-imageを使うとき

例えば、

```
h1 {
  background-image: url("icon.png");
}
```
のように書いていると、ローカルでは表示されても本番環境（自分の場合heroku）では表示されなかった。

このように記述するべき。

```
h1 {
  background-image: image-url("icon.png");
}
```
jQuery mobileのポップアップが消えない場合の対策方法

jQuery mobileのPopUpをボタン等で閉じる際に、data-rel="back"をつけても消えない場合の対策方法です。

今回作ったポップアップはこんな感じ↓

```html
<!-- ポップアップを開くボタン -->
<a data-role="button" href="#testpop" data-rel="popup">PopUpを開く</a>

<!-- ポップアップ本体 -->
<article id="testpop" data-role="popup" data-history="false">
	POPUP!!!
	<button data-role="button" id="closeBtn">閉じる</button>
</article>
```

以下のコードを追加します。

```js
$(function(){
	$('#closeBtn').on('tap',function(){
		// ボタンがタップされたらオーバレイのクリックイベントを発火させる
		$('#testpop-screen').click();
	});
}
```

##解説
jQuery mobileでポップアップを表示した場合、ポップアップ周りは、「ポップアップ名-screen」という名前の要素で覆われます。
この部分をクリックすると、デフォルトではポップアップが閉じるので、それを利用して閉じるという流れです。

なので、data-dismissible="false"をつけてポップアップ外をタップしても閉じないように指定している場合は、
この方法は使えません。

PhoneGapでも正常に動くことは確認できました。
Playground で Autolayout をする

``XCPlayground`` をインポートして設定が必要

```swift
import XCPlayground

// canvas が root view
let canvas = UIView(frame: CGRectMake(0,0,300,300))
canvas.backgroundColor = UIColor.redColor()

XCPlaygroundPage.currentPage.liveView = canvas
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
```
Library not loaded: /usr/local/lib/libmysqlclient.18.dylibのエラーの解決

■環境
MacOSX 10.11.2
端末：MacBookAir
Homebrew 0.9.5
Ruby 2.2.2
Rails 4.2.3

Macでrailsのmysqlを起動したら、以下のエラーが起きて詰まった。

```lang:
$ bundle exec rake db:migrate
rake aborted!
LoadError:dlopen(/Users/username/rails/app_name/vendor/bundle/ruby/2.2.0/gems/mysql2-0.3.20/lib/mysql2/mysql2.bundle, 
9): Library not loaded: /usr/local/lib/libmysqlclient.18.dylib ...
```

解決策をググると、シンボリックリンクにて、適切な場所にlibmysqlclient.18.dylibを設置すればよいと書いてある。
引用元：http://qiita.com/w7tree/items/656b5d3e6a6f0a0b475e

以下を実行する。

``` lang:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib
/usr/lib/libmysqlclient.18.dylib
```
上記により、/usr/lib/libmysqlclient.18.dylibというリンクのパスで、/usr/local/mysql/libの中のlibmysqlclient.18.dylibファイルにアクセスできるようになるはず。

すると以下のように権限がないとエラーになる。
`/usr/lib/libmysqlclient.18.dylib: Operation not permitted`

権限がないとエラーが出るが、chown~で権限を与えたり、rootでログインしても`Operation not permitted`が出る。ここから、どこまでググっても良い記事がなかったので、とりあえず、`brew doctor`で出た警告に関して、すべて対応する。しかし、上記のエラーは解決されない。

落ち着いて、/usr/local/の中を見るとmysqlフォルダーがないことに気づいた。次にエラーメッセージの通り、/usr/local/の中のlibフォルダーを見たが、ここにもそもそもlibmysqlclient.18.dylibがないことに気づいた(libmysqlclient.20.dylibはあった)。なぜかrake db:migrateしようとしていたアプリのファイルの中に、libmysqlclient.18.dylibが存在したため、libmysqlclient.18.dylibをmvコマンドでusr/local/のlibフォルダーに移動すると解決した。

■考察
エラーメッセージを元にググり、解決策をそのままコピペしたが上手くいかなかった。これを見てくださった人が本エラーに陥ったとして、シンボリックリンクの解決策でも上手くいかない場合は、そもそもlibmysqlclient.18.dylibというファイルは、どこのlib(ライブラリーフォルダー)に入っているか確認することが重要だと思う。適切な場所にある場合は、シンボリックリンクで行けるのだと思う。

■参考
・libmysqlclient.18.dylibのエラーに関して
http://ja.stackoverflow.com/questions/18922/rails%E3%81%ABmysql%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6rake-dbcreate%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E8%A7%A3%E6%B6%88%E6%96%B9%E6%B3%95
http://qiita.com/w7tree/items/656b5d3e6a6f0a0b475e
・シンボリックリンクに関して
http://qiita.com/pugiemonn/items/e5fb508df690a323ee14
・homebrewに関して
http://qiita.com/omega999/items/6f65217b81ad3fffe7e6
Railsではてなapiを使うときに参考にした記事やgemのまとめ

[Qiitaでストックしている記事をはてなブックマークにブックマークするWebサービスを作りました](http://y-temp4.hatenablog.com/entry/I_made_a_Web_service_that_bookmark_to_Hatena_bookmark_the_article_you_have_stock_in_Qiita)

で触れた、参考にした記事やgemなどをまとめておきます。

## 記事まとめ

### [はてブAPIでwebサービスを作りたい全ての人に向けて書きました](https://syncer.jp/hatebu-api-matome)

一番下にapi利用サービス例があるのが良い。

### [Consumer key を取得して OAuth 開発をはじめよう - Hatena Developer Center](http://developer.hatena.ne.jp/ja/documents/auth/apis/oauth/consumer)

基本です。一番下にあるrubyのサンプルがかなり役立ちました。

### [Ruby ではてな OAuth のアクセストークンを取得する - kymmt's note](http://kymmt90.hatenablog.com/entry/hatena_oauth)

サンプルがあり、わかりやすい。

### [RailsでいろんなSNSとOAuth連携/ログインする方法 - Qiita](http://qiita.com/awakia/items/03dd68dea5f15dc46c15)

deviseとomniauthを使った、各種SNSとの連携まとめ。もちろんはてなも含まれている。
ただ、自分は今回deviseやomniauthを使っていないので、本当に軽く参考にしただけ。

## gemまとめ

### [hatena-bookmark](https://github.com/kkosuge/hatena-bookmark)

非常にシンプルで使いやすかった。

### [oauth](https://github.com/oauth-xx/oauth-ruby)

[Consumer key を取得して OAuth 開発をはじめよう - Hatena Developer Center](http://developer.hatena.ne.jp/ja/documents/auth/apis/oauth/consumer)の方法でやるなら入れておく必要がある。

### [omniauth-hatena](https://github.com/mururu/omniauth-hatena)

普通はこれを使うのだと思う。
Railsが生成するパスヘルパーは読みづらいし書きづらくないかい？

rubyの命名規則がアンダーバー区切りなので、
routesの名前もアンダーバーになるわけだが、
routesが入れ子であることを示すのもアンダーバーになるわけで、


`aaaaa_bbbbb_cccccc_ddddd_ffffff_path`

みたいなのが生成されて結構きつい。

しかも、どうしても親と名前が重複するケースもでてくると

`bbbbb_aaaaa_aaaaa_cccccc_dddddd_ffffff_path`

みたいになる。
はっきりいって、毎回調べないとどこに遷移するのかよくわからない。


解決策はないものか。
KVM on CentOS7 にゲストOS ( Windows Server ) を作成する

//2015-12-31 追記
KVM 上に Windows Server をインストール後，Windows Update を実行していると頻繁に予期せぬシャットダウンが発生。
以下を実行することで、いまのところ正常に動いている。

- vcpu を 2 から 1 に変更
- NIC ドライバを virtio に変更

---
KVM on CentOS7 上に Windows Server をインストールする

ゲスト OS の作成を開始

```
# virt-install \
--name Win2012R2_1 \
--ram 2048 \
--vcpus=1 \
--file=/data/kvm/images/Win2012R2_1.img \
--file-size=40 \
--cdrom=/data/iso/win2012r2.ISO \
--os-variant=win2k12r2 \
--network bridge=br0 \
--accelerate \
--graphics spice,listen=0.0.0.0 --channel spicevmc \
--video qxl \
--noreboot
```

SYSTEM THREAD EXCEPTION NOT HANDLED とのエラーが発生し、インストール不可

![thread_exception.png](https://qiita-image-store.s3.amazonaws.com/0/107206/d1353a0c-dc23-f46e-ba0a-c947835d5bb7.png)

以下変更を実施したが状況変わらず

・virt-install の --cpu オプションで、kvm64 を指定してインストール
・仮想 HDD のサイズを 60GB にしてインストール


・disk bus が ide になっているので、virtio を使用できるよう KVM Windows virtio ドライバーをインストールする

```
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/data/kvm/images/Win2012R2_1.img'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
```

CentOS7 のデフォルトのリポジトリでは virtio-win はインストールできない

```
# yum install virtio-win
パッケージ virtio-win は利用できません。
エラー: 何もしません
```

fedoraproject のリポジトリを追加
手順は以下 URL を参照
　https://fedoraproject.org/wiki/Windows_Virtio_Drivers

```
# yum install virtio-win
・・・・・
================================================================================
 Package          アーキテクチャー
                               バージョン         リポジトリー             容量
================================================================================
インストール中:
 virtio-win       noarch       0.1.102-1          virtio-win-stable        75 M

トランザクションの要約
================================================================================
インストール  1 パッケージ

総ダウンロード容量: 75 M
インストール容量: 164 M
Is this ok [y/d/N]: y
Downloading packages:
virtio-win-0.1.102-1.noarch.rpm                            |  75 MB   01:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : virtio-win-0.1.102-1.noarch                     1/1
  検証中                  : virtio-win-0.1.102-1.noarch                     1/1

インストール:
  virtio-win.noarch 0:0.1.102-1

完了しました!
```

以下コマンドで、virtio-win_amd64.vfd を使用して、Windows Server のインストール前にフロッピーディスクからドライバをインストール
状況は変わらず SYSTEM THREAD EXCEPTION NOT HANDLED と表示され、インストールできず。

```
# virt-install \
--name=Win2012R2_1 \
--os-variant=win2k12r2 \
--network bridge=br0 \
--disk path=/data/kvm/images/Win2012R2_1.img,size=40,bus=virtio \
--disk path=/usr/share/virtio-win/virtio-win_amd64.vfd,device=floppy \
--cdrom=/data/iso/win2012r2.ISO \
--graphics spice,listen=0.0.0.0 \
--memory 2048 \
--vcpus=2 \
--accelerate \
--noreboot
```

~~また後日時間のあるときに調査する~~

その後、--accelerate オプションを外してインストールしたら、インストールはできた
一度、KMODE_EXCEPTION_NOT_HANDLED と表示され再起動したが、起動できた
opencvをhomebrewでインストールする際cmakeやbrew-caskでつまった話

http://www.learnopencv.com/install-opencv-3-on-yosemite-osx-10-10-x/
このサイトにある通りにopencvをインストールしようと思ったんですよ
ところが
```
brew tap homebrew/science
brew install opencv
```
どうやらうまくいかない
原因はbrewが最新状態にないっていうんで
brew updateを実行しようとするとエラーが返ってくるんね、ほんで診断するしかないわと
```
brew doctor
```
ってすると
```
Warning: You have external commands with conflicting names.
Found command `brew-cask` in following places:
    /usr/local/bin/brew-cask
    /usr/local/Library/Taps/caskroom/homebrew-cask/cmd/brew-cask.rb
```
うん、これはbrew caskがじゃましてんなと
https://github.com/caskroom/homebrew-cask/releases/tag/v0.60.0
ここね、
```
brew update && brew uninstall --force brew-cask
```
これで解決でんがな、んでbrew install opencvね、でもまだ
```
$brew info opencv
==> Dependencies
Build: cmake ✘, pkg-config ✘
Required: jpeg ✔, libpng ✔, libtiff ✔
Recommended: eigen ✔, openexr ✔, homebrew/python/numpy ✔
Optional: gstreamer ✘, jasper ✘, libdc1394 ✘, openni ✘, qt ✘, tbb ✘, ffmpeg ✘
```
だから
```
brew unlink cmake
brew install cmake 
brew unlink pkg-config
brew install pkg-config 
```
あとはuninstall してもう一回installしたら見事完成っちゅうわけや
baserCMSで一括処理を実装する



baserCMSで一括処理を実装するのに、色々調べたのでその情報のまとめです。
今回は一括削除処理の実装手順を例に紹介します。
以下の手順で実装します。

## 1.BcAppControllerを継承したコントローラークラスを実装

```Controller/SampleController.php
class SampleController extends BcAppController {
    /**
     * 一括削除処理
     * @params array $ids 選択したチェックリストのID群
     * @return bool 処理結果 true:成功
     */
    protected function _batch_del($ids) {
        // 削除処理実装
        // 処理結果はboolで返却
        return true;
    }
}
```

ポイントは以下の点。

* コントローラークラスはBcAppControllerクラスを継承する
* 一括処理のアクションはajax_batchからコールされるので、アクセサはprotectedかpublicで定義
* _batch_という接頭尾でメソッド名を定義
* 一括選択した値がパスの第一引数に設定される
* メソッドの戻り値はbool型で返却する（戻り値をそのままAJaxのレスポンスで出力するため）

## 2.Viewを実装

```View/Sample/list.php
$this->BcBaser->js(array(
	'admin/jquery.baser_ajax_data_list',
	'admin/jquery.baser_ajax_batch',
	'admin/baser_ajax_data_list_config',
	'admin/baser_ajax_batch_config'
	), false);
	

<script type="text/javascript">
$(function(){
	$.baserAjaxDataList.init();
	$.baserAjaxBatch.init({ url: $("#AjaxBatchUrl").html()});
});

<div id="AjaxBatchUrl" style="display:none"><?php $this->BcBaser->url(array('controller' => 'sample', 'action' => 'ajax_batch')) ?></div>
<div id="DataList"> <?php $this->BcBaser->element('Sample/list.php')?></div>
</script>
```

```View/Sample/ajax_list.php
<?php $this->BcBaser->element('Sample/list.php')?>
```

```View/Elements/Sample/list.php
<table>
// ・・・
<td>
<?php echo $this->BcForm->checkbox('ListTool.checkall', array('title' => '一括選択')) ?>
<?php echo $this->BcForm->input('ListTool.batch', array('type' => 'select', 'options' => array('del' => '一括無効'), 'empty' => '一括処理')) ?>
<?php echo $this->BcForm->button('適用', array('id' => 'BtnApplyBatch', 'disabled' => 'disabled')) ?>
</td>
<?php //以下に処理用のチェックボックスを定義 ?>
</table>
```

ポイントは以下の点。
* View/Sample/list.phpで実装した一括処理用のJavaScriptを設定
* リクエスト先のアクション名は「ajax_batch」にする
* ajaxのレスポンス用のViewファイル（ajax_list.php）も実装すること（ajax_batchのAjax処理のコールバックのレンダリング処理のため）
* ajaxのコールバックもあるため、リストを表示部分はElementで別ファイルに実装しておく

## おまけ
今回は一括削除処理を実装しましたが、独自処理を実装する場合は上記の例で以下の点を変更すると対応できます。
以下は一括承認アクション（approve）の例です。

* View/Sample/list.phpのJavaScript部分を以下のように変更する

```View/Sample/list.php

<script type="text/javascript">
$(function(){
    $.baserAjaxBatch.config.methods.approve = {
        button: '.btn-approve',
        confirm: '選択した内容を一括承認します。'
    }
    $.baserAjaxDataList.init();
    $.baserAjaxBatch.init({ url: $("#AjaxBatchUrl").html()});
});
```
* Controller/SampleController.phpで対応するアクションメソッド（_batch_approve）を実装
小規模汎用ロガーの作成

HTTP でデータを POST するとどんどんログファイルに記録していく簡易ロガーサーバーが欲しくなったので作成しました。

# 目的

![DSC00903.JPG](https://qiita-image-store.s3.amazonaws.com/0/50737/cef9fae1-56bf-b89a-666e-2169e904b04a.jpeg)
部屋内の気温や気圧を計測したくて RaspberryPI にセンサーを付けました。
(参照)
http://www.fumi2kick.com/komekame/archives/2331
http://www.fumi2kick.com/komekame/archives/2345

このセンサーから読み取った値をネットワーク上の別サーバーにロギングしようということになったのですが、そういった小物デバイスや定期的な観測などからのデータ蓄積という場面は意外と多いため簡単なログサーバーを作ると便利だろう思ったのが今回の発端です。

RaspberryPi は割と色々できますが、これより小さい IoT 的なデバイスでも使えるようにプロトコルはシンプルな HTTP POST とし、ネットワークさえ繋がれば色んな所からログを POST できるようにします。
自宅内の「なんちゃってIoT」な環境構築への一歩かもしれません。


# 動作環境

Docker Engine と docker-compose がインストールされているサーバー上で動作します。

# 構成

![2015-12-28_075621.png](https://qiita-image-store.s3.amazonaws.com/0/50737/ed232595-5604-e753-d88f-1d6ca3f6f5a0.png)

3つの Docker コンテナで構成され、これらを docker compose でlinkを指定しながら起動します。
RabbitMQ はリクエストをシリアライズするのが目的ですが、AMQP で直接ポストしたいという状況にも対応するため挟んでいます。

# 使い方

動作させるだけならば下記の docker-compose ファイルがあれば十分です。
docker-compose.yml と名前を付けて保存してください。

```dockerfile:docker-compose.yml
rabbitmq:
  image: rabbitmq
  ports:
    - "5672:5672"
  environment:
    RABBITMQ_DEFAULT_USER: nanlog
    RABBITMQ_DEFAULT_PASS: plaoSgs

nanlogapi:
  image: rerofumi/nanlog-api
  links:
    - rabbitmq:rabbitmq
  ports:
    - "8080:8080"

nanlogstore:
  image: rerofumi/nanlog-store
  links:
    - rabbitmq:rabbitmq
  volumes:
    - /etc/localtime:/etc/localtime:ro
    - /var/log/nanlog:/store
```

docker-compose.yml をサーバーに置き、```docker-compose pull``` を実行して docker イメージを取得します。RabbitMQ は公式リポジトリのものを利用していますし、それ以外も DockerHub においてあります。
イメージ取得後

```
# docker-compose up -d
```

としてロガーを起動します。

上記 docker-compose.yml そのままだと port 8080 で待ち受けますので、```http://localhost:8080/[prefix]/``` に対しデータを POST してください。prefix の指定は必須です。POST した body がそのままログに記録されます。
curl でのテストコードは

```
$ curl -X POST -d "hoge" http://localhost:8080/test/
```

となります。
この場合 prefix が test ですので、/var/log/nanlog/test/ 内に YYYMMdd.log と日付が付いたファイルの中に "hoge" が記録されます。

log のフォーマットは1行毎の JSON 形式で、以下の様になっています。

```
{"time":"2015-12-28T15:53:38+09:00","log":"aaa"}
{"time":"2015-12-28T16:14:46+09:00","log":"bbb"}
{"time":"2015-12-28T16:22:58+09:00","log":"cccc"}
```


# ソースコード等

以下を参照。
https://bitbucket.org/rerofumi/nanlog/

# おわりに

本気でログを取ったり管理したい場合は flunetd を使ったシステムを構築したほうが良いでしょう。
そうではなくあくまで個人用途の小さいロガーとしてこういったものが部屋内にあると便利なのではないかと思います。