OmniAICreator/Qiita-1.07M huggingface dataset:
個人用マクロブック[PERSONAL.xlsb]をMacで実装する方法

## はじめに

WindowsのExcelでマクロを保存する時、「個人用マクロブック」を使う人は多いと思います。

というのも基本Excelのマクロは保存したブック上でしか使えません。
そのため、一度作ったマクロを他のExcelで使い時は再度Visual Basicを保存するか過去のファイルを開く必要があります。

しかしマクロの保存先を[個人用マクロブック(PERSONAL.xlsb)]にしておくと、新しくExcelファイルを作ってもその個人用マクロブックからいつでもマクロを呼び出すことができるのです。

お気に入りのサイトをブックマークに保存しブックマークバーからいつでもアクセスできるようなイメージです。

これをWindows時代には多用していたのですが、Macに変えてから個人用マクロブックがなくて困っていました。

ですが、色々と試した結果Windowsと同じように実装できたので記しておきます。

## 想定読者

・Windows時代に個人用マクロブックを使っていてMacに変えた方
・Macユーザーでマクロを頻繁に利用する方

## 1.個人用マクロブックの保存先を突き止める

個人用マクロブックとは、Excelで新しいブックを作るときに毎回自動で立ち上がるスタートアプリのようなものです。
スタートアプリとして認識してもらうため、まずは保存先を見つけます。

保存先はこちらです。

```
/Users/[ユーザー名]/Library/Group Containers/[OfficeのID].Office/User Content.localized/Startup.localized/Excel/PERSONAL.XLSB
```

参考：https://ameblo.jp/altair265/entry-12709546846.html

この際、ユーザー名とOfficeのIDを自分のものに変更する必要があります。

保存先を見つける際に役立つ機能として

- 特定のファイルのファイルパスをコピーする
    - ファイルを右クリックしたあとOptionキーを押すと「パス名をコピー」が表示される
- 特定のディレクトリに飛ぶ
    - cmd + shift + G

は使えると便利です。

これでどうにか保存先を突き止めたら、フォルダをFinderのサイドバーに入れておきましょう。
後ほどExcelブックの保存先として指定する際に使います。
ここでは「Excel」とファイル名を変えておきました。

## 2.PERSONAL.xlsbを保存する

続いて、普通にExcelの新規ファイルを作り、保存します。

1で見つけたフォルダを場所として指定し、ファイル形式を[Excel バイナリブック]とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797087/5f3582cc-3729-0e78-b9da-1effc10943a3.png)

名前は勿論自由です。筆者はWindows時代と同じ名前にしています。

## 3.検証する

保存が完了したら、Excelを一旦落としましょう。

その後、新規でブックを立ち上げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797087/1961cf17-f1b3-af75-3238-d84bd3fc0326.png)


ブックを立ち上げたのと同時に、先ほど保存したバイナリブックが立ち上がれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797087/3641500b-3202-d6d8-fcb4-08ce75a6af11.png)


あとは、Visual Basicからマクロを保存する際にバイナリブックを保存すれば完了です。

バイナリブックに自分の作ったマクロが残り続けるため、一度作ったマクロはいつでも呼び出すことが可能です。

お疲れ様でした。
文字列操作

## 文字列調査
|メソッド|　操作内容|
|:------:|:--------|
|equals|内容が等しいか調べる|
equalsIgnoreCase|大文字/小文字を区別せず内容が等しいか調べる|
|length|文字列長を調べる（スペースも1文字としてカウント）|
|isEmpty|空文字か（長さが0か）調べる|

#### equals
内容が等しいか区別する
（大文字、小文字、空白を区別する）
```Main.java
public class Main {
 public static void main(String[] args) {
  String s1 = "Hello";
  String s2 = "Hello";
  String s3 = "HELLO";
  String s4 = " Hello ";
  System.out.println(s1.equals(s2)); // s1とs2を比較
  System.out.println(s1.equals(s3)); // s1とs3を比較
  System.out.println(s1.equals(s4)); // s1とs4を比較
 }
}
```
```結果.
true
false
false
```



#### equalsIgnoreCase
大文字/小文字を区別せず内容が等しいか調べる
（空白は1文字とカウント区別される）
```Main.java
public class Main {
 public static void main(String[] args) {
  String s1 = "Hello";
  String s2 = "Hello";
  String s3 = "HELLO";
  String s4 = " Hello ";
  System.out.println(s1.equalsIgnoreCase(s2)); // s1とs2を比較
  System.out.println(s1.equalsIgnoreCase(s3)); // s1とs3を比較
  System.out.println(s1.equalsIgnoreCase(s4)); // s1とs4を比較
 }
}
```
```結果.
true
true
false
```

#### length
文字列長を調べる
（スペースも1文字としてカウントされる）
```Main.java
public class Main {
 public static void main(String[] args) {
  String s1 = "Hello";
  String s2 = "Hello World ";
  String s3 = "     ";
  System.out.println(s1.length()); 
  System.out.println(s2.length()); 
  System.out.println(s3.length()); 
 }
}
```
```結果.
5
12
5
```

#### isEmpty
空文字か（長さが0か）調べる
(空白は1文字としてカウント）
```Main.java
public class Main {
 public static void main(String[] args) {
  String s1 = "Hello";
  String s2 = "";
  String s3 = "     ";
  System.out.println(s1.isEmpty()); 
  System.out.println(s2.isEmpty()); 
  System.out.println(s3.isEmpty()); 
 }
}
```
```結果.
false
true
false
```
【Zabbix7.x】Microsoft teamsにZabbixのアラートを飛ばす

## 前提条件

チャネル＋webhook構築済みであること

https://qiita.com/youtoy/items/0bfce1a022c716573f32

zabbix server構築済みであること

zabbixフロントエンドによる操作であること

## バージョン

zabbix 7.0.0

## 通知を作成

通知＞メディアタイプ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580241/8c6bf148-1618-8dd2-303b-1f871167a3f5.png)

`teams`で検索すると、便利なひな形を用意してくれているのでそれを使う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580241/1b243d53-6b08-bfc7-29c5-f564dd59929b.png)

名前（MS Teams）をクリックすると、ダイアログが表示される

真ん中～少し下くらいに`teams_endpoint`項目があるので、webhook URLを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580241/4a22208a-88f7-5780-5156-bbd2cd4ce2a8.png)

一番下にある有効にチェックを入れて更新

有効になったー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580241/35eb1c95-704a-6741-36dc-20f44bc7f28e.png)

## 通知をテスト

右端のテストリンクをクリック→ダイアログが開く

`event_source`に`1`を入力してテストボタンをクリック

※全てデフォルトのままだとevent_sourceのバリデーションにひっかかります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580241/060d07b7-d1ca-3533-7f65-59cd5d4bf00a.png)

届いたー

※incoming webhook側でアイコンと画像をzabbixに設定してます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580241/c2f8d1ef-d396-ae09-5ee2-0ace81e55074.png)
抽象メソッド

## 抽象メソッド
現時点では処理内容が未定で実装をもたず、メソッドや引数などの定義だけ宣言するメソッド。
処理内容は子クラスなどで記述。クラスによって処理内容を変えられる。


### 抽象メソッドの宣言
```
public abstrct 戻り値の型 メソッド名(引数リスト);
```
#### 宣言するメリット
・オーバーライドの強制
・何もしないメソッドなのか、現時点で処理内容が確定できないメソッドなのか区別ができる

### 抽象メソッドを含むクラスの宣言
抽象メソッドを１つでも含むクラスは抽象クラスの宣言を行う
```
public abstract class クラス名  {
}
```
#### 宣言するメリット
・抽象として宣言されるとnewによるインスタンス化が禁止される。

抽象クラスを継承した子クラスで必ず、メソッドの内容を記述する必要はなく、孫クラスやひ孫クラスなどどこかの時点で記述できる

インタフェースなどもでてき意味は分かるけど、ぴんと来ないというか使いこなせない:sweat:
為になりそうな記事がいくつかあったので読んで理解したいと思います:relaxed:
docker build --ssh defaultでエラー

Githubにあるプライベートリポジトリを含むDockerイメージを構築する際、エラーになってしまいました。

```
2.582   Warning: Permanently added the ECDSA host key for IP address '20.27.177.113' to the list of known hosts.
3.103   git@github.com: Permission denied (publickey).
3.103   fatal: Could not read from remote repository.
```

（`20.27.177.113`はgithubのIPアドレスです。）

私の場合、以前PCの初期化を行なっていたため、再度ssh-addしてあげることで事象は解決しました。

```sh
ssh-add ~/.ssh/[githubの認証に使用しているSSHプライベートキー]
```

PC初期化の後処理は大変ですね。。
AWS Data Engineer Associateの学習方法

# はじめに
2024年４月から始まったAWS認定DataEngineerAssociateの学習方法を書いていきます。

# 試験ガイドを読む
https://d1.awsstatic.com/ja_JP/training-and-certification/docs-data-engineer-associate/AWS-Certified-Data-Engineer-Associate_Exam-Guide.pdf

>AWS Certified Data Engineer - Associate (DEA-C01) 試験では、受験者がデータ
パイプラインを実装し、ベストプラクティスに従ってコストとパフォーマンスの
問題をモニタリング、トラブルシューティング、最適化する能力を検証します。
また、次のタスクについての能力も検証します。
• プログラミングの概念を適用しながら、データを取り込んで変換し、データ
パイプラインをオーケストレーションする。
• 最適なデータストアの選択、データモデルの設計、データスキーマの
カタログ化、データライフサイクルの管理を行う。
• データパイプラインの運用、保守、モニタリングを行う。データを分析し、
データ品質を確保する。
• 適切な認証、認可、データ暗号化、プライバシー、ガバナンスを実装する。
ログ記録を有効にする。

