OmniAICreator/Qiita-1.07M huggingface dataset:
スクラムとは結局なんなのか

## 初めに
僕は4年ほどスクラムを採用した組織づくりを行ってきました。
最近「スクラムの内容は理解したけど、結局スクラムがなんなのかがわからない」という話をされることがちょこちょこあるので、記事としてまとめることにしました。

## スクラムとは
スクラムとは、アジャイル開発を実現するためのフレームワーク、プラクティスの一種です。
[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)には、以下のように定義されています。

> スクラムとは、複雑な問題に対応する適応型のソリューションを通じて、⼈々、チーム、組織
が価値を⽣み出すための軽量級フレームワークである。

[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf) より引用

スクラムでは、スクラムマスターやプロダクトオーナーなど、いくつかのロールをもうけ、ロールごとにチームとしての開発を進めていきます。
また、スプリントの単位で以下のようなイベントを実施していきます。

- スプリントプランニング
- デイリースクラム
- ミッドタームレビュー
- スプリントレビュー
- スプリントレトロスペクティブ

詳しいイベントの目的や定義などは[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf) をご覧ください。

## スクラムの難しさ
スクラムはイベントなどの定義が明確にされており、それらは何かを準備せずともはじめることができてしまうものが大半なので、比較的開始するハードルが低いと思っています。
その一方で、https://qiita.com/getty104/items/74512b8a0d89b8b4bea3 の記事にも書いたのですが、始めるのが簡単な一方、各イベントの目的や、スクラム自体の造詣がなくとも運用自体はできてしまうため、なんとなく「しっくりこない」状態に陥りやすいです。
おそらく「スクラムの内容は理解したけど、結局スクラムがなんなのかがわからない」という言葉もこの、形だけの始めやすさとスクラムの練度の低さのギャップにより生まれてくる悩みなんじゃないかなと考えています。

## スクラムの正体
スクラムの正体を理解するためには、まずはアジャイルとはなんなのかを理解する必要があると思っています。
アジャイルという思想が登場するまでは、システムはウォーターフォールという思想での開発が主流だったことは有名な話だと思います。
ウォーターフォールとは、各ステップが予定通り進んでいく前提でスケジューリング、開発を行っていく、いわば「不確実性」は計画段階でゼロにすることができる、という思想を持つ手法だと考えています。
それに対して、アジャイルとは「不確実性をゼロにすることはできない」という、ある意味での銀の弾丸の存在を否定する思想だと考えています。
つまり、アジャイルとは不確実性をゼロにするかわり

- できるだけイテレーティブにものづくりを行う
- プロダクトの評価を細かいスパンで行い、軌道修正を行なっていく
- 事前に用意するマニュアルより、今リアルタイムで動いているコードを信頼する

などの、リアルタイムで進んでいる開発、手続き、チームの状態に目を向け続け、細かい軌道修正をしながら道を進んでいきましょう、という開発思想、手法です。

そしてスクラムも同じく、「開発手法、進め方に銀の弾丸はない」という前提で自分たちのプラクティスを獲得していくための手法です。

一言で言ってしまえば「自分たちにとってのプラクティスを獲得するためのプラクティス集」がスクラムなのです。

つまりスクラムのイベントやロールをマニュアル通りに行なってもスクラムの目的は達成されません。
重要なのは「いかにスクラムのプロセスを経て自分たちの学びが増えているか」になります。

ここを勘違いすると、マニュアル通りにスクラムを回すこと自体が目的になってしまい、実は自分たちの学びは何も増えていなかった、という状態になるリスクがあります。

## まとめ
このように、スクラムとは実施するのは簡単な一方、本当の意味でスクラムによって実現したい目的を達成し続けることはとても難しいものです。

過去スクラムについていくつか記事を書いているので、よかったら併せてご覧ください。

https://qiita.com/getty104/items/35ccb10ce660e7487ef8

https://qiita.com/getty104/items/74512b8a0d89b8b4bea3

https://qiita.com/getty104/items/096cb7f8484292185a81
Power Platformのデータソースはどのように接続できますか？

Power Platformのデータソースは、**コネクタ**というものを使って接続できます。コネクタとは、Power Platformのサービスと外部のデータソースとの間にデータのやり取りをするための仲介者のようなものです。コネクタには、**Dataverse**、**SharePoint**、**SQL Server**、**Excel**、**Twitter**など、さまざまな種類があります¹。

コネクタを使ってデータソースに接続するには、以下の手順を踏みます。

1. Power Appsの管理コンソールにログインします。
2. 左側のメニューから、**データ** > **接続**を選びます。
3. **新しい接続**をクリックして、接続したいデータソースのコネクタを選びます。
4. コネクタに必要な**認証情報**を入力します。認証情報は、データソースにアクセスするためのユーザー名やパスワードなどの情報です。
5. **作成**をクリックして、接続を完了します。

これで、接続したデータソースのデータを、Power Platformのサービスで利用できるようになります。たとえば、Power Appsでアプリを作成するときに、データソースのデータを表示したり、更新したりできます²。


ソース: Bing との会話 2024/2/25
(1) データ ソースへの接続と認証 - Power Platform | Microsoft Learn. https://learn.microsoft.com/ja-jp/power-platform/admin/security/connect-data-sources.
(2) データを Microsoft Dataverse に統合する - Power Platform. https://learn.microsoft.com/ja-jp/power-platform/admin/data-integrator.
(3) データソースに接続する - cloud.config. https://tech-blog.cloud-config.jp/2021-05-20-power-apps-data-access1/.
(4) データフローの問題のトラブルシューティング - データ ソース .... https://learn.microsoft.com/ja-jp/power-query/dataflows/troubleshooting-dataflow-issues-connection-to-the-data-source.
(5) undefined. https://dataintegrator.trafficmanager.net.
J-Quants APIを使って上場銘柄一覧を取得する

## 概要

個人的に株の分析を行うにあたり、J-Quants APIを使って上場銘柄一覧を取得した際の手順となります。

## 環境

- mac OS: 13.5.2
- Python: 3.12.1

## J-Quants APIとは

株価や財務などの金融データをヒストリカルで簡単に取得できる、個人投資家向けのAPIデータ配信サービスです。
JPX総研により提供されています。

https://jpx-jquants.com/

## 注意点

J-Quants APIサービス利用規約を事前に確認しました。
利用する際に注意すべきと感じたのは下記の2点です。

- 登録ユーザーの私的使用のみ利用できる事
- 商用もしくは学術目的での利用は禁止である事

https://jpx-jquants.com/termsofservice

## 上場銘柄一覧を取得するまでの手順

### アカウント作成

トップページから【アカウントを作成する】より、手順にしたがいアカウントを作成します。

プランを選ぶように表示されるので、任意のプランを選びます。
今回はFreeプランを選択しました。
Freeプランは12週間の遅延があるので、実用性を求めるのであればライトプランが良さそうです。
名前と、請求書の住所を入力することで登録完了です!

### APIを叩いてみる

