OmniAICreator/Qiita-1.07M huggingface dataset:
【VsCode】知っていると役に立つかもしれないショートカット、コマンド

# はじめに

VSCodeで個人的に便利だと思っているショートカットとコマンドを紹介します。
知らなくても困らないけど、知っていると役にたつかもしれないくらいのやつです。

いろんな記事で紹介され尽くしている内容ですが、参考になれば幸いです。

ショートカットキーはMac版なので、Windowsの方は「Command」→「Ctrl」などに適宜読み替えてくさい。

# 1. キャメルケース、スネークケースなどに変換する

文字の区切りを大文字で表現するキャメルケースやアンダーバー(_)で表現するスネークケースに変換することができます。

![case_f.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600358/6e7e051d-625b-2d34-d039-a5e0932cf38c.gif)



以下の5種類が用意されています。
コマンド入力のパレットは`Command`+`Shift`+`P`で出せます。

|コマンド|動作|
|-|-|
|Transform to Camel Case|キャメルケースに変換 e.g., thisIsSomeVariable|
|Transform to Kebab Case|ケバブケースに変換　e.g.,this-is-some-variable|
|Transform to Pascal Case|パスカルケースに変換　e.g.,ThisIsSomeVariable|
|Transform to Snake Case|スネークケースに変換 e.g.,this_is_some_variable|
|Transform to Title Case|タイトルケースに変換　e.g.,This Is Some Variable|

キャメル、ケバブ、スネークは区切り文字がそれぞれ大文字、「-」、「_」です。
パスカルケースはキャメルケースの先頭が大文字になったもの、タイトルケースは単語が全て大文字始まりになったものです。

# 2. 大文字、小文字に変換をする

以下のように選択範囲のアルファベットを大文字/小文字に変換することができます。

![snake.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600358/594c74e9-39af-7fa5-95b4-98e23a60a464.gif)


|コマンド|動作|
|-|-|
|Transform to Lowercase|全て小文字に変換|
|Transform to Uppercase|全て大文字に変換|

もちろん、2.で紹介したコマンドと組み合わせることもできます。
`sameValue`を`SAME_VALUE`という定数のような形式にしたい場合には、`Transform to Snake Case`の後に`Transform to Uppercase`を実行すると変換できます。

`sameValue` -> `same_value` -> `SAME_VALUE`


# 3. インデント単位で開閉する

指定したインデントで閉じることができるショートカットです。

![画面収録 2024-07-06 20.53.50.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600358/68d49b82-a126-d3cf-ef74-0e43e6754c46.gif)


|キー|動作|
|-|-|
|Command+K Command+1|インデントレベル1で閉じる|
|Command+K Command+2|インデントレベル2で閉じる|
|...|...|
|Command+K Command+7|インデントレベル7で閉じる|
|Command+K Command+J|インデントを全て開く|

インデントレベルは7まで対応しています。
長いファイルやテストファイルなどで活躍します。

# 4. 特定の単語が含まれている行を全削除する
以下のように「index」が出現する行を全て選択し、行を削除することができます。

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600358/725debee-9f99-c58f-4186-0ca9e626c42c.gif)

使用しているコマンドは以下の二つです。
|キー|動作|
|-|-|
|Command+Shift+L|現在の選択のすべての出現箇所を選択する|
|Command+Shift+K|行を削除|

# 5. 複数行をいい感じに編集する

`Command+D`で単語選択してカーソルを増やした後に`Option+矢印キー`や`Coomand+矢印キー`でうまく移動して複数行を編集するテクニックです。いい感じに編集できると快感です。

![5_2.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600358/0691a0f3-e5d3-b163-6931-a3ef911b6bb7.gif)

複数行選択に活用できそうなコマンドは以下の通りです。

|キー|動作|
|-|-|
|Command+D|単語を一つずつ選択|
|Command+Shift+L|現在の選択のすべての出現箇所を選択する|
|Command+Option+矢印キー|現在の選択のすべての出現箇所を選択する|
|Option+矢印キー|単語単位で移動|
|Option+Delete|単語単位で削除|
|Coomand+矢印キー|先頭/最後へ移動|
|Coomand+Delete|カーソルから前を削除|

# まとめ

個人的に便利だと思っているショートカット、コマンドについて紹介しました。
参考になれば幸いです。
なろう小説全編をテキストで保存するpython

暇だったのでなろう小説全編をテキストで保存するnarou_downloader.pyというコードを書きました。

- 小説の目次のURLを指定すると、全編をダウンロードするbashを出力する
```shell-session
$ python narou_downloader.py https://ncode.syosetu.com/n7850ds
echo 'https://ncode.syosetu.com/n7850ds/1/' '第1話　石像に祈る少女' >&2
python narou_downloader.py https://ncode.syosetu.com/n7850ds/1/
sleep 1
echo 'https://ncode.syosetu.com/n7850ds/2/' '第2話　塔の迷宮' >&2
python narou_downloader.py https://ncode.syosetu.com/n7850ds/2/
sleep 1
echo 'https://ncode.syosetu.com/n7850ds/3/' '第3話　奇妙な面接' >&2
python narou_downloader.py https://ncode.syosetu.com/n7850ds/3/
sleep 1
echo 'https://ncode.syosetu.com/n7850ds/4/' '第4話　猛獣との戦い' >&2
python narou_downloader.py https://ncode.syosetu.com/n7850ds/4/
sleep 1
echo 'https://ncode.syosetu.com/n7850ds/5/' '第5話　ルームメイト' >&2
python narou_downloader.py https://ncode.syosetu.com/n7850ds/5/
sleep 1
echo 'https://ncode.syosetu.com/n7850ds/6/' '第6話　見習い魔導師の街' >&2
python narou_downloader.py https://ncode.syosetu.com/n7850ds/6/
sleep 1
（中略）
```

- 小説の一話のURLを指定すると、一話の文章を出力する。タイトル部分はマークダウンの小見出しで表している

```shell-session
$ python narou_downloader.py https://ncode.syosetu.com/n7850ds/141
## 第141話　悪の誘い

フローラの裁判が行われた。

彼女の裁判はアルフルド中で話題の的となり、貧民から富裕な者まで住民という住民が法廷に詰め掛けて彼女にどのような判決が下るのか確かめようとした。
(中略)
```

- パイプでつなげると全編をダウンロードする。標準エラーから進捗を確認できる

```shell-session
$ python narou_downloader.py https://ncode.syosetu.com/n7850ds | bash > NOVEL.md
https://ncode.syosetu.com/n7850ds/1/ 第1話　石像に祈る少女
https://ncode.syosetu.com/n7850ds/2/ 第2話　塔の迷宮
https://ncode.syosetu.com/n7850ds/3/ 第3話　奇妙な面接
https://ncode.syosetu.com/n7850ds/4/ 第4話　猛獣との戦い
https://ncode.syosetu.com/n7850ds/5/ 第5話　ルームメイト
https://ncode.syosetu.com/n7850ds/6/ 第6話　見習い魔導師の街
https://ncode.syosetu.com/n7850ds/7/ 第7話　魔導師協会
https://ncode.syosetu.com/n7850ds/8/ 第8話　魔法の工場
(中略)
```

- 全編の小説を確認

```shell-session
$ cat NOVEL.md
## 第1話　石像に祈る少女

魔導師の街、グィンガルドは今日も大勢の人で賑わっていた。

港へと伸びる大通りには様々な職業や身分の人々が行き交い、その広い道路を溢れんばかりに埋め尽くしている。
(中略)
```


- narou_downloader.py 
    - python v3.12.3で確認
    - 標準ライブラリだけで動作
    - 100話以上ある小説については目次が1ページに収まらず2ページ目以降をダウンロードできない
        - 2ページ目以降の目次urlを指定しシェルスクリプトに追記すればいける

https://gist.github.com/lzpel/9191f60954123b30664c252bd377f931

## Reference

- 瀬戸夏樹　塔の魔導師〜底辺魔導師から始める資本論〜
    - https://ncode.syosetu.com/n7850ds/
ちょっとTypeScriptに詳しくなるTips。Optional PropertyとUnion型で定義するundefined

> 値が未定義であることと値がundefinedであることは厳密には動作が異なります。

上記はサバイバルTypeScriptに書かれている説明です。

:::note
理解しておくことで不必要な処理を省略できたり、予期せぬエラーに悩まされたりせずに済むと思うので頭の片隅に記憶いただけると良いかと思います！
:::

## 「Optional Property」と「Union型」って？
この記事を読んでいる方にあえて説明する必要はないと思いましたが、一応「Optional Property」と「Union型」について触れておきます。

### Optional Property
オブジェクトの型を定義する際に任意のプロパティであることを伝えるための記述方法です。

```typescript
type User = {
  name: string
  tel: number
  mail?: string
```

プロパティ名の後ろに「？」をつけることでOptional Propertyとして定義できます！

### Union型
2つ以上の型を「|（パイプ記号）」でつなげて定義した記述します。

```typescript
type User = {
  namse: string
  tel: number
  mail: string | undefined
}
```

## 【本題】Optional PropertyとUnion型で定義するundefinedは違う
前提として「TypeScriptに、「exactOptionalPropertyTypes」というコンパイラオプションを設定していないとエラーが発生しませんのでご留意ください。

設定方法は、`tsconfig`ファイルに対して以下の記述を追記します。
```diff_jsx
{
  "compilerOptions": {
+    "exactOptionalPropertyTypes": true,
  }
}
```

コンパイラオプションを設定した状態だと下記の`user2`でエラーが発生します。

