OmniAICreator/Qiita-1.07M huggingface dataset:
AWS CLIのインストールから各種設定まで (MacOS)

## 後から気づいた悲しいこと。
aws-cliはPythonで作成されているので、他の記事を色々参照して
この記事を書いたのですが、以下のコマンドで簡単にインストールできるみたいです(泣)
```
$ brew install awscli

$ aws --version
aws-cliのバージョンが表示されていればOK
```
以下、URLからconfigの設定をして完了です！
https://qiita.com/yamashi_takeru/items/d4aae21e88285dbeb887#config%E3%81%AE%E8%A8%AD%E5%AE%9A
 

## 概要
- MacOSでAWS-CLIを使ってみたくなったので、備忘録として残したい

## 環境
ProductName:		macOS
ProductVersion:		13.3
BuildVersion:		22E252

## 必要なこと

- Homebrewのインストール
- Pythonのインストール
- pipのインストール

### なんでPythonが必要なのか
AWS CLIはPythonスクリプトの形式で提供されているため。
### pipとは
Pythonのパッケージ管理ツールである

## Homebrewのインストール方法

homebrewは、以下のURLからダウンロードできます。
https://brew.sh/ja/

## Pythonのインストール方法
Pythonは下記、コマンドを使ってすぐに入れることができます。

```
$ homebrew install python
````

Pythonがどこにinstallされたか
下記のコマンドで確認してみたいと思います。

```
$ which python
```
上記のコマンドで、インストールされた場所が確認できない場合は、
下記のコマンドで確認してください。

```
$ brew list

python@3.11

$ brew --prefix python@3.11
/opt/homebrew/opt/python@3.11
```

僕の場合は、python@3.11でしたのでその辺は適宜、対応してください。

## pipのインストール方法

pipはHomebrewでは、入れることはできないので、別の方法で入れようと思います。
下記、コマンドを実行してget-pip.pyをインストールしてください。
```
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
```
### get-pip.py
pipをインストールするためのスクリプトファイルのこと。

下記のコマンドで インストールされているか確認してみましょう！
```
$ ls -l
```
get-pip.pyがインストールできていましたら、
下記コマンドで、pipを実際にインストールします。
```
$ python3 get-pip.py

Defaulting to user installation because normal site-packages is not writeable
Collecting pip
  Downloading pip-23.3.1-py3-none-any.whl.metadata (3.5 kB)
Downloading pip-23.3.1-py3-none-any.whl (2.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 11.4 MB/s eta 0:00:00
Installing collected packages: pip
  WARNING: The scripts pip, pip3 and pip3.9 are installed in '/Users/xxx/Library/Python/3.9/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-23.3.1
```
pipがインストールできているか確認をしてみたいと思います。
上記の結果を見てみると、
`The scripts pip, pip3 and pip3.9 are installed in '/Users/xxx/Library/Python/3.9/bin' which is not on PATH.`

という文章がありますね。こちらを翻訳してみると。

`ip、pip3、pip3.9スクリプトは、PATHにない'/Users/xxx/Library/Python/3.9/bin'にインストールされます。`

なので、下記コマンドを実行するとpipがインストールできたか確認が取れます。
(同時にバージョンも)

```
$ ogx@kabushikikaishanoMac-mini ~ % /Users/ogx/Library/Python/3.9/bin/pip -V

pip 23.3.1 from /Users/xxx/Library/Python/3.9/lib/python/site-packages/pip (python 3.9)
```

これだと煩わしいので環境変数を設定してしまいましょう。
.zshrcファイルを開いてviで書き換えます。
```
$ vi ~/.zshrc

# vi内で下記の記述を行ってください
export PATH=$PATH:/Users/ogx/Library/Python/3.9/bin
```

とすると下記コマンドを打ってみましょう。

```
pip -V

pip 23.3.1 from /Users/ogx/Library/Python/3.9/lib/python/site-packages/pip (python 3.9)
```

環境変数を設定する前と同じ出力結果を得ることができました！

## AWS CLIのインストール方法
下記コマンドでpipでAWS CLIをインストールすることができます。

```
pip install --upgrade --user awscli
```

次にconfigの設定を行いましょう！

#### configの設定

```
$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]:
Default output format [None]: 
```

上記を入力して完了です。
お疲れ様でした。
[Flutter] カスケード記法(..)について本気で理解する

こんにちは。いせりゅーです😋

:::note info
この記事は、<b>株式会社ゆめみの23卒 Advent Calendar 2023</b>のアドベントカレンダーになります！！
色々な種類の記事が投稿されるので、お楽しみに🤗
:::

https://qiita.com/advent-calendar/2023/yumemi-23-graduation

最近、新しいトピックに取り組む際の挑戦や躓きを経験しています。そんな中、業務でのフィードバックを通じて、カスケード記法(..)の理解について新たな気づきを得ました。それを皆さんと共有したいと思います!!

# 問題の背景
- カスケード記法についてはなんとなく知っていたが他にもメリットがあることが知らなかった



https://flutterbyexample.com/lesson/cascade-notation


こちらを参考にさせていただきました。

:::note info
認識のミスがありましたら、コメントいただけると幸いです🙇
:::


## カスケード記法（..）とは

- 「..」を使うと、メソッドやプロパティを記載を連続して使用できるDartの文法
- 同じオブジェクトに対して一連の操作を実行できる


## カスケード記法（..）を使うメリット
- コードを一時変数を作成する手間が省ける
→<b>コードをすっきりと簡潔にできる</b>

## コードの記載例

### １.簡潔に記載できる

<b>Before</b>

```dart
var button = querySelector('#confirm');
button?.text = 'Confirm';
button?.classes.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
button?.scrollIntoView();
```

<b>after</b>

```dart
querySelector('#confirm')
  ?..text = 'Confirm'
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'))
  ..scrollIntoView();
