OmniAICreator/Qiita-1.07M huggingface dataset:
Jetson Nanoにリモートデスクトップ接続

# 本記事について
これまでJetsonNanoには7inchのディスプレイを接続して遊んでいました。
しかし、開発用MacbookからSSH接続でごにょごにょするようになり、画面もMacbookから見れれば良いなあと思うようになり、実施した内容の備忘録です。

大きく以下２つの設定を行いました

1. JetsonNano側の設定
2. クライアント側(MacBook)の設定

## JetsonNano側の設定
以下の記事中の「(方法2) Desktop Sharing(Vino)を使う」の設定を行いました。

- [Jetson Nanoにリモートデスクトップ(VNC)環境を用意する](https://qiita.com/iwatake2222/items/a3bd8d0527dec431ef0f)

当該ページの記載通り、[Getting Started with the NVIDIA Jetson Nano Developer Kit](https://blog.hackster.io/getting-started-with-the-nvidia-jetson-nano-developer-kit-43aa7c298797)の「Enabling Desktop Sharing」の手順を行いました。

個人的には、/usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xmlに以下のXMLを追加するという手順において、「どこに追加すれば良いのだ？」となっちゃいました。

  ```
  <key name='enabled' type='b'>
     <summary>Enable remote access to the desktop</summary>
     <description>
     If true, allows remote access to the desktop via the RFB
     protocol. Users on remote machines may then connect to the
     desktop using a VNC viewer.
     </description>
     <default>false</default>
  </key>
  ```
普通にファイルの上の方に追加するだけでうまくいきました。

## クライアント側(MacBook)の設定
REALVNC Viewerをダウンロードして設定していくわけですが、こちらの手順は、以下の記事中の「クライアント側の設定」を参考にしました。

- [Windows10からUbuntu16.04にVNC接続する](https://qiita.com/Reizouko/items/beee6bf54a24158db1bf#%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A)

参考にさせていただいた各サイトの管理者の皆さま、ありがとうございました！

## 未解決
- 一部の文字のキーボード配列がおかしい

 「=」が「０」の右にあるキー+shiftで出ないなど、記号の配列がおかしくなっています。

以上
Windows の Go で stdin に書きつつ外部プログラムを起動するとハマる

標準入力からデータを受け取るようなプログラムを起動させようとして、stdin に WriteString したらハマりになったので対処法をメモしておきます。

ProtocolBuffer のプラグイン書いてて踏みましたが、Go の周辺ツールとかカスタムしようとすると同じ感じで踏むかもしれません。

Windows で 4KB 以上のデータを書き込んだ場合にのみ発生し、4KB 以下の場合や Windows 以外の OS の場合は発生しません。

例えばこんなコード。

```Go 
func main() {
	content, _ := ioutil.ReadFile("test.txt") // 適当に 4KB 以上のテキスト
	
	c := exec.Command("more")
	stdin, _ := c.StdinPipe()
 
	io.WriteString(stdin, string(content)) // ここで返ってこない
 
	stdin.Close()
}
```

恐らく、パイプのバッファが足りなくなって、空くのを待っているけれども、
書き込みが終わってないのでプログラムが起動せず、空ける人がいないという状況と思われる。

以下のようにしたら、とりあえず動いた。

```Go
func main() {
	content, _ := ioutil.ReadFile("test.txt") // 適当に 4KB 以上のテキスト
 
	c := exec.Command("more")
	stdin, _ := c.StdinPipe()
 
	go func() {
		defer stdin.Close()
		io.WriteString(stdin, string(content))
	}()
 
	output, _ := c.CombinedOutput()
	fmt.Print(string(output))
}
```
サーバントリーダーシップの重要性に気づいてほしい

ここ何年か、チームのサーバントとして活動してきましたが、改めて自分が大事にしていることは何か、整理したいと思いました。
また広く共有することで、皆さんのチームが「ただの人の集まり」から一歩進んだ存在になれるのではないかと期待します。

※初めての投稿なので意思表明しておきます。
　皆様の反応(共感、反論、アドバイス)なんでもwellcomeです。よろしくお願いします。

# この記事のゴール
- サーバントリーダーシップの効果が認識/評価され、目指す人が増える。
- サーバントリーダーシップによるチームビルディングのやり方が知りたくなる。
- 他のサーバント活動をしている人の意見を知りたい、繋がりたい。

# サーバントリーダーシップとは
管理者が方針を決めて作業に分解し、メンバーへは作業の進捗管理のみを行うやり方ではなく、チームメンバー全員が主体となって活動することを支援します。
面倒な雑務を奴隷のようにこなすことではありません。

# サーバントリーダーシップの必要性
管理者がメンバーに指示を出してチーム作業を実施するやり方は管理者が全て決める必要があり、メンバーの考える機会をも奪うことに繋がります。
また管理者だけでなく、メンバーの仕事も複雑さが増しており、
リーダークラスのように自分で突破できることが求められます。
サーバントリーダーシップを通じてメンバーを繋げることで、これらの課題を解決します。

# サーバントリーダーシップの効果
### 管理者向け
個人の成果を大事だと認めつつも、チームの成果をなにより重視して活動します。
トラブルが発生してもチーム内で互いにフォローすることで、チームの成果を出すことを目指します。
チームの自己組織化を促すため、指示出し型の管理に比べてメンバーの成長につながります。

### メンバー向け
議論することでメンバーが相互に納得できます。
心理的安全を重視し、困ったときはチームにヘルプを求めることができます。
作業に集中できる環境/仕組みを提供します。

# おすすめしたい人
### 自分の作業が回らなくなってきた、責任が重いと感じるチームリーダー
私自身、アーキテクトチームのリーダーをしていたときに、決めることが多すぎて破綻しました。
重要項目を全て自分が決めるのではなく、チームに権限移譲できるヒントがサーバントリーダーシップにはあると思います。

### 作業のやり方に不満を感じているメンバー
改善のチャンスです。結果的にやり方が変わらなかったとしても、なぜダメなのか理解できた/納得感があれば生産性が上がると思いませんか。

# 終わりに
今回は導入として、サーバントリーダーシップのメリットについてまとめてみました。
次回は具体的なチームビルディングのやり方について書きたいと思います。
正規方程式の諸性質

               X⊤Xβ = X⊤y

▶ 正規方程式の任意の解は最小二乗推定量である 
⋆ 一般に, β が方程式 (21) の解であることは, β が S(β) を最小にするた めの必要条件であって十分条件であるとは限らないことに注意
▶ 正規方程式の解が一意的であるための必要十分条件は, (p + 1) 次正方 行列 X⊤X が正則であることであり, このとき正規方程式の解は
  βˆ = (X⊤X)−1X⊤y で与えられる 

実際のデータ解析をする上では, 最小二乗推定量がただ一つだけ存在 する状況が好ましい (例えば推定量の選択によって分析結果が変化し てしまうことが避けられる)
▶ 前頁の正規方程式の性質から, これは X⊤X が正則であることと同値
▶ X⊤X が正則であることは, X の列ベクトルが 1 次独立であることと
同値であるが証明できる 
▶ X の各列は各説明変数の観測データからなるベクトルで与えられてい
るから, これは回帰式の構築に利用する説明変数たちが互いに異なる 情報をもつという意味だと解釈できる
説明変数の間の関係の 1 次従属関係への近さの度合いは多重共線性 (multicollinearity) と呼ばれる
前頁で述べた理由から, データ解析をする上では説明変数は多重共線 性があまり強くならないように選択すべきである
▶ 例えば, 似たような動きをする説明変数を重複して利用することは避 けるべき

 βˆ が最小二乗推定量のとき, デザイン行列 X の列ベクトルたち で張られる Rn の部分線形空間 (超平面) を L[X ] と書くことにすれ ば, yˆ はベクトル y の L[X ] への直交射影となる
SSHの基礎を見直す

#はじめに
AWSをterminalから操作するにあたって、SSHコマンドを使用するため、__『SSH』__、__『オプション』__、__『コマンド』__について簡単にまとめる。

#SSHとは
Linuxエンジニアにはお馴染みのリモートマシン操作ツール

- __SSH(Secure Shell)__
クライアントとリモートマシン間の通信を暗号化するプロトコル

- __SSHコマンド__
SSH方式によってリモートマシン上でコマンドを実行するコマンド。主にLinuxサーバーの操作に利用。

- __SSHクライアント__
SSHによるリモートマシン操作を支援するコマンドプロンプトタイプのソフトウェア。

#基本書式

```terminal
ssh[オプション]ホスト名[コマンド]
```

#オプション一覧

- 『 -i 』：秘密鍵ファイル(identifyファイル)を指定
- 『 -l 』：ログインユーザ名を指定
- 『 -p 』：ポート番号を指定
- 『 -x 』：X11の転送を有効化
- 『 -1 』：SSHのプロトコルバージョン１を使用
- 『 -2 』：SSHのプロトコルバージョン2を使用
- 『 -4 』：IPv4を使用

#コマンド一覧
- 『 ls 』：フォルダ/ファイル一覧を表示
- 『 cd 』：フォルダの場所を移動
- 『 pwd 』：現在のフォルダ位置を表示
- 『 cp 』：フォルダ/ファイルをコピー
- 『 mv 』：フォルダ/ファイルを移動
- 『 rm 』：フォルダ/ファイルを削除
- 『 mkdir 』：フォルダを作成
Raspberry Pi(Raspberry Pi OS)に最新版のNginxを導入する

##はじめに
[Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その2](https://qiita.com/ochomaki/items/51ea5f72fe477e3890ca) で省略していた最新版Nginxの導入について解説します。

##Nginxの導入
まずは [Nginx公式のダウンロードページ](https://nginx.org/en/download.html) を見てみましょう。`Mainline version`と書いてあるのが最新版になります。下の画像で言うと`nginx-1.17.0`ですね。その下の`Stable version`と書いてあるのが安定版です。
![nginx_official_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424307/5ad8336e-5c2c-ab06-04ef-4c959bc65ded.png)
今回は最新版の1.17.0をインストールしますが、安定性を重視する方は1.16.0を選ぶのもアリです。
####既にNginxをRaspberry piにインストールしている場合（ない人は省略）
既になんらかのバージョンのNginxがある場合は、先にアンインストールを行います。最新版導入の際に既存のバージョンと競合してしまう為、エラーが起きてしまうためです（1敗）

```python:terminal
$ sudo apt-get remove nginx nginx-common
```
これでアンインストールは完了です。それでは次へ進みましょう

####Nginx公式リポジトリの公開鍵を登録

```python:terminal
$ wget http://nginx.org/keys/nginx_signing.key
$ sudo apt-key add nginx_signing.key
```

####Nginx公式リポジトリを登録

```python:terminal
$ sudo vi /etc/apt/sources.list
# viコマンドで /etc/apt/にあるsources.listを編集。下の2行を追記
deb http://nginx.org/packages/debian/ stretch nginx
deb-src http://nginx.org/packages/debian/ stretch nginx
```
※追記する2行の`stretch`の箇所はお使いのRaspbianのバージョンを入力してください（6/17時点の最新はStretch）

####ソースからパッケージをビルド

```python:terminal
$ sudo apt-get update
$ sudo apt-get build-dep nginx
$ sudo apt-get source nginx
$ cd nginx-1.17.0    # 選択したバージョンを入力
$ sudo dpkg-buildpackage -uc -b
$ cd
$ sudo dpkg -i nginx_1.17.0-1~stretch_armhf.deb
```

これで完成です。実際にNginxのバージョンを確認してみましょう。以下のように1.17.0になっていれば成功です
![nginx_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424307/a39508e6-c90b-6adb-7d2b-04befcb8347d.png)


実際に起動もしてみましょう。

```python:terminal
$ sudo /etc/init.d/nginx start
# 起動が成功すると以下が表示されます
[ ok ] Starting nginx (via systemctl): nginx.service.
```
OKの表示が確認できたら [http://127.0.0.1:80](http://127.0.0.1:80) にアクセスしてください。`Welcome to nginx!`と表示されたサイトがブラウザ上に表示されていれば起動成功です。

```python:terminal
$ sudo /etc/init.d/nginx stop
```
でNginxの停止も行えます。

##おわりに
以上でRaspberry piに最新版Nginxを導入する手順は終了です。他にも
[Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その1](https://qiita.com/ochomaki/items/447c25cecbb5aee35ca1)
[Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その2](https://qiita.com/ochomaki/items/51ea5f72fe477e3890ca)
[Raspberry pi + Nginx + uWSGIでWebサーバーを立ち上げDjangoアプリをデプロイしてみる その3(最終回)](https://qiita.com/ochomaki/items/685959ced864d2b6feac)
などの記事を書いておりますのでご一読いただけましたら幸いです。
SpriteKitで円を描画する

SpriteKitでの円の描画方法です。オプションにより角丸の四角形も描画可能です。
cornersの値によってどの角を丸くするか指定することもできます。
また、「shape.path = UIBezierPath(roundedRect: rec, byRoundingCorners: corners, cornerRadii: size).cgPath」の行の「size」を「CGSize(width: 25, height: 25)」などに書き換えることにより円だけではなく角丸の四角形を描画することもできました。

``` swift
        //SKShapeNodeを宣言
        let shape = SKShapeNode()
        //位置とサイズを指定
        let rec = CGRect(x:0, y:0, width:100, height:100);
        //丸くする角を指定する
        let corners : UIRectCorner = [UIRectCorner.topLeft,UIRectCorner.topRight,UIRectCorner.bottomLeft,UIRectCorner.bottomRight]
        //角の丸さを指定
        shape.path = UIBezierPath(roundedRect: rec, byRoundingCorners: corners, cornerRadii: size).cgPath
        //色を指定
        shape.fillColor = UIColor.red
        shape.strokeColor = UIColor.white
        //シーンに追加
        self.addChild(shape)
```




円
![Simulator Screen Shot - iPhone Xʀ - 2019-06-17 at 22.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/11e6ea0a-9b27-30c5-facc-3fe980786859.png)

角丸四角
![Simulator Screen Shot - iPhone Xʀ - 2019-06-17 at 22.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/a484abd8-c9c0-b152-b570-e9c3b316fb7f.png)
Rails 5.2+FactoryBotでテスト環境で db: createしたらエラーになった


#事象
Railsのプロジェクトを5.2.3にあげたら、CIサーバーのジョブが失敗した。
中身を見たら、DBをセットアップするところに以下のエラーになったよう：

```
bundle exec rails db:create RAILS_ENV=test
bundle exec rails db:structure:load --trace RAILS_ENV=test
...
rails aborted!
TinyTds::Error: Database 'project_name_test' does not exist. Make sure that the name is entered correctly.
```

`rails db:create` でDBが存在しないので怒られたっぽい。ないから作るのに…
ローカルで実行してみたら、テスト環境のみこの事象が発生した。

#原因
長年で磨き上げたググる力で探してみたら、原因はこのIssueで書いている内容だそうだ。
https://github.com/rails/rails/issues/32870#issuecomment-413388302

ざっくり言うと、Railsで `config.after_initialize` という処理のタイミングをアプリ初期化後に制御できるメソッドがあるが、 このメソッドは[rakeタスクに適用しない](https://github.com/rails/rails/blob/master/guides/source/configuring.md#rails-general-configuration)。ただし5.2までは一部そもそも完全に初期化しなくても実行できるrakeタスクもあった（`db:create`はその一つ）。

5.2以降はその挙動が変わって（ていうか本来あるべき挙動になって）、`db:create`を含め全てのrakeタスクも初期化が必要になった。

ところでFactoryBotでは `config.after_initialize` で[Factoryの定義をロードするような処理](https://github.com/thoughtbot/factory_bot_rails/blob/v5.0.2/lib/factory_bot_rails/railtie.rb#L25)が入っているらしい。Factory定義→モデル定義→ここでテーブルが存在しているかどうかのチェックが入っているので、`db:create` の前にテーブルの存在チェックを行い、今回のエラーになった。（むしろ今まではただ逃げれていただけだ…）

#解決
Issueに書いている解決策を参考して、デフォルトではなく必要な時だけFactoryBotを呼ぶようにする。

Gemfileに

```
gem 'factory_bot_rails', require: false
```

そして使う場所に（自分の場合は`spec/spec_helper.rb`）

```
require 'factory_bot_rails'
```

これでうまくDB作れた。
VSCodeでdocker host上のdocker containerに接続

# VSCode で docker host 上の docker container に接続

docker-machine で管理された docker host 上の docker container に、vscode の remote-development で接続します。

この記事は[公式ページ](https://code.visualstudio.com/docs/remote/containers-advanced#_developing-inside-a-container-on-a-remote-docker-host)をほぼそのまま実践しています。

使用する docker host を指定して vscode を立ち上げるだけです。

linux or mac

```bash
eval $(docker-machine env give-it-a-name-here) # docker host を設定
code # vscode を起動
```

windows (powershell)

```powershell
docker-machine env give-it-a-name-here | invoke-expression # docker host を設定
code # vscode を起動
```

起動された vscode では remote-containers の接続先として、docker-machine 上の docker container が接続先として選択できるようになっています。

注意点としては、
`eval $(docker-machine env give-it-a-name-here)` と `docker-machine env give-it-a-name-here | invoke-expression` は環境変数を設定するコマンドで、コマンドを実行した端末でのみ有効なので、必ず同一端末内で `code` を実行する必要があります。
DockerをCentOS7にインストールする手順

# 作業環境
| OS・ミドルウェア | バージョン                              |
|:------------|:-------------------------------------|
| CentOS      | CentOS Linux release 7.6.1810 (Core) |
| Virtual Box | 6.0.8 r130520 (Qt5.6.3)              |
| Vagrant     | 2.2.4                                |

# Dockerのインストール
`yum`を利用して必要なものをインストールする。
・yum-utils
　　`yum`に関するユーティリティ集。`yum`コマンドだけでは操作できない部分を補ってくれる。
・device-mapper-persistent-data
・lvm2
　　どちらもdevicemapperストレージ・ドライバの使用に必要。

```
# 先にインストールしておく
$ sudo yum install yum-utils device-mapper-persistent-data lvm2

# リポジトリの追加
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# yumのパッケージインデックスを更新（Dockerのinstallやupgradeの前に１回実行することが推奨されている）
$ sudo yum makecache fast

# 最新バージョンのDocerをインストール
$ sudo yum install docker-ce
```

※インストールするDockerのバージョンを指定したい場合

```
# インストール可能なバージョンを調べる
$ yum list docker-ce.x86_64 --showduplicates | sort -r

# 指定バージョンのDockerをインストール（今回は17.06.0.ce-1.el7.centos）
$ sudo yum install docker-ce-17.06.0.ce-1.el7.centos
```

### バージョンを確認する
```
$ docker -v
Docker version 18.09.6, build 481bc77156
```

### OS起動時にDockerを自動起動するように設定
```
$ systemctl enable docker
```

### 動作確認
Dockerを動かしてみる

```
# Dockerを起動する
$ systemctl start docker

# コンテナの起動（今回はhello-world）
$ docker run hello-world

# コンテナ一覧の表示
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        5 months ago        1.84kB

# hello-worldコンテナの削除
$ docker rmi -f fce289e99eb9
```

# Docker Composeのインストール
GitHubのダウンロードページから最新バージョンを確認する（今回は1.24.0）
※インストール先は`/usr/local/bin/`

```
# GitHubからダウンロード
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# バイナリに対する実行権限を追加
$ sudo chmod +x /usr/local/bin/docker-compose
```
### バージョンの確認
```
$ docker-compose --version
docker-compose version 1.24.0, build 0aa59064
```

### バージョンアップする場合
```
$ sudo curl -L https://github.com/docker/compose/releases/download/'最新バージョン'/docker-compose-`uname -s`-`uname -m` /usr/local/bin/docker-compose
```
SQLを連続で発行するとcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException: が出る

MySQLのエラーで長時間ハマったのでメモ。

##症状##
SQLを連続して２回発行すると
**com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure**
エラーが発生し、空のテーブルが返ってくる。
１回目の発行の直後にredirectで別のページに飛び、そこで次のSQLを発行したところでエラー。
しかし、その直後に同じURLのままブラウザを使って手動でページを更新すると正しいテーブルが表示される。

##経緯##
学習用の課題として指示を受け、CRUDのHPの作成を行っていました。
STS(Eclipse+Springキット)によるIDE組み込みローカルサーバーでインメモリDBのh2databaseを使っていたところ、
DBをMySQLに変えてサーバーモードで動かすように言われました。
そこで、ドットインストールを参考にVagrantを使ってCentOS＋MySQLの環境を構築して繋ぎ変えました。
すると、変更前は正常に動作していたDBが所々動かなくなりました。
その内の一つが上記症状です。
##問題点と考えられる事##
１回目のDB接続のclose()が完了していないのに、追加で接続しようとして接続可能数を超えてしまったか、SQLの処理が追いつかずコンフリクトした。
現状、DB接続とSQL発行をセットで行っているのでどちらの時点で止まっているかはまだ分かりません。

##とりあえずの解決策##
１回目のSQL発行＋sshConnectionのcloseと２回目のSQL発行の前に

```java

		try {
			Thread.sleep(3000);//if here is not this,caused MySQL error.communication link failer.
		}catch(InterruptedException e) {e.printStackTrace();}
```

を入れたらとりあえず動きました。

##結果から推察してみた事##
インメモリの組み込みDBと仮想サーバーでは応答速度に大きな差がある。
どちらも同じPC内なので本来応答速度に差はないはずですが、本番サーバーで起こりうる問題を演出するためにあえて通信にかかる時間をシュミレートしているのでしょうか。

本来は上記対応ではなく、接続可能数を増やすなど、MySQLの環境設定を変更しないと根本的な解決にはならないかもしれません。
正しい解決方をご存知の方、コメントお待ちしております。
TwitterトレンドとGoogleトレンドから情報を取得[python3.x]

最終更新：2019年6月17日

#google trend情報取得
###本記事上の変数の定義
|変数    |内容                      |
|:----------:|:--------------------:|
|pytrends    |google trendとのAPI接続|
|trend       | 日本のgoogle trend取得|
|trend2      | リストにする|
|Google_list | googleトレンドのリスト|
|Twitter_list| twitterトレンドのリスト|

###コーディング指定
```python

!/usr/bin/env python
-*- coding: utf-8 -*-
```

###pytrendsライブラリのインストール
```python

*pip install pytrends*
```

###各種モジュールのインポート
```python

from pytrends.request import TrendReq
import pandas, numpy
```

###日本のgoogleトレンド取得
```python

pytrends = TrendReq()
trend = pytrends.trending_searches(pn = 'japan')
```

###pandas.dataframe形式での取得なので、リスト形式に変換（必要あれば）
```python

trend2 = trend.values.tolist()
```

###単一リストにして扱いやすく
```python

Google_trend_list = []
for i in trend2:
    Google_trend_list.extend(i)

print(Google_trend_list)
```

###参考
https://www.monotalk.xyz/blog/Get-Google-trend-data-with-pytrends/

#Twitter trend情報取得
###twitter apiと、twitter認証のrequestsのインストール
```python

*pip install twitter*
*pip install requests requests-oauthlib*
```

###各種モジュールのインポート。myconfigという同ディレクトリ内の別ファイルにtwitterAPI情報記載、インポート。
```python

from twitter import *
import re
import myconfig
```

###Twitter認証
```python

CK = myconfig.Consumer_Key
CS = myconfig.Consumer_Secret_Key
AT = myconfig.Access_Token
AS = myconfig.Access_Secret_Token

twitter = Twitter(auth = OAuth(AT,AS,CK,CS))
```

###idは地域IDにおける日本(2342856)を指定
```python

results = twitter.trends.place(_id = 23424856)
```

###取得したtwitterリストの’#’を消し、リスト形式にする
```python

Pre_Twitter_list = []
for location in results:
        for trend in location["trends"]:
                Pre_Twitter_list.append(re.sub('#', "", trend["name"]))
```

###必要ならば、Twitter trendのcountをGoogleのcountに合わせる
```python

Twitter_list = Pre_Twitter_list[:len(Google_list)]

print(Twitter_list)
```
Ruby on Rails [学習記録-第0章-]

これからRuby on Railsをプログラムする上で必要なことを都度纏めていく。
基本的に、学習内容の備忘録として使用します。

参考サイト：[rubyのインストール方法　Mac編](https://tech-camp.in/note/technology/1213/)

##概要
Ruby on Railsを始める前に、以下のものをインストールする。

1. [Command Line Tool](#command-line-tool)
2. [Homebrewのインストール](#homebrew%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
3. [rbenvとruby-buildインストール](#rbenv%E3%81%A8ruby-build%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
4. [Ruby ver.2.5.1のインストール](#ruby-ver251%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
5. [MySQLのインストール](#mysql%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
6. [bundlerのインストール](#bundler%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
7. [Ruby on Railsのインストール](#ruby-on-rails%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

##Command Line Tool
まず最初HomebrewをインストールするためにCommand Line Toolをインストール。
アクセス時にApple IDとパスワードを要求される。
自分のMacのOSのバージョンに合わせたものをインストール。

[コマンドラインツール](https://developer.apple.com/download/more/)


##Homebrewのインストール
下記コードはHomebrewをインストールするためのコマンド。cdコマンドでホームディレクトリに移動してから実行。途中で要求されるパスワードは自分のMacのパスワード。

```bash:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
```bash:Homebrewがインストールされているか確認
$ brew -v 
```
```bash:
$ brew update
```
Macのバージョンが10.11.1以上の場合、ターミナルから以下のコマンドを実施して権限を変更。

```bash:
$ sudo chown -R 'whoami':admin /usr/local/bin
```
##rbenvとruby-buildのインストール

Homebrew使って、rbenv(アールベンブ)とruby-build(ルビー・ビルド)という２種類のアプリケーションをインストール。

```bash:
$ brew install rbenv ruby-build
```
rbenvとruby-buildは、Rubyのバージョンを管理する際に組み合わせて使用。
ruby-buildによってRubyの様々なバージョンをインストール可能。
rbenvを使用することでrubyのバージョンを切り替える。
開発環境によってはRubyの特定のバージョンでなければエラーが出る。



```bash:
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```
rbenvのパスを通す。パスを通すことでrbenvをどのディレクトリからも使用。

```bash:
$ source ~/.bash_profile
```
.bash_profileの読み込み。書き込んだ設定を読み込み、有効にする。

###readlineのinstall
```bash:
$ brew install readline
```
##Ruby ver.2.5.1のインストール
Macに最初から入っているRubyは、rbenvでのバージョン管理ができない。

```bash:
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
$ rbenv install 2.5.1
```
###利用するRubyのバージョンを決める
```bash:
$ rbenv rehash　#リハッシュ
$ rbenv global 2.5.1 #指定したバージョンでインストール
$ ruby -v #バージョンの確認
```
##MySQLのインストール
```bash:
$ $ brew install mysql@5.6 #インストール
$ mkdir ~/Library/LaunchAgents #自動起動の設定
$ ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
```
```bash:
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist #PCを起動すると同時にMySQLも自動で起動
```
```bash:
#mysqlのコマンドを実行できるようにする
$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
#mysqlのコマンドが打てるか確認する
$ which mysql
#以下のように表示されれば成功
/usr/local/opt/mysql@5.6/bin/mysql
```
##bundlerのインストール
```bash:
$ gem install bundler #bundlerとはgemのバージョン管理などをしてくれるgem
```
* gem(ジェム)とは、Rubyを便利に扱うためのアプリケーションの総称。ターミナルからそれぞれのgemが持つコマンドを実行するという形で使用。

##Ruby on Railsのインストール
```bash:
$ gem install rails --version='5.2.2.1'
$ rbenv rehash
$ rails -v
```
* rbenv rehashコマンドは、そのバージョンで利用しているgemのコマンドを使えるようにするために必要なコマンドです。gemコマンドでgemをインストールしたときは、rbenv rehashコマンドを実行するのを忘れないようにしましょう。
[Wio LTE Cat.1] Grove-D38でシリアル通信

「Wio LTE Cat.1のD38、D39がSerialペリフェラルに接続されているが、使用できますか？」という問い合わせがあったので、確認しました。

# ハードウェア

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/f5f21850-4511-3b68-2118-86e4cbf0d522.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/52227e30-47a8-f9d1-5466-784766150b34.png)

* D38 -> PC6
* D39 -> PC7

と繋がっていて、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/e28bd14b-92c2-5e07-91a8-d88f70e6a247.png)


* PC6 -> USART6-TX
* PC7 -> USART6-RX

なので、ハードウェアは、USART6のペリフェラルに接続されています。

# プラットフォーム

SeeedJP STM32 Boards(v1.2)のソースを確認すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/8e312cf4-3d47-5ce1-3c23-3ebeb485fbc8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/46b90ce0-decc-c2fd-8ba0-9a6bc594f8b5.png)

HardwareSerialクラスからPC6,PC7が使えるように設定されています。

# 動作確認

ハードウェア、プラットフォームとも、使える状況だったので、試してみることに。

このようなスケッチで、シリアルから入力した文字を送信（いわゆる、エコーバック）させてみました。

```c++
#include <WioLTEforArduino.h>

HardwareSerial d38serial(WIO_D39, WIO_D38);

void setup()
{
  d38serial.begin(115200);
}

void loop()
{
  while (d38serial.available() >= 1)
  {
    d38serial.write(d38serial.read());
  }
}
```

結線はこちら。  
Wio LTE Cat.1のGrove-D38とTTL-232R-3V3を繋ぎました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/7d3d6c1e-afca-8698-40a2-82faf1c3a5b6.png)

# 動作確認結果

動いたー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/bca17373-4551-a7fa-84a8-41fde20fd594.png)


おしまい。
[JS][Vue]「@hoge.prevent="fuga"」←この「.prevent」が、「e.preventDefault();」の省略形だった件

# 今回のコード
先日、Vueを触っていたら、「@hoge.prevent="fuga"」こんなのが書いてあったので調べてみました。
とりあえず共有しておくので、何かの参考にしてもらえれば、嬉しいです。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="riotam4" data-slug-hash="vqGqxr" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="[Vue]非同期処理直後にリロード問題 .prevent">
  <span>See the Pen <a href="https://codepen.io/riotam4/pen/vqGqxr/">
  [Vue]非同期処理直後にリロード問題 .prevent</a> by riotam (<a href="https://codepen.io/riotam4">@riotam4</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
コードは、この[関連記事](https://qiita.com/riotam/items/9d360dfbc796853793e3)で使ったものとほぼ同じです。
分かりにくければそちらの記事も、短いので読んでみて下さい。
# 解説
コードの内容については、関連記事に書いてますので省略します。
結論を言うと、「今回のコード」HTML側の2行目に書いた「@submit.prevent="outPut"」は、
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="riotam4" data-slug-hash="Wqwdex" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="[Vue]非同期処理直後にリロードされてしまう問題を「e.preventDefault();」で解消させた件(成功ver)">
  <span>See the Pen <a href="https://codepen.io/riotam4/pen/Wqwdex/">
  [Vue]非同期処理直後にリロードされてしまう問題を「e.preventDefault();」で解消させた件(成功ver)</a> by riotam (<a href="https://codepen.io/riotam4">@riotam4</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
↑「[関連記事](https://qiita.com/riotam/items/9d360dfbc796853793e3)のコード」JS側11行目に書いているものと、同じ意味です。
詳しくは、そちらの記事で書いてますので、読んでみてください。

難しそうな記法も、ただの省略と分かれば怖くない！
以上、ありがとうございました。
html formの正規表現を使った検証

#formの検証で正規表現を使うには
- inputタグにrequired属性を付けて、pattern属性で正規表現を使う

#bootstrapを使った検証サンプル
```html:validation.html
<!doctype html>
<html lang="ja">
  <head>
    <title>Bootstrap基本テンプレート</title>
  <!-- 必要なメタタグ -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  </head>
  <body>
   

   <form class="needs-validation" novalidate>
  <div class="form-row">
    <div class="col-md-4 mb-3">
      <label for="validationCustom01">ユーザID</label>
      <input type="text" class="form-control" id="validationCustom01" value="" required pattern="[0-9]{4}">
      <div class="valid-feedback">
        入力済み!
      </div>
      <div class="invalid-feedback">
        ユーザIDを入力してください!
      </div>
    </div>
    
  <button type="submit" class="btn btn-primary">フォームを送信</button>
</form>


<script>
// 無効なフィールドがある場合にフォーム送信を無効にするスターターJavaScriptの例
(function() {
  'use strict';

  window.addEventListener('load', function() {
    // カスタムブートストラップ検証スタイルを適用するすべてのフォームを取得
    var forms = document.getElementsByClassName('needs-validation');
    // ループして帰順を防ぐ
    var validation = Array.prototype.filter.call(forms, function(form) {
      form.addEventListener('submit', function(event) {
        if (form.checkValidity() === false) {
          event.preventDefault();
          event.stopPropagation();
        }
        form.classList.add('was-validated');
      }, false);
    });
  }, false);
})();
</script>
    
  <!-- オプションのJavaScript -->
  <!-- 最初にjQuery、次にPopper.js、次にBootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
  </body>
</html>
```
docker-composeでリバースプロキシの動作を試してみた

# 概要
今更ながらですが、apacheのリバースプロキシーの動作を確認してみたく、docker-composeで環境を作って試してみた。



# 構成
![snap-appache-proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234299/cd4f0a89-b6b8-1365-4c83-799fc9138ce2.png)

proxy(Ubuntu): 172.30.0.3
webapp(Ubuntu): 172.30.0.2

proxyとwebappの二つのコンテナを立て、ホストからwebappに直接アクセスせず、
ホストからproxyにアクセスして、webappの表示ができるか確認する。

http://192.168.11.9:81/app/index.phpで表示されるサイト

```
<?php phpinfo();?>
```

# ツリー構成

```
test
|--docker-compose.yml
|  |--proxy
|  |  |--Dockerfile
|  |  |--apache2.conf
|  |  |--entrypoint.sh
|  |  |--node.conf
|--vol # /etc/apache2のマウント
|  |--apache2.conf
|  |--conf-available
|  |--conf-enabled
      ・・・
|--www　# webappのマウント
|  |--app
|  |  |--index.php
```

# 実装

docker-compose.yaml

```
version: '3'
services:
  app:
    image: php:7.2.11-apache
    tty: true
    volumes:
      - ./www:/var/www/html
    ports:
      - 80:80
    networks:
      app_net:
        ipv4_address: 172.30.0.2

  proxy:
    build: ./docker/proxy
    tty: true
    ports:
      - 81:80
    # apacheのディレクトリマウント
    volumes:
      - vol:/etc/apache2/
    networks:
      app_net:
        ipv4_address: 172.30.0.3

networks:
  app_net:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.30.0.0/24

volumes:
  vol:
    driver_opts:
      type: none
      device: ${PWD}/vol
      o: bind
```

proxyのDockefile

```
FROM php:7.2.11-apache

ADD ./node.conf /etc/apache2/conf-enabled
ADD ./apache2.conf /etc/apache2
RUN mkdir /work
WORKDIR /work
ADD ./entrypoint.sh /work

# proxyモジュールの有効化
RUN a2enmod proxy && \
    a2enmod proxy_http

RUN apt-get update && \
    apt-get install build-essential checkinstall

# sourceを使えるように一時的にbashを使う設定
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

RUN source /etc/apache2/envvars

CMD ["/bin/bash", "entrypoint.sh"]
```

entrypoint.sh

CMD ["apachectl", "-D", "FOREGROUND"]で実行すると
起動時にエラーになるため、起動時シェルに移した。

```
#!/bin/bash
apachectl -D FOREGROUND
```

node.conf

/etc/apache2/conf-enabledに配置する。配置は、dockerfileで実施する。

```
ProxyRequests Off

ProxyPass /app/ http://172.30.0.2/app/

```
ProxyRequests: リバースプロキシの設定
ProxyPass: 指定したリクエストを転送する。上記だと、/app/配下のリクエストを
http://172.30.0.2/app/
に転送する。


# 動作検証
http://localhost:81/app/index.php


```
# proxy側のログ *httpd.confのloglevelをdebugにした時のログ
[proxy:debug] [pid 11] proxy_util.c(2209): [client 172.30.0.1:48208] AH00944: connecting http://172.3
0.0.2/app/index.php to 172.30.0.2:80
```

```
# app側のログ
172.30.0.3 - - [26/Jun/2019:06:34:48 +0000] "GET /app/index.php HTTP/1.1" 200 24777 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
```
AliMail Personal Edition という Gmail の様なサービスを使ってみたよ⁉️

# はじめに

Alibaba には AliMail （阿里邮箱） と言うメールサービスがあります。
ザックリ言うとGmailでした。  

基本エンタープライズ用途のみだと思っていたのですが、個人用のPersonal Editionのアカウントが作れる。
しかも中国携帯が不要‼︎
と言うことで、ちょっと使い勝手を知りたくアカウントを作成してみました。

アカウント開設して試験的にメールの送受信をするところまでのメモになります。

## AliMailアカウント開設

[こちら](https://mail.aliyun.com/alimail/auth/login)からアカウントを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/33b0efd5-b8c3-311d-2296-e4d0219b4a9e.png)

SMSを受け取るための電話番号を入力します。
日本の携帯電話でOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/4d150ada-2e61-d899-b00d-ebb6c262c70d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/f5847270-b3fa-6ede-12d8-afffe0329187.png)

先ほど登録した携帯電話にSMSが届きますので確認コードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/35d78472-5d46-0486-d2a3-bf802651397f.png)

作成するアドレスとパスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/d3b76e0f-c41b-b45d-124f-0200d22db409.png)

こんな画面が開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/5821c3c8-6afa-2731-8088-4fdf12107d6d.png)

## AliMailをさわってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/ae17517e-60bb-a8d7-3ce1-a797bbffac9b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/fe8360fd-c0e7-76e2-3432-dfaa84a7c349.png)

新しいUIがある様なので変えてみます。
5.0とのことなので結構前からあるサービスの様ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/9c989631-87f8-7290-1bf3-08ad10ff0021.png)

こんな感じの画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/9badc8ec-ac9d-4572-5bdf-79d2612c4631.png)

ちょっとGmailからメール送ってみました。
普通に届きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/3cd80ed4-fd2d-6b0f-86ad-a46910773199.png)

AliMailから返信してみます。
漢字のフォントが日本語と違うのは・・・まぁ、しょうがないですね。
日本語も普通に使えます。スタンプもありますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/d457cc93-009c-db56-3b30-a749f3953365.png)

Gmailにも普通に届きました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/22e03286-a96d-c053-7b26-d8295e9f7e6d.png)


## カレンダー

カレンダー機能もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/a9778552-49ce-2b58-2e43-75feff6c49a4.png)

## ドライブ

GoogleDriveみたいな機能もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/3095927f-0065-d724-cbf1-afd74e4362a0.png)

# おわりに

意外と普通にWebMailとして使えるかんじでびっくりしました。
メールに関しては中国からの送受信になるかと思っていたのですが、今回のメールは北米から来ていた様なので海外仕様のサービスなのかもしれないですね。

今後はAlibaba Cloudとの連携が出来ないか探っていきたいと思います。
s3をwebサーバにする方法

技術ブログを真面目に書こうと思い立ちましたので、とりあえず3日に1記事ぐらいを目標に書いていこうと思います。

# s3とは
awsのストレージサービスです。

# webサーバとは
webページを持っているコンピュータです。
webブラウザからwebページを見るときはこのwebサーバにページを要求していることになります。

# s3をwebサーバにする方法
s3のプロパティにある下図のメニューをonにします。
<img width="326" alt="スクリーンショット 2019-06-17 21.54.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178012/653594d4-2f2a-c7df-1bb2-84b58dbdd70f.png">

そうすると、エンドポイントが生成されるので、index.htmlとerror.htmlを指定します。
webブラウザなどでエンドポイントにアクセスすると作成したwebページが表示されます。
アクセス制限を忘れないようにしましょう。
Leetcode #240: Search a 2D Matrix II

```swift
func searchMatrix(_ matrix: [[Int]], _ target: Int) -> Bool {
    if matrix.isEmpty || matrix[0].isEmpty {
        return false
    }
    if target < matrix[0][0] || target > matrix[matrix.count-1][matrix[0].count-1] {
        return false
    }
    let columnIndex = helper(matrix[0], target)
    if columnIndex == -1 {
        return true
    }
    for i in stride(from: 1, to: matrix.count, by: 1) {
        if (matrix[i][0] > target) {
            return false
        }
        if matrix[i][columnIndex] < target {
            continue
        }
        let tmp = helper(Array(matrix[i][0...columnIndex]), target)
        if tmp == -1 {
            return true
        }
    }
    return false
}

private func helper(_ ar: [Int], _ target: Int) -> Int {
    var start = 0
    var end = ar.count - 1
    while start <= end {
        let middle = start + (end - start) / 2
        if ar[middle] == target {
            return -1
        } else if ar[middle] > target {
            end = middle - 1
        } else {
            start = middle + 1
        }
    }
    return end
}
```
windowsでLineのBotを開発してみた

https://qiita.com/nkjm/items/38808bbc97d6927837cd
の記事を参考にwindowsでLineのBotを実装してみました。

いくつか躓いた点を共有しておきます。

# 環境
Widows10 64bit

# 躓きポイント
基本的には上記記事の通りですが、記事はMac OSで実装しており、Windowsでの実行だと全く同じ通りに実行しても同じ結果にならなかった点を残しておきます

## CUIツールはPowerShellがおすすめ
過去にgitをインストールしたのと同時にgitbashをインストールしていたので、記事と同様にLinuxライクなgitbashを利用して環境構築を行いました。

ただ、gitbashですと以下のような問題がありました。

### Herokuへのパスが通っていない
記事内ではHerokuを使用するため、Herokuをインストールする必要があります。
インストールに際しては問題は発生しませんでしたが、インストール完了状態だけではHerokuへのパスが通っておらず、herokuコマンドが使用できませんでした。
なので、手動でheroku\binへパスを通すことで、git bash上でherokuコマンドが使用できるようにしました。

### Dialogflowを使用した際に、GOOGLE_PRIVATE_KEYへの設定が成功しない
Dialogflowを設定後、GCP(Google Cloud Platform)から接続キーを生成した後、GCPとHerokuをつなげる作業があります。
その際、
- GOOGLE_PROJECT_ID
- GOOGLE_CLIENT_EMAIL
- GOOGLE_PRIVATE_KEY
の３つの設定をHerokuに対して行いますが、3つ目のGOOGLE_PRIVATE_KEYの設定がうまくいきませんでした。
具体的には設定後、正しく設定が完了したような表示にはならず、文字化けしているような表示になりました。
原因はわかりません。

```bash
$ heroku config:set GOOGLE_PRIVATE_KEY='-----BEGIN PRIVATE KEY-----\nMIIEvQI～略～gZJArc=\n-----END PRIVATE KEY-----\n'
'C:\Program' ▒́A▒▒▒▒▒R▒}▒▒▒h▒܂▒▒͊O▒▒▒R▒}▒▒▒h▒A
▒▒▒▒\▒ȃv▒▒▒O▒▒▒▒▒܂▒▒̓o▒b▒` ▒t▒@▒C▒▒▒Ƃ▒▒ĔF▒▒▒▒▒▒Ă▒▒܂▒▒▒B

```


**この2つの現象は、windows PowerShellを使用することで解消します。**
PowerShellを使用すると、Herokuコマンドもパスの設定をする必要もなく使用でき、GOOGLE_PRIVATE_KEYの設定も記事の通りに設定すれば問題なく完了させることができます。



## Webhook 使用可否の設定が意図しないタイミングでオフになる
Lineにアカウントを登録し、手順通りの設定完了。
Herokuとの連携も済んで(Webhook URLの設定をした状態)いよいよ動作確認。
って時に、あれ？反応しない。ってことがありました。

どうやらWebhook URLを更新したタイミングでWebhook 使用可否の設定がオフになることがあるようです。
動作確認を行った際反応が返ってこない場合は、まずWebhook 使用可否の設定を見直すことをお勧めします。
それでもうまくいかないときは、Lineアカウントのログアウト→ログインをすることでうまくいくこともあるようです。



## 感想
LineのBotを作成するのがこんなに簡単だとは思いませんでした。
DialogflowはLineなどの各種ツールとの連携機能を備えてるので、簡易的な機能であればHerokuを使用せずに環境構築することができます。

難しいことはしたくないけど、何か作りたいって人にはおすすめ。
参考にした記事は丁寧でわかりやすいので、参考にされてください。
専門力0から３カ月で統計検定準一級を目指した話

#概要
・はじめに
・勉強期間
・勉強方法
・最後に

#はじめに
　統計検定を知ったきっかけはkaggler内で話題になっていたからです。昨今、機械学習・人工知能がもてはやされていますが、基本的には統計学の理論に乗っ取ったものも多く、また、流行り廃りが激しい機械学習分野をそのまま勉強するより、統計学方面からアプローチすることで、理解の近道になるかと思い、準一級に挑戦してみました。
　勉強を始める前の知識量はといいますと...大学では生物系を専攻したため、遠かれ近かれ、統計学に触れるきっかけは多かったのですが、如何せん、専門分野でもなく、また、大学卒業後は触れる機会が皆無だったので、忘れているところも多く、レベルは相当低かったと思います。（勉強を始める前は、二級の問題集に躓くレベルかと...）
　



#勉強期間
2019/3からスタート。


#勉強方法
　手始めに[1]を3~4周ほど、見直すことで、大学時代に勉強したことの再確認を行いました。スマートフォンでも見ることも可能ですので、移動時間などの隙間時間を有効活用しました。カンが少し戻ってきたところで、現時点での腕試しと、問題傾向の把握のためにも、[2]の二級問題集で解きました。分からなかった問題については[1]に立ち戻って調べなおす、を繰り返すことで理解を深めていきました。[1]自体が非常に分かりやすくまとまっており、また素晴らしいことに、二級の問題集の解説もついてますので、ほとんどの疑問点はここで解決しました。また問題集の片手間に[3]を繰り返し読み込むということを繰り返していきました。数式や慣れない言い回しが多いため、なかなか辛かったですが、「分からないところは飛ばす」精神でこちらも繰り返し読み返しました。[4]まで解き終われば二級レベルの範囲はほぼカバーしているかと思います。
　二級→準一級レベルは問題がかなり難化することから、数学が得意な人に教わった方が早いと思い、「すうがくぶんか」さんでの授業で対策をしてもらいました。「多変量解析・ベイズ・時系列・検出力・情報量・モーメント母関数 etc..」など、二級範囲外を中心に教わりました。東京・大阪のみでの授業になりますので、金銭的にも時間的にも大変でしたが、非常に分かりやすく教えて頂いたので、元はとれたと思います。また、大阪で開催されてます「直前対策講座」は予想問題ももらえますので、過去問が少ない準一級対策としては非常にありがたい内容になっていました。また、自習用としては、[5]を読み込みました。頻出分野であるベイズ統計の基礎固めとして、活用しました。
　最後は、[6]を繰り返し解き、対策の仕上げとしました。ただ、正直すべての過去問が理解できるまでは、到達できなかったので、分かる範囲で試験には挑みました。
　当日の振り返りとしては、やはり頻出のベイズ・時系列分野が多かった印象があり、もう少し山を張って勉強すればよかったと後悔しております。また、やはり問題の演習量が少なかったのがネックになりました。過去問が現在4年分しかない＋膨大な出題範囲のため、対策が手薄な分野は全く歯が立ちませんでした。
　結果はまだ返ってきていないですが(6/17時点)、落ちていれば来年も挑戦したいなぁ、と思っております。


[1][Bell Curve 統計WEB](https://bellcurve.jp/statistics/course/)
[2][統計検定 2級 公式問題集[2015～2017年]](https://www.amazon.co.jp/%E6%97%A5%E6%9C%AC%E7%B5%B1%E8%A8%88%E5%AD%A6%E4%BC%9A%E5%85%AC%E5%BC%8F%E8%AA%8D%E5%AE%9A-%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A-2%E7%B4%9A-%E5%85%AC%E5%BC%8F%E5%95%8F%E9%A1%8C%E9%9B%86-2015%E3%80%9C2017%E5%B9%B4/dp/4788925451)
[3][統計学入門 基礎統計学Ⅰ](https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E5%AD%A6%E5%85%A5%E9%96%80-%E5%9F%BA%E7%A4%8E%E7%B5%B1%E8%A8%88%E5%AD%A6%E2%85%A0-%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E6%95%99%E9%A4%8A%E5%AD%A6%E9%83%A8%E7%B5%B1%E8%A8%88%E5%AD%A6%E6%95%99%E5%AE%A4/dp/4130420658)(東京大学教養学部統計学教室)
[4][統計学演習](https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E5%AD%A6%E6%BC%94%E7%BF%92-%E6%9D%91%E4%B8%8A-%E6%AD%A3%E5%BA%B7/dp/4563008702)(村上 正康、 安田 正実)
[5][史上最強図解 これならわかる！ベイズ統計学](https://www.amazon.co.jp/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%BC%B7%E5%9B%B3%E8%A7%A3-%E3%81%93%E3%82%8C%E3%81%AA%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B%EF%BC%81%E3%83%99%E3%82%A4%E3%82%BA%E7%B5%B1%E8%A8%88%E5%AD%A6-%E6%B6%8C%E4%BA%95-%E8%89%AF%E5%B9%B8/dp/4816351817)(涌井 良幸、 涌井 貞美)
[6][統計検定 1級・準1級 公式問題集[2014～2015年]](https://www.amazon.co.jp/%E6%97%A5%E6%9C%AC%E7%B5%B1%E8%A8%88%E5%AD%A6%E4%BC%9A%E5%85%AC%E5%BC%8F%E8%AA%8D%E5%AE%9A-%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A-1%E7%B4%9A%E3%83%BB%E6%BA%961%E7%B4%9A-%E5%85%AC%E5%BC%8F%E5%95%8F%E9%A1%8C%E9%9B%86-2016%E3%80%9C2017%E5%B9%B4/dp/4788925486)


#最後に
　数学を一日で極めることは無理ですが、約3カ月という短期間で統計学に集中して取り組んだことは、効果的な学習方法だったと振り返ります。Pythonなどのプログラミング言語を使えば簡単に統計検定や機械学習を実装できますが、そのほとんどは中身が分からなくても結果は返してくれますので、私を含め、初心者に危険な解釈を与えてしまいます。その点を解決してくれるのは、統計学への深い理解だと思っております。今後も統計学への愛を忘れずにkaggleに挑戦していきたいと思っております。
　試験勉強で身に着けたことは再整理やアウトプットも兼ねて、今後投稿できたらなあ、と思っております。
EthereumのMultisig walletの運用(クライアント)

[Audit](https://blog.zeppelin.solutions/gnosis-multisig-wallet-audit-d702ff0e2b1e)の実績のある[Gnosis MultiSigWallet](https://github.com/gnosis/MultiSigWallet)を利用します。
今回はフロントエンド。

※事前にGnosis MultiSigWalletのコントラクトをデプロイしておく必要があります。

# クライアント
今回はMac([v.1.6.0](https://github.com/gnosis/MultiSigWallet/releases/tag/v1.6.0))をベースに説明します。おそらくWindowsやLinuxでも大差は無いかと。

## インストール

リポジトリの[リリース](https://github.com/gnosis/MultiSigWallet/releases)ページからダウンロードし、通常のアプリと同じ手順でインストール。

## 起動

起動すると以下のようなUIが表示されます。
規約への同意画面が表示されたら内容を読んで合意し、ウォレット選択画面が表示されたら *Light wallet* を選択しておいてください。

<img width="1266" alt="スクリーンショット 2019-06-18 11.22.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/51811ee7-373a-ae40-51c4-a3c8ac46f70a.png">


## アカウント
起動後、ウォレットのオーナーに登録されているEOAアカウントをアプリにインポート。
<img width="1672" alt="スクリーンショット 2019-06-18 11.27.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/dbd56c79-16d5-7264-4708-881a306b33da.png">


## ウォレットの登録
ウォレットを追加。
少々UIが異なるかもですが、 *Restore deployed wallet* の画面へ進んでください。

![addwallet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/6bd44ea8-8dd5-c8d4-ae1c-35d222dec575.gif)

## ERC20トークンの登録
![token.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/e893b98c-3df5-f327-3deb-6b8a4caa2971.gif)

## Ownerの確認
ウォレットに登録されているOwnerの確認。適切に表示名をつけておくとわかりやすい。
Ownerであれば新たなOwnerを追加することも可能。
![owner.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/d5490a08-8184-f87a-c470-21b7cf315ccd.gif)

## ERC20トークンの送信
下記のgifはweb版の操作なので少々UIが違いますが、アプリでも似たようなUIで操作可能です。
途中でパスワード入力画面が表示されたら、入力するのはEOA(ETHアカウント)のパスワードです。
![senderc20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/a566f28d-26db-f6dc-ca16-0fdac2f02452.gif)

# 備考
- macOS Mojave: 10.14.5（18F132）
JP1を使ってみてハマったこと

## はじめに

JP1を使った際にハマったことでです。
同じ轍を踏まないための参考になれば幸いです。

## 設計編

### ファイル監視

特定フォルダにファイルが作成されたタイミングでジョブを実行することができますが、監視対象のフォルダは、JP1マネージャがインストールされているPC内のフォルダが原則となります。

ファイルの監視は、JP1マネージャから見えるフォルダに限定されます。エージェント基準で監視フォルダを指定できません。共有フォルダにすれば、他のPCのフォルダも監視できますが、JP1的には推奨されていません。

アプリサーバと管理サーバが別々の場合は要注意です。


## 運用編

### 即時実行

「即時実行」を選択してジョブネットを実行した場合、カレンダーの設定は無視されます。

以下のタイミングのカレンダーを基にジョブが組まれていた場合、
　` [毎日実行]　→　[月曜のみ実行] `
計画実行した場合は、カレンダー通りに実行されますが、即実行した場合は、火曜日であっても [毎日実行] のジョブが実行された後に [月曜のみ実行] のジョブも実行されます。


##　おわりに

他に思い出したら、順次、追加していく予定です。
App Store で反映済みのバージョンテキストを取得するshell ワンライナー

# 作ったワンライナー (対象:GoogleMap)
`wget -O - -q https://apps.apple.com/jp/app/id585027354 | grep -oP "<p.*?whats\-new__latest__version.*?>.*?</p>" | grep -oP ">.*?<" | grep -oP "[^><]+"`

# はじめに
みなさんはAppStoreでのアプリの公開反映完了をどのように確認していますか？
普段の公開では１，２時間程度で公開反映完了しますが、たびたびその時間では済まないことがあります。特に最近では２ヶ月に１度ほどどこかのアプリでメンテナンス延長をしているように思えます。
公式ヘルプでは、AppStoreでの公開リクエストをしてから反映完了まで最大２４時間かかるため仕方のないことですが、ストアへの反映をユーザーと同じwebページについて監視したいものです。
[AppStoreConnectヘルプ](https://help.apple.com/app-store-connect/#/dev34e9bbb5a)

shellワンライナーは、とりあえず取得してみるには簡単なので記事に残しておきます。

# 環境
Ubuntu 18.04.1
GNU Wget 1.19.4
grep (GNU grep) 3.1

# 作り方
サンプルとしてGoogleMapのアプリについてバージョンテキストを取得してみます。

## HTML 要素の検証
Chrome の要素の検証機能でHTMLタグの形式を確認します。
[GoogleMap](https://apps.apple.com/jp/app/id585027354)

![要素の検証１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32726/c054968a-572c-79d4-4d1e-c494a65cc161.png)

![要素の検証２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32726/d77bbc5c-455b-2746-7ed4-57c06d604547.png)

`whats-new__latest__version` という名前でバージョンテキストがHTMLに定義されていることがわかります。ページソースを取得して、コレを元にテキストを切り出せば必要なテキストを取得できそうです。

### grep でスクレイピング
HTMLタグを抽出して、テキスト整形していきます。
段階をおって出力を並べるので、どの正規表現でどういった抽出しているのか見ていただければと。

```shell
$ wget -O - -q https://apps.apple.com/jp/app/id585027354 | grep -oP "<p.*?whats\-new__latest__version.*?>.*?</p>"
<p class="l-column small-6 medium-12 whats-new__latest__version">バージョン 5.19</p>
$ wget -O - -q https://apps.apple.com/jp/app/id585027354 | grep -oP "<p.*?whats\-new__latest__version.*?>.*?</p>" | grep -oP ">.*?<"
>バージョン 5.19<
$ wget -O - -q https://apps.apple.com/jp/app/id585027354 | grep -oP "<p.*?whats\-new__latest__version.*?>.*?</p>" | grep -oP ">.*?<" | grep -oP "[^><]+"
バージョン 5.19
```

この出力をテキストファイルに保存して、定期実行の前回実行と差があったら通知するなどcrontabにすることなどで定期監視機構として動かすことが可能です。

# 終わりに
あくまでwebページのスクレイピングをしているだけなため、ページの仕様変更が入った場合にはすぐにだめになってしまうものですが、手軽にできるshellワンライナーを作成してみました。
お手軽にストア監視したい方はお使いください。


# Q & A
### wget のオプション何？
`-O -` で、取得したデータを標準出力へ出しています。 `|` でgrep ワンライナーをするためです。
`-q` で、wgetを使った時に出る進捗などの途中出力を抑制しています。

### なんで curl じゃなくて wget なの？
先日まではcurlを使ってたのですが 6/12 頃のレスポンスからcurlだと中身が空になってしまいました。
元は `curl -sS https://apps.apple.com/jp/app/id585027354　略` だったんですけどね。
Sublime Text 童貞卒業のために(Windows) Part.1 導入

# はじめに
本記事は、Sublime童貞（初心者）をターゲットにしています。
非Sublime童貞は、適宜飛ばしてお読みください。
Macユーザーは、[こちら](https://qiita.com/puru_pue/items/3591cb649bb51810d41d "Qiita")。
所要時間は、10分程度です。

## こんな方に
- テキストエディタ童貞
- 初心者 or 文系の方

## 環境
- Windows 10
- Sublime Text 3 (3.2.1) 

# Sublime Text とは
- 「恋に落ちるテキストエディター」とも言われるテキストエディタ
- かなり**軽い**方です。ここは意外と大事な要素。
- **無料**。たまに課金ポップアップが出ますが、気にならない程度です。知らんけど。
- プラグインが多く、自分色に染められる。
- 無印良品かってくらいシンプルでかっこいい（カスタマイズ可）

## Sublime Text があると何がうれしいのか？
- 効率よく文章を仕上げられる（メモとか課題レポートとか、プログラムとか）
- 文字の検索、置換、補完、マクロ
- 要は、めっちゃ優秀なメモ帳です。

# インストール
まずは、公式HPからダウンロードしましょう。(http://www.sublimetext.com)
お手元のPCに適しているバージョンをダウンロードしましょう。
64bitか32bitかわからない方はこちらからご確認ください。
（https://support.microsoft.com/ja-jp/help/958406） 
![00_sublimeWin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/b5021564-0e75-db17-b14a-9f842a7a9b47.png)

Sublime Text の exe （圧縮）ファイルがダウンロードされます。
画像の通りか、[エクスプローラー](https://www.wanichan.com/beginner/pc/basis/win10.htm)のダウンロードに入っていると思います。
![01_sublimeExe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/750c943e-f06a-9f86-f65b-77ce493b05a4.png)

exe ファイルを解凍すると、インストーラーが起動します。
これからセットアップしますねっていう確認なので、「Next>」をクリック
![スクリーンショット 2019-06-17 21.22.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/ab5109ac-c20a-5f9b-39ea-fa1364038026.png)

保存場所の設定です。こだわりがなければこれも「Next>」
![スクリーンショット 2019-06-17 21.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/4b1c5dbf-8368-1ca0-c6d8-9f87cf6995e7.png)


こちらは、エクスプローラを右クリックした時に sublime のショートカットを表示するかの設定。
したいならチェックを入れて「Next>」
![02_sublimeSetUp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/004e5d91-1583-dfbc-b26b-acb4fd60a49f.png)

インスコおっけ？ -> 「Next>」
![03_sublimeSetUp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/9c20c331-4b69-361c-9316-cefa38a14243.png)

インスコdone！
![04_sublimeSetUp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/8c686190-b71f-c081-c196-45e07657e3b3.png)

さっそく Sublime Text を開いてみましょう。
デスクトップのショートカットがあればそちらから。
なければデスクトップ左下の検索バーに 「Sublime」 と入れて起動。下図参照。
![05_sublimeStart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/a13af98d-a4b1-4f14-47e8-7d81a6ef2224.png)

シンプルなのがいいですよね。

本日はここまで。
次は、実際に使いながらやっていきましょう。

お疲れ様です。

# 次回予告
- 日本語化などのプラグイン

# 参考文献
- IT用語辞典e-Words(http://e-words.jp/w/テキストエディタ.html)
- エクスプローラって何？(https://www.wanichan.com/beginner/pc/basis/win10.htm)
30 mins intro to Q/KDB+ via Python (Part 2)

# Prefix
The background of this blog is detailed here in [Part 1](https://qiita.com/jay_l/items/2683c7549f9ee5a6c736).

In part 2, we are going to cover the topics below through some sample codes in a Jupyter Notebook:

- Data types, like date, boolean and their arithmetic operations
- Data structures, like list, table and their manipulation, Q-SQL
- Lambda, vector processing

# Let's get started
[Jupyter Notebook in Github](https://github.com/baikinman111/qiita/blob/master/Q_Intro_Q_Kernel.ipynb)

# What have we achieved so far?
We learnt how to generate some data types, put them into a list, which are then accumulated into a table structure. Through the above exercise, we see how vector processing simplify and speed up the code.

# What's next
Next, to practice the concepts learnt, we are going to build a linear regression model.

# Disclaimer
- Q/KDB+ is a trademark of Kx Systems
- Installation instruction for Q Jupyter: https://github.com/KxSystems/jupyterq . I would recommend using conda.
raspberrypi setup

ICカードで施錠 https://qiita.com/carpenders/items/94d29098127faaffe1fc

```
以下のパッケージを使用する。
Raspbian Stretch Lite
Minimal image based on Debian Stretch
Version:April 2019
Release date:2019-04-08
Kernel version:4.14

pi@raspberrypi:~$ sudo raspi-config
日本時間に設定
4 Localisation Options
I2 Change Timezone
Asia
Tokyo
SSHを有効に設定
5 Interfacing Options
P2 SSH
Yes

これでWindowsからTeraTermでログインできる。

pi@raspberrypi:~ $ sudo apt-get update
Get:1 http://archive.raspberrypi.org/debian stretch InRelease [25.4 kB]
Get:2 http://raspbian.raspberrypi.org/raspbian stretch InRelease [15.0 kB]
Get:3 http://archive.raspberrypi.org/debian stretch/main armhf Packages [221 kB]
Get:4 http://raspbian.raspberrypi.org/raspbian stretch/main armhf Packages [11.7 MB]
Get:5 http://archive.raspberrypi.org/debian stretch/ui armhf Packages [45.0 kB]
Get:6 http://raspbian.raspberrypi.org/raspbian stretch/non-free armhf Packages [95.5 kB]
Fetched 12.1 MB in 41s (291 kB/s)
Reading package lists... Done
```
swiftでString型の変数に任意の文字列が含まれているか確認する

String型のcontainsファンクションを使用します。
結果はbooleanで返ってきます。

```swift

var str = "含まれてる？"

//含まれる → true
print (str.contains("含"))

//含まれない → false
print (str.contains("ない"))
```

参考 
Apple Developper contains(_:)
https://developer.apple.com/documentation/swift/string/2893238-contains
WSL2のDockerでWebサーバーを立てて、Widnows10のブラウザからアクセスする方法

Windows10のInsider PreviewでWSL2が使えるようになりました。  
WSL2ではWindows10 HomeでもDockerが使えるようになったため、実際にDockerをインストールして、動かしてみました。  
~~しかし、WSL2はホストと異なるIPが割り振られるため[^1]、Docker上でWebサーバーを動かして、ホストのブラウザから```http://localhost:80```にアクセスしてもアクセスすることができません。~~  

アップデートで`http://localhost`でアクセスできるようにアップデートできるようになりました。

## アクセス方法
Ubuntu 18.04LTSでの方法です。  
まずはdockerでnginxを起動します。(ポートは8080にしてます。)

```docker
docker run --name testweb -d -p 8080:80 nginx
```
![dockernginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310693/c783cbd9-bc95-a402-6b57-c43f0fcdbc59.png)

UbuntuのIPアドレスを調べます。(dockerコンテナの外でやってください）  

```
hostname -I
```
![hostname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310693/a16d9ecd-629c-883a-1eed-cb3e5c89dd8c.png)

表示されたIPアドレスをブラウザに打ち込むとアクセスできます。
![nginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310693/77e79026-e76c-c5e5-8234-7f96a1736184.png)



[^1]: [「WSL 2」を搭載した「Windows 10 20H1」Build 18917が“Fast”リングに](https://forest.watch.impress.co.jp/docs/news/1190081.html)
Jupyter Labで外部接続するときのとあるエラー対処

## 概要
いつも通りにjupyter labを外部接続の形で起動しようとする。

```
$ jupyter lab --ip=* --port=8888 --no-browser
```

するとエラーが起きる。これの解消方法。

```
socket.gaierror: [Errno -5] No address associated with hostname
```

## 結論

notebookのバージョンを5.6.0に変更すると正常に動く。
参考：[Jupyter notebook 5.7.0 と ~/.jupyter/jupyter_notebook_config.py で Jupyter notebook が起動しないバグ](https://qiita.com/cfiken/items/fd8b394eea5cdb68ff0f)

```
$ pip install notebook==5.6.0
```

## 原因

参考の下記エラーと同様の対処で直っているため、jupyter labextensionのインストールの準備の際に<code>$ pip install -U jupyterlab</code>をしていて、一緒にnotebookのバージョンを5.7.0に上げたうっかりが原因とみられる。

```
socket.gaierror: [Errno -2] Name or service not known
```