OmniAICreator/Qiita-1.07M huggingface dataset:
全てにおいて、テンプレートとは素晴らしい

## きっかけ
副業でFlutterの案件に参画させてもらうことになりました。
1から始めるプロジェクトのため、ここで何かを残そうかなと思いました。
そこで、全てのFlutterの元となるプログラムを残そうと決めました。
## テンプレ化したいもの
MVVMで考えましょう。
### その他
先にこれを出すのもアレですが。
analysis_options.yamlは秘伝のタレです。絶対にテンプレ化しましょう。

https://sogablog.net/2023/12/11/%e3%80%90flutter%e3%80%91%e7%a7%98%e4%bc%9danalysis_options-yaml%e3%82%92%e5%85%ac%e9%96%8b/

あとはこれ
flutter_riverpod

https://pub.dev/packages/flutter_riverpod

### View
UIの共通化です。
ここら辺はmaterial 3に従うこともあり、今回は共通化を見送りました。
ただし、Appbarなどの共通化はしておいた方が良いと思います。めんどいからねあいつ
あとあれだ。dialogも共通化した方がいい。

### VM
画面遷移の制御は絶対にテンプレ化しといた方がいいですね。
ライブラリで言うとgo_router_builderがおすすめです。

https://pub.dev/packages/go_router_builder

### M
もうね、Mに関してはどのプロジェクトでも共通化できるから資産として全て残しちゃってください。
おすすめ共通化ライブラリはこれー
shared_preferences

https://pub.dev/packages/shared_preferences

package_info_plus

https://sogablog.net/2023/08/30/%e3%80%90%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e7%b4%b9%e4%bb%8b%e3%80%91package_info_plus/

## 最後に
ブログしてます。

https://sogablog.net/

新婚なので覗いてやって下さい。
Salesforceでフローを作成しよう～取引開始前のリードのレコードタイプに応じて取引開始済み後に取引先のレコードタイプを自動更新～

こんにちは
本橋孝昭です

今回はフローを作成して
・取引開始前のリードのレコードタイプに応じて取引開始済み後に取引先のレコードタイプを自動更新
する方法を紹介します


例として
リードにレコードタイプが
・Lead1
・Lead2
・Lead3
の３種類ある
取引先のレコードタイプが
・Account1
・Account2
・Account3
の３種類ある場合
・Lead１はAccount1
・Lead2はAccount2
・Lead3はAccount3
に取引開始済み後にそれぞれ確実にマッピングする方法です

なお過去のヘルプはワークフロールールでの作成になってますが今回はワークフロールールではなくフローで対応します

※参考ヘルプ

https://help.salesforce.com/s/articleView?id=000385391&type=1


## ステップ１　リードに数式項目作成

リードに数式項目（テキスト）を作成します

数式は
RecordType.DeveloperName
です

![リード001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/06c78a44-b0e3-93aa-3f70-b8b8df015d2d.png)


## ステップ2　取引先にテキスト項目作成
取引先にテキスト項目作成をします
![リード002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5da07236-0721-2843-3d52-06548279bc09.png)

## ステップ3 リードと取引先の項目マッピング

ステップ１作成項目とステップ２作成項目をマッピングします

![リード003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6a8477c3-1de1-d68c-9050-45db5ee9857b.png)


## ステップ4 フロー作成を行う

フロー作成の概要はこのようになってます

![リード004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/73907509-8c10-f79b-bac7-ce4cafa9d46f.png)

![リード005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0f5529d7-e75d-4a2e-da3c-544aa5595643.png)

![リード006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e708bed7-e50d-9f4e-bdc0-edb14f655c19.png)


なお、最後のレコードタイプのIDはSalesforce環境ごとに異なります

私の環境はレコードタイプのURLが
https://mindful-moose-6hyrft-dev-ed.trailblaze.lightning.force.com/lightning/setup/ObjectManager/Account/RecordTypes/012GA000000zEPmYAM/view

なので
012GA000000zEPmYAM
でした
皆様もそのURLからその環境のレコードタイプIDを設定しましょう

![リード007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/0b9813a4-4f64-e4eb-e325-b44cc619e157.png)
Flutter 〜pubspec.yamlを使ってパッケージを導入〜

# パッケージとは
ライブラリ、アプリ、リソースなどを含んだディレクトリ。

# パッケージの導入
pubspec.yamlを編集してパッケージの導入を行う。
dependenciesとdev_dependenciesセクションに記述する。

・dependencies
アプリが依存するパッケージを記述。
```
dependencies:
  flutter:
    sdk: flutter
```

・dev_dependencies
テストなど、開発フェーズでのみ使用するパッケージを記述する。

```
dev_dependencies:
  flutter_test:
    sdk: flutter
```

# コマンドによるパッケージの追加
コマンド実行でもパッケージを追加することが可能。

・dependencisesに追加する場合
```bash
#任意のライブラリ名を指定
flutter pub add ライブラリ名
```

・dev_dependenciesに追加する場合
```bash
#任意のライブラリ名を指定
flutter pub add --dev ライブラリ名
```

#  パッケージの導入
追加→導入というプロセスでパッケージが使用可能になる。

```bash
flutter pub get
```

# バージョンの指定
コロンの後ろにバージョン番号を指定することが可能。
先頭に「^」をつけると、指定したバージョンの互換性のある最新バージョンの指定。
推奨された方法。

```yaml
dependencies:
  go_router:
  flutter_riverpod:^2.4.9
  flutter:
    sdk: flutter
```

「^」をつけない場合は指定したバージョン。

```yaml
dependencies:
  go_router:
  flutter_riverpod: 2.4.9
  flutter:
    sdk: flutter
```
VMクラスタを作ってみる：DNS設定編

# DNSサーバをVMネットワーク上に作成する

## DNSサーバの設定

```bash
sudo apt install bind9 bind9utils bind9-doc
```

/etc/bind/named.conf.optionsの編集

```bash
acl internal-network {
        192.168.1.0/24;
};
options {
	directory "/var/cache/bind";

	// If there is a firewall between you and nameservers you want
	// to talk to, you may need to fix the firewall to allow multiple
	// ports to talk.  See http://www.kb.cert.org/vuls/id/800113

	// If your ISP provided one or more IP addresses for stable 
	// nameservers, you probably want to use them as forwarders.  
	// Uncomment the following block, and insert the addresses replacing 
	// the all-0's placeholder.
	
	forwarders {
	 	8.8.8.8;
	};
	allow-query { localhost; internal-network; };
	//========================================================================
	// If BIND logs error messages about the root key being expired,
	// you will need to update your keys.  See https://www.isc.org/bind-keys
	//========================================================================
	dnssec-validation auto;
	//listen-on-v6 { any; };
	recursion yes;
};

```

/etc/bind/named.conf.localの編集

```bash
zone "mydomain.com" {
        type master;
        file "/etc/bind/db.mydomain.com";
};
```

/etc/bind/db.mydomain.comの編集

```bash
;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     mydomain.com. root.mydomain.com. (
                       20240421         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      dnode
dnode   IN      A       192.168.1.100

;Host Record
node1	IN	A	192.168.1.2
node2 IN  A 192.168.1.3
node3 IN  A 192.168.1.4
node4 IN  A 192.168.1.5
```

bind9の再起動

```bash
sudo systemctl restart bind9
```

## 各ノードの設定

/etc/netplanにmydomain.comの自動付与を設定

```bash
... other settings ...
nameservers:
        addresses: [192.168.1.100, 8.8.8.8]
        search: [mydomain.com]
```

/etc/systemd/resolved.confの編集

```bash
[Resolve]
DNSStubListener=no
```

/etc/resolve.confのシンボリックリンクを編集

```bash
ldasudo mv /etc/resolv.conf /tmp/resolv.conf.bak
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
```

systemd-resolvedの再起動

```bash
sudo systemctl restart systemd-resolved
```

## 参考ページ

