OmniAICreator/Qiita-1.07M huggingface dataset:
C言語に参照渡しは存在しない

標題の通りで,C言語に参照渡しは存在しない.
Google翻訳に参照を翻訳してもらった.

#参照とは
![スクリーンショット 2016-03-20 18.12.55.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/8df593c2-b713-3431-05f1-4044f1ca3a10.jpeg)
参照とはリファレンスのこと.逆に言えばリファレンスしか存在しない言語はポインタが存在しないと言うこと.（違う？）

#c言語での値渡し
早速以下のプログラムを作成した.
![スクリーンショット 2016-03-20 18.03.45.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/74a6fbd3-cfa8-081d-5dbf-8aa10155604c.jpeg)

実行した結果が以下の通りだ.
![スクリーンショット 2016-03-20 18.04.32.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/52214973-0262-f48f-df5e-d853c7935e4f.jpeg)
関数に変数のアドレス（第1引数）を渡して,関数内部で値を書き換えている.そのため,渡した関数で表示が書き換わっているのが確認できる.
この渡し方を「値渡しのポインタ渡し」という.
第2引数は「値渡しの値渡し」という（誰も言っていない）.

#ポインタ渡し
今回のメインである参照渡しが存在しないことの証明プログラムを載せる.
![スクリーンショット 2016-03-20 18.10.28.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/a5baa864-bad3-0fbc-59f9-f7dd7d8b3dcd.jpeg)

そもそも参照渡しは何かと言えば,上記のmainプログラム結果に100が表示されることを指す.

#c++の参照渡し（本物の参照渡し^^）
![スクリーンショット 2016-03-21 00.46.35.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/319f5a4f-70c1-7858-5ddd-133d261149f2.jpeg)
![スクリーンショット 2016-03-21 0.47.08.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/513ddb95-20ba-4bf2-52de-45b005e35474.jpeg)
想定通り・・・かな.

しかしc言語のプログラムのように関数の呼び出し先で,変数にアドレスを格納する.
![スクリーンショット 2016-03-21 0.51.03.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/c7e88894-bbc9-514c-c78a-f7aa87135350.jpeg)
どういうこと！？
もしかして,私はc++を知らない！？
（技術力不足で派遣先をクビになったぐらいだからな・・・）

#結論
c++を勉強し直します.

