OmniAICreator/Qiita-1.07M huggingface dataset:
gitでVisual Studioのプロジェクトファイルを共有する

プロパティーシートの紹介記事。

Visual Studioにおいて、プロジェクトファイル（拡張子.vcxproj）は、makefileのようなもので、何をコンパイルしどのようにリンクするか、といった情報が書かれている。
ただ、外部のライブラリを用いて開発するときなど、他のディレクトリに対する絶対パスをこのプロジェクトファイルに書きたいときには、このプロジェクトファイルをそのままGitで共有する訳にはいかない（全員が同じパスにライブラリを置くなら別だが）。
昔のVisualStudioでは、VisualStudioで扱う全てのプロジェクト共通のインクルードパス設定があり、それを使えばよかったのだが、現在は推奨されず設定画面がない。

今では何を使うべきか調べたところ、「ユーザープロパティシート」なるものを使えば良いことが分かった。
全員で共有すべき情報（例：コンパイルすべきファイルの指定）はプロジェクトファイルに残し、ユーザー依存の情報だけをプロパティーシートに追い出す。
プロパティシートをプロジェクトファイルから参照するように設定した状態でプロジェクトファイル自体はgitで共有、プロパティシートはその雛形をgit以外の方法で共有し、各自プロジェクトのフォルダに突っ込んだ後、各自の環境に合わせて書き換えてもらう。
こうすることで前述の目的は達成できる。

実際の手順に関しては検索すれば見つかるので簡潔に紹介するに留める。
以下で紹介するのはVisual Studio 2013のものである。ある程度新しいものなら同様であろうが、詳しくは知らない。

- [表示]>[その他のウインドウ]から[プロパティマネージャ]を選び、プロパティマネージャを表示させる。
- プロパティマネージャの[Debug | Win32]などのフォルダを右クリックし、[新しいプロパティシートの追加]を選び、適当なファイル名を付けて追加する。
- 新しく出来たプロパティシートをダブルクリックで開き、プロジェクトに対して設定するのと同じように、必要なユーザー依存の情報を記述していく。
  + この際、「ユーザーマクロ」という環境変数のような機能を用いると、各自が何を指定すれば良いのか分かりやすくなる。
  + ユーザーマクロを追加する際には「ビルド環境でこのマクロを環境変数に設定します」にチェックを入れる。
- プロパティシートの中ではデバッグ用/リリース用といった切り替えは出来ない。デバッグ用/リリース用/共用の3種分のプロパティシートを作るなどすればよい。
Windows版vagrantの起動時にhostsでPermission deniedになる件の対策

思い出したころにvagrant upしようとすると、起きなくなっていることがあります。

管理者権限のPowerShellやCMDから起動しているのに(以前は起動していたのに)DNSの設定ができないというだけで、全てがままならない状況でした。

```lang:エラー内容
==> default: adding to (C:/WINDOWS/system32/drivers/etc/hosts) : 192.168.33.10  wordpress.local  # VAGRANT: 2ff7cf4b5937
c1d75349461cf6fc5b78 (default) / 1c5c4c7c-1f49-498c-9ce2-98da43b72b7e
C:/Users/***/.vagrant.d/gems/gems/vagrant-hostsupdater-1.0.1/lib/vagrant-hostsupdater/HostsUpdater.rb:85:in `initialize
': Permission denied @ rb_sysopen - C:/WINDOWS/system32/drivers/etc/hosts (Errno::EACCES)
```

vagrantのアンインストール→新規インストール等で治ることもあるようですが、いま1回起動してくれればいい！というときの応急処置をメモ。

#環境
- OS Microsoft Windows [Version 10.0.10586]
- Ruby ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32]
- Vagrant 1.8.1
- VirtualBox 4.4.34

※Windows10だと、VirtualBox 5.0のインストールに失敗するんですよね…。

# hostsへ手動で追記する
## 書き込む内容について

エラー文の中に含まれる設定値をコピーしておきます。
設定によって変わるので必ず確認を。

今回はVCCW( http://vccw.cc/ )を使っている為下記のとおり。

```lang:hostsへ追記する内容
192.168.33.10  wordpress.local  # VAGRANT
```

## 管理者権限で起動した「メモ帳」を使って、hostsを手動編集

Windows10での例）
スタートメニューを開いて「メモ」などと入力＞検索結果のメモ帳を右クリックして「管理者で実行」のうえ、hostsを開いてさっきの内容を新しい行に追記。

```lang:Windowsのhostsの所在
C:/WINDOWS/system32/drivers/etc/hosts
```

※「開く」ダイアログでは、ファイルの種類を「テキスト文書(*.txt)」から「すべての種類」に変更すること。

## CMD.exe等で、DNSをフラッシュする

```lang:cmd.exe
C:\xxx> ipconfig /flushdns

Windows IP 構成

DNS リゾルバー キャッシュは正常にフラッシュされました。
```

# vagrant up時にエラーを出力している部分を書き換え

※当方Rubyを扱ったことがありませんので、もっと良い方法がありましたらお知らせください。

C:/Users/***/.vagrant.d/gems/gems/vagrant-hostsupdater-1.0.1/lib/vagrant-hostsupdater/HostsUpdater.rb

85から87までの行頭に#をつけてコメントアウト

```lang:HostsUpdater.rb
 81       if !File.writable_real?(@@hosts_path)
 82         sudo(%Q(sh -c 'echo "#{content}" >> #@@hosts_path'))
 83       else
 84         content = "\n" + content
 85 #       hostsFile = File.open(@@hosts_path, "a")
 86 #       hostsFile.write(content)
 87 #       hostsFile.close()
 88       end
```
※2016/2/24現在、File.writable_realの結果がtrueでも書き込めない模様...？

あとは普通にvagrant upで無事起動しました。

# todo

**RubyInstallerでRuby2.2.4が提供されているようなのでアップグレードしてみる。**
~~(2016/2/26追記)Ruby2.2.4へアップグレードしたところvagrant up時にhostsへの書き込みができるようになりました。~~

一瞬動きましたが、数日後には動かなくなっておりました。
electronのインストールでコケた時の解決方法 on OS X

ちょっとelectronをさわってみようと思ってインストールコマンドを叩いたら、
エラーでコケてハマったので、その時の対処法をメモ。

ちなみにインストールがコケたのは、Mac OSX El Capitanです。

# 症状

```bash
sudo npm install -g electron-prebuilt
```

を走らせると、以下のようなエラーに遭遇

```bash
> electron-prebuilt@0.36.8 postinstall /usr/local/lib/node_modules/electron-prebuilt
> node install.js

Downloading electron-v0.36.8-darwin-x64.zip
[============================================>] 100.0% of 40.52 MB (281.37 kB/s)
/usr/local/lib/node_modules/electron-prebuilt/install.js:22
  throw err
  ^

Error: EACCES: permission denied, rename '/usr/local/lib/node_modules/electron-prebuilt/electron-tmp-download-15324-1456330921961/electron-v0.36.8-darwin-x64.zip' -> '/Users/******/.electron/electron-v0.36.8-darwin-x64.zip'
    at Error (native)
npm ERR! Darwin 15.3.0
npm ERR! argv "/usr/local/bin/node" "/usr/local/bin/npm" "install" "-g" "electron-prebuilt@0.36.8"
npm ERR! node v5.7.0
npm ERR! npm  v3.7.3
npm ERR! code ELIFECYCLE

npm ERR! electron-prebuilt@0.36.8 postinstall: `node install.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the electron-prebuilt@0.36.8 postinstall script 'node install.js'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the electron-prebuilt package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node install.js
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs electron-prebuilt
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls electron-prebuilt
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/******/npm-debug.log
```

# 解決方法
nodesとnamのバージョンが最新のものになるようにしつつ、インストールし直しをすれば良いらしい。
ということなので、nodejsのバージョンを最新のものにする。

管理が楽になるのでnを入れて、nで作業することにする。

```bash
npm install -g n
n latest
```

npmのアップデートは、npm自信で出来るので素直に以下の通り

```bash
npm update -g npm
```

んでもって、悪さしてそうな子を消して、npmのキャッシュクリア

```bash
rm -rf ~/.electron/
npm cache clear
```

最後に、npmのページにある通りにelectronのインストールコマンドを打ち直す

```bash
sudo npm install -g electron-prebuilt
```

これで私の環境ではうまくインストールすることができました！
js初心者のnode.js自習メモ（1）

#家でやるための準備
##Linux環境を立ち上げる
###Why Linux?
コマンドラインツールや他言語（Pythonとか）そのうち使いたいので開発環境として。
方策はざっくり四つだ。
　1. LinuxブートできるPCを構築する
　2. Macを買う
　3. Raspberry Pi（Debian/Raspbian）を準備する
　4. Vmware Playerになんかのディストリビューションを突っ込む

初期投資が不要な4.を選んだ。OSはUbuntu。
導入説明は省略。それなりにマシンスペックがないと辛いかも。

中学生のときに自作PCをお小遣いとお年玉で組んで
LinuxをインストールしてNethackで遊んだの思い出した。
たしかVine Linux 2.1だったぞい。

WindowsからUbuntuにどうリモートアクセスしたらいいか思い出せない。
***
[VMware Player]https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/12_0
[Ubuntu]https://www.ubuntulinux.jp/download
ubuntu-ja-15.10-desktop-amd64を入れた
***
###node.jsのインストール
バージョン管理にnodebrewを使えみたいなのを何処かで読んだのでそれを使います。
現時点での最新の安定版v0.10.26をインストール。