ざっくりまとめると、データパイプラインの実装と、データストア、データスキーマの管理、ガバナンスを実現できるかを問われる資格です。旧DataAnalyticsSpecialityと似ているものを感じます。

問題の配分は以下のとおりです。

>• 第 1 分野: データの取り込みと変換 (採点対象コンテンツの 34%)
• 第 2 分野: データストア管理 (採点対象コンテンツの 26%)
• 第 3 分野: データ運用とサポート (採点対象コンテンツの 22%)
• 第 4 分野: データセキュリティとガバナンス (採点対象コンテンツの 18%)

Kinesis、MSK、DMS、Glue、Redshift、DynamoDB、EMR、DMS、AppFlow、Lambdaなどを利用した、データの変換や、S3、LakeFormationなどを利用した、データストア管理、ガバナンスのかけ方、SageMaker Datawrangler、QuickSight、Athenaなどを利用した、データ運用などがポイントになります。
ガイドに出てくるサービスの概要は必ず抑えておくことがポイントです。

# トレーニングを受ける
以下４つのトレーニングと試験対策トレーニング２つが公開されています。わたしは、ある程度概要を知っていたので省略しました。

https://explore.skillbuilder.aws/learn/course/external/view/elearning/18778/fundamentals-of-analytics-on-aws-part-1-japanese-sub

https://explore.skillbuilder.aws/learn/course/external/view/elearning/18779/fundamentals-of-analytics-on-aws-part-2-japanese-sub

https://explore.skillbuilder.aws/learn/course/external/view/elearning/15545/planning-large-scale-data-migrations-to-aws

https://explore.skillbuilder.aws/learn/course/external/view/elearning/17207/digital-classroom-cloud-operations-on-aws

https://explore.skillbuilder.aws/learn/course/external/view/elearning/18603/exam-prep-enhanced-course-aws-certified-data-engineer-associate-dea-c01-english

https://explore.skillbuilder.aws/learn/course/external/view/elearning/18546/exam-prep-standard-course-aws-certified-data-engineer-associate-dea-c01

# 練習問題を解く
公式で練習問題が公開されているので、解いてみるのが良いでしょう。
レベル感が把握できます。ちなみにこれとは別に、公式の事前テストがあるようですが、有料なので私は利用しませんでした。

https://explore.skillbuilder.aws/learn/course/external/view/elearning/18145/exam-prep-official-practice-question-set-aws-certified-data-engineer-associate-dea-c01-japanese

また、Udemyの練習問題のセットを一通り実施しました。
練習問題のなかで、様々なキーワードがでてきて、知らないサービスや、仕様がある場合、ピックアップして覚えるということをしました。
https://www.udemy.com/course/practice-exams-aws-certified-data-engineer-associate/learn/quiz/6141676#overview

# まとめ
これで無事AWS認定全冠に復帰しました。
AWS認定全資格を維持されているかたは少なくないとおもいます。新しい資格が出るととらなきゃ！！！、期限が切れそうになると更新しなきゃというある種の中毒性があるものです。とはいえ、資格受験の過程で、普段触らないサービスや仕様を知ることができるので、おすすめではあります。３年おきに受験することで、知識のアップデートもできるます。
今回追加されたDEAはDataAnalytics認定をお持ちの方であれば割ととっつきやすいので、受けてみるとよいかと思います。特にレベル差は感じなかったので、取得しやすい印象でした。
プログラミングとゲームの学習曲線

# 言いたい事
最新アップデート情報や低レイヤーなメタ知識も
一定以上ゲームプレイしていないと理解できないよね

「初心者に、強要しちゃいけないよ！」 という話。

それは、ゲームもプログラミング言語も同じですね。

# 【人の学習曲線】
> XXの武器はLv30以上が必要なので装備できません

この表記の本質は現実世界でも多くあると感じる。

装備しても実力を発揮できない、何かを得たとしても、有効に活用することができない
それは自分のレベルがまだ低いからだ。

これはプログラミングもゲームにも言えることだと日々感じる。

### ゲームのパッチノートの例
https://www.ea.com/ja-jp/games/apex-legends/news/upheaval-patch-notes

### Railsのパッチノートの例

https://railsguides.jp/upgrading_ruby_on_rails.html#rails-7-0%E3%81%8B%E3%82%89rails-7-1%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89

## 【情報の暗記と理解の違い】
ゲームの最新アップデート
> 「XXというキャラクターの銃を構えている時の速度が 120から140になりました」

この情報を得ても、理解出来るのは、そのキャラクターを普段から使っていたりそのキャラクターと対戦したり、その速度が具体的にどう活かすかという場面を知っている人だけだ。

なので初心者に対して

> バージョン15 のパッチノート読んだ？読んだ方がいいよ！

というのは結構無意味だったりして

それ以前に、まずゲームをプレイして
ゲームを知り、情報を理解できる様になる事の方が優先度が高い。


### 【もし、アドバイスをしたいなら】
それでも、もしアドバイスをしたいなら
その人が苦い経験をしたり、失敗した、どうしたら良かったんだろうと悩む 

<b>「学びたいと感じているタイミングで」</b>

「XXという特性があって、その特徴を知っていれば、こう対策できるかもしれないねー」
くらいに伝えるのが良いのだろうか。

## 【効率的な技術の上達方法は、人によって違う。】
> 出来る人から見た効率的は効率的なのだろうか？

いつも一緒にゲームしている上級者の人に
ゲームの最新アップデート情報 読んだ？理解した？じゃあ、OK、効率的に成長したね！

と言われても技術はもちろん上達していないし
暗記しただけで情報を理解できていない。
全てを知っている人から見た「効率的」を強要してしまっている。

## 【情報を理解し、それが自分の技術になるまでの道のり】
パッチノートで得た情報を実戦で活用するのにも
1. まず 射撃演習場 で検証。
1. 本番環境の実践で使える場面を想像して
1. あえてそれを使う様に動いていくことで自分の技術となる。


確かに暗記することは勉強としては有効で
聞かれたら答えられるという程度にはなるかもしれないが
それは、理解しているか、自分の技術になっているかという視点では
別なのだろうと感じる。

あらゆる仕事にも言えることで、人間の技術の習得フローは何が最適かを考えさせられる。

ゲームから学ぶことは多い。

## スキル習得の理論
認知段階（基本的な理解）
連合段階（実践を通じた強化）
自動化段階（意識せずに実行可能）

## コルブの経験学習モデル
学習は経験を通じて、4つのステージを経て学習が進む。
具体的な経験
内省的観察
抽象的概念化
能動的実験
Nuxt3でsocket.ioを使うのなんとなくのまとめ

## はじめに
vite + express + socket.ioの構成で製作していました。
nuxt3 + socekt.ioの構成したいと思い立つ。
2024/05/21現在のなんとなくのまとめ。

https://qiita.com/at-946/items/590e618b041182b151ed

検索するとnuxt3 + express + socket.ioの構成。
確かにいいんだけど、簡単でシンプルにnuxt3 + socekt.ioだけで構成がしたい。

開発環境
windows10
node 18.xx
yarn 1.xx

## nuxt-socekt-ioを使う

https://nuxt-socket-io.netlify.app/

nuxt-socekt-ioなる便利ライブラリーが公開されていました。
構築するとするりと動き、dev上ではいい感じでしたが、
しかし、buildすると何故かsocket.ioの部分だけ動かない。
構成が間違っているのかもしれない。
深追いはやめそう。
vite + express + socket.ioも悪くないと自分に言い聞かせながら。

## nitro + socket.io

そして時は過ぎ、ふと公式サイトをみると、

https://socket.io/how-to/use-with-nuxt

あら、こんなページあったけな。
構築すると、たしかに動きました。
いい感じです。


## vuetifyがうまくdevできない。

いつも使っているvuetify3をインストール。
しかしdevしてから、ブラウザを立ち上げると以下のようなエラーが発生。
```
500
Cannot find module './node.js' Require stack: - F:\Users\xx\project\nuxt-app\debug
```

理由はわからない。
深追いはやめよう。

``` package.json
{
  "dependencies": {
    "@mdi/font": "^7.4.47",
    "engine.io": "^6.5.4",
    "nuxt": "^3.11.2",
    "socket.io": "^4.7.5",
    "socket.io-client": "^4.7.5",
    "vue": "^3.4.27",
    "vue-router": "^4.3.2"
  },
  "devDependencies": {
    "vite-plugin-vuetify": "^2.0.3",
    "vuetify": "^3.6.6"
  }
}
```


## quasarとの出会い。

なんとなくvuetifyとの相性が悪い気がしています。
使ったことはないのですが、quasarを使ってみました。
さらりとdev上も、buildしても動いているようです。

``` package.json
{
  "dependencies": {
    "@quasar/extras": "^1.16.11",
    "engine.io": "^6.5.4",
    "nuxt": "^3.11.2",
    "nuxt-quasar-ui": "^2.1.2",
    "quasar": "^2.16.4",
    "socket.io": "^4.7.5",
    "socket.io-client": "^4.7.5",
    "vue": "^3.4.27",
    "vue-i18n": "^9.13.1",
    "vue-router": "^4.3.2"
  }
}
```


