OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptのreduce関数を理解する

## reduce関数とは
`reduce`関数は、配列の各要素に対して**累積的な計算**を行い、単一の値に**畳み込む**(=reduce)ための関数。つまり、配列全体を１つの値にまとめあげるための関数。

## 基本的な構文
```javascript
array.reduce((accumulator, currentValue, currentIndex, array) => {
    //処理
}, initialValue);
```
### 各パラメータの意味
- `accumulator`: 前回の`reduce`の実行結果が保持される値。初回は`initialValue`が入る。
- `currentValue`: 現在処理中の配列の要素。
- `currentIndex`: 現在処理中の配列のインデックス。(省略可)
- `array`: `reduce`が実行されている配列。(省略可)
- `initialValue`: `accumulator`の初期値。省略すると配列の最初の要素が使用され、`currentValue`は２番目の要素から始まる。

## 使用例
### 配列内の数値の合計を計算する
```javascript
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((accumulator, currentValue) => {
    return accumulator + currentValue;
}, 0);

console.log(sum);  // 15
```

### 配列のフラット化
```javascript
const nestedArray = [[1, 2], [3, 4], [5, 6]];
const flatArray = nestedArray.reduce((accumulator, currentValue) => {
    return accumulator.concat(currentValue);
}, []);

console.log(flatArray);  // [1, 2, 3, 4, 5, 6]
```

### 値の出現回数をカウント
```javascript
const fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
const fruitCount = fruits.reduce((accumulator, currentValue) => {
  if (accumulator[currentValue]) {
    accumulator[currentValue] += 1;
  } else {
    accumulator[currentValue] = 1;
  }
  return accumulator;
}, {});

console.log(fruitCount);  // { apple: 3, banana: 2, orange: 1 }
```

### オブジェクトのグルーピング
```javascript
const people = [
  { name: 'Alice', age: 21 },
  { name: 'Bob', age: 25 },
  { name: 'Charlie', age: 21 },
  { name: 'David', age: 25 },
  { name: 'Eve', age: 30 }
];

const groupedByAge = people.reduce((accumulator, currentValue) => {
  const age = currentValue.age;
  if (!accumulator[age]) {
    accumulator[age] = [];
  }
  accumulator[age].push(currentValue);
  return accumulator;
}, {});

console.log(groupedByAge);
/*
{
  '21': [
    { name: 'Alice', age: 21 },
    { name: 'Charlie', age: 21 }
  ],
  '25': [
    { name: 'Bob', age: 25 },
    { name: 'David', age: 25 }
  ],
  '30': [
    { name: 'Eve', age: 30 }
  ]
}
*/

```
Laravel の 404 エラーページでログイン状態が正しく表示されない問題の解決

## 問題の発生
Laravel 10 で構築されたプロジェクトにおいて、未定義のルートにアクセスした際に 404 エラーページへ遷移する際、ログイン状態が正しく表示されない問題が発生。
具体的には、ログインしているにも関わらず、セッションが開始されていなかった。

## 結論
フォールバックルートで対応できました。
```php
Route::fallback(function () {
    abort(404);
});
```


## 原因の調査
この問題は、404 エラーが発生した際に、`StartSession` ミドルウェアが実行されず、セッションが開始されないことが原因でした。
`StartSession` ミドルウェアは、通常、`web` ミドルウェアグループに含まれており、定義済みのルートにアクセスした際には実行される。
しかし、未定義のルートにアクセスした場合は、`web` ミドルウェアグループが適用されないため、セッションが開始されない。

## 解決策の検討

### 1. 例外ハンドラでの対応
当初は、例外ハンドラ (`app/Exceptions/Handler.php`) の `render` メソッドをオーバーライドし、404 エラーが発生した際に `StartSession` ミドルウェアを動的に適用することで対応しようとした。
ググるとこんな感じのStackOverflowの記事がいくつか出てくる。

```php:app/Exceptions/Handler.php
public function render($request, Throwable $exception): Response
{
    try {
        // リクエストされたパスに対応するルートを取得
        // ルートが存在しない場合は例外が発生
        Route::getRoutes()->match($request);
    } catch (\Exception) {
        // ルートが存在しない場合は一時的にルーティングを設定してミドルウェアを適用
        Route::any(request()->path(), function () use ($e, $request) {
            return parent::render($request, $e);
        })->middleware('web');
        return app()->make(Kernel::class)->handle($request);
    }

    return parent::render($request, $e);
}

```

### 2. フォールバックルートでの対応
フォールバックルートを利用して、未定義のルートにアクセスした際にもwebミドルウェアを通過させる。

```php:routes/web.php
Route::fallback(function () {
    abort(404);
});
```

今回の問題であれば`最もフィジカルで、最もプリミティブで、そして最もフェティッシュ`な方法なのでこちらを採用。

## まとめ

Laravel の 404 エラーページでログイン状態が正しく表示されない問題は、未定義のルートへのアクセス時にセッションが開始されないことが原因でした。
未定義のルートアクセス時に特別なミドルウェアを適用したい場合は1、それ以外は2で対応すれば良いと思います。

**参考**

* [Laravel 10.x Routing](https://readouble.com/laravel/10.x/ja/routing.html)
* [Laravel 10.x Middleware](https://readouble.com/laravel/10.x/ja/middleware.html)
* [Laravel 10.x Error Handling](https://readouble.com/laravel/10.x/ja/errors.html)
NewtechのラックマウントサーバーにProxmoxを入れてみた

# やりたかったっこと
普段使いのPCにLinuxを入れても、最近はデバイスを認識しないということは少なくなりました。debianをベースにしているProxmoxも、デバイスを認識しないということはあまりないと思います。
しかし、（私の？）身近にあまりない10GbEのネットワークや、RAIDコントローラなども認識するのか、興味はあるけど試す機会がなかなかありません。
今回、Newtech様からCloudy-SRVをお借りできたので、Proxmoxをインストールできるか検証してみました。
今回の検証で動作したとはいえ、今後も動作保証できるわけではありませんが、動作確認の一例ということで読んで頂けると幸いです。
インストールしたProxmoxのバージョンは8.1.4です。

# 検証に使用した機器
Newtech Cloudy-SRV 2U
| 項目 | 仕様 | 
|:-:|:-:|
| CPU  | Intel Xeon Silver 4210  |
| メモリ | 32GB  |
| RAIDコントローラ | MegaRAID 9560-8i |
| ミラーリングユニット |　240G |
| 搭載ドライブ| SSD 1TB x 6 |
| LAN | 10GbEx2 + 拡張カード10GbEx2 |

<外観>
![DSC07372.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/ad7c79a2-6296-ec85-c062-925f5cb39383.jpeg)

<3.5インチベイにSSDが入ってました>
![DSC07409.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/35eea1b2-5556-4556-da5e-89ebf284babc.jpeg)

<背面>
![DSC07386.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/9fbd4a69-0b03-9b38-0164-da7f3cff3f92.jpeg)

# ミラーリングユニットについて
Cloudy-SRV シリーズの特徴の一つに**ミラーリングユニットが標準搭載されている**点があります。
今回お借りした機器には、240GBのNVMeSSDでミラーしたユニットが搭載されていました。インストール時は、１つのSSDディスクとして見えます。
意識することなくインストールするだけで、OSがミラーで保護されます。

ミラーされたSSDの障害監視はnummという専用のツールで確認します。Linux対応版があるので、インストールすることで、ミラーの状態を確認することができます。

# MegaRAIDの動作確認
MegaRAIDはLinuxカーネルにマージされているようで、RAIDコントローラーがlspciで出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/674a4955-e041-2114-f1ff-bd1c96193c76.png)

初期状態ではMegaRAIDに接続されたSSDはOSからは認識されません。
RAID BIOSもしくは、MegaRAID CliでRAIDドライブを作成すると、ディスクとして認識されます。

認識されたら、LVMなりLVM-Thinなりでフォーマットすれば、通常のドライブとして利用可能になりました。

# ベンチマーク
ubuntu22をインストールし、KdiskMarkでディスクアクセスのベンチマークを取得してみました。

### ミラーリングユニット
通常、ミラーリングユニットにVMのインスタンスは保存しないと思いますが、ベンチマークを取得してみました。
実行結果は以下のような値でした。近年のSSDと比較すると高速ではありませんが、OS用としては十分な速度があると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/52a7b89d-4f6d-7a88-f759-99cabfd01aaf.png)

### 1本構成
1本で構成を組んでみたところ、SATA-SSDとしては標準的な値になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/bdf2ca38-887e-c854-1aaa-897c4b2b7108.png)

### 2本構成（RAID0）
2本でRAID0を組んでみたところ、シーケンシャルの速度が1本のほぼ倍の値になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/0672a520-6fe2-96cd-65c7-00ad6149ea84.png)

### 6本構成（RAID5）
6本でRAID5を組んでみたところ、シーケンシャルで14000を超える値になりました。何度か取り直したのですが、突然キャッシュが効いたのか、爆速でした。１本、２本の値からかけ離れているので、参考値として見てください。RAID5の利用が現実的だと思いますが、SATA-SSDのRAID5は高速に動作することが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/c01a44a9-b7ae-10dc-7256-db032fe8004a.png)

# 感想
大容量の領域もHDDからSSDにシフトしつつありますが、なかなかSSDを何本も使用してRAIDを体験する機会がありませんでした。
今回、SSD 6本という環境をお借りすることができ、インストールで問題になる部分もなく、動作も快適でした。

簡単な検証レポートになりますが、サーバー機導入のご参考になれば幸いです。
GitHub Actionsを使って本番環境へのデプロイを制限する方法

## GitHub Actionsを使って本番環境へのデプロイを制限する方法

