OmniAICreator/Qiita-1.07M huggingface dataset:
Lumenで省かれたartisan route:listコマンドを追加する方法 改造編

> 2015-08-30現在、この投稿の内容は[appzcoder/lumen-route-list](https://github.com/appzcoder/lumen-route-list)にマージされています。
> コマンド拡張をされたい方は、composer update等でパッケージを新しいバージョンにアップデートしてください。

[前回](http://qiita.com/aozora0000/items/9484f9e08eb1219a7695)のつづき

# 今回の目的
こんな感じにする！

![lumen_route_list_jpg.jpg](https://qiita-image-store.s3.amazonaws.com/0/25388/f57ff764-347c-da3f-e1a2-8bb96c8be764.jpeg)


前回Lumenのartisanコマンドに```route:list```コマンドを追加しましたが、本家Laravelに比べて若干表示が寂しい感じです。

表示される情報としては

- リクエストメソッド
- リクエストURI
- 動作するアクション名

と、かなりシンプルなものでした。

ルートのみの確認用としては充分ですが、もう少し大きな規模のアプリケーションを作るには

- NamedRoute（ルートの省略名？）
- コントローラー名
- routeMiddleWare

この辺りがあると、実際にファイルを覗かなくても構成周りが認識出来るんじゃないかと思いました。
なので今回はこのコマンドリストをもう少し充実させてみようと思います。

# 実装
改造に辺り扱うファイルはひとつだけです。
artisanコマンドを実行するとfireメソッドが実行される形になっています。
元のコードからちょっと変わっていますが、staticメソッドについては見やすく整理しただけです。

***要点***としては
- ```$routeCollection```からルート一覧を拾ってきて整形
- ```$headers```に任意のヘッダー(```$rows```に入れる連想配列のキー数と合わせる)
の二点になります。

`getRoutes`メソッドで普通に連想配列として取得しているので、加工も簡単です。
もう少し工夫するともっと便利なコマンドになるかもしれませんね。

下に改造後のfireメソッド(長い)を添付しているので、参考にしてみてください。
よいLumenライフを！


# 実際のコード

```app/Console/Commands/AppzcoderRouteCommand.php
    // 26行目付近
    public function fire()
    {
        global $app;
        $routeCollection = $app->getRoutes();

        $rows = array();
        foreach ($routeCollection as $route) {
            $rows[] = [
                'verb' => self::getMethod($route['method']),
                'Path' => self::getPath($route['uri']),
                'namedRoute' => self::getAs($route['action']),
                'Controller' => self::getController($route['action']),
                'Action' => self::getAction($route['action']),
                'Middleware' => self::getMiddleware($route['action']),
            ];
        }

        $headers = array( 'Verb', 'Path', 'namedRoute', 'Controller', 'Action', 'Middleware');
        $this->table($headers, $rows);
    }

    public static function getMethod($method)
    {
        return $method;
    }

    public static function getPath($uri)
    {
        return $uri;
    }

    public static function getAs(array $action)
    {
        return (!isset($action['as'])) ? "" : $action['as'];
    }

    public static function getController(array $action)
    {
        if(empty($action['uses'])) {
            return 'None';
        }
        return current(explode("@", $action['uses']));
    }

    public static function getAction(array $action)
    {
        if(empty($action['uses'])) {
            return 'Closure func';
        }
        if(($pos = strpos($action['uses'], "@")) !== FALSE) {
            return substr($action['uses'], $pos + 1);
        }
        return "";
    }

    public static function getMiddleware(array $action)
    {
        return (isset($action['middleware'])) ? (is_array($action['middleware'])) ? join(", ", $action['middleware']) :  $action['middleware'] : '';
    }
```
大量にファイルを移動/削除しようとして、Argument list too longで怒られた場合の備忘録

こんな感じだと怒られます。

```bash
mv [条件] [移動先]
bash: /bin/rm: Argument list too long
```

find と xargs を組み合わせると大丈夫。

```bash
find [ディレクトリ] -name [条件] -print0 | xargs -0 -I{} mv {} [移動先]
```
sassの構成


オレオレcssボイラープレートが良い感じかなーと思えてきたからまとめておく。

[muyuu/base](https://github.com/muyuu/base/tree/master/src/css)
実際に書いてる内容は大体ここに置いてるやつと同じ

## ルール
- normalize.cssではなくreset.cssを使う
- モジュールベース
- BEMベース
- ユーティリティクラスいっぱい使う
- 冗長なのは諦める

normalize.css系は最近使わなくなった。h系タグはどうせマージン削るしリスト系もこっちでやりたい形があるからもうリセットで良いや的なノリ。

良くないとされてきた気がする各種ユーティリティクラスは積極的に使ってる。特にマージン。モジュールとモジュールの余白が全てのページにおいて一定とか幻想だから。あり得んから。だからモジュールの一番外側には絶対マージン使わない。全部ユーティリティクラスで余白作る。


## 大まかなディレクトリ構成

```bash
css/
  conf/       # 設定ファイル
  common/     # いつでも使うやつ。 reset.sass とか mixin とか
  mixin/      # サイト用mixin集
  base/       # 各html要素
  util/       # ユーティリティクラス
  layout/     # レイアウト用
  module/     # モジュール用
    column/  
    box/
    list/
    ...     # モジュールは更に種類のディレクトリに分ける
  override/   # 外部ライブラリ上書き用
  style.sass
  
```

## 設定ファイルで設定する事
- 1グリッドのサイズを決めてグリッドカラムのベースにする
- レスポンシブか否かのフラグ
- ブレイクポイントの数値
- 使用するカラーを変数化

## mixin
- メディアクエリ用のmixinはよく使う
  - 設定ファイルに記述した数値を元に作成
- 要素が複数個ある場合に一番上の要素だけマージン削るやつをmixin化

## ユーティリティクラス
- マージン、テキスト、アラインとかの調整系はクラス化
- ユーティリティは「u-」接頭辞を付与
- 細かい調整はhtml側でコントロールできるようにしたい

## レイアウトのルール
- サイト共通で使われる感じのレイアウトのスタイルをパーツ毎のファイルに分割
- パンくず、ページトップへ、ヘッダ、フッタ、コンテンツ部分、とか
- レイアウトは「l-」接頭辞を付与


## モジュールのルール
- element、modifier のBEMベースな命名規則
- モジュールのルートで 色・背景色・フォントサイズを指定しておく
- モジュールのルートにはマージンを設定しない
- modifier はモジュールのルートにだけ記述
- モジュールの中にステート系（ホバー、メディアクエリ）も含める
画像の運用ルール


サイトを作る上で画像の運用は結構悩ましい。というかサイトの運用が悩ましい。もっと気楽に画像を運用していきたい

## あるある


```
htdocs/
	product/
		img/
			unique.png # dir 配下でしか使わない想定の画像
		index.html
```

### しばらく経ったある日

```
htdocs/
	product/
		img/
			unique.png # dir 配下でしか使わない想定の画像
		index.html
	qa/
		index.html # このページで product/img/unique.png を参照
```

最初は特定のディレクトリ配下でしか使われない想定だったけど、色々事情もあって今ある画像を使って最短で qa ページを作ることになった場合とかにこうやりたくなってやむを得ずやったりすることあるよね。

でもまぁこういった状況は解決策はあって、他ディレクトリ配下のimgを使う場合は

- qa/img/ に使用する画像をコピーする
- common/img/ 等（共通で使用するディレクトリ）に移す

こういう対応がない訳じゃない。

ないわけじゃないんだけど、マジでかと。毎回毎回画像をコピーしたり移動したりする気かと。コピーしたら一括変更できない、共通に移す場合は同じ名前のファイルがないとも限らないわけで、そこまでケアできんわ。

そもそも「共有で使用するリソース」という意味でよく「/common/img/」みたいなディレクトリが使われることが多いけど画像・css・jsとかのリソースは html から呼び出されるものなので、それらリソースを「こいつは共通、こいつは1箇所だけで使われる」と分けること自体が辛くなる要因なんじゃないかなと思う。お前はいつからここでしか使われないと勘違いしてた？


## 根本的に解決したい
cssは設計を頑張ることで「この場所にはこういったスタイルを充てる」という htmlから考えるアプローチから離れて「こう定義されたスタイル（モジュール）をここで使う」という風に作る事が出来るようになってきたので、ある程度コントロールが効くようにはなってきた。

この手法を画像でも活かして

- 画像は1つのフォルダ配下に全て置く (/img/ とか)
- 基本画像は消さない

こんな感じのルールで運用していけばhtml側では好きな画像を呼び出せば良い、何も考えなくて良い。まぁ画像フォルダにはすげーいっぱい画像ファイルが貯まっていくことにはなるんだけども。

## もう少し使いやすく
このルールだと、 /img/ 配下に凄い数の画像が配置されることになるので、少しは管理しやすくしたいので、画像の種類毎にディレクトリを作ってみる

```
img/
	btn/
	img/
	txt/
	caption/
	thumb/
	pic/
```

あとは、画像の修正する際は影響度等を考えた上で画像を差し替えるか modifier 画像を作成する、というルールにすれば良い。

```
img/
	btn/
		btn_submit01.png      # 通常ボタン画像
		btn_submit01-long.png # 大きいボタン画像
	img/
```

## まとめ
こういうルールで良い感じに運用できる

- 画像は1つのフォルダ配下に全て置く (/img/ とか)
- 種類毎にサブディレクトリを作成
- 基本画像は消さない
- modifier で画像毎の関連性を明示

という妄想。次にゼロから作る際にはこのやり方でやってみる
どうやってユニットテストはコード品質を上げるのか?

もう1つのタイトル: なんで（私のコードの）テストケースは書きにくいのか

訳文:
> ユニットテストはコード品質を上げる理由

> 1つの「ユニット」をテストするには、そのユニットをシステム全体から離脱させて、テスト専用の構造の中で実行しなければならない。ユニットテストとは: テスト対象オブジェクトを生成して、テスト対象に依存される他のオブジェクトを提供して、やりとりをして、動きを検証する。1つのクラスを簡単にテストするために、以下の条件を満たさないといけない:

> - 明確で、簡単に入れ替えできる依存物
> - 単純で、簡単に実行 & 検証できる役割

> SE用語で言うと、この2つの条件は即ち「低い結合度と高い凝集度」である。つまり、きれいなデザイン。

> Steve Freeman and Nat Pryce, Growing Object Oriented Software Guided by Tests 

ソース:

> Thorough unit testing helps us improve the internal quality because, to be tested, a unit has to be structured to run outside the system in a test fixture. A unit test for an object needs to create the object, provide its dependencies, interact with it, and check that it behaved as expected. So, for a class to be easy to unit-test, the class must have explicit dependencies that can easily be substituted and clear responsibilities that can easily be invoked and verified. In software engineering terms, that means that the code must be loosely coupled and highly cohesive —in other words, well-designed.
> Steve Freeman and Nat Pryce, Growing Object Oriented Software Guided by Tests
NSUbiquitousKeyValueStore でiCloud同期ができない場合の対処

# はじめに

ドハマリしたので備忘録的に残しておきます。

NSUbiquitousKeyValueStore は、iOSが提供してくれるクラウド上のKVSストレージです。
詳しい説明はこちら。

https://developer.apple.com/jp/documentation/iCloudDesignGuide.pdf


# NSUbiquitousKeyValueStore を利用するための通常の流れ

1. Apple DeveloperサイトでApp IDを確認する（はじめてなら作成）
2. 対象のApp IDののiCloud利用を有効にする
3. プロビジョニングプロファイルを作成する（すでに作っていたら再作成）
4. Xcodeプロジェクトでtargetを指定し、Capabilitiesの設定でiCoudを有効にする
5. 作成されたentitlementsファイルのiCloud Key-Value Storeの値を \$(TeamIdentifierPrefix)\$(CFBundleIdentifier) に設定する
6. アプリをインストールしたデバイスのiCloud Drive設定をオンにする

基本的には、これで利用できるようになります。


# 発生した問題

```
NSUbiquitousKeyValueStore* ukvs = [NSUbiquitousKeyValueStore defaultStore];
[ukvs setString: @"value" forKey: @"key"];

NSString* str = [ukvs stringForKey: @"key"];
```

という実装で、値が取れるデバイスと取れないデバイスがいた。

# 原因

同じApp ID (Bundle Identifier) のアプリをiCloud設定をする前にすでにインストールしている場合、後からiCloud設定を有効にしたアプリをインストールしても、そのデバイスからはiCloudが使えなくなるというもの（iOS設定画面のiCloud設定でオンになっていたとしても）。
↓のStackoverflowの回答見るまで全然分からなかった。

> I had the same problem. Logging off and back on my iCloud account on the device solved it for me, too.
> 
> This problem seems to appear when you have installed the app with the same bundle identifier on the device before you enabled iCloud entitlements.
> I had this problem on 2 testing devices. A third device on which i installed the app the first time with iCloud enabled, made no problems.
>
> http://stackoverflow.com/questions/26428083/nsubiquitouskeyvaluestore-not-syncing-with-icloud

解決策は、こちらに書いてある通り、iCloudのアカウントを一度サインアウトしてサインインし直せばOK。


# 気になること

本番リリースしてるアプリで、途中からiCloud同期を有効にした場合とかこの現象が発生しそう。
ユーザに強いるわけにもいかないし、他の回避策がありそうだけどどなたかご存じですか？(；´Д｀)
GitHubでforkしたときのこと

## 単なるメモです

ほんと単なるメモですごめんなさい。
forkした後の元との同期のこと

## 作業

### forkする

元プロジェクトのページのどこかにforkのボタンがあるのでそこから。

### cloneする

fork後の自分のプロジェクトのページの右にclone用のリンクがあるのでcloneして、branch作ります。

```shell-session
git clone xxx:xxx
git checkout -b editing
```

### 元に合わせる

元プロジェクトをリモート登録し、持ってきて登録してbranch切り替えます。

```shell-session
cd xxx
git remote add upstream yyy:yyy
git checkout master
git pull upstream master
git push origin master
git checkout editing
```

### pull requestする

＃実はやったことないので、こうらしい、ということで。

変更してコミットしてほしい、ということを知らせるっぽい？

```shell-session
git commit -a -m 'foo bar'
git push origin editing
```

自分のプロジェクトでeditingのブランチを表示して、どこかにあるpull requestのボタンを押して完了、のようです。
また今度やってみようかと。
Arduino用7セグメントLEDライブラリの調査

Arduino用の7セグメントLEDライブラリを調査しました。探したところ、次の4つが見つかりました。

注意：7セグLED用BCDデコーダは使わず、全部のピンをArduinoに接続する前提です。

# [DeanIsMe/SevSeg](https://github.com/DeanIsMe/SevSeg)

「[Arduino Playground - SevenSegmentLibrary](http://playground.arduino.cc/Main/SevenSegmentLibrary)」の筆者によるライブラリ。2014年に書き直されているためか、fork数などは少ない。

* 良い点
    * 初期化メソッドがインターフェースとして綺麗
    * 整数を表示する分には不満が無い
    * コモンにトランジスタを入れる場合にも対応している
* 悪い点
    * 表示関数の処理が1桁ごとに2ms（デフォルト）点灯して消す、という処理になっている
        * タイマー割り込みから使うことがほとんど考慮されていない
    * 任意のパターンを表示できる機能は無い

以下、0から99までカウントアップする例。タイマー割り込みには[FlexiTimer2](https://github.com/wimleers/flexitimer2)を利用。

```cpp
#include <SevSeg.h>
#include <FlexiTimer2.h>

SevSeg sevseg; //Instantiate a seven segment object

void refresh() {
  sevseg.refreshDisplay();
}

void setup() {
  byte numDigits = 2;
  byte digitPins[] = {14, 3}; // 左が上位桁
  byte segmentPins[] = {4, 10, 16, 21, 18, 2, 8, 7}; // A..G, DPの順

  sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
  FlexiTimer2::set(6, refresh); // 6ms period
  FlexiTimer2::start();
}

void loop() {
  volatile int i;
  for (i = 0; i < 100; i++) {
    sevseg.setNumber(i, 0);
    delay(100);
  }
}
```

# [sparkfun/SevSeg](https://github.com/sparkfun/SevSeg)

上の[DeanIsMe/SevSeg](https://github.com/DeanIsMe/SevSeg)の旧バージョンからのfork。任意のLEDを光らせることができるが、数値型を受け取るメソッドは無い。コンストラクタ引数が多すぎるなど、ソースコードも若干いけてない気がする。SparkFunがメンテナンスしているという安心感はある。

* 良い点
    * アポストロフィやコロンがあるLEDにも対応
    * 表示パターンは文字列（`char*`）の形で指定する
        * 既知のパターンのみ表示できる（`"z"`などは表示できない）
* 悪い点
    * 初期化メソッドがインターフェースとしてわかりにくい
        * 18引数
    * 4桁までしか対応していない
        * ベタ書きで4桁分の処理が書いてあり、5桁以上に対応させるのが大変そう
    * 表示関数の処理が1桁ごとに2ms（デフォルト）点灯して消す、という処理になっている
        * タイマー割り込みから使うことがほとんど考慮されていない
    * 数値で表示パターンを指定するメソッドは無い

# [Arduino 7 segment LEDDisplay library download](http://www.thecoderscorner.com/products/38-arduino-downloads/68-arduino-7-segment-leddisplay-library-download)

* 良い点
    * 整数・浮動小数点数を表示するメソッドがある
    * アルファベットなど、既知のパターン表示を指定するメソッド`setValueRaw()`がある
    * 明るさの調節を0,1,2,3の4段階で行えるメソッドを提供している
* 悪い点
    * ピンをシーケンシャルに使う前提で実装されている
        * 例：4桁7セグならn番ピンから(n+11)番ピンまでの12個を使う
        * ピン数の少ないボードでの利用や、結線の都合などを考えると制限として厳しすぎる
    * タイマー1を使った割り込みでLEDの表示を実装している
        * 割り込みを使わず`loop()`で表示する場合に対応していない
        * ライブラリのロードに副作用があるのは実装として汚い
    * `setup()`内で'new'して他の場所ではシングルトンで呼び出す
        * 7セグLEDを2個以上使いたいときに使えない

# Arduino Library for 7 Segment LCD/LED Displays

[supercrab/arduino-seven-segment](https://github.com/supercrab/arduino-seven-segment)

あまり確認できてないですが、ソースコードが長々しくてイマイチ印象良くないですね…。

# まとめ

そんなわけで、見つけた中では[DeanIsMe/SevSeg](https://github.com/DeanIsMe/SevSeg)くらいしか実用レベルのものが無さそうです。僕個人は次のような要求を持っており、改造より自作の方が近そうだと感じています。

* 割り込みからの利用も`loop()`からの利用も考慮したインターフェースが欲しい
* PWM対応ピンの場合は`analogWrite()`でLEDの明るさを制御したい
    * カソードコモンの場合はPWM対応ピンを8本消費する鬼仕様
* AVRマイコンであれば`digitalWrite()`を使わずレジスタを直接操作したい
    * これによりチラツキを抑えられるのではないか？
* 既知のパターンだけでなく、任意のパターンを指定できるメソッドが欲しい
    * 2.5桁など変則的なLEDへの対応を考えると必須だろう
* 遠い未来の野望
    * シフトレジスタ74HC595への対応も考えたい
    * 高機能な7セグドライバはそれぞれ別ライブラリがあるはずなので構想外
    * 7セグ液晶も統一的に扱えたらカッコいいけど厳しそう
controller作成後にrails serverが動かなくなった


controllerを作成後、rails serverコマンドが効かなくなってしまった。  


```
$ rails s
=> Booting WEBrick
=> Rails 4.2.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-07-07 23:36:29] INFO  WEBrick 1.3.1
[2015-07-07 23:36:29] INFO  ruby 2.2.1 (2015-02-26) [x86_64-darwin14]
[2015-07-07 23:36:29] INFO  WEBrick::HTTPServer#start: pid=1127 port=3000


Started GET "/static_pages/home" for ::1 at 2015-07-07 23:36:30 +0200

NoMethodError (undefined method `_view_paths' for nil:NilClass):
```

config/routes.rbは初期設定のままなので間違えようがないはず。 

確認したところ、予約語を使っていたのが原因だった。

```
$ rails g controller StaticPages home class .....
```

[Ruby and Rails Reserved Words](http://www.rubymagic.org/posts/ruby-and-rails-reserved-words)
まぁそりゃclassは使っちゃダメだよね。凡ミスorz
しかし結構たくさんあるから気をつけなければ。
技術英語 > depreciated / deprecated

https://github.com/javirosa/opendatakit/issues/1009
を見ていて「deprecate」？ 「depreciate」？という疑問で調べてみた。

http://english.stackexchange.com/questions/45295/why-is-there-confusion-between-depreciated-and-deprecated

> <font color=red>Deprecated</font> is normally used today for some feature of a computer language which is still supported, but no longer recommended. 

> There's no substantive difference in meaning between deprecated and obsolete. 

> <font color=red>Depreciated</font>, on the other hand, derives from Latin pretium=price. It's used of things which have reduced in value over time.


<hr>

deprecateを使っている例

[いつ、どのように API を非推奨とするか](https://docs.oracle.com/javase/jp/1.5.0/guide/javadoc/deprecation/deprecation.html)

何かのライブラリでDepreciatedがよく使われていたように思うが、忘れた。
部分的行テーブル更新法の注意点

viviエディターの作者がスライドで行テーブルの更新を部分的に行う方法だと早いと言っていたので実装してみた。
http://slides.com/nobuhidetsuda/texteditorimpl#/

##気づいたこと
・LinkedListかGappedVectorじゃないとテーブル操作でO(N)かかるので複数行の編集操作が行われるケースではあまり意味はない
・stepRowをまたいだ削除を行うと落ちる
・複数行の挿入を行うと落ちる
スライドを隅から隅までみたが、こういうケースについては言及していなかった。なので、自分なりに場合分けしてみた

##１文字挿入（削除）した場合
スライドで書かれている通りに行えば問題なし

##行をまたいだ削除が発生した場合
1.行テーブルから削除する範囲を割り出す
2.行テーブルから削除する
3.stepRowを削除した1で計算した範囲のひとつ前に設定する
4.stepIndexを更新する

##複数行の置き換えがある場合
1.対応する行テーブルを作成する
2.1で作成したデータの先頭行以外のインデックスからstepIndex分だけ引く
3.もともとある行テーブルに2で処理した行テーブルを挿入する
4.stepRowを挿入した位置に設定する

##ベンチマーク
「XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。XYZ入ってる。」が10万行あるテキストを「XYZ」から「ABCDE」に置き換えた場合、従来の方法だと4秒近くかかっていたものが0.5秒程度で済むので、効果はあるもよう
ただ、0.5秒で済ませる実装だとDirect2DのDWriteTextLayoutで1行に65535文字あるケースで落ちてしまうので、それを考慮した実装にすると1秒程度にまで落ちてしまう

※core i5 2550、メモリー8GB、RADEON HD5770、Win8.1 x64
RPiやbbbなどのワンボードコンピュータでCSoundを始めてみる話。

#CSoundってそもそもなんなのよ

以下Wikipediaから引用。
>Csoundは音響を扱うデータ記述言語であり、「サウンドコンパイラ」あるいは音楽プログラミング言語とも呼ばれる。名称の由来は、それまでの類似ソフトウェアとは異なり、C言語で書かれていたためである

要するにテキストエディタでがりがり書いて音楽とか作れるソフトってことですね、コンパイルの結果はファイルに直接書き出したり、また書き出さずにリアルタイムで音を出したりすることも出来ます。　…が。

##そもそもこれに目をつけた理由

早い話がワンボードコンピュータで音を扱うにはスペック的に厳しい。少なくともリアルタイムはきつい。
pure dataとか一応動くし-noguiオプション付きでで起動してリアルタイムエフェクタに使うとか結構あちこちで見るけどそうじゃなくて曲を作りたい。
pure dataとかで曲を作るのはかなり工夫しないと厳しい。
SupercolliderはRaspbianにプリインストールされているけどもまともに動かすにはかなりノウハウが必要で、非リアルタイムモードというのを使えばもしかしたら大丈夫かも知れないけれど情報が探し辛い。やっぱりみんなリアルタイムで使いたいんだよね。

で、CSound。
最近はリアルタイムで音を出せるようにもなったけど元々非リアルタイムでファイルに書き出すのがメインのソフト（だと思う）なのでリアルタイムじゃとても処理できないような、他のリアルタイム系では処理速度的に無理があるから省かれてるような機能もばっちりあるし！　これしかないと思う！　きっと。

##インストールする。
RPiもbbbも単純にaptでインストールするだけ。
バージョンは5.17と最新ではないけど特に問題なさげ？

`sudo apt-get install csound`

##マニュアルを確保する。
http://www.csounds.com/manual/
pdfでダウンロードしたほうが便利だと思うけどオンラインで見るのも自由。
気をつけないとフランス語のマニュアルとかダウンロードしてぐったりするハメになるのでしっかり英語のマニュアルをゲットする。
日本語のマニュアルとかは期待しない方がいい。

以下つづく。
【Linux】rpmコマンドで導入したパッケージの詳細なバージョンを確認する

タイトルが長いのはすみません。。
rpmパッケージ入れてみたものの、後になって自分が導入したバージョンってなんだっけ？と、
調べる時に役立つrpmコマンドです。

`rpm -qa -qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n'`

queryformatを利用して詳細なパッケージのバージョン情報を出力するって感じです。

以上です。
次はAWSの投稿するぞー。
よく作業するディレクトリをpecoで選択して移動するコマンド

アクティブに作業するディレクトリのパスを予めテキストファイルに書いておいて、pecoでこれらを選択して移動するコマンドをつくりました。

# テキストファイル
ホームからの相対パスを書くテキストファイルはホームディレクトリの直下に`actives.txt`という名前で置きます。

```actives.txt（例）
sandbox1/
sandbox2/
reports/lec/L01/
www/
```

# コマンド本体
今回コマンド名は`ad`(active directoriesの略)にしました。下記の内容を.zshrcに書いておけば使えるようになります。

```
alias ad='cd $HOME/"$(cat ~/actives.txt | peco)"'
```

# 実行方法
任意の場所で

```
$ ad
```
を実行するだけです。
`actives.txt`の内容が全くそのまま選択肢として表示されますので、何文字か入力して、pecoの力で絞り込み検索ができます。決定したディレクトリに移動します。
コメントのようでコメントでない

PHPには、いくつかコメントアウトの方法があります。ただし、うっかりしているとハマることもあります。

# 3通りのコメントアウト
PHPには、なぜか2つの行コメントと1つのブロックコメントという、3通りのコメントアウトの方法があります。

```html+php:PHP言語内でのコメントアウト
<?php

// C++スタイルの1行コメント
# シェルスクリプト系の1行コメント
/*
  C言語スタイルのブロックコメント
*/
```

そして、コメントの中でPHPを閉じるなんて離れ業もできてしまいます。しかも、コメント形式によって挙動が違います。

```html+php:PHPの閉じ開きが入る場合
<?php

// コメント ?>
ここはそのまま出力
<?php
/*
?>
ここはコメントアウトされて出力されない
<?php
*/
php_code();
```
このようなことが起きるので、（XML宣言や正規表現などで）文字列中に`?>`が入ったものをコメントアウトすると、**そこでPHPから抜けてしまいます。**注意が必要です。

```html+php:思わぬ切り替わり
<?php
//echo '<?xml version="1.0" encoding="UTF-8" ?>'
ここはPHPの外
```

# コメントに見えるけど
PHPでHTMLを出力する場合、HTMLとしてコメントを入れることももちろん可能です。ただし、**HTMLのコメントはPHPにとっては処理すべき文字列の一部でしかありません**。以前[ウンコード・マニアに投げた](http://unkode-mania.net/view/53342e93e41bfe1d69000000)ネタですが、

```html:unkode.php
<!-- 未定義なのでコメントアウト
<?php undefined_function(); ?>
-->
```

のように、PHPレベルで動かないコードをHTMLでコメントアウトすると、このコメントの中でPHPのエラーが発生してしまいます。環境によっては全体がコメントであるかのようにシンタックスハイライトがかかるので、特に注意が必要です（ここでは、わざとHTMLだけの指定にして全体がコメントアウトのように見えるよう工夫しています）。

なお、逆にPHPコードでHTMLコメントを生成することも、必要とあれば可能です。
Apache＋SSL　起動時の秘密鍵パスフレーズ省略方法　※セキュリティは大丈夫か？

``` httpd.conf
SSLPassPhraseDialog: exec:/xxx/xxx/xxx.sh
``` 

``` xxx.sh
\#!/bin/sh
echo "SSL Pass Phrase"
```

***set permission***
```chmod 700 xxx.sh
```
UbuntuでHaskell

勉強のためにUbuntu15.04にHaskellをインストールしました。

```
% sudo apt-get update
% sudo apt-get install -y software-properties-common
% sudo add-apt-repository -y ppa:hvr/ghc
% sudo apt-get update
% sudo apt-get install -y cabal-install-1.22 ghc-7.10.2
```

```bash:.bashrc
export PATH="~/.cabal/bin:/opt/cabal/1.22/bin:/opt/ghc/7.10.2/bin:$PATH"
```

```
% source .bashrc
% cabal update
% cabal install alex happy
```

参考

* [Downloads for Linux](https://www.haskell.org/downloads/linux)
* [ppa:hvr/ghc](https://launchpad.net/~hvr/+archive/ubuntu/ghc)
VRゲーム（ハコスコ対応）にオンラインランキングを入れてみる

今回はハコスコアプリを作ってみたい。
顔の傾きを変えながら障害物を避けていき、ゴールまで早く辿りつくレーシングゲームを作りたい。
ただ、自分一人で早くゴールまで辿りついてもつまらないので、オンラインランキングも導入したい。

## [ハコスコとは？](http://hacosco.com/)

VR体験ができるダンボール製HMD。単眼式レンズで手軽なVR体験を提供できます。

## 使うツール

・[Unity](http://japan.unity3d.com/)
・[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/about.htm)

## 本テーマの大きな流れ

本テーマでは下記の項目に分けて説明を行う

VRゲーム作成編
・[VRレーシングゲームのコース・ゴールを作る](http://qiita.com/fumishitan/items/c673c108489e3bf2a0f5)
・[VRゲーム用スマホジャイロセンサとMainCameraを同期させる](http://qiita.com/fumishitan/items/c2b023b9b9655d0a7d46)
・[VRレーシングゲーム用のジャイロセンサで操作するプレイヤーを作成する](http://qiita.com/fumishitan/items/8c1dd0ece271d2f8b72d)
・[ジャイロとMainCameraの傾き・プレイヤーの同期をもっと密にとる](http://qiita.com/fumishitan/items/1ac1ceaae8dd34e27850)
・[ランダムに障害物をVRレーシングゲームに登場させる](http://qiita.com/fumishitan/items/78cf6967cc9f981a62f4)
・[VRレーシングゲームのタイムを計測する](http://qiita.com/fumishitan/items/0a821f3a153782ea625f)

オンラインランキング編
・[データをサーバーにアップしてVRレーシングゲームのスコアとする](http://qiita.com/fumishitan/items/3367eca029da9a251a57)
・[データをサーバーからDLして、ランキング形式に表示させる](http://qiita.com/fumishitan/items/b7d1e0bcbf9155854a11)


上記のような流れで次回からVRゲーム作成の流れを追っていく。
woslicer III の謎に迫る！　～ポップノイズの知られざる正体とは！？～

BMSぶつ切り最強ツールであるところのwoslicer、皆さん使ってますか？ もちろん使ってますよね？ さて、このwoslicerですが、どうやら謎のノイズが発生するらしいのです・・・ということで調査してみました。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/69ec41bf-8681-574b-76a3-049534444e32.png)

こんな感じで試しにスライスしてみました。wavの最初から最後までを1つのスライスとするような分割です。すると・・・

#(1) sweep音をスライスした場合

$y(t) = \sin(2\pi \cdot 100 t e^{0.201t})$ (0≦t<10) です。こんな数式を見なくても、**周波数がだんだん上がっていく音**と考えてもらえればOKです。

（周波数は、 $f(t) = \frac{1}{2\pi}\cdot\frac{d\theta}{dt} = 100 (0.201t+1) e^{0.201t}$ [Hz] ）

こちらが結果です。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/9f4dced0-0a68-2e7d-ace6-d9b7246ca0c5.png)

**なんでや！ 逆再生必要ないやろ！**

音声の末尾に、元の音声を逆再生した音声が挿入されていることが分かります。例えば声をスライスした場合、しっかりと逆再生されていることが分かります。

#(2) 直流に近い波形（１次関数）をスライスした場合

$y(t) = t/5 - 1/2$ (0≦t<10) です。設定は(1)と同じです。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/ad7d876a-4b07-8e30-3f63-8a6aa39240e3.png)

上から2つ目の波形を見ると、位相が反転していることがよく分かります。また、一番下の波形を見ると、フェードアウト係数の精度が（若干ですが）よくないらしいことがわかります。一定間隔で不連続な点があることから考えると、高速化のためにフェードアウト係数（恐らくsin関数）の値を予め計算して、**ルックアップテーブル**にしているのかもしれません。

なお、ここでの微分とは、差分 $y(n) = x(n+1) - x(n)$ を取る操作のことを指すものとします。

# (3) さらに波形が複雑な音声をスライスした場合

```math
y(t) = \frac{1}{2} \left\{\sin\theta+\sin\left(2\theta+\frac{3}{5}\pi\right) \right\} \\　\\
\mbox{where}　\theta = 2\pi \cdot 100t e^{0.201t} \;\;\;\; (0\leq t<10)
```

設定はこのような感じです。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/8840de1b-e950-60ed-da78-8b0dbff711a9.png)

結果がこちら。上の図において水色の丸で囲んだ部分、つまり5番目（n=004）のスライスの波形の一部を示しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/e36de433-d108-8ea4-6021-5746b9e3fc7c.png)

黄色い線が、フェードアウトが無い場合の、おおよそのスライスの終了位置(1.58333秒)を示しています。これを見ると、それより後の箇所（赤線）で音声が逆再生され、さらに上下が反転されているらしいことが分かります。また、ちょうど赤線の箇所に、値が0となるサンプルが、1サンプル分だけ挿入されていることが分かります。どうやらこれがポップノイズの正体のようです。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/461b5691-109c-becd-772a-65c53f35bc4c.png)

(1)と(2)の例についても、よく見ると0値が挿入されていたことが分かりました。

![image](https://qiita-image-store.s3.amazonaws.com/0/78152/e6f61d6d-38cf-8189-cd32-e5014cfb856c.png)

#まとめ

パラ出力されたトラックをぶつ切りする際に、カットポイントより前をフェードアウトさせると音が短くなってしまいます。かと言って、カットポイントより後をフェードアウトさせると次の音が混入してしまいます。これはパラ出力された音源をぶつ切りする以上避けることのできない現象です。

そこで、仕方なく「**音の末尾を反転させつつ逆再生することで音を引き伸ばし、ぶつ切り感を低減させる**」という手法を採用したのではないかと推測されます。いやはや、なるほど、という感じです。ただ、その結果として折り返し地点で若干のポップノイズが生じてしまうのは、できれば改善したい点だったのではないかとも思われます。

#（BMS製作者向けの）まとめ

（可能な限り）ぶつ切りはやめよう！！
tsファイルの処理

録画したtsファイルの処理方法。

もともとのtsファイルは
Video: mpeg2video
Audio: aac 5.1ch

まず Audioをac3にしたmp4に変換
ffmpeg -i hoge.ts  -vcodec copy -acodec copy -bsf:a aac_adtstoasc hoge.mp4
こうしないと雑音が入る。

次に
ffmpeg -i hoge.mp4 -vcodec libx264 -s 1280x720 -r 29.97 -aspect 16:9 -vsync -1  -acodec ac3 -ac 6 -ab 192k hoge.ts

これで、画像がh264で圧縮されたtsファイルになる。
Objective-cのNSMutableArrayとNSMutableDictionaryをSwiftで使う際にはまったこと

## 前提
Swiftではこのメソッドが呼び出したい。

```swift
func hoge(object: [String: AnyObject?]) {
}
```

Objective-cではこんな定義されているメソッド/プロパティを呼び出したい。
（気づく人は気づくかもしれませんが、TiledMap関連のコードです。。。）

```objc
@interface CCTiledMapObjectGroup : NSObject

@property (nonatomic,readwrite,strong) NSMutableArray *objects;
-(NSMutableDictionary*) objectNamed:(NSString *)objectName;

@end
```

## NSMutableArray

これでいけそう・・・

```swift
let group = CCTiledMapObjectGroup()   // ※実際はこんな感じでインスタンスを作ることは出来ないないクラス。（例として記載）
for object in group.objects {
    hoge(object as! [String: AnyObject?])
}
```

コンパイルは通るが、実行時に以下のエラーが出力される。

```
Could not cast value of type '__NSDictionaryM' (0x799fa80c) to 'Swift.Dictionary<Swift.String, Swift.Optional<Swift.AnyObject>>' (0x7d4bf16c).
```

ということで、以下のメソッドでは受け取れないことがわかった。

```swift
func hoge(object: [String: AnyObject?]) {
}
```

なので指示通りSwift側のメソッドのAnyObject?→AnyObjectに変更。

```swift
let group = CCTiledMapObjectGroup()   // ※実際はこんな感じでインスタンスを作ることは出来ないないクラス。（例として記載）
for object in group.objects {
    hoge(object as! [String: AnyObject])
}

func hoge(object: [String: AnyObject]) {
}
```

いけた！

## NSMutableDictionary

で、NSMutableDictionary。
NSMutableArrayができたのでハマることは無いと思っていた。
なぜならObjective-cで取得する`objects`の中身をピンポイントで取得する以下の`objectNamed`を呼び出すだけですから。

```objc
@interface CCTiledMapObjectGroup : NSObject

-(NSMutableDictionary*) objectNamed:(NSString *)objectName;

@end
```

これを以下のように取り出そうとした。

```swift
let group = CCTiledMapObjectGroup()   // ※実際はこんな感じでインスタンスを作ることは出来ないないクラス。（例として記載）
if let object = group.objectNamed("name") {
    hoge(object as! [String: AnyObject])
}
```

まさかのコンパイルエラー・・・

```
Cannot invoke 'hoge' with an argument list of type '([String : AnyObject])'
```

これではダメなのでAnyObject?へ元に戻してみた。
（このメソッドは上記のNSMutableArrayと共通で使うので、この例はダメなのだが検証のためやってみる。）

```swift
let group = CCTiledMapObjectGroup()
if let object = group.objectNamed("name") {
    hoge(object as! [String: AnyObject?])
}

func hoge(object: [String: AnyObject?]) {
}
```

なんか、どっかで見たような警告文が表示されている・・・。

```
Cast from 'NSMutableDictionary' to unrelated type '[String : AnyObject?]' always fails
```

構わず実行！

```
Could not cast value of type 'NSMutableDictionary' (0x7fcd189c) to 'Swift.Dictionary<Swift.String, Swift.Optional<Swift.AnyObject>>' (0x7fcd176c).
```

まぁ、当然の結果。
うーん。とりあえず、以下のコードで出来たがなぞが残る。

```
let group = CCTiledMapObjectGroup()
if let object:NSDictionary = group.objectNamed("name") {
    hoge(object as! [String: AnyObject])
}

func hoge(object: [String: AnyObject]) {
}
```

NSMutableDictionaryだとダメな模様。
NSDictionaryとして処理をさせればNSMutableArrayのところと同じようにキャストができる。

はじめは`let`の定義がダメなのかと思って`var`に変えてみたりしたけど、、、関係ないみたい。

## まとめ
SwiftからObjective-cのコードを呼び出すことは多々あるかと思います。
こういうケースに引っかかる人の役に立てればと思います。
EC2上からワンライナーでAWSアカウントIDを取得する

意外と無かったのでメモ。

```
curl -s http://169.254.169.254/latest/meta-data/iam/info | jq -r .InstanceProfileArn | awk -F: '/arn:aws:/{print $5}'
```

arnとか構築するときに欲しいのじゃよ〜
バッチファイルでターゲットを読み込む

バッチファイルで外部ファイルに記載したターゲットリストを1行づつ読み込んでいく方法
最近バッチばかり書いているので主に備忘録
レガシーだけど実際に現役で動いてるからね・・・

```:bat

For /F "オプション"　%%i  In (-ファイル名-) do (
 　処理
)

```

自分が理解するために少し間違っててもイメージで書いてます。

|オプション   |意味   |備考　   　　　　　|
|------------|-------|------------------|
|eol=  　　　 |行末を意味する（Javaとかの；みたいな・・・）  | 　　　　　　　　　　　　　　|
|tokens= 　　 |区切ったところを変数に格納して使える1,1-2な感じで書く  |％％ｉ　%%j　%%k　とかになる|
|skip= 　　　 |ファイルの頭を何行飛ばすか指定する  　　　　　|行頭って説明書いたりするし　 |
|usebackq 　　|ファイル名に空白や（）なんかがついてる時用  　|””使えるようにする　　　　　 |
|delims=  　　|区切り文字を指定する何にも書かないと空白とかタブ  |なんか最後に書かないといけないっぽい？ |

オプションで***delims=,***とか書いておけばcsv形式のターゲットリストとかから読み込んで使える

```bat:sample
For /F "tokens=1-2 skip=1 delims=," %%i In (hogehoge.csv) do (
CALL :SAMPLE1 %%i %%j
GOTO :EOF
)
CALL :END

:SAMPLE1
何かの処理
GOTO :EOF

:END
終了処理

```

```csv:hogehoge.csv

No,Name
1,hogeeeee
2,fugaaaaa
3,ueeeeeee

```

%%i %%j に格納されるNo,NameがCALLで呼び出されるサブルーチンの第一引数、第二引数になる
つまりこの場合%%i　%%jは以下と同じ意味をもつ

> 変数=%~1 <===> %%i
> 変数=%~2 <===> %%j

因みに、%~0でバッチファイルの名前を取得できる
バッチファイル自身のパスの取得は%~dp0

最近はこんなツール使ってます。
情報はエディタでリファリながら勉強してます。
[バッチ用エディタ](http://www.forest.impress.co.jp/docs/review/20140204_633694.html)


vbsやvba、PSなんかはおいおい・・・今はバッチファイル。
capistrano + unicorn の最小構成を考える

capistrano + unicornを使ってみたいけど、あまりに高性能すぎるので最小構成をまずは作ってみたよ。


```rb:Gemfile
  gem 'capistrano'
  gem 'capistrano-rails'
  gem 'capistrano-bundler'
  gem 'capistrano3-unicorn'
```

```rb:config/deploy.rb
lock '3.4.0'
#gitリポジトリ
set :repo_url, 'git@bitbucket.org:hoge/hoge.git'
```

```rb:config/deploy/production.rb
#env、設定しすぎじゃね？
set :stage, :production
set :rails_env, :production
set :unicorn_rack_env, "production"

set :deploy_to, 'path/to/デプロイ先ディレクトリ'
set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"

#デプロイ先のユーザとホストを指定
role :app, "user_id@nnn.nnn.nnn.nnn"
set :ssh_options, {
                    keys: [File.expand_path('~/~/.ssh/id_rsa.pub')],
                    forward_agent: true
                }
```

unicorn.rbをunicorn/production.rbで作成する

```rb:config/unicorn/production.rb
#pidをフルパスで指定する
pid "path/to/デプロイ先ディレクトリ/shared/tmp/pids/unicorn.pid"

#この後は普通にunicorn.rb
```

ここまでの設定を記載した上でcapするとデプロイされて再起動されます。

```bash
#サーバにデプロイ
bundle exec cap production deploy

#unicornの再起動
bundle exec cap production deploy:restart
```

スッキリしないのが、unicornまわりでenvの設定とpidの設定
pidをフルパスで書かないといけないのはイヤだね、スマートに相対パスで書く方法があるはず。

学習コストはなかなか高いけど、deplpyしただけでassetsコンパイル/migrate/bundle/installをやってくれて、
restartでダウンタイム無しの再起動してくれるのは感動もの。