OmniAICreator/Qiita-1.07M huggingface dataset:
Computational Optimal Transport 精読会 記録 (#17: 4.5)

# 背景


- 前回: [Computational Optimal Transport 精読会 記録 (#16: 4.4 その2)](https://qiita.com/takilog/items/0849d543bbdfd7a9c971)は7/26に開催，今回は7/31に開催
- 職場でCOTを読んでおり，{自己満足,復習,将来のため}などの理由で記録をしている


### 前回の振り返りと今回の内容

- エントロピー正則化付き最適化問題
    - Primal (4.2) $L^\varepsilon\_C({\bf a}, {\bf b}) = \min_{{\bf P}\in U({\bf a},{\bf b})} \langle {\bf P}, C\rangle - \varepsilon H({\bf P})$
    - Dual (4.30) $L_C^\varepsilon(a,b) = \max_{f, g} \langle f, a\rangle + \langle g, b\rangle - \varepsilon \langle \exp(f/\varepsilon), K\exp(g/\varepsilon)\rangle$
- Sinkhornアルゴリズム最高 → ちゃんと収束するし，高速化できるよ．安定化するためにはLogドメインが必須だよ．
  - $\mathbf{u}^{(l+1)} = \frac{\mathbf{a}}{\mathbf{Kv}^{(l)}}$, $\mathbf{v}^{(l+1)} = \frac{\mathbf{b}}{\mathbf{K}^T\mathbf{u}^{(l + 1)}}$
- 今回: 近似性能とかについて知りたい

----

- この章ではずっとエントロピー正則化について話をしているが，ところで元の最適化問題との関係性はどうなっているのか，について確認していく

## Prop 4.5 エントロピー正則化付きdual問題の解は，正則化なし問題の解の下界になる

- (4.30)の最適解$f^\star, g^\star$は，元の問題のfeasibleなdual$(f^\star, g^\star)\in R(C)$になっている
- 結果として下界になる
    - $\langle f^\star, a\rangle + \langle g^\star, b\rangle \leq L_C(a, b)$

### Prop 4.5の証明

- $\exp(-(f^\star_i + g^\star_j - C_{ij}) / \varepsilon) \leq 1$ より成り立つ


### Prop 4.5の嬉しいところ

- (4.2)がsmooth & convexであり，最適解が求まる
- (4.2)Primalの最適解から，(4.30)Dualの最適解を復元でき，これが元の$L_C(a,b)$の下界になる


## Prop 4.6

- $L_C^\varepsilon(a,b)$が$a, b$のjointly convex functionであり，勾配方向を作れる
    - この$f^\star, g^\star$を使っている（理由はよくわからない）

$$\nabla L_C^\varepsilon (a, b) = \begin{pmatrix} f^\star \\\\ g^\star \end{pmatrix}$$

## Def 4.1 Sinkhorn divergences

- (4.2)と(4.30)の最適解を$P^\star, f^\star, g^\star$とし，以下の値を計算する
    - $\mathfrak{P}^\varepsilon_C(a,b) := \langle C, P^\star\rangle$
    - $\mathfrak{D}^\varepsilon_C(a,b) := \langle f^\star, a\rangle + \langle g^\star, b\rangle$ ← これはProp 4.5の左辺

- 次のProp 4.7が成り立つ

## Prop 4.7 

$$\mathfrak{P}^\varepsilon_C(a,b) \leq L_C(a,b) \leq \mathfrak{D}^\varepsilon_C(a, b)$$

### Prop 4.7の意味

- 正則化付きの解によって，元の最適化問題の上界・下界が得られる

### Prop 4.7の証明

- 式変形から成り立つ

### Prop 4.7の補足

- これは収束した後にのみ成り立つので，Sinkhornを途中で止めた場合には必ずしも成り立たない
- しかしせいぜい$L$回程度計算した場合の解を利用した値であっても利用できる
    - $\mathfrak{D}_C^{(L)}(a,b) := \langle f^{(L)}, a\rangle + \langle g^{(L)}, b\rangle$


## Prop 4.8 L回の場合

$$\mathfrak{D}^{(L)}\_C(a, b) \leq L_C(a,b)$$

### Prop 4.8の証明

- 上と同じ．ここはPDFだと$\epsilon$がついているけど，たぶん間違いじゃないかなと推測．
- 以下に残りの主張を書く．

## Remark 4.26

- 以前，Sinkhornの計算を補正するAltschuler et al. 2017の式を書いた
- ここで言っていることは更新のタイミングによっては$P^{(2L+1)}$のようなPrimal側の値でバウンドを考えてもダメだよ，という話

## Remark 4.27

- 非凸性について
- 数値的に非凸である例がすぐ出てくるので，証明しなくてよい
- ただし，行列計算程度のものになっているので，数値微分はできる(autogradとか)(たぶんそういう意味)


# Next

- §4.6を読んで，ついに§4が終わり
青森ねぶた祭のタイトルをwordcloudする

2001年から2019年のねぶたの418タイトルをワードクラウド。
colabで。MeCab＋mecab-ipadic-neologdで分かち書きしてワードクラウドにぶん投げた。



#結果

全体

![word_cloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163974/ef989e55-ba57-c663-3b9f-f57cc29a9008.png)


#作者別でワードクラウド

##author 竹浪 比呂央

![word_cloud (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163974/1b11d9ba-503f-644a-a954-c61d95d83019.png)


##author 千葉作龍

![word_cloud (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163974/88fee850-e462-2370-22cb-32e712185ce3.png)


##author 北村 隆

![word_cloud (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163974/ef5658b3-e1b4-4a98-9ddb-fa4102b636d4.png)


##author 北村 麻子

![word_cloud (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163974/7a8b3280-357f-5134-7bf0-c07a4066abde.png)



#年代別でワードクラウド

## 2019

今

![word_cloud (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163974/b2f1e5a9-2fdb-0163-b0d4-8737039fc74d.png)


##2011

8年前

![word_cloud (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163974/f09e18a9-fbfc-0311-f5c6-964d65bbddc0.png)


##2001

18年前

![word_cloud (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163974/286836c0-d606-2dab-ac4c-62b13ef2c923.png)
ECS+Rails(Puma)がDBの最大接続数で詰んだときの計算

説明する機会があったので、ついでにメモしておこう的な
間違ってたら教えてください :bow_tone1: 

## 最大接続数で詰み
DBには最大接続数というのがあります
コネクションを張れる最大の数ですね
たとえばAWSのAuroraだと[この辺](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.Performance.html)に書いてあります

無闇にRailsをスケールアウトしても、結局このDBの最大接続数が限界になって詰んでしまう、ということがあります
それくらい考えてスケールしろよっていうツッコミは置いておいてください…

## 設定
### Pumaの設定
`puma.rb` の話です
`WEB_CONCURRENCY` でworker数≒(子)プロセス数になります
ECSで使うインスタンスのリソースにあわせて設定するべきですが、今回はテストなので**2**にしてみましょうか
4でもいい気がするけど

`RAILS_MAX_THREADS` でスレッド数の上限を設定できます
Pumaはマルチスレッドなので〜云々っていうけどJRubyとかではなく普通のRubyなのでこれをあんまり増やしても意味ないんですね
とはいえ恩恵を受けられる部分もないこともないので、**8**とかにしてみましょうか

### コネクションプールの設定
今度は `database.yml` の話です
実はデフォルトだとこれもスレッド数と同じ `RAILS_MAX_THREADS` を見ているので、先ほど設定した **8**になります
まあ意図的にこれをスレッド数とわける必要はないと思います

## 試算
では実際に試算してみましょう
たとえばECSのリソースは2CPUとかで、1インスタンス1タスクだったとして

1タスク=2Pumaワーカー
1Pumaワーカー=8スレッド=8コネクション
1タスク=1インスタンス=8コネクションx2Pumaワーカー=16コネクション

DBに対して、1タスク(1インスタンス)が最大で16コネクション張ることが想定できます
冒頭のリンクだと、Aurora MySQLの `db.t2.medium` はデフォルト最大90コネクションなので、このECSクラスタ内でタスクをオートスケールさせるなら、5タスク(=最大80コネクション)までにしておくのがよさそう、というのがわかりました

## 以上
負荷が高くなってオートスケールの設定を入れようと思ったら、ちゃんとDB側の接続数も考えてスケールさせないといけませんね、という話でした
エクセルのVLOOKUP機能を利用した辞書・ゆらぎ補正機能

とある業務でエクセルを利用したこんな業務を行うことになりました。
あまり正確には仕事内容を話せないので、多少ごまかした書き方になります。

・システム内のさまざまな機能の設計書（数百ファイル）がある。
・その設計書にはそれぞれ参照しているDBのテーブル名の一覧が書かれている。
・ただし現行のDBではテーブルの削除や名称の変更があり、またそもそも
　設計書作成段階での記載ミスもあるため一度すべての設計書を
　最新のテーブル一覧に対応した正しい内容に修正したい。

このような作業を行うことになりましたが、設計書を一つずつ、その中でテーブルを
一つずつ照らし合わせていくと大変な時間がかかってしまします。

いくらでもスマートな方法はありそうですが、当時私はエクセル関数を利用して
以下の方法を取ることにしました！



まずは新規のExcelファイル（以下ワークファイル）を作成し、
DB設計書から現行のテーブル一覧をA列に縦に並べます。
![キャプチャ13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429234/5cc634c1-22a2-1e9c-4bd0-00d6c34a6dbc.png)

そしてA列の内容を、そのままB列へコピーします。
![キャプチャ14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429234/789b2ebe-33f8-cbc3-04b1-182d415e2ffc.png)


そして各機能の設計書から、参照しているテーブル一覧をワークファイルの適当な位置
（今回は同シートD2セルから）へ貼り付け。
![キャプチャ11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429234/3fa264d6-9366-f995-68c2-b689c3a3938e.png)
　　↓
![キャプチャ15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429234/bfbc9b3f-82f6-5dab-e18b-9dd7e2c549c1.png)


そしてその隣のセルへ
=VLOOKUP(D2,A:B,2,FALSE)
と関数を投入して下までコピーすると・・・
![キャプチャ16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429234/c353ed2d-d3d7-cbb2-d69d-c20d7480b9e5.png)

とこのように設計書に該当する正しいテーブル名が取得されます。
そして「#N/A」となっている部分はどうやら該当する項目が見つからなかったので、
この時は左のA列B列に設計書に書かれたテーブル名と正しいテーブル名を並べて
追加してやります。
例えば調査した結果D3セルの「役職情報」は「新規役職情報」が
D5セルの「地域マスタ」は「全国地域マスタ」がそれぞれ正しい名前だと
判明した場合
![キャプチャ17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429234/a767053e-b17d-e885-a96c-18c16fe181a6.png)


このようにリストを追加してやることで、E3、E5セルに正しい名称が
取得されます。このE列をそのまま設計書の方へ反映させてやることで、
一つのファイルが修正完了となります。
精査する対象が１件だけの場合は普通に調べたほうが早くて簡単ですが、
次の設計書からは追加したテーブル名についてはいきなり反映されるので
![キャプチャ12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429234/b88fec53-8a3b-468b-be3c-4d5be7ab49f5.png)


例えば次に↑のような設計書を精査する場合
![キャプチャ18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429234/e774614a-860f-b5f3-2050-4cfbcab6ba34.png)

リストの追加も不要でそのままE列の情報をコピーしてやるだけでOKです！


かなり限定的な用途ですが、やってる内容自体はとても単純なものなので、
似たようなことを行う際にはちょっと思い出してもらえれば幸いです。
シフト演算子をオーバーロードして快適なデバッグ生活を送る

# C++における演算子オーバーロード
C++ではオーバーロードの内容を関数ように記述することによって，演算子オーバーロードを実現します．
ここでは今回オーバーロードしたいシフト演算子を例にとります．

```C++:演算子オーバーロードの例
std::ostream& operator<< (std::ostream& os, std::pair<int, int> p) {
	os << "[" << p.first << "," << p.second << "]";
	return os;
}
```
イメージとしては`operator<<` という関数を新しく作成したと考えてください．
返り値に`std::ostream&`，引数に`os`と`p`を持つ関数です．
`std::ostream&`になじみがないかもしれませんが，`std::cout`の型だと思ってもらえればオーケーです．

```c++:オーバーロードした演算子の呼び出し
std::pair<int, int> sample_pair = std::make_pair(1, 2);
std::cout << sample_pair;
```

関数の呼び出しに演算子を使うのが通常の関数との違いです．
シフト演算子は二項演算子なので引数を二つ取ります．
今回の場合は`os=std::cout`，`p=sample_pair`として `operator<<`という関数が呼び出されたと考えることが出来ます．

#演算子オーバーロードでデバッグ
ここまでを読んで勘の良い方はお気づきかもしれませんが，デバッグ出力をしたい変数の演算子オーバーロードを記述しておけばとても簡単にデバッグが可能です．
例えば配列の要素を見たければ

```c++
template<typename T>
std::ostream& operator<< (std::ostream& os, std::vector<T>& v) {
	os << "[ ";
	for (T& x : v)os << x << " ";
	os << "]";
	return os;
}
```
といった具合です．
# 演算子オーバーロードのスコープ
演算子オーバーロードも通常の関数と同じようなスコープを持ちます．
そのためクラスのメンバ関数とする，適切な名前空間に配置するなどして意図しない呼び出しを防ぐ工夫が大切です．
#まとめ
普段`std::cout`を使うのと同じ感覚でデバッグ出力が出来る演算子オーバーロードについて紹介しました．
`std::cerr`などにも同じように使えるので是非！
2 大 Android で Toast が表示されない原因

## その :one:

[`.show()`](https://developer.android.com/reference/android/widget/Toast.html?#show()) を付け忘れていると表示されません :no_good: 

```kotlin
Toast.makeText(this, "テキスト", Toast.LENGTH_LONG).show()
```

## その :two:

**設定 > [該当アプリ]** の「**通知の表示**」を OFF にすると [Toast](https://developer.android.com/reference/android/widget/Toast.html) が出なくなります。

![Screenshot_1565159694.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6881/4c73ff5c-46d0-a088-2164-6026f543a6af.png)

[Snackbar](https://developer.android.com/reference/android/support/design/widget/Snackbar) であれば「**通知の表示**」が OFF になっていても表示されます :ok_woman:
nn.KLDivLossの引数で迷ったのでメモ

# なにをしたいか
- nn.KLDivLossの引数を確認する

# Kullback-Leibler Divergence
２つの分布の距離を表現できる。
分布Pと分布Qがどれくらい離れているかを評価する場合はこのように表現する

```math
D_{KL}(P || Q) = \int_{-\infty}^{\infty}P(x)\log\biggl(\frac{P(x)}{Q(x)}\biggr)dx
```

離散確率分布であればシグマに置き換えればいい

```math
D_{KL}(P || Q) = \sum_{x\in X}P(x)\log\biggl(\frac{P(x)}{Q(x)}\biggr)
```

# nn.KLDivLoss
```python:PとQの値
import torch
P = torch.Tensor([0.36, 0.48, 0.16])
Q = torch.Tensor([0.333, 0.333, 0.333])
```

```python:普通に計算する場合
(P * (P / Q).log()).sum()
# tensor(0.0863)
```

```python:nnから呼ぶ場合
import torch.nn as nn
kldiv = nn.KLDivLoss(reduction="sum")
kldiv(Q.log(), P)
# tensor(0.0863)
```

```python:nn.functionalから呼ぶ場合
import torch.nn.functional as F
F.kl_div(Q.log(), P, None, None, 'sum')
# tensor(0.0863)
# 第3、4引数は、deprecatedなのでほっておいて、第5引数で設定する。
```

reductionの値は、デフォルトはmean。
- 'none': no reduction will be applied
- 'batchmean': the sum of the output will be divided by the batchsize
- 'sum': the output will be summed
- 'mean': the output will be divided by the number of elements in the output

# References
(1) [KL Divergence for two probability distributions in PyTorch](https://stackoverflow.com/questions/49886369/kl-divergence-for-two-probability-distributions-in-pytorch?rq=1)
(2) [Kullback–Leibler divergence](https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence#Basic_example)
(3) [KLDivLoss](https://pytorch.org/docs/stable/nn.html#torch.nn.KLDivLoss)
(4) [kl_div](https://pytorch.org/docs/stable/nn.html#torch-nn-functional)
Learn Admin Essentials in Lightning Experienceの躓いたところまとめました。

### 概要
[Learn Admin Essentials in Lightning Experience](https://trailhead.salesforce.com/ja/content/learn/trails/learn-admin-essentials)

[これ](https://trailhead.salesforce.com/ja/content/learn/superbadges/superbadge-lex-rd "Lightning Experience Reports & Dashboards Specialist")の前提になっているProjectが含まれているので現在攻略中です。

基本的に指示通りに進めれば通過できるのですが、一部日本語訳が違っていたり、手順どおりに進めてもうまくいかない部分があったのでまとめました。タイトルにない番号はtrailの指示どおりに進めることができたものです。
「1.5」であれば1番目のProjectの中の5番目って感じで統一したので参考までに。

### 前提
「自分はこうやったら通過できた」という話なのでその点ご容赦ください。

組織の言語は英語にしたほうがよいです。全て英語に統一して作業を進めました。
参考: [Trailheadで複数形の表示ラベル記入を指示されたときの対処方法](https://qiita.com/takeakiooiwa/items/22a43212c2fdca9cf2a8)
(業務では日本語環境なので日本語で使いたい本音)

### 2.4 メールのレターヘッドとテンプレートの設定

~~Configure an Email Letterhead and Templateの和訳が原文と全然違うので原文の手順を和訳してみた
(2019/08/05時点)~~
修正されたようです。

### 3.2 ユーザの新規作成およびユーザによる取引先の削除

「(GMT -07:00) Pacific Standard Time (America/Los_Angeles) 」 という項目は見当たりませんでした。
GMTが同じ-7hのものは以下の3つ

* (GMT -07:00) Mountain Standard Time (America/Phoenix)
* (GMT -07:00) Pacific Daylight Time (America/Los_Angeles)
* (GMT -07:00) Pacific Daylight Time (America/Tijuana)

(GMT -07:00) Pacific Daylight Time (America/Los_Angeles)を使ったらうまくいきました。
8月はサマータイムだから、自動で表示が変わったのかなーと思いました。

### 4.1 【修正されていました】セールスパスのカスタマイズ

日本語と英語で違っている部分が2点。

* セールスプロセスの作成、手順4で削除する項目が違っています。正しくは(英語版は)以下の3つをremove
   * Value Proposition (Open, 50%, Pipeline)
   * Id. Decision Makers (Open, 60%, Pipeline)
   * Perception Analysis (Open, 70%, Pipeline)
* レコードタイプ作成時のレコードラベルが間違っています。正しくは(英語版は)**``B2B Opportunities``**<br>
(次のチャレンジの「パスの設定」も``B2B Prospecting``を``B2B Opportunities``と読み替える)

### 4.3 Kanban ビューでの商談の操作

[Work with Opportunities in the Kanban Viewの書いてあることが一部間違っているっぽいので相違点をまとめてみた。](https://qiita.com/jitaoepsilon/items/f793103b987db4655afd)

### 8.2 数式項目の作成

新しい組織を使わないと検証に成功しないようです。
[Trailblazer Communityより](https://success.salesforce.com/answers?id=9063A000000lM0OQAU)
このチャレンジの操作だけ新しい組織を作れば成功しました。

### (9.1 サポートプロセスの作成)

既存のNoah Larkinの情報を修正しても問題なく通過できました。
手順どおり新規作成でできるのかは不明ですが、いずれにせよアクティブユーザーが制限越えるはずなのでdeactivateする必要があるかもしれないです(未検証)

### (9.2 レコードタイプの作成)

Product Supportについては既存のレコードタイプの設定の修正で成功しました。
Type項目は修正せずそのままでした。

### 10.2 Einstein リードスコアリングの設定

日本語版に「Remote Site Setting」の手順が抜けている。

> If your instance is not listed in Remote Site Settings, you will need to add it:
Click New Remote Site.
In the Remote Site Name, enter <your instance name>. For example: NA112
In the Remote Site URL, enter https://<your instance name>.salesforce.com 
For example: https://na112.salesforce.com
Computational Optimal Transport 精読会 記録 (#16: 4.4 その2)

# 背景


- 前回: [Computational Optimal Transport 精読会 記録 (#15: 4.3 その2，4.4 その1)](https://qiita.com/takilog/items/c017aeb5982967290ebe)は7/16に開催，今回は7/26に開催
- 職場でCOTを読んでおり，{自己満足,復習,将来のため}などの理由で記録をしている


### 前回の振り返りと今回の内容

- エントロピー正則化付きの輸送問題
    - $L^\varepsilon\_C({\bf a}, {\bf b}) = \min_{{\bf P}\in U({\bf a},{\bf b})} \langle {\bf P}, C\rangle - \varepsilon H({\bf P})$
- Sinkhornアルゴリズム最高 → ちゃんと収束するし，高速化できるよ．安定化するためにはLogドメインが必須だよ．
  - $\mathbf{u}^{(l+1)} = \frac{\mathbf{a}}{\mathbf{Kv}^{(l)}}$, $\mathbf{v}^{(l+1)} = \frac{\mathbf{b}}{\mathbf{K}^T\mathbf{u}^{(l + 1)}}$
- エントロピー正則化付きのdual問題
    - $L_C^\varepsilon(a,b) = \max_{f, g} \langle f, a\rangle + \langle g, b\rangle - \varepsilon \langle \exp(f/\varepsilon), K\exp(g/\varepsilon)\rangle$
- 今回: 詳細を確認していく

----

## Remark 4.21

- Sinkhornアルゴリズムは$u, v$を交互に更新していくので，これをblock coordinate ascentとして見てみよう
- それぞれ$f, g$について偏微分すると(4.33), (4.34)を得る
    - (4.33) $\nabla|_f Q(f, g) = a - \exp(f/\varepsilon) \odot (K\exp(g/\varepsilon))$
    - (4.34) $\nabla|_g Q(f, g) = b - \exp(g/\varepsilon) \odot (K^T \exp(f/\varepsilon))$
- $f$と$g$側をそれぞれcoordinateとみなして，交互に更新すると，(4.35), (4.36)を得る
- 例えば式(4.33)=0とした場合
    - $a = \exp(f/\varepsilon) \odot K \exp (g / \varepsilon)$
    - 両辺の対数を取って
    - $\varepsilon \log a = f + \varepsilon \log (K\exp(g / \varepsilon))$
    - $f$を更新する形の式にすると
    - $f^{(l+1)} = \varepsilon a - \varepsilon \log (K\exp(g^{(l)} / \varepsilon))$ → 式(4.35)


## Remark 4.22

- 更新式(4.35)と(4.36)はblock coordinate ascentとしても見ることができるが，soft-minimumとしても見ることができる
- soft-minの定義

$$\min\_\varepsilon \mathbf{z} = -\varepsilon \log \sum\_i \exp(-\mathbf{z}\_i / \varepsilon)$$

- 目を薄めてみると，式(4.35), (4.36)の更新式はsoft-minをしていると考えられる
- soft-minの記号($\min_\varepsilon$)で更新式を書き直す
    - (4.35)を書き直した(4.38): $f^{(l+1)}) = \min\_\varepsilon \\{ (C_{ij} - \mathbf{g}_j^{(l)}) \\} + \varepsilon \log a$
        - ちょっと記号が怪しいかもしれない（添字）

- この操作を簡単に書くために2つのオペレータを定義

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7181/007d7679-bef8-99f2-bbfa-e78b58f2258e.png)

- これを用いて式(4.40), (4.41)のような更新式が得られる
    - これはエントロピー正則化付きのC-変換みたいな操作になっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7181/a69ed01e-3678-a379-ccd3-f0f892ba2965.png)

- 実装的な話をすると，機械学習でよく出てくるlog-sum-expも使ってね

# Next

- 式が多すぎてQiitaエディタ入力が面倒になった
- 次回は§4.5に沿って近似解法についてやっていく
(转)React事件处理函数必须使用bind(this)的原因

1.JavaScript自身特性说明
如果传递一个函数名给一个变量，之后通过函数名()的方式进行调用，在方法内部如果使用this则this的指向会丢失。
示例代码：
首先我们创建test对象并直接调用方法 ：

const test = {
    name:'jack',
    getName:function(){
        console.log(this.name)
    }
}
test.getName()
1
2
3
4
5
6
7
使用node test.js执行上述代码可以正常输出jack。 
之后，我们对代码进行调整：

const test = {
    name:'jack',
    getJack:function(){
        console.log(this.name)
    }
}
const func = test.getJack;
func();
1
2
3
4
5
6
7
8
我们没有直接调用对象的方法，而是将方法声明给一个中间变量，之后利用中间变量()调用方法，此时this则失去指向，输出undefined，如果使用node环境执行js文件则输出node相关信息，如嵌入到html中则this指向window对象。

2.React事件绑定
React中的bind同上方原理一致,在JSX中传递的事件不是一个字符串，而是一个函数（如:onClick={this.handleClick}），此时onClick即是中间变量，所以处理函数中的this指向会丢失。解决这个问题就是给调用函数时bind(this)，从而使得无论事件处理函数如何传递，this指向都是当前实例化对象。 
当然，如果不想使用bind(this)，我们可以在声明函数时使用箭头函数将函数内容返回给一个变量，并在调用时直接使用this.变量名即可。示例代码如下：

import React from 'react';
export default class Life extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            count:4
        };
    }
    render(){
        var style = {
            padding:'10px',
            color:'red',
            fontSize:'30px'
        }
        return (
            <div style={style}>{/*注意js语法使用一个括号{}去表示,style使用两个括号,原因里面其实是一个对象*/}
                <p>React生命周期介绍</p>
                <button onClick={this.handleAdd}>无bind点击一下</button>
                <button onClick={this.handleClick.bind(this)}>有bind点击一下</button>
                <p>{this.state.count}</p>
            </div>
        )
    }
    //此时this指向是当前实例对象
    handleAdd = ()=> {
        console.log(this)
        this.setState({
            count:5
        })
    }
    handleClick(){
        this.setState({
            count:6
        })
    }
}
--------------------- 
版权声明：本文为CSDN博主「汪喆_Jack」的原创文章，遵循CC 4.0 by-sa版权协议，转载请附上原文出处链接及本声明。
原文链接：https://blog.csdn.net/qq_34829447/article/details/81705977
pipでcabocha-python のインストールができない現象について

#困ったこと
CaboCha本体のインストールした後にcabocha-pythonがうまくインストールできなくてハマりました。
>'stdexcept' file not found

というエラー。

cabochaではないのですが、
2018/12/10 に投稿された「mecab-python3 のインストールができない事象」に似ていたので同じ現象かなと思い同じ解決方法を試したら治りました。

https://teratail.com/questions/163226
（mecab-python3 のインストールができない事象）

#備考
CaboCha本体のインストールは下記を参考にしました。
https://m0t0k1ch1st0ry.com/blog/2016/07/30/nlp/
cabocha-pythonはこちらを参考にしています。
https://qiita.com/yukinoi/items/f7e0a817fbdc36058256

#環境
Mac-os:10.14.5
python:3.7.0
Cabocha:0.68

#試したこと

https://developer.apple.com/download/more/
よりcommand line tools 9.4をインストール

もしかしたらcommand line toolsが最新のバージョンだとできないのかもしれません。理由はわかりません。
問題の特定ができていないので、違う原因なのかもしれませんが、同じような現象が起きたら試してみてください。
slimでVue.jsのMustache構文 {{ }} を書く方法

## 追記
とても勉強になるコメントを頂きました。ぜひコメント欄も含めてご覧ください。

## 対象のhtml.erb
```sample.html.erb
<div id="app">
  <p>{{ name }}</p>
  <input v-model="name">
</div>
```

```main.js
var app = new Vue({
  el: '#app',
  data: {
    name: 'hoge'
  }
})
```


## 素直にslimで {{}} を書くと……

```sample.html.slim
#app
  p {{ name }}
  input v-model="name"

```
となると思いますが、これだとエラーがでます。
pタグにそのままMustache構文は書けないんですね。

### 追記
> 最初の { が p 要素の属性指定の始まりと解釈されるのに，その次にまた { が来て属性とは解釈しえない，ということですね。だからエラーになる。

↑コメントより引用


## slimではこう書きます
```sample.html.slim
#app
  p v-text="name"
  input v-model="name"
```

## [別解]こんな書き方もあるらしい
```sample.html.slim
#app
  p = "{{name}}"
  input v-model="name"

```
参考：https://qiita.com/moriyaman/items/14f7fda3a3b0895bc33f
PHP(Laravel)で動画等のサイズが大きいファイルをアップロードするには

# 目的
PHPでアップロードするファイルサイズの変更。
PHPではファイルサイズが2MBより大きいとエラーになってしまうため。

## php.iniの設定

まずはphp.iniファイルの場所を確認。

```
php -i | grep php.ini
# =>Loaded Configuration File => /etc/php.ini
```

/etc/php.iniを開き、以下の設定を変更します。

- [upload_max_filesize](https://www.php.net/manual/ja/ini.core.php#ini.upload-max-filesize)

アップロードされるファイルの最大サイズ。
目的のファイルサイズ以上の値を設定する。
デフォルトは2M。

- [post_max_size](https://www.php.net/manual/ja/ini.core.php#ini.post-max-size)

サーバへ送られるデータの最大サイズ。
upload_max_filesizeより大きい値を設定する。
デフォルトは2M。

## おまけ

動画ファイルを扱う際はvideoタグを使用すると便利。
参考：[【videoタグ】HTMLで動画を埋め込む方法を徹底まとめ](https://webliker.info/52510/)
Introduction to Angular 5

Open Sourced and Type Script based Angular is a framework mainly designed for Web Application development purpose, it’s handled by the Team of Google named as Team Angular’ and individual community with few corporations. AngularJS as a base version is evolved to solve errors and problems occurs during any single page application development phase. With the help of Angular framework now it’s too easy to rectify errors and save the time during Application development and Testing

for more info please visit https://www.sevenmentor.com/angular5-training-institute-in-pune.php
Work with Opportunities in the Kanban Viewの書いてあることが一部間違っているっぽいので相違点をまとめてみた。

## 概要

* [Select Fields to Displayの順番](#select-fields-to-display-の順番)
* [絞り込み条件](#【日本語版】絞り込み条件が違う)

の2本立てでお送りします。

---
今回のtrailはこれです。
[Kanban ビューでの商談の操作](https://trailhead.salesforce.com/ja/content/learn/projects/customize-a-sales-path-for-your-team/work-with-opportunities-in-the-kanban-view)

*We couldn't find the expected fields to display in the opportunity list view named 'My Opportunities'. Please double check the instructions.*

このエラーで結局新しい組織作り直して丸2日かかった...(作り直しに意味はなかった)
「Work with Opportunities in the Kanban View」で検索してみると結構同じような躓きをしている人は多いですね。

エラーの内容は「My Opportunitiesリストビューに想定された項目が表示されていないよ」ですね。
といっても表示させるものなんて以下の4つしかないし、間違えようもないんですが...

* Opportunity Name
* Amount
* Expected Revenue
* Owner Full Name

##Select Fields to Display の順番

散々検索したらちょうど昨日(2019/8/6)、Trailblazer Communityにこんなレスが。

> My team and I had the same problem. To solved it **we change the order of the fields to display** so instead of having (Opportunity Name, Amount, Expected Revenue and Owner Full Name) we have (**Expected Revenue, Amount, Owner Full Name, Opportunity Name**).
> [Communityより](https://success.salesforce.com/answers?id=9063A000000plZaQAI)

Select Fields to Displayの順番をtrailの指示通りではなく、

* Expected Revenue
* Amount
* Owner Full Name
* Opportunity Name

とすると直ったよ！とのこと。

私の場合これで一発で直りました...Carmenさんに感謝

##【日本語版】絞り込み条件が違う

~~日本語版だけ絞り込み条件が間違っています。~~
Amount の演算子は**greater or equal** ですね。

確かに英語版の説明では
>For example, show all opportunities worth **more than $50,000** with a probability of 20% or more.

といっているのですが()
画像のサイズを変更した場合の位置・余白

CSSで画像のサイズを変える場合、
`transform: scale(0.5)`
のようにすることがあるが、このときの`margin`や`position`は画像のもとのサイズが基準になっているっぽい。というか、それらを適用した後にそれごとサイズ変更してる感じ。
これを知らなくて、
`position: absolute;`
`left: 0;`
`bottom: 0;`
としたのに変な余白ができちゃう、みたいなことになったので注意したい。
`transform:scale()`はあくまでも**要素**を拡大・縮小するプロパティ。
Computational Optimal Transport 精読会 記録 (#14: 4.3 その1)

# 背景


- 前回: [Computational Optimal Transport 精読会 記録 (#13: 4.2 その3)](https://qiita.com/takilog/items/dbad32096ba11471fbad)は6/28に開催，今回は7/4に開催
- 職場でCOTを読んでおり，{自己満足,復習,将来のため}などの理由で記録をしている


### 前回の振り返りと今回の内容

- エントロピー正則化付きの輸送問題
    - $L^\varepsilon\_C({\bf a}, {\bf b}) = \min_{{\bf P}\in U({\bf a},{\bf b})} \langle {\bf P}, C\rangle - \varepsilon H({\bf P})$
- Sinkhornアルゴリズム最高 → ちゃんと収束するよ
  - $\mathbf{u}^{(l+1)} = \frac{\mathbf{a}}{\mathbf{Kv}^{(l)}}$, $\mathbf{v}^{(l+1)} = \frac{\mathbf{b}}{\mathbf{K}^T\mathbf{u}^{(l + 1)}}$
- 今回: Sinkhornアルゴリズムの加速

----


# §4.3 Speeding Up Sinkhorn's Iterations

- 毎回$K$やら$K^T$の掛け算が必要になるので一見思い気がするが，GPUを使えばとりあえず複数本ヒストグラムの計算は同時に可能
- Sinkhornの更新式はほとんどそのまま行列形になる
    - $U^{(l+1)} = \frac{A}{KV^{(l)}}$
    - $V^{(l+1)} = \frac{B}{K^T U^{(l+1)}}$

- $V$と$U$が収束したかどうかを確認するような式として(4.26)の下に載っている式は間違っているらしい（詳細不明）
    - 誰か教えて

## カーネルの分割 (separable kernel)

- 高速化するための一つの特殊ケースとして，カーネル$K$が分割できる場合
- イメージが難しいが，コスト行列が小さいコスト行列の和で書き直せるケースを言っている
    - $i=(i\_k)\_{k=1}^d, j=(j\_k)\_{k=1}^d \in [n\_1]\times\dots\times[n\_d]$
    - $C_{ij} = \sum_{k=1}^d C^k_{i_k, j_k}$
    - Sinkhornアルゴリズムでは$C$は$\exp(\cdot)$の中に入って使われるので，カーネルとしては$K=\prod_{k=1}^d K^k_{i_k, j_k}$となる

- 例: 格子上のヒストグラムで，各次元ごとの距離の和になるようなケース($q$-ノルム)
- あまりよくわかってない
- ノートには謎の図だけ残されていた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7181/2c015a28-739b-01ad-5060-2ffe7a8371a7.png)

# Next

- 次回は7/16に§4.3の続きを読む
[Rust] 数値データをバイナリデータとして扱う

メモリに保持している数値データをバイナリ形式で出力するとか, 逆にバイナリデータを読み込んできて数値にキャストするとかしたくなることがあります. 例えば大規模な数値シミュレーションの中間データを出力しておきたいとかですね. このような操作は _unsafe_ Rust ならば可能です. 

__注意: unsafe なコードを書くときは細心の注意を払ってください.__

# 整数型は std がサポートしている

`i32`, `usize` 等の整数型は標準ライブラリに `from_be_bytes()`, `from_le_bytes()`, `from_ne_bytes()`, `to_be_bytes()`, `to_le_bytes()`, `to_ne_bytes()` というメソッドが容易されているのでこれを使えばよいです. (Rust 1.32 以上)

```rust
use std::i32;

fn main() {
    let x: i32 = 1;
    let b: [u8;4] = x.to_le_bytes();
    println!("{:?}", b);
    let y: i32 = i32::from_le_bytes(b);
    assert_eq!( x, y );
}
```

# データをバイナリに変換

浮動小数点数はバイナリ列を扱うメソッドは標準ライブラリは提供していない (`f64` と `u64` を変換する `from_bits()`, `to_bits()` はある) ので, 自力で何とかしましょう. 何らかのデータをスタックに保持しているとします. 例えば `f64` なら

```rust
let x: f64 = 1.;
```

という感じですね. このデータは 8 byte ですから, バイナリデータの観点からは `[u8;8]` と等価です. そこで, このデータを指す生ポインタ (raw pointer) を取得し, それを `[u8;8]` を指すポインタと解釈し直してみます.

```rust
let p = &x as *const f64 as *const [u8;8];
````

一応説明しておくと, `&x` は上で確保した `f64` を指す参照で, それをポインタ型 `*const f64` へキャストした上で, 異なる型のデータを指すポインタ型 `*const [u8;8]` と読み替えています. 生ポインタはメモリ上の住所に過ぎず, その値は最初に変数 `x` を束縛した時点で決まっていますから, 生ポインタを取得するだけなら危険なことは起こりません. 従ってこの段階までは `unsafe` なしで大丈夫です. 例えば, 続けて

```rust
println!("{:?}", p);
```

とすると生ポインタのアドレスが出力されます. 

問題は生ポインタが指すデータを読み出す (deref する) ときに発生します. 読み出す先のメモリが正しく初期化されているか, また意味のあるデータが存在しているかは保証されないので, deref は `unsafe` ブロックのなかでしかできません. 従って, `f64` 型のデータ `x` のバイナリ表現は

```rust
let b: [u8;8] = unsafe { *p };
```

という形で取得することになります. いったん取得してしまえば通常の _safe_ Rust です.

まとめると, 浮動小数点数のバイナリ表現を表示するコードは次のようになります.

```rust
let x: f64 = 1.;
let p = &x as *const f64 as *const [u8;8];
let b: [u8;8] = unsafe { *p };
println!("{:?}", b );
```

何度でも強調しておきますが, 生ポインタの deref は __unsafe__ です. 例えば上のコードの `f64` を `f32` に書き直したとして, それなのに `[u8;8]` を `[u8;4]` に直すのを忘れたとしたら何が起こるでしょう? unsafe ブロック内にそのようなコードが含まれていてもコンパイルは通ってしまいます.

# バイナリデータを数値データに変換

次に, 何らかのバイナリデータが与えられたときに, それを数値データとして正しく解釈し直す方法を考えます. とはいえ, これは上の逆のことを行うだけなので, コード例を載せれば十分でしょう.

```rust
let b: [u8;8] = [0, 0, 0, 0, 0, 0, 240, 63]; // Little Endian
let p = &b as *const [u8] as *const f64;
let x = unsafe { *p };
println!("{}", x );
```

言うまでもないですが, バイナリデータを扱う際には [エンディアン](https://qiita.com/mski_iksm/items/bb0aa375c952c2d7b91a) に注意してください.

# `Vec<T>` をバイナリデータとして読む

`Vec<T>` のポインタは `&Vec<T>` ではなく `.as_ptr()` メソッドにより取得するという点のみ注意すれば大丈夫です. 例えば:

```rust
let vec: Vec<f64> = vec![ 0., 2., 4., 8. ];
let p = vec.as_ptr() as *const u8;

for i in 0..8*vec.len() as isize {
    print!("{:?} ",
           unsafe { *p.offset(i) }
    );
}
```

```rust
let vec: Vec<u8> = vec![ 0, 0, 0, 0, 0, 0, 240, 63 ]; // Little Endian
let p = vec.as_ptr() as *const f64;

println!("{}",
         unsafe { *p } );
```

例によってアクセスするメモリの範囲には注意してください. これは _unsafe_ Rust です. (逆に言うと C 言語でいかに危険なコードを平気で生産していたか... Fortran もすぐセグフォが出るし)


# byteorder

長々と書きましたが, バイナリデータを扱うならば生ポインタと unsafe を駆使するのではなく [byteorder](https://crates.io/crates/byteorder) クレートを使うのが楽です. 変換の際にエンディアンを指定する機能もついてきます.
オブジェクト指向言語とは（間違いあればご指摘下さい）

先日プログラミングスクールを卒業し、面接に向けて自分のやってきたことの棚卸し・曖昧にしていた所の学習をしている者です。間違いあればどんどんご指摘下さい。お願い致します。

参考にさせて頂いたlink
[Rubyのオブジェクト指向におけるカプセル化について](https://qiita.com/kansiho/items/80e171cc55eb8b509297)
[オブジェクト指向と10年戦ってわかったこと](https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)
[Ruby入門 オブジェクト指向](http://masa.o.oo7.jp/ruby/ruby2.htm)
[やはりお前らのコンポジションは間違っている](https://qiita.com/turanukimaru/items/0b1396393908b7e22618)

# オブジェクト指向言語とは

現実世界のモノを１つの(例)CarClass（設計図）として定義し、それを基にinstance（実体）を生成・操作することで変更に強いプラグラムを書ける言語・・・だと思っていたのですが、どうやらそれだけじゃないみたい。

# オブジェクト指向言語の３大要素

①カプセル化
②継承
③ポリフォーリズム

# カプセル化とは
カプセル化とは[オブジェクトの状態や機能(インスタンス変数やメソッド)を、他のオブジェクトからアクセスできないようにすること](https://qiita.com/kansiho/items/80e171cc55eb8b509297)
これはつまり、あるclassの外から当該classのinstanceに何か操作を加える際、当該classにて予め加えたい操作を行うmethodを書かない限りは、その操作を行うことが出来ないということを指しているのではないかと思う。

[Ruby入門 オブジェクト指向](http://masa.o.oo7.jp/ruby/ruby2.htm)
このサイトの運営者はカプセル化の説明の中でこうも言っている。
「オブジェクトは自分が今どういう状態であるか, という情報をインスタンス変数に記憶している, と言えます. そのため, 勝手にその状態を他人に変えられたら困るので, インスタンス変数はクラス内部のメソッドの中でしか値を書き換えることができません」

[オブジェクト指向と10年戦ってわかったこと](https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)
一方この記事においては「カプセル化とは無駄を省き洗練させてわかりやすいものを作るということ」
としており、記事内のエレベーターの例を見る限りは、
「余分な機能（method）を定義することはプログラムを複雑なものにするだけでなく、時に事故を起こす原因になる。だから触らせたくない機能(method)は定義しない（外からは触らせない）」
ということを意味しているのではないかと思う。
この説明には設計思想（？）的なものを感じた。

# カプセル化の利点
methodで定義されていなければ（もしくはattr_reader :"culum"等のアクセサメソッドを定義しなければ）、不必要な操作が加わらないので、安定的。
もし外から予期せぬ変更を加えられるとしたら（メソッドの中身を操作とか）、正常に動かなくなる可能性がありますから、不安定な要素が入りにくい設計なのは大きな利点と言えそう。

# 継承


classは別のclassと親子関係になれます。そして親子関係になると子は親classの中で定義されたメソッドが使えるようになります。これによって複数のmethodを組み合わせた複雑なmethodが短文で作れたりします。
ただ
[やはりお前らのコンポジションは間違っている](https://qiita.com/turanukimaru/items/0b1396393908b7e22618)
[オブジェクト指向と10年戦ってわかったこと](https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)
この２つの記事で紹介されているオブジェクトコンポジションという考え方を含めると継承にはもっと本質的な意味がある気がしてきます。

先述の自分の説明だと単に一度定義したメソッドを色んなclassで使い回すことが出来て、再利用性が高いので良いみたいになっていますが、「１つのオブジェクト（コンポジション）は複数のパーツによって出来ている、そのパーツ毎に出来ることだけを定義して最終的に組み合わせるという方法を取れば、部分的な変更を加えた時にエラーが起きにくいコンポジション（合成集約）になる。」というのが本質なのではないでしょうか。

またこれが単一責任の原則(1つのクラスに1つの役割(機能))というオブジェクト指向の設計思想に深く絡んでいる気がします。

# ポリモーフィズム
ポリモーフィズムとは多様性とも言われ、３つの種類に分けられる
①アドホック多相
　プログラミングにおける各要素に型による制限を付けないことを表す。
　手続き型言語において、date型をstringに、integer型をstringに変換する関数はそれぞれ一意的だが、オブジェクト指向言語におけるポリモーフィズムとは、より上位の抽象概念を対象にすることで、A型をB型に変えるではなく、あらゆる型をB型に変えるのように多意的な関数の使い方ができる性質をさす。

②パラメータ多相
　特別、型宣言をしなくてもvalueから型を推測してくれるという性質
③部分型付け
　これは継承のことを指しているようです。
Computational Optimal Transport 精読会 記録 (#13: 4.2 その3)

# 背景


- 前回: [Computational Optimal Transport 精読会 記録 (#12: 4.2 その2)](https://qiita.com/takilog/items/20ede7b7473d9902d568)は6/18に開催，今回は6/28に開催
- 職場でCOTを読んでおり，{自己満足,復習,将来のため}などの理由で記録をしている


### 前回の振り返りと今回の内容

- エントロピー正則化付きの輸送問題
    - $L^\varepsilon\_C({\bf a}, {\bf b}) = \min_{{\bf P}\in U({\bf a},{\bf b})} \langle {\bf P}, C\rangle - \varepsilon H({\bf P})$
- Sinkhornアルゴリズム最高
  - $\mathbf{u}^{(l+1)} = \frac{\mathbf{a}}{\mathbf{Kv}^{(l)}}$, $\mathbf{v}^{(l+1)} = \frac{\mathbf{b}}{\mathbf{K}^T\mathbf{u}^{(l + 1)}}$
- Hilbert projective metricは縮小写像である（Theorem 4.1）
- 今回: Sinkhornアルゴリズムの収束性について，Hilbert projective metricの縮小写像を用いて議論する

----

- 前回からの続き

## Remark 4.13 ペロンフロベニウスの定理

- 少し気分転換して（嘘），線形代数やページランクの話で出てくるPerron-Frobeniusの話に寄り道する
    - CS的にはマルコフ連鎖が定常分布に収束する，という話をするときに出てくる
    - マルコフ連鎖はあるベクトルに遷移確率行列 (二重確率行列) を掛けていくと収束するという話
    - Sinkhornと似ている (重要)

- 固有ベクトルを考えると，$\mathbf{K}p^* = p^*$
- そのため，適当な初期値$p\_0$に$l$回$K$を適用した結果どうなるか，を議論できる
    - $d(\mathbf{K}^lp_0, p^\star) = d(\mathbf{K}^lp_0, \mathbf{K}^lp^\star) \leq \lambda(K)^l d(p_0, p_\star)$
    - 不等式はTheorem 4.1より

- 縮小写像の動作イメージがのっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7181/751c910c-fcc2-6f99-8e6a-a669c23decb8.png)


## Remark 4.14 Sinkhornアルゴリズムの収束性

- 主張: $l$回Sinkhornアルゴリズムを適用したとき，(4.22)，(4.23)，(4.24)が成り立つ．それぞれ次のような式．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7181/397a8c05-4c12-06b5-7352-5866dbdd03d9.png)


### Remark 4.14の証明

- $d(v, v')$の定義から，これは次のように変化しても同じ
    - $v, v'$は$m$次元ベクトルとする (太字になってないのは面倒だから)
    - $d(v, v') = d(v/v', 1_m) = d(1_m/v, 1_m/v')$

- Sinkhornアルゴリズムの更新式（上の方に書いてある）から，$d(u^{(l+1)}, u^\star) = d(Kv^{(l)}, Kv^\star) \leq \lambda(K) d(v^{(l)}, v^\star)$
    - これは$v\to u$の話なので，もう一回Sinkhornアルゴリズムの分を展開すると，$u\to v\to u$と更新するときに$\lambda(K)$は$2l$のオーダで寄与する．よって(4.22)を得る．

- 式(4.23)は三角不等式から得ることが出来る
- 式(4.24)は難しいので詳細は論文参照になっている


## Remark 4.15 SinkhornアルゴリズムのLocal divergenceについて

- 式が間違っているらしい (4.25)
- 難しくて分からなかった

# Next

- §4.3へ進もう
コンパクトな集合〜1次元有界閉区間を例にとって〜

# はじめに
数理最適化において，コンパクトな集合はよく用いられる概念です．主にある集合がコンパクトであるときにその集合の部分集合の近似が可能であったり，最大もしくは最小が存在するという保証がつきます．

以下の話は数学的に厳密でなく，メモ程度なのであしからず．

## 定義
ある集合 $X$ の部分集合 $A$ の開被覆 $U_w$ とは， $A \subset U_w$ であることを指す．また，任意の開被覆 $U_w$ の有限な部分集合族 $U_w^i \subset U_w$ もまた $A$ を被覆するとき $A$ はコンパクトである．

## 具体例

```math
X \in \mathbb{R} \\
A = [0, 1] \subset X
```

$X$ と $A$ を上記のように取ると，$U_w$ としては多くの選択肢が存在する．具体的には，$a < 0$ かつ $b > 1$ を満たすような任意の $(a, b)$ はすべて $U_w$ となる．

例えば，$U_w = (-1, 2)$ もまた，$A$ の開被覆となる．

かなり雑な議論をするとしたら，1次元有界閉区間 $A$ の開被覆として，最も $A$ にサイズが近い $(-\epsilon, 1 + \epsilon)$ という開被覆を考えてあげて，その部分被覆として，$0 < \epsilon'<\epsilon$ なる $\epsilon'$ を用いて，$(-\epsilon', 1 + \epsilon')$ を開被覆として取ると，それもまた，$A$ を被覆するのでコンパクトと言えます．（たぶん）

## 開区間ならコンパクトでない
とりあえず，開区間は境界に対して漸近するような開被覆のとり方をしてあげると無限に部分集合族を取らないと被覆できない例が出てしまうので，コンパクトでない，みたいな議論が多い．コンパクトであるために重要なのは任意の被覆方法に対して例外なく有限の部分族のみで被覆可能であるということ．

## コンパクトなら閉区間
コンパクトな集合に属さない点を1点取り，コンパクトな集合からも1点とり，それらが重複しないようにうまく半径 $\epsilon$ を取り，その半径で覆うような集合を作る．コンパクトな集合から点を取る操作を適当に行うことで有限回数繰り返した時点でコンパクトな集合内の点の周りに張った集合によって，コンパクトな集合は被覆される（コンパクトなので）．また，最初に取った点は採択した $\epsilon$ のうち最小のものを取ることでコンパクトな集合との重複を避けた上でその点の近傍の開集合を形成できる．これらの操作をコンパクトな集合に属さない任意の点に関して行うことでコンパクトな集合の補集合は開集合の和集合となり，コンパクトな集合の補集合は開集合となるため，コンパクトな集合は閉集合となる．
BackstopJSでProxyを通したり、ベーシック認証を通したり。

[BackstopJS](https://github.com/garris/BackstopJS)をProxyやベーシック認証のある環境で利用する場合の各種設定方法です。
※ Chrome-Headless のエンジンは「puppeteer」を使用した場合になります。

## Proxyの設定

``` json
  "engineOptions": {
    "args": ["--no-sandbox"]
  },
```

↓

``` json
  "engineOptions": {
    "args": ["--no-sandbox", "--proxy-server=http://proxy.example.com:8080"]
  },
```

## ベーシック認証の設定

``` ../backstop_data/engine_scripts/puppet/onBefore.js
module.exports = async (page, scenario, vp) => {
  await require('./loadCookies')(page, scenario);
};
```

↓

``` ../backstop_data/engine_scripts/puppet/onBefore.js
module.exports = async (page, scenario, vp) => {
  const USERNAME = 'username';
  const PASSWORD = 'password';

  await page.setExtraHTTPHeaders({
    Authorization: `Basic ${new Buffer(`${USERNAME}:${PASSWORD}`).toString('base64')}`
  });

  await require('./loadCookies')(page, scenario);
};
```
webpackでcss modulesを使うとz-indexが圧縮されてしまう問題

タイトル通り。
Railsでwebpackerをアップグレードした段階で起きるようになったのでwebpackerの問題かと思ったら普通にwebpackでも起こるみたい

## 環境
- webpack 3.12.0
- @rails/webpacker 3.5

## 症状
- css moduleでz-indexにどんな値を設定してもコンパイル後は1になる
- `z-index: 10000!important`もコンパイルされると`z-index: 1!important`になる
- ローカル環境では起こらない
- こういうのほんとやめて😫

## 解決
https://github.com/rails/webpacker/issues/1663
ここでproduction.jsに下記を追記しろと仰せだ…

```js:production.js
environment.plugins.get('OptimizeCSSAssets').options.cssProcessorOptions.zindex = false;
```

とはいえsass-loaderを使っているので最終的にこのような形になりました

```js:production.js
const cssLoader = sassLoader.use.find( lib => lib.loader === 'css-loader' );

cssLoader.options = Object.assign(cssLoader.options, {
 modules: true
});
```


## 参考
- https://github.com/rails/webpacker/issues/1663
- https://github.com/vuejs-templates/webpack/issues/614
HackerRankで出会った、Counter,swapcaseについて

未来電子テクノロジーでプログラミングの勉強をしている竹内です。
今回はHackerRankを解いているうちに出会ったCounterについて書いていこうと思います。

##Counterとは
CounterはPython標準ライブラリcollectionsのクラスです。
機能としてはリストの各要素の出現回数を返してくれます。
実際に試してみましょう！

```python
from collections import Counter
lis=[2,3,4,5,6,8,7,6,5,18]
print(Counter(lis))
#Counter({5: 2, 6: 2, 2: 1, 3: 1, 4: 1, 8: 1, 7: 1, 18: 1})
```
実際にやってみると上記のような感じになります。
HackerRankではCounterを使用して靴屋さんの売り上げを求めるプログラムを作りました。

##swapcaseとは
swapcaseでは指定した文字列の小文字を大文字に大文字を小文字にすることができます。
こちらもpythonの問題にあり、めちゃくちゃ簡単でした。
では、実際に使ってみましょう

```python
s="Hacker Rank"
print(s)
s=s.swapcase()
print(s)
#Hacker Rank
#hACKER rANK
```
上記のように動作しました。
こんな感じで、大文字は小文字に。小文字は大文字になります。

##まとめ
今回はHackerRankで出会ったものの紹介をしました。
HackerRankではこんな感じで、自分の知らないものを知ることができ、なおかつそれを使用して問題を解かなければいけないので、英語ができる方にはおすすめです。
最後まで読んでいただきありがとうございます。
アーカイブ・ログ・モードを有効にする

インスタンス作成時はアーカイブ・ログ・モードは有効になっていないため有効にする手順を記載します。
ストレージはファイルシステムの前提です。ASMディスクの場合は手順がちょっと変わってくると思われます。

# 手順
## アーカイブ・ログの出力ディレクトリを作成する

```
$ mkdir -p $ORACLE_BASE/oradata/$ORACLE_SID/arch/
$ chmod 750 $ORACLE_BASE/oradata/$ORACLE_SID/arch/
```

## データベースを再起動する

oracleユーザでSQL*Plusを起動し、下記のコマンドを実行する

```
$ sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup mount;
```

## アーカイブ・ログ出力先の変更とアーカイブ・ログ・モードの有効化

SQL*Plus内で環境変数していできたかはうろ覚え。。
できない場合は `$ORACLE_BASE` 、`$ORACLE_SID` は読み替えること。

```
SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=$ORACLE_BASE/oradata/$ORACLE_SID/arch/' scope=both;
SQL> alter database archivelog;
SQL> alter database open;
```

## 確認

下記でアーカイブログが出力されることを確認する

```
SQL> alter system archive log current;
SQL> !ls -la $ORACLE_BASE/oradata/$ORACLE_SID/arch/
```
Computational Optimal Transport 精読会 記録 (#12: 4.2 その2)

# 背景


- 前回: [Computational Optimal Transport 精読会 記録 (#11: 4.2 その1)](https://qiita.com/takilog/items/ecdfdf5491fb1a47b06a)は6/11に開催，今回は6/18に開催
- 職場でCOTを読んでおり，{自己満足,復習,将来のため}などの理由で記録をしている


# 前回の振り返り

- エントロピー正則化付きの輸送問題
    - $L^\varepsilon\_C({\bf a}, {\bf b}) = \min_{{\bf P}\in U({\bf a},{\bf b})} \langle {\bf P}, C\rangle - \varepsilon H({\bf P})$
 
- Sinkhornアルゴリズム最高
  - $\mathbf{u}^{(l+1)} = \frac{\mathbf{a}}{\mathbf{Kv}^{(l)}}$, $\mathbf{v}^{(l+1)} = \frac{\mathbf{b}}{\mathbf{K}^T\mathbf{u}^{(l + 1)}}$

# 今回の範囲の内容

- 著名なSinkhornアルゴリズムとその関連話題について§4.2を読み進めていく（続き）

## Remark 4.9

- Sinkhornアルゴリズムとは別として，エントロピー正則化付きの最適化問題についてもう少し考えていく
- 正則化がついていない解 (ε = 0) に対して，εを徐々に小さくしながらSinkhornアルゴリズムを解いていけば，そのうち$P$ が求まる
- これを KL-div. に対する proximal point algorithm として捉える
- 制約なし目的関数を置く
    - ここで$\iota_C(x)$は$x\in C$のときに0を，それ以外は∞を返す指示関数

$$F(P) := \langle P, C\rangle + \iota_{U(a, b)}(P)$$

- ある $P^{(l)}$ を更新する proximal operator として以下を定義する

$$\mathrm{Prox}_{\frac{1}{\varepsilon}F}^\mathbf{KL}(\mathbf{P}^{(l)}) := \arg\min\_{P\in\mathbb{R}\_+^{n\times m}} \mathbf{KL}(\mathbf{P}\mid \mathbf{P}^{(l)}) + \frac{1}{\varepsilon} F(\mathbf{P})$$

- これを用いて $\mathbf{P}^{(l+1)} = \mathrm{Prox}_{\frac{1}{\varepsilon}F}^\mathbf{KL}(\mathbf{P}^{(l)})$ とする
- これは詳細な議論は省略するとして，エントロピー正則化付きの輸送問題を解くSinkhornアルゴリズムと似た問題を解いている
- そのため初期値として $\mathbf{P}^{(0)} = 1_n 1_m^T$とし，更新していくことで，次のような解の形になる

$$\mathbf{P}^{(l+1)} = \mathrm{diag}(\mathbf{u}^{(l)}\odot\dots\odot\mathbf{u}^{(0)}) \exp(\frac{-(l+1)C}{\varepsilon}) \mathrm{diag}(\mathbf{v}^{(0)}\odot\dots\odot\mathbf{v}^{(l)})$$

- またこのような問題は，正則化パラメータ$\varepsilon$の代わりに，$\varepsilon/l$という形にしたSinkhornアルゴリズムによって解くことが出来る（嬉しい）


## Remark 4.10

- 輸送問題ではエントロピー正則化をやっていた
- 実はその他の正則化項を付与している場合でもいける
- アルゴリズム的にもよく研究されている（Bregman）
- 輸送問題に限った場合，次のような違いが見て取れる
    - (コメント) 上段中央の$10^{-1}$は間違い
    - 上段がエントロピー，下段が二乗ノルムの制約式と指示関数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7181/77f2b2d2-da3a-d3b6-b3cf-a701f908769d.png)


## Remark 4.11

- Barycentric projectionの話，ムズイ


## Remark 4.12

- Sinkhornアルゴリズムの大域的な収束解析についての議論
- 初期には Hilbert projective metric という空間について議論されていた
    - これは $d(u, u') = \log\max\_{i,j}\frac{u\_i, u'\_j}{u\_j, u'\_i}$ というmetric に関する議論がされた
    - これはスケーリングについて無視されるような商空間での距離となっている
- 図が多少はわかりやすいか
  - 定数倍を無視するので，線と線の間で距離を計測するような空間（角度という意味ではない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7181/310bddfd-4a81-39b3-0b00-559d5ac9fde6.png)

- 距離空間であることの証明
    - $d(u, u) = 0$ は，$\max\_{i,j}$ を具体的に要素として書き出すと，当然，比がある$r$になっているので，ここから得る
    - $d(u, v) = d(v, u)$ は自明
    - 三角不等式は，$\max$を外して割り算のところに要素を補って$\log$をバラすことで示せる

- このあたりの一つ一つの性質は示すのが難しかったのであまりやってない（やっている人もいた）
- 以降の議論ではTheorem 4.1が必要

## Theorem 4.1

- ベクトル$v,v'$が行列$K$で変換されているとき，これが元の間の距離と$1$より小さい定数倍のスケーリングで抑えられる = 縮小写像になっているという定理
    - 証明は本にも載っていない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7181/962d42fb-9d22-8aa6-16be-3741f8a692b0.png)

# Next

- 次回，これを利用して，Sinkhornアルゴリズム（ベクトルに行列とかを書けたりしていくアルゴリズム）がどういう挙動を示しているのかについて議論していく
Laravelにてキャッシュが原因でCSSの変更が反映されない問題

#この記事を書いたきっかけ
Laravelでscssを使ってフロントエンド部分の実装をしていた。
「npm run watch」を実行しながら変更を確認していた。
が、変更箇所が反映されないことが多かった。

主は調べる→試す→撃沈　という流れを散々繰り返して苦しんだので、
「何をやっても変更が反映されない！」とお悩みの方の力になれたら嬉しいです。

#試したこと

##解決には至らなかった方法
[Laravel キャッシュクリア系コマンドなど](https://qiita.com/Ping/items/10ada8d069e13d729701)
いつもお世話になっていた上記の記事を参考にほとんど試しました。
今まではだいたいこれで解決していたのですが...今回ばかりはうまくいきませんでした。

試したコマンド一覧

```
$ php artisan cache:clear
$ php artisan config:clear
$ php artisan route:clear
$ php artisan view:clear
$ composer dump-autoload
```

有名なこの辺りを試したものの、全滅...

##解決した方法
[
Laravel 5.4 アセットのコンパイル(Laravel Mix)
](https://readouble.com/laravel/5.4/ja/mix.html)
公式サイトの方法を実施。

サイト内の`「バージョン付け／キャッシュ対策」`の項目を参照。

###bladeファイルの変更

***変更前***

```
<link rel="stylesheet" href="{{ asset('css/app.css') }}">
```

***変更後***

```
<link rel="stylesheet" href="{{ mix('css/app.css') }}">
```
`{{ asset(...) }}`としていた部分を、以下のように`{{ mix(...) }}`に変更

###webpack.mix.jsの変更

***末尾に追加***

```
if (mix.inProduction()) {
    mix.version();
  }
```

###ターミナルで以下を実行

```
$ npm run production
```

上記方法を実行することで、無事scssファイルの変更が反映された。
以降は`npm run watch`を実施した際もブラウザのリロードで変更が確認できるようになった。
もしまた今回のようにキャッシュ問題が発生した際は`npm run production`コマンドを実施することにする。

##最後に

キャッシュ問題を解決するのは結構手がかかる！
そして解決するたびにこうやって書き残すことが大切だと感じた。

以上、同じような問題で悩んでいる方の力になれたなら嬉しいです。
MarkdownでかんたんにHTMLファイルを作ることができるサイト

今回、TyperというMarkdownでHTMLを作ることができるWEBアプリケーションをリリースしました。
ほぼQiitaと同じような感覚でHTMLを作ることができます。
設定アイコンからGitHub風のテーマにしたりすることができます。
URL:<https://anyfre.github.io/typer/>
![typer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285513/14ff4cfb-b36a-d486-6765-a5f6b6af12a7.png)
## 更新履歴
2019/8/7 バージョン1.0.0
## 追記
開発を中止しました。（このアプリケーションのバグについては対応していこうと思います。）
moveitでpanda ロボットアームのinteractive markerが表示されない

# 症状
```
roslaunch panda_moveit_config demo_chomp.launch
```
moveitのchompのdemoを行おうとしたところ、pandaインタラクティブマーカーが表示されず角度を変えることが難しい。
また、開始位置と目標位置をrandom balidにすると

```
[ WARN] [1565154635.445298351]: Unable to update multi-DOF joint 'virtual_joint': TF has no common time between '/world' and 'panda_link0': 

...

[ERROR] [1565155267.944359707]: Start state violates joint limits
[ WARN] [1565155267.951436564]: Fail: ABORTED: Unknown event
```
となり、CHOMPを実行することすら出来なかった。
ちなみに私の環境では、

```
roslaunch panda_moveit_config demo.launch rviz_tutorial:=true
```
から、デモを動かす際にはきちんと動作し、interactive markerも表示された。
#解決策
[ここ](https://answers.ros.org/question/315758/no-interactive-markers-displayed-whilst-following-moveit-tutorial-ros-kinetic/)にあるように、最新バージョンのpanda_moveit_configに問題があるらしく、古いバージョンにチェックアウトして再コンパイルを行うことで解決した。

```
cd ~/catkin_ws/src/panda_moveit_config
git checkout 03bb4
catkin build
```
またはcatkin_makeしてください。
#残された問題

```
[ERROR] [1565159085.185230512]: Found empty JointState message
```
[ここ](https://github.com/ros-planning/moveit/issues/659)によると、CHOMPの問題??
Laravelで「node::ResetStdio(): Assertion `(err) != (-1)' failed.」のエラーが発生

# はじめに
Laravelのフロントエンドの実装をしていたら「npm run watch」を実行してもブラウザ側でCSSの変更が反映されなくなった。
「npm run watch」実行中に「Ctrl + C」コマンドで中止すると、ターミナルに以下のエラーが発生。

```
$ node[34624]: ../src/node.cc:649:void node::ResetStdio(): Assertion `(err) != (-1)' failed.
 1: 0x10007643b node::Abort() [/Users/name/.nodebrew/current/bin/node]
 2: 0x1000761e3 node::AppendExceptionLine(node::Environment*, v8::Local<v8::Value>, v8::Local<v8::Message>, node::ErrorHandlingMode) [/Users/name/.nodebrew/current/bin/node]
 3: 0x1000541a9 node::ResetStdio() [/Users/name/.nodebrew/current/bin/node]
 4: 0x7fff51001ef4 __cxa_finalize_ranges [/usr/lib/system/libsystem_c.dylib]
 5: 0x7fff510021fe exit [/usr/lib/system/libsystem_c.dylib]
 6: 0x100039326 node::Environment::stop_sub_worker_contexts() [/Users/name/.nodebrew/current/bin/node]
 7: 0x1001f2214 v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo) [/Users/name/.nodebrew/current/bin/node]
 8: 0x1001f1831 v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::FunctionTemplateInfo>, v8::internal::Handle<v8::internal::Object>, v8::internal::BuiltinArguments) [/Users/name/.nodebrew/current/bin/node]
 9: 0x1001f0ec0 v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments, v8::internal::Isolate*) [/Users/name/.nodebrew/current/bin/node]
10: 0x10090d739 Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit [/Users/name/.nodebrew/current/bin/node]
```

この記事は上記のエラーを解決し、CSSを反映するまでの方法について書いたものです。

## バージョンと実行状況

* Laravel v5.8.29
* Node.js v12.5.0

Docker環境で、npmコマンドなどはMacOS上で実行していた。
今回のエラーもMacOSのみでしか発生しないものらしい。
流れとしては、csccファイル変更→「npm run watch」で都度反映　という形で行なっていた。

##原因
どこかのタイミングでNode.jsのバージョンが上がったことが原因。
情けないことにいつ何をしてバージョンアップしたのかが不明。
どうやらNode.jsのv12.5.0で対象のエラーが出るらしい。

##エラーについての参考資料
https://github.com/nodejs/node/issues/28479
上記記事を参考に試したこと。

* `npm i natives`コマンドの実行
* 「node_modules」「package-lock.json」を削除後の`npm install`

しかしどれもエラーの解決には至らず...

https://github.com/nodejs/node/issues/20325
上記のやり取りを確認し、Node.jsのバージョンが原因と発覚。
個人的な開発なので、Node.jsのバージョンを固定にしていたわけでもなかったので、Node.jsのバージョンをダウングレードすることに。

##nvmを使ってNode.jsのバージョンをダウングレード

https://qiita.com/strsk/items/925644e124efcc964625
上記記事を参考にし、Node.jsをダウングレード
(ダウングレードというよりは、バージョンの切り替え？)

###nvmのインストール

```
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
```

###インストール可能なNode.jsのバージョンを確認

```
$ nvm ls-remote
```

###Node.jsのバージョンを指定してインストール

```
$ nvm install 12.4.0
```

`v12.5.0`→`v12.4.0`にダウングレード

###使用するバージョンを切り替える

```
$ nvm use 12.4.
```

###変更の確認

```
$ node -v
v12.4.0
```

## エラーの確認

エラーが発生した手順を試す。
「npm run watch」実行→「Ctrl + C」でストップ。
###見事にエラーが解決!!
やはりNode.jsがv12.5.0だったことが原因らしい。

##補足
CSSが反映されない問題はこの時点でまだ解決せず。
以下に解決した方法をまとめた記事を書いたので、キャッシュ問題に悩んでいる方は参考までにご覧ください。
[Laravelにてキャッシュが原因でCSSの変更が反映されない問題](https://qiita.com/milmil_neko/items/02ab1b9e38e8c94377cf)
【Salesforce】 作成日　作成者　最終更新日　最終更新者　を指定して作成

:anchor:作成日、作成者、最終更新日、最終更新者を指定してレコードを新規作成する機能について
以前まではSalesforceのサポートに問い合わせて有効化する必要がありました。

１．設定　＞　ユーザインターフェイス　＞　「レコードの作成時に監査項目を設定」および「無効な所有者のレコードを更新」ユーザ権限を有効化にチェックします。
２．有効化対象となるプロファイルまたは権限セットでチェックつけます
プロファイル　＞　レコードの作成時に監査項目を設定　にチェックをつけます
または、
権限セット　＞　システム権限　＞　「レコードの作成時に監査項目を設定」にチェックつけます。

:snowflake:１：「レコードの作成時に監査項目を設定」の機能で設定可能になった項目はレコードの編集・詳細画面からではなく、できあがっております。所有者は指定していないので開発者コンソールの操作ユーザです。
:snowflake:２：作成日　＞　更新日となる場合エラーになるので気をつけましょう

        // 作成処理
        xxx_Cop_Opp__c CopyTest1322 = new xxx_Cop_Opp__c();
        CopyTest1322.Name = 'xxx商談テスト1322';
        CopyTest1322.SFA_LK_Sta_Nm__c = '事前準備';
        CopyTest1322.CreatedDate = DateTime.newInstance(Date.today().addDays(-32), Time.newInstance(1, 0, 0, 0));
        CopyTest1322.LastModifiedDate = DateTime.newInstance(Date.today().addDays(-31), Time.newInstance(1, 0, 0, 0));
        insert CopyTest1322;

:snowflake:３：更新に関しては作成日、作成者、最終更新日、最終更新者、いずれも更新は不可能です。
　　　あくまで新規作成の時のみです。
iTerm2のステータスバーに寿司を流す

# はじめに

iTerm2ではステータスバーを追加することができます。

**Preferences > Profiles > Session > Status bar enabled > Configure Status Bar**

からオンにできて、バッテリーの情報やGitのブランチ名などを表示することができます。

さらにver 3.3.0 から、iTerm2を操作するインターフェースとしてPythonのAPIがサポートされるようになり、独自のステータスバーをPythonを使って開発できるようになりました。

これは寿司を流す必要がある案件です(?)。


## iTerm2 Python API

Python APIを使うとPythonからiTerm2を制御したりカスタマイズすることができるようになります。
今まではAppleScriptからのみ可能でしたが、Pythonから呼び出すためのAPIが提供されるようになりました。

https://iterm2.com/python-api/


[Status Bar API](https://iterm2.com/python-api/statusbar.html)を使うことでカスタムのステータスバーを作成することが可能なので今回はこれを使って寿司を流します。

## Scriptsの作成


**Scripts > Manage > New Python Script**

からPython Scriptを作成します。

Scriptsの種類は

- **Full Environment**
- **Long-Running Daemon**

にします。
`~/Library/ApplicationSupport/iTerm2/Scripts/` 配下にpyenv環境を含んだディレクトリが作成されるのでこれを編集していきます。


## pyファイルの編集

SushiStatusBarという名前にしたので、下記のファイルを編集します。

`~/Library/ApplicationSupport/iTerm2/Scripts/SushiStatusBar/SushiStatusBar/SushiStatusBar.py`

まずはStatusBarComponentのオブジェクトを作成します。

```py
    knobs = []
    component = iterm2.StatusBarComponent(
        short_description="Sushi Status Bar",
        detailed_description="This is my first iterm2 status bar using python api",
        knobs=knobs,
        exemplar="Sushi Emoji",
        update_cadence=0.5,
        identifier="com.github.n-someya.sushi-status-bar")
```

`knobs`はStatusBarの設定を司るクラスの配列を受け取ります。
特に何も指定しなければ、単純にStringを表示するStatusBarとなるようです。
指定することでCheckBoxやSelectBoxのようなものを作ることも可能なようです（試してはいませんが）。


`update_cadence`はStatusBarの内容の更新間隔を[s]単位で指定します。

次に、StatusBarの内容を返却するFunctionを定義します。
このFunctionが`update_cadence`ごとに呼び出されるようです。

```py
    @iterm2.StatusBarRPC
    async def coro(knobs) -> str:
        l_status_count : int = get_count()
        l_space : str = ""
        for i in range(0, l_status_count):
            l_space += " "

        return l_space + "🍣"
```
今回は単純に呼び出し回数をカウントして、その分だけ空白を挿入することで流れている感を出しています。


他のAPIを組み合わせることで、Keyboardイベントごとに呼び出したりもできそうです。


## 動作確認

```sh
~/Library/ApplicationSupport/iTerm2/Scripts/SushiStatusBar/iterm2env/versions/3.7.2/bin/python ~/Library/ApplicationSupport/iTerm2/Scripts/SushiStatusBar/SushiStatusBar/SushiStatusBar.py
```

で実行してみます。

すると、

**Preferences > Profiles > Session > Status bar enabled > Configure Status Bar**

で選べるステータスバーに、 `Sushi Status Bar` が増えています。

設定してみれば寿司が流れるようになるはずです！

![SushiStatusBar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26693/71cd7dd8-7e78-14fa-406a-da604635e9b3.gif)


## Install

iTerm2が起動したらScriptが実行されるようにします。

```sh
mkdir ~/Library/ApplicationSupport/iTerm2/Scripts/AutoLaunch
ln -s ~/Library/ApplicationSupport/iTerm2/Scripts/SushiStatusBar/ ~/Library/ApplicationSupport/iTerm2/Scripts/AutoLaunch/SushiStatusBar
```

# 終わりに

意外と簡単にカスタムのステータスバーを作ることができました。
もう少し実用的なものも作ってみたいと思います。