OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerのimages消したのにPC容量が減らない WSLが原因かも！

# 概要
Dockerを使った後container images を削除したのにディスク容量が減らないということが起きまし。色んな記事を見ていく中でwsl2が原因というものが多く見受けられました。ボクもそれで苦しんでいたので共有します。
# 簡単な説明
WSL2では.vhdxファイルという仮想のハードディスクファイルを使用してデータを保存しています。つまりこのファイルを小さくできないかという話です。
イメージとしては.vhdxがペットボトルで中のデータが水だとすると水は飲み干して空っぽなのにペットボトルの空が容量を圧迫しているわけですね。
# 解決策
#### 1.wsl2の停止
wsl2の状態を確認した後に稼働していれば停止します。
```CMD:コマンドプロンプト
#wslの状態確認
wsl -l -v 
#wslを停止
wsl --shutdown
```
#### 2. wsl2の仮想ディスクのパスを特定
ボクの場合 C:\Users\{ユーザー名}\AppData\Local\Docker にありました。windows環境によって違いますが、他に見た記事だと `C:\Users\{ユーザー名}\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_xxxxxxx\LocalState\ext4.vhdx` の場合もあるようです！

::: note warn
警告
記事やお使いの環境によってはコマンドプロンプトが管理者として実行するかしないかでエラーが出たりでなかったりするのでうまくいかなかったら両方試してみてね
:::

#### 3 .vhdxファイルの最適化
``` CMD:コマンドプロンプト
Optimize-VHD -Path <1で特定した.vhdxファイルのパス> -Mode Full 
```
環境によってはOptimize-VHDが効かないこともあるようです(ボクは効きませんでした)そんな時は4をお試しください
#### 4.Optimize-VHDが効かない時
diskpartで最適化をします。以下が手順です。
```CMD:コマンドプロンプト
#diskpartに移動
diskpart
# さっき見つけたvhdxを指定
select vdisk file="<1で特定した.vhdxファイルのパス>"
# 開く
attach vdisk readonly
# 最適化する
compact vdisk
# 接続を切る
detach vdisk
```
# 終わり
データサイエンスの環境構築をする中でDockerでつまずいたことがあったので君たちの役に立てばと思い投稿してみました。

これからもよろしく！応援しています。
二台目の猛牛さん

先日秋葉原の最終処分場で確保してきました。

![IMG_20240211_143132.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/e99f7ba3-cc7d-5486-9d03-ba5e23bd6980.jpeg)

表面が加水分解してべたべたになっています。

ネットを参考にばらしましたが、プラがバリバリ割れました。側から基板をはずしてアルカリ系の洗剤で洗って乾かしました。

一台目はこれの後継なのですが、そちらのほうが分解は楽でした。

![IMG_20240216_140621.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8833d4fd-1dab-a990-44f4-00eaa20ef05f.jpeg)

uartにコネクタを付けてみました。

なんとこれは512MByteもメモリを積んでいます。後継は256MByteでした。また後継はUSB3だけなのですが、こちらはUSB2とUSB3が出ています。

基板の裏には未実装のSPI Flash(SOP16)のパターンがあります。

ヒートシンクを張り替えました。

![buf2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/be9f0924-14ab-642b-2ee9-bfc322ffcd12.jpeg)

こちら側の蓋を先に外すのが正解のようです。
SwiftLintの「Currently running SwiftLint x.y.z but configuration specified version a.b.c.」エラーの解決法

SwiftLintの記事はシリーズになっています。
記事を順番に読み進めると、SwiftLintを使いこなせるようになります。

