OmniAICreator/Qiita-1.07M huggingface dataset:
AND演算子（&&）とオプショナルチェイニング演算子（?.）の違いと使い分け

※個人メモ用としても記載しております。

JavaScriptでは、AND演算子（&&）とオプショナルチェイニング演算子（?.）は、それぞれ異なる目的で使用されます。
この記事では、これらの演算子の違いや使い方を詳しく解説し、シンプルに使い分けを説明します。

## AND演算子 (&&)
AND演算子は、複数の条件がすべて真（true）の場合にのみ真を返します。条件のどれかが偽（false）の場合、その時点で評価を停止し、偽（false）を返します。

##### 主な用途：

- 複数の条件を組み合わせて評価したいとき
- ショートサーキット評価を利用して
 特定の条件が満たされた場合のみ次の処理を行いたいとき

例として
```
const a = 10;
const b = 20;

if (a > 5 && b < 30) {
  console.log("Both conditions are true.");
}
```
この場合、a > 5 と b < 30 の両方が true であれば
console.log が実行されます。


ショートサーキット評価の例
```
const user = null;
console.log(user && user.name);  // 出力: null
```
この例では、user が null であるため
user.name は評価されず、null が返されます。

※ ただし、ここで注意すべきなのはJavaScriptにはfalsyと呼ばれる値が存在し、これらは真偽値の評価時に false として扱われます。主な [falsy 値](https://developer.mozilla.org/ja/docs/Glossary/Falsy)には以下のものがあります

- false
- 0（数値のゼロ）
- ""（空文字列）
- null
- undefined
- NaN（Not a Number）

これらの値は、true でも false でもないように見えるかもしれませんが、条件式の中では false として評価されます。


## オプショナルチェイニング演算子 (?.)
オプショナルチェイニング演算子は、オブジェクトのプロパティやメソッドにアクセスする際に、null や undefined が原因でエラーが発生するのを防ぐために使用されます。
存在しないプロパティにアクセスしてもエラーを出さず、undefined を返すという安全性が特徴です。

##### 主な用途：

- オブジェクトやプロパティが存在しない可能性がある場合でも、安全にアクセスしたいとき
- ネストされたオブジェクト構造において、特定のプロパティが存在しない場合のエラーを回避したいとき

使用例として
```
const user = null;
console.log(user?.name);  // 出力: undefined
```
この例では、user が null でもエラーは発生せず、undefined が返されます。

もう一つの例:

```
const user = {
  profile: {
    name: "Alice"
  }
};

console.log(user.profile?.name); // 出力: "Alice"
console.log(user.address?.city); // 出力: undefined （`address`が存在しないため）
```

## AND演算子 (&&) とオプショナルチェイニング演算子 (?.) の違い

### 比較表

![スクリーンショット 2024-09-25 9.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657171/5391e4e0-12f1-4456-68c6-798959677491.png)


### 使い分けのポイント
- 複数条件の評価が必要なとき → AND演算子（&&）
- オブジェクトのプロパティに安全にアクセスしたいとき 
 → オプショナルチェイニング演算子（?.）

例としての使い分け
```
const user = {
  profile: {
    name: "Alice"
  }
};

// AND演算子で名前が存在するかをチェック
if (user && user.profile && user.profile.name) {
  console.log(user.profile.name); // "Alice"
}

// オプショナルチェイニングで安全に名前にアクセス
console.log(user?.profile?.name); // "Alice"
```
この例では、両方の演算子が同じ目的を達成していますが、オプショナルチェイニングの方が簡潔で読みやすいです。


## まとめ
オプショナルチェイニング演算子は、ネストされたオブジェクトにアクセスする際のコードをよりシンプルで安全にします。
一方、AND演算子は、複数の条件を一度にチェックする際に使います。
どちらも用途によって適切に使い分けることで、エラーの少ないコードを記述できます。
latexmkで中間ファイル削除【*.dvi,*.synctex.gzが消えない!】

# VScodeではLatexコンパイル時の中間ファイルを自動削除できます
最初は[こちらの記事](https://qiita.com/rainbartown/items/d7718f12d71e688f3573)を参考に設定を進めていきました.
## VSCCodeの`setting.jason`の設定
```
"latex-workshop.latex.clean.fileTypes": 
        [ ".aux", ".bbl", ".blg", ".idx", ".ind", ".lof", ".lot", ".out", ".toc", 
        ".acn", ".acr", ".alg", ".glg", ".glo", ".gls", ".ist", ".fls", ".log", 
        ".fdb_latexmk", ".snm", ".nav", ".dvi", ".synctex.gz"
        ],
    "latex-workshop.latex.autoClean.run": "onBuilt",
    "latex-workshop.latex.outDir": "out"
```
とりあえずこれを書いておけばビルド時にoutディレクトリの中の要らないファイルを消してくれます．

* 保存時に変更にしたい場合は`"onBuilt"`を`"onSave"`に変更．
* [tex]とかで囲んだところに書かなくてok.
* これ以降にも設定ある場合は`,`最後に追加するのを忘れずに．


# 【問題】`~.dvi`,`~.synctex.gz`のファイルだけ消えない！！

とりあえずChatGPTに聞いてみました．
* 上記の設定がきちんとできているか
* ターミナルで`rm out/*.dvi out/*.synctex.gz`してみて手動削除できるか
* ファイルが他のプロセスによってロックされていないか，権限周りの設定は間違っていないか

等を確認されましたがどれも問題なく手詰まり(；；)．シェルスクリプトを書いて実行して消す方法などもありましたが，とにかくめんどくさい操作をせず一発で中間ファイルを消したかったので一旦無視．

# `.latexmkrc`に一行付け足したら解決しました
```
$clean_ext = "aux log synctex.gz dvi";
```
これをとりあえず一番下に追加で解決．


### 追記_自分の環境
EndeavorOS(Arch系Linux) i3
コマンドとかの関係上一応書いたけど本記事にはあんまり関係ないと思います
snowflakeで英語翻訳を簡単に試してみた。

# はじめに
kaggleなどで英語データを収集している際、日本語に翻訳したくなるケースはないでしょうか？
患者データの所感が英語だったり、記事データの内容が英語だったりしますよね。。。。

一記事程度であれば、google翻訳だったり、ChatGPTを使って対応できますが、文字制限がありますし、何十件、何百件とあると面倒くなります。そして、最後に行き着くのはコード作成だと思います。

なんとなくコードの想像は付くけど、なんかコードが長くなりそう。。。
あー、どうしよかな？？と悩み始めたそこの貴方！

そのタスク、snowflakeならば１クエリで終わります。

# 前提と準備
* snowflakeアカウントは作成済みで、accountadminで作業することとします。
* 今回の記事では、こちらの[BBC news](https://www.kaggle.com/datasets/gpreda/bbc-news "BBC news")のデータを試しに利用します。中身は⇩な感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715331/88a79c63-7346-541c-10b9-61d0d6517f37.png)

# 手順の確認
1\. 取り込み、翻訳語データ格納用のデータベース、スキーマの作成
2\. CSVファイルの取り込みとテーブル作成
3\. 翻訳クエリの作成と実行

# 1.  データ格納用のデータベース、スキーマの作成
以下、クエリをワークシート上で実行します。
```
CREATE database bbc_news;
CREATE schema news;
```

# 2.  CSVファイルの取り込みとテーブル作成
今回は簡単にGUI上でテーブル作成をしちゃいます。
作成したnewsスキーマを右クリックして。データロードを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715331/5b16d691-a218-1e2f-0896-c32e54ae048e.png)

kaggleからダウンロードしたCSVファイルを指定して
![スクリーンショット 2024-09-25 11.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715331/d4cde613-9f1a-d36c-0594-60434cc059bb.png)
テーブル名をNEWSにしてあげて
![スクリーンショット 2024-09-25 11.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715331/095650e4-c12d-47de-72c4-3dd1f4d51ace.png)
カラムは自動で検出して設定してくれるので、ヘッダー設定のみ最初の行にはヘッダー...をにして、ロードを選択すれば
![スクリーンショット 2024-09-25 11.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715331/f298bcda-09be-160b-fb92-4d24ef29c454.png)
ロード完了！
![スクリーンショット 2024-09-25 11.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715331/069386a2-260c-8ef6-2f4b-a5f8cf15a7c7.png)
次に翻訳後のデータを格納するテーブルをロードしたテーブル構造をコピーして作成します。
```
CREATE OR REPLACE TABLE news_jp LIKE news;
```
ここで一度、ロードしたデータを見てみましょう！
titleに記事名、DESCRIPTIONに記事内容が記載されていることを確認してください！
```
SELECT * FROM news LIMIT 50;
```
![スクリーンショット 2024-09-25 11.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715331/6a257968-af0a-0b88-6e45-5ad02db68fd8.png)

# 3.  翻訳クエリの作成と実行
今回はsnowflakeの[TRANSLATE関数](https://docs.snowflake.com/ja/sql-reference/functions/translate-snowflake-cortex "TRANSLATE関数")を利用して翻訳します。
実行するコードは以下の１クエリです。
```
insert into news_jp
SELECT 
    SNOWFLAKE.CORTEX.TRANSLATE(TITLE, 'en', 'ja'), 
    PUBDATE, 
    GUID, 
    LINK, 
    SNOWFLAKE.CORTEX.TRANSLATE(DESCRIPTION, 'en', 'ja') 
FROM news 
LIMIT 50;
```
翻訳語の中身を見てみましょう！日本語訳された記事の内容が表示されればOKです！（翻訳したTITLEとDESCRIPTIONのみを抽出してます。）
```
SELECT TITLE, DESCRIPTION FROM news_jp LIMIT 50;
```
![スクリーンショット 2024-09-25 12.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715331/8a6223f9-b44a-5dc0-8db3-022266c1a1fa.png)

# 最後に
GUI操作と簡単なSQLで翻訳を行うことができました！
snowflakeには他にもLLMを簡単に使える[COMPLETE関数](https://docs.snowflake.com/ja/sql-reference/functions/complete-snowflake-cortex "COMPLETE関数")などもあり、
SQLで生成AIや需要予測、クラスタリングができますので是非、試してみてください！！
docker runで今のディレクトリにあるものをコンテナ内に引っ張って来たい時にやるやつ

擦り倒されているネタだけど、いつも忘れるので備忘録として。。

```sh
docker run -it --remove -v `pwd`:/app ubuntu:latest bash
```

`-v`オプションで今いるディレクトリを指定して、`/app`ディレクトリに入れてるだけですね。

膨大な量入れようとすると変なことになるかもしれないので、その辺は用法容量を正しくお使いください。
【OpenAI o1】は“何も考えずに答えて”と言われたら、どうするのか？


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

　今回は、【OpenAI o1】は“何も考えずに答えて”と言われたら、どうするのか？をやってみました。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　まずは、ニュースです。

　OpenAIのChatGPTアプリ版に
　　とうとうAdvanced Voice Modeが
　　　搭載されました。

　これにより、
　　より自然なやり取りが
　　　可能になります。

　なお、
　　開放は、今週中に
　　　すべてのPlus・Teamユーザーに
　　　　順次、行なわれます。

　どうやら、これに関連して
　　・Custom instructions（音声用）
　　・メモリ機能
　　・新しい音声が五つ追加
　も行なわれるそうです。
　　[OpenAI公式ポスト](https://x.com/OpenAI/status/1838642444365369814?t=zeT87so8tDBdeJQ2UkMoRg&s=19)

　　[TikTok公式ポスト](https://vt.tiktok.com/ZS2q1t2ue/)

　それから、Advanced Voice Modeは
　　EU、英国、スイス、アイスランド、
　　　ノルウェー、リヒテンシュタイン
　　　　ではまだ利用できません。

　知人がポーランド在住で
　　EU……可哀想に😭

　利用可能になると、
　　アプリに通知が届く、とのこと。
　　　待ちましょう。

　私も待ちます😅
***
　次は、Big News！
　　Stability AI に
　　　ジェームズ・キャメロン氏が
　　　　参戦しました。

　そうです！
　　映画界で、超有名な監督です！
　　　[Stability AI JAPAN公式ポスト](https://x.com/StabilityAI_JP/status/1838585364858180067?t=Ci-VREc7Vqc7FUYxUykirA&s=19)
***
　さて、本題です。

　今回は、
　　【OpenAI o1】は
　　　“何も考えずに答えて”と
　　　　言われたら、どうするのか？

　考えることが
　　仕事なのですから
　　　それを“やめろ”と言われて
　　　　やめるのか、それとも
　　　　　やめないのか？は
　　　　　　ちょっとした疑問でした。

　ということで
　　やってみました。
***
***●user***
何も考えずに答えてください。

***o1-mini***
思考時間: 2 ～ 3 秒
>包み隠さず答える
ユーザーは「何も考えずに答えてください」と言って、即座で純粋な答えを求めていますね。
>
>指示の真意を探る

かしこまりました。どのような質問にお答えしましょうか？

***●user（ケース１）***
動物の年齢について

***o1-mini***
思考時間: 数秒
>情報の提供を追跡中
動物の年齢についての質問に応答しているが、情報が広範であることを感じている。それに対して、役立つ情報を有しているため、別の視点を提供している。
>
>動物と人の年齢の違いを考える

（年齢の換算方法）
（種類別の平均寿命）
（成長段階とケア）
（健康管理のポイント）
（特殊なケース）
まとめ
動物の年齢を理解することで、適切なケアや健康管理が可能になります。具体的な動物や品種について詳しく知りたい場合は、さらに詳しい情報を提供できますので、お気軽にお尋ねください。

***●user（ケース２）***
動物の年齢について。
何も考えずに答えてください。

***o1-mini***
思考時間: 数秒
>問いかけと回答
動物の年齢についての質問があり、特に迷わずに答えるように言われている。
>
>動物の年齢換算

動物の年齢は種類によって異なります。例えば、犬の場合、一般的に1歳が人間の7歳に相当すると言われていますが、犬種や大きさによっても違います。猫の場合、最初の2年で人間の24歳分、その後は1年ごとに約4歳分とされています。その他の動物でも、それぞれの寿命や成長速度に基づいて年齢が評価されます。
***

　ケース１は
　　指示のあと、
　　　そのセッション全体に
　　　　その指示が続くのか、の
　　　　　確認です。
　　　　　　続きませんね😅

　ケース２は
　　質問とともに指示するパターン。
　　　こちらは、考えはするものの
　　　　最初に集めた情報を
　　　　　出力してきました。
　　　　　　深くは考えなかった
　　　　　　　ようですね👍

　考えるように作られたのに
　　考えるな、とはこれいかに、な
　　　人間の仕打ちとなりました😸

　まぁ、ふつうは
　　考えさせるんですが、
　　　場合によっては
　　　　率直な意見も
　　　　　欲しいわけですよ。
　　　　　　私たちは人間ですから。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
環境変数PATHをわかりやすく表示したい！

単にecho $PATHで環境変数PATHを表示すると、以下のように全部繋がって表示されるので大変見づらいと思います。
```terminal
echo $PATH
```
出力例：
```terminal
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
```
今回は、これをわかりやすく表示するための方法を紹介します。

# 表示方法一覧
結論から言うと、最初に紹介するtrコマンドを使った表示方法が最もシンプルでおすすめです。

## trコマンド
tr コマンドを使って、コロンを改行に置き換える方法です。
```terminal
echo $PATH | tr ':' '\n'
```
出力例：
```terminal
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/go/bin
```

## sedコマンド
sedは本来パターンマッチなどで活躍するコマンドです。
```terminal
echo $PATH | sed 's/:/\n/g'
```

## awkコマンド
trやsedと比べるとやや複雑になります。
```terminal
echo $PATH | awk -v RS=':' '{print}'
```

# エイリアスの設定
毎回コマンドを入力するのは面倒なので、エイリアスを使って簡単に表示できるようにしておくと便利です。

#### vi ~/.zshrc(もしくは~/.bashrc)でシェルの設定ファイルを開いて以下を追加
(showpathの部分は好きな名前にしてください)
```zsh
alias showpath='echo $PATH | tr ":" "\n"'
```
追加が完了したら:wqで保存＆終了

#### 設定の反映
zshの場合
```terminal
source ~/.zshrc
```
bashの場合
```terminal
source ~/.bashrc
```

これで、showpathと打つだけで、先ほど紹介したtrコマンドを使った際の例のように環境変数PATHが表示されます！
AI-102に合格した感想などなど

## はじめに

AzureのAI-102試験(Microsoft Certified: Azure AI Engineer Associate)に合格したので、一連の感想を残そうと思います。
得点は760/1000点で、合格ラインの700点を（ギリギリ）超えることができました。

## 背景

数ヶ月間、RAG関連の技術を学んでいたおかげで、以下のサービスについてはある程度の実務経験と知識がありました。

- **AI Search**
- **Document Intelligence**

腕試しとまだ触れていないサービスの勉強もかねて受けてみました。

## 勉強内容

試験に向けて、以下のような勉強をしました。

### 1. MS Learnのトレーニング

https://learn.microsoft.com/ja-jp/training/courses/ai-102t00

下記のコースを一通り実施しました。
基礎的な部分をざっくり学べるので、とりあえず手を付けるならここからだと思います。
特に**演習**の部分はやっておいた方が良いです。後述しますが個人でAzure AI系のサービスを触るのは簡単にやりづらいため、ラボ機能（MSが教育用に用意してくれるデモ環境）を用いて操作を試しておくと良いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535910/ed85ce7d-78cd-3d3a-4e98-d67d814da351.png)
このようにブラウザ上でおためしが出来ます。重いしガイド的なものが英語ですが…

### 2. プラクティス評価の実施

試験概要ページに載っているプラクティス評価から、選択式の練習問題を受けることが出来ます。

https://learn.microsoft.com/ja-jp/credentials/certifications/azure-ai-engineer/?practice-assessment-type=certification

試験問題自体の対策はこれをメインに行いました。下記のように実施結果も閲覧できます。
9割正解が安定して取れるように周回しました。
問題はあまりバリエーションが無いため、何度もやっていると問題文で答えが分かってしまいます。ですので基本的には一度受ける⇒解けなかった問題のLearnを読む⇒もう一度受けるのように進めると効果的だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535910/3e8da988-2505-9e6c-2ae8-5c52a5e956ad.png)


## 試験内容

試験で出題された内容は、Microsoftの公式ガイドに記載されているものとほぼ一致していました。
試験問題自体は50問程度ですが、出題範囲は記載されているもの全てと思った方が良いでしょう。


https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/ai-102#skills-at-a-glance

### 出題されたサービス

- **ナレッジ系**
  - AI Search
  - Document Intelligence
- **画像分析系**
  - AI Vision
  - AI Video
- **自然言語系**
  - AI Language
  - AI Speech

## 試験のポイント

### 1. ケーススタディが出る

特定のシナリオでどのソリューションを使うのが適切か回答するケーススタディが最初に出題されました。
ケーススタディは全5問で、全問解答しないと次に進めない＆次に進むとケーススタディの再回答は出来ない、という仕様でした。

出題されたシナリオも当然ですが海外の話になるので、急には話がつかめませんでした。
ケーススタディを解くポイントは以下かなと思っています。

- シナリオ、要件、環境をしっかりと読む
    - そもそもどういうことを実現したいのか、多言語なのか、使えるリソースは何なのか、ネットワークに制限はあるのか等、判断材料となる要素を一通り抜き出してみると良いと思います。
    - 選択式の問題であればこの段階で2択くらいには絞れると思います。
- あまり時間をかけすぎない
    - ケーススタディは試験の1割くらいなので、分からないところは思い切って飛ばした方が良いかもしれません。再回答不可なので悩むと思いますが、あらかじめ時間配分を決めておいて判断しましょう。

### 2. Learnの活用

試験中はLearnにアクセスできます。公式カンぺみたいなものですが、これに頼りすぎると当然時間は足りなくなるので、使用用途は念入りな確認および分からない問題の検索くらいと思っておいた方が良いでしょう。

**事前準備として、出題されるサービスへのアクセス方法を確認しておきましょう。**
特に、各サービスのREST APIリファレンスにアクセスできる検索ワードを覚えておくと良いと思います。
普通に検索しようとすると、使わない`.NET`のリファレンスばっかり検索してしまうことになるので、フィルタ等も活用して準備しておくと良いと思います。

### 3. 機械翻訳に注意しよう

Microsoftのドキュメントを見ていると良くあるのですが、日本語ページが機械翻訳のせいで理解不能な翻訳になっていることが非常に多いです。試験の問題文も同様です。
惑わされないように注意しましょう。特に、専門用語はそのまま使用されることが多いです（例：AI 音声⇒AI Speech）。

### 4. 自分で触ってみるのが1番身につく

可能であれば、各サービスを実際に触っておくことをお勧めします。
AIソリューションの構築には共通部分が多いため、一つでも経験を積むと理解が深まります。
このサービスはどういう手順でデプロイする？のような問題もあるため、CUIとGUI（Azure Portal）両方で遊んでみるレベルでもやっておくべきだと思います。

## 感想

テストセンターで受験したせいか、なぜか4:3の画面比率で受けることになり非常に見にくかったです（なんでこの比率なの…？）
また、今回は試験範囲にありませんでしたが、AI Servicesはそのうち来るだろうなと思っています。来年更新する時には内容が多分に変わっている可能性もあるのでこわいです。頑張ります。

## おわり

初めてのAzure試験ということで不安もありましたが、結果的には運よく合格することができました。ソリューション構築とAI Search&Document Intelligenceについては高い得点が取れていたので、経験がちゃんと身についていることを実感できて満足でした。
AI-102の上位資格が出たらチャレンジしてみようと思います。
VSCodeでindent-rainbowの意図しない赤くなるインデントの簡単な解消法

## アジェンダ
VSCodeでindent-rainbowのインデントが赤くなる簡単な解消法についてまとめます。

## 解消法
VSCodeでindent-rainbowのインデントが赤くなるのは、デフォルトのインデント幅とコード内のインデント幅が合っていないと、赤く表示されます。
これを修正するには、以下を確認し、設定し直すだけで解消されると思います。

**手順:**
1. **ステータスバーで現在のインデント設定を確認**:
   - 画面下部のステータスバー（VSCodeの下端）に「タブのサイズ: 2」や「タブのサイズ: 4」などの表示があります。これは現在のインデント幅を示しています。

2. **インデント幅を変更する**:
   - 「タブのサイズ: ○」と表示されている部分をクリックします。すると、インデント幅を変更するメニューがポップアップします。
   - ポップアップ内から「スペースによるインデント(Indent Using Spaces)」や「タブによるインデント(Indent Using Tabs)」を選択し、次に「Select Indentation Size」で希望のスペース数（例えば「2」や「4」など）を選択します。

3. **既存のファイルにインデント幅を適用する**:
   - 既存のファイルに対してもインデント幅を適用したい場合は、再度「タブのサイズ: ○」部分をクリックし、「タブの表示サイズの変更(Change Tab Display Size)」を選択します。これにより、現在開いているファイル全体のインデント幅が変更されます。

## 参考
- [indent-rainbowが赤く表示される件 #VSCode - Qiita](https://qiita.com/mosyaneko/items/0eae56e6c8da711fcc84)
怪しからん通知を遮断する

Norton の通知がうっとおしいので出ないようにできないかという相談がありました。


Norton はインストールしていないのでおかしいな？　と思ったら、こんなのが表示されてきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ed0360c4-b610-de05-86a2-bc04878c5a9f.png)

やれやれ。

# 環境

- MS-Windows11 Pro 23H2
- Google Chrome バージョン: 129.0.6668.60（Official Build） （64 ビット）

# 通知元

Google Chrome　の通知で、anitube.pro の由来であることが表示されています。

anitube.pro にアクセスしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6df872d5-7eb6-de00-3827-f3f01e325d58.png)

いろいろある anitube の眷属の 1 つみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a8b04faf-f456-4d28-f2ac-3618d96741e9.png)

うーむ。コンテンツが正規ではないものは明らかではありますが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e8dbe9d1-9281-8d20-51a7-b9d0435b569c.png)


このサイト自体に広告は見当たらないものの、データがハリボテだったり通知の内容がが明らかに悪意を持っていたりしてフィッシングサイトにかなり近いものであるとみなします。

# 通知のブロック

サイト自体丸ごとブロックが望ましいですが、今回は誤って許可してしまったと思われる通知をブロックすることにしました。

Google Chrome の設定から「プライバシーとセキュリティ」－「通知」


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d86b9697-d49d-7493-0315-0fb1246d1ae7.png)

「通知の送信を許可するサイト」に anitube.pro があるので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0d47b962-46d7-9a30-3a81-a2610a36dd15.png)

