OmniAICreator/Qiita-1.07M huggingface dataset:
Docker ScanでSnykへのAPI Tokenを使った認証を行う方法

新しく使えるようになった `docker scan` コマンドをテストしているといつからか以下のメッセージが出力されるようになりました。

```sh
$ docker scan hello-world
You have reached the scan limit of 10 monthly scans without authentication.
For additional monthly scans, sign into or sign up for Snyk for free with the following command:
`docker scan --login`
```

Docker ScanはSnykのエンジンを使っているため、匿名は回数制限されていて、アカウントの作成が必要になるようです。 

>Docker Scan runs on Snyk engine, providing users with visibility into the security posture of their local Dockerfiles and local images.
https://docs.docker.com/engine/scan/


ガイドの通りログインしていみます。自身のLinux環境だと以下のような感じです。

```sh
$ docker scan --login

To authenticate your account, open the below URL in your browser.
After your authentication is complete, return to this prompt to start using Snyk.

https://snyk.io/login?token=TOKENTOKENTOKEN&utm_medium=Partner&utm_source=Docker&utm_campaign=Docker-Desktop-2020&os=linux&docker=true
```

ブラウザから認証してあげます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116068/19d5d8a3-c834-bdab-4be6-a85ac9bda975.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116068/63e57d43-3769-5137-c238-d18f92b2ac09.png)

ただ、CLI側は何故かエラーに。

```sh
Authentication failed. Please check the API token on https://snyk.io
```

# APIトークンを指定してログオン
何度か試してみたのですが、上手くいかなかったのでAPI Tokenを自分で取得して自分でログオンすることにしました。

以下にアクセスします。ここまでの手順を行っていれば自動でログオンされるはずですし、DockerHubのIDで再度ログオンしても大丈夫です。

https://app.snyk.io/account

API Tokenは以下の `click to show` で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116068/abef35b5-334b-aefc-7009-6fb9fbbb2562.png)

このAPI Tokenを使って `docker scan --login` を行うことでDocker CLIからもSnykへログインできます。

```sh
$ docker scan --login --token TOKENTOKENTOKEN
Your account has been authenticated. Snyk is now ready to be used.
```
E資格2021#2実装演習レポート：応用数学

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1643448/b574534a-0c17-8f8c-fe4a-db2376114dfc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1643448/48aa7835-0cc1-0a3b-6637-38e20c92bd67.png)
Microsoft Edge のプロファイルからパスワードを取り出す

#趣旨
小ネタです。
Microsoft Edgeで作成したプロファイルからパスワードを取り出す方法です。

#そもそもプロファイルとは何か
Microsoft Edgeが提供する機能のひとつです。プロファイルを使うと、パスワード、ブックマーク、拡張機能、などの設定をひとまとめにして保存できます。


参考：
[Microsoft Edge でサインインして複数のプロファイルを作成する](https://support.microsoft.com/ja-jp/topic/microsoft-edge-%E3%81%A7%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%B3%E3%81%97%E3%81%A6%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-df94e622-2061-49ae-ad1d-6f0e43ce6435)

プロファイル機能を利用することで、アカウントのログインをワンタッチで行えるようになります。ログイン画面を開いてIDとパスワードを入力する必要がないのでとても楽です。

例：
・自社テナントの自身のアカウント
・【検証テナント】【A案件】全体管理者
・【検証テナント】【A案件】一般ユーザー
・【検証テナント】【B案件】全体管理者
・【検証テナント】【ソリューション開発】Teams診断

#なぜパスワードを取り出す必要があるか
ブラウザでログインをするときにパスワードを入力する必要がないので、そのアカウントのパスワードを覚えておいたり、メモして保存しておくことが少なくなりました。

ですが、ブラウザでログインをするとき以外にもパスワードが必要になるときがあります。例えば、ツール開発でテスト実行をするときに実行アカウントを入力する場合があります。

このときに、「この検証アカウントのパスワードって何だっけ？」となることがあります。

#パスワードを取り出す手順
対象のプロファイルを開いて、「プロファイルの設定を管理」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/bd1f61e8-da31-8af2-ec57-fbcf0d9f27c6.png)

「パスワード」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/cf9bede2-2311-a572-5091-3d934bfd9526.png)

パスワードを知りたい対象の行にある目のアイコンをクリックします。PCにログインしているユーザーのIDとパスワードの入力が求められたら入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/a8c7af19-c7dd-ea20-7766-3c9b8dcb4e12.png)

パスワードのマスクが外れたら、パスワードをメモするなりコピーするなりしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/fe8e95d0-53b1-b946-fb3e-d1a998fba7fb.png)
以上です。

#最後に
目のアイコンではなくて「・・・」をクリックして「パスワードのコピー」を選択することでマスクを外さずにパスワードをコピーすることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/33c979d8-7944-1813-a3f9-c5952545e462.png)
git push heroku masterでエラー出ちゃった

git push heroku masterコマンドでエラーが起こったので
アウトプットしていきたいと思います。

<h1>エラー内容</h1>

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

```
Warning: Multiple default buildpacks reported the ability to handle this app.
The first buildpack in the list below will be used. 
```
bundlerに関するエラー？

```
Failed to install gems via Bundler.
```

こちらも同様にbundlerのバージョンに関するエラーなのか?
と思いbundler -vコマンドでバージョンを調べて見ると

```
Bundler version 2.1.4
```
でバージョンは問題ナッシングソウマッチ。

<h1>gem同士のバージョンに関するエラーでした</h1>

```
remote:        Unable to find a spec satisfying nokogiri (>= 1.8.5) in the set. Perhaps the
remote:        lockfile is corrupted? Found nokogiri (1.11.7-x86_64-darwin), nokogiri
remote:        (1.11.7-x86_64-darwin), nokogiri (1.11.7-x86_64-darwin), nokogiri
remote:        (1.11.7-x86_64-darwin), nokogiri (1.11.7-x86_64-darwin) that did not match the
remote:        current platform.
```

nokogiriを満たすスペックが見つかってませんよ！！と怒られてます。
gem同士のバージョンにすれ違いがある為エラーが起こっているようです。

```
bundle update
```
をして
git push heroku masterコマンドを
入力すると解決することができました。
【第3章】Railsチュートリアルで急にファイルの保存ができなくなった時にやったこと

