OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習が楽観的（Optimistic）って？

・　機械学習は楽観的なとこがある
・　サンプル数
・　データ可視化が大切

# 人でもないのに楽観的？

最初にそういう言葉があるのを知ったのは、何年も前のことですが、その後、実際に５年ほど前に、楽観的な機械学習に翻弄される人々を目のあたりにしてしまい、シェアしてみました
<br>

そのときのデータは使えないので、厳密には再現できませんが、似たような感じで作ったサンプル・データで、エッセンスの共有をしてみます
<br>

たとえば、こんな分布をするデータがあったとします
<br>


<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/1eb6d177-3cac-7d79-ca60-56bf69875c81.png">


機械学習（何かしらのライブラリ）で、赤（図ではピンクですが）と青を判別分析でふたつにわけようとしてみます　線形判別を使い、線を引いて判別面を可視化します
<br>

<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/5cf47043-4b94-78f2-78aa-2ce3cd612678.png">

赤い点の 77 % が正しく判別できた、という結果です

ところが！
<br>
<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/02714c63-07c1-d709-ba5e-8937e47e78a7.png">

いざ、サンプル数を増やしてみると、赤の正答率は 69 % になって、けっこう下がっています

これは、偶然の結果なのでしょうか？

77 % と 69 % では　結構ちがいます　困ることもあるでしょう

# シミュレーション
そこで、サンプル数を 30 から　900　まで徐々に増やしていったときに、それぞれの場合ごとに線形判別モデルを作り、赤の正解率を調べてみました
<br>
<img width = 480 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333980/7ad1aefb-c402-3134-725e-914dc7127a0f.png">

図からわかるように、サンプル数 500 くらいまでは変動がけっこうあって、サンプル数30 - 50 あたりでピーク　（～77 % ）をむかえ、そこからだんだんと下がってきます　サンプル数 500 以降は、だいたい　 70 % 点線　のあたりで落ち着いてきます
<br>
# 最適化
理由は、判別モデルを作るアルゴリズムが、そもそも、「最も上手く判別できるように」作るからで、あたりまえといえば当たり前のことなのですが、これが、機械学習がオプティミスティックだと言われるポイントですね



交差検証や、重みづけ、外れ値の扱いなど、基本的なことはたくさんあるにはあるのですが、それで防ぎようがない側面でもあります


# 過去には

５年ほど前、サンプル数が増えるほど、判別精度が悪くなることを知ったチームの人々は、日に日に不安が増していきました　データを取るときの測定の何かがわるくなったのではないか？　担当者のスキルの問題ではないか？　とあれこれ考え、犯人捜しをしていました　正直、あまり見ていていいものではありませんでした

「いやそれ、誰も悪くないし」

このシミュレーションは、正規分布をする２変量データで簡単に作れるので、平均値と分散がわかったところで、シミュレーショして必要なサンプル数を見てみるといいかもしれません
【数式を使わない】初心者が書いたニューラルネットワーク入門

この記事は京都大学人工知能研究会 [KaiRA Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kyoto-kaira) 13日目の記事になります。

# なぜこの記事を書いたのか

ニューラルネットワークを学ぶにあたり、当然ながら書籍やネット記事で __ニューラルネットワークとは__ というテーマについて調べます。
すると多くの資料で以下のように説明されています。
- ニューラルネットワークは数理モデルを用いて人間の神経回路を模したもの
- ニューラルネットワークの構造は...
- 重みづけは...

すでにニューラルネットワークの存在意義を十分に理解している方なら、このような説明でよいかもしれません。
しかし私のような初心者だと、 __結局なんのためにニューラルネットワークがあるのか__ というところがどうも腑に落ちないわけです。

そこで今回は、私自身がニューラルネットワークのイメージをつかむために「こんな記事あったらいいな」と思う内容を書き起こしてみました。
# 記事のテーマと対象読者

テーマは __数式を使わずニューラルネットワークのイメージを掴む__ に設定します。

対象読者は、ニューラルネットワークについてちょっと調べたけどイメージがつかない方。
具体的には下記のような疑問がモヤモヤしている方を想定しています。

- 人間の神経回路を再現してどんなメリットがあるの？
- 人間の脳が行なっている複雑な処理ってどういうこと？
- 重みづけってどういうこと？何のためにするの？


こういった疑問に答える形で書いていこうと思います。

# 実は人間の脳ってスゴイ
ニューラルネットワークが有用である点について、自分のような初学者でもなんとか腑に落ちる表現はないものかと悩みました。
そこで、[AWSによるニューラルネットワークの解説記事](https://aws.amazon.com/jp/what-is/neural-network/#:~:text=A%20neural%20network%20is%20a,that%20resembles%20the%20human%20brain.) にて興味深い例が紹介されているのを見つけたので説明の題材にしたいと思います。

下記の2文を見てください。
- 支払い方法を教えてもらえませんか?
- 送金するにはどうすればよいですか?

これらが同様の意味で用いられることは人間にとって当然かもしれませんが、どうやらニューラルネットワークを用いていない(普通の)コンピュータにとっては一筋縄ではなかなかの難問みたいです。

コンピュータはものすごく頭がよいのに、どうしてこのようなことが起こるのでしょうか。
謎を解く鍵は、コンピュータにはないスゴイ能力を人間は当たり前に使いこなしていることにあります。

人間にできてコンピュータにはできなかったこと。
それは文脈を考慮して、__「100%確かではないけどたぶんこうだろう」__ という予測を立てることです。
(私はそう解釈しています)

答えを求めるためのシンプルな道順が用意されておらず、かつ答えが一意に定まらない問題を解く。
これが人間の神経回路に与えられた能力であり、その思考回路を数理モデルによりコンピュータ上で再現したものがニューラルネットワークです。

ここで __文脈__ とは語学で用いられる一般的な "文のつながり"よりも広い意味で、 __予測対象に影響を与えるものすべて__ というニュアンスで用いています。
たとえば写真に何が写っているかを解析するとき周囲に写っているものも __文脈__ です。

# 重みづけ~どんな選択肢がどれくらいの確率で起こりうるのか~

私たちが日常生活で予測を行うとき、どの選択肢がどれくらいの確率でありうるかを常に考えているはずです。

種々の判断材料のうち、「よく起こること」や「あまり起こらないこと」のような頻度の差が存在します。

もう少し簡単に言うと、「こういう場合、Aがよく起こるけど逆にBは考えにくいよな」といった __直感力__ のようなものと考えてください。

コンピュータは人間と違い、最初から優れた直感力を持ち合わせていません。

そのため人間が
- 「こういう条件の場合、Aが起こりやすいよ」
- 「Bはあまり起こらないよ」
- 「Cが起こるケースはほぼ0だよ」
などと教えてあげる必要があります。

コンピュータが予測を行うために必要な「選択肢ごとの起こりやすさ」を教え込むこの作業を __重みづけ__ と理解すればよいと思います。

# まとめ

今回は数式を使わずにニューラルネットワークのイメージをつかむというテーマで執筆させて頂きました。
ポイントをおさらいしておきます。

- 人間の脳は "文脈" を考慮して100%確かだと言い切れない答えも予測して組み立てている
- 数理モデルで人間の神経回路を再現したものがニューラルネットワークである
- 複雑に絡み合う条件から答えを予測できるように、選択肢ごとの起こりやすさを教え込む作業が重みづけ

厳密な定義に照らし合わせればいい加減な解釈だと言われるかもしれませんが、ニューラルネットワークの初歩の初歩でハードルを感じてしまっている方にとって学習の一助となれば幸いです。

## 参考資料
- [AWSによるニューラルネットワークの解説記事](https://aws.amazon.com/jp/what-is/neural-network/#:~:text=A%20neural%20network%20is%20a,that%20resembles%20the%20human%20brain.)
- [ゼロから作るDeepLearning](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585/ref=sr_1_1?crid=XNHZ9A448H2Y&keywords=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0&qid=1702351705&sprefix=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B%2Caps%2C180&sr=8-1)
【気まぐれ】数学とChatGPT part1

# はじめに

気まぐれで投稿してます。前回、積分の問題を久々にやったら楽しくなってしまったのでpart1と記載してますが事実上の第二弾になります。

https://qiita.com/forest_moririri/items/f59a64f6f12cfd7100d0

# Who am i ?

しがないエンジニアです。普段は資格の合格体験記などをベースに投稿しています。

# 本題

今回のお題です。

https://twitter.com/sonukg4india/status/1730510355036872727?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1730510355036872727%7Ctwgr%5Eaef3b8fa3c926ed693de640ac1ef5989a3607024%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fqiita.com%2Fembed-contents%2Ftweetqiita-embed-content__34628421e7f4634086671986867ce949

条件が何も書いていないので、ひとまず$x\in{\mathbb R}$として以下進めたいと思います。

```math
\begin{align}

4^{\sin^{2}(x)} + 4^{\cos^{2}(x)} = 4 \cdots (*)

\end{align}
```

以下の式変形から容易に$x$が求まります。
```math
\begin{align}

(*)&\Leftrightarrow 4^{\sin^{2}(x)} + 4^{\cos^{2}(x)} - 4 = 0 \\
&\Leftrightarrow 2^{2\sin^{2}(x)} + 2^{2\cos^{2}(x)} - 4 = 0 \\
&\Leftrightarrow \{2^{\sin^{2}(x)}\} ^ 2 + \{2^{\cos^{2}(x)}\} ^ 2 - 2\cdot 2^{\sin^{2}(x)+\cos^{2}(x)} = 0 \\
&\Leftrightarrow \{2^{\sin^{2}(x)} - 2^{\cos^{2}(x)}\} ^ 2 = 0 \\
&\Leftrightarrow 2^{\sin^{2}(x)} = 2^{\cos^{2}(x)} \\
&\Leftrightarrow \log_2 2^{\sin^{2}(x)} = \log_2 2^{\cos^{2}(x)} \\
&\Leftrightarrow \sin^{2}(x) = \cos^{2}(x) \\
&\Leftrightarrow \{\sin(x)+\cos(x)\} \{\sin(x)-\cos(x)\} = 0 \\
&\Leftrightarrow \sin(x) = \cos(x),~\sin(x) = -\cos(x) \\
&\Leftrightarrow x=\frac{\pi}{4} + \frac{n\pi}{2},~n\in {\mathbb Z} 

\end{align}
```

# 考察

ChatGPTに解かせてみたら、誤答が返ってきました。。頑張って解かせてみようと試みましたがダメでした。

**1回目！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227947/06919ef6-244f-0052-1d31-a0dfb67a5c2d.png)

以下から誤答だとすぐに分かりますね。ChatGPTは指数・対数が苦手なのか。。。

```math

\begin{align}

&2^{2\sin^{2}(x)} + 2^{2\cos^{2}(x)} - 4 =  \{2^{\sin^{2}(x)} - 2^{\cos^{2}(x)}\} ^ 2 \geq 0 \\

&\Leftrightarrow 2^{2\sin^{2}(x)} + 2^{2\cos^{2}(x)} \geq 4 \\

\end{align}

```
ですが、常に$2^{2\sin^{2}(x)} + 2^{2\cos^{2}(x)} = 4$とは限らないので、明らかに誤りです。

なかなかシリアスな答えが返ってきました。

**2回目！！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227947/c7a1b539-7dfd-6698-b12c-429eab8719cf.png)