```bash:installmemo
curl -L git.io/nodebrew | perl - setup
nodebrew install v0.10.26
#パスを.bashrcに書く
nodebrew use v0.10.26
console.log("hogehoge");
```
###Hello World
[Nodeビギナーズブック]http://nodebeginner.org/index-jp.html#javascript-and-nodejs
にしたがいhelloworldを書く。1年ぶりにvi使った。

```js:hw.js
var http = require("http");

http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello node!!");
  response.end();
}).listen(8888);
```

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/115000/2d2e9abe-1767-efb0-d7ba-d6be5fc2142b.jpeg)
見直したらアレンジしててHello worldじゃなかった。

###動作
nodeフレームワークにhttp（の何か?）をrequestする。変数httpに代入。
変数httpに関数createServer()があるので、port:8888でlistenするhttpサーバをインスタンス(?)する。（呼び方があってるか不安）
なぜか匿名関数（単に関数の名前をつけなくていいだけ?）で以下を行う。
　 ・ブラウザからのリクエストを受ける
　 ・プレーンテキストのヘッダを返す
　 ・文字列"Hello node!!"を返す
　 ・レスポンス終了

とりあえず終了もわからんので[Ctrl+C]でブッコロス（
###雑感
"."でがんがんクラスの関数とか使ってくるのでなるほどオブジェクト指向ってやつだなーって印象。
ブラウザのアクセス（リクエスト）があるまでプロセスは寝ててリクエストがあるときだけ動くらしい（＝イベント駆動）。
nodeが割り込みとかやってんのかな。（雑な予想）
シミュレータでもイベント駆動のほうが高速だし、チョットワカル。多分速いぞ。いらんところにCPUパワー使ってない。
###疑問
コールバックナンジャラホイ（後で調べる
なんでhelloworldごときに匿名関数を使ってくるのかちょっとワカラナイ。
いやCでもいきなりstdioライブラリ使うしそんな変わらんか？

```C:hw.c
#include <stdio.h>
int main(){
    printf("Hello, World.\n");
    return 0;
}
```

とりあえず昨日の勉強まとめ。
きょうはビギナーズブックを読み進める。
以上
AWS EC2にインスタンス一覧から選択してSSHできるスクリプトを作った

EC2 に SSH する度に AWS コンソールからインスタンスの詳細選んで Elastic IP をコピペしてキーファイルを指定して実行というのが怠いので便利スクリプトを作ってみた。

