OmniAICreator/Qiita-1.07M huggingface dataset:
[セキュリティ]ハッシュと暗号化～CryptとHashの違い～

# はじめに

Laravelで、ユーザーのIDを生データでブラウザに不必要に表示してしまうのはいかがなものかと思い、Hashをすべきかencryptすべきか悩んで色々調べていた。
その時に自分の知識が浅はかすぎたことを痛感した、、、

Laravelでは「暗号化」の方法として`Crypt`ファサードによる`encryptString`やヘルパメソッドである`encrypt`が、「ハッシュ」の方法として`Hash`ファサードによる`make`メソッドがあるのは知っていたけど、どのように使い分けるか知らなかったのでメモ。

https://readouble.com/laravel/8.x/ja/encryption.html

https://readouble.com/laravel/8.x/ja/hashing.html

# 暗号化とハッシュの違い

上記のドキュメントに合わせてコチラを参考にしました。

https://tooljp.com/windows/chigai/html/IT/hash-encrypt-chigai.html

恥ずかしい話、ここを知らなかったです。。。

（生の文字列が小難しい文字列に変換されるので暗号化の手段の１つがハッシュ、と勘違いしていました。。。）

暗号化とハッシュの違いは色々ありますが大きな違いは「その処理の目的」と「性質」かなと思います。

## ハッシュ

目的：不可逆なデータに置換え。開発者すら復元は不可なデータにする。

性質：不可逆。元のデータに戻せない

## 暗号化

目的：データの秘匿。

性質：元データに復元可能

# 具体的な使い分け

では、具体的にどう使い分けるか、例を挙げて考えてみた。

今回は「DBに保存するにはハッシュ？暗号化？」を考える

### ※注意

- あくまで個人的に「どうするべきだろう？」とフラットに仮説を立てているだけであり、**実際は先輩に聞きつつデータをどのように扱うべきか相談するかな**と思います。
- 自分はセキュリティについてはぺーぺー中のペーペーです。他にもいろんな方法があるかもですが、ここでは **「暗号化」、「ハッシュ」の違いを整理にするために書き留めているに過ぎない** という点はご留意ください。

## メールアドレス

- ユーザーへのメール送信ができなくなるので、ハッシュは使えない
- しかし、個人情報保護の観点から秘匿にすべきなので「暗号化」する

## パスワード

- 特に漏らしてはいけない情報で、これはアプリケーション内で使うことはないため「ハッシュ化」で問題ない

- ※余談だが、サイトで「パスワードを忘れた方へ」で再パスワードを作成するのはこの不可逆性なのかと納得

## 住所

- アプリケーションの提供者、運営者側からのはがきや商品の郵送時に必要であるため、ハッシュ化できない。
- 個人情報保護の観点からも「暗号化」が適していると思われる。

## 電話番号

- コチラもアプリケーション提供者、運営者からの最終連絡手段として元データは必要のためハッシュ化できない
- 個人情報保護の観点からも「暗号化」が適していると思われる。

パッと思いつくのがこれくらいですが、基本は「暗号化」、パスワードについては「ハッシュ」なのかな、なんて思いました。不可逆という性質にすべきか否かが判断分かれるところかも。

# おわりに