## 結論

とりあえず、動きました。
いけそうです。
ただ、それぞれのライブラリーもアップデートでよくなる可能性もあるので、よくよく見るように。
DBスペシャリストにギリギリ一発合格した話

ITエンジニアの高井です。
だいぶ時が経ってしまいましたが、2022年秋にDBスペシャリストに合格しました。
その時の勉強法や参考書について書きたいと思います。

# 経歴など
IT職6年目。
新卒で今の会社に入社し、1年目～5年目春くらいまでは実務でSQL経験あり。
ただ、それから1年半ほどSQLに触れていなかったのと、DB設計は経験が無かったため、不安はありました。
また、応用情報技術者試験も合格してはいましたが、午前Ⅰ免除期間（2年）をオーバーしていたため午前Ⅰの勉強もやることになりました。
後述しますが、応用情報で一度勉強したことをもう一度勉強することになるので超ロスです。

# 参考書・参考サイト
### 情報処理教科書 データベーススペシャリスト 2020年版
https://www.shoeisha.co.jp/book/detail/9784798163024

前半はこの試験で使う知識全般の解説、後半は過去問が収録されています。
**前半**の解説はかなり初歩的なところから解説してくれています。また、実際の試験問題でどのように問われるのか、過去問を引用しながら解説してくれています。
**後半**の過去問は直近1回分の午後Ⅰ、午後Ⅱ試験がまるごと載っています。回答・解説もついています。
なぜか2020年版を使いましたが問題ありませんでした。

実はもう一冊買ったのですが、この参考書で十分だったのでほとんど使いませんでした。

### データベーススペシャリスト ドットコム
https://www.db-siken.com/dbkakomon.php

**なんといってもこれ！** 超必須サイトですね～。
過去問道場で午前Ⅱの過去問を解き放題です。
掲示板では過去問の質問スレッドもあり、午後問題の解説が欲しいときに助かりました。

### 過去問アプリ
検索するといくつか出てきます。
上述の過去問道場かアプリ、お好みで。

# 勉強期間
1か月半くらい前からスタートしました。
最初に参考書の前半の解説パートを一通り読み、残りの期間は過去問を解きまくりました。

# 勉強方法
### 午前Ⅰ・午前Ⅱ
**午前Ⅰ**は応用情報技術者試験の午前問題（四択問題）から30問抜粋して出題されます。
**[応用情報技術者試験ドットコム](https://www.ap-siken.com/apkakomon.php)の過去問道場でひたすら解きまくります。**

**午前Ⅱ**はDB分野を中心に、25問の四択問題が出題されます。
**こちらも過去問道場でひたすら解きまくります。** 通勤時間は2つの過去問道場を行き来します。
分からない問題は参考書や掲示板で解決しましょう。

最終的に午前Ⅰ、午前Ⅱどちらも直近5回分くらいを解いたと思いますが、自分的にはかなり不足していました。
理想としては、直近5回分を2周するか、直近10回分くらいを解きたかったところです。

### 午後Ⅰ・午後Ⅱ
IPAホームページから午後問題のPDFがダウンロードできます。
紙に印刷するか、iPadなどで解きますが、**おすすめは紙です。**
理由はいくらでもありますが、特に午後Ⅱは大問1つで10ページ以上あったりします。そして時間が無いです。本番も時間が無くて焦りました。
**紙に指を挟んでペラペラする方が圧倒的に見やすいし早いです。**

午前問題と違って過去問と完全に同じ問題が出ることはないですし、たくさん解くのはなかなか難しいので、一回ずつの過去問を丁寧に解いて理解した方がいいと思います。

午後問題はどちらも直近3回分くらいを解きました。
午後Ⅰは3問中2問選択、午後は2問中1問選択です。
時間を計りながら解いていたので実際と同じように選択しながら解きました。
勉強時間に余裕があるなら、選択しなかった方も練習として解いておいた方が安心なんだろうな～という感じです。

# 当日のこと
持ち物で気を付けるべきは**証明写真**と**腕時計**です。**お昼ご飯**と**おやつ**も買っておいた方がいいです。

会場についたら、まず会場にいる人数が少なすぎてびっくりします。Twitterで検索すると0次試験（起床）に失敗している人たちの嘆きが見られます。**ちゃんと起きて会場に来ましょうね！**

各試験、名前と受験番号の記入や選択問題のマルつけは忘れずに。

そして試験は進んでいき…
**午後Ⅰで体力・集中力がなくなります。** 
これは予言です。絶対です。午後ⅡはHP赤ゲージで挑むことになります。
私は肩こり・背中の痛みで限界でした。試験問題が配られたときに「この状態であと120分やるの？」と絶望しました。
午前Ⅰが免除だったらもうちょっと楽だったのかもしれませんが、午前Ⅰ免除でも辛かったという記事を見ました。結局しんどいのです。
ですので体力がある若いうちに受けてしまった方がいいと思っています（しらんけど）
せめてもの抵抗として、**休憩時間にしっかりストレッチして甘いものを接種しましょう。**

あとは時間が足りなくても、諦めず何かしら解答欄に書きましょう。私は（あまりのしんどさに）二度と受けたくないという執念で頑張りました。

# そして結果発表
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/7b348ab6-f4e8-6198-03ec-f3692c02eed4.png)

ごらんのとおり、超ギリギリで合格しました。
受かればヨシなのだ。

# まとめ
・午前問題は過去問を解きまくる
・午後問題は過去問ひとつひとつを丁寧に
・午前Ⅰ免除期間中に高度試験も受けた方がいい
・午後Ⅱは死にかける覚悟で

書いてみたら長くなってしまいました。
DBスペシャリストの合格記はごまんと転がっていますが、何かの助けになれば幸いです。
高井でした！
Google Apps Script (GAS) の使い方 【Webアプリ編】

# Google Apps Script (以下gas) とは
詳しくは[こちら](https://qiita.com/tacopic-007/items/05fff88270f9eb59e826)の記事に記載していますが、簡単に説明するとGoogleサービスの自動化スクリプトをAPIなどを使用せずに開発できる、めちゃんこ便利な言語です。
一応、gasって何？って方は[基礎](https://qiita.com/minoru_kinugasa/items/e8421f4fe501ef322535)や[基礎メソッド](https://qiita.com/minoru_kinugasa/items/8428ae5af9f9af0b2810)の記事もありますので是非！

# ファイルの作り方
では早速、webアプリを作成していきます。
gasのページを開き、ファイルの「**＋**」の「**HTML**」を押し、新規HTMLファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/412ef951-5098-f119-4ffa-7239dfd9b8db.png)

# ためしにデプロイしてみる
作成されたHTMLを、一度デプロイ (公開) してみましょう！
HTMLファイルのコードをこのように変更してください。
(すでに自動的に書かれているコードは消して、貼り付けちゃってください！)
```html:無題.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <h1>test deploy</h1>
  </body>
</html>
```

操作パネルの「**保存**」をクリックして、今のコードを保存します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/d4cf0680-d90e-3735-ad96-360cdf730cc5.png)
<hr>

次に、`コード.gs`を開き、このコードを追加します。
```js:コード.gs
function doGet(e) {
  const template = HtmlService.createTemplateFromFile('無題');
  return template.evaluate();
}
```

そうしたら、画面右上にある青い「**デブロイ**」ボタンをクリックし、「**新しいデブロイ**」を選択します。
すると、`デブロイタイプを選択してください`と表示されるので、「**歯車マーク**」から「**ウェブアプリ**」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/77dc5765-a9dd-cd65-5237-e8fcf85545c1.png)

そうしたら自分の好きなようにページの設定をします。

- `説明`欄にはそのアプリの説明でも入れておきましょう。
- `ウェブアプリ`欄は自分のアカウントのメールアドレスを選択しておきます。
- `アクセスできるユーザー`は自分のみが見れるようにするなら**自分のみ**、リンクを知っているユーザー全てが見れるようにするなら**全員**を選択します。

設定が終わったら、「**デプロイ**」をクリックします。
少しまって、デプロイが完了したらそのwebアプリのリンクを取得できます。
リンクにアクセスして、`test deploy`と表示されていたら大成功です！

# 更新の方法
webアプリを試しにデプロイしてみましたが、更新するにはどうしたらいいでしょうか？
先ほどのデプロイと同様に、　「**デプロイ**」をクリックし、今度は「**デプロイを管理**」を選択します。
するとこの画面が出てくるので、「**編集**」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/aa582556-6adf-75f2-7c36-4cae217b9ebf.png)

バージョンの中の、「**新しいバージョン**」を選択し、「**デプロイ**」をクリックすると、先ほどと同じようにデプロイすることができます！

# Webアプリにgasコードを埋め込む
htmlに、gasのコードを埋め込んで、処理をおこなうことができます。
```xml:無題.html
<!DOCTYPE html>
<html>
<head>
  <base target="_top">
</head>
<body>
  <h1>Google Apps Script HTML サービスの例</h1>
  
  <p>サーバーサイドの値：<strong><?= message ?></strong></p>

  <button onclick="google.script.run.withSuccessHandler(displayResult).getServerMessage()">実行</button>
  <div id="output"></div>
  
  <script>
    function displayResult(result) {
      document.getElementById('output').innerText = result;
    }
  </script>
</body>
</html>
```
```js:コード.gs
function doGet() {
  var template = HtmlService.createTemplateFromFile('無題');
  template.message = "Hello from server!";
  return template.evaluate();
}

function getServerMessage() {
  return "This message is from the server!";
}

```
- `<? ?>`の中にコードを書くと、`for`のように、htmlに反映しない処理のコードを記述することができます。
- `<?= ?>`の中にコードを書くと、記述したコードを実行した結果をhtmlに反映します。
- `google.script.run.withSuccessHandler(displayResult).関数()`をscript内で記述すると、gasのコードをhtml内で呼び出すことができます。

