OmniAICreator/Qiita-1.07M huggingface dataset:
[Go言語]Windows環境におけるOpenAPIによるGoコード自動生成方法 メモ


## 概要

- Windows環境においてOpenAPI Generatorを用いたGoコード生成方法についてメモする。

## 手順

### Scoopインストール

Windows用パッケージマネージャー`Scoop`をインストールする。

```shell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
```



### OpenAPI Generatorインストール

OpenAPI Generatorをインストールする。

```shell
scoop install openapi-generator-cli

scoop bucket add java
scoop install openjdk
```



### テスト用OpenAPI yaml(petstore.yaml)の取得

* PetstoreのOpenAPI仕様ファイル（`petstore.yaml`）をダウンロードする。

```powershell
Invoke-WebRequest  https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/examples/v3.0/petstore.yaml -OutFile petstore.yaml
```



### コード生成

```shell
openapi-generator-cli generate -i petstore.yaml -g go-server -o ./go_openapi
```

※`-i` : API定義ファイルを指定する

※`-g` : 生成するコードの言語を指定する

※`-o` : 生成されたコードを保存するディレクトリパス



以下のような形でGoコードが自動生成される。

```
go_openapi
│  petstore.yaml
│
└─go_openapi
    │  .openapi-generator-ignore
    │  Dockerfile
    │  go.mod
    │  main.go
    │  README.md
    │
    ├─.openapi-generator
    │      FILES
    │      VERSION
    │
    ├─api
    │      openapi.yaml
    │
    └─go
            api.go
            api_pets.go
            api_pets_service.go
            error.go
            helpers.go
            impl.go
            logger.go
            model_error.go
            model_pet.go
            routers.go
```



### コード修正

自身の環境に合わせてコードを修正する。

* `main.go`

  ```go
  /*
   * Swagger Petstore
   *
   * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
   *
   * API version: 1.0.0
   * Generated by: OpenAPI Generator (https://openapi-generator.tech)
   */
  
  package main
  
  import (
  	"log"
  	"net/http"
  	
      // 変更箇所(上記コマンドと同じディレクトリパスを指定して自動生成した場合は下記のパスとする) 
  	// openapi "github.com/GIT_USER_ID/GIT_REPO_ID/go"
      openapi "go_openapi/go"
  )
  
  func main() {
  	log.Printf("Server started")
  
  	PetsAPIService := openapi.NewPetsAPIService()
  	PetsAPIController := openapi.NewPetsAPIController(PetsAPIService)
  
  	router := openapi.NewRouter(PetsAPIController)
  
  	log.Fatal(http.ListenAndServe(":8080", router))
  }
  
  ```

  

* `go.mod`

  ```
  // module github.com/GIT_USER_ID/GIT_REPO_ID
  module go_openapi
  
  // go 1.18
  go 自身の環境のGoバージョン
  
  require github.com/gorilla/mux v1.8.0
  ```

  

* コード修正内容を適用する

  ```shell
  go mod tidy
  ```

  

  

## 動作確認

* APIサーバーを起動する。

  ```shell
  go run main.go
  2024/02/10 10:12:27 Server started
  ```

* 下記URLにブラウザからアクセスする。

  <http://localhost:8080/v1/pets>

  ※"ListPets method not implemented"と表示される。



## 参考情報

* [CLI Installation](https://openapi-generator.tech/docs/installation/)
* [Scoop](https://scoop.sh/)
WordPressの更新方法

## WordPressの更新をしようとしたときftpユーザ名・IDの入力が求められる
このせいでWordPressのアップデートができないことあります。
![Screenshot 2024-02-17 at 17.00.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/7d45e224-b6ae-9fcc-838b-4a1422d717fa.png)
これを強制的に変更する方法としてwp-config.phpに以下のdefine文を追記すれば良いらしいです。
```
define('FS_METHOD','direct');
```
よくssh接続のやり方を忘れてしまう自分のために丁寧に手順を書いておく。
```
ssh -i "作成した公開鍵のPATH" ec2-user@接続先のIPアドレス
```
下の画面が出てきたらssh接続成功
![Screenshot 2024-02-17 at 17.06.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/c16d1813-b85a-d3b2-aa4d-c1299c18ca3e.png)
ファイル操作をするので管理者で入りましょう。
```
sudo -i
```
vimで、/var/www/html/wp-config.phpを開く。
```
vim /var/www/html/wp-config.php
```
vimの操作もよく忘れてしまう自分のためにi:insertをし、define文を書き終えたらescキーを押して、:wq(上書き保存)のルーチンも書いておく。
![Screenshot 2024-02-17 at 17.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153036/7f1003d7-ca91-c572-ca06-e617d9751333.png)
このやり方はセキュリティ上問題があるので、WordPressを更新した後は、define文を#でコメントアウトしておきましょう！
AWS cdkでの自己参照セキュリティグループの作成

aws glueを利用するときに自己参照のセキュリティグループを作成するのですが、
ちょいと詰まったので備忘録として

自己参照のセキュリティグループはセキュリティーグループのソースが自分自身のちょっと変なやつ
参考はこちら
https://qiita.com/kodai_ari/items/33e6f31006277debbf76

こんな感じで書くとエラーになりました。
```
const connectionSG = new ec2.SecurityGroup(this, 'connectionSG', {
    vpc,
    description: 'connectionSG',
    allowAllOutbound: true,
    disableInlineRules: true,
});

connectionSG.addIngressRule(
    ec2.Peer.securityGroupId(connectionSG.securityGroupId),
    ec2.Port.allTcp()
);
```

エラー内容はこちら
```
failed: Error [ValidationError]: Circular dependency between resources
```

多分こちらの記事みたいなことが起きていると思われ、、
https://yomon.hatenablog.com/entry/2019/10/securitygroupselfref

この書き方でもルールの追加なんだからいいじゃんと思うがだめらしい、
正しい書き方はこちら⇩
```
const connectionSG = new ec2.SecurityGroup(this, 'connectionSG', {
    vpc,
    description: 'connectionSG',
    allowAllOutbound: true,
    disableInlineRules: true,
});

connectionSG.addIngressRule(
    ec2.Peer.securityGroupId(connectionSG.securityGroupId),
    ec2.Port.allTcp()
);
```
最初にセキュリティグループを作成するときにdisableInlineRulesをtrueにするとうまくできた。
これをtrueに設定すると、ingressルールとegressルールはcloudformationのSecurityGroupの下で宣言されず、別の要素になるらしい。
おそらく、セキュリティグループを作成して自己参照のルールを設定するcloudFormationに変わる(と思ってる)
FlutterのTextが改行される問題を対応する(絵文字対応)

全て対象コード(ASCIIコード+対象)の場合はそのまま、
対象コード以外も含む場合は、隣り合う左の値の対象コードを
改行可能な0文字のスペース+対象コードに置き換える。
https://github.com/flutter/flutter/issues/61081#issuecomment-1103330522

```dart
  String convertCharWrapString(String str) {
    // if (str.contains('')) {
    //   var _ = 0;
    // }

    var otherReg = '[^ -~\'’‘]+';
    var targetReg = '[ -~\'’‘]+';
    String charWrapStr;
    if (RegExp(otherReg).hasMatch(str)) {
      charWrapStr = '';
      for (int i = 0; i < str.length; i++) {
        var char = str[i];
        if (RegExp(targetReg).hasMatch(char)) {
          // 改行可能な0文字のスペース
          charWrapStr += '\u200b$char';
        } else {
          charWrapStr += char;
        }
      }
    } else {
      charWrapStr = str;
    }

    // 改行しないスペースに変換
    charWrapStr = charWrapStr.replaceAll(' ', '\u00a0')
    // -の前後に改行禁止文字を追加
        .replaceAll('-', '\ufeff-\ufeff');

    return charWrapStr;
  }
```
LTR（Left to Right）とRTL（Right to Left）の文脈でマージンを効率的に設定する方法

## 概要

カードコンポーネントを実装するときに横並びのアイコンとテキストの間にマージン（余白）を入れることはよくありますが、`LTR` か` RTL` かによってマージンを入れる箇所が異なります。`LTR` ならアイコンに `margin-right: 1rem;` をあてて `RTL` ならアイコンに `margin-right: 0;` と`margin-left: 1rem;`をあてる方法もありますが、`margin-inline-end: 1rem;` をあてることによってそれを効率的に実装することができます。ちなみに `margin-inline-end` というプロパティは `Tailwind CSS` にもあるので `Tailwind CSS` でも使用できます。

```css
.avatar {
  /* Default for LTR */
  margin-right: 1rem;
}

.rtl .avatar {
  /* for RTL */
  margin-right: 0;
  margin-left: 1rem;
}
```

```css
.avatar {
  margin-inline-end: 1rem;
}
```

こちらのCodePenは `margin-inline-end` プロパティを使用して、`LTR` と `RTL` の文脈でアイコンとテキスト間のマージンがどのように適用されるかを示しています。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ZEqNeWv" data-user="alam_tahera" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/alam_tahera/pen/ZEqNeWv">
  margin-inline-end demo</a> by Tahera Alam (<a href="https://codepen.io/alam_tahera">@alam_tahera</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## LTR と RTL

`LTR` と `RTL` はテキストの読み書きの方向性を指します。`LTR` は `Left to Right`（左から右へ）を意味し、英語や日本語など多くの言語がこの読み書きの方向を採用しています。`RTL` は `Right to Left`（右から左へ）を意味し、アラビア語やヘブライ語など一部の言語がこの読み書きの方向を採用しています。海外展開をより重視したいサービスの場合 `margin-right` `margin-left` を使用するより `margin-inline-end` を使用すると適切かもしれないですね。

## margin-inline-start と margin-inline-end

`margin-inline-start` というプロパティもあって `margin-inline-start` と `margin-inline-end` は要素の周囲にマージン（余白）を追加するために使われますが、その適用は要素のインライン軸（テキストの流れの方向）に沿って行われます。これにより、特に多言語サイトを設計する際に、`Left to Right（左から右へ）` または `Right to Left（右から左へ）` のテキスト方向に基づいて、自動的にマージンを適切に配置することができます。

- `margin-inline-start`
意味: 要素のインライン軸の開始側（テキストが始まる側）にマージンを適用します。
LTR言語の場合: 左側にマージンが適用されます。
RTL言語の場合: 右側にマージンが適用されます。

- `margin-inline-end`
意味: 要素のインライン軸の終了側（テキストが終わる側）にマージンを適用します。
LTR言語の場合: 右側にマージンが適用されます。
RTL言語の場合: 左側にマージンが適用されます。

## 参照

https://front.tips/css-margin-inline-rtl-element/#tip-links

https://it-kingdom.com/

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
遊戯王クイズを出すDiscord Bot を作った

# はじめに

こんな感じのBotを作りました：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496507/4ec4a325-b68c-f746-de8c-d16505371f30.png)

# 経緯

～ とある日の会話にて ～

私「私は遊戯王オラクルだぞ、カードテキストを言ってみてよ、カード名を当てるからさ」
友人「ふーん、じゃあこれは？」
私「わかんないです...」
友人「これは？」
私「...」

～～～～～～～～～～～～

ということがあったので、自分の知識を高めるために作りました

# 機能

- 「はじめに」で見てもらった感じで、スラッシュコマンド `/ygoquiz new` で問題を生成し、`/ygoquiz ans <カード名>`で回答（出題範囲は全部のカード）

- 分からなかった時のための、`/ygoquiz giveup` コマンド

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496507/546ac380-40ae-938b-f969-6bd3015ed3ef.png)

- 問題はユーザーごとに管理されるので、誰かがクイズに取り組んでいる間にも他の人がクイズをすることが可能

- 問題は表記通りやルビ、どちらでも回答可能。また、微妙な表記揺れを吸収するのにこだわりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496507/07215063-800a-c2a0-d330-5acee8581da5.png)
（中点を省略していますが正解になっています）