- 今回改めてハッシュと暗号化の違い、その使い分けを考えてみた
- 調べていると、開発者としては結構当たり前の知識かと思うので今更ながら学びました。。。
- こういう知識をインプットしたうえで[こういうニュース]([https://www.itmedia.co.jp/news/articles/2203/15/news172.html](https://www.itmedia.co.jp/news/articles/2203/15/news172.html))を見ると怖いなあ、、、って思うと同時に、「なんでそんなリスクを負うんだろう？」とギモンに思います。結構最近のニュースだし…
    - 恐らくセキュリティに疎い、権力のある関係者の強い要望でユーザーの利便性を重視すべくこうなったのでしょう。。。
- ちなみに結局、冒頭のIDのハッシュ化及び暗号化の必要はない設計になりました笑

最後までお読みいただきありがとうございました！
【初心者応援】AndroidStudioの便利なショートカットまとめ

# はじめに

[新人プログラマ応援 - みんなで新人を育てよう！](https://qiita.com/official-events/3f21c92121aa125807b4)
ということで、先月から社会人となり、エンジニアになる方も多いのではないでしょうか？
上記イベントに合わせて初心者応援をキーワードとして記事を書いていこうと思います。

今回は初心者応援記事最後となる第6弾、開発時に便利な※ショートカットをいくつかご紹介したいと思います。
※ご紹介するショートカットはMac基準になります。

# その１：Shift2回で検索表示
Shift2回押すことで、クラスや特定のファイルを検索する際に便利な検索窓を表示することが可能です。
膨大なファイルの一覧から目視で探すのはもはや無謀と言えるので、利用必須なショートカットと言えます。

![スクリーンショット 2022-05-01 17.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/47e0e91d-51a5-9b7e-582c-0ea62e4f85d9.png)

# その2：command+option+lでコードのフォーマット
command+option+lで設定されているフォーマット設定に基づいてコートをフォーマットすることができます。
レイアウトのフォーマットも可能です、自分が対応した箇所は常にフォーマットすることを心がけたいところですね。
また、補足ですが、上記コマンドに合わせてShiftを押すことで、フォーマットの設定を表示することが可能です。

![スクリーンショット 2022-05-01 17.38.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/b4fa443a-00f1-a890-df6f-c0f629bc8611.png)

# その3：Control+Option+Hで呼び出し階層を開く
Control+Option+Hで対象関数がどのように呼ばれているか階層的に一覧で表示することが可能です。
一つ一つ呼び出し元に飛ぶ必要がなくなり、とても効率的ですのでおすすめのショートカットです。

![スクリーンショット 2022-05-01 17.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/b5839ccd-418f-c23a-e63e-3dd5f7f32075.png)

# その4：Control+Shift+Fでパスの中から検索
Command+Shift+Fで全てのファイルの中身を検索できます。
特定の文字列からstringの定義を探したり、コメントのTODOを検索したりとこちらの検索も大変便利です。

![スクリーンショット 2022-05-01 17.50.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/fa9c1136-d820-3fe5-9fd4-d6e711f20236.png)

# その5：Command+Shift+Uで選択範囲の大文字、小文字変換
Command+Shift+Uで選択している範囲を小文字、大文字と変換可能です。
大量の定数を定義する場合などに比較的利用でき便利ですね。

# さいごに
利用頻度の高いものを紹介してみましたが、いかがでしょうか？
他にも便利なショートカットがたくさんあるので、調べてみると良いかと思います。
Rocky Linux 8.8 の USB Linuxを作る

## 準備
   
   2つのUSBフラッシュメモリを準備します。2つのUSBフラッシュメモリのうち、1つは、USBインストーラを作成します。作成したUSBインストーラから USB Linuxを作成します。

## Rocky Linux ISOイメージファイルのダウンロード

   Rocky Linux ISOイメージファイルをダウンロードし、適当な場所に配置します。

   ~~https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.5-x86_64-minimal.iso~~
   
   https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.8-x86_64-minimal.iso
   

## Rufusのダウンロード

   Rufusは、ISOイメージファイルをUSBフラッシュメモリや外付けHDDに書き込み、起動ドライブを作成するためのソフトです。Rufusをダウンロードし、適当な場所に配置します。

   https://rufus.ie/ja/

   ~~https://github.com/pbatard/rufus/releases/download/v3.18/rufus-3.18.exe~~

   https://github.com/pbatard/rufus/releases/download/v4.2/rufus-4.2.exe

## USBインストーラの作成

   rufus-4.2.exe を起動します。ブートの種類にダウンロードした Rocky Linuxのisoファイルを指定します。

   ![Rufs_4.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/28b40a80-82eb-6c2b-9e38-59eb50a845cf.png)

   スタートボタンを押下して、作成を始めます。

## USB Linuxの作成

   Linuxを起動するPCに作成したUSBインストーラともう一つのUSBフラッシュメモリの両方を差し込んで、PCを起動します。PC起動時にF2やF12キーを押して、Boot Manager画面を開き、USBインストーラを選択します。

![DSC_0499.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/4fde7eeb-f2db-3820-024e-6f49d0c104fd.jpeg)


## Linuxのインストール
   
   Install Rocky Linux 8を選択します。

![DSC_0500.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/ee348d8f-3721-4995-99c0-34f0a2a1a19c.jpeg)


   インストール画面が表示されます。
   
![VirtualBox_Rocky Linux 8.5 2_25_04_2022_21_55_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/28b283ea-96d2-f354-e749-700c5fe72c75.png)

   
   日本語を選択します。
   
![VirtualBox_Rocky Linux 8.5 2_25_04_2022_21_55_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/8c2c3ef3-6be1-a644-e199-71b0f1be9501.png)


   インストール先(D)をクリックします。

![VirtualBox_Rocky Linux 8.5 2_01_05_2022_17_13_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/8bdb33dc-c2bc-5467-11e4-2b3bb3dcc2c9.png)

   USB Linux用のUSBフラッシュメモリを選択します。

![DSC_0511.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2639843/f0031c24-0c91-d7fd-d74b-10ae2e21c8e5.jpeg)


　 インストールの開始ボタンをクリックし、インストールを開始します。


## 参照情報
https://itlogs.net/ubuntu-bootable-usb/
pythonでハマりがちな誤差（随時加筆）

(随時加筆)

pythonで生じがちな誤差の根本原因は私の遭遇した限り以下の通り

- float型の精度の限界
  - 15,16桁付近から誤差が生じる

## log
ある数の桁数を求めるとき、その方法のひとつとしてlog10を適応した整数部分により求める方法がある。
このとき、ある数の桁数が大きいと誤差が生じるので注意。


```python:Anti-pattern
int(math.log10(int('9'*14)))
>> 13
int(math.log10(int('9'*15)))
>> 15
```

```python:Recommended
len(str(int('9'*14)))-1
>> 13
len(str(int('9'*15)))-1
>> 14
```

## 割り算
pythonでは割り算の演算として / と // がある。
/は割り切れるか否かに限らずfloat型に変換した演算を行う。
//は整数としての演算を行う。
このため、桁数が大きい整数の割り算の場合、//で計算した方が精度が担保される。
AWSソリューションアーキテクトアソシエイト（SAA）　合格体験記

## はじめに
私自身クラウドに関する勉強を始めたばかりですが、無事にSAAの試験に合格することができました。事前になかなか勉強時間を確保することができず、結局、3週間程度で知識を詰め込んで試験に臨みました。（本当であれば数ヶ月間しっかり勉強し、理解を深めた上で受験した方が良いと思います。。）

今回の合格体験を踏まえたオススメの勉強方法や反省点を紹介したいと思います。
IT初心者の方やこれからクラウドを勉強しようとされている方の参考になれば幸いです。

## 勉強教材
書籍
[AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4815607389/ref=pd_bxgy_img_sccl_2/356-8062770-1690545?pd_rd_w=uqS6I&pf_rd_p=020fee25-8ced-4191-bce3-27e7ce0c0e3b&pf_rd_r=A4XWKSD424VB7QQ1D7R1&pd_rd_r=a70a51fc-4f6e-478d-b136-fb44e6a8d9e7&pd_rd_wg=InCPQ&pd_rd_i=4815607389&psc=1)

模擬試験問題
[AWS Web問題集で学習しよう](https://aws.koiwaclub.com/)
有料のベーシックプランに加入しました。７問ずつがセットで出題されるので、通勤時間などのスキマ時間で取り組めるので便利です。クイズ感覚でとにかくたくさん解きましょう！

## 勉強の進め方
- まずは大体１週間かけて上記書籍を読み込みました。受験までの時間が限られていたため、この段階で完璧に覚える必要はないと考え、何とか１週間で一通り読みきりました。

- 「AWS Web問題集で学習しよう」のスタンダードプランに会員登録をしました。無料プランもありますが、問題数に限りがあるので、ケチらず有料会員になることをオススメします。

- #80~#130を重点的に解きました。実際の試験と難易度はさほど変わらなかったように思います。ただ解くだけではなく、間違った問題は解説や参考書をしっかりと読み、きちんと理解するよう心がけました。

- 問題集を解き続けると、同じパターンが何度か繰り返されていることがわかります。そのパターンは試験でもよく問われる問題なのでしっかり暗記しました。

## 反省点
- まずもっと試験時間を確保するべきでした。受験中も自信は全くなく、合格の文字を見てホッとしました。最低でも2ヶ月以上は時間をかけて、Web問題集は#80以降を繰り返し解き、理解を深めた方が良いと思いました。

- AWSクラウドプラクティショナーの合格後、続けて受験すべきでした。半年くらい前にクラウドプラクティショナーを合格していたのですが、その後時間を空けてしまったので勉強したはずのサービスの概要等を忘れてしまいました。クラウドプラクティショナーで基礎を身につけ、続けてSAAを受験した方が効率が良いと思います。

## 試験結果
合格ライン720点で、試験結果は729点とギリギリで合格することができました。。

## 終わりに
Web問題集でコンスタントに８割以上取れるようになれば、合格に近づきます。時間をかければ必ず合格することができると思います！
PythonのTkinterでじゃんけんゲームを作ってみた



## ゲームのソースコード

ゲームのプロジェクトは以下のリポジトリになっています。
初めてPythonでGUIを作った、無理矢理クラスやファイルを分けた、コメントが少なかったりと改良の余地はかなりある物となっていますので一から作り直すかもしれないです。

https://github.com/yuki-ono-vlb/JankenGame

## ゲームの内容

ゲームとしては、以下の内容となっています。

1. プレイヤーとエネミーに分かれてじゃんけんをする
1. プレイヤーはグー、チョキ、パーのボタンを用意してそこから選択してもらう
1. エネミーはランダムで決められた手を出してくる。
1. 負けた方は、基本1 ~ 3の間でHPが減っていく。
1. 10分の1の確率でクリティカルヒットが発生して基本ダメージが5倍のダメージとなる
1. 先にHPが0以下になった物の勝利
![Janken.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2191889/fe8b6aa3-0388-84e9-2603-c13c13a32449.png)
![Janken2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2191889/d1edb370-0228-4a80-1a51-de5fefa25fc7.png)



## ゲームを作った理由

今回Pythonで作ろうと思った理由はいくつかあります。

* 理由その1
私の勉強方法といいますか復習のひとつとして過去に作ったものを、今の能力技術で作るというのを定期的に行っています。
そこで今回は、以前C#のWinFormsで作った事のあるじゃんけんゲームをPythonでやってみようと思いました。

* 理由その2
今回、弊社で新人エンジニアを集めてワークショップをやろうという話があり、そのコンテンツの一部としてサンプルとなる物を用意する必要があったというのも理由です。


## ゲームを作るにあたっての反省点

ゲームの仕様として、ログをGUI上に書き込む様にしてます。
ログが書き込まれるという事は、最新のログの内容が常にGUI上に表示されているのが理想的です。
その方法が判らず困ってしまいました。
結局以下の様にすると良かったのですが、コメントが少なかったりしたせいで自分の頭の中のコードと実際のコードで差違が出ており調べ方を間違えてしまい時間がかかってしまったのが反省しなくてはいけない所です。

コメントが少ないという事もそうですが、自分で書いたコードを理解、把握出来てないとはあってはならないと思います。

結局先輩に質問してたった一行追加するだけという数分で解決してしまいました。
以下が追加したコードです。

```Python
from tkinter Text
tk = Tk()
# ログテキストの設定
self.log_message: Text = Text(tk, state=Const.NORMAL)
self.log_message.see('end')
```

## 改良点

改良点としては、ログは現状一度GUIアプリ自体を閉じないと消えないので、ゲームが新しくスタートする時には削除する様にしようと思ってます。
オプションとかで切り替え出来ても面白いかなと思ってます。
また、このアプリにHPが削れてる音やエネミー側のグー、チョキ、パーの音声などのBGMを追加しようかなとも考えてます。
AndroidStudioのブックマーク機能

今回はAndroidStudioのブックマーク機能の使い方を説明しようと思います。

AndroidStudioでいつの間にかブックマークを使用してました。
みたことないマークでコレなんだろと、となり最近知りました。

# ブックマークの方法
ブックマークしたい場所で右クリックをします。そうすると画像のようになります。
![スクリーンショット 2022-05-01 17.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/c6ef1e53-587e-be29-ff92-2f8205b2518a.png)

add Bookmarkをクリックするとブックマーク完了です


# ブックマークの一覧表示

こちらAndroidStudioの左下にあるFavoriteをクリックするとこのような画面が出て来ます。

![スクリーンショット 2022-05-01 16.57.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/61c3ffe0-bc43-8e3e-c070-eb6fd62d0984.png)
ブックマークしているとここにブックマークの一覧が出て来ます。

ショートカットもあります。
Shift + F11でもブックマークの一覧表示が出て来ます。


以上です。
これでAndroidStudioでよく見る箇所があれば、検索ではなくブックマークから、素早く表示ができるので便利です！
「プロを目指す人のためのTypeScript入門」読書感想文

# ある日の我が家にて
娘（**6歳**）「ねぇ、パパ？」

ワイ「なんや？娘ちゃん」

娘「この絵本の、表紙の文字が読めないの」

ワイ「おお、ほなワイが読んであげるで」
ワイ「どの絵本や？見せてみ」

娘「はい、これ」

ワイ「おお、この絵本か」
ワイ「**ファッ！？**」

<img width="400" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295452/a91cc635-f3c3-d652-7e3c-6eef8ce0a6fe.png">

ワイ「娘ちゃん、これ絵本とちゃうで」
ワイ「技術書やで」

娘「そうなんだ」
娘「それで、その英語の部分は何て読むの？」

ワイ「これはな、**タイプスクリプト**って読むんや」

娘「TypeScriptってなぁに？」

ワイ「TypeScriptはな、JavaScriptに**静的型システム**を加えたプログラミング言語や」

娘「へぇ〜、そうなんだ」
娘「でも、どうしてTypeScriptが必要なの？」
娘「JavaScriptじゃダメなの？」

ワイ「それはな」
ワイ「TypeScriptの方が、ミスに早く気づけて便利なんや」
ワイ「例えば、普通のJavaScriptを使っている場合・・・」

> 先輩「おい、やめ太郎」
> 先輩「ここのJavaScriptのコード、修正頼むわ！」
> 
> ワイ「承知しましたやで！」
> ワイ「ここの関数を修正・・・っと」
> ワイ「先輩！できましたやで！」
> 
> 先輩「おう、ありがとうやで！」
> 先輩「ってやめ太郎」
> 先輩「さっき頼んだ部分は確かに修正されとるけど」
> 先輩「今回の修正によって、他の部分がバグっとるやんけ」
> 先輩「ちゃんと矛盾のないように修正頼むで・・・！」

ワイ「↑こんなことが起こりがちなんや」

娘「わかる」

ワイ「いや分かるんかい6歳児」

娘「それで、TypeScriptはどう良いの？」

ワイ「TypeScriptを使うとな？」

> コンパイラ「その関数の引数を変えるなら」
> コンパイラ「こっちのコードも修正せなあかんで！」
> コンパイラ「今のままだと、**矛盾が生じてるで！**」

ワイ「って、コンパイラ君が教えてくれるんや」
ワイ「テキストエディタ上に赤い波線を表示して、分かりやすく教えてくれるで」

娘「なるほどね」
娘「ミスによるバグが減りそうだね！」

# というわけで
「[プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで](https://gihyo.jp/book/2022/978-4-297-12747-3)」という技術書を買いました。

著者は鈴木　僚太さん。
Qiitaでも有名な@uhyoさんですね。

# ここから感想文

タイトルにも「入門」とあるように「これからTypeScriptに挑戦したい！」という人でも問題なく読めそうな、分かりやすい本でした。


この記事の冒頭のコント部分で書いた「なぜTypeScriptを使った方がいいのか」といった基本的なところから、分かりやすく解説してくれています。

# 文章が分かりやすかった

全体を通して、文章が分かりやすかったです。
一文一文が短く、脳にスッと入ってくる文章でした。

本を読んで勉強するにあたって、脳に入って来やすいのは非常にありがたいです。

# 具体例を用いた説明

型の話って割と抽象的なので、説明を読んでもなかなか分かりづらかったりします。
「代数的データ型」とか。「型引数」とか。

ですが、この本では

- 例えばこんな機能を実装したい
  - この書き方だと微妙になっちゃう
    - そこで、**このテクニックを使うといい感じになる**

という風に、具体例を用いて説明してくれています。
そのため、比較的スッと頭に入って来ます。

# コラムが良かった

随所にコラムが挟まれているのですが、これがすごく良かったです。
「型引数の推論は、どのようにされるのか」など、興味深いテーマの物が多いです。

# 中級者以上にも、普通におすすめ

ワイはTypeScript歴2〜3年くらいですが、この本を読んで初めて知ることも結構ありました。
あとは、誤解していたことなんかも、いくつも気づかされました。

仕事でTypeScriptを使う人や、これから使ってみたい人は買って読んでみるといいと思います。

# 今回読んだ本
[プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで](https://gihyo.jp/book/2022/978-4-297-12747-3)

**〜おしまい〜**

# 新しい記事も読んでみてくださいやで

- [ワイ「なに！？普通のJavaScriptなのに型が書けるやと！？」](https://qiita.com/Yametaro/items/d86ae59e8b07aff1d4f5)
- [文章が下手なワイが、技術記事を書くときにやっていること](https://qiita.com/Yametaro/items/21b8772e6c0d1d77e176)
- [経営者目線を持ったエンジニアになるために](https://qiita.com/Yametaro/items/bfa11a001aa8982cd8f1)
codeanywhereを使ってみた感想

codeanywhereを使ってみた感想です。

# インターフェースが変わった
数年前にも使ってみたことがあるんですが、いつからかは分かりませんが、インターフェースが変わっていました。
## VScode風になった。
パソコンなどからIDEを開くと、VScodeの画面になります。codeanywhere独自の画面ではなくなりました。
# 料金プランの変更
数年前には無料プランがあった。（ネットで調べると同様記事あり）
が、現在は有料のみ。
## 料金プラン
日本語ではないため、6$・15$・40$の三つのプランのみです。
チームで使う場合はオプション料金あり。
# codeanywhereのアプリ
ハッキリ言って、スマホアプリは使いにくいです。パソコンやタブレットなどのデバイスでやった方が良いと思います。

以上が使ってみた感想です。
ApplicationLoadBalancer(ALB)の自己証明書を用いたHTTPS化

# 概要
ALBの利用においてHTTPS化を行うための方法。
ALBのDNS名と同名の自己証明書を作成し、ACMへインポート。後、ALBに適用すればできると想定。

# 前提
構成は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505716/dd231726-7225-d112-1d4a-a63f2680506f.png)

構成のポイントは以下。
　・ALBはプライベート
　・ALB－バックエンドサーバ(Nginxコンテナ)間はhttps化しない

構築順序は以下の通り。
　1.SSL証明書の作成
　2.ACMへのSSL証明書のインポート
　3.ALBリスナーの設定変更(https化)

## SSL証明書の作成
```sh
# 秘密鍵の作成
> openssl genrsa -out private.key

# CSRファイルの作成
# 対話モードでCSRファイルの各種属性を設定する
# その際「Common Name」の設定値はALBのDNS名※を登録すること
> openssl req -new -key private.key -out server.csr

# SSL証明書の作成
# 有効期限は1年(365日)
> openssl x509 -req -days 365 -in server.csr -signkey private.key -out server.crt
```

## ACMへのSSL証明書のインポート
ACMコンソールからインポートを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505716/f7b85b81-f18c-2b1d-7bb4-9146d05ce67d.png)

各種情報を入力。入力値はAWSのマニュアルを参照。
https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/import-certificate-api-cli.html
＞証明書をインポートする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505716/11c7ffbd-149f-4372-ff10-127b502001b6.png)

「次へ」を押下。確認画面も問題がなければ「インポート」を押下する。

## ALBリスナーの設定変更(https化)
ALBのリスナー設定より、「ACMへのSSL証明書のインポート」でインポートした証明書を利用する。
リスニングポートをhttp→httpsへ変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505716/2d96f1da-eb13-fd9b-9412-a7ed875eef9b.png)

作成した証明書をアタッチ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505716/b83ff6e6-f013-dbe2-7953-649405494d9e.png)
なお、Securitypolicyは、どの暗号プロトコルをサポートするかの選択を指すと理解。
上図の設定はAWSの推奨に則りELBSecurityPolicy-2016-08を選択。暗号プロトコルの互換性のためとのこと(2022/5/1現在)。
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/create-https-listener.html#describe-ssl-policies
＞セキュリティポリシー

# 動作確認
```sh:実行ログ
# 自己証明書のため「-k」で証明書の検証を無視する必要あり
> ~/environment/ssl-credentials $ curl -I https://<ALBのホスト名>.ap-northeast-1.elb.amazonaws.com -k
HTTP/1.1 200 OK
・・・
```
ステータスコード200が返ってきたためOK！
シェルにもブックマーク欲しかったのでpeco使ってワンライナー

# 必要物品
pecoじゃなくてもいいけれど、その手のもの…fzfとか？
そういうのがあればワンライナー出来ます。

# やり方
とりあえず、僕はブックマークのファイルを
```$HOME/.bookmarks```にしましたが、
後で変えたくなるかも知れないので```$MYBOOKMARK```とします。
下記をbashrcに追記。
```bash
MYBOOKMARK=$HOME/.bookmarks
alias bookmark="cd \$(cat $MYBOOKMARKS | peco)"
alias bookmark_add="pwd >> $MYBOOKMARKS"
```

## 登録
```bash
bookmark_add
```

## 参照
```bash
bookmark
```

## 編集
```bash
vim $MYBOOKMARKS
```
以上です。

# 実は既にある
https://qiita.com/kjmhrak/items/de1dbab386d5aae5142e

何か、インストールしたりしているようですね。
これを実現するためにgitまで使ってインストールして…ってのは
僕にとっては大げさに見えたので、僕はpeco使っときます。
cscの作法 その158

# 概要
cscの作法、調べてみた。
opentk.dll使ってみた。
GL.Material使ってみた。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/be9794b0-bd66-e30a-8eb9-262c3cb42825.png)


# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;

namespace app
{
	public class Form1 : Form {
		private OpenTK.GLControl glControl;
		private float rx, 
			ry;
		public Form1() {
			this.glControl = new OpenTK.GLControl();
			this.glControl.Name = "glControl";
			this.glControl.Size = new System.Drawing.Size(300, 300);
			this.Controls.Add(this.glControl);
			this.Text = "Form1";
			this.glControl.Load += this.glControl_Load;
			this.glControl.Paint += this.glControl_Paint;
			this.glControl.Resize += this.glControl_Resize;
		}
		private void glControl_Load(object sender, EventArgs e) {
			GL.ClearColor(Color4.White);
			GL.Viewport(0, 0, glControl.Width, glControl.Height);
			GL.MatrixMode(MatrixMode.Projection);
			Matrix4 proj = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, glControl.AspectRatio, 0.2f, 5);
			GL.LoadMatrix(ref proj);
			GL.MatrixMode(MatrixMode.Modelview);
			Matrix4 look = Matrix4.LookAt(Vector3.One, new Vector3(0, 0, 0.75f), Vector3.UnitZ);
			GL.LoadMatrix(ref look);
			GL.Enable(EnableCap.DepthTest);
			GL.Enable(EnableCap.Lighting);
		}
		private void glControl_Resize(object sender, EventArgs e) {
			GL.Viewport(0, 0, glControl.Width, glControl.Height);
		}
		private void glControl_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {
			GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
			GL.Material(MaterialFace.Front, MaterialParameter.Emission, Color4.Green);
			tube(2.0f, 0.5f, 0.1f);
			glControl.SwapBuffers();
		}
		void tube(float length, float radius1, float radius2) {
			GL.PushMatrix();
			GL.Begin(PrimitiveType.TriangleStrip);
			GL.Normal3(Vector3.One);
			for (int deg = 0; deg <= 360; deg = deg + 3)
			{
				rx = (float) Math.Cos((float) Math.PI * deg / 180);
				ry = (float) Math.Sin((float) Math.PI * deg / 180);
				GL.Vertex3(rx * radius2, ry * radius2, length / 2);
				GL.Vertex3(rx * radius1, ry * radius1, -length / 2);
			}
			GL.End();
			GL.PopMatrix();
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}





```

以上。
cscの作法 その157

# 概要
cscの作法、調べてみた。
opentk.dll使ってみた。


# 写真



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/98d48bcd-dea3-1fe6-1e96-d76913bc6a48.png)


# コンパイル手順

- opentk.3.1.0.nupkgをダウンロード。
- 拡張子をzipにして解凍。
- opentk.dllをコピペ。
- opentk.glcontrol.3.1.0.nupkgをダウンロード。
- 拡張子をzipにして解凍。
- opentk.glcontrol.dllをコピペ。
- コンパイル

```
csc tk0.cs /reference:OpenTK.GLControl.dll /reference:OpenTK.dll

```

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;

namespace app
{
	public class Form1 : Form {
		private OpenTK.GLControl glControl;
		public Form1() {
			this.glControl = new OpenTK.GLControl();
			this.glControl.Name = "glControl";
			this.glControl.Size = new System.Drawing.Size(300, 300);
			this.Controls.Add(this.glControl);
			this.Text = "Form1";
			this.glControl.Load += this.glControl_Load;
			this.glControl.Paint += this.glControl_Paint;
		}
		private void glControl_Load(object sender, EventArgs e) {
			GL.ClearColor(glControl.BackColor);
		}
		private void glControl_Paint(object sender, PaintEventArgs e) {
			GL.Clear(ClearBufferMask.ColorBufferBit);
			GL.Begin(BeginMode.TriangleStrip);
			{
				GL.Vertex2(0.5, 0.5);
				GL.Vertex2(-0.5, 0.5);
				GL.Vertex2(0.5, -0.5);
				GL.Vertex2(-0.5, -0.5);
			}
			GL.End();
			this.glControl.SwapBuffers();
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}




```


以上。
STM32L010とマイコン応用I2C超音波距離センサーで遊ぶ(タイマー割り込み)(LPF)


x Med2リビジョン125です。


目的
オリジナルI2C超音波距離センサーをつかい
任意の時間でローパスフィルター(LPF)を掛けた値の表示



![o_con376.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2ab839b3-29ab-cf1f-ddb3-6ce70510b18c.jpeg)




```c++




//i2c_master_master_interrupt_HC_SR04_010_1

#include "mbed.h"


//I2C i2c(I2C_SDA, I2C_SCL); //767
//I2C i2c(dp5, dp27); //1114
I2C i2c(PA_10, PA_9); //010


//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
RawSerial pc(PA_2, PA_3); //010


int  h1,h2,h3;
int  p;
char in_l;

Ticker flipper;


void flip() {
    
    int l = (int)in_l;

        //画面に表示
        //pc.printf("Read : %x\r\n",l);
        //pc.printf("Read : %d\r\n",l);
        pc.printf("%d\r\n",l);


}


//#define S5851A 0x48
#define ADDR        (0x10)   //  address

int main() {

    char data_read[8]; //バッファー


    flipper.attach_us(&flip, 250000); // the address of the function to be attached (flip) and the interval (2 seconds)


    //無限ループ
    while(1){

        //dataの読み込み
        i2c.read(ADDR, data_read,1,false);

        //データの保存
        int b =  data_read[0]; //dataの転記
        if(b >= 200) {b = 200;}
        if(b <= 0)   {b = 0;  }
        
        
        //レンジ圧縮で140でレンジ切り替え
        int l;
        if( b <= 139 ) {
            l = b + 60;
        } else {
            l = ((int)(b - 140 + 20)) * 10;
        }  
        
    //移動平均
    p = (h1+h2+h3+l)>>2;
    h3 = h2;
    h2 = h1;
    h1 = l;
    in_l = (char)(p/10);


        //0.5秒待つ
        wait_ms(20);

    }//while

}//main

//容量削減
void error(const char* format, ...){}






```
.net core 6.0の最新環境で、コンソールアプリケーションをDIする（紹介）

コンソールアプリケーションって超基本だし、.netの超初期から出てくるので検索してもなかなか最新環境の情報にたどり着かなかったので備忘録も含めまとめます。

やりたいゴールとして
・コンソールアプリ
・コマンドでオプションを指定してファイル名などの引数を与えられる
・設定ファイルを.net core最新環境に合わせる
・テストが出来るように

まずは、DI。ここの記事がシンプルで使いやすそう。
英語なので日本語化は後で。

https://dev.to/joeldroid/dependency-injection-in-a-net-core-console-application-3flh

分量も少ないのでコピペで動作を確認するにはよさそう！


こちらはjson設定を読み込む。
古い環境だとapp.settingとかapp.configファイルを読みますが、VisualStudio2022だと画面構成からして設定画面が出てきません。
node環境でもなじみのjsonで設定します。
そんな中で、.netcore5ですがコンパクトな良い記事

https://www.ipentec.com/document/csharp-dot-net-5-using-appsetting-json-in-console-application

ただ、CreateDefaultBuilderを使うのか、ConfigurationBuilderを使うのか、両方を使わないといけないのかと迷いますが、CreateDefaultBuilderだけでOKです。
その辺はここに書いてあります。

https://tech-blog.cloud-config.jp/2019-7-11-how-to-configuration-builder/

あとはコンソールアプリで設定を読むのを確認しておきます。

https://docs.microsoft.com/ja-jp/dotnet/core/extensions/configuration

そして、DIを活用するために

https://qiita.com/kitauji/items/a7c6a7d33c9f67c79336

を参考に設定をサービスクラスに渡してみます。

合体させるとこんな感じに


``` C# Program.cs
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;

class Program
{
    // 引数で/sourcefilepathを与えている
    static void Main(string[] args)
    {

        var host = CreateHostBuilder(args).Build();
        IConfiguration config = host.Services.GetRequiredService<IConfiguration>();

        host.Services.GetService<IHelloService>()
            .WriteMessage();
        Console.Read();
    }
    private static IHostBuilder CreateHostBuilder(string[] args)
    {
        var hostBuilder = Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, builder) =>
            {
                builder.SetBasePath(Directory.GetCurrentDirectory());
                builder.AddJsonFile("appsetting.json");
            })
            .ConfigureServices((context, services) =>
            {
            //add your service registrations
            services.AddSingleton<IHelloService, HelloService>();
            });

        return hostBuilder;
    }
}
public interface IHelloService
{
    void WriteMessage();
}

public class HelloService : IHelloService
{
    private readonly IConfigration _config;

    puclib HelloService(IConfigurration config)
    {
         this._config = config;
    }
    public void WriteMessage()
    {
        Console.WriteLine("Hello World! " this._config.GetSection("TestValues").GetValue<string>("Key1"));
    }
}
```

``` appsetting.json
{
  "TestValues": {
    "Key1": "Value-100",
    "Key2": "Value-200",
    "Key3": "Value-300"
  }
}
```

サービスを何個どのように使うかによると思いますが、AddSingletonを使ってもよいし、IHelloServiceをIHostedServiceの継承としてStartAsync等を実装。AddHostedServiceから.Run()で標準実行させるのもありですね。

テストは、IHelloServiceをテストしたりモック化するなりして実行。

設定ファイルは、HelloServiceのコンストラクタで、IConfigrationを読んでおけば自動でDIされます。
この中には、jsonファイルの設定も、コマンドラインのargsも入ります。
コマンドラインはconsoleapp.exe /source C:\souce\file.jpgとした場合は
this._config["source"]
でとれます。
json設定ファイルの方は、this._config.GetSection("TestValues").GetValue<string>("Key1")ですね。
面倒くさい権限管理をラクにしてくれるBiglake Tableの使い方！

## まえがき
最近登場した[Biglake](https://cloud.google.com/blog/ja/products/data-analytics/unifying-data-lakes-and-data-warehouses-across-clouds-with-biglake)を使った所感を共有いたします。
色々公式ドキュメントには書かれているけど、既存のサービスに対して、具体的にどういった箇所で、どんな良さがあるのか発見したことを書きます。
BigQuery external tableと、BigLake tableの比較を前提として話します。


## Biglakeとは
>データ ウェアハウスとデータレイクを統合するストレージ エンジン、BigLake です。BigLake は基盤となるストレージ形式やシステムを意識することなくデータを分析できるようにするもので、データの複製や移動が不要になり、コスト削減と効率化を図ることができます。

Google公式ドキュメントより引用：　https://cloud.google.com/blog/ja/products/data-analytics/unifying-data-lakes-and-data-warehouses-across-clouds-with-biglake

つまり、権限の簡素化や手順の簡略化によりGCPの異なるサービス同士のデータの隔たりを減らす仕組みと考えられます。

## まずは結論から
結論から書きますと、biglake tableにより
①BigQuery外部テーブルの権限設定
②権限設定の作業の手間
③[DataStream](https://cloud.google.com/datastream?hl=ja)利用の困りごと

上記の３つの観点においてメリットがありました。

### ①BigQuery外部テーブルの権限設定
BigQueryからGCSへの外部テーブルを作成する場合、クエリ実行者に必要な権限は２種類あります。
**１）データセットもしくはテーブルに対してのクエリ実行できる権限**
**２）外部テーブルのデータ元とするGCSのバケットに対しての権限**

この際に問題となるのは、２番目のGCSバケットへの権限です。
クエリを実行するだけのユーザに対して、**GCSバケットへの権限を与えたくないという点**です。
gsutilコマンド含め、出来る限りユーザの意図しないアクションは防ぎたいところ、この点はネックになっていました。


### ②権限設定の作業の手間
こちらに関しては単純で、外部テーブルへの権限という１アクションに対して、GCS側とBigQuery側にそれぞれ権限を与えるという手間が地味に面倒だという事です。


### ③[DataStream](https://cloud.google.com/datastream?hl=ja)利用の困りごと
①と重なりますが、GCSのバケットへの権限について**GCSのバケット毎にしか設定できない点**も課題です。
本来であれば、仮にユーザのGCSへのアクセスを許容するとしても、**バケットのフォルダ毎にアクセスできる**ようにしたいところです。
私のケースで言うと、
Data Stream(GCPのリアルタイムデータ連携サービス)を利用している際に、ユーザにアクセスしてほしくないストリームのデータまで同一のバケットにある限り見れてしまう為、**それぞれのストリーム毎にGCSバケットを分けないといけない**といった面倒くささがありました。

## Biglake table作成
公式ドキュメントがあるので割愛します。
https://cloud.google.com/bigquery/docs/biglake-quickstart?hl=ja
主な流れは以下の通り。
１）外部接続の設定
２）サービスアカウントの権限付与
３）Biglake Tableの作成


## BigLakeがどう解決したか
biglake tableの作成の流れに沿って説明します。

### １）外部接続の設定
手順説明①にあるように、biglake tableをBigQueryに作成する為には、BigLake用の外部接続(external connections)を作成する必要があります。
外部接続を作成すると、**biglakeの外部接続の為のサービスアカウント**が与えられます。

### ２）サービスアカウントの権限付与
そして②のサービスアカウントの権限付与にて、そのサービスアカウントに対してのみGCSへの「Storage オブジェクト閲覧者」ロールを付与します。

***
ここが主なポイントで、先ほど説明した**GCSバケットへの権限を与えたくないという点**は、この**BigLake用サービスアカウントのみ権限を与えること**により各ユーザに与える必要が無くなりました。
また、その手順が不必要になったことで各ユーザに対しては**BigQueryのデータセットやテーブルへの権限を与えるだけ**で済むようにもなります。
***

### ３）Biglake Tableの作成
ここまでくれば、通常のBigQuery exteranl tableとは大差ありませんので割愛。

## まとめ
色々と説明しましたが、

①BigQuery外部テーブルの権限設定
==> BigLake用のサービスアカウントに権限を集約することで、ユーザに対してGCSへの権限を与えずに済む。


②権限設定の作業の手間
==> ユーザにはBigQuery上の権限付与の一回で済むようになった。

③DataStream利用の困りごと
Data Streamの出力バケットを分けていたが、一つのバケットに複数のストリームを出力するようにしても、BigLakeのサービスアカウントにのみ権限を持っている構造上、ユーザが意図しないフォルダにアクセスしてしまうというケースを弾けるようになった。

***
以上でこの記事は終わりです。
ご一読ありがとうございました！
【TypeScript】new ()型について

## はじめに
TypeScriptの型がわからなすぎて困惑している皆さん、こんにちは🏄‍♂️
今日は、たまに見かける`new () => T`についてまとめます！

## new () => Tの解説
```typescript
class Dog {
  public name = 'ポチ'

  bark = () => {
    console.log('ワン！')
  }
}

const fn1 = (a: new () => Dog) => {
// const fn1 = (a: { new (): Dog }) => { でも可
  return new a();
}
fn1(Dog).bark()
fn1(new Dog()).bark() // !! Error !!
```

`fn1()`の引数にインスタンス化する前のクラス`Dog`を入れることができます。インスタンス(`new Dog()`)したものを渡すことはできません。
ユースケースとしては、**クラスを関数に渡して、インスタンスを受け取りたい**時です。

## 踏み込んだ解説
```typescript
const fn2 = (a: typeof Dog) => {
  return new a();
}
fn2(Dog).bark()
fn2(new Dog()).bark() // !! Error !!
```
上記でも同じことができます！
が、公式FAQには`new ()`を使うように書かれています。なぜなら`typeof`はジェネリクスの型に使えないからです。
https://github.com/microsoft/TypeScript/wiki/FAQ#why-cant-i-write-typeof-t-new-t-or-instanceof-t-in-my-generic-function

```typescript
const fn3 = <T extends Dog>(a: new () => T) => {
  return new a();
}

const fn4 = <T extends Dog>(a: typeof T) => { // !! Error !!
  return new a();
}
```

## まとめ
Genericsとnew()を組み合わせて使いましょう！というお話でした。
インタスンスを生成するFactory Methodパターンを作る時に、利用する型ですね！


## 参考
https://qiita.com/ConquestArrow/items/ace6d926b7e89b8f92d9#fnref1
https://teratail.com/questions/184663
UnitTestを実行するまで

# Django RestframeworkのUNIT TESTを実行するまで

### Django rest frameworkでUNIT TESTを実行するまでの記録です。

### djangoプロジェクトの作成
　以下のコマンドを実行
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/e18c48c5-04ee-3f89-1960-b02415e43507.png)


　難なく完成。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/ec38dee2-495c-b579-0b43-a0faf34df4c7.png)


　とりあえず、マイグレーションして、正常に終了することを確認。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/6dddabb4-bba1-92fe-b47b-3761ac13a139.png)

　実行してみる。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/c497e697-4bf8-2e22-b434-4e1ec13537d3.png)

　指定されたURLにアクセスると、以下の画面が出てきたので、正常にプロジェクトは完成。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/41545bcf-750b-09d6-20b9-7e5d3118b393.png)


## アプリの作成
　以下のコマンドを実行
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/663f8e0d-e852-4df2-e7c3-4b2568816539.png)