また、これはjavascriptの話になりますが
関数を実行した際に、返り値として値をしていするときは`return`を使用します。

# 終わりに
今回、GASを学習しながらQiitaの書き方を学びました(-_-;)
なので、みにくいところがあるかもしれませんがご了承ください💦

今後もいろんな記事を投稿するので、よろしくです！
Google Apps Script (GAS) の使い方【基礎編】

## Google Apps Scriptとは
Google Apps Script（以下gas）は、提供されているGoogleサービスの自動化スクリプトなどを組み、ある程度の自動化を図ることができる優れものです。
また、APIなどを使用して複雑なコードを書く必要がないため初心者でも書きやすいという特徴があります。

操作できるものとして、`Gmail`、`Google Drive`、`Google Document`、`Google Spreadsheets`などいろいろなものがありますが、今回は`Google Spreadsheets`を使用して解説します。

# 下準備
操作するスプレッドシートを準備します。
[https://docs.google.com/spreadsheets/u/0/?hl=ja](https://docs.google.com/spreadsheets/u/0/?hl=ja)
にアクセスし、「空白のスプレッドシート」をクリックし、新規作成します。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714044/08c9760c-b0e9-7c26-aa23-f0220fb56837.png)

次に、メニューの欄にある「**拡張機能**」の中にある「**Apps Script**」をクリックします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714044/8aee4e11-125a-be02-fd0b-b5c82ac799a8.png)
しばらくしたら真っ白の画面から推移し、gasのページが出てきます。
ここまでできたら下準備完了です！

# 試しに動かしてみる
現在、gasのページには`function myFunction()`なるものがありますが、これにコードを追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714044/9b2d3f90-654f-6805-05b5-b9c1e54eddca.png)
とりあえず、以下のコードを丸々コピペしてみてください。
（すでに書いてあるものは消して大丈夫です！）
```js:コード.gs
function myFunction() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getActiveSheet();

  sheet.getRange("A1").setValue("Hello, world!");
}
```
コピペしたら、早速実行してみましょう！
実行するには、![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714044/52544405-54c8-9a2f-7d33-c3665140c848.png)
オレンジ色の「**保存ボタン**」をクリックし、器緑色の「**実行ボタン**」をクリックすると、実行できます。
（2回目以降は「**実行ボタン**」をクリックすれば、自動で保存されてから実行できます。）
<br>
すると承認が必要です と言われてしまい、できませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714044/f73b6f7a-e2d7-9f0f-c251-0d957706250e.png)

これは、スプレッドシートにgasがアクセスしていない、ということなので、アクセスさせてあげます。
「**権限を確認**」をクリックして、アカウント選択画面になるので、自分の使用しているアカウントを選択します。
セキュリティのしっかりしているブラウザだと、以下のような警告がでてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714044/f1086e3d-aa24-0ebc-799b-43bf77df6fb3.png)
このページが出てきたら、「**詳細を表示**」をクリックして「**無題のプロジェクト（安全ではないページ）に移動**」をクリックします。
そしたら、アクセスを許可しますか 的なページが表示されるので、許可します。
<br>
するとgasのログには、`実行開始`と`実行完了`というものが表示されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714044/cf9c598f-545b-a478-a564-98dc39275eb8.png)
このログが表示されていたら成功です！
スプレッドシートに戻ってみると、A1セルに`"Hello, world"`と表示されていました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714044/9d67b908-cd57-8f27-476b-748c189ab3ce.png)

## 余談
とりあえず動いたら、基礎編は終了です！お疲れさまでした！

余談なんですが、gasのベースはjavascriptなので、javascriptを経験している人はメソッド覚えるだけで使いこなせる言語だと思います！

また、APIなどを使用せずに拡張性の高いことができるので、初心者の方でも普通の言語に比べれば習得は早いんじゃないかなぁーと個人的に感じました！

よく使用するメソッドや、簡単なwebアプリなども作れるので、よかったらこちらの記事もごらんください！！
- [Google Apps Script (GAS) の使い方【基礎メソッド編】](https://qiita.com/minoru_kinugasa/items/8428ae5af9f9af0b2810)
- [Google Apps Script (GAS) の使い方 【Webアプリ編】](https://qiita.com/minoru_kinugasa/items/a6930f66bb1d048305ce)
ジオメトリノードでランダムなテクスチャアニメーション

先日 Blenderのパーティクルでテクスチャーのアニメーションの記事を書きました

https://qiita.com/yukimituki11/items/546e0a8b72e5d4d82bd1

雨粒の波紋を作ったりするのに使える方法ですが、Cyclesレンダーでないと使えない等デメリットがありました

同様に　テクスチャ平面の散布からGeometryNodesをで作成すれば
Eeveeでも利用できる他　応用も効くので試してみました
![24052007.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/8d9c64d8-8fb9-13f8-5cca-f48d451a7614.gif)

## ジオメトリノードの入力
今回のジオメトリノードでは　適当なメッシュ上に　
UVシフトのでのテクスチャアニメーションする面を散布します
UVシフトの考え方については前回記事を参照してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/60e8c650-21ef-140a-47aa-59f67c72d658.png)
グループの入力でモディファイアの項目から設定を入力できるようにしています
散布密度は　面を発生させる密度
終了フレームは散布が終わるフレーム
コマ数はＵＶシフトのアニメーションが何枚の画像でできているかを指定するもので
Materialでアニメーションさせるテクスチャのマテリアルを指定します。

## ランダム配置と選択
まずテクスチャを貼り付ける面を配置させるためのポイントを生成します。
このポイントに「名前付き属性格納」で BornTimeという名前を付けてポイントが発生した時間を仮定したデータをランダムに設定しています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/7450960c-ca10-7f3f-1675-e19e85d28c9b.png)
「ポイントにインスタンス」で　ポイントに平面を発生させるのですが
**選択**の入力を使うことで　条件に合致したポイントのみに発生させるということができます
今回は　「シーンタイム」から現在の時間をフレーム数で取得して　先にランダム生成しておいたBornTimeの値と比較することで　一定範囲の値のポイントにのみ平面を発生させています。
インスタンス入力に接続しているメッシュプリミティブの「グリッド」は　最初からUVが設定された状態で生成されます。
## UVシフトアニメーションとマテリアル設定
先ほどポイントにインスタンスで発生させた面は「インスタンス実体化」のノードを挟むことでメッシュとして利用できます
メッシュプリミティブのグリッドのUVはuv_mapで取得できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/8612218b-f73d-839f-d85a-82f9d8fd4069.png)
また　生成元のポイントに設定してあった BornTimeの情報も発生後のメッシュの頂点に引き継がれているので
現在のフレームとの差からUVのシフト量を計算できます
X軸方向のみUVの縮小とシフト操作をして　名前付き属性格納で上書きしています
「マテリアル設定」ノードでモディファイアパネルで設定したマテリアルが発生した面に適用されます

:::note
因みに「グループ入力」のノードは複数配置することができて　同じデータを参照するので
入力値を扱う場合にリンクの線を長々と伸ばす必要がなくてすっきりさせることができます
:::
## マテリアルの設定
ジオメトリノードの中で指定したマテリアルの設定です
今回はテクスチャをただ表示するだけのノードです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/4e5df4fa-e1ae-f75c-244b-5de32e2a8a1d.png)
注意が必要なのですが　ジオメトリノード内で設定された値をUV等で利用する場合には
ジオメトリノード内で利用した属性名か
（今回は利用しなかったのですが）出力属性で指定した名前で
「属性」のノードから取得する必要があります

ざっくり説明ですが　何かの手助けになれば幸いです。
ユーザアカウントのFreezing と deactivate

正直ななところよく分からん

+ [Cannot freeze a user in Salesforce Trailhead ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007akf1Y)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9cba3fe2-5dac-9ed1-06fb-9e6e74001baf.png)

「フリーズ」はユーザーがログインできなくなるだけです。 「非アクティブ化」すると、その Salesforce ライセンスが解放され、別のユーザーに付与できるようになります。次の関連投稿も参照してください。

"Freezing" only stops the user from being able to login. When you "deactivate," it frees up that salesforce license to be given to another user.Also see this relevant post: 

https://www.biswajeetsamal.com/blog/difference-between-deactivate-user-freeze-user-in-salesforce/

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T46RkSAJ



Refer below link. You need  "Manage users" Permission on the Profile Level

https://help.salesforce.com/articleView?id=users_freeze.htm&type=5

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8Fw9SAF

Strangely, there is no checkbox to active.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6c602dda-538a-bdfe-6e65-8b95bdda73e5.png)
PythonからPDALを呼び出してDEM作成