```


### 2.戻り値を操作できる

今回は、ViewModelのテストコードから引っ張ってきました。今回は、カスケード記法を使うかどうかで戻り値が変わることを見るために必要なコードのみを記載します。

全体的なコードはこちらになります。

https://github.com/iseruuuuu/flutter_yumemi_training_app


```dart:weather_repository.dart

  Result<WeatherResult, String> getWeather(WeatherRequest weatherRequest) {
    try {
      final weatherDecode = weatherDataSource.fetchWeather(weatherRequest);
      final result = WeatherResult.fromJson(weatherDecode);
      return Result.success(result);
    } on YumemiWeatherError catch (error) {
      switch (error) {
        case YumemiWeatherError.unknown:
          return const Result.failure(ErrorMessage.unknown);
        case YumemiWeatherError.invalidParameter:
          return const Result.failure(ErrorMessage.invalidParameter);
      }
    } on Exception catch (_) {
      return const Result.failure(ErrorMessage.other);
    }
```


```dart
WeatherScreenViewModel create() =>
      container.read(weatherScreenViewModelProvider().notifier);


//  戻り値がResult<WeatherResult, String>になる。
final hoge = create().reloadWeather();


//  戻り値がWeatherScreenViewModelになる
final fuga = create()..reloadWeather();
```

#### 解説

```dart
final hoge = create().reloadWeather();
```

- `reloadWeather`を呼び出すため、戻り値は、`Result<WeatherResult, String>`になります

```dart
final fuga = create()..reloadWeather();
```

- `reloadWeather()` メソッドの戻り値は無視され、`create()`メソッドによって生成された `WeatherScreenViewModel`オブジェクトが fuga 変数に格納される。


# 最後に

- 僕自身は、`..`については認知はしていましたが、カスケード記法という名前であることやできることについて知りませんでした。
2023年11月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2023年11月2日の検索結果 (リスティング広告)

![20231102_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/2b796f2b-00e2-b979-03f5-b1272b7a8a61.png)

* PureStorage
* Splunk
* Dynatrace
* ServiceNow

PureStorage がトップで Splunk と Dynatrace が続いています。常連の IBM が消えました。

先月の結果はこちら --> [2023年10月 AIOps 定点観測](https://qiita.com/mkodera/items/66f6c7281534644020be)

# 2023年11月2日の検索結果 (広告以外)

![20231102_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/b8d95fb3-d3bf-739d-c9ae-15a4c4baef5a.png)

* Splunk
* HPE
* IBM
* 日立製作所
* ServiceNow

1位常連だった HPE が 2位になり、Splunk が 1位になりました。
Splunk が強調スニペットでトップに表示されています。 その後に HPE、IBM が続いています。

先月の結果はこちら --> [2023年10月 AIOps 定点観測](https://qiita.com/mkodera/items/66f6c7281534644020be)
rex0220 絵描きプラグイン モバイル操作

kintoneアプリをモバイルで利用した場合の絵描きプラグインの操作方法です。

# 概要

絵描きプラグイン Ver.6 で、画像画面のスクロールに対応しました。

- 編集画面で、画像表示をタッチまたは対象ボタンをタッチで絵描きプラグインのダイアログ表示
- 「ファイルを選択」をタッチして、「写真ライブラリ・写真を撮る・ファイルを選択」から選択
- 画像にタッチすることで、線を描く
- スクロールバーをタッチすることで、スクロールモードに変わります。
    - スクロールモード中は、画像をタッチして表示位置を移動できます。
    - ペンのアイコン等をタッチすることでスクロールモードを終了

![unnamed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a3a6cca8-e71d-f024-8812-f58adfccd2c8.gif)
※iPhone の操作例

# 写真の取り込み

「ファイルを選択」から写真を取り込みます。

![IMG_0061.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1d256e7b-7cb7-6155-d327-c0c3b99f0c03.jpeg)

# 絵描きプラグインの設定

![2023-11-02_14h43_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/69e6ed38-cf5f-b325-2314-d689523a6048.png)
[Swift] String型で受け取った数字をInt型に変換する

今後開発を進めていく上で自分がつまずきそうな基礎部部分の振り返りです。
アプリ開発でTextFieldを利用する際に数値をInt型として変換するための処理を書きます。

今回はplyagroundで書いているので、定数としてtextFieldを設定します。

```playground.swift
import Foundation
import UIKit

let textField = UITextField()
textField.text = "100"
```

ここではplayground想定で実行していますが、storyboard上だとTextFieldは上のようにOptional型の文字列で数値を受け取ります。
Optional型の文字列はそのままでは数値に変換できないので、これをまず文字列型に変換する必要があります。

```playground.swift
import Foundation
import UIKit

let textField = UITextField()
textField.text = "100"

//String?(オプショナル)型からInt?へ変換
Int(textField.text ?? "")
```

Int型もオプショナル型のままだと計算ができないので、Int?からIntに変換します
```playground.swift
import Foundation
import UIKit

let textField = UITextField()
textField.text = "100"

//String?(オプショナル)型からInt?へ変換
Int(textField.text ?? "")

//Int?は計算に使用できない
//Int(textField.text ?? "") + 10 

//Int?をIntに変換
Int(textField.text ?? "") ?? 0 + 10 //結果110
```
textFieldのtextに何も入っていない場合、??によってnilの場合は空の文字列を返し、それをInt変換時に再度??で0を返します。数値が渡されている場合はその数値がInt型として受け取られます。

結果、上記ではtextField.textに"100"を渡しInt型に変換して10を足しているため、結果は110です。
開発ディレクターについて考える


## はじめに
WEBやアプリなどのシステム開発には、プロジェクトマネージャーとは別に「**開発ディレクター**」という職種が存在します。

主にプロジェクトの中で開発チームの統括をするポジションですが、まだ認知度はそれほど高くないらしい。

今回は、開発ディレクターの役割や重要性について調べてみました。

## 開発ディレクターとは

まず、開発ディレクターの役割をAI(Graffer AI Studio)に聞いてみると、下記のように返答が返ってきました。
> 開発ディレクターは、プロジェクトの開発全体を統括し、開発チームの指導やリソースの管理、プロジェクトの進行管理、品質管理などを行う役職です。
彼らはプロジェクトの成功に向けて戦略を立て、チームメンバーと協力して目標を達成する役割を果たします。

「プロジェクトの中の開発チームのリーダーとして、メンバーのリソースを管理し、開発スケジュールや仕様書を作成し、テストを実施し成果物の品質を管理、統括する」ことが開発ディレクターの役割です。

しかし、これだけ読むとプロジェクトマネージャーと何が違うの？ってなりますよね。
実際に明確に開発ディレクターと定義せずにプロジェクトマネージャーとして開発ディレクターの仕事をしている方も多いと思います。

実際に開発ディレクターはプロジェクトマネージャーとは以下の点で大きく異なります。

### 開発ディレクターとプロジェクトマネージャーの違い

#### 役割の範囲
- プロジェクトマネージャーは、プロジェクト全体の計画、実行、監視、制御に責任を持つ。
- 開発ディレクターは、**開発チームの指導やリソースの管理、品質管理など、開発プロセスに関連する業務に特化**している。

#### 技術的な深さ
- プロジェクトマネージャーは、プロジェクトの全体像を把握し、スケジュールやリスクなどの管理を行うが、深い技術的な知識は必ずしも求めらない。
- 開発ディレクターは、**開発プロセス、技術トレンド、プロジェクトで使用される技術スタックなどについての専門知識**が求められる。

#### チームリーダーシップ
- プロジェクトマネージャーは、プロジェクトチーム全体のリーダーとして、メンバーの指導やモチベーションの向上に取り組む。
- 開発ディレクターは、**開発チームのリーダーとして、開発プロセスや品質管理において、より具体的な指導や管理**を行う。

#### ビジネスの視点
- プロジェクトマネージャーは、プロジェクトの目標をビジネスニーズに合わせて定義し、プロジェクトの成功を確保する役割を果たす。
- 開発ディレクターは、ビジネスニーズを理解し、開発戦略を立てることによって、プロジェクトの成功に貢献する。


上記のようにプロジェクトマネージャーと開発ディレクターではまず役割や責任の範囲が違います。
プロジェクトマネージャーはビジネスサイドの知識と判断が必要とされ、開発ディレクターはプロジェクトマネージャーよりも技術的な知識と視点が求められます。

具体的に開発ディレクターの仕事には以下のようなことがあります。

## 開発ディレクターがやること

### 開発手法と仕様の策定
プロジェクトにおいて最適な技術スタック（開発言語、フレームワーク、ライブラリ、ツールなど）を検討し、どのような開発手法で進めていくのかをクライアント（もしくはプロジェクトマネージャー）に提案します。

### 開発スケジュールの作成・管理
納期までに滞りなく納品できるようにするために開発スケジュールを作成します。
作成したスケジュールに則って進捗状況を把握し、遅延がある場合は改善策を立てるなど対応します。

### 開発リソースの管理
エンジニアの工数の把握と管理の他にも開発環境を用意する必要があります。
エンジニアが効率的に開発が行えるように整備するのも開発ディレクターの仕事です。
開発リソースが不足した場合は、プロジェクトマネージャーやエンジニアと連携し対処します。

### 品質管理
開発工程において発生するバグや不具合を最小限に抑えるためのテスト計画を立てるのも開発ディレクターの仕事です。
コードレビューや単体テスト、結合テストなどのテスト計画を作成し、計画を元にテストを実施しプロジェクトの品質を担保します。

## 開発ディレクターをアサインすることのメリット
開発ディレクターがアサインすることでコストもかかるため小規模~中規模開発では開発ディレクターがアサインされないプロジェクトは多くある。

また、組織やプロジェクトによっては、プロジェクトマネージャーと開発ディレクターの役割が重複している場合も多く、棲み分けができていない場合も多い。

開発ディレクターを適切にアサインすることで以下の点でプロジェクトにとって大きなメリットがある。

- 開発進行速度アップ
- システム上の障害や問題の事前検知と早期アラート化
- 開発ルール等の徹底

## 最後に
開発ディレクターは、プロジェクトの規模が大きくなればなるほど必要なポジションです。
開発ディレクターの役割を明確に定義・理解して適切にアサインすることでプロジェクトは技術面はもちろん運用面でもより安定的に進行することができます。

今回は開発ディレクターについて考えてみました。
これからも一人前の開発ディレクターになるために必要なスキルや気づいたことなどを発信をしていこうと思います。

:point_up_tone2:つづく
定時帰る術-Linux sshサーバ

デフォルトでインストールされていて、enableもされている

・サービス管理：systemdに管理されているため、systemctl系のコマンドが実行できる。status/start/stop/restart等々
・定義ファイル：/etc/ssh/sshd_config
・ログ管理
```
[root@test01 ~]# ll /var/log/secure
-rw-------. 1 root root 3026 11月  2 12:54 /var/log/secure
```
ログがrsyslogに管理されている
```
[root@test01 ~]# grep secure /etc/rsyslog.conf
authpriv.*                                              /var/log/secure
```
Facilityの定義場所：
```
[root@test01 ~]# grep -i authpriv /etc/ssh/sshd_config
SyslogFacility AUTHPRIV
```

## 認証方式
①パスワード
②チャレンジレスポンス
③証明書（公開鍵）



### パスワード認証
デフォルトの認証方式で、rootも許可されていることは要注意
PermitRootLoginをnoにすることで、rootからのsshが拒否される
```
[root@test01 ~]# egrep "Password|Root" /etc/ssh/sshd_config | grep -v "^#"
PermitRootLogin yes
PasswordAuthentication yes
```


### チャレンジレスポンス
デフォルトがnoとなって、パスワード認証より、セキュリティが高く、よく使われる。
チャレンジレスポンス処理流れ：（川口の理解であり、間違ったらごめんなさい）
①サーバ：乱数をクライアント側に送る
②クライアント：①の乱数を使って、パスワードを暗号化し、サーバに送る
③サーバ：①の乱数とsshユーザのパスワードを暗号化し、②と一致するかチェックする。

なんでこの面倒くさいことやるのか、川口の考えでは、乱数とパスワードでの暗号化にすること、第三者からみても、パスワードがわからないし、ちゃんと想定されているクライアントであることも証明できる
（SSHでとやり取りが暗号化されており、傍聴されても、パケットの中身がみれないと思う。）

```
[root@test01 ~]# grep Chall /etc/ssh/sshd_config | grep -v "^#"
ChallengeResponseAuthentication no
```


### 証明書認証
デフォルトで証明書認証が既に有効されてるので、PasswordAuthenticationをnoにすれば、証明書でログインできる
```
[root@test01 ~]# grep -i PubkeyAuthentication /etc/ssh/sshd_config
#PubkeyAuthentication yes
```

sshdは、定義ファイルを有効にするのに、restartしなくても、reloadでもできるのがありがたい
```
[root@test01 ~]# systemctl reload sshd
```
キーペアの作成はCLIもできるし、Tera Termもできる
詳しくはgoogle先生にきいてみればと思う

キーペアができたら、公開鍵の内容をsshするユーザのの~/.ssh/authorized_keysに記載し、パーミッションを600にすることも忘れず
（最初は、ディレクトリやファイルが存在しないと思って、↓で手順で作ってあげよう）
```
[root@test01 ~]# mkdir -p /home/snow/.ssh
[root@test01 ~]# touch /home/snow/.ssh/authorized_keys
[root@test01 ~]# chmod 600 /home/snow/.ssh/authorized_keys
```
これで準備完了、クライアントから秘密カギを使ってログインできる。


## よく設定される箇所

①ポート転送の無効化
②パスワード認証の無効化
（チャレンジレスパンスにするか、証明書認証にするかした方が安全だろう）
③rootログイン拒否

以上
Git 追跡ファイルの親のディレクトリ名の大文字小文字でちょっと詰まった

## 概要

- Gitで追跡しているファイルの親ディレクトリの大文字小文字問題が発生してちょっと、困ったので簡単にまとめる。

## 状況

- `hoge/fuga/test.php`というファイルが有り、`test.php`はGitで追跡されている。
- `fuga`ディレクトリのあとに`master`ディレクトリを追加する必要があったので下記のようにしてコミットした。rename扱いで差分が出てコミットできた。
    - `hoge/fuga/master/test.php`
- その後`master`ディレクトリは`Master`ディレクトリである必要が判明し、下記のようにリネームした。（このときmvコマンドだけでリネームしてしまった。）
    - `hoge/fuga/Master/test.php`

## 問題

- ディレクトリ名変更の差分が出ず、コミットする事ができない。

## 原因

- OSはディレクトリ名の大文字小文字を判別していない場合があるらしい。そのため、mvコマンドで変更したディレクトリ名は差分が出ず、コミットする事ができなかった。

## 解消

- 下記コマンドを実行して明示的にリネームをGitに教えた。

    ```bash
    git mv hoge/fuga/master hoge/fuga/Master
    ```
【Excel】点線が実線で表示される

## Excelで点線が実線になる理由
今回の記事の対象は以下のようなケースとなります！

着色された背景に点線は引けてる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402179/2880ae37-231e-b2d0-dc54-8b3b25f435df.png)

追加で白色の点線を引こうと思ったら...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402179/b19d49ac-1d23-6526-02e2-864766d4dd79.png)

実線になった？！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402179/71f1df3a-7ff3-3a1e-4ec8-3900899758ee.png)

## 解消法
色を自動にすると想定通りになります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402179/3e2477dd-703c-7f23-aa07-c985eb3dc790.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1402179/ef6d86d9-a63f-abad-e8f9-183fc07f76ea.png)

## まとめ
解像度のせいでこうなるかと思います。

印刷時には、自動で設定していても実線になってしまうことがあるそうです！

おなじバグで悩んでいる人に届くと幸いです！
Git管理をディレクトリごとにしたい！

# 背景

Github, Bitbucket, Gitlab...

巷に広がるGit管理のサービスは多く, それぞれでアカウントやパスワードを設定することも少なくない.
ただ`git config --global`で設定してしまうとそれぞれを切り替えて使わないといけなくなる.
それは困るので, 事前にディレクトリを作って, それ以下ではどのサービスのアカウントを使うかを設定する. 

# 手順

### サービス用のディレクトリの作成
```bash
mkdir github
cd github
git init
```

### credentialの設定
`.gitconfig`を同じ階層にgithub用のconfigを作成(`.gitconfig-github`)

```bash
[user]
        name = hoge
        email = hoge
        password = hogehogehoge

[credential "https://github.com"]
        helper = <credential.helperのpath>
```

`.gitconfig`にgithub用の設定にアクセスするためのpathを設定

```bash
~~~
[includeIf "gitdir:access/to/your/github"]
    path = ~/.gitconfig-github
```

# まとめ
ディレクトリごとにサービスごとのアカウント名, password, credential.helperの設定ができた.
【Flutter】ChangeNotifierProvider【provider】

コードに対する理解が薄いのを自覚する場面がありましたので
ここに記す。

ConsumerNotifierProviderとは

ChangeNotifierをlistenし、その子孫に公開
notifyListenersが呼び出される度に再構築します。

→超ざっくりに言うとデータの変更を監視、通知する。


【例】

        ChangeNotifierProvider<▲▲Model>(
        // ChangeNotifier(▲▲Model)の関数を呼び出す
        create: (context) => ▲▲Model()..◾️◾️◾️(),

 ↑Viewで画面で監視
        
        

        class ▲▲Model extends ChangeNotifier {
      // データの監視し、変更されたら発火するコード

      void  ◾️◾️◾️()  {
    
        // データの変更したら発火する処理（外部からの入力）
        
        // Consumerに変更を通知するコード
          notifyListeners();
        },
      }
 ↑データを変更、処理するファイル
 notifyListeners();を使うことによってConsumerにデータの変更を通知する。

         // Provider(ChangeNotifierProvider)を取得し、その値をBuilder(構築)に渡します。
          // つまり更新した値を画面に表示するためのもの
          Consumer<ForumListModel>(builder: (context, model, child) {
          ・・・
          }
↑データ変更が通知されたのでView画面が再ビルドされる（再構築）。

<br>

【まとめ】

・ChangeNotifierProvideでChangeNotifierを監視

・ChangeNotifierのデータが変更されたらnotifyListeners();でConsumerで通知

・Consumerが通知を受け取り画面を再描画する。

<br>

★contextなどはアンダーバーで記述することもできる。

create: (context) => ForumListModel()..ForumList(),
create: (_) => ForumListModel()..ForumList(),

Consumer<ForumListModel>(builder: (context, model, child)
Consumer<ForumListModel>(builder: (_, model, __)

<br>

https://pub.dev/documentation/provider/latest/provider/ChangeNotifierProvider-class.html

https://pub.dev/documentation/provider/latest/provider/Consumer-class.html
Bootstrap-v.5.3でjQueryを扱っていなかった話

先日Bootstrapを用いて簡単な製作物を作ろうとごにゃごにゃプログラミングを組んでいたのですが、なぜかjQueryの動きが聞いていない印象、、、。そこからトラブルシュートを様々試みましたが、結局うまくいかず、、。

その日は気分でv5.3を使用していたので、もしかしてと思い、検索したところ、v5以降はJavascriptのライブラリと対応していないということがわかりました:disappointed_relieved:

果たしてあの苦戦していた2時間は何だったのだろうか、、、、。

cssファイルとjsファイルを書き換えれば済むからこの後の修正はそこまで大変ではなさそう、、、。

やっぱりBootstrapはv4.5に尽きるなあと再認識しました！！
失くしたものを見つける方法

# 方法
失くしたものを見つけたときに、ものの名前と見つけた場所をメモっておく。

自分はLineにしてます。
![S__37814283.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481325/7cf912cf-6cb2-bd88-e6d0-1fc0eb6041c5.jpeg)

# なぜこの方法で良いのか
失くしたとき急にネットで情報を調べて知識を集めてもうまくいきません。

これは、試験を数分だけのテクニックでくぐり抜けようとするもので、不可能です。

少しの準備を積み重ねておくことが必要となります。半年くらいすると、失くしやすい場所の候補が認識でき、見つかりやすくなります。また見つかりにくい要因や解き方が分かってきてパズルを解く感覚になります。

自分だと、頻出回答は「ベッドの足元」で、よくある解法は「ベッドの下を探す」ですね。

## ちょっと理論篇（読まなくて大丈夫）
失くしたものを見つける問題には、
1. 逆問題
2. 自分が第一人者であること

という2つの難しさがあります。

#### 逆問題
逆問題とは、「答えを見つけるのは難しいが、答えの候補があったときにそれが答えかどうか見つけるのは簡単な問題」のことを言います。

今回も、失くしたものの場所（答え）を見つけるのは難しいですが、各場所を見て探したものがあるか確認するのは容易ですよね。逆問題です。

すると、確認するという簡単な方へ思考が引きずられます。既に無いと確認した場所を何度も探したり、すぐそこの探してない場所が思いつかなくなったりします。

#### 自分が第一人者であること
失くしたものを探すのに、自分より詳しい人間や情報が存在しません。

「愚者も自分の家の中では、他人の家における賢者より物知りなり。」
ということわざがあるくらいです（[1] p.38, l.7）。

この頼れるものがないという状況を、失くしたものを見つけた自分の記録によって乗り越えています。

## 参考文献
[1] ショウペンハウエル（1960）『読書について』（斎藤忍随訳）岩波書店
Spring Boot + Spring Data JPAは3.1.xだと動かないかもしれない

## 概要と結論の先出し
2023-11-24でSpring Boot2.7.xおよび3.0.xがサポート終了となりバージョンアップが必要となります。

ところがSpring Data JPAを選択しているアプリケーションの場合、3.1.xにバージョンアップすると、依存しているHibernate6.2.xにバグがあるためコードを改修しないと動かないかもしれません。
**Hibernate6.2（とそれに依存するSpringのバージョン）は使用するべきではない** と思われます。
いくつかの条件がわかりましたので、原因と回避策について共有します。

## 発生する事象
アプリケーションの起動させるとHibernateの初期化中にエラーが発生し、起動できない状態になります。下記はエラーの1例です。発生するエラーは他のエラーもあり得ます。

```
java.lang.ClassCastException: class org.hibernate.mapping.BasicValue cannot be cast to class org.hibernate.mapping.ToOne
```

## 原因
Hibernate6.2に含まれる比較的重大なバグが原因です。
[mappedBy non-association](https://hibernate.atlassian.net/browse/HHH-16593)

この他、エンティティの関連付けに関するアノテーションが機能しないケースが多発しているようです。
この問題はHibernate6.3で解決されています。

## 回避策
### Spring Boot3.2.xのリリースを待つ
現在動いているコードを改修するのは避けたいため、3.1.xはスキップして3.2.xへ移行することをお勧めします。まもなくリリースとなるため、RCで移行準備を進めるのが良いと思われます。

### ソースを改修する
お勧めできませんが、不具合を抱えているアノテーションを古いアノテーションで置き換えることで回避できるケースもあるようです。

#### `@OneToMany(mappedBy="...")`を`@JoinTable`で置き換える
先のJiraの例を回避する方法です。
[先述のエラーについてのStackOverflowの質問](https://stackoverflow.com/questions/76490128/class-org-hibernate-mapping-basicvalue-cannot-be-cast-to-class-org-hibernate-map)への回答コメントに、簡単な例が提示されています。

この他にも関連付けに関するバグは複数あるようですが、それ以外のバグも多数含まれているようで、そもそも6.2を使用するべきではないと考えます。
Spring Boot3.2.xのリリースが2.7.xおよび3.0.xのサポート終了直前となっており、実質的に安定版で開発できない状態となってしまっているのは非常に残念です。
git stash のまとめ

git stashのコマンドを忘れてしまう時があるので
コマンドを備忘録として残します。

## 基本的な使い方

1. **変更を一時保存する**
   ```bash
   git stash
   ```

2. **一時保存した変更を一覧表示する**
   ```bash
   git stash list
   ```

3. **最新のスタッシュを適用する**
   ```bash
   git stash apply
   ```

4. **特定のスタッシュを適用する**
   ```bash
   git stash apply stash@{n}
   ```

5. **最新のスタッシュを適用し、それを削除する**
   ```bash
   git stash pop
   ```

6. **特定のスタッシュを適用し、それを削除する**
   ```bash
   git stash pop stash@{n}
   ```

7. **最新のスタッシュを削除する**
   ```bash
   git stash drop
   ```

8. **特定のスタッシュを削除する**
   ```bash
   git stash drop stash@{n}
   ```

9. **すべてのスタッシュを削除する**
   ```bash
   git stash clear
   ```

## オプションとフラグ

1. **変更を一時保存するときにメッセージを付ける**
   ```bash
   git stash save "your message here"
   ```

2. **変更を一時保存するときに、未追加の変更も含める**
   ```bash
   git stash -u
   ```

3. **変更を一時保存するときに、未追加の変更と無視されたファイルも含める**
   ```bash
   git stash -a
   ```
単純パーセプトロンの重みを数式で追いかける

イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104697/d904c1a9-28b3-fc10-3121-3ea175ed55ce.png)

コード
```python
from sympy import *
import sympy
import sys

# 特徴量の数(変数の命名規則のため最大9までを想定)
xDimension = 2

# サンプル数
xSampleSize = 2

# 注: updateNumber - 1 < xSampleSizeの必要あり
updateNumber = 2

xList = []
for i in range(xSampleSize + 1):
  
  #"xList[0]の各要素は使わない"
  xList.append([])
  for j in range(1, xDimension + 1):

     xList[i].append(sympy.var("x" + str(i) + str(j)))

# print(xList)

x = []
for i in range(xSampleSize + 1):

  x.append(sympy.Matrix(xList[i]))

# print(x)

yList = []
for i in range(xSampleSize + 2):

  # yList[0]は使わない
  yList.append(sympy.var("y" + str(i)))

# print(yList)

eta = sympy.var("eta")

wList = []
# 重みを0で初期化するか
zeroFlag = int(sys.argv[1])
for i in range(1, xDimension + 1):
   
   if zeroFlag == 1:
      wList.append(0)
   else:
      wList.append(sympy.var("w0" + str(i)))

# print(wList)

w = sympy.Matrix(wList)
# print(w)

# 重みを0で初期化(w.subs([(w01, 0), (w02, 0)])の書き方だとエラーが出てしまうので、代わりにzeroFlagで対応)

print("------------------------------------------------------w0")
pprint(w)
for i in range(1, updateNumber + 1):
  
   try:
   
      # ヘヴィサイドの階段関数を利用 https://docs.sympy.org/latest/modules/functions/special.html
      # pprintによる出力はθであることに注意
      y_hat = 2 * (sympy.Heaviside(sympy.expand((w.transpose() * x[i])[0, 0]), 1) - 0.5)
      print("---------------------------------------------------yhat{}".format(i))
      pprint(y_hat)

   except IndexError as e: 
      
      print('IndexError updateNumber - 1 < xSampleSizeを満たしてません プログラムを終了します')
      sys.exit()

   wDelta = eta * (yList[i] - y_hat) * x[i]
   print("-------------------------------------------------wDelta{}".format(i))
   pprint(wDelta)

   w = w + wDelta
   print("------------------------------------------------------w{}".format(i))
   pprint(w)
```
実行(ターミナル: コマンドライン引数で1を指定すると重みベクトルを0で初期化)
```python
python .\Perceptron.py 1
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104697/9e2aac5e-3f32-da14-32d8-7599e55525e9.png)