- [Swiftの静的解析ツール「SwiftLint」のセットアップ方法](https://qiita.com/uhooi/items/bf888b53b4b8210108aa)
- [SwiftLintの全ルール一覧(Swift 4.2版)](https://qiita.com/uhooi/items/7f5d6cf2b240f60ba1ed)
- [SwiftLintで追加・変更・廃止されたルールまとめ(Swift 4.2→5.1.2版)](https://qiita.com/uhooi/items/8e9767c2e746f4171ded)
- [SwiftLintで追加・廃止されたルールまとめ(Swift 5.1.2→5.3.1版)](https://qiita.com/uhooi/items/10b9e49d3bd6f1344cad)
- [SwiftLintのオレオレカスタムルール一覧](https://qiita.com/uhooi/items/9deb56416aaa81709f69)
- [SwiftLintのAnalyzeを使って高度な解析をする方法](https://qiita.com/uhooi/items/655655f56be8bd94b06d)
- [SwiftLintの設定ファイルをサーバーに配置して共有する方法](https://qiita.com/uhooi/items/b5b26caeeefd8dbe1afd)
- SwiftLintの「Currently running SwiftLint x.y.z but configuration specified version a.b.c.」エラーの解決法　__←イマココ__

## はじめに

SwiftLintで以下のエラーが発生して困ったことはありませんか？
私は何回もあります。

```shell-session
Currently running SwiftLint 0.53.0 but configuration specified version 0.47.1.
```

本記事ではこのエラーの解決法を紹介します。

## 環境

- OS: macOS Sonoma 14.2.1 (23C71)
- Swift: 5.9.2

## エラーの解決法

`./LokiPackage` に `Package.swift` が存在するとします。

SwiftPMを使っている場合、パッケージがリントの対象になっている可能性があります。
`rm -r ./LokiPackage/.build` を実行してエラーが解消されたらパッケージが悪さをしています。

`.build` フォルダをリントの対象外にすることで、エラーが発生しなくなります。


```diff_yaml:.swiftlint.yml
excluded:
+ - LokiPackage/.build
```

私はなぜか `LokiPackage/Sources/.build` と指定していたので修正しました。
元から誤って指定していたか、どこかのタイミングで `.build` のパスが変更されたかはわかりません。

https://github.com/uhooi/Loki/commit/732737b01cfc5b018911999503090722c12963be#diff-7109ad4ca9c6e705a8da290e7cb2898a679b0f8f1f4712d082dee256230d6a1fR226

https://github.com/uhooi/Loki/pull/222

## おわりに

これで長年困っていたSwiftLintのエラーの原因と解決法がわかりました。

もしSwiftPMを使わずにこのエラーが発生する場合も同じ原因の可能性が高く、SwiftLintの `included:` と `excluded:` の設定を見直してみましょう。

## 参考リンク

- https://twitter.com/the_uhooi/status/1751923518152098221
- [Set minimum required SwiftLint version · Issue #2592 · realm/SwiftLint](https://github.com/realm/SwiftLint/issues/2592#issuecomment-1023338926)
『狄島夜話記』におけるアイヌ語の音写

釋天嶺『[狄島夜話記](https://kokusho.nijl.ac.jp/work/3510029)』(享保19年)は、東北大学附属図書館に手書きの紙折本と巻子本が所蔵(請求記号 丙C/3-13/4)されており、内容の一部が釋天嶺『[松島夜話](https://kokusho.nijl.ac.jp/biblio/29162941/)』(松島: 東礬, 元文3年)卷之下に再録されている。これらのうち『狄島夜話記』の巻子本を、縦書き崩し字と戦いつつ、私(安岡孝一)なりに文字起こししてみた。

> 　狄島夜話記
> 支竺桑三國名勝志流布于
> 世東奧邊塞之志記如不
> 聞見余住于此日有大和當
> 麻之巡國僧梅氏者听松
> 前狄千島臼岳有善光寺
> 如来游舎東行参礼畄于
> 松府数旬月帰日又来松
> 島話其嶋物色命童侍
> 記之曰狄嶋在松前府東
> 西而舩路兩行疏矣厥東
> 距松府歴五百餘里嶋濱
> 五十餘所行々至喜伊達
> 不島是松府朝覲狄族也
> 其間去府三十里可有波古
> 多天嶋兹松府商民家居
> 復従此處阻四十五里有臼
> 岳一座山松府道俗𮚁糧
> 詣之便善光寺如来之游
> 舎者也復厥西距松府四
> 百餘里嶋数廿五六所至相
> 也所皆松府朝来之狄也
> 其間有久末伊之濱去府三
> 十里許松府商人家居
> 然而此相也之表嚮千里
> 可皆松前不庭之夷狄也
> 松府曰之赤狄此舩路逼北
> 高麗韃靼地也復是相
> 也近濱有加羅不途島
> 此處夷狄恒入北高麗購
> 金地等織物或巣玉来買
> 賣松前府俗曰之加羅不
> 途織加羅不途玉此玉實
> 瓦陶也又此相也近邊山沢
> 薮野中夏秋之交鶴雁
> 相鳩葺巣孚子等秋
> 尾子又赴諸夏暖國是
> 世俗曰鶴雁先春帰塞
> 者是也復此方従府阻二
> 百六十餘里有伊之加利島
> 俚俗傳言昔判官源氏逃
> 扵衣川流浪此地嶋之
> 里魁其名鬼岩者持羙
> 媳一子看源氏雄機配
> 之源氏聿戻止焉云此
> 濱夷族至今身羙婦
> 子故曰羙女島也竒熊有
> 謂矣従是畨俗威源氏
> 為神天思矣因崇之
> 曰久畄部加茂伊蓋加
> 茂伊仰神天主君之畨
> 語也復此伊之加利有
> 大河横三里可川遡百
> 里餘鮏魚夥矣乹鮏名
> 産此所方物也然而觀
> 其人物男子鬆髮不結
> 耳着扵環女子環有
> 組緒衣服皆単之
> 葛布限扵膝矣所謂
> 被髮左襟者也靣㒵眉
> 間一莖眼子丸而如鳥目
> 男子色黒四肢葺毛力
> 量弱也女子極而色白
> 項力強矣樵山負薪
> 額系千斤又能入水中
> 歴時不息漁游恣意
> 唇吻与爪甲黛矣似知
> 愧掩兩乳男女不着履
> 平生赤脚彳亍然足
> 跟不穢游行徐歩急
> 走如飛赴大小行堀沙
> 屏汚是恐日月照臨之
> 天威也是故不造厠云
> 平生調度只佩刀一口耳
> 彫角刻木或造燕器類
> 工巧精妙非和人所覃
> 見其食料得米釅酒
> 不知做飯朝夕食事
> 禽獣魚肉烹魚油喰
> 不喰塩味鹵水日々獲山
> 幇閑充棟云復見其氣
> 性得物報人又不典不取
> 不与矣常訪隣家夫
> 主不處不入其扄固避婦
> 疑也苟有直有義乎吁
> 夷狄有義勝諸夏罔矣
> 復耳常語和人曰志也
> 茂神天主君曰加茂伊僧
> 人曰部素利男子曰阿以
> 農女子曰免農古之米子
> 曰志也末奴飯曰阿末茂酒
> 曰部幾利烟筒曰㔟礼保
> 等畨語不乙也然松府
> 狄島行程有東西而
> 舩路疏矣其巡行前
> 程㑒落北狄也故古来
> 松前狄島用此狄字云
> 復松前狄千島之
> 総管也將帥也云々
> 夜話已了更點鐘
> 鳴為梅氏告罷云
> 享保十九秊夏日記
> 　三住花園燕山中興
> 　現松嶋瑞岩天嶺
> 　書于所居蓮華軒
>
> 　斯歳七月十日
> 太守中將尊官見抂
> 　玉轅扵松島之日
> 　𣴎
> 尊命書此記奉
> 　呈進
> 　　　　性空 典

ざっと読んだところでは、喜伊達不、波古多天、相也、久末伊之、加羅不途、久畄部加茂伊、伊之加利、志也茂、加茂伊、部素利、阿以農、免農古之、志也末奴、阿末茂、部幾利、㔟礼保、あたりが音写に見える。順にカタカナで書くと、キイタㇷ゚、ハコタテ、ソウヤ、クマイㇱ、カラㇷ゚ト、クㇽぺカムイ、イㇱカリ、シャモ、カムイ、ペスリ、アイヌ、メノコㇱ、シャマㇴ、アマㇺ、ペケㇼ、セレポ、あたりだろうか。ただし、佐藤知己『[18世紀前半のいくつかのアイヌ語資料について](http://hdl.handle.net/2115/35668)』(北海道大学文学研究院紀要, Vol.127 (2009年2月), pp.29-58)は、多少、異なる読みを示しているので、前後の漢文も含め、もう少し検討する必要があると思う。
JavaでAESWrapアルゴリズムを試してみる

今更ながらJavaでAESWrapアルゴリズムを試してみた
``` java
		// Java Version
		System.out.println("Java Version: " + System.getProperty("java.version"));

		// キーを初期化（例として16バイトの0で初期化）
		byte[] keyBytes = new byte[16];
		SecretKey key = new SecretKeySpec(keyBytes, "AES");

		// Cipherインスタンスを初期化
		Cipher cipher = Cipher.getInstance("AESWrap");

		// アルゴリズムの確認
		System.out.println("Algorithm: " + cipher.getAlgorithm());

		// 両方のCipherインスタンスで同じキーを使用して暗号化し、結果を比較
		cipher.init(Cipher.WRAP_MODE, key);

        // テスト用のデータを乱数で生成
        SecureRandom random = new SecureRandom();
        byte[] toWrap = new byte[8]; // 8バイトのデータ
        random.nextBytes(toWrap);
		byte[] wrapped = cipher.wrap(new SecretKeySpec(toWrap, "AES"));

		// wrapped と値を16進数の文字列として出力
        System.out.println("Wrapped: " + bytesToHex(wrapped));
```
Git コマンドを使って、特定のコミットにのみタグがついているかを確認する

Git コマンドを使って、特定のコミットにのみタグがついているかを確認する方法は直接的なものではありませんが、以下のアプローチで目的を達成できます。

### 現在のコミットにのみついているタグの確認方法

現在のコミット（`HEAD`）についているタグを確認するには、以下のコマンドを使用します。

```bash
git tag --points-at HEAD
```

このコマンドは、現在のコミット（`HEAD`）を指しているタグのリストを出力します。このリストに表示されるタグは、現在のコミットに直接関連付けられています。

### 一つ前のコミットにのみついているタグの確認方法

一つ前のコミットについているタグを確認するには、まず一つ前のコミットの識別子を取得し、そのコミットを指しているタグを確認します。以下の手順を使用します。

1. **一つ前のコミットの識別子を取得**:

    ```bash
    git rev-parse HEAD^
    ```

    このコマンドは、現在のコミットの親コミット（つまり一つ前のコミット）のハッシュを出力します。

2. **一つ前のコミットについているタグを確認**:

    ```bash
    git tag --points-at <一つ前のコミットのハッシュ>
    ```

    ここで `<一つ前のコミットのハッシュ>` は、先ほど取得した一つ前のコミットのハッシュです。

これらの手順を実行することで、現在のコミットとその直前のコミットについているタグを確認することができます。ただし、これらのコマンドはコミットに直接関連付けられているタグのみを表示し、そのコミットを含むブランチの履歴全体にわたるタグは表示しません。
number_field_tag に設定オプション「step」を使って小数点を設定する

# 概要
number_field_tag に、小数点を入力できない！とお思いの方に有用です。

# 対象
- number_field_tag に小数点入力ができる設定方法を探している
- stepの書き方 早見表を見たい方
    - step: 1 
    - step: 0.1
    - step: 0.01
    - step: 0.001

## 基本形

```shell:型
number_field_tag(要素名, value値=nil, オプション={})
```

が number_field_tag の型です。

```ruby: step
number_field_tag 'price', nil, step: 1
```


## 早見表
### step: 1 を設定
```ruby: step
number_field_tag 'price', nil, step: 1
```
**満たさない場合の結果**
![number_field_tag_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/5e284085-9957-1b16-7bf3-01ce22370419.png)

### step: 0.1 を設定
```ruby: step
number_field_tag 'price', nil, step: 0.1
```
**満たさない場合の結果**
![number_field_tag_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/6cb26d41-588e-6b64-8e1b-2627abe784b3.png)

### step: 0.01 を設定
```ruby: step
number_field_tag 'price', nil, step: 0.01
```
**満たさない場合の結果**
![number_field_tag_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/29e46c7c-f64c-75e5-41a3-a5b8e157e898.png)

### step: 0.001 を設定
```ruby: step
number_field_tag 'price', nil, step: 0.001
```
**満たさない場合の結果**
![number_field_tag_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/79a53359-f39d-9649-bdb1-8ad5ff62730e.png)

# 一言
- 設定オプションは**第三引数**に設定すること！！
socatで作った仮想シリアルポートをDockerコンテナにマウントする

# はじめに

ロボット開発などでUSBデバイスをDockerコンテナで使うために、以下のように`--device`オプションを使って
USBデバイスをコンテナにマウントすることがあるが、USBデバイスが接続されていないときは `docker container start`でコンテナを起動できない。

```bash
docker run --rm -it --device=/dev/ttyUSB0:/dev/ttyUSB0 ubuntu bash
```

/dev/ttyUSB0がないとき

```bash
$ docker run --rm -it --device=/dev/ttyUSB0:/dev/ttyUSB0 ubuntu bash
docker: Error response from daemon: error gathering device information while adding custom device "/dev/ttyUSB0": no such file or directory.
```



そこでsocatを使って仮想シリアルデバイスを作ることで、USBデバイスが接続されていない状態でもDockerコンテナが起動できるようにする。


# socatのインストール

```bash
sudo apt update
sudo apt install socat
```

# 仮想シリアルデバイスの作成


```bash
sudo socat -d -d pty,link=/dev/ttyUSB0,raw,echo=0 pty,raw,echo=0
```

docker run する

```bash
docker run --rm -it --device=/dev/ttyUSB0:/dev/ttyUSB0 ubuntu bash
```

docker コンテナで/dev一覧を見ると`ttyUSB0`があることが分かる。


```
root@21092250cb7d:/# ls /dev
console  core  fd  full  mqueue  null  ptmx  pts  random  shm  stderr  stdin  stdout  tty  ttyUSB0  urandom  zero
```




# 参考

https://qiita.com/xy2e45/items/5d3ff0a649b2e7172757

https://qiita.com/optimisuke/items/10909322e4041b7c5ea2
macにwarpを導入してvscodeと連携させる

## 手順

### warpを公式サイトからダウンロードする

https://www.warp.dev/b

### Raycastをダウンロードする

https://www.raycast.com/

### Raycastでショートカットを追加する

1. `option + スペース` を押して、raycastを開く
1. extensionsを検索しクリック
    ![スクリーンショット 2024-02-16 13.37.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328421/cf1beeec-4102-46bc-bd81-f60fd13e19cb.png)


1. Extensionsでvscodeを検索し、Hotkeyを設定する
    ![スクリーンショット 2024-02-16 13.38.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328421/77342a76-7a21-b413-455d-596d455a9c32.png)

    変更後、設定したショートカットキーを押すと、VSCodeがフォーカスされる

1. Extensionsでwarpを検索し、Hotkeyを設定する

    ![スクリーンショット 2024-02-16 13.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328421/563cb7ac-9839-6153-e470-62441ef55ae8.png)
    変更後、設定したショートカットキーを押すと、VSCodeがフォーカスされる

1. VSCodeのデフォルトの外部ターミナルを変更する

    `command + ,` でSettingsを開いた後、terminalを検索する。
    `Terminal.app`となっている箇所を`Warp.app`に変更する
    
    ![スクリーンショット 2024-02-16 13.45.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328421/15fe9828-e852-e1ba-c1a4-f3d6d0813142.png)

    変更後、vscodeがフォーカスされている状態で`command + shift + C` を押すと、Warpが開かれるようになる。

## 参考

https://www.warp.dev/b

https://www.raycast.com/

https://tokizuoh.hatenablog.com/entry/2023/05/08/202702

https://www.warp.dev/blog/how-to-open-warp-vscode
Reactで学習記録アプリ作ってみた

# はじめに
僕は現在1ヵ月本気で技術力向上を目指していて、今日はその2日目です。JISOUというサービスのもとコーチングを受けています。

udemyの講座をひとつ完了させたので、今回は簡易的な学習記録アプリを作ってみたので、備忘録のような感じでまとめていきたいと思います。

初投稿の記事
よかったらぜひ読んでみてください！

https://qiita.com/shunii/items/c5ed2e55e05621f86795


# アプリの機能紹介
初期画面
![スクリーンショット 2024-02-16 120345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554025/3336c039-79a6-c1e8-2d4a-861f33901544.png)

学習記録の追加後
![スクリーンショット 2024-02-16 120601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554025/cd48c950-0ffd-1e63-17d9-e0ed9eaaa976.png)

基本機能
- 入力中の学習内容と時間の確認
- 登録ボタンを押すと学習記録を残せる
- これまでの総学習時間を表示する

特にUIにはこだわりませんでしたが、機能の実装をなるべく早く行えるように頑張りました。

# 『状態管理はつらいよ』
僕が特に苦戦したところは状態管理です。前回の記事でも状態管理が難しいという話をしたのですが、アウトプットを行う際もやはり強敵でした。

しかし、TODOアプリの開発と似ている側面が多くあったので進めやすかったです！じゃけぇさんのudemy講座に感謝(泣)

前回の記事にも書いたので繰り返しになるのですが
***変更されるのはどこか***ということを常に意識することが大事になってくる改めてと思いました。
今回のアプリでいうと、
- inputに入ってくる値(学習内容と時間それぞれ)
- エラー(inputに入力されていない項目がある)
- 学習記録

# 問題点と疑問点
学習時間をinputで受け取る際に文字列が入ってこないように*type="number"* と指定していたのですが、合計時間を計算してみた際になぜか文字列の連結と判断されてしまっていたようで、1時間と2時間の学習記録の合計時間が12時間、といった表示になってしまっていました。

# 解決方法
結論
parsIntメソッドを使った。

文字列と判断されてしまっていたようなので整数に変換しました。
けれどなぜnumber指定していたのに文字列扱いになっていたのでしょう…

その答えがこちら
```jsx
<input
    type="number"
    min={0}
    value={studiedTime}
    onChange={(e) => setStudiedTime(parseInt(e.target.value))}
/>
```
僕が書いたコードの一部(最終的な)なのですが、inputに入力された値をe.target.valueで取得しています。
**onChange** (inputに入力された文字が変わった時) のイベントハンドラの引数として渡されるイベントオブジェクト(e)の *target.value* が返す値は<font color="red">**文字列**</font>というのが今回の原因でした。

# 終わりに
udemyの講座でインプットをしたあとにこのようなアウトプットを行えたことはすごく良い経験でした。正直動画ずっと見ていもイメージわかないことってすごく多いですよね。ものによってはつまらない授業受けているときの(先生ごめんなさい)あの眠さがやってくる感じみたい…笑

とにもかくにも<font color="red">**手を動かそう！**</font>ということで今回の記事を終わります。
Pythonの基本①【クラス定義と使用例】

## 一言で表すと
メンバ変数（変数）とメソッド（関数）をまとめて管理できるオブジェクト。
言わば、「設計図」みたいなものです。

## 使い方
### 定義の例
以下の例では、動物を表す`Animal`クラスを定義しています。`Animal`クラスのインスタンスのメンバ変数として、`名前`と`種類`を定義し、それぞれ`None`で初期化しています。
また、メンバ関数（メソッド）として、`cry`を定義しています。
最初の引数名を`self`にするのはお約束。
```python:
class Animal():
    def __init__(self, name: str = None, type: str = None):
        self.name = name
        self.type = type

    # 鳴くメソッド(デフォルトは"にゃー")
    def cry(self, sound: str = 'にゃー'):
        print(sound)
```
### インスタンス化
`Animal`クラスをインスタンス化
```python:
animal = Animal()
```
`animal`の型はAnimal型
```python:
type(animal)
```
```
<class '__main__.Animal'>
```
インスタンス化する際に、引数を受け取らなかったため、デフォルト値が入っている
```python
print(animal.name)
print(animal.type)
```
```
None
None
```
もちろんインスタンス化する際に任意の値で初期化することもできる
```python
animal = Animal(name='ポチ', type='dog')
print(animal.name)
print(animal.type)
```
```
ポチ
dog
```

### メソッドを呼び出す
デフォルト値は`にゃー`
```python:
animal.cry()
```
```
にゃー
```
引数に値を入れれば
```python
animal.cry(sound='わん')
```
```
わん
```

## まとめ
簡単にクラスの説明をしてみました。
間違っているところなどがあれば、コメントしていただけると助かります！
時短テクニック I　

# **作業効率を上げたいと思いませんか❕**
作業効率を上げたいと思いませんか、私は毎日思ってます(笑)
今回は現在私が使っている時短テクニックの1つとしてWindows及びTeamsのショートカット(SC)を記載します。

#目次
[1.WindowsのSC集]( 1-WindowsのSC集)
[2.Windowsの実践編](2-Windowsの実践編)
[3.TeamsのSC集](3-TeamsのSC集)
[4.Teamsの実践編](4-Teamsの実践編)
[5.おわりに](5-おわりに)


### 1. WindowsのSC集
私がよく使うショートカットキーの内5つをまとめました。

|番号|ショートカットキー|効果  |
|---|---|---|
|<font color="Red">1</font>  |<font color="Red">［Windows］+［Shift］+［S］</font>|<font color="Red">範囲を指定して画像を保存</font>  |
|2  |［Windows］+［L］|PCをロック|
|3　|［Alt］+［Tab］|ウィンドウやアプリの切替え|
|<font color="Red">4</font>　|<font color="Red">［Windows］+［V］</font>|<font color="Red">クリップボード履歴を表示</font> |
|5  |［Ctrl］+［N］ | 新規作成画面表示 |

:::note
赤字の1番と4番について実践編で記載 
:::

### 2.Windowsの実践編
####  ［Windows］+［Shift］+［S］
範囲を指定して画像を保存します。まぁスクリーンショットみたいなものです。(以下はイメージです)
![Windowsショートカット- スクリーンショット win+Sh+S.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694107/7d5e5928-d96f-7231-da5d-32d9a82b2c32.png)

私は主にわからない箇所や質問したい箇所を相手にわかりやすく伝わるように使います。


#### ［Windows］+［V］
「クリップボード履歴」を表示します。過去にコピーした履歴がクリップボード履歴には詰まってます。(以下はイメージです)
![Windowsショートカット- クリックボード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694107/af14e6ff-e48f-d986-b26c-a34e3099f8f9.jpeg)

私はこの機能を一番使っているかもしれません。コードを打つのに時間がかるときや1度コピーしたら後で何度も使用すると思ったときにコピーだけしてクリップボードに溜めておきます。

:::note
使ったことない方がいましたら是非使ってみてください(笑)
:::


### 3. TeamsのSC集
最近、私も知ったショートカットキーを5つ表にまとめました。
|番号|ショートカットキー|効果  |
|---|---|---|
|1  |［Ctrl］+［/］|コマンドを表示  |
|<font color="Red">2</font>  |<font color="Red">［Ctrl］+［R］</font>|<font color="Red">作成ボックスに移動</font>|
|<font color="Red">3</font> |<font color="Red">［Ctrl］+［Shift］+［X］</font>|<font color="Red">作成ボックスの展開</font>|
|4　|［Ctrl］+［Shift］+［I］|重要としてマーク|
|5  |［Ctrl］+［F］ | 検索 |

:::note
赤字の2番と3番について実践編で記載 
:::

### 4. Teamsの実践編
#### ［Ctrl］+［R］と［Ctrl］+［Shift］+［X］
作成ボックスに移動と作成ボックスの展開になります。
このコマンドは一緒に使うことが多いと思います。

![Teams資料①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694107/04826594-2da1-d010-74cd-4438e7798eb3.png)
この機能を使うことで誤ってEnterキーを押して送信してしまうことの防止が簡単にできます。

##### 4.I Teamsの小技
最近は送信予約(下図)をよく使います。
![Teams資料②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3694107/a01c5c86-6bd3-578d-d003-6bd4871c90a1.png)
送るタイミングが今じゃないけど送り忘れが怖いと思う際に使ってます。(送らないより送ったほうがいい場面など)

:::note
使ったことない方がいましたら是非使ってみてください(笑)
:::

#5. おわりに
Windows及びTeamsの効率Up可能なショートカットや小技を紹介しました。
社会人5年の経験として特に使いやすく効果的なショートカットや小技だと思います:muscle:
是非「初めて知った」、「そんなのあったな～」と思った方は使ってみてください。

Qiita初めての利用ともあり文章および内容が稚拙になってしまっておりますが、今後も投稿できたらなと思います。コメント待ってます:laughing:
Car Transport In Pune Car Transport Services In Pune

JMC Car Transport offers reliable and efficient car transportation in Pune and the surrounding areas. Whether you need to transport your car locally or long distance, our team of professionals can handle all your needs. Our services are designed to provide hassle-free and timely delivery of your vehicle while ensuring its safety and security during transit. We use advanced equipment and technology to load, unload and transport your car, ensuring that it reaches its destination in the same condition as it was picked up. With years of experience in the industry, we have built a reputation for providing quality and affordable car transport solutions in Pune. Contact us today for a quote!
https://www.jmcargoindia.com/car-transportation-pune.html
【チートシート】Event Triggerの種類まとめ【Unity】

# はじめに
### Eventtrigerって何？
> EventTriggerは、発生させたいイベントを自分で指定するためのコンポーネントです。
> これを使うと、Button以外のuGUIコンポーネント（ImageやPanel）や、ボタンの様に使うことができます。また、GameObjectであってもマウス操作を検知することができます。
>2D・3Dどちらでも適応可能です。

そんな便利なイベントトリガーなのですが…
種類豊富でどれがなんだっけ？？となってしまうので備忘録として残しておきます。

# Eventtrigerが動く条件
* ヒエラルキー上にEvent Systemが存在する（設定はデフォルトのままでOK）
* Main CameraにPhysics Raycaster/Physics2D Raycasterコンポーネントがアタッチされている
* イベントを検出したいGameObjectにCollider・Event Triggerそれぞれのコンポーネントがアタッチされている
* 上記のEvent Triggerのイベントを設定されている

## 補足
* ColliderはisTriggerがあってもなくても大丈夫
* UIに付与する場合はOrder in Layerに注意(上に被ってたら反応しなくなる)
* Physics RaycasterとPhysics2D Raycasterはマニュアルにもほどんと説明がないが、簡単に言うとPhysics Raycasterは3Dオブジェクトに対して、Physics2D Raycasterは2Dオブジェクトに対してのイベントを発生させるコンポーネント

# 動作確認バージョン
Unity 2021.3.9f1

# Eventtrigerの種類
### PointerEnter
　ポインターがオブジェクトに乗ったとき
### PointerExit
　ポインターがオブジェクトから離れたとき
### PointerDown
　ポインターがオブジェクトを押下したとき
### PointerUp
　ポインターを押下状態から離したとき
### PointerClick
　オブジェクト上でポインターを押下し、同一のオブジェクト上で離したとき
### Drag
　オブジェクトがドラッグされている間 
　　※クリックしてポインターを動かせば、実際にオブジェクトが移動していなくても発生
### Drop
　ドラッグされてきた他のオブジェクトが、範囲内でドラッグ解除されたとき
### Scroll
　オブジェクトの範囲内でマウスホイールスクロールをしたとき
### UpdateSelected
　選択中のオブジェクトで毎フレーム発生
　　※選択可能なオブジェクトでのみ発生
　　※Imageなどで使用する場合はSelectableコンポーネント等の追加が必要
### Select
　オブジェクトが選択されたとき
　　※選択可能なオブジェクトでのみ発生
### Deselect
　選択中のオブジェクトで、選択状態が解除されたとき
　　※選択可能なオブジェクトでのみ発生
### Move
　キー入力による移動イベント（左、右、上、下など）が起こったとき（選択状態で方向キーの入力があったとき）
### InitializePotentialDrag
　ドラッグ対象が見つかったとき（ドラッグ対象をクリックしたとき）
### BeginDrag
　ドラッグを開始したとき
### EndDrag
　ドラッグが終了したとき（ドラッグ状態を解除したとき）

### Submit
　サブミットボタン（リターンキーやスペースキー）が押されたとき
　　※選択可能なオブジェクトでのみ発生
### Cancel
　キャンセルボタン（エスケープキーなど）が押されたとき

# おわりに
少しでもみなさんのゲーム作りの助けになれば幸いです:relaxed:

記事を読んでくださった方は、是非弊社開発課のXもフォローしてね:hugging:
毎日エンジニアに向けた情報発信を行っています:writing_hand_tone1:

https://twitter.com/tech_cin
＜Python＞業務ツール:直近の営業日の日付取得

直近（当日を含めない）営業日を取得したい。
"YYYYMMDD"形式にてフォルダ名に取得して、フォルダ名に使用する。

日本の暦で営業する倉庫業者が、
出荷指示のCSVファイルを、翌営業日（YYYYMMDD)名のフォルダに格納するために作成。

```
import jpholiday
import datetime

date = datetime.date.today()
date = datetime.date(date.year, date.month, date.day + 1)

#土日・祝日確認用のブロック
while date.weekday() >= 5 or jpholiday.is_holiday(date):
    date = datetime.date(date.year, date.month, date.day + 1)

#フォルダ名用の形式
date = date.strftime("%Y%m%d")
print(date)
```

「出荷日_YYYYMMDDフォルダ」を作成する
```
import os
f = r"Path\出荷日_"+str(date)
os.makedirs(f)
```
PostgreSQL analysis

```sql
EXPLAIN ANALYZE
SELECT S1.DA, S1.CODE
FROM stock_i S1, stock_i2 S2, stock_i3 S3, price P
WHERE S1.code = S2.code and S1.code = S3.code AND S1.code = P.code
AND S1.da = S2.da and S1.da = S3.da and S1.da = P.da
AND S1.da = '2024-02-05'
AND P.cl * P.vol >= 5000000
LIMIT 10
```
[Google Sheets API] スプレットシートのシートを別のスプレットシートにコピーする

Google Sheets API v4（Java）を使用して、
スプレットシートのシートを別のスプレットシートにコピーする方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する](https://qiita.com/doran/items/3d43f776188b2281044c)
を参照ください。
```
例：requests.add(moveDimension(sheetId)); //実行したいリクエストのMethodを指定
```
:::

:::note info
その他のGoogle Sheets APIは、下記の記事を参照ください。
[⧉[Google Sheets API] JavaでスプレットシートのメニューとAPIを関連づけてみた](https://qiita.com/doran/items/2f6f8932b994fbd1a170)
:::

**サンプル コード**
コピー元のスプレットシートIDとシートIDを指定して、
コピー先のスプレットシートにコピーします。

**実行**
```
public static void main(String[] args) throws Exception {
    String fileId = "";     //コピー元のスプレットシートID
    Integer sheetId = 0;    //コピー元のシートID";
    String destFileId = ""; //コピー先のスプレットシートID

    //コピー先のスプレットシートIDを設定
    CopySheetToAnotherSpreadsheetRequest request = new CopySheetToAnotherSpreadsheetRequest();
    request.setDestinationSpreadsheetId(destFileId);
    
    Spreadsheets sheets = getSpreadsheets();

    //コピーを実行
    SheetProperties prop = sheets.sheets().copyTo(fileId, sheetId, request).execute();

    //コピー実行のレスポンス
    response(prop);
```
**コピーの実行結果**
コピーの実行後に得られるレスポンス情報を下記コードに示します。

下記は必ず取得できる情報です。
それ以外は設定されていない場合は取得できません。
|内容|取得メソッド|
|---|---|
|コピーされたシートID|getSheetId()|
|コピーされたシートのタイトル|getTitle()|
|コピーされたシートの並び順|getIndex()|
|コピーされたシートの種別|getSheetType()|
    
sheetTypeは、以下のいずれかが取得できます。
typeの種類によって取得できるレスポンスも異なります。
|type|内容|取得メソッド|
|---|---|---|
|GRID|GRID|getGridProperties()|
|OBJECT|オブジェクト（グラフや画像など）|なし|
|DATA_SOURCE|データソース（Bigqueryなど）|getDataSourceSheetProperties()|
```
private static void response(SheetProperties prop){
    //コピーされたシートID
    Integer sheetId = prop.getSheetId();
    
    //コピーされたシートのタイトル
    String title = prop.getTitle();
    
    //コピーされたシートの並び順
    Integer index = prop.getIndex();
    
    //コピーされたシートの種別
    String sheetType = prop.getSheetType();

    //以下、設定されている場合のみ取得可能
    //シートが非表示か？
    Boolean hidden = prop.getHidden();
    
    //タブの色、またはスタイル
    Color tabColor = prop.getTabColor();
    ColorStyle tabColorStyle = prop.getTabColorStyle();
    
    //テキストの方向
    Boolean rightToLeft = prop.getRightToLeft();
    
    //sheetTypeが「GRID」の場合のみ
    GridProperties  grid = prop.getGridProperties();
    
    //sheetTypeが「DATA_SOURCE」の場合のみ
    DataSourceSheetProperties dataSourceSheetProperties = prop.getDataSourceSheetProperties();
    
}
```

<br>
おしまい。。
【PHP】配列の値を書き換える※備忘録

# 前書き
相談をされた時に回答したものの備忘録になります。
PHPでエクセルファイルを作る業務をしていたそうで、送られてきた値の順番からセルに優先度を設定しなければならないとのことで、最終的には以下のコードのように入れるセル番号に対しての文字列を設定したいと相談を受けました。

```php
$array = [
    'C10' => '()',
    'C11' => '()',
    'C12' => '(1)',
    'C13' => '()',
    'C14' => '()',
    'C15' => '(3)',
    'C16' => '()',
    'C17' => '()',
    'C18' => '(2)',
    'C19' => '()',
    'C20' => '()'
    ];
```

タイプのようなものがあり、番号で管理されているらしいです。
以下のような配列でタイプと優先度が送られてきます。
```php
$values = [
    1 => '013',
    2 => '019',
    3 => '018',
    ];
```

# やったこと
元となる配列を用意し、キーが一致するものを上書きする。

```php
$array = [
    'C10' => '()',
    'C11' => '()',
    'C12' => '()',
    'C13' => '()',
    'C14' => '()',
    'C15' => '()',
    'C16' => '()',
    'C17' => '()',
    'C18' => '()',
    'C19' => '()',
    'C20' => '()'
];
    
$types = [
    "010" => "C10",
    "011" => "C11",
    "012" => "C12",
    "013" => "C13",
    "014" => "C14",
    '015' => 'C15',
    '016' => 'C16',
    '017' => 'C17',
    '018' => 'C18',
    '019' => 'C19',
    '020' => 'C20'
];

// 送られてくる値の例
$values = [
    1 => '013',
    2 => '019',
    3 => '018',
];

// 配列を上書きする
foreach ($values as $key => $value) {
    $array[$types[$value]] = '('. $key. ')';
}
```

# 後書き
ベストな書き方ではないと思いますが、こういったやり方もあると参考になれば幸いです。
Databricks へ Oracle Database における長さが0(ゼロ)の文字値を NULL として処理する仕様の移行方法

## 概要

Databricks へ Oracle Database における長さが0(ゼロ)の文字値を NULL として処理される仕様の移行方法を共有します。

Oracle Database のドキュメントにて、長さが0(ゼロ)の文字値が NULL となる旨が次のように記載されております。

> Oracle Databaseは、長さが0(ゼロ)の文字値をNULLとして処理します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d24c0778-0ac3-6694-51fd-08b7ac9ceb82.png)

引用元：[NULL (oracle.com)](https://docs.oracle.com/cd/E82638_01/sqlrf/Nulls.html#GUID-B0BA4751-9D88-426A-84AD-BCDBD5584071)

Databricks においては、 '' が '' として保持されるため、追加の処理が必要となります。

```python
src_schema = "str_col string"
src_data = [
    {"str_col": "a"},
    {"str_col": ""},
    {"str_col": " "},
]

df = spark.createDataFrame(src_data, src_schema)
print(df.collect())
df.display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7fa4b1d0-98f8-26ea-0041-43a619279b17.png)

## Oracle Database の動作確認

### 長さが0(ゼロ)の文字値が NULL となることを確認

Oracle Database にて以下のクエリを実行したところ、'' が NULL となりました。

```sql
WITH src AS (
SELECT 'a' AS str_col FROM DUAL
UNION ALL
SELECT '' AS str_col FROM DUAL
UNION ALL
SELECT ' ' AS str_col FROM DUAL
)
SELECT
    *
    FROM src
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/444ef821-4d97-b3cb-e6c0-a9e5b5975164.png)

## Databricks への移行

### 長さが0(ゼロ)の文字値が NULL となるような処理を追加

```pyhon
from pyspark.sql.functions import expr


def convert_zero_byte_to_null(
    df,
    tgt_col_names,
):
    with_cols_conf = {}
    for col_name in tgt_col_names:
        with_cols_conf[col_name] = expr(
            f"""
            CASE
                WHEN {col_name} = ''
                    THEN NULL
                ELSE
                    {col_name}
            END
            """
        )
    df = df.withColumns(with_cols_conf)
    return df
```

```pytohn
tgt_col_names = ["str_col"]

modifed_df = convert_zero_byte_to_null(
    df,
    tgt_col_names,
)

print(modifed_df.collect())
modifed_df.display()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1340f902-fa43-aa52-8fb6-268e70380c8b.png)

## 注意事項

### 1. 固定長形式のファイルを CHAR 型のカラムに TRIM せずに書き込む処理を移行する場合の注意事項

固定長形式のファイルを TRIM せずに CHAR 型のカラムに対して書き込む処理を移行する際には、該当するカラムに本記事の処理を実施しないでください。

Oracle Database の CHAR 型カラムへ書きこみ仕様を下記クエリで確認すると、`""`（空文字）が NULL となり、`" "`（スペース）は`"     "`（スペースが5つ）となりました。固定長形式のファイルを TRIM せずに CHAR型へ書き込む際には、Oracle Database では指定桁数のスペースを保持することとなります。

```sql
WITH src AS(
SELECT '空文字' AS col_type, CAST('' AS char(5)) AS value FROM DUAL
UNION ALL
SELECT 'スペース' AS col_type, CAST(' ' AS char(5)) AS value FROM DUAL
)
SELECT
    *
    FROM
        src
;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fd43c355-9817-b8ec-616b-7a683c2ea9f5.png)

CHAR 型のカラムを Oracle Database から Databricksへ移行する際には、桁数分のスペースを保持させずに、TRIM して保持することが多いです。その変更仕様に基づき TRIM されたカラムに対して、本記事の処理を適用すると、NULL となってしまうため想定外の動作となる可能性があります。固定長形式のファイルがソースであり TRIM されていない CHAR 型のカラムに対しては、``（空文字）を NULL に変換しないようにしてください。
Salesforce認定アドミニストレーター合格体験記

2024年1月にSalesforce認定アドミニストレーターに合格しましたので、
誰かの役に立つのではないかと思い、試験を通して私が感じたことを書いていきます。

# Salesforce認定アドミニストレーターとは
・Salesforceの実装や管理などの知識を幅広く問われる試験です。
・下記は、試験の詳細です。
　・試験内容: 60問（複数選択の問題もあり、記述問題なし）
　・試験時間：105 分
　・合格点：65%
　・受験料：20,000 円（税抜）
　・受験方法：テストセンターまたはオンラインで受験可能

 # 自身の経歴
 ・文系４大卒
 ・未経験でIT企業に就職
 ・主にJavaを使用したプロジェクトに参画
 （頭が良くないので、新卒1,2年目の頃は、業務が分からなさ過ぎて泣きそうになりながらコーディングをしていました...）
 ・Salesforceのプロジェクトに参画し（2か月ほど）、資格を取ってみようと思い、勉強を始めました。

 # 勉強方法
1.　認定アドミニストレーターのTrailmixを受講
　・Salesforceについて体系的に学びたかったので、Trailmixを受講しました。
　・文章だけでなく、ハンズオンで学んでいく単元もありますので、理解が進みました。
　・単元1つ1つに小テストがありますので、自分の理解度も確認しながらSalesforceについて勉強できます（単元1つクリアする度に褒めてくれるので嬉しいです笑）。
 
 https://trailhead.salesforce.com/ja/users/welcome4/trailmixes/prepare-for-your-salesforce-administrator-credential

2.　動画を視聴
　・Trailmixを受講し終わり、「へえ、Salesforceってこんな事ができるんだ」ぐらいの理解度で正直曖昧な部分がありましたので、YouTubeで「Salesforce勉強ヒロバ」さんのSalesforce解説動画を片っ端から視聴しました。
　・こちらの動画はどれも分かりやすく、よりSalesforceについて理解度が増しました。
（「Salesforce勉強ヒロバ」さんには、本当に感謝を申し上げます。）

https://www.youtube.com/channel/UCfkKk6n9xNAbXRYV58xnjFg

3.　問題を解く
・上記1,2を行えば、Salesforceの基本的な部分はだいぶ理解できていると思うので、あとは問題を解きまくるだけです。下記の問題を解きました。

　・「Salesforce過去問+模擬問題の解説」さん

https://note.com/salesforce777/n/n1754168c1280?magazine_key=m028effafc956

　・「Motohashi Takaaki」さん

https://qiita.com/Takaa/items/f2eb81e49c614fb767de

　・「認定アドミニストレーター公式模擬テスト」

 https://developer.salesforce.com/files/ti/thi/THI-000393/administratorpracticetest.html

# 試験を受験してみての感想
・試験時間はたくさんあるので、時間が足りなくて解ききれなかったという事はなさそうです。
・私の場合だと、試験時間のギリギリまで見直しを行っていましたので、見直しを含め2周分問題を解く時間がありました。
・「そこの設定方法まで覚えてないよ」という問題もあったので、正直焦りました。
・問題内容的に2つの選択肢のどちらも実装可能だが、ベストプラクティスを選ばせる問題が数問出題されているように思いましたので、「この機能はこういうユースケースで使われがちだよね」などのように機能ごとに整理しておいた方が良いかもしれません。
挿入ソート

ひとまず、Cランクの問題を全部解き終えたので、
Pythonのスキルチェックを受けてきたら普通にできた。
（もともとPHPでCランクはとっていたけど）

というわけでいまからBランクを目指す。
Bランクへの道というのがあるらしくて

https://paiza.jp/pages/works/stories/brank/

これを読むとどうやら配列の次にソートアルゴリズムを学ぶ必要がある。
問題集を見るとクラスもあるはずなのだが、まあそれもやるってことで。
ひとまずソートアルゴリズムシリーズを解いていくことにする。

https://paiza.jp/works/mondai/sort_naive/sort_naive__insertion

```py
def insert_sort(n,A):
     for i in range(1,n):
        #A[i] を、整列済みの A[0] ~ A[i-1] の適切な位置に挿入する
        # 実装の都合上、A[i] の値が上書きされてしまうことがあるので、予め A[i] の値をコピーしておく        
        x = A[i]
        #jは適切な挿入位置を表す変数
        #まずi-1から始まる
        j = i-1
        # A[i] の適切な挿入位置が見つかるまで、A[i] より大きい要素を1つずつ後ろにずらしていく
        while j >= 0 and A[j] > x:
            A[j+1] = A[j]
            j -= 1

        #A[i] を挿入
        A[j+1] = x
        print(*A)


n = int(input())
A = list(map(int,input().split()))

insert_sort(n,A)

```
いぜん少々アルゴリズムを聞きかじってはいたので、その知識からどうコードを組み立てるか考えたが、

１）A[i]が挿入元となるターゲット
２）A[0] ~ A[i-1]までの要素をA[i]と比較する。
   比較対象ターゲットをA[j]とする。jはi-1からはじまり、0まで続く。
   while文になる   
３）while文が終わった時点で、隣が挿入位置になるのでA［i］の要素を代入。
４）結果をプリントする。
５）あとは繰り返し

出力:
```
1 4 3 5 2
1 3 4 5 2
1 3 4 5 2
1 2 3 4 5
```
ガベージコレクションとは

Javaにはガベージコレクションがあります。

ブロックの終了と共に変数は消滅しますが、newなどで確保されたデータはブロックが終了してもメモリに残る場合があります。

ガベージコレクションはそのような参照されないのにメモリに残っているデータを自動的に削除してくれます。
ハイパーパラメータのチューニング時のクロスバリデーションには気を付けよう

## こんな人に向けて書きました
- Trust your CVの前に、正しいCVのやり方を知りたい
- Nested CVについて理解したい
- わずかなリークにも注意を払う必要があるようなタスクをしている

## ハイパーパラメータのチューニング後のスコア評価に気を付けよう
まず、結論についてですが。以下のようなクロスバリデーションをしてしまうと、得られたモデルのスコアは不当に高くなってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296599/5f7af503-63b7-7e83-7c41-ef632568b102.png)
ハイパーパラメータのチューニングは、そもそも<font color="red">検証データに対するスコアを最大化させる（＝検証データをリークさせる）</font>ことで行われます。
そのため、クロスバリデーションを行っているといっても、その中でハイパーパラメータのチューニングを行って得られるCVスコアは、実際のモデルの実力よりも高くなってしまいます。
実際のモデルの実力は以下のように、完全な未知データに対する予測をしない限りわかりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296599/132058b5-15b2-7648-052d-f55341af31ec.png)

## じゃあどうするの？→Nested CVを使おう！
この問題を解決するために使うCVの手法がNested Cross Validation (Nested CV)です。
以下のようなプロセスで行います。

1. 通常のCV同様にデータを訓練データ1と検証データ1に分ける（一段階目のCV：Outer CV）。
2. 訓練データ1を、さらに分割して訓練データ2と検証データ2に分ける（二段階目のCV：Inner CV）。
3. 訓練データ2でモデルの学習を行い、検証データ2に対するスコアをもとにハイパーパラメータの最適化を行う
4. 3.で最適化されたハイパーパラメータを用いて、モデルを訓練データ1で学習
5. 4.で学習されたモデルの評価を検証データ1を使って行う

図にすると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296599/3547af25-d026-12ba-effe-9c456ac1aabd.png)

このように学習を行うと、Outer CVの検証データはハイパーパラメータのチューニング過程に一切関与していないクリーンなデータなので、正しくモデルの汎化性能を評価できます。

## 最終的なハイパーパラメータはどう決めるの？
Nested CVを行うと、Outer CVの試行ごとにInner CVがハイパーパラメータの最適化のために行われるので、毎回ハイパーパラメータの最適値が変わります。
そのため、最終的にハイパーパラメータの値は何を使えばいいのかという疑問がわくと思います。
結論として。最終的なハイパーパラメータは、全データを訓練データと検証データに分割して最適化を行って決定すればよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296599/21c0dfed-d718-ad62-8ca9-424c5e404663.png)

<font color="red">クロスバリデーションは、基本的には前処理からモデルの学習までの一連のプロセスを評価するための手法であって、最終的なモデルを出力するためのものではないと私は考えています。</font>
なので、「こういうプロセスで学習を行えばこれぐらいの精度が出る」ということがクロスバリデーションで分かったら、そのプロセスを使って全データに対してモデルの学習を行えば、クロスバリデーション時に出た精度と同等のものが出力されることが期待されます。

## おわりに
機械学習におけるモデルの評価は、細かく考え出すとかなり難しい問題です。
私自身も、仕事で機械学習を行うようになって、間違ったモデル評価をしながら、それに気づかず不当な結果を報告してしまった経験があります。
この記事が、正しいモデル評価をするための一助になれば幸いです。
なお、もし私の理解に誤りなどがある場合はどんどんご指摘いただけると嬉しいです！
【OpenAIが新たな生成AI“Sora”を発表】


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

　今回は、OpenAIが新たな生成AIを発表しました。その報告です。

:::note info
本記事は、
　ニュースです。あしからず。
:::

　まずは、
　　ChatGPTアプリ版に
　　　ちょっとした機能追加です。

　日課の履歴整理を
　　していたのですが、
　　　リネームしようと
　　　　ポップアップメニューを
　　　　　出したところ、
　　　　　　項目が追加されています。

　“Archive”です。
　　ここから、Archiveに
　　　移動させることが
　　　　可能になったようです。

　覚えていますか？
　　Archive。

　履歴から
　　削除するのではなく、
　　　Archiveに移動させる機能です。

　残しておきたいが
　　履歴上から消したい場合に
　　　使う機能ですね。

　使ってます？

　私は、
　　使っていません。

　たぶん、
　　Archiveしたら
　　　忘れ去ることでしょうねw　
***
　さて、
　　本題のニュースです。

　このことに気付いたのは
　　X-Twitterを
　　　チェックしているときでした。

　サム・アルトマンが
　　ポストしているのです。
　　　しかも、連続投稿。

　彼にしては
　　珍しいことです。

　そして、
　　その内容は
　　　すべて動画。

　調べてみると、
　　“Sora”というキーワードが
　　　現れてきました。
***
　“Sora”、
　　それが
　　　新たな生成AIの名前でした。

　リリースは
　　まだですよw
　　　慌てないでね。

　“Sora”は、
　　テキストやイメージから
　　　ビデオを作成できる
　　　　動画生成AIです。

　動画を見れば、
　　どれだけすごいのかを
　　　わかっていただけるかと
　　　　思います。

　滑らかなのです。
　　破綻がないに等しいのです。

　最大60秒の生成が
　　可能だ、としています。
***
　一連の動画が
　　まとめられた
　　　動画が、You Tubeにあります。
　　　　探してみてね。

　たぶん、
　　“Sora”で
　　　検索できるんじゃないかな。

　英語だから
　　注意してくださいね。
***
　OpenAIのサイトの最初に、
　　“Sora”について
　　　書かれていますので、
　　　　ご確認ください。

　詳細については、
　　本日（2024/02/16）後半に
　　　公開予定の技術文書を
　　　　発表するそうです。
***
　OpenAIは
　　いつも、あとから
　　　ほかの生成AIの上を
　　　　行く技術を
　　　　　発表していますねw

　これは単に、
　　AIに仕事が奪われるのではなく、
　　　アナログが
　　　　デジタルになったように
　　　　　時代の変化なのでしょう。

　これを
　　直視できない人は
　　　イザというときに
　　　　“仕事ができない”
　　　　　というレッテルが
　　　　　　貼られるのでしょうね。

　オフィスで
　　Word・Excelが
　　　使えない人間が
　　　　いるでしょうか？

　会議に
　　PowerPointなんかを
　　　使う時代に、
　　　　そんな人間は
　　　　　食うに困ることに
　　　　　　なるでしょう。

　あなたのまわりは
　　大丈夫ですか？

　会社は？
　　社長や重役は？
　　　中間管理職は？
　　　　あなたの同僚は？

　この記事を見ている
　　あなたは、大丈夫と思いたいです。

　それでも
　　危機感は
　　　持っていましょう。

　みなさんの
　　将来が明るいもので
　　　ありますように。

　今回は、ここまで。
GitHub Education 申請が通らない時の対策法

## はじめに
学生なら GitHub Education に申請をすることでcopilotを無料で使えるらしい！
が、申請を通すまでかなり苦戦したので申請を通すためのTipsをまとめます。

## GitHub Education とは
`GitHub Education` については以下、Github から引用

>認定教育機関の学生または教職員は、GitHub Global Campus を申し込むことができます。 GitHub Global Campus は、GitHub Education Community が利用できる教育特典をすべて 1 か所に集めたポータルです。 

要件はこんな感じ
>- 高等学校、中等学校、大学、ホームスクールまたはそれに類似した教育機関で、学位を取得できるコースに現在在籍している
>- 学校が発行した検証可能なメールアドレスを持っているか、現在の在学状況を証明するドキュメントをアップロードしている
>- GitHub 個人アカウントを作成します
>- 最低でも 13 歳以上であること

## 申請方法
申請方法については以下の記事が参考になったのでこちらを参照して下さい。

https://qiita.com/SNQ-2001/items/796dc5e794ac3f57a945%E3%80%80

※記事内では画像をアップロードしていますが、自分の環境では画像のアップロードを行えず、前面カメラしか使えませんでした。(原因不明)

## Tips
ここからは申請が通らなかった時のTipsをご紹介します。

### Tips1 : 学校で申請する
申請を行う際にいち情報の取得を求められるのですが、その際に学校内にいると良いと思います。

実際、私も家で申請したときは申請が通らなかったものの学校で再度申請したらあっさり通りました。

### Tips2 : Github の請求先名・住所を埋める
[Github Billing & plans / Payment information](https://github.com/settings/billing/payment_information) のページに進んで、`Billing information`内の `Address (P.O. box, company name, c/o) * `:学校名, `City *` : 学校の住所 を入力。

![image.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543125/16e0dbb2-fa0e-be3c-a0c0-8abec5529720.jpeg)


最後に `save` を押して完了

### Tips3 : 学生書の横に英訳した紙を置く
試していないのですが、他の方で英訳して学生証と一緒に送るとacceptされている方がいらっしゃいました。

https://qiita.com/shuki/items/1ad3e0a5cb8abce3cdbf

### Tips4 : 英語の在学証明書を発行する
学校によるかもしれませんが、証明書発行機などで英字の在学証明書が利用できる場合には発行して使ってみると良いかもしれません。(手数料がかかるので最終手段だと思いますが)

## 最後に
おそらく上記のTipsを元に申請を行えばacceptされるはずです。他にも申請する際の知見などをお持ちの方はコメントいただけると助かります。

自分自身は申請が成功してから3日で使えるようになりました！（3-9日位が多そう）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543125/d67c6674-6849-2ab7-42a0-09d1079ecd75.png)


Github education では Github copilot を無料で利用できるようになるそうなのでこれからの開発が高速化しそうです。
【Salesforce】画面フローのルックアップコンポーネント　設定方法

# 概要
画面フローで、オブジェクト内のレコードを検索・指定することができるルックアップコンポーネントの設定でつまづいたので。

:::note info
※作成時のバージョン：Spring '24
:::

# 登場する設定項目
ルックアップコンポーネントをキャンバスに配置すると、設定項目がずらりと表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714271/4245e1e2-eceb-3ec6-fc0e-1349d0640273.png)

| 項目名 | 概要 |
|:-:|:-:|
| API参照名  | このコンポーネントのAPI参照名  |
| オブジェクトAPI参照名  | フローに表示させたいルックアップ項目があるオブジェクトのAPI参照名  |
| 項目API参照名  | フローに表示させたいルックアップ項目のAPI参照名  |
| 表示ラベル  | このコンポーネントの表示ラベル  |
| レコードID  | デフォルトで選択されるレコード(1つ)  |
|  レコードIDコレクション | デフォルトで選択されるレコード(複数)  |
| 最大選択数  | ルックアップで選択できるレコードの最大数  |
|  必須 | このコンポーネントを必須入力にするか  |

# つまづいたところ
ぱっと見たイメージ、「オブジェクトAPI参照名」に、**ルックアップで検索したいオブジェクト** を入力できそうですが、それでは正しく表示されません。

たとえば、ケース(Case)オブジェクトをケース件名(Name)項目でルックアップしたいとき、
以下のように設定をしてもうまく動作しません。
これは「指定した項目がルックアップ項目でない」ために発生します。

:::note warn
ここでいう「ルックアップ項目」とは、データ型が「参照関係」または「主従関係」のものをさします。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714271/bd785291-982a-c692-cdec-242d08328514.png)

このコンポーネントは「既存のルックアップ項目を利用して画面フローに表示する」ものであり、オブジェクトと項目を選べばなんでもルックアップ項目になってくれるわけではありません。

# 正しい設定
上述の通り、「既存のルックアップ項目」を指定して呼び出すコンポーネントなので、該当の項目が存在するオブジェクト・項目を指定してやると動作します。
画像の例では、カスタムオブジェクト(ServiceCommunity__c)に作成した、参照関係項目(RelatedCase__c)を指定しました。
「ケースを検索...」となり、検索したいオブジェクトの表示ラベルが表示されれば正しく指定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714271/b532085c-47bf-ab92-aa83-db57c61fd975.png)

# おわりに
「こんなところで！？」というところで落とし穴があったりしますが、フローはやっぱり便利なのでついつい頼ってしまいます。
hostnamectlを使ってEC2のホスト名を変更する

## 概要

hostnamectlコマンドを使ってAmazonLinux2のEC2インスタンスのホスト名を変更してみる。

## 方法

インスタンスにSSH接続を行い、下記を実行する。

```shell
sudo hostnamectl set-hostname 新たに設定するホスト名
```

一度インスタンスから出て再度ssh接続を行う。
下記を実行し、設定内容を確認する。

```shell
hostnamectl status
```

Static hostnameなどが設定したものになっていれば作業完了となる。


## 参考文献

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec_configuring_host_names_using_hostnamectl

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html
Share Point Listsで日付けを基準に表示設定する。

Share Point ListsでpH標準液を管理しています。pH標準液は開封して3ヵ月経つと廃棄しなければいけません。作業者は開封後に日付をリストに記入してもらいます。以降は自動化できます。一つにはPower Automateで期限が切れる前に発注依頼メールを出すこと。もう一つが使用期限に対しリストの表示を変えること。

リストの列の表示は「この列の書式設定」から行いますが、基準が「今日」か「特定の日」しかありません。〇日前という設定をするには、詳細モードでJSONを変種する必要があります。その書式はこちら。

<code>
{<br>
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
"elmType": "div",<br>
  "txtContent": "=if(Number([$expire_date]) == 0, '未開封' ,[$expire_date.displayValue]) ",<br>
"attributes": {
"class": "=if(Number([$expire_date]) == 0, 'sp-field-severity--low' , if([$expire_date] < @now, 'sp-field-severity--blocked',if([$expire_date] < addDays(@now,6), 'sp-field-severity--warning', 'sp-field-severity--good'))"}<br>
}
</code>

一つは日付が未記入の場合「未開封」と表示する。"txtContent"で設定します。変更しない場合は本来の表示をするように指定します。

もう一つが背景色などを変える"attributes"です。
通常は列名(expire_date）と@nowを比較しますが、6日前に判定するためにはaddDays(@now,6)を使って判定します。判定後の書式はsp-field-severityを使用しました。
NaysDw2 ver.1.1.24020101リリースしました

# NaysDw2が更新されました

2024年2月1日にNaysDw2のver 1.1.24020101がリリースされました(しました)。

## 変更点概要

### 機能改良・新機能追加

* ソルバー選択時に読み込み対象の計算結果を指定しスムーズに格子をコピーできるようになりました
* 読み込み対象の計算結果から任意のスカラーを指定して読み込めるアドバンスモードを追加しました
* 計算条件ダイアログに流木投入範囲の図を追加しました

### バグ修正

* テキストデータから流木の初期位置を読み込む機能が使えなかったバグを修正しました
* 可視化ウィンドウを開いた際に、オブジェクトブラウザーにポリゴンの項目が追加されないことがあるバグを修正しました

:::note
旧バージョンで作成したプロジェクトも変わらずにご利用いただけます。
:::


以下に各詳細を整理します。

# 読み込み対象の指定方法の変更と格子のコピーについて

今回、利便性の向上とアドバンスモード実装のため、読み込み対象の指定方法をEvaTRiP_Proと同様の方式に変更しました。

これまでは新規プロジェクト作成後に手動で格子をコピーし、計算条件で読み込み対象のCGNSファイルのパスを指定していました。

新方式では、新規プロジェクト作成時にiRICが表示するダイアログによって読み込み対象を指定し、そのまま格子のコピーまでを行えるので操作がわかりやすくなっています。

また、この方式ではiRIC GUIが読み込み対象を読み取り、以下の情報を表示してくれるので、いちいち読み取り対象を開いて確認する必要がなくなります。
* ソルバー名
* ソルバーバージョン
* 格子種類
* 格子サイズ
* 計算結果の数

## 新方式の操作方法

NaysDw2の新規プロジェクトを立ち上げると入力用CGNSファイルの選択ダイアログがでてきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/27a71f9c-50b2-978b-52e0-c7ad5947614b.png)

`...`ボタンから読み込みたいプロジェクトのCase1.cgnを選択します。
(画像はデバッグ用の計算結果を指定した際のものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/cc5745d2-1862-a89a-c07d-dee3d1d2105e.png)

`OK`を押すと「CGNSファイルから格子をインポートしますか？」と聞かれるので`はい`を選択して格子を読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/67c2411d-fba0-4148-8b78-600e9f5105a2.png)