GitHub Actionsを使ったデプロイの自動化は便利ですが、本番環境へのデプロイは特定の信頼されたメンバーに制限する必要があります。本記事では、GitHubの特定のチームメンバーだけが本番環境へのデプロイを実行できるようにする方法を紹介します。具体的には、GitHub ActionsとAWS ECSを連携させてデプロイする際に、GitHubチームのメンバーかどうかを確認し、本番環境（`prd`）に対してはチームメンバーのみがデプロイを許可される仕組みを実装します。

---

### シチュエーション

- **チームの管理されたデプロイプロセス**  
  デプロイの自動化を行いたいが、本番環境へのアクセスは制限したい。特に大規模なチームでは、誤ったデプロイが本番環境に影響を与えるリスクを避けるために、信頼されたメンバーのみにデプロイ権限を与える必要があります。このワークフローは、GitHubの特定のチームに所属しているかどうかを確認し、デプロイを制御します。
今回の場合は`github-actions-executable`というチームを作成し、そちらにデプロイ可能なメンバーを追加します。
---

### ワークフローの全体構造

以下のGitHub Actionsワークフローは、ユーザーが本番環境（`prd`）にデプロイする際に、次のような流れで実行されます。

1. **デプロイ環境の選択**  
   `workflow_dispatch`イベントを使用し、デプロイする環境を手動で選択します。  
2. **チームメンバーの確認**  
   GitHub APIを使って、デプロイ実行者が指定のチーム（`github-actions-executable`）に所属しているかどうかを確認します。
3. **AWS ECSへのデプロイ**  
   デプロイ実行者がチームメンバーであれば、AWS ECSにアーティファクトをデプロイします。

---

### シチュエーション図

以下は、このワークフローがどのように実行されるかのフローです。

```
+-----------------------+   手動デプロイ   +---------------------------+
| workflow_dispatch      | ------------> | Team Affiliation Check      |
| (デプロイ環境選択)      |               | (チームメンバーか確認)       |
+-----------------------+               +---------------------------+
          |
          v
+------------------------------------------+
| チームメンバーの場合、AWS ECSにデプロイ       |
| (非メンバーなら実行停止)                   　|
+------------------------------------------+

```
### サンプルコード

```yaml
name: Deploy ECS Prd

on:
  workflow_dispatch:
    inputs:
      deployEnv:
        type: choice
        description: 'デプロイする環境を選択してください'
        options:
        - prd
        required: true
        default: ''

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: ${{ inputs.deployEnv }}

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Check user for team affiliation
      uses: tspascoal/get-user-teams-membership@v3
      id: teamAffiliation
      with:
        GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
        username: ${{ github.actor }}
        team: 'github-actions-executable'

    - name: Stop workflow if user is no member
      if: ${{ steps.teamAffiliation.outputs.isTeamMember == false }}
      run: |
        echo "You have no rights to trigger this job."
        exit 1
        
    - name: Checkout
      uses: actions/checkout@v3

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
        aws-region: ap-northeast-1

    - name: Create artifact
      run: |
        zip -r /tmp/artifact.zip ./ -x *.git*

    - name: Put artifact and meta file
      run: |
        aws s3 cp /tmp/artifact.zip s3://${{ secrets.SOURCE_ARTIFACT_S3_BUCKET_NAME }}/backend/artifact.zip
```
CISSPの勉強あれこれ

2024/09
CISSPの筆記を受けてきたので準備にかんするあれやこれや。

■バックグラウンド
- クラウドのお仕事してます
- セキュリティベンダーとかで仕事したことはありません
- IPAの応用情報はだいぶ前に取ったことがありました
- セキュリティというトピックは個人的興味で好きですが、ハッキング技術とかそういうのは無縁
- インフラエンジニア


CISSP公式問題集
https://www.amazon.co.jp/CISSP%E5%85%AC%E5%BC%8F%E5%95%8F%E9%A1%8C%E9%9B%86-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%BB%E3%83%81%E3%83%A3%E3%83%83%E3%83%97%E3%83%AB-ebook/dp/B08C7J6SR5

日本語のってコレくらいしか無いと思います。Kindleで買いました。
私は４択って最終的には○×クイズだと思っているので、勉強法としては

- 各選択肢の間違いと正解の理由が説明できるもの（次から飛ばす）
- 脊髄反射で正解わかるもの（理由説明できるようにたまに解説を眺める）
- 毎回ちょっと悩むけど正解のもの（繰り返しやる）
- 不正解（覚えるまでやる）

くらいの粒度でKindleの色付けで９割くらいは説明できるまでパワー周回してました。
完全じゃないのは合格者のブログ読んでると同じのが出るわけではないって書いてあったのでまあだいたいわかれば準備としては良いだろう。という気持ちです。

自分は問題集を何周やって...とかはしてません。ドメインによって得意不得意あると思うので、得意なドメインは２−３回確認した程度ですが、良くわからないのはひたすら周回してました。

とは言っても、間違えたのをチェックしているくらいなのでドメイン単位でみると長くても１０−２０分あれば終わると思うので本当にちょこちょこ気が向いたら周回する。というスマホゲーで体力ポイント消化にイベント周回していく感じでやってました。

勉強する上でおすすめなのは

**頭から（１章から）やっていかない。（人による）です。**

何が言いたいかというと問題集の最初の方の章って法律とか管理上の話とかそういうのばっかりなので、エンジニアやってます！って人が頭からやると多分嫌になって勉強辞めるんじゃないかと思います。
暗号技術だとかネットワークだとか開発手法だとかとっかかりしやすい章からスタートして、ここまで勉強しちゃったしな...もったいないし覚えるか。くらいでそっちに戻ったほうが挫折しないと思います。

正直準備に使える教材ってこれくらいだと思うので、（私はこれしか使ってない）後は受験料に負けずに申請する心が必要でした。

### 問題集の価値
「セミプロに大事なことは専門用語を正しく使えることだ」と大学時代に恩師に教えられました。試験で用語的に何言ってるかわからない。は問題解く以前の問題で足切りラインだと思うので、問題集でしっかり「用語」理解する。のが準備だと思って準備しました。

あとは、CISSPではないのでCISSP的な考え方と言われてもぱっとしないので、「自分の心に正直に」「迷ったら最初にこれだって思ったのがだいたい正解だろう」「７０％で良いんだから多少わかんないのあったところで別に問題なんて無い」この気持ちでやっていきました。

あと、大事なのは「国語」です。何聞かれてんのか？はしっかり理解して回答するのが大事です。

### 試験に関して

合格者の方のブログ見ると、長時間テストでしんどい。ってのが書いてあるのが多いですが最近試験変わったみたいで最大180分テストになってます。

**シラバスにいろいろ試験について書いてあるので受験の前によく確認しましょう。（大事）**

会場はちょっと二酸化炭素濃度が高かった気がする。

資格試験はまとめて受けたほうが暗記的なコスパが良いので忘れる前に他にもいくつか受けようと思います。
ECSでデプロイしたアプリケーションのCloudFrontキャッシュをCodePipeline経由で安全にクリアする方法

# ECSでデプロイしたアプリケーションのCloudFrontキャッシュをCodePipeline経由で安全にクリアする方法

## 概要

ECS（Elastic Container Service）でデプロイされた静的コンテンツを更新する際、CloudFrontのキャッシュが残っていると、古いコンテンツがユーザーに表示されるリスクがあります。特に、ローリングアップデートを行う際にキャッシュクリアを誤ったタイミングで実行すると、古いECSタスクが古いキャッシュを再生成してしまう可能性があります。

本記事では、この問題を防ぐために、CodePipelineの最後にCodeBuildを追加し、デプロイ後にCloudFrontのキャッシュクリアを安全に行う方法を紹介します。

## この方法が役立つシチュエーション

- **静的コンテンツを頻繁に更新するWebアプリケーション**  
  CloudFrontを介して静的コンテンツを配信しているWebアプリケーションで、HTMLやCSS、JavaScriptなどの更新が頻繁に発生する場合、キャッシュクリアが必要になります。
  
- **ローリングアップデートを行う際に、確実に最新のコンテンツを配信したい場合**  
  デプロイ中に古いタスクがまだ動いていると、古いタスクが古いキャッシュを再生成してしまう可能性があります。これを防ぐために、デプロイ完了後にキャッシュをクリアすることが重要です。


## システム構成図

```text
+----------------------------+
|  CodePipeline               |
|                            |
|  +---------------------+   |
|  |  Deploy to ECS       |   |
|  +---------------------+   |
|                            |
|  +---------------------+   |
|  |  CodeBuild (Clear    |   |
|  |  CloudFront Cache)   |   |
|  +---------------------+   |
+----------------------------+
        |             
        v             
+----------------------------+
|  ECS Cluster (Fargate)      |
|                            |
|  +---------------------+   |
|  |  New Task            |   |
|  +---------------------+   |
|                            |
|  +---------------------+   |
|  |  Old Task            |   |
|  +---------------------+   |
+----------------------------+
        |             
        v             
+----------------------------+
|  CloudFront                |
|  +---------------------+   |
|  |  Cache Cleared       |   |
|  +---------------------+   |
+----------------------------+
```
## 実装フロー

1. **CodePipelineのデプロイフェーズ**  
   CodePipelineを使用してECSクラスタにデプロイを実行します。この際、ローリングアップデートにより新しいタスクが起動され、徐々にトラフィックが新しいタスクに切り替わります。

2. **CodeBuildフェーズの実行**  
   CodePipelineのデプロイが完了した後、CodeBuildが実行されます。`buildspec.yml`に記載されたAWS CLIコマンドを使って、CloudFrontのキャッシュクリアを行います。

3. **CloudFrontのキャッシュクリア**  
   デプロイが完了し、すべてのトラフィックが新しいタスクに移行した後にキャッシュクリアが実行されるため、古いタスクが誤ってキャッシュを再生成することを防ぎます。

## サンプル `buildspec.yml`

以下は、CloudFrontキャッシュクリアを実行するための`buildspec.yml`の例です。

