OmniAICreator/Qiita-1.07M huggingface dataset:
効果的なミーティングの進め方

# はじめに

昨今あまりミーティングそのものが少なくなってきたように思います。 良くも悪くも、前職もふくめ打合せ~打合せ〜と中々席にいることが少なかったような記憶もあります。 生産性の観点から会議・ミーティングなど必要なものに絞りましょうという流れが、 世の中に浸透してきたことによるものでしょう。

数少ない会議・ミーティングにおいても効率よく、効果的な実施が必要であると考えます。

# 目的について

目的は明確にしましょう。
何をしたいからこのミーティングが開かれているのか?が参加者に伝わっていないと、話が発散してしまいます。
参加者においてもこの目的を達成するために開かれているんだという意識をもって参加すべきです。
また、目的については事前に伝えましょう。
参加者は事前に知っておくことでいくつか解決に向けたアイデアを検討することができます。

# アジェンダ・資料の共有

どうしても会議中だけのクローズなものにしたいなど特別な理由がなければ、アジェンダ・資料は事前に配布 しましょう。
資料を当日べらべら説明されてもついていけなくなったり、不明点が積み重なったりと参加者的には 理解に時間がかかってしまいます。
参加する側も、時間の都合はあるでしょうがある程度資料は見ておき、疑問点は説明されることを期待。 説明がなければ質問するなどすることで理解が深まるでしょう。

# 参加者の役割

議事進行・議事録の作成の役割を決めておくのはもちろんのこと。
発言を許可されるような会議の場であれば、発言をきちんとしていくことが大事です。
出席を求められた=何かしらの知見や意思決定を求められているということだと思いますので、
毎回何か話すことがあるかというとそれは別ですが、何かしら発言をしていくという姿勢は出席者としての 役割であろうと思います。

# フォローアップ

議事録等作成後、作業となるようなものはタスクに落とし込みましょう。
JIRAでもTrelloでも何かしら作業として誰かに振ることができるような状態にすることが望ましいです。 
議事録に残っているから〜では忘れ去られることも多いため、きちんとタスクに落とし込むことが大事です。

# 短時間ミーティング

タスク管理関係のミーティングについてはアジャイル的に毎朝スタンドアップミーティングをすると良いと 思います。
もちろんリーダーが積極的に聞き取り進捗管理をするのも、うまくいかないわけではないですが。 
自分の作業に追われるあまり聞き取りする時間が取れず、気づいたら遅滞していた・・・なんてことも。 
毎日積み重ねるようなものは特に短く、短い周期で実施するとよいと思います。

# ツール的な側面

ペーパーレス化により、タブレットやPCで会議参加という方も多いのではないでしょうか?
一方で、議事録がしっかりしていればよいのですが、メモを取って参加される方も多いでしょう。 
PCのテキストエディタなどでメモをとる、手元にメモ帳がありそれに書き込むなどもありますが、やはり資料上に直接書き込むという需要は捨てきれません。(世代にもよりますが) 
PDFファイルに直接書き込みができるようなツールも導入を検討してあげるべきでしょう。 
また、タブレットでの会議である場合は、需要に応じてBlue Toothキーボードを配布するなど、人それぞれ一番参加がしやすい環境を整えられるようにするのが重要だと思います。

# 終わりに

色々と書きましたが、一番は参加する側の意識について私は重要視すべきと考えております。
仕組みをいろいろと用意しても、参加者が前のめりで参加している状態でなければ、 一方的な発信に終わってしまいます。
何か一人1発言必ず行われるようなミーティングの開催方法を行い、何か話さなきゃ!と強制的な開催 方法もありますが、個々人が参集をお願いされ、承諾した自覚をもって参加すべきでしょう。
Docusign eSignature for Salesforceまとめ