参考
https://datascience.stackexchange.com/questions/26134/initialize-perceptron-weights-with-zero/27305#27305
【CSS・学習ログ2】文字の装飾/フォント指定

<font color=gray>参考：侍テラコヤ『HTML/CSSの基礎を学ぼう』https://terakoya.sejuku.net/programs/51/chapters</font>

## 大きさの単位
- px …パソコンやスマートフォンなどの画面を構成する最小単位。
- em …親要素のフォントサイズを1とする単位。
- rem …**ルート要素**のフォントサイズを基準にした単位。
- ％ …親要素の大きさを基準に、割合を指定する単位。
- vw …ビューポート(webサイトの表示領域)の横幅を基準とする単位。
- vh …ビューポートの高さを基準とする単位。

## 代表的な文字装飾
|||
|-|-|
|font-size|フォントサイズ|
|color|文字色|
|font-weight: bold;|太字|
|font-style: italic;|斜体|
|line-height|行間|
|latter-spacing|字間|
|text-decoration: underline;|下線|
|text-decoration: line-through;|取り消し線|
|border|枠線|
|border-top(bottom/left/right)|各方向に線|
|background-color|背景色|
|text-shadow|影をつける|
|text-align|位置を変える|

## フォントの種類
font-familyを使用してフォントの種類を指定する。
記述する際のルールが存在する。