基本的にエラーメッセージが出てきますが、仕様なので気にせず`はい`を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/b488e97c-14ee-a6c8-0a4e-810539a70eeb.png)

格子をインポートできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/bf08f2a6-a53b-18d6-1697-f6b031d2753f.png)

:::note

あとから読み込み対象を変更したい場合は計算条件ダイアログの`基本設定`グループの`流況計算結果を読み込むCGNSファイル名`の項目から変更可能です。
ただし、格子は更新されないので手動でインポートしてください。

:::

# アドバンスモードについて

アドバンスモードは読み込み対象から、NaysDw2での計算に必要な流速と水深以外に任意のスカラーを指定してコピーし、NaysDw2の計算結果に出力することができるモードです。
読み込めるスカラーの数は以下です。

| スカラーの種類 | 読み込める数|
|:-|-:|
|「時刻」を次元に持つスカラー(流量など)  | 2  |
|格子点の持つスカラー（実数）  | 5  |
|セルの持つスカラー（実数）   | 5  |
|セルの持つスカラー（整数）  | 5  |

従来までは固定で流量、標高、河床変動量しか読み込めませんでしたが、これにより様々な参照情報を一緒に可視化できます。


## 使い方

1. 計算条件ダイアログの`+アドバンスモード`グループの`アドバンスモードの有効化`にチェックを入れる
2.  `追跡計算用パラメータの指定`で流速と水深のスカラー名をプルダウンリストから選択
2. この他に任意で読み込みたいスカラーについては、各種スカラーで`有効`にチェックをいれプルダウンリストからスカラー名を選択してください