ここまではあってますね。ただし、次でミスってます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227947/8cb147db-13d7-91a9-a600-79559662675b.png)

今度は因数分解の公式がそもそも間違ってますね。。なかなか解いてくれません、、

```math

\begin{align}
(a + b)(a - b) + (b - c)(b + c) &= a^2 - b^2 + b^2 - c^2 = a^2 - c^2 \\
&\neq a^2 + b^2 - c^2

\end{align}

```

**3度目の正直！！！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227947/394ef9d0-9b3e-d8e2-d134-421302175ef5.png)

次の「これにより～」という部分が誤答ですね。どこから答えだと推察したのか？ちょっと不明。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227947/93bbd8e3-f1a5-dd56-1782-396e8a8db96d.png)

複数回試行しましたが、結局ChatGPTに解かせることは出来ませんでした。無念。

# 最後に

人間が解く分には簡単でしたね。三角関数・三角比の性質や指数・対数の基本的な性質がわかっていれば容易でしたが、ChatGPTは間違った答えを出したので驚きました。確認は大切ですね。
よく使う最強のTeraterm環境

# はじめに
Windows案件を使うとほぼ確実に使うTeraterm。（俺調べ）
案件が変わるたびに設定をいちいち設定し直すのが非常に面倒くさいので、何番煎じかわからないけどよく使うTeratermで毎回設定するやり方を備忘目的で記載する。

# よく設定するものとそのやり方
## １．ログの出力設定する
多分一番最初に設定する奴。
ターミナル叩くよりもまずはデフォルトでログを吐かせる。
「設定→その他の設定→ログ」から以下を設定し、「OK」を押下する

設定内容はこんな感じ↓
* 「標準ログファイル名」は「 **%Y%m%d_%H%M%S_&h.log** 」を設定
  * そうすると「日付_時刻（秒まで）_IPアドレス or ホスト名.log」としてファイルが保存される
* 「標準ログ保存先フォルダ」は任意のフォルダを設定
  * おすすめは「Teraterm」ログ出力専用フォルダを作ってそこに入れるようにする
* 「自動的にログ採取を開始する」に **必ず** チェックを入れる
  * 入れないと都度ログ保存をしなければならないので面倒
* 「タイムスタンプ」にチェックボックスを入れるかはお好みで
  * 入れるとコマンド打鍵するたびに時刻もログに記録される
![2023-12-12 221702.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/4b104d5f-b7a0-b264-16b6-b211dca46854.png)
:::note warn
 **これらの作業が終わったら、設定→設定の保存で設定内容を保存すること**
 （そうしないとTeraterm閉じたら再度設定し直しになる。）
:::
また、この時に保存するiniファイルは任意の名前で良いかも。

## ２．環境ごとに背景色や文字色を変える
Teratermを何個も立ち上げていると、どこで何を作業していたか分からなくなることが稀にあり、ステージングで実施しようとしたけど本番で打鍵してやらかすといったインシデントを防ぐためにも視覚的にすぐわかるよう、環境ごとに背景色や文字色を変えた方が良い。
「設定→ウィンドウ」より、以下の画面を開いて「カラー」の「文字」や「背景」を好きな色に変える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/81483e7e-9155-106e-843e-8ad38f1ae4bd.png)

:::note warn
終わったら「OK」を押下し、「１」の時同様**設定→設定の保存で設定内容を保存すること**
（そうしないとTeraterm（ry）
:::
これを必要な数分設定を弄り、変更した分のiniファイルを作成する。

## ３．マクロを作る
テキストエディタ等でTeratermのマクロを作る。
以下のサンプルをベースに各自接続したい環境ごとに設定を合わせたり、入力値を設定して「.ttl」形式で保存する。
※初回ログインだけ、秘密鍵のパスワードが必要になるので、実行時に入力する

```ttl:template.ttl
;; 接続先IPアドレス
HOST='接続したいサーバ'
;; ユーザ名
USERNAME='自分のユーザ'
;; キーファイル名
KEY_FILE_PATH='秘密鍵へのパス'
passwdfile = 'passwd.dat'
;; 設定ファイル(任意)
INI_FILE_PATH='TERATERM.INIもしくは任意のiniファイル'

getpassword passwdfile USERNAME USERPASSWORD 

;; 接続コマンド生成
COMMAND = HOST
strconcat COMMAND ':22 /ssh /2 /auth=publickey /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /passwd='
strconcat COMMAND USERPASSWORD
strconcat COMMAND ' /keyfile='
strconcat COMMAND KEY_FILE_PATH
;; 設定ファイル読み込み(任意)
strconcat COMMAND ' /F='
strconcat COMMAND INI_FILE_PATH

; 接続
connect COMMAND

; 情報
wait '$'
sendln 'date'

end
```
## ４．マクロを実行する
作成後、「ttpmacro.exe」で実行する。
「ttpmacro.exe」はteratermがインストールされているフォルダにあるので、それを選択し実行する。
そして、接続できれば完了。


# 参考
## ログの出力先参考元
https://www.j-oosk.com/teraterm/logging/114/

https://isleofhoso.com/teraterm-conf/
日本語プログラミング言語をモデリング言語としてシステム開発上中流工程に導入（レイヤードアーキテクチャの補足）

# はじめに

日本語プログラミング言語をモデリング言語としてシステム開発上中流工程に導入した場合、そのメリット・デメリットについて考察する記事の3回目です。

本記事の内容はいくつかに分割されて記載されます。本記事中の「本記事」とは分割された内容の総体を指す場合があります。

https://qiita.com/advent-calendar/2023/remind

この記事は日本語構造化仕様記述言語 Re:Mind（リマインド）アドベントカレンダー2023の12日向けの記事です。

## 対象読者
とりあえずこの記事の想定読者はシステムエンジニアさんです。とくに日本語で要求仕様や内部設計資料を書いている方向けのお話です。

また、本記事が解説する日本語プログラミング言語はまだ実装がなく、設計仕様はオープンですので、ソリューションアイデアに有用性を感じたソリューションプロバイダー事業者の方が独自に製品化することを妨げるものはありません。