```typescript
type User = {
  name: string;
  gender?: 'Man' | 'Woman';
};

const user1: User = {
  name: 'Tanimoto',
  gender: 'Man',
};

/*
  型 '{ name: string; gender: undefined; }' を、
  'exactOptionalPropertyTypes: true'が指定されている型'User'に割り当てることはできません。
  ターゲットのプロパティの型に'undefined' を追加することを検討してください。
  プロパティ 'gender' の型に互換性がありません。
  型 'undefined' を型 '"Man" | "Woman"' に割り当てることはできません。
*/
const user2: User = {
  name: 'Tanimoto2',
  gender: undefined,
};

const user3: User = {
  name: 'Tanimoto3',
};

```

上記のエラーは`User`の`gender`プロパティに対して`undefined`を明示的に許容させることで解消できます。

```diff_typescript
type User = {
  name: string;
-  gender?: 'Man' | 'Woman';
+  gender?: 'Man' | 'Woman' | undefined;
};
```

### なにが起こったのか？
`gender`に`undefined`を渡した`user2`はエラーが出たのに対し、
`gender`を空にした`user3`はエラーが出ませんでした。

:::note
`exactOptionalPropertyTypes`を有効にしたことで、
「`undefined`であること」と「プロパティが存在しないこと」の違いを厳格に区別するようになりました！
:::

### 何がうれしいのか？
関数で名前付きパラメータと名前なしパラメーターの時の挙動を揃えられることが挙げられます。

```typescript:OptionalPropertyのageにundefinedを指定した場合
type User = {
  nickname?: string;
  age?: number;
};

function myFunction(info?: User) {
  const hoge = info?.nickname ?? '';
  const hoge2 = info?.age ?? '40';
}

myFunction({ nickname: 'teru' }); // OK
myFunction({ nickname: 'teru', age: 19 }); // OK
myFunction({ nickname: 'teru', age: undefined }); // Error
```

`age`は`undefined`を許容していないので`error`になります。
では、上記を回避するためにはどうすればいい考えてみます。

```typescript:年齢の値が親コンポーネントからpropsで渡ってきた場面を想定
let { test } = props

myFunction({
  nickname: 'teru',
  ...(test !== undefined ? { age: test } : {}),
});
```
エラーを回避しようと思うと`undefined`でないことを確認する処理が必要になります…。

```typescript:名前付きでない引数の場合
function myFunc2(hoge: number = 0, hoge2: string = ''): void {
  console.log(hoge, hoge2);
}

myFunc2(19); // 19 ''
myFunc2(19, undefined) // 19 ''
```

値を渡されなかった時と`undefined`の時で出力が区別されません。

:::note
少し極端な例かもしれませんが、名前付き引数と名前なし引数の場合どちらでも共通した挙動を実現するためにもOptionalPropertyに`undefined`を指定しておくのが良いと思います！
:::

## まとめ
Optional PropertyとUnion型で定義する`undefined`には違いがあることを知りました。
また、コンパイラのオプションを1つ指定しないだけで、実装ミスになってしまうことを再認識しました。

コンパイラオプションについても理解を深めていきたいと思います。

## 参考資料

https://susisu.hatenablog.com/entry/2021/07/13/000239
Azure Data Factory のパイプラインのデバッグ実行時 message が NULL になるエラーへの対応方法の 1 つ：ForEach ループを入れ子が原因

## 概要

Azure Data Factory のパイプラインをデバッグ実行中に、message が NULL になるエラーが発生した場合の対応方法について共有します。デバッグ実行時に以下のようなエラーが発生し、原因が特定できず困っていました。このエラーが発生する要因はいくつか考えられますが、私の場合は ForEach アクティビティの中にさらに ForEach アクティビティを含めていたことが原因でした。