:::note warn
流速はCGNSファイルではX軸方向とY軸方向に分かれて保存されています。正しい組み合わせでスカラー名末尾にX,Yがついているものを選択してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/24a484a7-76e2-aaf2-cb2e-166c6188aa27.png)

:::note
アドバンスモードを有効にすると`基本設定`グループの`流木の追跡に用いる流速`が無効になり、アドバンスモードで指定した流速が流木の追跡に用いられます。
:::

:::note
複数の流速を持つ計算結果(Nays2D+など)を読み込む場合、NaysDw2の計算で使用する流速の他に参考として読み込むことができます。その場合は任意の格子点のスカラーとして読み込みたい流速のX,Y方向の流速を指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626673/1d860746-5b04-037e-7c44-1ded2852b684.png)

:::

# バグ修正について

## テキストデータから流木の初期位置を読み込む機能

`流木の供給条件`グループの設定で、初期状態で流木を配置する設定にしていても、`初期流木配置位置情報ファイル名`で指定したファイルから位置情報を読み込んでいなかったバグを修正しました。

## オブジェクトブラウザのポリゴンの項目

ツールバーで選択されているタイムステップにおいて、格子内に流木が存在しなかった場合、可視化ウィンドウを開いた際に、オブジェクトブラウザーにポリゴンの項目が追加されず、その可視化ウィンドウでは流木の存在するタイムステップに変更しても流木ポリゴンが表示されなかったバグを修正しました。
Azure OpenAI の Code Interpreter で CSV データを分析してみた

