OmniAICreator/Qiita-1.07M huggingface dataset:
Slack API 旧Permission Scopeのマイグレーション

今年の２月だったかにSlack APIがgranular scopeとかいう新しいスコープ体系に移行して以来、新しいのは作ったことあったけど、昨日初めて古いのをマイグレーションしてみた時詰まった部分のメモ。

## 1.Slack API管理画面の「OAuth & Permissions」でアップデートを選択
Scopeの欄にデッカく「アップデートせよ」と警告が出ているので、それをクリック

## 2.Botトークンを指定する
基本的に新しいAPIアプリはBotトークンを使い、「ワークスペースに新規に追加されたBotユーザーとして」実行されるというのがコンセプトなので、今まで使っていたスコープを選ぶ。
でも選ばなくてもあとでまた追加できるから多分大丈夫。

## 3.userトークンを指定する
調べてみると、userトークンで実行できるメソッド驚くほど少ないので、あまりに気にしなくて良いと思います。
私は今のところリマインダーを自分のリマインダーリストに登録するためのモーダルを作った時にだけ使用した。

## 4.からのマイグレーション確定
`Please ensure that your app does not require the RTM API, as it is no longer supported with granular scopes.`
とかアラートが出ます、RTM APIはもう使えないそうです。

## 5-1.あれ？そのまま素通しでマイグレーション出来てしまった
改めて今日使ってなかった何に使ってたかも分からないテストBotをマイグレーションしてみたんですが、マイグレーション後何も表示されずにマイグレーション出来て（？）しまいました。
使ってるスコープによって変わるのかな？？

しかし本題はここからなので、昨日のことを思い出してメモします。

## 5-2."app’s authentication URL" とやらが発行される
確かマイグレーション確定後にモーダルかなんかでマイグレーション後の情報が出るのですが、その中に
>Change your app’s authentication URL to look like this:
>https://slack.com/oauth/v2/authorize?client_id=**********

と書いてあります。なんだかよくわかりませんがとりあえずコピペしておきます。
これ後からどこで見るんだろう、ここでメモしとかなかったら後でどうなってたんや、怖…

## 6."app’s authentication URL"をOAuth & Permissionsの「Redirect URLs」欄に加える
管理画面の見た目上はマイグレーション出来たっぽかったので、実際にワークスペースでスラッシュコマンドを使ってみると「not_authed」というエラーレスポンスしか帰ってこない、おぉ…

なので公式のそれっぽい案内ページをざっと見たのですが、乏しい英語力で結局このURLをどこにどうすれば良いのか分からず詰まる。
https://api.slack.com/authentication/oauth-v2
今元気がないのでちゃんと読んでないですが、**Asking for scopes**の下の方にそれっぽいことが書いてある…？

結局この記事を見て、試しに「Redirect URLs」を追加したら無事認証が通りました。めでたしめでたしです。
https://qiita.com/dbgso/items/a95a3364d9a8c67f3387
VSCode利用指針：拡張やWorkspaceを意識的に利用する


# 利用指針