[https://www.alibabacloud.com/help/en/ecs/how-do-i-use-the-or-etc-or-resolv-conf-file-to-customize-dns-settings-on-an-alibaba-cloud-linux-instance](https://www.alibabacloud.com/help/en/ecs/how-do-i-use-the-or-etc-or-resolv-conf-file-to-customize-dns-settings-on-an-alibaba-cloud-linux-instance)

[https://technologyrss.com/how-to-install-and-configure-dns-bind9-on-ubuntu-22-04-server/](https://technologyrss.com/how-to-install-and-configure-dns-bind9-on-ubuntu-22-04-server/)

[https://zenn.dev/tochiman/articles/5434d4a1e40820](https://zenn.dev/tochiman/articles/5434d4a1e40820)
Dockerを初めて触るときにとりあえず動かしてみるコマンド

※各コマンドの詳細は↓

https://qiita.com/_etoile/items/81ceae3d5e18702c13ae

### 1. hello-worldイメージを使ってコンテナを動かしてみる
```
$ docker run hello-world
```
確認
```
$ docker images
$ docker ps -a
```


### 2. Nginxイメージを使ってコンテナを動かしてみる
NginxのDockerイメージを取得
```
$ docker pull nginx
```
取得したNginxイメージを使用してコンテナを起動
```
$ docker run -d --name nginx-container -p 8181:80 nginx
```
ブラウザ上で以下を入力
[localhost:8181](localhost:8181)

起動中か確認
```
$ docker ps -a
```
コンテナを停止
```
$ docker stop nginx-container
```
### 3.コンテナでLinuxを動かしてみる

alpineのイメージを取得
```
$ docker pull alpine
```
alpineイメージからコンテナを起動
```
$ docker run alpine echo "hello from alpine"
```
コンテナの中で対話的に作業をしたい場合
```
$ docker run -it alpine bin/sh
```
Ctrl+Dで終了

### 参考
**1,2**
* Docker入門（第二回）～Dockerセットアップ、コンテナ起動～
https://knowledge.sakura.ad.jp/13795/

**3**
* さわって理解するDocker入門
https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part1.html

**Dockerfileやdocker-composeも学びたいとき**
* docker と docker-compose の初歩
https://qiita.com/hiyuzawa/items/81490020568417d85e86

**DockerでGPUを使いたいとき**
* Dockerを使って爆速でGPUを設定する方法
https://qiita.com/tatsuya11bbs/items/3af03e704812b6c89965
LinuxでVHDを使うための手順



### 1. 必要なツールのインストール
```bash
sudo apt-get install qemu-utils
```
このコマンドは、VHDファイルを作成し、管理するために必要な`qemu-utils`をインストールします。

### 2. VHDファイルの作成
```bash
qemu-img create -f vpc /path/to/new.vhd 10G
```
ここで、`-f vpc`オプションはVHDファイルフォーマットを指定し、`/path/to/new.vhd`はファイルの保存場所と名前、`10G`はファイルサイズです。

### 3. `nbd` モジュールのロード
```bash
sudo modprobe nbd max_part=8
```
このコマンドは、`nbd`カーネルモジュールをロードし、最大8個のパーティションをサポートするように設定します。

### 4. VHDファイルをネットワークブロックデバイスとして接続
```bash
sudo qemu-nbd --connect=/dev/nbd0 /path/to/new.vhd
```
これで、VHDファイルが`/dev/nbd0`としてシステムに接続されます。

### 5. ファイルシステムのフォーマット
パーティション分けを行わず、直接デバイスにファイルシステムを作成します。
```bash
sudo mkfs.ext4 /dev/nbd0
```
このコマンドは、`/dev/nbd0`にext4ファイルシステムを作成します。

### 6. パーティションのマウント
フォーマットが完了したら、デバイスをマウントします。
```bash
sudo mount /dev/nbd0 /mnt
```
これで、マウントポイント`/mnt`を通じてVHDファイルの内容にアクセスできるようになります。

### 7. 使用後の後片付け
作業が完了したら、マウントを解除し、デバイスの接続を解除します。
```bash
sudo umount /mnt
sudo qemu-nbd --disconnect /dev/nbd0
```

これらの手順に従うことで、VHDファイル全体を一つのパーティションとして扱い、ファイルシステムを作成し、マウントすることが可能です。
VMクラスタを作ってみる：仮想マシンのネットワーク構築編

# 仮想マシンのネットワーク構築

今回作成するネットワークは以下のような構成とする。

![Screen Shot 2024-04-24 at 21.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1761846/18c0eb67-59f8-f432-51f1-b44316cf4690.png)
(引用:https://xtech.nikkei.com/it/article/COLUMN/20131118/518647/)


### virt-installによるvmの作成

```bash
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system
sudo usermod -aG kvm {USER}
sudo usermod -aG libvirt {USER}
```

再起動

```bash
virt-install \
--name test-node \
--description "This is the test node" \
--ram 4096 \
--disk path=/var/lib/libvirt/images/node-test.img,size=10 \
--vcpus 2 \
--os-variant  ubuntu22.04 \
--network default \
--location /home/{USER}/RINKO/ubuntu-22.04.4-live-server-amd64.iso,initrd=casper/initrd,kernel=casper/vmlinuz \
--graphics none \
--console pty,target_type=serial \
--extra-args console=ttyS0,115200n8
```

### virbr0の設定変更

```bash
virsh net-edit default
```

設定を編集

```bash
<network>
  <name>default</name>
  <uuid>d5e58ece-d152-4a87-a768-4339b82940d5</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:3b:67:93'/>
  <ip address='192.168.1.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.1.2' end='192.168.1.254'/>
    </dhcp>
  </ip>
</network>
```

defaultネットワークの再起動

```bash
virsh net-destroy default
virsh net-start default
```

### ゲストマシンのIPアドレス設定

/etc/netplanを編集

```bash
network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      dhcp4: no
      addresses: [192.168.1.2/24]
      routes:
      - to: default
        via: 192.168.1.1
      nameservers:
        addresses: [192.168.1.100, 8.8.8.8]
        
```

もとあったyamlファイルを削除もしくは.bakに変更

```bash
sudo chmod 600 <file name>
sudo netplan apply
```
以上で最初に示した画像のようなネットワークを作ることができる。


### 裏で動いているIPテーブルの話
この環境でNATはホストマシンで実行されている

```bash
$ sudo iptables -t nat -L -v
Chain LIBVIRT_PRT (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    7   486 RETURN     all  --  any    any     192.168.1.0/24       base-address.mcast.net/24 
    0     0 RETURN     all  --  any    any     192.168.1.0/24       255.255.255.255     
    1    60 MASQUERADE  tcp  --  any    any     192.168.1.0/24      !192.168.1.0/24       masq ports: 1024-65535
    6   456 MASQUERADE  udp  --  any    any     192.168.1.0/24      !192.168.1.0/24       masq ports: 1024-65535
    1    84 MASQUERADE  all  --  any    any     192.168.1.0/24      !192.168.1.0/24 
```

libvirt は、仮想ネットワークを作成する際に、VM から外部ネットワークへの通信を可能にするために、IP マスカレード（一種の NAT）を設定します。

```bash
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```

### VMの削除(おまけ)

```bash
virsh undefine test-node --remove-all-storage
```

# ゲストマシンをDNS登録
これはLDAP over TLSを使用するのに必要
LDAP over TLSはSSSDを利用するのに必要
SSSD以外でユーザ情報の共有認証を行う場合は必要ないかもしれない

ドキュメントや最初の画像によるとvirth0にデフォルトのDNSが付いてそうだがその設定方法がどうしてもわからなかったため、もう一台DNS用のVMを用意してDNSを設定した。その記事は以下。
[ローカルDNSを設置する](https://qiita.com/kohuku/items/7f27db92699a31601af1)
クロージャーを用いたプライベート変数の書き方

### やりたいこと

increment関数を数回呼び、1ずつインクリメントされるような動作を実現したい。

### 問題点

このコードだと、numがインクリメントされるが、numという変数がどこでも初期化可能なため、書き換えられると、うまくいかない。

```jsx
let num = 0;

function increment() {
  num += 1;
  console.log(num);
}

increment();
increment();
increment();

num = 0;
increment();
```
![スクリーンショット 2024-04-24 21.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776880/2d130716-497c-5b8c-193a-d15cf1c84d27.png)


### 解決策
クロージャーを使ってprivateな変数を定義すれば解決する。
1. incrementFactoryという関数の中で、numを宣言し、increment関数を作成する。
2. incrementFactoryで、作成したincrement関数を返り値とする。
3. incrementFactory関数を呼び出し、実行。

incrementFactoryは一度しか呼ばれていないため、numも一度しか初期化されない。
途中でnum=0としているが、これに影響されずにインクリメントできている。
尚、修飾子なしで宣言できる理由についてはよくわかっていない。

```jsx

function incrementFactory() {
  let num = 0;
  function increment() {
    num += 1;
    console.log(num);
  }
  return increment;
}

const increment = incrementFactory();

increment();
increment();
increment();
num = 0;
increment();
```
![スクリーンショット 2024-04-24 21.28.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776880/c3ecec87-4932-5012-75b5-d54ea10e7adf.png)

### 参考

**【JS】ガチで学びたい人のためのJavaScriptメカニズム**
https://www.udemy.com/course/javascript-essence/?couponCode=ST6MT42324
わかりやすいコミットメッセージ

## はじめに

[参考](#参考)記載の情報を元に、少し変更を加えた自分用のルールをまとめてみました。
Git初心者は、[Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)の[ライト版](https://qiita.com/itosho/items/9565c6ad2ffc24c09364#ライト版)がオススメです。

## Format

`<type>(<scope>): <title>`

- 例: `feat(ui): ログイン画面を実装`
- typeとtitleは必須、scopeは強く推奨
- 紐づくIssueがある場合は、その番号を`#<issue number>`(例: `#10`)のような形式でtitleの前に付ける
- 3行目以降を書くかは任意

### type

- どういった種類のコミットなのかが一目で分かるように、コミットの種別を書く
- [angular/CONTRIBUTING.md](https://github.com/angular/angular/blob/main/CONTRIBUTING.md)の[Type](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#type)に変更を加えたもの

| type | 説明 | scopeの例 |
| --- | --- | --- |
| build  | ビルドシステムや外部依存関係に関する変更 | library, package, plugin |
| chore | その他の変更 | log, ci, cd, devcontainer |
| docs | ドキュメントに関する変更 | diagram, setup |
| feat | 機能に関する追加・更新 | web, api, db |
| fix | バグ修正 | web, api, db |
| perf  | パフォーマンスチューニング | web, db, infrastructure |
| refactor | リファクタリング | web, api, db, test |
| style | コーディングスタイルに関する変更 | linting, formatting |
| test | テストに関する変更 | unit, e2e, ui, api, db |
| revert  | 元に戻す |  |
| WIP  | Work In Progress |  |

### scope

- typeを補足する役割
- 名詞・動名詞であれば、基本的には何でも良い

### title

- 変更内容を簡潔に書く
- 言語(英語or日本語)はチームで統一する
- 命令形・現在形で書く
    - 日本語の場合は、「〜を◯◯」や「AをBに◯◯」と書く
    （◯◯は追加、更新、修正、削除、変更、移動、などなど）
- 末尾に句読点やピリオドは付けない
- 長くならないようにする
    - 英語　：50文字以内
    - 日本語：25文字以内

## 参考

- [angular/CONTRIBUTING.md](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format)
- [angular.js/DEVELOPERS.md](https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines)
- [Conventional Commits](https://www.conventionalcommits.org/ja/v1.0.0/)
- [Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364)
- [Gitのコミットメッセージの書き方（2023年ver.）](https://zenn.dev/itosho/articles/git-commit-message-2023)
- [GPTによるコミットメッセージ自動生成プロンプトの紹介](https://zenn.dev/sasakir/articles/316beb14a8f336)
[2024最新版]WSLgでLinuxデスクトップを構築して何が悪い

なんか下書き漁ったら普通によさげな記事が出てきたので手直しして公開してみました。

# はじめに
皆さん！
**WindowsでLinuxのデスクトップ環境使いたい** と思いませんか？（思わないと言われたらおしまいだから言わないでお願いします）

僕はChromebookのCrostiniでは、Linuxデスクトップを使っています。何故かと言うと、Chromebookの標準だと機能が少なすぎるから。（お前にChromebookは合わない）

すると、同じ環境をWindowsでも作りたくなります。

しかし、ネットで検索しても、 **最新のWSLgに対応した記事がひとつもヒットしない** んです。（だからといってVirtualboxやらなんやらでやるのはだるいしね。）
ですので、Crostiniで行った方法をもとに **WSLでもLinuxデスクトップ環境を構築** していこうと思います。結構備忘録的な部分がでかいですけど読みやすく書いていきたいな

れっつごー

# 僕の環境
- Windows11 22H1（WSLgに対応したバージョン）
参考:[Linux 用 Windows サブシステムで Linux GUI アプリを実行する](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps)
- WSL2（Microsoftストアのバージョン）
- WSL内はDebian11 Bullseye（デフォルトのUbuntuでもできるはずです）

# 手順
## 環境の確認
[Linux 用 Windows サブシステムで Linux GUI アプリを実行する](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps)で、WSLgが使用できるか確認します。
- **ビルド19044以降のWindows10もしくはWindows11であるか**
- **WSLがインストールされているか** ：
もしも未インストールなら```wsl --install```もしくはMicrosoftストアからのインストール
- **WSLは最新版か（Microsoftストア版か）** ：
```wsl --update```を行う、もしもエラーが出たらMicrosoftストアから最新版をインストールすれば更新されます。
- **WSLg対応のグラフィックドライバがインストールされているか** ：
[Linux 用 Windows サブシステムで Linux GUI アプリを実行する](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps)からインストールしてください。

:::note
WSLgがあれば、Windows用のXクライアントは必要ありません。
:::
## 必要パッケージのインストール
DebianもしくはUbuntuを例とします。
他のディストリビューションをインストールしている方は適宜読み替えてください。

### システムのアップデート
```bash
sudo apt update;sudo apt upgrade -y
```

### デスクトップ環境のインストール
```bash
sudo apt install lxqt
```
:::note
僕の環境では **GNOMEでやろうとしたら全画面でエラー吐かれて、操作のしようが無くなってしまった** ので、画面を閉じてからログイン画面から再起動しました。
何故かGNOMEでは上手くいかなかったので、 **ここではLXQtを使用** します。Crostiniでも使ってるし。
KDEとかLXDEとかCinnamonとかMATEとかは試してません。興味があったらやってみてください。

…ちなみに、全画面のエラーは全部豆腐だったので読めませんでした
:::

### Xephyrのインストール
Xephyrとは、 **Xサーバー（Xウィンドウシステムのサーバー）をネストできるソフト** です。
```bash
sudo apt install xserver-xephyr
```

## 実行してみる
### LXQt単体で実行してみる
まずはXephyr使わずに **単体でLXQtを実行** してみましょう。
```bash
startlxqt
```
すると、画面下のタスクバーの上にLXQtのタスクバーが出現したと思います。WindowsのデスクトップにLXQｔがオーバーレイしているような状態ですね。
これでも使えないことはないですが、どうせならLXQt単体で動かしてみたいと思います。

# Xephyrで実行する
では、 **Xephyrを使って実行します。**
**```-screen```で画面サイズ、```-resizeable```でリサイズ可能、```&```でバックグラウンド実行を指定** しています。
また、 **```:2```はディスプレイ番号** です。現在使用しているディスプレイ以外の番号なら何でも構いません。（大体の環境なら:2以降は未使用だろう、という想定で:2を指定しています。適宜読み替えてください。）
画面サイズは適宜設定してください。僕のWindowsの画面はFHDなので、ここでは一回り小さいHDサイズに設定します。
```bash
#Xephyrで仮想画面を作成
Xephyr :2 -screen=1280x720 -resizeable &
#ここでXephyrの黒いウィンドウが出てくると思います。

#LXQtの実行:Xephyr画面に実行する
DISPLAY=:2 startlxqt
```

すると、でっかいウィンドウが出てきてLXQtの画面が出てきたと思います！（スクショなくてすいません）

あとは楽しいWSLライフを！！
RAM32gb vram24gbでllama3 42bを動かす。 

# llama 3 をローカルで動かしたい

しかし、8bモデルでは性能が不足しているし、70bはハイパーパラメータが大きすぎてローカルで動かす場合遅すぎる
こう考える人も多いと思います。

先日、llama3の70bを枝刈りして42bまで圧縮したモデルがhuggingfaceに公開されました。 
そこでこちらのモデルをtext generation webuiを利用してGPU推論をしてみました。

llama3 42 bの概要

https://www.reddit.com/r/LocalLLaMA/comments/1cal17l/llm_comparisontest_llama_3_instruct_70b_8b/

使用マシン:私の自宅に存在するデスクトップPC 

Windows10 home 
intel core i5-13400 
DRAM DDR4 32gb 
GPU NVIDIA RTX 4090 24gb 

GPUに予算を全振りしたこのAI用PCですが、昨今では様々なファイルをvramではなくdramにキャッシュするため
RAM32GBでは厳しく感じています。

### セットアップ
Text generation webuiのインストール 

https://github.com/oobabooga/text-generation-webui 

こちらのリポジトリのread meに従ってインストールしました。 
![73bdfa7d4f2efc2125a98a64e420c3f5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617096/fa2b37af-1883-0a0a-e9de-0851be6cb7a7.png)


### モデルのダウンロード

https://huggingface.co/NyxKrage/llama3-42b-v0-imat-gguf/tree/main 

こちらのURLに公開されている量子化モデルをダウンロードし、使用しました。 

今回はLlama3-42b.Q4_K_Mと Llama3-42b.Q3_K_Mをダウンロードしました。 

### GPU推論 してみる

Q4_K_Mは最大で42/48レイヤーをロードすることが出来きました。 
一部cpuで推論したため、推論速度は1.7 token/s ほどと
64gbのRAMでCommandrを推論した場合の速度と大して変わらない速度でした。
32gbのdramだとかなりギリギリな印象(ngl=42)
![6e39b02ed8abd81f412510c9f27052f1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617096/62263749-4a13-36ef-0503-2511acb331d3.png)

Q3_K_Mは全てのレイヤーをGPUに載せても共有メモリにはみ出さずに推論することが出来ました。 (ngl=48)
また、推論速度も平均6.63token/s とq4のモデルと比べて大きく向上させることが出来ました。 
![5b18118ccab4a836c1e69362296421ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617096/7ea4232b-1ec3-0c71-d152-7237ceead207.png)


### 推論結果
GPT4 turboにて生成した英訳問題を使用して簡易的な出力の確認を行いました。 
![9e835d88e75a8335e98340d4e3d714eb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617096/93416330-8f7e-dbc1-90c0-a7af375f92bc.png)


以下はGPT4によって生成された問題です。

![9ea9c876543cdf44af0364fe82faf3a3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617096/9b1a7ff1-9b99-3d55-97fe-50be271ec1a8.png)

結構うまく翻訳出来ている気がします。

### 総括
Llama3は日本語でのトレーニングが殆ど行われていないため、日本語→英語のタスクは非常に得意ですが、和訳問題は苦手としている印象を強く受けました。 

また、日本語でpromptを入力しても英語で返答するなどの例が多数見受けられました。 
gpt3.5を超えるモデルでも32gbのramと24gbのvramで推論できるということが分かりました。 
ローカルで動かすことが出来る高性能なモデルは様々なプロダクトに応用できそうだなと思いました。
ps auxコマンド STATの種類まとめ

## 概要

`ps aux`コマンドのSTATの部分の種類を簡単にまとめる

## 内容

### メインステータス

| 種類 | 内容 | 備考 |
| --- | --- | --- |
| D | 不可中断スリープ状態（ディスクI/Oなどで待機中）。この状態のプロセスは、シグナルによっても中断できません。 | |
| R | 実行中、または実行可能（実行待ち）状態。 ||
| S | 中断可能なスリープ状態。プロセスはイベントの発生を待っています。 ||
| T | 停止状態。ジョブ制御シグナルなどによって停止されています。 ||
| Z | ゾンビ状態。終了したが、親プロセスによってまだ回収されていないプロセス。 ||
| I | アイドル状態（カーネルスレッドのみ）。 ||

### 修飾子

| 種類 | 内容 | 備考 |
| --- | --- | --- |
| < | 高優先度プロセス。 ||
| N | 低優先度プロセス（nice値が高い）。 ||
| L | ページがロックされているプロセス（リアルタイムまたはカーネルメモリのロック）。 ||
| s | セッションリーダー。 ||
| l | マルチスレッドプロセス（クローンされたプロセス）。 ||
| + | フォアグラウンドプロセスグループに属している。 ||
WSLを使わずにWindowsでLinuxのコマンドを使えるようにする

# ゴール

Windowsのコマンドプロント上で`ls -al`や`grep`などのLinuxコマンドを使えるようにする。

# 環境構築

1. [MSYS2](https://www.msys2.org/)公式サイトよりインストーラーをダウンロード
1. インストーラーの実行
1. 環境変数のPATHに`C:\msys64\usr\bin`を追加する

# update

```bash
pacman -Syu
```

# vimのインストール

```bash
pacman -S vim
```
Whisperを利用した文字起こし

この記事では、Open AIが開発した[Whisper](https://github.com/openai/whisper)を使用して、音声データをテキスト形式に変換する方法について説明します。

# 必要なツールのインストール

以下の手順で必要なツールの準備をします。

```bash
# Whisperのインストール
pip install git+https://github.com/openai/whisper.git
# ffmpegのインストールが必要です
apt install ffmpeg

```

# コードの実行

Python環境で以下のコードを実行します。

```python
import whisper # Whisperのインポート
model = whisper.load_model('large') # 利用するモデルを指定（ここでは最も精度の高い'large'を指定）
result = model.transcribe('音声データ.mp3') # resultに文字起こししたテキストデータを格納
with open("書き起こしテキスト.txt", "w") as f:
    print(result['text'], file=f) # テキストデータを書き出し

```

モデルのサイズは、'tiny'、'base'、'small'、'medium'、'large'の順で大きくなり、各モデルのサイズが大きくなるほど文字起こしの精度が上がります。モデルが大きければ大きいほど、実行時間が長くなり、文字起こしの精度は高くなります。一般的な会議やレコーダーの場合には、'large'モデルを使用することで、「なんとか使えるレベル」の精度が得られると感じました。

1時間40分の会議のテキスト化には、私の環境では約6時間かかりました。

# まとめ

WhisperにはGitHubバージョンとAPIバージョンがあり、さらにGitHubバージョンにはPythonバージョンとコマンドラインバージョンがあります。今回紹介したのはPythonバージョンで、コマンドラインバージョンも動作することを確認しています。

APIバージョンはGitHubバージョンよりも高性能とされていますが、有料であること（それほど高額ではありませんが）や、最長25分の音声ファイルしか受け付けないため、ファイル分割が必要となる等、少々手間と費用が必要です。
CpawCTF Q10.[Forensics] River



# 解法概要

与えられた画像データから位置情報（経緯度）を抜き出し特定した．
# 解法その1 (GUIを用いる)

ダウンロードしたファイルを右クリック→情報を見る（下図）

![スクリーンショット 2024-03-22 22.27.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908503/241c7acb-8928-eefb-9853-4831bc28d68f.png)

詳細情報より位置情報を入手する（下図）
![スクリーンショット 2024-03-22 22.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908503/9d66fa60-46ad-1832-da0b-29feeb25e100.png)

入手した緯度，経度を元に各種検索エンジンを用いて川の名前（甲突川)を求めることができる．
# 解法その2　（ターミナルコマンドを用いる）

    [ターミナル]
    mdls file_name

上記コマンドでjpgファイルに含まれる情報（下記述）を出力することができる．

    [結果の一部]
    kMDItemLatitude                    = 31.5841
    kMDItemLogicalSize                 = 424184
    kMDItemLongitude                   = 130.5477016666667

入手した緯度，経度を元に各種検索エンジンを用いて川の名前（甲突川)を求めることができる．

以上よりフラッグ（cpaw{koutsukigawa}）を入手できる．
日本語プログラミング言語Mind８で十進数計算（小数対応2）

## 掛け算もできました
割と簡単でした。これから、さらにテストしてバグをつぶします。
### 小数の掛け算
 ```
 Ｌ小数の掛け算結果とは　（Ｌ小数、Ｌ小数　→　Ｌ小数）
　　　　Ｗ小数Ａは　構造体情報
　　　　Ｗ小数Ｂは　構造体情報
　　　　Ｗ整数Ａは　構造体　Ｌ小数型
　　　　Ｗ整数Ｂは　構造体　Ｌ小数型		
　　　　Ｗ小数桁数Ａは　変数
　　　　Ｗ小数桁数Ｂは　変数
　　　　Ｗ小数桁数は　変数
　　　　Ｗ整数積は　構造体　Ｌ小数型
	Ｗ小数Ａと　Ｗ小数Ｂに　入れる
	Ｗ小数Ａの　Ｌ小数桁数を　Ｗ小数桁数Ａに　入れる
	Ｗ小数Ｂの　Ｌ小数桁数を　Ｗ小数桁数Ｂに　入れる
	Ｗ小数桁数Ａと　Ｗ小数桁数Ｂを　加え　Ｗ小数桁数に　入れる
	Ｗ小数Ａを　Ｗ小数桁数Ａだけ　Ｌ小数を指定桁桁上げし	Ｗ整数Ａに　入れる
	Ｗ小数Ｂを　Ｗ小数桁数Ｂだけ　Ｌ小数を指定桁桁上げし	Ｗ整数Ｂに　入れる
	Ｗ整数Ａと　Ｗ整数Ｂの　Ｌ整数の掛け算結果を　Ｗ整数積に　入れる
	Ｗ整数積を　Ｗ小数桁数だけ　Ｌ小数を指定桁桁下げし	返す。
 ```
 ### 実行結果
 ```
 c:\mind8\pmind\sample>lnum-sub03
２つの小数の四則演算をします。（空入力で終了）
小数１＝123.45
小数２＝11.1
　積＝+1370.295
小数１＝11.11
小数２＝11.11
　積＝+123.4321
小数１＝-456.0
小数２＝-100
　積＝+45600.0
小数１＝123.456
小数２＝1.1
　積＝+135.8016
 ```
 残るは割り算です。
プロパティ 'xxx' は型 'never' に存在しません。

## 問題点
TypeScriptの開発中に以下のようなエラーが出ています。
APIから受け取る配列型の指定がないため、Never型になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435389/bb70a6c5-0d68-3e6d-4e6e-e675582b0dbf.png)

## 解決方法
`<script>`タグ内に以下の`interface`を追加してあげます。
``` js
interface User {
  id: number;
  name: string;
  email: string;
  address: {
    street: string;
  };
}
```
userFetchのあとに型を追加してあげます。
``` js
const { data: users } = await useFetch<User[]>(
  "https://jsonplaceholder.typicode.com/users"
);
```

## 結果
エラーが解消されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435389/c4c0fcfb-0d0a-b4a8-23be-d1c742c71af2.png)
日本語プログラミング言語Mind８で十進数計算（小数対応1）

## いよいよ小数計算を実装
加算と減算ができました
## 加算
```
Ｌ小数の加算結果とは　（Ｌ小数、Ｌ小数　→　Ｌ小数）
　　　　Ｗ小数Ａは　構造体情報
　　　　Ｗ小数Ｂは　構造体情報
　　　　Ｗ整数Ａは　構造体　Ｌ小数型
　　　　Ｗ整数Ｂは　構造体　Ｌ小数型		
		Ｗ小数桁数Ａは　変数
		Ｗ小数桁数Ｂは　変数
		Ｗ小数桁数は　変数
		Ｗ整数和は　構造体　Ｌ小数型
	Ｗ小数Ａと　Ｗ小数Ｂに　入れる
	Ｗ小数Ａの　Ｌ小数桁数を　Ｗ小数桁数Ａに　入れる
	Ｗ小数Ｂの　Ｌ小数桁数を　Ｗ小数桁数Ｂに　入れる
	ＭＡＸ（Ｗ小数桁数Ａ,Ｗ小数桁数Ｂ）を　Ｗ小数桁数に　入れる
	Ｗ小数Ａを　Ｗ小数桁数だけ　Ｌ小数を指定桁桁上げし	Ｗ整数Ａに　入れる
	Ｗ小数Ｂを　Ｗ小数桁数だけ　Ｌ小数を指定桁桁上げし	Ｗ整数Ｂに　入れる
	Ｗ整数Ａと　Ｗ整数Ｂの　Ｌ整数の加算結果を　Ｗ整数和に　入れる
	Ｗ整数和を　Ｗ小数桁数だけ　Ｌ小数を指定桁桁下げし	返す。
```
## 減算
一行を除き加算と同じコードです。
```
Ｌ小数の減算結果とは　（Ｌ小数、Ｌ小数　→　Ｌ小数）
　　　　Ｗ小数Ａは　構造体情報
　　　　Ｗ小数Ｂは　構造体情報
　　　　Ｗ整数Ａは　構造体　Ｌ小数型
　　　　Ｗ整数Ｂは　構造体　Ｌ小数型		
		Ｗ小数桁数Ａは　変数
		Ｗ小数桁数Ｂは　変数
		Ｗ小数桁数は　変数
		Ｗ整数和は　構造体　Ｌ小数型
	Ｗ小数Ａと　Ｗ小数Ｂに　入れる
	Ｗ小数Ａの　Ｌ小数桁数を　Ｗ小数桁数Ａに　入れる
	Ｗ小数Ｂの　Ｌ小数桁数を　Ｗ小数桁数Ｂに　入れる
	ＭＡＸ（Ｗ小数桁数Ａ,Ｗ小数桁数Ｂ）を　Ｗ小数桁数に　入れる
	Ｗ小数Ａを　Ｗ小数桁数だけ　Ｌ小数を指定桁桁上げし	Ｗ整数Ａに　入れる
	Ｗ小数Ｂを　Ｗ小数桁数だけ　Ｌ小数を指定桁桁上げし	Ｗ整数Ｂに　入れる
	Ｗ整数Ａと　Ｗ整数Ｂの　Ｌ整数の減算結果を　Ｗ整数和に　入れる
	Ｗ整数和を　Ｗ小数桁数だけ　Ｌ小数を指定桁桁下げし	返す。
```
## テスト用
```
Ｌ小数１は　構造体　Ｌ小数型。
Ｌ小数２は　構造体　Ｌ小数型。
Ｌ小数３は　構造体　Ｌ小数型。
Ｌ小数４は　構造体　Ｌ小数型。

メインは　　　　　　　　（ ・ －－＞ ・ ）
　　Ｗ文字列は　文字列実体
	「２つの小数の四則演算をします。（空入力で終了）」と 表示し　改行し
	ここから
		「小数１＝」と　表示し
　　　　　　　　　文字列入力し　Ｗ文字列に　入れる
		Ｗ文字列が　空列？
			ならば　打ち切り
			つぎに
 		Ｗ文字列を　Ｌ小数変換し　Ｌ小数１に　入れる
		「小数２＝」と　表示し
			文字列入力し　Ｗ文字列に　入れる
		Ｗ文字列を　Ｌ小数変換し　Ｌ小数２に　入れる
			Ｌ小数１と　Ｌ小数２の　Ｌ小数の加算結果を　Ｌ小数３に　入れる

		「　　　和＝」と　表示し　Ｌ小数３を　Ｌ小数文字列変換し　表示し　改行する
			Ｌ小数１と　Ｌ小数２の　Ｌ小数の減算結果を　Ｌ小数４に　入れる
		「　　　差＝」と　表示し　Ｌ小数４を　Ｌ小数文字列変換し　表示し　改行する	
		　改行する		
	繰り返す。
```
## 実行結果
```
c:\mind8\pmind\sample>lnum-sub03
２つの小数の四則演算をします。（空入力で終了）
小数１＝123.456
小数２＝12.3
　　　和＝+135.756
　　　差＝+111.156

小数１＝12.3
小数２＝123.456
　　　和＝+135.756
　　　差＝-111.156

小数１＝-123.3
小数２＝23
　　　和＝-100.3
　　　差＝-146.3

小数１＝456.3
小数２＝-111.1
　　　和＝+345.2
　　　差＝+567.4
```
明日は、掛け算を作りたいと思います。
Salesforce Platform デベロッパー 備忘録 #過去問

以下は過去問の兼備忘であり,  決して問題提供や100%の解説をするつもりはない.

### Q1.  開発者はAccountオブジェクトにトリガーを作成し,  トリガーが適切にバルク項目であるかどうかをテストしたいと考えている.  開発者チームは一意の名前を持つ200の取引先レコードを使用してトリガーをテストする必要があると判断した.最小限のコードで単体テスト内にテストデータを作成するにはどの2つのことを行う必要がありますか？

A.Test.loadDataを使用して、テストメソッドにデータを入力します。
B.テストクラスで@isTest（seeAllData = true）アノテーションを使用します。
C.テストクラスで@isTest（isParallel = true）アノテーションを使用します。
D.テストデータを含む静的リソースを作成します。

### 解答:  A, D

考察:  https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_testing_load_data.htm


Q2.  取引先のデフォルトでbeforeトリガーが起動するアクションはどれ？

A.データローダーとバルクAPIを使用してデータをインポートする
B.選択リストの名前の変更または置換
C.一括アドレス更新ツールを使用してアドレスを更新する
D.リードを取引先責任者、取引先に変換する

解答:  A

バルクAPIは,  大量のデータを処理するときに便利らしい(
https://developer.salesforce.com/docs/atlas.ja-jp.api_asynch.meta/api_asynch/asynch_api_intro.htm).

-- 設問に対するHelp --
https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V000074oj6ISAQ


Q3. A社には,  コールセンターエージェントがインバウンドサービスデスクコールを処理するときに使用するマルチスクリーンフローがある.フローのステップの1つでエージェントには,  外部の注文管理システムからリアルタイムで取得され,  画面に表示される注文番号と日付のリストが表示される必要がある.  この要件を満たすために開発者は何を使用する必要がありますか？

A.アウトバウンドメッセージ
B.呼び出し可能なメソッド
C.ApexRESTクラス
D.Apexコントローラー

### 解答:  C
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_rest_intro.htm

※用語メモ
ガバナ制限 = ガバナ制限とは,  システムリソースの使いすぎを防ぎ安定性と性能を維持するためのルールや制限のことを指す言葉.

### Q4.  トリガーが同じオブジェクトとイベントに関連付けられている場合の正しい実行順序を記述しているのはどれですか?

A.トリガーはトリガー名のアルファベット順に実行されます。
B.トリガーの実行順序は保証できません。
C.トリガーは作成された順序で実行されます。
D.トリガーは変更された順序で実行されます。

解答:  B

### Q5.  開発者は次のコードをデバッグし,  取引先が作成されない理由を特定している. 
 「Accounta = new Account（Name = 'A'）; Database.insert（a、false）;」
問題のデバッグに役立てるためには,  コードをどのように変更する必要がある？

A.2番目の挿入メソッドパラメータをTRUEに設定します
B.insertメソッドの前にSystem.debug（）ステートメントを追加します
C.挿入メソッドの戻り値をSaveResult変数に収集します
D.挿入メソッドの周りにtry / catchを追加します

解答:  C

Database.insert(a, ⚪︎⚪︎)⚪︎⚪︎にfalseを設定することで,  呼び出しが「部分的成功」モードで実行される.  処理中にエラーが発生しても例外はスローされず,  SaveResultオブジェクトが成功したかどうかを示す.  この機能は大量のデータを処理する際や複数レコードに対してデータベース操作を行う時に有用である.  レコードの成功と失敗を個別に確認できるから,  エラーハンドリングやロギングに役立つ.
【初心者】TypeScript文法を理解していくvol.6

## はじめに
引き続きTypeScriptを学習していく。今回は前回に引き続きimportのやり方を学んでいく。

## 2種類のImport

### default import（名前なし import）
default exportしたモジュールをそのまま読み込む

```.ts
// エントリポイントから module を import する
import { function1, function2, function3, function4 } from './module'

function1()
function2()
function3()
function4()
```

- モジュールから複数のエクスポートを同時にインポートする場合に便利

### named import(名前付き import)
1ファイルから複数モジュールを読み込む

```.ts
// default export された module を直接 import することもできる
// import 時に名前を変えることができる
import defaultFunction1 from './module/default1'
import defaultFunction2 from './module/default2'

defaultFunction1()
defaultFunction2()
```

- モジュールから1つのデフォルトエクスポートをインポートする時に好まれる

## おわりに
個人的には、名前付きimportを好んで使いそうだと思った。default exportは汎用的ではないな〜と。
複数IEnumerableのZip関数

# 欲しい機能
LinqのZip関数が２個ないし３個までしかまとめられない。
もっとたくさんのIEnumerableをまとめて先頭から返す関数がほしい。

例えば、時系列に沿ったデータが複数あって、
それを１日毎に合計・平均値を取りたいといった場合

# 図にすると下のような感じ
これを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245760/7c2e7b36-aa97-9429-92fa-bd1a0da41431.png)
こうしたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245760/5c33649d-bb55-e555-4db5-f31a8c69ba06.png)

# 早速だけど、実装
```C#
public static IEnumerable<IEnumerable<T>> Zip<T>(this IEnumerable<IEnumerable<T>> source)
{
    var enumerators = source.Select(s => s.GetEnumerator()).ToArray();
    if (enumerators.Length <= 0) yield break;
    while (enumerators.All(e => e.MoveNext()))
        yield return enumerators.Select(e => e.Current);
}
```

# 欠点とこれから
標準のZip関数と違って、同じ型しかまとめられない。
どちらかというと、行列の転置みたいな感じかな。関数名がZipで良いかは分からない。
効率とか速度とかは調べてない。問題点等あれば、指摘してほしい。
Azure Portal でサブスクリプションのリソース プロバイダーを registered にできない場合


大した話ではないがハマったので記載。

リソース プロバイダーを登録するため、登録状態にしたいリソース プロバイダーの右側の […] > [登録] をクリックし Registered にしようとする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335429/a01fda7f-f866-40b4-a8ed-10582f1222b5.png)


しかし何度やっても状態が変わらず、NotRegistered のままで登録されない

MS Learn を見ると、リソース プロバイダーを選択して左上の登録をクリックするように記載が。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335429/7f379e26-3391-1e84-14f5-9c37808bd9b6.png)
登録ボタンが…


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335429/6fe28dd8-c9fb-5556-6c1e-ef56e51cff92.png)

あ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335429/c23f3ff8-8643-edb8-f91c-93d12a2a0ebe.png)

登録された！

プロバイダーの横の … は前から使用できないのか、一時的な不具合かどうなんでしょうか。


＜参考： Microsoft Learn＞

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/troubleshooting/error-register-resource-provider?tabs=azure-portal#solution?wt.mc_id=MVP_380462
ミュータブルとイミュータブルについて

## 初めに

JavaScriptを学習するにあたってイミュータブル・ミュータブルという言葉の意味が曖昧だったので特徴や違いなどについて学習した際の備忘録になります。

:::note warn
初学者のため間違いがある場合があります。
その際はご指摘いただけると嬉しいです。
:::


## イミュータブル
JavaScriptにおいて、プリミティブ型（文字列、数値、真偽値など）は変更不可能、つまり```イミュータブル```と言えます。

例えば下記のように変数aの値を変更することを考えます。

```js
let a = 'apple';
a = 'orange';
```
let a = 'apple';からa = 'orange';に変更する場合、appleという文字列自体は変更されず、変数aの参照先が変わるだけです。
appleはメモリ上に残り、orangeは新しい場所に作成されます。これが文字列が```イミュータブル```である理由です。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472634/ab460918-3066-a2f7-8c48-5beaf77ce871.png)

変数aが持つ参照の値を変更することができて、変数の値（参照するアドレス）は変更可能だが、
 プリミティブ型の値自体は変更不可能なため（appleという値自体が入っているメモリ自体を上書きできないため)文字列は```イミュータブル```と言えます。


 ## ミュータブル

 一方で、オブジェクトは```ミュータブル（変更可能）```です。
 オブジェクトはプロパティ名とプロパティ値を持ち、これらのプロパティや値は変更可能であるため、オブジェクトは```ミュータブル```であると言えます。
 
 下記の例で考えてみます。

 ```Js
let value = {
  fruit: 'apple'
};

value['fruit'] = 'orange';

 ```

上記の例では、fruitプロパティの値が'apple'から'orange'に変わります。
appleとorangeはメモリ上の異なる場所に格納され、fruitプロパティは新しい値orangeを指すようになります。
これにより、オブジェクトのプロパティや参照する値を変更できるため、オブジェクトは```ミュータブル```と言えます。
 
 ![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472634/21ccb3f4-5d44-8a75-c8d1-77a0ef535123.png)

※ただし、```Object.freeze()```メソッドなどを使用することで、オブジェクトをイミュータブル（変更不可能）にすることも可能です。
これは、一定の条件下でオブジェクトの変更を防ぎたい場合に便利なものとなっています。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze


## 終わりに

今回はイミュータブル、ミュータブルという曖昧に理解してしまっていた概念を整理しました。この記事が少しでも役立てたら嬉しいです。


## 参考

https://www.udemy.com/course/javascript-essence/
日本語プログラミング言語Mind８で十進数計算（小数対応準備3）

## 桁上げ時の不要な前ゼロを除去
桁下げ時の後ゼロは害が少ないのでとりあえずそのままにします。
### 改良後のプログラム
```
Ｌ小数を指定桁桁上げとは　（Ｌ小数、非負整数→Ｌ小数）
		Ｗ小数は　構造体情報
		Ｗ桁上げは　変数
		Ｗ作業小数は　構造体　Ｌ小数型
		Ｗ桁数は　変数
		Ｗ小数桁数は　変数
		Ｗ整数桁数は　変数
		Ｗ桁１は　変数
		Ｗ桁２は　変数
	Ｗ小数と　Ｗ桁上げに　入れる
	Ｗ桁上げが　０　以下
		ならば　Ｗ小数を　返し　終わり
		つぎに
	Ｗ小数の　Ｌ桁数を　Ｗ桁数に　入れる
	Ｗ小数の　Ｌ小数桁数を　Ｗ小数桁数に　入れる
	Ｗ小数桁数が　Ｗ桁上げ　以上
		ならば　
			Ｗ小数を　Ｗ作業小数に　入れ
			Ｗ作業小数の　Ｌ小数桁数を　Ｗ桁上げ　減少し					
		さもなければ　
			Ｗ作業小数を　クリアする
			Ｗ小数の　Ｌ符号を　Ｗ作業小数の　Ｌ符号に　入れる
			Ｗ桁上げから　Ｗ小数桁数を　減少し
			Ｗ桁数に　Ｗ桁上げを　加え　Ｗ作業小数の　Ｌ桁数に　入れる
			１を　Ｗ桁１に　入れる
　　		１に　Ｗ桁上げを　加え　Ｗ桁２に　入れる
			Ｗ桁数　回数指定し
				Ｗ小数の　Ｌ数字（Ｗ桁１）を　
				Ｗ作業小数の　Ｌ数字（Ｗ桁２）に　入れる
				Ｗ桁１を　一つ増加する
				Ｗ桁２を　一つ増加する
			繰り返す
		つぎに
　※　整数部の前ゼロサプレス
	Ｗ作業小数の　Ｌ桁数から　Ｗ作業小数の　Ｌ小数桁数を　引いて
		　Ｗ整数桁数に　入れる
	Ｗ整数桁数が　２　以上
		ならば
			Ｗ作業小数の　Ｌ桁数を　Ｗ桁１に　入れる
			Ｗ整数桁数から　一つ引いて　回数指定し
				Ｗ作業小数の　Ｌ数字（Ｗ桁１）が　０と　等しい
					ならば　Ｗ桁１を　一つ減少し
					さもなければ
　　						打ち切り
					つぎに
			繰り返す
			Ｗ桁１を　Ｗ作業小数の　Ｌ桁数に　入れる
		つぎに
	Ｗ作業小数を　返す。
```
### 実行結果
```
c:\mind8\pmind\sample>lnum-sub01c
小数を桁上下げします。（空入力で終了）
小数＝0.0012345
１けた桁上げ＝+0.012345
２けた桁上げ＝+0.12345
３けた桁上げ＝+1.2345
４けた桁上げ＝+12.345
５けた桁上げ＝+123.45
小数＝0.0123
１けた桁上げ＝+0.123
２けた桁上げ＝+1.23
３けた桁上げ＝+12.3
４けた桁上げ＝+123
５けた桁上げ＝+1230
```
次回は、足し算と引き算を実装します。
Lambda実行時のログ出力方法（Python）

# 概要
Lambda実行時のログ出力方法を簡単に記す。
ロググループの作成や紐づけ方法は記載しない。（気が乗れば追記するやも）

# 実行環境
Python3.11


```python:lambda_function.py
import logging

# logger初期化
logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    """
    - 基本的なlog出力

    Args:
        - event: Lambda event
        - context: Lambda実行コンテキスト
    Return:
        なし
    """
    logger.info('INFOログ')
    logger.warn('WARNINGログ')
    logger.error('ERRORログ')
```
エンジニア、PMのためのヒアリング技集

表題の件の自分なりのまとめ、メモ。

# よくある話
- 基本的なことすぎるのかも、と質問しづらい
- 自分で解決しなきゃ、あとちょっとでわかりそう、で遅延か期待を下回る
- めっちゃ忙しそうで聞きづらい
- 立場的に聞きづらい

→相手の評価ガタ落ち

# なぜそのような事態に陥るのか
原因：お互いの意識のすれ違い

すれ違いの例

■質問者
- 質問は迷惑をかけるもの、という妄想
- そんなこともわからない、と思われたくないプライド

■評価者
- 報告がないから状況がわからない
- 報告の頻度が少ない
- 仕事が遅い


# ヒアリングの頻度を上げる、ハードルを下げる攻め方tips
- 環境 & 対個人手法
- 具体的な質問の手法と文言


## 【環境&対個人】ヒアリングしやすい状況を自分で作る
- 最初の三か月～半年、なんでも周りの人に聞きまくります、ということを事前に全体に通知しておく。（質問しまくるけどウザがらないで下さい）
- 毎週差し入れする。差し入れとともに、感謝とまた質問させてください、と念を押す
- めっちゃ助かってます、と対応してくれた人の評価が上がるように振る舞う
- さすがっすね、できる人は違いますね、など「ほめ」のバリエーションをもっておく
- 聞きづらい人には、個別のお菓子をもっていって聞く
- 忙しい人には、
    - 「～について」と「用件」を明確にし、
    - 「これくらいの時間ほしい」と所要時間を伝え、
    - わびの品をもって事前にアポをとる

##### POINTマインド：対応してくれた人にプラスがあるような「「　環境、流れにする　」」

## 具体的な質問の文言
バリエーションが欲しい。どんどん追記したい。

### 認識の齟齬、質問ヒアリング不足で起こるミス
- メンバー責任の領域ミス、（これはやるけどあれはやらないが互いに想定と食い違う）
- パフォーマンスの低下（聞きづらい→チームの仕事のスピードの低下）
- いつの間にか分断（メンバーの辞職）


#### 具体的な文言
■導入でハードルを下げる
- 根本的なこと聞いていいですか
- 当たり前かもしれないけど聞いていいですか
- 失礼かもしれないけど聞いていいですか
- 自分の知識理解不足なだけなんだと思うんですけど、聞いていいですか
- 自分の理解5%くらいだと思うんですけど、～で合ってますか

■姿勢を示す
- ～もっと正確に理解したいのですが、
- ～気されている部分についてもう少しお伺いしたいのですが

■自分の認識を軸に、相手の認識を浮き彫りにする
- ～ということをお伺いされたいという認識で合っていますでしょうか
- 自分が調べた限り～という認識で合ってますか
- 自分は～と聞いていたんですけど、～ということでしょうか。

■直球で聞く
- どれくらいのペースで仕事（アウトプット）欲しいとか、想定ありますか
- それくらいの頻度で質問していいとかありますか
- どういうことしてほしいなどの想定でしょうか
- どういう立ち回りしてほしいなどの想定でしょうか
バリデーションについて

Formを送信した際に内容が空だとエラー画面に移動してしまう際の対策

# バリデーションとは
テストとその後の生産で実行される手順、プロセス、または活動が、すべての段階で望ましいレベルのコンプライアンスを維持していることを証明する文書証拠を確立するプロセス。

https://en.wikipedia.org/wiki/Validation_(drug_manufacture)

https://readouble.com/laravel/11.x/ja/validation.html#quick-writing-the-validation-logic

大まかに言えば、内容が正しいかチェックすること
```php
$validatedData = $request->validate([ルール],[カスタムメッセージ]);
```

# コントローラー内にバリデーション追加
### ルールの追加
第１引数は、各フィールドに対するバリデーションルールの配列。
バリデーションの方法は数種あるが今回は簡単なcontrollerに直接書き込む方法でしてみる。
この方法だとcontrollerへの記述が多くなるので、記述量が増える際は別ファイルに書き込む。
方法は簡単で元々あるvalidate関数を使う方法
```php5:controller
public function store(Request $request): RedirectResponse
{
    $validated = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);
    // バリデーションに通れば下記の処理を実行する。

    return redirect('/posts');
}
```

### エラーメッセージの表示
エラー表示を出したい箇所に`@error`文を記述し、その中に表示させたい要素を入れる。
```php5:view
@error('title')
    <div>{{ $message }}</div>
@enderror
```

### エラーメッセージカスタム
第２引数は、各ルールに対するカスタムエラーメッセージを指定することができる連想配列。
```php
    $validated = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ],[
        'titel.max' => 'タイトルは255文字以内で入力してください。',
        'body' => '入力は必須です',
    ]);
```
Cordova、MONACAのiOSプライバシーマニフェストの対応が出来た

Monaca IDEでconfig.xmlに下記を追加しました。
私のアプリは、下記の説明がないという指摘をApp Store Connectへアップロードする度に指摘されていました。

１: NSPrivacyAccessed
APICategoryFileTimestamp 

2: NSPrivacyAccessed
APICategoryUserDefaults

3: NSPrivacyAccessed
APICategorySystemBootTime

MONACAで対応方法がリリースされたので参照にしました。
https://press.monaca.io/takuya/24330?_ga=2.245453124.1777129446.1713752064-840546491.1696223559

でも１と３が掲載のサンプルには記載されていなかったのでApple公式のページをしぶしぶ時間を掛けてじっくり眺めました。

https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api?language=objc


最終的に、下記をconfig.xmlへ記載し、ビルド、提出したら通りました。

```ruby:qiita.rb
 <platform name="ios">
  <privacy-manifest>
<key>NSPrivacyTracking</key>
<true/>
<key>NSPrivacyTrackingDomains</key>
<array>
 <string>app.appsflyer.com</string>
</array>

 <key>NSPrivacyAccessedAPITypes</key> 
 <array> 
 	<dict> 
 		<key>NSPrivacyAccessedAPIType</key>
 		<string>NSPrivacyAccessedAPICategoryUserDefaults</string> 
 		<key>NSPrivacyAccessedAPITypeReasons</key> 
 		<array> 
 			<string>CA92.1</string> 
 		</array> 
 	</dict>
<dict> 
 		<key>NSPrivacyAccessedAPIType</key> 
 		<string>NSPrivacyAccessedAPICategoryFileTimestamp</string> 
 		<key>NSPrivacyAccessedAPITypeReasons</key> 
 		<array> 
 			<string>C617.1</string> 
 		</array> 
 	</dict>
<dict> 
 		<key>NSPrivacyAccessedAPIType</key> 
 		<string>NSPrivacyAccessedAPICategorySystemBootTime</string> 
 		<key>NSPrivacyAccessedAPITypeReasons</key> 
 		<array> 
 			<string>35F9.1</string> 
 		</array>
 	</dict>  
 </array>

<key>NSPrivacyCollectedDataTypes</key>
<array>
 <dict>
   <key>NSPrivacyCollectedDataType</key>
   <string>NSPrivacyCollectedDataTypeDeviceID</string>
   <key>NSPrivacyCollectedDataTypeLinked</key>
   <false/>
   <key>NSPrivacyCollectedDataTypeTracking</key>
   <false/>
   <key>NSPrivacyCollectedDataTypePurposes</key>
   <array>
     <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
   </array>
 </dict>
</array>
 </privacy-manifest>
</platform>
```

<string>CA92.1</string> 、<string>C617.1</string> 、<string>35F9.1</string> 、は、APIの利用目的で、下記から選び記載します。

https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api?language=objc

５月１日になったら、TestFlightでテストをしますので、それまでは、正しかったかどうかは分かりませんが、一応、アプリのアップロードで指摘されることはなくなりました。

参考になったサイト：

https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api?language=objc

https://press.monaca.io/takuya/24330?_ga=2.245453124.1777129446.1713752064-840546491.1696223559

https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_data_use_in_privacy_manifests

https://techblog.openwork.co.jp/entry/ios-privacymanifest
プログラミング○週目はやばい

# はじめに

おはようございます。Watanabe Jin(@Sicut_study)です。
今回は駆け出しエンジニアが時々誤解するようなプログラミングを覚えるということについて話していきます。

# 毎朝5分で読める

朝5分で読めるシリーズは平日7時にエンジニアの方に気づきが与えられるような記事を投稿しています。

よければ@Sicut_studyのフォローを宜しくおねがいします！

聞いて学びたい方はこちら👇

https://stand.fm/channels/65db27e353b400abe28ec29a

# プログラミングは覚える必要はない

あなたはプログラミングをやるときに文法を覚えないといけないと思って、反復的に同じような教材をやっていませんか？

面白いことにネットには「Progate 〜週目」というような驚愕のツイートがあります。

私はアウトプットを推進していて、そもそもインプットすることすらいらないと言っているような人なので考えられないと毎度思ってしまいます。

<font color="red">**プログラミングを覚える必要はありません**</font>

# どこにいけば思い出せるかを覚える

プログラミング学習において覚えてほしいのは

**<font color="red">どこを参考にすれば思い出せるか</font>**

ということです。
私は多くの書籍やUdemyをさらっとやって、今後参考になりそうと思えたような**学びのあった教材**を手元に置くようにしています。

また、ネットでみてなんとかできるようになったこと
つまり、**時間が経ったらやり方を忘れてしまいそうで、ネットのどこかのサイトで記事をみた**ことに関しては、その記事のリンクを保存しておくか、<font color="red">**その工程を後から見返せるようにQiitaのハンズオン記事にしておきます**</font>

私も過去にAWSを使ってCI/CDを組むまでの工程は色々なネットの情報、書籍の情報を組み合わせて実現したので、作成した後に細かく記事しました👇

https://zenn.dev/jinwatanabe/articles/4d26ac177069f374eb6a

# 私がインプットをするタイミング

普段からアウトプット、アウトプットと言っている私ですが実は年にすこしだけ完全なるインプットをする時間があります。

なぜインプットをするのかというと、**今後のできる選択肢を増やして、やれることの選択肢を増やすためです**

例えば最近以下のUdemyを完全インプットとしてやりました

https://udemy.com/course/book-commerce-web-dev-with-nextjs/?couponCode=ST7MT41824

やった理由は「NextAuth」と「Stripe」を触ってみたら、自分のサービスに組み込めそうと考えたからです。この場合アウトプットの重要な要素である**必要だからインプットをする**というのとはかけ離れています。

基本的には**必要なもの**をやることが大切なのですが、時々今後使えそうなものをインプットしておくことで使える手札が増えるようになります。

そしてどこでその手札が増えたのかというところを理解しておけば、いつでも参考にして実装することが可能です。

# より覚えなくて良い世界に

現代ではGoogleの検索も協力になっていますし、多くの人がエンジニアを目指しているので情報も多くあります。

また**AI**が発展したことにより質問すれば調べもしないで多くのことが解決できてしまいます。

**プログラミングを覚えるか覚えないか**

ここだけをしっかり理解できればプログラミングの学習効率も上がってきます。

# 私がよく見返すコンテンツ

最後に私がずっと持っている書籍や動画を紹介します！

AWSではじめるインフラ構築入門 第2版 安全で堅牢な本番環境のつくり方 

https://amzn.asia/d/dIOXhS9

そろそろ常識? マンガでわかる「正規表現」

https://amzn.asia/d/8PsSJma

https://www.udemy.com/course/modern_javascipt_react_beginner/?couponCode=ST7MT41824

https://www.youtube.com/watch?v=9NOg_HSbo9w&t=1391s

# おわりに

今回はプログラミングの考え方について話しました。
反復で動画コンテンツなどをやっている人がいたら絶対に間違えている言っても過言ではありません。ぜひ正しい学び方で成長してください！

ここまで読んでいただけた方は**いいね**と**ストック**よろしくお願いします。
@Sicut_study を**フォロー**いただけるととてもうれしく思います。

https://qiita.com/Sicut_study

また明日の記事でお会いしましょう！

![jisou-lp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/bfeb082c-62aa-0ad5-92d1-d940ed4d5873.png)


# おすすめ記事

https://qiita.com/Sicut_study/items/f0d9f75b7f0aa1b83f29

https://qiita.com/Sicut_study/items/69776ee0d7707d2ff52d

https://qiita.com/Sicut_study/items/feacad560446d9ff73e6

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp

# About Me

Webエンジニア転身して1年間本気で勉強
転職ドラフトで高額オファーを複数獲得
そこでの経験からアウトプットやマインドセットの発信に強みがある
エンジニアをやりながら、起業に挑戦中
アイデア作りやパブリックスピーキングを得意としてる

■ Twitter
https://twitter.com/Sicut_study
■ stand.fm
https://stand.fm/channels/65db27e353b400abe28ec29a
■ Youtube
https://www.youtube.com/channel/UCBFrGAJhPuuaoLwUIHBILsA

■ プログラミングコーチングJISOU
https://projisou.jp
■ 体験で学ぶ！JISOU
https://experience-learn.connpass.com/
■ 登壇依頼などご依頼はこちらから
himaria.jin.watanabe@gmail.com
モバイルアプリの未来：新しい開発トレンドと市場の展望

こんにちは、モバイルアプリ開発の未来についての議論に参加していただきありがとうございます。近年、モバイルアプリ市場は著しい成長を遂げており、その影響力はますます拡大しています。特に、売上、出会い系アプリ、そしてRPGアプリという3つのキーワードが、この市場の動向において重要な役割を果たしています。今回の記事では、それぞれのキーワードの意義と、モバイルアプリの未来に与える影響について探ってみたいと思います。
売上とモバイルアプリの経済的重要性
まず最初に考えるべきは、[アプリ 売上](https://newwave-solutions.co.jp/app-sales-ranking/)です。モバイルアプリの売上は、デジタル経済において重要な指標の1つです。アプリの売上が増加すれば、開発者や企業にとって収益の機会が拡大し、新たなビジネスモデルの構築が可能となります。これにより、アプリ開発に対する投資が増え、さらなるイノベーションと成長が促進されます。
出会い系アプリの社会的影響
次に、[出会い 系 アプリ](https://newwave-solutions.co.jp/dating-app/)について考えてみましょう。近年、出会い系アプリは個人の社会的つながりを変革してきました。人々はアプリを通じて新しい友人やパートナーを見つけ、新しい経験を共有しています。しかし、一方で、出会い系アプリはプライバシーや安全性の問題も引き起こしており、その運用には慎重なアプローチが求められています。
RPGアプリのエンターテイメント性
最後に、[rpg アプリ](https://newwave-solutions.co.jp/rpg-%e3%82%a2%e3%83%97%e3%83%aa/)に焦点を当てましょう。RPG（ロールプレイングゲーム）アプリは、プレイヤーに新しい冒険や世界を提供し、エンターテイメント体験を豊かにします。これらのアプリは、その深いストーリーテリングや多様なゲームプレイ要素により、ユーザーを魅了し続けています。しかし、一部の人々はゲーム中の過度の時間消費や依存症のリスクに警戒しています。
まとめ
モバイルアプリの未来は、売上の増加、社会的つながりの変化、そしてエンターテイメントの提供によって塗り替えられます。それぞれのキーワードがこの市場に与える影響を考えることで、私たちはより良い未来を築くための手がかりを見つけることができるでしょう。今後もモバイルアプリの進化に注目して、その発展に貢献していきましょう。
DockerのOSをAlpine 3.14以上にしてCI/CDツールでビルドしたら「/bin/sh: Operation not permitted」エラーが出た

# はじめに
DockerのOSをAlpine 3.13から3.19に上げたところ、CI/CDツールのCodeBuildやCircleCIのビルドで「**/bin/sh: Operation not permitted**」というエラーが出ました。
調べてみると、Alpine 3.14以降で仕様が変わっていて、ビルドに使われるDockerのバージョンが古いとエラーになるようです。

この記事では今回の対応でやったことについて備忘録的に残したいと思います。

# やったこと

## CodeBuildの場合

現在の仕様では、Dockerのバージョン指定は不要なため、
buildspec.ymlの`runtime-versions`からDockerのバージョン指定を除外しました。

https://github.com/aws/aws-codebuild-docker-images/issues/617

```diff:buildspec.yml
version: 0.2

phases:
-  install:
-    runtime-versions:
-      docker: 18
```

次に、CodeBuildのビルドプロジェクトの環境設定からビルドイメージを
`aws/codebuild/amazonlinux2-x86_64-standard:1.0`から
`aws/codebuild/amazonlinux2-x86_64-standard:5.0`へ更新しました。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-available.html

CloudFormationで定義している場合は以下のようになるかと思います。

```diff:
  CodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Name: CodeBuildProject
      ServiceRole: !Ref BuildRole
      Artifacts:
        Type: CODEPIPELINE
      Environment:
        Type: LINUX_CONTAINER
        ComputeType: BUILD_GENERAL1_MEDIUM
-        Image: aws/codebuild/amazonlinux2-x86_64-standard:1.0
+        Image: aws/codebuild/amazonlinux2-x86_64-standard:5.0
        PrivilegedMode: true
```

以上でCodeBuildでの対応は完了です。

 ## CircleCIの場合

CircleCIの設定ファイルで `setup_remote_docker`のバージョン指定をdefaultにします。
 この設定を行うとビルドで使われるDockerのイメージが最新に保たれます。

 https://circleci.com/docs/building-docker-images/#docker-version

 ```diff:config.yml
 steps:
      - setup_remote_docker:
-          version: 17.11.0-ce
+          version: default
```

以上でCircleCIでの対応は完了です。

# さいごに
誰かのお役に立てれば幸いです。
【Access VBA】繰り返し処理

# はじめに
C#でアプリ開発を行っていたエンジニアが、半年にわたるAccess案件で学んだことをまとめています。
今回はAccessVBAでのFor文, ForEach文, Do Until文についてまとめます。

### ⋙For文
>```
>For i = 0 To 5 
>　//繰り返し処理
>Next i
>```
>このようにすると、0から5までの6回処理が繰り返されます
>`( )`括弧が不要であるなど他の言語とは異なる箇所があるので注意しましょう

### ⋙ForEach文
>```
>ForEach X in XList
>　//繰り返し処理
>Next
>```
>このようにすると、XListの要素分、処理が繰り返されます
>他の言語とは異なる箇所があるので注意しましょう

### ⋙Do Until文
>```
>Do Until 〇〇〇
>　//繰り返し処理
>Loop
>```
>このようにすると、〇〇〇がTRUJEになるまで処理が繰り返されます
この構文はADOを用いたレコードセット処理によく用います。
参考に以下の投稿もご覧ください

https://qiita.com/X_marina_y/items/1e2f3153e71927e8fc6a

# さいごに
いかがでしたでしょうか？繰り返し構文はプログラムの基本ですが、他言語と異なる点もありますので、しっかりと復習して活用していきましょう。
また気づくことがあれば追記いたします。
OpsRamp - チケットからOpenAI Assistants APIに対話してみる

# 概要
OpsRampのインシデントチケットの対話ボックスに入力した内容をOpenAI Assistants APIに送信し、OpenAI Assistants APIが返答した内容をインシデントチケットの対話に表示する。

![incident_conversation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/43de79b5-779c-8c0e-6e1e-b8e7e0b08b29.png)

# 使用するOpsRampの機能
- サービスデスク - インシデント: 問い合わせ内容および返答内容を表示
- カスタムインテグレーション (Outbound API): Assistants APIに問い合わせ、および返答を取得、返答をインシデントへ更新
- Process Automation: カスタムインテグレーションの実行、およびインシデントのアップデート

# 設定
## カスタムインテグレーション
以下の5つの Outbound API イベントを作成します。
- Assistants API の Thread および Run を作成

``` Json: Payload
{
  "assistant_id": "<assistant_id>",
  "thread": {
    "messages": [
      {"role": "user", "content": "$conversation"}
    ]
  }
}
```

content に、質問内容が入るようにします。
レスポンスの run_id および thread_id を格納するように設定します。

- Assistants API の Run のステータスを取得

thread_id および run_id を用いて Run のステータスを取得します。
Run の実行が完了したかを確認するために、レスポンスの status を格納するように設定します。

- Assistants API の返答を取得

thread_id を用いて返答を取得します。
レスポンスの data を格納するように設定します。

- Assistants API の Thread を削除

thread_id を用いて作成した Thread を削除します。

- インシデントに返答を更新

[OpsRamp API](https://develop.opsramp.com/v2/api/tickets/clientid-ticketentity-ticketid) を用いて、インシデントに返答を書き込みます。description を指定することで、返答を書き込むことができます。


``` Json: Payload
{
  "description": "$value"
}
```

## Process Automation
一連のカスタムインテグレーションを実行するようにワークフローを設定します。
Service Task の REST Web Service を使用して、作成したカスタムインテグレーションをつなげていきます。
Run の実行が完了したかを判別するために、取得した Run の status を Gateway で判別します。
status が completed であれば、次のタスクに移行し、それ以外であれば Timer Task で数秒遅延させ、再度 Run の status を取得します。
最後に取得した返答をインシデントに書き込みます。
![processautomation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/1092635b-cd6a-e490-6421-e447aca41a39.png)


---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
【小ネタ】Copilot for Teamsに必要な文字起こしを自動で設定する

Copilot for Teamsは文字起こしの内容を読み取るため、会議で文字起こしが有効になっている必要があります。
手動でONにするの忘れた…要約できない…となる場面がありましたが、
Teams会議のオプションから「レコーディングと文字起こしを自動的に行う」を有効にすることで、会議開始時に自動で文字起こしが実行されます。
※今のところオプション選択時にレコーディングせず、文字起こしのみ有効にする設定はできないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/0e326710-fd1e-b538-d8fd-eb30101a313d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/93ea4643-25eb-88b6-08a9-c436acb29996.png)
webアプリ開発で意識したこと

# 初めに
https://qiita.com/opatu07/items/be0d5e38710ba0854fb4

この記事で書いていたWebアプリが完成したので、その開発過程で意識したことを紹介します。


# ソースコードと使い方
https://github.com/opatu07/portfolio

# webアプリ開発で意識したこと  

## ホーム画面

https://qiita.com/opatu07/items/87545143ca78ebb36ba2

## ログイン、ログアウト

https://qiita.com/opatu07/items/31b363be5256f098d19a

## ユーザー新規登録

https://qiita.com/opatu07/items/f42a84ebb05eb0ae9ff9

## マイページ編集

https://qiita.com/opatu07/items/69a5cd66f3801d73eea6

## 記事の新規登録

https://qiita.com/opatu07/items/f1a783356a6a4b58941d

## 記事の更新、削除

https://qiita.com/opatu07/items/5afb919094e233e1a76c

## 記事の詳細とコメント

https://qiita.com/opatu07/items/b8855fdb41866223455a

## カテゴリー、タイトル検索

https://qiita.com/opatu07/items/35b9649c740c0b979dda

## パスワードリマインダー

https://qiita.com/opatu07/items/6686f90fa057d1fa7a79

## webアプリの品質を担保するために

テストケースを作成しました。

https://qiita.com/opatu07/items/ceba265b439e20839ab9

この記事から読めます

## エラー解決について

https://qiita.com/opatu07/items/117192d3c829903c846e

https://qiita.com/opatu07/items/d0ac1cf830e6145165e5

開発過程で出たエラーをqiitaにまとめるように意識をしています。

## レスポンシブ対応

iPhone6/7/8のレスポンシブ対応動画です。

![responsive_function.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3682713/a546ab59-0568-30ac-ff60-3958bc7122d3.gif)