OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10 の git bash 環境でrsyncを利用できるようにする

# 背景

Windows 10にてパスを同期する方法は色々ありますが、Linux環境と同じようにrsyncコマンド使えるといいなぁと思いました。
Git for Windowsがすでにインストール済になっていれば楽々実現できそうだったので、git bash環境でrsyncを利用できるようにしてみました。

# 手順

### 1\. Zstandard（zstd）をダウンロード

`.tar.zst`形式のファイルを解凍するため、zstdをインストールします。

+ こちらからダウンロードできます: https://github.com/facebook/zstd/releases

+ `zstd-〇〇〇-win64.zip`をダウンロードし、任意のパスでzipを展開します。
※〇〇〇は最新バージョンなど好みのバージョン

+ zstdコマンドを使えるようにします
```
echo "alias zstd=\"/[パス]/zstd/zstd.exe\"" >> ~/.bashrc
source ~/.bashrc
```

### 2\. rsyncをダウンロード

+ http://repo.msys2.org/msys/x86_64/ から最新バージョンの`rsync-〇〇〇–〇-x86_64.pkg.tar.zst`をダウンロード。

+ この記事を書いた当時の最新バージョンはrsync-3.2.7-2-x86_64.pkg.tar.zstですが、下記のように1でインストールしたzstdを使って解答します。
```
zstd -d rsync-3.2.7-2-x86_64.pkg.tar.zst 
tar -xvf rsync-3.2.7-2-x86_64.pkg.tar
```

+ `usr/bin/rsync.exe`を`C:\Program Files\Git\usr\bin`にコピーします。

+ rsyncコマンドを使えるようにします
```
echo "alias rsync=\"/usr/bin/rsync.exe\"" >> ~/.bashrc
source ~/.bashrc
```

### 3\. 必要なdllをダウンロード

この時点で`rsync`を実行すると、下記のようなエラーメッセージが表示されました。
```
C:/Program Files/Git/usr/bin/rsync.exe: error while loading shared libraries: msys-zstd-1.dll: cannot open shared object file: No such file or directory
```

いくつかのdllが足りないようなのでダウンロードしてGit for Windowsのusr/binに入れます。

+ http://repo.msys2.org/msys/x86_64/ から最新バージョンをダウンロードします。
この記事書いた当時、以下のバージョンが最新でした。
`libzstd-1.5.2-2-x86_64.pkg.tar.zst`
`libxxhash-0.8.1-1-x86_64.pkg.tar.zst`
`libopenssl-3.0.7-2-x86_64.pkg.tar.zst`

+ zstdコマンドで解答し、必要になる各dllを`C:\Program Files\Git\usr\bin` に入れます。
```
zstd -d libzstd-1.5.2-2-x86_64.pkg.tar.zst
tar -xvf libzstd-1.5.2-2-x86_64.pkg.tar
mv usr/bin/msys-zstd-1.dll C:\Program Files\Git\usr\bin
```
```
zstd -d libxxhash-0.8.1-1-x86_64.pkg.tar.zst
tar -xvf libxxhash-0.8.1-1-x86_64.pkg.tar
mv usr/bin/msys-xxhash-0.dll C:\Program Files\Git\usr\bin
```
```
zstd -d libopenssl-3.0.7-2-x86_64.pkg.tar.zst
tar -xvf libopenssl-3.0.7-2-x86_64.pkg.tar
mv usr/bin/msys-crypto-3.dll C:\Program Files\Git\usr\bin
```

# 確認

上記の手順がすべて終わりましたら、rsyncコマンドが使えるようになりました。
![230118_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980740/01326d1f-ad72-7db0-ad23-dd7c60695c45.png)
【Dart】よく使うSwiftのEnumの機能をDartで書き直してみた

# はじめに
SwiftのEnumはかなり洗練されていますが、Dartでも同じようなことがいくつかできるので、頻繁に使うSwiftのEnumの機能をDartで書き直してみます。
実行環境はこちらです。

Flutter: 3.3.10
Dart: 2.18.6
Xcode: 14.2
Swift: 5.7

## 値付きEnum

### Swift

``` swift
enum DogType: Int {
    case shiba   = 1
    case chiwawa = 2
    case pudoru  = 3
}
print(DogType.chiwawa.rawValue) // 2
```

### Dart

``` dart
enum DogType {
  shiba(value: 1),
  chiwawa(value: 2),
  pudoru(value: 3);

  final int value;
  
  const DogType({
    required this.value,
  });
}

main()  {
  print(DogType.chiwawa.value); // 2
}
```

## プロトコルに準拠させる
### Swift
``` swift
protocol Animal {
    func displayName() -> String
}

enum DogType: Int {
    case shiba   = 1
    case chiwawa = 2
    case pudoru  = 3
}

extension DogType: Animal {
    func displayName() -> String {
        switch self {
        case .shiba:
            return "しば"
        case .chiwawa:
            return "チワワ"
        case .pudoru:
            return "プードル"
        }
    }
}

print(DogType.chiwawa.displayName()) // チワワ
```

### Dart
``` dart
abstract class Animal {
  String displayName();
}

enum DogType implements Animal {
  shiba(value: 1),
  chiwawa(value: 2),
  pudoru(value: 3);

  final int value;

  const DogType({
    required this.value,
  });

  @override
  String displayName() {
    switch (this) {
      case DogType.shiba:
        return "しば";
      case DogType.chiwawa:
        return "チワワ";
      case DogType.pudoru:
        return "プードル";
    }
  }
}

main()  {
  print(DogType.chiwawa.displayName()); // チワワ
}
```

## Extension
### Swift
``` swift
enum DogType: Int {
    case shiba   = 1
    case chiwawa = 2
    case pudoru  = 3
}

extension DogType {
    func displayName() -> String {
        switch self {
        case .shiba:
            return "しば"
        case .chiwawa:
            return "チワワ"
        case .pudoru:
            return "プードル"
        }
    }
}

print(DogType.chiwawa.displayName()) // チワワ
```

### Dart
``` dart
enum DogType {
  shiba(value: 1),
  chiwawa(value: 2),
  pudoru(value: 3);

  final int value;

  const DogType({
    required this.value,
  });
}

extension DogTypeExtension on DogType {
    String displayName() {
    switch (this) {
      case DogType.shiba:
        return "しば";
      case DogType.chiwawa:
        return "チワワ";
      case DogType.pudoru:
        return "プードル";
    }
  }
}

main()  {
  print(DogType.chiwawa.displayName()); // チワワ
}
```

## 全ての値を列挙する
### Swift
``` swift
enum DogType: Int, CaseIterable {
    case shiba   = 1
    case chiwawa = 2
    case pudoru  = 3
}
print(DogType.allCases) // [DogType.shiba, DogType.chiwawa, DogType.pudoru]
```

### Dart
``` dart
enum DogType {
  shiba(value: 1),
  chiwawa(value: 2),
  pudoru(value: 3);

  final int value;

  const DogType({
    required this.value,
  });
}

main()  {
  print(DogType.values); // [DogType.shiba, DogType.chiwawa, DogType.pudoru]
}
```

## 終わりに
Swiftほど多機能ではないですが、Dartでも上記で挙げたような頻繁に使う機能は網羅されています。
以上です。
SCIP　と　Gurobi

SCIPのライセンスが変更になり、ハードルがさがったので、使用してみた。

確かに、CBCなどと比べると早いと感じる。

それではと思い、実際の案件のモデルを作成してみた。
⇒スケジューリング

私のモデルも悪いのはわかっているが、使用に耐えない時間がかかる。
５時間ぐらい動かしたがあきらめた。
⇒非力なノートPC

それではと思い、Gurobiの評価ライセンスで実行してみた。
同様の環境で数分で終わった。！！

手抜きしていると思われるぐらい早い。
⇒解をみると解自身も人間の感覚に近いと感じる。

これを見てしまうと、仕事にはやはり・・・・
【CSS 論理プロパティ】marginとpaddingの便利な設定

# 論理プロパティとは
論理プロパティとは`top`や`right`のように物理的に方向を指定するのではなく、要素の状態に応じて論理的に方向を指定することができるプロパティのことです。

# blockとinline
論理プロパティでどの方向に対して値を指定するかを表す用語で、テキストの方向に依存します。

## block
テキストの方向に対して垂直の方向を指します。
横方向にテキストが書かれている要素に対しては上下の方向になります。

## inline
テキストの方向に対して水平の方向を指します。
横方向にテキストが書かれている要素に対しては左右の方向になります。

## marginとpaddingの例
テキストの方向が横方向であることを前提とします。
### block
一般的な指定
```css
.block {
  padding-left: 8px;
  padding-right: 8px;
}
```
論理プロパティ
```css
.block {
  padding-inline: 8px;
}
```


### inline
一般的な指定
```css
.inline {
  margin-left: 8px;
  margin-right: 8px;
}
```
論理プロパティ
```css
.inline {
  margin-inline: 8px;
}
```

## ショートハンドによる不要な上書きの回避
ショートハンドは便利ですが不用な上書きをしていることはありませんか？
「0」のところは上書きする必要がないから`top`や`bottom`で指定を分けるべきだけどめんどくさい、、
そんなときに便利です！
 一般的な指定
