OmniAICreator/Qiita-1.07M huggingface dataset:
RaspberryPiで遊んでみたーその3 ScanSnapをブラウザから操作するための準備をする


RaspberryPiに、nginx、php、ftpサーバなどをインストールして、webサーバとして使えるようにセットアップしていきます


#nginxをインストールする

```bash:
$ sudo apt-get install nginx
$ sudo service nginx start
```

#80番ポートへの接続を許可する

```bash:
$ sudo ufw allow 80
$ sudo ufw reload
```

ブラウザでRaspberryPiのIPアドレスにアクセスしてみて、「Welcome to nginx!」と表示されたら成功

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

参考サイト：[Tutorial – Install Nginx and PHP on Raspbian](http://www.raspipress.com/2014/06/tutorial-install-nginx-and-php-on-raspbian/)

##phpのインストール

```bash:
$ sudo apt-get install php5 php5-fpm php5-cgi php5-cli php5-common php5-mysql
$ sudo vi /etc/nginx/sites-available/default
```

##/etc/nginx/sites-available/defaultの編集

```bash:/etc/nginx/sites-available/default
...略...

#アンコメント
listen 80; ## listen for ipv4; this line is default and implied

...略...

#index.phpを追加
index index.php index.html index.htm;

...略...

#アンコメント
location ~ \.php$ {
 fastcgi_split_path_info ^(.+\.php)(/.+)$;
 # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
 
 # # With php5-cgi alone:
 # fastcgi_pass 127.0.0.1:9000;
 
 # # With php5-fpm:
 fastcgi_pass unix:/var/run/php5-fpm.sock;
 fastcgi_index index.php;
 include fastcgi_params;
 }
 
 ...略...
 
```
 
##/etc/php5/fpm/php.ini の編集
 
```bash:
$ sudo vi /etc/php5/fpm/php.ini
```

;cgi.fix_pathinfo=1の部分のコメントを外して、数値を0に変える

```bash:/etc/php5/fpm/php.ini

;cgi.fix_pathinfo=1

↓↓

cgi.fix_pathinfo=0
```

##php実行ユーザの設定
phpの実行ユーザがwww-dataのままだと、シェルスクリプトの実行などに支障が出るので、実行ユーザをraspiscanに変える

参考サイト：[Raspberry PiでWordPressサーバ構築 ＜6. 環境設定編＞ ](http://www.emc-craft.xyz/raspberry-pi/post-132/)

```bash:
$ sudo vi /etc/php5/fpm/pool.d/www.conf
```

実行ユーザと実行グループをraspiscanに変える

```bash:/etc/php5/fpm/pool.d/www.conf
・・・（略）・・・

usr = raspiscan
group = raspiscan

・・・（略）・・・
```

##設定ファイルの読み込みとnginxの再起動

```bash:
$ sudo /etc/init.d/php5-fpm reload && sudo /etc/init.d/nginx reload
```

動作確認用のphpファイルを作成する

```bash:
$ cd /usr/share/nginx/www
$ sudo vi index.php
```

```php:index.php
<? phpinfo(); ?>
```
  
ブラウザでRaspberryPiのIPアドレスにアクセスしてみて、phpinfoページが表示されたら成功
一覧の下の方、EnvironmentのUSERがraspiscanになっていることを確認する

#ftpをインストールする
phpファイルを書いたりするのは、開発環境の整っているローカルマシンがいいってことで、ftpを使えるようにする
参考サイト：[RASPBERRY PI – Install FTP](http://www.instantsupportsite.com/self-help/raspberry-pi/raspberry-install-ftp/)

##vsftpdのインストール
```bash:
$ sudo apt-get upgrade && sudo apt-get update
$ sudo apt-get install vsftpd
```

##設定ファイルの編集
```bash:
$ sudo vi /etc/vsftpd.conf
```

vsftpd.confを編集

```:/etc/vsftpd.conf

YESをNOに書き換える
Anonymous_enable=NO

以下をアンコメント
Local_enable=YES
Write_enable=YES
Ascii_upload_enable=YES
Ascii_download_enable=YES
```

##ftp:20、21番ポートへの接続を許可する
```bash:
$ sudo ufw allow 20
$ sudo ufw allow 21
$ sudo ufw reload
```

#操作ページ用のフォルダを作る
```bash:
$ cd /usr/share/nginx/www
$ sudo mkdir raspiscan
$ sudo chown raspiscan raspiscan
```

****

次はいよいよ操作ページを作るよ！！
[RaspberryPiで遊んでみたーその4 ScanSnapをWebから操作するための操作ページを作る](http://qiita.com/hyperkinoko/items/ef76eefc364a26e2c0c8)
WebUIから Docker Registry 2.0上のimageをDELETE

* Docker Registry 2.0にpushはできたが、DELETEができなくてハマっていた。
* WebUI欲しいので探してみた。

## 参考

* [hyper/docker-registry-web](https://hub.docker.com/r/hyper/docker-registry-web/)
    * [Delete Enabled but not allowed to delete · Issue #989 · docker/distribution](https://github.com/docker/distribution/issues/989)
    * [Docker Registry 2使ってみた - Qiita](http://qiita.com/tukiyo3/items/2ca5b1eddd455e333016)


## `hyper/docker-registry-web`とは

* docker-registry-uiがregistry 2.0に対応しきれていないなか、対応したものを作った人が現れた。
    * [Support for Docker Registry 2.0 · Issue #141 · atc-/docker-registry-ui](https://github.com/atc-/docker-registry-ui/issues/141)

![w4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/61336a21-2242-ba18-dc2d-5c90cb28a858.png)

* docker build時のコマンドが確認できて良い。


## docker-compose.yml

* hyper/docker-registry-webの[docker-compose.yml](https://raw.githubusercontent.com/mkuchin/docker-registry-web/master/docker-compose.yml)

```diff:docker-compose.yml
 web:
   image: hyper/docker-registry-web
   ports:
     - "8080:8080"
   links:
     - registry
   environment:
    REGISTRY_HOST: registry
 
 registry:
   image: registry:2
   ports:
     - 5000:5000
   environment:
     REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /registry
+    REGISTRY_STORAGE_DELETE_ENABLED: 'True'
   volumes:
     - ./registry:/registry
```

* registry:2 と記述すると、2015/11/8では2.2が降ってきました。[dockerhub](https://hub.docker.com/_/registry/)

## 起動

```bash:
docker-compose up
```

* http://localhost:8080 にアクセスし画面が表示されることを確認。


![W1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9781fd7f-3d8d-76fd-eaa9-2af0f4a9f160.png)

```bash:push
docker tag ubuntu localhost:5000/ubuntu
docker push localhost:5000/ubuntu
```

![w2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/07c7887d-5253-2d56-1ea8-929848529d89.png)

![w3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/134710ad-df9e-afaa-2fc3-f522166b0f93.png)

* 削除できることを確認。


----

# 別の設定方法

* [Configuring a registry](https://docs.docker.com/registry/configuration/)

```diff:/etc/docker/registry/config.yml
 version: 0.1
 log:
   fields:
     service: registry
 storage:
     cache:
         blobdescriptor: inmemory
     filesystem:
         rootdirectory: /var/lib/registry
+    delete:
+      enabled: true
 http:
     addr: :5000
     headers:
         X-Content-Type-Options: [nosniff]
 health:
   storagedriver:
     enabled: true
     interval: 10s
     threshold: 3
```

```diff:docker-compose.yml
 web:
   image: hyper/docker-registry-web
   ports:
     - "8080:8080"
   links:
     - registry
   environment:
    REGISTRY_HOST: registry

 registry:
   image: registry:2
   ports:
     - 5000:5000
   environment:
     REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /registry
   volumes:
     - ./registry:/registry
+    - ./config.yml:/etc/docker/registry/config.yml
```

```bash:
docker-compose up
```
cylon.jsでhueを制御する

#はじめに

![cylon.png](https://qiita-image-store.s3.amazonaws.com/0/95484/87c04f86-33b3-4969-4975-d777480e8397.png)

[cylon.js](http://cylonjs.com/)を利用してhueのon/off制御と色、明るさを制御しましょう。
やりたいことはnetatmoで外気温を測定して、測定値から色を動的に変化させること。
それをBLEを利用して「部屋に入ってきたらBloomを外気温に合わせて色を変えてon。部屋から出たら自動でoff」的なものを作りたい。
まずは前哨戦。hueをcylon.jsで制御できるようにした。

#使い方
ほとんどこの記事通りに作ればいけます。
[Javascriptで照明を操作 [Cylon.js x Philips Hue]](http://qiita.com/n0bisuke/items/a2fc7953023f5928e367)

cylon.jsのhue情報は[こちら](http://cylonjs.com/documentation/drivers/hue-light/)を参照してください。

#コードの紹介
今回もシェルで連携することを考慮して引数で各種パラメータを設定できるようにした。
第一引数にはライトのID（1とか2とかの数値）と、on/off情報(1でon,それ以外の数値でoff)。
jsonで色情報と明るさの情報を渡せるようにした。

```cylon-hue.js
var host = '<IP_ADDRESS>',
	username = '<USERNAME>';

// ライト番号とon/offは最低限必要。色指定なしでランダム生成する。
if (process.argv.length < 3) {
    console.log('%s %s require:<lightId> require:<on:1/off:0> option:json{red,green,blue,brightness}', process.argv[0], process.argv[1]);
    return;
}

randomColor = function(){
	return Math.floor(Math.random() * 255);
}

var lightid = process.argv[2],
	turnlight = process.argv[3],
	color = JSON.parse((process.argv.length == 5) ? process.argv[4] : '{"red":'+randomColor()+',"green":'+randomColor()+',"blue":'+randomColor()+',"brightness":100}');

console.log('lightid: ', lightid);
console.log('turnlight: ', turnlight);
console.log('color: ', color);

var Cylon = require('cylon');

Cylon.robot({
	connections: {
		hue: { adaptor: 'hue', host: host, username: username }
	},

	devices: {
		bulb: { driver: 'hue-light', lightId: lightid }
	},

	work: function(my) {
		if(turnlight == 1){
			my.bulb.turnOn();
			
			// brightnessを先に指定しないと色の設定が無効になる
			my.bulb.brightness( color.brightness );
			console.log('brightness: %d', color.brightness);
			
			my.bulb.rgb(color.red, color.green, color.blue);
			console.log('red: %d, green: %d, blue: %d', color.red, color.green, color.blue);
			
			console.log('turnOn()');
		}
		else{
			my.bulb.turnOff();
			console.log('turnOff()');
		}
	}
}).start();
```

#使用例
以下に使用例を示します。
自宅のライトは4つあって、4つ目がBloomなので以下の様な指定になっています。
各自の環境に合わせて設定してください。

###Red

```bash
pi@raspberrypi2 ~/cylon-hue $ node cylon-hue.js 4 1 '{"red":255,"green":0,"blue":0,"brightness":100}'
```

![DSC_2746.JPG](https://qiita-image-store.s3.amazonaws.com/0/95484/567ed6f8-99b2-9869-ae56-c586acc4b2a3.jpeg)

###Green

```bash
pi@raspberrypi2 ~/cylon-hue $ node cylon-hue.js 4 1 '{"red":0,"green":255,"blue":0,"brightness":100}'
```

![DSC_2747.JPG](https://qiita-image-store.s3.amazonaws.com/0/95484/1fc0f26f-3156-e213-ea68-acb336b9d031.jpeg)

###Blue
blueだけなぜかB=255で白っぽい色になる。
おそらくcylon-hueで利用しているnode-hue-api/hue-api/rgb.jsの計算の問題かと。
hueのWebAPI自体が色の指定にHSL（たぶん）を使っているので、内部的にRGB to HSLしている。
（hue developer programの[Core concepts](http://www.developers.meethue.com/documentation/core-concepts)を参照）
この辺りの計算を見なおせば多分直るけど、まだ見てない。

```bash
pi@raspberrypi2 ~/cylon-hue $ node cylon-hue.js 4 1 '{"red":0,"green":71,"blue":255,"brightness":100}'
```

![DSC_2748.JPG](https://qiita-image-store.s3.amazonaws.com/0/95484/9d59b742-eb51-cbd4-f9e5-470edc4c3292.jpeg)

#さいごに
はじめにで書いたが、最終的にはBLEで特定エリアに入ったらhueを自動でon、出たら自動でoff。
netatmoで外気温を測定して、自動で温かい時には暖色、寒い時には寒色にする。
という方向でやっていこうと思う。
MongoDBをHomebrewでインストールしたときのメモ


#環境
- Mac OS X Yosemite 10.10.5
- Homebrew 0.9.5

#インストール手順
1.Homebrewのアップデート

```
$ brew update
```
2.HomebrewでMongoDBインストール

```
$ brew install mongodb
```
3.バージョン確認

```
$ mongo --version
MongoDB shell version: 3.0.7
```

#エラー対処
brewのupdateでgitのエラーが出る場合
http://qiita.com/Keisuke69/items/0635c92a4bc4f912de12
homebrewをsudoで実行するときにエラーが出る場合
http://raiko.in/tech/homebrew-cant-sudo/
homebrewインストールしたライブラリパスを自動解決 for Makefile

[`pkg-config`](http://www.freedesktop.org/wiki/Software/pkg-config/)の簡易代用品。`brew --prefix <formula>`コマンドを利用する。

[Boost C++ Libraries](www.boost.org/)の例：

```mf
BOOST_PATH=$(shell brew --prefix boost)
CXXFLAGS+=-I$(BOOST_PATH)
LIBS+=-L$(BOOST_PATH)/lib #-lboost_XXX...
```
RakeでRidgepoleコマンドを実行する

データベースのスキーマを管理する方法の一つにRigepoleがあります。[Rigepole](https://github.com/winebarrel/ridgepole)は、データベースのスキーマを管理するツールです。スキーマの更新は、DSLで記述したスキーマファイルを反映して行います。Ridgepoleについては、[クックパッドにおける最近のActiveRecord運用事情 - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2014/08/28/194147)が参考になります。

実際にスキーマを更新するには、次のコマンドを実行します。

```rb
bundle exec ridgepole --apply --file Schemafile --config config/database.yml
```

繰り返し行う作業にしては、少しコマンドが長いです。Rakeタスクにしてみましょう。

```lib/tasks/ridgepole.rake
namespace :ridgepole do
  desc 'Apply database schema'
  task apply: :environment do
    ridgepole('--apply', "--file #{schema_file}")
    Rake::Task['db:schema:dump'].invoke
  end

  desc 'Export database schema'
  task export: :environment do
    ridgepole('--export', "--output #{schema_file}")
  end

  private

  def schema_file
    Rails.root.join('Schemafile')
  end

  def config_file
    Rails.root.join('config/database.yml')
  end

  def ridgepole(*options)
    command = ['bundle exec ridgepole', "--config #{config_file}"]
    system [command + options].join(' ')
  end
end
```

これで、RakeでRidgepoleコマンドを実行する準備ができました。次のように、コマンドを実行すると実際にRidgepoleコマンドが実行されます。

```bash
Apply ridgepole schema
$ bundle exec rake ridgepole:apply 

Export ridgepole schema
$ bundle exec rake ridgepole:export
```
apkをダブルクリックでAndroid実機へ転送＆実行

## いろんな apk を何度も手軽に実行したい
ってことで apk ファイルをダブルクリックで実機に転送＆実行ができると嬉しいなと思ったのです。

単純に最新ビルドを実行したいというだけであれば [HockeyApp](http://hockeyapp.net/) で良いと思います。

が、自分の用途としては「hoge-v1.apk」「hoge-v2.apk」「hoge-v3.apk」みたいないろんなバージョンの apk があって、これらをとっかえひっかえ実機実行したい（※）、という感じでありまして、その要件を満たすためにはやはり apk ダブクリが最も手軽で良いなーと思ったのです。

## apk-launcher
既に何かしらソリューションがあるかと思って探したのですが見つかりませんでした（良いのがあったら教えてください）。

で、とりあえず [apk-launcher](https://github.com/kobake/apk-launcher) というものを作ってみました。

![movie.gif](https://raw.githubusercontent.com/kobake/apk-launcher/master/screenshots/movie.gif)

## 使い方
Android実機をUSB接続した上で、apk_launcher.bat または apk_launcher.sh の第1引数へ apk ファイル名を渡すと、自動的にインストールと実行をしてくれます。
署名の食い違い等があった場合でも全力でスルー（自動アンインストール＆インストール）してくれるので楽ですが少し危険かもしれません。あくまでも開発用途ということで。

個人的なオススメ設定としては **.apk ファイルを apk_launcher.bat に関連付けしておくといろいろ捗ります。**つまりはダブルクリックで apk が実行できるようになります。

（Mac の場合は Automator でシェルへの関連付けみたいなことができるんでしたっけ。。ちょっとこのあたりは詳しくなくて試せてないです。。）

## やってること
以下を代理実行してくれているだけです。これを手打ちで毎回打ち込むのはなかなか辛い。

- インストール … ```adb install <apk file>```
- アンインストール … ```adb uninstall <package name>```
- 実行 … ```adb shell am start -n <package name>/<activity name>```

アプリのパッケージ名やアクティビティ名が必要になるのですが、そのあたりは Build-tools の ```aapt``` コマンドで apk から情報を抽出しています。

- 参考：[Android: apk から取得できる情報いろいろ - Qiita](http://qiita.com/kobake@github/items/b35322737a2dc8d265e0)

## ※ユースケース説明
そんなユースケースあるの？って思われるかもしれませんが、v1, v2, v3 が順繰りのバージョンではなく、いわゆるブランチ名に該当するようなケースを考えていただければ想定ケースの想像が付きやすいのではないかと思います。

実際のところ自分のケースはそういうケースです。


## おまけ
Stack Overflow にピンポイントな回答があるのだけど。

http://stackoverflow.com/questions/4567904/how-to-start-an-application-using-android-adb-tools

```
pkg=$(aapt dump badging $1|awk -F" " '/package/ {print $2}'|awk -F"'" '/name=/ {print $2}')
act=$(aapt dump badging $1|awk -F" " '/launchable-activity/ {print $2}'|awk -F"'" '/name=/ {print $2}')
adb shell am start -n $pkg/$act
```

個人利用としてはこれで十分すぎるのだけど、人にも使われることを考えてツールを作るときには環境の前提をどこまで考えるべきか迷いあぐねています。
awk とか grep とかね、そういうの Windows でも標準で使えれば良いんだけど。。

Cygwin 入れろとか MinGW 入れろとか Git Bash を入れろとか、そういうハードルできるだけなくしたいんですよね。。

Android SDK は仕方ないとして、結局 Python に依存する形にはなってしまったのだけど。。迷走中。Chocolatey みたいなものが良い感じに普及して、依存関係全部カプセル化できる未来を切望。
SVProgressHUDで遅延処理してdismissする



ローディング中に通信環境が悪い時に止まっているように見えるのを防ぐためにSVProgressHUDを使ってロード中アニメーションを使った。

loadingStateはenum型の列挙型。

```LoadingState
public enum LoadingState {
    case None
    case InProgress
    case Success
    case Failure
}
```

```
viewModel.loadingState.observeNew { state in
	switch state {
    case .InProgress :
    	SVProgressHUD.initializeAndShow()
    default :
       SVProgressHUD.dismiss()
       self.refreshControl.endRefreshing()
    }
}
```

ただ、通信処理が早く終わってしまうとぐるぐるが出てすぐ消える、ということが発生してしまい使っていて不快なので、通信処理が終わったら何秒かdelayさせてからぐるぐるを消すようにしました。


``` SVProgressHUD.swift
import SVProgressHUD

extension SVProgressHUD {
    //省略
    
   class func delayAndDismiss(time: Double){
        let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(time * Double(NSEC_PER_SEC)))
        dispatch_after(delayTime, dispatch_get_main_queue()) {
            self.dismiss()
        }
    }
}
```

```
viewModel.loadingState.observeNew { state in
	switch state {
    case .InProgress :
    	SVProgressHUD.initializeAndShow()
    default :
       // 通信処理が終わってから0.5秒delayさせる
       SVProgressHUD.delayAndDismiss(0.5)
       self.refreshControl.endRefreshing()
    }
}

```
<br>
しかしながらこれだと通信処理が長い場合も、処理が終わったらdelayされてしまうので処理時間がxx秒以上だとdelayさせないようにしたい。どなたかいい方法があれば教えてください。


<br>
___
以下参考。

元記事
[Swiftでロード中アニメーションSVProgressHUDを利用するには](http://qiita.com/drapon/items/037745e1bd8fb2c707b1)

・ローディングを表示
SVProgressHUD.show() 
・ローディングを表示（文字を入力）
SVProgressHUD.showWithStatus("読み込み中") 
・成功
SVProgressHUD.showSuccessWithStatus("接続成功！！")
・失敗
SVProgressHUD.showErrorWithStatus("ネットワーク通信エラーです")
・引っ込める
SVProgressHUD.dismiss()


[Swiftで遅延処理](http://qiita.com/koyopro/items/9988928dfa22e3a41987)
Qiita > 要望 > Tab入力を受け付けてほしい

Qiita(web)ではコードを入力する仕組みがある一方、Tabキーを押すと`<tab>`が入力されるのでなく、「Qiitaに投稿」ボタンにフォーカスが飛んでしまう。

結果として、tabを使うコードの入力がQiitaのエディタではできない。

http://ideone.com/ などのサイトではtabはtabとして入力できる。

すぐには対応できない事項ではあると思うが、将来的にはTab入力を受け付けてほしい。
Application Loader 3.0 でiOSアプリを申請するとビルドが「処理中」から先に進まない問題とその解決方法


# はまった。

iTunes Connect のビルド選択画面でダウンロードできる Application Loader を使って iOS アプリを申請すると、ビルドステータスが「処理中」から先に進まなくなり、ビルドが選択できなくなりました。

原因を小一時間調べたところ、

**Application Loader.app のバージョンが古い**

という結論にいたりました。なんてこったい！

iTunes Connect のビルド選択画面にある Application Loader のリンクをクリックしてダウンロードできるのは v3.0。

<img src="https://qiita-image-store.s3.amazonaws.com/0/24450/28da9e2d-ee20-0a62-3cbf-be6ca0ee8c27.png" width="300" />


一方、Xcode 7.1 付属の Application Loader.app は v3.3 でした。

<img src="https://qiita-image-store.s3.amazonaws.com/0/24450/8b39cb02-f7e9-72db-1a34-a92ad9ab8770.png" width="300" />

新しい方の Application Loader を使って申請したら無事ビルドを選択できるようになりましたとさ。ちゃんちゃん。

# 解決方法

iTunes Connect でダウンロードできる Application Loader は使わないで、 **Xcode 付属の Application Loader** を使いましょう。

Xcode を最新版にアップデートした上で、Xcode を起動し、

[Xcode]メニュー→[Open Developer Tool]→[Application Loader] で Application Loader.app を起動できます。

もしくは **Xcode の Organizer の [Upload to App Store...]** を使いましょう。
Windowsで Ctrl + [ に Esc を割り当てる


## AutoHotKeyをインストール

キー割り当て変更のためにAutoHotKeyというソフトをインストールする。

http://ahkscript.org/


## key.ahkファイルを作成

「Ctrl + [」 を割り当てる設定ファイルを作成する。

```key.ahk
^[::Send {Esc}
```

AutoHotKeyをインストールしていれば、ファイルをダブルクリックすることで設定が有効になる。

スタートアップに登録しておけば、Windows起動時に自動で反映できる。

## 参考

http://jutememo.blogspot.jp/2011/08/autohotkey-esc.html
http://tooljp.com/Windows10/doc/Startup/Startup.html
AWS RDS Mysqlのパフォーマンスチューニング

# 参考
- [AWS RDS MySQLでクエリログを出力する方法 “普通のMySQLよりは面倒…”](http://tech.basicinc.jp/AWS/2013/04/09/aws_rds_command/)
- [[blackbird-rds] Monitoring AWS RDS](http://qiita.com/JumpeiArashi/items/525e0c9b6cea44544156)

# MySQL ログの閲覧

* 最新20件のqueryを表示

```
mysql> select event_time, argument from mysql.general_log order by event_time desc LIMIT 20;
```

* 最新20件のslow queryを取得

```
mysql> select * from mysql.slow_log order by start_time desc LIMIT 20;
```
PHPUnitでmockした関数の引数を指定する方法

CakePHPとPHPUnitを使ってmockを作成する機会があり、mockする関数の引数を指定する方法を調べたのでまとめました。

## 環境
- PHP 5.6.15
- PHPUnit 3.7.38
- CakePHP 2.7.5


## 設定方法1
CakePHPの公式ドキュメントでは、`with`を使うことで引数の指定ができると紹介されています。

```php
$Posts->Auth->staticExpects($this->any())
        ->method('user')
        ->with('id')
        ->will($this->returnValue(2));
```
この場合、引数に`id`が設定された時のmockを作成する方法を示しています。つまりソースコード上で`$this->Auth->user('id')`と書かれた動作のみを作ることになります。


#設定方法2
設定方法1のだと、任意の引数が関数に渡った場合のmockを作ることはできません。任意の引数の場合にどのようにテストコードを書くのか調べました。

結論から言うと、以下のように`->with($this->anything())`を使えば解決します。

```php
$Posts->SampleModel
        ->expects($this->any())
        ->method('methodName')
        ->with($this->anything()) #<-ここ
        ->will($this->returnValue('something'));
```

他にも、想定される引数を直接指定することでmockを作成できます。また、使用できる関数はPHPUnitのソースコードを読むことで確認できます。([sebastianbergmann/phpunit Asset.php](https://github.com/sebastianbergmann/phpunit/blob/master/src/Framework/Assert.php)の下の方)

一部を以下に記載します。

```php
$this->contains($value)
$this->arrayHasKey($key)
$this->equalTo($value, $delta, $maxDepth)
$this->classHasAttribute($attribute)
$this->greaterThan($value)
$this->isInstanceOf($className)
$this->isType($type)
$this->matchesRegularExpression($pattern)
$this->stringContains($string, $case)
```

## 参考
- [CakePHP公式-テスト](http://book.cakephp.org/2.0/ja/development/testing.html)
- [gregk : PHPUnit with() method argument matchers](http://archive.gregk.me/2011/phpunit-with-method-argument-matchers/)
- [sebastianbergmann/phpunit](https://github.com/sebastianbergmann/phpunit/)
- [mjlivelyjr : advanced-phpunit-testing  (slideshare) ](http://www.slideshare.net/mjlivelyjr/advanced-phpunit-testing)
petalinux / microzed > C. アプリケーションプログラムの作成

```txt:動作確認
CentOS 6.5
```

以下の作業でプロジェクトのテンプレートを作成する
`<project-root>`は本例では `~/petaLinux/workspace/Avnet-MicroZed-z7010-v2014.2` に対応する

```
$ cd <project-root>
$ petalinux-create -t apps --template c --name myapp
ファイルが <project-root>/components/apps/myapp フォルダに作成される。
```
 
この中のmyapp.cにアプリケーションプログラムを作成する。
 
作成したアプリケーションを以下の手順でビルドする。

1 . 作成したアプリケーションをビルドに含めるようにする

```
$ petalinux-config -c rootfs
```
表示されるメニューにおいて Apps > myappを選択し、設定を保存してメニューを終了する。

2 . アプリケーションを含めてビルドをする

```
$ petalinux-build
```

アプリケーションだけを修正した場合は、以下の方法がビルド作業が早く済む

```
$ petalinux-build -c rootfs/myapp
$ petalinux-build -x package
```

3 . 以上で作成されたファイル (images/linux)をもとに、BOOT.binとimage.ubを作成してmicroSDにコピーして起動に使用する。

<font color=blue>*** 留意点 *** アプリケーションがヘッダファイルをincludeしている場合、ヘッダファイルのみを変更しても上記のビルドにヘッダファイル変更が反映されないようだ。これを防ぐために、ソースファイルを更新する必要がある</font>
 
4 . 作成したアプリの実行は以下の手順で行う。

```
$ cd /bin
$ ./myapp
```
petalinux / microzed > B. Prebuilt BSPファイルを使ってのビルド作業 | BOOT.bin作成 | microSDからの起動

```txt:動作確認
CentOS 6.5
```

[prebuilt BOOT.BINとimage.ubでの動作テスト](http://qiita.com/7of9/items/49f705c5b51c7c7c91a2)
[前準備](http://qiita.com/7of9/items/35ac5298995477fe8315)

1 . ビルド作業

```
$ cd ~/petaLinux/workspace/Avnet-MicroZed-z7010-v2014.2
$ petalinux-build
ビルドが終わるとimages/linux/の下に各種ファイルがビルドされる (zImage, image.elf, zynq_fsbl.elf など)
```

2 . QEMUで起動確認できる

```
$ petalinux-boot --qemu --kernel
```

  QEMUを終了するにはCtrl+A, Xを押す

3 . zImageから圧縮されたuImageを作る

```
$ cd ~/petaLinux/workspace/Avnet-MicroZed-z7010-v2014.2
$ mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 -n "Linux kernel" -d images/linux/zImage uImage
```

4 . ~ここにあるarm_ramdisk.image.gzを取得して、以下の手順でuramdisk.image.gzを作成する~ (<font color=red>この作業は不要</font>)

```
$ mkimage -A arm -T ramdisk -C gzip -d ./arm_ramdisk.image.gz uramdisk.image.gz
```

5 . XSDKにてBOOT.binを作成する。

```
linuxで作成した以下のファイルをVivadoとXSDKをインストールしたWindowsに持っていく
- system.dtb : 手順1にてimages/linux以下にビルドされたファイル
- u-boot.elf : 手順1にてimages/linux以下にビルドされたファイル
- uImage : 手順3で作成したファイル
- (不要) uramdisk.image.gz : 手順4で作成したファイル
- zynq_fsbl.elf : 手順1にてimages/linux以下にビルドされたファイル
  
Windows上にてXSDKを起動する
Xilinx Tools > Create Zynq Boot Imageを選択する
Create new BIF fileを選択して、ファイルをoutput.bif(任意のファイル名)とする。ファイルパスはBOOT.binを作成するところにしておけばいい。
右下のAddを選択して、上記のファイルを以下の順で追加していく。ここで「Partition type」は「datafile」としておけばよさそう。
1. zynq_fsbl.elf
2. u-boot.elf
3. uImage
4. (選択不要) uramdisk.image.gz
5. system.dtb
Create Imageを選択してBoot.binを作成する
```

6 . ファイルをmicroSDにコピーする

```
以下のファイルをmicroSDにコピーする
- 手順5で作成したBOOT.bin
- 手順1で作成したimage.ub ( images/linuxにビルドしたもの )
```

7 . microSDをMicroZedに入れて、MicroZedを起動するとPetaLinuxが立ち上がる

```
login:root
password:root
でログインする。
  
$ uname -a
Linux zynq-microzed-z7010 3.14.2-xilinx #2 SMP PREEMPT Tue Jul 8 21:55:19 PDT 2014 armv7l GNU/Linux
```
CakePHPのHtmlヘルパーでパンくずリストが作れる

完全にそんな便利機能があるのを忘れていて車輪の再発明をするところだった。

一例としてヘルプページ ( /pages/help/ ) にパンくずリストを追加する手順を書いておく。

### 汎用的にしたいのでElementを作る

```View/Elements/breadcrumbs.ctp
<div class="breadcrumbs">
	<?php echo $this->Html->getCrumbs(' &rsaquo; ', array(
		'text' => 'Home',
		'url' => '/',
		'escape' => false,
	)); ?>
</div>
```

### 全ページ共通で出したいのでLayoutでElementを吐く

```View/Layouts/default.ctp

	<div id="header">
		...
	</div>

	<?php echo $this->element('breadcrumbs'); ?>

	<div id="content">
		...
	</div>
```

### 各ページでパンくずの設定をする

```View/Pages/help.ctp
<?php $this->Html->addCrumb('Help', '/pages/help/'); ?>
```

かんたん！
petalinux / microzed > A. Prebuilt BSPファイルを使ってのビルド作業 > 前準備

```txt:動作確認
CentOS 6.5
```

[こちら](http://qiita.com/7of9/items/49f705c5b51c7c7c91a2)の手順3まですましておく。

lsb_releaseというコマンドが必要なので、CentOS6.5の場合は
`$ yum install redhat-lsb`
をrootで実行して関連パッケージを入れておくこと

``` 
[ERROR] make[2]: *** [.pkg_update] Error 255
[ERROR] make[1]: *** [sub_build_component_/none/packages-repo/single/plnx-repo] Error 2
ERROR: Failed to build linux
```

ビルド時に上記のエラーが発生する時は以下を実行しておくこと

```
$ yum install libselinux
$ yum install libselinux.i686
```
さらに、Error 255はPetaLinuxのインストールを深いフォルダ階層にしている時にも発生する。/opt/pkg/にインストールするほうがよさそう。
まだError 255が出る場合は以下も行うこと
`$ yum install libstdc++.so.6`
 
いくつかのツールにパスを通すため、.bashrcに以下を追加しておく

```
# for petaLinux
export PATH=$PATH:/opt/pkg/petalinux-v2014.2-final/tools/linux-i386/arm-xilinx-linux-gnueabi/bin
export PATH=$PATH:/opt/pkg/petalinux-v2014.2-final/tools/linux-i386/petalinux/bin
```
私にとっての理想の開発環境・会社

実はプログラマになったのはここ1年ほどで、元々は管理者・経営側でした。
「エンジニア（に限らず、クリエイティブの人でも、管理の人でも）」には
どういう環境を提供するのが理想か？ということを良く考えます。

そして理想を定義した上で、それを実現できるような環境・会社を作りたい。

■空調
暖かい、寒いは人によって好みがあるので、できれば個室単位で空調を設定できるのが望ましい

■部屋
個室。最低でも、2名で1部屋

■パソコン
好きなパソコンを。MacでもWindowsでも。可能な限り高速なマシンを。メモリ大量、SSD。

■キーボード
HHKBでもRealforceでも好きなのを

■マウス
同上

■ディスプレイ
何枚でも好きなのを。エルゴなんとかの使いやすいアームを。
色にこだわりが必用な人はキャリブレーションツールをあわせて。

■照明
蛍光灯ではなく、LED

■椅子
コンテッサでも、バロンでも、ハーマンミラーでも何でも具合がいいものを

■机
使いやすいものを。僕はアトラスとクルーズがいいな

■休憩所
おしゃべりできる場所と、静謐な場所を両方。
暗くて静かな寝る場所も別途

■勤務時間
これは悩みます。個人的には週休3日で1日6時間でいいかなと思っています。
ただし自宅で働きたい人もいるでしょう。

■出社の要否
上記の条件がすべて満たされても、介護だとか、子供の送り迎えだとか、いろいろな理由で
出社が難しいひともいるでしょう。そういう方は自宅でいいと思います。
毎月（もしくは毎週）決められた成果をデリバーできれば。

■エンドユーザ・顧客向けのサポート
前述の条件を満たすには、サポートをアウトソースするとか、
会社で提供する製品・サービスを逆算して考えねばなりませんね。

■図書
電子書籍もありますが、やっぱり紙でも読みたい。
本が満載の図書室がほしい

■業務内容
肝心ですが、熱中できる業務内容

■議論
相手が年上だろうが社長だろうがなんだろうが、活発に議論する・できる
petalinux / microzed > Prebuilt BSPファイルに含まれるprebuilt BOOT.BINとimage.ubでの動作テスト

A. Prebuilt BSPファイルに含まれるprebuilt BOOT.BINとimage.ubでの動作テスト

##手順
1 . prebuilt BSPを [microzed.org > support](http://microzed.org/support/design/1519/10) の「PetaLinux Board Support Packages」から取得する (ユーザ登録が必要)
2 . 1で取得したzipファイルを解凍すると.bspファイル ( Avnet-MicroZed-z7010-v2014.2.bsp ) が出てくる
3 . ug977.pdf を参考に linux (CentOS 6.5)上でPetaLinuxのプロジェクトフォルダを作成する

```bash
プロジェクトフォルダの上位フォルダを~/petaLinux/workspaceとした例
$ cd ~/petaLinux/workspace
$ petalinux-create -t project -s /mnt/hgfs/z_shareFolder/petaLinux/Avnet-MicroZed-z7010-v2014.2.bsp
~/petaLinux/workspace以下に Avnet-MicroZed-z7010-v2014.2 というフォルダが作成される
```

4 . microSDにpre-builtされたファイルをコピーする

```bash
$ cd Avnet-MicroZed-z7010-v2014.2/pre-built/linux/images/
このフォルダにある
BOOT.BIN
image.ub
をSDにコピーしてSDブートモードでmicroZedを起動すると、プリビルドされたPetaLinuxが起動した
```

5 . 起動するとlogin: と password: を聞かれる。両方ともrootとすればいい

```bash
Built with PetaLinux v2014.2 (Yocto 1.6) zynq-microzed-z7010 /dev/ttyPS0
zynq-microzed-z7010 login: (rootと入力)
Password: (rootと入力)
  
login[777]: root login on 'ttyPS0'
root@zynq-microzed-z7010:~#
```

6 . バージョンは以下であった

```bash
$ uname -a
Linux zynq-microzed-z7010 3.14.2-xilinx #2 SMP PREEMPT Thu Jun 12 15:04:14 PDT 2014 armv7l GNU/Linux
```

QEMUを使ってのエミュレーションも可能 (ug977.pdf 参照)

```
$ cd ~/petaLinux/workspace/Avnet-MicroZed-z7010-v2014.2
$ petalinux-boot --qemu --prebuilt 3
  
これでQEMU上でlinuxのブートシーケンスが始まる。
```

QEMUを終了するには

```
Ctrl+Aを押してからXを押す
```
RSpecのshared_examplesとかshared_examples_forとか


Ruby初心者である私が、いろいろと奮闘している途中で学んだことその２。

RSpecを書いている時に、共通の内容があるときは```shared_examples```を使うとよい。
書き方はこんな感じ。

```rb
shared_examples_for 'Some Example' do
  it 'should be something' do
    # Some Tests here
  end
end

describe 'なにかのとき' do
  context '何かの場合' do
    it_behaves_like 'Some Example'
  end
end
```

書いていてよくわからなかったのが、調べているとこんな風にいろんな書き方があった。
```shared_examples```
```shared_examples_for```
```shared_context```

なんの違いだろうと思って確認したが、あまり情報が見つからず、下記のコード内で発見。
https://github.com/rspec/rspec-core/blob/master/lib/rspec/core/shared_example_group.rb

```rb
alias shared_context      shared_examples
alias shared_examples_for shared_examples
```

単なるshared_examplesメソッドの別名だった。
テストの内容によってどれを使うか決めれば良さそう。
分からない > Qiita で数値リストの間に文字を入れたい > 1. 空行を入れる / 2. 行頭4つの空白を入れてコード部分を書く

1. 手順1

```
コード
```

2. 手順2

```
コード
```

3. 手順3

上記、全て「1.」という番号がついてしまうが、「2.手順2」「3.手順3」としたい。

markdownの書き方をどうすればいいのか調査中。

## try1

[Qiita](http://qiita.com/Qiita/items/c686397e4a0f4f11683d#lists---%E3%83%AA%E3%82%B9%E3%83%88)
> 1. 文頭に「数字.」を入れるとDecimal型リストになります

これを逆手に取ってこうするのがいいのだろうか。(数字と"."の間に空白を入れる)

1 .手順1

```
コード
```

2 .手順2

```
コード
```

3 .手順3
(訂正しました。2015/11/09)


こうする場合、後ろの"."は不要という考えもある。

## 方法 (muroさんより)
[一部訂正しました。2015/11/09]

こちらの方が最終の記事に違和感がありません。

1. 「手順」の後に空行を入れる。
1. コード部分を書く。この時、行の頭に4つの空白を入れる

    ```
    コード
    ```
1. 以上で数値リストの間にコードを入れれます。

    文字列テスト

1. と書きながら気づいたのは、「行の頭に4つの空白を入れる」をすれば、コードでない文字列も入れることができるようです。ただし、上のように、「テスト」の上側に空行があり、「テストの下側」には空行を入れれないようです。

実際のMarkdownコードについては、muroさんのコメントをベースとして使うのが楽だと思います。
ruby2.2でtest/unitが使用出来ないときの対処方法

ruby2.2でtest/unitをrequireするとこんなエラー出たりする

`cannot load such file -- test/unit`

ruby2.2からtest/unitはスタンダードライブラリから外れたので、Gemfileに追加しないといけない

Gemfileの場合以下を追記
`gem 'test-unit'`
Node.js で小規模なアプリケーションを開発する方法 その8

# はじめに
今回から3回にわたって、やり忘れてしまった「ページ仮作成」の作業を進めていきます。第1回目は下記のページの仮作成を行います。

- トップページ: /
- ダッシュボードページ: /admin/
- ログインページ: /admin/account/login/
- ログアウトページ: /admin/account/logout/

# ビューの編集
上記4件のページについて、編集後の内容を書きに記載します。

```app/views/pages/anonymous-home.jade
extends ../layouts/default

block content
  h1.page-header HOME
  p ログインページを表示するには下記のリンクをクリックしてください
  ul
    li
      a(href='./admin/account/login/') ログインページ

```

```app/views/pages/admin-dashboard.jade
extends ../layouts/2-column/admin

block main
  h1.page-header ダッシュボード
  p 作業記録を登録するには、レポート一覧ページから新規登録をクリックしてください 

```

```app/views/account/admin-login.jade
extends ../layouts/full-width/admin

block main
  h1.page-header ログイン
  .row
    .col-md-offset-3.col-md-6
      .panel.panel-default
        .panel-heading ログインフォーム
        .panel-body
          form.form-horizontal
            .form-group
              label.control-label.col-sm-3(for='username') ユーザ名
              .col-sm-9
                input.form-control(type='text', name='username', id='username', placeholder='ユーザ名を入力')
            .form-group
              label.control-label.col-sm-3(for='password') パスワード
              .col-sm-9
                input.form-control(type='password', name='password', id='password', placeholder='パスワードを入力')
            .form-group
              .col-sm-offset-3.col-sm-3
                a.btn.btn-primary(href='../../') ログイン

```

```app/views/account/admin-logout.jade
extends ../layouts/2-column/admin

block main
  h1.page-header ログアウト
  p ログアウトするには「ログアウトを実行する」ボタンをクリックしてください
  
  div
    a.btn.btn-default(href='../../') ダッシュボードへ戻る
    a.btn.btn-primary.pull-right(href='../login/') ログアウトを実行する

```

# 動作確認
動作を確認するには、```app``` と ```static``` の両方のサーバを動作させた後、 http://localhost:3000/ にログインします。

```
cd app
npm start
```

別のシェルで

```
cd static
npm start
```

下記の順序でページ遷移を行い、表示内容を確認します。

1. トップページ
2. ログインページ
3. ダッシュボードページ
4. ログアウトページ

# おわりに
次回はプロジェクト関連のページ仮作成を行います！
c++ builder / FastReport > VCL4からVCL5への移行

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

FastReport VCL4からVCL5への移行。
VCL4を使わない理由としては、PDFのQualityを設定しても有効とならないことから。

手順

- TfrxPDFExportのCheckboxAsShapeプロパティを設定しているdfmファイルにて設定している行を消す
- インクルードパスの設定からFastReport4\LibD18の参照を削除する
  - ツール > オプション > .環境オプション > .C++オプション > パスとディレクトリ  32ビットWindows > システムインクルードパス
  - FastRepor4 (灰色になっている)を削除
代替データストリームを利用した１日１回起動スクリプト

[minr](http://qiita.com/minr)さんの[代替データストリーム(ADS)について色々調べてみた](http://qiita.com/minr/items/c2393f532b2df35f7a9d)を読んで実際に代替データストリームを使ってみた。

※最初の投稿に不備があったので一部訂正します。

## 代替データストリームの読み書き
代替データストリームはNTFS上のファイルやディレクトリに付与できる情報とのこと。PowerShellでこれにアクセスするコマンドは次の６つ。

| コマンドレット | 機能 |
| --- | --- |
| Add-Content -Path ファイル名 -Value 値 -Stream ストリーム名 | 指定された既存のストリームに値を追記 |
| Clear-Content -Path ファイル名 -Stream ストリーム名 | 指定された既存のストリームから値のみを削除 |
| Get-Content -Path ファイル名 -Stream ストリーム名 | 指定された既存のストリームの値を得る |
| Set-Content -Path ファイル名 -Value 値 -Stream ストリーム名 | 指定されたストリームに値を設定（存在しない場合はストリームを作成） |
| Get-Item -Path ファイル名 -Stream ストリーム名 | 指定された既存のストリームの値とサイズを得る |
| Remove-Item -Path ファイル名 -Stream ストリーム名 | 指定された既存のストリームそのものを削除 |

似たようなコマンドレットがありますが、それぞれ微妙に違いがあります。

- `Add-Content`は値を追記するが、`Set-Content`は値を上書きしてしまう

- `*-Content`系コマンドレットはストリーム名の指定にワイルドカードが使えないが、`*-Item`系はストリーム名の指定にワイルドカードが使える

- `Clear-Content`はストリーム名を残したまま値を削除するが、`Remove-Item`はストリームそのものを削除する

## 自分自身が起動された日付を覚えよう
毎日決められた時刻までに残業申請をしなくてはいけません。(´Д` )

なので朝イチPC起動時にスタートアップから立ち上がるPowerShellコンソールの`$profile`に、その日最初の１回だけ残業申請ファイルを立ち上げるスクリプトを書くのです。

``` OneTimeExecute.ps1
if ($PSVersionTable.PSVersion.Major -ne 5) {
  "このPowerShellでは動作しません。"
} else {
  $today = Get-Date
  $myname = $MyInvocation.MyCommand.Path
  $Keyword = Get-Item -Path $myname -Stream * | Where-Object {$_.Stream -match 'LastBoot'}
  if ((Get-Content -Path $myname -Stream $Keyword.Stream) -ne $today.Date.toString()) {
    "本日最初の起動です。"
  }
  Set-Content -Path $myname -Value $today.Date.toString() -Stream 'LastBoot'
}
```

6行目でスクリプトファイル自身に付与されているであろう代替データストリームの内容を抽出し、7行目でこれを照合しています。処理が終わったら10行目で今日の日付を代替データストリームに書き込んで終了します。

実際には8行目のメッセージのところを残業申請ファイルの立ち上げプロセスに書き換えて使用します。

## 必ず存在する:$DATA
`Get-Item`でストリーム名を\*にして検索すると、必ず表示されるストリーム名があります。ファイルサイズを表す`:$DATA`ストリームです。

代替データストリームを扱うコマンドレットはいずれも存在しないストリーム名を指定するとエラーを吐きます。なので、このスクリプトの初回起動時にLastBootというデータストリームが存在しない場合を想定して、3行目ではあえてすべてのデータストリームの中からLastBootを抽出するというまどろっこしいことをしました。

これができるのも、`:$DATA`という必ず存在する代替データストリームのおかげです。

## 追記：Windows7では動かなかった
代替データストリーム自体はNTFSの機能なのでWindows7にもあるはずですが、`Get-Item`や`Get-Content`、`Set-Content`が`Stream`パラメータを扱えませんでした。

Windows7のPowerShellはVersion2です。当初このスクリプトを動かして確認したWindows10のPowerShellはVersion5。

3や4で動くのかどうかわかりませんが、とりあえず動作確認の取れているVersion5のみ動作するように書き換えました。

1行目で[自動変数の値](http://qiita.com/Takeru/items/eb075762b7255b5f2756)をみてPowerShellのVersion5かどうかをチェックしています。
PowerShellで、色々な方法でテキスト出力して、結果を比較してみた

PowerShellで、色々な方法でテキスト出力して、結果を比較してみました。
出力方法によって、文字コード（BOMの有無）や改行コードなどの仕様が微妙に異なるようです。

## 試してみた

```cmd:writetest.bat
@ECHO OFF
SET PARENT=%~dp0
SET SCRIPT=%PARENT%writetest.ps1
SET ARGS=

TYPE %SCRIPT% | powershell -command "Invoke-Expression('&{' + $input + '} %ARGS%')"
```

```ps1:writetest.ps1
> $text = "１行目`n２行目`n";
> 
> $text >  1_Redirect.txt;
> $text | Out-File '2_Out-File.txt';
> [IO.File]::WriteAllLines('3_WriteAllLines.txt',$text);
> [IO.File]::WriteAllText('4_WriteAllText.txt',$text);
```

↑先頭が[だとQiitaでうまく表示されないみたいなので、先頭に>をつけて回避（実行時は不要）

```cmd:使用例（コマンドプロンプト）
writetest.bat
```

## 結果
以下、画面ショット（テキストでは分かりにくいので）

1_Redirect.txt
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49502/5a465c78-5517-dff1-026e-7b2e55e883e2.png)
文字コード：UTF-8（BOM付）
末尾の改行コード(CRLF)：あり

2_Out-File.txt
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49502/e9edd681-7840-bfaa-a52a-549e27b8d1f0.png)
文字コード：UTF-8（BOM付）
末尾の改行コード(CRLF)：あり


3_WriteAllLines.txt
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49502/5526aba1-9b81-9d45-63e6-cb29b704a9f9.png)
文字コード：UTF-8（BOMなし）
末尾の改行コード(CRLF)：あり

4_WriteAllText.txt
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49502/284aa05f-8254-1b73-020f-a52bb59d716b.png)
文字コード：UTF-8（BOMなし）
末尾の改行コード(CRLF)：なし


## まとめ
Linux用のShellファイルを生成するならば、末尾に改行コード(CRLF)が出力されないWriteAllTextでテキスト出力するべきだ、ということが分かりました。

筆者ははじめ、WriteAllLinesでShellファイルを生成しようとしていましたが、末尾に改行コード(CRLF)が出力されて、しばらく原因が分からずハマりました。（後で気づいたのですが、[「C#ポケットリファレンス」（書籍）](http://www.amazon.co.jp/C-%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9-WINGS%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88/dp/4774149489)に、WriteAllLinesでは改行コードが付くことが明記されていました。きちんと読まないとだめですね・・・）
[只のメモ] Cygwin(babun)で、Minttyではなくコマンドラインを使ったほうがよさ気な場合

Windows七不思議をメモ(違)。

[この設定](http://qiita.com/kmry2045/items/b160c94b8cd8972261ce)にもとづき、Windows上のCygwin([babun](http://babun.github.io/))で@、Javaとnodeをけっこう快適に触っている。
ターミナルエミュレータは[Mintty](https://code.google.com/p/mintty/)。
日常使いのAtomエディタの設定をしていて気になったことについて記す*(なにかあったときには随時追記)*。

設定をいろいろしたので、apm(Atom Package Manager) で設定の一覧を見ておこうと思ったところ:

```sh:onMintty
$ which apm                                                                                                                                           /cygdrive/c/Users/kmr_r/AppData/Local/atom/bin/apm
$ apm list                                                                                                                                            (略)
.../app-1.1.0/resources/cli/apm.sh: line 2: $'\r': command not found
/../app/apm/bin/node.exe: No such file or directorypp-1.1.0/resources/cli/apm.sh: line 4: /cygdrive/c/Users/kmr_r/AppData/Local/atom/bin/../app-1.1.0/resources/cli
```
Windows経由でインストールしたAtomに入っているapmにはアクセス出来ないらしい(nodeのnpmとかは普通に使えている)。

とはいえ、全く困るわけではなくて、コマンドラインを立ち上げると、


```sh:コマンドライン
> which apm                                                                                                                                           
/cygdrive/c/Users/kmr_r/AppData/Local/atom/bin/apm
>apm list -bi
blue-gray-syntax@0.2.2
carbon-blue-atom@1.1.1
japanese-menu@1.5.0
japanese-wrap@0.2.7
language-groovy@0.4.0
language-kotlin@0.4.0
language-livescript-edge@1.0.2
language-scala@1.1.4
minimap@4.16.0
>which bash
/usr/bin/bash

```
普通にlistが出てくる。で、whichコマンドが効くということもあり、普通にbashも使える。もちろん円マーク(C:\Users\kmr_r etc.)を使う世界の話なのだが。

要するに、atom+babun(cygwin)でnode開発とか行う場合に、基本困らないよという話なのだが、windowsの世界とcygwinの世界の境界よくわからないなぁ...
chromeの新規タブに時間表示するあれ！

Momentum

<img width="775" alt="スクリーンショット 2015-11-08 10.13.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/53443/459f93f4-0808-edc8-d447-06ba8d9983e6.png">

https://chrome.google.com/webstore/detail/momentum/laookkfknpbbblfpciffpaejjkokdgca?hl=en
辞書をを保存して、読み込む


参考にしたサイト：http://swift-salaryman.com/nsuserdefaults.php

````swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        //データの設定
        saveData("hege", kana:"tage", title:"tegetege", filename: "ahsuet")
        //読み込み
        let arr: AnyObject! = NSUserDefaults.standardUserDefaults().dictionaryForKey("hogeDic");
        print(arr);
        /* {
        title = "swift-salaryman";
        url = "http://swift-salaryman.com/";
        */
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func saveData(name:String, kana:String, title:String, filename:String) -> Dictionary<String, AnyObject>{
        //保存
        let info:[String] = [kana, title, filename]
        let hogeDic: Dictionary = [name:info]
        NSUserDefaults.standardUserDefaults().setObject(hogeDic, forKey:"hogeDic");
        NSUserDefaults.standardUserDefaults().synchronize();
        
        return hogeDic
    }
}
````
SoXで周波数解析（スペクトログラム）

[scipyで周波数解析(FFT)の時間変化可視化（スペクトログラム）](http://qiita.com/ina111/items/b106796fc17533680cbd)
という記事を書きましたが、pythonを使わない人にも同じ作業をしてもらいたいということで、コマンドラインのソフトウェアを使ったスペクトログラムの作成方法。
scipyの方は任意のデータ列を周波数解析が出来ますが、こちらは音声ファイル(ここではwavファイル)のスペクトログラム作成の方法です。

SoX(Sound eXchange)というコマンドラインのソフトウェアを使います。
[SoX公式](http://sox.sourceforge.net/)
[SoXマニュアル（英語）](http://sox.sourceforge.net/sox.html)
[SoXマニュアル日本語訳](http://www.hcn.zaq.ne.jp/___/unix/sox-ja.html)


クロスプラットフォームで、Windows、Mac、Linuxで使えます。
私はMacを使っているので、homebrewでインストールしました。

```
brew install sox
```

コマンドとして、soxになります。
例えば、手元にたまたまあるロケットエンジンの音を録音したものを解析してみます。
ターミナルで、音声ファイル(ここではwavファイル）と同じディレクトリに入り、下記コマンドを打ち込みます。

```
sox TASCAM_0013.wav -n trim 124 7 rate 30k spectrogram -z 60
```

* TASCAM_0013.wav というwavファイルを読み込み
* trim 124 7 で、124秒目から7秒間を表示
* rate 30k でサンプリング周波数を30kHz、つまりナイキスト周波数としては15kHzで表示される
* spectrogram でスペクトログラムをspectrogram.pngで出力
* -z 60 でカラーバーの下限のdBを-60dBにして、全体の明るさを調整
* 上のグラフがステレオの左マイク、下グラフが右マイク

![spectrogram.png](https://qiita-image-store.s3.amazonaws.com/0/40132/87265f6f-1b5b-2f06-2f04-a14b37f0e9ba.png)


この音声ファイルでは1秒から6秒までの間でエンジンを燃焼させています。左マイクは低音用のマイクを使っているので、kHzの高周波はアテにならず、右マイクは普通の音楽用のマイクで録音しているので、比較的高音まで信用できます。スペクトログラムを見ると1kHz程度のところに比較的強い周波数が立っているのがわかります。


python(scipy)でスペクトログラム表示した方がアカデミックな用途では使いやすいですが、取り敢えずの表示であれば、SoXでも十分かつキレイなスペクトログラムが得られます。
C > strtol() > 変換失敗の判断 > res = strtol(src, &endptr, 0);  if (src == endptr) {


strtol()を使う時、数値かどうかの判断をどうするのか。

http://www.c-tipsref.com/reference/stdlib/strtol.html

```c
long strtol(
    const char * restrict nptr,
    char ** restrict endptr
    int base
);
```
> nptr が指す文字列中に変換不可能な文字があった場合には，その文字列へのポインタを endptr に格納します．

endptrをチェックすればいいのだろうか。


## try1

http://ideone.com/HMHj4a

```c
#include <stdio.h>

void funcStrtol(char *src)
{
	int res;
	char *endptr;
    res = strtol(src, &endptr, 0);
    if (strcmp(src, endptr) != 0) {
	    printf("%d %s\n", res, endptr);
    } else {
    	printf("Error %s\n", src);
    }
}

int main(void) {
    int res;
    char *endptr;
    const char *strA = "A";
    const char *str0 = "0";
    const char *str1 = "1";

	funcStrtol(strA);
	funcStrtol(str0);
	funcStrtol(str1);

	return 0;
}
```

```txt:結果
Error A
0 
1 
```

http://www.c-tipsref.com/reference/stdlib/strtol.html
> 戻り値
> 変換が不可能な場合: 0

変換が不可能な場合に0の戻り値となるが、"0"を変換したときとかぶる、というのが始まりの疑問だった。


## try2
http://ideone.com/sIGjJ2

src と endptrのチェックでもよさそう。

```c
void funcStrtol(char *src)
{
	int res;
	char *endptr;
    res = strtol(src, &endptr, 0);
//    if (strcmp(src, endptr) != 0) {
    if (src != endptr) {
	    printf("%d %s\n", res, endptr);
    } else {
    	printf("Error %s\n", src);
    }
}
```
ShapeファイルをGeoJSONに変換する。

MashupAwards11向けに[神戸アルクマップ](http://hacklog.jp/works/4320)というWebサービスを作る際、[国土数値情報](http://nlftp.mlit.go.jp/ksj/)等の大量のShapeファイルをElasticsearchに入れる必要があった。
このため、ShapeファイルをGeoJSONに変換するプログラムを書いたので、メモしておく。
ファイル変換には[GeoTools](http://geotools.org/)を使用しています。

せっかくなので、HerokuにShp2JSONというWebサービスを構築してみました。
・[Shp2JSON](https://radiant-wave-6403.herokuapp.com/)

```java:Shape2GeoJSON.java
package modules;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.Charset;

import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.geojson.feature.FeatureJSON;

public class Shape2GeoJSON {
	
	public static String getJSON(File f,String encoding)throws Exception{
		f.setReadOnly();
		ShapefileDataStore store = new ShapefileDataStore(f.toURI().toURL());
		Charset cs=Charset.forName(encoding);
		store.setCharset(cs);
		SimpleFeatureSource source = store.getFeatureSource();
		SimpleFeatureCollection featureCollection = source.getFeatures();
		String geoJson=null;
		FeatureJSON fj = new FeatureJSON();
		StringWriter writer = new StringWriter();
		fj.writeFeatureCollection(featureCollection, writer);
		geoJson = writer.toString();
		return geoJson;
	}
	
	public static File getGeoJSON(String json,String path,String encoding) throws Exception{
		File out=new File(path);
		PrintWriter pw=null;
		try{
			FileOutputStream fos = new FileOutputStream(out);
			OutputStreamWriter osw = new OutputStreamWriter(fos,encoding);
			pw = new PrintWriter(osw);
			pw.write(json);
			pw.close();
			pw=null;
			return out;
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			if(pw!=null){
				pw.close();
			}
		}
		return null;
	}

}
C > 数値を入力 > fgets() / sscanf()

Cのコードでscanf()を使って数値のみを入力する、という方法の整理。

参考 http://f4.aaacafe.ne.jp/~pointc/log460.html

参考 http://www9.plala.or.jp/sgwr-t/lib/sscanf.html
> 戻り値
0にもなり得ます。例えばstrに"A"を、書式指定に"%d"を指定した場合などは入力が行われず0が返却されます。

戻り値が 0より大きい時に数値と判断してみる。

http://ideone.com/3dx63s

```c
#include <stdio.h>

int inputNumericValue() {
	int val;
	char buf[512];
	
	printf("[数値を入力してください]\n");
	fgets(buf, sizeof(buf), stdin);
	if (sscanf(buf, "%d", &val) > 0) {
		printf(">> %d\n", val);
	} else {
		printf(">> ERROR:数値ではありません。\n");
	}
}

int main(void) {
	inputNumericValue();
	inputNumericValue();
	inputNumericValue();
	return 0;
}
```

```txt:stdin
A
3
1
4
```

```txt:結果
[数値を入力してください]
>> ERROR:数値ではありません。
[数値を入力してください]
>> 3
[数値を入力してください]
>> 1
```
C > scanf() > scanf関数は読み取ろうとした文字が変換指定とマッチしない場合、その 文字を読み取られずにストリームに残します。

Cでscanf()で数値の読み取りをするコード関連で ideone で試していたが、振る舞いがよくわからなかった。

http://ideone.com/PJ1dU2

```c
#include <stdio.h>

int main(void) {
    int val;
    
    scanf("%d", &val);
    printf("val=%d\n", val);

    scanf("%d", &val);
    printf("val=%d\n", val);

    scanf("%d", &val);
    printf("val=%d\n", val);
    
	return 0;
}
```

```txt:stdin
A
3
1
4
```

```txt:結果
val=-1218232755
val=-1218232755
val=-1218232755
```

`3`という数値が読み取られないのは何故かわからなかった。

http://f4.aaacafe.ne.jp/~pointc/log460.html
> scanf関数は読み取ろうとした文字が変換指定とマッチしない場合、その
文字を読み取られずにストリームに残します。

そういうものなのですね。
ideoneのバグでもなかった。
find_eachとeachの違い

## 違い

[Active Record クエリインターフェイス | Rails ガイド](http://railsguides.jp/active_record_querying.html)

DB操作で行いたいことのよくあることの1つ。

`each`は`SQL`的に`LIMIT`をつけずに全件メモリに確保。
`find_each`は`SQL`的に`LIMIT`をつけてデフォルトでは1000件ずつメモリに確保。

結局、Railsの`limit`と`offset`を自前で使えば、`find_each`と似たようなことはできるのではないだろうか。

## とはいえ
ただ表示するためのデータならば、
`find_each`という選択よりも`SQL的SELECT`で取り出すデータ絞るって選択もありそう...
雑感 | Qiita > Qiitaとは何か > データベース | 新聞 | 窓口 | 落書き用紙

**<font color=red>2017年5月8日以前の感想です</font>**

Qiitaを今年(2015年)になってからよく使うようになった。

何故よく使うようになったかを考えるために自分が使っている用途を整理。

### 「データベース」である
「これこれはどうだった」と思い出そうとするとき、自分の投稿や人の投稿から引き出せる。
詳細はQiitaに覚えておいてもらって、キーワードだけ覚えておいて逐次引き出すのが理想的な使い方。

### 「新聞」である
新しいツールや仕組みなどの情報が逐次投稿される。
ツールについては「こういうツールがあった」として後日使うこともある。
仕組み(考え方)については日々設計や実装を改善する考えの糧になっていると思われる。

### 「窓口」である
教えられる人と教える人をつなぐ窓口という意味。
色々な分野で自分よりずっと詳しい人はいる。そういう人から「これこれこうしたらいいよ」と教えていただくことが多い。
今まで苦労していたものが、より良い方法を知ることでやりやすくなり、非常に助かっている。

### 「落書き用紙」である
自分が投稿する記事を用意していく中で考えが整理され、良い方法が見つかることがある。
手書きはできないが、文字や画像を整理して貼ることで考えが整理できる。
( 落書き用紙と書いたが、もっと適した言葉が他にあるかもしれない。)

### 「部室」である
中世の「サロン」である、と言ってもいい。
色々な種類の人が集まり、普通の生活では出くわしにくい情報にも出会うことができる。
RxSwiftによる実行スレッドの切り替え

> この記事の前提環境は Xcode 7 / RxSwift 2.0.0-beta です

RxSwiftにおける実行スレッドの切り替えはシンプルです。実行スレッドの切り替えには `observeOn` と `subscribeOn` を使います。言葉で説明するより実際に使い方を見てしまうのがわかりやすい思うので、早速コードを見てしまうことにしましょう。

```swift
let disposeBag = DisposeBag()
let scheduler = SerialDispatchQueueScheduler(globalConcurrentQueuePriority: .Default)
[1,2,3].asObservable()
    .doOn(onNext: { _ in NSLog("doOn") })
    .observeOn(scheduler)
    .subscribeNext({ _ in NSLog("subscribeNext") })
    .addDisposableTo(disposeBag)
NSLog("main")

// => ログ出力
// 2015-11-08 07:56:00.821 xctest[11841:2748936] doOn
// 2015-11-08 07:56:00.821 xctest[11841:2748936] doOn
// 2015-11-08 07:56:00.821 xctest[11841:2748993] subscribeNext
// 2015-11-08 07:56:00.821 xctest[11841:2748936] doOn
// 2015-11-08 07:56:00.822 xctest[11841:2748993] subscribeNext
// 2015-11-08 07:56:00.822 xctest[11841:2748936] main
// 2015-11-08 07:56:00.822 xctest[11841:2748993] subscribeNext
```

`observeOn` より手前の `doOn` はメインスレッド(2748936)で実行され、`subscribeNext` はバックグラウンドのスレッド(2748993)で直列に実行されていることがわかります。

ここで、スケジューラを `OperationQueueScheduler` に差し替えてみましょう。

```swift
let disposeBag = DisposeBag()
let scheduler = OperationQueueScheduler(operationQueue: NSOperationQueue())
[1,2,3].asObservable()
    .doOn(onNext: { _ in NSLog("doOn") })
    .observeOn(scheduler)
    .subscribeNext({ _ in NSLog("subscribeNext") })
    .addDisposableTo(disposeBag)
NSLog("main")

// => ログ出力
// 2015-11-08 08:02:46.161 xctest[12542:2757188] doOn
// 2015-11-08 08:02:46.161 xctest[12542:2757188] doOn
// 2015-11-08 08:02:46.161 xctest[12542:2757188] doOn
// 2015-11-08 08:02:46.162 xctest[12542:2757188] main
// 2015-11-08 08:02:46.161 xctest[12542:2757256] subscribeNext
// 2015-11-08 08:02:46.163 xctest[12542:2757248] subscribeNext
// 2015-11-08 08:02:46.163 xctest[12542:2757256] subscribeNext
```

すると、`subscribeNext` の実行スレッドがバラバラ(2757256, 2757248)になって並列に実行されていることがわかると思います。

このように `observeOn` はそのあとの処理を、引数で指定されたスケジューラを利用するように指定するときに用いることができます。`subscribeOn` は逆にその前の処理を、引数で指定されたスケジューラを利用するように指定したいときに用いることができます。

しばしば iOS アプリでは通信処理を走らせて、その結果をいい感じに加工してビューに反映させるという処理をすることがあると思います。ビューに反映させるときはメインスレッドから行わなければならないので、`observeOn` でメインスレッドに割り当てるスケジューラを指定してあげる必要があります。雑な例ではありますが、以下のような形になるでしょう。

```swift
let url = NSURL(string: "http://gochiusa.com")!
let request = NSURLRequest(URL: url)
NSURLSession.sharedSession().rx_response(request)
    .subscribeOn(backgroundWorkScheduler)
    .observeOn(MainScheduler.sharedInstance)
    .subscribeNext({ (data, response) -> Void in
        webView.loadData(data, MIMEType: "text/html", textEncodingName: "utf-8", baseURL: url)
    })
    .addDisposableTo(disposeBag)
```

まとめると以下の３点のような内容となります。

* スレッドの指定には `observeOn` と `subscribeOn` を用いる
* `subscribeOn` はそれ以前の処理を実行するスケジューラを指定できる
* `observeOn` はそれ以後の処理を実行するスケジューラを指定できる

各々のスケジューラについてはRxSwiftの実装コードコメントに記載してありますので、そちらを参照するのが良いでしょう。スケジューラの実装コードは [https://github.com/ReactiveX/RxSwift/tree/master/RxSwift/Schedulers](https://github.com/ReactiveX/RxSwift/tree/master/RxSwift/Schedulers) のあたりにありますので是非目を通しておきましょう。
nodebrewインストール時につまづいたこと


homebrewでnode.jsを管理しようと思って
nodebrewをインストールしようとしたらハマったのでメモ。


## 環境
- OSX Yosemite 10.10.5

確認

```
$ brew -v
Homebrew 0.9.5 (git revision dbd78; last commit 2015-11-07)
```

インストール

```
$ nodebrew install-binary stable
```

ここで失敗。
nodebrew自体のコマンドは動いているが、fetch後に謎のエラー。
エラーログとっとくの忘れた...

## 解決方法

ここを参照。
[https://github.com/hokaccha/nodebrew#install](https://github.com/hokaccha/nodebrew#install)


```
curl -L http://git.io/nodebrew  | perl - setup
```

これが重要。

どうしてこうなったか。

```
$ brew info nodebrew

nodebrew: stable 0.8.1, HEAD
Node.js version manager
https://github.com/hokaccha/nodebrew
/usr/local/Cellar/nodebrew/0.8.1 (7 files, 48K) *
  Built from source
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/nodebrew.rb
==> Caveats
Add path:
  export PATH=$HOME/.nodebrew/current/bin:$PATH
```

ん？

```
nodebrew: stable 0.8.1 HEAD
```
homebrewで入れようとすると、
nodebrewが0.8.1になっている。

なるほど、
curlで入れるとnodebrew 0.9.2がインストールされたのでエラー解消。
バージョン指定等々でのnodeをインストールできる。

インストール完了したら

```
$ nodebrew use stable
$ node -v
$ npm -v
```

使用するバージョンの指定と、バージョンが確認できたら終了です。
技術英語 > we can [prevent that from happening] / preventive measure

@ LOE > May 18, 2012

http://loe.org/shows/shows.html?programID=12-P13-00020
>we can prevent that from happening 

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=preventive+measure
> ...予防対策

measureの使い方が面白かったので覚えた。

<hr>
http://ejje.weblio.jp/content/measure

> B 【可算名詞】
1
a手段，処置，方法.