OmniAICreator/Qiita-1.07M huggingface dataset:
2本指の回転ドラッグ操作で回転判定

## 目的
Unityで2本指の回転ドラッグ操作で回転判定をしたい．
画面の回転，オブジェクトの回転などで利用することを想定．

## 方法
2点間からなる角度を算出をして，前回の結果と比較して判定する．



## コード
`Input.GetTouch()`でタッチした位置を取得

```csharp


enum RotateDirection {
  NONE,
  LEFT,
  RIGHT
}

int _preDegree;  //前回の角度を保持

void MultiTouch () {
  Touch touch1 = Input.GetTouch(0);
  Touch touch2 = Input.GetTouch(1);
  Vector2 pos1 = touch1.position;
  Vector2 pos2 = touch2.position;

  RotateDirection rotateDirection = GetRotateDirection (pos1, pos2);

  if (rotateDirection == RotateDirection.LEFT) {
    Debug.Log ("左回り");
  } else if (rotateDirection == RotateDirection.RIGHT) {
    Debug.Log ("右回り");
  } else {
    // 回転なし
  }
}

RotateDirection GetRotateDirection (Vector2 pos1, Vector pos2) {
  // x座標の位置でpos1とpos2を入れ替える
  if (pos1.x > pos2.x) {
    Vector2 tmp = pos1;
    pos1 = pos2;
    pos2 = tmp;
  }

  float dx = pos2.x - pos1.x;
  float dy = pos2.y - pos1.y;
  float rad = Mathf.Atan2 (dy, dx);
  int degree = Mathf.RoundToInt (rad * Mathf.Rad2Deg);
  RotateDirection rotateDirection = RotateDirection.NONE;
  if (degree - preDegree > 0) {
    rotateDirection = RotateDirection.LEFT;
  } 
  if (degree - preDegree < 0) {
    rotateDirection = RotateDirection.RIGHT;
  }
  preDegree = degree;
  return rotateDirection;
}


```