# はじめに
[PDAL](https://pdal.io)と呼ばれる航空機LiDARで取得した点群向けのソフトウェアがあります。このPDALはコマンドライン上で引数を渡して点群処理を行うのが一般的な使用方法ですが、Pythonから呼び出せます。
今回は、PythonからPDALを呼び出して点群からデジタル標高モデル(DEM)を作成する方法を共有します。

# コマンドライン上での処理方法
PDALはjsonに処理対象のファイルや、点群処理の内容を記述するのが一般的なやり方です。
今回は、点群から地面の点群だけを抽出してDEMを作成します。
この場合のJSONは以下のように作成します。
```json:pipeline.json
{
    "pipeline": [
        "./08ME3552.las",
        {
            "type":"filters.expression",
            "expression":"Classification == 2"
        },
        {
            "filename":"./08ME3552.tif",
            "gdaldriver":"GTiff",
            "output_type":"mean",
            "resolution":"1.0",
            "type": "writers.gdal"
        }
    ]
}
```
このJSONの意味は、Classificationが2(地面)の点のみを抽出し、その後、画像としてエクスポートする処理を記述しています。エクスポートする際の"resolution":"1.0"を変更すると任意の解像度を指定できます。
このJSONを使用して、コマンドライン上で``pdal pipeline ./gdal.json``と実行すると上記の処理が走ります。
点群が一つの場合はよいのですが、複数の点群を対象にする場合にJSONをいちいち編集するのは面倒です。
そこで、Pythonを使ってもう少し楽をしたいと思います。

# PythonからPDALを呼び出して実行する方法
Pythonでは、PDALに渡すJSONを文字列として記述します。
以下のように処理対象の点群や解像度を定義してpythonを実行するとコマンドライン上で行った結果と同じことが実現できます。

```python:main.py 
import pdal

json = """{
    "pipeline": [
        "./08ME3552.las",
        {
            "type":"filters.expression",
            "expression":"Classification == 2"
        },
        {
            "filename":"./08ME3552.tif",
            "gdaldriver":"GTiff",
            "output_type":"min",
            "resolution":"1.0",
            "type": "writers.gdal"
        }
    ]
}"""

pipeline = pdal.Pipeline(json)
count = pipeline.execute()
arrays = pipeline.arrays
metadata = pipeline.metadata
log = pipeline.log
```

ディレクトリに格納されている点群を全なめしてDEMを作りたい場合などは、JSONを文字列として記述した点に着目してどうにかします。
辞書型になっていないので、雑な実装ですが、ファイル名を文字列置換したり `print(json.replace("08ME3552", "08ME3553"))` 解像度を文字列置換 `print(json.replace("""1.0""", """0.5"""))` したりで対応できます。
量子化とLoRAアダプターで高性能微調整：QLoRAの解説

※ このページは「QLORA: Efficient Finetuning of Quantized LLMs」の要約になります。

## このページでわかること
- QLORAは、4ビット量子化とLoRAアダプターを用いて、65Bパラメータモデルを48GBのGPUで効率的に Fine-Tuning ができる
- 主要な技術革新には、4ビットNormalFloat、ダブル量子化、およびページドオプティマイザ
- Guanacoモデルは、24時間かからずChatGPTに匹敵する性能を達成した

## 対象読者
- 特に大規模言語モデル（LLM）の効率的な微調整と量子化に関心がある研究者やエンジニア

## 従来 Fine-Tuning の問題点

1. **大規模言語モデルの微調整のコストとメモリ要求の高さ**：
   - 65Bパラメータモデルの通常の16ビット微調整には、780GB以上のGPUメモリが必要であり、非常に高価で実行が困難

2. **量子化モデルの微調整中の性能劣化**：
   - 既存の量子化手法は推論時のメモリを削減するが、トレーニング時には性能が低下することが多い

3. **高性能な微調整手法の欠如**：
   - 微調整時にフルモデルの性能を維持しながら、メモリ使用量を大幅に削減できる手法が不足している


## QLoRA
### QLoRAとは？
QLoRA（Quantized Low-rank Adapter）は、LLMの効率的な微調整手法で、4ビットに量子化された事前学習済みモデルを利用し、メモリ使用量を大幅に削減しながら性能を維持する方法です。QLoRAは、Low-rank Adapters（LoRA）と呼ばれる小さな学習可能な重みセットを使用し、量子化されたモデルの中で勾配を逆伝播させます。

### QLoRAのメリット
1. **メモリ効率の向上**：QLoRAは4ビット量子化により、メモリ使用量を劇的に削減し、65Bパラメータモデルを48GBのGPUで微調整可能
2. **性能維持**：メモリ使用量を削減しながらも、16ビット微調整と同等の性能を維持
3. **コスト削減**：単一のGPUで大規模モデルを微調整できるため、計算コストとハードウェアコストを大幅に削減できる
4. **アクセスの向上**：より多くの研究者や開発者が大規模モデルの微調整にアクセスできる

### QLoRAの手順
1. **量子化**：事前学習済みのモデルを4ビットに量子化します。これには、情報理論的に最適な4ビットNormalFloat（NF4）データ型とダブル量子化技術が使用される
2. **LoRAアダプターの追加**：量子化されたモデルにLow-rank Adapters（LoRA）を追加します。これらのアダプターは、小さな学習可能なパラメータセットであり、モデルの全体の重みは固定される
3. **勾配の逆伝播**：量子化された重みを通じて勾配を逆伝播させ、LoRAアダプターを更新します。このプロセスにより、メモリ効率を維持しながらモデルを微調整する
4. **ページドオプティマイザの使用**：メモリスパイクを管理し、メモリ不足を防ぐためにNVIDIAの統一メモリ機能を使用する

### 4ビットNormalFloat
4ビットNormalFloat（NF4）は、正規分布重み用に情報理論的に最適化された量子化データ型です。これは、通常の4ビット整数や浮動小数点数と比べて、正規分布に対してより精度の高い量子化を提供します。具体的には、次のような手順で実現されます：
1. **標準正規分布の量子化**：標準正規分布の量子を理論的に最適化し、各量子化ビンに等しい数の値が割り当てられるようにする
2. **データの正規化**：入力テンソルを標準正規分布にフィットするようにスケーリングし、範囲を[-1, 1]に正規化する
3. **量子化**：正規化された値を量子化して、4ビットのNormalFloatデータ型にマッピングする

### ダブル量子化
ダブル量子化は、量子化定数自体をさらに量子化することで、メモリ使用量を削減する技術です。通常の量子化では、量子化定数が大きなメモリフットプリントを持つことがありますが、ダブル量子化によりこれを減らします。手順は次の通りです：
1. **第1段階の量子化**：通常の方法で入力テンソルを量子化し、量子化定数（例えば32ビット浮動小数点数）を得る
2. **第2段階の量子化**：第1段階の量子化定数を8ビット浮動小数点数に再量子化します。この再量子化により、メモリフットプリントを大幅に削減できる
3. **メモリ削減**：この方法により、65Bパラメータモデルの場合、32ビット定数が0.5ビット/パラメータから8ビット定数が0.127ビット/パラメータへと削減される

### ページドオプティマイザ
ページドオプティマイザは、NVIDIAの統一メモリ機能を使用して、メモリ不足を防ぐための技術です。これにより、GPUがメモリ不足になると、自動的にメモリページがCPU RAMにスワップされ、必要に応じて再度GPUメモリにロードされます。手順は次の通りです：
1. **統一メモリの利用**：GPUとCPU間で自動的にページングを行い、メモリ管理を簡素化する
2. **メモリスパイクの管理**：勾配チェックポイント処理中に発生するメモリスパイクを防ぎ、大規模モデルの微調整を単一のマシンで可能にする
3. **パフォーマンスの維持**：ページングが発生しても、トレーニング速度やパフォーマンスを大きく低下させることなく、65Bモデルを48GBのGPUでトレーニング可能にする

### QLoRAの性能
- **Guanacoモデル**：QLoRAを使用して微調整されたGuanacoモデルは、VicunaベンチマークでChatGPTの99.3%の性能を達成し、他のオープンソースモデルを上回る性能を示した
- **評価結果**：QLoRA微調整は、小規模な高品質データセットを使用することで、以前の最先端モデルよりも優れた結果を達成しました。例えば、Guanaco 65Bモデルは24時間以内に単一GPUで微調整され、ChatGPTに匹敵する性能を発揮した
- **データセットの品質**：データセットのサイズよりも質が重要であり、QLoRA微調整は高品質なデータセットでの優れた性能を示した


## まとめ
以上がQLoRAの要約でした。メモリ消費多い問題はLLMのFine-Tuningをするうえで絶対に出てくるので知っておくとよさそうですね。

おわり。
RubyKaigi2024レポ

5/15-17にかけて開催されたRubyKaigi2024に参加しました！
今回の開催は沖縄ということで、初夏で過ごしよい気候の沖縄とRubyのセッションを二重に楽しめて非常にお得なイベントでした。

以下感想ベースのレポ。

## Weird Code
day1の最初のセッションでWeird Codeという概念を初めて知りました。
直訳すると奇妙なコードって意味になりますが、アスキーアートみたいなコードが実際に動かせたり、さらにはそのアスキーアート自体がGIFみたいに動いたりと、文字通り奇妙なコードでアート的な面白さとインタプリタの知見の両方が生かされた楽しい文化だなーと。自分でも試してみたくなる良いセッションでした。
https://drive.google.com/file/d/1Dkx15u_5UAGoFqJHCeAuj2FXS-z_U7EE/view

ちなみに、会場とかに貼られてたポスターもWeird Codeで書かれてました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88290/42c48160-86fa-703b-0b39-5ed8cc04edd2.png)


