OmniAICreator/Qiita-1.07M huggingface dataset:
Cloud Assist Investigations とは何者なのか調べてみた

### なぜ Cloud Assist Investigations を調べようと思ったのか
今年もラスベガスで、Google Cloud Next 25 が開催されました。私はオンラインでの参加ということで、Opening Keynote および Developer Keynote を視聴しました。Keynote では、AI に関するたくさんの新機能が発表されており、映像からも Mandalay Bay の会場の熱気が伝わってきました。

個人的には vertex AI の generative media models や Sphere で上映されるオズの魔法使いのトピックに興味が湧いた一方で、Developer Keynote のデモの中で気になる機能がありました。Cloud Investigations です。

Devlopeer Keynote で、Agentspace のプレゼンターの方がデモを実施するのですが、Agentのバグによってデモが中断してしまいます。その時に Cloud Investigasions を使って鮮やかにトラブルシューティングをしていました。Cloud Logging のエラー箇所から Cloud Investigations を起動してレポートを作成し、エラー原因の特定とデバッグをしていました。

Developer Keynote の 27:42 あたりから見ることができます。

https://www.youtube.com/embed/xLDSuXD8Mls?start=1662

### 少しだけ調べてみる
Cloud Investigations についてもう少し調べたいと思って検索したところ、Google Cloud の公式ドキュメントが存在しましたので紹介したいと思います。

公式ドキュメントでは、Cloud Assist Investigations という名称で、Gemini Cloud Assist に含まれる機能のようです。

ざっくりとしたイメージとしては、トラブルシューティングをサポートしてくれるツールで、

・ログメッセージやマネージドサービス（ GKE や Dataproc など）などから調査を開始できる。

・調査では、根本原因の特定と問題の解決に役立つトラブルシューティング手順や修正方法が提示される。

・追加のサポートが必要な場合は、調査内容をGoogle Cloud サポートケースに転送できる。

とのことです。

得られるメリットとしては、トラブルが解決するまでの時間の短縮と労力を最小限に抑えられる、とのことで、大変気になる機能です。

https://cloud.google.com/gemini/docs/cloud-assist/investigations

### まとめ
Cloud Assist Investigations を使うことで、トラブル発生から解決までの時間と労力を最小限にすることできるかもしれないと考えると、期待に胸が膨らみます。
現在はプレビューであり、実際に使ってみるには Gemini Cloud Assist Trusted Tester プログラムに参加が必要とのことで、使えるようになる日が楽しみです。
【０から目指すAIエンジニア】Day5：PromptTemplateの基礎

# はじめに
こんにちは、慶應義塾大学理工学部機械工学科3年の金賢佑です！
私は東大発AIベンチャーの株式会社2WINSの元でインターンをしています！

これからの記事では自分がインターンを通して最強のAIエンジニアを目指していきます！
第五回は`PromptTemplate`の基礎を記録しました！

# PromptTemplateとは
その名の通り、プロンプトをテンプレート化するためのコンポーネントです！

プロンプトとはLLMに送る指示文のこと！
例えば以下を実行してみてください！

``` python
from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate.from_template("""以下の料理のレシピを教えてください

料理名: {dish}""")

prompt_value = prompt.invoke({'dish': 'カレー'})
prompt_value2 = prompt.invoke({'dish': 'ハンバーグ'})

print(prompt_value.text)
print(prompt_value2.text)
```
上の例では、`prompt`を作成した後に`invoke`で変数`dish`に`カレー`を代入していますね！

実行結果は以下のようになります。
``` 
以下の料理のレシピを教えてください

料理名: カレー
以下の料理のレシピを教えてください

料理名: ハンバーグ
```

人によって教えてほしいレシピは違うものなので、料理名だけが後付けできるのはとても便利ですね！

# ChatPromptTemplate

先程の`PromptTemplate`をChat APIに応用させたものが`ChatPromptTemplate`になります！

例えばあなたがGPTに料理のレシピを聞くことが多いとします。\
毎回文章を書くのは少し面倒ですよね....\
なので料理名だけ後付けできるテンプレを作成してみましょう！

以下のコードを打ってみてください！
``` python
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate(
    [
        ('system', 'ユーザーが入力した料理のレシピを教えてください。'),
        ('human', '{dish}'),
    ]
)
```
これでテンプレの完成です！\
もしカレーのレシピを聞く文章を作成したいときは以下のように`invoke()`で呼び出してあげればいいだけです！

``` python
prompt_value = prompt.invoke({'dish': 'カレー'})
print(prompt_value)
```

後はこのテンプレをLLMに渡してあげましょう！
``` python
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model='gpt-4o', temperature=0)

response = model.invoke(prompt_value)
print(response.content)
```
実行結果は以下のようになり、ちゃんと知りたいレシピが返ってきましたね！

``` text
### 材料
- 鶏もも肉: 300g（一口大に切る）
- 玉ねぎ: 1個（みじん切り）
- にんにく: 2片（みじん切り）
- 生姜: 1片（みじん切り）
- トマト: 1個（角切り）
- カレーパウダー: 大さじ2
- クミンシード: 小さじ1
- コリアンダーパウダー: 小さじ1
- ターメリックパウダー: 小さじ1/2
- ガラムマサラ: 小さじ1
- 塩: 適量
- コショウ: 適量
- サラダ油: 大さじ2
- 水: 200ml
- ヨーグルト: 大さじ2（お好みで）

### 作り方
1. フライパンにサラダ油を熱し、クミンシードを入れて香りが立つまで炒めます。
2. 玉ねぎを加え、透明になるまで炒めます。
3. にんにくと生姜を加え、さらに炒めます。
4. 鶏肉を加え、表面が白くなるまで炒めます。
5. トマトを加え、柔らかくなるまで炒めます。
6. カレーパウダー、コリアンダーパウダー、ターメリックパウダー、ガラムマサラを加え、全体に絡めます。
7. 水を加え、沸騰したら弱火にして蓋をし、15〜20分煮込みます。
8. 塩とコショウで味を調えます。
9. お好みでヨーグルトを加え、さらに数分煮込みます。
10. ご飯やナンと一緒にお召し上がりください。

このレシピは基本的なものなので、野菜や豆類を加えてアレンジすることもできます。お好みのスパイスを追加して、自分だけのカレーを作ってみてください。
```

# まとめ
今回は`PromptTemplate`を使ってテンプレートの作成を行いました！\
次回は`Output parser`を使ってみたいと思います！

お疲れ様でした！

# 参考文献
LangChainとLangGraphによるRAG・AIエージェント〈実践〉入門/西見公宏/吉田真吾/大嶋勇樹
UnityでScrollViewのUIがずれる問題を解決した話【Anchor・サイズ調整・端末対応】

UnityでScrollViewの中に表示されるUIが、解像度や端末によってズレる問題に直面したことはありませんか？

本記事では、私が個人開発中に経験した「ScrollView内のUIずれ問題」と、実際にどうやって修正したかを共有します。

---

## 問題の概要

- ScrollViewの中に`Node`というUIオブジェクトを複数配置
- それに対応する線（`ConnectionLine`）を別Canvasで表示
- 解像度によってNodeと線の位置がズレる
- **iPad等で右にスクロールしきれない現象**も発生

---

## 初期状態の構成

- ScrollView > Viewport > Content（Nodeの親）
- Node：`middle left`のAnchor
- ConnectionLineの親Canvas：`stretch stretch`

この状態だと、**Scroll量とUIの位置計算が一致しない**ためズレが発生します。

---

## 修正のステップ

### Anchorの統一

NodeとConnectionLineの描画基準を揃えるため、Anchorを**両方とも`middle left`に設定**。

```csharp
RectTransform nodeContent = ...; // middle left
RectTransform connectionParent = ...; // 元は stretch → middle left に変更
```
これにより、線とノードの中心が一致するようになります。

### コンテナ幅の動的調整
右にスクロールしきれない問題は、Contentの横幅が足りていなかったのが原因。

```csharp
float requiredWidth = nodeCount * (nodeSpacing + nodeWidth);
contentRectTransform.sizeDelta = new Vector2(requiredWidth, contentRectTransform.sizeDelta.y);
```
### Coroutineで1フレーム待つ
Start()で設定しても反映されないことがあったため、レイアウト確定後に調整。

```csharp
IEnumerator Start() {
    yield return null; // レイアウト確定を1フレーム待つ
    AdjustContainerWidth();
}
```

## 最終的なポイントまとめ
Nodeと線のAnchorを middle left に統一

ScrollViewのContentサイズを 動的に調整

サイズ調整は Coroutineで1フレーム待つ

## 最後に

ブログでもUnityや個人開発ネタを発信中です！
開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深掘りした内容をブログにまとめています。
▶ https://syunpp.com

公開中のアプリ一覧はこちら！
実際にUnityで開発してリリース済みのアプリ一覧をまとめています。
▶ https://syunpp.com/公開中のアプリ一覧/
GNU diff utils を Mingw64 で Windows 向けにコンパイルする

# 契機
サクラエディタで diff 表示用の diff.exe がなくなっていると聞いたので作ってみようと思った

# 方法
Windws の Fedora remix on WSL2 で Windows 向けにコンパイルする

# 手順
1. インストール先、ビルド用のディレクトリを作成
```
mkdir -p ~/opt/diff

mkdir ~/BUILD
cd ~/BUILD
```
make install した後に bin ディレクトリから取ってくるので、ダミーのインストールディレクトリも作成しておく。

2. コンパイラをダウンロード
```
sudo dnf install mingw64-gcc-c++
```

3. ソースをダウンロードして展開
```
curl -O ftp://ftp.jaist.ac.jp/pub/GNU/diffutils/diffutils-3.12.tar.xz
tar Jxf diffutils-3.12.tar.xz
cd diffutils-3.12
```

