OmniAICreator/Qiita-1.07M huggingface dataset:
numpyで累積和の閾値を満たす最小 のインデックスを求める

よく使うけどよく忘れるので，メモ

## 先に結論
``argmax()``つかうと上手くいく．

## やりたいこと
タイトルがわかりづらいかもしれないので，詳しくやりたいことを説明．
``numpy.array``に対して，累積和(``cumsum``)を計算して，その累積和に対する閾値を超える最小のインデックスとかが欲しくなったりする．
例えば，

```py3
In [143]: score
Out[143]: 
array([[  1.05262936e-01,   1.05262936e-01,   1.05262936e-01,
          1.05262936e-01,   1.05262936e-01,   1.57894404e-01,
          1.05262936e-01,   1.05262936e-01,   2.10525873e-06,
          1.05262936e-01],
       [  1.66664722e-01,   1.66664722e-06,   1.66664722e-01,
          2.49997083e-01,   1.66664722e-06,   2.49997083e-01,
          1.66664722e-01,   3.33329444e-06,   3.33329444e-06,
          1.66664722e-06],
       [  9.09090909e-02,   9.09090909e-02,   9.09090909e-02,
          9.09090909e-02,   9.09090909e-02,   1.21212121e-01,
          1.21212121e-01,   9.09090909e-02,   9.09090909e-02,
          1.21212121e-01]])

In [144]: score.shape
Out[144]: (3, 10)
```
みたいな``array``があったとして，これの累積和

```py3
In [145]: score.cumsum(1)
Out[145]: 
array([[ 0.10526294,  0.21052587,  0.31578881,  0.42105175,  0.52631468,
         0.68420909,  0.78947202,  0.89473496,  0.89473706,  1.        ],
       [ 0.16666472,  0.16666639,  0.33333111,  0.58332819,  0.58332986,
         0.83332694,  0.99999167,  0.999995  ,  0.99999833,  1.        ],
       [ 0.09090909,  0.18181818,  0.27272727,  0.36363636,  0.45454545,
         0.57575758,  0.6969697 ,  0.78787879,  0.87878788,  1.        ]])
```
がそれぞれ閾値

```py3
In [149]: threshold = np.random.random((3, 1))

In [150]: threshold
Out[150]: 
array([[ 0.62732896],
       [ 0.46494853],
       [ 0.54341381]])
```

よりも大きい要素のうち，一番小さいインデックスが欲しい．
この例だと，``score[0, 5], score[1, 3], score[2, 5]``になるので，``[5, 3, 5]``の結果が貰えればいい．

そこで，初めの結論に戻るのだが，``numpy``の``argmax``を使うと，いい塩梅に欲しい出力がもらえた．

```py3
In [155]: score.cumsum(1) > threshold
Out[155]: 
array([[False, False, False, False, False,  True,  True,  True,  True,
         True],
       [False, False, False,  True,  True,  True,  True,  True,  True,
         True],
       [False, False, False, False, False,  True,  True,  True,  True,
         True]], dtype=bool)

In [156]: np.argmax(score.cumsum(1) > threshold, 1)
Out[156]: array([5, 3, 5], dtype=int64)
```

``argmax``は最大値を取るインデックスのうち，最も小さいインデックスを返すみたい．

## だけど．．．
逆に閾値以下の要素のうち最大のインデックスをもとめたいとき，は無理だった．
``[4, 3, 4]``が欲しいのだが，

```py3
In [176]: score.cumsum(1) < threshold
Out[176]: 
array([[ True,  True,  True,  True,  True, False, False, False, False,
        False],
       [ True,  True,  True, False, False, False, False, False, False,
        False],
       [ True,  True,  True,  True,  True, False, False, False, False,
        False]], dtype=bool)

In [178]: np.argmin(score.cumsum(1) < threshold, 1)
Out[178]: array([5, 3, 5], dtype=int64)

In [179]: np.argmax(score.cumsum(1) < threshold, 1)
Out[179]: array([0, 0, 0], dtype=int64)
```
こうなってしまう．

``np.where``とかで格好良く求めるのが正義?
誰かクールなtipsがあったら教えて下さい．
[tmlib.js] Arrayクラスを継承した時の謎の挙動

# []で追加するとうまく動かない