## Property Based Testing
https://speakerdeck.com/ohbarye/unlocking-potential-of-property-based-testing-with-ractor

恥ずかしながら、Property Based Testing(PBT)という概念知らなかったのですが、flakyとかで入力値にランダム性持たせたテストを大量に回して予期せぬ不具合を洗い出すみたいな感じで解釈しました。(いつものテストはExample Based Testingっていうらしい)
んで、大量に回すためにractorを使った並列実行やテスト支援するPBT gemの紹介などをするセッションでした。
話聞いてるときは現場で活かせそうな話だなーと思ってましたが、実際にPBT活かせそうな機会って考えた際に現状あんまりなさそうだなーと。実際に有効活用している例とか気になります。

## rbs（とLLM
https://rubykaigi.org/2024/presentations/kokuyouwind.html

rbsの型定義をLLM使っていい感じに自動生成しようぜ、ってセッション。開発中のRBS gooseというツールの開発の過程をベースにrbsの自動生成周りの現場やLLM周りの話が聞けました。
rbsの自動生成周りの知見なかったので、現状どういったツールが有りそれぞれの精度がざっくり把握できたのが良かったです。あと、LLMの利活用周りの具体的な話が聞けたので、自身でLLM使ってなにか作りたいってときの参考にできそうだなーと。

## Parser関連
今年のRubyKaigiはParser（とParserGenerator）の話が多く、lramaやprismなどのセッションが多かった印象です。
ただ、自分がコンピュータサイエンスのバックエンドが全然ないため、正直話の内容ほとんど理解できず、漠然と凄いなーという小学的な感想を抱きつつRubyコミッターさんへ尊敬と感謝の念を湧かすくらいのことしかできなかったです。

## 来年の自分へ
今年の自分は特に目的なくなんとなくでRubyKaigiに参加しました。それでも楽しめてはいたのですが、準備してから参加したほうがより楽しめたかなーという反省点がいくつかあったので残しておきます。

### セッションの下調べ
Parser関連などセッション参加しても理解が追いつかずに十分に楽しめなかったセッションができてしまったのが心残りになってます。

なんで、来年参加する場合は事前にセッション確認して理解できる内容か確認したうえで、理解できない場合は事前に知識蓄えるなどの準備をしとくと良さそうです。

### DrinkUp
ドリンクアップの参加申込あとでいいかってやってたら枠終わってたりしてたので、来年は早めに申込しとくと良さそう。

### 観光
RubyKaigiとはズレますが、RubyKaigi参加ついでに観光したい場合は先に目的と必要な時間整理して予定組んでください。
旅行慣れしてないのに時間だけ用意してアドリブで楽しもうとしても時間持て余すだけで満足感下がります。
アプリケーションのグローバル化に関わる技術~i18n, l10n is 何~

まずはこちらを御覧ください

https://douraku.co.jp/

ここで使われる多言語対応の技術について説明します。

## i18nとl10n

i18nとl10nは、ソフトウェアの国際化と地域化に関連する用語です。

i18nは「internationalization」の略で、その名前は「i」から始まり、「n」で終わる20文字の単語から来ています。i18nは、ソフトウェアを設計・開発する際に、それが異なる言語と地域で使用できるようにするプロセスを指します。これには、文字列の外部化、日付と数値の書式設定、文字列の比較とソート、データの双方向性などが含まれます。

l10nは「localization」の略で、その名前は「l」から始まり、「n」で終わる12文字の単語から来ています。l10nは、ソフトウェアを特定の地域や言語に合わせて適応させるプロセスを指します。これには、翻訳、地域固有の書式設定、法的要件の遵守などが含まれます。

これらのプロセスは、ソフトウェアがグローバルな市場で成功するために重要です。i18nは、ソフトウェアが異なる地域で使用できるようにするための基盤を提供し、l10nはそのソフトウェアを特定の地域に適応させるための手段を提供します。

## internationalization

i18n（国際化）の具体的な使い方は、使用するプログラミング言語やフレームワークによりますが、一般的な手法をいくつか紹介します。

文字列の外部化：ユーザーに表示するすべての文字列をコードから分離し、外部のリソースファイル（例えば、.propertiesファイルや.jsonファイル）に格納します。これにより、異なる言語の翻訳を追加するためにコードを変更する必要がなくなります。

日付と数値の書式設定：異なる地域では、日付や数値の書式が異なります。これらの書式をユーザーの地域設定に合わせて動的に変更するために、国際化ライブラリを使用します。

文字列の比較とソート：異なる言語では、文字列の比較とソートのルールが異なります。これらの操作を行う際には、ユーザーの地域設定を考慮する必要があります。

以下に、JavaScriptでi18nを実装する一例を示します。この例では、i18nextというライブラリを使用しています。

```javascript
// i18nextの初期化
import i18n from "i18next";
import { initReactI18next } from "react-i18next";

i18n.use(initReactI18next).init({
  resources: {
    en: {
      translation: {
        Welcome: "Welcome",
      },
    },
    ja: {
      translation: {
        Welcome: "ようこそ",
      },
    },
  },
  lng: "en",
  fallbackLng: "en",
  interpolation: {
    escapeValue: false,
  },
});

// 文字列の使用
console.log(i18n.t("Welcome")); // Outputs: Welcome
i18n.changeLanguage("ja");
console.log(i18n.t("Welcome")); // Outputs: ようこそ
```

この例では、英語と日本語の翻訳をリソースとして定義し、i18n.t関数を使用して翻訳された文字列を取得しています。また、i18n.changeLanguage関数を使用して現在の言語を変更しています。

# localization

l10n（ローカライゼーション）は、ソフトウェアを特定の地域や言語に合わせて適応させるプロセスです。これには、翻訳だけでなく、日付や通貨の形式、文字列のソート順序など、地域固有の規則や慣習を考慮することが含まれます。

以下に、JavaScriptでl10nを実装する一例を示します。この例では、Intlオブジェクトを使用しています。

```javascript
// 日付のローカライゼーション
let date = new Date();
console.log(new Intl.DateTimeFormat("en-US").format(date)); // Outputs: "12/31/2020" (for example)
console.log(new Intl.DateTimeFormat("ja-JP").format(date)); // Outputs: "2020/12/31" (for example)

// 通貨のローカライゼーション
let number = 123456.78;
console.log(
  new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" }).format(
    number,
  ),
); // Outputs: "$123,456.78"
console.log(
  new Intl.NumberFormat("ja-JP", { style: "currency", currency: "JPY" }).format(
    number,
  ),
); // Outputs: "￥123,457" (JPY doesn't use decimal places)

// 文字列の比較（ソート順序）
let strings = ["ä", "a", "z"];
strings.sort(new Intl.Collator("de").compare);
console.log(strings); // Outputs: ["a", "ä", "z"] (In German, 'ä' is sorted with 'a')
strings.sort(new Intl.Collator("sv").compare);
console.log(strings); // Outputs: ["a", "z", "ä"] (In Swedish, 'ä' is sorted after 'z')
```

この例では、日付と通貨の形式をローカライゼーションし、文字列の比較をローカライゼーションしています。これらの操作は、ユーザーの地域設定に基づいて動的に変更されます。
WorkatoでOAuth認証のコネクションがロストした時にやること

# はじめに

WorkatoのOAuth2コネクションで、突然の「Connection lost」.....。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/75bb4310-07dd-03b1-8278-c8565204ab4a.png)


こんな事象を経験した方がいるかもしれません。

今まで問題なく使えていたコネクションが急に動かなくなるとびっくりしますよね。
でも大丈夫です。原因と対処方法が分かれば怖くないです。

# コネクションのロストとは何なのか？
Workatoのコネクタでは、ご存知の通り様々な接続方法に対応しています。
（Basic認証、APIキー認証、OAuth2.0認証、その他）

OAuth2を例に挙げると、ユーザーが権限を委譲したクライアントアプリを通じて発行されたアクセストークンを使用して、Workatoとサービス間でやり取りします。
アクセストークンの性質上、有効期限は(どんなに長くても)ほんの数時間です。
Workatoレシピで当該コネクタのポーリングトリガーやアクションが実行されると、サービス側への通信が発生しますので、期限切れの場合はサービスから「無効なトークンですよ」という反応が返ってきます。
コネクタ内部でトークンの有効期限切れを検知すると、リフレッシュの処理、すなわちサービス側へのトークンの再発行を要求します。
このとき何かしらの要因で失敗すると、Workatoでは**コネクションのロスト**という結果になります。


# 原因別の対処方法
トークンのリフレッシュ時に失敗する原因は３つ考えられます。

## 原因①連携サービス側のメンテナンスや停止

タイミングが悪く連携先サービスがメンテナンス中だったり、障害による停止等の**サーバーが応答できない状態**にあった場合には、コネクションを確立できません。

**＜対処＞**
一時的な事象ですので、連携先サービスが再開されていることを確認(*)し、**『Check Connection』をクリックします**。
（*SaaS等ではステータスを公開していることがほとんどです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778017/b871aab3-f645-4c88-122b-3c2980d09778.png)


## 原因②接続したアカウントに問題が生じた

管理者により連携先サービスの**アクセス権が変更され、コネクションを作成したユーザーアカウントが削除されたり、要求するスコープの権限を喪失した**場合には認証に失敗します。