4. ライブラリの依存を減らすため、スタティックリンクにする
```
export CFLAGS=-static LDFLAGS=-static
export gl_cv_func_strcasecmp_works=no
```
下のは `gl_cv_func_strcasecmp_works` は `gnulib` の変更で入ったらしい。そのままだとエラーになるので no でも yes でも構わないが、取り合えず no にしておく。
https://savannah.gnu.org/bugs/?66978

5. configure && make
```
mingw64-configure --prefix=$HOME/opt/diff --enable-threads=windows
make -j4
```

6. エラー発生！
```
make[2]: Entering directory '/root/BUILD/diffutils-3.12/src'
  CCLD     cmp.exe
  CCLD     diff.exe
  CCLD     diff3.exe
  CC       sdiff.o
sdiff.c: In function 'main':
sdiff.c:577:28: error: passing argument 2 of '_execvp' from incompatible pointer type [-Wincompatible-pointer-types]
  577 |       execvp (diffargv[0], (char **) diffargv);
      |                            ^~~~~~~~~~~~~~~~~~
      |                            |
      |                            char **
In file included from /usr/x86_64-w64-mingw32/sys-root/mingw/include/unistd.h:11,
                 from ../lib/unistd.h:40,
                 from ../lib/time.h:51,
                 from ../lib/sys/stat.h:51,
                 from system.h:27,
                 from sdiff.c:21:
/usr/x86_64-w64-mingw32/sys-root/mingw/include/process.h:78:77: note: expected 'const char * const*' but argument is of type 'char **'
   78 |   _CRTIMP intptr_t __cdecl _execvp(const char *_Filename,const char *const *_ArgList);
      |                                                          ~~~~~~~~~~~~~~~~~~~^~~~~~~~
```
でも、よく見ると欲しい diff.exe はもう出来ているのでそこから貰ってくる。

7. strip してデスクトップへコピー
```
❯ file src/*.exe
src/cmp.exe:   PE32+ executable (console) x86-64, for MS Windows, 19 sections
src/diff.exe:  PE32+ executable (console) x86-64, for MS Windows, 19 sections
src/diff3.exe: PE32+ executable (console) x86-64, for MS Windows, 19 sections
❯ mingw-strip src/*.exe
❯ file src/*.exe
src/cmp.exe:   PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows, 10 sections
src/diff.exe:  PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows, 10 sections
src/diff3.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows, 10 sections
❯ cp src/*.exe ~/winhome/Desktop
```

これでデスクトップ上に cmp.exe, diff.exe, diff3.exe ができました。ドキュメントは Web から漁れば必要ないでしょう。あとは煮るなり焼くなり適当に！
「くさび形(Wedge)の体積計算を教えて下さい。」をAI先生に聞きました。sympyのソースコードで。 

# (本日の)ChatGPT先生へ
画像が作成されました

![c5d74483-a08d-4d84-a7a1-2426856d8dbe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/0aa0e824-9adc-4cae-8d8a-7e4ae511c143.png)

#### 質問リスト
・質問リストの追番は無視して下さい。１個ずつです。途中の回答表示は省略しています。
```
# 質問リスト
1. くさび形の体積計算を教えて下さい。
2. 底面が長方形axbで、立体の高さがhで、上面に面積がなくて、直線の長さがa1の体積の計算方法を教えて下さい。
3. 上記の【例】で作図表示をして下さい。
4. 上記の体積計算をsympyのソースコードで教えて下さい。
5. sympy で　水平面で切断した積分のソースコードを教えて下さい。
6. 上記を応用して、正四角錐を斜めに切断した上部の体積計算を、sympy のソースコードで教えて下さい。
7. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。Markdown形式で。
```
>ChatGPT
以下は、SymPyを使ってくさび形（上記の図のような形）の体積を計算するPythonコードです。
```python
from sympy import symbols, Rational, simplify

# 記号の定義
a, a1, b, h = symbols('a a1 b h')

# 体積の式：V = 1/2 * (a + a1) * b * h
V = Rational(1, 2) * (a + a1) * b * h
V_simplified = simplify(V)

# 出力
print("体積の式:", V_simplified)

# 数値代入（例：a=10, a1=2, b=5, h=8）
volume_value = V.subs({a: 10, a1: 2, b: 5, h: 8})
print("体積（数値代入）:", volume_value)
```
出力例：
```
体積の式: (a + a1)*b*h/2
体積（数値代入）: 240
```
【SymPyコード】くさび形を水平スライスで積分する
```python
from sympy import symbols, integrate, simplify

# 記号定義
a, a1, b, h, y = symbols('a a1 b h y')

# 幅 a(y) の式：高さyにおける幅
a_y = a + (a1 - a) * y / b

# 断面積 A(y)
A_y = a_y * h

# 体積 V：高さ方向に積分
V = integrate(A_y, (y, 0, b))
V_simplified = simplify(V)

# 出力
print("体積の積分式:", V_simplified)

# 数値代入（例）
V_val = V.subs({a: 10, a1: 2, b: 5, h: 8})
print("体積（数値代入）:", V_val)
```
出力例：
```
体積の積分式: (a + a1)*b*h/2
体積（数値代入）: 240
```
以下省略
私はわからなくなりました。

# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
### wikipedia

https://en.wikipedia.org/wiki/Wedge

https://ja.wikipedia.org/wiki/くさび

くさび形 体積　< google検索

https://www.google.com/search?q=%E3%81%8F%E3%81%95%E3%81%B3%E5%BD%A2+%E4%BD%93%E7%A9%8D&rlz=1CAUHAM_enJP1105&oq=%E3%81%8F%E3%81%95%E3%81%B3%E5%BD%A2%E3%80%80&gs_lcrp=EgZjaHJvbWUqBwgCEAAYgAQyBggAEEUYOTIICAEQRRgnGDsyBwgCEAAYgAQyBwgDEAAYgAQyCwgEEAAYBBglGIAEMgsIBRAAGAQYJRiABDILCAYQABgEGCUYgAQyCwgHEAAYBBglGIAEMgsICBAAGAQYJRiABDILCAkQABgEGCUYgATSAQoxMzA2NWowajE1qAIIsAIB8QV0GWZSTimv2_EFdBlmUk4pr9s&sourceid=chrome&ie=UTF-8
SharePoint ドキュメント ライブラリを別のテナントへ移行する方法

Microsoft 365 テナント間での SharePoint ドキュメント ライブラリの移行は、特に大量のデータや厳格なコンプライアンス要件を扱う場合、複雑な作業になる可能性があります。合併、買収、または組織再編などのイベントの際には、安全かつ円滑な SharePoint のテナント間移行のために明確な戦略を持つことが重要です。
このガイドでは、SharePoint ドキュメント ライブラリを別のテナントに効率的かつ最小限の中断で移行するためのベストプラクティスと効果的な方法を概説します。

なぜ SharePoint ドキュメント ライブラリを移行するのか？
以下のような状況では、SharePoint コンテンツを別のテナントに移行する必要があります：

企業の合併または買収

ビジネスのリブランディングまたは再編成

Microsoft 365 テナントの統合

コンプライアンスまたはデータの所在地要件

新たに統合されたチーム間でのコラボレーションの強化

移行前チェックリスト
移行を開始する前に、以下を必ず実施してください：

✅ コンテンツのインベントリ作成 – 移行対象のすべてのドキュメント ライブラリ（サイズと権限を含む）を特定する
✅ ライセンス確認 – 両テナントに適切な SharePoint Online および Microsoft 365 のライセンスがあることを確認する
✅ 権限の監査 – 共有設定、ユーザーアクセス、およびカスタム権限を確認する
✅ ユーザーへの通知 – 停止時間または変更についてチームに事前に通知する
✅ 切替スケジュールの設定 – オフピーク時間中に移行を計画して中断を最小限に抑える

SharePoint ドキュメント ライブラリを移行する方法
1. Microsoft SharePoint Migration Tool (SPMT) の使用
SharePoint Migration Tool は、Microsoft が提供する無料のユーティリティで、SharePoint コンテンツを Microsoft 365 に移行できます。

手順：

SharePoint Migration Tool をダウンロードしてインストール

ソース（オンプレミスまたは別のテナントからのエクスポート）に接続

移行先の SharePoint Online サイトに接続

移行するドキュメント ライブラリを選択

SPMT ダッシュボードを通じて移行の進行状況を監視

制限事項：
SPMT はオンプレミスからクラウドへの移行に最適です。テナント間の移行では、エクスポートおよびインポート戦略が必要な場合があります。

2. 手動によるダウンロードとアップロード
小規模または一度限りの移行には、手動の方法が使用できます。

手順：

ソーステナントからドキュメント ライブラリ全体をダウンロード

移行先のテナントにサインイン

適切な SharePoint ドキュメント ライブラリにファイルをアップロード

注意点：
手動による移行では、メタデータ、バージョン履歴、または権限は保持されません。データ損失のリスクがあります。