#### ◎基本的に複数指定する
デバイスにより表示できるフォントが異なるため。
#### ◎フォントファミリー名は引用符で囲う
``(シングルクォーテーション)でも""(ダブルクォーテーション)でも可。
#### ◎総称フォント名は引用符で囲まない
「sens-serif(ゴシック体)」や「serif(明朝体)」のようなフォントの大きなカテゴリ。
#### ◎優先フォントを先に書く
前に書かれたフォントが優先的に使われる。
#### ◎英語フォントを先に書く
英語フォントと日本語フォントを使い分けたい場合は、英語フォントを先に書く。
#### ◎総称フォントは最後に書く
指定したフォントが表示されなかった場合に備え、必ず最後に書く。
```css
.decoration {
	font-family: "Arial Black", "游ゴシック体", "YuGothic", "游ゴシック", "Yu Gothic", sans-serif;
}
```
同じフォントでもデバイスによって名称が異なるため、同じフォントを複数指定する。

### ★Google Fonts使い方★
**webフォント**とは、インターネットのサーバー上に置かれたフォントのこと。
その中でも、よく使用されるのがGoogle Fontsである。

 (1) Google Fontsのサイトにアクセスし、使いたいフォントを選ぶ
![スクリーンショット 2023-10-29 175219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/e27109b4-2178-0f52-90fe-a17ffcb4f9b1.png)


 (2) ソースコードをHTMLファイルのheadタグ内とCSSファイルに貼り付ける
 ![スクリーンショット 2023-10-29 174557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/b148fe0a-75a7-a782-4c2f-8e14ce7eafb1.png)
![スクリーンショット 2023-10-29 174837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/eb0f00c7-5b76-a497-0dce-9f746b1031d0.png)

ユーザーのデバイスに依存しない（デバイスにそのフォントがインストールされていなくても表示できる）というメリットがある。

![スクリーンショット 2023-10-29 175614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/e52e6da6-8b30-795e-83f4-cd5c0779308e.png)

<hr>
スプレッドシートから、サイト上にポップアップを出すシンプルなサービスを、やべー勢いですげー作り上げた

# サイト上にポップアップを出すシンプルなサービスを作った
先日、ノーコードでサイト上にポップアップで動画を出せるシンプルなサービスをリリースしました。
サイト上に指定のタグを1行埋め込むだけで、TikTokやYoutubeの動画がポップアップするというもので、

・Googleのスプレッドシートを使って管理できる

というのが特徴で、新しいことを覚える必要がなくて担当者の負担が減るかもです。
非エンジニアでも楽勝だとおもいます。

https://diiig.net/engine/?cv=qi

HTMLのコーディングなどなく、YoutubeやTikTokの埋め込み動画をモーダル的に表示してくれます。
また、実装もバニラなJavascriptなのでJqueryのバージョンでぶつかることも無いかなと。
 
## なんでつくった？
### 大掛かりな製品が多く、難解で維持費・導入・運用コストがバチクソに高い
この手の製品は、解析ツールや他の膨大な機能も込みで

- 初期費用が数十万〜
- 月額数十万〜

みたいなのが多く、導入・学習・運用コストがバカ高く、小規模な組織や案件には不向きです。
また、高い専門性を要求され、導入したところで持て余します。
かと言って、提供元と密にやるコストも割けないなど、つらいことが多いと思います。

### 大規模なツールを扱いきれない
昨今の解析ツールは進化が進み、いろんなことができるようになった反面、誰でも扱えるものではなくなりました。
様々な機能が提供されていますが、

- 何を見ればよいのか
- 言葉の意味がわからない
- 数値の意味がわからない
- どのようなロジックで計測されているのかわからない

など、いざ使おうとした際に知識がないと混迷を極めます。

### ニーズがあるのでは
ってなわけで

- シンプルに
- 新しいことを覚えずに

使えるものがあれば、お手頃に提供できるし使ってもらえるのではないかと言うところで作りました。