**＜対処＞**
一度コネクションを**切断して**、生きている・権限が十分に付与されたアカウントで**再接続**します。
**＜Tips＞**
こうした影響を避けるため、OAuth認証のコネクションに利用するアカウントは、バイネーム(人間ユーザー)アカウントよりも、システム連携用アカウントでの運用がお勧めです。

## 原因③コネクタの不具合

原因①や②の対処法を試しても改善しない場合は、Workato標準のコネクタであれば当社（リックソフト）などのパートナーかWorkato社へ問い合わせる、カスタムコネクタであればコネクタ提供元のベンダーに問い合わせることをお勧めします。

特にコネクタのアップデート後にロストした場合は、認証に係る処理に予期せぬ変更が加わっていて、不具合が起きている可能性があります。（要はバグです）
もしも問題のあるバージョンを自社の本番環境に適用してしまった場合は、以前のバージョンに戻した上で『Check Connection』で接続を復旧してください。稼働中のレシピへの影響を防げます。

# さいごに
今回はOAuth2認証を例に、接続不具合となり得る原因・対処法を紹介しましたが、APIキーによる認証でも同様で、サービス側の設定を変更してそのAPIキーの無効化や権限剥奪などを行うと、コネクションがロストします。

Workatoのレシピを構築する過程で、連携先サービスとの接続を行う際にビルダーが自分のアカウントを用いて、または当時の主要なビジネスユーザーのアカウントを用いてコネクションを作成して、本番利用に至る場合があると思います。
OAuth2認証の特徴として、ユーザー単位でクライアントアプリに認可の権限を移譲するため、この「ユーザー」という部分で、原因②の危機にさらされやすいです。
社員の入退社や組織変更によって**コネクションを作成した**ユーザーアカウントが資格を喪失することがあるので、運用上の注意が必要です。

コネクションについては、運用・監査の観点で問題ないものを管理者が作成して、「これを使って」とビルダーに周知して使ってもらう運用がベストだと思います。
未経験からエンジニア転職を成功させるための3STEP

プログラミング未経験からエンジニア転職したいけど、具体的にどうやればいいのか困っていませんか？私自身も未経験からエンジニア転職をした経験があり、以前は同じような悩みがありました。

その後エンジニア転職を果たして、今現在はフリーランスとして活動をしています。そこでここでは、同じように未経験からエンジニア転職したい人に向けて、**私がエンジニア転職のためにやってきた具体的な3STEP**についてご紹介します。私がエンジニアになるためにやってきたことは、以下の3STEPです。

<br>

![3steps-to-Become-Engineer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784196/72eb99a1-a875-fef9-c180-4088cfe55f38.jpeg)