[Railsチュートリアル第3章(第6版)](https://railstutorial.jp/chapters/static_pages?version=6.0#cha-static_pages)で、急にファイルが保存できなくなった。

#やったこと①　ファイル保存時に表示されるメッセージを読んだ
ファイルを保存しようとすると、メッセージが表示されて保存が出来ない。![Railsチュートリアル第3章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505219/4b87479e-4d69-dfbe-1959-a7f0447ad4c6.png)
メッセージを読むもよく分からず、調べてみると以下のような記事があった。
[『ENOSPCってなんやねん!!』](https://qiita.com/kaitaku/items/fb7c84fe562530668614) @kaitaku

どうやらENOSPCは**ディスクに十分な容量がないこと**を意味するらしい。

上記の記事の参考元はこちら↓
https://github.com/facebook/create-react-app/issues/4301

#やったこと②　チュートリアルを遡り容量の上げ方を確認した
そういえば、どこかで容量について触れられていたような・・・。と思い探してみると普通に書いてあった。
![Railsチュートリアル第3章(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1505219/a5450b41-05e3-f4fd-db16-34dd7796bc85.png)
これをやっておけば良かったのか。。。
ということで[Railsチュートリアルのヘルプページ](https://railstutorial.jp/help#volume-up-aws-ebs)を確認する。

#やったこと③ Railsチュートリアルのヘルプページに従って、hello_appとtoy_appを削除した
後はヘルプページに従うのみ。
今後のチュートリアルでは第3章で作成した```sample_app```だけを使うようなので、まずは以前の章で作成した```hello_app```と```toy_app```を思い切って削除する。ソースコードはGitHubにpushしているので安心。

再度ファイルを保存してみると、無事**メッセージが表示されずに保存することができた**。

手順にはEBSのボリュームを増やす方法も書いてあるので、やっておいた方が良いと思われる。

#まとめ
やったこと①②③の流れで解決できた。
2つのテーブルにあるカラムをSQLで全て結合させる方法


#FULL JOINで拾えない値をUNION ALLで拾う方法



###方法
「UNION ALL」と「NOT EXISTS」を使用する



###コード
```sql:.sql
SELECT  id,
        name
FROM `DS.TBL` a
UNION 　ALL
SELECT  id,
        name,
FROM `DS.TBL`
WHERE NOT EXISTS (
SELECT  id,
        name
FROM `DS.TBL` b
WHERE a.id = b.id
AND a.name = b.name
  ); 
```
なお、カラム名が同一であることとカラム数が同一である必要があります。
同一にするために空列を入れと良いでしょう。
完全外部結合では拾えない値を結合する方法でした。
純ジャパが1年でTOEIC900点を取る話

##はじめに
この度、TOEICで目標としていた点数を取りました。
旅行以外の海外経験なしで900点を取るのもなかなか貴重な貴重な経験かなと思ったので、記事にしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171131/9ac858ac-1ad3-224a-d6ef-31dd9b6b691c.png)

 

##私の勉強前の英語力
12年前の大学受験で英語を使ったきり、大して勉強をしていませんでした。大学では周りより少しだけ英語が得意だった、程度です。海外経験はありません。
コロナを機に時間ができたため、去年の2月あたりから、英語の勉強をしてみようと思いました。


##使用した参考書

###「出る単特急 金のフレーズ」
www.amazon.co.jp/dp/4023315680
TOEIC単語帳のベストセラーです。2021年現在でも単語の的中率が高いです。
フレーズで覚えられる、出題頻度順で並んでいる、音声教材の充実度が高い、アプリがある、など、使いやすい単語帳なので、おすすめです。


###「TOEIC L&Rテスト 文法問題 でる1000問
https://www.amazon.co.jp/dp/4866390832
文法問題のみを集めた問題集です。出題される文法問題が網羅されているので、Part5対策はこの1冊で完結できます。
ただ、とにかく量が多いので、もう少し薄い本でも足りるかもしれません。。


###「公式TOEIC Listening & Reading 問題集5・6・7」
https://www.amazon.co.jp/dp/490603361X
定番の公式問題集です。本番の試験と同じナレーターなので、リスニングパートに関してはシャドイングを繰り返しました。
リスニングに関しては、公式問題集のみで勉強を完結させました。


###「TOEIC(R)テスト新形式精選模試リーディング２」
https://www.amazon.co.jp/dp/4789017206
リーディングの伸び悩みのため、公式問題集が終わった後着手しました。
読解量が多かったり、選択肢が長かったりで、本番の1.5倍くらい難しいです。ただ、変な問題ではないので、やりきると力が付きました。


##会場選び
コロナ禍の中でTOEIC受験も抽選制になりましたが、運営側も会場確保に苦労しているようで、試験会場の質も変わった気がします。
具体的には、コンベンションセンターの大会議室に500人くらい詰め込まれるパターンが多かったです。
このような会場に当たると、周りの雑音が多いうえ、天井が高く、音が反響して聞き取りづらいです。できれば大会場ではなく、大学の小教室とかで受けたいところです。

自分なりの対策が2つあります。

###抽選申し込み開始直後に申し込む。
噂レベルですが、抽選申し込みの順番で会場の割り当てが行われ、申し込みが遅かった人は大会場が割り当てられるという情報があります。
確実ではないですが、抽選開始直後に申し込むと、大会場を回避できる可能性が高まるようです。

###東京以外の受験地を選ぶ
東京には大会場が多いので、できれば近郊の別受験地を選択するとよさそうです。
埼玉会場で受験したところ、オフィスビルの会議室が割り当てられ、音響は東京の大会場より良かったです。

不確かな情報にはなってしまいますが、参考にしてください。

##受験回数について
私は目標達成までに6回受験しました。試験の各回で難易度が違い、簡単な問題ほど点数が出やすく感じました。
試験の難易度は受けてみないとわからないため、簡単な問題が出るまで、目標としている点数が取れるまで、受け続けるのがいいと思います。


##その他所感

俗にいう、「TOEICテクニック」のようなものは、最近は運営側に対策されているように感じます。
Part2では質問文に含まれている単語が聞こえたら不正解、とか、Part7はすべて読まなくても解ける、とか、いろいろなテクニックがありますが、
最近はそのテクニックで解ける問題は減ったように感じます。素直に、全部読んだり、全部聴いたりする訓練をするしかないのかなと思っています。

TOEICの点数は目標に達しましたが、やはり海外のニュースなどを見るとまだ力不足を感じます。
TOEIC外の語彙が足りていないような気がするので、TOEICの後もまだまだ勉強が続くかなという感じです。。引き続きかんばります。
【LeetCode】就活に向けたコーディングテスト対策 #04

#はじめに
こんばんは．
M1就活生が[LeetCode](https://leetcode.com/)から，easy問題を中心に**Python**を用いて解いていきます．

https://leetcode.com/

↓では，解いた問題のまとめを随時更新しています．
[まとめ記事](https://qiita.com/halpi/items/43761b89a1873dcc9a5c)

https://qiita.com/halpi/items/43761b89a1873dcc9a5c

#問題
今回解いたのは，難易度easyから [問題13のRoman to Integer](https://leetcode.com/problems/roman-to-integer/) です．
問題としては，文字列`s`で与えられるローマ数字を整数に直して値を出力するというもの．
ローマ数字は7種類の記号で表されており，それぞれ次の値となっています．

```
Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
```

入力例と出力例は以下の通りです．

Example 1:

```python
Input: s = "III"
Output: 3
```

Example 2:

```python
Input: s = "IV"
Output: 4
```

Example 3:

```python
Input: s = "IX"
Output: 9
```

Example 4:

```python
Input: s = "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
```

Example 5:

```python
Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
```

このとき，4を表す数字は`IIII`ではなく`IV`，9は`IX`となっています．

#書いたコード
とりあえず，思いついたままに書いてみました．

```python
class Solution:
    def romanToInt(self, s: str) -> int:
        dic = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
        reverse_s = s[::-1]
        total, prev = 0, 0
        
        for i in reverse_s:
            if dic[i] >= prev:
                total += dic[i]
            else:
                total -= dic[i]
            prev = dic[i]
        
        return total
```

まず，それぞれローマ数字とその値に対応する辞書を用意します．ローマ数字は通常，左から順に大きい数字となるように書くルールがあるそうです（知らなかった）．そのためまずは，ローマ数字を反転させて，末尾から順に加算していきます．このとき，4は`IV`，9は`IX`などのルールがあるため，前の値と比較してそれ以上であれば現在の値を加算，そうでなければ減算することで引き算のルールに適用させました．

議論ページを見てみると，なるほどなと思うコードがありました．

```python
class Solution:
    def romanToInt(self, s: str) -> int:
        translations = {
            "I": 1,
            "V": 5,
            "X": 10,
            "L": 50,
            "C": 100,
            "D": 500,
            "M": 1000
        }
        number = 0
        s = s.replace("IV", "IIII").replace("IX", "VIIII")
        s = s.replace("XL", "XXXX").replace("XC", "LXXXX")
        s = s.replace("CD", "CCCC").replace("CM", "DCCCC")
        for char in s:
            number += translations[char]
        return number
```

ローマ数字の引き算を行うルールは全部で6通りらしいです．そのため，このコードのようにそれぞれのローマ数字を減算を使わない形に置換することで簡単に計算ができるみたいです（これはいい...）．

#おわりに
Discussページでは，様々な言語での解き方を参照できるのでとてもおもしろいです．多角的な思考で問題を解けるようにこれからも頑張っていきたいですね．

今回書いたコードはGitHubにもあげておきます．

https://github.com/halpi17/LeetCodeStudy/blob/master/013/romanToInteger.py

[前回](https://qiita.com/halpi/items/7e20f661cdbcd127d960)　[次回](https://qiita.com/halpi/items/642c039cb339a5e4cf66)
paramsメソッドについて

## 挨拶
こんにちは、プレイライフの熊﨑です！
来月友人の結婚式があるということで、自分の婚期について若干の不安を抱えています。
結婚はいつになるのやら、、、、

そんなことは置いといて、今日もアウトプットを行っていこうと思います！
本日はparamsメソッドについてです。

## 対象読者
- paramsメソッドの使用経験はあるが、なんとなく使っている方

## paramsメソッドについて
paramsとはリクエストで送られてきた値を受け取るためのメソッドです。

## 送られるデータの種類
送られてくる情報には、「投稿フォームなどPOSTで送信されたデータ」と「検索フォームなどGETで送信されURLにクエリとして入るデータ」があります。
これらのデータを取得するのが、paramsメソッドの役目です。

## 使い方
以下のように書くことでカラム名の値を取得することができます。

```
params[:カラム名]
```

## どのように使うのか？

### URLから送られてきた情報をコントローラーで使用したいとき

#### 具体例

ユーザーから以下のようなリクエストが飛んできている場合
https://hogehoge.com/users/12

```controller.rb
def show
  @user = User.find(params[:id])
end

# params[:id]で12を返す
```


###投稿された情報をコントローラーで使用したいとき

#### 具体例

```controller.rb
def create
  user = User.new(permit_params)
  user.save
end

def permit_params
  params.permit(:name)
end
```

permitメソッドを使用しているのはストロングパラメータにするためです。
カラムを取得しないでparamsメソッドを実行すると、フォームに入力した情報以外も取得できてしまいます。
そのため、User.new(params)のようにすると、悪意を持ったユーザーがフォームに入力されている以外の不正な値を投稿した際に、DBの値が更新されてしまう可能性が出てきます。（Rails4からは、permitメソッドで許可されていないパラメータはDBに保存できないようになっています。）
このような場合に備えて、ストロングパラメータにすることで、フォームに入力した情報以外を更新できないようにする必要があります。



## まとめ
- paramsメソッドは投稿フォームやURLから送られてきたデータを取得するメソッド
- paramsで受け取った値を用いてDBを更新する場合には、strongパラメータにする必要がある。

## 参考記事
[https://railsguides.jp/action_controller_overview.html](https://railsguides.jp/action_controller_overview.html)
[https://pikawaka.com/rails/params](https://pikawaka.com/rails/params)
MediaLiveのInputSwitch【備忘録】

MediaLiveのチャンネルの`Schedule actions`で`Action type: Input Switch`として作成するとInputの切り替えができます。
"Schedule"とはいいつつ、`Start type`を`immediate`にすることでactionは作成直後に実行されます。
これによって放送中の映像を任意のタイミングで切り替えることが可能になります。
今回はRTPM(Live配信)とMP4(S3に格納済み)で入力を切り替えてみます。

## Input, Channelの作成
*MediaStoreとか視聴用のHTMLは前もって作成しておきます。*

- Live配信用のInput
`Input type: RTMP(push)`にします

- MP4用のInput
`Input type`は`MP4`に、`Input source`はコンテンツを格納したS3のURLを設定します。
![Screenshot_2021-06-13 MediaLive_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/734442/5f338748-5433-5378-d1c9-6811fd2d9556.png)

- Channnel
上記のInput2つをアタッチします。
MP4のコンテンツは繰り返し出力したいので、`General input settings` > `Source End Behavior`で`LOOP`を選択しておきます。
![Screenshot_2021-06-13 MediaLive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/734442/173ea6bf-c1ed-6f53-3d45-56cca9d093ed.png)


## Lambda
チャンネルを切り替えるためのAPIをAPIGateway + Lambdaで作成します。
Pythonで実装します。

```Python
def lambda_handler(event, context):
    client = boto3.client('medialive')
    input = json.loads(event['body'])['Input']
    actionName = json.loads(event['body'])['ActionName']
    
    response = client.batch_update_schedule(
        ChannelId='<作成したChannelのID>',
        Creates={
            'ScheduleActions': [
                {
                    'ActionName': actionName,
                    'ScheduleActionSettings': {
                        'InputSwitchSettings': {
                            'InputAttachmentNameReference': input,
                            'UrlPath': []
                        }
                    },
                    'ScheduleActionStartSettings': {
                        'ImmediateModeScheduleActionStartSettings': {}
                    }
                }
            ]
        }
    )
```

Live配信中にコンソールで下記コマンドを打つとMP4の映像に切り替わります。
私の環境ではAPIを叩いてから切り替えに15secくらいかかりました。

```bash
curl -X POST https://{API Gatewayのドメイン}/{ステージ}/{リソース} -d '{"Input":"<MP4用のInput名>", "ActionName": "ChannelSwitch"}'
```



## 参考
参考にさせていただきました。

<a href="https://dev.classmethod.jp/articles/reinvent2018-aws-elemental-medialive-adds-input-switching-for-live-channels/">[アップデート] AWS Elemental MediaLiveでInputのスイッチングが可能になりました #reinvent #mediaservices | DevelopersIO</a>
<a href="https://dev.classmethod.jp/articles/aws-elemental-medialive-programming-using-mp4-input-and-switch-input/">AWS Elemental MediaLiveで番組編成っぽいことをしてみた | DevelopersIO</a>
<a href="https://qiita.com/afadhli/items/3066dbd519ea2eae03a7">AWS Elemental MediaLiveのスケジュール機能を使ってみた(コンソール版) - Qiita</a>
Pythonを使ってみた

#初めに
業務でPythonを使った事がないが、人気がある言語として、よく話を聞き、興味を持ったので調査及びコーディングをして感じた事をまとめました。
これからPythonについて知りたいと思う方に向けた記事となります。
また既にPythonのコーディング経験のある方も、コメント頂ければ幸いです。

#Pythonとは？
世界で人気あるプログラミング言語です。
1991年にオランダ人に開発された言語で、他の言語と比べて、少ないコードでプログラムを構成出来る特徴があります。

#Pythonで出来る事
Pythonは主にWebアプリケーションの開発に活用されています。Instagram、YouTube、DropBox等がこの言語を使っています。
また機会学習やゲームアプリケーションの開発に使われています。
これだけ多様性が高いのは、C言語等他の言語との連携がしやすいのと、統計処理や数値処理を得意としている為です。

#開発する上で必要な事
Pythonで開発をするに当たり必要なものは、PCにPythonをインストールする必要があります。

###Pythonインストールページ
https://www.python.org/

PythonはWindows、iOS等のOSに問わずインストールする事が可能です。
コーディングしたプログラムを実行するには下記を使います。

✓「windows」の場合:コマンドプロンプト
✓「iOS」の場合:ターミナル

またmicrosoft社の「Visual Studio」を経由してPythonのインストール及び開発環境の構築が出来ます。

Visual StudioでPython開発環境を構築
Visual StudioでPythonの開発環境を構築してみたので、これをまとめます。

使用したVisual Studioは以下になります。
・Micorsoft Visual Studio Comunnity 2019
　-VerSion 16.9.3

###開発環境構築手順
1.Visual Studio インストーラー を起動
  「Python 開発」を選択し「ダウンロードしながらインストールする」を押下

###開発手順
1.Visual Studioを起動し、「新しいプロジェクトを追加」ページを開く
2.テンプレートで「Pythonアプリケーション」を選択

#コーディングして
業務でC#、JavaScriptを使用しているのですが、実際に独学で使用した印象としては、やはりコーディングする行が少なく、扱いやすい印象でした。
他の言語ではimport等の追加設定が必要が、どうしても行が多くなるのですがPythonでは少ないコーディングで色々出来る様です。
まだ勉強中で勉強した事、感じた事を今後もまとめていこうと思います。
【AWS】S3バケット作成

# 目的
AWSのS3を使用するために`バケット`を作成する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提

- AWSアカウントの`ルートユーザー`、`IAMユーザー`が作成されている。

# 手順

1. [はじめに](#はじめに)
1. [S3とは](#s3とは)
1. [バケットとは](#バケットとは)
1. [リージョンとは](#リージョンとは)
1. [バケットの作成](#バケットの作成)
1. [IAMユーザーの情報取得](#iamユーザーの情報取得)
1. [バケットポリシーの設定](#バケットポリシーの設定)

# はじめに

今回は`S3`を使用する前準備として、自分用の保存場所を作成していきます。

# S3とは

AWSの中のサービスの1つであり、`Simple Storage Service`を略してS3と呼んでいます。

# バケットとは

S3では自分用のデータを保存する場所のことを`バケット`と呼びます。

# リージョンとは

S3に保存されたデータは実在の施設に分散して保管されています。
その実在の施設が所在している場所を`リージョン`といいます。

# バケットの作成

それでは、実際にバケットを作成していきます!

この作業はルートユーザーのまま設定を進めます。
ルートユーザーではないと確認できない情報があるため、もしIAMユーザーでログインしている場合は、ルートユーザーにログインし直しましょう。

まず画面上部のメニューバーから`サービス`をクリックし、サービス一覧から`S3`を選択して`S3ページ`を開きます。
その後`バケットを作成`を選択し、S3バケットのページに遷移します。

次に`バケット名`を入力し、リージョンが`アジアパシフィック（東京）`になっていることを確認します。
バケットの名前はアクセスするときのURLに使用されるため、英数字で、まだ誰も付けたことがない名前を使う必要があります。

![バケット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337030/f2268a18-8153-bf9e-8dc9-7b62734458c1.png)

画面を下にスクロールすると、アクセス許可の設定が表示されます。

今回は`バケットポリシー`というものを使用して、S3のセキュリティ対策を行います。
まずは、`パブリックアクセスをすべてブロック`のチェックを外し、画像のように3つのチェックボックスにチェックを入れます。
この設定が誤っているとファイルのアップロードができなくなってしまいます。

![バケット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337030/5a002ac4-3b77-b97b-ce46-516c1eef0e6f.png)

入力できたら、下にスクロールししましょう。
オプション設定が表示されますが、何も入力せず、`バケットを作成`をクリックしましょう。

ここまでで、バケットを作成することができました。

# IAMユーザーの情報取得

次に`バケットポリシー`の設定をするため、IAMユーザーの情報を取得します。

まず`IAMユーザー`の情報を取得します。画面上部のメニューバーから`サービス`をクリックし、IAMページへ遷移します。
次に左のサイドバーから`ユーザー`をクリックし、IAMユーザーページの`作成したIAMユーザー名`をクリックします。
ユーザー概要のページに遷移したあと、`「ユーザーのARN」`をコピーします。
この`「ユーザーのARN」`は後ほど使用します！

# バケットポリシーの設定

次に、`バケットポリシー`の設定を行います。
`バケットポリシー`とは、バケットに対して、どのユーザーがどの処理をできるか取り決めをするものです。
今回は、IAMユーザーのみバケットにアクセスできるよう設定していきます。

画面上部のメニューバーから`サービス`をクリックし、サービス一覧から`S3`を選択します。
その後、先ほど作成した`バケット名`をクリックします。
次に、画面中央の`アクセス許可`をクリックし、バケットポリシー設定の、`編集`をクリックします。

![バケット3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337030/6fe1bad8-bf69-3c9f-5771-177c43445c4b.png)

そして、下記のバケットポリシーのコードをコピーし、「ポリシー」という入力欄に貼り付けます。

```ruby:バケットポリシー
{
   "Version": "2012-10-17",
   "Id": "Policy1544152951996",
   "Statement": [
       {
           "Sid": "Stmt1544152948221",
           "Effect": "Allow",
           "Principal": {
               "AWS": "①"
           },
           "Action": "s3:*",
           "Resource": "arn:aws:s3:::②"
       }
   ]
}
```

次に、ユーザーによって異なる個別の情報を入力します。

「①」の箇所に、先ほどコピーした`「ユーザーのARN」`を入力します。
「②」の箇所に、`作成したバケット名`を入力します。

問題なければ画面下にスクロールして、「変更の保存」をクリックしましょう。
問題なくバケット作成ができれば成功です。

# 最後に

以上でバケットの作成は完了です。
次回はアプリに導入する方法を投稿します。[【AWS】S3を用いた画像のアップロード](https://qiita.com/oak1331/items/74da3cf101e2e2107f32#heroku%E4%B8%8A%E3%81%A7%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E8%A8%AD%E5%AE%9A)
では。
Sec4 【EC2】Webサーバーを構築しよう

### 20. このセクションで構築するもの

EC2 ← SSH ←apache ← ファイヤウォール

パブリックサブネットをWebサーバーを設置。それに対してapacheをインストール。そしてインターネット表示できるようにファイヤウォールを設定

### 21. 22 EC2を設置しよう　Elastic Compute Cloud

AWSクラウド上の仮想サーバーのこと。OSより上のレイヤーは設定する事ができる。

1. AMIの選択
2. インスタンスタイプの選択
3. ストレージの追加
4. セキュリティグループの設定
5. SSHキーペア設定

#### AMI　Amazon Machine Image

インスタンスの起動に必要な情報が入った、OSイメージ。サーバーのテンプレートの様なもの。
OSを入れる必要がない。カスタムAMIも簡単に作れる。

#### インスタンスタイプ

サーバーのスペックを定義する情報 m5.xlargeなど。（CPU、メモリ、ストレージなど

#### ストレージ

サーバーにくっつけるデータの保存場所。

##### EBS

高い可用性と持つストレージ、他のインスタンスに付け替え可能。

##### インスタンスストア

インスタンス専用の一時的なストレージ
他のインスタンスには付ける事ができない、Stop/Terminateするとクリアされる。

### 23. SSHについて学ぼう

目的：サーバーを設置する。
→ サーバーを設置し、必要なソフトウェアをインストールすること。
SSHでサーバーのログインするとはなんぞ？

#### サーバーにログインする

離れたサーバーに入って、自分のパソコンから操作すること。

#### SSH

自分のパソコンとサーバーをセキュアに接続するサービスのこと、通信内容が暗号化された遠隔運用システム
SSHクライアント(自分のパソコン), SSHサーバー(Webサーバー)
SSHクライアントがSSHサーバーにログインを要求し、認められるとサーバーにログイン
→　ログインすると、まるで目の前にサーバーが存在するかの様に操作可能

### 24. 公開鍵認証

EC2に誰でもログインできると困る
→ 公開鍵認証を扱う。

#### 公開鍵認証

平文 × 暗号化(南京錠)　＝　暗号化
暗号文 × 複合化(公開鍵)　＝　平文
公開鍵　＝　南京錠

秘密鍵　＝　鍵

### 27. ポート番号について学ぼう

#### ポート番号

Webサーバー内において、各プログラム毎に割り当てられた、窓口のこと。

#### SSH接続の場合

自分コンピューターから⁇IPアドレスの⁇ポート番号に対して、SSH接続リクエスト
そのリクエストをルーティング経由で、指定されたIPアドレスのサーバーが受け取り、指定されたポート番号のプログラムが起動する。
今回の場合はSSH接続を可能にする“sshd”が起動する
とい流れ

ポート番号は、標準で割り当てられている場合と動的に設定される場合がある。
標準で割り当てられている場合は、接続元(クライアント・自分のコンピューター)から発信された種類によって定まる
動的に定めれる場合は、接続元が発信した場合にOSがランダムで決める。

### 28. apacheをインストールしよう

#### apache

HTTPリクエストがあると、それに対してリクエストを返し、ウェブページを表示するソフトウェア

### 29. ファイヤウォールを設定しよう

#### ファイヤウォール

ネットワークを不正アクセスから守る。「通して良い通信だけを通して、それ以外は遮断する」仕組み
AWSでは、セキュリティグループがファイヤウォールの役割を担う。

### 30. Elastic IPアドレスでIPアドレスを固定しよう

EC2インスタンスは起動・停止するとIPアドレスが割り当てられる。→動的にIPアドレスが変化する。

#### Elastic IPアドレス

インターネット経由でアクセス可能な固定のグローバルIPアドレスを取得でき、インスタンスを付与できるサービス。
Ubuntu on Raspberry Pi4をモニターなしでセットアップ

## Step.1 Ubuntuのイメージをダウンロード
下記のリンク先から`64-bit`イメージをDownloadしてください。
https://ubuntu.com/download/raspberry-pi

Raspberry Pi ImagerにもUbuntuがありますが、なぜかWiFiの設定を記述する`network-config`が生成されません。
なので、モニターなしでセットアップするにはイメージをダウンロードしてきて、MicroSDに書き込む必要があります。

## Step.2 MicroSD cardにイメージを書き込む
なんでもいいのですが、Raspberry Pi Foundationからリリースされている`Raspberry Pi Imager`が使いやすいです。
ここからダウンロードできます。
https://www.raspberrypi.org/software/

必要な操作は以下の通りです。
1. Raspberry Pi Imagerを起動
2. Operating System --> `Use Custom`
3. Storage --> Select your microSD card
4. `WRITE`をクリック

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r9wgn7sah9lu9koj0n6y.png)



## Step.3 networks settings
sshでの接続のためにMicroSDの中にある`network-config`ファイルを下記のように変更します。
`MY_WIFI` and `MY_PASSWORD`をご自分のWiFi情報に変更してください。

```zsh
version: 2
ethernets:
  eth0:
    dhcp4: true
    optional: true
wifis:
  wlan0:
    dhcp4: true
    optional: true
    access-points:
      "MY_WIFI":
        password: "MY_PASSWORD"
```

## Step.4 Check user-data
MicroSDカード内の `user-data` を開いて、sshの箇所を確認してください。
 
```zsh
# On first boot, set the (default) ubuntu user's password to "ubuntu" and 
# expire user passwords
chpasswd:
  expire: true
  list:
  - ubuntu:ubuntu

# Enable password authentication with the SSH daemon
ssh_pwauth: true
```


##　Step.5 ubuntuにsshでアクセス
アクセスするために、Raspberry Piのipを確認する必要があります。

macを利用されている場合はarp-scanが簡単です。

```zsh
# install arp-scan via homebrew
$ brew install arp-scan

# scan localnet
$ sudo arp-scan --localnet
```

Raspberry Piと表示されるので、そのIPアドレスを利用して下さい。

```zsh
$ ssh ubuntu@raspberrypi_ip_address
# password is ubuntu
```
レーザー彫刻機２号機　部品調達　その1

# 部品の調達　その1

ほとんどの部品はアリエクスプレスにお世話になります。

###ステッピングモーター
NEMA17／59 N･cm　３個セット販売しているものが買いやすいです。
１個1000円程度と激安。
コネクタタイプかグロメット（コード付き）かはお好みで。
コネクタタイプの方が配線が簡単かも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/cc4596f9-5aa9-968e-8660-06bf195b5588.png)


###リニアガイド
X軸　MGN12C レール400mm (１本)
Y軸　MGN12H レール350mm (２本)
これまたTHKなどと比べると信じられないくらいの安さ。
１本2000円弱。HIWINのコピー品。(HIWINをコピー･･･時代は変わりましたｗ)
レールにストッパが付いていればバラけてしまわないので有り難い。（ただし運？）
レールとブロックが別々で送られて来たら、運が悪かったと思って慎重にレールへの組み込みを行いましょう。
予備の転動体（玉）が付属しているので大丈夫。初心者は必ず”やっちゃう”からボールの予備は親切（笑）
玉のバラバラがどうしても許せない人はTHKのリテーナー付きSRS12NとかMとかを使うと幸せなれます。
このコピー品は安物で、精度も悪いので予圧はかかってなさそうです。
動かすと転動体径が明らかにバラバラでひっかかりを感じますが気にしてはいけません。
（荷重をかけてちゃんと動けばOK）
ギトギトの油を綺麗にして、レールの溝（両サイドのVになっているところ）に
2番のリチウムグリースを塗ってブロック内の転動体にグリースを行き渡らせたら使用可能。
送られてきたままで使用しないこと。柔らかめのリチウムグリースがおすすめ。
シリコングリースを使っちゃダメですよ。モリブデンも黒くて汚れるからNG。
グリースが行き渡ると変なひっかかりやすべりが軽減するはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/3c1ca02f-4074-81db-64b6-80ae765a269a.png)


###電源
アルミフレームの下にぶら下げるため、12V 8.5A 100Wの細長いスイッチング電源を使用。
LED電飾で使われているもの。
1000円程度で激安だが、壊れても泣かない覚悟は必要。
分解してアルミ電解コンデンサを日本製に入れ替えると安心感が増します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/966ae686-e96f-a33d-9fad-d0e0cc02b923.png)


###アルミフレーム
アルミフレームをaliで買うのはどうしてもコスパが悪いので、
(ここを見ている人には申し訳ないのですが)
勤務先のアカウントを使ってミスミから調達しました。
aliだと定尺物を買って自分で切断する必要があります。
サイズは2020。

###ねじやブラケットなど
ねじは主にM5とM3を使用します。
フレーム締結はM5、リニアガイド締結はM3になります。
フレームナットに後入ればねナットを買ったのですが、これがまた精度が悪くちゃんと入らない！
組立中にイライラすること間違いありません。（フレームがミスミだからか？）
イライラしたくない人は、42円/個でミスミ製を買うことをおすすめします。快感です。
aliで買うと16円/個くらい。
フレームに入れるナットの数を組立前にちゃんと把握出来る賢い人はもっと安い先入れナットを使うこともできます。5円/個。ちなみにM5用のフレームナットは100個くらい使います。安く作りたい人は先入れナット一択です。

直角ブラケットは20mm x 20mmの激安アルミブラケットを買いました。（ミスミには無いサイズです）
https://ja.aliexpress.com/item/1005002059309752.html?spm=a2g0s.9042311.0.0.53a94c4dpfS1WK
製品写真があまりに酷いので恐る恐る1ロットだけ注文して現物確認したところ、そこまでは悪くなかったので一安心。直角度も問題なさそうでした。30円/個。反転出来ないタイプです。2カ所ある反転で使う部分には、突起を削って対応します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/07c010da-09da-3723-b479-df6a08a03ae4.png)

###プーリーとアイドラー
タイミングベルトは6mm幅のGT2を使用します。
ステッピングモーターのシャフト径φ5と同じ内径のプーリーとアイドラーを選びましょう。
歯数は20Tになります。（これ以上大きいとフレームに当たる）
アイドラーはだいたい300円/個くらい、プーリーも200～300円/個くらい。
アイドラーのベアリングが薄すぎてボルトを締め込むと回転しなくなってしまいます。
ここは要変更かと思っています。

長くなったので今回はここまで。
次回はアクリルの外装や接続プレートの調達方法です。
[JS]mapとforEachの違い

##はじめに
JavaScript初学者です。
mapとforEachの違いについて学んだので備忘録として残しておきます。

##公式ドキュメント
それぞれ公式ドキュメントから説明を引用させていだだきます。
####[map](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)の場合

map() メソッドは、与えられた関数を配列のすべての要素に対して呼び出し、その結果からなる新しい配列を生成します。

####[foreach](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)の場合

forEach() メソッドは与えられた関数を、配列の各要素に対して一度ずつ実行します。

要するに2つの違いは新しい配列を返すか返さないかということになります。

## 具体例
####forEachの場合

```
const Array = [1,2,3,4,5]

console.log(Array.forEach(x => x * 2 ))
=> undefined
```

forEachは処理するだけなので返り値は何もありません

####mapの場合

```
const Array = [1,2,3,4,5];

console.log(Array.map(x => x * 2 ))
=>  [2, 4, 6, 8, 10]
```
mapは処理をした上で新しい配列を返してくれます。


もしforEachで新しい配列を作りたい場合は以下のようになります。

```
const Array = [1,2,3,4,5];
const newArray = [];

Array.forEach( x => newArray.push(x * 2) );
console.log(newArray)
=> [2, 4, 6, 8, 10]
```

##まとめ
今回はmapとforEachを比較しましたがmapの方がコードがシンプルかつ新しい配列を返してくれるので便利だし実際mapの使用率の方が高そうです。

しかしforEachの方が処理速度が早いらしいです、また新しい配列を返さないので使い分け考えてコードを書いてみるのも良いかもしれませんね。
インストール済みの VSCode (Visual Sutdio Code) Extension の公式 URL ページリスト化

VSCode の拡張機能をほかの人に受け渡しするときに、Extension 一覧を公式の URL に変換する方法をまとめました。
Extension を共有したいけれど、公式ページで確認しながらインストールしたい要望にお応えできるかと思います。
ワンライナーで書いているので、コピペで簡単に動きます。

この記事は Windows の PowerShell で確認しています。

## 前提

VSCode をコマンド上から実行できるか確認しておいてください。

```powershell
code --version
```

下記のようにバージョンが取得できれば、この記事の方法が使用できます。

```powershell
PS C:\> code --version
1.57.0
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x64
```

## VSCode Exstension の URL リスト

### 自分の Extension リストをもとに作成

```powershell
code --list-extensions | ForEach-Object { Write-Host https://marketplace.visualstudio.com/items?itemName=$_ }
```

出力例。

```txt
https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client
https://marketplace.visualstudio.com/items?itemName=csholmq.excel-to-markdown-table
https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint
https://marketplace.visualstudio.com/items?itemName=docsmsft.docs-markdown
https://marketplace.visualstudio.com/items?itemName=joffreykern.markdown-toc
https://marketplace.visualstudio.com/items?itemName=ms-python.python
https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter
https://marketplace.visualstudio.com/items?itemName=sohamkamani.code-eol
https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.keyoti-changeallendoflinesequence
https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf
https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one
```

ためしに、 https://marketplace.visualstudio.com/items?itemName=ms-python.python を参照してみてください。
Python の拡張機能ページが表示されると思います。

また、上記ページから拡張機能をインストールこともできます。

### Extension リストをテキストファイルでもらった場合

Extension リストをテキストファイルに保存しているのであれば、下記の方法も使えます。
下記例では、`vscode-extensions.txt` に Extension リストが保存されており、それを URL リストに変換します。

```powershell
Get-Content vscode-extensions.txt | ForEach-Object { Write-Host https://marketplace.visualstudio.com/items?itemName=$_ }
```

出力例は省きます。

## メモ

前の記事で Extension リスト化した理由はこういう応用できるからなのでした。

https://qiita.com/mainy/items/3072e68e704eae1421c1
rubyを使ってSSH越しにDBへアクセスしたい

# 概要
rubyで動的に生成したクエリをDBに対してパラメータを少しずつ変えて繰り返し実行したいけど、対象のDBはsshしないとアクセスできないんだよな〜って場合の解決方法です。（もっと良い方法あったらコメントでこっそり教えてください。）

## まずはローカルで
まず、以下のような例でローカルのDBに対してクエリを繰り返し実行するrubyのプログラムを書いてみます。

**ストーリー**

- 発行されるクエリはバッチの対象者抽出クエリ
- 条件の日付を１日づつ変更して各日付でどれだけ抽出されるのか調べたい

```ruby:test.rb
require 'mysql2'
require 'date'

start_date = Date.new(2021, 6, 1)
end_date = Date.new(2021, 6, 5)
current_date = start_date

db = Mysql2::Client.new(host: "127.0.0.1", username: "hoge", password: '', :encoding => 'utf8', database: 'test')

query = <<~EOS
        SELECT
          count(id)
        FROM
          users
        where
          updated_at  = ?
        EOS

while current_date < end_date do
  request = db.prepare(query)
  result = request.execute(current_date)
  result.each { |c|
        puts "#{current_date}\n#{c["count(id)"]}アカウント"
    }
end
```

上記のものを実行すると以下のような感じで結果が出てきます。

```shell:sh
$ ruby test.rb
2021-06-01
0 アカウント
2021-06-02
1 アカウント
2021-06-03
0 アカウント
2021-06-04
0 アカウント
```

# ssh越しのDBに対して実行できるように変更していく
ssh越しのDBに対して実行できるように変えたものが以下です。

```ruby:test2.rb
require 'mysql2'
require 'date'
require 'net/ssh/gateway'

gateway = Net::SSH::Gateway.new(
  'host', # SSHするホスト
  'user', # SSHするユーザー
  port: 22,
  keys: ['~/.ssh/id_rsa']
)

start_date = Date.new(2021, 6, 1)
end_date = Date.new(2021, 6, 5)
current_date = start_date
gateway.open('DBがあるサーバーのホスト', 3306) do | port |
  db = Mysql2::Client.new(host: "127.0.0.1", port: port, username: "hoge", password: '', :encoding => 'utf8', database: 'test')

  query = <<~EOS
        SELECT
          count(id)
        FROM
          users
        where
          updated_at  = ?
        EOS

  while current_date < end_date do
    request = db.prepare(query)
    result = request.execute(current_date)
    result.each { |c|
        puts "#{current_date}\n#{c["count(id)"]}アカウント"
    }
  end
end
```

## 最後に
例だと5日分ですが、１年分をやろうとすると、とても手作業でやる気にはならないのでこういった自動化が有用に思えます。
SSHしなくてもDBダンプしてきてやればいいじゃんと思う方がいらっしゃるかもしれませんが、さっとダンプできるならその方がいいと自分も思います。
でも、バッチなどの抽出条件が複雑で複数テーブルをダンプしてこないといけなく、レコード数も膨大となるとダンプしてくるのも時間がかかります。
そういった場合に自分はこういった方法でやっています。
最後まで読んでいただきありがとうございました。

## 参考

- [class::Net::SSH::Gateway](http://net-ssh.github.io/gateway/v1/api/classes/Net/SSH/Gateway.html)
- [RubyでSSHトンネル経由でサーバにアクセスする](https://qiita.com/yuku_t/items/03e2e507add1cd2e2a40)
機械学習の環境構築をMacbook Proで

# はじめに
Macbook Proを新調したので新しい分析環境を構築したのでその備忘録。
※昨今はクラウド環境で分析実行する場合が多いと思うので、この後でトライ予定。

## Xcodeのインストール

この後の工程でインストールするツール群でXcodeを参照しているツールがあるようで、
何かと必要になるため最初にインストールしてしまう。
XcodeはAppStoreから検索してダウンロードしてインストール。

Xcodeの容量が大きいためWifi環境推奨。ダウンロードに３０分くらいかかる。

## Homebrewをインストール

HomebrewのWebサイトにアクセスしてコマンドをコピーしMac上の
https://brew.sh/index_ja

5分くらいでターミナル上に以下のメッセージが表示されます。
`Installation successful!`

##Homebrew経由でdockerをインストールする

`brew install docker`



`brew cask install docker`

`open /Applications/Docker.app`

# dockerを使ってanacondaのコンテナをダウンロード

```ruby:ターミナル
>docker pull continuumio/anaconda3

>docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
continuumio/anaconda3   latest              5fbf7bac70a0        2 months ago        2.63GB
```
# 
```ruby:ターミナル
docker run -i -t -p 8888:8888 --name 200112test -v $(pwd)/notebooks:/opt/notebooks continuumio/anaconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser --allow-root"
```

```
[I NotebookApp] The Jupyter Notebook is running at:
[I NotebookApp] http://cb39b0d604d7:8888/?token=91f1de7da9082b944efac9f7000b3bbfab1335879ff0802e
```

```
http://localhost:8888/
```

```
docker run -i -t -p 8888:8888 -v $(pwd)/data:/data continuumio/miniconda3 /bin/bash -c "/opt/conda/bin/conda install jupyter -y --quiet && mkdir -p /data/notebooks && /opt/conda/bin/jupyter notebook --notebook-dir=/data/notebooks --ip='*' --port=8888 --no-browser--allow-root"
```
# 参考
[【決定版】MacでPythonを使って『機械学習』を学ぶための環境構築](https://qiita.com/yoshizaki_kkgk/items/4663148a2b3ca078ddbc)

[【Mac】Docker を使って最速で Python 3.x 環境を構築する](https://qiita.com/nskydiving/items/8d2f4a463a7f26b0da42)
【Mac】Docker Desktopをコマンドで起動/終了する

# 始めに
マウスに手を持っていくのが嫌すぎて、コマンド実行ですべてを完結させたいと思っている今日この頃です。
今日は、Launchpad(アプリ一覧の一覧を開くやつ)を使わなくても、コマンドからDocker Desktop(アプリケーション)を起動/終了する方法を紹介します。

# 起動コマンド
`-a` ･･･ パスを書かずに/Applications配下のアプリケーションを開くオプション

```bash
open -a Docker
```

# 終了コマンド

```bash
osascript -e 'quit app "Docker"'
```

# aliasで引数を受け取るようにする
最後に`;`がないと、エラーになるので注意してください。

```bash:.bashrc
# 引数に指定したアプリケーションを起動
function start() { open -a $1; }

# 引数に指定したアプリケーションを終了
function stop() { osascript -e "quit app \"${1}\"";}
```

# 備考
`bash`と`zsh`で動作することを確認しました。

# 参考
[openコマンドとは](https://qiita.com/akameco/items/9291007de6e22a9024a2)
[osascriptコマンドとは](https://shuzo-kino.hateblo.jp/entry/2015/01/03/234722)
Kubernetesの学習内容まとめ①

業務で携わったことは無いですが個人的にコンテナ技術に興味があり、Kubernetesについて学習したので、本記事にまとめてみました。記載内容は概要的なものです。（Kubernetesのアーキテクチャやリソースについては別記事に記載予定です。）

①Kubernetesの概要　　　　←本記事記載
②Kubernetesで出来ること　　　　←本記事記載
③Kubernetesの基本知識を知る　　　　←本記事記載
④Kubernetesのリソースを知る　　　　←別記事記載予定
⑤Kubernetesアーキテクチャを知る　　←別記事記載予定
⑥Kubernetesのまとめ　　　　←別記事記載予定

#①Kubernetesの概要
###Kubernetesとは
Kubernetesはコンテナのデプロイやスケーリングなどの管理を自動化するためのコンテナオーケストレーションツールです。コンテナオーケストレーションツールはKubernetesの他にOpenShift、DockerSwam、Mesos、Rancher、Amazon ECS等色々とあります。この中でも最も使用されておりデファクトスタンダートになっているのがKubernetesです。([sysdig-2019-container-usage-report](https://sysdig.com/blog/sysdig-2019-container-usage-report/)) Kubernetesを使用することで、コンテナの手動での管理から解放されます。

###Kubernetesの歴史
Linux Foundationのプロジェクトの1つで、コンテナ技術の推進と、その進化を取り巻くテクノロジー業界の足並みを揃えるために創設された財団のCNCF(Cloud Native Computing Foundatioin)がホストして、コミュニティーが主体となって開発が進められています。2015年7月以前はGoogleがホストしていましたがKubernetesバージョン1.0となったタイミングでCNCFに移管されました。Googleの社内で利用されていたコンテナクラスタマネージャの「Borg」をアイデアの元にして作られたのがKubernetesです。

#②Kubernetesで出来ること
###スケーリング/オートスケーリング
同じコンテナイメージを元に複数のKubernetesノードにデプロイすることで、負荷分散を実現することや耐障害性を向上することが出来ます。また、負荷に応じて自動的にコンテナ数を増減することが出来ます。

###ロードバランシング
特定のコンテナに負荷が集中しないように、負荷を分散することが出来ます。

###スケジューリング
コンテナをどのKubernetesノードにデプロイするのか管理する機能です。Affinity/Anti Affinityの機能を使用することで、コンテナ内のアプリケーションの特徴やKubernetesノードの性能を意識して、コンテナをKubernetesノードにデプロイすることが出来ます。例えば、ディスクのI/Oが多いコンテナを、ディスクがSSDのKubernetesノードにデプロイする、といった制御が可能になります。

###セルフヒーリング
Kubernetesでは標準でコンテナのプロセス監視を行っており、例えば、Kubernetesノードがダウンした場合、コンテナのプロセスダウンを検知して別のKubernetesノードにコンテナを復旧させる、といった動作が実現できます。このセルフヒーリング機能で耐障害性を高めることが出来ます。

###リソース管理
KubernetesノードのCPUやメモリのリソースに応じて、ユーザが意識する必要無く、コンテナのデプロイ先を自動的に調整します。また、Kubernetesノードのリソースの消費量に従い、Kubernetesクラスタのオートスケール機能でKubernetesノードを自動的に増減することも可能です。

###ローリングアップデート
コンテナ内のアプリケーションをアップデートする際に、新しいコンテナを追加してから古いコンテナを削除する手順を繰り返し行うことで、ダウンタイム無しでのアップデートを実現することが出来ます。

###サービスディスカバリ
前述のオートスケーリングやスケジューリング、セルフヒーリングなどKubernetesはダイナミックにコンテナを稼働させます。そのため、どこにどのコンテナが存在しているのか把握することが難しくなります。Kubernetesはコンテナがどこにいるのか、アドレスは何かなど把握して、ダイナミックに変化するシステムにおいてもコンテナが相互の相互アクセスを実現します。

###設定・機密情報の管理
環境変数やコマンドライン引数、パスワードやTLS証明書などの情報をKubernetesで一元的に管理することが出来ます。環境変数やコマンドライン引数はConfigMapで管理して、パスワードやTLS証明書等の機密情報はSecretsで管理します。

#③Kubernetesの基本知識
Kubernetesを知るためには、基本知識を押さえる必要があります。

##基本知識

###マニフェスト
Kubernetesでは、YAML形式やJSON形式で記述したデプロイするコンテナや周辺のリソースを管理するための宣言的なコードをマニフェストと呼びます。コードで環境を管理することが出来るので、KubernetesはIaC(Infrastructure as Code)を実現することが可能です。

###kubectl
kubectlと呼ばれるCLIツールを使用して、後述するKubernetes Masterに命令を送ります。ユーザはkubectlコマンドで様々な操作をすることができるようになります。kubectlコマンドで前述のマニフェストファイルを指定して使用することも出来ます。

###Kubernetes Node
KubernetesにはKubernetes MasterとKubernetes Node(以降、Node)の2つのノードがあります。NodeはDockerホストのような役割で、コンテナを実際に動作させる場所です。

###Kubernetes Master
Kubernetes Master(以降、Master)はマニフェストに記載されている内容を元にkubectlを通じて、指令を受け付けること、そして自分の管理下にあるNode上に受け付けた指令を実現させます。例えば、受け付けたマニフェストファイルが各Node上のコンテナ数を増加させる内容だった場合、実際に各Node上のコンテナ数を増加させる役割をMasterは担います。

----
　　
この記事は以下の情報を参考にして執筆しました。
[Kubernetes公式ドキュメント](https://kubernetes.io/ja/docs/home/)
[Kubernetes完全ガイド 第2版](https://book.impress.co.jp/books/1119101148)
ROS OpenCVを使う (C++)

ROSでdesktop-fullをインストールすると自動でOpenCVがインストールされます。
それを使用してC++からOpenCVを使ってみます。
今回の例では画像を読み込み、表示するといった簡単な処理を行います。

まずパッケージを作成します。

```
cd ~/catkin_ws/src
catkin_create_pkg opencv_test
cd opencv_test
mkdir src
```

そして、opencv_test/src内で画像を読み込み出力するプログラムを作成します。

```c++:src/main.cpp
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, const char * argv[])
{
    Mat img = imread( "image.png" );
    imshow("", img );
    waitKey(0);

    return 0;
}
```

以下コマンドでサンプル画像`image.png`をダウンロードします。

```
wget https://github.com/hoshianaaa/TestFiles/raw/master/image.png
```

CMakeLists.txtを次のように作成します。

```CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(opencv_test)

find_package(OpenCV REQUIRED) #追加
find_package(catkin REQUIRED)

catkin_package(
)

include_directories(
 include
 ${OpenCV_INCLUDE_DIRS} #追加
)

add_executable(main src/main.cpp)
target_link_libraries(main
  ${OpenCV_LIBRARIES} #追加
)
```

ビルドと実行をします。

```
cd ~/catkin_ws

catkin build #または catkin_make

source ~/catkin_ws/devel/setup.bash

cd ~/catkin_ws/src/opencv_test/src
rosrun opencv_test main
```
実行コマンドrosrunはopencv_test/src内で行うことに注意してください。
すると"image.jpg"が出力されます。


![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/d6819554-cdd5-ee28-2e49-56811c7e7a21.jpeg)

# 追加サンプル

上のサンプルではなく以下のプログラムのように単色画像生成すると画像を用意する手間を省くことができます。

```c++:src/main.cpp
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, const char * argv[])
{
    //Mat img = imread( "image.jpg" );
    //単色画像の生成(参考:http://opencv.jp/cookbook/opencv_mat.html の 「cv::vecを使う」
    cv::Mat_<cv::Vec3b> img(300, 300, cv::Vec3b(0,200,0)); // 追加

    imshow("", img );
    waitKey(0);

    return 0;
}
```

実行結果

![Screenshot from 2021-11-13 08-10-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/897fd000-0c58-9b51-5b2a-fe3481f29174.png)
「Uncaught ReferenceError: $RefreshReg$ is not defined」対応

# 問題

webworker を使っていると、webworkerから使っているソースで以下のようなエラーが出る。

```
Uncaught ReferenceError: $RefreshReg$ is not defined
```

# 対処方法
問題が起きたソースの先頭にこれを記述する。他の方法もあるようだが、これが一番簡単だった。


```
// @ts-ignore
self.$RefreshReg$ = () => {}
// @ts-ignore
self.$RefreshSig$ = () => () => {}
```

# 参考リンク
https://github.com/pmmmwh/react-refresh-webpack-plugin/blob/main/docs/TROUBLESHOOTING.md#usage-with-indirection-like-workers-and-js-templates
https://github.com/pmmmwh/react-refresh-webpack-plugin/issues/176#issuecomment-695780563
これだけは覚えたい、MongoDBのfindメソッド

## はじめに
***MongoDB*** をはじめて使う方向けにDB検索時の条件指定の方法をまとめました。

「これだけ覚えておけば大丈夫！」とは言えませんが、

- DB構造の把握をしたい
- 欲しいデータを表示したい

というときによく使用するコマンドなので覚えておいて損はないと思います。
実際には覚えるというよりは**どういう風に使うんだっけ・・？** ってなったときに見返せるように使っていただけたらと思います。

## 目次

- はじめに

- 目次

- 用語の違い

- 検索方法
    - 基本形
        - 全検索
        - ドキュメントを一つ取得

- メソッド
    - limit()
    - sort()
    - pretty()

- クエリ
    - {},{}
    - 特定の値を指定して検索
    - 第1引数で条件を指定
    - 第2引数で条件を指定

- 演算子(条件指定)
    - $lte
    - $gte
    - $in

- おわりに

- 参考文献
    - Mongoマニュアル
    - Qiita

## 用語の違い

RDBとの用語の違いです。

| RDB | MONGO |
|---|---|
| Database  | Database  |
| Table（テーブル）  | Collection（コレクション）  |
| Record（レコード）  | Document（ドキュメント）  |
| Column（カラム）  | Field（フィールド）  |

## 検索方法

DBを選択した前提で書いていきます。ここらへんのことも今後記事にしていきたいと思っていますが、今回は検索方法についてフォーカスしていきます。

#### 基本形

- 全検索

```terminal:
db.Collection.find()
```

- ドキュメントを一つ取得

```terminal:
db.Collection.findOne()
```

## クエリ

DATEというフィールドがあるとして話していきます。

#### {},{}

```
db.Collection.find(　{field: v},{field: 0}　)
```

- 第１引数には条件

- 第2引数には表示する（1） or 表示しない（0）


#### 特定の値を指定して検索

```terminal:
db.Collection.find( {DATE: '20210612'},{} )
```


#### 第1引数で条件を指定


```terminal:
db.Collection.find( {},{DATE:1} )
```

#### 第2引数で条件を指定


```terminal:
db.Collection.find( {},{DATE:0} )
```

## メソッド

#### limit()


| 意味 | n |
|:-:|:-:|
| ドキュメントをn件取得  | 数字(1, 2, 3, and so on) |

```terminal:
db.Collection.find().limit(n)
```

#### sort()

| 意味 | n |
|:-:|:-:|
| 降順  | -1  |
| 昇順  |  1 |

```terminal
db.Collection.find().sort( {"DATE": n} )
```

#### pretty()

読みやすい形で表示する

```terminal
db.collection.find().pretty()
```

## 演算子(条件指定)

| 演算子 | 用途 |
|---|---|
| $lt  | より小さい  |
| $lte  | 以下  |
| $gt  |  より大きい |
| $gte  | 以上  |
| $in  | いずれかを含む  |



#### $lte

選択したフィールドの値以下。
たとえば、年齢（フィールド）が20歳以下のドキュメント

```
db.collection.find( { age: { $ｌte: 20 } } )
```

#### $gte

選択したフィールドの値以上。
たとえば、年齢（フィールド）が20歳以上のドキュメント

```
db.collection.find( { age: { $gte: 20 } } )
```

#### $in

選択したフィールドの値を持っている。
たとえば、年齢（フィールド）が10歳か20歳のドキュメント

```
db.collection.find( { age: { $in: [ 10, 20 ] } } )
```

## おわりに

すべてを網羅しているわけではありませんが、このような使い方をすれば比較的かんたんにDB検索をすることができますし、困ることが少なくなるかと思います。

「こうした方がいいんじゃない？」、「これもよく使うよ」などご意見いただけたら幸いです。

## 参考文献


#### Mongoマニュアル

- [The MongoDB 4.4 Manual](https://docs.mongodb.com/manual/)
- [Reference](https://docs.mongodb.com/manual/reference/)
- [db.collection.find()](https://docs.mongodb.com/manual/reference/method/db.collection.find/)
- [Query and Projection Operators](https://docs.mongodb.com/manual/reference/operator/query/#miscellaneous-operators)
- [Cursor Methods](https://docs.mongodb.com/manual/reference/method/js-cursor/)

#### Qiita

- [MongoDB超入門](https://qiita.com/saba1024/items/f2ad56f2a3ba7aaf8521)
- [やってみようNoSQL　MongoDBを最速で理解する](https://qiita.com/Brutus/items/8a67a4db0fdc5a33d549)
- [MongoDB コマンドメモとか書き](https://qiita.com/svjunic/items/285e9cf20169d70aa1fa)
Amazon EC2にMacでSSH接続する

会社の Amazon EC2に接続しないといけないことがあったので、備忘として残します。
初心者は権限まわりを先に学ぶべきだと思った。。


<h2>必要な情報</h2>

・接続先EC2のグローバルIPアドレス or ホスト名
・ユーザ名
・秘密鍵（デフォルトは**.pemというファイル形式になります）


<h2>Linux操作</h2>

秘密鍵をホームディレクトリに配置します。

その後秘密鍵をsshに移動し、chmod（chenge mode?）で秘密鍵を読み書きできる権限に変更します。

```

$ mv 秘密鍵名.pem ~/.ssh/
$ chmod 600 ~/.ssh/秘密鍵名.pem

```

chmodについては下記が分かりやすかったです。

https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95

後は以下のコマンドでIPアドレスのEC2にssh接続ができます。

```

$ ssh -i ~/.ssh/秘密鍵名.pem [ユーザ名]@[IPアドレス or DNS名]

```

EC2接続はタイムアウトするので、常に自分が今どこに接続しているかlsコマンドで確認する癖をつける！
Terraform コマンドメモ

## 概要

時々思い出せなくなるので、自分用のメモです。

## コマンド

### モジュール名を変更する

```hcl
// 変更前
module "iam" {
  ・・・
}

// 変更後
module "cognito" {
  ・・・
}
```

```bash
terraform state mv module.iam module.cognito
```


### リソース名名を変更する
```bash
terraform state mv 旧リソース名 新リソース名
```
### tfstateファイルを取得

```bash
terraform state pull > tfstate.json
```
[Linux]シンプルなシェルスクリプトまとめ

#はじめに
シェルスクリプトについて学びましてので簡単にまとめていきます！
なお、より詳しい内容や文法については、また後日まとめるつもりです。
今回は、「シェルスクリプトってなんだろう」レベルを「なんとなくわかった」レベルにすることを目的としている点をご了承ください。

#シェルスクリプトとは
シェルスクリプトとは、シェルのコマンドラインをあらかじめ記述しておくファイルのことです。どんなコマンドであっても、毎回入力することなくファイルさえ読み込ませれば簡単に実行することができます。また、ミスを減らすことも可能です。

#どのシェルで書けばいいのか
結論、shではなくbashで書くことがおすすめです。
現代のLinuxではほぼデフォルトでbashがインストールされてます。bashで書かれたシェルスクリプトは高い互換性・移植性をもつ上に、便利な機能がたくさん用意されています。そうした観点からも、特段の理由がなければbashで書くことがおすすめです。

#シェルスクリプトの作成

それでは実際に作成していきます。
まずは`homesize.sh`というファイルを作成し、以下のように記述します。

```:homesize.sh
#!/bin/bash
du -h ~ | tail -n 1
```

とりあえず解説は後にして、このファイルに実行権限をつけましょう。

```:terminal
% chmod +x homesize.sh
```

これで実行権限がつきました。
では実行してみましょう。

```:terminal
% ./homesize.sh
12M /home/tochikawa
```

なお、ファイル名で指定する際は、ファイル名の前に./をつけますので注意してください！

#実行形式
さて、とりあえず実行まではできました！
でも理解はまだですね、解説します。

```:homesize.sh
#!/bin/bash
du -h ~ | tail -n 1
```

さきほど、ファイル名を指定して実行した。すると、Linuxカーネルは記述された`#!/bin/bash`という一文から「このシェルスクリプトは/bin/bashで動かします」と言う宣言を読み取り、それ以下のコマンドを実行します。
なお、この宣言の一文を**シバン**といいます。

このシバンがあるおかげで、実行の際にいちいち、

```:terminal
% /bin/bash ./homesize.sh
```

とする必要はなくなるわけです。

#その他実行方法（sourceコマンド）

実は、他の方法でも実行することができます。

例えば、sourceコマンドを使えば以下のようなシバンがない記述でも実行が可能です。

```:homesize.sh
du -h ~ | tail -n 1
```

sourceコマンドは、指定したファイルの内容をそのままコマンドラインに入力したときと同じように実行します。なお、sourceコマンドはあくまで記述したファイルの内容を一行づつシェルに読み込ませているだけで、ファイル自体は読み込んでないので、実行権限は不要です。また、sourceコマンドで実行したコマンドはカレントシェルに影響を与えるため注意が必要です。（例えば、アイリアスの設定がシェルスクリプトに書かれていたとして、sourceコマンドを実行した後、そのエイリアスの設定はずっと有効になります。）

なんでそんなことが起きるのかというと、soruceコマンドではカレントシェルでシェルスクリプトが実行されるのに対して、ファイル名で実行した場合はサブシェルで実行されるためです。サブシェルは現在のシェルから起動される子プロセスのシェルでカレントシェルとは別物であるため。環境変数の変更を引き継ぎません。

#自分だけのシェルスクリプトの置き場を作る
今後様々なシェルスクリプトを作ると思います。その際に、cd,lsのようなコマンドみたいにできると便利ですよね。

というわけで、独自コマンドを作ってみます！

```:terminal
% mkdir ~/bin

% mv homesize.sh ~/bin
#サーチパスに~/binを追加
% PATH="$PATH:~/bin"
#設定を有効化
% source ~/bish_profile
```

このようにすると、あたかも通常のコマンドのように実行できます

```:terminal
% homesize.sh
```

#おわりに
次回はもっと詳しく解説したいと思います！！！
EclipseでTomcatが起動できないときの対処法（Mac）

<h2>Eclipseでサーバーが起動できない</h2>

Javaの開発でEclipseを使用しているのですが、サーバー起動中にブラウザを閉じたりすると「ポート番号8080が使用中です」と表示される。


<ol>
<li>ターミナルを起動し、「lsof -i:8080」と入力する</li>


<li>PIDを確認する</li>

<li>kill (さきほど確認したPID番号）を実行</li>

<li>再度EclipseからTomcatを起動する</li>
</ol>

意図的にポート番号を8080から変更したい場合は「server.xml」のport番号を書き換えればOK。
Scilabのボード線図の描画エラー

#概要
Scilabのボード線図は正しくない場合があります。


#伝達関数
1kHzカットのハイパスフィルタで試します。

```
G=
    0.0001s    
   ----------  
   1 +0.0001s  
```
の時ボード線図は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/f7d72648-0e82-f8f3-ea29-60575c4dd845.png)
1kHzカットが出ていません・・・

実際のボード線図は

![6_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/5e946c95-7273-0156-a72e-bf446635ac82.png)

横軸は[Hz]です。

ちゃんと1kHzでカットするハイパスフィルタになってます。


#結論
Scilabのボード線図は間違っている場合があるので注意してください
私が間違っているかもしれないですが、理由が知りたい


#コード

```C
close;

s = %s; //記号変数の定義

Rc = 10^(-4)
Rfc= 10^(-4)

Gs = Rc*s/(1+ Rfc*s) //伝達関数の定義 
G = syslin('c', Gs); //連続時間システムの定義


bode(G,[10^-3,10^8]);

```
Anacondaでのpython2.x系環境への切り替え

# はじめに

初学者向けにPython2.x系環境の作り方と切り替え方を手短に説明していきます．

# python2.x系環境の作成

ここではpython2.7の環境を構築することとします．
Anaconda Promptにて以下のコマンドを実行します．

```sh
$ conda create -n py27 python=2.7 anaconda
```
環境名は任意であり，今回はpy27という文字列にしました．
pythonのバージョンも任意に変更できます．

# 生成したpython2.x系環境への切り替え

Anaconda Promptにて以下のコマンドを実行します．

```sh
$ conda activate py27
```
以上で切り替え完了です．Anaconda Promptの(base)が(py27)に変化していれば成功です．

元の環境(python3.x)に戻すには，

```sh
$ conda deactivate
```
を実行します．

# 参考文献

- K-Lab Anacondaを用いたPython 2.x系と3.x系の使い分け

https://www.nemotos.net/?p=2633
Gitの基本的なコマンド一覧

# 説明
- Gitコマンドの簡単な説明をしています。
- Gitの初学者向けに使い方の説明とコマンドを忘れた時の手助けになればと書き始めました。
- 今回はコマンド一覧と簡単な説明だけで次回、以降詳しく説明していきます。

# 主なコマンド一覧＆簡単な説明
-  git init ->リポジトリの初期化
-  git status ->リポジトリの状態確認
-  git add ファイル名 ->ステージ領域へファイルを追加
-  git commit ->リポジトリの歴史を記録（詳細なコミットメッセージを記述できる）
-  git commit -m "コミットメッセージを記述する" ->リポジトリの歴史を記録（1行のコミットメッセージを記述する）
-  git commit -am "コミットメッセージを記述する" ->git addとgit commit -mを同時に行う
-  git commit --amend ->コミットメッセージを修正
-  git log ->コミットログを確認できる
-  git log --pretty=short ->コミットログのコミットメッセージの１行目のみを表示する
-  git log --graph ->ブランチを資格的に確認できる
-  git diff ->変更差分を確認できる
-  git diff HEAD ->ワークツリーと最新のコミットの差分を確認できる
-  git branch ->ブランチの一覧表示
-  git branch -a ->リモートリポジトリの一覧も表示してくれる
-  git checkout ブランチ名 ->任意のブランチに切り替える
-  git checkout -b ブランチ名 ->ブランチを作成し切り替える
-  git checkout - ->1つ前のブランチに切り替える
-  git merge --no-ff ->ブランチをマージする
-  git reset --hard コミットID ->歴史を戻る
-  git reflog ->リポジトリで行われた作業のログを確認できる
-  git rebase -i ->歴史を押しつぶして改変する
-  git remote add origin "clone sshのURL" ->リモートリポジトリを登録できる
-  git push -u origin ->リモートリポジトリへ送信する
-  git clone "clone sshのURL" ->リモートリポジトリを取得する
-  git pull ->最新のリモートリポジトリブランチを取得する
VSCode (Visual Sutdio Code) Extension のインポート/エクスポート

VSCode の拡張機能をほかの人に受け渡ししたり、Extension 一覧をバックアップしておく方法をまとめました。
どちらもワンライナーで書いているので、コピペで簡単に動きますしバッチにも組み込みやすいです。

この記事は Windows の PowerShell で確認しています。

## 前提

VSCode をコマンド上から実行できるか確認しておいてください。

```powershell
code --version
```

下記のようにバージョンが取得できれば、この記事の方法が使用できます。

```powershell
PS C:\> code --version
1.57.0
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x64
```

## VSCode Exstension のエクスポート

`vscode-extensions.txt` にテキストとして出力します。
このコマンドは Mac でも Linux でも実行できます。

```powershell
code --list-extensions > vscode-extensions.txt
```

出力されたテキストの例。

```txt:vscode-extensions.txt
bmewburn.vscode-intelephense-client
csholmq.excel-to-markdown-table
DavidAnson.vscode-markdownlint
docsmsft.docs-markdown
joffreykern.markdown-toc
ms-python.python
ms-toolsai.jupyter
yzane.markdown-pdf
yzhang.markdown-all-in-one
```

## VSCode Exstension のインポート

`vscode-extensions.txt` から Extension を一気にインストールします。
既にインストール済みの Extension は無視されます。

```powershell
Get-Content vscode-extensions.txt | ForEach-Object { code --install-extension $_ }
```

（参考）
上記のコマンドがわからない方は、下記の書き方だとわかりやすいかもしれません。

```powershell
$extensions_list_file = "vscode-extensions.txt"
foreach ($extension in Get-Content $extensions_list_file) {
    code --install-extension $extension
}
```
Mac とか Linux とかだとこうでしょうか？
（頭の中で書いたので、動かなかったらごめんなさい）

```sh
cat vscode-extensions.txt | while read line; do code --install-extension $line; done
```

## メモ

よくある記事では、エクスポート時に `code --install-extension ms-python.python` のような形でリストを保存するような記事ばかりでした。
コマンドと Extension のリストは別々に管理するのが好みなので、私はこのような方法を採用しています。