```json
{
"code": "BadRequest",
"message": null,
"target": "pipeline//runid/de7c4ef7-533a-4b8b-bda2-cdace6015990",
"details": null,
"error": null
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f2660542-ccd8-bd91-8f2c-c22ffecc7dd3.png)

## エラーについて

Azure Data Factory のドキュメントにて、 ForEach アクティビティに関する制限が下記のように記載されています。

> 別の ForEach ループ (または Until ループ) 内に ForEach ループを入れ子にすることはできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fe59b997-02da-b7e0-7fe7-c442d1909a0e.png)

引用元：[ForEach アクティビティ - Azure Data Factory & Azure Synapse | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/control-flow-for-each-activity)

Azure Data Factory の UI にて Foreach アクティビティ内で  Foreach アクティビティを確認すると下記のようなメッセージが表示されて、基本的には Foreach アクティビティを追加できないようになっています。ただし、他のパイプラインの内容をコピー＆ペーストを実施すると  Foreach アクティビティを追加できてしまい、デバック実行時にエラーとなってしまいました。

> 入れ子になった ForEach アクティビティはサポートされていません。ForEach activity のスコープ内に ForEach アクティビティを含めることはできません。新しい処理パイプラインを開始するには、Execute Pipeline アクティビティを検討してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9ccd927f-805d-3a4d-f493-fdb7d2bb642b.png)
 
> Operation on target ForEach1 failed: Container activity cannot include another container activitynull

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bdf4630a-4a6c-1fb9-0513-13530379bde6.png)

## エラーの再現方法

### 1. Foreach アクティビティ内に他のパイプラインの ForEach アクティビティをコピー＆ペーストを実施

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bd436576-3cac-0bb1-dfe0-0a4d6cab076c.png)

### 2. デバック実行しエラーとなることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/16b2c7ad-db94-b70a-4546-307d292cd116.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9a65e52f-c52f-d8b8-ec5c-a1f6f9f493ff.png)

## エラーへの対応方法

### 1. Foreach アクティビティ内のForeach アクティビティを他のパイプラインに移動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/361a832d-4346-a9cd-e4f2-6e625b095370.png)

### 2. Foreach アクティビティ内に Execute Pipeline アクティビティを追加して移動先のパイプラインを呼び出すように設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9feb4533-e997-5712-cf4e-9e6980537e36.png)

### 3. デバック実行し正常終了することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e21840d6-3e97-dd18-e6e0-0ee3ccb4c77b.png)
コードファーストとスキーマファースト


アプリケーションを構築する際にフロントエンドとAPIを分担して開発することはよくあると思います。

筆者もサーバーサイドエンジニアとしてAPIを開発し、モバイルエンジニアにはモバイルアプリの開発をしてもらっています。

この開発スタイルでAPIを構築する際には我々はAPIの仕様書を先に作成して、インターフェースについての合意を先に取ってから各自が開発を進めている。

一方でコードを先に書くスタイルもある。

それぞれの差を理解し、どちらが適しているかを考えてみたい。

## スキーマファースト/APIファースト

スキーマファースト/APIファーストとは、APIの仕様を先に決めてから開発を進めるスタイルです。

最初に書きましたが、APIの仕様書を先に作成して、インターフェースを確定してからそれぞれの開発を進めるスタイルです。

このスタイルのメリットは

- 仕様が明確になる
- フロントエンドとバックエンドの開発を分業しやすい

といった点があります。

APIの仕様を先に決めてから開発を進めるためドキュメントが強制的に残るため、一定規模以上の開発の進捗がスムーズになるかなと思います。

一方でデメリットとしては

- ドキュメントの作成に学習時間と作業時間がかかるため、小規模な開発ではオーバーヘッドが大きくなる
- ドキュメントとコードの整合性を保つための手間がかかる

などがあります。

## コードファースト

一方でコードファーストとは、コードを先に書いてからAPIの仕様を決めるスタイルです。

つまり実装ありきで開発を進め、ドキュメントが後から生成されるようになります。

このスタイルのメリットは

- 早く開発を開始できる
- ドキュメントを自動生成すればスキーマを書く手間が省ける

といった点があります。

例えばFastAPIを使うと、コードを書くだけでSwagger UIを生成することができ、スキーマを書く手間が省けます。

一方でデメリットとしては

- 仕様が不明確になる
- フロントエンドとバックエンドの開発が分業しにくい

などがあります。

## どちらが適しているか

これは状況によるが、筆者はスキーマファーストを推していきたい。

スキーマを先に定義することでクライアントとサーバーのインターフェースを明確にし、開発をそれぞれで行うことができることを享受したいからである。

またOpenAPIで定義されたスキーマは各言語に対応したコードを自動生成するツールがあるため、設定を行って自動生成をすることで一部のコードを書く手間も省ける。

人間がコードを書くことで生じるミスを減らすために自動生成に頼りながらスキーマファーストを用いてチームでの開発効率推していきたい。
MonoBrickとPCよ、接続しておくれ

PCとMonoBrickを接続することでプログラムの実行ができるようになります。
接続する方法は主に3つあります。どれも利点欠点があるので、自分の環境に適した方法を選んでください。私のお勧めはUSBです。
# PCと接続
- [USBで接続](#usbで接続)
- [Bluetoothで接続](#bluetoothで接続)
- [Wifiで接続](#wifiで接続)
## USBで接続
### ダウンロード
![MicrosoftUSBDriver](https://storage.googleapis.com/zenn-user-upload/c557fe1c4145-20230913.png)
[MicrosoftUpdateカタログ](https://www.catalog.update.microsoft.com/Search.aspx?q=USB%20RNDIS%20Gadget)
Windows10,11でUSBで接続するにはUSBドライバーが必要になります。
上のサイトに入って「Acer Incorporated. - Other hardware - USB Ethernet/RNDIS Gadget」というファイルを探してください。2つ見つかると思うので「Windows 7, Windows 8, Windows 8.1 and later drivers」の方をクリックします。
新しいウィンドウが表示されるので`20342322_4b9970e3174b23b5cb2371af0837f939a71271ea.cab`を押してダウンロードして「7-zip」で展開してください。
### インストール

「デバイスマネージャー」の一覧から「ポート(COMとLPT)」を見つけ、中のUSBデバイスを右クリックして「ドライバーの更新」を選んでください。。複数あってどれがEV3かわからない場合は、USBを抜き差しして表示非表示が変わるものがEV3です。
![USBdriver](https://storage.googleapis.com/zenn-user-upload/813c77b6e9e1-20230914.png)
「コンピューターを参照してドライバーを検索」から、先ほど展開したフォルダを選択します。「ドライバーが正常に更新されました」と表示されたら完了です。

## Bluetoothで接続
:::note warn
2016年以前に製造された旧バージョンEV3でのみBluetooth接続ができます。具体的にはこの時期にEV3のBluetoothのチップが変更されました。確認方法はEV3の箱についているシールのバージョンが「46」が旧バージョン、「121」が新バージョンです。最新のEV3のバージョンが何なのかは確認できませんでしたが、バージョンが「46」より大きい場合接続できない可能性が高いです。
:::
:::note
旧型のEV3がないので、Bluetooth接続の解説はleJOSのものです。公式ドキュメントより、この方法でできるらしいですが検証できていません。
:::
![Bluetooth](https://storage.googleapis.com/zenn-user-upload/3c720576344f-20230917.png)
Windowsの設定の「Bluetoothとデバイス」を選択し、「デバイスの追加」を押します。

### 接続を完了する
上のどちらかの方法でPCとEV3が接続できたら、コントロールパネルを開きます。

「デバイスとプリンターの表示」から「デバイスとプリンター」を表示させます。
![デバイスとプリンター](https://storage.googleapis.com/zenn-user-upload/47e5fadbbacd-20230916.png)

今回PCに接続したEV3の名前が一番下の「未指定」のグループにあると思うので、右クリックメニューの「接続方法」の中の「アクセスポイント」に設定します。

このコントロールパネルを開く以降の作業はEV3を再起動するたびに実施する必要があります。
## Wifiで接続
Wifi経由でEV3に接続する場合は、Wifiドングルが必要です。既にWifiドングルを持っている人以外はこの方法を使う必要はないと思います。
EV3本体にWifiドングルを差し込んでからMonoBrickを起動します。付いたままの人は一度再起動してください。
メニューから「WiFi Connection」を選び、今回接続したいWifiを選択します。「SSID」にWifiの名前を、「Password」にWifiのパスワードを入力して一番下の「Connect」にチェックを入れてください。「Encryption」は基本的にWPA/2だと思うので変更しなくて大丈夫です。接続に失敗したのみ変更してみてください。接続には少し時間がかかります。
「Main menu」に戻り「Information」を押すと一番下に「IP」という場所に「192.~.~.~」といったIPアドレスが表示されていれば接続完了です。

# 接続確認
上の方法でPC接続が完了したら、PowerShellを開いて以下のコマンドで確認しておきます。
```
ping 10.0.1.1
```
Wifi接続の場合はIPアドレスを入れてください。
![powershell](https://storage.googleapis.com/zenn-user-upload/b562a691734b-20230916.png)
このような表示が出てくれば、接続成功です。
「要求がタイムアウトしました。」と表示されたら接続できていないので、今一度手順を確認してみてください。
# 参考文献

https://afrel.co.jp/technology-info/information-ev3/ev3-hardware/ev3-intelligent-block/20923/

https://sourceforge.net/p/etroboev3/wiki/MonoBrickWin/
【Python】座標取得コード②

from pynput import mouse #module pynputをインポート
import pyautogui #module pyautoguiをインポート 

#マウスイベントハンドラを定義
def on_move(x, y):
    return

def on_click(x, y, button, pressed):
    if pressed:
        # Stop listener
        return False

def on_scroll(x, y, dx, dy):
    return

#リスナー起動
#Collect events until released
with mouse.Listener(
        on_move=on_move,
        on_click=on_click,
        on_scroll=on_scroll) as listener:
    listener.join()

recttop_x, recttop_y = pyautogui.position()
print('Pointer cliked at {0}'.format(
        (recttop_x, recttop_y)))

#クリックした座標を表示
print('recttop_x = ', recttop_x)
print('recttop_y = ', recttop_y)

※pynputのインストールが必要
【MPAndroidChart】選択したセンサをグラフ表示するプログラム

Androidアプリ投稿にクローズドテスト実施がマストになり、やる気が失せたので作成したアプリを供養します

ソースはGithubにおいてます（※汚いです）
→https://github.com/lumine2free/SensorViewer
※コード詳細は現在(2024/07/06)書いてません

## アプリの機能リスト
- センサ選択機能
- 選択したセンサ値を表示・グラフ描画
- 選択したセンサ詳細の表示
- Android Developersへのリンク機能
- ライトモード/ダークモード選択

## アプリのイメージ
①起動時（ライトモード）
![Screenshot_2024-07-06-19-43-22-61_7f0ca6b9478303fb4ef1820ba87ee786.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490620/9acb7460-353f-a466-c475-adaa5a8034d8.jpeg)

②ダークモード
![Screenshot_2024-07-06-19-43-34-98_7f0ca6b9478303fb4ef1820ba87ee786.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490620/3791d57c-3275-5bfe-246d-b35e3fbeff88.jpeg)

③センサ種類選択時（ダークモード）
![Screenshot_2024-07-06-19-43-47-82_7f0ca6b9478303fb4ef1820ba87ee786.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490620/d00e40ed-ff1f-2c8a-3379-12ebff4bfa22.jpeg)

④Additional Info押下時
![Screenshot_2024-07-06-19-44-04-67_40deb401b9ffe8e1df2f1cc5ba480b12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490620/5fe6964d-0051-4ece-6ae5-a85323d97460.jpeg)
AIによる世論誘導事例　2024上半期

## はじめに
　近年、AI（人工知能）の発展は目覚ましいものがあります。画像認識、自然言語処理、機械学習などの分野での進展は、私たちの生活やビジネスの多くの側面を変革してきました。しかし、この技術の急速な進化に伴い、AIの悪用も増加しています。特に、AIを用いた世論誘導やフェイクニュースの拡散が深刻な問題となっています。そのため、情報の信ぴょう性を確認する能力がますます重要になっています。本記事では、AIによる世論誘導の実例について探っていきます。

## 1. 処理水放出を批判するブログ記事作成
　日本を標的にした事例が確認されており、東京電力福島第1原発の処理水放出を批判するブログ記事の作成にAIが使用されていることが報告されています。

 1. 処理水放出を非難する内容の文章の作成
 1. 英語、日本語、中国語、韓国語、ロシア語で、日本が福島原発からの排水で太平洋を汚染していると非難する記事を生成
 1. 処理水を意図的に「汚染処理水」と表現して、ネガティブなイメージを広めようとする

## 2. 台湾で生成された顔写真のSNSアカウントで批判的な投稿が拡散される

台湾では、AIで生成されたと思われる偽の顔画像を使用したSNSアカウントが、蔡英文政権や欧米に批判的な内容を拡散していました。

こういった、ボットアカウントにAIで生成された人の画像を使う理由としては、SNSの運営元から凍結の対象になりにくいという点がある。

## 3. ウクライナ侵攻に関するフェイクニュース
ロシアによるウクライナ侵攻に関連して、様々なフェイクニュースが作成・拡散されていることが報告されています。
フェイクニュースの事例
1. ゼレンスキー大統領の妻がブランド品に身を包んだ偽の画像を作成・拡散
1. 実在する雑誌の表紙を改ざんし、ゼレンスキー大統領を批判的に描いた偽画像の作成
1. ウクライナ兵を卑怯に、ロシア兵を勇敢に描く印象操作

これらのフェイクニュースは、情報空間を戦場の一部として利用し、人々の認識や国際世論に影響を与えようとする「情報戦」の一環として位置づけられています。

## 4. ガザ戦闘に関してのフェイクニュース

フェイクニュースは、ウクライナの戦場映像、映画の撮影場面、ゲームの映像などを流用して作成されることが多く、主にソーシャルメディア上で拡散されています。
以下の事例が確認されました。
1. 「ハマスが人質にしたイスラエルの子供たち」として幼児がおりに入れられている動画
1. 「イスラエル軍がガザを核爆撃」という投稿
1. 「ウクライナがハマスに武器を渡したとBBCが報道」といった偽情報

ウクライナ侵攻と合わせてガザの戦闘に関連するフェイクニュースは、情報戦の一環として利用されており、国際社会全体での対策が求められています。


## 最後に
AIの発展に伴い、フェイクニュースと真実のニュースの区別がますます難しくなっています。そのため、私たちは情報の信ぴょう性を自分自身で確認する必要があります。この記事で記載した内容も、ぜひ皆さんご自身で確認してみてください。最近では、検索結果をその情報源と合わせて表示してくれるPerplexityというツールが無料で利用できるようになりました。これを活用して、信頼性の高い情報を見極める一助とするのも良いでしょう。

※Perplexityについての[記事](https://qiita.com/chalo/items/1e0dd05c4249be0e239a)も書いたので、確認してみてくださいorz
【トラブルシューティング】VRChatでYoutubeの動画が全く流れなくなった件

## TL;DR
事象: なんか急にVRChatで動画プレイヤーがエラーを起こして見れなくなった
原因: yt-dlpのバージョンが古い
対策: yt-dlpのバージョンアップ

## 前提
OS: Windows 10
Stream Player: Yama Player
Logfileのパス: `C:\Users\{ユーザー名}\AppData\LocalLow\VRChat\vrchat\output_log_yyyy-MM-dd_hh-mm-ss.txt` (*1, *2)
yt-dlpのパス: `C:\Users\{ユーザー名}\AppData\LocalLow\VRChat\VRChat\Tools\yt-dlp.exe`

## 発生した事象
- VRChatで動画プレイヤーを使用して、youtubeの動画を視聴しようとしたとき、エラーが起きて見られない。
- ただし、他のプレイヤーは自分が流した動画をちゃんと視聴できる
- Logfileに、以下のようなログが出力される。
    ```
    2024.07.06 17:32:38 Error      -  [Video Playback] ERROR: [urllib] Unexpected error: PermissionError: [Errno 13] Permission denied: 'C:\\work\\tls.keys'; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
    ```

## 調査結果（ChatGPT）
ぼく
```
このログのERRORの内容を分析して、解決方法を提示してください。
2024.07.06 17:32:38 Error      -  [Video Playback] ERROR: [urllib] Unexpected error: PermissionError: [Errno 13] Permission denied: 'C:\\work\\tls.keys'; please report this issue on  https://github.com/yt-dlp/yt-dlp/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U
```

ChatGPT
```
エラーログの概要
yt-dlp.exeというツールを使用してYouTubeのURLを解決しようとしています。
プロセスはyt-dlp.exeを正常に開始し、プロセスIDは17768です。
プロセスは425ミリ秒後に終了し、終了コードは255でした。
エラーメッセージとしてPermissionError: [Errno 13] Permission deniedが表示され、C:\\work\\tls.keysへのアクセスが拒否されています。
解決方法
ファイル権限の確認:

