OmniAICreator/Qiita-1.07M huggingface dataset:
Backbone.Viewの中だけで使えるスタイルを定義する

## モダンCSS設計というけれど

OOCSSとか、SMACSSとか、BEMとか。最近、モダンCSS設計ってのを見かけるんだけど、何か苦労してるなぁ、って感じる。
これらって命名規則にすぎないから、結局、運用次第ってことになる。プロジェクトメンバーが少人数ならいいだろうけど、人数が増えると結構簡単に破綻するんじゃないだろうか？
まぁ、CSSが貧弱すぎるのがいけないよね。

Bootstrapを使ってると、ふと疑問に思うことがある。
例えば「pull-right」。右に寄せるって、デザインじゃないの？
HTMLで構造を表してCSSでデザインする、とか言ってたと思うんだけど、どこに行ったんだろう？
まぁ、CSSが貧弱すぎるのがいけないよね。

でも、CSSだけで頑張りすぎているような気もするんだよね。
どうせテンプレートを使うんだから、もっと組み合わせて使うことを考えたらいいんじゃないだろうか？

Bootstrapは、テンプレートにクラスを指定すれば、ある程度のデザインができるのは楽なんだけど、デザインを修正するたびにHTMLとCSSの両方をいじっていることに気がついた。

これなら下手にCSSなんて独自に定義しないで、テンプレートにstyleで書き込んじゃうほうがいいんじゃないだろうか？

## Backbone.Viewの中だけで使えるスタイルを定義する

Backbone.jsを使ってるんだけど、Viewの中でだけ使えるスタイルが定義できたらいいんじゃないだろうか？

というわけで、まずjQueryのプラグインを作ってみた。