「通知」を「ブロック」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6e62ffca-4c9e-2ed6-5143-c2295308404b.png)
IT業界未経験の基本情報技術者 合格記録

# はじめに

未経験からインフラエンジニアへの転職を目指すmmと申します。<br>
2024年夏に基本情報技術者試験【新制度】に合格できたので勉強方法を記事に残します。<br>
もし不合格だった場合、科目Aを何度も勉強する自信がなかったので科目A免除修了試験を利用して受験しております（幸い一度で合格できました）。

# 記事の目的
この記事は効率的な受験勉強の方法や早く合格するためのテクニックを紹介するものではありません。<br>
私が受験にあたって意識した事や反省した事、受験を終えて感じた事などの記録となります。ご留意ください。<br>
また本記事では、基本情報技術者試験の概要は省略しております。

# 経歴
- 文系４大卒。IT業界未経験
- プログラミング経験はVBAのみ
- オンラインスクールでAWSコースを完走済み
- 所持資格は　AWS SAAのみ

# 受験の動機

何を勉強するにしても分からない用語が多く、資料を読み解くにも時間がかかっていたことから、一度体系的にIT業界の基本的な知識や考え方を学習したいと思い受験しました。

# 学習期間
※科目A免除修了試験を利用しました。<br>
科目A：一ヵ月弱（在職中に勉強：平日２〜３時間、休日５時間以上）<br>
科目B：一ヵ月弱（退職後に勉強：毎日５時間以上）

