OmniAICreator/Qiita-1.07M huggingface dataset:
Emacsで英和辞書や和英辞書をすぐに引けるようにしたい　を改良

[Emacsで英和辞書や和英辞書をすぐに引けるようにしたい](http://blog.shibayu36.org/entry/2016/05/29/123342) を改良

元のコードは、英語かどうかの判定がascii文字だけなので、英文にスペイン語やドイツ語などの地名や人名が入っていると日本語と判定される。（El Niño エルニーニョとか)

翻訳範囲の指定方法を増やした。
C-u でパラグラフ
C-u C-u で単語
C-u C-u C-u でキーボードから単語や文を入力
引数なしでセンテンス
リージョンを指定していればそのリージョン

```elisp
(autoload 'google-translate-translate "google-translate" "" t)
(defun google-translate-get-string (arg)
  (or (cond ((stringp arg) arg)
	    ((= arg 4)			;C-u
	     (thing-at-point 'paragraph))
	    ((= arg 16)			;C-u C-u
	     (thing-at-point 'word))
	    ((= arg 64)			;C-u C-u C-u
	     (read-string "Google Translate: "))
	    ((use-region-p)			;リージョン指定
	     (buffer-substring (region-beginning) (region-end)))
	    (t				;デフォルト
	     (thing-at-point 'sentence)))
      ""))

(defun google-translate-enja-or-jaen (arg)
  "regionか現在位置の単語を翻訳する。C-u付きでquery指定も可能"
  (interactive "p")
  (let* ((string (google-translate-get-string arg))
	 (japanesep (string-match "\\cj" string)))
    (run-at-time 0.1 nil 'deactivate-mark)
    (google-translate-translate
     (if japanesep "ja" "en")
     (if japanesep "en" "ja")
     string)))

(push '("*Google Translate*" :height 0.5 :stick t) popwin:special-display-config)

(global-set-key (kbd "C-M-t") 'google-translate-enja-or-jaen)

```

[Microsoft Translator](http://qiita.com/styzo/items/a17bda8f3dc141eb3322)も改良してみた。

参考:
[漢字、ひらがな、カナカナにマッチ](http://so-zou.jp/software/tech/programming/tech/regular-expression/meta-character/variable-width-encoding.htm)
[Unicodeで「漢字」の正規表現](http://tama-san.com/kanji-regex/)

ごみ:

```el
;; (defconst google-translate-japanese-chars
;;   "[ぁ-んァ-ヶ々〇〻\u3220-\u3244\u3280-\u32B0\u3400-\u9FFF\uF900-\uFAFF\U00020000-\U0002FFFF]"
;;   "これらの文字が含まれているときは日本語とみなす") ;いい加減
;; (japanesep (string-match
;; 		     ;;(format "\\`[%s]+\\'" google-translate-japanese-chars)
;; 		     google-translate-japanese-chars
;; 		     string)))
```

追記:
たまたまたどり着いたWikipediaの[Man or boy test](https://en.wikipedia.org/wiki/Man_or_boy_test)が翻訳できなかった。
> Trying to work it through on paper is probably fruitless, but the correct answer is −67, despite the fact that in the original paper Knuth conjectured it to be −121.

"`-67`"が"`-`"(HYPHEN-MINUS, #x2d)ではなくて"`−`"(MINUS SIGN, #x2212)なので、`(string-match "\\cj" string)`では日本語と判定してしまう。
wikipediaのソースは以下のようになっている。

```
Trying to work it through on paper is probably fruitless, but the correct answer is &minus;67, despite the fact that in the original paper Knuth conjectured it to be &minus;121.
```
やはり、ごみにしたコードのほうが良いかも。
いずれにしても特定の文字の出現だけで言語を判定するのは無理がある。
送信先の機器によって変わるTTLの話

# TTLとは

「Time To Live」 の略語で、「生存時間」という意味です。
これはパケットが有効である期間を指していて、L3レベルのネットワーク機器を一つ経由する毎に値が一つ減っていきます。
ループ防止目的の為に設定されている値で、0になるとそのパケットは破棄されてしまいます。

このTTLはpingの送信先によって基礎値が変わってきます。
送信元に表示されるTTL値は
基礎値 - 到達までのネットワーク機器数 = TTL値
となります。

# Windowsの場合

Windowsにpingを送る場合、デフォルトのTTLは**128**となります。

```bat
C:\Users\hoge> ping windows

windows.example.com [192.168.0.10]に ping を送信しています 32 バイトのデータ:
192.168.0.10 からの応答: バイト数 =32 時間 =1ms TTL=128
192.168.0.10 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.10 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.10 からの応答: バイト数 =32 時間 <1ms TTL=128

192.168.0.10 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 1ms、平均 = 0ms
```

# Linux(RHEL)の場合

Linuxにpingを送る場合、デフォルトのTTLは**64**となります。

```bat
C:\Users\hoge> ping linux

linux.example.com [192.168.0.11]に ping を送信しています 32 バイトのデータ:
192.168.0.11 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.11 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.11 からの応答: バイト数 =32 時間 <1ms TTL=64
192.168.0.11 からの応答: バイト数 =32 時間 <1ms TTL=64

192.168.0.11 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms
```

# ネットワーク機器(ルータ、スイッチの場合)

ネットワーク機器の場合はデフォルトの**255**となります。

```bat
C:\Users\hoge> ping cisco

cisco.example.com [192.168.0.11]に ping を送信しています 32 バイトのデータ:
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=255
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=255
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=255
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=255

133.187.96.254 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms
```

以上
Apache JMeterでサーバ負荷テスト


## Apache JMeter

### Apache JMeterとは
```
(Wikipediaより引用)
Apache JMeter（アパッチ ジェイメーター）は、Apacheソフトウェア財団にて開発されているソフトウェアである。
クライアント・サーバシステムのパフォーマンス測定および負荷テスト（英語版）を行うJavaアプリケーションである。
HTTPレスポンスの内容の妥当性を判定することもできるため、パフォーマンステストのみならず、機能テストに使用することも可能である。
```

### 公式サイトとダウンロードページ
* 公式サイト
	* http://jmeter.apache.org/

* ダウンロードページ
	* http://jmeter.apache.org/download_jmeter.cgi


## 入手

* 公式サイトのBinariesからapache-jmeter-3.0.tgzを取得

## 起動

* ダウンロードしたapache-jmeter-3.0.tgzを展開
* apache-jmeter-3.0/bin/ApacheJMeter.jarを実行

## 設定

### シナリオ作成 ###
* テスト計画 > Threads (Users) > スレッドグループ を作成
* スレッドグループ > 追加 > リスナー > 結果を表で表示
* ワークベンチ > 追加 > Non-Testエレメント > HTTPプロキシサーバ を作成
* HTTPプロキシサーバペインの[開始]ボタンを押す。
* プロキシ設定を、HTTPプロキシサーバペインの内容に合わせて、任意のURLを巡回
	* プロキシ切り替えのプラグインを入れておくと便利。
		* Firefox - [FoxyProxy](https://addons.mozilla.org/ja/firefox/addon/foxyproxy-standard/)
* HTTPプロキシサーバペインの[停止]ボタンを押す。

### 負荷の調整 ###
* スレッドグループの各値を設定する
	* スレッド数 - シナリオを実行するスレッドの数。Webならユーザー数と考えて良さそう。
	* Ramp-up期間 - シナリオのリクエスト数xスレッド数のリクエストを、何秒間で生成するか。
	* ループ回数 - 上記セットを何回繰り返すか…かな?

	```
	5ページのリクエストを行うシナリオを作成し、スレッド数を10、Ramp-upを60、ループ回数を1に設定した場合、「1分間の間に10人のユーザーがそれぞれ5ページのリクエストを投げてきた」って状況(50pv/min,5uu/min)がシミューレートできると思われる。
	```

## 実行
* [実行] > [開始] をクリックすると右上のアイコンが緑になる。
* アイコンが灰色に戻ったら処理完了。

## 結果
* 結果を表で表示 を選択すると、右側にリクエストの結果がリスト表示される。
nim内包表記

# 概要
nimのリスト内包表記(List Comprehensions)
pythonでいうところの、
```python
l = [ x for x in range(10) ]
```
とかです。
## 以下メモ
### シンプル
```nim
import future
block:
  var ary = @[1,2,3,4,5]
  var y = lc[ x+1 | (x <- ary, x mod 2 == 0) , int]
  echo y
```
```
(stdout)
@[3, 5]
```
### 条件付き
```nim
import future
block:
  var ret = lc[ (x,y,z) | ( x <- 1..2 , y <- 2..3 , z <- 3..4 , x == 2) , tuple[a,b,c:int] ]
  echo ret
  echo ret.len
```
```
(stdout)
@[(a: 2, b: 2, c: 3), (a: 2, b: 2, c: 4), (a: 2, b: 3, c: 3), (a: 2, b: 3, c: 4)]
4
```
### 条件付き(位置変更)
```nim
import future
block:
  var ret = lc[ (x,y,z) | ( x <- 1..2 , x == 2 , y <- 2..3 , z <- 3..4 ) , tuple[a,b,c:int] ]
  echo ret
  echo ret.len