## はじめに
2024 年 2 月に Azure OpenAI の Assistant 機能の一つとして Code Interpreter がプレビューで追加されました。こちらを試してみました。
[Azure OpenAI Assistants Code Interpreter (Preview)](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/code-interpreter?tabs=python)

※注意
現在、Assistants 機能 が使える Azure OpenAI のリージョンが限られていますので注意してください。

2024 年 2 月 16 日現在
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/c9a94824-c302-bfe5-3368-8b077a9ee732.png)

[利用可能リージョン（公式）](https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#assistants-preview)

## 実際のコード
``` python
from openai import AzureOpenAI
import json
import time
    
client = AzureOpenAI(
  api_key=os.getenv("AOAI_API_KEY"),  
  api_version="2024-02-15-preview",
  azure_endpoint = os.getenv("AOAI_ENDPOINT")
)

file = client.files.create(
  file = open("train.csv", "rb"),
  purpose='assistants'
)

assistant = client.beta.assistants.create(
  instructions = "You are an AI assistant that can analyze csv data to help answer math questions.",
  model = "gpt-4",
  tools = [{"type": "code_interpreter"}],
  file_ids = [file.id]
)

thread = client.beta.threads.create()

message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Survivedが0の人の特徴を分析してください。"
)

run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
)

status = run.status

while status not in ["completed", "cancelled", "expired", "failed"]:
    time.sleep(5)
    run = client.beta.threads.runs.retrieve(thread_id=thread.id,run_id=run.id)
    status = run.status

messages = client.beta.threads.messages.list(
  thread_id=thread.id
)

data = json.loads(messages.model_dump_json(indent=2))
print(data['data'][0]['content'][1]['text']['value'])
```

実行してみると、以下のように結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/871a0ff9-6082-5be5-6985-09d3339ffca6.png)