　正常にアプリが出来た
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/57bc99af-1146-e51f-59ef-e024635843af.png)

　これにmodelsを追記する。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/407d4002-415f-fa4b-5dc3-279ca8d09db5.png)

　この状態で、一度、マイグレーション実施し、正常に出来る事を確認。
　※settings.pyのINSTALLED_APPSに、作成したアプリ名を追記しておく。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/dbbe6cc6-51c3-16cc-bf28-40c9d17a4e0f.png)
　
## unit testの実装
　作成したアプリ内にある、「tests.py」を開き、以下の内容を記載する。
  usermstの内容を検索し、0件のデータが検索出来た事（何も登録されていない事）を確認するテスト
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/2b5d0a83-b4ed-cb07-a76f-19666d840137.png)
  
　この内容を保存し、テスト実行
　1件、実行し、OKが返ってきていることを確認する。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196226/bd11cb51-8a40-954e-9859-990bb3c1d57d.png)

正常にテストが実行できた！
ゼロトラストのディープダイブ(1)-背景と定義


## はじめに

ゼロトラスト・セキュリティモデルの考察と検証をスタートします。

## ゼロトラストとは

[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%AD%E3%83%88%E3%83%A9%E3%82%B9%E3%83%88%E3%83%BB%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%A2%E3%83%87%E3%83%AB)で、`ゼロトラスト・セキュリティモデル`の定義

