OmniAICreator/Qiita-1.07M huggingface dataset:
[v9]firebase authenticationのComponent auth has not been registered yetについて

# アプリ構成
https://zenn.dev/sprout2000/articles/5d7b350c2e85bc

要所要所違うが、大体上記の記事を参考にして作成した環境です
具体的には`electron + react + webpack + firebase`と言う構成になっています
結構特殊な構成で、4時間ぐらい調べてようやく解決に至ったのでメモ

# 結論
https://github.com/firebase/firebase-js-sdk/issues/6704

上のissueを参考に解決に至った。結論を言うとfirebase v9からでは色々な環境検出し、それに対して違うSDKを提供するようになった（らしい）。ところで、electron自体が特殊なもので、main環境がnodeで、rendererがweb。

そのせいでwebpackで両者をまとめようとするとき何らかの原因でrenderer側にnode環境のfirebaseがbundleされてしまうことになった。そのため明示的にrendererを梱包する時にweb環境のfirebaseを適用することを指定しなければならない。

```js:webpack.config.js
  ...

  // renderer該当箇所のresolveにaliasを指定
  // 強制的にweb環境のfirebaseをbundleするようにする
  resolve: {
    extensions: [".js", ".ts", ".jsx", ".tsx", ".json"],
    alias: {
      "@firebase/auth": path.resolve(
        __dirname,
        "node_modules/@firebase/auth/dist/esm2017/index.js",
      ),
      "@firebase/app": path.resolve(
        __dirname,
        "node_modules/@firebase/app/dist/esm/index.esm2017.js",
      ),
    },
  },

  ...
```

今回はauthとappしか使わなかったのでこの２つだけ指定しました。他のmoduleも使う場合にはそれも指定してください。

***monorepoで使う場合は実際にファイルを保存しているnode_modulesディレクトリを指定しましょう***

# 教訓
electronから卒業します...高度な機能が要らないと言ってずっとswiftを避けてきた自分が悪かった...
Goを学ぶ有料講義を始めた話

## Gopher塾をきっかけ

