OmniAICreator/Qiita-1.07M huggingface dataset:
Mac(catalina)でflutter doctorを実行すると『✗ CocoaPods installed but not working.』と怒られる

#### 不具合内容
MacでcocoapodsをインストールしているのにCocoaPodsが動かねえぞ！と怒られてしまいました。

```
[✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.5 19F101, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
[!] Xcode - develop for iOS and macOS (Xcode 11.6)
    ✗ CocoaPods installed but not working.
        You appear to have CocoaPods installed but it is not working.
        This can happen if the version of Ruby that CocoaPods was installed with
        is different from the one being used to invoke it.
        This can usually be fixed by re-installing CocoaPods. For more info, see
        https://github.com/flutter/flutter/issues/14293.
      To re-install CocoaPods, run:
        sudo gem install cocoapods
[✓] Android Studio (version 4.0)
[!] Connected device
    ! No devices available
```

#### 解決方法
そういえばなぜかflutterコマンドがsudoが無いと実行できなかったのでsudoなしで実行できるようにしました。

```
$ sudo chown -R $USER /（flutterをインストールしているディレクトリ）
```

上記のコマンドを実行後。動かねえぞ！というエラーメッセージは消えました。

```
[✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.6 19G73, locale ja-JP)
 
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 11.6)
[✓] Android Studio (version 4.0)
[!] Connected device
    ! No devices available
```
Salesforceから送信するメール本文を動的に変更する

Salesforceからメールを送信する方法は複数ありますが、今回はメールアラートに設定できる `Visualforcメールテンプレート` を使います。

イメージ図
<center><img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33505/467daa68-b53b-54a6-2341-4e025afb1b29.png"></center>

---
メールテンプレートを作成する際は Visualforce を選択する必要があります。
こちらはコンポーネントを呼び出すだけのシンプルなものです。

```html:Visualforce&nbsp;メールテンプレートの編集
<messaging:emailTemplate subject="タイトル" relatedToType="Case">
<messaging:plainTextEmailBody >
<!-- コンポーネントの呼び出し、その際にCase.Idを引き渡す -->
<c:MailComp targetCaseId="{!relatedTo.Id}" />
</messaging:plainTextEmailBody>
</messaging:emailTemplate>
```

---
Visualforce メールテンプレートから渡された `Case.Id` をコントローラー（Apexクラス）に渡すことで、必要な情報を作成するために使います。
`rendered` を使うことで、メール内に表示するかどうかを判定しています。

```html:MailComp.component
<apex:component access="global" controller="MailCompExt">
<!-- VFテンプレートからCase.Idを取得 -->
<apex:attribute name="targetCaseId" type="Id" description="Case.Id" assignTo="{!caseId}" />
{!userName} 様

この度は{!subject}をお申し込みいただきありがとうございます。
<apex:outputText rendered="{!isToday}"><!-- レンダリングするかどうかをApexから取得 -->
いよいよ本日ですね。
</apex:outputText>
お待ちしています。
</apex:component>
```

---
コンポーネント内で動的に表示させたいテキストや、表示有無に関してはApexで管理します。

```java:MailCompExt.apex
public class MailCompExt {
    public Id caseId { get;
                       set {
                           // CaseIdを元にカスタムオブジェクトからデータを取得
                       }
                     }

    public Boolean getIsToday() {
        return true;
    }
}
```

以上。
CPU/memoryベースのHPAとVPAはなぜ併用できないのか?


KubernetesのVPA[^1]のREADMEでは、現在CPU/memoryによるHPAとVPAの併用を禁止している。これを回避するカスタムメトリクスの導入などをしていしたが、HPA/VPAの干渉理由を求められたときにパッと明確な説明ができなかったので書き起こしておく。

> Vertical Pod Autoscaler should not be used with the Horizontal Pod Autoscaler (HPA) on CPU or memory at this moment. However, you can use VPA with HPA on custom and external metrics.


## HPAはPodのResourceRequestを用いてスケール値をどう算出しているのか?

VPAのWebhookは、PodのResource Request(`.spec.template.spec.containers[].resource.requests`)をCPUとメモリの消費量に合わせて動的に書き換える。つまりVPAの有無による違いは、このResource Requestが可変だということだ。では、可変なResource RequestはHPAにどのような影響を与えるのだろうか?

```bash:HPAのスケール値の算出
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
```

HPAのスケール値の算出方法は[1](#orgad23fa9)のように、現在のレプリカ数に実測値と期待値の比を掛けたものだ。 `()` の部分の実装は指定するメトリクスオプションによって実装は異なるが、PodのResource Requestを利用するのはmetrics.typeが `Resource` かつtarget.typeが `Utilization` の場合のみだ。では、実際に`()`の部分を求めるコードを見てみる[^2]

```go:GetResourceUtilizationRatio
for podName, metric := range metrics {
  request, hasRequest := requests[podName]
  if !hasRequest {
    // we check for missing requests elsewhere, so assuming missing requests == extraneous metrics
    continue
  }

  metricsTotal += metric.Value
  requestsTotal += request
  numEntries++
}

currentUtilization = int32((metricsTotal * 100) / requestsTotal)

return float64(currentUtilization) / float64(targetUtilization), currentUtilization, metricsTotal / int64(numEntries), nil
```

このコードから、ResourceUtilizationRatioは、実測値の合計とリクエスト値の合計値の比を指定したターゲットで割ったものということが分かった。この値に現在のレプリカ数を掛けたものがスケール値となるが、コントローラが削除/追加するレプリカのResource Requestがこの平均値から外れていると期待した状態にならない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26683/31aac603-390e-0780-1b4b-0f8fc60173fa.png)

具体例を考えてみる。VPAのPodのResource Requestの更新方法もいくつかあるが、Creation方式にするとdesiredMetricvalueがPodによって変わってしまう。それ以外の場合でも、現在の値と次に作成される値が変わるので、予期するリソースを確保できない(or 確保しすぎる)パターンがある。


## 結論

CPU/memoryのUtilizationによるHPAでは、メトリクス実装値とResource Requestの割合からスケール値を計算してPodの追加や削除を行う。しかし、VPAによってスケール対象のDeployement(をOwnerに持つ)PodのResource Request値が変動すると、外れ値を持ったPodが操作されたときなどに予期したリソース量が確保できない。そのため、現在では併用を禁止しているのだと思う。

> つまり、カスタムメトリクスなどを使っていたとしても、CPU/memoryをメトリクスとして同じように計算していると同じ問題を引く。なのでアプリケーションのタイプにもよるが、基本に則ってCPU/memoryでVPAしてRPSやp95latencyでHPAをやっている。

[^1]: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
[^2]: https://github.com/kubernetes/kubernetes/blob/cdbd07f64e2f1392fc9b3c68a6c1e06ee22d6449/pkg/controller/podautoscaler/metrics/utilization.go
MacOS Catalinaはデフォルトのログインシェルがbashではないみたい。。

# はじめに

最近nodeのバージョンを複数管理するためにnodebrewを使いはじめました。
そこで.bash_profileにPATHを指定したのですが、ターミナルを開いた際に毎回

`source ~/.bash_profile`

を実行しないと読み込んでくれませんでした。
その際の解決方法を紹介していきます。

# 今回の事象の原因
なぜ.bash_profileを読み込んでくれないのか調べてみると、
どうやらMacOS Cataliaからデフォルトログインシェルが「bash」から「zsh」に変更されたみたいです。
なので毎回ログイン時にzshを読み込んでいました。
それが原因で今回の事象が発生していました。

環境構築系の記事では.bash_profileに書き込む方法が多いのでもしかしたらこの事象に悩む人も多いかもしれません。

現状の設定を確認してみましょう。

`echo $SHELL`


こちらのコマンドでデフォルトのログインシェルの設定状況を確認できます。
結果は以下のようになっているはずです。

`/bin/zsh`

この設定になっているので.bash_profileに書き込んでも当然読み込まれません。

# 解決方法
それでは解決方法について解説します。
解決方法は大きく分けて以下の2つがあります。

①zsh用の設定ファイルに書き込む
②読み込み先をbashに切り替える

しかし、②デフォルトの読み込み先を変更する方法はあまり良くなさそうなので省略します。

①の方法について紹介します。

パスを通すだけであれば、基本的に設定ファイル名称を変更すれば済みます。
今まで".bash_profile"を指定していた箇所をzsh用の".zprofile"に置き換えるのみです。

以下のコマンドを実行します。
`echo export PATH='/usr/local/bin:$PATH' >> ~/.zprofile`
`vim .zprofile`　←ここに書き込む

もし、既に".bash_profile"にパスを設定している場合は、ファイルコピーでOKです。
`cp .bash_profile .zprofile`

以上で設定完了です。

一度ターミナルを再起動して読み込みができていればOKです。
PUGの書き方

#PUGの書き方基礎
https://pughtml.com/ で確認しながら書くと良さそう。
https://pugjs.org/ ←本家サイト