- ゼロトラスト・セキュリティモデルとは
    - `決して信頼せず、常に検証せよ`という考えに基づいた、ITシステムの設計及び実装に関するモデル
    - たとえ、企業内ネットワークへの許可された接続であっても信頼しないこと
    - 従来は、企業内ネットワークへVPN接続するデバイスは信頼できるものと考えていた
- ゼロトラスト(ZT)の考え方
        - 場所に関係なく、デバイスIDと整合性の確認を含む相互認証を行う
        - ユーザー認証を組み合わせることにより、アプリケーションとサービスへのアクセスを承認する
- ゼロトラストアーキテクチャ(ZTA)とは
    - ゼロトラストの概念を活用した企業のサイバーセキュリティ対策計画
        - コンポーネントの関係
        - ワークフローの計画
        - アクセスポリシー
- ゼロトラストエンタープライズとは
    - ゼロトラスト・アーキテクチャの成果として企業に導入された
    - 仮想的なものも含むネットワークインフラ及び運用ポリシーのこと

## 信頼してはいけないものは?

- 内部ネットワーク
- 端末
- ユーザー
- アプリケーション
- ???

結局、全てを信頼してはいけないとのことです。
ゼロトラストの考え方
- 人間の感情である信頼(トラスト)をコンピューターネットワークに持ち込むな
- その信頼こそが攻撃者に付け込まれる脆弱性となる
- あらゆる要素を検証することで、信頼度を確認し、それに応じたアクセスを提供すべき