読み込ませた CSV データは以下のようなものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/44b5455b-e220-7b94-8888-5d49791f9ed0.png)


### 質問
Survived が 0 の人の特徴を分析してください。

### 回答
プロットから以下の観察を行うことができます：

1. 性別 (`Sex`): 生存しなかった乗客の大部分は男性で、女性は比較的少ないです。
2. 乗客のクラス (`Pclass`): 生存しなかった乗客の大部分は3等クラスに所属していました。これは、船の避難手順や生存設備の利用可能性がクラスによって異なった可能性があります。
3. 年齢 (`Age`): 20-30歳の間の乗客が最も多く、生存しなかった人々の中で最も一般的な年齢層でした。また、年齢が若い子供や高齢者も一定数存在していました。
4. 料金 (`Fare`): 生存しなかった多くの乗客が低い運賃を支払っていました。これは、運賃が低いということは一般的に下位クラスの船室に乗船していた可能性が高いことを示唆しています。
5. 兄弟または配偶者の数 (`SibSp`): 生存しなかった乗客の大部分が一人で旅行していたか、または1人の兄弟や配偶者と一緒に旅行していました。
6. 親または子供の数 (`Parch`): 生存しなかった乗客の大多数は親または子供と一緒には旅行していませんでした。

これらの観察は、生存結果に影響を与えた一部の要素を示しています。例えば、性別、クラス、年齢は特に重要な役割を果たしているように思われます。