[ドキュメント](https://jpx.gitbook.io/j-quants-ja/api-reference/refreshtoken)に従い、リフレッシュトークンを取得してみます。

CurlとPythonのサンプルコードがあるので、とりあえずCurlで叩いてレスポンスが返ってくるか確認してみます。
`<YOUR EMAIL_ADDRESS>`に登録したメールアドレス、`<YOUR PASSWORD>`に登録したパスワードを入力します。

```bash:curl
BODY="{\"mailaddress\":\"<YOUR EMAIL_ADDRESS>\", \"password\":\"<YOUR PASSWORD>\"}" && curl -X POST -H "Content-Type: application/json" -d "$BODY" https://api.jquants.com/v1/token/auth_user
```

String型でリフレッシュトークンが返ってくればOKです。

### 上場銘柄一覧の取得

ドキュメントのサンプルに記載されているPythonコードを使用して上場銘柄一覧を取得するコードを書きました。

```Python:サンプルコード
import requests
import json
import pandas as pd

EMAIL_ADDRESS = "<YOUR EMAIL_ADDRESS>"
PASSWORD = "<YOUR PASSWORD>"

# リフレッシュトークン取得
data={"mailaddress":EMAIL_ADDRESS, "password":PASSWORD}
r_post = requests.post("https://api.jquants.com/v1/token/auth_user", data=json.dumps(data))
REFRESH_TOKEN = r_post.json()["refreshToken"]

# IDトークン取得
r_post = requests.post(f"https://api.jquants.com/v1/token/auth_refresh?refreshtoken={REFRESH_TOKEN}")
ID_TOKEN = r_post.json()["idToken"]

# 上場銘柄一覧
headers = {'Authorization': 'Bearer {}'.format(ID_TOKEN)}
r = requests.get("https://api.jquants.com/v1/listed/info", headers=headers)

# Pandas DafaFrameへ変換
r_dict = r.json()
df = pd.DataFrame(r_dict['info'])
```

### その他

丁寧なドキュメントがあるので、詰まったら確認すれば良さそうです。

https://jpx.gitbook.io/j-quants-ja/

また、Discordのコミュニティもあるようですので、困ったら参加してみようと思います。
MinecraftのModを作る②

MinecraftのModを作成する場合は、EclipseやIntelliJ IDEAが主流のようですが、今回はVisual Studio Codeを使用してデバッグできる環境を整えます。・・・個人的に使い慣れているからという理由です。はい。

#### 必要なもの
・Minecraft PC版(JAVA版)
・Minecraft Forge
・Visual Studio Code

(Forge環境の作成は[MinecraftのModを作る①](https://qiita.com/tester09/items/7756a163f83bc640b009)を参照してください。)

#### 作業手順
１．Visual Studio Codeの準備
２．デバッグ

#### 1. Visual Studio Codeの準備

Visual Studio Codeに「Gradle for Java」を追加します。

① Viasual Studo Codeを起動
② Extensionsのアイコンをクリック
③「Gradle for Java」を検索
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/2fab3dc7-eb90-fbf4-42a3-342e6ac7c838.png">

④「Gradle for Java」の[Install]をクリックしてインストール
⑤ コマンドプロンプトを起動
⑥ Forgeのディレクトリ(gradlew.batのあるディレクトリ)にて、`gradlew genVSCodeRuns`を実行しVisual Studio Code用の環境を生成

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/b7f2860c-b4ae-98f6-7f91-b28de614184b.png">

BUILD SUCCESSFULが出力されれば完了です。
(私の環境で15分かかりました。)

#### 2. デバッグ

ひとまずサンプルコードをデバッグできるか確認します。

① Visual Studio CodeでForgeのフォルダを指定して開く
② src\main\java\com\example\examplemod\ExampleMod.javaを開く
③ ExampleMode()のコードにブレークポイントを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/00e2b97a-d0e8-41a2-d672-88735bb53eef.png)
④ [Run and Debug]を選択後、プルダウンリストが[runClient]であることを確認し、実行
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/616b4564-faa6-d28b-e893-ec64ec64aeb4.png">
(途中の画面)
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/446c7cde-d23e-23e6-ddab-efb9d4c6f9e4.png">
⑤ 無事ブレークポイントに来ました
　あとは(いつも通り)デバッグするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/1a88c6c4-fd7b-8a6d-872d-9a654df78401.png)

----
もし分からないことがあれば、本家が出しているマニュアルを参照してください。
https://docs.minecraftforge.net/en/latest/

赤枠部分のプルダウンリストから、使用しているForgeのバージョンを合わせることを忘れずに！
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/495c7d61-ed4f-656d-1199-f57cfd4aee93.png">
Google のAI機械学習講座「Introduction to AI and Machine Learning on Google Cloud」の概要

# 概要

Googleが提供する無料のAI機械学習講座「Introduction to AI and Machine Learning on Google Cloud」を受講しました。
わかりやすく比較的易しい内容だけでなく生成AIの基礎についても学べるため、非常に良いコンテンツと思います。本記事では、講座の内容についてご紹介します。

講座: [Introduction to AI and Machine Learning on Google Cloud](https://partner.cloudskillsboost.google/paths/84/course_templates/593?locale=en)

![Screenshot 2024-02-25 at 13.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/186868ce-64c6-ca4d-b76e-72172946af68.png)


# 動機

- MLOpsに関心があり、機械学習について体系的に知識やスキルを習得したい
上記に向けて、Googleから提供されている講座「Professional Machine Learning Engineer Certification Learning Path」を学習する。
- 成果として、「Google Cloud Certificate- Professional Machine Learning Engineer」資格取得を目指す


# 学習講座の背景

- 生成AIをはじめ、AI・機械学習の需要が増加しており、機械学習エンジニアとしてのスキルが求められています
- この講座は、Google CloudにおけるAI・機械学習の基礎をカバーしています


# 講座の目的

- 参加者が Google Cloud における機械学習プロフェッショナルとしてのスキルを磨き、実務で活用できるようになることを目指して作成されています


# 講座の構成・コンテンツの種類

講座は、５このモジュールで構成され、各モジュールは動画による説明を中心に構成されています。
各モジュールには、以下が含まれています。

- ハンズオンラボ：Google Cloud上で実際にプロダクトやサービスを操作して理解する実習
- 理解度チェック：内容を理解しているかどうかを確認する5〜7問程度のテスト


# 講座の内容

この講座は５つのモジュールで構成され、Google CloudにおけるAIや機械学習のプロダクトやサービスについて学ぶことができます。
以下は各モジュールの要点です:

1. はじめに:
Google Cloud上のAI開発ツールについて概要を学べます。Google Cloud 上の 3 層 AI フレームワークにも学べます。

2. AIの基盤:
AIの基礎となるクラウドインフラストラクチャとして、コンピュートやストレージなどについて学習します。また、Google Cloud上の主要なデータとAI開発製品についても学習できます。最後に、データからAIへの移行を支援するMLモデルを構築するためにBigQuery MLを使用する方法を学習します。

3. AI開発オプション:
このモジュールでは、Google Cloud 上で ML プロジェクトを開発するためのさまざまなオプションについて学習します。学習済み API のような既製のソリューションから、AutoML のようなノーコードおよびローコードソリューション、カスタムトレーニングのようなコードベースのソリューションまで、さまざまな選択肢について、各オプションのメリットとデメリットを比較することで、適切な開発ツールを選択できるようになります。

4. AI開発ワークフロー:
このモジュールでは、Vertex AIについての概要を学べます。データ準備からモデル開発、Vertex AI上でのモデル提供までのMLワークフローの基礎や、Vertex AI Pipelinesを使用してワークフローを自動パイプラインに変換する方法についても学習します。

5. 生成AI:
このモジュールでは、AIにおける最先端である生成AIと、それを支えるテクノロジーである大規模言語モデル（LLM）についての基礎を学習できます。また、Generative AI StudioやModel Gardenなど、Google Cloud上のさまざまなジェネレーティブAI開発ツールについても学習します。最後に、AIソリューションと組み込まれたジェネレーティブAI機能について学習します。


# 所要時間
シラバスの公称16時間。
1週間程度の期間があれば、Google CloudでのAI・機械学習プロダクト・サービスの基礎を理解できます。


# 修了後
修了すると修了バッジを取得できます。

![Screenshot 2024-02-25 at 13.19.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55793/394bfaee-f45c-f959-2fb0-e5329140e742.png)

# まとめ
この講座は、非常にわかりやすく、難易度も比較的易しいため、Google Cloudが初めての方でも Google CloudにおけるAI・機械学習についての基礎を十分に理解できると思います。興味のある方はぜひチャレンジしてみてください。

以上
Macで以前できなかった Ruby+Rails環境構築に再トライ

## 以前できなかったこと
### 1.&nbsp; rbenvを利用してのruby version up
Ruby Version UpしたのにVersionが変わってない!
```
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin23]
```

この時は諦めてrbenvをアンインストールしてHomebrewからインストールしなおしました。universalと表示されているのは一度アンインストールしたのでMacデフォルトのRubyバージョンが表示されています。

### 2.&nbsp; rbenvを使用してのrails install

Railsインストールしたのになんで？？？
```
$ rails -v
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
```

書いてあること行なっても全然解決しない。
色々と調べても解決に至らず諦めモード

### しかし この度 無事環境構築できました。

## 結論
### rbenvのPATHが通っていなかった<br>つまりPATHさえ通せば全て解決

今回は解決に至ったので参考にした記事を交えながらやったことまとめます。

下記の記事で書いてあったので大事なことを書いておきます。

**sudo gem install railsは絶対に行わないことが大事だそうです。**

## 行なったこと
https://qiita.com/jnchito/items/e4872ff5c70a4c2219f1

1.&nbsp; rbenvのインストール　(Homebrewにてrbenvインストール)
ここから上記記事参考
2.&nbsp; Ruby再インストール (rbenvにてruby最新版インストール)
3.&nbsp; Rubyのインストールしたものをglobal設定(rbenv global 3.3.0)
4.&nbsp; Railsのインストール (gem　rails install)
5.&nbsp; ターミナル再起動
6.&nbsp; Railsで以前と同じエラーが出る
7.&nbsp; rbenv doctorを実行
8.&nbsp; エラーコードからPATHが通ってないことを確認
9.&nbsp; 下記資料を参考にしてrbenvでPATHを通す

https://zenn.dev/maimai_neet/articles/8228b119de7518

結局はrbenvへのPATHが通っていないため
ターミナルを再起動すると、railsがうまく読み込めなかったのですが
PATHをしっかり.zshrcファイルへ記載するとPATHが通り
Railsがしっかり利用できるようになりました。

```
Rails 7.1.3.2
```
色々と調べていく中で
とても資料が多く環境構築で皆さんがぶち当たる壁なのだと思い
記事を書いてみました。（初めて書きました）

先輩方の素晴らしい記事のおかげでなんとか環境構築できました。
自分も少しでも参考になるように
これから記事を書いてアウトプットできるようになっていきたいです。
Power Platformのセキュリティはどのように保証されていますか？

Power Platformのセキュリティは、以下のように保証されています。

- Power Platformは、**Microsoftのクラウド**で動いているので、Microsoftが提供する**高いセキュリティ**を受けられます。
- Power Platformは、Microsoftが開発するときに**セキュリティを考えて**作っています。法律や規則にも**従って**います。
- Power Platformは、**Microsoft Entra ID**というもので、あなたの**個人情報**を守っています。パスワードだけでなく、**電話番号**や**メールアドレス**なども使って、本当にあなたかどうかを**確認**します。
- Power Platformは、**Dataverse**というもので、あなたの**データ**を管理しています。あなたが作ったアプリやフローを**誰に見せるか**や**誰に使わせるか**を**自分で決められます**。
- Power Platformは、**暗号化**というもので、あなたの**データ**を**守って**います。インターネットでデータを送ったり受け取ったりするときに、**他の人に見られないように**します。データを保存するときにも、**他の人に読めないように**します。
- Power Platformは、**ベストプラクティス**というもので、あなたの**データ**を**守って**います。データを使うときに、**間違った方法**や**危ない方法**を使わないようにします。
- Power Platformは、**デフォルト拒否**というもので、あなたの**データ**を**守って**います。新しい機能や設定が出ても、あなたが**自分で選んで**使うまでは、**使わないように**します。また、**セキュリティの問題**や**古くなった部分**を見つけて、**直して**くれます。

Power Platformのセキュリティに関する詳細は、[Microsoft Power Platform ガイダンスのドキュメント]や[Power Platform のセキュリティに関するよくある質問]などのリソースで見つけることができます。😊
無限はしご型抵抗回路の合成抵抗

# はじめに
はしご型に抵抗を接続していった場合の合成抵抗計算は、電験理論科目の試験などで数多く出題される。今回は、無限に抵抗をはしご状に接続させた回路の合成抵抗について、数列の漸化式と連分数を用いた解法についてそれぞれ示し、最後にプログラムによってどのような値に収束するかを調査する。
# 問題設定
以下のような回路で考える。この回路の合成抵抗を求めたいのだが、無限回演算する訳にもいかないので、漸化式などの極限計算を用いて工夫をすることが大切である。

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/f0d7100d-ddc6-2377-4f65-d2f7db7e4a62.jpeg)

ただし、$R_1=100[\Omega],R_2=24[\Omega]$とする。
## 漸化式を用いた解法
このままでは、扱いづらいので、はしごをn個接続させたときと$n+1$個接続させたときの関係性について調べてみると以下のような関係になることが分かる。

![はしご型回路１.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/af64fa05-73f8-cfec-4d61-828df78c33d1.jpeg)

![はしご型回路2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/16a10b73-69b7-16dd-fa24-8aaf069613e4.jpeg)


したがって、これを式で表すと以下のようになる。

```math
R_{n+1}=R_1+\frac{R_n R_2}{R_n +R_2}
```
ここで、十分にはしごを繋げたと仮定すると、$n\rightarrow\infty,n+1\rightarrow\infty$より、

$R_{n+1}=R_{n}=R_{\infty}$

ただし、$R_{\infty}$は収束して、一定値になると仮定する。

ゆえに、以下の式が成立する。

```math
R_{\infty}=R_1+\frac{R_{\infty}R_2}{R_{\infty} +R_2}
```
したがって、この式を整理すると以下のようになる。

```math
R_{\infty}^2-R_1R_{\infty}-R_1 R_2 =0
```

ここで、$R_1=100,R_2=24$を代入すると、

```math
R_{\infty}^2-100R_{\infty}-2400 =0
```
```math
(R_{\infty}-120)(R_{\infty}+20)=0
```

```math
R_{\infty}=120,-20
```

ここで、$R_{\infty}>0$より、$R_{\infty}=120[\Omega]$となる。

## 連分数を用いた解法
同じ回路が繰り返し接続されたような回路では、連分数という概念を用いて解くこともできる。

![はしご型回路１.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/af64fa05-73f8-cfec-4d61-828df78c33d1.jpeg)

```math
R_{\infty}=R_1+\frac{1}{\frac{1}{R_2}+\frac{1}{R_1+\cdot \cdot \cdot }}
```

と表すことができるため、共通部部分$R_{\infty}=R_1+\cdot \cdot \cdot$とすると、

```math
R_{\infty}=R_1+\frac{1}{\frac{1}{R_2}+\frac{1}{R_{\infty} }}
```
となり、

```math
R_{\infty}=R_1+\frac{R_{\infty}R_2}{R_{\infty} +R_2}
```

となることから、以下同様の計算を行うことで$R_{\infty}=120[\Omega]$となる。


# プログラム
それでは、漸化式を再帰のPythonプログラムで表して、合成抵抗の収束状況を見ていこう。
以下のプログラムを書く。
```　python zenkasiki_saiki.py
import matplotlib.pyplot as plt
import japanize_matplotlib
import numpy as np

R_1 =100
R_2 = 24
#再帰的に漸化式から値を推定
def resistance(n):
    if n ==1:
        return R_1+R_2
    else:
        return R_1+R_2*resistance(n-1)/(R_2+resistance(n-1))
    
#グラフ化

plt.title("ハシゴ型抵抗の合成抵抗値[Ω]")
plt.xlabel("n")
plt.ylabel("合成抵抗値[Ω]")

#n=1から10までを計算する

for i in range(1,20):
        plt.scatter(i, resistance(i))
plt.show()
```

これを実行することで、以下のようなグラフが出力される。ただし、計算に時間がかかるので、はしごの個数nを1から20までとした。

![はしご型抵抗グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/eeaee579-42d6-d053-6141-8a1fc4f3a166.png)

このように、見事に$120[\Omega]$付近に収束していることが分かる。
グラフをよく見ると$n=3,4$あたりで既に120付近にいることから、これくらい用意すれば無限大（十分な長さ）という条件はクリアしそうである。

# まとめ
今回は、無限はしご型回路の合成抵抗を漸化式や連分数の極限を取ることで導出した。また、計算時間はかかるが、再帰のプログラムを実行することにより、はしごを3個程度繋げれば、無限大という条件はクリアできそうだと言うこともわかった。今回の問題は有名問題なので、ぜひとも解き方を身に着けよう。
「Clean Architecture 達人に学ぶソフトウェアの構造と設計」を読んで

読まねばと思い、なかなか読めてなかったのですが、
最近読了できたので学んだことをできるだけ言語化したくこちらを書きます。
今回読んだのは非常に有名な「Clean Architecture 達人に学ぶソフトウェアの構造と設計」です。
書評になります。読書感想文です。

https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656

## 読んでみるといい人
- 仕事でクリーンアーキテクチャをやってるけどよくわからん人
- プログラムを書いている人
- 良い設計や良いサービス開発をしたいと思ってる人
- 少しプログラムがわかる人（の方が多分読みやすいです）

### どんな本？
「クリーンアーキテクチャ」という名前がタイトルに入ってはいますが、クリーンアーキテクチャについて触れられるのはほんの一部です。
原理原則について触れ、どういうアプローチをすると改善できるか？などをボブおじさんの意見を絡めて紹介されています。
クリーンアーキテクチャは、過去にあった問題などを含めてそれらを解消するために考えられたとする、設計概念として紹介されています。

またDBやGUI、フレームワークなど、システム開発に関する様々な要因とどう付き合っていくのか？
ビジネスとどうやって同居するのが良いのか？
この辺りにも強く触れられており、大変参考になることが多いです。

クリーンアーキテクチャにも含まれますが、テスト容易性やUI・フレームワーク非依存などの考え方は
別にどの概念においても本来求められる設計だと感じました。
それをどう実現するのか、またどのような懸念があるのか？などについてもいろんなケースで紹介されています。
ただ、何が言いたいかというと、*アーキテクチャのルールはどれも同じである！*ということなんだなとわかります。

## 感想
まず読んでよかったです。
実は読む前はクリーンアーキテクチャについての本だと思っていました。
ただ実際は良いアーキテクチャとは何か？という点について様々な観点やケースを用いて説明がありました。
「クリーンアーキテクチャ」についても学ぶことはできますが、
「クリーン*な*アーキテクチャ」、について学ぶことができる本だと感じました。
仕事でプログラムを書く方、仕事以外でもプログラムのどこかに携わっている方は一度読んでみて損はないと思います。
分厚い本ではありますが、それほど複雑怪奇なことが書かれていることもなく、読みづらいことはないと思います。
ただボブおじさんの意見はあくまでボブおじさんの意見であることもあると思うので、
１意見としてみてみるのもいいと思いました。

読む前は読んだ内容を簡単にまとめようと思いましたが、とてもそんなことができる内容量ではないと思います。笑
今度は読みながら章ごとにスクラップを書いていこうと反省しています。
ぜひ読んでみてください。
【Ruby on Rails】CRUD操作用ルーティングの自動設定の生成・利用方法【名前付きルーティング、resources、resource】

### 勉強前
・ルーティングの自動生成ってどうやったら何が生成される？
　　resources？でなんかCRUD操作用のパスが追加される？
・ルーティング用ヘルパーがいっぱいあるように見えて整理がつかない...
　　xxx_path？xxx_url？xxxには何が入る？


### 名前付きルーティング
#### routes.rbの記述
- 特定のパスへのリクエストを特定のcontrollerのメソッドに割り当てる
  - controller（xxx_controller.rb)とメソッドを作成
  - routes.rbにルーティング設定を記述
 紐づけは命名規則によって行われる。
 
