OmniAICreator/Qiita-1.07M huggingface dataset:
Railsで便利なコード静的解析Gem rubycritic (所要時間3分)

GYAOの窓際エンジニア　玉利です。
最近は日本のPJが大変で、ベトナム側もJavascript絡みの問題が出たりして無事死亡しております。

今の時期、日本がくっそ暑くなるタイミングでベトナムに行きたいところです。日本の夏はベトナムより暑くてインド並です（知人談） この時期のホーチミンは、太陽が北にあって（北回帰線の南側にあります）、風が涼しくてものすごく過ごしやすいんです。そして海鮮とビールをガツンと。


![スクリーンショット_2016_07_12_9_52.png](https://qiita-image-store.s3.amazonaws.com/0/113049/d560294d-a0ac-cc28-f5c3-0ec4f9ac87ef.png)


さて、いままでいろいろ品質管理の仕組みを頑張ってきました。ベトナムにかぎらずオフショアすると仕様を決めるのが精一杯で、QAを日本でやったらコストで足が出るし、QAを現地スタッフにお願いしてもザルなのは目に見えてます。労働集約型産業だったら駐在出す理由もあるのですが、知識集約だと日本で優秀な人間を取ったほうが結果安い、ということになりかねません。

今日紹介するのは、あまり日本ではメジャーじゃないrubycriticです。同様のものにrubocopがあります。海外記事では比較して語られていましたが、私は併用するべき有用なgemだと思っています。

https://github.com/whitesmith/rubycritic

特に悪さをすることも無さそうなので、さくっと入れてあげましょう。所要時間3分です。


Gemfile

```Gemfile
group :development do
  gem "rubycritic", :require => false
end
```


bundle installしたら、コマンドラインからrubucriticを起動します。

```
$ ruby critic
```


![Gemfile_-_Che-GYAO_-____RubymineProjects_Che-GYAO_.png](https://qiita-image-store.s3.amazonaws.com/0/113049/e796be9d-c99b-f1ee-39d1-76407642412e.png)

実行が終わると、ブラウザが立ち上がって結果が出力されます。

![RubyCritic.png](https://qiita-image-store.s3.amazonaws.com/0/113049/f13f6b67-d460-60fd-8dd9-b40f7231f0fb.png)


Churn（チャーン）は「激しい動き」 Complexityは複雑度です。
だいたい、品質は揃ってるみたいですが、飛んでるデータが有りますね。


![スクリーンショット 2016-07-12 9.33.25.png](https://qiita-image-store.s3.amazonaws.com/0/113049/1c6472dc-e783-9559-9fc2-06f56e493d05.png)

ポイントにマウスカーソルをあてると統計タブがでます。

では、Codeのタブを叩いてみましょう。

![RubyCritic.png](https://qiita-image-store.s3.amazonaws.com/0/113049/f427b396-0109-2912-5426-7794e74e4178.png)

各コントローラー毎の複雑度、重複、匂い（癖）がでます。画面サンプルのFってのはやばそうですね。

![RubyCritic.png](https://qiita-image-store.s3.amazonaws.com/0/113049/186f10fe-19a7-64db-e10b-33d715acd3d7.png)


あー、コピペしたコードを引っ掛けられてしまいました。どっかのヘルパーに移動しないといけません。

ベトナム人に、ここおかしいよって教えてあげるのは骨が折れる作業なので、こういうツールで検出してから自分たちで直させるのがベストな手法だと思ってます。
[AWS] nodejs で s3 sync

Lambda で S3 sync したい時とかってありますよね、無いですか？私はあったんです。

まずは npm から [node-s3-client](https://www.npmjs.com/package/s3) をインストール

```
$ npm install s3 --save
```

そんで、こんな感じで書きます。
Lambda や EC2 に適切な IAM ロールが割り当てられている場合は s3.createClient() に渡す s3Options.accessKeyId, s3Options.secretAccessKey は省略可能。

```s3sync.js
var s3 = require('s3');
var client = s3.createClient({
    maxAsyncS3: 20,     // this is the default
    s3RetryCount: 3,    // this is the default
    s3RetryDelay: 1000, // this is the default
    multipartUploadThreshold: 20971520, // this is the default (20 MB)
    multipartUploadSize: 15728640, // this is the default (15 MB)
    s3Options: {
        // accessKeyId: "your s3 key",
        // secretAccessKey: "your s3 secret",
        region: 'us-east-1',
        // endpoint: 's3.yourdomain.com',
        // sslEnabled: false
        // any other options are passed to new AWS.S3()
        // See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Config.html#constructor-property
    },
});

var params = {
    localDir: '/path/to/localdir',
    deleteRemoved: false, // default false, whether to remove s3 objects
                          // that have no corresponding local file.
    s3Params: {
        Bucket: 'your S3 bucket name',
        // Prefix: "some/remote/dir/",
        // other options supported by putObject, except Body and ContentLength.
        // See: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property
    },
};

var uploader = client.uploadDir(params);
uploader.on('error', function(err) {
    console.error("unable to sync:", err.stack);
});
uploader.on('progress', function() {
    console.log("progress", uploader.progressAmount, uploader.progressTotal);
});
uploader.on('end', function() {
    console.log("done uploading");
});
```

すっきり

参考URL: [javascript - Upload entire directory tree to S3 using AWS sdk in node js - Stack Overflow](http://stackoverflow.com/questions/27670051/upload-entire-directory-tree-to-s3-using-aws-sdk-in-node-js)
Excel2013 > PCによって文字の幅が異なる

```txt:動作環境
Excel2013 on Windows 7pro
```

EXCEL2013上で作成したファイルに関して以下の報告があった。

- PC A. 正常に見える
- PC B. 正常に見える
- PC C. 文字の幅が広がって見える

自分のPCでは正常に見える。

以下のリンクに対応方法が記載されているが、どれが有効かは未確認。

- [以前のバージョンで作ったテンプレートを開くと列幅がすべて変わる](http://answers.microsoft.com/ja-jp/office/forum/office_2010-excel/%E4%BB%A5%E5%89%8D%E3%81%AE%E3%83%90%E3%83%BC/041be956-07a0-4e28-9023-c986d114b861?msgId=9e65f8dc-5093-4f73-89ee-1e4214f0652e&auth=1)

- [異なる複数の Windows 環境で Excel ファイルを共有すると、印刷範囲、セルの幅、または高さが変更される場合がある](https://support.microsoft.com/ja-jp/kb/400271)

自分の環境であればすぐに試して確認できるが、人の環境ではそうもいかない。

上記リンク先記載のDPIは以下に設定が見つかった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/66670084-5771-8bce-e926-ca81e72d3834.png)
ReactDeveloperTools使えない問題

#内容説明
react.js始めたのでChromeの拡張機能を入れようと試みたが、動かない問題を解決した時のメモ

#本題

## link
[chrome拡張機能](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi)
[react-devtools-github](https://github.com/facebook/react-devtools)

## インストール方法

1.[ここから](https://github.com/facebook/react-devtools)`git cloneしてくる`
2. `cd react-devtools`
3. `git submodule update --init`
4. `cd shells/chrome/`electronとかfirefoxもある
5. `npm install`
6. `webpack --config webpack.backend.js`
7. `webpack`

で、`chrome://extensions/`にいって`パッケージ化されていない拡張機能を読み込む`
Dock から起動する Visual Studio Code について (OS X El Capitan)


知りませんでした。

**ごめんなさい、ちゃんと ~/.bash_profile に export LANG=ja_JP.UTF-8 って書いておけば良いだけでした。何か壮大な勘違いをしていたみたい。***

恥ずかしいけど、勉強になたので記事はそのままで。

※ Visuasl Studio Code 限定のお話ではありません

Visual Studio Code 1.3 (stable or Insiders) でターミナルへのコピペができなくなっていたり、環境変数 LANG が引き継がれなくて日本語ファイル名が文字化けしたりで、実装中だからそういうものかなと思っていたのだけど、そうじゃなかった。

OS X で vscode を起動する場合は、2 つの方法がある

  * OS X のターミナルから `code` or `code-insiders` で起動
  * Dock からアイコンをポチっ

ようは、前者は ~/.bashrc に環境変数 LANGが設定されているので、この環境変数が有効になっているターミナルから起動された vscode は、環境変数を持って起動してくる。  
なので、vscode のターミナルから環境変数を確認すると LANG が設定され、日本語のコピペが可能。
エディタ部分で選択された文字列を vscode のターミナルへ送信し実行させる `Terminal: Run Selected Text Active Terminal` でも、日本語を選択して実行できる。

一方、Dock から起動された vscode は、~/.bashrc に設定された環境変数を全て引き継いで起動するわけではないっぽく、LANG などは設定されていないので、起動した vscode は locale が `C` で起動する。一部の環境変数は設定されているので、LANG などは unset されるのかな？ 

そのため、vscode のターミナル内では日本語ファイル名などが文字化けするしコピペができない。と、判断してみた。
これが理由ってことだったらいいなぁ的なお話。

vscode のターミナルに IME から日本語入力できない件は、別問題。




## 一時的に設定する方法

OS X のターミナルで下記を実行してから、Dock から vscode を起動して vscode のターミナルで locale やコピペを確認してみる。(LANG=ja_JP.UTF-8 がセットされている)
Dock から vscode を起動して vscode のターミナルで locale やコピペを確認してみる。

```bash
$ launchctl setenv LANG ja_JP.UTF-8
```

確認方法: 

```bash
$ launchctl getenv LANG 
ja_JP.UTF-8
```

## 永続的に設定する方法

ログイン時から常に有効にするには、launchd を利用する方法。

`~/Library/LaunchAgents/environment.plist` を作成し、再起動することで設定される。

```bash
$ vi ~/Library/LaunchAgents/environment.plist
```

```plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>
    launchctl setenv LANG ja_JP.UTF-8
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
```

## 参考

* [Setting environment variables via launchd.conf no longer works in OS X Yosemite/El Capitan?](http://stackoverflow.com/questions/25385934/setting-environment-variables-via-launchd-conf-no-longer-works-in-os-x-yosemite)
メモ: debian9の環境構築

* http://cdimage.debian.org/cdimage/release/current/amd64/iso-cd/


```bash:
# psコマンド
apt install -y procps
```

## 参考

* [EasyBCDでwindows boot managerからISO bootし、windowsを消してRanchreOSをインストール - Qiita](http://qiita.com/tukiyo3/items/9c20c814f3b2c456e8b0)
* [debian9 mini.iso](https://d-i.debian.org/daily-images/amd64/daily/netboot/)
* [CloudAtCostにdebian9をインストール - Qiita](http://qiita.com/tukiyo3/items/4aa08f2a0743eff1ac83)

## 手順

* [virtualbox](https://www.virtualbox.org/wiki/Downloads), tightvncserverをインストールする

```/etc/apt/sources.list
deb http://httpredir.debian.org/debian/ stretch main
deb http://security.debian.org/debian-security stretch/updates main
```

```rb:パッケージ追加
sudo -s

apt-get install -y \
  build-essential w3m vim screen tightvncserver openbox \
  xterm linux-headers-4.6.0-1-amd64 man ranger nkf telnet
wget http://download.virtualbox.org/virtualbox/5.0.24/virtualbox-5.0_5.0.24-108355~Debian~stretch_amd64.deb
wget http://download.virtualbox.org/virtualbox/5.0.24/Oracle_VM_VirtualBox_Extension_Pack-5.0.24-108355.vbox-extpack
dpkg -i virtualbox-5.0_5.0.24-108355~Debian~stretch_amd64.deb
apt-get -f install -y
VBoxManage extpack install \
  Oracle_VM_VirtualBox_Extension_Pack-5.0.24-108355.vbox-extpack
gpasswd --add  ユーザー名  vboxusers
```

### vncserverの設定

```diff:~/.vnc/xstartup
#!/bin/sh

xrdb $HOME/.Xresources
xsetroot -solid grey
export XKL_XMODMAP_DISABLE=1

virtualbox &
xterm &

/etc/X11/Xsession
```

```bash:vncserver起動
vncserver :1 -geometry 1024x822
```

## その他

```
rmdir Templates/ Music/ Videos/ Public/
```

## dockerのインストール

* [Installation on Debian](https://docs.docker.com/engine/installation/linux/debian/#/debian-wheezy-stable-7-x-64-bit)

```
sudo -s

apt-get install apt-transport-https ca-certificates
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb https://apt.dockerproject.org/repo debian-stretch main" >> /etc/apt/sources.list
apt-get update
apt-get install -y docker-engine docker-compose
gpasswd -a  ユーザ名  docker
```

### php7+apache

```ruby:docker-compose.yml
httpd:
  image: php:7-apache
  restart: always
  ports:
   - "80:80"
  volumes:
   - /etc/localtime:/etc/localtime:ro
   - ./www/:/var/www/html/:ro
   #- ./config/php.ini:/usr/local/etc/php/php.ini:ro
```

## ufw

```bash:
sudo -s

apt-get install -y ufw
sed -i 's/IPV6=yes/IPV6=no/g' /etc/default/ufw
```

```bash:
ufw default deny
ufw allow 22
ufw allow 80
ufw enable
```

```bash:削除方法
ufw delete allow 4000/tcp
```

```bash:
ufw status verbose
systemctl status ufw
```
mdBook (日本語の検索には非対応)

```yaml:docker-compose.yml
---
version: "2.1"
services:

  mdbook:
    container_name: mdbook
    image: peaceiris/mdbook
    stdin_open: true
    tty: true
    ports:
      - 3000:3000
      - 3001:3001
    volumes:
      - ./book:/book
    command:
      - serve
      - --hostname
      - '0.0.0.0'

  code-server:
    image: linuxserver/code-server
    container_name: coder
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Toyo
      - PASSWORD=ubuntu #optional
      - SUDO_PASSWORD=ubuntu #optional
    volumes:
      - ./code-server:/config
      - ./book/src:/config/workspace/book
    ports:
      - 8443:8443
    restart: unless-stopped
```

* [Unable to search for Chinese Keywords · Issue #1081 · rust-lang/mdBook](https://github.com/rust-lang/mdBook/issues/1081)

> no plan to support searching in other languages.
コピペプログラミングの本当のダメな理由

※前提として、そもそもソースをコピペしなきゃいけない状況ってのが、、、、みたいなことはいったん横には置いておきます。

コピペプログラミングのダメな理由は以下のサイト等で色々述べられています。

[コピペプログラミングがダメな理由](http://scrap.php.xdomain.jp/copy_programming_issue/)
[伸びないプログラマに見られる4つの傾向](http://www.bunkei-programmer.net/entry/2014/04/24/002059)　※3. コピペマニア

もちろん、コピペプログラミングのダメな理由としてはもっともだと思いますし自分も同感です。

# ソースのコピペは悪か？

悪かと言われると、個人的には悪ではないと思います。ライセンス等の話もありますが、基本的に使えるものはじゃんじゃん使った方が良いと考えています(そっちの方が楽ですしね)。
ただし、コピペして動確して「動いたー！以上終了！」というのは悪です。それはソースのコピペではなく、ただのテキストのコピペであって何もやっていないのと同じです。

# コピペプログラミングの本当のダメな理由

「コピペして動確したら動いたので中身は知りません。」
「よく分からないけど、コピペしたら動きました。」
「僕が書いたんじゃありません、僕はコピペしただけです。」

コピペをすることにより、こうなる可能性があります(特に新人の方にたまに見受けれられます)。
※確かに本当のことを素直に話してくれているのですが。
これが本当のダメな理由だと考えています。

コピペしようが一から自分で作ろうが、基本的に自分の担当分のソースは自身の最低限の責任になります。
ここでいう責任とは、説明責任のことです(引責辞任とか損害賠償責任とかそういう大きな話ではないです)。
例えば、コピペしたソースに欠陥がありそれが原因で何か問題が発生したとします。
ほとんどの場合、なぜそのような実装をしたのかを上の人から聞かれます。
その時に、そのような実装をしている理由、意図をちゃんと自分の言葉で答えられるかどうかです。

「コピペして動確したら動いたので中身は知りません。」
「よく分からないけど、コピペしたら動きました。」
「僕が書いたんじゃありません、僕はコピペしただけです。」

だと、その人への信頼だったり、成果物の質が疑われてしまいます。

コピペだと技術力が身につかないとか、重複コードが発生して保守性が、みたいなのはホントその通りなのですが、それ以前に大事なのは、プロのエンジニアとして、自分のソースにどれだけ強い想いや責任を持てるかどうかです。
距離計 > HC-SR04 > エコー波形を確認 > 3cm / 100cm

```txt:動作環境
ESP-WROOM-02 (以下ESP8266)
昇圧回路 (3V -> 5V) (http://akizukidenshi.com/catalog/g/gM-03451/)
距離センサー: HC-SR04 (http://akizukidenshi.com/catalog/g/gM-08762/)
距離センサー: GP2Y0A710K (http://akizukidenshi.com/catalog/g/gI-03157/)
Arduino IDE v1.6.6
Analog Discovery 2 (以下AD2)
```

http://qiita.com/7of9/items/2bc97a42daaaf1404bb0
にてHC-SR04の２５回の測定値にばらつきがある症状に関連して。

HC-SR04のエコー波形をAD2で確認した。

### 3cmの場合

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cf6947ab-ddf9-4fa7-efe7-f49d442369e9.png)

25回の測定値

```txt:測定値
2.11,3.09,2.62,2.21,3.47,2.62,2.24,3.50,2.62,1.39,3.50,3.06,2.24,3.47,3.03,2.62,0.61,3.47,3.03,2.65,2.24,3.50,2.62,2.21,3.47,
```

- 同じくらいの短さのエコー波形が観測できた
- それに対応した距離の測定値が求まっている

### 100cm程度の場合

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/06b5f1e9-f40c-b6ba-93e1-4cebfb7de0a4.png)

```txt:測定値
91.56,9.35,6.60,9.18,5.75,9.28,5.78,7.45,41.17,25.36,25.98,23.19,7.45,9.25,6.56,7.38,9.32,4.93,9.04,39.75,26.49,25.09,23.66,7.38,8.23,
```

- 様々な幅のエコー波形が観測された
- 測定値はエコー波形の幅に対応した値になっている


エコー波形に対応する測定値は求まっているようなので、そのあたりの間違いではないことは分かった。

エコー波形の幅が100cmの距離に対応した幅で安定しない理由は未消化。
技術英語 > The [tug and pull] between top-level and bottom-level considerations / cause a lot of trouble by being [indecisive]

@ Code Complete (No. 4195 / 36077)

> The <font color=red>tug and pull</font> between top-level and bottom-level considerations is a healthy dynamic;

http://eow.alc.co.jp/search?q=tug+and+pull
> 《a ～》綱引き

<hr>
関連して気になったのは「優柔不断」

http://eow.alc.co.jp/search?q=%E5%84%AA%E6%9F%94%E4%B8%8D%E6%96%AD
> 優柔不断が原因で困った事態を引き起こす
> cause a lot of trouble by being <font color=red>indecisive</font>

decisive factorなどの「decisive」の前に否定の「in」が付いている。
scikit-learnのload_svmlight_file関数でデータを読み込む際の注意点

scikit-learnの`load_svmlight_file`関数でsvm_light形式のデータを次のように読み込もうとしたらエラーが.

```py
from sklearn.datasets import load_svmlight_file

X_train, y_train = load_svmlight_file("train.dat")
X_test, y_test = load_svmlight_file("test.dat")
clf = svm.SVC(kernel='linear')
clf.fit(X_train, y_train)
```
エラー内容

```
ValueError: X.shape[1] = 9930 should be equal to 9947, the number of features at training time
```
訓練データとテストデータの特徴量の次元が違うと怒られています。
エラー内容にまつわる詳細はこちらと同じ状況でした。
[ValueError while using linear SVM of scikit-learn python(stackoverflow)](http://stackoverflow.com/questions/22167095/valueerror-while-using-linear-svm-of-scikit-learn-python)


原因
疎行列としてデータが読み込まれ、`load_svm_file`が特徴量の次元を推量するらしいのですが、訓練データに含まれない特徴がテストデータに現れるとき、上記のエラーがでることがあるらしい(上記stack overflowより)


解決策1 
load_svmlight_filesを使い、訓練データとテストデータを一緒に読み込む

```py
X_train, y_train, X_test, y_test = load_svmlight_files(['train.dat', 'test.dat'])
```
解決策2
n_featuresを使い、特徴量の次元を明示する。

```py
X_train, y_train = load_svmlight_file("dataset_svm/train.dat")
X_test, y_test = load_svmlight_file("dataset_svm/test.dat", n_features=X_train.shape[1])
```
リンク
[load_svmlight_file(scikit-learn公式)](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_svmlight_file.html)
[scikit-learnでsvmlight(libsvm)形式のファイルを読み込む](http://sucrose.hatenablog.com/entry/2013/03/09/004547)
WordPressの大量の記事で、ある月をそのままゴミ箱へ持っていく方法

お世話になります。

WordPressの大量の記事（１０００件以上）があって、ある月の分をそのままゴミ箱へ持っていく方法です。

管理画面から、対象の記事を選んで、ゴミ箱へというやりかたがありますが、
数が少なければいいです。その月で２０００件以上とかあったらどうしますか？

以下のPHPスクリプトファイルを作って、一気にゴミ箱へ持って行きます。

```delete.php

<?php


require dirname(__FILE__) . "/wp-load.php";

//    $month=$argv[1];
    $month="201504";
    query_posts('posts_per_page=500&post_status=publish&m=' . $month );

    if (have_posts()) :
        while (have_posts()) : the_post();

            echo "    " .get_the_title() . '/' . get_the_ID() . "\n";
            $my_post = array(
               'ID'           => get_the_ID(),
               'post_status'   => 'trash',
            );

           wp_update_post( $my_post );

        endwhile;
    endif;

    wp_reset_query();

?>

```

問題がなければ別途記事化した方法
[WordPressの大量の記事が、ゴミ箱にあって一気に消去（削除）する方法](http://qiita.com/yoshiaki_0245/items/d464ce81ad3717147fc0)
で削除します。

よかったら使ってください。
WordPressの大量の記事が、ゴミ箱にあって一気に消去（削除）する方法

お世話になります。

ひょっとしたことで、WordPressの大量の記事が１０００以上で１０００記事単位の大量の場合、消去（削除）するにはどうされますか？

管理画面の記事一覧から「ゴミ箱を空にする」でやればいいですが、Webサイトから行うと、エラーコードが５００や５０３などが帰ってきて、再読み込みをするパターンかと思います。

この場合は、ゴミ箱に入っているのをWp-CLIつかって消去すればOKです。

```
wp --allow-root post delete $(wp post list --post_status=trash --format=ids) 
```

簡単に説明すると、
```
$(wp post list --post_status=trash --format=ids) 
```

ここでゴミ場に入っている記事のIDリストを出力。

```
 wp --allow-root post delete $(IDのリスト一覧) 
```

という形で消去です。

実際に、私のテストサイトの所用があって１００００件以上の削除をするのに、使いました。

```
--post_status=trash
```
ここの```trash```を```publish```などのステータスに変更すれば、直接消去（削除）ができます。

行うさいには、バックアップなどをとるなど、十分に気をつけてから行ってください。

別の記事
[WordPressの大量の記事で、ある月をそのままゴミ箱へ持っていく方法](http://qiita.com/yoshiaki_0245/items/3ebab198125ee9669142)
と併用で使っています。

よかったら使ってください。
PC を便利にするWindows の標準的なテクノロジー

はじめに
=======
メモ帳さえあれば何とかなる技術を思いつくだけ書き散らかします。

bat
===
いわゆるバッチファイルです。
ほとんどのパソコンで同じように使えます。
バッチファイルはコマンドを順番に実行していくことが得意なので、他のプログラムを呼び出すエントリーポイントとして利用されることが多いです。
一方でループや複雑な条件分岐が必要な処理をするのであれば、後述する技術を使う方が良いでしょう。

Windows Script Host(WSH)
========================
バッチファイルと同じく、ほとんどのパソコンで利用できます。
WSH は名前の通りスクリプト実行ホスト（いわゆる処理系）であり、具体的には cscript.exe または wscript.exe と呼ばれるプログラムを指します。

基本的なファイル入出力から IE や Excel の自動操作といった、バッチファイルよりも多様な処理を実現することができます。またバッチファイルよりも高度な構文体系を持つため、複雑な処理を容易に記述することができます。ただしファイルや標準入力/標準出力の取り扱いはバッチファイルよりもやや手間がかかります。

スクリプト言語としては VBScript か JScript を選ぶことができます。どちらを選ぶべきかは議論の余地はありますが、Excel や XML を扱う場合は VBScript をお勧めします。VBScript の持つ多次元配列や For each 構文は、Excel や XML を扱うのに相性が良いと思われます。その他の用途には JScript を使用すると良いでしょう。JScript のオブジェクト指向やクロージャなどの機能は、純粋にプログラミング言語として高機能であると言えます。

どちらのスクリプト言語を選ぶ場合でも、WSF 形式を使うことで再利用可能なプログラム（モジュール）を作成することができます。

WSH を使う場合は、基本的に文字コード Shift-JIS か UTF-16LE しか扱えないため、UTF-8 などを扱う場合は別の技術を検討する必要があるでしょう。

VBA for Excel
=============
厳密には標準技術ではありませんが、実質的に標準技術なので取り上げます。

VBA for Excel(以下 VBA) を使うメリットは Excel の機能・速さを利用できることにあります。多くの場合、自力でアルゴリズムを実装するよりも Excel の計算速度に頼った方が良いパフォーマンスが出るでしょう。また、Excel は処理方法も豊富に用意されているため、新機能の実装を検討するよりも Excel のマニュアルを熟読する方が良い選択かもしれません。

また、Excel を利用すると手軽に GUI を構成することができます。GUI ツールがコマンドよりもユーザフレンドリーであることに議論の余地はありません。一方で、Excel で作成したツールは誰でも書き換えができるため、意図せずツールの破壊が起こりうることを常に念頭に置く必要があります。GUI に由来する機能（シート保護や色による区別など）を多用したツールは、変更や拡張に支障を及ぼす場合があるため、それらの利用は慎重に検討する必要があります。

Hyper Text Application(HTA)
===========================
Windows Script Host と同じく VBScript か JScript を使う技術です。

基本的にできることは WSH と代わりませんが、HTA はウェブ技術(HTML/CSS)を利用して GUI を構成することができます。
HTML/CSS を用いた GUI は、意図せずユーザ書き換えてしまうリスクがなく Excel ツールよりも堅牢であると言えます。
また、HTML/CSS を用いた GUI はプログラム的に扱いやすいため GUI の動的な書き換えやデータの取得が容易です。

Excel ファイルと違って、HTA ファイル自身にデータを格納しておくことはできません。

Powershell
==========
コマンドプロンプトや WSH に代わる技術として登場したコマンドライン環境またはスクリプト言語です。
Windows 7 から標準で使用できます。

.NET 資源を利用できるなど非常に高機能であり Unix シェル環境と比較しても遜色ない機能を持ちます。
標準状態ではスクリプトの実行が制限されていますが、[起動オプションを指定](http://qiita.com/alchemist/items/e6706cd425f8f5e5032e)することで、管理者権限が無くとも制限を回避することができます。

Powershell が標準的に扱うデータは複雑（オブジェクト）であるため外部とのデータ連携には手間がかかりますが、一度 Powershell 内部にデータを取り込んでしまえば快適にデータを扱うことができます。

スクリプト言語としても、begin, process, end といったフィルタ処理に便利な構文が用意されていたり、後発だけあって十分な機能が備わっているようです（あまり使い込んだことが無いので印象ですが。。。）。ただし Powershell は高機能である反面、メモリ効率や処理速度が WSH に劣る場合があるようです。

コマンド一発で CSV 解析ができることや、Shift-JIS 以外の文字コードにも対応している点が WSH よりも優れている点と言えるでしょう。また、ISE という開発ツールが使用できる場合があります。

C#, VB.NET
==========
前述の全ての技術を以てしても実現できない処理を実装するためには C#, VB.NET を使うことになります。

両者共にコンパイルが必要なプログラム言語ですが、.NET Framework が搭載されている全てのパソコン(Windows Vista以降)に[コンパイラが同梱](http://qiita.com/asterisk9101/items/4f0e8da6d1e2e9df8e14)されています。故にメモ帳さえあればプログラムを書くことができます（Visual Studio 無しでプログラミングすることは現実的ではありませんが）。


終わりに
=======
具体的な使用例を用意できれば良かった。眠い。
生年月日のフォームをPHPでさっくり作る 


## 生年月日のフォームコード例

### 年 のフォーム

````
<select>
    <option value="">--</option>
    <?php foreach(range(1920,2016) as $year): ?>
    <option value="<?=$year?>"><?=$year?></option>
    <?php endforeach; ?>
</select>
````

### 月のフォーム

````
<select>
    <option value="">--</option>
    <?php foreach(range(1,12) as $month): ?>
    <option value="<?=str_pad($month,2,0,STR_PAD_LEFT)?>"><?=$month?></option>
    <?php endforeach; ?>
</select>
````

### 日のフォーム

````
<select>
    <option value="">--</option>
    <?php foreach(range(1,31) as $day): ?>
    <option value="<?=str_pad($day,2,0,STR_PAD_LEFT)?>"><?=$day?></option>
    <?php endforeach; ?>
</select>
````

## 解説

### range

http://php.net/manual/ja/function.range.php

range関数は、引数の範囲での配列を作成してくれます。

日付や年の配列を生成するほか、仮想でx回回すみたいな処理とか書くときに便利だったりします。

サクッとモック作成するときに知っていると何かと便利な関数です。

### str_pad

http://php.net/manual/ja/function.str-pad.php

文字列を固定長で埋めてくれる関数です。わかりやすく言うと `1` を `01`とかにしてくれる関数です。

第一引数に埋めたい文字、第二引数に埋める桁数、第三引数に埋めるときに使う文字、第四引数に埋め方を指定します。

埋め方には３つあって

- STR_PAD_RIGHT : 右を埋める(デフォルト)
- STR_PAD_LEFT : 左を埋める
- STR_PAD_BOTH : 両端埋める

が選べます。
Android Studioでレイアウトプレビューが表示されなかった件

MacでAndroid開発環境構築中にレイアウトプレビューが表示されなかったことがあったため備忘録として投稿します。
<img width="1440" alt="スクリーンショット 2016-07-12 0.04.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/133366/59cf97af-5628-b51a-820a-a17ad1e94af7.png">

## 環境
- OS X El Capitan 10.11.5
- Android Studio 2.1.2
- Android SDK Tools: 25.1.7
- Android SDK Platform-tools: 24.0.0
- Android SDK Build-tools: 24.0.0
- Android Support Library: 24.0.0
- JDK 1.8.0

## 原因
結論から言うと、JDK1.8を使用していなかった。

Project Structure > SDK Location > JDK LocationでJDK1.8.0を指定したが、これだけでは不十分なようでした。
調べたところ、/Applications/Android Studio.app/Contents/Info.plistも修正が必要なようでした。

```xml:Info.plist
      <key>JVMVersion</key>
      <string>1.6*,1.7+</string>
        ↓ 修正
      <string>1.8</string>
```

上記修正を行い、Android Stdioを起動したところ無事レイアウトプレビューが表示できるようになりました。
Vagrant+VirtualBox上のPostgreSQLでデータファイルをsynced_folderしたらハマった時の考察

Vagrant+VirtualBoxな仮想マシン上で動くPostgreSQLのデータファイル類を訳あってsynced_folderでホストOS側と共有した状態でUPDATE文を大量に発行したらこんなエラーが出た。

```rb:Vagrantfile
 :
config.vm.synced_folder "./pgsql/data", "/var/lib/pgsql/data", owner: "postgres", group: "postgres", mount_options: ["dmode=700", "fmode=600"]
 :
```

```
[Native message: PANIC:  ファイル"pg_xlog/00000001000000030000009C"(ログファイル3、セグメント156)をオープンできませんでした: そのようなファイルやディレクトリはありません
PANIC:  ファイル"pg_xlog/00000001000000030000009C"(ログファイル3、セグメント156)をオープンできませんでした: そのようなファイルやディレクトリはありません]
```
再起動してもPostgreSQLは同じエラーで起動しなくて検索しても答えが出なかったんだけど恐らくsynced_folderが遅いのが原因。

PostgreSQLはWALファイルにロギングしていくけどデフォルトのサイズが16MBもある。
このサイズのファイルを作成し終わる時間を追い越してトランザクションログを書き込もうとして上記のエラーになっているのと、カレントのWALファイルを指すポインタが先に進んでしまっているけど実態がないために再起動してもエラーとなるようだ。

synced_folderやめたら起きなかった。
最近のSphinx

#はじめに
SphinxをWordやLaTexの代替として使いたいなと思っているという前提で現状できることをまとめました。図表や数式を含むある程度の量の文章（投稿論文や学会要旨ほど厳密にフォーマットは決まってなくて，そこそこ長い文章を想定。実験レポートとか報告書とか）を書くときに必要な機能についてのみまとめてます。

ここに書いた以外でできることもたくさんあるので，詳細はユーザーページ等で確認して頂いたほうがいいと思います。http://docs.sphinx-users.jp/index.html

#現状できること
1.4.4を使ってできたことを勝手にまとめます。

+ 章，節，小節などの見出しのレベル設定
    + 前からできる。
+ 図表番号，コードリストの参照
    + :numref:使えばソースファイルが分割されてても参照可能。
+ 参考文献の参照
    + 参考文献もソースファイルが分割されてても参照可能。
    + latexpdfjaつかって，howtoにしてコンパイルするとbibnameでビルドがこけるかも。sphinxhowto.clsを修正するかbibnameを定義する必要がある。
+ 式番号
    + 式番号は同一ソースファイルからしか参照できなさそう。
    + 複数行の式を1つの ..math::でかくと式番号は1個しかつかない。個別につけられるのか？
+ 細かいレイアウトの設定
    + ややこしいのでレイアウトとかを細かく修正しようとするのはやめたほうが無難。

#まとめ
これだけちゃんとできたら，大抵の技術文章書くのに困らないと思います。だけど数式が大量にあるときは最初からLaTeXで書くのが正解だと思う。
最近の開発環境についてのまとめ

### バックエンド Nodejs

- Nodejs
	- [Nodejsって何？](http://qiita.com/kyrieleison/items/f726061803a0e536c3e1)
	- [Nodejs良記事まとめ](http://qiita.com/KENJU/items/fe149acfa8f7b0ec25c8)
- npm
	- [npmって何](http://qiita.com/megane42/items/2ab6ffd866c3f2fda066)
	- [npmフロントエンド](http://qiita.com/hashrock/items/15f4a4961183cfbb2658)
	- [npm使い方](http://qiita.com/sinmetal/items/395edf1d195382cfd8bc)
	- [npm情報](http://qiita.com/tags/npm)
- Express
	- [NodejsフレームワークExpress](http://qiita.com/nkjm/items/723990c518acfee6e473)
	- [Express使い方](http://qiita.com/kwst/items/38a701e29cb37ca3b362)
	- [Express情報](https://qiita.com/tags/express)

### フロントエンド

- HTML5
- CSS3
- Sass
	- [Sassとは](http://lifequest-blog.com/webcreation/css/589/)
	- [Sass導入](http://qiita.com/setouchi/items/2f7ae68764abe74934fb)
	- [Sass情報](https://qiita.com/tags/sass)
- js(ES6)
	- [ES6とは1](http://qiita.com/tuno-tky/items/74ca595a9232bcbcd727)
	- [ES6とは2](http://qiita.com/takeharu/items/cbbe017bbdd120015ca0)
	- [現代のJS](http://qiita.com/gaogao_9/items/190f4b52d6876f0b8d8a)
	- [requireって何?](http://qiita.com/uryyyyyyy/items/b10b012703b5396ded5a)
- gulp
	- [gulpとは](http://qiita.com/yoshinariiii/items/8340286ec6f3ed6ff888)
	- [gulp情報](http://qiita.com/tags/gulp)
- Browserify
	- [Browserifyとは](http://qiita.com/magaya0403/items/23dbbd5dd94cf87abab5)
	- [Browserify情報](http://qiita.com/tags/browserify)
- Babel
	- [ES6のためのBabel](http://qiita.com/mizchi/items/3bbb3f466a3b5011b509)
	- [Babel環境構築](http://qiita.com/hkusu/items/9b312274b3ff2913e15b)
- React
	- [Reactを使うとなぜjQueryが要らなくなるのか](http://qiita.com/naruto/items/fdb61bc743395f8d8faf)
	- [React初級](http://qiita.com/ossan-engineer/items/3622e57ceb70c7f12295)
	- [React文法初級](http://qiita.com/tomzoh/items/7fabe7cb57dd96425867)
	- [React入門シンプルに](http://qiita.com/ShinyaKato/items/98be579f648d9ca0674a)
	- [React入門](http://qiita.com/bananaumai/items/c808841cb4e0311f97d4)
	- [Reactおすすめ記事](http://ichimaruni-design.com/2016/03/reactjs-13/)
- Redux
	- [Redux入門](http://qiita.com/erukiti/items/e16aa13ad81d5938374e)
	- [Redux入門シンプル1](http://qiita.com/pentamania/items/859fe5f2f7e9cf12d6ca)
	- [Redux入門シンプル2](http://qiita.com/morizotter/items/87d4a34d32209cbb98b0)
	- [Reduxチュートリアル](http://qiita.com/pullphone/items/d28baeb296666a4847b8)

### Tools

- Git
	- [Git説明](http://qiita.com/shunhikita/items/9b909b566d1b0a263519)
	- [Git入門集](http://qiita.com/amymd/items/056864438b839855b6d7)
	- [Git情報](https://qiita.com/tags/git)
- Github 
	- [Githubとは1](http://qiita.com/iron-breaker/items/6da9e0f1af0b4c2c1cfa)
	- [Githubとは2](http://qiita.com/nnahito/items/565f8755e70c51532459)
	- [Github情報](https://qiita.com/tags/github)
	
### インフラ

- AWS
	- [AWS is 何](http://qiita.com/kohashi/items/1bb952313fb695f12577)
	- [AWS入門1](http://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde)
	- [AWS入門2](http://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)
	- [AWS情報](https://qiita.com/tags/aws)
ローカル変数の初期化タイミング

初期化コードの方が前に書かれてないといけない様子。
コンパイラの盲点？

```csharp:テストコード
static void Main()
{
    int x;
    string s = "10";
    validate(ref x, int.TryParse(s, out x));
    //TryParseが先に呼ばれてxは初期化されるはずだが・・・
    //「エラー	CS0165	未割り当てのローカル変数 'x' が使用されました。」
    Console.WriteLine(x);
}

//Parse成功なら範囲チェック、失敗ならデフォルト値をセット
private static void validate(ref int x, bool parseResult)
{
    int min = 1, max = 1000, defaultVal = 100;
    x = !parseResult ? defaultVal
        : x < min ? min
        : max < x ? max
        : x;
}
//逆順だと通る
private static void validate(bool parseResult, ref int x)
{
    validate(ref x, parseResult);
}


```
Anko 最初の一歩

# Anko

AnkoはKotlinのコードでAndroidのUIを組み立てることができるJetBrains公式のライブラリです。
通常のコードでUIを組み立てる方法と異なり、DSLを用いるので簡潔な記法ができます。


UIのPreviewができる機能もあります、Preferences > Plugins > Browse repositoriesでAnko DSL Preview pluginをインストールしてください。
Ankoの最新バージョンは0.9ですが、記事執筆現在では0.8.3にしておかないとPreviewをうまく表示してくれないようです。
また、XMLのPreviewと同じく表示に使用するAPIレベルを指定できますが、とりあえず22以下に設定しています。

(追記)
ちなみにAnko DSL Preview pluginをインストールすると Code > Convert to Koan DSL が追加されます。
これはXMLをAnko DSLに変換してくれるツールです。

## 導入方法
app.gradleに以下の設定を追加してください

```groovy:app.gradle
dependencies {
    compile 'org.jetbrains.anko:anko-sdk15:0.8.3'
    compile 'org.jetbrains.anko:anko-support-v4:0.8.3'
    compile 'org.jetbrains.anko:anko-appcompat-v7:0.8.3'
    
    // 0.9だとPreviewが動かない
    compile 'org.jetbrains.anko:anko-sdk15:0.9'
    compile 'org.jetbrains.anko:anko-support-v4:0.9'
    compile 'org.jetbrains.anko:anko-appcompat-v7:0.9'
}
```


公式で最新バージョンを確認しつつ、導入してください
https://github.com/Kotlin/anko

# 基本的な使い方

## Activityで使ってみる

Activityの内部で用いる場合には、以下のようにonCreateの中などで直接にDSLを書くことができます。

```kotlin:MainActivity.kt
class SampleActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        verticalLayout {
            textView {
                text = "Hello, Anko!"
            }
        }
    }
}
```

![screenshot (17).jpg](https://qiita-image-store.s3.amazonaws.com/0/40873/29c51b22-a8ee-7a9e-9af5-4da3e755e8e0.jpeg)


## Framgentで使ってみる

FragmentのonCreateViewの内部で用いる場合には、Activityの場合とは異なり UI {}.viewで囲む必要があります。

```kotlin:MainFragment.kt
class MainFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?) : View? {
        return UI {
            verticalLayout {
                textView {
                    text = "Hello, Anko!"
                }
            }
        }.view
    }
}
```

## クラスを分けて使う

クラスを分けて使うにはまず、AnkoComponentインターフェースを実装したクラスを作ります。

```kotlin:MainActivityUi.kt
class MainActivityUi() : AnkoComponent<MainActivity> {
    override fun createView(ui: AnkoContext<MainActivity>) = with(ui) {

        verticalLayout {
            textView {
                text = "Hello, Anko!"
            }
        }

    }
}
```

そしてMainActivityUiクラスのsetContentViewを呼び出します。

```kotlin:MainActivity.kt
class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        MainActivityUi().setContentView(this)
    }
}
```

このようにクラスを分けた状態でもPreviewは動きます。


***

### 参考
公式のGitHub : https://github.com/Kotlin/anko
AndroidでCheckBoxの色を変更する時の対応


適当にstyle適応すれば変わるだろうと思っていたましたが
結構ハマってしまったためメモ
http://endoidou.hatenablog.com/entry/2016/07/12/000826

##CheckBoxの色を変更する
下記パラメータを設定する

 * colorControlNormal
 * colorControlActivated

``` checkbox_theme.xml
    <style name="MyCheckBox" parent="Theme.AppCompat.Light">
    	<!-- 枠線 -->
        <item name="colorControlNormal">@color/green</item>
        <!-- チェック時の色 -->
        <item name="colorControlActivated">@color/blue</item>
    </style>
```

``` activity_main.xml
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="with theme"
        android:theme="@style/MyCheckBox"/>
```
![Screenshot_20160712-001404.png](https://qiita-image-store.s3.amazonaws.com/0/88384/071aface-4ca7-0cc3-0aad-7f5923aaa4e2.png "Screenshot_20160712-001404.png")




##注意
```
	style="@style/MyCheckBox"
```
と書くと反映されないため注意
MySQLでdumpせずに "RENAME DATABASE" を実現する

その危険すぎる機能ゆえに、存在を消された幻のコマンド

**`RENAME DATABASE`**

でも、どうしてもデータベース名変えたい！っていうケース、あると思います

## dumpするやり方
```mysql 
CREATE DATABASE new_db;
```
して

```shell 
mysqldump ... -d old_db > old_db.dump
```

からの

```shell 
mysql ... -d new_db < old_db.dump
```

とどめに

```mysql
DROP DATABASE old_db;
```

で、実現できます。
が、**DBが巨大であればあるほど時間かかりますし、現実的ではなくなります**

## dumpしないやり方
```mysql 
CREATE DATABASE new_db;
```
して

```mysql
RENAME TABLE old_db.table_name TO new_db.table_name
```
を、全テーブル繰り返す
です！

`RENAME ... TO ...`は以下のsqlで作成できます
(`SHOW TABLES`とかで取ってきてもよし)

```mysql
SELECT DISTINCT CONCAT(
'RENAME TABLE ', 
t.table_schema,'.', t.table_name, 
' TO ', 
"new_db", '.', t.table_name, 
';' ) 
as rename_table
FROM information_schema.tables as t WHERE t.table_schema="old_db";
```
Apache × Tomcat


# はじめに

WebServer : ApacheHttpServer<br>
ApServer : ApacheTomcat<br>
上記の組み合わせで運用されている業務に携わっているので,<br>
どういった設定ができるか等を順次まとめてみる。<br>

# ApServer : ApacheTomcat

## Tomcatとは？

Javaサーブレット等を処理するアプリケーションサーバ。<br>
ServletAPIを保有している。<br>
Tomcat配下にWebApplicationがぶら下がる形となる。<br>
Javaで開発されている。<br>

## 設定値

### server.xml

Tomcatサーバの動作を定義する設定ファイルです。<br>
サーバーの振る舞いとして以下のようなタグを指定できる。<br>

タグ        | 振る舞い
:-------- | :---------------------------------
Listener  | Tomcatエンジンの起動、停止を監視するJavaクラスを指定します
Connector | クライアントからのリクエストを受け付けるコネクタを設定します
Realm     | 認証方法を設定します
Valve     | クライアントに対する送受信データをフィルタし、処理を行います

server.xmlにはcontextタグ毎に個々のWebアプリケーション設定を記述する。

### web.xml

WebApplication毎に用意するもので、 アプリケーションの動作を定義する設定ファイルです。<br>
(フレームワークの仕様によっては不要かもです) エラーページ、フィルター等を設定できます。<br>
デフォルトのweb.xmlをコピーして拡張するのが良いかと思います。<br>
また、web.xmlはマイナーアップデートでも若干変更があるので、 マイグレーション時には確認したほうがいいです。<br>

## アクセスログをカスタマイズする

タグ             | 振る舞い
:------------- | :-----------------------
directory      | 対象ログのディレクトリを設定します
pattern        | 出力するログの書式を設定します
rotatable      | ログファイルのローテートを設定します
fileDateFormat | ローテートする場合の日付フォーマットを設定します

patternの書式のサンプルは２種類用意されている。<br>
「common」と「combined」があり、指定がなければ「common」となる仕様である。<br>
ログを検知するシステムと連携されている可能性があるので書式は簡単に変更できない。<br>
またデイリーローテートだと、０時をまたいで初めてアクセスされたタイミングでローテートされる。<br>
勝手に０時でファイルが生成されるわけではない。<br>

＊サーバーログはlogging.propertiesに記述する。

## 共通ライブラリ

アプリケーション内のlib配下に置くよりも、 tomcat/lib配下にjarを置いてしまう。<br>
容量削減に繋がるし、jarに潜在バグがあれば使用しているものは全て変更すべき。<br>
＊影響範囲とテスト工数は大きくはなる。<br>
＊同一名のライブラリがあった際最新のバージョンとかでなく、使用アプリケーションの位置関係で近いものを優先するらしい。

# WebServer : ApacheHttpServer

## Apacheとは？

Apache Software Foundationを指す。<br>
Apache HttpServerのことを略して「アパッチ」と発音したりする。<br>
インストール時にビルド＆コンパイルする。<br>
Apacheの下にApServerがぶら下がる形となる。

## モジュール

Apache標準構成から追加機能を付与したい時はモジュールを追加する。<br>
モジュールはビルド時の設定ファイルに記述すれば自動的に追加されるし、<br>
動作後でも追加することは可能である。

モジュール         | 振る舞い
:------------ | :---
mod_cache     |
mod_headers   |
mod_proxy_ajp |
mod_rewrite   |

## 設定値

### httpd.conf

後日追記します。

### サーバー証明書

後日追記します。

# Apache × Tomcat 連携

後日追記します。
ipython notebook インストール

```
pip install ipython
```

でエラー。
virtualenvを使う。

```
cd ~
virtualenv my-venv
source my-venv/bin/activate
pip install ipython
```

これでインストール完了。

```
source my-venv/bin/activate
```

my-envをアクティベート。

```
(my-venv) $ ipython notebook
```

ipyoton notebookを起動。
あとはブラウザで実行。

参考サイト：
[OSX El Capitan: sudo pip install OSError: [Errno: 1] Operation not permitted](http://stackoverflow.com/questions/33004708/osx-el-capitan-sudo-pip-install-oserror-errno-1-operation-not-permitted)
Railsアプリケーションのテスト高速化 (Solr編)

[Railsアプリケーションのテスト高速化 (Oracle編)](http://qiita.com/koic/items/6be073cb5bc20caec34d) の続編です。

Rails アプリケーションのテストを高速化する技法として [parallel_tests](https://github.com/grosser/parallel_tests) を導入した複数プロセスによる並列実行を取り挙げます。

現代 Rails アプリケーション開発においては RDBMS と組み合わせて、目的に応じた様々なミドルウェアがもちいられることが多いと思います。ここでは全文検索エンジンの Apache Solr に対するテストの並列実行を取り挙げます。

Rails アプリケーションから Solr を操作するライブラリとしては [Sunspot](https://github.com/sunspot/sunspot) を取り扱います。
なお、前提となる「parallel_tests のインストール」については前述の Oracle 編をご参照ください。

## 接続先の Apache Solr を並列テスト実行できる準備をする

Solr には単一サーバーで複数の異なるインデックスを保持する領域を持つことができる multi core という機能を備えており、そちらを利用します。
Solr インストールディレクトリの solr.xml にある `<core>` 要素を並列実行するプロセス分用意します。

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="false">
  <cores ...>
    <core name="default"     instanceDir="." dataDir="default/data"/>
    <core name="development" instanceDir="." dataDir="development/data"/>
    <core name="test"        instanceDir="." dataDir="test/data"/>
    <core name="test0"       instanceDir="." dataDir="test/data0"/>
    <core name="test1"       instanceDir="." dataDir="test/data1"/>
    <core name="test2"       instanceDir="." dataDir="test/data2"/>
    <core name="test3"       instanceDir="." dataDir="test/data3"/>
    ...
  </cores>
</solr>
```

Solr を起動している場合、 `rake sunspot:solr:restart` などで再起動をすることでテストの並列実行への対応が反映されます。

## Solr に接続する Sunspot で並列でテストを実行するための設定を行う

次に config/sunspot.yml の `path` の末尾に並列プロセスを割り振るための `ENV['TEST_ENV_NUMBER']` を追加します。

```yaml
test:
  solr:
    hostname: localhost
    port: 8983
    user: foobarbaz
    pass: foobarbaz
    path: /solr/test<%= ENV['TEST_ENV_NUMBER'].to_i %>
```

また、環境変数 `ENV['SOLR_URL']` を用いて、spec/spec_helper.rb などで以下のような Solr のリセットを行っている場合は、その SOLR_URL に対しても `ENV['TEST_ENV_NUMBER']` を追加します。

```ruby
config.after do
  ENV['SOLR_URL'] = "http://foobarbaz:foobarbaz@localhost:8983/solr/test#{ENV['TEST_ENV_NUMBER'].to_i}"

  Sunspot::Rails.reset
  Sunspot.session = Sunspot::Rails.build_session
  Sunspot.remove_all!
end
```

このように Solr の Multi core 機能を利用することで、Solr を使ったテストの並列実行が出来るようになります。
Windowsの共有フォルダをLinuxにcifsマウントする際のハマりどころ

# 背景

Windowsの共有フォルダとして使用しているNASをCentOSにmountする際に2時間ほど時間を浪費したので、ハマりどころを共有

# 今回の環境

* CentOS7
* マウントしたい共有フォルダはNAS(詳細は不明)

mountしようとしたら以下のエラーでマウントできなかった。

> mount error(13): Permission denied
> Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

# 最低限こんな感じにすればいける(多分)

## `cifs-utils`をインストール

`yum install cifs-utils`

## mount

```
mount -t cifs -o sec=#{sec_type},username=#{user_name},password=#{password},domain=#{domain_name} //ip/share/dir/path /mount/path
```

# ハマりどころ

## エスケープ

主にWindows側の共有フォルダのパスにエスケープが必要な文字があることがある(!とか)
今後のことを考えるとフォルダ名を変えてもらうのがBetterだとは思うが、それが叶わない場合も多々ある。
そのような場合は`//ip/重要¥!¥!/重要なフォルダ`とエスケープする

## domain

昔のWindowsの場合`XXX¥user_name`、最近なら`user_name@XXX`となる`XXX`の部分。
ない場合は省略可能

## sec

セキュリティモードらしい。以下のいずれかを設定する模様
以下[ここ](http://www.samba.gr.jp/project/translation/3.5/htmldocs/manpages-3/mount.cifs.8.html)の引用

> * none 空のユーザー名(名前なし)で接続を行なう。
> * krb5 Kerberos 5 認証を用いる。
> * krb5i Kerberos 認証とパケット署名(訳注: SMB署名?)を用いる。
> * ntlm NTLM パスワードハッシュを用いる (デフォルト) 。
> * ntlmi NTLM パスワードハッシュと署名を用いる (もしも /proc/fs/cifs/PacketSigningEnabled がonか、サーバーが書名を要求する値が既定値ならば)
> * ntlmv2 NTLMv2 パスワードハッシュを用いる。
> * ntlmv2i NTLMv2 パスワードハッシュとパケット署名を用いる。

上記には`ntlm`はデフォルトとしてあるが、自分の環境では明示しないとダメだった

# 参考にしたサイト

[cifsによるNASの自動マウント(Qiita記事)](http://qiita.com/dyony/items/b91e531ca6f50b480b2e)
[日本 Samba ユーザー会のmount.cifsページ](http://www.samba.gr.jp/project/translation/3.5/htmldocs/manpages-3/mount.cifs.8.html)
jQueryでやるView Component

わざわざ語るようなことではないかもしれないが、あんまりそういうの話題になかったのでメモ程度に。

受託なんかで気軽にライブラリを増やせない環境で、View Componentとして振る舞いや状態を切り出したいような場合に

```js

class SomeViewComponent {
  constructor($target) {
    this.$target = $target;
  }

  setValue(str) {
    this.$target.text(str);
  }

  setState(disabled) {
    if (disabled) {
      this.$target.addClass("is-disable");
    } else {
      this.$target.removeClass("is-disable");
    }
  }

  onClick() {
    return new Promise(resolve => {
      this.$target.on("click", ev => resolve(ev));
    });
  }
}
```

みたいな、必要なDOMインスタンスを食わせて外から値や状態を指定するようなclassを作るようにしている。

使う側は

```js
class SomeHandler {
  constructor(component) {
    this.component = component;
    this.component.onClick().then(ev => this.onComponentClick(ev));
  }

  onComponentClick(ev) {
    console.log("clicked");
  }

  request() {
    fetch("/path/to/json")
      .then(res => res.json())
      .then(data => this.registerData(data));
  }

  registerData(data) {
    // JSONで { "record": "hoge" } みたいなのがくるとして
    this.component.setValue(data.record);
    this.component.setState(data.record === "");
  }
}
```

みたいな感じ。

jQueryでもView Componentとして定義して責務を上手く扱いましょうという話でした。

---

※ちなみにjQueryじゃなくても良いです
AS2.2 Preview版でDataBindingが正常に動作しない場合の対処方法

AS2.2 Preview5が出て、そろそろ移行のことも考えようかな？と思ってみたが、DataBindingで問題が出てそのままでは移行できなかったので、（多分Preview版のみの）ワークアラウンド。

# DataBindingでエラーが出る

コンソールでこんなエラーが出た。`ace-v3:app`は開発中のアプリプロジェクト。

```
* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_googleplayDebugApkCopy'.
   > Could not find com.android.databinding:baseLibrary:2.2.0-alpha5.
     Required by:
         ace-v3:app:unspecified
         ace-v3:app:unspecified > ace-v3.eglibrary:android-framework:unspecified
   > Could not find com.android.databinding:baseLibrary:2.2.0-alpha5.
     Required by:
         ace-v3:app:unspecified > com.android.databinding:library:1.2
         ace-v3:app:unspecified > com.android.databinding:adapters:1.2
```

DataBinding系のライブラリが足りないらしいが、「まあそのうちリポジトリに突っ込まれるべさ」と思って放置してみても、一向に突っ込まれない。

仕方ないので本腰入れて対処した結果、とりあえずワークアラウンドする方法が見つかった。

# mavenの参照リポジトリを追加する

多分標準で参照するリポジトリにはalpha版のバイナリが入ってないようなので、手動でリポジトリを足す必要がある。

```
allprojects {
    repositories {
        maven { url "https://dl.bintray.com/android/android-tools/" } // DataBinding-alpha
    }
}
```

これで解決。
逐次タスクを受け取る人へ、折り返し地点連絡のすすめ

# 折り返し地点連絡って何?
自分に振られたタスクが50%完了した（折り返し地点）時にタスク管理者に連絡する連絡方法です。

# どんな人に勧めるか
あんまりないとは思うんですが、
新しい現場に工程の途中から配属された時などに、既存成果物のキャッチアップをしつつ、
雑務を五月雨式に振られる事があります。新人に多いかもしれません。

そんな時、プロジェクトがのっぴきならない状態でロクに新しく入ってきた人に必要な情報を渡したり、
タスクの割り振りも滞りがちでダラダラと仕様書を読む素振りを見せながら内心意識とびかける、ということがあるかもしれません。そんなあなたには↓

# 折り返し地点連絡
は、相手に自分の状況を伝える良いきっかけと出来るかもしれません。
他にもタスクを自分の力でどれぐらい時間がかかるか考えるきっかけになったり、
タスクを振る側も、後どれぐらいであなたの手が空いて次の仕事を振るべきかがわかったりします。

# 日時報告と折り返し地点連絡
日時報告が求められている場合はやらなくていいと思います。
日時報告の方が報告すべきタイミングがわかりやすい上に、
折り返し地点(50%)より見積もった作業時間と実績のブレが明るみになりにくいので余計な不信感を抱かせずに済みます。（もちろん予実を合わせる努力はどちらも必要です）

ただ日時報告などで連絡するタイミングが無い場合もあるかもしれませんので、その時はこの折り返し地点連絡を使ってみてはいかがでしょうか。
指定したファイルのみを以前のコミットログに戻す方法


xibで余計なコミットをしてしまった時の対処法

xibを開いただけで編集されてしまうので、コミットするときはよく確認してdiscardしないといけない。
それでもたまにコミットしてしまう時がある。

その場合にはターミナルで

```
git log commit番号 ファイル
```
でファイルのログを確認して

```
git show commit番号 ファイル名
```

で変更内容を確認

xibの場合toolsVersionを確認すればいい感じ

```
git checkout commit番号 ファイル名
```
これでもとに戻せる。
PDFデータからDXFデータへ変換する方法

[pstoedit](http://www.pstoedit.net/)を使いました。

## Macの場合
[Homebrew](http://brew.sh/)をインストールし，以下のコマンドでpstoeditをインストール。

```text:pstoeditのインストール
brew install pstoedit
```

以下のコマンドで変換。

```text:dxfへ変換
pstoedit -f dxf_s PDFファイルのパス DXFファイルのパス
```


毎回コマンド打つのは大変なのでAutomatorでアプリケーションとして保存しました。

![Automator](https://s3.amazonaws.com/f.cl.ly/items/1z0g041p083U3W453p2j/Automator.png)


```text:Automator
#!/bin/zsh
source ~/.zshrc

while read i ; do
	FILE_PATH=$i
	DIR="${FILE_PATH%/*}"
	FILE_NAME=`basename $FILE_PATH .pdf`
	DXF_NAME=$FILE_NAME.dxf
	pstoedit -f dxf_s $FILE_PATH $DIR/$DXF_NAME
done
```

起動時に複数のPDFファイルを選択すると同じ場所にdxfデータを出力してくれます。

色分けした部分はDXFでレイヤー分けしてくれるので後々の加工も簡単になります。

![Test Data](https://s3.amazonaws.com/f.cl.ly/items/47240D3f3K3e0A2e472o/test.png)

レーザー加工機で加工してキーホルダーにしました。

![テスト](https://s3.amazonaws.com/f.cl.ly/items/253y3t0d352b2d221H0p/DSC03485%202.JPG)
Railsアプリケーションのテスト高速化 (Oracle編)

Rails アプリケーションのテストを高速化する技法として [parallel_tests](https://github.com/grosser/parallel_tests) を導入した複数プロセスによる並列実行を取り挙げます。

## parallel_tests のインストール

parallel_tests のインストールには Gemfile に以下の一行を追加して、`bundle install` を行います。

```ruby
gem 'parallel_tests', group: :development
```

テストを並列で実行する場合の留意点として、複数のプロセスから同一リソースを操作して、他方のプロセスが実行するテストデータに対して期待しない変更を及ばさないようにしておく必要がありますので、そのための Oracle の準備ステップに進みます。

## 接続先の Oracle を並列テスト実行できるようにする

Rails アプリケーションを Oracle を使って開発している場合、Oracle XE を使っていると思います。Oracle で parallel_tests を導入する場合は同一のデータベースへの接続ユーザーが異なれば別スキーマとなることを利用して、まず Oracle 側に parallel_tests で実行するプロセス分のユーザーを用意します。
データベースにユーザーを追加した後は database.yml に以下のような設定を行います。

```yaml
test:
  <<: *development
  username: foobarbaz<%= ENV['TEST_ENV_NUMBER'] %>
  password: foobarbaz
```

`test` で接続する `username` の方に、`<%= ENV['TEST_ENV_NUMBER'] %>` と記すのがポイントです。

## rake db:migrate を並列実行する

ここまでの準備が出来たら並列実行するプロセスの数を指定して `RAILS_ENV=test bundle exec rake 'parallel:prepare[4]'` を実行することでスキーマのマイグレーションを行えます。ここではプロセス数を4つ指定しています。

あるいは CI 環境として `rake db:schema:load` あるいは `rake db:migrate:reset` をプロセス分実行したいという場合は以下のようなコマンドを組み込みます。

```sh
bundle exec parallel_test --exec 'rake db:schema:load RAILS_ENV=test' -n 4
```

```sh
bundle exec parallel_test --exec 'rake db:migrate:reset RAILS_ENV=test' -n 4
```

実行時エラーで困ったときは、[parallel_tests のこの周辺のコード](https://github.com/grosser/parallel_tests/blob/40ef1bd3957419fc0647572a11514927cdf8090b/lib/parallel_tests/tasks.rb#L17)を読むとヒントになるかもしれません。

## 並列テスト実行 :octocat: 

RSpec と Cucumber を合わせて実行する場合は次のとおりです。

```sh
RAILS_ENV=test bundle exec parallel_test spec --type rspec -n 4 --suffix '_spec.rb|.feature'
```

52分のテストを13分まで減らした実績もあるため、とりわけ CI 環境でのスローテストが深刻な場合に導入を検討することをおススメします。
matplotlibで日本語が表示されない時の対応手順

# 環境設定

以下の手順で機械学習の環境をセットアップします。
http://qiita.com/mix_dvd/items/29dfb8d47a596b4df36d

# サンプルコードの入手と実行

PyData.Okinawaのデータを使ってグラフを表示させるテストをしてみます。
https://github.com/PyDataOkinawa/meetup001/blob/master/PyData.Okinawa%20Meetup%20001%20opendata%20sample.ipynb

```
$ git clone https://github.com/PyDataOkinawa/meetup001.git
```

Jupyter Notebookを起動し、「PyData.Okinawa Meetup 001 opendata sample.ipynb」という名前のノートを開き、カーネルの「Restart & Run all」を実行します。

下の方に表示されるグラフを見ると、日本語の部分が「□」になっています。

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/114240/11edf45b-2f5f-9f9c-ffb6-50cd57407444.png)

# フォントの設定

上記の状態を改善させるためにIPAからフォントをダウンロードし、matplotlib用にインストールします。
※ 環境設定で示したリンク先の手順でインストールしている場合に完全対応しています

以下のページからダウンロードできます。
コマンドでダウンロードできなかった場合はブラウザでダウンロードして下さい。
http://ipafont.ipa.go.jp/old/ipafont/download.html

## Ubuntu

```
$ sudo apt install unzip
$ wget -O ipafont.zip http://ipafont.ipa.go.jp/old/ipafont/IPAfont00303.php
$ unzip ipafont.zip
$ mv IPAfont00303/*.ttf .pyenv/versions/anaconda2-4.0.0/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf/
$ rm .cache/matplotlib/fontList.cache
```

## Mac

まず、フォントキャッシュを削除するため所在地を確認します。
フォントキャッシュの場所は以下のコードで確認します。

```py:
import matplotlib
from matplotlib import rc
print(matplotlib.get_cachedir())
```

僕の場合は、「/Users/[ユーザー名]/.matplotlib」でした。

```
$ cd
$ curl -o ipafont.zip http://ipafont.ipa.go.jp/old/ipafont/IPAfont00303.php
$ unzip ipafont.zip
$ mv IPAfont00303/*.ttf .pyenv/versions/anaconda2-4.0.0/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf/
$ rm .matplotlib/*.cache
```

# スクリプトの修正

以下の部分を変更します。

```py:変更前
font = {'family':'Osaka'}
rc('font', **font)
```

```py:変更後
font = {'family':'IPAGothic'}
rc('font', **font)
```

ちなみに、どこかに以下のコードも入れておかないとエラーが出ますので、上記コードの前に入れておくことをお奨めします。

```py:
from matplotlib import pyplot
```

# 再実行

無事に日本語が表示されました。

![Unknown2.png](https://qiita-image-store.s3.amazonaws.com/0/114240/e7e1fe59-6970-94af-1aa3-cfca2ebbde4f.png)
Android Studio 2.1のAndroid Emulatorの通信をCharles Proxyを使ってパケットキャプチャする

個人的なメモ。多分Android Studioにかぎらず適用出来ると思う。
EmulatorはNexus 5 API 23で確認。

# やり方

- Charles Proxyを起動する。
- Android StudioからAndroid Emulatorを起動する。
- エミュレータの中のSettingsアプリ → Wireless & NetworksのMore → Cellular networks → Access Point Names → T-Mobile US(環境によって違うかもだけどとにかく使ってるやつ) → Proxyを自分のホストマシンのIP, Portを8888に設定
    - スクショめんどいから[これ見て](http://stackoverflow.com/a/37113841/1718833)
- そのエミュレータのブラウザで http://charlesproxy.com/getssl/ にアクセスしてcharlesの証明書をインストールする。
- これでてきとうに通信するとCharlesにパケットが流れるはず。
- __Charlesにパケットが流れてこない時はエミュレータを1度Airplane modeにしてまた戻すと動くかもしれない。__
    - これで数時間無駄にしたぞ☆

# 補足
- 昔はrun/debugのconfigurationでproxyの設定書けたっぽいけど今はできないみたい。
- 参考
    - [How do I add -http-proxy to an android emulator launch from Android Studio 2.0 - Stack Overflow](http://stackoverflow.com/questions/36803553/how-do-i-add-http-proxy-to-an-android-emulator-launch-from-android-studio-2-0)
Rでｆｆｔ

#概要
Rでfftやってみた。
#写真
![r.png](https://qiita-image-store.s3.amazonaws.com/0/18104/59bc94ee-ec8a-cb49-dc1f-8725f79f2a7f.png)

#サンプルコード
```
par(mfrow = c(2, 1))
samplingFreq <- 1200
x <- seq(0, 2 * pi, 1 / samplingFreq)
y <- sin(2 * pi * 440 * x)
plot(x, y, "l")
s <- samplingFreq / 2
h <- c(seq(0, s, length.out = length(y) / 2), seq(-s, 0, length.out = length(y) / 2))
f <- fft(y)
m <- Mod(f)
FFTdata <- cbind(h, m)
plot(FFTdata[1:nrow(FFTdata) / 2, ], t = "l", pch = 20, lwd = 2, cex = 0.8, main = "440hz", xlab = "f(Hz)", ylab = "p")
```