C:\\work\\tls.keysファイルのアクセス権限を確認します。このファイルへの読み書き権限があるかどうかを確認し、必要に応じて適切な権限を設定します。
エクスプローラーでファイルを右クリックし、「プロパティ」→「セキュリティ」タブでユーザーのアクセス権を確認・変更します。
実行環境の確認:

yt-dlp.exeが必要な権限で実行されていることを確認します。管理者権限で実行することで、ファイルアクセスの問題が解決する場合があります。
ファイルの存在確認:

C:\\work\\tls.keysファイルが存在するか確認し、存在しない場合はファイルを作成します。必要な情報を含むように設定します。
yt-dlpの更新:

エラーメッセージで提案されている通り、yt-dlpを最新バージョンに更新します。コマンドプロンプトを開き、以下のコマンドを実行します:
コードをコピーする
yt-dlp -U
エラーレポートの提出:

もし問題が解決しない場合は、エラーメッセージに記載されているURL（https://github.com/yt-dlp/yt-dlp/issues）にアクセスし、エラーの詳細を報告します。これにより、開発者からのフィードバックを受け取ることができます。
これらの手順を試すことで、PermissionErrorの問題を解決できる可能性が高いです。必要に応じて、各手順を詳細に実行し、状況に応じた適切な解決方法を選択してください。
```

## 実施した内容
- C:\work\tls.keysのパーミッション変更 -> 解決しなかった
- yt-dlpのアップデート -> 解決した

### yt-dlpのアップデートを実行する
1. Windowsキーを押下し「スタートメニュー」を開く
2. 「cmd」と入力し、検索から「コマンドライン」を開く
3. 以下のコマンドを実行し、yt-dlp.exeをアップデートする
    ```
    C:\Users\{ユーザー名}\AppData\LocalLow\VRChat\VRChat\Tools\yt-dlp.exe -U
    ```
4. ログを確認し、最新のバージョンであることを確認する
    ```
    Latest version: stable@2024.07.02 from yt-dlp/yt-dlp
    yt-dlp is up to date (stable@2024.07.02 from yt-dlp/yt-dlp)
    ```
5. VRChat上で動画プレイヤーがYoutubeが視聴できることを確認する
 
## 結論
VRChatの動画プレイヤーが実行するyt-dlp.exeのバージョンが古いため、アップデートすることで直る可能性が高い。

## 訳注
(*1): パスに含まれる「{ユーザー名}」は、適宜OSユーザーに置き換えてください。
(*2): パスに含まれる「yyyy-MM-dd_hh-mm-ss」は、最も直近のファイルを参照するようにしてください。
エンジニアを目指す文系学生は基本情報を取るべき

# はじめに
文系の学生が基本情報を取るべき理由とおまけで自分が勉強してたやり方を紹介します。ちなみに自分はAI周りのCS分野を専攻しています。
# なぜ文系学生が基本情報を取るべきなのか
### CS専攻の学生が大学で学ぶ内容を広く浅く網羅できる
文系の分野を専攻している学生でもCS専攻が授業で学ぶような内容を浅く広く網羅できます。また基本情報ではマネジメントや経営周りの分野も勉強する必要がありますが、企業の一社員として仕事をするなら知っておいて絶対損はないです。
### 資格を持っていることで継続的に学習できることをアピールできる
文系で技術力がなくても継続的に学習できることをアピールできるので、インターンや就活においてポテンシャル面での評価はもらえると思います。自分はまだ就活に関しては経験していないので適当ですがSESやSler系なら資格は結構評価されるような気がします(ベンチャー系は別)。
# 自分の学習方法(おまけ)
### 点数
科目A: 760
科目B: 605
(CS専攻で科目Bがギリギリなのはノータッチでお願いします)
### 科目A学習方法
```
① テキストを1周通読する
② 過去問道場で過去問を10回分に絞って繰り返す
```
王道ですが王道の学習方法が一番最速だと思います。過去問10回分が完璧で6割いかないことはまずないと思います。一応テキストと過去問のサイトも載せときます。
- 基本情報技術者 絶対合格の教科書

https://amzn.asia/d/apjUwRZ
- 過去問道場

https://www.fe-siken.com/fekakomon.php
### 科目B学習方法
```
(アルゴリズム)
①科目Aテキストでアルゴリズムの基本を学習 
②過去問道場で過去問や模擬問題を解く
(セキュリティ)
①科目Aテキストでセキュリティの基本を学習
②セキュリティマネジメントの過去問道場の科目Bを解く(もちろんの基本の過去問等もやる)
```
自分は上記のやり方で学習しましたがアルゴリズムは普通に難しいので別途教材を購入するのもアリだと思います。セキュリティはセキュマネの科目Bに似たような問題が結構出るのでやっておいた方がいいと思います。

- 過去問道場(セキュリティマネジメント)

https://www.sg-siken.com/

# おわりに
ITパスほど簡単ではないし応用情報ほどコストもかからない基本情報は結構いい資格だと思います(いつでも受験できるし)。エンジニアを目指している文系学生の方に少しでも参考になりましたら幸いです。
【AWS DVA-C02】合格体験記的な勉強記録

## はじめに

2023/2に取得したSAAに続いて、先日DVAに合格したため、学習記録として書きたいと思います。
業務で扱っているシステムにもインフラ部分でAWSが用いられているため、構成図を見たり、話題にあがったりするようになりました。SAAを取ってからそう言った話にも何となくついていけるようになったため、更なる理解・学習継続のために取得してみました。
以下SAAでも同じように書いているのでよかったらどうぞ。
[【AWS SAA-C03】合格体験記的な勉強記録](https://qiita.com/Mayoneeeez/items/fa3b98f96)


## 試験結果

![messageImage_1720264596943.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3134184/231ee036-605e-bcc2-6379-3be3d5f35ea2.jpeg)

## 試験の傾向

SAAと比べるとかなり範囲が絞られていると思います。
APIGateway、KMS、Cognito周りが多い印象があります。
文章がひたすら長い。


## 勉強方法

### Udemy

https://www.googleadservices.com/pagead/aclk?sa=L&ai=DChcSEwiV7oz8ppKHAxWK7RYFHWdOA5UYABAAGgJ0bA&ase=2&gclid=Cj0KCQjw1qO0BhDwARIsANfnkv9NUFKCDZdZ2_MPA0MvYiCsBZb1NnNjdJ-snaiQcoqqIzYmCFYO7j0aAvpTEALw_wcB&ohost=www.google.com&cid=CAESVuD2Cfjc6IPG1IKoUzY2PLBNS_aVOx-WQLuxTPSsfB-__k_euGUZ8xInaGPc6G93PN17IQXPGSTv0lIOV-kQ2nJ1WLatQPDYJVnIpaW1X63IgoXe7gQo&sig=AOD64_2yqydzeBaIfuoF07cs5s6jR5adZQ&q&nis=4&adurl&ved=2ahUKEwiamYf8ppKHAxVRe_UHHTbvK1EQ0Qx6BAgIEAE


この講義は、DVAに出題されるサービスを網羅的に説明した講義でしたが、SAAを取得している人からすると、知っているものが多いなぁ。という印象になると思います。
ただ、取得から時間が経っていて忘れているなという人には、復習がてら見るのはとても良いと思いました。詳しく説明というよりは、製品ごとの概要という感じだったため。
<br>


https://click.linksynergy.com/deeplink?id=/NCY0s64yk4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Faws-certified-developer-associate-practice-tests-dva-c01%2F

また問題集はこれを使いました。テストが4つ収録されていますが、1つだけ解きました。





## 感想
今回、SAAを事前に取得していたため、そこまで労力をかけずに合格することができました。
勉強期間は1か月程度ですが、講義動画は見ずに、出題される製品を触ってみるとかでもよかったと思います。むしろ今回ハンズオンで学習しなかったため、深い理解はできていないかもしれません。
今自分でアプリを作ってみているのですが、そちらのインフラにAWSを活用したいな、という意図があり今回がんばって取得してみました。アプリの方ができたら、そっちもまとめてみるかー。


#### メリット・デメリット
下記に書いたものと同じです。
[【AWS SAA-C03】合格体験記的な勉強記録](https://qiita.com/Mayoneeeez/items/fa3b98f96)
【Python】VALL-E-Xで自分の声で音声合成してみた

## はじめに
皆さんは自分の音声で文章を読み上げてくれる機能が欲しくなったことがあるでしょうか？

ちなみに私はありません。

というのは置いておいて…今回はMicrosoftが発表した音声合成モデル VALL-E Xを試しに使ってみたいと思います。

VALL-E Xの面白いポイントはただ準備したテキストを読み上げてくれるのはもちろん、3~10秒程度の音声を準備することで再学習なしのzero-shotで思い通りの声色を生成できることです！(言い過ぎかもしれません)

ということで試してみます。

## Install

https://github.com/Plachtaa/VALL-E-X?tab=readme-ov-file

今回はこちらのGitHub Repositoryを使わせていただきます。


インストールは以下で終わりです。
```terminal
git clone https://github.com/Plachtaa/VALL-E-X.git
cd VALL-E-X
pip install -r requirements.txt
```
これ以外に、ffmpegを追加で入れる必要がありそうでした。

モデルのcheckpoint等のファイルは初回実行時に勝手にダウンロードされます。

## Basic Generation
まずは通常の音声合成を試してみます。

```python
from scipy.io.wavfile import write as write_wav