+ [Docusign eSignature for Salesforce の概要﻿](https://support.docusign.com/s/document-item?language=en_US&bundleId=psy1581360698967&topicId=ust1581360676021.html&_LANG=enus)

+ [コミュニティ>統合>セールスフォース](https://community.docusign.com/salesforce-30)

# ライセンス

+ [Licences Docusign esignature - Salesforce](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000oFMU0A2)
+ [「Docusign eSignature for Salesforce」がSalesforce AppExchangeに30ドル/ユーザー/月で掲載されているのを見ました。すでに Docusign と Salesforce の両方を使用している場合、すでに支払った金額に加えて、ユーザーあたり月額 30 ドルを支払う必要がありますか?](https://community.docusign.com/salesforce-30/salesforce-integration-price-21379)

:::note
Salesforce または DocuSign から DocuSign for Salesforce をサブスクライブできます。ただし、DocuSign for Salesforce のプランがあります。おそらく、Salesforce 向けではなく通常のプランです。Salesforce にバインドするか、Salesforce チームに使用できるかどうかを確認してください。通常のプランが使用できる場合は、再度支払う必要はないと思います。
:::
コミュニケーションが苦手なメンバーとの向き合い方

# はじめに

コミュニケーションが苦手な人はどうしてもいます。
わたしもどちらかというとそのタイプに近く、あがり症で人前に立つのが怖いタイプでした。 
歳を取るにつれて場数にものを言わせてだいぶ克服したものですが、克服できない人がいるのも確かでしょう。

# コミュニケーションが希薄でも仕事が進められるようになった

最近ではメール・チャットなど文字でやり取りするツールが優れており、口頭・電話などのやり取りが 少なくなりつつあります。
確かに口頭・電話は相手を拘束する必要があり、悪だとされる風潮も広がりつつあります。
ただ、全てを悪だとするのは誤りであり、文章だけのやりとりでトラブルを引き起こすこともあります。
その為、時と場合によって相手とのコミュニケーション方法を変えていくというのが大事となります。
例えば、急ぎの用事は当然としても
* 相手の感情をくみ取りたいとき
* 相手に感情を伝えたいとき

この時は直接コミュニケーションをとったほうがよいと思います。

多分この記事が目に留まった人は、コミュニケーションをとらせるにはどうすればよいか?と悩みがある方は多いのではないかと予測しておりますが、こういったことは当たり前だろと思っているでしょう。

しかし、コミュニケーションが苦手な場合はそもそもこういった場合がどうゆう時かもわからないですし、 いざ話そうとしても言葉が出てこないことがあるため、萎縮してしまい結果至らない。ということもあるでしょう。 
結局苦手なものはトレーニングしないと直らないので、どうやってトレーニングさせるか?が 大事なのだと思います。

# コミュニケーションをとるのは大事だ!とれ!と言うだけでは効かない

これは「ピュアな」 新社会人であれば通じるかもしれません。
ですが、中には良い言い方をすれば信念が強く悲観的なとらえ方をされてしまう人もいてしまうでしょう。
中には是正しやすい期間を逃してしまった人もいるかもしれません。 
この人たちに対して、言葉だけの正論を並べても思ったようには動いてくれないでしょう。 
大体の人はわかっているのですが先の記載から行動に移せないのだと思っています。

# 動機付けをしてあげる必要がある

必要性を説くのではなくコミュニケーションをとる動機付けをしてあげましょう。
これはXXに確認をとって報告してください。 これはXXに必要である旨伝えて用意してもらってください。 など、仕事を進める上で必要な線上に誰かとコミュニケーションを取らざるを得ない状況を社内で作ってあげればよいと思います。

もっと言えば、近くのメンバーか、メールやチャットをあまり使わない・連絡先がわからない人がいいです。 
直接話に行かなければいけない状況を無理やりでも作ってあげましょう。

# 知らない人がいっぱいいるところに飛び込ませる

これは拒否されたらもうどうしようもないのですが、例えばセミナーやカンファレンスの場などが良いでしょう。
ただし懇親会があるものに限ります。
酔っぱらってでも人と話すって楽しいことなんだなというのを感じてもらう場が必要なんだと思います。
他、街コンでもなんでも誰かと一緒に参加してもよいでしょう。(働き方・・・には抵触しそうなので個人的な関係を築けていたらですが)
なんならオンラインゲームでボイスチャットするのだっていいと思います。 
大事なのは何でもいいから人と関わる、言葉を発することだと思います。

# おわりに

色々なセミナーなどで他の人の話を聞くと、逆にアクティブすぎて余計なことをしすぎる。などといった 悩みもあるとのこと。
この悩みは抱えてみたいものですが、そちらの方が是正が難しそうだなと感じます。
会社勤めである以上、自分の役割を理解して、適切な行動をとることができるように成長することが 大事なのだと思います。
「Mac, gcc, vscode」の環境構築で大変難儀したというお話

## 経緯
「MacbookでC++を勉強しよう」
「さすがにいろんな情報があるなあ、さすがC++」

「ぜんっっっっっっっっっっっっっっぜん書いてあるとおりにならんやんけ！」

## 作業環境
* macOS Sequoia 15.1.1
* ターミナルはWarp

## 解決したルート
未インストールの場合、Homebrewをインストール（以下参照）

https://qiita.com/Meycha/items/2a07fcd7920d3c6af4fa

GCCをインストールする
下記ページの4まで進める

https://qiita.com/pinoccio11/items/767a8738d8fa8bba2f81

もし4の`gcc xxx.cpp（g++ xxx.cpp）`でこんなエラーが出た場合、

```
gcc test.cpp 

In file included from /usr/local/Cellar/gcc/14.2.0_1/include/c++/14/x86_64-apple-darwin24/bits/stdc++.h:33,
                 from test.cpp:1:
/usr/local/Cellar/gcc/14.2.0_1/include/c++/14/cassert:44:10: fatal error: assert.h: No such file or directory
   44 | #include <assert.h>
      |          ^~~~~~~~~~
compilation terminated.
```

下記ページを参考に対応する
```
# 筆者注記:もしrmコマンドで"Permission denite"言われたら、頭にsudoをつける
rm -rf /Library/Developer/CommandLineTools
xcode-select --install
```

https://hiramekun.hatenablog.com/entry/2021/12/26/214917

## 自分語りゾーン

### とにかく情報があるようで無さすぎる

C++は今なおゲーム開発現場においてバリバリ現役のプログラミング言語。
かくいう私も「いつかはこれを使ってゲームを作れれば」と夢みては、Elona[^1]のようにインスコしてはアンインスコしてを繰り返していました。
あれから十余年。あと数年寝たら四十路という頃合いで色々[^2]あり、本腰いれて独学でだが勉強してみるか…と、手持ちのMacbookにgccを入れて、動かしてみようということになりました。

**欲しい情報が全然見当たらん……**

とにかく情報量が多すぎる。
良い感じのページが見つかったらWindows向け。
見つけたと思ったら情報が古くて、今では通用しない（言うて数年前やぞ？）

そして極め付けは、前述のエラーである。
```
gcc test.cpp 

In file included from /usr/local/Cellar/gcc/14.2.0_1/include/c++/14/x86_64-apple-darwin24/bits/stdc++.h:33,
                 from test.cpp:1:
/usr/local/Cellar/gcc/14.2.0_1/include/c++/14/cassert:44:10: fatal error: assert.h: No such file or directory
   44 | #include <assert.h>
      |          ^~~~~~~~~~
compilation terminated.
```

**なぁにこれぇ？**

エラーメッセージ内容からぐぐっても、やれああせえこうせえと言うものを片っ端から試すもののうまくいかず。
というか、ああせえこうせえが「この手順でインストールしてコード書けばOK!」というもの。
**それをやってダメだったんですが？**

とにかく原因がよう分からん。
巡り巡っていくうち、たどり着いたのがこれである。
```
sudo rm -rf /Library/Developer/CommandLineTools
xcode-select --install
```

**知らないよこんなの。**

IT業界に勤めて10年以上経ちますが、`CommandLineTools`という概念を初めて知った。
言っても、Macを使うようになったのは2020年頃からだし、開発で使っていたというより自社のメーラーやら勉強会で月に1回開くかどうかレベルだったので、知らなくても当然ではあったのですが……。
あと正直こんなの、立ち上げたら毎回叩くようにしてる`brew update && brew upgrade && brew cleanup`でよしなにしてくれよって思いました。

## 末筆

色々[^2]あって、「どうせだしやった事ないものにも手を出してみよう」と、登録だけはしてあったQiitaに投稿してみました。
長続きするかとか書くことが今後あるかどうかは分かりませんが、同じような悩みをもたれている方が救われればと思い、書き記しておきます。

[^1]: noa氏によって2007年より公開されたフリーウェアのローグライクゲーム。自由度の高さ、豊富なヴァリアント（いわゆるMOD）からくる高難易度さや目的の喪失等々で「遊んでゴミ箱に突っ込んでまたダウンロードするまでがElona」とかなんとか言われている。2024年には続編となる『Elin』もSteamで発売された。
[^2]: 言うほどあったわけではない。"短期で切り上げたやべぇ現場"の事をごまかすために案件面談で使ってきた「予算・人員の削減により終了」というのを、今年下半期で2回喰らっただけの話である。
「科学的根拠に基づく最高の勉強法」を読んで、資格試験の勉強法を考えた

今年を振り返る「なんかかく」アドベントカレンダー 8 日目です。日曜日。夏に投稿マラソンをしましたという話。 こちらは AZ-400 周りの勉強を兼ねて書きなぐった日々の記録となります。

https://qiita.com/e99h2121/items/3e8101a0f727344f9d23

## 科学的根拠に基づく最高の勉強法

[科学的根拠に基づく最高の勉強法 | 安川 康介 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4046067233) という本を読みました。

![](https://m.media-amazon.com/images/I/71CGY6yA5AL._SY466_.jpg)


ノートに書き写す・まとめる、ハイライトや下線を引く という試験勉強は、本当はあまり身に付かないそうです。ならばどうすることが身に付くかというと、「アクティブ リコール」、すなわち 勉強したことや覚えたいことを能動的に記憶から引き出すことが必要らしいです。さっき読んだなー、と思うことを思い出してみてなにも見ずにノートにまとめてみようとする → 出て来たり、出て来なかったりするので、もっかいインプット → まとめてみようとする、、みたいな「細切れの」反復した記憶の引き出しを辿る作業が有効とのことであります。

「科学的根拠に基づく最高の勉強法」はまれに紛れるよくわからんビジネス系啓発本とは異なり、専門のお医者さんが書いています。実験や実データに基づいた理論、「科学的根拠に基づく」点で、IT エンジニア各位にも納得感をもって理解しやすい本なのではと思います。

[科学的根拠に基づく最高の勉強法がガチで良かった話｜牛尾　剛](https://note.com/simplearchitect/n/ncfc2e38f8e8b)
[科学的根拠に基づく最高の勉強法 読書感想文 #勉強法 - Qiita](https://qiita.com/ogatango/items/63db39c492f55f9b2972)


## 資格勉強とは何なのか

勉強の過程で学んだことを記録に残していくと、過程も自分の身となるとは考えたのですが、その際にできるだけそれを「人に教える」つもりでインプットからアウトプットに転換していくことが有効なのかなと思いました。会社の勉強会や発表会も、発表者が一番勉強になってるとか言いますよね。それですね。

藤井棋聖がそう言えばこんなことを言っていたようです。

>「[そうですね。結果ばかりを求めてしまうと、逆にそれが出ない時にモチベーションを維持するのが難しくなってしまうのかな、と思っているので](https://news.yahoo.co.jp/expert/articles/514163393dda70ea2623145602b67d59dfaf627f)。結果よりも、内容を重視して。そうすることで改善していけるところが新たに見つかると思っているので、それをなんとかモチベーションにしてやっていきたいと思っています」

 とのことで「内容」として残せる点で試験勉強と反復アウトプットをうまく組み合わせる方法を模索したいなあと思ったりします。似たような用語出てくると繰り返しても忘れちゃうんですけどね。なんとかエンドポイントとかなんとかゲートウェイとか三文字アルファベットのどうのこうの。
 

## AZ-400 合格した

ということで取り組んだ夏でした。
[AZ-400 合格まで (2024.09) #AZ-400 - Qiita](https://qiita.com/e99h2121/items/00801184d7309b36b933)

資格試験そのものに取り組むことのおもしろさももちろんあると思います。ある意味手段が目的化するんだが、それなりに面白ければいいのかな等々。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/679a7fdf-a59d-7d50-f981-5dc7beea01b6.png)


次は AZ-700、AZ-500 辺りを頑張っています... ネットワークは既存知識がしょぼすぎてあかんです。

以上です～
【Buildrootの思想を理解しよう】Buildrootのビルドエラーの解消の為にパッケージを追加するのは、小手先の解決方

# はじめに

Buildrootで、u-bootをビルドしている時に、次のエラーが発生しました。

```
tools/mkeficapsule.c:18:10: fatal error: uuid/uuid.h: No such file or directory
   18 | #include <uuid/uuid.h>
      |          ^~~~~~~~~~~~~
compilation terminated.
make[3]: *** [scripts/Makefile.host:95: tools/mkeficapsule] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [Makefile:1858: tools] Error 2
make[1]: *** [package/pkg-generic.mk:289: /home/masa/nerves/nerves_system_zynq_ebaz4205/.nerves/artifacts/nerves_system_zynq_ebaz4205-portable-0.0.2/build/uboot-xilinx-v2024.1/.stamp_built] エラー 2
make: *** [Makefile:23: _all] エラー 2
```

これは、Hostで必要なパッケージのビルドでのエラーでした。uuidのライブラリーが足りてないようです。

```
$ ls host/lib/pkgconfig/
expat.pc       libconfuse.pc  liblz4.pc      libzstd.pc            python-3.12.pc
libacl.pc      libcrypto.pc   liblzma.pc     lzo2.pc               python3-embed.pc
libarchive.pc  libffi.pc      libpkgconf.pc  openssl.pc            python3.pc
libattr.pc     libkmod.pc     libssl.pc      python-3.12-embed.pc  zlib.pc
```

たしかに`uuid.pc`がない。

# 疑問

BR2_PACKAGE_HOST_UTIL_LINUX=y
この設定をすれば、`uuid.pc`がビルドされることがわかりました。

このエラーは、以前も出たことがあり、その時は、試行錯誤の末、`BR2_PACKAGE_HOST_UTIL_LINUX=y`を追加していたことがわかりました。

でも、`BR2_PACKAGE_HOST_UTIL_LINUX=y`を追加しなくても、ビルドが成功していた時もあった（これは、make cleanてなかったから残ってただけだったと後で判明）。

そもそも、Buildrootは、パッケージの依存関係を管理していて、必要な時に、`PR2_PACKAGE_HOST_UTIL_LINUX`が自動的にYになるはずではないか？

# Buildrootのパッケージ依存関係の管理

Buildrootは、パッケージの依存関係を管理してます。
make manuconfigの'/'で検索してパッケージを見てみると、
`Selected by [y]`, `selected by [n]`という記述があり、この項目に書かれた条件に一致すると自動的に選択されるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/ebdb97fa-1d68-040d-18d4-dab4304f632b.png)

この情報により、パッケージを追加すると、依存して必要になるパッケージも自動的に追加されるはずです。

`BR2_PACKAGE_HOST_UTIL_LINUX=y`にならないのは、u-bootのパッケージのバグではないか？

# 調査

ubootのConfig.inを調べてみます。
ここに、`BR2_TARGET_UBOOT_NEEDS_UTIL_LINUX`に依存しているという記述が不足しているのではないか？

そしたら、こんな設定を発見！

```
config BR2_TARGET_UBOOT_NEEDS_UTIL_LINUX
	bool "U-Boot needs util-linux"
	help
	  Select this option if your U-Boot board configuration
	  requires util-linux (-luuid) to be available on the host.
	  This is typically the case when the board configuration
	  has CONFIG_TOOLS_MKEFICAPSULE enabled.
```

自動的にutil-linuxが必要かどうか検知できないから、必要な場合は、`BR2_TARGET_UBOOT_NEEDS_UTIL_LINUX=y`としてね。
ということのようです。
b-bootはいろいろなボードがあって、設定によって依存関係が変わり、自動設定が難しいので、このような、アプローチになってると理解しました。

これで解決しました。

# おわりに

- 依存関係によっては、自動的に設定されない場合がある。
- Buildrootの思想からすると、依存するパッケージを自分で見つけて導入する必要は本来ないはず。
- 依存関係に関するビルドエラーが発生した場合、該当するパッケージのConfig.inを調べてみると、解決策が見つかるかもしれない。

Buildrootの思想が理解できるエラーでした。
UbuntuServerにNode.jsをインストール（一撃）

UbuntuServerにNode.jsを入れようとしたら
時間かかったのでポイントを記録することにした。
## 使用サーバー
Ubuntu24.04.1 LTS
## 問題箇所
~~~:bash
sudo apt install -y node.js
~~~
このコマンドでインストールしようとしたけど
「Unable to locate package node.js」
「Couldn't find any package by glob 'node.js'」
と表示されインストールできない。
困った、、、
## Node.jsのインストール方法
### Ubuntu24.04.1 LTS
どのUbuntuServerを使っているのかわからん人は
下のコードをターミナルに入力。
~~~:bash
cat /etc/issue
~~~
本題。
Ubuntu24.04.1 LTSを使っている人ならこの
コマンドで一発解決！
~~~:bash
sudo snap install node --clasic
~~~
念のためにバージョン確認をする。
~~~:bash
node -v
~~~
~~~:bash
npm -v
~~~
いずれも
「v20.18.1」「10.8.2」
と表示されて無事インストール完了！
ホームディレクトリに戻って、以下のコマンドを入力
~~~:bash
ls
~~~
snapが作られているはずです。
アジャイル(風味な) プロジェクトの進め方

# はじめに

昨今というかだいぶ前からアジャイル開発でやるべき風潮がありますが、 BtoBのシステム開発を行っている方にとって、契約や顧客との協議の現実的な頻度によって取り入れは難しいということはあります。 
そのような中でもアジャイルのエッセンスを使用して、より効率的な進め方をするというのは良いことですので、その実践例をいくつかご紹介できればと思います。

# プロトタイプの作成

いわゆる試作機を作成して・・・というところです。
これは業界によっては当たり前に行われていることだとは思いますが、システム開発においては あまり取り入れていないところもあるのではないでしょうか?
昨今はいろいろと簡単に作成できるフレームワークが増えてきており、このあたりが取り組みやすくなりました。
どんなことをするかというと、ほとんど紙芝居で、実際の業務ロジックは組み込まず、画面遷移、どこでどのように入力を行うのか?どのような表示が行われるのか?など形だけ作っていき、完成品のイメージを共有します。 
これにより後々のイメージ相違による手戻りの発生リスクを抑えることができます。 
また、形だけとは言え若干実装することとなりますので、後にかかってくる工数を先に持ってくることができるというメリットもあります。

# 分割したデリバリー

一気に開発完了までもっていくのではなく、いくつかの期間に分けてその期間内で実装する機能を決めます。
(リリースするというわけではなく)
これにより、中期的な目標を持ちながら進めることができるため、自身がどの程度進められているかを 開発者自身も意識することができます。
絶対優先の機能から取り組むことにより、スコープの調整などにも多少ゆとりを持たせることも可能です。
とはいえスコープの調整は絶対不可という場合がありますので、これはプロジェクトによると思います。

# CIの導入

自動ビルド・自動テストなど成果物を定期的に検査する仕組みを設けることによって問題の早期発見をする ことができます。
他、静的解析などもこれにあたります。
このあたりは[GitLabで記載した記事](https://qiita.com/jun2/items/f1af6bda46d8d7a057bb)もご参考ください。

# スタンドアップミーティング
毎日短時間で昨日の実績・今日の予定・現在抱えている課題などを共有します。
PM的な意味よりは超短期的な目的意識を持たせるというところに有用性を感じています。

# プロジェクト管理ツールの活用

JIRAやTrelloなどを使用し、タスク管理および進捗率を可視化できるため、遅滞の発生を検知しやすくなります。 
逆に余力を見ることができるため、遅滞のフォローをどの程度充てることができるかなどにも役立ちます。
とはいえ、進捗報告の場は個人的にはあったほうがよいと思います。
自分の状況を整理して発する必要があるため、強制的に自分の立っている場所がわかるためです。 
この辺はある程度任せてしまってもできる人もいますし、メンバー次第でしょう。

# おわりに

なかなかウォーターフォール型の開発から脱却できない!と頭を悩ませる方は多いと思いますが、 自社内で完結できる範囲であればある程度取り組みはできると思います。
できないところを変えようと悩むのではなく、どこなら取り組むことができるのか?に頭を悩ませてはいかがで しょうか?
逆再生の物理

# 1. 導入
人間には不可能なスーパージャンプをしたり、破けた紙が修復されたり、口の中から新品のパンが出てきたり、バケツが地面の水を一滴も残さず吸い上げたり、逆再生動画は不思議で面白いですよね。現実ではありえない現象が逆再生動画では見られます。しかしいったいどうして現実ではありえない現象が逆再生動画で見られるのでしょうか？逆再生動画を逆再生たらしめているのは何なのでしょうか？この記事では逆再生動画内の物理法則を考えて逆再生動画を逆再生たらしめている物について考えていきます。

# 2. 時間反転
物理を使って逆再生動画を表現してみましょう。
普通再生→逆再生　では時間の進む向きが反対になるべきです。

$t → -t$　

とすれば時間の向きが逆転します。
    普通再生の物理の式の$t$に$-t$を代入すれば逆再生の物理法則がわかります。
この$t → -t$の操作を時間反転といいます。
# 3.　定義

$x'(t)$を定義します
$x'(t):=x(-t)$
x'が逆再生時の位置です

$v'(t)$を定義します
$v'(t):=\frac{dx'(t)}{dt}$
$v'(t)$が逆再生時の速度です

$a'(t)$を定義します
$a'(t)=\frac{d^2 x'(t)}{dt^2}$
$a'(t)$が逆再生時の加速度です
# 4.　逆再生時の物理量
位置、速度、加速度に$t → -t$します

位置
$x(t)→x(-t)=x'(t)$
速度

$v(t)→v(-t)=\frac{dx(-t)}{d(-t)}=-\frac{dx'(t)}{dt}=-v'(t)$

速度は-1倍されます。
右に進んでる物体を逆再生したら左に進むので納得いきます。

加速度

$a(-t)=\frac{d^2 x(-t)}{(d(-t))^2}=\frac{d^2 x'(t)}{(dt)^2}=a'(t)$

加速度は変わらないようです。

# 5. 代入しよう！

空気抵抗

$ma=-kv$など

時間反転すると

$→ma'=-k(-v')$

$\Leftrightarrow ma'=kv'$

従って普通再生と異なる式になります。
逆再生時は空気があると進行方向に加速するようです。

摩擦力

$f>0$

$F=-f\frac{v}{\lvert v \rvert}$（力の向きが$-v$）

$f$が$v$によらないなら時間反転で

$→F=-f\frac{-v'}{\lvert -v' \rvert}$

$\Leftrightarrow F=f\frac{v'}{\lvert v' \rvert}$

普通再生の時と異なる式になります。
同様に逆再生時は進行方向に加速するようです。
# 6.　反発係数の式

$t_1<t_2,e\leqq1$,ただし$t_1$は衝突直前、$t_2$衝突直後の時間である

$v(t_2)=-ev(t_1)$

時間反転すると$t,v$はマイナスがかかるので
$→$
$-t_1<-t_2$

$-v'(t_2)=ev'(t_1)$

$\Leftrightarrow t_1>t_2$ 
($t_1$の方が大きくなったので$t_2$は衝突直前$t_1$衝突直後の時間になった。)

$v'(t_1)=-\frac{1}{e}v'(t_2)$(衝突前後に合わせて$e$で割った。)

逆再生時の反発係数は$\frac{1}{e}\geqq1$になるらしい！

$\frac{1}{e}\geqq1$ですから$e\neq1$の時普通再生と異なる式になります。

# 7. 式が変わらない例
$F=F(r)$（力が$r$とか定数とかにしか依らない時）
$F(r)=ma$
$→F(r')=ma'$
で式の形が変わりません。
当てはまる例として、万有引力、クーロン力、調和振動子などが挙げられます。
# 8. 考察
逆再生の式が普通再生の式と異なる例を挙げてみましたが、すべて熱や音を出す現象でした。熱や音を出さないで式が変わる例は思い浮かばなかったため、逆再生を逆再生たらしめているのは熱や音を出す現象なのではないかと考えました。
PythonのSeleniumによるスクレイピング備忘録

ブラウザはChrome、OSはWindows、Pythonのバージョンは3.13.0です。ipynbファイルで実行します。

## 事前準備
まず、WebDriverをダウンロードします。
https://googlechromelabs.github.io/chrome-for-testing/

サイト内のリンクをコピペし、WebDriverをダウンロードします。
![スクリーンショット 2024-12-07 234319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890153/87078123-4b11-ebe2-60b1-988f267527e0.png)

zipファイルを解凍するとclomedriver.exeがあるので、それを作業ディレクトリに配置し、pipコマンドでSeleniumをインストールすれば準備OKです。

## 主要な操作
```py
from selenium import webdriver
```
こちらでSeleniumをインポートしているものとします。

---
### ブラウザの立ち上げ
```py
browser = webdriver.Chrome()
```

---
### ブラウザを閉じる
```py
browser.quit()
```

---
### URLを指定
```py
browser.get("https://qiita.com/")
```

---
### HTML要素を取得
```py
from selenium.webdriver.common.by import By

elem = browser.find_element(By.CLASS_NAME, "style-1gmi769")
```
By.IDやBy.NAME、By.TAG_NAMEなども可能。取得するタグがタグを包含している場合、find_elementsを用いる。

---
### inputタグなどに値を送信
```py
elem.send_keys("Python")
```
↓実行結果
![スクリーンショット 2024-12-08 005145.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890153/c9647495-bc2b-8f71-1a21-78f8a4994fa5.png)

---
### キーを押す
```py
from selenium.webdriver.common.keys import Keys

elem.send_keys(Keys.ENTER)
```

↓実行結果
![スクリーンショット 2024-12-08 005941.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3890153/23808517-bcf3-1283-b7fa-15c34cd27d29.png)

Keys.TAB、Keys.SPACEなども可能。

---
### button要素をクリック
```py
elem2 = browser.find_element(By.CLASS_NAME, "style-g8id1y") # button要素を取得
elem2.click()
```

---
### 要素をstr型で取得
```py
elem3 = browser.find_elements(By.CLASS_NAME, "style-1eiv6gj") # 検索結果に表示された記事たち
elem3[0].text # 一番上の記事
```

↓出力
>'[Python] Python（パイソン）とは？'

---
Macでgit のローカルリポジトリまで一気に移動＋vscodeで開く（ghq + fzf）

# ghq と fzf を使ったリポジトリ管理の効率化

この記事では、`ghq` と `fzf` を使って、Git の作業フォルダを簡単に管理・移動する方法をご紹介します。特に、複数のリポジトリを扱う場合に非常に便利です。

## 前提

- `fzf`: あいまい検索機能を提供するツール（要インストール）
- `ghq`: Git リポジトリの管理ツール（要インストール）

## 手順

### 1. `ghq` と `fzf` をインストール

まず、`ghq` と `fzf` を Homebrew でインストールします。

```bash
brew install ghq fzf
```

### 2.git の作業フォルダを登録
下記コマンドで~/.gitconfigに追記されます。
```bash
git config --global ghq.root /Users/HOGE/src
```
### 3.zshrc か bashrc に以下を追記
```bash
cdrepo() {
  local repodir=$(ghq list | fzf -1 +m) &&
  echo 以下のディレクトリに移動します : $(ghq root)/$repodir
  if [ -n "$repodir" ]; then
   cd $(ghq root)/$repodir
  fi
}
vsrepo() {
  local repodir=$(ghq list | fzf -1 +m) &&
  echo vscodeで以下を開きます : $(ghq root)/$repodir
  if [ -n "$repodir" ]; then
   code $(ghq root)/$repodir
  fi
}
```
### 4.上記設定を即時反映
どちらかで（3.で書き換えた方のファイルを指定すれば）OK
```bash
source ~/.zshrc
source ~/.bashrc
```
## おまけ
- fzf は指定した結果を標準出力してくれるのが便利。他のコマンドに結果を渡せるので、他の目的にも使える。

以上
プロジェクトごとにVim環境分けたくてコンテナでやってみた

普段、Vimを使った開発を行っている中で、複数の開発プロジェクトを1つのVim環境でやっていくことが辛くなりもっと効率化できないかを常々考えてました。

例えばVSCodeにはRemote Container機能がありますが、それと同じような、プロジェクトごとに独立したワークスペースの中でVimでコーディングできないか、開発環境作りを模索しています。

ある程度方式が固まり落ち着いてきたので、共有 & 記録として投稿します。

# 求めたこと
自分の開発環境を作るにあたってこれらのことを必須要件として、開発環境を整備しました。

- 普段Macなので、Macで使えること
- プロジェクトごとに環境を分けられること
- プロジェクトごとで利用する開発言語のLanguage Serverを使用できること
- 各プロジェクトのリポジトリに何かこのためにファイル追加したりしないこと
- 使い捨てられること

# 作った開発環境
![vim_workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/c6d446e8-a0b5-5faf-c0b3-4b6461161712.png)

ソースコードはこちら。

https://github.com/mmclsntr/coding-env 

# ポイント
## 1. コンテナ上にVimを立てる
プロジェクトごとに環境を分けて独立させたいということで、コンテナでワークスペースを作るのがやはり良いと考えました。プロジェクトごとに作成し、また、不要になったらすぐに使い捨てられるようにしました。

開発時は、プロジェクトごとに作成されるワークスペース用のコンテナイメージを起動し、そのコンテナ内にソースコードのディレクトリをマウントしています。

## 2. 設定ファイルで初期設定
ワークスペース用にプロジェクトごとのコンテナイメージを作ります。そのビルドの際にプロジェクトに合わせた開発環境をセットアップするよう `setup_config.json` というconfigファイルを指定するようにします。

configファイルには開発言語を指定するようになっており、例えばPythonプロジェクトであればそれを指定することでPythonの環境とLanguage Serverが入ります。


## 3. 言語のインストールや各種コマンドの管理はasdfで
「asdf」で全て管理するようにしています。

https://asdf-vm.com/

## 4. クリップボードをホスト環境と共有
X11で繋げば、コンテナ内のVim上でヤンクした内容をホスト側でペーストしたり、逆にホスト側でコピーした内容をコンテナ内のVim内にペーストできるようになります。なので、MacでXQuartzを立ち上げてVimを使用するようにしています。

参考: 
https://blog.zoe.tools/entry/2017/07/24/220515
https://qiita.com/m-tmatma/items/944237003fc2d6182eca
https://qiita.com/fu-a-sak/items/1946c3b9f0e15d56e817

:::note warn
しばらく経つと共有できなくなることがあり、これがなぜなのか調査は必要。再度両方立ち上げ直したら有効化される。
:::


# いろいろな制約
今は自分のコーディング状況やプロジェクトの状況にフィットさせているため大きく問題はないですが、現状さまざまな制約があり、より柔軟な環境構築のために将来的には解消したいものがいくつかあります。

1. vimrcは固定
    - わたいのお手製のvimrcのみが利用可能となっている状況ですが、特定のプロジェクトでvimrcを変えるというケースにも対応しておきたい。
2. 対応する開発言語が限られている
    - 今はPythonやJavaScript、Go言語など、普段使うような言語のみ対応している状況。もう少し増やしたい
    - 未対応の開発言語については、Language Serverが使えない状況


# 今後
一旦、今の形に落ち着いており、割といい形になったと個人的には思ってます。

ただ、今は各ワークスペースごとにコンテナイメージを作るようになっているためプロジェクトの数が増えるとその分イメージが作成され、ストレージが逼迫してしまいます。マルチステージビルドを使ってイメージ単体の軽量化は行ってはいますが、イメージの共通化などを進めたいです。

そして、[Dev Container](https://containers.dev/)を活用する手も考えましたが、少し複雑になる印象があったため、一旦避けました。もう少し理解深めてこれを活用することも考えていきたいですね。

完全に自前でこういうの作ってみましたが、すでにこういうのあるよーとか、ここはこうしたらいいとかアドバイスありますと嬉しいです。コメントお待ちしております。
Next15 `Route "*" has an invalid "GET" export:` エラーが出たら第二引数をPromiseにする

Next15で `Route "*" has an invalid "GET" export:` エラーが出たら、
第二引数をPromiseにすると直ることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181210/6fe1873f-83d4-c6f2-68c2-fd514c5dae7f.png)

修正前
{ params }: { params: { username: string } }
↓
修正後
{ params }: { params: **Promise\<** { username: string } **>** }


```route.ts
export async function GET(
  req: NextRequest,
  { params }: { params: Promise<{ username: string }> }
): Promise<NextResponse> {
    // ...
}
```
Promiseを返す関数がawaitかcatch()されてなかったらエラーにするESLint rule

個人的にはUnhandled Promise Rejectionでnodeプロセスを終了させたくない場合は
`process.on('unhandledRejection')` イベントをハンドルすると良いと思う。

それとは別に、意図しない処理を洗い出すのに役立つのでUnhandledなPromiseがあったら見つけるESLintルールを用意してみた。

```js
const ts = require('typescript');
module.exports = {
  meta: {
    type: "problem",
    docs: {
      description: "Ensure promises are handled with `await` or `catch`",
      category: "Possible Errors",
      recommended: true,
    },
    schema: [],
    messages: {
      unhandledPromise:
        "Promises must be handled with `await` or `.catch()`.",
    },
  },
  create(context) {
    const tc = context.parserServices.program.getTypeChecker();
    function isTypePromise(t, sym, visited = new Set()) {
      if (visited.has(t)) return false;
      visited.add(t);
      const symbol = t.getSymbol();
      if (symbol === sym) return true;
      if (t.isUnionOrIntersection()) {
        return t.types.some(subType =>
          isTypePromise(subType, sym, visited));
      }
      const baseTypes = t.getBaseTypes?.();
      if (baseTypes && baseTypes.some(base =>
        isTypePromise(base, sym, visited))) {
        return true;
      }
      const typeArgs = t.typeArguments;
      if (typeArgs && typeArgs.some(arg =>
        isTypePromise(arg, sym, visited))) {
        return true;
      }
      return false;
    }
    function isPromise(node) {
      const tsNode = context.parserServices.esTreeNodeToTSNodeMap.get(node);
      const type = tc.getTypeAtLocation(tsNode);
      const promiseSymbol = tc.resolveName("Promise",
        tsNode.getSourceFile(), ts.SymbolFlags.Interface, false);
      if (!promiseSymbol) {
        return false;
      }
      return isTypePromise(type, promiseSymbol);
    }
    function hasCatchInChain(callNode) {
      let currentCall = callNode;
      while (
        currentCall &&
        currentCall.type === "CallExpression" &&
        currentCall.callee.type === "MemberExpression"
      ) {
        const methodName = currentCall.callee.property.name;
        if (methodName === "catch") return true;
        if (currentCall.callee.object.type === "CallExpression") {
          currentCall = currentCall.callee.object;
        } else {
          break;
        }
      }
      return false;
    }
    return {
      ExpressionStatement(node) {
        const { expression } = node;
        if (
          expression.type === "CallExpression" &&
          context.parserServices &&
          context.parserServices.program
        ) {
          if (isPromise(expression)) {
            if (node.parent && node.parent.type === "AwaitExpression") {
              return;
            }
            if (!hasCatchInChain(expression)) {
              context.report({
                node,
                messageId: "unhandledPromise",
              });
            }
          }
        }
      },
    };
  },
},
```
KUSOを消す落ちものクソゲー

この記事は[クソアプリ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kuso-app)8日目の記事です。

# 作ったものはこちら

https://github.com/frappuccino2316/kuso-tetris

# 概要

テトリスがしたいなと思ったので、PythonとPygameを使って落ちものパズルを作りました。
ただせっかくのクソアプリなので、**KUSO**の文字を揃えて消していくようにしました。

添付したGIFの通り、**KUSO**の文字が縦か横のどちらかに揃うと消えます。

![クソアプリ_gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521898/b69713e1-227b-e1a4-dcd1-e583f5eeca83.gif)

# 頑張ったポイント

単純に横一列揃ったら消すテトリスとは違い、縦横で隣り合う3マスの内容を確認した上で**KUSO**が完成していたらその文字を削除し、残った文字を下に詰めるという処理が意外と複雑で苦労しました。

```python
def clear(original_grid):
    new_grid = original_grid
    for row_index in range(len(original_grid) - 1, 2, -1):
        for i, cell in enumerate(original_grid[row_index]):
            # 縦列の判定
            if original_grid[row_index][i] == "K" and original_grid[row_index - 1][i] == "U" and original_grid[row_index - 2][i] == "S" and original_grid[row_index - 3][i] == "O":
                new_grid[row_index][i] = ""
                new_grid[row_index - 1][i] = ""
                new_grid[row_index - 2][i] = ""
                new_grid[row_index - 3][i] = ""
            elif original_grid[row_index][i] == "O" and original_grid[row_index - 1][i] == "S" and original_grid[row_index - 2][i] == "U" and original_grid[row_index - 3][i] == "K":
                new_grid[row_index][i] = ""
                new_grid[row_index - 1][i] = ""
                new_grid[row_index - 2][i] = ""
                new_grid[row_index - 3][i] = ""

            # 横列の判定
            elif i > len(original_grid[row_index]) - 4:
                break
            elif original_grid[row_index][i] == "K" and original_grid[row_index][i + 1] == "U" and original_grid[row_index][i + 2] == "S" and original_grid[row_index][i + 3] == "O":
                new_grid[row_index][i] = ""
                new_grid[row_index][i + 1] = ""
                new_grid[row_index][i + 2] = ""
                new_grid[row_index][i + 3] = ""
            elif original_grid[row_index][i] == "O" and original_grid[row_index][i + 1] == "S" and original_grid[row_index][i + 2] == "U" and original_grid[row_index][i + 3] == "K":
                new_grid[row_index][i] = ""
                new_grid[row_index][i + 1] = ""
                new_grid[row_index][i + 2] = ""
                new_grid[row_index][i + 3] = ""

    # 消えた分を下に詰める
    dropped_grid = [[""] * len(original_grid[0]) for _ in range(len(original_grid))]
    for i, _ in enumerate(original_grid[0]):
        # 縦列の空白じゃない値を全て集める
        columns = []
        for j in range(len(original_grid) - 1, -1, -1):
            if new_grid[j][i] != "":
                columns.append(new_grid[j][i])
        
        for index, t in enumerate(columns):
            dropped_grid[len(new_grid) - 1 - index][i] = t

    return dropped_grid
    
```

# クソポイント

1. まれに**KUSO**が消えない、もしくは消えるのにタイムラグがある
1. 入力から画面へのアウトプットのレスポンスが遅い
1. 文字の認識がしずらい
1. スコアも表示していないので、目的を持ってプレイできない

など、改善点ばかりになってしまいましたが、時間があればちょこちょこ原因の調査と修正はしたいと思います。

# 最後に

この記事を書いてて気づきましたが、これテトリスじゃなくてぷ●ぷよじゃん、、、

# 参考

https://www.pygame.org/news
NewRelic初心者が資格試験を通じて学んだこと

こんにちは。クロスマートでSREをしている「たるたるくん」こと長野(ながの)です。

こちらクロスマート・テック Advent Calendar 2024の8日目の記事です。

https://qiita.com/advent-calendar/2024/xmart

さて、自分はクロスマートに10月に入社したのですが、SREとしてジョインしたので、SREのベストプラクティスなどを社内の勉強会で紹介させてもらったところ、それを機にNewRelicを触るチャンスに恵まれました。

:::note info
当社ではNewRelicの他にもDatadogも利用しているのでどちらを深堀りしていくか悩まみましたが、すでにサードパーティ製のモニタリングツールを導入している人に相談したところ、選定のポイントは好みによる部分が大きいが、課金体系は注意したほうが良いとアドバイスされました。

ざっくり課金体系の比較をしてみると以下になります。

■ NewRelicの課金体系：管理ユーザの人数(機能はフルに使える)＋ログ容量
■ Datadogの課金体系：機能単位の従量課金(必要な機能を選択して使える)＋ログ容量
:::

当社の状況を考慮すると現状では管理ユーザの人数が増えるケースはあまり考えられないですが、開発規模が拡張することは大いにあると考えられます。そうなると、開発規模が増えることで従量課金されるDatadogよりはまずは利用人数での課金体系であるNewRelicの方がコスト面からもとっつきやすそうです。

ということでNewRelicを触ってみるのはありかなと考えました。

ただ、自分はこれまでNewRelicを触ったことがなかったので、いきなりNewRelicのコンソールを見ても多機能すぎて何ができるかわかりません。どうしようかと考えていたときに、社内でNewRelicのメルマガを共有してもらい、その中に資格試験のことが書かれていたので、資格取得をしつつNewRelicの概要を学ぼうと資格試験にチャレンジしてみました。

## New Relic Full-Stack Observability認定試験の概要
以下のURLからアクセスでき`無料で受験`できます！

https://learn.newrelic.com/full-stack-observability-exam-jp

出題範囲については、上記URLからの引用ですが以下のように記載がありました。

```
New RelicのFull Stack Observabilityに関する知識を
テストでお試しください。出題範囲は以下の通りです。

バックエンド 
フロントエンド 
インフラストラクチャ
アラート

80%以上正解で、合格となります。 
```

実際にテストを受けてみた者として言える範囲で共有できることとしては、、、
- 全部で28問ある
- 毎回同じ問題が出る
- 5回チャンスがある
    - 5回連続で不合格となった場合は、1ヶ月の待機期間が適用され、その間は新たに受験することができません

なので1回目がだめでも勉強を続ければ合格にたどり着ける、ということです。

自分もなんとか合格にたどり着けました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/5a8926c9-0a28-b2a2-aeef-f3c82536da31.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415280/33ac9c27-631e-72c3-c9e4-e1ca07fd3f1b.png)


## 資格試験を通じて学んだこと
自分はNewRelicについては初心者ですが、SREの知識についてはこれまでの経験からそれなりに理解しているつもりでした。オブザーバビリティやSLOなどです。

一方で今回の試験はすごく具体的な内容になっていたのでNewRelicでSREのベストプラクティスを実践するには、何をどのように設定すればいいのか、という点を問われました。

なのでNewRelic初心者にとってはかなり難解な内容でした。

また試験結果はスコアのみ提示されるのでどこが正解だったか、どこを間違っていたかがわかりません。そのため問題文をそのまま検索してNewRelicのドキュメントにたどりつき、その中から正解を探していくというような勉強を全28問に対して実施しました。

その結果、出題範囲にある機能の概要を網羅できたのはとても勉強になりました。とくに今回の勉強で発見があったのは以下の3点です。

1. オブザーバビリティがあるシステムにするために必須である`分散トレーシング`は、NewRelicではAPMエージェントを入れることで実現することが分かりました。これにより「サービスがなにか遅い」という漠然としたエラーが発生しても、どこでなにが遅かったのかを把握することが可能になります。
1. 「サービスがなにか遅い」という事象が発生した際の分析の方法もテストでは問われたのでこの辺りを見るべきなんだなという知見も得られました。
1. 外形監視や実際のユーザーが体験していることをモニタリングするRUM(リアルユーザーモニタリング)など、フロントエンドを監視する機能も充実していることが分かりました。


## 実際にやっていく！

NewRelic初心者だった自分が資格試験を通じて、NewRelicを`完全に理解した`わけですが、資格試験に合格しておしまいではありません。

自分の目標はSREのベストプラクティスをNewRelicを通じて、社内に浸透させてサービスをより良くしていくことです。

引き続き、その目標に向かってまずはNewRelicを`チョットデキル`ようになっていきたいと思います。
オンプレミスデータゲートウェイ(強そう)を使ってみた

## 緒言
オンプレミスデータゲートウェイの語感を強そうと感じる程度の素人ですが、社内の基幹システムデータが格納されている**AWS上のOracleやPostgresとPower BIを接続するためオンプレミスデータゲートウェイ(以下ODG)を使ってみました**。

本記事はLearnや参考記事をベースに手順を整理したものです。素人の私でも簡単にできました、と言いたいところですが完全に理解して使えている感覚はありません。。。注意点や間違い等何かありましたらご指摘いただけると幸いです。


主に参考にさせていただいた記事は下記になります。
[オンプレミスのデータ ゲートウェイ - Power BI | Microsoft Learn](https://learn.microsoft.com/ja-jp/power-bi/connect-data/service-gateway-onprem)
[AWS RDS(PostgreSQL)とPower BIを接続してみた #PowerBI - Qiita](https://qiita.com/t-taku/items/cc9b06a16c91abaea929)

## 方法
### Step1 ODGのインストール
[こちら](https://learn.microsoft.com/ja-jp/data-integration/gateway/service-gateway-install)に従ってODGを利用したいネットワーク上にインストールする。利用者の個人PCでも良いし、ネットワークにアクセスできるウェブサーバーでも良い。

### Step2 Power BIとの接続
下記の手順に従って接続を追加する。
[ゲートウェイのデータ ソースの追加または削除 - Power BI | Microsoft Learn](https://learn.microsoft.com/ja-jp/power-bi/connect-data/service-gateway-data-sources)

#### Oracleの場合
下記公式ドキュメントがあり簡単に接続可能。
[データ ソースの管理 - Oracle - Power BI | Microsoft Learn](https://learn.microsoft.com/ja-jp/power-bi/connect-data/service-gateway-onprem-manage-oracle)

#### Postgresの場合
Connection typeでPostgresSQLを選択してもエラーが出てしまいエラーメッセージに表示されるドライバーをインストールしても解消されなかった。[こちらの記事](https://qiita.com/t-taku/items/cc9b06a16c91abaea929)を参考にさせていただき、ODBCドライバーをインストールしてODBC経由で接続することに。
ODBCドライバーは[こちら](https://www.postgresql.org/ftp/odbc/releases/)から入手してインストール。

ODBCで必要情報を入力して設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/3c9abdc3-5f65-0a71-c9d5-d430aeb92eb3.png)

Power BI Desktopでの接続については[前述の記事](https://qiita.com/t-taku/items/cc9b06a16c91abaea929)に記載あるが、Power BIサービスでも接続可能。Power BIサービスを開き、接続設定へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/98719be3-3eb6-759b-f824-86aec54df9f6.png)

新規作成にてConnection typeをODBCにしてConnection stringを`dsn=ODBCで設定したデータソース名`にすればデータフローでも利用可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/927d236a-b69c-e512-e115-170ad668c136.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/31c85f82-c7c8-923c-8b67-4d7853b431a1.png)

## 結言
主に公開記事の手順を並べただけの記事ですが参考になれば幸いです！
AWSなのにオンプレミスデータゲートウェイって一般的なオンプレミスの意味ではなく、Microsoftクラウドサービス外って意味の理解で良さそう（たぶん）。大事なデータを触りだしたのでローコードだけでなく基礎的な部分から勉強したいと思っている今日この頃。
VSCodeの拡張機能Github Pull Requestsでブラウザ不要のPRレビューとフィードバック反映

ぼっちアドベントカレンダー1週目にしてネタが尽きてきていますが頑張ります……。

今回は便利なVSCodeの拡張機能の紹介です。
特にGithubを使ってコードレビューをやってるチームにはかなりおすすめです。

GitHub Pull Requests

https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github

名前もズバリなのですがGithubのPull Request（以下PR）を出す、または他人のPRを、ブラウザを開くことなくVSCode上でコメントしたり確認したりすることのできる拡張機能です。

実際の画面を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/4833bed5-e1fe-c46f-cbe2-f7cf87b91a2e.png)

参照しているのは [radix-ui/primitives](https://github.com/radix-ui/primitives) です。

例えば自分がレビュアーにアサインされているPRは「Waiting For My Review」か「Assigned to Me」に表示されます。
その他すべてのPRは「All Open」にズラッと並びます。

また、PRにレビュアーやレビュイーのコメントがある場合は、左のPRの該当ファイルの右端にコメント絵文字が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/051b44fa-97b7-8f27-d566-792bc3e1bfc9.png)

実際にコメントを見るには、差分として表示されるファイル（右側のコード）の行にコメントマークがあるのでそれをクリックすると表示されます。
さらに、このUIからコメントを追加・修正・削除することもできます。

さらにさらに、自分の作業ブランチに対するPRのコメントは、 __このPR画面を開かずともファイル編集画面にコメントが表示されますので、どのファイルのどの行にどのようなフィードバックがあったかを見ながらコード修正が可能なのです。__ これマジで便利です。

## Github Enterpriseでは使用できないらしい

こんなに便利なのに拡張機能のレビューが星3ちょっとなのにはGithub Enterpriseで使えないせいのようです。

かなり有用な拡張機能なので他の方も色々使い方を残してくださってます。
ぜひ以下も参考にしてください。

https://qiita.com/nsadam5070/items/ca7b311d21f7e4d99f7b

https://qiita.com/kazumacchi/items/1c81bc8614e4da92764a

https://zenn.dev/nobitel/articles/9fa696cfb6c3bd
Macのバックアップ(TimeMachine)をSambaにする

## 動機
Macのバックアップを共有ディスクにできないかと調べ始め、やってみたくなった。
が、詰まったので備忘録を兼ねて記事に。

## 環境
- サーバ
    - ubuntu 22.04 on Proxmox
    - CPU: 4core
    - RAM: 8GiB
    - HDD: 170GB
- Mac
    - MacBook Pro 2018, Monterey
    - Mac mini 2023, Sonoma
    - Mac Pro 2013, Monterey

## 構築
### 必要なものをインストール
```
$ sudo apt install -y samba samba-vfs-modules avahi-daemon
```

### 設定
TimeMachine用のユーザー作成
```
$ sudo useradd cabbage
$ sudo passwd cabbage
$ sudo pdbedit -a cabbage
```

以下を追記
```/etc/samba/smb.conf
[global]
   server min protocol = SMB3_02
   vfs objects = catia fruit streams_xattr

[TimeMachine]
   comment = time machine
   guest ok = no
   path = /path/to/dir/for/TimeMachine
   read only = no
   create mask = 0600
   directory mask = 0700
   fruit:time machine max size = 140G
   fruit:time machine = yes
```
Sonomaではプロトコルを指定しなくても大丈夫。Montereyでは上記指定必須。分かれ目はどこなのか。
パスは適当に。
TimeMachineのサイズは適当に。公式はバックアップ元のストレージの2倍を用意しろと書いているが、まあテストだし...

### 反映
念の為samba設定のチェック
```
$ testparam
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Weak crypto is allowed

Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

$ sudo systemctl restart avahi-daemon smbd
```

## 実験
### Sonoma(Mac mini)のバックアップ
- TimeMachineの設定
    - 設定アプリ/一般/Time Machine
    - バックアップディスクの追加で、sambaが出てくるので選択してディスクを設定
    - ユーザ作成で作成したユーザ名とパスワードでログイン
    - パスワードを設定して完了
    - 自動的にバックアップが始まる

### Monterey(MacBook Pro)のバックアップ
- まず、Sambaをマウントする
    - メニューバー/移動/サーバへ接続
    - `smb://<server ip>`を入力し、接続
    - ユーザ作成で作成したユーザ名とパスワードでログイン
    - ボリューム選択
- TimeMachineの設定
    - 設定アプリ/Time Machine
    - バックアップディスクを選択で、マウントしたsambaが出てくるので選択してディスクを使用
    - ユーザ作成で作成したユーザ名とパスワードでログイン
    - パスワードを設定して完了
    - 自動的にバックアップが始まる

### Monterey(MacBook Pro)をMac Pro 2013に復元
- Mac Proでリカバリモードに入る
    - osをインストールする(インストール手順は割愛)
    - 移行アシスタントで、TimeMachineからを選択し、続ける
    - sambaを選択し、ユーザ作成で作成したユーザ名とパスワードでログイン
    - リストからバックアップを選択
    - ...待ち
    - 復元完了！

## 結果
全てのファイルはもとよりアプリまで復元された。フルバックアップなのかな
safariで固定していたタブが固定外れたが、消えた訳ではないのでまあヨシ

## 参考文献
[https://takuya-1st.hatenablog.jp/entry/2023/06/27/025738](https://takuya-1st.hatenablog.jp/entry/2023/06/27/025738)
【Next.js】ローカルストレージを使ったらDB周りとユーザー認証の実装が不要になった話

# はじめに
こんにちは！エンジニア志望の学生です！

今日は開発期間2日間のハッカソンの時に、データベース周りとユーザ認証の実装に、途方に暮れていた時、localStrageに救われた時のことを書きます！

:::note warn
これはあくまでもハッカソンのように時間が限られた突貫作業で役立つTipsです。

実際の開発では、データベースを使用する方が安全で適切な場合が多いです。

また、ハッカソンでも高度な技術をアピールしたい場合には、この方法の使用はおすすめしません。

**タイトルで釣ってすみません、、！！**
:::

https://techracho.bpsinc.jp/hachi8833/2024_04_05/80851

# localStrageについて
- JavaScriptを用いてユーザのローカル環境にデータを保存できる
- 半永久的なデータの保存が可能で、ページリロードをしたり、タブを閉じたりしてもデータが消えない
- キーと値のペアで保存、呼び出しが可能

➡　**「ユーザ特有のデータをデータベースから持ってくる」様な動作ができるようになる**

# 注意点
- ストレージの**上限が5MB**である
- 削除しないと**データが残り続ける**
- **セキュリティが低く**、機密情報の保持は非推奨
- **stringのみ保存可能**
---
## 保存 `setItem()`
- キーと値を渡す
- オブジェクトや配列を値として保存する時は、文字列に変換してから保存する
- `number`のみ自動で`string`に変換される
:::note warn
-ストレージがいっぱいになると例外が発生するため、setItem()使用時には必ず例外を捕捉するようにする
:::
```typescript:setItem()
//基本的な実装
localStrage.setItem("key","value");

//数値の保存
localStrage.setItem("age",20);

//オブジェクトの保存
localStrage.setItem("obj",JSON.stringify(objectData));
```

## 取得 `getItem()`
- キーから値をstringで取得する
- 数値はnumberに自動変換される
- **キーが存在しない場合は`null`を返す**
- オブジェクトとして扱いたい場合はparseする必要がある
```typescript:getItem()
//基本的な実装
const value = localStrage.getItem("key");

//オブジェクトを取得
const dataStr = localStrage.getItem("key");//文字列として取得
const dataObj = JSON.parse(dataStr);//オブジェクトに変換
```

## 削除 `removeItem()`
- 指定されたキーを削除する
- キーが元々存在しない場合は何もしない
```typescript:removeItem()
localStrage.removeItem("key")
```
## 初期化 `clear()`
- ローカルストレージ上の全てのキーを消去する
```typescript:clear()
localStrage.clear()
```
↓　ブラウザのコンソールに直接入力することも可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929797/662eb2b6-1596-bae0-b772-1cd1b1875382.png)
--
# おまけ
MDNで紹介されていたメソッド、プロパティを紹介します。
## n番目のキーの取得 `key()`
- `0`始まりのインデックスを使い、n番目のキーを取得できる
- 存在しない場合はnullを返す
:::note warn
必ずしも保存した順に並ぶわけではないため、使用は非推奨
:::
```typescript:key()
localStrage.key(5)
```
## キーの数　`lentgh`
- ストレージ中に含まれるキーの数の合計を返す
```typescript:length
localStrage.length
```

# まとめ
チームのほとんどがnext.js初心者で、もちろんデータベースやユーザ認証なんてやったことないよ！みたいな状況だったので劇的に助けられました

SQLも覚えなきゃですね！！！


# 参考

https://developer.mozilla.org/ja/docs/Web/API/Web_Storage_API

https://qiita.com/shiho97797/items/30c1475363c587b60a75

https://qiita.com/masuda-sankosc/items/cff6131efd6e1b5138e6

https://zenn.dev/conkon/articles/3ad71658374fe7
「ラップ」機能を使用しない文字列の折り返し

# はじめに
Tableauで長いテキストを折り返して表示する場合、基本的には「ラップ」機能を使用します。
しかし、テキストの内容によっては意図した表示にならない場合があります。（日本語の場合は上手く折り返してくれない場合が多々あります）
又は、自身が改行する位置を設定したい！ということもあると思います。
今回はTableauの標準機能を使用せずに、指定の文字数ごとに改行を追加する実装をご紹介致します。

# 注意点
あくまで指定の文字数ごとに改行する実装であるため、1文字の大きさが異なると改行される位置が揃わないです。

# 目的
左側（元のフィールド）はラップをONにしているが、上手く表示されない。
右側（改行実装）は10文字ごとに改行されて全文表示されている。
![②備考(改行).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/787fb469-7007-c86f-c144-7f9a952aa1e1.png)

# 実装
正規表現を使用してN文字ごとに改行を追加する計算フィールドを作成します。
```
REGEXP_REPLACE([フィールド名],'(.{N})(?!(\r\n|\n|\r))','$1
')
```
※"$1"の後の改行を忘れないでください。
改行以外の文字がN回続きかつ直後が改行でない文字列とマッチし、マッチした文字列+改行で置換しています。
```
(.{N})
```
任意の文字がN回続く文字列のグループ
```
(?!(\r\n|\n|\r))
```
改行が後に続かない(否定先読み)
```
$1<改行>
```
グループ(丸括弧で囲んだ箇所)+改行

# 終わりに
今回ご紹介した実装では元の文字数が何文字であろうとも対応が可能です。
ご活用いただければ幸いです。
HMR/hot updateをtoggleするvite plugin

リロードの粒度をマニュアル操作したい場合に dev serverの `/toggle-hmr` にリクエストするとHMR/hot updateのon/off状態を切り替えられるvite pluginです。

```ts
import type {Plugin} from 'vite';

let hmrEnabled = true; // HMR の状態を記録

export function toggleHMR(): Plugin {
  return {
    name: 'toggle-hmr',
    // ミドルウェアを追加
    configureServer: (server) => {
      server.middlewares.use((req, res, next) => {
        if (req.url === '/toggle-hmr') {
          hmrEnabled = !hmrEnabled;

          // クライアントに HMR 状態を送信
          server.ws.send({
            type: 'custom',
            event: 'hmr-status',
            data: { enabled: hmrEnabled },
          });

          console.log(`HMR is now ${hmrEnabled ? 'enabled' : 'disabled'}`);
          res.end();
        } else {
          next();
        }
      });
    },
    handleHotUpdate: () => {
      if (!hmrEnabled) {
        console.log(`HMR is disabled. Skipping update`);
        return [];
      }
    },
  };
}
```
いろんなAIにおえかきさせてみた

# はじめに
こんにちは。今年もあと一か月となりました。そこで私は、来年の干支をいろいろなAIに描いてもらいました。今回協力してもらったAIはChatGPT,Copilot,Geminiです。なお、「2025年の干支の絵を描いて」という文章でお願いしました。

## 1.ChatGPT
![chatGPT 干支の絵.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948028/41da33a3-6645-0370-eed8-267fe0ba23ca.png)

![chatGPT 干支の絵説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948028/02e5717f-3ebd-d4bc-2161-490ad541802b.png)

ChatGPTは説明文まで書いてくれました。
桜を描いて春の雰囲気を出しています。

## 2.Copilot
![Copilot 干支の絵.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948028/bb7bf147-8a8b-c06a-7f83-1d092f87a9b0.png)

![Copilot 干支の絵説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948028/dcfe1aa8-ea47-aa59-5913-69e76e3215e4.png)

Copilotは2025年の干支が蛇であるという認識をしておらず、龍の絵を描いたといっています。
そして牛のような絵を描き、周りにも牛のような生き物をたくさん書いていました。
中国風のデザインになっていますが、葛飾北斎のような波のデザインを取り入れていました。

## 3.Gemini
![Gemini 干支の絵.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3948028/06349ebd-a16c-8b28-c701-6218aec89649.png)

Geminiも2025年の干支が蛇だと分かっておらず牛の絵を描いていました。
また説明文もありませんでした。
前の２つと違ってとてもシンプルな出来上がりになっていました。

# まとめ
2025年の干支は蛇なのでChatGPTが一番近い絵になりました。
ChatGPTとCopilotは背景にも絵を描いてくれましたが、Geminiは牛だけ描き、背景は真っ白のままでした。
どのAIもかっこいい感じの絵を描いてくれました。
このようにAIによって描いてくれる絵や解釈が全然違うので面白かったです。
もっといろいろなAIに頼んでみたいと思いました。また、違う内容でも試してみたいと思いました。
Arch LinuxにSteam（とProton）を導入してWindows向けゲームで遊ぶ

Steam（とProton）を導入してArch LinuxでWindows向けゲームで遊べるようにしましょう。
非Steamソフトウェアも実行できます

SteamやSteam DeckはValveという会社が作っているのですが、ValveはLinuxにおけるゲーム体験について積極的な支援をしています。
ValveがWineをゲーム向けに改造したProtonというソフトウェアを使うことで、かなりのゲームタイトルがLinuxで実行できるようになります。

# インストール
まず、multilibリポジトリを有効化します。
```
sudoedit /etc/pacman.conf
```
以下の文章をコメントアウトします。
```
[multilib]
Include = /etc/pacman.d/mirrorlist
```
そしたらリポジトリを同期します。
```
sudo pacman -Syu
```
Steamをインストールします。
追加でフォントが必要という記事もありますが、私の環境では不要でした
```
sudo pacman -S steam
```
途中で依存パッケージについて訊かれるので（GPUはAMDかNvidiaかIntelか等）、環境に合わせて選択してください。

# Protonの有効化
忘れずにSteamの左上らへんにある設定から（互換性の設定）Protonを有効化しましょう。

# 32BitのGPUドライバ
32BitのGPUドライバについてArch Wikiに書いてあるのですが
適当にパッケージを入れたら環境が壊れてchrootで修復する羽目になってしまったので、注意して入れてください...
ターミナルを改造する

## はじめに

ターミナルは普段から使っているかと思いますが、ターミナルのプロンプトには何を表示していますでしょうか。

自分はこんな感じで、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748702/22894d13-afac-98f5-4efa-bd8db5d7a2df.png)

- 時刻
- カレントディレクトリ
- git のブランチ
- git の差分
- 直前のコマンドの実行時間
- 直前のコマンドが失敗した (0 以外を返した) ときにカーソルが赤くなる

などを表示しています。
この記事では、ターミナルのプロンプトを上のようにする方法を紹介します。

## 前提条件

Windows 10/11
WSL2 がインストール済み
Ubuntu (or その他の Linux ディストリビューション) がインストール済み
Windows Terminal がインストール済み

## 手順

手順を紹介します

## フォントを入れる

特殊なアイコンを使うので、そのアイコンを表示できるフォントをインストールします。
こだわりがなければ、[公式](https://github.com/romkatv/powerlevel10k/blob/master/font.md)が出しているものがいいでしょう。
ちなみに私は [この記事](https://qiita.com/macneko/items/c2e0400f537af83ca4a9) に影響されて `UDEV Gothic` を使っています。

## Windows Terminal を設定する

Windows Terminal を立ち上げたら Ubuntu が表示されるようにします。

1. 設定を開く ( `Ctrl + ,` )
2. スターアップ > 既定のプロファイル を `Ubuntu` にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748702/54ae78f3-0c59-da8a-8912-9d9cf26678f4.png)

先ほどインストールしたフォントを使えるようにします。

1. 左のサイドバーからプロファイル > Ubuntu を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748702/0777614e-f6b9-abe7-c93d-35d70c5bd51c.png)

2. 追加の設定 > 外観 > フォントフェイス を編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748702/a8652d24-94f8-b002-321b-92a2ff6431f5.png)

### zsh を入れる

```shell
sudo apt install zsh
chsh -s $(which zsh)

# ターミナルを再起動する
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748702/cfc8d585-f922-17dd-4e56-dba0fa4bc132.png)

## prezto を入れる

https://github.com/sorin-ionescu/prezto

見た目や機能をカスタマイズできるようになります。

```shell
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

# ターミナルを再起動する
```

※見た目は変わりません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748702/cfc8d585-f922-17dd-4e56-dba0fa4bc132.png)

## p10k を入れる

https://github.com/romkatv/powerlevel10k

zsh で使えるテーマの詰め合わせです。

```shell
echo 'zstyle :prezto:module:prompt theme powerlevel10k' >> ~/.zpreztorc
```

もしくは

```shell
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc
```

## 仕上げ

以下のコマンドを実行すれば、あとは画面の指示に従うだけでプロンプトの見た目がいい感じに設定されます！

```shell
p10k configure
```

気に入らなければ、再度実行すればまた設定ができます。

## おまけ

私は p10k がつくる `.p10k.zsh` に独自の設定を入れていて、特定の環境変数があるときに、

- 本のアイコン
- その環境変数の値
- GitHub のイシュー番号

を表示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748702/9014cf7c-1e61-0f43-d869-d2a0ff6e4d8b.png)

コードはこんな感じ

```shell
  function prompt_uv_test_name() {
    if [ -n "${SOMETHING_VARIABLE}" ]; then
      p10k segment -f 200 -i '📚' -t "(${SOMETHING_VARIABLE}#${GITHUB_ISSUE_NUMBER})"
    fi
  }
```

説明は .p10k.zsh の `function instant_prompt_example()` にあるので、気になる方は見てみてください
TypeScriptで国情報を扱うためのTips


国の情報を選択ボックスやらタグやらで使いたいなーという場面があると思います。
最初は特定の国を決め打ちで登録すれば良いと思いますが、コードで管理するか国名で管理するか、あるいは何かしらのIDやUUIDで管理するかなど選択肢が多くあるでしょう。

そんなときは国際基準に則った管理をしてしまいましょう！
めちゃくちゃ当たり前のことですが、実際探してみるとあんまり見つからないしXMLで管理されてたり謎のWebサイトからダウンロードしたりしなければならないこともあります。

## どのデータを利用すればよいか

Webサイトからスクレイピングしたり、特定の団体がまとめている情報を取得したりするのもいいですが、できれば自動化したいしコード管理できるとなお良いですよね。ということでGithubに頼ってみましょう。はい、ありました！

https://github.com/lukes/ISO-3166-Countries-with-Regional-Codes

こちらのパッケージをローカルにcloneしてしまって処理を実行すれば、最新の国情報をJSONで生成してくれます。
いちいち生成するのは面倒という方は、Githubから直接 `all`, `slim2`,`slim3` の各ディレクトリからいずれか必要なファイル形式のファイルのコードをコピペすればOKです。
`all` は `slim2`,`slim3` に加えて `region` 情報を持っています。例えば国を大陸別で扱えるので、そういうユースケースには最適です。

## まとめ
OSSと同じように「そのデータって自分たちで管理する必要があるんだっけ？」というものについてはまずGithubを漁ってみましょう。きっとあなたの役に立つデータをコード化している先駆者がいるはずです。
そして、できればその後のメンテナンスも一緒に協力して作業していくとより良いと思います（例えば1年に1度だけ動くCIを作ってデータを最新化する→PRを出す処理を自動化するとか、PullRequestを閉じるとか）


## 余談：都道府県はどうすれば？

日本としての悩みごとには国とは別に都道府県があります。
これらについても探してみると、以下2つが該当しました。

https://github.com/piuccio/open-data-jp-prefectures

https://github.com/madefor/jisx0401?tab=readme-ov-file

ただし、規格がある部分（ここでは01が北海道、11が埼玉というJIS X 0401のコード）は規格に準拠した形でプロダクトも実装する方が、後々利便性や保守性の面で助かる場面が増えると思います。

また、選択ボックスを用意するとして、最後の「県」がいらないなぁーみたいなちょっとした対応については、各自のプロダクト側でやるべきかなと個人的には思います。

そういうGithubリポジトリを作ってくれると喜ぶエンジニアがたくさんいるかも知れませんね😄
day10 『ソフトウェア見積り』人月の暗黙知を解き明かす

## はじめに
　ソフトウェアの見積りは極めて期待が大きな学問です。プロジェクトの失敗の大きな原因は見積りの失敗だ！と騒がれることも多いでしょう。昔、なんとか見積りたいと思ったときにはCOCOMOⅡ法の書籍も購入しました。また昔、近所の先輩はファンクション・ポイント法の大家と呼ばれていたようでした。しかし、私はそれらに失望感しか得られませんせした。結局、KKD法の世界を彷徨い続けました。それ以前に日本のソフトウェア開発では、仕様が決まらないのに請負開発で受注するという悪習も横行してました。
　**本書に触れてからは、私のスタンスは、「実用的なコストと期間内で実践でき、期待される精度を満たす、科学的なソフトウェア見積り手法は存在しない」と思っています**。日々進化する技術と市場に合わせて、常に新しい技術を組み込んでいくような業務が多い場合を前提としています。類似した開発を再び実施するような場合に限定すれば、経験を使うことで一定精度のソフトウェア見積りは可能かもしれません。
 
![ソフトウェア見積り 目次2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/de781749-5a20-b2de-db47-7679fcb798b7.png)


 

## ポイント
### 全体構成
　本書はアートとしての見積りと、サイエンスとしての見積りを区別し、アートしての見積りの方に焦点を当てるとしています。
- 第１部　見積りの考え方
　見積りとは、見積り能力のチェック、正確な見積もりの価値、見積り誤差はなぜ起きる？、見積りに影響するもの
- 第２部　見積り技法の基礎
　見積り技法入門、数えて・計算して・判断する、補正と過去のデータ、専門家の判断、分解して・また組み立てる、類推見積り、代替指標による見積り、専門家グループによる判断、ソフトウェア見積りツール、複数のアプローチの使用、うまくいく見積りフロー、標準化された見積り手順
- 第３部　見積りの課題
　規模の見積りの課題、工数の見積りの課題、スケジュールの見積りの課題、計画パラメータの見積り、見積りのプレゼンテーション、政治・交渉・問題解決

### 不確実性のコーン
- 有名なグラフのこと。
![不確実性コーン 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/fe64f2fe-e0a2-3d06-4bbc-3d0aff907206.png)


- **初期コンセプトの時点では大きいときは４倍、少ないときは１／４倍、つまり専門家が出す見積り幅として１６倍程度の幅**が普通にある。
- さらに１週間追加しても、たいして精度は上がらない。ユーザインタフェースの設計が完了した頃に、やっと見積りの精度が上がってくる。
- これは、1980年頃の提唱なので、提唱はかなり古い。
- 書籍「アジャイルな見積りと計画づくり」Mike Cohn著、毎日コミュニケーションズ、にも不確実性コーンの記述があります。


## 書誌情報
- 書籍名：ソフトウェア見積り　人月の暗黙知を解き明かす
- 著者：Steve McConnell
- 出版社：日経BPソフトプレス
- ISBN：987-4-89100-522-1

## 参考
-
日本におけるFinOps活動のヒント

## 日本におけるFinOpsの現実的アプローチ

日本企業でFinOpsを導入する際、
理想的な体制を一気に構築するのは難しいのが現状です。

そのため、以下のようなスモールスタートが大半かと思います。
1.既存のCCoEチームの役割の一部として限られた工数でFinOpsに取り組む
2.WG活動として限られた工数でFinOpsを推進する

これら条件下において現状を把握した上で、
損益分岐点の特定やコスト最適化（削減）に即効性のあるKGI/KPIの設定が重要です。

## 成熟度評価とギャップ分析

FinOps Foundationの成熟度モデルを参考に、現状の達成度を評価します。

1.RI/SP（リザーブドインスタンス/セービングプラン）利用率
2.タグ付け実施率
3.コスト異常へのレスポンス時間
4.組織体制

現状と目標のギャップを分析し、課題と立ち位置を明確にします。

## ステークホルダーの特定と巻き込み

1.パブリッククラウドの管理部門と利用部門のキーマンを特定
2.可能であればCFOやCIOを巻き込み、トップダウンでの協力を得る

## 現状把握のためのヒアリングとサーベイ

1.各ステークホルダーへのヒアリング実施
2.匿名サーベイによる客観的な現状把握

## 実践的なKGI/KPIの設定

限られたリソースで効果を示すため、即効性のある最適化に注力します。

## KGI（重要目標達成指標）
コスト削減率（活動工数にかかった費用以上の削減効果を目指す）
## KPI（重要業績評価指標）
1.RI/SP利用率
2.不要リソース削除率

など...
FinOpsFoundationのKPIページを参考に、即効性のある指標を選ぶ。

## シミュレーション

損益分岐点を計算し、その損益分岐点に到達するためには
どれくらいの削減率が必要かシミュレーションする
その削減率を達成するためにはどれくらいのKPI値が必要かシミュレーションする


## まとめ

かなり内容を絞って記載しましたが、
ファーストステップとして活動の意義をアピールするには、
目に見えるコスト削減効果を出すのが重要と思います。

活動の有効性を認められたら、次のステップとして可視化へのアプローチや、
最適化に向けた文化醸成などに取り組んでいくのが良いと思います。