例）.../patients/{id}　へのGETリクエストをルーティング
```app/controllers/patienrs_controller.rb
  def show
    # リクエストに対する処理
  end
```

```config/routes.
get '/patients/:id', to: 'patients#show'
get '/patients/:id' => 'patients#show'
```

##### ヘルパーの利用
・patients_path(リソース名+_path) → `/patients`を取得できる
　_pathでなく_urlを使うとURL（ホスト名 + ポートも含む）を取得できる

### ルーティング設定の自動生成
#### resources宣言
##### routes.rbの記述
下記を宣言することで、CRUD操作にあたる各HTTPメソッドのアクション & 各アクションの入り口となるページについてのルーティングが自動生成される。
```config/routes.rb
resources :photos
```
|HTTPメソッド|生成されるパス|紐づけ先のcontroller#メソッド|メソッドの役割| 
|:-:|:-:|:-:|:-:|
|GET|/photos|photos#index|一覧ページ表示|
|GET|/photos/new|photos#new|新規登録ページ表示|
|POST|/photos|photos#create|新規登録|
|GET|/photos/:id|photos#show|特定の写真のページ表示|
|GET|/photos/:id/edit|photos#edit|写真情報の更新・編集ページ表示|
|PATCH/PUT|/photos/:id|photos#update|写真情報の更新|
|DELETE|/photos/:id|photos#destroy|写真の削除|
			

各アクションのルーティング先のメソッドでは、操作の後にどこかしらのページにリダイレクトさせる処理を書く（操作後にどのページを表示すれば良いか示してあげる）必要があることが多い。

##### ヘルパーの利用

|ヘルパー|返るパス|
|:-:|:-:|
|photos_path|/photos
|new_photos_path|/photos/new|
|edit_photos_path(:id)|/photos/:id/edit|
|photo_path(:id)|/photos/:id|



#### resource宣言
##### routes.rbの記述
```config/routes.rb
resource :user
```

※resource :{**単数形**}
 
これも、resources宣言同様ルーティングが自動生成される。
resourcesとの違いは
・操作するリソースが1つしかない前提になる（リソース名の表現が単数形になる）
  →パスパラメータ（:id）を含むパスはない + 一覧表示ページのパスもない


##### ヘルパーの利用
resourcesと同様。当然これも単数形のみ。