import utils
from utils.generation import SAMPLE_RATE, generate_audio, preload_models

text_prompt = "こんにちは。今日はいい天気ですね。"
save_file = "vallex_generation.wav"

preload_models()

audio_array = generate_audio(text_prompt)

write_wav(save_file, SAMPLE_RATE, audio_array)

```
試すとかわいらしい系の声で読み上げてくれます。

## Voice Cloning
ではいよいよ自分の声で読み上げてもらいます。

```python
from scipy.io.wavfile import write as write_wav

import utils
from utils.prompt_making import make_prompt
from utils.generation import SAMPLE_RATE, generate_audio, preload_models

# プロンプトの設定！
model_name = "test"
sample_voice = "sample.wav"
sample_transcript = "夜に吹く風のヒューヒューという音が私を不安にさせる。"

text_prompt = "こんにちは。今日はいい天気ですね。"
save_file = "vallex_cloning.wav"

preload_models()

# プロンプト追加！
make_prompt(name=model_name, audio_prompt_path=sample_voice, transcript=sample_transcript)

audio_array = generate_audio(text_prompt, language="ja", prompt=model_name)

write_wav(save_file, SAMPLE_RATE, audio_array)

```
先ほどのBasic Cloningとの差分はプロンプト作成部分です。
```model_name```で好きなプロンプト名を指定し、```sample_wav```で使用する音声ファイルのパスを、```sample_transcript```で音声ファイル内の文字起こしを設定しています。

これで出力されたvallex_cloning.wavが自分の声で読み上げられた音声です。

所感としては不自然な読み方をするときもあるが、数回やっているうちに一回はいい感じのものが生成される印象でした。(おそらく生成時にランダムノイズ的なのを使っているため？実行ごとに結果が少し変わる)

とはいえ、zero-shotでここまでできるのか～と感じました。

ちなみに、text_promptを英語にして、generate_audioの引数のlanguageをenにすると英語でも読み上げてくれます。

## まとめ
zero-shotでここまでできるのはすごい！

Qiitaってwavファイル貼れないのでしょうか？皆様も是非お手元でお試しください。
【Android Studio】Apply Changes

# はじめに
コードを修正した後に再度アプリをインストールし直すことなく、
修正したコードを反映してすぐに確認したいことがあります。

元々は**Install Run**という名称の機能でしたが、今は**Apply Changes**に変わっています。
このApply Changes機能について記載していきます。

前提とする環境は以下の通り。
・Mac OS Sonoma 14.5
・Android Studio Koala | 2024.1.1

また、公式の参考資料は以下の通り
　https://developer.android.com/studio/run
　https://medium.com/androiddevelopers/android-studio-project-marble-apply-changes-e3048662e8cd

# Apply Changes
### ２つの機能
以下２つの機能があります。
・Apply Changes Restart and Activity
　→そのままの意味で修正内容を実行している端末に反映させActivityを再起動する
・Apply Code Changes
　→修正内容を実行している端末に反映させる

### 注意事項
・Android Studio 3.5以降でこのApply Changesを使うことができる。
・Android 8.0（APIレベル26）以降を実行しているデバイスでサポートされている

### Apply Code Changes：試しにやってみた
テンプレートのサンプルプロジェクトを作成し、以下Snackbarを表示する機能があったとする。
![スクリーンショット 2024-07-06 19.09.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/5f0d4589-e069-e943-4ab6-a77c34c931d5.png)

上記実装箇所が通る操作を行った場合、以下のように表示される
![スクリーンショット 2024-07-06 19.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/196285f8-74c0-3cab-941f-c3c08a17d290.png)

これを以下のように表示テキストを変えて、ファイル保存する。
![スクリーンショット 2024-07-06 19.10.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/fad9ae4c-7f63-71e8-a6fd-72f3c1d04dd3.png)

次に、Apply Code Changesボタンを押下し、修正したコードを反映させる。
![スクリーンショット 2024-07-06 19.11.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/97a0cf0f-080c-c4a2-5575-1421925de204.png)

そして、実装箇所が通る操作を行った場合、以下のように表示され表示されるテキストが変わっていることが分かる。
![スクリーンショット 2024-07-06 19.59.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/9ebc4bc1-b86e-f1bd-2398-c05b18070371.png)

### Apply Changes Restart and Activity：こちらも試してみた
Resourceファイルを変更した場合、Apply Changes Restart and Activityを使用する必要がある。
![スクリーンショット 2024-07-06 19.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/e17edbf7-9e0f-a7c3-faa7-937a9d4ce159.png)

上記以外に、以下のようなケースもApply Changes Restart and Activityを使用する必要がある。
・FragmentのonCreateViewやonViewCreateのタイミングで実行している処理を変更した場合
・Activityを修正した場合

これは、コードを修正してアプリに反映しても、すでに実行済みの処理であれば反映されないと思われる。

# Xcodeにはこういう機能ってあるの？
Xcodeにも似たような機能があると非常に嬉しいのだが、現状は標準機能としては無いっぽい

Injection Plugin for XcodeなどPluginを入れれば同じことが出来るっぽい
（試せてないのでこれは別記事にしようかと）

あとは、FlutterであればHot Reloadという名称で同じことが出来るので便利そうです。
案件によってはPluginを気軽に導入できないので、、Xcode標準機能として備わるのが一番良いんですよね。。
 
# 最後に
今までは以下のように行なって来たことが、
０）特定の画面の特定の操作を行なった時にバグを発見
１）特定の画面の特定の実装箇所を修正する
２）シミュレータを起動し、アプリを再インストール
３）特定の画面に辿り着いて、修正箇所を通るような操作を行う
４）期待通りに動かない場合は１）からやり直し

この機能を使うことによって３）の操作が非常に楽になります。
まあ、一発で直せよってことかもしれませんが、状況によっては一発で直しづらい場合もあるし、実装しながらこまめに動きを確認したい時もあります。

こういう時に確認ステップを少しでも減らすことができれば開発効率はアップするので、非常に有用な機能だと思っています。

あとは、謎に修正が反映されない時があるので、その時は素直に再度アプリインストールし直してデバッグ実行し直しですかねー

以上
ChatGPT-3.5先生へ「FreeCADで寸法表示は何通りありますか。」

以下、私が編集しています。
・旧タイトル。ChatGPT先生へ「FreeCADで寸法表示はなん通りありますか。」
　再質問していません。


# ChatGPT-3.5先生へ

***●user***
```
FreeCADで寸法表示はなん通りありますか
```
***ChatGPT-3.5***

```
FreeCADで寸法表示にはいくつかの方法があります。主に以下の方法があります：

1.基本寸法（Draft Dimension）
Draftワークベンチで使用できます。2D図面の寸法を表示するための基本的な機能です。

2.TechDrawワークベンチ
TechDrawワークベンチでは、2D図面を作成し、さまざまな寸法を追加できます。このワークベンチは、製図や技術図面の作成に適しています。

3.Sketcher寸法
Sketcherワークベンチ内で、スケッチのジオメトリに寸法を追加できます。これはスケッチを拘束するための重要な機能です。

4.Partワークベンチ
Partワークベンチ内では、作成した3Dモデルに寸法を表示する機能もあります。ただし、これは主に参照目的で使用されます。

5.Measureツール
Measureツールを使用して、2点間の距離、角度、半径などを測定し、モデル上に表示することができます。