どうも[ナレッジワーク](https://tenn.in/kw)の[tenntenn](https://tenn.in)です。

2022年の10月より[Gopher塾](https://gopher.school)という有料の講義を始めました。参加頂いた方は、ありがとうございました！

[『チャンスは待たずに自分で作る ─ ソフトウェアエンジニアが「好きな技術」で生きていくための技術とは』](https://engineer-lab.findy-code.io/tenntenn-go)という記事にも書いた通り、有料にした理由は家族との時間を減らして行う個人活動の時間に一定の意味をもたせることです。

有料で行うからには、参加者が参加して良かったと思えるものにしなければいけません。[#1](https://gopher.school/1)はテストに関して、[#2](https://gopher.school/2)はGoらしいコードの書き方について扱っています（#2は開催予定）。

単なる使い方だけではなく、10年以上Goコミュニティで学んだ知識や開発経験、技術顧問などで複数社の設計・実装を見た経験を基に講義を構成しています。

また、私は内部構造を調べるのが好きなので、たとえばgo testの仕組みやカバレッジを取る仕組みについて解説したり、仕組みを追いかける方法も紹介しています。

質問についても1ヶ月間はできるだけ回答するように心がけています。参加者はSlackで自由に質問やレビューを依頼できるようにしています。

## Gopher塾を開催してみて

#1の参加者は合計84人（内有料枠は54人）でした。アンケートで記入頂いた満足度は5段階評価で、4.74（回答数：35）でした。概ね評価頂いているようでした。

参加者の人数を見ていると、休日での開催が需要がありそうです。#2は[平日に分割して参加可能](https://tenntenn.connpass.com/event/268056/)にしてみましたが、有料枠は少なめで学生枠の方が人気になっています。

内容は、初学者向けよりも濃い目やリアルワールドで困っている内容の方が好まれそうでした。仕事や今後のOSS活動に活きるような知見が求められているようでした。

技術書典やZennの本などにも言えますが、ソフトウェアエンジニアの活動が無償の活動だけではなく、適切な対価を得られて、モチベーションに繋がり、継続的な活動に定着すると良いなと思っています。

価格設定はとても難しいです。私も、とある方からアドバイスを頂き、エイヤで決めました。適切かどうかは、開催していく中で、参加者のみなさまからのフィードバックをもとに考えていきたいです。

## 今後の予定

この活動だけで生計を立てているわけではないので、今後どうしていくかは未定です。所属企業（2022年12月からナレッジワークに転職しました）や家族と相談のうえ、開催していきたいと思います。

今後、開催する回は、友人に動画編集を行っている方がいるので、その方に編集をお願い（もちろん有料で）して、Udemyなどでアーカイブ動画を公開することもあるかもしれません。
Reverse mentorship の可能性について

## はじめに
CivicTech も GovTech も、これまで Tech が足りていなかったところに Tech を注入する手段として理解されてきました。

Reverse mentorship も、もともとは Tech が足りていなかったところに Tech を注入する手段として理解されてきました。しかし、最近では、 多様性（Diversity）が足りていなかったところに多様性を注入する手段として効果をあげているようです。

私は伸びしろに注目するタイプですが、日本社会における多様性の欠如・排除を解消していくことは、多大な注目に値する伸びしろだと思っています。

多様性の欠如と減点方式は関連していると思っています。多様性を拡大していくことができれば減点方式的発想の弊害も除かれ、確かにイノベーションが進みやすくなり、スタートアップも奨励されやすくなるように思います。

## 参考文献
このエントリを書くにあたっては、ウェブ上にオープンになっていた次の情報を参考にしました。

- [Patrice Gordon: How reverse mentorship can help create better leaders | The Way We Work, a TED series](https://www.youtube.com/watch?v=NMVgg6zuiB0)
PowerToys について知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。PowerToysというものがある。

[PowerToys のインストール | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/powertoys/install)
[新人さんにすすめる有益なツール達 2022春- - Qiita](https://qiita.com/e99h2121/items/f70db44e7f69901f0141)

にも書いた。これはただただ黙ってやっておくと良い。関連リンクは以下。

- [「Microsoft PowerToys」Microsoft公式のシステムユーティリティ群 - 窓の杜](https://forest.watch.impress.co.jp/library/software/powertoys/)
- https://github.com/microsoft/PowerToys

PowerToys は Powertoys でも Power Toys でもなく PowerToys のようだ。近頃は正式名称に以前以上こだわる癖がついた... :christmas_tree:
YOLOv7やーる（Python3.9、Windows10）

https://github.com/WongKinYiu/yolov7

- Windows10 PC
- Python3.9

yolov7.ptをダウンロード


python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source yourvideo.mp4


python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg

cpuだと行けた

waitKey(0)
python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg --view-img --device cpu

結果はここに入る
yolov7-main\runs\detect\exp*
![horses.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/d8fe607b-f198-e296-94d0-b64c92607e33.jpeg)

5 horses, Done. (2732.1ms) Inference, (5.0ms) NMS
 The image with the result is saved in: runs\detect\exp12\horses.jpg
Done. (3.160s)

python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/bus.jpg --view-img --device cpu --classes 0

![bus.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/2284046d-3210-73a7-2db7-dea0955fdd4a.jpeg)

4 persons, Done. (3284.5ms) Inference, (12.0ms) NMS
 The image with the result is saved in: runs\detect\exp15\bus.jpg
Done. (4.004s)
CreateMLで作ったCoreMLのモデルをONNXに変換すーる（回帰分析）

# はじめに
CreateMLで作ったCoreMLのモデルをONNXに変換していきまーす

# 開発環境
- MacBookPro 2018
- Python 3.9

# 導入
1．XCodeからCreateMLを開きます

2．[前回](https://qiita.com/SatoshiGachiFujimoto/items/8df23bb3e37ba00b5159)の記事を参考に、PyCaretのdatasetsにある[insurance.csv](https://github.com/pycaret/pycaret/blob/master/datasets/insurance.csv)を使用して、回帰分析を行います

3．Targetにchargesを選択、Featuresにage,bmi,childrenを指定します（※今回は変換する際にカテゴリカルデータがあるとOne Hot Encodingのエラーが出たため外しています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/aa69979d-890c-9493-04a3-8caded2a5cf0.png)

4．Trainボタンを押して、学習を開始します

5．Outputタブを開き、Getをクリックし、CoreMLモデル(.mlmodel)を保存します

6．ライブラリをインストールします

~~~
pip install onnxmltools
pip install coremltools
pip install onnxruntime
~~~

7．CoreMLのモデルをONNXに変換します

~~~coreml2onnx.py
import onnxmltools
import coremltools

coreml_model = coremltools.utils.load_spec('insurance.mlmodel')
onnx_model = onnxmltools.convert_coreml(coreml_model, 'insurance')
onnxmltools.utils.save_model(onnx_model, 'insurance.onnx')
~~~

8．変換したONNXのモデルを用いて推論してみます

~~~predict.py
import onnxruntime as rt
import numpy as np

session = rt.InferenceSession("insurance.onnx")

for input in session.get_inputs():
    print(input.name) # age, bmi, children

print(session.get_outputs()[0].name) # charges

outputs = session.run(["charges"], {'age':[np.float32(19.0)],'bmi':[np.float32(27.9)],'children':[np.float32(0.0)]})[0]
print(outputs[0][0])
~~~

9．推論結果が出ました

~~~
6744.545
~~~

10．[netron](https://netron.app/)を用いるとONNXの中身が見れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/55443c85-8025-f8a1-e303-4c107baa7327.png)

お疲れ様でした

# 関連記事
- [CreateMLで回帰分析すーる](https://qiita.com/SatoshiGachiFujimoto/items/8df23bb3e37ba00b5159)
サッカーボールの位置を上から見てみーる（Python3.9、OpenCV）

# はじめに
サッカーボールの位置を上から見てみよう

# 開発環境
- Windows 10
- Python 3.9

# 実行

~~~main.py
import cv2
import numpy as np
import math

ratio = 1.0
filename = "soccer.jpeg" 
 
p1 = np.array([1280, 1157])
p2 = np.array([4392, 1157])
p3 = np.array([602, 1896])
p4 = np.array([5070, 1896])
p5 = np.array([[[2047,1633]]], dtype='float32')
print(p5)
image = cv2.imread(filename)
height, width = image.shape[:2]

width2 = np.linalg.norm(p2 - p1)
width2 = math.floor(width2 * ratio)

height2 = np.linalg.norm(p3 - p1)
height2 = math.floor(height2)
 
src = np.float32([p1, p2, p3, p4])
dst = np.float32([[0, 0],[width2, 0],[0, height2],[width2, height2]])
M = cv2.getPerspectiveTransform(src, dst)
print(M)

result = cv2.warpPerspective(image, M,(width2, height2))
p6 = cv2.perspectiveTransform(p5, M)
print(p6)
cv2.putText(result,text='gachi',org=(200, 500),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=10.0,color=(0, 0, 255),thickness=10,lineType=cv2.LINE_8)
cv2.circle(result,(int(p6[0][0][0]), int(p6[0][0][1])),10,(255,0,0),-1,cv2.LINE_8)
# cv2.rectangle(result,(0,0),(o_width,o_height),(0,255,0),10,cv2.LINE_8)
cv2.imwrite("soccer_warped.jpg", result)

dst = np.float32([[0, 0],[width2, 0],[0, height2],[width2, height2]])
src = np.float32([p1, p2, p3, p4])
M = cv2.getPerspectiveTransform(dst, src)

image2 = cv2.warpPerspective(result, M,(width, height))
pts = np.array((p1,p2,p4,p3))
cv2.fillPoly(image, [pts], (0,0,0), lineType=cv2.LINE_8)
result = image + image2

cv2.imwrite("soccer_result.jpg", result)
~~~

|origin|result|warped|
|:--|:--|:--|
|![soccer.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/fdad0540-a0c2-8dca-6afa-03b37cb492fc.jpeg)|![soccer_result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/f5e6ccd1-3b35-4211-370f-267167e71648.jpeg)|![soccer_warped.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/755ee36f-54dc-7031-6594-8e6a0ba180eb.jpeg)|

競技場の斜めから見たボールの位置は(2047, 1633)、上から見ると(939.91205, 723.5516)の位置にある

# 参考文献

https://qiita.com/ossyaritoori/items/f7bf63ad50028d1ee858
ふと、2年ぶりに Discord を覗いてみたら・・・

## あれ？なんか実行できなくなってるぞ

専門学生時代に作った Discord bot を掘り起こしてみた。
まずは、酷すぎる過去の自分のソースコードとコミットログに落胆した。
とりあえずDocker 化して実行を試みたところ、動かないではないか。
僕が過去一生懸命書いたコードが。。。でも、割と頑張ってんな。過去の僕。
構成とか諸々突っ込みどころは多いけど、成長を感じる。ありがとう。
となり、とりあえず3時間ほど詳細を調べた。

### 調べてみて分かったこと

1. `discord.py` のアプデで従来の書き方ができなくなっていたこと
1. python 3.7 以前はサポート終了していたこと
1. `discord.py` が開発終了したこと
1. 開発再開していたこと

**I can only say Oh my god.**
オーマイゴッドとしか言えん！！
とりあえず `Hello World` までした。
（それだけで時間かかった・・・）

## 仕様が変わってた内容メモ

```python
# 従来の書き方は使えなくなったらしい。そりゃ2年もたてば変わるか。
# client = discord.Client()

# 面倒だったら全許可でも良い
# intents = discord.Intents.all()

intents = discord.Intents.default()
# メッセージの取得許可
intents.message_content = True
client = discord.Client(intents=intents)
```

Bot とDMの時は無くても大丈夫だったが
サーバーに招待してやるとなると
`default()` → `all()` にする or 下記の追記が必要だった。

```python
intents.message_content = True
```

また Discord Bot 設定もいくつか必要になってた。
色々あったんやね。。

参考（API リファレンス）
https://discordpy.readthedocs.io/ja/latest/api.html#discord.Intents.all （編集済み）
過去問を制する者は基本情報技術者を制す

# はじめに
私はITを専攻している短大生です。
先日、令和４年度下期　基本情報技術者試験を受け、午前・午後ともに合格ラインである６０点を超えることができました。<br>
この記事では、私が実践していた学習方法について紹介しようと思います。<br>
と、その前にこれだけは声を大にして言います。<font color="red">**過去問を制する者は基本情報技術者を制す**</font>という言葉です。  

# 目次
1. [午前試験対策](#gozen) 
1. [午後試験対策](#gogo)

<a id="gozen"><a>
# 午前試験 <br>
![午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982400/e6a13a43-d3f1-43b5-d3c1-498f681050d0.png)<br>
まず、上の画像が私の午前問題のスコアレポートです。マネジメントが一番正答率が高いことがわかりますが、これは高校時代につけた予備知識によるものだと思います。<br>
### 勉強の主な手順
1. 参考書を一通り読む　(予備知識があれば軽くで良い)
1. 用語を覚える
↑[基本情報ドットコム(キーワード集)](https://www.fe-siken.com/s/keyword/)
1. 過去問でひたすら練習
↑[基本情報ドットコム(過去問道場)](https://www.fe-siken.com/fekakomon.php)<br>

上記の１～３の中では、３の過去問での練習に重点を置きました。理由としては二つあります。<br>
一つ目は基本情報午前問題に関しては、<font color="red">**過去問の流用率が５０％あるからです。**</font> まずこれを聞けば過去問をやらない手はないでしょう。<br>
二つ目は[基本情報ドットコム(過去問道場)](https://www.fe-siken.com/fekakomon.php)のサイトが過去問練習にとても有用だという点です。
ユーザ登録さえしていれば自分が苦手な分野がはっきり分かるのでとても対策しやすいです。
<a id="gogo"><a>
# 午後試験 <br>![午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982400/bdb4bca5-21c5-fac0-0d93-f275ceaae7d2.png)
### 勉強の主な手順
1. 過去問で必須問題から選択問題まで一通り解く
1. <font color="red">自分に合った選択問題を選んで勉強する
1. 過去問をひたすら解き、問題に慣れる 
<br>
午後問題も午前問題と同じように過去問が肝になります。しかし、２．の「<font color="red">自分に合った選択問題を選んで勉強する</font>」がとても重要になります。

### 午後問題の選択おすすめ
問2～問5でおすすめの選択方法は、**テクノロジ系から3問を選んで、学習する**ことです。<br>
理由は、**テクノロジ系4科目から3問が出題され、選択するのは2問だから**です。
もちろんマネジメント系からの問題もありますが、4科目中1問しか出ないので、マネジメント系で4科目学習する必要があり、負荷が大きくなります。
# さいごに
令和５年の４月から基本情報技術者試験が大きく変わり、通年性になるとのことなのでCBTと相まってより自分のペースで受験できるのではないかと思います。私ももっと高みを目指して資格取得に励むので、一緒にコツコツ積み重ねていきましょう！
Crystal公式ドキュメントを翻訳したくなったら?

# 最初に

[Crystalのアドベントカレンダー](https://qiita.com/advent-calendar/2022/crystal) 3日目です。
昨日までは、kojix2-sanのWebAssembly関連の記事でした。

さて、アドベントカレンダーあまり埋まってないし、
みなさんの敷居を下げるためにも簡単に書いていきます!

Crystalの公式ドキュメントの翻訳にちょっとしたPRをだしたので、
「翻訳しよう」っていう勝手な宣伝(?)です。

# Crystalの公式ドキュメント

Crystalの公式ドキュメントを読んだことありますか?

自分自身ちゃんと読んでないですが、充実してるように思います。

日本語版、読んだことありますか?
https://ja.crystal-lang.org/reference/

訳されてないといえば訳されてないですが、
知名度の割にはけっこう訳されてる気もします。

# 訳してみるには?

訳されてないところを見ると、訳したくなりませんか?

訳したくなったら、どうやって訳せば良いのでしょうか?

日本語の翻訳を管理してるレポジトリがありました!
https://github.com/crystal-jp/ja.crystal-lang.org

ちゃんとした翻訳をする場合は、CONTRIBUTING.mdに方法が示されています。

- [記事を書いてる時点のCONTRIBUTING.md](https://github.com/crystal-jp/ja.crystal-lang.org/blob/c73cfd1047d803446568994ddcbcaf261a8ee5c5/CONTRIBUTING.md)

ただ、ISSUEにもなっているのですが、古い部分があるようです。
crystal-bookを自分はうまく動かせなかったので、そのあたりかもしれません。
dockerなくても一応できたので、真ん中あたりは必須ではなさそうです。

で、どうやって翻訳するかというと、サブモジュールを使っているプロジェクトに対して、
OmegaTというソフトを使いながら、訳していきます。

由緒正しいソフトらしいのですが、
翻訳ソフト自体そういうのを使ったことがなかったので、ちょっと取っつきづらかったです。
でも、自分でも使えたので、なんとかなると思いますし、
使っていくうちに慣れると思います!

自分は作業してない部分まで何か変化して困りましたが、
「現在の訳文ファイルのみ生成」をクリックすべきところ、
「訳文ファイルを生成」をクリックしてるようです。


# 最後に

自分はまだ1回訳してPRを送った程度ですが、
Crystalを広めたいな・協力したいなって思ってる方は訳してみるといいかもしれません。

以上です。

ありがとうございました!!
量子超越性の主張について

#
**Googleさんはどうしたんだろね？**

# シカモアのビデオを見る

先の投稿でも少し触れたシカモア、Googleの量子コンピュータで、初めて「量子超越性」を出せた、と言われたものなんだけど。

量子力学とその物理について述べてる中で、なんか微妙な動きだなあ、とは思ってたんだけどね。

量子コンピュータが量子力学の「コペンハーゲン解釈」に基づいての量子超越性を主張してるとするとさ。

まだ明確では無いものの、キュービットの重ね合わせは上位空間のカオスかもしれなくて、そうすると、解空間はカオスの動きになって言ってしまうと「一様乱数」内でのキュービットの動きにならなくなってしまう。

だから量子コンピュータは原理からちょっと危ない状況かもって話なんだけど、Googleはシカモアで量子超越性を主張してたので、ちょっと彼らのYoutubeを見たのさ。

そうしたら結構微妙？？

まあ見てみましょう。

https://youtu.be/SNaLeiBqT-s

これでさ。

まあ見て欲しいが少し抜粋していこう。

![Screenshot_2022-12-03-00-38-48-783_com.google.android.youtube.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/7f7c1881-cf7f-30a9-f365-07dbc6a5f382.jpeg)

まずは簡単な解説。

まあ量子コンピュータの優位性の簡単な解説だね。誰でもよく説明受ける話だよね。

![Screenshot_2022-12-03-00-41-28-374_com.google.android.youtube.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/7a05c1ec-ae8f-c139-1c60-ac023d100e70.jpeg)

でさ、この人もそれを解説してる。そこまではまあ普通だよね。

で、このあと少し変な話が出てくる。

![Screenshot_2022-12-03-00-41-57-776_com.google.android.youtube.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/5e8bc380-be14-0707-a7c4-4582509c5ce7.jpeg)

なんか性能が上がらない、という事が有ったようなんだよね？？でも

![Screenshot_2022-12-03-00-42-07-838_com.google.android.youtube.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/873273e2-ddbb-2c48-1a1b-ec07c350684c.jpeg)

ほうほう。調整したら良くなったんだ🤔

![Screenshot_2022-12-03-00-42-27-299_com.google.android.youtube.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/651517f9-7c77-1715-516c-9d1d12501542.jpeg)

みんななんかあまり喜んでない。

![Screenshot_2022-12-03-00-42-48-597_com.google.android.youtube.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/7f007619-043b-781a-5e95-cf7f0e010465.jpeg)

不思議なデータだったのかな？？

![Screenshot_2022-12-03-00-43-08-461_com.google.android.youtube.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2974126/f88c9d0a-1a93-bd84-16a7-f8471c3e7fd3.jpeg)

これは？？なんか不思議がってる人もいるね？？

でも出来たんだ！！！すごいじゃん！！！

というビデオなんだけどさ。

なんか別に苦労して上手くいったサクセスストーリーでしょ？？

で、この後、これならイケイケじゃん？？行け行けGoogle！！イケイケ量子コンピュータ！！！
になるんでしょ？？

でも、実は

**責任者直ぐにGoogle辞めました、と。**

？？？🤔🤔🤔🤤

なんか不思議がってたしな・・・

あ？？？あっ、ふーん…（察し）🤔🤤

その後色んな批判を各社から浴びたし、GPUでも早く出来ちゃうね？って話も出てきたし。

うーん、となると？？そういえばその後、Googleさん量子コンピュータおとなしいよね。

これ結構、やばい展開な感じするよね？？Googleさんにはみんな忖度しちゃうともあの湊さん言ってたし・・・

量子コンピュータ業界、原理も含めてさ。色々まずいかも・・・なあ・・・少なくても直近はな。

と言う感じだと改めて確認したなって話でしたよ😌

まあ、業界に期待する人達居るのも当然ではあるが、一気に突っ込まずにさ。少し俯瞰してみた方が良いかもしれないね😌
Gitのコミット履歴から有料アセットを抹消する

# はじめに
この記事は [みす老人会 2nd Advent Calendar 2022](https://adventar.org/calendars/7865) 3日目の記事です。


就職活動で自分のスキルをアピールするためにGitHubの非公開の個人開発リポジトリを公開する機会がありました。その際、コミット・プッシュしてしまっている**有料アセット**などの公開してはいけないもの（以下、機密ファイル）を他人がダウンロードできないようにする処置を行いました。

`git rm --cached`を行うことでインデックスからファイルを削除することができますが、それだけではコミット履歴に「ファイルを削除した」という記録が残ります。もしGitHubを公開した場合、履歴からファイルを取得できてしまいます。そこで**BFG Repo-Cleaner**を使用して、すべてのコミット履歴からそのファイルが存在した歴史を抹消します。

Windowsの記事が少なかったこと、BFGの入手方法から説明している記事が少なかったので書きました。

## 制約
すでにリポジトリを他人にclone・forkされている場合、そこから機密ファイル削除することは不可能なので、機密ファイルがずっと非公開だったことが前提です。

また、機密ファイルのコミット履歴が GitHub の pull request などで参照されている場合はそこから漏れる可能性があります。その場合 GitHub サポートに連絡して pull request の参照の削除を依頼する必要があります。
参考:[Removing sensitive data from a repository](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository)

## 免責
この記事を参考にして機密ファイルが漏れたこと、それによって生じた損害に対して筆者は一切の責任を負いません。

細心の注意を払いましょう。

# 環境、バージョン
- OS: windows11
- Java: 1.8.0_351
- bfg: 1.14.0

Java ランタイム環境が必要です。筆者はJavaをインストールするところから行いました。

今回利用したリポジトリはゲームエンジン Unity のプロジェクトでした。

# 準備
## Javaのインストール
今回はシンプルにJavaだけをインストールし、JDKなどは入れてません。

https://www.java.com/ja/

## BFGのダウンロード

右の青いボタンから .jar ファイルをダウンロードします。

https://rtyley.github.io/bfg-repo-cleaner/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/916638/abfac844-c46f-863f-2906-063329cfc4ac.png)

> JARファイルとは、コンピュータプログラムを格納するファイル形式の一つで、Java言語で開発されたプログラムを構成するファイル群を一つにまとめて格納するためのもの。ファイル名の標準の拡張子は「.jar」。
[JARファイルとは - 意味をわかりやすく - IT用語辞典 e-Words](https://e-words.jp/w/JAR%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html#:~:text=JAR%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%90Java%20Archive%E3%80%91,%E5%AD%90%E3%81%AF%E3%80%8C.jar%E3%80%8D%E3%80%82)

というわけで実行可能ファイルではないが、Java実行環境があれば基本的に何もしなくても実行できるファイルらしいです。

## HEADから機密ファイルを削除

bfgはHEADに存在するものは削除しません。そのため`git rm --cached`などでHEADから機密ファイルを削除しておきます。

# 手順

ターミナルでリポジトリの**上のディレクトリ**に移動します。
```
Works <- ここ！
 ├─ repository1
 │   └─ .git
 └─ repository2
     └─ .git
```

## バックアップ

安全のためにベアリポジトリで行います。
```bash
$ git clone --mirror git://example.com/repository1.git
```


## 実行

パスとかエイリアスは設定していません。

特定のファイルを削除したい場合。

```bash
$ java -jar c:/Users/co1umbine/Downloads/bfg-1.14.0.jar --delete-files hoge.png repository1.git
```

特定のフォルダとその中身を削除したい場合。

```bash
$ java -jar c:/Users/co1umbine/Downloads/bfg-1.14.0.jar --delete-folders fuga repository1.git
```

ファイル、フォルダ指定ともにglobのワイルドカードが使えます。

## 後処理

削除を実行すると出てくる指示通り、以下のコマンドをリポジトリに入って打ちます。

```bash
$ cd repository1.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
```

強制pushです。

```bash
git push -f
```

# 確認
githubなどを見てみると、機密ファイルを消した差分から**機密ファイルを消した履歴**が消えています。
コミット識別番号も変更されていることがわかります。

# 参考文献
https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository

https://rtyley.github.io/bfg-repo-cleaner/

https://qiita.com/jnchito/items/64ffb76a9c645323f43c

https://hatsune.hatenablog.jp/entry/2022/05/09/130159

https://e-words.jp/w/JAR%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html#:~:text=JAR%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%90Java%20Archive%E3%80%91,%E5%AD%90%E3%81%AF%E3%80%8C.jar%E3%80%8D%E3%80%82
React+TypeScript 百人一首読み上げプログラム 

# はじめに

音声読み上げ(WebSpeechAPI)を使って、百人一首の読み上げサイトが作れるのではないか、と思いついてReact+TypeScriptで作ってみました。

startボタンを押すと読み上げが始まります。stopで止まって、startで再開。

1枚目は8秒待ちます。長い!!!!

# 実行例
<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="GRGYGQK" data-user="kalz2q" 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/kalz2q/pen/GRGYGQK">
  Untitled</a> by kalz2q (<a href="https://codepen.io/kalz2q">@kalz2q</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


# 解説

読み上げはwindows.speechSynthesisと言うのを使っています。あまりナチュラルな日本語に聞こえないけど頑張っている!  
とりあえず百人一首に聞こえるものね。

音声の頭が欠けるのを防ぐために、「ん。」を出だしに入れているので不要な人はエディターで一括削除して下さい。

一枚読み上げるのに8秒かかるので、intervalを8000にしたところ、startを押しても8秒経たないと始まらないのをどうにかしたいが、方法が思いつかない。

最近の作品の中では一番の大作です。 百人一首のデータだけでも使い道があるかもしれない。データは手入力なので不備があります。見つかり次第直す予定。100首全部あります。

hookはuseStateとuseEffectを使っている。hookを使ってcomponentは使っていない。component苦手。

プログラムのきっかけはnetflixでアニメ「ちはやふる」を見た事です。面白かった。

React+TypeScriptが性に合っていたらしく最近いろんなプログラムをReact+TypeScriptに翻訳してcodepenに載せる作業をしています。  
よかったら普段ははてなにいますので見に来て下さい。

codepenはソースを見れるし、動いているのを確認出来るし大好きです。

そそ、このプログラムではサイトの読み込み時にシャフルしてあとは頭から読んでいるのでとりあえず重複はないけれど、最後まで行ったらまた頭から読み続けます。終わらせることも出来るけど続く方がいいかな、と思ってこの仕様にしている。つもり。100首通して聞いたことがないので未確認。

追記!!!! => 今iphoneのclomeで試したら音が出ない。出ているサイト https://codepen.io/kalz2q/pen/poKOJmZ もあるので原因がわからない。全く同じように実装しているつもりなのだが。
Dateを文字列として正確にEncode/Decodeするのは不可能

# APIから日付をDecodeする(Encode)

TwitterなどのAPIから日付を取得(Decode)する際に、日付が文字列形式のことがあります。
その時のDecode/ Encodeの実装時には注意が必要です。

Date(日付)は情報量が多く、人間が簡単に見やすい形式`yyyy-MM-dd'T'HH:mm:ssZZZZZ`に変換してJSONにする(Encode/Decode)のでは、情報量が落ちてしまいます。

## 情報量が落ちてしまう例

このJSONを生成するには、JSONEncoderのdateEncodingStrategyを設定する必要があります。

```json
{
  "name":"zunda",
  "createdAt":"2022-12-02T10:12:19Z"
}
```

```swift
struct User: Codable, Equatable {
  let name: String
  let createdAt: Date
}

let user = User(name: "zunda", createdAt: Date())
    
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
let data = try encoder.encode(user)
    
print(String(data: data, encoding: .utf8)!)
```

## 生成したJSONをDecodeして同じ日付であるかをチェックする

```swift
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let decodedUser = try decoder.decode(User.self, from: data)

// 比較
let sameDate = user.createdAt == decodedUser.createdAt // falseになる

// ここで情報量が落ちていることが確認できる
print(user.createdAt.timeIntervalSinceReferenceDate) // 691669442.562633
print(decodedUser.createdAt.timeIntervalSinceReferenceDate) // 691669442.0 
```


## 情報量を落とさない方法

標準の方法では実は情報量は落とさず、Encode/Decodeすることができます。
しかし人間が見ても簡単には、日付がわかりません。
標準方法でEncodeすると以下のような形になります。これはDecodeしても情報量が落ちません。

```json
{
    "name":"zunda",
    "createdAt":691668705.64202905
}
```

```swift
let user = User(name: "zunda", createdAt: Date())
    
let encoder = JSONEncoder()
let data = try encoder.encode(user)

print(String(data: data, encoding: .utf8)!)

let decoder = JSONDecoder()
let decodedUser = try decoder.decode(User.self, from: data)

print(user.createdAt.timeIntervalSinceReferenceDate)
print(decodedUser.createdAt.timeIntervalSinceReferenceDate)
```

## Encode/ Decodeのテストができない


作成したモデルをEncodeして、Decodeすることで、EncodeとDecodeの整合性をテストするといったことが文字列日付を使用しようとするとできないです。

テスト時はdateDecodingStrategy, dateEncodingStrategyを`設定しない`などで対処するしかないかもしれません。
AndroidSudioでインストールEmulaterを作成するまで

この記事はMacOS Monterey ver12.5.1 に Android Studio 2021.3.1をインストールからプロジェクトを立ち上げ、カウンター機能を作成するまでのメモ兼復習用です。
Android Studio のインストール
バージョンの指定をしない場合は[このリンク](https://developer.android.com/studio?hl=ja)の遷移先にある、
ダウンロードのボタンをクリックする。
契約のサインなどを流れで行い、フォルダのダウンロードができたら、フォルダを開いて
図の通りにドラック＆ドロップをする。

アプリケーションの階層にAndroidStudioが入ったことを確認したらダブルクリックで開く。
出てきたダイアログにはOpneをクリックする。

import（拡張機能のようなイメージ？）のダイアログでは何も入れないのであれば、
Do not import settingを選択する

次のダイアログでnextをクリックしたら、Stundard(標準)かCustom（カスタム）を
選択する。　　　　　　特別な理由がなければStundardが良い。

次のダイアログでUIを設定できるが、好きな方を選べば良い。（色が変わるだけ）

次のダイアログでFinishを押してダウンロードが開始される。

ダウンロードが終えたら、ホーム画面になる。

ホーム画面ではプロジェクトの立ち上げや、設定、importの追加などができる。
（おすすめのimportは追々調べたり、聞いていく）

プロジェクトの立ち上げは、New ProjectやOpne、CVSなどでできる。

個人で練習するときなどは基本的にプロジェクトを立ち上げると思うので、
この記事ではOpenとCVSには触れない。

New Projectを選択したら、様々なオプションを提示されるが、スマホやタブレットなどの
端末であれば、Phone and TabletのEmpty　Activityを選ぶと最低限のフォーマットから始められる。

New Projectの　Name・Pakage Nameはわかりやすい名前にしておく。

Save Locationはそのままでも良い（どの場所に置くのが比較的に良いのかは後に学習する）

LanguageはJavaかKotlinを選ぶ（Kotlinを選びました）

Minimum SDKではAndroidのバージョンに合わせて最低限の開発環境を選択できる。
選択すると、下にYour app ~~ の文章に数字が表示される。
この表示は現在のAndoroidのシェアを表している。
数字が一番大きいバージョン以前は市場的にあまりおすすめではないかも。

下のチェックボックスは古いAndroidに対応するためのものなので、基本的にはチェックを
入れる必要はない。

finishをクリックしてダウンロードを開始する。

Tip of the Dayのダイアログが表示されるが、開発に関しての知識の提供のため、
ありがた〜い啓示に満足したらNext Tip以外のボタンをクリックして閉じる。

ダウンロードが完了し、開発環境ができるまで右下にGradle:の文章とゲージが表示される。

開発環境ができたら、右下のEvent Logにエラーが出ていないかを確認し、
問題なければ開発を始める。

デバイスでどのように表示され動作するのかはEmulaterで確認できる。

右上のデバイスが表示されているドロップダウンから表示されているデバイスを選択する。
または、Device Manegerを選択する。
（これはデバイスの機種や状態などを詳細に設定し作成することに使用できる）
表示されているデバイスのスタートボタンを押してもエラーになる場合はCreate Deviceをクリックし、新しく設定したEmulaterを作成する。

Create Deviceのダイアログが表示されたら、適当な機種を選択しNextをクリック。
その後、Androidのバージョンを指定し、Finishをクリックする。（上にあるものを選んだが、何を選ぶかは今後の課題になりそう）
【HTML/CSS】レイアウトの整え方あれこれ①

※この記事は、プログラミング学習サイト「Progate」の学習内容に関するものです。

<b>「HTML&CSS 学習レッスン 中級編」</b>の学習中、
結構つまづいてしまった箇所があったので、
明日の自分のために書き残しておきます。
･･･仕事終わり & 深夜でめちゃくちゃ眠いので、
ｺｯｸﾘｺｯｸﾘ し始めるまで書きます💦

◎<b>「レッスン部分を作ろう / 6.レイアウトを整えよう」</b>
　⑴　<b>position</b> プロパティ
　　・<b><font color="orange">position: absolute;</font></b> と <b><font color=#00dd77>position: relative;</b> の2種類がある
　　・<b><font color="orange">absolute;</font></b> はサイト全体の左上部分を基準の位置とする

```:CSS:
box1 {
　position: absolute;
  top: 40px;
　left: 100px;
}　
```
　→ サイト全体の左上に基準を指定した後、
　　<b><font color="red">上に40px分，左に100px分だけ間隔を開けた位置</font></b>に移動させる

```:CSS:
box1(※親要素) {
  position: absolute;
}

box2(※子要素) {
　position: relative;
  top: 40px;
　left: 100px;
}　
```

　→ 親要素に <b><font color="orange">position: absolute;</font></b> を指定することで、
　　<b><font color="red">親要素の左上部分が基準位置</font></b>になる
　　子要素に <b><font color=#00dd77>position: relative;</b> を指定することで、
　　<b><font color="red">親要素の左上部分から上に40px分、左に100px分だけ間隔を開けた位置</font></b>
　　に移動させる

ん－、限界が来たのでここまで！続きはまた明日書きます！💦
ご覧いただき、ありがとうございました！おやすみなさい🌌
Elixir Advent Calendar 2022 をほんとの初心者が読んでみた - 執筆の動機と目次

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。

「Elixirのアドベントカレンダー、記事数やばいことになってるけどどういうこと？」と言われておりますElixir Advent Calendar 2022ですが、
初学者で、プログラミング歴半年ちょいの私が今読むとどういう感想をもつのか、そして、何が分かってないのかをまとめていこうと思います。

# 「初心者である君の『分からないことが分からない』」-執筆の動機
初心者である私は質問すると「初心者である君の、分からないことが何なのか分からない」「どこで躓いているのか分からない」と言われることがあります。

しかし私には分からないことを言語化するための前提知識がありません。
私はこう答えるしかありませんでした。

「私も何が分からないか言語化できないから困っています」[^1]

この状況に対する対策は、分からない箇所を言語化する訓練、および、知識の数を淡々と増やすことしかないと思いました。

そこで、このElixir Advent Calendar 2022をきっかけに、読んだ感想や分からない箇所をまとめることで、訓練の一助にさせていただこうと考えました。
来年の今頃、「こんなことに躓いていたんだね」って振り返って言えるように、来年も頑張ります。

# 目次
（※順次リンクを記載予定です。読み込みが全然追いついてなくてすみません。）

・[12月1日の投稿記事](https://qiita.com/Alicesky2127/items/3de66f814974732a3937)
・[12月2日の投稿記事]
・[12月3日の投稿記事]
・[12月4日の投稿記事]
・[12月5日の投稿記事]
・[12月6日の投稿記事]
・[12月7日の投稿記事]
・[12月8日の投稿記事]
・[12月9日の投稿記事]
・[12月10日の投稿記事]
・[12月11日の投稿記事]
・[12月12日の投稿記事]
・[12月13日の投稿記事]
・[12月14日の投稿記事]
・[12月15日の投稿記事]
・[12月16日の投稿記事]
・[12月17日の投稿記事]
・[12月18日の投稿記事]
・[12月19日の投稿記事]
・[12月20日の投稿記事]
・[12月21日の投稿記事]
・[12月22日の投稿記事]
・[12月23日の投稿記事]
・[12月24日の投稿記事]
・[12月25日の投稿記事]
<br>

# ～Elixirの国のご案内～
※Elixirって何ぞや？と思ったらこちらもどぞ。未来がぎゅっと詰まった、Elixirは今年で生まれて10周年です:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/7bf8f9f4f5f576e597f5



[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^2]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。


まずは気軽に話しかけてみてください。[^10]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian


[^1]: このような悲惨な状況に陥った結果、メンターの方々にはペアプロなどを通じて私の「言語化できない不明点」を洗い出そうと試行錯誤していただいて、大変申し訳なかったです。

[^2]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^10]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！
ServiceLayer

![03.ServiceLayer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/871615bf-14d4-62ac-4e27-88226fabe3fc.png)

https://bliki-ja.github.io/pofeaa/ServiceLayer/

サービスと言うと、ロギングやキャッシュなどのシステム・サービスを想像する方も多いかもしれませんが、Service Layser パターンの言うサービスは、アプリケーションがユーザーにどんな機能を提供するかを意味する、ドメイン・サービス寄りのものになります。

Table Module や Domain Model でビジネスロジックを記述すると、そのエントリポイントがいくつものクラスに分散するため、総じて、どんな機能がどれだけ提供されるのかが曖昧になります。ユーザー入力やイベントのハンドラといった、ソフトウェアシステムを組む層からそれらを利用するさい、いくつものオブジェクトを直接扱うロジックを書くのは、混乱のもとです。

複雑なオブジェクト群が結局どんな機能を提供するのかを、Service Layer に列挙し、システム側からはそこに見えるサービスを通してのみ、ビジネスロジックと連携するようにすると、うまく関心が分離できます。

各ビジネスロジックオブジェクトは、どこかで利用した処理を、別の箇所で再利用している場合もあります。データベースのトランザクション境界は、必ずしも、メソッドの先頭と末尾でないかもしれません。Service Layer が提供する粒度は、データベーストランザクションの範囲を決めるのにも役立ちます。Domain Model や Table Module には、begin/commit/rollback といった RDBMS の関心を含まず、Service Layer にトランザクション境界を隠蔽するのが良い策です。

トランザクションにかぎらず、同じ要領で、複数のオブジェクトの連携に必要な制御、入力の整合性チェックなど、特定のビジネスロジックには属さない、機能全体にまたがる雑用も隠蔽します。

Transaction Script は、ビジネスロジックのエントリポイントが明確で、多くの場合、手続き全体がアトミックなデータベーストランザクションになってきます。そうでない場合でも、直接的に SQL を意識して書いているコードであれば、トランザクションの制御のような制御も、(他のオブジェクトとの関係にまたがる事情がないので)直接書くのが理にかなっています。ビジネスロジックが Transaction Script や単純な単一テーブル CRUD でよい場合、Service Layser を挟む必然性はありません。
minecraft gametestが1.19.50になって動かなくなった人へ

# 導入
　皆さんはMinecraftというゲームをご存じでしょうか。まぁあんな神ゲーをご存じないという方、そうそういないかと思います。
　さて、この記事では、MinecraftBEのバージョンを1.19.40から1.19.50にバージョンアップしたときにGametestが動かなくなり、どうすれば動くようになるのか手こずったので、今後同じような事態に陥った人のために、解決までの過程を記していきたいと思います。


# 解決方法
　結論としてはmanifest.jsonの"dependencies"の値のうち、"module_name"が"@minecraft/server"である要素の"version"を"1.0.0-beta"から"1.1.0-beta"に変更することで再び動作するようになります。


# 問題解決までの過程
　以下、問題解決の最終的な方法だけでなく、その過程も知りたいという方のための部分です。その前にこの時の私の環境で問題の発生したビヘイビアパックのmanifest.jsonの中身を上げておきます。

```json
{
  "format_version": 2,
  "header":
  {
    "name": "hoge",
    "description" : "a",
    "uuid": "uuid",
    "version": [0,1,0],
    "min_engine_version": [1,19,40]
  },
  "modules":
  [
    {
      "description": "^^;",
      "type": "script",
      "language": "javascript",
      "uuid": "uuid",
      "version":[0,1,0],
      "entry": "scripts/main.js"
    }
  ],
  "dependencies":
  [
    {
      "module_name": "@minecraft/server",
      "version": "1.0.0-beta"
    },
    {
      "module_name": "@minecraft/server-ui",
      "version": "1.0.0-beta"
    }
  ]
}
```

　さて、問題が発生したらすぐに 設定>>クリエイター>>コンテンツログの有効化&コンテンツGUIの有効化 二つのトグルを両方ONにしてどこに問題があったのか調べてみます。すると次のようなログが現れました。
``` 
[Scripting][error]-Plugin [forMovie] - module [forMovie - 1.0.0] requesting invalid module version [@minecraft/server - 1.0.0-beta].
Available versions:
@minecraft/server - 0.1.0
@minecraft/server - 1.0.0
@minecraft/server - 1.1.0-beta


[Scripting][error]-Plugin [forMovie] - version conflict for [@minecraft/server] - [forMovie - 1.0.0] requested [@minecraft/server - 1.0.0-beta] but [@minecraft/server-ui - 1.0.0-beta] requested [@minecraft/server - 1.1.0-beta]
```
このログを頼りにすれば、どこに問題があるのか、そしてどうすれば解決するのか簡単にわかります。英語が苦手な方、大丈夫です。[DeepL翻訳](https://www.deepl.com/translator)等の翻訳サービスで日本語に翻訳すればいいのです。ログを翻訳すると
```
[スクリプト][エラー]-プラグイン [forMovie] - モジュール [forMovie - 1.0.0] が無効なモジュールバージョン [@minecraft/server - 1.0.0-beta] を要求しています。
利用可能なバージョン
minecraft/server - 0.1.0
Minecraft/server - 1.0.0
minecraft/server - 1.1.0-beta (英語)


[スクリプト][エラー]-プラグイン [forMovie] - [@minecraft/server] のバージョンの競合 - [forMovie - 1.0.0] は [@minecraft/server - 1.0.0-beta] を要求しましたが [@minecraft/server-ui - 1.0.0-beta] は [@minecraft/server - 1.1.0-beta] を要求しています。
```
はい、二つ目のログがすべてを語っていますね。「@minecraft/server-uiの1.0.0-betaを使いたかったら@minecraft/serverは1.1.0-betaを使ってね！」と言っています。はい、そういうことです。


[公式のアップデート情報](https://www.minecraft.net/en-us/article/1-19-50-update-available-bedrock)を読むのも有効です。リンク先のマップ工場も@minecraft/server API を引き続き使用する場合は、manifest.json 参照を 1.1.0-beta に更新する必要があります


# 注意
manifest.jsonの変更は、reloadコマンドを使っても更新されないようです。"version"を適切に変更してもエラーを吐かれるという方はワールドに一度入りなおしてみてください。

# 最後に
minecraftのgametestは、今現在も開発中の機能ということもあり、アップデートによって仕様が少しずつ変わってきます。1.19.40へのアップデートの時には、かなり破壊的な変更がなされたりもしたようです。gametestで遊ぶ際は、保守性の高い設計をすることを意識したほうがよさそうです。
それでは、この記事が一人でも多くのgametestを勉強する人の助けになりますように。
API設計　ハンズオン

## 初めに
簡単なAPIをPythonのFastAPIを使用して作っていきます！
デプロイするところまでをハンズオン形式で進めていきます！

## セットアップ
私の環境はmacなのでmacで説明します！
pythonをまだインストールしていない人はbrew経由でインストールします

```bash 
brew install python
```
任意のディレクトリに移動し、今回作成するディレクトリを作成します
```bash 
cd dev
mkdir fastapi_pj
cd fastapi_pj
```
pythonの仮想環境にvenvを用います
```bash 
python3 -m venv env_api # env_api は任意名
```

fast_apiディレクトリを作成します
```bash 
mkdir fast_api
cd fast_api
```

fast_apiに仮想環境を適応させます。
```bash 
source ../env_api/bin/activate
```
必要なライブラリをインストールします。

```bash 
pip3 install uvicorn
pip3 install fastapi
pip3 install gunicorn
pip freeze -> requirements.txt
```
## fastapi
ここまで来たら、fast_apiをエディタで開き、main.pyをディレクトリ内に作成します
```python:main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def hello_word():
  return {"Hello":"World!"}
```
ターミナルで以下のコマンドを実行します
```bash:ターミナル
uvicorn main:app  --reload
>
INFO:     Will watch for changes in these directories: ['']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [14446] using StatReload
INFO:     Started server process [14448]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
```
ブラウザで`http://127.0.0.1:8000`を入力すると
![スクリーンショット 2022-12-02 21.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868037/cec5cfac-98eb-d69b-2df4-8c26b631973c.png)

と表示されます.
ここまで来たら一度githubにpush挙げましょう。

## デプロイ
デプロイ環境を設定します

[https://render.com/](https://render.com/)

render.comを使用してみます。


render.comでGET STARTED FOR FREEでGitHub認証で新規登録します。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868037/aa1d9113-2aa5-bc64-90d4-b068e9474da4.png)
RenderのDashboardからNew Web Serviceをクリックします
![スクリーンショット 2022-12-03 0.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868037/99e66339-191f-63d8-dfc5-8edb2c938f2e.png)

DeployしたいRepositoryのConnectボタンをクリックします
![スクリーンショット 2022-12-03 0.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2868037/b8c3569f-54ee-c038-7f72-a5a45424dd98.png)

任意のService nameの入力 + Regionの選択 + Start commandの入力します

↓ Start command

`gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app`

Create Web Service ボタンでDeploy開始します

## 終わりに
これで終了です！できたurlから各自動作を試してみてください！
今回は簡単なAPIでしたが、ぜひ皆さんでもっと複雑なAPIを作ってみてください！
基本設計とのうまい付き合い方

アドベントカレンダー2日目ということで、投稿いたします(もう3日？いいえ２日のロスタイムです。ワールドカップ期間中ですし！)。

## この記事の読者

要件定義・基本設計・詳細設計...とソフトウェア開発工程のうち、基本設計について書いていこうと思います。
設計ということで今回は守備力よりの話になります。
スタートアップでイケイケイゴーゴーやっている人にとっては物足りないかも、SIerやSIerに興味ある人向けですかね。
なお、基本設計成果物としては、API/テーブル/画面定義...etcありますが、今回は個々の成果物の言及ではなく、もう少しマクロな視点から書いていこうと思います。

## 設計とは

Wikipedia先生のたまわく、設計とはこういう定義です。

> 建築物や工業製品等といったシステムの具現化のため、必要とする機能を検討するなどの準備であり、その成果物としては仕様書や設計図・設計書等、場合によっては模型などを作ることもある。

### もう少し砕けた言い方をすると
チームでの認識を合わせるためのコミュニケーションツールの一つであるとも言えますし、一種のプロトタイプと言っても良いと思います。

そのため、一側面だけ見ると具体的であればあるほどいいとも言えます。が、具体的に書きすぎるとメンテナンス性が悪くなるなどフットワーク・生産性が悪くなり、結果品質に影響与える結果を招きかねません。

一般的には外部設計などというようにユーザーや運用者、ドメインエキスパートが理解したりレビューできる程度に記載するのがいいと思います。

### 別の見方をすると

詳細設計(内部設計)は誰に対象にするかということを考えれば、書きやすいかもです。
プログラマー向けの設計ということで、関心事はif文やfor文を書けるような成果物ということになります。

## うまい付き合い方

多少触れましたが、過不足なく表現できかつ、生産性(執筆〜レビュー、改修...)を損なわないのがいい設計書です。
そのためのコツとしていくつか紹介しようと思います。

### 成果物を引き算する
気合い入れて標準・お約束どおり、仕上げたくなるかもですが、
ただ、チームとか作ろうとしているものの規模によります。規模が大きくなるとコミュニケーションコストが甚大になるため、それを防ぐために書きすぎぐらい仕上げる現場もあります。
また、ある程度経験値の高いメンバー・ドメインエキスパートに近いメンバーでチーム構成することによっては書く量を減らせたり、体勢によって工夫できる点はあるかと思います。

### そのフォーマットは扱いやすいか
思考停止でエクセルフォーマットに落としていませんか？
元々ドキュメント書くのに適した仕様でもあるため、マークダウンやhtmlにも十分機能しうると思います。
とくにhtmlはjsonをロードしやすいので、コードとの親和性が高いです。
何よりテキストデータのため、Git管理が非常に楽です・レビューがしやすい(OfficeファイルはZIP形式で展開するのにツールが必要)。


### コードドリブンな仕組みに任せてみる
どんなに頑張って設計したところで結局動くものはプログラムでしょ、ということでツールやサービスに任せてコードと一致する設計書生成をこころみてはいかがでしょう。
我々がよく採用するのは、Swaggerなどopen APIのフォーマットを利用したり、Schema Spy(最新JAVAでは動かなかったような気がしますが。)やData Gripでテーブル定義を作成したりなどです。
Figmaなどデザインツール・システムを利用して作業の一部を別領域に棚卸ししても良いかと思います。

## 最後に

つらつら書き連ねてみましたが、いかがでしたでしょうか。
色々書いておいてなんですが、私自身も確立されたスタイルがあるわけではなく、日々発生するツールやサービス、考え方に影響を受けながら、絶賛模索中です。
おじさんエンジニアの経験がみなさまのよりよい開発ライフに役立つことを祈っております。
ラズパイさんがいる生活



# 経歴とラズパイとの出会い

入社以来いろんな仕事をしてきました。

* PDAアプリ開発(C)
* 自動テストシステム開発(Perl)
* ８ビットマイコンの実装(なぜかアセンブラ）
* 組み込みのお仕事(C)
* Windowsアプリ開発(VC++)
* Androidアプリ開発(Java + NDK)

何屋さんなのか分からない経歴の持ち主ですみません。自分でもわかりません。
ちなみに転職してません。ずっと同じ会社です。


ずっとWindowsで開発してきたけれど
そろそろLinuxも扱えるようになっておいた方がいいかなぁって上司に相談したら、
予備知識もなしにLinuxアプリの業務にいきなり放り込まれました。ちょっと待って。
業務だったので覚えるのでいっぱいいっぱいであまり楽しく仕事できなかったなぁ…。

このお仕事の後はまたWindowsアプリとか組み込みとか色々やってたのですけど、
やっぱりLinuxの勉強しておきたいなと上司に相談したら、
今度は社内で開催されていたWGに入れてくれました。
Linuxのマシンを一人一台用意するのは厳しいので、使われたのがRaspberry Pi。
小さいながらもLinuxのライブラリが使えて、Pythonも勉強できるというのがすごく魅力的でした。

WGが終わって、自宅でもラズパイで色々できたらいいなぁと思っていた頃に発売されたのがRaspberry Pi Zero W。
フリスクぐらいのサイズなのにちゃんとRaspberry Pi OS動く。
しかも$10なので1,000円ちょっとで買えちゃう、ってことで即購入
そうして我が家に来たラズパイさん。
Pythonの勉強も兼ねてあれこれ色々遊びました。

そんなわたしとラズパイの生活についてちょっと綴っていこうと思います。
需要あるか分からないけど。


# Twitterに投稿してみよう！
一番最初にやったのはTwitterに投稿するプログラム作成。


事前準備として以下の作業が必要になります。
　① Twitterアカウントの作成(既にアカウントがある場合は不要)
　② Twitter APIの申請
　③ Twitter APIを使用する際に必要な情報を取得
　　・コンシューマーキー (API key)
　　・コンシューマーシークレーット(API secret key)
　　・アクセストークン(Access token)
　　・アクセストークンシークレット(Access token secret)
　④Twitterを操作するのに必要なライブラリのインストール


わたしが作成した時(2017年)と変わってるので
最新の方法をググった方が良さそうです。


④のライブラリインストールについて、
PythonからTwitterに投稿するためのライブラリはいくつかあり
 その中からTwythonを選びました。
理由は簡単に使えそうだったから…ただそれだけ…。



Twythonについてはこちら
https://twython.readthedocs.io/en/latest/

インストール方法はこちら
https://twython.readthedocs.io/en/latest/usage/install.html#pip-or-easy-install

```
$ sudo pip install twython
```

これでPythonからTwitterに投稿するための準備は完了



さて、準備ができたら
以下のように書いてみましょう
コンシューマーキーなどは③で取得した文字列に置き換えてください。
ツイートしたい文字列はお好みで！

同じ文字列を連続投稿するとエラーが出ることがあるらしいので
もしエラーが出たら文字列を変えてみてください。

```
from twython import Twython

CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_TOKEN = ''
ACCESS_TOKEN_SECRET = ''

api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)

api.update_status(status=weather_str)
api.update_status(status=“ツイートしたい文字列”)
```


以上！
思ったより簡単にできちゃう！


# ラズパイは意外に遊べる！

その後調子に乗って
世界各地の天気情報を天気予報サイトから取得して自動ツイートしたり
カメラモジュールを繋げてタイムラプス動画を作成してツイートしたり
Google AIY Voice KitにAlexaを入れて「おっけーぐーぐる」ではなく「あれくさ！」で反応するようにさせたり
色々と遊んでいるのだけど、その辺りの話はちまちま書いていこうと思います。

ラズパイで何が出来るだろうって思っていたけれど
ラズパイ単体でも色々遊べるし、カメラモジュールを使ったり
Googleからラズパイを使ったスマートスピーカーやカメラのキットが出てたりするので意外に手軽に遊べます。



無理矢理Alexaを入れたのは最初に入ってたGoogle Assistantに申し訳ないことにしたなと反省中…:bow:
ChatGPTの記事を徹底解説（英語が苦手な方向けの日本語での解説記事です）

![ChatGPT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847349/638ef235-71b3-2e38-2ac1-ef75d83f92b1.jpeg)


こんにちにゃんです。
水色桜（みずいろさくら）です。
今回は今（２０２２年１２月現在）話題のAPIであるChatGPTについて、解説していこうと思います。
本記事は英語が苦手な方へ向けたものになっていますので、もし[元の記事](https://openai.com/blog/chatgpt/)がそのまま読める方は、元の記事の方を読んでみてください。（本記事は元の記事以上の情報は提供できません。）

# 本記事のまとめ（お忙しい方向け）

1. ChatGPTは自らの間違いを認めたり、不適切な要求を拒否したりすることができるよ。
1. ChatGPTはコードを自動生成したり、コードのデバッグを行ったりすることができるよ。
1.  ChatGPTは人間からのフィードバックを用いた強化学習を用いてトレーニングされているよ（姉妹版のInstructGPTと同様）（近接ポリシー最適化(Proximal Policy Optimization, PPO)と呼ばれる独自のアルゴリズムを用いているよ）
1. ChatGPTはGPT-3シリーズを元としてファインチューニングされているよ（ChatGPTとGPT-3はAzure AI supercomputing infrastructureでトレーニングされているよ）
1. ChatGPTは正しそうに見えて、正しくないまたは無意味な回答をすることがあるよ（現状この点を改善することは難しいよ）
1. ChatGPTは入力の言い回しに敏感で、少し言い方を変えるだけで適切な応答を返したりするよ。

# ChatGPT

OpenAI社が発表した対話形式で会話できる言語モデル。[ここ](https://chat.openai.com/auth/login)から無料で利用できます。なお今現在（２０２２年１２月）はテストのために公開されているだけですので、今後は利用できなくなるおそれがあります。初めての方はまずアカウントを作成してください。
ChatGPTは自らの間違いを認めたり、不適切な要求を拒否したりすることができます。また、ChatGPTはコードを自動生成したり、コードのデバッグを行ったりすることもできます。ChatGPTは人間からのフィードバックを用いた強化学習を用いてトレーニングされています。（姉妹版のInstructGPTと同様）（近接ポリシー最適化(Proximal Policy Optimization, PPO)と呼ばれる独自のアルゴリズムを用いています。）

# Proximal Policy Optimization (PPO) とは

最先端のアプローチと同等またはそれ以上のパフォーマンスを発揮し、実装と調整がはるかに簡単な最適化手法。その使いやすさと優れたパフォーマンスにより、OpenAIのデフォルトの強化学習アルゴリズムになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847349/ba6572ea-e447-7b48-18b4-59e53d920b2a.png)

PPOは、実装の容易さ、サンプルの複雑さ、およびチューニングの容易さのバランスを取っています。従来のポリシーからの偏差が比較的小さいことを確認しながら、コスト関数を最小化していきます。
PPOに関する詳しい説明はこの記事を参考にしてください。

https://qiita.com/keisuke-nakata/items/87b742bcb09149b6d8d1


# ChatGPTの注意点
ChatGPTは正しそうに見えて、正しくないまたは無意味な回答をすることがあります（現状この点を改善することは難しいようです）また、ChatGPTは入力の言い回しに敏感で、少し言い方を変えるだけで適切な応答を返したりします。もし、望んだ返答が返ってこない場合は言い回しを工夫してみてください。
トレーニングデータの偏りから特定のワードに過剰に反応したりします。

# 終わりに

以上がChatGPTに関する解説でした。元の記事を和訳しただけなので需要があるかどうかはわかりませんが、書いてみました。コードの自動生成の精度はとても高く、もしかしたらエンジニアの職が奪われてしまうかもしれないと思うほどでした。
是非皆さんも使ってみてください。
では、ばいにゃん～。
.NET MAUIを使う利点

# .NET MAUIを使う利点
１．C#が使える
やはり一番のポイントはC#及び.NETの資産が使えるというのが一番でかい。
C#はあのTypeScriptのもととなった言語で言語設計が素晴らしく直感的にプログラミングが書ける。
またLINQやAsync/Await,ReactiveXのように多言語へ大きく影響を与えた素晴らしい言語である。
レガシーでいて先進的
アンダースヘルスバーグ is God
LINQやReactiveXはもちろんASP.NETのリアルタイム通信技術SignalRや機械学習(AI)用のML.NETをそのままモバイルアプリとして実装できるのがC#erである私たちを大いに魅了するものである。
C# is God

２．VisualStudioとの親和性
やはりC#のIDEであるVisualStudioをフル活用して開発できることは大きな生産性を生む。
VisualStudio2022で実装されたインテリセンスの上位機能コパイロットを搭載して驚異のコーディングスピードを取得することができた。
インテリセンスやコードレンズの機能も変わらずコーディングの支援をきっちり行ってくれる。
また.NET MAUIの特別な機能としてAppleDeveloperProgramに登録さえしておけば、Macを購入しなくてもローカルのiPhoneやiPadでデバッグができるので、Windowsの慣れた環境でクロスプラットフォームのモバイルアプリを開発できることは大きな利益を生むだろう。
VisualStudio for MacもCommunity(無料)版が出ているのでMacでも簡単に開発できるようになった。
.NET MAUIの開発でVisualStudioを使わない奴はバカである。

３．ネイティブAPIの機能がすべてそろっている
指紋認証からAR技術まで今現在iOS,AndroidにあるAPIがすべてそろってあり、iOSやAndroidから.NET MAUIへ移行する人でも違和感を感じることなく、開発できる。
このあたりにおいては、ReactNative、Flutterにはない.NET MAUIにおける大きな利点となるだろう。

４．機能の実装はC#、Viewの部分はXAMLで簡単にMVVMができる
C#のGUIアーキテクチャといえばXAMLをView部分に使用したMVVMであろう。
各言語が得意な分野で機能的に動作することで、アプリの維持管理やテストが容易になる。
ChildやChildrenとかもはやアホかと、、、

５．VBやF#などの.NET系の開発言語も使える
今現在はMVUでの実装のみとなるが、.NET系の開発言語VBやF#でも開発できるようになった。
VBは業務アプリでの使用率が高いため、業務アプリをモバイルアプリへ展開するなどかなりの需要がたかまりそう。
F#はコンピューターサイエンス(以下CS)で多く使われ、モバイルアプリの中にCSの機能を盛り込む際、大きな力を発揮するだろう。

６．大規模アプリでの実装例
こちらはXamarinでの使用であるが、.NET MAUIへの移行が進められているのでご紹介
モバイルSuicaやモバイルPasmoなどの交通系ICアプリはXamarinで開発されてある。
交通系ICアプリは2024年以降も必ず使われていくため.NET MAUIへ移行される未来はもはや確定されている。
また2023年春に公開されるモバイルICOCAについてもSuica,PasmoがXamarinのため、.NET MAUIで書かれている可能性がかなり高い。今後期待大である。
その他、AzureやSwitchOnline,紅白アプリやCOCOAにも使われており、やはりネイティブAPIを活用したXamarinらしいアプリが多め。
C#ということでかなり大規模で聞けばどんな会社かすぐ出てくるようなところで開発が盛んな印象である。
逆にFlutterとかどこで使われてんの？？？といった状況である。

# 今後の展望
やはりC#といった特性から今までC#で業務アプリを作ってました～というような会社がそのスタンドアローンなアプリをモバイルに移行するといった用途での需要がかなり高まると思っている。
また、C#はUnityでも使用される言語のため、スマホゲームの補助用アプリ(攻略アプリなど)として.NET MAUIちょっと使ってみるか～な形で各ゲーム会社さんがこぞって使っていくようなそういう未来を夢見ている。
.NET MAUIのコミュニティはまだまだ未成熟なので、情報を発信、共有できるようなプラットフォームを作成し、.NET MAUIをよりよいフレームワークとして機能できるように推し進めていきたい。
ソフトウェアアーキテクチャはハードパーツである

# はじめに
本記事はMDC Advent Calendar 2022の3日目の記事です。
元々は触ったことがないAPIテストツールを触った感想を書こうと思いましたが、理解度がなかなか深まりませんでしたので急遽差し替えました。。

# 本を読みました。
直近で以下の本が出版されました。興味深いタイトルでしたので、予約注文して購入、読みました。

https://www.amazon.co.jp/dp/4814400063

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/b311d049-28fb-6cc6-ad38-c9aec10a270f.png)

# 構成

この本については、出版イベントなのか、翻訳者の島田さんがForkwellのイベントに参加され本の内容を紹介されていました。

https://forkwell.connpass.com/event/265858/

そこで使われたスライドを用いながら紹介と感想を述べていきたいと思います。

- 使われていたスライド

https://speakerdeck.com/snoozer05/20221129-software-architecture-the-hard-parts


この書籍自体は、ソフトウェアアーキテクチャの基礎という書籍に盛り込めなかった内容を元に執筆されているようです。
盛り込めなかったといいつつ、ボリュームはかなりあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/a97a8151-1dbb-b9d3-8b5f-97dc9166597d.png)

書籍の構成は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/da3ee27b-ac55-4b0c-9ff0-06eab1f17363.png)


# 非常に共感する部分

これです。ソフトウェアアーキテクチャはハードである、というところをうまく説明しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/0f17d476-944b-04bf-ee35-afb64bd4b3c6.png)

これは１度、２度システム開発に関わった方であれば、あるあるなのではないでしょうか？
一度作ったシステムであれば、アーキテクチャ変更は大変という話です。コストも時間もかかるのと、それをやる意味はあるのか？という説明責任にちゃんと答えれるのか？みたいな点です。後者は個人開発、趣味開発であればあまり気にしないとは思いますが、仕事でやる場合には、システム開発依頼者（主に事業部門や、依頼元会社）がいてシステム開発するはずなので、そこは大事です。

リファクタリングなども含めた、システム開発、ソフトウェア開発への理解が深ければ、スムーズにいくと思いますが。

つぎに、トレードオフの話です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113217/c5743135-cf80-e7b4-8f6e-03a39df9bcaa.png)

これは私が新人時代からお世話になっている上司からも、トレードオフ、トレードオフと言われ続けてきました。「場合による」というと逃げているように思われるかもしれませんが、結局その通りかなと自身の経験からも感じます。
ビジネス要求や、チーム体制、スキル保有状況と今後開発チームをどのようにしていきたいか、、などにも関わります。
大きめな会社であれば、社内標準というものが定められていることもあるかとは思いますが、標準は標準で理解しつつも、そこを叩き台としてチームでどうして行くのかを考え、検討し、決めるというプロセスが大事なのかな、、と思います。

# まとめ

かなり触りの部分のみで、アーキテクチャの紹介なども何もできませんでしたが、概要の紹介とそこに対する自身の考えを紹介させていただきました。

技術書籍はネット記事に比べて少し古い情報なのでは？と思われる人もいるかもしれませんが、まとめて体系的に理解するには有効かと思いますのでおすすめです。
DoctrineとEloquent比較大全3: レコードをid指定で取得

day3の今日はday2で新規登録したレコードをidを指定して取得するやり方を見ていきます。

## Doctrine

```php
<?php

declare(strict_types=1);

use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;

require __DIR__.'/../vendor/autoload.php';

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';

// id=1のbookを取得
$book1 = $entityManager->getRepository(Book::class)->find(1);

// この書き方でも良い（shortcut）
$book1 = $entityManager->find(Book::class, 1);
```
<https://github.com/77web/doctrine-vs-eloquent/blob/0976b9026f10ba1119c0c576abbbb733d4dda8fc/Doctrine/Usecase/find_one_record.php>

- EntityManagerから `getRepository(Book::class)` によりBookエンティティ用のEntityRepositoryを取得し、EntityRepositoryの `find()` メソッドにidを渡すことでid=1のBookレコードを表すBookエンティティのインスタンスが取得できます。
- ショートカットとしてEntityManagerの `find()` メソッドにBookエンティティのFQCNとidを渡すことでもBookエンティティのインスタンスが取得できます。
- EntityManagerは、一度でも取得・保存されたエンティティのインスタンスを内部で管理していますので、↑のサンプルコードで取得した2つの `$book1` は同一インスタンスとなります（ `===` で比較するとtrueとなる）。

## Eloquent

```php
<?php

declare(strict_types=1);

use App\Models\Book;

require __DIR__.'/../vendor/autoload.php';

$book1 = Book::find(1);
```
<https://github.com/77web/doctrine-vs-eloquent/blob/0976b9026f10ba1119c0c576abbbb733d4dda8fc/Eloquent/Usecase/find_one_record.php>

- Bookモデルのstaticメソッドの `find()` にidを渡すことで、id=1のBookレコードを表すBookモデルのインスタンスが取得できます。
- コード内で複数回 `Book::find(1)` を呼び出した場合、1回目に返ってくる `$book1` と2回めに返ってくる `$book1` は同一インスタンスではありません（ `===` で比較するとfalseとなる）。
抽象度を上げると役に立たなくなる道理

ある事象の抽象度を上げれば、役に立たなくなるのは道理だと思う。　

どんな事象も、抽象度を上げれば、存在するか、存在しないか。１か０になる可能性がある。　

抽象度を上げたら存在しなくなるものは、抽象度を上げたことが役に立たなくなるのか、　
対象物が、今注目している抽象化の観点で役に立たないからのどちらかだろう。　

こうして、抽象度を上げたものが、役にたつか立たないかはわからないことがわかる。　

どんな事象にも、その事象固有の抽象度以上はあげてはいけないという境界値があるのかもしれない。　

# 連続量と離散量　

抽象度を上げるときに、離散量にしてもいいか、連続量のままがいいかは大事である。　

連続量で計算したい値を離散量にして役に立たなくしたことがないでしょうか。　

#  抜き取り検査と全数検査　

抜き取り検査の仕方が、対象物の特性に必要以上に対応していると、測定結果は役に立たない。　

計測はなるべく具体的で、抽象度を上げてはいけない。　

集計結果の分析の際に、いくらでも抽象度を変更して模型を見ることが模擬試験だったりする。　

学会発表などで、どういうデータを示しているのか、わからずに質問してみると、　
ほとんど無駄な測定をされていることがときどきある。　

無駄な測定の抽象度をいくらあげても、役に立たないことはある。　

抽象度を上げるとは、誤差も大きくするかもしれないと思うとよいかもしれない。
Ledger CLIで家計簿をつけたい！入門0 なんでLedger CLIなの?

[←前編](https://qiita.com/kikeg/items/07c2794e226b9ae18205)

# 目的: お金の動きを理解してより良く予算を立てられる

## なんで家計簿がいるのか

このシリーズはLedger CLIという家計簿アプリケーションの解説ですが、そもそもなぜ家計簿をつけるんでしょう?もし仮に上に有界でない任意の金額が湧き出てくる財布を持っているならば、間違いなく家計簿をつけることはないでしょう。意味がないからです。
しかし現実の僕たちには、悲しいかな、有限のお金しか与えられていません。必然的に貯金が少なくないか、支出が多すぎやしないかと思い悩むことになります。
ざっくり言えば、これらの心配に**計量的に**答えられるのが家計簿の強みであり、存在意義であるわけです。

## 家計簿では解決しない問題

勘違いされがちですが家計簿は節約には直接つながりません。家計簿ができることは信頼できるデータを提供することで、支出を減らすのも収入を増やすのも家計簿にはできないことです。そこはご理解ください。

## なんでLedger CLIなのか

### Ledger CLI以外のソリューション

家計簿をつけたい、そう決まったとしてもまだ大事な問いがあります。どうやってつけるかです。私はLedger CLIをおすすめ…したいところですが、正直な話、Ledger CLI以前に2つのすごく簡単な方法があります。まずはそれを試してみると良いと思います。

一つはクレカも何もかも解約して、銀行口座一つとそのデビットカードだけにすることです。口座残高の数字一つだけ見ればいいわけですから、簡単ですよね?しかも何もしなくて良い。ちゃんと管理できる人なら財布に定額入れるだけでもいいでしょう。ただ、iDecoや会社の財形貯蓄、家や車のローン、どうしても口座一つにできないという人には向きません。

次の選択肢がマネージドのサービスです。代表例がマネーフォーワードでしょう。月500円で課金したらとりあえず色々見られて簡単です。

### Ledger CLIの利点

他の選択肢を推してみましたが、私はLedger CLIを使ってます。なぜか、理由を挙げてみましょう。

#### 無料(*)

まずLedger CLIはBSDライセンスでいわゆる「フリーソフト」です。当然タダで使うことはできます。ただ、これだけの理由で使うのはおすすめしません。マネーフォーワードは月500円で使えます。アプリもあればweb UIもある。何も勉強しなくても使えます。一方であなたがLedger CLIを使いこなすまでには、**ほぼ間違いなくあなたの時間という希少な資源が湯水のように消費されていきます**。無料であること以外の魅力に惹かれなければやめたほうがいいでしょう。

### 多通貨対応(要注意)

Ledgerの一つの特徴として、多通貨対応があげられます。よくある自動ツールは日本円のみ対応だったりしますが、私は外国で生活しているので日本円で価値を算出されても困ってしまいます。Ledgerなら米ドルは米ドルのまま、日本円は日本円のままで管理できます。

### 自分の好きにデータを扱える

Ledger CLIは自分なり自分のプログラムなりでテキストファイルを書いて自分のデータを管理していきます。当然、印刷なりGitHubなり好きなストレージで保管できます。サービス終了を恐れる事はありません。テキストファイルの仕様は公開されています。sqliteにエクスポートすらできます。私はGitHubのプライベートレポジトリに家計簿を上げてますが、ソースコードのコミットみたいで割と楽しめます。

あと、マネージドのサービスと違って自分の好きに仕訳（支出や収入の分類と思ってください）ができるのも利点だと思います。何なら、支出を「固定費、ご飯、遊び」に分けたければ分けてもいいし、細かくしたいところは好きに分けられます。お仕着せの項目に分類したくない人にはおすすめです。

### 複式簿記なのでお金の動きがつかみやすい

これは簿記の話で[^1]Ledger CLI固有の話ではありませんが、複式簿記は**不正経理を難しくする**[^2]効果があります。家計簿の場合意図的に不正することはあまりないと思いますが、逆に怖いのは「うっかり」です。故意でなくても単式簿記は簡単にミスが発生します。その点複式簿記で家計簿をつけると「このお金宙に浮いてるな」っていう所謂不透明な資金の流れがくっきり分かるようになります。例えば、キャンセルしたはずなのに返ってきてないお金や、立て替えたのに経費申請してないお金が割と一目瞭然です。

## Ledger CLIの弱いところ

### 学習コストが高い

さっき無料のところで触れた話ですが、金額に換算するとそれなりの学習コストを払う可能性があります。無論、一度払ったら一生使える可能性は高いので投資として考えれば悪くはない気もします。ただ、使って10分で使いこなせないのはやはり弱点でしょう。

### 自動化できない

これはマネーフォーワード等と比べて超弱いところです。アカウントアグリゲーションとかはないので普通に行くと自分で全部書く羽目になります。私は自分でWEB部分を自動化するのは諦めて、代わりにダウンロードしたcsvファイルからLedger形式に読み込むプログラムを自作して使っています。これについても後で紹介宣伝したいと思います。なんならマネーフォワードに課金してcsvダウンロードするのが一番手っ取り早いかもしれません。

# まとめ

Ledger CLIのいい点悪い点を紹介しましたが、この短所長所を見るとやっぱりLedger CLIは**中長期的な戦略を立てる**のには向いているツールと言えるでしょう。

* Ledger CLIが向いてる人は
    * 日々のお金の使い方を事後的に見返したい
    * 全部のデータを自分で管理したい
    * 自分で解析クエリやコードを書きたい
* Ledger CLIが向いてない人は
    * 明日明後日のカード引き落としが間に合うかのリアルタイム解析が必要
    * 最低限の設定でサクッと使えてほしい
    * 自動でうまくやってほしい

ふわふわした話が続きましたが、次回からはガッツリworkshop形式で実際の使い方を解説します。次↓

https://qiita.com/kikeg/items/36c2905bb30148fed9b9

[^1]: 私は簿記持ってないですけど
[^2]: 本当かは知りませんが「複式簿記 不正経理」とかでググったら出てきます。