## やべー勢いですげー作り上げる
やべー勢いですげー盛り上がる・・・ではなく、かなり短期間で作り上げました。
余計なものを作らない（存在するものは自前で作らない）精神で、いろんなものをポンッと用意しました。

月曜に諸々始まって、金曜にはプレスリリースまでこぎつけました。
頑張ったので以下記事も見てほしい。

https://prtimes.jp/main/html/rd/p/000000045.000044564.html

あと、特に次項で効率化出来たところを紹介するので、読んでくれた人の役に立つと嬉しいです。

## 特に効率化できたところなど
### 申込みはGoogle form
いまや法人が使う場合でもある程度市民権を得ていると思われるGoogle Formで申し込みを受け付けるようにしました。
自動返信の文面に、動的にURLを貼れるようにして、Stripeの決済URLを貼って送り返すようにしました。

### 決済はStripeのCheckout
Stripeの提供している決済用URLの発行を使い、自前でのUI構築を一切せずに決済を準備しました。
Stripeの管理画面で商品名や価格を設定するだけで、決済URLを発行できるのでとても便利です。

※本番用URLで決済テストをしてStripe側にやっちゃだめだよと言われたはナイショです。みんなは気をつけよう。

### JSの実装をChatGPTで行った
こちらもかなり効率化出来た要因です。
主に動画サイトのURLの分解や、細かい挙動における関数群を７割位はChatGPT君にたのんで作ってもらいました。
もちろん送り込んではいけない情報は避けて。

- 具体的なロジックや、入出力の指定を可能な限り明確に伝える
- 間違ったコードを吐いたときは、具体的な不具合やエラーメッセージを伝える

を行えば概ね完成します。
あとは、書いてある内容を人間が見て理解することで完了。
「なんかしらんが動いてるから ヨシ！」では流石に怖い。
基本はChatGPTを人間だと思って扱うといいのかもと思いました。

## 本サービスの使い勝手について
### とりあえずコード設置してスプレッドシートに書けば出てくる
タイトル通りですが、指定のJSを１行記載するだけで、あとはスプレッドシート管理となります。
実際のスプレッドシートはこんな感じで、掲載期間と動画のURLを貼り付けるだけで、調子良く動いてくれます。

![スクリーンショット 2023-11-02 11.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591317/fd036694-30a7-bd2f-68fc-0e3c5fae4111.png)

ね、かんたんでしょ。

### Google Analyticsのクリックイベントに自動的に対応
Google Analyticsが導入されているサイトであれば、自動的にイベントトラッキングの情報を送るようにしています。
これにより、サイト上で動画が表示された回数がわかるようになっています🤘
 
### ユーザーIDの認識もできるようにしてるので、既存サービスでも使いやすい
これはちょっと知識のいるパターンですが、任意にユーザーIDを指定して表示を管理することも出来ます。
既存のログインを伴うサービスで、そのユーザーIDを認識させるロジックも実は実装しています。

## まとめ

- 既存のサービスの組み合わせで、新しいサービスを１週間でリリースした
- 「あった方がいい」は排除して、最低限の機能に絞ってシンプルなものを作った

特に導入のハードルが低く、ユーザーへのリーチを増やしやすいと考えています。
よろしければ使ってみてください。

https://diiig.net/engine/?cv=qi
IntelliSenseをunity M1mac vscodeで行った話

## 環境
M1 mac book air
unity
vscode
2023/11/2に実施

# やったこと
https://dotnet.microsoft.com/ja-jp/download
で.NET CLI tools をインストール
which dotnet
コマンドで入っているか確認


https://www.mono-project.com/download/stable/#download-mac
でmono をインストール
which mono
which mcs
コマンドで入っているか確認

## settings.jsonを書き換え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/39d95591-2e46-4b0d-27e2-d16eb4bb2bd8.png)
※useGlobalMonoは画像の通り消しても関係なかった

## extensionを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/17a995d1-adac-c9b2-0a85-7b56d6de94f1.png)

## route直下にomnisharp.jsonを配置した
```
{
    "FormattingOptions": {
      "NewLinesForBracesInLambdaExpressionBody": false,
      "NewLinesForBracesInAnonymousMethods": false,
      "NewLinesForBracesInAnonymousTypes": false,
      "NewLinesForBracesInControlBlocks": false,
      "NewLinesForBracesInTypes": false,
      "NewLinesForBracesInMethods": false,
      "NewLinesForBracesInProperties": false,
      "NewLinesForBracesInObjectCollectionArrayInitializers": false,
      "NewLinesForBracesInAccessors": false,
      "NewLineForElse": false,
      "NewLineForCatch": false,
      "NewLineForFinally": false
    }
  }
```

## その結果出るようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/5ad70497-7a36-bd40-8888-67ff3553090d.png)


## 補足
上記以外にもやったかもだが、覚えていない、
なので上記をまず試してみてダメなら色々試行錯誤するのをお勧めする

## ついでに言うと以下のformatter設定が便利
"[csharp]": {
    "editor.defaultFormatter": "ms-dotnettools.csharp"
  },

## 残っているバグ
なぜかunityからvscodeを起動すると、intellisenseがぶっ壊れる
これは原因調査予定
知ってる人がいたら教えて
[備忘録，動作報告] マルチディスプレイ下でのUbuntu22.04のログイン画面の指定

# 問題
複数のモニターを利用しているとき自分の好みではないディスプレイにログイン画面が出てしまうことがあります．また解像度が好みではないということもあります．

それを解決するために，ログインセッション時のディスプレイの設定（解像度，プライマリーディスプレイ）を設定します．

# 解決方法
以下のコマンドを実行

```bash
sudo cp ~/.config/monitors.xml ~gdm/.config/monitors.xml
sudo chown gdm:gdm ~gdm/.config/monitors.xml
```

ディスプレイマネージャー(gdm)の画面設定ファイルに，ログインしてるユーザの画面設定ファイルを上書きしてるということですね．

このことからディスプレイマネージャーがGDMであることが上記のやり方を適応できる前提と言えそうです．

# 参考文献