```css
.class {
  margin: 8px 0;
}
```
論理プロパティ
```css
.class {
  margin-block: 8px;
}
```

## 中央寄せでよく使う`margin`の`auto`指定の場合
 一般的な指定
```css
.class {
  margin: 0 auto;
}
```
論理プロパティ
```css
.class {
  margin-inline: auto;
}
```

# おわりに
今回ご紹介したものは論理プロパティのほんの一部ですが、これだけでも実用的で便利ですよね！
他にも`height`や`width`の論理プロパティがあったり、`*-inline-start`や`*-inline-end`を使って左右が反転するデザインの実装で逆向き用のCSSを減らすことができるのでますます出番が増えそうです。
Javascriptでクリップボードに文字を格納する方法（多分Safari対応）

クリップボードにコピーする機能と言ったほうが早いかもしれませんが、作りたかったのはユーザーがボタンを押したら任意の文字列をクリップボードに保存してあげる方法です。

# execCommandを使う方法
調べてみたら昔の記事などではexecCommand("copy")を使った方法がよく見かけられました。ただ、この方法は見えないテキストエリアに文字を入れてそこからコピーというやや裏技的なやり方。しかも非推奨になったので近い将来使えなくなる可能性が高いようです。

# navigator.clipboard.writeTextを使う方法
で、その代わりに紹介されているのがnavigator.clipboard.writeTextを使う方法。
ただ、そのまま使うとSafariでは動作しないということで、以下であればSafariにも対応できるらしい。Safariでは試してないけどとりあえずFirefoxとChromeでは動作しました。
（蛇足：Webアプリ開発者としては駄目だと思いますがSafariとか入れたくないんですよ。大きいし普段絶対使わないし。iなんとかはあまり好きじゃないんです）

```
setTimeout(async () => await navigator.clipboard.writeText("文字列"));
```

# 注意点
少しハマったのが、writeTextを使う方法の場合、httpsでないと以下のようなエラーが出て動作しないこと。

Firefoxだとこんなエラー：
TypeError: navigator.clipboard is undefined

Chromeだとこんなエラー：
TypeError: Cannot read properties of undefined (reading 'writeText')