### まとめ
- resources:{リソース名(複数名詞)} → CRUD操作とCRUD操作をするためのページ用のルーティング設定（このパス・HTTPメソッドへのリクエストはこのcontrollerのこのメソッドで受けられます）が自動生成される
- resources:{リソース名(単数形)} → resourcesと同じ。ただし複数リソース前提のパスはなくなる
- ヘルパー
  - {(命名規則に沿ったパスの名前)}_url → 完全なurlを返す
  - {(命名規則に沿ったパスの名前)}_path → urlのホスト名より後を返す

### 勉強後
整理にあたっては下記あたりを押さえる必要があった。
・resource(s)で生成されるルーティング設定には、ページ（View）表示用のものとCRUD処理用のものとがあること
・パスを返すヘルパーは2種類：xxx_path、xxx_url
・xxxに入るのは、自動生成されたルーティング設定に紐づくパス名（命名規則に沿って自動生成されるので、覚えたり調べたりする必要がある）

ルーティングのネストやグループ化については使う場面が来たら加筆しよう...


### 参考
[Rails のルーティング-Railsガイド](https://railsguides.jp/routing.html)（v7.1）
mix-blend-modeを使用して白黒反転を簡単に実装

## mix-blend-modeを使用で白黒反転

mix-blend-modeとは、cssのプロパティの一つで
要素の内容物と親要素の内容物や要素の背景をどのように混合するかを設定できるもの。

https://developer.mozilla.org/ja/docs/Web/CSS/mix-blend-mode

混合するのが主な用途かもしれないですが、実はdifferenceを使用すると簡単にカラーの反転を実装することができます。


```
 mix-blend-mode: difference;
```

たったこの１行を該当箇所のスタイルに適応させてあげるだけです！

しかも、テキストカラー、背景色などいろいろなものが対象です。
試しにテキスト（color）とハンバーガーメニュー（background-color）を対象として検証してみました！


<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="YzgobMd" data-user="niyu1103" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/niyu1103/pen/YzgobMd">
  Untitled</a> by niyu (<a href="https://codepen.io/niyu1103">@niyu1103</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


テキストもハンバーガーメニューの棒（背景色で実装）の色も白（#fff）で実装しているのですが、
背景色が黒から白へ移動した際に自動で黒へ反転していることがわかるかと思います！

すごい！

クラスやjsなどで色の変更はできての、中途半端な位置の場合こんな感じにはなりません。

![スクリーンショット 2024-02-25 12.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483702/b631f72d-0fe7-2199-c3ed-56f9ad269d08.png)

これが簡単に実装できるなんて！すごいなーと感心です。


今回は反転を目的に使用しましたが、 mix-blend-modeには他にもいろいろあるので、カラー的な変化など、いろいろな可能性を感じますね！

是非いろいろ試してみて欲しいです！

参考サイト：

https://pengi-n.co.jp/blog/mix-blend-mode/
Power Platformのライセンスはどのようになっていますか？

Power Platformのライセンスは、以下のように分類されています。

- **無償版**: Microsoft 365 EnterpriseやOffice 365の大企業版などのライセンスに含まれており、Power Platformの基本機能を利用できます。ただし、処理回数やデータ量、コネクタの種類などに制限があります。
- **有償版**: Power Apps、Power Automate、Power BI、Power Virtual Agentsなどの各サービスごとに個別に購入できるライセンスで、無償版では利用できない機能や拡張性を提供します。また、DataverseやAI Builderなどのプレミアム機能も有償版でのみ利用できます。
- **開発者プラン**: 開発者やメーカー向けに提供される無料のライセンスで、独自の開発者環境でPower Platformのアプリやフローを作成やテストできます。ただし、開発者プランだけではアプリやフローを実行することはできません。¹

Power Platformのライセンスに関する詳細は、[Microsoft Power Platform ライセンスの概要](^1^)や[Power Automate ライセンスに関してよく寄せられる質問](^4^)などのドキュメントを参照してください。😊

ソース: Bing との会話 2024/2/25
(1) Microsoft Power Platform ライセンスの概要 - Power Platform. https://learn.microsoft.com/ja-jp/power-platform/admin/pricing-billing-skus.
(2) Microsoft Power Platform ライセンスの概要 - Power Platform. https://learn.microsoft.com/ja-jp/power-platform/admin/pricing-billing-skus.
(3) Power Automate ライセンスに関してよく寄せられる質問 - Power .... https://learn.microsoft.com/ja-jp/power-platform/admin/power-automate-licensing/faqs.
(4) Power Platformの有償版ライセンスと無償版との違い. https://www.cloud-for-all.com/bizapp/blog/power-platform-paid-version-license.
(5) Power Apps 開発者プランについて - Power Platform .... https://learn.microsoft.com/ja-jp/power-platform/developer/plan.
UbuntuServerでMinecraftForge1.16.5を建てる話

# はじめに
自宅のUbuntuServerにForgeサーバーを導入しようと思った際に、
参考にできる記事が少なかったため、備忘録としてここに書き残しておこうと思います。

# 環境
OS: UbuntuServer Ubuntu 22.04.4 LTS
CPU: Intel Core i5 2400
Memory: 4GB
(同じネットワーク上のメインPCからssh接続しています。)

# パッケージを最新版にする
```shell
sudo apt update
sudo apt upgrade
sudo apt autoremove
```
upgradeとautoremoveは実行前に本当に実行するか質問されるので Y と答えてください。

# Javaのインストール
各々のバージョンにあったJavaをインストールすると良いです。
マインクラフトのバージョンとJavaのバージョンについては
MinecraftWiki/チュートリアル/Javaの更新/更新の必要性 をご覧ください。

https://minecraft.fandom.com/ja/wiki/チュートリアル/Javaの更新

```shell
sudo apt install openjdk-8-jdk
```

# Forgeのインストール
まずはインストール先のフォルダーを作る
```shell
mkdir forge
cd forge
```

### Forgeのインストーラーを取得する
ForgeのダウンロードサイトにアクセスしてForgeの直ダウンロードリンクを取得します。

https://files.minecraftforge.net/net/minecraftforge/forge/

必要なバージョンの`Installer`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310502/e4d8ad7a-35cf-7ef9-e0fd-cff070775fb4.png)

右上に出てきたSKIPのボタンを右クリックしてリンクアドレスをコピーする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310502/10537503-2078-cdb4-70af-7c4267a786b8.png)

ダウンロードする
```shell
wget コピーしたURL
```

# インストーラーを起動する
```shell
java -jar forge-1.16.5-36.2.34-installer.jar nogui --installServer
```

いくつかファイルが生成されたのでサーバーファイルを実行します。
```shell
java -Xmx2048M -Xms1024M -jar forge-1.16.5-36.2.34.jar
```
するとEULAに同意してくれと言われるのでeula.txtを編集します。
```shell
vi eula.txt
```
eula=falseになっている箇所をeula=trueに変更します。
```shell
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://account.mojang.com/documents/minecraft_eula).
#Sun Feb 25 07:34:04 JST 2024
eula=true
```
vimから脱出する方法は
esc → :wq
この方法何なん

ちゃんと変更できているか確認してみましょう。
```shell
cat eula.txt
```

もう一度実行します。
```shell
java -Xmx2048M -Xms1024M -jar forge-1.16.5-36.2.34.jar
```
しっかり実行できることが確認できたと思います。

# ポート開放
```shell
sudo ufw status
sudo ufw allow 25565
sudo ufw reload
```
これでポート開放は完了です。
LOD2建築物モデル自動生成ツールの環境構築時に発生したエラー

## はじめに

国土交通省が開発を進めるPLATEAUの「LOD2建築モデル自動生成ツール」の環境構築時にはまったポイントについての備忘録です。使用するツールについては以下を参考にしてください。

## 参考サイト

https://github.com/Project-PLATEAU/Auto-Create-bldg-lod2-tool

https://www.mlit.go.jp/plateau/file/libraries/doc/plateau_tech_doc_0056_ver01.pdf

https://github.com/Project-PLATEAU/Auto-Create-bldg-lod2-tool/blob/main/docs/USER_MANUAL.md

## 仮想環境構築
venvで作成した仮想環境は移動・コピーしたりすることが出来ません。ディレクトリ名が完全に一緒だったら使用できるかもしれません。.pyファイルを実行しようとすると，以下のように実行することが出来ません。

```markdown:コマンドプロンプト
.pyのあるディレクトリ名> python
Python
``` 

私の場合Dropbox上で作成した仮想環境は別のPCでは使用できませんでした。

また，本ツールまでのディレクトリ名に日本語を使っていると文字化けが生じ，ファイル・ディレクトリがありませんよと怒られるので注意してください。

```markdown:コマンドプロンプト
.pyのあるディレクトリ名> python AutoCreateLod2.py param.json
FileNotFoundError: [Errno 2] No such file or directory: 'ディレクトリ名'
```

対策はありそうですが調べておりません。

## ライブラリ
requirements.txtに記述されているライブラリのバージョンでは下記の2つはインストールできませんでした。
* jakteristics==0.5.0
* laspy==2.1.2

私の場合は，以下のバージョンであれば問題ありませんでした。
* jakteristics==0.6.0
* laspy==1.7.0

別のPCで試した場合には，laspy==2.1.2でもインストールできましたが．．．よくわかっていません。

マニュアルにも書いてありますが，Visual Studio 2017か2019のみでの動作が保証されています。私の場合2022環境で実行しようとしましたが，ダメでした．．．2022では必要ライブラリのMultiScaleDeformableAttention（物体検出ライブラリ）がうまくインストールできません。

下記を参考に「Build Tools for Visual Studio 2017」をインストールすれば解決します。

https://qiita.com/white0221/items/b48f1b64dbd810e21702


おわりに
---
マニュアルはちゃんと読もうね．．．
最短攻略！高度情報処理技術者試験 午前編

