OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoフレームワークのメリット・デメリット

# Djangoフレームワークとは何か？

PythonのDjangoフレームワークは、Webアプリケーション開発のためのオープンソースのフレームワークです。Djangoは、MVT(モデル・ビュー・テンプレート)アーキテクチャを採用しています。

MVTについて、簡単にまとめると以下のようなイメージです。

### モデル（Model)
データベースとのやり取りを担当し、アプリケーションで扱うデータを表現します。モデルは、DjangoのORM（Object-Relational Mapping）によってデータベースとPythonのオブジェクトのマッピングを行います。データベースのテーブルに対応するモデルを作成することで、データベースとのやり取りを簡単に行うことができます。

### ビュー（View)
ユーザーのアクセスに応じて、適切なデータを取得してテンプレートに渡す役割を担当します。ビューは、MVCアーキテクチャでいうところの「コントローラー(C)」に相当します。Djangoのビューは、関数ベースのビューとクラスベースのビューの両方が存在し、それぞれの特徴に合わせて使い分けることができます。

### テンプレート（Template）
HTMLやCSS、JavaScriptなどの静的ファイルと、Djangoのテンプレートタグやテンプレートフィルターを使って、動的に生成されたデータを画面に表示する役割を担当します。

# 全体像
Djangoで作られたWebアプリが、リクエストを受けてからレスポンスを返すまでの処理の流れは以下の図の通りです。
![Django概略図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951524/7ebff415-fe55-8c5f-0468-775a2f5bb756.png)

# Djangoのメリット・デメリット

他のWebアプリケーションフレームワークと比較して、Djangoの良い点と悪い点をピックアップしました。

### 良い点

- データベースとの統合が容易：DjangoはORM（Object-Relational Mapping）を提供しており、データベースとのやり取りが簡単にできます。また、Djangoのモデルを使うことで、データベースのテーブルを定義することができます。
- 汎用的な機能が充実：Djangoは、管理画面や認証、セッション管理など、Webアプリケーション開発でよく必要とされる機能が充実しています。これらの機能は、Djangoが提供するアプリケーションを使うことで簡単に実装することができます。
- 高速開発が可能：Djangoは、テンプレートエンジンやフォームフレームワークなど、開発効率を向上させるための多数の機能が提供されています。これらの機能により、開発の効率が向上し、短時間でWebアプリケーションを構築することができます。

### 悪い点

- 学習コストが高い：Djangoは、機能が多く、アーキテクチャも独自のものを採用しているため、初学者にとっては学習コストが高いと言われています。
- 構成が複雑：Djangoは、設定ファイルやディレクトリ構成が複雑で、初めて触る人にとっては分かりにくいと感じるかもしれません。
- 柔軟性が低い：Djangoは、多数の機能を提供しているため、他のWebフレームワークと比べて柔軟性が低くなっています。特定の機能を必要とする場合には、他のフレームワークを採用することも検討する必要があります。

# まとめ
Djangoフレームワークは、初心者にとってはややハードルが高いですが、一度身につけてしまうと、その後は素早くアプリケーションを実装できるため、私はオススメです！

上記の点を考慮して、フレームワーク選定を行うと良いですね！
【Homebrew】Homebrewのインストールができない時の対処法

# はじめに
先日MacBookを買い替えた際にパッケージ管理ツールであるHomebrewのインストールに少々手間取ったので今後の尾毛録として残しこちらに残しておきたいと思います。

# 環境
MacBook Pro 14(2021)
Apple M1 Max 
64GB RAM
2TB SSD

MacOS Ventura 13.2.1

# 問題
私が直面した問題は、Homebrewのインストールコマンドを打って、プロンプトが帰ってきてから確認のため、Homebrewのバージョン確認コマンドを打っても、エラーになってしまったことです。
つまり、正常にHomebrewがインストールできていなかったのです。

# 原因
調べてみると、どうやらAppleシリコンであることが原因だそうでした。
従来のIntel Macと現行Macに多く搭載されているAppleシリコンでは違うようです。

# 解決方法
__ターミナルの"情報を見る"から「Rosettaを使用して開く」にチェックを入れる__

実際に手順とともに解説していきます。

### Step 1. Finderからアプリケーションフォルダを開く
いつも通り、Finderからアプリケーションフォルダに移動します。
![スクリーンショット 2023-03-06 20.41.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2236248/7ffe0d6c-7d2b-e5d4-37c2-247d58bab92c.png)
![スクリーンショット 2023-03-06 20.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2236248/26ae556a-d74d-b84a-620e-cd220ddbd523.png)

### Step 2. ターミナルの「情報を見る」を開く
ターミナルのアイコンを見つけ出し、右クリックして「情報を見る」を開きます。
![スクリーンショット 2023-03-06 20.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2236248/38bd68c8-d306-eff1-522a-f485af4f4a41.png)

### Step 3. 「Rosettaを使用して開く」にチェックを入れる
デフォルトではチェックボックスがオフになっているので、オンにしてあげて完了です。
![スクリーンショット 2023-03-06 20.44.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2236248/a28cad20-ff8b-2151-3e75-a676d2173923.png)

### Step 4. 再度ターミナルからインストール
もう一度Homebrewのインストールコマンドを入力します。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
あとは指示に従うだけでインストールが完了します。

# 確認
Homebrewのバージョン確認コマンドを入力します。
```
brew --version
```

正常であれば、次のような文字列が返ってきます。
```
Homebrew X.X.X
```
これで正常にHomebrewをインストールすることができました。
Unity認定 Professional Programmer 体験記

# はじめに
Unity認定 Professional Programmerに合格できましたので、私の勉強方法や感じたことを共有させて頂こうと思います。
あくまで私個人の考えであること、ご了承ください。

# 私について
Unityは2022年3月からさわり始めました。
C#はWebアプリケーション開発として3年程度経験はあり、他言語(Java、PHP）によるWebアプリケーション経験が5年以上あります。
その他、Microsoft Azureでのインフラ構築やAzure Dev Opsでのソース管理、リリースの自動化などの経験があります。

# 資格、試験情報
https://unity.com/ja/products/unity-certifications/professional-programmer

2023/3現在、Unity **2017.4**をベースにした**UCP-572**とUnity **2020.3**をベースにした**UCPP-520**の2つの試験が提供されています。

:::note info
公式で販売されているコースウェアや模擬試験は、共通と**思われます**。コースウェアで提供されるUnityプロジェクトは、**2020.3**で起動するという指示になっていました。
:::

**UCP-572**は日本語での試験が選択できますが、**UCPP-520**は英語の試験となります。

英語が読めないことはないのですが、調べられない環境だと不安があったため、私は**UCP-572**を選択しました。
以降はその前提で記載していきます。

| 試験時間 | 問題数 | 合格基準点 | 最高スコア |
|:-:|:-:|:-:|:-:|
| 120分  | 60問  |  500 | 700  |

:::note info
資格の有効期間は3年です。
:::

# 勉強教材
## 試験バウチャー、コースウェア、模擬試験のバンドル
https://unityedustore-global2.pearsonvue.com/unity-certified-professional-programmer-bundle-certification-practice-test-and-courseware-/p/BDL-UCPP-CRT-PT-12CW

* コースウェア
動画は日本語の字幕があります。
その他付随する資料は、英語となります。
1年間の期限あり。

* 模擬試験
英語となります。
2ヶ月間の期限あり。

:::note info
Google Doc や ブラウザの翻訳機能を使うことで、英語が読めなくても勉強は可能です。しかしながら、おかしい訳語になる場合があるので、英文と見比べる必要があるため、英語にアレルギーがない方がいいです。
:::

## 2017.4、2021.3 の公式マニュアル
https://docs.unity3d.com/ja/2017.4/Manual/UnityManual.html

https://docs.unity3d.com/ja/2021.3/Manual/index.html

:::note info
試験対策としては、2017.4のマニュアルのみでいいと思いますが、私はUnityの経験を積みたかったため、現在変わってしまっているところも含めて確認していきました。
:::

# 勉強方法
1. コースウェアの動画、資料、クイズを一通り確認する
コースウェアは、開発体験型のため、指示沿って進めるとUnityを普段から使っている人でも２，３ヶ月はかかってしまうものとなります。私は３ヶ月で取得する計画を立てたため、実際に開発は行わず、2ヶ月で提供されるUnityプロジェクトを操作しながら、動画の確認を１周とクイズを２周しました。
1. 試験１ヶ月前から模擬試験を実施する
練習モード(時間無制限)、認定モード(時間制限あり)がありますが、練習モードを5回、認定モードを1回実施しました。

:::note info
クイズ、模擬試験は、選択式(複数選択あり)となります。
回答後に、問題文・誤答も含めた回答全ての項目を公式マニュアルで確認する方法で勉強しました。
:::
:::note alert
模擬試験は全部で90問用意されていて、１回のチャレンジで60問選択される問題の使いまわしとなります。そのため、2、3回やると答えを覚えてしまいます。
一番最初に認定モードで実力を図って、あとは、練習モードでマニュアルを確認しながら勉強するといいかもしれません。
私は最後に認定モードで実施しましたが、満点でした(答えが分かっているので)
:::

# 本試験の難易度
コースウェアのクイズ、模擬試験より難易度が高いです。
しかしながら、問題の傾向は、模擬試験でつかめますので、あとはどれくらいマニュアルを理解できるか、ソースコードを読めるかにかかってくると思います。
また、日本語の言い回しで判定しずらい部分もあるため、多少の運もあるかもしれません。