# 想定しているレイヤードアーキテクチャ
[前回の記事](https://qiita.com/mylifewithviolin/items/4ce62e0d5473626347e1)ではオーソドックスなリレーショナルデータベースを使用している業務システムを想定しており、少しだけ具体的にその業務システムはレイヤードアーキテクチャを想定して設計・開発されると述べました。

本記事はレイヤードアーキテクチャやその他のアーキテクチャについて詳しく論じるのは主題ではなく、アーキテクチャ間の優劣についても評価するものではありません。あくまで一般的にありえる例として想定します。

では、前回の記事で図解したレイヤードアーキテクチャの本記事での想定事項を補足します。

さらに図が複雑化しますが、もっともシンプルな原型については、お手数ですが前々回記事を、レイヤードアーキテクチャを想定した開発フロー図は前回記事をご参照ください。

```mermaid
flowchart TD
    subgraph sgC["実現工程"]
    subgraph sgD["フロントエンド"]
    D["実装言語（Ts）UI"]
    D --> E["実装言語（Ts）ストア"]
    style sgD width:400px
    end
    subgraph sgE["バックエンド"]
    E --> J1["実装言語（C＃）コントローラ"]
    J1 --> J2["実装言語（C＃）ロジック"]
    J2 --> K1["実装言語（Java）コントローラ"]
    K1 --> K2["実装言語（Java）ロジック"]
    J2 --> L["実データベース"]
    K2 --> L
    style sgD width:400px
    end
    style sgC width:540px
    end
```
# 各工程のレイヤーの扱いとレイヤードアーキテクチャ例の解説
上図の概念図では、実装工程だけ図示していますがレイヤーにわかれているのが実現工程だけという意味ではありません。
また、レイヤードアーキテクチャとかいまふうの言い回しで表記していますが、よくある一般的なWebアプリケーションの構図です。DAO層とかは割愛しています。

コントローラとロジックがC#とJavaで実装言語が２グループあるのは、ほぼほぼシステム全体はC#で実装されてはいるが、帳票レポートが無償のJasperReport使いたいとかで、帳票のダウンロード出力用のAPIがJavaのSpring Bootで実装されるような場合を想定しています。

実装言語の差異は細かいので、実装専門の人材が各レイヤーの実装言語をすべて対応できる場合は多くありますが、設計者レベルでは実装言語にそこまで詳しくないので、実装言語の些末さを除いたレベルで適切なロジックを考案設計できる必要があるのは前回述べたとおりです。


# この回のまとめ
この記事が想定している業務アプリケーションシステムが一般的なWebアプリケーションシステムで、帳票ツールの都合でバックエンドの実装言語がC#とJavaの2言語になっていることを説明しました。フロントエンドはTypescriptを想定しています。

# 次回
各工程の詳細について検討してきます。（上流工程の対象業務イメージ）
フ統

[インターネット老人会の魔法書 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ancient-internet) の4日目の記事です。

# フ統

【読み】ふとう
【意味】ファイル統合の略

# ファイル統合とは

いわゆるソースコードのマージのことです。
その昔gitもsubversionもなかった時代、ソースコードの構成管理は人力でした。
VSSというMicrosoft産の構成管理ツールがあった時代もありますが、使い勝手が悪かったのかあまり流行りませんでした。

## フ統作業

ソースコードをマージしてもらいたいときは、Excel製「フ統依頼書」にマージして欲しいソースコードのファイルパスの一覧を書き、zipで固めたソースコードと共に、メールやグループウェアのメッセージでソースコード管理者に送付します。

ソースコード管理者は、どのファイルを誰がいつマージしたかを、これまたExcelに記録し、zip展開したファイルを上書き保存します。

最新のソースは共有フォルダに置かれ、最新のソースが欲しいときはそこから勝手に持っていくシステムです。

## フ統後のトラブル

事実上コンフリクトしていることももちろんあるのですが、全て上書き保存なのでシステム的に気づく手段がなく、後もん勝ちで先人の修正コードが消されてしまうこともしばしば。
依頼漏れのソースコードがあったりすることもあり、この人力マージ作業はとにかくトラブルが多かったです。
Xubuntu22.04.3にubuntudde-ddeをインストール

まず、お決まりの
```shell
sudo apt update && sudo apt upgrade -y
```

リポジトリーの追加。
```shell
sudo add-apt-repository ppa:ubuntudde-dev/stable
```
`ubuntudde-dde`のインストール
```shell
sudo apt install ubuntudde-dde
```
エラーが出た。
```shell
（途中省略）
以前に未選択のパッケージ ubuntudde-default-settings を選択しています。
.../299-ubuntudde-default-settings_1.1.9.2ubuntu1_all.deb を展開する準備をしています ...
ubuntudde-default-settings (1.1.9.2ubuntu1) を展開しています...
dpkg: アーカイブ /tmp/apt-dpkg-install-L6QjtN/299-ubuntudde-default-settings_1.1.9.2ubuntu1_all.deb の処理中にエラーが発生しました (--unpack):
 '/etc/skel/.config/Trolltech.conf' を上書きしようとしています。これはパッケージ xubuntu-default-settings 22.04.0 にも存在します
以前に未選択のパッケージ ubuntudde-icon-theme を選択しています。
.../300-ubuntudde-icon-theme_2020.10.03-4_all.deb を展開する準備をしています ...
ubuntudde-icon-theme (2020.10.03-4) を展開しています...
以前に未選択のパッケージ ubuntudde-wallpapers を選択しています。
.../301-ubuntudde-wallpapers_2022.07.17-1_amd64.deb を展開する準備をしています ...
ubuntudde-wallpapers (2022.07.17-1) を展開しています...
以前に未選択のパッケージ ubuntudde-dde を選択しています。
.../302-ubuntudde-dde_2.0.9-1_all.deb を展開する準備をしています ...
ubuntudde-dde (2.0.9-1) を展開しています...
処理中にエラーが発生しました:
 /tmp/apt-dpkg-install-L6QjtN/299-ubuntudde-default-settings_1.1.9.2ubuntu1_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```
`--fix-broken install`してみた。
```shell
sudo apt --fix-broken install
```
また、エラーが表示された。
```shell
(データベースを読み込んでいます ... 現在 392088 個のファイルとディレクトリがインストールされています。)
.../ubuntudde-default-settings_1.1.9.2ubuntu1_all.deb を展開する準備をしています ...
ubuntudde-default-settings (1.1.9.2ubuntu1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/ubuntudde-default-settings_1.1.9.2ubuntu1_all.deb の処理中にエラーが発生しました (--unpack):
 '/etc/skel/.config/Trolltech.conf' を上書きしようとしています。これはパッケージ xubuntu-default-settings 22.04.0 にも存在します
処理中にエラーが発生しました:
 /var/cache/apt/archives/ubuntudde-default-settings_1.1.9.2ubuntu1_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```
`dpkg`で`--force-overwrite`してみた。
```shell
sudo dpkg -i --force-overwrite /var/cache/apt/archives/ubuntudde-default-settings_1.1.9.2ubuntu1_all.deb
```
こんな表示が出たけど、
```shell
(データベースを読み込んでいます ... 現在 392088 個のファイルとディレクトリがインストールされています。)
.../ubuntudde-default-settings_1.1.9.2ubuntu1_all.deb を展開する準備をしています ...
ubuntudde-default-settings (1.1.9.2ubuntu1) を展開しています...
dpkg: 警告: --force が有効なので、問題を無視します:
dpkg: 警告: '/etc/skel/.config/Trolltech.conf' を上書きしようとしています。これはパッケージ xubuntu-default-settings 22.04.0 にも存在します
dpkg: 依存関係の問題により ubuntudde-default-settings の設定ができません:
 ubuntudde-default-settings は以下に依存 (depends) します: iw ...しかし:
  パッケージ iw はまだ設定されていません。

dpkg: パッケージ ubuntudde-default-settings の処理中にエラーが発生しました (--install):
 依存関係の問題 - 設定を見送ります
mailcap (3.70+nmu1ubuntu1) のトリガを処理しています ...
gnome-menus (3.36.0-1ubuntu3) のトリガを処理しています ...
desktop-file-utils (0.26-1ubuntu3) のトリガを処理しています ...
処理中にエラーが発生しました:
 ubuntudde-default-settings
```
もう一度、`--fix-broken install`してみた。
```shell
sudo apt --fix-broken install
```
今度は何も起こらず最後まで進んだ。

デスクトップを`ubuntudde`に変更して、これを書いているので、インストール成功とみなしていいのだろう。
IBM Analytics Engine Sparkからwatsonx.data を操作: 「1.  IBM Analytics Engine Spark インスタンスの作成」

watsonx.data では、以下のユースケースを実現するために IBM Analytics Engine Spark を使用することが推奨されています。

1. 大量のデータのwatsonx.dataテーブルへの取り込み(取り込み前にデータをクレンジングして変換可能)
1. watsonx.data テーブルのパフォーマンス向上のためのテーブルのメンテナンス操作
1. クエリとして表現するのが難しい複雑な分析ワークロード

「IBM Analytics Engine Sparkからwatsonx.data を操作」ではpythonを使ってwatsonx.dataのテーブルをIBM Analytics Engine instance(Spark)でアクセスする方法について説明します。**環境はIBM Cloudです。**

**IBM Analytics Engine Sparkからwatsonx.data を操作**
以下の順序で説明します。この記事は「1. IBM Analytics Engine Spark インスタンスの作成」です。


**1. IBM Analytics Engine Spark インスタンスの作成**
[2. IBM Analytics Engine Spark の構成](https://qiita.com/nishikyon/items/b897e6bceaf3ba56f695)
[3. Sparkによる処理](https://qiita.com/nishikyon/items/732a9c1e56de7560356c)

下の図が全体像です。この記事は①の作成になります。
[図1: 全体像]
![qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/7ed79efb-2888-ea76-424e-51e584a14c4c.jpeg)

尚、この内容は公式ドキュメント[Provisioning an Analytics Engine instance](https://cloud.ibm.com/docs/watsonxdata?topic=watsonxdata-lh-provisioning-serverless)に書かれている内容です。



# 0. 前提
- 課金可能なIBM Cloud IDが必要です。
- 同じアカウントにIBM Object Storageインスタンスが必要です。インスタンス関連データ (カスタム・ライブラリーや Spark 履歴イベントなど) に使用します。ない場合は事前に作成してください。
- watsonx.dataのインスタンスがあること

# 1. IBM Cloudにログインし、カタログを表示
https://cloud.ibm.com/catalog にアクセスします。
(ログインしていない場合はログイン画面の後、カタログ画面になります)

# 2. `Analytics Engine`を検索し、表示する
検索窓に`Analytics Engine` と入力し、表示された`Analytics Engine`をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/cf0028d6-acf4-e799-e682-0a43ecfae561.png)


Analytics Engine　作成画面が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c6f78543-06f9-ff96-41fe-77afb9aa01e3.png)

# 3. 必要事項を設定し、「作成」をクリック

- ロケーションの選択
  - watsonx.data に近い場所を選んでください
- プランの選択
　　　　- 2023年11月28日現在、`標準サーバーレス Spark`のみ選択できます
- サービス名・リソース・グループの選択・タグ・アクセス管理タグ
  - デフォルトで入るものを変更したい場合は変更する
- Spark ランタイムのバージョン
  - 新しいものを選択 （記事作成時点ではSpark 3.4）


- インスタンス・ホーム
  - インスタンス関連データを格納するAnalytics Engineインスタンスのホームとして使用するIBM Cloud Object Storageインスタンスを選択します
  - サービス資格情報が必要 というメッセージが表示されるので、「サービス資格情報の作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/1cf180db-0312-5eaf-d888-3f44e83a33ab.png)

  - クリック後、以下のような画面が表示されます
　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/bde78a9a-8a58-dff9-4f25-05807edc292e.png)


最後に右側の「以下のご使用条件を読み、同意します。」にチェックを入れ、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c38a0e31-8dbb-1843-8ea9-423ea58659b7.png)

その後、リソースリストが表示されます。「分析」カテゴリの下に表示されます。
「プロビジョンが進行中」が「アクティブ」になれば使用可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/786ad7b9-183c-45ad-e6c8-5d6b79d29583.png)
作成完了したら以下のようになります:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/acc832a4-4d75-fe0e-fde9-bdc25458e5cd.png)

以上です。

# NEXT
「[2. IBM Analytics Engine Spark の構成](https://qiita.com/nishikyon/items/b897e6bceaf3ba56f695)」に進みましょう!
MacBookを新しいものに移行したので、使っているツールと使いたいツールを整理する


[ミライトデザイン Advent Calendar 2023](https://qiita.com/advent-calendar/2023/miraito-inc) の12日目の記事です。

11日目は tomo さんの記事でした！
https://qiita.com/__tomotomon/items/18c8bd6e8aa1ce9e3c08


今回の記事は、ツールとかに特にこだわりがある方ではないのですが、Mac を新調したので、普段使っているツールをまとめてみました。

最近聞くちょっと使ってみようかなと思っているアプリなんかもついでに。

## chrome

ブラウザはしばらく chrome しか使ってない

https://www.google.com/intl/ja_jp/chrome/

最近 ARC が使いやすいって話を聞くので使ってみようかな

https://arc.net/

## Karabiner-Elements

大したことはしていないですが、キー入力をちょっと変えたいので Karabiner-Elements

https://karabiner-elements.pqrs.org/


- caps lock を消す ...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/d885ae66-ea67-fcbb-1fcb-f6ba67b4f372.png)

 - command キーのみで日本語入力と英字入力を切り替えたい

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/9c9e0c9e-2a3e-2573-d32e-226b1ef7904a.png)