# 著者バックグラウンド
## 所有資格
応用情報技術者
ネットワークスペシャリスト
データベーススペシャリスト
エンベデッドシステムスペシャリスト
プロジェクトマネージャー
システムアーキテクト
システム監査技術者


# はじめに
情報処理技術者試験の説明は省略


## 情報処理技術者試験において午前対策は重要
### 午前合格率の話
例として高度情報で一番人気のあるプロジェクトマネージャー試験の令和5年度の午前合格率を
受験者数(7888人)
午前Ⅰ不合格者数(2203人)
午前Ⅱ不合格者数(1699人)
→ 午前不合格者数(3902人)

午前不合格者数(3902人) / 受験者数(7888人) ＝ 49.5%
補足：全体での合格率は13.5%

高度情報技術者のプロジェクトマネージャ試験では午後Ⅱ論文に目が行きがちですが、
受験者の半分は午前で脱落しているという結果でした。
極論ですが午前をしっかり押さえておくだけで、50:50の世界に持っていけるとも言えるでしょう。

### 午前の対策のしやすさ
情報処理技術者試験の午前問題は4択の選択問題であり、大体半分くらいは過去問と同じ問が出題される。
午前は100点満点中60点、つまり6割の正解を目指せばいいので、過去問をしっかり押さえておき50点を確保すれば、残りは4択の25%あてずっぽうでも60点を超える計算になる。
実際は4択の内、消去法で3～2択にできる問題が大半なので、安定して70点以上は確保できる。
実際に著者は、本記事に記載の勉強法を行い多くの情報処理試験を受験してきたが、
午前で不合格となったことはない。
すべて覚えているわけではないが、70点を切った記憶もないく平均で80点程度は確保できている。

# 勉強法
## 結論
午前問題の対策は過去６回分の過去問を暗記することです。

## ポイント
暗記時の注意事項として、最初からアイウエの４択を覚えようとするのではなく、「わからない問題については解説を見る。なぜほかの選択肢が×なのかも確認する。理解できなかったら自分で少し調べてみる。」ということを行ってください。
これには、以下の効果があると考えています。
- 解説を読んだ、自分で調べた、ことでエピソード記憶として試験当日まで保持しやすくする
- 選択肢に関する知識をつけることで消去法の精度を高める
- たまにある選択肢シャッフルへの対策

## 具体的なやりかた
1. 解説を見ながら6回分を一度通して学習
先述したとおりアイウエの４択を覚えようとするのではなく、「わからない問題については解説を見る。なぜほかの選択肢が×なのかも確認する。理解できなかったら自分で少し調べてみる。」を意識しながら知識として蓄えてください。
なお、計算問題などの時間がかかる問題は、解き方のイメージが出来たら答えを見てしまってもよいかと思います。

2. 過去6回分を暗記する
ここからは多少作業感が出てきますが、6回分の過去問を繰り返し解くことで、完璧に仕上げてください。
そのまま解説サイトを繰り返し解いてもよいのですが、著者は
IPAの過去問サイトから問題を紙で印刷して、問題の右に「自信をもって答えれたら〇、２択３択に絞って正解だった場合は△、間違えたら×」をメモしていき、全問題３連続で〇がつくまで繰り返す。
という方法で行っています。
繰り返し解いていく中で徐々に解く問題数が減っていくので効率的に学習できる点と、苦手意識のある問題（△や×の割合が多い）については、付箋を貼っておくことで、試験直前の見直しに活用できる点が気に入っています。


## 対策サイト
### 応用情報技術者/高度情報午前Ⅰ
高度午前Ⅰはその回の応用情報の午前問題から３０問を抜き出して作られるので、応用情報午前問題と問題範囲は全く同じになります。
なので、解説のついている応用情報の過去問対策サイトで6回分以上の過去問に対して対策をしておけば問題ないでしょう。

・応用情報過去問道場
https://www.ap-siken.com/apkakomon.php

## 高度情報午前Ⅱ
高度情報午前Ⅱ試験はそれぞれの専門分野に関連する問題が多く出題される点と、応用情報で出題されない問題も出題される点が特徴です。
なので、その分野の午前Ⅱの過去問を学習する形になるのですが、解説付きのサイトが現状少ないのが難点です。著者が知っている中だと、全区分の午前Ⅱの過去問解説がそろっているのは下記サイトくらいでしょうか。

情報処理技術者試験の勉強(過去問題)をやり直し
https://itsiken.com/index.html
【ChatGPT有＋DALL-E3】他で、ほかの方とのラリーを楽しむ。


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

　今回は、ほかの方とのラリーを楽しむためのテクニック、というよりは助言・ヒントをお送りしたいと思います。DALL-E3に関わらず、ほかの画像生成でも同じですね。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3だけに留まりません。
どの画像生成AIでもヒントにな
るかと思います。　あしからず。
:::