- 拡張は共通の場所（デフォルトの保存先）にインストールする。（拡張ファイルのサイズが大きいため共有する）
- 個別のWorkspaceごとに、不要な拡張を指定する（--disable-extensions）
- Webの開発のように複数のプロジェクト(フロントとバックなど）がある場合は、workspace、multi-rootを利用する。
  [ワークスペース名].code-workspaceファイルからWorkspaceを開く。
- 設定は、おそらくユーザーにとってはプロジェクトをまたいでも利用設定は同じなので、userに保存する。
- 設定は(settings）は端末間で共有をする。（SettingSyncなどの拡張を利用する）

# 利用手順

## VSCode自体の初回設定

- userのsettingsをクラウドなどから取得（SettingSyncなどの拡張を利用する）
- 言語別のデバッグや実行設定(launch）、ビルドなどのタスク設定（task）もクラウドから取得。

## workspace初回

- workspaceなどの設定。対象プロジェクトディレクトリの設定。(code-workspaceファイルに記載）
- 必要な拡張の選定、インストール。

## 2回目以降

- 無効拡張の指定と、code-workspaceファイルの指定をして起動。


# 実施方法

- 手動ではなく、コマンドラインツールやスクリプトにより上記を実施する。
GALプログラマできた

オリジナルのコードはWindows用で1ファイルに長々と書いてあったので、バラしました。

https://github.com/yamori813/galprog

FTDIのD2XXライブラリを利用してMac OS X El Capitanでビルドして試しています。

1バイトごとのBitBangで遅いのですが、そもそもGALの書き込みはあまり早くできないようです。

メンテされているATFBLASTではなくてManfred Winterhoffさんのオリジナルをベースにしています。これはGAL6001が必要だったためです。なんで消しちゃったのかな。。。

GAL6001は日米商事で以前8つ手に入れました。

![写真（2020-06-09 17.22）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7ad1adae-56a0-a77a-4ae1-bdafafb06698.jpeg)

開発環境はWindows 7にインストールしたispLever Classic 1.6なのだが、最初2.0をインストールしてライセンスキーをコピーしても有効にならず、1.6を試しても同じ状態でWindowsを再起動したら正常にライセンスキーが認識された。2.0でもいけたのかもしれないが、面倒なので1.6のままにしてある。

プロジェクトを作ってVerilog書いてみます。

![Gal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/376cb9b9-b26e-ca72-cd20-bc9fcd0038dd.png)

Select DeviceでShow Obsolete DevicesをチェックするとGALが表示されるようになります。

```verilog
module test(
input i1,
input i2,
output o1,
output o2
);


assign o1 = i1 & i2;
assign o2 = ~i1 & i2;

endmodule
```

JEDECファイル生成します。

```
ispLEVER Classic 1.6.00.07.29.12 Lattice Semiconductor Corp.
JEDEC file for: P22V10G V9.0
Created on: Tue Jun 09 19:56:58 2020

*
QP24* QF5892* QV0* F0*
 X0*
NOTE DEVICE NAME: GAL22V10D-10LP*
NOTE Table of pin names and numbers*
NOTE PINS i1:1 i2:2 o1:14 o2:23*
L0044 11111111111111111111111111111111111111111111*
L0088 10110111111111111111111111111111111111111111*
L5368 11111111111111111111111111111111111111111111*
L5412 01110111111111111111111111111111111111111111*
L5808 11000000000000000011*
C15D6*
75A7
```

40年前に作ったロジックテスターで確認してみます。

![写真（2020-06-11 8.08）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/fbb72595-023e-9a96-074a-4e15c4edf528.jpeg)


|i0:1|i2:2|o1:14|o2:23|
|:--|:--|:--|:--|
|1|1|1|0|
|1|0|0|0|
|0|1|0|1|
|0|0|0|0|

![GAL22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/89867c7d-369c-6253-9739-18b042ffe396.png)


ちゃんと焼けてるようです。

inputとoutputがどのようにアサインされるかわかりません。JEDファイル見るしかないのかな。そんなわけないよな。

QiitaにVerilogの初心者向けの解説があり大変参考になります。

https://qiita.com/thtitech/items/8cc898dda7a10780f495

https://qiita.com/mmitti/items/b9830632291dab70a724

GAL6001も使えるようにしてみました。GAL22V10とP/V-が入れ替わっています。

![写真（2020-06-13 10.05）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f9478d70-0c8d-0b05-7614-fc31f4245775.jpeg)

PLCC 28pinのソケットのbottom viewはこうなってます。

![PLCC28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/38b3bba2-7c58-16ae-ca32-da76038a268e.png)


ジャンクなので、何か焼いてあったので消しました。GALの書き込みは100回くらいまでのようです。

安物のPLCCのソケットはドライバーなどで抜き取っていると割れてしまうことがあるので、注意が必要です。

20V8の変換基板も作ってみました。

![Fcvd0-kacAE_e_8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4aac87a1-94d1-5f32-49cf-adaf000b3c71.jpeg)

16V8のソケットも付けてみました。

![写真（2024-11-10 16.03） #2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f7fbfbf9-892e-bb6b-1b69-de6963ab8150.jpeg)
?とundefinedの微妙だけど大切な違い

パラメータがundefinedでも良い場合、?を使うケースと、undefinedを型定義に含めるケースがあると思います。これ、同じ意味だから前者が良さそうに見えて、ちょっと挙動が違います。

```typescript
export type Sample = {
    str1?: string,
    str2: string | undefined
}
```

str1はキーとして存在しなくていいです。
str2は「undefined」という値を設定する必要があります。


たとえば、下記のコードは'str2' is missing in typeエラーになります。


```typescript
const a: Sample = {
}
```

str2を指定すれば、str1は書かなくても大丈夫です。

```typescript
const a: Sample = {
    str2: undefined
}
```

どっちでも良いように思えますが、実はこれが結構重要な違いになる場合があります。
下記のように各パラメータを変数に入れている場合、str2の指定を忘れるとコンパイラーが警告してくれますが、str1については警告されません。

```typescript
const str1 = undefined
const str2 = undefined

const b: Sample = {
    str2
}
```

nullとundefinedと?。
やはり無とは難しいものですね。
(初心者)touchdesigner top 自分なりの語彙力でまとめてみた

授業の備忘録として毎週更新しようと思う。
##6/10 RGBカメラ
・video device in TOP: カメラ
・Monochrome TOP : 名前の通りモノクロに表示してくれるもの
・Lookup TOP : 入力画像の色を置き換える。
・Ramp TOP : グラデーションの色を自由にいじれる。画像に結びつけると変化する

カメラの画像(Video Device In TOP)
＋変化させたい色(Monochrome TOP/Ramp TOP)
＝(Lookup TOP)
出力(out TOP)

・edge TOP :  輪郭線が白色で出る
・thresh1 : 明るいところと白いところを塗り分ける

__________________________________________________________
##6/10 zigsim(無料版)

zigsim　概要

senser
プレッシャー：気圧
GPs：居場所
２dタッチ：スマホのどこ触ってるか
3dtouch：うちのケータイ使えへん

start
実行

settings
どのPCにどうゆうプロコトルで送るか

localfile:
スマホ内に保存する？唐様とあんま無い
udp:データ投げるのはやいがエラーテェックしないのでデータロストの可能性
tcp:エラーテックしてるのでその分遅い、UIをクリックした時など
IP ADRESS
TouchDesignerを動かすPCのIPアドレスを入力します。
IPアドレスとは、ネットワーク内の端末の番号です。192.168.1.10、192.168.10.200とか。
PORT NUMBER
送り先のポート番号。10000と設定してください。
ここで入力した値をTouchDesignerにも設定します
オフラインのイベントの参加時は、他の人のポート番号を確認しないといけない、データの行き来がごちゃごちゃる
MESAGE FORMAT
データのフォーマットです。OSCを選択してください。
MESSAGE RATE（PER SEC）
データを送る頻度です。10を選択してください。
より頻繁にデータが必要な場合は、高い値に変更できますが、ネットワーク負荷が高まります。
IPアドレスとポートについて
ZIGSIMはローカルネットワーク内の端末同士で使用します。4G回線でつながっているスマートフォンからは、アクセスできません。
ローカルネットワーク:同じ名前のワイファイを共有してる機器

IPアドレスとは？
https://www.cman.jp/network/term/ip/　

OUA Wifiは、端末間の通信が制限されています。大学でZIGSIMをつかうには、大学のネットとは別にルーターを用意し、ネットワークを作る必要があります。
1つの端末には1つのIPアドレスが割り当てられますが、PCには複数のアプリを立ち上げる事ができます。アプリが無関係なデータを受け取らないようにするために、アプリ毎にアクセスを許可するポートを設定します。TouchDesignerでは10000が標準設定になっているので、ZIGSIGでは10000を指定。

ipアドレス検索
Macの場合
[システム環境設定] > [ネットワーク] > [詳細] > [TCP/IP タブ] の IPv4アドレス
Windowsの場合
[スタート] > [設定] > [ネットワークとインターネット] > [Wifi] > [接続しているSSID]  下にスクロールし、プロパティの項目の中の　IPv4 アドレス 

lag:動きを滑らかにする
conect mesh: メッシュになる
trail : 残像が残るようにする
resulyt type を　connect as meshに

ブルーム：光っているように見える（パレットにある）
palette/derivative/magefilter/bloom

__________________________________________________________
##9/03 _Houseinmapping
三ヶ月ぶりだ、、
https://www.youtube.com/watch?v=MFeioB9bbuM&t=370s
以上のtutorialを製作中

Resample CHOP
シーンの開始終了を定めたり、時間伸縮させたりして、チャンネルを再サンプリングすること？？？
使用は　New Rate, New Interval / newint　
http://ted-kanakubo.com/touchdesigner-jp/?p=136
railsで「rails-ujs」を使った非同期通信

## 実装イメージ

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72869/10d26b96-1ecf-fd62-7035-6e7d3e2c5246.gif)


「こんにちは」ボタンを押すと「上のボタンを押すとメッセージが変わるよ！」のところが「こんにちは」に
「こんばんは」を押すと「こんばんは」にページ遷移せず変わります。

## さくっとコード

装飾のコードは抜いています。

```ruby:config/routes.rb
Rails.application.routes.draw do
  get '/example', to: 'example#index'
  post '/example/greet', to: 'example#greet'
end
```

```ruby:app/controllers/example_controller.rb
class ExampleController < ApplicationController
  layout "application"

  def index
    @message = "上のボタンを押すとメッセージが変わるよ！"
  end

  def greet
    @message= params[:greet]
  end
end
```

上記のlayoutはrails-ujsを使えるやつで
最近のrailsだとデフォルトで使えるはず。。。知らんけど。。。。。


```slim:app/views/example/index.html.slim
h1 rails-ujs使用例

/ link_toで実装
= link_to example_greet_path(greet: "こんにちは"), method: :post, remote: true do
  p こんにちは

/ form_withで実装
= form_with url: example_greet_path, remote: true do
  = hidden_field_tag :greet, "こんばんは"
  = submit_tag "こんばんは"

#js-greet
  = render partial: "greet"
```

```slim:app/views/example/_greet.html.slim
p = @message
```

```erb:app/views/example/greet.js.erb
document.querySelector("#js-greet").innerHTML = "<%= j(render partial: "greet") %>"
```

## 解説
厳密さにかけているかもです、なんとなく察してください:blush:
formやlinkにremote: trueをつけると非同期でcontrollerのgreetメソッドを経由しgreet.js.erbが実行されます。
このサンプルのgreetメソッドはparamsを変数に入れているだけですが、
modelを操作して結果を返すのが主になると思います。
PHP5.x から PHP7.x で pg_send_query pg_get_result  挙動 変化




以下のコードは、PHP5.xでは ``not busy`` が表示されますが、PHP7.xでは、``busy!`` が表示されます。


```php
$connection_string="host=foo port=5432 dbname=bar user=hoge passowrd=fuga";

$dbconn = pg_connect($connection_string);

$sql="select now();";

pg_send_query($dbconn, $sql.$sql);
$result = pg_get_result($dbconn);

if(pg_connection_busy($dbconn)){
	echo "busy!";
} else {
	echo "not busy";
}

```

PHP7.xでは、まだ``pg_get_result``で取り出していない結果がある場合、busy と判定するようになったようです。
これ、PHPの互換性のない変更履歴を追っても載ってなくてはまりました。
※どこかに載っていたらぜひ教えてください:pray:

ニッチだと思いますが、それだけにはまると解決に時間を要します。
``pg_result_error`` でもエラーも出ず(そりゃそうだ)、解決までだいぶ苦労しました。

お気を付けを。
jupyter notebookで NotADirectoryError: [Errno 20] Not a directory: 'xdg-settings'が出たときの対処法

## 実行環境
- Mac Catalina
- python=3.8.1
- jupyter-notebook=6.0.3
- anacondaの仮想環境を使用

## エラーの中身
jupyter notebookを開こうとしたら以下のようなエラーが出た。

```
......
NotADirectoryError: [Errno 20] Not a directory: 'xdg-settings'
```

## 改善方法
1. エラー文に含まれている`webbrowser.py`（絶対パスが書かれてるはず）を開く。
1. `webbrowser.py`の中で`xdg-settings`を調べる。（自分の環境では534行目）
1. そこから少し上（自分の環境では15行上）にある`if sys.platform[:3] == "win":`を`elif sys.platform[:3] == "win":`に変更する。
1. 変更を保存後、再度jupyter notebook を実行すると開けるようになっている！！


## 参考文献
- https://github.com/jupyter/notebook/issues/3746
教養としてのコンピュータサイエンス ノート

#教養としてコンピューターサイエンス講義 ブライアン・カーニハン著
##前書き
立派なソフトウェアエンジニアになるために読んでいる書物
・やること
基本は上記の本で済ます。
・やらないこと
PC作ったり、ラズベリーパイで何か勉強のためにしたり、IOTを勉強のために何かしたりはしない。
資格は否定しないが資格の勉強に力を注ぎすぎない。

##コンテンツ
・用語ノート
・TakeAway　知っておくと便利だと思われるもの
##用語ノート
メガ：１００万 １０の６乗
ギガ：１０億 １０の9乗
テラ：１兆  １０の12乗
RAM:ランダムアクセスメモリー
SSD:ソリッドステートディスク
バス：
論理ゲート
離散値：連続していない（非連続な）状態である値のこと
ビット：
バイト：１バイトは８ビット
キャッシュ：
パイプライン：パイプライン処理とは、マイクロプロセッサ（MPU/CPU）内部での命令実行方式の一つで、一つの命令を複数の段階に分割してそれぞれを別の回路で実行する方法。
帯域幅：通信速度
モデム：アナログ信号とデジタル信号を相互に変換する機械
イーサネット：規約
テザリング：
プロトコル：情報の形式, コンピュータ間での交換方式,コンピュータの識別方式と認証方式、問題が起きた時に何をすべきか？
ゲートウェイ：
ルーター：
パケット：
IPアドレス：
ドメイン名：
DNS:
DHCP：
ルートサーバー：
ネームサーバー：
ルーティング：
IP:個々のパケットがフォーマットされ、送信されるか
TCP:IPパケットをデータストリームとして結合し、サービスに接続する方法
TelNet:
SMTP:
Form
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
本文にはないが必要だと思われるもの。
論理設計
物理設計
##TakeAway
###閏年判定
西暦年が4で割り切れる年はうるう年
ただし、西暦年が100で割り切れる年は平年（うるう年ではない）
ただし、西暦年が400で割り切れる年はうるう年
###秒から日までを割り出すもの
秒を６０でわる・・・分数→あまりは秒
↓
結果を６０で割る・・・時間→あまりは分
↓
結果を２４で割る・・・日数→あまりは時間
###２バイトと３バイトの文字数であるということ(タイトルのみ）
###線形アルゴリズムで気をつけること
リスト：データ構造
紙に文字が書かれてない場合。/初期化
計算(0割)　
印刷
アルゴリズムは最後に停止しなければならない。
###Z=X+Y(タイトルのみ）
###プログラムが行なっていること。
・入力データの読み取り
・計算の実行
・計算途中での値の保存と取得
・それまでの計算に基づいた処理の進め方の決定
・途中結果の表示
・計算が終了した時の保存
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
本文にないが必要だと思われるもの。

・マイナスの場合
・型が違う場合
・０の場合
←　IFでガード。

###WorldWideWeb
##URLの4大要素
HTTP
HTML
ブラウザー
Cannot apply expression operators to method bindingとなった時の対応方法


- 環境
    - CentOS Linux release 7.8.2003 (Core)
    - Eclipse IDE for Enterprise Java Developers Version: 2020-03 (4.15.0)
    - openjdk version 11.0.7

# 事象 : JSFの「!(否定)」でなぜか怒られている

```xhtml:hoge.xhtml
<h:commandButton styleClass="btn hidden_btn"
  value="#{controller.labelBean.selectBtnLabel}"
  rendered ="#{!controller.isDispSelectBtn(index)}"> <!-- ここがエラー対象 -->
```

```text:エラーメッセージ
Cannot apply expression operators to method binding
```

# 原因 : 書き方がいまいち？
英語のサイトが多くていまいちちゃんとした原因わからず。
誰か説明してほしい・・・

## 対応1 : メッセージを非表示にする
既存のプロジェクトでの問題なので今回はこの対応

1. [Window] > [Preferences]でダイアログを開く
1. [Web] > [JavaServer Faces Tool] > [Validation]
1. [General Problems]にある[Applying method operator to binding]で「Ignore」を選択
1. [Apply and Colose]ボタンでダイアログを閉じる

## 対応2 : 書き方を変える
以下のサイトを参考に書き方をちょっと変える。

- [validation - Eclipse Facelet HTML Validator: Cannot apply expression operators to method bindings - Stack Overflow](https://stackoverflow.com/questions/20928595/eclipse-facelet-html-validator-cannot-apply-expression-operators-to-method-bind/26237263)
- [validation - Eclipse gives too many false errors and warnings on EL expressions in JSF files - Stack Overflow](https://stackoverflow.com/questions/28605864/eclipse-gives-too-many-false-errors-and-warnings-on-el-expressions-in-jsf-files)
nwdiagオフラインインストールで困ったこと

# nwdiagオフラインインストールで困ったこと

会社環境に[->nwdiag](http://blockdiag.com/ja/nwdiag/index.html)を設定した際つまづいたのでメモ。

## 作業環境
* OS
  - Windows 10 Enterprise(build 17763)
* 最終的なソフトウェア環境
  - Python 3.8.3(Windows版)
  - pip 19.2.3
  - pillow 6.2.2(CP38 x64)
  - 他依存関係にあるものは2020年6月5日時点の最新版

## やったこと
自宅のオンライン環境であれば、`pip install nwdiag`コマンド1行でインストール完了となるのですが、制限がある会社環境上そうはいきません。

上記コマンドを打つと、プロキシサーバとの接続タイムアウトとなるため、まずプロキシを突破しようと試みます。

```
## 中略 ## Connection to "プロキシサーバ" timed out.
```
とりあえず、自動構成スクリプトファイル(.pac)から、プロキシサーバのIPとポートを確認して、プロキシサーバを指定した状態で再度pipコマンドを発行します。

しかし、状況は特に変わりません。

もうこれはどうしようもないので、依存関係にあるもの全てをダウンロードして、以下コマンドで手動インストールしていきます。

```
# インストールコマンド
python -m pip install hogehoge
```
[->Pythonパッケージのダウンロード元](https://pypi.org/)

意外な程順調に事は進みますが・・・・Pillowの出現により作業が難航します。

## エラーと解決策

blockdiagのインストールに必要な、「Pillow-7.1.2-cp38-cp38-win_amd64.whl」をインストールする際に以下エラーが発生しました。

```
## 中略 ##
The headers or library files could not be found for zlib,
a required dependency when compiling Pillow from source.
```

pythonやpipのバージョンダウンやら、zlib等のインストールを試しましたが、結果は変わりませんでした。

数日試行した結果、[->githubのissue(英語)](https://github.com/python-pillow/Pillow/issues/4242)にあったPillowのバージョンダウンを試したところ、Pillowのインストールに成功しました！

* インストールできたPillowパッケージ
 - Pillow-6.2.2-cp38-cp38-win_amd64.whl

もし同内容で困っている方の一助になれば幸いです。(あまりいらっしゃらないと思いますが・・)

以上
ReactNative propsを利用せずに別クラスから別クラスに値を渡す方法

# React Native Event Listeners

#　用途

別クラスから別クラスに値を渡す際に使用  

# なぜ使用したかったか？
* Aクラスで使用していた変数をBクラスでも使用したい
* 変数１つのためだけに、コンポーネントを呼び出すことはしたくない

# 使用例 
* ボタンを押したら `no data`のテキストを`it works`に変える処理

```
import { EventRegister } from 'react-native-event-listeners'

/*
 * RECEIVER COMPONENT
 */
class Receiver extends PureComponent {
    constructor(props) {
        super(props)
        
        this.state = {
            data: 'no data',
        }
    }
    
    componentWillMount() {
        this.listener = EventRegister.addEventListener('myCustomEvent', (data) => {
            this.setState({
                data,
            })
        })
    }
    
    componentWillUnmount() {
        EventRegister.removeEventListener(this.listener)
    }
    
    render() {
        return <Text>{this.state.data}</Text>
    }
}

/*
 * SENDER COMPONENT
 */
const Sender = (props) => (
    <TouchableHighlight
        onPress={() => {
            EventRegister.emit('myCustomEvent', 'it works!!!')
        })
    ><Text>Send Event</Text></TouchableHighlight>
)

```
# まとめ
* `EventRegister.emit()`と、`EventRegister.addEventListener()`は`セットの関係`
* 関数の第一引数は`emitとaddEventListennerを繋ぐuniqキー`,第二引数は`emit→addEventListennerに渡すデータ`
* addEventListennerを呼び出した後は`removeEventListenner`を呼び出して消す？

# 参考
https://github.com/meinto/react-native-event-listeners
EC2について

#前提
EC2について学んだことを書いていきます。

#本題

#キーペアとは
EC2インスタンスへログインするために使用する秘密鍵、公開鍵のペアのこと。
作成したEC2インスタンスに誰でもログインできたら困るため、キーペアというのを作成し、ログインの管理をする。

公開鍵で暗号化したデータは秘密鍵でしか開けることができない。
秘密鍵は拡張子が.pem形式のファイルとなっている。
ダウンロードして厳重に管理し、外部からアクセスできない場所に保管する。

#インスタンスメタデータ/ユーザーデータとは

##インスタンスメタデータ
例えば、
ruby/python/bashなどのプログラムの作成時に、EC2インスタンス自身のIPアドレスや所属しているサブネットなどの情報を直接書いてはいませんか？
これではプログラムを使い回せないので、効率的な方法をとりたい。

EC2インスタンスに埋め込まれている自分の情報

EC2インスタンスには自身の情報が埋め込まれており、EC2が起動中の場合、このようなcurlコマンドで自身の情報を取得できる。

```
curl http://169.254.169.254/latest/meta-data/
```
例えば、使用しているAIMのIDやローカルのIPアドレス、所属しているサブネットIDなどが取得できる。
このシェルをコピーして、chmodで実行件を与えて実行するとインスタンスメタデータの一覧が出てくる。

##ユーザーデータ
インスタンス起動時に一回だけ実行するスクリプト
インスタンス起動時にソフトウェアを最新化するなど、スタートアッププログラムのようなものがあれば便利。
インスタンス起動時に一回だけ実行するスクリプトがユーザーデータ。
基本的に再起動ではないことに注意が必要。
rootユーザーで実行される。
インタラクティブではない。

##Cloud-init
クラウド系インスタンスの初期構築を手助けするオープンソースのアプリケーション
AmazonLinuxにはデフォルトで/etc/cloud/配下に設定ファイルが存在し、インスタンス作成時にどういった動きをするか指定できる。

#プレイスメントグループとは
複数のEC2を論理的にグルーピングすること。
例えば、高度な演算処理を実現するために、複数のコンピューターを統合して処理する方法がある。
こういったものを実現するためにはコンピューター同士の通信に遅れがあることは致命的。
AWSの場合、物理ホスト上でEC２が起動され、他のアカウントと共有になるため、クラスター処理に向いていない。
こういった場合にプレイスメントグループ機能が役立つ。
AZやリージョンを跨ぐことはできない。
あくまでも同じAZ内で有効。

##クラスター
HPC（ハイパフォーマンスコンピューティング）などの複数のコンピューターを統合して高度な演算処理に向いている。
この塊をクラスターといい、これに所属しているコンピューター1つ１つをノードと呼ぶ。
AWSでは拡張ネットワークサービスの使用を推奨している。

例えば、ENA（Elastic Network Interface）。
EC2のネットワーク速度をあげることができる。
AmazonLinuxではデフォルトでENAモジュールが入っており、AWS CLIコマンドで有効かされているか確認できる。
これによりさらにノード同士のネットワーク遅延を低く抑えることができる。
基本的には同じAMIで使用すること。

##パーティション
グルーピングを個別のラックでグループ化するといったもので、このようなハード障害を防止することができる。

##スプレット
個々のEC2を独立したラックに配置する。これがスプレット。
１つのAZにつきEC２を７つまで。
１つのリージョンにつきAZを３つまで。
合計21個のEC2を配置できる。

#Dedicatedホスト/インスタンスとは
AWSの物理サーバーのリソースを占有できること。
通常AWSの物理サーバーは他のアカウントと共有している。
これはコンプライアンス違反になる可能性がある。

例えば、HTPAA（医療データを電子化する際のルール）
大きくいうと２つ。
Dedicatedホスト、またはDedicatedインスタンス
両方、専用のAWSホストサーバーを確保できるという点
他のアカウントとの共有はないということは一緒。

###DedicatedホストとDedicatedインスタンスの違い
ライセンスの持ち込みにある。

Dedicated hostはクラウドが盛り上がり始めた頃の課題で、オンプレからクラウドに移行するのにハードルだったライセンス移行の問題をクリアする目的があったためと思われる。

※１つのリージョンでタイプを問わずDedicatedインスタンスが1つでも稼働している場合、1時間あたりの追加料金おおよそ1時間につき2ドルのコストが余計にかかる。
navbarが対応していないので Sage 9 friendly Bootstrap 4 Navwalker を使ってみる

# デフォルトでは Bootstrap の Navbar に対応していない

めんどくさっ。
スターターと言うんだったら初めから対応しててよね。
と思いながら調査開始。

## Sage の掲示板？を検索してみる

Sage の掲示板？
https://discourse.roots.io/

検索してみると、みなさんsage-bootstrap4-navwalker なるものを使用しているみたい
ありがたく使わせてもらう

https://github.com/MWDelaney/sage-bootstrap4-navwalker

> composer require "mwdelaney/sage-bootstrap4-navwalker"

うんともすんとも言わないので焦ったが、３分ぐらい経ってからインストールが始まったw
なんか言ってくれ。

あとはGoogle先生に翻訳してもらって設定

## 動いたけどCSSが当たってないようだ。

ソースを見ると navwalker の元ネタのURLが掲載されていたのでそちらへジャンプ！

https://github.com/wp-bootstrap/wp-bootstrap-navwalker

こちらもGoogle先生に翻訳してもらって設定

なんとか反映されました。
めでたし。
Vimまとめ〜ターミナルソフト TerminatorでVimをIDEっぽく使う〜

### 環境

- OS : Ubuntu 18.04 LTS
- Vim : VIM - 2:8.0.1453-1

---

## TerminatorでVimをより便利に

Vimは動作も軽く、ターミナル上で使えることからちょっとしたコードの編集にも、設定などによっては、IDE(統合開発環境)のような使い方も可能です。

Vimをより便利に使えるターミナルソフトがTerminatorです。

Vimを使う上でUbuntuプリインストールの端末を使うと、ファイルを編集しながらコンパイルして実行するという作業をする際に、Vimでファイルを編集し保存しVimを閉じたあと、コンパイルや実行をコマンドで実行することになります。

複数ウィンドウを開けば、編集中のファイルを表示させたままコマンドを実行することも可能ですが、ファイルの数が増えれば増えるほど非効率になってきます。

Terminatorを使えば、画面分割機能によってひとつのウィンドウ内に同時に複数の端末を並べることができ、一方でVimを開いてファイル編集し、他方でコンパイルや実行等のコマンド入力を行えるため、テキストエディタATOMにターミナルパッケージを使ったような感覚で使えます。

---

## Terminatorのインストールと設定

### インストール

Ubuntuソフトウェアからインストール可能です。

### 設定
Terminatorを開くと表示されるウィンドウを右クリックするとダイアログボックスが表示され設定画面が開けます。

以下の通りに設定することで、デフォルトの端末と同じ見た目で使うことができます。

- 設定
    - 一般
      - Window State = 通常
      - ”システムの固定幅フォントを使う”からチェックを外す
      - Font Family = Ubuntu mono
      - Font Size = 13
    - プロファイル
        - 一般
          - ”タイトルバー表示”からチェックを外す
          - 端末のベル：”タイトルバー・アイコン”にのみチェックを入れる
        - 色
          - "システムテーマを使う"からチェックを外す。
          - "文字と背景","パレット"の設定を”Anbience”に設定。

## 簡単な使い方

画面分割やタブ切り替え等は、マウス右クリックで表示されるダイアログボックスで選択することで使用可能です。

※ショートカットキーを使うことでもっと便利になるかもしれません。私自身まだ勉強不足なのでマウス操作で使ってますが、後々まとめていけたらと思います。

---

### 本記事目次ページ

- [Qiita:Vimまとめ](https://qiita.com/tsweblabo/items/574a363f52116ff64633)
Rreact + Expo + TypeScript で　createStackNavigator を使うために

# typeScriptで構成されたreact+expoのreact-navigationの詳細とreact-navigation-stackにcreateStackNavigatorが定義されていることの確認

## directory
node_module/react-navigation/typescript/react-navigation.d.ts
### version
Type definitions for react-navigation 3.0.0

上記ファイルの中で、createStackNavigatorが定義されていませんでした。

## 対処方法
### command

```
npm install --save react-navigation-stack
```

react-navigation-stackをインストールします。

## directory
node_module/react-navigation-stack/src/index.tsx

##
index.tsxのなかでcreateStackNavigatorが定義されていることを確認できました。
Amazon Workspaces『に』リモートデスクトップする。

#AWSでOfficeソフトを利用するには
完全閉域網下でOfficeソフトをAWS上にて最安で使いたい方以外はブラウザバックしてください。

EC2インスタンスにOfficeをインストールするには、Dedicated Hostsまたはハードウェア占有インスタンスでないと持ち込めないので、通常はOffice込みのWorkspacesを利用する形になります。

参照元:[自分の Office ライセンスを AWS で使用できますか?](https://aws.amazon.com/jp/windows/faq/#byol-office)

ここに一つ問題がありまして、Workspacesは専用アプリから**代理サーバー経由でPCoIPによる接続**をします。
ここの経路は**インターネット接続かつAWS管理のリソースとの疎通**になる為、**閉域網が絡んだ構成**だと完全なローカル環境として提案することができません。

![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/a652f5b8-fe27-b348-3af5-fd7e9d1f5e6a.jpeg)

#コロンブスの卵
**「じゃあ、リモートデスクトップすれば良くない？」**
**「いやいや、話聞いてました？Workspacesは専用アプリからPCoIPでですね…」**
**「できるよ」**
**「え？」**
**「できるって」**
###マジで？

#やってみた
適当にWindowsのEC2(閉域網下の端末相当)とSimpleADとWorkspacesを用意します。
必要な設定は、Workspacesに設定されているSecurityGroupに以下、
EC2のローカルIPからRDPを許可するルールを1つ追加します。
(通常時はインバウンドに何も設定されていません)

![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/5136c872-932e-7c5e-18fd-8284921b9e77.jpeg)

この状態で、EC2からWorkspacesのローカルIP宛てにRDPすると･･･

![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536700/89b3443a-5ae6-7baa-4c05-da98524f4dc4.jpeg)

###繋がるやんけ!!!!

#まとめ
**WorkspacesはRDPでもつなげることができます。**＝専用アプリでしか使えないサービスという訳ではない。
もっとも、インターネット接続下では専用アプリを使用した方が手軽にセキュアなリモート環境が使えますし、
RDPよりPCoIPの方が転送速度が速いです。

**「完全閉域網でWorkspacesを利用したい!!」**という、
きわめてニッチな要求に対してはこの設定が役立つかもしれません。
(私は実際役立ちました)
leet code Palindrome Number(easy)

Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.

##brute force
```python
class Solution:
    def isPalindrome(self, x: int) -> bool:
        for i in range(len(str(x))):
            x = str(x)
            if x[i] != x[len(str(x))-i-1]:
                return False
        if int(x) < 0:
            return False
        else:
            return True

```

##bit faster solution 
```python
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False
        if str(x) != str(x)[::-1]:
            return False
        else:
            return True
```
eclipseでフォルダ移動とかでミスって「tomcat サーバ構成をロードできませんでした」とかエラーになって起動できなくなった場合

## 起こったこと
ワークスペースから、プロジェクトフォルダを別の場所へ移動させようとしたら、Serviceフォルダまで移動してしまって、
その後にサーバ実行しようとしたら、「サーバ構成をロードできません」って言われた。
もちろん、ミスって移動させてしまったServiceフォルダの中身を戻してもeclisepを再起動させても変わらなかった。

##解決方法
サーバタブにある現在作成されているサーバをいったん削除する。
で、再度サーバを作成し直す。
これで再度プロジェクトをサーバで実行していたら、実行できた。

ちなみに、新たにサーバーを作成したので、さっき焦って戻した
Serviceフォルダは無視され、Service2という名前でフォルダが生成された。

tomcatのシステム自体を削除したわけではないので、これでなおる。
LINE Messaging APIを使用したボット開発

# 前提条件
Homebrew 環境構築済み
Python 環境構築済み
LINEの個人アカウントを持っている
環境は以下で実施いたしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160605/e286dc59-2d20-b3e3-3ba1-c3e9f8075ffa.png)

# LINE Developersアカウント~チャネルの作成の準備
こちらを参考にチャネル作成まで行う。
https://developers.line.biz/ja/docs/messaging-api/getting-started/#%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90

#ソースコードを作成する。
こちらを参考にソースコードを作成し、herokにデプロイする。
https://qiita.com/suigin/items/0deb9451f45e351acf92
※上記の記事で、pip install部分はpip3 installじゃないと動かない場合あり。
※アプリ名はapp.pyじゃないと動かないので注意
※以下のファイルは変更した

```requirements.txt
line-bot-sdk
flask
gunicorn
```
```runtime.txt
python-3.6.3
```

###用語説明
* Flask...Pythonの軽量なWebフレームワーク
* ngrok...一時的な外部に公開できるURLを作成するライブラリ
→ローカル環境で確認するために必要
* gunicorn...本番環境用で動作を早くするためのWSGIサーバ
参考：https://blog.hirokiky.org/entry/2018/10/06/151830

#その他参考にした記事
https://developers.line.biz/ja/docs/messaging-api/building-sample-bot-with-heroku/

https://qiita.com/__init__/items/8ae8401e9f0ff281ae64
https://qiita.com/Kosuke-Szk/items/eea6457616b6180c82d3
https://qiita.com/yakan10/items/b7ad35c2cbba5db81462
https://app.famitsu.com/20200421_1626939/
https://note.com/10mohi6/n/n663ed7dd5de3
https://qiita.com/suigin/items/0deb9451f45e351acf92
https://qiita.com/mark-town/items/024ff4c24f0c769f025e
https://qiita.com/kangetsu121/items/5ef16f0118c68f4b9719

Djangoに関する記事
https://qiita.com/yoshizaki_kkgk/items/f3c79e38b802c7fc8863
【Nuxt Vue】ファイルダウンロード（エクセル）する。

サーバー側の処理は問題ないことを確認したが、クラアント側でうまく受け取れずに少しハマってしまいました。
また似たようなことがありそうなのでメモ。

#サーバー側の処理

expressを使用、詳細は省略。

```Server.js
app.get('/download_excel_file', async(req, res) => {
  try {
    const excelPath = 'エクセルファイルのパス/ファイル名.xlsx'
    return res.status(200).download(excelPath)
  } catch (err) {
    return res.status(500)
  }
}
```

#クライアント側の処理
こちらも詳細は割愛しますが、要は { responseType : 'blob' } が必要で、抜けてしまっていた為にうまく受け取れませんでした。
responseTypeが何かわからない、という方はこちら参照願います。
https://developer.mozilla.org/ja/docs/XMLHttpRequest/Sending_and_Receiving_Binary_Data

```client.js
getExcelFile() { 
  try {
    this.$axios.$get('/download_excel_file', { responseType : 'blob' }).then(response => {
       let link = document.createElement('a')
       link.href = window.URL.createObjectURL(response)
       link.download = 'ファイル名.xlsx'
       link.click()
    }
  } catch(error) {
    console.log('エラー！！')
  }
}

```
[快適環境、生産性アップ] MS Edge で検索エンジンをGoogleに指定する

新しいEdge、悪くない、いい。　職場ではOffice 365なので、職場アカウントで同期できるのもいい。　コレクション（同期するのかなこれ）もいい感じです、ブックマークと同じといえば同じだけど・・

:point_down_tone3: Edge
https://www.microsoft.com/ja-jp/edge

ただ、デフォルトでBing検索は（まだ）不便・・だ。

ということで、Edgeを使いながらデフォ検索エンジンをGoogleに変更

# まずは設定へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/97a1cff1-fec3-61a4-a104-0f070b455f4e.png)

# 次はプライバシーとサービスへ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/3865eed1-0baa-d6c6-c758-695672285af3.png)

# いちばーん下のアドレスバーへ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/6d4e53d4-8f78-a410-0066-73b2b279fd2d.png)

# プルダウンメニューでGoogleを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/5c3c559e-b614-cbd1-aa6b-f53f892fa1af.png)

# 今回はアドレスバー検索をGoogleにしたいので、アドレスバーを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/f444ea63-ee07-8efe-a52a-4f481b6483a5.png)


# 検索してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/1ebf27a0-5620-cc39-32a7-f73a8068bdbd.png)

# OK
グリッドレイアウトで<HR>が表示されない問題

#どこ行った、水平線

グリッドレイアウトで、\<hr\>が表示されない!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546599/9d0b64c4-6fb1-82e3-9b5d-411245efc4b7.png)


↓コード(抜粋)

```html:index.html
<body>
  <div>A</div>
  <div>B</div>
  <hr>
  <div>C</div>
  <div>D</div>
</body>
```
```css:style.css
body {
  display: grid;
  grid-template-columns: 1fr 1fr;
}
hr {
  grid-column: span 2;
}
```

...ん?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546599/a7ba8082-1600-67af-2c1f-b9b6a79d4b9b.png)


...んんん?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546599/e84cd0d2-4286-a243-82e6-95186b94a679.png)

**点!**
何てこったい、幅指定だ。


```css:style.css
body {
  display: grid;
  grid-template-columns: 1fr 1fr;
}
hr {
  grid-column: span 2;
  width: 100%;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546599/4177e99b-11ad-7ecb-f866-82922ffb8b65.png)


あっさり解決ですね。


全部、画質の粗いリモデが悪いんだ。(ただの難癖)


#おまけ

間違ってheightやgrid-template-rowsを指定すると、horizonのくせに、垂直線になるよ。

```css:style.css
body {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: auto 100px auto;
}
hr {
  grid-column: span 2;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546599/446bfc84-a165-f49c-6a0f-60d77ad08cae.png)


以上。
CircleCiのhost先を指定する方法

##問題

database.ymlのtest環境において、CircleCiを動かす際はlocalhost（127.0.0.1でも可）にする必要があり、dockerを動かすにはdbにしなければいけない状況である。


##解決法
うまくいく設定ファイルは下記の通り。

1つめのenvironment内に```DATABASE_HOST: 127.0.0.1```を書いてあげれば良い。
で、database.ymlのtest環境にはhost: <%= ENV.fetch('DATABASE_HOST') %>と記述。



そうすれば、test環境においてCiercleCiが動いてくれる。

（CirclrCiの公式HPには書いていない記述方法でした。）

```
version: 2
jobs:
   build:
      docker:
        #アプリのバージョンを指定。自身のrubyのバージョンと合わせる。
        - image: circleci/ruby:2.6.3-node
          environment:
            POSTGRES_USER: postgres
            PGHOST: 127.0.0.1
            RAILS_ENV: test
            DATABASE_HOST: 127.0.0.1   #ここを追加する。
        #使ってるデータベースとバージョンを指定。自身のバージョンと合わせる。
        - image: circleci/postgres:9.6
          environment:
            #それぞれ設定
            #PGHOST: 127.0.0.1
            POSTGRES_USER: postgres
            POSTGRES_HOST_AUTH_METHOD: trust
            #POSTGRES_PASSWPRD: ENV['POSTGRES_PASSWORD']
            POSTGRES_DB: portfolio_test
      #自身のアプリ名にする
      working_directory: ~/Portfolio
      steps:
        - checkout
        #bundle キャッシュをリストアする
        - restore_cache:
            keys:
              - v1-dependencies-{{ checksum "Gemfile.lock" }}
              - v1-dependencies-
        # bundle install で依存関係をインストールする
        - run:
            name: install dependencies
            command: |
              gem install bundler -v 2.1.4
              bundle install --jobs=4 --retry=3 --path vendor/bundle

        # bundle キャッシュを保存する
        - save_cache:
            key: v1-dependencies-{{ checksum "Gemfile.lock" }}
            paths:
              - ./vendor/bundle

        - run:
            name: DBの起動を待つ
            command: dockerize -wait tcp://127.0.0.1:5432 -timeout 120s

        - run: bundle exec rake db:create
        - run: bundle exec rake db:schema:load

        # rspecを実行する
        - run:
            name: rspecを実行
            command: bundle exec rspec

        # rubocopを実行する
        #- run:
            #name: rubocopを実行
            #command: bundle exec rubocop
```
ChainerからPyTorchへ移行するためのサンプルコード

ChainerからPyTorchへ移行する手順を理解するために、サンプルコードを作成し、githubにアップロードしました。

PyTorch-Chainer-combination
https://github.com/take0212/pytorch-chainer-combination

理解する上で、PyTorch / Chainer modelをPyTorch / Chainer trainerで学習するコードをそれぞれ記載しました。

1.PyTorch modelをPyTorch trainerで学習する（normal）
2.Chainer modelをPyTorch trainerで学習する（combination）
3.Chainer modelをChainer trainerで学習する（normal）
4.PyTorch modelをChainer trainerで学習する（combination）

サンプルコード作成においては、Emcastilloさん（Preferred Networks）に多々アドバイスいただきました。
大変ありがとうございました。

## 参照
chainer-pytorch-migration
https://preferred.jp/ja/news/pr20191205/
https://chainer.github.io/migration-guide/
https://github.com/chainer/chainer-pytorch-migration

https://qiita.com/keisuke-umezawa/items/35baf525794ee89875e1
https://qiita.com/maskot1977/items/cee6aafb59342af8630c
https://qiita.com/Hiroshiba/items/c3b9f4f9dab52c2cb3d0
https://qiita.com/take0212/items/2aa27aa08324500c5b08

pytorch-pfn-extras
https://preferred.jp/ja/news/pr20200512/
https://github.com/pfnet/pytorch-pfn-extras
[Visual Studio for Mac] Docker サポートを利用してみる

Visual Studio for Mac の Docker サポートを使ってみて調べたこと。

## やりたいこと
- Docker サポートで実行したコンテナを停止・削除したい

## 環境
- macOS Catalina 10.15.5
- Visual Studio for Mac 8.6.2
- Docker Desktop for Mac 2.3.0.2

## やってみた
Docker サポートを使ったことがなかったのでお試し。

1. ASP.NET Core で API ソリューションを作成
1. 作成したプロジェクトに「Docker サポートを追加」
1. ビルド＆実行

Dockerfile や docker-compose.yml を書かず、これだけで出来ちゃう。ものすごく簡単。

## コンテナが停止できない
だけど、Visual Studio のデバッグを停止してもコンテナは動いたまま。
`docker-compose down`
しても効果なし。

状態を確認してみると
`dockercompose12345678901234567890_default`
のようなネットワークが構成されていた。

## ネットワーク名はどうやって決まる？
Docker のドキュメントを参照すると、「アプリケーション用のネットワークには、プロジェクト名と同じ名前が割り当てられる」とのこと。
http://docs.docker.jp/compose/networking.html

ということは、プロジェクト名が
`dockercompose12345678901234567890`
になっていると思われる。

## Visual Studio 実行時のプロジェクト名
Visual Studio の Docker サポートを利用して実行した場合、「dcprojの拡張子なしのファイル名 ＋ ワークスペースディレクトリの非暗号化ハッシュ」がプロジェクト名になるらしい。
https://github.com/microsoft/DockerTools/issues/171

Visual Stuido で docker-compose が実行されたときに、プロジェクト名が指定されているようだ。

## コンテナの停止
docker-compose down の際にプロジェクト名を指定してあげると、無事にお掃除できた。
`docker-compose -p dockercompose12345678901234567890 down`
Vimまとめ〜インストールと設定〜

Ubuntu 18.04には、ターミナル上で使えるテキストエディタとしてviエディタがプリインストールされていますが、vimは手動でインストールする必要があります。Vimについてまとめていきます。

### 環境

- OS : Ubuntu 18.04 LTS
- Vim : VIM - 2:8.0.1453-1

---

## Vimをインストール

```shell:インストールコマンド
sudo apt-get install vim
```

```shell:インストールされたかの確認コマンド
dpkg -l vim
```

---

## Vimの設定(.vimrc)

ホームディレクトリ直下に.vimrcというVimの設定ファイルを作成します。
この設定をすることで、Vimを格段に使いやすくすることができます。

```shell:.vimrc
" setting
" 文字コードをUFT-8に設定
set fenc=utf-8
" バックアップファイルを作らない
set nobackup
" スワップファイルを作らない
set noswapfile
" 編集中のファイルが変更されたら自動で読み直す
set autoread
" バッファが編集中でもその他のファイルを開けるように
set hidden
" 入力中のコマンドをステータスに表示する
set showcmd

" 見た目系
" 行番号を表示
set number
" 現在の行を強調表示
set cursorline
" 現在の行を強調表示（縦）
set cursorcolumn
" 行末の1文字先までカーソルを移動できるように
set virtualedit=onemore
" インデントはスマートインデント
set smartindent
" ビープ音を可視化
set visualbell
" 括弧入力時の対応する括弧を表示
set showmatch
" ステータスラインを常に表示
set laststatus=2
" コマンドラインの補完
set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk

" Tab系
" 不可視文字を可視化(タブが「▸-」と表示される)
set list listchars=tab:\▸\-
" Tab文字を半角スペースにする
set expandtab
" 行頭以外のTab文字の表示幅（スペースいくつ分）
set tabstop=2
" 行頭でのTab文字の表示幅
set shiftwidth=2

" 検索系
" 検索文字列が小文字の場合は大文字小文字を区別なく検索する
set ignorecase
" 検索文字列に大文字が含まれている場合は区別して検索する
set smartcase
" 検索文字列入力時に順次対象文字列にヒットさせる
set incsearch
" 検索時に最後まで行ったら最初に戻る
set wrapscan
" 検索語をハイライト表示
set hlsearch
" ESC連打でハイライト解除
nmap <Esc><Esc> :nohlsearch<CR><Esc>
```
## Vimのチュートリアル(vimtutor)

Vimの操作方法は、キーボードのみで操作できるように設計されているため、一般的なテキストエディタと比べて複雑なものになっています。
その特徴的な操作方法を覚えるためのチュートリアルがVimに備えられています。以下のコマンドをターミナルで入力することで、チュートリアルでの学習が可能です。

```shell
vimtutor
```



---

### 本記事目次ページ

- [Qiita:Vimまとめ](https://qiita.com/tsweblabo/items/574a363f52116ff64633)
Vimまとめ

Ubuntu 18.04には、ターミナル上で使えるテキストエディタとしてviエディタがプリインストールされていますが、vimは手動でインストールする必要があります。Vimについて私自身の勉強を兼ねて基本的なところからまとめていきます。

### 環境
- OS : Ubuntu 18.04 LTS
- Vim : VIM - 2:8.0.1453-1

---

## Contents

1. [インストールと設定](https://qiita.com/tsweblabo/items/9bc3e251227cea8f8520)
1. [ターミナルソフト TerminatorでVimをIDEっぽく使う](https://qiita.com/tsweblabo/items/ca002b5c1f4ad7d9353a)
1. [Vimの特徴的機能「モード」](https://qiita.com/tsweblabo/items/524055bc17657f451126)


---

### 参考サイト・参考資料

- vimtutor
- [Qiita:何も考えず~/.vimrcにこれを書くんだ！ 〜vim初心者によるvim初心者のためのvim入門〜](https://qiita.com/morikooooo/items/9fd41bcd8d1ce9170301)
- - [Qiita:Vimモード入門](https://qiita.com/gorilla0513/items/e8ccb15bfc87e7ed8d5b)
恐怖のマシュマロテスト

マシュマロテストって知ってます?

> あなたが四歳の子供だとする．あなたに向かって，実験者が次のように言う．「ちょっとお使いに行ってくるからね．おじさんが戻ってくるまで待っててくれたら，ごほうびにこのマシュマロをふたつあげる．でも，それまで待てなかったら，ここにあるマシュマロひとつだけだよ．そのかわり，今すぐ食べてもいいけどね」．(「EQ-こころの知能指数」ダニエル・ゴールマン著,pp.155-6)

これが，紹介されているマシュマロテストです．なにも恐怖ではないんですが，恐怖はこれからです．

-   **青年期での再調査:** マシュマロにすぐ手を伸ばした3分の1くらいの子供たちにはこのような長所がそれほど認められず，反対に心理的に問題の多い姿が浮かびあがってきた．青年期を迎えた彼らは対人関係を避けようとする姿勢が目立ち，強情な反面優柔不断で，小さな挫折にも心の動揺を見せる．自分自身のことを「だめ」な人間，あるいは無価値な人間と考える傾向がある．ストレスを受けると動けなくなったり後退しやすい．疑い深く，自分が「恵まれていない」ことを恨み，嫉妬心を抱きやすい．感情の起伏が激しくいらだつと過敏に反応しやすいので，言い合いやけんかになりやすい．そして，十年あまりの歳月を経ても，やはり彼らは欲求の充足を先へ延ばすことができなたった．(「EQ-こころの知能指数」ダニエル・ゴールマン著,p.156)
-   **学業面の差:** 高校を卒業する時点でマシュマロ・テストの子供たちをふたたび評価してみたところ，四歳のときに忍耐づよく待つことのできた子供は，そうでない子供と比較して，学業の面でもはるかに優秀なことがわかった．親の目から見た評価も，この子たちが優秀な生徒だったという点で一致している．自分の考えを言葉で的確に表現でき，理性的な応答ができ，集中力があり，計画を立てて実行する能力にすぐれ，学習意欲も高い．SAT(大学進学適性試験)の点数も非常に良い．マシュマロ・テストの対象となった児童のなかで，マシュマロにすぐに手を出した三分の一の子供たちは，言語分野の平均点が524点，数量(数学)分野の平均手が528点だった．マシュマロを長くがまんできた三分の一の子供たちは言語分野が平均610点，数量分野が平均652点だった．総合で210点の差がついたのである．(「EQ-こころの知能指数」ダニエル・ゴールマン著,p.157)

つまり，4歳で将来が決まるとレッテルつけられてしまうのです．

これは，1990年代の考え方で，今は，[\*\*双曲割引\*\*](<https://qiita.com/daddygongon/items/b075dae37a82b99cb537>)としてすこし異なった見方が主流となってきています．つまり，これは気質や性質の問題ではなくて本能なのだと．そしてそれを抑える工夫ができているかどうかが，smartな人とnaiiveな人を分けていると．



------
 - **source** ~/Desktop/lecture_23s/compA23/d3_word/report_format/marshmallow_test.org
vistaでquartus その2

#概要

vistaでquartusやってみた。
polyphonyでLチカやってみた。

#環境

windows vista 32bit
quartus ii v13.0
ep2c5t144ボード

#サンプルコード


```
from polyphony import testbench, module, is_worker_running
from polyphony.timing import clksleep
from polyphony.io import Port
from polyphony.typing import bit

@module
class ltika1:
	def __init__(self):
		self.led2 = Port(bit, 'out', init=0)
		self.led4 = Port(bit, 'out', init=0)
		self.led5 = Port(bit, 'out', init=0)
		self.append_worker(self.worker)
	def _wait(self):
		for i in range(100000000):
			pass
	def worker(self):
		led = 1
		while is_worker_running():
			self.led2(led)
			self.led4(led)
			self.led5(led)
			led = ~led
			self._wait()

m = ltika1()


```

#pin planner


```
clk   pin_17
rst   pin_144
led5  pin_9
led4  pin_7
led2  pin_3
```

#verilog HDL修正箇所


```
if (rst)
↓
if (~rst)

```

以上。
Raspberry Pi でのベクトルタイルのホストの速度の問題について

Raspberry Pi でのベクトルタイルのホストの速度の問題は、ストレージアクセス速度の問題によるよりも HTTP/2 が使えない問題による可能性があります。もしそうであるとそれなりに厄介で、要は「イントラネットで気軽に HTTPS するのは難しい」という問題に衝突することになります。

結果的に「CDNに守らせたほうがローカルよりも速い」という見せ方になって、本質的には教育的かもしれません。HTTP/2はそのようにもインターネットネイティブになるように設計されているということかもしれません。
【AWS】ルートアカウントのMFA有効化方法

# はじめに
今回は、AWSのルートアカウントのMFA有効化手順についてアウトプットしていきたいと思います。
AWSに登録した際に、初期設定として実施する内容の一つになります。

# MFAとは？

MFAとは、「Multi-Factor Authentication」の略で多要素認証という意味になります。
ログインする際のアカウントとパスワードに加え、ユーザーが所有しているデバイスから発行される6桁の数字(ワンタイムパスワード)を入力することで、セキュリティを強固なものにすることができます。

# MFA登録手順

## 事前準備

### AWS

事前にAWSに登録しておきます。
(今回はルートユーザーを使用)

**※ルートユーザーは、アカウントがEメールアドレスのもの**

### スマートフォン
所有しているスマートフォンに、「Google Authenticator」をインストールしておきます。
**※Android/iPhoneの両方にインストール可能**

![authentication.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/613bff86-23be-32ea-14fb-e55c9f3af296.jpeg)


## 実施手順

①AWSマネジメントコンソールにルートユーザーでログイン後、「IAM」をクリック

※「最近アクセスしたサービス」に存在しない場合は、サービスを検索するとヒットします。

![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/99bb6da2-d305-c959-6611-d8c2b038ab70.jpeg)

②「ルートアカウントのMFAを有効化」の中に「MFAの管理」をクリック

![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/fb6d27be-b0f4-5e2b-efb8-812e04d28f74.jpeg)

③多要素認証(MFA)の中の「MFAの有効化」をクリック

![3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/b051e139-b7e7-e2dd-51ab-a2c021a7ed2f.jpeg)

④「MFAデバイスの管理」画面が表示されるので、「仮想MFAデバイス」をクリック

![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/560dd9b0-ccf4-ebe3-602a-1921562eb1f3.jpeg)

⑤MFAの割り当てを実施します。

1.「Google Authenticator」にてQRコードを読み取ります。
2.「Google Authenticator」にてMFAコードが発行されるので、それぞれ入力

MFAコード1 : 通常入力
MFAコード2 : しばらく経つと新しいMFAコードに表示が切り替わるので、そちらのコードを入力

3. MFAコード入力後、「MFAの割り当て」をクリック

![6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/0065ea98-897c-9302-d667-6e157c5e76c1.jpeg)

⑥「仮想MFAが正常に割り当てられました」と表示されていれば、問題なし。

![7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/667911b7-8ba3-fffb-51a6-0b7dcf1ad352.jpeg)

⑦一度ログアウトし、再度ルートユーザーにてログイン。

アカウントとパスワード以外に、下記のような形で「MFAコード」が要求されることを確認

![9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/42aeb6e9-ff66-b65c-e53f-09437948af83.jpeg)


# 参考
[AWS MFAの設定](https://qiita.com/akkisu/items/f9695d0c635d74d2d7ee)
[AWS での多エレメント認証 (MFA) の使用](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa.html)
ruby ifを1行で書く方法 まとめ by 初心者

## rubyのifを１行で各方法

### true のみの場合
    if a>0
      puts a
    end
なら

    puts a if a>0

### if else の場合
    if a>0
      puts a
    else
      puts ""
    end
なら

    puts a>o ? a:"0"
みたいです。

さらに
    if a>0
      puts a
    else
      b=gets.chomp
    end
なら

    a>o ? puts a:b=gets.chomp
みたいです。

初心者の覚え書きとして^^
初心者によるプログラミング学習ログ 340日目

#100日チャレンジの340日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
340日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>340日目　2h<br>・ポートフォリオ作成<br>・pc版作成<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1270446555347120128?ref_src=twsrc%5Etfw">June 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【JS】date-fnsを使って 日本語で「X年Xヶ月」を返す関数（コピペ用）

## 経緯
* 指定した時間から経過した時間「X年Xヶ月」を日本語で返す関数、ググれば使えるものがすぐ出てくるかと思ったが記事がなかったので書いておく

## 前提
* 開発では日付管理ライブラリによく[date-fns](https://date-fns.org/)を使用するので今回はそちらを利用する

いまから導入する場合は早速追加

```terminal:terminal
$ npm install date-fns --save
# or
$ yarn add date-fns
```

# 実装

コメント欄で教えて頂いた内容を以下に追記（2020/07/31）

## formatDurationを使用する方法

formatDurationにlocale: jaを渡して実装する方法だと比較的シンプルに求められる
（この場合表示形式は「2年 2か月」の様な定型文で返ってくる）

```typescript
import { formatDuration, intervalToDuration, parseISO } from 'date-fns';
import { ja } from 'date-fns/locale';

export function formatInterval(start: Date, end: Date) {
  const duration = intervalToDuration({ start, end });
  return formatDuration(duration, {
    format: ['years', 'months'],
    locale: ja,
  });
}

formatInterval(
  parseISO('2018-04-10T00:00:00'),
  parseISO('2020-06-10T00:00:00')
); // '2年 2か月'
```

## differenceInYears, differenceInMonthsを使用する方法

「2年 2か月」などの定型文ではなく「2年2ヶ月」など自由な形式で表示したい場合はこちら

```typescript

import { differenceInYears, differenceInMonths, parseISO } from 'date-fns';

~ ~ ~

// 指定した時間から経過した時間「X年Xヶ月」を返す
const getDifferenceInYM = (targetDate: Date, baseDate: Date) => {
  let date = targetDate;
  const diffYears = differenceInYears(baseDate, date);
  if (diffYears) {
    date = addYears(date, diffYears);
  }
  const diffMonths = differenceInMonths(baseDate, date);

  const year = diffYears ? `${diffYears}年` : '';
  const month = diffMonths ? `${diffMonths}ヶ月` : '';
  return `${year}${month}`;
};

getDifferenceInYM(
  // stringをDate型に変換
  parseISO('2018-04-10 00:00:00'),
  parseISO('2020-06-10 00:00:00')
); // '2年2ヶ月'
```
[主成分分析] sklearn の pca.components_ は特徴量空間における主成分軸の向きを表す単位ベクトル

伝えたい事は表題に書きました。

sklearn のPCAに関する記事を見ていると、``pca.components_``の意味の説明についてはあやふやな感じでさらっと流されている事が多かったのでここに書いてみました。

~~もう少し知りたい方はこのPDFの25ページ目あたり以降を見てください。~~
~~[Microsoft PowerPoint - 統計科学研究所_R_主成分分析.ppt ](https://statistics.co.jp/reference/software_R/statR_9_principal.pdf#page=25)~~

**追記**
以前はタイトルを「sklearn の pca.components_ は主成分と特徴量との相関係数で因子負荷量と呼ばれる」としていましたが、コメントの様に、データの分散共分散行列に対する固有ベクトルであったため修正しました。
attr_accessorが必要な理由と、不要な理由（Railsさんありがとう）: Railsチュートリアル備忘録 - 9章

以前にも出てきた`attr_accessor`
あまり理解できていなかったので調べてみた

##理解したこと
- `attr_accessor`の役割
- `attr_accessor`を意識せずにここまでこれた理由（Railsさんありがとう）



##躓いたのはこれ
2行読んで続きを放棄したくなった

>Userモデルには既にremember_digest属性が追加されていますが、remember_token属性はまだ追加されていません。このためuser.remember_tokenメソッドを使ってトークンにアクセスできるようにし、かつ、トークンをデータベースに保存せずに実装する必要があります。そこで、6.3で行ったパスワードの実装と同様の手法でこれを解決します。あのときは仮想のpassword属性と、データベース上にあるセキュアなpassword_digest属性の2つを使いました。仮想のpassword属性はhas_secure_passwordメソッドで自動的に作成されましたが、今回はremember_tokenのコードを自分で書く必要があります。これを実装するため、4.4.5で触れたattr_accessorを使って「仮想の」属性を作成します。(Railsチュートリアル 第６版)

##少しずつ理解していく
>Userモデルには既にremember_digest属性が追加されていますが、remember_token属性はまだ追加されていません。

Userモデルに既存の属性は

```rb
User.attribute_names
=> ["id", "name", "email", "created_at", "updated_at", "password_digest", "remember_digest"]
```
remember_token属性はない




###`attr_accessor`とは
読み書きできる属性を定義するために用いる

`attr_accessor :remember_token`とすることで
Userクラスのオブジェクトに対してremember_token属性を定義し
`user.remember_token`と属性を参照したり
`user.remember_token = "token"と属性を代入したり
することができるようになる


以下を参考にしました
[Rubyのattr_accessorって何？[和訳]](http://bryankawa.hatenablog.com/entry/2017/01/28/150537)

###`attr_accessor :name`や`attr_accessor :email`ってやったことないよ
いままで散々`user.name`, `user.email`を使用してきたのに
`attr_accessor`を意識したことはなかった

これについては
[Railsから入った人へ【attr_accessor】って？](https://qiita.com/Hassan/items/0e034a1d42b2335936e6)

`rails generate model...`やmigrationの過程で
Railsが勝手に同様の処理をしてくれていたみたい


###"データベースに保存せず"という点が重要だった
>このためuser.remember_tokenメソッドを使ってトークンにアクセスできるようにし、かつ、トークンをデータベースに保存せずに実装する必要があります。
...
これを実装するため、4.4.5で触れたattr_accessorを使って「仮想の」属性を作成します。

remember_tokenはDBに保存しない
つまり`rails generate model...`やmigrationを用いずに
新たな属性を付与したいので`attr_accessor`を使うと理解した

ちなみに
`attr_accessor :remember_token`が定義されていても

```rb
User.attribute_names
=> ["id", "name", "email", "created_at", "updated_at", "password_digest", "remember_digest"]
```
と"remember_token"はオブジェクトの属性として含まれないにもかかわらず

```rb
user.remember_token = "token"
=> "token"
>> user.remember_token
=> "token"
```
オブジェクトの属性のように扱うことができる
この辺が”「仮想の」属性”ということなのだろうか
SalesforceのJWTにユーザ情報やクライアントIDを含める方法

# はじめに
　SalesforceのJWTに含められる項目は変更できないため、アクセスするユーザ情報やクライアントIDを送信する方法がないか検証しました。

# JWTにユーザ情報とクライアントIDの設定
　認証プロトコルを”JWT”に選択した場合、項目は変更できないので、固定の項目の中で動的に値を変更できる件名を利用して、ユーザ情報やクライアントIDの送信を考えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/9efafd2b-5937-3692-7553-3075839b9918.png)

# JWT検証ポリシーのクライアントIDのチェック方法
　SalesforceのJWTの件名を利用して送信されたクライアントIDは、MuleのJWT検証ポリシーのクライアントIDチェックで下記の方法でチェックできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/bac67efd-e26a-5e4e-a44f-6fceffa4d812.png)

件名の数式は以下の設定です。

```
"{  \"UserID\" : \"" & $User.Id & "\" ,  \"ClientID\" : \"1f9fe36248a44a7dad7ac69bf9afc393\" }"
```

# 指定ログイン情報でクライアントIDを切り替える方法
　ユーザ情報に関連しない項目は動的に値を変更できないため、指定ログイン情報で変更することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76270/0aece026-2740-7f34-ba39-7ccdd8b9ede2.png)


# まとめ
　標準の指定ログイン情報を利用してユーザ情報やクライアントIDを送信し、MuleのJWT検証でチェックできることを確認できました。
　方法は少しトリッキーですが、標準機能の指定ログイン情報を利用してクライアントIDチェックやユーザ情報を送信ができるのはニーズが多そうですね。では、
Pythonで複数のリストの重複を抽出する

似たような記事はいくつかありますが`collections.Counter`を使う方法が簡単かつ便利だと思うので置いておきます。

```python
from collections import Counter

hoge = ['a', 'b', 'c', 'd', 'e']
fuga = ['c', 'd', 'e', 'f', 'g']

Counter(hoge + fuga)
# => Counter({'a': 1, 'b': 1, 'c': 2, 'd': 2, 'e': 2, 'f': 1, 'g': 1})

# 2つ以上の要素
[k for k, v in Counter(hoge + fuga).items() if v > 1]
# => ['c', 'd', 'e']
```
【Golang】標準パッケージ regex

#【Golang】標準パッケージ regex
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main
//regex 正規表現
//URLなどによって処理を分岐させたい場合など、判定してプログラムを書くなど

import (
	"fmt"
	"regexp"
)

func main() {
	//MatchString
	//正規表現のフォーマットに沿った文字列か確認し、True/Falseを返す
	//aからはじまってeで終わる。間はa-zが１つ以上。数字も使う場合はa-z0-9にする。
	match, _ := regexp.MatchString("a([a-z]+)e", "apple")
	fmt.Println(match)
	//>>true



	//MustCompile
	//上記と同じ。何度も使う場合は、最初に定義を宣言して使った方がいい
	r := regexp.MustCompile("a([a-z]+)e")
	ms := r.MatchString("apple")
	fmt.Println(ms)
	//>>true



	//FindString
	//MustCompileの中でURIを正規表現で定義し、FindStringで、そのルールに収まっているか確認をするという使い方もできる。
	//^ $ 先頭　終わりが数字アルファベット 空白を持たない
	r2 := regexp.MustCompile("^/(index|detail|create)/([a-zA-Z0-9]+)$")
	///index/testに、マッチする文字列を取得する
	fs := r2.FindString("/index/test")
	fmt.Println(fs)
	//>>/index/test



	//FindStringSubmatch
	//格納されるデータはスライスで入っているので、一つ一つ取り出すことも可能。
	//indexだけ取り出したいなど
	//スライスで取得される
	fss := r2.FindStringSubmatch("/index/test")
	fmt.Println(fss, fss[0], fss[1], fss[2], len(fss))
	//>>[/index/test index test] /index/test index test 3
	//スライスで取り出せる


	//改行がある場合を検知する場合^ $ではなく、\A \zを使う
	//セキュリティ上望ましい。
	r3:= regexp.MustCompile(`\A/(index|detail|create)/([a-zA-Z0-9]+)\z`)
	fs3 := r3.FindString("/index/test")
	fmt.Println(fs3)//len(fs3)
}
```
macOSにnvmを入れた後、何もできなくなったとき

メモ書き。
こんなことで時間をかけたくない・かけないほうがいいので、何かの参考になれば。
OSはCatalina。brewでnvmをインストール済み。

## OpenSSLで何か出た

1.1系を入れてしまったからかもしれない。

```
/Users/yuki% nvm ls-remote
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/opt/curl/bin/curl
  Reason: image not found
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
  Referenced from: /usr/local/opt/curl/bin/curl
  Reason: image not found
            N/A
 ```

バージョン指定してもインストールできなかった。
理由はEOLだから、らしい。
参考: https://qiita.com/kunit/items/0aef44d5e522abde1f9c

### やったこと
1.0系はインストールされていたけど、どうにも切り替えられないので再インストール。
参考: https://github.com/Homebrew/homebrew-core/issues/47348
参考: https://qiita.com/kunit/items/0aef44d5e522abde1f9c

```
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/64555220bfbf4a25598523c2e4d3a232560eaad7/Formula/openssl.rb -f
```
最後の`-f`をつけないとインストールされない。とりあえずこれで1.0.2tが入ってくれた様子。

```
/Users/yuki% openssl version
OpenSSL 1.0.2t  10 Sep 2019
```
## それでもダメだった

```
/Users/yuki% nvm ls-remote
            N/A
```
心が折れかける。

### やったこと2

`NVM_NODEJS_ORG_MIRROR`を設定するとよいとのこと。
参考: https://qiita.com/i47_rozary/items/3ed6335fe14ef9788911

.zshrcに`export NVM_NODEJS_ORG_MIRROR=http://nodejs.org/dist`を追記し、反映後に再度`nvm ls-remote`。

```
/Users/yuki% nvm ls-remote --lts
         v4.2.0   (LTS: Argon)
##以下略
```
無事接続できたので、この後インストールしました。

### 感想

OpenSSL系のエラーが出ると毎回手詰まるし、萎える。
今日も皆さんの投稿に救われました。多謝。