## なぜゼロトラストの導入が必要となったのか

背景となるのは、

- セキュリティ脅威の増加
- テレワークの普及
- クラウドサービスの導入

## 従来の境界防御モデルは何がいけなかったか

- 境界の内側が、サイバー攻撃対象に
    - 境界外側から厳重なファイアウォールの正面突破ではなく
    - 境界内側の安全と思われている内部ネットワークに忍び込む
        - 例えば、標的型メールなどで端末を感染させ情報窃取や改ざんを試みる
- 境界の外側に、情報資産が存在
    - 機密情報は社内のみならず、クラウドなどにも保存するようになった
    - これらの情報資産をどのように一元管理/保護するかが課題
- 境界の外側から、リモートアクセスが必須
    - テレワークの普及により、境界の外側からアクセスが必須となった
    - 個人端末からインターネットとクラウドへの安全な通信が課題
        - VPNの脆弱性に付け込んだ不正侵入を防ぐには

## ゼロトラスト・アーキテクチャの原則

- 一度きりの強力なユーザーID
- ユーザー認証
- マシン認証
- ポリシーの遵守やデバイスの健全性などの追加のコンテキスト
- アプリケーションにアクセスするための認可ポリシー
- アプリケーション内のアクセス制御ポリシー

## いきなり個人的な疑問