[runstant](http://goo.gl/S8SbXE)

```js

var arr=SubArr();

arr[0]=10;
arr[1]=100;
arr.push(1000);
```
これだと1個しか要素がない。
`[]`これで追加するとlengthが自動で変化しないのが原因みたい。

# lengthを手動で変更

[runstant](http://goo.gl/E0Ew6t)

```js

var arr=SubArr();

arr[0]=10;
arr[1]=100;
arr.push(1000);

// lengthをセットすると動く
arr.length = 2;

```

# 対策として、継承したクラスにsetメソッドを作る

[runstant](http://goo.gl/Tu7hxR)

```js
tm.define('SubArr',{
//略
    //対策として、メソッドを用意
    set:function(index, value){
        this[index] = value;
        if(this.length <= index) this.length = index + 1;
        return this;
    },
});


```

# 実際
配列をこんな歯抜けな感じで使うケース少ないので、`push`とか`pop`だけで済むことが多いです。
どうしても`[]`で要素を追加しないといけないという時だけ、`length`が変化しないことを思い出してみてください。
小ネタ：UITabBarControllerに「モーダル表示するボタン」を追加する(Swift)



![tabbar.gif](https://qiita-image-store.s3.amazonaws.com/0/7946/760ea4be-99df-9c56-e5a8-6abe63cf85ec.gif "tabbar.gif")



iOSアプリで、「タブバーにタブバーっぽくないアイコンを置いて、それをタップしたら画面がモーダル出てくる」というのを見かけます。それをSwiftでやってみたという小ネタです。

ポイント：
- UITabBarControllerを継承したクラスを作る
- 押したらモーダル表示する、というボタンをself.tabBarにaddSubviewしておく
- UITabBarの中のボタンは、subviewsの中で、クラスが"UITabBarButton"のものなので、ボタンの表示位置はこれを使って調整する
- UITabBarButtonは非公開クラスなので、クラス名を文字列でチェックしている。

```swift:
class MyTabBarController:UITabBarController{
    let button:UIButton = UIButton()
    
    override func viewDidLoad() {
        // タブバーに重ねるボタンを作成
        // ここではサイズとか位置は気にしない。
        let image = UIImage(named: "button")
        self.button.setBackgroundImage(image, forState: .Normal)
        self.button.addTarget(self, action: "openModal",
            forControlEvents: UIControlEvents.TouchUpInside)
        
        // self.view ではなくて、self.tabBar にaddSubviewする
        self.tabBar.addSubview(self.button)
     }
    
    // 表示される直前にここが呼ばれるので
    // ここでself.buttonの位置を調整する
    override func viewDidLayoutSubviews() {
        // タブバーのn番目にあるUIViewを取得してくる。
        // self.tabBarButtons()は、下のextensionで追加してるメソッド
//        let v = self.tabBarButtons().first // 左端タブのUIViewn
        let v = self.tabBarButtons().last  // 右端タブのUIView
//        let v = self.tabBarButtons()[1]   // 2番目のタブの位置
        if let v = v {
            button.frame = v.frame
        }
    }
    
    // ボタンおされたらモーダル表示
    func openModal(){
        // モーダル表示するViewControllerは、Storyboardから拾ってくる。
        let vc = self.storyboard?.instantiateViewControllerWithIdentifier("ModalViewController") as? UIViewController
        if let vc = vc {
            self.presentViewController(vc, animated: true, completion: nil)
        }
    }
}

// UITabBarControllerを拡張
extension UITabBarController{
    // タブバーを構成している、内部クラスの「UITabBarButton」を探してきて、UIViewの配列として返す。
    // OSのバージョンアップで使えなくなる可能性がある。
    func tabBarButtons()->[UIView]{
	// reduce関数は知らなければ損。
        return self.tabBar.subviews.reduce([], combine: { (ret:[UIView], item:AnyObject) -> [UIView] in
            if let v = item as? UIView  {
                // ここ、クラス判定を「文字列」でやってるから、裏技ちっく。
                if v.isKindOfClass(NSClassFromString("UITabBarButton")) {
                    return ret + [v]
                }
            }
            return ret
        })
    }
}
```

ちゃんと作るなら、
- 画像をちゃんと作らないと、タブバーから浮いて見えたり、背景文字が見えてしまったりする（特にサイズ違いの実機で要テスト)
- ボタンを重ねたTabBarItemは死にアイテムになるので、意味のある画面は配置しないようにする
- OSのバージョンアップ時にはテスト厚く
等など、気をつけましょう。
ソーシャルボタンが手軽に置ける「bootstrap-social-buttons」がすごい便利


2017/05/15：
下記リンク先がなくなっているのが確認できました。
代わりに後継みたいなのを見つけました
つ [ソーシャルボタンが手軽に置ける「Social Buttons for Bootstrap」がすごい便利そう](http://qiita.com/solaluna/items/19f271ef7ba79e4e1cb0)

---

![image](https://qiita-image-store.s3.amazonaws.com/0/85815/01a96f69-f39e-dd6a-270f-b9e44bc9da57.png)


http://adamneumann.co/bootstrap-social-buttons/

これのことです。
(今回個人サイト作るときに使せてもらったやつです。)

自分的にメモしておくと
##①social-buttons.cssをDLしてその辺(cssフォルダとか)におく

cssフォルダとかに置くといいと思います
##②\<link href="css/social-buttons.css" rel="stylesheet">とかく
これをかく

```index.html
<link href="css/social-buttons.css" rel="stylesheet">
```

##③http://www.bootstrapcdn.com/#fontawesome_tab のCSSもかく

htmlファイルに

```index.html
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
```
とかく


##④最後にボタンを書いてみる
Facebookのボタンなら

```index.html
<button class="btn btn-facebook"><i class="fa fa-facebook"></i> | Connect with Facebook</button>
```

とかいてみる


するとこんな感じできれいなボタンができるのです↓

![FireShot Capture - 半月下想　- ハンツキカソウ - - http___solaluna.sakura.ne.jp_.png](https://qiita-image-store.s3.amazonaws.com/0/85815/9f6e3087-0712-1b90-ec80-dde9712f9701.png)


多くのソーシャルメディアに対応してるっぽいですが一部のサイトのボタンはなかったりするので注意(ask.fmとかなかった)
Playframeworkで定期実行させる - akka-quartz-schedulerを使う

こんにちは、t_hirohataです。

最近PlayFrameworkで、指定した時間に処理を動かすプログラムを書いたので
そこで使ったライブラリをちらっとご紹介します。

[元記事はこちら](http://labs.septeni.co.jp/entry/2015/07/22/114345)

#akka-quartz-scheduler
今回ご紹介するのは、[akka-quartz-scheduler](https://github.com/enragedginger/akka-quartz-scheduler)というライブラリで、
cronのような書き方でスケジュールを設定できるというものです。
（※このライブラリはAkkaを使うので、Akkaの知識が多少必要になります。）

このライブラリを使うには`build.sbt`に追加する必要がありますが、
Akkaのバージョンによって追加するものが異なるので、[こちら](https://github.com/enragedginger/akka-quartz-scheduler#usage)を参考に追加すると良いです。

それでは早速使ってみたいと思います！

追記
この記事ではPlay2.3を使用しています。
Play2.4ではGlobalオブジェクトがdeprecatedになったので、ApplicationLifecycleを使うようにしてください。

##１．`application.conf`にスケジュールの設定を記述
設定の仕方は簡単で、`application.conf`に以下のように書きます。

```
akka {
  quartz {
    schedules {
      Every5Seconds {
        description = "５秒毎に実行"
        expression = "*/5 * * ? * *"
      }
      Every10Minutes {
        description = "１０分毎に実行"
        expression = "0 */10 * ? * *"
      }
      9o'clockAnd18o'clock {
        description = "JSTの９時と１８時に実行"
        expression = "0 0 9,18 ? * *"
        timezone = "Asia/Tokyo"
      }
      EndOfEachMonth {
        description = "JSTの毎月末日の９時に実行"
        expression = "0 0 9 L * ?"
        timezone = "Asia/Tokyo"
      }
    }
  }
}
```

など、いろいろ設定できます。
`expression`にcron形式で書いていくのですが、もっと複雑な設定をしたい場合もあるかと思います。
[ここ](http://quartz-scheduler.org/api/2.1.7/org/quartz/CronExpression.html)に書き方が載っているので、参考にすると良いです。

##２．Actorを用意
[akka-quartz-scheduler](https://github.com/enragedginger/akka-quartz-scheduler)はAkkaを使っているので、ここでは簡単なActorを用意します

```scala
class SampleActor extends Actor {

  def receive = {
    case msg: String => println(msg)
  }

}
```

##３．Globalオブジェクトを用意
今回はアプリケーションをスタートさせた時にスケジュールを実行させるため、
Globalオブジェクトの`onStart()`メソッドを使って５秒毎に実行するスケジューラーを呼び出します。

```scala
object Global extends GlobalSettings {

  val system = ActorSystem("SampleSystem")
  val actor = system.actorOf(Props(classOf[SampleActor]))

  override def onStart(app: Application) = {
    // どのスケジュールを実行するか、どのアクターにメッセージを送信するか、どういうメッセージを送信するかを指定する
    QuartzSchedulerExtension(system).schedule("Every5Seconds", actor, "５秒")
  }

  override def onStop(app: Application) = {
    system.shutdown()
  }

}
```

##４．実行
以上で準備が終わったので、さっそく実行してみましょう！
※`activator run`で起動した際、`onStart()`メソッドが呼ばれるのは`http://localhost:9000`にアクセスしたタイミング。
 `beforeStart()`メソッドも同じタイミングでした。

```bash
$ activator run
```

さて、コンソールを見てみると、実際に５秒毎にメッセージが出力されているのが確認できます。

```
[info] - play.api.libs.concurrent.ActorSystemProvider - Starting application default Akka system: application
[INFO] [07/11/2015 01:39:44.487] [ForkJoinPool-1-worker-1] [[QuartzScheduler~Sample]] Setting up scheduled job 'EveryFiveSeconds', with 'com.typesafe.akka.extension.quartz.QuartzCronSchedule@c7d42d6'
[info] - play.api.Play - Application started (Dev)
５秒
５秒
```

##５．まとめ
以上のように、[akka-quartz-scheduler](https://github.com/enragedginger/akka-quartz-scheduler)を使うことで指定した時間に実行するプログラムを作ることができました。

これを使うことで、指定した時間にチャットアプリにメッセージを投稿したり、バッチを実行したりと応用できますね！
ls -lat /var/log | head -5 をエイリアス化する

`ls -lath`とかでオプションを与えつつ、この結果をパイプでheadに渡したかった。

`alias='ls -lat $1 | head'`としてもうまく動かなかったら友達が教えてくれた。

```zsh
# thank you bongle!
function lh(){
    ls -lath $1 | head
}
```

これで`lh /var/log`とかすれば最新のファイル５件を表示してくれる。便利便利
組合せ最適化 - 典型問題 - 安定マッチング問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##安定マッチング問題

男性のグループと女性のグループが与えられ、男性は女性の選好順序を、女性は男性の選好順序を持っている。男女でペアを作ったときブロッキングペアが存在しないマッチングを安定マッチングという。
ブロッキングペア(m,w)とは、ペアとなっていない男女で「wはmの現在のペアよりも好ましい」「mはwの現在のペア よりも好ましい」状態のペアをいう。

[安定マッチング問題](https://ja.wikipedia.org/wiki/%E5%AE%89%E5%AE%9A%E7%B5%90%E5%A9%9A%E5%95%8F%E9%A1%8C)は、厳密には最適化問題ではないが、マッチングに関し重要な問題なので典型問題に含めている。ゲイル・シャプレーの解法により効率的に解くことができる。

##実行方法

```text:usage
Signature: stable_matching(prefm, preff)
Docstring:
安定マッチング問題
入力
    prefm, preff: 選好
出力
    マッチング
```

```python:python
from ortoolpy import stable_matching
print(stable_matching([[2,0,1],[2,1,0],[0,2,1]], [[0,1,2],[2,0,1],[2,1,0]]))
```

```text:結果
{2: 2, 0: 0, 1: 1}
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import StableMatching
StableMatching('data/stable.csv')
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>male</th>
      <th>female</th>
      <th>pref_male</th>
      <th>pref_female</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1</td>
      <td>1</td>
      <td>1</td>
      <td>2</td>
    </tr>
    <tr>
      <th>8</th>
      <td>2</td>
      <td>2</td>
      <td>1</td>
      <td>0</td>
    </tr>
  </tbody>
</table>

##データ
- [data/stable.csv](https://www.dropbox.com/s/ez5wuxa9082ipdb/stable.csv)
すぐに忘れるLaTeX数式のインデントまとめ

LaTeXの数式のインデントの仕方でよく混乱してしまうのでまとめてみた。以下の例では`\split`を使用しているので`amsmath`パッケージが必須。

```latex
\usepackage{amsmath}
```

![eq1.png](https://qiita-image-store.s3.amazonaws.com/0/43042/2547e0df-92ab-d64f-d67f-729cc55fed20.png)

```latex
\begin{equation}
\begin{split}
  \framebox[2cm][c]{LHS}
  &=
  \framebox[6cm][c]{1st line}
  \\&=
  \framebox[6cm][c]{2nd line}
  \\&=
  \dots
\end{split}
\end{equation}
```

![eq2.png](https://qiita-image-store.s3.amazonaws.com/0/43042/07fdc840-f2ed-1d86-a8ab-abd3891c342b.png)

```latex
\begin{equation}
\begin{split}
  \framebox[2cm][c]{LHS}
  ={}&
  \framebox[6cm][c]{1st line}
  \\&+
  \framebox[4cm][c]{last part}
  \\={}&
  \dots
\end{split}
\end{equation}
```

次に`mathtools`パッケージの`\MoveEqLeft`を使った例。ソースは[公式ドキュメント (PDF)](http://ctan.cs.uu.nl/macros/latex/contrib/mathtools/mathtools.pdf) の *3.4.4 Emulating indented lines in alignments* の辺り。

```latex
\usepackage{mathtools}
```

![eq3.png](https://qiita-image-store.s3.amazonaws.com/0/43042/5be39996-b9c7-fd48-b5aa-8165e439f533.png)

```latex
\begin{equation}
\begin{split}
  \MoveEqLeft
  \framebox[10cm][c]{Long 1st line}
  \\&=
  \framebox[6cm][c]{2nd line}
  \\&=
  \dots
\end{split}
\end{equation}
```



![eq4.png](https://qiita-image-store.s3.amazonaws.com/0/43042/4167ef24-b43a-3654-aad4-5dfe494de932.png)

```latex
\begin{equation}
\begin{split}
  \MoveEqLeft[3]
  \framebox[10cm][c]{Long 1st line}
  \\={}&
  \framebox[8cm][c]{2nd line}
  \\&+
  \framebox[4cm][c]{last part}
  \\={}&
  \dots
\end{split}
\end{equation}
```



**追記 (2017/12/19)**

そういえばすっかり忘れていたのだが、1ページに収まり切らない数式の改行とかインデントとか考えるのが嫌になったのでLaTeXパッケージを作った。

https://github.com/tueda/autobreak

最新のTeXLive/MiKTeXに収録されているので、普通にフルインストールした場合にはもうお手元にあるはずである。実際の使用例としては、次の論文のAppendicesを挙げる。[^1]

[JHEP 10 (2017) 041](https://link.springer.com/article/10.1007%2FJHEP06%282017%29040)
[ソース (TAR)](https://arxiv.org/e-print/1703.08532)
[出来上がり (PDF)](https://arxiv.org/pdf/1703.08532)

使い方にハマりどころもままあると思われるので、詳しくは[マニュアル (PDF)](http://mirrors.ctan.org/macros/latex/contrib/autobreak/autobreak.pdf)を見てほしい。[^2]


[^1]: いわゆる自分の仕事の喧伝である。
[^2]: 自作マクロに組み入れたりなどと凝ったことをしようとすると`\catcode`をいじるはめになったり...
なるほどそしたらkobitoはUbuntuでも動くの？

http://qiita.com/daron/items/04e3d7936215568a704e
これ見たのでやった。

Node.js 入れる　はいってればそれで

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

electron-prebuiltパッケージ 入れる

```
npm install electron-prebuilt -g
```

実行

```
electron ~/Downloads/kobito/resources/app/
```

ちゃんと起動した！！！ けど日本語が全部豆腐に！！！ おしい。
electronまわりが全然よくわかってないので、

http://qiita.com/kjunichi/items/4bb9a4ec879f85865307

これかなあ？ かと思ってフォントをインストールしたけどうまくいかず。

誰かうまくいってないですかね……

（追記）
Ubuntuを再インストールする機会があって、そしたら動いてる。
僕のメインマシンLubuntuなので、今もそこから書いてる。 やったー。
[AWSCLI]VPC周りの簡易コマンドリファレンスその2



週末なので安いチリ産のワインを飲みながら書いています。吉田です。
昨日に引き続きVPCの構築です。

[[AWSCLI]VPC周りの簡易コマンドリファレンスその1](http://qiita.com/Yuki_BB3/items/3952f34dc08078bd6c52)
[[AWSCLI]VPC周りの簡易コマンドリファレンスその3](http://qiita.com/Yuki_BB3/items/ba749790d8a831c5a475)

---
公式サイト
http://docs.aws.amazon.com/cli/latest/index.html
基本的にサンプルとかは公式から持ってきています。
---



続きです。
前回の投稿では「create-vpc」コマンドを使いVPCを作成し、「describe」で情報の確認。
「modify」で情報の修正を行いました。
今回はサブネットの作成などを見ていきましょう。

---

### aws ec2 create-subnet


|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------:|:------------:|
| --vpc-id     | VPCを指定する　| vpc-XXXXXXXX |
| --cidr-block | サブネットのCIDR　| 10.0.0.0/24  |
| --availability-zone | サブネットを所属させるAZ | ap-northeast-1aなど|

---

```bash:サンプル
aws ec2 create-subnet --vpc-id vpc-XXXXXXXX --cidr-block 10.0.0.0/24 --availability-zone ap-northeast-1a

```

実例があっても少しイメージしにくいですよね？
そんな時はマネジメントコンソールでの設定を思い出してみましょう。
いつもと同じことをしているだけです。
AZ書かないとマネジメントコンソールの時みたいによしなにしてくれます。

---

###aws ec2 describe-subnets

VPCの時同様ですね。
つまり今回はサブネットについての描写をさせます。
何を確認したいかというと「サブネットID」こいつは後で使います。

>--subnet-ids

をつかってサブネットを指定して情報を確認することももちろん可能です。
しかし、今回はそのIDを取得したいので別のオプションを使用します。

前回のラストで便利と書いた「--filters」オプションです。


```bash:サンプル
aws ec2 describe-subnets --filters "Name=cidrBlock,Values=10.0.0.0/24"

```
これでしていしたCIDRに当てはまるサブネットの情報を取り出すことができます。
標準出力の内容は前回の最後に書いたように変数に格納できるので汎用性を考えて繰り返し使用する方はぜひ「jq」を使ってフィルタリングしてみてください。
今回は出力されたサブネットIDをメモしておきます。

---

###awsec2 associate-route-table

associate[他・動]~を関連付ける
まあ、そこにあるルートテーブルをサブネットに紐付けるって意味ですね。

あれ？ルートテーブル作ってねぇよ！？って思うかもしれませんが、マネジメントコンソールを思い出してみてください。サブネット作るとデフォで１個ついてきてます。そいつを使えば良いのです。

---

|    オプション　|     意味 　　　| 何を書けばいいか |
|:------------|:------------:|:------------:|
| --route-table-id | ルートテーブルID | rtb-xxxxxxxx |　
| --subnet-id | サブネットのID　| subnet-xxxxxxxx |

```bash:サンプル
aws ec2 associate-route-table --route-table-id rtb-xxxxxxxx --subnet-id subnet-xxxxxxxx

```

このようにアタッチ予定のルートテーブルとアタッチ先のサブネットをオプションで指定してあげれば紐付けることができます。

ルートテーブルのIDなんてわからないって？
そうですね。確認していないものを先出ししました。

どうすれば良いと思いますか？

・・・

・・・

・・・

そうです、いつも通り確認なので「describe」です！

---

###aws ec2 describe-route-tables

このコマンドをつかってルートテーブルのIDを確認します。
こいつはオプションで「--route-table-ids」が使えるのでわかっているルートテーブルに関しての情報取得も可能です。
わかりやすく取るなら例によって「jq」です。
今回は表示されたJSONから目視でIDを控えることとします。

---
###サブネット作成完了

ここまでで、サブネットの作成することができました。
サブネットは「プライベート」と「パブリック」なものを作成することができますね。
パブリックなサブネットとは、要するに外部との通信ができる「IGW」に対して通信が向いているものを指します。
マネジメントコンソールを思い出すとわかりやすいですが、サブネットだけ作成すると当初のルートテーブルはIGWへ通信が向いていません、
つまり、ここまでの作業で「プライベートサブネット」は作成できたことになります。
次回はこのサブネットを「パブリックサブネット」として利用するための作業を見ていきましょう。
組合せ最適化 - 典型問題 - 最大マッチング問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##最大マッチング問題

無向グラフ$G=(V,E)$に対し辺の本数が最大のマッチングを求めよ。

##実行方法

```text:usage
Signature: nx.max_weight_matching(G, maxcardinality=False)
Docstring:
Compute a maximum-weighted matching of G.

A matching is a subset of edges in which no node occurs more than once.
The cardinality of a matching is the number of matched edges.
The weight of a matching is the sum of the weights of its edges.
```

```python:python
# CSVデータ
import pandas as pd, networkx as nx, matplotlib.pyplot as plt
from ortoolpy import graph_from_table, networkx_draw
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe)[0]
for i, j in g.edges():
    del g.adj[i][j]['weight']
d = nx.max_weight_matching(g)
pos = networkx_draw(g)
nx.draw_networkx_edges(g, pos, width=3, edgelist=[(i, j) for i, j in d])
plt.show()
print(d)
```

```text:結果
{5: 0, 0: 5, 4: 3, 3: 4, 2: 1, 1: 2}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/0ca97ad6-e1fc-ebdb-69a3-8cd10cf627ae.png)

```python:python
# pandas.DataFrame
from ortoolpy.optimization import MaxMatching
MaxMatching('data/edge0.csv')
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>node1</th>
      <th>node2</th>
      <th>capacity</th>
      <th>weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>5</td>
      <td>2</td>
      <td>4</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1</td>
      <td>2</td>
      <td>2</td>
      <td>5</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>4</td>
      <td>2</td>
      <td>4</td>
    </tr>
  </tbody>
</table>

```python:python
# 乱数データ
import networkx as nx, matplotlib.pyplot as plt
from ortoolpy import networkx_draw
g = nx.random_graphs.fast_gnp_random_graph(10, 0.3, 1)
d = nx.max_weight_matching(g)
pos = networkx_draw(g, nx.spring_layout(g))
nx.draw_networkx_edges(g, pos, width=3, edgelist=[(i, j) for i, j in d])
plt.show()
```

![mwm.png](https://qiita-image-store.s3.amazonaws.com/0/13955/3669538d-0084-6407-112d-28d3807aaea4.png)

##データ
- [data/node0.csv](https://www.dropbox.com/s/7v4x2ypbgkj52vr/node0.csv)
- [data/edge0.csv](https://www.dropbox.com/s/2vryg0i2kb76mic/edge0.csv)
組合せ最適化 - 典型問題 - 一般化割当問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##一般化割当問題

$n$個の仕事$J=\\{1,2,\dots,n\\}$と$m$人のエージェント$I=\\{1,2,\dots,m\\}$に対して、仕事$j \in J$をエージェント$i \in I$に割当てたときのコスト$c_{ij}$と資源の要求量$a_{ij}(\ge 0)$、および各エージェント$i \in I$の利用可能資源量$b_i(\ge 0)$が与えられている。
それぞれの仕事を必ずいずれか1つのエージェントに割当てなければならず、また、各エージェントに割当てられた仕事の総資源要求量が、そのエージェントの利用可能資源量を超えないようにしなければいけない。このとき、コストの総和を最小にする割当を求めよ。

##実行方法

```text:usage
Signature: gap(cst, req, cap)
Docstring:
一般化割当問題
    費用最小の割当を解く
入力
    cst: エージェントごと、ジョブごとの費用のテーブル
    req: エージェントごと、ジョブごとの要求量のテーブル
    cap: エージェントの容量のリスト
出力
    ジョブごとのエージェント番号リスト
```

```python:python
from ortoolpy import gap
gap([[2, 2, 2], [1, 1, 1]], [[1, 1, 1], [1, 1, 1]], [2, 1])
```

```text:結果
[0, 0, 1]
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import Gap
Gap('data/gap.csv', [2,1])
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>agent</th>
      <th>job</th>
      <th>cost</th>
      <th>req</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>0</td>
      <td>2</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>1</td>
    </tr>
    <tr>
      <th>5</th>
      <td>1</td>
      <td>2</td>
      <td>1</td>
      <td>1</td>
    </tr>
  </tbody>
</table>

##データ
- [data/gap.csv](https://www.dropbox.com/s/6makh7v5m6ybp0l/gap.csv)
組合せ最適化 - 典型問題 - 2次割当問題

[典型問題と実行方法](0f6c1a4415d196e64314)

## 2次割当問題

対象物$P=\\{P_1,P_2,\dots,P_n\\}$の割当先$L=\\{L_1,L_2,\dots,L_n\\}$を考える。対象物$P_i$と$P_j$の間の輸送量$q_{ij}$と割当先$L_k$と$L_l$の間の距離$d_{kl}$が与えられているとき、輸送量と距離の積の総和を最小にする割当を求めよ。

## 実行方法

```text:usage
Signature: quad_assign(quant, dist)
Docstring:
2次割当問題
    全探索
入力
    quant: 対象間の輸送量
    dist: 割当先間の距離
出力
    対象ごとの割当先番号リスト
```

```python:python
from ortoolpy import quad_assign
quad_assign([[0, 2, 0], [0, 0, 1], [0, 0, 0]], [[0, 2, 4], [2, 0, 3], [4, 3, 0]])
```

```text:結果
(0, 1, 2)
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import QuadAssign
QuadAssign('data/quad_assign_quant.csv', 'data/quad_assign_dist.csv')[1]
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>target</th>
      <th>pos</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <th>2</th>
      <td>2</td>
      <td>2</td>
    </tr>
  </tbody>
</table>

##データ
- [data/quad_assign_quant.csv](https://www.dropbox.com/s/srjz1wqtmpg218i/quad_assign_quant.csv)
- [data/quad_assign_dist.csv](https://www.dropbox.com/s/wolckcvvm9ovevc/quad_assign_dist.csv)

## 補足

巡回セールスマン問題(TSP)など、様々な問題を 2次割当問題と捉えることができます。
2次割当問題は、抽象度の高い問題といえます。しかし、非常に解きずらい問題です。
問題の構造を理解するために、2次割当問題に帰着することは有益ですが、そのまま解くのはお薦めしません。より具体的な問題に捉えなおして解くべきでしょう。例えば、TSPは、TSP専用の解法を使った方が効率がよいでしょう。
最近のAtom変遷所感（まとまってない）

適当に箇条書きます。

# デフォルトテーマ変更

ウィンドウサイズで文字の大きさや境界線の太さが変わるなど手が込んでる。

# フォントが一時太くなって戻った

v0.208.0のReleaseNodeより

> Optimizations to editor rendering in 0.206.0 disabled sub-pixel anti-aliasing. It has been restored in this release.
https://atom.io/releases

結構眩しかったけど見やすくはあった。

# Settingの充実

特に個々のPackageのSetting周りは良くなった。
利便性はもう少し良く出来そうな気はする。

# ConfigSchema

Settingの充実に関係があるが、ConfigSchemaというのが定義できるようになった。

[こんなやつ](https://github.com/s-shin/linter-perl/blob/master/lib/init.coffee#L5-L59)

# CompositeDisposable

だいぶ前から入っているが。

EventEmitterでonしたものを追加しておいて、deactivate時などに`.dispose()`でまとめて破棄するためのモノっぽい。
組合せ最適化 - 典型問題 - 容量制約なし施設配置問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##容量制約なし施設配置問題

顧客(需要地点)の集合$D$と施設の配置可能地点の集合$F$が与えられる。各顧客$i \in D$は、必ずいずれかの施設$i \in F$に移動する。各施設に容量はない。顧客の容量と移動距離の総和を最小にするように、顧客の移動先を求めよ。ただし、施設は、$p$個までしか利用することができない。

##実行方法

```text:usage
Signature: facility_location_without_capacity(p, point, cand=None, func=None)
Docstring:
容量制約なし施設配置問題
    P-メディアン問題：総距離の和の最小化
入力
    p: 施設数上限
    point: 顧客位置のリスト
    cand: 施設候補位置のリスト(Noneの場合、pointと同じ)
    func: 顧客位置index,施設候補indexを引数とする重み関数
出力
    顧客ごとの施設番号リスト
```

```python:python
from ortoolpy import facility_location_without_capacity
facility_location_without_capacity(2, [(1, 0), (0, 1), (2, 2)])
```

```text:結果
[1, 1, 2]
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import FacilityLocationWithoutCapacity
FacilityLocationWithoutCapacity('data/facility.csv',2)
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>x</th>
      <th>y</th>
      <th>demand</th>
      <th>capacity</th>
      <th>id</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>0</td>
      <td>1.0</td>
      <td>1.0</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>1</td>
      <td>NaN</td>
      <td>1.0</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0</td>
      <td>1</td>
      <td>1.0</td>
      <td>NaN</td>
      <td>1.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>2</td>
      <td>2</td>
      <td>1.0</td>
      <td>2.0</td>
      <td>3.0</td>
    </tr>
  </tbody>
</table>

##データ
- [data/facility.csv](https://www.dropbox.com/s/wfbjdfplgv2vx5h/facility.csv)
組合せ最適化 - 典型問題 - 施設配置問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##施設配置問題

顧客(需要地点)の集合$D$と施設の配置可能地点の集合$F$があり、それぞれに容量が与えられる。各顧客$i \in D$は、必ずいずれかの施設$i \in F$に移動する。各施設の容量を満たし、顧客の容量と移動距離の総和を最小にするように、顧客の移動先を求めよ。ただし、施設は、$p$個までしか利用することができない。

##実行方法

```text:usage
Signature: facility_location(p, point, cand, func=None)
Docstring:
施設配置問題
    P-メディアン問題：総距離×量の和の最小化
入力
    p: 施設数上限
    point: 顧客位置と量のリスト
    cand: 施設候補位置と容量のリスト
    func: 顧客位置index,施設候補indexを引数とする重み関数
出力
    顧客ごとの施設番号リスト
```

```python:python
from ortoolpy import facility_location
facility_location(2, [(1, 0, 1), (0, 1, 1), (2, 2, 1)], 
                     [(1, 0, 1), (0, 1, 1), (2, 2, 2)])
```

```text:結果
[0, 2, 2]
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import FacilityLocation
FacilityLocation('data/facility.csv',2)
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>x</th>
      <th>y</th>
      <th>demand</th>
      <th>capacity</th>
      <th>id</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>0</td>
      <td>1.0</td>
      <td>1.0</td>
      <td>0.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0</td>
      <td>1</td>
      <td>NaN</td>
      <td>1.0</td>
      <td>NaN</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0</td>
      <td>1</td>
      <td>1.0</td>
      <td>NaN</td>
      <td>3.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>2</td>
      <td>2</td>
      <td>1.0</td>
      <td>2.0</td>
      <td>3.0</td>
    </tr>
  </tbody>
</table>

##データ
- [data/facility.csv](https://www.dropbox.com/s/wfbjdfplgv2vx5h/facility.csv)
組合せ最適化 - 典型問題 - n次元パッキング問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##n次元パッキング問題

n次元の直方体に、なるべく多くのn次元の直方体の詰込む。その方法を求めよ。
nは、1から3にあたる。nが1の場合、ナップサック問題で容量と価値が同じケースとなる。


##実行方法(ギロチンカットによる2次元パッキング問題)

```text:usage
Init signature: TwoDimPackingClass(self, width, height, items=None)
Docstring:
2次元パッキング問題
    ギロチンカットで元板からアイテムを切り出す(近似解法)
入力
    width, height: 元板の大きさ
    items: アイテムの(横,縦)のリスト
出力
    容積率と入ったアイテムの(横,縦,x,y)のリスト
```

```python:python
from ortoolpy import TwoDimPackingClass
TwoDimPackingClass(500, 300, [(240, 150), (260, 100), \
    (100, 200), (240, 150), (160, 200)]).solve()
```

```text:結果
(1.0,
 [(240, 150, 0, 0),
  (260, 100, 240, 0),
  (160, 200, 240, 100),
  (100, 200, 400, 100),
  (240, 150, 0, 150)])
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import TwoDimPacking
TwoDimPacking('data/tdpacking.csv', 500, 300)[1]
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>width</th>
      <th>height</th>
      <th>x</th>
      <th>y</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>240</td>
      <td>150</td>
      <td>0</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>260</td>
      <td>100</td>
      <td>240</td>
      <td>0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>160</td>
      <td>200</td>
      <td>240</td>
      <td>100</td>
    </tr>
    <tr>
      <th>2</th>
      <td>100</td>
      <td>200</td>
      <td>400</td>
      <td>100</td>
    </tr>
    <tr>
      <th>3</th>
      <td>240</td>
      <td>150</td>
      <td>0</td>
      <td>150</td>
    </tr>
  </tbody>
</table>

##データ
- [data/tdpacking.csv](https://www.dropbox.com/s/y9tq0drwruyl8eo/tdpacking.csv)
CSSだけで色相環作ろうとしたけれど失敗しました（＋改良版）

# 色相環を作りたい
私は色相環が好きなので色相環を作りたい。つくるのは難しいので失敗の覚悟が必要です。

## 作れたのか
無理でした。

jsfiddleのアドレスはっつけ忘れてました→https://jsfiddle.net/lovalotta/xfweu8nf/

## 実情
無理ながらも色相環っぽい何かを作ってみました。コードが鬼多くなるのを防ぐために、`currentColor`を変数的に使い、`background-image`の定義を圧縮しました。

![スクリーンショット 2015-07-11 0.22.37.png](https://qiita-image-store.s3.amazonaws.com/0/84193/49fbf7df-3290-9bdd-1ad2-299abd5d3a69.png)

うまい感じに色相環が作れる人がいたらめちゃ尊敬します。尊敬したうえに尊敬する。特上尊敬大盛りです。

作りたかった色相環はこういうやつ→http://www.kish.in.net/?p=1093

```html
<div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <b></b>
</div>
```

```css
div,div>div{
    position:relative;
    width:300px;
    height:300px;
}
div>div{
    position:absolute;
    border-radius:100%;
    background-size:70% 70%;
    background-position:center 20%;
    background-repeat:no-repeat;
    background-image:radial-gradient(
        currentColor 40%,
        rgba(0,0,0,0) 60%);
}
div>:nth-child(1){ color:hsl(  0,100%,50%); transform:rotate(0deg); }
div>:nth-child(2){ color:hsl( 30,100%,50%); transform:rotate(30deg); }
div>:nth-child(3){ color:hsl( 60,100%,50%); transform:rotate(60deg); }
div>:nth-child(4){ color:hsl( 90,100%,50%); transform:rotate(90deg); }
div>:nth-child(5){ color:hsl(120,100%,50%); transform:rotate(120deg); }
div>:nth-child(6){ color:hsl(150,100%,50%); transform:rotate(150deg); }
div>:nth-child(7){ color:hsl(180,100%,50%); transform:rotate(180deg); }
div>:nth-child(8){ color:hsl(210,100%,50%); transform:rotate(210deg); }
div>:nth-child(9){ color:hsl(240,100%,50%); transform:rotate(240deg); }
div>:nth-child(10){ color:hsl(270,100%,50%); transform:rotate(270deg); }
div>:nth-child(11){ color:hsl(300,100%,50%); transform:rotate(300deg); }
div>:nth-child(12){ color:hsl(330,100%,50%); transform:rotate(330deg); }

body>div:after{
    content:'';
    position:absolute;
    top:25%;
    left:25%;
    display:block;
    width:50%;
    height:50%;
    border-radius:100%;
    background-image:radial-gradient(
        #fff 60%,
        rgba(0,0,0,0) 62%);
}
```


# 改良版も作ってみた
悔しいのでなんとかそれっぽくしたかった。したかったけれど、ちからが及ばない。
https://jsfiddle.net/lovalotta/ray5wub6/

![スクリーンショット 2015-07-11 0.52.38.png](https://qiita-image-store.s3.amazonaws.com/0/84193/773b6fe1-498a-c3fe-19f2-d29abfb1ceb5.png)

やったこと:

- box-shadowを使って、輪郭がもやもやとした円弧を描く。
- 円弧のまわりはもやもやしすぎちゃうので、親要素でクリッピング。
- まんなかもやはりもやもやしてるので、とりあえず白サークルで塗りつぶす。
- このやり方だと色の合成（box-shadowのもやもやが加算される）重視で薄い色になっちゃうので、無理やり3倍濃縮にした（HTML部分ががんばってくれました）。
組合せ最適化 - 典型問題 - ビンパッキング問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##ビンパッキング問題

容量$c(\gt 0)$の箱と$n$個の荷物$N=\\{1,\dots,n\\}$が与えられている。荷物$i \in N$の容量を$w_i(\gt 0)$とする。全ての荷物を詰合わせるのに必要な箱の個数を最小にする詰合わせを求めよ。

##実行方法

```text:usage
Signature: binpacking(c, w)
Docstring:
ビンパッキング問題
    列生成法で解く(近似解法)
入力
    c: ビンの大きさ
    w: 荷物の大きさのリスト
出力
    ビンごとの荷物の大きさリスト
```

```python:python
from ortoolpy import binpacking
binpacking(10, [4, 5, 3, 8, 7, 6, 2, 3])
```

```text:結果
[[8], [7, 3], [5, 3, 2], [4, 6]]
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import BinPacking
BinPacking('data/binpacking.csv', 10)
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>id</th>
      <th>size</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>8.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1</td>
      <td>7.0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1</td>
      <td>3.0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>2</td>
      <td>5.0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>2</td>
      <td>3.0</td>
    </tr>
    <tr>
      <th>5</th>
      <td>2</td>
      <td>2.0</td>
    </tr>
    <tr>
      <th>6</th>
      <td>3</td>
      <td>4.0</td>
    </tr>
    <tr>
      <th>7</th>
      <td>3</td>
      <td>6.0</td>
    </tr>
  </tbody>
</table>

##データ
- [data/binpacking.csv](https://www.dropbox.com/s/cn34b9p404tvvxh/binpacking.csv)
組合せ最適化 - 典型問題 - ナップサック問題

[典型問題と実行方法](0f6c1a4415d196e64314)

##ナップサック問題

容量$c(\gt 0)$のナップサックと$n$個の荷物$N=\\{1,\dots,n\\}$が与えられている。荷物$i \in N$の容量を$w_i(\gt 0)$、価値を$p_i(\gt 0)$とする。容量制限$c$の範囲で価値の和が最大になる荷物の詰合わせを求めよ。

##実行方法

```text:usage
Signature: knapsack(size, weight, capacity)
Docstring:
ナップサック問題
    価値の最大化
入力
    size: 荷物の大きさのリスト
    weight: 荷物の価値のリスト
    capacity: 容量
出力
    価値の総和と選択した荷物番号リスト
```

```python:python
from ortoolpy import knapsack
size = [21, 11, 15, 9, 34, 25, 41, 52]
weight = [22, 12, 16, 10, 35, 26, 42, 53]
capacity = 100
print(knapsack(size, weight, capacity))
```

```text:結果
(105.0, [0, 1, 3, 4, 5])
```

```python:python
# pandas.DataFrame
from ortoolpy.optimization import Knapsack
Knapsack('data/knapsack.csv', 100)
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>size</th>
      <th>weight</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>21</td>
      <td>22</td>
    </tr>
    <tr>
      <th>1</th>
      <td>11</td>
      <td>12</td>
    </tr>
    <tr>
      <th>3</th>
      <td>9</td>
      <td>10</td>
    </tr>
    <tr>
      <th>4</th>
      <td>34</td>
      <td>35</td>
    </tr>
    <tr>
      <th>5</th>
      <td>25</td>
      <td>26</td>
    </tr>
  </tbody>
</table>

##データ
- [data/knapsack.csv](https://www.dropbox.com/s/apa4iamzthzu0au/knapsack.csv)
ActiveModel::Errorsのエラーメッセージをエラータイプにしたい

APIとか作ってると、パラメータエラーのときのレスポンスに困る。
エラーメッセージやら多言語対応などあんまり考えたくない。

そこでバリデーションは`ActiveModel`の`Validator`にぜんぶお任せしたいし、サーバ側に極力View要素のロジックを持たせたくないので、エラーメッセージに関してもクライアント側で制御して欲しい。

各Validatorにはエラーメッセージが用意されているor再定義できるが、デフォルトのエラーメッセージを使ってクライアント側で制御するには扱いにくく、すべてを再定義するのもめんどうなのでエラータイプを利用したい。

何のことかいまいち伝えにくいので具体的に。

`User`モデルに`name`のバリデーションを定義して説明してみる。

```user.rb
class User < ActiveRecord::Base
  validates :name,
    presence: true,
    uniqueness: { :case_sensitive => false },
    length: { in: 4..30 },
    format: { with: /\A[a-zA-Z][\w]{3,29}\z/ }
end
```

エラーメッセージは、以下のようなやつ。

* can't be blank
* has already been taken
* is too short
* is invalid

エラータイプは、以下のようなやつ。

* blank
* taken
* too_short
* invalid

デフォルト状態のエラーメッセージを出力してみる。

```rb
> user = User.new
> user.validate
> user.errors.messages
=> {:name=>["can't be blank", "is too short (minimum is 4 characters)", "is invalid"]}
```

`user.errors`から`type`を引き出すうまい方法がわからなかったので（※情報求む！）、`ActiveModel::Errors`を読んで、`generate_message`メソッドに細工する。

`config/initializers/active_model/errors.rb`を追加。

```config/initializers/active_model/errors.rb
module ActiveModel
  class Errors
    # Change error message to error type
    def generate_message(attribute, type = :invalid, options = {})
      type
    end
  end
end
```

エラータイプを返すようになる

```rb
> user = User.new
> user.validate
> user.errors.messages
=> {:name=>[:blank, :too_short, :invalid]}
```

これでクライアント側は各キーに対応するメッセージを出しやすくなる。

それにしてもこれでは対応が無骨にすぎる。
`validates`のオプションである`message`を定義したりできないし、まぁタイプを返したいんだから使わないんだけれども。。
`user.errors.types`とか`user.errors.types_with_message`などで取り出せるようにしたいところ。
CGRectのSwiftっぽい扱い方

## Objective-C時代のCGRectまわり :confused: 

こんなときよくあると思います。

- CGRectからwidthだけとりたい
- 最大のYの位置をとりたい
- あるCGRectにCGPointが含まれてるとかを判定したい

Objective-CのときはGlobalな関数の形で用意されていました。名前も長いので構造体の値を辿るのとそんなにコード量は変わらないのが残念でしたが、便利なのでよく使っていました。
**追記**: 構造体でアクセスした場合と関数で取得した場合に値が異なることがあるので注意してください。詳しくはコメント欄に書いてあります。

```objc

// 例1: 最小のx
CGFloat minX = CGRectGetMinX(self.view.frame); // 関数
CGFloat minX = self.view.frame.origin.x; // 構造体アクセス

// 例2: 幅
CGFloat width = CGRectGetWidth(self.view.frame); // 関数
CGFloat width = self.view.frame.size.width; // 構造体アクセス

// 例3: ゼロで初期化したCGRect
CGRect zeroRect = CGRectZero; // 定数
CGRect zeroRect = CGRectMake(0, 0, 0, 0); // zeroで初期化

// 例4: RectにPointが含まれているかどうか
CGRect rect = CGRectMake(0, 0, 100, 100);
CGPoint point = CGPointMake(50, 50);
BOOL isContainsPoint = CGRectContainsPoint(rect, point); // => YES
```

## Swift時代 :100: 

Swiftになってこんなに直感的に書けるようになりました。CGRectに対してそのままメソッド呼び出しやプロパティアクセスできるようになります:tada:

```swift
// 例1: 最小のx
let minX = self.view.frame.minX

// 例2: 幅 （今まではframe.size.widthってやる必要があった）
let width = self.view.frame.width

// 例3: ゼロで初期化したCGRect
let zeroRect = CGRect.zeroRect

// 例4: RectにPointが含まれているかどうか
let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
let point = CGPoint(x: 50, y: 50)
let isContainsPoint = rect.contains(point) // => true
```

## Swiftの便利CGRect操作一覧 :dancer: 

CGRectMakeやCGRectZero、CGRectGetWidthとかも使うことができちゃうのでこんなに便利なやつが生えてたの知らない人もいるんじゃないんでしょうか。なので、Swiftからはこっちを使いましょう！

```swift

extension CGRect {
    static var zeroRect: CGRect { get }
    static var nullRect: CGRect { get }
    static var infiniteRect: CGRect { get }
    init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat)
    init(x: Double, y: Double, width: Double, height: Double)
    init(x: Int, y: Int, width: Int, height: Int)
    var width: CGFloat { get }
    var height: CGFloat { get }
    var minX: CGFloat { get }
    var midX: CGFloat { get }
    var maxX: CGFloat { get }
    var minY: CGFloat { get }
    var midY: CGFloat { get }
    var maxY: CGFloat { get }
    var isNull: Bool { get }
    var isEmpty: Bool { get }
    var isInfinite: Bool { get }
    var standardizedRect: CGRect { get }
    mutating func standardize()
    var integerRect: CGRect { get }
    mutating func integerize()
    func rectByInsetting(#dx: CGFloat, dy: CGFloat) -> CGRect
    mutating func inset(#dx: CGFloat, dy: CGFloat)
    func rectByOffsetting(#dx: CGFloat, dy: CGFloat) -> CGRect
    mutating func offset(#dx: CGFloat, dy: CGFloat)
    func rectByUnion(withRect: CGRect) -> CGRect
    mutating func union(withRect: CGRect)
    func rectByIntersecting(withRect: CGRect) -> CGRect
    mutating func intersect(withRect: CGRect)
    func rectsByDividing(atDistance: CGFloat, fromEdge: CGRectEdge) -> (slice: CGRect, remainder: CGRect)
    func contains(rect: CGRect) -> Bool
    func contains(point: CGPoint) -> Bool
    func intersects(rect: CGRect) -> Bool
}
```
ifかelseで値が変わる変数を設定するSwiftっぽいやり方

## 判定する値がBoolの場合

例えばある値がtrueかfalseかで設定する文字列を変えたいって場合、if elseで素直に分けるか三項演算子が使えます。この場合はとても簡単です。

### if elseでやる :ok_hand: 

Swift1.2からif elseで必ず値が設定されるならば、letで宣言時に値を代入しなくてもコンパイルエラーにならなくなりました。

```swift
let result: String
if success {
    result = "OK"
} else {
    result = "NG"
}
```

### 三項演算子 :ok_hand:

もっとすっきり書きたいとき。三項演算子は賛否両論ありますが、これぐらい単純なやつは三項演算子の方が簡潔で意図が伝わりやすいと思います。

```swift
let result = success ? "OK" : "NG"
```

## Optionalな値が存在するかどうかで分けたい

こっちが本題です。ある値がOptionalな値で値が存在する場合は、その値を使って文字列を生成して、nilの場合はデフォルトっぽい文字を設定したいみたいな場合にSwiftっぽくどう書けるかという話です。

### if let 使う場合 :confused: 

正しいやり方なんですが、まぁーちょっと長いですね。

```swift
let info: Info? = nil
let result: String
if let info = info {
    result = "\(info.title):\(info.value)"
} else {
    result = "-"
}
```

### 三項演算子 :-1: 

まず、Optinalな値はBoolにならないのでそのままでは、三項演算子の条件部分には書けません。

```swift
let info: Info? = nil
let result = info ? "" : "" // => compile error
```

Optionalな値は`!= nil` で判定することもできるので三項演算子の条件部分に書けます。そもそも`nil`かどうかって書くのがいけてないのと、使うときに`!`でForce Unwrappingしなきゃいけなくて綺麗じゃないですね。

```swift
let info: Info? = nil
let resutl = (info != nil) ? "\(info!.title):\(info!.value)" : "-"
```

### 変数のGetterを利用 :ok_woman: 

これが一番Swiftっぽいかなと思います。`var` で宣言してるけど、Getterしか書いてないから、あとから代入もできないです。

```swift
let info: Info? = nil
var result: String {
    if let info = info {
        return "\(info.title):\(info!.value)"
    } else {
        return "-"
    }
}

result = "hoge" // => compile error
```

**追記**
もっといい方法ありました。

### mapを使う :confetti_ball:

@taketo1024 さんに教えてもらいました。これが一番いいですね！

```swift
let result = info.map { "\($0.title):\($0.value)" } ?? "-"
```
Windows環境でGitBucketにGistプラグインを導入

## プラグインの入手
https://github.com/takezoe/gitbucket-gist-plugin/releases から gitbucket-gist-plugin_2.11-*.jar をダウンロード

### ※ソースコードから生成する場合

1. [JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html) をインストール
1. https://github.com/takezoe/gitbucket-gist-plugin から「Download ZIP」でダウンロード
1. gitbucket-gist-plugin-master.zip を解凍
1. プロキシの設定（必要なら）
  - sbt.bat を開き、`java` の後ろに ` -Dhttp.proxyHost=<プロキシサーバのホスト名> -Dhttp.proxyPort=<ポート番号>` を記述
1. sbt.bat を実行して暫く待つ
1. プロンプトが表示されたら `package` と入力して Enter
1. また暫く待つ
1. プロンプトが表示されたら `exit`
1. `target/scala-2.11/gitbucket-gist-plugin_2.11-*.jar` が生成されている

## プラグインの配置

1. GitBucketのバージョンを最新にする
1. `gitbucket-gist-plugin_2.11-*.jar` を `GITBUCKET_HOME/plugins` にコピー
1. GitBucketを再起動
Android Lollipopでapkがインストールできない問題

USB接続して実機でデバッグできていたアプリをアンインストールした後、リリースビルドしたapkをWebページからダウンロードしてインストールしようとすると「アプリはインストールされていません。」と表示されてインストールできないという問題が発生しました。

環境はNexus 5、Android 5.1.1 Lollipopです。

![2015-07-30 22.53.51.png](https://qiita-image-store.s3.amazonaws.com/0/4240/060a10da-e107-0728-aa06-77fd4a251628.png)

同僚に、既に同じ名前のパッケージが存在する場合にこのエラーが出ると教えてもらいました。設定→アプリを確認したところ、アンインストールしたと思っていたアプリが「このユーザーでは未インストール」という表示で残っていました。

![2015-07-30 22.54.21.png](https://qiita-image-store.s3.amazonaws.com/0/4240/fc2fb0c2-d542-d5bb-6c8f-48a237e4c6be.png)

アプリの詳細を開き、メニューから「すべてのユーザーからアンインストール」を実行するとアンインストールされ、無事にAPKをインストールできるようになりました。

![2015-07-30 22.54.42.png](https://qiita-image-store.s3.amazonaws.com/0/4240/71df3dd0-8501-81fe-4f92-c484f23908d0.png)

### 考察

Android 5.0からスマホでも使えるようになったマルチユーザー機能で、ゲストユーザーが有効になっていました。

Playストアからダウンロードしたアプリはユーザーごとにインストールされますが、USB接続（adb）経由でインストールしたアプリはすべてのユーザーにインストールされるそうです。このため、ホームアプリのすべてのアプリから普通にアンインストールしただけでは、インストールされたままになってしまうようです。

参考：[Android 4.2で追加になったマルチユーザーについて、 気になっていた点を色々と調べてみたのでメモ。 ■Android…](https://plus.google.com/113262422859298193321/posts/awfsvRENYCv)

### 他の情報

最初にハマって調べたところ、JDK 7で署名がうまくできていない場合に発生するという情報がありましたが、今回は無関係でした。

ちなみにJDK 8 + Android Studio 1.2.2の環境で、GUIのBuild→Generate Signed APKから問題なくリリースビルドのAPKを生成できています。

* [適当えんじにあ( ´д｀): 【Android】インストールされていません。](http://mfsocket.blogspot.com/2011/05/android.html)
* [Platinum Fine Days](http://umehal.tumblr.com/post/84104469850/android)
Ansibleの操作対象ホスト上でファイルやディレクトリをコピーする：synchronizeモジュールの振る舞い

Ansibleにおいて操作対象ホスト上でファイルやディレクトリをコピーすることはcopyモジュールではできないが、synchronizeモジュールではできるようになっている。

synchronizeモジュールはrsyncを実行させるモジュールであり、他のモジュールにないちょっと特殊な動きをする。
というのもsynchronizeモジュールは通常、"操作対象ホスト"ではなく"Ansibleの実行ホスト"でrsyncが起動されるのだが、にもかかわらずdelegate_toアトリビュートを指定すれば"Ansibleの実行ホスト"でもなく"delegate_toで指定されたホスト"でrsyncが起動されるようにすることができるのである。

synchronizeモジュールは「rsync起動ホスト」から「操作対象ホスト」へのファイルやディレクトリのコピーを行う。[^1]
つまりdelegate_toを使って「rsync起動ホスト」を「操作対象ホスト」と同じものにしてやれば、操作対象ホスト上でファイルやディレクトリをコピーすることができる、というわけである。

[^1]: ただしこれはデフォルトのmode=pushの場合であり、mode=pullを指定した場合は「操作対象ホスト」から「rsync起動ホスト」にコピーが実行される。

操作対象ホストはplaybook中ではinventory_hostnameで取得することができる。
よって以下のようなtaskが操作対象ホスト上でコピーを行う一番単純な形である。

```yaml
- synchronize:
    src: /from_dir/
    dest: /to_dir
  delegate_to: "{{ inventory_hostname }}"
```

コピーではなく移動するならrsync_optsオプションで--remove-source-filesを付ければ良い。

```yaml
- synchronize:
    src: /from_dir/
    dest: /to_dir
    rsync_opts:
    - --remove-source-files
  delegate_to: "{{ inventory_hostname }}"
```

ただし--remove-source-filesでは移動元のファイルは消えるがディレクトリは消えず空ディレクトリが残るので、それも消したければさらにfileモジュールを使って削除する。
（synchronizeモジュールはrsyncを呼び出すため、srcのパスの最後にスラッシュを付けた場合と付けない場合の動作の違いに注意。付けた場合は「/from_dir/*」と見なされることになる）

```yaml
- synchronize:
    src: /from_dir
    dest: /to_dir
    rsync_opts:
    - --remove-source-files
  delegate_to: "{{ inventory_hostname }}"
- file:
    path: /from_dir
    state: absent
```

なお、synchronizeモジュールはrsync起動ホストにrsyncがインストールされていないと当然動作しない。[^2]
またそのオプションの多さからかバグ報告数が比較的多い気がするので期待通りの動きをしないことが割とある、かもしれない。

[^2]: ちなみにrsync起動ホストと操作対象ホストが別である場合は、どちらにもrsyncがインストールされている必要がある。

----
aws-sdk-phpのcopyObjectで謎の署名エラー

# 環境
Laravel 5.0
aws/aws-sdk-php-laravel 2系
aws/aws-sdk-php 2系

# 現象
Laravelで上記SDKのcopyObjectメソッドを使い、
AWS S3上のファイルを別の場所にコピーしようとしたら下記のエラーが出た。

```lang:
SignatureDoesNotMatchException in NamespaceExceptionFactory.php line 91:
The request signature we calculated does not match the signature you provided. Check your key and signing method.
```

ググっても有用な情報は無いし、SDKのバージョンや署名のバージョンを切り替えても変わらず、
しかも成功したり失敗したりする。

# 原因
100%ではないが何回か試した結果、
ファイル名に日本語を使ってたのが原因っぽい。。。
[jQuery] 画面表示されない。ただリサイズすると表示される。なぜ？

現在Java,JSP,jQuery,Seasar2,CSSを使ってWebアプリ開発をしています。



質問があるのですが、



通常表示されるものが表示されず、なぜかリサイズしたり、開発者ツールを出して画面が狭くなる(まぁリサイズ？)と画面表示されるという現象が起こっています。

なぜでしょうか？

またどうしたら解決できるでしょうか？





resizeメソッドは使っていますがコメントアウトしています。





あまり詳しくは情報を公開できませんが、もし何か思い当たる節がある方、わかる方がいればお教えいただきたいです。



状況としてはJSP内のデータや非表示のテキストボックス、セレクトボックスをjQueryで表示させるという処理の部分です。
Use the one liner, get coverage of multiple packages !

# The One Liner

```bash
echo "mode: count" > coverage.txt;for pkg in `find . -maxdepth 3 -path '*_test.go' -type f | xargs -I{} dirname {} | uniq`;do go test -covermode=count -coverprofile=temp.cov $pkg && tail -n +2 temp.cov >> coverage.txt || exit 1;rm temp.cov;done
```

## Format

```bash
echo "mode: count" > coverage.txt
for pkg in `find . -maxdepth 3 -path '*_test.go' -type f | xargs -I{} dirname {} | uniq`
do
  go test -covermode=count -coverprofile=temp.cov $pkg && tail -n +2 temp.cov >> coverage.txt || exit 1
  rm temp.cov
done
```

## I discover better practice !

```bash
echo "mode: count" > coverage.txt
for pkg in `go list -f="{{if .TestGoFiles}}{{.ImportPath}}{{end}}" ./...`
do
  go test -covermode=count -coverprofile=temp.cov $pkg && tail -n +2 temp.cov >> coverage.txt || exit 1
done
```
Node.js, io.js のホットデプロイ用ソフトウェア



どこ行ったかわからなくなりそうなので
node.js jpのML流れていたもののメモ


## ホットデプロイ


Unitech/PM2
https://github.com/Unitech/pm2
 
andrewrk/naught
https://github.com/andrewrk/naught
 
doxout/recluster
https://github.com/doxout/recluster
 
isaacs/cluster-master
https://github.com/isaacs/cluster-master
 
 
 
Wada Takutoさんメールの引用
差集合を取りたいとき…

2つの配列の差を取りたいとき，`Array#-` という名前的にもどんぴしゃなメソッドがあるわけですが，


> self - other -> Array[permalink][rdoc]
>    自身から other の要素を取り除いた配列を生成して返します。
>    要素の同一性は Object#eql? により評価されます。 self 中で重複していて、other中に存在していなかった要素は、その重複が保持されます。 


と書いてあります ( http://docs.ruby-lang.org/ja/2.2.0/class/Array.html )．

つまり，以下の結果は空の配列ではありません．

```rb
class C
  def ==(other)
    true
  end
end

[C.new, C.new, C.new] - [C.new, C.new, C.new]  #=> [#<C:0x007fc6dc98d370>, #<C:0x007fc6dc98d348>, #<C:0x007fc6dc98d320>]
```

`==` で比較してくれるものだと思い込んでいたので，あれ？ってなりました．`==` を使いたければ，

```
a = [C.new, C.new, C.new]
b = [C.new, C.new, C.new]
a.reject{|e| b.include? b}
```

とかですかね．

`Array#include` は

> include?(val) -> bool[permalink][rdoc]
>    配列が val と == で等しい要素を持つ時に真を返します。 

なので ( http://docs.ruby-lang.org/ja/2.2.0/class/Array.html )，上の結果は `[]` になります．

ということを今更ながら知りました．めでたし．
Google検索でLDRizeが動かなくなっていたのを修正した


Google検索結果のDOM構造が変わっていたので動くように書き換えた

```diff
 const SITEINFO = [
 {
   "name":"Google",
-  "paragraph":"id(\"res\")//li[contains(concat(\" \",normalize-space(@class),\" \"),\" g \")]",
+  "paragraph":"id(\"res\")//div[contains(concat(\" \",normalize-space(@class),\" \"),\" g \")]|id(\"res\")//li[contains(concat(\" \",normalize-space(@class),\" \"),\" g \")]",
   "domain":"^https?://(www|encrypted)\\.(?:l\\.)?google\\.(?:[^.]+\\.)?[^./]+/",
   "stripe":"1",
   "link":".//a",
   "exampleUrl":"http://www.google.com/"
}
]

```
sublime text3 設定内容　メモ

# sublime text 3の構成メモ

## インストールしたpackage list

# ◆更新　2015/10/14
```lang:sublime_text_3
Alignment
AlignTab
All Autocomplete
AndyPHP
AngularInject
ApacheConf.tmLanguage
AutoFileName
Autoprefixer
BracketHighlighter
Browser Refresh
Color Highlighter
ColorPicker
ConvertToUTF8
CSS Snippets
CSScomb
DataConverter
DocBlockr
Dotfiles Syntax Highlighting
ElasticTabstops
Emmet
Emmet Css Snippets
FindKeyConflicts
Git
GitDiffHelper
Gitignore
GlassIt
Goto-CSS-Declaration
Hayaku - tools for writing CSS faster
HTML-CSS-JS Prettify
HTML5
IMESupport
Japanize
Javap
Javatar
jQuery
jQueryDocs
LiveReload
LiveStyle
Nettuts+ Fetch
OmniMarkupPreviewer
Package Control
Ruby on Rails snippets
SublimeCodeIntel
sublimelint
SublimeLinter
SublimeLinter-contrib-java
SublimeLinter-csslint
SublimeLinter-html-tidy
SublimeLinter-javac
SublimeLinter-jshint
SublimeLinter-php
SublimeLinter-phpcs
SublimeLinter-phplint
SublimeLinter-phpmd
SublimeLinter-ruby
Tag
Terminal
TrailingSpaces
View In Browser
Wordless
wpseek.com WordPress Developer Assistant
```

~~```lang:sublime_text_3
Alignment
AlignTab
All Autocomplete
AndyPHP
AngularInject
ApacheConf.tmLanguage
AutoFileName
Autoprefixer
BracketHighlighter
Color Highlighter
ConvertToUTF8
CSScomb
DataConverter
DocBlockr
Dotfiles Syntax Highlighting
ElasticTabstops
Emmet
FindKeyConflicts
Git
GitDiffHelper
Gitignore
GlassIt
Goto-CSS-Declaration
Hayaku - tools for writing CSS faster
IMESupport
Japanize
Javap
Javatar
jQuery
jQueryDocs
LiveReload
Nettuts+ Fetch
OmniMarkupPreviewer
Package Control
Ruby on Rails snippets
SublimeCodeIntel
SublimeLinter
SublimeLinter-contrib-java
SublimeLinter-csslint
SublimeLinter-html-tidy
SublimeLinter-javac
SublimeLinter-jshint
SublimeLinter-php
SublimeLinter-phpcs
SublimeLinter-phplint
SublimeLinter-phpmd
SublimeLinter-ruby
Terminal
TrailingSpaces
View In Browser
Wordless
wpseek.com WordPress Developer Assistant
```~~
## tabインデントの設定

基本設定のtabインデントサイズ設定

```lang:tab_size
    # 47行目付近
    // The number of spaces a tab is considered equal to
    "tab_size":2,
```


◆インストールしたパッケージをアンインストールする手順
http://techmemo.biz/sw/sublime-text-package-uninstall/