受験を検討している方の参考になれば、幸いです。
そうだ、Java SE 11 Silverをとろう！

# はじめに
こんにちは、ひで丸です。
Java SE 11 Silver(以下Java Shilver)の資格を急に取得しようと思い立ったので、取ろうと考えている人の参考になればと思い記事にしました。

記事の目次としては下記になります。

・ 背景
・ Java Silver　とは
・ 受験方法・試験内容
・ 勉強方法
・ まとめ
・ 参考サイト

# 背景
今回、何故Java Shilverを取得しようと思い立ったかというと、私が仕事でJavaを勉強することとなり、日々だらだらと勉強するのではつまらないなと思ったので、目標としてJava Shilverを取ろうと考えたからです。
また、今の会社では資格を合格すると受験費用が戻ってくるため、実質タダで取れます！それならもう取るしかない！と思い今に至っています。
※Java Silverの受験料は税込37,730円なので比較的高め

# Java Silverとは
正式名称は「Oracle Certified Java Programmer, Silver SE11」 で、Javaアプリケーション開発に必要な基本的なプログラミングの知識等を有していると証明される、開発初心者向けの資格となっています。入門レベルだとBronze,上級レベルだとGoldなどがあります。
Java SilverにはSE11とSE8がありますが、SE11の方が最新でSE8の内容も入っているので特にこだわりがなければSE11を取得するのがいいと思います。

# 受験方法・試験内容

### 受験方法
受験方法は簡単に書きますが、ネットで申し込みお金を払って、試験場所に行って試験を受けるだけです。(まだやってないので詳しくは書けないです。。。)
見た感じだと下記のサイトが参考になると感じました。
https://style.potepan.com/articles/28671.html

### 試験内容
出題形式：　 選択問題
試験問題：　 180分
出題数：　80問
合格ライン：　63%
例題：　https://www.oracle.com/jp/education/certification/ocjp-silver-se8-3494542-ja.html

例題を見てもらうとJava初心者には難しいと思う方も多いでしょう。
自分自身もそう感じました。

# 勉強方法
・ProgateでJavaVまで学ぶ　（15hぐらい)
→Javaの基本的な書き方やオブジェクト指向、クラスについて手を動かしながら学べるので飽きずに学びやすい。


・黒本をほぼ満点で取れるまでひたすら解く(50h~70h)
→試験対策の本として例題と解説が書いてある黒本（下記参照）があるのですが、この黒本とほぼ同じ問題が出るそうなので、これをひたすら解こうと思っています。
黒本：[徹底攻略Java SE 11 Silver問題集[1Z0-815]対応 ](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625/ref=sr_1_2_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=33ME630U0EFUB&keywords=Java+silver&qid=1678100595&s=books&sprefix=java+silver%2Cstripbooks%2C190&sr=1-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzNlpFRjVQVFlVV0hDJmVuY3J5cHRlZElkPUEwMzAzMTQ0MlBOWTJCQzVRVzRTTCZlbmNyeXB0ZWRBZElkPUEyMTkwRzlFMVpaVk1CJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)

ただ、現時点でProgateの知識だけじゃ足りなと感じているので、Java入門の下記参考書を読んでおくといいかもしれません。