## Slack

連絡用の slack

https://slack.com/intl/ja-jp/

## Alfred

キーボード操作だけで色々できるようになったり、コピペの履歴を残してくれたりする便利なやつ

無料でも使えるけど、コピペの履歴残してくれたりとかは有料サービス

https://www.alfredapp.com/

Raycast は無料で使えるらしいから、Alfred の有料版持ってない人はこっちでもいいかも

https://www.raycast.com/

## 1Passwod

パスワード管理はこれでやっているので、もうこれがないと困る

https://1password.com/jp/downloads/

## iTerm2

ターミナルです。
今まではずっと iTerm2 を使っていました。

https://iterm2.com/

買い替えを機に気になっていた Warp を使ってみよかな。
（追記 : 使ってみたけど今のところいい感じです！！）

https://www.warp.dev/privacy/overview



 ## Homebrew

もはやデフォルトで入ってるくらいに思ってた

https://brew.sh/

 ## ESET

 セキュリティソフト
 まぁこれはどっちでもって感じ
 
 https://eset-info.canon-its.jp/


 ## Intellij

 エディタ
 有料だけどこれは必須

 https://www.jetbrains.com/ja-jp/idea/


 ## Docker for Mac

 これも必須だな

https://docs.docker.com/desktop/install/mac-install/ 


## Fork

git の GUI ツール

個人的には Git の履歴なんかは GUI ツールの方が見やすいから入れてる
コンソール上からコマンドで表示できるところが気に入っています

https://fork.dev/
 

 ## Obsidian

メモを関連付けてグラフ常にできるんですよね
業務知識の整理にいいかなと思って使ってます

https://obsidian.md/

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364773/7cb10794-656e-3873-c883-8062a13d1b4f.png)


 ## 全然ツールじゃないけどやること

 ### github に公開鍵は登録する必要あるよね

 https://qiita.com/ucan-lab/items/e02f2d3a35f266631f24
AWSのアーキテクチャ図を書く環境を整えたら元気をもらえた話

## はじめに
AWSのアーキテクチャ図(構成図)って、なんか複雑そう...
正しい書き方がわかんないし、どうしよう...
なんて悩んで手が止まっていた時期が私にもありました。
そんな時に出会ってすごく救われたページと、描く環境の整え方についてご紹介したいと思います。

## すごく元気をもらえた話

https://aws.amazon.com/jp/builders-flash/202204/way-to-draw-architecture/?awsf.filter-name=*all

はじめてアーキテクチャ図描いてみるんだ！って人は、最初に必ずこれを読んで欲しいです。
アーキテクチャ図どうやってかけばいいんだろう、、って悩む必要ないんだなということがわかります。
ズバリ書いてあるのですが **「アーキテクチャ図に “正解” はない !」**　のです。
公式のページでこう言い切ってくださっているのがとても気持ちよく、元気がもらえます。

正しく描こうというより、
+ 誰に伝えるための図なのか
+ 何を伝えるための図なのか
に重きを置いて描くのが良いのですね。

## その上で覚えておくと有用なこと

https://qiita.com/g_ayushi/items/0e0f34d19813b8fdc2b8

とてもよくまとまっていてありがたいです。
こちらの記事のはじめ〜VPCのあたりまでが頭に入っていると、図が描きやすくなるのかなという気がしています。
その他のサービスが他とどのようにつながっているかは、活用する時に追々考えたり勉強したりすれば良いはずです。

## 描く環境を整える
WEB上で簡単に作図ができるサービスもいくつかあったりするのですが、自分のローカル環境で描くことを考えていきます。

### PowerPointで描く
パワーポイントで描くのがもっとも単純でいろんな人に馴染みがあるのかなと思います。
パワーポイントがPCに入っているならば環境構築不要ですし、描いたものを図として保存すればパワポ以外で作成した資料にも貼り付け可能です。
AWS公式がパワーポイントで使えるアイコンセットを用意してくれているので簡単に作図することができます。

https://aws.amazon.com/jp/architecture/icons/

13MBくらいの大きなpptxがダウンロードされます
パワポで作図することで感じる個人的なメリット・デメリットは以下の通りです。

<dl>
    <dt>メリット</dt>
    <dd>・馴染みある作図ツールで描くことができる</dd>
    <dt>デメリット</dt>
    <dd>・アイコンセットの管理が面倒(アイコンが更新された時ダウンロードし直さなくてはいけないetc)</dd>
    <dd>・目的のアイコンが探しづらい</dd>
</dl>

### draw.ioの環境をVSCodeに整える

