OmniAICreator/Qiita-1.07M huggingface dataset:
Probability with Martingales p16のExerciseについて

williams著『[Probability with Martingales](https://www.amazon.co.jp/dp/B00AKE1U14/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)（英語版）』のp.16にあるexerciseについてのメモです。一応、このブログはこの本を読むよって人向けにどのように考えればいいかを共有する目的で作りました。誤植や誤謬などがあれば教えてください。

## 例のexercise

例のexerciseの主張はこうである
> $\mathfrak{C}$を次のように定義しよう。

> $$\lim_{n\to\infty} \frac{\\#\\{k\in C;1\leq k \leq n\\}}{n}$$
> が収束するような$C\subseteq \mathbb{N}$の全体を$\mathfrak{C}$
このとき、$\mathfrak{C}$は有限加法族にはなりえない。

**※注釈**
これ自体は**"自然数から無作為に数字を一つ取り出すと、それが$C$に含まれているような確率"**を考えた時の自然な導入で、$n$を有限で考えると、これは

$n$以下の自然数から無作為に一つ数字を選ぶとそれが$C$に含まれている確率を表している

と直感的に理解できる。

---

これがなんでかというと、
$$F, G\in\mathfrak{C}\ \land\ F\cap G\not\in \mathfrak{C}$$
を満たすようにできるからです。これがこの本の主張で、つまり、上記の$\lim$で定義された式は確率測度としては不適切ということを言いたかったわけですね。めでたしめでたし。
<br \><br \><br \><br \><br \><br \><br \><br \><br \><br \><br \><br \><br \><br \><br \><br \><br \><br \>

とはならないんですよ。その主張、本当に成り立ちますか？これが問題なわけです。
はい、本当にそんなものが存在するのでしょうか。まあ、結論からいえば存在するのですが、では例えば何がありますかってのが今回確かめたいことです。ということで、どのように集合を定めてやるといいでしょうか？

# 諸注意（※必読）
ここでは、exerciseのネタバレ（当たり前）が含まれます。ご注意ください。なお、このexerciseは最初に一週間かけて考えることを推奨します。
<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />

## 例
$F\subseteq \mathbb{N}$ を次のように定義します。$0\leq m\in\mathbb{Z}$について、

1. $[2^{2m},2^{2m+1})$に含まれる奇数の元は$F$の元である。
2. $[2^{2m+1},2^{2m+2})$に含まれる偶数の元は$F$の元である。
3. それ以外の元は$F$に含まれない。

このように構成します。つまり、図示すると、このようになります。

|$n$|1|2|3|4|5|6|7|8|9|10|
|:---|---|---|---|---|---|---|---|---|---|---|
||$\in[2^0, 2^1)$|$\in[2^1, 2^2)$|$\in[2^1, 2^2)$|$\in[2^2, 2^3)$|$\in[2^2, 2^3)$|$\in[2^2, 2^3)$|$\in[2^2, 2^3)$|$\in[2^3, 2^4)$|$\in[2^3, 2^4)$|$\in[2^3, 2^4)$
|偶奇|奇数|偶数|奇数|偶数|奇数|偶数|奇数|偶数|奇数|偶数|
|||||||||||
|$\mathrm{in}\ F?$|**true**|**true**|false|false|**true**|false|**true**|**true**|false|**true**|

なので、 $F = \\{1,2,5,7,8,10,\ldots\\}$ と構成されていくわけです。
$a_n(C) = \frac{\\#\\{k\in C;1\leq k \leq n\\}}{n}\ $ とすると、これは任意の$m$に対して、$[1, 2)$以外はすべて、偶数と奇数の数が一致してるので、1., 2.のように構築したのにもかかわらず、$a_n(F)\ $ は$n\to\infty$のとき、$1/2$に収束する。すなわち、$F\in\mathfrak{C}$が成立。

しかし、$2\mathbb{N}\cap F$を考えてみます。ちなみに、$2\mathbb{N}\in \mathfrak{C}\ $ であることは自明なので証明はしません。このとき、$F$の元を偶数のみで構成するという意味なので、$F = \\{2,8,10,\ldots\\}$となるわけです。
ここで、$n = 2^{2m} - 1$と$n = 2^{2m+1}-1$に注目します。というのは、$a_n(2\mathbb{N}\cap F)$が振動することをいうために、2つの部分列を取り出して、それが振動することを示したいからです。

**1]** $n = 2^{2m+1}-1\ $のとき

$$a_n = 1-\frac{1+2^2 + \cdots+2^{2m}}{2^{2m+1}-1} = 1-\frac{4^{m + 1}-1}{3(2^{2m+1}-1)}$$

**※$1+2^2 + \cdots+2^{2m}\ $はFに含まれていない$n$以下の自然数の個数**

これが成り立ちます。これを $m\to\infty\ $すると、$n\to\infty$より、$a_n\to 1/3\ $と収束します。

**2]** $n = 2^{2m} - 1$のとき

$$a_n = \frac{2 + 2^3 + \cdots+2^{2m-1}}{2^m-1} = \frac{2(2^{2m}-1)}{3(2^{2m}-1)} = \frac{2}{3}$$
よって、$a_n$は$m\to\infty\ $とすると、$n\to\infty$なので$2/3$に収束しますね。


このように部分列の取り方によって、収束の仕方が違うので、$a_n(F)\ $は収束せずに振動します。
以上より、$2\mathbb{N}, F\in\mathfrak{C}\ \land\ 2\mathbb{N}\cap F\not\in\mathfrak{C}\  $が成立しますので、exerciseの主張は正しいことがわかりました。
Laravelのフラグ設定について

よくある実装で例えばユーザの権限を「有効」「無効」を「Y」と「N」という
フラグデータで扱いViewで出力するときにそれぞれ「有効」、「無効」という感じで出力したいときってあるかなと思います。

##Model
```php
public function userStatus($flag) {
    return $flag == 'Y' ? '有効' : '無効';
}
```

こんな感じでモデル層に実装したりするのを見かけたりするのですが
別にこれでも悪くはないですが、あくまでモデル層はDB接続やロジック層を重点的に書くところで
出力に関わる処理を書くのはベストではないかと思います。

モデル以外に書くとすれば人によって様々ですが
ここでいくつか候補を挙げていきます

##config

```php:config/users/status.php

return [
    "label" => ["Y" => "有効", "N" => "無効"],
]
```
と設定ファイルに定義したら

```php:index.blade.php
config("users.status.label.{$user.active_flag}", "未定義")
```
という形で呼び出すことができます。

##言語データ
Laravelのローカリゼーション機能で定義する場合


```php:resouce/lang/ja/user.php
return [
    "active_flag" => ["Y" => "有効", "N" => "無効"],
]
```

```php:index.blade.php
__("user.active_flag.{$user.active_flag}")
```

##プルダウン
あとはプルダウンの値を管理したいときにも役に立つます。


```php:config/japan.php

return [
    "city" => [0 => "都市を選択してください", 1 => "東京", 2 => "大阪", 3 => "名古屋",4 => "福岡"],
]
```
とプルダウンの値を定義して

```php:index.blade.php
 <select name="city" >
     @foreach(config('japan.city') as $key => $value)
         <option value="{{ $key }}" @if(config("japan.city.{$japan->city}")) selected @endif>
             {{ $value }}
         </option>
     @endforeach
 </select>

```

##まとめ
いくつか例を挙げましたが、好みにもよるかなと思います。
他にいい方法あればご教示いただければと思います。
SwiftでRubyのeach_cons, each_sliceをする

Swift で、 Ruby の　`each_cons(n)` みたいに、n個ずつずらしながら扱いたいときのTips。

# コード

```swift
extension Array {
    
    func eachPair() -> [(Element, Element)] {
        return zip(self, self.dropFirst()).map({ ($0.0, $0.1) })
    }
    
    func eachCons(_ n: Int) -> [ArraySlice<Element>] {
        return indices.dropLast(n-1).map({ self[$0...$0+n-1] })
    }
    
    func eachSlice(_ n: Int) -> [ArraySlice<Element>] {
        return stride(from: 0, through: count - 1, by: n).map({ self[($0..<$0+n).clamped(to: indices)] })
    }
}
```

# 使用

```swift
let sample = [1, 2, 3, 4, 5, 6]

sample.eachPair()   // [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

sample.eachCons(3)  // [[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6]]
sample.eachCons(6)  // [[1, 2, 3, 4, 5, 6]]
sample.eachCons(7)  // []

sample.eachSlice(2) // [[1, 2], [3, 4], [5, 6]]
sample.eachSlice(4) // [[1, 2, 3, 4], [5, 6]]
sample.eachSlice(7) // [[1, 2, 3, 4, 5, 6]]
```

`eachPair` はタプルで返るようになってます。
`eachCons` で大きい値を与えた場合、空の配列が返ります。

# 補足
- `eachCons(0)` など0以下の値を与えるとエラーになるので、工夫しても良いかも。
- `eachPair()` は、 Ruby で言う `each_pair` とは異なるので注意。
- extension は `Collection` ではなく `Array` に対して書いています。 `Dictionary` などには使用しないので。

# 環境

- Swift 5.0

# 参考

- Ruby の配列で n 個ずつの要素を扱いたい<br>
  https://qiita.com/yynozk/items/022b0dfcb52a2cf30eca
- Ruby のリファレンス<br>
https://ref.xaio.jp/ruby/classes/enumerable/each_cons<br>
https://ref.xaio.jp/ruby/classes/hash/each
- コードの参考元<br>
https://stackoverflow.com/questions/39756309<br>
https://gist.github.com/khanlou/f27b34f28b21b4834a758913e06a5f3b<br>
https://stackoverflow.com/questions/27984914/swift-equivalent-to-each-slice
一足遅れて Kubernetes を学び始める  - 01. 環境選択編 -

# ストーリー
1. [一足遅れて Kubernetes を学び始める - 01. 環境選択編 -](https://qiita.com/silverbirder/items/34b823c1a4449d40e610)
1. [一足遅れて Kubernetes を学び始める - 02. Docker For Mac -](https://qiita.com/silverbirder/items/d1aa368568885df2e44f)
1. [一足遅れて Kubernetes を学び始める - 03. Raspberry Pi -](https://qiita.com/silverbirder/items/cfaaba136b74b3140902)
1. [一足遅れて Kubernetes を学び始める - 04. kubectl -](https://qiita.com/silverbirder/items/7ae773b6519b940b5be4)
1. [一足遅れて Kubernetes を学び始める - 05. workloads その1 -](https://qiita.com/silverbirder/items/7041aa5d4126a6784d59)
1. [一足遅れて Kubernetes を学び始める - 06. workloads その2 -](https://qiita.com/silverbirder/items/d3522237b28703a9adb6)
1. [一足遅れて Kubernetes を学び始める - 07. workloads その3 -](https://qiita.com/silverbirder/items/937e1b5f6b3589452932)
1. [一足遅れて Kubernetes を学び始める - 08. discovery&LB その1 -](https://qiita.com/silverbirder/items/3a46ab92b45cdcc56ccd)
1. [一足遅れて Kubernetes を学び始める - 09. discovery&LB その2 -](https://qiita.com/silverbirder/items/f6290a7868849d57b9f1)
1. [一足遅れて Kubernetes を学び始める - 10. config&storage その1 -](https://qiita.com/silverbirder/items/cb17f02f52c7b5c2aafd)
1. [一足遅れて Kubernetes を学び始める - 11. config&storage その2 -](https://qiita.com/silverbirder/items/8d7a5473fa6969954e21)
1. [一足遅れて Kubernetes を学び始める - 12. リソース制限 -](https://qiita.com/silverbirder/items/5c0703f8fa055ade9f21)
1. [一足遅れて Kubernetes を学び始める - 13. ヘルスチェックとコンテナライフサイクル -](https://qiita.com/silverbirder/items/8df21f399c453b9f8e51)
1. [一足遅れて Kubernetes を学び始める - 14. スケジューリング -](https://qiita.com/silverbirder/items/cae4649d9f9336bc01fd)
1. [一足遅れて Kubernetes を学び始める - 15. セキュリティ -](https://qiita.com/silverbirder/items/8ea729949ab3bb4cf540)
1. [一足遅れて Kubernetes を学び始める - 16. コンポーネント -](https://qiita.com/silverbirder/items/a68499a10dd00c192947)

# 経緯
Kubernetesを使えるようになりたいな〜（定義不明）
けど、他にやりたいこと（アプリ開発）あるから後回しにしちゃえ〜！！
と、今までずっと、ちゃんと学ばなかったKubernetesを、本腰入れて使ってみようと思います。 :sparkles: 

# 環境
```text:machine
iMac (21.5-inch, 2017)
```
私の知識レベルは、
「Kubernetesはコンテナオーケストレーションしてくれるやつでしょ」というざっくり認識で、関連用語は耳にしたことがあるだけで、よく理解できていません。

# 最初、何から始めよう？
マネージドサービスのGKE使ったほうが、最初は楽で簡単だから、そっちを使ったほうが良いみたいです。 :heart_eyes: 

***
## GKE SetUp
![スクリーンショット 2019-04-18 21.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143813/ad09881d-d3b7-1e03-48e4-a41466fb857d.png)
ノードってのは、ポッド（コンテナ）を入れるマシンなんだっけな。 ([PodとNode](https://nownabe.github.io/kubernetes-doc/tutorials/kubernetes_basics/3_explore_your_app.html))
***
![スクリーンショット 2019-04-18 21.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143813/680b83b8-d59a-e4f7-4497-5b4d542fc796.png)
まあ、デフォルトで良いよね :thinking: 
***
![スクリーンショット 2019-04-18 21.11.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143813/b5f2b248-28a2-77a5-649e-4d9e85d58ace.png)

単語がどれも分からなさすぎる...(Istio?自動プロビジョニング?垂直ポッド自動スケーリング？) :thinking: :thinking: :thinking: 

# MacでKubernetes試せるから、そっちで学んでいこう...
ちょっと意味がわからない状態で、GKE動かしたらお金がかかる上に、何してるのか分からないから、もったいない。
Docker For MacにKubernetes使えるみたいだから、まずはそっちを使って学んでいこうかな。。。 :muscle: 

次回は[こちら](https://qiita.com/silverbirder/items/d1aa368568885df2e44f)です。
任意方向からスピンの上下を測定してみる

$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$

自作の量子計算シミュレータを使って、任意方向からスピンの上下を測定してみるよ。

* [量子計算シミュレータ、つくってみた](https://qiita.com/Sam_N/items/310b18c584e6fc686387)
* [qlazy - Quantum Computer Simulator](https://github.com/samn33/qlazy)

## はじめに

[「量子力学の基本：スピンと測定の不思議」](https://qiita.com/SamN/items/8b0a9f80e80b56e245d4)で、X軸、Z軸方向からスピンの上下を測定してみて、量子力学の不思議さを実感してみましたが、特定軸方向ではない、任意の方向からスピンを測定してみるとどうなるかが気になります。

[EMANの物理学:量子力学:スピノル（イメージ重視）](http://eman-physics.net/quantum/spinor.html)

ちょうど、ここ（↑）に良い解説があります。それによると、ある軸方向（例えばX軸）上向きに100%向いているスピンがあったとき、これをZ軸周りに角度$\phi$だけ傾けた方向から測定すると、上向きが観測される確率は理論的には、$$cos^{2}\frac{\phi}{2}$$に等しくなるとのことです（EMANでは、$\phi$ではなく$\theta$という記号が使われていますが）。このことをこれからシミュレータで確認してみたいと思います。

## シミュレータで測定

Linuxコマンドではなく、Pythonでやってみます。コードは以下の通りです。簡単なコードなので、見てすぐわかると思いますが、measure関数の引数phaseに、上の$\phi$に相当する値を次々に入れていって、確率を計測して、合わせて理論値も出力するようにしています。

```measure_spin_any_direction.py
import math
from qlazypy import QState

def measure(phase):

    qs = QState(1)
    qs.h(0)
    freq_list = qs.m(id=[0],angle=0.5,phase=phase).frq
    prob = freq_list[0] / 100

    print("===")
    print("phase = {0:.4f} PI".format(phase))
    print("[measured] prob. of up-spin = {0:.4f}".format(prob))
    print("[theoretical] cos(phase/2)^2 = {0:.4f}".format((math.cos(phase*math.pi/2))**2))

    del qs

def main():

    measure(0.0)
    measure(0.25)
    measure(0.5)
    measure(0.75)
    measure(1.0)

if __name__ == '__main__':
    main()
```

measure関数で何をやっているか一応簡単に説明します。

```pyython
qs = QState(1)
qs.h(0)
```

まず、QStateで量子ビットを１個初期化します。量子状態は$\ket{0}$になります。つまり、Z軸方向上向きのスピンが１個生成されたと思ってください。次に、この量子ビットに対してアダマールゲートを適用します。そうすると、スピンはX軸方向上向きになります（上向きと言っていますが、ブロッホ球上では横に寝るイメージですが）。

```python
freq_list = qs.m(id=[0],angle=0.5,phase=phase).frq
prob = freq_list[0] / 100
```

量子状態qsに適用されているm()メソッドでスピンの上下を測定するのですが、ここで、引数idには測定する量子ビット番号のリスト、引数angleにはZ軸上向きとのなす角$\theta$、引数phaseにはZ軸周りの回転角$\phi$（X軸プラス方向が基準）を指定し、測定の方向を表します。ブロッホ球をイメージしていただければ良いです。ここで、phase,angleの単位は$\pi$ラジアンです。なので、0.5は$0.5\pi$を表します。上のコードでは指定していませんが、引数shotsに試行回数も指定できます（デフォルトは100回です）。測定結果のヒストグラムは、frqプロパティで取得することができ、今の場合、frq_listとして格納されます。また、上のコードでは使っていませんが、lstプロパティで最後の測定結果(int)も取得できます。いま、計測したいのは上向きスピンの確率なので、frq_list[0]を試行回数100で割っています。

後は適当に表示して、最後に、

```python
del qs
```

で、qsのメモリを解放しています。qlazyでは内部の計算はC言語で実装していて、CtypesでPythonから呼び出すようにしています。Cで動的確保したメモリは、明示的に解放してあげないといけないようなので、そうしています。

というわけで、実行してみます。

```sh
$ python measure_spin_any_direction.py
```

以下のような結果が得られました。

```sh
===
phase = 0.0000 PI
[measured] prob. of up-spin = 1.0000
[theoretical] cos(phase/2)^2 = 1.0000
===
phase = 0.2500 PI
[measured] prob. of up-spin = 0.8800
[theoretical] cos(phase/2)^2 = 0.8536
===
phase = 0.5000 PI
[measured] prob. of up-spin = 0.4900
[theoretical] cos(phase/2)^2 = 0.5000
===
phase = 0.7500 PI
[measured] prob. of up-spin = 0.1500
[theoretical] cos(phase/2)^2 = 0.1464
===
phase = 1.0000 PI
[measured] prob. of up-spin = 0.0000
[theoretical] cos(phase/2)^2 = 0.0000
```

どうでしょうか。だいたい理論値とあってますよね。ということで、一応ちゃんと実装されてますなー、という確認でした。

以上
CSSのデバッグをstylelintで行う



## 何ができるようになったか
画像は、```.em_2em```というセレクタが二つあります。
それに対して、セレクタ重複禁止のルールを設定しているので、その場で指摘され、なおかつ画面下のPROBLEMSタブでも注意してくれます。
このように、CSSに対し、提供されている中から好みのルールを選び、自由に追加していくことで、間違った記述にエラーを出すことができます。

![スクリーンショット 2019-04-18 20.34.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295360/1e9a8ad5-b282-6f86-c2ea-f9a32caf7416.png)

## なぜこれをやりたかったか？
HTML/CSSでひととおりサイトを作った後、CSSのセレクタなどに重複がたくさんあったりして、これなんとかしたい！って思いました。でも手動でやるのはなんとなくクールじゃない気がするので、とにかく検索に検索を重ねたまとめです。



## そもそもデバッグってなんぞや

[MDN - HTMLのデバッグ](<https://developer.mozilla.org/ja/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML#Debugging_isn't_scary>)

一般的にエラーは２種類に大別される

- ロジックエラー
- シンタックスエラー

ロジックエラーは、そもそものコードの作り方、考え方が間違っているというもの。

シンタックスエラーは、HTMLやCSS自体は悩まされにくい。なぜなら最近のモダンブラウザが構文解析エラーがあったとしてもそれをある程度空気を読んで画面にいい感じに表示してしまう。

事実、自分も古いソース改修で、こういうHTMLを書いてしまっていたけど、

```html
<table class="table_1">
　　<table class="table_2"></table>
</table>
```

本来はこう。



```html
<table class="table_1">
   <tr>
     <td>
    	<table class="table_2"></table>
     </td>
   <tr>
</table>
```



だけど、chromeのデベロッパーツールを見ると、いい感じに表示してくれている(本当に些細に違うところはあるけど)。なお、間違ったコードはデベロッパーツールでは

```html
<table class="table_1">
</table>
<table class="table_2"></table>
```

なんかこういう感じに表示されていた。

つまり、こういったことを、ソースを書くのがひと段落したら、デベロッパーツールとか言う以前にチェックしておきたいよねってことだと解釈しました。



##  デバッグを行う
### MDNでデバッグを学ぶ

[MDN - HTMLのデバッグ](<https://developer.mozilla.org/ja/docs/Learn/HTML/Introduction_to_HTML/Debugging_HTML#Debugging_isn't_scary>)のページでは、HTML/CSSの両方、サンプルファイルをダウンロードし、[W3Cの公式サイト](<https://validator.w3.org/nu/#textarea>)で、デバッグを行う方法が紹介されている。

- ソースファイルをアップロードしてチェック
- ソースコードをペースとしてチェック
- URIをペースとしてチェック

という3つの方法が用意されている。



### vscodeにstylelintをインストールしてデバッグできるようにする

いちいちファイルをアップロードしたりするのは現実的でないし、エディター内で完結したほうがスマートな気がするので、cssデバッグとかそんな感じのワードで検索しまくった結果stylelintという方法にたどり着く。

そもそもlintってなん？って人は(自分もその部類ですが)

[ESLint 最初の一歩](<https://qiita.com/mysticatea/items/f523dab04a25f617c87d>)

要は文法エラーなどをチェックしてくれるツールのcss版。scss用などもあるらしい。

stylelintについては、導入方法が大きく分けて二つある。

- コードエディタにプラグインをインストール
- npm/yarnでインストール(node.jsベース)

僕はvscodeのプラグインを選びましたので、その方法を。

### 手順

1.[vscodeのプラグイン](https://marketplace.visualstudio.com/items?itemName=shinnn.stylelint#extension-settings)

2.vscodeのワークスペース設定に、以下を追加

   ```js
   {
       "stylelint.enable": true,
       "css.validate": false,
       "scss.validate": false
   }
   ```

3.プロジェクトルートディレクトリに、```.stylelintrc```を追加

4.```.stylelintrc```に、必要なルールを記述。

   ```js
   {
     "rules": {
       "ルール1": 値,
       "ルール2": 値
     }
   }
   ```

[追加できるルール](https://stylelint.io/user-guide/rules/#rules)



## 結果
自分はCSSのセレクター重複がいやだったので、それを解消できたので良かった。これを足がかりに、ルールを追加し、いい感じにしていけたらいいな、と思いました。
Heroku Private Spaces DNS Service Discovery 「環境変数」編

以前、[heroku 上級編 - Private Space でできること -](https://qiita.com/sho7650/items/10904c9be7ab20e82513)でも触れました[DNSサービスディスカバリ](https://qiita.com/sho7650/items/10904c9be7ab20e82513#4-dns-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AB%E3%83%90%E3%83%AA)機能は奥深く、さまざまな機能が利用できます。うまく組み合わせると、通常のPaaSでは実現の難しいこともカンタンに実装できたりします。

今日は、その中から「環境変数」について紹介します。

# DNSサービスディスカバリで利用できる環境変数

[ここ](https://devcenter.heroku.com/articles/dyno-dns-service-discovery#environment-variables)に書いてあるよ、と言ったらそれまでですが。もう少し具体的に説明します。

全部で 4つの環境変数があります。これで、Private Space内で割り当てられた名前やIPアドレスを知ることができます。表の部分をコピペしたら、ちゃんとMarkdownでコピペされたので「qiitaやるじゃん」って思ったとこです。

| 環境変数名 | 内容 |
|:--|:--|
| HEROKU_DNS_FORMATION_NAME | 対象のdynoを含むプロセスタイプのホスト名 |
| HEROKU_DNS_DYNO_NAME | 対象の dyno に割り当てられた内部FQDNホスト名 |
| HEROKU_DNS_APP_NAME | dynoを有するHerokuアプリのサブドメイン名 |
| HEROKU_PRIVATE_IP | dynoに割り当てられた、Private Space内でアクセス可能なプライベートIPアドレス |

では、もう少し具体的に示していきます。

例えば、`sample-app` というPrivate Space 内で動いている Herokuアプリがあるとします。Internetでアクセスする場合には、`https://sample-app.herokuapp.com` が標準のホスト名になるものです。

このとき、`web` dyno が 4つ。`worker` dyno が 2つ動いていたとした場合に、実際にこれらの環境変数名がどうなるかを示していきながら説明します。

まず、dyno の内部FQDNホスト名は次の形式で割り当てられます。この基本をおさえた上で、次にすすんでどうぞ。

内部アドレスのFQDN: **[Dyno番号].<プロセスタイプ>.<Herokuアプリ名>.app.localspace**

では、web.1 dyno (1番目のweb dyno)で実行した場合にはどうなるでしょうか。

| 環境変数名 | 返却されるホスト名/IPアドレス |
|:--|:--|
| HEROKU_DNS_FORMATION_NAME | web.sample-app.app.localspace |
| HEROKU_DNS_DYNO_NAME | 1.web.sample-app.app.localspace |
| HEROKU_DNS_APP_NAME | sample-app.app.localspace |
| HEROKU_PRIVATE_IP | 10.x.x.x |

IPアドレスは起動するタイミングによって、常に変動しますので省略しています。

では、worker.2 (2番目のworker dyno)で実行した場合は、というと次のようになります。

| 環境変数名 | 返却されるホスト名/IPアドレス |
|:--|:--|
| HEROKU_DNS_FORMATION_NAME | worker.sample-app.app.localspace |
| HEROKU_DNS_DYNO_NAME | 2.worker.sample-app.app.localspace |
| HEROKU_DNS_APP_NAME | sample-app.app.localspace |
| HEROKU_PRIVATE_IP | 10.x.y.y |

## つかいかた

これらがわかるとどんな良いことがあるでしょうか。dyno 自身がこれらを利用するということは少ないでしょう。ただ、これらの情報を他に接続するような場合に利用したり、相手に知らせたりすることができるようになります。

### HEROKU_PRIVATE_IP/HEROKU_DNS_DYNO_NAME

先日、苦難の上に到達した [Private Space 内で自分自身の IPアドレスを特定する方法](https://qiita.com/sho7650/items/ad8e7053a5f1b464e16c) でも紹介しましたが、IPアドレスや自分自身のホスト名は、外部からアクセスしてもらうときに必要不可欠な情報になります。

> Java RMIなどでは、自分自身のIPアドレスを指定して、待ち受けて起動するような仕様になっているものがあります。何も指定しないと、デフォルトではhostnameで解決されたIPアドレスを指定するようです。

ということを紹介しましたが、具体的には[Apache JMeter](https://jmeter.apache.org/)などでは、Master/Slave の構成にする際に、Slave側は外部からアクセスできるようなRMI Serverのホスト名(IPアドレス)を指定する必要があります。具体的には Javaから JMeterを起動する際に、`java`コマンドの引数に次のような指定が必要になるはずです。例えば、次のように起動コマンドに指定するでしょう。

```:java
java -Djava.rmi.server.hostname=${HEROKU_DNS_DYNO_NAME}
java -Djava.rmi.server.hostname=${HEROKU_PRIVATE_IP}
```

このように指示しないと、動いてほしいように動作しないということになります。

### HEROKU_DNS_APP_NAME

heroku へdeployするソースコードは、Herokuアプリ名が何になるか分からずにdeployされます。可搬性も考慮すると、そのようにコーディングすることが望ましいというか、そうせざるを得ないでしょう。この場合、あるdynoから他のdynoへ接続したい場合に、内部ホスト名を指定する場合にサブドメインとしてこの`HEROKU_DNS_APP_NAME`を指定します。

たとえば、worker.1(1番目のworker dyno)へアクセスしたいときには、次のようにホスト名を指定することになります。

```:HEROKU_DNS_APP_NAME(bashの場合)
1.worker.${HEROKU_DNS_APP_NAME}
```
An example command to easily execute the (host) #python script file in a container with #docker

<h1> ex.py </h1><pre> <code>import sys print(&quot;a&quot;) print(1+2) import sys print(sys.version)</code> </pre><h1> EXE </h1><pre> <code># cat ex.py | docker run -i python a 3 3.7.3 (default, Mar 27 2019, 23:40:30) [GCC 6.3.0 20170516]</code> </pre>

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1324








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Linkedin プロフィール情報の取得

Linkedin プロフィール情報を取得する方法を調べていました。その際に[linkedin-api](https://pypi.org/project/linkedin-api/)という便利なthird-party pythonライブラリを発見したので共有します。

# 概要

LinkedinはAPIを提供しているので他サービスと同じくLinkedin developersにappを登録してOAuth2経由で情報取得を図るのは可能です。ただ、少し煩雑になります。(まあ、慣れている方だとすっとできるものだと思いますが)

OAuth2 APIを利用した情報取得に関しては以下の記事で良くまとめられています。

[【LinkedIn】OAuth2 API まとめ](https://qiita.com/ight/items/124e3d83617b1e86ba1c)

一方、[linkedin-api](https://pypi.org/project/linkedin-api/)はLinkedin developersにいって登録とかの処理をいらず、アカウント名とパスワードだけで利用可能なので非常に便利です。

このライブラリを使うことで、プロフィール、プロフィールのつながり、プロフィールスキルタグ、連絡先、学歴、職歴情報などを取得することが可能です。(詳細機能は[こちら](https://github.com/tomquirk/linkedin-api/blob/master/DOCS.md)を参照してください。)

**しかし、ライブラリのreadmeページに作者も書いてあるように、こちらのプロジェクトは勉強用に軽く使うのを推薦します。なぜなら、このような使い方はLinkedinの利用契約を違反していて、いざとなったらアカウントの凍結に繋がる可能性もあるためです。**

今回の場合も、ただ便利なものを発見したので共有するだけで、実際のプロジェクトでは使っていません。

作者の原文

```
USE AT YOUR OWN RISK 😉
This project should only be used as a learning project. 
Using it would violate Linkedin's User Agreement. 
I am not responsible for your account being blocked 
(which they will definitely do - see User Agreement section 8.2). 
Hint: don't use a Linkedin account that you care about)
```

# 使い方
## インストール
```
pip install linkedin-api
```

## プロフィール情報取得
```
from linkedin_api import Linkedin
LINKEDIN_ACCOUNT = 'email'
LINKEDIN_PWD = 'password'

# URL: https://www.linkedin.com/in/yyyyy
LINKEDIN_USER_ID = 'yyyyy'

api = Linkedin(LINKEDIN_ACCOUNT, LINKEDIN_PWD)
profile = api.get_profile(LINKEDIN_USER_ID)
```
他の情報取得は[こちら](https://github.com/tomquirk/linkedin-api/blob/master/DOCS.md)を参照してください。

# プロフィールアイコンの取得
今回のライブラリではプロフィールアイコンを取得する関数が定義されていなかったので、自分で定義しました。
*後になって発見したんですが、プロフィールアイコンの取得は自分のアイコンしか拾えないことがわかりました。*

```
def get_profile_icon(profile):
    profile_icon = None
    if profile == {}:
        return profile_icon

    if 'profilePictureOriginalImage' in profile.keys():
        profile_icon = profile['profilePictureOriginalImage']
        if 'com.linkedin.common.VectorImage' in profile_icon.keys():
            profile_icon = profile_icon['com.linkedin.common.VectorImage']
            rootUrl = None
            path = None

            if 'rootUrl' in profile_icon.keys():
                rootUrl = profile_icon['rootUrl']
            if 'artifacts' in profile_icon.keys():
                path = profile_icon['artifacts']
                if len(path) != 0:
                    path = path[0]['fileIdentifyingUrlPathSegment']
            if rootUrl is not None and path is not None:
                profile_icon = '{}{}'.format(rootUrl, path)

    return profile_icon
```

# まとめ
今回は第三者が開発したLinkedinのPython Wrapperを紹介しました。
**便利ではあるもののリスクが伴うものなので使う場合は自己責任で使ってください。**
Node.js にて await を付けて呼び出した関数が例外を投げた場合の挙動を見る

await を付けて呼び出した関数が例外を投げた場合のサンプルコード

## 概要

- await をつけて Promise オブジェクトを返す関数を呼び出す
- Promise オブジェクトを返すと思っていた関数が例外を発生させた場合の挙動を見る

## Promise と await と async とは

[Promise \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)

> Promise オブジェクトは非同期処理の最終的な完了処理（もしくは失敗）およびその結果の値を表現します。

[await \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/await)

> await 演算子は、async function によって Promise が返されるのを待機するために使用します。

> await 式は async function の実行を一時停止し、Promise の解決または拒否を待ちます。解決した後に async function の実行を再開します。再開するときに await 式は解決された Promise にラップされた値を返します。
> Promise が拒絶された場合、await 式は理由となった値をスローします。
> await 式に続く値が Promise ではなかった場合、解決された Promise に変換されます。

「解決」は resolve のことで、「拒絶」は reject のこと。

[async function \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function)

> async function 宣言は、 AsyncFunction オブジェクトを返す 非同期関数 を定義します。非同期関数は非同期でイベントループを介して実行され、暗黙的にPromiseを返します。なおコードのシンタックス及び構造は通常の同期関数と非常に似たものになります。

## サンプルコード

```js
// Promise オブジェクトを返す or 例外が発生する関数
function foo(value) {
  switch (value) {
    case 'resolve':
      // resolv を呼ぶ Promise を返す
      return new Promise(function(resolve, reject) {
        resolve({result: 'success'});
      });
      break;
    case 'reject':
      // reject を呼ぶ Promise を返す
      return new Promise(function(resolve, reject) {
        reject({result: 'failure'});
      });
      break;
    case 'except':
      // 例外を発生させる
      throw new Error('error message');
      break;
  }
}

async function bar(value) {
  try {
    const r = await foo(value);
    console.log('result: ' + JSON.stringify(r));
  } catch (e) {
    console.log('exception: ' + JSON.stringify(e));
    console.log(e);
  }
  console.log('');
}

async function main() {
  console.log('*** resolve ***');
  await bar('resolve');
  console.log('*** reject ***');
  await bar('reject');
  console.log('*** except ***');
  await bar('except');
}

main();
```

## 実行結果

- resolve → resolve メソッドに渡した値が戻り値になる
- reject → reject メソッドに渡した値が例外として投げられる
- 例外発生 → 呼び出し先の関数内で throw した例外が投げられる

```
*** resolve ***
result: {"result":"success"}

*** reject ***
exception: {"result":"failure"}
{ result: 'failure' }

*** except ***
exception: {}
Error: error message
    at foo (/Users/me/hoge/try-promise.js:18:13)
    at bar (/Users/me/hoge/try-promise.js:25:21)
    at main (/Users/me/hoge/try-promise.js:40:9)
    at process._tickCallback (internal/process/next_tick.js:68:7)
    at Function.Module.runMain (internal/modules/cjs/loader.js:757:11)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
```

## 今回の環境

macOS Mojave + Node.js v10.15.3

```console
$ node --version
v10.15.3

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.4
BuildVersion:   18E226
```
プログラミング学習記録61〜ホワイトハッカーとブラックハッカー〜

##今日やったこと
- 昨日に引き続き情報セキュリティについて学ぶ

今日も昨日の続きで情報セキュリティについて学びました。

年金やベネッセの個人情報流出事件に触れました。

サイバー攻撃が年々増えているので、インターネットを利用する会社はセキュリティに詳しいエンジニア・ハッカーを雇う必要がありますね。

また、ハッカーにもいいハッカーと悪いハッカーがいます。
いいハッカーは「ホワイトハッカー」、
悪いハッカーは「ブラックハッカー」と呼ぶそうです。

ハッカーというとなんとなく悪いイメージがありますが、実際にはブラックハッカーに対抗するホワイトハッカーも含めた言葉なんですね。

ハッカーはかっこいいなとは思いますけど、ハッキングはプログラミングの中でも特に難しそうなので、ハッカーになりたいなとは思えないですね笑

プログラミング以外にも通信技術や暗号化等にも詳しくないとできなさそうです。

ハッカーの知り合いとかいたら面白そうだなと思いました！

ということで、明日からも引き続き頑張ります。

おわり
今回ハマったPHPのexecuteのおはなし

#少し前に、ハマったところのmemo
###executeにパラメータを付けるときはarrayが絶対必要ということ
PHPでプリペアドステートメントを実行する際、executeにパラメータを付けるときはarrayが絶対必要ということ

今回、プリペアドステートメントを用意、実行する際にSQLに入れ込む値が1つだったので
```execute(array( $value ))```のようにしなくても良いと勝手に判断してしまい、
```execute( $value )```のように行ったところ実行されなかった。

たとえ、値が1つだろうが、2つだろうが配列で渡さないといけないという概念がなかったのと
勝手に書式を変えてしまったのが大きな原因でした。

[PHPリファレンス PDOStatement::execute](http://php.net/manual/ja/pdostatement.execute.php#refsect1-pdostatement.execute-parameters)

やはりエラーが起こった時点で、ある程度問題の箇所を絞ってそれからphp.netのマニュアルを
よく読んで進めていかなければいけないな、と再確認させてもらいました。

ご教授してくださったメンターさんに感謝しております。
Dockerでホストのボリュームをコンテナにマウントできなかった

```yaml:docker-compose.yml
  composer:
    build: ./composer
    volumes:
      - .:/hoge
```
docker-composeでこんな感じでホストのディレクトリをマウントしたいのに一向に出来ない。
全くわからん。

# 結果
c:\Users以下のディレクトリしかマウントできない。

Windows環境でDocker Toolboxを使っていましたが、Windowsではそんな罠があったようです。
phpで文章を整形せよ！

#なんかもうごっちゃですけど…

```
むかしむかしあるところに

おじいさんとおばあさんが

住んでいました。

&#32;

ある日、おばあさんが川に

せんたくにいくと、かわかみから

大きなモモが、どんぶらこっこ

&#32;

4月18日 桃太郎

&#32;

注：おじいさんは芝刈りに行ってる。
```

データベースの1つのセルにコレが埋まってるんスけど…
え？これを良い感じに表示したい？？
日付と注釈は要らない？？？

…カラム分けといてやァ！

##まぁ、やります。
「プログラミングってのは匂い以外は表現出来っから」
とか言われたらやってやるしかありません。

まず問題点を洗い出してみましょう。

- 改行が無駄。
- htmlでマークアップされてない。
- 日付と注釈は不要

という感じです。
幸いなことに

- 文章が`&#32;`で区切られている。

という法則性？があるみたいなので
それを頼りに整形していきます。

###改行をまとめる
`preg_replace`を用いて正規表現で改行をまとめます。

```php
$text=preg_replace('/(\n|\r|\r\n)+/us',"<br>",$text);
```

###`&#32;`で文章を区切る
`explode`を用いて`&#32;`で文章を区切り、配列にします。

```php
$text_array=explode('&#32;',$text);
```

###要らない配列の要素を削ぐ
`array_splice();`で配列を切り出します。
他にも配列を操作する関数で必要な部分を集める
または不必要な部分を捨てます。

```php
$split=array_splice($text_array,0,2);
```

###区切った文章を繋げる
`implode`を用いて配列を繋げて、文章にします。

```php
$html='<p>'.implode('</p><p>',$split).'</p>';
```

##で完成！！！

```php
<?php
	$bunsyou='むかしむかしあるところに

	おじいさんとおばあさんが

	住んでいました。

	&#32;

	ある日、おばあさんが川に

	せんたくにいくと、かわかみから

	大きなモモが、どんぶらこっこ

	&#32;

	4月18日 桃太郎

	&#32;

	注：おじいさんは芝刈りに行ってる。';

	$text=preg_replace('/(\n|\r|\r\n)+/us',"<br>",$bunsyou);
	$text_array=explode('&#32;',$text);
	$split=array_splice($text_array,0,2);
	$html='<p>'.implode('</p><p>',$split).'</p>';

	echo $html;
?>
```
これで良い感じにマークアップ出来たはず！

###でも課題も残る。
`p`タグの最後に`br`タグが残ってるのが…
って感じですが、まぁ見れなくはないかな。

#編集後記
入社14日目
とんでもないデータベース設計の案件でコレやりました。
…ちゃんとRDB使ってください。
アウトプットが大切大切とはいえ...

#追記 2019.04.21
sansaisobaさんより
関連のないタグを削除。…というか、技術記事ではないのでQiita向きではないかもしれませんね。Qrunchをお勧めしときます。

と、連絡頂いたのでQrunchに移行致します。
Qrunchってなに？ってなったのですが、こちらを読んで確かにこっちのほうが向いているかも！と思ったので移行することにしました。
[もっと気軽にアウトプットできる技術ブログサービス「Qrunch（クランチ）」をリリースした【個人開発】](https://qiita.com/c0domisu/items/95a561d163d26bbfe274#%E3%82%AF%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AF%E3%81%A9%E3%82%93%E3%81%AA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8B)

**ただ自分と同じような畑違いの投稿をしてしまってしている方のための参考になればと思い、この記事は削除しないことにしました。**

#タイトルにもありましたが、アウトプットっていろんなメリットありますよね。
例えば...
**・記事を書くためには色んなことを調べないといけない**
これは色んな人が見るのだから間違った情報を発信してはいけないという心理から生まれて調べることによって知見が増る
**・記憶に残る**
これは学校で授業を受けながらノートを取るのと一緒で記事を書くことによって記憶に残るというもの

その他にも沢山のメリットがあります。
しかし、自分は割と早い段階でメリットがあるとわかっていたのですが、なかなかアウトプットできませんでした。

###何故かと言うと...
- 元々自己発信的な性格ではない
- インプットをしていれば大丈夫という慢心

特にこの2つが大きな理由だと考えます。

##今後のためにアウトプットする、しなければいけない
Twiiterでも大体は見る専ですし、なかなか最初から無理かも知れませんが時間を見つけて、自分のためだと思って書いていこうかなと思いました。
Heroku コマンド を最新バージョンにアップデートする方法

$ heroku -v行うと以下のようなワーニングが出ました。対処法をメモしておきます。


```ruby:qiita.rb
Warning: heroku update available from 7.19.4 to 7.22.2
```
「Herokuのバージョンが古いからアップデートしてね」ということらしい。

heroku updateコマンドでアップデートを実行した。

```ruby:qiita.rb
$heroku update
```
これでokかと思いきや

```ruby:qiita.rb
heroku-cli: Updating CLI... not updatable
```

え、アップデートできない、、、
ってことで、herokuの再インストールを実行した。

```ruby:qiita.rb
source <(curl -sL https://cdn.learnenough.com/heroku_install)
```
これでもう一度$ heroku -v を実行すると無事完了。

```ruby:qiita.rb
heroku/7.22.9 linux-x64 node-v11.10.1
```
Flaskで画像ファイルをアップロード

# はじめに

flask でファイルをアップロードするための簡単な web ページを作成したときのメモ
使用した python のバージョンは 3.5 です。

# ソースコード

## 使用したモジュール

```python
import os
# request フォームから送信した情報を扱うためのモジュール
# redirect  ページの移動
# url_for アドレス遷移
from flask import Flask, request, redirect, url_for
# ファイル名をチェックする関数
from werkzeug.utils import secure_filename
# 画像のダウンロード
from flask import send_from_directory
```

## 初期設定

コードが保存されているディレクトリと同じ階層に`uploads`というディレクトリを用意します。
これは、アップロードされたファイルを保存するためのディレクトリです。

```python
# 画像のアップロード先のディレクトリ
UPLOAD_FOLDER = './uploads'
# アップロードされる拡張子の制限
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'gif'])

app = Flask(__name__)

app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
```

## 拡張子の確認

アップロードされたファイルの拡張子があるかどうか、拡張子が正しいかどうかを確認するための関数を追加します。

```python
def allwed_file(filename):
    # .があるかどうかのチェックと、拡張子の確認
    # OKなら１、だめなら0
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
```

## ファイルのアップロード

返り値に html を返すことで、web ページにレイアウトを追加しています。

```python
# ファイルを受け取る方法の指定
@app.route('/', methods=['GET', 'POST'])
def uploads_file():
    # リクエストがポストかどうかの判別
    if request.method == 'POST':
        # ファイルがなかった場合の処理
        if 'file' not in request.files:
            flash('ファイルがありません')
            return redirect(request.url)
        # データの取り出し
        file = request.files['file']
        # ファイル名がなかった時の処理
        if file.filename == '':
            flash('ファイルがありません')
            return redirect(request.url)
        # ファイルのチェック
        if file and allwed_file(file.filename):
            # 危険な文字を削除（サニタイズ処理）
            filename = secure_filename(file.filename)
            # ファイルの保存
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            # アップロード後のページに転送
            return redirect(url_for('uploaded_file', filename=filename))
    return '''
    <!doctype html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>
                ファイルをアップロードして判定しよう
            </title>
        </head>
        <body>
            <h1>
                ファイルをアップロードして判定しよう
            </h1>
            <form method = post enctype = multipart/form-data>
            <p><input type=file name = file>
            <input type = submit value = Upload>
            </form>
        </body>
'''
```

##アップロードされたファイルの処理

url にはアップロードされたファイルの名前を指定しています
画像を返すことでアップロードされたファイルの表示をしています

```python
@app.route('/uploads/<filename>')
# ファイルを表示する
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
```

# 実行

```
set FLASK_APP=predictfile.py
python -m flask run
 * Serving Flask app "predictfile.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

アップロード前

![web.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283552/d3a7a708-a443-3d94-dc38-d2c47e0b1ec2.png)

アップロード後

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283552/afe08837-9bfb-28e5-e6e3-4f57338f0beb.png)
さくらのレンタルサーバで Python をまた野良ビルドした (備忘録)

# さくらのレンタルサーバで Python をまた野良ビルドした (備忘録)

自作アンテナが HTTPS でエラーを出しまくっていて、Python 2.7.6 から 2.7.16 にアップデートしたので、手順を備忘録として(2019-04-17).

```sh
$ cd /home/xxx/local/src/
$ wget https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tar.xz
$ xz -dc Python-2.7.16.tar.xz | tar xf -
$ cd Python-2.7.16
$ ./configure --prefix=/home/xxx/local/python-2.7.16
$ make
$ make install
$ cd ../../python-2.7.16/bin
$ wget https://bootstrap.pypa.io/get-pip.py
$ ./python get-pip.py --prefix=/home/xxx/local/python-2.7.16
$ rm get-pip.py
$ ./pip install Genshi
$ ./pip install mercurial
$ ./pip install SQLAlchemy
$ cd ../../
$ rm python
$ ln -s /home/xxx/local/python-2.7.16 python
```

インストールされたバージョンは以下.

```
pip        19.0.3
Genshi     0.7.1
SQLAlchemy 1.3.3
mercurial  4.9.1
```

新しいものに入れ替えた(2021-01-05).

```sh
$ cd /home/xxx/local/src/
$ wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz
$ xz -dc Python-2.7.18.tar.xz | tar xf -
$ cd Python-2.7.18
$ ./configure --prefix=/home/xxx/local/python-2.7.18
$ make
$ make install
$ cd ../../python-2.7.18/bin
$ wget https://bootstrap.pypa.io/get-pip.py
$ ./python get-pip.py --prefix=/home/xxx/local/python-2.7.18
$ rm get-pip.py
$ ./pip install Genshi
$ ./pip install SQLAlchemy
$ cd ../../
$ rm python
$ ln -s /home/xxx/local/python-2.7.18 python
```

インストールされたバージョンは以下.

```
pip        20.3.3
Genshi     0.7.5
SQLAlchemy 1.3.22
```

関連: [さくらのレンタルサーバで Python 3 を野良ビルドした (備忘録)](https://qiita.com/c-yan/items/bff6f857f419756d6512)
php-master-changes 2019-04-17

今日はビルド時の PCRE JIT サポートの判定修正、ビルドシステムのリファクタリング、interbase 拡張のコンパイルがこけていた問題の修正、テストの修正、DatePeriod::\_\_construct() に無効な $recurrence を渡しても生成できてしまう問題の修正、typo の修正、`$GLOBALS['hage']` での変数アクセスの最適化、mbstring での internal_encoding のフォールバック処理の修正があった！

# 2019-04-17
## temap: ext/pcre/config0.m4: add ac_cv_have_pcre2_jit variable
- https://github.com/php/php-src/commit/12ee246ae45889004fc2c099c04cfff1ce6e8848
- [7.4~]
- ext/pcre で、ビルド時の PCRE JIT サポートの判定を修正

## petk: Simplify generated_lists generation
- https://github.com/php/php-src/commit/b09fa9ed530df47bff03b151931fa4464a388d35
- [7.4~]
- ビルドシステムで、一時ファイル generated_lists の生成をやめて変数を使うよう修正

## dstogov: Fixed compilation
- https://github.com/php/php-src/commit/176100499ab8ce3389188073ea35be0a43f622b1
- ext/interbase で、コンパイルがこけていた問題の修正

## cmb69: Fix tests for non English environments
- https://github.com/php/php-src/commit/6fe75f9e45be60262bfe7e6bb92de445fe41c483
- [7.2~]
- ext/phar で、非英語環境を考慮してテストの期待出力を修正

## nyamsprod: Fixed bug [#77909](https://bugs.php.net/bug.php?id=77909): DatePeriod::\_\_construct() with invalid recurrence count value
- https://github.com/php/php-src/commit/7b1a4e24008f34a76c343ece735953ad5124e09f
- [7.2~]
- ext/date で、[DatePeriod::\_\_construct()](https://www.php.net/manual/ja/dateperiod.construct.php) に無効な $recurrence を渡しても生成できてしまう問題の修正
- 例外を投げるようになる

## carusogabriel: Fix typo
- https://github.com/php/php-src/commit/825fc6b438fbd51aeec1c058c65dc08b3c51aa8d
- [7.4~]
- デフォルトの php.ini で、[昨日の修正](https://qiita.com/sj-i/items/102c5ebfc5ff6e9892ff#nikic-smysql_connectmysqli_connect-in-phpini)で別の typo が出ていたのを修正

## dstogov: Eliminate FETCH $GLOBALS followed by FETCH_DIM/UNSET_DIM/ISSET_ISEMPTY_DIM
- https://github.com/php/php-src/commit/3ccd3aba90b4c0c95f1e0a457dbbc33c4524a4ed
- [7.4~]
- ext/opcache で、`$GLOBALS['hage']` での変数アクセスを FETCH \$GLOBALS (global) と FETCH_DIM \$x の 2 命令から FETCH \$x (glboal) の 1 命令に最適化する処理の追加

## dstogov: Fixed test
- https://github.com/php/php-src/commit/70f03416f5438c6506d909a2283dc42865fe26a9
- [var_export()](https://www.php.net/manual/ja/function.var-export.php) のテストの修正

## nikic: Fix internal_encoding fallback in mbstring
- https://github.com/php/php-src/commit/f73f190c3f97479f735b97c22a8e4885344edca1
- [7.4~]
- ext/mbstring で、internal_encoding のフォールバックを修正
- [#77907](https://bugs.php.net/bug.php?id=77907)
- PHP 処理系側の API として内部エンコーディングの変更を検知してフックできるようにし、mbstring はフックを引っかける形になってる

## nikic: Remove some uses of deprecated internal_encoding settings in tests
- https://github.com/php/php-src/commit/487d4d07b452245392369dd4d08554ee71e95a29
- [7.4~]
- iconv / mbstring の非推奨化されたエンコーディング設定を使っていたテストの修正
初期値の空判定でin_array使いたかったけどエラーでた

エラー

```php
if(empty($gomaki){
 $momusu = null; 
}else{ 
 $momusu = in_array('tunkuosu',$AKB48);
}
```
in_arrayは変数に入れられない

###解決
３項演算子をつかう

```php
empty($gomaki ) ? null : in_array('tunkuosu',$AKB48)
```


```php
$変数 = (ifの中身) ? trueの場合 : falseの場合;
```

false.
iPhoneでQRコードを読んだら、Edgeで特定URLを開くようなQRコードを生成する（Managed Browserでも可）

20201212 Edgeに合わせて一部を書き換えました。

Intune入れてiOS管理してたら、Office365はSafari禁止でEdgeでのみ使わせるケース多いとおもう。セキュリティ的には望ましいんだけど、不便なことがいくつかある。

そのうちの1つが、URLを変換したQRコードを、カメラアプリで読んだらSafariで開いてしまうこと。SharePointとか、Formsとかに誘導するQRコードを生成できたらいいのに！
・・・ということで調べてみた。

# URIスキーム

超ざっくりいうと、「特定のアプリを開かせるためのアドレスの接頭辞」みたいなもん。
ms-outlook://だとOutlookアプリが開く。
というわけでEdgeのURIスキーマを調べてみた。




# Edgeで開く

URLの[https]の部分を[https-intunemam]に置き換える。これでした。

たとえば、
https://www.bing.com/
ならば
https-intunemam://www.bing.com/

あとは、QRに変換すればいい。
QRに変換したものがこれ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/33c7cea3-696e-8d9f-b1ca-de1098ca90c6.png)

あとはパワポに埋め込むもよし、印刷してもよし。

このQRをiPhoneのカメラで開くと、Edgeで開きます。

# 参考情報
[URI に応じた既定のアプリの起動]
(https://docs.microsoft.com/ja-jp/windows/uwp/launch-resume/launch-default-app)


[how to open a link in the Intune Managed browser.](https://social.technet.microsoft.com/Forums/office/ja-JP/7b01774c-dd09-4f01-ad31-54c9b873e599/how-to-open-a-link-in-the-intune-managed-browser?forum=microsoftintuneprod)

[Create applications in Configuration Manager](https://docs.microsoft.com/en-us/sccm/apps/deploy-use/create-applications#bkmk_deploy-types)
エンジニアのシール文化 張りたくないけど、張りたい人へ

# シール張りたいけど、張りたくない！！
学会やインターンに参加していると、エンジニアの人たちがMacにシール張っているのをよく見かけます。
私もシールを張りたいと思うのですが、メタリックなビジュアルも好きなんですね。acerなんですけど。
どっちも叶えたい。
# 壁紙にしたらいんじゃない？
そこで、パワーポイントで壁紙を作ってみました。
<img width="960" alt="2019-04-18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/34110ec2-c2a2-5aee-f872-d61b20fafde6.png">

むっちゃ可愛い！
個性も出ますし、今後更新していくごとに一つ一つが思い出になりそうです。
これだけで、私の好きなコト・ゆかりのある土地がわかりますね。
幻の五輪マークもちらり。
## クリックしたい！！
それぞれのアイコンをクリックすることでソフトが起動するともっと面白そう。
実は、上画像のいくつかはショートカットのアイコンを配置してあります。
ファイル名は全角スペースで置換。
こんな感じ。
<img width="960" alt="2019-04-18 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/3550eba7-80d8-cb1b-79cc-6848db1366a3.png">
アイコンの作成には、[アイコンウィザード](https://www.vector.co.jp/soft/dl/winnt/amuse/se430751.html)を使っています。
アイコンはデスクトップから簡単に設定できます。（[参照](https://www.chunichi.co.jp/kodomo_weekly/win.html)）
## おわりに
マウスオーバーで背景色が変わらないようにできれば、もっとおしゃれになりそうです。
#docker で手元 (ホスト) の #python スクリプトファイルをお手軽に コンテナで実行するコマンド例

# ex.py

```
import sys

print("a")
print(1+2)

import sys
print(sys.version)
```

# exe

```
# cat ex.py | docker run -i python
a
3
3.7.3 (default, Mar 27 2019, 23:40:30)
[GCC 6.3.0 20170516]
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1323








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
icomoonでアイコンフォントセットを作った後はselection.jsonをGit管理に含めよう

タイトル。以上。

icomoonは、使用したいアイコンフォントセットを選択して必要な素材をZip形式でダウンロードできる。
ただ、既存のセットにフォントを追加する際には、アイコンフォントのプロジェクトから追加する必要がある。
`selection.json`という設定ファイルがあればプロジェクトをインポートできるのだが、なければまたイチからアイコンフォントを作り直す必要がある。
ということで今泣いています。

selection.jsonをgit管理に含めていればこんな悲しい思いをしなくて済んだのに。
Chart.jsで数値を３桁区切りにする方法(Typescript.ver)

業務でChart.jsを使用している際に、グラフの数値を３桁区切りにする方法が
Typescriptの書き方でなかなか出てこなく、結構な工数を使ってしまったので、
メモ程度にこちらに記載しようと思います。。。笑

ちなみにjavascriptでの書き方は以下のような感じになります。
https://blog.capilano-fw.com/?p=235

javascriptではこんな感じでchart_optionのy軸の設定でcallbackを指定すれば簡単に３桁区切りで
グラフの数値が表示されるようになります！

```
yAxes: [
    {
        ticks: {
            min: 0,
            max: 10000,
            callback: function(label, index, labels) {
                return label.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') +' 円';
            }
        }
    }
]
```

ではTypescriptで上記のcallbackを書くとなるとどのような書き方になるのでしょうか？

Typescriptはアロー関数が使用できるので、以下のように記載することになります。

```
callback: (label: string) => {return label.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') +' 円';}}
```

Typescriptの方がスッキリかけますね！！
Windows10 pipでSSLエラーが出た時の対処

Windows10環境でAnaconda3をインストールした後
Tensorflowをpipでインストールしようとしたら下記のエラーが。

```
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
```

検索したら色々出たんだけど何の効果もなく、以下が正解。
[Can't install any package via `pip` on windows 10, ssl module in Python is not available](https://github.com/pypa/virtualenv/issues/1139#issuecomment-477186474)

以下のファイルが壊れてるから、anacondaのやつと差し替えるといいよって書いてある。

```
C:\Program Files\Intel\Intel(R) Management Engine Components\iCLS\libssl-1_1-x64.dll
```

以下からコピーして上記のファイルを差し替えたらpipが動きました。

```
C:\Users\[User]\Anaconda3\pkgs\openssl-1.1.1b-he774522_1\Library\bin
```
これから来そうな技術、DevSpace

## マイクロサービスアーキテクチャにおける開発環境
　マイクロサービスアーキテクチャが普及して、いまやデファクトスタンダードになりつつありますが、様々な問題も抱えています。

- サービスの規模が大きく、ローカル開発環境で本番環境を再現できない
- クラウド上に開発環境を用意するにしても、一人ひとり用意するとほぼ使わないけど稼働させるサービスがでてきてコスパが悪い
- けど、開発環境を一つにすると他人のバグが入ったものが放り込まれる可能性がある

## そういった課題を解決するためのDevSpace
　ぶっちゃけこのリンクをみれば大体わかるhttps://docs.microsoft.com/ja-jp/azure/dev-spaces/

![collaborate-graphic.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106327/9b01a888-5558-15ce-8da1-d8f09cb43d65.gif)
Azure ドキュメントより
  
  
　このサービスでは、コードの変更が反映されたコンテナをプッシュすると、そのコンテナを動かすためのURLが発行されて、デバッグをすることができます。しかも、ほかの開発者からは見えないので上記における問題点を解決してくれます
  
  
　ちなみにAzure DevSpace のサンプルではブレイクポイントを貼ったりとかやってます。キモイ技術だ（褒め言葉）
mongoシェルのdb,collectionにコマンドの追加

# 概要

MongoDBのクライアントであるmongoシェルで使われるコマンドに新しいコマンドを追加します。mongoシェルで使われているのはJavascriptなのでそれを拡張します。

# mongoシェルで使われているオブジェクト

https://github.com/mongodb/mongo/tree/master/src/mongo/shell
に定義しているJavascriptソースがありますので参照してください。

|コマンド例| オブジェクト|オブジェクト名| ソースファイル名| 
|-----------|------------|---------|----------------|
| db.stats() |データベース | DB  | db.js  |
| db.\<collection\>.find()|コレクション | DBCollection  |  collection.js |
| cursor.next()| カーソル | DBQuery  |  query.js |

# コマンドの追加例

下記の例のようなカスタムコマンドを`.mongorc.js`に記述すれば、いつでも使えるようになります。

```javascript
DB.prototype.cols = function() {
  this.getCollectionInfos().forEach(doc=>{print(doc.name)})
}

DB.prototype.infoOp = function() {
  var info = this.serverStatus()
  return {opcounters: info.opcounters}
}

DBCollection.prototype.infoUri = function() {
  var stats = this.stats()
  return {ns: stats.ns, uri: stats.wiredTiger.uri}
}

DBCollection.prototype.findx = function(query, fields, limit, skip, batchSize, options) {
  if (fields == undefined) 
      fields = {_id:0}
  else
      fields._id = 0;
  return this.find(query, fields, limit, skip, batchSize, options)
}
```

- `db.cols()`  
    - adminデータベースで `show collections`では`system.version`などのコレクション名は表示されないが、このコマンドで表示させます
- `db.infoOp()`
    - `db.serverStatus()`はデータ項目が多いので、よく見る項目のみ表示するコマンドを作成
- `db.<collection>.infoUri()`
    - コレクションの物理ファイル名を表示する
- `db.<collection>.findx()`
    - `_id`フィールドを取得しないようにする


#### 作成したコマンドの実行例

```javascript:mongoシェル
> use admin
switched to db admin
> show collections
//何も表示されません
> db.cols()
system.keys
system.version
> db.infoOp()
{
        "opcounters" : {
                "insert" : 1,
                "query" : 32,
                "update" : 7,
                "delete" : 12,
                "getmore" : 0,
                "command" : 250
        }
}
> use test
switched to db test
> db.col2.insert({a:1})
WriteResult({ "nInserted" : 1 })
> db.col2.infoUri()
{
        "ns" : "test.col2",
        "uri" : "statistics:table:collection-0-2917259516752606342"
}
> db.col2.find()
{ "_id" : ObjectId("5cb812113c2c75c75408bfe7"), "a" : 1 }
> db.col2.findx()
{ "a" : 1 }
```
PythonでGmailを利用したメール送信

## 前提
### 環境
|Name            |Version|
|:-----------|:----------------:|
|Ubuntu|18.04.1 LTS (Bionic Beaver)|
|Python|Python 3.6.7|

### 目的
* Pythonの標準ライブラリを用いて、ssl接続でGmailを利用してメールを送信する。

### 参考
* Pythonでメール送信~Gmail編~
  * https://qiita.com/okhrn/items/630a87ce1a44778bbeb1
* Pythonでメール送信; smtplibのサンプルコード
  * https://qiita.com/takey/items/6e45a203f1c055a9024c

## 送信方法
### Gmailアカウントの設定
* 送信に利用するGmailアカウントで「安全性の低いアプリのアクセス」を許可する必要がある。
* Googleアカウント「セキュリティ」の下部にて設定する。
  * (https://myaccount.google.com/security)

### 送信
* 以下のサンプルコードを実行する。

```send_mail.py
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate
import ssl

FROM_ADDRESS = 'sender@gmail.com'
MY_PASSWORD = 'password'
TO_ADDRESS = 'receiver@test.co.jp'
BCC = ''
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'


def create_message(from_addr, to_addr, bcc_addrs, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Bcc'] = bcc_addrs
    msg['Date'] = formatdate()
    return msg


def send(from_addr, to_addrs, msg):
    #context = ssl.create_default_context()
    smtpobj = smtplib.SMTP_SSL('smtp.gmail.com', 465, timeout=10)
    smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
    smtpobj.close()


if __name__ == '__main__':

    to_addr = TO_ADDRESS
    subject = SUBJECT
    body = BODY

    msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
    send(FROM_ADDRESS, to_addr, msg)
```


```
python3 send_mail.py
```
Matplotlib で使えるフォントを調べる

プログラム

```py:get_matplotlib_font.py
#! /usr/bin/python
#
#	get_matplotlib_font.py
#
#						Apr/18/2019
# ------------------------------------------------------------------
import json
import matplotlib
import matplotlib.pyplot as plt
# ------------------------------------------------------------------
avail_font_names = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
print(json.dumps(avail_font_names))
# ------------------------------------------------------------------
```

実行結果
Takao フォントを探します。

```text
$ ./get_matplotlib_font.py > fonts.json
$ jq . fonts.json | grep Takao
  "TakaoExGothic",
  "TakaoMincho",
  "TakaoMjMincho",
  "TakaoGothic",
  "TakaoExMincho",
  "TakaoPMincho",
  "TakaoPGothic",
```
RailsとMySQLの文字コードの話

# 前提
Rails5系　（以下、「Rails」はRails5系を指す）
MySQL5系　（以下、「MySQL」はMySQL5系を指す）

# 概要
RailsのActiveRecordは多様なDB操作を簡略化してくれる。
データベース作成も`db:create`コマンド一発だが、文字コードと照合順序をちゃんと確認しないとちょっと困るかもしれない。
というか困った。

何も考えずにdb:createすると絵文字の使えない旧時代のWebアプリになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272677/a6b4c3a6-2fa3-dc4a-02c0-b3b947c4e2ac.png)

# 文字コード
## CHARACTER SET UTF8
RailsでMySQLに`db:create`すると、デフォルトでは`CHARACTER SET utf8`でテーブルが作られる。

```bash
mysql> show variables like "character_set_database";
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| character_set_database | utf8  |
+------------------------+-------+
1 row in set (0.00 sec)
```

が、MySQLの`utf8`は **4バイト文字が扱えない** 。
JIS第三・第四水準漢字の多くとemojiは4バイトに該当するそうだ。
4バイト文字を扱えるのは`utf8mb4`という別設定となる。

英語圏ではあまり問題視されていなかったのだろうが、漢字を使う場合なんかはちょっと困るので、`CHARACTER SET utf8mb4`推奨。
MySQL側のデフォルトはどこかのバージョンで`utf8mb4`になったそうだが、Railsで作る場合はRailsの設定次第なのが困りどころ。

Railsではdatabase.ymlで変更できます。
ついでに照合順序（後述）もここで変更可。

```ruby:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  charset: utf8mb4
  collation: utf8mb4_general_ci
```

## emojiは4バイト
この頃は英語圏でもemojiの普及に従って4バイト文字に「ちゃんと」対応する流れがあるらしい。
emojiは4バイトなので、今までkanjiから目を反らし続けてきた数多のデータベース管理者が頭を悩ませたと思われる。

# 照合順序
照合順序は、MySQLのデフォルトが`COLLATE utf8mb4_general_ci`で、
Railsの`db:create`のデフォルトは`COLLATE  utf8mb4_unicode_ci`らしい。

検索時に何を同値扱いにするかに違いがあり、[スピードはgeneral_ciの方が少し上らしい](https://forums.mysql.com/read.php?103,187048,188748#msg-188748)。
これが結構違うので、色々な文字を検索したい場合は要考慮。

## 照合順序で何が変わるか
いわゆる「曖昧さ」に影響があり、照合順序によって検索結果に類似文字を含めたり含めなかったりできる。何が「類似」とされるかも違う。
以下のように油断すると困ることもある。

### ハハパパ
`utf8mb4_unicode_ci`は「ハハ」と「パパ」が同値扱いになる。
### 寿司ビール
`utf8mb4_general_ci`は絵文字対応に問題があり、例えば:sushi:と:beer:が同値扱い。
寿司ビールは`utf8mb4_unicode_ci`でも発生するが、新し目の`utf8mb4_unicode_520_ci`では発生しない（ただしハハパパは発生）。

## MySQL5照合順序紹介
`utf8mb4_unicode_ci` => ハハパパ、寿司ビール
`utf8mb4_unicode_520_ci` => ハハパパ
`utf8mb4_general_ci` => 寿司ビール
`utf8mb4_bin` => 全て区別

その他「Aa」とか「アァ」とか細かい違いについては先人のまとめを見て下さい。
参考リンク：https://qiita.com/tfunato/items/e48ad0a37b8244a788f6

## PostgreSQLでは
ハハパパも寿司ビールも起きないらしい。

## MySQL8では
MySQL8.0.1には`utf8mb4_ja_0900_as_cs`が追加され、これはハハパパ寿司ビール両方に対応しているらしい。
参考リンク：https://yoku0825.blogspot.com/2017/04/mysql-801utf8mb4ja0900ascs.html

# まとめ
データベースの文字コードと照合順序の確認は早めにしよう。