`0%のトラストにより、100%のセキュリティを達成できるでしょうか`

個人的な感想で恐縮ですが、Noと思います。
というか、`ゼロトラスト`という用語には違和感を感じます。
`信頼`は会社組織ないし人間社会における大事な土台で、セキュリティにも必要不可欠。
強い信頼関係により、かえってセキュリティは強化されるケースもあるかと。
ゼロトラストはあくまで、一つのセキュリティモデルとして捉えたい。。。

## おわりに

ゼロトラスト・セキュリティモデルの基本を理解しました。
次回は、ゼロトラストの実現に必要なソリューションを見てみます。

##### [次回] [ゼロトラストのディープダイブ(2)-アーキテクチャと機能要件](https://qiita.com/mingchun_zhao/items/78b9f89af22ba132649a)
Blenderで四角面を維持して減数

## 概要

グリッド上のメッシュで途中から**列数を減らしたい**とします。
ここで、**すべてのポリゴンが四角面**を維持することにします。
その場合、基本的に下記の2パターンに分類できるようです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/a05d1f1f-e367-6292-596f-c7dc0a1757f1.png" width="160">

- パターンA：2列から0列にします
- パターンB：2列から1列にします。ただし、左右で行数が変わります。

## パターンA

下図は、列数を増やしていったパターンAです。パターンAは2列減じ、左右の行数が同じです（どれも3行）。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/669a3963-62c2-a42d-b59b-ec87dc7af8e3.png" width="300">

図で、3列を1列にする例は、右に1列追加されています。
4列を2列にする例は、左に1列追加されています。

パターンAをループカットすると、縦から横に流れることがあります。

## （左右の行数が同じ）パターンB

下図は、列数を増やしていったパターンBです。左端のパターンを除いて、2列減じ、左右の行数が同じです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/9dd3337b-e878-6e28-c15b-1b46c2253745.png" width="300">

3列から1列では、2列から0列を向かい合わせにして中央の辺を溶解した形になっています。
このパターンをループカットすると、Uターンすることがあります。

## （左右の行数が異なる）パターンB

下図は、列数を増やしていったパターンBです。1列減じ、左右の行数が異なります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/3d46d032-6153-09f5-91ab-b5644beedfdf.png" width="300">

このパターンをループカットすると、縦から横に流れることがあります。

## 行数が異なる理由

すべて四角面にするには、外周の頂点数が偶数である必要があります。したがって、列数を1減じるには、行数を変える必要があります。

以上
3年目ソフトウェアエンジニアの振り返り

# はじめに
私は情報系学部で大学卒業後、メーカーにソフトウェア（アプリ）の開発職として就職しました。
※ メーカーのソフトウェアには組み込み系とアプリ系がありますが、私はアプリの方になります！

就職してから2年が経ち、今年で3年目になります。
この記事では2年間どのようなことをしてきたのか、具体的なスキルを併せてまとめてみようと思います。

こんなことやってきたのか〜くらいで、同世代の人たちやエンジニアを目指している人たちの目安や参考になればうれしいです！

# 本文

## 1年目

1年目は、主にプロジェクトにおける基本的な開発スキルを学びました。
プロジェクトでは一人で開発するのではなく、複数人で開発を進めていきますので、それに必要な知識や技能を習得していきました。
コードレビューでは先輩方からたくさんご指摘をもらって、かなり成長することができました！
可読性の高いコードを書くことも大切で、もちろんあの有名な本も読みました。（笑）

- プログラミングスキル
    - C# / リーダブルコード / オブジェクト指向 / クラス設計 / UML
- Git・PR・コードレビュー
    - Git ブランチ開発モデル / Azure DevOps ( Azure Repos )
- Windows CUI アプリ開発
    - .NET Core / C#
- Windows GUI アプリ開発
    - WPF / MVVM / C#
- その他、事業内容の知識向上ための研修や事務的な作業などの仕事を進めるうえで欠かせない業務

## 2年目

2年目は、Webアプリ開発の業務を担当することになりましたので、それに付随するスキルを学びました。また、新規開発のプロジェクトでしたので分からないことが多い中、クリーンアーキテクチャなどを参考にし、毎日試行錯誤しながら開発を進めていました。チームメンバーとも熱い議論を交わしながら、変化に対して柔軟に対応できるいい設計・開発ができたと思っています！

- クラウド Azure 全般の知識や技能の習得
    - AZ-900: Microsoft Azure Fundamentals
    - Functions / Logic Apps / IoT Hub / App service / Application Insights / Blob Storage / Table Storage / SQL Database
- Web アプリ開発
    - インフラ
        - Web API / Azure リソース
    - サーバーサイド 
        - ドメイン駆動設計 / ASP.NET Core MVC / C#　
    - フロントサイド
        - HTML / CSS / JavaScript / jQuery / Bootstrap
- DX 推進業務
    - Microsoft Power Automate / Microsoft Power BI


# おわりに

私が使っている技術の主体は Microsoft 系技術となっています。
Microsoft 系の技術で Qiita 記事は少ないように感じますが、Microsoft 系の技術を使っている人たちは似たような内容ではないでしょうか！

Microsoft の公式ドキュメントもあるので、学びやすいです。 ~~読みやすさについては難あり。~~
また、C# はいろんな開発ができますし、私は好きです！

今後は、アジャイル開発などのプロジェクトのマネジメントや、クラウド Azure の知識・技能の向上、ドメイン駆動設計の追究、変化の激しいフロントエンド技術のキャッチアップなどしていきたいです。

以上、ここまで読んでいただき、ありがとうございました。
Oh My PoshをPowerShellモジュール版からバイナリインストール版に移行してみる（Windows）

`oh-my-posh`について、今までは`PowerShell Gallery`か`PowerShellモジュール`をインストールすることによって機能を提供していました。

この提供方法がversion `7.75.0`　から変更になるようです。

PowerSHellモジュール版の`oh-my-posh`のバージョンを`7.75.0`にアップデートした所、起動時にプロンプトに下記の表示がされるようになっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a11aa079-6020-4e13-d241-b961f92e7d1d.png)

`PowerShellモジュール`で提供されている`oh-my-posh`の機能は、しばらく前からバイナリ化（`oh-my-posh.exe`）されており。
モジュールに含まれるコマンドレットは実はバイナリ（`oh-my-posh.exe`）のラッパーとして機能していました。

今回、下記の利用から`PowerShellモジュール`の機能提供は更新されなくなり、これからはバイナリをインストールする方法に移行されるようです。

>・downloading the binary is a problem on company managed computers
>・the module syncs cross device thanks to OneDrive sync, causing versions to be out of sync and configs to break
>・it's impactful having to explain the difference time and time again (for me)

## ドキュメント