WEB上で、会員登録などすることなく簡単に作図ができるツールであるところの[draw.io](https://app.diagrams.net/?)ですが、VSCodeに拡張機能をいれるとVSCode上で動かすことができるようになります。

https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio

"Draw.io Integration" という拡張機能を追加します。
拡張機能を追加後に
+ XXXX.drawio.svg   ( XXXX部分にお好みの文字列を追加 ) 
+ XXXX.drawio.png   ( XXXX部分にお好みの文字列を追加 )
のように名前をつけたファイルを開くとVSCode上にdraw.ioのエディタが開きます。

![スクリーンショット 2023-12-12 22.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/7b27c0ea-876f-0913-4c64-eb040a33207f.png)

デフォルトではAWSのアイコンセットは表示されていないので、左側メニューの「+ その他の図形」ボタンより、AWSのアイコンセットを追加します。
ネットワークの項目の「AWS19」にチェックを入れて適用を押すと
![スクリーンショット 2023-12-12 21.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/d4d07cf3-6684-aa0d-88a7-8326e69ba60f.png)

左のメニューの中にAWSのアイコンセットが追加されます。
![スクリーンショット 2023-12-12 22.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/ba750822-7434-e98f-6653-5821bf1ea48a.png)

扱う上での注意点としては以下2つがあります。
1. VSCodeの設定ショートカット(cmd+,)が効かなくなる
    drawioのエディタが起動するとVSCode設定画面へのショートカットが効かなくなります。
    code>基本設定>設定から選択してアクセスが必要です。

1. 図形追加画面をダークモードで開くと恐ろしく見づらい
    drawioのエディタもテーマを選ぶことができるのですが、ダークモードは非推奨な気がしています。。
    図形追加画面が黒っぽい背景に黒文字で恐ろしく見づらいです。

    ![スクリーンショット 2023-12-12 21.55.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/21e22ab4-11e3-1a8f-62c2-6e7019d6b46a.png)

    
    VSCodeの設定から　"drawio theme"などと検索すると設定画面が出てきます。
    "min", "atlas"が普通のライトなテーマだと思うのでどちらかを使ってみてください。
    ![スクリーンショット 2023-12-12 22.22.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594517/e5f8cbea-9e00-6bb2-7c34-2eb13f6a897b.png)

drawio for VSCodeで作図することで感じる個人的なメリット・デメリットは以下の通りです。

<dl>
    <dt>メリット</dt>
    <dd>・VSCodeで作業が完結する</dd>
    <dt>デメリット</dt>
    <dd>・ダークモードが見づらい</dd>
</dl>

## おわりに
自分にもできるじゃん！簡単じゃん！って思わせてくれるようなサイトや記事はとても元気が出ますよね。
ありがたいです。
私もそのような投稿ができていたらいいな〜と思います。
それ，numpy で書かない？--4--

## それ，numpy で書かない？--4--

for ループが遅いのに，それを使わざるを得ない選択肢を採っていないかな?


課題：random.random() とか random.uniform() を使うものだから for ループを使わないといけなくなるというジレンマ

https://qiita.com/yamadasuzaku/items/81c9750cf96a844aec38 のモンテカルロ法によるシミュレーション部分は以下のようになっている。

```python
    # 円と長方形の両方に含まれる点の数を数える
    overlap_count = 0
    for _ in range(num_points):
        # 一様な密度で円内の点を生成
        angle = random.uniform(0, 2 * math.pi)
        r = math.sqrt(random.uniform(0, 1)) * radius
        x = r * math.cos(angle)
        y = r * math.sin(angle)

        # この点が長方形の内部にも含まれるかチェック
        if rect_x_min <= x <= rect_x_max and rect_y_min <= y <= rect_y_max:
            overlap_count += 1
```

random.uniform() は呼び出されると 1 個の乱数しか返さない。そのため，必然的に返された乱数に基づく処理も 1 回ずつしか行えない，なので，for を使わざるを得なくなっている。

なお，処理部分はかなり複雑な計算をしているのに，結構な速さで for が回っているのだ。
num_points = 100000000 での実行速度は私の手元のマシンでは **Wall time: 36.5 s** であった。

例えば，これとは別の単純な（よくある正方形内の四分円で円周率を推計するような）やり方で for を使わずに numpy を使ってプログラムを書いてみると以下のようになる。


```python
    x = np.random.rand(num_points)
    y = np.random.rand(num_points)
    overlap_count = np.sum((rect_x_min < x) * (x < rect_x_max) * (rect_y_min < y) * (y < rect_y_max) * ((x**2 + y**2) < 1))
```

このやり方は発生させた乱数対を少なからず無駄にするが，処理自体が単純なので前述のプログラムとほとんど同じ実行速度を持つ。
**Wall time: 36.7 s** であった。

逆に言えば，前述のプログラムを numpy を使って書くとずっと速くなるであろうということである。
以下のようになる。


```python
    angle = np.random.rand(num_points)*2*math.pi
    r = np.sqrt(np.random.rand(num_points))*radius
    x = r * np.cos(angle)
    y = r * np.sin(angle)
    overlap_count = np.sum((rect_x_min <= x) * (x <= rect_x_max) * (rect_y_min <= y) * (y <= rect_y_max))
```

実行結果は **Wall time: 4.12 s で，9 倍ほど速くなっている**。

**結論**

numpy のベクトル計算をするには，道具自体も numpy.ndarray を対象にするような関数を使うことが必要だ。
【JavaScript】sort関数が数値の大きさでソートしない理由の考察

## きっかけ

https://qiita.com/qiita21409102/items/426db80a086950280e2e

上の記事を読んで、なんでこんな怠い設計なんだろうなーとぼんやり考えていたら、突然ひらめいた。
ので書く。

## なぜなのか

**JSの配列では数値や文字列などを混合させることができるから。**
数値のみの配列、文字列のみの配列、Dateのみの配列などで処理を変えることは容易だろうが、
混合されている場合、ソートのルールは各使用者の思惑によって変わってくる。
どういう挙動にしようが、「なんでこんなクソみたいな仕様なんだよ。」という声は出てくる。
ならいっそのこと面倒くさい型ごとの分岐処理などは組み込まず、（引数が指定されていなかった場合は）要素を文字列に変換してソートする。という単純な実装にしたのではないだろうか？

終わり。
【Android】プロジェクト初期にやったこと/失敗したこと

# はじめに
この記事は[Android Advent Calendar 2023 12日目](https://qiita.com/advent-calendar/2023/android)の記事です。
ちなみに、本日12月12日は【良い字一字】の語呂合わせにちなんで今年の漢字が発表される日だそうです。いよいよ今年が終わるのだという実感が湧いてきますね。


さて、皆様にとって今年1年はどんな年でしたでしょうか？
非常に忙しかった、新技術にチャレンジしてドキドキワクワクだった、とにかくバグを潰していたら1年が終わろうとしていた等色々あるかと思います。

自分としては、今年一年は新規プロジェクトに携わることが多い1年でした。
なのでこの記事で新規開発を行う上でやったこと・失敗したことをまとめていこうかと思います。

あくまでほんの一例ですが、これから新規プロジェクトを行う方の一助になれば幸いです。


## プロジェクト初期にやったこと
* 使用技術の選定
* モジュール作成
* build.gradleの整備
* AndroidManifestの整備
* 証明書作成
* サンプルクラスの作成

簡単に一つずつ見ていきます。

### 使用技術の選定
まずNew Projectする前に、使用技術・ライブラリの選定を行いました。
特に最近だと既存のAndroid Viewを使うのか、Jetpack Composeを使うのかという判断もこの段階で行うことになるかと思います。
また、この段階でコーディング規約の検討も行いました。（命名規則、禁止事項など）

### モジュール作成
責務を明確に分けるため、初期段階でモジュールを作成しました。
ツールバーの「File」 > 「New」 > 「New module...」 から作成することができます。
（参考：[ライブラリ モジュールの作成](https://developer.android.com/studio/projects/android-library?hl=ja#CreateLibrary)）

### build.graleの整備
プロジェクトの基盤となるbuild.gradleの整備を行いました。
具体的には下記の作業が必要になるかと思います。
* ビルドバリアントの設定
    * debug/releaseでそれぞれの設定
    * 検証環境・本番環境の設定
* アプリバージョンロジックの整備
* ライブラリやpluginの導入

### AndroidManifestの整備
上記のgradle設定で環境を分けたので、AndroidManifestも環境ごとに作成しました。
src/配下にgradleのproductFlavorsで設定したキーと同じ名称のディレクトリを作成し、その中にAndroidManifestを作成すると環境を変えたときに環境名と同じディレクトリにあるソースを参照してくれるようになります。（[参考：ソースセットでビルドする](https://developer.android.com/studio/build/build-variants?hl=ja#sourceset-build)）

また、忘れがちなパーミッション設定などもやっておきましょう。


### 証明書作成
.aab/.apkファイルを作成するために必要なキーストアもこの段階で作成しました。
ツールバーの「Build」 > 「Generate Signed Bundle/APK...」> AABかAPKを選択して「Next」 > 「Key store path」の「Create new...」から作成できます。
（参考：[アップロード鍵とキーストアを生成する](アップロード鍵とキーストアを生成する)）

### サンプルクラスの作成
他のメンバーとの認識を合わせるためにも、本実装に入る前にサンプルのクラスを作っておくことをおすすめします。
そうすることでどのクラスをどこに配置するかが明確になりますし、設計が不十分であった場合はこの段階で気づくことができます。


# 失敗したこと
### 早期にlintを導入しなかった
実装を開始して少ししてからlintを入れたことがあったのですが、ある程度実装を進めてから導入すると自動で修正できないエラーがちらほら出てきました。（ktlintFormatのワイルドカードimportなど）
こうしたエラーは手動で解決するしかないため、lintを導入するのが遅くなるほど無駄な手作業の時間が増えてしまいます。
lintを入れるなら早いに越したことはないという学びでした。

### READMEの作成を後回しにした
新規実装時は何かとやることが多いので、正直READMEのようなドキュメンテーションの整備に時間をかけることが難しい場面も多々ありました。
またそうして忙しい日々が続いていくと何をREADMEに書けばいいのかという軸がどんどんぶれてきてしまい、筆を取る手が重くなってしまいます。
その結果、新しくプロジェクトにメンバーが入るという時にてんやわんやしてしまい、既存メンバーも新規メンバーもお互い大変な思いをする結果となってしまいました。
少し面倒だとしてもREADMEは初期構築序盤の段階でババッと書いた方がいいなという反省でした。

最低限これらだけでも書いておきたいですね。
* プロジェクト概要
* クラス構成
* 環境構築手順
* PRを出す前に確認すること

### 検証環境でapplicationIdを設定しなかった

build.gradleでapplicationIdSuffixを設定することで、デフォルトのアプリケーションIDの末尾に追加文字列を付与できます。
こうすることで、「検証環境はデフォルトアプリケーションID.dev」とするなどの対応が簡単にできます。
（参考：[ビルド バリアント向けにアプリケーション ID を変更する](https://developer.android.com/studio/build/application-id?hl=ja#change_the_application_id_for_build_variants)）

これを設定しないと、どの環境でも全て同じアプリとみなされてしまうため、検証アプリをインストールした後に本番アプリを検証したい場合は一度検証アプリをアンインストールしなければならないなど非常にめんどくさくなります。
また、外部SDKを利用する場合などは環境ごとのApplicationIDを求められることがあります。
自分の場合は開発中盤でこのApplicationIdSuffixを設定していないことに気づき、外部SDKの設定など全てやり直しになってしまいました...


# 終わりに
久々に記事を書いたのでなんだか緊張しましたが、今年中にこのテーマで何かアウトプットがしたかったのでアドカレに参加してよかったです！

プロジェクト初期に何を設定するかはプロジェクトによって千差万別かと思います。
こちらで紹介したのはあくまでほんの一例なので、もし「こういうのもやった方がいいよ」といった情報があればぜひ教えていただけると嬉しいです！
【19日目】OSS連携してみたい(15)！LQRで経路追従(2)

この記事は筆者オンリーの[Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aichallenge_racing_for_mas)19日目の記事です。  

# 前回までのあらすじ
PythonRoboticsのLQRの処理について軽く調査しました。

# 今回やること
C++で実装するに当たり再度LQRを見ていこうと思います。

# LQRのC++実装について
C++でもPythonRoboticsのような実装をしているリポジトリを見つけました。[こちら](https://github.com/onlytailei/CppRobotics/tree/master#lqr-steering-control)になります。
また、ソースコードは[こちら](https://github.com/onlytailei/CppRobotics/blob/master/src/lqr_speed_steer_control.cpp)にあるようです。


# C++Roboticsの実行
実行してみます。


# まとめ
テスト条件, カバレッジアイテムってなんなの？

こんにちは！
この記事は[ソフトウェアテストの小ネタ Advent Calendar 2023 14日目](https://qiita.com/advent-calendar/2023/software-testing-koneta)の記事です。

[ISTQBの用語集](https://glossary.istqb.org/)の「テスト条件」と「カバレッジアイテム」ってなんなんでしょう？
これまで雰囲気でこれらの用語を理解していた気がするので、整理してみました。

### 用語の定義
> **テスト条件（test condition）** Version3
> テストのための根拠となる、コンポーネントやシステムのテストが可能な一部分。

> **カバレッジアイテム（coverage item）** Version2
> テスト技法を使用して、一つ以上のテスト条件から導出される属性または属性の組み合わせ。テスト実行の完全性を測定するために使用する。

調べていたところ秋山さんのブログに辿り着きました。
[第192回：　「ソフトウェアテストしようぜ」9　CDプレイヤー（2. テスト分析の中編）](https://note.com/akiyama924/n/n429ba0725c82)
[第195回：　「ソフトウェアテストしようぜ」12　CDプレイヤー（テストケース　中編）](https://note.com/akiyama924/n/nef8e6f96b66f)

その中で、秋山さんは
- テスト条件とは『テストによって確認できるもの/こと』
- カバレッジアイテムとは『テスト条件で確定していないことをみつけて、そのバリエーションを「どこまで」やるかを決めたもの』

と平易な言葉で説明されています。

### テスト条件とは
ご紹介したブログの中でも引用されていますが、改めてテスト条件について記述されている[ISTQB Advanced Level シラバス テストアナリスト](https://jstqb.jp/dl/jstqb.jpdlJSTQB-SyllabusALTA_V311.J03.pdf)を読んでみます。

> 一般的には、テスト条件を様々な詳細度合いで定義することが望ましい。まず、テスト
をするための大まかな対象を定義するために、「画面 x の機能性」といったハイレベ
ルの条件を識別する、次に、具体的なテストケースのベースとして、「画面 x では、正
しい長さよりも１桁足りないアカウント番号を拒否する」といった、より詳細な条件を識
別する。このような階層アプローチを使用してテスト条件を定義することにより、ハイレ
ベルのアイテムに対するカバレッジを十分なものにすることができる。このアプローチ
を使うことで、テストアナリストは、まだ洗練されていないユーザーストーリーに対する
ハイレベルなテスト条件を定義する作業を開始できる。

"テスト条件"として抽出できるものには、さまざまな抽象度があって良いようです。
「画面 x の機能性」という抽象的なものもテスト条件になるんですね。

### カバレッジアイテムとは
次にカバレッジアイテムについて。
カバレッジとは、対象をどれくらい網羅しているかという指標なので、
どれくらい網羅しているかを示すためのアイテムと考えると、わかりやすいですね。


### 「テスト条件」や「カバレッジアイテム」の具体例
具体例を考えてみます。

スマートフォンのプッシュ通知を考えてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549722/639b3734-fb66-6187-5fcf-b47bf37a176d.png)

例えば、「OS」。これはテスト条件ですよね。「文字列」もテスト条件。「文字数」もテスト条件。
では「Android」や「iOS」はカバレッジアイテムになるのでしょうか。
これはテスト条件でどのようなふるまいを確認したいのか、どのようなバグを出したいのかによっても変わってきそうです。
OSバージョンによる違いがないと断言できるなら、「Android」と「iOS」だけでカバレッジが示そうです。
一方で、OSバージョンによるふるまいの差異を見つけたいのならば、「iOS17」や「iOS16」などメジャーバージョンまで示さないと、カバレッジを示せないかもしれません。
同様に考えると、「iOS16.x」などマイナーバージョンまで示さないと、カバレッジを示せないかもしれません。
重要なのは、そのテスト条件で何をどこまで確認したいのかを明確にし、説明できることなのかもしれません。

ところで、プッシュ通知を題材にする必要なかったのでは。。

### さいごに
小ネタということで、取り留めもない記事になってしまいましたが、
今の自分が解釈している「テスト条件」「カバレッジアイテム」について書いてみました。
テスト用語って、人によっても違うし、現場によっても違うし、何ならその道xx年の方でも異なる解釈をしていたりするので、
具体例を交えて、自分なりの解釈を発信していくことが重要なのかなと感じました。
Photonを利用してオンライン対戦を実装したい～Photon.Punの備忘録～

　この記事は[海洋大技術系サークル Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kaiyo-tech)の12日目です。

# はじめに
　学校の課題とバイトでいっぱいいっぱいすぎてゲーム開発全然進められていないんですけど…
 
 ---
 百万年後…
 
　さて今回、[Photon]を利用してオンライン対戦を[現在開発中のゲーム](https://qiita.com/YSnami/items/152474788a64173d2fa3)に組み込んでいきたいと思って勉強したのでその備忘録。ロビーに接続、ルームの作成、ルームに接続、ゲームシーンへの移動までを超簡単に書きます。コードの意味はまだあんまり理解してないんで、なんかこうしたらできるらしいんだよねみたいな感覚で書いてます。認識の誤っている部分たくさんあると思うんで有識者の方いらっしゃいましたらご指摘の方よろしくお願いします

 # 準備
 　Photonの[アセット](https://assetstore.unity.com/packages/tools/network/pun-2-free-119922?locale=ja-JP)をプロジェクトにインポートし、セットアップを行います
  ![スクリーンショット 2023-12-12 195302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/2c9c2da9-556b-81d0-b4f9-5aead256f83e.png)

  Appld or Emailの部分には[Photon]で作成したプロジェクト（[Photon]にログイン→ダッシュボード→新しいアプリを作成する→アプリケーションタイプ：マルチプレイヤーゲーム、Photonの種別：Pun　に設定して作成する）のアプリケーションIDをコピペします
  ![スクリーンショット 2023-12-12 195940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/523e0f44-a331-4b1e-ef35-add6759c40bd.png)
↑Photonのプロジェクト作成画面
![スクリーンショット 2023-12-12 195422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/646ca325-5a82-da2b-c0ca-622575a84813.png)

# Photonのライブラリ
　今回はPhotonSettingという名前でスクリプトを作成しました。
以下のように書くとPhotonを利用することができるようになります
 
     using Photon.Pun;
上のusingがいっぱい書いてあるところにこれを追加します

あとクラス名のところ

    public class PhtonSetting : MonoBehavior

これを
    
    pulblic class PhotonSetting : MonoBehaviorPunCallbacks

これに書き換えます。MonoBehaviorではなくMonoBehaviorPunCallbacksを継承するようにします

# ネットワークに接続
　ゲーム開始時、ネットワークに接続するには以下のように書きます。例えばこれをStart()関数で呼べばゲーム起動時にネットワークに接続するようになります

     void Start()
     {
         PhotonNetwork.ConnectUsingSettings();
     }

# ロビーに接続
　ネットワークに接続しているプレイヤーを管理するにはロビーを使います。ロビーに接続する処理は以下のように書きます

     public void ConnectLobby()
     {
        　PhotonNetwork.JoinLobby();
     }

# ルームを作成
　ルームを作るには以下のように書きます。ボタンなどに設定しておいて、クリックされたら部屋が作成されるようにするみたいですね。この時ルーム名を設定する必要があるようですがそれの実装については本題から逸れるので割愛
 
    public void CreateRoom()
    {
        RoomOptions roomOptions = new RoomOptions();
        PhotonNetwork.CreateRoom("RoomName", roomOptions)
    }

また、ルームに接続するにはJoinRoom()関数を利用します。引数にはルームを作成する際にプレイヤーが設定したルームの名前を設定します

    public void ConnectRoom()
    {
        PhotonNetwork.JoinRoom(roomName)
    }

# ルーム内のプレイヤーをゲームシーンに遷移させる
　ルームを作成し、プレイヤーが集まったらゲームスタートです。そのためにはゲームシーンに移行する必要がありますね。LoadLevel()関数を利用します。引数はゲームシーンのシーン名を入れます。

    public void ToGameScene()
    {
        PhotonNetwork.LoadLevel(SceneName);
    }
     
# まとめ
　Unityでオンライン対戦を実装するための超ザックリとした流れとしてはこんな感じだと思います。プログラム自体は数行書くだけだったので意外と簡単なのかな（殴）。あとはボタンに関数を設定して、ルームの作成、ルームに接続、ゲームの開始ボタンなどを作っていきましょう。
  　[僕が今作ってる将棋アプリ](https://qiita.com/YSnami/items/152474788a64173d2fa3)の場合はロビー（下図ではマッチングまち画面と表記）にプレイヤーを集めて、集まったプレイヤーさんたちの対戦成績とかを比較してちょうどいい組み合わせが見つかったらルームを作成して、そのルームに２人をいれて対局開始！みたいな形にしようと思ってます。（僕のイメージは下図）
   ![シーン遷移ザックリ図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620913/fb3d5455-4dda-8d9a-4fe3-ed2ec1a5a08a.png)


 [Photon]:https://www.photonengine.com/ja-jp
テスト（システム開発）って何をするの？

※こちらの記事は今年(2023年)9月に投稿した記事をブラッシュアップしたものとなります。

# はじめに 
筆者は現在(2023年9月)、新卒で現場に配属されてから４か月ほどシステム開発業務をしており、特に**テスト業務**をメインで行っています。
そこで今回は**テスト業務**とはどのようなものか、改めてまとめてみました。

---
まずはテストとはそもそも何なのか、基本的な部分を説明します。

# システム開発におけるテストの立ち位置
（情報）システムとは、ハードウェアやソフトウェアを複数組み合わせて、全体で何らかの機能を持っているもののことを言います。人事給与システム、配送管理システム、SNS、オンラインゲームなどをはじめとする様々なシステムが存在し、現在の日常のあらゆるところで利用がされています。
**システム開発**は特にその中でも、**WEBサービスやスマホアプリなどのソフトウェアを作る仕事**です。
![IMG_7407.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329739/74ffab0e-255e-671d-6755-dbe0feee4126.jpeg)
システム開発は時系列順に大きく分けて次の３つの工程に分けられます：
- 基本設計（外部設計）・詳細設計（内部設計）
- 実装（コーディング／プログラミング）
- テスト

:::note
テストはシステム開発の中で最後に行われる工程となります。
:::


:::note warn
記事・本によってはシステム開発に要件定義や運用・保守を含めている場合もありますが、今回は上記の通りとします。
:::

# 何故テストが必要か？

まず**基本設計**・**詳細設計**において、システムで実装する**機能の決定**・その機能の**実装方法を決定**します。
次に**実装**において、その機能を実際に**システムに組み込みます**。
**テスト**というのは、この時点で予定していた機能が本当に**組み込まれているのかを確認**する作業となります。
一度の実装で不備なく機能が組み込まれることはあまり多くなく、**コードを間違えてしまう**、**想定とは違う挙動をしてしまう**、**過去に実装した機能が動かなくなってしまう**、といった事象がよく発生します。それらをしっかり確認せずに気づかないままにしてしまうと、最終的に**システムが不具合・バグを生じてしまう**こととなります。

:::note
テストは工数をしっかりかけて行う必要のある、非常に重要な作業です。
:::

# テストの種類

テストは大まかに次のように大分されます：
- コードレビュー
- 単体テスト
- 結合テスト
- システムテスト

### コードレビュー

**実装後すぐの段階でコードそのものを見て**、コーディング時のケアレスミスがないか、現場で定まっているコーディングルールに合っているか、関係のないコードが含まれていないかなどを確認します。

### 単体テスト

プログラム内の比較的小さな範囲に限定し、**詳細設計で決定した機能の実装方法の通りに動いているかを確認**します。
具体的には、様々な入力を想定される入力を可能な限り全パターン用意し、それらを与えた際に想定している出力がされるかを確認します。各パターンを重複や漏れなく確認する必要があるため、事前にテスト仕様書に各パターンをテストケースとしてリストアップし、それをもとにしてに順に確認をしていきます。

### 結合テスト

いくつかの**プログラム部品を組み合わせて**、基本設計・詳細設計で**意図した通りの動作・挙動をしているかを確認**します。
単体テストで各プログラム部品が問題なく動作している場合でも、それらを組み合わせた際にデータの受け渡しの不備等により、動作不良や不具合が見つかることが多くあります。

### システムテスト

**実際にシステムを使う想定で、システム全体を通して動作検証**を行います。
要件定義・基本設計で意図した通りの動作をしているかを確認します。

:::note
テストは対象範囲の広さ・目的に応じて何種類かに分けられます。
:::

:::note
まずは対象範囲の狭いテストから行い、徐々に対象範囲の広いテストを行っていきます。
:::

# まとめ

今回はテストについて簡単にではありますがまとめてみました。
現場で今実際に行っているテストが今回紹介したもののうちのどれにあたるのかがまだはっきりと分かっていない状況なので、今後はその部分についても意識しつつ、現場で行っている業務の解像度を上げていこうと思いました。

# 参考文献
https://webrage.jp/techblog/the_necessity_for_testing/
https://type.jp/et/feature/20963/

https://www.qbook.jp/column/616.html
https://www.qbook.jp/column/1683.html
https://www.qbook.jp/column/653.html
https://www.qbook.jp/column/1600.html

https://www.intra-mart.jp/im-press/useful/unit_test
https://blog.aiqveone.co.jp/unit-test/
https://products.sint.co.jp/obpm/blog/join-test
【18日目】OSS連携してみたい(14)！LQRで経路追従(1)

この記事は筆者オンリーの[Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aichallenge_racing_for_mas)18日目の記事です。  

# 前回までのあらすじ
PythonRoboticsのpure pursuitを動かして（？）みました。

# 今回やること
PythonRoboticsのLQRの処理について調査してみたいと思います。

# LQRの各処理について
PythonRoboticsのpursuitのソースコードは[こちら](https://github.com/AtsushiSakai/PythonRobotics/blob/master/PathTracking/lqr_speed_steer_control/lqr_speed_steer_control.py)になります。
また、アルゴリズムの概要は[こちら](https://myenigma.hatenablog.com/entry/2017/08/08/153651)で紹介されています。

# LQRとは
[こちら](https://qiita.com/renhoge/items/58aa3e96ea76d1ed2515)や[こちら](https://qiita.com/taka_horibe/items/47f86e02e2db83b0c570#%E8%BB%8A%E4%B8%A1%E3%81%AE%E8%BB%8C%E9%81%93%E8%BF%BD%E5%BE%93%E5%95%8F%E9%A1%8C%E9%9D%9E%E7%B7%9A%E5%BD%A2%E3%81%AB%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B)や[こちら](https://myenigma.hatenablog.com/entry/2017/08/08/153651)の記事がわかりやすいと思います。
すみません、私もよくわかっていません。


# PythonRoboticsの構成
Stateというクラスがあり、宣言時に現在位置、角速度、速度を初期化しているようです。

update関数があります。
これで現在位置、角速度、速度をアップデートしているようです。

pi_2_pi関数があります。
これで角度（-pi〜+piへ）の補正を行っているようです。

solve_dare関数があります。
これでリカッチ方程式を解いているようです。

dlqr関数があります。
これでLRQのゲインを算出しているようです。

lqr_speed_steering_control関数があります。
この関数で速度、角速度を算出しているようです。

calc_nearest_index関数があります。
この関数でTrajectory内の最も近い位置を算出しているようです。

calc_speed_profile関数があります。
この関数でTrajectoryの各速度を算出しているようです。

# まとめ
一気に制御理論が出てきてわけわからなくなりました。
炎上案件が初PMだった去年の自分へ捧ぐ、プロジェクトマネジメントの勘所〜すること・しないこと編〜

# はじめに
シリーズ
https://qiita.com/abe_shiro/items/59781017b2f999f01e18
https://qiita.com/abe_shiro/items/997e1b2a2adb95a446fd

### 急遽プロジェクトマネージャー就任
バックエンドエンジニアだった筆者、プロジェクトマネージャーの休職や退職により、突然複数の案件のプロジェクトマネージャーとして担当することになった。

### 大規模プロジェクトの遅延と問題
引き継ぎがない中で担当した案件は、n億円規模の新規モバイルアプリ開発。
プロジェクトは遅延しており、メンバーは高稼働状態。
ルールや責任範囲が不明瞭で、開発範囲も不確定な問題が多数存在していた。

### 経験の振り返りと改善点の考察
PMとしての立ち回りを振り返り、どのように対応すればよかったか、改善点を考察していきます。

# 問題
エンジニアからPMに立場が変わって意識の切り替えが中々できず、設計書のレビューなどこれまでやってきた作業をついついしてしまっていた。
この、ついついやってしまったのは、これまで経験があってどうしたらいいかがわかっていたから。
PMはプロジェクトを終わりに持っていくための判断に時間を使わないといけないが、経験したことが無いものが山ほどあり、それから逃げてしまっていた。

# 解決方法
することしないことを決めて、PMとしての役割のみに全力尽くす。

しないこと
心を鬼にしてメンバーがする作業をしない。

すること
案件をゴール（納品）に向けて進めるにはどうするか考えることに時間を使う。

やったことがない、経験したことがない、周りからは激詰されるし滅茶苦茶ストレスだと思う。
ただ、そこで逃げては案件が進まないので、腹括って案件を進めるにはどうするかに時間を使わないといけない。

# おわりに
どうしても人は心地よい状態になろうとする。
炎上案件はストレスの連続なので、なおのこと楽になろうとしていって余計に炎上してしまう。
炎上案件のPMという立場で辛いこともあると思うけど、PMはどういった役割を果たさないと案件が進まないかを考えて実行していくことに時間を使わないといけない。
【React】mapの戻り値は{}ではなく()で囲もう

## はじめに

`()`と`{}`、ほんのちょっとした違いですが、ちゃんとJavaScriptを理解すると、その差は大きいです。

## 問題

Reactでルーティングの学習をしていました。

`routes`という配列から`route`を受け取って`<Route>`を生成するコードを書きましたが、画面上に何も表示されませんでした。

```react
{routes.map((route) => {
    <Route
        key={route.path}
        exact={route.exact}
        path={route.path}
    >
        {route.children}
    </Route>
})}
```

## 原因

アロー関数の本体部分を`{}`で囲っているせいです。
ブロック`{}`ですと、引数を受け取って実行しているだけで、何も返却していません。

簡単な例を示します。

### ⭕️ 正しい

```javascript
// 実行結果を返している
const result = (x, y) => (x + y);

console.log(result(3, 4)); // 7
```

### ❌ 誤り

```javascript
// 実行しただけで何も返していない
const result2 = (x, y) => { x + y };

console.log(result2(3, 4)); // undefined
```

## 解決

`()`で囲んで、`<Route>`が返却されるように修正します。


```react
{routes.map((route) => ( // ← (で囲む
    <Route
        key={route.path}
        exact={route.exact}
        path={route.path}
    >
        {route.children}
    </Route>
))}
```

### 追記

`{}`で囲み `return` する方法もあります。
@ykhirao様、コメントでのご指摘ありがとうございました。

```react
{routes.map((route) => {
  return (
    <Route
      key={route.path}
      exact={route.exact}
      path={route.path}
    >
      {route.children}
    </Route>
  );
})}
```

## 終わりに

ほんのちょっとした差なのに、全然動作が異なりますね。
for文に使用する変数iをどこで宣言するか

for文を使うときに, 必ずと言っていいほど現れる変数i(カウンタ変数というらしい).

プログラミングの講義で，for文とはこういうものだと習った際には，for文中で宣言・初期化をいっぺんに行っていた．

```java: 講義で習ったver
//N: 適当な数
for(int i=0; i<N; i++){
    //適当な処理
}
```

ある日，プログラミングとはまた別の科目で，先生のコードを見る機会があったのだが，その先生は先に変数iを宣言していた．
```java: 先生ver
//N: 適当な数
int i;
for(i=0; i<N; i++){
    //適当な処理
}
```

講義で習った書き方だけが正解だと思い込んでいた私にとって先生verは新鮮で，しばらくの間先生verで書くのがマイブームとなっていた．

この2通りの書き方に差はあるのだろうか．

# 動作は変わらないが，iの扱いは違う
for文そのものの動作は変わらない．どちらで書こうとも，N回<適当な処理>が実行されることに変わりはない．
```java: 講義で習ったver(再掲)
//N: 適当な数
for(int i=0; i<N; i++){
    //適当な処理
}
```
しかし，for文の中で宣言をした場合は，この変数iはfor文の中でしか参照できない．
```java: これはできない
//N: 適当な数
for(int i=0; i<N; i++){
    i++;
}
System.out.println(i); //Javaの標準出力メソッド
```
対して，for文の外で変数iを宣言すると，その関数内であるならば参照することができる．
```java: これはできる
//N: 適当な数
int i;
for(i=0; i<N; i++){
    i++;
}
System.out.println(i); //Javaの標準出力メソッド
```
以降は，調べて分かったことをまとめる．

# 【結論】繰り返すだけならfor文の中で書くべき
調べた結果，繰り返しをしたいだけなら，for文の中で宣言・初期化をいっぺんに行うべきということが分かった．繰り返しをしたいだけ即ち変数iをカウントするためだけに使いたい場合は，for文の外で呼び出せる必要がない．

for文の外で宣言することで，また他のfor文で変数iを使いまわすことができるから効率の良いコードになるのではないかと思いもしたが，それはプログラム設計において良い習慣ではないらしい．

具体的には，「スコープ」という概念が関わっている．

# スコープ
「スコープ」とは，ある変数や関数が参照できる「範囲」のことである．

そして，プログラムを設計する際は，「スコープ」はできる限り小さくするべきという設計思想がある．

「スコープ」を小さくすることで，関数間などの依存度を下げることができる．プログラムを見直す機会や変更を加える機会があったときに容易になるからだ．

今回の変数iも複数のfor文で使いまわすとすると，それらのfor文は，1つの変数iに依存していることになる．この程度のコードで「可読性が...」,「メンテナンス性が...」とまではならないとは思うが，今後のためにもfor文の中で宣言・初期化をいっぺんに行うことを習慣づけたい．
AppleがオープンソースAIの分野にひっっそりと参入したらしい

つい先日，Googleが最強AIモデルと噂されているGemini（ジェミニ）を発表しましたね．果たして．絶対的な立ち位置にいるChatGPTに取って代わることはできるのでしょうか．
そんな中で実は，Appleもひっそりと自社AIを発表していたらしいんです．

>ホリデーシーズンに間に合うように、Appleの機械学習研究による新しいソフトウェアを本日リリースします．
MLXは，Appleのシリコン（つまりあなたのラップトップ！）専用に設計された効率的な機械学習フレームワークです．

と，Appleの機械学習チームのメンバーであるAwni Hannun氏がXに投稿しました．

https://twitter.com/awnihannun/status/1732184443451019431?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1732184443451019431%7Ctwgr%5Ee6d2f28f251e43212ab8b5999e6128336a6b77b7%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.gizmodo.jp%2F2023%2F12%2Fmachine-learning-framework-applmlx.html

MLXはPyTorchのAPIを踏襲し，多くの便利なプリミティブがすぐに使用できる．

- Transformer LMのトレーニング，またはLoRAによる微調整
- Mistralによるテキスト生成
- Stable Diffusionによる画像生成
- Whisperによる音声認識

今後のAI事業の動向が気になりますね！
ifを"もし"と書くこと、やめました

## はじめに

以前「[日本語プログラミング言語が必要な理由](https://qiita.com/jpl_produire/items/23e53dc8d2fd40e764ac)」という記事を書き反響を頂きましたが、今回は実際に開発・公開している日本語プログラミング言語「プロデル」の条件文の言語仕様に関する話です。

https://rdr.utopiat.net/

プロデルはWindowsメインですが、同一の言語仕様を持ちLinux,macOSも対象にした「[スミレ](https://sum.irelang.jp/)」という姉妹言語もあります。Webブラウザ上で動作する「スミレ畑」では気軽に動作を確認できます。

https://sum.irelang.jp/play/

## 条件文を「もし」と書くこと、やめます
プロデル1.9.1189以降では、条件文の予約語である「もし」を省略できるようになりました。プロデルでは次のように条件文を書けます。

```
「数値を入力してください」と聞いて値とする
値が10以上なら値は、10
値を出力する
```
[スミレ畑でテスト](https://sum.irelang.jp/play/1.9/?progbbshash=6578570a2d3af)

```
ファイルパスは「C:\data\data.csv」
ファイルパスというファイルが存在しなければ『
　　ファイルパスに空を保存する
』
```

## そもそも「もし」が不要となった

条件文は、条件分岐を表す「なら」,「ならば」もしくは仮定形の動詞があれば、そこに書かれた式文の真偽値によって、条件分岐します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101225/09ac8681-4c85-6c55-6bc2-c45b45fd3689.png)


これまで歴史的経緯からASCII系プログラミング言語でよく使われる「if」を単純に置き換えた「もし」という語を条件文に使ってきました。最近はプロデルの構文解析機能で動詞の仮定形を判別できるように改良したことで、条件文と判断するために「もし」と必ず書く必要はなくなり、省略可能にできました。このように動詞の仮定形を条件文とみなす、という日本語の文法上の特徴をプログラミング言語の仕様に活かす所が日本語プログラミング言語の魅力です。

また、最近はAtCoderのコンテストや、[東京大学のコンピューター系サークル主催のコードゴルフ大会](https://old.tsg.ne.jp/event)で、プロデルが参加言語に選択できるようになるなど、プログラミング競技やコードゴルフの分野でも異色枠(?)で採用されるケースが徐々に増えてきています。特にコードゴルフの分野では、コードのバイト数をいかに減らすかにしのぎを削っていますので「もし」を削ることは有用だと思っています。

## 引き続き「もし」も使えます

もちろん、これまでのプログラムとの互換性を維持するために、今後も条件文で「もし」を使うことができます。

```
ファイルパスは「C:\data\data.csv」
もしファイルパスというファイルが存在すれば
　　ファイルパスを開く
もし終わり
```

プロデルのような日本語プログラミング言語に慣れ切った人からすると、例に示したように「もし」を書いた方がプログラムの可読性が良いかと思います。「もし」が書かれていた方が読みやすいと思う場合には、これまで通り使うことができます。

また「もし終わり」については、代替となる表記が思いつかないので、そのままです。プロデルの文法を考える上では構造構文をどのように表現するかは悩ましい課題です。

## おわりに

今回は、日本語プログラミング言語の良さを魅せるために「もし」を使うことをやめることにした話でした。
プロデルでは、日本語プログラミング言語らしいプログラムを考える上で「もし」文のように慣れて当たり前になってしまった構文についても再考し、試行錯誤しています。
Webサイトのスピードをもっと感覚的に想像する

# リアルなサイトのスピード

[PageSpeed Insights](https://pagespeed.web.dev/?hl=ja)の`実際のユーザーの環境で評価する`の欄を見ると、そのページやサイトが実際に(Chromeブラウザに限りますが)どのくらいのスピードで体験された、おおよその割合でわかります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/04720b6c-d117-845e-e247-4d45b1993a89.png" width="983">

`ビューを開く`を押すとさらに詳細見ることができます。例えば`apple.com`全体の`LCP`はこんな感じで、2.5秒以内のPVが61%、4秒以上のPVが18%です(2023年12月12日時点)。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/4d9130eb-29cf-0e12-4db9-6de5f28b05de.png" width="347">

**なんとなく緑が大きいといいのはわかるんですが、具体的にどのくらいのスピードなのか感覚的なものとしてピンとこない**と思いませんか？

この割合からもっと具体的な分布を想像する、ということを試したところ、案外うまく行ったので方法を紹介します。

https://www.desmos.com/calculator/9witctjsn2?lang=ja

![CleanShot 2023-12-12 at 18.30.00@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/90b7b73d-4071-ba0f-809e-7220fb8fd74c.png)

このグラフだと、`LCP`は1.18秒くらいになる可能性が一番高いということがわかりました。これだと感覚的な数値として想像しやすいです。

# 対数正規分布

Webのスピードに関する指標は[対数正規分布](https://ja.wikipedia.org/wiki/%E5%AF%BE%E6%95%B0%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83)に従うとされます。

以下は実際にあるサイトで読み込み時間(`OnLoad`)を測定した結果です。計測値のヒストグラムと、中央値と平均値から対数正規分布を計算して薄い線で重ねたものですが、

![CleanShot 2023-12-11 at 16.48.20@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/c671bffe-4f0c-adbe-a113-5e20656b88d4.png)

ヒストグラムと理論的な予想が驚くほど一致していることがわかります。

他にもPageSpeed Insightsの内部でスコアの計算に対数正規分布が用いられています。

# 対数正規分布のパラメータ

対数正規分布のパラメータは`μ`と`σ`のふたつです。

データとして、

- 2.5秒以下の累積度数が61%
- 4秒以下の累積度数が100-18=82%

というヒントが得られているので、これらから`μ`と`σ`を求めてみます。

まず、対数正規分布の累積度数分布関数がこちらですが、

```math
f\left(x\right)=\frac{1}{2}\left(1-\operatorname{erf}\left(-\frac{\ln\left(x\right)-μ}{\sqrt{2}σ}\right)\right)
```

これを`μ`と`σ`についての式に変形するとこんなふうになりました。`erfinv`は誤差関数`erf`の逆関数です。

```math
μ=\sqrt{2}e_{rfinv}\left(1-2y\right)σ+\ln\left(x\right)
```

指標の値`x`と、累積度数`y`はすでにヒントとなる定数`(2.5, 0.61)`と`(4, 0.82)`があるので、以下の部分は定数にできて、

```math
a=\sqrt{2}e_{rfinv}\left(1-2y\right)
```

```math
b=\ln\left(x\right)
```

`μ`と`σ`は一次式になりました。

```math
μ=aσ+b
```

連立一次方程式を解くと、`μ=0.709889073996`、`σ=0.738945909242`となりました。

実際に`x=2.5`と`x=4`を当てはめると、それぞれ`y=0.61`、`y=0.82`が得られるので合ってそうです。

# 最頻値と中央値

`μ`と`σ`が決まれば、最頻値と中央値も計算できます。

```math
最頻値=\exp\left(μ-σ^{2}\right)
```

```math
中央値=\exp\left(μ\right)
```

# 確率密度関数

最後に確率密度関数

```math
f\left(x\right)=\frac{1}{\sqrt{2\pi}sx}\exp\left(-\frac{\left(\ln\left(x\right)-m\right)^{2}}{2s^{2}}\right)
```

として描画したのがこちらです。

![CleanShot 2023-12-12 at 18.30.00@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/90b7b73d-4071-ba0f-809e-7220fb8fd74c.png)

こちらの数式はコピーして編集できますので、他のサイトの指標についても試してみてください。

https://www.desmos.com/calculator/9witctjsn2?lang=ja
【Rails】メソッド呼び出し時のバックトレースを確認したい

# はじめに
既存実装の調査にあたり、特定のメソッドがどう利用されているのかを実際に処理を動かしながら確認したかった

# 問題
対象のメソッドが複数箇所から複数回、多階層に渡ってなど想像以上に複雑な呼ばれ方をしており、単純にログから追う形では把握が難しかった
~~なんだか毎回調べている気がするため備忘として~~

# 解決方法
callerメソッドを利用することでバックトレースを確認することが出来る。
```ruby:app/controllers/test_controller.rb
class TestController < ApplicationController
  def index
    test_method
    @tests = Test.all
  end
  
  private

    def test_method
      p '呼ばれたよ'
      # callerメソッドを利用してバックトレースを出力
      puts caller
    end
end
```

```text:ターミナル出力
"呼ばれたよ"
/app/controllers/tests_controller.rb:3:in `index'
/usr/local/bundle/ruby/3.2.0/gems/actionpack-7.0.7.2/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/usr/local/bundle/ruby/3.2.0/gems/actionpack-7.0.7.2/lib/abstract_controller/base.rb:215:in `process_action'
/usr/local/bundle/ruby/3.2.0/gems/actionpack-7.0.7.2/lib/action_controller/metal/rendering.rb:165:in `process_action'
/usr/local/bundle/ruby/3.2.0/gems/actionpack-7.0.7.2/lib/abstract_controller/callbacks.rb:234:in `block in process_action'
　　　　　　　　　　　　　　　　　　　　　　　　　︙
```

# おわりに
callerメソッドを利用する事でバックトレースを参照する事が出来る。
また、callerメソッドの返り値は文字列の配列であるため、putsメソッドを利用する事で改行を含めて見やすい形で表示する事が出来る。
さらに必要に応じてcaller.first や caller[0..2]といった記法を利用することで、必要に応じて表示範囲を制限することもできます

# 参考にさせて頂いた記事など
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/caller.html  

https://www.xmisao.com/2014/03/29/how-to-get-the-name-of-calling-method-in-ruby.html  

https://zenn.dev/nagan/articles/ae479d26e6d2b0