### 良さそうな参考書
・[スッキリわかるJava入門 第3版 スッキリわかるシリーズ ](https://www.amazon.co.jp/dp/B07ZQWKL2Q?ref_=k4w_oembed_Cq0XMOukkob88d&tag=kpembed-20&linkCode=kpd)
→色んなサイトで勧められており、中身としてはイラスト多めで試験内容がほとんど入っています。自分は読んでいませんが、黒本だけで厳しそうと感じた場合には買おうと思っております。

・紫本
→[オラクル認定資格教科書 Javaプログラマ Silver SE11（試験番号1Z0-815）](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Silver-SE11%EF%BC%88%E8%A9%A6%E9%A8%93%E7%95%AA%E5%8F%B71Z0-815%EF%BC%89-%E5%B1%B1%E6%9C%AC/dp/4798162043/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Java+silver&qid=1678101612&s=books&sr=1-1)
基本的にこの本を見てから学ぶそうですが、値段高めで他にもいい参考書があると思って自分は買っていませんが、紫本あっての黒本なので読んで間違いはないと思います。

# まとめ
Java Silver取得に向けて勉強を始めて日が浅いですが、資格取得の意気込みとしてもこの記事を書かせていただきました。この記事を読んで自分も取得したい！という方がいましたら、是非私と一緒に資格取得に向けて頑張りましょう！
また、途中経過や詳細な勉強内容についても記事を書くつもりです。


# 参考サイト
[・Oracle試験説明ページ](https://www.oracle.com/jp/education/certification/1z0-815-jpn-48261-ja.html)
[・勉強方法参考](https://qiita.com/ebichan_88/items/8409c9b99bf5a2977cc7)
データベースを基本からまとめてみた【SELECT文】

## SQLとは？

SQLとはデータベース言語の一つで、データベース言語とは『データベースを操作するための言語』のこと。具体的には、データベースにデータを格納したり、データベースに格納されているデータを抽出したり、データベースを書き換えるために使用する。

## どうデータベースを保管しているか？

- データべース：図書館の書庫
- テーブル：書庫の棚
- データ：本

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/1ee0b3f2-534a-bd12-858e-27d1f23db336.png)

## SQLで何ができるか？
- データの保管、取得、更新、削除
- テーブルの作成、更新、削除
- アプリ開発時データベースを操作できる
- データを分析してビジネス活動を改善

## 表でデータを保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/09d6cdb2-97e6-0e61-9dc7-773b2562f78a.png)

## テーブルの検索（SELECT）

```
<SELECT文の構造>

//SELECT句　どのカラムのデータを抽出するか　
※『クエリ』『問い合わせ』と呼ばれる事もある

SELECT [カラム名]
FROM [テーブル名] ;

//FROM句　どのテーブルから
```

```
SELECT [カラム名]
FROM [テーブル名] ;
```
AS : カラムに別名をつける
```
SELECT [カラム名]
AS [別名] 
FROM [テーブル名] ;
```
*: 全カラムを指定

```
SELECT * 
FROM [テーブル名] ;
```
DISTINCT : 重複削除
```
SELECT DISTINCT [列名]
FROM [テーブル名] ;
```
WHERE : 条件指定
```
SELECT [カラム名] 
FROM [テーブル名] 
WHERE [演算子を使って検索条件を指定]
```
AND : 両方を満たす
```
SELECT [カラム名]
FROM [テーブル名] 
WHERE [条件式A] AND [条件式B] ;
```
OR : どちらかを満たす

```
SELECT [カラム名] 
FROM [テーブル名] 
WHERE [条件式A] OR [条件式B] ;
```
BETWEEN : ~の間

```
SELECT [カラム名]
FROM [テーブル名] 
WHERE [評価する値]
BETWEEN [最小値] AND [最大値] ;
```
IN : まとめて指定:IN
NOT IN : まとめて否定
```
SELECT * 
FROM [テーブル名A]
WHERE [要素名] NOT IN (
SELECT [要素名] FROM table_nameB
);
```
LIKE : あいまい検索

```
SELECT [表示要素] 
FROM [テーブル名] 
WHERE [要素名] 
LIKE [曖昧検索の条件];
```
NULL : 値が不明

IS NULL: NULL指定
IS NOT NULL : NULLじゃない
```
IS NULL[演算子] [NULLのデータを取得]
SELECT * FROM [テーブル情報] WHERE [要素名]  IS NULL
```
```
IS NULL[演算子] [NULL以外のデータを取得]
SELECT * FROM [テーブル情報] WHERE [要素名]  IS NOT NULL
```
LIMIT : 行数上限指定

```
SELECT * 
FROM[テーブル名] 
LIMIT[抽出行数];
```
ORDER BY : 並び替え
DESC : 降順

```
SELECT * 
FROM[テーブル名] 
ORDER BY [ソートする要素名] [昇順・降順の指定];
```
```
SELECT * 
FROM[テーブル名] 
ORDER BY [ソートする要素名] DESC;
```
COUNT : 集計

```
SELECT 	COUNT[カラム名]
FROM [テーブル名]
WHERE [要素名]
```


## SQLを書く上での秘訣
- 予約後（SELECT, WHERE, etc）は大文字
- 特定の予約後（SELECT, WHERE,ORDER BY, etc）の後は改行しよう
- SELECTで列名指定、LIMITすると速くなる







## 参考サイト
[【SQL入門講座 合併版】SQLの基本をたった1時間で学べます【初心者向けデータベース入門】](https://www.youtube.com/watch?v=v-Mb2voyTbc)
[SQLとは何か？基礎知識や重要性を分かりやすく解説](https://schoo.jp/matome/article/1367)
[正規化とは何か？（データベース設計のコツ）](https://blog.senseshare.jp/database-normalization.html)
[データベースの用語を理解しよう 「テーブル」「レコード」「カラム」「フィールド」とは？](https://academy.gmocloud.com/know/20160425/2259)
[【SQL】未経験者もこれ一本でOK！MySQLで学ぶ「SQL」「データベース基礎」講座【プログラミング初心者向け】](https://www.udemy.com/course/uz-sql-kiso/learn/lecture/22257934#overview)
API Gateway JWT Authorizerメモ

## JWT Authorizerとは

* クライアントが API リクエストとともに送信する JWT を検証するAPI Gatewayの認証機能

  * トークンの検証、およびオプションでトークン内のスコープに基づいてリクエストを許可または拒否する

    

## JWT Authorizer 認証の流れ

![jwt_authorizer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/9a35b872-f731-9cc9-c6ca-f16098fa61e1.png)


1. トークン発行者(認可サーバー)によって提供されるJWT形式のトークンを含んだHTTPリクエストが行われる

2. API Gatewayがリクエストを受信し、API Gatewayは検証のためにトークンをJWT Authorizerに渡す

   * `identitySource` に指定されたトークンを取得する

   * `identitySource`にはトークンのみを含めるか、`Bearer `のプレフィックスが付いたトークンのみを含めることができる

3. JWT Authorizerは認可サーバーのJWKSエンドポイント(`jwks_uri`) から公開鍵を取得する

4. 認可サーバーは公開鍵を返却する

5. JWT AuthorizerはJWTトークンを取得した公開鍵を使用して署名を検証し、その後クレームを検証する

   - `kid` ：トークンに署名した `jwks_uri` のキーと一致すること
   - `iss` ： オーソライザーに設定された `issuer` と一致すること
   - `aud` または `client_id` ： オーソライザーに設定された `audience` エントリーに含まれること
   - `exp` ： 現在時刻(UTC)より後であること
   - `nbf` ： 現在時刻(UTC)より前であること
   - `iat` ： 現在時刻(UTC)より前であること
   - `scope` または `scp` ： ルートの `authorizationScopes` のスコープを少なくとも 1 つ含んでいること
     ※いずれかの検証手順に失敗した場合、API Gateway は API リクエストを拒否する

6. (トークンの検証に成功した場合、)API GatewayはLambdaを実行する



## JWT Authorizer設定の大まかな流れ

※API Gateway HTTP API及びそのバックエンドに設定するlambda関数は作成済みであること

1. JWT Authorizerを作成する
   * Authorizer名、JWTのトークンを取得先、Issuer、Audienceを設定する
2. JWT AuthorizerをAPIにアタッチする



## JWTトークンのクレームへのアクセス

* JWT トークンのクレームには、Lambda 関数などのバックエンドリソースがアクセスできる
* 例：
  * `$event.requestContext.authorizer.jwt.claims.クレーム名` 



## 参考情報

* [JWT オーソライザーを使用した HTTP API へのアクセスの制御](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-jwt-authorizer.html)
* [HTTP API の AWS Lambda プロキシ統合の使用](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)
MixamoのアニメーションをVRMで使う

# 現象
Mixamoのアニメーションデータをそのまま取り込んだ際の表示
![Animation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/6353f925-10df-d728-ae5a-85206c82242e.gif)

インポートしたVRMでアニメーションを再生するとルートボーンがうまく動かず足の位置がずれる
![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/e7e5382f-4bc4-87bb-ad1d-14a61a4108dd.gif)

# 解決方法
Root Transform Rotation と Root Transform Position の Bake Into Pose にチェックを入れると足元のズレがなくなる
![Animation3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/d1c977f9-e739-120b-c4b8-5267d99dd7b8.gif)
GitLabのDependency ProxyのLatestタグの挙動を確認する

GitLabのDependency Proxyを利用した際、DockerHub側のLatestが更新された場合、Latestを検知して最新版をpullさせてくれるかが気になった。
オフィシャルドキュメントの[この辺](https://docs.gitlab.com/ee/user/packages/dependency_proxy/#how-does-gitlab-know-if-a-cached-tagged-image-is-stale)に仕様について記載があるが、実際に実機でどうなるかを検証してみた時のメモ。

## 前準備
適当なイメージをDockerHubにpushする。
検証に使ったサンプルは以下となる。
https://github.com/imurata/hello-tanzu

ここからはDockerHubにアカウントがあることが前提となる。ない人は無料版で問題ないのでアカウントを取得する。\
DockerHubにログインする。
```
export DOCKER_USER=xxxx
docker login -u $DOCKER_USER -p 'xxxxxx'
```
サンプルコードをcloneしてbuild, pushする。
```
git clone https://github.com/imurata/hello-tanzu.git
docker build -t ${DOCKER_USER}/hello-tanzu .
docker push ${DOCKER_USER}/hello-tanzu:latest
```
ローカルのキャッシュから引かないようにイメージを削除する。
```
docker rmi ${DOCKER_USER}/hello-tanzu:latest
```

以上で準備は完了となる。

## 検証
Dependency Proxyを利用してイメージをpullする。
```
docker pull <GitLab URL>/<Group>/dependency_proxy/containers/$DOCKER_USER/hello-tanzu:latest
```
Digest値を控えておく。
```
$ docker inspect <GitLab URL>/<Group>/dependency_proxy/containers/$DOCKER_USER/hello-tanzu:latest | jq -r '.[0].RepoDigests[0]' | cut -d'@' -f2
sha256:604951443947b3cb1cae354d1d3779cdd38535512d36671edc4a675533bfcaec
```
なお、Digest値はDockerHubからも確認できる。
![1678099167239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/f33a18af-f169-0cec-656e-211a92f07d9e.png)

次にソースを修正してイメージを再作成してpushし、Latestイメージを更新する。
```
vi src/main/java/org/example/tanzu/HelloServlet.java
```
適当にソース内のtitleを変更して保存し、以下を実行する。
```
docker build -t ${DOCKER_USER}/hello-tanzu .
docker push ${DOCKER_USER}/hello-tanzu:latest
```
DockerHub上のDigest値は更新された。
![1678099513389.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/f5aeb780-6762-adb2-32bd-e98c64f7981e.png)

次に検証のためにローカルのイメージを削除する。
```
docker rmi $DOCKER_USER/hello-tanzu:latest
docker rmi <GitLab URL>/<Group>/dependency_proxy/containers/$DOCKER_USER/hello-tanzu:latest
```

この状態でDependency Proxyからのpullを実行する。
```
docker pull <GitLab URL>/<Group>/dependency_proxy/containers/$DOCKER_USER/hello-tanzu:latest
```
Digest値を見ると更新されていることが分かる。
```
$ docker inspect <GitLab URL>/<Group>/dependency_proxy/containers/$DOCKER_USER/hello-tanzu:latest | jq -r '.[0].RepoDigests[0]' | cut -d'@' -f2
sha256:04cee9129be61fe122a6229bfc866bfcb79725b85fcef2520b4a0e692536f333
```
なお、Dependency Proxyの表示は更新がないように見える。
![1678099711188.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/b31d29fc-d0b2-4ea0-4851-176357dfa63c.png)
おそらく、最初にキャッシュした時間のみ表示していると思われる。

## 結果
特に問題なし。オフィシャルドキュメントにも記載があったが、イメージのManifestで変更があった場合はGitLab側で適切にpullしてくれる模様。なので、Dependency Proxy利用時もLatestを使って問題なさそう。
一方で、GitLab上のキャッシュされた日時は更新されていなかったため、ここを見て判断するのは良くないと言える。
プログラマーになりたい人は大学院に行くべきか【院進か、学部卒か】

尊敬する大学院に行った先輩から、教えてもらった言葉をご紹介。

# 先輩からのありがたいお言葉。

”プログラマーになる”、その一点では大学院の卒業はそこまで違いはありません。
敢えていうなら給与テーブルが少し変ったり、大きめの企業などでは出世スピードに多少影響が合ったり程度だと思います。

しかし幾つかの点では、大学院に行ったことで変わったと思うことはあります。

## 素質の下地作りにはなった

大学院ではご存知の通り、研究がメインになります。
そこでは英語の文献を読んで既存の手法や、最新の情報を学び取り、では自分が何をするかを考えるという取り組みをします。
時にはディスカッションをして、違う研究室の方とも話すこともありました。
そして、自分がやったことは何かを目的・新規性・手法・結果・課題点と纏めて、誰にでもわかるように発表をするといったことを何度も繰り返しました。
学部生でも同様のことをするとは思いますが、量や質の違いは大きいです。

こういったやり取りは、”プログラマーになる”にあたって重要な能力を養うことにはなったと思います。

* 新しい技術を学び、世の中のプログラマーはどうやった手法を使っているかを知る。
* それが自分の行いたいことを達成できるかを吟味する。
* わからないことや困ったこと、新しくやりたいことを社内で相談する。
* 自分は仕事でどういったことをやったかアウトプットする。
* 誰にでもわかる結果を見せ、業績であることをアピールする。


どの職業でも同じではあると思いますが、特にプログラミングは技術の栄枯盛衰が激しいものです。
常に新しい情報を取得し、如何に自分の目的を効率よく達成するか。
そして、それがどんな風に素晴らしいものかを伝えることは大事です。
困ったときも「何に困っているか、どう考えたか」を伝えなければ、協力してもらうことも難しくなります。
誰にでもわかるアウトプットを見せ、どんなメリットがあるか伝えなければ、相手(自社のエンジニアや、他社の営業)に売ることも難しいです。

そういった点からは、大学院で養った能力は確かに活きています。

## 選択肢の広さがあった

大抵の場合は「大学院を卒業するぐらいだから、基本的な能力は高いだろう」と判定されます。
また上記の話から繋がって、きちんとアウトプットできていれば「この人は、こういった仕事も出来るんじゃないか？」と提案もされます。
具体的に測れるものではありませんが、しかし実際に「大学院を卒業した人だから」ということが理由の一つになり、携われる業務が追加されたことはあります。

他にも、私は物理学を研究していましたが、それをベースとして機械学習にも触ることができました。
（話はそれますが、機械学習の理論的部分と物理学の関連性があり、物理学科卒の人で機械学習をする人はちょこちょこいます。）

全員がそうだとは思いませんが、大学院でしっかり学んだからこそチャンスを多く持つことが出来たという部分はあると思います。

大学院に入ったからと言って、情報系でもない限りは、大きく変わることは正直ありません。
特に実務経験を重視するなら、なおさらだとは思います。

しかし、大学院に行くことで養うことのできる能力があることも確かです。
雑に言ってしまうと、「大学院に行っておくとチャンスを掴む場面が非常に増える」という感じでしょうか。
参考になれば幸いです。

# おしまい

みんなも参考になったら🦄
PostgreSQLでデッドロックが起きた時の解消法

# デッドロックが起きているかの確認
```sql
darknet=# SELECT
        l.pid,
        l.granted,
        d.datname,
        l.locktype,
        relation,
        relation::regclass,
        transactionid,
        l.mode
    FROM 
        pg_locks l  
    LEFT JOIN 
        pg_database d 
    ON 
        l.database = d.oid
    WHERE  
        l.pid != pg_backend_pid()
    ORDER BY 
        l.pid
    ;
```

実行結果
```
  pid   | granted | datname |   locktype    | relation |           relation            | transactionid |        mode
--------+---------+---------+---------------+----------+-------------------------------+---------------+---------------------
 875997 | t       |         | virtualxid    |          |                               |               | ExclusiveLock
 875997 | t       | darknet | relation      |    79159 | pg_toast.pg_toast_79156       |               | AccessExclusiveLock
 875997 | t       | darknet | relation      |    87560 | 87560                         |               | AccessExclusiveLock
 875997 | t       |         | transactionid |          |                               |         75407 | ExclusiveLock
 875997 | t       | darknet | object        |          |                               |               | AccessShareLock
 875997 | t       | darknet | relation      |    79156 | asn_tab                       |               | AccessExclusiveLock
 875997 | t       | darknet | relation      |    79161 | pg_toast.pg_toast_79156_index |               | AccessExclusiveLock
 875997 | t       | darknet | object        |          |                               |               | AccessExclusiveLock
 875997 | t       | darknet | object        |          |                               |               | AccessExclusiveLock
 875997 | t       | darknet | object        |          |                               |               | AccessExclusiveLock
 875997 | f       | darknet | relation      |    66696 | intermediate_flows            |               | AccessExclusiveLock
 875997 | t       |         | object        |          |                               |               | AccessShareLock
 875997 | t       | darknet | relation      |    87563 | 87563                         |               | ShareLock
 875997 | t       | darknet | relation      |    59675 | rib_net_idx                   |               | AccessShareLock
 875997 | t       | darknet | relation      |    87565 | 87565                         |               | AccessExclusiveLock
 875997 | t       | darknet | relation      |    59669 | rib                           |               | AccessShareLock
```

    pid    :　プロセスID
    granted: boolean, ロックが待ち状態の場合にfalse
あとは、https://www.postgresql.jp/document/9.3/html/view-pg-locks.html を参照

プロセス中の一つの操作で、ロックが待ち状態となっている。

# 解決方法
根本的な解決ではないが、
```sql
SELECT pg_cancel_backend(プロセスID);
```
でロック待ちを解除できる。

もちろん、データベースを再起動してもできる。その場合の挙動は確認していないので、まずは上記でやってみると良さそう。

筆者はロックがかかるところを特定し、その直前で`conn.commit()`したらデッドロックは起こらなくなった。
【SwiftUI】ダブルタップを検知する

# はじめに
SwiftUIでダブルタップを実装する機会があり、調べると案外簡単に実現できました。
記録しておきます

# 実装
```swift
.onTapGesture(count: 2) {
    // 処理...
}
```

# おわり
`count`を増やすことでトリプルタップなども実現できそうです。
想像以上に簡単でびっくりしました。
Hyper-Vのゲスト OS で休止状態を有効にする方法

# 概要 #
Hyper-V の一時停止、再開ではなく Hyper-V のゲスト OSを休止させたい場面があります。
正直ニーズは非常に低いと思いますが、 Hyper-V の ゲスト OS で休止を有効にする方法についてまとめます。

# 前提条件 #
Hyper-V ホストの OS が 構成バージョン 9.0以上をサポートしている必要性があります。

その為ホストがサーバーOSの場合

Windows Server 2016 以前は使用できず
Windows Server 2019 または  Windows Server 2022 であるである必要性があります。

詳細は下記のMicrosoft 公開情報を確認してください。

Title： Hyper-V の仮想マシンのバージョンをアップグレードする (Windows または Windows Server) | Microsoft Learn
https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/deploy/upgrade-virtual-machine-version-in-hyper-v-on-windows-or-windows-server
※ [サポートされている仮想マシンの構成バージョン]と[仮想マシンの構成バージョンをアップグレードしないとどうなりますか?]の表を比較いただけるとご理解いただけると思います。

ゲスト OS は特に制限ないと思いますが、ゲスト OS で休止を使用できるように変更する必要性があります。

# 手順 #
Microsoftの公式情報では構成バージョン 9.0 で使えるようになった以外の記述が見つけられませんでした。
しかしながら下記リンクの手順でスクリプトを実行することで有効にすることが可能なことを確認しています。

https://superuser.com/a/1515838

具体的な手順は下記です。

1. ゲスト OS で動的メモリが無効になっていることを確認します。
無効になっていませんとゲスト OS が起動できなくなります。
2. 上述のページのスクリプトを  Hyper-V ホストで実行します。
   なおスクリプト 2行目で仮想マシン名を指定する必要性があります。
   なので実際に実行するスクリプトは下記です。
   ```
   Param (
       [string]$VmName = "仮想マシン名",
       [bool]$Enable = $true
   )
   
   # To modify, machine must be off
   $Vm = Get-VM -Name $VmName
   $Vm | Stop-VM -Force -WarningAction Ignore
   
   $wmiComputerSystem = gwmi -namespace root\virtualization\v2 -query "select * from Msvm_ComputerSystem where ElementName= '$VmName'"
   $wmi_vsSettingData = $wmiComputerSystem.GetRelated("Msvm_VirtualSystemSettingData","Msvm_SettingsDefineState",$null,$null, "SettingData", "ManagedElement", $false, $null)
    
   Write-Output ("Before: EnableHibernation = " + $wmi_vsSettingData.EnableHibernation)
   
   # $wmi_vsSettingData.EnableHibernation = $Enable  # Doesn't work - says The property 'EnableHibernation' cannot be found on this object
   # So, need to munge XML ourselves
   [xml]$vsSettingsDataXml = $wmi_vsSettingData.gettext(1)
   $EnableHibernationNodes = $vsSettingsDataXml.SelectNodes("/INSTANCE/PROPERTY[@NAME='EnableHibernation']")
   $EnableHibernationNodes[0].VALUE=$Enable.ToString()
   
   $wmi_vsSettingDataMgmt = Get-WmiObject -Namespace "root\virtualization\v2" -Class Msvm_VirtualSystemManagementService
   $job = $wmi_vsSettingDataMgmt.ModifySystemSettings($vsSettingsDataXml.OuterXml)
  
   ```
3. ゲスト OS を起動しコマンド プロンプトを管理者として起動します。
4. 下記コマンドを実行し休止状態を有効にします。
   ```   
    powercfg.exe /hibernate on
   ```
5.  下記を確認し休止状態を表示する設定とします。
Title： PC をシャットダウン、スリープ、休止状態にする - Microsoft サポート
https://support.microsoft.com/ja-jp/windows/pc-%E3%82%92%E3%82%B7%E3%83%A3%E3%83%83%E3%83%88%E3%83%80%E3%82%A6%E3%83%B3-%E3%82%B9%E3%83%AA%E3%83%BC%E3%83%97-%E4%BC%91%E6%AD%A2%E7%8A%B6%E6%85%8B%E3%81%AB%E3%81%99%E3%82%8B-2941d165-7d0a-a5e8-c5ad-8c972e8e6eff

上記を実施したのち、ゲスト OS で休止が選択できることを確認してください。

# 最後に #
公開情報やWebにおいて情報がないということはニーズが少ないのだとは思いますが、確認要望がありましたので今回記事にまとめてみました。

なおあくまでも休止(S4)が有効にできるのみで、スリープ(S3)は有効にできません。
スリープが有効にできれば、モダンスタンバイの検証などに使える可能性があるのですが今後の機能の追加に期待をしておきます。
SQLの勉強：データベースって何ですか？

これは、プログラミング初心者(1年勉強してるのにpaizaでBクラス問題一発正解しない人です)の私が勉強で使ってるメモページです。
# データベースとは
<strong>データベース(DB)</strong>
データの集まり。
Q.どんなデータの集まり？
A.大量のデータを効率よく取り出すために加工されたものだよ
正式名称：Datebase→DB

<strong>データベースマネジメントシステム(DBMS)</strong>
データベースを管理するためのソフトウェア。
正式名称：Datebase Manegement System
→DBと頭文字とってMSでDBMS

## <strong>データベースの種類</strong>
- リレーショナルデータベース
1番使われるデータベース。
- Key-valueストア
- ドキュメントデータベース
- グラフデータベース

### リレーショナルデータベースの構成要素
リレーショナルデータベースではデータの集まりを表の形で表現する
- テーブル
データの集まりである表
- レコード 
テーブル内の横並び。1つ1つのデータの事。
リレーショナルデータベースではデータをレコード単位で操作する。
- カラム
テーブルの縦の並び。項目。
- フィールド
テーブルの1マス。1フィールドにつき1データしか入らない。

### リレーショナルデータベースの特徴
複数のテーブルを結合し、大きなテーブルを作ることが出来る。
例)異なるテーブルに存在する共通のカラム内のフィールドを結び付けて、結合。

# 代表的なリレーショナルデータベースマネジメントシステム
<strong>リレーショナルデータベースマネジメントシステム(RDBMS)</strong>
リレーショナルデータベースを管理するためのソフトウェア
## RDBMSの例
- MySQL 
次回からはMySQLを使ってSQLを勉強する
- PostgreSQL
- Oracle
- SQL Server

# 次回
SQLってなんですか
お楽しみに
CoreServer V2 にpython を入れる！【Flaskとコアサーバー】

# 前置き
レンタルサーバーである、コアサーバーに、

普通にpythonをインストールしようとすると、

```sh
Permission denied: '/usr/local/lib/python3.6'
```

となってしまった。

デフォルトのpython を利用しようとすると、`pip`が使えなくて詰むので、どっちにしろ自分でpython入れなくちゃいけない。がんばろう。みんな。（正直、結構大変だったからVPS の方がいいと思う。今ならまだ間に合うよ！）


https://notemite.com/python/servers-for-python/

でもどうしてもやりたいんだったら、しゃーなし。一緒に頑張ろう😘


# 解決策

👇まずは、以下を参考にpython を入れる。


https://tech.any2.net/item/1849.html

👇これも参考に。（自分の環境化ではうまくいかなかったけど）

https://touch-kun.net/2021/11/23/post-313/


その後、以下をチェック。
- [x] zshrc_profile にpython のパスを記述する。

- [x] python のバージョン をコアサーバーで動作する python 以下にする。（自分はPython 3.8.9にした）
（コアサーバーのホームページに動作するpython の記載があった気がする。確か、3.10〜は動作しない。）

- [x] index.cgi の一行目に以下を記載。（パスは適宜修正してください。`which python`で出たものを書いた気がする）
```index.cgi
#! /home/`USERNAME`/.local/bin/python
```

- [x] coreserver のダッシュボードにて、該当ドメインで、cgi を有効にしておく。

- [x] 確か自分は、apache の設定は触らなかった。

# Flask の入れ方

Flask の入れ方はほとんどこれと一緒だった👇

https://kaedeee.com/?p=1733

これで入れたかもしれない👇うろ覚え😐

```sh
python3 -m pip install Flask --user
```

pip にて、`jinja2`, `flask` をインストール。

できた？出来なかったら、こっちの方がいいかも。（悪魔の囁き😈）

https://notemite.com/python/servers-for-python/
10分でできるUnityからChatGPTを呼ぶ方法

# APIのKeyを生成する

・OpenAIのサイトでAPIキーを作成
[OpneAiのサイト](https://openai.com/product)

・ アカウント作成後、PersonalのView API KEysをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/ba993d61-73c3-6030-0f4f-a851f0f9beae.png)


・Create New secret Keyをクリック
すぐに秘密鍵が作成されるので、表示された秘密鍵をコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/d46586e3-0fc4-a5c1-afdb-ce563176b8c2.png)

## Unity

・apiKeyに先ほど作成したOpenAIのAPI Keyを設定

``` C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class ChatGPT : MonoBehaviour
{
    // APIキー
    private string apiKey = "";

    // 質問
    private string prompt = "ChatGPTでUnityのゲームを作る方法";

    void Start()
    {
        StartCoroutine(Request());
    }

    IEnumerator Request()
    {
        string url = "https://api.openai.com/v1/engines/davinci-codex/completions";
        string json = "{\"prompt\": \"" + prompt + "\", \"temperature\": 0.5, \"max_tokens\": 500}";

        Dictionary<string, string> headers = new Dictionary<string, string>();
        headers.Add("Content-Type", "application/json");
        headers.Add("Authorization", "Bearer " + apiKey);
        UnityWebRequest request = UnityWebRequest.Post(url, json);
        request.uploadHandler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(json));
        request.downloadHandler = new DownloadHandlerBuffer();

        foreach (KeyValuePair<string, string> header in headers)
        {
            request.SetRequestHeader(header.Key, header.Value);
        }

        yield return request.SendWebRequest();
        string response = request.downloadHandler.text;
        Debug.Log(response);
    }
}

```

## google app scriptsでChatGPTを呼ぶ方法

https://qiita.com/aimkbiz/items/d8603c55265dee4c9585
5分で紹介「退屈なことはPythonにやらせよう」

# はじめに
この記事は **「退屈なことはPythonにやらせよう」** を５分で**この本の魅力や大まかな内容**を理解することを目的とした記事です。

この記事で少しでも興味を持ってこの本を読むきっかけになれば幸いです。

<img width="300" alt="名称未設定のアートワーク 4.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921163/2e018b11-3a4f-8885-f64f-9632bcfdf85d.jpeg">

# 目次
**・概要
・個人的な感想
・参考文献**

 # 概要
この本は**18章**と**4つの付録**から構成されています。

この本の対象読者は**ノンプログラマー**であり、
この本を通して**Pyhonで単純作業をしてくれる便利なプログラム**が書けるようになることを目標としています。

**さらにスキルを高めたい人**は章末の問題や付録の問題を解くことでスキルを高めることもできるようになっています。

この本の内容はまえがきに**Pythonの環境構築方法**が書かれており、
**１～６章**にかけて**Pyhtonの基礎の文法**などを学び**７～１８章**にかけて今までの章で学んだことを使って**処理の自動化をするプログラミング**について学びます。
各章には**章末問題**がついていて知識の確認をすることもできるようになっています。
# 個人的な感想
この本を読んで**これからPythonを勉強したいがどう勉強すればいいのかわからない人**におすすめできる本だと思いました。

なぜならこの本の対象読者は**高度なプログラミング技術を有する人**ではなく、**ノンプログラマー**だからです。

この本は**全562ページ**で、
初心者に少し多く感じるかもしれませんが、
**基礎から実践まで一冊で完結している**のでこの本を理解すればPython初心者でもPyhtonを使って便利なプログラミングが書けるようになると思います。

# 引用
>退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
Al Sweigart (著), 相川 愛三 (翻訳)
2017/6/3

https://store.shopping.yahoo.co.jp/boox/bk-487311778x.html?sc_i=shp_pc_search_itemlist_shsrg_img
【最新】九州大学工学部情報系の院進率・就職先をまとめてみた！

# 院進率

学科卒業　　　15%

大学院進学率　85%

# 学科卒業生の主な就職先

株式会社オービック／日本電営株式会社／九州通信ネットワーク株式会社／九州NSソリューションズ株式会社／株式会社エイチーム／アドソル日進株式会社／株式会社ビズリーチ／株式会社東芝／三菱電機ホーム機器株式会社／株式会社三島光産／WDB工学株式会社／JFEスチール株式会社／四国電力株式会社／マイクロンメモリジャパン／山陽電研株式会社／鹿児島市役所　

# 大学院卒業生の主な就職先

## 情報学専攻

KDDI／NTTコミュニケーションズ／富士通エフ・アイ・ピー／三菱電機インフォメーションネットワーク／大分キヤノン／コルグ／日本電気／日立パワーソリューションズ／JVCケンウッド・エンジニアリング／ソニーデジタルネットワークアプリケーションズ／富士通／HTS／デロイトトーマツコンサルティング合同会社／野村総合研究所／九州電力／マツダ／リクルートホールディングス／日立ビルシステム／いい生活／リクルートホールディングス／長崎市役所　など

## 情報知能工学専攻

ABEJA／NTT東日本／アピリッツ／ウフル／エコー電子工業／NTTデータ／オービック／九州NSソリューションズ／サガテレビ／西日本電信電話／ニシム電子工業／日本アイ・ビー・エム／日本総合研究所／野村総合研究所／日立アイ・エヌ・エス・ソフトウェア／富士通九州ネットワークテクノロジーズ／福岡放送／ヤフー／kingsoft／キヤノン／京三製作所／中国Huawei会社華為技術有限公司／テクノプロ・デザイン／東芝／パナソニック／日立製作所／北京凌宇智控科技有限公司／電通／日本アイ・ビー・エス・サービス／東芝メディカルシステムズ／ファナック／日亜化学工業／村田製作所／トヨタ自動車／西日本鉄道／リンクス　など

## 電気電子工学専攻

アルパイン／沖電気工業／キューヘン／東芝／東芝メディカルシステムズ／東芝三菱電機産業システム／パナソニック／パナソニックESシステムソフトウェア／日立製作所／富士ゼロックス／三菱電機／三菱日立パワーシステムズ／オムロン／ギガフォトン／ソニー／ソニーイーエムシーエス／東京エレクトロン／ニコン／日本テキサスインスツルメンツ／日本電産／アイシンエイ・ダブリュ／ダイハツ工業／トヨタ自動車／トヨタ自動車九州／日産自動車／本田技研工業／三菱重工業／旭化成／旭硝子／昭栄化学工業／信越化学工業／三菱化学／三菱化学エンジニアリング／KDDI／NTTドコモ／ソニー・コンピュターエンタティメント／日立産業制御ソリューションズ／JFEスチール／新日鐵住金／日本発条／関西電力／九州電力／中国電力／理想科学工業／西日本旅客鉄道／ヤンマー　など

# 他にもこんな会社に就職①

KDDI／NTTコミュニケーションズ／富士通エフ・アイ・ピー／三菱電機インフォメーションネットワーク／大分キヤノン／日本電気／日立パワーソリューションズ／JVCケンウッド・エンジニアリング／ソニーデジタルネットワークアプリケーションズ／富士通／HTS／野村総合研究所／マツダ／リクルートホールディングス／NTT東日本／NTTデータ／日本アイ・ビー・エム／日本総合研究所／野村総合研究所／日立アイ・エヌ・エス・ソフトウェア／ヤフー／kingsoft／キヤノン／中国Huawei会社華為技術有限公司／東芝／パナソニック／日立製作所／北京凌宇智控科技有限公司／電通／日本アイ・ビー・エス・サービス／村田製作所／トヨタ自動車／西日本鉄道／リンクス／東芝／東芝三菱電機産業システム／パナソニック／日立製作所／三菱電機／三菱日立パワーシステムズ／オムロン／ソニー／ソニーイーエムシーエス／東京エレクトロン／ダイハツ工業／トヨタ自動車／日産自動車／本田技研工業／三菱重工業／旭化成／三菱化学／NTTドコモ／ソニー・コンピュターエンタティメント／新日鐵住金／関西電力／九州電力／トヨタ自動車、ソニー、パナソニック、、野村総合研究所、三菱電機インフォメーションネッ トワーク、日本電気、日立製作所、村田製作所、新日鉄住金、JVCケンウッド・工ンジニアリング、ソニーコンピューターエンタテイメント、ソニーデジタルネットワークアプリケーションズ、富士通、東芝、三菱電機、三菱日立パワーシステムズ、旭化成、オムロン、旭硝子、コルグ、アルパイン、沖電気工業、東京エレクトロン、ヤンマー、三菱化学、理想科学工業、日本電産、JFEスチール、ニシム電子工業、国立研究開発法人産業技術総合研究所、東京大学、富士通研究所

# 他にもこんな会社に就職②

トヨタ自動車、ソニー、パナソニック、富士ゼロックス、野村総合研究所、三菱電機インフォメーションネッ トワーク、日本電気、日立製作所、村田製作所、新日鉄住金、JVCケンウッド・工ンジニアリング、ソニーコンピューターエンタテイメント、ソニーデジタルネットワークアプリケーションズ、富士通、東芝、三菱電機、三菱日立パワーシステムズ、旭化成、オムロン、旭硝子、コルグ、アルパイン、沖電気工業、東京エレクトロン、ヤンマー、三菱化学、理想科学工業、日本電産、JFEスチール、ニシム電子工業、国立研究開発法人産業技術総合研究所、東京大学、福岡大学、富士通研究所、鉄道総合技術研究所、日本電信電話、九電テクノシステムズ、味香り戦略研究所等々

🦄
【typescript】eslintでパラメータプロパティを許可する

# 前書き

airbnbを使ってeslintを使っていると、typescriptでパラメータプロパティが使えない(エラーが出る)。
それを回避できないか調べたところ、普通に存在していたので、それのメモ。

# パラメータプロパティとは

コンストラクタの引数でクラスプロパティを宣言できる。

[TypeScript: Documentation - Classes](https://www.typescriptlang.org/docs/handbook/2/classes.html#parameter-properties)

```ts
class Params {
  constructor(
    public readonly x: number,
    protected y: number,
    private z: number
  ) {
    // No body necessary
  }
}

// 上と下のコードは同一コード。

// class Params {
//   public readonly x: number;
//   protected y: number;
//   private z: number;

// constructor(
//     readonly x: number,
//     y: number,
//     z: number
//   ) {
//     this.x = x;
//     this.y = y;
//     this.z = z;
//   }
// }
```

上記コードはサイトに載っていたコードの引用。
これを見て分かる通り、`x`や`y`などのクラスプロパティを用意しなくても、コンストラクタの引数で`public`や`private`などの修飾子を付けるだけでクラスプロパティを用意し、代入してくれるという優れもの。

他にもクラスプロパティを持っている場合や、クラスプロパティではない引数とセットで使う場合などは、可読性が下がってしまう時があるのだが、それ以外だとシンプルに使いやすいので使えるなら使いたい。

# eslintではエラーが出る

若干語弊のある表題。正確には、以下のeslint設定だとエラーが出る。

```json
    "no-useless-constructor": "error",
```

これは、中身が空などで意味のないコンストラクタを記述している場合にエラーが出るようになっている。

が、上記の`Params`クラスも引数だけ設定して中身が空白なので、エラーが出る。
理由は単純で、javascript本体にはパラメータプロパティ記法が存在せず、eslint側では単に引数だけ受け取ったコードとして認識されるため。

[Parameter properties trigger `no-useless-constructor` · Issue #546 · eslint/typescript-eslint-parser](https://github.com/eslint/typescript-eslint-parser/issues/546)

typescriptだとクラスプロパティ宣言も兼ねてるかなり必要なコードなので、このエラーは意図しないものになる。是非とも回避したい。

# @typescript-eslintを使う

## @typescript-eslint/no-useless-constructor

`@typescript-eslint/no-useless-constructor`は、`no-useless-constructor`と同じく意味のないコンストラクタはエラーが出るが、こちらはクラスプロパティに対応していて、上記の`Params`クラスでもエラーが出ないようになる。

[no-useless-constructor | typescript-eslint](https://typescript-eslint.io/rules/no-useless-constructor/)

また、`no-useless-constructor`をoffにしないとこれがエラーを出してくるので、同時にoffにする。

```json
  "overrides": [
    {
      "files": ["**/*.ts"],
      "rules": {
        "no-useless-constructor": "off",
        "@typescript-eslint/no-useless-constructor": "error"
      }
    }
  ]
```

`rules`の中でも良いが、jsと混在するならtsにだけ影響させたほうが良さそう。

これで終わりかと思いきや、実はエラー自体は解消しきれていない。
`Unexpected empty constructor.`というエラーが表示される。(※上の`Params`はコメントがあるのでエラーが出ないが、消せば出る)
ということでこれも同じく解消する。

## @typescript-eslint/no-empty-function

`@typescript-eslint/no-empty-function`を使うことで、パラメータプロパティ専用のコンストラクタでエラーが出なくなる。

[no-empty-function | typescript-eslint](https://typescript-eslint.io/rules/no-empty-function/)

先ほどと同様に、`no-empty-function`を無効にして、こちらをセットする。

```json
  "overrides": [
    {
      "files": ["**/*.ts"],
      "rules": {
        "no-useless-constructor": "off",
        "@typescript-eslint/no-useless-constructor": "error",
        "no-empty-function": "off", // 追加
        "@typescript-eslint/no-empty-function": "error" // 追加
      }
    }
  ]
```

これで、エラーを気にせずにパラメータプロパティを記述できるようになった。めでたしめでたし。

# 終わりに

最近のeslintの初期設定でairbnbを設定出来なくなったし、設定していてもルールの上書き数が増えてきたので、そろそろ自分用にカスタマイズしたもの作りたい感。
５分で紹介「図解即戦力 暗号と認証のしくみと理論がこれ1冊でしっかりわかる教科書」


# はじめに
この記事は 
**「図解即戦力 暗号と認証のしくみと理論がこれ1冊でしっかりわかる教科書」** を**５分**で**この本の魅力や大まかな内容**を理解することを目的とした記事です。

この記事を読んで少しでも興味を持ってこの本を読むきっかけになれば幸いです。

<img width="300" alt="名称未設定のアートワーク.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921163/49a7cba6-9eb6-6302-2880-214a2fb72ff0.jpeg">


# 目次
**・概要
・個人的な感想
・引用**

# 概要
この本は**全311ページ**、９章で構成されています。

**全ページカラー**で書かれていて、図や挿絵も多用されています。

内容は**知識ゼロ**からでも理解できるようになっています。
１章で**暗号の基礎知識**を学び、
２～９章にかけてそれぞれの章の**知識や専門用語**を理解する内容になっています。

この本の内容は一貫して**現場で必須の知識**を理解できるような内容になっていて,
それ以外の難しい内容はあまり取り入れてないので**初学者にも読みやすい内容**になっています。

# 個人的な感想
この本を読んでこの本は**暗号と認証について知りたい初学者**におすすめできる本だと思いました。

なぜならこの本は**全ページカラー**で書かれていて、
**図も多い**のでとても分かりやすいからです。

そしてこの本の特徴は**現場で必須の知識**を一冊で理解できるようになっています。
そして重要なところは**太線**になっていたり、
**黄色いマーカーでアンダーライン**が引かれていて,
わかりやすくなる工夫がされていて暗号と認証について**抵抗がある人**や**苦手意識**がある人にお勧めしたい本になっています。

# 引用
>図解即戦力 暗号と認証のしくみと理論がこれ1冊でしっかりわかる教科書
著　光成　滋生
>2021/9/24

https://store.shopping.yahoo.co.jp/cotton-store/sam33ed5fab27.html
fortranソースコードのコンパイルの順序：モジュール依存性の自動生成checkmodule.py

fortranは*.modを取り込まないといけないので、きちんとモジュール依存の順にコンパイルしないといけない。以下のようにpythonだと自分で書いてもすぐ書ける。~~他のツールも試してみたけど、設定をするのもそれなりに手間なので自分で書いたほうが早い~~ (cmake使ったほうがいいです。賢い。書き方はvscode-copilotとQiitaが教えてくれた。以下は記録のために残します)

要するにmodule xxxと書いてあるファイルはモジュールxxxの定義だし、それをuse xxxしているファイルをあとからコンパイルしないといけない。すなわち、makefile内に（インクルードしてもいいが）
```
モジュールを使うソース.o：モジュール定義のソース.o
```
がないといけない。以下のcheckmodule.pyに引数として複数のソースファイル名を入れると、この様なラインをすべて作って出力してくれます。以下を参考にして自前で書くのが早いです。

```python
#!/usr/bin/env python3
# checkmodule.py This routine checks module-dependency in fortran90 and compile them in right order.
# Usage:
#> chackmodule.py [source files] 
#
#In makefile, write lines as follows
#--------------------------------
#moduledepends.inc: $(subr)*.f90 $(main)*.f90 $(maxloc)*.f90
#	@echo 'init: Generate module-dependency file, moduledepends.$(PLATFORM).inc'
#	@[ -d moduledepends.inc ] || exec ../../TOOLS/checkmodule $(subr)*.f90 $(main)*.f90 $(maxloc)*.f90 
#--------------------------------
# This lines generetes *.f90 dependency file "moduledepends.inc" is generated from $(subr)*.f90 $(main)*.f90 $(maxloc)*.f90.
#

import os
import sys,subprocess
import re
def connect(alist):
        result=''
        for lll in alist:
                result = result + ' ' + lll
        return result
tmp ='chekckmodule.tmp'
src  = connect(sys.argv[1:])
print('TOOLS/checkmodule ==>  We are going to check module dependency file moduledepends.ing ... ')
zzz='grep -i --regexp="^\ *[Mm][Oo][Dd][Uu][Ll][Ee]" ' + src + ' >' + tmp
subprocess.call(zzz,shell=True)
oxx = open(tmp,'rt').read()
oxx = oxx.split('\n')
Rule={}
for ilinex in oxx:
        if len(ilinex)==0 : continue
        iline = ilinex.replace(':',': ') #fix for F90
        modulef = iline.split()[0].replace(':','')
        if iline.split()[2].lower()=="procedure": continue
        zzz= 'grep -i ' + iline.split()[2] + ' ' + src +'|grep -E -i ":\s*(use)"'
        os.system( zzz +' > ' + tmp)
        oww = open(tmp,'rt').read().split('\n')
        for ilinex in oww:        
                if(len(ilinex)==0): continue
                usef = ilinex.replace(':',' ').split()[0]
                if(  (modulef in Rule) == False and modulef != usef):
                        aaa=[]
                        Rule[modulef]= aaa + [usef]
                elif(modulef != usef):
                        aaa = Rule[modulef]
                        Rule[modulef]= aaa + [usef]
aaa='#This is generated by TOOLS/checkmodule'
for prereq0 in Rule.keys():
        for target0 in Rule[prereq0]:
                prereq = re.sub('.F$','.o', prereq0)
                target = re.sub('.F$','.o', target0)
                prereq = re.sub('.f90$','.o', prereq)
                target = re.sub('.f90$','.o', target)
                aaa=aaa + target +': '+prereq+'\n'
oxx = open("moduledepends.inc",'wt')
oxx.write(aaa)
sys.exit()
```
grepをシステムコールしてたりしてて遅いので高速化しないといけないな。いかにも汚いから、良いものあれば置き換えたい。長いのはイヤだけど。
新規作成したLaravel9プロジェクトのbladeでaction()が使えない

## 環境
Laravel 9.52.0 (新規作成したプロジェクト)

## 状況
下記のようなルーティングとコントローラを作成して、画面上にコントローラのURLを表示させようとしました。
```php:web.php
Route::get('index', [HelloController::class, 'index']);
```
```php:HelloController.php
<?php
namespace App\Http\Controllers;
class HelloController extends Controller
{
    public function index()
    {
        return view('index');
    }
}
```
```php:index.blade.php
<p>{{ action('HelloController@index') }}</p>
```

すると、`Action HelloController@index not defined.`というエラーが発生↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533999/c5515330-ffbc-a39c-a430-2ef7399ce59c.png)

## 原因
Laravelが7から8にバージョンアップした際に、ルーティングの記載方法が変更になったことが原因でした。Laravel 7までは`RouteServiceProvider`の中に$namespaceプロパティが定義されており、このプロパティによって、action('HelloController@index')という書き方をした際に自動的に名前空間のプレフィックスがつき、`'App\Http\Controllers\HelloController@index'`であると解釈してくれていたみたいです。  

しかし、Laravel 8以降は`RouteServiceProvider`から$namespaceプロパティが削除され、初期値としてnullを設定するようになりました。なので、action('HelloController@index')という書き方をすると、エラーが出てしまっていたみたいです。  

## 解決方法
下記の方法でエラーを解消することができました。
・`RouteServiceProvider`に$namespaceプロパティを設定する
・コントローラのパスを全て書く
・use を使ってコントローラのパスを読み込む

### RouteServiceProviderに$namespaceプロパティを設定する
このようにRouteServiceProviderに$namespaceを追加して、対象のルーティングに適用してやります。  
すると今までと同じように`action('HelloController@index')`という書き方でaction()を使うことができます。
```diff_php:RouteServiceProvider.php
class RouteServiceProvider extends ServiceProvider
{
+    protected $namespace = 'App\Http\Controllers';

        (中略)

     public function boot()
    {
        $this->configureRateLimiting();

        Route::middleware('web')
+           ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));
        });
    }
```
```php:index.blade.php
<p>{{ action('HelloController@index') }}</p>
```

### コントローラのパスを全て書く
Laravelのバージョンアップによって、コントローラの名前空間のプレフィックスが自動でつかなくなったことが原因でエラーが出ていたので、下のように手動でつけてやってもうまくいきます。
```php:index.blade.php
<p>{{ action('App\Http\Controllers\HelloController@index') }}</p>
```

### use を使ってコントローラのパスを読み込む
この方法も基本的には２番目と同じ方法ですが、@phpを使いuseでコントローラを指定しています。  
action()の中身は、`[HelloController::class, 'index']`というようにweb.appと同じ書き方で書くことができます。
```php:index.blade.php
@php
    use App\Http\Controllers\HelloController;
@endphp
<p>{{ action([HelloController::class, 'index']) }}</p>
```

## 参考
[Laravel 8.x アップグレードガイド](https://readouble.com/laravel/8.x/ja/upgrade.html)
RouteTableにprefixlistを登録する方法① boto3編

# 初めに
基本的にCloudFormationを使用してIaCを管理しているのですが、
なんと、、、
CloudFormationでは、PrefixlistをRouteTableに登録することができないとのこと。
参考：[AWS::EC2::Route support for DestinationPrefixListId](https://github.com/aws-cloudformation/cloudformation-coverage-roadmap/issues/572)

CloudFormationでPrefixlistの作成はできるのに、RouteTableに登録できないなんて、、、と思っていても仕方ないので、
（実装時期も未定らしい。）
代案方法をまとめたいと思います。

今回は、**boto3**になります。

:::note info
ちなみに、下記ツールならRouteTableにPrefixlistを登録することはできそうです。
- AWS CLI
- SDK
- boto3
- Terraform
:::


### boto3とは？

>参考：ChatGPT
boto3は、PythonでAWSを操作するためのライブラリで、AWSのAPIにアクセスするためのクライアントライブラリです。AWSサービスの構成やデプロイの自動化に役立ち、PythonプログラムでAWSを簡単に操作できます。Python 2.6.5以上およびPython 3.3以上のバージョンで利用可能であり、AWSの多くのサービスに対応しています。クラウドインフラストラクチャの管理やデプロイに役立ちます。

# 構築環境
Python：3.11.0

# 実現したいこと
やりたいことは、単純です。
RouteTableのルートに、送信先をPrefixlist/ターゲットをインターネットゲートウェイとして登録するだけ。
aws cliでやるなら下記コマンドでになります。

```
aws ec2 create-route --destination-prefix-list-id [PrefixList_ID] --route-table-id [RouteTale_ID] --gateway-id [InternetGateway_ID]
```

# やった内容
今回は、PrefixlistをRouteTableに登録するスクリプトファイルまでを記事にしたいと思います。

#### 1. スクリプトファイルの作成

下記Pythonスクリプトファイルを作成します。

``` create_root.py
import boto3
client = boto3.client('ec2')

#各リソースのIDを記載
route_table_ids = ['rtb-056bfae20d21bac59', 'rtb-01d817248694ab7da']
destination_prefix_list_ids = ['pl-059875efe9b3ae7d2', 'pl-0cb544a048d31ec21']
gateway_id = 'igw-057f3d1e36a77648c'

#ループ処理で各RouteTableにPrefixlistを追加
for rtb_id in route_table_ids:
    for pl_id in destination_prefix_list_ids:
        try:
            response = client.create_route(
                DestinationPrefixListId=pl_id,
                RouteTableId=rtb_id,
                GatewayId=gateway_id
            )
            print(f"Route created for {rtb_id} and {pl_id}: Success")
        except Exception as e:
            print(f"Error creating route for {rtb_id} and {pl_id}: {e}")
```

#### 2.コマンド実行
スクリプトファイルを実行します。**Success**の返答が来ていたら問題ないです。
```
$ python create_root.py
Route created for rtb-056bfae20d21bac59 and pl-059875efe9b3ae7d2: Success
Route created for rtb-056bfae20d21bac59 and pl-0cb544a048d31ec21: Success
Route created for rtb-01d817248694ab7da and pl-059875efe9b3ae7d2: Success
Route created for rtb-01d817248694ab7da and pl-0cb544a048d31ec21: Success
```
マネジメントコンソール上からも確認し、無事登録できてることがわかりました。
![RouteTable＿02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515983/20869dff-6e44-753f-7277-9a015f09d27a.png)


ちなみにエラーだと下記のようになります。
＊故意にPrefixlist_IDを誤記
```
$ python create_root.py
Error creating route for rtb-01d817248694ab7da and pl-0cb544a048d31ec2d: An error occurred (InvalidPrefixListID.NotFound) when calling the CreateRoute operation: The prefix-list ID 'pl-0cb544a048d31ec2d' does not exist
```
エラー時の処理も問題ないことが確認できました。

# まとめ
実際は、上記スクリプトファイルをLamda関数とかで作成し、Cloud Formationから呼び出してあげるのがIaCの手段の一つになってくると思いますが
それは、またの機会に。

いずれにせよ、CloudFormationでPrefixlistをRouteTableに登録できるようにしていただければ一番楽なので
アップデートを楽しみにしたいと思います。
[CyberAgent]Swift歴3ヶ月の初心者がたった2週間で圧倒的成長を遂げた話[TechDojo]

2月16日から3月1日までCyberAgentさんのインターンに参加させていただきました。
初投稿で拙い文章なのですが、体験談や学んだことをアウトプットさせていただきます。
## 概要
参加インターン : 株式会社サイバーエージェント　2weeks iOS向け育成型インターンシップ
期間 : 2023年2月16日から3月1日
形態 : 出社
## 参加のきっかけと今までの経歴
大学2年生から大学のプログラミングサークルに所属しているのですが、インターンやハッカソン参加などの経験が無く、今回のインターンを成長のきっかけにしたいと考えたからです。
また、プログラミングに関しては大学の授業でPythonを触った程度で、Swiftは始めて三ヶ月の初心者でした
## インターンの内容
今回のインターンは「1人でiOSアプリを作れるような技術をつける」という目的を達成できるように設定されており、出された課題を同じインターン生(Dojo生と呼ぶらしい)やメンターさんと協力しながら作り上げていくというものでした。
完成したアプリのデモ動画がこちらです。

https://youtube.com/shorts/KZyrywlNlvo?feature=share

GitHubかTwitterのセルを押した後、テキストフィールドに文字を入力すると対応したWebサイトのリンクが表示されます。
めちゃくちゃ本格的。



最後にHome画面に表示されたQRコードは入力内容をもとに生成されるようになっており、そこから他のDojo生の情報を取得することができます。

https://youtube.com/shorts/EonSx91jLKo?feature=share




## 良かった点や学んだこと

### 1.他のエンジニア志望学生と交流することができた
まずこれが一番です。自分はサークル以外に他のエンジニア志望の学生と交流することがなかったので、とても良い刺激になりました。他の参加者は自分に比べて技術レベルが高く、内心話しかけるのにハードルが高いなと感じていましたが、いざ話すとみなさんとても気さくで親切で、今回のインターンを通して良い友人となることができました。今後もハッカソンなどで交流していきたいです！

### 2.エンジニアとしての働き方やサイバーエージェントについて知ることができた
インターン中にオフィスの様子を見学させていただきました。それぞれの事業部ごとにオフィスの雰囲気が異なっていて驚きました。また、インターン前に持っていたイメージ通り、どのオフィスも活気に満ちていました。

### 3.メンターさんのおかげで技術的なことが色々学べた
インターン中は毎日16時頃に「質問ラッシュアワー」というものが設定されており、サイバーエージェントで働いている現役エンジニアの方に課題のことや追加機能に関する質問を聞きまくることができました！
単にやりたいことの解決策を教えていただけるだけでなく、それに関連する概念についても教えていただけたのがありがたかったです。
学んだことは今後まとめて記事として書けたらな〜と思っています。

## おまけ：ランチが美味しかった😋
ランチが経費で出るらしく、毎回渋谷のランチやお弁当を社員さんといただきました。
どれもとても美味しかったです！！
![IMG_5199.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/0c1e928d-c43c-05ae-24b2-fded7f317af4.jpeg)
![IMG_5219.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/359b7257-19d6-2430-c4b4-ef357bda847f.jpeg)
![IMG_5372.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/ef2a58ca-70af-124d-0cdd-ff09b7f6746d.jpeg)
Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「BLOBアクセス層」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「BLOBアクセス層」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure でのストレージの実装と管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-storage/)
◇対応するモジュール
[BLOB アクセス層を割り当てる](https://learn.microsoft.com/ja-jp/training/modules/configure-blob-storage/4-create-blob-access-tiers)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「BLOBコンテナ」](https://qiita.com/fsd-jume/items/51fbb65ce4076c2caf7e)

## BLOBアクセス層
AZ-900の学習まとめでも扱っておりますので、復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure ストレージサービス」](https://qiita.com/fsd-jume/items/f809c7c05932af38fe19)

### BLOBアクセス層
・BLOBデータに対して複数のアクセス層をサポート
・各アクセス層はデータ使用の特定パターンをサポートするように最適化

### BLOBアクセス層の特性
**◆ホットアクセス層(オンラインアクセス層)**
・頻繁に読み書きするデータに最適
・既定では新しいストレージアカウントはホットアクセス層に作成
・ホットアクセス層の使用シナリオの例
　-頻繁に使用されているデータ
　-頻繁に読み書きが必要とされることが予想されるデータ
　-処理段階にあり、最終的にはクールアクセス層に移行されるデータ

**◆クールアクセス層(オンラインアクセス層)**
・アクセス頻度は高くないが読み取り/書き込みが必要になるデータに最適
・30日以上クールアクセス層に保存されるデータが対象
⇒30日前に削除/異なる層への移動の場合は早期削除の料金が発生
・クールアクセス層の使用シナリオ例
-短期バックアップやDRのデータセット
　-頻繁には使用しないが即座にアクセスできるようにしておきたい古いデータセット
　-追加データを収集/処理しながら低コストで保存したい大規模なデータセット

**◆アーカイブアクセス層**
・めったにアクセスしないデータの保存に最適なオフライン層
・アクセスするにはオンラインアクセス層にリハイドレートする必要がある
⇒アクセスできるまで最大15時間かかる場合がある
※リハイドレートはデータのコピーとアクセス層の移動の2つのオプションあり
・データは少なくとも180日間保持される必要あり
⇒30日前に削除/異なる層への移動の場合は早期削除の料金が発生
・アーカイブアクセス層の使用シナリオ例
　-長期/セカンダリバックアップ、アーカイブデータセット
　-使用可能な形式への処理後も保持する必要がある元の生データ
　-長期間格納の必要があり、アクセス頻度がほぼない、コンプライアンス情報

**◆Premium Blob Storage**
・データはSSD(ソリッドステートドライブ)に格納
　-高速の一貫した応答時間を要するワークロードに最適
　-1秒あたりのI/Oが多いワークロードに最適
・Premium Blob Storageの使用シナリオ例
　-頻繁かつ高速な更新が必要なマッピングアプリケーション
　-IoT/ストリーミング分析
　-人工知能/機械学習(AI/ML)

### 各アクセス層の比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/76639db6-c799-9cbb-ac72-c12eec47c766.png)

## 次の学習内容
**◆BLOBライフサイクル管理規則**

https://qiita.com/fsd-jume/items/3d6a37e32478db53eb65

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
Godot 4 で iOS にエクスポートする際のチームID

エクスポート > iOS の設定の
App Store Team ID
には存在するキーワードを入れなければならず、なおかつ空白などが含まれていると JSON（たぶん）のパースに失敗する。

（何も入れないと
```
App Store チームIDが未指定 - プロジェクトを構成できません
```
というエラーが出てエクスポートできない）

（空白などが含まれているとエクスポートでエラーが出て
```
	Reason: The project ‘my_project’ is damaged and cannot be opened due to a parse error. Examine the project file for invalid edits or unresolved source control conflicts.
  editor/export/editor_export_platform.h:173 - Xcode Build: Xcode project build failed, see editor log for details.
```
のようなエラーが出る）

ので、ここは
https://developer.apple.com/account#MembershipDetailsCard
このページから
メンバーシップの詳細 > チームID
にある
`A12BCD3EFG`
のような１０桁の記号を使用することで成功する。（した）

Godot version: v4.0.stable.official [92bee43ad]