3. 自動化ソリューションの使用（推奨）
大規模または複雑な移行には、[SharePoint Migrator をダウンロード](https://www.sharepointmigrator.com/) してください。これは、SharePoint Online コンテンツをテナント間で移行するための強力で専門的なツールです。エンタープライズレベルの移行であっても、効率的、安全、そしてユーザーフレンドリーな方法で管理できます。

主な機能：

📁 完全なデータ移行 – メタデータ、バージョン履歴、権限を保持
🔄 増分同期 – 最初の移行後に追加または変更されたデータのみを移行
👥 権限マッピング – ソースとターゲット間のユーザーおよびグループの権限を自動で整合
⏱ スケジュールされた移行 – 非稼働時間中に実行して影響を最小限に
📊 移行レポート – ログとエラーレポートで進捗と検証が可能

手順：

ソリューションをインストール

管理者権限でソースおよびターゲットテナントに接続

移行するコンテンツ（ライブラリ、リストなど）を選択

フィルターを適用（ファイルタイプ、日付範囲など）

移行を開始し、ダッシュボードで進行状況を監視

このツールは、技術的知識が最小限でも利用でき、エンタープライズ規模の移行を確実に処理できます。

移行後の作業
移行が完了したら、次の作業を実施します：

✅ データの整合性確認 – ファイル、メタデータ、権限が正しく移行されたか確認
✅ リンクとワークフローの更新 – Power Automate フローやその他の統合を再接続
✅ ユーザーへの通知 – 移行が完了したことをユーザーに知らせ、リンクを提供
✅ パフォーマンス監視 – Microsoft 365 管理センターや SharePoint 使用状況レポートを活用

まとめ
テナント間での SharePoint ドキュメント ライブラリの移行は、綿密な計画、信頼性の高いツール、および移行後の検証が必要な重要な作業です。小規模チームや単純なケースには手動の方法も有効ですが、安全でスケーラブル、かつシームレスな移行を実現するには専門的なソリューションが最適です。メタデータの保持、権限マッピング、増分同期、自動化に対応しており、正確かつ効率的にデータを移動させる完全なソリューションです。
gooブログにあるブログの全エントリーを wget でリップしたい場合のTIPS 2

(この記事では、 Linux Mint 22.1 にインストールした GNU Wget 1.21.4 built on linux-gnu. を端末エミュレーターで使っています。)
goo ブログが今年 2025/11/18 に終了すると発表されました。
[前に書いた記事](https://qiita.com/Emmanuel_Chanel/items/df53b58653292faa9054 "gooブログにあるブログの全エントリーを wget でリップしたい場合のTIPS")では、 wget のスパイダー機能を使う事で、自動でエントリーをダウンロードするようにしてみました。
ですが、同じエントリーが最後の ?(文字列) の有無で別ページと認識されて重複ダウンロードされたりと、効率が悪いのが、やってみてわかりました。
goo ブログの個別のブログの表紙のURLは、
<pre>https://blog.goo.ne.jp/(ブログID)</pre>
となっていて、最後に / は付きませんが、ブログは、
<pre>https://blog.goo.ne.jp/(ブログID)/(内容)</pre>
という構造になっています。
エントリーは、 https://blog.goo.ne.jp/(ブログID)/e/ 以下にあります。
ページのリストは、 https://blog.goo.ne.jp/(ブログID)/arcv が https://blog.goo.ne.jp/(ブログID)/arcv?page=1 と同じで、自然数が無限大まで続いていって、個数を超えると、
~~~~
<aside>該当する記事はありません。<br />
~~~~
とでます。
そこで、
~~~~
#!/usr/local/bin/perl

use utf8;
use open IO => ":encoding(utf-8)";
use strict;
use vars qw/$baseuri $blogid $i $listfile/;
use LWP::Simple;

$baseuri = $ARGV[0];
$baseuri =~ m{^https://blog\.goo\.ne\.jp/([^/]+)/?$} || die "goo blog URI is not correct\n";
$blogid = $1;

$baseuri =~ s#/$##;

$i = 1;
!-f 'list.txt' || die "list.txt already exists.\n";
open my $fh,'>','list.txt';
while(1){
    my $downloaduri = "$baseuri/arcv/?page=$i";
    local $_ = get($downloaduri);
    if(m{<aside>該当する記事はありません。<br />}){
	close $fh;
	last;
    }
    {
	open my $fh2,'>',sprintf('%04d.html',$i);
	print $fh2 $_;
	close $fh2;
    }
    foreach my $line(split /\n/){
	$line =~ /<section><span class="mod-arcv-tit">/ || next;
	$line =~ m{<a href="(https://blog\.goo\.ne\.jp/[^/]+/e/\w+)">} && print $fh "$1\n";
    }
    $i++;
}
~~~~
というスクリプト arcv.pl を作って(修正BSDライセンスで公開します。)、ブログのエントリーが載っているリストのページをダウンロードして、エントリーの URI のリストである list.txt を生成するようにしてみました。
<pre>cd ~/site-rips/blog.goo.ne.jp/(ブログID)/arcv
perl ../../arcv.pl https://blog.goo.ne.jp/(ブログID)
cd ../e/
wget -i ../arcv/list.txt</pre>
という感じで、リップしたいブログの全エントリーをダウンロードできました。
以下で、画像ファイルもダウンロードしています。
<pre>cd ~/site-rips/blog.goo.ne.jp/(ブログID)/
perl -nle 'my @l = split /\"/;foreach my $line(@l){if($line =~ m{^https://blogimg.goo.ne.jp/}){$line =~ s/\?.*//;print $line}}' e/* | sort -u | perl -nle 'my $line = $_;s#^https://##;print $line if(!-f $_ && ! m{/$});' | wget -x -i - -c</pre>
SourceTree(ソースツリー)のコミットのスカッシュと強制プッシュ(フォースプッシュ)

# SourceTreeで複数のコミットをsquashして強制プッシュする方法

## 背景

普段、私はコミットを行う際に、あまり粒度を意識せず、自分のタイミングでどんどんコミットしておりましたが、
コードのレビューを行うプロジェクトに配属された際、コミットをスカッシュ(複数のコミットを1つにまとめる)すると無駄なコミットを減らせるよ、と助言を頂きコミットの粒度を意識するようになりました。

そこで今回は、**SourceTreeでコミットをsquash（まとめる）する方法**と、**その後に必要となる強制プッシュ（force push）を行う手順**について備忘録を兼ねてまとめます。

---

## squashの方法（コミットをまとめる）

SourceTreeを使って複数のコミットを1つにまとめるには、**対話的リベース（Interactive Rebase）** を使います。以下の手順で操作できます。

1. **ログ画面を開く**  
   対象のブランチで、画面上部の「ログ」タブを開きます。

2. **squashしたいコミットの範囲を確認**  
   「このコミットから上をまとめたい」という1つ前のコミットを右クリックして、  
   `「このコミットまで対話的にリベース」` を選択します。

3. **リベース画面で操作**  
   リベース画面が表示されるので、まとめたいコミットを `squash` に変更します。  
   `pick` → `squash` に変更することで、前のコミットにまとめられます。

4. **コミットメッセージを調整**  
   複数のコミットメッセージが1つに統合されるので、適切に編集して `OK` を押しましょう。

これでコミットが1つにまとまりました！

---

## 強制プッシュの方法（squash後のプッシュ）

リベースを行うと、Gitの履歴が書き換わるため、**通常のプッシュでは拒否されてしまいます**。そのため、**強制プッシュ（force push）** が必要です。

ただし、SourceTreeでは **言語設定が日本語** の場合、**強制プッシュの設定項目が表示されない** という罠があります。

以下に、言語設定を英語に変更する方法と、強制プッシュを有効化する手順を記載します。

### ① SourceTreeの言語設定を英語に変更する

1. 設定の一般のPreferred languageをEnglishに変更
2. SourceTreeを再起動

### ② 強制プッシュの設定を有効にする

1. メニューバーの「SourceTree」 → 「Preferences」 → 「Git」タブを開く
2. 「Allow force push（強制プッシュを許可）」にチェックを入れる

---

### ③ 実際に強制プッシュを行う

1. 対象のブランチを選択
2. 「プッシュ」ボタンをクリック
3. 「Force push」にチェックを入れて実行

---

## 注意点（squash・強制プッシュ前に確認すべきこと）

強制プッシュやsquashは便利な反面、チーム開発においては注意すべき点があります。

- **developブランチなどの共通ブランチに対して強制プッシュを行わないこと**  
  → 他の人の履歴を壊す可能性があります

- **既にリモートにpush済みのコミットをsquashしないこと（特に他の人と共有している場合）**  
  → 履歴の不整合からコンフリクトが発生する可能性があります

- **レビューが必要なプロジェクトでは、commitの粒度にも気を配ること**  
  → squashを前提とせず、レビューしやすい単位でコミットを意識しましょう

---

## おわりに

GUIベースのGitクライアントであるSourceTreeでも、CLIを使わずにsquashやforce pushを実現できます。

特に、細かくコミットしすぎたときの履歴の整理にsquashは非常に便利ですが、使いどころを見極めて慎重に使うことが大切です。
「せん断によるひずみエネルギーの計算方法を教えて下さい。」をAI先生に聞きました。sympyのソースコードで。 


# (本日の)ChatGPT先生へ
#### 質問リスト
・質問リストの追番は無視して下さい。１個ずつです。途中の回答表示は省略しています。
```
# 質問リスト
1. せん断によるひずみエネルギーの計算方法を教えて下さい。  
2. 上記をsympy のソースコードのシンボリックでお願いします。  
3. プロットをお願いします。  
4. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。
```
>ChatGPT:
◆ 最終式の導出
◆ SymPyでこの積分を再現するコード（シンボリック）
```python
import sympy as sp

# 記号の定義
tau, gamma, G, V = sp.symbols('tau gamma G V', real=True, positive=True)

# 基本式（単位体積あたりのひずみエネルギー）
U1 = (1/2) * tau * gamma

# フックの法則 tau = G * gamma を代入した式
U2 = (1/2) * G * gamma**2

# tau^2 / (2G) 形式
U3 = tau**2 / (2 * G)

# 体積を掛けた全ひずみエネルギー（それぞれ）
U1_total = U1 * V
U2_total = U2 * V
U3_total = U3 * V

# 表示
sp.pprint(U1, use_unicode=True)
sp.pprint(U2, use_unicode=True)
sp.pprint(U3, use_unicode=True)
sp.pprint(U1_total, use_unicode=True)
```
以下省略
...


# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
###
SourceTreeからGitHubにSSH接続する際のトラブルシューティング

# はじめに

ゲーム事業部でUnityエンジニアをしている江連です。

今回はGitHubとSourceTreeのSSH認証まわりで発生したエラーについて解決方法をまとめましたので、参考になれば幸いです。

# 今回やりたかったこと

WindowsとMacにて、GitHub Docsに記載されている[「新しいSSHキーを作成する」](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)の手順で作成したSSHキーをSourceTreeから読み込ませて、SSH接続を行おうとしました。

# Windowsの場合

メニューバーから「ツール > SSHキーの追加」を選択し、Git Bash上で作成した任意のSSHキーを追加することができます。

![WindowsでのSSHキーの読み込み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980380/096f270f-09f2-426a-901b-0bded17d8526.png)

しかし、追加するSSHキーの形式がPuTTY形式に設定されている場合は[「新しいSSHキーを作成する」](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)の手順で作成したSSHキーは表示されません。

そこで、メニューバーから「ツール > オプション」を選択し、SSHクライアントの設定項目からOpenSSHに変更することで、SSHキーを設定することができます。

![windows_オプションからopenSSHに変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980380/20baecf0-a366-4551-81cc-850fc0267c54.png)

# Macの場合

[「新しいSSHキーを作成する」](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)の手順で作成したSSHキー（ed25519アルゴリズムを使用）をSourceTreeから読み込ませることはできませんでした。

そのため、ターミナルとSourceTreeの両方からSSH接続を行いたい場合は、SSHキーをそれぞれ用意する必要がありました。

具体的には、~/.sshフォルダ直下にconfigファイルを作成し、下記のように、まずはターミナルで使用するSSHキーを追加します。

```
Host github.com
    HostName github.com
    User <GitHub上のユーザー名>
    PreferredAuthentications publickey
    IdentityFile /Users/<ユーザー名>/.ssh/<ファイル名>
    UseKeychain yes
    AddKeysToAgent yes
```

その後、SourceTreeを起動し、右上のボタンから「アカウントの追加」を選択、アカウント接続後に「キーの生成」を行うと、SSHキーが作成されます。

![アカウント追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980380/9012de57-8973-4168-95b6-1d94813174fd.png)

先ほど作成したconfigファイルの中身を見ると、SourceTreeのSSHキーが自動で追加されていることが確認できます。また、GitHubにも自動でSSHキーが登録されます。

![configファイルへの追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980380/ae4acb81-e5ab-4694-99b5-f31e898c2215.png)

補足にはなりますが、
SSH接続する際に、リモートリポジトリのパスが下記のように「git@」から始まらず「https://」から始まっている場合は「https://」の部分を「git@」に置換してください。

![リモートリポジトリのパス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3980380/3bdda119-0b20-4676-a7a5-b777b133cef6.png)

## まとめ
今回は、WindowsとMacでのSourceTreeとGitHubをSSH認証する際のトラブルシューティングについて書きました。

分かってしまえば、すぐに解決できるものばかりですが、初回の解決までに多くの時間を使ってしまうため、エラー内容から原因がどこにあるのか仮説を立てることや、解決が難しい場合は別のアプローチに切り替えることも大切だと感じました。

### **▼採用情報**
レアゾン・ホールディングスは、「世界一の企業へ」というビジョンを掲げ、「新しい"当たり前"を作り続ける」というミッションを推進しています。

現在、エンジニア採用を積極的に行っておりますので、ご興味をお持ちいただけましたら、ぜひ下記リンクからご応募ください。

https://recruit.reazon.jp/
「ねじりによるひずみエネルギーの計算方法を教えて下さい。」をAI先生に聞きました。sympyのソースコードで。


# (本日の)ChatGPT先生へ
#### 質問リスト
・質問リストの追番は無視して下さい。１個ずつです。途中の回答表示は省略しています。
```
# 質問リスト  
1. ねじりによるひずみエネルギーの計算方法を教えて下さい。
2. 上記をsympy のソースコードのシンボリックでお願いします。
3. ねじりによるひずみエネルギーの計算方法、ひずみの積分から教えて下さい。
4. 上記の導出をsympy のソースコードで教えて下さい。
5. 矩形断面で教えて下さい。
6. 厳密な偏微分での導出で教えて下さい。
7. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。
```
>ChatGPT:
◆ 最終式の導出
◆ SymPyでこの積分を再現するコード（シンボリック）
```python
import sympy as sp

# 記号定義
T, G, L, R = sp.symbols('T G L R', real=True, positive=True)
r = sp.Symbol('r', real=True, positive=True)

# J = ∫ r^2 dA = 2π ∫₀^R r^3 dr = (π R⁴) / 2
J = sp.pi * R**4 / 2

# エネルギー積分: U = T² L / (2G J²) * ∫ r² dA = T² L / (2G J²) * J
U = (T**2 * L) / (2 * G * J)

sp.pprint(sp.simplify(U))
```
以下省略
...


# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
###
Python(64bit)でJV-Link(32bit)を使いたい

JRA-VAN Data Lab.のデータを機械学習して自前のAI予想がしたい！

データをダウンロードする為にはJV-LinkというActiveXコントロールを使用するが、それが32bitでネイティブ64bitからは使えないと言われている。

でも、今更 Python 32bitは入れたくない。
色々と調べた結果「DllSurrogate」という仕組みで使えました。

## [DllSurrogate](https://learn.microsoft.com/ja-jp/windows/win32/com/dllsurrogate "lean.microsoft.com")
レジストリへキーを追加すると dllhost.exe が32bitのDLLを読み込んでアウトプロセスCOMサーバーの役割を担ってくれるというものです。

```
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{2AB1774D-0C41-11D7-916F-0003479BEB3F}]
"AppID"="{2AB1774D-0C41-11D7-916F-0003479BEB3F}"

[HKEY_CLASSES_ROOT\Wow6432Node\AppID\{2AB1774D-0C41-11D7-916F-0003479BEB3F}]
"DllSurrogate"=""
```
JV-LinkのProgIDを使って、上記内容の拡張子.regファイルを作り、ダブルクリック。
レジストリへキーが追加されるとPython(64bit)で使えるようになりました。

以下で、もう少し詳細に書いてますので、よろしければご覧ください。

[【Python】64bitアプリでJV-Linkを使う](https://note.com/hraps/n/n86589e3c359c)

おそらく、Pythonに限らず 32bit COMサーバーを64bitアプリケーションから使いたい場合に使える方法だと思います。

何かの参考になれば幸いです。
Flask ってなんだろう

<img src="https://flask.palletsprojects.com/en/stable/_images/flask-horizontal.png" width="400">

ここで話題にするのですから、もちろん「プログラミング言語 Python 用の、軽量なウェブアプリケーションフレームワーク」（[Wikipedia](https://ja.wikipedia.org/wiki/Flask)）です。Google 検索すると、最初に出てくるのはこれです（少なくとも私がやるとそうなる）。


<img src="https://upload.wikimedia.org/wikipedia/commons/e/ee/Glaskolben.jpg" width="400">

英語読みだと「フラスク」と発音されますが、日本語では「フラスコ」です。ポルトガル語語源の Frasco です。一般的な日本人なら、化学実験で使う、細い首の付いたガラス容器が最初に思い起こされることでしょう。実際、[英次郎](https://eow.alc.co.jp/)には（実験の）フラスコがトップに示されています。米国辞書でもその意味は記されていますが末尾の方なので、アメリカ人にはわかってもらえないかもしれません。
[Oxford Learner's Dictionaries](https://www.oxfordlearnersdictionaries.com/) の第1義も実験器具なので、英国人（あるいはコモンウェルス人）なら話が通じます。


<img src="https://thermos.co.uk/cdn/shop/files/FEJ503_Blue_500ml_GTB_Revival_Flask_W_200255_1.jpg?v=1729784557&width=600" width="400">

<!-- https://thermos.co.uk/shop/flasks -->
同じ英国英語圏でも、[Cambridge Dictionary](https://dictionary.cambridge.org/) は可搬型の魔法瓶、つまり暖かいにしろ冷たいにしろ温度を一定に保つ液体のための容器を第1義に示しています（Oxford では第2義）。しかも、「米国の商標で『サーモス』のこと」と言い切っています。
ついでに言うと、[英国サーモス](https://thermos.co.uk)は「Thermos® **flasks** make everyday life better, every time」と書いています。やはりお茶は暖かく飲みたいものです。


<img src="https://upload.wikimedia.org/wikipedia/commons/b/bf/Hip_Flask_7985.jpg"  width="400">

米語圏では、ウィスキーを容れる小型の容器です。ズボンの尻ポケットに入りやすいようにちょっと湾曲させた、平たい金属製の容器です（いわゆる hip flask）。
[Merriam-Webster](https://www.merriam-webster.com/) 米語辞典は「注ぎ口が狭まっていて、アルコール飲料を入れるのにしばしば用いられる容器」を最初の意味として出しています。[American Heritage Dictionary](https://ahdictionary.com/)も同様です。アメリカ人は酔うことしか考えていないのでしょうか（日本人に言われたくはないと思うが）。[Collins](https://www.collinsdictionary.com/) は「飲料を持ち運ぶ容器」と、中身についてはお茶を濁していますが（濁ったお茶を入れるわけではない）、どう見たって酒でしょう。あんなのを街角で煽っていたら、間違いなく職務質問されます。


<img src="https://upload.wikimedia.org/wikipedia/commons/3/3a/Skittles_-_geograph.org.uk_-_153273.jpg" width="400">

どうでもいいですが、日本ではウィスキー入れを「スキットル」（skittle）と呼ぶようです。この手の商品を日本のオンラインショップで購入したければ、検索時にはそちらを使った方が多くヒットします。しかし、英語圏で skittle は卓上あるいは芝生でプレーするボーリングに似たゲームです。
あるいは M&M と似たサイズの小粒なお菓子です（ガムで有名な [Wrigley/Mars](https://www.skittles.com/) の商品）。


<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Jonathan_Gardner_Powder_horn_1776_at_the_Concord_Mass_Museum.JPG/1920px-Jonathan_Gardner_Powder_horn_1776_at_the_Concord_Mass_Museum.JPG" width="400">

動物の角から作った、火薬を入れる容器も Flask です。火縄銃など、弾丸式でない銃器に火薬を詰めるときに使うあれです。英語版 [Wikipedia](https://en.wikipedia.org/wiki/Powder_horn) はこれを「Powder horn」の見出しに載せていますが、「厳密にはPowder flaskと呼ぶ」と書いています。


<img src="https://upload.wikimedia.org/wikipedia/commons/3/3c/Flask_logo.svg" width="400">

Flask の作者の Armin Ronacher は、Bottle という Web フレームワークの名から取って Flask にしたと述べています（「[Opening the Flask](https://web.archive.org/web/20160604162342/http://mitsuhiko.pocoo.org/flask-pycon-2011.pdf)」参照）。Ronacher はオーストリア人なので、bottle（英）→flasche（独への直訳）→flask（独の英読み）なわけです。
WSGI（Web Server Gateway Interface）の読みがウィスキーだから Flask であると、Grey Li というソフトウェアエンジニアさんは述べています（Pycon China で発表したらしい）。確証はないですが、この意味も含まれている気はします。何と言っても、旧ロゴのモットーが「one drop at a time」（一滴一滴）ですからね。ドモホルンリンクルみたいですが。
<!-- See https://greyli.com/what-is-flask-logo/ -->

##### 付記

画像のソースは Flask（ソフトウェア）の新ロゴは Flask 公式サイトから、Thermos Flask（飲料容器）は Thermos UK のサイトからそれぞれリンクしています。それ以外は Wikipedia へのリンクです。
HTML + CSS: 入門から実践まで完璧攻略 Part1 講座おすすめ

こんばんは、韓国在住のsanaです！


JavaScriptやフロントエンドを学ぼうと考えている方必見！
HTML + CSSを基礎からしっかり学べる講座を紹介します:point_up:


![html-css-basic.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032401/438ee86f-19d2-44ee-adf6-52d76aab484f.gif)


インターネットとウェブの動作原理を深く理解し、実習中心のカリキュラムを通してHTML/CSSの基礎を着実GET:sparkles:


２時間~5時間でwebページを作るスキルが身に付け、隙間れます！３つ中２つは無料なのですきま時間にぜひ試してみて下さい！

アンニョン～:information_desk_person_tone1:


https://u.inf.run/4lLhyhE

https://u.inf.run/4jHvHKC

https://u.inf.run/42RfD3r


sanaおすすめ記事

https://qiita.com/sana89/items/9398c4873676d1a5a9a6


https://qiita.com/sana89/items/3fbb96b592f709e3e087


https://qiita.com/sana89/items/82f8c765885da82195cf
古いPCからWindowsアプリを使ってAWSにSSL/TLSリクエストを送信すると証明書エラーとなる件の対応

# 事象
・古いPCからWindowsアプリを使ってAWSにSSL/TLSリクエストを送信すると証明書エラーとなる。
```text
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: 接続が切断されました: SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした。 ---> System.Security.Authentication.AuthenticationException: 検証プロシージャによると、リモート証明書は無効です。
```
・古いPCからWebブラウザを使ってAWSにSSL/TLSリクエストを送信すると問題なし。
・新しいPCからWindowsアプリ、Webブラウザを使ってAWSにSSL/TLSリクエストを送信すると問題なし。

図にするとこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708575/6e5a6b37-8c5f-498f-a061-7aa49eb5faec.png)


# 解決策

WindowsUpdateする。
もしくは、
[Amazon Trust Services](https://www.amazontrust.com/repository/)に公開されているルート証明書をクライアントPCにインストールする。

# 前提

TLS通信を行うには、サーバーのSSL証明書をクライアントに送付し、クライアント側でその証明書の発行元を信頼する必要がある（他にも色々あるが割愛）。
WindowsOSには、最初から「信頼されたルート証明機関」というものがあり、信頼する発行元のリストが登録されている。
リストに無い場合でも、WindowsUpdate等から自動で最新のリストを更新するようになっている（らしい）。
それとは別に、Webブラウザには最初から信頼リストを別で保持している。
AWSサービスの多くはACMから発行されたSSL証明書を利用している。
クライアントでACMから発行されたSSL証明書を信頼するには、信頼リストに以下のいずれかが登録されている必要がある。
- ①Amazon Root CA 1
- ②Amazon Root CA 2
- ③Amazon Root CA 3
- ④Amazon Root CA 4
- ⑤Starfield Services Root Certificate Authority - G2
- ⑥Starfield Class 2 Certification Authority （※ただし2024年7月以前に発行された証明書に限る）

# 原因

上記の ⑥Starfield Class 2 Certification Authority がポイントで、[AWSの通知](https://aws.amazon.com/jp/blogs/security/acm-will-no-longer-cross-sign-certificates-with-starfield-class-2-starting-august-2024/)にて、2024年8月以降にACMで発行された証明書のルート証明機関からStarfield Class 2を除外するという通知が出ている。
今回のケースでは、どちらのPCもブラウザは比較的新しいものを使っており、ブラウザの信頼リストに①～⑤が登録されていたため、WebブラウザからのTLS通信は問題無かった。
ただし、WindowsアプリからのTLS通信の場合、OSの信頼リストのみを参照する。
新しいPCではOSの信頼リストに⑤と⑥が登録されていたため、TLS通信は問題なかった。
古いPCではOSの信頼リストに⑥のみ登録されていたため、2024年8月以降に発行された証明書を利用したサーバーに対するSSL/TLSリクエストに失敗していたと思われる。

多くのACMを利用した証明書の更新はAWSが自動更新してくれるため、新しい証明書に自動更新されたタイミングで急に接続できなくなることも起こり得るかもしれない。（ただし古くて更新がされていないPCからのアクセスに限る）
Efinityから作成したデザインをiverilogでシミュレーションし、"event trace"ログとる方法。

# やりたかったこと
　Verilogでデザインを作成しているときに、イベントがループになってシミュレーション時間が進まないことがあります。
　EfinixのIDEであるEfinityを使ってデザインを開発している場合、プロジェクト　TEST01.xml をiVerilogによるRTLシミュレーションにかけるには、下記の通り、batファイルから起動されるpythonスクリプトにより間接的に起動します。
 
```
$ efx_run.bat TEST01.xml --flow rtlsim
```

　しかし、このefx_run.batはiverilogを自動で起動してしまうため、event traceログを出力させるオプションをiverilogに渡すことができません。
　そこで、今回 Efinity 2024.2.294.4.15を用いて、シミュレーションを実行し、event trace logを採取する方法をまとめました。


# シミュレーション用のスクリプトへの追加


/Efinity/2024.2/scripts/efx_run_sim.py　の332行目に    iv_opts.extend(['-pfileline=1']) を追加する。

```efx_run_sim.py
    # top level module
    iv_opts.extend(['-s', args.top])
    for t in common_opts['extra_top']:
        iv_opts.extend(['-s', t])

    ####### add following line to get event trace log from iverilog
    iv_opts.extend(['-pfileline=1'])

    # vvp log file
    log_file = os.path.join(OUTPUT_PATH, args.design + '.' + args.sim + '.simlog')
    if os.path.isfile(log_file): os.remove(log_file)
    vvp_opts.append('-l' + log_file)
```


# シミュレーションを実行

```
$ efx_run.bat TEST01.xml --flow rtlsim
```
と入力しシミュレーションを起動します。

```
$ efx_run.bat TEST01.xml --flow rtlsim
Running: efx_run_sim.py TEST01 --sim rtl --family Trion --device T20F256 -v TEST01.v,t:default　--dir C:\Efinity\2024.2\project\TEST01\ip\TEST01 --output_dir outflow --project_xml C:\Efinity\2024.2\project\TEST01\TEST01.xml
```
　シミュレーションが進まない場合は、の様にメッセージが出た後、コンソールには何の表示も出てきません。その状態で、イベントループが発生してシミュレーション時間が進まないとおもわれるところで、`ctrl-C` をおして、コマンドラインモードに入ります。
　画面出力ログは、`C:\Efinity\2024.2\project\TEST01\outflow\TEST01.log` に出力されている為、そちらを参照すれば、現在シミュレーションがどうなっているかは確認できます。

# ログファイルの取得

ログファイルは、下記に記録されています。

``` C:\Efinity\2024.2\project\TEST01\outflow\TEST01.log
<ctrl-C>

** VVP Stop(0) **　　　
** Flushing output streams.
** Current simulation time is 10009940 ticks.
>  trace on                                         <--- trace on<enter>を入力
Turning statement tracing on.
> cont												<--- cont<enter>を入力
** Continue **
mt48lc16m16a2.v:869: If statement.					<--- 以下、イベントトレースが出力
mt48lc16m16a2.v:885: If statement.
mt48lc16m16a2.v:901: If statement.
mt48lc16m16a2.v:917: If statement.
mt48lc16m16a2.v:868: Event wait (@) statement.
Advancing to simulation time: 10009945
mt48lc16m16a2.v:208: Blocking assignment (delay).
mt48lc16m16a2.v:869: If statement.
mt48lc16m16a2.v:885: If statement.
mt48lc16m16a2.v:901: If statement.
mt48lc16m16a2.v:917: If statement.
mt48lc16m16a2.v:868: Event wait (@) statement.
Advancing to simulation time: 10009950
mt48lc16m16a2.v:208: Blocking assignment (delay).
```

止める場合は、画面には表示されませんが、再度 `ctrl-C` を入力し、 `finish<enter>` を入力すると、`バッチ ジョブを終了しますか (Y/N)? ` と聞いてきますので、` y<enter>`  で
シミュレーションを終了させることができます。

この時の出力ログは、`C:\Efinity\2024.2\project\TEST01\outflow\TEST01.log`　に記録されているので終了後に参照が可能です。
Go学習記録2日目　TodoCLIアプリの作成②

Go言語学習の2日目です。
今日は、昨日作成したTodoアプリを改良しました。

https://qiita.com/rickeysan95/items/3b138cea644defbddff5

### 作った機能
Todoアプリのタスクに、処理済みのフラグを追加して、処理済みのものだけ一覧表示できるようにした


### スライスの要素数
```
// 要素数を取得できる
// 要素数が0の時は、空であるかを判定できる（JavaScriptと似ている）
len(slice) == 0{
}
```

### スライスのフィルター操作
Task構造体に処理済みのフラグのフィールドを持たせました。これがtrueのものだけをフィルターしたかったのですが、どうやらfor文を回す必要がありそうです。
新しい空の配列を用意しておいて、for文の中のif分に当てはまるだけを新しい配列にappendメソッドで追加していきました。

```
func filterTask(tasks []Task, isDone bool)([]Task) {
	var filteredTasks []Task
	for _, task := range tasks{
		if task.Completed == isDone{
			filteredTasks = append(filteredTasks,task)			
		}
	}
	return filteredTasks
}
```


今日は短いですが、この辺です。
明日はこのTodoアプリはcobraというライブラリで作り直す。
もしくは、新しいアプリ作成に挑戦しようと思います。
AiiDAではじめる計算自動化：目次

## はじめに

**その計算、AiiDAで自動化してみませんか？**

この連載では、第一原理計算などの計算科学の分野で注目されはじめているツール「**AiiDA**」について解説していきます。
AiiDAは、計算科学の現場で、複雑なワークフローの自動化やデータ管理、再現性の確保をサポートしてくれる頼もしいツールです。
これから計算に挑戦しようという初心者の方も、スクリプトを書いてガンガン計算を回してしているヘビーユーザーの方も、ぜひ一度チェックしてみてください！

## 目次

- [(その１) AiiDAって何？](https://qiita.com/yuta-yahagi/items/776c92125b56fc11653c)
- [(その２) AiiDAを使ってみよう！](https://qiita.com/yuta-yahagi/items/2f2191626a0eaf28de67)
- (その３) 環境構築してみよう [作成中]
- (その４) データベースを操作してみよう [作成中]
- (その５) Quantum Espresso の自動計算 [作成中]
【Bash】一分ごとにタイムスタンプを取る

```bash
# 実行するファイル作成
touch job.sh
# タイムスタンプを書き込むファイル作成
touch job.log
# ファイルを開く
vi job.sh
```
```bash:job.sh
1 #!/bin/bash
2
3 timestamp=$(date +"%Y%m%d_%H%M%S")
4 echo "$timestamp" >> job.log
```
:::note
:set number もしくは :set nuで行番号表示できる
:set nonumberで非表示
:::

```bash
# 自動化で使う設定ファイルを編集
crontab -e

# 中身
# 分 時 日 月 曜日 実行するコマンド
 */1 * * * * /home/shuta/job.sh

# */1 何分おき
# 1   毎時1分おき
```
家計簿アプリを作る＃３５

![スクリーンショット 2025-04-22 180649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/03d62039-8133-4850-94fa-d5d8c181b9b7.png)
![スクリーンショット 2025-04-22 180810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/ad894c1d-8c3b-4105-98c1-1b71f56efe09.png)
NavLink to を用いてリンクの遷移先を設定します。

![スクリーンショット 2025-04-22 180840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/cfcfef8e-0dc1-491d-b363-c36ee423d423.png)
リンクの設定ができました。
【Claude 3.7sonnet】タスク管理アプリ開発レポート！

## ついに…
Claude Pro が使えるようになったので👏
どのような感じなのか試していこうと思います！！！

今回はその第一弾、タスク管理アプリを作ってみよう！です

## Claudeとは？

Claude は生成AIの中でもコード開発に優れていると私の周りで評判の生成AIです

Claudeは、推論、数学、コーディング、英語および非英語言語の流暢さにおいて
優れたパフォーマンスを発揮し、企業を大規模に支援するように設計されています。
（[ANTHROPIC ホームページ](https://docs.anthropic.com/ja/docs/intro-to-claude)）

今回使用したのはClaude 3.7 Sonnetモデルです。

## 驚異のアプリ生成スピード：わずか1分でタスク管理アプリ完成

まずは簡単なプロンプトを投げてみました

```ruby:プロンプト
以下のアプリを作成して
タスク管理アプリ
機能: タスクの追加、編集、削除、期限設定、優先度設定、進捗管理など。
特徴: ユーザーが効率的にタスクを管理できるように設計します。
```

あまり具体的なことは思いつかなかったのですが、最初だし、いいでしょう！

では、結果はいかに...？？
![スクリーンショット 2025-04-14 113847.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/87720c3b-5551-4d4d-9475-5d2045fd9f31.png)


なんかすごいものが生成されています！！！1分くらいしか経っていないのに…

画面右側にプレビューが表示されているのがすごい......しかも動くんです。

タスクを書き込み……
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/055fa56e-ba8f-4340-8534-972d13dfce8c.png)

追加！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/7a6803f0-90df-45a6-acf8-15beb9f0ce45.png)


プロンプトを打ち込みわずか1分ほどでここまでのアプリを作ってくれました！！！

私自身、新卒の最初の研修でタスク管理アプリを作成したのですが、
その時は2週間以上かかっていた気がします...

とても悲しい。そして、生成AIに驚いております。

やっぱ触ってみないと分からないですね！！！

## カスタマイズも簡単：デザインと機能の拡張

せっかくなので、ここからいろいろとカスタムしてみることにしました：

```ruby:プロンプト
デザインを少し修正してほしい
画面を2：1に分けて、右側にタスク追加の画面、左側にタスク一覧を表示してほしい
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/96929ead-ad42-4a0f-9bbf-c23f5bbab1f5.png)

んー、こちらはうまく動かず...苦手なのでしょうか。
アプリのサイズを調整しても変わらなかったですね…


切り替えて、デザインを変えてもらうことにしました！

折角ならかっこいいのにしてほしい！

```ruby:プロンプト
デザインをかっこいい感じにして
```
またまた、雑なプロンプトを投げてしまいましたが、どんな結果になるか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/495a93c4-51c9-46e2-aeb7-1a3be03e1126.png)


おおお！ダークテーマのかっこいい感じにしてくれました！

次は機能の方も少々変えてもらいましょう！

```ruby:プロンプト
タスクを大項目、小項目でまとめられるようにして
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/9dd01d42-ba43-4027-b7fc-73995a23bd3b.png)


何度もエラーを吐いてしまいました…
こちらタスクのジャンル分けのつもりで書いたのですが、理解できなかったよう…

分かりにくいプロンプトを投げてしまってごめんなさい...
ちなみにコードの量が多い時にもこちらのような表示が出ました。「続ける」と打ち込むと、続けて記載してくれます

エラーを吐きすぎると、エラーを吐かない最低限の機能のものを作成することになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/38880139-81d2-419a-b343-b66fdbc01eb1.png)


では、改めて！

```ruby:プロンプト
大タスク、小タスクではなく、タスクをジャンル分け出来るようにして！
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954326/acabe6e4-c642-41e7-9413-7540857237cb.png)