[PowerShell module](https://ohmyposh.dev/docs/migrating)

すでにモジュール版をインストールしている場合、移行ドキュメントが用意されています。

ドキュメントにはモジュールのアンインストール方法とバイナリのインストール方法と設定方法が記載されています。

本記事では、こちらを参照して移行してみます。

## 今回対象とする環境

- Windows 10 21H2
- PowerShell 7.3.0-preview.3
- oh-my-posh 7.75.0
- winget v1.3.431-preview

### wingetでoh-my-poshをインストール

[Windows Set up your terminal](https://ohmyposh.dev/docs/installation/windows)

Windows環境へのインストールでは、winget、scoop、manual。
3種類のインストール方法が提供されています。

本記事ではwingetを利用してインストールします。

```PowerShell
winget install oh-my-posh
```

ドキュメントには下記のように記載されており、今回実施した端末でも再起動しないとPATHが反映されなかったため、ここで再起動しました。

>For the $PATH to reload, a restart of your terminal is advised.

なおインストールPATHを確認すると下記のように追加されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/27a5f9b6-e28d-4362-4a1f-3317fabb0ad2.png)

なおwingetでインストールしたバイナリを更新する場合は下記を実行します。

```PowerShell
winget upgrade oh-my-posh
```

### モジュール版のアンインストール

[Uninstall the PowerShell module](https://ohmyposh.dev/docs/migrating#uninstall-the-powershell-module)

```PowerShell
Uninstall-Module oh-my-posh -AllVersions
```

ちなみにモジュールがうまくアンインストールできない場合は、下記でPowerShellモジュールのインストール先を調べ、そのディレクトリを直接削除する方法もあります。

```PowerShell
# モジュールがインストールされているパスを確認する
# 適宜、表示されたパスを削除して下さい。
(Get-Module -ListAvailable oh-my-posh).ModuleBase
```

### 起動プロファイルに記載している設定を削除する。

今回対象となる端末では、起動プロファイルでImport-ModuleとSet-PoshPromptを利用していたので起動プロファイルからこちらを削除します。

```text:Profile
Import-Module oh-my-posh
Set-PoshPrompt "hogehoge\myTheme.omp.json"
```

### 起動プロファイルの更新

[Adjust setting the prompt](https://ohmyposh.dev/docs/migrating#uninstall-the-powershell-module)

いままで起動プロファイルに`Set-PoshPrompt`コマンドレットで設定していたテーマ設定を下記のような記述に置き換えます。

```text:$profile
oh-my-posh init pwsh --config ~/.custom.omp.json | Invoke-Expression
```

## 総評

現在、`oh-my-posh`の機能が`oh-my-posh.exe`で提供されるようになり。
`PowerShellモジュール`のコマンドレットが`oh-my-posh.exe`のラッパーとして機能している状況となるため。

直接、`oh-my-posh.exe`をインストールして実行するようにするようになるのは極めてその通りな気はします。
Get-ChildItemに-rオプションをつけても、ファイル名を起点に並び替えする

作業ログです。たまたま問題を解決できましたが、どうして解決できたのかわからないため、特に得られるものは無いと思います。

# やりたいこと
- `Get-ChildItem`を使って、ファイル名でソートされたファイル一覧を取得したい
- フォルダ内のフォルダ（サブフォルダ）に入ってるファイルも対象にしたい（再帰）
- サブフォルダにファイルがあれば、フォルダじゃなくてそのファイル名をソートの基準に入れたい

# 実際に書いたコマンド
```powershell
> ls -r -file | sort name | Format-Table -property Name
```

# 実際に得られる結果
- 画像ファイルはimgフォルダ
- それ以外はすべてカレントフォルダ直下

```
Name
----
1408293437773.jpg
DroJj4rVAAMVcN9.jpg
FH000037.jpg
IMG00508.jpg
IMG00508.webp
index.html
main.css
r1EKnhr.jpg
README.md
```

# 記事を書いた動機
仕事で書いていたスクリプトに誤りを見つけたため、その修正した内容を残したく文章に起こしている。

仕事で、下記のようなスクリプトを書いていた。2のファイル名一覧は、事前に叩いた`ls -r -name -file | sort`の結果をコピペ・整形したものである。

1. 複数のフォルダに置かれたpdfを1つのフォルダにすべてコピーする
1. 指定ファイルに書かれたファイル名一覧のとおりに、1のpdfをリネームする

上記を実行すると、想定してた組み合わせでのリネームが実施できなかった。「タコ足配線.pdf」を「takoashi.pdf」にリネームしたかったのに、「ikasumi.pdf」になっていた。ファイルを移動する前におこなった`ls -r -name -file | sort`の結果取得できたファイル名の順番と、移動後のファイル名一覧の順番が違っていたからだ。

# スクリプトを修正する前に起きていた問題

## どういう内容のスクリプトか
まず、`ls -r -name -file | sort`を実施する。そこで得たファイル一覧から、フォルダ名をすべてのぞいて、純粋にファイル名だけのリストを作成する。
```
imgs\1408293437773.jpg
imgs\DroJj4rVAAMVcN9.jpg
imgs\FH000037.jpg
imgs\IMG00508.jpg
imgs\IMG00508.webp
imgs\r1EKnhr.jpg
index.html
README.md
style\main.css
```
上の一覧からフォルダ名をのぞいたのが下記一覧である。
```
1408293437773.jpg
DroJj4rVAAMVcN9.jpg
FH000037.jpg
IMG00508.jpg
IMG00508.webp
r1EKnhr.jpg
index.html
README.md
main.css
```
複数フォルダに置かれていたファイルを1つに移したあと、このファイルリストを上から順に読み取って、`Rename-Item`を実行する。これがスクリプトの全容である。

## ファイルを一つのフォルダに移したあとにlsを実行した結果
スクリプトがうまくいかないことがわかって、確認のためにファイルを1つのフォルダに移したあと、`ls | sort`を実行してみた。

```
1408293437773.jpg
DroJj4rVAAMVcN9.jpg
FH000037.jpg
IMG00508.jpg
IMG00508.webp
index.html
main.css
r1EKnhr.jpg
README.md
```

順番が違っていた。。

`ls -r | sort`だと、ソートの起点がコマンドを実行したディレクトリになる。photoフォルダの中に画像が入っているような構成だと、画像名に1234.pngなどがあっても、index.htmlより前に結果が表示されることは無い。

# なぜかFormat-Tableをかませるとファイルを起点にしたソートができた
ここで、最初に書いたスクリプトに戻るのだが、結果的に下記コマンドでやりたいことが実現できた。パイプラインを使って、オブジェクトを渡せるのは知っているが、なぜFormat-Tableのあとにsortじゃないんだろうか。それならなんとなく納得でき…ないけども。
```powershell
> ls -r -file | sort name | Format-Table -property Name
```

# おわりに
解決したいことを実現するために、いろいろ検索したが、検索ワードがうまく思いつかず徒労に終わった。以下にどういうワードで検索したかを載せておこうとおもう。

- powershell get-childitem -r ファイル名 起点
- powershell get-childitem recurse ファイル並び替え
- powershell get-childitem ファイル起点 フォルダ並び替え
UIFlow を使って鉄道遅延情報（JSON）の一部を M5StickC Plus のディスプレイ上に表示してみる

## 「鉄道遅延情報のjson」の無料提供終了について
コメント欄で、「鉄道遅延情報のjson」の無料提供が終了したとのコメントをいただきました。

## はじめに
今回の内容は、UIFlow を使ったブロックプログラミングで、HTTPリクエストを扱う話です。過去にも UIFlow で HTTPリクエストを扱うような内容を試してみたことがあったのですが、今回は取得する情報を「[鉄道遅延情報のjson](https://rti-giken.jp/fhc/api/train_tetsudo/)」にしている点が異なります。

●鉄道遅延情報のjson
　https://rti-giken.jp/fhc/api/train_tetsudo/

### 実際の動作（動画）
今回作ったものが動いている時の様子を動画で示します。

https://twitter.com/youtoy/status/1520638667542626304

作ったものの挙動は、M5StickC Plus本体の　Aボタンを押すと、ディスプレイ上に取得した情報の一部が日本語で表示されるというものです。

なお、このサイトからの情報取得を Node.js で行った話を記事にしたことがあるので、JavaScript で扱う話にご興味がある方は以下の記事をご覧ください。

●Node.js 18 から実験的にグローバルスコープで利用可能になった fetch API を試す（鉄道遅延情報の JSON を取得してみる） - Qiita
　https://qiita.com/youtoy/items/cce17c02085f7d42dc34

## 鉄道遅延情報のjson から情報を取得する
[上で紹介した Qiita の記事](https://qiita.com/youtoy/items/cce17c02085f7d42dc34)でも扱った[鉄道遅延情報のjson](https://rti-giken.jp/fhc/api/train_tetsudo/) というサイトにアクセスしてみます。トップページにアクセスすると、その時点でサイトが提供している遅延情報を、簡単にページ上で閲覧することができます。
![鉄道遅延情報のjson のトップ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8168ff34-3b44-d54a-3715-5f734443bd49.png)

この遅延情報は、情報提供元（[鉄道コム](https://www.tetsudo.com/traffic/)）との間で調整して 10分ごとの更新という頻度にしているそうです。また、HTTPリクエストで情報を取得する場合は `https://tetsudo.rti-giken.jp/free/delay.json` という URL でアクセスする仕様になっています。

今回、この遅延情報の中の最初の項目で、キーが「name」となっている部分（路線名が書かれた部分）を UIFlow のプログラムで取得してみることにします。

## UIFlow のプログラム
早速、UIFlow のプログラムの話に入ります。

最初にプログラム全体を示します。
![UIFlow のプログラム](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/54288b61-674b-6ea8-1c70-bfb64d9c34a0.png)

ここから、ブロックのプログラムについて補足をしていきます。

### JSON を扱う部分
まず、ポイントになるのが「HTTPリクエストで JSON を取得して、1番目に出てくる路線名を取得する部分」です。

プログラムの該当箇所は、上記の画像の HTTPリクエストのブロックの部分（水色っぽいブロックの部分）です。最初に「GET」で「 `https://tetsudo.rti-giken.jp/free/delay.json` 」という URL にアクセスするよう指定しています。
そして、処理が成功した場合には、取得できたデータを JSON に変換しつつ「jsonData」という変数に格納しています。さらに、その中の最初の要素（1つ目の JSON）を別の変数「jsonData0」に格納しました。

その後、取得した JSON の中の「キー： name」となる部分を「railroadName」という変数に保存してから、「railroadName」の中身をディスプレイ上に表示させるようにしています。この時、日本語の文字列が入っているデータになるため、M5StickC Plus のディスプレイ上に設定するラベルは日本語が扱えるものにする必要があります。
具体的には、以下のように「Font」の指定を「Unicode 16」にしました。
![フォントの指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d06c9a65-6ff5-0491-5c50-89a90f16a72c.png)

### その他の部分
上で説明した部分以外の実装の補足は、以下に簡単に記載します。

- 画面の向きのモードは横向き（「1」）を指定
- 処理の途中で何ヶ所かディスプレイの背景色を変える処理あり（プログラムのどの部分を実行されているかを可視化するため）
- ボタン押下のイベントを「ずっと」の中の「もし...であれば」の条件部分で取得（もちろん別のやり方もできるが、この後に、センサーから取得した情報を元に処理させるような変更を想定した実装）
- JSON を取得する処理が 10秒より短い頻度で行われないようにウェイトを入れている（とりあえず 10秒を指定）
- ずっとの処理は高頻度に繰り返す必要もなさそうなので、ボタンが押されていない時に 500ミリ秒間隔で繰り返すようにしている（この秒数に特別な意味はなく、適当に決めています）

このような内容になるよう、ブロックのプログラムを組んでいます。

そして、このプログラムを実行し、M5StickC Plus の Aボタンを押下すると、冒頭で紹介した動画のような結果を得られます。なおこの時に表示される内容は、もちろん遅延情報で取得できる内容によって変わるため、ご自身で試される場合は「鉄道遅延情報のjson」のページ上で最新の JSON の情報を確認しつつお試しください。
SPAでリロードした時にaccess deniedになってしまう時の対処法

# 概要
* S3+CloudFrontにデプロイして配信しているSPAで、「/」以外のページでリロードすると403エラーになってしまう時の対処をメモとして残したいと思います。:punch:

# エラーの詳細
* SPAで、「/」以外のページでリロードすると以下のように403エラーがでてしまう。
* （今回の場合は「/works」でリロードすると下記のような画面が表示されている。）
![403.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632517/1feb95b3-7375-d56c-d790-b6026ba3eea4.jpeg)

# 原因
* SPAの場合、https\://example.com にアクセスするときはサーバ側と通信を行なっているが、それ以外のページ（例えば https\://example.com/about 等）に遷移するときは、サーバ側と通信を行なっておらず、仮想的に遷移したことにしています。

* つまり、index.htmlはあるけど、about.html「/about」は存在していないため、リロードでサーバー側と通信しようとしても403エラーが出てしまうということです。

# 対処法
* CloudFrontのエラーページで以下のように設すればOK！
* 今回は403エラーが出ていたので、403が出た場合に表示（転送）するページを指定しています。
![cloudfront.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632517/a68e5148-7470-2fa8-4777-42e79ed6bd3b.png)

# おわりに
対処法自体は簡単ですが、「なぜ」の部分を自分の中で整理するために記事にしてみました。

間違っているところ等ありましたらコメントいただけますと幸いです:bow:


# 参考
https://qiita.com/hoshi-takanori/items/e6635be975f9a8919276

https://e-words.jp/w/%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html

https://qiita.com/ozaki25/items/41e3af4679c81a204284

https://dev.classmethod.jp/articles/s3-cloudfront-spa-angular-403-access-denied/
nuxt.jsでJSの効いてないブラウザにアラートを出す

# 前提条件
## 自分の環境
- OS
    - windows11
- node.js
    - v16.13.2
- vue.js
    - v2.15.8
- nuxt.js
    - v2.6.14
- create-nuxt-app
    - v4.0.0

nuxtの環境構築はcreate-nuxt-appを利用しています。
create-nuxt-appを利用しての環境構築は、[こちらの記事](https://qiita.com/mijima/items/3c94b45b033911cde6da)を参照。


# テンプレートをカスタマイズ

### デフォルトテンプレートの場所
nuxtのデフォルトテンプレートは`projectName>.nuxt>views>app.template.html`にあります。
.nuxtは隠しフォルダになっているので、見つからない場合は隠しフォルダを表示する設定にして上げてください。

+ デフォルトテンプレートってなんぞ
    + 表示画面レイアウトの雛形のようなもの。こいつをいじることでも画面をのレイアウトいじることができる。


````app.template.html
<!DOCTYPE html>
<html {{ HTML_ATTRS }}>
  <head {{ HEAD_ATTRS }}>
    {{ HEAD }}
  </head>
  <body {{ BODY_ATTRS }}>
    {{ APP }}
  </body>
</html>
````

### カスタムテンプレート
カスタムテンプレートはIEだったりJavascript無効がオフになっていたりなどの、警告画面を作りたいときに利用します。

#### やってみる
試しに`app.html`を作成します。名前にappは必ずつけないとだめです。
場所は、プロジェクトディレクトリの直下に作成。
````app.html
<!DOCTYPE html>
<html>
  <noscript>JavaScriptを有効にしてください。</noscript>
  <h1>カスタムテンプレートだよ</h1>
</html>
````

http://localhost:3000/
のトップページがカスタムテンプレートに置き換わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201311/6903eba0-8da5-fbee-887a-957b7fb19730.png)

ブラウザの設定でJS切ってから、接続するとメッセージが出るようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201311/e7b44b30-0fe3-df68-6407-d789487d3c97.png)

## 補足：デフォルトテンプレートの関係性
デフォルトではpages配下のコンポーネントが画面に表示されるまで
`layout`と`views`ディレクトリは隠しフォルダ`./nuxt`にあるので注意。

```mermaid
flowchart LR    
    default.vue-->app.template.html
    index.vue-->default.vue
    subgraph views
    app.template.html
    end
    subgraph layout
        default.vue
    end
    subgraph pages
    index.vue
    end
```
macOSのターミナルでよく使いそうなショートカットキーのまとめ

## 前書き

いつもターミナルで何か操作をする時に、入力を間違ったりするとバックスペースキーを連打して消したりするので、
そういう不便なことは止めましょう！とのことでまとめてみました。
**macOS**の**iTerm2**を使っています。

## ターミナル上でカーソルを動かせる

前はカーソルの左側・後ろはカーソルの右側という意味として書きました。
組み合わせるキーはCMDキーではなくCtrlキーになりますので気をつけましょう。

| キーコマンド | アクション |
| ------  | ------  |
| Ctrl+a  | カーソルを行の一番前（左）の文字に移動させる |
| Ctrl+e  | カーソルを行の一番後ろ（右）の文字に移動させる |
| Ctrl+b  | カーソルを１つ前（左）の文字に移動させる |
| Ctrl+f  | カーソルを１つ後ろ（右）の文字に移動させる |
| Ctrl+d  | (何か文字が入力されている場合に)カーソル後ろ（右側）の文字を１つずつ消す(Deleteキーと同じ) |
| Ctrl+w  | カーソルの１個前（左）の単語を消す |
| Ctrl+u  | カーソルの位置から行の一番前（左）の文字まで消す |
| Ctrl+k  | カーソルの位置から行の一番後ろ（右）の文字まで消す |
| Ctrl+p  | 直前に入力したコマンドを観る(↑（上方向の矢印）キーと同じ) |
| Ctrl+n  | Ctrl+pと反対(↓（下方向の矢印）キーと同じ) |
| Ctrl+l  | ターミナル上に出力されていた全ての内容・テキストを消す<br />（下記の `clear`と同じ） |
| Ctrl+m・Ctrl+j  | コマンドを実行する。Enterキーと同じ |
| Ctrl+c  | 現在実行している命令やコマンドを実行中止させる（キャンセルする） |

## 基本的なコマンド

| コマンド | アクション |
| ------- | ------ |
| `ls` | 現在のディレクトリに存在するファイル・フォルダのリストを画面上に出力する |
| `pwd` | Print Working Directory。 現在位置しているディレクトリを画面上に出力する |
| `cd` *ディレクトリ名* | Change Directory。 入力された*ディレクトリ名*のところに移動する。<br />※Documents, Downloadsなどディレクトリ名が長い場合は<br />`cd Doc*`や`cd Dow*`で移動することもできます。 |
| `cd ..` | １つ上の親ディレクトリに移動する |
| `cd` | Homeディレクトリに移動する |
| `touch` *ファイル名.拡張子* | 入力された通りファイルを作成する |
| `mkdir` *フォルダ名* | make directory。 入力された通りフォルダを作成する |
| `cat` *ファイル名.拡張子* | 入力されたファイルの内容を画面上に出力する |
| `rm` *ファイル名.拡張子* | remove。 入力されたファイルを削除する |
| `rmdir` *フォルダ名* | remove directory。 該当するフォルダが空きの場合に削除する |
| `rm -r` *フォルダ名* | option: recursive。 該当するフォルダおよびその中の中身（ファイル・サブフォルダなど）まで削除する |
| `cp` *コピーさせたいファイルのパス/ファイル名.拡張子　コピペする先のパス/ファイル名.拡張子* | Copy。該当するファイルを入力されたペースト先にコピペする |
| `mv` *移動させたいファイルのパス/ファイル名.拡張子　移動先のパス* | Move。入力されたファイルを該当するパスに移動させる |
| `mv` *ファイル名.拡張子　新しいファイル名.拡張子* | 該当するファイルの名前を変更する |
| `clear` | ターミナル上に出力されていた全ての内容・テキストを消す<br />（上記のCtrl+lと同じ） |
| `history` | 今まで入力したコマンドの履歴が*番号・コマンド*形式で画面上に出力される<br />※その後`!1465`みたいにもう一度実行させたいコマンドの番号を入力すると<br />同じコマンドをまた実行させることができます。 |
| `man` *コマンド* | Manual。入力されたコマンドのマニュアルを画面上に出力する |

## 参考元

韓国語のページになります。

[리눅스 터미널 단축키](https://shared.tistory.com/131)
[알아두면 유용한 맥 터미널 명령어 모음](https://yozm.wishket.com/magazine/detail/746/)
WSL2にPythonインストール



```
sudo apt update -y
sudo apt-get install -y software-properties-common 
sudo apt update -y
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install -y python3.10 python3.10-distutils
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.10 1
curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
pip install --upgrade pip
```