各方法には特定の用途やワークフローに適した機能が備わっているため、目的に応じて適切な方法を選択することが重要です。
```
Laravelで.envの値が読み込まれない問題を解決する方法

## はじめに

こんにちは！エンジニア転職を目指している伊藤です。
最近、Laravelプロジェクトで環境変数が正しく読み込まれない問題に直面しました。
この記事では、その問題の解決方法について説明します。

## 問題の概要

Laravelで環境変数を.envファイルに設定しているにもかかわらず、これらの値がアプリケーション内で正しく読み込まれませんでした。具体的には、AWS S3にアクセスするための`env('FILESYSTEM_DISK')`や`env('AWS_ACCESS_KEY_ID')`などの環境変数がnullを返していました。

## 原因

この問題の原因は、Laravelの設定キャッシュファイル`bootstrap/cache/config.php`が存在することでした。このファイルが存在する場合、`env()`関数は常にnullを返します。設定キャッシュを有効にしていると、環境変数はキャッシュされた設定ファイルから取得されるため、`.env`ファイルの変更が反映されません。

## 解決方法

### 1. 設定キャッシュファイルを削除する

まず、以下のコマンドを実行して、`bootstrap/cache/config.php`ファイルを削除します。

```bash
sudo rm -f /path/to/your/laravel/project/bootstrap/cache/config.php
```

### 2. キャッシュをクリアする
以下のコマンドを実行して、config のキャッシュをクリアします。

```bash
php artisan config:clear
```

### 3. 環境変数を確認する
最後に、環境変数が正しく読み込まれているかを確認します。以下のコマンドでtinkerシェルを起動し、環境変数の値を確認します。

```bash
php artisan tinker
```

tinkerシェル内で以下のコマンドを実行し、環境変数の値が正しく取得されるか確認します。
※確認したい環境変数を設定してください

```php
env('FILESYSTEM_DISK');
env('AWS_ACCESS_KEY_ID');
```

## 最後に 
本記事では、Laravelで.envファイルの環境変数が読み込まれない問題の解決方法について説明しました。この問題の原因は設定キャッシュファイルにあり、これを削除することで問題を解決できます。同じ問題に直面している方の手助けになれば幸いです。

<br>


## 参考記事
https://qiita.com/saya_c/items/b66d72edebaee944d008#comments
PySimpleGUI を使ってみる

簡単なGUIアプリケーションを作るために紹介されている PySimpleGUIを使ってみました。

# 環境

- Debian Testing (2024/7/6時点のDebian 13)
- python 3.11.9
- PySimpleGUi 5.0.6


# 事前準備

```
# apt install python3-pip
# apt install python3-tk
```

# PySimpleGUI インストール


今回はシステムにインストール。

```
# pip install --break-system-package  PySimpleGUI
```

# プログラム

こちらにあるサンプルプログラムを実行

https://www.pysimplegui.com/

```
import PySimpleGUI as sg

# All the stuff inside your window.
layout = [  [sg.Text("What's your name?")],
            [sg.InputText()],
            [sg.Button('Ok'), sg.Button('Cancel')] ]

# Create the Window
window = sg.Window('Hello Example', layout)

# Event Loop to process "events" and get the "values" of the inputs
while True:
    event, values = window.read()

    # if user closes window or clicks cancel
    if event == sg.WIN_CLOSED or event == 'Cancel':
        break

    print('Hello', values[0], '!')

window.close()
```

# 最初の起動

License Agreement が出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/dfdee481-839d-04fc-c31e-959a2e0d8e1d.png)
Free Trial を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/97c96ef0-7cc9-ff3a-83ce-1c1deb1b27fd.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/29a06248-b5d1-2625-c91b-bbba078c7117.png)

プログラムを実行すると、TRIAL メッセージが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/06f0986d-c71f-5314-a09c-f597c9c2821c.png)


# 簡単に使うには?

PySimpleGUI は Ver.5 から有料になったよう。それでも Hobbyst だと 無料 となっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/5ffde4a6-f1c0-9d0a-514b-c8fbf9343113.png)

とはいえ、 register が必要になっていてちょっと面倒。
adb - 機内モード

adbコマンドで機内モードON/OFFを切り替える方法

## コマンド

#### 機内モードON

```powershell
PS> adb shell cmd connectivity airplane-mode enable
```

#### 機内モードOFF

```powershell
PS> adb shell cmd connectivity airplane-mode disable
```

#### 機内モード状態確認

```powershell
PS> adb shell cmd connectivity airplane-mode
```
【勉強会資料】 大規模言語モデル入門 第5章-1 大規模言語モデルのファインチューニング

[大規模言語モデル入門](https://amzn.asia/d/16Wzurj ) の輪読会を開催したので、発表に使った資料を一部修正して公開します。

他の章の資料も公開していくので、よろしければご覧ください。
1. [【勉強会資料】 大規模言語モデル入門 第1章 はじめに](https://qiita.com/maekeso/items/e5a979df839ee766b3cc)
2. [【勉強会資料】 大規模言語モデル入門 第2章 Transformer](https://qiita.com/maekeso/items/5fc89e53429a8cb1ac48)
3. [【勉強会資料】 大規模言語モデル入門 第3章 大規模言語モデルの基礎](https://qiita.com/uminchu987/items/335c401eed06012af51d)
4. [【勉強会資料】 大規模言語モデル入門 第4章 大規模言語モデルの進展](https://qiita.com/maekeso/items/fcb3e623a9814fc4d57b)
5. [【勉強会資料】 大規模言語モデル入門 第5章-1 大規模言語モデルのファインチューニング](https://qiita.com/uminchu987/items/cb68991489ed40540f26)
6. [【勉強会資料】 大規模言語モデル入門 第5章-2 大規模言語モデルのファインチューニング](https://qiita.com/maekeso/items/3fed95ef506fefbb0542)
7. [【勉強会資料】 大規模言語モデル入門 第6章 固有表現認識](https://qiita.com/uminchu987/items/78485ea6d6455b08f5f7)
8. [【勉強会資料】 大規模言語モデル入門 第7章 要約生成](https://qiita.com/maekeso/items/e2f78606ca93c607c913)
9. [【勉強会資料】 大規模言語モデル入門 第8章 文埋め込み](https://qiita.com/uminchu987/items/e1e7dadcfa47955c1ad6)
10. [【勉強会資料】 大規模言語モデル入門 第9章 質問応答](https://qiita.com/maekeso/items/2aec33eacbf1b315f3f4)

# 日本語ベンチマーク
ヤフーと早稲田大学の共同研究で構築された、日本語理解能力を評価するベンチマーク。
JGLUE(Japanese General Language Understanding Evaluation)


**もう一度データセットについて**
データセット（dataset）とはモデルの学習や評価のためにまとめられたデータ
データセットを分割しているのは、モデルが学習データに含まれない未知なデータに対して発揮する汎化性能を計測するため。

+ 訓練セット：モデルが学習するためのデータ
+ 検証セット：モデルのハイパラメータや調整や選択のためのデータ
+ テストセット：最終的な性能評価のためのデータ

**大規模言語モデルのためのベンチマーク**
言語モデルの汎用的な言語知識を評価するために様々なベンチマークが提案されている。
進化が速いためベンチマークも日々進化しているが、英語中心の物が多い。
・GLUE(General Language Understanding Evalutation) : ベンチマークの先駆け
・SuperGLUE : より難しいタスクを集めたもの
・BIG-Bench : 非常に多様なタスク
・HELM : 精度だけではない多様な評価項目を考慮している。

**JGLUEに含まれるタスクとデータセット**
各データセットに対し訓練セットと検証セットは公開されているが、テストセットは公開されていない。


|タスク|データセット|
|-|-|
|文章分類|MARC-ja<br>JCola|
|文ペア関係予測|JSTS<br>JNLI|
|質疑応答|JSQuAD<br>JCommonsenseQA|


**文章分類**
あらかじめ定義されたラベルに基づいて、一つの文章を分類するタスク
ニュース記事の「経済」や「スポーツ」や、極性の「肯定的」や「否定的」
文法が正しいかどうかも文章分類に属する。
MARC-jaは多言語商品レビューコーパスMARCから日本語のレビューを抽出したもの。
５段階評価の1，２を否定的、４，５を肯定的としてラベル付けした二値分類。

JCoLA(Japanese Corpus of Linguistic Acceptabiity）は文法的な容認判断能力を評価するデータセット。
論文から人手で集めた分と、それを改変した文が含まれている。
各文が文法的に正しいかどうかの二値分類。

**文章ペア関係予測**
どれだけ文が似ているかの判定や、二つの文の意味が合致するかどうか。
JSTSは意味的類似度計算のデータセット。文のペアが０～５のスコアで付与。
JNLIは自然言語推論のデータセットで、前提文が仮説文に対して「含意」「矛盾」「中立」のラベルが付与されている。どちらも画像に付与された２つの説明文から作成。

**質疑応答**
与えられた質問に対する答えを出力するタスク
JSQuADはwikipediaの記事から抽出し、人間が適当な質問を作成してデータセットを作成。
JCommoonsenseQAは、常識推論能力評価するための他選択式質問応答のデータセット。

ー感情分析モデルの実装ー
pytorchのモデルにデータを入力するforward関数（前向き計算）
１：クラスが初期化されるときに__init__メソッドが定義されてモデルの構造決まる
２：モデルにデータ与えると、forwarf関数が呼ばれる
３：forwarf関数内、データは__init__で定義した層を順番に通過
４：データが最後の層を通過した後、returnで帰ってくる

# 参考文献
- [大規模言語モデル入門](https://amzn.asia/d/3xTMT8o)
chpasswd コマンドを使ってパスワードを非対話的に変更する

passwd コマンドは色々聞いてくるし、既存のパスワードが必要。

RedHat 系の Linux だと --stdin コマンドがあるらしいけれども、Debian 系はそのオプションは使えないようだ。

代わりに chpasswd コマンドを使う。


# 環境

- Debian Testing (2024/7/6時点のDebian 13)

# chpasswd の実行権限を調べる


フルパス指定すれば root でなくても実行できるけれど、操作していると認証トークン操作エラーとなる。
```
$ /usr/sbin/chpasswd
.
.
.
chpasswd: (user a) pam_chauthtok() failed, error:
Authentication token manipulation error
.
.
.
```
結局、  sudo つけて実行することにします。


```
$ sudo chpasswd
nanbuwwks:hogehoge
```
ここまで入力しエンターしたら、Ctrl+D で終了する。そうすればユーザ nanbuwks のパスワードが hogehoge となる。

# 非対話的に実行

以下のようにすればOK
```
$ printf "nanbuwks:hogehoge" | sudo chpasswd 
```

しかしながらプロセス情報からパスワードが見えてしまうので、このやりかたは望ましくない。

# 暗号化したパスワードを chpasswd に渡す
```
$ sudo grep nanbuwks /etc/shadow
nanbuwks:$y$abc$abcdefgh...$abcdefg.....:19910:0:99999:7:::
```
となる。

この $y$ は、yescrypt形式

cf.,https://www.cyberciti.biz/faq/understanding-etcshadow-file/

となっていて、同様のものを以下のように指定すれば良い。

```