最近では本番環境でHttpsを使ってないなんていうことはまず無いと思うのでいいのですが、私は開発環境は面倒なのでhttpでやってるので時々この手の問題に直面します。そういう時は大体[ngrok](https://ngrok.com/)を使って解決してます。

ちなみに、ngrokはローカルの環境をトンネリングで外部からもアクセスができるようにするサービスですが、その過程でhttpsアクセスさせるようにすることも可能なのでこういうときも使えます。今まで何度ngrokに助けられたことか・・・本当に便利なので知らない方は「こんなサービスあるんだ」というのを知っておくだけでもいざというとき役に立つので是非使ってみてください。
障害がもしれない-->　エラーメッセージが嘘

[Trailhead関係　個別の課題別](https://qiita.com/Keiji_otsubo/items/56eb7a90bb72138ece1f)


+ 2023/01/18

# In the ‘Fully Operational Battle Station’ flow, in the Start element, we can’t find a condition that checks for Weapon_Status__c equal to ‘Fully Operational’. 

+ https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NQv4gSAD これに回答
+ https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NQv5fSAD
+ https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jfvbe

:::note
 I find this solution. You just go to "Battel Station" object ---> Then click "Field & Relationship" ----> then click "Weapons" field ----> then change it from "Weapons" to "Weapon". Just make it from Plural to Singular. 
:::
Googleプロジェクト管理：カンバンボード

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7c79c997-e4e4-7d71-3686-e01b7badaa3c.png" width="800">

# カンバンボードとは

***<font color="MediumVioletRed">『カンバンボードは、タスクやワークフローを管理するために使用されるビジュアルツールのこと』</font>*** 

プロジェクトに関連するタスクは、カードに書き込まれます。これらのカードは、進捗状況を表す列に配置されます。

カンバンボードはあらゆる種類のプロジェクトに有効ですが、一般的にはアジャイルプロジェクトマネジメントのアプローチで作業するプロジェクトチームに最も適しています。プロジェクトマネージャになり、プロジェクト計画を作成したら、カンバンボードがプロジェクトに適しているかどうかを判断することができます。

# カンバンボードの目的

カンバンボードは、次のような目的で使用されます。

- 作業の詳細をすばやく視覚的に理解し、重要なタスク情報を提供する。
- 開発リソースとテストリソース、または関連するタスクに取り組むチームメンバー間など、関係者間のハンドオフを促進する。
- メトリクスを取得し、ワークフローを改善するのに役立つ。

# カンバンボードを使う

ボードを作成する前に、必要な情報を収集し、タスク、ステータス、日付、期間などの主要な要素をレイアウトすることがベストプラクティスです。それらの情報は、ボードを構築するときに便利です。

下のカンバンボードの例に焦点を当てましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/a423951f-7627-69b0-eae6-904b4aa3304f.png" width="700">

- 各色の長方形は、タスクに関連付けられています。
- タスクは、作業時間軸を横切って水平に表現されています。
- 各列は、タスクの完了に関連する位置を表します。つまり、タスクが開始されると、To doからIn progressに移動します。プロジェクトがリリースや完成に近づいてくると、テストに移り、テストが終わって承認されると、Doneに移ります。これはカンバンボードの一例であり、ソフトウェアや物理的なボードなど、使用するツールによって、さまざまな列やカードを使ってボードをカスタマイズできることに注意してください。
- また、ボードにはリソース（チームや人）の行を設け、 ***<font color="MediumBlue">誰が何に積極的に取り組んでいるかを可視化</font>*** することができます。

# カードを作る

カードは、ホワイトボードに付箋を貼るなど、さまざまなスタイルがありますが、ほとんどのカードには、タスクに関するいくつかの重要な詳細が含まれています。物理的なカードを使用する場合、チームはしばしば両面を使用します。以下は、カードの両面に記載すべき内容です。

### Front

- **タイトルとユニークな識別子:** タスクとID番号のクイックリファレンスを確認します。
- **作業の説明:** 達成すべきタスクを簡単に説明します。インデックスカード程度の大きさのものに収まるようにすることを忘れないでください。
- **作業量の見積もり:** そのタスクを完了するために必要な作業量を見積もる。例えば、「小」「中」「大」のように、そのタスクがどの程度の労力を要すると考えるかを記入することができます。
- **誰がそのタスクを担当するか:** そのタスクを完了するための責任者を示します。

### Back

- **開始日:** メトリクス、トラッキング、時間の見積もりが正確であることを確認するために、タスクの開始日を含めます。
- **ブロックされる日:** タスクが中断される可能性がある日を示します。タスクは、作業を継続できない場合にブロックされることがあります。例えば、納品物を受け取ることになっていて、まだ納品されていない場合、このタスクはブロックされる可能性があります。
- **終了日:** どのような計画でもそうですが、タスクがいつ終了するのかを追跡することは重要です。そうすることで、プロジェクトが最終ゴールまで順調に進んでいるかどうかを確認することができます。

# カンバンボード用のソフトウェア

物理的なボードではなく、ソフトウェアツールを使用することを選択した場合、いくつかのオプションがあります。AsanaとTrelloは、プロジェクトにカンバンを導入しようとしている場合に使用する素晴らしいソフトウェアツールです。多くのオプションがあるので、あなたとプロジェクトにとってどれがベストか、時間をかけて評価してください。
paizaラーニング レベルアップ問題集 スタック・キューメニュー応用編 JavaScript 3 つのキュー

3 つのキュー (paizaランク C 相当)

https://paiza.jp/works/mondai/stack_queue_advanced/stack_queue_advanced__three_queue

# 解答例
問題文に沿って実装します。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [N] = lines[0].split(" ").map(Number);

let [queue1, queue2, queue3] = [[], [], []];

for (let i = 1; i <= N; i++) {
  const Q = lines[i].split(" ").map((v, i) => i === 0 ? v : Number(v));
  if (Q[0] === "push") {
    const [_, S, X] = Q;
      if (S === 1) {
        queue1.push(X);
      } else if (S === 2) {
        queue2.push(X);
      } else {
        queue3.push(X);
      }
  } else {
    const [_, S] = Q;
      if (S === 1) {
        queue1.shift();
      } else if (S === 2) {
        queue2.shift();
      } else {
        queue3.shift();
      }
  }
}
if(queue1.length > 0) console.log(queue1.join("\n"));
if(queue2.length > 0) console.log(queue2.join("\n"));
if(queue3.length > 0) console.log(queue3.join("\n"));
```
TouchDesignerのTouch Out/In TOPが映らない場合の対応

負荷分散をするためにTouch Out/Inを使いたい場合がある
TouchDesignerでの負荷分散はこちらの<a href="https://www.kalium.net/image/2020/02/05/how-to-share-data-between-multiple-processes/">記事</a>が参考になりました。

TOPのTouch Out/Inを使ってもIn側で画面が真っ黒になっている場合がある。
公式の<a href="https://derivative.ca/UserGuide/Touch_In_TOP">サイト</a>を参照すると「Windows Firewallを確認しろよ」的なことが書いている。

以下の要領でやれば今回の問題は解決できるはずです。

1. Windowsの設定 > 更新とセキュリティ
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1952885/351aec59-a58c-b0a2-8bf1-defc985c9879.png)
2. Windowsセキュリティを開く
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1952885/717d76e1-1166-325e-868f-4803fc2c5f5d.png)
3. ファイアーウォールによるアプリケーションの許可
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1952885/41c5e033-83e5-5071-3622-0dea9ee91010.png)
4. TouchDesignerとTouchDesigner099のプライベートとパブリックにチェックを入れる
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1952885/25d23840-7d96-5a5d-af55-06c032744cf0.png)
Googleプロジェクト管理：プロジェクト計画のベストプラクティス

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7c79c997-e4e4-7d71-3686-e01b7badaa3c.png" width="800">

# プロジェクト計画のベストプラクティス

優れたプロジェクト計画を構築するための5つのベストプラクティスを説明します。

1. プロジェクトの成果物、マイルストーン、タスクを慎重に確認する
1. 計画を立てる時間を確保する
1. 避けられないこと（物事がうまくいかないこと）を認識し計画する
1. 好奇心を持ち続ける
1. 計画を支持する

## 1.プロジェクトの成果物、マイルストーン、タスクを慎重に確認する

開始フェーズでは、プロジェクトのゴール、スコープ、成果物など、プロジェクトに関する重要な情報を記載したプロジェクト憲章を作成したことを思い出してください。そして、計画フェーズに入ると、より詳細な計画が立てられるようになります。

プロジェクトの目標を達成するために何をすべきか、あなたとあなたのチームが明確に把握できるように、すべての成果物をマイルストーンとタスクに分解する必要があります。あなたの計画は、小さなタスクの一つひとつを完了させることを中心に展開されるため、この部分を正しく理解するために時間をかける必要があります。

## 2.計画を立てる時間を確保する

プロジェクトのライフサイクルの中で、計画が独立したフェーズであるのには理由があります。特に、複数の成果物がある大規模なプロジェクトでは、時間を要するプロセスです。計画を立てることで、あなたやあなたのチームは、一定の時間内に何ができて何ができないかを現実的に考える時間ができます。

あなたは機械ではありませんし、チームメイトも同じです。一人の人間が与えられた時間内にできる仕事の量には限界があります。「時間見積もり」や「キャパシティプランニング」などの戦略を使えば、プロジェクトにかかる時間やマイルストーンを達成できる時期を、あなたとチームが現実的に把握するのに役立ちます。

また、プロジェクトが計画通りに進むことはほとんどないため、バッファー時間を確保することも重要です。プロジェクトの後半になると、最初にタイミングに関する柔軟な計画を立てておいたことに感謝することになるでしょう。

## 3.避けられないこと（物事がうまくいかないこと）を認識し計画する

どんなに綿密な計画を立てても、プロジェクトには予期せぬ挫折や衝突がつきものです。すべての問題を計画することはできませんが、チームは最も起こりそうなリスクを特定し、その ***<font color="MediumBlue">リスクを防止または軽減するための計画</font>*** を作成することができます。またバッファーは、進捗の遅れに関連する問題を軽減するのに役立つツールです。

## 4.好奇心を持ち続ける

あなたはプロジェクト全体では唯一の専門家かもしれませんが、プロジェクトのすべてのタスクの専門家である可能性は極めて低いでしょう。だからこそ、計画フェーズでチームメイトと一緒になって、 ***<font color="MediumBlue">たくさん質問</font>*** することが大切なのです。チームメイトの仕事について質問することで、プロジェクトにおける彼らのタスクについてより深い洞察を得ることができます。

また、チームメイトとの対話を重ねることで、 ***<font color="MediumBlue">お互いの信頼関係</font>*** を築くことができます。プロジェクトを円滑に進めるためには、ステークホルダーやベンダーの期待、優先順位、リスク評価、コミュニケーションスタイルなどを理解することも重要です。例えば、ステークホルダーには、プロジェクトの計画についてどのように報告すればよいか、ベンダーには、プロジェクトの仕事を完了するためにどのような準備が必要かを尋ねるとよいでしょう。

## 5.計画を支持する

計画をどのようにまとめるかを決めるとき、いくつかの質問を自分に投げかけるとよいでしょう。

- あなたが計画作成に使用したツールをチームメイトが使えるかどうか？
- その情報は、ステークホルダーにとって十分に明確か？
- この計画を単一の真実の情報源として使用することで、チームとステークホルダーがプロジェクトに関する情報を見つける必要があるときに、時間とエネルギーを節約することができますか？

これらの質問に対する答えが「イエス」であれば、あなたは正しい道を歩んでいます。

プロジェクト計画についてチームメンバーや利害関係者の支持を得るには、それを支持しましょう。この計画を推進することが、なぜチームにとって重要なのか、その理由を説明しましょう。そうすることで、チームメイトが計画を維持し、 ***<font color="MediumBlue">定期的に更新</font>*** するようになる可能性があります。
[Terraform] [GCP] [CloudSQL] 高可用性構成のインスタンスを作成する（レガシーな高可用性から移行する）

# GCP CloudSQL の高可用性について
`CloudSQL` インスタンスでは、高可用性向けに構成することができます。

これまでは、`failover replica`インスタンスを使用していました。
新しい構成では `failover replica` を使用しません。
以下のような `terraform` の設定は不要となります。
```terraform
resource "google_sql_database_instance" "replica" {
  name                 = name
  database_version     = "MYSQL"
  master_instance_name = google_sql_database_instance_name
  region               = region

  settings {
  ...
  } 

  replica_configuration {
    failover_target = true
  }
}
```
# 修正内容
高可用性を持つインスタンスを作成するには、以下のように設定します。

```terraform
resource "google_sql_database_instance" "mysql_instance_ha" {
  name             = "mysql-instance-ha"
  region           = "asia-northeast1"
  database_version = "MYSQL_8_0"
  settings {
    tier              = "db-f1-micro"
    availability_type = "REGIONAL"
    backup_configuration {
      enabled            = true
      binary_log_enabled = true
      start_time         = "20:55"
    }
  }
}
```

以下の設定をすることで、インスタンスのアベイラビリティタイプが「REGIONAL」になり、インスタンスは同じリージョン内で高可用性を提供するようになります。
```terraform
availability_type = "REGIONAL"
```
環境ごとに設定を変えたい場合は以下のようにすると良いでしょう。
```terraform
availability_type = var.environment == "production" ? "REGIONAL" : "ZONAL"
```

また、すでにレガシー構成で`failover replica`インスタンスを作成している場合は、以下の設定を追加して削除してあげましょう。
```terraform
deletion_protection =  "false"
```

# インスタンスの高可用性を確認する
インスタンスの可用性が高いことを確認するには、以下のコマンドを実行します。
```bash
gcloud sql instances describe INSTANCE_NAME
```
出力には、`availabilityType` が `REGIONAL` であることが示されます。



# 参考記事

https://cloud.google.com/sql/docs/mysql/configure-ha
ROS2のGazeboのLaserセンサでgpu_rayを使う


ROS2のGazebo環境でLaserセンサのシミュレーションをGPUを使って高速化する方法のメモ


## GazeboがGPUを使える状態にする

まずNvidia ドライバをインストールしてGazeboがGPUを使える状態にしておく

GazeboがGPUを使えるようにする設定方法はこちら
（Geforce RTX3050Ti laptop , Nvidia ドライバ 5.25環境で動作確認した）

https://qiita.com/porizou1/items/f6f66f830759bce3a4db

gazebo を起動したあとにnvidia-smiコマンドでGazeboがGPUを使っているか確認

```bash
gazebo
nvidia-smi
```

## sensor typeをrayからgpu_rayに変更する

ロボットのモデルを定義しているSDFファイルの中でLaser Sensorの設定する部分で`type`を`ray`から`gpu_ray`に変更する。
以下はturtlebot3_gazeboパッケージにあるmodel.sdfファイルを変更する例。
plugin部分はそのままでよい。

```xml:model.sdf
-      <sensor name="hls_lfcd_lds" type="ray">
+      <sensor name="hls_lfcd_lds" type="gpu_ray">
        <always_on>true</always_on>
        <visualize>true</visualize>
        <pose>-0.032 0 0.171 0 0 0</pose>
        <update_rate>5</update_rate>
        <ray>
          <scan>
            <horizontal>
              <samples>360</samples>
              <resolution>1.000000</resolution>
              <min_angle>0.000000</min_angle>
              <max_angle>6.280000</max_angle>
            </horizontal>
          </scan>
          <range>
            <min>0.120000</min>
            <max>3.5</max>
            <resolution>0.015000</resolution>
          </range>
          <noise>
            <type>gaussian</type>
            <mean>0.0</mean>
            <stddev>0.01</stddev>
          </noise>
        </ray>
        <plugin name="turtlebot3_laserscan" filename="libgazebo_ros_ray_sensor.so">
          <ros>
            <!-- <namespace>/tb3</namespace> -->
            <remapping>~/out:=scan</remapping>
          </ros>
          <output_type>sensor_msgs/LaserScan</output_type>
          <frame_name>base_scan</frame_name>
        </plugin>
      </sensor>
    </link>
```

ROS1では通常の`libgazebo_ros_laser`とGPUを使った`libgazebo_ros_gpu_laser`の2つのpluginがあったが、
ROS2では`libgazebo_ros_ray_sensor`という1つのpluginに統合されているようである。



# 参考

https://qiita.com/srs/items/18291a49cbb278525b47
Googleプロジェクト管理：ガントチャート

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7c79c997-e4e4-7d71-3686-e01b7badaa3c.png" width="800">

# ガントチャートとは

良いプロジェクト計画とは、プロジェクトのすべてのタスクとその所有者、そしていつまでに完了させなければならないかを記した明確なスケジュールを指します。プロジェクトのスケジュールが決まったら、スプレッドシートやAsanaなどのツールを使って、そのスケジュールを中心にしっかりとした計画を立てることができます。これらのツールの前に、プロジェクトスケジュールの作成について説明しましょう。

プロジェクトのスケジュールを作成するのに便利なツールはたくさんありますが、ここではGoogleで時々使っているガントチャートと呼ばれるものに焦点を当てましょう。

***<font color="MediumVioletRed">『ガントチャートとは、プロジェクトのスケジュールを示す横長の棒グラフのこと』</font>***

では、なぜプロジェクトマネジメントに携わる人たちがこのチャートを重宝したのだろうか。それは、プロジェクトのタスクを視覚的に表現し、誰がそのタスクの責任を負うのか、いつまでにそのタスクが完了するのかを明確に示したものだからです。多くの人にとって、指示書に基づいた視覚的な補助は、自分がすべき仕事、それをいつまでに完了させるか、個々の仕事がプロジェクトの他の仕事とどのように関連しているかを理解し、総合的に判断するのに役立つ方法となるのです。ガントチャートは、ほとんどカレンダーに似ています。各タスクの開始日と終了日が表示され、それぞれのタスクにどれだけの時間が割かれているかがバーで表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/3ee1c6bb-c525-e9e7-1d37-004e4b6643bd.png" width="800">

## ガントチャートの項目

- タスクのタイトル
- タスクの所有者
- 開始日
- 期限
- 期間
- タスクの完了率

これらは、WBSで事前に特定したタスクとマイルストーンをリストアップするのに最適な場所です。

- プロジェクトを最初から最後まで完了するのに必要な週数
    - 特定のタスクが実行される日付を表す棒グラフが表示されます。とてもすっきりしているでしょう？


[※ガントチャートのサンプルはこちら][ref1]

[ref1]: https://s3.us-west-2.amazonaws.com/secure.notion-static.com/24407933-b088-4766-ba61-08420ab0b616/Activity_Template__Gantt_chart_-_Gantt_Chart.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20230117%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20230117T231346Z&X-Amz-Expires=86400&X-Amz-Signature=64eb266494a1b9b7f26b778249e2459c612a84c737077a5f4d1e80516c2d5618&X-Amz-SignedHeaders=host&response-content-disposition=filename%3D%22Activity%2520Template_%2520Gantt%2520chart%2520-%2520Gantt%2520Chart.pdf%22&x-id=GetObject

# スプレットシートを使う

プロジェクトのすべての文書を1つのスプレッドシートで管理することで、時間を節約し、全員が整理され、情報を求めて電子メールを検索する負担を軽減することができます。あるいは、デジタル文書を使って、すべての関連文書をリンクさせることもできます。

プロジェクトスケジュールはプロジェクト計画の中心的な要素ですが、スプレッドシートの別のタブに、

- RACIチャート
- プロジェクトチャーター

など、計画に含めたい他のドキュメントを格納したり、リンクさせたりすることができます。また、

- リスクマネジメント
- コミュニケーション

に関する計画もここに含めることができます。

単純なプロジェクトであれば、表やタスクのリスト、所有者、期日、他の関連する計画文書へのリンクなどが記載されたデジタル文書の方が、チームの反応がよいかもしれません。あるいは、カードを使ってタスクの進捗を追跡し、視覚化するカンバンボードが最適かもしれません。

選択したツールが何であれ、計画にプロジェクトの目標、タスク、所有者、開始日と終了日、関連する計画文書が含まれていれば、全員が同じ見解を持つことができるようになるのです。

#### Spreadsheet templates

- [Smartsheet: Project Plan Templates for Microsoft Word](https://www.smartsheet.com/content/project-plan-templates)
- [Smartsheet: Project Plan Templates for Google Sheets](https://www.smartsheet.com/free-google-docs-templates-google-timeline-templates)
- [Google Project Plan Timeline Template](https://docs.google.com/spreadsheets/d/1TauRTFipsWDWGqaw6tmqJeknKhVI5IjR5jJvBfVzfGw/template/preview)
- [Microsoft Gantt Chart Template](https://templates.office.com/en-us/simple-gantt-chart-tm16400962)
視床は意識の座足りえるのか？

# 
**視床が意識の座としか考えにくい理由を追加でいくつか上げるよ**

# 今までのまとめ

視床が脳の構造的に意識の座の第1候補なのは次の理由だ。

1. 実際に物理的に脳の神経の入力(感覚器)と、出力(筋肉等)への重要な中継地点。神経の繋ぎ替えを行うハブ。まさにインターネットに繋がるハブと同様の部分であり、特に意識に関わる情報が全て集まる。

2.  基本的な脳機能は備えており、特に大脳機能がほぼない赤ちゃん時代の脳機能の中心。

2.  大脳に処理を促す「注意」の信号を作り、大脳に常時クロックのように供給し、大脳と協調して動作している。

2.  神経細胞の集合体であり、内部的にも強く接続されていて、大脳や感覚器からの情報が内部で拡散する経路がある。基本動作として発振を繰り返しており、時空カオスが発生している。

2.  ただ情報量は大脳で扱う全情報から言えば当然多すぎ、解剖学的にも大脳からは基本的に「結果」情報しか受け取っていない。

2.  動作としてはDNNの「VAE」からなる「Latent Diffusion Model」と似た形で動作している事が想定される。(ここはまだ説明記事は書いてない)

2.  Latent(潜在変数)は、このモデル内では実際に抽出された言葉の「概念」であり、概念自体の演算を何度も繰り返す事で新たな概念を生む。この処理は乱数で初期化されており、唯一のものとなる。特に時空カオスでは乱数は実カオスであるため、他の系では同じ結果は原理的に得られない。世界における唯一無二性が担保される。量子コピー禁止則と同様なことにも注意。

2.  時空間の量子もつれが意識の元だとしたら、視床の大きさはクオリア保持には十分すぎるほど巨大な神経細胞群と量子系であり情報処理的にも矛盾しない。

それに今回は、以下に示す定性的な性質が意識の視床発生仮説を定性的に裏付けることを書こう。

# クオリアは選択され絞られている

これを説明する時に、「両眼視野闘争」という現象がひとつの実験的な証拠になると思ってる。

両眼視野闘争は、以下のような図形で誰でもすぐ確かめられる。

 ![Screenshot_2023-01-18-07-24-43-526-edit_com.android.chrome.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/50dfcff1-0106-6373-3de5-4c457536b00e.jpeg)

これを両眼視すると、赤と緑のエリアは自分の意識の中で色んなエリア事にどんどん入れ替わって安定しない。まあこれはよく知られた現象だけど、これが大脳側の情報処理がどうなってるのか、は最近まで分からなかった。そして、実験として出てきたのは、「自分の意識で見えてない図柄の所も大脳では処理されてる」って言う事。

これは不思議だよね。情報処理は両眼分ちゃんとされてるが、意識には選択されて出てくる。

つまり、大脳処理の結果はどこかでエリアとして「セレクト」されてる、と言う事がわかるし、また処理中の情報が実際見えてる訳では無い、と言うことが明確。

だから大脳の視野エリアが画像を見ているのではなく、大脳の処理結果が絞られてどこかでクオリアになってる、という事。

で、それはどこか。まあ、物理的な接続から言えば視床は大きな候補だ。そして、大脳の視覚領野は生まれた時にはまだ発達してなくて、目が見えない。視床は機能している。だから、大脳のニューラルネットワークが学習して、結果を視床に返すようになった時に視床がそれを取り込んでクオリアにしてると考えれば辻褄がピッタリ合う。大脳が見てるんなら、両目の画像を選択したものが認識されはしない。また、なぜ「劇場の映像」のように見えるのか、誰が映像を作り、誰が見てるのか、の明確な回答も得られる。つまり、大脳が映像を作り、意識の座の視床が見てる、のだ！

# 意識の時間と大脳の信号のズレ

詳細に記載されている本

https://books.google.co.jp/books/about/%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%89_%E3%82%BF%E3%82%A4%E3%83%A0.html?id=ZrBHzgEACAAJ&source=kp_book_description&redir_esc=y

これも有名な実験なんだけど、自分がものを動かしたい、と思った時間より、大脳が活動し始めたタイミングの方が数百ミリ秒だけど早い、という問題があって、意識受動仮説の根拠になったりしてる。タイムマシンか？とか。

このパラドックスに見える現象は、視床が大脳の結果を受け取ってる、とみなせばこれもよくわかる。

つまり大脳は動こうとする、「思わず＝意識なく」動く信号が作られる。そしてその信号は視床を経由して筋肉に行こうとする。

ところがここで視床はそれを見て動きに干渉して「止められる。」視床のLatentなネットワークが認知してその思わず、な行動が止められるわけだ。

大脳は生物進化的に言っても完全に後付けの白紙のDNNだ。学習で認識や動きを学んでるが、それを最後に外部に送るのは視床だ。これはこの実験的にも意識は信号を止められる、事が分かっていて、それも不思議な話だったけど、大脳が無意識的に動こうとして筋肉パルスを発生し、視床はそれを他の信号(例えば止めろ！と言う考えとか指示とか)に基づいて筋肉への動きが止まる、と言うまさに実験通りの動きになる。つまり視床での意識発生説は、このパラドックスを完全に解決するって事だ。

またこの説で「受動意識仮説」もある意味否定できる。観察してるだけでなく、意識は出力に介在している。意識がコントロールしている、としても問題がないことが分かる。実際に視床が「Latent Diffusion Model」で動作しているなら意識処理の結果は粗いものだとはいえ、StableDiffusionが絵を描くVAEの手前で概念の計算から絵の素案を作っている。つまり意識内容の通りに大脳は動作している。今回の実験のように早い信号の場合には「コントロールが間に合わない」から止めることしか出来ないんだ、と極めて因果律的に正常な考えに納まってしまう。

まずは2点で少ないけど、言ってる事は普通に考えても矛盾は見つからないし、脳とクオリアの関係としてもかなり重要な話と思ってる。まだあるからまた随時追加しますよ😊🤟
CISOのための情報セキュリティ戦略～危機から逆算して攻略せよ～


2023年1月21日、「[CISOハンドブック](https://qiita.com/drafts/1e84277289a9b57d03eb/edit)」の第２弾として、「[CISOのための情報セキュリティ戦略～危機から逆算して攻略せよ～](https://gihyo.jp/book/2023/978-4-297-13294-1)」が出版される運びとなりました。

本書は、“セキュリティ施策をデバッグする”をテーマに、「P. プロファイル（資料などの収集・整理）」、「E. 机上演習」、「S. 事件・事故の公表」、「F. フィードバック」の４つの視点から、ソフトウェア開発におけるウォークスルーのようにセキュリティ施策を確認し、デバッグする手順を体系化したものです。

「机上演習なんて甘ちょろい」という見方もあると思いますが、机上演習は紛失や盗難、ランサムウエアに対する身代金の支払いの判断、といった、ペネトレーションテストでは実施できないシナリオを扱えるだけではなく、「S. 事件・事故の公表」というアウトプットを設定することで、経営陣、事業責任者、法務、広報といった社内の関係者が同じ土俵で議論すること、つまり技術論に留まらない、組織としての議論が見込めるメリットがあります。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/46b40fcd-3790-f5d9-c15c-5bc902509312.png)| CISOのための情報セキュリティ戦略 ～危機から逆算して攻略せよ～ <br>高橋正和（著）JNSA CISO支援ワーキンググループ（協力）<br><br>出版社 : 技術評論社<br>発売日 : 2023/1/21 <br>単行本（ソフトカバー） : 200ページ<br>ISBN978-4-297-13294-1 C3055<br>https://gihyo.jp/book/2023/978-4-297-13294-1|
| :----: | :---- |


※ 本記事は、JNSAメールマガジンに[第253号：セキュリティ施策をデバッグする「CISOのための情報セキュリティ戦略」のご紹介（2023.1.6配信）](https://www.jnsa.org/aboutus/jnsaml/ml_bk253.html)として寄稿した内容を再掲したものです。

# 概要
本書の執筆を始めたきっかけは、「CISOハンドブックは分った気になるけど、使おうと思うと使えないのだよね」というWGメンバのコメントでした。自身が関わった本なのだから、読書百遍で分かるはず！と言いたいところですが、CISOハンドブックは、業務を進める際に必要なセクションを参照する構成なので、流れが掴みにくいかもしれません。実際のセキュリティ業務とCISOハンドブックを結びつけることを目指して、2018年に公表した「[インシデント対応ワークショップ ](https://www.jnsa.org/result/2018/act_ciso/)」  をベースに、事件・事故のシナリオを使った机上演習としてまとめることにしました。


蕎麦屋の出前の伝統どおり、すぐにでも書けるかと書き始めましたが、「CSIRT向けの内容とどこが違うのか？ATT&CKじゃダメなのか？」というWGメンバのコメントで作業が凍り付きます。この疑問は、本書の本質に関わるようで、査読をいただいた方々からも、類似する指摘をいただく事となりました。
本書は、検証の対象を技術やシステムではなく、事業視点としている点に特徴があります。端的には、フォレンジックなどの具体的な技術ではなく、誰が事業継続などの判断をすべきか、何を公表すべきなのか、被害者にどう対応すべきか、処々の判断基準はどうあるべきか、といった内容を取り上げています。また、この点を強調するため、事件・事故を展開した例を掲載し、また、ワークショップを行うための仮想的な会社の「P. プロファイル」を掲載しました。

セキュリティ対策を進める上で、ISMSに代表される国際的なベストプラクティスが重要な役割を果たしています。しかし、ベストプラクティスの遵守が、必ずしも適切なセキュリティ施策になっているとは限らず、事業戦略や経営戦略に沿ったものとなっているとも限りません。
本書は、企業が自らの手で、事業視点・経営視点からセキュリティ施策を検証し、関係者が課題と責任を共有する手段を提案しています。ユーザー企業が自社のセキュリティ施策を検証する際に、また、セキュリティベンダーがCISO視点からソリューションを提案する一助として、ご参照いただければ幸いに思います。

　CISO支援ワーキンググループでは、（原則）毎週月曜夕方にオンライン会議を開催しています。本書の内容だけではなく、業務上の課題や、国内外の最新動向などについてもディスカッションを行っています。現在は、本書をベースにしたワークショップの実施に向けて議論を進めているところです。
CISO業務に悩んでいる方、WG活動に興味を持っていただいた方、CISOハンドブックや本書に言いたいことがある方は、ぜひCISO支援ワーキンググループにご参加ください。新しいチャレンジをご一緒できると思います。


# 謝辞
最後になりますが、多くの専門家の皆様の知見とアドバイス、また様々な経験と機会を頂きました。執筆陣の力だけでは、ここまでの形にすることは出来なかったと思います。
ご協力を頂いた皆様に改めてお礼を申しあげます。
CTRL配列の母音のホームポジションを変更（仮） @hiyoctrl

こんにちは、Ctrl([@hiyoctrl](https://twitter.com/hiyoctrl))です。

https://qiita.com/hiyoctrl/items/70885ee39938b72dd657

今回はCTRL配列 - v2.0になりそうなアドバイスとアイデアを色々頂いたので記録しておこうと思います。

大岡俊彦さんの[大岡俊彦の作品置き場](http://oookaworks.seesaa.net/)のホームページの中で、[【配列】CTRL配列（仮）](http://oookaworks.seesaa.net/article/496993203.html)という形で言及いただいたので、コメントして少しお話しさせていただきました。

「Aは人差し指」という考え方を聞き、最初に自分が考えていたことと合致したため、思い切って左手手ホームポジションの母音を全て変更することにしたのです。

![ctrl_5 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608727/09b432aa-6358-717a-080c-87612ee306c3.png)

左手の小指から「AOEIU」だった順番を「EUOAI」に変更しました。

「や」「ゆ」「よ」については、コミュニケーションする中、けいならべという配列の[資料](http://web1.nazca.co.jp/kouy/keinarabe/siryou.html)というページを教えていただき、考え方に興味が湧いたので、ホームポジションを変更するタイミングで一緒に取り入れてみた形です。

けいならべでは、「や」「ゆ」「よ」を母音として含めるという記述があり、なるほどと思って新しく並び替えた左手の母音のホームポジションの「あ」「お」「う」の下に「や」「よ」「ゆ」という形で配置してみようと思いました。

しかし、「や」「ゆ」「よ」 を1キーで出力するというのが、どのような仕組みなのか全くわかりません。いつものxmodmapで変更するやり方で、kana_YAと設定しても、カタカナのヤが出るだけで変換に含まれてくれませんし、うまくいきません。 

WindowsだとIMEで簡単にできるものなのかな、と半ば諦めつつも情報収集をしていたら下記のページを発見したのです。

https://github.com/toriwasa/akanarabe/blob/main/akanarabe.txt

```
j	あ
i	い
k	う
o	え
l	お
```

上記を見ていたところ、これはQWERTY配列のまま入力すると「j」が「あ」で入力されるんだろうけど、どうなっているんだろう？と頭がこんがらがりました。 


http://web1.nazca.co.jp/kouy/keinarabe/jissou.html

そして、けいならべの上記のページを見ていたところ、Microsoft IMEの画像があり、同じように「j」が「あ」表示されているのを見て、ようやく理解できました。

なんのことはない。キーボードの英数字の配列、既存のローマ字入力の規則にとらわれず、自由にローマ字テーブルを変えれば良かったのです。

https://github.com/toriwasa/akanarabe/blob/main/akanarabe.txt

そして再度、上記のページを見ていて、これは使えると思ったのが下記の部分です。


```
a/	のー
```
上記を見て、ローマ字テーブルを変更する時に、記号を加えればさらに選択肢が広がると考えました。

![ctrl_5 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608727/09b432aa-6358-717a-080c-87612ee306c3.png)

そして普段、日本語の入力ではあまり使わない「\」「}」「{」を「\・や」「}・よ」「{・ゆ」に設定することで、1キーで「や」「よ」「ゆ」を打てるようになったのです。

あとは子音から「\・や」「}・よ」「{・ゆ」を経由して「しゃしゅしょ」などが入力されるようにローマ字テーブルを設定するだけで解決しました。

まだ試行錯誤している段階なので本決まりというわけではありませんが、方向性的にはとても良さそうです。

CTRL配列では、右手の親指を少し右にずらした位置にxがあるので小文字の入力は気にしませんでした。thの並びもスムーズですし、左手の親指のホームポジションの右側がwなので母音の小文字には困らないと考えたからです。 

現在は、小さい「っ」と「ん」を1キーで入力できるようにするとして、どのように配置すべきか悩んでいます...。

最後までお読みいただきありがとうございました！
【Discord.js】Discord.MessageEmbed is not a constructor

# エラー内容
``Discord.js``でボットを開発していたときの話。Embedオブジェクトを生成しようと、
```javascript
const template = new Discord.MessageEmbed()
```
としたら、
```
Discord.MessageEmbed is not a constructor
```
というエラー発生。
# 解決策
``v14``になってクラスの名前が変わったらしい。``MessageEmbed``から``EmbedBuilder``に変更すればよし。
```javascript
const template = new Discord.EmbedBuilder()
```
配列の要素数、配列の要素の表示、文字列分割

Python3で配列の要素数、配列の要素の表示、文字列分割のプログラムを実装しました

```Python3
    str = "Hello paiza"
    #スペース区切りの文字列を分割する
    array1 = str.split(' ')
    #配列の要素数を取得する
    num = len(array1)
    #ループ文で表示する
    for i in range(num):
        print(array1[i])
```

split関数で文字列を分割して配列に格納します。
len関数を使って配列の要素数を取得します
for文で配列の要素順に表示します。
未経験からエンジニアになる：OSを知ろう！

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はOS（オペーレーターシステム）について調べてみましょう！

![インスタスライド_202301031.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/a13c71b3-944f-871e-67ed-942ad08d99bb.gif)

# OSとは
OSとはOperatingSystemの略です
サーバーやPC等のコンピュータを動かすための基本ソフトウエアです。
一番最初に必ず入ってるいるソフトウエアです。

# OSの種類
１．Windows　
　Microsoftが販売しているOSです。

２．Mac 
　Appleが販売しているOSです。

３．Linux 
　オープンソースのOSです。

# OSのシェア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/e08c35a3-32ae-718c-6a56-7ed715fbc060.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/25e8a48e-3d51-37c1-6962-997e5bd8ff56.png)

# スマホOSのシェア
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/d48b5f12-95a7-b50b-5824-89242ee06833.png)
　
# OSのイメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/1283b230-3334-509e-c1b8-0017524a8b39.png)

# OSの役割
ハードウエアとアプリの間の存在

OSがある事で、
１．アプリはハードウエア依存の部分を気にせずに開発する事が可能

２．ボタンの動きや通信部分等の細かい部分はOSに任せられる

OSのお陰で効率的

# まとめ
ー　プログラム・アプリが動くには、OSが必要です。
ー　OSは色々な種類があります。
ー　スマホにもOSが入っています。

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
Amazon S3 Presigned URL トラブルシューティング

Amazon S3からオブジェクトをダウンロードしたり、アップロードしたりする際に使うgenerate_presigned_urlですが、いくつかはまりがちなポイントがあるのでまとめておきます。

## 前提
Presigned URLの生成はAWS LambdaからBoto3を用いて、こんな感じでやるパターンを想定します。
```python
import boto3
s3_client = boto3.client("s3")
upload_url = s3_client.generate_presigned_url(
    ClientMethod = "put_object",
    Params = {
        'Bucket': "sample-bucket",
        'Key': "folder/object.json",
        'ContentType': "image/png"
    },
    ExpiresIn = 300,
    HttpMethod = "PUT"
)
```

## トラブルシューティング
1. URLの有効期限が切れてないか
URLの有効期限、例では`300`は秒数です。デフォルトでは`3600`秒なので、1時間です。

1. Bucketが存在するか
このgenerate_presigned_urlはBucketが存在しなくても結果が返ってきます・・・
Bucketを変数で指定している場合など、特にBucket名をもう一度ログに出力するなどして確認してください。

1. アップロードやダウンロードの際のHTTPリクエストは`HttpMethod`と一致しているか
この場合`HttpMethod`にはPUTを指定していますから、実際にPresigned URLを使うときはPUTを使います。 CURLなら`curl -X PUT`です。PUT指定したのにPOSTしてるとかよくあるので確認してください。

1. `ContentType`が一致してるか
これもPresigned URLを使ってコンテンツをアップロードする場合など、Content-Typeが一致してないと受け付けません。
また、ワイルドカードContent-Type（`image/*`など）もうまくいきません。Content-Typeは明示してください。
Curlなら、`curl -H "Content-Type: image/png"`です。


1. S3 BucketにCORSの設定がされているか
    Presigned URLを使ってコンテンツをダウンロードしたり、アップロードする場合にも、そのBucketのCORSの設定が影響します。
    上記の例はPUTメソッドを使いますので、S3 BucketのCORSはPUTを許可してください。

    ```json
    [
        {
            "AllowedHeaders": [
                "*"
            ],
            "AllowedMethods": [
                "PUT"
            ],
            "AllowedOrigins": [
                "*"
            ],
            "ExposeHeaders": []
        }
    ]
    ```

1. Presigned URLを生成するLambda関数にS3へのアクセス権限があるかどうか
Presigned URLをLambda関数から生成する場合に、生成するLambdaのロールには、Assume Roleする関係上、S3へのアクセス権が必要です。
上記の例のように`put_object`を使う場合は書き込み権限が必要ですから、SAMのテンプレートを確認して、以下のようにS3へ権限が設定されているか`S3WritePolicy`確認してください。
SAMを使っていない場合は、個別にLambdaのロールを確認して、S3へのWriteがあるか確認する必要があります。

```yaml
  CreateUploadUrlFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: functions/create_upload_url
      Handler: handler.lambda_handler
      Runtime: python3.9
      Policies:
        - S3WritePolicy:
            BucketName: sample-bucket
```

## まとめ
Presigned URLが動くかは、特にcurlで確認してください。上記のコードを確認するCurlコマンドは
`curl -X PUT -H "Content-Type: image/png" -T uploadfile.png https://PRESIGNED_URL`です。

特にLambdaからBoto3を使う場合、LambdaにS3の権限が設定されてないことが原因だったりします。誰かの役に立ちますように。
Rustの生存期間

## ローカル変数の借用
- Rustコンパイラは、プログラム中の全ての参照型に対して、その参照の使用方法によって生じる制約を反映した生存期間（lifetime）を割り当てる
    - 生存期間とは、プログラム実行中のある参照が安全に利用できる期間

### 例
```rust
fn main() {
    let r;
    {
        let x = 1;
        r = &x;
    }
    assert_eq!(*r, 1);
}

```

### &xの生存期間

![x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115121/5ace1720-1a58-995d-240a-2324b6b1d4e4.png)

### rに格納された値に必要な最低限の生存期間

![y.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115121/b2e7bcb1-bc43-5d82-83c4-476340dc539a.png)


### エラーになる原因

![z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115121/6687d32b-8225-1a82-c5b3-684064a0e6c6.png)


### 改善例

```rust
fn main() {
    let x = 1;
    {
        let r = &x;
        assert_eq!(*r, 1);
    }
}

```

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115121/b6353099-4d99-06fd-1116-aa63392371bc.png)


### diff
```diff
--- 改善前
+++ 改善後
@@ -1,8 +1,7 @@
 fn main() {
-    let r;
+    let x = 1;
     {
-        let x = 1;
-        r = &x;
+        let r = &x;
+        assert_eq!(*r, 1);
     }
-    assert_eq!(*r, 1);
 }
```

## 仮引数として参照を受け取る場合
- デフォルトでは生存期間の記述は省略されている
    - ``` fn f<'a>(p: &'a i32) ```
    - この関数が「任意の生存期間'a を持つ i32 への参照 」を引数として取ることを意味 
- staticの生存期間はプログラムの開始から終了まで
    - 引数の生存期間を合わせるために明示的に生存期間を指定する必要がある場合がある

```rust:main.rs
static mut STASH: &i32 = &128;

fn f(p: &'static i32) {
    unsafe {
        STASH = p;
    }
}

fn main() {
    unsafe {
        println!("{}", STASH);
        f(&256);
        println!("{}", STASH);
    }
}

```

```sh
$ cargo run
128
256
```

## 参照を含む構造体

```rust:main.rs
struct S<'a> {
    r: &'a i32,
}

struct D<'a> {
    s: S<'a>,
}

fn main() {
    let x = 10;
    let s = S { r: &x };
    assert_eq!(*s.r, 10);

    let d = D { s };
    assert_eq!(*d.s.r, 10);
}

```

## 個別の生存期間のパラメータ
- s.xの生存期間とs.yの生存期間が異なるので、異なる生存期間を設定する必要がある
    - 改善前のコードでは r = s.x により x の方が長い生存期間となっている
- 最も単純な定義から始めて、コンパイルできるまで、徐々に制約を緩めていくアプローチがよい
    - 安全でない限りコードがコンパイルできないので、問題が明らかになるまで待つで問題ない

### 改善前
```rust:main.rs
/// xとyに対して同じ生存期間を設定
struct S<'a> {
    x: &'a i32,
    y: &'a i32,
}

fn main() {
    let x = 10;
    let r;
    {
        let y = 20;
        {
            let s = S { x: &x, y: &y };
            r = s.x
        }
    }
    println!("{}", r);
}

```

### 改善後

```rust:main.rs
/// xとyに対して異なる生存期間を設定
struct S<'a, 'b> {
    x: &'a i32,
    y: &'b i32,
}

fn main() {
    let x = 10;
    let r;
    {
        let y = 20;
        {
            let s = S { x: &x, y: &y };
            r = s.x
        }
    }
    println!("{}", r);
}

```
ガウス・ルジャンドル法によるπの算出 python3

ガウス・ルジャンドル法によるπの算出です。
rubyで書かれたサンプルプログラムをpythonに移植しました。
mpmathの計算桁数を1000にしてます。
πの近似値を一桁ずつ延々と無限ループで出力しますが、精度は、100000桁までチェックしました。

```pi.py
#!/usr/bin/python3
import mpmath
import sys
k, a, b, a1, b1 = 2, 4, 1, 12, 4
mpmath.mp.dps=1000

f=0
while(True):
  # Next approximation
  p, q, k = k*k, 2*k+1, k+1
  a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
  # Print common digits
  d = a / b
  d1 = a1 / b1
  while(d == d1):
    print (int(d),end='')
    sys.stdout.flush()
    if f==0:
      print(".",end='')
      f=1
    a, a1 = 10*(a%b), 10*(a1%b1)
    d, d1 = a/b, a1/b1
```

# ruby で書かれたパッケージプログラム

```

#!/usr/bin/ruby
k, a, b, a1, b1 = 2, 4, 1, 12, 4
 
while 1
  # Next approximation
  p, q, k = k*k, 2*k+1, k+1
  a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
  # Print common digits
  d = a / b
  d1 = a1 / b1
  while d == d1
    print d
    $stdout.flush
    a, a1 = 10*(a%b), 10*(a1%b1)
    d, d1 = a/b, a1/b1
  end
end
```

rubyとは日本人が作ったコンピュータ言語であり、宝石であり、日本語で紅玉と言います。紅玉とは宝石ルビーの和名であり、林檎の一種であり、林檎の紅玉は、英語でJonathanと言います。
インターネットの仕組み

<h4>・インターネットの仕組み</h4>
　インターネットは、コンピューターのネットワークによって作られるものです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850098/72814b1f-1de0-a64f-4b32-05083eda2f84.png" width=50%>

　上の図のように、PCやスマホなどを<b>ルーター</b>につなげることによってインターネットに繋がります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850098/d7379686-7d99-46c4-491c-c1cd498c2683.png" width=80%>

　そしてこの上の図のように、様々な人がインターネットに繋ぐことによってコンピューターネットワークができます。

<h4>・IPアドレスとは</h4>
　　<b>IPアドレス</b>とは、インターネットの住所のようなものである。IPアドレスには<b>グローバルIPアドレス</b>と<b>プライベートIPアドレス</b>の2種類がある。

　<h5>・グローバルIPアドレスとは</h5>　　<b>グローバルIPアドレス</b>とは、ルーターが持つIPアドレスのことである。このIPアドレスによってインターネットに接続し、さらにどこのルーターによって繋がっているのかがわかる。

　<h5>・プライベートIPアドレスとは</h5>　　<b>プライベートIPアドレス</b>とは、デバイスが持つIPアドレスのことである。<br><br><br>




【参考】
・この一冊で全部わかるWeb技術の基本　著：小林恭平等
https://www.amazon.co.jp/dp/4797388811

・図解でやさしくわかるネットワークのしくみ超入門　著：網野衛二
https://www.amazon.co.jp/dp/4297128527
[Swift UI]ダークモードを無効にする方法


結論から伝えるとinfo.plistにAppearanceをLightで指定してあげればOKです

![スクリーンショット 2023-01-18 3.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/b8b18473-22ae-6582-e5ed-414cab7b649c.png)

User Interface StyleをLightで指定してあげればOKって他の記事で書いてあって試したんですが、何も変わらず。

別の記事を探したところAppearanceを変更する必要があるとのことだったので変更したら無事にダークモードを無効にできました

記事を探すのはいいけど、記事の内容が必ず正しいって思って修正すると痛い目を見るのでほどほどにググり力を身につけながら頑張っていきましょう

どなたかの参考になれば幸いです。
ページネーション

# ページネーションとは
- ページを複数に分割することができるもの
- レイアウトを調整したるするのに便利
- グーグルのページなどの下部に表示されているやつ
![スクリーンショット 2023-01-18 3.29.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2904183/aea865c8-9b12-0c31-6df0-63d9048125ab.png)


# 実装方法
- kaminariというgemを使用する

```:Gemfile
gem 'kaminari','~> 1.2.1'
```

```
$ bundle install
```

- 設定ファイルを作成する
下記コマンドで作成されたフォルダの中にページネーションの部分のhtmlが記述されているので変更を行う際は適宜修正する
```
$ rails g kaminari:config
```

- kaminariのテンプレを作成
```
$ rails g kaminari:views default
```

- controllerで、ページネーションを表示させたいデータに.page(params[:page])を追加する
```
def index
    @posts = Post.page(params[:page])
end
```

viewでページネーションを表示させたいところに<%= paginate @posts %>を追加します。
```
<h1>投稿一覧</h1>
<ul>
 <% @posts.each do |post| %>
   <li><%= post.content %></li>
 <% end %>
</ul>
<%= paginate @posts %>
```
以上でページネーションを実装できる。

- 1ページに表示するレコード数はデフォルトで25件ですが、これを指定したレコード数にしたい場合は、先程作成したファイルに以下１文を追加する（１ページ６件に指定したい場合）
```:config/initializers/kaminari_config.rb
# frozen_string_literal: true

Kaminari.configure do |config|
  # config.default_per_page = 25
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
  # config.max_pages = nil
  # config.params_on_first_page = false
  config.default_per_page = 6  #ここを追加
end
```

# デザインを変更したい場合
- Gemfileに以下１文を追記
```:Gemfile
  gem 'bootstrap4-kaminari-views'
```

```
$   bundle install
```

paginateヘルパーに以下の以下の記述をする。
```
  <%= paginate @posts, theme: 'twitter-bootstrap-4' %>
```
↓このような見た目にできます
![スクリーンショット 2023-01-18 3.51.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2904183/79be8635-eaa5-39f6-a512-4ef73cd2807d.png)

# ラベルのアイコン化
- ラベルをアイコン化してシンプルなデザインに変更
- Font Awesomeを読み込ませて下記を追加する
```:config/locales/ja.yml
ja:
  views:
    pagination:
      first: <i class="fas fa-angle-double-left"></i>
      last: <i class="fas fa-angle-double-right"></i>
      previous: <i class="fas fa-angle-left"></i>
      next: <i class="fas fa-angle-right"></i>
      truncate: "..."
```

このような見た目になる。
![スクリーンショット 2023-04-23 18.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2904183/9e7bfe19-cb06-4762-5b97-0c7a63ee2c07.png)
ffmeg でYouTube ショート動画 9:16 にリサイズする

ffmpeg って、意外といろいろ書けるんですね!

[👉 YouTube の推奨するショート動画 9:16 を ffmpeg で作成する](https://android.benigumo.com/20230116/youtube-shorts-ffmpeg-resize/)

```bash
w=720
h=1280

# pad
ffmpeg \
  -i input \
  -vf "pad='max(iw,ih*($w/$h))':ow/($w/$h):-1:-1,scale=$w:$h" \
  output

# crop
ffmpeg \
  -i input \
  -vf "crop='min(iw,ih*($w/$h))':ow/($w/$h),scale=$w:$h" \
  output
```
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/cc1c97b0-bab8-b14c-d67a-e3a9a722e36a.gif)
[👉 YouTube の推奨するショート動画 9:16 を ffmpeg で作成する](https://android.benigumo.com/20230116/youtube-shorts-ffmpeg-resize/)
AWS RDS（Aurora MySQL）のスロークエリ発生件数をSlackに通知する

# 前提条件
RDSのスロークエリをCloudWatch Logsに出力している。
awscli v2、jq、curl、sed、catが使用できる環境である。
IAMロール等で、awscliからCloudWatch Logsにアクセスする権限が付与されている。
SlackのIncoming WebHooksのURLを取得済みである。

# この記事について
「AWS RDS（Aurora MySQL）のスロークエリ発生件数をSlackに通知する」Bashスクリプトの紹介です。

こんな通知が飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103963/72a31f05-560a-ad37-8419-eb5df4ed5eaf.png)

リンクから、CloudWatch Logsへアクセスする事ができます。
cron等で、日次実行する事を想定しています。

# スクリプト（Bash）
CloudShellで動作確認をしています。

```
#!/bin/bash

#メッセージを保存する一時ファイル
TEMP_MESSAGE_FILE=$(mktemp templogfile.XXXXXX)

# Slack送信用の設定
COLOR='#32CD32'
WEBHOOK_URL='SlackのIncoming WebHooksのURL'

# CloudWatch Logsから、スロークエリのログを、「日本時間：昨日の00:00～23:59までの期間」で取得
REGION='ap-northeast-1'
LOG_GROUP='スロークエリのロググループ名（例：/aws/rds/cluster/gotchamall-prd/slowquery）'
YESTERDAY=`TZ=Asia/Tokyo date -d '-24 hour' '+%Y-%m-%d'`
START_TIME=`TZ=Asia/Tokyo date --date="${YESTERDAY} 00:00:00.000" +%s%3N`
END_TIME=`TZ=Asia/Tokyo date --date="${YESTERDAY} 23:59:59.999" +%s%3N`

# ログストリーム名を取得
aws logs describe-log-streams --log-group-name ${LOG_GROUP} | jq -r ".logStreams[] | .logStreamName" | while read LOG_STREAM; do
    # ログをタブ区切りで取得
    aws logs filter-log-events --log-group-name ${LOG_GROUP} --log-stream-names ${LOG_STREAM} --start-time $START_TIME --end-time ${END_TIME} \
        | jq -r '.events[] | [(.timestamp/1000+32400 | strftime("%Y-%m-%d %H:%M:%S")), .message] | @tsv' \
        | sed 's/\\n$//' \
        > ${TEMP_MESSAGE_FILE}

    # Slackに通知するための各設定
    # スロークエリの件数
    COUNT=`cat ${TEMP_MESSAGE_FILE} | wc -l`

    # タイトル
    TITLE="LOG STREAM: ${LOG_STREAM}"

    # CloudWatch LogsのURL
    URL="https://${REGION}.console.aws.amazon.com/cloudwatch/home?region=${REGION}#logsV2:log-groups/log-group/"
    URL="${URL}${LOG_GROUP//\//\$252F}/log-events/${LOG_STREAM}\$3FfilterPattern\$3D\$26start\$3D${START_TIME}\$26end\$3D${END_TIME}"

    # 本文
    MESSAGE="DATE:${YESTERDAY}\nCOUNT: ${COUNT}\n${URL}"

    #Slack Incoming WebHooks 送信
    curl -s -S -X POST --data-urlencode \
      "payload={ \
        \"attachments\": [ \
          { \
            \"pretext\": \"${TITLE}\", \
            \"color\": \"${COLOR}\", \
            \"text\": \"${MESSAGE}\" \
          } \
        ] \
      }" \
    ${WEBHOOK_URL}
done

# 後始末
trap "
  rm ${TEMP_MESSAGE_FILE}
" 0

```

# 参考元
https://qiita.com/neruneruo/items/eac2ab18686aba0fe483
https://blog.serverworks.co.jp/2022/04/07/163722
https://mariyudu.hatenablog.com/entry/2019/06/29/150937
【Android】onCreate()の外側でViewModelを使いたい場合の初期化方法

# はじめに

公式のドキュメントでは、`onCreate()`内で`ViewModel`をリクエストすることが推奨されています。

> 通常は、アクティビティ オブジェクトの onCreate() メソッドが最初に呼び出されたときに、ViewModel をリクエストします。

https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ja#lifecycle

`onCreate()`で`ViewModel`を初期化する場合は次のようになるでしょうか。

```kotlin
import androidx.activity.ComponentActivity
import androidx.activity.viewModels
...

class ExampleActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        val viewModel: ExampleModel by viewModels()
        setContent {
            ...
        }
    }
}
```

# onCreate()でViewModelを初期化する場合の問題

通常の使用用途であれば、ライフサイクルに従って`onCreate()`で`ViewModel`を初期化すればよいのですが、もし、`onResume()`や`onPause()`などで`ViewModel`に実装されたロジックを呼び出したい場合はどうすればよいのでしょうか？

もちろん、`onCreate()`内で`val viewModel: ExampleViewModel by viewModels()`を実行してしまっているため、他のメソッドでは呼び出すことができません。

それでは、`onCreate()`の外側で`by viewModels()`を呼び出してアクティビティ内でいつでも`ViewModel`を使えるようにすればよいのでしょうか？

```kotlin
class ExampleActivity : ComponentActivity() {
    val viewModel: ExampleViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        setContent {
            ...
        }
    }
```

これはアンチパターンな気がします。公式では、`onCreate()`の中でリクエストすべきと書かれているため、ライフサイクルに沿わない初期化方法はあまり良くないでしょう。

# lateinitとhiltViewModel()を使って解決する

そこで、`lateinit`を使って`onCreate()`の外側で`ViewModel`を定義し、`onCreate()`で呼び出されている`setContent()`内で`hiltViewModel()`を呼び出すことで安全に`ViewModel`を初期化する方法を考えました。

```kotlin
class NfcActivity : ComponentActivity() {
    lateinit var pendingIntent: PendingIntent
    lateinit var nfcAdapter: NfcAdapter

    lateinit var viewModel: ExampleModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        ...

        setContent {
            viewModel = hiltViewModel()
            val uiState by viewModel.uiState.collectAsState()
            ...
        }
    }
    
    ...

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        setIntent(intent)
        if (intent != null && viewModel != null) {
            viewModel.processIntent(intent)
        }
    }
}
```

これにより、上記のようにアクティビティに定義された`onNewIntent()`内でも安全に`ViewModel`のメソッドを呼び出すことができるようになりました。そして、その処理の結果により`uiState`を変更させ、コンポーザブルに表示する値等も変更できるようになります。

`hiltViewModel()`などを呼び出すために必要な`Hilt`の設定方法などについては、こちらの`nowinandroid`のリポジトリを参照してください。

https://github.com/android/nowinandroid
「転職の思考法」を読んだ感想

# はじめに
ブックオフで目についた本の「転職の思考法」を読んだ感想、印象に残った点を残す。
あくまで個人的な感想です。

![スクリーンショット 2023-01-18 0.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1878269/c33f9cc3-d823-6716-f338-cb2b2161858f.png)

# 感想
「このまま今の会社にいていいのか？」と悩んでいる主人公がコンサルの黒岩さんから転職の思考法を教えてもらいながら、成長していく小説のようになっていてとても読みやすい。
中でも黒岩さんが部長の不正を暴くシーンは、完全に半沢直樹のワンシーンで読んでいて熱くなった。
転職の思考法のうち、特に刺さったのは以下。

## 「自分の市場価値」を挙げるための努力をしていくこと
いまの会社で一生過ごすとは限らないので、会社に限らない価値のあるスキルをどれだけ持っているか？
他の会社でも通用するレアな経験ができているのか？
といったところを意識して、いつでも転職できるという選択肢を持ったうえで、
いまの会社でやりたいことを自ら選択する、という生き方をしたい。

なんとなく時間が過ぎるのを待ち、
週末に遊ぶことだけを楽しみにしていたのでは、会社が潰れたときに気づいたら路頭に迷うことになるのではと不安に感じた。。

## 伸びるマーケット
いまの仕事が伸びるマーケットかどうかを意識するのも大事。
そこだと思ったマーケットがあれば思い切って飛び込んでみるのもありかと思った。

## 緊張と緩和のバランス
本文内では、ロールプレイングゲームを例に説明されていたが、
良い緊張が適度にある環境なのかどうか？
「良い緊張」「悪い緊張」なのか？
バランスが取れていないクソゲーになっていないか？
（昔プレステのガンダムのゲームで起動して操作方法の説明もなくすぐゲームオーバーになるクソゲーがあったのを思い出した。）

## 自分のラベル（キャッチコピー）をつけて、ラベルが強固になるように仕事を選ぶこと

自分の好きなこと、苦にならないことを「ラベル」にする。
その「ラベル」」には理想が入っていても、まだできないことでもかまわないので、そのラベルが強固になるかという判断軸で仕事を選んでいく。
好きなことを見つける方法：
１：他の人から上手だと言われるが「自分ではピンとこないもの」から探す方法
２：普段の仕事の中で「まったくストレスを感じないこと」から探す方法

# さいごに
この本は転職をテーマに、その思考法について書かれているが、
どんな社会人にも当てはまる考え方であり、読んで損はない内容だと思った。
特に自分の市場価値をあげるための努力をしているか？
いまの会社はキャリアを築くうえで、必要となる経験ができるか？機会があるか？
「転職が悪だというのは、新たな選択肢を手にいれる努力を放棄した人間が発明した、姑息な言い訳に過ぎない」という言葉はインパクトがあった。
「20代は専門性、30代は経験、40代は人脈が重要」とあったが、流れに身を任せるのではなく、
30代になったいま、市場価値が上がるような経験を求めて日々過ごしていきたい。
そういう気持ちにさせてくれた北野さんには感謝を伝えたい。