OmniAICreator/Qiita-1.07M huggingface dataset:
IBB Bluemix に Hubot をデプロイする

# 環境
Ubuntu14.04 in Win10 (Virtual Box 5.0)

# 感想
日本語で丁寧にエラー出力してくれるので使いやすい

# 環境構築

## cf-cli のインストール
```
$ cf api https://api.<地域>.bluemix.net
$ cf login -u <ユーザー名> -o <組織> -s <スペース>
```

## Hubot のインストール
```
$ sudo apt-get install npm
$ sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
$ sudo npm install -g yo generator-hubot
```

```
$ sudo yo hubot 
```
ホスト上にある共有フォルダではコマンドが実行できない。
作業に使う共有フォルダと実際にデプロイするフォルダを同期することで解決してみた（面倒くさいのでより良い方法を模索中）。

HerokuにデプロイしているHubotを移行したかったので、Heroku上のアプリをクローンしてきて必要なファイルををコピーする。
```
$ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh
$ heroku git:clone --app APPNAME
```
クレデンシャル情報を求められ、入力すると clone 成功

コピーして `$ cf push` する。
```
$ cf set-env <アプリの名前> HUBOT_SLACK_TOKEN <slackで取得したtoken>
```

hubot-cron を追加した際にうまくロードできない問題が発生。
package.json, external-scripts.json に直接記述していたのを、package.json から削除して
`$ sudo npm install hubot-cron` としたら解決。
Ionic開発メモ


# **Ionicについて**
ionicはJavaScript(AngularJS)とHTML/CSSを使ってサクッとアプリが作れるフレームワーク。今回はこのionicを使って初めてYelpHackathon2016でAndroidアプリを作ったので知見をシェアしておきます。「他にもこういうやりかたがあるよ〜」みたいなコメントをくれるとサイコウにうれしいです。