## さいごに
見事にデータに対する分析結果が返ってきました。
その他にもグラフを描画してくれたりと便利な機能があるので試してみたいと思います。
A summary of debugging Python code from the basics【ステップ実行】

## ステップ実行とは？

Python デバッガーの機能の一つで、プログラムを1行ずつ実行し、変数や式の値の変化を確認しながらデバッグできる機能のこと

## ステップ実行でなにがわかるか？

- プログラムの実行の流れを把握できる
- 変数や式の値の変化を確認できる
- エラーの原因を特定できる

## ステップ実行を行う方法

(1) デバグモードにはいる

① ▷を押下して、実行する

(2) 行目の行番号の左側をクリック

① 赤いボタンが登場する（これがブレークポイントで、デバッグモードで止まってほしいところに設定する）

(3) ▷を押す

① デバグモードのナビゲーションが登場
※ ここから１行ずつ進めるには，ステップオーバー(左から2個目のボタン)をクリックする[* F10を押す(推奨)]

②F10のたびにエディタの左側ペインに変数が変化していく様子がわかる





## Reference site
[python:: VS Codeでステップ実行](https://scrapbox.io/fujii-memo/python::_VS_Code%E3%81%A7%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E5%AE%9F%E8%A1%8C)
新しいデザイナーってバグだらけ？

[Microsoft 365の活用ネタのまとめに戻る](https://qiita.com/Keiji_otsubo/items/5ddec87d5f1fd4e9f4af)


従来のデザインだと変数は簡単に表示されるけど...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b3623e8a-785c-1ecf-7fe2-e07621896e9a.png)

検索できませんね。使いにくい。正直あんまり利用する気にはなれないなぁ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/74b18691-3181-ec5d-0ffa-6eff831c8ac2.png)