```yaml
version: 0.2

phases:
  install:
    commands:
      - echo "Installing dependencies if necessary"
  build:
    commands:
      - echo "Starting CloudFront cache invalidation"
      - aws cloudfront create-invalidation --distribution-id YOUR_DISTRIBUTION_ID --paths "/*"

post_build:
    commands:
      - echo "CloudFront cache cleared successfully"
```
## 必要な設定
YOUR_DISTRIBUTION_IDは、CloudFrontのディストリビューションIDに置き換えてください。
このファイルをCodeBuildプロジェクトに追加し、CodePipelineの最後のステージで実行します。
【Python】積上げ式のAccessDBのうち、最新データのみ抽出する

# 課題
AccessのSQLではグループごとにソートする機能（ランク付け）が備わっていない。
Pythonの **groupby()** と **rank()** を活用し、AccessのDBに接続することで解決する。

# 現状
積上げ式のDBに下記のようなデータが入っているとする。
（履歴を残すために、１つのIDに対して複数データを積み上げる仕様になっている。）

|顧客ID|顧客名|開発担当|進捗状況|更新日|
|:--|:--|:--|:--|:--|
|1|A会社|青木|１．コーディング|2024/04/04|
|1|A会社|井上|２．テスト|2024/05/05|
|1|A会社|上野|３．リリース|2024/06/06|
|2|B会社|青木|１．コーディング|2024/05/05|
|2|B会社|伊藤|２．テスト|2024/07/07|
|3|C会社|相川|１．コーディング|2024/06/06|

# 目標
１つのIDに対して最新データのみを抽出したい。
キーは「顧客ID」、最新データは「更新日」で判別する。

|顧客ID|顧客名|開発担当|進捗状況|更新日|
|:--|:--|:--|:--|:--|
|1|A会社|上野|３．リリース|2024/06/06|
|2|B会社|伊藤|２．テスト|2024/07/07|
|3|C会社|相川|１．コーディング|2024/06/06|

# 作成したコード
```python:Python
import pyodbc
import pandas as pd

# Accessデータベースに接続
con = pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/Python/testDB.accdb;')
sql = 'SELECT * FROM table_A'
df = pd.read_sql(sql, con)

# キー項目でグループ化
# 更新日順でランク付け
df['ランク'] = df.groupby(['顧客ID'])['更新日'].rank(ascending=False)

# ランク=1だけ抽出
df = df.query('ランク == 1')

# 結果を表示
print(df)
```

# コード解説（抜粋）
```python
# キー項目でグループ化
# 更新日順でランク付け
df['ランク'] = df.groupby(['顧客ID'])['更新日'].rank(ascending=False)
```
**df['ランク']**
DataFrameに項目「ランク」として追加。

**df.groupby(['顧客ID'])**
「顧客ID」でグループ化。

**['更新日'].rank()**
グループ化したものを「更新日」でランク付け。

**(ascendin=False)**
降順にランク付け。つまり「更新日」が大きいものから順に「ランク=1」になる。

```python
# ランク=1だけ抽出
df = df.query('ランク == 1')
```
上で加工したデータのうち「ランク=1」のみを抽出。
つまり、グループごとに「更新日」が最新のデータを取得できた。
🌐【Google Chrome】カスタムURLまとめ 

### この記事は何？
Google ChromeのカスタムURLのまとめです

### 一覧