```
```
(stdout)
@[(a: 2, b: 2, c: 3), (a: 2, b: 2, c: 4), (a: 2, b: 3, c: 3), (a: 2, b: 3, c: 4)]
4
```
AWS DynamoDB local の実行とアクセス方法（WindowsのGUIクライアントからも見れる！）


## ダウンロードとインストール
[AWS Documentation: コンピュータでの DynamoDB の実行
](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.html#DynamoDBLocal.DownloadingAndRunning)

```shell-session:bash
wget http://dynamodb-local.s3-website-us-west-2.amazonaws.com/dynamodb_local_latest.tar.gz
tar xzvf dynamodb_local_latest.tar.gz
```

## 起動
`java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb`  

* `-dbPath`を指定すると、DBファイル格納フォルダを指定できるため、Vagrantでフォルダ共有とかする場合は便利。
* `-sharedDb`をつけると指定されたリージョンごとのDBファイルではなく、単一のファイルにデータが格納される。

## アクセス方法

### CLIから
[AWS Documentation:ローカルエンドポイントの設定
](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.Endpoint.html)

```shell-session
aws dynamodb list-tables --endpoint-url http://localhost:8000
```

### JavaScript(node)SDKから  

```js:aws_sdk
var AWS = require("aws-sdk");
AWS.config.endpoint = new AWS.Endpoint('http://localhost:8000');

var db = new AWS.DynamoDB();
db.listTables(function(err, data) {
  console.log(data.TableNames);
});
```

### dynamooseモジュールから
  
```js:with_dynamoose
var dynamoose = require("dynamoose");
dynamoose.AWS.config.endpoint = new dynamoose.AWS.Endpoint('http://localhost:8000');

var Cat = dynamoose.model('Cat', { id: Number, name: String });
var garfield = new Cat({id: 666, name: 'Garfield'});
garfield.save();
Cat.get(666)
.then(function (badCat) {
  console.log('Never trust a smiling cat. - ' + badCat.name);
});
```

### GUI(SQLite browser)から
[stackoverflow:dynamodb-client-in-local-with-ui-like-phpmyadmin](http://stackoverflow.com/questions/20856530/dynamodb-client-in-local-with-ui-like-phpmyadmin)  
DynamoDB LocalはSQLiteをバックグランドで使っているのでSQLite Database Browser上で中を見ることが出来るようです！！！！！！

1.  ローカルのDynamoDBをデータベースパスを指定して起動
`java -Djava.library.path=. -jar DynamoDBLocal.jar -dbPath /vagrant_data/dynamodb_data`

1. [SQLite Database Browserをダウンロードしてインストール](https://github.com/sqlitebrowser/sqlitebrowser/releases)

1. SQLite Database Browserを起動、Open DatabaseからDynamoDB起動時に指定したパスのXXX.dbファイルを開く


* Windows上のVagrantで起動しているDynamoDB localでも、Vagrantの共有フォルダにDBファイルを出力するようにしておけば、GUIで見れるし、SQLが使えます。
* DynamoDB localのデフォルトでは、起動したjarファイルと同じ場所にDBファイルが出力されます。


### Javascript Shellから
[チュートリアル: DynamoDB の基本的な運用](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/gettingstartedguide/GettingStarted.JsShell.html)

インタラクティブなチュートリアルが用意されています。優し～い！

* ブラウザから以下にアクセスするとWebからJSのコードでDynamoDB localをいじれます
`http://localhost:8000/shell`

* Vagrantや、リモートの場合は動いているサーバーのURLに適宜変えてくださいませ～。




---
ChefでUbuntuにnvmを入れてnode.jsのバージョンを管理する(Ubuntu12.04)


Chefでnode.jsを入れる話と、その際に苦労した話。

## Ubuntuにnode.jsを入れる方法それぞれ

### 1. apt-getで標準リポジトリから入れる
- 標準リポジトリで入るnodeのバージョン古すぎる
- コマンド名が`nodejs`になるのでnpmの実行でこける
- 回避方法はあるが面倒そう
- ので、不採用

### 2. ppa(personal package archives)で入れる
- バージョンの切り替えが大変そうなので不採用 

### 3. nvmで入れる
- 新しいバージョンも入るしバージョン切り替えも楽そうなので採用 

## Chefでnvmからnode.jsを入れる
最終的には以下のようなコードで動いた。

```ruby:recipes/default.rb 

# 標準パッケージのnodejsが入っていた場合はアンインストール
apt_repository "nodejs" do
  action :remove
  only_if { ::File.exists?("/usr/bin/nodejs") }
end

# nvmインストール
git "/usr/local/nvm" do
  repository "git://github.com/creationix/nvm.git"
  reference "master"
  action :sync
end

template "/etc/profile.d/nvm.sh" do
  source "nvm.sh.erb"
  mode 00644
end

# nvm listした際のエラー回避
directory '/usr/local/nvm/alias' do
  action :create
end

directory '/usr/local/nvm' do
  owner 'root'
  group 'root'
  mode '0755'
  action :create
end

bash "install nodejs" do
  code <<-EOC
    source /usr/local/nvm/nvm.sh
    nvm install #{node["versions"]["nodejs"]}
  EOC
  creates "/usr/local/nvm/#{node["versions"]["nodejs"]}"
end

# npm install
%w{grunt-cli redis-commander cmdparser browserify-middleware readline-browserify}.each do |p|
  bash "npm install" do
    code <<-EOC
      source /usr/local/nvm/nvm.sh
      npm install -g grunt-cli
    EOC
    not_if "npm -g ls 2> /dev/null | grep '^[├└]─[─┬] #{p}@'"
  end
end


```

## ハマったところ
Chefではリソース毎に設定される環境変数は閉じている(正確にいえば、リソース内で環境変数を設定する場合はchefのコードとして明示的に記述する必要がある)。
 
上記を知らなかったために苦労した。

例えば

```ruby
template "/etc/profile.d/nvm.sh" do
  source "nvm.sh.erb"
  mode 00644
end
```

上記でnvmをセットアップするシェルを読み込んでいるが、

```ruby
bash "install nodejs" do
  code <<-EOC
    source /usr/local/nvm/nvm.sh
    nvm install #{node["versions"]["nodejs"]}
  EOC
  creates "/usr/local/nvm/#{node["versions"]["nodejs"]}"
end
```
ここでは上記のシェルで設定された環境変数が受け継がれない。
（だからbashリソース内で`nvm.sh`を再び読み込ませている）


上記のコードで

```ruby
bash "install nodejs" do
  code <<-EOC
    nvm install #{node["versions"]["nodejs"]}
  EOC
  creates "/usr/local/nvm/#{node["versions"]["nodejs"]}"
end
```

と書いて実行すると、`npm command not found`となってしまう。

## おしまい
たぶん基本的なことなんだろうけど、知らなかったためにつらい思いをした。
Rails モデル間でenumを一部だけ共有する

## やりたいこと

PullRequestはIssueを継承しており、同じenumを扱いたいが、PullRequestでは扱うenumを一部に制限したい。

下記のようにかけば一応揃いはするのだが、これでは新たなにstatusが増えたときに値がずれてしまう。

```isssue.rb
class Issue < ActiveRecord::Base
  enum status: %i(open closed pending deleted)
end
```

```pull_request.rb
class PullRequest < Issue
  enum status: %i(open closed)
end
```

そこで、enumの値を共有しつもも、一部分だけに制限する方法を紹介します。

## enumの値をハッシュで取得して必要な部分だけ取り出す
方法としては、共有したいenumの値をハッシュとして取得し、取り出す部分のenum値を`except`や`slice`で削り取り出すようにします。

```isssue.rb
class Issue < ActiveRecord::Base
  enum status: Status.issue
end
```

```pull_request.rb
class PullRequest < Issue
  enum status: Issue.statuses.slice(:open, :closed)
end
```

すると、PullRequestとIssueでenumの値を共有しつつも、有効なenumを制限することができます。

```
irb(main):001:0> Issue.statuses
=> {"open"=>0, "closed"=>1, "pending"=>2, "deleted"=>3}
irb(main):002:0> PullRequest.statuses
=> {"open"=>0, "closed"=>1}
```

確認のため、この状態でPullRequestにない'deleted'を指定するとArgumentErrorの例外が発生するようになっております。

```
irb(main):003:0> PullRequest.create(status: 'deleted')
ArgumentError: 'deleted' is not a valid status
```
映像のSAR(PAR)　DARについて

#ffmpe等使って再エンコードをした時
映像が縦つぶれになったり横つぶれになったりしますよね？
左右上下に黒帯いれたりするんですが、**変形ピクセル**について知っておくと良いですよ。
映像のメタ情報に

**SAR(PAR) DAR**

ってのがあったりしませんか？これはそれぞれ

　SAR -> Sample  Aspect Ratio
　PAR -> Pixel   Aspect Ratio
　DAR -> Display Aspect Ratio