基本的にスペースの有無には敏感な書式なので、例でスペースを入れていないところに入れたりする場合は注意すること。

##最初の単語がタグになる
PUG 

```
p
```
=>HTML

```
<p></p>
```

##2番目以降の単語はそのタグの中の内容
PUG

```
p contents
```
=>HTML

```
<p>contents</p>
```

##タグの入れ子はインデントで表現
PUG

```
div
  p test
```
=>HTML

```
<div><p>test</p></div>
```

##属性はタグ名の直後の()の中に書く
PUG

```
a(href="link.html") link
```
=>HTML 

```
<a href="link.html">link</a>
```

###クラス名はタグ名の後に、「.」をつけて書く。
PUG

```
p.test
```
=>HTML

```
<p class="test"></p>
```

###ID名はタグ名の後に、「#」をつけて書く。
PUG

```
p#test01
```
=>HTML

```
<p id="test01"></p>
```

####タグ名を省略してクラス名やID名から始めた場合はdivタグになる
PUG

```
.test
```
=>HTML

```
<div class="test"></div>
```

##複数行の内容を書きたい場合
タグの直後「.」で終わらせ、次の行にインデントを下げて書く

PUG

```
script(type='text/javascript').
      let a = "javascript";
      let b = "java";
```
=>HTML

```
<script type="text/javascript">
    let a = "javascript";
    let b = "java";
</script>
```
##Node.jsから渡された変数を呼び出すとき
例えば　```<p>変数の値</p>```　というHTMLを出力したいとき、
###変数の値をエスケープ処理する場合
####p #{変数名}もしくはp= 変数名
例：```let var1 = "test"```なら、

PUG

```
p #{var1}
p= var1
```
=>HTML

```
<p>test</p>
```
とする。  p=の「=」の前にスペースを入れてはダメ。
###変数の値をエスケープ処理しない場合
####p !{変数名}
  例：```let var1 = '<a href="link.html">test</a>'```なら、
PUG

```
p !{var1}
```
=>HTML

```
<p><a href="link.html">test</a></p>
```

###プロパティで変数を使う
例えば```let classname='aaa'```ならば、
PUG

```
div(class=classname)
div(class=`${classname}`)
```
=>HTML

```
<div class="aaa"></div>
```

##普通の装飾なしの文字列を他のタグなどと一緒に一行で出力したい場合
  例えば```<p>befor <span class="test">spanタグ</span> after</p>```と出力したい場合。
###1．そのまま書く　HTMLタグを混ぜて良ければ
    ```p befor <span class="test">spanタグ</span> after```
###2．#[]を使う　意地でもHTMLを書かないならば
    ```p befor #[span.test spanタグ] after```
###3．「|」を使う　変数と組み合わせるならこの方法？
```
    p befor 
      span.test spanタグ
      | after
```

##参考サイト
https://www.tam-tam.co.jp/tipsnote/html_css/post12789.html

##Next Step
forやif文など　https://docs.qranoko.jp/static/pug.html#example
CloudCompare におけるPCDファイルのカスタムフィールド

# 困った
CloudCompare でPCD形式の点群ファイルを読み込んで可視化し確認していた時のこと。点群にはxyz座標・RGBチャネルに加えてクラスタを識別するカスタムフィールド`label`（4byte unsigned int）が記録されている。PCDファイルはPCLライブラリを用いて`pcl::PointXYZRGBL`型で出力したもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440643/893df162-b6e8-6297-d870-86938dc7c85c.png)

`Property->Colors->Scalar field`と設定して、当然こんな感じで表示されるのを期待していたが…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440643/72a7f50e-6175-85e2-0fbb-d5d19ee9e25f.png)

実際に表示される画面は真っ青！`label`の値が0に張り付いてる！？

## 環境

- PCL 1.9.1 x64
- CloudCompare v2.10.2 Stereo 64bit

# 原因

CloudCompare は符号なし整数型のカスタムフィールドをPCD形式で読んでくれない模様。試した限りで正しい値で読み出せたのは、

- 浮動小数型
- 符号あり整数型

加えて、CloudCompare で点群をPCD形式で出力すると、カスタムフィールドは浮動小数（4byte float）に強制的に変更される。現バージョンでは出力時に値の型を選択するなどのオプションも無い。

# 対処方法

一番簡単なのは、符号あり整数型として CloudCompare に読んでもらうこと。`0 ~ 2^31-1`の範囲の値なら符号あり・なしでも32bitのビット列は同値なので、バイナリ型でもデータの中身を弄る必要はない。PCDファイルのヘッダを少し変更すればよい。`label`に対する型`TYPE`の情報を**U -> I**に書き換える。

- **U**nsigned Int
- **I**nt (signed)

```diff:*.pcd
  # .PCD v0.7 - Point Cloud Data 
  file format
  VERSION 0.7
  FIELDS x y z rgba label
  SIZE 4 4 4 4 4
- TYPE F F F U U
+ TYPE F F F U I
  COUNT 1 1 1 1 1
  WIDTH 1858475
  HEIGHT 1
  VIEWPOINT 0 0 0 1 0 0 0
  POINTS 1858475
  DATA binary
  ...binary data is written here...
```

毎回この作業をするのも面倒なので`signed int`型の`pcl::PointXYZRGBL`なんて代物を用意しておけば便利そうですね。
chromeでERR_CERT_INVALIDが出た時の解決方法

# ERR_CERT_AUTHORITY_INVALIDが表示され、詳細というリンクをクリックして、アクセスできるケース

1. 赤枠で囲まれた詳細設定をクリック
![スクリーンショット 2020-07-30 11.32.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115974/8a34b9d2-efeb-b3f0-8ad7-924a7c9d938a.png)

2. 赤枠で囲まれた「xxxxxx.xxx.xxにアクセスする（安全ではありません）」をクリック
![スクリーンショット 2020-07-30 11.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115974/d6f3b48e-4846-43b7-8462-f809b0593e45.png)



# ERR_CERT_INVALIDが表示され、詳細というリンクをクリックして、アクセスできないケース
※ いつも対応方法を忘れるので記事にしました。
新しいmacに移行した際、vagrantでオレオレ証明書を利用しているときに発生しました。

1. 赤枠で囲まれた詳細設定をクリック
![スクリーンショット 2020-07-30 18.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115974/0d3a36c7-19d1-92ca-953a-f435725b80e4.png)
2. 上述では、「xxxxxx.xxx.xxにアクセスする（安全ではありません）」がありましたが、ないケースが発生
![スクリーンショット 2020-07-30 18.46.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115974/7b0a15c1-202a-3b5e-bde5-8ab995109020.png)

3. 以下のテキストを打つ

```
thisisunsafe
```

参照
https://dev.classmethod.jp/articles/neterr_cert_invalid-using-chrome/
[rails]Controllerを作成しよう

#Controllerを作成する
コントローラでは、ユーザーのリクエストを受けてModelと連携したり、
どの画面（View）を表示するかを制御しています。
ユーザーがURLにアクセスしたときに、リクエストを最初に受け取るのがコントローラです。
受け取ったリクエストを元にして、Modelからのデータを、対応するViewに渡して画面を表示させます。

具体的には、以下のような制御を行っています。

Modelとやり取りする
Viewに渡すインスタンス変数を定義する
表示するViewファイルを指定する

controllerを作成するのは以下を実行するだけです。
gはgenerateの略称です。

```
$ rails g controller コントローラ名
```

ただ、一つだけ注意があります。
コントローラー名は複数形になります。こんな感じです。

```
$ rails g controller homes
```

成功するとこんな感じになります。

```
[vagrant@localhost sample_app]$ rails g controller homes
Running via Spring preloader in process 29768
      create  app/controllers/homes_controller.rb
      invoke  erb
      create    app/views/homes
      invoke  test_unit
      create    test/controllers/homes_controller_test.rb
      invoke  helper
      create    app/helpers/homes_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/homes.coffee
      invoke    scss
      create      app/assets/stylesheets/homes.scss
```

#間違えてControllerを作成してしまったら？
コントローラー名などを間違えて作成した場合は、以下のコマンドで消しましょう。

勘の良い人はわかるかもしれませんが、
dはdestroyを意味します。

```
[vagrant@localhost sample_app]$ rails d controller homes
```
docker-compose run とか打ち込むのめちゃくちゃめんどくさいなと思ってる人へ。

dockerとRailsで環境構築しているのですが、いちいち
```docker-compose run app rails g controller ....```
とか打つのめんどくさいですよね？
エイリアスを設定すればこの問題を解決できます！

#エイリアスとは？
元々エイリアスというのは偽物とか、別名などの意味を持つ英単語です。

エイリアスを設定するということは、コマンドに別名を設定することができるということです。例えば

```docker-compose run```を略して```dcr```とかに設定できます。

#設定方法
##1．ホームディレクトリに```.bashrc```というファイルを作る。
.bashrcというのはbashを起動したときに読み込まれる設定ファイルのことです。

##2．.bashrcにエイリアスを定義する
.bashrcに以下のように記述していきます。
（以下は僕が使っている設定です。）