# 技術などなど

- Rust - たまに手厳しすぎるが強力な糖衣構文を持つ言語
- [Shuttle](https://www.shuttle.rs/) - つよつよインフラ
- [Serenity](https://github.com/serenity-rs/serenity) - つよつよDiscord Bot用ライブラリ
- [Yu-Gi-Oh! API](https://ygoprodeck.com/api-guide/) - 有志の方による、遊戯王のデータを取得してくれるAPI (日本語のテキストは返してくれない)
- [遊戯王OCGカードデータベース](https://www.db.yugioh-card.com/yugiohdb/) - 上述のAPIでカードの ID を決定した後、日本語のテキストを得るためにスクレイピング

# リポジトリ

https://github.com/Snowman-s/discord-quiz-bot

# Magic: the Gathering 版も作りました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496507/b4733c10-37e7-0be6-c0b3-726c1ced962b.png)

# 参考 (Botの動かし方もここを)

https://qiita.com/raiga0310/items/b7da083d4e7133a3cc06
音声処理について【E資格対策】

# WaveNet

WaveNetとは、Google傘下のAI開発企業・DeepMindが開発した、**人間の自然な音声を生成するためのディープニューラルネットワークの一つ**です。WaveNetは、音声波形の生成モデルとして、ディープラーニングを用いて大量の音声データから学習し、毎秒16,000サンプルで音声を作成します。WaveNetは、従来の音声生成技術よりも高い品質と自然さを実現し、スマートスピーカーなどの対話型音声応答システムに搭載されています。

### WaveNetの特徴

WaveNetは、音声波形を点として考える方式を取っており、単純化や近似といった劣化を生むプロセスがないため、自然な発音に近づきます。
WaveNetは、音声波形の生成モデルとして、Dilated Causal Convolutionsという特殊な畳み込み層を用いて、長い時系列の依存関係を捉えます。
WaveNetは、音声生成だけでなく、音声認識や音声変換などの他の音声タスクにも応用できます。
WaveNetは、Googleアシスタントと呼ばれる対話型音声対応システムに搭載されており、インターネットに接続可能でGoogleアシスタントが使用できる製品であれば、WaveNetが作り出す人間のような自然な音声と対話ができます。


### WaveNetの流れ

①音声データをサンプリングして量子化し、音声波形を数値の列に変換。

②数値の列をWaveNetのモデルに入力し、ディープラーニングによって音声波形の確率分布を学習。

③学習した確率分布に基づいて、新しい音声波形を生成。


### WaveNetの構造

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3700895/dd3a489a-8669-0f29-5806-6694d9b216ee.png)
https://www.jstage.jst.go.jp/article/jasj/74/7/74_387/_pdf


# メル尺度
人間の聴覚、すなわち音の聞こえ方に基づいた尺度。
とりあえず、メル尺度の差が同じであれば、人間が感じる音高の差も同じ。


# CTC
CTCとは、音声認識の手法。
従来の音声認識の手法だと、アノテーションが超面倒だった。
（例えば、「1:01~1:03までは『あ』と発音してます」みたいなアノテーションが必要だったらしい。）

それがいらなくなった。『「あいうえお」としゃべってます』でOKになった。


詳しくは以下のサイトを見ればOK

https://accum33.com/%E3%80%90%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%80%91ctc%EF%BC%88%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98%EF%BC%89%E3%81%A8%E3%81%AF%EF%BC%9F/8811/#toc1
C言語をはじめる前の基礎知識

# はじめに
本記事では、C言語の基本的な概念を初心者にも理解しやすいように簡略化して説明します。環境構築などは他に優良な記事が豊富にあるので省略します。

# 開発環境
- Windows11
- Visual Studio 2022

## プログラムを書く前に気をつけること
### 半角英数で書く
プログラムは半角英数で書きます。全角と半角は区別され、全角文字を使ってプログラミングすることは基本的にありません（一部全角文字が使える箇所もあります）全角文字でプログラムを書くとエラーが発生するので注意が必要です。

```c:OK
printf( "Hello" );
```
```c:NG
ｐｒｉｎｔｆ（　”Ｈｅｌｌｏ”　）；
```
:::note warn
全角スペースは見えないので特に注意が必要です。
:::


### 拡張子
C言語の拡張子は`.c`です。`.cc`や`.cpp`はC++の拡張子です。C++はC言語の機能も使えるため、正常に動作して見えるかもしれませんが、一部挙動が異なるので不具合の原因になります。

### スペースや改行
C言語はフリーフォーマットな言語です。改行やスペースは文法的に問題がなければ自由に挿入することができます。例えば以下のようなプログラムを書いても正常に動作します。

```c
#include        <stdio.h>

int main( 
    void
)
{
    printf(
        "%d",                                123 
                  );

        return        0;
}
```
読みやすく整える目的で使用するので、わざわざ読みにくくするようなことはしません。

# 最初のプログラム

以下の内容は画面に123を表示するC言語のプログラムです。
```c
#include <stdio.h>

int main( void )
{
    printf( "123" );
    return 0;
}
```
プログラミングが初めての方には難しく感じるかもしれません。なので、以下の//が付いた行は気にしなくて大丈夫です。この部分は定型文のようなものなので、とりあえず書いておけばOKです。

```c
// #include <stdio.h>
// int main( void )
// {
      printf( "123" );
//    return 0;
// }
```

## プログラムの流れ
通常、プログラムは上から下へ処理されていきます。

```
int main( void )
{     |
      | 上から下に処理
      ↓
    return 0;
}
```

- mainからプログラムの処理が始まる。
- { ～ }の中の命令を上から下に向かって処理する。
- } で終了する。

## 関数呼び出し
C言語では**関数**を使って入出力処理（表示・入力）を行います。関数を使うことを**関数呼び出し**と呼びます。

関数にはプログラム内で特定の処理を行うための命令がまとめられています。例えば`printf`関数なら画面に文字を表示する機能です。以下の内容は実際のプログラムとそれを日本語にしたものです。

```c:例
// 123を表示する
printf( "123" );
```
関数呼び出しは以下のような形式になります。
```
関数名( 実引数 );
```

- 関数は様々な種類があり、それぞれに名前が付けられている。
- 実引数は具体的な指示（パラメータ）
- 実引数の数は関数によって変わる（無いものもある）

# コメント
コメントはプログラムに付ける注釈です。コメントはコンパイルの対象にならない（プログラムとして認識されない）ので、プログラムの説明に使われます。また、コメント内では日本語を使うこともできます。

C言語の場合はブロックコメント`/* ～ */`と1行コメント`//`があります。

```c
/* Helloを表示 */
printf( "Hello" );

// Worldを表示
printf( "World" );
```
ブロックコメントは`/*`から始まり、`*/`までの間がコメントとして扱われます。改行などもOKなので長文のコメントを書く時などに使えます。

```c
/*
    このプログラムはサンプルプログラムです。
*/
printf( "Hello" );
```

:::note warn
ブロックコメントの中にブロックコメントを書かないでください。`/*`と`*/`で１つのペアとなるため、`*/`が出現した時点でコメント範囲が終わってしまいます。
```c
/* 文字を表示 /* Hello */ */
printf( "Hello" );
```
:::

1行コメントは名前の通り、１行だけコメントになります。`//`の後ろがコメントとして扱われます。
```c
// 表示
printf( "Hello" ); // Helloが表示される
```

コメントの記述を心掛けてください。最初は何を書けばよいのか迷うかもしれませんが、プログラムを他人に説明する場合にどのように伝えるかを想像してみると書きやすくなると思います。
[Azure]AZ-900合格体験記

# はじめに
どうも、SobaNyakuです。蕎麦と蒟蒻が大好きです。
今更ですが、AZ-900に受かったので、合格体験記書いておきます。
世にありふれているのは承知の上でございます。


# 前提
以下は持っているので、Azure初心者ですがクラウドの知識はあります。
* SAA([AWS Certified Solutions Architect - Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/))
* SAP([AWS Certified Solutions Architect - Professional](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/))

(こっち書けよ。こっちの方がまだ需要ありそう)と聞こえてきそうですが、この後Azureの資格をどんどん取得していく予定なので、頭の整理がてら書くのです。

# AZ-900とは
詳細はとばす。ありふれているので。一応リンクだけ載せておく。

https://learn.microsoft.com/ja-jp/credentials/certifications/exams/az-900/

### 評価されるスキル:
* クラウドの概念に関する説明
* Azure のアーキテクチャとサービスについて説明する
* Azure の管理とガバナンスについて説明する

### Microsoft Certified: Azure Fundamentals
合格すると、 Azure Fundamentals に認定されます。
ここがよくわかってなかったのですが。
認定資格と認定試験があって、認定試験に合格すると認定資格が得られるようです。

※ほとんど1対1で対応してますが、複数試験に合格しないと認定されない資格もあります。


# 対策

* LinkedIn Learning
以下を見ました。少し高いですが。
2倍速でも聞き取りやすく、1hかからず視聴することができるため、おすすめです。

https://jp.linkedin.com/learning/exam-prep-microsoft-azure-fundamentals-az-900-15023951

* プラクティス評価
いわゆる模擬試験があります。無料なので受けておくべきです。

https://learn.microsoft.com/ja-jp/credentials/certifications/exams/az-900/practice/assessment?assessmentId=23&assessment-type=practice

# 感想
700点合格で、***889点***/1000点でした。
正直、模試の感覚的に満点かなと思いながら挑みこの点数だったので、模試でぎりぎりの場合はもう少し勉強した方がいいかもしれません。

とは言いつつも、AWSなど他のクラウドの知識がある人にとって、AZ-900はとても簡単です。計3hくらいの勉強でとれました。
試験内容の30%を占める***クラウドの概念***については既に知識があるので、当たり前といえば当たり前ですね。なのでAzure特有の箇所をLinkedIn Learningや模擬試験で3hほど学んでFin.でした。

>* ***クラウドの概念について説明する (25–30%)***
>* Azure のアーキテクチャとサービスについて説明する (35–40%)
>* Azure の管理とガバナンスについて説明する (30–35%)


# 次の資格
AZ104 -> AZ305 -> AZ700 -> DP900 -> AI900かなぁ。

おすすめの進め方あったら教えてください。
また合格したら体験記書きます。早く体験記の需要がある試験に受かりたい！

# おわりに
最後まで見ていただき、ありがとうございます。
よかったらチャンネル登録（フォロー）、高評価（いいね:heart_decoration:）、コメント:pen_fountain:などなど何でもお願いします:pray:

週一で投稿目指しています。もし何かリアクションをしてくれるとやる気が出るので、次週は投稿することを約束します。絶対！絶対！

※今週も約束守れました。いつもありがとうございます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3659255/dfc76a98-584d-303d-4eaa-d9dd3063eb4a.png)
要素数の取得

# .length
配列名や文字列変数名の後ろに.lengthと続けることで該当の配列・文字列の要素数を取得する事が出来ます。

この時、半角・全角どちらも同じ1文字として扱われます。
.lengthの表記方法はプログラム内のマジックナンバーを減らす事が出来ます。
転職回数多めの私がエンジニアと非エンジニアの間で感じるギャップ

を感じて日々を過ごす1人のITエンジニアです。
こんにちは。
技術要素であったり、そこからこぼれるネタであったり、お遊びなんかを投稿できたらいいなと始めたものでしたが、最近タイトル通りのことを強く思うようになり書き至った次第です。

## なぜこんな記事を書くか
私は3回の転職経験があり今は4社目に在籍しています。まず私は転職をマイナスに捉えていません。日本でこそマイナスのイメージが強いですが諸外国やここ最近はIT界隈に限ってはそうでもないのかな？となんとなく感じています。（願望が入っているかもしれません。）
そんな私が年齢を重ねたのも影響があるでしょうが、転職するほどより客観的な視点で人や組織を見ることができるようになってきたので、せっかくならそこから得た知見を共有したいと思ったものです。

ちなみに私はIT界隈で開発を主戦軸としていますがコーダーに閉じてはおらず比較的幅広く活動するタイプの人間です。コードも書くしテストもするし、要件整理に赴くし、マネージャーもしつつ顧客折衝もしつつ時には接待にもいきます。

## エンジニアと非エンジニア
まず私が言うこれは何かを定義しておきます。
まずIT、それもソフトウェアの世界に限った話とさせてください。全部が機械やハード、あるいは割合が増えると私の知らない状況がまたあるかもしれません。

**エンジニア**とは、IT開発において特定の専門的な知識を有しており、それを応用して開発業務に従事するものです。専門的とは言いましたが、例えば開発に配属された1年生が何らかのデバッグを始めたらもう私の中では立派なエンジニアです。
もう少し付け加えるとコンピューターサイエンスを多少なりとも理解してそれを応用する人たち、としましょう。

**非エンジニア**とは、コードの読み書きはしない。もちろんデバッグもしない、上記に該当しない人たちのことです。
最近ではノーコード、ローコードのソリューションが増えてきたためコードを書かなくても作れるシステムは増えてきました。これを使ってシステムを提供するエンジニアと名乗る人は存在するかもしれません。別にその人たちを否定するつもりはありません。要はコンピューターサイエンスを理解しているかどうかが私の中では判断材料です。

## ギャップとは？
ある要件のソフトが望まれた時に**エンジニア**がソフトを開発し**非エンジニア**（この場合営業）がソフトを販売します。
### 不具合
ソフトには不具合がつきものです。もういくつソフトリリースに関わったか覚えてませんが使用された上で不具合（報告）がなかったものは1，2回だけです。
不具合があると開発者は呼び出されますよね？（苦笑）
経験が浅いときは、開発者（特にコーディングに関わった人）が悪いと思い焦って対応を開始するか、自分でなければ犯人捜しをします。
ですが私はもう考え方が違います。瑕疵責任についてはほとんど多くの人が軽視しがちです。でもソフトの規模が大きくなったりクラウドソリューションになったりすると大規模な可用性や敏捷性を備えても問題はおきるときには起きます。それを一開発者が背負ってたらキリないですよね？

瑕疵担保責任など法律では「知ってから1年」など凶悪なものがあります。勿論契約形態にもよるのでもっと期間短く設定していたりはしますが、実際は期間なんか関係なく問い合わせきますよね？（再苦笑）しかしこの瑕疵責任て開発者のものでしょうか？私は会社に帰属していると考えています。納品した製品の権利は会社に帰属するのに責任だけ開発者というのは不思議ですよね？おそらくほとんどの現場がそうじゃないでしょうか。

### 仕様変更
ソフトは開発中や納品後にも仕様変更します。これ自体は普通のことですが多くの現場では（1度でも触ったことがある）開発者が仕様変更時にもアサインされます。
しかし前回納品から1年以上たっていて実際は内容全然覚えていないとか、仕様変更内容が特に知見を生かせるものではない、というのはよくあります。

### 結局ギャップって？
これ以上書くと愚痴が多くなるので2例だけにしました。
これエンジニアリングを深くしていくと、そしてたくさんの組織構造や人間関係や仕事のあり方を見ていくと違和感に気づいてきます。

不具合に対応するのが開発者（＝エンジニア）でないといけない理由を非エンジニアの人に聞くと「だって開発ツールがないから」、「コードを見てもわからないから」、「作った人の責任だから」という答えを聞きます。ずいぶん消極的な理由に感じます。これを理由にしていいのなら「なんとなく嫌だからやりたくない」というのが通用するということになります。
開発ツールはインストールすればいいだけ。コードを見てわかるかどうかは自己学習の範疇だし、そもそも設計書や周辺ドキュメントを見てほとんどのケースは解決できる。責任はプロダクトを売り出した会社にあるので個人に属しているわけではないし。
本質的には仕事に臨む姿勢は、**何をしなければならない人**なのか？に依ると思っています。
例えコードが見れなくても、ツールがインストールされてなくても、その役割にいるのならその役割を全うすべきだと考えるわけです。

このあたりの姿勢に対する温度感が大なり小なり存在しており、非エンジニアの人たちとのギャップとして感じています。
さらに悪いことにエンジニアの中にも、初学者であり未熟なためにそのように考えてしまう人もいるし、そういうカルチャーで育った人はやはりそのように考える人もいます。

## 技術から逃げる
これは最近同僚から聞いた言葉でその時の私に染みた言葉でした。
最近技術の変遷が早いです。幸い私の興味の範囲は広く、ちょっと苦手科目でも「可」をとれる程度についていけてます。一方で最近の技術についていけない、またはついていく気がさらさらないエンジニアの人たちも一定数います。
私が感じているこのギャップを**元**エンジニアとなってしまった人に感じるようにはなりたくないと思っており、目下この人たちの動機付けができないか？とか、レクレーションのようにして技術習得のカルチャーを根付かせていけないか？などと考えています。

コボラーをバカにするつもりはありませんが、コボルで食えていけてるのはたまたまです。偶然に頼りたくない意識の方は今すぐ行動することをお勧めします・・・


## 最後に
けっこう乱暴な物言いをしてしまいました。
最近の思うところが多すぎて溢れてしまったようです。
私自身もせめて「良」をいくつかの分野にリスク分散して維持できるよう自己研鑽に努めたい。
Wordpressで固定ページをオリジナルテンプレート適用する方法

## 1 . wordpressのtheme内オリジナルテーマフォルダにpage-（任意の名前）.phpを作る
例えば、ニュースならpage-newsなど任意の名前のphpを作る<br>
※ここではお知らせページを例とする

## 2 . １でつくったphp内上部に以下を記載

```page-news.php
<?php
/**
Template Name: お知らせページ
***/
?>
```
## 3 . Wordpressにアップロードし、固定ページを新規追加、テンプレートを選択の欄から「おしらせページ」を選択できるようになる
React に プルリクを送ったけど、マージされなかった話

## 短くまとめると

[React](https://github.com/facebook/react) に PR を送ったら、メンテナからの反応が渋そうだったので萎えていたら、メンテナが自分でブランチ切って修正してマージしていた。

## 教訓

1. OSS ではメンテナの言葉に一喜一憂しない鋼の心が必要
2. OSS では調査に時間がかかっても、できるだけすぐレスする
3. OSS で PR を送る前に テストとリント（と React の場合はタイプチェック, Flow）を通す

## PR を送る前からメンテナがマージするまでの流れ

#### 普段自分がしていたこと

去年の12月になって、1年間業務で使っている Next.js の内部構造を知らないのも変だなと思い Next.js のソースコードを読むようになりました。その過程で、server とちょっと build と client が分かるようになったので、今年の 1月から issue を探して、そのバグ修正を行うようになりました。

#### ことの発端 

今回のことの発端は、この issue でした。

https://github.com/vercel/next.js/issues/61902

Next.js の issue ですが、throw した カスタム Error もしくは object が [object Object] で表示されてしまうとのこと。
そこで自分なりにこの issue を調査することになったのですが、調べてみる（node_modules/next/dist/compiled/next-server/app-page.runtime.dev.js にデバッグコードを入れる）と、React Server Component で一回 server component を JSON 形式にする段階で エラーが [object Object] になっていることが分かりました。

#### React の PR を送る

ということで、React に PR を投げてみることにしました。

https://github.com/facebook/react/pull/28312

修正は簡単で、object が throw された時の条件分岐を加えただけです。

React の PR のフォーマットは初心者にも分かりやすく、

- prettier を通す
- lint を通す
- flow (Meta製のJavascriptタイプチェック) を通す
- テストを通す
- CLA を出す

ことを素直にしました。

#### いざメンテナのレビュー

いざ、メンテナのレビューの段階になると、結構手厳しい意見が...
大まかにいうと２点で、

1. object から message を取っているだけでは、エラーとは言い切れない。object から楽観的に情報を取り出せないものか？ react でも既存でそういう関数はあるけど
2. そもそも カスタムエラーが object を返しているのはおかしい。何か実装ミスがあるのでは？

豆腐メンタルの自分にはどう対処すればいいか分かりません。
まず、object から楽観的に情報を取る関数が JSX をパースする機能が dev でしかないのですが、そもそも JSX がエラーフォーマットに入るかが分からない（入らないと思っていた）ので、新しく エラーフォーマットを作る関数を作るべきなのか？
次に、Next.js で issue を切った人の実装ミスなら、そもそも直してくれるか分からない。

そんなことで、調査が終わってから、1日悩んでいました。

#### 1日寝かしたら

そうしたら、メンテナが新しいブランチを切って、修正しているではありませんか！
それも修正は新しい関数を作るのではなく、devではJSXを表示してくれる提示された関数を使っているだけという...

なんというか実装方針で考え過ぎていただけでした！本当に確認が大切ですね。

## その後の教訓（再掲）

メンテナだって、利用者に嫌な顔はしたくないはずだから、自分で直せというだけではなくて、実装を変えてくれることもありました。メンテナの言葉だけでなく、コードの利便性が上がることを正々堂々主張してもいいのかもしれません。
それとメンテナの返信スピードも早かったんで、自分も即レスを心がけたいですね。
そんなことで、今後は鋼の心を養うことも怠らず、OSS で PR を送りたいと思いました。

現場からは以上です。
ffmpegで動画を分割する時の連番を１から開始する

# はじめに

mp4形式の動画ファイルをffmpegを使用して一定時間ごとに分割して1から連番にしたかったが、どうしても0からの連番になってしまい若干てこずったのでまとめた

# 環境
+ ffmpeg 4.3.6-0+deb11u1 

```
$ ffmpeg -v
ffmpeg version 4.3.6-0+deb11u1 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 10 (Debian 10.2.1-6)
  configuration: --prefix=/usr --extra-version=0+deb11u1 --toolchain=hardened --libdir=/usr/lib/aarch64-linux-gnu --incdir=/usr/include/aarch64-linux-gnu --arch=arm64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100

```

# 状況

mp4形式の動画ファイル（例、in.mp4）を一定時間（例、600秒間=10分間）ごとにffmpegを使用して分割するとき、出力ファイル名（例、out<連番>.mp4）の連番が0からになってしまう。

```
$ ffmpeg -i in.mp4 -c copy -f segment -segment_time 600 out%d.mp4
$
$ ls out*.mp4
out0.mp4 out1.mp4 out2.mp4 ....　　　　　　　　　　(out0.mp4から始まる)
```

# 解決方法

ネットを検索してffmpegのオプションとして`start_number`を指定すればいいのかと思ったら期待した通り動作せず、`segment_start_number`オプションで開始番号を指定すれば期待通りに動作させることができた。

```
$ ffmpeg -i in.mp4 -c copy -f segment -segment_time 600   \
    -segment_start_number 1 out%d.mp4　　　      # -segment_start_numberで開始番号を指定
$
$ ls out*.mp4
out1.mp4 out2.mp4 out3.mp4 ....　　　　　　　　　　(out1.mp4から始まる)
```

:::note alert 
ややこしいことに出力ファイル形式が静止画と動画では`パラメータ名`、および`省略時の値`が変わってしまう

## 静止画出力の例（パラメータを指定しない場合）

連番は1から始まる（動画の場合は0から始まる）
```
$ ffmpeg -i in.mp4 -vcodec png out%d.png
$
$ ls out*.png
out1.png out2.png out3.png ....　　　　　　　　　(out1.pngから始まる)
```

## 静止画出力の例（パラメータを指定する場合）

開始番号の指定は`start_number`（動画の場合は`segment_start_number`）
```
$ ffmpeg -i in.mp4 -vcodec png \
    -start_number 0 out%d.png                  # -start_numberで開始番号を指定
$
$ ls out*.png
out0.png out1.png out2.png ....　　　　　　　　　(out0.pngから始まる)
```
:::


# 参考情報

+ [ffmpeg Documentation](https://ffmpeg.org/ffmpeg-formats.html#Options-25)
[個人メモ]macでhttpsサーバーを作成する

業務でちょっとしたテストをするときに便利なのでメモ書き

順序としては以下のとおり
- サーバーを建てるデイレクトリの作成
- やりたいことによるがファイル等の準備
- hostsファイルを編集して使用してドメインをローカル（127.0.0.1）に向ける
- https通信をしたいので自前で証明書と鍵の作成をする
- 以下のコマンドを↑で作成したディレクトリに行き実行する
```
serve -s -l 443 -C  --ssl-cert local.crt --ssl-key local.key
```
コマンドの解説
- `-l 443`
listening portの指定、Https通信をするので４４３（Well-known port）を指定する
- `-C`
CORSの許可をする
- `--ssl-cert`, `--ssl-key`
使用する証明書と鍵の指定をする

### 参考にした記事
https://qiita.com/hoto17296/items/8d32d0863d7e102b33f6
Chrome,Edge,Opera,Firefox など各種ブラウザのキャッシュディレクトリを調べる

Chrome,Edge,Opera,Firefox など各種ブラウザのキャッシュディレクトリを調べる

# Chrome

以下のコマンドで「プロフィール パス」を調べる
> chrome://version/

「プロフィール パス」直下に \Cache ディレクトリを勝手に作るので、そこに入っている
> C:\Users\ユーザー名\AppData\Local\Google\Chrome\User Data\Default

場所を変更したい場合は、ディレクトリジャンクション（mklink）を使う。
* https://atmarkit.itmedia.co.jp/ait/articles/1306/07/news111.html

# Edge
Chromeと同じ。コマンドは以下。
> edge://version/

# Opera

以下のコマンドにて「キャッシュ」の項目を調べる
> opera://about/

# Firefox
以下のコマンドで表示
> about:cache

場所を変更したい場合は、以下のコマンドで config文字列を新規作成する
> about:config
> browser.cache.disk.parent_directory = D:\TMP
半導体業界＃1　半導体企業の種類

# 目的
[1.初めに](#-1.はじめに)
[2.目的](#-2.目的)
[3.半導体企業の種類](#-3.半導体企業の種類)
[4.おわに](#-4.おわりに)

# 1.はじめに
半導体業界における関連する知識を備忘録としてまとめます。
載せる知識の範囲はかなりあいまいなので、少なくとも自分で必要と思った知識はどんどん追加していく要諦です。

# 2.目的
仕事で半導体業界に関わるため、少しでも業界の用語に慣れるため。
半導体業界というかなり大枠な範囲なため、出てくる単語量は膨大になると思います。

# 3.半導体企業の種類

- IDM : 半導体の開発、設計から、製造、販売まですべてを行う企業。インテル、サムスン、SKハイニックス、キオクシア etc..

- ファブレス : 自社で工場を持たず、設計を主体にしている企業。クアルコム、メディアテック、エヌビディア、ブロードコムがある

- ファウンドリー : 半導体製造の前工程を行う企業。ファブレスの設計した製品の製造を請け負ったりしている。代表は、TSMC、サムスン電子、グローバルファウンドリーズ、SMIC　etc...

- OSAT : 半導体製造の後工程を行う企業。ここでいう後工程とは、ICチップやその他パッケージなどの半導体製品を検査、組み立てをすること。
代表は、ASE、アムコー・テクノロジー、JCET、SPIL　etc...

- EDAベンダー : 電子設計を自動化するためのハードウェア、ソフトウェアを提供する企業。設計した回路などをシミュレーションしたり、デザイン補正も提供する
。代表は、シノプシス、ケイデンス・デザイン・システムズ、シーメンスEDA etc...

- IPプロバイダー : 設計する際に必要となるIP(知的財産)を提供する企業。ここでいう知的財産とは設計における知的財産のことで、CPUや画像処理回路などの機能ブロックの事である。企業はこれらの機能ブロックを基にして様々な機能を追加、変更を加えることで設計効率を上げている。代表は、アーム、シノプシス、ケイデンス・デザイン・システムズ、SST etc...

# おわりに
今回は、半導体における企業を前後工程や設計といった種類に分けました。
一番大枠の部分です。
この次は、半導体製造装置と材料の企業を取り上げたいと思ってます。

ここまで、読んでいただきありがとうございました。

以上
EC2インスタンス起動後のパスワード認証有効化を諦めた

# EC2インスタンスを起動してみた
3年程前になんとなくCloud Practitionerの資格を取って以来全く触っていなかったAWSを久しぶりに触りました。
放置しすぎでロックされたアカウントを放棄し新たにアカウントを取得、無事ログインしていざEC2インスタンス起動！

私「公開鍵で認証できたから～次はパスワード認証できるようにして～、おっとその前に試験用のユーザ作っとくか」
```
# 試験用ユーザ作成
useradd hoge
passwd hoge

useradd: Permission denied.
```
私「ec2-userはノンパスでsudoできるらしい。rootになるか」
```
# rootになる
sudo su -

# 試験用ユーザ作成
useradd hoge
passwd hoge
```
私「rootになったついでにパスワード認証有効化しとこ」
```
# いい感じに変更してパスワード認証有効化
vi /etc/ssh/sshd_config

#sshd再起動
service sshd restart
```
私「ほいだらさっき作ったユーザでssh認証しましょ」
```
# ssh認証実行
ssh hoge@XXXX
hoge@XXXX: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
私「なんでェ？」

# とりあえず鍵認証してみる
私「鍵認証はいけるか？」
```
# 鍵認証してみる
cp /home/ec2-user/.ssh/authorized_keys /home/hoge/.ssh/
chmod 700 /home/hoge/.ssh
chown hoge:hoge /home/yofune/.ssh/authorized_keys

ssh -i /home/hoge/.ssh/authorized_keys hoge@ec2-54-253-21-215.ap-southeast-2.compute.amazonaws.com
Load key "/home/hoge/.ssh/authorized_keys": error in libcrypto
hoge@ec2-54-253-21-215.ap-southeast-2.compute.amazonaws.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```
https://qiita.com/aiandrox/items/98ad9b7551481d890916

私「はーん」
私「.pemファイルをssh配下に入れると」
```
# WinSCPで移植
# ssh -i /home/hoge/.ssh/XXXXX.pem yofune@XXXX
Register this system with Red Hat Insights: insights-client --register
Create an account or view all your systems at https://red.ht/insights-dashboard

# 鍵認証は通った！
```

私「ほんでも本題のパスワード認証出来ないんだけど！」
いろんなサイト「パスワード認証じゃなくて公開鍵認証しようね！！！！」
私「うーーーーーんそんなに言うなら公開鍵認証にしたるか…（妥協）」
日本の衰退を加速する６つの方法

日本の衰退を加速する6の方法

僕たちは、自分自身が豊かになると同時に、世の中も豊かになることを目指して、開発を行なっていると信じている。
長年、開発を続けているのに、日本の社会が豊かさを失い続けているのが悲しい。
誰かの仕事を奪うために仕事をしているんじゃなくて、みんなが豊かになるために仕事をしているんだ。（そうなれているかは別として）
　技術は、程度の差こそあれ社会的な課題を解決するために存在する。腹をすかして死んじまったり、社会集団が子ども残せずに消えていってしまうことのないようにするために技術はあるだろう。
　そうだとすれば、技術情報のサイトの中で、僕たちが解決していかなくちゃならない課題を述べても許されんじゃないかと思って書いている。

 日本の衰退を加速していると思う６つの方法をメモしてみた。


## １．空き家・老朽家屋の放置
- 空き家・老朽家屋が、都市部においても継続し続けている。
- 相続者の特定のために、多額の費用が発生している。
- マイナンバーがこの分野で（十分）活用されていないのが不思議である。

[空き家の所有者等の特定](https://www.soumu.go.jp/main_content/000595207.pdf)

- あるべき姿：
    - 若い世代が、それらを活用できること。
    - 少ない価格でビジネスの拠点を創り出すこと

## ２．日本国内への投資の欠如
- 生産性を向上させるためには、投資が必要である。
- 投資をまったく行わないまま、生産性の向上が勝手に進むと思うのは愚の骨頂である。
- 事業を継続するためにも、工場のメンテナンスのためにも投資は必要である。
- 同様に、教育への公的な負担を行わないまま、優秀な卒業生が出てくると期待するのも愚の骨頂である。

[パナソニックHD、福島工場を25年に閉鎖　老朽化で](https://www.nikkei.com/article/DGXZQOUF185RW0Y4A110C2000000/)

## ３．納税者の手間という税金以外の負担をも強要する納税システム
### 例：年末調整の書類作成に2時間かかるとしよう。
- 日本の1,607時間。
- 2 h / 1607 h = 0.0012 = 0.12%
- それだけで、日本の労働時間の0.1 % を奪ってしまっていることを自覚しよう。
### 消費税とりわけインボイスシステム
- 1万円の税収のために、事業者が負担する事務手続きを金額換算するといくらになっているのだろうか


## ４．未来の労働者のスキルを低いままにする少なすぎる教育投資
- [「教育機関への公的支出割合、日本はワースト２位…ＯＥＣＤが発表」](https://www.yomiuri.co.jp/kyoiku/kyoiku/news/20221004-OYT1T50131/)
- 企業は、新規に雇用した労働者が高い能力を持つことを期待する。
- 開発部門では、開発目標を実現するための深い洞察力もち、必要な技術を見いだして、自ら解決していく力のある応募者が応募してくれることを望む。
- 組織の総務・経理・人事などの部門でも、コンプライアンスをもって適切な業務の遂行をできるメンバーであることを期待する。
- 店舗でも、レジや商品の品出し・陳列などの作業を効率的にこなしつつ、店の印象を損なわないような対応が求められている。
- 未来の労働者の能力が不足すれば、企業の活動の水準は低下するだろう。
- OECDの各国に比べて、公的支出が少ない。
- そのため、教育が不十分な層が日本の中で増えていくことが懸念される。マニュアルにしたがって作業をするにも、マニュアルが読めずに、たくさんの勘違いをしたまま、間違えた作業をしてしまう危険が増えていく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/ea03b444-9720-e440-d959-e7149c8d3546.png)

## 5.状況を悪くする結果をもたらす法律　雇い止めの誘発
- 無期労働契約への転換(第18条) が雇い止めを誘発しているのにもかかわらず、対策が取られていない。
- [「あの理化学研究所で97人雇い止め　10年ルール適用前に　降格、給与減、チーム解散も「こんな理不尽なことが」」](https://www.tokyo-np.co.jp/article/252517)
- 国の方針を反映させやすい国立研究開発法人であるのにもかかわらず、このような結果がでているのは、「まるでこのような結果にすることが、法令の改正の目的としていたのではないか」という疑念をまねきかねない。

## 6. 週の労働時間を１０時間未満にさせる圧力が働くかもしれないままの制度変更

- [「厚生労働省が雇用保険の加入条件の一つとしている週の労働時間について、現行の「20時間以上」から「10時間以上」に緩和する方向で検討していることが分かった。」](https://www.nikkei.com/article/DGXZQOUA21C5Z0R21C23A1000000/)
- 雇用保険の制度がより広い人に恩恵を与えるようにしようと思っているのかもしれない。しかし、「制度は、良かれと思って作ればいい」わけではない。実際にその制度の結果がよいものになるように制度設計をしなければならない。
- 自動車の設計が「良かれと思って設計した」からといって、結果が事故を招くものだったら、製造者の責任が問われる。（例えば、人をひかない車にするために、人検出の見逃しを生じない方に極端にパラメータを振った運用をした結果、誤検出をして急ブレーキをかけて、その結果が事故につながったとしよう。そういう設計・実装はエンジニアが、製造業者がしてはならない。）
- だから、社会制度を設計し運用する人たちも、同様に悪い結果を引き起こさないように責任があることを承知してほしい。
Salesforceでスケジュールトリガーフローを作成しよう～とあるオブジェクトのレコードを一括削除する方法

今回の内容は動画でも解説します

https://youtu.be/Qnc5VGHPEFI?si=teX9F5MNII9A_0q0

<iframe width="560" height="315" src="https://www.youtube.com/embed/Qnc5VGHPEFI?si=teX9F5MNII9A_0q0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

こんにちは
本橋孝昭です

私はSalesforceリストビュー画面で「一括削除」ボタンを作成しボタンによる一括削除のフロー作成方法を示しました

https://qiita.com/Takaa/items/75cf6100d5c5422dd912


今回は一括でデータを削除する方法としてスケジュールトリガーによるの方法を解説します

一括削除方法は他にもデータローダなどありますが、ぜひフローによる一括削除方法も学んでみてください。


「フロー」といっても内容は簡単です

フローの内容としてはこのようになります

![フロー0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/52ef7037-8e4d-bdf7-71c5-24154431149f.png)
特定の日時を設定します


![フロー0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fae9137d-5e2e-95a4-4117-4bdd0f392aca.png)

そして、どのオブジェクトのどのレコードを削除するかを選択するだけです

後は設定した時間を待つだけでオブジェクトのレコードの一括削除が可能です

定期的なレコード削除もできますのでぜひレコード削除する際は試してみてください


なお、スケジュールトリガーフローでレコード一括更新の方法はこちらです

https://qiita.com/Takaa/items/b4878fec2d45274765cb
unityの"Missing Default Layout"バグの解決法


## "Missing Default Layout"
昨日、プロジェクトに皆さんのブランチを集積してアップデートしたあと、unityを起動しようとしたら、以下のようなエラーが出た。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96586/990948f4-3d40-f197-bd24-d08e9c326049.png)

**"No valid user created or default window layout found."** だあ？
何いっとんじゃと思いつつ、素直なワタクシは「はあ、わかりました」と **"Revert Factory Settings"** を押したのだけど、うんともすんとも動かず、Quitをするしかない。そしてQuitするとunityが終了する。要は **unity起動不可能案件** だ。

ふざけんなよ、この野郎と調べたところ、今のところ対処方法は以下の２つに大別されることがわかった（面倒くさいのでURLは紹介しないが、このエラー名で検索するとunity forumなどがフツーに出てくる）。

1. Libraryフォルダを削除する
1. Libraryフォルダ内のArtifactDBを削除する

他の方法もあるのだけど、これより面倒なので、紹介しない。
そして一見すると、ArtifactDBを削除する方が楽そうなのでやってみたところ、これを削除するとunityがほぼ **Libraryを再生成するのと同じ挙動** をするらしく、ド偉く時間がかかるうえに、Libraryフォルダのサイズが小さくならないので、再生成も兼ねてLibraryフォルダを捨てることを、これにブチ当たったみなさんにはお勧めしたい。

:::note info
ちなみにウチのプロジェクトのワタクシのマシンでは300ギガバイトもあったLibraryフォルダがなんと100ギガ以下になったので、どう見たってLibrary捨てるのがお勧めだ。
:::

## 同じエラー in Jenkins

で、unityも再起動できるようになったので、まあついでに、テストしなければならないブランチがあるので、Jenkinsも回すかあ、と Jenkinsを叩いたところいきなりエラーが出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96586/98ed4b2a-52f6-03eb-cfb2-74e860c432cc.png)

時間がブラック企業なのは笑って許していただきたいが、ともかく「？？？？」となって、エラーログを見たところ、なんとnullを吐いてunityが落ちている。以下は、unityが吐いたログの該当部分である。

```
2024-02-16 23:52:32  ProgressiveSceneManager::Cancel()
2024-02-16 23:52:32  NullReferenceException: Object reference not set to an instance of an object
2024-02-16 23:52:32    at UnityEngine.GUI.DoSetSkin (UnityEngine.GUISkin newSkin) [0x0001b] in <aa75c951dea44e839ed36863e532f0e2>:0 
2024-02-16 23:52:32    at UnityEngine.GUIUtility.SetSkin (System.Int32 skinMode) [0x00007] in <aa75c951dea44e839ed36863e532f0e2>:0 
```

unity内部のGUIのセットアップでコケてやがるので **「なんじゃこりゃあ」** となっていたところに、unityについてやたら詳しいチームメートが **「これ、同じエラーでLibrary消したら通るんじゃね？」** と、言ってきた(なお、時間がブラック企業じゃないかという話は聞かないｗ）。
まさかと思いつつも、やってみたらなんと通った！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96586/9b383121-3b0a-76ab-76b5-a86635f9b624.png)

というわけで、以下、結論
1. unityはバッチモードであろうと内部的にはGUIは起動されている
1. そして、GUIが起動されるがゆえに **"Missing Default Layout"バグは同じように起こる**
1. これが起きたかはログで確認可能で、UnityEngine.GUI.DoSetSkin あたりでnullで落ちているログがあればソレである

いやはや、ひどい目にあったもので、こうして共有しておく次第である。
ブロックチェーンの調査（2021）

## 初めに
以前ブロックチェーンに興味があった際に，ビットコインとその核となる技術であるブロックチェーンを詳しく調査した資料である．基本的な技術とその応用についてまとめた．

***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/cb353748-b2ab-b221-1350-fa5bba036156.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/2040620e-f026-5357-a8e1-d41639c5d4af.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/3ccb67e1-c0d4-470d-a817-4d3f7bc09c6f.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/df7dc329-4e63-7d1d-fb37-f385c77888e5.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/eddc3f1d-a3bd-bb03-c78e-89e77d0aff2f.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/1a5b51b2-af3b-2c17-cf17-98ff99e95bed.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/a26ba220-895d-dbcd-d37a-0e6ef1ab0fcc.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/e43b9052-3bdc-be62-41fe-1a446d114ceb.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/c643a060-f089-2fbf-c476-7d87d00cbe3c.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/d88bdf79-7121-f68c-273c-67ad594c3578.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/16bbf399-39d0-d103-b876-ee77c6677d61.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/cc258e37-b029-69d6-7e02-4d8671464b50.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/7b9bbc90-4b29-ac79-07d3-640e46ea4c3f.png)
***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690136/8c56a66f-c568-39a8-0a4a-dddf9e46617e.png)
***

## 参考文献


https://blockchainexe.com/bitcoinhistory/→5p

http://www.iti.or.jp/report_56.pdf→6,7,10,11,12,13p

https://jp.techcrunch.com/2015/03/31/bitcoin-essay/#→4,8,13p

https://home.kpmg/jp/ja/home/insights/2019/03/blockchain-application-example-20190315.html→15p

https://gaiax-blockchain.com/smart-contract→15p

https://prtimes.jp/main/html/rd/p/000000002.000047577.html→15p
JestとTypeScriptでProperty 'toBeInTheDocument' does not exist on type 'Matchers<void, HTMLElement>'エラーが出る

# はじめに

よくみかけるエラーでしたが、結構苦戦したのでまとめます

# 問題

以下のエラーがVSCodeででました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/b7adb315-0983-a870-9173-dd5096d01d9c.png)

```
Property 'toBeInTheDocument' does not exist on type 'JestMatchers<HTMLElement>'.ts(2339)
any
```

# 解決方法

tsconfigを修正します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/b4c993b4-9e61-f3d8-7234-46594f2bde55.png)

`CompilerOptions`に以下を追加することでVSCodeのエラーが消えました

```
    "types": ["node", "jest", "@testing-library/jest-dom"]
```

# おわりに

更新まですこし時間がかかるので効いてないと勘違いもしました
react-testing-libraryでSyntaxError: Private field '#root' must be declared in an enclosing classエラーがでる

# はじめに

jestの導入でエラーが出たのでまとめます

# 問題

テストを実行すると以下のエラーが出ました

```
   /home/watanabejin/workspace/sin-simple-study/src/App.css:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){#root {
                                                                                     ^

    SyntaxError: Private field '#root' must be declared in an enclosing class
```

# 解決方法

jest.config.jsに以下の設定を追加しました

```js:jest.config.js
export default {
  (省略)
  moduleNameMapper: {
    "\\.(css|less)$": "identity-obj-proxy",
  }
}
```

# おわりに

よくわかっていない設定で消していたのでなるほどとなりました
Azure Synapse Analytics で openpyxl を用いて ADLS Gen2 上の Excel ファイルを操作する

## はじめに

Azure Synapse Analytics では ADLS Gen2 上のファイルを操作できます。
今回は ADLS Gen2 上の Excel ファイルを [openpyxl](https://openpyxl.readthedocs.io/en/stable/) を使用して操作する方法を説明します。

## 手順

### 1. ユーザーへの権限付与

ノートブックはワークスペースログインユーザーの権限で実行されます。詳細は [こちらの記事](https://qiita.com/samskeyti/items/ed841fad522f636516e1) に記載しました。
ストレージ アカウントの IAM 設定より `ストレージ BLOB データ共同作成者` の権限を該当ユーザーに付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/f513e819-3a55-f87a-055b-15c8d9fe16ac.png)


### 2. Excel ファイルの準備

サンプル データ Book1.xlsx を ADLS Gen2 に格納します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/10e06df6-6398-1b68-f4f5-527a94a29136.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/cf290353-b6bd-1d28-e36d-de7306d14402.png)


### 3. コード実行

Synapse Studio にて以下のコードを実行して、ファイルの読み書きを行います。 
なお、ダウンロードしたファイルをそのまま編集してアップロードすると `ChecksumException` エラーとなるため、Book2.xlsx に一度コピーして編集を行います。

```python
import openpyxl
from notebookutils import mssparkutils
import shutil

mssparkutils.fs.cp('abfss://container@storageaccount.dfs.core.windows.net/xlsx/Book1.xlsx', 'file:/tmp/')
shutil.copyfile('/tmp/Book1.xlsx','/tmp/Book2.xlsx')
wb = openpyxl.load_workbook('/tmp/Book2.xlsx')

ws = wb['Sheet1']
data_from = ws['A1'].value
print('data_from: ' + data_from)

ws['A1'] = 'fuga'
data_to = ws['A1'].value
print('data_to: ' + data_to)

wb.save('/tmp/Book2.xlsx')
result = mssparkutils.fs.cp('file:/tmp/Book2.xlsx', 'abfss://container@storageaccount.dfs.core.windows.net/xlsx/Book1.xlsx')
print('result: ' + str(result))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/c2f388aa-545c-f821-0d22-f75b8cc701cf.png)


### 4. 編集した Excel ファイルの確認

手順 3 で ADLS Gen2 にアップロードした Excel ファイルを手元にダウンロードし、データが正しく編集されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307853/89845166-5c53-15b6-21e1-2c960aa3535d.png)

## おわりに

Azure Synapse Analytics で openpyxl を用いて ADLS Gen2 上の Excel ファイルを操作する方法を説明しました。ファイルをそのまま編集するのではなく、一度別ファイルにコピーする必要があることに注意しましょう。
オープンテレメトリーとは？

# そもそもテレメトリーとは？

>テレメトリーとは、製品のパフォーマンス データを収集し、監視と分析のために遠隔地に送信するプロセスです。この手法は、さまざまな製品のパフォーマンスを簡単に追跡するためによく使用されます。

引用：https://www.ruijie.co.jp/faq/what-is-telemetry_439760686136164352.html

こちらから分かる通り、テレメトリーはメトリクスやトレースデータを遠隔地に送信するプロセスのようです。
ちなみに遠隔地はバックエンドと呼ばれます。

バックエンドの詳細については後述します。


# 代表的なテレメトリーデータ

実際にバックエンドに送信される(テレメトリー)データの種類は下記になります。

## トレース

痕跡、足跡などの意味を持つ英単語。
ここでいうトレースとはある一つのリクエスト、処理に対しての痕跡を指します。

WEBアプリケーションを例にすると、HTTPSのGETリクエストを受け取り、メインルーチンの処理に掛かった時間、メインルーチン内のDBクエリに掛かった時間およびクエリ内容、外部ストレージへのアップロードに掛かった時間などがトレースデータになります。

※Datadogのトレースデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1671245/30d4a165-7ba3-8a0e-d072-509fba5eb2b2.png)


## メトリック(メトリクス)

メートル法、計測、単位などの意味を持つ英単語。
ここでいうメトリックとはCPU使用率やメモリ使用率、DBのコネクション数などの測定を指します。
メトリックのかたまりがメトリクスです。

トレースと違うのは**状態**を計測している点ですね。

※AWS CloudWatchのメトリックデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1671245/8233a9d0-4850-29d9-366f-e4440713ac70.png)


## イベント

収集を行うエージェントの起動や計測対象のホストの起動、停止、異常停止などのデータです。
カスタムイベントを作成出来るので、特定のプロセスが落ちた場合にイベントを送るみたいな使い方も出来ます。

ちなみにDatadogではエージェントの起動とコンテナの起動と停止などのイベントが自動で送られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1671245/18122e54-fe5f-ce42-aa92-086ad17c074d.png)


## ログ

こちらは分かりやすいですね。
アプリケーションログやクエリーログなどのログデータです。


# オープンテレメトリーとは？

テレメトリーと、収集、送信するデータについて確認できたのでようやく本題です。
まずは下記公式ドキュメントの引用(自動翻訳)を確認します。

>OpenTelemetry は、 トレース、 メトリック、 ログなど のテレメトリ データを作成および管理するために設計された Observabilityフレームワークおよびツールキットです。重要なのは、OpenTelemetry がベンダーやツールに依存しないことです。つまり、 Jaegerや Prometheusなどのオープンソース ツールや商用製品を含む、さまざまな Observability バックエンドで使用できます 。

https://opentelemetry.io/docs/what-is-opentelemetry/

「重要なのは、OpenTelemetry がベンダーやツールに依存しないこと」

ここを強調する理由として、DatadogやNew Relic、AWS X-Ray等のモニタリングサービスでは、通常それらのサービスに準拠したフレームワークになります。
例として、AWS X-Rayではアプリケーション計測を行うためのX-Ray SDKが用意されていますが、対応言語が限られているので、既存プロジェクトの言語では扱えない等の問題に直面します。

そういった問題を解消するのがこのオープンテレメトリーです。

X-Ray SDKではPHPを扱えませんが、オープンテレメトリーを介してトレースデータを送信できるようになります。

ちなみにオープンテレメトリーは、Cloud Native Computing Foundation(CNCF)という非営利団体により提供されています。

※CNCFはクラウド ネイティブ コンピューティングプロジェクトの支援を行っている団体です。
https://www.cncf.io/


## バックエンドとは？

冒頭でメトリクスやトレースデータを送信する先の遠隔地をバックエンドとお話しました。
バックエンドとは、データが集まる場所を指します。
※データを収集する場所でないことに注意(収集はcollectorが行います)

モニタリングサービスにDatadogを使っているのであればバックエンドはDatadog、New Relicを使っているのであればバックエンドはNew Relicになります。

ホスト内のオープンテレメトリーcollectorでデータを収集し、バックエンドとしてDatadogやNew Relicを指定してデータを送信するイメージです。


## 最後に

オブザーバビリティまわりの学習ついでにオープンテレメトリーの概要や用語についてまとめてみました。
まだ触ったばかりなので、間違っている箇所があるかもしれません。
間違っている箇所や補足で入れておいた方が良いことなど、ご指摘頂けると有り難いです。

最後まで読んで頂きありがとうございましたm(_ _)m
[翻訳転載] Golang Tip #22: 構造体やオプションパターンを使って関数のシグネチャをシンプルにする

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://twitter.com/func25/status/1758435261183353308?s=20

関数に多くの引数を渡したい場合どうするか、という内容になります。

２つのパターンが紹介されていますが、確かにどちらもよく見るなという印象です。

- 構造体を使用している例
  - https://github.com/aws/aws-cdk-go/blob/30a57af20b54b95225aecf6741db20d30d72622a/awscdk/awsssm/StringParameter.go#L191-L206
- オプションパターンを使用している例
  - https://github.com/go-kit/kit/blob/844c3d2de01a7fee4cfda9981edad4d58103130e/transport/http/server.go#L13-L92

## Golang Tip #22: 構造体やオプションパターンを使って関数のシグネチャをシンプルにする

Goで関数を設計するとき、多数のパラメータを渡す必要が出てくることがある。

![image](https://pbs.twimg.com/media/GGczGTGaUAAtY0q?format=png&name=medium)

これは関数の目的を曇らせ、特に同じ型のパラメータが含まれる場合、コードの維持が面倒になる。

物事を整理するために、2つの戦略を考えてみよう

- 構造体の活用
- オプションパターンの活用

### 1. 構造体

関数に渡したいパラメータを構造体に入れ込むことで、可読性を高めるだけでなく、引数の受け渡しを簡単にします。

どのような場合に使うのか？

- 関数に渡したいパラメータが多い場合
- 構造体のフィールド名に本質的にその目的を示すことで、コードを自己文書化したい場合
- デフォルト値を簡単に設定したり、オプションを柔軟に変更したい場合

![image](https://pbs.twimg.com/media/GGc26graQAAYLqV?format=png&name=900x900)

このパターンを使用する場合、`context.Context`は別のパラメータとして残し、構造体の中には含めるべきではない。

![image](https://pbs.twimg.com/media/GGc3BPXaIAAwORt?format=png&name=900x900)

これは、リクエストスコープの値や有効期限（`Deadline`）、キャンセルシグナルをコントロールするという、コンテキストのユニークな役割によるものです。

使用する際のちょっとしたヒント

- 構造体には後方互換性を持たせておくと、新しいフィールドを追加するときに既存の挙動を壊すことがない
- 構造体を使用する前に、常に構造体を検証できる
- 構造体を隠蔽し（unexported/privateにし）、`NewXXX()`関数を公開してデフォルト値を設定することを検討してください

### 2. オプションパターン

このメソッドはGoの関数機能を利用し、任意の数のオプションをよりクリーンな方法で渡すことができます。

次のような場合に最適です

- 関数に高度な設定が必要な場合
- 一部の必要な設定パラメータのみ渡したいような場合
- 簡潔な関数呼び出しを実現したい場合

![image](https://pbs.twimg.com/media/GGczveCagAAoqlH?format=jpg&name=medium)

デフォルト値を設定するのは、構造体を使用するよりも簡単です。隠蔽する必要はなく、`ConnectToDatabase`にデフォルト値を直接記述するだけです。
【ChatGPT無＋Bing ImageCreator】プロンプトを作成して、与えてみる。その２


　どうも、カーブミラーです。

　今回は、Bing ImageCreator用に、プロンプトを作成するPromptです。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　久々ですねぇ、
　　無料版を使うのはw

　やっぱり、
　　DALL-E3での
　　　描画が楽しくて
　　　　無料版を使う時間が
　　　　　ありません(汗)

　さて、今回は、
　　以前に、
　　　書いた記事の
　　　　拡張版になります。
[【ChatGPT無＋MS-ImageCreator】プロンプトを作成して、与えてみる。](https://qiita.com/kabumira/items/fa8dd5364c48088029c6)

　まずは、
　　Promptから。
```Text:ICに渡すプロンプト作成Prompt２
# 目的
DALL-Eに渡すプロンプトを以下の情報から考えてください。

# 注意点
プロンプトは、英文で350ワードを死守するべきです。

# 情報
・（箇条書きで描画する内容を）
・　︙

# 出力内容
・英文プロンプト
・それを和訳したもの
```

　久々に書きましたねぇ、
　　プロンプトフォーマットで。

　どれだけ
　　GPT-4が
　　　優秀かが
　　　　わかります。

　注意点がありますが、
　　文字数をワード数で
　　　指定しているのは
　　　　英語圏の人？である
　　　　　ChatGPTさんには
　　　　　　文字数よりも
　　　　　　　こちらの方が
　　　　　　　　わかってもらえる
　　　　　　　　　かな、と思って。

　ないよりはいい、
　　というレベルなので
　　　期待はしないでくださいねw

　それでも
　　Version 1に比べて、
　　　GPT-4に近いプロンプト生成が
　　　　行なえるものになったかと
　　　　　思います。

　Bing ImageCreatorで
　　作品制作をする方にも
　　　ChatGPTの恩恵を。

　今回は、ここまで。
【AWS認定試験】デベロッパーアソシエイト(DVA)を受けてみた

## はじめに
AWSをはじめとするクラウドサービスが当たり前になってきている中で、エンジニアもアーキへの理解が求められてきていることもあり、より開発に特化した知識を持っておきたいと思って受験を決めました。
DVAに興味を持たれている方への参考になればと思い、資格取得までの流れを紹介いたします。

## 結果
* 836/1000(点)で無事合格出来た
* 集中してたのは3週間くらいなので1か月あれば合格できそう
* SAAと比較すると開発者としては実用性が高い
* SAAとは異なり、浅く広くじゃなくて開発に絞って細かい仕組みへの理解が求められる

## 受験前のスキルセット
* SAA取得済み
* AWSの業務経験は半年程度

(Javaの開発エンジニアになるのでAWSをメインに業務に携わったことはないですが、マネコンやDataDog等からメトリクスを見るようなことを実施してました）


## 学習計画
* 期間：3か月
* 一日平均学習時間：約30分
※SAAのアドバンテージはさほど感じなかったので初学者でも1か月ほどで行けると思われます。

## 学習方針
* 問題集を1項目分(1項目で7問構成)解き、わからない部分を解説を見ながら理解。
* 前日分の問題1項目分を再度解きなおし知識の定着を確認する。
* 問題集が1周して終わったら本番想定用の問題を本番まで繰り返し解き、間違えた部分を確認し理解する。

## 学習に利用したサイト
* CloudLicence
  SAAの時もお世話になりましたが、これだけあれば足ります。
  有料ですが、下手に参考書買うよりはこちらをお勧めします。
  
https://cloud-license.com/

## 試験で求められたテーマ
正直、紹介しきれないくらいですが主要なテーマは以下になります。
知識として軽く押さえておくレベルではなく、使用する際にどうすればいいかを流れを理解しておく方が良いです。
* デプロイ
  *  CodeDeployなどの利用方法への理解
  *  デプロイ手法への理解
  *  その他CloudFormationやElastic Beanstalkなどの利用方法、仕組みの理解
* 認証認可
  * Cognitoを利用した認証の仕組みへの理解
  * Lambdaオーソライザの理解
* ポリシー/ロール
  * 適切なロール設定への理解
  * AssumeRoleを利用した認証への理解
* API Gateway/Lambdaを用いたサーバレスアプリケーション
  * ステージ変数
  * エイリアス/環境変数
* DynamoDB
  * putItemなどリクエストから暗号化や機能全般への理解
* ElastiCache
  * Redis/Memcachedの違いとユースケースへの理解
* ログ
  * CloudwatchLogsやX-Rayを用いたログ出力の仕組み理解
* S3/CloudFront
  * OAI
  * 署名付きURLなどの理解

## 参考にさせていただいたサイト
以下紹介させていただくサイトでそれぞれのサービスがどのような設定方法で、仕組みで動くのか紹介されているので理解が進むと思います。
特にIam Roleのあたりは大変分かりやすいのでおススメです。
* Codebuild

https://www.hacknotes.jp/blog/codebuild/
* Beanstalk

https://oji-cloud.net/2021/12/02/post-6737/
* IAM Role

https://dev.classmethod.jp/articles/iam-role-passrole-assumerole/
* AppSync

https://blog.usize-tech.com/chat-webapp-by-appsync-dynamodb-react/
* S3/CloudFront

https://qiita.com/sabapro/items/a8a5e0c2a4a91fe5793b

## 最後に
試験が終わった直後は、自信がないものばかりで模擬試験とは違うのを実感させられましたが
ちゃんと落ち着いて問題を読めば対応できるのと、出題されるCI/CDの知識や認証認可、各種サービスの組み合わせなんかは就業されているところでも登場してくると思うので勉強し理解したことがしっかりとアウトプットしやすく、有益な勉強だったと感じてます。
個人的には開発のエンジニアとしてご活躍されている方には**SAAよりもDVAをお勧めしたい**です。
最後まで読んでいただきありがとうございます。
悩めるほかのエンジニアの助けになれば幸いです。
「Python 3.12.2 ドキュメント」を読んでみる　その１

# はじめに
　プログラミングの勉強をしようと思っても何から始めたらいいかわからないので、とりあえずQiitaのリンクを辿って、公式リファレンス（ドキュメント？）に目を通すことにしました。この記事はそのメモですが、如何せんプログラミングの知識がほぼない人間の解釈ですので、勘違い、間違い、誤解等多数あるかと思います。

https://docs.python.org/ja/3/tutorial/index.html

# 「1. やる気を高めよう」を読んでみる

https://docs.python.org/ja/3/tutorial/appetite.html

## 用語
超高級言語：
コンピュータが唯一理解可能な機械語(２進数)と人間が日常的に使用する自然言語との間で、人間に理解しやすい方のプログラミング言語
インタプリタ：
ソースコードを１行ずつ機械語に翻訳して実行する
コンパイル：
ソースコード全体を機械語に翻訳する
バイナリ形式：
コンピュータしか理解できない形式（２進数）のデータ

## 概要
・Pythonは単純なものから複雑なものまで、いろいろなプログラムが作れるよ
・Pythonはコンパイルが必要ないから、プログラムを書いたらすぐに実行できるよ
・Pythonで書いたプログラムは短くて、読みやすいよ
・C言語がわかるなら自分なりに使いやすく改造できるよ、C言語で書かれた他のアプリと連携できるよ
・「Python」という名前は蛇じゃなくてTV番組に由来するよ

## 疑問
・「高水準言語」と「高級言語」って同じ？違う？
・データ型があるのに変数や引数の宣言が不要ってどういうこと？
Jestで環境変数を読み込む2つの方法

# はじめに

Jestで環境変数を読み込みたいというときに方法がいくつかあったのでまとめます
簡素に書いていきますので使いやすい方法をお使いください

# 0. 共通でやること

環境変数を読み込むには`dotenv`というライブラリが必要なのでインストールします

```
$ npm install dotenv
```

ここからは2つの方法があるので好きな方を選んでください

# 1. package.jsonに設定する

こちらはセットアップスクリプトが不要なので比較的簡単かなと思います
package.jsonに以下をいれます

```json:package.json
  "scripts": {
      (省略)
  },
  "jest": {
    "setupFiles": [
      "dotenv/config"
    ] //ここを追加する
  },
  (省略)
```

# 2. セットアップスクリプトをつかう

Jestを実行する際に実行前に環境変数を読み込むことセットアップスクリプトを書くことも可能です。

プロジェクトのディレクトリに`jest.config.js`と`jest.setup.js`というファイルを作成します

```js:jest.config.js
export default {
  testEnvironment: "jsdom",
  setupFilesAfterEnv: ["./jest.setup.js"],
};
```

```js:jest.setup.js
import "@testing-library/jest-dom";
require("dotenv").config();
```

# おわりに

案外まとまっていなかったので書いてみました
２の累乗をlongの桁があふれるまで表示するプログラム

　２の累乗(2,4,8,16...)を順に表示するプログラムです。桁数に応じて、フォントサイズを調整します。眺めていれば、数字に強くなれるかもしれません。
```java:processing
long val=2;
int h=100;

void setup() {
  size(1024, 1024);
  textSize(100);
  textAlign(CENTER, CENTER);
  fill(0);
  frameRate(0.2);
}

void draw() {
  background(255);
  String s = String.valueOf(val);
  while (textWidth(s)<width*0.9) {
    h+=10;
    if(h>width){
      break;
    }
    textSize(h);
  }
  
  text(s, width*0.5, height*0.4);
  val*=2;
  if (val<0) {
    val=2;
  }
  h=100;
  textSize(h);
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/643d06a3-750f-c34b-2901-f9fa656e9b3b.png)