$ printf "nanbuwks:$y$abc$abcdefgh...$abcdefg....." | sudo chpasswd --encrypted
```

ここの、暗号化パスワード部分を生成するのは mkpasswd を使い、以下のようにして作る


```
$ echo hogehoge | mkpasswd --stdin
$y$j9T$K1qIOyzqHzYPSmBplHpjC0$uBkDA/frN6YLKZE21XcfIimUWgLcov1Q.kMAIp7hXE0
```

これに、ユーザ名 'nanbuwks:' を頭につけて、

`nanbuwks:$y$j9T$K1qIOyzqHzYPSmBplHpjC0$uBkDA/frN6YLKZE21XcfIimUWgLcov1Q.kMAIp7hXE0`

を用いる。

mkpasswd についての詳細はこちら

「yepasswd で パスワードを生成」
https://qiita.com/nanbuwks/items/5715007b63c454c22c7e

# プレーンテキストパスワードでもセキュアに処理する

よく考えたら以下のようにしてプロセス情報からパスワードが見えてしまうというリスクは、
```
$ printf "nanbuwks:hogehoge" | sudo chpasswd 
```
単にコマンドラインにプレーンテキストパスワードを書いているからだった。

なのでプレーンテキストでも、単に別プロセスから stdin にフレーズを流してリダイレクトすれば良かった。

例としてこのような方法。
```
$ cat | sudo chpasswd

```
cat だと対話的になるけれども、 cat の代わりになるプロセスを動かすと良い。
LambdaのエラーログをCloudWatchで検知しSNSでメール通知を実装する

# はじめに
本記事ではLambda、CloudWatch、SNSを利用してエラーを通知を行います。
CloudWatchに出力されるLambdaのログにおいて、Errorログが吐かれた際にはそれをトリガーとし、対象のメールアドレスに通知を送付します。


# 環境
Python：3.12

# Lambda関数の作成

loggingモジュールを使用して、意図的にエラーを起こすLambda関数を作成します。

```python:lambda_function.py
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    try:
        logger.info("This is an info message.")
        
        # 意図的にエラーを発生
        raise ValueError("Output an error message.")
    except Exception as e:
        logger.error(f"An error occurred: {e}")
        raise e
```

# CWでメトリクスフィルターの作成
CloudWatch > ロググループ から対象のLambda関数のロググループを選択します。
メニューから「メトリクスフィルターの作成」をクリック。
今回は`ERROR`ログに吐かれる事をトリガーにしたいので、フィルターパターンに `ERROR` を入力し次へ進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/685515e8-e9b7-c2da-22de-225b164a1314.png)


メトリクスの詳細では任意の名前と値を記入しメトリクスを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/326270f7-10a3-1cea-b4ac-bf081cf31931.png)


# SNSトピックの作成

通知先の設定のためSNSからトピックを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/549d1bbb-621a-9186-4359-21209a2a8e83.png)

通知先のメールアドレスを設定します。
サブスクリプション > サブスクリプションの作成 から次のように選択。
- トピックARN：上記で作成したリソースのもの
- プロトコル：Eメール
- エンドポイント：任意のメールアドレス

:::note warn
サブスクリプションを作成後、設定したメールアドレスに認証通知がくるので、`Confirm subscription` から登録しておきます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/c1813d93-3ed8-c9bf-b8ab-2941c7ad1bcc.png)


# CloudWatchアラームの作成

CloudWatch > ロググループ から対象のLambda関数のロググループを選択します。
メトリクスフィルターメニューから対象のフィルターにチェックを入れ、「アラームを作成」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/a4de4e6d-e377-e8ec-3d75-b7af8ce79520.png)

任意のメトリクス名を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/84c87e99-aa76-cd67-d100-eaea07242f6e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/43c0e1ef-a269-0eb0-2117-890b4d5f5a0d.png)

通知の送付先にはSNSで作成したトピック名を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/76105512-f903-86e9-f530-e27e36af605f.png)





# 動作確認

Lambdaをテスト実行し意図的にエラーをだしてみると、1分後くらいにメールが届いている事を確認できました。
CloudWatch > アラーム から対象のアラーム名を選択し、履歴メニューからも正常にアラームが実行されいている事を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/5484ce37-2028-78db-59b1-57be3c65019c.png)

:::note warn

設定したメールアドレスに通知が来ないときは、SNSの暗号化の影響の可能性があります。

参考：https://dev.classmethod.jp/articles/tsnote-sns-topic-policy-encryption-cloudwatch-001/

:::


# 参考

https://dev.classmethod.jp/articles/tsnote-sns-topic-policy-encryption-cloudwatch-001/

https://www.ryucom.co.jp/blog/aws/4255/

https://qiita.com/poyopoyo7254/items/8f3f9db11376c8a1be37
TCP/IPについて知見を深める②

IEEEとIEFT
----------------
ほとんどのプロトコルはIEEEとIEFTの二つの団体によって表現されている

**IEEE**
比較的ハードウェアの処理に近いプロトコルを標準化している
電気電子技術学会の略省がIEEE
ハードウェア寄りのネットワーク技術の標準化は**IEEE802委員会**で研究・議論がされている
**IEEE802委員会**
ワーキンググループ（WG）とタスクフォースの2階層で構成されており、WGはIEEE802の後ろにドットと数字をつけて識別している
タスクフォースはWG名に1桁あるいは2桁の英数字をつけて識別されている
![8159553e1072-20220720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162351/e4acc84b-e73a-b3ef-e55a-7fdac943753f.png)

**IEFT**
比較的ソフトウェアの処理に近いプロトコルを標準化している
IEFTで標準化されたルールはRFC （Request For Comments）で文章化されてネット上に公開される
RFCには遠し番号が付与されていて、更新があるたびに新しい番号が追加されるような仕組みになっている

カプセル化と非カプセル化
-----------
**カプセル化**
送信する際にペイロードにヘッダーをくっつけてPDUにすることで一つ下の階層に渡す。
その際に、ヘッダーを付加する処理のことをカプセル化と呼ぶ
**非カプセル化**
受信する際に、それぞれの階層でPDUからヘッダーを取り外してペイロードのみを次の階層へと渡す
ヘッダーを取り外す処理のことを非カプセル化と呼ぶ
![3-2-2-1200x598.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162351/beeef578-e96b-cf6f-2503-15d95eaf88bc.png)

コネクション型・コネクションレス型
------
コネクション型
-----------
データのやり取りを行う際に、電話でやり取りをするように、「(データを)送りますよ？」と伺い、コネクションを確立してからデータのやり取りを行う
しっかりとした手順を踏んでやり取りをしているため、転送には若干の時間がかかってしまうものの確実にデータを送信することができる

コネクションレス型
-----
相手側の状況にかかわらず、いきなりデータを送り付けてコネクションを確立して勝手に終了する
コネクション型のような手順を省いているため、転送に時間はかからないものの、確実に転送できているという確実性は高くない(勝手に送っているから)
 
 
 
**よく使われているプロトコルについても今後調べていこう！**




物理アプライアンス
---
データリンク層以上で動作するネットワーク機器
視認することができる装置
サーバーラックに搭載されていたり、家電量販店のネットワーク機器を想像するといいらしい
・パケット処理を行うソフトウェアが動作するために最適なハードウェアで構成されている
　簡単な処理であったり、複雑な処理であったりの区別を専用のハードウェアに任せることで処理の効率化を計って
  いる

仮想アプライアンス
-------
仮想化ソフトウェア上で動作するネットワーク機器を指している
仮想化ソフトウェアを利用することで、OSやメモリ等を分割して、OSに割り当てることで物理サーバーからの分割の実現ができる

ネットワーク
---
**LANについて**
---
Local Area Network
LANはLANでも家庭環境で使われているLANと接続端末が非常に多い企業ではネットワーク機器の性能と機能に大きな違いがあります
企業が使うLANは接続端末が非常に多い場合でもパケット処理をさばく為、**冗長化機能**や**L2ループ防止機能**
等のネットワークの運用の継続性を担保する機能を持つ機器で構成されている
企業内LANの端末はアクセスポイントやエッジスイッチ(L2スイッチ)に接続を行った後にエッジスイッチを集約するコアスイッチを経由してネットや社内サーバーに接続する仕組みになっている


WANについて
-----------
**Wide Area Network** 距離的に遠く離れた範囲のネットワークのこと
インターネットと閉域VPNで大別できて、用途も大きく違いがある


インターネット
----
誰でも使ったことがある**公衆WAN**のことを指す


閉域VPN
----
物理的に離れてしまっているLANとLANを接続するネットワークのことを指す
自前で構築することもできるし、通信事業者のWANサービスを使って構築することもできる


DMZについて
---
**DetMilitarizedZone**　インターネットに公開するサーバーを設置するネットワークを指す
サーバーが提供するサービスを安定稼働させるためにも必要不可欠なのが**冗長化**
どこかしらのサーバーが壊れたとしても経路が切り替わることでサービスを提供できるようにしている
→同じ種別のネットワーク機器を並列に配置している
大体こんな感じ
↓
![img_redundant02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1162351/8c206a5d-7751-e614-0287-404b66f55f06.png)
SESで働いて感じていること

2019年から現在に至るまで、SESで働いています。
個人的には、まだ2社の経験だけですが、お客様に恵まれていることもあり、楽しみながら業務出来ています。
自身の振り返りの意味も込めて、メリット・デメリットをまとめてみたいと思います。

## メリット
### ①お客様に直接フィードバックをいただける
開発等のPJを無事に成功した場合に、お客様に直接フィードバックいただけることで、やりがいに繋がっています。
自分が介在したことで、喜んでもらえたという実感が持ちやすい環境だと考えています。

### ②幅広い業務に携われている
これは、現在のお客様先での話ですが、お客様先の社内SEとして業務しており、多くのPJに携わらせていただいています。
基幹システムの運用・保守、クライアント環境改善業務、RPAの開発、DAPの導入・支援等、多岐にわたる業務を携わらせていただけることは、メリットに感じています。

### ③合わない業務・人に直面しても、期限付きだと思うと気が楽になる
多くの場合、SESでの仕事は数年単位で常駐先が変更になると思います。苦手な業務や人と出会った場合でも、どこかで「期限付きだから」と思うと、気が楽になった経験があります。
一方で、その期限内で、苦手な業務を克服したり、苦手な方とうまくコミュニケーションが取れるようになった経験もあります。それが、仕事をする上での自信に繋がった部分もあるなと思っています。

## デメリット
### ①社内外問わず、人間関係が希薄になる傾向がある
社内においては、同じ常駐先以外の方は、帰社日や社内懇親会等の限定的な場でしかあわない場合があります。
お客様先においても、外部の人ではあるので、一定の距離を取られる場合もあると思います。

ただ、自分が意識的にコミュニケーションをとるようにしておけば、さほど気にならない部分ではあると思っています。
私も最初こそ、同じ常駐先の人としか話できなかったですが、時間がたつにつれて社内の人間関係を広げることはできました。

### ②単価アップが容易ではないので、売上を一気にアップすることは難しい
これは、現在も悩んでいるところではあります。
完全常駐で、かけもちが難しいので、一気に売上をアップするということができていません。例えば、増員を提案したり、スポットで持ち帰りの開発案件を受注したりしたことで、別途売上を立てられたことはありました。

他に思いつくこととしては、より技術をつけて、SESの形態であっても高単価の案件に参画するというやり方もあるかなと思っています。

## まとめ
メリット・デメリット整理してみましたが、改めて充実した働き方ができているかなと感じました。

今後は、自身の市場価値がどれほど高まっているかを把握するためにも、業務とは別に、客観的に自分を評価してもらう環境に身を置くことも重要だと考えています。
Qiita Zenn どっち？全くのブログ初心者がQiitaを選んだ理由

# Qiita Zenn どっち？全くのブログ初心者がQiitaを選んだ理由

こんにちは、深尾と申します。これまで、多くの先輩エンジニアの方々が残してくださった技術ログにお世話になってきました。プログラミング歴も二年目になり、そろそろ自分も何か還元をしなくてはと思い技術ログを残そうと考えました。そこで、技術ログを残すプラットフォームとして人気の「Qiita」と「Zenn」を比較検討し、最終的に自分がQiitaを選んだ理由をお伝えします。

## 1. QiitaとZennの比較

両方とも有名なサービスですので、どちらか片方にしかない個人的に魅力があると感じる特徴を挙げて比較したいと思います。

### Qiitaの特徴

1. **ユーザー数が多い**  
Qiitaは2011年スタートのサービス(Zennは2020年)だけあって、多くのエンジニアが利用しています。その分、情報を発信する際に多くの人に見てもらいやすいです。
　　
1. **SEOが強い**  
技術ログを残しても誰の目にも入らなければ意味がありません。となると必然的にSEOは気にするべきです。その点、Qittaで投稿すれば全く無名の人の投稿が上位検索結果にも出ることもある事からSEO対策はバッチリと言えます。
(皆さんが自分の初投稿を読んでくださっているのが何よりもの証拠です笑)
　　
1. **Google Analyticsとの連携ができる**  
QiitaはGoogle Analyticsと連携することで、投稿の閲覧データを詳細に分析できます。これはZennにはない魅力的な機能です。

### Zennの特徴

1. **広告なし**  
Zennは広告が一切表示されないため、ストレスフリーで快適な閲覧体験を提供します。
　　
1. **技術系以外の内容でも書いて良し**
Zennでは記事を公開する際にTech(技術)とIdea(技術以外)と二つのジャンルを選べるようになっており技術系以外の記事も書きやすいです。Qiitaは場合によっては技術ブログ以外は削除される可能性もあるそうです。
　　
1. **対価を得られる可能性あり**  
Zennでは、質の高い技術や情報を電子書籍にして販売することができるため、収益化のチャンスがあります。

## 2. なぜQiitaを選んだのか

上記の比較を踏まえ、私は以下の理由からQiitaを選ぶことにしました。

 - プログラミングを初めたばかりの頃の自分が躓いた部分の解決方法を記事にする事がこの一年の還元になる
 - 現段階で有料化する程の高度な技術力が無い
 - Qiitaを通してブログを書くことに慣れてきたら、技術系以外の記事はWordPressで作成した自身のサイトで投稿できるから

これが私がQiitaを選んだ理由です。これから少しずつ技術ログを投稿していきますので、どうぞよろしくお願いします！
大学院入試 微分方程式 y'-y/x=logx,x>0「東大大学院 工学研究科2023年入試問題 微積（極限、微分方程式）」2-1.だけ　をChatGPTとsympyとWolframAlpha でやってみたい。

# オリジナル
・Basic-Advanced-Math courses(元大学教員による数学解説) 様　
　youtube (00:00〜12:43)の内(2.1)だけ(3:29〜6:33)

https://youtu.be/nFQ_Q_AySUU?t=209

・公式ホームページ
　私の探し方が悪いのか、見つかりませんでした。

# ChatGPT-3.5先生へ。
　はじめから、「日本語で」を追加してもいいです。
```
y'-y/x=logx,x>0
```
回答省略(英語です)
```
y'-y/x=logx,x>0
日本語で
```
```
sympyのソースコード
```
以下抜粋
```python
import sympy as sp