```
#dockerのエイリアス
alias d='docker'
alias dc='docker-compose'
alias dcb='docker-compose build'
alias dcps='docker-compose ps'
alias dcud='docker-compose up -d'
alias dcex='docker-compose exec'
alias dcd='docker-compose down'
alias dcl='docker-compose logs'

#Gitのエイリアス
alias gb='git branch'
alias gc='git checkout'
alias gcb='git checkout -b'
alias gs='git status'
alias gco='git commit'
alias gp='git push'
alias ga='git add'
alias gl='git log'
alias gcd='git checkout development'
alias gpod='git pull origin development'
alias gmd='git merge origin development'
alias git delete-merged-branch='!f () { git checkout $1; git branch --merged|egrep -v '\*|develop|master'|xargs git branch -d; };'
```

##3．.bash_profileに.bashrcを読み込ませる

.bash_profileというのはログインシェルがbashの状態でログインしたときに読み込まれる設定ファイルのことです。
.bash_profileの一番下に以下のように記述して設定を読み込ませます。

```
source ~/.bashrc
```

その後、ターミナルで```source ~/.bashrc```を実行し、ターミナルを再起動してください。

以上で設定は完了になります。実際に設定できているかターミナルで確認してみましょう。

#最後までよんでいただきありがとうございます。
もし何か誤植等ありましたら、ご指摘いただけますと幸いです。よろしくお願い致します。
【Python】リストや文字列から数字のみ抽出する | 正規表現, Regex使用

Pythonで、スクレイピングなどで抽出したデータ（リストや文字列）から数字のみ抽出(正規表現)する方法をメモしておきます。正規表現のモジュールにはregexを使用しますので、regexをインストールしていない方はインストールしてください。

## 目的

スクレイピングで抽出したデータから、数字のみを抽出する

## 実装

**正規表現**を使って、数字のみ抽出

reモジュールを使用します。ターミナルから以下のコマンドを実行して、regexをインストールしましょう。

```console
$ pip install regex
# または
$ pip3 install regex
```

その次に、sample.pyに**reモジュールをインポート**


```sample.py
import re
```

これでreモジュールを使う準備ができました。

### 文字列から数字のみ抽出

```sample.py
import re

dt = "regnkrnfskrngkaer  gksgnkq laergnnktga3r erfkl 登録者数 400人aelrkna erglknnarg"
num = re.sub("\\D", "", dt)
print(num)

# 出力結果
# 400
```

### リストから数字のみ抽出

```sample.py
import re

dt = ['regnkrnfskrngkaer', 'gksgnkq', 'laergnnktgar', 'erfkl', '登録者数 400人', 'aelrkna erglknnarg']
dt_str = ",".join(dt)
dt_num = re.sub("\\D", "", dt_str)
print(dt_num)

# 出力結果
# 400
```

### 文字列と数字が混じったリストから特定の数字のみ抽出

#### 失敗例

```sample.py
import re

dt = ['regr111kaer', 'gg443nkq', 'laen56nktgar', 'er39fkl', '登録者数 400人', 'ael09narg']
dt_str = ",".join(dt)
dt_num = re.sub("\\D", "", dt_str)
print(dt_num)

# 出力結果
# 111443563940009
```

#### 成功例

```sample.py
import re

dt = ['regr111kaer', 'gg443nkq', 'laen56nktgar', 'er39fkl', '登録者数 400人', 'ael09narg']
dt_pop = (dt.pop(4))
dt_num = re.sub("\\D", "", dt_pop)
print(dt_num)

# 出力結果
# 400
```

参考
https://qiita.com/ikanamazu/items/ba2a32a1a5924f3bd8e9
https://niwakomablog.com/python-number-extract/#:~:text=%E3%80%8Cr%E2%80%9D%5CD%E2%80%9D%E3%80%8D,%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
https://qiita.com/sakamossan/items/161db7418ade037f6f3d
ubuntu20.04にリモートデスクトップ接続

# はじめに

Ubuntu20.04にリモートデスクトップ接続するための手順です。

# 手順
## xrdpのインストール

下記コマンドでxrdpをインストールします。

```console
$ sudo apt install xrdp
```

これでリモートデスクトップ接続できます。

## linux-vm-toolsのインストール

xrdpだけでリモートデスクトップ接続できるのですが、左側にDockが表示されないなど、少し気持ち悪い状態でした。これはlinux-vm-toolsをインストールすることで解決するらしいです。[第621回　Ubuntu 20.04 LTSでxrdpを使用する](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0621)