今度はいい感じにジャンル分け機能を追加した便利そうなアプリを作成してくれました！！！

## 触ってみて気づいたこと

* **開発速度が速い**: ToDoアプリがわずか数分で完成し、即座に動作確認可能

* **カスタマイズ可能**: シンプルなプロンプトだけでもデザインや機能が変更できる

* **エラー自動検出**: コードの問題を自動的に検出・修正してくれる便利機能

* **デザイン傾向**: Reactベースのモダンなアプリが多く生成される（？？）

* **プレビュー機能**: 生成したアプリが実際に触れる

## まとめ

Claude Proで驚くほど簡単にアプリ開発ができました
簡単なアプリ作成においては、開発時間を劇的に短縮できると感じました！

次回は別のタイプのアプリ開発に挑戦してみる予定です！
【VSCode】更新後に「⌘ + I を押して、に何らかの操作を依頼してください」が出た時の対処法まとめ


## はじめに
この記事を開いていただきありがとうございます！
ある日、VSCodeを更新したところ、  
いつものエディタ画面ではなく「⌘ + I を押して、に何らかの操作を依頼してください」  
という謎の表示が…！  
新しいCopilot系機能やAI UIの影響で、**通常の編集画面に戻れなくなる**という事態に。

調べて試してみた結果、無事元の状態に戻せたので、  
再現手順と解決方法をまとめました！