AskUbuntu : [https://askubuntu.com/questions/1043337/is-there-to-make-the-login-screen-appear-on-the-external-display-in-18-04](https://askubuntu.com/questions/1043337/is-there-to-make-the-login-screen-appear-on-the-external-display-in-18-04)

# その他
参考文献先のまんまです．参考先では18.04ですが，日本語の記事の少なさと22.04での動作報告が無かったので執筆しました．誰かの参考になれば幸いです．

（独り言：正直，Qiitaの記事として適切ではない気がしなくもない．．．ポエムにすべきか？）
OktaとSalesforce



# Oktaとは？機能とできること
+ シングルサインオン (SSO)
+ 多要素認証 (MFA)
+ ライフサイクル管理
+ ユニバーサルディレクトリ
+ アイデンティティ・ガバナンス

# 設定

+ [OKTA OpenID Signout ForgeRock を使用したシングル ログアウトの解決策 ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000FRnRw)

:::note
ForgeRock had to provide the logout URL and that was configured in the Custom logout URL at Auth provider. For the Forgerock to redirect it back to Salesforce after logout they had to set up an additional parameter in their system. Logout URL has to be provider by the Providing party for this.

ForgeRock はログアウト URL を提供する必要があり、それは認証プロバイダーのカスタム ログアウト URL で構成されました。Forgerock がログアウト後に Salesforce にリダイレクトするには、システムに追加のパラメータを設定する必要がありました。このため、ログアウト URL は提供者によって提供される必要があります。
:::

# エラー

+ [Salesforce Okta SAML integration](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000J6N1j)
+ [Okta SAML SSO Settings](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000K0cIL)
Ubuntu上でOctaveを使ってPsychtoolboxを動かす

# PC
CPUはRyzenでwith Radeon Graphics (RX Vega 8)のタイプです。ノートPCです。
Psychtoolboxのページによると、GPUとしてはAMDのPolarisやVegaアーキテクチャーが良いとのことで、Raven Ridge（RyzenにRadeonを内蔵した）でも大丈夫ということです。より新しいNaviアーキテクチャーでも動くはず、というようなことが書いてあります。

:::note
時間に厳密なことをしないなら、ここまで気にする必要はないようです。
:::
# Ubuntuのインストール
私は、22.04 Desktop版をインストールしました。
Ubuntuインストール中、「グラフィックスとWi-Fiハードウェアと追加のメディアフォーマットのサードパーティ製ソフトウェアをインストールする」はチェックを入れませんでした。
Psychtoolboxのページに、次のように書いてあったからです。
> On Linux, please do not install the AMD proprietary amdgpu-pro driver
# Psychtoolboxのインストール
1. [Installation Instructions](http://psychtoolbox.org/download.html#Linux)にある、[NeuroDebian Psychtoolbox for GNU/Octave](https://neuro.debian.net/pkgs/octave-psychtoolbox-3.html)に行きます。
2. octave-psychtoolbox-3 – toolbox for vision research – Octave bindingsというページにいるので、[Install this package](https://neuro.debian.net/install_pkg.html?p=octave-psychtoolbox-3)というボタンを押します。
3. Step 1でoperating systemとdownload serverを選択します。私は、Ubuntu 22.04とJapanを選択しました。
4. コンポーネントは、all softwareを選択しました。
5. ２つのコマンドが提示されますので、ターミナル上で順番に実行しました。次にパッケージインデックスのアップデートをしておけという指示に従い、sudo apt-get updateしました。
6. Step 2に書いてあるコマンドをターミナル上で実行します。この後、ちょっと時間がかかりますがインストールが行われます。

:::note info
octaveもインストールされます。
:::
# Psychtoolboxの動作確認
1. Ubuntuにログインするとき、ディスプレイサーバーはUbuntu on Xorgを選択します。画面の右下にある歯車マークをクリックすれば選択できます。
2. ログイン後、画面左下にあるアプリケーションボタンを押すと、アプリケーションの一覧が表示されます。その中にoctaveがあるので、クリックして起動します。2ページ目以降にoctaveがあるかもしれないので探してみましょう。
3. octaveのコマンドウィンドウでPsychtoolboxのデモを動かしてみましょう。GratingDemo, DriftDemo, DotDemo などが無事に動けば、確認は終了です。コマンドウィンドウにGratingDemoと打ち込んでリターンキーを押せば動きます。
【AppSheet】アドベントカレンダー作った

## できたもの
![スクリーンショット 2023-11-02 10.59.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/a1a68ef5-ed66-c096-5473-483d7eb2333b.png)
#### 機能
- カレンダー画像を背景にXY座標でピン立て
- 空き・予約済み・公開済みのピン色分け
- 予約のキャンセル
- 当日朝8時にURL自動公開（0時でよかった何故8時にしたのかわからん）
- コメント機能

## 経緯
アドベントカレンダー好きです。
Qiitaのようなジャンルを技術に絞るでもなく、Adventarほど公開されない、個人利用で自由なものが欲しいと思って実装してみた。
GWSユーザーならCoreライセンスが割り当てられているので社内で使うに良さそう。
日付のカレンダービュー表示でもよかったんだけど視覚的に面白そうなのでXYで画像マッピングを採用

## 構成

### ソースはスプレッドシート
毎年使えたらと思って日付に年（YYYY）を持ちたくなかったのでDateはTEXT型 美しくない気もする…
![スクリーンショット 2023-11-02 11.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/d5e2a4c2-bb80-4508-a212-bc33316964f3.png)
[Done]が公開済みかどうかのステータスになっている。

#### XY型
![スクリーンショット 2023-11-02 11.17.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/a01598b0-731d-34af-aac5-bc560afe5219.png)
背景画像はGCSに置き、XY型の設定<strong>Background image for the XY coordinates</strong>に使用することで画像にピン立てが可能
画像への直リンクが必要なのでDriveに置いた画像は使えない。注意


### 画面
冒頭のカレンダー表示とあわせて、一覧画面も用意した。
![スクリーンショット 2023-11-02 11.00.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/dc5ff901-828a-01f5-2be9-714b79bf0162.png)
スマートフォンだと画像が大きいかもしれないので一覧が優しいかも

### ピンのFormat rules
募集中・公開前（予約済み）・公開済（[Done]=True）で3色に分けられた。
![スクリーンショット 2023-11-02 11.26.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/f406ccf9-c21c-e006-a945-01073eb79314.png)
マップピンはサイズが変えられないのが不便 もっと大きくしたい。communityでも要望スレッド立っていた。

#### コメント機能
せっかくなので何らかのリアクションをつけられたらと思い追加実装。
コメント_Inlineはカードビュー（Large）を使って分離して表示。カードビューは使いやすい
[Date]を<strong>TEXT_ICON()</strong>でアイコン画像にすることでちょっとかわいいワンポイントに使える。
![スクリーンショット 2023-11-02 11.24.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/47e5acef-e0d0-0bb6-eea3-80002913526c.png)
（余談）コメントではなく、いいね機能でワンクリックの簡易リアクションでもよかったかもしれない

### 自動公開
Automationで当日に[Done]をTrueに更新することでURLが公開されるようにした
![スクリーンショット 2023-11-02 11.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/8c8cbbd6-49de-07c2-de0a-ab4746c2ca8e.png)
西暦を持ちたくなくて[Date]が日付型でないのであまりFilter Conditionが綺麗じゃない感想…
Time zoneはTokyoにすること。
![スクリーンショット 2023-11-02 11.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/cde1324d-7fc0-7745-9dc4-5494f954e6cb.png)


### その他
Onboardingで最初に説明画面を表示するようにした
![スクリーンショット 2023-11-02 11.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/9f45f7c3-f79f-deae-5083-851de5f730e4.png)



## おわり
XYでの画像マッピング楽しい。
汎用的なカレンダーではないけど、スタンプカードとか可能性が見えた気がする。
AWSの代替連絡先はあくまで代替連絡先である。

# はじめに
AWSを利用している場合、リソースのメンテナンス通知や、サポートケースの受信など、様々なケースでメールを受信することがあります。
これらのメールは基本的にルートユーザーのメールアドレス（以下、アカウントメールアドレス）に対して送信されます。
また、アカウントメールアドレスとは別の **代理のメールアドレス（代替連絡先）** を設定することも可能です。

今回、アカウントメールアドレスが受信する内容を、別のメールアドレスで集約できないか調査することがあり、代替連絡先について調べてみました。その内容をここにまとめます。

# 最初にまとめ
「代替の連絡先」の機能は、登録しているメールアドレス宛にすべての AWS からの通知（メンテナンスや請求の通知等）が配信されることを約束するものではありません。
基本的にはユーザーに連絡がつかない場合等の代替の連絡先という位置づけです。 **AWSからのお知らせを確実に受信したい場合はアカウントメールアドレス宛のメールを受信できる状態にするのが適切です。**

# 代替連絡先について
代替連絡先は、請求 (Billing) ・操作 (Operations)・セキュリティ (Security)の3つのタイプがあります。
設定にはそれぞれ氏名・役職・電話番号・メールアドレスを指定します。
![スクリーンショット 2023-11-01 18.13.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3328969/1d71be03-00d0-854b-f725-bdab8fa43a3b.png)

また、メーリングリストで設定が可能です。3つとも同じメールアドレスにすることも可能です。

それぞれ以下のような内容が配信されます。
- 請求 (Billing)
    - 料金に関する通知 (毎月の請求、サポートの加入、サービスのキャンセル通知など）
- 操作 (Operations)
    - EC2のリタイアメントプラン、メンテナンス通知、サポートへケースの受信など
- セキュリティ (Security)
    - セキュリティに関する通知 (不正使用報告など）

以上のように分類されているため、例えば
- 請求に関する代替連絡先を経理グループ
- 操作に関する代替連絡先を開発メンバー
- セキュリティに関する代替連絡先をCSIRTやCCoEなどの部署

のように設定することが考えられます。

## 代替連絡先への配信
例えば、EC2のリタイアメント通知があった場合、アカウントメールアドレスと、操作 (Operations)で設定したメールアドレスに配信されます。
しかし、代替連絡先は「連絡がつかない場合に使われる連絡先」という特性であるため、必ずアカウントメールアドレスと同じものが配信されるというわけではないようです。（代替という言葉通りではありますが。）

「連絡がつかない場合」というのもいくつかケースがありそうですが、「アカウントメールアドレスに対して配信したがバウンスされた」などが該当しそうです。
同時に配信されることもあるようなので、「重要度の高い通知」であったり、何らかの条件があるのかもしれません。

# まとめ
現状、請求・操作・セキュリティに関する全ての通知を受信することができるのはアカウントメールアドレスのみです。
その他のメールアドレスでも通知を集約したい場合はアカウントメールアドレスをメーリングリストで設定し、メーリングリストに受信したいメールアドレスを追加する方法が確実です。

アカウントメールアドレス（メーリングリスト）をビジネスサイドも利用している場合、AWSからの通知メールと商談などのメールが混在してメールが埋まりがちになり、見落としのリスクも増えます。そういった場合はアカウントメールアドレスの変更すべきでしょう。（[AWS アカウントの E メールアドレスを変更する](https://repost.aws/ja/knowledge-center/change-email-address)）
アカウントメールアドレスは他の利用と被らないよう、専用のメールアドレス（かつ、メーリングリスト）であることが望ましいです。

代替連絡先にも同時に配信されることは元々知っていたのですが、やはり「代替はあくまで代替」ということですね。

# Appendix
[代替連絡先の追加または更新](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/manage-account-payment.html#manage-account-payment-alternate-contacts)
[Update the alternate contacts for your AWS account](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact-alternate.html)
AWS Certified DevOps Engineer - Professional(DOP-C02) 合格体験記

# はじめに
少し前にDVA、SOAと取得したので、将来的に6冠を目指すということで、そのままの流れでDOPを受験しました。

# スコア
**852/1000**

無事に合格できました！
初の「Professional」資格でしたが、やはりAsocciateの資格と比較して難しい。。。
合格体験記などで、SAPより簡単と記載する方も多いですが、文章量も問題のレベル感もAsocciateで出題されていた内容より深い内容が問われ、自分の理解力が低いところをピンポイントで問われたりするなど、なんとか合格はしたものの勉強期間、計画を含めて、力不足を痛感した試験でした。

# 受験対策

### 書籍
- なし
調べてはみましたが、DOPの対策本的なものは出ていませんでした。

### Web問題集
https://kws-cloud-tech.com/

10問単位で実施できるので、4～5周くらい実施しました。
空いてる時間などにちょっとずつ消化してました。

https://cloud-license.com/

テスト受験前のAWS公式模擬試験で結構悲惨な点数だったので、追い込み用として使いました。
時間的な制約もあり、すべての問題は実施できませんでしたが、#38～79までにかけても2.5周ほど実施し、間違えた問題はお気に入りに登録して、何回か繰り返し実施しました。

### 公式模擬試験
公式にある模擬試験です。
解説もあるので、今回も本番の受験前に実施しています。
20問ほどの模擬試験ですが、本番受験前にやって悲惨な点数になり、そこから追い込みの勉強を初めました。
この試験を受けたことで、勉強不足とわかったのでとてもよかったと思います。

# 受験方法
テストセンターで受験しました。
試験に集中したいというものあり、テストセンターでの受験を個人的におすすめしています。
Professionalは180分(受験後のアンケートも含めるともう少し長い)なので、途中トイレに行きたくなったら、テストどころじゃなくなってしまいます。
なので、事前にテストセンターの方に確認し、途中でトイレに行ってもいいかなど確認しました。
幸い、私の受けたテストセンターは途中で離席が可能でした。(テストの時間からは除外されないみたいなので注意です。)

# 対策など
問題文がSAPほどではないみたいですが、長くなります。
そのような問題でも1問あたり2分弱位しか時間を使えません。(見直しの時間も必要なので)
なので、問題文と選択肢をざっとみて回答し、マークを付けて次の問題に行くように心がけました。
回答で時間を使うより、全部回答したあと見直しで直した方が効率が良いと思います。(未回答の問題がある状態でテスト終了だけは避けたかったという思いがありました。)

# Associateレベルとの難易度の比較
文章量と各選択肢の複雑さがちょっとAssociateとは違うなと感じました。
選択肢も見れば見るほどすべて合ってるように見えたりするなど、しっかりとサービスの差ややり方をわかっていないと解けないような問題が多かったイメージです。

# 大事なサービス
CodePipeLineやCodeCommitなどのいわゆるところのCodeシリーズはしっかりと勉強しておいた方がよいと思います。
DVAやSOAでてくるようなサービスの深いところを問われる傾向が強いので、あらかじめどんなサービスかを理解してから、深堀して理解してく方がよいかと。
また、DR対策もテスト範囲なので、どのように復旧すればコスト効率が良いか、早いかなども把握しておくとよいと思います。

# おわりに
まず、合格できてよかったです。
受験前に公式模擬試験の点数が良くなかったときは本当に焦りました。。。
次は皆が一番難しいというSAPに挑戦したいと思っています。
DOPより、文章量が多いとよく見かけるので、ちょっと警戒しつつ、、、
また、今回みたいにテスト直前で焦らないようにもう少し計画的に準備したいです。

# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
SSH ログインと同時に tmux を開く ssh_config 設定

`~/.ssh/config` を次のように編集する：
```config:~/.ssh/config
Host hoge
  Hostname baa

  RequestTTY force
  RemoteCommand [[ $(tmux list-sessions | grep -q "^0:"; echo $?) == 0 ]] && tmux a -t 0 || tmux
```

ログインと同時に tmux session `0` に入り、tmux デタッチすると SSH もログアウトされる。

:::note info
tmux デタッチ後も SSH セッションを保持したい場合は、RemoteCommand 末尾に `bash -l` を加える：
```
  RequestTTY force
  RemoteCommand [[ $(tmux list-sessions | grep -q "^0:"; echo $?) == 0 ]] && tmux a -t 0 || tmux; bash -l
```
:::
Gitのコマンド　ブランチ編

## Git
今回はGitに不可欠な、**ブランチに関するコマンド**を7個紹介します！

・**ブランチ**:Gitプロジェクト内で異なる作業用のコピーを作成する仕組み

# 1. git branch　ブランチの作成
**新しいブランチを作成するときは**、<font color="Red">**git branch**</font>を使用します！
ブランチ名は任意でつけることができます。

<font color="Red">**注意：これにより新しいブランチが作成されますが、ブランチの移動は行われません！**</font>

```bash
git branch <新しいブランチ名>
```
# 2. git checkout　ブランチの切り替え
**既存のブランチへ切り替えるときは**、<font color="Red">**git checkout**</font>を使用します！
これにより作成したブランチへ切り替えることが可能です。

```bash
git checkout <既存のブランチ名>
```

# 3. git checkout -b　ブランチの作成＋切り替え
**新しいブランチ作成とブランチ切り替えを同時に行うときは**、<font color="Red">**git checkout -b**</font>を使用します！
```bash
git checkout -b <新しいブランチ名>
```

# 4. git branch -d　ブランチの削除
**不要なブランチを削除するときは**、<font color="Red">**git checkout -d**</font>を使用します！
```bash
git branch -d <ブランチ名>
```
<font color="Red">**注意：削除するブランチがまだマージされていない場合、このコマンドは実行されません！**</font>
　　　<font color="Red">**どうしても削除したい場合は、'-d'フラグを'-D'にすることで強制的に削除できます**</font>
```bash
// マージされていないブランチを強制削除
git branch -D <ブランチ名>
```
# 5. git branch -a　ローカルブランチの一覧表示
**ローカルリポジトリに存在するブランチを確認するときは**、<font color="Red">**git branch**</font>を使用します！
**すべてのブランチを確認するときは**、<font color="Red">**git branch -a**</font>を使用します！
```bash
git branch
// すべてのブランチを表示する
git branch -a
```

# 6. git branch -r　リモートブランチの一覧表示
**リモートリポジトリ(GitHub)に存在するブランチを確認するときは**、<font color="Red">**git branch -r**</font>を使用します！
これにより、リモートブランチの一覧が表示されます
```bash
git branch -r
```

# 7. git branch -m　ブランチ名の変更
**ファイルの変更履歴**を確認できる。
**ブランチ名を変更するときは**、<font color="Red">**git branch -m**</font>を使用します！
これにより、現在のブランチ名を変更できます
```bash
git branch -m <新しいブランチ名>
```

# まとめ

**次回は作成、変更したブランチのマージ方法、またコンフリクト解消方法を紹介します！**
convert(ImageMagick)でのSVGからPNGへの変換が上手く行かない場合の対処法

## 問題

これまで、以下のようにSVGファイルをPNGファイルへ変換していたが、SVGファイル内でmaskを用いている場合など、期待通りに変換されない場合があった。

```zsh
convert from.svg to.png
```

## 以前の解決方法

対応方法を調べたところ、以前は以下のように`librsvg`と`ImageMagick`を組み合わせて使えたらしいが、今はこの方法は使えない様子。

```zsh
brew install librsvg
brew reinstall imagemagick --with-librsvg
```

## 今回の解決方法

今回の用途であれば、この`librsvg`の`rsvg-convert`があれば十分なので、`librsvg`をインストール。

```zsh
brew install librsvg
```

あとは、以下のようにSVGファイルをPNGファイルへ変換した。

```zsh
rsvg-convert from.svg -o to.png
```
フロント技術者はコンポーネント管理をしっかりしよう [Storybook]


## Storybookとは？

Storybookはフロントエンド開発者のためのオープンソースツールであり、UIコンポーネントを独立して開発し、テストすることができます。

React、Vue、Angularなど、主要なフレームワークとの互換性があります。


Storybookを使用することで、デザイナーや他のステークホルダーと協力しやすくなり、`フロントエンドの開発プロセスがスムーズ`になります。

👉 ポイント: StorybookはUIコンポーネントの独立した開発とテストを可能にするツールです。

## Storybookのインストール

Storybookを使用するには、まずプロジェクトにインストールする必要があります。


これはnpmやyarnを使用して簡単に行えます。例えば、ReactプロジェクトにStorybookをインストールするには、以下のコマンドを実行します。

```
npx sb init
```

このコマンドは必要な依存関係をインストールし、Storybookの設定ファイルをプロジェクトに追加します。

👉 ポイント: Storybookを使用する前にプロジェクトにインストールする必要があります。

## コンポーネントのストーリーの作成

Storybookでは、各UIコンポーネントに対して「ストーリー」を作成します。


ストーリーはコンポーネントの特定の状態を表し、開発者やデザイナーが簡単に確認できるようになります。
ストーリーの作成は非常にシンプルで、以下のような形式で書かれます。

```javascript
import { Story, Meta } from '@storybook/react';
import { MyButton } from './MyButton';

export default {
  title: 'Example/MyButton',
  component: MyButton,
} as Meta;

const Template: Story = (args) => <MyButton {...args} />;

export const Primary = Template.bind({});
Primary.args = {
  primary: true,
  label: 'MyButton',
};
```

この例では`MyButton`というコンポーネントに対して、`Primary`という名前のストーリーを作成しています。

👉 ポイント: ストーリーを作成することで、コンポーネントの特定の状態を簡単に確認できます。

## Storybookの利点

Storybookを使用することには多くの利点があります。コンポーネント単位での開発が可能になるため、再利用性が向上し、バグの発見が容易になります。


また、デザイナーや他のステークホルダーとのコミュニケーションがスムーズになり、プロダクトの品質を向上させることができます。

👉 ポイント: Storybookを使用することで、コンポーネントの再利用性が向上し、バグの発見が容易になります。また、ステークホルダーとのコミュニケーションがスムーズになります。
paiza.ioでelixir その259

# 概要
paiza.ioでelixirやってみた。
binary、やってみた。

# 参考にしたページ

https://qiita.com/nori-channel/items/a7d1713dc2a050a6d2f3


# サンプルコード

```


is_binary('hello')
|> IO.inspect
byte_size("hello")
|> IO.inspect
byte_size("拝啓")
|> IO.inspect
String.length("hello")
|> IO.inspect
String.length("拝啓")
|> IO.inspect
?a
|> IO.inspect
?あ
|> IO.inspect
String.codepoints("hello")
|> IO.inspect
String.codepoints("拝啓")
|> IO.inspect
<<0, 1, 2, 3>>
|> IO.inspect
byte_size(<<0, 1, 2, 3>>)
|> IO.inspect
<<230, 139, 157, 229, 149, 147>>
|> IO.inspect
byte_size(<<230, 139, 157, 229, 149, 147>>)
|> IO.inspect
String.valid?(<<239, 191, 19>>)
|> IO.inspect
String.valid?(<<230, 139, 157, 229, 149, 147>>)
|> IO.inspect
<<0, 1>> <> <<2, 3>>
|> IO.inspect
<<230, 139, 157>> <> <<229, 149, 147>>
|> IO.inspect
"拝啓" <> <<0>>
|> IO.inspect
<<256>>
|> IO.inspect
<<256 :: size(16)>>
|> IO.inspect
<<256 :: utf8>>
|> IO.inspect
<<256 :: utf8, 97>>
|> IO.inspect
"Āa"|> IO.inspect
#<<utf8, 97, 0>>
#|> IO.inspect
<<1 :: size(1)>>
|> IO.inspect
<<2 :: size(1)>>
|> IO.inspect
is_binary(<<1 :: size(1)>>)
|> IO.inspect
is_bitstring(<<1 :: size(1)>>)
|> IO.inspect
bit_size(<< 1 :: size(1)>>)
|> IO.inspect
is_binary(<<1 :: size(16)>>)
|> IO.inspect
is_bitstring(<<1 :: size(16)>>)
|> IO.inspect
is_binary(<<1 :: size(15)>>)
|> IO.inspect
<<0, 1, x>> = <<0, 1, 2>>
|> IO.inspect
x
|> IO.inspect
<<0, 1, 2, x>> = <<0, 1, 2, 3>>
|> IO.inspect
<<97, x :: binary>> = <<97, 196, 128>>
|> IO.inspect
x
|> IO.inspect
"he" <> rest = "hello"
|> IO.inspect
rest
|> IO.inspect
'hello'
|> IO.inspect
'拝啓'
|> IO.inspect
to_charlist("hello")
|> IO.inspect
to_charlist("拝啓")
|> IO.inspect
to_string('hello')
|> IO.inspect
to_string([25309, 21843])
|> IO.inspect
to_string(:hello)
|> IO.inspect
to_string(1)
|> IO.inspect
#'this ' <> 'fails'
#|> IO.inspect
'this ' ++ 'works'
|> IO.inspect
#"he" ++ "llo"
#|> IO.inspect
"he" <> "llo"
|> IO.inspect





```

# 実行結果

```
false
5
6
5
2
97
12354
["h", "e", "l", "l", "o"]
["拝", "啓"]
<<0, 1, 2, 3>>
4
"拝啓"
6
false
true
<<0, 1, 2, 3>>
"拝啓"
<<230, 139, 157, 229, 149, 147, 0>>
<<0>>
<<1, 0>>
"Ā"
"Āa"
"Āa"
<<1::size(1)>>
<<0::size(1)>>
false
true
1
true
true
false
<<0, 1, 2>>
2
<<0, 1, 2, 3>>
"aĀ"
"Ā"
"hello"
"llo"
'hello'
[25309, 21843]
'hello'
[25309, 21843]
"hello"
"拝啓"
"hello"
"1"
'this works'
"hello"
```

# 成果物

https://paiza.io/projects/vd5Vg9f6h8IJLQE8oubKgQ


以上。
Platform EngineeringのLandscapeを見てみる

# 何を書いているか
Platform Engineeringのコミュニティで「landscapeができたよ！」と言われたので読んだ内容をまとめています。
[Next47](https://next47.com/)という会社が出しているようです。
ソース記事：https://next47.com/platform-engineering/

# 要約
このlandscapeはプラットフォームが何で構成されているかに答えるものですが、これはまだ初期段階にあります。
以下の6つのカテゴリで構成されています。
-  Internal Developer Portals
-  Infrastructure as Code
-  Platform Orchestration
-  Environments
-  Deployment
-  Incident Management

# Landscape
リンク先にあるのは画像でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722539/c72c2cd1-7742-259d-cbcb-594f472d3ae0.png)

## Developer Portal
開発者ポータルには主に以下の機能があります。
- サービスカタログ
- リポジトリ・プロジェクト生成ツール
    - [cookiecutter](https://github.com/cookiecutter/cookiecutter)が例として紹介されている
- カスタムツールチェーン

OSSのいい例として[Backstage](https://github.com/backstage/backstage)が紹介されている。

## IaC
この分野は日本でもかなり利用例が多い気がするので説明は割愛します。

ただ、将来的にはAI/MLと統合されて予測障害検出・自動コード最適化が可能になることが予想されているようです。

## Platform Orchestration
これは面白いカテゴリだと思います。
ローカル開発環境とクラウドベースのインフラ間の移行を簡素化するのがプラットフォームオーケストレーションです。

この辺りはキャッチアップできていないのですが、人間はサービスの設計と提供に集中できるようになることを目指しているようです。

## Environments
大規模になると開発環境のホスティングにはお金がかかります。
多くはプルリクエストでの一時的な環境を提供しています。

これには様々なアプローチがありますが、生産リソースを正確、迅速、効率的にシミュレートする能力で評価されます。

## Deployment & Hosting
[Vercel](https://vercel.com/), [Railway](https://railway.app/), [Koyeb](https://www.koyeb.com/)などが該当します。

クラウドネイティブソリューションを使用して安心して展開できるよう支援するのがこのカテゴリです。

## Incident Management
この分野もキャッチアップができていません。

インシデントからの学びはポストモーテムなどに限定されるべきではないとのこと。
この分野のリーダーは[incident.io](https://incident.io/)のようです。
提言：パスワード自動生成に使う記号は

これはパスワードを自動生成する処理を書くときだけでなく自分で作る場合にもですが、あまり使わない方がいい記号というのがあります。

USキーボードとJISキーボードとでキー位置が異なるやつです。

位置が異なるとどういう問題が起こってくるかというと、リモードデスクトップやVNCでリモートコンピューターからパスワードを打ち込まないといけなくなったとき、あちらとこちらでキーボードタイプが異なると記号がどう入力されるか混乱しがちとなるからです。
（おまけに、パスワード入力欄はマスクされて目で見えないことが多く混乱に拍車をかけます）

無用なユーザー混乱、さらには無駄なログインロック発生とそのサポートを避けようと思うなら、USキーボードとJISキーボードでキー位置の同じ記号、すなわち
```
! - , . / ; < > ? # $ % それに半角スペース
```
だけに限っておくのが無難と存じます。

なお、世界のキーボードはまたそれぞれ記号のキー位置が異なりますので、国際的なWebサービスを作ろうという場合にはもう気にしても仕方がなくなってくるでしょうね。日本ローカルなサービス、ソフトウェアの場合のお話でした。
FutureオブジェクトをCompletableFutureオブジェクトに変換する

Java5で追加されたFutureクラスは、未完了かもしれない非同期処理の結果を保持するクラスですがget()メソッドがあって完了までブロックするだけという低機能なものです。.thenなんちゃら() みたいな、完了時のコールバックを与えるということができません。これは非常に不便。

完了時のコールバックを .then 系メソッドで与えられるようになったのはJava8で登場したCompletableFutureクラスです。

では、CompletableFutureのように完了時コールバックを差し込みたいのに手元に受け取ったのがFutureオブジェクトだった場合はどうすればいいでしょう？

こんな簡単なコードで変換できます。

```java
Future<T> f = ...
CompletableFuture<T> cf = CompletableFuture.supplyAsync(f::get);
```
[Vue.js] v-bindでクラス付けかえの基本

### クラスの付けかえ

v-bind:属性名（例：v-bind:src）などでVueのdataやcomputedと紐づけることができる。


以下は、isOpenの値がTrueの場合、open_class_nameが付与され、そうでなければ何も付与されない。
```app.vue
<script>
export default {
  data() {
    return {
      isOpen: true
    }
  }
}
</script>

<template>
  <input
    v-bind:class="[isOpen ? 'open_class_name' : '']"
  >
</template>

<style scoped>
.open_class_name {
  background-color: #787
}
</style>
```

デフォルトのclassがある場合は別にした方が個人的には見やすい。

```demo.vue
<!-- 一緒にまとめる -->
<input
   v-bind:class="[isOpen ? 'open_class_name' : '' ,'default_class_name']"
>

<!-- 別にする -->
<input
  class="default_class_name"
  v-bind:class="[isOpen ? 'open_class_name' : '']" 
>
```

### その他備忘録
- styleはオブジェクトにしてcomputedで指定することが多い。
- v-bindは最近ではほとんどセミコロンで省略されて書かれる。（例 :class、:src、:style）
Stirlingで構造体編集 その6

# 概要
バイナリエディタStirlingで構造体編集、やってみた。
練習問題、やってみた。

# 練習問題
zipファイルの構造体を書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a8d8bcef-1d22-4337-e019-bb19d186a8f3.png)


# サンプルコード

```
struct ZIP_CENTRAL_HEADER {
	WORD	made_by_ver;
	WORD	extract_ver;
	word	gp_flag;
	word	method;
	word	mod_time;
	word	mod_date;
	dword	crc32;
	dword	comp_size;
	dword	uncomp_size;
	word	name_len;
	word	extra_len;
	word	comment_len;
	word	disk_nbr_start;
	word	int_attrs;
	dword	ext_attrs;
	dword	lfh_offset;
};
```

以上。
配列の行列を入れ替える_VBAで

別ファイルや別シートからデータを取得/集計して配列にまとめる時に、VBAは最後の次元しか変更できないので、行方向にデータを追加したくても、一旦列方向にデータを追加して、後から行列を入れ替える。
というのをよくやるのでそのメモ。

# vba全体
``` vb
Sub 行列の入替え(myArray)
'配列の列/行を入替え

Dim i As Long
Dim j As Long
Dim myArray2()

ReDim myArray2(LBound(myArray, 2) To UBound(myArray, 2), LBound(myArray, 1) To UBound(myArray, 1))

For i = LBound(myArray, 1) To UBound(myArray, 1)
    For j = LBound(myArray, 2) To UBound(myArray, 2)
        myArray2(j, i) = myArray(i, j)
    Next
Next

myArray = myArray2

End Sub
```

使用する時は単に`call 行列の入替え（myArray）`とします。
これでそのまままとめてシートに貼り付けて使える状態にする。