[GitHub - microsoft/linux-vm-tools](https://github.com/microsoft/linux-vm-tools/pull/106#issuecomment-641502536)の手順に従ってインストールしました。

```console
$ sudo apt install git
$ git clone https://github.com/microsoft/linux-vm-tools.git
$ cd linux-vm-tools
$ git fetch --all
$ git pull origin pull/106/head:pull_106
$ git checkout pull_106
$ cd ubuntu/20.04/
$ sudo bash ./install.sh
```

あまり意味はなかった気がしますが、手順に従い、再起動後に再度シェルを実行しました。

```console
$ sudo bash ./install.sh
```

再び再起動しました。

この状態では、xrdpデーモンがエラー(`trans_listen_address failed`)を吐いていましたので、下記の通り`xrdp.ini`を書き換えました。

```:/etc/xrdp/xrdp.ini(変更前)
port=vsock://-1:3389
```

```:/etc/xrdp/xrdp.ini(変更後)
port=3389
```

xrdpデーモンを起動しました。

```console
$ sudo systemctl start xrdp
```

# その他
## ルートユーザでGUIを起動する

ルートユーザでGUIを起動する際は、ルートユーザに起動中のX Serverへのアクセス権を付与する必要がありました。そのまま実行するとエラー(`Cannot open display`)が表示されました。[Cannot open display #787](https://github.com/neutrinolabs/xrdp/issues/787)

```console
$ xhost +SI:localuser:root
```
【Solidity】コメントの書き方（natspec）

Solidityでのコメントはnatspecと呼ばれるフォーマットを用いることがスタンダードとなっている。

なかなか覚えられないので、備忘録としてコメントの書き方を記載しておきます。

```Solidity
/// @title コントラクトのタイトル
/// @author 作成者の名前
/// @notice このコントラクトの説明（どのような処理を行うかなど）
/// @dev このコントラクトの開発者向けの更なる詳細な説明
contract Calculate {
  /// @author 作成者の名前
  /// @notice この関数の説明
  /// @param パラメータの説明（パラメータ数分記載する）
  /// @return 戻り値の説明
  /// @dev この関数の開発者向けの更なる詳細な説明
  function add(uint x, uint y) returns (uint z) {
    z = x + y;
  }
}
```

全てのコントラクト、関数にこれらのタグを記載しなければならないというわけではない。
しかし、保守性を考えると@devだけは書いておきたい。

# 参考
https://solidity.readthedocs.io/en/v0.5.10/natspec-format.html
[rails]MVC（Model View Controller）を理解しよう

#MVC（Model View Controller）とは？
railsはMVCという考え方で構成されています。
全てのコードを同じ場所に書いてしまうと、コードが複雑になるため、
railsでは、保守性を維持するために、Model、View、Controllerの3つの処理パターンに分けて管理しています。

###model 
データを扱う部分です。
データベースに対して、データの登録や取得、更新、削除などの処理を行います。

###view
PCの画面に関わる部分です。
HTMLを読み込み、ブラウザに表示させるためのものです。

###controller
modelとviewの中間に位置します。
ユーザーからのリクエストを受けて、Modelと連携したり、どの画面（View）を表示するのかといったことを制御します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681053/9ffd80e8-a86c-8a2f-8d8d-6573020739eb.png)
【Qiita】user_creating_public_draft_items_countは10以下の値にしてください

# Qiitaに突然投稿ができなくなった
タイトルのエラーで突然投稿できなくなり、下書きにも保存ができなくなってしまった。

# 解決策
自分の場合、タグが問題だったようで

1. タグを削除して下書きに保存
2. 本文を入力して下書きに保存
3. 本文入力後、タグを追加

上記で入力も投稿もできるようになりました。

エラーメッセージをみる限り予期せぬエラーのエラーハンドリングがうまくできていなかったぽい

根本の原因はわからないので、いったん自分が解決した手順を共有です。
(基礎 1-1)UnityでのC# のお作法 ~Input~

入力値のコードとしてinput



```cs:sample1.cs
Input.GetAxis("Horizontal");
```
上記は -1 ~ 1 nの間の不動小数点で入力値が取得できる
(Horizontalなので左右の水平方向の数値)



```cs:sample2.cs
Input.GetAxisRaw("Vertical");
```
上記の記入方法だと-1または1のせい数値のみが取得できる値となる
(こちらはVerticalなので上下の垂直方向の数値)


※初めての投稿なのでこんな感じでまずはやってみました
Docker インストール手順

# はじめに
Dockerをインストールしたので手順を記録します。

本記事ではHomebrewとGUIを使います。
また、Dockerの概念等については詳しく書かれている良記事がたくさんありますので割愛します。


## 環境
- macOS Mojave 10.14.6

# やったこと

## ターミナルから実行

### brewでインストール

```
$ brew install docker
$ brew cask install docker 

$ docker --version
Docker version 19.03.12, build 48a6621
```

caskとは、GUIをインストールするHomebrewの拡張機能です。
> 参考：[homebrew-caskとは](https://qiita.com/swallowtail62/items/61244ea3c7d00f692823)


### アプリケーションを起動 

```
open /Applications/Docker.app 
```

ダイアログが表示されます。
![スクリーンショット 2020-07-30 17.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/a161c81d-3e57-0042-09f2-fc01a18d39a7.png)

 
## GUIで設定する

ターミナルつきのダイアログが出てきます。
青いボタンをクリックすると、ボタン内に記述されているコマンドがターミナルで実行される仕様です。

`git clone https://github.com/docker/getting-started.git`
実行が終わったら「Next Step」で進みます。
![スクリーンショット 2020-07-30 17.05.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/9b2d59f2-32f2-53d8-a14b-701b5da638ae.png)

- クローンしたリポジトリに移動
- Dockerイメージを作成 `docker build -t ｛イメージ名｝ `
![スクリーンショット 2020-07-30 17.16.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/e7c4da77-7d92-f02c-02a9-237c4adedc26.png)

起動
![スクリーンショット 2020-07-30 17.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/e7426917-0657-2d11-e0a9-6b15304fb9ec.png)

ここでサインインが必要になります。
まだアカウントを持っていない人はDockerのページで作成してください。
![スクリーンショット 2020-07-30 17.22.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/5ad418fb-7dd8-300e-60cb-41cd049cb796.png)

OPEN IN BROWSERをクリックすると
![スクリーンショット 2020-07-30 17.29.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/6f018ee0-fa94-8362-4f6e-25d20837017f.png)

localhostでチュートリアルが立ち上がります。すごい。。
![スクリーンショット 2020-07-30 17.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395809/51491ff7-6252-0bf2-64a6-b8a533f2e231.png)

ここからはそれぞれ必要なイメージを追加していくことになるので
それはまた別の記事にまとめられたらと思います。


# さいごに

こちらの記事に大変助けられました。
[DockerをHomebrewでMac OSに導入する方法](https://qiita.com/nemui_/items/ed753f6b2eb9960845f7)
[rails]アプリケーション作成

#rails newで作成
railsで新規アプリケーションを作成するのは簡単です。
rails newコマンドだけで作成できてしまいます。

```
$ rails new アプリケーション名
```

#もしアプリケーション名を間違えたら？
アプリケーション名を間違えて作成してしまっても安心です。
このコマンドでアプリケーションを消してしまいましょう。

```
$ rm -rf アプリケーション名
```

rmはremoveの略称です。
-rf remove recursively forceの略）はコマンドオプションの1つで、「フォルダ内のすべてのファイルとフォルダを削除する」を意味します。

#作成したアプリケーションを確認
rails newコマンドでアプリケーションの作成が完了すると以下のような画面が出ます。
この画面が出たら、成功です。

```
[vagrant@localhost sample_app]$ rails new sample_app
      create  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
      create  Gemfile
        run  git init from "."
Initialized empty Git repository in /home/ec2-user/environment/sample_app/.git/
      create  package.json
      create  app
      create  app/assets/config/manifest.js
      create  app/assets/javascripts/application.js
      create  app/assets/javascripts/cable.js
      create  app/assets/stylesheets/application.css
      create  app/channels/application_cable/channel.rb
      create  app/channels/application_cable/connection.rb
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/jobs/application_job.rb
      create  app/mailers/application_mailer.rb
      create  app/models/application_record.rb
      create  app/views/layouts/application.html.erb
      create  app/views/layouts/mailer.html.erb
      create  app/views/layouts/mailer.text.erb
```
【Solidity】libraryの使い方

定義の仕方がコントラクトと似ているライブラリですが、用途はもちろん異なります。
ライブラリは指定したデータ型に対して、ライブラリで定義したメソッドを追加することができます。

# ライブラリの定義
まずはライブラリの定義から。

```Solidity
library SafeMath {

  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}
```
上記はOpenZeppelinのSafeMathというライブラリの一部を抜粋したものです。
第一引数と第二引数の乗算と加算を行うメソッドを定義しています。

# ライブラリの使用方法
このライブラリの使用方法は以下になります。

```Solidity
using SafeMath for uint256

uint256 a = 3;
uint256 b = a.add(6); // bには9(3+6)が格納される
uint256 c = b.mul(7); // cには63(9×7)が格納される
```
まず、usingを使用してデータ型uint256に対して、SafeMathライブラリの全メソッドを使用可能にしています。

その後、addメソッドを使用して足し算を行っています。
ライブラリではaddメソッドは２つ引数が必要ですが、ここではは１つしか渡してませんね。
これは、aの値（3）が自動的に第一引数に渡されるためです。
第一引数(3)に第二引数(6)が足されるため、変数bには9が格納されます。

addメソッドの後は、mulメソッドを使用して掛け算を行っています。
引数に１つしか渡していないのはaddと同じです。
第一引数(9)に第二引数(7)を掛けて、cには63が格納されます。

# まとめ
共通で使用するメソッドはライブラリとして定義しておいて、データ型に追加してあげれば、コードが簡素化され、冗長もなくせるので見やすくなりますね。
【RaspberryPi】機械学習

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました


[カラー図解　Ｒａｓｐｂｅｒｒｙ　Ｐｉではじめる機械学習　基礎からディープラーニングまで ](https://www.amazon.co.jp/%E3%82%AB%E3%83%A9%E3%83%BC%E5%9B%B3%E8%A7%A3-%EF%BC%B2%EF%BD%81%EF%BD%93%EF%BD%90%EF%BD%82%EF%BD%85%EF%BD%92%EF%BD%92%EF%BD%99-%EF%BC%B0%EF%BD%89%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%BE%E3%81%A7-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E9%87%91%E4%B8%B8%E9%9A%86%E5%BF%97-ebook/dp/B07B7JFKL2)

この書籍では2045年のシンギュラリティやAIにより人の仕事が奪われるのではないかという意見に対して回答するには、正しい知識が必要であると述べています。

#アヤメの分類
この書籍では「1つの特徴量を用いた2つのクラスへのアヤメの分類」と「2つの特徴量を用いた2つのクラスへのアヤメの分類」を行っています。
これは機械学習では暑中取り上げられる課題だそうです。

具体的には長さで決めていきますが、その長さを決めるのに機械学習を使います。

また、様々な次元空間の見方をし、適切な特徴量を選択しないと分類は難しくなる。


##次元の呪い
特徴量を増やせば分類が簡単になるわけではない。
特徴量が増えるほど、つまり、次元が増えるほど、必要なデータは増え、学習が困難になる。

ディープラーニングは次元の呪いを比較的受けにくい。

##機械学習の種類
###教師あり学習
予め正解が与えられている課題
####回帰
近似線や近似曲線


###教師あり学習
正解が与えられていない課題

###報酬あり学習(強化学習)
これは正解を与えるのではなく、今の行動が良かったら報酬を与えることにし、報酬を増やす動きをさせる学習

#参考
[カラー図解　Ｒａｓｐｂｅｒｒｙ　Ｐｉではじめる機械学習　基礎からディープラーニングまで ](https://www.amazon.co.jp/%E3%82%AB%E3%83%A9%E3%83%BC%E5%9B%B3%E8%A7%A3-%EF%BC%B2%EF%BD%81%EF%BD%93%EF%BD%90%EF%BD%82%EF%BD%85%EF%BD%92%EF%BD%92%EF%BD%99-%EF%BC%B0%EF%BD%89%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%BE%E3%81%A7-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E9%87%91%E4%B8%B8%E9%9A%86%E5%BF%97-ebook/dp/B07B7JFKL2)
さくっとVue3をCodePenで試したい

[さくっとVue3をWebブラウザで試したい時に使えるTips](https://qiita.com/ryo2132/items/eab9d7d6da5c60f4c913)を見て、Qiitaとかteratailとかに実行可能なコード貼り付けたいなと思って試してみた。

# 設定

CodePenの `settings` で設定画面から、JSを選んで、`https://unpkg.com/vue@next`を追加します。
![スクリーンショット 2020-07-30 17.10.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310093/f1d15723-3f6f-6e8f-1a7f-b8da783ee122.png)

次に、HTMLにターゲットを用意します。

```html
<!DOCUTYPE html>
<html>
  <body>
    <div id="vue-app" />
  </body>
<html>
```

更にさくっとやりたいときはpugを指定して

```pug
#vue-app
```
お行儀はよくないかもしれませんが、動作しました。

# ｊｓ

あとは元ネタと同様にVueのコードを書いていきます。
CodePenに書いたサンプルはこちらになります。
https://codepen.io/iwamoto-takaaki/pen/vYLqWar
pipenvでpytorch@python3.8環境構築

### pipenvとは

* プロジェクト毎に、パッケージ管理、仮想環境の構築を行ってくれるツールです。
* 集団で開発する際に、環境を簡単に固定できるので、とても便利ですね。

### pytorchとは

* Python向けのオープンソース深層学習ライブラリで、Facebookの人工知能研究グループにより初期開発されました。
* 最近では、日本発祥の深層学習ライブラリのchainerの開発が併合されたことで話題になりましたね。

### 今回のゴール
* 今回は、python3.8+pytorchの環境をpipenvで構築して、実行確認することを目指します。
* インポートできる程度の確認を行います。runtimeな確認は今回はしません。

### 実行環境
* OS: windows10 Pro
* python: 3.8
* pipenv:  2020.6.2

### pipenvのinstall

```terminal
$ pip install pipenv
```

### python3.8で初期化

```terminal
$ pipenv --python 3.8
```

### pytorch準備
実行に必要なライブラリは「torch」、「torchvision」。これらをインストールします。

```terminal
$ pipenv install torch torchvision
```

これやると、十中八九エラーになります。多分バージョンの整合が取れないパッケージをインストールしに行くからでしょうか。
パッケージのバージョンを、pythonのバージョン含めて指定する必要があるので、直接[パッケージダウンロードサイト](https://download.pytorch.org/whl/torch_stable.html)から持ってくることにします。

以下のリンクを右クリック⇒リンクアドレスをコピー
[cu102/torch-1.6.0-cp38-cp38-win_amd64.whl](https://download.pytorch.org/whl/cu102/torch-1.6.0-cp38-cp38-win_amd64.whl)
[cu102/torchvision-0.7.0-cp38-cp38-win_amd64.whl](https://download.pytorch.org/whl/cu102/torchvision-0.7.0-cp38-cp38-win_amd64.whl)

再度インストール。今度はURLから直接インストールします。

```terminal
pipenv install https://download.pytorch.org/whl/cu102/torch-1.6.0-cp38-cp38-win_amd64.whl https://download.pytorch.org/whl/cu102/torchvision-0.7.0-cp38-cp38-win_amd64.whl
```
メッサ時間かかるので待ちます。。。エラーなく完了したら、以下を実行します。

```terminal
$ pipenv run python -c "import torch; import torchvision; print(torch.__version__); print(torchvision.__version__)"  
1.6.0
0.7.0
```
上記のようにバージョン出力されているので、インストールできました。
GoogleAppEngineクイックスタート③ CloudMemorystore編

# 概要

* [前回記事](https://qiita.com/ezaqiita/private/7433e39912dbd05e9d1f)の続き
* AppEngineからCloudMemoryStore(memcached)に接続する

# Cloud Memorystore for Memcached

* インスタンスを作成

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/e9a505a0-891a-fc1d-14da-bb55f0d5268c.png">

* ノードあたりのメモリは変更不可なので慎重に決める

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/882be723-1bb0-19d8-4c81-1ebaa31a8b72.png">

* VPCを選択

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/aef36a9d-d029-2e0a-b703-baaae19b7738.png">

# ファイアウォール

* memcached用ファイアウォールルールを作成

## 設定

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/c68c2a45-5e8d-0f2e-b25c-04ff907ba6ff.png">

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/9a09b61f-60ba-75f5-210a-f4c9b1c765de.png">


# Compute Engine

## 設定

* 先程作成したmemcached用ファイアウォールルールをGCEインスタンスに設定

<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/72fafac8-b0cc-9938-de5a-29e5085b893c.png">

* telnetコマンドをインストール

```
$ sudo apt-get install inetutils-telnet
```

## 確認

* GCEインスタンスからコマンドラインで疎通確認

```
$  telnet <memcache_ip> 11211
:
> set test-key 0 0 8
> ezaqiita
STORED

> get test-key
VALUE test-key 0 8
ezaqiita
END

quit
```

* 補足:入力値について
 * 1つ目の値：データ圧縮　0:非圧縮，1:圧縮
 * 2つ目の値：データ保持期間 0は有効期限無
 * 3つ目の値：データバイト数　上記は8バイトのデータ

memcache詳細については[以前の記事](https://qiita.com/ezaqiita/items/e8c077c8a68af90f18ec)を参考

# AppEngine

## 設定

* 接続確認用コードをindex.phpに追記

```index.php
    :
    # 以下をindex.phpに追記
    $memcache = new Memcached();
    $memcache->addServer('<memcached server private ip>', 11211);
    $data = 'memcached for abc';
    $memcache->set('key', $data, 1000);
    echo $get_data = $memcache->get('key');
    echo '<br>';
```

* php用memcacheライブラリを設定

```php.ini
$ vi /<deploy_dir>/php.ini
extension=memcached.so
```

## 確認

* デプロイ

```
$ gcloud app deploy
$ gcloud app browse -s production-service
```

* ブラウザで疎通確認

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57350/d7e6381c-a83e-daac-47a9-333a6f839546.png">

# APCu

* PHP専用キャッシュAPCuを使用したい場合は[以前の記事](https://qiita.com/ezaqiita/items/c1978b1cead6165a2485)を参考


[次の記事：GoogleAppEngineクイックスタート④パフォーマンスチューニング編](https://qiita.com/ezaqiita/items/4d9e4726d3b99177f5ae)
Realmに新しくモデル(スキーマ)を追加するときに注意することと解決方法

# 初めに
今回はタイトル通りモデルを新しく追加した時、ただモデル追加するだけではエラーになってしまうのでその解決方法を記事にします。
## 追加時の注意点
新しくモデルを追加するとアプリが```has been added., Error Code=10```のエラーで100％落ちます。
これを解決する時には何点か方法はあります。
1.アプリを削除し、再度立ち上げる
2.インメモリで実行する(FileとしてDBを残さない)
3.マイグレーション処理をする

それではそれぞれお話しをします。
1.はまだアプリリリースされていない物なのであればこの対応でいいと思います。
2.永続化しないところがメリットしか言えない
3.アプリリリースされているもので尚且つ、SQLiteみたいに使いたいのであれば、これが無難です。

ということで今回は**マイグレーションを実行してエラーを回避します。**
## 実装準備
### モデル追加
先ず以下のようなモデルがすでにアプリ内に組み込まれています。


```swift:testDb.swift
import Foundation
import RealmSwift

class testDb: Object {
    @objc dynamic var id: Int = 0
    @objc dynamic var name: String = ""
    @objc dynamic var age: Int = 0
}
```

```@objc dynamic var gender: String = "" ```を追加しました。
これで下準備完了です。

```swift:testDb.swift
import Foundation
import RealmSwift

class testDb: Object {
    @objc dynamic var id: Int = 0
    @objc dynamic var name: String = ""
    @objc dynamic var age: Int = 0
    @objc dynamic var gender: String = ""
}
```

## 実装
さて本題です。
```AppDelegate```に以下を追加してください。
以下を記述してアプリを立ち上げることで勝手にマイグレーションが走り、勝手に自動アップデートしてくれます。
この処理を走らせてさらにスキーマを追加した場合は```let version:UInt64 = 1```の初期値を２に変更してください。**要するにスキーマ追加したらバージョンどんどん上げてください。**

```swift:AppDelegate.swift
import RealmSwift

//スキーマバージョン(新しくスキーマを追加したらこのバージョンを上げて)
let version:UInt64 = 1
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        //realmのマイグレーション
        let config = Realm.Configuration(
          // スキーマバージョン設定
          schemaVersion: version,

          // 実際のマイグレーション処理　古いスキーマバージョンのRealmを開こうとすると自動的にマイグレーションが実行
          migrationBlock: { migration, oldSchemaVersion in
            // 初めてのマイグレーションの場合、oldSchemaVersionは0
            if (oldSchemaVersion < version) {
              // 変更点を自動的に認識しスキーマをアップデートする（ここで勝手にするから何も書かない）
            }
          })

        // デフォルトRealmに新しい設定適用
        Realm.Configuration.defaultConfiguration = config

        // Realmを開こうとしたときスキーマバージョンが異なれば、自動的にマイグレーションが実行
        let realm = try! Realm()
        
        return true
    }
```

#終わり
今回はRealmのモデル追加の際の解決方法を展開しました。
Realmはめちゃくちゃ使いやすくまた、Firebaseなどと連携してDBの管理もできる為こういう情報が覚えておいて損はないと思います。
少しても皆様のお役に立てれば幸いです。
ThinkPad T495 で, Ubuntu 20.04 上から finger print を利用する

主題の設定を行います

# firmware の確認
下記のコマンドを実行し, fingerprint reader のバージョンを確認します

```
fwupdmgr get-devices
```

[![Image from Gyazo](https://i.gyazo.com/c7019cdb3a3c0c7f8a7f943dbd937662.png)](https://gyazo.com/c7019cdb3a3c0c7f8a7f943dbd937662)

# firmware のアップデート
バージョンが古い場合はアップデートを行います

```
fwupdmgr get-updates
```

[![Image from Gyazo](https://i.gyazo.com/0f9aee97196a52454e8bb03370ccb1ec.png)](https://gyazo.com/0f9aee97196a52454e8bb03370ccb1ec)


```
fwupdmgr update
```

[![Image from Gyazo](https://i.gyazo.com/6880e2fd38cb01ad84f4b545b5a4458e.png)](https://gyazo.com/6880e2fd38cb01ad84f4b545b5a4458e)

# fingerprint reader のライブラリを導入

```
sudo apt install fprintd libpam-fprintd
```

# pam-auth-update で更新
/usr/share/pam-configs/ 配下の設定を一つのモジュールのように認識してくれます

[pam-auth-update - Ubuntu Manpage](http://manpages.ubuntu.com/manpages/focal/man8/pam-auth-update.8.html)

```
sudo pam-auth-update
```

ダイアログが表示されるので, `fingerprint authentication` を選択します

[![Image from Gyazo](https://i.gyazo.com/e8415ed4a1a1419cf9e136be428b7b0a.png)](https://gyazo.com/e8415ed4a1a1419cf9e136be428b7b0a)


# /etc/pam.d/common-auth の更新
ユーザー認証のためのモジュール, PAM（Pluggable Authentication Modules）の設定を更新します

```
sudo vim /etc/pam.d/common-auth
```

[![Image from Gyazo](https://i.gyazo.com/8432172f4ca5d5a54ee0dc92b6ba74d3.png)](https://gyazo.com/8432172f4ca5d5a54ee0dc92b6ba74d3)

17行目に次の設定を挿入します

```
auth [success=2 default=ignore] pam_fprintd.so max_tries=1 timeout=10
```

pam_unix.so との順番が大切です

# 指紋の登録
指紋を登録します

```
fprintd-enroll $USER
```

何度か enroll が要求されます

[![Image from Gyazo](https://i.gyazo.com/c44ea588ba0500c5850902dd869573f7.png)](https://gyazo.com/c44ea588ba0500c5850902dd869573f7)


ドライバを更新していなければ、次のエラーが出ます

```
Using device /net/reactivated/Fprint/Device/0
failed to claim device: Open failed with error: Device 06cb:00bd is already open
```


# 参考ページ
- [Using Fingerprint Reader in Kubuntu 20.04. on Thinkpad T495 - askubuntu](https://askubuntu.com/questions/1237451/using-fingerprint-reader-in-kubuntu-20-04-on-thinkpad-t495)
- [fwupd - ArcWwiki](https://wiki.archlinux.org/index.php/Fwupd)
- [Lenovo ThinkPad T495 - ArchWiki](https://wiki.archlinux.org/index.php/Lenovo_ThinkPad_T495)
Featherweight GoをScalaで実装した

# はじめに

arXivに[Featherweight Go](https://arxiv.org/abs/2005.11710)の論文が投稿されていた。この論文ではGo言語から機能を大きく取り去ったモデル言語を作り、それ振る舞いを定義したり型システムを与えている。さらにはFeatherweight Go（FG）にジェネリクスを搭載した_Featherweight Go with Generics (FGG)_というものを定義し、FGGからFGへの変換を与えることでGo言語へのジェネリクス追加が安全であろうことを述べていると思われる。このように、FGは実際のところは型システムなどの議論のために生まれたものであり、処理系などを実装することは恐らく意図されてはいないが、小さくて実装が容易だったのでScalaで実装した。この記事ではまずFeatherweight Goでできることやプログラム例を示し、その後にScala実装について軽く解説する。
また今回の実装は下記のGitHubリポジトリにある。

- https://github.com/y-yu/featherweight_go [^fgg_link]

この記事について、疑問点や誤りなどがあれば気軽にコメントなどで教えてほしい。

[^fgg_link]: このリポジトリーは現在、著者が改造してしまってGenericsが搭載されたFeatherweight Generics Goとなっている。

## 発表スライド

この内容を一部社内で発表したが、そのときの資料が下記にある。

- https://github.com/y-yu/featherweight_go-slide

# Featherweight Goの機能

Featherweight Goは次のようプログラム言語となっている。

- `int`などのプリミティブ型はない
- 構造体（`struct`）とインターフェース（`interface`）の定義
- 構造体のフィールドアクセス
- メソッドの定義
- メソッド呼び出し

このように極めて限定された機能しか有しないが、それでも実はそこそこのプログラムを書くことができる。例として下記のプログラムがある[^webui]。

```go
package main;

type Nat interface {
  plus(a Nat) Nat
}

type Zero struct { }
type Succ struct {
  pred Nat
}

func (this Zero) plus(a Nat) Nat {
  return a
}
func (this Succ) plus(a Nat) Nat {
  return Succ{this.pred.plus(a)}
}

func main() {
  _ = Succ{Succ{Zero{}}}.plus(Succ{Succ{Zero{}}})
}
```

[^webui]: https://y-yu.github.io/featherweight_go/ にWeb（Scala.js）の実装があるので、そこで試すことができる。

このように、自然数をつくったうえで足し算`plus`を作り、それで$2 + 2$を計算している。これの結果は`Succ{Succ{Succ{Succ{Zero{}}}}}
`となり、正しく$4$を計算できる。あとはたとえば文字が作りたい場合はこの自然数と文字コードを対応させることができるし、リストを作れば文字列も生み出さる。このようにFeatherweight Goは実用が困難なほど何も搭載していないが、こういうところをいちいち作っていけば同じ表現力になる。

# Featherweight Goの実装

ここからは実装について述べていくが、だいたいのところはコードを読んでも分かると思うので、実装上のポイントなどを中心に解説しようと思う。

## パーザー

- パーザーは今回の実装で最も苦労した。パージングについてもっと色々な知識があればこうはならなかったのかもしれないが、具象構文から意図したASTが得られるようになるまで色々頭を悩ませた
- 特に型システムを実装したあとで、そのテストのために入力した具象構文がパーズできないなどもあり、相当に時間がかかった
- もしプログラム言語を作りたいけどパーザーに興味がないなら、具象構文をJSONなどにしてしまう（？）という方法もありかもしれない
- ただ、最初からテストを与えながら作ったことはデグレ防止に非常に役だった。複雑な例で壊れるケースを修正したら、その修正で別の部分が壊れているということにすぐ気がつけた
- 特に今回はインタープリターを作ったため、引数から先に評価させるため、そこを優先でパーズするというのも注意しなければならなかった

## 型チェッカー

- 基本的には論文の型検査ルールをひたすらプログラムしていくだけであり、かなり簡単に実装できた
- また型チェッカーを作ることで生成されるべき型から実はFeatherweight Goの具象構文を勘違いしていたといったところが出てくるなどした

## エバリュエーター

- こちらもひたすら論文どおりに実装するだけであった

## Scala.jsでWebアプリ化

また、Slackで @xuwei_k さんなどに教えてもらってWebアプリにした。

- https://y-yu.github.io/featherweight_go/ 

:point_up_2:上記のURLから試してみることができる。

# まとめ

実装の解説はあまりしなかったが、Featherweight Goは小さく言語実装にそこまでの手間がかからないのですごく経験が豊富でなくても取り組みやすいと思う。まだやっていないが、いずれはFGGの実装とFGへの変換も着手したい。これらの実装を通して、Go言語にジェネリクスを搭載すると速度が変化するのか？という論争に終止符を打ってほしい。
transformerに関して

## transformerに関して（ざっくりまとめ）


<h3>・transformerとは</h3>
最近自然言語処理を勉強していて、transformというのを学んだので少しまとめてみました。勉強中ですので間違い等ございましたらご指摘いただけると幸いです。
transformerとは、transformerにある文字列を入力するとそれを変換して別の文字列を出力するもの。
例えば、
「"I am John Cena."」 という文字列をtransfornerに入力すると「私はジョンシナです。」とかえすみたいな感じです。


<h3>形態素解析に関して</h3>
文字列はまず単語に分解する必要がある。英語の場合は、"I am John Cena."みたいに文章が単語ごとに分けられているため単語に分割する必要がないが、日本語の場合は「私はジョンシナです。」のように文章が単語で分けられていない。そこで単語単位に分解するために形態素解析を行う。形態素解析とは簡単に言うと、文章を単語単位に分割し、それぞれの形態素の品詞等を判別する作業のことです。具体的例なとして、「私はジョンシナです。」を形態素解析すると「"私","は" , "ジョンシナ","です" , "。"」となります。

<h3>単語をどのようにして扱うのか？？</h3>

文章を単語に分解した後、その単語はどのように扱われるのかというと数値に変換します。例えばthis = [0.2 , 0.4 , 0.5],is = [0.1 , 0.7 , 0.35]のような感じです。これらの特徴が何を表しているのかというとそれぞれの単語の特徴を表している。この[0.2 , 0.4 , 0.5]や[0.1 , 0.7 , 0.35]のことを単語ベクトルという。


<h3>単語はどのようにして単語ベクトルへ変換されるのか??</h3>
簡単に言うと解析したい自然言語をすべて形態素解析し、出てくる単語を集める。その後ワンホットエンコーディングのような感じで単語をベクトル化する。

例えば今回分析したい文章で出てくる単語が「I am John Cena.」だけだったとすると
I            = [ 1 , 0 , 0 , 0 ] 
am           = [ 0 , 1 , 0 , 0 ] 
John Cena    = [ 0 , 0 , 1 , 0 ] 
.            = [ 0 , 0 , 0 , 1 ]  
のようにone-hotベクトルに変換することができる。この単語ベクトルをエンコーダーで変更する。そのことにより単語が特徴量に変更することができる。このone-hotベクトルをエンコーダーで変更したベクトルのことをembeddingベクトルと呼ぶ。

例としては
I = [ 1 , 0 , 0 , 0 ] ⇒エンコーダー⇒ $x_1$ = [0.3 , -0.3 , 0.6 , 2.2]

この$x_1$がembeddingベクトル

こんな感じの考えがここに詳しく(参考にさせていただきました。)
https://ishitonton.hatenablog.com/entry/2018/11/25/200332

<h3>文字列はどのようにして扱うのか？？</h3>
これまで単語をベクトルに変換することにはできたがでは文字列はどのようにして変換されるのかというとX = "I am John Cena."　⇒　["I", "am" ,"John Cena","."](単語に分ける)⇒  $x_1$ , $x_2$ , $x_3$ , $x_4$
(単語をベクトルに変換 $x_n$ はembeddingベクトル)⇒X = [$x_1$ , $x_2$ , $x_3$ , $x_4$]
このように行列に変換される。

<h3>トランスフォーマーに関して</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676443/a79b1d9a-bfc2-ab08-f28e-bcbcdaac9c22.png)


トランスフォーマーは文字列を入力するとある文字列を返すもの。中身に関していうと上図のように多くのエンコーダーとデコーダーからなる。入力された文字列はまず初めにエンコーダーに入る。エンコーダーの中身は下図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676443/62d73941-cd19-06f4-29cb-c8ccc90941f2.png)



このself attentionは入力された文字列の単語同士の関係性についてみている。また単語同士の関係性が強いというのはそれぞれの単語ベクトルの類似性を見ている。そのため、類似性を調べるには行列の内積を調べればいいってことになる。そして変換は一般的なニューラルネットワークを用いて変換される。

そしてデコーダーはエンコーダーからの入力を用いて次の単語を予測する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676443/203c817a-53e1-0c16-8b95-0731251f5941.png)

このE-D-attentionは入力と出力の関係性を見ている。

ざっくりとしたtransformerはこんな感じです。
ちゃんと知りたい方は
https://qiita.com/omiita/items/07e69aef6c156d23c538


ほぼこれを参考にさせていただきました！
めちゃくちゃわかりやすいです！
https://www.youtube.com/watch?v=BcNZRiO0_AE
Storyboardに表示される縮小表示領域=Minimapを非表示にする

Xcode12からStoryboardでMinimapが表示されるようになりました。
これを非表示にしたいと思ったけれど `View` メニューには無い...

### 追記: 通常版はこちら

`Control + Shift + Command + M` を押すと切り替え可能です。

<img width="400" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63205/f569f397-d8af-8316-a2bd-cc0ad2da7833.png">


### ベータ版ではこちら

こちらにありました。
`Editor` > `Canvas` > `Minimap`
ここで該当コントロールの表示切り替えできます。

<img width="1169" alt="スクリーンショット2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63205/0265a8e4-1845-018f-1e6c-1e0501a2fbad.png">

無事非表示にできました。
ネットワークの勘どころ ～ルーティングプロトコル編～

(新人エンジニアのふぎとくん。今日はカフェでネットワークの勉強をしているみたい。)

##ややこしすぎる

「あかん…ルーティングプロトコルがややこしすぎる…」
「**IGP**やら**BGP**、**OSPF**に**EGP**…」
「もうどれがどれやねん…」

##先輩登場

「おっ、ふぎとやないか」
「相変わらず頭抱えとるな、どないした？」
「ああ、先輩…」
「かくかくしかじか…」
「ははーん、なるほどな」
「ええか、そういう「ややこしい」プロトコルは**階層的に把握する**っちゅうことが大事や」
「階層的把握…ですか？」
「せや」
「まずは**IGP**と**EGP**やな」
「こいつらは、言うたら"**ルーティングプロトコル、ざっくり分けるならこのふたつ！**"てとこやな」
「はあ」
「そもそも全世界のネットワークはAS(Autonomous System)っちゅう仕組みで何個ものグループに分けられとってな」
「その**グループ内で使うんがIGP(Interior Gateway Protocol)、グループ間で使うんがEGP(Exterior Gateway Protocol)**っちゅう訳や」
「なるほど…！」
「要するに**ルーティングプロトコルはその制御範囲によってざっくり２つに分けられる**ってことですね？」
「そういうことや」

##階層的に理解する！

「ここまで来たら後は簡単や」
「よう使われとるIGPは**RIPv2**、**OSPF**、**EIGRP**の３つやな」
(※RIPv2は《古い環境にはたまに残って》いる程度)
「EGPの方は**BGP**をおさとけば問題ない」

- **IGP** : Interior Gateway Protocol
    -  **RIPv2** : Routing Information Protocol version2
    -  **OSPF** : Open Shortest Path Fast
    -  **EIGRP** : Enhanced Interior Gateway Routing Protocol

- **EGP** : Exterior Gateway Protocol
    - **BGP** : Border Gateway Protocol

「わ、わかりやすい…」
「ありがとうございます…さすが先輩」
「あ、でも」
「なんや？」
「主なIGPは３つありますけど」
「どれがどう違うんです？
「ふふふ…それはな…」
「**次回のお楽しみ**や…！」

(つづく！)

###参考

- みやたひろし『ネットワーク技術＆設計入門』(SB Creative)
Pythonで、Rubyのto_sはどう書くのか

Rubyを学習した後に、Pythonの勉強に入った方がいらっしゃると思います。そしてPythonの勉強中、「Rubyのあのメソッドって、Pythonではどう書くんだろう」となることがあると思います。今回は、その`to_s`版です。

## 結論

```.py
Ruby => 文字列に変換したい値.to_s
Python => str(文字列に変換したい値)
```

例

```.py

# Rubyの場合
name = SampleUser
name.to_s
  # "SampleUser"

# Pythonの場合
name = SampleUser
str(name)
  # "SampleUser"
```

## 追記

@shiracamus さんコメントより引用（ありがとうございます！！！）

各オブジェクトは __str__メソッドや __repr__メソッドを持っています。
str関数（実体はstrクラス）はそれらのメソッドを適切に呼び出して文字列化し、さらに文字コード変換してくれます。
参考： https://docs.python.org/ja/3/library/stdtypes.html#str

```py3
>>> 123 .__str__()
'123'
>>> 3.14.__str__()
'3.14'
>>> None.__str__()
'None'
```

参考
https://www.javadrive.jp/python/function/index2.html
[解決済み]Python3.8.5で「ssl module in python is not available」

<h2>前書き</h2>
UbuntuでPython3を使う場合、`apt`か`apt-get`でパッケージをインストールするのがスタンダードと思います。
ただ、「最新版」を使いたい場合、tarballからインストールしなければいけません。
今回、少々トラブりましたので、そのメモです。

<h4>参考サイト</h4>
- [“ssl module in Python is not available” when installing package with pip3](https://stackoverflow.com/questions/41328451/ssl-module-in-python-is-not-available-when-installing-package-with-pip3)
- [Ubuntu環境のPython](https://www.python.jp/install/ubuntu/index.html)

<h2>環境</h2>
- [Ubuntu 20.04 LTS 日本語 Remix](https://www.ubuntulinux.jp/home)
- Hyper-V マネージャー 10.0.18362.1
- Windows10 build 18363.997
- Python 3.8.5
- pip 20.1.1

<h4>補足</h4>
pipは下記aliasを使ってます。

```bash
pip='/usr/local/bin/python3.8 -m pip'
```

<h2>トラブル内容</h2>
`pip`実行時に「～ ssl module in python is not available ～」とメッセージが出て正常に動作していないっぽい。
※`python -m pip`で動作することから考えると、`pip`自体はPythonのモジュールとして動作しているので、Pythonの環境に影響されるという事はなんとなくわかる。

<h2>推測される原因</h2>
Python 3.8.5をインストールした際にSSL(OpenSSL)のライブラリがきちんとリンクされていない。

この場合、Pythonを対話モードで実行して`import ssl`するとエラーになります。

```python
import ssl
```

<h2>対処方法</h2>
- Pythonを正しくインストールするためのライブラリをインストール。

```bash
# 何はなくとも最新化
sudo apt update
sudo apt upgrade

sudo apt install \
build-essential libbz2-dev libdb-dev \
libffi-dev libgdbm-dev liblzma-dev \
libncursesw5-dev libreadline-dev libsqlite3-dev \
libssl-dev tk-dev uuid-dev \
zlib1g-dev
```

- Python最新版のtarballをダウンロード。

```bash
wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz
```
- ダウンロードしたファイルを解凍。

```bash
tar xf Python-3.8.5.tgz
```

- configureを実行

```bash
cd Python-3.8.5
./configure
```

- makeを実行

```bash
make
```
※いくつかWarningが出ますが、今回は気にせずに。
※どうも非推奨の処理が残っているようです。。。。

- 管理者権限でインストールを実行

```bash
sudo make install
```
- インストールされたファイルを確認

```bash
/usr/local/bin/python3.8 -V
```
`apt`等パッケージをインストールしたファイルは別のところに入っています。

```bash
/usr/bin/python3.8 -V
```
- ついでに`pip`も最新化

```bash
/usr/local/bin/python3.8 -m pip install --upgrade pip
```
※いつの間にか20.2が出ていたようです。。。

<h2>後書き</h2>
真面目に添付ドキュメントを読めば、前提となるライブラリも書いてあるとは思うのですが、いかんせん英語苦手で根性無しなので、やっつけで対処方法をメモしました。
`configure`～`make install`のあたりは他のプログラムをtarballからインストールする際にも応用できると思います。
※特殊な方法が必要なものもあるかもしれませんが。
Rubyで「ある期間の毎月1日」をDateオブジェクトの配列として取得する方法

Rubyの小ネタです。

## お題

2020年4月1日から2021年3月1日まで、1年分の「xxxx年xx月1日」のDateオブジェクトを配列として取得するコードを書いてください。

イメージとしてはこんな感じです。

```ruby
# 見やすいように文字列の配列にしていますが、本当はDateオブジェクトの配列を取得するのがゴールです
[
  "2020-04-01",
  "2020-05-01",
  "2020-06-01",
  "2020-07-01",
  "2020-08-01",
  "2020-09-01",
  "2020-10-01",
  "2020-11-01",
  "2020-12-01",
  "2021-01-01",
  "2021-02-01",
  "2021-03-01"
]
```

## 解答例

こんな感じで書けます。

```ruby
require 'date'
start_date = Date.parse '2020/04/01'
end_date   = Date.parse '2021/03/01'
(start_date..end_date).select{|d| d.day == 1}
#=> [#<Date: 2020-04-01 ((2458941j,0s,0n),+0s,2299161j)>, #<Date: 2020-05-01 ((2458971j,0s,0n),+0s,2299161j)>, （中略）, #<Date: 2021-03-01 ((2459275j,0s,0n),+0s,2299161j)>]
```

Railsであれば`Date.parse`の代わりに`to_date`が使えます。

```ruby 
# Railsの場合
start_date = '2020/04/01'.to_date
end_date   = '2021/03/01'.to_date
(start_date..end_date).select{|d| d.day == 1}
#=> [Wed, 01 Apr 2020, Fri, 01 May 2020, （中略）, Mon, 01 Mar 2021]
```

むりやり1行で書くとこんな感じ。（可読性がイマイチなのであまりお勧めしませんが）

```ruby
# Railsの場合
Range.new(*%w[2020/04/01 2021/03/01].map(&:to_date)).select{|d| d.day == 1}
#=> [Wed, 01 Apr 2020, Fri, 01 May 2020, （中略）, Mon, 01 Mar 2021]
```

いったん335日分のDateオブジェクトの配列を作ってから、毎月1日のDateオブジェクトだけをselectするので若干処理効率が悪いところはありますが、何十年、何百年という期間を対象にしないのであれば、たぶん大きな問題にはならないんじゃないかなー、と思っています。

以上、Rubyの小ネタでした！

## おまけ

Railsの`next_month`メソッドとRuby 2.7で導入された`Enumerator.produce`を使って、無駄なDateオブジェクトを作らない処理を考えてみました。これもなかなか良さそうです。

```ruby
# Rails + Ruby 2.7
start_date = '2020/04/01'.to_date
end_date   = '2021/03/01'.to_date
Enumerator.produce(start_date, &:next_month).take_while{|d| d <= end_date}
#=> [Wed, 01 Apr 2020, Fri, 01 May 2020, （中略）, Mon, 01 Mar 2021]
```

素のRubyでも`>> 1`を使えば1ヶ月後のDateオブジェクトが取得できるので、Ruby 2.7単体でこういう書き方もできます。

```ruby
# Ruby 2.7
require 'date'
start_date = Date.parse '2020/04/01'
end_date   = Date.parse '2021/03/01'
Enumerator.produce(start_date){|d| d >> 1}.take_while{|d| d <= end_date}
#=> [#<Date: 2020-04-01 ((2458941j,0s,0n),+0s,2299161j)>, #<Date: 2020-05-01 ((2458971j,0s,0n),+0s,2299161j)>, （中略）, #<Date: 2021-03-01 ((2459275j,0s,0n),+0s,2299161j)>]
```
デザインパターン（Singleton）をTDDしてみた

シングルトンパターンはインスタンスが1つであることを保証する設計です。
Junitを使って、本当に1つだけなのかを検証してみます。
またその手順をテスト駆動開発に従った手順（<font color="Red">Red</font>→<font color="Green">Green</font>→リファクタリング）で行います。

# テストコード
2つのインスタンスを生成し、assertThatで比較します。

```SingletonTest.java
package singleton.sample;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.jupiter.api.Test;

class SingletonTest {

    @Test
    void インスタンスが1つであること() {
        Singleton single1 = Singleton.getInstatnce();
        Singleton single2 = Singleton.getInstatnce();
        assertThat(single1, is(single2));
    }
}
```

# <font color="Red">Red</font>
Singletonクラスを作成し、自身のインスタンスを保持するフィールド（_singleton）を設定します。
getInstanceメソッドで取得できるようにstaticとし、自身のインスタンスをnew Singleton()でリターンします。
 
```Singleton.java
package singleton.sample;

public class Singleton {

    private static Singleton _singleton = null;

    private Singleton() {}

    public static Singleton getInstatnce() {
        _singleton = new Singleton();
        return _singleton;
    }
}
```

テストを実行すると、2つのインスタンスの参照が異なるため別物だと判断され<font color="Red">Red</font>になります。
<img alt='' class='alignnone size-full wp-image-2164 ' src='https://loglog.xyz/wp-content/uploads/2020/07/img_5f22266fcc69d.png' />

# <font color="Green">Green</font>
インスタンスの生成は、_singletonフィールドがnullである場合のみとします。
そうすれば生成されるインスタンスは1つだけにできます。(修正箇所 参照）
 
```Singleton.java
package singleton.sample;

public class Singleton {

    private static Singleton _singleton = null;

    private Singleton() {}

    public static Singleton getInstatnce() {
        // 修正箇所
        if(_singleton == null) {
            _singleton = new Singleton();
        }
        return _singleton;
    }
}
```

テストを実行してみましょう。
<font color="Green">Green</font>になります。
<img alt='' class='alignnone size-full wp-image-2165 ' src='https://loglog.xyz/wp-content/uploads/2020/07/img_5f2227eaef195.png' />

# リファクタリング
<font color="Green">Green</font>になったのであれば、リファクタリングができます。
2つほどリファクタリングしてみます。

## スレッドセーフ化
シングルトンパターンで議論される話題として、スレッドセーフであることが挙げられます。
よく見ると、synchronized がありませんので、これを追加しましょう。

``` Singleton.java
public synchronized static Singleton getInstatnce() {
```

追加修正後、テストを実行すると<font color="Green">Green</font>であることが確認できます。

## フィールド名
_sigletonを別の名前に変えてみましょう。
_instance としてみます（getInstanceメソッド内の変更も行います）。

``` Singleton.java
private static Singleton _instance = null;
```

テストを実行すると<font color="Green">Green</font>であることが確認できます。
もし<font color="Red">Red</font>になったのであれば、どこかに修正誤りがあるので確認してみてください。

# まとめ
・シングルトンパターンはインスタンスが1つであることを保証する設計である。
・テスト駆動設計においては、<font color="Red">Red</font>→<font color="Green">Green</font>→リファクタリングの順で行う。

# ソースコード
<a href="https://github.com/TakumiKondo/designpattern/tree/master/src/singleton/sample" rel="noopener noreferrer" target="_blank">Github</a>
【Python】ValueError: arrays must all be same length

Python3でスクレイピングをしていたら、ValueError: arrays must all be same lengthのエラーが出た

## 原因
`ValueError: arrays must all be same length`は、抽出したリストの長さが、違ったらこのエラーが出るらしい

例

```.py
dt={'key1': [1,2,3], 'key2': [1,2,3,4], 'key3': [1,2]}
```

## 対策
リストの長さを揃える

例

```.py
dt={'key1': [1,2,3], 'key2': [1,2,3], 'key3': [1,2,3]}
```

参考
https://qiita.com/ShoheiKojima/items/30ee0925472b7b3e5d5c