[続きは tilfin's note へ](http://tilfin.hatenablog.com/entry/2016/02/25/012841)
毎朝決まった時間にPC起動させpythonプログラムを実行する方法

毎朝前日の株価値動きを分析し、結果を自動でメールで送るプログラムを動かすため環境を整えてみました。
そのうちプログラムの自動起動ができるようになるまで、やったことをまとめます。



#手順
1.パーティション分けてUbuntuをインストール
2.ブートローダーでデフォルトの起動OSをUbuntuに
3.BIOSで毎朝指定時間に起動するよう設定
4.pythonを起動するシェルスプリクトを　/etc/profile.d/　に作成
5.実行後シャットダウンさせるシェルスクリプトをつくる
6.ファイルに実行権限を与える
7.通常起動のための設定

#実際の流れ
##パーティション分けてUbuntuをインストール
安定して動作させるために普段利用しているOSとわけています。
Gpartedをつかってデータ保存用に使っていた2TBのハードディスクから200GBほどUbuntuインストールように分けました。
（※既にデータのは入っているHDDのパーティション分割はデータ破損の危険があるので要注意です）

Ubuntu   https://www.ubuntulinux.jp/download
Gparted  http://www.gigafree.net/system/drive/gparted.html

インストール手順等は省略
##ブートローダーでデフォルトの起動OSをUbuntuに
Ubuntuを入れるとGRUBというブートローダーも一緒に導入してくれるので、GRUBの設定を変えてデフォルトの起動OSをUbuntuにします。
とはいっても基本、UbuntuがデフォルトになっているはずなのでOSを3つ以上入れたり他のブートローダーを使ったりしなければそのままです。

##BIOSで毎朝指定時間に起動するよう設定
BIOSによってやり方も変わり、自動起動できないものもありますが、私の環境では以下のような感じでした。
![IMG.jpg](https://qiita-image-store.s3.amazonaws.com/0/114208/850e071b-b837-afeb-d322-afe872f21602.jpeg)


曜日が指定できなかったので時間のみ指定しました。
土日には特ににやる処理がないのですがpythonプログラムの中で曜日を判定し、土日ならシャットダウンするようにすることで妥協しました・・・

##pythonを起動するシェルスクリプトを　/etc/profile.d/　に作成
Linuxの場合、OSが立ち上がった時に最初に実行して欲しいファイルは　/etc/profile.d/　に入れておくといいようです。
Windowsでいうスタートアップのフォルダでしょうか。

まずファイルを作るのに権限がいるので以下のように

```console
$ cd /etc/profile.d/
$ sudo gedit auto_start.sh

```
シェルスプリクトは以下の通り

```sh:auto_start.sh
#!/bin/sh
cd "pythonファイルまでのパスを入れる"
python analysis.py
```

ここでcdで移動せず直接絶対パスを指定してpythonを実行してもよいのですが、そうするとpythonのプログラム内でのcsvの保存先や複数ファイルをインポートするときに扱う相対パスが　/etc/profile.d/ を基準として扱われてしまいます。
そこでカレントディレクトリを目的ファイルのフォルダに移動してから実行するとそういった問題を回避できました。

ただしこうしてしまうと端末を立ち上げたときのカレントディレクトリがpythonファイルのフォルダになってしまうので最後にきちんと戻しておく必要があります。

```sh:auto_start.sh
#!/bin/sh
cd "pythonファイルまでのパスを入れる"
python analysis.py
cd
```

##実行後シャットダウンさせるシェルスクリプトをつくる
以下のシェルスプリクトを実行するとシャットダウンされます。

```sh:shutdown.sh
#!/bin/sh
sudo shutdown -h now
```
ただしこれだけではうまくいきません。
sudoコマンドを普通に使うとユーザーが手でパスワードを入力しなくてはいけません。
これでは自動化している意味がないのでshutdownコマンドをパスワード入力の必要がないようにしてしまいます。

そこでsudoの設定ファイルを編集します。
（※もちろんきわどい行為なので自己責任で）

```console
$ sudo gedit /etc/sudoers
```
そしてファイルの末尾に以下の内容を追記します。

```:/etc/sudoers
"ユーザー名" ALL=(ALL) NOPASSWD:/sbin/shutdown -h now
```
あとはpython側で目的の処理が終わった後にこのシェルスプリクトを呼び出せばいいので

```py:analysis.py
import subprocess

#やりたいこと

subprocess.call("./shutdown.sh")
```

##ファイルに実行権限を与える
一通りファイルを作ったので、シェルスクリプトのファイルとpythonのファイルに対して実行権限を与えます。
そうしないと自動で実行するとき権限ありませんよとエラーが出てしまいます。

```console
$ cd /etc/profile.d/
$ sudo chmod a+x auto_start.sh
$ cd "pythonファイルまでのパス"
$ sudo chmod a+x analysis.py
$ sudo chmod a+x shutdown.sh
```

##通常起動のための設定
メンテナンス用にログインする際も処理が実行されシャットダウンまでされると困るのでそれを回避します。

###pythonで時間指定
私のプログラムの場合は毎朝8:00に起動し8:30までには処理が終わるのでこの時間内であったときのみ処理を実行するようにしています。

```py:analysis.py
import datetime
d = datetime.datetime.today()

if (d.hour == 8) and (0 <= d.minute <= 30):
    #やりたいこと
    #シャットダウン処理
```

###シャットダウンのみ回避したいとき

```console
$ sudo shutdown -c
```

#最後に
個人的な利用なので知識不足を強引さで補っているところが多々あります。
よりよい方法をご存知の方いらっしゃいましたらご教授いただければ幸いです。
Java Collection の操作方法の引き出しを増やそう①


Java でプログラムを書いていると，標準の java.util.Collection フレームワークを使うことが必須になるでしょうが，なるべくスマートに書こうよ，という趣旨．
第1弾として「初期化」と「変更不可能」について．それ以外は思い立ったら書きます．
Java 1.8, それと Guava, Apache Commons utils が使えるという状況を前提とします．

# 初期化

ナントカの一つ覚えのように `Lists.newArrayList()` ばかり呼ばないこと．

## 標準のコンストラクタ

標準のコンストラクタ．ダイアモンド演算子を書かなければいけない (1.6 以前なら総称型の省略も不可能)，初期化のパターンとしてやや乏しいので，余り使わない．

```java
List<String> lines = new ArrayList<>();
List<String> another = new ArrayList<>(lines); // java.util.Colleciton を引数で受けられる
```

## Guava の初期化

コレクションの実装毎に、初期データを突っ込みつつインスタンス構築する方法を何パターンか用意してくれているので，使いやすい。
実装毎に初期化メソッドがたくさんあるので，API ドキュメントを読んだことない人はぜひご一読を．

```java
List<String> lines = Lists.newArrayList("石井琢朗", "波留敏夫", "鈴木尚典");
```

## Guava の Immutable Collection

変更不可能なコレクションを作る．

```java
List<String> twoPlans = ImmutableList.of("佐伯貴弘", "中根仁");
twoPlans.add("マラベ") // UnsupportedOperationException が投げられる

// Key-Value を繰り返す
Map<Integer, String> rotation = ImmutableMap.of(11, "斎藤隆", 16, "川村丈夫", 21, "野村弘樹", 18, "三浦大輔", 63, "戸叶尚");
```

## Immutable Collection の Builder

上記の Immutable Collections には，それぞれ Builder がある。

```Java
Builder<String> builder = ImmutableList.builder();
builder.add("島田直也");
builder.add("阿波野秀幸", "五十嵐英樹", "横山道哉"); // 可変長引数で承けられる。
List<String> releivers = builder.build();
```

## java.util.Collections の singleton
要素を変更出来ないようにする場合，Immutable Collection の他にも，単一要素しか持たないなら，これで初期化するのもあり。

```java
List<String> bobby = Collections.singletonList("ローズ");
Map<Integer, String> basesLoaded = Collections.singletonMap(Integer.valueOf(10), "駒田徳広");
```

# 変更不可能
初期化とも被る範囲もあるが，コレクションの状態を変更させない (add/remove などを許容しない) ようにすると，余計なことに気を使わなくて良くなるので，その方法について．
特に `public Set<String> getXXX()` みたいなメソッドの返す Collection は，変更不可能にしておいたほうが良いことが多い．(あくまで一般論)

## java.util.Collections の unmodifiable

状態変更系のメソッドを呼ぶと `UnsupportedOperationException` を投げるようにしてあるラッパー．Effective Java にも書いてあるが，あまり良くないケースもある．オリジナルのコレクションが変更されないことがわかっている，もしくは一時的に返す View である場合にのみ使う．

```java
Collection<String> coaches = Lists.newArrayList("権藤博", "山下大輔", "高木由一");

Collection<String> view = Collections.unmodifiableCollection(coaches);

view.add("森祇晶"); // 状態を変更するメソッドなので，これは UnsupportedOperationException() がスローされる。

coaches.add("牛島和彦"); // これは出来る。

view.contains("牛島和彦"); // 変更しないメソッドについては，view は coaches に処理を移譲するだけなので，true が返ってくる．
```

## Guava の Immutable Collection

こっちは，元のコレクションの要素を新しいコレクションにも詰めるようにしているので，その心配なし。
少し余談になるが，`copyOf` というメソッド名は，「オリジナルのコピーを作ることでインスタンスを初期化するんだよ」ということを表している良いメソッド名であり，Static Factory Method のメリットを享受している良い例であると言える．(Effective Java の項目1を参照)

```java
Collection<String> coaches = Lists.newArrayList("権藤博", "山下大輔", "高木由一");

// ラッパーではないので java.util.Collections の問題が起きない。
// コピーであることを示す、という意味で Static Factory Method のメリットも享受している。()
Collection<String> view = ImmutableList.copyOf(coaches);
```

---
「上記にはないけど，こんな書き方，よくしない？」というのあったら，ご指摘ください．
人工知能とは何か？

# 人工知能とは何か？
人工知能の明確な定義は存在しない。
人工知能研究自体に2つの立場がある。

**1. 人間の知能そのものを持つ機械を作ろうとする立場**
→ 工学的アプローチ
→ 人間の知的活動を観察しそれと同じことをコンピュータ上で実現しようとする
→ 探索，推論，学習，言語処理など

**2. 人間が知能を使って行うことを機械にさせようとする立場**
→ 認知科学的アプローチ
→ そもそも知能とは何か?
→ 認知科学，哲学など

多くの企業で人工知能を採用しているのは「機械学習」と呼ばれるものであり後者2のことを指す。

**機械学習とは、人間による知的作業のうちの「論理的な推論」を代替する技術。**
例えば、音声、画像、テキストなどのデータを事前に学習させることで
新しいデータを見たときに自動的に"推論"を可能にするというもの

※この記事は以下の記事をまとめ抜粋したもの
http://japan.zdnet.com/article/35077920/?utm_source=dlvr.it&utm_medium=twitter
[AngularJS] $locationのpushStateでクエリパラメータを変更するService（自作）

取り急ぎソースだけ。

pushState / popStateの動作なので、ブラウザの戻る/進むなどにも反応して、クエリパラメータの変更を検知できる。

現状、パラメータは一つしか変更対象にできないが、複数に対応できると思う。

html5Modeがオフだと動かないのどうしようかなあ。

```javascript:js

var app = angular.module('app', []);

app.provider('queryChanger', function() {
	var paramName = 'page';

	this.setParamName = function( _paramName ) {
		paramName = _paramName;
	};

	this.$get = [ '$location', '$rootScope', function( $location, $rootScope ) {

		// ページ表示時、強制的に対象のクエリパラメータを付加する
		if( $location.search()[paramName] == null ) {
			var query = $location.search();
			query[paramName] = 0;
			$location.search( query ).replace();
		}

		// $locationのルーティング支配下から強引に脱出する
		$rootScope.$on('$locationChangeStart', function( event, newUrl, oldUrl ) {
			var before = document.createElement('a');
			before.href = oldUrl;

			var after = document.createElement('a');
			after.href = newUrl;

			if( before.pathname != after.pathname ) {
				window.location.href = newUrl;
				event.preventDefault();
			}
		});

		$rootScope.$on('$locationChangeSuccess', function() {
			$rootScope.$broadcast('queryChanged', $location.search()[paramName] );
		});

		return {
			change: function( paramValue ) {
				var query = $location.search();
				query[paramName] = paramValue;
				$location.search( query );
			}
		};
	}];
});

// --- 使い方サンプル --- //

// まずコンフィグします
app.config( [ '$locationProvider', 'queryChangerProvider', function( $locationProvider, queryChangerProvider ) {
	$locationProvider.html5Mode({
		enabled: true,
		requireBase: false
	});

	queryChangerProvider.setParamName( 'p' );
}]);

// 使います
app.controller('myController', function( $location, $scope, queryChanger ) {
	var _this = this;

	// クエリパラメータを変更する
	this.next = function() {
		queryChanger.change( _this.p + 1 );
	};

	// クエリパラメータが変更されたとき
	// 最初のページ表示時にもここが発火します
	$scope.$on('queryChanged', function( event, value ) {
		_this.p = Number( value );
	});
});

```
Clustered Ontapで遊ぶ #1

# 目的
Netappのsupportサイトから入手できるClustered Ontap Simulatorをインストールして遊んで見る。

# Clustered Ontap Simulatorの入手
おそらくここが一番の鬼門。どうにかして手に入れてください。。
私は、会社でNetappを使っているので比較的簡単に入手できるのですが、、

+ 今回はvsim-esx-DOT8.3.1-cm.ovaを入手
+ ESXiがない人は先にESXiを用意してください(ここも鬼門)
+ ovaでのインストール
+ Disk節約のためにThinで
+ NetworkはVM NetworkがManagement/data traffic用、Cluster NetworkがCluster間の専用ネットワーク。私の環境では、前者をVM Network、後者をcluster_networkとして事前に作成しています
![image](https://qiita-image-store.s3.amazonaws.com/0/107953/5b76f1dc-0e5b-eb87-f88e-e82c74aa8bdd.png)

+ 待ちます
![image](https://qiita-image-store.s3.amazonaws.com/0/107953/c4df0210-3b05-a695-dae5-b788dd1c03af.png)

+ 確認。NICが4本。2本が通信用、2本がcluster間用みたいです
![image](https://qiita-image-store.s3.amazonaws.com/0/107953/87c25a06-4768-08f6-80c1-efc5219fb00d.png)

# 初期設定
+ "Ctrl+C" をポチッと。
![image](https://qiita-image-store.s3.amazonaws.com/0/107953/8e62b108-2ab3-1c4a-b823-cd0949c021ce.png)

+ 同じくsupportページから入手できるinstallation guideにしたがって、(4)を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/107953/6f846937-d61c-4882-e194-7ee86204d595.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/107953/6cce7b76-a588-2cc1-e983-ba636d9cc8c6.png)

+ 引き継ぎ設定
![image](https://qiita-image-store.s3.amazonaws.com/0/107953/f03e51e5-5847-9d06-c23a-48bac600540d.png)

+ Interfaceの設定

```
私の環境では
10.1.2.1/16 GW:10.1.0.1
```
+ ![image](https://qiita-image-store.s3.amazonaws.com/0/107953/4d3713b6-9867-7232-51f7-b70d4623cfe3.png)
+ adminでログイン
+ "cluster setup"と入力
+ ![image](https://qiita-image-store.s3.amazonaws.com/0/107953/be1b4de5-8119-3327-3b45-907a9121e109.png)

+ cluster "create"を選択
+ sshがdefaultで有効になっていないので、有効化します
+ 
```
security login create -application ssh -user-or-group-name admin -authmethod password 
```

+ sshの確認

```
ssh -l admin 10.1.2.1
Password:
netapp::> 
```

+ これでsshでログインできるようになりました。
+ Installation guideには、cluster nodeの追加方法も記載されていますので、本来の意味での"clustered"にしたい方は追加してください。
+ Serial Numberの変更、Clusterの選択で"Join"を選択すれば自動的に追加されるはずです

```
netapp::> network interface show
            Logical    Status     Network            Current       Current Is
Vserver     Interface  Admin/Oper Address/Mask       Node          Port    Home
----------- ---------- ---------- ------------------ ------------- ------- ----
Cluster
            netapp-01_clus1 
                         up/up    169.254.15.59/16   netapp-01     e0a     true
            netapp-01_clus2 
                         up/up    169.254.85.165/16  netapp-01     e0b     true
            netapp-02_clus1 
                         up/up    169.254.242.234/16 netapp-02     e0a     true
            netapp-02_clus2 
                         up/up    169.254.69.123/16  netapp-02     e0b     true
netapp
            netapp-01_mgmt1 
                         up/up    10.1.2.1/16        netapp-01     e0c     true
            netapp-02_mgmt1 
                         up/up    10.1.2.2/16        netapp-02     e0c     true
6 entries were displayed.


netapp::> 
netapp::> cluster show
Node                  Health  Eligibility
--------------------- ------- ------------
netapp-01             true    true
netapp-02             true    true
2 entries were displayed.
```
日本語ドメインをDNSに設定する

#日本語ドメインをDNSに設定する方法
日本語ドメインそのままDNSに設定するとエラーが発生する。
punycodeに変換して使用する必要がある。

##idnコマンドを利用する
idnコマンドを使用してpunycodeに変換する。

下記でidnコマンドをインストール
`yum install libidn`

```lang:コマンド
# idn 日本語
libidn 1.18
Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Simon Josefsson.
GNU Libidn comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of GNU Libidn under the terms of
the GNU Lesser General Public License.  For more information
about these matters, see the file named COPYING.LIB.
xn--wgv71a119e
```
上記のように日本語は「xn--wgv71a119e」と変換される

##zoneファイルへの記述
bindのゾーンファイルへは変換後の文字列で記載します。

```lang:zoneファイル
zone "test.xyz" {type master; allow-query { any; }; file "test.xyz.db";};
zone "xn--wgv71a119e.xyz" {type master; allow-query { any; }; file "common.zone.db";};
```

##確認方法
digコマンドはそのまま日本語が使用できます。
変換後の文字列でもOKです。
下記どちらでも同じ結果になります。

`# dig 日本語.xyz @localhost`
`# dig xn--wgv71a119e.xyz @localhost`

以上
Angular2勉強会で発表してきた


どうも、らこです。LIGさん主催の[ng2Curry](http://lig.connpass.com/event/26115/)というイベントでAngular 2のライブラリ事情について話してきました

[スライド](http://laco0416.github.io/slides/angular-2-with-libraries/#/)

正直このスライド以上のことはほとんど喋ってないので、読んでください。


・・・ではあっけなさすぎるので、ざっくり5分で読めそうな要点だけ書きます。

## 前提
* TypeScriptわかる
* ComponentとかbootstrapくらいはAngular 2わかる

## Angular 2におけるライブラリの特徴
* ES6 Modules形式でのインポート・エクスポート
* 型ベースのDI
* 公式から提供されるライブラリがお手本になる
* DIのことは [Angular2のDIを知る - Qiita](http://qiita.com/laco0416/items/61eed550d1f6070b36ab)　を読んでくれ

## http
* `HTTP_PROVIDERS`をbootstrapに渡す
* `Http`クラスには基本的に`request()`メソッドがあるだけ
* `Http`をDIして使うだけ
* `Http`のメソッドは`Observable`を返す
* Angular 2はRxJSに依存してる
* なんで`Observable`なのかはこれ読んで
  * [ReactiveX - Observable](http://reactivex.io/documentation/observable.html)
  * [RxJS In-Depth - AngularConnect 2015](http://www.slideshare.net/benlesh1/rxjs-indepth-angularconnect-2015)
  * [Introduction to RxJS 5 by Gerard Sans](http://slides.com/gerardsans/ng-nl-rxjs5#/)
* コンポーネント側では`Observable`を`subscribe()`して非同期な値を受け取るだけ

## router
* `ROUTER_PROVIDERS`をbootstrapに渡す
* `<base>`をHTMLに書いてないなら`APP_BASE_HREF`もbootstrapに渡す
* `#`でやりたいなら`HashLocationStrategy`を使う
* `RouteConfig`でルート定義を書く
* `<router-outlet>`にコンポーネントが描画される
* `[routerLink]`でナビゲーション書ける
* `Router`をDIすれば手続き的にナビゲーションできる
* `Router#navigate`は`Promise`を返す
* `Promise`を使うと**遅延ナビゲーション**ができる

![Kobito.9s8YnA.png](https://qiita-image-store.s3.amazonaws.com/0/20253/7fa30072-bf33-7787-790c-4903298adc04.png "Kobito.9s8YnA.png")


## コミケ
* Alpha版の本を書くとヤバイ
* GitHub監視する生活すると破壊的変更は予知できる
* つまりこういうこと
![img](http://laco0416.github.io/slides/angular-2-with-libraries/img/happy-breaking-changes.jpg)

## testing
* `angular2/testing`は便利だけどJasmine依存
* `angular2/http/testing`はMockBackend簡単に使える
* `angular2/router/testing`はドキュメントないから待とうね

## まとめ
* 今はまだAPIの細かい使い方を覚えるよりも全体の思想や雰囲気を掴んで、破壊的変更で折れないように半身で構えるのが無難。
* Observable(Stream)とPromiseは教養として理解しておきましょう

## 出た質問

* Dart版どうなの
	* 普通に開発されてるけどDart版特有のバグとかエラーもあるらしくてつらそうな雰囲気
* Bootstrapとかマテリアルデザインとか使えるの
	* AngularJSがそうだったようにCSSフレームワークと衝突することはない。マテリアルデザインのライブラリについてはng2-materialが鋭意開発中なので今年中には出る。
* Componentの名前衝突しない？
	* W3CのCustomElementsの仕様に従って、`foo-bar`形式のハイフンで必ず2語以上にする形式を守れば、最初にネームスペースをつけるなどで衝突を避けられる。
* アニメーションは？
	* `angular2/animate`があるはずなんだけどちゃんと動かせてないので壊れてるのか使い方が悪いのかわからない。今後調べます。 => [調べた](http://qiita.com/laco0416/items/b9639f614d4728299173)

## 発表を振り返る
* 初めてフル英語のスライドにした。反応は悪くなかったけどもうちょっと記号とか使って直感的な表現多くしたほうがよさそう
* reveal.js、結構いい。
* もうちょっと発表慣れしたい。
* 会場の雰囲気だと全体の2割くらいしかAngular 2まだ触ってなくて、基礎も無いうちにライブラリの話はついてこれてなさそうだなーというのがあった。ちょっと分かる人からはrouterの遅延ナビゲーションの説明とかよかったみたいで安心した。
* まだAngular 2に関してはもっと本質的な部分の啓蒙が必要だなあと思った。ng-japan前に感触がつかめて発表者側としても勉強になった。
* 主催のLIGさんありがとうございました。カレーおいしかったです。
指定したサイズのダミーファイルを作成するには（MacOSX編）

## 実現したいこと

指定したサイズのダミーファイルの作成したい

## 実現方法および解決方法

ddコマンドを利用して指定したサイズのファイルを作成する

## 実行コマンド

1Gのファイルを作成する場合

```
dd if=/dev/zero of=1G bs=1024000 count=1000
```

## 情報源

* man dd
* 1,000換算と1,024換算が混在するコンピュータの世界
  * http://pc.watch.impress.co.jp/docs/2003/0922/it010.htm
* ハードディスク容量の計算方法（Windows、MacOS）
  * http://faq.buffalo.jp/app/answers/detail/a_id/1087?bufqa


## 補足
HTMLで半角<>を表示させる


HTMLで「<>」を表示させる方法を書いておきます。
通常、HTMLソースで「<>」を書くとタグとして認識されてしまいます。

「`&lt;`」で「<」になり、 
「`&gt;`」で「>」になります。 

less than, greater than とおぼえよう。 ちなみに左はleft。

すごく短いですが毎日書くこと優先で。
EC2上Linuxとkernel panicと再起動と

##概要
/etc/sysctl.conf の kernel.panic を 0 にすることで、Linuxがカーネルパニックした際に再起動を抑止する設定がある。
下記に記載したように、この挙動は、とあるカーネルバージョン以降のカーネルを採用したHVMインスタンスとPVインスタンスでは無効である。

http://qiita.com/kentaost/items/58b783a28faf7d55f8e1

##EC2上のLinuxカーネルパニック時の挙動をまとめてみた
わりと混乱するという話を聞き、需要があるような無いような気がしたのでまとめてみた。

![reboot_on_panic.png](https://qiita-image-store.s3.amazonaws.com/0/49894/884a5ff0-c9b7-5943-0aab-94c505c84bb0.png)

##注意点
* EC2環境以外のクラウド基盤での検証はしていない。この挙動は現時点でのEC2環境でのみ確認している。
* pingによるカーネルパニック後の稼動状態の検証には要注意。単純にsysrqによって引き起こしたカーネルパニックでは、普通にカーネルパニックしたインスタンスがネットワーク割り込みを実行し続けてpingに反応してしまう可能性がある。
Railsでckeditorとasset_syncを併用する


## 概要
- たぶん普通に併用する分には問題ない
- asset_syncをデプロイ先サーバではなく、デプロイ元（ローカルやCI/CDサーバなど）からS3へのアップロードをやっていると問題が起きる（と思う）


- [AssetSync/asset_sync: Synchronises Assets between Rails and S3](https://github.com/AssetSync/asset_sync)
- [tsechingho/ckeditor-rails: Integrate CKEditor javascript library with Rails asset pipeline](https://github.com/tsechingho/ckeditor-rails)


## 問題
ckeditorのjavascriptがさらに別のjavascriptファイルを読み込もうとするが、ホスト名がs3でないため、jsのエラーが発生し、ckeditor自体が正常に動作しない。

## 解決

https://github.com/mkaszubowski/ckeditor#include-customized-ckeditor_basepath-setting
https://github.com/tsechingho/ckeditor-rails/wiki/Work-with-asset-host

↑を参考に
app/assets/javascripts/ckeditor/basepath.js.erb
を作成

```erb
<%
  base_path = ''
  base_path << Rails.application.config.action_controller.asset_host.to_s
  base_path << Rails.application.config.assets.prefix
  base_path << '/ckeditor/'
%>
var CKEDITOR_BASEPATH = '<%= base_path %>';
```

これをapplication.jsなどでrequireするとs3からjavascriptファイルを読み込むようになる
UIView のデバッグに便利な recursiveDescription を Swift で使う

recursiveDescription メソッドはビューの階層構造をダンプできてデバッグに便利です。
プライベートメソッドなので performSelector を使います。

```
(lldb) po self.contentView.performSelector("recursiveDescription")
▿ Unmanaged<AnyObject>
  - _value : <UIButton: 0x7ff21159abe0; frame = (0 0; 60 60); alpha = 0; opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7ff211599f80>>
   | <UIButtonLabel: 0x7ff21159b540; frame = (0 0; 0 0); hidden = YES; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7ff21159bb90>>
```

Objective-C と同じでいけると思ったら ダメでした。

```
(lldb) po self.contentView.recursiveDescription()
error: <EXPR>:1:1: error: value of type '$__lldb_context' has no member 'recursiveDescription'
```
iTunes のmp3ファイルが何故かURIエンコードされていたからrename してみた

旧マックから新マックへの移行で何故かmp3ファイルがURIエンコードで文字化けしていたので、ruby のスクリプトでリネームしてみた。


```ruby:rename_file.rb
require 'URI'
path = "mp3ファイルが入っているディレクトリのパス"
Dir.chdir(path)
Dir.open(path).each do |f|
	begin
	if File.rename(f, "#{URI.decode(f)}").zero?
		puts "Change name #{URI.decode(f)}" 
	end
	rescue SystemCallError
		puts "Can't rename #{f} to #{URI.decode(f)}"
	end
end
```
pathにはお使いのmp3が入っている絶対パスを書くと動きます。
一応エラーでリネーム操作が止まらないようにしておきました。
***
(追記:2016/02/26)このままだとファイル名に/ か\ が入ってるとリネームされないので、/ と\ を: に置換するコードを追記する

``` ruby:rename_file2.rb
require 'kconv'
require 'uri'
path = "mp3ファイルが入っているディレクトリのパス"

Dir.chdir(path)
Dir.open(path).each do |f|

	renamed_name = "#{URI.decode(f).gsub(/\/|\\/,':')}"
	
begin
	if File.rename(f, "#{renamed_name}").zero?
		puts "Change name #{renamed_name} "
	end

	rescue SystemCallError
		puts "Can't rename #{f} to #{renamed_name}"
	end
end
```
##最後に
どなたか/ や\ のままrubyでリネームできる方法教えてください。
Elasticsearchのマスタノードがダウンするとクラスタ全体がダウンする


（昔書いたメモをupしてみる）

※こちらは1.4.3を使っていたときの話です

Elasticsearchを再起動する際、1台ずつ再起動していくと、
**masterノードを停止した時点で、クラスタ全体に不通となる。**


[Restarting a 2-node elasticsearch cluster with zero downtime - Stack Overflow](http://stackoverflow.com/questions/27345508/restarting-a-2-node-elasticsearch-cluster-with-zero-downtime)

↑にあるように、discovery.zen.rejoin_on_master_goneをfalseにするとマスタノードを落としたときもクラスタとしては生き続け、自動的に別のマスタが選出される。

```sh
$ curl -XPUT localhost:9200/_cluster/settings -d '{
    "persistent" : {
        "discovery.zen.rejoin_on_master_gone" : false
    }
}'
```
ElasticsearchでJSONのデータをパースしてほしくないとき


（昔書いたメモが見つかったのでupする）
ElasticsearchはドキュメントにJSONデータがあると自動的にパースした上でIndexを作ってくれます。
でも、パースせずにそのままIndexにしたいときは以下のようにします。

mappingsのtypeをobjectにして、enabledをfalseに。

```json
{

//...省略

"name" : {
  "type" : "object",
  "enabled" : false
}

//...省略

```


railsを使っていて[elasticsearch-model](https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-model)を使っている場合はこんな感じ

```ruby
indexes :name, type: 'object', enabled: false
```

Elasticsearch公式のドキュメントは[こちら](https://www.elastic.co/guide/en/elasticsearch/reference/1.4/mapping-object-type.html#_enabled_3)
Slackでお手軽アラート通知

監視のアラートって見ないよねーって思うこのごろ。
そんな中、最近でも無いけどはやりのSlackを使ってアラートを飛ばすように。

##1.構成

あまり参考にならないけど、自分のところではほぼフルスクラッチで作成した監視を行うデーモンがあるので、
それにアラートを飛ばす手段としてSlackクラス追加して呼び出している。

サーバー : CentOS6.7
Ruby : 2.2.1

[Slack API](https://api.slack.com/)

tokenはあらかじめ取得
使用できるか確認

```
$curl -XPOST -d "token=<取得token>" -d "pretty=1" "https://slack.com/api/auth.test"
```

falseにならなければOK!


##2. 準備


Classの追加

別にいちいちクラスを作らなくても問題ないけど環境に合わせて
*自分の環境は、アラート手段のクラスをメールとSlackの2種類用意している

投稿するチャンネル : #alert_channel
投稿するユーザー   : hogehoge 
デフォルト文　　　 : serverdown

```
require 'net/https'
require 'uri'

class Slack

  include Singleton
    attr_accessor :mesg

  def initialize
      @mesg = mesg
  end

  def alert_scall(mesg)

      host = "slack.com"
      path = "/api/chat.postMessage"
      message = mesg
      query_parameter = {  "token" => "取得token",
                            "channel" => "#alert_channel",
                            "text" => "serverdown",
                            "username" => "hogehoge" }

      query_parameter["text"] = "#{message}"
      query = query_parameter.map do |key,value|

        "#{URI.encode(key)}=#{URI.encode(value)}"

      end.join("&")

      https = Net::HTTP.new(host, 443)
      https.use_ssl = true
      res = https.post(path, query)
  end

end

```


##3.使用方法

障害検知をトリガーに呼び出せるように設定

```
Slack.instance.alert_scall("test_alert")
```

これで投稿されていればOK!
whereメソッド

`@post = Post.where(user_id: @user.id)`

@user.idが１の場合、user_idが１のpostの配列を取得する。


userとpostを１対多で関連付ければ、

`@posts = @user.posts`

で上のwhere分と同じ意味になる。


どちらも@userに関連したpostを取得できる。


関連付けはメソッドを追加しコードが簡単になる利点がある。
AD2 > Lチカ > WaveGenで出力 / Scopeで測定

```txt:動作環境
Analog Discovery 2
Windows 8.1 pro (64bit)
Wave Forms 2015
```

Analog Discovery 2(以下、AD2)が今日届いたのでとりあえずできそうなことをやってみた。

AD2にはWave Generatorがあるので、波形を出力してScopeで取り込むというのがすぐできそうだ。

接続はAD2のピンを以下のようにした。

- W1 <-> Scope ch1. Positive
  - W1 : Waveform Generator 1
- GND <-> Scope ch1. Negative

波形出力をする設定をして、測定したら以下のようになった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/54ab1180-8869-e6ba-96e1-169aba8f02b3.png)

徐々に使い方を覚えよう。
たまにしか使わないLinuxコマンドメモ

随時追記。
よく使うやつは忘れないんですけどね・・・。

# グループにユーザーを追加する
```
$ sudo gpasswd -a <ユーザ名> <グループ名>
```
削除のときは-d。

# 任意のサイズのダミーファイルを作成する
http://qiita.com/ymko/items/2f7cc2a45bbdef2bfece
便利。

# オブジェクトファイルからシンボル情報を取得する
```
$ nm <*.oファイル>
```
クロスコンパイラならarm-eabi-nm等になる。
`--print-size`でサイズも表示。

# 実行ファイルの場所を探す
```
$ whereis <コマンド>
```
Selenium WebDriverのIEのテストでCookieが保持されてしまった場合の対処

Selenium WebDriver(Grid)のNodeにあるInternet Explorerのテストで、

* テスト1: ログイン状態になるテストを実行するもエラーになる
* テスト2: ログアウト状態から始まって欲しいテストなのに最初からログイン状態になっている。

というような感じになると、
テスト1でエラーになった時点のCookieの状態が保持されて、
テスト2に影響が出るということが起こった。

# 対処方法
IEを起動して閲覧履歴（Cookie）を削除する。
[設定]＞[インターネットオプション]＞[全般]＞[閲覧の履歴]＞[削除]
![インターネットオプション.png](https://qiita-image-store.s3.amazonaws.com/0/26618/e2d181bb-b524-dc81-1e90-f4b933a87746.png)


# その他
FirefoxとかChromeだと完全な新規セッションとして立ち上がるっぽくて、エラーになっても次のテストは期待通りの動作をしてくれたのですが、IEだけダメなときがあるようでした。

テストがエラーになった際に、Cookieやらセッションやら削除するようにしてみても今回はダメでした。

IEのキャッシュを削除をテストから実行する方法もできなくはなさそう。（下記URL参照）
http://www.howtogeek.com/howto/windows/clear-ie7-browsing-history-from-the-command-line/
http://stackoverflow.com/questions/16461472/how-to-clear-browser-cache-automatically-in-selenium-webdriver#answer-16462030
Qt でプログラム起動時にファイルダイアログだけ表示する

# １行でかくと QTimer::singleShot便利だよね。

ファイルダイアログだけ出力して、選択されたファイルを処理し、すぐにプログラムを終了させるには、`QTimer::singleShot(0, func)` を使うとよい。

ちょっとしたツールなどで、ファイル選択ダイアログだけ表示して、選択されたファイルを処理して、プログラムを終了させたいことがある。

ためしに、`app.exec()` する前に、ダイアログを `dlg.exec()` みたいにしてしまうと、ファイル処理後に アプリケーションのイベントループが止まらずに、プログラムが終了しなかった。

## 解決策 QTimer::singleShot でイベントループにイベントを予めつっこんでおくといい

下記のように、QTimer::singleShot で呼び出したい関数を指定しておくと、
イベントループに、タイマイベントが挿入される。挿入されたイベントは、`app.exec()` を呼び出したタイミングで呼び出されるため、start が実行される。

この方法だと、`start()` が終了した時点でプログラムが終了する。

```cpp
#include <QApplication>
#include <QFileDialog>
#include <QTimer>

void start()
{
    QFileDialog dlg(0);
    dlg.exec();
    if (dlg.result() != QFileDialog::Accepted) {
        return; // QApplication::instance()->exit(status)でも可
    }
    
    // 選択したファイルを元に何か処理する。

    return;
}

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    // app.exec() した時点で、すぐに（0 ミリ秒後に）start関数を呼び出す。
    QTimer::singleShot(0, start);
    
    app.exec();
}
```
AD2 > Link > Datasheet / Pinout Diagram

DigilentのAnalog Discovery2

取説記載のリンク先が以下。

http://store.digilentinc.com/analog-discovery-2-100msps-usb-oscilloscope-logic-analyzer-and-variable-power-supply/

以下の情報がある。

- Datasheet
- Pinout Diagram
- Wave Forms 2015

~~Wave Forms 2015をダウンロードしようとしているが、処理が進まない。。。~~

Checkoutというのをしないといけなかった。メールアドレスや住所などを登録してからリンク先が見えるようになり、そこからは順調にダウンロードできている。
AD2 (Analog Discovery 2) > Link > Getting Started

Analog Discovery 2を手に入れた。

ESP8266用のユニバーサル基板2代目を作成中にうまく動かなかったこと、今後、様々な回路を実装、ソフト作成していく中でオシロやロジアナなどは必要になるだろうこと、などしばらく考えていた。
そういう中で実際にAnalog Discoveryを使用している方から[詳しい使用感を教えていただいた](https://macsbug.wordpress.com/2016/02/19/esp8266%E3%81%A7%EF%BC%91mhzwo/)。

今の自分の技能・技術、知識を考慮してあってそうなツールだと思い購入にいたった。

というわけでGettin Started に移る。
http://www.ni.com/tutorial/52918/en/
DQNプニキにホームランを打たせたい



# Deep Q-Network (DQN)

Deep Learning + 強化学習を使って行動パターンを学習させるDeep Q-Networkは面白いと思い、実装してみました。少しだけ結果が出たので公開します。

ソースコードは以下で公開しています。
https://github.com/dsanno/chainer-dqn

DQNについては以下が詳しいです。
[DQNの生い立ち　＋　Deep Q-NetworkをChainerで書いた](http://qiita.com/Ugo-Nama/items/08c6a5f6a571335972d5)

# 学習対象

今回DQNに学習させるゲームは[くまのプーさんのホームランダービー！](http://games.kids.yahoo.co.jp/sports/013.html)です。(リンク先で音が鳴るので注意)
プニキことプーのアニキに多くのホームランを打たせることを目標にします。

このゲームを選んだ理由は以下の通りです

* ルールが単純  
ピッチャーが投げる球を丸太で打ち返し、規定数ホームランを打てばクリアとなります
* 報酬の判定が簡単  
結果が「ホームラン」「ストライク」といった画像で示されるので、画像に対応した報酬を与えてやります

あとは人間にとって非常に難しいという理由もあったのですが、難しくなるところまで到達できませんでした。(参考: [ニコニコ大百科](http://dic.nicovideo.jp/a/%E3%81%8F%E3%81%BE%E3%81%AE%E3%83%97%E3%83%BC%E3%81%95%E3%82%93%E3%81%AE%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%A9%E3%83%B3%E3%83%80%E3%83%BC%E3%83%93%E3%83%BC!))

# 開発環境

* Windows 10
* Chainer 1.5.1
* 画面キャプチャと操作に[PyAutoGUI](https://pyautogui.readthedocs.org/en/latest/)を使用  
* GeForce GTX970  
CPUだと学習に時間がかかりすぎてうまく動作しません

# ニューラルネットワーク構成

* 入力は150 x 112 x 3chのピクセルデータです。ゲーム画面のサイズは600 x 450pxなのですが、キャプチャした画像を縦横1/4ずつ縮小して入力しています。
* 出力は行動の評価値のベクトルです。  
ベクトルの長さは行動パターンの数に一致します。  
今回はポインタのY座標は固定でX座標を33段階で変動させるようにしました。  
ボタンはONとOFFの2状態があり計66個の行動パターンとなります。
* 中間レイヤはConvolutional Neural Networkが3層、LSTMが1層、Fully Connected Layer 1層となっています。

# プレイについて

* タイトル画面、ピッチャー選択画面等では、決められた位置をクリックするようにしました。  
* 対戦中は、100msごとに画面をキャプチャして入力画像として使います。(以下、100ms間隔の単位を「フレーム」と呼びます)評価値の最も高い行動パターンを次のフレームの行動とします。
* 以下の状態を判定したときに報酬を与えました。それ以外のフレームでの報酬は0です。
ルール上ファールとヒットはストライクと同じ失敗扱いですが、空振りよりは球に当たったほうが良い行動と言えるので、ストライクより少しだけ報酬を高くしています。
    * ホームラン: 100
    * ストライク: -100
    * ファール: -90
    * ヒット: -80
* 以下の3パターンでランダムな行動をとらせるようにしました。
今回のゲームは1フレームだけランダムな行動をとらせてもあまり意味がないので、10～30フレームの範囲で連続したフレームの間ランダムな行動をとらせました。
    * ポインタの位置だけランダム
    * ボタンの状態だけランダム
    * ポインタの位置もボタンの状態もランダム

# 学習について

* 学習はプレイと別スレッドで並行して行いました。
* LSTMの学習を行うために、以下のように連続したフレームの入力値を与えてパラメータ更新するようにしました。
mは4～32の範囲で徐々に大きくしました。
    * nをランダムに選択する
    * フレームnの入力値を入力
    * フレームn + 1の入力値を入力してフレームn + 1の最大評価値を求める。それを使ってフレームnのパラメータを更新
    * ...
    * フレームn + mの入力値を入力してフレームn + mの最大評価値を求める。それを使ってフレームn + m - 1のパラメータ更新

# 設定

* ミニバッチ数: 64
* DQNのgamma: 0.98
* optimizer: AdaDelta  
文献[2]でAdaDeltaを使っていたので採用しました。  
パラメータはデフォルトのrho=0.95, eps=1e-06としています。
* chainer.optimizer.GradientClipping()を使ってL2 normを最大0.1に制限  
勾配を制限しないとQ値が大きくなりすぎ学習が安定しませんでした。

# 学習結果

10時間ほどステージ1で学習を続けたところ、ステージ1は大体クリアできるようになりました。
プレイ動画を以下にアップロードしました。
動画撮影時にはランダムな行動をとらないようにしています。
https://youtu.be/J4V6ZveYFUM

ほかのステージも含めて学習を行わせたところ、ステージ3をまぐれでクリアするところまでは確認できました。

# 参考文献

* [1] V. Mnih et al., "Playing atari with deep reinforcement learning"  
http://arxiv.org/abs/1312.5602
* [2] M. Hausknecht, P. Stone, "Deep Recurrent Q-Learning for Partially Observable MDPs"  
http://arxiv.org/abs/1507.06527
* [3] [DQNの生い立ち　＋　Deep Q-NetworkをChainerで書いた](http://qiita.com/Ugo-Nama/items/08c6a5f6a571335972d5)
QtCreatorでROSのパッケージをビルド&デバッグ実行する

# はじめに
C++でROSアプリケーションの開発を行う際に，ステップ実行でデバッグができると非常に便利です．特に,GUIデバッガで実行時のパラメータをウォッチすることは，開発効率の向上に大いに寄与します．

QtCreatorはそれを実現するためのIDEの一つです．CMakeに対応しており，簡単な設定でROSと連携できるので，よく使われているようです．

設定方法は下記の動画を参考にさせていただきました．
[How to open ROS package by qtcreator](https://www.youtube.com/watch?v=NG05o_SV1iw)

初見は動画で見るのが良いのですが，後から見返そうと思うとやはり静止画でのチュートリアルが欲しいと思い，メモを残すことにしました．

# 環境
- OS: Ubuntu 14.04 LTS
- QtCreator: Ver.3.4.2
- ROS: indigo

# 設定手順
## パッケージを読み込む
- QtCreator を起動し，「プロジェクトを開く」ボタンを押します． 
![01_open.png](https://qiita-image-store.s3.amazonaws.com/0/110138/cb3c5a32-302b-989e-b4e9-3181c5a66d39.png)
　

- パッケージディレクトリ内のCMakeLists.txtを開きます．
![02_open_cmakelists.png](https://qiita-image-store.s3.amazonaws.com/0/110138/4dadab8c-628e-11de-025c-de5d41087e8f.png)
　

- ビルドバスを入力します．`ワークスペース名/build`のフルパスを入力します．
![03_build_path.png](https://qiita-image-store.s3.amazonaws.com/0/110138/ce9735fb-a3dd-251b-33f5-063006e7521d.png)
　

- CMakeの引数を指定し，「CMakeの実行」ボタンを押します．
 - 引数: `../src -DCMAKE_INSTALL_PREFIX=../install -DCATKIN_DEVEL_PREFIX=../devel -DCMAKE_BUILD_TYPE=Debug`

![04_run_cmake_1.png](https://qiita-image-store.s3.amazonaws.com/0/110138/477b4fb3-7428-7005-113f-1f183414c24a.png)
　

- メッセージを確認します．「完了」ボタンを押せば，プロジェクトの読込みは完了です．
 - `Build files have been written to : ワークスペースへのパス/build`というメッセージが出ていれば，成功です．

　　　　![05_run_cmake_2.png](https://qiita-image-store.s3.amazonaws.com/0/110138/5ed0f8f6-b470-40da-3403-ba2211e5ffc7.png)

## プロジェクトの設定を行う

- 左側のメニューから「プロジェクト」ボタンを選択します．
![06_select_project.png](https://qiita-image-store.s3.amazonaws.com/0/110138/d4aea815-ed38-ae73-1edd-72d676435053.png)
　

- ビルド設定を行います．ビルドステップ→ターゲットにて，デバッグ実行対象のソースコードを選択します．
![07_build_step.png](https://qiita-image-store.s3.amazonaws.com/0/110138/9f17a3a9-cd04-4c01-59d0-e21d2b17f49c.png)
　

- 実行時の設定を行います．現在開いているプロジェクトのから起動するモジュールを選択します．IDEの「実行」ボタンを押した時に，実行される対象をここで選択することになります．
![08_run_step.png](https://qiita-image-store.s3.amazonaws.com/0/110138/6397a09c-39de-d2d2-3244-9cde36f30983.png)
　

- ブレイクポイントを指定し，デバッグ実行をする．
 - F9でブレイクポイントを設定し，F5で実行します．初回，及び変更点がある場合はF5押下時にビルドをしてからモジュールが実行されます．
 - 黄色の矢印が現在のステップです．赤い丸で示したブレイクポイントで停止し，ウォッチウィンドウから変数を覗くことができていれば，成功です．
![09_stop_at_a_break_point.png](https://qiita-image-store.s3.amazonaws.com/0/110138/764faf29-43d5-a683-ada7-74077a49e0b4.png)

# 終わりに
かなり簡単な設定でGUIデバッガの起動まで辿りつけました．IDEを使うこと自体賛否両論がありますが，私はIDEが大好きで，積極的に活用しています．直感的に変数を可視化できる機能は，バグの発見に大いに貢献してくれています．

もし，`printf`デバッグに疲れた時は，さくっと試してみる価値はあると思います．
BYOP main (v0.4) > 全コマンド実行

https://hackaday.io/project/9526-bring-your-own-pizero-byop
で応募しているPiZero上で動かすプログラムの作成中。


## 相手

相手はESP8266で作成中の Message Station
http://qiita.com/7of9/items/a1aee7c4b8f0d4bc8d9b

## こちら

とりあえずRaspberry Pi2で代用。
GPIOのUARTを使う (/dev/ttyAMA0)
http://qiita.com/7of9/items/58b29f245ad268b4b65d


## プログラム v0.4

[v0.4 @ github](https://github.com/yasokada/python-160224-BYOP-main/releases/tag/v0.4)

```BYOP-main.py
#!/usr/bin/env python

#--- selection of import based on the package ---
''' 1. with python3-serial'''
import serial
''' 2. without python3-serial'''
#from dummySerial import CDummySerial
#serial = CDummySerial()
#-----------------

'''
v0.4 2016 Feb. 24
  - add contact by Vital
v0.3 2016 Feb. 24
  - group_run commands
      + hello
      + check
      + get
      + post
v0.2 2016 Feb. 24
  - add serial print
v0.1 2016 Feb. 24
  - just hello
'''

import time
usleep = lambda x: time.sleep(x/1000000.0)

con1 = serial.Serial('/dev/ttyAMA0', 115200, timeout=0.1)

cmdlines = [
    "hello,1,7of9",
    "check",
    "get",
    "post,Vital,hello_Vital,0",
    "hello,2,Vital",
    "check",
    "get",
    "post,7of9,hello_7of9,0"
    ]

def main():    
    for idx in range (8):
        msg = cmdlines[idx] + "\n"
        print msg,
        con1.write(msg)
        time.sleep(5.0); # second

if __name__ == '__main__':
    main()
    con1.close()   
```

上記を実行すると、最初は7of9からVitalへのメッセージをVitalが受信できる(ESP8266のLCDに表示される)。
２回めの実行からは7of9へのメッセージを7of9が受信できて、その後は同じことの繰り返し。

### 写真

電源を別にすれば、USBハブと三端子レギュレータも不要になる。

![DSC_0123.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/1de73406-dc87-04ab-4410-98ff4895c583.jpeg)


TODO: シリアル読取り
TODO: ファイルからの読取り ([Qiita投稿](http://qiita.com/7of9/items/5ed170cd98335357b434))
react-reduxでページ読み込み時、actionを呼び出す方法

Gakuです。
Reduxむずいっす。やばいっす。楽しいっす(´Д` )
ということで、ここ3日くらいはまってたページ読み込み時にactionを呼び出す方法がついにクリアできたので備忘録として残します。

# ハマった内容
1.とりあえず、初期描画でデータを呼び出す方法が全くわからず(´Д` )になった。
2.onload使えばいいんじゃね？と閃く！
3.onloadで実装したもののなんか無限ループ起こる(今でも原因不明)
4.reduxにはそういう機能がないんじゃね？と思いreactの記事探し出す。
5.reactにあるcomponentDidMount()ってのが使えそうな雰囲気なのはわかったので実装しようと試みる。
6.ひたすら書き方がわからず２日はまる←本日21時まで。。。飯も食わず。。。

# 解決法
結局reduxのexample見て、実装したいことと同じようなコードを読んで解決した。
（ここに行き着いておけばもっと簡単に今までできた気がする。。。）
redux初学者は一度動かしてみて、コード読んで、いろいろやってみるとreduxで実装できるようになると思います。
[ReduxExample](
https://github.com/reactjs/redux/blob/master/docs/introduction/Examples.md "react")

# 実装
containerでこんな感じに記述。

```js:container.js
import React from 'react'
import { connect } from 'react-redux'
import { fetchProject } from '../actions/operationProject'

class ProjectList extends React.Component {
  componentDidMount() {
    const { dispatch } = this.props
    dispatch(fetchProject())
  }
  render() {
    const { projects } = this.props
    return (
      <div>
      {projects.saveResult.map(project =>
        <p key={project.id}>
          {project.projectname}
        </p>
      )}
      </div>
    )
  }
}

const mapStateToProps = (state) => {
  return {
    projects: state.projects
  }
}

export default connect(mapStateToProps)(ProjectList)
```
結局componentDidMount()を使うところまでは合ってたみたい。
redux使うのに、reactの記述方法で書いていいのかな？という迷いが今回のハマりに繋がりました( ；´Д｀)

# おわりに
書方にすごくこだわりたいと思っているので（たいして綺麗じゃないけど。こだわりだけ）、そのこだわりを捨てた方が良いかと思ったハマりでした。。。
ただ、reactは一歩進むと世界が広がっていくので本当楽しいです。
今回のハマり解消した時は昇天しました。

# 転載元
こちらでも掲載しております。
[Gaku's Memo-react-reduxでページ読み込み時、actionを呼び出す方法](http://www.gakusmemo.com/?p=303 "Gaku's Memo")
【Spring】クリックされた選択肢によって表示先のJSPを変える方法




```jsp:all.jsp
<!-- 予めfindAll()などで作成したallDomainsなどをaddAttributeしておく -->
<c:forEach var = "domain" items = ${allDomains}>
  <!-- allDomains(ArrayList)の中身の数だけ選択肢を表示 -->
  <a href = "/class/method/${domain.id}"><c:out value = "${domain.name}"/>
  <!-- href属性の中に${domain.id}を設定することで変数を渡すことができる -->
<c:forEach />
```

```java:Controller.java
@Controller
@RequestMapping("/class") 
    public class Controller{
@Autowired
Service service;

@RequestMapping("/method/{domainId}") //jspで選択したdomainのidを引数に受け渡し
public String findOne(@PathVariable("domainId") Integer id, Model model){
    Domain domain = service.findOne(id);
    model.addAttribute("domain", domain);
    return "detail";
```

```jsp:detail.jsp
<!-- ControllerでaddAttributeしたdomainの情報が表示される -->
<c:out value = "${domain.id}">
```
Data Volume Containerを使わないで永続化する方法(Named Volume)


## Data Volume Containerを利用する方法

データの永続化の為にデータを格納する専用のコンテナを作る以下の方法をあちこちで見かけますね。

例えばMariaDB用のデータコンテナなら

```
$ docker run --name mariadb_data -d -v /var/lib/mysql busybox true
```

といった作り方をされる方も多いかと思います。

あとはデータコンテナを利用したいコンテナ側で ```--volumes-from=mariadb_data``` オプションを付けて利用しますよね。

実はこれ、
**わざわざデータコンテナを作らなくても良い方法があるんです**

## Data Volume Containerを利用しない方法
```
$ docker run --name mariadb -d -v mariadb_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret mariadb
```

といった感じで ```-v ボリューム名:/var/lib/mysql``` オプションを付けるだけでほぼ同じ事が実現出来ちゃうんです。

上記の方法をすると、```ボリューム名```で指定した名前のボリュームが存在しない場合は勝手に作ってくれるんです。

**既に存在する場合はそのボリュームを/var/lib/mysqlにマウントしてくれます**

```
$ docker volume ls
DRIVER              VOLUME NAME
local               mariadb_data
$ docker volume inspect mariadb_data
[
    {
        "Name": "mariadb_data",
        "Driver": "local",
        "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/mariadb_data/_data"
    }
]
```

といった感じになります。
ホストOS側の上記Mountpointにデータが格納されてるのでバックアップ取るのも簡単ですね！

## 不必要になったのでボリュームを削除したい場合
```
$ docker volume rm ボリューム名
```
とすれば消せます。

快適なDockerライフを！
python > インラインコメントはできないのか > 複数行にしないといけないようだ

```txt:動作環境
Python 2.7.9 on Raspberry Pi2
```

Cなどで使えるインラインコメント。

```
time.sleep(100/*msec*/);
```

これと同様のコメントをpythonでやる方法が分からない。

検索したものとしては
http://stackoverflow.com/questions/5617159/mid-line-comment-in-python
> Actually if you break your statement into multiple lines you can.

複数行にしないといけないようだ。
CSSからSCSSに逆コンバート


#SCSSのデータが消えてしまい、CSSしか残っていないときに活躍するコマンド

**`sass-convert -F css -T scss input.css output.scss`**

ネストが全て戻るわけではないので、同じクラス名でもバラバラになってしまうけど
圧縮されて1行になってたらムリゲーなので重宝します

##chmod
**`chmod 777 ファイル名`**でファイル、ディレクトリのパーミッションを変更
環境によるかもしれないが、自分のとこでは必須
CSSからSCSSを作ったあとこれをしないと読み専ファイルになって編集できない

3桁の数字は左から｢ファイル所有者｣｢ファイル所有グループ｣｢それ以外のユーザー｣の権限を表す
数字の意味は以下の合計で決まる

- 4 読み込める
- 2 書き込める
- 1 実行できる

777で全ての人に全ての権限をあたえる
`ls -l`で**`rwxrwxrwx`**になってたらOK
Team Foundation Server で作業項目(WIT)の新規追加

Team Foundation Server の作業項目にいろいろな問い合わせも登録して、ナレッジベースとして活用したいと考えたのですが、どうもこれにしっくりくる作業項目がありません。そこで、カスタマイズして新しい作業項目を追加してみました。
最終的には問い合わせに相応しい入力項目やワークフローを設定すべきですが、まずはタスクを単純にコピーして「問い合わせ」を登録してみました。

## 環境について
**サーバー環境**
Windows 2012 R2 Datacenter + Team Foundation Server 2015 + SQL Server 2012 Standard
**クライアント環境**
Windows 10 Enterprise + Visual Studio 2015 Enterprise

## 手順
- コマンドプロンプトを起動して、以下のディレクトリに移動する

```bat
cd %programfiles(x86)%\Microsoft Visual Studio 14.0\Common7\IDE
```

> 32ビット版の場合は、%programfiles(x86)% でなく %programfiles% になります。

- まずはどのような作業項目（WIT）があるかリストアップ
witadmin コマンドで listwith オプションと以下のように、Team Foundation Server の URL、プロジェクト名を指定して実行します。

```bat
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE>witadmin listwitd /collection:http://tfs:8080/tfs/DefaultCollection /p:SampleProject
タスク
バグ
コード レビュー要求
コード レビュー応答
エピック
機能
フィードバック要求
フィードバック応答
懸案事項
プロダクト バックログ項目
共有ステップ
共有パラメーター
テスト ケース
テスト計画
テスト スイート
```

結構いろいろ登録されていますね。そしてお目当てのタスクがありました！

- 作業項目（WIT）のエクスポート
さて、さっそくエクスポートすべく、以下のコマンドを実行したらファイルに出力されるのではなく、そのままずらずらと標準出力されました。

```bat
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE>witadmin exportwitd /collection:http://win-i2jhb2g5eop:8080/tfs/DefaultCollection /p:SandboxProject /n:タスク
<?xml version="1.0" encoding="shift_jis"?>
<witd:WITD application="Work item type editor" version="1.0" xmlns:witd="http://schemas.microsoft.com/VisualStudio/2008/workitemtracking/typedef">
  <WORKITEMTYPE name="タスク">
    <DESCRIPTION>実行する必要がある作業をトラックします。</DESCRIPTION>
    <FIELDS>
      <FIELD name="イテレーション パス" refname="System.IterationPath" type="TreePath" reportable="dimension" />
      <FIELD name="イテレーション ID" refname="System.IterationId" type="Integer" />

（中略）

      </Layout>
    </FORM>
  </WORKITEMTYPE>
</witd:WITD>
```

- これではお話しにならないので以下のようにファイルに出力しました。

```bat
witadmin exportwitd /collection:http://tfs:8080/tfs/DefaultCollection /p:SampleProject /n:タスク /e:utf-8 > C:\Temp\Task.xml
```

ここでは念の為に、文字コードとして /e オプションで UTF-8 を指定しました。
これでバッチリファイルに出力されました。

- 作業項目のカスタマイズ
出力したファイルを適当なテキストエディタで開きます。眺めるとなんとなくわからなくないのですが、いきなりバリバリとカスタマイズするのは厳しそうです。そこで、まずは３行目の以下の記述

```xml
<WORKITEMTYPE name="タスク">
```

これを以下のように修正して保存しました。

```xml
<WORKITEMTYPE name="問い合わせ">
```

また、念のためファイル名も Task.xml から Question.xml に変更しておきました。

- 最低限のカスタマイズ（というレベルじゃないけど）ができたので、さっそくこれを Team Foundation Server にインポート。と行きたいのですが、構文をチェックする機能がちゃんと用意されていました。先ほどと同じにように witadmin コマンドを使います。

```bat
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE>witadmin importwitd /collection:http://tfs:8080/tfs/DefaultCollection /p:SampleProject /f:C:\Temp\Question.xml /e:utf-8 /v
作業項目の種類は有効です。
```

/v オプションを指定することで、インポートはせず検査だけをしてくれます。「作業項目の種類は有効です」と表示されたので問題ないようです。

- あとは、/v オプションを外してインポートします。

```bat
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE>witadmin importwitd /collection:http://tfs:8080/tfs/DefaultCollection /p:SampleProject /f:C:\Temp\Question.xml /e:utf-8
作業項目の種類のインポートが完了しました。
```
さっそく、Webサイトで確認したら、ちゃんと登録されていました！
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/111347/204e9d25-5ebd-3ab0-417c-b085402f20cf.png)
CSSでグラデーション IE対応

#CSSで
CSS3ではbackground2つ指定できるけど、古いIEではグラデーションとイメージを一括指定できないのでspanにイメージ


##PC
カンタンなグラデーションならこれでOK
`filter-gradient`はIE用

```scss:scss
a{
 @include background-image(linear-gradient(#ffaf37, #f99602));
 @include filter-gradient(#ffaf37, #f99602, vertical);
}
span{
 background: url(../../img/arrow-btn.png) 14px center no-repeat #009250;
}
```


##SP
`@include background-image(linear-gradient(#○○○, #○○○))`はモダンブラウザのみ対応したスタイルになるのでfilterを外すだけ
背景もコンマで区切って2つ指定できる

```scss:scss
background: url(../img/arrow-white-right.png) no-repeat top 5px right 5px,linear-gradient(top, #FA4B60, #ff1431) ;
background-size: auto 15px,auto;
```

##IE9
IE9はグラデーションとborder-radiusがあたっていると前者が優先される
どちらかを選ばないといけないが、IE8はどっちもあたらないし、デザイン的には角丸が優先されることが多い
compassだとモダンブラウザのみ対応なので、filterを消すとIE9以下は自動的にグラデーションなしに
このとき別に背景色を指定しておく。
Windowsでwebsocketのデバッグにwscat使う

# 環境
windows10

# node.jsインストール
とりあえず安定板使う
http://nodejs.jp/nodejs.org_ja/docs/v0.10/#download

環境変数のパスの末尾に\が付く不具合があるそうなので直す
>C:\Program Files\nodejs\
>↓
>C:\Program Files\nodejs

参考：http://webdev.jp.net/windows-nodejs-path/

これで通常のコマンドプロンプトからnode使える！

# npmでwscatインストール
コマンドプロンプトで、

```shell-session
$npm install -g wscat
```
node-gypでpythonが無いよみたいなエラーが出たけどとりあえず動いた

**npm install -g ws**だと動かなかった


#ざっくり使う
サーバーに繋ぐ

```shell-session
$wscat -c ws://localhost:3000
```

サーバーとして待ち受ける

```shell-session
$ wscat -l 3000
```

参考：http://tricknotes.hateblo.jp/entry/20120227/p1

便利！