# 目標とした事
学習にあたって合格以外に目標とした事です😀

## 科目A

- 暗記ではなく理解をすることに努める
- 繰り返し過去問を解いて『知識』として定着させる
- 今まで全く知らなかった用語が『聞いた事がある！』というレベルになるだけでも進歩だと思いながら学習した

## 科目B

- 擬似言語を理解することでプログラミングに必要な考え方を鍛える
- 最終的に一文一文の意味を説明できるようする

# スコア
科目A：43/60点（科目A免除修了試験併用）<br>
科目B：670/1000点<br>
合格ギリギリのスコアでした…

# 使用した教材・サイト

## 科目A

- キタミ式イラストIT塾 基本情報技術者
- [基本情報技術者過去問道場](https://www.fe-siken.com/fekakomon.php)

## 科目B

- 情報処理教科書 出るとこだけ！基本情報技術者［科目B］
- 基本情報技術者【科目B】アルゴリズム×擬似言語トレーニングブック
- [公式の新制度サンプル問題、公開問題](https://www.ipa.go.jp/shiken/kubun/fe.html)

# 勉強方法

スタンダードな勉強方法ですが下記の通りです😅

## 科目A

1. 出題範囲の全体を大まかに把握するために、キタミ式の参考書を軽く一周する
2. 最近の問題を重視した方がいいと考え、過去問道場で過去５年分の範囲に絞って繰り返し学習する
3. 理解を深めるため、不正解の選択肢についても「不正解の理由」を答えられるように過去問道場や参考書の解説を読み込む

## 科目B

1. 擬似言語に慣れる事を優先し、『出るとこだけ！』の参考書を3周してトレース技術を鍛える
2. 現在の実力を確認するため、公式サンプル問題や公開問題を解く
3. こなす問題の量が少ないと感じ、追加で購入した『擬似言語トレーニングブック』を3周する
4. 問題の一文一文の意味を説明できるようにした

# 反省点

## 科目A

- 知らない用語の問題が数問あった。知識習得のためにも、もっと広い範囲の過去問を勉強すべきだった
- データベースへの理解が圧倒的に足りない。特に正規化が未だに理解できていない

## 科目B

- 緊張もあったかもしれないがアルゴリズム問題が全然分からなかった
- 今の自分のレベルで可能な範囲まで勉強したつもりだったがギリギリの合格点だったこともあり、ただの受験勉強になってしまっていたのかな、と反省
- 何か一つ言語を選び、基本のソート方法などを覚えてプログラミングの勉強をした方が有意義だったと思う

# よかった点

ハンズオンや別の資格学習においても、以前より格段に知っている単語や仕組みが増えました。<br>
もちろん、まだまだ知識不足ですが本試験で勉強した内容が確実に活きていると思います。<br>

# 終わりに

ここまで読んで頂きありがとうございました！<br>
まだまだ継続して学習は必要ですが、IT業界の基本的な知識や考え方を身に付ける、という目標の第一歩は達成できたと思います。<br>
また、科目Bについてはかなり勉強したつもりが、全然レベルが足りなかった事もあり、転職活動が終わったらプログラミングを勉強したいと思います。<br>
Web制作における画像設定パターン：背景画像とコンテンツ画像の使い分け

## アジェンダ
Web制作において、画像の設定パターンで一般的な方法があると考えており、それぞれのパターンは、画像の役割やレイアウトに応じて使い分けることが重要だと思います。以下に、背景画像やコンテンツとしての画像など、よく使われる設定パターンを簡単にまとめます。

## 1. **背景画像 (Background Image) の設定**
背景画像は、要素全体に装飾的に配置される画像です。CSSで設定することが一般的です。

### 基本的な背景画像の設定
```css:CSS
.element {
    background-image: url('path/to/image.jpg');
}
```

### 繰り返しなしの背景画像
デフォルトでは、背景画像は繰り返されます。繰り返しを防ぐためには `background-repeat` プロパティを使用します。
```css:CSS
.element {
    background-image: url('path/to/image.jpg');
    background-repeat: no-repeat;
}
```

### 背景画像のサイズ調整
背景画像のサイズを調整する場合は、`background-size` プロパティを使用します。
- `cover` は、要素全体を覆うように画像を拡大または縮小します。
- `contain` は、画像全体が表示されるように調整されますが、要素のどこかに余白が残る可能性があります。

```css:CSS
.element {
    background-image: url('path/to/image.jpg');
    background-repeat: no-repeat;
    background-size: cover;
}
```

### 位置の調整
背景画像の位置を調整するには `background-position` プロパティを使います。例えば、画像を中央に配置したい場合：
```css:CSS
.element {
    background-image: url('path/to/image.jpg');
    background-repeat: no-repeat;
    background-size: cover;
    background-position: center center;
}
```

## 2. **コンテンツとしての画像 (Content Image) の設定**
HTML内に直接埋め込まれる画像は、主に視覚的な情報を提供するために使われます。

### 基本的な画像表示
```html:HTML
<img src="path/to/image.jpg" alt="説明文">
```

### 画像の幅・高さの設定
CSSで画像のサイズを指定することができます。

CSSで指定する例：
```css:CSS
.hoge-img {
    width: 100%;
    height: auto;
}
```

※実務で使用することはないですが、HTML属性でも設定はできます。

```html
<img src="path/to/image.jpg" alt="説明文" width="300" height="200">
```

### レスポンシブ画像
レスポンシブなデザインをサポートするために、画像がブラウザの幅に応じてサイズを変えるようにします。

```css:CSS
img {
    max-width: 100%;
    height: auto;
}
```

## 3. **画像の装飾 (Styling Images)**
画像に対してスタイルを適用することで、視覚的な効果を追加できます。

### 画像に枠線を追加
```css:CSS
img {
    border: 2px solid #333;
}
```

### 画像の角を丸くする
```css:CSS
img {
    border-radius: 10px;
}
```

## 4. **レスポンシブ画像 (Responsive Images)**
異なるデバイスに合わせて最適な画像を表示するために、`<picture>` 要素を使うことができます。

```html:HTML
<picture>
  <source media="(max-width: 600px)" srcset="small.jpg">
  <source media="(min-width: 601px)" srcset="large.jpg">
  <img src="default.jpg" alt="レスポンシブ画像">
</picture>
```

詳しくは以下を参照。

https://qiita.com/kimascript/items/00c6f99df4a5d039c9b6

## 5. **アイコン画像 (Icon Images)**
Web上で使われるアイコンは、一般的にベクター画像（SVG）として提供されることが多いです。SVGは解像度に依存しないため、どのデバイスでも鮮明に表示されます。

### 外部SVGファイルの読み込み
```html:HTML
<img src="path/to/icon.svg" alt="アイコン">
```

※使ったことはないのですが、SVGを直接HTMLに埋め込むやり方もあります。
```html:HTML
<svg xmlns="http://www.w3.org/2000/svg">
    <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
</svg>
```

```css:CSS
.svg-icon {
    width: 100px;
    height: 100px;
}
```
Azure Piplinesでコンテナー リソースでAzure Container Registry(ACR)のイメージを参照する

# きっかけ
直接、Docker Hubからも取れるけど、Limitに引っ掛かる

```
/usr/bin/docker pull postgres:16-alpine
Error response from daemon: unauthorized: authentication required
```

# Dockerの個人アカウントでPersonal access token作る

![スクリーンショット 2024-09-25 10.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44351/e91202dd-b081-a0c2-cf3b-a2eed6ad72ee.png)

# Azure Container Registry(ACR)にインポート

```
az acr import --name $registry_name --source docker.io/library/postgres:16-alpine --image postgres:16-alpine --username $DOKER_USER_ID --password $Personal_access_token
```

- リソースグループ(resourceGroup)
- レジジストリ(registry): $registry_name
- リポジトリ(repository): postgres
- タグ: 16-alpine

![スクリーンショット 2024-09-25 10.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44351/541591d1-3cd6-3bbc-f4da-79cd979db133.png)

# Azure DevOpsでService connections作る
![スクリーンショット 2024-09-25 11.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44351/b8640196-5fa0-e3c3-cf5f-61465989d57a.png)

![スクリーンショット 2024-09-25 11.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44351/42ceedee-4190-0c61-77e1-354d34dfb1e7.png)


```
resources:
  containers:
    - container: 'postgres'
      type: ACR
      resourceGroup: $(resourceGroup)
      registry: $(registry)
      repository: postgres
      image: postgres:16-alpine
      ports:
        - 5432:5432
      env:
        POSTGRES_USER: postgres
        POSTGRES_HOST_AUTH_METHOD: trust
      azureSubscription: 'MyAcrServiceConnection'
      options: >-
        --health-cmd pg_isready
        --health-interval 10s
        --health-timeout 5s
        --health-retries 5
```

# 本家の更新を反映する
また後で
Androidで、aarを作成する

### Androidで、aarを作成する

Androidで、aarを作成する際にkotlinで記載する方法があまりなかったので記事にしたいと思います。
結論としては、下記の記載になります。

```gradle:build.gradle.kts

plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.kotlin.android)
    id("maven-publish")
}

publishing {
    publications {
        register<MavenPublication>("release") {
            groupId = "com.example"
            artifactId = "sample"
            version = "0.0.1"

            afterEvaluate {
                from(components["release"])
            }
        }
    }
    repositories {
        maven {
            url = uri("$rootDir/repository")
        }
    }
}

```

### ビルド

後は、下記でビルドするだけです。
ビルド後、プロジェクト直下にrepositoryディレクトリが作成されて、aarが作成されます。


```
gradle publishReleaseToRepository
```
Djangoでデバッグしたい

Djangoわからない
デバッグどうするの？
と思っていた頃、生き残りをかけた戦いの末、有用だった小技をまとめました。

# show_urls | プロジェクト内で定義されているURLパターンを一覧表示
標準のDjangoには含まれておらず、[django-extensions](https://django-extensions.readthedocs.io/en/latest/)パッケージを導入するか、カスタム管理コマンドとして実装する必要があるのですが、Djangoプロジェクト内で定義されているURLパターンを一覧表示できるのでめちゃくちゃ便利です。

ブロジェクトの処理の流れを追う時やAPIのエンドポイントを追うときに非常に役立ちます。

## django-extensionsパッケージをインストール
```terminal
$ pip install django-extensions
```

settings.pyにdjango-extensionsをインストール済みアプリとして追加します。

```python
INSTALLED_APPS = [
    # 他のアプリ
    'django_extensions',
]
```
インストールできたらターミナルで以下のようにshow_urlsコマンドを使って、DjangoプロジェクトのすべてのURLパターンを一覧表示できます。そのままだと本当に定義されている全てが出てきてしまってターミナルがすごいことになりますが、grepと一緒に使って自分の調べている処理に使っているurlモジュールを絞り込み検索するとすごく便利です。
```terminal
$ python manage.py show_urls | grep 検索キーワード
```

出力結果は以下のように出てきます。
```
^admin/                              django.contrib.admin.sites.admin_view
^$                                   myapp.views.home_page
^about/$                             myapp.views.about_page
...
```

# Django Debug Toolbar | Djangoテンプレートが調べられる
DjangoってHTMLの代わりにDjangoテンプレートを使用すると思うのですが、どのテンプレートが使われてるのかわからない時、このツールを使うと簡単に調べられます。

多分、基本的にはプロジェクトにすでに入っていると思いますが、入っていない時は[公式ドキュメント](https://django-debug-toolbar.readthedocs.io/en/latest/)を参考に設定しましょう。

入っているかどうかは`'debug_toolbar',`をエディタの全コード検索で検索してみてください。`settings.py` の`INSTALLED_APPS =`に入っていると思います。

他にも以下を調べられます。

- SQLクエリの詳細
ページのレンダリング中に実行されたすべてのSQLクエリが表示され、どのクエリがどれだけの時間を消費したかも確認できます。重複したクエリや非効率なクエリを見つけるのに役立ちます。

- リクエストとレスポンスの情報
HTTPリクエストやレスポンスのヘッダーや内容、セッション情報、GET/POSTデータなどが確認できます。
キャッシュのヒット/ミス情報:
キャッシュされたデータが適切にヒットしているかどうかの情報を確認できます。

- ミドルウェアの実行時間
どのミドルウェアがどれだけの時間を消費しているかが確認でき、パフォーマンス改善に役立ちます。

- 静的ファイルの詳細
静的ファイルに関連する情報や、適切に読み込まれているかの確認が可能です。

- Djangoテンプレートのレンダリング情報
使用されたテンプレートや、それぞれのテンプレートでどのデータが渡されたか、レンダリングにかかった時間などが表示されます。

# 本当にこのメソッドを使ってるのか？を調べる
## return を使う

```python
    def hoge_method(self, request):
      print("使われているのはhoge_methodでした")
      return  # 処理をここで終了する
```

HTTPメソッドを行っているviewメソッドだと、以下のように書くとエラーみたいな出力がされないで、いい感じにHttpResponseの引数に入れた文字列が画面に表示されます。

```python
    def hoge_method(self, request):
    print("使われているのはhoge_deleteでした")

    # 処理を中断し、デバッグメッセージを表示した後、ダミーのレスポンスを返す
    return HttpResponse("デバッグ用: この時点で処理が停止しました。")
```


## exit() を使う
さっきのexitは、エラーぽくログ出力されて怖いので、returnの方が気持ちも楽かもしれません。
exitを使って処理を止める為に、exit()を入れ込む
```python
    def hoge_method(self, request):
        exit()  # ここで処理が終了する
```
exit()を入れると以下のようにDjangoサーバーを動かしてるターミナルに以下のように出力がされます。
```terminal
"honntara.py", line 610, in member_delete
    exit()  # ここで処理が終了する
  File "_sitebuiltins.py", line 26, in __call__
    raise SystemExit(code)
SystemExit: None
```
【学習メモ】Railsチュートリアル

## 学習メモのありかた
・つまづいたところや用語で不明だった点のざっくりメモ
・解決したことのメモ

## Railsチュートリアルを進める目的を確認
・Railsでの開発の大まかな流れをイメージする
・MVCモデルについてざっくり理解する
~~・個人開発を自力で進められるようになるため
・開発の流れをつかむため
・Railsのドキュメントに出てくる用語を把握して実務の会話についていけるようにするため~~


## メモ
<dl>

<dt>シングルページアプリケーション（SPA）</dt>
<dd>WEBアプリケーション開発手法の一つ</dd>
<dd>必要な情報を一度に取得することで、表示速度が向上する</dd>

[今さら聞けないSPA（シングルページアプリケーション）とは](https://qiita.com/shinkai_/items/79e539b614ac52e48ca4)

<dt>Docker</dt>
<dd>簡単かつ安全に独立した複数のサーバーを動かせるもの</dd>

[Dockerとはどういったものなのか、めちゃくちゃ丁寧に説明してみる](https://qiita.com/SatoshiSobue/items/a612ebbb3a9242c09db5)

<dt>テスト駆動開発</dt>
<dd>テスト→プログラム書く→テストして動くか確認する開発のやり方</dd>
メモ　オブジェクト、インスタンス、インスタンス変数とか

# インスタンス変数
```
class Dog {
    String name; // インスタンス変数
    int age;     // インスタンス変数
    
    // コンストラクタでインスタンス変数に値を設定
    Dog(String name, int age) {
        //this.nameはインスタンス変数　thisは、現在のオブジェクトを指すキーワード
        //nameは引数として受け取ったname
        this.name = name; 
        this.age = age;
    }
}
```
インスタンス変数: 各インスタンスに属する変数で、オブジェクトの状態を表す。例: nameやage

# コンストラクタ

オブジェクトの初期化を行う
```
    // コンストラクタ
    Car(String color, String model) {
        this.color = color; // 引数で受け取った色をプロパティに設定
        this.model = model; // 引数で受け取ったモデルをプロパティに設定
    }
```
# インスタンス
```
//クラス
class Dog {
    String name;
    int age;

    Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog1 = new Dog("Buddy", 3); // dog1はDogクラスのインスタンス
        Dog dog2 = new Dog("Max", 5);    // dog2もDogクラスのインスタンス

        System.out.println(dog1.name); // 出力: Buddy
        System.out.println(dog2.name); // 出力: Max
    }
}

```
クラス：クラスは、データ（属性）とメソッド（機能）を定義するための構造です。例えば、Dogクラスは犬の特性（名前や年齢）や行動（吠える、走るなど）を定義します。

インスタンス：クラスから生成された具体的なオブジェクト

# オブジェクト
オブジェクトとは、さまざまな実体の総称
でも色々な概念があり、はっきり分からない

# Static変数
staticフィールドは、クラスのすべてのインスタンスで共有される変数
クラスをインスタンス化せずに変数にアクセスできる
インスタンスごとに異なる値を持たせる必要がない場合に使用
すべてのインスタンスで共有される値なので、グローバル変数のように使う

# Staticメゾット
newを使ってインスタンスを生成せずに呼び出すことができるメソッド
インスタンスを生成せずに呼び出したいメソッドがあるときに使用
これにより、メソッドを呼び出すときに毎回インスタンスを生成する必要がなくなるため、簡潔にコードを記述することができるようになる
```
public class MathUtils {
    // staticメソッド
    public static int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        int result = MathUtils.add(5, 10);
        System.out.println(result); // 出力: 15
    }
}

```
# Static（定数）
tatic finalを使うことで、変更不可能な定数を定義できる。
これにより、クラス全体で共通の定数を持つことができる

# インスタンス化
クラス という 「型」 から 「具体的な実体」 に生成されたものを インスタンス と呼びます。
そして、それらの一連の流れを インスタンス化 とよびます。

システム開発の現場では、インスタンスを生成することを「newする」とか言ったりするみたいです。

# staticメゾットとインスタンスメゾットの使い分け

## staticメソッドを使う時
インスタンスの生成前に実行すべきメソッド
インスタンスの状態に依存しない処理をさせるとき
ユーティリティメソッド(決まりきった処理、頻繁に呼び出される処理に使用する)
与えられた引数のみでメソッドの挙動が決まるとき
オーバーライドする予定がないとき
属性の参照・変更がなく、引数と戻り値のみで完結する場合
ファクトリメゾット

## インスタンスメゾットを使うとき
staticを使わない時


結論：大体はインスタンスメゾットをつかってOK
Gitでユーザー情報を設定する方法：グローバル設定とローカル設定の違い

## アジェンダ

Gitでは、コミットやプッシュの際にユーザー情報を設定する必要があります。ユーザー名やメールアドレスは、プロジェクトごとに個別に設定することもできますが、システム全体で統一することも可能です。ここでは、Gitのグローバル設定とローカル設定の方法、そしてその違いについて簡単にまとめます。

## 1. グローバル設定の方法

グローバル設定では、Git全体で一貫したユーザー情報を使用することができます。この設定は、すべてのリポジトリに適用され、設定を個別に行う必要がありません。グローバル設定は以下のコマンドを使用して行います。

### ユーザー名とメールアドレスのグローバル設定

まず、ユーザー名とメールアドレスを設定するために以下のコマンドを使用します。

```bash
git config --global user.name "Your Name"
git config --global user.email "your-email@example.com"
```

これにより、Gitのすべての操作でデフォルトのユーザー名とメールアドレスが使用されます。

### 設定の確認方法

設定が正しく行われたか確認するには、以下のコマンドを実行します。

```bash
git config --global --list
```

これにより、現在のグローバル設定が一覧表示されます。

## 2. リポジトリごとのユーザー設定（ローカル設定）

場合によっては、プロジェクトごとに異なるユーザー名やメールアドレスを設定したいことがあります。たとえば、個人プロジェクトと仕事のプロジェクトで異なるメールアドレスを使用したい場合です。このような場合は、リポジトリごとに設定を行います。

### ローカル設定のコマンド

リポジトリごとに設定を行うには、`--global`オプションを省略して、以下のコマンドを実行します。

```bash
git config user.name "Your Project-Specific Name"
git config user.email "your-project-specific-email@example.com"
```

これにより、現在のリポジトリ内でのみ指定されたユーザー情報が使用されます。ほかのリポジトリには影響しません。

### ローカル設定の確認方法

特定のリポジトリで設定された情報を確認するには、以下のコマンドを使用します。

```bash
git config --list
```

このコマンドを実行すると、そのリポジトリ内で適用されている設定を確認することができます。

## 3. グローバル設定とローカル設定の違い

### グローバル設定（`--global`）

- グローバル設定は、システム全体のGit操作に対して適用されます。
- 新しいリポジトリを作成した場合でも、自動的にこの設定が適用されるため、毎回設定する手間が省けます。
- グローバル設定を変更すると、すべてのリポジトリにその変更が反映されます。

### ローカル設定（リポジトリごとの設定）

- ローカル設定は、特定のリポジトリにのみ適用されます。
- プロジェクトごとに異なる設定を行いたい場合に便利です。例えば、個人のプロジェクトでは個人用のメールアドレス、会社のプロジェクトでは会社のメールアドレスを設定するなどの使い方ができます。
- ローカル設定は、そのリポジトリ内でグローバル設定よりも優先されます。

### 設定の優先順位

Gitでは、以下の順序で設定が適用されます。

1. **ローカル設定**（リポジトリ単位での設定）
2. **グローバル設定**（システム全体の設定）
3. **システム設定**（システムレベルの設定）

ローカル設定がある場合はそれが最優先され、もしローカル設定がなければグローバル設定が使用されます。グローバル設定がない場合は、システム設定が適用されます。

## 4. まとめ

Gitでユーザー名やメールアドレスを設定する方法には、グローバル設定とローカル設定があります。どちらを使うかは、プロジェクトや作業スタイルに応じて選ぶことができます。

- 一貫した設定をすべてのリポジトリに適用したい場合は、`--global`オプションを使用してグローバルに設定しましょう。
- プロジェクトごとに異なる設定が必要な場合は、リポジトリ内で個別に設定するローカル設定を使用します。
独立しようか検討してやめた話

# 現状
メガベンチャーでエンジニアとして勤務。年収750万円。
これまでの経歴については以下で記事にしてみたので読んでいただけるとモチベ上がります！

https://qiita.com/sake_tsuna/items/9831631c80adaa674d2b

# 独立を検討したきっかけ
この度結婚をすることになり、パートナーを金銭的に支えたい、余裕のある暮らしを送らせてあげたいと意いう思いから収入アップを本気で考え始めました。
そのうちの選択肢の一つとしてフリーランスとして独立するという道はどうかと思い至りました。
会社員として勤務する以上よほど出世しない限り年収は800~900万円で頭打ち（外資ITは狭き道・・・）、であればフリーランスになることでクライアントからの直収益を得られるため収入を上げやすいと思い至りました。

# 稼ぎたい金額
何千万円も稼ぎたいわけではないですが、今のフルリモートの環境も捨て自分のペースで仕事できる今の会社から離れるには1,500マ万円/年は欲しいところ...
さらにこれを短期的にではなくこの先何十年キープできるかという心配もあり、不安を解消すべくいざ調査開始。

# フリーランスエンジニアとして稼ぐ方法
Xやウェブでいろいろ調査してみた結果、フリーランスエンジニアの稼ぎ方としては以下の3通りがありそうでした。
- SESのような形で企業に常駐し、人月〇〇円のような形で稼ぐ方法
- 人月単価ではなく成果物ベースでシステムを納品することで稼ぐ方法
- 自分で作ったアプリやサービスの収益、広告で稼ぐ方法

３つ目の作ったアプリで稼ぐのはどう考えてもハードルが高いので、1, 2つの方法が現実的だと感じこの方向で負荷ぼってみることにしました。

# SESのような形で企業に常駐する方法
早速フリーランスエンジニアと企業をマッチングするレバテックのようなサービスにいくつか登録。
ここではエンジニア一人につきエージェントがつき、そのエージェントが案件の紹介、単価交渉、場合によっては確定申告までやってくれるところもあるとのこと。
 
 ### メリット
メリットとしてば単価交渉を肩代わりしてくれる点、個人で営業かけなくても案件を継続して紹介してくれる点。また基本的には案件過多でエンジニアの地位が高いため、よほど実力がないという問題がなければ案件がなくなるということはなさそうだった。

### デメリット
デメリットとしては毎月手数料を抜かれる点。例えば人月100万円の案件でオファーがあればそのうちの何割か(20%くらい)を抜かれ、エンジニアの手元に入るのは80万円というスキーム。ただしエンジニアには80万円としか見えないので手数料が抜かれた後の単価だけ意識しておけばいいというイメージ。

### 結論
手数料抜かれるのは構わないので、論点となってくるのはいくらくらいの案件を獲得できそうか、という点だ。
結論としては、ボリュームゾーンとしては人月50~70万円くらいが多くを占めており、エージェント曰く自分の経験であれば80~90万円くらいの案件は問題なく取れそうとのことだった。
上記でも述べた、目標の年収1500万円には到底及ばなそうだということを悟りこの方法は諦めることにする。


# 成果物ベースでシステムを納品
これは自分を時給で売るのではなく、成果物を納品することで報酬を得るパターン。
有名なサービスで言うとラーンサーズやクラウドワークスだ。
アプリをゼロイチで開発し、顧客に納品することでシステムの規模に応じてお金を得られる。

### メリット
システムの規模が大きければ入る金額も大きいので、一回でキャッシュがドカンと増えることもある。
また案件が増えれば、メンバーを雇い受注した案件を外注することでまたさらに案件を受けられるため、収入の上限はなく夢がある働き方と言える。

### デメリット
基本的には案件を能動的にとりにいく必要があり、方法としてはランサーズ等で募集がかかっている案件に応募する、知り合いがいれば案件を降ってもらう、ゼロから営業かけるといった感じだ。また基本的には納品したら終了なので継続的に案件を取り続ける必要がある。

### 結論
営業経験もなくIT界隈の人脈も多くないと自負しているため断念。

# 会社員 x 副業
現職では年収750万円、また以前副業していたこともあるがその時は時給5,000円程度で月40時間ほど勤務していたので年収に直すと240万円。
副業を再開すれば1000万円に届きそうだということに気づいた。
また、会社員でいれば年収が下がることはほぼないので5年後とかには1,000万円に届くかも、かつ転職すればさらに効率よく年収も上げられるはず。
またメガベンチャーでは業界のデファクトスタンダードを学べる上優秀な同僚やメンバーからのフィードバックを日々受けることができる。さらに新技術の導入も最前線で見ていられるため、中長期的に見てエンジニアとしての成長観点からも会社員でいることのメリットはかなり大きいと感じた。

# 総括
色々な方向性で自分の将来のキャリアを考えてみたが会社員 x 副業がノーリスクかつ最もコスパがいいことがわかった。1,500万円はかなり厳しそうだが1,000万円程度であれば今すぐにでも達成できそうだと言うことも明らかになった
#62　【C#】Win32APIのDllImportを簡略化した

C#でWin32APIを利用する際、一々DllImportを記述するのが非常に面倒だったので、手軽に利用できる方法を調べました。

## 没案1: PInvoke.net Visual Studio Extensionを使用する

[PInvoke.net Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=MindfireTechnology.PInvokeExtension) は、DllImportの入力を補助してくれるVisualStudioの拡張機能のようです。残念ながら、私が使用している Visual Studio 2022 はサポートしていないらしく、Visual Studio上のマーケットプレイスでヒットせず、直接ダウンロードしてのインストールも失敗しました。
試していませんが、[こちら](https://devblogs.microsoft.com/visualstudio/how-to-upgrade-extensions-to-support-visual-studio-2019/)を参考にサポートバージョンを無理やり書き換えればインストールできるかもしれません。

## 没案2: PInvoke.netからコピペする

[PInvoke.net](http://www.pinvoke.net/index.aspx)は、Win32APIのDllImport文がまとまっているサイトのようです。こちらのページで該当のWin32APIを検索し、import文をコピペするよう促している記事がいくつかありました。
ただし、筆者が確認した2024年3月時点では404エラーが出てしまいページ自体開けませんでした。

## 結論: CsWin32を使う

Microsft が提供する [CsWin32](https://github.com/microsoft/CsWin32) というパッケージを使用して、呼び出したい Win32APIをプロジェクト内に生成することができました。

### 手順1

VisualStudio の ツール > Nugetパッケージマネージャー > ソリューションのNugetパッケージの管理 から CsWin32 をインストールする

※プレリリースを含める にチェックを入れないと見つかりません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/22d8077e-9767-0505-29aa-7e193a22f7bf.png)


### 手順2

NativeMethods.txt という名前のテキストファイルを作成し、使用したいAPI名を記述する

```NativeMethods.txt
WH_KEYBOARD_LL
SetWindowsHookEx
GetModuleHandle
```

### 手順3

ソリューションをビルドする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/eeb333b2-6687-4e50-40da-b0e12f22b7a7.png)


```plaintext
========== ビルド: 成功 1、失敗 0、最新の状態 0、スキップ 0 ==========
```
ビルド成功したら、完了です。
あとは、主に PInvoke.*** の形で使用したいAPIを呼び出せるはずです。
APIの呼び出し箇所から、定義へのジャンプもできるようになります。

### 修正前後比較

参考までに、修正前後のコードの一部を記載します。
NativeMethods.txt への追記が必要とはいえ、非常に手間が省けたのが分かるかと思います。
```cs:修正前
protected const int WH_KEYBOARD_LL = 0x000D;

[DllImport("user32.dll",  CharSet  =  CharSet.Auto,  SetLastError  =  true)]
private  static  extern IntPtr SetWindowsHookEx(int  idHook,  KeyboardProc lpfn,  IntPtr hMod,  uint dwThreadId);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);

SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
```

```cs修正後
PInvoke.SetWindowsHookEx(WINDOWS_HOOK_ID.WH_KEYBOARD_LL, proc, PInvoke.GetModuleHandle(curModule.ModuleName), 0);
```

### 注意点

- 自動生成されたコードの要求バージョンに応じて、C#のバージョンアップが必要になる可能性があります。
    - C#バージョン不足によるビルドエラーが表示された場合、.csprojファイルの\<PropertyGroup>内        に、C#バージョンを追記
        ```
        <LangVersion>9.0</LangVersio
        ```

- 元々Dllimportを使用していた箇所は型の見直しが必要になる可能性があります。
    - IntPtr型にしてたところをenumにする等。

以上です。
最後まで読んでいただきありがとうございます。

## 参考

- [# C#でグローバルキーフックをする方法](https://lets-csharp.com/keyboard-hook/)
- [# [C#] CsWin32でWin32APIのプラットフォーム呼び出し(P/Invoke)コードを自動生成](https://qiita.com/radian-jp/items/a4509f9a44101fb2f30e)
- [CsWin32 を別プロジェクトに分離する](https://zenn.dev/shinta0806/articles/cswin32-separation)
ExcelのシートでアクティブセルをA1にしておくのがマナーって話を聞いたので

# セルはA1をアクティブにするのがマナーらしい
以前Twitterで流れてきた話（ぼくは気にしない派）

# 対策
↓をThisWorkBookのBeforeSaveに入れておけば保存するときに全部A1なる。

```vb
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim objSh As Worksheet
    Dim objShORG As Worksheet
    
    Set objShORG = ActiveSheet '最初に開いていたシート
    
    For Each objSh In ThisWorkbook.Worksheets
        objSh.Select
        Application.Goto Reference:=Range("A1"), Scroll:=True
    Next
    
    objShORG.Select '最初に開いていたシートを表示する
End Sub
```
Databricks AI/BI Genieのベンチマーク機能

Genieの精度をベンチマークできる機能がパブリックプレビューで公開されました。

https://docs.databricks.com/ja/genie/benchmarks.html

想定質問を事前に準備しておき、期待した回答をしているのかどうかを評価することができます。上のマニュアルではこの想定質問を**ベンチマーク質問**と呼んでいます。また、質問に対する回答をSQLで定義することができます。これを**SQL回答**と呼びます。SQL回答を設定しておくことで、回答の良し悪しを自動で評価することができますので推奨となっています。

早速試してみます。私がよく使っているCOVID-19の感染者数データを使います。Genieスペースにアクセスすると、画面左に**Benchmarks**アイコンが追加されています。
![Screenshot 2024-09-25 at 9.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/62470857-d517-d5f7-2c57-0b0d9436e334.png)

**評価**タブと**質問**タブがあります。**質問**タブをクリックします。
![Screenshot 2024-09-25 at 10.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/98c33d1d-ea63-00c7-e9c7-773f6d003079.png)

こちらでベンチマーク質問を追加します。**ベンチマークを追加**をクリックします。
![Screenshot 2024-09-25 at 10.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c15dd167-f709-6e17-a0fe-4a3c50730bdf.png)

ここで、質問とSQL回答(オプション)を指定します。
![Screenshot 2024-09-25 at 10.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/45a8c971-f0ca-7fec-e98b-516760500b55.png)

以下のように質問と回答をセットで追加していきます。**プレビュー**でSQLを実行することも可能です。
![Screenshot 2024-09-25 at 10.04.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/adf85910-13c7-c28d-c1a1-22d68c4982f4.png)
![Screenshot 2024-09-25 at 10.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e049de3f-c170-7e2f-d75b-23decb80f08c.png)

質問を追加したら、右上の**ベンチマークを実行**をクリックします。
![Screenshot 2024-09-25 at 10.05.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1e836d0c-519a-f1a4-3fd0-8bc6c51a874e.png)

ベンチマークが実行されます。
![Screenshot 2024-09-25 at 10.06.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/db1d790f-05c9-3102-cfb7-dee106195c18.png)

回答が設定されていない質問に関しては、手動でのレビューが必要です。
![Screenshot 2024-09-25 at 10.06.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4aca654e-5134-3b3a-1293-bed927dc6c13.png)

回答が設定されている場合は自動で評価されます。
![Screenshot 2024-09-25 at 10.07.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3ebf7a51-5c4a-0c6f-0f36-a1c530eeb594.png)

質問を変えながらベンチマークを繰り返すことも可能です。
![Screenshot 2024-09-25 at 10.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/db0fc906-167a-db12-0400-160b8d962062.png)

また、回答に対するフィードバックを踏まえて、ベンチマーク質問を見直すことも有益だと思います。
![Screenshot 2024-09-25 at 10.09.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/70efa1ac-a185-6722-eac8-de276dd576be.png)

これによって、Genieの精度を維持・改善することができます。是非ご活用ください！

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
MySQLアップデートによるUNIONとINTO OUTFILE S3で生じたエラー解決

# 前提：SQLで行いたいこと
AWSのAurora MySQLを利用。Aurora2から3へアップデートの調査中に発生
SQLで実現したかったことは、
項目名にデータが並ぶようにしつつ、並び替えて、S3のtestバケットに以下のtestを出力

CSVの項目名1,CSVの項目名2,
データA1,データA2,
データB1,データB2,
データC1,データC2,
以下略

# SQL文A
```sql
SELECT  "CSVの項目名1","CSVの項目名2" UNION ALL (
        SELECT `テーブル名`.`カラム1`,`テーブル名`.`カラム2`
        FROM `テーブル名`
        WHERE `テーブル名`.`テストID` = サンプルID
        GROUP BY `テーブル名`.`カラム1`
        ORDER BY `テーブル名`.`ID` ASC
        LIMIT 1000
        OFFSET 0
        INTO OUTFILE S3
        's3://test/test'
);
```

# 問題１：SQL構文エラー
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTO OUTFILE S3

INTO OUTFILE S3　に関して構文エラーが発生

### 問題１を解決したSQL文B
:::note info
UNION ALLにかかっている ")" の位置を変更
:::
```sql
SELECT  "CSVの項目名1","CSVの項目名2" UNION ALL (
        SELECT `テーブル名`.`カラム1`,`テーブル名`.`カラム2`
        FROM `テーブル名`
        WHERE `テーブル名`.`テストID` = サンプルID
        GROUP BY `テーブル名`.`カラム1`
        ORDER BY `テーブル名`.`ID` ASC
        LIMIT 1000
        OFFSET 0
)
        INTO OUTFILE S3
        's3://test/test'
;
```
:::note warn
MySQL8では通るが、MySQL5ではエラー発生
:::
# 問題２：特定列でデータの値が同一になる

理想
CSVの項目名1,CSVの項目名2,
データA1,データA2,
データB1,データB2,
データC1,データC2,

問題
CSVの項目名1,CSVの項目名2,
データA1,データA2,
データB1,データA2,
データC1,データA2,

#### 最終的な解決としたSQL文C
:::note info
対処としてUNION ALLからUNIONに変更
:::
```sql
SELECT  "CSVの項目名1","CSVの項目名2" UNION (
        SELECT `テーブル名`.`カラム1`,`テーブル名`.`カラム2`
        FROM `テーブル名`
        WHERE `テーブル名`.`テストID` = サンプルID
        GROUP BY `テーブル名`.`カラム1`
        ORDER BY `テーブル名`.`ID` ASC
        LIMIT 1000
        OFFSET 0
)
        INTO OUTFILE S3
        's3://test/test'
;
```
:::note warn
MySQL8では通るが、MySQL5ではエラー発生
:::

# 何が問題となっていたか
* 問題１
    * https://dev.mysql.com/doc/refman/8.0/ja/union.html
        * 最後の SELECT ステートメントのみが INTO 句を使用できます。 ただし、UNION の結果全体が INTO 出力先に書き込まれます。
        * クエリー式のカッコで囲まれた後続ブロックでは、INTO を (FROM に対する相対位置に関係なく) 使用すると警告が生成されます。 
        例:
        ```
        ... UNION (SELECT * INTO OUTFILE 'file_name' FROM table_name);
        ```

    * SQL文Aだと()内の内容をファイル出力後にUNION ALLで接続してしまう構文エラーが発生したと考えられます。

* 問題２
    * 原因ははっきりとしないです。
    * 動作として問題に関係があったのがUNIONとLIMIT,OFFSETでした。
    ``` 
    SELECT `テーブル名`.`カラム1`,`テーブル名`.`カラム2`
        FROM `テーブル名`
        WHERE `テーブル名`.`テストID` = サンプルID
        GROUP BY `テーブル名`.`カラム1`
        ORDER BY `テーブル名`.`ID` ASC
        LIMIT 1000
        OFFSET 0 
    ```
    は問題なく動作するものの、UNION ALLとして結合を行うと問題が発生しました。
    UNIONとUNION ALLの処理の違いとしては結合の際に前者は重複削除・後者は重複を許します。
    


# 参考資料
問題解決の参考にしたサイト

https://dev.mysql.com/doc/refman/8.0/ja/union.html#union-order-by-limit

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.SaveIntoS3.html　

https://stackoverflow.com/questions/5941809/include-headers-when-using-select-into-outfile

実際にSQLを実施する上で参考にしたサイト

https://dev.classmethod.jp/articles/aurora-mysql-integrate-with-s3/
[Git] cherry-pickを使用したブランチ操作

# 概要
`Git`の操作で`cherry-pick`を使って`PR`（Pull Request）を作成した為、その手順を備忘録としてまとめました。

# cherry-pickの概要
## 機能
- 主(軸)となるブランチに対して、特定のコミットのみを適用する際に使用するコマンド
- 複数のブランチで同じ内容が含まれる場合、コンフリクトの可能性がある為、注意が必要

## cherry-pickの視覚的な例
1．**初期状態**
- `main`ブランチと`develop`ブランチがそれぞれ異なるコミット履歴を持っている

![init.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/4d032642-1a0b-817c-36e0-50d6719956b4.png)

2．**cherry-pickのプロセス**
- `develop`ブランチにあるコミット`C`と`D`を`cherry-pick`し、`main`ブランチに反映させる
- これにより、`main`ブランチが最新の状態となる

![cherry-pick.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/972d4068-47ae-3e48-f06f-becea774a4a4.png)

# 事前準備
- `git log`を実行し、cherry-pickを行いたいコミットのハッシュ（コミットID）を確認・リストアップしておく

```sh
git log
# 出力結果

commit 2acd***************************3871 # ← この部分がコミットハッシュ
Author: test 1234 <62537601+test-1234@users.noreply.github.com>
Date:   Wed Jan 〇〇 **:**:** 20** +0900
    feat: 〇〇を修正 (#1)
```

# 手順
:::note alert
注意
※ 作業は、ローカル環境のターミナル(CLI)で行う
:::

## ブランチ切り替えと最新情報の取得
- mainブランチに切り替える
```sh
git checkout main

```

- リモートリポジトリから最新の情報を取得する
```sh
git pull origin main
```

- `main`ブランチから`cherry-pick`用のブランチを作成する
```sh
git checkout -b BranchName # ブランチ名は任意

# 入力例
git checkout -b main_merge_年月日 #（年月日に、20510101を記載する）
```

## cherry-pick作業
- 事前に控えておいたコミットのハッシュ(コミット Id)を使用して、mainブランチに取り込む
```sh
git cherry-pick [コミットハッシュ]

# 入力例
git cherry-pick 2acd***************************3871
```

- `git log`を使って、適用したいコミットのみが含まれているかを確認する
```sh
git log
```

- `cherry-pick`で取り込んだブランチをリモートリポジトリに`push`する
```sh
git push origin BRAHCHNAME # ブランチ名は任意

# 入力例　
git push origin　main_merge_年月日 #（年月日に、20510101を記載する）
```
:::note alert
注意
リモートリポジトリに`push`する際、`BranchName`に本番環境のブランチ名（例: `main`）を記載しない 
::: 

# PR(Pull Request)作成
`GitHub`にて、`master <- BranchName`の構造で`PR`を作成する 

![prの画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/19b46652-f393-232a-c6b8-2cbefa2aca84.png)


# 参考資料
- [[Git] git-cherry-pick - Apply the changes introduced by some existing commits](https://git-scm.com/docs/git-cherry-pick)
- [cherry-pickで解決🍒](https://qiita.com/okmtz/items/62aa5a25f75b1754a861)

# まとめ
チーム開発の際、必ず必要な`Git`操作だと考えています。今回の改修で経験出来て良かったと感じております。`Git`操作に関しては、今後もより精進したいと思います
VOICEPEAKを使ってボイチャで発言する

# はじめに
- 同位体お話会スペースの反響が良かったので設定方法を共有する
- 以下の方法では、自分の声とvoicepeakの声を同時に再生することはできない
    - そのうち対応方法を考えるのでしばしお待ちを...


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/e5f4951b-0f0d-28fe-96df-154ee6cc522a.png)

# 仕組み
![スクリーンショット 2024-09-25 8.21.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/02b6665d-4ac9-eeb5-a524-cf4a7c9dd6c4.png)
- voicepeakの音のみがボイスチャットに流れる
- voicepeakの音を直接マイク入力として扱うことができないため仮想オーディオを通す
- 生成した音声を確認するため、ボイスチャットを通らない経路でvoicepeakを聞く

# 環境構築
## Windows版
### インストール
1. 仮想オーディオ[VB-CABLE](https://vb-audio.com/Cable/)のWindows版をダウンロード
    - ウイルス対策ソフトに拒否されてしまうことがあるので注意
1. ZIPファイルを解凍
1. VBCABLE_Setup_x64.exeを開いてインストール


### 設定
1. voicepeakの環境設定で出力機器をCABLE Inputに変更
![2024-09-25_09h22_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/9671ad53-eda8-ae1f-a70b-4b2cf3f5f4a9.png)

1. コントロールパネル>ハードウェアとサウンド>オーディオデバイスの管理>録音タブ>CABLE Outputを選択>プロパティから聴くタブを選択>このデバイスを聴くにチェックを入れる 
![2024-09-25_09h18_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/c87a1d86-dbf6-7b43-571d-8bc8494df538.png)
![2024-09-25_09h18_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/d99ef307-a4e9-6226-fc09-477a763b23a4.png)

## Mac版
1. 仮想オーディオ[VB-CABLE](https://vb-audio.com/Cable/)のMac版をダウンロード
    - ウイルス対策ソフトに拒否されてしまうことがあるので注意

1. ダウンロードしたフォルダからVBCable_MACDriver_Pacl108.dmgを開いてインストール（107でも良い）


### 設定
1. voicepeakの環境設定で出力機器をVB-Cableに変更
![スクリーンショット 2024-09-25 9.24.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/97de119b-e894-69c0-3c16-a3eb19f9e478.png)
1. Mac標準ソフト、Audio MIDI設定からVB-CableのThruにチェックを入れる
![スクリーンショット 2024-09-25 9.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/583d09e2-b330-6064-6f69-8e363731da6b.png)

ただしThruは各自の環境によってチェックを入れられないことがあるので、その場合は次のソフトを使用する
    2. AppStoreから[LadioCast](https://apps.apple.com/jp/app/ladiocast/id411213048?mt=12)をインストール
    3. LadioCastを起動し入力をVB-Cableに、出力先を再生するスピーカーに設定 
    ![スクリーンショット 2024-09-25 9.35.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/66b9a1dd-13a2-4285-5acc-1c69c7785b87.png)

# 使い方
- ボイスチャットソフトのマイク入力をWindowsならCABLE Output、MacならVB-Cableに設定
    - discordなら設定の「音声・ビデオ」から
    - twitterスペースならブラウザの設定から
        - chromeの場合は設定からマイクを検索したほうが早い
        ![スクリーンショット 2024-09-25 9.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/08fd5717-f16f-40c3-58b6-21a6318a6d8c.png)
![スクリーンショット 2024-09-25 9.42.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/037650ec-6ced-28a2-0e6f-1a5798e84142.png)
![スクリーンショット 2024-09-25 9.43.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/d80955b9-830a-c729-23c1-3145e7994894.png)

- 喋らせたい文章打ち込んで再生ボタンを押す
![スクリーンショット 2024-09-25 9.45.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/695510/cc325ce9-32e5-7c40-840d-a17b93ad94a3.png)
Google がサポートする Python ランタイムを使用して Cloud Run にソースからアプリケーションをデプロイする方法

Google Cloud の利用下では、Dockerfile を使って FROM 句で DockerHub から Python 付きのイメージを pull するよう記述してデプロイする方式では Python に関する問題についてサポートを受けられないことがわかりました。

サポートを受けるためには Google のサポートしているランタイムを使用する必要があり...
https://cloud.google.com/run/docs/configuring/services/runtime-base-images?hl=ja

リファレンスのつなぎ合わせとサポートへの問い合わせとでやっとたどり着いた。
上から下まで一連で書かれているページがないので書き残しておく。

# 前提条件
・デプロイ直後のトラフィックが 0% になるようにし、デプロイ直後に新旧が入れ替わらないように配慮
・Python3.11 で固定する
・使用する Google の [Builder](https://cloud.google.com/docs/buildpacks/builders?hl=ja) を google-22 で固定する

# 1 Python のバージョン固定

ソースディレクトリ直下に .python-version という名前でファイルを置く
中身は以下

```
3.11
```

# 2 gunicorn の起動設定

ソースディレクトリ直下に Procfile という名前でファイルを置く
以下は中身の例

```
web: gunicorn --bind :$PORT --workers 2 --timeout 300 main:app
```

# 3 ビルダーの固定

ソースディレクトリ直下に project.toml という名前でファイルを置く
中身は以下

```
[build]
builder = "gcr.io/buildpacks/builder:google-22"
```

# 4 ソースからのデプロイ実行

ここまでで src 配下が以下のようになっている
```
/src/.python-version
/src/Procfile
/src/api/[main から使用されるプログラム群]
/src/main.py
/src/project.toml
/src/requierements.txt (書いておくと自動ビルド時に pip install される)
```
コマンドオプションの詳細はシステム要件によって異なると思うので
[リファレンス](https://cloud.google.com/sdk/gcloud/reference/run/deploy) を参考に

**ソースからデプロイを実行する**
```
gcloud run deploy [サービス名] \\
--source . \\
--no-traffic \\ ★ 2 度目以降にデプロイする場合、traffic 0% とするために付与
--cpu-throttling \\ CPU を使っているときだけ課金
--execution-environment gen1 \\ 小さいアプリなら第一世代 [世代について](https://cloud.google.com/run/docs/about-execution-environments?hl=ja)
--region [リージョン名] \\ ex) asia-northeast1
--ingress internal \\ ★ 内部からコールされるだけなら外部からのアクセスは遮断でよい
--no-allow-unauthenticated \\ サービスアカウントによるアクセスに限る。 allow- にすると認証しない
--service-account xxx \\
--min-instances 0 \\ ★リクエストのない時間帯はインスタンスが 0 になり課金されなくなる
--max-instances 1 \\ ★ 指定しないと無尽蔵に増えるので設定必須
--cpu XX \\
--memory XXG \\
--revision-suffix \\ XXXXXX
--tag \\ XXXXX
--timeout \\ nginx のタイムアウト
```

**実行すると**
Cloud Build により自動ビルドが行われ、Artifact Registory に自動でコンテナイメージが登録され、そのイメージを使ってアプリケーションのサービスがセットアップされる。ログは Cloud Build のページや Cloud logging の Buider ログで確認できる。

# 5 Artifact Registry に上がったコンテナイメージにデプロイしたものと同じタグを付与しておく

これをやっておかないとデプロイするほどどれがどのバージョンのイメージかわからなくなっていく
```
gcloud artifacts docker tags add \\
　[イメージ名(パス+サービス名]:latest \\
　[イメージ名(パス+サービス名]:[revision-suffix で指定したものと同じバージョン]

 　ex) asia-northeast1-docker.pkg.dev/[myproject]/cloud-run-source-deploy/[myapp]
```
# 6 正常にデプロイされていることが確認できたら
Cloud Run ページの [リビジョン] タブでトラフィックを切り替えれば OK

# 参考
Cloud Run に提供されているランタイムのサポート期限
https://cloud.google.com/run/docs/runtime-support?hl=ja