というものです。ここでSAR(PAR)は同じ意味で表現が違うだけで、
　**画素の形（縦横比）**
を表しています。つまりこれが、１：１なら正方形ピクセルで画素数の縦横比がリアルな画面の縦横比となります。ここに１：１以外が設定されると**変形ピクセル**ってことになります。

ここで、SAR(PAR)に何を設定すれば良いか
#そこで簡単な計算式を披露します。
**SARは　元画像の高さ x 出したい横幅比 : 元画像の幅 x 出したい縦幅比**

・例えば720 x 540 の画像を 16:9 で出したい場合SARを求める
　540 X 16 : 720 x 9 ...   **4:3(SAR)**
・720 x 480(ntsc)を16:9で
　480 x 16 : 720 x 9 ...   **32:27(SAR)**

#じゃあDARとは？
**出来上がる絵の縦横比になります。**
上の例で行くと・・・・
画素数は　720 x 540 SAR=4:3
 720 x 4 : 540 x 3 ...   **16:9(DAR)**

画素数は　720 x 480 SAR=32:27
 720 x 32 : 480 x 27 ... **16:9(DAR)**

おお〜検算になってる！！
docker内でGalaxyProjectのGalaxyを実行して、docker外のジョブスケジューラにジョブを投げて、metadataの展開関連のエラーがでたら。

# 概要

Docker コンテナ内の Galaxy の database/job_working_directory が、ジョブスケジューラの実行しているノードとで共有できていないときに、

```
/home/vagrant/work/docker/createnewtool_20160530/job_working_directory/000/1/galaxy_1.sh: 39: /home/vagrant/work/docker/createnewtool_20160530/job_working_directory/000/1/galaxy_1.sh: cannot create /home/galaxy/galaxy-15.07/database/files/000/dataset_1.dat: Directory nonexistent
Traceback (most recent call last):
  File "/home/vagrant/work/docker/createnewtool_20160530/job_working_directory/000/1/set_metadata_TW9O58.py", line 1, in <module>
    from galaxy_ext.metadata.set_metadata import set_metadata; set_metadata()
ImportError: No module named galaxy_ext.metadata.set_metadata
```

というエラーがでて困ったので、回避方法を調べた


# 結論

job_conf.xml で、

***\<param id="embed_metadata_in_job"\>False\</param\>*** を\<destination\>のなかに加える

```
       <destination id="SGE" runner="sge">
               <param id="embed_metadata_in_job">False</param>
               <param id="nativeSpecification">-q all.q</param>
       </destination>
```
# 何が起こったか


## 実行環境

実行中のユーザーが vagrant 、
Galaxy が入っているdocker内のユーザーが galaxy
ディレクトリは、dockerコンテナ内と、dockerホスト側と全く同じディレクトリを共有している。

galaxy.ini の中の job_working_directory の設定は、dockerホストとコンテナ内と共有している

## おこったこと

ジョブを実行して、最初に、次の１行だけのpythonスクリプトが実行されて、メタデータを展開するようなのだが、
ジョブが投入されたノードに、モジュールがないのでエラーになった

```py
from galaxy_ext.metadata.set_metadata import set_metadata; set_metadata()
```


# 解決

つぎのリンク先を読んだら解決した。