ちなみに[EatMash](http://devpost.com/software/eatmash)というアプリを作ってました。

![entrance.png](https://qiita-image-store.s3.amazonaws.com/0/18973/330e6719-d5a8-50dd-2d54-fa0ba97cb348.png "entrance.png")


# **ブラウザで動かす**
ブラウザでアプリのビューが確認できる

```bash:bash
$ ionic serve
```

ラボオプションをつけるとiOSとAndroidのビューを同時に表示してくれる

```bash:bash
$ ionic serve —-lab
```
![スクリーンショット 2016-04-03 13.57.59.png](https://qiita-image-store.s3.amazonaws.com/0/18973/c54faccd-f55d-2020-09af-c12a083bcd4e.png "スクリーンショット 2016-04-03 13.57.59.png")

ちなみに、なぜか`$ ionic serve`で動かしても`ionic.Platform.isWebView()`は常にfalseを返してきて、Android端末から見ている認識をされてしまうので実機・エミュレータかどうかの判別は`window.cordova`がundefinedでないかどうかでしたほうがよい。
(参照: http://stackoverflow.com/questions/30109230/check-if-ionic-app-is-in-dev-serve-modebrowser)

# **エミュレータで動かす**
予めgenymotionでエミュレータを起動しておいて以下のコマンドを実行  

```bash:bash
$ ionic run android
```
- 上のコマンドであればAndroidのイメージを入れなくてもgenymotionがあればエミュレータで動かせる（`$ ionic emulate android`ではgenymotionは起動できないっぽい）
- コンソール出力を表示(-c)したりLiveReloadのオプション(-l)があったりするのでドキュメントを要チェック

# **実機で動かす**
端末をUSBデバッグモードにして下のコマンドで終わり。エミュレータ起動して実機もつないでいるときは`$ ionic address`で起動先が選べるらしいが、試していないので不明。

```bash:bash
$ ionic run android
```
あるいは実際にapkファイルをビルドして端末にぶち込むのもok

```bash:bash
$ ionic build android
```

あるいは **Ionic View** を使うと接続すらしなくてよくなる。
(参照: http://matagotch.hatenablog.com/entry/2015/10/16/210121)

# **デバッグに関する知見**

Chromeの **Device Inspector** を使うとめっちゃ捗る

- 実機でもエミュレータでもエラーログなどを確認したいときには`chrome://inspect/#devices`からインスペクタでネットワークログやコンソールの出力を確認することができる。
- Android4.3以前（たぶん）の端末・エミュレータでインスペクタを使ったデバッグをするためにはGoogleの開発者サービスなどがインストールされている必要があるので、genymotionで開発をするときには予めインストールしておく(参照: http://d.hatena.ne.jp/stealthinu/20150811/p1)

# **その他**
そのほかの便利そうなはなし
## アイコン・スプラッシュイメージの自動生成
  
```bash:bash
$ ionic resources
```
(参照: http://blog.ionic.io/automating-icons-and-splash-screens/)

## LiveReloadがdisableになる
`$ ionic run android -c -l`でconsole出力とLiveReloadを有効にできるはずだけれど、Genymotion上でLiveReloadがdisableになるときがある。そのときはおとなしくAndroidバージョンのできるだけ大きいのを使う（4.4とか）
![スクリーンショット 2016-04-03 14.03.18.png](https://qiita-image-store.s3.amazonaws.com/0/18973/25d841d7-9d57-8ab9-91a8-5326e93ecb50.png "スクリーンショット 2016-04-03 14.03.18.png")
ちなみにLiveReloadは実機でもうまく動かなかったのでそもそもIonic側になにか問題があるのかもしれない。

## proxiesの指定を使ったCORSの回避
ローカルサーバを立ち上げて開発をしているとCORSの問題でAPIを叩けないことがあるが、Ionicのconfigファイルでプロクシを指定することで回避できる
(参照: http://ionicinaction.com/blog/how-to-fix-cors-issues-revisited/)

## デバイス識別クラス
ビルドの際にはターゲットに応じてbodyタグにクラス(`platform-android`みたいなの)が付加される
(参照: http://ionicframework.com/docs/platform-customization/platform-classes.html)
  
## Ionic Lab
力尽きた。
**Ionic Lab** という便利なGUIツールがあってコマンドライン苦手勢でも楽に開発ができるよ！

# **所感**
Angularがある程度わかっていればサクッとアプリが作れていい感じだと思う。けれどやっぱりネイティブと比べてパフォーマンス面でディスアドバンテージがあるのはすごく感じたので、どうやってハイブリッドアプリっぽさを消していくか、がIonic開発のポイントになるように思った。遊びには十分使えるので◎
RabbitMQ CライブラリでSSL接続する

#RabbitMQ CライブラリでSSL接続する。

Pythonだとパラメータ一発で設定できるところ、Cライブラリ https://github.com/alanxz/rabbitmq-c では、正しく手続きを踏まないと完結しないので、そこのところを書く。

ヘッダファイルを読み込む。

```cpp:
#include <amqp_ssl_socket.h>
```

SSLライブラリをイニシャライズする。プログラムの中で、SSLライブラリを呼び出す前に一度だけ実行すればよい。RabbitMQで使用する以外にSSLライブラリを使用していて、そちらで既にSSLライブラリを初期化している場合は、パラメータをfalseにすれば、重複して初期化プログラムを実行しない。

```cpp:
amqp_set_initialize_ssl_library (true);
```

socket生成は、通常の amqp_tcp_socket_new() のかわりに、amqp_ssl_socket_new() を使用する。

```cpp:
amqp_socket_t*  socket = amqp_ssl_socket_new (conn);
```

クライアント接続する際に、サーバ証明書のチェックを行うことを指定する。デフォルトは「チェックする」。

```cpp:
amqp_ssl_socket_set_verify (socket, true);
```

追記：amqp_ssl_socket_set_verify()でfalseをセットしても、サーバ証明書ファイルを指定しないと、amqp_socket_open()の時に、サーバ証明書の検証エラーが出ました。

その後、通常通りサーバに接続する。以降、SSL上でメッセージのやり取りが行われる。ホスト名指定は、サーバ証明書に書かれているホスト名でなければ、チェックではねられる。また、RabbitMQのguestユーザのデフォルト設定は、localhost接続のみに限られているので注意。

```cpp:
int  rc_sock = amqp_socket_open (socket, "amqp.server.name", 5671);
```

まとめると、以下のとおり。

```cpp:ssl_client.cc
#include <amqp.h>
#include <amqp_tcp_socket.h>
#include <amqp_framing.h>
#include <amqp_ssl_socket.h>

int  main (int argc, char** argv) {
    amqp_set_initialize_ssl_library (true);
    amqp_connection_state_t  conn = amqp_new_connection ();
    amqp_socket_t*  socket = amqp_ssl_socket_new (conn);
    int  rc_ca = amqp_ssl_socket_set_cacert (socket, "/usr/local/share/certs/ca-root-nss.crt");
    amqp_ssl_socket_set_verify (socket, true);
    int  rc_sock = amqp_socket_open (socket, "amqp.server.name", 5671);
    if (rc_sock != AMQP_STATUS_OK) {
        fprintf (stderr, "connection failure.\n");
        exit (1);
    }
    amqp_rpc_reply_t  rc_login = amqp_login (conn, "/", AMQP_DEFAULT_MAX_CHANNELS, AMQP_DEFAULT_FRAME_SIZE, AMQP_DEFAULT_HEARTBEAT, AMQP_SASL_METHOD_PLAIN, "username", "userpassword");
        :
}
```
プログラマー1ヶ月目でもわかるwebpayの導入1(rails) 

- 何が書いてあるのか

がっつり文系の大学生が1ヶ月勉強してrailsアプリをちょっとだけ書けるようになったので、調子に乗って作ったアプリにwebpayを導入しようと思って大量の時間を投下してたくさんの人に助けられなんとか導入した話(導入を当時の僕がそのまま実行すれば成功するように書きます。)
何も問題がなければ多分5分くらいでできると思います。

- webpayとは

クレジットカード決済のやつ

https://webpay.jp
決済の中では簡単に導入できるんだとか。

webpayの登録は終わっていること前提で
(簡単にできるので。確かメールアドレス入れるくらいだったと思う。)

1 とりあえず testappでも作ってみる
(導入する前に怖かったので別のアプリを作って試しました。。。。)

```ruby:ターミナル
$ rails new testapp
$ cd testapp
```

2 webpayのgemをインストール

```rails:Gemfile
gem 'webpay'
```

```rails:ターミナル
$  bundle install
```

3 ルーティング

```rails:config/routes.rb
  get  'products' => 'products#index'
  post 'products/pay' => 'products#pay'
```

4 コントローラー

```rails:ターミナル
$ bundle exec rails g controller products
```

```rails:app/controllers/products_controller.rb

  def index
  end

 def pay
 webpay = WebPay.new('鍵')
 webpay.charge.create(
   amount: 400,
   currency: "jpy",
   card: params['webpay-token']
)
end

```

テスト環境用非公開鍵はwebpayのダッシュボードのユーザー設定に入ると書いてある。
というより、ログインした後、CheckoutHelperに書いてあるコードを使えば鍵を調べなくていい。

ちなみにamountが金額

5 view

```rails:app/views/products/index.html.erb
<form action="/アクション名" method="post">
  <script src="https://checkout.webpay.jp/v3/" class="webpay-button" data-key="鍵" data-lang="ja"></script>
</form>
```

https://webpay.jp/docs/checkout
このページにはviewにこのコードを埋め込めば使える的なことが書いてあるのですが
railsはどうやらセキュリティ対策上これだと動いてくれなくて

```rails:app/views/products/index.html.erb
  <%= form_tag(action: :pay, method: :post) do %>
        <script src="https://checkout.webpay.jp/v3/" class="webpay-button" data-key="鍵" data-lang="ja"></script>
      <% end %>
```

form_tagに書き換えてやらないといみたいです。
scriptの部分はCheckoutHelperのコードをそのまま使えばいいのでformの　部分だけ書き換える感じで

```rails:app/views/products/pay.html.erb
  支払い完了
```

これで準備完了

```rails:ターミナル
$ rails s
```

これで
localhost:3000/products
にアクセスすれば「カードで支払う」というボタンが出てきているので
webpayのテスト用カード番号などを入力すればテスト決済ができる。

一応これで決済はできる
けど、決済情報をとったりできないので
その辺を次回で書きたいなと思う


2016.08.18追記

BASE社のPAY.JPの導入について書いたので興味がある方は

[プログラマー歴、半年未満でもわかるpay.jp導入(rails)](http://qiita.com/nekononeko_53/items/972e878e31b135b7a048)

2016.11.06追記

webpayの終了が発表されましたね。
もしよかったらpay.jpを利用してみてください。
(別にpay.jpの中の人ではないです。)
Kitematic(docker-toolbox)を使ってMySQLコンテナを立ち上げる方法

#何をするのか
DockerコンテナとしてMySQLサービスを立ち上げる。
Immutable Infrastructureが加速するかなと思い検証。
Kitematicを使うとすごく簡単にDBコンテナを立ち上げることができた。

#前準備
docker-toolboxをインストールし、中にあるKitematicを利用できるようにしておく
https://www.docker.com/products/docker-toolbox

#MySQLのDockerイメージダウンロード

![スクリーンショット_2016_04_03_13_29.png](https://qiita-image-store.s3.amazonaws.com/0/40127/aee69eb7-42a9-034e-62ad-cc41414c8515.png)


#初回実行時のエラー

![スクリーンショット_2016_04_03_13_47.png](https://qiita-image-store.s3.amazonaws.com/0/40127/334d7795-30e5-9655-9c4d-a43c06f6a6b8.png)


```
error: database is uninitialized and password option is not specified 
  You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
```

#設定の変更

![dockercontainers.png](https://qiita-image-store.s3.amazonaws.com/0/40127/685f4f86-7721-4adf-6b8f-77bca27cac6a.png)

MYSQL_DATABASE=mydb
MYSQL_USER=user
MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=topsecret

#接続先情報の確認
![スクリーンショット_2016_04_03_13_50.png](https://qiita-image-store.s3.amazonaws.com/0/40127/015e390e-04c2-bbb8-a2cd-b00df9c8851e.png)

192.168.99.100:32773に接続すると、MySQLの3306ポートに接続できるようだ

#接続テスト
```
mysql -h 192.168.99.100 -P 32773 -u mysqluser -p
Enter password:  (<- secret)
mysql> use mydb;
mysql> create table hoge(vkey varchar(64), vvalue varchar(255));
mysql> show tables;
+--------------------------------------+
| Tables_in_mydb                       |
+--------------------------------------+
| hoge                                 |
+--------------------------------------+
1 rows in set (0.00 sec)
```

#感想
簡単にMySQLサーバを準備できた
Dockerコンテナを利用しているのでローカルが汚れない
他にもRedis, MongoDB等を簡単に準備できるので開発フェーズでの新しいストレージへの導入敷居は下がる（ただし、運用コストが下がるとは言い切れないので注意）
OnsenUI 2 Beta.8+Angularでons-lazy-repeatを使う

# 記事の対象者
- OnsenUI 2 Beta.7以降でもLazy Repeatを使いたい人
- それをAngularJS1.5のComponentで実装したい人

# 問題
OnsenUI 2 Beta.7で作ったアプリはAndroid端末で動かすと、リストアイテム等の２重クリック防止機能が効かなくなるというバグがある。

この問題はBeta.8で改善されているが、新たな問題が出てきた。ons-lazy-repeatだ。

```html
<ons-list>
    <ons-list-item ons-lazy-repeat="$ctrl.MyDelegate">
        {{item.name}}
    </ons-list-item>
</ons-list>
```

これが動かない。

具体的には、デリゲートオブジェクトを設定しているにも関わらずiOS端末でのみ
Error: templateElement must be {"prototype":{}} or null. You provided [object HTMLUnknownElement]
と表示される。

# 解決方法

loader.js(onsenui.js)のエラー吐くところをコメントアウトする。

```js
var validated = util.validated = function (name, object, options) {
     var type = options && options.type || !options.object && options;
     if (type && !isOfType(object, type) && !(options.dynamicCall || options.safeCall)) {
       //throw new Error(name + ' must be ' + _printType(type) + '. You provided ' + object);
     }
```
怖ッ！

# 結論
とりあえず動かすだけならこれで。

大事なエラーメッセージをコメントアウトするとかちょっと...という人は今後のアップデートを待った方が良いかと。

# 備考
コントローラの詳細は省いたが大体こんな感じ。

```js
(function() {
    'use strict';
    var app = angular.module('app');
    
    function controller() {
        var self = this;
        
        // LazyRepeat用のデリゲート
        this.MyDelegate = {
            configureItemScope: function(index, itemScope) {
                console.log("Created item #" + index);
                itemScope.item = {
                    name: 'Item #' + (index + 1)
                };
            },
            calculateItemHeight: function(index) {
                return 45;
            },
            countItems: function() {
                return 10000000;
            },
            destroyItemScope: function(index, scope) {
                console.log("Destroyed item #" + index);
            }
        };
    }

    // DI
    //controller.$inject = [''];

    // コンポーネントオブジェクト
    var component = {
        bindings:  {
            title : '@'
        },
        controller : controller,
        templateUrl : 'src/components/lazy-test.html'        
    }
    
    // コンポーネント登録
    app.component('lazyTest', component);
    
})();
```
Compose.ioで、PostgreSQLのHA環境（レプリケーション構成）がたった5分で手に入った話

前回の記事で、「簡単にPostgreSQL環境ができた」と書きましたが、具体的にどんな環境かがわからず、ちょと調べてみました。前回の記事は↓。
http://qiita.com/azzeten/items/c1e72b3fe3cb9421e3ba

純粋Japaneseの自分としては、英語のページが苦しい限りですが、ITやってる人間としては仕方ないですね（笑）がんばって、色々ヘルプとかcompose.ioの管理者ページとか見て、読解してみた内容を、書いてみます。
たった5分で作ってくれている割に、**耐障害性とかも結構きっちり**してくれていて、**バックアップも日次・週次・月次・手動でとってくれる**（ここについての詳細はまた後日）みたいです。

##簡単にサマると。
・PostgreSQLはActive-Standby構成
・ユーザはProxy経由で、PostgreSQLのActive側に接続
・Active側の変更内容はPostgreSQLのレプリケーション機能を使ってる。
　つまりWAL（≒PostgreSQLのトランザクションログ。OracleでいうところのREDOログ）を転送。
・ActiveからStandbyへの切り替えは別で立っているetcdが自動でやってくれる（1分以内にフェイルオーバー）。

![スクリーンショット 2016-04-03 13.30.59.png](https://qiita-image-store.s3.amazonaws.com/0/119378/39cd6df1-b75b-0485-4124-f4894e99ffcf.png)



では、詳細を・・・。
以下のようなヒント１とヒント２を追っていって、調べつつ、結論に至った感じです。

##ヒント１：Compose.ioのWebGUI管理画面

お試しの環境を作ると、その環境の管理画面が出来上がるのですが、そこに軽く構成内容をまとめた表がありました。
![スクリーンショット 2016-04-03 13.18.35.png](https://qiita-image-store.s3.amazonaws.com/0/119378/8bc8d602-8a04-e395-f1e1-1d7ac18bca8b.png)

わかるようでわからないような。。

##ヒント２：Compose.ioのヘルプページ
参考URLはこちら。
https://www.compose.io/postgresql/
https://help.compose.io/docs/compose-platform-faq
https://www.compose.io/articles/high-availability-for-postgresql-batteries-not-included/




##結論：マンガにすると、あんなかんじ。
我ながらうまくかけた。
若干適当ですけど。
Linuxコンテナを使ってるから、構築早いんですね。納得納得（サイレント・インストールじゃこうは行かないだろうし・・）たぶんこんなイメージのはず・・。
nvcc fatal   : The version ('70300') of the host compiler ('Apple clang') is not supported

環境
===
- OS X 10.11.4(El Capitan)
- Xcode 7.3

エラー
===
CUDAのコンパイルしようとしたらエラーが出た。(2016/4/3時点)

~~~
nvcc fatal   : The version ('70300') of the host compiler ('Apple clang') is not supported
error: command 'nvcc' failed with exit status 1
~~~

解決
===
http://stackoverflow.com/questions/36250949/revert-apple-clang-version-for-nvcc

  1. Xcodeの以前のバージョン(7.2)をDLする。http://adcdownload.apple.com/Developer_Tools/Xcode_7.2/Xcode_7.2.dmg
Windows(Win7)にNodistでNode.jsをインストール

#概要
　[このリンク集](http://qiita.com/siouxcitizen/items/f0fa38c00e0e49a60ac3)にあるサイトを参考にWindows(Win7)64bit版にNodistによるNode.jsのインストール作業を行ったときの記録です。

　頻繁に更新が行われるNode.jsとそのパッケージ管理機能npmのバージョン管理をWindowsで行うのにNodistというソフトがいいらしいので、まずNodistをインストールしたうえでそれを使用してNode.jsとnpmのインストールを行いました。


#Nodistダウンロード・インストール
　[このサイト](https://github.com/marcelklehr/nodist/releases/)より(201604038時点)最新リリース版Nodistのインストーラの　NodistSetup-v0.7.2.exe　をダウンロード

NodistSetup-v0.7.2.exe　を実行し、以下を設定しつつインストール作業を行う。

- Windows(Win7)64bit版へのインストールなので、「Node.js Architecture」 を 「x64」 に設定。
- インストールを行うフォルダ(デフォルトでは「C:\Program Files (x86)」となっているもの)を適当なものに設定。

Nodistをインストール後、インストールの確認を以下の手順で行いました。
コマンドプロンプトよりNodistのバージョン確認コマンド

```
nodist -v
```

の実行で

```
0.7.2
```

と表示されればNodistのインストールの確認完了です。


#Nodistで指定したバージョンのNode.jsをインストール


コマンドプロンプトよりNodistからインストールできるNode.jsのバージョン一覧を表示するコマンド

```
nodist dist
```

を実行してそのなかからインストールするNode.jsのバージョンを決める。

今回は20160403時点での最新のLTS(Long Term Support)である Node.jsのバージョン4.2.4を選択しインストール(Node.jsのLTSについては[コチラ](https://github.com/nodejs/LTS))してみます。　Nodistから以下のコマンドを実行してインストール。

```
nodist + v4.2.4
または
nodist add v4.2.4
```

最後にバージョン4.2.4のNode.jsが使えるように設定。

```
nodist v4.2.4
```


インストールして使用可能な状態になったNode.jsのバージョンを以下のコマンド

```
node -v
```
で確認すると

```
v4.2.4
```
と表示されます。
これで指定したバージョン4.2.4のNode.jsがインストールされ使用可能な状態になっていることが確認ができました。


#npmを設定

最新版のnpmを以下のコマンドでインストール。

```
npm update -g npm
```

以下のコマンドで確認すると、20160403時点でインストールされたnpmの最新バージョンは3.8.6のようでした。

```
npm --version
```

#その他参考操作
以下は20160403時点で行った操作です

* * *
```
nodist update
```
最新のNode.jsのインストールと依存関係のある設定を行う。　自分の環境で実行してみるとバージョン5.10.0のNode.jsをインストールしようとして途中でエラー出て失敗してました。　今後の自分の作業がちょい心配になる。。。
* * *
```
nodist stable
``` 	
最新安定板のNode.jsをインストールしてくれる。　バージョン5.10.0のNode.jsのインストールを行っていた。　こちらはインストール成功でした。
* * *
```
nodist latest
```
最新版のNode.jsをインストール。　操作時はこれも上記２つの操作と同じようにバージョン5.10.0のNode.jsをインストールするようでした。
* * *

```
nodist ls
```
インストールされたNode.js一覧表示コマンドです。一覧を表示してみると以下のように表示されました。　インストールされたNode.jsの一覧が表示され、実際に使用可能なNode.jsのバージョンの頭には「>」が、尻尾には「(global)」と表示されるよう。

```
  (x64)
  nodev4.2.4
> nodev5.10.0 (global)
```
* * *


```
nodist - v5.10.0
または
nodist rm v5.10.0


nodist v4.2.4
```
指定されたバージョンのNode.js削除コマンドです。上記コマンドではインストールされているNode.jsバージョン5.10.0を削除して、Nodistバージョン2.4.2が使用されるように設定しています。
(上記のような最新版や安定版のインストール以外は「nodist -v4.2.4」ような明示的な使用バージョンの設定が必要？)

ちなみに最終的な状態は

```
nodist ls 
```
により

```
  (x64)
> nodev4.2.4
```

と表示されました。
* * *

#環境変数について
NodistSetup-v0.7.2.exe 実行によるNodistインストール時に自動的に以下のパスが設定されるようです。
* * *
Nodistインストールフォルダのパス例を以下のように置いた場合
例１：C:
例２：C:\Program Files
* * *
「ユーザ名」のユーザ環境変数
変数名：Path
変数値：Nodistインストールフォルダのパス\Nodist\bin
例１：　　C:\Nodist\bin
例２：　　C:\Program Files\Nodist\bin
* * *
システム環境変数
変数名：NODE_PATH
変数値：Nodistインストールフォルダのパス\Nodist\bin\node_modules;%NODE_PATH%
例１：　　C:\Nodist\bin
例２：　　C:\Program Files\Nodist\bin


変数名：NODIST_PREFIX
変数値：Nodistインストールフォルダのパス\Nodist
例１：　　C:\Nodist\bin
例２：　　C:\Program Files\Nodist\bin


変数名：NODIST_X64
変数値：1
* * *
Macを買ったあとにすべき最初の設定(1/2)

ソフトウェアアップデート
---
App storeから。回線が遅いと一晩かかる…
![スクリーンショット 2016-04-01 22.18.49.png](https://qiita-image-store.s3.amazonaws.com/0/80357/ff4593b4-1fe0-a9e5-106a-c023eb22b0c4.png)

ショートカットやキー入力の設定
---

-  同一アプリ内のフォーカス移動
Option + F1 は遠すぎるのでOption + Tabに変更。それでも左手が捻れてきついので、もうちょっと楽にところが…（後述）
<img width="780" alt="スクリーンショット 2016-04-01 22.28.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/80357/172e68a3-8af1-1c86-85c6-5d0a56b40240.png">

- CapsLockを無効化
CapsLockキーを駆除。私はコマンドキーに割り当てている。
<img width="780" alt="スクリーンショット 2016-04-03 12.12.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/80357/62cc5a99-5531-4111-6bc5-34cc9376f250.png">

- 日本語ライブ変換の無効化
便利と噂のライブ変換だが、現在ではElCapitanでしか使えない。慣れると会社のYosemiteで不便するので私は切っている。
<img width="780" alt="スクリーンショット 2016-04-02 11.22.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/80357/ce1a4ca9-74e0-83b2-cbd5-ae3f6ec1dfce.png">

- HJKLの矢印キー化
ここからはキーマッピングソフトも使いながらキーを変更していく。Karabinerをインストールしよう。
https://pqrs.org/osx/karabiner/
まずはカーソルの移動をもっと楽にしたい。右手小指での矢印キー操作は遠いし痛い。そこで、vimのカーソル移動と同じようにHJKLキーを矢印キー代わりに使いたい。慣れるまでは辛いが、一度身につくとこれまでにないスピード感を得られる。
Karabinerで```Control_L + hjkl to Left/Down/Up/Right```にチェックをつけよう。これでホームポジションを崩さずにキー移動ができるゾ。

- 英数キーをもっと活かす
最高のポジションに位置しながら大して役に立たない英数キー。私はコマンドキー化している。```EISU to Command_L```にチェック。

- かなキーももっと活かす
かなキーにも活路を見出したい。私は、Optionキー化している。Optionキーは使用頻度が高い上に押しにくい位置にいるので、こうすることで一挙両得なのだ。```KANA to Option_L```にチェック。これで、同一アプリ間のフォカース切り替えも、かな＋Tabでできるようになった。

- Delete/Enterのホームポジション化
上述のHJKLの矢印キー化に伴う弊害として、デフォルトで備わっているDeleteキーのショートカット```Control + H```が使えなくなってしまう。そこで似た形で代替したい。Karabinerではキーマッピング用のXMLを編集することで任意のキーをマッピングが可能だ。XML記法の詳細は他の記事にまかせ、ここでは結果だけ載せる。

~~~
<?xml version="1.0"?>
<root>
<item>
<name>Control_L+N to Delete</name>
<identifier>Control_L+N to Delete</identifier>
<autogen>
  __KeyToKey__
  KeyCode::N, ModifierFlag::CONTROL_L,
  KeyCode::DELETE
</autogen>
</item>
<item>
<name>Control_L+Semicolon to Return</name>
<identifier>Control_L+Semicolon to Return</identifier>
<autogen>
  __KeyToKey__
  KeyCode::SEMICOLON, ModifierFlag::CONTROL_L,
  KeyCode::RETURN
</autogen>
</item>
</root>
~~~

XMLを書き換えたらReload XMLをクリックしてから```Control_L + N to Delete ```と```Control_L + Semicolon to Return```にチェック。これで```Control + N ```をDeleteキーに変更できた。ついでに ```Control + ;```をEnterキーにしておいた。これで完全にホームポジションが崩れることはなくなったゾ。
<img width="912" alt="スクリーンショット 2016-04-03 11.37.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/80357/bbb3edce-f56a-b371-3672-8923ff96b457.png">


その他
---

- Spotlightを無効化
便利な機能だが、定期的に著しく重くなるので私は切っている。
<img width="780" alt="スクリーンショット 2016-04-01 22.33.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/80357/e7137400-f00d-18ba-d09e-5168c23ea593.png">

その他必要ソフトのインストール
------------------------------
- Chrome
https://www.google.co.jp/chrome/

- Atom
https://atom.io/

- Karabiner
https://pqrs.org/osx/karabiner/

- iTerm2
https://www.iterm2.com/

- Line
http://line.me

- Fluid
http://fluidapp.com/

- Google IME
https://www.google.co.jp/ime/


以上。次はターミナル上で環境を整えていく。
ElectronをつかってHTMLでデスクトップアプリを作る


# 1.準備
## Node.jsインストール
[Node.js](https://nodejs.org/en/)からインストール。
MacならHomebrewで`brew install node`などでもよい。

## [Yeoman](http://yeoman.io/)をインストール

```
npm install -g yo
``` 

## YeomanのElectronジェネレーターをインストール

```
npm install -g generator-electron
```

## [Electornコマンド](https://www.npmjs.com/package/electron-prebuilt)をインストール

```
npm install -g electron-prebuilt
```

# 2.プロジェクト作成
プロジェクト用のフォルダを作成し、そこで次を実行し、アプリ名などを入力する。

```
npm install -g generator-electron
```

# 3.開発
生成されたhtmlなどを編集する。
electronの実行方法は、README.mdに書いてあるとおり。

## 開発用のモジュールインストール

```
npm install
```

## 実行

```
npm start
```

## デスクトップアプリ作成

次を実行すると、Linux, Win, Mac用のアプリがDistディレクトリ配下に作成される。

```
npm run build
```

## 注意点
開発しているときは問題ないが、Mac用にパッケージ化すると、コピペができないバグがある。
メニューを実装すると、コピペできるようになるので、メニューは作った方がよい。

参考
* http://qiita.com/nyamogera/items/81832dccb57054fbd406
* http://yonda1229.hatenablog.com/entry/2015/10/03/163300
Debian GNU/Linux 8.3のGNOMEでfcitx-mozcを使った日本語入力を導入する

# Debian GNU/Linux 8.3のGNOMEでfcitx-mozcを使った日本語入力を導入する #

Last Change: 2016/04/03 12:32:48.

DebianでGNOMEを導入するとデフォルトの日本語入力ソフトウェアはibus-mozcという地獄です。
さっさとfcitxに変更してしまいましょう。

## fcitx-mozcパッケージの導入 ##

まずはパッケージをrootで導入します。

```
# aptitude install fcitx-mozc
```

## im-configでの設定 ##

次にfcitx-mozcを使いたいユーザでログインしてim-configを実行します。

```
$ im-config
```

1. 「OK」を選択
2. 「はい」を選択
3. 「fcitx」を選択
4. 「OK」を選択
5. 「OK」を選択

設定し終えたら再ログインするとfcitxが有効になります。

## fcitxの設定 ##

fcitxの設定は「Fcitx設定」というアプリを使用することで設定できます。

ちなみに私は以下のような設定にしています。

1. 「外観」の「フォントサイズ」を「10」に変更
2. 「外観」の「フォント」を好きなフォントに変更
3. 「外観」の「メニューのフォント」を好きなフォントに変更
4. 「外観」の「状態パネルを隠すモード」を「表示」
5. 「外観」の「候補ウインドウを縦にする」を「有効」

## Mozcの設定 ##

fcitxには日本語入力時のキーボード設定が無いのでMozcの設定画面で選びます。
Mozcの設定は「Mozcの設定」というアプリで設定できます。

ちなみに私は以下のような設定にしています。

1. 「一般」タブで「スペースの入力」を「半角」に変更
2. 「一般」タブで「キー設定の選択」を「ATOK」に変更
[iOS] CLLocationManagerで移動速度を取得する（Swift編）

CoreLocation を利用して移動速度を取得する方法です。

## 実行環境

* Xcode 8.0
* Swift 3.0

## 前提条件

ユーザが位置情報の使用を**許可**している必要があります。詳細は下記記事を参照してください。

[iOS 8から位置情報を取得する方法が変わるよ - Qiita](http://qiita.com/koogawa/items/6ec24ca3201977e9642b)

## 実装方法

CLLocation クラスの `CLLocationSpeed` プロパティを使います。

```swift
/*
 *  speed
 *  
 *  Discussion:
 *    Returns the speed of the location in m/s. Negative if speed is invalid.
 */
@available(iOS 2.2, *)
public var speed: CLLocationSpeed { get }
```

単位は秒速（m/s）です。速度が取得できない時はマイナスの値が返ります。
移動距離から速度を計算するため、精度はそこまで高くないようです。

## 実装例

`startUpdatingLocation ` を実行します。

```swift
override func viewDidLoad() {
    super.viewDidLoad()

    if CLLocationManager.locationServicesEnabled() {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.startUpdatingLocation()
    }
}
```

位置情報が更新されるたびに次のデリゲートが呼ばれます。

```swift
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let newLocation = locations.last,
        CLLocationCoordinate2DIsValid(newLocation.coordinate) else {
            return
    }
    self.mpsTextField.text = "".appendingFormat("%.2f", newLocation.speed)
    self.kphTextField.text = "".appendingFormat("%.2f", newLocation.speed * 3.6)
}
```

### 実行結果

![iOSシミュレータのスクリーンショット 2015.01.04 11.46.17.png](https://qiita-image-store.s3.amazonaws.com/0/8292/04dcecd1-4444-91d7-f0e9-a267cf0acc81.png)

## サンプルソース

https://github.com/koogawa/iSensorSwift/blob/master/iSensorSwift/Controller/SpeedViewController.swift

## おまけ

iOSシミュレータでは **City Bicycle Ride**（自転車で移動している場合）などをシミュレーションできますが、それぞれの移動速度を取得したところ次のような結果になりました。

<table>
<tr><th>City Run </th><th>City Bicycle Ride </th><th>Freeway Drive </th></tr>
<tr><td> 約4m/s</td><td> 約7m/s </td><td> 約33m/s </td></tr>
<tr><td> 約14km/h</td><td> 約27km/h </td><td> 約120km/h </td></tr>
</table>

Freeway Drive の移動速度が意外と速くて驚きました :flushed:
KVM on CentOS6.7 にゲスト OS(CentOS7) をインストールする

CentOS6.7 上に構築した KVM に、ゲストOS(CentOS7) をインストールする。

イメージを保存するディレクトリを作成する。

```
# mkdir -p /home/kvm/iso        -> 保存用
# mkdir -p /home/kvm/images     -> ゲストOSのイメージ保存用
```

```
# virt-install \
--name centos7_1 \
--ram 1024 \
--disk path=/home/kvm/images/centos7_1.img,size=20 \
--vcpus 2 \
--os-type linux \
--os-variant rhel7 \
--network bridge=br1 \
--graphics none \
--console pty,target_type=serial \
--location '/home/kvm/iso/CentOS-7-x86_64-Minimal-1511.iso' \
--extra-args 'console=ttyS0,115200n8 serial' 
```

あとはテキストベースで、インストールを進めていける。
CentOS6 で KVM 環境構築

CentOS7 上で KVM を構築していたけど、調子が悪いので CentOS6.7 で再構築する。

CentOS6.7 のインストールパッケージは、仮想化ホストを選択してインストールした。

必要なパッケージがインストールされていることを確認。

```
# rpm -qa | grep -E 'kvm|virt|bridge'
virt-manager-0.9.0-29.el6_7.1.x86_64
libvirt-client-0.10.2-54.el6_7.6.x86_64
libvirt-0.10.2-54.el6_7.6.x86_64
virt-top-1.0.4-3.15.el6.x86_64
bridge-utils-1.2-10.el6.x86_64
libvirt-python-0.10.2-54.el6_7.6.x86_64
qemu-kvm-0.12.1.2-2.479.el6_7.4.x86_64
libgovirt-0.3.2-1.el6_7.2.x86_64
virt-viewer-2.0-7.el6.x86_64
python-virtinst-0.600.0-29.el6.noarch
virt-what-1.11-1.2.el6.x86_64
```

モジュールが読み込まれているか確認。

```
# lsmod | grep kvm
kvm_amd                40635  0
kvm                   345659  1 kvm_amd
```

実行状況の確認。

```
# service libvirtd status
libvirtd (pid  1918) を実行中...
# service messagebus status
messagebus (pid  1467) を実行中...
```

自動起動設定の確認。

```
# chkconfig --list | grep -E 'libvirtd|messagebus'
libvirtd        0:off   1:off   2:off   3:on    4:on    5:on    6:off
messagebus      0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

ゲストOS 用にブリッジネットワークを構成する。
僕の環境には NIC が 2 つ搭載されているので、ひとまず片方をゲスト用に使用するように設定する。

```
# cd /etc/sysconfig/network-scripts/
# mv ifcfg-eth1 ifcfg-br1
# vi ifcfg-br1
DEVICE=br1 #変更 eth1 -> br1 
TYPE=Bridge #変更 Ethernet -> Bridge
ONBOOT=yes #変更 no -> yes
NM_CONTROLLED=yes
BOOTPROTO=none #変更 dhcp -> none

# vi ifcfg-eth1
DEVICE=eth1
HWADDR=00:1D:7D:A1:7F:CD
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br1

# service network restart
```
Mac OSXでROSをビルドするときのメモ


#ld: library not found for -lopencv_dep_cudart
　ちょいちょい，"ld: library not found for -lopencv_dep_cudart"というリンカエラーが発生するので，そのつど

grep -rl '-lopencv_dep_cudart' ./build_isolated/ | xargs sed -i -e 's/-lopencv_dep_cudart //g'

する．
[iOS]フォーカスが外れたタイミングでキーボードを隠す


何もしないでも標準キーボードはフォーカスが外れたら自動的に隠れてくれるものだと思っていたけど何もしてくれないみたいなので。

`resignFirstResponder`を使ったり`Did End On Exit`を使ったり方法があるみたいだけど、
どのテキストフィールドでもフォーカス外れたらキーボード隠すならこれが一番シンプルそう。


```hideKeyboard.swift
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var textField: UITextField!

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        view.endEditing(true)
    }
}
```
arduinoでusb host その４

#概要
arduino unoにusb hostつないで、usbバーコードリーダーつないでみた。
リーダーは、NEC製PK-UP004Eです。
#写真
![MVC-007S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/038abcb9-1dff-c776-8cc6-35c94cbf478a.jpeg)

#ログ
![bar.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/4b882051-a7d4-7a9d-e79b-f25109ec715f.jpeg)

#サンプルコード
```
#include <hidboot.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

class KbdRptParser : public KeyboardReportParser
{
	void PrintKey(uint8_t mod, uint8_t key);
	protected:
	void OnControlKeysChanged(uint8_t before, uint8_t after);
	void OnKeyDown(uint8_t mod, uint8_t key);
	void OnKeyUp(uint8_t mod, uint8_t key);
	void OnKeyPressed(uint8_t key);
};
void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
	MODIFIERKEYS mod;
	* ((uint8_t *) &mod) = m;
	Serial.print((mod.bmLeftCtrl == 1) ? "C" : " ");
	Serial.print((mod.bmLeftShift == 1) ? "S" : " ");
	Serial.print((mod.bmLeftAlt == 1) ? "A" : " ");
	Serial.print((mod.bmLeftGUI == 1) ? "G" : " ");
	Serial.print(" >");
	PrintHex<uint8_t>(key, 0x80);
	Serial.print("< ");
	Serial.print((mod.bmRightCtrl == 1) ? "C" : " ");
	Serial.print((mod.bmRightShift == 1) ? "S" : " ");
	Serial.print((mod.bmRightAlt == 1) ? "A" : " ");
	Serial.println((mod.bmRightGUI == 1) ? "G" : " ");
};
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
	Serial.print("DN ");
	PrintKey(mod, key);
	uint8_t c = OemToAscii(mod, key);
	if (c) OnKeyPressed(c);
}
void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after)
{
	MODIFIERKEYS beforeMod;
	* ((uint8_t *) &beforeMod) = before;
	MODIFIERKEYS afterMod;
	* ((uint8_t *) &afterMod) = after;
	if (beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl)
	{
		Serial.println("LeftCtrl changed");
	}
	if (beforeMod.bmLeftShift != afterMod.bmLeftShift)
	{
		Serial.println("LeftShift changed");
	}
	if (beforeMod.bmLeftAlt != afterMod.bmLeftAlt)
	{
		Serial.println("LeftAlt changed");
	}
	if (beforeMod.bmLeftGUI != afterMod.bmLeftGUI)
	{
		Serial.println("LeftGUI changed");
	}
	if (beforeMod.bmRightCtrl != afterMod.bmRightCtrl)
	{
		Serial.println("RightCtrl changed");
	}
	if (beforeMod.bmRightShift != afterMod.bmRightShift)
	{
		Serial.println("RightShift changed");
	}
	if (beforeMod.bmRightAlt != afterMod.bmRightAlt)
	{
		Serial.println("RightAlt changed");
	}
	if (beforeMod.bmRightGUI != afterMod.bmRightGUI)
	{
		Serial.println("RightGUI changed");
	}
}
void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key)
{
	Serial.print("UP ");
	PrintKey(mod, key);
}
void KbdRptParser::OnKeyPressed(uint8_t key)
{
	Serial.print("ASCII: ");
	Serial.println((char) key);
	if (key == 49) digitalWrite(2, HIGH);
	if (key == 48) digitalWrite(2, LOW);
};
USB Usb;
HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb);
KbdRptParser Prs;
void setup()
{
	pinMode(2, OUTPUT);
	Serial.begin(115200);
	Serial.println("Start");
	if (Usb.Init() == -1) Serial.println("OSC did not start.");
	HidKeyboard.SetReportParser(0, &Prs);
}
void loop()
{
	Usb.Task();
}

```
arduinoでusb host その３

#概要
arduino unoにusb hostつないで、usbキーボードつないで、Lチカしてみた。
#写真
![MVC-006S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/f3d9c1cd-7e09-ab4f-901b-5f34e4f55aea.jpeg)

#ログ
![kbd.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a9495b6b-4d81-fd3c-4c88-41e1dcddb29d.jpeg)

#サンプルコード
```
#include <hidboot.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

class KbdRptParser : public KeyboardReportParser
{
	void PrintKey(uint8_t mod, uint8_t key);
	protected:
	void OnControlKeysChanged(uint8_t before, uint8_t after);
	void OnKeyDown(uint8_t mod, uint8_t key);
	void OnKeyUp(uint8_t mod, uint8_t key);
	void OnKeyPressed(uint8_t key);
};
void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
	MODIFIERKEYS mod;
	* ((uint8_t *) &mod) = m;
	Serial.print((mod.bmLeftCtrl == 1) ? "C" : " ");
	Serial.print((mod.bmLeftShift == 1) ? "S" : " ");
	Serial.print((mod.bmLeftAlt == 1) ? "A" : " ");
	Serial.print((mod.bmLeftGUI == 1) ? "G" : " ");
	Serial.print(" >");
	PrintHex<uint8_t>(key, 0x80);
	Serial.print("< ");
	Serial.print((mod.bmRightCtrl == 1) ? "C" : " ");
	Serial.print((mod.bmRightShift == 1) ? "S" : " ");
	Serial.print((mod.bmRightAlt == 1) ? "A" : " ");
	Serial.println((mod.bmRightGUI == 1) ? "G" : " ");
};
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
	Serial.print("DN ");
	PrintKey(mod, key);
	uint8_t c = OemToAscii(mod, key);
	if (c) OnKeyPressed(c);
}
void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after)
{
	MODIFIERKEYS beforeMod;
	* ((uint8_t *) &beforeMod) = before;
	MODIFIERKEYS afterMod;
	* ((uint8_t *) &afterMod) = after;
	if (beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl)
	{
		Serial.println("LeftCtrl changed");
	}
	if (beforeMod.bmLeftShift != afterMod.bmLeftShift)
	{
		Serial.println("LeftShift changed");
	}
	if (beforeMod.bmLeftAlt != afterMod.bmLeftAlt)
	{
		Serial.println("LeftAlt changed");
	}
	if (beforeMod.bmLeftGUI != afterMod.bmLeftGUI)
	{
		Serial.println("LeftGUI changed");
	}
	if (beforeMod.bmRightCtrl != afterMod.bmRightCtrl)
	{
		Serial.println("RightCtrl changed");
	}
	if (beforeMod.bmRightShift != afterMod.bmRightShift)
	{
		Serial.println("RightShift changed");
	}
	if (beforeMod.bmRightAlt != afterMod.bmRightAlt)
	{
		Serial.println("RightAlt changed");
	}
	if (beforeMod.bmRightGUI != afterMod.bmRightGUI)
	{
		Serial.println("RightGUI changed");
	}
}
void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key)
{
	Serial.print("UP ");
	PrintKey(mod, key);
}
void KbdRptParser::OnKeyPressed(uint8_t key)
{
	Serial.print("ASCII: ");
	Serial.println((char) key);
	if (key == 49) digitalWrite(2, HIGH);
	if (key == 48) digitalWrite(2, LOW);
};
USB Usb;
HIDBoot<USB_HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb);
KbdRptParser Prs;
void setup()
{
	pinMode(2, OUTPUT);
	Serial.begin(115200);
	Serial.println("Start");
	if (Usb.Init() == -1) Serial.println("OSC did not start.");
	HidKeyboard.SetReportParser(0, &Prs);
}
void loop()
{
	Usb.Task();
}

```
arduinoでusb host  その２

#概要
arduino unoにusb hostつないで、usbマウスつないで、Lチカしてみた。
#写真
![MVC-005S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/08d8e721-ac03-2f91-f14e-eedbd3a8f767.jpeg)

#ログ
![mouse.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/976d9bf4-04c3-6a93-a37f-a2091eff9046.jpeg)

#サンプルコード
```
#include <hidboot.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

class MouseRptParser : public MouseReportParser
{
protected:
	void OnMouseMove(MOUSEINFO * mi);
	void OnLeftButtonUp(MOUSEINFO * mi);
	void OnLeftButtonDown(MOUSEINFO * mi);
	void OnRightButtonUp(MOUSEINFO * mi);
	void OnRightButtonDown(MOUSEINFO * mi);
	void OnMiddleButtonUp(MOUSEINFO * mi);
	void OnMiddleButtonDown(MOUSEINFO * mi);
};
void MouseRptParser::OnMouseMove(MOUSEINFO * mi)
{
	Serial.print("dx=");
	Serial.print(mi->dX, DEC);
	Serial.print(" dy=");
	Serial.println(mi->dY, DEC);
};
void MouseRptParser::OnLeftButtonUp(MOUSEINFO * mi)
{
	Serial.println("L Butt Up");
};
void MouseRptParser::OnLeftButtonDown(MOUSEINFO * mi)
{
	digitalWrite(2, HIGH);
	Serial.println("L Butt Dn");
};
void MouseRptParser::OnRightButtonUp(MOUSEINFO * mi)
{
	Serial.println("R Butt Up");
};
void MouseRptParser::OnRightButtonDown(MOUSEINFO * mi)
{
	digitalWrite(2, LOW);
	Serial.println("R Butt Dn");
};
void MouseRptParser::OnMiddleButtonUp(MOUSEINFO * mi)
{
	Serial.println("M Butt Up");
};
void MouseRptParser::OnMiddleButtonDown(MOUSEINFO * mi)
{
	Serial.println("M Butt Dn");
};
USB Usb;
HIDBoot<USB_HID_PROTOCOL_MOUSE> HidMouse(&Usb);
MouseRptParser Prs;
void setup()
{
	pinMode(2, OUTPUT);
	Serial.begin(115200);
	Serial.println("Start");
	if (Usb.Init() == -1) Serial.println("OSC did not start.");
	HidMouse.SetReportParser(0, &Prs);
}
void loop()
{
	Usb.Task();
}

```
Scala.jsでAngular(1.5)試した

Scala.jsに入門したのでangularを使い、簡単なTODOアプリを書いてみた。

[コードはコチラ](https://github.com/ryoppy/scalajs-angular-todo-example)

## angularのコントローラー

todos変数をhtmlでng-repeatしてて、todoServiceでajax通信しデータ取得してる。

```scala
class TodoCtrl($location: Location, todoService: TodoService) extends Controller {
  var todos = js.Array[Todo]()

  def list() = {
    todoService.list().onSuccess { case j =>
      todos = j.items.toJSArray
    }
  }
```

TypeScriptで書いてたのと似てる。
Todoのcase classがサーバー側と共通で使えるので良い。

他はリポジトリのコード読んでください。

## 良かったところ

- ほんと普通にScalaでjsが書ける。
- case classがサーバー側と共通で使えて良い。
- ライブラリが対応してればjs側でも同じく使える。
- ファイルサイズ意外と小さい?。minifyするfullOptJsで288KB。

## 悪かったところ

- コンパイル時間が(ry
- たまにcleanしないと上手くjsが生成されないことがある。
- 生成されたjs、読む気になれん。
- HttpPromiseからFutureに変換してonCompleteするとTodoCtrlのtodosの更新が検知されなくなってよく分からんかった。

## まとめ

angular+scala.jsは、上手く動かないと聞いていたが今は大丈夫なよう。
ImmutableJSとか使う必要なく、Scalaのメソッドで書けるので良い...。パターンマッチがjsで使えるの良い...。
Scala.js良いね。
pythonでloggingする方法（No handlers could be found for logger "__main__"と出る場合）

# 問題

そこら辺に転がってるサンプルコードとして

```cannot_log.py:
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.info("hoge")
```

こういうのを見かけるが、これをそのままコピペしても動かない。

```
No handlers could be found for logger "__main__"
```

このエラーメッセージは2行目で出ている。
`__name__` は最初に指定されたファイル名なので `"__main__"` となる。

```workaround.py:
import logging
logging.info("ho")
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.info("hoge")
```

何故か`logging.`モジュールから一度でも何か吐き出しておくと動く。

```
INFO:__main__:hoge
```

# 解決策

loggerはコンフィグを与えないと行けない。

```log_example.py:
import logging
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.info("hoge")
```

`logging.info("")` とした場合、内部で `logging.basicConfig()` に相当する操作が行われている。
MBR修復時の勘違い

Windowsが起動しない!
いつまでもアンダーバーが点滅したまま進まない!
でも外付けHDDからのチェインブートだと起動する!
MBRがおかしくなってるのか?

そこまでは良かったんだけど…

# 何を間違ったのか
OS: Windows7 32bit
パーティションはこんな感じ
1. System 508MB
2. C: 845GB
3. D: 76GB
4. 回復パーティション 9GB

この時、Windowsで予約されたパーティション(1.)をdiskpartでアクティブにして
bootrecをかけてやればすぐ済んだのだが、
MBRをよく知らなかった自分は1.をMBRと思い込み、
ひたすらCドライブをアクティブにしてMBRの修復をかけ続けていたのだった。

**結論 : MBRと予約された領域を間違えない。**

す、すいません。ぼくが悪かったです。
3.5mm jackの仕様

知らなかったのでメモ

「Raspberry Pi 2 Model B」の「3.5mm jack」の仕様は以下の通り、

![color_av-pinouts-300x163.jpg](https://qiita-image-store.s3.amazonaws.com/0/118796/c8817755-1e5c-7ae3-bdca-154cfae0b325.jpeg)

そもそも、3.5mm jackに色々な仕様があるなんてことを知らなかった。。orz
Xamarin.AndroidでReleaseビルド時アプリ起動直後に落ちる

Xamarinが無償化したのでさっそくアプリ開発をしていたのですが、Debugビルド時には動くのにReleaseビルド時アプリ起動直後にエラーログすら出さずに落ちるという事態に遭遇したので、暫定的に対処した方法を載せておきます(もし、解決法やこの場合のエラーログの表示のしかたを知っている方がいたらコメントお願いします)

追記)設定を少し弄ったらエラーの一部だけ見えるようになり、もう少しマシな暫定的な対処法を見つけたので記事の下のほうに追加しておきました

## ソリューション構成
すべてC#プロジェクトで

- Blank App(Android)
- クラスライブラリ(iOS、Android、Windowsのポータブル)
- コンソールアプリケーション

Blank App(Android)とコンソールアプリケーションがクラスライブラリ(iOS、Android、Windowsのポータブル)を参照に追加しているという形です(コンソールアプリケーションはテスト用なのでこの場合は関係ないかと思います)

## Nuget

- ReactiveProperty
- Xamarin.Android.Support.v7.AppCompat
- Xamarin.Android.Support.v7.CardView

と、これらが依存しているものを使用しています

## 原因探し

とりあえずぐーぐる大先生に聞いてみたところ[Xamarin.AndroidでReleaseビルドの時のみSystem.Servicemodel.ChannelFactoryでエラーが出た。](http://qiita.com/yu_ka1984/items/881bfa1068b19c0ad3a8)を発見しました

似たような内容っぽかったのでこれで直せると思い、さっそくリンカーファイルを弄ったのですがそれでも変わらず…

他の記事がないかと探していると[axilis.blog - Android release build MissingMethodException with Xamarin 4 upgrade](http://www.axilis.com/2016/01/26/android-release-build-exceptions-with-xamarin-4/)というものが出てきたのですが、これも違いました…

ここで、どうやらリンカー関連でなにかあるとわかったのでプロジェクトのプロパティを見てみることにしました

まず最初にLinkingをSdk Assemblies OnlyからSdk and User Assembliesに変更、これでも変わらず。

そのままじっと眺めていると
![linker.PNG](https://qiita-image-store.s3.amazonaws.com/0/51176/4d3c5ef2-ce72-546f-aa5d-f0b4f18ff3e0.png)
ここのLinkerの設定がDebugとReleaseで分けられていることに気づきました

そしてReleaseビルドはSdk Assemblies OnlyだったのですがDebugビルドはNoneでした。ここにDebugとReleaseの違いがあったのでReleaseビルドのLinkingをNoneにしたところちゃんと動きました！！！

## 原因
やはりリンカー関連でしたがリンクすると落ちるとは

[ここ](https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/)の通りにしていたのでアプリの容量減らすためにReleaseビルドはリンクするものと思ってたのですがしなくてもいいみたいですね(アプリ容量は2倍になったけど)

## 暫定的な対処法1
Releaseビルド時アプリ起動直後で落ちて解決法がわからなかったらLinkerのLinkingをNoneにするとアプリ容量は増えますが動くようになります

## 暫定的な対処法2
リンクしないとアプリ容量が大きくなってしまうのでどうにかならないかなぁと頑張っていたら、デバックモードでのプロジェクトのAndroid OptionsのUse Shared Runtimeをオフにしたらほんの少しですがエラーメッセージが表示されました
![findviewbyid.PNG](https://qiita-image-store.s3.amazonaws.com/0/51176/754d6048-1acb-6785-a69d-1724cfa6ab6c.png)
これがView.FindViewByIdメソッドのとこで出てたんですが詳細なメッセージはどこに…
(FindViewByIdをコメントアウトして動かすとエラーメッセージ出してくれなくなるのでこれだけを頼りにすることにしました)

ということなので、FindViewByIdのあるアセンブリMono.Androidをリンクから外したらなぜか動きました
(Mono.Androidのリンクが失敗しているのかリンク自体が失敗しているけど実際に使用しているのはMono.Androidだけなのかどっちなんでしょうかね？)

対処法をまとめると

 - LinkingをSdk Assemblies Onlyに(Sdk and User Assembliesだと落ちました)
 - Skip Linking AssembliesにMono.Androidを追記

これでLinking:Noneから8MBぐらい削れました
VisualStudioでAngularJSとASP.NETを使って Modal Dialog

目的：VisualStudioでAngularJSとASP.NETを使い、Modal Dialogを実装する。
理由：VisualStudioでのWebSite構築は情報が多く複雑である。理解しやすいようシンプルな情報で構成した。
備考：<a href="http://ngmodules.org/modules/angular-dialog-service">angular-dialog-service</a>を使用する
実行結果：
![ModalSample.png](https://qiita-image-store.s3.amazonaws.com/0/118025/21cea783-f81f-e0ad-627f-97d9bc81c106.png)


実行方法：
1.<a href="https://github.com/redpeaks33/AngularJS_VisualStudio_DialogService.git">AngularJS_VisualStudio_DialogService.git</a>のサイトからZipダウンロードして解凍
2.ソリューション（.slnファイル）をクリック　して VisualStudio起動
3.実行（Ctrl ＋ F5）

フォルダ構成
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/118025/cd4ff05e-5104-5696-be63-b4a2f9407512.png)


1.index.htmlを設定
ポイント：Angular-Sanitize,Angular-UIBootstrap,Bootstrap本体を追加する必要あり

```index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" ng-app="app">

<head>
    <title></title>
    <!--Angular そのもの-->
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.3/angular.min.js"></script>
    <!--Angular Sanitize-->
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-sanitize/1.4.8/angular-sanitize.js"></script>
    <!--Angular UI Bootstrap-->
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.14.3/ui-bootstrap-tpls.js"></script>
    <!--Bootstrap-->
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
    
    <!--angular-dialog-service 本体-->
    <script src="/dialog/dialogs.min.js"></script>
    <link href="/dialog/dialogs.min.css" rel="stylesheet" />
 
    <script src="/js/controller.js"></script>
    
</head>
<body>
    <div ng-controller="MyCtrl">
        <button class="btn btn-primary" ng-click="Open()">Open Dialog</button>
    </div>
</body>
</html>

```
2.controller.jsを設定

```controller.js
var main = angular.module("app", ['ui.bootstrap','dialogs.main']);

main.controller('MyCtrl',['$scope','dialogs',function ($scope,dialogs) {
    $scope.Open = function () {
        dialogs.notify('Something Happened', 'Something happened at this point in the application that I wish to let you know about');
    }
}]);



```

3.呼び出すメソッドでNotify,Error,Wait　形式を変更可能

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/118025/67aae63e-2896-f596-109e-c757d55a8034.png)

```controller.js
   dialogs.notify('Something Happened', 'Something happened at this point in the application that I wish to let you know about');
　　dialogs.error('Error', 'An unknown error occurred preventing the completion of the requested action.');
   dialogs.wait('Creating User', 'Please wait while we attempt to create user "Michael Conroy."<br><br>This should only take a moment.', 50);
```


おしまい
技術英語 > I believe Commander Chakotay's suggestion does [have merit]. / proved to be the cornerstone of peace.

@ Star Trek Voyager > ALLIANCES

敵のケイゾンと Alliances を組むと提案する Chakotay に対して納得いかないJaneway.

Tuvokの意見を聞くと

> I believe Commander Chakotay's suggestion <font color=red>does have merit</font>.

meritは無冠詞。
doesで強調している。

<hr>
あとに続くのは、過去にバルカン人の議論の例。地球人と Alliances を組むという提案が Spock から出た時に

> Spock's suggestion, so controversial at first, <font color=red>proved to be the cornerstone of peace</font>.

http://ejje.weblio.jp/content/cornerstone
ズンドコキヨシ with Nim

ズンドコキヨシのNimバージョン

Nim版が無かったので書いてみました。
(EDIT: `quit` を利用して一行短くしました。4/03, 2016)

元ネタ：https://twitter.com/kumiromilk/status/707437861881180160

```nim
# How to compile: nim c -r FILENAME.nim
import math

type ZunDoko = enum
  doko, zun

iterator zundokoGenerator(): ZunDoko =
  yield case math.random(2).ZunDoko:
          of zun:  echo "ズン"; zun
          of doko: echo "ドコ"; doko

var song: seq[int] = @[]
while true:
  for z_or_d in zundokoGenerator():
    song.add(z_or_d.int)
    if z_or_d == doko:
      defer: song = @[]
      if song.sum >= 4:
        echo "キ ヨ シ!"
        quit 0
```

出力
```
ズン 
ドコ 
ズン 
ズン 
ズン 
ズン 
ドコ 
キ ヨ シ!
```

追記: threadsを利用した実装

```nim
# How to compile: nim c -r --threads:on FILENAME.nim
import math, threadpool

type ZunDoko = enum
  doko, zun

iterator zundokoGenerator(id: int): ZunDoko =
  yield case math.random(2).ZunDoko:
          of zun:  echo "ズン" & $id; zun
          of doko: echo "ドコ" & $id; doko

var song {.threadvar.}: seq[int]

proc kiyoshi(id: int = 0) {.thread.} =
  block done:
    song = @[]
    while true:
      for z_or_d in zundokoGenerator(id):
        song.add(z_or_d.int)
        if z_or_d == doko:
          defer: song = @[]
          if song.sum >= 4:
            echo "キ ヨ シ!" & $id
            break done
          
when isMainModule:
  let max_threads = 10
  for i in 1..max_threads:
    spawn kiyoshi(i)
  sync()
```
Bootstrapping a Chef Server headlessly

Originally posted in <http://espinosa.io/blog/2016-04-02-loginless-chefserver-bootstrap.html>

The steps for installing a standalone Chef server[^1] involves downloading the
admin and validation private keys to complete the setup. This means that you
need some file transfer mechanism from your server like SSH.  I will show below
how to skip these steps and use existing private keys that is already installed
in your Chef workstation instead.  The advantage of this approach is that you
only have a single key for all your Chef server deployments including a Hosted
Chef server account.

## Preparation

We assume that you already have your workstation's client.pem and validation.pem
downloaded. Obtain their public keys and save them for later

    $ openssl rsa -in ~/.chef/client.pem -pubout > client.pub
    $ openssl rsa -in ~/.chef/validation.pem -pubout > validation.pub

For truly loginless setups, you can safely paste these public keys in the
   startup scripts/ user data field on your Cloud provider.

After following steps 1-4[^1], use the following steps instead:

## Setup the user

1. Create the admin user but redirect the private key destination to
   `/dev/null`.  We don't need it at all

        $ chef-server-ctl user-create username FirstName LastName \
            email@domain password -f /dev/null

2. Delete the use client key.

        $ chef-server-ctl delete-user-key username default

3. Finally, add a default user key again with the `client.pub` string we generated
   earlier. 

        $ chef-server-ctl add-user-key username --key-name default \
            --pub-key-path client.pub


## Setup the organization

We will use a similar approach for the organization's validation key.

1.  Create the organization and send its private key to `/dev/null` as well.

        $ chef-server-ctl org-create orgname OrgFullName -a username -f /dev/null

2.  Delete the validation client key. By default the name of the validation
    client is `<orgname>-validator`.

        $ chef-server-ctl delete-client-key orgname orgname-validator default

3.  Add the validation public key we extracted earlier.

        $ chef-server-ctl add-client-key orgname orgname-validator \
            --key-name default --pub-key-path validation.pub

[^1]: <https://docs.chef.io/install_server.html#standalone.html>
invalid octal digit エラーが起きたとき（datetimeで起きて泣いたのでメモ）

# たぶん初歩的なミス
多分初歩的なエラーなんだけど、プログラミングに不慣れなため少々調べるのに時間を食ったのでメモ。

# invalid octal digitの意味
invalid octal digit っていうのは無効な8進数くらいの意味です。

# 症状
どんなときに起きたかというと、db:seedで仮のデータを入れてみているときに発生。

```ruby:seed.rb
datetime: DateTime.new(2015,10,08,00,00,00)
```

と入力したseedファイルを `bundle exec rake db:seed` すると、`invalid octal digit`というエラーが出てしまった。

# 解決法
0から始まる数字はデフォルトで8進数になるとか。
なので、

```ruby:seed.rb
datetime: DateTime.new(2015,10,8,00,00,00)
```

に変更したところ、ちゃあんと通りました。

# 先輩方へ
これで合ってるんでしょうか。と思いながらこの記事書いてます。ぐぐったら日本語の記事がなかったので、一応・・・。
InfoPath Form Services 上でテンプレートの URL を取得する

SharePoint フォームライブラリで InfoPath サーバーフォームを開いたとき、テンプレート(*.xsn) によって制御を変えたかった。
新規フォームだとクエリーパラメータに持っているのでそれを使えば済むけど、編集フォームではクエリーパラメーターにないので困って調べたところ、CurrentFormData に色々とフォームのデータが隠されていた。

ただし、なぜか

```js
CurrentFormData.XsnLocation('FormControl')
```

だと取得できなかったけど

```js
CurrentFormData.AbsoluteSolutionLocation('FormControl')
```

で取得できた。

***
2017/04/03 追記） 上記の取得方法がいつの間にか動かなくなっていた。
→ 'FormControl' でなく 'ctl00_ctl33_g_c4e63c75_dd71_45d8_81ce_78a2f125f011_FormControl0' みたいな感じでないと取れない。。。これ仕様変更？バグ？

以下、対症療法。

```js
var xsnLocation = null;
try {
    // なぜか CurrentFormData.CurrentFormData_XsnLocation では取得できない
    xsnLocation = CurrentFormData.AbsoluteSolutionLocation('FormControl');
    console.log('xsnLocation(FormControl): ' + xsnLocation);
} catch (e) {
    // 取れなかった場合のエラーハンドリング
    try {
        console.warn('xsnLocation from FormControl was fail.');

        // 2017/04/03 なぜか FormControl から取得できなくなったので苦肉の策
        var wpForm = document.getElementById('WebPartWPQ2'); // フォームのWebパーツを取得
        var idForm = wpForm.getElementsByTagName('div')[0].id // 子要素の id を取得
        console.log('WebPartWPQ2.id: ' + idForm);
        xsnLocation = CurrentFormData.AbsoluteSolutionLocation(idForm); // 子要素の id から取得
        console.log('xsnLocation(WebPartWPQ2): ' + xsnLocation);
    } catch (e) {
        // 自信がないので更にキャッチ
        console.error('xsnLocation from WebPartWPQ2 was fail.');
    }
}

alert(xsnLocation); // 取れたかな？
```

* * *

おまけコーナー
新規フォームでクエリーパラメータから取得する方法

```js
JSRequest.EnsureSetup();
JSRequest.QueryString["XsnLocation"]
```