　おととい（2024/02/23）の記事は
　　なんか、方向性が途中で
　　　変わってしまいました。
[【ChatGPT有＋DALL-E3】で出力された画像を解釈するのは、結局人間。](https://qiita.com/kabumira/items/9bb2fa1d602f9bffa3a7)

　戻してみたいと思います(汗)

　ほかの方との
　　画像によるラリーは
　　　楽しい、と書きましたね。

　もちろん、
　　相手がいなければ、
　　　ラリーにはなりません。
　　　　それは誰でも
　　　　　わかることでしょう。

　そういう意味では
　　X-TwitterやBlue Skyは
　　　いい場所ですね。

　ちなみに、
　　Blue Skyにもアカウントを
　　　持っています。よろしくです。
　　　　活動ははじめたばかり
　　　　　なのですが(汗)
***
　それはともかく、
　　本題に入ります。

　まずは、
　　ラリー相手を
　　　探します。

　と言うか、
　　見つけてもらう、
　　　という感じかな？

　作品をポストしていると
　　うれしい感想をもらえます。
　　　いいね、ではなく。

　その方が
　　あなたと同じような作品を
　　　ポストしているかを
　　　　チェックしましょう。

　X-TwitterやBlue Skyだと
　　人のプロフィールと
　　　これまての発言や作品を
　　　　見ることができます。

　いろんな画像を
　　ポストしている人ならば、
　　　柔軟な思考をしている場合が
　　　　多い気がします。

　とりあえずは、
　　言葉でのやり取りを
　　　しましょう。

　意見を求めるとか
　　とにかくやり取りします。

　同じ画像生成AIを
　　使っているなら
　　　その話題でOKでしょう。

　最初から
　　長文は、相手が困ります。
　　　ほどほどの長さで、
　　　　会話を続けましょう。

　言葉のラリーが
　　ある程度、進んだら、
　　　それまでの話から、
　　　　得られた情報を使って、
　　　　　試しに画像をアップします。

　それで
　　相手の反応を
　　　チェックします。

　人によっては
　　ラリーに興味を示さない方も
　　　いらっしゃいます。
　　　　それでも入り口にはなります。

　その方を通じて、
　　その方の知り合いから
　　　ラリー相手を
　　　　探すのです。

　探してばかりも
　　いけません。

　名刺代わりと思って
　　作品をポストしていきましょう。
　　　名刺をばらまくのは
　　　　NGですがw

　あと、
　　たまに
　　　というか、頻繁に
　　　　フォロワーさんの数が
　　　　　キリの良い数になると
　　　　　　テーマを決めて
　　　　　　　画像を募集する方が
　　　　　　　　いらっしゃいます。

　それに
　　参加するのも
　　　ひとつの手です。
***
　そんなこんなで
　　ラリー相手が見つかったら
　　　唐突にはじめるのも手ですが、
　　　　初めての場合は
　　　　　ラリーを申し込むのが
　　　　　　妥当でしょうね。

　それで
　　ラリーが開始されたら
　　　相手の手に、こちらの手を
　　　　見せる、それの繰り返しです。

　ここで、ラリーを
　　楽しむ際の
　　　注意点を書きましょう。

　画風は基本、
　　相手と近い感じで
　　　行なうと、その世界観に
　　　　没入できます。

　ですが、
　　それは最初だけで
　　　OKです。

　あんまり固執すると
　　何度も生成するハメになります。
　　　そして、制限になって
　　　　生成できなくなる。

　それに、適度に
　　ポンポン出さないと
　　　相手に飽きられます。

　そのためには、
　　妥協が必要です。

　また、
　　生成される画像を
　　　許容する余裕もなければ
　　　　なりませんね。

　そこから
　　思ってもみなかった
　　　ストーリー展開が
　　　　生まれますから。

　ちなみに、
　　画像だけだと
　　　味気ない（意味がわからない）
　　　　ことも多いので、セリフを
　　　　　入れておきましょう。

　小説やマンガなんかを
　　書いている方なら
　　　すんなりと対応できるはずです。

　そうでない方は
　　まずは、言葉のやり取りを
　　　優先しましょう。

　ラリーは
　　ストーリー性が
　　　必要ですしね。
***
　こんなことが
　　みなさんの
　　　作品制作の糧に
　　　　なれば、幸いです。

　今回は、ここまで。
【Tableau】テキスト表 - 単一項目表示

## はじめに
tableauでExcelみたいな表形式にしたい場合、どうやるのだろう？と思いやってみたメモ的内容です。

## やりたいこと
年月日ごとの売上をExcelの表っぽく表示させたい！

#### 例1）日付ごとのデータをテキスト表にしたい（縦表示）

■ 作成したいイメージ
![33.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/3aeb999e-4d62-a865-ea9f-02847d37f554.png)

■ 作成結果
> STEP
> 1.　左のテーブルから出荷日を「行」にドラッグアンドドロップする。
> 2.　左のテーブルから売上を「テキスト」にドラッグアンドドロップする。
![21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/bce0b039-88c3-8b19-5201-a61efcc1c306.png)

> **※補足**
> 出荷日が日付型のため、自動でドリルダウン機能が付きます。
> （年 ＞ 四半期 ＞ 月 ＞ 日）
![23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/f213f5af-7434-17a3-a042-ec25f83734bb.png)



#### 例2）日付ごとのデータをテキスト表にしたい（横表示）

■ 作成したいイメージ
![34.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/3328f2ca-3870-312a-f37e-86fc0583cd34.png)


■ 作成結果
> STEP
> 1.　左のテーブルから出荷日を「列」にドラッグアンドドロップする。
> 2.　左のテーブルから売上を「テキスト」にドラッグアンドドロップする。
![22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/fc287afe-7b2d-8210-bf40-0d4f5e689078.png)

> **※補足**
> 出荷日が日付型のため、自動でドリルダウン機能が付きます。
> （年 ＞ 四半期 ＞ 月 ＞ 日）
![24.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693459/4303292a-0f3b-6c4c-e067-7989b5f007c9.png)

### あとがき
ラベルが表示されていない、表記を変えたいなどあるが、追々。
Pandasの分析前のデータ確認



## はじめに
Pandasの分析前のデータ確認に関しての備忘録です。
初心者です😅
もし間違いがあれば、ご指摘いただけると助かります🙇
<br>
## 🦁<INS>**結論**</INS>🦁
Pandasを使ったデータ分析をする前に行うべきこと
「データの概要確認」
「カラム名の確認（取得）」
「データ型の確認（取得）」

この操作を理解する必要がある。

:::note info
押さえておくべき点
* Pandasでの分析する前に正しいデータなのかを確認することは重要。
:::  
***

:::note alert
注意点
*  .describe()では基本は整数値の列の情報を取得できる。
*  .describe()文字列の情報はinclude='all'を加える必要がある。
:::  

***

## <INS>**Pandas 分析前の関数一覧**</INS>

## <INS>**.head()**</INS>
データフレームの最初の数行を表示させる。
デフォルトは5行。
```py
print(df.head(2))  # 最初の2行を表示
```
***  

## <INS>**.tail()**</INS>
データフレームの最後の数行を表示させる。
デフォルトは5行。
```py
print(df.tail(2))  # 最後の2行を表示
```
***  

## <INS>**数値データ .describe()**</INS>
### 数値列のデータから8つ統計データに当てはまるセル（値）を得ることができる。
* count: 非欠損値の数
* mean: 平均値
* std: 標準偏差
* min: 最小値
* 25%: 第一四分位数（25パーセンタイル）
* 50%: 中央値（メディアン、50パーセンタイル）
* 75%: 第三四分位数（75パーセンタイル）
* max: 最大値

### 非数値列のデータから4つ統計データに当てはまるセル（値）を得ることができる。
* count: 非欠損値の数
* unique: ユニークな値の数
* top: 最頻値（データ中で最も多く出現する値）
* freq: 最頻値の出現頻度


```py
# サンプルデータフレームの作成
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35],
        'City': ['New York', 'Paris', 'London']}
df = pd.DataFrame(data)

# 全ての列取得
print(df.describe(include='all'))

         Name   Age      City
count       3   3.0         3
unique      3   NaN         3
top     Alice   NaN  New York
freq        1   NaN         1
mean      NaN  30.0       NaN
std       NaN   5.0       NaN
min       NaN  25.0       NaN
25%       NaN  27.5       NaN
50%       NaN  30.0       NaN
75%       NaN  32.5       NaN
max       NaN  35.0       NaN
```
***  

## <INS>**.keys()**</INS>
データフレームのカラム名を取得。
```py
print(df.keys())
```
***  

## <INS>**.dtypes**</INS>
 各列のデータ型を表示。
```py
# データ型の確認
print(df.dtypes)
```
***  

## <INS>**.astype()**</INS>
列のデータ型を変換をする。例えば、文字列を整数型に変換する場合などに使用します。
```py
# 'Age'列をfloat型に変換
df['Age'] = df['Age'].astype(float)
```
***  

## まとめ😺
事前準備は重要だなと再認識。
データがあってるかあってないか？それが漏れただけで、やり直しは時間の無駄になる。
nodeのバージョンアップ

Xサーバーでnodeのバージョンアップが必要だったので
備忘録としてやり方や知識をメモしておきます。

## 現在のver.は??
```
node -v
```
で確認できます。
```
#実行結果
v8.9.4
```

## 使えるバージョンの確認
こちらのコマンドで確認できます。
```
nodebrew ls-remote
```
このような感じでバージョンのリストが表示されます。
```
v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6    

v0.1.0    v0.1.1    v0.1.2    v0.1.3    v0.1.4    v0.1.5    v0.1.6    v0.1.7
v0.1.8    v0.1.9    v0.1.10   v0.1.11   v0.1.12   v0.1.13   v0.1.14   v0.1.15
v0.1.16   v0.1.17   v0.1.18   v0.1.19   v0.1.20   v0.1.21   v0.1.22   v0.1.23
v0.1.24   v0.1.25   v0.1.26   v0.1.27   v0.1.28   v0.1.29   v0.1.30   v0.1.31
v0.1.32   v0.1.33   v0.1.90   v0.1.91   v0.1.92   v0.1.93   v0.1.94   v0.1.95
v0.1.96   v0.1.97   v0.1.98   v0.1.99   v0.1.100  v0.1.101  v0.1.102  v0.1.103
v0.1.104  


////省略////


io@v1.0.0 io@v1.0.1 io@v1.0.2 io@v1.0.3 io@v1.0.4 io@v1.1.0 io@v1.2.0 io@v1.3.0
io@v1.4.1 io@v1.4.2 io@v1.4.3 io@v1.5.0 io@v1.5.1 io@v1.6.0 io@v1.6.1 io@v1.6.2
io@v1.6.3 io@v1.6.4 io@v1.7.1 io@v1.8.1 io@v1.8.2 io@v1.8.3 io@v1.8.4 

io@v2.0.0 io@v2.0.1 io@v2.0.2 io@v2.1.0 io@v2.2.0 io@v2.2.1 io@v2.3.0 io@v2.3.1
io@v2.3.2 io@v2.3.3 io@v2.3.4 io@v2.4.0 io@v2.5.0 

io@v3.0.0 io@v3.1.0 io@v3.2.0 io@v3.3.0 io@v3.3.1 
```

## バージョンを指定してインストール
下記のコマンドで、バージョンを指定してインストールします。
バージョンは、先ほどのバージョン確認のコマンドで出てきたものから選びます。
```
nodebrew install-binary (バージョン)
```
```
# (例)
# nodebrew install-binary v18.14.0
```

## インストール済みのバージョン確認
このコマンドで確認できます。
```
nodebrew ls
```
実行結果
```
v8.9.4
v16.20.2
v18.1.0
v18.3.0
v18.14.0

current: v18.14.0
```
ちなみに、current:の後に書かれているのが現在のバージョンです。


## バージョンの切り替え
先ほどのnodebrew lsで表示されたバージョンの中から切り替えできます。
(表示されてない=インストールされてないものは使用で来ません)

```
nodebrew use v16.20.2
```
pythonでJSONを扱う方法

# 目的
　python初心者です。
　webAPIで取得したJSON形式データをpythonで取り扱いたいと思いました。</br>
   JSONとは、｛｝などを用いた記法であり、そのままでは`文字列`型であることから、
`dict`型などpythonオブジェクトに変換して取り扱う必要があります。</br>
 エンコードとデコードの意味もよくわかっていなかったので調査しました。</br>
https://docs.python.org/ja/3/library/json.html

# JSONライブラリ
　最初にimportします。

```python
import json
```

# エンコード方法（pythonオブジェクトをJSON形式に変換）
　pythonオブジェクトをJSON形式に変換するするために`.dumps`メソッドを使用します。</br>
　変換されたJSON形式のデータ型は`str`型です。</br>
　よく似た名前のメソッドに`dump`がありますが、これはデータをJSON形式にエンコードしてファイル保存するメソッドですので、間違えないようします。</br>
    `dumps`の`s`が`str`型の`s`かどうかはわかりませんが、`s付き`はstr変換、`sなし`はファイル変換と覚えるようにしています。

```python:dumpsSample.py
js = json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':'))
'[1,2,3,{"4":5,"6":7}]'
print(type(js))
print(js)
```
結果
```python
<class 'str'>
[1,2,3,{"4":5,"6":7}]
```

# デコード方法（JSON形式からpythonオブジェクトに変換）
　JSONをデータ形式に変換するために`.loads`メソッドを使用します。</br>
　例えば、変換されたリスト形式のデータ型は`list`型です。</br>
   `.dumps`と同様に`.loads`と`load`がありますので、注意します。

```python:loadsSample.py
js = json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
print(type(js))
print(js)
```
結果
```
<class 'list'>
['foo', {'bar': ['baz', None, 1.0, 2]}]
```

# 変換表(エンコード)
|PYTHON|JSON|
|---|---|
|dict|object|
|list, tuple|array|
|str|string|
|int、float と int や float の派生列挙型|number|
|True|true|
|False|false|
|None|null|

# dumpとdumps（書き込み）
**dump:**　`obj` を JSON 形式に変換して`fp` (ファイルオブジェクト) へ流し込みます。
```python
json.dump(obj, fp, *)
```
**dumps:**　`obj`を JSON 形式の `str` オブジェクトに変換します。
```python
json.dumps(obj, *)
```

# loadとloads(読み取り)
**load:**　JSON形式の`fp` (ファイルオブジェクト) を読み取り、pythonオブジェクトに変換します。
```python
json.load(fp, *)
```
**loads:**　JSON形式の` str`型インスタンスをpythonオブジェクトに変換します。
```python
json.loads(s, *)
```

# 結論
　JSON形式のデータファイルを`.load`メソッドでpythonオブジェクトに変換する。</br>
　データインスタンスであれば、`.loads`メソッドでpythonオブジェクトに変換する。</br>
　**⇒`dict`型、`list`型としてpythonで取り扱うことができました。**
【プラクティス紹介】1分でさらっと分かる「Fun Done Learn」

![FDL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526800/8cf1cc3c-a6cd-c829-8250-4f20f19c5a17.jpeg)


## プラクティス名（別名）
Fun Done Learn （FDL、ファンダンラーン）

## プラクティスの目的・狙い
* チームの活動や目標、そこから得られた学びをふりかえる
* 「楽しさ」に注目することでチームからポジティブな意識を引き出す

## どんな時に使うか
* レトロスペクティブがいつも暗い雰囲気（反省会）になってしまう時
* やったこと（事実）に終始してしまい、それに対するメンバーの感情が見えない時

## 実施手順
1. ボード上にFun/Done/Learnの３つの円を重なりあうように描く
1. 各自、出来事や感想等を付箋に書き出し、各エリアに貼っていく
1. 全員でボードを眺めながら、話し合い、気づきを共有する

| エリア | 意味 |
|:--|:--|
| Fun  | 楽しかったこと、面白かったこと、興味深かったこと  |
| Done（Deliver）  | 達成できたこと、意識的に行ったこと  |
| Learn  | 学んだこと、気づいたこと、印象に残ったこと  |
| 欄外  | 上記以外のこと（円の外側もエリアの１つです）  |

話し合いの観点（例）：
* どんな傾向があるか？ それは何を意味しているか？
* どうしたらFunをもっと増やせるか？
* 価値の高いDoneがはどれだったか？
* 何をしたらLearnにつながるか？

## アレンジ例
* 付箋を書いた人が内容を説明し、別の人が付箋を適切なエリアに分類する
* 貼られた付箋の中で共感できるものにドット投票する

## アンチパターン
* Fun/Done/Learnの意味を厳密に定義しすぎる（＝自由度が狭まり、発想を妨げる）
* 欄外の付箋を無駄な作業だったと決めつける

## 参考情報
本手法の考案者、安井力さんの記事。原典はこちら。

https://qiita.com/yattom/items/90ac533d993d3a2d2d0f

「ふりかえり」と言えばこの方、森一樹さんによる実践レポート

https://qiita.com/viva_tweet_x/items/7e279f41f4388d9162ef

参考書籍（FDLについて4ページほど解説が載っています）

https://www.shoeisha.co.jp/book/detail/9784798168791

## こぼれ話（私的コメント）
FDLは2018年の[Scrum Coaches Retreat in Okinawa](https://www.scrumalliance.org/events/coaching)というイベントの中でTeam Almost Doneの皆様と開発した手法とのことで、日本発祥のプラクティスです。これまでもKPTやYWTなどいくつかの観点を軸にふりかえりを行う手法はたくさんありましたが、「FUN」という感情面に着目している点が本手法の特色です。やってみると自然とチームの意識が「もっと楽しくやるには？」「学びにつなげるには？」とポジティブな方向に向かいます。良い意味でチーム全体の雰囲気をふわっと掴めるのですが、反面、特定の問題点を掘り下げたり、具体的な改善アクションにつなげるには向かないので、そこは別の手法を組み合わせる必要があります。レトロがいつもお通夜になってしまう時はFDLを試してみると良いかもしれません。

---
　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
【Ruby】sampleメソッドについて

## はじめに
Rubyのsampleメソッドについてまとめました。

## sampleメソッドとは
- 対象となる配列から無作為に要素を取得し、戻り値として返します。
引数なしだと1つ、引数有（数値）だと指定した数だけ要素を取得します。
- 引数を指定して要素を取得した場合、取得元の要素が重複していなければ、取得した要素が重複することはありません。
- インスタンスメソッドです。newしたオブジェクトに対して実行します。

## 使い方
```ruby:Ruby
a = (1..10).to_a
p a.sample        #=>  9
p a.sample        #=> 10 ランダムに値を取得するため、前回の実行と結果が異なる
p a.sample(3)     #=> [1, 9, 3] 
p a               #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

引数にはrandomオブジェクトを指定することもできます。

```ruby:Ruby
a.sample(Rand(2..4)) #=> [4, 7] 
```

## 利用パターン
無作為に要素を取得するので、ランダムに値を取得したい場合などに利用できます。

## 最後に
間違いなどあればコメントでご指摘いただけるとありがたいです！

## 参考文献
https://docs.ruby-lang.org/ja/latest/method/Array/i/sample.html
【Ruby】optparseの使い方について

## はじめに
Rubyのプログラムを作成する中でoptperseを用いたため、使い方をまとめました。

## optparseとは？
> コマンドラインのオプションを取り扱うためのライブラリです。

## 使い方
以下のコードのように使用します。

```ruby:Ruby
# optparseのライブラリ読み込み
require 'optparse'
# オブジェクトの作成
opt = OptionParser.new

# オプションの登録
opt.on('-a') {|v| p v } #引数なし
opt.on('-b VAL') {|v| p v } #引数あり（必須）
opt.on('-c [VAL]') {|v| p v } #引数あり（任意）

#入力コマンドの解析
opt.parse!(ARGV)
p ARGV
```
- Rubyの初期状態ではオプションは利用できないため、
    コマンドラインでオプションを利用するためのライブラリを読み込みます。
- `on`メソッドを使用することで、任意のオプションを登録できます。
ブロックの中身は引数が渡されたときの処理を記述します。
- `parse`メソッドで入力されたコマンドを解析します。

## 最後に
ロングオプション（`--`）なども登録できますが、勉強中のためここでは割愛します。
間違いなどあればコメントでご指摘いただけるとありがたいです！

## 参考文献
https://docs.ruby-lang.org/ja/latest/library/optparse.html
Julia マクロサンプル 備忘録

### @show
```julia
@show(pi, sqrt(2))
# 結果
pi = π
sqrt(2) = 1.4142135623730951

@show  pi, sqrt(2) 
# 結果
(pi, sqrt(2)) = (π, 1.4142135623730951)
```

### @match
C言語でのswtich-case文相当
```julia
# import Pkg; Pkg.add("Match")
using Match
f(x) = @match x begin
  1 => 1
  2 || 3 => 2
  4:6 => 3
  7:10 || 12 || 14:20 => 4
  n where {n in 21:30} => 5  # {}で囲まなくてもOK
  n where 31 < n < 40 => 6
  n, if n < 100 end => -n  # whereの別表現
  n => n
  _ => 999
end

# 結果
f(1) = 1
f(3) = 2
f(5) = 3
f(5.5) = -5.5
f(8) = 4
f(11) = -11
f(12) = 4
f(21) = 5
f(35) = 6
f(90) = -90
f(200) = 200
```

```julia
using Match
x, y, z = 2, 9, 3
@match true begin
  _ where {x>=y && x>=z} => println("x=", x)
  _ where {y>=z} => println("y=", y)
  _ => println("z=", z)
end
# 結果
y=9  
```

### OffsetArray
配列の開始indexを1以外に出来る
```julia
# import Pkg; Pkg.add("OffsetArrays")
using OffsetArrays
a = [1, 2, 3, 4, 5]
a = OffsetArray(a, 0:length(a)-1) #開始インデックスを0に変更
for i in 0:length(a)-1
  print("a[$i] = ", a[i], "  ")
end
# 結果
a[0] = 1  a[1] = 2  a[2] = 3  a[3] = 4  a[4] = 5
```

```julia
using OffsetArrays
b = OffsetArray([11 12 13 14; 21 22 23 24; 31 32 33 34], 0:2, 0:3)
for i in axes(b,1), j in axes(b,2)
  println("b[$i, $j] = " , b[i, j])
end
# 結果
b[0, 0] = 11  
b[0, 1] = 12  
b[0, 2] = 13
b[0, 3] = 14
b[1, 0] = 21
b[1, 1] = 22
b[1, 2] = 23
b[1, 3] = 24
b[2, 0] = 31
b[2, 1] = 32
b[2, 2] = 33
b[2, 3] = 34
```

### @enum
```julia
@enum Fruit begin
  apple
  orange
  banana
end
x = instances(Fruit)
@show x
@show Int.(x)
@show string.(x)
# 結果
x = (apple, orange, banana)
Int.(x) = (0, 1, 2)
string.(x) = ("apple", "orange", "banana")
```

### for(多重Loop)
```julia
for i in 0:3, j in 1:2
    @show i, j
end
# 結果
(i, j) = (0, 1)
(i, j) = (0, 2)
(i, j) = (1, 1)
(i, j) = (1, 2)
(i, j) = (2, 1)
(i, j) = (2, 2)
(i, j) = (3, 1)
(i, j) = (3, 2)
```

### kron配列の拡大など
```julia
matrix = [0 1;2 3]
kron(matrix, ones(3,3))

# 結果
6×6 Matrix{Float64}:
 0.0  0.0  0.0  1.0  1.0  1.0
 0.0  0.0  0.0  1.0  1.0  1.0
 0.0  0.0  0.0  1.0  1.0  1.0
 2.0  2.0  2.0  3.0  3.0  3.0
 2.0  2.0  2.0  3.0  3.0  3.0
 2.0  2.0  2.0  3.0  3.0  3.0
```

### パイプラインいろいろ
https://zenn.dev/kota19ms/articles/d8bb7a2f01c36e

### 今後も追加予定です
もしおすすめのマクロがあったらコメント欄で紹介ください。
llm-jp-13b-instruct-full-dolly_en-dolly_ja-ichikara_003_001-oasst_en-oasst_ja-v1.1はパソコンのキーボードを知っているのか

[2023年12月22日の記事](https://qiita.com/KoichiYasuoka/items/553038ec96e49a0b6663)を横目で見ながら、[llm-jp-13b-instruct-full-dolly_en-dolly_ja-ichikara_003_001-oasst_en-oasst_ja-v1.1](https://huggingface.co/llm-jp/llm-jp-13b-instruct-full-dolly_en-dolly_ja-ichikara_003_001-oasst_en-oasst_ja-v1.1)に「パソコンのキーボードは，なぜABC順・五十音順ではないのですか」と尋ねてみることにした。プログラムはこんな感じ。

```
#! /usr/bin/python3
from transformers import pipeline
tgn=pipeline("text-generation","llm-jp/llm-jp-13b-instruct-full-dolly_en-dolly_ja-ichikara_003_001-oasst_en-oasst_ja-v1.1",max_new_tokens=512)
nlp=lambda txt:tgn(f"以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n\n### 指示:\n{txt}\n\n### 応答:\n")[0]["generated_text"]
print(nlp("パソコンのキーボードは，なぜABC順・五十音順ではないのですか"))
```

実行してみたところ、私(安岡孝一)の手元では以下の結果が出力された。

> 以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。
>
> \#\#\# 指示:
> パソコンのキーボードは，なぜABC順・五十音順ではないのですか
>
> \#\#\# 応答:
> パソコンのキーボードは、アルファベット順や五十音順ではなく、一般的には「かな」で表記されています。
>
> 「かな」とは、日本語のローマ字表記のことで、「あ」行から「ん」行までの10行のローマ字を使って日本語を表記する方法です。
>
> ローマ字は、英語圏の人々が日本語を理解するために作られたもので、日本語の発音をローマ字で表しています。
>
> ローマ字を使って日本語を入力するには、まずキーボードの「あ」行のキーを探します。
>
> 次に、ローマ字の「a」のキーを探します。
>
> ローマ字の「a」のキーを探したら、そのキーを押して、ローマ字の「あ」を入力します。
>
> ローマ字の「あ」を入力したら、キーボードの「い」行のキーを探します。
>
> 次に、ローマ字の「i」のキーを探します。
>
> ローマ字の「i」のキーを探したら、そのキーを押して、ローマ字の「い」を入力します。
>
> ローマ字の「い」を入力したら、キーボードの「う」行のキーを探します。
>
> 次に、ローマ字の「u」のキーを探します。
>
> ローマ字の「u」のキーを探したら、そのキーを押して、ローマ字の「う」を入力します。
>
> ローマ字の「う」を入力したら、キーボードの「え」行のキーを探します。
>
> 次に、ローマ字の「e」のキーを探します。
>
> ローマ字の「e」のキーを探したら、そのキーを押して、ローマ字の「え」を入力します。
>
> ローマ字の「え」を入力したら、キーボードの「お」行のキーを探します。
>
> 次に、ローマ字の「o」のキーを探します。
>
> ローマ字の「o」のキーを探したら、そのキーを押して、ローマ字の「お」を入力します。
>
> ローマ字の「お」を入力したら、キーボードの「か」行のキーを探します。
>
> 次に、ローマ字の「k」のキーを探します。
>
> ローマ字の「k」のキーを探したら、そのキーを押して、ローマ字の「か」を入力します

うーん、GPT-2の13Bモデルだと60GBはメモリが要るのだけど、それでも、この程度なのかなぁ。
VS-Codeでデバッグ開始が機能しない

# 【環境】
OS: Windows11 Pro(23H2)
Python 3.12.2 64bit
Visual Studio Code 1.86.2
Python Debugger V2024.0.0

# 【症状】
* VS-Codeでデバッグ開始が機能しない
* デバッグ無しで実行は機能する

# 【対処方法】
Pythonのバージョンをダウングレードする
   Python 3.12.2 64bit ⇒ Python 3.10.7 64bit
【Next.js】SSRでAxiosを使ってapi実行するとエラーになる

## はじめに

この記事では、開発中に遭遇した `AxiosError: connect ECONNREFUSED 127.0.0.1:80` というエラーの解決過程について説明します。
このエラーは通常、指定されたアドレスとポートに接続できない場合に発生するっぽいです。
特に、Next.js アプリケーションで SSR(Server Side Rendering) を使用しているときに、APIサーバへの接続に関連するエラーです。

## エラー内容

エラーメッセージは以下の通りです：

```
AxiosError: connect ECONNREFUSED 127.0.0.1:80
    at AxiosError.from ...
    at RedirectableRequest.handleRequestError ...
    ...
```

このエラーは、アプリケーションが `127.0.0.1` アドレスの `80` ポートに接続しようとしたときに接続が拒否されたことを示しています。通常、このエラーは指定されたサーバが存在しないか、または起動していない場合に発生します。

## 試したこと(現状)

- まず、開発環境でAPIサーバが正しく動作していることを確認しました。
- axios の代わりに fetch を使用しても似たようなのエラーが発生しました。
- クライアントサイドからのapi実行は問題なく動作しておりました。

## 原因

原因は、開発環境で Docker を使用していて、API サーバが実際には `nginx` コンテナ内で動作していたため、`127.0.0.1` ではなく `nginx` というコンテナの名前で接続する必要がありました。
アプリケーションの設定では、API サーバのアドレスが `http://localhost:80/api` と設定されていました。

※自分がコンテナ内にいて、そのポートがホストされていない(それを扱うイメージを構築していない限り)のが原因らしい。
したがって、その場合はコンテナ名を使用して、ポートがホストされているリモートホストにアクセスする必要がありだそうです。

- 参考

https://www.reddit.com/r/nextjs/comments/uqy0rc/help_ssr_econnrefused/?rdt=39430




## 解決策
- axiosの場合は下記のように実行する必要がありました。
    - nginxの部分はDockerのapi用に使用しているコンテナの名前が入る感じです。

```php
axios.get('http://nginx:80/api');
```

## 結果

これにより、開発環境での `AxiosError: connect ECONNREFUSED 127.0.0.1:80` エラーは解消しました。

## 終わりに
どうやらこの問題はNode.jsのバージョン17から発生しているみたい？？
かなりハマってしまいました、、、。
2つの素数の和で表される数（ゴールドバッハの予想を仮定して）

### 【例題 １】 N以下の正の整数で2つの素数の和で表される数の個数を求めよ

まず例として$N=20$のとき素数の数を数えると8個あります。

```python 
import sympy as sp
N = 20
primes = list(sp.primerange(N+1))
print(len(primes), primes)
# 8 [2, 3, 5, 7, 11, 13, 17, 19]
```

この中から重複を許して2個足し合わせてできる数を求めます。

```python 
from itertools import combinations_with_replacement as combr
pp = set([sum(ps) for ps in combr(primes,2) if sum(ps) <= N ])
print(f"p2 = {pp}")
#p2 = {4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 20}
```
これだけだと分かりづらいので奇数と偶数に分けます。

```python 
even, odd = set(list(range(2,N+1,2))), set(list(range(1,N+1,2)))
print(f"  even : {sorted(list(pp&even))}")
print(f"  odd  : {sorted(list(pp&odd))}")
#  even : [4, 6, 8, 10, 12, 14, 16, 18, 20]
#  odd  : [5, 7, 9, 13, 15, 19]
```

これをよく見ると以下のことが分かります。

1. $4$以上の偶数はすべて含まれている
1. 奇数はもとの素数に$2$を足したものが含まれている

　1.は[ゴールドバッハの予想 (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%89%E3%83%90%E3%83%83%E3%83%8F%E3%81%AE%E4%BA%88%E6%83%B3)が正しければいつも真となります。

 > すべての 2 よりも大きな偶数は2つの素数の和として表すことができる。このとき、2つの素数は同じであってもよい。

  2.は奇数になるのは元の素数のうち$2$以外の奇素数と$2$を足した場合だけなので、その数は元の8個から$2$と$2$を足して$20$を超える$19$を除いて$8-2=6$となるわけです。

  元の$N$以下の素数の数はすべてリストしなくてもsympyのprimepiを使うと求められるので。例題 １の答えは以下のコードで求められます。

```python 
import sympy as sp
np1 = sp.primepi(N)            # number of primes [1,n]
np2 = N // 2 - 1 + (np1 - 1)   # Even (>=4) + Odd (>=5)
if N > 2 and (sp.isprime(N) or sp.isprime(N-1)): np2 -= 1  # +2 makes out of range
print(f"np2 = {np2}")
# np2 = 15
```
### 【例題 ２】 N以下の正の整数で3つの素数の和で表される数の個数を求めよ

上のプログラムのcombrの第二引数を３にすれば良いので。

```python 
pp = set([sum(ps) for ps in combr(primes,3) if sum(ps) <= N ])
allN = set(list(range(1,N+1)))
print(f"p3 = {pp}")
print(f"  not in p3  : {sorted(list(allN-pp))}")
# p3 = {6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
#  not in p3  : [1, 2, 3, 4, 5]
```

こうなると含まれない数の方が少ないので見てみると$[1,2,3,4,5]$となります。これは２つの素数の和で「４以上の偶数」はすべて含まれていたので、これに$2$を足すと「６以上の偶数」、$3$を足すと「７以上の奇数」はすべて含まれることからも導かれます。したがって例題 ２の答えは以下の簡単なコードで求められます。

```python 
p3 = max(n - 5, 0) 
```
この考え方はProject Euler Problem 543 Prime-Sum Numbersを解くのに役に立ちます。

（開発環境：Google Colab）
Jetpack ComposeでBottomSheet実装時に気を付けたいこと

# 初めに
今回はJetpack ComposeでBottomSheetを実装するときに自分が詰まった部分を解説していこうと思います
### 本文
まず、自分が詰まったところというのはバック制御の部分です。
端末純正のバックボタンを押下されたときの挙動を制御したところ通常のComposableでは`BackHandler`を使えばいいのですが、それが機能しませんでした。
そこで詳しく調べてみたところ、Material3の`ModalBottomSheet`では現在バグでバック制御ができない状態になっており、最新のものをつかっても下記のようにすることでバック機能自体をなくすことしかできない状態にあります。
```kotlin
ModalBottomSheet(
  ...
  properties = ModalBottomSheetDefaults.properties(shouldDismissOnBackPress = /* ここにBool値を渡す */),
  ...
)
```
そのため、現在ではAndroid純正のバックボタンを無視するかどうかの制御しかできない状態にあります。
### さいごに
バグとして把握はされているみたいなので今後のリリースで修正される可能性はあると思いますが、直近では使えないのでどなたかのお役に立てれば幸いです