すべてを選んでもダメです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f8045b28-22b4-cc93-d7a8-11b6aa4012ef.png)

組込を選ぶと表示される... 何で？すべてには組込は含まれないのか？　日本語のラベルがおかしい？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5a2dc2da-4a06-5e72-3162-e671dc35108c.png)



「Dataverse（データバース）」とは、Power PlatformやDynamics 365で使用されているデータベースのことで、Microsoftが提供しています。 以前までは「Common Data Service」と呼ばれていました。
TypeScript実践2：高度なジェネリクスとデコレータの使い方

前回の記事では、TypeScriptのジェネリクスとデコレータについて基本的な使い方を説明しました。今回は、より高度な使い方を紹介します。

【目次】

1. [TypeScript入門：型定義の基本と使い方](https://qiita.com/hanahagewanko/items/9d1d0246a80ef52e8f27)
2. [TypeScript実践1：ジェネリクスとデコレータの使い方](https://qiita.com/hanahagewanko/items/ab0f961f443d346d8fc1)
3. TypeScript実践2：高度なジェネリクスとデコレータの使い方(←今ここ)
4. TypeScript実践3：インターセクション型とユニオン型
5. TypeScript実践4：コンディショナル型
6. TypeScript実践4：高度なデコレータの活用法

## ジェネリクスにおける条件型の利用
TypeScriptでは、型に対して条件を指定することができます。この条件型を使うことで、特定の型に制限を加えたり、型を変換したりすることができます。

例えば、以下のような型を考えます。

``` typescript
type MyType<T> = T extends string ? string : number;
```

この型は、Tがstring型を継承している場合にはstring型を返し、
そうでない場合にはnumber型を返します。
これを使うことで、以下のような関数を作成することができます。
``` typescript
function myFunction<T>(value: T): MyType<T> {
  if (typeof value === "string") {
    return "string";
  } else {
    return 0;
  }
}
```
この関数は、引数の型に応じてstring型またはnumber型を返します。

## デコレータファクトリの利用
デコレータは、クラスやメソッドなどに対して実行時に何らかの処理を行うための仕組みですが、デコレータ自体にもパラメータを渡すことができます。このパラメータを使って、動的な処理を行うことができます。

例えば、以下のようなデコレータファクトリを考えます。

```typescript
function myDecoratorFactory(param: string) {
  return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log(param);
    descriptor.value();
  };
}
```
このデコレータファクトリは、引数に渡された文字列をログ出力し、その後にデコレートされたメソッドを実行します。
これを以下のように使うことができます。

```typescript
class MyClass {
  @myDecoratorFactory("Hello, world!")
  myMethod() {
    console.log("myMethod is called.");
  }
}
```
このように、デコレータファクトリを使うことで、動的な処理を行うことができます。


以上、TypeScriptのジェネリクスとデコレータの高度な使い方について紹介しました。これらの機能を駆使して、より堅牢なコードを書くことができるようになりましょう。
[Ruby]インスタンス変数と普通の変数の違い

## はじめに
Rubyのコードを見たとき、何これ（下のコードを参照）と思ったことがあったのでインスタンス変数の違いと普通変数の違いをまとめます。

```.rb
@calculator = Calculator.new
```

## 目次
- はじめに
- 違い
- インスタンス変数とは
- 普通の変数とは
- おわりに


## 違い
3つの要素による違いがあります。

- スコープ
- 寿命
- 表記方法

それぞれ以下で解説します。

## インスタンス変数とは

【スコープ】
- インスタンス変数は、クラスのインスタンス内で有効
- クラスのメソッド内やインスタンスメソッド内で宣言され、そのクラスのインスタンス内で共有される

【寿命】
- インスタンスが存在する限り生きてる！
- インスタンスが亡くなったら破棄される！

【表記法】
以下参照

```.rb
@instance_variable = "This is an instance variable"
```

##　普通の変数とは

【スコープ】
- 通常の変数は、メソッド内で宣言されます!
- メソッド内でのみ有効です！

【寿命】
- 変数が宣言されたスコープでのみ使えます!
- ブロックやメソッド終了とともに滅びます！

【表記法】
以下参照

```.rb
nomarl_variable = "This is an normal variable"
```

## おわりに
2つの違いを総括します

- スコープ
- 寿命
- 表記方法

コードで表すと以下のような感じです！

```.rb
class Example
  def initialize
    @instance_variable = "I am an instance variable"
    local_variable = "I am a local variable"
  end

  def example_method
    # @instance_variable はこのメソッド内でアクセス可能
    puts @instance_variable

    # local_variable はこのメソッド内でのみアクセス可能
    # 他のメソッドやクラス外からはアクセスできない
    puts local_variable  # エラーが発生する可能性があります
  end
end

```