OmniAICreator/Qiita-1.07M huggingface dataset:
tecomp vol.8 『開発エンジニアのためのセキュリティ★ナイトフィーバー!!』に参加してきた

TECH COMPASSのイベントに参加してきたのでメモです。

# 概要

[『開発エンジニアのためのセキュリティ★ナイトフィーバー!!』～セキュリティインシデントと向き合うためのTIPSを達人たちから学ぶ夕べ](https://atnd.org/events/53529)

* Twitterまとめ : http://togetter.com/li/700064

## 内容について
セキュリティ関連で活躍されている方4名が登壇し、ディスカッションするという内容でした。
　前半はセキュリティ関連の情報収集のしかたについて、
　後半は実例から読み解く技術トレンド
をテーマにした話でした。

# 討議内容メモ
## セキュリティ関連の情報収集のしかたについて
* RSSリーダーやTwitterから収集
    * 1～1.5万件/日 くらい見るが、色分けしたりキーワードでフィルターしたりしている
    * 忙しいときは優先度をつける（セキュインコさん）
* PocketやEvernoteに蓄積
    * 通勤中にストックして会社で読む など
    * 蓄積したものをあとでまとめて公開したりする
* 情報を見るポイント
    * reddit?などでサマリーをチェックし、Twitterのトレンドを確認したりする（新井さん）
    * ソース情報に注意する。脆弱性が公開されているものか、ベンダーが発表しているかなど（セキュインコさん）
    * 攻撃データが公開されたかをチェックし環境（言語・バージョン）ごとに動くかどうかを確認する（辻さん）
    * 影響度・緊急度の判断は以下の点をチェックしている（セキュインコさん）
        * 悪用（攻撃）の有無
        * 情報の展開状況
　どこまで広がっているか：マスメディアが報じているか
        * 悪用されるとできること
        * 攻撃方法の公開有無
        * 攻撃の容易性
        * 評価環境での検証
    * 信用できる専門家のTwitterから判断する
    * わからないときは発信元に直接問い合わせる
    * [セキュメモ](http://www.st.ryukoku.ac.jp/~kjm/security/memo/)：情報が早く、まとまっている（セキュインコさん）
* 情報の開示・拡散について
    * ベンダーによって情報の粒度が異なるので、公開する情報も一定の基準になるような風潮にしていきたい（辻さん）
    * 誤報のあとの訂正情報が拡散されないことが多いので、訂正情報も積極的に拡散すべき（辻さん）

## 実例から読み解く技術トレンド
* マルウェアについて
    * 感染したらアウトだと思っている人が多いが、感染した後の対策を準備しておくことも重要
    * 不正送金マルウェアが増えてきていて、最近は法人をターゲットにする例も多い
* ターゲットについて
    * 不正送金が最終目標だとしても、システム開発者が狙われることも多い。
→一見無関係でも油断できない
    * 中で使っているプラグインから攻撃される場合も
→プラグインを把握していなかったり、プラグイン自身が脆弱性を放置している場合もある
        * 更新について設計段階で考慮されていない場合が多い（セキュインコさん）
* パスワードについて
    * パスワードの強化が叫ばれているが、パスワード仕様に制限がある場合も多い（文字数上限、記号使用不可など）
    * パスワード仕様が脆弱でも顧客が減らないことも影響しているのでは
    * 強力なパスワードを作れるサービスをもっと賞賛すべき
* インシデントへの対応について
    * 脆弱性指摘への対応も重要（いろいろな人に見られている）
    * 想定した窓口へ連絡が来るとは限らないので、その場合にもキャッチできるか、体制の準備も重要

## そのほか（ひとこと・質疑など）
* 正規ソフトのアップデートでマルウェア感染することもあるので、出所をチェックする習慣があったほうがよい（根岸さん）
* コミュニケーションツールを使った成りすましは今後も類似のツールで発生する可能性があるので要注意（セキュインコさん）
* ネイティブアプリ開発ではOS側のセキュリティ機構を利用するのも有効（新井さん）
* セキュリティ攻撃も多様化しているので、自分の守備範囲以外にも手を広げることが重要
* また、情報を拡散するなど、みんなで解決していくアプローチも重要（辻さん）
xdebug入れたらvar_dumpが省略されて、PHPの勝手な振舞に激おこプンプン丸になった時に思い出すコピペ

```php
ini_set('xdebug.var_display_max_children', '64');
ini_set('xdebug.var_display_max_data',  '512');
ini_set('xdebug.var_display_max_depth', '10');
```
Raspberry piで、PaSoRi USB Felica Reader(RC-S380)を使用する

Raspberry piとFelica Readerを接続して利用する方法は、Googleで検索すると色々とヒットするようです。
libusb,libpafeをC言語から利用する方法も調べてみたのですが、情報的に古いためライブラリは昔のバージョンでないとコンパイルエラーが発生するなど、ちょっと情報を補完する必要がありそうです。
検索ワードを変更しつつ調べてみると、情報的に新しく簡単な方法として、python-usbを使用する方法を見つけました。
ドライバは、パッケージを１つ入れれば良いみたいなので、すごく簡単です。

```bash:
$sudo apt-get install python-usb
```
実際に、カードを読み書きするコードは、nfcpyというpythoonのスクリプトになります。

```bash:
$ wget https://launchpad.net/nfcpy/0.9/0.9.1/+download/nfcpy-0.9.1.tar.gz
$ tar xvzf nfcpy-0.9.1.tar.gz
```
スクリプトをダウンロードしてから解凍しtagtool.pyというスクリプトを実行すれば、カードIDが読まれます。

```bash:
$ sudo nfcpy-0.9.1/examples/tagtool.py
```
tagtool.pyは、通常モードでは、１回読み取りを行うとプログラムが終了します。
繰り返し読むには、-lオプションを付けて起動します。
tagtool.pyは、root権限で実行しないとエラーになりますが
/etc/udev/rules.d/nfcdev.rulesファイルを作成し次のようなテキストを書き込むとユーザー権限でも実行可能になります。（一度USBを挿抜する必要がある）
詰めて記入したらダメだったので、改行も含めて同じように記入してください。

```bash:
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="054c", \

  ATTRS{idProduct}=="06c3", GROUP="plugdev" # Sony RC-S380/P
```
pythonで、制御を書く自信が無かったので、自作したプログラムへはパイプを利用して情報を渡すようにしました。

```bash:
./tagtool.py -l | grep -o "IDm=[0-9a-f]*" | diligence.exe
```
しかし実際に試してみるとループモードで実行すると標準出力にカードIDが出力されてこないようです。単発モードではパイプで情報が来るようです。
しかたがないので、bashのスクリプトでループするようにしました。

```bash:diligence.sh
while :
do
    ./tagtool.py | grep -o "IDm=[0-9a-f]*" | diligence.exe
done
```
自作プログラムは、monoで作られているため拡張子が、exeになっています。
Raspberry piとSSH接続

Raspbianは、インストール直後は、SSH接続が無効になっています。
初期起動時に表示される設定画面で、SSH接続を有効にすれば、モニタを接続せずにリモートで使うことが可能です。
Raspberry piのような組み込みボードの場合には、モニタやキーボードを接続せずにPCからリモート接続して開発した方が効率が良いでしょう。
設定画面は、raspi-configコマンドで、呼び出すことも出来ます。

```bash
$sudo raspi-config
```
###Advanced Optionsを選択
![Raspberry pi 設定 SSH.png](https://qiita-image-store.s3.amazonaws.com/0/7839/2ac0d129-ba8d-c791-1d72-c28ce3891852.png)
###SSHを選択
![Raspberry pi 設定 SSH2.png](https://qiita-image-store.s3.amazonaws.com/0/7839/94400c41-79fd-5f59-b482-7b35b8f8ddbe.png)

SSHでの接続には、PuTTYなどターミナルソフトを利用します。
ifconfigコマンドで、IPアドレスを調べて接続するとログイン画面が表示されます。
IDは、pi、パスワードは、raspberryです。
そのページの（自分の）訪問回数をカウントする関数

### この関数を呼ぶ度にクッキーでcountをインクリメントしていく関数

**用法：**
　引数にそのページのid（string）を与えてあげる。
　ex)get_countVisits('page274')
**効能：**
　初めて来たかそうでないかを判断したいときなどに効く。

```php

function get_countVisits($strId)
{
	$life = 60 * 60 * 24 * 30 * 12;//* 約1年　本当はこうすべき：60 * 60 * 24 * 365
	if(isset($_COOKIE["count".$strId])) {
		$count = $_COOKIE["count".$strId] + 1;
	}
	else {
		$count = 1;
	}
	setcookie("count".$strId, $count, time() + $life);
	return $count;
}
```
Androidの標準ブラウザでcanvasをクリアする方法

# 問題点

AndroidだとcanvasをclearRectしても、直前に描画したものが残っていることがあります

# 原因

この原因は、Androidの標準ブラウザで画面更新が起きないため、そのまま描画が残っていることが考えられます。
※AndroidChromeでは起きない


# 解決方法

```js
window.clearTimeout(this.timerId);
//強制レンダリング
var $canvas = $('canvas');
$canvas.css('opacity',0.99);
this.timerId = window.setTimeout(function(){
    $canvas.css('opacity',1);
},100);
```
opacityを変更することで強制的に描画させます。
この方法であればcanvas内のタップイベントなどがキャンセルされたりすることなくなります。
PHPUnit自体のエラーもstacktrace表示する

XDebugが有効な環境では、例外の詳細なスタックトレースが自動でロギングされるため、原因特定に大変役立つ。

しかしPHPUnitコマンドは`xdebug.show_exception_trace`をoffにするため、「何が」「どこが」問題なのか原因が調べにくい事がある。

テスト対象のコードで発生した例外はスタックトレース表示するため、通常は問題無いのだが、PHPUnit自体のメソッドの引数を間違えたりすると、抑制されたエラーとしてしか表示されず、不便である。


先述の通り`xdebug.show_exception_trace`を設定すればいいため、
bootstrapスクリプトか、phpunit.xmlで`ini_set`すれば、抑制されず全部のスタックトレースが表示されるようになる。

```xml:phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
  colors="true"
  bootstrap="vendor/autoload.php">

 <!-- ... -->

 <php>
  <ini name="xdebug.show_exception_trace" value="1"/>
 </php>

 <!-- ... -->

</phpunit>
```

ただし@expectedExceptionなども表示されて非常に読みにくくなるので、困った時だけonにする方がおすすめ。
デフォルトoffなのは、単に見やすさのためかな？

参考：
http://stackoverflow.com/questions/6934216/why-does-phpunit-hide-my-xdebug-backtrace
Raspberry Pi起動時にwifiに接続し、IPアドレスをLCDに表示させる


#概要

ディスプレイ等の機器を使わずにRaspberry Piに割り当てられたIPアドレスが知りたかったので、起動時にwifiに自動接続 ＆ LCDにIPアドレスを表示できるようにした際の手順のメモです。

#使ったもの

- Raspberry Pi Type B
- [I2C controlled 8×2LCD Breakout for Raspberry Pi](http://www.switch-science.com/catalog/1516/)
- 無線LANアダプタ（[Logitec LAN-W150NU2AB](http://www.amazon.co.jp/gp/product/B00BQ6WPKA)）


#手順

##1. ラズパイ起動時にwifiに自動接続するよう設定する

1. 初回はディスプレイ等の外部機器を接続し、GUIでwifi設定してつながることを確認する。

1. 下記サイトを参考に/etc/network/interfacesを修正する。
（必要があれば/etc/wpa_supplicant/wpa_supplicant.confも修正）
*参考サイト：[Raspberry Piを無線LANで接続する](http://systemp.hatenablog.com/entry/2013/04/21/152453)*

1. rebootして自動接続されることを確認。

##2. LCDボードを使えるようにする


*参考サイト：[Raspberry Piで「I2C LCD Breakout」を使ってみた！](http://mag.switch-science.com/2013/07/30/use-i2c-lcd-brakeout-board-on-raspberry-pi/)*

特につまづいたところは無し。

##3. LCDボードにIPアドレスを表示する

*参考サイト：[Raspberry Pi 搭載のLCDにIPアドレスを表示する](http://make.kosakalab.com/make/electronic-work/raspberry-pi-i2c-lcd/)*

1. 上記サイトを参考に、/usr/local/bin/にi2c-disp.shを置く。実行できるようパーミッションを変更する。
`sudo chmod +x /usr/local/bin/i2c-disp.sh`


2. 上記サイトを参考に、/etc/network/if-up.d/にi2c-disp-ipを置く。ただし、接続先がwifiなので「eth0」の部分を使用しているネットワークデバイス（wlan0など）に変更しておく。こちらも1.と同様にパーミッションを変更する。

3. さらに、/dev/i2c*にはsudoつけないとアクセスできない（i2c-disp-ipを実行すると`Error: Could not open file '/dev/i2c-1': Permission denied`と言われる）ので、以下のようにパーミッションを変更する。
` sudo usermod -G i2c,spi,gpio,dialout pi` 
*参考サイト:[Raspberry Pi がきたのでセットアップして I2C デバイスを読むところまで](http://lowreal.net/2013/12/26/1)*
（i2cだけで良いのだろうけど参考サイトのとおり実行してみた）

4. コンソール表示を日本語にしている場合はi2c-disp-ipがうまく動かないので、言語設定を英語に変更する。
`export LANG=en_US.UTF-8`を~/.bashrcに追加。
*参考サイト：[コンソールの日本語表示を英語にする方法](http://qiita.com/namakecat/items/06419e9ebee53e084fcb)*

#完成
Raspberry Piを起動すると、wifiに自動接続し、LCDにIPアドレスが表示されるようになりました。
createjs（0.7.1）のTimerFiredを完全に止める方法

# スマフォ向けに描画が終わったらtickイベントをとめたい

## イベント初期化

こんな感じでtickイベントが始まるとします。

```js
var stage = new createjs.Stage($('canvas').get(0));
createjs.Ticker.addEventListener('tick',stage);
```

この状態ですとスペックの低いPCですとProfile＞idleが10%ぐらいになり、
PCのファンが悲鳴をあげます。

## イベント（描画）停止

```js
createjs.Ticker.setPaused(true);
```

あるいは

```js
createjs.Ticker.removeEventListener('tick');
```

とやることで描画更新(update layer tree)は止まります。

しかしこれでもidleは50%前後になってしまいます。
これはcreatejsの内部でsetTimeoutを呼び出し続けているためです。

## イベントの完全停止

```js
createjs.Ticker.reset();
//0.7.1だと以下のプロパティが初期化されずに再スタートできなくなる
//masterだと修正されているのでそのうちいらなくなるっぽい
createjs.Ticker._timerId = null;
createjs.Ticker._inited = false;
```

はじめmasterを見ていたのでなんで再初期化できないのかすっごく悩んだ。。

## イベントの再初期化
```js
createjs.Ticker.init();
createjs.Ticker.setFPS(15);
createjs.Ticker.addEventListener('tick',stage);
//Tweenも使っているのであれば以下も必要
//createjs.Ticker.addEventListener('tick',createjs.Tween);
```
IntelliJからMacのターミナルを開きたい

IntelliJ IDEA のターミナルは便利だけど、 `^ + R` が「実行」で食われていてシェルの履歴を利用したいときイライラします。というわけで、こんなエイリアスをシェルに登録しておいて...

```sh
alias term='open -a Terminal'
```

IntelliJ のターミナルから

```sh
term .
```

これで、IDEのキーバインドを気にせず新規ターミナルウィンドウで作業できて、とっても快適ですね。ドットのところは任意のディレクトリでOKです。

また、External Tools にこういう `OpenNewTerminal` のを登録しておけば、

![スクリーンショット 2014-08-07 14.25.26.png](https://qiita-image-store.s3.amazonaws.com/0/11525/f7c85a1e-504b-396b-3160-4588ecaecff6.png)

`Command + Shift + A` から `ONT` と検索して実行、なんてこともできますね。
Chromeの検索バーを強化する

英単語が思いつかない時とかよく「ALCをググって、リンククリックして、ALCのinputに単語入力して、検索！」とかよくやるんだけど。よくやりすぎて毎回この手順するのが面倒になってきた。

そういえばChromeって検索エンジン登録してショートカット作れるんじゃなかったっけ？と思いだしたので設定してみたら快適になったのでメモを残しておく。

# 使い方
登録した検索エンジンキーワードを入力した後にスペースやタブやコロンを入力して、続けて検索ワードを入力すればよくなる。

例えば `alc(空白)`と入力するとオムニバーが↓こんな感じになって一発で検索が出来る。
![スクリーンショット 2014-08-07 12.54.37.png](https://qiita-image-store.s3.amazonaws.com/0/18726/bc9f3ed5-9af9-ce50-348a-d93b74b00756.png)


# 設定手順
1. Chromeの設定を開く
2. 検索エンジンの管理ボタンを押す
3. その他の検索エンジンに「名前、ショートカット用キーワード、検索URL」を登録
4. 必要なだけ3を繰り返す

設定した検索エンジンはとりあえず以下の4つ。

```text:
名前           キーワード  検索URL
@ALC                alc  http://eow.alc.co.jp/%s/UTF-8
@Google翻訳｜en→ja   ej  http://translate.google.com/#en|ja|%s
@Google翻訳｜ja→en   je  http://translate.google.com/#ja|en|%s
@PHP                php  http://php.net/manual-lookup.php?pattern=%s
```

ちなみに名前の頭に `@` をつけてる理由ですが、Chromeは検索っぽいURLを見つけるとその他の検索エンジンに勝手にどんどん設定を追加してくれやがるので自分がマニュアル設定したものが混ざって分かりにくくなります。なのでソートされた際に自分設定が固まるようにprefixを付けてます。

上記を追加すると設定画面はこんな感じになってればOK。
![スクリーンショット 2014-08-07 12.24.56.png](https://qiita-image-store.s3.amazonaws.com/0/18726/e33a6454-027a-5429-1adf-b644eeecb196.png)
Java入門 メソッド

java入門
メソッド

メソッド(method)とは処理を記述した部品の最小単位のことです。C言語などの関数と同じですね。
Javaには関数という概念は存在しないため、それらをメソッドど呼びます。

##メソッドの定義と呼び出し
HelloWorld!と画面に出力するメソッドを作ってみましょう。

```java:sample.java
public class Sample {
	public static void main (String[] args) {
		// sayHelloメソッドを呼び出します。
		sayHello ();
		System.out.println ("メソッドを呼び出しました。");
	}
	// sayHelloメソッドの定義
	public static void sayHello () {
		System.out.println ("HelloWorld!");
	}

}
```

これを実行すると

```lang:sample.java
HelloWorld!
メソッドを呼び出しました。
```

このように画面に出力されます。

メソッドは下記の手順が必ず必要です
1.メソッドの定義
2.メソッドの呼び出し


メソッドはいくつでも定義できますし、メソッドはmainメソッド以外からも呼び出すことも可能です。

```java:sample.java
public class Sample {
	public static void main (String[] args) {
		// sayHelloメソッドを呼び出します。
		sayHello2 ();
		System.out.println ("メソッドを呼び出しました。");
	}
	// sayHelloメソッドの定義
	public static void sayHello () {
		System.out.println ("HelloWorld!");
	}
	public static void sayHello2 () {
		System.out.println ("Javaの世界へようこそ!");
		sayHello();
	}

}
```

実行結果

```lang:sample.java
Javaの世界へようこそ!
HelloWorld!
メソッドを呼び出しました。
```

新しく追加されたsayHello2メソッドを見て下さい。mainメソッド以外のメソッドでsayHellメソッドを呼び出すことが可能です。

Javaでメソッドを使うときの注意ですが、C言語やC++にはmain上に関数を書くか、プロトタイプ宣言が必要でした。
しかし、Javaにはいわゆる前方宣言、関数のプロトタイプ宣言は不要です。

C言語から入ったからでしょうか、まだちょっと違和感がありますね。
エクセル実務：計算シートからシミュレーションのグラフを作る

#やりたいこと
変数を変えることでいろいろ計算して答えをだしてくれるシートがある。
そこから別シートに、その変数を変えると結果がどう推移するのかのグラフを書きたい。

↓みたいな、変数によって値が変わるシートから
![keisan.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/be47030b-d0cf-f59c-f892-8b2ead45af5f.png)
※条件によって値が変わるから単純な式にはできない

↓みたいなグラフを作るために
![keisan2.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/cf60fd6f-7f93-7e70-4647-3498c12cc4c0.png)
（横軸は単価※心の目で見てください）

↓みたいな、変数の値ごとのグラフ用の表を作りたい
![keisan3.PNG](https://qiita-image-store.s3.amazonaws.com/0/39559/2f53ba0b-a070-9708-d237-9b88d88c5924.png)


#コード
```vbnet
Sub グラフへの移し替え()
Dim i As Integer
Dim tanka As Integer
Dim uriage As Integer
Dim dounyuritu As Double

i = 3
lastColum = Worksheets("シミュレーション").UsedRange.Columns.Count

Do While i <= lastColum + 1 '単価の最後の列まで繰りかえす

  'i列の単価をシミュレーションの変数のセルに入れる
  tanka = Worksheets("シミュレーション").Cells(2, i).Value
  Worksheets("市町村SIM").Cells(3, 27).Value = tanka
  
  '結果セルの値をi列のところに返す
  uriage = Worksheets("市町村SIM").Cells(15, 41).Value'省略可
  dounyuritu = Worksheets("市町村SIM").Cells(16, 41).Value'省略可
  uriageall = Worksheets("売上規模").Cells(5, 5).Value'省略可

  Worksheets("シミュレーション").Cells(3, i).Value = uriageall
  Worksheets("シミュレーション").Cells(4, i).Value = uriage
  Worksheets("シミュレーション").Cells(6, i).Value = dounyuritu

'次の単価へ
i = i + 1

Loop

End Sub
Java入門 変数の比較(Math.max)

Java
変数の比較

変数aと変数b、どちらが大きいか判断するためにJavaにはMath関数が用意されています。

```java:sample.java
public class Sample {
	public static void main (String[] arg) {
		// 変数aとbに0～89の乱数を代入
		int a = new java.util.Random().nextInt(90);
		int b = new java.util.Random().nextInt(90);
		// 変数maxに値が大きい方を代入
		int max = Math.max(a, b);

		System.out.println (max);
	}

}
```

C言語では変数を比較する式をif文を使って書く必要がありますが、Javaではそれが不要です。
便利ですね。
Java入門 配列の長さ

Java入門
配列の長さ

宣言した配列の長さを覚えていなくても、直ぐに確認する方法がJavaには用意されています。
確認するにはlengthという関数を用います。

```java:sample.java
public class Sample {
	public static void main (String[] args) {
		// 配列を宣言して、初期化
		int[] moneyList = {100, 200, 300};
		// 配列の数だけ繰り返し処理
		for (int i = 0; i < moneyList.length; i++) {
			System.out.println (moneyList[i]);
		}
		// 配列の長さをlengthで出力
		System.out.println ("moneyListの配列の長さは" + moneyList.length + "でした");
	}
}
```

これを実行すると

```java:sample.java
100
200
300
moneyListの配列の長さは3でした
```

このように画面に出力されます。
前回の繰り返し処理のfor文で

```java:sample.java
for (int value : a)
```

これを用いて配列の数だけ繰り返し処理を行いました。
lengthを使っても配列の数だけ繰り返し処理が可能です。
Unity GameObjectの色変更(C#)

ソースからGameObjectの色を変更する。
##GameObjectにMaterial追加
####GameObject作成
```Hierarchy > Create > Cube```
SceneにCubeができる。

####Material作成
```Project > Create > Material```
作ったMaterialの丸いとこクリックするとColorやShaderを変更できる。

####GameObjectにMaterial追加  
```作ったMaterialをSceneのCubeにドラッグ&ドロップ ```
これでcube(GameObject)にMaterialが追加され、CubeのInspectorから確認できる。


##GameObjectのMaterialの色をコードで変更
cubeのInspectorからAdd Component > New script


```c#:changeColorScript.cs
using UnityEngine;
using System.Collections;

public class ChangeColorScript : MonoBehaviour {

	public GameObject myCube;

	// Use this for initialization
	void Start () {

		//gameObject取得 
		myCube = GameObject.Find("CubeName");

		//今の色コンソールに出力
		Debug.Log(myCube.renderer.material.color);

		//青色に変更
		myCube.renderer.material.color = Color.blue;

		//変更後の色コンソールに出力
		Debug.Log(myCube.renderer.material.color);
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}
```
シーンを再生したらキューブの色が青に変わる。

##Unityでの色の設定方法
いくつか方法がある。
http://docs.unity3d.com/ScriptReference/Color.html

* Unityが用意したカラーネームを使う  
```Color.red ```
* RGBAで設定  
```new Color(1f, 0.92f, 0.016f, 1f); ```
* ランダムな色
```Color randomColor = new Color( Random.value, Random.value, Random.value, 1.0f );```



参照)
http://docs-jp.unity3d.com/Documentation/ScriptReference/GameObject-renderer.html
oilを実行したPHPで、PHPUnitを実行する



phpenvでインストールしたPHPを使用していて、
PhpStorm経由で「oil test」を実行していたら、
PATHの関係で、oilを実行するPHPとPHPUnitを実行するPHPが異なってしまう場合があった。

```
・oilの実行PHP
/Users/Uchiko/.phpenv/versions/5.5.15/bin/php

・phpunitの実行PHP
/usr/bin/php
```


のような感じで。


対策として、
oil.php内の`phpunit.binary_path`で、
oilで実行しているPHPのパスを`PHP_BINARY`で取得し、
phpunitの実行PHPを明示的に指定することによって、
この問題を回避した。

```php:fuel/app/config/oil.php
<?php
return array(
	'phpunit' => array(
		'autoload_path' => 'PHPUnit/Autoload.php',
		'binary_path' => PHP_BINARY . ' fuel/vendor/bin/phpunit',
	),
);
```
spring を使ってテスト高速化


rails の Gemfile に記載されている spring の使い方
rails new するとこっそり起動されているようだ。

### springについて

* develop環境での実行を高速化する仕組み
* springサーバが起動される。
設定を監視し、必要に応じて再ロードする
* rails console/runner/generate/destroy と rake タスクが対象
* 自動起動/終了されるので何も考えなくてもよい

### 設定

デフォルトではspringは使われないので、有効にする必要がある。

#### 有効にする

rails new したプロジェクト以下で実行する

```bash
$ bundle exec spring binstub --all
```

bin/spring が新規追加され、bin/rails, bin/rake にspringをloadするコードが追加される。

これだけ。

railsコマンドまたはrakeタスクを実行するとブーストされる。

```bash
$ time bin/rails runner 'puts "hello"'
hello

real	0m2.335s
user	0m0.155s
sys	0m0.071s
BB-no-MacBook-Air:testrails2 babiy$ time bin/rails runner 'puts "hello"'
hello

real	0m0.376s
user	0m0.151s
sys	0m0.063s
```

確かに早くなっている。

サーバの状況は status コマンドを使う。

```bash
$ bin/spring status
27536 spring server | testrails2 | started 1 min ago   
27537 spring app    | testrails2 | started 1 min ago | development mode
```    

2種類のプロセスがバックグラウンドで実行される。
spring app で、起動時の状態をキャッシュしている。
spring server で spring appのプロセスを管理している。

なお、development環境とtest環境で別のappプロセスが立ち上がる。

config 以下のファイルが変更されるとappプロセスが再起動される。

```bash
$ touch config/database.yml
$ bin/spring status
Spring is running:

27739 spring server | testrails2 | started 8 mins ago   
28226 spring app    | testrails2 | started 3 secs ago | development mode    
```

#### サーバを停止する

シェルからexitすると自動的にサーバも終了されるが停止コマンドもある。

```bash
$ bin/spring stop
```

spring自体を無効にしない限り、railsやrakeコマンドを実行したタイミングでspringプロセスは再度起動される。

変更したのに反映されないなど謎なことが起きた場合は一度とめてみるのもよいのかもしれない。

#### spring自体を無効にする

```bash
$ bin/spring binstub --remove --all
```

binstub --all での変更が削除される。
springプロセスは自動的には停止されないが、ターミナルを終了させるとプロセスは消える。
tick-tack-toe(clojure)

http://yhpg.doorkeeper.jp/の過去門を解いてみた。

```clj
(def won-pattern [2r111000000 2r000111000 2r000000111 2r100100100 2r010010010 2r001001001 2r100010001 2r001010100])

(defn win? [prots]
  (if (> 2 (count prots)) false
    (let [current-bit (apply bit-or (map #(.intValue (Math/pow 2 (- % 1))) prots))]
      (some (fn [x] (= x (bit-and current-bit x))) won-pattern))))

(defn judge [a-prots b-prots f?]
  (let [target (if f? a-prots b-prots)
        enemy (if f? b-prots a-prots)
        t-name (if f? "○" "×")
        e-name (if f? "×" "○")]
    (cond
     (win? target) (str t-name " won.")
     (not= target (distinct target)) (str "Foul : " e-name " won.")
     (some #(.contains target %) enemy) (str "Foul : " e-name " won.")
     :else nil)))

(defn solve [all-prots]
  (loop [a-prots [] b-prots [] r-prots all-prots f? true]
    (letfn [(add [coll f?] (if f? (conj coll (read-string (str (first r-prots)))) coll))]
      (let [a-prots (add a-prots f?)
            b-prots (add b-prots (not f?))
            result (judge a-prots b-prots f?)]
        (if result result
          (if (= (count (concat a-prots b-prots)) 9) "Draw game." (recur a-prots b-prots (rest r-prots) (not f?))))))))

(solve "79538245")
(solve "35497162193")
(solve "61978543")
(solve "254961323121")
(solve "6134278187")
(solve "9625663381")
(solve "4319581")
(solve "2368799597")
(solve "18652368566")
(solve "965715")
(solve "38745796")
(solve "371929")
(solve "758698769")
(solve "42683953")
(solve "618843927")
(solve "36535224")
(solve "882973")
(solve "653675681")
(solve "9729934662")
(solve "972651483927")
(solve "5439126787")
(solve "142583697")
(solve "42198637563")
(solve "657391482")
```
AngularJSでDirectiveのtemplateUrlを動的に変更する方法

機能的には同じDirectiveで扱いたいけど、例えば記事の種類などで見た目は変えたい場合のために、DirectiveのtemplateUrlを後から書き換える方法です。

`templateUrl`でなく、`template`で指定したhtmlの中で`ng-include`を使います。
scopeでtemplateの判定に使える何かを渡します。

```
App.directive 'Article', ->
  restrict: 'E'
  replace: 'true'
  scope: { template: "=" }
  template: "<div data-ng-include src=\"'templates/' +  template + '.html'\"></div>"
]
```

もう少し簡潔な解決方法がありそうな気もする(or あってほしい)のですが、一旦上記で対応出来ました。

[追記] 普通に`templateUrl`に関数渡せるよ！という指摘が @izumin5210 からありました！当然こちらの方がスマートですね！(1.3.x~以降のdeveloper guideに載ってるそうです。昔はなかったのかなと思いきや1.2.xの[api reference](https://code.angularjs.org/1.2.7/docs/api/ng.$compile)にもキッチリ載ってました。悲しい！)

```
angular.module('docsTemplateUrlDirective', [])
.directive('myCustomer', function() {
  return {
    templateUrl: function(elem, attr){
      return 'customer-'+attr.type+'.html';
    }
  };
});
```
以上です。
一般ユーザでもsudoできるようにする

DebianなどのOSをインストールした直後はroot権限でしかsudoコマンドを使えない。
visudoを使うことで解決

1.$visudo
2.root    ALL=(ALL) ALL　の下の行に
  ユーザ名 ALL=(ALL) ALL を追加

【参考】
http://www.garunimo.com/program/linux/visudo.xhtml
rails + nginx + unicorn連携

#1.サンプルアプリ作成
###### railsサンプルアプリの作成については以下参照
[rails環境構築（CentOS + ruby on rails）](http://qiita.com/shinyashikis@github/items/3501c5f7f71a8e345c3d)


#2.nginxインストール

####### リポジトリファイルの作成
```
$ sudo vim /etc/yum.repos.d/nginx.repo
```


####### 以下を記載し保存
```
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=0
```


####### nginxのインストール
```
$ sudo yum --enablerepo=nginx install nginx
```

####### バージョン確認
```
$ nginx -v
```



#3.unicorn <-> nginx連携
### unicorn側の設定
####### アプリ用ユーザに切り替え
```
$ su - rails
```

####### Gemfileの設定（unicornの行をコメントイン）
```
$ cd ~/sample/
$ vim Gemfile
```

####### Gemfileより該当unicornのインストール
```
$ bundle install --path=~/sample/vendor/bundle
```

####### unicorn用ファイル作成
```
$ vim ~/sample/config/unicorn.rb
```
####### 以下を記載し保存

```
rails_root = File.expand_path('../../', __FILE__)
　
worker_processes 2
working_directory rails_root
　
listen "#{rails_root}/tmp/unicorn.sock"
pid "#{rails_root}/tmp/unicorn.pid"
　
stderr_path "#{rails_root}/log/unicorn_error.log"
stdout_path "#{rails_root}/log/unicorn.log"
```

### nginx側の設定
####### nginx用設定ファイル作成
```
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/sample.conf
$ vim /etc/nginx/conf.d/sample.conf
```

####### 以下のとおりに記載し保存
```
upstream unicorn {
  　# nginxとunicornの連携
  　# ↑で作成したunicorn.rbで設定したunicorn.sockを指定
　server unix:/home/rails/sample/tmp/unicorn.sock;
}
　
server {
　　listen 80;
　　server_name <サーバ名>;
　
　　root /home/rails/sample/public;
　
　　access_log /var/log/nginx/sample_access.log;
　　error_log /var/log/nginx/sample_error.log;
　
　　client_max_body_size 100m;
　　error_page 500 502 503 504 /500.html;
　　　
　　try_files $uri/index.html $uri @unicorn;
　
　　location @unicorn {
　　　proxy_set_header X-Real-IP $remote_addr;
　　　proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
　　　proxy_set_header Host $http_host;
　　　proxy_pass http://unicorn;
  　}
}
```


####### nginxの起動
```
$ sudo /etc/init.d/nginx start
```


####### unicornの起動
```
$ su - rails
$ cd ~/sample/
$ bundle exec unicorn_rails -c config/unicorn.rb -p 3000 -E development -D
```

####### unicorn起動確認
```
$ ps -ef | grep unicorn | grep -v grep
```

####### ブラウザにて確認
```
http://<サーバ名>
```


####### unicornの停止
```
$ kill -QUIT <pid(tmp/unicorn.pidに記載されてる)>
```
[Railsテスト環境]RSpec(BDD)周辺設定 準備メモφ(・・*)

重なるところがあるのに、別々で書きなおしてしまっていたので、
下記に統一して、追加の編集は下記で行っていますm(_ _)m

[RSpecテスト環境 設定 メモ _φ(・・*) - Qiita](http://qiita.com/hitomi_/items/fc9e9a3aa68039d68776)
Swiftで詰まったとこ

逐次更新

### data

dataという変数があると思っていて使おうとするもmodule<data> is not convertible to~というエラーが出て使えなかった
→Swiftのdataモジュールというのが定義されていた
→試してないけどdataという変数名は使えないのでは

### CGクラスのUnmanaged<CG~>

返り値にUnmanagedがついているものはSwiftのメモリマネジメントに入れてやらないとそのまま使えない
→cgImage = unmanagedCGImage.takeRetainedValue()
参考： http://stackoverflow.com/questions/24215757/using-unmanagedanyobject-as-key-in-nsmutabledictionary

### UICollectionViewCellサブクラスを使用するとき

なんか詰まったんだけど忘れた。なんだったかな…

### readonly property

セッタを定義していないプロパティに値をセットしようとするとコンパイルエラーになる

```swift

	var hoge: Hoge! {
		get {
			return (何か処理)
		}
	}

```

### マクロ

ないっぽい

### 数値をフォーマットして文字列に変換

こんなん

```swift

String.localizedStringWithFormat("%02d", index)

```

Precision String Format Specifier In Swift - Stack Overflow - http://stackoverflow.com/questions/24051314/precision-string-format-specifier-in-swift/25915588#25915588

Macros in Swift? - Stack Overflow - http://stackoverflow.com/questions/24114288/macros-in-swift

## CocoaPods

### Masonry



### そのほか

Swiftじゃないけど
http://d.hatena.ne.jp/ntaku/20110110/1294632603
@asmnameで自分の脚を撃つ

Swiftで `fork(2)` を使おうとすると、以下のようにコンパイルエラーになります。

```
error: 'fork()' is unavailable: Please use threads or posix_spawn*()
```

これはCocoaフレームワークがfork-safeでないからのようです。これ自体は自分の脚をうっかり撃たなくていい仕組みで歓迎しますが、危険を承知で `fork(2)` を使いたいこともあります。そんなとき、 `@asmname` でCの関数をSwiftにマッピングすることができます。これで自分の脚も撃ち放題ですね。

```swift
#!/usr/bin/xcrun swift
import Darwin

// `let pid = fork()` はコンパイルエラーになるのでシンボルを直接参照する
@asmname("fork")
func myFork() -> pid_t

let pid = myFork()

if pid != 0 {
    waitpid(pid, nil, 0)
    println("Hi. I am the parent.")
    exit(0)
} else {
    sleep(1)
    println("Hi, I am a child.")
    exit(0)
}
```

```shell-session
$ ./fork.swift
Hi, I am a child.
Hi. I am the parent.
```

なお `fork(2)` の注意点やプロセスのdaemon化については [TN2083 Daemons and Agents](https://developer.apple.com/library/mac/technotes/tn2083/_index.html)にまとまっています。
<Chrome extension>クロスドメインで怒られたら（XMLHttpRequest）

### ＜問題・課題＞
* Chrome拡張開発でクロスドメインを使いたい（外部API使ってhogehogeしたい）けど、ブラウザから怒られる

```lang:errorの内容
XMLHttpRequest cannot load ------. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '--------' is therefore not allowed access.
```


* * *
### ＜解決方法＞
参考：https://developer.chrome.com/extensions/xhr
（本家のドキュメントより）


※※やることは2つ※※
1. manifest.json > permissions の修正
2. XMLHttpRequestの利用　※ただし、１で設定したドメインからのみアクセス可能

1. manifest.json > permissions の修正

```lang:manifest.json
"permissions": [
    "http://api.example.com/" // api.example.comを使いますよの宣言
  ],
```

2. XMLHttpRequestの利用　※ただし、１で設定したドメインからのみアクセス可能

```lang:hoghoge.js
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // json を受け取る場合はparseしましょう
    var resp = JSON.parse(xhr.responseText);

    // innerHTMLは意図せずインジェクションするかもしれないのでinnerTextで回避
    document.getElementById("resp").innerText = xhr.responseText;
  }
}
xhr.send();
```
Maildir形式で運用する2つの方法


届いたメールを /var/mail/username ではなく /home/username/Maildir/ に保存したい。
今までコピペでやってきたがようやく理解してきた。 
環境: ubuntu14.04.1

# 方法1 : procmailを使わない

* [PostfixBasicSetupHowto - Community Help Wiki](https://help.ubuntu.com/community/PostfixBasicSetupHowto)


```diff:/etc/postfix/main.cf
- #mailbox_command = procmail -a "$EXTENSION"
+ mailbox_command =
+ home_mailbox = Maildir/
```

# 方法2 : procmailを使う


```diff:/etc/postfix/main.cf
  mailbox_command = procmail -a "$EXTENSION"
+ home_mailbox = Maildir/
```

```diff:/etc/procmailrc
MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
```

# 動作テスト

```bash:動作テスト
mkdir -p $HOME/Maildir/new
mkdir -p $HOME/Maildir/cur
mkdir -p $HOME/Maildir/tmp

sudo service postfix restart

date | mail `whoami`
find $HOME/Maildir
mutt -f $HOME/Maildir
```
定期的にランダムな背景色の画像をつくる

定期的にランダムな背景色の画像を一定数つくりたかった。
ImageMagick と Zsh を使った。
ここでは 1.jpg - 10.jpg までの 10 枚の画像ファイルを 5 秒おきに作っている。

```zsh
while true; do
    for x in {1..10}; do
        r=$(( RANDOM % 128 ))
        g=$(( RANDOM % 128 ))
        b=$(( RANDOM % 128 ))
        convert -size 160x120 xc:#`printf '%02x' $r``printf '%02x' $g``printf '%02x' $b` $x.jpg
    done
    sleep 5;
done
```
Pecoでちょっとリッチなgitブランチ選択


Pecoが流行っているので使ってみたらよい感じだったので開始してみました。

以下のブログを参考にさせてもらいつつちょっとリッチな表示をするブランチ選択機能です。
* [pecoで最近更新されたブランチにcheckoutする](http://shibayu36.hatenablog.com/entry/2014/07/26/151106)


```bash:~/.zshrc
function peco-gitbranch() {
    local current_buffer=$BUFFER

    # commiterdate:relativeを commiterdate:localに変更すると普通の時刻表示
    local selected_line="$(git for-each-ref --format='%(refname:short) | %(committerdate:relative) | %(committername) | %(subject)' --sort=-committerdate refs/heads refs/remotes \
        | column -t -s '|' \
        | peco \
        | head -n 1 \
        | awk '{print $1}')"
    if [ -n "$selected_line" ]; then
        BUFFER="${current_buffer} ${selected_line}"
        CURSOR=$#BUFFER
        # ↓そのまま実行の場合
        #zle accept-line
    fi
    zle clear-screen
}
zle -N peco-gitbranch
bindkey '^x^b' peco-gitbranch
```


上記コマンドを.zshrcに入れておくことで、```git checkout```まで打ったあと、```^x^b```をローカルブランチ、リモートブランチの一覧を詳細(最終更新日時、コミッター、コミットタイトル)付きで表示してpecoに渡します。あとは、絞り込みをして決定。 diffなどにも使えるようにコマンド自体はなかに書いてません。
gem  をクリーンにする。

gem help uninstall を見ていた。
インストールされた gem をワンコマンドでアンインストールする方法を 1 つ思いついた。
(もっとよいオプション指定の組み合わせがあるかもしれないが、これで一応目的は達成できる)

~~~
$ gem uninstall -I -a -x --user-install --force
~~~

上の実行後 gem list すると、こうなる。

~~~
$ gem list
*** LOCAL GEMS ***

bigdecimal (1.2.4)
io-console (0.4.2)
json (1.8.1)
minitest (4.7.5)
psych (2.0.5)
rake (10.1.0)
rdoc (4.1.0)
test-unit (2.1.2.0)
~~~

ここからは 次のようにして、 rails 用の gem 環境を再構築する。
 
~~~
$ gem install bundler
$ rm Gemfile.lock
$ bundle install
~~~

必要に応じて次も実行するとよい。

~~~
$ gem update --system
$ gem update
$ gem cleanup
~~~
 
追記： 2017-06-25
こんなスクリプトを見つけた。
- https://gist.github.com/IanVaughan/2902499 Uninstall all rbenv gems

追記: 2021-05-05
こんな記事をみつけた。
- https://stackoverflow.com/questions/57306611/  Rails: How can I remove default version of bundler?
i386-elf用クロスコンパイル環境構築


参考
http://wiki.osdev.org/GCC_Cross-Compiler
http://memo.saitodev.com/home/arm/arm_gcc_newlib/

`$HOME/opt/cross`以下にnewlibを使ったi386-elf用のクロスコンパイル環境を構築する。

# 環境変数用ファイル作成

環境変数用ファイル`cross_env`(名前は何でも良い)を作成して読み込んでおく。

```bash
$ cat cross_env
export PREFIX="$HOME/opt/cross"
export TARGET=i386-elf
export PATH="$PREFIX/bin:$PATH"

$ source cross_env
```

# Binutils

```bash
$ cd $HOME/opt/cross/src
$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.24.tar.bz2
$ tar xf binutils-2.24.tar.bz2
$ mkdir build-binutils
$ cd build-binutils
$ ../binutils-2.24/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-werror
$ make
$ make install
```

# GCC

ビルドに必要なパッケージをインストール

```bash
# Ubuntuの場合
$ sudo aptitude install libmpc-dev libmpfr-dev libgmp-dev
```

```bash
$ cd $HOME/opt/cross/src
$ wget http://ftp.gnu.org/gnu/gcc/gcc-4.9.1/gcc-4.9.1.tar.bz2
$ tar xf gcc-4.9.1.tar.bz2
$ mkdir build-gcc
$ cd build-gcc
$ ../gcc-4.9.1/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers
$ make all-gcc
$ make install-gcc
```

# newlib

```bash
$ sudo aptitude install newlib
$ cd $HOME/opt/cross/src
$ cp /usr/src/newlib/newlib-2.1.0.tar.xz ./
$ tar xf newlib-2.1.0.tar.xz
$ mkdir build-newlib
$ cd build-newlib
$ ../newlib-2.1.0/configure --prefix="$PREFIX" --target=$TARGET
$ make
$ make install
```

# GCC(2回目)

```bash
$ cd $HOME/opt/cross/src
$ mkdir build-gcc-with-newlib
$ cd build-gcc-with-newlib
$ ../gcc-4.9.1/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --with-newlib --enable-interwork --enable-multilib --disable-shared --disable-thread
$ make
$ make install
```
AngularJSで便利なChromeデバッグTips

## 

AngularJSでAPLを作る際に、Chrome開発者ツールのコンソールで使える小技のお話.

Chromeの開発者ツールでは、のElementペインで最後に選択した要素は、コンソールから、`$(0〜4の番号)` で参照できる.
例えば、直前に選択したDOM要素は、`$0` だ。

AngularJSのオブジェクトは`angular.element`から辿ることが出来るので、直前に開発者ツールのElementペインで選択していた要素に紐づくScopeを取得するには、下記をコンソールで実行すればよい.

```js:$0のscopeを取得
angular.element($0).scope()
```

`$apply` を使えば、コンソールからの値書き換えも出来る.

```js:scopeの値を変更&画面へ反映
(s=angular.element($0).scope()).$apply(function(){s.foo='new Value!';});
```


DOMからは、`$injector` にもアクセス出来るので、任意のサービスをコンソールから呼び出すことも出来る.

```js:任意のServiceを取得
angular.element($0).injector().get('サービス名')
```

また, jQueryも併せて利用している場合, 上記のscope取得等は、下記まで短縮して書くことが可能.

```js
$($0).scope()
```


## 参考
http://www.linkplugapp.com/a/484338?utm_content=bufferf187d&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer
C++11 テンプレートパラメータに依存する基底クラスメンバのunqualified name lookupからの除外

[N3337](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf)(pdfファイル)14.6.2 Dependent namesの第3段落によれば
In the definition of a class or class template, if a base class depends on a template-parameter, the base class
scope is not examined during unqualified name lookup either at the point of definition of the class template
or member or during an instantiation of the class template or member.

従って、次のコードは意図した通りに動作しない。

```cpp
template<typename T> struct foo{using type = T;};
template<typename S> struct hoge : foo<S>{
  using type2 = type;
};
```

こう書いた時、hogeのスコープ内の定義が参照でき、`type2 = typename foo<T>::type`となると期待するが、上に引用した規格から、foo<T>内はunqualified name lookupされず、typeはhogeが定義されている名前空間やグローバル名前空間から探される。

上の様な場合だと意図した通りに動いてくれてもいいじゃないかとも思うが

```cpp
template<typename T> struct hoge : T{
  using type2 = type;
};
```
だと特殊化しないとtypeを探せないのは明らか。

もちろん、元の例で

```
using type2 = foo<T>::type;
```

とすれば、正しく働く。

しかしながら、基底クラス名を複雑なメタ関数の組み合わせで導出する時は、基底クラス名を書く
のが大変な時もある。
デフォルトテンプレートパラメーターに基底クラス名を隠せば多少改善する。

```cpp
template<typename T, typename Base = complex meta expression>
struct hoge : Base{
  using type2 = Base::type;
};
```

それでも、基底クラスからたくさんのtypedef名を派生クラスのスコープにもって行きたい時などはとてもださいコードを書かなくてはならない。

また、パラメーターパックを使う時は上の方法はたいてい問題がある。

情けなくもこの程度の事に引っかかって時間を食ったので、記しておく。
【JS】smash

複数のjavascriptを１つにまとめる「smash」を紹介。

smashの開発者はd3.jsの生みの親mbostockさんで，
d3.jsのビルド時にも利用されているようです。

smashは，簡単にいうと次のような事が出来ます。

* helloJS.js
<pre>
var helloJS = function(){
   return "Hello Javascript!!";
};
</pre>
* main.js
<pre>
import "helloJS";
window.console.log(helloJS());
</pre>
* smashコマンド実行
<pre>
# smash main.js
</pre>
* 出力結果
<pre>
var helloJS = function(){
   return "Hello Javascript!!";
};
window.console.log(helloJS());
</pre>

そう！Javascriptでimportが出来るのです！

これを使えば，jQueryのように，わざわざintro.jsとかoutro.jsとか作らなくても
個別のファイルで実装したモジュールを即実行無名関数でまとめる事が出来ます。

smashは，gruntのパッケージも存在するので，結合処理を自動化する事も出来ます。
https://github.com/cvisco/grunt-smash

ただ，smashは，

* import記述部はindent使えない(必ず左端から書く)
* 同じファイルは取り込めない
* jsファイル自体に「import」とかくので，必ずsmashでビルドを行う必要がある

等，使いづらい所もあります。
Ansible で EC2 のインスタンスを生成する

やりたいこと
===========
Provisioning できる Ansible で、EC2 のインスタンスを生成したかったが、ちょっとはまったのでメモ。
基本的にはページしたの参考そのまま。

とりあえず作成までなので、Console から止める必要があるので注意。

インストール & セットアップ
========================

インストールとかディレクトリ作成とか
--------------
```bash
brew install ansible
sudo pip install boto
sudo mkdir /etc/ansible/
```

ファイル作成
----------
* /etc/ansible に 127.0.0.1 を追加
* ~/.boto に下記追加

```text
[Credentials]
aws_access_key_id = [your access key id]
aws_secret_access_key = [your secret access key id]
```

playbook 作成
=============

ec2factory.yml がテンプレ、 values.yml が個別設定

ec2factory.yml
--------------
```yaml
- hosts:
  - 127.0.0.1
  connection: local
  gather_facts: False
  vars_files:
    - values.yml
  tasks:
    - name: Provision a set of instances
      local_action: ec2
          keypair={{keypair}}
          group={{group}}
          instance_type={{instance_type}}
          image={{image}}
          region={{region}}
          wait={{wait}}
          instance_tags='{"Name":"ansibled"}'
      register: ec2
```

values.yml
----------
ここがハマった。どれがどれかわからなかった。

```yaml
---
  image: ami-a1124fa0     [Launch Instance で AMIを選ぶときの ID]
  instance_type: t2.micro [Instance Type]
  keypair: mypair         [EC2 -> Key Pair で Key Pair Name]
  group: securitygrp      [EC2 -> Security Gruop の Group Name]
  region: ap-northeast-1  [EC2 のリージョン]
  wait: true
```

実行
===

```bash
ansible-playbook makeec2.yml -i /etc/ansible/hosts
```

inventory が見つけてくれなかったので -i で追加

参考
====
http://open-groove.net/ansible/create-ec2-instances/
Stormのlogviewerコマンドについて

# storm logviewer コマンド調査

storm コマンドにはlogviewerというstormの出力するログファイルを任意のポート(`logviewer.port`で指定。デフォルト8000。)経由でHTTP公開するという機能がある。

利用方法はとても単純で以下のようにstormクラスタ側のホストで実行するだけ。
(もちろん、stormコマンドは実運用と同じ設定を参照するようになっている前提。  ) 

```bash:bashコマンド例
$ sudo storm logviewer
```

`storm logviewer`コマンドを実行しているホストに対して、ブラウザ等で以下のようなURLでアクセスするとログファイルが見える。

`http://<storm_logviewer_host>:<logviewer.port>/log?file=<file名>&tail=<数字>&grep=<文字列>`

file,tail,grepのqueryオプションで制御が可能。

* fileにて探索するファイルを指定。fileの探索ディレクトリは`logback/cluster.xml`中の任意のappenderのfileのディレクトリを指定することができる。(`logviewer.appender.name`で指定。デフォルトはA1)

  + A1のデフォルトディレクトリは`${storm.home}/logs/`。

* tailで表示するファイル末尾のbyte数を指定できる。行数ではなく純粋なファイル末尾からのバイト数として解釈される。
* grepに文字列を指定するとmatchした行だけ表示される。Javaの`String#contains()`メソッドで評価されるだけ。tailで指定された範囲にのみ適用される。

tailとgrepは省略可能。

# 結論

まあ、ansibleとか使うので別になくてもなんとかなるな、という印象。
セキュリティ的な面など問題ないかちゃんと調査したわけではないので自己責任で..。
Sublime Text2 | SublimeBrainfuck Plugin で Brainf*ck をシンタックスハイライトする

# Sublime Text2 | SublimeBrainfuck Plugin で Brainf*ck をシンタックスハイライトする

## 概要
SublimeBrainfuck Plugin で Brainf*ck をシンタックスハイライトする

## インストール
Package Control で 「Brainf」 で検索し、

https://github.com/Drako/SublimeBrainfuck

をインストールします。

## 確認要コード

~~~
++++++++++[>++++++++++<-]>
++++;init by h
.; output h
+++++++.; output o
--------.; output g
--.; output e
+++.; output h
-------.; output a
++++++.; output g
--.; output e
+++.; output h
+.; output i
--.; output g
--.; output e
~~~

## 表示確認

こんな感じに表示されます

![brainf_highlight.png](https://qiita-image-store.s3.amazonaws.com/0/43480/17e0d633-1143-f2ec-3fd7-84b498081a67.png)

## 参照
https://github.com/Drako/SublimeBrainfuck
du っぽいコマンド

# 成果物
Windows 7 上で du っぽい表示をするバッチファイルを作成した

## 使用上の注意
* 文字コードはおそらく `Shift_JIS` 固定が安全 (`cmd` の場合)
* 表示単位は byte のみ
* 限られた環境でしか動作チェックしてません

## ｿｰｽ
```bat:du.bat
@echo off

@rem du ぽいもの

if "%1" equ "/?" (
  @rem USAGE
  echo du [/s] [対象ディレクトリ]
  echo /s サブディレクトリ全てを対象にする (s は小文字限定^)
  echo 対象ディレクトリ の指定がない場合、カレントを対象にする

  exit /b 0
) else if "%1%2" equ "/s" (
  SET _SUB_=TRUE
  SET _TARGET_=.
) else if "%1" equ "" (
  SET _SUB_=FALSE
  SET _TARGET_=.
) else if "%1" equ "/s" (
  SET _SUB_=TRUE
  SET _TARGET_=%2
) else (
  SET _SUB_=FALSE
  SET _TARGET_=%1
)


if not exist "%_TARGET_%" (
  echo "%_TARGET_%" is not exists.
  exit /b 1
)


setLocal enableDelayedExpansion

if %_SUB_% equ TRUE (
  for /f "useBackq  tokens=*" %%y in (`dir /ad-L /b %_TARGET_%`) do (
    set _DIR_=%_TARGET_%\%%y

    dir /s /a-d "!_DIR_!" > nul 2> nul
    if errorLevel 1 (
      echo "!_DIR_!"  is empty.
    ) else (
      for /f "useBackq tokens=3" %%x in (`dir /s /a-d "!_DIR_!" ^| findstr /e バイト`) do (
        set DIR_RECURSIVE_SIZE=%%x
      )
      echo "!_DIR_!"  !DIR_RECURSIVE_SIZE! (bytes^)
    )
  )
) else (
  @rem ↑と共通箇所を分かりやすくするためインデント
    set _DIR_=%_TARGET_%

    dir /s /a-d "!_DIR_!" > nul 2> nul
    if errorLevel 1 (
      echo "!_DIR_!"  is empty.
    ) else (
      for /f "useBackq tokens=3" %%x in (`dir /s /a-d "!_DIR_!" ^| findstr /e バイト`) do (
        set DIR_RECURSIVE_SIZE=%%x
      )
      echo "!_DIR_!"  !DIR_RECURSIVE_SIZE! (bytes^)
    )
)

exit /b 0
```

のように呼び出す形に書くと

`call :__function` で呼んだサブルーチンの先では、引数を DelayedExpansion できてなかった。
`%%y` を遅延展開させる書き方があるのだろうか・・・？


## 細かい箇所が微妙
* 命名とか大文字/小文字とかの規約が謎
* `dir /s /a-d "!_DIR_!"` の内容を `tail -1` するために、1行ずつ変数に入れては上書きを繰り返す、という不毛な記述が必要
* ディレクトリが空なら `0 bytes` 表示で別に良かったのだけれど、空ディレクトリの場合に出る警告「ファイルが見つかりません」を捨てる手段がよく分からず・・・
* 存在しないオプションが渡されることを考慮していない
【Windows】バッチファイルのコマンドライン引数

# コマンドライン引数

|引数|説明|
|:-----|:----------------|
|%0    |バッチファイル名  |
|%1～%9|1番目～9番目の引数|
|%*    |すべての引数     |

# ループ処理

コマンドライン引数を順に出力。

**●スマートな方法**

※ngyukiさんから頂いた情報。

```bat
@echo off

for %%f in (%*) do (
  echo %%f
)
```

**●別の方法**

```bat
@echo off

:loop

if "%~1" == "" goto end

echo %1

shift

goto loop

:end

pause
```

※"%~1" は全ての引用符(")を削除して展開する。
※shift はバッチパラメータを一つ繰り上げる。

## ファイルのドラッグ＆ドロップ

エクスプローラ上で、複数のファイルをバッチファイルにドラッグ＆ドロップすることで、
それらのファイル名がバッチファイルに渡される。
上記ループ処理を使って、ファイルごとに処理を行える。

# 参考サイト

http://ykr414.com/dos/bat.html

http://refluxflow.blogspot.jp/2007/08/blog-post.html
mecab Web API な Docker コンテナを作る

概要
=====
JSON でリクエストすると mecab パースして結果を JSON で返してくれる、シンプルな WEB API サーバーを Docker コンテナとして構築します。

製作手順としての Dockerfile をご参照ください。

関連記事
-----
http://qiita.com/rerofumi/items/66be3c55405e03dbdcf0

製作の経緯
=====
mecab を使うのに mecab-ruby バインドを利用していたのですが、この ruby がビルドできる環境がイマイチシビアなようで動く版動かない版とかがあって環境とバージョンを探すのに苦労していました。
また、mecab 自体 cygwin でビルドするのに骨が折れたりとか、Linux 以外の環境で扱うのにずいぶん苦労した記憶があります。

こういったバージョン合わせの苦労から逃れるために「バインドは libmecab を直接操作できる go にする」とか「HTTP&JSOC経由でどの環境からも利用できるサーバー型インタフェースにする」といった事をめざすことにしました。

そして出来上がった環境を使い続けたり、メンテナンスを簡易にするため Docker コンテナにするというのが、今回のチャレンジになります。


使い方
=====

ベースにする Docker image
-----
Debian:jessie を使います、
```docker pull debian```
なりでイメージを pull しておいてください。

コンテナの作成
-----
下記の Dockerfile をファイルとして作成しておいて、それが存在するディレクトリで
```docker build -t [タグ名] .```
としてコンテナをビルドしてください。

サーバー(コンテナ)の起動
-----
コンテナの webmecab を起動すると、サーバーとして動作します。
```docker run -d -p 80:80 -t [タグ名] webmecab -p 80```
ポート指定はお好きなように。

Dockerfile
=====
```docker:Dockerfile
FROM debian:jessie
MAINTAINER rerofumi

RUN apt-get update
RUN apt-get -y upgrade
RUN apt-get -y install wget g++ make golang mercurial

RUN cd /root; wget https://mecab.googlecode.com/files/mecab-0.996.tar.gz
RUN cd /root; wget https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz

RUN mkdir -p /root/go/src
RUN mkdir -p /root/go/bin
ENV GOPATH /root/go
ENV PATH $PATH:/root/go/bin

# --- mecab install
RUN cd /root; \
    tar xvf mecab-0.996.tar.gz; \
    cd /root/mecab-0.996; \
    ./configure --enable-utf8-only; \
    make; \
    make install

RUN echo '/usr/local/lib' > /etc/ld.so.conf.d/mecab
RUN ldconfig

# --- mecab dic
RUN cd /root; \
   tar xvf mecab-ipadic-2.7.0-20070801.tar.gz

RUN cd /root/mecab-ipadic-2.7.0-20070801; \
    ./configure --with-charset=utf8; \
    make; \
    make install

# --- mecab server
run cd /root; \
	go get bitbucket.org/rerofumi/webmecab

EXPOSE 80
CMD ["/bin/bash"]
```
hub コマンドチートシート

# hub コマンドとは
* git コマンドをラップして GitHub をより使いやすくするコマンドラインツール

## インストール方法 (Mac)
```bash
$ brew install hub
```

# 便利な hub コマンド一覧
* 個人的には、作成済みの issue を pull request にするのに一番良く使うが、他にも便利コマンドがある

```bash
# issue を pull-request にする
$ hub pull-request [branch name] -i [isuue id]

# CI の結果を表示
$ hub ci-status

# 今いるレポジトリをブラウザで開く
$ hub browse

# クローン
$ hub clone [user]/[repo]

# 現在のトピックブランチと master との差分を表示する Github ページを開く
$ hub compare

# ヘルプ
$ hub help

```

# エイリアス設定
* 使っているシェルの設定ファイル(.bash_profile)に以下を追加すると、上記コマンドで hub としていたところを git として使える

```bash:.bash_profile
eval "$(hub alias -s)"
```

# 参考
* GitHub 実践入門
* https://github.com/github/hub
dockerのコンテナにsshしたい

# dockerのコンテナにsshしたい
CoreOSを使ってみて非常に思ったのはコンテナにsshしたい！　ということ。
sshd立ててー　とやっていけばできることはできるのですが、**それは面倒**

## ssh じゃないけど便利な奴がいる！
[Dockerコンテナに入るなら SSH より nsinit が良さそう](http://mizzy.org/blog/2014/06/22/1/)
を見つけて、これは便利そう！！　という事で早速やりたい訳なんですが、

**Q. CoreOSに入ってるの？**

**A. 入っていません**

## nsenter
どうも上記ページに記述がある**nsenter**は入っていたので、これを使ってみる事に。

```bash:nsenter.sh
# !/bin/sh

PID=`docker inspect --format {{.State.Pid}} $1`
sudo nsenter --target $PID --mount --uts --ipc --net --pid
```

```/bin/sh
$ docker ps
CONTAINER ID     IMAGE          COMMAND     CREATED        STATUS     
4e764775028b     ubuntu:14.04   /bin/bash   21 hours ago   Up 21 hours  

$ ./nsenter.sh 4e7
```
終わり。簡単！
macでgem updateしたらエラーになったので、vagrantを使った

# ことの経緯  
1. Vagrantで今まで開発をしていた。  
2. Herokuにデプロイしたいものがあった。  
3. Heroku Toolbeltを入れる必要があるのに、vagrantでできるのか？という疑問からローカルマシンのMAC10.9.14で開発しようと思った。  
4. MacにrbenvでRubyを入れたりbundle installでRails入れたりしていたのだが、nokogiriを入れろとなった時に詰んだ。(Marvericksのバグらしい)　　

## ローカルに入れたい人はこちら  
1. 一気に複数個のエラーが発生。エラー名で調べたりしたがよくわからなかったのだが、gem updateしてもダメで、sudoつけたりしたがそれでも出来なかった。そこで質問したところ、_Building native extensions._ に関しては、xcodeのcommand line toolを入れたらいいというのを聞いたので、[これを参考に](http://qiita.com/yuku_t/items/30015dba2b6497b80074)入れた。  
2. もう一度sudo gem installをするとインストールできるようになる。  

## もっと便利にという人はこちら  
#### vagrantの機能で、共有ファイルを使えば、_vagrant ssh_しなくても、ローカルからvagrantのファイルをいじれるというやつを使います。  
1. ローカルで、vagrantfileがあるディレクトリまで移動。  
2. そこにvagrantと共有したいディレクトリやファイルを設置  
3. 以上  

- _$ vagrant ssh_でvagrantに入って、_$ cd /vagrant/_でvagrantに移動して、_$ ls_すると、先ほどローカルで入れたディレクトリがある。  

私は、vagrantでgemを_bundle update_,_bundle install_,_bundle exec rails s_用途に使い、ローカルで開発して、ブラウザを更新して確認する。okならば、ローカルでheroku createしてgit push -u origin masterでherokuにアプリを上げている。  
ローカルで開発するメリットは、mac用のテキストエディタやIDEを利用できるということが大きいと思う。
SwiftのPOSIX APIでcat(1)を書く

SwiftはPOSIX APIもわりとそのまま呼べたり、ポインタも( **Unsafe** とかついているので恐ろしい感じはしますが）かなりいい感じに扱えたりします（cf. [Swift - UnsafePointerと上手に付き合う](http://qiita.com/dankogai/items/2d19b8352183cca3461f)）。

なので、POSIXのAPIだけを使ってファイルを扱うのも簡単です。ことによるとObjective C系のAPIを使うよりも簡単かもしれません。

OSX/iOS系のツールはいままでRubyで書かれることが多かったのですが、POSIX/Foundation/Cocoaをそのまま使えてかつスクリプト言語のように使えるSwiftでコマンドラインツールを書くようになるかもしれないですね。

そいういうわけで、手始めにcat(1)を実装してみました。

```swift
#!/usr/bin/xcrun swift
// スクリプト言語のようにshebangを使える！

import Foundation

let files = Process.arguments[1 ..< Process.arguments.count]

// RAIIでfopen()/fclose()するためのラッパークラス
class File {
  let fp : UnsafeMutablePointer<FILE> 

  init(_ filename: String, _ mode: String) {
    fp = fopen(filename, mode)
  }

  deinit {
    fclose(fp)
  }
}

for file in files {
  let f = File(file, "r")
  if f.fp == nil {
    // string interpolationがあるのでperror()が簡単に使える！
    perror("Can't open \(file)")
    continue
  }

  // BUFSIZなどのマクロもある。ただし型変換を明示的にしないといけない
  var buf = Array<CChar>(count: Int(BUFSIZ), repeatedValue: 0)

  // Int <-> Boolの変換はないのでfoef() -> Intはちょっと面倒
  while feof(f.fp) == 0  {
    // UIntへの変換が煩雑なことを除くとほぼCそのままで書ける
    let nRead = fread(&buf, UInt(sizeof(CChar)), UInt(buf.count), f.fp)
    fwrite(&buf, UInt(sizeof(CChar)), nRead, stdout)
  }
}

// vim: set tabstop=2 shiftwidth=2:
```
Hubot | HubotのScriptを自作する - デスマコロシアムのURLを返却するScript

# Hubot | HubotのScriptを自作する - デスマコロシアムのURLを返却するScript

## 概要
HubotのScriptを自作します。

デスマコロシアムのURLを出力してみたいと思います。
※デスマコロシアムは私がCodeIQで出題している問題です

HubotのScript作成に関する公式資料はこちら。

https://github.com/github/hubot/blob/master/docs/scripting.md

Scriptは JavaScript か CoffeeScript で書いて
%your_bot%/scripts 配下に保存すれば利用できます。

## hear と respond

Hubot は入力文字列に反応してレスポンスを返しますが、
hear は宛先を問わずレスポンスし、
respond はHubot宛のメッセージのみにレスポンスします。

## 自作スクリプト

・ hubot deathmaN で第N回デスマコロシアム問題へのURLを出力。
・ hubot deathma? で最新のデスマコロシアム問題へのURLを出力。
・ 山川 に対して 豊（稲中参照） を出力。
・ ファイル名は deathma.coffee

~~~coffee
module.exports = (robot) ->
  deathmas = [
    "https://codeiq.jp/ace/tbpgr/q791",
    "https://codeiq.jp/ace/tbpgr_colosseum_manager/q835",
    "https://codeiq.jp/ace/tbpgr_colosseum_manager/q872",
    "https://codeiq.jp/ace/tbpgr_colosseum_manager/q915",
    "https://codeiq.jp/ace/tbpgr_colosseum_manager/q969"
  ]

  robot.respond /deathma(\d+)/i, (msg) ->
    deathma_no = parseInt(msg.match[1]) - 1
    if deathma_no >= deathmas.length
      return msg.send "no deathma"
    msg.send deathmas[deathma_no]

  robot.respond /deathma\?/i, (msg) ->
    msg.send deathmas[deathmas.length - 1]

  robot.hear /^山川$/i, (msg) ->
    msg.send "豊（稲中参照）"
~~~

## Shell Adapter で自作した Script を試す

~~~bash
$ bin/hubot
Hubot> 山川
Hubot> 豊（稲中参照）
Hubot> hubot deathma1
Hubot> https://codeiq.jp/ace/tbpgr/q791
Hubot> hubot deathma2
Hubot> https://codeiq.jp/ace/tbpgr_colosseum_manager/q835
Hubot> hubot deathma3
Hubot> https://codeiq.jp/ace/tbpgr_colosseum_manager/q872
Hubot> hubot deathma4
Hubot> https://codeiq.jp/ace/tbpgr_colosseum_manager/q915
Hubot> hubot deathma5
Hubot> https://codeiq.jp/ace/tbpgr_colosseum_manager/q969
Hubot> hubot deathma6
Hubot> no deathma
Hubot>
Hubot> hubot deathma?
Hubot> https://codeiq.jp/ace/tbpgr_colosseum_manager/q969
~~~

## 参照
* Hubot GitHubの Scriptingの説明ページ
    https://github.com/github/hubot/blob/master/docs/scripting.md

* 当記事のサンプルコードをGitHubにアップしました
    https://github.com/tbpgr/hubot_scripts

* デスマコロシアム

|--|URL|
|:--|:--|
|第1回デスマコロシアム|https://codeiq.jp/ace/tbpgr/q791|
|第2回デスマコロシアム|https://codeiq.jp/ace/tbpgr_colosseum_manager/q835|
|第3回デスマコロシアム|https://codeiq.jp/ace/tbpgr_colosseum_manager/q872|
|第4回デスマコロシアム|https://codeiq.jp/ace/tbpgr_colosseum_manager/q915|
|第5回デスマコロシアム|https://codeiq.jp/ace/tbpgr_colosseum_manager/q969|
|デスマコロシアムまとめ記事|http://d.hatena.ne.jp/tbpg/20140517/1400291776|
XCTestのAssert一覧

Assertの一覧

XCTestを利用した際、使用できるAssertの一覧がすぐに分かるようにまとめてみました。

| Assert | 説明 |
|:------------|:------------|
| XCTFail(format...) | 必ず失敗する |
| XCTAssertNil(X, format...) | X が nil であることをチェックする |
| XCTAssertNotNil(X, format...) | X が nil でないことをチェックする |
| XCTAssert(expression, format...) | expression が YES であることをチェックする |
| XCTAssertTrue(expression, format...) | expression が YES であることをチェックする |
| XCTAssertFalse(expression, format...) | expression が NO であることをチェックする |
| XCTAssertEqualObjects(X, Y, format...) | X と Y のオブジェクトの内容を比較し、同じであることをチェックする |
| XCTAssertNotEqualObjects(X, Y, format...) | X と Y のオブジェクトの内容を比較し、違いがあることをチェックする |
| XCTAssertEqual(X, Y, format...) | X と Y を比較し、同じであることをチェックする。int等のスカラー型や構造体などに使用する |
| XCTAssertNotEqual(X, Y, format...) | XとYを比較し、違いがあることをチェックします。int等のスカラー型や構造体などに使用する |
| XCTAssertEqualWithAccuracy(X, Y, accuracy, format...)	| X と Y を比較し、accuracy 以内の差に収まっていることをチェックする |
| XCTAssertNotEqualWithAccuracy(X, Y, accuracy, format...) | X と Y を比較し、accuracy より差が大きいことをチェックする |
| XCTAssertThrows(expression, format...) | expression で 例外が発生することをチェックする |
| XCTAssertThrowsSpecific(expression, specificException, format...) | expression で特定のクラス(specificException)の例外が発生することをチェックする |
| XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...) | expression で特定のクラス(specificException)の例外が特定の名前(exception_name)で発生することをチェックする|
| XCTAssertNoThrow(expression, format...) |expression で 例外が発生しないことをチェックする |
| XCTAssertNoThrowSpecific(expression, specificException, format...) | expression で特定のクラス(specificException)の例外が発生しないことをチェックする |
| XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)	| expression で特定のクラス(specificException)の例外が特定の名前(exception_name)で発生しないことをチェックする |

◆ 参考書籍
[iOSアプリ開発自動テストの教科書〜XCTestによる単体テスト・UIテストから、CI/CD、デバッグ技術まで](https://amzn.to/361vehY)