OmniAICreator/Qiita-1.07M huggingface dataset:
Postmanでサクッと日本語音声ファイルを英語スピーチに変換

こんにちは！
今回はPostmanからOpenAIのAPIリクエストを送信して日本語の音声ファイルを英語スピーチに変換してみます。

使うAPIはこちら↓

- [Create translation](https://platform.openai.com/docs/api-reference/audio/createTranslation)：英語以外のオーディオファイル(flac, mp3, mp4, mpeg, mpga, m4a, ogg, wav, webm)を英語に変換してJSON形式のテキストで返してくれる。
- [Create speech](https://platform.openai.com/docs/api-reference/audio/createSpeech)：テキストを読み上げてオーディオファイルを返してくれる。日本語も対応している。他の対応言語は[こちら](https://platform.openai.com/docs/guides/text-to-speech/supported-languages)。

まずは、Postmanのワークスペース上にコレクションを作ります。
![Screenshot 2023-12-15 at 1.29.57 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/703802e6-6ab7-daea-ffc3-66adaff287b6.png)

上のOpenAIのページのExample requestの横のCopyアイコンをクリックしてコピーします。
![Screenshot_2023-12-15_at_1_31_11_pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/574e9106-06cd-0520-1c9b-b8f0aea8a3f0.png)
Postmanのワークスペースのインポートをクリックして、インポート画面を開いたらそこにペーストします。
![Screenshot 2023-12-15 at 1.33.37 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/85d80a7f-43c9-1bc0-84ad-318655dff2db.png)
![Screenshot 2023-12-15 at 1.35.09 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/92563a61-7065-f686-9026-01c5353763fc.png)
すると、リクエストとして読み込んでくれるので、先ほど作ったコレクションに保存します。

リクエストを送るにはAPIキーが必要なので、OpenAIのダッシュボードのAPI KeysのメニューからAPIキーを作成します。
![Screenshot 2023-12-15 at 1.43.18 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/f98fb545-013e-8ffc-1914-16a413082f6f.png)
作成したAPIキーはコレクションの認証ページにBearerトークンとして指定します。これでコレクション内のリクエストにはこの認証方法が適用されます。
![Screenshot 2023-12-15 at 1.44.57 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/f2b199d0-942b-001e-1974-adc2b9fc3116.png)
セキュリティの面からAPIキーは環境変数に登録することをお勧めします。環境変数だとシークレットタイプが選べます。現在値のカラムにAPIキーを入力します。
![Screenshot 2023-12-15 at 2.12.29 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/bf933c2a-d4a7-f0bb-cab0-6de6d74d762a.png)


さて早速、適当な音声ファイルを使って試してみましょう。（サンプル音声は[ここ](https://choimitena.com/Audio/Sample)から拾ってきました）
![Screenshot 2023-12-15 at 1.47.25 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/93de65dd-a95d-bbfa-4c9f-7b09945dd0b3.png)

次にやりたいのは、この英語テキストをスピーチ（音声ファイル）にしたいので、Create speechエンドポイントを使います。先ほどと同様の方法で、OpenAIのページからExample requestをコピーしてPostmanのコレクションにリクエストを作成します。
上のCreate translationのリスポンスのテキストをCreate speechリクエストのinputプロパティに指定したいので、ここは"input_text"という変数にします。
![Screenshot 2023-12-15 at 1.53.12 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/8d6a0297-8da7-ba68-59fa-7f3b3c88b47e.png)

さらにCreate translationリクエストのテストタブを開いてリスポンスを環境変数に設定する、というスクリプトを書きます。
![Screenshot 2023-12-15 at 1.58.22 pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722028/d5e55069-17f7-b4b7-8bf7-eb02c4b05938.png)

これで完成です。Create translationリクエスト→Create speechリクエストの順でリクエストを送信することで、日本語の音声ファイルから英語スピーチを作成することができます。

完成したコレクションは[こちら](https://www.postman.com/speeding-resonance-133102/workspace/openai-flows-workspace/collection/12689164-6c4eae8e-f3d3-4900-982d-22751a41def9?action=share&source=copy-link&creator=12689164)。
5Gネットワーク学習備忘録①

# そもそも5Gって何？
5Gとは5Generation、すなわち**第5世代移動通信システム**のことを指します。
主にモバイル機器の通信規格のことです。

世代という言葉からもわかるように、これまでの4GやLTEといった通信規格よりも、多くの点で技術の発展がみられます。
# 5Gの特徴
5Gでは、スマートフォンの普及やIoTの発展、そのほかモバイルデバイスの急速な普及により問題になっていた通信の輻輳(通信が集中して回線が混雑すること)の解決を目的に、主には3GPPという標準化団体が使用技術の標準化の推進を行っています。

標準化のための指標となるのが、ITU(国際電気通信連合)の定める規定「ITM-2020」で、この文書では5Gに求められる特徴につぎの3つの要素を示しています。
- **高速大容量 (eMBB)**: 理論値で4Gの10～20倍以上
→動画をより高画質にしたり、ゲームをより高精細にできたりする
- **高信頼低遅延 (URLLC)**: 理論値で4Gの10分の1
→自動運転や遠隔医療などのレスポンスのラグが許されない問題に活用
- **多数同時接続 (mMTC)**:理論値で4Gの約100倍の同接数
→IoT、センシングに利用できる

# 周波数帯と帯域幅
これらの目標を達成するために行われた技術革新のうちの一つが、使用可能な周波数帯の増設とそれに伴う帯域幅の増加です。

現在の日本の法制上は、通信事業者が使用する電波の周波数帯は自由に決められるわけではなく、総務省が管理しています。

4G以前では、各通信キャリアが使用可能な周波数帯は3.6GHz以下に限られていました。

これが5Gになると、3.7GHz帯：4.5GHz帯（サブ6帯）や28GHz帯（ミリ波帯）の使用が可能になります。
- **ミリ波帯**：広い周波数帯を確保しているが、その分電波の阻害率が高い
- **サブ6帯**：すでに利用がされているので広い帯域幅を確保できない
- 
周波数帯が高くなるほど**帯域幅**(通信の通り道)が広くなります。

簡単に言えば、通信が通る道路の道幅が拡張された、みたいなイメージです。

5Gではこれまでの4GやLTEとの互換性を確保しつつ、ユーザーの通信環境に合わせてこれらの周波数帯を切り替えるために、この二つを併用する方針となっています。

# 各キャリアの割り当て
日本の主な携帯通信キャリアの周波数帯割り当ては、以下のようになっています。
- docomo・KDDI: サブ6帯2, ミリ波帯1
- ソフトバンク・楽天モバイル: サブ6帯1, ミリ波帯1

総務省発表の5G開設計画書ではdocomoが基盤展開率(基地局のメッシュを表す指数)において優位で、基地局数ではKDDIが優位だそうです。

# 無線技術の発展
これらの新しい周波数帯の電波をやり取りするために、無線技術にも新しい技術が多く導入されています。

**Massive MIMO（マッシブ マイモ）** とは、送受信両方に複数のアンテナを設置することで同じ周波数帯を使いながら、通信量を増やせる＝通信を高速化できる技術のことです。

これだけ聞くといいことしかないようにおもえますが、Massive MIMOで送信した電波は複数アンテナを用いるため合成波として受信されます。

すると、受信側はデータを分離する処理が複雑になるため、これらの処理の簡素化や標準化が大切になってきます。

もう一つ5Gで用いられる無線技術が**ビームフォーミング**です。

ビームフォーミングは特定の地域にのみ電波の位相を掛け合わせて電波強度を上げる技術のことで、仕組みとしては指向性スピーカーなんかに近いです。

これによってネットワークリソースの調整が可能になり、必要なところに必要な強度の電波が届けられるようになると考えられています。

# 最後に
5Gネットワークに関する勉強が足りないのでこのシリーズは定期的に続けます。

筆者はどっちかというとエッジコンピューティングなんかに興味がある人なので、下流の話はツッコまれると死にます()。ナナメ読みにとどめておいてください。

モバイル屋さんになりたいB2の人でした。
rex0220 計算式プラグイン 日またがりの時間計算

計算式プラグインで、日またがりの時間計算を行います。
勤務時間、深夜勤務などでよく使われます。

# 概要

下記の要件で、勤務時間を計算します。

開始時刻： 勤務開始時刻
終了時刻： 勤務終了時刻
日の切替時刻： "06:00"
深夜勤務開始時刻： "22:00"
休憩時間： 時間単位で指定
勤務時間： 開始時刻から終了時刻までの時間から休憩時間を引いた時間

![2023-12-11_14h32_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e16a15b4-7d7e-ad8a-e144-25f0f3e88203.png)

# 日またがりのある勤務時間を計算

日またがりのある勤務時間を計算する場合、以下のような計算式を使用できます。ここで、日の切り替わる時刻を "06:00" とし、勤務開始時刻と終了時刻をそれぞれ変数として扱います。

日またがりを考慮し、開始時刻と終了時刻が翌日にまたがるかどうかを判定します。
勤務開始時刻が日の切り替わり時刻より前であれば、前日の勤務として扱います（例: 10:00 開始ならば、前日の 10:00 として扱う）。
勤務終了時刻が日の切り替わり時刻より前または同じであれば、翌日の勤務として扱います（例: 03:00 終了ならば、翌日の 03:00 として扱う）。
日またがりを考慮した開始時間と終了時間を用いて、勤務時間を計算します。
休憩時間を時間単位で指定し、勤務時間から休憩時間を差し引きます。

```.js
// テーブル.勤務時間 NUMBER
LET(
  切替時刻, "06:00",
  日またがり開始, IF(開始時刻 < 切替時刻, DURATION(-1, "days"), 0),
  日またがり終了, IF(終了時刻 <= 切替時刻, DURATION(1, "days"), 0),
  終了時間, DURATION(終了時刻, "hours"),
  開始時間, DURATION(開始時刻, "hours"),
  休憩, DURATION(休憩時間, "hours"),
  勤務, DURATION_AS(日またがり開始 + 日またがり終了 + 終了時間 - 開始時間 - 休憩, "hours"),
  IF(勤務>0,勤務,0)
)
```

# 計算式プラグインの設定

```.js
// 年月 DATE (editable)
DATE_FORMAT(年月,"YYYY-MM-01")

// 勤務時間合計 NUMBER
SUMIF(IN(チェック,"OK"),勤務時間)

// 勤務日数 NUMBER
COUNTIF(AND(IN(チェック,"OK"),勤務時間>0),1)

// 深夜時間合計 NUMBER
SUMIF(IN(チェック,"OK"),深夜勤務)

// 深夜回数 NUMBER
COUNTIF(AND(IN(チェック,"OK"),深夜勤務>0),1)

// 休出回数 NUMBER
COUNTIF(AND(IN(チェック,"OK"),区分="休出"),1)

// 有休回数 NUMBER
COUNTIF(AND(IN(チェック,"OK"),区分="有休"),1)

// 代休回数 NUMBER
COUNTIF(AND(IN(チェック,"OK"),区分="代休"),1)

// テーブル SUBTABLE
DATE_ENDOF(年月,"month","DD")

// テーブル.日付 DATE
DATE_ADD(年月,ROWNO(テーブル),"day")

// テーブル.曜日 SINGLE_LINE_TEXT
SUBSTR("日月火水木金土",DATE_FORMAT(日付,"e"),1)

// テーブル.区分 DROP_DOWN (editable)
IFS(
  区分,区分,
  IN(曜日,"土","日"),"休日",
  "平日"
)

// テーブル.勤務時間 NUMBER
LET(
  切替時刻, "06:00",
  日またがり開始, IF(開始時刻 < 切替時刻, DURATION(-1, "days"), 0),
  日またがり終了, IF(終了時刻 <= 切替時刻, DURATION(1, "days"), 0),
  終了時間, DURATION(終了時刻, "hours"),
  開始時間, DURATION(開始時刻, "hours"),
  休憩, DURATION(休憩時間, "hours"),
  勤務, DURATION_AS(日またがり開始 + 日またがり終了 + 終了時間 - 開始時間 - 休憩, "hours"),
  IF(勤務>0,勤務,0)
)

// テーブル.深夜勤務 NUMBER
LET(
  切替時刻, "06:00",
  深夜切替, "22:00",
  深夜開始, IF(AND(開始時刻>=切替時刻, 開始時刻<深夜切替), 深夜切替,開始時刻),
  日またがり開始, IF(開始時刻 < 切替時刻, DURATION(-1, "days"), 0),
  日またがり終了, IF(終了時刻 <= 切替時刻, DURATION(1, "days"), 0),
  終了時間, DURATION(終了時刻, "hours"),
  開始時間, DURATION(深夜開始, "hours"),
  深夜, DURATION_AS(日またがり開始 + 日またがり終了 + 終了時間 - 開始時間, "hours"),
  IF(深夜>0,深夜,0)
)
```
Generative AI Testの受検体験記

<h2>Generative AI Testを受けてみた！</h2>
昨年、「<a href="https://qiita.com/hi_toku/items/dcf9ddc72e2533d2e6dd">Ｇ検定の受験体験記</a>」を投稿しましたが、同系統で<b>『 Generative AI Test 』</b>という試験があるのを発見し、受けてみたので、ご紹介します！

このページに記載されている内容：
　(1) そもそも『Generative AI Test』って何？
　(2) 『Generative AI Test』の効率的な試験対策方法は？

<h2>そもそも『Generative AI Test』って何？</h2>
まず <font color="red">日本語の試験</font> です！(大事)<br>
『Generative AI Test』とは、<a href="https://www.jdla.org/
">JDLA(一般社団法人 日本ディープラーニング協会)</a>が実施する試験の一つです。(他には「G検定」「E検定」という試験があります)<br>
『Generative AI Test』は、昨今話題になっている <b>生成AI</b> に"一定水準の理解があるか"を問われる試験です。

<h2>『Generative AI Test』をお奨めしたい人</h2>
下記に該当する人はぜひ『Generative AI Test』の受験を考えてみてください。
<ul>
    <li>生成AIに興味のあって、ChatGPTや生成AI 画像で活用している人</li>
    <li>データサイエンティスト を目指してみたい人 (とっかかりとして)</li>
    <li>人工知能、機械学習、データ分析などの データサイエンス に興味がある人</li>
    <li>上記の知識でビジネスやプロジェクトを推進したい人</li>
    <li>転職時やキャリアップする際のアピールポイントで使いたい人</li>
</ul>

<h2>『Generative AI Test』の概要</h2>
ポイントを下記に抜粋しますが、詳細については<a href="https://jdla.org/certificate/generativeai/">JDLAの公表ページ</a>を参照ください。

<table>
<tr><th>項目</th><th>説明</th></tr>
<tr><td>受験資格</td><td>制限なし</td></tr>
<tr><td>実施概要</td><td>試験時間：20分　<font color="red">← 試験時間が短い！</font><br>
択一式/多肢選択式 19問 ・ 記述式 1問 (GAT2023#2から記述問題が追加</b>)<br>
オンライン実施（PC/スマホ）
</td></tr>
<tr><td>出題範囲</td><td>シラバスより出題</td></tr>
<tr><td>受験費用</td><td>2,200円 (税込)　<font color="red">← 試験代が安い！</font></td></tr>
</table>

<h2>『Generative AI Test』の特徴</h2>
　(1) 受験資格に制限がなく、誰でも受験できます！<br>
　(2) 時間の割に問題数が多い！ (選択 19問＋記述 1問)<br>
　(3) オンライン実施で、自宅のPCから受験可能！<br>

【注意】
　「自宅PCから受検」ならば楽勝では........と思いがちですが、 時間の割に問題数が多い ので、「対策」が必要です！
　「 記述を4分で回答 」したとすると、残り19問を16分 → 「 1問を約50秒で回答 」となり、回答時間がかなりタイトです。

<h2>『Generative AI Test』の効率的な試験対策方法は？</h2>
以下、私が受験した際の試験勉強内容や対策をお知らせしますので、参考にしてください。

Step 1. まずは情報収集する
　私は下記の書籍を読んだり、YouTubeで「生成AI」で検索してヒットした動画を雑多に見て、気になるポイントは適宜メモしてました。
　<a href="https://www.amazon.co.jp/dp/B0CB25TNF2?ref_=cm_sw_r_cp_ud_dp_YJ60B4HJ6APFG7YE7M98">大規模言語モデルは新たな知能か　ＣｈａｔＧＰＴが変えた世界 (岩波科学ライブラリー)</a>
　<a href="https://www.amazon.co.jp/dp/B0BYYLYBXV?ref_=cm_sw_r_cp_ud_dp_EM8CZMM2ZQGRK7HV5PNP_2">先読み！IT×ビジネス講座　画像生成AI</a>
　<a href="https://www.amazon.co.jp/dp/B0BZY841LS?ref_=cm_sw_r_cp_ud_dp_P86SP57K66D5GSGNWZGK">先読み!IT×ビジネス講座 ChatGPT 対話型AIが生み出す未来</a>


Step 2. 問題演習
　YouTubeのサイトで、問題演習しました。
　<a href="https://www.youtube.com/watch?v=Jf79me46o_o">Generative AI Test 対策１</a>
　<a href="Generative AI Test 2023#2問題演習 生成AIの資格試験">Generative AI Test 2023#2問題演習 生成AIの資格試験</a>

Step 3.　自分のレジュメを作成
　繰り返しとなりますが、時間の割に問題数が多い です。
　試験中に書籍から探したり、インターネットで検索している時間はほとんどありません。
　"Step 1."や"Step 2."で気になった内容をレジュメのテキストファイルにまとめておき、試験中はそれから検索するのが良いかと思います。

Step 4. 端末2台持ち
　私は試験時にPCを「２台」準備し、１台は「試験用」、もう１台は「検索用」として使いました。
　「検索用PC」では"Step 3."のレジュメや"Step 2."の文書からキーワード検索してました。
　(慣れの問題かもしれませんが、私は1つのPCで「試験」と「検索(レジュメ)」をするには画面が狭かったです)

<h3>まとめ</h3>
上記の情報を参考に、時間の割に問題数が多いを受験し、良き「データサイエンティストライフ」を始めてみてください！
子育て日記×ChatGPT

# はじめに

忙しい日々の中で、日記をつけることは容易ではありません。
しかし、子供との日々の瞬間を記録することは、将来への素晴らしい贈り物となります。
子育て日記は、親と子供との特別なつながりを深め、成長の過程を振り返り、共有するための重要な手段となります。

日々の出来事や子供の成長を文字に残すことで、細かな変化や初めての経験を逃さずに記録できます。将来、子供が大きくなったときに、親の愛情と共にその成長を振り返ることができるでしょう。

また、子育て日記は感謝の気持ちを表現し、親子のコミュニケーションを豊かにします。忙しい毎日の中で、些細な瞬間や喜びを振り返ることで、親は子供に対する深い愛情を再確認し、子供も親の思いに触れることができます。

本記事では、子育てに忙しい中でも楽しく日記を書けるように考えたいと思います。
子育て日記×ChatGPTの魅力に迫りながら、自動生成システムの構築方法を探りましょう。

# 日記を書く際のポイント

`毎日の出来事を記録する`： 子育て日記は日々の出来事を振り返る素晴らしい手段です。赤ちゃんの成長や子供の発言、行動を逃さず書き留めましょう。

`写真を添える`： 記事に写真を添えることで、その瞬間の雰囲気や表情がより鮮明になります。将来、子供が成長した姿を振り返るときに、写真は特別な思い出となります。

`感謝の気持ちを表現`： 子育ては喜びと挑戦が入り混じるものです。日記には子供との素敵な瞬間だけでなく、困難な瞬間も包み隠さず書き込んでください。そして、感謝の気持ちや乗り越えた達成感も忘れずに表現しましょう。

`自分の気持ちも大切に`： 子供の成長だけでなく、自分の感情や思考も大切にしましょう。子育ては親も成長するプロセスであり、あなたの気持ちや考えも子育て日記に綴ってみてください。

`未来の自分や子供へのメッセージ`： 日記には、未来の自分や子供へのメッセージも綴ってみてください。これは将来、子供が大きくなったときに、親の思いや励ましの言葉として感じられることでしょう。

`日記の形式を選ぶ`： 手書きのノートやデジタルのアプリ、ブログなど、日記の形式は様々です。自分に合った形式を選び、続けやすい方法で書き進めてください。

`定期的な振り返り`： 定期的に子育て日記を振り返り、成長や変化を確認することが大切です。これはあなたの成長とともに子供の成長も実感できる良い機会です。

最も重要なのは、子育て日記を楽しむことです。日記は未来への素敵な贈り物であり、子供との特別な瞬間を逃さず残していく手段となります。

# キーワードを入力して日記にまとめてもらう

少ない文章から日記を生成してもらう。
・最近、離乳食が１日３回になりよく食べるようになった。
・ハイハイはしないが、つかまり立ちに近い行動をとるようになった。
・おばあちゃんからアンパンマンのぬいぐるみをもらった。かわいい。

## 生成された日記

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/f3d82fda-8351-1242-db18-23ee42aaf2d1.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/80d4c1a0-de35-222f-6a8a-b09d7dff02e5.png)

# 類似サービスを探してみる

## 日記作成お手伝いGPT ふたば

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/a240b3a2-2601-452f-bac2-24ca50fd8075.png)

https://chat.openai.com/g/g-tcMbdF1IM-ri-ji-zuo-cheng-oshou-chuan-igpt-hutaba

## 日記にコメントしてくれるシステム

日記を作ることばかり考えていましたが、第三者視点から日記にコメントしてもらうとかも面白そうですね。

https://zenn.dev/hiropoko/articles/821eb7bc60fc30

# 今後の課題

子育てが忙しい中で、日記を書く時間を確保するのはとても大変です。
今後は、写真や音声データを活用して自動的に日記を作成するシステムを作りたいと思っています。
IntelliJでDevContainerを使ってみる

こんにちは！GxPの肥後です。
この記事は[グロースエクスパートナーズ Advent Calendar 2023 17日目](https://qiita.com/advent-calendar/2023/gxp)です。

## 最初に

VS CodeでのDevContainerは手軽に利用できる一方で、チームメンバーがIntelliJ IDEAを好んで使用している場合、DevContainerをIntelliJ IDEAで利用できるようになることは重要な課題です。
[公式サイト](https://pleiades.io/help/idea/connect-to-devcontainer.html#create_dev_container_inside_ide)に手順があります。

## 前提条件
Dockerインストール。
GitHubもしくはBitbucket等にアクセスできること。

## DevContainerを使う理由

DevContainerを使う理由は、新しいチームへの参加やプロジェクトへの参加時に発生する一般的な問題に対処する手段として非常に有効かと思います。
以下は、自分の経験に基づいてDevContainerがなぜ有用かを詳しく説明します。

- 新しいチームへの参加時の環境構築：
     - 手順通りに作れない問題：
DevContainerはプロジェクトに必要なすべての依存関係やツールをコンテナ内にカプセル化するため、新しい開発者がプロジェクトに参加する際に、手順通りに環境を構築する難しさを解消します。さらにコンテナは一貫性があり、プロジェクトが必要とするバージョンのツールやライブラリを設定することができます。
    - インストールするものが多い問題：
DevContainerは必要なツールや依存関係を事前に定義しており、これらはプロジェクトのリポジトリと一緒に提供されます。
開発者は手動で多くのツールをインストールする手間を省き、DevContainerを利用して簡単かつ一貫性のある環境を構築できます。
- ローカル環境が汚れる問題：
    - DevContainerは開発者のローカル環境を汚すことなく、プロジェクトごとに隔離された開発環境を提供します。
これにより、異なるプロジェクトの開発環境の切り替えが容易になります。
開発者は仮想環境内で作業するため、ローカルマシンに不要なパッケージや依存関係が残る心配がありません。

DevContainerにはこれらのメリットがあると考え導入することで新しいチームメンバーの環境構築や異なる開発環境間の切り替えがスムーズになり、作業効率の向上が期待できます。

## DevContainerに接続
**公式サイトの手順3が自分の環境でうまくいかなかったため、自分が実行した手順を共有します。**
今回はIntelliJ IDEAを使用してDevContainerに接続してみたいと思います。そのために、既に用意されているプロジェクトを活用します。以下がプロジェクトのURLです。

https://github.com/IdeaUJetBrains/idea-demo-devcontainers

まず、このプロジェクトのURLをコピーして、IntelliJ IDEAのリモート開発機能を開始します。以下が手順です。

1.IntelliJ IDEAを開きます。
2.「リモート開発」を選択します。
![タイトル1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612391/29d42b56-e74a-c949-43cf-9da448c44387.png)

3.新しいコンテナーを選択し、Gitリポジトリの欄に先程コピーしたプロジェクトのURLを貼り付けます。
```https://github.com/IdeaUJetBrains/idea-demo-devcontainers.git```


![タイトル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612391/25d4092e-d7a6-d3ec-50d9-66d53c9b0da7.png)

これで、IntelliJ IDEAが必要なファイルをダウンロードし、Dockerを起動してくれるでしょう。
ダウンロードが完了すると、IDEAの画面に「idea-demo」というプロジェクトが表示され、このコンテナをIntelliJ IDEAから起動できるようになります。

起動後、DevContainerにリモート接続してプロジェクトにアクセスできます。
![スクリーンショット 2023-12-15 130541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612391/53217453-a34e-e203-32cc-218fc746ed90.png)

## 最後に
最後に、この手順を実行することで、思ったよりも簡単にDevContainerに接続できました。既存のプロジェクトを使用することで手順が簡素化され、同様の手法を使ってDockerを使用した開発がスムーズに行えそうです。
次は自分がJava環境を用意してDevContainerを作成してみることにします。

## 参考文献
https://pleiades.io/help/idea/connect-to-devcontainer.html

https://github.com/IdeaUJetBrains/idea-demo-devcontainers

https://pleiades.io/help/idea/work-inside-remote-project.html

https://pleiades.io/help/idea/remote-development-troubleshooting.html
PhpStorm をターミナルから開く

## 作り方

```shell
$ vim /usr/local/bin/phpstorm
```

```sh:/usr/local/bin/phpstorm
#!/bin/sh

open -na "PhpStorm.app" --args "$@"
```

```shell
$ chmod +x /usr/local/bin/phpstorm
```

## 使い方

```shell
$ cd /path/to/project_root
$ phpstorm .
```

PhpStormが開いたらOK

## 参考

https://www.jetbrains.com/help/phpstorm/working-with-the-ide-features-from-command-line.html#standalone
GBFA受験記

# はじめに
GBFAとは、GIAC試験の1つで、正式名称は「GIAC Battlefield Forensics and Acquisition」です。
Battlefieldとありますが、別に戦争をやるわけではありません。サイバー戦争に関して出題されることもありません。

正式な試験範囲は以下をご参照ください。
概ねフォレンジックの保全に関する分野からの出題です。
ディスク、メモリ、ネットワークそれぞれの主に保全方法、手順、ツールに関する出題です。これらに加えてNTFSやFAT等のファイルシステム、ファイルヘッダ、ファイルの復元も出題範囲です。アーティファクトについては少しだけ出題されますが、普段からフォレンジックをやっていれば十分解答できる範囲です。

https://www.giac.org/certifications/battlefield-forensics-acquisition-gbfa/

本記事執筆時点で、試験は2時間で75問出題されます。69%が合格ラインです。

# 勉強法
トレーニングを受けていない私の勉強法は2回の模擬試験を受験し、間違えた問題を徹底的に復習することだけです。間違えた問題については、正解以外の選択肢に含まれるワードまで調べて持ち込み用のシートに記録しておきました。
それ以外に特別なことは何もしていません。

## GIACが初めての方向けの勉強法
GIACが初めてという方は、以下を参考にしてみてください。ポイントは持ち込むための資料作りです。
準備から本番まで全部以下のとおりです。

https://qiita.com/log0417/items/78f1e3136f508d54784d


# 感想
問題は全体的に難しくはないと感じました。数年程度フォレンジックの経験があればトレーニングなしでも合格できるレベルかなと思います。合格ラインが69%と若干低めなので、Windows、Linuxのフォレンジック経験が十分にあれば合格できる可能性はあると思います。ただしMacに関しても出題される点にはご注意ください。

なお模擬試験は2回とも8割とれていましたが、本番は74%でした。
何問か問題文を精読せずに解答してしまったので、誤答が増えてしまったのだと思います。最後までしっかりと解答することは改めて重要だと思いました。
模擬試験と本番で問題の難易度に大きな差はなかったと思いますので、問題が難しかったために点数が落ちたということではないと思います。
AWS Global AcceleratorのエンドポイントとしてEC2インスタンスが選択できない事象について

# はじめに

みなさん、こんにちは。AWS Global Acceleratorのバックエンドにプライベートサブネットに配置したEC2インスタンスを設定しようとした際に、指定可能なエンドポイント一覧にEC2インスタンスが出てこないといった事象に遭遇したので、今回はこちらの事象の原因と解決方法について紹介していきたいと思います。

![01_incident.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613908/340a2cfa-ec21-9526-8ddb-56a872f35a26.png)

# EC2インスタンスがリストに出てこなかった原因

結論としては「**VPCにインターネットゲートウェイ(IGW)をアタッチしていなかったこと**」が原因でした。

「[公式ドキュメント]」にも本件については書かれてはいるものの、若干ややこしいのは「VPCにIGWをアタッチ **だけ** はしておかなければいけない」が、パブリックサブネットを作る必要もなければIGWへのルート設定をする必要もない、という点です。

パッと見だとIGWはどこにも使われていないように見えてしまうため、あとから構成を見返したときに「あれ、この構成にIGWはいるんだっけ？うーん、いらなそうだな、、、」とウッカリIGWを消してしまわないようにご留意ください^^;

![02_architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613908/c49e35a2-462d-3116-87ff-41323abd0179.png)

[公式ドキュメント]: https://docs.aws.amazon.com/ja_jp/global-accelerator/latest/dg/secure-vpc-connections.html

# 終わりに

Global AcceleratorのエンドポイントとしてEC2インスタンスがリストに出てこなくて困ってます、といった方はぜひ参考にしてみてはいかがでしょうか。以上、Global Acceleratorに指定可能なエンドポイント一覧にEC2インスタンスが表示されなかった事象に関する原因と解決方法のご紹介でした。

---

<span style="font-size: 75%">

- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。

</span>
UWSCRの組み込み関数：スクリプト制御系

スクリプト制御系関数の変更点および新規に実装された関数についての解説です。

# 変更点

## eval

UWSCとは異なり式だけではなく文も評価できるようになりました。UWSCではスクリプト評価とevalによる評価の動作に細かな差がありましたが、UWSCRではスクリプト評価と同等の評価を行います。また、UWSCではeval内で代入を行うには`:=`と記述する必要がありましたが、UWSCRでは`=`による代入も可能です (`:=`による代入も動作します)。

```php

dim a = 1
// eval内での代入
eval("a = 5") // = で代入可能
print a // 5
eval("a := 2") // := でもOK
print a // 2

// 文の評価
eval("if a > 3 then a -= 1 else a += 1")
print a // 3
```

## sleep

引数として関数を渡した場合、関数の実行結果が真であればsleepし続けるようになります。

```php:C:\test\test.uws
print "hoge.txtが生成されるのを待ちます"

sleep(|=> ! fopen("hoge.txt", F_EXISTS)|)

print "hoge.txtが見つかりました"
```

```powershell:powershell
# 上記スクリプト実行中に以下を実行すればsleepが解除される
ni -Path C:\test -Name hoge.txt
```


# 新規

## エラー関連

### raise

任意の実行時エラーを発生させられます。

```php
if ! fopen("hoge.txt", F_EXISTS) then
    raise("hoge.txtがありません", "ファイル読み込みエラー")
    // [ファイル読み込みエラー] hoge.txtがありません
endif

fid = fopen("hoge.txt", F_READ)
```

tryで捕捉することもできます。

```php
try
    raise("tryで捕捉できる")
except
    print TRY_ERRLINE // test.uws 2行目: raise("tryで捕捉できる")
    print TRY_ERRMSG  // [ユーザー定義エラー] tryで捕捉できる
endtry
```

### assert_equal

2つの値を比較し、一致しない場合は実行時エラーになります。

```php
dim a = b := 5
dim c = 3

assert_equal(a, b) // 一致するので何も起こらない
assert_equal(a, c)
// [assert_equalエラー] left: 5; right: 3
```

## 非同期処理

### Task, WaitTask

これらの関数を用いることでユーザー定義関数を非同期に実行することができます。詳しくは[UWSCRの新機能：非同期処理 #UWSC - Qiita](https://qiita.com/stuncloud/items/3e1c6e2d694ece052463)を参照してください。
Lookerから始めるGit:バージョン管理

この投稿は、2023年JINSのアドベントカレンダー18日目の記事です。

## 自己紹介
株式会社ジンズのITデジタル部ほりお(@mhori0)です。
主にデータエンジニアみたいなことをやっています。

## 紹介すること
開発を行うと当たり前のようにGitが使われていますがローカルだけで開発される方の中にはまだGit手を出していないんだよなーって方がいるかと思っています。(私も手を出すのは大分遅かったうちの一人です。)
Lookerではバージョン管理を良い感じにする仕組みが内包されているので、これをとっかかりにGitに慣れていくのもありなのでは？ってことで書いてみようと思います。

## Lookerとは
LookerはBIツールの一つでデータベースを持たず、直接データベースにアクセスしてデータ分析を行うBIサービスです。LookMLという言語を使ってデータ定義を行いデータガバナンス機能を有しています。
```
Google が世界中の情報を整理して、世界中の人々がアクセスできて使えるようにしていることと同様に、Looker はビジネスデータに対して同じことを行い、分析情報を活用したワークフローやアプリケーションを容易に構築できようにします。

- 信頼できる最新のデータにアクセスし、分析と対応を行う
- 選択したクラウドから信頼できるデータ エクスペリエンスを大規模に提供する
- より多くのユーザーにより多くの分析情報を提供することで、生産性、意思決定、イノベーションを改善する
```

## コードのバージョン管理
LookerではLookML(Looker Modeling Language)という言語でモデリングを作成します。
このLookMLの変更の記録とファイルのバージョン管理を行うため、Gitを使用しています。 
Gitを使用することで次のような機能が実現されています。
- ファイルの変更履歴の管理
- 過去のある時点のファイルの状態に戻す
- チームで更新したファイルを共有・結合できる

この中でもGit等を使わずにローカル環境で開発をしていくと問題になるのがチームでの開発になります。例えばAさんがあるファイルを編集中にBさんが同じファイルを編集し、Aさんが更に上書きをした場合Bさんが編集した内容がごっそり消える形になります。

これは極端な例ですが、変更内容の影響範囲の考慮不足があったり、他の変更を見落としていたり、、などチームで開発を行うと特に他社が修正している内容をきちんと把握した上で作業を進めることが重要になります。

LookerのGitを設定し複数人で作業をすると、下図のように自身の変更を加えながら他社の変更履歴も保持しているので最後にリリースする前に自身の変更＋他社の変更を取り込んでリリースが行える、というようなイメージになります。
![2023-12-15-13-01-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631501/d3eac051-b6cf-a3fa-5766-5a419fa82b22.png)


このような変更管理をLookerのGUIで確認しながら作業を行えるので、もう何も怖くない！感じであ開発を進められますね！

Lookerには外部連携機能のAction Hubという機能もあり、Lookerが全てのデータのハブとしての役割を担えるよう開発を進めていきたいと思います。

## まとめ
Gitの数ある機能の超一部を挙げたまでになりますが、Gitの仕組みを使ってこのような管理がLookerでされています。Lookerに限らず開発者であればコード管理を最初からやっておけば、、と後悔してしまうこともあるかと思うので、Gitに手を出してみてはいかがでしょうか？
興味を持たれた方は他にわかりやすく＆詳しく書かれている方が多くいらっしゃるのでそちらをご参考に。


明日は三度登場@knt-okadaが、グローバルネットワークの構築話をしてくれるのでお楽しみに！



## 出典情報
ビジネス インテリジェンス向けの Looker
https://cloud.google.com/looker-bi?hl=ja
Mac移行する時用メモ

## 概要

端末移行する時に、いちいち調べるの面倒なのでそれをメモしておく(完全に自分向け)
※随時更新

## オリジナルコマンド
### 場所

`~/command/` 配下

### .zshrcの設定

```bash:~/.zshrc
export PATH=$HOME/command:$PATH
```

### コマンド一覧
#### lower_uuid

```bash:~/command/lower_uuid
#!/bin/sh
uuidgen | tr "[:upper:]" "[:lower:]"
```
政治資金パーティの収入の違和感をデータから暴き出す

# はじめに
2023年12月、ニュースで大々的に取り上げられている、某党の政治資金パーティ収入の一部不記載の疑惑。
この件について、公開されている政治資金収支報告書を読み解くことで何か違和感に気づくことができないか試してみた。


# データソース

## 政治資金収支報告書
総務省が公開している令和４年の政治資金収支報告書から該当する政治団体の頭文字（５０音順）をクリックして、さらに政治団体名のリストの中から選択する。
今回の件に関係する派閥の政治団体は”その他の政治団体"に分類されているようだ（図１参照）。
政治団体の正式名称は、"⚪︎⚪︎派"などとWeb検索すれば特定することができる。



https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/reports/SS20231124/

図１　
![スクリーンショット 2023-12-15 12.15.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/e4f5f27b-6f81-28f7-c486-df6db7f97832.png)

パーティ収入は、（その１０）のページに記載されている。収入、支払った人数、開催日、開催場所などが確認できる。

図2
![スクリーンショット 2023-12-15 12.24.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/99b76274-3524-f293-2a12-d52d817e13d2.png)

# パーティ券販売枚数の推定
ここで図２中のパーティ券の対価を支払った人数は、必ずしも販売枚数と一致しないことに注意が必要である。１人で複数枚購入したケースもあり得るためである。
各派閥の報告書の（その１１）を観察していくと（図３参照）、一枚あたりの相場が20000円であることがわかり、これはテレビ報道されている内容とも一致している。


図３
![スクリーンショット 2023-12-15 12.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/ed3b852c-6311-96f0-30c9-57e21ac10471.png)

よって、今回は次式で販売枚数を推定することとする。

```
収入 ÷ 20000 = 販売枚数
```

# 派閥所属議員の人数
令和４年の報告書をベースにしているため、2022年4月現在の人数を以下のリンクから参照した。

https://www.asahi.com/articles/ASR5V72HWR5VUTFK00X.html


# Excelを使ったデータのまとめ
前述の内容を前提に、６派閥に対してデータを集めてExcelに入力した。
また、以下の計算式を使って、いわゆるノルマと言われている派閥所属議員１人あたりの平均販売枚数を算出した。（表１）
列Eに対して、Excelのデータ分析機能を使って基本統計量を算出した。（表２）

```
列B÷ 20000 = 販売枚数
列D ÷ 列C　　　　　 = 派閥所属議員１人あたりの平均販売枚数
```

表１

![スクリーンショット 2023-12-15 12.37.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/006f3aa3-4778-7465-8d66-3668dcd372e2.png)


表2
![スクリーンショット 2023-12-15 12.48.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155751/f8ac5871-fbcf-7a30-8dd2-57d579de27de.png)


# 派閥ABの平均販売枚数
他の派閥と比較して、派閥ABの平均販売枚数が圧倒的に少ないことが分かる。
この数値が妥当かどうか検討してみる。

# 報道ベースでのパーティ券販売ノルマ
　以下の報道によれば、１期目の議員で20-30枚、2期目で50-100枚と当選回数に応じて割り当てが増加するようだ。

https://www.ktv.jp/news/feature/231205-partykenmiyazakikensuke/


# 派閥ABの平均販売枚数の妥当性
派閥所属議員の個別の販売ノルマについては知る術がないが、１期目で少なくとも20枚、ベテラン議員も所属しているはずなので、平均５０枚程度というのは違和感がある。

さらに、他の派閥とのギャップも大きく収支報告書の妥当性について疑問を抱かさせる要因の一つとなり得るだろう。

# 実態はどうだったのか？

報道各社は、直近５年間で5億円の不記載があると報じている。


https://www3.nhk.or.jp/news/html/20231201/k10014274341000.html

単純計算で１年あたり1億円と仮定する。
報告書に記載されている派閥ABの収入に1億円を上乗せして再計算してみる。

```
仮定に基づく収入実態：
100,000,000 + 94,800,000 = 194,800,000円

仮定に基づく販売枚数の実態
194,800,000 ÷ 20,000 = 9,740枚

仮定に基づく所属議員１人あたりの平均販売枚数の実態
9,740 ÷ 93　　　　　 = 104.7枚
```

すると、104.7枚となり、他の派閥の傾向に近づくことがわかった。

これを言い換えると、所属議員の一人あたりの平均販売枚数が極端に少ない場合、妥当な平均販売枚数との差分を補正することで不記載分の金額をある程度推定できる可能性を示している。

# まとめ
各派閥の政治資金パーティー券販売ノルマの傾向が概ね類似しているという前提で、特定の派閥の所属議員１人あたりの平均販売枚数が極端に少ないことが指摘できて、報道されている多額の不記載の疑惑がある派閥と合致していることがわかった。
一方で、すべての派閥が足並みをそろえていた場合は今回のようなデータ分析のアプローチでは違和感に気づくことはないかもしれない。
したがって、政治資金の収支に対してのさらなる透明性の確保が重要であることが再認識できた。

また、収支報告書が紙媒体のものをスキャンしてPDF化しているようで、データ処理に手作業が多く要求される。電子化を推進していただきたいと思う。
【Gemini API】Python Quickstart 日本語版

## はじめに

このコードは、GoogleのGemini APIを使用したPythonクイックスタートガイドです。Gemini APIは、Googleの大規模言語モデルにアクセスするためのPython SDKを提供します。このガイドでは、APIのセットアップから、テキストや画像を含むマルチモーダル入力を使ってテキスト応答を生成する方法まで、一連のステップを通じて詳細に説明されています。以下にその解説を行います。

---

下記の記事もおすすめ

https://hamaruki.com/building-a-chatbot-geminowl-that-combines-gemini-api-and-line-bot-api/

https://hamaruki.com/yi-6b-chat-on-google-colab/

## インポートとパッケージの準備

```python

import pathlib
import textwrap

import google.generativeai as genai
from google.colab import userdata
from IPython.display import display
from IPython.display import Markdown

def to_markdown(text):
  text = text.replace('•', '  *')
  return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))
```


- このセクションでは、必要なパッケージをインポートしています。 
- `to_markdown`関数は、テキストをMarkdown形式に変換するためのユーティリティ関数です。

## APIキーの設定

```python

GOOGLE_API_KEY = userdata.get('GOOGLE_API_KEY')
genai.configure(api_key=GOOGLE_API_KEY)
```


- Gemini APIを使用するためには、Googleから取得したAPIキーが必要です。 
- ここでは、ColabのシークレットマネージャーからAPIキーを取得して、`genai`に設定しています。

## 利用可能なモデルのリストアップ

```python

for m in genai.list_models():
  if 'generateContent' in m.supported_generation_methods:
    print(m.name)
```

 
- `genai.list_models()`を使用して、利用可能なGeminiモデルを一覧表示します。 
- `generateContent`メソッドをサポートするモデルのみをフィルタリングしています。

## テキスト入力からのテキスト生成

```python

model = genai.GenerativeModel('gemini-pro')
response = model.generate_content("人生の意味とは？")
to_markdown(response.text)
```

 
- `genai.GenerativeModel`を使用して、特定のモデル（ここでは`gemini-pro`）をロードします。 
- `generate_content`メソッドを使って、質問に対するテキスト応答を生成します。

## 画像とテキスト入力からのテキスト生成

```python

img = PIL.Image.open('image.jpg')
model = genai.GenerativeModel('gemini-pro-vision')
response = model.generate_content(img)
to_markdown(response.text)
```

 
- 画像とテキストの両方を入力として受け取ることができるマルチモーダルモデル（`gemini-pro-vision`）を使用します。 
- `generate_content`メソッドに画像を渡して、テキスト応答を生成します。

## チャットでの会話

```python

model = genai.GenerativeModel('gemini-pro')
chat = model.start_chat(history=[])
response = chat.send_message("幼い子供にコンピューターがどのように機能するかを一文で説明します。")
to_markdown(response.text)
```

 
- `genai.GenerativeModel`を使って、マルチターンチャットを行うための会話セッションを開始します。 
- `send_message`メソッドを使用して、会話にメッセージを送信し、応答を取得します。

## 埋め込みの使用

```python

result = genai.embed_content(
    model="models/embedding-001",
    content="人生の意味とは？",
    task_type="retrieval_document",
    title="単一文字列の埋め込み")
```


- Gemini APIを使用してテキストの埋め込み（ベクトル化）を生成します。
- この埋め込みは、検索、分類、クラスタリングなどのタスクに使用できます。

以上の解説で、このコードがどのようにGemini APIを使用しているのかが明確になりました。このガイドは、APIの使用方法を学ぶのに非常に役立つ資料です。

さらに詳しい解説は下記のノートブックを参考にしてください。

## ノートブック

https://colab.research.google.com/drive/1ewsCl2H7wBpCxvopsBTTR-3GgL2ggIBc?usp=sharing

## 参考記事

https://ai.google.dev/examples/doc_search_emb

https://ai.google.dev/docs?hl=ja

https://github.com/google/generative-ai-docs/tree/main
An-Introduction-to-Docker

# Environment
OS: Ubuntu 22.04.3 LTS

# Docker instll
```
sudo snap install docker
docker run hello-world
```
# Error handling with permission denied
```
sudo groupadd docker
sudo usermod -aG docker ${USER}
sudo gpasswd -a $(whoami) docker
sudo chgrp docker /var/run/docker.sock
# sudo reboot # if you have no ps, else reboot in manual
docker run hello-world
```

<details>
<summary>
if you install Docker completly, you can see this.

</summary>

```
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

</details>

# Usage
## check active process
```
docker ps
```
## check active&paused process
```
docker ps -a
```
## delete paused process
```
docker rm [CONTAINER ID]
```
## illustration to use Doker
### boot container ubuntu bash and keep it on CLI.
```
docker run -it ubuntu bash
```
you can run command on ubuntu bash in Docker.
## pause container
```
exit
```
### restart container
```
docker restart [CONTAINER ID]
docker attach [CONTAINER ID]
```
Node-REDのフロー保存・復元


# はじめに

Node-REDは手軽にフローの作成やデプロイが簡単なツールですが、時にはフローを保存して別の環境に復元したり、バックアップを取りたいことがあります。
この記事では、Node-REDフローの保存と復元の手順について説明します。

# フローのエクスポート(保存）

部分的に保存したい場合は、事前に書き出すフローを選択しておく。

右上のメニューより書き出しを選択

![Qiita_NR1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/1e1ba758-9859-6f32-f77f-2dd3ef051e31.png)

ダウンロード：JSON形式でファイル保存
書き出し：クリップボードにコピーする

![Qiita_NR2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/6b4d3269-edb0-fbd0-ba8d-6ced6b8319f4.png)

# フローのインポート（復元）

右上のメニューより読み出しを選択

![Qiita_NR1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/1e1ba758-9859-6f32-f77f-2dd3ef051e31.png)

読み込みたいフローをコピペするorJSONファイルを選択し、OKを押す。

![Qiita_NR3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/b0aef9f2-7af7-48c0-6e55-61252681fbe3.png)


# 参考ページ

https://nodered.jp/docs/user-guide/editor/workspace/import-export
貯水槽の壁の厚さt 第10章 薄肉圧力容器 基本例題10.03 p336「材料力学演習(20221021)」をsympyでやってみたい。(英:thin wall structure）


# オリジナル
[基本例題10.03 p336](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=341)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　
[←基本例題10.02 p335](https://qiita.com/mrrclb48z/items/3720e92f6cab2cdf77ae)

# sympyで
```python
from sympy import *

var('σa,σt'  ,real=True)
var('Q,H'    ,real=True)
var('D,t,p,g',real=True)
gt=Gt(t,Q*g*H/σa*D/2)                         ;print("#",gt)
rep={Q:1.0*10**3,D:10,H:5,σa:5.0*10**6,g:9.8} ;print("#",rep)
print("#",gt.subs(rep))
# t > D*H*Q*g/(2*σa)
# {Q: 1000.0, D: 10, H: 5, σa: 5000000.0, g: 9.8}
# t > 0.049
```
# いつもの? sympyの実行環境と 参考のおすすめです。
(テンプレート)

https://qiita.com/mrrclb48z/items/00dd08b0317069be9342
AWS DocumentDBのバージョンアップ

## はじめに
エアークローゼット　アドベントカレンダー15日目の記事です。

https://qiita.com/advent-calendar/2023/air-closet

## DocumentDBのバージョンアップ (V3.6 -> V5.0)
AWSの公式ではDocumentDBのバージョンアップは[AWS DMS](https://docs.aws.amazon.com/documentdb/latest/developerguide/docdb-migration.versions.html)を使用する方法を掲載しています。
しかし、今回は以下の理由のため、mongoDBのdumpとrestoreを用いた方法でバージョンアップを行いましたので、参考になれば幸いです。

#### mongodumpを使用した理由
- 本番環境を運用したままの移行のため、障害を発生させたくない
- 移行前後のデータ整合性を保つため

### mongodump
以下のコマンドでリストア用のbsonファイルを生成します。
```
mongodump --host <host> --port=<port> --username <username> --password <password> --out=<output_file_name>
```

### mongorestore
dumpで生成したファイルでリストアを実施します。
```
mongorestore --host <host> --port=<port> --username <username> --password <password> --drop <input_file_name>
```

mongoDBとDocumentDBの差分があるため、DocumentDBバージョンを5.0にする際に、接続時のオプションを追加する必要があります。
詳しくは[こちら](https://docs.aws.amazon.com/documentdb/latest/developerguide/functional-differences.html#functional-differences.retryable-writes)をご覧ください。

```
retryWrites=false
```

移行の作業は以上となります。

## 最後に
本記事をご覧いただきありがとうございます。
[エアークローゼット Advent Calendar 2023](https://qiita.com/advent-calendar/2023/air-closet)はまだまだ続きますので、他のエンジニア、PMの記事もご覧ください。
また、エアークロゼットでは採用活動も行っておりますので、興味のある方はこちらのリンクまで！！

https://corp.air-closet.com/recruiting/developers/
(今更ですが)Ionic5から6へのアップデート

個人開発したアプリをメンテナンスしておらず、Ionicがv5のままでした。
現在Ionicはv7が最新です。最新にするために、一旦v5からv6へアップデートします。

## 環境
| ライブラリ | 旧バージョン | 新バージョン |
|:-:|:-:|:-:|
|  @ionic/core | 5.3.4   |  6.7.5 |
| @ionic/react | 5.3.4   |  6.7.5 |
| react  |  16.13.1 | 17.0.2  |
|  react-router |  5.2.0 |  5.2.0(v6にはしない) |

## アップデート手順
公式サイトに手順が掲載されています。

[Updating from Ionic 5 to 6](https://ionicframework.com/docs/updating/6-0)

### Reactのアップデート
Ionic6はReact17+をサポートしているとのことで、17にアップデートします。

```
npm install react@17 react-dom@17 
```

### Ionicのアップデート
```
npm install @ionic/react@6 @ionic/react-router@6 @ionic/core@6
```

### 設定ファイルの編集
testフィールドを更新して、transformIgnorePatternsを含めます。
```package.json
scripts": {
  "test": "react-scripts test --transformIgnorePatterns 'node_modules/(?!(@ionic/react|@ionic/react-router|@ionic/core|@stencil/core|ionicons)/)'",
  //省略
}
```

### App.tsxの編集
setupConfigをsetupIonicReactに置き換えます。

```App.tsx
import { setupIonicReact } from '@ionic/react';
//省略

setupIonicReact({
  mode: 'md'
});
```

### コントローラのインポート部分の編集
@ionic/coreから@ionic/core/componentsに更新します。

### コードの修正
変更のあるコンポーネントを使用している場合に、コードを編集します。

[Updating Your Code](https://ionicframework.com/docs/ja/updating/6-0#datetime)

私の場合は、以下の編集をしました。

#### Datetime
自動でローカライズしてくれるようです。
displayFormat、displayTimezone、pickerFormatを削除しました。

```diff_javascript
<IonDatetime
  className='ion-text-center'
- displayTimezone='Asia/Tokyo'
- displayFormat='YYYY年MM月DD日'
+ presentation="month-year"
  value={hoge_date}
  placeholder='Select Date'
- onIonChange={(e) => setDiagnosisDate(e.detail.value)}
+ onIonChange={(e) => setDiagnosisDate(event.detail.value.toString())}
/>
```

#### Modal
cssClassプロパティが無くなっていました。

```diff_javascript
<IonModal
  isOpen={show_modal}
- cssClass='modal-tag'
+ className='modal-tag'
  onDidDismiss={() => {setShowModalEdit(false)}}
>
```

アップデート後、無事に動作しました。
次はv7へのアップデートです…！

react-routerもv5からv6で大幅な変更があるようです。
そちらも対応していきます。
【メモ】Linuxのコマンドを手動でバージョンアップする

　個人で開発環境を作ってると時々やることになるのでメモ。
　Linuxコマンドもコマンドのバージョンによって挙動や処理速度が変わることがあるので、バージョンを揃える時に毎回調べなくて良いように書き残し。

・『最終的に適用したいサーバーと自宅の開発環境でバージョンをそろえたい』
・『パッケージマネージャー（`yum`とか`apt`とか）のデフォルトに最新版が無いし最新版のあるリポジトリを探して登録するのもめんどくさい』

　って時用のメモです。

## 目次
[1.前提になる状況](#前提になる状況)
[2.主なパッケージマネージャーの一覧](#主なパッケージマネージャーの一覧)
[3.まずはsrcフォルダ](#まずはsrcフォルダ)
[4.makeファイルの生成とインストール](#makeファイルの生成とインストール)
[5.インストール後の確認](#インストール後の確認)

## 前提になる状況
　パッケージマネージャーである`yum`とか`apt`とかのデフォルトのリポジトリに最新版がない状況です。
　特にCentOSやFedoraといったRedHat系は更新が止まってるものが多いです。
　ちなみにこの記事は`Fedora（Linux version 3.10.0-693.2.2.el7.x86_64(gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) ）`の話になります。

#### 主なパッケージマネージャーの一覧
 |OS|主なパッケージマネージャー|
 |:-----------|:------------:|
|Linux（Red Hat系、CentOSやFedoraなど）|yum、rpmなど|
|Linux（Debian系、UbuntuやgLinuxなど）|apt|
|Mac|brew|
|Windows|winget|

　パッケージマネージャーはプログラム言語ごとにも存在します。
　Pythionのパッケージはpip、Node.jsのパッケージはnpm、PHPのパッケージはcomposer。

## まずはsrcフォルダ
　パッケージマネージャーを使わない場合はソースコードをビルドしてインストールする事になります。
　ソースコードを置くのは基本的に`/usr`配下の`src`フォルダです。
　`src`はソースコードの略らしく、ここが推奨される様子。つまり`/usr/bin`に置くコマンドのソースなら`/usr/src`に、`/usr/local/bin`に置くコマンドのソースなら`/usr/local/src`が推奨の場所になります。
　対象のコマンドがどこにあるかは`which`コマンドで確認可能。

```
$ sudo su
$ which grep
　alias grep='grep --color=auto'
        /usr/bin/grep
```

　ソースコードの入手は`curl`か`wget`を使用します。
```
$ cd /usr/src
$ curl -L https://ftp.gnu.org/gnu/grep/grep-3.11.tar.gz > ./grep-3.11.tar.gz
$ tar -zxvf ./grep-3.11.tar.gz --no-same-owner
```
　`curl`なり`wget`なりで落としてくるソースコードは、バージョンを調べて『GNU』の文字があればだいたい[GNUの公式サイト](https://www.gnu.org/home.ja.html)にあります。
　悪意のある動作が仕込まれたものを避けるためにも、なるべく公式のものを入手した方が良いです。
 
## makeファイルの生成とインストール

　makeファイルの生成。
 
　`configureファイル`の中を見るとデフォルトだと`/usr/local`に行くようだったので、`--prefix`オプションを指定します。
　※ここまででエラーが出ていたらgrep-3.11のディレクトリを削除してファイルの解凍からやり直す。
 ```
$ cd /usr/src/grep-3.11
$ ./configure --prefix=/usr
```
　これで`makeファイル`が作られるので、念のため中の処理をテキストとして確認しておきます。
　今回は、`makeファイル`の中を見ていくと`grep`以外に`egrep`と`fgrep`も更新対象になっていたのでそれらもバックアップとして名前を変えてとっておきます。
```
$ cp /usr/bin/grep /usr/bin/grep-2.2.0
$ cp /usr/bin/egrep /usr/bin/egrep-2.2.0
$ cp /usr/bin/fgrep /usr/bin/fgrep-2.2.0
```
 （なお、この名前を変えた`grep`も`grep-2.2.0`というコマンドとして普通に使えます）

　次に`make`コマンドで`makeファイル`に沿ったソースコードのビルドを開始。
　その後に`make`でインストールを実行します。
```
$ cd /usr/src/grep-3.11
$ make
$ make install
```

## インストール後の確認

```
$ which grep
　alias grep='grep --color=auto'
        /bin/grep
$ grep --v
```
　私のケースではここで`grep --v`がこけて`--color=auto`が解決できない旨のエラーが出ました。おそらく元から入ってたものと細かい実装が違うのでしょう。
　コマンド実行時の`alias`を変更したらエラーが無くなりました。
 ```
$ alias grep='grep'
$ grep --v
 ```
 　これでバージョンアップ完了。
 　このあと`grep`を使っておかしい所があればバックアップしたコマンドで上書きして`alias`を戻すことで元に戻せます。

　他のコマンドも同じように更新可能です。
Github Actionsを直列→並列実行に変更してApp Distributionへの配布時間を高速化させた。

Github Actionsを使用してApp Distributionにアプリを配布していました。

配布用途の種類は以下の3種類。
<table>
  <caption>配布用途の種類</caption>
  <thead>
    <tr>
      <th>名前</th> <th>配布の用途</th>
    </tr>
  </thead>
  <tr>
    <td> buildTest </td> <td>Xcodeのビルド</td>
  </tr>
  <tr>
    <td> publishDebug </td> <td>App Distribution（開発環境）</td>
  </tr>
    <tr>
    <td> PublishProd </td> <td>App Distribution（本番環境）</td>
  </tr>
</table>


直列実行をしているので、buildTest→publishDebug→PublishProdの順番で動いていた。
その為、配布が完了するまでに約1時間かかっていました。
![スクリーンショット 2023-12-13 17.05.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370083/478e7716-45d7-05be-d982-dfe255186080.png)

## 直列実行時の処理

fastlaneで各3つのレーンを作った上でその３つをまとめるレーン（publishAll）を用意。
```ruby:fastfile

  ## Xcodeのビルド
  lane :test do
  end

  ## App Distribution（開発環境）
  lane :publishDebug do
  end
  
  ## App Distribution（本番環境）
  lane :publishProd do
  end

  ## 上記、３つの処理をまとめる
  lane :publishAll do
    test
    publishDebug
    publishProd
  end
```


ワークフローでは、ジョブは一つで`run`にはまとめたレーン（publishAll）を指定。
```yml:pubrish.yml

jobs:
  build:
    runs-on: macos-13
    timeout-minutes: 90 
    steps:
    - name: Publish
      run: bundle exec fastlane publishAll
      env:
        MATCH_PASSWORD: ${{ secrets.FASTLANE_MATCH_PASSWORD }}
        RELEASE_NOTES: ${{ github.event.inputs.release-notes }
```

## 並列実行への変更方法

各レーンを別々のワークフローのジョブで動かすのでまとめたレーン（publishAll）はもういらなくなる。
```ruby:fastfile
  ## Xcodeのビルド
  lane :test do
  end

  ## App Distribution（開発環境）
  lane :publishDebug do
  end
  
  ## App Distribution（本番環境）
  lane :publishProd do
  end

  ## 別々で動かす為、まとめる処理はもういらない。
  ## lane :publishAll do
    ## test
    ## publishDebug
    ## publishProd
  ## end
```

ジョブはレーン別に3つ用意する。
各ジョブには同様の処理を入れて、`run`だけ別々のレーンを指定する。
```yml:pubrish.yml
jobs:
  buildTest:
    runs-on: macos-13
    timeout-minutes: 90 
    steps:
    ----------------------
    （各jobで同様の処理を入れる）
    ----------------------

    - name: Publish
      run: bundle exec fastlane test

  publishDebug:
    runs-on: macos-13
    timeout-minutes: 90 
    steps:
    ----------------------
    （各jobで同様の処理を入れる）
    ----------------------
    
    - name: Publish
      run: bundle exec fastlane publishDebug

  publishProd:
    runs-on: macos-13
    timeout-minutes: 90
    steps:
    ----------------------
    （各jobで同様の処理を入れる）
    ----------------------
    
    - name: Publish
      run: bundle exec fastlane publishProd

  log:
    ## ジョブを行った後に動かしたい場合、needsを使って実行元のジョブを指定する。（今回は完了のlogだけ）
    needs:
      - buildTest
      - publishDebug
      - publishProd
    runs-on: macos-13
    timeout-minutes: 90 
    steps:
    - name: Log
      run: echo "done"
```

### 実行結果
 ![スクリーンショット 2023-12-13 17.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370083/3c4c296f-a996-9b81-5ea3-cc86ac178be2.png)

## 感想
結果的にApp Distributionに配布できるまでの時間だけなら約1時間→10分程度まで短縮することができました🎉🎉
待ち時間が削減されて、開発効率が圧倒的に上がりました🙌

ちなみにbuildTestが思っているより時間が掛かっているのは別の原因がありそうでした。
その原因については、また投稿します。
エンジニアが身につけるべきPdMとの的確なコミュニケーション

この記事は[リンクアンドモチベーション Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lmi)の17日目の記事になります。

## はじめに
こんにちは。リンクアンドモチベーションでエンジニアをしている野田です。
私は日々のプロダクト開発の中で、プロダクトマネージャー(PdM)に提案・相談し、開発方針や仕様について合意をしています。
そんな中で、うまく意図を伝えることができず、手戻りが発生するなどスムーズに合意できないことも多くありました。
その原因の多くは、私が的確なコミュニケーションをとれてないからだと感じたため、今回はPdMとコミュニケーションを取る際に心がけるポイントをまとめていきます。

## 準備段階で気をつけること
### 1. 何を決めたいかを明確にする
何を決めたいかを明確になっていない場合、コミュニケーションのゴールが決まっていないということになります。
どこに向かってコミュニケーションをとるのかお互い分かっていないと、合意できるものも合意できません。
まずは自分が「何を決めたいのか」を明確にして臨みましょう。

### 2. 誰と決めるべきか確認する
何でもかんでも困ったらPdMに相談するのではなく、論点や課題毎に誰と決めるべきかを適切に判断しましょう。
場合によってはエンジニア同士で相談すれば済む問題かもしれないですし、デザイナーと相談すべき事項かもしれません。
適切に判断するためには、役割毎の責任範囲をきちんと把握しておく必要があります。
責任範囲は開発組織ごとに微妙に異なるはずなので、まずは自組織の各責任範囲を明確にしましょう。

### 3. 自分が考えたプロセスをそのまま持っていかない
自分にとっては提案する過程で考えたプロセスは大事かもしれませんが、相手にとってはそうではありません。
自分が考えたことをそのまま伝えるのではなく、PdMが気にすべきことに絞って改めてどう伝えるかを考えましょう。

## コミュニケーションで気をつけること
### 1. 前提条件を明確にする
提案・相談を行う上で、何かしら前提となる条件は存在するはずです。
誰の目にも明らかな前提条件を暗黙の了解として問題ないですが、意見が分かれる可能性がある前提条件は必ず明確にしましょう。

### 2. 事実なのか解釈なのかを明確にする
伝達する情報は「データ等を元に判明した事実」なのか、何かを元に自分がそう解釈しただけなのかを明確にしましょう。
解釈を事実のように伝えてしまうと、伝達する情報の信頼性が損なわれ、意思決定をスムーズに進めることができなくなる可能性があります。
事実と解釈は明確に区別して伝えましょう。

### 3. 選択肢の粒度を揃える
選択肢を持っていって提案するコミュニケーションを取る場合、選択肢の粒度は必ず揃えましょう。
粒度が揃っていない場合「選択肢が本当にこれだけなのか？」「どれか一つを選択できるのか？」などの懸念が生まれ、提案した選択肢だけでは決められない可能性が高いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887131/0ff46a8f-74c0-36c9-6229-a5673da74e50.png)

### 4. 複数の課題を混ぜて話さない
課題は必ず分解できない粒度まで分割し、依存関係に従って順に解決していきましょう。
課題が混ざってしまうと頭の中で課題の分解が必要になり、意思決定する際の負荷が高まります。
なるべく相手に負荷をかけないようなコミュニケーションを心がけましょう。

### 5. 検討できていないことは素直に認める
自分が完璧だと思って提案を持っていったとしても、検討事項が漏れてる場合はもちろんあります。
PdMと議論する中で検討漏れがあることが判明した場合は素直に認め、持ち帰って検討しましょう。
その場で乗り切ろうとすると、曖昧な返答になってしまい不信感を与えてしまったり、ミスリードしてしまう可能性があります。
建設的な議論にするために、その場しのぎの対応はやめましょう。

## 最後に
ここまで色々なコミュニケーションの観点を挙げましたが、一番意識すべきはお互いにリスペクトを持って協働することだと考えています。
お互いに相手に余計な負荷をかけずに役割に集中してもらえるよう考えることが大事です。
その上で、必要なコミュニケーションはどんどんとって良い成果を生んでいきましょう！
AI機能を使ってプレゼンテーションを準備してみる

## はじめに

初めまして！

この記事は、ミロゴス Advent Calendar 2023 15日目の記事です。

私は社会人2年目の金と申します。

IT業界で働きながら、「CharGPT」や「Gammma」、「Midjourney」等々のAIツールをよく耳にします。

よく耳にしていますが、実際に使ったことがないため、今日はAIツールを作ってプレゼンテーションを準備してみたいと思います！

PPTやプレゼンテーション内容には一切手を触れず、完成するのが今日の目標です。

まず、AIツールの魅力的なメリットを紹介いたします。

## AIツールのメリット

- 多様なコンテンツを簡単に作成
- 検索時間の節約と大量の情報まとめ
- 自動化された作業処理
- 複雑な問題を分析して解決策を提示

上記のメリットと実際に経験したく、PPTやドキュメント、ウェブページを自動で作ってくれる「Gammma」と質問と主題に答えてくれる「CharGPT」を使ってみます。

今日は『太陽の役割』というテーマでプレゼンテーションを作って見たいです。

## 作業の流れ
▶「Gamma」でppt作成
▶プレゼンテーション発表内容は「ChatGPT」で作成


まず、「Gamma」を開いて今日のテーマを入力してみました。そうすると自動的にテーマの概要まで紹介してくれます。

今回は追加したい概要がありまして、要らない概要は削除後、一部編集してから【続ける】ボタンを押します。

編集した概要に基づいて作業物が作成されます。
手作業で作ったpptよりも綺麗にまとめてくれる技術力にびっくりしました。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630314/40168ab5-1497-98b0-a75f-2932016d435d.png)
![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630314/ad470ac6-06e2-e340-9004-7aacd3249ca1.png)
![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630314/f30a7c71-082e-ba2d-7910-c73b29f3630a.png)


次は「ChatGPT」を使って内容を準備します。

韓国人である私は作業時間を減らすため、韓国語で命令後、日本語に翻訳を命令してみました。

結果的に内容を日本語で翻訳してくれる作業まで完璧にやってくれました。

![Untitled (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630314/e1bbda62-9ccc-e72e-55d3-1dabd9bc15a9.png)
![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630314/abe6071b-5137-c1bc-7a6e-ce4b0cd8eee3.png)
![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630314/2eaeb9cb-3618-c0ec-a84b-f7c592261397.png)
![Untitled (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630314/97ac6aee-7953-cbbb-da86-48a558a627e3.png)

## 最後に

短時間でPPTを作って簡潔で見やすくPPTを作ったり、発表の内容まで綺麗にまとめてくれる時代になってPPTの見た目や発表内容の表現に誤りがあることに気にせず、内容に集中して質高い発表に繋がることができると実感しました。

短時間でプレゼンテーションを準備したいけど内容に集中したい人にはお勧めのツールとやり方です！

以上、ここまで読んでいただきありがとうございました！
JINS BRAINサービス刷新裏話

**長めの自己紹介**

こんにちは！　テクノロジー戦略部の王璐佳（Lulu Wang）です。
2021年1月1日からJINSにジョインしました。
今はデジタルソリューションを開発し、アイウエア購入体験のデジタルトランスフォーメーション化（DX化）の促進を担当しています。

私が所在しているテクノロジー戦略グループはJINSのIT・デジタル部門の傘下に入っていますが、ITやテクノロジーに関する知識はほぼ持っていない初心者でした。
それでも、今回ご紹介するJINS BRAINの刷新PJのPMを任され、システム開発の基本工程については日々学び続けながらPJを進めて参ります！

全然余談ですが…私は中国・瀋陽市出身です。興味深いことに、JINSの海外初の店舗が瀋陽にあったのです。
入社前からも、とても縁を感じるブランドでありながら、JINSのメガネをずっと愛用してきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630771/76261d3b-e359-85d8-94a7-00a754f0da19.png)


 

**JINS BRAINはな〜に〜？**

JINSのお店やオンラインショップに並ぶメガネは、形も色もさまざま。
「自分に似合うメガネを探したい」と思っても、どうやって探せばいいの？ と悩む人もいるかもしれません。
店頭ならスタッフに相談するのも一案ですが、スタッフが忙しくて聞きづらい。。。と思っていませんか？　もっと気軽に使えるのがデジタルサービスです！という発想で、2016年にJINSが独自に開発した、AIによるメガネの似合い度測定サービス「JINS BRAIN」が登場しました！

**なぜ刷新しようと思ったか？**
2つほど大きな理由があります☟
![スクリーンショット 2023-12-15 13.07.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630771/229edbca-98a1-848a-b9f6-bd06fa7f0475.png)

**新しいJINS BRAINは、どう変わるか？**

まずは、店頭版JINS BRAINから刷新し、POCにおける下記３つの改善を検証していきます。
1.	お客様のニーズに合わせて、最適な設置場所をA/Bテストで検証。
・テストAのシナリオは、初めから似合うメガネを試して最短で選びたい→入店してすぐあるいはHOTSPOT隣にJINS BRAINを設置
　　・テストBのシナリオは、商品を選んでいるときに、どちらのメガネが良いか悩んでいるので、似合うメガネを教えて欲しい→店内の商品棚の隣や大きい鏡の隣にJINS BRAINを設置
2.	サービス機能について、
2.1 顔型診断結果と、結果に応じたおすすめメガネの提案ができるようになったし、印象で選ぶ機能を新規で追加することによってお客様とのインタラクションを増え、顧客満足度を高められるよう期待中です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630771/d05c8337-b6a4-080a-7a81-2da324f86c45.png)

2.2 レコメンドされた商品をバーチャル試着ができ、気に入ったフレームを“いいね”すると、スマホにまとめて保存できるようになったので、顧客が自分のスマホを見ながら店内回遊ができるようになりました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630771/66453b41-11c4-4593-8835-0fd7e6b55137.png)



**最後に**
JINS BRAINに関しては、まだまだ挑戦したいことがいっぱいある。
例えば、
・AI画像/動画分析サービスを使って、ユーザーの性別、年齢などを自動判定して似合うメガネを提案するとか
 ・顔のサイズで似合うメガネを絞り込みとか
も検討中です！
なんで、JINS BRAINの進化はこれからまだまだ続きます！
皆様、もし店舗へ足を運ばれる際には、ぜひJINS BRAINを体験し、お楽しみにしてください！
gitのコミット履歴の順番を入れ替えてまとめる方法

年末の大掃除やってますか！

大掃除って大変ですよね。嫌いです。普段からやっておけよって話なんですよね。
という事で、今回はgitの方も普段から綺麗にしておくやり方をまとめておこうと思います。具体的には

- コミットの順番を入れ替える
- コミットを１つにまとめる

こんな事をする作業になります。

:::note warn
この説明は、マージコミットはまたいでいない前提の手順です。
個人の作業用ブランチでの実施に留める事をオススメします。
また、マージコミットを跨いだ作業は他の人の迷惑にもなるので推奨はされていません。
:::

でも、これそもそも掃除の必要ある？なんで大事なの？という所から話そうと思います。

## なぜcommit履歴を綺麗にするのか

### レビューがしやすいから

理由の１つはレビュワーの事を考えてです。
コードレビューしてくれる人は「なんでここ書き換えたんだろ？」と疑問を抱いた時にコミットメッセージやコミット履歴を見て経緯を辿ったりします。
そのためにもコミットメッセージやコミット履歴は綺麗にしておく事で適切で効率的なレビューが実施出来ます。

### 将来の自分のため

3ヶ月前に自分がコミットした履歴を見てみましょう。どういった意図で、なぜそれを書き換えたのか理解出来るでしょうか？
過去になればなる程、過去の自分は他人と思えるぐらいに案外理解しにくいものです。
「類似修正する際に参考にしよう」とか「バグ原因を究明する」などの理由で見返す事があるので、綺麗にしておきましょう！

では具体的な例をもってやり方を解説していきます！

## コミット履歴の整理のやり方

### ログを確認する

まずはコミット履歴を確認します。

```bash
$ git log --oneline
4bb3770 (HEAD -> main) B UPDATE
7d936f6 D ADD
ab6a017 C ADD
065d23a B ADD
2794f6e A ADD
```

`git log`は上が最新のコミット、下が古いコミットです。なので、「ＡＢＣＤの順番で追加されて、Ｂが更新されたのね」というのがわかります。

１つの実装修正タスクの中で、動作確認とったけど、Ｂにdebugメッセージが残ってた！とかバグがあった！が後からわかって更新する事ありますよね！
では実際に **最後の`B UPDATE`のコミットを移動させてB ADDのコミットにまとめてみましょう**。

### 順番を入れ替えてスカッシュする

コミット履歴を変更する場合使うコマンドは`git rebase`です。インタラクティブに実行する場合は`-i`を指定し、修正したい範囲として一番古いコミットを指定します。
よくみる`git rebase -i HEAD~~~~~`とか`git rebase -i HEAD~5`とかはHEADから５個前のコミット以降を修正したいって意味になりますね！
今回は`B ADD`のコミットに`B UPDATE`を入れたいので、`A ADD`以降という指定が必要になりますので、以下となります。

```bash: 修正したいコミットより１つ下を指定してるのがポイント
$ git rebase -i 2794f6e  # A ADDのコミット番号を指定してますね！
```

するとこうなるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/b543d5cb-5a66-4450-6e6d-503a178a2cee.png)

**`git log`の時とは逆順に並んでるので注意**してくださいね！

これを以下のように修正します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/26dbf5e8-75b1-d8c9-956e-9fcb58852c5e.png)

`squash`とは１つ前のコミットにこの修正を混ぜ込むという命令です。
私の場合は、`vim`で作業しているので、`:wp`で修正を保存します。

するとコミットメッセージどうしますか？という画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9872/db237bf2-fdf6-c2da-36b1-472743f78e9f.png)


この時、メッセージの修正が不要ならそのまま`:wp`ですが、
今回はメッセージを`B ADD(UPDATE含む)`にしたいので、上のメッセージを編集し、下のメッセージの行は削除して`:wp`とします。

### 再度ログを確認する

するとこうなったんじゃないでしょうか！

```bash
$ git log --oneline
aac2087 (HEAD -> main) D ADD
5559dc1 C ADD
1b92ff0 B ADD (UPDATE含む)
2794f6e A ADD
```

綺麗ですね！
`git show 1b92ff0`とすると、Bのコミットにちゃんと混ぜ込められたのも確認できますよ！

## まとめ

みんながルールを守ってコミットを整理するとgitlabとかのgraphって本当にきれいになります。
昨今は自動化やコードのAI生成が盛んになってきていますが、AIがよりよいレコメンドや精度の高いコード生成をするためにも、こういった履歴は綺麗にして備えておくといいんじゃないでしょうか。

以上！お疲れ様でした！