[applyStyles](https://github.com/fintopo/applyStyles)

これを使うと、

```
<div id="demo">
  <img src="picture.jpg" class="picture">
  <div class="body">
    <div class="header">
      header
    </div>
    <div class="memo">
      memo
    </div>
  </div>
</div>
```

こんなHTMLに対して、

```
$('#demo').applyStyles({
  classes: ['media', 'clearfix']
  ,sections: [{
    'name': '.picture'
    ,'classes': ['pull-right']
    ,'styles': {
      'width': '200px'
    }
  },{
    'name': '.body'
    ,'classes': ['media-body']
    ,'styles': {
      'width': '500px'
    }
    ,'sections': [{
      'name': '.header'
      ,'classes': ['media-heading', 'h4']
      ,'styles': {
        'color': 'white'
        ,'background-color': 'rgb(103, 88, 195)'
        ,'width': '100%'
      }
    }]
  }]
});
```

こんな適用をすると

```
<div id="demo" class="media clearfix">
  <img src="picture.jpg" class="picture pull-right" style="width: 200px;">
	<div class="body media-body" style="width: 500px;">
	  <div class="header media-heading h4" style="color: white; width: 100%; background-color: rgb(103, 88, 195);">
		  header
    </div>
    <div class="memo">
      memo
    </div>
  </div>
</div>
```

こんなふうになる。

これを、Backbone.Viewの中で使う。

```
var view = Marionette.ItemView.extend({
  styles: {
    ...
  }
  ,onRender: function(){
    this.$el.applyStyles(this.styles);
  }
});
```

（Backboneといいつつ、Marionette.js使ってますが・・・）

これで、Viewの中だけでスタイルを定義できるようになった。

クラスも追加できるようにしてあるので、Bootstrapのようなライブラリと併用して使うことができる。
このあたりがちゃんと作りこんであれば、アプリケーション個別で定義するCSSは減るんじゃないだろうか？
CSSの記述量が減れば、命名規則で頑張らなくても、あんまり破綻しないと思う。

結果的に、テンプレートでは構造だけを表現することになった。シンプルになっていいよね？

## 課題

メインの処理をjQueryのプラグインにしたのは、Backbone以外のフレームワークでも使えるだろうと思ったからなんだけど、サーバーサイドでHTMLを生成している場合は、表示してからスタイルを適用するまでにタイムラグができちゃって、あまりよろしくないかも。

Backbone.Viewを使う場合でも、renderする前にViewが表示されていると同じことになるなぁ。
Xcodeが異常に重い時の対処法

Xcodeの悪いところで、使っているうちにどんどんとログなどがたまり、重くなる傾向があります。	
私の場合は下記の方法で解決しましたので、参考まで。		
## 手順
1.まずログのディレクトリに移動します

```
cd ~/Library/Developer/Xcode/iOS Device Logs
```
2.一覧を見てみると、現在使用している6.1以外のログが沢山残っている。。しかもiOS Device Logs 5.1.1.dbサイズでかっ！

```
-rw-r--r--  1 hoge-user  hoge-group  90112  9 22 10:52 iOS Device Logs 6.0.1.db
-rw-r--r--  1 hoge-user  hoge-group  32768 10 22 16:54 iOS Device Logs 6.0.1.db-shm
-rw-r--r--  1 hoge-user  hoge-group      0  9 22 10:52 iOS Device Logs 6.0.1.db-wal
-rw-r--r--  1 hoge-user  hoge-group  90112  6  3 12:48 iOS Device Logs 6.0.db
-rw-r--r--  1 hoge-user  hoge-group  32768 10 23 16:08 iOS Device Logs 6.0.db-shm
-rw-r--r--  1 hoge-user  hoge-group      0  6  3 12:48 iOS Device Logs 6.0.db-wal
-rw-r--r--  1 hoge-user  hoge-group  90112 10 23 16:08 iOS Device Logs 6.1.db
-rw-r--r--  1 hoge-user  hoge-group  32768 11 18 15:49 iOS Device Logs 6.1.db-shm
-rw-r--r--  1 hoge-user  hoge-group      0 10 23 16:08 iOS Device Logs 6.1.db-wal
-rw-r--r--  1 hoge-user  hoge-group  60035072  8 20 14:59 iOS Device Logs 5.1.1.db
-rw-r--r--  1 hoge-user  hoge-group     32768  9 10 18:39 iOS Device Logs 5.1.1.db-shm
-rw-r--r--  1 hoge-user  hoge-group   1207192  9  4 13:00 iOS Device Logs 5.1.1.db-wal
-rw-r--r--  1 hoge-user  hoge-group     90112  4 10  2014 iOS Device Logs 5.1.db
-rw-r--r--  1 hoge-user  hoge-group     32768  6  3 12:48 iOS Device Logs 5.1.db-shm
-rw-r--r--  1 hoge-user  hoge-group         0  4 10  2014 iOS Device Logs 5.1.db-wal
```

3.とりあえず適当な場所に退避する(rmしてしまうと、問題があった時に困りますので)

```
mv iOS\ Device\ Logs\ 5.1.* ~/tmp
```

4.xcodeを再起動する

## 注意点
* ~/Library/Developer/Xcode/直下にDeveloperPortalのバージョンごとのファイルがあるけど、間違って触らないように。補完が効かなくなる。
* Xcodeは古いバージョン名のファイルがいくつかあるが、予想外に使っているものも存在する。。(5.1.1とか)
現在実行中のSQLクエリを殺す流れ


SQLでめちゃくちゃ時間がかかるクエリが走ってしまっていて問題が起こっている場合にとるべき対処。

本来は、問い合わせを行っているWebサーバー側で対応できれば良いが、DBサーバー側で対応の必要がある時。

## 1. pg_stat_activityを見る

現在実行中のクエリは`pg_stat_activity`テーブルが管理している

参考：

- http://www.postgresql.org/docs/9.4/static/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW
- http://lets.postgresql.jp/documents/technical/statistics/3


pg_stat_activityの中でも大事なのが、以下のフィールド

- pid: プロセスのID。殺す時に指定する。
- query_start: SQLクエリを実行し始めた時間。
- query: 実行しているSQLクエリ。長いことも多々あるので適当に最初の方だけ見ている。
- state: 実行状態。activeでないものは何らかの理由で待っているだけなので、殺すべき対象にならないはず。

これらを元に以下のようなクエリで問い合わせる。

```sql
SELECT pid, query_start, substr(query, 0, 50) FROM pg_stat_activity WHERE state='active' ORDER BY query_start;
```

```bash:sql_result
  pid  |          query_start          |                      substr                       
-------+-------------------------------+---------------------------------------------------- 
   847 | 2014-09-09 05:45:21.225616+00 | UPDATE "delayed_jobs" SET locked_at = '2014-01-09'
   850 | 2014-09-09 05:45:17.664716+00 | UPDATE "delayed_jobs" SET locked_at = '2014-09-09'
```

他にも、`datname`, `usename`, `application_name`, `client_hostname`, `backend_start`, `state_change`, `waiting` などが必要な状況があるかも知れないけれど、ミニマムではこのクエリがいい気がする。

## 2. pidから実行中のクエリを殺す

殺したいクエリのpidさえ分かれば、以下のクエリでプロセスを殺すことが出来る

```
SELECT pg_cancel_backend(847);
```

これは SIGINT にあたる。

これでも死なない場合は、

```
SELECT pg_terminate_backend(847);
```

を使えば、 SIGTERM に相当するので死ぬはず。

これを実行した際に起こることには責任は持てないので、使うときは自己責任で。


### おまけ：大量に殺したい時

同じようなクエリが複数発生していることもあるので、

```sql
SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE substr(query, 0, 50) = 'hogehoge'
```

といようにすれば条件にマッチするもの全てを殺すことが出来る。
Ubuntu に node.js インストールしたのに command not found: node と言われて困ったときの対応方法  ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

久しぶりに、Ubuntu14.4にNode.jsインストールしたのに、command not found :scream: と言われて :sweat: 焦ったのでメモ :sweat_drops: 

# 解消方法

インストールした後

```
sudo apt-get install nodejs
nodejs -v
```

シンボリックリンクをつくります

```
sudo ln -s /usr/bin/nodejs /usr/bin/node
```

# なんで node が command not found なの？

## apt-get install node は駄目

apt-get でインストールできる node っぽいものに

nodejs
node

というのがあったりします :confused: で、この node というのは別の何かで、node.js とは関係無し。これが /usr/bin/node にインストールされるようです。

## update-alternatives というのもあるらしい・・・

```
sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
```

と言うやり方もあるらしいのですが :smile: 試していないので、、、参考リンクはります :+1: 

### 参考リンク

http://stackoverflow.com/questions/18130164/nodejs-vs-node-on-ubuntu-12-04
DHCP超概要！カフェのWi−Fiに接続時に何が起きているか

カフェで提供されているWi-Fiや、ホテルのLANケーブルに接続すると、インターネットに接続できるようになります。これらネットワークに接続した際に、ローカルマシンでは何が起こっているのかを考えてみました。

# 前提として

* カフェやホテルはプロバイダを通じてインターネットに接続しています。
* カフェやホテルのルーターから、お客用のLAN接続が提供されています。

# ネットワークに接続すると何が起こるのか

* ネットワークに接続していない状態ではIPも割り当てられておらず、またデフォルトゲートウェイの設定がないため、ローカルネットワーク外（＝つまりインターネットも含む）にリクエストを送ることができません。
* そのためまず、ローカルマシン（DHCPクライアント）は、DHCPサーバへIP割り当てのリクエストを送ります。
* ただしDHCPサーバのアドレスは分からないため、ブロードキャスト（255.255.255.255）で、UDPのポート番号が67番に向けてリクエストが送られます。
※255.255.255.255 は自分の属するネットワーク帯がなんなのか全くわかってない場合に利用するブロードキャストアドレス
* DHCPサーバはリクエストを受け取ったら、送信元のMACアドレスへ割り当てるIPを伝えます。
* ローカルマシンは割り当てられたIPを元に、IPの設定を行います（ここの詳細は省略します。詳細は http://itpro.nikkeibp.co.jp/members/NNW/NETPOINT/20041116/152622/ 参照）

# DHCPサーバが管理しクライアントへ伝える情報

* DHCPサーバがクライアントへ伝える情報は、割り当てるIPだけではありません。
* サブネット・マスクの値、デフォルトゲートウエイやDNSサーバーのIPアドレスも伝えます。
* その他にも、Webサーバー、メールサーバー、時刻サーバー、プリント（LPR）・サーバーなどのIPアドレス情報もDHCPでやりとりでき、その数は実に70種類以上あります。
* クライアントは最初にブロードキャストする際に、どんな情報がほしいかを明記し、DHCPサーバーはこの情報を基に自分が答えられるものだけを返答することになります。
* 引用元:  http://itpro.nikkeibp.co.jp/members/NNW/NETPOINT/20041116/152624/
背景レイヤーのみ透過させる方法

ちょっと目からウロコ。
へぇ～ってなったのでメモメモ。

```html
<div class="box">
  <img src="xxx.jpg">
  <span>テキスト文字列テキスト文字列</span>
</div>
```

背景を透過させたいので、div要素にclassをつけて、opacityを設定します。

```css
.box {
    background-color: #000;
    color: #fff;
    opacity: 0.8;
}
```

この方法だと、img要素や文字列も透過してしまうのでNG。
div要素だけ透過させたいので、下記の記述を行います。

```css
.box {
    background-color: #000;
    color: #fff;
    background-color:rgba(0,0,0,0.8); /* backgroundでalpha設定(4番目の引数) */
}
```

こんなにシンプルにできるのに知らなかった。
おしゃれサイトは透過したがるからなぁ～。

うぐぐ、IE8以下は効かないので、下記設定を追加。

```css
filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#99ffffff,EndColorStr=#99ffffff); /*IE8以下用*/
```
Flashを使ったアップローダ等でFirefoxだけ401になるときのとりあえず回避方法

俺様用メモ

##不具合発生条件
* ブラウザがFirefox
* 管理画面等のBasicまたはDigest認証内
* アップローダがFlash製

以上の条件が揃ったとき、ファイルをアップロードしようとするとFlashが認証を通らずに401(Unauthorized)でアップロードできない。わかりやすく言えば古いTinyMCEを使っているサイト等

###参考
flashによるファイルアップロードと認証に関するジレンマ - hanai
http://blog.s2factory.co.jp/hanai/2008/08/fileupload-from-flash-with-auth.html

##対処方法
そのままTinyMCEを例にすると、とりあえずの対処として

```lang:.htaccess
Satisfy Any
```
と、1行のみを書いた.htaccessを作り、TinyMCEが入ってるディレクトリに放り込む。
そのディレクトリ以下の認証が不要になるので、アップロードできるようになる。

※セキュリティ的にはアレかもしれないので自己責任で。
timestamp with time zone型はタイムゾーン情報を持っていない

絶対時刻と概念時刻
--
2015年1月1日00:00:00 という時刻表記は、地球上のどこで読んだかによって意味が変わってしまいます。このような時刻のことを **概念時刻** と呼ぶことにしましょう。ボジョレー・ヌーボーの解禁時刻、11月第3木曜日00:00:00も概念時刻だからこそ世界各地で解禁時刻が違い、バブル期は日本が世界で最初に解禁されるって盛り上がったものです。

2015年1月1日00:00:00（日本時間）、これなら **絶対時刻** です。世界のどこで読もうと、ある一瞬を意味します。これは2014年12月31日15:00:00（グリニッジ時間）と同じ瞬間を表しており、前者と後者は同じ瞬間の別表記に過ぎません。

timestamp with time zone
--
OracleおよびPostgreSQLの`timestamp with time zone`型が格納する値はその名前に反し、絶対時刻です。 **タイムゾーン情報はまったく含まれていません。**
具体的には、マシンのタイムゾーン設定に関わらず必ずUTCで格納されます。
文字列、例えば'2015-01-01 00:00:00'を`timestamp with time zone`にキャストしようとすると、

1. まずローカル時刻で解釈されます。 ⇒ 2015年1月1日00:00:00（日本時間）
2. UTCベースで格納されます。 ⇒ 2014年12月31日15:00:00（グリニッジ時間）

これを文字列にキャストしようとすると、'2015-01-01 00:00:00+09' のようにローカルタイムゾーン表記で文字列化してくれます。

日時を絶対時刻で扱うのはアプリケーション側の処理系と相性が良いはずです。例えばJavaの`Date`型やそのサブクラスたちは絶対時刻を格納するデータ型です。

DB設計時、日時の格納には基本的に`timestamp with time zone`型を使ってください。概念時刻を格納する`timestamp [ without time zone ]`を使う機会はボジョレー・ヌーボーの解禁時刻くらいしかないはず。

MySQLでは
--
`TIMESTAMP`型が絶対時刻を格納し、`DATETIME`型が概念時刻を格納します。こいつらは精度も範囲も違うのですが。

SQL Serverでは
--
`datetime`型や`datetime2`型が概念時刻を格納し、`datetimeoffset`型が、なんと概念時刻＋タイムゾーンを格納します。
ネットワーク接続にデフォルトゲートウェイの設定が必要な理由

マシンをネットワークに接続する際、あまり理解せずに行っていた「デフォルトゲートウェイ」の設定。どういった役割を担っているのか、なぜ必要なのかを調べ直してみました。

# デフォルトゲートウェイについて理解していたこと

* 異なるネットワーク間の出入口だということ（＝ルーター）。
* ネットワークにマシンを接続する際には、デフォルトゲートウェイを指定しないと異なるネットワークへのデータ転送が行えないということ。

以上

# デフォルトゲートウェイの設定はなぜ必要か

* そもそも異なるマシンへデータ転送を（ブロードキャストではなくマシンを指定して）行う際には、相手先のMACアドレスを知る必要がある。
* MACアドレスを知るには、ARP（アープ）というプロトコルを利用する。
* ARPはブロードキャスト方式のプロトコル
* しかしルーターはブロードキャストを他ネットワークへ送り出さない（送り出したら衝突が頻発してしまう）。
* そこで、ルーターにARPをプロキシで実行させる。
* 各マシンは、ARPのプロキシを行ってもらうマシンをデフォルトゲートウェイに指定する。

# Tips

* デフォルトゲートウェイ（ルーター）のIPアドレスは第4オクテットを1とすることが多い。これはTCP/IPの仕様では無いようだが、事実上のスタンダートとなっている（と思われる）。
【Git】Git入門〜初級者紹介編〜


## Gitの公式サイト
http://git-scm.com/


## 参考サイト
サルでもわかるGit入門
http://www.backlog.jp/git-guide/


## Gitとは何か
* バージョン管理ツール
* チーム開発のためのツール


## Gitを便利に使うためのツール

### SourceTree
Gitのコミット履歴や、コミット毎のファイル差分などをビジュアルでわかりやすく見ることができるツール。
また、add, commit, pushなどの基本的な操作もこちらで行うことができる。
ただ、エンジニアはコマンドラインでgitの操作ができる方が良いため、コマンドラインでの操作に慣れることを推奨します！
（デザイナー、コーダーであれば、SourceTreeから操作する人も多いです。そのため基本的な操作を知っておくと、デザイナーさんに使い方を聞かれた時とかにどや顔できます）

### SourceTreeの公式サイト

https://www.atlassian.com/ja/software/sourcetree/overview


## Gitの基本的な操作

### ディレクトリをGit管理対象ディレクトリとして初期化

	$ git init
	Initialized empty Git repository in [管理対象ディレクトリのPATH]/.git/

### ファイルをGit管理対象としてステージング

	$ git add [ファイル名]		# 指定したファイルを管理対象としてステージングへ

or

	$ git add .				# 現在のディレクトリ以下の全ての新規・変更ファイルをステージングへ

### ステージングされているファイルをコミット

	$ git commit				# デフォルトで指定されているエディタが開き、コミットメッセージを入力してコミット

or 

	$ git commit -m "コミットメッセージ"	# コミットメッセージとともにコミット


### gitディレクトリの状態を確認

	$ git status		# gitのディレクトリの状態を確認

#### きれいな状態の時のgit status表示例

	$ git status
	On branch master
	nothing to commit, working directory clean

#### ファイル変更がある時のgit status表示例

	$ git status
	On branch master
	Changes not staged for commit:
	  (use "git add <file>..." to update what will be committed)
	  (use "git checkout -- <file>..." to discard changes in working directory)
	
		modified:   readme.txt
	
	no changes added to commit (use "git add" and/or "git commit -a")


#### ステージングされたファイルがある時のgit status表示例

	$ git status
	On branch master
	Changes to be committed:
	  (use "git reset HEAD <file>..." to unstage)
	
		modified:   readme.txt
Pivotal Trackerとgithub

タスク管理としてpivotal trackerを、ソース管理としてgithubを使う方は結構いるのではないでしょうか？私はpivotal trackerは個人で使っています（勉強のために）。でgithubは仕事とプライベート両方で使っています。githubに関しては今ではなくてはならないツールになったと思います（最近はAttackを受けているようで、暫し困ることがあります。githubを攻撃しないでくれーという気持ちです。

さて、前置きが長くなりましたが、この二つの連携について時々忘れてしまうので、改めてこちらに整理しようと思います。個人的な覚え書きレベルです。

##pivotal trackerの設定
githubでソースを管理しているアプリケーションに相当するプロジェクトを作成します。
続いて、右上のアカウント名をクリックするとメニュープルダウンで表示されるので、その中に表示されている[Profile]をクリックします。

![pivotal_tracker01.png](https://qiita-image-store.s3.amazonaws.com/0/1686/cdc6a223-44bd-d3dc-3434-39c089e600b9.png)

で、そこのページの一番したに[API TOKEN]って表示されているので、そこで[CREATE NEW TOKEN]をクリックしてTOKENを発行します。このTOKENをコピーしておきます。

![api_token.png](https://qiita-image-store.s3.amazonaws.com/0/1686/761b078e-2d28-f5c8-3c9a-8843f1f06535.png)


##githubの設定
githubはまず連携したいgithubのリポジトリページにいきます。そこの右端の「setting」の欄をクリックします

![githubの画像1.png](https://qiita-image-store.s3.amazonaws.com/0/1686/517f8791-0efb-9102-e10f-070014f403be.png)

遷移したら[Webhooks & Services]をクリックします。次にServicesの中の[Add service]をクリックして追加する連携サービスを選択します。今回の場合はPivotal Trackerです。
追加すると下の画像のように連携サービスとしてPivotal Trackerが追加されます。

![githubの画像2.png](https://qiita-image-store.s3.amazonaws.com/0/1686/2e1a26d2-152c-b680-397a-84cf846251e5.png)

後は設定ページで先ほどコピーしたTOEKNを貼付ければ準備が完了です。

![github_token.png](https://qiita-image-store.s3.amazonaws.com/0/1686/fd61fd5a-281c-5c0f-5882-956b04a166be.png)


##連携してみる
では、コミットしてみましょう。コミットするときにPivotal Trackerのに追加したタスクのIDを「#」を先頭につけております。するとremoteにpushしたタイミングでPivotal TrackerのタスクIDのActivityにコミットされたことが記録されます。

![pivatal_trackerの画像.png](https://qiita-image-store.s3.amazonaws.com/0/1686/35776126-c273-b25c-b95e-e3ed9027d9b8.png)

##それ以外の連携
後最近ではSlackとgithub、travisCIとの連携、後はbotも入れてます。個人プロジェクトでの話ですが、一人で色々試してます。
その辺りについてもまた忘れないように記録しておこうと思っています。
bundle commond not foundの解決方法

##前提条件
Homebrew 0.9.5
rbenv 0.4.0
MacOS 10.10(Yosemite)
bundler 1.7.6
Ruby 2.1.5

## bundle installしたらbundle command not foundに

解決方法
$ vim ~/.bash_profile

```bash:.bash_profile

# bundlerのパスを通すため↲
path=(↲
  /usr/local/{bin,sbin}↲
  /Users/user_name/.rbenv/versions/2.1.5/bin↲
  $path↲
)↲

```


これを保存して、もう一度
```
bundle install
```
すると実行できた

参考:[Bundlerのインストール時に、初めてgemをインストールするときに詰まったこと。](http://qiita.com/tokimari/items/51ac63a1fe244b819aea)
PythonのmultiprocessingでPool.close()してもプロセスが一時停止中のまま残ってメモリがどんどん増える問題


教えてください


##解決したいこと

下記のmainに適当な引数を与えて実行すると、プロセスがどんどん増えてメモリが逼迫するので、これを防ぎたいです。

```python
import multiprocessing

def score4abc(a,b):
  score = a,b
  return score

def wrapper_score4multi(args):
  return score4abc(*args)

def main(a,foo):
	for i in range(500):
		pool = multiprocessing.Pool(32)
		pool.map(wrapper_score4multi,[[a,b] for b in foo]#常に32個のプロセスがR状態となり、終了したプロセスはS状態のままとどまる
		pool.close()
```

##こんなことができるといいなあ
平たく言うと、pool.kill()みたいなノリのメソッドで残ってるプロセスをkillできるとかなりよい感じがします。



##補足情報

ps auxで調べたところ、下記のコードを実行中に並列処理しているプロセスが一時停止のままずっと残っていたので、それが原因なのではないかと思いました。
公式ドキュメントによると、Pool.terminate()で停止、Pool.close()で終了と書いてありますが、Pool.close()してもばっちり残っています。
詳細な事情は忘れましたが、並列処理したい関数に複数の引数を渡すためにはProcessは使えず、下記のようにpool.mapを利用しないと難しかったような気がします。
また、そのプロセスを特定してshellで1分ごとにkillしても、時間が経つとプロセスの数がすぐに元通りになります(ローレイヤすぎて自分では原因を特定できない)
上記は、Cythonでコンパイルして実行しています。
上記のmainの呼び出し元のpythonのバージョンは2.7.3です。
PlayでCORS対策

playframeworkで作成したREST APIを別オリジンから呼ぶ場合、CORS対策が必要になる。
参考：[Cross-origin resource sharing(wikipedia)](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing)

すごく簡単に言うとレスポンスヘッダに「Access-Control-Allow-Origin: *」を付加すれば良いわけだけど、
各メソッドでいちいちやるのもあれだし、Global.javaでインターセプトする。

```java:Global.java
import play.*;
import play.libs.F.Promise;
import play.mvc.Action;
import play.mvc.Http;
import play.mvc.SimpleResult;
import java.lang.reflect.Method;

public class Global extends GlobalSettings{

    // CORS対応
    private class ActionWrapper extends Action.Simple {
        public ActionWrapper(Action<?> action) {
            this.delegate = action;
        }

        @Override
        public Promise<SimpleResult> call(Http.Context ctx) throws Throwable {
            Promise<SimpleResult> result = this.delegate.call(ctx);
            Http.Response response = ctx.response();
            response.setHeader("Access-Control-Allow-Origin", "*");
            return result;
        }
    }

    @Override
    public Action<?> onRequest(Http.Request request, Method actionMethod) {
        return new ActionWrapper(super.onRequest(request, actionMethod));
    }
}
```

## 参考
http://stackoverflow.com/questions/22144788/enable-cors-in-java-play-framework-2-2-x

ほぼ丸コピさせていただきました。
Thanks StackOverflow
int to typeイディオムによるタグ生成の試み

int to type( I2T )イディオムをご存知の方は多いと思います。
知らない方は[こちら](http://ja.m.wikibooks.org/wiki/More_C%2B%2B_Idioms/整数から型(Int-To-Type))

I2Tイディオムとは、

```

template < int N >
struct int_to_type
{
  enum { value = N };
};

```

このような形のイディオムです。
少し発展して、、、

```

template < int N >
struct int_to_type
{
  enum { value = N };
  using type = int_to_type < N >;
  using next = int_to_type < N + 1 >;
  using prior = int_to_type < N - 1 >; // prevの方がいいかも？
};

```

このような形のものも紹介されています。
このnextやpriorで新しい型を生成する仕組みがタグディスパッチなんかの役に立つかなあとか思ったので少し考えてみました。

```

template < int N >
struct tag_group : int_to_type < N >{};
using tag_group_1 = tag_group < 1 >;
using tag_group_2 = tag_group_1::next;

```

名前がよろしくないせいで恩恵を感じにくいですが、タグの属するグループとそれぞれのタグから管理のしやすいタグの生成ができました。

いやいや。
tag_group_1::next は どう見ても
int_to_type < 2 > です。
tag_group < 2 > じゃないと困りますね。
これでは、グループ分けが消滅してusingで見かけ上だけ名前が違う同じ型になってしまいます。

これはよろしくない。
そこで、CRTPを盛り込んでみます。

```

template < int N,
  template < int > class Derived >
struct int_to_type
{
  enum { value = N };
  using type = Derived < N >;
  using next = Derived < N  + 1 >;
  using prior = Derived < N - 1 >;
};

template < int N >
struct tag_group : int_to_type < N, tag_group >{};
using tag_group_1 = tag_group < 1 >;
using tag_group_2 = tag_group_1::next;

```

これで望み通りの型が生成できますね。
これまでの使い方ができなくなりましたが、

```

template < int > struct dummy{};
template < int N  >
struct int_to_type < N, dummy < N > >
{
  enum { value = N };
  using type =  int_to_type < N, dummy < N > >;
  using next = int_to_type < N, dummy < N + 1 > >;
  using prior = int_to_type < N, dummy < N - 1 > >;
};

```

このような特殊化を作り、デフォルト引数にdummyを渡してやればこれまでと同じように使えます。

ううむ、なかなか面倒くさくなってきました。

もうひとつ欲を言えば、int型ではなくsize_t型を受け取りたい時がありますね。これはタグ生成というよりは、I2T本来の目的になります。

まあこれは引数をint型ではなく、std::integral_constant型で受け取ればいいだけなのでそんな難しくもないでしょう。


```

template < class integral,
  template < typename integral::type > class Derived >
struct int_to_type
{
  enum : typename integral::type { value = N };
  using type = Derived < integral::value >;
  using next = Derived < integral::value  + 1 >;
  using prior = Derived < integral::value - 1 >;
};

```

こんなもんですかね。
コンパイルしていませんが、思想的には間違ってないはず……。

また暇なときにまた考え直してみようとも思いますが、
もしかしなくてもこんなの作らんでグループごとに新しいのを定義したほうが……
かわった関数プロトタイプ宣言

C/C++系の「関数型」の変な使い方。
`typedef int F(int, int)`よりは`using F = int(int, int)`の方がマシ。

関数ポインタなら`typedef int (*PF)(int, int)`または`using PF = int(*)(int, int)`となる。

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

/* 2個のint型引数をとってint型を返す関数型 F を宣言 */
typedef int F(int, int);

/* F型の関数 add, sub の宣言 */
F add, sub;

int main()
{
  int x = 1, y = 2;
  /* 関数 add, sub の呼び出し */
  int r1 = add(x, y);
  int r2 = sub(x, y);
  printf("add(%d,%d)=%d\n", x, y, r1); /* 3 */
  printf("sub(%d,%d)=%d\n", x, y, r2); /* -1 */
}

/* 関数 add, sub の定義 */
int add(int x, int y) { return x + y; }
int sub(int x, int y) { return x - y; }
```

```cpp:sample.cpp
#include <cstdio>

// 2個のint型引数をとってint型を返す関数型 F を宣言
// （C++11で導入されたalias declaration構文）
using F = int(int, int);

// F型の関数 add, sub の宣言
F add, sub;

int main()
{
  int x = 1, y = 2;
  // 関数 add, sub の呼び出し
  int r1 = add(x, y);
  int r2 = sub(x, y);
  std::printf("add(%d,%d)=%d\n", x, y, r1); // 3
  std::printf("sub(%d,%d)=%d\n", x, y, r2); // -1
}

// 関数 add, sub の定義
int add(int x, int y) { return x + y; }
int sub(int x, int y) { return x - y; }
```
pepperめも_04:ペッパーで写真、動画、音声を撮ろう

#ペッパーのフォルダ構造
ペッパーで写真、動画、音声をとってみたのでまとめました！
※随時追記していきます
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/1fdaba72-a7db-e8a1-8195-6b732d829b01.png)

#写真(Take Picture)
カメラを使って、写真を取ることが出来ます。

##ファイルの保存先

```
cd /home/nao/recordings/cameras
```

##注意事項
1280x960にすると、画像が保存されません。(2014年11月18日現在）
![スクリーンショット 2014-11-18 12.34.16.png](https://qiita-image-store.s3.amazonaws.com/0/40994/3a024326-2edc-0696-adc5-94c05e7e0ef3.png)

#動画(Record Video)
カメラを使って、動画を取ることが出来ます。
音声は録音されません。
設定で、カメラの指定をしないとエラーになります。

##ファイルの保存先

```
cd /home/nao/recordings/cameras
```

##バグ：実行時エラー
(2014年11月18日現在）
実行時にエラーが出ます。

27行目の

```
if( videoRecorder and self.videoRecorder.isRecording() ):
```

を、

```
if( self.videoRecorder and self.videoRecorder.isRecording() ):
```

に変更することで動作します。

##バグ：Durationが効かない
(2014年11月18日現在）
![スクリーンショット 2014-11-18 12.39.36.png](https://qiita-image-store.s3.amazonaws.com/0/40994/e931b6a4-8b81-02b5-3dbc-0c8d27925099.png)
Waitがつながってないので、Duration(s)が機能していないようです。
プログラムを停止しないと、ずっと録画を続けるので注意してください。

#音声(Record Sound)
マイクを使って、音声を録音することが出来ます。

##ファイルの保存先

```
cd /tmp/
```

##注意事項
毎回、新しいフォルダに保存されるので、同じファイル名でも上書きされずに複数作成されます。

#おしまい
以上、ペッパーくんで、写真や動画、録音をする方法でした！
写真の画質が悪いのは嫌ですね・・・。1280x960に対応して欲しいです！

あと、動画に音声が入らないのも嫌ですね・・・。

保存先やファイル名固定など、あまり汎用的ではないので、
実際に使うときには、これらのボックスを参考に、オリジナルのソースを作る必要がありそうです。
PHPプログラマのためのRuby Tipsと逆引き

長年PHPとjavascriptの案件をこなしてた筆者が
ギークな若者たちとRoR環境で開発をするにあたり、
どうせ調べものするなら共有しようという意図と、
Qiitaの使い方の練習で作っている記事です。
(たまにPerlの知識も混ぜます。)


基本
===
###php
文末は;セミコロン

###ruby
そんなもんいらない

コメント
---
###php
単一行 //
複数行 ```/*
コメント
コメントコメント
*/```

###ruby
単一行 # (古いphpでも使えるし、apacheのconfとかシェルスクリプト、Perlでもおなじみ)
複数業
```=begin
コメント
コメントコメント
=end```
rubyでは複数行コメントでも行の途中までをコメントにする事ができないので気をつける。

変数
===
###php
$var_name

###ruby
var_name
$など要らん


###文字列連結
####php
```
"文字列" . "文字列"
```

####ruby
```
"文字列" + "文字列"
```
※ただし、暗黙の型変換が効かず、文字列に数値を+するとエラーになる。

変数のスコープなど
---


制御構造
===
###if文
####php
```
if(条件){
    処理
}else if(条件){
    処理
}else{
    処理
}
```
####ruby
```
if 条件 then
  処理
elsif 条件 then
  処理
else
  処理
end
```

###for文(foreach)
####php
```
for ($i=0;$i<10;$i++){
 処理
}

foreach ($array as $val){
 処理
}
```

####ruby
```
for i in 0..9
  処理
end

for 変数 in オブジェクト
  処理
end
```



rubyのdo はendで終わるので
シェルスクリプト書き慣れてるとdoneとかやりがち・・

ループ中の一段先送りは
phpはcontinue;でrubyはnextだが continue(2);に相当する物はみあたらない、
ループ中断のbreak;は共通


関数とかサブルーチンとか
===
rubyではphpのように関数やメソッドの戻り値を指定する際のreturnを省略できるため、
明示的に終わりが指定されておらず、他人のコードが若干追いにくい・・
####php
```
//引数なし
function 関数名 () {
    処理
}

//引数あり
function 関数名 (引数) {
    処理
}

//戻り値
function 関数名 (引数) {
    return 引数 + 1;
}
```

###ruby
```
 #引数なし
def 関数名
  処理 
end

 #引数あり
def 関数名(引数)
  処理 
end

 戻り値
def 関数名(引数)
  引数 + 1
end

```


記号の意味
===
rubyはやたらと記号が多くて困る


配列の操作
===
配列の宣言
---
###php
```$array = array($var1,1,"aaa");
```
###ruby
```nums = [1,2,3,4,5]
strs = ["aaa","b","hello ruby array"]```

newメソッドを使う場合
```arr = Array.new```
```fives = Array.new(5)``` 要素数5で初期化
```fives = Array.new(5,0)```5つの要素を0で初期化

なじみにくい表現 %w %i (他人のコードで出くわして調べました)
```%w(ruby perl python)
```文字列を空白で区切って配列化する(トーカナイズ)
これは ```$array = explode(" ","ruby perl pythone");```と実行した場合に近い
rubyだと```arr = "ruby perl python".split()```というやりかたも可能でこちらの方がphpプログラマなじみ安いでしょう。
他人に読みやすいコードを書く場合は省略記号をなるべく使わないことをおすすめします。
perlのqw/red blue black/ のような書き方を取り入れたせいかもしれない？

さらにPHPプログラマがファ？ってなる書式
```%i(ruby perl python)
 # => [:ruby :perl :python]
```シンボルの配列を作成する

rubyもphpのように配列の要素に数値と文字列を混ぜたり、オブジェクトを格納したりできます。

要素の取得
---
rubyもphpと同様に
```var = arr[0]```
のように要素を取得できます。

また、rubyではphpのarray_sliceを簡略した書き方で配列の一部を新たな配列として取得できます。
###ruby
```arr2 = arr1[0..2]```
```arr2 = arr1.slice(0..2)```
```arr2 = arr1.slice(0,3)```
###php
```$arr2 = array_slice($arr1,0,3);```

配列操作
---
unshiftやpop,concat,pushなどは存在
phpのunsetはrubyではdelete
配列を結合する際に、 +、+=も使える。


正規表現
===
rubyの正規表現の書式はむしろperlに似ている。
MacPorts + rbenv + bundlerでmysql2のインストールに失敗する

.bundle/configに以下を追記

```
BUNDLE_BUILD__MYSQL2: --with-mysql-config=/opt/local/lib/mysql56/bin/mysql_config
```

追記

こちらのほうが良い

http://qiita.com/kyanagimoto/items/6ee1e83ad3ed5bd4b238
ubuntuでユーザを追加する

useraddではなくてadduserを使おう。
(useraddではhomeディレクトリの下にユーザのディレクトリが作成されないので。)

\#adduser ユーザ名

また、
\#userdel -r ユーザ名
でユーザディレクトリごとユーザを消すことができる。

【参考】
http://masaoo.blogspot.jp/2009/08/ubuntu-adduser.html
nginxとlua-nginx-moduleのrpmパッケージを作成する

ビルド環境はCentOS6.6です


#####LuaJITをfedoraのリポジトリから持ってきてリビルドする
```
$ wget https://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/source/SRPMS/l/luajit-2.0.3-4.fc22.src.rpm
$ rpm -ivh luajit-2.0.3-4.fc22.src.rpm
$ rpmbuild -ba ~/rpmbuild/SPECS/luajit.spec
```

#####リビルドしたLuaJITをインストール
```
$ sudo yum localinstall ~/rpmbuild/RPMS/x86_64/luajit-2.0.3-4.el6.x86_64.rpm  ~/rpmbuild/RPMS/x86_64/luajit-devel-2.0.3-4.el6.x86_64.rpm
```

#####Nginxを公式リポジトリから持ってきてリビルドする
```
$ wget http://nginx.org/packages/centos/6/SRPMS/nginx-1.6.2-1.el6.ngx.src.rpm
$ rpm -ivh nginx-1.6.2-1.el6.ngx.src.rpm
```

#####lua-nginx-moduleとngx_devel_kitをダウンロードしてSOURCESディレクトリに配置
```
$ cd ~/rpmbuild/SOURCES/
$ wget -O lua-nginx-module-0.9.12.tar.gz https://github.com/openresty/lua-nginx-module/archive/v0.9.12.tar.gz
$ wget -O ngx_devel_kit-0.2.19.tar.gz https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
```

#####nginxのSPECファイルを下記のような感じで書き換える

```
@@ -42,12 +42,17 @@
 Requires(pre): pwdutils
 %endif

+%define lua_nginx_module_var 0.9.12
+%define ngx_devel_kit_var 0.2.19
+Requires: luajit
+BuildRequires: luajit-devel
+
 # end of distribution specific definitions

 Summary: High performance web server
 Name: nginx
 Version: 1.6.2
-Release: 1%{?dist}.ngx
+Release: 1%{?dist}.lua
 Vendor: nginx inc.
 URL: http://nginx.org/

@@ -61,6 +66,8 @@
 Source7: nginx.suse.init
 Source8: nginx.service
 Source9: nginx.upgrade.sh
+Source10: lua-nginx-module-%{lua_nginx_module_var}.tar.gz
+Source11: ngx_devel_kit-%{ngx_devel_kit_var}.tar.gz

 License: 2-clause BSD-like license

@@ -82,11 +89,13 @@
 Not stripped version of nginx built with the debugging log support.

 %prep
-%setup -q
+%setup -a 10 -a 11 -q

 %build
 ./configure \
         --prefix=%{_sysconfdir}/nginx \
+        --add-module=./lua-nginx-module-%{lua_nginx_module_var}/ \
+        --add-module=./ngx_devel_kit-%{ngx_devel_kit_var}/ \
         --sbin-path=%{_sbindir}/nginx \
         --conf-path=%{_sysconfdir}/nginx/nginx.conf \
         --error-log-path=%{_localstatedir}/log/nginx/error.log \
@@ -126,6 +135,8 @@
         %{_builddir}/%{name}-%{version}/objs/nginx.debug
 ./configure \
         --prefix=%{_sysconfdir}/nginx \
+        --add-module=./lua-nginx-module-%{lua_nginx_module_var}/ \
+        --add-module=./ngx_devel_kit-%{ngx_devel_kit_var}/ \
         --sbin-path=%{_sbindir}/nginx \
         --conf-path=%{_sysconfdir}/nginx/nginx.conf \
         --error-log-path=%{_localstatedir}/log/nginx/error.log \
```


#####リビルドする
```
$ sudo yum-builddep ~/rpmbuild/SPECS/nginx.spec
$ rpmbuild -ba ~/rpmbuild/SPECS/nginx.spec
```

完成かな？
まだ動かしてません！
次は動かしてみます
Joda-Timeを使っているコードで現在日時を任意の値に設定してテストする

日付操作をするためのJavaライブラリである`Joda-Time`には`org.joda.time.DateTimeUtis`に`setCurrentMillisFixed`というメソッドが用意されています。これは、現在日時を任意の値に固定することが出来るもので、現在日時によって動的に処理が変化するコードのテストを楽に実施することができます。

Java 8ではJoda-Timeの有用性が薄れてきたり、新機能のClock使えば同じことができるけれど、ホラ、Java 8が禁止されてたりとか、あ、あるじゃない？

## サンプルコード
```java
@Test
public void somethingTest() {
    DateTime mockDateTime= new DateTime(2014, 1, 1, 0, 0, 0);
    DateTimeUtils.setCurrentMillisFixed(mockDateTime.getMills());

    // 現在日時を取得してみると、設定した日時が現在日時として取得される
    System.out.println(new DateTime()); // 2014-01-01T00:00:00.000+09:00

    // something test code...
}

@After
public void tearDown() {
    // 対象のテスト後にはシステム時刻を元に戻して安全性を保つ
    DateTimeUtils.setCurrentMillisSystem();
}
```

## 参考
DateTimeUtils (Joda-Time 2.5 API)
http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeUtils.html#setCurrentMillisFixed(long)
MySQL, PostgreSQL ちょっとお試し用 Docker コンテナの起動と廃棄


ちょっと試したいクエリがある時に、サーバをちょっと起動してすぐ消せる。なんて便利。

# MySQL

公式イメージを使うのが容易（[docker-library/mysql](https://github.com/docker-library/mysql)）。

Docker 公式ドキュメントは「[docker-library/docs](https://github.com/docker-library/docs)」にあり、MySQL は右記。 ∥ [docs/mysql at master · docker-library/docs](https://github.com/docker-library/docs/tree/master/mysql)

現状でバージョンは 5.5, 5.6, 5.7 とある。

~~~~
$ docker run --name mysql0 -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7
$ mysql --host=$(docker inspect --format "{{ .NetworkSettings.IPAddress }}" mysql0) -u root -p
mysql
mysql> CREATE DATABASE foo;
mysql> USE foo;
mysql> CREATE TABLE bar (k integer, v text);
mysql> INSERT INTO bar VALUES(10, 'Ten');
mysql> INSERT INTO bar VALUES(20, 'Twenty');
mysql> SELECT count(*) FROM bar;
mysql> EXIT;
$ docker rm -f mysql0
~~~~

Docker 1.3 以上であれば exec サブコマンドが使えるので、コンテナが持っているクライアントを用いることも可能（ローカルに MySQL クライアントが入っていなくても OK）。対話をするので、オプションで「--interactive」と「--tty」を指定のこと。

~~~~
$ docker exec -it mysql0 mysql -u root -p
~~~~

# 同様に、PostgreSQL

公式のレポジトリは右記。 ∥ [docker-library/postgres](https://github.com/docker-library/postgres)

追記（Jan 13 2015）: 先ほど [postgres/9.4 at master · docker-library/postgres](https://github.com/docker-library/postgres/tree/master/9.4) を見ると、$POSTGRES_PASSWORD が設定できるようになっているようですね。

リファレンスは右記。 ∥ [docs/postgres at master · docker-library/docs](https://github.com/docker-library/docs/tree/master/postgres)

現状でのバージョンは、8.4, 9.0, 9.1, 9.2, 9.3 と、ベータの 9.4 がある。

~~~~
$ docker run --name postgres0 -d postgres:9.3 
$ psql -h $(docker inspect --format "{{ .NetworkSettings.IPAddress }}" postgres0) -U postgres
postgres=# SELECT current_database(), current_schema();
 current_database | current_schema
------------------+----------------
 postgres         | public
(1 row)
postgres=# \q
$ docker rm -f postgres0
~~~~

同様に、Docker 1.3 以上であれば、下記でも可。

~~~~
$ docker exec -it postgres0 psql -U postgres
~~~~

$PGDATA は /var/lib/postgresql/data/ で、VOLUME 指定されています。

あれ、パスワードを聞いてきませんね。おっと、pg_hba.conf は見ての通りスッカスカなので、このまま実運用はしてはいけません。Dockerfile を書きましょう。

~~~~/var/lib/postgresql/data/pg_hba.conf
...
host all all 0.0.0.0/0 trust
...
~~~~
Locust - 負荷試験

Locust - 負荷試験

REF

[1] - [Locust document](http://docs.locust.io/en/latest/)

***

はじめで日本語で書きます。よろしくお願いします！

***


# 負荷試験の難しさ

- 一つのThreadで、Requestを送信するのは遅い。
- 複数のThreadでRequestを送信しても、一つのサーバー（パソコン）の性能は限界がある。
- 負荷の指定するのは難しい。
- ResponseTimeの統計はめんどい。（二番目を解決するため、複数サーバーが負荷をかけるともっとめんどくなる）
- Responseの内容をチェックしたいんですが、チェックするとRequestを送信するのが遅くなる。バランスが取りにくい。
- 自分でそんな負荷試験プログラム書きたくない。

Locustは以上の全ての問題を解決できます。（謎の声：理想の負荷試験、Locust）

# Locustの基本機能

Locustでは、何個ユーザー（client）、どうの頻度でどうのrequestが送信するのを設定できます。そして、実行している時現時点の秒間リクエスト数や、各リクエストの送信回数と平均・最大・最小ResponseTimeや、失敗したリクエストを表示することができます。


# LocustのInstall


pipとeasy_installでinstallするのは一番やりやすい方法です：

```
pip install locustio
```

```
easy_install locustio
```

WindowsとMacのInstall方法は[こちら](http://docs.locust.io/en/latest/installation.html)に参考してください。

# Locustを起動する

Locustでの負荷試験は簡単です。
負荷試験を起動する必要なものは一つのpythonのTestCaseです。
LocustのTestCaseも書きやすいです。以下は典型的な例の一つ：

```python:SimpleTask.py
from locust import HttpLocust, TaskSet, task

# 本物のTestCase前に、Test用の資料を用意します
textureDirName = "texture"
userIdFileName = "user_id.txt"
userIdFilePath = os.path.join(os.path.abspath(os.path.dirname(__file__)), textureDirName, userIdFileName)

globalUserArr = list(line.rstrip('\n') for line in open(playerIdFilePath))

class SimpleTaskSet(TaskSet):

  # テスト起動する時invokeするメソード
  def on_start(self):
    randomIndex = random.randint(0, len(globalUserArr) - 1)
    self.testingUserId = globalUserArr[randomIndex]

  # test case 1
  @task(1)
  def testRequestGet(self):
    # urlのpathの部分を作成
    requestPath = "/services/users/" + self.testingUserId + "/checkSomeThing"
    # requestを送信
    self.client.get(requestPath)
    
  # test case 2
  # @task(2) が指定して、このtest caseの送信頻度を上のtest case 1の二倍になる。
  @task(2)
  def testRequestPost(self):
    requestPath = "/services/users/doSomeThing/checkin"
    # Post requestの読み方
    self.client.post(requestPath, {"user": self.testingUserId })

# Locustのclass
class SimpleLocust(HttpLocust):
  task_set = ReadStateTaskSet　# 上のtest caseをimportします
  # 各ユーザーが前回のrequestを送信した後、何秒を待つかという設定
  min_wait = int(1) 
  max_wait = int(2) 

```


>　一つの注意点があります。 *List* 、 *Dict*のようなMemberがTaskSetに入らない方がいいと思います。


そして、

```
python -H [you_url_or_ip_of_your_application] -f [path_of_your_SimpleTask]
```

を実行しで、Localhostの8089Portで負荷試験Consoleを訪問できます。そこで負荷が設定して試験を始めます。


# Distributedでの負荷試験

Locustを使ったら、分散型負荷試験がやりやすいです。

まず複数のサーバーを用意して、そしてさきのscriptをサーバーにUploadします。

一つのサーバーは **Master** を担当し、他のサーバーが **Slave** になる。 **Master** が設定した負荷を **Slave** に配分して、 **Slave** がリクエストを送信します。

masterで:

```
python -H [you_url_or_ip_of_your_application] -f [path_of_your_simple] --master
```


slaveで:

```
python -H [you_url_or_ip_of_your_application] -f [path_of_your_simple] --slave --master-port=[master_ip]
```

>　分散型負荷試験をやる時、３つの注意点がある：
>　1.　MasterとSlaveと通信があるので、FirewallやSecurityGroupを設定しないといけない。
>　2.　重い負荷をテストするとHealthCheckなどのため、同時でたくさんファイルがOpenするから、Ulimitを超えるかも。だから、MasterとSlaveの各サーバーで、Locustを起動する前に`ulimit 4096`をさきに実行します。
>　3.　Defaultの8089のportを変更したいなら、Masterで`--master-bind-port=5557`のように追加して、Slaveで`--master-port=5557`を追加します。
Atomチートシート


いまさら感。

`cmd` を押しながら `k` を押し、手をキーボードから離し `→` のような動作は、
`cmd-k right` のようにスペース区切りで表す。
`cmd-k cmd-right` のように `cmd` が連続する場合は `cmd` は押しっぱなしでもいい。

# :airplane: 移動

|Keystroke|Command|操作|
|---|---|---|
|ctrl-p|core:move-up|カーソルを上に移動|
|ctrl-n|core:move-down|カーソルを下に移動|
|ctrl-b|core:move-left|カーソルを左に移動|
|ctrl-f|core:move-right|カーソルを右に移動|
|ctrl-a|editor:move-to-first-character-of-line|カーソルを先頭に移動|
|ctrl-e|editor:move-to-end-of-line|カーソルを行末に移動|
|cmd-up|core:move-to-top|カーソルをファイル先頭に移動|
|cmd-down|core:move-to-bottom|カーソルをファイル末尾に移動|
|ctrl-g|go-to-line:toggle|カーソルを指定行に移動|
|ctrl-m|bracket-matcher:go-to-matching-bracket|カーソルを対応するカッコに移動|

# :pencil2: 編集

### 基本

|Keystroke|Command|操作|
|---|---|---|
|ctrl-d|core:delete|カーソルの右を削除|
|ctrl-h|core:backspace|カーソルの左を削除|
|ctrl-k|editor:cut-to-end-of-line|末尾までカット|
|ctrl-shift-K|editor:delete-line|現在行を削除|
|ctrl-space|autocomplete:toggle|補完/補完候補表示<br/>(Spotlightのショートカットはオフ)
|cmd-enter|editor:newline-below|下に新規行追加|
|cmd-j|editor:join-lines|行の連結|
|cmd-w|core:close|タブを閉じる|

### フォールディング

|Keystroke|Command|操作|
|---|---|---|
|alt-cmd-[|editor:fold-current-row|現在行で折りたたみ|
|alt-cmd-]|editor:unfold-current-row|現在行で展開|

### ツリー・ビュー

|Keystroke|Command|操作|
|---|---|---|
|ctrl-0|tree-view:toggle-focus|ツリー・ビューとエディタのフォーカス切り替え<br>(ツリー・ビューが閉じていれば開いてフォーカス)|
|cmd-k h|tree-view:open-selected-entry-left|左にスプリットして開く|
|cmd-k j|tree-view:open-selected-entry-down|下にスプリットして開く|
|cmd-k k|tree-view:open-selected-entry-up|上にスプリットして開く|
|cmd-k l|tree-view:open-selected-entry-right|右にスプリットして開く|

### ペイン

|Keystroke|Command|操作|
|---|---|---|
|cmd-k up|pane:split-up|上にスプリット|
|cmd-k down|pane:split-down|下にスプリット|
|cmd-k left|pane:split-left|左にスプリット|
|cmd-k right|pane:split-right|右にスプリット|
|cmd-k cmd-up|window:focus-pane-above|上のペインに移動|
|cmd-k cmd-down|window:focus-pane-below|下のペインに移動|
|cmd-k cmd-left|window:focus-pane-on-left|左のペインに移動|
|cmd-k cmd-right|window:focus-pane-on-right|右のペインに移動|
|cmd-k cmd-n|window:focus-next-pane|次のペインに移動|
|cmd-k cmd-p|window:focus-previous-pane|前のペインに移動|

### マルチ・カーソル

`cmd-click` で新規カーソル追加。
システム環境設定 ＞ キーボード ＞ ショートカット ＞ Mission Control で `^↑` と `^↓` のチェックを外す必要があるかも。

|Keystroke|Command|操作|
|---|---|---|
|ctrl-shift-up|editor:add-selection-above|カーソルの上に新規カーソルを追加|
|ctrl-shift-down|editor:add-selection-below|カーソルの下に新規カーソルを追加|

# :poop: その他

|Keystroke|Command|操作|
|---|---|---|
|cmd-,|application:show-settings|設定を開く|
|cmd-.|key-binding-resolver:toggle|キーバインド・リゾルバーの表示|
|ctrl-cmd-f|window:toggle-full-screen|フルスクリーン切り替え|
|shift-cmd-P|command-palette:toggle|コマンド・パレットの表示|
|ctrl-shift-L|grammar-selector:show|グラマー・セレクターの表示|
|ctrl-shift-U|encoding-selector:show|エンコーディング・セレクターの表示|
|ctrl-shift-M|markdown-preview:toggle|マークダウン・プレビューの表示|
|cmd+t|fuzzy-finder:toggle-file-finder|ファジー・ファインダーの表示|
|cmd+\ |tree-view:toggle|ツリー・ビューの表示|
キャメルケースで省略語をどう扱うか


キャメルケース(camelcase)において、IDやURL、HTTPといった略語（頭字語:acronym）はどのように扱うべきでしょうか。

[キャメルケース](http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9)


プラットフォームのコーディングガイドラインによって決められているものがあるのでまとめました。
他にあれば追記しますのでコメントください。（決まっていないものもまとまっていると、探す手間が省けるかもしれません。）

個人的にはどのスタイルでも一貫性があればよいと思うのですが、マルチプラットフォームなAPIを考えるときにどうするか迷いますよね。

# Cocoa (Objective-C)

- well-knownなacronymについては全部大文字とある
    - ガイドラインには「先頭では、、、」と書いてあるけど、先頭でなくても大文字になっている
- 例
    - URLWithString:relativeToURL:


Coding Guidelines for Cocoa

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingBasics.html

well-known acronymは例はこちら

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/APIAbbreviations.html


# Java(Google Java Style Guide)

Google社内のJavaスタイルガイドでは非常に丁寧に変換手順が書いてあります。

- 他の単語と同じように扱う＝先頭の単語は小文字または大文字、以降の単語の先頭は大文字

|    正          |    誤              |
|:--------------:|:------------------:|
| XmlHttpRequest |  XMLHTTPRequest    |
| newCustomerId  |  newCustomerID     |
| supportsIpv6OnIos  |  supportsIPv6OnIOS     |

https://google.github.io/styleguide/javaguide.html#s5.3-camel-case
https://kazurof.github.io/GoogleJavaStyle-ja/#s5-3-camel-case

# Java(Android)

- 他の単語と同じように扱う＝先頭の単語は小文字または大文字、以降の単語の先頭は大文字
- 例
    - class XmlHttpRequest
    - getCustomerId
- すでにJDKとAndroidのコードで一貫性は無いけど、我慢して従ってほしいとのこと

http://www.textdrop.net/android/code-style-ja.html#acronyms
http://source.android.com/source/code-style.html#treat-acronyms-as-words

# .NET

- 2文字までは全大文字(例 ID, DB)
- 3文字以上は先頭のみ大文字(例 Xml, Http)

http://msdn.microsoft.com/ja-jp/library/ms229043.aspx

# Swift

https://swift.org/documentation/api-design-guidelines/#naming

> Acronyms and initialisms that commonly appear as all upper case in
> American English should be uniformly up- or down-cased according to 
> case conventions:
>> var utf8Bytes: [UTF8.CodeUnit]>> var isRepresentableAsASCII = true
>> var userSMTPServer: SecureSMTPServer
>
> Other acronyms should be treated as ordinary words:
> 
>> var radarDetector: RadarScanner
>> var enjoysScubaDiving = true

- すべて大文字またはすべて小文字にする。
- CamelCase/camelCaseのルールに従う。
- ガイドラインの例がわかりやすい。

# Kotlin

https://kotlinlang.org/docs/reference/coding-conventions.html#choosing-good-names

> When using an acronym as part of a declaration name, capitalize
>  it if it consists of two letters (IOStream); capitalize only the 
> first letter if it is longer (XmlFormatter, HttpInputStream).

基本的にはJavaに従うようですが、
acronymに関しては.NETのように2文字とそれ以上で分ける派のようですね。

# Rust

https://sinkuu.github.io/api-guidelines/naming.html
https://github.com/rust-lang/rfcs/blob/master/text/0430-finalizing-naming-conventions.md

> In UpperCamelCase, acronyms count as one word: use Uuid rather than
> UUID. In snake_case, acronyms are lower-cased: is_xid_start.

他の単語と同じように扱えとのこと。Javaと同じですね。
osxでkextに署名するための情報


10.10以降はアプリ同様、kext（=Kernel Extension、ドライバ）への署名が必須になったとのことで、署名するために必要な情報を探しました。

WWDC2012のスライドに、OS10.9以降で署名の手順が書いてあります。

https://developer.apple.com/videos/wwdc/2013/?id=707


これによると、

1. Mac Developer Programへサインイン
2. Appleのサイトからどういうドライバかを書いて、権限リクエストをする
	- https://developer.apple.com/contact/kext/
	- どういった審査ややりとりが必要かは不明
3. OKが出たら、CertificationCenterからkext用署名のリクエストができるようになる
4. Xcodeのプロジェクト設定に、DeveloperIDで署名するよう設定する

のようです。
【サンプルコード】TeraTermマクロでLinuxサーバのユーザ削除を行う

複数のLinuxサーバに対して複数のユーザを削除する作業が発生し、作業を効率化するためTeraTermマクロのスクリプトを組んでみました。

# 下準備

* TeraTermのマクロファイルは拡張子を「.ttl」として作成します。
* TeraTermのマクロ実行エンジン「ttpmacro.exe」と「.ttl」ファイルを関連付けておくことで、.ttlファイルをダブルクリックするだけでマクロを実行できるようになります。

# サンプルスクリプト

## このサンプルスクリプトが行うこと

* スクリプト本文内にてあらかじめ指定したユーザ／パスワード／ホスト名を元に、SSH接続を行います。
* スクリプト本文内にてあらかじめ指定したユーザを userdel にて削除します。ユーザは複数指定できます。
* ユーザ削除後 cat /etc/group を行い、グループ一覧を表示します。
* 上記処理完了後、SSH接続を終了します。
* コマンドの実行結果をローカルマシンのログファイルに出力します。

## スクリプト本文

```:sample.ttl
; ==================変更箇所ここから================== 
; TODO と記載された箇所を適宜変更して下さい。

;; 接続先ホスト／ユーザ名／パスワード設定 
HOSTADDR = 'TODO'
USERNAME = 'TODO' 
PASSWORD = 'TODO' 

;; ログファイル出力先ディレクトリ
LOGFILE = 'TODO'

;; 削除対象ユーザ
; TODO: ユーザ数を指定
USER_COUNT = 3
strdim USER USER_COUNT

;; 削除対象ユーザ名を指定。配列の数は上記USER_COUNTで指定した数-1で、定義して下さい。
USER[0] = 'TODO'
USER[1] = 'TODO'
USER[2] = 'TODO'
; ==================変更箇所ここまで================== 

;; ログファイルの指定
strconcat LOGFILE '\'
strconcat LOGFILE HOSTADDR
strconcat LOGFILE '.txt'

;; コマンド組立て 
COMMAND = HOSTADDR 
strconcat COMMAND ':22 /ssh /2 /auth=password /user=' 
strconcat COMMAND USERNAME 
strconcat COMMAND ' /passwd=' 
strconcat COMMAND PASSWORD

;; 接続
connect COMMAND
wait '$'
sendln 'sudo su'
wait '[sudo] password for'
sendln PASSWORD
wait '#'

;; ユーザ削除
logopen LOGFILE 0 0  ; ログの記録を開始

for i 0 USER_COUNT
  COMMAND = 'userdel '
  strconcat COMMAND USER[i]
  sendln COMMAND
  wait '#'
next

sendln 'cat /etc/group'
wait '#'
logclose  ; ログ記録を終了

;; マクロ終了 
closett  ; 切断
```

## 備考

* 変数を大文字、メソッド名／構文を小文字で記載しています。
* sudo su コマンドで root になってユーザ削除を行うため、 sudo su の利用できるユーザを USERNAME に指定して下さい。

# 参考サイト
* Tera Termマクロ活用入門
http://sourceforge.jp/magazine/10/01/08/0825239
* Tera Termマクロ活用入門（2）
http://sourceforge.jp/magazine/10/01/18/105235
MiddlemanでTwitterBootstrap対応WEBサイトプロジェクトを生成する

##前提：Mac＋rbenv
###rbenvのインストール

    brew update
    brew install rbenv ruby-build
    echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
    mkdir ~/.rbenv/plugins
    git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
    git clone git://github.com/ianheggie/rbenv-binstubs.git ~/.rbenv/plugins/rbenv-binstubs


homebrewでRubyのバージョンマネージャーrbenvをインストール。

rbenvのプラグインで、rbenvを利用した場合に手間となるgemインストール毎の`rbenv rehash`コマンドを省略するrbenv-gem-rehashプラグインを入れる。
また、bundlerでディレクトリローカルにインストールしたgemを`bundle exec GemName`形式ではなく直接`GemName`形式で実行できるようにするrbenv-binstubsを入れる。

###Rubyのインストールとbundlerの設定

    rbenv install 2.0.0-p481
    gem install bundler
    bundle config --global path 'vendor/bundle'
    bundle config --global bin 'vendor/bin'


使用するRubyのバージョン(利用可能な一覧は `rbenv install -l` で一覧可能)を決定し、インストール、gemを管理するbundlerも入れる。bundlerでインストールするgemはグローバルインストールではなく、ディレクトリ内にローカルインストールするように設定。

##middlemanのインストール

プロジェクトのディレクトリを用意し、middlemanをインストール。ここでbundlerを利用し、middleman自体もディレクトリローカルにインストールしている。

    mkdir projectDir && cd projectDir
    bundle init
    echo 'gem "middleman"' >> Gemfile
    bundle install --path=vendor/bundle --binstubs=vendor/bin

gemのインストール過程で、`rbenv: cannot rehash: ~/.rbenv/shims/.rbenv-shim exists`というメッセージが表示された場合は、`rbenv-gem-rehash`や`rbenv-binstubs`が上手く機能していない。時折発生するが、そういう時は`rm ~/.rbenv/shims/.rbenv-shim`して`rbenv rehash`する。

##プロジェクトのソースをMiddlemanで生成

    #middlemanでカレントディレクトリ内にソースを生成
    middleman init .
    bundle install
    
    #このディレクトリ内では現在使っているRubyバージョンで固定
    cat ~/.rbenv/version >> .ruby-version

##設定ファイル
    
    vi source/config.rb
    #-------
    + activate :livereload
    + config[:file_watcher_ignore] += [ /.idea\// ]
    #-------
    
`middleman server`コマンドで、ファイルに変更があった場合ブラウザを再読込させる機能livereload時に、IDE（統合開発環境）が自動生成するメタデータに反応すると面倒なので、不要なファイルをfile_watcher_ignoreに指定する。`.idea`はRubyMineが生成するメタデータ。
    
    #もし生成されるリンクを相対リンクにしたいとき
    #-------
    + set :relative_links, true
    #-------

デフォルトでは`middleman build`したソース内のリンクは絶対リンクになります。常にドメインルートにサイトを配置するならば構いませんが、サブディレクトリでページを公開する場合は、相対リンクを有効にします。

##TwitterBootstrapに対応

    #Bootstrapt対応
    echo 'gem "bootstrap-sass", require: false' >> Gemfile
    bundle install
    
`:require => false`は、Rails前提で作られたGemが、RailsやCompass内部のRails特有のイベントに自動でフックしようと試みるのを防ぎます。そのかわりに、Middlemanでは次のように手動でCSSからTwitterBootstrapを読み込むように設定します。

    vi source/stylesheets/all.scss
    #-------
    @charset "utf-8";
    + @import "bootstrap";
    #-------
SWTでToolBarに画像（アイコン）のみのToolItemを追加したときに引っかかった事。

SWTでGUIアプリケーション作成中にツールバーに関して引っかかったのでメモ


通常のテキストのボタンなら以下の様なコードでOKです。

```java:Toolbar.java
ToolBar toolBar = new ToolBar(shell, SWT.NONE);
ToolItem toolItem = new ToolItem(toolBar, SWT.PUSH);
toolItem.setText("開く");
```

せっかくなので画像にしてそれっぽくしようとします。

```java:Toolbar.java
ToolBar toolBar = new ToolBar(shell, SWT.NONE);
ToolItem toolItem = new ToolItem(toolBar, SWT.PUSH);
//toolItem.setText("開く");
toolItem.setImage(new Image(display,"icon.png");
```

これで、よくあるアプリケーションのようにアイコンのみのボタンができるはず。。。

Mac（OS X 10.10)では、意図したとおりになります。
しかし、Windows 7環境では、左右に大きなマージン付きの横長ボタンになってしまいます。

ToolItem.setWidth()もセパレーター用みたいなのでどうしたものかと試行錯誤してると、

```java:Toolbar.java
ToolBar toolBar = new ToolBar(shell, SWT.NONE | SWT.RIGHT);
ToolItem toolItem = new ToolItem(toolBar, SWT.PUSH);
//toolItem.setText("開く");
toolItem.setImage(new Image(display,"icon.png");
```

ToolBarのスタイルに``SWT.RIGHT``を指定してあげるとうまくいきました。

ちなみに画像＋テキストなボタンのときは普通にうまくいきます。
Java で UnsupportedEncodingException を発生させなくする

こんにちは、最近は Go か Java しか書いていない米林です。

## UnsupportedEncodingException 嫌い
Java開発において `String.getBytes("UTF-8")` や `new String(byte[], "UTF-8)` する際に、毎回 UnsupportedEncofingException を try-catch したり throws に追加して「"UTF-8"はサポートしてるだろう」と思いながら仕方なく書いてた人は日本 :jp: には多数いるはずです。

コードとしてはこんな感じ、Java 開発者なら「あー、これね」と頷くレベルですね。

```sample.java
private void getBytes() {
	final String msg = "ABC";
	try {
		final byte[] bytes = msg.getBytes("UTF-8");
	} catch (UnsupportedEncodingException e) {
		// 起こり得ないけど書いてます...
	}
}

// throws UnsupportedEncodingException これも起こらないけど書く
private String getString(final byte[] bytes) throws UnsupportedEncodingException {
	final String str = new String(bytes, "UTF-8");
	return str;
}
```

## コードから UnsupportedEncodingException を消す

Java7 からは try-catch, throws で UnsupportedEncodingException を書かなくて良い方法があります。
String クラスの `new String()`, `String.getBytes()` に `java.nio.charset.Charset` を引数に指定するメソッドが 1.6 から追加されています。

### StandardCharsets 大好き

Java7からは、`java.nio.charset.StandardCharsets` が追加されました。
`StandardCharsets.UTF_8` 万歳！

### Examples

```sample.java
private void getBytes() {
	final String msg = "ABC";
	final byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
}
	
private String getString(final byte[] bytes) {
	final String str = new String(bytes, StandardCharsets.UTF_8);
	return str;
}
```

これで全国の Java 開発者の笑顔を取り戻せそうです！

## Be careful.
StandardCharsets を見れば分かりますが、Java 開発者にお馴染みである "MS932" や "Windows-31j" はスタンダードでは無いため、この記事を見て早速 `StandardCharsets.` で補完しても出てきませんので、そういう場合は諦めて UnsupportedEncodingException と共に生きて行きましょう！

弊社では絶賛社員募集:mahjong:です！
Matlabでヘルシーに解析結果を保存する

#はじめに
解析を効率化するための方法を検討してみて、
MVCパタンのように、フォルダを
ロジック・結果の表示・個別解析に分けようと考えました。

結果、libs/, results/, experiments/というフォルダを作ることになりました。
今回は、作成された図や変数をresults/に保存していく方法を書きます。
別途ファイル構成についても言及してますのでご覧ください。
[解析において僕の考える最強のフォルダ構成 - Qiita](http://qiita.com/sshojiro/items/67ee0b91a64aeefa46fa)

#やること
結果をresults/というディレクトリに保存するんですけど、
その際、解析結果ごとに自動的にファイルを整理してくれたら嬉しいですよね。

そんで、results/のしたに、例えば
results/{date}-{experiment_name}
のようなディレクトリを更に作成したい。
作成してかつ、そのディレクトリ名を返り値として返して欲しい（saveするときに使うので。）

これを実装したのが下記。

#SourceCode
関数で実装したら、こんな感じ。

```matlab:setResultDir.m
function [TargetDir] = setResultDir(FolderName)
	if size(strfind(FolderName, '-'),2)==0,
		prefix = regexp(FolderName, '^[a-z]+', 'match');
		trimmer = strsplit(FolderName, prefix);
		FileName = trimmer{2};
		strcell = strsplit(FileName, '_');
		FolderName = strjoin(strcell, '-')
	end
	TargetDir = ['./results/' FolderName];
	mkdir(TargetDir);
end
```

想定している使い方は、
例えばexp2014_11_13_generate_spectra.mという
ファイルにおいて保存したい解析結果があるとして、

```matlabsession:exp2014_11_13_generate_spectra.m
mfilename % -> 実行ファイル名を返す
DirName = setResultDir(mfilename);
% -> return 2014-11-13-generate-spectra
```
と書きます。
このDirNameを使って、save先のファイル名を決定してもらえればいいわけです。
## mkdir
mkdirによりディレクトリが自動生成されます。
これが、目的の1つ。

## ファイル名を置換してディレクトリ名にする
strsplit/strjoinを使って、文字列置換してます。
これが、目的のもう1つ。

.mファイルにはアンダースコアしか使えないのに対して、
画像ファイル、ディレクトリにはハイフンが使えるので、
アンダースコアをハイフンに、
接頭辞のexpを取り除くように書いています。

これとsaveas系の関数を組み合わせれば、
ヘルシーになること間違えなしです！


今日はここまで～