#あれから20160403（追記）
[コメント](http://qiita.com/chesscommands/items/9b555156ab629a58095a#comment-2d404bcfed19fca7878d "アドバイス")にて @SaitoAtsushi さんから参照についてのアドバイスをいただいた.
「参照とは別名である」
もろ,答えですね.
![参照渡しで変数を渡す20160403.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/80a9412c-0e2f-c9e9-b4a8-e749db580924.jpeg)
変数の中身を別名変数に渡した場合問題なくmain関数で表示される.
さらに,別名変数を上書きすべく努力したが無駄だった.
![参照変数の上書き努力.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/71bc6b24-f7e5-85a4-62bf-231c4ab7c497.jpeg)
ありとあらゆる格納方法を試したが,すべてエラーになってしまった.
やはり,1度付いた名前はどうすることも出来ないと言うことだと理解した.
これを機に,変数名にキラキラネームを付けないようにしようと思いました.
コメントを付けていただきありがとうございました.
[上記のソースコード](https://github.com/chesscommands/clang/blob/master/cPlusPluslangKai3.cpp "cPlusPluslangKai3.cpp")
※さらに残念ながらGitの使い方も理解していなかった.これは後日勉強し直す.


#参考URL
http://qiita.com/bugdasi/items/7856931f4cacf2c5b743
※またこのページを参考にした.
http://www.gologo13.com/2013/03/23/how-to-compile-c-plus-plus-with-clang/
文字コードがEUCの場合のexplodeの挙動について

## 概要
PHPで全角を扱う場合、少し加工したり情報を取得するためにもマルチバイト対応されている関数かどうかを意識する必要がある。
今回は、最近私が遭遇した、全角スペースで文字を配列に変換する処理での注意点をまとめる。

## とりあえず、問題のあるソースコード
名前を全角スペースで姓と名に分割する処理を、EUC−JPで処理した場合のソースコード。
（文字コード変換周りの処理が少しごちゃごちゃしているのはご愛嬌で・・・）

```php
mb_internal_encoding('EUC-JP');
$fp = fopen('result.txt', 'w');
$nl = "\n";
$space = '　';    // これは、全角スペース
$space = mb_convert_encoding($space, 'EUC-JP', 'UTF-8');

$name = '伊集院　光';
$name = mb_convert_encoding($string, 'EUC-JP', 'UTF-8');

// === まずは、そのままの文字列を文字コードとともに出力する
fwrite($fp, $name. $nl);
for ($i = 0; $i < mb_strlen($name); $i++) {
    $char = mb_substr($name, $i, 1);

    fwrite($fp, $char. '  ('. bin2hex($char). ')'. $nl);
}

// === explodeで配列に変換した結果を出力する
fwrite($fp, '----------'. $nl);
foreach (explode($space, $name) as $value) {
    fwrite($fp, $value. '  ('. bin2hex($value). ')'. $nl);
}
```

実行結果は以下のとおり。

```text
伊集院　光
伊  (b0cb)
集  (bdb8)
院  (b1a1)
　  (a1a1)
光  (b8f7)
----------
伊集� (b0cbbdb8b1)
仝� (a1b8f7)
```

「院」の後半1byteのa1と全角スペース前半のa1で全角スペースとして処理され、分割結果が文字化けしてしまう。

## 正しいソースコード
`explode`ではなく、`mb_split`を利用して分割処理を修正した。

```php
mb_internal_encoding('EUC-JP');
mb_regex_encoding('EUC-JP');
$fp = fopen('result.txt', 'w');
$nl = "\n";
$space = '　';    // これは、全角スペース
$space = mb_convert_encoding($space, 'EUC-JP', 'UTF-8');

$name = '伊集院　光';
$name = mb_convert_encoding($string, 'EUC-JP', 'UTF-8');

// === まずは、そのままの文字列を文字コードとともに出力する
fwrite($fp, $name. $nl);
for ($i = 0; $i < mb_strlen($name); $i++) {
    $char = mb_substr($name, $i, 1);

    fwrite($fp, $char. '  ('. bin2hex($char). ')'. $nl);
}

// === mb_splitで配列に変換した結果を出力する
fwrite($fp, '----------'. $nl);
foreach (mb_split($space, $string) as $value) {
    fwrite($fp, $value. '  ('. bin2hex($value). ')'. $nl);
}
```

 `mb_split`は、`mb_regex_encoding`で設定されている文字コードで分割処理を実行するため、正しく分割処理が行える。
実行結果は以下のとおり。

```text
伊集院　光
伊  (b0cb)
集  (bdb8)
院  (b1a1)
　  (a1a1)
光  (b8f7)
----------
伊集院  (b0cbbdb8b1a1)
光  (b8f7)
```

## まとめ
今回のケースは、おそらく元々は半角スペースで区切っていたものを、仕様変更か何かで全角スペースを使うようになり、`explode`の引数だけを変更して対応したことで発生した問題だと思われる。

文字列の中に全角が含まれていても、区切り文字が半角文字なら、`explode`でも問題なく動作する。これは、EUC-JPでは半角文字のコードが21〜7Eまでで、全角文字の後半1byteはA0以降のため、誤検知する恐れがないため。
**ただし、全角文字を区切り文字に指定した場合には上記のような誤検知が発生する可能性があるため、きちんと使用している関数がマルチバイト対応しているかどうか確認しておく必要がある。**

## ちなみにSJISの場合
SJISだと、全角スペースの文字コードが`8140`のため同じ現象は発生しない。
EUCの時と同様に前半と後半が同じ並びになる文字は「＝(`8181`)」なので、全角スペースの代わりに＝を、お名前も全角スペースの直前が`81`になるものを利用すると、同様の現象を発生させることができた。

```php
mb_internal_encoding('SJIS-win');
mb_regex_encoding('SJIS-win');
$fp = fopen('result.txt', 'w');
$nl = "\n";
$space = '＝';
$space = mb_convert_encoding($space, 'SJIS-win', 'UTF-8');

$string = '宇梶＝剛士';
$string = mb_convert_encoding($string, 'SJIS-win', 'UTF-8');

// === まずは、そのままの文字列を文字コードとともに出力する
fwrite($fp, $string. $nl);
for ($i = 0; $i < mb_strlen($string); $i++) {
    $char = mb_substr($string, $i, 1);

    fwrite($fp, $char. '  ('. bin2hex($char). ')'. $nl);
}

// === explodeで配列に変換した結果を出力する
fwrite($fp, '----------'. $nl);
foreach (explode($space, $string) as $value) {
    fwrite($fp, $value. '  ('. bin2hex($value). ')'. $nl);
}
```

```text
宇梶＝剛士
宇  (8946)
梶  (8a81)
＝  (8181)
剛  (8d84)
士  (8e6d)
----------
宇�  (89468a)
″ьm  (818d848e6d)
```
Intel EdisonにMongoDBをインストールする


久々に入れようとしたらやり方を忘れていたので、忘備録代わりに記録。

## バイナリファイルの取得と配置

32bit版のLinux用バイナリを取得して適当な場所に配置します。

```
$ wget https://fastdl.mongodb.org/linux/mongodb-linux-i686-3.2.4.tgz
$ mkdir ~/bin
$ cd ~/bin
$ tar -xzvf ../mongodb-linux-i686-3.2.4.tgz
```


## DBフォルダの作成

```shell
$ mkdir -p /data/db
```


## パスの設定

以下の通り~/.profileを設定しました。

```~/.profile
export PATH=$HOME/bin/mongodb-linux-i686-3.2.4/bin:$PATH
alias mongod='mongod --storageEngine=mmapv1 --dbpath /data/db/'
```

２行目のstorageEngineオプションは、以下を参考に設定しました。
いちいち指定するのが面倒なので、aliasで登録してしまいました。
ココで一瞬戸惑ってしまいました。
http://stackoverflow.com/questions/34243731/mongodb-28663-cannot-start-server



## 起動確認

以下のコマンドで起動します。

```
$ source ~/.profile
$ mongod
```

EdisonにSensorBee入れて面白いデモでも作ろうかなと思っていた矢先の出来事でした。
VisualStudioでAngularJSとASP.NETを使って WebEditor (AngularText) 

目的:AngularJSとVisualStudio で WebEditor（TextAngular）を使う方法をシンプルに記す

TextAngular:https://github.com/fraywing/textAngular.git
手順
1.TextAngularをダウンロード
2.AngularJS　Controllerに['textAngular']を指定
3.HtmlにCDNで　AngularJS本体、Bootstrap、FontAwesomeをCDNで指定。TextAngularも指定。
4．&lt;text-angular ng-model=""&gt;&lt;/text-angular&gt;　でEditor表示
5.入力内容を表示するときは  ng-bind-html　を使う


画像サンプル:
![Capture.JPG](https://qiita-image-store.s3.amazonaws.com/0/118025/b69805ea-8835-3749-783e-1ac13d7f89d6.jpeg)



シンプル構成版ソース:https://github.com/redpeaks33/AngularJS_VisualStudio_TextEditor.git
ダウンロード　→ ソリューションファイル（.sln）　→ 実行（Ctrl + F5）で実行可能

フォルダ構成
![w1.png](https://qiita-image-store.s3.amazonaws.com/0/118025/382d0a33-f6b0-77a7-8174-bc8695010e47.png)


1.2.

``` controller.js
var main = angular.module("app", ['textAngular']);
main.controller('MyController', ['$scope', function ($scope) {
    $scope.htmlVariable = undefined;
}]);
``` 

3.4.5

``` index.html
<!DOCTYPE html>
<html  ng-app="app">

<head>
    <title></title>

    <!-- AngularJS -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.2/angular.min.js"></script> 

    <!--Bootstrap-->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">

    <!--FontAwesome-->
    <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">

    <!--TextAngular -->
    <link rel='stylesheet' href='TextAngular/textAngular.css'>
    <script src='TextAngular/textAngular-rangy.min.js'></script>
    <script src='TextAngular/textAngular-sanitize.min.js'></script>
    <script src='TextAngular/textAngular.min.js'></script>

    <script src="/js/controller.js"></script>    <!--自作Controller -->

</head>
<body>
    <div ng-controller="MyController">
        <!--Editor 部分 -->
        <div>
            <text-angular ng-model="htmlVariable"></text-angular>
        </div>

        <!--内容　表示 部分 -->
        <div ng-bind-html="htmlVariable"/>
    </div>
</body>
</html>
```

おしまい
Laravel 5のアクセス及びコントローラについて

リファレンス
https://laravel.com/docs/5.0/controllers#implicit-controllers

ルートは
```
app/Http/routes.php
```
に記述する。

コントローラファイルはこちらに置く
```
app/Http/Controllers
```

試しに

```UserController.php
namespace App\Http\Controllers;                                                                                                                                                                             
use App\Http\Controllers\Controller;                                                                                                                                                                                 
class UserController extends Controller {                                                                                                                                                                   
    public function getIndex() {                                                                                                                                                                            
        return view('welcome');                                                                                                                                                                             
    }                                                                                                                                                                                                       
}
```
を作成し、

```app/Http/routes.php
Route::get('/', 'UserController@getIndex'); 
```

と、設定することで指定したコントローラのメソッドから呼び出すことができる。
Raspberry pi 2で音声認識してみる

#はじめに
Raspberry pi 2で音声認識エンジンである[Julius](http://julius.osdn.jp/)を動かすところまでをやってみました。

基本は[こちらのページ(以降、参照記事と記載してるのはこのページです)](http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/RaspberryPi/%C6%FC%CB%DC%B8%EC%B2%BB%C0%BC%C7%A7%BC%B1/)を参考にさせていただいてますが、環境が変わったためかそのままでは動かなかったので、そのあたりを中心にまとめます。

#対象とする環境

|項目名|対象|
|---|---|
|本体| Raspberry pi 2 model B|
|OS| RASPBIAN JESSIE March 2016 |
|オーディオアダプタ| [PLANEX USB オーディオ変換アダプタ ケーブル PL-US35AP](http://www.amazon.co.jp/exec/obidos/ASIN/B001A1PR4M/cubic9com-22) |
|マイク|[フラット型PCマイク MM-MC23](http://www.amazon.co.jp/exec/obidos/ASIN/B007WSKGIE/cubic9com-22)|

参照記事みて、本体のマイクだとノイズがきになるので、私もUSBオーディオアダプタを使用しました。
C-Media製のCM119Aを使ったものであれば、同じ方法でいけると思います。

#USBアダプタの設定

まず、ラズパイにUSBオーディオアダプタを差します。その後、
 > $ cat /proc/asound/modules

とすると、

 > 0 snd_bcm2835
1 snd_usb_audio

と表示されます。このままだと、内蔵オーディオが優先されてしまいますので、優先度を入れ替えます。※この方法が参照記事ではうまくいかないです。

alsa-base.confというファイルを新規に作成します。

 > $ sudo vi /etc/modprobe.d/alsa-base.conf

で、以下の３行を記載します。

 > options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1

その後、再起動します。再度、
 > $ cat /proc/asound/modules

すると、

 > 0 snd_usb_audio
 1 snd_bcm2835

と入れ替わりました。

#動作確認

念のためにマイクの音量を最大にします。

 > $ amixer sset Mic 16

一度録音をして、再生してみます。実行はスーパーユーザで行う必要があります。
※参照記事ではこの記載がない。以前はスーパーユーザでなくてもいけたのかもしれないし、何らかの設定されていたのかもしれない。

 > $ sudo arecord -r 16000 -f S16_LE test.wav
$ sudo aplay test.wav

この状態だと、結構ノイズがのっている感じでした。
サウンドアダプタの設定や録音パラメータ関連は少し調整しないといけないかも。

#Juliusのコンパイルとインストール

これは参照記事をご覧ください。
注意点は以下。
1. Juliusの実行もスーパーユーザーで行う必要がある
2. sudo modprobe snd-pcm-oss　は必要

#最後に
ということで、簡単に音声認識を行うための環境を作ることができました。
課題は、ノイズのせいか、認識率が低いことです。参照記事のようにオリジナル単語辞書を作れば、解決できるのかまだそこまではやれてませんが、録音レベルではっきりわかるノイズはクリアーにしておきたい感じです。（今後の課題）

以上
php error log 出力先

```/etc/php5/apache2/php.ini
error_log = /var/log/php.log
```

を設定し、apacheの実行ユーザーにファイル権限を変更する
```
sudo touch /var/log/php.log
sudo chown www-data /var/log/php.log
```

apacheのrestart
```
sudo /etc/init.d/apache2 restart
```
JSON-RPC over HTTPなサーバを作る

JSON-RPC 2.0 over HTTPなRPCサーバをrubyで実装してみる。

RESTfullに定義できないアクションを持つAPIサーバを作る必要があってRPCサーバか、じゃJSON-RPCで作ってみるかと。どんなものかと週末手を動かしてみた。

[JSON-RPC 2.0 の仕様](http://www.jsonrpc.org/specification)はこちらで薄い仕様なのでさくっと読むべし。なお、JSON-RPC 2.0 にはトランスポート層の指定がないので、TCP、UDP、websocket、HTTPなど用途に応じて決めれる。今回はHTTP上で動作させることにした。

例として足し算する`sum(10,20) => 30`こういうRPCを作ってみる。

```
$ curl -v -s -S \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d  '{"jsonrpc": "2.0", "method": "sum", "params": [10, 20], "id": 1}' \
   http://localhost:8080  
> POST / HTTP/1.1
> Host: localhost:8080
> Accept: application/json
> Content-Type: application/json
> Content-Length: 64
> 
< HTTP/1.1 200 OK
< Date: Sun, 20 Mar 2016 13:39:21 GMT
< Connection: close
< Content-Length: 36
< X-Runtime: 0.004520
< 
{
  "jsonrpc": "2.0",
  "result": 30,
  "id": 1
}
```

## 方針

サーバ実装の方針を立てる

* HTTP部分
  * Rack
  * WAF不要。つまりRails/Sinatra使わない
  * Webサーバ(Webric, unicorn, pumaなど好きなもの)
* JSON-RPCサーバ
  * リクエスト、呼び出し関数へのディスパッチ処理、レスポンス)実装が必要
  * 自作する? しない? 

HTTP層はRackに乗っかるとして、WAF(RailsやSinatraなど)が不要なのは、RPCサーバゆえエントリーポイント(パス)は1個、つまりルーティング不要、またレスポンスはjsonで返すだけでviewレンダリングがいらないので、WAFいらないやとなった。シンプルだ。

図示するとサーバのスタックとしては以下になる。

```
  +----------------------------+  ^
  |      RPC Handlers          |  |
  +----------------------------+  | rack app
  |  JSON-RPC implementation   |  |
  +----------------------------+  v
  |          Rack              |
  +----------------------------+
  |  Web Server(Unicorn or etc)|
  +----------------------------+
           ^   |
       req |   v resp    HTTP

          Client        
```


## 作る

JSON-RPCの仕様薄いから自作するかとか一瞬おもったけど、一旦落ち着いてRubyの実装を探したところ[jimson](https://github.com/chriskite/jimson)というgemが自分が実装したいイメージと同じだったので、実装せず使わせてもらう。

jimsonには

* JSON-RPC clientクラス
* JSON-RPC serverクラス (中身はrack app)
* JSON-RPC request, responseクラス
* 各種エラークラス
* handler用のベース

が同封されているので、RPC handler、serverクラスはjimsonがベースにすることになる。

### handlerクラス

RPCの実装部分。簡単ですね。

```rb
# my_handler.rb

require 'jimson'

class MyHandler
  extend Jimson::Handler 

  def sum(a,b)
    a + b
  end
end
```

### rackup

```rb
# config.ru
require 'jimson'
require_relative 'my_handler'

# middlewares that you want to use
use Rack::Reloader,0
use Rack::Runtime

run Jimson::Server.new(MyHandler.new)
```

こう書いて、`$ bundle exec rackup` とか `$ bundle exec unicorn` とかすればよろしい。


## ネスト

ちなみにjimsonは`foo.hello`, `bar.baz.say`といったnapespaceつきのJSON-RPC methodも定義可能。

```rb
# config.ru

require 'jimson'
# require handlers 

router = Jimson::Router.new
router.draw do
  namespace 'foo', Foo   # Foo is expected to implement hello()
  namespace 'bar' do    
    namespace 'baz', Baz # Baz is expected to implement say()
  end
end

run Jimson::Server.new(router)
```

**2016/4/13 update:** なお、`.`区切でしかnamespace表現出来ない仕様だったので[Add Router :ns_sep option for custom namespace #31](https://github.com/chriskite/jimson/pull/31)でpull reqして任意のセパレータ使えるようお願い中。

## ToDo

* リクエストパラメタのバリデーション。外部から渡された値をハンドラにバリデーション無しで渡すのは危険なので、json schemaとか?
* APIのversioning
ゆめりあGPUベンチ結果一覧

ゆめりあベンチ 1024 x 768 最高にて計測、OSはXP/7/8.1/10混在です。
ここにあるのは我が家にあるもの or 知り合いのものだけなので、偏りがあります。
（自分で投稿に責任を持てるようにということもあります）

不正確な部分もありますが、だいたいの目安にはなる・・・かな？？？
 
|グラボ名                               |スコア |
|:-------------------------------------|-----:|
|nVIDIA GeForce FX 5200                |   945|
|nVIDIA GeForce 7200 GS                |  2800|
|ATI Radeon X550                       |  3000|
|nVIDIA GeForce 7300 LE                |  3299|
|nVIDIA GeForce FX 5900XT              |  6142|
|nVIDIA GeForce FX 5900                |  6391|
|ATI Radeon HD 2400                    |  6546|
|ATI Radeon HD 2400 Pro                |  7100|
|ATI Radeon HD 2400 Pro                |  7237|
|nVIDIA GeForce 7600 GS                |  7300|
|nVIDIA GeForce 6600                   |  7581|
|nVIDIA GeForce 7600 GS                |  8208|
|Intel HD Graphics                     |  8562|
|AMD ATI Radeon HD 4350                    |  9143|
|AMD ATI Radeon HD 4350                    |  9642|
|AMD ATI Radeon HD 4350                    |  9700|
|nVIDIA Quadro FX 570                  | 12300|
|nVIDIA GeForce 6600 GT                | 12474|
|nVIDIA GeForce 7600 GT                | 12716|
|AMD Radeon HD 5450                 | 13500|
|NVIDIA GeForce 210                    | 16744|
|nVIDIA GeForce 7900 GS                | 16762|
|NVIDIA GeForce GT 610                 | 17955|
|NVIDIA GeForce GT 620                 | 20141|
|Intel HD Graphics 4000                | 22618|
|Intel HD Graphics 6000                | 23800|
|Intel HD Graphics P4600               | 26000|
|Intel HD Graphics 5500                | 27117|
|nVIDIA GeForce 8600 GT                | 27813|
|Radeon R7 M260                    | 31874|
|nVIDIA Quadro K600                    | 33300|
|ATI Radeon 4670                       | 41974|
|ATI Radeon 4670                       | 43000|
|nVIDIA Quadro FX 1800                       | 47000|
|nVIDIA GeForce 9600 GT                | 66379|
|nVIDIA GeForce 9800 GT                | 72875|
|nVIDIA GeForce GTX 260                | 85000|
|nVIDIA GeForce GTS 250                | 93798|
|NVIDIA GeForce GTX 770 (OC)           |120683|
|NVIDIA GeForce GTX 750 Ti (ベンダーOC) |122653|
|NVIDIA GeForce GTX 750 Ti (ベンダーOC) |131110|
|NVIDIA GeForce GTX 1050 Ti (ベンダーOC)|162784|
|NVIDIA GeForce GTX 1060 6GB           |174329|
|NVIDIA GeForce GTX 1080 Ti (ベンダーOC)|225036|
Visual Studioでコマンドにショートカットを追加する

# 0.前置き
Visual Studioでプログラミングする際になるべくマウスなしで操作をしたいです。その際に役立つのが「Ctrl-X」などのショートカットキーです。もし自分が頻繁に触るコマンドにショートカットが割り当てられていない場合、自分で設定する必要がありますが、そのガイドをメモっておきます。

**バージョン情報**

|name|ver.|
|:--|:---:|
|Visual Studio Professional|2015 Update1|

# 1. 題材
リファクタリング機能の「名前の変更」にショートカットを設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/34410/698b0cdf-3f7b-683b-58f5-5cc047fede7a.png)

# 2.ショートカットキーを設定する

1. 「ツール」⇒「オプション」を選択しオプションウィンドウを起動します。
2. オプションウィンドウにて「環境」⇒「キーボード」を選択します。
3. ショートカットキーを設定したいコマンドを検索・選択します。
4. 「使用する場所」と「ショートカットキー」を入力します。
5. 最後に「割り当て」をクリック。

![image](https://qiita-image-store.s3.amazonaws.com/0/34410/8497013e-b61f-1ef0-34d6-421258abd382.png)

今回の場合、ショートカットキーを有効にしたいときは、テキストエディター上だけですので、使用する場所を「テキストエディター」としています。もし、入力したショートカットキーが別のコマンドですでに利用されている場合は、一番下の「現在使用されているショートカット」に表示されます。

結果を確認するために、再度メニューから表示すると、Ctrl+R,Ctrl+Rがアサインされていることが分かります。

![image](https://qiita-image-store.s3.amazonaws.com/0/34410/7eb62eb8-f2d3-903a-333c-2c3dd7e8feef.png)


以上です。
さあ、縦＋横デュアルディスプレイの世界へ！

デスクトップが広く使えて快適なデュアルディスプレイですが、片方を縦にしてみるとさらに便利かもしれません。

# 縦にして便利な部分
最近はスマホ向けに縦の動画が流行っているようですが、そういったものに限らず、多くのWebサイトは縦長にできていますし、A4などのビジネス文書も多くは縦長に印刷します。実際、レスポンシブデザインにしても「ある程度以上の幅には広がらず、左右に空白ができてしまう」ようなことも多いので、そのようなサイトは縦長のディスプレイで見ると、普段よりずっと広い範囲を一気に見られます。

プログラムのソースコードも、「理想は80桁以内」と言われるように、横には広げずに書くものなので、縦長のディスプレイではメリットを受けられます。

# 縦ディスプレイだけだと足りない部分
ただ、ふつうディスプレイは横長ということもあって、多くのソフトウェアが「横長画面で使うこと」を前提に作られています。YouTubeの動画やプレゼンテーション資料なども横長な構造なので、縦ディスプレイで使うには不便なものとなってしまいます。また、21インチのモニタを縦にすると横幅が1000ピクセルちょっとなので、少々狭い感もあります。

こういったものでも、縦横両方のディスプレイがあれば、適切な方に表示させることで、「いいとこ取り」のように運用することができます。

## 縦横置きのデメリット
ただ、縦横置きにして気になったところがいくつかありました。

* 縦にも横にもディスプレイが広がっているので、目を動かす範囲が広くなって、（慣れるまでは）目が疲れる
* ディスプレイが長方形でない＆マウスカーソルはディスプレイから出られないので、凹んだところにマウスカーソルが引っかかって、思うところに行ってくれない

とはいえ、どちらも慣れれば解決するとは思います。

#既存のデュアルディスプレイの縦横化
新たにデュアルディスプレイを組むのなら、縦置きできるモニタを用意してくればいいのですが、すでに横に2台置いてある場合でも、比較的容易に縦にできます。

## VESAマウント
VESAというグラフィックス関連の標準化団体があるのですが、そこが液晶ディスプレイの取り付けに関しても標準化をしています。多くのディスプレイには、10cm角の正方形になるように、4つ穴が開いています。

あとは、これに取り付けるアームを用意すれば、置き方はいくらでも変えられます。机にクランプするタイプのものが多いですが、置けるようなものも探せばありました（使う環境で机にクランプできないので、据え置きのを用意しました）。

## 論理的回転
ディスプレイ自体やグラフィックカード側に回転対応の機能がなくても、WindowsやLinuxのOS側で、回転した画像を送信させることで、縦置きにして使える状態とすることができます。

# ディスプレイを回転させるデメリット
ふつうのディスプレイをOSから回転させて運用すると、それが故の問題もあります。

## OS起動前の状態
OSから回転させる都合上、OS起動前には横長のまま映ってしまいます。普段は起動画面がちょっと崩れる程度でどうということはないのですが、BIOS設定やトラブルシューティングの際にはやりづらいことになってしまいます。できれば、BIOSが映るプライマリディスプレイは横のまま運用したほうが使いやすいかもしれません。

## 左右非対称
実際に縦にしてから気づいたことなのですが、一般的なディスプレイの場合、下から見た場合の視野角がかなり狭くなっています。ということで、90度回転させてしまうと、左右どちらかに視野角の狭いところが来てしまいます。配置する位置と見る方向を考えて、左右どちらに回転させるか考えておきましょう。

## ClearType
[ClearType](https://ja.wikipedia.org/wiki/ClearType)は、液晶ディスプレイでRGBが別々の画素になっていることを利用して、横方向の解像度を本来のピクセルより増してフォントを描画する技術ですが、これも当然画素が**横**に並んでいることを前提としています。縦にした場合は、ClearTypeだと色が化けるだけで解像度向上の効果は見込めません。オフにするのがいいでしょう（自分自身はMacTypeを使っていたので、もともとClearTypeは切っていました）。
クライアントサイドフレームワークの歴史


クライアントサイドJavaScriptフレームワークの歴史を整理します。
# 1stリリース順
1stリリース順に並べます。

## 有史以前
2008年

- 6月 [SproutCore](https://github.com/sproutcore/sproutcore/releases?after=REL-0.9.22)
- 10月 [Cappuccino](https://github.com/cappuccino/cappuccino/releases?after=v0.5.5)


## 第1世代
クライアントサイドJavaScriptに、どうにかして構造を与えようとした世代

2010年

- 7月 [Knockout](https://github.com/knockout/knockout/releases?after=v1.1.1)
- 10月 [Backbone.js](https://github.com/jashkenas/backbone/releases?after=0.5.1)
- 10月 [AngularJS](https://github.com/angular/angular.js/releases?after=v0.9.4)

## 第2世代
フルスタック化を目指した世代

2011年

- 6月 [Ember.js](https://github.com/emberjs/ember.js/releases?after=sc-v2.0.beta.3)
- 7月 [Agility.js](https://github.com/arturadib/agility/releases)
- 8月 [Derby](https://github.com/derbyjs/derby/releases?after=v0.0.5)
- 9月 [Spine](https://github.com/spine/spine/releases?after=v1.0.3)
- 11月 [Knockback.js](https://github.com/kmalakoff/knockback/releases?after=0.2.0)
- 12月 [Meteor](https://github.com/meteor/meteor/releases?after=v0.3.0)

2012年 [CanJS](https://github.com/canjs/canjs/releases?after=v1.0.1)

## 第3世代
virtual DOM や Object.observe() を使った（使おうとした）世代

2013年

- 1月 [Flight](https://github.com/flightjs/flight/releases?after=v1.0.2) (Flight is not under active development. )
- 5月 [React](https://github.com/facebook/react/releases?after=v0.3.3)
- 7月 [Polymer](https://github.com/Polymer/polymer/releases?after=v0.0.20131025)
- 8月 [Ractive.js](https://github.com/ractivejs/ractive/releases?after=v0.5.5)
- 8月 [Durandal 2.0.0](https://github.com/BlueSpire/Durandal/releases)
- 11月 [Riot](https://github.com/riot/riot/releases?after=v1.0.0)
- 12月 [Vue.js](https://github.com/vuejs/vue/releases?after=v0.7.4)
- 12月 [Ampersand.js](https://github.com/AmpersandJS/ampersand-model/releases?after=v2.7.2)

## 第4世代

配布サイズの小ささを利点とし始めた世代

2014年

- 4月 [mercury](https://github.com/Raynos/mercury/releases?after=v2.0.0)
- 4月 [Mithril](https://github.com/lhorie/mithril.js/releases?after=v0.1.9)
- 11月 [Cycle.js](https://github.com/cyclejs/core/releases?after=v0.3.3)
- 12月 [aurelia-framework](https://github.com/aurelia/framework/releases?after=0.6.0)

2015年

- 3月 [Angular 2.0](https://github.com/angular/angular/releases?after=2.0.0-alpha.20)
- 9月 [Preact](https://github.com/developit/preact/releases?after=2.0.0)
- 12月 [Inferno](https://github.com/trueadm/inferno/releases?after=0.5.13)

## 第5世代
そろそろ出てきました

2016年

- 6月 [choo](https://github.com/yoshuawuyts/choo/releases/tag/v1.0.1)
- 11月 [Lightning Web Components](https://github.com/salesforce/lwc/commit/6b06666a20af6ee3f38d39887ecf4687753db692)

2017年

- 2月 [Hyperapp](https://github.com/hyperapp/hyperapp/releases?after=0.0.12)

# 補足
KnockoutとReactはフレームワークではなくライブラリであるとされています。しかし、よく比較されるのでリストに入れます。

# 感想
「長くメンテナンスされていることは正義」のようです。

# お願い
リストにないフレームワークの1stリリース日をご存知であれば、編集リクエストをお願いします。
一度だけ実行したい処理がある...そんなあなたにおすすめの可愛いわんこちゃん


# 概要
関数(呼び出し元)毎に一度だけ処理を実行させる**Inu**というライブラリを書いてみました。

https://github.com/bannzai/Inu

# 背景
iOSアプリ開発していると一度だけ処理を実行させたい場面がたまにあります。
例えば、```viewWillAppear(animated:)```等でCustomViewを```addSubView```させたい場合などあったりするのではないでしょうか。
この場合だとBool型のpropertyでFlag制御したり、```dispatch_once()```を使った制御等が考えられます。

```swift
    var isOnce: Bool = false
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        if !isOnce {
            anyFunction()
            isOnce = true
        }
    }
```

```swift
    var token: dispatch_once_t = 0
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        dispatch_once(&token) {
            self.anyFunction()
        }
    }
```

実現したい内容やタイミングが多様化するとプロパティを増やしたりする必要がありそうです。
個人的には狭いスコープで使用するためのプロパティを増やすのはあまり好きではないです。

インスタンスメソッド単位での処理の制御なら簡単に出来そうだと思って**Inu**を書きました。

# 使い方
```swift
class ViewController: UIViewController, OnceType {
```
```swift
   override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        once.call() {
            anyFunction()
        }
    }
```

OnceTypeというprotocolを適用して
```once.call() { }```を呼び出すことでクロージャの中の処理を一度だけ実行します。

中身は   

```swift
public protocol OnceType: AnyObject { }
public extension OnceType {
    public var once: Once {
        guard let object = objc_getAssociatedObject(self, &OnceAssociatedObjectHandle.OnceKey) as? Once else {
            let once = Once()
            objc_setAssociatedObject(self, &OnceAssociatedObjectHandle.OnceKey, once, .OBJC_ASSOCIATION_RETAIN)
            return once
        }
        return object
    }
}
```

```swift
    private var callStack: [String] = []
    public func call(withKey: String = __FUNCTION__, @noescape _ closure: Void -> Void) {
        if callStack.contains(withKey) {
            return
        }
        closure()
        callStack.append(withKey)
    }
```

こんな感じです。

AnyObjectであればなんでもいいので、頻繁に使用するようなクラスがあれば　　　

```swift
extension UIView: OnceType { }
extension UIViewController: OnceType { }
```
ベースクラスに書いてしまえば、継承しているサブクラスでも使えるのは利点かなと思ってます。
副作用もありそうですが。。。

他にも少し違った用途のメソッドも用意されています。
このわんこのことを可愛いと感じたらスターください。

\\(^o^)/
Windowsのコマンドラインからrbenvを使いたい

#概要
cygwinやbashではなく、windows標準搭載のcmd.exe内でrbenvを使いたい。

#結論
そういうrbenvを作りました。
https://github.com/nak1114/rbenv-win

#rbenvって何？
Windowsではruby installerでrubyをインストールするのが一般的と思います。
しかし、ruby installerでインストールすると、そのバージョンのrubyしか使えないために様々な弊害が出ます。
例えば、nokogiriというruby用のライブラリはwindows環境だとruby-2.2.0より新しいバージョンには対応していません。（もちろん秘術を駆使すれば使えるようになるのは知っています。）
また、あるrailsアプリではruby 2.1.xを要求して、別のアプリではruby2.2.xを要求するといったことがあります。
もしくは、怪しげなライブラリを取りあえず試して駄目だったらライブラリ適応前に戻したい事もあるでしょう。

そういった状況に対応するために、様々なバージョンやライブラリ適応状態のrubyを素早く切り替えることが出来るのがrbenvです。


#インストール

##インストールに必要なもの
[git](https://git-for-windows.github.io/)

##インストール手順
インストール用のバッチファイルも用意してあります。
https://gist.github.com/nak1114/7ea63204203883c5884d

このバッチを実行すると、自分のユーザープロフォイルの直下に自分専用の`rbenv`をインストールしてくれます。
例えば、私のユーザー名は`nak`なので`C:\User\nak\.rbenv-win`がインストール先になります。

バッチファイル内では以下の事を行っています。
1. gitを用いてGitHub上の`rbenv-win`をインストール先にコピーします。
2. インストール先の`rbenv`コマンドや、その先でインストールされる`ruby`コマンドに対する`PATH`を通します。

インストールが終わったらcmd.exeを閉じて、もう一度cmd.exeを実行します。
これで、`rbenv`が使えるはずです。

エクスプローラーで`C:\User\<ユーザー名>\.rbenv-win`が出来ているか確認します。
また、スタートメニューから
[スタートボタン]->[設定]->[コントロールパネル]->[システム]->
[システムの詳細設定]->[環境変数]を押して回って、
[<ユーザー名>のユーザー環境変数]の`Path`に`C:\User\<ユーザー名>\.rbenv-win\shims`があれば、
インストールに成功しています。

#使用方法

何はともあれHelpの表示。

````
> rbenv help
````

次にコマンド一覧を表示
[本家rbenv](https://github.com/rbenv/rbenv)のうち、自分が良く使っているcommandを実装しています。
詳細なコマンドの使用方法は本家に譲ります。

````
> rbenv command
````

Rubyのインストールもrbenvで行います。

````
> rbenv install 2.2.4
> rbenv global 2.2.4
> rbenv rehash
```

Enjoy Your Ruby Life!

#最後に
3連休ネタに作りました。久々のバッチファイルとVBScriptで良い頭の体操でした。
でもバッチファイルやVBScriptのテストってどうやるんだろう？と悩んだ結果、テスト無しで公開しています。

誰かバッチやVBScriptのテストの方法を教えてください。
Vagrant コマンドラインインターフェース PORT

#PORT

##command: vagrant port

ホストマシンとゲストマシンのポートのマッピングの一覧を表示するコマンド。

```bat:
$ vagrant port
    22 (guest) => 2222 (host)
    80 (guest) => 8080 (host)
```

複数のマシンを持つVagrantfileでは、マシンを特定する必要がある。

```bat:
$ vagrant port my-machine
```

####オプション

<dl>
<dt>--guest PORT</dt>
<dd>指定されたゲストのポートに合致するホストのポートを表示する。ゲストが指定されたポートを転送しない場合はエラーを返す。以下のような簡単なスクリプト使用時には有用である。</dd>
</dl>

```bat:
$ ssh -p $(vagrant port --guest 22)
```

<dl>
<dt>--machine-readable</dt>
<dd>人ではなく、コンピュータに優しい結果を出力する。詳細は、<a href="https://www.vagrantup.com/docs/cli/machine-readable.html">コンピュータ用(MACHINE READABLE OUTPUT)出力</a>についてのドキュメントを参照。</dd>
</dl>
VisualStudioでAngularJSとASP.NETを使ってHelloWorld

目的：できるだけシンプルにVisualStudioでAngularJSを実行する。
理由：VisualStudioでWebSiteを構築しようとすると、情報が多く複雑すぎるため初心者には難しい。
初心者が理解しやすいように必要最低限な情報で構成した。
実行方法：
1.https://github.com/redpeaks33/AngularJS_HelloWorld_VisualStudio.git
ダウンロード　して解凍
2.ソリューション（.slnファイル）をクリック　して VisualStudio起動
3.実行（Ctrl ＋ F5）


フォルダ構成
![Folders.png](https://qiita-image-store.s3.amazonaws.com/0/118025/191a73ec-ef2d-d33b-5ebf-5322f7fa8715.png)

自作Controller

```controller.js
var main = angular.module("app",[]);
main.controller('MyController', ['$scope', function ($scope) {
    $scope.message = 'Hello World!!';
}]);
```

Htmlファイル

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

<head>
    <title></title>
    <script src="/AngularJS/angular.min.js"></script>
    <script src="/js/controller.js"></script>
</head>
<body>
    <h1 ng-controller="MyController">{{message}}</h1>
</body>
</html>
```

ポイント
1.AngularJS本体と自作Controllerを&lt;script&gt;で設定
2.ng-appとng-controllerを設定する
3.ルート直下にindex.htmlを置く


おしまい
Bashのコンソールで単語移動するショートカット

（Vimに慣れてしまうと）キーボードの矢印キーの利用はできるかぎり避けたくなる。
コンソールでは、bashのデフォルトでショートカットキーが設定されているのでそれを使う。

### カーソル移動系
|キー |動作 |
|:-------|:------------------------------------|
|Ctrl + A|	カーソルを行頭へ                  |
|Ctrl + E|	カーソルを行末へ                  |
|Ctrl + B|	カーソルを1文字戻る                  |
|Ctrl + F|	カーソルを1文字進める                  |
|ESC + F |	カーソルを1単語先に進める          |
|ESC + B |	カーソルを1単語戻す               |
|Ctrl + L|	現在の行以外をクリアする                  |

### カーソル位置から所定の文字列を削除
|キー |動作 |
|:-------|:------------------------------------|
|Ctrl + K|	カーソル位置から行末までを削除      |
|Ctrl + U|	カーソル位置から行頭までを削除      |
|Ctrl + H|	カーソル位置の直前の1文字を削除      |
|Ctrl + D|	カーソル位置の直後の1文字を削除      |
|Ctrl + W|	直前の1単語を削除(単語境界は空白類) |

### テキスト処理系
|キー |動作 |
|:-------|:------------------------------------|
|Ctrl + T|	カーソル前後の文字を入れ替える      |
|ESC + U|	単語を大文字にする     |
|ESC + I|	単語を小文字にする      |

### 履歴からの呼び出し
|キー |動作 |
|:-------|:------------------------------------|
|Ctrl + P|	前の履歴を表示      |
|Ctrl + N|	次の履歴を表示      |
|Ctrl + R|	インクリメンタルサーチで履歴を検索      |

なお、このショートカットキーは、bash以外でも多くのMacアプリの入力フォームで利用できる。
（なぜか、Ctrl + Aは大抵効くが、Ctrl + Eは効かないことが多い）


#### おまけ
ESCをモディファイアキーとして使うのは辛いので、iTerm2のエスケープシーケンスでESC→optionに変更。
これにより以下のショートカットが利用できる。

|キー |動作 |
|:-------|:------------------------------------|
|Opt + F|	カーソルを1単語先に進める|
|Opt + B|	カーソルを1単語戻す|

以上

---
2023/7/22追記
テキスト処理系のコマンドを追加した。
履歴からの検索にインクリメンタルサーチを追加した。
2021/7/18追記
コマンドの履歴表示（↑↓キーで表示するやつ）のショートカットを追加した。
2018/2/17追記
1文字進める/戻る、直前/直後の1文字を削除、を追加した。

参考
Macでターミナルを使うときはショートカットキーを覚えよう！！
http://yonchu.hatenablog.com/entry/20110214/1297662332
Mac のターミナルの Bash に単語単位カーソル移動のキーバインド設定をする
http://voidptr.seesaa.net/article/395408528.html
コンピュータ将棋でDeep Learningごっこしてみたまとめ


コンピュータ将棋を題材にdeepなニューラルネットを自作して遊んでみた結果得られたノウハウのメモ。

# Deep Learningはfeature engineeringしてくれない

まあ当たり前の話ですが、「画像や囲碁にDCNNというモデルがとても効果的だった」＋「DCNNへの入力は従来より雑なfeature (ほぼ生の情報やそれ＋α)で大丈夫だった」というだけの話で、feature engineeringやネットワークの設計は結局のところ問題に特化して考えないといけないよね、という話。

少なくとも将棋の駒の配置だけを入力にして全結合層をたくさん並べただけでは、現実的な中間層の大きさでは全然予測性能が出ませんでした。
将棋の場合線形性が強いのでdeepである必要はあんまり無さそうに思えます。

全結合よりはDCNNの方がちょっとマシっぽいですが、それにしても3駒に匹敵するようなことにはならなそうです。(速度度外視でも)

それなりにfeature engineeringしてstacking（弱学習機を作ってその結果をDNNに入力する）してみたときにはそこそこ頑張ってくれて、場合によってはXGBoostを超える精度が出ることもありました。

# ReLUならdeepでも乱数の初期値から普通に学習できる

ボルツマンマシンやらオートエンコーダーやらは無くても普通に学習できます。

この辺、初学者への罠なんじゃないかという気も…。

# バイアス項は重要

面倒だったので最初は入れずにやってみましたが、深いネットワークでバイアス項無しだとだいぶ勾配が伝搬しにくくなるようです。

# スケーリングも重要

例えば中間層のユニット数を100倍くらい増やすと、多くの場合、学習率がそのままでは大きすぎて学習できなくなります。入力の数などに応じてスケーリングした方がよいです。

同じネットワーク内で場所によって差が大きい場合なんかはちゃんとスケーリングしないとうまく学習できません。

学習率に限らず初期値も、分散を合計1にするのがよいという話とかがあるようです。
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AF%E3%83%97%E3%83%AD%E3%83%91%E3%82%B2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

また、中間層はともかく入力は次元数だけでなく値の傾向にもよるので、画像などの場合は正規化などをするのが一般的なようです。将棋の場合は単に適当にスケーリングすれば十分でした。

Batch Normalizationが流行っているのもこの辺の関係だと思います。

# Adamすごい

とても収束が早いです。

ネットワーク中のある1つの重みに着目したとき、深いネットワークでは勾配の傾向が徐々に変わったりしそうな気がしますが、その辺を上手く対応してくれている気がします。

逆に単純な線形モデルではAdaGradで十分なのでは、ということでますますAdaGradが好きになったりも。
Google アナリティクス APIをPythonから使う

# Google Developersのチュートリアルが上手くいかない

おそらく、Google アナリティクス APIをPythonから使おうと思った方は[Python クイックスタート](https://developers.google.com/analytics/devguides/config/mgmt/v3/quickstart/service-py?hl=ja#enable)を見たのではないでしょうか。ただ、この通り行っていくとステップ3で

```
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    from oauth2client.client import SignedJwtAssertionCredentials
ImportError: cannot import name SignedJwtAssertionCredentials
```

となり上手く動きませんでした。(2016/3/20現在)

結論としては
`SignedJwtAssertionCredentials`ではなく`ServiceAccountCredentials`を使うことで解決しました。

今回は、この変更を適用してpageview数のランキングを出力する[sample](https://github.com/ko-he-/python_googel_analystic_api)を作成しました。


# 使い方
pythonはPython 2.7.6を使っています。


[Python クイックスタート](https://developers.google.com/analytics/devguides/config/mgmt/v3/quickstart/service-py?hl=ja#enable)のステップ2まで行い、

* サービスアカウントアドレス（****@****.iam.gserviceaccount.comみたいなやつ）
* P12 キー

を取得してください。


[Githubのリポジトリ](https://github.com/ko-he-/python_googel_analystic_api)をダウンロードしてください。
先ほど作成したP12キーのファイルをダウンロードしたフォルダ内に配置してください。

jsonファイルの準備をします

    cp config.json.sample config.json

config.jsonの中を以下のように編集します。

    {
        "email": "<your google developer email adress> ex) sample@sample.iam.gserviceaccount.com ",
        "key": "<*.p12 path> ex) ./sample-5a5a55a5a5a5.p12",
        "start_date": "ランキングの期間の開始日 ex) 2016-02-07",
        "end_date": "ランキングの期間の終了日 ex) 2016-03-07",
        "home": "解析するページのURL ex) http://qiita.com"
    }

以下の二つをpipで入れます

    sudo pip install --upgrade google-api-python-client
    pip install pyopenssl


実行します

    python googel_analystic_api_ranking.py

# 解説

ランキングの内容を決めているのは以下の部分です。

```
def get_rankings_results(service, profile_id, config):
    return service.data().ga().get(
        ids='ga:' + profile_id,
        start_date=config['start_date'],
        end_date=config['end_date'],
        sort='-ga:pageviews',
        max_results='10',
        dimensions='ga:pageTitle,ga:pagePath',
        metrics='ga:pageviews').execute()
```


`sort='-ga:pageviews',`は`ga:pageviews`によるソートを行い先頭の`-`で降順で取得しています。
アナリティクス APIは結果を行列の形で取得します。
この時`max_results`でAPIが取得する結果の行数の上限を指定します。
また、`dimensions`と`metrics`で取得する内容を決めています。
今回は`dimensions`ではページタイトルとページパス、`metrics`ではページビュー数を指定しています。
イメージとしては`dimensions`ごとに`metrics`を見るようになっています。


また結果の出力は以下の部分で行っています。

```
def print_rankings_results(results, home):
    # Print data nicely for the user.
    if results:
        print(u'-----------ランキングTop10-----------')
        for col in results.get('rows'):
            print(u'{0}\t{1}{2}\t{3}'.format(col[0], home, col[1], col[2]))
    else:
        print ('No results found')
```


引数の`results`には先ほどの`get_rankings_results`で取得したAPIからの応答が入ります。
また、'results.get('rows')'で結果の各行にアクセスできます。
結果は、`dimensions`、`metrics`の順番で並んでいるので'results.get('rows')[0][1]'などとすれば、一番目の結果のpagePathを取得できます。
jsdoでズンドコ

#概要
じゃべるやつでズンドコやってみた。
#jsdo.it
http://jsdo.it/ohisama1/wRop
#サンプルコード
```
var i = 0;
var msg = "";
do
{
    var k = Math.floor(Math.random() * 2);
    if (k < 1)
    {
        msg += "zoo ";
        i++;
    }
    else
    {
        msg += "dokoo ";
        i = 0;
    }    
} while (i < 4)
msg += "doko ki yoshi";    
var p = new SpeechSynthesisUtterance(msg);
p.lang = "en-US";
speechSynthesis.speak(p);

```
2015年女性声優TVアニメ出演数ランキング

~~RPScala 温泉ハッカソンでWikipediaから声優のデータを集計するプログラムを書きました。ソースコードはもう少し整理したら公開します。~~
公開しました。http://qiita.com/takezoux2@github/items/5abd406cb13e24e9a6c4

最近声優の調査をする機会があり、声優の出演数をいろいろ調べようと思ったのですが、なかなか良いサイト見つからなかったので自分で集計しちゃいました。
2chは流石としか言いようが無いぐらいちゃんと集計されています。(むしろ、集計結果の確認に使いましたｗ)

2ch
http://wc2014.2ch.net/test/read.cgi/voice/1451499666/l50
naverまとめ(2chの転載？)
http://matome.naver.jp/odai/2145012246068771001

## 集計方法

Wikipedia(2016/3/6のダンプデータ)の各声優のページのうち、"テレビアニメ"セクションに記述されているものを集計しています。
また、集計対象は、Category:日本の女性声優に列挙されている声優を対象にしています。
また、メインキャラであるかどうかは、声優ページのキャラクター名の表記が太字になっているかどうかで判定しています。

## データ

### 2015年出演数ランキング

https://gist.github.com/takezoux2/31cf3e4b3e4684caa23e

### 2015年メインキャラ数ランキング

https://gist.github.com/takezoux2/4ebe8e9a03a5068ba297


他にもいろいろ集計データ作っていくつもりです。他に欲しい集計データとかあれば要望にお応えします。
また、一部で集計ミスが残ってるかもしれません。本数などでミスがあれば教えてもらえると嬉しいです。
ActiveDirectoryが有効な MacBookで、無線LANが無効のせいでログインできない時の対応方法

# ActiveDirectoryとMac
OS XでActiveDirectoryが有効にするとができることは最近知りました。
Windowsとユーザ名パスワードが統一できていい感じですね。

## 最近経験した困ったこと
ですが、ネットワーク状態の何かしらの問題によりActiveDirectoryサーバーへ接続できないときは、起動後のユーザー認証が効かずにログインができなくなります。

特に、最近あったトラブルなのですが、MacBookを使用していてかなり困ったことがありました。
無線LANを無効化したままログアウトしてしまうと、深刻な状態になります。
ネットワークが全て効かない状態でActiveDirectoryのログインができず、しかも、ログインしない限り無線LANが有効にできない、という状況になるのです。ログイン画面のメニューバーに無線LANを有効化無効化するアイコンが出てくれればいいのに、それが無いためやりようがなくなります。また、ノートパソコンなので、LANケーブルは刺さりません（USB接続の機材を買えばいいのですが）。

## その時の対応方法
復元ユーティリティーを使って、無線LANを有効化することでなんとか問題を回避できました。
⌘+R(コマンド+R)を押したまま電源を入れると、OSの復元を目的とする特殊なモードで起動します。

次に、メニューからターミナルを立ち上げて、無線LANの設定を書き換えます。
そのために、/Library/Preferences/SystemConfiguration/preferences.plistを編集してください。

ここで注意すべきなのは、復元ユーティリティで立ち上がっているときはルートディレクトリには復元用OSがマウントされており、普段立ち上げているOSXのルートディレクトリは異なる場所にマウントされています。したがって、上記フルパスの先頭にディレクトリ名がくっつきます。
詳しくは、mountコマンドあたりで適宜確認してください。（👆ディレクトリ名の例を記載したいのですが、面倒なので・・・）

```xml:preferences.plist
・・・・・
                                <key>Interface</key>
                                <dict>
                                        <key>en0</key>
                                        <dict>
                                                <key>AirPort</key>
                                                <dict>
・・・・・
                                                        <key>PowerEnabled</key>
                                                        <true/>
・・・・・
```
具体的な設定方法ですが、preferences.plistのen0デバイス(AirPort)の設定で、PowerEnabledがfalseになっているのでtrueにしてあげるだけです。

保存した後に再起動すると、無線LANが復活するため、通常通りActiveDirectoryのログインができるようになります。

# 参考
- OS X：OS X での復元について
-- https://support.apple.com/ja-jp/HT201314
ズンドコキヨシ with 正規表現 > (((Zun){1,4})Doko)Kiyoshi | debuggex.comでの正規表現表示

## ツール
https://www.debuggex.com/#cheatsheet

## コード v0.1

```
(((Zun){1,4})Doko)Kiyoshi
```

## 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d8d4b6a0-c459-f6d7-0159-3a25683678a4.png)

## 参考

http://www.perlplus.jp/regular/repeat/index5.html
Ruby 演算子(論理演算子、比較演算子他)　[ 自分用メモ]

参考サイト
http://www.tohoho-web.com/ruby/operators.html

http://paiza.hatenablog.com/entry/2016/01/12/%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%E3%80%81%E6%AF%94%E8%BC%83%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%8C%E6%9C%80%E9%80%9F%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B%EF%BC%81Ruby%E3%81%AE%E7%84%A1%E6%96%99%E5%AD%A6
lpc21isp使って開発する際の注意点

# 忘れがちな初期化
lpc21ispからダウンロード後には動くんだけど、普通のPONやリセット後に動かない事があります。基本的には自分のバグで初期化周りの処理が足りてない事に起因する事がほとんどだと思いますが、lpc21ispからの起動時にはハードウェアの状態がRESET後の初期値とは違うんですね。

自分が失敗した例ではSwitch MatrixでUARTのピンアサインを忘れていました。ISPで起動してる時にはUSART周りは当然初期化済みになっているため、その設定が残った状態でユーザーコードに実行が移るんですね。
Python標準のloggingでログをJSON形式で出力する

loggingの使い方
----------------

まずは基本編。ライブラリ側でログを記述し、
クライアント側でそのログをどのように扱うかを決める。

### Library side

まず各ファイルの最初に以下の４行を追加しておく

```python
from logging import getLogger, DEBUG, NullHandler
logger = getLogger(__name__)
logger.addHandler(NullHandler())
logger.setLevel(DEBUG)
```

これで`logger`に`.debug`, `.info`等で出力する

```python
logger.info("Enter special block")
```

NullHandlerが登録してあるのでclientがキャプチャしなかったらこのログは捨てられる。

### Client side

ライブラリ側のloggerは`__name__`で名前が登録されている。例えば`mod.submod1`, `mod.submod2`みたいな名前で登録されている。`.`で階層化されているので`mod`で参照すると両方のサブモジュールのログを受け取れる。また名前を与えない場合、すべてのログを収集する。

- 全部のログを標準エラー出力(`sys.stderr`)に出す

```python
import logging
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
```

- `mod`モジュールのINFO以上のログをファイル(`mod.log`)に出力する

```python
import logging
logger = logging.getLogger("mod")
logger.addHandler(logging.FileHandler("mod.log", mode="w"))
logger.setLevel(logging.INFO)
```

もちろんこれらのコードをクライアントが実行しやすい関数をライブラリ側で用意することはできる。

JSONで出力する
---------------

その後の解析を考えると構造化したログが欲しかったりする。
実は`logger.info`とかに辞書オブジェクトあげることができる:

```python
logger.info({
  "key": value,
  "homhom": 0,
})
```

特に設定しない場合、これを普通に`print`した結果が出力されるので見た目にはJSONと変わらないが、
正式なJSONではないのでパースできなくて辛い。
そこで登場するのが[pythonjsonlogger](https://github.com/madzak/python-json-logger)である。
これはクライアント側で出力するときにJSONとしてフォーマットし直す。

上のファイルに出力する場合は以下のようにする：

```python
import logging
from pythonjsonlogger import jsonlogger
h = logging.FileHandler("mod.log", mode="w")
h.setFormatter(jsonlogger.JsonFormatter())
logging.getLogger("mod").addHandler(h)
```

これで行ごとにJSONとして有効なログが出力されます。なのでログを

```py
with open("mod.log") as f:
    df = pd.DataFrame([json.loads(l) for l in f])
```

のように簡単にpandasに流し込める。
Githubの使い方！ Windows環境の初心者


<a href="http://kawaidesu.hatenablog.com/entry/2014/06/28/092347" target="_blank">2014年版Githubの使い方！Windowsで初心者でも簡単アップロード - ノラプログラマーの技術メモ</a>

## 最新版2015年度版

<a href="http://kawaidesu.hatenablog.com/entry/2015/11/02/210400" target="_blank">【2015年】Windows版GitHubツールの使い方 - ノラプログラマーの技術メモ</a>



##GitとGitHubについて

Gitでは、リモートリポジトリとローカルリポジトリを使い分けて開発を行います。
GitHubとは、このリモート（インターネット）にあたる部分を提供しているサービスのことです。

## クライアントアプリのGitHubの使い方

- ダウンロード
- ファイルを編集
- コミット
- Sync

## 用語説明

### PullRequest
あなたが変更したソースコードを取り込んでもらえるようにリクエストするための機能です。

### brunch
履歴の流れを分岐していくためのものです。分岐ブランチは他のブランチの影響を受けないため、同じリポジトリで複数の辺国を同時に進めていくことができます。

### Fork
GitHub側にある特定のリポジトリを自分のアカウント以下のリポジトリに複製することです。

### deploy
主にネットワークを通じて提供されるアプリケーションなどのシステム工程において、システムを利用可能な状態にすることです。

## Gitの基本コマンド

### リポジトリの作成およびメンテナンスに利用するコマンド

|git init |リポジトリの作成 |
|:------------:|:------------:|

### 作業ツリーやブランチを操作・管理するコマンド

|git  status | 変更が加えられたファイルを表示する  |
|:------------:|:------------:|
|git diff| ファイルに加えられた変更点をdiff形式で表示する|
|git add| コミットするファイルを指定する|
|git commit|変更点をコミットする|
|git log| コミットログを閲覧する |
|git reset|直前のコミットを取り消す|
|git branch|ブランチ情報の表示およびブランチの作成|
|git checkout|ブランチの切り替え|
|git merge|ローカルブランチのマージを行う|
|git rebase|ブランチの派生元（上流）を変更する|


引用：<a href="https://osdn.jp/magazine/09/03/16/0831212" target="_blank">Gitを使いこなすための20のコマンド | OSDN Magazine</a>


## SourceTreeのショートカット


|操作 | キー  |
|:------------:|:------------:|
|ファイルの追加 | Ctrl + Shift + +  |
|コミット | Ctrl + Shift + c  |
|プッシュ | Ctrl + Shift + p  |
2016年に開催される全国のPHPカンファレンスのまとめ

# 2016年に開催される全国のPHPカンファレンスのまとめ
## [PHPカンファレンス北海道 2016](http://phpcon.sapporo-php.net/2016/)
- 開催日 : 4月16日(土)
- 開催場所 : [札幌市産業振興センター](http://www.sapporosansin.jp/access/)
- Twitter : https://twitter.com/phpcondo
- ハッシュタグ : [#phpcondo2016](https://twitter.com/hashtag/phpcondo2016?src=hash)

## [PHPカンファレンス福岡 2016](http://phpcon.fukuoka.jp/)
- 開催日 : 5月21日(土)
- 開催場所 : [福岡ファッションビル FFB HALL](http://www.ffb.jp/access/)
- Twitter : https://twitter.com/phpcon_fukuoka
- ハッシュタグ : [#phpconfuk](https://twitter.com/hashtag/phpconfuk?src=hash)

## [PHPカンファレンス関西 2016](http://conference.kphpug.jp/)
- 開催日 : 7月16日（土）
- 開催場所 : [ブリーゼプラザ](http://www.breeze-plaza.com/access/)
- Twitter : https://twitter.com/phpcon_kansai
- ハッシュタグ : [#phpkansai](https://twitter.com/hashtag/phpkansai?src=hash)
- Facebook : https://www.facebook.com/pcon.kansai/

## [PHPカンファレンス 2016](http://phpcon.php.gr.jp/)
- 開催日 : 11月3日(木曜日(祝日))
- 開催場所 : [大田区産業プラザ Pio](http://www.pio-ota.net/access/)
- Twitter : https://twitter.com/phpcon/
- ハッシュタグ : [#phpcon2016](https://twitter.com/hashtag/phpcon2016?src=hash)
- Facebook : https://www.facebook.com/pcon.japan/
node-redでズンドコ

#概要
node-redでズンドコやってみた。
#写真
![zun.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/ce7d7326-1368-1fb4-b898-8127ec07e5fb.jpeg)

#サンプルコード
```
[{"id":"428f4416.72e44c","type":"debug","name":"出力","active":true,"console":"false","complete":"payload","x":936,"y":4311.2001953125,"z":"15837b08.d6c725","wires":[]},{"id":"c7a07368.5937c","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":147,"y":3966,"z":"15837b08.d6c725","wires":[["896d9cfa.72c6b"]]},{"id":"92f44726.d14548","type":"function","name":"loop","func":"var k = Math.floor(Math.random() * 2);\nif (k < 1)\n{\n\tmsg.k = 0;\n}\nelse\n{\n\tmsg.k = 1;\n}\nreturn msg;","outputs":1,"x":486,"y":3968,"z":"15837b08.d6c725","wires":[["7767289d.c90548"]]},{"id":"896d9cfa.72c6b","type":"template","name":"init","field":"i","template":"0","x":313,"y":3964,"z":"15837b08.d6c725","wires":[["92f44726.d14548"]]},{"id":"6c790eb4.d9f9","type":"function","name":"count","func":"if (msg.k == 0)\n{\n\tmsg.i++;\n}\nelse\n{\n\tmsg.i = 0;\n}\nreturn msg;","outputs":1,"x":819,"y":3966,"z":"15837b08.d6c725","wires":[["63b6fe59.b5f4"]]},{"id":"7edae024.3c207","type":"switch","name":"4kai","property":"i","rules":[{"t":"eq","v":"4"},{"t":"neq","v":"4"}],"checkall":"true","outputs":2,"x":794,"y":4146,"z":"15837b08.d6c725","wires":[["8d13f038.fc00b"],["92f44726.d14548"]]},{"id":"68f7e77e.243b68","type":"template","name":"zun","field":"payload","template":"zun","x":600,"y":4143,"z":"15837b08.d6c725","wires":[["7edae024.3c207","428f4416.72e44c"]]},{"id":"9d6967d4.c69138","type":"template","name":"doko","field":"payload","template":"doko","x":590,"y":4207,"z":"15837b08.d6c725","wires":[["428f4416.72e44c","92f44726.d14548"]]},{"id":"63b6fe59.b5f4","type":"switch","name":"dochi","property":"k","rules":[{"t":"eq","v":"0"},{"t":"eq","v":"1"}],"checkall":"true","outputs":2,"x":385,"y":4171,"z":"15837b08.d6c725","wires":[["68f7e77e.243b68"],["9d6967d4.c69138"]]},{"id":"7767289d.c90548","type":"delay","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":664,"y":3964,"z":"15837b08.d6c725","wires":[["6c790eb4.d9f9"]]},{"id":"d86d8b38.47c918","type":"template","name":"kiyoshi","field":"payload","template":"doko ki yo shi!","x":937,"y":4232,"z":"15837b08.d6c725","wires":[["428f4416.72e44c"]]},{"id":"8d13f038.fc00b","type":"delay","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"seconds","rate":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":978,"y":4136,"z":"15837b08.d6c725","wires":[["d86d8b38.47c918"]]}]
```
RaspberryPi + Cylon.js で サーボを動かす

# Raspberry Pi 上で Cylon.js を使ってサーボを動す
RaspberryPi 上で Cylon.js を使い サーボを動かす方法についてまとめます

【参考サイト】
[RsspberryPi](https://www.raspberrypi.org/)
[Cylon.js](https://cylonjs.com/)

# 必要な物をいろいろインストールする

Cylon.js から　PWM を使う際、pi-blaster を使用して一部のGPIOピンを PWM としてソフトウエア的に制御します。
ので、最初に pi-blaster をインストールしておきます。

### autoconf が Install されていない場合あらかじめInstallしておきます。
```bash
sudo apt-get install autoconf
```

### pi-blaster のコンパイル
```bash
git clone https://github.com/sarfata/pi-blaster.git
cd pi-blaster
./autogen.sh
./configure
make

sudo make install
```

### pi-blaster を実行する
コマンド実行後 バックグラウンドで pi-blaster が実行されます
```bash
sudo ./pi-blaster
```

# Cylon.js を Install
## npm を update しておく
Raspbian Default で、 nodejs v0.10.29, npm v1系 がInstallされている
念のため npm を Upgradeしておく（もしかしたら必要なっかも）
```bash
sudo npm install -g npm@2
```

## Cylon.js の Install
```bash
# Project 用フォルダを作る（名前は何でもいいです）
mkdir servo-control
cd servo-control

# package.json の生成
npm init

# Cylon.js Core Module を Install
npm install cylon cylon-firmata cylon-gpio cylon-i2c --save

# Cylon.js Raspberry PI 用モジュールをインストール
npm install cylon cylon-raspi --save
```

これで Install は完了

# サンプルを動かしてみる

```bash
vi index.js
```

ソース

```js:indexjs
"use strict";

var Cylon = require("cylon");

Cylon.robot({
  connections: {
    raspi: { adaptor: "raspi" }
  },

  devices: {
    servo: {
      driver: "servo",
      pin: 11,
      limits: { bottom: 20, top: 160 }
    }
  },

  work: function(my) {
    var angle = 30,
        increment = 5;

    every((1).seconds(), function() {
      angle += increment;
      my.servo.angle(angle);
      console.log("Current Angle: " + (my.servo.currentAngle()));

      if ((angle === 30) || (angle === 150)) { increment = -increment; }
    });
  }
}).start();
```

これで、#11 Pin にサーボのを繋いで、実行

```bash
node index.js
```

サーボが少しづつ回っていきます

## pi-blaster で PWM 出来るピン番号について
いかが PWM として使えるはず

|GPIO#|Pin#|
|:----|:---|
|4|7|
|17|11|
|18|12|
|21|13|
|22|15|
|23|16|
|24|18|
|25|22|

マニュアルによるとこの辺が使えるはずです