* [ImportError when running job on local cluster](https://biostar.usegalaxy.org/p/16194/)

galaxy内でデータが展開されるらしい。
cssでz-indexが効かない場合

#たまにz-indexが効かないってなぜ？


たまに、z-indexが効かないときがあります。

今までスルーしてきましたが、理由がわかりました。

positionが以下のいずれかを指定されていない場合、z-indexが効きません
- relative
- absolute
- fixed

知っていたら対したことありませんが、知らないと意外にストレスです。
個人的Sketch.appでイライラしないための設定やTips

Sketch、便利ですよね。
まぁ僕はPhotoshopの方が好きで、普段はできるだけフォトショを使うんですけど。
でもSketchを使わなければならない局面(案件)、ありますよね。めっちゃ量産が必要とか、なんかよく分からんけど「これからはSketchでしょ！」と言われて、とか…。

本記事はSketchを使うとイライラしてしょうがない、みたいな人向けの、設定方法や使い方のメモです。
ちなみに、本記事執筆時点のSketchのバージョンは`3.8.2`です。


# まず設定
## まずはSketch Toolboxをインストールする
[Sketch Toolbox - A super simple plugin manager for Sketch](http://sketchtoolbox.com/)

Sketch Toolboxは、Sketchのプラグインを一括管理できるMacアプリです。プラグインのインストールやアンインストールが簡単にできるようになるので、オススメです。
サイトから、もしくはHomebrew Caskからインストールできます。

```
$ brew cask install sketch-toolbox
```


## オススメのSketchプラグイン
Sketchのプラグインは沢山あります。「これは絶対インストールした方がいい」というやつだけ紹介します。

### Sketch Commands
[bomberstudios/sketch-commands: A collection of script commands for Bohemian Coding's Sketch.app](https://github.com/bomberstudios/sketch-commands)

便利コマンド詰め合わせみたいなやつ。これクッソ便利だから絶対インストールしよう！！！！11


## カスタムキーボードショートカットを設定する
[sketchで便利なカスタムショートカットの作成方法 - Qiita](http://qiita.com/TadatsuguSampei/items/d55643cf759d1d90c3f6)

上記リンクを参考に、カスタムショートカットを設定しましょう。
よくする操作をキーボードショートカットに登録すれば、生産性が何倍にもなります。

<img width="780" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/51938/f2d50bc3-1761-f908-5a25-fb9a8d396307.png">


…といいつつ、僕はこれだけ…。
これは何故設定しているかというと、`Cmd+0`と`Cmd+1`の挙動をPhotoshopに合わせてあります。Sketchはなぜかデフォルトで逆になっているので。おかげで何百回操作を間違えたか分かりません。


# ではTips
ではTipsです。便利な使い方というか、実際に操作をしていてイライラしたポイントと、その解消方法です。

## ページごとにアートボードを書き出せない→ちょっと手順を踏むけど、できる
何十枚もアートボードを作り、それをページで分けて、みたいな作り方をしている人も多いと思います。
「プロトタイプを作りたいから全部のアートボードをページごとに書き出したい」という時に、現在のSketchはそれができません。イライラする…。

が、ちょっと手順は必要ですが、できます。方法は以下。

* 任意の場所にページ名と同名のフォルダを作る
* そのページを選択し、「Plugins」→「Sketch Commands」→「Select」→「All Artboards in Page」
* 現在のページ内の全てのアートボードが選択されるので、あとは好きにExport

レイヤーパネルやカンバス上でアートボードのタイトルを⌘押しながらポチポチクリック…しないでいいんです。めっちゃ捗ります。

## Symbolsページ内がぐっちゃぐちゃだからシンボルを綺麗に整列させたい→できる
Sketch 3.7から、シンボルは「Symbols」というページ内で一括管理するようになりました。
が、使いづらすぎる。シンボルを新しく作った場合に、どういう法則でSymbolsページ内にシンボルが追加されるのか、まったく分かっていません。
特にSymbolsページを意識せずにシンボルを作ったりしていて、「ちょっとシンボル管理するか」とSymbolsを見ると、ヤバい。というのが最近の悩み。

これも解決できます。「Make Grid」という機能を使いましょう。

* Symbolsページを選択
* さっきと同じく、「Plugins」→「Sketch Commands」→「Select」→「All Artboards in Page」
* 全てのシンボルが選択された状態になる
* 「Arrange」→「Make Grid」
* いい感じに整列されて最高！！！！！

という感じです。Sketch Commandさまさまです。

<img width="488" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/51938/0e9c107b-be0f-4699-675e-de323b7f120a.png">

Make Gridの設定ダイアログ。RowsとColumnsとMarginはお好みで。
「Duplicate layers to fill missing cells」のチェックは外しておきましょう。

こういうの自動でやってくれ！と思いますが、まぁその内アップデートが来て改善されるかも知れません。

## その他のイライラしたポイント
ここからはハイライトでお送りします。

* ページをまるごと1枚の画像で書き出したい
  * →Sketch Commandsでもできるし、[SketchTool](http://www.sketchapp.com/tool/)でもできる
* レイヤーやグループのコピペを繰り返すとめっちゃ深い階層のレイヤーグループの中にレイヤーが1つだけ、みたいな状態になりがち
  * →`Cmd+Shift+G`(Ungroup Layers)を連打
* 文中のリンクなどをデザインする場合に、一部の文字色だけ変えたいが、全ての文字の色が変わってしまう
  * →Text Styleを設定していないか確認。
  * 一部の文字色を変えたい場合は、「No Text Style」にする
* 日本語の扱いが最悪→
  * そもそもSketchでの文字周りは諦めているので、イライラするとかそういうレベルは過ぎ去りました
  * 文字も含めてちゃんとやりたい場合はPhotoshopでやる


# まとめ
僕はやってないですけど、Sketch Commandsでよく使うコマンドはカスタムキーボードショートカットに登録しておけば、さらに快適になるんじゃないでしょうか。

かなり個人的なTipsなのですが、同じような箇所でイライラしている…！という人がもしいれば幸いです。
TomcatとApacheとの連携

メモ。

1. Tomcatのserver.xmlからhttpサーバーの設定を削除
2. httpd.confにリダイレクト用のブロックを追記

```
<Location /hello/>
    ProxyPass ajp://localhost:8009/hello/
</Location>
```

別ファイルに書いてIncludeしても良い
CodeceptionのAcceptanceテスト実行時にちょっと楽する方法

PhantomJSでもSeleniumサーバーでもphpビルトインサーバーでも動作テストが出来るCodeception。
ただその度に各サーバーを起動させるのが面倒でした。
なのでcodeception実行時に自動で各サーバーを立ち上げて、自動で落としてくれるextensionをメモ。
phantomjsはvagrantやテスト環境へのテストで超ベンリです。

phantomjs・codeceptionの基本設定等は
http://qiita.com/a_yasui/items/6bd4826980c80197a95f
こちらを閲覧下さい。

> ※ selenium-serverも自動で立ち上げてくれるextension超募集中！

# 動作確認環境
- php 5.6
- composer
- codeception 2.1.9
- phantomjs 1.9.8

# phpビルトインサーバーの場合
https://github.com/tiger-seo/PhpBuiltinServer

まずはcomposerでインストール

```
$ composer require codeception/phpbuiltinserver --dev
```

次はcodeception.ymlの```extensions```に以下を追加

```codeception.yml
extensions:
    enabled:
        - Codeception\Extension\PhpBuiltinServer
    config:
        Codeception\Extension\PhpBuiltinServer:
            hostname: localhost
            port: 8080
            documentRoot: ./
            phpIni: tests/.test.php.ini #ここでphp.iniも切り替えられます
            startDelay: 0
```

tests/acceptance.suite.ymlも忘れずに

```tests/acceptance.suite.yml
enabled:
        - \Helper\Acceptance
        - PhpBrowser:
            url: http://localhost:8080
```

そのままおもむろにcodeception実行。

```
$ ./vendor/bin/codecept run acceptance tests/acceptance
```

# PhantomJSの場合
https://github.com/site5/phantoman

まずはcomposerでインストール

```
$ composer require site5/phantoman --dev
```

次はcodeception.ymlの```extensions```に以下を追加

```codeception.yml
enabled:
        - Codeception\Extension\Phantoman
    config:
        Codeception\Extension\Phantoman:
            path: '/usr/local/bin/phantomjs' # which phantomjsで調べたパスを入れる
            port: 4445 # 空いてるポートを指定。selenium-serverが4444
            suites: ['acceptance']
```

tests/acceptance.suite.ymlも忘れずに

```tests/acceptance.suite.yml
enabled:
        - \Helper\Acceptance
        - WebDriver:
            url: テストしたいURLへ
            browser: phantomjs
            port: 4445 # codeception.ymlで指定したポートを指定
            window_size: 1024x768 #windowサイズも指定出来る！
```

そしておもむろにcodeception実行。

```
$ ./vendor/bin/codecept run acceptance tests/acceptance
```
某スパコンのキュー情報確認方法

SLURMで管理されたキュー情報の確認方法（自身のジョブがいつ実行されるかを知る手段）としては、下記のとおり3種類ある。（squeuesは某スパコン独自の仕様）

## sinfo -s
　キュー名、ノードリスト、ノード利用状況の確認に。

```
$ sinfo -s -p d024h,d072h
　PARTITION AVAIL  TIMELIMIT   NODES(A/I/O/T)  NODELIST
　d024h        up 1-00:00:00       36/22/0/58  d[001-002,013-060,073-080]
　d072h        up 3-00:00:00        28/2/0/30  d[001-002,013-040]
```

=> ノード基準で利用状況を表示するので、複数キューに割り当てられた
　 ノードは各キューでそれぞれカウントされる(重複する)。
　 (d024hでジョブが実行されてd001が割当てられると、d024h/d072hそれぞれの "NODES(A)" が1減る)
=> PENDING中のノード数は "NODES" にカウントされないので、"NODES(I)" が十分でも実行されない可能性がある。

## squeues
　キュー別のノード利用状況の確認に。

```
$ squeues | grep -E "^Q|^d"
　QUEUE_NAME       TIMELIMIT   STATUS MAXNODES NNODES PEND RUN FREE
　d024h           1-00:00:00       up       58     20    6  14   22
　d072h           3-00:00:00       up       30     22    0  22    2
```
=> sinfoと違い、キューを基準とした利用状況が表示される。
　 d024hで実行された場合は、d024hの "RUN" にしかカウントされない。
　 (そのため "RUN" の数はsinfoの "NODES(A)" とは一致しない場合がある)
=> "NNODES" は "RUN" と "PEND" の加算値で、そのキューで要求されているノード数の合計(混み具合)を示す。
　 ("PEND" も含むため "MAXNODES" を超える場合がある)
=> "FREE" は空きノードを示すが、"PEND" が1以上であった場合には、基本的には先にPENDINGに
　 入ったものから実行されるため、"FREE" 以下を指定してもすぐに実行されない可能性がある。
　 "FREE" から "PEND" を除算した数を指定すれば先に実行される可能性は上がる。
=> ユーザが複数のジョブに(Dependency)をもたせている場合も、"PEND" として計上される。
## freenodes
　システム別の空きノードの確認に。

```
$ freenodes | grep "D sys"
　Number of free nodes in D sys. with FDR-IB connected is  22/ 58.
```

=> キューに拘らずシステム全体の空きノードを確認したい場合に使う。
=> squeuesで "FREE" を確認したほうが、より正確な目安になる。
Raspbian でキーマップの変更を毎回自動適用する


Raspberry Pi 2 に Bluetooth ドングルを刺して Nintendo Wireless Keyboard を繋いで使うのに、Caps と Ctrl を入れ替えたいので作業の記録

追記：

> Bluetooth のキーボードが再接続される度にキーマップが消えている事に気付きました。設定するべきは Bluetooth の再接続時のスクリプト！とわかったところまで。
> 
> 設定箇所はそのうち調べる。とりあえず再接続が起きたら `~/.config/lxsession/LXDE-pi/autokey.sh` を実行。
> 



## Ctrl と Caps の swap

~/.config/lxkeymap.cfg の option に `ctrl:swapcaps` を追加。

``` /home/pi/.config/lxkeymap.cfg
[Global]
layout = jp
variant = 
option = ctrl:swapcaps
```

複数指定する場合は `,` で区切ります。
例えば 

```
option = lv3:ralt_switch,ctrl:swapcaps
```

出典：[Raspberry Pi で学ぶ電子工作 補足情報] (http://raspibb.blogspot.jp/2015/04/caps-lockctrl.html)


## デスクトップ起動時に自動反映

なぜかリブートする度にキーマップを忘れてくれるので下記を設定。

``` /home/pi/.config/autostart/lxkeymap.desktop
[Desktop Entry]
Type=Application
Name=lxkeymap
Comment=Load international keyboard settings
NoDisplay=true
Exec=sh /home/pi/.config/lxsession/LXDE-pi/autokey.sh
NotShowIn=GNOME;KDE;XFCE;
```


出典：[changed keyboard layout does not survive reboot] (https://github.com/raspberrypi/rc_gui/issues/4#issuecomment-145331952)
COBOLでFizzBuzz

# 今だからこそCOBOL
何年か前にはDSLが流行り、そしてJVMのデファクトスタンダードなビルドツールGradleではGroovyやKotlinを使うことによって宣言的な記述でビルドルールを記述できます。
つまり世界は宣言的でわかりやすいコードを求めているということです。
そう、もうお分かりですね。宣言的な記述的の本家本元であるCOBOLの時代が来ています！
FPが提唱され、OOPが提唱され、そして時代は流れJavaの登場でようやくOOPが定着し、21世紀に入りFPが浸透してきました。
最先端を行くコンピュータ業界は常に温故知新な世界であります。
一周回ってCOBOLを真剣に学ぶ時代の到来であります。

# インストール
`apt-get install open-cobol`

# コード
```cobol:fizzbuzz.cob
000001 IDENTIFICATION                   DIVISION.
000002 PROGRAM-ID.                      HELLO.
000003 AUTHOR.                          koji.
000004 DATA                             DIVISION.
000005 WORKING-STORAGE                  SECTION.
000006 01 CNT PIC 9(3)                  VALUE 0.
000007 01 TXT1 PIC X(11)                VALUE "Hello COBOL".
000008 01 TXT2 PIC N(11)                VALUE "COBOLでFizzBuzz".
000009 01 FIZZ PIC 9(01)                VALUE 0.
000010 01 BUZZ PIC 9(01)                VALUE 0.
000011 PROCEDURE                        DIVISION.
000012     DISPLAY TXT1
000013     DISPLAY TXT2
000014     PERFORM 100 TIMES
000015         ADD 1 TO CNT
000016         COMPUTE FIZZ = FUNCTION MOD(CNT 3)
000017         COMPUTE BUZZ = FUNCTION MOD(CNT 5)
000018         IF FIZZ = 0 AND BUZZ = 0 THEN
000019             DISPLAY "FIZZ BUZZ"
000020         ELSE IF FIZZ = 0 THEN
000021             DISPLAY "FIZZ"
000022         ELSE IF BUZZ = 0 THEN
000023             DISPLAY "BUZZ"
000024         ELSE
000025             DISPLAY CNT
000026         END-IF
000027     END-PERFORM.
000028 STOP RUN.
```

# コンパイル
`cobc -x fizzbuzz.cob`

# 実行
`./fizzbuzz`
ビルドシステムなどで生成する/したファイルのディレクトリ名について

javascript のビルド周りについて色々調べていると、
ディレクトリ名がまちまちだったので自分はどうしようか決めるために調べてみた。

ちなみによくあったのは

- src/
- assets/js/ # ここらへんはサーバーサイドのフレームワークの要求だと思うけれど
- lib/
- dist/
- dest/

とかですかね、もっとあったような気がするけれど覚えてない・・・

個人的には

- 生成元 = src/
- 生成先 = dist/ or dest/

かな、と思ってたので、dist と dest について調べた。

- [デスティネーションとは - IT用語辞典](http://e-words.jp/w/%E3%83%87%E3%82%B9%E3%83%86%E3%82%A3%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html)
- [dist と dest の意味・違い](http://takunagai.github.io/post/comparison_dist_dest/)

dest のほうが良さそうなので、今後は dest/ にしようと思います。
HTML5のCanvasでアニメーションを作ってビデオ書き出しできるツールを作ったよ

HTML5のCanvasでアニメーションを作ってビデオ書き出しできるツールを作ってみました。
コマンドラインからの書き出しにも対応しています。

[github.com/dotneet/yes-we-canvas](https://github.com/dotneet/yes-we-canvas)

##なぜ作ったか
動的にビデオを生成したいだけなのですが、確立した簡単な方法が見つかりませんでした。
Canvasで作ったアニメーションがそのままビデオ書き出しできれば楽だなぁと思い作りました。

もし他に簡単な方法を知っている方がいらっしゃいましたら、ぜひコメントをください。

##機能
 - JavaScript(HTML5+Canvas)でアニメーションを作れる
 - ブラウザで簡単にアニメーションを確認できる(コード修正=>アニメーション確認のループが楽)
 - 作ったアニメーションをmp4に書き出し可能(ffmpegに依存)
 - コマンドラインからビデオ書き出しができる(PhantomJSを使用)
 - コマンドラインに変数を渡してビデオの書き出し内容を制御可能
 - 音声再生対応

## アニメーション作成例
構成は単純で init() と update() という関数を作成して、必要な初期化とアニメーションを記述するだけです。
FabricJSを使います。

```js:animation/sample.js
var rect = null;
animation.params = {
  size: 50
}
animation.init = function(config) {
  //this.audio.setSource('sample.mp3')
  config.width = 320
  config.height = 240
  config.frameRate = 24
  config.movieLength = 5

  // 矩形オブジェクトを作る
  rect = new fabric.Rect({
    left: 100,
    top: 100,
    fill: 'red',
    width: this.params.size,
    height: this.params.size
  });
  this.canvas.add(rect);

  var canvas = this.canvas
  fabric.Image.fromURL('img/bg_sample01.jpg', function(img) {
    canvas.setBackgroundImage(img);
    canvas.renderAll();
  });
}

animation.update = function(key) {
  //if ( key == 1 ) {
  //  this.audio.play()
  //}

  rect.left = 100 + key;
  rect.angle = key;
}
```

##アニメーションの確認
node src/server.js でサーバーを起動して http://localhost:8000/ を開くとアニメーションの確認や書き出しをする画面が表示されます。

<img width="425" alt="スクリーンショット 2016-05-31 18.16.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/6571/de13212e-c088-04d5-d578-eb5ec86a69aa.png">

##コマンドラインからビデオ書き出し
こんな感じでコマンドラインからビデオ書き出しできます。

```bash
phantomjs record.js
```

パラメータを指定してビデオ書き出し

```bash
phantomjs record.js param.json
```

```json:param.json
{
  "script": "sample.js",
  "params": {
    "size": 100
  }
}
```
Windows CMD.EXE コンソールで UTF-8 の入出力

scala (java も同じだけど) で UTF-8 のコンソール入出力をしたい場合は、起動時に -Dfile.encoding=UTF-8 をオプションとして付けるとよいみたい。
`> scala -Dfile.encoding=UTF-8 ...`

CMD.EXE で UTF-8 の表示をするには chcp 65001 すればよいのだが、素の CMD.EXE では、自分の環境だけかもしれないが monospace 有効(?)になっているらしく、表示が崩れてしまう。

こんな感じ。（本当は「实施例」と入力している）
![image](https://qiita-image-store.s3.amazonaws.com/0/121763/183851fd-c6a0-da84-5949-81d34618d05c.png)

仕方がないので、生の CMD.EXE はあきらめて ConEmu というのを使うことにした。
（公式ページ ⇒ http://conemu.github.io/）

実行するとこんな感じ。
![image](https://qiita-image-store.s3.amazonaws.com/0/121763/583f2fa2-da8b-2fd9-7f46-c6fa1db70a27.png)


でも、コンソールから入力した「实施例」がちゃんと表示できたのはいいけど、何も処理せずにプログラムが終了してしまった。
これは断じて自分のプログラムの問題ではなくて、 Windows の CMD.EXE の CON デバイスの問題（仕様？）らしい。つまり、CON デバイスから UTF-8 文字列を読み込もうとすると、そこで EOF になってしまっているようなのだ。（chcp 65001 の後 `> type con` とやって何か漢字を入力してみると分かる）

でもなぜか Cygwin の cat.exe は EOF にならずにエコーを返してくれる。
![image](https://qiita-image-store.s3.amazonaws.com/0/121763/89dd4ba3-26e5-ce04-8114-267f4669c7f9.png)

ということで、最終的には、次のようなコマンドラインとなった。
![image](https://qiita-image-store.s3.amazonaws.com/0/121763/6f8a4b1b-1486-f266-e8bd-5364812a52e6.png)
Slack初心者向け: あれこれと連携するまとめ

# はじめに

こんにちは。はじめまして。tarokamikazeです。
Slack便利ですね！ メールの代わりだけじゃなく、スニペットのやりとり、ふざけた画像のやりとり。
でもそれだけではもったいない。色んなものと連携させましょう。

まとめ記事なので、ほぼリンク集みたいなもんです。

# アプリのエラー通知

PHPを使っている方なら、[Monolog SlackHandler](http://qiita.com/imunew/items/d0c2066306094a872cbe)でバッチリ。
Symfony2.3 のプロジェクトだと、こんな感じで使えます。

```yaml:app/config/config_prod.yml
# 開発環境やテスト環境では動かしたくないので、config_prod.ymlに書くのがコツ。
monolog:
    handlers:
        main:
            type:         fingers_crossed
            action_level: critical
            handler:      grouped
            excluded_404s: ["^/"]
        grouped:
            type:    group
            members: [nested, buffered]
        nested:
            type:  stream
            path:  "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
        buffered:
            type:    buffer
            handler: slack
        slack:
            type: slack
            token: "%slack_api_key%"
            channel: "%slack_channel_name%"
            bot_name: PHP_ERROR
            icon_emoji: "%slack_monolog_icon%"
            use_attachment: true
            use_short_attachment: false
            include_extra: true
            level: critical
            bubble: true
```

```yaml:app/config/parameters.yml
    slack_api_key: 'my_api_key'
    slack_channel_name: '#my_channel_name'
    slack_monolog_icon: ':japanese_goblin:' # アイコン絵文字。おすきなものをどうぞ
```

# Redmine

[LIGさんの記事](http://liginc.co.jp/web/programming/other-programming/97710)に詳しいです。
チケットの新規作成だけじゃなく、更新のたびに通知がくるので、ちょっとうざい。

# GitLab

GitLab - Slack連携は、[こちらのQiita](http://qiita.com/txmy/items/975ef6e05842970fada0)の記事に詳しいです。

ソースをSaasに載せちゃダメ！ GitHub Enterprise高すぎ！　ということで
うちでは[GitLab](https://about.gitlab.com/) を使っています。
GitLab CE Omnibus package だとインストールがこけたので
[Docker版](https://github.com/sameersbn/docker-gitlab) を利用しています。
最近のGitLabは安定してきて、悪くないですよ。

# Jenkins

[こちらに詳しい](http://r9.hateblo.jp/entry/2014/01/26/145538)ですが、まだ試せてません。。。

# おわりに

いろんな開発ツールとSlackをつなぐと、うざいメールが来なくなって幸せですね。
ただ考えなしに連携させると、結局通知を見逃すことになると思います。
チャンネル指定や通知レベルのハンドリング等、考えながら足していったほうがよろしいかと。
（いろんな方が言っているとは思いますが）

**Slackはじめたばかりの人は、考えなしにつなげていけばいいんだよ！！**

随時追加していきます！
Xamarin StudioのAndroidのデプロイで即落ちしたり修正前のコードが動いたりする問題の対処法

Xamarin StudioでAndroid実機でデバッグ実行したときに以下の問題が発生

1. Detecting existing process というログと共に即落ちする
2. 実機が古いコードで動作する（最新の変更が反映されない）

1は何回か繰り返してるとうまく動作することもあるが不安定。
2は現在のコードのブレイクポイントの値がおかしなことになったりして毎回アプリのデータをクリアしてから実行する必要があって非常にストレスだった。

## 対処法

Androidプロジェクト → オプション → ビルド → Android Build

Use Shared Mono Runtime → Fast Assembly Deployment をチェックオフ

![スクリーンショット 2016-05-31 17.34.46.png](https://qiita-image-store.s3.amazonaws.com/0/99291/6e9efcaf-4d29-2344-8072-ff52cc2178e8.png)

今のところこれで問題なく動作するようになった。

## 参考

https://forums.xamarin.com/discussion/14029/xamarin-studio-debugger-crashes
FHS 自分用メモ

/bin
基本的なコマンドが配置される。このディレクトリにあるコマンドは一般ユーザでも実行可能。

/sbin
システム管理に必須のコマンドが配置されている。このディレクトリにあるコマンドはrootユーザでのみ実行が可能。

/etc
システムやアプリケーションの設定情報、スクリプトファイルなどが配置される。

/dev
ハードディスクやCD-ROMなどのデバイスファイルが配置される。

/lib
共有ライブラリやカーネルモジュールが配置される。/bin、/sbinにあるコマンドが必要とするライブラリはここに配置される。

/media
DVD-ROMなどリムーバブルメディアのマウントポイントが配置される。

/mnt
一時的にマウントするファイルシステムのマウントポイントが配置される。

/opt
パッケージ管理の仕組みを使ってプログラムがインストールされるディレクトリ。

/proc
カーネル内部の情報にアクセスするための仮想的なファイルシステム。

/root
rootのホームディレクトリ。/homeファイルシステムがマウントできなくなった場合でも、システムのメンテナンスを行えるように/homeとは別になっている。

/boot
起動に必要な設定やカーネルイメージが配置される。起動時にBIOSの制限を受けないようにするため、ルートファイルシステムとは別に、ディスクの先頭付近に配置されることがある。

/home
ユーザごとのホームディレクトリが配置される。

/tmp
一時ファイルが配置される。全てのユーザで読み書きが可能。

/var
ログファイル、メールやプリンタのスプールなど、頻繁に書き換えられるファイルが配置される。

/usr
コマンドやユーティリティなどが配置される。
ポアソン分布の確率質量関数を導出する

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">データ分析するのにポアソン分布の確率質量関数をソラで書ける必要なんてまったくないと思うんだけど。</p>&mdash; 職場で戦う美ホクソ戦士 (@hoxo_m) <a href="https://twitter.com/hoxo_m/status/730914935690027008">2016年5月13日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

などと言ったものの、ポアソン分布は基本的な分布なので導出できるようにはなっておきたい。

ポアソン分布は二項分布において、$np = \lambda$ を一定としたまま $n \rightarrow \infty$ としたときの分布である。
二項分布の確率質量関数は、

$$
\begin{align}
P(k) =& {}_nC_k p^k (1-p)^{n-k} \\\\
=& \frac{n(n-1)\cdots(n-(k-1))}{k!} p^k (1-p)^{n-k} \\\\
\end{align}
$$

である。まずは分子と分母に $n^k$ をかけて式変形する。

$$
\begin{align}
P(k) =& \frac{p^kn^k}{k!n^k} n(n-1)\cdots(n-(k-1)) (1-p)^{n-k} \\\\
=& \frac{\lambda^k}{k!} \frac{n}{n} \frac{n-1}{n} \cdots \frac{n-(k-1)}{n} (1-p)^n (1-p)^{-k} \\\\
=& \frac{\lambda^k}{k!} 1 (1 - \frac{1}{n}) \cdots (1 - \frac{k-1}{n}) (1-\frac{\lambda}{n})^n (1-\frac{\lambda}{n})^{-k}
\end{align}
$$

$n \rightarrow \infty$ とすると

$$
\begin{align}
\lim_{n \rightarrow \infty} P(k) =& \lim_{n \rightarrow \infty} \frac{\lambda^k}{k!} 1 (1 - \frac{1}{n}) \cdots (1 - \frac{k-1}{n}) (1-\frac{\lambda}{n})^n (1-\frac{\lambda}{n})^{-k} \\\\
=& \frac{\lambda^k}{k!} \lim_{n \rightarrow \infty} (1 - \frac{1}{n}) \cdots (1 - \frac{k-1}{n}) (1-\frac{\lambda}{n})^{-k} (1-\frac{\lambda}{n})^n \\\\
=& \frac{\lambda^k}{k!} 1 \cdots 1 \cdot (1)^{-k} \lim_{n \rightarrow \infty} (1-\frac{\lambda}{n})^n \\\\
=& \frac{\lambda^k}{k!} \lim_{n \rightarrow \infty} (1-\frac{\lambda}{n})^n
\end{align}
$$

ここで、

$$
e^{-x} = \lim_{n \rightarrow \infty} (1 - \frac{x}{n})^n
$$

を使うと、

$$
\begin{align}
\lim_{n \rightarrow \infty} P(k) =& 
\frac{\lambda^k}{k!} e^{-\lambda}
\end{align}
$$

が得られた。

したがって、ポアソン分布の確率質量関数は、

$$
\begin{align}
f(k) = \frac{\lambda^k e^{-\lambda}}{k!} 
\end{align}
$$

となる。
WPFの画面を追加した後にやっておくこと

#やること

* ViewModelフォルダの追加
* MainViewModelの追加
* MainWindow.xamlにnamespaceのエイリアス追加
* \<Window.DataContext>タグを追加
* 確認用にTitleをバインド
* Commandバインディング確認用にボタンを追加



#プロジェクト構成
![image](https://qiita-image-store.s3.amazonaws.com/0/117557/efff7b0f-f4fd-b2d1-aadd-ea89e1075990.png)

#コード

```xml:MainWindow.xaml
<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication4"
        xmlns:vm="clr-namespace:WpfApplication4.ViewModel"
        mc:Ignorable="d"
        Title="{Binding Title}" Height="350" Width="525">

    <Window.DataContext>
        <vm:MainViewModel />
    </Window.DataContext>
    
    <Grid>
        <Button x:Name="button" Content="Button" Height="30" Width="75" Command="{Binding TestCommand}"/>
    </Grid>
</Window>
```

```csharp:MainViewModel.cs
namespace WpfApplication4.ViewModel
{
    public class MainViewModel
    {
        public string Title { get { return "Hoge"; } }
        public WpfCommand TestCommand { get; private set; }

        public MainViewModel()
        {
            TestCommand = new WpfCommand(new Action(() =>
            {
                MessageBox.Show("ほげほげ");
            }));
        }

        public class WpfCommand : ICommand
        {
            public event EventHandler CanExecuteChanged;
            private Action act;

            public WpfCommand(Action act)
            {
                this.act = act;
            }

            public bool CanExecute(object parameter)
            {
                return true;
            }

            public void Execute(object parameter)
            {
                act();
            }
        }
    }
}
```

#実行
ウィンドウのタイトルがHogeになればおｋ
![image](https://qiita-image-store.s3.amazonaws.com/0/117557/d5ab10d5-7b96-b83c-8b09-00dcff20c861.png)

ボタンクリックでメッセージボックス表示
![image](https://qiita-image-store.s3.amazonaws.com/0/117557/cc855c92-3fcb-18e1-d135-ed32b9536bc4.png)
新旧のDocker ClientとDocker Machineを共存させて使い分ける方法

## TL;DR

`docker-machine create`の`--virtualbox-boot2docker-url`と、[getcarina/dvm](https://github.com/getcarina/dvm)

## Docker Machineで古いDocker Engine/Daemon入りVMをつくる

以下のように、`docker-machine create`のあまり知られていないオプション`--virtualbox-boot2docker-url`に、自分がほしいDocker Engine/Daemonと同じバージョンがついているboot2dockerのリリースバージョンを指定します。

例えば、Docker 1.9.1を利用したい場合、boot2dockerの全リリースのうち、Docker 1.9.1が含まれているのはv1.9.1です。

https://github.com/boot2docker/boot2docker/releases/tag/v1.9.1

なので、`--virtualbox-boot2docker-url`にはboot2docker v1.9.1のisoへのURLを指定します。

```
$ docker-machine create -d virtualbox --virtualbox-boot2docker-url=https://github.com/boot2docker/boot2docker/releases/download/v1.9.1/boot2docker.iso docker191
```

## 新旧のDocker Clientを使い分ける

Docker Machineで旧Docker入りVMをつくるだけだと不十分です。Docker Clientとの互換性がない場合があるからです。例えば、Docker Client v1.11でDocker Daemon v1.9.1と通信しようとすると、以下のようなエラーになります。

```
$ docker info
Error response from daemon: client is newer than server (client API version: 1.23, server API version: 1.21)
```

Homebrewで古いdockerを入れておいて、`brew switch docker`とかで切り替えるみたいな方法もあるみたいですが、もっと気軽に・・・rubyのrbenvみたいに切り替えられないものか…と思ったらありました。

[getcarina/dvm](https://github.com/getcarina/dvm)

Docker v1.11がインストールされたMac OS X上でDocker 1.9.1をインストールします。

```
$ dvm install 1.9.1
```

`dvm ls`でインストール済みのDockerクライアントバージョンを確認できます。

```
$ dvm ls
	1.9.1
->	system (1.11.1)
```

このままだとsystemとして認識されてるDocker v1.11.1が使われるので、1.9.1を使いたいときは `dvm use`で切り替えます。

```
$ dvm use 1.9.1
Now using Docker 1.9.1
```

無事、Docker Daemon 1.9.1と通信できました。

```
$ docker info
Containers: 9
Images: 59
Server Version: 1.9.1
...
```

## 余談: そもそも古いDockerいるの？

いるんですよね…。

例えば、2016/05/31現在、Kubernetesの最新版はv1.2.3ですが、その前提となってるDockerバージョンはv1.9.1だったりします。KubernetesとDockerのバージョンがあってないと、Datadogのエージェント[dd-agent](https://github.com/DataDog/docker-dd-agent)でKubernetesのメトリクスにpod名のタグがついてくれない（メトリクスがどのPodのものか区別できない)という地味だけど致命的な不具合につながったりします。

他にも、Docker Composeの最新版v1.7.1でv1のdocker-compose.ymlを利用しようと思ったら、Docker Engine v1.9.1が必要です[^1]。

[^1]: [リリースノート](https://github.com/docker/compose/releases/tag/1.7.1)に書いてあった

## 余談: boot2docker v1.9.1

色々問題があるらしいので、devicemapperを使うオプションをdocker-machine createに渡したほうがいいかもしれません。実害があったら試してみます。

https://github.com/docker/docker/issues/18180#issuecomment-193708192
http://qiita.com/moutend/items/18682948811175ed0e1d
apacheとphpを入れた環境でphpが動作せずにソースコードのまま表示される時

apache,phpを単に入れただけではphpは動きません。
apacheの設定に手を加える必要があります。

# apacheの設定を修正
※ こちら@oh-sky様のコメントを参考に修正しました。

```
[root@test-web ~]# vi /etc/httpd/conf/httpd.conf 
```

以下項目を追加
参考 : http://php.net/manual/ja/install.unix.apache2.php

```httpd.conf
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
```

## ついでにやっておいた方が良い設定
だいたい400行目あたりに「DirectoryIndex」という項目がある。

```httpd.conf
DirectoryIndex index.html index.html.var
```

「index.php」を追記

```httpd.conf
DirectoryIndex index.html index.html.var index.php
```

# apacheの再起動

```
[root@test-web ~]# /etc/init.d/httpd restart   
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

[root@test-web ~]# 
```
Shinyで2つのInputから1つのOutputを操作する


## はじめに

- Shinyでアプリケーションを作っていると、2つのInputから１つの同じアウトプット先を変更したいことがあります
	- 例：2つのインプットから、同じテキストレンダリングの値を変えたいなど
- ちなみに、1つのアウトプットから、2つのOutputを変えるのは、```reactive()``` を使うなどで簡単にできる
- 正しいやり方なのかは不明ですが、動いたものを共有します

## コードの例

```server.R
# 2つのobserve()
observe({
    input$date
    output$create_date <- renderText({ 
      paste0("　作成日：", format(isolate(input$date),"%Y/%m/%d"))
    })
})
observe({
    input$date_slider
    output$create_date <- renderText({ 
      paste0("　作成日：", format(isolate(input$date_slider),"%Y/%m/%d"))
    })
})
```

```ui.R
# Input 選択が2つ
dateInput('date',
          label = '日付選択:',
          value = Sys.Date() - 1
),
sliderInput(inputId="date_slider",
            label="日付アニメーション選択:",
            min=Sys.Date() - 7,
            max=Sys.Date(),
            value=Sys.Date(),
            step = 1,
            animate=animationOptions(interval=1500, loop=T),
            timeFormat = "%F"
)

<snip>

# Output 先
textOutput("create_date")
```

## 解説
- ```observe``` で2つのInputに変更があるかを確認するようになる
- ```isolate``` で囲まれているInputに変更がなければ実行されない

## 参考
- [Shiny Cheatsheet](http://brain.cin.ucsf.edu/~craig/rstuff/Shiny_Cheatsheet.pdf)
DatePickerDialogメモ①



#日付情報の初期設定
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR); // 年
        int monthOfYear = calendar.get(Calendar.MONTH); // 月
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 日

        Log.d("aaa",String.valueOf(d));

#ok押した時の処理
        DatePickerDialog.OnDateSetListener DateSetListener = new DatePickerDialog.OnDateSetListener() {
            //okボタンを押したときの年月日を取得できる
            public void onDateSet(android.widget.DatePicker datePicker, int year,
                                  int monthOfYear, int dayOfMonth) {

                //押されてる日時を変数へ
                y=year;
                m=monthOfYear;
                d=dayOfMonth;

            }
        };

#表示
        // 日付設定ダイアログの作成・リスナの登録
        datePickerDialog = new DatePickerDialog(this, DateSetListener, y, m, d);

        // 日付設定ダイアログの表示
        datePickerDialog.show();
Angularjsで input type="number" を使うとコンソール側でエラーがでるやつ


angularを使ったformで``<input type="number"> ``フォーマットを使うとき

引用：　https://docs.angularjs.org/error/ngModel/numfmt

## ディレクティブの作成

```:controllers/directive/stringToNumber.js
/**
 *  controllers/directive/stringToNumber.js
 */

;(function() {
  'use strict';

angular.module('webApp')
  .directive('stringToNumber', function() {
    return {
      require: 'ngModel',
      link: function(scope, element, attrs, ngModel) {
        ngModel.$parsers.push(function(value) {
          return '' + value;
        });
        ngModel.$formatters.push(function(value) {
          return parseFloat(value, 10);
        });
      }
    };
  });

})();

```


## 使い方


```:index.html
<input type="number" string-to-number ng-model="account_number">
```
SSDをパソコンに換装し起動ドライブにする方法

今日は、<a href="https://jp.easeus.com/partition-manager-software/free.html" >EaseUS Partition Master</a>を使って、SSDをパソコンに換装し起動ドライブにする方法を紹介します。
1.まずは、用意したSSDをパソコンに接続します。
2.ソフトの初期画面で「OSをSSD/HDDに移行する」を選択します。
3.SSDをあて先ディスクに指定します。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/124905/ee8c627d-ae9b-dee5-3c5d-926e58b6afbf.png)

4.あて先ディスクのすべてのパーティションを削除します。
![22.png](https://qiita-image-store.s3.amazonaws.com/0/124905/fd5d6920-3097-211a-3e18-d46d1461feda.png)

*新品のSSDなら問題ないですが、もしSSDにはパーティションがあれば、削除しないとOSの移行がうまくいけません。
5.SSDの状態が表示されています。パーティションをリサイズするのはできますが、SSDに移行するので、「SSDを最適化する」を選択しておけば大丈夫です。
6.SSDの状態を確認してから、「完了」をクリックします。
![44.png](https://qiita-image-store.s3.amazonaws.com/0/124905/2b651bb3-2953-75f1-7f49-8eb960b6545b.png)

7.最後に操作を適用するのを忘れないでください。

ディスククローンのほか、このPartition Masterは[パーティション変更](https://jp.easeus.com/partition-manager/resize-partition-windows-10.html)にも対応できます。 

ご注意:
万が一に備えるには、[バックアップソフト](https://jp.easeus.com/backup-software/free.html)等を使って、大事なファイルをバックアップしておくこともオススメです。


ダウンロードはこちらへ：
https://jp.easeus.com/partition-manager-software/free.html
c++ builder > Assertion failed: (vbFlag && (errPtr->ERRcInitDtc >= ...

```txt:動作確認
C++ Builder XE4 on Widows 7pro
```

XE4で実装したソフトの動作試験中、以下のようなエラーメッセージに遭遇した。

```
Assertion failed: (vbFlag && (errPtr->ERRcInitDtc >= varType-
>tpClass.tpcDtorCount)) || (!vbFlag && (errPtr->ERRcInitDtc >= 
varType->tpClass.tpcNVdtCount)) || flag, file xx.cpp, line3292
```

検索してもいまいちはっきりしない。

http://forums.radioreference.com/voice-control-channel-decoding-software/279277-pro96com-error-any-ideas.html

AnsiString関連の不具合だろうか。 http://qc.embarcadero.com/wc/qcmain.aspx?d=18852

### System.pasの該当部分
(追記 2018/02/13)

上記のメッセージでは3292と記載しているが、3293かもしれない。

System.pasの該当部分は以下のようになっている (3292行目から)。

```txt:(3292,3293)
procedure _LStrSetLength(var Str: _AnsiStr; NewLength: Integer; CodePage: Word);

```

`_LStrSetLength()`関連の不具合なのかもしれない。
Camundaのタスクリストを日本語化する方法

[Camunda](https://camunda.org/)は軽量でディベロッパーフレンドリーなオープンソースのBPMエンジンです。

Camundaは、一般ユーザーが使うことの最も多い「タスクリスト」、管理者的なユーザーが使う「Admin」「Cockpit」の３つの画面で構成されています。
そのうちの「タスクリスト」の日本語化ファイルを作って[プルリク](https://github.com/camunda/camunda-tasklist-translations/pull/11)を投げたら、先ほどマージしてもらえたので、日本語化の手順を共有しておきます。
（Camunda自体のインストール方法などは、[こちら](https://camunda.org/download/)。ダウンロードして解凍するだけです。）

# 日本語化の手順

(インストールとサーバの起動は終わっていることを前提とします。)

1. `{{CAMUNDA_FILE_NAME}}/server/{{TOMCAT_NAME}}/webapps/camunda/app/tasklist/locales/` 直下に [ja.json](https://github.com/camunda/camunda-tasklist-translations/blob/master/locales/ja.json) を置く。

2. `{{CAMUNDA_FILE_NAME}}/server/{{TOMCAT_NAME}}/camunda/app/tasklist/scripts/config.js` の `var camTasklistConf = {` の直下に、下記のように `"locales": {` から始まる４行を追記する。

```
var camTasklistConf = {
  "locales": {
     "availableLocales": ["en", "ja"],
     "fallbackLocale": "ja"
  },
  (以下略)
```

※ サーバの再起動は不要です。

※ `{{CAMUNDA_FILE_NAME}}`と`{{TOMCAT_NAME}}`はインストールしたバージョンに応じて適宜読み替えて下さい。

```
(例)
CAMUNDA_FILE_NAME = camunda-bpm-tomcat-7.5.0-alpha4
TOMCAT_NAME = apache-tomcat-8.0.24
```

# 設定の意味

`availableLocales`で設定されている言語のうち、ブラウザのデフォルト設定になっている言語があれば、その言語を反映します。
ブラウザのデフォルト設定になっている言語がない場合は、`fallbackLocale`で設定されている言語が反映されます。


# 動作確認

上手くいっていると、下記のようにナビゲーションやメニュー項目等が日本語化されるはずです。

<img width="1517" alt="Screen Shot 2016-05-31 at 16.39.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/36429/8008fcb1-2919-d5d7-bc60-0ae99018c027.png">
CSSの詳細度について考える 


CSSの詳細度について思う所、わかったような気がする事を「きっとこうだろう」ベースでまとめたもの。

気になる点などがあればガシガシ突っ込んで貰えると嬉しいです。

## 詳細度が高いと何が問題なのか？

値が上書きできない。

→ 上書きするためにには 同じ or それ以上の詳細度ポイントを稼がなければならない。

詳細度の高い記述の後に詳細度の低い記述が来ると…

→ 直感的に見て理解しづらいCSSの構造ができあがってしまう。

## 詳細度グラフの計測

https://jonassebastianohlsson.com/specificity-graph/

詳細度は緩やかな右上がりのカーブになっているのが理想的

詳細度とは別にCSSには「コードの記述順」という概念もある。

下方のコードが上方のコードを上書きする構成、が理想的。

## 詳細度グラフの適切な管理

SCSSなどを使って複数ファイルを連結すると意識が飛びがち

ポイント

- 子孫セレクタの乱用を避ける(適用範囲の限定にしても2段階で十分)
- 直接importしない(急激な詳細度低下の)

## 子孫セレクタの乱用を避ける

子孫セレクタの利用はCSSパフォーマンスを低下させるだけでなく、
親子階層内でのむやみなプロパティの上書き合戦を招きがち。

スキンのスタイリングを確実に末尾nodeで指定するようにし、
親階層での指定は構造の定義に留めるのが良さそう。


Bad pattern 

````:article.scss
.article{
    .title{
        font-weight: bold;
        .evecatch{
            width: 100%;
        }
        .subtitle{
            font-weight: 100; // 上書き合戦
            color: gray;
        }
    }
}
````

Good pattern 

````:article.scss

.article{
	// スキン
    .maintitle{
        font-weight: bold;
    }
    .subtitle{
        font-weight: 100;
        color: gray;    
    }
    // 構造
    .evecatch{
        width: 100%;
    }
}
````


## 直接importしない

直接importすると、import先で急激な詳細度の低下が起こるかも知れない。

ある程度の詳細度を稼ぐ事が前提のブロックでは、直接`@import`するのでなく、コンテキスト内での`@import`を行う。


Bad pattern 

````:common.scss

@import "article"
````

````:article.scss

.article{
    .title{
        font-weight: bold;
    }
}
````

Good pattern 

````:common.scss
.article{
    @import "article"
}
````

````:article.scss
.title{
    font-weight: bold;
}
````

先ほどの子孫セレクタの乱用を…と併せて使うとSCSSのネスト機能を一切使わないという選択肢もありそうです。

## BEMの伝えたかった事

詳細度の管理において、BEMの様な単一class名の設計は非常に重要です。

一部ではCSSの適用範囲を適切に限定するために、子孫セレクタを乱用する(特にSCSSを利用する環境上では)傾向が見られがちでしたが、詳細度の問題やCSSパフォーマンスの観点を考えると、これは余りいい方法とは言えません。

BEMの様な冗長な命名規則を用いないにしても、CSSの適用範囲を限定するには少なくとも２階層程度の制約がアレば十分そうなものなので、CSSセレクタの定義は以下の様な親子関係程度に留めることが出来そうです


````
.{名前空間} .{要素セレクタ}[.{modifier}]
````

## OOCSSの伝えたかったこと

子孫セレクタを乱用する中で生じるもう一つの問題は、子孫ツリー上でのプロパティの継承合戦です。

この点に関してOOCSSは「デザインのオブジェクト指向」、「スキンと構造の分離」という便利な観点を提供してくれます。

デザインをひとまとまりで考えるのではなく、スキンと構造というひとまとまりの組み合わせを、オブジェクトに適用させる、と言うのは非常に大事な観点になってきます。

DOMの子孫関係とCSSの子孫関係を常に同じに考える必要はありません。ココのDOMが(親ではなく)自らにつけられたClass名を起点にスタイリングされる、ということは非常に重要な意味とわかりやすさを提供してくれます。

全てのデザインがHTMLの親子関係とは分離され、「構造」「スキン」の２要素のクラス名の組み合わせで定義される時、きっとCSSは理解しやすく、またメンテナンス性の高い多くの変更に耐えうる構造になると思います。
RedmineとSlackを連携させて新しいチケットが発行されたら通知するBotをRubyで作ってみる

# SlackAPIのGem導入

以下のコマンドを実行

```
# gem install slack-api
```

# SlackBOT用のトークン取得

以下のURLにてトークンを生成

https://api.slack.com/web

# RedmineのAPIアクセスキー入手

個人設定の画面にて、右側にあるAPIアクセスキーを作成

# スクリプト作成

以下のスクリプトを作成

```rb:/home/scripts/slack.rb
#!/usr/local/bin/ruby
# encoding: utf-8

require 'json'
require 'uri'
require 'net/http'
require 'date'
require "slack"

uri = URI.parse('https://[Redmineのアドレス]/issues.json?sort=updated_on:desc&key=[APIアクセスキー]')
json = Net::HTTP.get(uri)
result = JSON.parse(json)

filename = "/home/scripts/redmine.txt"

f = open(filename, "r")
tmp = f.readlines[0]
f.close

Slack.configure do |config|
  config.token = "[SlackBOT用トークン]"
end

id = 0
updated_on = ""

result["issues"].each do |row|
  
  if id == 0 then
    id = row["id"].to_i
    updated_on = row["updated_on"]
  end
  
  if DateTime.parse(row["updated_on"]) > DateTime.parse(tmp)
    text = "[Redmine新着情報] " + row["project"]["name"] + ":" + row["subject"]
    if row.has_key?("assigned_to")
      text += "(#{row["assigned_to"]["name"]})"
    end
    Slack.chat_postMessage(text: text, username: 'Redmine', channel:'#redmine')
  end
  
end

f = open(filename, "w")
f.write(id)
f.close
```

以下のコマンドを実行

```
$ touch /home/scripts/redmine.txt
```

# cronに登録

以下のコマンドを実行

```
# crontab -e
```

「i」キーを押し、下記のとおり入力

```
*/15 * * * * /usr/local/bin/ruby /home/scripts/redmine.rb
```

入力後、「:wq」と入力しエンターキーを押す
次に、以下のコマンドを実行

```
# service crond restart
```

# テスト

チケットを追加し、最長15分以内にSlackへ投稿されることを確認
Navicatのセミナー

![Screen Shot 2016-05-23 at 16.05.07.png](https://qiita-image-store.s3.amazonaws.com/0/89379/d11ae75e-d752-a359-11cd-7c596cc2cfc9.png)

日時：2016年6月9日（木）19:30～21:00
場所：〒163－1326 東京都新宿区西新宿6-5-1 新宿アイランドタワー 22F
参加費：無料(事前登録制）
木曜日だけど、無料のセミナーだから、行ってみようか……

ご参考：http://sosl.connpass.com/event/32102/