OmniAICreator/Qiita-1.07M huggingface dataset:
プロパティ変数を使ったWorkatoの環境別設定：BOX、Teams、Zendeskの事例紹介

# はじめに
[こちらの記事](https://qiita.com/t-tabata/items/e344ed5ff5f8f3f0eeb5)では、Workatoのプロパティ変数についてお伝えしました。
実際にどんな値を設定して活用するのでしょうか？

この記事では、Workatoのプロパティ変数の活用例についてご紹介します。

# プロパティ変数の活用例
プロパティ変数の使い方の一つとして、試験環境・本番環境といった環境で設定する値が異なるものを利用するときに用います。具体的な例を以下に示します。

* BOXで試験用と本番用のフォルダを分けて利用する場合
* Teamsで試験用と本番用のチャネルに分けて通知する場合
* Zendeskで試験用と本番用のブランドで分けて利用する場合

※この他にも活用方法は多数あります。

### BOXで試験用と本番用のフォルダを分けて利用する場合
BOXのフォルダでは、フォルダIDというIDによって一意に定められています[(参考)](https://ja.developer.box.com/reference/get-folders-id/)。
このIDをプロパティ変数に指定することで、レシピを変更することとなく、フォルダを切り替えることが可能となります。

以下の例は、フォルダ作成時のルートフォルダをプロパティ変数から指定しているものとなります。
![box_pic_20240906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/50406980-bdc4-8b22-7ab6-372e2ebf305d.png)


### Teamsで試験用と本番用のチャネルに分けて通知する場合
Teamsでは、TeamIDとChanelIDを用いることで指定のチャネルにメッセージを通知することができます[(参考)](https://learn.microsoft.com/ja-jp/graph/api/chatmessage-post?view=graph-rest-1.0&tabs=http)。
これらのIDをプロパティ変数に指定することで、レシピを変更することとなく、通知先のチャネルを切り替えることが可能となります。

以下の例は、メッセージ送信APIのリクエストURLをプロパティ変数で切り替えているものとなります。
![teams_pic_20240906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/f0e7a432-f5be-698f-6aed-6d92cd03adf2.png)



### Zendeskで試験用と本番用のブランドで分けて利用する場合
Zendeskにおいて[ブランド](https://support.zendesk.com/hc/ja/articles/4409148727834--%E3%83%96%E3%83%A9%E3%83%B3%E3%83%89-%E6%A9%9F%E8%83%BD%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B-%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E9%9B%86)は、ブランドIDというIDで一意に定められています[(参考)](https://developer.zendesk.com/api-reference/ticketing/account-configuration/brands/)。
このIDをプロパティ変数に指定することで、レシピを変更することとなく、利用するブランドを切り替えることが可能となります。

以下の例は、チケット作成または更新時に処理対象のブランドのチケットかをプロパティ変数で判定するものとなります。
![zendesk_pic_20240906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455960/0435da55-195c-6c16-901c-49ab25d51366.png)





# まとめ
まとめると、以下のようになります。

* 試験環境・本番環境といった環境で設定する値が異なるものを利用する際にプロパティ変数を利用することでレシピを変更することなく、値を設定することができます
* 値を設定することで、アクセス先を切り替える例をご紹介しました

# おわりに
いかがでしょうか？ Workatoではプロパティ変数を用いて環境によって異なる値の設定を容易に実現することが可能です。

Workatoの導入・導入後の活用などでお困りの場合、Workatoリセラーにご相談する方法もございます。お困りごとがございましたら、認定リセラーの[日立ソリューションズ](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=4dce18053620c32fc115)へ是非ご相談ください。

# 参考リンク

* 株式会社 日立ソリューションズ
    * [Workato ご紹介サイト](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato/?utm_source=sns&utm_medium=qiita&utm_campaign=4dce18053620c32fc115)
Scala3対応してないライブラリどうする？

皆さんごきげんよう。最近は社内のプロジェクトをScala3/Play3にする職人と化しています。そんな作業の中で、既存プロジェクトがScala3対応していないライブラリを使っていたりするとなかなか移行の判断が難しくなったりします。この記事では、2024年9月時点で、既存Play2.9/Scala2.13プロジェクトをPlay3.0/Scala3.3に移行するにあたり、ライブラリの移行の指針について紹介します。あくまで一例であり、「うまくいうかもしれないよ」程度でご覧ください。

# 「Scala3対応していないライブラリ」とは

ここでは、**そのライブラリの2.13バージョンを利用できないもの**を指します。Scala3は後方互換性があり、Scala2.13向けのライブラリを使えます。便利ですね。そのため、たとえScala3向けのバイナリが提供されていなくても、

```scala
"groupId" %% "artifactId" % "version"
```

これを、

```scala
"groupId" % "artifactId_2.13" % "version"
```

にすると使える可能性があります。

# Scala3対応していないライブラリ

以下では、前述した対応では対処できないライブラリについて代替案を提示します。

## shapeless

https://github.com/milessabin/shapeless

shapelessのSizedやHListは、Scala3のタプルが代替案になります。公式ドキュメントをみれば、書き換えも容易でしょう。困ったならCopilotに聞くと、良い感じにコード生成してくれます。

https://www.scala-lang.org/2021/02/26/tuples-bring-generic-programming-to-scala-3.html

## ficus

https://github.com/iheartradio/ficus

hocon設定ファイルを任意のケースクラスにバインドするライブラリです。Playを使っている場合、Play2.6でConfigLoaderが提供されたため、それを使うことができます。

https://www.playframework.com/documentation/latest/ScalaConfig#ConfigLoader

## mockito-scala

https://github.com/mockito/mockito-scala

mockitoを自然なDSLで書けるようにするライブラリです。Java版mockitoと比べてあまりにも自然に読み書きできるのでmockito DSLであることを忘れてしまうくらい素晴らしい出来ですがScala3対応していません。私はscalatestplus.mockitoを使うことにしました。

https://github.com/scalatest/scalatestplus-mockito

## play-json4s-jackson

https://github.com/tototoshi/play-json4s

playでjson4sを使えるようにするライブラリです。そもそものplayのバージョンアップに追随できていないので、代替を探す必要があります。候補としてはjson4sを直接使ったり、そのほかのライブラリに移行することになります。ちなみに私はplay-jsonを使いました。

## play2-pager

https://github.com/gakuzzzz/play2-pager

playでページャーを自動的に作成してくれる便利ライブラリです。これもplayのバージョンに追随できていないので代替を探す必要があります。私はフォークして自前でパブリッシュして対応しました。

## metrics-play

https://github.com/kenshoo/metrics-play

playのメトリクスを取得できるフィルターを提供するライブラリです。オンプレだと便利ですが、クラウドだと各種メトリクスはそのクラウドベンダーがいい感じのものを提供してくれるので、不要そう。

## play2-memcached

https://github.com/mumoshu/play2-memcached

playでmemcachedを使えるようにするライブラリです。同様に自前でパブリッシュして対応しました。（本当はコントリビュートしたかったけど、現状のプロジェクトだと自分の技術力では無理そうだった...）

## sbt-scalate-precompiler

https://github.com/scalate/sbt-scalate-precompiler

scalateで使えるテンプレートファイルを事前にscalaコードにコンパイルすることで、文字列解析のコストをゼロにします。現在は自前でパブリッシュしたものを使っていますが、プルリクの進行度合いによっては本家対応されるかもしれません。

## 社内ライブラリ

こういうのが一番辛かったりします。そもそもScala3が発表されて3年も経っているので、今の時点で対応していないなら、もう自分が当事者になるしかありません。幸いsbtはscalaバージョンのクロスビルドに対応しているので、丁寧に設定ファイルをいじればscala2/scala3クロスビルド対応することが可能です。

https://www.scala-sbt.org/1.x/docs/Cross-Build.html

ただし、scala3ビルドする場合はsbt1.5以上が必要になります。そもそもsbtのバージョンが古すぎる場合はそこから対応する必要があります。

# まとめ

Scala3対応していないライブラリの紹介と、その代替案を提示しました。基本戦略としては、OSSならコントリビュート、社内ライブラリなら社内政治によってScala3ライブラリをパブリッシュするように動く、ダメなら自前でホストして使えるようにする、それでもダメなら代替案を探す、という感じになります。ただ、ScalaやPlayもバージョンアップによって使える機能が増えたため、単に代替ライブラリを探すのではなくScalaやPlayの機能を改めて確認するのも重要になってくるかもしれません。また、ここに挙げたのはあくまで現時点での解決策の一例であり、異なる解決策だったり、時間が経ったことでScala3対応が進むことで異なる解決策がベストになる可能性があるため、最新状況はご自身でご確認いただく必要があることにご注意ください。

以上です。対応した暁には、皆さんも良きScala3ライフをご堪能ください。
uwpアプリを起動するコマンドをGUIのみで確認する方法

こんにちは、[codebydeer](https://x.com/codebydeer)です。
今回は、UWPアプリの実行名を探す際にみんなPowerShellでやってたのが気に食わなかったので、GUIでの手順を紹介していきます。

https://x.com/codebydeer

https://codebydeer.com

# きっかけ

そもそもなんでこうなったかっていうと、カメラを「ファイル名を指定して実行」(`win` + `R`)から開きたかったのですが、ググってみたらこれが出てきまして、、、

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11201286516

この中の回答に
カメラはUWPアプリだからめんどいよ、また更にぐぐれかす
っていうのがありまして―
ぐぐってみたけど、パワーシェルめんどくせっ！ってなったんですね。

# 本題

#### 1. `win` + `R`で「ファイル名を指定して実行」を起動し、`shell:AppsFolder`と入力・実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521024/2e2cdcc1-e05c-b5bc-98c3-8066c7d58952.png)

#### 2. 出てきた一覧の中から目的のアプリを探し出し、右クリックしてショートカットを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521024/6718d6d2-c34e-2591-1ba5-b6d1b433400c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521024/30d64606-2b1d-9ed1-2636-60ccaeafb1bb.png)

#### 3. 「デスクトップ上に作成しますか？」で はい を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521024/ed739951-534d-f73c-da05-7a974df6d612.png)

#### 4. デスクトップ上にできたショートカットのプロパティーを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521024/c64fba78-6d09-4e2d-0f4b-4e93345cca2b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521024/7d95c790-c5e7-dbb4-13cb-d5d435098851.png)

#### 5. 「種類」の所をスクショ(`win` + `Shift` + `S`がおすすめ)して、googleレンズに張り付ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521024/c86f83a8-bb96-6c2c-2e06-d76ca63b8bd0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521024/2fcbe015-faa6-df16-481b-3ad9249b5738.png)

#### 6. `shell:AppsFolder\[コピーしたテキスト]`が実行コマンドになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521024/9a96378f-e89e-f6b6-0614-cb597873ef3c.png)

# さいごに

いいね乞食してます(^^)よかったらいいねしてくれると嬉しいです
【UE5】Character Movementの「Is Falling」でTickを使用せずに着地を判定する

# 0.最初
Character MovementのIs FallingをTickで監視して着地判定を取る

個人的にはTickはあまり使用したくない

![スクリーンショット 2024-09-22 015218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/e55e36e5-f753-96aa-5256-171be4a7b10a.png)

# 1.結論
![無題の動画-‐-Clipchampで作成-_1_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/f1c2a1f8-4f8f-dcf7-d687-8aeb9bc196af.gif)

Landed Delegateで接地判定を取得できる

![スクリーンショット 2024-09-22 014833.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/019fe354-a399-97fe-384f-bc2e7b3f6b0b.png)
PCにインストールされいるソフトウェアを一括でアップグレードする方法

今回はwingetコマンドを使ってPCにインストールされているソフトウェアを一括でアップグレードしてみます

## 手順 
### コマンドプロンプトまたはターミナルを実行（管理者で実行を推奨）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499306/36e8a803-f801-b1ac-ec42-ee7ef4f91f27.png)

### アップグレード可能なアプリケーションがあるかを確認
``` powershell
winget upgrade
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499306/25ca8799-73d8-ce2b-08d9-b64505db407d.png)

### ある場合は一括更新を実施
```powershell
winget upgrade --all
```
:::note info
ログは必ず確認しよう！
【理由】
失敗する可能性もあるため
Appによってはアップグレードが進まない場合もある（Discordなど）
インストール作業が完全

:::

LINEアプリは何故かうまくいかない・・・（ここは手動でアプグレ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2499306/1a24c5d9-e1d5-5e66-7ac4-ded7222c0a26.png)

## ps1ファイルを作ってみた
分岐処理とか初めてだったので最終的に構築できず・・・
Copilotにちょっと修正してもらった
```powershell
echo "アップグレード可能なアプリを確認します"
winget upgrade

$title = "確認"
$message = "上記アプリケーションの一括更新を実施しますか？"

$yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "一括更新を実施します"
$no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "処理を中断します"

$options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)

$result = $host.ui.PromptForChoice($title, $message, $options, 0)

switch ($result)
{
    0 { echo "一括更新を実行します"; winget upgrade --all }
    1 { echo "処理を中断します" }
}

Pause
```

## まとめ
・wingetコマンドを使えば、アプリの一括更新がとても簡単にできる
・でも更新アプリが多い場合、めちゃくちゃ時間掛かる＆CPU使用率が上がるので要注意
・ps1ファイルを作成して対話型にしてみたけど、初心者にとっては難しかった（PowerShell上級者の皆さんにとってはきっと容易に出来る部分と思われ）

ご覧いただきありがとうございました！ｍｍ
【Supabase Auth】認証認可の際に表示されるエラーメッセージの日本語化

## 概要
本記事では、SupabaseとFlutterを使用した開発において、
認証認可周りのエラーメッセージを日本語に翻訳する関数（translateError）を紹介します。


## サンプルコード

```
// 英語のエラーメッセージを日本語に翻訳する関数
String translateError(String errorMessage) {
  const errorTranslations = {
    // エラーメッセージとその日本語訳
    'email rate limit exceeded': 'メールの送信制限を超えました。しばらく待ってから再試行してください。',
    'email_not_confirmed': 'メールアドレスが確認されていません。確認メールをチェックしてください。',
    'Email not confirmed': 'メールアドレスが確認されていません。確認メールをチェックしてください。',
    'over_email_send_rate_limit': 'メールの送信制限を超えました。しばらく待ってから再試行してください。',
    'email_already_in_use': 'このメールアドレスはすでに使用されています。',
    'invalid_email': 'メールアドレスが無効です。正しい形式を使用してください。',
    'missing email or phone': 'ログインに必要な項目が入力されていません。',
    'Anonymous sign-ins are disabled': 'ログインに失敗しました。',
    'User already registered': 'このユーザーは既に登録されています。',
    'Invalid login credentials': 'ログイン情報が誤っています。',
    'Password should be at least 6 characters': 'パスワードは6文字以上である必要があります。',
    'validation_failed': '入力内容の検証に失敗しました。',
  };

  for (var errorKey in errorTranslations.keys) {
    if (errorMessage.contains(errorKey)) {
      return errorTranslations[errorKey]!;
    }
  }

  return 'エラー: $errorMessage';
}
```


## 結果
下記の様に日本語に翻訳されている事が確認できる。

![スクリーンショット 2024-09-22 1.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/807ef111-831a-c3b7-126e-255a130de9f1.png)

![スクリーンショット 2024-09-22 1.38.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/c25f8f9f-1230-24c2-455c-e665abc94240.png)

![スクリーンショット 2024-09-22 1.39.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/90140e20-e907-0787-5799-23c0eee6ece4.png)


## その他コード
ログイン処理やサインアップ処理が出来るサンプルコードは下記です、
GitHub にアップしてますので、必要な方は確認してください。
自分のリポジトリにフォークしてクローンしていただいたあと、Supabase の
APIキー（anon key）と SupabaseプロジェクトURL を main.dart に記載していただければすぐに使える状態になります。
詳細は README を確認してください。

https://github.com/tks-00/sample_supabase_auth
SafariでiPhoneをインスペクトできない時にみる記事

## 結論

iPhoneはバージョンによってインスペクトできるものとできないものがあるみたいです。対策としてはコードで記述する必要があるみたいです。

## 原因

[こちら](https://webkit.org/blog/13936/enabling-the-inspection-of-web-content-in-apps/)によるとiOS16.4からWKWebViewの仕様が変わったようです。

## 変更点

> Across all platforms supporting `WKWebView` or `JSContext`, a new property is available called `isInspectable` (`inspectable` in Objective-C). It defaults to `false`, and you can set it to `true` to opt-in to content being inspectable. This decision is made for each individual `WKWebView` and `JSContext` to prevent unintentionally making it enabled for a view or context you don’t intend to be inspectable. So, for example, to make a `WKWebView` [`inspectable`](https://developer.apple.com/documentation/webkit/wkwebview/4111163-inspectable/), you would:
> 

今回の16.4バージョンから`isInspectable`プロパティが追加されました。これを`true`にするとリリースビルドのWebViewアプリをSafariでデバックできるようになります。

## 対応

[参考記事](https://iridge-tech.hatenablog.com/entry/2024/03/21/120000)の追記をすることでインスペクトが可能になります。今回、私が実践した際には`isInspectable`を定義してなかったので下記のコードを追記しました。

```swift
extension WKWebView {
    func enabledSafariInspector() {
        #if DEBUG
            if #available(iOS 16.4, *) {
                if self.responds(to: Selector(("setInspectable:"))) {
                    self.perform(Selector(("setInspectable:")), with: true)
                }
            }
        #endif
    }
}
```

## 参考記事

https://iridge-tech.hatenablog.com/entry/2024/03/21/120000

https://webkit.org/blog/13936/enabling-the-inspection-of-web-content-in-apps/
ESP32S3でサーボを4つ以上動かす

# 背景
元々、ESP32Servoライブラリを使っていたが、サーボ4個以上になると最初の3つ以外動かなくなる。
# 環境
Windows11
ESP32S3N16R8チップを使った自作基板
PlatformIO

# 試したこと
## ledcwriteで動かしてみる
[複数のサーボを動作させる際の注意点メモ](https://note.com/touhunikki/n/n534d69f95ef3)を参考にし、ledcwriteで書いてみた

[ESP32Servoライブラリのexamples](https://github.com/jkb-git/ESP32Servo/blob/master/examples/Multiple-Servo-Example-ESP32/Multiple-Servo-Example-ESP32.ino)も、ESP32Servoライブラリを使っているわけではないようなので、これを参考とした

https://github.com/jkb-git/ESP32Servo/blob/master/examples/Multiple-Servo-Example-ESP32/Multiple-Servo-Example-ESP32.ino

→動かなかった…

ただ、issueを見ていると、ESP32-S3-Wroom-1で動かないという気になる記載が…

https://github.com/jkb-git/ESP32Servo/issues/11

更に追っていくと、LEDc周りは125Hz以下で使えないようにボードバージョン2.0.4で変更があり、サーボの周波数は50Hzなので使えないのでは、ということであった

https://forum.arduino.cc/t/esp32-s3-not-working-with-2-servos/1157409/9

とりあえずの解決策としてはESP32-ESP32S2-AnalogWriteライブラリが使えるらしい
トーン音なども出せるようだ

https://github.com/Dlloydev/ESP32-ESP32S2-AnalogWrite


## ESP32-ESP32S2-AnalogWriteで動かしてみる

https://forum.arduino.cc/t/esp32-s3-not-working-with-2-servos/1157409/14

こちらの通りのサンプルコードで動いた
ESP32-ESP32S2-AnalogWriteのサンプルコードのServoのサンプルコードの方も試したが、動作しなかった
pwmWrite.hが重要らしい

それならなぜESP32servoで2つ動くのかは今後調査予定。
PATHを通す方法（Mac）

## PATHとは？
### PATHを通す目的
特定のプログラムを「プログラム名だけで実行できるようにする」こと

### 「プログラム名だけで実行する」とは？
本来ならば、プログラムを実行するためには長い指示（コード）を出さなければならない。
例えば、nodeを実行するとき、フルパスは `/usr/local/opt/node/bin` となるので、node上のtest.jsファイルを実行するためには、`/usr/local/opt/node/bin/test.js` を毎回コマンドに入れる必要がある。
そこをパスを通すことで、`test.js` とコマンドに指示するだけで実行できるようになる。


もっと詳しいPATHの仕組みについて学びたい方はこちら（https://qiita.com/sta/items/63e1048025d1830d12fd#path-%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%AF%E3%81%A9%E3%81%86%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE ）


## PATHを通す方法
### PATHを設定する
PATHを通すには.bash_profileに下記を記入する。
`export PATH=$PATH:通したいPATH`
例えば/Users/test/にPATHを通したい場合
`export PATH=$PATH:/Users/test/`
でOK。

### .bash_profileを更新する
ターミナルを開き直す。もしくは、sourceコマンドで更新する。
```
source ~/.bash_profile
```

### PATHの確認方法
ターミナルに次のコマンドを打つと現在のPATHを確認できる。
```
printenv PATH
```
もしくは
```
echo $PATH
```
でもOK。
実行すると次のような文字列が帰ってくる。（『:』はPATHの区切り）
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/test/
目的のPATHがここに記載されていれば成功。



参考：
「PATH を通す」の意味をできるだけわかりやすく説明する試み（https://qiita.com/sta/items/63e1048025d1830d12fd ）
MacでPATHを通す(https://qiita.com/nbkn/items/01a11392921119fa0153 ）
Atcoder Beginner Contest 372の学習

Atcoder Beginner Contestも3回目を迎えました。今回こそはCまで解けるかと思いきや、TLEとなりまたもや3冠ならず...

実はしっかり復習できていないのが問題なのではと思いQiita投稿を始めることにしました。今回はC問題で詰まったのでその復習がてら記事を書いていきます。

[Atcoder Beginner Contest 372 C問題](https://atcoder.jp/contests/abc372/tasks/abc372_c)

さて、以下が私の提出したコードになります。
```python
N, Q = map(int, input().split())
S = input()  
data = [] 

for _ in range(Q):
    X, C = input().split()
    X = int(X)  
    data.append((X, C))  

for i in range(Q):
    X, C = data[i]  
    S = list(S)  
    S[X - 1] = C  
    S = ''.join(S)  
    print(S.count('ABC'))  
```
はい、まあThe・初心者って感じのコードとなっております。そこでコンテスト終了後に色々試してみた結果、大きく3つの問題点が浮かび上がりました。

# わざわざ配列に代入してしまっていた
はい、そんなことしなくてもfor文回してその都度代入からの文字列'ABC'のカウントをすればよかったんですな...

これだと代入してからまた取り出すという二度手間が発生してしまい美しくない。最終的に配列として出力する必要がない問題に関しては気をつけなければと思った次第です。

# S = list(S)をfor文の中に入れてしまっていた
これはコンテスト中意識できていませんでしたが、わざわざSを配列型にした後でX番目をCと入れ替えて再度文字列に直す動作を毎回繰り返していたらメモリ食ってしゃーないって話ですよね。でも今のコードのままではどうしようもなさそう...
そこで次の問題に対する対処法が活きてくるのでした。

# Sの文字列を毎回全て考慮するのは効率が悪かった
はい、文字列内の変更箇所の前後にさえ注目できていればよかったんです。具体的にはX番目の２つ後ろから2つ後までの中で'ABC'カウントがどう変化するかだけを考えるのです。

こうしてできたコードが以下になりました。
```python
N, Q = map(int, input().split())
S = input()  
counter = S.count('ABC')
S = list(S) 

for _ in range(Q):
    X, C = input().split()
    X = int(X)  
    counter -= ''.join(S[max(X - 3, 0):X + 2]).count('ABC')
    S[X - 1] = C  
    counter += ''.join(S[max(X - 3, 0):X + 2]).count('ABC')
    print(counter)
```
ここでmax(X-3, 0)としているのは、もしXが1、2番目だった場合にきちんとS[0]を先頭とする文字列として扱いたいからです。

# 最後に
ただコンテストを受けるだけでなく、今の自分が書ける最大限可読性、計算量に配慮したコードを書けるように学んだことをアウトプットしていこうと思います。
WindowsのWSL環境「0x8004032d」エラー対応方法

# 概要

Windows 10 or 11にWSLでUbuntuをインストールしようとすると下記のようなエラーに遭遇することがある。
※「Windowsの機能の有効かまたは無効化」で「Linux用Windowsサブシステム」と「仮想マシンプラットフォーム」が有効化されていることが前提である。

これはWSL側の更新かカーネル更新プログラムが実行されていないと発生する。

```
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x8004032d
Error: 0x8004032d (null)
Press any key to continue...
```

**PowerShellでWSLの更新**

```
wsl.exe --install
wsl.exe --update
```

**それでもダメな場合はカーネル更新すると解消する**

カーネル更新プログラム

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

# インストール成功例

```
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:
```

# 参考

https://learn.microsoft.com/ja-jp/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package
初心者エンジニアによるAndroidアプリ開発日記②

# まえがき
開発環境を整え、作成するアプリのイメージも固めたので、AndroidStudioで新規プロジェクトを作成しました。

前回は[こちら](https://qiita.com/hukusima65/items/2b4af030fdc74942ec48)

# 目次
* [概要](#概要)
* [新規プロジェクトを作成する](#新規プロジェクトを作成する)
    * [新規プロジェクトのテンプレートを選択](#新規プロジェクトのテンプレートを選択)
    * [新規プロジェクトの設定](#新規プロジェクトの設定)
* [終わりに](#終わりに)

---

## 概要
この記事では、AndroidStudioで新規プロジェクトを作成する過程で調べた内容を記載する。

## 新規プロジェクトを作成する
新規プロジェクトのテンプレートを選択し、設定を行っていきます。

### 新規プロジェクトのテンプレートを選択
AndroidStudioを立ち上げ、New Projectを選択すると、下のような画面が立ち上がると思います。この画面から、新規プロジェクトのテンプレートを設定します。

![スクリーンショット 2024-09-21 161103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890153/c9be4efc-9a6c-5554-334e-e09ee628f550.png)


今回作成したいものはスマホ向けのアプリであるため、左のテンプレートからは**Phone and Tablet**を選択します。

右から選択するものは、開発するアプリのひな型になるようです。今回作成するものは簡単なクイズアプリということで、シンプルなEmpty ActivityまたはEmpty Views Activityを採用したいところですが、この二つには以下のような違いがあるようです。 <br>

Empty Activity：アプリ画面の作成にJetpack Composeを使用
Empty Views Activity：アプリ画面の作成にXMLを使用

本業で触るアプリの画面はXMLが用いられていると聞いたので、今回は**Empty Views Activity**を選択します。

>Jetpack Composeは、[こちら](https://developer.android.com/codelabs/jetpack-compose-basics?hl=ja#0)から勉強できそうです。いつかチャレンジしてみたい所存。

### 新規プロジェクトの設定
テンプレートを設定すると、下のような画面が開きます。ここでは、新規プロジェクトの設定を行っていきます。

![スクリーンショット 2024-09-21 162117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890153/562c6b15-6001-10c3-3546-ba4a8b92935b.png)

#### Name
プロジェクトの名前を設定します。デフォルトでは「My Application」となっています。今回は国旗クイズアプリを作るので、「FlagQuizApp」としました。

#### Package name
デバイス上でアプリを一意に識別するための名前になります。私の場合、Nameを入力するとこちらも自動で入力されました。Package nameについて、詳しくは[こちら](https://support.google.com/admob/answer/9972781?hl=ja)。

#### Save location
プロジェクトの保存場所になります。

#### Language
開発言語を設定します。今回はKotlinを選択しました。

#### Minimum SDK
アプリがサポートする最小のAndroidバージョンを選択します。

#### Build configuration language
プロジェクトのビルド設定を記述するための言語を選択する項目です。KotlinとGroovyから選択できましたが、KotlinがRecommendedとあるので今回はKotlinを選択しました。

>以上で新規プロジェクトを作成することができました。

## 終わりに
今回は、新規プロジェクトの作成について調べたことをまとめました。次回はプロジェクトのフォルダ構成や、AndroidStudioの機能について、調べた内容をまとめていきたいと思います。

次回は[こちら](https://qiita.com/hukusima65/items/8d3e131a11215091adac)

### 参考
* [https://developer.android.com/codelabs/basic-android-kotlin-training-first-template-project?hl=ja#1](https://developer.android.com/codelabs/basic-android-kotlin-training-first-template-project?hl=ja#1)
* [https://codeforfun.jp/android-studio-empty-activity-vs-empty-views-activity/](https://codeforfun.jp/android-studio-empty-activity-vs-empty-views-activity/)
【SSv5】Bluetooth AoAデモを動作させる手順

## 背景  
Simplicity StudioでAoAのデモを動かそうとしたのですが、かなり手こずったため備忘録として残しておきます。  
主に以下のサイトの内容をもとに、ポイントをメモしています。  

https://www.silabs.com/documents/public/quick-start-guides/qsg175-direction-finding-solution-quick-start-guide.pdf

## 環境
OS：Windows 10  
IDE：Simplicity Studio Version: SV5.9.3.0  
SDK：Gecko SDK Suite 4.4.4
マイコンボード：PCB4001 Rev A03 
アンテナ：BRD4191A Rev A02  
タグ：BRD41848 Rev A04  

Gecko SDK Suite(v4.1以降)のインストールが終わっている状態であること。  
未インストールの場合は、
```
Installタブ
->Install by connecting device(s)
 ->接続しているマイコンボードを選択
  ->Auto
```
で自動的にインストールしてくれるが「Auto」画面が終わらない場合はAutoの代わりに「Advanced」を選択し、手動でインストールする。  


## 接続  
基本的に刺さるようにしか刺さらないが、以下のリボンケーブルの向きに注意する。  
(ここを間違えると、のちにS/Wが書き込めないため)  

1番ピン側に赤い線がくるように接続する。  
![PXL_20240921_144725276.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/1a312b08-5210-dd67-a877-8d52860ae215.jpeg)


## アンテナ側の手順  
マイコンボードを接続しIDEを起動した画面から設定する。  
![General_Infomation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/358f447f-bdd0-9648-2deb-2d71644559d7.png)

設定項目が表示されない場合や、マイコンボードが認識されない場合は以下を参照するといいかもしれない。

https://qiita.com/TetoraTechLab/items/2c045e7d7da3a3dd3c4b

https://qiita.com/TetoraTechLab/items/b8f46d9f146367ce85f3


### Connected Via  
アンテナを追加する。 
Revはアンテナに記載してあるので、そのRevを選択する。  
選択後、反映されていないように見える場合があるが、ウィンドウを縦に伸ばすと見えるようになる。  
![Board_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/c84a3b37-0bae-3ee1-2e25-21824cc7e89f.png)


### Debug Mode  
OUTに変更する。  
![Adapter_configuration_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/635a3853-956c-acdb-9f70-05eb1e59b098.png)


### Preferred SDK  
Gecko SDK Suiteを選択する。  
![General_Infomation_sdk_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/bf54f787-0791-3840-871a-57f9ab45f764.png)


### S/Wの書き込み  
「Example Projects & Demos」から「Bluetooth AoA – NCP Locator demo」を探し、「Run」する。  
![write_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/36e998d6-ed49-9f37-9d0e-370f914e4159.png)

上手く書き込めないと以下のウィンドウが表示される。  
配線の確認や、コネクタの抜き差しを行うと解決するかも。  
![problem_occurred.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/13375a0a-c268-512a-7456-2ea4d0b244d3.png)


## タグ側の手順  
タグを選択した上で「Example Projects & Demos」から「Bluetooth AoA – SoC Asset Tag demo」を探し、「Run」する。  
![write__.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/78f62aa1-e8b2-fb54-7fba-f7682ea8db2d.png)


## 動作確認  
マイコンボードを右クリックし、「AoA Analyzer」「4x4 Dual Polarized Board」を選択する。  
![select_aoa_analyzer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/b10c976c-2cc7-6ae0-ce4b-0ab1c6175ded.png)

アンテナとタグの角度が表示されれば成功です。  
![aoa_analyzer_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295695/fd7b2925-4b98-34dd-73ed-0b416df19fce.png)
[Emacs] Ellamaの接続先を別PCで起動しているOllamaに設定する


## 目的
作業用のMacのスペックが低いため、MacのEmacs上でEllamaを使用しつつ、Ollamaを別PC（Ubuntu）で実行したい！

## 手順

### 1. Ubuntu側のOllamaのリモートアクセス設定
まず、Ollamaをリモートアクセスできるように、Ubuntu上で設定を行います。設定方法については、[こちら](https://zenn.dev/tatexh/articles/4102a9f0a06dec)の記事 を参考にしました :bow:



### 2. Emacs側のEllama設定
次に、MacのEmacsでEllamaを設定し、Ubuntu上で動作しているOllamaに接続します。以下は設定のサンプルです。

```emacs-lisp
(use-package ellama
  :init
  ;; setup key bindings
  (setopt ellama-keymap-prefix "C-c e")
  ;; language you want ellama to translate to
  (setopt ellama-language "Japanese")
  ;; could be llm-openai for example
  (require 'llm-ollama)
  (setopt ellama-provider (make-llm-ollama
                           :host "192.168.x.x" ;; <======= Ubuntu側のIPアドレスを指定
                           :chat-model "codestral:22b-v0.1-q4_K_S"
                           :embedding-model "codestral:22b-v0.1-q4_K_S")))                  
```

`:host` の部分で、UbuntuマシンのIPアドレスを指定します。

## おわり
Macのリソースを節約して、リモートでOllamaを利用できるようになりました :hugging: [^1] 
[^1]: Ubuntu側のリクエストログは、`journalctl -u ollama` で確認できます。

## 参考
https://blog.tomoya.dev/posts/emacs-on-local-llm/

Ollamaって何？の状態からでもこちらの記事を読めばすぐに導入できます。感謝です :bow:
GASを叩くSlack BotのEvent Subscriptions → Request URL Verifiedを無理やりクリアする

# 概要
- SlackとGASを連携した仕組みを用意したい
- GASでPost APIを用意したが、Slack BotのEvent Subscriptions → Request URL Verifiedが3秒以内で返す必要がありなかなかパスできない
- ということでやり方を考えたのでメモ

# 結論
- Challenge responseを返すコード**のみ**にして、デプロイする
    - デプロイバージョンを覚えておく※①
- Request URL Verifiedをパスする
- 真のコード群に変更し保存してデプロイする
    - デプロイバージョンを覚えておく※②
- デプロイ管理から、①を編集し、②のバージョンに切り替える

# なぜこういうことをしているのか

- コード量にもよるが、割とスプシへのRead/Write処理をいれるだけで処理完了時間が3秒超えがち
- そうすると、SlackのRequest URL Verifiedでパスできない（タイムアウトする）
- 下記コード量であれば1秒ぐらいで返せるようになるため、こいつでパスすれば良し
- ただし、GASはデプロイ単位でURLが変更になる...
- デプロイするとURLは変わるが、デプロイバージョンを編集すると別のバージョンにURLが同じでも切り替えることができる
- ので、一度パスするコードをデプロイして、その後に本当の実装のバージョンに切り替えることができる
- 補足するとRequest URL Verifiedは3秒タイムアウトがあるが、Slack Bot自体はおそらく正確なタイムアウト値はあるだろうが、10秒ぐらいだったら動作してくれる


# Challengeを返すコード

```javascript
function doPost(e) {
  var params = JSON.parse(e.postData.contents);
  return ContentService.createTextOutput(params.challenge);
}
```

これだけなら1秒ぐらいで返してくれる


# 雑感

めっちゃハマった。。。
InlineDPの注意点

## はじめに

こんにちは！競技プログラミングをやっている高校生の[ButterFlv](https://atcoder.jp/users/Butterf1v)です！
[問題の問題（ABC372-F）](https://atcoder.jp/contests/abc372/tasks/abc372_f)

:::note info
間違い等あればコメントやTwitterのDMにお願いします
:::


## InlineDPとは

InlineDPとはDPをするときに、その結果を記録している配列が操作によって一部しか変更がないときに、同じ配列を使いまわすことによって時間・空間計算量を落とすテクニックです。
 
最も有名な例だと、最長増加部分列を求めるアルゴリズム（LIS）とかになります。

## 本題

この記事で書きたいのは僕が陥ってコンテスト中に問題をACできなかった原因になったInlineDPの**落とし穴**です。また、そこから言えるInlineでないDPにおいて、**Inlineでないこと**から起こるやりがちなミスも書きたいと思います。

### InlineDPでDPに使う部分を並行して更新するべからず

InlineDPではほとんどの場合

* $\mathrm{dp}[i][j]=\mathrm{process}(\mathrm{dp}[i-1][0],\mathrm{dp}[i-1][1],\ldots ,\mathrm{dp}[i-1][N-1])$

を

* $\mathrm{dp}[i]=\mathrm{process}(\mathrm{dp}[0],\mathrm{dp}[1],\ldots ,\mathrm{dp}[N-1])$ ・・・①

のように変更することになります。

しかし、ここで安易に①を $i=0,1,\ldots ,N-1$ の順にやってしまったりすると右辺の項にすでにそのループで更新済みのものが出てきてしまうため計算結果が不正になってしまいます。

改善する方法としては、以下の方法などがあります。
* dpの操作を行った後に、実際に変化した項のみを別の配列で持っておいて操作をすべて終えた後に $\mathrm{dp}$ を更新する
* 更新に自明な順序が存在するときはその順で更新していく（降順など）

## 逆に、Inlineじゃないときの注意点

InlineDPの注意点を考えたときにInlineじゃないDPで気を付けなければならないことを思い出したので書いていきます。

### 配列のコピーを忘れるべからず
$\mathrm{dp}[i-1][j]$ から $\mathrm{dp}[i][j]$ への変更が必要ないとき、$\mathrm{dp}[i-1][j]$ が初期値のままになっていて計算結果が不正になっていたことはありませんか？（思い返してみれば僕は結構やってしまっているなと思いました。）

対策は、
* DPの本計算を行う前に一周走査してコピーしておく

とかでしょうか。（２倍の定数倍がつくかも。。。）

## さいごに

解法があっているのにACできないのは本当に悲しいので未然に防ぐ意識を持ちたいです。
投稿 83 Docker Volume  2024/09/21

本日の勉強時間　3H

ボリュームとは、Docker コンテナーにおいて生成され利用されるデータを、永続的に保持する目的で利用される仕組み。
バインドマウント はホストマシン OS のディレクトリ構造に依存しますが、ボリュームは完全に Docker によって管理される。
【 Reactのアンチパターン 】1, ( React Hooks) 条件付きでHooksを呼び出すアンチパターンとその解決策

## はじめに
React Hooksを使用する際、条件付きでHooksを呼び出したくなることがあります。

しかし、これは重大なアンチパターンであり、エラーや予期せぬ動作を引き起こす可能性があり、本記事では、そのアンチパターンの例と理由、そして最適な解決策をTypeScript（TSX）のコード例とともに解説します。

## アンチパターン例：条件付きでHooksを呼び出す

```tsx
import React, { useState, useEffect } from 'react';

interface ExampleComponentProps {
  shouldFetch: boolean;
}

const ExampleComponent: React.FC<ExampleComponentProps> = ({ shouldFetch }) => {
  const [data, setData] = useState<string | null>(null);

  // 条件付きでuseEffectを呼び出す（アンチパターン）
  if (shouldFetch) {
    useEffect(() => {
      fetchData().then((response) => setData(response));
    }, []);
  }

  return (
    <div>
      {data ? <p>{data}</p> : <p>Loading...</p>}
    </div>
  );
};

export default ExampleComponent;
```

### なぜこれが問題なのか
React Hooksは、コンポーネントのレンダーごとに同じ順序で呼び出される必要があり、条件文やループ内でHooksを呼び出すと、レンダーごとに呼び出し順序が変わる可能性があります。

これにより、Reactが内部で管理しているフックの状態と実際の呼び出しが不一致となり、以下のようなエラーが発生します。

:::note alert
Error: React has detected a change in the order of Hooks called...
:::

このエラーは、Hooksのルール違反を検知したReactが投げるものです。

:::note info
**レンダーとは**
Reactコンポーネントが描画（表示）される際のプロセス、つまりコンポーネント関数が実行される一連の流れを指す。

・**プロパティ（props）の変更**
親コンポーネントから渡されるデータが変化したとき。

・**状態（state）の変更**
useStateなどで管理しているコンポーネント内の状態が変化したとき。

・**コンテキスト（context）の変更**
useContextで参照しているコンテキストの値が変化したとき。
:::

### 最適な解決策：Hooks内で条件分岐を行う

条件に応じて処理を分岐させたい場合は、Hooks自体は常に呼び出し、その内部で条件分岐を行うようにします。

```tsx
import React, { useState, useEffect } from 'react';

interface ExampleComponentProps {
  shouldFetch: boolean;
}

const ExampleComponent: React.FC<ExampleComponentProps> = ({ shouldFetch }) => {
  const [data, setData] = useState<string | null>(null);

  // useEffectは常に呼び出す
  useEffect(() => {
    if (shouldFetch) {
      fetchData().then((response) => setData(response));
    }
  }, [shouldFetch]); // 依存配列にshouldFetchを追加

  return (
    <div>
      {data ? <p>{data}</p> : <p>Loading...</p>}
    </div>
  );
};

export default ExampleComponent;
```

### 解説

:::note info
**useEffectの呼び出しは常に行う**
これにより、Hooksの呼び出し順序が一定になります。
:::

:::note info
**内部で条件分岐を行う**
shouldFetchの値に応じて、fetchDataを呼び出すかどうかを制御します。
:::

:::note info
**依存配列にshouldFetchを追加**
shouldFetchが変化したときに効果が再実行されるようにします。
:::

### 補足：fetchData関数の実装例
以下は、fetchData関数の簡単な実装例です。

```tsx
const fetchData = async (): Promise<string> => {
  // APIからデータを取得する処理を記述
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  return data.message; // 例として、取得したデータのmessageプロパティを返す
};
```

## まとめ
Hooksは常に同じ順序で呼び出す：条件文やループ内でHooksを呼び出してはいけません。

条件分岐はHooksの内部で行う：必要に応じて処理を制御しますが、Hooks自体の呼び出しは固定します。

依存配列を正しく設定する：Hooks内で使用する変数やプロップスを依存配列に含めます。

公式ドキュメントを参照する：ReactのHooksのルールを再確認しましょう。
これらのポイントを押さえることで、Hooksを正しく活用し、安定したReactコンポーネントを作成することができます。

## さいごに
Reactの基礎的なことですが、開発する際不意にやってしまうので、自分への再勉強としてこれから複数のアンチパターンでまとめたいと思います。

## 参考資料

https://ja.react.dev/reference/rules/rules-of-hooks

## Reactアンチパターン集

【 Reactのアンチパターン 】1, ( React Hooks) 条件付きでHooksを呼び出すアンチパターンとその解決策
【Linux】複数コマンドをまとめて実行する方法

`(command)`または`{ command; }`とすることでコマンドをグルーピングできます。

`(command)`はサブシェルで実行されます。
以下のように実行してもディレクトリは移動しません。
```
(cd ..) 
```

`{ command; }`はカレントシェルで実行されます。
以下のように実行するとディレクトリが移動します。

```
{ cd ..; }
```
また記述する際に`{`の後にスペースが必要であることとコマンドの最後に`;`を記述するか改行する必要がります。
ABC371参加記録　by Python

# リアルタイムに解けた問題

## [A - Jiro](https://atcoder.jp/contests/abc371/tasks/abc371_a)

### 問題文
$A,B,C$の三兄弟がいます。この3人の年齢関係は3つの文字$S_{AB}$,$S_{AC}$,$S_{BC}$によって与えられ、それぞれ以下を意味します。
- $S_{AB}$が <font color="Red"><</font> の場合$A$は$B$より年下であり、 <font color="Red">></font> の場合$A$は$B$より年上である。
- $S_{AC}$が <font color="Red"><</font> の場合$A$は$C$より年下であり、 <font color="Red">></font> の場合$A$は$C$より年上である。
- $S_{BC}$が <font color="Red"><</font> の場合$B$は$C$より年下であり、 <font color="Red">></font> の場合$B$は$C$より年上である。

三兄弟の次男、つまり二番目のに年上の人は誰ですか？

### 制約
- $S_{AB}$,$S_{AC}$,$S_{BC}$はそれぞれ <font color="Red"><</font> または <font color="Red">></font>
- 入力に矛盾は含まれない。つまり、与えられた大小関係を全て満たす年齢関係が必ず存在する入力のみが与えられる。

### アルゴリズム
入力内容におうじて、$A,B,C$を1づつ増やしていく。その中で二番目に大きい人の名前を出力。

### ソースコード
``` python
S_AB, S_AC, S_BC = input().split()

A = 0
B = 0
C = 0

if S_AB == '<':
  B += 1
else:
  A += 1

if S_AC == '<':
  C += 1
else:
  A += 1

if S_BC == '<':
  C += 1
else:
  B += 1

if A == 1:
  print('A')
elif B == 1:
  print('B')
elif C == 1:
  print('C')
```

## [B - Taro](https://atcoder.jp/contests/abc371/tasks/abc371_b)

### 問題文
AtCoder王国では、長男に必ず「太郎」という名前を付けます。長男以外には「太郎」という名前は付けません。長男とは、名家で生まれた男の子のうち最も早く生まれた物を指します。

AtCoder王国には$N$戸の家があり、$M$人の赤子が生まれました。また、$M$人の赤子が生まれる前には、$M$人の赤子が生まれる前には、$N$戸のどの家も赤子が生まれたことはありませんでした。

赤子の情報が生まれの時系列順に与えられます。

$i$番目に生まれた赤子は、$A_{i}$番目の家で生まれ、$B_{i}$が <font color="Red">M</font> のとき男の子、<font color="Red">F</font> のとき女の子です。

$M$人の赤子それぞれについて、付けられた名前が「太郎」か判定してくだい。

### 制約
- $1 \leq N,M \leq 100$
- $1 \leq A_{i} \leq N$
- $B_{i}$は <font color="Red">M</font> または <font color="Red">F</font>
- 入力される数値は全て整数

### アルゴリズム
各家に一人目の子供がいるかどうかを表すリストを用意し、時系列順に与えられた時系列順の赤子の情報に順番にアクセスし、一人目の子供であるか、なおかつ男の子であるかをチェックしていく。

### ソースコード
``` python
N, M = map(int, input().split())

A = []
B = []

for i in range(M):
  a, b = input().split()
  A.append(int(a))
  B.append(b)

first_child = []

for i in range(N):
  first_child.append(False)

for i in range(M):
  if B[i] == 'M':
    if first_child[A[i] - 1] == False:
      first_child[A[i] - 1] = True
      print("Yes")
    else:
      print('No')
  else:
    print('No')
```
Dockerで「docker compose exec web bin/dev」がうまくいかないときの対処法②

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## 起こったこと
config/initializers/ransack.rbを記述すると
「docker compose exec web bin/dev」が上手くいかなくなった

## 対処法
```:ターミナル
docker compose restart
```
これです。この後は上手くいきました。
ちなみに
```:ターミナル
docker compose down
```
のあともう一度docker compose upをしても上手くいかなかったです。
あくまでも再起動するのが大事みたいです。
ディープラーニングにおけるテンソルの基礎

## はじめに
こんにちは！ディープラーニングの世界に飛び込んだばかりのあなたにとって、テンソルは非常に重要な概念です。今回は、テンソルが何なのか、どのように使われるのかをわかりやすく解説します。

## 1. テンソルとは？
テンソルとは、数値データを持つ多次元の配列です。ちょっと難しく聞こえるかもしれませんが、要はデータの集合体です。スカラー（0次元）、ベクトル（1次元）、行列（2次元）、さらにそれ以上の次元を持つ配列をまとめたものです。

- **スカラー（0次元テンソル）**: ただの数字、例えば $5$。
- **ベクトル（1次元テンソル）**: 数のリスト、例えば $[1, 2, 3]$。
- **行列（2次元テンソル）**: いわゆるただの行列です。
- **高次元テンソル**: 3次元テンソルは、例えば画像データのように、色々な情報を持つことができます。

## 2. テンソルの種類
テンソルはデータの種類によっていくつかのタイプに分けられます。

- **整数テンソル**: 整数を含むテンソル。
- **浮動小数点テンソル**: 小数を含むテンソル。
- **ブールテンソル**: 真偽値（True/False）を含むテンソル。

## 3. テンソルの操作
テンソル同士は、色々な計算ができます。例えば：

- **加算**: 二つのテンソルを足し算できます。
- **乗算**: 二つのテンソルをかけ算できます。
- **転置**: 行列をひっくり返すことができます。

### Pythonでのテンソル操作の例
実際にPyTorchを使ってみましょう。以下は簡単なコードです。

```python
import torch

# テンソルの作成
tensor_a = torch.tensor([[1, 2], [3, 4]])
tensor_b = torch.tensor([[5, 6], [7, 8]])

# テンソルの加算
tensor_sum = tensor_a + tensor_b

# テンソルの乗算
tensor_product = tensor_a * tensor_b

# 転置
tensor_transpose = tensor_a.T

print("加算結果:\n", tensor_sum)
print("乗算結果:\n", tensor_product)
print("転置結果:\n", tensor_transpose)
```

## 4. ディープラーニングにおけるテンソルの使用例
ディープラーニングのモデルは、データをテンソルとして受け取ります。例えば、画像データは通常、4次元テンソルとして扱われます。

- **画像データ**: バッチサイズ × チャンネル数 × 高さ × 幅 で表現されます。
- **テキストデータ**: 単語の埋め込みとして、2次元テンソルで表現されることがあります。

以下は、画像データのテンソルを生成する例です。

```python
# 32枚の画像、3チャンネル、64x64ピクセルのバッチを作成
batch_size = 32
channels = 3
height = 64
width = 64

images = torch.randn(batch_size, channels, height, width)
print("画像データのテンソル形状:", images.shape)
```

## 5. まとめ
テンソルは、ディープラーニングの心臓部ともいえる存在です。スカラー、ベクトル、行列、高次元テンソルの理解は、モデルの設計や実装において非常に重要です。

さらに気になる方はこちらへ

https://qiita.com/mizomizo1/items/f99871da7854853df06c
AIの「分類」と「回帰」についてまとめてみた

## はじめに

AI（人工知能）の分野で、「分類」と「回帰」という用語をちゃんと説明できないことに気が付きました。これらは機械学習の中でも非常に重要な概念で、実世界の問題を解決するために頻繁に使用されているので整理しないとなと思いました。そのため今回は、初心者向けに「分類」と「回帰」についてわかりやすく解説していきます。

## 想定読者

- AIや機械学習に興味を持ち始めた初心者
- これから機械学習を学び始める方
- 基本的な用語や概念を理解しようとしている方
- プログラミングの経験が少ない方

## 機械学習とは

**機械学習**とは、データを使ってコンピュータに学習させることで、**新しいデータに対して予測や分類を行えるようにする技術**です。これは、人間が経験から学ぶのと似ています。例えば、たくさんの犬と猫の写真を見せることで、コンピュータは犬と猫を区別できるようになります。

## 分類とは

**分類**（Classification）は、与えられたデータを事前に定義されたカテゴリに分けることを指します。例えば、メールが「スパム」か「スパムでないか」を判別するスパムフィルターや、画像が「犬」か「猫」かを判別するモデルが分類の例です。

### 分類の具体例

1. **メールのスパムフィルター**
   - **入力**: 新しいメールの内容（テキスト）
   - **出力**: スパムかスパムでないか（2つのカテゴリ）

2. **画像認識**
   - **入力**: 写真（ピクセル情報）
   - **出力**: 写真が示す物体（例えば、犬、猫、人などのカテゴリ）

### 分類のアルゴリズム

分類には様々なアルゴリズムが使われます。以下にいくつかの代表的なものを紹介します。

1. **ロジスティック回帰**（Logistic Regression）
   - 二値分類（2つのカテゴリ）に特化したアルゴリズムです。~~絶対ロジスティック分類だろ~~

2. **サポートベクターマシン**（SVM）
   - データポイントを最適な境界で分ける方法です。複雑なデータでも効果的に分類できます

3. **決定木**（Decision Tree）
   - データを「木」構造に分けていく方法です。各ノードで質問をして、次のノードに進んでいきます

4. **ランダムフォレスト**（Random Forest）
   - 複数の決定木を使って多数決で最終結果を決める方法です。精度が高い傾向にあります

## 回帰とは

**回帰**（Regression）は、与えられたデータから数値を予測することを指します。例えば、家の広さや部屋数からその家の価格を予測するモデルが回帰の例です。

### 回帰の具体例

1. **家の価格予測**
   - **入力**: 家の広さ、部屋数、場所などの情報
   - **出力**: 家の価格（数値）

2. **天気予報**
   - **入力**: 過去の天気データ、現在の気象状況
   - **出力**: 明日の気温（数値）

### 回帰のアルゴリズム

回帰にもいくつかの主要なアルゴリズムがあります。

1. **線形回帰**（Linear Regression）
   - データ間の線形関係をモデル化します。例えば、「家の広さ」と「価格」の間の直線的な関係を見つけます

2. **リッジ回帰**（Ridge Regression）
   - 線形回帰の一種ですが、過学習を防ぐために罰則項を追加します。これにより、モデルの汎化性能が向上します

3. **ラッソ回帰**（Lasso Regression）
   - リッジ回帰と似ていますが、変数の選択も行います。重要でない変数をゼロにすることで、よりシンプルなモデルを作ります

4. **サポートベクター回帰**（SVR）
   - SVMを回帰に応用した方法です。非線形データに対しても有効です

## 分類と回帰の違い

ここまでで、「分類」と「回帰」の基本的な考え方を理解できたと思います。それでは、これら二つの違いについてまとめてみましょう。

1. **出力の違い**
   - 分類: カテゴリ（例えば、スパム or 非スパム）
   - 回帰: 数値（例えば、家の価格）

2. **アルゴリズムの適用方法**
   - 分類: カテゴリにデータを分けるためのアルゴリズムを使用
   - 回帰: 数値を予測するためのアルゴリズムを使用

3. **評価方法**
   - 分類: 正解率（Accuracy）、精度（Precision）、再現率（Recall）など
   - 回帰: 平均二乗誤差（MSE）、平均絶対誤差（MAE）など

## 実際の応用例

それでは、具体的な応用例を見てみましょう。これにより、実世界での機械学習の使われ方をイメージしやすくなるでしょう。

### 分類の応用例

1. **医療診断**
   - 病気の有無を診断するために、患者の症状や検査結果を分類します

2. **音声認識**
   - 音声データをテキストに変換するために、音素（音の単位）を分類します

### 回帰の応用例

1. **売上予測**:
   - 過去の販売データを使って、将来の売上を予測します

2. **株価予測**:
   - 過去の株価データや経済指標を使って、将来の株価を予測します

## まとめ

今回は、AIの「分類」と「回帰」について初心者向けに解説しました。これらは似ている概念ですので間違いやすいです。ぜひ、自分の興味のある分野でこれらの技術を活用してみてください。
ABC370参加記録　by Python

# リアルタイムに解けた問題

## [A - Raise Both Hands](https://atcoder.jp/contests/abc370/tasks/abc370_a)

### 問題文
高橋君はたこ焼きを作ってすぬけ君に振る舞うことにしました。高橋君はすぬけ君に、たこ焼きを食べたいならば左手のみを挙げて、そうでないならば右手のみを挙げるように指示しました。

すぬけ君が挙げた手の情報は整数$L,R$によって与えられます。すぬけ君は$L=1$のとき、またそのときに限り左手を挙げており、$R=1$のとき、またそのときに限り右手を挙げています。すぬけ君は指示に従わず、両手を挙げることも手を挙げないこともあります。

すぬけ君が片方の手のみを挙げている場合、すぬけ君がたこ焼きを食べたいならば<font color="Red">`Yes`</font>を、そうでないならば<font color="Red">`No`</font>を出力してください。すぬけ君が両手を挙げているか、手を挙げていないときは<font color="Red">`Invalid`</font>と出力してください。

ただし、すぬけ君が片方の手のみを挙げている場合は必ず指示にしたがった行動を取っているものとします。


### 制約
- $L,R$は0または1

### アルゴリズム
$L,R$の値に応じて条件を分岐し、それぞれに適した処理を行う。

### ソースコード
``` python
L, R = map(int, input().split())

if (L == 1 and R == 1) or (L == 0 and R == 0):
  print("Invalid")
elif (L == 1 and R == 0):
  print('Yes')
elif (L == 0 and R == 1):
  print("No")
```

## [B - Binary Alchemy](https://atcoder.jp/contests/abc370/tasks/abc370_b)

### 問題文
$N$種類の元素があり、元素には$1,2,...,N$の番号が付けられています。

元素どうしは合成させることができ、元素$i$と元素$j$を合成すると$i\geq j$のとき元素$A_{i,j}$に、$i\leq j$のとき元素$A_{i,j}$に変化します。

元素$1$に対して元素$1,2,...,N$をこの順に合成したとき、最終的に得られる元素を求めてください。

### 制約
- $1\leq N \leq 100$
- $1\leq A_{i,j} \leq N$
- 入力される値はすべて整数

### アルゴリズム
問題文に記載の仕様をそのままif文で表現する。

### ソースコード
``` python
N = int(input())

A = [list(map(int, input().split())) for _ in range(N)]

element = 1

for i in range(N):
  if element >= i+1:
    element = A[element-1][i]
  else:
    element = A[i][element-1]

print(element)
```
【統計検定1級】コーシー分布の特徴

## はじめに
11月に控えている統計検定１級に向けて勉強中、「コーシー分布」がわからなかったのでまとめました。

本記事は、以下のテキストを参考にしました。
[増訂版　日本統計学会公式認定統計検定１級対応　統計学](https://www.amazon.co.jp/%E5%A2%97%E8%A8%82%E7%89%88-%E6%97%A5%E6%9C%AC%E7%B5%B1%E8%A8%88%E5%AD%A6%E4%BC%9A%E5%85%AC%E5%BC%8F%E8%AA%8D%E5%AE%9A-%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A%EF%BC%91%E7%B4%9A%E5%AF%BE%E5%BF%9C-%E7%B5%B1%E8%A8%88%E5%AD%A6-%E6%97%A5%E6%9C%AC%E7%B5%B1%E8%A8%88%E5%AD%A6%E4%BC%9A/dp/4489024010/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=36N4J7TJSYWL1&dib=eyJ2IjoiMSJ9.WHkz56vCfanRQq3sUnkmlht3rVxPYLRxKH_ZIJAF-uvGtbsbBpPh37OVhBvWQdP8doGEEaU5u29BlBqH_oTmQzyLx0JQBGyETVyJEtw__IHRc6a5k_5NAi2ZQrVeytM0oCjjsmQgUKxAXoMeKzeXFD5QySt6-ciPMRfjlNvyTqV9kQDM-D9bl9ujboyiJlzSD4u2iys6D3oQqtg7WTNIe1LYg9gqWDsgBHv1e5RU2JeuR_59BzjSyjQ2cA4NiRJ0XQU7kQmCS842s_rdu95JvMUSHSRHEhRpy7rR_HFo5oQ.d4oUJfRd2CT7QpQ_wD7CPNDZW7LDVJfbVjUd7Xf5CJ8&dib_tag=se&keywords=%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A1%E7%B4%9A&qid=1726926687&sprefix=%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A1%E7%B4%9A%2Caps%2C161&sr=8-2)  
第１章　練習問題　問２より

## コーシー分布の確率密度関数
コーシー分布の確率密度関数$f(x)$は、次のように定義されます。
``` math
f(x) = \frac{1}{\pi(1+x^2)}
```
これをしばしば**標準コーシー分布**と呼ぶこともあります。
コーシー分布は、正規分布に似た形をしていますが、正規分布よりも裾が重く、広がりが大きいです。

またコーシー分布には、**期待値・分散が定義されない**という特徴があります。

その証明などは、以下のサイトに丁寧にまとめてくださっています。

https://mathlandscape.com/cauchy-distrib/

### 特徴➀
$X$を、確率密度関数$f_X(x)=\frac{1}{\pi(1+x^2)}$をもつコーシー分布に従う確率変数とします。$Y=\frac{1}{X}$の確率密度関数$f_Y(y)$を求めてみましょう。

＜解法＞

``` math
F_Y(y) =P(Y\leq y)=P(\frac{1}{X}\leq y)=P(X \geq\frac{1}{y})=\int_{\frac{1}{y}}^\infty \frac{1}{\pi(1+x^2)} dx
```
$x=\arctan \theta$と置換すると、
``` math
F_Y(y) =\int_{\arctan \frac{1}{y}}^{\frac{\pi}{4}} \frac{1}{\pi(1+\tan^2 \theta)} \cdot \frac{d \theta}{\cos^2 \theta}\\
=\frac{1}{\pi}\left( \frac{\pi}{4}-\arctan \frac{1}{y} \right) =\frac{1}{4}-\frac{1}{\pi}\arctan \frac{1}{y}
```
ここで、両辺を$y$で微分したいのですが、$\arctan \frac{1}{y}$を$y$で微分するには、$t=\arctan \frac{1}{y}$と置換し、
``` math
\frac{1}{y}=\tan t 
```
``` math
-\frac{1}{y^2} dy = \frac{1}{\cos^2 t} dt
```
``` math
\frac{dt}{dy}=-\frac{\cos^2 t}{y^2} = -\frac{1}{y^2} \cdot \frac{y^2}{y^2+1} = -\frac{1}{y^2+1}
```
よって、$F_y(y)$を$y$で微分し、
``` math
f_Y(y) = \frac{1}{\pi(1+y^2)}
```
つまり、**コーシー分布に従う確率変数の逆数もまた、コーシー分布に従う**のです！！

### 特徴➁

ここで、$X$と$Y$を互いに独立に標準正規分布に従う確率変数とします。
このとき、$V=Y/X$の確率密度関数$f_V(v)$はどうなるでしょうか。


まず、$X$、$Y$の確率密度関数はそれぞれ、
``` math
f_X(x) = \frac{1}{\sqrt{2\pi}} \exp( -\frac{x^2}{2} )
```
``` math
f_Y(y) = \frac{1}{\sqrt{2\pi}} \exp(-\frac{y^2}{2})
```
よって、同時確率密度関数は、
``` math
f_{X,Y}(x,y) = f_X(x) \cdot f_Y(y) = \frac{1}{2\pi} \exp(-\frac{x^2+y^2}{2})
```

ここで、$u=x,v=y/x$と変数変換すれば、$x=u,y=uv$のヤコビアンは、
``` math
J =　\begin{vmatrix}
   1 & 0 \\
   v & u
\end{vmatrix}
=u
```
したがって、$(U,V)$の同時確率密度関数$f_{U,V}(u,v)$
``` math
f_{U,V}(u,v) = \frac{|u|}{2\pi} \exp (-\frac{u^2}{2}(1+v^2))
```
を$u$について積分すれば、
``` math
f_V(v) = \frac{1}{\pi} \left[-\frac{1}{v^2+1} \exp (-\frac{v^2+1}{2}u^2) \right]_0^\infty = \frac{1}{\pi(1+v^2)}
```


つまり、**$X,Y$が標準正規分布に従うとき、$V=Y/X$はコーシー分布に従う**のです！！
ABC372をPythonで（A～E）

ユニークビジョンプログラミングコンテスト2024 秋（AtCoder Beginner Contest 372）の解答等の速報的まとめ

https://atcoder.jp/contests/abc372



# A問題
https://atcoder.jp/contests/abc372/tasks/abc372_a

言語仕様に頼る
```python:A
print(input().replace(".", ""))
```
# B問題
https://atcoder.jp/contests/abc372/tasks/abc372_b

$3^n$を用意して大きいほうから引いてうまいことやる
```python:B
m = int(input())

lst = [1]
while lst[-1] <= m:
    lst.append(lst[-1] * 3)

ans = []
i = len(lst) - 1
while m > 0:
    while m < lst[i]:
        i -= 1
    ans.append(i)
    m -= lst[i]

print(len(ans))
print(*ans)
```
# C問題
https://atcoder.jp/contests/abc372/tasks/abc372_c

変更を加える箇所でABCが減ったら$-1$、増えたら$+1$する
```python:C
n, q = map(int, input().split())
s = list(input())
ABC = ["A", "B", "C"]
cnt = 0
for i in range(n):
    if i - 1 >= 0 and i + 1 < n and s[i - 1:i + 2] == ABC:
        cnt += 1

for _ in range(q):
    X, c = input().split()
    x = int(X) - 1
    if s[x-2:x+1] == ABC or s[x - 1:x + 2] == ABC or s[x:x + 3] == ABC:
        cnt -= 1
    s[x] = c
    if s[x-2:x+1] == ABC or s[x - 1:x + 2] == ABC or s[x:x + 3] == ABC:
        cnt += 1

    print(cnt)
```
# D問題
https://atcoder.jp/contests/abc372/tasks/abc372_d

$j$を基準にどこまで$i$を前にやれるかを考える
```python:D
n = int(input())
h = list(map(int, input().split()))

stack = []
ans = [0] * n
for i in range(n - 1, -1, -1):
    ans[i] = len(stack)
    while stack and stack[-1] < h[i]:
        stack.pop()
    stack.append(h[i])

print(*ans)
```
# E問題
https://atcoder.jp/contests/abc372/tasks/abc372_e

UnionFindしながら配列結合する
Kが最大10なので結合する配列の長さを10までにすれば間に合う
```python:E
import sys;sys.setrecursionlimit(10 ** 7)

def merge(x, y):
    global lst
    new = []
    i = j = 0
    if len(lst[x]) == 0:
        return lst[y]
    if len(lst[y]) == 0:
        return lst[x]

    while i < len(lst[x]) and j < len(lst[y]) and len(new) < 10:
        if lst[x][i] > lst[y][j]:
            new.append(lst[x][i])
            i += 1
        else:
            new.append(lst[y][j])
            j += 1

    while i < len(lst[x]) and len(new) < 10:
        new.append(lst[x][i])
        i += 1
    while j < len(lst[y]) and len(new) < 10:
        new.append(lst[y][j])
        j += 1

    return new

def find(x):
    global parent
    if parent[x] < 0:
        return x
    else:
        parent[x] = find(parent[x])
        return parent[x]

def union(x, y):
    global parent, lst
    px = find(x)
    py = find(y)
    if px == py:
        return
    if parent[px] > parent[py]:
        px, py = py, px

    parent[px] += parent[py]
    parent[py] = px
    lst[px] = merge(px, py)


n, q = map(int, input().split())

parent = [-1] * n
lst = [[i + 1] for i in range(n)]
for _ in range(q):
    com, a, b = map(lambda x:int(x) - 1, input().split())
    if com == 0:
        union(a, b)
    else:
        i = find(a)
        print(-1 if len(lst[i]) <= b else lst[i][b])
```
iPhoneのカメラの出っ張り部分の厚さ一覧

技術的な内容ではないですが、iPhoneの機種変の際に知りたくなるのでメモ程度に。

iPhoneの商品ページには何故か掲載されていないですが、[アクセサリのデザインガイドライン](https://developer.apple.com/accessories/Accessory-Design-Guidelines.pdf)には記載されていたのでそちらを引用します。


||画面<br>サイズ<br>(inch)|高さ<br>(mm)|幅<br>(mm)|厚さ<br>(mm)|重量<br>(g)|出っ張り<br>部分厚さ<br>(mm)|合計<br>厚さ<br>(mm)|
|:---|---:|---:|---:|---:|---:|---:|---:|
|iPhone 16 Pro Max|6.9|163.0|77.6|8.25|227|4.28|12.53|
|iPhone 15 Pro Max|6.7|159.9|76.7|8.25|221|4.07|12.32|
|iPhone 14 Pro Max|6.7|160.7|77.6|7.85|240|4.18|12.03|
|iPhone 13 Pro Max|6.7|160.8|78.1|7.65|238|3.60|11.25|
|iPhone 12 Pro Max|6.7|160.8|78.1|7.39|226|2.79|10.18|
|iPhone 11 Pro Max|6.5|158.0|77.8|8.10|226|1.21|9.31|
|iPhone 16 Pro|6.3|149.6|71.5|8.25|199|4.28|12.53|
|iPhone 15 Pro|6.1|146.6|70.6|8.25|187|3.78|12.03|
|iPhone 14 Pro|6.1|147.5|71.5|7.85|206|4.18|12.03|
|iPhone 13 Pro|6.1|146.7|71.5|7.65|203|3.60|11.25|
|iPhone 12 Pro|6.1|146.7|71.5|7.39|187|1.72|9.11|
|iPhone 11 Pro|5.8|144.0|71.4|8.10|188|1.21|9.31|
|iPhone 16 Plus|6.7|160.9|77.8|7.81|199|3.48|11.29|
|iPhone 15 Plus|6.7|160.9|77.8|7.81|201|3.48|11.29|
|iPhone 14 Plus|6.7|160.8|78.1|7.80|203|3.42|11.22|
|iPhone 16|6.1|147.6|71.6|7.81|170|3.48|11.29|
|iPhone 15|6.1|147.6|71.6|7.81|171|3.48|11.29|
|iPhone 14|6.1|146.7|71.5|7.80|172|3.42|11.22|
|iPhone 13|6.1|146.7|71.5|7.65|173|2.59|10.24|
|iPhone 12|6.1|146.7|71.5|7.39|162|1.51|8.90|
|iPhone 11|6.1|150.9|75.7|8.32|194|1.48|9.80|
|iPhone 13 mini|5.4|131.5|64.2|7.65|140|2.51|10.16|
|iPhone 12 mini|5.4|131.5|64.2|7.39|133|1.51|8.90|
|iPhone SE (3rd Gen)|4.7|138.4|67.3|7.31|144|0.87|8.18|
PyTorch: mat1 and mat2 shapes cannot be multiplicatedの稀なパターン

PyTorchの練習をしている際に出たエラーです。

## コード
```python: playground.py
import torch
from torch import nn
from torch.utils.data import Dataset, DataLoader

# 中略：ここまででMockDatasetを定義している

# モデル定義とモックデータの準備
model = nn.Linear(1, 1)
data = MockDataset(torch.Tensor([1 for _ in range(100)]))

# 下準備：データローダーを作る
model.eval()
data = DataLoader(data, batch_size=64, shuffle=True)

# モデル評価
with torch.no_grad():
    for input, label in data:
        pred = model(input)
    #   ^^^^^^^^^^^^^^^^^^^ Error: mat1 and mat2...
```

## エラー
```
RuntimeError: mat1 and mat2 shapes cannot be multiplied (1x64 and 1x1)
```

## 解決策
入力データを`1`ではなく、`[1]`とする。
```python: playground.py
# data = MockDataset(torch.Tensor([1 for _ in range(100)]))
data = MockDataset(torch.Tensor([[1] for _ in range(100)]))
                            #    ^ ^
```

## 考察
PyTorchがパラメータを更新するには、**配列同士の**演算をする必要があります。元々の例では、`input`の各要素はただの`int`であり、**配列**ではなかったため、エラーが出ていたと思われます。

## 参考
[Qiitaの質問](https://qiita.com/terasima712/questions/ecec3dc87dc8275d2542)
配列同士の掛け算ができないという根源的な原因を教えてくれました。
【Pythonista3】macOS Sequoiaの新機能を使ったアプリ開発がとても良い

# はじめに
2024年9月16日、Appleから新しいバージョンである[macOS Sequoia](https://www.apple.com/macos/macos-sequoia/)が配信開始されました。
大半の人(?)にとっては劇的なワークフローの変化には繋がらないアップデートと思いますが、何を隠そう、私は今回のアップデートを心待ちにしていました...
なぜかというと、今までスマホの小さい画面で開発していたのが、PCから直接操作できることにより、はるかに手軽・高速に開発できるからです！

ということで、本記事はPythonista3で開発していた私が、Appleのアップデートによって嬉しい体験ができた話を紹介します。

# 🐍Pythonistaとは？
Pythonと.pyuiというUIファイルを用いてiOSアプリを開発できるものです。
👇詳細は先輩の方々がわかりやすく紹介してくれています。👇
https://qiita.com/pome-ta/items/89c700805537b5ca9c86

# 🌲偉大なるセコイアが来るまでのモバイル開発について
最初のころはMacBookに標準で搭載されているXcodeでiOSアプリ開発をしていました。[^1]
しかし、「容量でかい」「本腰入れないといけない」「Swift使うのに学習コストがかかる」などの理由で、プライベートでiOSアプリを開発するのは敬遠気味でした。
しかし、ずっとやっていたモバイル開発を続けたいという気持ちがあり、Pythonで簡単にアプリが作れる「[Pythonista3](https://omz-software.com/pythonista/)」を購入しました。
これがなかなかの優れもので、最小限のコード実装でちゃんと動くアプリが作れます。
もちろんXcodeに比べて機能・ライブラリの自由は小さいですが、ちょっとしたアプリなら断然こちらの方が作りやすいなと感じています。<br>
しかし、まったく無視できない大きな問題点があります。
それが、**モバイルアプリ上で全プログラムを書かないといけない**という点です。💦
コピペからバージョン管理まで、PCとは比較にならないほど物理的な問題でした。

# 💻macOS Sequioaによってコーディングが飛躍的に簡単に
そんな問題が一気に解消(!?)に向かったのが、今回のアップデートで追加された「[iPhoneミラーリング](https://support.apple.com/ja-jp/guide/iphone/iph505911a40/ios)」機能です。
この機能を使う必要要件は
* macOS 15.0(Sequoia) 以上
* iOS 18 以上
* iPhoneとMacで、2ファクタ認証を使って、同じApple Accountにサインインしている 

この3点を満たした上でMacBookを起動すると、iPhoneシュミレーターが画面上に出て、かなり高速でクリック操作ができます！
今までVNC ViewerやMicrosoft Remote Desktopを触ってきましたが、その中でもかなり高速なレスポンスになっています。ストレスフリー✨

ということで、Mac上から直接iPhoneのPythonistaにコピペができるようになりました。<br>

1. Visual Studio Codeでワークスペース作成&コーディング・簡易テスト（uiまではできないため、主にロジックテスト）
2. コピー&pythonistaの.pyファイルへコピー
3. 実行！
4. 結果がよければPC上でgitに登録

のようなワークフローができます。もう根性と視力を犠牲にしなくていいのです。

# 〆終わりに - Pythonista楽しいですよ！
モバイル開発はそれぞれ対応するプラットフォームにより言語やフレームワークが異なり、自分もこれからもっと勉強が必要です。
しかし、高校教育でも用いられるpythonで手軽に自分のスマホアプリを開発できると、もっと開発が身近に感じられて楽しいと思います。
有料アプリで手が出しづらいと最初自分も感じましたが、手軽にGPSや加速度センサーの値を利用して開発できるのが特に魅力に感じます。
Qiita初心者ですが、アプリ開発を楽しいと感じる内容を発信をしていきたいと思います。よろしくお願いします。👍

[^1]: ...元々はMac×Androidで開発していました。切り替えた理由は、自分の使っているカメラのモバイルアプリがiOSしかなかったため、iPhone15に買い替えたのがきっかけ(どうでもいい)