| URL                                      |     説明                |     備考                |
|:-----------------------------------------|:--------------------- |:--------------------- 
| [chrome://about](chrome://about)                 | カスタムURLの一覧        | |
| [chrome://accessibility](chrome://accessibility) | アクセシビリティ設定      | |
| [chrome://bookmarks](chrome://bookmarks) | ブックマークの一覧      | |
| [chrome://chrome-urls](chrome://chrome-urls) | カスタムURLの一覧      | chrome://aboutと同じ内容 | 
| [chrome://dino](chrome://dino) | Dinoゲーム      | みんな大好きDinoゲーム、通常はネット接続がない場合に表示される |
| [chrome://version](chrome://version) | Chromeのバージョン情報      | |
macos cli defaults manual

## defaults

```sh
defaults read

defaults read com.apple.finder

defaults read com.apple.finder DesktopViewSettings

{
    GroupBy = None;
    IconViewSettings =     {
        arrangeBy = none;
        backgroundColorBlue = 1;
        backgroundColorGreen = 1;
        backgroundColorRed = 1;
        backgroundType = 0;
        gridOffsetX = 0;
        gridOffsetY = 0;
        gridSpacing = 54;
        iconSize = 96;
        labelOnBottom = 1;
        showIconPreview = 1;
        showItemInfo = 0;
        textSize = 12;
        viewOptionsVersion = 1;
    };
}


defaults read-type com.apple.finder DesktopViewSettings
# Type is dictionary

# defaults write com.apple.finder DesktopViewSettings -dict IconViewSettings '{iconSize = 64; gridSpacing = 100; arrangement = "notArranged"; backgroundColor = "0.5 0.5 0.5";}'
```

## I18n

```sh
defaults write com.apple.Maps AppleLanguages '(zh-CN)'

defaults delete com.apple.Maps AppleLanguages
```

macOS 允许在运行应用程序时向其传递特定参数，其中，`-AppleLanguages` 参数就是用来控制应用程序的语言的。
要知道一个应用都支持哪些界面语言，可以在 Finder 中找到该应用，点击右键选择显示包内容，然后查看 /Contents/Resources 目录下以 .lproj 结尾的语言文件目录；.lproj 之前的部分就是各语言对应的地区代码

```sh
# 以简体中文界面启动
open -a /System/Applications/Maps.app --args -AppleLanguages '(zh-CN)'

# 以英文界面启动
open -a /Applications/Safari.app --args -AppleLanguages '(en)'

open -na "Chrome" --args --incognito
```

## BundleIdentifier

```sh
mdls -name kMDItemCFBundleIdentifier /Applications/Safari.app
# kMDItemCFBundleIdentifier = "com.apple.Safari"

osascript -e 'id of app "Finder" '
# com.apple.finder
```

---

Ref:

https://sspai.com/post/44536
Docker環境でVue.jsを触ってみる。

# はじめに
今回は、Vue.jsの練習を踏まえてDockerで開発環境を作成しようと思い作成しました。


## 環境
* Node.js - v22.9.0
* Vue3

## 事前準備
```
$ mkdir docker_vue
$ cd docker_vue
$ touch Dockerfile
```

###### Dockerfile編集
```Dockerfile:Dockerfile
ベースイメージの指定
FROM node:22.9

Vue CLIをグローバルにインストール
RUN npm install -g @vue/cli

作業ディレクトリの作成
WORKDIR /app

プロジェクトを自動生成（デフォルト設定で）
RUN vue create vue_practise --default

作成されたプロジェクトに移動
WORKDIR /app/vue_practise

依存関係をインストール
RUN npm install

アプリが使用するポートを開放
EXPOSE 8080

アプリを実行するコマンド
CMD ["npm", "run", "serve"]
```

## ビルドと実行
```
$ docker build -t vue_practise .
$ docker run -p 8080:8080 vue_practise
```

<details><summary>補足(docker run)</summary>

```
docker run -v $(pwd)/vue_practise:/app/vue_practise -p 8081:8080 -it vue_practise
```
こちらにすると、ホストとコンテナ間でファイル共有ができて、
開発する際に、ファイルをリアルタイムで変更できる。

</details>

### 動作確認
プロジェクトが動作しているかを確認する。
**http://localhost:8080**
[![Image from Gyazo](https://i.gyazo.com/8998c970aa4b282ef365bb450a35f6d7.png)](https://gyazo.com/8998c970aa4b282ef365bb450a35f6d7)


## プロジェクトファイルをコピー
現在、Dockerfile内で **vue create** コマンドを使ってVue.jsプロジェクトを自動生成したため、プロジェクトはコンテナ内部で作成されています。そのため、ホストの作業ディレクトリには、生成されたプロジェクトファイルが表示されない状態です。
そのためにホストでも表示させるためにコピーをします。
```
$ docker ps
```
> これで出てきたコンテナIDをコピーする。

```
$ docker cp <コンテナID>:/app/vue_practise ./vue_practise
```
> <コンテナID>こちらにIDを打つ

これで表示されるようになりました。
```
vue_practise/
├── node_modules/
├── public/
├── src/
│   ├── assets/
│   ├── components/
│   ├── App.vue
│   └── main.js
├── package.json
├── Dockerfile
└── ...
```

### 補足
起動する時に毎回↓のコードを打つのは、面倒いと思ったので、Dockerfileと同じ直下の所に、
docker-compose.ymlを作成する。
```docker-compose.yml:docker-compose.yml
version: '3'
services:
  app:
    build: .
    ports:
      - "8080:8080"
    command: npm run serve

```
> もしまだイメージをビルドしていない場合、またはビルド時に新しい変更を反映させたい場合は、ビルドの設定を書く.

### 最後に
わざわざ、コピーしなくてもDockerfileで書けるのかどうにかしたらできるかと思いますが、わからなかったのでこのやり方でした汗
まだDocker環境も慣れていないので、
もっと簡単な方法は、あるかと思います。その時は、教えていただきたいです。
Max Poolingのメリット

## Max Poolingのメリット

1. **情報量をなるべく失わずに圧縮**  
   Max Poolingを使用することで、重要な特徴を残しつつデータサイズを小さくすることが可能です。これにより、計算負荷を減らしつつ、画像や特徴マップの本質的な情報を保持できます。

2. **平行移動に対する頑健性（Robustness）**  
   平行移動に対する頑健性とは、データがわずかに変動しても、結果や出力に大きな影響を与えない性質を指します。Max Poolingは、画像が少し平行移動しても、プールされる最大値が大きく変わらないため、この特性を持ちます。

3. **パラメータ数の削減**  
   Max Poolingはパラメータを持たないため、畳み込み層などの後に使用することで、全体のネットワークのパラメータ数を削減できます。これにより、計算資源を節約しつつも、精度を維持することが可能です。

---

### 参考動画
- [Max Poolingの解説動画](https://youtu.be/MLixg9K6oeU?si=qQi4BFhtwIutHBti)
numpy arrayの文字列化でハマった話

# numpy arrayをlist経由で文字列化する理由

Python 3.8+NumPy 1.XからPython 3.10+NumPy 2.Xに移行する時の話です。一般にはあまりやらないことだと思うのですが、numpy arrayをあえてPythonビルトインの`list`にキャストして使いたい、という場面が時々あります。重宝していたのが**numpy arrayの文字列化**の時です。numpy arrayを直接文字列化すると、スペース区切りで要素が並んでしまって使い勝手が悪かった一方で、`list`を文字列化するとカンマ区切りで要素をリストしてくれました。少なくともPython 3.8+NumPy 1.Xの世界では。

```python3.8
>>> import numpy as np
>>> a = np.arange(10)
>>> print(a)
[0 1 2 3 4 5 6 7 8 9]
>>> print(list(a))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

# Python 3.10 + NumPy 2.X への移行

このような、`print(list(a))`みたいなコードを含むモジュールをそのままPython 3.10+NumPy 2.Xに移行すると、大変なことになります。

```python3.10
>>> import numpy as np
>>> a = np.arange(10)
>>> print(a)
[0 1 2 3 4 5 6 7 8 9]
>>> print(list(a))
[np.int64(0), np.int64(1), np.int64(2), np.int64(3), np.int64(4), np.int64(5), np.int64(6), np.int64(7), np.int64(8), np.int64(9)]
```

Python 3.8までは、`0`のようにただ数値だけが表示されていたのが、どういうわけか型情報まで表示してしまいます。親切心からの変更なのかもしれませんが、困ったことになりました。

# 正しい文字列化のお作法

numpy arrayを文字列化するには、`numpy.array2string`を使うのが正解だと思われます。

[numpy.array2string - NumPy API reference](https://numpy.org/doc/stable/reference/generated/numpy.array2string.html)

`separator`に`', '`を指定すると、期待した結果が得られるようになりました。

```python3.10
>>> import numpy as np
>>> a = np.arange(10)
>>> print(np.array2string(a, separator=', '))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

`list`を経由するみたいな安易な方法を見つけてしまう前に、API referenceを読むべきでした。

**2024/9/24 追記**

`np.ndarray.tolist`もこの用途に適していることがわかりました。

[ndarray.tolist - NumPy API reference](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.tolist.html#numpy.ndarray.tolist)

ドキュメントによると、リスト変換時に各要素を**元の型になるべく近いビルトインの型**に変換してくれます。この性質により、文字列化したときに目的の出力が得られます。

```python3.10
>>> import numpy as np
>>> a = np.arange(10)
>>> print(a.tolist())
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

どちらかというと`array2string`よりも`tolist`の方がいいかもしれません。理由は、`np.array2string`は「気が利きすぎる」のです。問題となるのは長大なリストを取り扱う場合で、巨大な文字列が生成されるのを避けるために間の要素が省略されてしまいます。あと、各要素に割り当てる文字数も自動調整されます。

```python3.10
>>> import numpy as np
>>> a = np.arange(10000)
>>> print(np.array2string(a, separator=', '))
[   0,    1,    2, ..., 9997, 9998, 9999]
```

また、１行の長さが一定の文字数を超えると改行が入ります。

```python3.10
>>> import numpy as np
>>> a = np.arange(1000000000, 10000000001, 1000000000)
>>> print(np.array2string(a, separator=', '))
[ 1000000000,  2000000000,  3000000000,  4000000000,  5000000000,
  6000000000,  7000000000,  8000000000,  9000000000, 10000000000]
```

`threshold`や`max_line_width`パラメータに`sys.maxsize`を設定することでこれらの挙動を無効化することはできますが、少なくとも上記のユースケースではシンプルに`tolist`を使う方がベターかと思いました。

もちろんこれはユースケースに依存する話で、`array2string`の親切さが身に染みる場合もあるかと思います。用途に応じて使い分けるようにしたいと思います。
AWS NAT Gatewayメモ

AWS NAT Gatewayは、プライベートサブネット内のリソースがインターネットにアクセスできるようにするためのネットワーキングサービスです。これにより、外部からの直接アクセスを許可することなく、インターネットへ接続できるようになります。

### NAT Gatewayの主な特徴

1. **インターネットアクセスの許可**:
   - プライベートサブネット内のリソース（例: EC2インスタンスなど）は、直接インターネットにアクセスできませんが、NAT Gatewayを通じてインターネットに接続し、ソフトウェアのアップデートや外部APIへのアクセスを行うことができます。
   - 外部からはプライベートサブネットのリソースにアクセスできないため、セキュリティを確保しつつインターネットアクセスが可能です。

2. **スケーラビリティ**:
   - AWS NAT Gatewayは自動的にスケールします。トラフィック量が増加しても、手動でリソースを追加する必要がなく、負荷に応じてスループットが調整されます。

3. **管理不要**:
   - NAT GatewayはAWSがフルマネージドで提供するサービスです。そのため、サーバーの管理やメンテナンスを行う必要がなく、簡単にセットアップできます。

4. **高可用性**:
   - NAT Gatewayは、設置された各アベイラビリティゾーン内で自動的に冗長性が確保され、高い可用性を提供します。

5. **料金体系**:
   - 使用する帯域幅に応じた課金が発生します。また、NAT Gateway自体に稼働している時間ごとに費用が発生します。

### NAT Gatewayの利用方法

- **プライベートサブネットからのアウトバウンドトラフィック**:
  - プライベートサブネット内のEC2インスタンスが、パッチのダウンロードや外部サービスにアクセスする必要がある場合、インターネットゲートウェイを介さずにNAT Gatewayを通じてアクセスできます。
  
- **パブリックサブネットとの連携**:
  - NAT Gateway自体はパブリックサブネットに配置され、プライベートサブネットからのリクエストを受け取ってインターネットにルーティングします。プライベートサブネットのルートテーブルにNAT Gatewayのエントリを追加することで、インターネットアクセスが可能になります。

### 利用例

1. **セキュリティの強化**:
   - プライベートサブネット内のリソースはインターネットから隔離されているため、セキュリティが向上しますが、NAT Gatewayを使うことで外部へのアウトバウンド接続は可能です。

2. **システムアップデートやAPIアクセス**:
   - ソフトウェアのアップデートや外部のサービスへのアクセスが必要な場合でも、インバウンドのアクセスを遮断したままインターネットに接続できます。

3. **アーキテクチャ設計**:
   - プライベートサブネットを利用したアーキテクチャを設計する際に、インターネットへの接続が必要なケースでよく使われます。

NAT Gatewayを利用することで、セキュアかつ効率的にインターネットへのアウトバウンド接続を実現でき、AWS環境でのネットワーク設計が簡素化されます。
3D プリントではどのようなプロセスが使用されますか?

近年、3D プリンティングおよび 3D スキャン技術が急速に発展し、プロトタイプの製造、生産処理、およびパーソナライズされたカスタマイズのための重要なツールとなっています。 3D スキャンを通じて、デザイナーやエンジニアはオブジェクトの 3 次元データを迅速に取得し、3D プリント用の正確なモデル サポートを提供できます。医療分野の精密機器から建設業界の革新的な構造物まで、3D プリントは多くの業界の生産方法を変えています。 3D プリンティングの応用シナリオをより深く理解するには、そのさまざまなプロセスと特性を深く調査する必要があります。

![80e436a076f0290f326779b075bf0e10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/eab555fe-bd90-b2eb-80e0-b8dee7f7167c.png)
https://www.revopoint3d.com/collections/3d-scanners
1. 溶融堆積モデリング (FDM)
溶融堆積モデリング (FDM) は、最も一般的な 3D プリント プロセスの 1 つです。 FDM テクノロジーは、熱可塑性材料を加熱して溶かし、層ごとに堆積させて固体構造を形成します。このプロセスは、ラピッド プロトタイピング、特にプラスチック部品の製造に広く使用されています。 FDM プリンタで使用される材料には通常、PLA、ABS、ナイロンなどの熱可塑性ポリマーが含まれます。 FDM 印刷プロセスはシンプルで低コストであるため、教育モデル、機能プロトタイプ、家庭用品の製造によく使用されます。
利点:
低コストで家族や小規模スタジオに最適
印刷材料が多様で入手しやすい
シンプルなプロセス、操作とメンテナンスが簡単
制限：
印刷面には層がある場合があり、後処理が必要になります。
プリントヘッドの精度により制限があり、極めて高精細な印刷を実現するのは困難です

2. 光造形(SLA)
光造形 (SLA) 技術は、紫外線レーザーを使用して感光性樹脂を層ごとに固めることにより、高精度の 3D モデルを生成します。 SLA は FDM よりも滑らかで詳細なプリントを作成できるため、歯科、ジュエリー デザイン、精密プロトタイピングなど、正確な詳細が必要な業界で広く使用されています。 SLA は通常、UV 光にさらされると硬化する液体樹脂材料を使用します。
利点:
複雑な細部と滑らかな表面を高精度で再現
精密モデルや機能的なプロトタイプの製造に最適
制限：
材料費が高くなる
最終的な結果を得るには後処理（洗浄や二次硬化など）が必要です
印刷サイズは通常小さく、プリンターの構造によって制限されます

![55a32dfe36e25af44a12a514c98b9530.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/1eea82be-707e-1c14-0901-e361db333517.png)
3. 選択的レーザー焼結 (SLS)
選択的レーザー焼結 (SLS) は、レーザーを使用して粉末材料 (通常はナイロンまたはその他のポリマー) を焼結するプロセスです。レーザービームは粉末を層ごとに溶かして結合させ、最終的には強力で機能的な部品を形成します。 SLS テクノロジーは、複雑な形状の物体の製造に最適であり、高強度のコンポーネントを製造できます。
利点:
サポート構造が不要で、複雑な設計に適しています
プラスチック、金属、セラミックスなど幅広い素材が使用されています
得られる部品は高い強度と耐久性を備えています
制限：
特に金属材料を使用する場合、コストが比較的高くなります。
印刷面が粗いため後処理が必要

 4.マルチジェットメルティング（MJF）
マルチジェット フュージョン (MJF) プロセスは SLS に似ていますが、複数のノズルを通じて同時に動作し、溶融したバインダーを粉末材料の層にスプレーし、熱源を通して固化させます。この技術はシリーズ部品の製造に最適であり、非常に高い精度と強度を実現します。 MJF は、大量生産や迅速な製造のための産業用途でよく使用されます。
利点:
大量生産に適しており、生産効率が高い
高精度で良好な表面仕上げ
高強度で耐久性のある部品を作成する能力
制限：
設備コストは高く、主に工業生産で使用されます。
表面品質を最適化するには大規模な後処理が必要

 5.金属3Dプリンティング（DMLS/SLM）
金属 3D プリンティングでは、主に直接金属レーザー焼結 (DMLS) または選択的レーザー溶解 (SLM) テクノロジーが使用されます。どちらもレーザーを使用して金属粉末を層ごとに溶かし、固体の金属構造を作成します。 DMLS および SLM プロセスは、航空宇宙、医療機器、自動車産業で広く使用されており、高強度で複雑な形状の金属部品を印刷できます。
利点:
高強度・高精度の金属部品の製造に最適
複雑な金属形状を印刷し、材料を節約できる
高性能アプリケーション シナリオ (航空、医療など) で優れたパフォーマンスを発揮
制限：
設備や材料費が非常に高い
印刷プロセスは複雑で、経験豊富なオペレーターが必要です

6。 デジタル ライト プロセッシング (DLP)
デジタル ライト プロセッシング (DLP) テクノロジーは、光源を使用して液体樹脂を硬化させるという点で SLA に似ていますが、硬化がより速くなります。 DLP では、デジタル プロジェクターを使用して樹脂の表面に光を当て、点ごとにスキャンするのではなく、層全体を一度に硬化します。 DLP プロセスは、高精度かつ迅速な生産を実現でき、非常に平滑な表面が必要なモデルの作成に特に適しています。

利点:
SLAと比較して印刷が高速化
小型・高精度モデルの製作に最適
高い表面仕上げとクリアなディテール
制限：
印刷サイズが小さく、小さな部品の製造に適しています。
主に樹脂を使用し、材料の選択肢が限られている
例外の取説

## おことわり
* 今日の内容は・・・批判ではありません
* 見直しの機会ととらえていただきたいです
* 諸説あるトピックだし、人によっては本日の内容は極端に思えるかもしれませんが、まずはフラットな気持ちで聞いて下さい

----
## 例外とは？
- プログラムで想定外の事態が起きたときに送出される
- 以降の処理を中断し、特別な処理フローが開始される
- 姿を変えたGoto

---
## 特別な処理フローって？
- あるコードで例外が起きるとスタックフレームをさかのぼっていく
- どこかスタックフレームでcatchされたら、その中catch節の処理が実行される
- 最終的には処理系がcatchして処理される
  → たいていは標準出力にスタックフレームや例外情報を出力して処理が停止する

----
## そもそもの例外の考え方
- 異常な事態である
- 発生しないようにプログラムを書くのが理想
- それでも発生したら、例外に関する情報をなるべく失わないようにする

デバッグに役立つ情報が詰まっている、くらいのとらえ方がちょうどいい。

----
## それでも例外は起きる！どうする？

**catchしない！**

----
## catchしない！！

----
## catchしない！！！

----
## catchしない理由
- catchしただけで失われる情報がある（根本的な原因箇所）
- catchしたとてやれることは少ない

----
## やりがちな過ち

- 邪悪度 S：catchして何もしない
```js
try {
  (例外が起きる処理)
} catch (ex) {
}
```
```js
try {
  (例外が起きる処理)
} catch (ex) {
  return null;
}
```

- 異常事態が起きたこと自体を握りつぶす、最も邪悪なコード
- 知らなかったでは済まされない！
- 静的コードチェックなどで機械的に防ぐことが可能

----
## やりがちな過ち

- 邪悪度 A：ログ出すだけ
```js
try {
  (例外が起きる処理)
} catch (ex) {
  logger.error(ex);
  return null;
}
```
- 握りつぶすほどではないが、ログ見ないと例外に気づけない、やはりかなり邪悪なコード

----
## やりがちな過ち

- 邪悪度 C：ログ出してリスロー
```js
try {
  (例外が起きる処理)
} catch (ex) {
  logger.error(ex);
  throw ex;
}
```
- 必要ない

----
## 他にもこんなアンチパターン
- 全メソッドにtry～catchを書く
  個人的には、このスタイルが必要以上にロジックを複雑にしているケースがとても多いように思う

----
## catchを書かないといけないケース
- 誰もcatchしなかった例外を１カ所で処理するケース
　通常は、catchはこのケースのみで済むようにするべき
- 特殊なトランザクション要件

----
## 最後に
- try～catchを疑え！！！！
- めったに書くことはない（例外：Java）
- 書かざる得ない、という判断を１人で下してはならない
- もし本当に書かざるを得ない場合は、慎重に実装し、しっかりとテストし、レビューしてもらい、想定通り動作するかよく確認すること

----
安易なcatch、事故のもと！
公開鍵認証についてまとめてみる

sshについて調べている過程で、
公開鍵認証についての理解が曖昧な事に気がついたので、
改めて調べてみたことをまとめる。

## 公開鍵認証とは

**秘密鍵の所有者しか正しい署名が作れない**ことを利用し、
**署名の正しさを公開鍵で検証することでユーザー認証を行う**方法。

署名とは、その**データの内容に関する承認の意志を示すもの**。
署名者が後から**否認することを防止する**ための証拠となる。

#### 公開鍵

署名を検証するために必要となる鍵。
公開鍵は通信相手に予め共有して登録しておく必要がある。
現実世界では、銀行に予め届け出ている印影に相当する。

#### 秘密鍵

署名を行うために必要となる鍵。
秘密鍵は自身で保管し、外部に漏らしてはならない。
現実世界での印鑑に相当する。

### 公開鍵認証の手順

大まかな手順は以下の通り。

1. 秘密鍵を使用して署名を作成する(この時公開鍵を署名に同封する？)
2. 署名を相手に送付する
3. 公開鍵を使用して署名が正しいことを検証する

### 勘違いしていたこと

今まで、公開鍵認証は公開鍵で暗号化したデータを送り、
秘密鍵で暗号化されたデータを復号して暗号化前のデータと一致するかどうかで
認証する方式だと理解していたが、それは**誤り**であることがわかった。

公開鍵認証で使用する**公開鍵・秘密鍵は電子署名に用いる鍵**であって、
**暗号化・複合化に用いる鍵ではない**。

### 参考にしたサイト

https://zenn.dev/isosa/articles/77a70eb84f3ec2

https://qiita.com/angel_p_57/items/19eda15576b3dceb7608#%E5%85%AC%E9%96%8B%E9%8D%B5%E8%AA%8D%E8%A8%BC%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8

https://qiita.com/angel_p_57/items/437ca6235defc938b97d

https://qiita.com/lemiyachi/items/d0bb3ba9fb54ca5a2d8d

https://zenn.dev/tetsu1008/articles/1e3673ca1ece42
[MySQL] exitとquitの違い

# まとめ
`exit`と`quit`はどちらも同じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/8ad236f3-c85a-c2f8-a667-bdfba3263d60.png)


# 参考リンク
- [4.5.1.2 mysql クライアントコマンド](https://dev.mysql.com/doc/refman/8.0/ja/mysql-commands.html)
Databricksアシスタントのクイックフィックスのご紹介

[Introducing Databricks Assistant Quick Fix \| Databricks Blog](https://www.databricks.com/blog/introducing-databricks-assistant-quick-fix)の翻訳です。

:::note warn
本書は著者が手動で翻訳したものであり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# SQLやPythonのエラーを自動で修正

構文の間違い、解決できなかったカラム名、型変換のような一般的かつ単一行におけるエラーを自動で修正するように設計されたパワフルな新機能である[Databricksアシスタントのクイックフィックス](https://docs.databricks.com/ja/notebooks/use-databricks-assistant.html#quick-fix)をご紹介できることを嬉しく思っています。

我々の研究では、エラーの70%は修正のために長ったらしい説明や、ドキュメントの徹底的な調査を必要としないシンプルな間違いであることがわかっています。アシスタントのクイックフィックスによって、あなたのコーディングの効率性を改善するためにAIのパワーを活用することで、あなたのデバッグのプロセスを円滑にするためのより統合されたソリューションを構築しました。

# アシスタントのクイックフィックスの動作原理

アシスタントのクイックフィックスでは、エラー修正を提案するために[Databricksアシスタント](https://docs.databricks.com/ja/notebooks/databricks-assistant-faq.html)を活用していますが、SQLやPythonの記述において頻繁にユーザーが遭遇する特定のエラーをクイックに修正するように最適化されています。重要なゴールは、クイックフィックスが高速であるということです。クイックに提案が表示されるので、キーボードから手を離すことなしに、提案を受け入れることができます。

![](https://www.databricks.com/sites/default/files/inline-images/image1_6.gif?v=1726773432)

# どのようなエラーを捕捉するのか？

アシスタントのクイックフィックスは、特に以下を含む様々なSQLやPythonのエラーを解決することができます:

- 末尾のカンマ
- カラムやテーブル、関数名の打ち間違い
- GROUP BY句の抜け
- 構文エラー
- データ型のミスマッチ(文字列をタイムスタンプにパースするなど)

# キーボードショートカットとUX

我々は、クイックフィックスが可能な限り邪魔にならないように設計しました。1-3秒でインラインで結果を受け取り、受け入れたり(`Cmd+’`)、受け入れ・実行したり(`Cmd+ENTER`)、拒否する(`ESC`)ことができます。

# クイックフィックスの最適化

ユーザーが頻繁に遭遇する一般的なエラーの特定のサブセットにフォーカスするように、クイックフィックスを調整しました。活用したテクニックのいくつかを以下に示します:

- **ファジーマッチング / セマンティック検索:** スペルが間違ったテーブル名やカラム名に対して、リアルタイムで正しいテーブルを特定するために、[Intelligent Search API](https://www.databricks.com/jp/blog/adding-intelligence-to-databricks-search)を活用しています。インテリジェント検索では、適切な結果を得るために最近使用されたテーブルや人気のテーブルを活用します。
- **修正を検証するための後処理:** ユーザーに表示する前に、提案内容が適切なPythonやSQLであることを確実にするために、コードリンター(AntlrとLSP)を通じて生成された修正案を実行します。
- **ナンセンスな修正に対するガードレール:** LLMは時に変数を同じもので置き換えたり(`"A = A"`)、行をコメントアウトしたりするような論理的ではない提案を生成します。提案内容が有用なものになるように、後処理の過程でこれらの修正案を除外します。
- **特定のエラーに対するカスタムの後処理:** `"UNRESOLVED_COLUMN.WITH_SUGGESTION"`のようなエラーにおいては、提案されている修正内容が、関係のないあるいは不適切な修正ではなく、カラム名の未解決の問題に直接対応していることを検証します。
- **SQL vs. Pythonのエラーに対する異なる戦略:** SQLにおいては、リアルタイム検索を用いてテーブル名やカラム名のマッチングのようなスキーマを意識した修正にフォーカスする一方で、Pythonではアクティブなコードの文脈を分析することで、未定義の変数の特定や型のミスマッチの修正を強調しています。

これらの調整を通じて、受け入れ率において以下の増加を認めました:

![Screenshot 2024-09-20 at 14.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/dfbdebb5-a2aa-6b88-2847-77355887e651.png)

これに加え、最適な最大待ち時間、アクティブな提案管理のパターン、キーボードショートカットの最適な実装方法の決定の助けとなった、追加のフィードバックを収集しました。これによって、内部の受け入れ率を25%まで改善することができました。

# 今後の改善

クイックフィックスによってどのようなエラーを自動で解決できるのかに関しての調整を継続していきます。以降のエンハンスでは、複数のエラーを一度に修正、タイピングしている途中でのエラー修正、SQLエディタでのサポート追加などが含まれる予定です。

# すぐにDatabricksアシスタントを試しましょう！

Databricksアシスタントの実際を知るには、データパイプライン、SQLクエリー、データの可視化を構築するために、どのようにアシスタントを活用できるのかを見るためデモ動画をチェックしてください。[データエンジニアのための Databricks Assistant のヒントとコツ](https://www.databricks.com/jp/blog/databricks-assistant-tips-tricks-data-engineers)の記事をチェックして、あなたの開発生産性を増加させるために、どのようにDatabricksアシスタントを活用できるのかを学びましょう。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
E資格合格体験記

# はじめに
　本日、E資格の合格通知が来ました。「受験から3週間以内に通知」とのことだったので、2週間くらいで来るかなと思っていたのですが、まさかの最終日にようやく来ました。
　そこで、他の方が良くやられているように、私もE資格合格までの道のりや勉強方法について、記録を残すことにしました。

 # 忙しい人のための概要
 - 講座の動画は何度も見返せ
 - ゼロつくはやろう。特に2と4がおススメ。できれば1,2,4,5あたりはやりたい
 - 黒本、模試などはたくさん解こう
 - 公式例題は絶対にやろう

# 私の結果
　参考程度ですが、私の成績は数学と深層学習が7割代、機械学習と開発環境の分野が8割以上取れていました。大して高くない数値ですが、7割あれば合格すると言われている試験なので、特に問題なく合格できる程度は取れたと思います。
　~~本当は数学と深層学習こそもっと取りたかったな～~~

 # 私について
- 文系出身です。数学受験ではありましたが、元々は行列などの知識はほとんどない状態でした。
- データサイエンティストとしての業務経験が2年ほど
- 元々微分積分くらいまでの知識しかなかったので、データサイエンティストになる前に、講座などで線形代数の勉強（固有値分解、特異値分解辺りまで）をしました。
- kaggleやSIGNATEはたまにやる程度。小さなコンペ以外での入賞歴はなし
- 個人的に生成AIに興味があってデータサイエンスを始めたので、DeepLearningは元々実装した経験はあった
- 好きな分野は画像生成、因果推論、グラフニューラルネットワーク

 # 試験までに実施したこと
 - まずは認定講座の終了資格を満たすまでひたすら講座受講
     - 私が受講した講座では、講義のほかに、プログラミング演習、プロダクト開発、数学や情報理論などの補講などがあり、終了資格試験で7割以上取れれば終了資格取得、という流れでした。
     - 本当はプロダクト開発もとても勉強になるのでじっくりやりたかったですが、悠長にやっている暇もなかったため、終了のために必要な最低限で済ませました。
 - ゼロつく（『ゼロからつくるDeepLearning』シリーズ）を読んでみる
     - 私の場合、修了試験を受ける段階で、自然言語処理や強化学習分野の細かい部分の暗記が大変になってきて、いっそ自分で実装してしまった方が覚えやすいと思い、取り組みました。
     - 1がDeepLearningの基礎、2は自然言語処理、4は強化学習で5は最近出た生成モデル（拡散モデルなど）についてです。
     - 私の場合、1は半分程度しかしっかり読んでいないのですが、2と4は大変お世話になりました。
     - 2はLSTMやAttentionなど主要な自然言語処理のモデルを実装できますし、実務にも活用しやすかったです。
     - 個人的には4が最高で、他に所有しているどの強化学習の本よりも分かりやすく、体系的に強化学習のモデルについて整理しやすかったです。
     - また、一見あまり関係なさそうな5についても、VAEや拡散モデルなどの生成AIは充分E資格の試験範囲内ですし、VAEの途中の式変形で出てくる、EMアルゴリズムという難しい理論についても理解の助けになりました。
     - よくE資格対策で言及されるのは1,2だと思いますが、個人的には時間の許す限り、4,5も読まれることをおすすめします。
 - 黒本を解いてみる
     - スキルアップNeXTさんが出されている、実質唯一の市販問題集です。
     - 私は講座受講当初から少しづつ進めていきました。時間がなくて1周しかしていないです。
     - 結構深い内容まで解説されているので、知識の深堀りになりました。
 - 模試を解きまくる
     - 試験前1か月間は、受講した講座の模試や、その他一般的に販売されている模試を可能な限り解きまくりました。解説を読むのに時間がかかって、大して多くは解けませんでした。
 - 講座の動画を何度も見直す
     - E資格は試験範囲が広く、数か月の長丁場の闘いになるので、一度講義を視聴してその場では理解できても、試験直前になったらほとんど忘れています。
     - 音声認識分野や距離学習など、初めて知る分野は特に何度も見返しました。
     - GANの種類がとても多かったり、強化学習のモデルがどれがどれだか訳わからなくなったりするので、ひたすら見直していました。
 - 論文も読んでみる
     - こちらはあまり十分な時間が取れなかったですが、黒本を解いていて各モデルの原著論文の内容も出そうだと思ったので、極力有名なモデルの論文は読むようにしていました。
     - 最新の手法について出題される可能性もあるので、LLM、画像生成AIなどについては幅広く情報収集をされるのをおすすめします。（私は全然追えていません(笑)）
 - 公式例題
     - 私は本当の直前に数個解いただけですが、これは絶対にやった方が良いです。
     - 機械学習の分野でも、聞いたことないような、意味不明な手法の問題が出ていたりもするので、やるのとやらないので結構変わると思います。

# 結論
やればできる

　私の場合、半年程度かけてもまだ足りないくらいでしたので、とにかく長い期間、根気よく、コツコツと続けることが大事だと思います。最初は訳が分からなくても、何度も講義を見たり問題を解いている中で、自然に解けるようになります。要するにどれだけやるかの分量の問題だと思います。

 # 今後の抱負
 - せっかく学んだので、グラフニューラルネットワークや深層強化学習などのややニッチな分野をより深く学んでいきたいです。
 - 自然言語処理や画像関係の深層学習モデルを、実務レベルで実装できるように持っていきたいです。

 # おススメの書籍
 - ゼロからつくるDeepLearningシリーズ（1,2,4,5）
https://www.oreilly.co.jp/books/9784873117584/
    - ちなみに気になる3は何かというと、DeepLearningのためのライブラリの作成（あまりE資格対策には関係ない）で内容は結構難しいそうです。
 - 生成DeepLearning
https://www.oreilly.co.jp/books/9784814400751/
     - まずDeepLearningをどのように実装するのか、試してみるのに最適です。私が購入した後に、最近新版が出て、画像生成AIなどさらに内容が充実しています。
- 直感DeepLearning
https://www.oreilly.co.jp/books/9784873118260/
    - こちらも、DeepLearningの実装について慣れるのにとてもおススメです。
    - Tensorflowの書き方も良く身に付きます。

結論：オライリー万歳

以上。
python仮想環境をコピーして別PCで動かそうとしたけど、動かなかった。

テストPCで動かしていたwebアプリを本番PCで動かす。
## 疑問
仮想環境ごと本番PCにコピペすれば、ライブラリのインストールなどを省けるのでは？
## やってみた
### 結論:　仮想環境をコピペするだけではwebアプリは動かない
まず本番PCにテストPCと同じpythonをインストール
そしてテストPCの仮想環境ごとwebアプリを、本番環境にコピペ。

↓これはテストPCの仮想環境のライブラリリスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/f57f8f73-48b8-70de-82cc-741118cb67f4.png)

↓これは本番PCの仮想環境のライブラリリスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/448a45b0-0cba-28f4-947a-12ee25a7f670.png)


仮想環境をコピペするだけでは、本番PCの仮想環境のライブラリはインストールされてませんね。

### つまり:環境をコピーするにはDockerを使いましょう。Dockerの記事も上げます。
### pythonの仮想環境は、ローカルでライブラリ競合がおこさないためのもので、移行作業には使えない。
OneDriveからダウンロードしたZipファイルが解凍できない

## エラー
OneDriveからダウンロードしたZipファイルを解凍しようとすると以下のエラーが出た

フォルダーを開くことができません。圧縮（zip形式）フォルダー [ファイル名] は無効です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656549/5e0ff12c-014e-0e3b-5b65-be0f84ad8296.png)

## 解決方法
環境：Windows11
1. エクスプローラーでzipファイルを右クリック
1. 「その他のオプションを確認」をクリック
1. 「7-Zip」をクリック
1. 「展開…」をクリック
1. 展開先を選択し「OK」をクリック

できた
【flutter】widgetに動きをつけてみた

こんにちは！
今回はflutter_animateパッケージを使用して、widget(画像や文字など)に動きをつけていきたいと思います。
最後まで見ていただけると、嬉しいです！

# 使用パッケージ
https://pub.dev/packages/flutter_animate

# 参考記事
https://blog.flutteruniv.com/package-flutter_animate/

## 実装内容

![Qiita_image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524127/20a48f2e-b9e6-629a-ec02-8ee54c2ec940.gif)


## 実際のコード

```php

GestureDetector(
    onTap: () {},
    child: Center(
      child: Container(
        margin: const EdgeInsets.symmetric(vertical: 15.0, horizontal: 20.0),
        padding: const EdgeInsets.all(5.0),
        height: 130,
        decoration: BoxDecoration(
            borderRadius: BorderRadius.all(Radius.circular(20)),
            color: boxColor),
        child: Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
          Image.asset(imagePick)
              .animate(onPlay: (controller) => controller.repeat())
              .scale(duration: 3.seconds)
              .shimmer(duration: 3.seconds),
          Text(
            titileText,
            style: const TextStyle(
                fontSize: 30.0,
                color: Colors.white,
                fontWeight: FontWeight.w700),
          )
              .animate(onPlay: (controller) => controller.repeat())
              .shake(duration: 3.seconds)
        ]),
      ),
    ),
  )
```

### コードのポイント

#### ・アニメーションの設定
animate()メソッドを使ってアニメーションを設定しています。ここでonPlayコールバックを使用することで、アニメーションが繰り返し実行されるようにしています。
#### ・動きのバリエーション
画像にはscale()メソッドを使って拡大・縮小の動きを、テキストにはshake()メソッドを使って揺れる動きを加えています。これにより、視覚的なインパクトが増し、ユーザーの注意を引くことができます。

#### ・時間の調整
アニメーションの持続時間を3.secondsに設定しており、動きがゆっくりと行われるため、ユーザーにとっても見やすい仕上がりになっています。

# 最後に
このように、flutter_animateを使えば、簡単にダイナミックで魅力的なUIを作成することができます。ぜひ他のウィジェットにもアニメーションを試してみてください！
では、また次の記事で〜！
sentence-transformers を用いた情報検索システムについて


### 開発の動機

社内の規則などを記述した PDF のドキュメント群があり、それを一括して検索できるシステムを作ろうと考えた。

### 処理の手順

#### イントラウェブサイトから PDF ファイルを DL する工程。

今回、ウェブロボットのように、あるドキュメントからその中のリンクをたどって新しいドキュメントをダウンロードすることはしない。与えられた複数の URL の PDF ドキュメントを毎日ダウンロードする。

#### PDF をテキストファイルに変換する工程。

ダウンロードした PDF ファイルをテキストファイルに変換するのには、pymupdf を使う。

#### 変換したテキストファイルを sentence-transformers に読みこませる文章にする工程。

変換したテキストファイルは、一行が文章であったり、言い回しで完結するとは限らない。そこで、PDF から変換したテキストファイルを、spacy と ja-ginza を用いて、一行が文章になるように修正する。

#### テキストファイルを sentence-transformers に読み込ませる工程。

この検索システムは、sentence-transformers を使って、文章あるいは言い回しを vector に変換して登録し、検索文から変換した vector に呼応する文章あるいは言い回しを検索するものである。そのため、最初に文章あるいは言い回しとその vector を登録しておく必要がある。


### プログラム

https://github.com/toshiouchi/information_retrieval_system

### ロボット
決められた PDF を1日ごとにダウンロードして保存し、sentence-transformers に読み込ませるテキストファイルを作る。

#### ウェブ

検索要求を受け付ける。

#### クライアント

ウェブから検索要求を受けとり、検索要求を TCP/IP 通信で サーバーに伝える。

#### サーバー

1日ごとに新しいテキストファイルを読み込み、検索に備える。リクエストが来たら検索を実行し、検索結果を返す。

#### ロボット

決められた PDF をDLし、検索サーバーが読み込めるテキストファイルを作る。
【OCI】BaseDBのOS (Oracle Linux)とDBのバージョンに関する情報まとめ

## はじめに
OCI上のPaaSサービスであるBaseDBのOSとDBのバージョンに関する事項を本記事ではまとめていきます。
本記事の内容は2024年9月時点のものであり、それ以降も内容を保証するものではありません。
>Oracle Base Database Service(BaseDB)は、Oracle Cloud Infrastructure の上で稼働する Oracle Database のPaaSサービスです。
>
>ユーザーはオンプレミスと全く同じOracle Databaseのソフトウェアをクラウド上で利用することができ、引き続きすべてのデータベース・サーバーの管理権限(OSのroot権限含む)およびデータベースの管理者権限を保持することができます。

参照：https://oracle-japan.github.io/ocitutorials/basedb/dbcs101-create-db/
## BaseDBで新規プロビジョニングできるOracle DBのバージョンに関して
>サポートされているOracle Databaseソフトウェアのバージョンを教えてください。
現在、Oracle Database バージョン 19c、21cおよび 23c をサポートしています。

参考：https://www.oracle.com/jp/database/base-database-service/faq/

上記の通り、2024年9月時点では、BaseDBで新規に作成できるデータベースのバージョンは、**19c**、**21c**、**23ai**になります。
BaseDBの場合は、データベースやOSのパッチ適用やアップグレードはお客様管理になるので、Lifetime Support Policyなどを見て、推奨バージョンにお客様自身で更新していく必要がございます。

## BaseDBの新規プロビジョニングにおけるOS (Oracle Linux)のバージョンに関して
>The DB systems will be provisioned with Oracle Linux 8 (OL8) for Oracle Database versions 23ai, 21c, and 19c with 23.4.0.24.05, 21.12.0.0, 19.21.0.0, and later release updates (RU) only. All other prior Oracle Database versions will be provisioned with Oracle Linux 7 (OL7).

参考：https://docs.oracle.com/en/cloud/paas/base-database/create-dbs-new/#articletitle

BaseDBを新規プロビジョニングする際は、選択するDBのバージョンによって、Oracle Linuxのバージョンは異なります。
Oracle Databaseのバージョンが23.4.0.24.05、21.12.0.0、19.21.0.0およびそれ以降のRelease Update (RU)に対しては、Oracle Linux 8 (OL8) でプロビジョニングされます。
その他の以前のOracle Databaseのバージョンを選択する際は、すべてOracle Linux 7 (OL7)でプロビジョニングされます。
Oracle Linuxのバージョンのサポート状況に関しては、以下をご参照ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/bcefb4d8-64ed-0a08-d5fb-704284bc3777.png)

参考：https://www.oracle.com/jp/a/ocom/docs/elsp-lifetime-069338.pdf

## 参考
以下リンクを参照することで、BaseDBのOS・DBのバージョンのRelease状況を確認することができます。

https://docs.oracle.com/ja-jp/iaas/base-database/doc/whats-new-oracle-base-database-service.html
input[type="file"]の「ファイルを選択する」ボタンだけ非表示にするCSS

`input[type="file"]`にスタイルをつける方法は色々と紹介されていますが、「ファイルを選択する」ボタンだけを非表示にする方法です。
未選択時のテキストと選択後のファイル名のテキストは残ります。

```css
input[type="file"]::file-selector-button {
    appearance: none;
    visibility: hidden;
    margin: 0;
    padding: 0;
    border: 0 none;
    width: 0;
    height: 0;
    font-size: 100%;
    line-height: inherit;
}
```

`display: none;`で済ませられるかと思いましたが、Safariだけファイル名のテキストを巻き込んで消えてしまったため、個別のプロパティで片っ端からサイズを0にしています。

また、font-sizeやline-heightがファイル名のテキストの位置に影響するため、それぞれを親（`input[type="file"]`）から継承するような記述をしています。

この辺、ブラウザの開発ツールで要素を選択するとShadow DOMになっていたり、それだけでは説明できないバグっぽい挙動があったりしてスタイル付けが難しいです。

今回はできるだけ、今後ブラウザ側の変更があっても成立しそうなスタイルで対応しました。

:::note info
ちなみにファイル名のテキスト部分へのスタイルは`input[type="file"]`で指定します。
未選択時のテキストも色などは同様ですが、**`::placeholder`や`input:placeholder-shown`は効かない**ので未選択時のテキストを制御したい場合は別の要素でUIを作って見た目をあてることになります。
:::
IPS（Intrusion Prevention System）とIDS（Intrusion Detection System）メモ

IPS（Intrusion Prevention System）とIDS（Intrusion Detection System）は、ネットワークやシステムのセキュリティを強化するための技術ですが、それぞれ異なる役割を果たします。

### IDS（侵入検知システム）

- **役割**: ネットワークやシステムの活動を監視し、侵入や異常な行動を検出します。
- **機能**:
  - トラフィックを分析し、悪意のあるアクティビティやポリシー違反を検出。
  - 通常はアラートを生成し、管理者に通知しますが、自動的に対処することはありません。
- **種類**:
  - **ネットワークベースIDS（NIDS）**: ネットワークトラフィックを監視。
  - **ホストベースIDS（HIDS）**: 特定のデバイスやサーバー上で動作し、ログやシステムの変更を監視。

### IPS（侵入防止システム）

- **役割**: IDSの機能を含みつつ、侵入を防ぐためのアクションを実行します。
- **機能**:
  - トラフィックをリアルタイムで分析し、疑わしいアクティビティを検出した場合に、自動的にそのトラフィックをブロックしたり、遮断したりします。
  - 侵入の脅威からネットワークを守るための防御手段を提供します。
- **種類**:
  - **ネットワークベースIPS（NIPS）**: ネットワーク全体のトラフィックを監視し、攻撃を防止。
  - **ホストベースIPS（HIPS）**: 特定のホストで動作し、脅威を防止。

### 主な違い

- **アクション**: IDSは警告を発するだけですが、IPSは自動的に攻撃を防ぐアクションを取ります。
- **設置場所**: IDSは通常、ネットワークトラフィックのモニタリングポイントに設置され、IPSは通常、ファイアウォールやルーターの前に配置されることが多いです。

これらのシステムは、組織のセキュリティ戦略において重要な役割を果たしており、サイバー攻撃や不正アクセスから保護するために広く使用されています。
初心者エンジニアによるAndroidアプリ開発日記①

# まえがき
2024年4月に某IT企業へ新卒入社した筆者。研修期間を終え、本配属となったチームで任されたのはモバイルアプリの保守開発だった。Webアプリなら研修で作った経験があるが、モバイルアプリに関しては一切の知見がない。そんなある日、上司から自主学習の一環として簡単なAndroidアプリを作ってみてはどうか、という提案を受ける。この記事は、そんな筆者の学習の記録である。

# 目次
* [概要](#概要)
* [作るもの](#作るもの)
* [開発環境](#開発環境)
* [終わりに](#終わりに)

---

## 概要
この記事では、学習内容を記録する以前に必要な前提（作るもの、開発環境）を記載する。

## 作るもの
**国旗当てクイズアプリ**
成果物のイメージは下記の通り

* 国旗画像を画面上部に表示させ、4択の選択肢を表示させる
* 問題は間違えるまで出題される
* 間違えた段階で、不正解画面と正解数を表示させる

## 開発環境
* OS：Windows11
* 言語：Kotlin
* エディタ：AndroidStudio

>AndroidStudioのエミュレータにより動作確認が可能であるため、Androidの実機はあるとよいが必須ではない。
<font color="Red">※ただしリリースには実機が必要っぽいです：[参考](https://support.google.com/googleplay/android-developer/answer/14316361?hl=ja#zippy=)</font>

## 終わりに
具体的な学習内容は、2回目以降にまとめていければと思います。

次回は[こちら](https://qiita.com/hukusima65/items/c3ac91be9fb4a34ee6a0)

### 参考
* [MIXI研修資料](https://mixi-developers.mixi.co.jp/23-technical-training-20a6f610140c#101c)
AWSネットワーク構築

# ネットワークの構築基本

## 操作
1. VPC作成
1. サブネット作成
1. ルーティング設定（インターネットに接続）
   - インターネットゲートウェイ作成。VPCにアタッチ
   - ルートテーブル作成。サブネットに紐づけ、ルート追加



## メモ
基本、デフォルトで用意されたものは使用しない
新しく新規作成したものを使用していく

0.0.0.0/0をルートテーブルに追加→インターネットへ接続できるようにする

サブネットごとにルーティングの設定
AWSではルータは明示的に設置しない。ルートテーブルを作成すると暗黙的に動く


ルートテーブル：
localは自身のネットワーク
書かれていない通信は破棄

## 設計ポイント
- VPC
プライベートIPアドレス（仮想のプライベートNW空間を作成するから）
IPアドレスは大きめに設定：変更不可だから /16推奨
オンプレとIPアドレスが重複しないように設定
異なるシステムの場合はアカウントを分ける

- サブネット
必要なIPアドレス数　/24が一般的
ルーティングとアベイラビリティゾーンを基準に行う
AWS CDK基礎

# AWS CDK

[このページ](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/home.html)の解読

> AWS Cloud Development Kit (AWS CDK) は、コードでクラウドインフラストラクチャを定義し、  AWS CloudFormationを通じてプロビジョニングするためのオープンソースのソフトウェア開発フレームワークです。

AWS CDK は、主に 2 つの部分で構成されています。
> 

- aws クラウド デベロップメント キット
- インフラを定義するやつ
- AWS CloudFormationでプロビジョニングする
    - AWS CloudFormation: yumlファイルでインフラを定義するやつ
    - プロビジョニング：コンピュータリソースを準備すること

# AWS CDK の2 つの構成

## [**AWS CDK コンストラクトライブラリ**](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/constructs.html)

> コンストラクトと呼ばれる、事前に記述されたモジュール式で再利用可能なコードのコレクションで、インフラストラクチャを迅速に開発するために使用、変更、統合できます。 コンストラクトライブラリの目的は、 AWS CDK でアプリケーションを構築するときに AWS サービスを定義して統合するために必要な複雑さを減らすことです。
> 
- コンストラクト：ある機能の細かい設定？
- コードのコレクション：つまりはライブラリ
- 要はインフラを作るライブラリ？
    - レイヤーがあるらしい…

## [**AWS CDK コマンドラインインターフェイス (AWS CDKCLI）**](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/cli.html)

> CDKアプリケーションを操作するためのコマンドラインツール。CDK CLI を使用して、 AWS CDK プロジェクトを作成、管理、デプロイします。CDK CLI は CDK Toolkit とも呼ばれます。
> 
- dockerみたいにcliがある感じ？

> AWS CDK は、TypeScript、JavaScript、Python、Java、C#/.NetおよびGoをサポートします。これらのサポートされているプログラミング言語のいずれかを使用して、[コンストラクト](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/constructs.html) と呼ばれる再利用可能なクラウドコンポーネントを定義できます。これらをスタックと[アプリケーション](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/apps.html) に[まとめて構成します](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/stacks.html)。次に、CDKアプリケーションを にデプロイ AWS CloudFormation して、 リソースをプロビジョニングまたは更新します。
> 
> 
> ![AppStacks.png](https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/images/AppStacks.png)
> 

- スタック:実行できるコードの塊？
- アプリ:実行できるコードの塊が集まってサービスになる？
[TensofFlow + Android] 姿勢推定デモアプリを動かす

# 概要
こちらのデモのAndroid版が動かなかったため修正手順メモとして記事化しました。

ポーズ推定 
https://www.tensorflow.org/lite/examples/pose_estimation/overview

#### ざっくり原因と解消方法
モデルのダウンロードリンクが変更されたことでエラーが発生していたため、
ダウンロードを手動で行って所定のフォルダに配置したところ動きました。

## Android Studioインストール
https://developer.android.com/studio

## Tensorflowのソースダウンロード

```
git clone https://github.com/tensorflow/examples.git
```

## 実行
Android Studioでクローンしたプロジェクトの中の姿勢推定アプリを開く
```
\examples\lite\examples\pose_estimation\android
```
プロジェクトが開いたら再生ボタンでRunする

実行できない場合は上部バーのメニューからSync Project with Gradle Filesを実行するか、Ctrl + Shift + o を実行する

Runすると以下のエラーが発生する
```
Caused by: : Can't get https://tfhub.dev/google/lite-model/movenet/singlepose/lightning/tflite/float16/4?lite-format=tflite to C:\各自のパス\examples\lite\examples\pose_estimation\android\app\src\main\assets\movenet_lightning.tflite
```

## モデルダウンロード
エラーメッセージ内のリンクにアクセスする

上記のエラーの場合は https://tfhub.dev/google/lite-model/movenet/singlepose/lightning/tflite/float16/4?lite-format=tflite

ページ内のFile Explorerから`4.tfile`をダウンロードできるので探してダウンロード

ダウンロードした`4.tfile`を`movenet_lightning.tfile`にリネームする
(エラーメッセージ内で書かれているファイル名)

リネームしたファイルを`\examples\lite\examples\pose_estimation\android\app\src\main\assets`配下に配置する

同様の手順をエラーが出ているほかのファイルでも実施する

- movenet_multipose_fp16.tflite
- movenet_thunder.tflite

## ソース修正
手動でダウンロードを行ったのでビルドタスクからダウンロードを除外する

Android Studioで`/Gradle Scripts/build.gradle(Module:app)`を開く

38行目をコメントアウト
```
// apply from:"download.gradle"
```

## 実行
`Sync Project with Gradle Files (Ctrl+Shift+o)`実行後にRun
無事動かすことができました。

![コメント 2024-09-20 114620.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032663/ce58fc89-29f8-edf4-53ae-73b147c58ce3.png)



※デフォルトだとエミュレータ内のカメラになってしまうのでこちらを設定しました。
https://note.com/danchi_kun/n/n8594179e5b00



## 備考
モデルダウンロードの手順について、手動でやるよりもdownloadタスク内でやったほうがいいと思いますが、知識がなくてできませんでした。

tar.gzの形式でならリンクからファイルを落とせるようなので、ダウンロードリンクを変更しtar.gzの解凍とリネームをdownload.gradleに書くのが理想だと思います。