# 参考
[【Unity2D】2点間の角度を求める](http://qiita.com/2dgames_jp/items/60274efb7b90fa6f986a)
Bitbucket git ローカルに作ったリポジトリをpush

Bitbucketの「リポジトリ」から「リポジトリの作成」をする。
出来上がったリポジトリの「概要」-「私はゼロからスタートします。」にリポジトリのURLが記載されているので、

ターミナルからローカルにあるリポジトリへ移動し、

1.git remote add origin 上記URL
2.git remote -v で、push先が正しく設定されているか確認
3.git push origin master で masterをpushする

1.で既にremoteが設定されている場合は、
git remote set-url origin URL　で変更可能
Mac | 「Google日本語入力」 で Tab キーを使ってもキーワード候補が選べない

アプリによっては仕方ないらしい。「下キー」を使おう。

>*Mac OS X 上で TAB キーを押してもサジェストが選択できない。*
>
>Mac OS X の一部のアプリケーションでは TAB キーからサジェストを選択する機能が利用できないことがあります。これは、アプリケーションが TAB キーに割り当てたショートカットと Google 日本語入力がサジェストに割り当てたキーが衝突することにより生じた問題です。下向きカーソルキーでもサジェストの選択ができるので、こちらをご利用ください。なお、現在のところ iTunes と Adium がこの問題に該当することが判明しています。

https://support.google.com/ime/japanese/answer/2796482?hl=ja

# 環境

- Google日本語入力 2.17
- Mac OS El Capitan 10.11.4



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Excelからのファイルの切り出し

大量のファイルをExcelの一つのシートにまとめて渡すという狂気に満ちたことをされた時の切り出し手順。とりあえずなメモ。

###Excelからテキストへの変換
渡されたのは A 列にファイル名、B 列にファイル内容のテキスト、というシート。

このシートをまるごとテキストファイルにコピーして、

1. ```\r\n``` を ■ に置換
2. ```\n``` を □ に置換
3. ■ を ```\r\n``` に置換
4. \t 周囲のダブルクォートの削除

という処理を行った。

これで、1行につき 1ファイル のテキストにできた。
幸いにして、ルールを外れる行はなかったのでこれで済んだ。

###ファイルへの切り出し
以下のスクリプトを用いてawkで切り出した。

```awk
#!/usr/bin/awk -f	
BEGIN  { FIELDWIDTHS = "28 1024" }	#編集中の見やすさ的に固定長にした名残
NR {
	fname=$1;	#ファイル名。
	sub(/[ \t]+$/,"",fname);	#行末空白の削除
	#print "1:"fname ":";
	
	#print "2:"$2;
	str=$2;		#str はファイル内容。
	gsub(/□ +/,"\n    ", str);	#改行文字をもとにもどす。
	gsub(/□/,"\n", str);
	#print str;
	
	print str > fname	#ファイルの出力
}
```

終わり。
RedshiftとAmazon Machine Learningの連携


をしようと思っている人に豆な情報

Machine Learningはバージニアとアイルランドリージョンのみで動いている
---

Amazon Machine LearningはS3との連携（必須）、Redshiftとの連携（Datasourceとして）ができるのですが、これらのregionをMachine Learningが動いていないところで作ってしまうと

とDatasource作成時に、

~~~

The specified Amazon Redshift cluster and S3 staging location must be in the same region.

~~~

と言われるので注意

なので、S3・Redshiftはバージニア（orアイルランド）でつくりましょう。


RedshiftのPublicly AccessibleはYesに
---

Amazon Machine Learningから、Redshiftを連携させるためには、
**Publicly Accessible**がYesになっていないと連携できないので注意


Redshiftにはユニークキー制約はかかりません。
---

公式にあるとおり、
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/t_Defining_constraints.html


~~~
一意性、プライマリキー、および外部キーの制約は情報提供のみを目的としており（ｒｙ
~~~

テーブルに情報として、ユニークキーはなにかを表示することはできるが、それが作動するとは言っていないので

### 同じユニークIDをもつレコードはどんどんはいるので注意
Alamofire で安易にresponse.descriptionをログってはいけない

# 概略
`response.description`はファイルの中身の情報を含むので、大きなファイルでこれをログると大きな計算コストがかかります。

# 経験談

なにか処理を終えたときに、なんとなくNSLogでdescriptionのログをとりたくなります。
今回もそういうつもりで↓のようなコードを書いていました。

```swift
Alamofire
    .request(.GET, appDelegate.downloadURL)
    .responseData(completionHandler: { response in
        NSLog(response.description) // とりあえずログる
        // 以下 response.data の処理
    })
```

**環境**

* iPod touch 第6世代 (1GB RAM)
* 90MBのzipファイル

**結果**

* Received memory warning 表示後まもなくしてクラッシュ
* ログ出力はなにも表示されない
* シミュレータで、およそ800MBのメモリ使用量

# 感想

ほかのライブラリにも当てはまると思いますが、考えなしになんでもログっちゃいけないんだなと思いました。
iOS シミュレータに写真や動画をドラッグアンドドロップするとカメラロールに保存される

![20160502114505_ios_simulator_photos_drag](https://cloud.githubusercontent.com/assets/2177378/14947657/b22fcec2-1071-11e6-8836-395bc1800475.gif)

ファイルを複数選択して同時に取り込むこともできます。

iOS アプリ開発時に、写真や動画をアップロードする処理をシミュレータから確かめることができて便利です。
Vagrant 導入手順

Vagrantを使う際の手順を簡単にまとめてみた。
自分の備忘を兼ねて。


## 1.ダウンロード／インストール（vagrant）

```ruby:ダウンロード／インストール
下記Webサイトよりvagrantをダウンロード。
　　https://www.vagrantup.com/downloads.html

ダウンロードした製品をインストール。
```

## 2.ダウンロード／インストール（Virtualbox）

```ruby:ダウンロード／インストール
下記WebサイトよりVirtualboxをダウンロード。
  https://www.virtualbox.org/wiki/Downloads

ダウンロードした製品をインストール。
```

## 3.vagrantのバージョンを確認

```ruby:vagrantのバージョンを確認
  # vagrant -v
```
「Vagrant x.x.x」と表示されるはず。
バージョンは最新版であれば問題ないかと。
WindowsOSの場合は、パスが通っているかもここで確認しておく。


## 4.イメージファイルの取得／登録

```ruby:イメージファイルの取得／登録
  # vagrant box add <box名> <URL>
```
仮想マシンのイメージファイルをインターネットから取得し、
Vagrantへ登録する。

この時、box名は任意でOK。
会社の規定で、プロキシサーバの指定がある場合は事前にプロキシの設定が必要。
プロキシの設定はコマンドプロンプトから実行するのがスマート。

Windowsの場合こんな感じ。

```ruby:Windows
 DOS> set HTTP_PROXY=<ユーザ名>:<パスワード>@<プロキシサーバ名>:<ポート番号>
```

職場から利用する場合、会社によってはプロキシサーバを明示指定せず、
自動構成スクリプトで割り振っていることもあるので、
ブラウザから対象pacにアクセスし、読み取る。


## 5.Vagrantの管理リポジトリに登録されたイメージファイルをリストする。

```ruby:イメージファイルリスト
# vagrant box list
```
手順4で作成したbox名がリストされる。



## 6.仮想マシンを作成するディレクトリを作成する。

```ruby:ディレクトリ作成
    # mkdir <仮想マシン名>
```

## 7.作成した仮想マシンディレクトリに移動する。

```ruby:ディレクトリ移動
    # cd <仮想マシン名>
```


## 8.Vagrantfileを作成する。

```ruby:Vagrantfileを作成する。
    # vagrant init <box名>
```

ここでは管理リポジトリに登録した<box名>で指定をする。
<box名>を誤ると仮想マシンが起動できなくなり、後で手動にてVagrantfileを修正することが必要。


## 9.仮想マシンを操作する。
実際に仮想マシンを操作してみる。
仮想マシンの操作は、ざっくりと以下の通り。

| 操作    　  | Command | 
|:-----------|------------:|
| 起動       | vagrant up |
| 停止|     vagrant halt | 
| 状態確認|  vagrant status |
| 一時停止|  vagrant suspend |
| 再起動| vagrant reload | 
| 削除| vagrant destroy |


## 10.起動した仮想マシンに接続する。
vagrant upで起動した対象サーバに接続してみる。
Windowsでは、teratermなどが必要。


また思い出したら書こう。
Selenium関連のBlogを探してみる

# はじめに
技術の進歩はすさまじく速いのはいまさらですが、テストツールでいくと革新的なツールというのはバンバン出てくるものではなく、むしろ限られた選択肢の中から、創意工夫をして使うというシーンのほうが多いと思います。Selenium関連でいうと新技術というよりも、ブラウザーのバージョンアップに追随していくことがメインで、新機能追加は少なく思います。

## あれをしてみたい！
と、思った時「車輪の再発明」することはないので、G先生にお伺いを立てるわけです。（先生は答えをそのまま教えてくれることも少なかったりしますが）

## Selenium関連のBlogを調べてみる
文頭にも書きましたがあまりに更新されていないところは情報も古いので「ここ１年以内で更新があったところ」という条件で、先生に聞いてみました。

とりあえず公式
[Official Selenium Blog](https://seleniumhq.wordpress.com/)

- もっと更新してくれるとうれしんですけどね。
 
[Really Simple Thoughts of a Perpetual Learner ](http://blog.reallysimplethoughts.com/)

- いろいろなIDEのプラグインを開発・発表されています。スケジューラ機能もこの方でした。

[Rantings of a Selenium Contributor](http://jimevansmusic.blogspot.jp/)

- IEDriverなど　microsoftブラウザのコントリビューターのエバンスさんのブログ

[Sauce Labs](http://sauceio.com/)

- ここも言わずと知れた、ですね。

### もっといろいろ

ブログサイトなので内容については珠玉混合だと思います。また、語学力がある方で「このサイトは全然違う！」などあればご指摘ください。

| 名称 | URL| 最終更新日 |
|:-----------|------------|:------------:|
| Assert Selenium |  http://www.assertselenium.com/ | 2016/02/20 |
| WatirMelon | https://watirmelon.com/ | 2016/04/29   |
| My Thoughts  | http://www.mythoughts.co.in/ | 2016/03/06 |
| Selenium Simplified | http://seleniumsimplified.com/ | 2016/04/00 |
| A Space for Automation Enthusiasts |http://blog.varunin.com/|2015/02/00 | autumnator | https://autumnator.wordpress.com/ | 2016/03/02 |
|The Automated Tester|http://www.theautomatedtester.co.uk/|2016/03/01|
|My CMS|http://it-kosmopolit.de/|2015/12/09|
|VGP::Miami |http://vgp-miami.blogspot.jp/|2015/12/04|
|Blargon7|http://blargon7.com/|2016/02/09|
|Mr. Selenium |http://mrselenium.blogspot.jp/ |2016/02/17|
|Element34|http://element34.ca/?cat=blog|2015/12/03|
|the urban canuk, eh |http://www.bryancook.net/|2015/12/04|

## 最後に
普段から「ちらっと」でも眺めていれば、「いざっ」という時にヒントになるかもしれません。
ES6のPromiseはBluebirdの４倍遅いらしい

# benchmarkページから
ES6で標準搭載されたpromiseはbluebirdよりも遅いしメモリを食うらしい、というのを初めて知った。

きっかけはQとbluebirdのパフォーマンス比較を調べていた時に偶然見つけた以下の記事。

bluebirdのGitHubにbenchmarkページがあった。
[https://github.com/petkaantonov/bluebird/tree/master/benchmark](https://github.com/petkaantonov/bluebird/tree/master/benchmark)

処理を１万回並列に実行したら、
ES6 promiseはbluebirdの４倍、
Qは４０倍スピードの差があったらしい。

なぜ差が出るのか？について質問していた人がいた。
Why are native ES6 promises slower and more memory-intensive than bluebird?
[http://programmers.stackexchange.com/questions/278778/why-are-native-es6-promises-slower-and-more-memory-intensive-than-bluebird](http://programmers.stackexchange.com/questions/278778/why-are-native-es6-promises-slower-and-more-memory-intensive-than-bluebird)

速度の最適化をしているかどうかってことだろう。動作環境も関係しているみたいだけど。
Qとbluebirdの差異については、目的の違いによるものらしい。速度を取るか、安全性を取るか。

Q vs. Bluebird performance
[https://github.com/petkaantonov/bluebird/issues/381](https://github.com/petkaantonov/bluebird/issues/381)
>As far as I know, its because one of the primary goals of Q is to provide certain security properties of promises in browsers. Bluebird on the other hand is designed for performance, to be used in environments such as node where the entire code is fully trusted.

実装するならサーバーサイドはbluebirdで、クライアントサイドはQってことだろうか。
Amazon Machine Learningで	scheme作成が一向にうまく行かなかった話



やりたかったこと
---

RedshiftにあるデータをMachine Learning(以下ML）のDatasourceとして読み込む。

書いたSQLは

* 外部結合５回
* 行数5,000万レコードに対して、色々モニョモニョ計算をしている

結果、以下のようなエラーメッセージ

~~~
We can't connect to the service..Try again later, or refresh your browser. 
Status code: Not available
Error code: 1c65d3504
Error message: Not available 
~~~


どうすればいいんだ状態
---

* クエリパフォーマンスを最適化する？
  * SQL不得意なのでパス
* シングルクラスターでRedshiftを動かしていたので、マルチクラスターに。
  * 1→2に増やしましたが、費用が怖くなったので、これ以上ノード数を増やすのはやめました。

解決（とりあえず？）
---

* Machine Learningが発行したSQLはRedshiftの管理画面でみると時間はかなり食うが成功している。
* 実行時間をなんとか短くしてあげれば、いけそう・・・？


# SQL結果を格納するテーブルをつくりました。

これで一応問題なく、datasourceがつくれるようになりました。
Vimで一定文字数で改行する

# Vimで一定文字数で改行する
検索すると正規表現で一定文字数で改行する方法はいろいろ出てきたのだけど、記号をエスケープするとかしないとか、Vimで動かせなかったのでメモ
50文字で改行するとしたら以下の通り

```
%s/.\{50}/&\r/g
```

波閉じカッコはエスケープしてもしなくても良い模様
筋トレLOVEな文系女学生のJava入門_カプセル化_getterとsetter

#はじめに
好きな人とドライブする際・・・ 緩めのスピードで走行するのがおすすめ:sparkling_heart: :grey_exclamation: 
理由としては、小刻みな特定周期の振動・ほんの少し触れれている感じは女性に強烈な快感を与えるからです。
地面のちょうどいい振動とカーブを曲がる時の重力とかが合わさって女性に快感を与えることが研究で発表されているそうです。これで :heart: :heart: :heart: している時と同じ快感を与えることができるんですって :exclamation: 

超会議の超チャンネル生放送２０１６っていうブースでメンタリストDaiGoが上記のことを話していました :grin: :grin: 

今回はgetterとsetterについでです。
独学でやってるので、「これはJavaやっていくにあたって役に立つ知識だぞ！！」というのがあれば、コメントして頂けるととても嬉しいです :heart:


##getterメソッド

getterメソッドとは、ある特定のフィールド値を取り出すためのメソッド
privateなフィールドの値をgetすることができる

>gettrメソッドの定石
public 値を取り出すフィールドの型　getフィールド名() {
  return this.フィールド名
}


MuscleBoyクラスにgetNameメソッドを追加して、MuscleGirlがMuscleBoyの名前を知ることができるようにしてみる！

```java
1 public class MuscleBoy{
2   private String name;
3
4   public String getName(){
5     return this.name;
6   }
7 }
```

MuscleGirlクラスでは、nameフィールドにアクセスしている部分をgetName()で呼び出す :loudspeaker: :cop: 

```java
1 public class MuslceGirl{
2   void talk(MuscleBoy mb){
3     System.out.println("ねぇねぇ" + mb.getName() + "君、私と一緒に筋トレ・・・しない？？");
4   }
5 }
```

MuscleBoyクラスのgetNameメソッドを経由してnameフィールドにアクセスし、値を取り出しているのじゃ :older_man: :exclamation: 

###setterメソッド
---
setterメソッドは、ある特定のフィールドに指定された値を代入するメソッド
privateなフィールドの値を書き換える

> setterメソッドの定石
public void setフィールド(フィールドの型　任意の変数名){
  this.フィールド = 任意の変数名;
}


```java
1 public class MuslceBoy(){
2  private String name;
3
4   public String getName(){
5    return this.name;
6   }
7
8   public void setName(String name){
9    this.name = name;
10  }
11 } 
```


####getter/setterのメリット
---

１．Read Only Write Onlyが可能
getNameのみ：外部から読めるが書き換えることはできない
setNameのみ：外部から書き換えることはできるが読めない（あまり使われていない）

２．　クラスの内部設計を自由に変更できる
たとえば、何らかの理由でnameというフィールド名をnewNameに変更したくなったとき、getter/setterを使っている箇所だけ修正すればオッケー

３．　フィールドへのアクセスを検査できる
クラス外部からnameのフィールドの値を変更したい場合、setterを使う。
要は、「setterを実行せずに、nameフィールドに値を変更することはできない」
このことを利用して、setterで設定されようとしている値が妥当かどうかを検査することもJavaプログラミングの定石 :punch: :punch: :exclamation: :exclamation: :exclamation: 

```java
1  public class MuscleBoy(){
2   private String name;
3   public void setName(String name){
4     if(name == null){
5       throw new IllegalArgumentException("名前が入力されていません。処理を中断。");
6     }
7     if(name.length() <= 1){
8       throw new IllegalArgumentException("名前が短すぎます。処理を中断。");
9     }
10    if(name.length() >= 10){
11      throw new IllegalArgumentException("名前が長過ぎます。処理を中断。");
12    }
13    this.name = name;     //検査完了。代入しても問題ない！
14 }
```

***throw new IllegalArgumentException***はエラーを出してプログラムを強制停止する命令

このsetName()メソッドは、nameフィールドの値を変更するたびに検査を行う。
もし問題のあるプログラムを実行するとプログラムは処理を中断するのじゃ :ok_hand: :older_man: :boom: 


```java
1  public class Main{
2   public static void main(String[] args){
3     MuslceBoy mb = new MuscleBoy();
4     mb.setName("");   //長さ０文字の名前をセットしようとしている
5   }
6 }
```


画面には、名前が入力されていません。処理を中断。と表示される :exclamation: :exclamation:
.gitconfigファイルを直接いじってみる（設定関係メモ）

##.gitconfigをいじる前に

###設定の確認方法

```lang:
git config --list
```

###gitに設定を追加する
※例として [alias]にco = checkoutを追加する場合
マシン全体に設定を追加する場合

```lang:
git config --system alias.co checkout
```

リポジトリに設定を追加する場合

```lang:
git config --global alias.co checkout
```

##いざ.gitconfigをいじってみる

ひとまずホームディレクトリに移動して、.gitconfigを開いてみる
もしくは、下記コマンドを実施する

```lang:
git config -e
```

開いてみると下記のような記述になっていると思われる（多分、人によって違うかも）

```lang:.gitconfig
[user]
  name = hoge
  email = hoge@exsample.com
```

colorとaliasとかいろいろ追加してみる。

```lang:.gitconfig
[user]
  name = hoge
  email = hoge@exsample.com
[color]
  ui = auto
[alias]
  co = checkout
  ci = commit
  st = status
  bra = branch
  gr = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
[gui]
	encoding = utf-8 # 文字コード設定
[receive]
	denyNonFastforwards = false # 強制pushを許可
[core]
	quotepath = false # 日本語コミットの文字コード化を防ぐ
```

他に設定できる項目は
- editor
- pager 
- push
などがある。
cinema4dでpythonを書いてみる。


cinema4dでpythonを書いてみる。
pythonもよくわからなかったのでpythonの文法的なものも以下にメモした。
http://qiita.com/_nabe/items/36f6f33397e9eec4e3b9


## c4dでpythonを書く場所

いくつかある。

* スクリプトタグに書く
* スクリプトマネージャーに書く
* Xpressoの中に書く
* Pythonジェネレータに書く
* pluginとして書く

まずは練習で、スクリプトタグか、スクリプトマネージャー上で実行をよく使った。


##すでに定義されている変数
ショートカット的にcinema4d側が以下の変数を定義している模様。


* doc = [c4d.documents.BaseDocument](https://developers.maxon.net/docs/Cinema4DPythonSDK/html/modules/c4d.documents/BaseDocument/index.html#c4d.documents.BaseDocument) のこと

* op = スクリプトタグ自体を表す


##オブジェクトを取得し位置を変えてみる
毎フレーム、オブジェクトをランダムに動かしてみる。以下のスクリプトを、スクリプトタグに書いた。

```python:move.py
import c4d
import random

def main():
	print "move!"
    obj = op.GetObject()
    obj[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_X] = 100 * (random.random()-0.5)
    obj[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Y] = 100 * (random.random()-0.5)
    obj[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Z] = 100 * (random.random()-0.5)


```
キャプチャはこんな感じです。
![alt](https://i.gyazo.com/9df40811a689bf30c98247c8249df3b5.png)


c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_X などのプロパティ名は、cinema4d上のスクリプトエディタにgui上のパラメータ名をドラッグすると表示される！
![alt](https://i.gyazo.com/b0672355c4ee23c54473190584153f9e.gif)


##ドキュメント
APIはここから頑張って探す。あるいはググる！
https://developers.maxon.net/docs/Cinema4DPythonSDK/html/index.html


##公式っぽいサンプル
https://github.com/PluginCafe/cinema4d_py_sdk

##スニペット
https://qiita.com/_nabe/items/8c106af9f9f541d3db95
SSRS レポートビルダーで0除算を行う際の注意点

SSRS レポートを作成する際には、欠かせないツールであるレポートビルダーですが
式内で0除算を行う際は、ちょっとした "コツ" が必要になります。

☆マトリクスウィザード
※( )内は、各テキストボックス名
![example.PNG](https://qiita-image-store.s3.amazonaws.com/0/123834/34f5a54a-3ae4-fa0a-daf1-1b16d1f9918e.png)

☆例：①sikiの値が"商"でない場合は、kekkaに何も表示しない。
　　　②sikiの値が"商"かつ、atai2の値が0の場合は、kekkaに0を表示する。
　　　③sikiの値が"商"かつ、atai2の値が0以外の場合は、kekkaに(atai/atai2)の値を表示する。

■失敗例
-- sikiの値判定
IIF(ReportItems!siki.Value = "商",
-- sikiの値が"商"
IIF(ReportItems!atai2.Value = 0, 0, ReportItems!atai1.Value / ★ReportItems!atai2.Value)
-- sikiの値が"商"以外
, 0)

■成功例
-- sikiの値判定
IIF(ReportItems!siki.Value = "商",
-- sikiの値が"商"
IIF(ReportItems!atai2.Value = 0, 0, ReportItems!atai1.Value / ★IIF(ReportItems!atai2.Value = 0, 1, ReportItems!atai2.Value))
-- sikiの値が"商"以外
, 0)


問題となるのは★の部分です。
一度、IIFで"atai2が0でない場合は"という条件文を入れていますが、
うまく機能してくれず、0除算エラーが発生してしまいます。
原因ははっきりとしていないのですが、ここさえ注意していれば0除算エラーを回避することが出来ます。

2016/05/02
box と slack の連携がちょーぜつ便利な件

# これは何？

最近、オンラインストレージで box を試してるんだけど、slack との連携がちょーぜつ便利だったので、それのメモ

# box って？

オンラインストレージサービス

https://www.box.com/

Dropboxに似た感じだけど、よりエンタープライズ色が強い。

* 全データが暗号化されて保存
* ファイルにメタデータやコメントなど充実した付加情報を付与できる。
* ファイルのライフタイム設定ができる
    * 有効期間設定。知り合いの某社では、デフォルト1ヶ月で消えるように設定していて（残したいファイルは設定変更する運用にしているらしい）、おかげでゴミファイルに悩まされることが減ったとのこと）
* Office や Google docs なんかと連携できる。
    * 特に Office との連携がすばらしい
* もちろん、全ファイルは履歴管理される
    * "資料_20160501.ver1.pptx" なんてファイル作らなくて良い
* とにかく、ビューワーが良く出来てる
    * 300種類のファイル形式に対応してるらしい。外出先でのプレゼンも超簡単
    * 最近では、360度カメラ映像のビューワー（WebGL使ってぐりんぐりん）なんかも対応してるとのこと
* もちろん無料で使える。
    * 10GBまで。それ以上使いたくなったら、ちゃんとお金を払おう

といったところが、ぱっと使ってみていいなーって思った特徴

アメリカでは結構有名。シリコンバレーの Redwood cityに本社がある。この前遊びに行ってきたけど、すごいおされな、いいオフィスだった。また遊びに行こっと。

# box と slack との連携

ここからが本題。とにかく、これがほんとに良く出来てる。

## 解決したかった課題

slack普段使ってて悩ましいのがアーカイブデータとの連携。Google docs使うと解決できるんだけど、コミュニティ仕事ではいいけど、仕事ではpowerpoint とか使えないと辛いし。ファイルサーバーのリンクはったりするのは、やっぱり不便

## どんな感じに解決できるの？

論より証拠。典型的な使い方をペタペタ

### ファイルの作成

まずは、ファイルを作る。box syncってアプリ入れると、Dropboxみたいにlocalフォルダーと自動で同期とってくれる。基本基本、これは驚かない ;-)

### slackにファイルを貼り付ける

slack で box integration 設定すると、ファイルを貼り付けるとき、box が選択できるようになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/83466/c88cc187-0fec-f2fb-0b14-ab46822c14a4.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/83466/c31da938-a23e-d2f2-07f7-89461b6fd9f5.png)

こんな感じでファイルとしてslackでは認識される。

### 貼り付けられたファイルを閲覧する。

ファイルを開こうとすると、boxのviewerが起動する。普通は、ダウンロードプロセスが起こって残念な感じになるけど、そんなこと起きない。この時点で既にチョー便利。

![image](https://qiita-image-store.s3.amazonaws.com/0/83466/b880524b-6590-2001-3bc5-463f03f0c490.png)

また、ビューワーがほんとよく出来てるのでたまらない。

### ファイルを編集してみる。

編集も簡単。右上の **Open** を選択すると、

![image](https://qiita-image-store.s3.amazonaws.com/0/83466/f99a1da3-cc09-4b2e-738c-8e358b36b10b.png)

といったように、Editor選択にうつり、例えば下の **Microsoft PowerPoint** を選ぶと

![image](https://qiita-image-store.s3.amazonaws.com/0/83466/8ecfa98e-39e6-ddf8-aeef-4e14a13e1a0e.png)

のようにパワポが起動し（初回のみ、連携用プラグインのインストールが必要です）。ふつーに編集して保存すると

![image](https://qiita-image-store.s3.amazonaws.com/0/83466/3a0301e7-918a-4fb0-5da1-49f478f132ab.png)

といったように、box 上でダイレクトに更新される。今までだと、一回編集したものを再度slackに貼りつけ直すとか revision がよく分かんなくなるとか色々あったけど。これなら迷わない。

## 最後に

box と slack を連携させると、 **ものすごーーーーーーーーいシームレス** に、slack の flow context の中に box の archive context を組み込むことができる。slack workflow でアーカイブどーしよー問題悩ましかったけど解決された。良かった。良かった。
微分積分

# 微分積分のまとめ

## 参考

- ふたたびの微分・積分

## 関数

- **関数の意味**

> yがxによって1通りにきまる数であるとき
> **「yはxの関数である」**
> と言って次のように表す。
> $y = f(x)$

## 平均変化率

変化率 = 変化の割合 = $ \frac{yの変化分}{xの変化分} $　= **傾き**

- 平均変化率

> $y = f(x) においてxがaからbまで変化するとき $
> 平均変化率 = $ \frac{f(b) - f(a)}{b - a} $ = **傾き**

## 「等差」数列の和と「等比」数列の和

- 等差数列

> **等差数列の一般項**
> $a_n = a_1 + (n - 1)d$
>  　　$（ただし、a_1: 初項、d: 公差）$
>
> **等差数列の和**
> $S_n = \frac{n(a_1 + a_n)}{2} [\frac{項数 \times (初項 + 末項)}{2}]$ 

- 等比数列  

> **等比数列の一般項**
> $a_n = a_1 r^{n-1}$
>  　　$（ただし、a_1: 初項、r: 公比）$
>
> **等比数列の和**
> $S_n = \frac{a_1(1 - r^n)}{1 - r} （ただし、r \neq 1） [\frac{初項 \times (1 - 公比^{項数})}{1 - 公比}]$ 

```math
\begin{eqnarray}
   S_n &=& &a_1& + &a_1r& + a_1r^2 + ... + a_1r^{n-2} + a_1r^{n-1} \\
-) rS_n &=& && &a_1r& + a_1r^2 + ... + a_1r^{n-2} + a_1r^{n-1} &+ a_1r^{n}& \\
S_n - rS_n &=& &a_1& && &-a_1r^{n}& \\
(1-r)S_n &=& a_1 - a_1r^n = a_1(1 - r^n)
\end{eqnarray}
```

　　$ S_n = a_1 + a_1r + a_1r^2 + ... + a_1r^{n-2} + a_1r^{n-1} $
$ -) rS_n = $　　　$ a_1r + a_1r^2 + ... + a_1r^{n-2} + a_1r^{n-1} + a_1r^{n} $

----  
$ S_n - rS_n = a_1 $ 　　　　　　　　　　　　　　　　 $- a_1r^{n} $
$ (1-r)S_n = a_1 - a_1r^n = a_1(1 - r^n) $


## 数列の極限

- 数列の極限

> $「nを限りなく大きくしていくと、数列$ {$a_n$} $ がある定数pに近づいていく」$ ということを
> $$ \displaystyle \lim_{n \to \infty} a_n = p $$
> と表現する





## その他

- **定義(define)** : 言葉の意味や用法を明確に定めること
- **定理(thorem)** : 正しいことが証明された事柄のうち、特に重要なもの
- **公理(axiom)** : 物事を議論する際にその出発点となる前提
標準出力・標準エラー出力、/dev/nullについて。

UnixやLinuxでコマンドを使っていると、標準出力とか、標準エラー出力などについての知識がなかったので、簡単にまとめてみます。
ついでに/dev/nullについても。:smile: 

####用語の説明
***
はじめにそれぞれの用語について、説明します。

| 項目 | 説明 | 
|:----------|:------------|
| 標準出力       | 出力がディスプレイに表示される。ファイルディスクリプタは1番 (シェルで実行時に正常終了時のメッセージのこと)  |   
| 標準エラー出力     | 出力がディスプレイに表示される。ファイルディスクリプタは2番    (シェルで実行時に発生したエラー・メッセージのこと) | 
| /dev/null       | 出力が破棄され、なにも表示されない。イメージはゴミ箱。 | 


サンプル

* 標準出力

```bash:
$ echo sample
sample 
```

* 標準エラー出力

```bash:
# 存在しないディレクトリファイルを指定してみる。
$ ls error
ls: cannot access error: そのようなファイルやディレクトリはありません 
```
/dev/nullへ出力してみる。

```bash:
$ echo sample >& /dev/null
→何もおこらない
$ ls error >&/dev/null
→何もおこらない
```
ちょっと、わかりづらいので、シェルスクリプトを作成します。
(sample.sh)

```bash:sample.sh
#!/bin/bash

# 標準出力(1)として、表示します。
echo "標準出力"

# 標準エラー出力(2)として、表示します。
# ※ 1→2にリダイレクトすることで、標準エラー出力として表示します。
echo "標準エラー出力" 1>&2 

exit 0
```

実行結果

```bash:
# 1 を/dev/nullに捨てることで、2だけが表示されます。
$ ./sample.sh 1>/dev/null
標準エラー出力

# 2 を/dev/nullに捨てることで、1だけが表示されます。
$ ./sample.sh 2>/dev/null
標準出力
```
electron v0.35.0 以降は、`electron` モジュールを使いましょう

## 要約

- × `const app = require('app');`
- ○ `const app = require('electron').app;`

## 疑問

```javascript
const app = require('app');
const BrowserWindow = require('browser-window');
const shell = require('electron').shell;
const Menu = require('menu');
const ipcMain = require('electron').ipcMain;
```

コードを整理していると、変なことに気が付いた。[electron/docs](https://github.com/electron/electron/tree/master/docs "electron/docs at master · electron/electron · GitHub")に紹介されているようなモジュールについて、`electron`モジュールから引っ張ってきているのと直接呼び出しているのと２つの扱いがあるが、それぞれ入れ替えても動く。

`require('electron').ipcMain` → `require('ipc-main')` のように CamelCase と chain-case の違いはあれどもだいたい対応するモジュールがあるようだ。でも、shell を `require('shell');` で呼び出すと、全てのウィンドウが閉じたらアプリが終了するようにしていた部分が動かなかったりと、少々違いはある。一体どうなっているのか。

## 解答

[Release electron v0.35.0](https://github.com/electron/electron/releases/tag/v0.35.0 "Release electron v0.35.0 · electron/electron · GitHub")で `Add electron module which includes all public APIs.`と書かれている。この統合が行われた背景は、[Issue #387](https://github.com/electron/electron/issues/387 "Reorganize node.js module names to avoid name collision. · Issue #387 · electron/electron · GitHub")にある通り、electron のビルトインモジュールと一般モジュールが衝突する面倒が生じていたため。electron のビルトインモジュールは明示的に呼び出す仕様に整理された。

よって以下のように整理した。

```javascript
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
const shell = electron.shell;
const Menu = electron.Menu;
const ipcMain = electron.ipcMain;
```

参考:

- [electron/synopsis.md](https://github.com/electron/electron/blob/master/docs/api/synopsis.md "electron/synopsis.md at master · electron/electron · GitHub") 古いスタイルの読み込みを強制的に無効にする方法なども紹介されている。
Mac | コンソールで date --date '1 day ago'  が使えない

# 解決

Mac には GNU版のコマンドが入ってない。
brew で入れてあげる。

```bash
$ brew install coreutils
```

gdate が使えるようになる。

```bash
$ gdate --date '1 day ago'
Sun May  1 12:44:19 JST 2016
```

# 問題

Linux では使えるオプションが、Macでは使えなかった。

```
$ date -d '1 day ago'                                                                                                                                                                              [master]
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... 
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
```

# 参考

- [MacでGNU版のコマンドを使う(homebrew)](http://www.shigemk2.com/entry/20120416/1334578046)



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Color.Black == (new Pen(Brushes.Black)).Colorの結果がFalseになる

# 前提
以下の環境で確認してます
- .Net Framework 4.6.2
- Visual Studio 2015

# 現象

PenオブジェクトのColorが黒か否かによって、処理を分岐するコードを書いたけどうまく動かない。
Brushes.Blackから生成したpenオブジェクトなのに、下のコードを実行してもBの処理に行ってしまう。。

```csharp:program.cs

			Pen pen = new Pen(Brushes.Black);
			if (pen.Color == Color.Black)
			{
				// Aの処理
			}
			else
			{
				// Bの処理
			}

```

# 原因

Colorクラス内の operator ==の処理で、
Color.value, state,knownColor,name全てが一致していないとtrueが返らないが、
今回の場合全てが一致しないため。

実はColor.Black == Color.FromArgb(255, 0, 0, 0)の戻り値もFalseになる。
比較を行う際には、回避策の方法でチェックするのが王道なのかも。
ARGBがあっていればTrueで値が返ってもいいと思うんだけど。。

# 回避法

とりあえず黒だったらA, そうでなければBの分岐に行けばよかったので、Color.ToArgbメソッドでARGBの値に直してチェックしてみてる。
戻り値がintなので、結局上位ビットが切り捨てられて比較が成功してるぽい。

```csharp:program.cs

			Pen pen = new Pen(Brushes.Black);
			if (pen.Color.ToArgb() == Color.Black.ToArgb())
			{
				// Aの処理
			}
			else
			{
				// Bの処理
			}

```

# 蛇足
Color.Valueの値を確認していると、
Color.Black.Valueは0xffffffffff000000で
Pen.Color.Valueは0x00000000FF000000。
上位32bitの差は何なの？


両方とも元のARGB値はint 0xFF000000だけど、
.Netのソースを追っていくと
Colorの方はint → longにキャスト
Penの方はintの値をlongにキャストして、0xffffffffの論理積をとってる。

Penの処理の理由はわからないけど、戻り値が0x00000000FF000000になるのはまあわかる。
Colorの方はなんで上位ビットに1が立つのか？を見ていくと、符号拡張なるものが原因みたい。


[6.2.1 明示的な数値変換 (C#)](https://msdn.microsoft.com/ja-jp/library/aa691289(v=vs.71).aspx)
> 変換元の型が変換先の型より小さい場合は、変換先の型と同じサイズになるように、変換前の値に対して符号拡張またはゼロ拡張が行われます。
> 変換元の型が符号付きの場合は符号拡張が使われて、符号なしの場合はゼロ拡張が使われます。その後、結果は変換先の型の値として扱われます。
 

0xFF000000は最上位ビットが1なので符号はマイナス。
なのでint→longへの数値変換時に上位ビットが1で埋められている。

なんで上位ビットを1で埋めるかと言ったら、絶対値を求めるために補数を計算するときに上位桁が0じゃないとおかしくなるから。
(初心者)SSLソケット通信


# はじめに
SSLのソケット通信を使ったことがなかったので、実際に動かした結果をここにまとめておきます。

# 環境
OS X El Capitan
Python 2.7.11
OpenSSL 0.9.8zh 14 Jan 2016

# 準備
## 証明書と公開鍵の作成

以下のページを参考に、証明書と公開鍵をOpenSSLで作成した。
http://qiita.com/marcy-terui/items/2f63d7f170ff82531245

```
├── keys
│   ├── server.crt
│   ├── server.csr  ※未使用
│   └── server.key
```

# 実装

以下のページを参考に、コードを作成した。
https://docs.python.org/2/library/ssl.html
17.3.5.2. クライアントサイドの処理
17.3.5.3. サーバーサイドの処理

```lang:ssl_server.py
import socket, ssl

URL = '127.0.0.1'
PORT = 10023

context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="keys/server.crt", keyfile="keys/server.key")

bindsocket = socket.socket()
bindsocket.bind((URL, 10023))
bindsocket.listen(5)

def do_something(connstream, data):
    print '---------------------'
    print data + '\n'
    print '---------------------'
    print

def deal_with_client(connstream):
    data = connstream.read()
    # null data means the client is finished with us
    while data:
        if not do_something(connstream, data):
            # we'll assume do_something returns False
            # when we're finished with client
            break
        data = connstream.read()
    # finished with client

while True:
    newsocket, fromaddr = bindsocket.accept()
    connstream = context.wrap_socket(newsocket, server_side=True)
    try:
        deal_with_client(connstream)
    finally:
        connstream.shutdown(socket.SHUT_RDWR)
        connstream.close()
```

```lang:ssl_client.py
import ssl
import socket
import pprint

URL = '127.0.0.1'
PORT = 10023

context = ssl.create_default_context()
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.verify_mode = ssl.CERT_NONE 
context.check_hostname = False
conn = context.wrap_socket(socket.socket(socket.AF_INET),
           server_hostname=URL)
conn.connect((URL, PORT))
cert = conn.getpeercert()
pprint.pprint(cert)
conn.sendall(b"HEAD / HTTP/1.0\r\nHost: linuxfr.org\r\n\r\n")
pprint.pprint(conn.recv(1024).split(b"\r\n"))
```

# 結果

```lang:サーバ側
$ python ssl_server.py 
---------------------
HEAD / HTTP/1.0
Host: linuxfr.org



---------------------


```

```lang:クライアント側
$ python ssl_client.py 
{}
['']
$ 
```

# 今後

今後は、SSLのパケット通信のキャプチャ＆リプレイを実験し、
SSLで動作している通信のスタブ作成に挑戦してみたいと思います。

# 参考

https://docs.python.org/2/library/ssl.html
http://qiita.com/marcy-terui/items/2f63d7f170ff82531245
enforceIDEにTwitter OAuth

# enforceIDEのアカウント登録にTwitterアカウントが使えるようにしました。

でもまだ実験段階です。Twitterの鳥アイコンをクリックして連携すると問答無用でアカウントが作成され、Twitterのスクリーンネームがそのままアカウント名として登録されます。

いつか、アカウント名の変更機能つけないとですね…。

現在は、アカウント間でプロジェクトの移行機能が無いので、メールアカウントで作成したプロジェクトをツイッタアカウントのほうへ持っていくことは出来ません…。

https://www.prominence.tv/enforceide/
ASP.NET 4.5 ストリーミング受信とアップロードサイズの制限

この記事ではVisual Studio 2015のASP.NET 4.5.2 Webアプリケーションプロジェクトを使いました。

非同期ashxでストリーミングSaveAs

```csharp
// System.Web.HttpTaskAsyncHandler
public override async Task ProcessRequestAsync(HttpContext context)
{
    using (var fs = File.OpenWrite("filename")) {
        await context.Request.GetBufferlessInputStream(disableMaxRequestLength:true).CopyToAsync(fs);
    }
}
```

## ストリーミング受信

ASP.NETのパイプライン処理はヘッダーの受信が完了すれば始まる。しかし`HttpRequest.InputStream`はリクエストBody全体が読み込まれるまでブロックする(このとき、一定の大きさ以上であれば一時ファイルにバッファリングされる)。

WebFormの場合はPageクラスが`InputStream`へアクセスするのでユーザーコードが実行されるのはリクエスト全体の受信が完了した後になる。

`HttpRequest.SaveAs`は上記の仕組みによりいったんリクエスト全体が一時ファイルに保存されてそのファイルを読み出して再度ファイルに保存される。


.NET4からHttpRequest.GetBufferlessStreamメソッドが用意された。リクエスト全体の受信完了を待たずに処理をすることができる。

## 受信サイズの制限
アップロードのサイズ制限

1. `requestFiltering/requestLimits@maxAllowContentLength`[^1]
IISの機能。web.configの`location`要素を使って特定のパスにだけ適用することができる。

2. `httpRuntime@maxRequestLength`[^2]
ASP.NETの機能。アプリケーションルートでのみ指定でき、アプリケーション全体で有効になる。

v4.5で追加された`HttpRequest.GetBufferlessInputStream(disableMaxRequestLength:true)`[^3]は`HttpRuntime@maxRequestLength`の制限を受けない。

[^1]: [Request Limits <requestLimits>](http://www.iis.net/configreference/system.webserver/security/requestfiltering/requestlimits)
[^2]: [httpRuntime 要素 (ASP.NET 設定スキーマ)](https://msdn.microsoft.com/ja-jp/library/e1f13641(v=vs.100).aspx)
[^3]: [HttpRequest.GetBufferlessInputStream メソッド (Boolean)](https://msdn.microsoft.com/ja-jp/library/hh195568(v=vs.110).aspx)
[アップロードされたファイルの一時保存先](http://surferonwww.info/BlogEngine/post/2011/08/01/Temporary-store-of-uploaded-file.aspx)
[ASP .NET Ajax File Upload](http://vanacosmin.ro/Articles/Read/AjaxFileUpload)
[数GBのファイルをHTTPでPOSTできるか- (2) サーバー編 - @jsakamoto](http://devadjust.exblog.jp/9457740/)
[数GBのファイルをHTTPでPOSTできるか? (3) 完結](http://devadjust.exblog.jp/9459025/)
Docker+Ubuntu+Swiftをやってみる


## 環境
今回はこの環境でやっていきます

- Mac OSX 10.11.3 El Capitan
- Ubuntu 15.10
- Swift 2.2.1

## Dockerをインストール
[Docker-Toolbox](https://www.docker.com/)をインストールすることでDockerに必要なものをすべてインストールできます

正しくインストールできたか、確認してみます

```
$ docker-machine --version
```

バージョンが出ればOKです

## Docker-machineを起動する

```
$ docker-machine start
$ docker --version
```

これでDockerが使えるようになります

## DockerをいじってubuntuをDL
今回はubuntu15.10を使いますので、[DockerHub](https://hub.docker.com/explore/)にあるか確認して、imageをDLしてきます

```
$ docker run -it ubuntu:15.10 /bin/bash
```

このコマンドでubuntu 15.10をDLしてdocker上でubuntuを動かせます
コマンドの「ubuntu:15.10」ですが、「ubuntu」がimage名、「15.10」がタグ名です
「ubuntu:14.04」とすればubuntu14.04をDLできます

```
$ exit
```

でubuntuからログアウトできます


## Swiftをインストール
[swift.org](https://swift.org/download/#releases)を確認しましょう
現時点(2016/5/2)で最新Releaseのswift2.2.1をインストールします

それではやっていきましょう！
※実際には[ここ](https://swift.org/download/#using-downloads)の手順を踏んでいます

```
$ docker run -it ubuntu:15.10 /bin/bash

$ apt-get update
$ apt-get install wget
$ apt-get install clang libicu-dev
$ wget https://swift.org/builds/swift-2.2.1-release/ubuntu1510/swift-2.2.1-RELEASE/swift-2.2.1-RELEASE-ubuntu15.10.tar.gz
$ wget https://swift.org/builds/swift-2.2.1-release/ubuntu1510/swift-2.2.1-RELEASE/swift-2.2.1-RELEASE-ubuntu15.10.tar.gz.sig

$ wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import -
$ gpg --keyserver hkp://pool.sks-keyservers.net --refresh-keys Swift
$ gpg --verify swift-2.2.1-RELEASE-ubuntu15.10.tar.gz.sig

$ tar xzf swift-2.2.1-RELEASE-ubuntu15.10.tar.gz
$ export PATH=/swift-2.2.1-RELEASE-ubuntu15.10/usr/bin/:"${PATH}"
$ swift --version
```

swifのバージョンが出力されればOKです！
（PATHはbash_profileに書いてしまってもOKです）

swiftを動かしてみましょう！
が、しかし！！

```
$ swift
/swift-2.2.1-RELEASE-ubuntu15.10/usr/bin/lldb: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
```

このように出てしまうので、[ここ](https://swift.org/download/#using-downloads)の手順にはありませんが、以下をインストールしてswiftを動かしてみます

```
$ apt-get install libpython2.7
$ swift
/swift-2.2.1-RELEASE-ubuntu15.10/usr/bin/lldb: error while loading shared libraries: libxml2.so.2: cannot open shared object file: No such file or directory
```

これでいけるかとおもいきや同じようなエラーが出てしまいます。
これもインストールしてswiftを動かしましょう

```
$ apt-get install libxml2
$ swift
error: failed to launch REPL process: process launch failed: 'A' packet returned an error: 8
```

またエラーです。。。[issue](https://github.com/swiftdocker/docker-swift/issues/9#issuecomment-162172540)が解決済みなのでそれどおりやってみます

まずはdocker上のubuntuからログアウトしてコミットしてしまいましょう

```
$ exit
$ docker ps -as
$ docker commit xxxxxxxxxxxx ubuntu:swift-test
```

commitは[コンテナID] [保存名]です
コミットしたイメージを下記オプションを付けてコンテナ化します

```
$ docker run -it --privileged ubuntu:swift-test /bin/bash
$ export PATH=/swift-2.2.1-RELEASE-ubuntu15.10/usr/bin/:"${PATH}"
$ swift
```

動いた！！！
swiftは対話式でコードが書けるので、試しにいろいろやってください
ヘルプは「:help」、終了は「:exit」です



以上です。dockerのバグなんですかね？
少し厄介でした。
UNEXPECTED TOP-LEVEL EXCEPTIONの対応


Android Studioをupdateした途端、ビルド後に「UNEXPECTED TOP-LEVEL EXCEPTION」が起こるようになった。

<h2>対応方法</h2>
build.gradleに以下を追加
 
```
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "hogehoge"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        //追加
        multiDexEnabled true
    }
    dexOptions {
    	　//追加
        javaMaxHeapSize "4g"
    }
```
[TeX] 表の上に出てくれないcaptionをなんとかした話

# 起きたこと

タイトルの通り、表のキャプションが上につかなくて、こまる。

書いていた表は下のような感じ

```document.tex
\begin{table}[H]
	\caption{caption}
	\label{tab:table}
	\begin{center}
	\begin{tabular}{|c|c|}
	\hline
	\begin{minipage}{0.5\hsize}
		\centering
		\includegraphics[height=50mm,bb=0 0 320 300]{test1.jpeg} \\
		hogehoge
	\end{minipage} &
	\begin{minipage}{0.5\hsize}
		\centering
		\includegraphics[height=50mm,bb=0 0 320 300]{test2.jpeg} \\
		hogehoge2
	\end{minipage} \\
	\hline
	\begin{minipage}{0.5\hsize}
		\centering
			\includegraphics[height=50mm,bb=0 0 320 300]{test3.jpeg} \\
		hogehoge3
	\end{minipage} &
	\begin{minipage}{0.5\hsize}
		\centering
		\includegraphics[height=50mm,bb=0 0 320 300]{test4.jpeg} \\
		hogehoge4
	\end{minipage} \\   \hline
	\end{tabular}
	\end{center}
\end{table}
```

# 環境

- OS X El Capitan
- TeXLive2015
- TexShop 3.61

使っていたパッケージなど。

```document.tex
\documentclass[11pt,a4j]{jsarticle}

\usepackage[dvipdfmx]{graphicx}
\usepackage[top=25truemm,bottom=30truemm,left=25truemm,right=25truemm]{geometry}


\usepackage{float,array,booktabs}

\usepackage{amsmath}
\usepackage{url}


```


# やったこと。

```document.tex
\floatstyle{plaintop}
\restylefloat{table}
```

これをいれた。それだけ。

# おわりに

これを機に[Basic TeX] $\times$ [Atom]に乗り換えた。この方がいいですね。

日本語情報はなさそうだったので、この記事ストックがたまるといいな


# 追記

```document.tex
\documentclass[11pt,a4j]{jsarticle}

\usepackage{float,array,booktabs,here}
\usepackage{amsmath}
\usepackage[dvipdfmx]{graphicx}
\usepackage[top=30truemm,bottom=30truemm,left=25truemm,right=25truemm]{geometry}
\usepackage{url}
```

とusepackageする順番を変えたら、解決してしまった。

おそらく、\usepackage{float}の前に\usepackage{dvipdfmx}を入れてしまっていたのが原因みたいですね。

graphicxはfloatの後に読み込むべきだったのか。。。

# 参考にしたところ

- [How to force table caption on top?](http://tex.stackexchange.com/questions/22751/how-to-force-table-caption-on-top)
CloudWatchにおけるEC2インスタンスのステータスチェックともしもの時のtips

EC2の一覧画面に行くと、StatusCheck 2/2 checks passedとか書かれているのですが、それってなんなの？ということで調べてみた。

クリックするとSystem Status ChecksとInstance Status Checksの二つがそれぞれ成功したというふうに書かれている。

ではそれらは何なのか？そしてそれらが失敗していたらどうしたらいいのか？をいかにまとめてみた。

## System Status Checks 
物理的なホストで問題が生じた場合、System Status Checkに失敗する。
EC2を提供する端末のハードウェアの問題とかソフトウェアの問題。
このエラーが出た場合は、**EC2インスタンスを一度停止して起動し直すことで解決出来る**。
インスタンスは停止して起動すると別の物理端末上でホストされることになるので、
問題が生じたホスト以外のホストで起動し直すことができるからだ。
    
## Instance Status Checks
VM自体の問題が生じた場合、Instance Status Checksに失敗する。
要するにEC2インスタンス自体のこと。
**インスタンス自体で問題が起きているので、この問題が起きた場合はアプリケーションの設定を見直したり、
インスタンスを再起動することで解決出来る**。

なのでもしもこれらのStatusCheckに失敗していたら、まず落ち着いてどちらの原因で失敗しているかを確認し、
**Systemの方なら停止=>起動で、Instanceの方なら再起動をする**ということをまずは試してみましょう。
業務フローを考えるときに使うツール

# 業務フロー図はもう古い！？

というわけでもありませんが、それだけではありませんよ。という話し。
業務フロー図とはスイムレーンを配置して四角や菱型といった図形を用いてフローを表すものですね。一般的にはJIS X0121の情報処理用流れ図を用います。

「JISX0121 情報処理用流れ図・プログラム網図・システム資源図記号」
http://www.jisc.go.jp/app/pager?id=2980581

ただ、図形の用いかたに縛りがないので、割りと好き勝手に書いていることでしょう。それよりもどういった観点で書くのかが重要で、おもわず詳細なところまで落とし込んでしまって粒度がバラバラだったり、他人に意図が伝わりにくいことがあります。

# マジカ！

株式会社マジカジャパンさんの「マジカ！」だと楽しく業務フローが書けます。こういう楽しさも時には必要です。カードに書いていくと全体像が見えてきます。このカードの良いことろは「役割」と「成果の受け渡し」がはっきりするところです。「誰々さんから」と「誰々さんへ」と繋げるので自然に粒度も揃います。4コマ漫画風で間違いなく意図が伝わりやすいです。みんなでわいわい作るので、その時点で意思疎通ができています。

![Screenshot - 2016_05_02 , 9_30_10.png](https://qiita-image-store.s3.amazonaws.com/0/114529/1e725ad6-3906-a64e-6b95-7869ab03967b.png)

# ビジネスプロセスモデリング表記法 (Business Process Modeling Notation, BPMN)

業務フロー図と同じくスイムレーンに図形をフローで繋げていく表記法ですが、UMLと同じく世界標準です。ビジネスプロセスモデリング言語 (Business Process Execution Language; BPEL)も定義されているので、単なる表記ではなく実行可能という点が違います。

![Screenshot - 2016_05_02 , 9_38_41.png](https://qiita-image-store.s3.amazonaws.com/0/114529/d65539ae-2e92-9dca-0976-3ed2e10c0236.png)

実際に動作するオープンソースプロジェクトやサービスも多数存在します。
仕様がきまっていますので、基本的にはそれぞれのサービス間で交換可能なはずです。（交換できなかったらそのサービスが外れているかと）

「Activiti 」
http://activiti.org/
「Camunda」
https://camunda.org/
「Bonita」
http://www.ossbpm-japan.com/bonita-bpm.html
「Questetra BPM」
https://www.questetra.com/ja/

Enterprise Architect や Visioでも書くことが出来ます。

以前の仕事ではBPMNを採用しました。
ただ内包する形で利用しやすいサービスがなかったので、簡易版のBPMNを定義して、[Jung](http://jung.sourceforge.net/) というグラフ型データ構造のオープンソースを利用して内製していたりしました。
Chrome拡張機能(アプリ)のメッセージ送受信に関する備忘録

##非同期でレスポンスを返す
chrome.runtime.onMessageイベントやchrome.runtime.onMessageExternalイベントで非同期でレスポンスを返したい場合、コールバックメソッドでtrueを返せばできるようになる。

```js
chrome.runtime.onMessage.addListener((message, sender, response) => {
  asyncMethod((arg) => {
    response(arg);
  });
  return true; // <= trueを返す
});
```

##他の拡張機能やChromeアプリ間でメッセージの送受信を行う
chrome.runtime.sendMessage()の第一引数に他の拡張機能やChromeアプリのIDを指定して実行すると、その拡張機能やChromeアプリにメッセージを送信することができる。
また、他の拡張機能やChromeアプリからメッセージを受け取る場合は、chrome.runtime.onMessageExternalイベントを使用する。
これにより、拡張機能同士や拡張機能とChromeアプリ間といったメッセージ送受信が可能になる。
manifest.jsonにexternally_connectableキーがなくても他の拡張機能やChromeアプリとのメッセージの送受信ができるが、externally_connectableキーがある場合はidsサブキーで送受信を行う他の拡張機能やChromeアプリのIDを指定しないとメッセージの送受信は行えない。(後述するページからメッセージ送信と組み合わせて使う場合など)
メッセージ受信は、backgroundでなければならず、content_scriptでは受け取ることができない。

```json:manifest.json
{
  ...
  "externally_connectable": {
    "ids": [
      "他の拡張機能やChromeアプリのID"
    ]
}
```

```js:ページスクリプト
// メッセージ送信
chrome.runtime.sendMessage('他の拡張機能やChromeアプリのID', message, (responseMessage) => {
  // レスポンス受信処理
  ,,,
});
```

```js:拡張機能のbackgroundのスクリプト
chrome.runtime.onMessageExternal.addListener((message, sender, response) => {
  // メッセージ受信処理
  ...
  // レスポンスを返す
  response(responseMessage);
});
```


##ページからメッセージ送信
manifest.jsonにexternally_connectableキーを追加し、matchesサブキーにURLパターンを設定すれば、
そのURLパターンにマッチしたページから直接メッセージを送信することができる。
この場合も同様に、送信側はchrome.runtime.sendMessageの第一引数に送信する拡張機能のIDを指定して送信、受信側はchrome.runtime.onMessageExternalイベントを使用する。
メッセージ送信でのレスポンスを受信することはできるが、拡張機能側からページに対してchrome.runtime.sendMessageでメッセージを送信することはできない。
送信先は拡張機能に限り、Chromeアプリには送信できないみたい。
また、同様にメッセージの受信はbackgroundでしか行えない。ただ、ページ内でのイベントはcontent_script内でも拾えるので、window.dispatchEvent(CustomEvent)などを使用すれば、ページとcontent_script間でのメッセージ(データ)の送受信は可能である。

```json:manifest.json
{
  ...
  "externally_connectable": {
    "matches": [
      "https://hoge.fuga/*"
    ]
}
```

```js:ページスクリプト
// メッセージ送信
chrome.runtime.sendMessage('拡張機能のID', message, (responseMessage) => {
  // レスポンス受信処理
  ,,,
});
```

```js:拡張機能のbackgroundのスクリプト
chrome.runtime.onMessageExternal.addListener((message, sender, response) => {
  // メッセージ受信処理
  ...
  // レスポンスを返す
  response(responseMessage);
});
```

##ちょっと応用
インラインインストールを実装するとき、[公式に書かれている方法](https://developer.chrome.com/webstore/inline_installation)では、インストールボタンを最初表示していて対象の拡張機能がインストールされていれば非表示にするという方法をとっており、この方法だと拡張機能をインストールしていてもちらっとインストールボタンが見えてしまう。
ページからメッセージを受信できるようにすれば、インストールされていない場合はsendMessageのresponseがundefinedになるため(拡張機能側では、ページからのインストールチェックメッセージの場合、undefined以外のレスポンスを返すようにする)、インストールボタンを最初非表示にしておき、undefinedだったら表示させるようにすればちらっと見えたりすることなくインストールボタン表示の制御が可能になる。
「Code Complete 第2版 上」を読んだ

[![code complete](http://ecx.images-amazon.com/images/I/51LZpcbh3LL._SX389_BO1,204,203,200_.jpg)](http://www.amazon.co.jp/dp/B00JEYPPOE)


GWの読書感想文。身も蓋もない感想を言ってしまうと、「[レガシーコード改善](http://www.amazon.co.jp//dp/4798116831)」「[リーダブルコード](http://www.amazon.co.jp/dp/4873115655)」のほうがサンプルコードもあって頭にすっと入ってきて好み。印象に残った箇所をメモ。

# 高品質な設計に望ましい特性

## 最小限の複雑さ

> 「凝った」設計はだいたい理解するのが難しいので避ける。代わりに「単純」で「理解しやすい」設計にする。ある１つの部分に集中して取り組む際に、プログラムを簡単に無視できないような設計は、その目的を果たしていない。

## 保守性

> 保守の容易さとは、保守プログラマのために設計することである。保守プラグラマを顧客と見なし、見ればすぐわかるようなシステムを設計しよう。

## 疎結合

> 疎結合とは、プログラムのさまざまな部品間の結び付きを最小限に抑えるような設計である。クラスインターフェイスの抽象化、カプセル化、情報の隠蔽の原則を基に、相互結合のできるだけ少ないクラスを設計する。結びつきが少なければ、その分、統合とテストの保守の作業が少なくなる。

## 拡張性

> 拡張性とは、基本的な構造に影響を与えずに、システムの機能を拡張できることである。つまり、他の部分にまったく影響を及ぼさずに、システムの一部を変更できる。

## 再利用性

> 再利用性とは、システムの一部を他のシステムで再利用できるようにシステムを設計することである。

## 高いファンイン

> 高いファンインとは、そのクラスを使用するクラスがたくさんあることである。また、システムが下位レベルのユーティリティクラスを活用するような設計になっていることも意味する。

## 低いファンアウト

> 低いファンアウトとは、１つのクラスが使用する他のクラスの数を少なくすることを意味する。高いファウンアウト(約７個以上)は、クラスが使用する他のクラスの数が多く、そのため複雑になりすぎる可能性があることを示している。

## 移植性

> 移植性は、システムを他の環境へ簡単に移行できるように設計することである。

## 無駄のなさ

> 無駄がないとは、システムに余分な部分がないように設計することである。コードを変更する際には、余分なコードを開発して、レビューし、テストし、検討しなければならないからだ。ソフトウェアの将来のバージョンは、余分なコードとの下位互換性まで維持しなければならない。

## 階層化

> 階層化とは、分解のレベルを階層化して、システムをどのレベルでも参照できるようにし、一貫した視点が得られるようにすることである。他のレベルを見なくても、１つのレベルを見ればわかるように設計する。

## 標準化手法

> システムが一般的でない要素に依存すればするほど、そのシステムを最初に理解することが躊躇されるようになる。標準化された一般的な手法を使用すれば、システム全体に親しみやすい印象を持たれる。
Xcode6とXcode7が共存する環境でCarthageのビルドがエラーになる

# インストール環境

Xcode6.4が入っているMacに、Xcode7.3を（遅ればせながら）インストールしました。
dmg版のXcode7.3をインストールすることで、Xcode6.4の環境を上書きせず残しました。
（参考）
http://egg-is-world.com/2015/04/10/xcode-version-install/

# Carthageでのビルドエラー

Xcode7.3にCarthageでライブラリを組み込もうとして、
`$ carthage update --platform iOS`
コマンドを実行したところ、
`CompileSwift normal x86_64 ...`
というエラーが吐き出され、ライブラリのビルドができませんでした。

# 回避方法

以下のコマンドを実行したところ、無事に回避できました。
`$ sudo xcode-select -switch /Applications/Xcode-7.3.app/Contents/Developer`
※"Xcode-7.3.app"の部分は、PC上のアプリケーション名に変更する必要があります。

Swiftのバージョンが異なるXcodeを複数インストールしている環境でCarthageを使う際は、
xcodebuildが適用するSwiftのバージョンを切り替えてあげる必要があるようです。

（参考）
http://qiita.com/masahiko24/items/8b42e2679608bf785454
技術英語 > Engineer John Garcia, [points to] a blinking red light on his computer screen. / index finger

@ LOE > April 25, 2003
http://loe.org/shows/shows.html?programID=03-P13-00017
> Engineer John Garcia, <font color=red>points to</font> a blinking red light on his computer screen.

<hr>
http://eow.alc.co.jp/search?q=人さし指
index finger

point fingerだと思っていたが違った。

http://whitebear0930.net/archives/4928
> 続いて手の小指、薬指、中指、人差し指、親指に当たる英語の呼称を見てみましょう。

<hr>
Garciaから思い出した。

ガルシアへの書簡
http://www.geocities.co.jp/HeartLand-Hinoki/9024/books/garcia.htm
Dockerで作るGAE with go開発環境

Windowsに開発環境を作るのは何かと面倒だし、私の場合、ノートPCはMacBookAirだったりするので、うまく共用出来ないかなー、とSDKをDockerベースでラッピングしてみることにしました。

「開発環境をDockerで！」って言うのは割りと流行りだと思いますが、どちらかというと実行環境の意味が強い気がします。
今回はGAE系のコマンドをまとめてDockerに入れることでSDKの導入を簡単にしよう！　というのが趣旨です。PythonだのRubyだのをWindowsに入れるのは面倒なので。

Dockerイメージは[こちら](https://hub.docker.com/r/koduki/sdk-gae_go/)に登録した、[koduki/sdk-gae_go](https://hub.docker.com/r/koduki/sdk-gae_go/)を追加います。

ローカルサーバでの開発
---------------------

### サーバの起動

まず、下記のコマンドでローカルサーバを立ち上げます。

```bash
$ ./serve.sh
```

これで、ローカル、正確にはDockerMachine上にサーバが立ち上がりました。内部的には下記のような処理をしています。

```bash
WK_DIR=$(cd $(dirname $0);pwd)
IMAGE_NAME=koduki/sdk-gae_go
docker run -it --rm -p 8080:8080 -v ${WK_DIR}/app:/app -v ${WK_DIR}/home:/root $IMAGE_NAME goapp serve --host=0.0.0.0 /app
```
見ての通り、単純なgoappのラッパーです。
http://localhost:8080 またはWindowsやMacでdocker-machineを使ってる場合は http://192.168.99.100:8080 等でアクセスできます。

カレントディレクトリのappをボリュームとしてマウントしているので、そちらのコードを編集すれば、反映されます。
ただ、現状hot deplpyがうまく効かないので、一度"C-c"なので、server.shを停止して、再起動する必要があります。

### パッケージのインストール

パッケージが使えないとgoでの生産性が半減どころじゃなく下がってしまいますね？
パッケージもDocker上で入れます。[Dockerfile](https://github.com/koduki/docker-sdk-gae_go/blob/master/Dockerfile)の行末に記載があるので、そちらに追記することでパッケージを追加出来ます。

修正したら、下記コマンド等でイメージの更新または作成を行います。

```bash
$ docker build -t koduki/sdk-gae_go .
```

ビルドが完了したら再度コンテナを動かすことで、反映が確認できます。

Google App Engineへのデプロイ
---------------------

では、続いてGAEへのデプロイです。アプリケーションの登録は済んでいる事を前提にします。

### 初回デプロイ

まず、初回アクセスの場合は認証が必要です。
コンテナにログインして、認証キーを作りましょう。

```bash
$ ./run.sh
root@3d004aa982d3:/# appcfg.py --noauth_local_webserver -A simple-app-1234 -V v1 update /app/
....
Go to the following link in your browser:

    https://accounts.google.com ... ccess_type=offline

Enter verification code:
```

ここで認証コードを取得するように言われるので、上記のURLをブラウザに入力します。
すると、下記のような画面になります。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/54904/82deda39-dbd1-ca66-8731-bfa7b9092ba2.png)

![002.png](https://qiita-image-store.s3.amazonaws.com/0/54904/eec1a8d7-ccd3-5033-1b51-aac4577e7d11.png)

取得したキーを入力して、認証を勧めます。

```bash
Enter verification code: xxxxxxxxxxx
Authentication successful.
```

これで初回のデプロイは成功です。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/54904/24e3a243-69f3-07e0-21c5-3854379ebf93.png)


homeディレクトリをvolumeとして指定してあるので、２回目以降は認証は不要です。

### 2回目以降

2回目以降はシンプルに下記のコマンドをローカルから実行するだけで大丈夫です。

```bash
./deploy.sh simple-app-1234 v1
```

まとめ
------

とりあえず作って見ましたが、WindowsだとPythonとか入れる手間がなくなるので、結構良い気がしますね。
PaaS系はこの配布方式が向いてる気がしますね、なんとなく。Heroku版も作ろうかな。

それでは、HappyHacking!

参考
------

- [Google App Engine Go Standard Environment Documentation](https://cloud.google.com/appengine/docs/go/)
- [DockerでGAE開発環境に外部からアクセスするとき注意点](http://qiita.com/koduki/items/b8a8905ca173895368ed)
Gogsをcronで起動させる時にハマった

## 参考

* [Run user isn't the current user · Issue #1109 · gogits/gogs](https://github.com/gogits/gogs/issues/1109)

## cronに登録

```diff:
- @reboot (cd /home/gogs/gogs/ && ./gogs web)
+ @reboot (cd /home/gogs/gogs/ && USER=gogs ./gogs web)
```

* `USER=`を渡す必要があった。


## port番号を指定する

* デフォルトの3000 から3001に変更する例

```diff:
- @reboot (cd /home/gogs/gogs/ && USER=gogs ./gogs web)
+ @reboot (cd /home/gogs/gogs/ && USER=gogs ./gogs web 3001)
```
リモートのコンテナからDockerコマンドを使えるようにする

ローカルのDocker EngineであればDockerのコントロール・ソケット`docker.sock`をbindマウントするだけなので、下記のようにわりとシンプルなコマンドになります。

```
docker run -v /var/run/docker.sock:/var/run/docker.sock \
           -it docker docker ps
```

しかし、この方法だとリモートのDocker Machineにあるコンテナでは期待通りに動作してくれません。それではどうするかというと、Docker Machineとやり取りするための環境(pemファイルも含める)をコンテナに渡す必要があります。

例えば下記の手順をふむと、`dockercontrol`という名前のコンテナを作ってそのコンテナ上の`/docker`というボリュームにその環境を保存することができます。

```
# 環境を設定します
$ eval $(docker-machine env host1)

# 環境を保存するためのコンテナを作ります
$ tar -C $DOCKER_CERT_PATH -cf- ca.pem cert.pem key.pem |
  docker run --name dockercontrol -i -v /docker docker \
  sh -c "tar -C /docker -xf-
         echo export DOCKER_HOST=$DOCKER_HOST >>/docker/env
         echo export DOCKER_TLS_VERIFY=1 >>/docker/env
         echo export DOCKER_CERT_PATH=/docker >>/docker/env"
```

ちなみにこの`dockercontrol`は`docker ps`を叩いてもでてきませんが、`/docker`というボリュームを抱えたまま`Exited(0)`で眠っています。これで`/docker`の準備はできたので、次はこのボリュームをマウントしてコンテナを起動します。

```
# コンテナを起動します
$ docker run --rm --volumes-from dockercontrol -it docker

# 環境を読み込みます
/ # source /docker/env

# Dockerコマンドを使ってみます
/ # docker ps
```

これで何が嬉しいかというと、Docker Swarm上にイベントドリブンでオートスケールするシステムをフル・コンテナで実装できることです。

この便利なティップスは[Jérôme Petazzoniさんのブログ・ポスト](http://jpetazzo.github.io/2016/04/03/one-container-to-rule-them-all/)の受け売りなのですが、内容がとても勉強になるので是非彼のブログにも目を通してみてください。また、彼のポストが[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)ライセンスで書かれているのでこのポストも同じくCC BY-NC-SA 4.0ライセンスとなります。

それと、彼のブログでも紹介されてるのですが、彼のGithubアカウントにはこのアイデアをシェルスクリプトにしたものがあります。

- [jpetazzo/dctrl](https://github.com/jpetazzo/dctrl)