OmniAICreator/Qiita-1.07M huggingface dataset:
nvm ls-remoteでN/Aの場合


```sh
$ nvm ls-remote
```

とすると、インストール可能なバージョン一覧が表示される。

ハズ…。

```sh
$ nvm ls-remote
  N/A
```

って返ってきてしまったら。

```
export NVM_NODEJS_ORG_MIRROR=http://nodejs.org/dist
```

とすると、期待通り動く。
MERGEでINSERTしたかUPDATEしたかを知る

`OUTPUT`句に**$action**を指定する

```sql
MERGE INTO table_name
    ...
WHEN MATCHED WHEN
    ...
WHEN NOT MATCHED WHEN
    ...
OUTPUT
    $action AS RESULT_STRING       -- nvarchar(10) 'INSERT' または 'UPDATE' または 'DELETE' が入る
```

[MERGE (Transact-SQL)](https://msdn.microsoft.com/ja-jp/library/bb510625.aspx)
[OUTPUT 句 (Transact-SQL)](https://msdn.microsoft.com/ja-jp/library/ms177564.aspx)
Redmine plugin開発で、テストコード作成時にCustomValueにテストデータを設定する時の注意点


## はじめに

Redmine plugin開発で、Projectにのカスタムフィールドを使ったテストコードを書く時に、
自分が設定したはずの値が設定されずにはまりました。
わかってしまえば簡単なことだったのですが、同じところではまらないようまとめておきます。

次のようなProjectに紐づくカスタムフィールドと、その値を使ったテストを書きたいとします。
（必要最小限の項目のみ設定します）

```
Project
  id: n
  name: 'テストプロジェクト'

ProjectCustomField
  id: m
  name: '主管部署'
  field_format: 'string'
  position: 1

CustomValue
  customized_type: 'Project'
  customized_id: n # Project.id
  custom_field_id: m # ProjectCustomField.id
  value 'xx開発部'
```

## テストコード（はまったパターン）

例えば次のようにコードを書くとします。（このテスト自体に意味はありません）

```rb:spec
before do
  custom_field = ProjectCustomField.create(name: '主管部署', field_format: 'string', position: 1)
  project = Project.create(name: 'テストプロジェクト')
  CustomValue.create(customized_type: 'Project', customized_id: project.id, custom_field_id: custom_field.id)
end

it '主管部署が設定されていること' do
  project = Project.first
  primary_section = project.custom_field_values.find {|c| c.custom_field.name == '主管部署'}
  expect(primary_section.value).to eq 'xx開発部'
end
```

このテストを実行すると、primary_section.valueがnilになっていました。

ずいぶん悩まされましたが、次のように変更すると期待通りに動きます。

```rb:変更前
before do
  custom_field = ProjectCustomField.create(name: '主管部署', field_format: 'string', position: 1)
  project = Project.create(name: 'テストプロジェクト')
  CustomValue.create(customized_type: 'Project', customized_id: project.id, custom_field_id: custom_field.id)
end
：
```

```rb:変更後
before do
  project = Project.create(name: 'テストプロジェクト')
  custom_field = ProjectCustomField.create(name: '主管部署', field_format: 'string', position: 1)
  CustomValue.create(customized_type: 'Project', customized_id: project.id, custom_field_id: custom_field.id)
end
：
```

Redmineでは、新しくProjectを作成するときに、カスタムフィールドが存在すれば、自動的に初期値を設定します。

先ほどうまくいかなかった例では、
1.ProjectCustomFieldを作成
2.Projectを作成 => ここで初期値のCustomValueが作成される
3.CustomValueを作成
という順にしていたため、初期値のCustomValueが取得されていました。

## テストコード（うまくいくパターン）

ということで、データ作成の順番を変更します。

1.Projectを作成 => 初期値のCustomValueは作成されない
2.ProjectCustomFieldを作成
3.CustomValueを作成

```rb:spec
before do
  project = Project.create(name: 'テストプロジェクト')
  custom_field = ProjectCustomField.create(name: '主管部署', field_format: 'string', position: 1)
  CustomValue.create(customized_type: 'Project', customized_id: project.id, custom_field_id: custom_field.id)
end

it '主管部署が設定されていること' do
  project = Project.first
  primary_section = project.custom_field_values.find {|c| c.custom_field.name == '主管部署'}
  expect(primary_section.value).to eq 'xx開発部'
end
```

もしくは、自動生成されたCustomValueの値を変更する形が良いかもしれません。
数値に3桁区切りのカンマを入れる

#### SqlServer

CONVERT関数の第３引数に1を指定すると数値がカンマ区切りになる。

ただし、

* 数値を**money**型または**smallmoney**型にする必要がある
* 小数点２位まで勝手につくのでそれを取り除く必要がある

 
```sql
REPLACE(CONVERT(nvarchar,CONVERT(money, expression), 1), '.00', '')
```
> SQL Server 2012から [format](https://technet.microsoft.com/ja-jp/library/hh213505.aspx) 関数が追加（逆は[parse](http://msdn.microsoft.com/ja-jp/library/hh213316.aspx)）

[CAST および CONVERT (Transact-SQL)](https://msdn.microsoft.com/ja-jp/library/ms187928.aspx)

#### Oracle
TO_CHAR関数を使う。（未確認）

```sql
TO_CHAR(expression, '999,999,999')
```
> ゼロ詰めしたい場合は9の代わりに0を指定する。
[Angular.js]背景色の濃さを変更するdirective

使い道がいまいち伝わらなさそうだけど、ng-repeatとかで要素を並べるとき、要素の背景色の濃さを変更したいとか、背景色を動的に指定した色の範囲で変更したいとか。
あまりキレイに書けなかった。


``` gradation.js
app.directive('gradation', function() {
  return {
    scope: {
      gradation: "="
    },
    link: function(scope, element, attrs) {
      scope.$watch('gradation', function(gradation) {
        updateGradation(gradation);
      });

      var updateGradation = function(gradation) {
        var color = !isFinite(gradation) ? "#" + START.R.toString(16) + START.G.toString(16) + START.B.toString(16)
          : "#" + hex("R", gradation) + hex("G", gradation) + hex("B", gradation);
        angular.element(element[0]).css('background', color);
      };

      var hex = function(type, gradation) {
        var diff = END[type] - START[type];
        var color = START[type] + diff * gradation;
        return (~~color).toString(16);
      };

      var START = {
        R: 187, G: 223, B: 251
      };

      var END = {
        R: 25, G: 118, B: 210
      };
    }
  }
});
```

## 使い方
こんな感じ。gradationに0~1の値を設定する。実際には変数をバインドして「ng-repatで列挙した要素の重要度に応じて背景色を濃くする」ようなことをしている。

``` index.html
<ul>
  <li ng-repeat="item in items" gradation="0.5">
    <p>ほげ</p>
  </li>
</ul>
```
supervisorでデーモン化したスクリプトをきちんと正常終了させるようにしようとしたけどできなかった件（訂正：できた）


## やりたいこと

SQSとかRabbitMQとかのキューを監視して処理するworkerスクリプトを書いて、それをsupervisorでデーモン化して使ってるだけど、スクリプトのリロードの時とか、サーバー再起動の時に、きちんとSIGTERMとかのシグナルによってきちんと正常終了したいと思いやってみたけど、できんかった。

下記のように、Aして、Bして、Cして完了、みたいな処理があったとして、
task_a のあとで処理をブチ切りされたら、不整合が生じるのでなんとかしたい。

```
while (1) {
	$message = get_queue_message();
	task_a($message);
	task_b($message);
	task_c($message);
    // SIGHUP されたらここで終了したい。
}
```


まとめるとこんな感じ

* SQSとかRabbitMQとかのキューを監視して処理するworkerスクリプトを書いた
* 無限ループでずっとキューを監視し、あったら処理
* スクリプトをsupervisord でデーモン化
* スクリプトはphpで記述
* SIGTERMとかのシグナルもらったら、処理の途中ではなく、キリのよいところでお行儀よく終了したい。

## 書いてみたスクリプト
 こんな感じのやつ。


```php
<?php

declare(ticks = 1);

class Worker
{
    static $shutdown = 0;

    public function run()
    {
        $i = 0;
        while (1) {
            printf("[$i] task_a \n");
            printf("[$i] task_b \n");
            printf("[$i] task_c \n");

            if (self::$shutdown == 1) {
                echo "shutdown!!!\n";
                exit;
            }
        }
    }

    /**
     * シグナルを受け取った時の処理
     */
    public static function sigHandler($signo)
    {
        self::$shutdown = 1;
    }
}

// シグナルハンドラの設定
pcntl_signal(SIGTERM, "Worker::sigHandler");
pcntl_signal(SIGHUP,  "Worker::sigHandler");

$worker = new Worker();
$worker->run();

```

## 何がだめだったか。

supervisorctl start all とか、supervisorctl stop all とかしても、コンソールが固まって返ってこない。

推測だけど、supervisor がなんかスクリプトのプロセスを後ろにおいやる処理とかしてるのと、worker　の中でシグナルハンドラを再定義してるのが衝突してるのかも。supervisorの仕組みがよく分かってないのでよくわからん。

こういう処理実装するときってどうするのがいいんだろ。
教えてエロいひと。

## 追記（2015/02/18）

supervisor をバージョン 3にあげたら、問題なく動きました。
WindowsのVMでnpm install時にモジュールのパスが255文字を超えてしまう場合

Windowsで、CentOSだとかUbuntuのVMをVagrantでよく動かしています。
というか、最近の作業はほとんどそれ。

そこで問題になったのは、WindowsOSとVMとの共通領域(ex:/vagrant)に
npmのローカルインストールを行う際、モジュールのパスが255文字を超えてしまって、
protocolエラーが発生してしまうというもの。

これを回避するには、ひとまずWindowsOSから切り離されたVM上のパス(ex:/home/xxx)で
npm installし、それを上記/vagrant等の場所にリンクを貼るといいのではないでしょうか。

ただし、WindowsOS上のパスにLinuxのリンクを貼る場合、
管理者権限でVMを起動する必要があるようなので、そこのところだけ注意してください。
※管理者権限でコマンドプロンプトを実行して、vagrant upですね。
日本語対応のLaTexで自動字下げされない件(＋字下げしない方法)

#はじめに
通常LaTexは` \noindent `で字下げをしないように設定しない限り、段落が変わった時に字下げされるらしい(参考：[論文清書システム TeX を使う](http://www.itc.u-toyama.ac.jp/el/tex/120204.html))のですが、自分の環境下(OS X Yosemite10.10.2。TexPadで記述中。)ではなぜか自動で字下げされない...

そこで、Google先生に聞いてみた結果...

>>First of all, you probably shouldn't indent the first paragraph. Look in nearly any professional publication and you'll find that the first paragraph is never indented. It's a standard typographical rule.

>→英文の印刷物では、最初のパラグラフの字下げはしないんだよアホ(意訳)
『[LaTeXのインデント](http://ozuma.txt-nifty.com/blog/2003/12/latex_1.html)』より引用。

#で、結局どうすればいいか？

プリアンブルに`\usepackage{indentfirst}`と書けば、強制的に字下げしてくれるらしいです。

#感想
...でも他のサイトでは字下げさせない方法がたくさん載ってるところを見ると、普通は自動で字下げしてくれるのかなぁ？
自分が変な設定でもしてしまっているのか( º言º` )

...っと思っていたら「[英語文の体裁 - TeX Wiki](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?%E8%8B%B1%E8%AA%9E%E6%96%87%E3%81%AE%E4%BD%93%E8%A3%81)」というサイトにこんな文が。

>インデントはパラグラフの先頭を見つけやすくするためのものなので，最初の段落についてはセクション見出しなどがあるので字下げする必要がないと英語文では考えるわけです。LaTeX では特に設定を変えなければ上記の習慣に従って組版されますが，最初のパラグラフにおいても意図的に字下げを行う場合には，indentfirst.sty パッケージを使用します（学術誌には，このような形式のものも多い）．
[英語文の体裁 - TeX Wiki](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?%E8%8B%B1%E8%AA%9E%E6%96%87%E3%81%AE%E4%BD%93%E8%A3%81)より引用。

ちなみに、字下げしない方法は

1つの段落に対して：`\noindent`
全ての段落に対して：`\parindent = 0pt`

で、できるそうです。([TeXの段落の最初で字下げしないようにする](http://miyahn.blog80.fc2.com/blog-entry-112.html))

他にも`\leftskip`というのを利用してもできるらしいです。(参考：[LaTeX \section などで箇条書きのように字下げする方法](http://www.math.kobe-u.ac.jp/~kodama/tips-latex-indent-section.html))

#参考URL
* [LaTeXで作成していた日本語ドキュメントで字下げされない段落がある件について](http://blue-jam.hatenablog.com/entry/2013/09/13/001111)
* [LaTeXのインデント](http://ozuma.txt-nifty.com/blog/2003/12/latex_1.html)
node-ffiをio.js@v1.2.0やnode.js v0.12.0で動かした

# 使い方

```
npm install kjunichi/node-ffi
```

# package.jsonの書き方

- [Node.js - npmでnpm管理外のモジュールを指定するには - Qiita](http://qiita.com/kjunichi/items/beec5e5ef21fd8fb105b)

# Link

- https://github.com/node-ffi/node-ffi/issues/187
ターミナルで空白文字(半角スペース)を含むディレクトリやファイルを扱う方法

#はじめに
多くの方は知っているかもしれないが、時々使うのでメモ代わりに。ただ、時々しか使わないから忘れてしまうのだが...

#方法
では、その方法です。

###ダブルクフォーテーション(")で囲む

例）
```cd ~/Library/"Application Support"/
```

これだけ。

#参考URL
[「ターミナル」で空白文字を含むディレクトリやファイルを扱うときに便利な小技](http://macperson.net/terminal_escape_paste/)
小さなお友だちの為の　MacOsXでBASIC #13　極方程式からの正葉線 r = sin 2θ


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#極方程式を媒介変数形に変形
極方程式でr=f(θ）の場合
媒介変数表示では
x=f(θ）*cos(θ)
y=f(θ）*sin(θ)
r=sin(2θ）の場合、正葉戦となります。
プログラムとしては、以下のコード

##13.BAS
```bas:13.BAS
10 DEF f(t)=SIN(2*t)
20 SET WINDOW -1,1,-1,1
30 DRAW grid
40 FOR t=0 TO 2*PI STEP PI/360
50    PLOT LINES: f(t)*COS(t), f(t)*SIN(t);
60 NEXT t
70 END
```


##実行結果
おお！きれいに描画できてます。
![スクリーンショット 2015-02-13 5.38.02.png](https://qiita-image-store.s3.amazonaws.com/0/33317/6198f2f9-f70b-3f02-fbd6-9aa5b0b3223a.png "スクリーンショット 2015-02-13 5.38.02.png")
Android Studio での操作方法 レイアウト周り編

Eclipse から、Android Studioに移行し改めて操作方法などを確認しておりまして、
そのちょっとしたメモ。気になったところは随時追記予定。
(Eclipse環境においても実現できるものもあります)


#Textタブ

##string.xmlへの書き出し
TextViewなどのtextをstring.xmlへ書き出す。
書き出し対象上で、ショートカットメニューの表示(mac で、 alt + enter)

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/35343/cff3bea1-d54e-9538-0e05-57e6ea02b9d3.png)

Extract string resource
を選択

##プレビュー
![ss7.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/3bd13cd8-ebb5-8aa5-5434-0afe3550a0bf.jpeg)



解像度の調整や向きの変更などに合わせて
表示の切り替えが可能。



![スクリーンショット 2015-02-13 4.29.09.png](https://qiita-image-store.s3.amazonaws.com/0/35343/294ecc0e-2429-a90a-d2f4-021058ffd6b2.png)





#Designタブ

##id/textの変更
![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/35343/91c3dfa5-2829-9d7f-147e-2464563f43eb.png)

ダブルクリックで。

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/35343/81b68791-f329-b2a3-2b25-994fa5983387.png)

編集可能

##Textタブへの切り替え(選択パーツ箇所)

ショートカットでは、
Cmd + B

右クリックで、Go To Declaration

##選択パーツの別ファイル書き出し
例えば、ヘッダとかフッターとか別ファイルにして読み込む事があったりするので。

```xml

<include layout="@layout/header" />

```
みたいな感じで。

こちらも対象を選択して、右クリックで。
![ss5.png](https://qiita-image-store.s3.amazonaws.com/0/35343/3e8d1267-59f8-88f3-8f8c-403356c68dca.png)

Refactor → Extract Layout


##選択パーツの切り替え(Morphing)
![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/35343/6bdeee6c-18f2-e4ae-702f-dd34f71b1fef.png)

attrがそのままなので、注意が必要。
PyPI に登録されているパッケージから指定したユーザーのパッケージ一覧を取得する

ふと自分が [PyPI](https://pypi.python.org/pypi) に登録したパッケージ一覧を取得したいと思いました。PyPI にログインすると自分のパッケージ一覧はメニューに表示されます。

でも、ログインしないといけないなら他ユーザーのパッケージ一覧を取得できないですね。PyPI の検索でユーザー名を入力すると、ある程度は検索にヒットしますが、たまたまユーザー名を含むようなパッケージなども絞り込まれてしまいます。

https://wiki.python.org/moin/PyPIXmlRpc によると、xmlrpc を使うとできるようです。

```py
>>> import xmlrpc.client as xmlrpclib
>>> client = xmlrpclib.ServerProxy('https://pypi.python.org/pypi')
>>> client.user_packages('t2y')
[['Owner', 'ikazuchi'],
 ['Owner', 'ikazuchi.plugins.pofile'],
 ['Owner', 'ikazuchi.plugins.speech'],
 ['Owner', 'ikazuchi.plugins.blockdiag'],
 ['Owner', 'pyrtm'],
 ['Owner', 'TracTicketReferencePlugin'],
 ['Owner', 'LittleHTTPServer'],
 ['Owner', 'pytest-quickcheck'],
 ['Owner', 'kotti_mapreduce'],
 ['Maintainer', 'TracCronPlugin'],
 ['Owner', 'TracCronPlugin'],
 ['Owner', 'TracMultiSelectBoxPlugin'],
 ['Owner', 'TracChangeFileBiffPlugin'],
 ['Owner', 'unotools'],
 ['Owner', 'TracAutocompleteUsersPlugin'],
 ['Owner', 'TracMovieMacro']]
```

なるほど、できました。

でも、パッケージ一覧を取得するためにわざわざインタラクティブシェルを起動するのは面倒ですよね。コマンドラインから xmlrpc を直接叩くようにしたらもうちょっとお手軽かなぁ。curl を使ってやってみよう。

```bash
$ user="t2y"; curl -s -X POST -H "Content-Type: text/xml" https://pypi.python.org/pypi -d "<?xml version='1.0'?><methodCall><methodName>user_packages</methodName><params><name>$user</name></params></methodCall>" | python -c "import sys; import xml.dom.minidom; print(xml.dom.minidom.parseString(sys.stdin.read()).toprettyxml(indent='  '))"
<?xml version="1.0" ?>
<methodResponse>
  

  <params>
    

    <param>
      

      <value>
        <array>
          <data>
            

            <value>
              <array>
                <data>
                  

                  <value>
                    <string>Owner</string>
                  </value>
                  

                  <value>
                    <string>ikazuchi</string>
                  </value>
                  

                </data>
              </array>
            </value>
            ...
```

なるほど、できました。

でも、xmlrpc のレスポンスをそのまま表示すると冗長だし、改行コードがあちこちに含まれていて全く見やすくありません。

xmlrpc のレスポンスをパースして表示するしかないかなぁ。ElementTree を使ってやってみよう。

```bash
$ user="t2y"; curl -s -X POST -H "Content-Type: text/xml" https://pypi.python.org/pypi -d "<?xml version='1.0'?><methodCall><methodName>user_packages</methodName><params><name>$user</name></params></methodCall>" | python -c "import sys; from xml.etree import ElementTree; print('\n'.join(j for j in sorted(['{} ({})'.format(i[1][0].text, i[0][0].text) for i in ElementTree.parse(sys.stdin).iter('data') if i[1][0].text])))"
LittleHTTPServer (Owner)
TracAutocompleteUsersPlugin (Owner)
TracChangeFileBiffPlugin (Owner)
TracCronPlugin (Maintainer)
TracCronPlugin (Owner)
TracMovieMacro (Owner)
TracMultiSelectBoxPlugin (Owner)
TracTicketReferencePlugin (Owner)
ikazuchi (Owner)
ikazuchi.plugins.blockdiag (Owner)
ikazuchi.plugins.pofile (Owner)
ikazuchi.plugins.speech (Owner)
kotti_mapreduce (Owner)
pyrtm (Owner)
pytest-quickcheck (Owner)
unotools (Owner)
```

なるほど、できました。

・・・

正直どうすれば良いのか分かりません :sweat:
Elixir/cowboyとRailsのサーバーベンチマーク比較

![elixir-logo.png](https://qiita-image-store.s3.amazonaws.com/0/28174/8bbfaf57-c400-af2a-4eeb-0dbbaf827c4d.png)![vs.png](https://qiita-image-store.s3.amazonaws.com/0/28174/5abb67fb-7a19-abfa-e462-805cd9d5a44f.png)![rails-logo.png](https://qiita-image-store.s3.amazonaws.com/0/28174/456cac01-b4d8-17f0-4e9d-45400e76a8d7.png)


業務でAPIサーバーを作る事になり、何で実装しようか検討したという話です。
候補としてRails(定番)が上がっていたものの、

* 大量のリクエストを捌く必要があるので大変そう
* ビジネスの成長に合わせてスケールさせ辛い(スゴい勢いで成長する)
* そこまで複雑な処理はしない(別のサブシスでごりごりやる、こっちはRails製)

という事で他の選択を検討しました。
選択しとして

* Erlang ( + cowboy )
* Elixir ( + cowboy )
* Scala ( + akka )
* Go

があがったので、RailsとElixir/cowboyでAPIサーバーのプロトタイプを作ってベンチマーク比較をしてみました。

※ ElixirはErlangと同水準のBeamを吐くのでErlangは除外しています
（実際に計測した結果、同程度の性能でした、こちらは別途結果をまとめて公開します)

※ Go/Scalaについては僕自身そこまで熟知しているわけではないので今回は対象から外しています

以下、プロトタイプAPIサーバーの仕様です

* pingリクエストでpongを返す(http://bench-server/ping -> pong)
* mysqlからデータをJSONで取得、ただし複雑なクエリは投げない(http://bench-server/users -> {user's json list})

ソースコードは[こちら](https://github.com/ohr486/server_bench)

使用したサーバー/ライブラリは

* AWS/EC2(t2microインスタンス)
* 64bit CentOS7
* Rails: Rails4.2 + Ruby2.2 + nginx1.6.2 + unicorn4.8.2
* Elixir: Erlang17.4 + Elixir1.0.2 + Cowboy2.0
* somaxconnsの値: 65535
* nofileの値: 65535

以上の環境でabを使い、以下の様に計測しました。

* DBアクセスをしない(ボトルネックにならない)、ping-APIに対してリクエストをかける
* 各同時接続数毎に5回測定を行いその平均を結果とする( ab -n <同時接続数> -c <同時接続数> target-url )
* 同時接続を投げてエラーにならない最大同時接続数
* ElixirとRailsの最大接同時続数の Request/Sec、Time/Req を測定

**2/14追記1**
コメントのご指摘通り、somaxconnの(デフォルト128の)値でbacklogsが上書きされていた為、railsのベンチマークの最大上限が130(128)となっていました。
somaxconnの値を65535に変更してベンチを取り直しました。

**2/14追記2**
cowboy(Ranch)のmax_connectionsがファイルディスクリプタ数に依存する為、nofileの値を65535に変更してあります。

結果は以下となります。

https://docs.google.com/spreadsheets/d/1J8Rk9EwImbRifUPkqYdJuH9qzx8-szuLmNootQO6Z6U/edit#gid=0

|   |Rails|Elixir|
|:--|-----|-----:|
|(Failedが出ない)最大同時接続数|~~130~~ 510|4900|
|最大同時接続時のRequest/Sec|~~689~~ 722|4175|
|最大同時接続時のTime/Req(1リクエストあたり)|~~1.47ms~~ 1.38ms|0.37ms|

![rails-bench.png](https://qiita-image-store.s3.amazonaws.com/0/28174/2b09361f-18be-88d6-4906-64603ed83076.png)

![elixir-bench1.png](https://qiita-image-store.s3.amazonaws.com/0/28174/3d21406c-d62e-3371-840a-638e3262e71e.png)

![elixir-bench2.png](https://qiita-image-store.s3.amazonaws.com/0/28174/90e022a3-1f9b-0726-f11a-d1e38701941f.png)

Railsは(もちろんElixir/cowboyも)チューニングの余地がかなりあり、まだまだベンチ結果を上げる事は可能と思います。

ただどう頑張っても（僕のスキルでは）Elixir/cowboyでの結果並みにRailsをチューニングで性能改善ができるイメージはわきませんでした。
(またRailsではなくSinatra等の軽量F/Wを使えばもっと良いベンチマーク結果がでると思います)

また、このベンチマークではDBアクセスがありません(単純なping)が、DBアクセスのあるAPIのベンチマークを取れば、Elixir/cowboyはDBがボトルネックになりここまでの性能は出ないと思います。（事実DBがボトルネックになり性能劣化しました）

以上をふまえて、僕の携わってるプロジェクトにてElixirの採用を決定しました。

### (注意)
このエントリは「Rails遅いよ」という事を主張するものではありません。
事実、ビジネスロジックが多く実装される管理システムはRailsを採用しております。
要は適材適所という話で、たまたまElixir/Cowboyという選択肢があったので採用したのです。
はい。
Appiaries＋JQueryで簡単WEBアプリ

#AppiariesでDB構築の手間を削減

いいですね。BaaS。すばらしいです。
サーバサイドに一切触れることなくDBを使えるということで、下手すればペライチのHTMLでもWEBアプリになりえます。素敵ですね。素敵。

http://www.appiaries.com/jp/


#スピード重視で

ユーザの管理もできる意外と多機能なアピアリーズで、
認証していないユーザにはDBの捜査権がなかったりします。
しかし、そんな設定も面倒なくらい雑なアプリを作ることが大好きな私は、
誰でも読み書きできるセキュリティ意識皆無の設定で構築してみます。

#DBの設定


![スクリーンショット 2015-02-13 1.57.22.png](https://qiita-image-store.s3.amazonaws.com/0/50872/17c08e75-eda7-02cd-b8ad-ee6365c6efe3.png)

登録と参照は誰でも出来ますが、更新と削除は管理者以外にはできない設定です。
ここの設定次第で、リクエストの際にトークンが要らなかったりします。

ちなみにこの設定の場合、「登録」にはアプリに設定されているアクセストークンが。
「参照」の場合には何もいりません。

#実装

##登録

```javascript
$.ajax({
            type: "POST",
            url: "https://api-datastore.appiaries.com/v1/dat/_sandbox/KSRP_Lib/KSRP",
            data: JSON.stringify({
               "key":"value",
               "key2":"value2",
            }),
            headers: {
                'Content-Type': 'application/json',
                'X-APPIARIES-TOKEN': access_token
            },
            dataType: "text", 
        }).done(function(data, status, xhr) {
            //成功時の処理
        }).fail(function(data, status, xhr) {
            //失敗時の処理
        }).always(function(data, status, xhr) {
            //共通の処理
        });   

```

リレーショナルじゃないので好きに登録できるのがまた楽ですね。

##参照

```js

$.ajax({
            type: "GET",
            //URLで検索条件を指定
            url: "https://api-datastore.appiaries.com/v1/dat/_sandbox/KSRP_Lib/KSRP/-;id.gte."+start+"n;id.lte."+end+"n",
            headers: {
                'Content-Type': 'application/json',
                'X-APPIARIES-TOKEN': access_token
            },
            dataType: "json", 
        }).done(function(data, status, xhr) {
            //成功時の処理
        }).fail(function(data, status, xhr) {
            //失敗時の処理
        }).always(function(data, status, xhr) {
            //共通の処理
        });  

```

うーん・・・。さすがに細かい検索条件は難しいみたい。
そもそもJOINとか構造的に不可能だし・・・。



とはいえ、休日プログラマの強い味方だと思います。
いやぁ休日が楽しみだ。
[ruby] Makefile を生成する gem <moon_rabbit>

# 概要

C言語やC++で開発した実行ファイルやライブラリファイルのビルドに
毎回 Makefile を手動で生成したり、修正するのが面倒臭くなったので、
Ruby でコンパイルオプションを可変に定義した Makefile を自動生成したり、
ビルドコマンドをカスタマイズできるようにしてみた。

# moon_rabbit のインストール

```bash
gem install moon_rabbit
```

# 単純な使い方

```c:main.c
#include <stdio.h>

int main( void ){
  printf( "main\n" );
  return 0;
}
```

```rb:Makefile.rb
require "moon_rabbit"
include MoonRabbit

Makefile.new{
  path           "Makefile"
  compiler       "gcc"
  main_target    "main"
  src            "main.c"
  compile_option "-g -Wall -O2"
  
  # Makefile を生成
  output
}
```

main.c と Makefile.rb を用意し、

```bash
ruby Makefile.rb
```

とするだけで、
main をビルドするためのMakefileが生成され、

```bash
make
```

で main が生成される。

# Rakefile との組み合わせ

Rakefile と組み合わせることで、
複数の Makefile の生成やビルドが容易になる。

```c:libtest.c
#include <stdio.h>
#include "libtest.h"

int add( int value1, int value2 ){
  return value1 + value2;
}
```

```c:libtest.h
int add( int value1, int value2 );
```

```c:main.c
#include <stdio.h>
#include "libtest.h"

int main(){
  printf( "1 + 2 = %d\n", add( 1, 2 ) );
  return 0;
}
```

```rb:Makefiles.rb
require "moon_rabbit"
include MoonRabbit

common_makefile = Makefile.new{
  compiler       "gcc"
  obj_dir        "obj"
  compile_option "-g -Wall -O2"
}

Makefiles.add Makefile.new{
  add common_makefile
  
  path           "Makefile.libtest"
  main_target    "libtest.a"
  src            "libtest.c"
}

Makefiles.add Makefile.new{
  add common_makefile
  
  path           "Makefile.main"
  main_target    "main"
  src            "main.c"
  static_lib     "libtest.a"
}
```

```rb:Rakefile
require "moon_rabbit"
require "moon_rabbit/Rakefile"
require "./Makefiles"
```

```bash
rake output
rake build
```

# Github

[moon_rabbit](https://github.com/liveralmask/moon_rabbit)
[swift]iosProjectでParseを使う方法

#cocoapodsでインストール
ターミナルから当該ProjectのPathに飛ぶ
`cd projectPath`
そこで、cocoapodsでParseをインストールする。コマンドは以下
$ touch Podfile // Podfileを作成します
$ vim Podfile   // Podfileを編集します

`+ platform :ios, '8.0'
+ pod ‘Parse', '~> 1.6.2'  // ,以降はバージョンの指定`

編集が終わったら、espキーを押す。後、:wqで保存

`pod install //これでプロジェクトにライブラリをインストールできる`

以上のやり方は、(http://qiita.com/knife0125/items/897348ba1fcd07eeaf01) 参照

#parseとの接続方法
Xcodeの方で、New File(cmd+N)して、Obj-Cでファイルを作成。ファイル名は何でもOK。ここではhogeとした。
hoge.mとProjectName-Bridging-Header.hという２つのファイルが生成される。
hoge.mというファイルは不要なので、削除する。また、ProjectName-Bridging-Header.hに下記コードを追加する。
ProjetName-Bridging-Header.swift
	`#import <Parse/Parse.h>`
その次にAppDelegate.swiftに以下を追加

`func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    var Id = “xxxxxxxxxxxxxxxxx”　//applicationID
    var Key = “xxxxxxxxxxxxxxxxx” // Key
 `
  `  // MARK: - Parse
    Parse.setApplicationId(Id, clientKey: Key)
    PFUser.enableAutomaticUser() //以下はあらかじめ匿名ユーザーを作るものなので書かなくても接続はできます
    var defaultACL = PFACL()
    PFACL.setDefaultACL(defaultACL, withAccessForCurrentUser: true)
    return true
}
`
Swift 1.2のif let複数宣言と例外処理


# Swift1.2でif letでの複数の宣言が可能になった

```Swift

func getA()->String?{
    return "A"
}

func getB()->String? {
    return "B"
}

func getC()->String?{
    return "C"
}


func test() -> (){
    // カンマ区切りで複数の変数のOptional判定 + 宣言が可能に
    if let a = getA(), b = getB(), c = getC(){
        print( a + b + c + "のすべてがnilではない　")
    }else{
        print( "a,b,cのうちどれかがnilの場合はfalse")
    }
}

```

# if letの複数宣言では直前に解決した変数を使うことができる


```Swift

func getA()->String?{
    return "A"
}

func getB(a:String)->String? {
    return a + "B"
}

func getC(b:String)->String?{
    return b + "C"
}


func test() -> (){
    if let a = getA(),
           b = getB(a), // ←直前に解決したaを引数として使用
           c = getC(b)  // ←直前に解決したbを引数として使用
    {
        print( a + b + c + "のすべてがnilではない　")
    }else{
        print( "a,b,cのうちどれかがnilの場合はfalse")
    }
}

```

つまりこれは
getA()
getB(a)
getC(c)
と逐次処理をして途中でnilが返されると処理を中断するような
簡易的な例外処理として機能する


## 例えばこれをSwift1.1の範疇で書こうとすると
if文のネストが深くなりめんどくさい

```Swift
func test() -> (){
    if let a = getA(){
        if let b = getB(a) {
            if let c = getC(b) {
                print( a + b + c + "のすべてがnilではない　")
                return
            }
        }
    }
    print( "a,b,cのうちどれかがnilの場合はfalse")
}

```


# if letの中で処理を書いてしまえ

いくつかユーティリティ的な関数を用意すると、if letの中で通常と処理と同じ実装を行うことができる

```Swift
簡単な制御用関数

// if letのなかではOptional型しか扱えないので、
// 通常の変数を扱うためにOptional型でくるんでやる
func let_<T>(s:T) -> T?{
    return s
}

// if文に相当する分岐
func if_<T>(b:Bool, #then:()->T, #els:()->T) -> T{
    if b {
        return then()
    }else{
        return els()
    }
}

// あとはfor文に相当する処理とか
```


```Swift

func getC(c:String) -> String? {
    return c + "C"
}

func test(arg:String) -> String? {
    if let
        a = let_(arg), // 引数をoptional化
        b = if_(a == "A", // 条件分岐
            then:{
                return a + "B"
            },els:{
                return nil
            }),
        c = getC(b)
    {
        return c
    }
    return nil
}


test("A") // => "ABC"
test("B") // => nil

```

# これってHaskell的には

Maybeモナドのdo構文とそっくりですね
pythonでJSONのエンコード、デコード


# JSONで連想配列を扱う

連想配列をJSONにエンコードしてTCPやUDPで送ったり、JSONで書かれた設定ファイルを読み込むなど、最近使う機会が増えたのでメモ。

## エンコード

連想配列のデータが頻繁に書き換わり、それらの内容を配列ごと通信で送りたい場合などは、JSONを使えば便利。

例えば何かの3次元座標を取得し、連想配列に格納するとする。


```python
>>> import json
>>> list = {'x': 100, 'y': 200, 'z': 300}
>>> json.dumps(list)
'{"x": 100, "y": 200, "z": 300}'
```

今回の例は簡単なデータなので、わざわざ連想配列にする必要もないが、データの種類が多岐にわたる場合や、その順番をいちいち覚えてらんないときに、キーでデータが取り出せるというのはすごく楽。

JSONにエンコードしたデータを何らかの通信でどこかへ送る場合なんかも、キーさえ教えておけば、受け取る側はデータの取り出しが簡単になる。
そこで、JSONのデコード。

## デコード

先ほど使ったlistをエンコードして、変数に代入し、それをデコードしてみる。

```python
>>> import json
>>> list = {'x': 100, 'y': 200, 'z': 300}
>>> enc = json.dumps(list)
>>> print enc
'{"x": 100, "y": 200, "z": 300}'
>>> dec = json.loads(enc)
>>> print dec
{u'y': 200, u'x': 100, u'z': 300}
>>> print dec['x']
100
```

こんな感じ。
デコードしたあとは、中の要素の順番はばらばらになる。まあどうせ参照する際はキーで呼び出すので順番は関係ない。
XRP と IOU

# はじめに

rippleという決済プラットフォームが日本でも事業として使う人が増えてきました。
しかしいろいろな専門用語が多く普通の人には馴染みのない概念なのではないでしょうか。
まずは基礎概念としてXRPとIOUについて解説したいと思います

**※IOUについては発行する側も保有する側も特にリスクが高いので注意してください。**
**IOUは価値記録ではありませんので現行法によって管理されると思います。**

法律については以下の東京JPY発行所の記載を参照
https://tokyojpy.com/ripple-faq/index.php#faq_id6

## XRP とは

XRPにはripple内においていくつかの役割を持っています
ripple内で唯一価値を記録できる通貨です。

### 価値の記録

XRPは価値を記録する通貨としての役割を持っています。
以下のような用途で使われます

* 送金
* 他の価値を計るモノサシ
* システムへの手数料の支払い

rippleというシステムが維持される限り価値を持ちます
オープンソースで誰でもシステムを構築でき
P2Pのシステムなので誰が運営してもよく例えripple labが倒産してもシステムが維持される限り価値はあります。

### システムへの手数料

手数料はトランザクションに対しての従量課金です。
XRPはトランザクションが発生するたびに全体の総量が減るためそれを持って価値の根拠としています。
以下の操作をするとコストが発生します。

* 送金
* 注文の追加・訂正・削除
* 信用の追加・訂正・削除

XRPはシステムを使うための燃料と捉えることが出来ます。（車に入れるガソリンのようなもの）

### 永続性維持のための担保

支払い以外の機能は一定期間状態を保管しますがこの状態を保管するのに担保を求められます。
担保に利用されたXRPは拘束されます。その間、利用不可になります。
状態の保管は以下の機能です

* アカウントのアクティベート (20XRP)
* 相手を信用する (5XRP)
* マーケットに出した注文を有効にする (5XRP)

状態を維持することをやめれば担保が解除され利用可能になります。
たくさんのrippleアカウントを保持したり、たくさんのゲートウェイを信用したり、たくさんの注文を出すとそれに応じて担保が必要になります。

なおアクティベートに利用する担保は現在解除することはできません。

## IOU とは

IOUとは "I OWE YOU"　私はあなたに借りがあります
ゲートウェイが発行した負債（借用書）を持つ権利です。

ゲートウェイが約束した金銭的価値の権利を持つか、約束したサービスを履行する権利を持ったことを証明します。
また、債権者名簿として利用することが出来ます。（保有者に利息を払うなど）

価値が守られるかどうかはIOUを発行したゲートウェイ次第です。
IOUを発行したゲートウェイが約束を守らなければ価値がなくなります（デフォルトします）
ゲートウェイの”信用”の上に価値が成り立っています。
よって信用がなくなれば価値が失われるのでripple上でIOUを保有することは大きなリスクになります。
保有する場合はよほど信用出来る場合でない限りは保有するにしても短期的な期間にすることをおすすめします。

### 金銭的価値

ゲートウェイが約束した価値を履行する限り価値があります。
ここで送金に使われる手順を以下に説明します

1. Aさんがゲートウェイの指定する銀行口座へ1000円入金します
2. 入金を確認したゲートウェイがAさんに1000JPY発行します
3. Aさんが保有する1000JPYをBさんに対価として支払います。
4. Bさんは1000JPYを受け取りました
5. Bさんはゲートウェイへ1000円出金依頼し、1000JPYをゲートウェイに送金しました
6. ゲートウェイはBさんの銀行口座へ1000円入金します

ここでBさんに支払われる1000円はAさんが入金した1000円です
リップル上でやりとりされるJPYは誰かがゲートウェイに入金したお金を出金する権利です

ゲートウェイにお金を無利子で貸したので権利証が発行されそれを他の人に譲渡し、他の人がその権利を行使してお金を返してもらうながれです。

お金を返してもらえなければデフォルトです。

※５の段階でIOUが消滅します

### サービスの価値

なんらかのサービスを提供するときに前払い的に購入してもらいます
例えばコンサートのチケットを10000枚売ります。
この時の価格は3000JPYとします

全部売れたらあとは自由売買で市場に任せることができます。
（払い戻しを受けるのであれば3000JPYに発行人が買い注文を出しておくことで対応できます）

この場合、買った人は自由に売買できます。売り切れて需要が高い場合でもお金を出せば手に入る可能性はあります。

当日にチケットを専用のアドレスに送金してもらい、その確認を持ってチケットの権利行使を行いIOUが消滅します。

チケットの権利行使をされなかったぶんは払い戻しをするか、もしくは期限切れで無価値になります。


### 債権者名簿

証券的な側面を持っています。
例えば一つのモノを複数人でシェアしてその権利の証明に使う（会社に対する株、商業施設に対するREITなど）
保有している名簿が簡単に取得できるのでそのアドレスになんらかの価値を配れば配当になります。

この場合は配当されることが価値の裏付けになりますが、法律的に保護されることがなく完全に発行者の信用によって行われます。
配当されなければデフォルトです。

※債権者名簿はTOKYOJPYを例にしますが以下のURLで見れます
https://www.ripplecharts.com/#/graph/r94s8px6kSw1uZ1MV98dhSRTvc6VMPoPcN
JPYをクリックすると保有しているアドレスが取得できます
もちろんプログラムから取得できますので全自動で配当出来ます。

### どれにも当てはまらない場合

何らかの約束の裏付けのないIOUはゴミクズになる可能性が高いでしょう。

* 借用書や手形のような証書
* 肩たたき券や入場券のような権利
* 株券のような権利

基本的にはこの３つのどれかの裏付けをもって発行されます。

**IOUは誰でも簡単に発行できるため裏付けのないIOUには価値はありません。**
[Emacs] 前回１秒以上立ち止まった場所にジャンプするコマンド

コードを書いていると、「さっきまでカーソルのあった場所に戻りたい」のような場面はけっこうあります。

そんな人のために、カーソル移動の履歴を残してくれる素敵なプラグイン「[point-undo.el](http://d.hatena.ne.jp/rubikitch/20081230/pointundo)」もあります。

*が。*

僕には、暇なとき、ついカーソルを上下とか左右にぱたぱた動かす癖があります。するとこの履歴もすべて残ってしまうので、 point-undo が使い物になりません。困った。

せっかく拡張のできるエディタを使っているので、僕のような落ち着きのない人のための point-undo を作ってみました。

```el
(require 'ring)
(require 'edmacro)

(defvar-local jump-back!--marker-ring nil)

(defun jump-back!--ring-update ()
  (let ((marker (point-marker)))
    (unless jump-back!--marker-ring
      (setq jump-back!--marker-ring (make-ring 30)))
    (ring-insert jump-back!--marker-ring marker)))

(run-with-idle-timer 1 t 'jump-back!--ring-update)

(defun jump-back! ()
  (interactive)
  (if (ring-empty-p jump-back!--marker-ring)
      (error "No further undo information")
    (let ((marker (ring-ref jump-back!--marker-ring 0))
          (repeat-key (vector last-input-event)))
      (ring-remove jump-back!--marker-ring 0)
      (if (= (point-marker) marker)
          (jump-back!)
        (goto-char marker)
        (message "(Type %s to repeat)" (edmacro-format-keys repeat-key))
        (set-temporary-overlay-map
         (let ((km (make-sparse-keymap)))
           (define-key km repeat-key 'jump-back!)
           km))))))
```

`jump-back!` が肝心のコマンドなので、これをどこかにバインドしておくと便利です。

```el
(global-set-key (kbd "M--") 'jump-back!)
```
Dockerfileのコマンド

* Dockerを使い始めたけどDockerfileで使えるコマンドがよくわからないので調べてみました
    * 公式に[Dockerfile Reference](https://docs.docker.com/reference/builder/)があるので実はそんなに困らないですが…

----

#### FROM
* ベースイメージを指定します
* 必須

#### MAINTAINER
* イメージの作成者を記述できます

#### RUN
* コマンドを実行します
* パッケージのインストールなどで多用するコマンドです

#### CMD
* docker run時に実行されるコマンドです
* /bin/sh -c で実行されるようです

#### EXPOSE
* 外部に公開するポートを指定します

#### ENV
* 環境変数を設定します

#### ADD
* 指定したファイル・ディレクトリをコンテナ内にコピーします
    * URLの指定が可能
    * tarファイルは自動解凍する

#### COPY
* こちらも指定したファイル・ディレクトリをコンテナ内にコピーします
* URLの指定不可、自動解凍もしません
    * ```ADD``` は不要な処理までし兼ねないのでこちらを使ったほうが安全な場合があるようです

#### ENTRYPOINT
* docker run時に実行されるコマンドです
* ```CMD```とよく似ていますが、多少違いがあるようです
    * [Dockerfile の書き方「私的」なベストプラクティス](http://inokara.hateblo.jp/entry/2013/12/28/121828)などで解説されてます
    * docker runの引数で指定されたCMDがENTRYPOINTの引数として扱われるようです

#### VOLUME
* 外部からマウント可能なボリュームを指定します
* データの永続化が可能となります

#### USER
* コンテナで使用されるユーザ名/UIDです

#### WORKDIR
* 作業ディレクトリを変更します
* cdをイメージすると良さそうです

#### ONBUILD
* 次のビルドの最後に実行されるコマンドを仕込むことができます
    * [DockerfileのONBUILD](http://deeeet.com/writing/2014/03/21/docker-onbuild/)で具体的に解説されてます


### 参考にしたサイト
* [Dockerfile Reference](https://docs.docker.com/reference/builder/)
* [Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014](http://www.slideshare.net/kazeburo/docker-yapcasia-tokyo-2014)
* [Dockerfile の書き方「私的」なベストプラクティス](http://inokara.hateblo.jp/entry/2013/12/28/121828)
* [ココだけは押さえておきたい！Docker v0.11 から v1.0 の変更点まとめ](http://ameblo.jp/tech-cz/entry-11876197360.html)
* [DockerfileのONBUILD](http://deeeet.com/writing/2014/03/21/docker-onbuild/)
Spring-Bootの設定プロパティと環境変数

Spring-Boot便利ですね。Springここまで進化しとったんかという感じです。

システムを作るとどうしても「設定」と「プログラム」を分離する必要が出てきます。
Javaには標準的にpropertiesファイルというやつがあるのですが、「どこからそのファイルを探すの？」というのは自前で作りこまなくてはなりません。

今日はSpring-Bootのそのへんの便利さについてです。（はっきり言って自分メモ）

## 読み込み優先順位の話

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

ここに、こんな記述があります。この中から自分が興味あるのだけピックアップします。

>1. Command line arguments.
1. JNDI attributes from java:comp/env.
1. Java System properties (System.getProperties()).
1. OS environment variables.
1. A RandomValuePropertySource that only has properties in random.*.
1. Application properties outside of your packaged jar (application.properties including 1. YAML and profile variants).
1. Application properties packaged inside your jar (application.properties including YAML and profile variants).
1. @PropertySource annotations on your @Configuration classes.
1. Default properties (specified using SpringApplication.setDefaultProperties).

ちなみに上が最強で下に行くほど弱いです。

### 1.Command line args(コマンドライン引数)

指定の仕方は --(ハイフン２つ）をつけて、```--myapp.ldap.port=10389```的な指定の仕方になります。
ただし、```gradle bootRun```で起動するときは一工夫が必要です。（gradleに対する引数として受けられてしまう様子…）

```groovy:build.gradle
bootRun {
    if (project.hasProperty('args')) {    // "args" というプロパティが渡されていたら
        args project.args.split('\\s+')   // 空白文字で split して、 run タスクの args オプションにセットする
    }
}
```

```shell-session:コマンドライン
$ ./gradlew bootRun -Pargs="--myapp.ldap.port=10389"
```

参考

* [run タスクで実行する Main クラスにコマンドライン引数を渡す](http://qiita.com/opengl-8080/items/4c1aa85b4737bd362d9e#run-%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B-main-%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AB%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E5%BC%95%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%99)

### 4. OS environment variables（ＯＳの環境変数）

```shell-session
$ export MYAPP_LDAP_PORT=10389
```

これは```--myapp.ldap.port=10389```と同じ設定になります。

大文字のスネークケース(_区切り)にすればいいということですね。

### 6,7 application.yml

properties形式は使いにくいのでYAML形式が好きです。

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files

>1. A /config subdir of the current directory.
1. The current directory
1. A classpath /config package
1. The classpath root

自分的には、

1. ```src/main/resources/config```の下にapplication.yml というファイルを入れておいてパッケージングする→これをデフォルト値とする
2. 環境によって上書きしたいところは```${配布先のディレクトリ}/config/application.yml```に書く

というのがいい感じです。

#### プロファイル

本番環境の設定はこうだけど、ステージング環境ではこう、という環境レベルによる設定の違いってありますよね？
その場合には、

```
application.yml
application-staging.yml
application-production.yml
```

という感じでファイルを用意します。そして起動パラメータ```--spring.profiles.active=production```を指定するか、環境変数で```SPRING_PROFILES_ACTIVE=production```を指定すると、

1. application.ymlの値が適用される
2. それを上書きする形で application-production.yml の値が適用されます。

つまり、無印のapplication.ymlに環境によらない共通設定を書いておき、プロファイル毎に違うものは-profile名.ymlのファイルを用意するという使い方になります。

参考

* http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-profiles
ListBoxのMVVMを意識した使い方

#はじめに

　MVVMデザインパターンで`ListBox`を操作する場合、`ListBox`の`SelectedIndex`や`SelectedItem`を操作する事例が多いですが、ViewとViewModelの関係をもっと疎結合にし、簡潔に扱えないかなという事で上記２プロパティを使わない方法を紹介します。

　今回もMVVMフレームワークには[Livet](http://ugaya40.hateblo.jp/entry/Livet)を使います。

#View側のコード

```xml:MainWinodw.xaml
<Grid>
    <ListBox ItemsSource="{Binding PersonListView}" />
</Grid>
```

ItemsSourceを指定するだけです

#ViewModel側のコード
##選択された項目を得る
　ListBoxのバインドターゲットとしては、`ListCollectionView`型を指定します。`ListCollectionView`は、`System.Windows.Data`ネームスペースにあります。

Livetのスニペットである「lpropn」を利用して作成します。

```csharp:MainWindowViewModel.cs
#region PersonListView 個人一覧(ListBox)
private ListCollectionView _PersonListView ;
/// <summary>
/// 個人一覧(ListBox)
/// </summary>
public ListCollectionView PersonListView 
{
    get
    { return _PersonListView ; }
    set
    { 
        if (_PersonListView  == value)
            return;
        _PersonListView  = value;
        RaisePropertyChanged();
    }
}

/// <summary>
/// 個人リスト
/// </summary>
private List<string> PersonList;
#endregion
```

　ListCollectionViewはこれ自体にListBoxの中身のリストは含まれていません。リストの実体を並べ替えて表示したり、フィルターで絞ったりする事ができます。

　`PersonList`は`ListBox`に表示するリストの実体です。

　さて、コード部を以下のように実装します。肝の部分のみの説明なので、エラー処理、解放処理などは省略しています。

```csharp:MainWindowViewModel.cs
/// <summary>
/// 初期化
/// </summary>
public void Initialize()
{
    this.PersonList = new List<string>() 
    {
        "佐藤","高橋","渡辺","山本","小林"
    };

    this.PersonListView = new ListCollectionView(this.PersonList);
    this.PersonListView.CurrentChanged += PersonListView_CurrentChanged;
}

/// <summary>
/// リストの位置が変わった
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void PersonListView_CurrentChanged(object sender, EventArgs e)
{
    var lv = sender as ICollectionView;
    if (lv.CurrentPosition < 0)
    {
        System.Diagnostics.Trace.WriteLine("選択無し");
        return;
    }
    var name = lv.CurrentItem as string;
    System.Diagnostics.Trace.WriteLine(
        string.Format("CurrentChanged:位置={0},名前={1}",
        lv.CurrentPosition,
        name));
}
```

　`Initalize()`の中で、`PersonList`を初期化した後、`ListCollectionView`を作成し、`PersonList`を渡しています。
　その後、`PersonListView`の`CurrentChanged`にイベントハンドラを設定しています。
　`ListBox`へバインドを行うと、リストボックスから発生するIndexの変更がこのハンドラへ伝わります。
　`CurrentChanged`イベントのライフ管理を十分に行えば、`ListCollectionView`を使った方が楽だと思います。

##ViewModel側から項目を選択する
　ViewModel側からの項目選択は簡単です。

```csharp
this.PersonListView.MoveCurrentToPosition(index);
```
indexは先頭を０とした番号です
またこのようにインスタンスを指定した設定ができます。

```csharp
var item = this.PersonList[2];
this.PersonListView.MoveCurrentTo(item);
```
他にも有用なメソッドで移動ができます。
[ICollectionView](https://msdn.microsoft.com/ja-jp/library/system.componentmodel.icollectionview) のメソッドを調べてみて下さい。

#さいごに
　使う上での注意事項として、ViewModel側で`ListCollectionView`のインスタンスを作成した直後は`CurrentPosition`が-1ですが、`ListBox`へバインドすると、自動的に`CurrentPosition`が0(先頭に位置付く)になります。
　UnitTestではこの動作を分かってないと、少し痛い目に遭います(笑)。
　同時に、イベントハンドラのライフ管理さえしっかりと行えば、かなり使い物になると思います。
Effective Spray - Best way to arrange your routes

[Spray](http://spray.io/) is an elegant Framework in many ways. Here is my opinion on how to arrange your controllers(actions) in your projects, so that you can easily maintain them and test them.

***Project structure***

![UserService_scala_-__badboy-api__-_badboy-api_-____Documents_projects_badboy-api_.png](https://qiita-image-store.s3.amazonaws.com/0/39824/109076a7-1c37-5c0c-0ee9-c40d034c86ef.png)


***Controllers***

You will find that I didn't use `class` to extend `Actor`. I only use `trait` in these files.

```scala:PreferenceService.scala
package com.yours.services

import spray.routing._
import spray.http._

trait PreferenceService extends HttpService {
  val preferenceRoute =
    path("prefer") {
      get {
        complete("ok")
      }
    }
}
```

```scala:FeedService.scala
package com.yours.services

import spray.routing._
import spray.http._

trait PreferenceService extends HttpService {
  val preferenceRoute =
    path("prefer") {
      get {
        complete("ok")
      }
    }
}
```

***Routes***

Here is your **route actor**, which will combine all the controller traits.

```scala:Routes.scala
package com.yours

import akka.actor.{ActorRefFactory, Actor}
import com.yours.services.{UserService, FeedService, PreferenceService}

/**
 * Created by visualskyrim on 12/25/14.
 */
class RoutesActor extends Actor with Routes {
  override val actorRefFactory: ActorRefFactory = context
  def receive = runRoute(routes)
}

trait Routes extends UserService with FeedService with PreferenceService {
  val routes = {
    userRoute ~
    feedRoute ~
    preferenceRoute
  }
}
```

***Boot***

This part is like `Global` in Play framework, used to start your application. We launch our route actor here.

```scala
import akka.actor.{ActorSystem, Props}
import akka.io.IO
import com.yours.utils.db.DbSupport
import com.yours.RoutesActor
import spray.can.Http
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.duration._

import com.yours.utils.DynamodbSupport

object Boot extends App with DbSupport with DynamodbSupport {
  implicit val system = ActorSystem("your-api")

  val service = system.actorOf(Props[RoutesActor], "your-service")

  implicit val timeout = Timeout(5.seconds)
  IO(Http) ? Http.Bind(service, interface = "localhost", port = 8080)
  // initialize the helpers
  // initialize the Db
  initTables()
  initDynamoDbTables()
}
```

# Benefits

I believe this arrangement fits most cases. 

- Most people would like request handler to be separated in several files, grouping the controllers according to the related features. If people want to change anything or add anything, they can easily locate the place.
- It's clean. There will be no association with the Akka system in the middle of your real logic.
- You might have noticed that since we use trait to build controllers, we can test our controllers without getting hands dirty with Akka.
drush 6.5.0 (stable)でdrupal-7.34がインストールできない


drush-6.5.0(stable) で `drush core-quick-drupal` すると下記のエラー：

```console
root@cca7fedb262d:/# drush core-quick-drupal --use-existing --root=app --db-url=mysql://drupal@mysql/drupal --db-prefix=drupal_ --yes
You are about to create a sites/default/files directory and DROP all tables in your 'drupal' database. Do you want to continue? (y/n): y
No tables to drop.                                                                                                                                   [ok]
require_once(app/includes/install.core.inc): failed to open stream: No such file or directory site_install.inc:11                                    [warning]
PHP Fatal error:  require_once(): Failed opening required 'app/includes/install.core.inc' (include_path='.:/usr/share/php:/usr/share/pear') in /root/.composer/vendor/drush/drush/commands/core/drupal/site_install.inc on line 11
Drush command terminated abnormally due to an unrecoverable error.                                                                                   [error]
Error: require_once(): Failed opening required 'app/includes/install.core.inc' (include_path='.:/usr/share/php:/usr/share/pear') in
/root/.composer/vendor/drush/drush/commands/core/drupal/site_install.inc, line 11
```

このあたりが関係してそう：

- [Drush 7 fails UP command on D7 site- ?PEAR or D7 core problem · Issue #827 · drush-ops/drush](https://github.com/drush-ops/drush/issues/827)
- [Fix drush updb for Drupal 7. by luizsgpetri · Pull Request #839 · drush-ops/drush](https://github.com/drush-ops/drush/pull/839)


で、6.xでは対処されていないと思って7.0-devを使ったところ、上手くいった。
Swiftでif文を使った制御文の作成

xcode初心者です。

Swiftでif文を使った質問です。

0時から5時だったら早朝
6時から10時だったら朝
11時から14時だったらお昼

みたいなコードはどのように書いたらよいでしょうか？

プログラミングスクールのまとめ
http://kojima1992.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0_%E3%82%B9%E3%82%AF%E3%83%BC%E3%83%AB_%E6%9D%B1%E4%BA%AC
Sonic PiをUbuntu上でビルドして動かす

## はじめに
Ubuntu上で[Sonic Pi](http://sonic-pi.net)をビルドして動作させる機会があったので、自分用メモを残しておきます。

## 手順
以下、Ubuntu14.04での手順です。

https://github.com/samaaron/sonic-pi/blob/master/INSTALL.md#generic-linux
にあるとおりですが、バージョンが異なったりします。

	$ apt-get install supercollider
	$ apt-get install ruby
	$ apt-get install libqscintilla2-11
	$ apt-get install libqscintilla2-dev
	$ apt-get install qt4-dev-tools
	$ apt-get install ruby-dev
	$ apt-get install cmake
	$ apt-get install libffi-dev
	$ apt-get install libqscintilla2-l10n
	$ apt-get install qt4-qmake
	$ apt-get install libqt4-dev
	$ git clone https://github.com/samaaron/sonic-pi.git
	$ cd sonic-pi/app/server/bin
	$ ./compile-extensions.rb
	$ cd ../../gui/qt
	$ ./rp-build-app

で、そのまま

	$ ./rp-app-bin

で起動します。

## 追記(2015/10/26)
久々にVirtualBox上のUbuntu14.04で新規に環境を作ってみたのですが、音が出なくてハマりました。。

https://gist.github.com/jcieslar/f10995a0c226241f4022
にあるように、

	$ ./rp-app-bin

で起動する前に、

	$ jackd -r -d alsa -r 4558 -P

が必要でした。

## その他
[OS X](https://github.com/samaaron/sonic-pi/blob/master/INSTALL.md#mac-os-x)でも基本的には同じなのですが、手順が煩雑そうだったのでこちらを試してみました。(単に[QTDockWidgetの動作を確認したかった](https://github.com/kn1kn1/sonic-pi/commit/e36b200c2c77fb70d0b8b40c14df0a239a3f9628)ので楽をしたかったというのが本当のところです。。)
RDSと外部MySQL(master, slave)の接続可能バージョンまとめ


##概要

下記のようなツールを作っているときなどに、RDSと外部MySQLを接続する際のRDS側の対応バージョンを確認したい時がある。

[RDS用のお手軽mysqldumpを検討した](http://qiita.com/kentaost/items/2470819889d1a618d995)

いつも忘れてしまうのでAWSドキュメントを元に自分メモを作った。

##接続可能バージョンまとめ

###マスタ(外部MySQL) → スレーブ(RDS)
* スレーブ(RDS) : MySQL 5.5 バージョン 5.5.33 以降または MySQL 5.6 バージョン 5.6.13 以降

http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html


###マスタ(RDS) → スレーブ(外部MySQL)
* マスタ(RDS) :  MySQL 5.6.13 以降
* スレーブ(外部MySQL) : Amazon RDS インスタンスと同じバージョン以上

http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.Procedural.Exporting.NonRDSRepl.html
Karabinerで多機能ランチャーを実現する

- ものすごい勘違いをしていたので全面的に書き直しました。
- 以前はAlfred Workflowで無理やり実現していました。

## 動機
* Karabinerの`__SimultaneousKeyPresses__`素晴らしい
    * アルファベットキーの同時押しとかを他のキーコンビネーションにリマップできる
    * いっぱい作れるし語呂合わせとかで覚えやすい
    * ホットキー枯渇問題への強力な回答！
* これをアプリ起動のショートカットとして利用したい

## ドキュメントは読もう（戒め）
- [Karabiner - OS X用のソフトウェア](https://pqrs.org/osx/karabiner/xml.html.ja#vkopenurldef)

全部ここに書いてあるけどいちおう解説します。

## 概要
Karabinerは基本的にはキーリマップアプリですが、private.xmlでvkopenurldef要素を記述することにより、**追加のKeyCodeを定義することができます。**

KeyCodeの実行結果としては、以下のものを定義することができます。

- URLを開く
- ファイルを開く
- **シェルスクリプトを実行する**

つまり、ほぼなんでもできると言ってよいです。これにキーコンビネーションを割り当てることで、複雑な処理をホットキー一発で実行できます。

## アプリケーションをトグルするAppleScriptを用意する
アプリケーションランチャとして利用するために、汎用的なランチャースクリプトを用意しておきます。

```~/bin/osascript/toggleapp.scpt
on run argv
	set appName to (first item of argv)

	set appID to bundle identifier of (info for (path to application appName))
	tell application "System Events"
		if not (exists process appName) then
			tell application appID to activate
		else
			if frontmost of process appName then
				set visible of process appName to false
			else
				set frontmost of process appName to true
			end if
		end if
	end tell
end run
```

* [Quick tip: AppleScript application toggle - BrettTerpstra.com](http://brettterpstra.com/2011/01/22/quick-tip-applescript-application-toggle/)

## private.xmlの例
itemの子要素として、vkopenurldef要素と、それに対応するautogen要素を記述します。

```private.xml
<?xml version="1.0"?>
<root>
  <item>
    <name>launcher</name>
    <identifier>karabiner_launcher</identifier>
    <vkopenurldef>
      <name>KeyCode::VK_OPEN_URL_SHELL.toggle.Finder</name>
      <url type="shell">
        <![CDATA[ osascript ~/bin/osascript/toggleapp.scpt Finder ]]>
      </url>
    </vkopenurldef>
    <vkopenurldef>
      <name>KeyCode::VK_OPEN_URL_SHELL.toggle.System_Preferences</name>
      <url type="shell">
        <![CDATA[ osascript ~/bin/osascript/toggleapp.scpt "System Preferences" ]]>
      </url>
    </vkopenurldef>
    <vkopenurldef>
      <name>KeyCode::VK_OPEN_URL_SHELL.todotxt</name>
      <url type="shell">
        <![CDATA[ osascript ~/bin/osascript/togglefile.scpt TaskPaper /Users/catfist/Dropbox/todo/todo.txt ]]>
      </url>
    </vkopenurldef>
    <autogen>
    <autogen>
    <!-- finder -->
      __SimultaneousKeyPresses__
      KeyCode::F, KeyCode::D,
      KeyCode::VK_OPEN_URL_SHELL.toggle.Finder,
      Option::SIMULTANEOUSKEYPRESSES_STRICT_KEY_ORDER
    </autogen>
    <autogen>
    <!-- System Preferences -->
      __SimultaneousKeyPresses__
      KeyCode::S, KeyCode::P,
      KeyCode::VK_OPEN_URL_SHELL.toggle.System_Preferences,
      Option::SIMULTANEOUSKEYPRESSES_STRICT_KEY_ORDER
    </autogen>
    <autogen>
  </item>
</root>
```

この場合、例えば、「sを押しながらpを押す」ことで、システム環境設定をトグルすることができます。

もちろん、AppleScriptの内容を全部private.xmlに書いてもよいです。

## 謝辞
コメントいただいたrinopoさん、ありがとうございました。
Golang Getter Setterの自動作成　Web

Golang で type structから Setter Getterの自動作成するWEB サイトを作りました。今の所、gofmt した状態のtype コマンドを上にいれてボタンを押すと下に自動作成されます。

https://mikego.herokuapp.com/go

![gotuil.jpg](https://qiita-image-store.s3.amazonaws.com/0/20387/70a56c69-4447-4cea-7919-4d881f7289fb.jpeg)