---

# 目次

- [対象者](#対象者)
- [更新前の状態](#更新前の状態)
- [更新後の状態](#更新後の状態)
- [発生した現象](#発生した現象)
- [原因（おそらく）](#原因おそらく)
- [解決方法：元のエディタ画面に戻す手順](#解決方法元のエディタ画面に戻す手順)
  - [1. コマンドパレットを開く](#1-コマンドパレットを開く)
  - [2. settings.jsonで設定を変更](#2-settingsjsonで設定を変更)
  - [3. VSCodeを再起動](#3-vscodeを再起動)
- [最後に](#最後に)

---

## 対象者

- VSCodeを更新したら画面が変わって戸惑っている人  
- 「⌘ + I」「に何らかの操作を依頼してください」と出てきて焦った人  
- Copilot/AI周りの設定がよくわからず困っている人  

---

## 更新前の状態
更新する前は、新規エディタを開くと以下のような文言が表示されていた。

![言語の選択またはテンプレートで入力または別のエディターで開くを使用して開始します。入力を開始して無視するか、これを表示しないを選択肢ます。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787065/4f2d6a86-3bd7-4639-9990-58b25afedae4.png)

---

## 更新後の状態
アップデートして再起動したら以下の表示に変わっていた！

![⌘ ＋ Iを押して、に何らかの操作を依頼してください。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787065/3639ec42-b9ae-4541-976f-973ef0b65738.png)


## 発生した現象

### 現象

- VSCode起動時、新しいタブが「編集画面」ではなく「AIチャット風UI」に
- 上部に「⌘ + I を押して、に何らかの操作を依頼してください」と表示
- 通常のコード編集ができない状態に
- コピーしたものをペーストしようとしても改行されるだけでペーストできない

---

## 原因（おそらく）

- **VSCodeのアップデート**で、一部のCopilot・AIアシスタント機能が**デフォルトON**になったことが原因
- 特に `inlineSuggest` や `chat.agent` 系の新機能が影響している可能性がある

---

## 解決方法：元のエディタ画面に戻す手順

### 1. `⌘ + Shift + P` でコマンドパレットを開く
* ⌘ + shift + Pを押す
* 検索フィールドに「settings ui」と入力し、出てきた候補の中から、「基本設定：設定（UI）」を開く」をクリック
* 設定の一覧画面が出てきたら、左側の項目の上にある検索フィールドで「Copilot」「AI」「inline」などで検索し、AI関連の設定を確認
* オンになっているものがあったらオフにしてみる

![コマンドパレっどでCopilotと検索して出てきた画面。全てオフになっている状態の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787065/852cd08b-1fdd-4fe9-a7aa-cc9b889ad9b9.png)

### 2. 以下の設定をすべて OFF にする

#### 推奨 settings.json（例）
* ⌘+shift+Pを押す
* 出てきた検索フィールドに「open user settings」と入力
* 候補から「基本設定：ユーザー設定を開く（JSON）をクリック
* 以下の内容を加えて保存

```json
{
  "editor.inlineSuggest.enabled": false,
  "chat.agent.enabled": false,
  "chat.commandCenter.enabled": false,
  "chat.extensionTools.enabled": false,
  "chat.focusWindowOnConfirmation": false,
  "chat.setupFromDialog": false,
  "telemetry.feedback.enabled": false
}
```

### 3. VSCodeを再起動  
再起動して新しいエディタを開く
元のエディタUIに戻っていればOK！

![言語の選択またはテンプレートで入力または別のエディターで開くを使用して開始します。入力を開始して無視するか、これを表示しないを選択肢ます。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787065/4f2d6a86-3bd7-4639-9990-58b25afedae4.png)

---

## 最後に
今回はVSCodeの更新時に追加されたUIによってこれまでと異なってしまった画面の解決方法をまとめてきました。
自分も最初は「なんだこれ？」状態だったので、  
同じように悩む方がいたら、この記事が少しでも助けになれば嬉しいです。
他にも「この設定で解決した」などがあれば、コメントでぜひ教えてください！
ここまで読んでいただきありがとうございました！！
AIに仕事を奪われるって言うけど、IT人材が足りてないのはなぜなのか？

# 概要

最近、「**AIに仕事を奪われる**」という話をよく耳にしますが、それは本当なのでしょうか。一方で、「IT人材が不足している」とも言われており、矛盾しているようにも感じられます。


このことについて、私の考えを整理していきたいと思います。

# IT人材は足りていない？

ITのトレンドは日々変化しており、10年以上前に作られたシステムは「時代遅れ」と言われ、いわゆる老害扱いされることもあります。

そのため、**エンジニアは常に最新の技術にキャッチアップし続ける必要**があり、スキルの向上やシステムの改修が求められ、無限に作業が発生します。IT業界は、まるで**イタチごっこ**のようです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/61a6a516-4c33-4155-8d9a-20ca21ebb3b0.png" width="300">

これでは、どれだけエンジニアが増えても、エンジニア不足になります。継続的な技術力の向上や、将来的な職の安定という観点では、**エンジニアにとっては良い環境である**とも言えます。

とはいえ、「そもそも本当にその開発は必要だったのか？」と疑問に感じる場面も少なくありません。以下に簡単に整理してみましたが、これらの課題に対して対応を進めることで無駄な業務を削減できる一方で、エンジニアの仕事自体が減ってしまうというパラドックスに陥る可能性もあります。そう考えると、現状維持が最適なのかもしれません。

| 仕事内容 | 疑問点・課題 |
| - | - |
| 調査・開発 | 実際に形になってユーザーに使われるサービスは、どれだけあるのか。|
| 既存システムのリプレイス | 多くの工数をかけた結果、リリース後に見合った効果が得られているか。|
| 現行システムの保守 | 	サービスの延命を続けることが、結果的に時代遅れのシステムを維持しているだけになっていないか。|

# AIに仕事を奪われる？

基本的には、エンジニアの仕事は無くなりません。
でも、AIでも対応できる仕事は、奪われていくと思います。

仕事が奪われていく要因としては、「AIを使いこなせる人が増えていること」「AIの利用を禁止している環境が存在すること」による2つあると考えています。

## AIを使いこなせる人が増えていることについて

たとえば、簡単なプログラムの作成や、機能の追加・改修といった業務は、以前であればエンジニアに依頼するのが一般的でしたが、ChatGPTのような生成AIに質問すれば、未経験者や初心者でもある程度の作業をこなせてしまう場面が増えてきました。

そのため、エンジニアにはこれまで以上に「システム全体を把握する力」や「できること・できないことを判断する力」、「実現方法をイメージできる力」が求められると思います。そうゆうエンジニアは、AIもうまく活用できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/01f95b76-0941-4ece-ad2c-6c53dadb5746.png" width="300">

**このレベルに達しないと、エンジニアに依頼する必要がなくなり、結果的に仕事が奪われてしまいます。**（ある意味新参者が入りにくい環境なのかもしれません）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/4d02a1df-b249-4ecd-9314-82d0fb02ea4b.png" width="300">

## AIの利用を禁止している環境について

AIチャットツールを禁止している職場には疑問を感じます。

極端な例かもしれませんが、これは自動車という便利な移動手段があるのに、「車は危険だから歩いて移動しなさい」と言われているようなものです。これでは、移動だけで何日もかかってしまいます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/9206850b-f42f-4528-9d93-d74270853dad.png" width="300">


セキュリティや情報漏洩が懸念されるのは分かりますが、このような環境では、AIを活用して成長を加速させている他の企業のエンジニアに大きく差をつけられてしまうと思います。

**AIを使わないことで、結果的にAIに仕事を奪われることにつながっているのではないでしょうか。**

# まとめ

結論としては、エンジニアの仕事は無くなりません。向上心があり、一定の技術力を身につけていれば、今後も問題ないと思います。

「誰でもできる仕事は、誰でもできる」というのは、AIが登場する前から変わらない現実です。だからこそ、AIに脅威を感じるのではなく、「AIによってできることが増える」や「効率的に働ける」という考え方が、今のエンジニアのスタイルだと思います。

様々な考え方があるとは思いますが、あくまで私の個人の意見としてご理解いただければ幸いです。

ここまで読んで頂きありがとうございました。
1日で合格出来るMicrosoft Certified: Azure AI Fundamentals

1日で合格出来たMicrosoft Certified: Azure AI Fundamentals(AI-900)資格について紹介します。
![Microsoft-AI900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065024/dedf66cb-930f-4a0e-8fe8-087ff081bd2d.png)

私は1日猛勉強方法で合格しました。
（MicrosoftのPearson VUE試験場では、試験終了後に合格/不合格がすぐにわかりますので、合格判定を見る瞬間一日の疲労が飛ばせます）
皆様も出来ます！:muscle:

資格情報です、ご参照までに。
https://learn.microsoft.com/ja-jp/credentials/certifications/azure-ai-fundamentals/?practice-assessment-type=certification

1日のスケジュール
9:00 - 16:00
①Youtubeに無料公開されている動画で学習(48Min)
"試験に出るとこだけ重点対策！AI-900（Azure AI Fundamentals）資格取得対策講座"で検索。
②公式サイト利用：Microsoft Learn: Microsoft Azure AI Fundamentalsトレーニングhttps://learn.microsoft.com/ja-jp/training/courses/ai-900t00

①で概要を軽く理解して、②で精読しました。
1日以上時間が使える方は、Udemyもお勧めします。

16:00 - 17:00 試験場へ移動 & 試験実施

※忙しくてなかなか資格取得にスケジュールを組めない方にお勧めします。
本当は、余裕をもって1週間程度勉強するのがベスト！
ADF+SynapseAnalyticsの注意点：テーブルの分散方法について

## 概要（ここだけ読めば全部わかる）
Azureでデータ分析基盤といえば、DataFactory＋SynapseAnalyticsの組み合わせかもしれません。
しかし、DataFactoryからSynapseAnalyticsにテーブルを作らせると自動的に分散方法がラウンドロビンになるのでパフォーマンスに注意してください。先にSynapseAnalyticsでテーブルを作っておきましょう。というだけの話です。

## SynapseAnalyticsの分散方式
Synapse Analyticsでは、処理の並列化を支えるためにテーブルの分散方式を指定します。
主に以下の3種類があります：
| 分散方式 | 説明 |
|:-:|:-:|
| HASH |  指定した列の値に基づいて分散。結合や集計が高速になることが多い。 |
| ROUND_ROBIN	  | 行を均等に分散。ロードは早いが、結合やフィルターでは遅くなる傾向。  |

https://learn.microsoft.com/ja-jp/azure/synapse-analytics/sql-data-warehouse/sql-data-warehouse-tables-distribute

## ADF（DataFactory）でテーブルの自動作成をするとラウンドロビンになる。
ADFでデータのコピーアクティビティやデータフローアクティビティを使ってSynapseにデータをコピーする際、「ターゲットに存在しないテーブルは自動で作成」される機能がありますが、これは自動的に分散方式がラウンドロビンに固定されます。

## ラウンドロビンのデメリット
* JOIN性能が悪い（Hash分散テーブル同士なら高速なのに…）
* クエリのスキャン効率が悪くなる
* データ量が増えると処理遅延が顕著に


## 解決策：テーブルは事前に作っておく
最も確実なのは、Synapse側で事前にCREATE TABLEしておくことです。ADFの「テーブルの作成」機能は非常に便利なのですが、パフォーマンスを考慮した場合、ハッシュ分散にしたい！ということがあります。その場合はSynapse側でCREATE TABLEしておき、ADFにはテーブルの作成・再作成は行わせないということが重要です。（データフローのSinkで「テーブルの再作成」をさせるとまたラウンドロビンになってしまいますので注意です。）

## まとめ
* ADFで自動作成されるテーブルは「ROUND_ROBIN分散」
* JOINやクエリ性能に悪影響を与える可能性あり
* パフォーマンスを意識するなら、テーブルは事前にSynapseで作成しておくのが良い
* テーブル設計は「あとからやる」ではなく「最初にちゃんとやる」が吉
ちょっとした落とし穴ですが、知っているだけで劇的にパフォーマンスを改善出来ます。
これからADF＋Synapseを触る方の参考になればうれしいです。
x86_64バイナリをRISC-Vに自動変換するCLIツール作ってみた【RetDec + Clang】

# x86_64バイナリをRISC-Vに自動変換するCLIツール作ってみた【RetDec + Clang】

## はじめに

「x86_64でしか動かないLinuxバイナリを、RISC-V上でも動かせたら便利なのに…」  
そう思ったことはありませんか？

最近はRISC-Vが急速に注目される中で、既存のx86_64資産をどう活かすかという課題に直面することも増えてきました。  
しかし、静的なバイナリ変換（transpilation）は困難で、ほとんどの人はエミュレーション（QEMUなど）に頼っているのが現状です。

そこで、RetDecとClangを組み合わせて、「なるべく自動でx86_64 ELFバイナリをRISC-V ELFバイナリに変換できるCLIツール」を作ってみました。

まだ作り始めたばかりのプロジェクトですが、最低限「動く」段階に到達したので紹介させてください。

---

## プロジェクト概要

- GitHub: https://github.com/takahashi-akari/bin2riscv
- 名前: `bin2riscv`
- ライセンス: MIT
- 現状できること:
  - x86_64 ELFバイナリをRetDecで逆コンパイル（C出力）
  - Intel SIMD IntrinsicsをRISC-V上で動くshim関数に置き換え
  - ClangでRISC-V ELFを生成
  - QEMUで動作確認まで自動化

---

## インストール方法

### A. 通常の環境で

```bash
git clone https://github.com/takahashi-akari/bin2riscv.git
cd bin2riscv
./bin2riscv.sh your_binary.out
```

### B. Dockerで

```bash
docker build -t bin2riscv .
docker run --rm -it -v $(pwd):/workspace bin2riscv ./bin2riscv.sh your_binary.out
```

---

## 実際の変換プロセス

### 1. RetDecで逆コンパイル

```bash
retdec-decompiler.py -o your_binary.c --cleanup your_binary.out
```

### 2. ポータブル化の自動変換

- `__int64` → `int64_t`
- `long long` → `int64_t`
- `_mm_add_pd(a, b)` → `shim_mm_add_pd(a, b)` など

### 3. Intrinsicsのshim生成（例）

```c
static inline __m128d shim_mm_add_pd(__m128d a, __m128d b) {
    return (__m128d){ a[0] + b[0], a[1] + b[1] };
}
```

### 4. ClangでRISC-Vに変換

```bash
clang --target=riscv64-unknown-elf -march=rv64gc -O2 -nostdlib -ffreestanding \
  your_binary.c -include intrin_shim.h -o your_binary_riscv.elf
```

### 5. QEMUで実行（任意）

```bash
qemu-riscv64 ./your_binary_riscv.elf
```

---

## 現在の制限

- 対応しているIntrinsicsはまだ少ない（現在6種：add/sub/mul/div/set1/cmpeq）
- 動的リンク、syscall、構造体ABIは未対応
- RVV命令を直接使っているわけではない（今後の課題）
- RetDec出力の精度に依存する（意味不明な関数名など）

---

## 今後の展望（Roadmap）

- Intrinsics定義をJSONで自動生成できるようにする
- 動的ライブラリやlibc対応、実行環境を再現する仕組みの構築
- LLVM IRベースの完全トランスレータ
- GUI/WebUIによる「バイナリを投げるだけ」体験

---

## まとめ

まだ始まったばかりのプロジェクトですが、「x86_64バイナリをRISC-Vで動かす」という夢に一歩近づけた気がしています。

特にRetDecとClangがあれば、想像以上に変換パイプラインが組めることがわかり、LLVMの柔軟性に感動しました。

興味がある方、協力してくださる方、GitHubでスター or Issue or PRお待ちしています！

---

## おまけ：動作画面（CLIログ）

```bash
$ ./bin2riscv.sh your_binary.out
[+] Decompiling with RetDec...
[+] Patching C source...
[+] Writing intrinsic shim...
[+] Compiling with Clang...
[+] Running with QEMU...
Hello from RISC-V!
```

---

ありがとうございました！
インターン体験記｜生成AI × Python で社内業務を効率化してみた話

## 参加したインターンについて
- 企業名：株式会社シーエー・アドバンス 仙台支社
- 期間：5日間（1週間以内）
- 目的：生成AI（特にLLM）を用いた開発に興味があり、現場での活用例を学ぶため参加
## 取り組んだこと
- pythonで社内オペレーション自動化ツールを開発
    - レポート作成・ファイル分析の自動化
    - APIサーバー構築
    - データ前処理・LLMによる自動要約の検討
- チーム開発の実践
    - GitHubでのブランチ運用
    - Slackでのコミュニケーション・進捗共有
## 工夫したこと・学び
- Pythonでのファイル操作やAPI構築は初挑戦だったが、ドキュメントやChatGPTを活用して短期間でキャッチアップ
- チーム開発では「進捗共有の頻度」を増やすことで連携がスムーズに
## インターンを通じて得たこと
- 今回のインターンでは、技術だけでなく「柔軟に対応しながら、チームで協力して課題を解決する力」の重要性を実感しました。
- 直前まで内容が分からない中でも、興味のあったLLMや生成AI分野に飛び込み、PythonやLangChainを活用した開発に挑戦。GitHubやSlackを通じたチーム開発の中で、技術力だけでなく、コミュニケーションやプロジェクトの進め方も学ぶことができました。
- 今後は、LLMや生成AIの理解をさらに深めて、現場で価値を発揮できるようなエンジニアを目指していきたいと思います。
FlutterでもTCAライクな実装がしたい！

## はじめに
### SwiftのTCAの利点
最近Swiftを勉強しているのですが[TCA](https://github.com/pointfreeco/swift-composable-architecture)にどハマりしてしまいました。理由はこの記事がほとんど代弁してくれています。

https://qiita.com/karamage/items/f63a5750e65c5c9745ae

なんといってもユーザーのアクションと処理内容が明確に分離されているのがいいですよね。Flutterで例を示すとリスト&詳細形式のページを普通にriverpodで実装すると以下のようになると思います。
```sample.dart
class DetailNotifier extends StateNotifier<Item> {
  DetailNotifier(super.state);
  void setItem(Item item) {
    state = item;
  }
}

final detailProvider = StateNotifierProvider<DetailNotifier, Item>(
  (ref) => DetailNotifier(Item(id: "A", description: "This is A.")),
);

//Viewの実装
//リストのアイテムのタップイベント
onTap(Item item) => ref.read(detailProvider.notifier).setItem(item)
```
この程度ならもっといい実装あるだろというツッコミはさておき、似たような例がよくあるのではないでしょうか。これの何が嫌かというとView(`Widget`)に*詳細用の`Item`をセットする*というLogic的な要素が含まれることなんです。これをSwiftではTCAを用いることで改善できます。
```sample.swift
//アクション
enum ListAction {
    case onSelect(Item)
    //...
}
//Viewの実装
List(viewStore.items) { item in
    Button(action: {
        viewStore.send(.onSelect(item))
    }) {
        Text(item.name)
}
```
このように`viewStore`に`.onSelect(item)`というアクションを送信するだけで後は裏(`Reducer`)でうまいこと動いてくれるんですね。概念図にするとだいたいこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3994994/c79d8073-d4dd-4618-b4fa-fdfd8e2ffa52.png)
左から右に動きが統一されているので単方向データフローと言います。

### Flutterの単方向データフロー
Flutterでの単方向データフローは[flutter_redux](https://pub.dev/packages/flutter_redux)がかなり前から存在しています。わかりやすいなと思った実装例を載せときます。

https://zenn.dev/heyhey1028/articles/099573a75c1088

しかし更新が2年間止まっていたり、Action1つに対して1つクラスが必要だったり、ReducerでActionの型チェックをするなどと個人的にはイマイチでした。ならば自分で作ってみようじゃないか。

## 結論
オリジナルで作る際に依存関係でハマってボツりました。pub.devを汚して申し訳ない。代わりに

https://pub.dev/packages/composable_architecture

こちらが見つかったので使ってみましたがかなりの再現度で驚きました。使い方の記事をまた書こうと思います。
マッスルブログの開発環境について

## 開発環境の工夫ポイント（VSCode & Warp）
### GitHub Copilotが神だった
今回の開発で一番助けられたのが GitHub Copilot。
自分の思考を補完するようにコード提案してくれてた。
- 繰り返し処理やフォームのバリデーションなど、定型的な部分はほぼお任せ
- コンポーネント設計のときに、プロップスの候補を提案してくれるのも便利
- CSS（Tailwind）クラスの組み合わせもかなり賢く補完してくれる
#### VSCode拡張機能
以下の拡張機能が特に活躍しました：
|拡張機能|用途|
|-------|--|
|GitHub Copilot/chat|AIペアプロ。自然なコード提案が助かった|
|GitHub Pull Requests|Githubと直結して、プルリク確認,管理が楽になった|
|GitLens|コミット履歴,誰がどこ書いたかを追えるツール|
|Japanese Language Pack|たまに日本語で助けられる(設定画面とか)|
#### Warp（ターミナル）も大活躍
Git操作は Warpも使っていました。
AIアシスト付きで、コマンド履歴や補完が超優秀でさらにエラーが起きた際も勝手に直してくれたり提案してくれたりするのでほんとに楽だった。さらに、今何が起こっているのかがわかりやすくてかなり重宝した。
回数制限があるのが難点かな。課金も考えてたりします。