# 変数と関数の定義
x = sp.symbols('x')
y = sp.Function('y')(x)

# 微分方程式の定義
ode = sp.Eq(y.diff(x) - y/x, sp.log(x))

# 微分方程式を解く
solution = sp.dsolve(ode)

# 結果の表示
solution
```
...
y(x)=x(C1+(logx)^2/2)
ここでC1は任意定数です。

# WolframAlphaで,できませんでした。
???

https://www.wolframalpha.com/input?i=y%27-y%2Fx%3Dlogx%2Cx%3E0&lang=ja

https://www.wolframalpha.com/input?i=y%27-y%2Fx%3Dlogx%2Cx%3E0+%E3%82%92%E8%A7%A3%E3%81%91&lang=ja

# sympyで(オリジナル 様の方法で)
???勉強中です。???

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

・以下ができたら、助かります。指定と全部です

https://qiita.com/mrrclb48z/items/555d85face87552c34fb

https://qiita.com/mrrclb48z/items/5f57eac92aaca30e85c0

# いつもと違うおすすめです。
sympy.solvers.ode.dsolve(eq, func=None, hint='default', simplify=True, ics=None, xi=None, eta=None, x0=0, n=6, **kwargs)

https://docs.sympy.org/latest/modules/solvers/ode.html
【Android Studio】Koala: UIを元に戻す方法

# はじめに
Android Studioを新規にインストールして起動した場合、親の顔よりも見たいつものUIではなく少々面食らったので元に戻す方法を記す。

Jebrains系のIDEのデフォルトのUIっぽいので、Android Studioもデフォルトがそれに合わせたのか？
また、KoalaでデフォルトのUIが変わっていましたが、前バージョンのJellyFishとか以前のバージョンからかもしれません。ちょっとこの辺り自信無いのでご了承下さい。

使用環境は以下の通り
・Mac OS Sonoma 14.5
・Android Studio Koala | 2024.1.1 

# KoalaのデフォルトのUI
機能自体は基本変わっていないですが、UIが大分変わっており違和感しかない。。
![スクリーンショット 2024-07-06 19.21.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/d9654a85-215a-c59e-bc0b-5ce38d5ce3ec.png)

# 元のUIに戻してみる
MENUのAndroid Studio > Settings...　を選択
![スクリーンショット 2024-07-06 19.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/b9d61a0c-4f51-300e-ea8f-64f0b20a2a42.png)

Appearance & BehaiviorのNew UIを選択すると、New UIを有効にするかどうか設定可能な画面を表示することができる。
以下ScreenShotのように"Enable new UI"を無効化し、OKボタンを押下
![スクリーンショット 2024-07-06 19.21.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/fb6d3d6e-32db-9e37-854f-5c6623d1d952.png)

Android StudioをRestartすることを要求されるので、素直にRestartしてください。
そうすると、よく見るUIが復活します。
![スクリーンショット 2024-07-06 19.22.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/a1dd981c-ea8e-ac4e-d2d9-c72fdf351945.png)

こうしてみるとOld UIはごちゃっとしており、New UIはスッキリしたUIになっていて良いのかも？
まあ、あとは慣れですよね。。

# Tips：Project内のコードを見ようとすると、何らかのタイミングで見れなくなる場合
これは完全に補足です。
本記事の本筋とは関係無いですが、意外とハマった現象なので記載しておきます。

現象としては、コードを修正したりシミュレータを起動したりしていると、以下のようにProject内のコードが展開されなくなりました。。
![スクリーンショット 2024-07-06 19.06.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/3d2c8c93-e1dd-948f-a7f1-6ffbd60111ba.png)

Projectをダブルクリックしたり、Syncし直したりすると、
以下のようにソースが展開され見れるようになる謎の現象が発生しました。。
![スクリーンショット 2024-07-06 19.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782130/fc78e7fa-6a2f-b2f4-1547-1ab306207d9c.png)

Android Studioの設定をガチャガチャいじっても全く現象が改善されず、
Invalidate and Restartでキャッシュ消して再起動もダメ。。

結局、<font color="Red">**Macを再起動**</font>したら直りましたw

以上