1. [Progateでプログラミング適性をみる](https://taishi-official.com/2020/04/04/136/)
2. [Udemyでより実践的な学習をする](https://taishi-official.com/2020/03/28/110/)
3. [プログラミングスクールに通い、エンジニア転職をする](https://taishi-official.com/2023/12/22/1368/)

<br>

ちなみにSTEP3のプログラミングスクールについてですが、私は**DMM WEBCAMP**を受講しました。その時の体験談などについて、以下で紹介しています。

[>> DMM WEBCAMPを受講した実体験をもとに紹介！](https://taishi-official.com/2020/04/19/324/)

3STEPの詳細については、以下のリンクにて解説しております。未経験エンジニア転職にご興味のある方、ぜひご覧ください:bangbang:


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

<br>

https://taishi-official.com/learning-programming/

<br>

<strong>＼Follow me／</strong>

- X（旧Twitter）：https://x.com/taishi_it_blog
- Instagram：https://www.instagram.com/taishi_will_be/
- YouTube：https://www.youtube.com/@Engineer_ILLBE
- 
- note：https://note.com/taishi_wii_be/

<br>

最後に良かったら「いいね」お願いします:thumbsup:
Firebseで本番環境を作成する際に忘れがちな設定

## Firebase
### 認証済みドメイン
ドメインを移行した際に忘れがち
![スクリーンショット 2024-05-21 8.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199072/038039d5-9edc-8390-c842-de5befed86d2.png)

### アクションURLの設定
ドメインを移行した際に忘れがち
![スクリーンショット 2024-05-21 8.54.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199072/5be88a83-068c-9497-ced1-f4e619ac487b.png)

## Cloud Firesote
### 本番移行する際そもそもDBを作成していない

### 複合インデックス
![スクリーンショット 2024-05-21 9.21.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199072/99d78c41-8c7c-93ac-5528-ce71727e1b63.png)
TypeScriptのオブジェクトにおけるプロパティの順番

## 型を指定しても順番通りとは限らない

以下の型指定がある場合
```ts
type StartedAtType = {
    year?: number;
    month?: number;
    date?: number;
}
```

以下のコードでは年-月-日にならない可能性がある。
```ts
const setStartedAt = (startedAt: StartedAtType | undefined): string | undefined => {
    if (!startedAt?.year || !startedAt?.month || !startedAt?.date) {
      return undefined;
    }

    return Object.values(startedAt).join('-');
  };
```

startedAtにyear → month → dateの順に設定されているStartedAtType型を指定しても、順番のチェックまではしてくれません。そのため、startedAtには以下のような値が格納されている可能性があります。通常のJavaScript同様にオブジェクトに登録された順番で値を保存する仕様であるためです。

```ts
startedAt = {
    month: 04;
    date: 23;
    year: 2024;
}
```

## 対応方法

以下のように実装することが必要です。
```ts
const setStartedAt = (startedAt: StartedAtType | undefined): string | undefined => {
    if (!startedAt?.year || !startedAt?.month || !startedAt?.date) {
      return undefined;
    }

    return `${startedAt.year}-${startedAt.month}-${startedAt.date}`;
  };
```

もしくは、以下のように値を初期化しておく（事前に決めた順番で登録する）ことで想定外の順番で登録されることが防げます。
```ts
const initStartedAt = {
    year: 2024
    month: 04
    date: 23
}
const [startedAt, setStartedAt] = useState(initStartedAt);
```
「いずれか」と「いづれか」どっちが正しいのか忘れないようにする方法


## 前提

Win11環境を想定する

## こーする

### タスクバーのIMEのオプションを出す

「単語の追加」を押す

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/09ecf168-4656-0fe2-9a8e-00c618083373.png>

### 単語の登録をする

単語：いずれか
よみ：いｄ
と入力し、登録ボタンを押す

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/09d14ce4-b985-db13-332f-e7a172f47245.png>

## これでもう間違えない…はず

<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/2451b6e4-3a7a-b3db-975c-89f6562e7fcc.png>
NGはリーダブルコード過激派的にはNGかもしれない


## 言葉の定義

リーダブルコード過激派 = 外国人にも通じるような命名をつけろという思想を持っている人

（日本人しか保守しないようなプロジェクトでもこのような思想を持っている人がたまにいる。動詞にisを付けるのが許せない、registみたいなワードが許せない。みたいな。別にこれが主題じゃないので深く考えないでください。）

## 本題

ある入力に対して、以下のいずれかの値を出力する関数を作った。

```
"OK"
"KEEP"
"NG"
```

まあ別にこれでいいのだが、仮にこの関数をOSSで利用できるようにしたい場合、この名称でいいのかなーと、ふと思い調べてみたところ、なんと`NG`という言葉は和製英語[^1]であり、外国人には通じないということを知った。

## ということで

日本人以外でも分かるようにするためには、`NG`というワードは使わないほうがいいかもしれない。

代替案だと、`NOK`[^2]とか`BAD`とかでしょうかね。

[^1]: https://eikaiwa.dmm.com/uknow/questions/11692/
[^2]: https://blog.enjo.life/english-ok-ng/
robloxでassistant その61

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
自分をコピペして、自分に、ひっつく。

# 手順
- RUNして、自分をコピーしてReplicatedStorageに置く。
- 名前をnpcにする。
- ReplicatedFirstにlocalscriptを追加。
- スクリプトを書く。

```
local player = game.Players.LocalPlayer
print(player.Name)
local me = game.Workspace:WaitForChild(player.Name)
if me then
	print("me")
end
local NPC = game:GetService("ReplicatedStorage"):WaitForChild("npc"):Clone()
NPC.HumanoidRootPart.Position = Vector3.new(0, 0, -10)
NPC.Parent = game.Workspace
game:GetService("RunService").RenderStepped:Connect(function()
	NPC.Humanoid:MoveTo(me.HumanoidRootPart.Position + Vector3.new(-3, -2, 0))
end)

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1ec183f9-382f-5ace-a267-df825ed9630e.png)


以上。
【Windows】会社のロゴを使ってマウスポインタであそんでみた

## はじめに
PCで気軽に何か遊べないかな～と考えたときに、「マウスポインタを変えてみよう！」とふと思いやってみました:arrow_upper_left:
変更できること自体は知っていたのですが、実践してみるのは初めてです。

## 設定方法
### 1. マウスポインタの作成
まずは、どのようなマウスポインタにしようかということから考え。。
既存でいろいろな種類が入っているのですが、せっかくやるならオリジナルが良いなと思い、マウスポインタ作成から始めました。
せっかくなので、弊社のロゴを使用しました！

作成で使用したのは"[彩彩畑](https://www.vector.co.jp/soft/win95/art/se308766.html)"というソフトです。
ただの画像だとカーソル感がないから使いづらそうだと思い調べたところ、[良いデザインを作成されている方のサイト](https://novicengineering.com/%E3%80%90%E7%B0%A1%E5%8D%98%E3%80%91%E3%83%9E%E3%82%A6%E3%82%B9%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB%E3%82%92%E8%87%AA%E4%BD%9C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)があったので参考にさせていただきました。
矢印をつけるという頭が私にはなかった。。

インストールしたらすぐ使用できるので、起動します。

下の"アイコン"を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/e6ab482b-5454-0b51-721b-c22ea32ad2a7.png)

マウスポインタにしたい画像をドラッグ＆ドロップし、必要に応じてデザインを変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/efebc694-2226-8ea1-7624-cef19851e40e.png)

拡張子を"GIF"から"CUR"に変更し、保存
<font color="Red">**※保存する際は、C:\Windows\Cursorsに配置**</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/6a0d9d04-e1a3-ac97-21f3-5f78b45808e4.png)

### 2. マウスポインタの設定
画像が用意できたら、いよいよ設定です。

スタートメニュー > "設定"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/55a049ab-ca86-b2e7-9c2d-dd9f0363c0c6.png)

"Bluetoothとデバイス" > "マウス" > "マウスの追加設定"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/56002ad2-5ee3-bb01-cab5-d971315dbe7b.png)

カスタマイズから変更したいマウスポインタを選択した状態で、"参照"を押下し画像を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/480645a2-ddbd-d478-f48f-669d18fdd454.png)

"OK"を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/a7898d32-6373-a291-efad-0322e6b66352.png)

カスタマイズしたマウスポインタに変更できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/8d80f5a6-d6a7-7dc0-3f79-12d6b18bd168.png)

## 最後に
今回は、マウスポインタをオリジナルに変更する方法についてご紹介いたしました。
想像通りではありましたが、やはりノーマルが一番視覚的にわかりやすいですね。

最後までお読みいただき、ありがとうございました:point_up_tone1:
[Google Cloud Text-to-Speech API(V1)] Javaで音声の変換がサポートされている音声リストを取得する

Cloud Text-to-Speech API V1(Java)を使用して、
Javaで音声の変換がサポートされている音声リストを取得する方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Cloud Text-to-Speech API(V1)] JavaでText-to-Speech APIを使ってみる](https://qiita.com/doran/items/9edbd7d4ed11c5c4ec5f)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[サポートリストを取得](#1-サポートリストを取得)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. サポートリストを取得
音声の変換がサポートされている音声リストを取得します。

### 1.1. スコープ
OAuth2.0でこのAPIを実行するには、以下のスコープを指定してください。
サービスアカウントで実行する場合はスコープの指定は不要です。
```
https://www.googleapis.com/auth/cloud-platform
```

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    try(TextToSpeechClient client = getTextToSpeechClient()){
        ListVoicesRequest.Builder builder = ListVoicesRequest.newBuilder();
        builder.setLanguageCode("ja");
        
        ListVoicesResponse response = client.listVoices(builder.build());
        System.out.println(response);
    }
}
```
#### 1.2.1. HTTPリクエスト
GET:　https:\//texttospeech.googleapis.com/v1/voices
が実行されます。

#### 1.2.2. クエリパラメータ
ListVoicesRequest.Builderのsetメソッドにより、リクエストボディを追加できます。
build()メソッドでListVoicesRequestインスタンスを取得し、
listVoices()に渡します。

|メソッド|引数|説明|
|---|---|---|
|setLanguageCode|String|取得する言語(省略時は全ての言語を取得)|

### 1.3. レスポンスの内容
#### Voice
|メソッド|戻り値|説明|
|---|---|---|
|getLanguageCodes(0)|String|サポートする言語|
|getName|String|声の名前|
|getSsmlGender|[SsmlVoiceGender(enum)](#ssmlvoicegender)|声の性別|
|getNaturalSampleRateHertz|int|音声のサンプルレート(ヘルツ)|

#### SsmlVoiceGender
|定義値|内容|
|---|---|
|SSML_VOICE_GENDER_UNSPECIFIED|性別不詳|
|MALE|男性の声|
|FEMALE|女性の声|
|NEUTRAL|性別を問わない声(未サポート)|

<br>
<br>
おしまい。。
robloxでassistant その60

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
自分をコピペして、動かせ。

# 手順
- RUNして、自分をコピーしてReplicatedStorageに置く。
- 名前をnpcにする。
- ReplicatedFirstにlocalscriptを追加。
- スクリプトを書く。

```
local NPC = game:GetService("ReplicatedStorage"):WaitForChild("npc"):Clone()
NPC.HumanoidRootPart.Position = Vector3.new(0, 0, -10)
NPC.Parent = game.Workspace
while true do
	NPC.Humanoid:MoveTo(Vector3.new(-10, 0, 0))
	print("w0")
	NPC.Humanoid.MoveToFinished:Wait()
	NPC.Humanoid:MoveTo(Vector3.new(0, 0, -10))
	print("w1")
	NPC.Humanoid.MoveToFinished:Wait()
	NPC.Humanoid:MoveTo(Vector3.new(0, 0, 0))
	print("w2")
	NPC.Humanoid.MoveToFinished:Wait()
	wait(3)
end


```

# 写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0c03a79e-856a-d56e-fb9e-5c09b6349d4c.png)


以上。
React 環境変数の読み込みエラー Uncaught ReferenceError: process is not defined の解決方法

# はじめに
この記事では、React で以下の環境変数読み込みエラーが発生したときの解決方法について記載します。

```Uncaught ReferenceError: process is not defined```

# 開発環境
開発環境は以下の通りです。

- Windows11
- React 18.2.0
- Vite 5.1.7

# エラー発生時のコード
エラー発生時のコードは以下の通りです。

```.env.development
REACT_APP_TEST="test"
```

```App.tsx
console.log(process.env.REACT_APP_TEST);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/7b34a2bf-d134-f405-2e9c-8f6488e3c6e8.png)

# 原因
エラー発生時のコードが Vite を使っているにも関わらず、Create React App での環境変数の書き方だから。

https://create-react-app.dev/docs/adding-custom-environment-variables/

# 解決方法
Vite の環境変数の書き方に変更する。

- `REACT_APP_[hoge]` を `VITE_[hoge]` に変更
- `process.env.REACT_APP_[hoge]` を `import.meta.env.VITE_[hoge]` に変更

https://ja.vitejs.dev/guide/env-and-mode.html


```.env.development
VITE_TEST="test"
```

```App.tsx
console.log(import.meta.env.VITE_TEST);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/396e9d47-7d92-327f-b06d-041ac3865b96.png)


# 参考
- [Adding Custom Environment Variables](https://create-react-app.dev/docs/adding-custom-environment-variables/)
- [環境変数とモード](https://ja.vitejs.dev/guide/env-and-mode.html)
「非管理者として実行したときに管理者として再実行」 & 「batファイルの中にPowerShellスクリプトを埋め込む」を両方実現する

```run-as-admin-powershell.bat
@SETLOCAL&SETLOCAL ENABLEDELAYEDEXPANSION&(chcp 65001>NUL)&PUSHD "%~dp0"&(SET SCRIPT_PATH=%~f0)&(SET SCRIPT_DIR=%~dp0)&(SET SCRIPT_NAME=%~nx0)&(SET SCRIPT_BASE_NAME=%~n0)&(SET SCRIPT_EXTENSION=%~x0)&(SET SCRIPT_ARGUMENTS=%*)&(POWERSHELL -NoLogo -Sta -NoProfile -ExecutionPolicy Unrestricted "&([scriptblock]::create('$OutputEncoding=[Console]::OutputEncoding;'+\"`n\"+((gc -Encoding UTF8 -Path \"!SCRIPT_PATH!\"|?{$_.readcount -gt 1})-join\"`n\")))" !SCRIPT_ARGUMENTS!)&(SET EXIT_CODE=!ERRORLEVEL!)&POPD&EXIT !EXIT_CODE!&ENDLOCAL&GOTO :EOF

if(!(([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator"))){
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c `"$Env:SCRIPT_PATH`"" -verb runas;
    ### 非管理者で実行させたい内容があればこのあたりに記述 ###
    exit;
}
### 以降、管理者で実行させたいPowerShellを記述 ###
```

参考にさせて頂いた記事
https://qiita.com/mo1/items/7096a4b5a08d836cf4ad
https://qiita.com/Xiacchi/items/765f032733fe904b1e88
ITパスポート セキュリティ関連法規

・サイバーセキュリティ基本法
日本のサイバーセキュリティに関する施策の基本理念やセキュリティ戦略を定めた法律

・不正アクセス禁止法
不正な侵入や利用を禁止する法律
他人のIDとパスワードを無断で使用したり、第三者に提供したり、セキュリティホールを攻撃してコンピュータに侵入する行為などが禁止されている

・個人情報保護法
個人情報を適切に取り扱うことを義務付ける法律

・GDPR
EUが定めている個人情報保護に関する規則

・プロバイダ責任制限法
インターネット上で誹謗中傷などがあった際のプロバイダの責任範囲や、被害者がプロバイダに対して発信者の情報開示を請求できる権利を定めた法律

・特定電子メール法
迷惑メールを規制する法律
・オプトイン
特定電子メールの送信者は、電子メールの送信に際し、あらかじめ受信者の承諾を得ておく必要がある

・ウイルス作成罪
コンピュータウイルスを作成したり、正当な理由なく提供や共用、取得、保管するコンピュータ犯罪
刑法の処罰対象になる