OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】Google reCAPTCHAで簡単ボット対策！導入手順と実装方法を徹底解説

## 背景
メールボム攻撃による影響が増加していることです。メールボムは短時間で大量のメールを送信し、システムの業務効率やストレージ容量に悪影響を及ぼします。この問題への対策として、Google reCAPTCHAを導入し、不正なボットによるアクセスをブロックすることでシステム負荷を軽減し、リソースの保護を図る必要がありました。その時の実装内容をまとめます。

## reCAPTCHAとは
reCAPTCHAはGoogleが提供するセキュリティサービスで、不正なボットアクセスを防止し、人間と自動プログラムを識別する仕組みです。フォーム送信時にユーザーに簡単な操作（チェックや画像選択）を求めることで、不正アクセスやスパムを防ぎます。サイトの安全性向上やサーバー負荷軽減に有効で、導入も比較的簡単に行えます。

## 実装手順
### Google reCAPTCHAの公式ページを開く
https://www.google.com/recaptcha/about/

### v3 Admin Console を開く
青いボタンの「Get Started with Enterprise」を押してしまうと、Enterpriseの方に行ってしまうため注意が必要です。
![スクリーンショット 2024-12-17 14.30.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670873/1b91089c-d4d6-594c-a98b-60335732aa04.png)

### 必要な情報入力
![スクリーンショット 2024-12-17 14.31.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670873/429abf00-2bdd-fae0-f432-6f4095e37dea.png)
![スクリーンショット 2024-12-17 14.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670873/4724a788-9cc5-9c34-3d92-5cb0dc7e2dc8.png)

### 登録を行い、サイトキーとシークレットキーを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670873/ff928e79-f897-7d14-f310-6fadbc7fb13a.png)

下準備はこれで完了です。

### gemのインストール
```
gem 'recaptcha'
↓
bundle install
```

ある記事では、「gem 'recaptcha', require: 'recaptcha/rails'」をするよう指示がありますが、Rails 4以降では、ほとんどの場合 require 'recaptcha/rails' を書く必要はありません。

#### 必要な場合
・自動読み込みが働かない環境：たとえば、Railsの設定をカスタマイズしていて、自動的にgemが読み込まれない場合
・非標準のRailsアプリケーション：例えば、API-onlyモードや特定の依存関係が壊れているケース
・明示的にrequireすることで予期しない問題を防ぎたい場合：アプリケーションの動作がgemの自動読み込みに依存しているとき、手動でrequireを書くと確実にファイルが読み込まれるので安全です


### config/initializers 配下に、recaptcha.rbを作成
```
Recaptcha.configure do |config|
  if Rails.env.production?
    # 本番環境用のSiteキーとSecretキー
    config.site_key = ENV['GOOGLE_RECAPTCHA_SITE_KEY']
    config.secret_key = ENV['GOOGLE_RECAPTCHA_SEACRET_KEY']
  else
    # テスト用のSiteキーとSecretキー（ローカル環境用）
    config.site_key  = '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI'
    config.secret_key = '6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe'
  end
end
```

### .env.developmentに環境変数を定義
```
GOOGLE_RECAPTCHA_SITE_KEY= キー
GOOGLE_RECAPTCHA_SEACRET_KEY= キー
```

### viewに配置
下記のように設定すると写真のような要素が表示されるようになります。
開発環境の場合には、赤字でエラーメッセージが表示されます。
```
= recaptcha_tags
```
![スクリーンショット 2024-12-17 14.20.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670873/39ae3700-bc6b-b8d4-cb87-3ccf8d34d682.png)

reCAPTCHAウィジェットのデザイン自体はGoogleが提供するもので、CSSやHTMLのカスタマイズはほぼ不可能です。ただし、スマホ画面で表示が崩れたりウィジェットが大きすぎる場合、CSSを使った工夫で改善することができます。
```
@media screen and (max-width: 480px) {
  .g-recaptcha {
    transform: scale(0.75); /* さらに縮小 */
    transform-origin: 0 0;
  }
}
```

### 認証
実際にフォーム送信を行い、recaptchaのチェックが行われているかを判断できるようにしていきます。

今回はコントローラーアクションに設定をしていきます。
recaptchaのチェックが行われているかを「verify_recaptcha」という専用メソッドを使用します。

```
unless verify_recaptcha
  redirect_to root_path and return
end
```

これにより、recaptchaのチェックが行われていない場合には別ページへリダイレクトされるようになります。

## まとめ
この記事では、Google reCAPTCHAを利用してボット対策を簡単に実装する方法を解説しています。公式ページからSiteキーとSecretキーを取得し、recaptcha gemを導入すれば、わずかな設定とコード追加でフォーム送信時の不正アクセスを防止できます。特にverify_recaptchaメソッドを使えば認証チェックがシンプルに行え、CSSによる調整でスマホ対応も可能です。
「Koka」に今来た私が試したこと（ChatGPT先生と共に）

# はじめに
この記事は、[Koka Advent Calendar 2024](https://qiita.com/advent-calendar/2024/koka) の5日目の記事となります。

アドベントカレンダのリストを見ていて、今、Kokaに初めて来た者の記録です。

# 基本事項
Kokaってなに？　というわけでChatGPT先生に聞いてみる。

![スクリーンショット 2024-12-17 14.14.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/7dc75558-de7f-b234-b4c0-68bcb262263c.png)

![スクリーンショット 2024-12-17 14.14.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/da62a19d-96ee-33b8-08f3-aa0120000fc5.png)

![スクリーンショット 2024-12-17 14.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/9e1bb427-8775-1c0e-cb50-64913408349f.png)

```text:koka.kk
fun add(x : int, y : int) : int {
  x + y
}

fun main() {
  println("The sum is: \(add(3, 4))")
}
```

![スクリーンショット 2024-12-17 14.22.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/424ef4cf-2523-28bf-8bf4-fe44d62e9146.png)

なるほど・・分からん・・。
プログラムの例を作ってもらおう。

![スクリーンショット 2024-12-17 14.22.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/c62488bc-6085-c105-4b1b-68b3bacc0c40.png)

![スクリーンショット 2024-12-17 14.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/1f369dfe-a082-ae3d-15da-c6a7fb4356ea.png)

```text:koka2.kk
// 安全な割り算関数
fun safe_divide(x : int, y : int) : exn int {
  if (y == 0) {
    throw("Error: Cannot divide by zero") // エラーを発生させる
  } else {
    x / y
  }
}

// main関数
fun main() : console () {
  try {
    // 割り算を試みる
    val result = safe_divide(10, 0)
    println("The result is: \(result)")
  } catch (exn) {
    // エラー処理
    println("An exception occurred: \(exn)")
  }
}
```

![スクリーンショット 2024-12-17 14.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/6896b242-b837-d8bd-a11e-928c0fa48954.png)

![スクリーンショット 2024-12-17 14.26.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/99bd4bcb-1017-b7b0-1868-c22a8a6209fd.png)

![スクリーンショット 2024-12-17 14.26.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/dd4852d1-b20a-0c59-6641-6892ab151da8.png)

# サンプルを実行してみよう

インストール方法

https://koka-lang.github.io/koka/doc/index.html#install

VSCodeの拡張機能で入る！
Cmd+Shift+pで
![スクリーンショット 2024-12-17 14.30.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/fc773b4f-a279-0a3e-bd83-dcd68b745e5d.png)


![スクリーンショット 2024-12-17 14.33.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/9da12275-911c-3ebc-3bfe-0606c319f641.png)

all.kkを選んでみる

![スクリーンショット 2024-12-17 14.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/656cb9b2-a47f-85e6-59d2-75d0ea06e97f.png)

![スクリーンショット 2024-12-17 14.37.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/d8d9093f-310b-b1b2-a652-2fc04f3f4547.png)

実行できた！
とても手軽に始められることがわかりました。

今回はここまで。

最後までご覧いただきましてありがとうございました。
適応型ソフトウェア開発が向いている盤面について

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 21日目です。


## 適応型ソフトウェア開発が向いている状況

このフレームワークが圧倒的に向いている状況とはなんだろうか。
それは、「作るべきものが決まっていない状況」である。

見通し不透明なカオスが観測できる状態。
もしくは、現状何をしても前に進んでいる実感がない状態。

そう、「サバイバルモード」と言い換えてもよい。

### サバイバルモードに強い
適応型ソフトウェア開発は、サバイバルモードの環境にこそワークする。

秩序がない状態でも動くことができるし、進捗の見える化・暫定的でも見通しを立てて進めることができる。

そこから道筋が立ち、見通しが良くなってきたときに、より精度の高い集中可能なフレームワークに乗り換えて目標達成に向けて進むことができるだろう。

アジャイルチームの初速をつけるためのフレームワークであると位置づけると、有効なポイントが多かった。

## ほかに役に立つポイント
サバイバルモード以外にも役に立ちそうなポイントを紹介する。

### 複数チームを管轄する組織マネジメント
この文脈でも適応型ソフトウェア開発はワークする。
WBSやガントチャートの代わりに、PDSを使ってみるのもよいかもしれない。

### プロダクトディスカバリー
プロダクトディスカバリー。つまり価値探索中のカオスに向き合っていくシーンでも適応型ソフトウェア開発は有用である。
もしかすると、Lean UXのほうが合うかもしれないが、そこに向かい前の段階でこのフレームワークを採用するのも一興である。


## まとめ
このようにアジャイルといえば、スクラム！と選択してしまうと、もったいない局面がたくさん存在する。

フレームワークそれぞれにある有効性や性能を意識したうえで、カオスに向き合うとよい。
【pingって結局なんなの？】ICMP(Internet Control Message Protocol)

## 始めに
・授業でICMPという単語が出てきて、今一度復習したかった。
・ネットワーク興味あるのに、これ忘れてるのまずいと感じたから。
自分なりの言葉でまとめてみる。

## どんな用途？
情報ネットワークにおいて、通信エラーの通知やネットワークの状態確認を行うためのプロトコルである。
例えば、あるコンピューターから別のコンピューターにデータを送信する際に、途中で何かしらの問題が発生すると、ICMPがエラーメッセージを送信元に返し、問題の存在を知らせる。
pingやtracerouteはこのプロトコルを利用している。

## 仕組み（データの流れなイメージ）
大前提このプロトコルはIPの動作補助のようなものである。パケットがホストに到達出来ないときや何らかの原因でパケットが破棄されてしまった場合パケットのエラー通知などを行ってくれるプロトコルである。

そうなると、信頼性を担保するものだからOSI参照モデルでいうところのトランスポートモデルなんじゃないの？と自分は思ったが、飽くまでも**ネットワーク層**のプロトコルらしい。実際見かけ上のパケットの形式はTCPやUDPと同じようにIPによって運ばれている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/1257c827-b3e8-d3de-6cdb-b205d92a6407.png)

図1.ICMPの流れ(マスタリングTCP/IPを参考にしました。)

Qiitaのtableが大きなレコード数に対応していないので箇条書きで書いてますが、ご了承ください。
### ICMPメッセージのタイプ（タイプ番号（10進数）：メッセージ内容）
0：エコー応答
3：到達不能
5：リダイレクト
8：エコー要求
9：ルーター広告
10：ルーター請願
11：時間超過
12：パラメータ以上
13：タイムスタンプ要求
14：タイムスタンプ応答
42：拡張エコー要求
43：拡張エコー応答

### pingの正体：ICMPエコーメッセージ(タイプ0,8)
ホストAからホストBに対して、IPパケットが到達するかどうかを確認したいときに使う。相手先に、ICMPエコー要求メッセージを送信、そして相手先ホストからエコー応答メッセージが返ってくれば到達可能である。

### pingの拡張：ICMP拡張エコーメッセージ（タイプ42,43）
前述のICMP拡張エコーメッセージに加えて以下の機能が搭載されている。
・パケットの宛先ノードの、別のインターフェースの状態の確認。（IPv4かIPv6どっち対応？）
・パケットの宛先ノードから、別のノードに通信可能か確認。（ARPや近隣テーブルを参照）


### ICMP到達不能メッセージ（コード番号:メッセージ内容）

0：ネットワーク到達不能
1：ホスト到達不能
2：プロトコル到達不能
3：ポート到達不能
4：分割処理が必要だが、分割禁止フラグが設定されている
5：ソースルートに失敗
6：宛先ネットワーク不明
7：宛先ホスト不明
8：送信元ホストは孤立している
9：宛先ネットワークとの通信は管理上禁止
10：宛先ホストとの通信は管理上禁止


### ICMPv6
一言でいうと、IPv6に対応したICMPプロトコルである。
従来のIPアドレスからMACアドレスを名前解決するARPではなく、近隣探索（Neighbor Discovery）メッセージに変更されている。

近隣探索＝（ARP+ICMPリダイレクト+ICMPルーター）

### 近隣探索をちょっと深堀り
まず、ICMPv6のメッセージ体系について知る必要がある。
ICMPv6のメッセージはかなり多く。256種類存在している。

内訳：
0~127:エラーメッセージ
128~255:情報メッセージ（要は、正常なメッセージってこと）

### ICMPv6におけるメッセージ（長いのでURLで各自参照お願いします。）
https://ja.wikipedia.org/wiki/Internet_Control_Message_Protocol_for_IPv6

この中でも、近隣探索は、タイプ133~137までのメッセージを指す。
IPv6アドレスとMACアドレスの対応関係を調べるときには、近隣要請メッセージを使ったり、近隣告知メッセージでMACアドレスで通知してもらったり出来る。他にもデバイス（PCやルーター）の発見やエラーの検知も出来たりする。

## 参考文献（参照日2024年12月17日）
・マスタリングTCP/IP―入門編―(第6版)
井上 直也 (著), 村山 公保 (著), 竹下 隆史 (著), 荒井 透 (著), 苅田 幸雄 (著)
ISBN-13:‎978-4274224478　出版社：オーム社
【自作キーボード】qmk_firmwareのビルド時に躓いたポイント

## はじめに

[前回の記事](https://qiita.com/satbunch/items/cc7bbd777811009cf5b8)で自作キーボードに入門した話をさせていただきました。

その中でファームウェアをビルドするときにつまずいたポイントを今回はお話ししたいと思います。

## エラー内容と解決策

今回私がビルドしようとしたところ、下記のエラーが出力されてしまいました。

```sh
Generating: .build/obj_omkbd_ergodash_rev1/src/info_deps.d                     [OK]
tmk_core/protocol/lufa/lufa.mk:13: lib/lufa/LUFA/makefile: No such file or directory
gmake: *** No rule to make target 'lib/lufa/LUFA/makefile'.  Stop.
```

このエラーを読んでみると`lib/lufa/LUFA/makefile` が見つからないとのこと。参考にした記事を改めて読んでいると以下のように書かれていました。

> cloneのあとに「--recursive」オプションを付けている理由は、qmk_firmwareが他のリポジトリをサブモジュールとして参照しているためです。「--recursive」オプションを付けることでサブモジュールも自動でダウンロードしてくれて便利です。

レポジトリをクローンする際に `-recursive` オプションをつけ忘れていたようです。
なので、以下のコマンドを実行し、ダウンロードし忘れていたサブモジュールをダウンロードします。

```sh
$ make git-submodule
```

さあ、これでと思い再度ビルドしようとするとまたまたエラーが。

```sh
Generating: .build/obj_omkbd_ergodash_rev1_sat_via/src/default_keyboard.c       [OK]
sh: avr-gcc: command not found
sh: avr-gcc: command not found
gmake: *** [builddefs/common_rules.mk:225: gccversion] Error 127
```

今度は`avr-gcc`がないとのことなので、`brew` でインストールします。今回は`avr-gcc 9.4.0`をインストールしました。

```sh
$ brew install avr-gcc
```

これで無事にコンパイルできました！

```sh
Compiling: quantum/via.c                                                           [OK]
Linking: .build/omkbd_ergodash_rev1_yourkeymap.elf                                 [OK]
Creating load file for flashing: .build/omkbd_ergodash_rev1_yourkeymap.hex         [OK]
Copying omkbd_ergodash_rev1_yourkeymap.hex to qmk_firmware folder                  [OK]
Checking file size of omkbd_ergodash_rev1_yourkeymap.hex                           [OK]
 * The firmware size is fine - 20516/28672 (71%, 8156 bytes free)
```

## まとめ

今回は自分が遭遇したエラーとその対応方法の紹介でした。
とは言っても、最初のエラーは参考にした記事をしっかり読み込んでおけば、回避できたエラーだったと思います。
こういったエラーはどんどんと減らして行けたら良いですね。

ここまで読んでいただきありがとうございました。


## 参考サイト

https://eng.shibuya24.info/entry/qmk-firmware-build-for-mac
優柔不断と高い柔軟性の違い

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 20日目です。

## 適応力 = 柔軟性？
適応力とはいったい何なのか。

これを結構な頻度で考えることが多かった。
というよりも常にそこは考えていたかもしれない。

高い柔軟性により、高い適応力をもたらすのか？
では、高い柔軟性とは何か？

ということを考えていくにつれ、適応型ソフトウェア開発の弱点が見えてきた。

## 適応型ソフトウェア開発の弱点
「圧倒的な適応能力は、高い柔軟性から生まれる」という勘違いこそ、適応型ソフトウェア開発を進める上で最も危険な思考だった。

### 高い柔軟性
「高い柔軟性」という言葉は一見よく見える。
ただし、意思決定の先延ばしだったり、今決めないことを柔軟な動きと言ってしまえる緩さが存在する。

この今決めない・判断ができないという状況を許容した途端に、チームは適応力を失っていく。

これはなぜだろうか。

### 優柔不断は何もできなくなる
今決めないことが柔軟性であると高をくくってしまうと、状態を変化させることが恐ろしくなってくる。

その結果、このフレームワークで最も重視する状態変化を起こすことができなくなってしまう。
（優柔不断は、状態を変化させることを遅延させる行為であると定義したため。）

つまり、優柔不断な体制だと最も進捗が出ない状態になってしまう。
ゾンビである。

### 高い柔軟性を捨てる
そのため、高い柔軟性を捨てることが大切だった。

むしろ、余白のない即決意思決定がとても重要である。

次に向かう状態を即決し、学習・思案・協調する。
そして、次のカオスに向き合ったときに、身を切ってでも状態を前に倒す。

そのスピードが速ければ早いほど適応力に富んだチームであると言えるかもしれない。

ただし、今までやってきたことを否定するのはとても勇気がいる行為だ。

だから、大切な方程式がある。

### 圧倒的な適応力 = 簡単なルール × 豊かな人間関係

高い適応力は柔軟性からは生まれない。

圧倒的な意思決定とピボットを全員で決めることができる関係性こそ大切なのだ。

これをはき違えると、途端にぬるま湯に変化し、組織は一瞬で腐敗する。

それが適応型ソフトウェア開発の難しさである。
PLATEAU×TouchDesignerの未来

PLATEAUとTouchDesignerの組み合わせには、インタラクティブな実演に向いており、子供から年配の方まで多くの人がPLATEAUに触れるきっかけを作れるという可能性を感じています。国がオープンにしている都市データを、誰もが手軽に体験できる形にすることで、未来が楽しくなるような広がりが期待できます。

TouchDesignerはリアルタイム処理とインタラクティブ性に特化したビジュアルプログラミングツールです。UnityやUE5がゲームやフォトリアルな制作に強いのに対し、TouchDesignerは即時フィードバックと柔軟なデータ連携が特徴で、センサー入力や音楽・映像との連動が容易です。ノードベースの直感的な操作により、データビジュアライゼーションやインタラクティブアート制作が可能です。

# TouchDesignerの特徴
TouchDesignerは、リアルタイム処理とデータ連携に優れたビジュアルプログラミングツールです。その高い表現力と即時処理能力から、Perfumeのライブ演出やチームラボのインタラクティブアートにも採用されており、没入型体験や動的なビジュアルアートを生み出すツールとして評価されています。

例えば、PLATEAUの3D都市データを取り込み、センサーデータや音楽入力、外部APIと組み合わせることで、リアルタイムで変化する都市ビジュアライゼーションやインタラクティブコンテンツを簡単に構築できます。直感的なノードベース操作により、プログラム知識がなくても短時間で成果を得ることが可能です。

また、TouchDesignerはプロジェクションマッピングやLEDディスプレイを活用した映像演出が得意であり、都市データをアートやパフォーマンスに落とし込むことで「動きのある都市体験」を提供します。

https://youtu.be/3aDRTU0ZRw8?si=QG4eMs7phD6U8lqz


# PLATEAU×TouchDesigner インタラクティブなアイデア3選
PLATEAUの3D都市データとTouchDesignerを組み合わせることで、都市データに「触れる楽しさ」と「動きを感じる体験」を提供するインタラクティブなコンテンツが実現できます。以下に、センサーと音源を活用した3つのアイデアを紹介します。

### 1. 動きで奏でる都市：Kinect音楽インタラクティブ
Kinectを使って人の動きを取得し、PLATEAUの3D都市データと音楽を連動させます。

手の動きやポーズに応じて都市が波打ち、音が鳴る。
歩くと都市が広がり、リズムや音色が変化。
複数人で都市全体を協力して「演奏」する体験。
### 2. 光と影で動く都市：北洋センサー×動的ビジュアライゼーション
北洋センサー（赤外線や光学センサー）で手や体の動きを感知し、都市データがリアルタイムで反応します。

手をかざすと建物が光り、音が鳴る。
距離や動きに応じて都市の形が変化し、光のパーティクルが広がる。
音楽とシンクロし、都市全体が鼓動するような表現。
### 3. 人の流れを可視化する都市：Kinect×音楽とデータの融合
Kinectを使い、複数人の動きを都市データ上に可視化し、動きと音が連動するシステムです。

人の動きが都市の道路や建物に光のラインや音として反映される。
動きの速さや方向で音やビジュアルが変化。
観客同士の動きが「都市の音楽」として共鳴する体験。
# PLATEAUをTouchDesignerで使う
PLATEAUで使用されているCityGML形式のデータは、これまでTouchDesignerでは扱いづらいものでした。しかし、新しいプラグインの開発により、誰でも簡単にPLATEAUのデータをTouchDesignerにインポートできるようになりました！

詳しい手順やリンクは以下の通りです：

マニュアル: 

https://project-plateau.github.io/PLATEAU-TouchDesigner-Plugin/index.html

ダウンロード: PLATEAU TouchDesigner Plugin（ZIP）

https://github.com/Project-PLATEAU/PLATEAU-TouchDesigner-Plugin/archive/refs/heads/main.zip

# 最後に
TouchDesignerのリアルタイム処理とインタラクティブ性を活かし、PLATEAUの都市データに「触れる楽しさ」と「動きのある体験」を加えることで、データと人々をつなぐ新たな可能性が生まれます。子供から大人まで都市の魅力を直感的に感じられるだけでなく、未来の都市デザインや表現に対する新しい視点や創造力を育むきっかけになるでしょう。

こうした取り組みを通じて、PLATEAUをTouchDesignerで活用する人が増え、都市データの可能性を共に探求していけることを願っています。

新しいアイデアや作品が生まれることで、未来の都市がもっと楽しく、もっと魅力的になることを期待しています！
OfficeScriptsとは？

# はじめに
VBAの他にOfficeScriptsで自動化ができるので色々調べました。

## 理由
現在VBAマクロを使って自動化をしていますが、今後のことを考えOfficeScriptsで自動化したいと考えたためです。

## OfficeScriptsとは?

>オフィス スクリプトは TypeScript で書かれており、JavaScript のスーパーセットです。 JavaScript に慣れている場合は、コードの多くが両言語で共通しているため、知識を引き継ぐことができます。

### ポイント
①TypeScriptで書く必要がある
②JavaScriptのプログラミングに慣れていれば、知識を引き継げる

とのことなので、JavaScriptを思い出せればTypeScriptで実装できそうですね。

# 最後に
せっかくなので来年ちょうせんしたいと思います。
Visual Studio Community 2022 でC言語を始める為のインストール

# Visual Studio Community 2022 のインストール
これからC言語を学ぶにあたって必要なIDE（統合開発環境）をインストールする手順を説明します。

## IDE（統合開発環境）とは
C言語に限らず、何かの言語を実行する際に必要となるツール・ソフトをIDEと言います。
いわば、ゲームでいうハードのようなものです！
※厳密には違いますが初学者のうちはこのくらいの認識で大丈夫です！
![IDEとは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/a80b1538-a691-43d7-1df0-76691bc89a42.png)

## インストール方法

### 公式サイトからダウンロード
Visual Studio CommunityのWebサイトにアクセスし、ダウンロードボタンをクリック！
https://visualstudio.microsoft.com/ja/vs/community/

![IDEとは (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/7ca763a8-aa83-8027-2ba3-8c609e08976d.png)

### インストーラーの実行
ダウンロードが完了したら、ダウンロードフォルダに`VisualStudioSetup`というファイルが追加されていることを確認し、ダブルクリックで実行する。

![インストーラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/0ca7a76a-9d65-06f3-b3cb-16bc403a17c8.png)

### ユーザーアカウント制御
ユーザーアカウント制御が表示された場合は、「はい」をクリック。

![許可.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/e2744b89-89ee-a2e8-6365-7ab86d126427.png)

### ライセンスの確認
リンクは踏まずに「続行」をクリック

![ライセンス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/c93aa5c0-fdc9-f10d-35ab-dbcbc90bfd49.png)

### ワークロード選択
ワークロードの選択画面が表示されたら、「C++ によるゲーム開発」のみチェックを入れその他はすべて外す。

![C++チェック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/dff3e482-3c43-e05d-e0a1-fce0c95b6404.png)

チェックができたらインストールをクリック

![プラグインインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/6711f3aa-699a-0c5a-571f-6bcbe2b81c1b.png)

インストールが終了するまで待つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/7526157c-d8af-7acb-0515-c9f7ca06ed58.png)

### Visual Studioの起動

インストールが完了すると、別タブで**Visual Studio**が開くので「今はスキップする」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/97e7b1b0-2b2c-a15b-0b52-51e33dca2c45.png)

### テーマカラーの設定
テーマカラーはお好みで構いません。
テーマカラー選択後「Visual Studioの開始」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/e9f547f9-89f4-5526-27bf-2a487dc0b55f.png)

### 起動確認
以下の画面が表示されたら無事**Visual Studio**起動完了です。
頻繁に使用する場合などはピン止めなどしておくと起動が楽になると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687802/94285945-750c-3fd5-a3f2-e6db59a95cdf.png)
適応型ソフトウェア開発ライクな設計について

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 19日目です。

## 適応型ソフトウェア開発的な設計思想について
ここは筆者が案件進行中に一番悩んだポイントの１つだ。

複雑適応系を形成し、簡単なルールを用いて案件の状態把握ができるようになったとしても、設計思想が従来のままだった。

その結果、全く適応力に還元されることがない状態につながってしまった。

しかし、身近な先人からのアドバイスを受けて、向き合い方を変えることができた。

### どうして設計思想も適応的にやらないの？
これは本当にそうだと思った。なんでやらなかったのだろう。

ここまで複雑適応系に向き合うため、色々と思案してきた割に、エンジニアとして一番押さえておきたいポイントで適応的なことを考えていない。

早速それに「適応」し思考してみることにした。

## 適応できていない理由はなんだったか

それはまず動くものを作るというマインドは間違っていなかったが、試作の方法が間違っていた。
これはフロントエンド側・バックエンド側の双方からの課題がある。

### バックエンド側
これは大体の場合、データベースのテーブル定義あたりに適応力を持たせることが有効だった。
特にリレーショナルデータベースとの相性は良い。

実際にどんな項目があると有効なのかわからない状態が続くカオスであるとき、とにかくがっつりテーブルを作らないことを徹底することが大切だった。

例えば、「ユーザー」という概念をモデリングしたときがわかりやすい。

#### ユーザーテーブル
わからないなりにモデリングを行いながら、プロトタイピングを進めていくとき、
テーブルを１つ作って進めていくほうが何だか素早く見える。

```mermaid
classDiagram
user : int id
user : string name
user : int role_id
user : int department_id
role : int role_id
role : string name
department : int department_id
department : string name
user -- role
user -- department

```

ただこの形式だとかなり適応力に乏しいプロトタイプになってしまうことが多かった。
今回適応型設計を試みたときには、このようなものを準備した。

```mermaid
classDiagram
user : int id
user : string name
user_role : int role_id
user_role : int user_id
user_department : int department_id
user_department : int user_id
role : int role_id
role : string name
department : int department_id
department : string name
user -- user_role
user_role -- role
user -- user_department
user_department -- department
```

`user_role` や `user_department` といった中間テーブルを持つことで、たとえば `role` というドメインがカオス探索中不要になったとしても、簡単に破棄することができる。

このように削除がどのポイントで発生するかわからないため、いつでも削除できる柔軟性を持たせることが適応力につながると考えた。

結果として簡単に実装を捨てられたり、組み換えられたりするようになったので、適応力は上がったと言ってよい。


### フロントエンド側
Reactを用いて開発をしているが、vueに置き換えて考えてもよい。

フロントエンド側はとにかく関心ごとを混在せずに、役割に徹するコードやコンポーネントを小さく分割し作り続けることが最も適応力に富んだ実装だった。

#### コンポーネントを小さくする
ビジネスロジックを徹底的にコンポーネントから排除し、別のファイルに切り出し続けた。
例としては、`useHook` や `Redux selector` などだ。

ビジネスロジックから分離されたコンポーネントは、UIが変化したとしてもドメインが変化していないなら使いまわすことができる形になった。

そのため、デザインを思い切って捨てることができるようになり、適応能力が高くなっていった。


### まとめ
ほかにもいろいろな工夫はあるが、ポイントは１つだ。

雑に作ることが大切。ただし、無暗に作るとは言ってない。

雑に捨てることができるコードを手早く作る。

そのために結合ポイントを小さくする考え方を持つことが、適応力の高い設計足りえた。
私が開発したWindows向け関数電卓ソフトの紹介 part.3

# 私が開発した関数電卓ソフトの機能紹介

以前、私が開発して販売しているWindows向け関数電卓ソフトの紹介記事を投稿いたしました。
その関数電卓ソフトで用いることが出来る関数を紹介させていただこうと思います。

## 関数の紹介

1. 対数
- 常用対数
- 自然対数
<p>

![log.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/cabfd7b1-162b-b91d-ea2e-b0793234f25f.jpeg)
![ln.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/35d98c1a-7784-6b02-3d2f-6593070dab4c.jpeg)
![log_normal.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/cb07a029-e630-562a-5fae-09c20a8ed444.jpeg)

</p>

２. 根号（ルート）
![rote.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/05c8a938-129b-9a2c-d9e4-79b869f1a6b5.jpeg)

３.三角関数
- sin
- cos
- tan
- arcsin
- arccos
- arctan
<b>逆三角関数の解は度数法と弧度法で選択できます。</b>
<p>

![tan_infinity.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/b4d0e183-35c3-5039-beaa-76323eec5ff3.jpeg)

![triangle.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/fb410348-3f91-f8d5-f3a0-a30d7847757d.jpeg)

</p>

計算履歴の197行目と198行目で解が異なっているのが、解の取得方法を「度数法」と「弧度法」で変えているためです。

４.階乗
![factorial.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/00cd9b26-f59f-37d0-a2b0-95a3962063f5.jpeg)

５.組み合わせ（nCr）
![conbination.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/98978bc2-4c54-fce5-decd-48bd2772f650.jpeg)

６.べき乗
![exponential.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/7c3de29c-b532-3ba2-4e11-821a85bb3d60.jpeg)

７.絶対値
![absolute.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/dc73b269-efed-e4e0-7253-8a09a69ca427.jpeg)
<b>根号の中に負の数がある場合虚数となるが、絶対値記号で"-144"を挟んでいるため144の平方根を取る。</b>
↓負の数の平方根↓
![minus_rote.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/eea96a60-a89a-6c63-be97-6d6e84056ccd.jpeg)

![minus_rote_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/a4c0715e-210b-25ee-bcf0-89421bf06408.jpeg)

８.順列（nPr）
![pairing.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/1d72a65e-483b-86e5-4fc5-0450c236616f.jpeg)

９.虚数
![imaginary.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/cfcc0c9c-4442-7a44-940c-926232388e7e.jpeg)
![imaginary_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3953334/f53493ff-435c-fee3-4acb-95eeba1b939c.jpeg)


これらの例のように、逆三角関数の解の取り方で迷うことが無く、また虚数の扱い方も簡潔ですので複雑な式も計算しやすいと考えます。

以上が私が開発したWindows向け関数電卓ソフトで使用することが出来る関数となります。
（長いと見づらいと考えましたので、示していないものもありますが。）

Qiita様では販売目的での投稿は認められておりませんでしたので、あくまで私が開発した関数電卓ソフトの紹介記事とさせていただきます。
エンジニアの皆様は様々な計算手法をお持ちだと思いますが、こういうソフトもあるんだということを知っていただければと思います。
markitdownをブラウザで動くようにした話．

# 背景
- MSがMS Officeの各種ファイルをmarkdownにコンバートできるライブラリを公開した．
- デフォルトがCLIで環境をいろんなところに作るのが面倒．
- ブラウザにしたかった．

# 作ったもの
## MarkItDown Web Converter
オフィスドキュメントやPDFなどの各種ファイルをMarkdown形式に変換するWebアプリケーション．Microsoft社の[MarkItDown](https://github.com/microsoft/markitdown)ライブラリを利用して，ブラウザ上で簡単にファイル変換が行える．

### 機能

- ブラウザからのファイルアップロード
- 各種ファイル形式からMarkdownへの自動変換
- 変換したファイルの即時ダウンロード

### 対応ファイル形式（markitdown準拠）

- Microsoft Office (.docx, .xlsx, .pptx)
- PDF (.pdf)
- 画像ファイル (.jpg, .jpeg, .png)
- テキストファイル (.txt, .csv, .json, .xml)
- HTML (.html)

### 必要要件

- Docker
- Docker Compose

### インストールと実行方法

1. リポジトリのクローン:
```bash
git clone git@github.com:feles-ao42/markitdown_browser.git
cd markitdown_browser
```

2. Dockerコンテナの起動:
```bash
docker-compose up --build
```

3. ブラウザで以下のURLにアクセス:
```
http://localhost:5000
```

### 使用方法

1. ブラウザでアプリケーションにアクセス
2. 「ファイルを選択」ボタンをクリックしてファイルを選択
3. 「Convert to Markdown」ボタンをクリック
4. 変換されたMarkdownファイルが自動的にダウンロードされる

### プロジェクト構成

```
markitdown_browser/
├── app.py              # メインアプリケーション
├── templates/          # HTMLテンプレート
│   └── upload.html     # アップロードページ
├── Dockerfile          # Dockerビルド設定
├── docker-compose.yml  # Docker Compose設定
└── requirements.txt    # Pythonパッケージ依存関係
```

### セキュリティ対策

- ファイルサイズ制限: 16MB
- 許可された拡張子のみ受付
- セキュアなファイル名の処理
- アップロードディレクトリの自動作成

### 開発環境での実行

Dockerを使用せずにローカルで実行する場合:

1. Python環境のセットアップ:
```bash
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate
pip install -r requirements.txt
```

2. アプリケーションの起動:
```bash
python app.py
```

### 制限事項

- アップロードファイルサイズは16MBまで
- 一度に処理できるファイルは1つまで
- 変換結果は一時的にサーバーに保存され、ダウンロード後に削除されます

### ライセンス

このプロジェクトはMITライセンスの下で公開されています。

### 謝辞

このプロジェクトはMicrosoft社の[MarkItDown](https://github.com/microsoft/markitdown)ライブラリを使用しています。
ローカルサーバのオレオレ証明書に対してブラウザで警告が出るときの対策（XCA）

**事前の知識**
・HTTPSでWebサイトに接続するためにはデジタル証明書をサーバにインストール。
・デジタル証明書のSubjectのcommonName欄にサイトのFQDNを記載し、ブラウザはURLと照合しサイトの正当性を確認する。

**トラブル**
・ローカルのWindowsサーバでWebページを作成しChromeでアクセスしたところ警告が出る。TLS通信自体は可能だがなんともうまくない。

**理由**
・現在のブラウザはcommonNameではなくSAN値を参照するためエラーが発生。

**対策**
・SAN値を入力　
ーー以下XCAを使った方法ーー
①Copy　extentions from the requestの☑は外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610900/42e21fc5-f0b6-2d3d-4426-c7987a525046.png)

②ExtensionsタブのSubjectAlternativeNameにDNS：～～となるようにWebページのURL名を記載。
www.hoge.co.jpなら
DNS:www.hoge.co.jp
DNS:hoge.co.jp
ぐらいをいれておけばOKだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610900/33157575-5401-c167-9f42-7b669ca280d9.png)

ーーーー
XCAを紹介するサイトではひと昔前の情報が多くcommonNameのみ記載するガイドが多く少しはまりましたが、上記で解消したので残しておきます。

XCAでの証明書作成は以下がよくまとまっています。
https://note.miyabis.jp/2018/09/%e8%87%aa%e5%b7%b1%e8%aa%8d%e8%a8%bc%e5%b1%80%ef%bc%88ca%ef%bc%89%e3%81%a8%e8%87%aa%e5%b7%b1%e8%a8%bc%e6%98%8e%e6%9b%b8%ef%bc%88ssl%ef%bc%89%e3%82%92-windows-%e7%89%88%e3%81%ae-xca-%e3%81%a7%e7%ae%a1.html
ffmpegでm3u8で配信されるhls形式のストリーム動画をmp4に保存する

# 無音になる問題を回避
ニュースをローカル保存したかったけど無音になった。
ネットには普通にDLできるとされるコマンドがあったがどうしても無音になる
解析を間隔を伸ばすと良いらしいchatGPTってすげー

```
ffmpeg -analyzeduration 10000000 -probesize 5000000 -i "https://vod-stream.nhk.jp/news/xxx/index.m3u8" -c:v libx264 -c:a copy rec.mp4
```
AtCoder Regular Contest 053A - ドミノ色塗りのメモ(Python)

自分用のメモです。以下常体。
## 問題
[AtCoder Regular Contest 053A - ドミノ色塗り](https://atcoder.jp/contests/arc053/tasks)
## 考察
塗り方を考えればいい。隣り合うマスを塗るとき左のマスとしてあり得るのは以下の☆の個数に等しい。同様に上下も考える。
![1000001038.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3934707/22010485-3a13-cd6a-a05f-0189c696eb16.jpeg)
よってマスの塗り方は
```math
H(W − 1) + (H − 1)W 
```
通りである
## ACコード
```py
def color(h,w):
    return h*(w-1) + w*(h-1)

h,w=map(int,input().split())

print(color(h,w))
```
SourceTreeで、Personal Access Tokenの設定方法

git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks push -v origin develop:develop
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.

このようなエラーが出ることありますよね。

これは2021年でGitHubのパスワード認証が廃止されたため、Personal Access Tokenを使う必要があります。


１．Personal Access Token(PAT)の生成をします
    GitHubのウェブサイトにアクセスし、右上のプロフィールアイコンをクリックして「Settings」を選択します。
    左側にいろんな選択肢があって、一番下にDeveloper settingsというのを選択します
    左側の「Personal access tokens」の「Tokens(classic)」を選択します
    真ん中の「Generate new token」の「Generate new token(classic)」を選択します
    
    Noteは名前なので、わかりやすい名前で設定します。
    Expirationは期限です。これはお好みです。期限になったらまたTokenをしなければなりせん。
    Select scopesの中のrepoとuserにチェックに入れます。
    そして、一番下のGenerate tokenを選択します。
    そしたら、真ん中にTokenが出現します。それをコピーします。
２．SourceTreeでの設定
    SourceTreeの右上に設定を選択します。
    リモートの中のリモートリポジトリパスのパスを編集します。
    
    https://<USERNAME>:<TOKEN>@github.com/<USERNAME>/<REPOSITORY>.git <USERNAME>: GitHubのユーザー名 <TOKEN>: 上記で生成したPAT <REPOSITORY>: 

    これで保存すれば大丈夫です。
【TS】型について

## interface
### interfaceは基本オブジェクトにしか使わない。けど関数の型も作ることができる。

```ts
// オブジェクトのみで利用可能
interface Person {
  name: string;
  say(msg:string):void;
}

// エラー
interface func = (num:number) => void;

// エラーにならず関数の型として使える
// この書き方をコールシグネチャという
interface func {
    (num:number):void;
}

// けど、関数の型定義はタイプエイリアスの方が分かりやすいので、こっちを使う
type func = (num: number) => void;
```


## 継承

```ts
// これはどちらも同じ意味

interface A extends B {
  name: string;
}

type A = {
  name: string;
} & B

```


```ts:同名だけど型が違う場合の継承

//interface
interface Nameable {
  name: string;
}

// エラー：型 'number' を型 'string' に割り当てることはできません
interface Human extends Nameable {
  name:number;
  age: number;
  greeting(msg: string): void;
}


// type
type Nameable = {
  name: string;
};

// 継承できるが、name:neverとなる
type Human = {
  name: number;
  age: number;
  greeting(message: string): void;
} & Nameable;

```


## コンストラクトシグネチャ
```ts
// うーん。使いどころがわからない
interface func {
    new (num:number):void;
}

// コンストラクタ専用の型になる
const temp=(cb:func) => {
	const foo = new cb(1);
}
```
https://zenn.dev/uhyo/articles/ts4-2-4-3-abstract


## 関数型（コールシグネチャ）のインターセクション
```ts
// 関数型インターフェースA
interface FuncA {
  (a: number, b: string): number;
  (a: string, b: number): number;
}

// 関数型インターフェースB
interface FuncB {
  (a: number): number;
}

// funcFooの型は↓と同じ（FuncAとFuncBをすべてオーバーロードされている）
// interface xxxx {
//   (a: number, b: string): number;
//   (a: string, b: number): number;
//   (a: number): number;
// }
let funcFoo: FuncA & FuncB;



//funcFooに入れられる関数はFuncAとFuncBで定義している型がすべて入るシグネチャにしなければならない
funcFoo = (a:number|string, b?:string|number) => 0;
```

## keyof
トップレベルのプロパティ名のみユニオン型として返す
```ts
// type K = "name" | "age"
type K = keyof { name: { first: string; second: string }; age: number };
```

## Mapped Types
型のfor文

```ts:基本
type fruit = {
  [P in "apple" | "banana"]: P;
};

// type fruit = {
//   apple: "apple";
//   banana: "banana";
// }
```

```ts:keyofを使う
interface Fruit {
  apple: string;
  banana: string;
}

type MappedTypes = {
  [P in keyof Fruit]: P;
};

// 元のプロパティの型を使いたい場合はT[P]
type MappedTypes<T> = {
  [P in keyof T]: T[P];
};
```

```ts:エラー：MappedTypesではプロパティやメソッドを追加できない
interface Fruit {
  apple: string;
  banana: string;
}

type MappedFruit = {
  [P in keyof Fruit]: Fruit[P];
  name:string;         // マップされた型ではプロパティやメソッドを宣言できません
};

```


```ts:ジェネリクスを使って汎用的にする

// Fruiteインターフェースを読み取り専用にする
interface Fruit {
  apple: string;
  banana: number;
}

type MappedTypes<T> = {
  readonly [P in keyof T]: T[P];
};

type ReadonlyFruit = MappedTypes<Fruit>;
// type ReadonlyFruit = {
//   readonly apple: string;
//   readonly banana: number;
// }

```

### いろいろカスタム
```ts:オプショナルにする
type MappedTypes = {
  [P in "apple" | "banana"]?: string;
};
```

```ts:元のプロパティのreadonlyを消す
interface Fruit {
  readonly apple: string;
  banana: number;
}

type MappedTypes<T> = {
  -readonly [P in keyof T]: T[P];
};

type customFruit = MappedTypes<Fruit>;

```
日本語版UiPathの機械翻訳について

みなさんこんにちは！Qiitaをお読みの皆さんは、UiPath製品やユーザーガイドを何語でお使いでしょうか？

技術系の皆さんは英語版を使われることが多いのかもしれませんが、日本のユーザーのおよそ80%は言語設定を日本語にしてUiPath製品を使用しています（ユーザーガイドではさらに多く、なんと95%以上）。


そこで今日は、UiPathの日本語化を支える機械翻訳技術の活用について、少し紹介したいと思います。

申し遅れましたが、私はUiPathのローカライズチームで6年以上ローカライズ・翻訳に携わってきました。

ローカライズ部門が担当しているのは製品のUI（インターフェイスに表示されるボタンやラベルなど）とユーザーガイドの翻訳です。

入社した6年ほど前に比べてUiPath の製品数は大幅に増え、それに伴って翻訳のボリュームも増大。機械翻訳の導入により、限られたリソースでもスピーディーな日本語化に成功しています。


たとえば前四半期には、ユーザーガイドの約40%のページが機械翻訳で公開されました。

製品についても、Integration ServiceのコネクタのUIは機械翻訳で処理されています。*特に需要の高いコネクタについては、人間による翻訳が順次行われる予定です。


それ以外のガイド・製品は人間が翻訳していますが、こちらもすべて、あらかじめ翻訳エンジンが出力した機械翻訳を編集する手法（[MTPE](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%83%83%E3%83%88)と呼ばれる）を採用しています。ゼロから翻訳するよりも作業速度はかなり上がります。

翻訳業界ではMTPEは時短にならないという意見もあり、私もそれについては同意するところもあるのですが、翻訳エンジンのトレーニング（後述）の方法や対象分野によっては、機械翻訳は翻訳者の心強い味方になりえます。UiPathのローカライズはその成功事例であると感じています。


また、ユーザーガイドについては、人間の翻訳が完了するまでの間は一時的に機械翻訳を公開しています。機械翻訳や人間翻訳を公開するまでのインターバルをできる限り短くするため、新しい技術を活用しながら定期的に作業フローの改良につとめています。

![image-20241203-072437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945862/be1daca9-30be-4164-ad68-ad179417e8e0.png)
どのページにも一時的に機械翻訳が公開される可能性があるため、画像のようなバナーを常に表示しています。

このように機械翻訳をあらゆる場面で活用するとなると、重要なのはその正確さです。UiPathでは、自社専用にトレーニングした機械翻訳エンジンを使用しています。


このエンジンはUiPathのUIや技術文書の翻訳に特化してトレーニングされており、チームではトレーニングに使用する対訳データのメンテナンスにも力を入れています。機械翻訳エンジンのトレーニングについては未知の部分も多く、手探りの部分もあるのですが、現時点でBLEUスコア94.6を達成しています。


この数値は、[Googleのドキュメント](https://cloud.google.com/translate/automl/docs/evaluate?ref=blog.modernmt.com&hl=ja#interpretation)によると「人が翻訳した場合よりも高品質であることが多い」とのことですが、まだまだ至らない部分も多く、たまに笑えない誤訳が混ざっていることもあります＾＾；


とはいえ、無料で使える翻訳サービスに比べるとかなり精度が高いと感じます。社内文書の翻訳用にもこのエンジンを公開しているのですが、最近じわじわと人気になり、使用者数が増えてきました。笑


そんな翻訳エンジンの力も借りながら、チームでは今後も日本語版UiPathの総合的な品質向上と、翻訳版のスピーディーな公開を目指してまいります。日本語ユーザーの皆さんのUX向上に貢献できれば幸いです！


翻訳についてのご意見・ご感想等があれば、product-localization@uipath.com (受信専用) までご連絡ください。（なお、お寄せいただいた内容についての個別の回答はいたしかねますので、あらかじめご了承ください。）機械翻訳技術の発展にご協力くださいますと幸いです！


ちょっと変わり種の記事でしたが、読んでいただきありがとうございました。それではよいお年を！
WSL2のUbuntuインストールが「error: 0x80071772」で失敗する

Windows11のWSL2を有効にしようとした際に下記のエラーが発生

```
C:\Windows\System32>wsl.exe --install
インストール中: Ubuntu
Ubuntu がインストールされました。
Ubuntu を起動しています...
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x80071772
Error: 0x80071772 ??????????????????????????????????????
```

原因はWindows11設定アプリ

>システム → ストレージ → ストレージの詳細設定 → 新しいコンテンツの保存先

で「新しいアプリの保存先」をCドライブ以外にしていたことだったようです。
保存先をCドライブに戻すとエラーが解消されました
ROS2で傘を回してみた話

# はじめに
こんにちは，高校でロボットを制作したりしているBasalteと申します．
今回はROS2を使ってオーバースペックな傘を作ってみた，というお話です．
相方と2人で制作しました．許可をもらって公開しています．


# 目的
このプロジェクトは気象観測機器コンテストという，高専，高校向けのコンテストのために制作しました．
(最終審査まで行くと南極船しらせに乗ることができるなど，面白くておすすめのコンテストです．地学研究をメインとしたものや，"機器"の製作に振っているものなど，幅広い作品が見られます．今回私たちはがっつり後者に分類されるかと思います．)

# 制作テーマ
今回私たちは「小型風向速計測器の制作とその応用」というテーマで，風向風速センサーの自作と，それを用いた自動回転傘の製作という２本立てとしました．

最初はノリだけで応募し，どうして予選を通過したかはよくわかりません．

# 自作風向風速センサ
この作品のキモである自作の風向風速センサについて解説します．
これは相方が製作したのですが，4方向の双方向，計8方向の風速を曲げセンサによって取得し，その平均から吹いている風のベクトルを求めることができます．
![Slide4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895796/e445ab20-3260-d781-1442-903c76341800.jpeg)

これまでの風向風速センサはプロペラの回転数で風速を計測したり，風によって回転することで風向を計測したりするものがメインでした．しかしそれらは大きく重くなるほか，回転するために消耗していきます．

私はこのリポジトリでこのセンサをROS2化しました．micro-rosをesp32で走らせています．
https://github.com/basalte1199/micro-ros-esp32-kisyou

Float32MultiArrayで[radian,speed]をPublishするようになっています．

# 自動回転傘
なんの変哲もないパンチルト機構で，2自由度で傘を動かします．
下部の自作風向風速センサで取得した風の角度をPanに，風速をTiltに反映しています．

特別な点として，ROBOTIS Dynamixelの直交2軸サーボを使用しています．
こちらはパンチルト機構を一つで使うことができ，とても便利です．~~(自律移動ロボットから一時的に剥ぎ取りました)~~
https://e-shop.robotis.co.jp/product.php?id=296

自作センサからDynamixelまですべてROS2で動かしています．とても無駄ですね．ただROS2を使ったことでロボット用に開発していたコードをたくさん使いまわす事ができ，なんとか締め切りに間に合わすことが出来ました．

こちらが動作映像になります．
綺麗に風向きに追従してくれていることがわかります．
分かりにくいですが，風が吹き始めてからTilt角が降りて行っています．
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">気象観測機器コンテストのために製作している作品です！<br>自作の風向風速センサと自動回転傘で雨を完全に防ぐというものです！ <a href="https://t.co/7TPNS05Ter">pic.twitter.com/7TPNS05Ter</a></p>&mdash; basalte(ばざると) (@basalte1199) <a href="https://twitter.com/basalte1199/status/1868307645393944810?ref_src=twsrc%5Etfw">December 15, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 最後に
自分の技術力不足，コミュニケーション力不足から相方には多大なる迷惑をかけてしまいました．本当に申し訳ないと思っています．
ただ同時にある程度形にして残すことができたことも嬉しく思います．
新規性全振りの面白いことができたんではないかと思います．相方をはじめとした協力してくださったみなさん，ありがとうございました．
View Template と MVC Pattern

## View Temaplate 

### 

#### ビューテンプレートは画面を担当する技術で、ウェブページを一つのツールにし、変数を挿入して互いに異なるページを見せてくれる。 Mustacheツールを使用してViewを通じた画面出力をより簡単にしてくれる。

#### Mustacheを使えば、複数のHeader、Footerなどのコードを再利用することができ、ページ構成が便利だ。 また、コードの可読性も良くなり、ページごとにいちいちコードを作成しなければならない不便さもない。 {{>header}} のように様々な機能を簡単に適用することができる。

### 
<br>

## MVC Pattern

### ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929760/37cea150-259f-a393-dbc8-d38260a8ad20.png)

#### MVC Patternは、上の写真のようにウェブの各要素が分離され、クライアントとサーバーが連結されるようにする。 クライアントの要請をControllerが処理してServerに伝達し、Modelはこれを加工してViewに伝達する。 View ではクライアントの要請によるページを表示する役割を果たす。


### <1> Model
#### Modelはソフトウェアやアプリケーションにおける情報やデータの部分を意味する。 これはControllerから受け取ったデータを操作(加工)する役割を果たすと考えられる。 すなわち、データと関連した部分を担当し、値と機能を持つオブジェクトと見れば良い。

### <2> View
#### Viewは入力値やチェックボックスなどのユーザインタフェース要素を示す。 これはControllerから受け取ったModelのデータをユーザに視覚的に見せるための役割を果たす。 ユーザに表示される画面であると考えられる。

### <3> Controller
#### ControllerはModelとViewの間でデータの流れを制御する。 ユーザーがアクセスしたURLに従って要求を把握し、URLに適切なMethodを呼び出してサービスでビジネスロジックを処理する。 その後、結果をModelに保存してViewに伝える役割を果たす。 結局、ControllerはModelとViewの役割を分離する重要な要素である。


<br><br><br><br>
##### * この記事は翻訳機を使って作成されました。
リンクでGASの実行　は出来ないが「入力規則＋トリガー」ならコピー・実行位置取得も容易

## 端的に
１、特定の状況の時だけ実行されるGASを記述する
２、セルの変更時トリガーを用意する
３、データの入力規則で　--　と　実行　などを用意する

## 特定の時だけ実行されるGAS
特定シートという名前のシートで　M列＝13列目　のセルが変更されたら動くGAS
```
function onTrig1(){
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var sheetName =sheet.getName();
  //******「特定のシート」だったら ******
  if(sheetName=="特定のシート"){
    var activeCell = sheet.getActiveCell();
    var value_snd=activeCell.getValue();
    var row = activeCell.getRow();
    var column = activeCell.getColumn();
    //******13列目でセルの値が「送信」だったら ******
    if(column==13&&value_snd=="送信"){
      var val=sheet.getRange(row,column-1).getValue();
      var emailAddress = "abc@def.com";
      var bod="メール<br />本文"
      GmailApp.sendEmail(emailAddress, "スプレッドシートの値",'', {htmlBody: bod});
      //******送信->「--」などに戻す ******
      activeCell.setValue("--");
    }
  }
}

```

## セルの編集時トリガー
トリガー　->　トリガーの追加　->　実行する関数を選択で「ファンクション名を選択」（例：onTrig1）　->　イベントの種類で「変更時」　を選択
![トリガー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1906297/558d96c5-2253-29d0-55a6-64d3d1e53e58.jpeg)

## データの入力規則で疑似スイッチを作成
![入力規則.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1906297/7292ef6b-6b29-f023-40e7-4611d8e36a5c.jpeg)



## 実行
設置した入力規則を　「--」から「送信」に変更すると
GASが実行され　終了すると　GAS自身で　入力規則を「--」に戻す
入力規則であればコピーが容易。
アクティブセルが使えるので複数のGASも不要。実行位置で制御できる。

設置したい　列　が異なる場合はGAS（例：column==13）も変更が必要なので注意。

## なぜ作成したか
GASを実行したいが複数ある場合ボタンなどを増やしたりするのが大変
そもそも画像だとアクティブ処理取得が効かないのでGASを増やさないといけない。
トリガー追加だともっさり動作になるのでは？と思っての追加でしたが
全く違和感ディレイ感もなく動作しました。

AiGeminiに聞いたらリンクの挿入で「javascript:google.script.run.onTrig1();」
で一発！というガセネタの一点張りから始まった。
そもそも「不正なurl判定」で適用すら出来ず。
ウェブアプリ化デプロイ　や　=HyperLinkでいれてみたり
GASのURLを=HyperLinkに入れろ　というガセ情報もつかまされ
非常に遠回りをしての発見。
量子コンピューターがビットコインを無効にするのか気になった

# はじめに

量子コンピューターもブロックチェーンも、ど素人の私ですが、Googleが先日発表したWillowは「10の25乗年かかる計算が5分で可能」などと報道され、ビットコインETFの価格が下落する現象が発生しました。

https://www.bbc.com/japanese/articles/c9dpey8n9z5o

https://www.coindeskjapan.com/266155/

>「ウィローには105個の量子ビットがあり、量子実験には最適だが、ビットコインの暗号を解読するのに必要な量にはほど遠い」と偽名アナリストで技術専門家のシネマッド・プロデューサー（Cinemad Producer）氏はXで述べた。さらに「専門家は、ビットコインのセキュリティに打撃を与えるには、高品質の量子ビットが約100万個必要だと見積もっている」と付け加えた。

>イギリスのサセックス大学と提携している企業ユニバーサル・クォンタム（Universal Quantum）の2022年の研究によると、ビットコインの暗号を破るには19億量子ビットの容量を持つ量子コンピューターが必要だという


そこで将来「量子コンピュータの発展でビットコインが無価値になるのか」について、調べてみることにしました。

有識者の方々のコメントを頂けたら幸いです。

# ChatGPT先生に聞いてみる

![スクリーンショット 2024-12-17 11.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/5d3dc728-5207-3b36-9e93-263e6badd8ab.png)

なるほど。公開鍵から秘密鍵を求められる以外にもマイニングのルールが崩れるという視点があるわけですね。

![スクリーンショット 2024-12-17 11.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/d86a3ae3-5132-2820-e3e0-d63719f28c1f.png)

ChatGPTが挙げてきた情報源
https://bitbank.cc/knowledge/breaking/article/o1_6v5_su6r?utm_source=chatgpt.com
https://cir.nii.ac.jp/crid/1522262180249051648?lang=ja&utm_source=chatgpt.com
https://bittimes.net/news/187517.html
https://coinpost.jp/?p=580044

https://www.coindeskjapan.com/266109/
>「暗号を解読する『ショアのアルゴリズム』を実行するには、約5000個の論理量子ビットが必要だ。言い換えれば、暗号を解読するには何百万もの物理量子ビットが必要になる。Googleの現在のチップは、105個の物理量子ビットだ」

![スクリーンショット 2024-12-17 13.15.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/9226222b-f215-923d-87ca-65da2ceeea10.png)

ChatGPTが挙げてきた情報源
https://blog.nowhere.co.jp/archives/20200731-28898.html?utm_source=chatgpt.com

https://www.jstage.jst.go.jp/article/isciesci/65/2/65_60/_pdf/-char/ja?utm_source=chatgpt.com



ここまでビットコインと量子コンピュータの関係を見てきましたが、
そもそも量子コンピュータの影響はもっともっと大きな範囲に影響が及ぶという指摘↓

https://crypto-times.jp/news-google-willow-bitcoin/

>また、量子コンピューターが現在の暗号技術を解読するほど進歩した場合、リスクにさらされるのはビットコインだけでなくHTTPSやあらゆる金融ネットワーク、政府のデータベースでも同様であるとし、量子コンピューターの話題はビットコインにのみ焦点が当てられる話ではないと述べました。

確かに。

ここ最近、量子コンピュータ関連の企業の株価がどんどん上がっていますが、今後どうなるのか、引き続き着目していきたいと思います。

最後までご覧いただきましてありがとうございました。
格子ハミルトニアン生成時の便利な行列

# 強束縛格子模型のハミルトニアン
よくこんな感じのハミルトニアンを解きたいと思う方がいるかと思います。

$$
    H 
    = -\sum\_{i \in L} \mu c^{\dagger}\_{i} c\_{i}
      +\sum\_{i \in L-1} t\left( c^{\dagger}\_{i}c\_{i+1} + \mathrm{h.c.} \right)
$$

答えは、そうですね、$E\_{k}=2t\cos(k)-\mu$になりますね。

こういったハミルトニアンの固有状態は行列表示したのちに、対角化することで得ることができます。

$$
    H = 
    \begin{pmatrix}
        c^{\dagger}\_1 \\\\
        c^{\dagger}\_2 \\\\
        \vdots \\\\
        c^{\dagger}\_L 
    \end{pmatrix}^\mathrm{T}
    \begin{pmatrix}
        -\mu & t & 0 & &  \\\\
        t & -\mu & t & \ddots &  \\\\
        0 & t & -\mu & \ddots &  \\\\
          & \ddots & \ddots & \ddots
    \end{pmatrix}
    \begin{pmatrix}
        c\_1 \\\\
        c\_2 \\\\
        \vdots \\\\
        c\_L 
    \end{pmatrix}
    = \Psi^{\dagger} H_\mathrm{lattice} \Psi
$$

# 格子ハミルトニアンをJuliaで作ってみよう。
ということで、この格子ハミルトニアンをJuliaで書いてみましょう。
```julia
H_lattice = (
    - μ * diagm(ones(L))
    + t * diagm( 1 => ones(L-1),
                -1 => ones(L-1)  )
)
```

以上です。

# 解説
今回のミソは`ones`と`diagm`です。

## `ones`
`ones(L)` は、成分が1で埋められた配列を返してくれます。
```julia
In : ones(3)
Out: 3-element Vector{Float64}:
 1.0
 1.0
 1.0
 ```
## `diagm`
`diagm(V)`は、与えられた１次元配列`V` を対角成分とする行列を生成します。
```julia
In : V = [1,3,4]
Out: 3-element Vector{Int64}:
 1
 3
 4

In : diagm(V)
Out: 3×3 Matrix{Int64}:
 1  0  0
 0  3  0
 0  0  4
 ```
また、`diagm(n => V)`として`n` というコマンドを用いると、対角から`n`だけずれた位置に、`V`を格納します。
```julia
In : diagm(2 => V)
Out: 5×5 Matrix{Int64}:
 0  0  1  0  0
 0  0  0  3  0
 0  0  0  0  4
 0  0  0  0  0
 0  0  0  0  0
 ```
同時にも行けます。
```julia
In : diagm(2 => V, -2 => -V)
Out: 5×5 Matrix{Int64}:
  0   0   1  0  0
  0   0   0  3  0
 -1   0   0  0  4
  0  -3   0  0  0
  0   0  -4  0  0
```

## 実際のコードでの使い方
以上までを組み合わせると、格子化するときに便利な行列を簡単に生成できるようになります。
```julia
In : diagm( ones(4))
Out: 4×4 Matrix{Float64}:
 1.0  0.0  0.0  0.0
 0.0  1.0  0.0  0.0
 0.0  0.0  1.0  0.0
 0.0  0.0  0.0  1.0

In : diagm( 1 => ones(4-1), -1 => ones(4-1))
Out: 4×4 Matrix{Float64}:
 0.0  1.0  0.0  0.0
 1.0  0.0  1.0  0.0
 0.0  1.0  0.0  1.0
 0.0  0.0  1.0  0.0
 ```

 # 最後に
 こんな感じの関数を作ってもいいかもしれないですね。
 ```julia
M_lattice(L,n,p) = (
    if n == 0
        M = diagm(ones(L))
    else
        M = diagm(
                     n => 1 * ones(L-n),
                    -n => p * ones(L-n)
                    )
    end
)
 ```
windowsでiverilog その165

# 概要　
windowsでiverilogやってみた。
自作cpu、見つけたので、調査してみた。
練習問題やってみた。

# 練習問題
elixirでzktcのディスアセンブラを書け。

# サンプルコード

```

defmodule Dasm do
    def decode(<< 5::5, rs::3, rd::3, 0::5 >>) do
        IO.puts("or x#{rd}, x#{rs}")
    end 
    def decode(<< imm::8, rd::3, 17::5 >>) do
        IO.puts("lil  x#{rd}, #{imm}")
    end  
    def decode(<< imm::8, rd::3, 18::5 >>) do
        IO.puts("lih  x#{rd}, #{imm}")
    end 
    def decode(<< imm::5, rd::3, rs::3, 12::5 >>) do
        IO.puts("lw  x#{rd}, x#{rs}, #{imm}")
    end 
end

a = Base.decode16!("0A31")
Dasm.decode(a)
a = Base.decode16!("0052")
Dasm.decode(a)
a = Base.decode16!("2A20")
Dasm.decode(a)
a = Base.decode16!("014C")
Dasm.decode(a)
a = Base.decode16!("116C")
Dasm.decode(a)


```

# 実行結果

```
lil  x1, 10
lih  x2, 0
or x1, x2
lw  x1, x2, 0
lw  x1, x3, 2
```

# 成果物

https://paiza.io/projects/mWrB20ee6bWyLDBDSfQsag

以上。
全角文字が打てるエミュレータ環境をTechZoneで構築する


## はじめに
先日、TechZoneを用いて、全角文字の打てるエミュレータ環境を構築したので、備忘録を兼ねて構築方法をまとめます。

## 構築方法
まず、[こちら](https://techzone.ibm.com/collection/on-premises-power-systems-aix-ibm-i-and-linux-base-images)からIBMのTechZoneのページへアクセスします。（※IBMidの登録が必要です。）

ページにアクセスしたら、左のメニューから"IBM i"を選択し、POWER9かPOWER10のいずれかを選択します。

### 入力事項
1. **Select a reservation type**
    直ちに使用する場合は、"Reserve now"、使用開始日時を指定する場合は"Schedule for later"を選択します。
![schedule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070417/71110a96-4f25-e1b1-621d-f9e7f6fac5d1.png)

2. **Purpose**
    使用目的を選択します。

3. **Purpose description**
    具体的な使用目的を記述します。

4. **Preferred Geography**
    "North America"を選択します。

5. **date and time**
    "Reserve now"の場合は、開始日時と終了日時、"Schedule for later"の場合は、終了日時を指定します。

6. **Check Availability**
    1~5が入力できたら、"Check Availability"をクリックします。
![入力内容_構築.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070417/2774db93-13da-85a9-5893-ac0a935e0215.png)

1~6入力後、画面右の"I agree to IBM Technology Zone's Terms & Conditions and End User Security Polices"にチェックを入れます。

するとその下の"Submit"がクリックできるようになります。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070417/a5b92a11-19fe-abf8-f2d5-2777b78be0ac.png">

以上を行い、IBM Technology Zoneから開設のメールが届くと、環境が構築されています。

## 接続する
TechZoneが使用可能になると"My reservation"から接続に必要な情報を取得することができます。

### 接続手順
1. **CISCO等を用いてVPN接続する**
    |入力項目|入力内容|
    |:-:|:-:|
    |接続先|asa003b.centers.ihost.com|
    |グループ|Anyconnect|
    |ユーザー|"VPN Account Name 1"|
    |パスワード|"VPN Account Password 1"|

2. **エミュレータ環境の設定**
    既存エミュレータをコピーし、その構成をTechZoneに合わせて変更します。
    
    通信→構成→リンクパラメーター
    |入力項目|入力内容|
    |:-:|:-:|
    |１次(Y)|"Primary IP Address"|
    
    通信→構成→セッションパラメーター
    |入力項目|入力内容|
    |:-:|:-:|
    |ホスト・コード・ページ(C)|037 米国|

3. **ログイン**
    設定を変更したエミュレータでログインします。
    |入力項目|入力内容|
    |:-:|:-:|
    |User|"User Account"|
    |Password|"User Password"|

### 全角文字入力可能ユーザーの作成
以下は既存のユーザー"cecuser"をコピーし、CCSIDの設定のみで新規ユーザーを作成する場合の例です。
1. WRKUSRPRF USRPRF(CEC*)コマンドを実行
2. "cecuser"をコピー
3. 任意のユーザー名、パスワードを入力
4. F10追加のパラメータでCCSIDを5035か1399に設定
5. 接続手順2でコピーしたエミュレータをコピーし、ホスト・コード・ページを4で入力したCCSIDと合うように設定
6. 作成したユーザーでログイン

上記で、全角の使用可能な環境が構築できます。

## 最後に
TechZoneは、最大6日間と長期間の利用はできませんが、IFSなど社内環境において触れるのにリスクが伴うようなことにも触れることができる機会になると思います。

積極的に活用して、IBM iへの知見を深めていきたいと思います！

最後までお読みいただきありがとうございました。
Prismaでリレーション(include)先の型をまとめて取得する

こんにちは。粘着系エンジニアのbamboo-houseです。
リレーション先の型について、とある方法を使うと自分で定義することなく型を取得することができるので参考にしてみてください！

## schema.prisma（モデル定義）
```ts
model User {
  id    Int    @id @default(autoincrement())
  posts Post[]
}

model Post {
  id       Int  @id @default(autoincrement())
  author   User @relation(fields: [authorId], references: [id])
  authorId Int
}
```

## リレーション先の型を取得する
prisma generateした後に、
```ts
type UserWithPost = Prisma.UserGetPayload<{
    include: {
        posts: true;
    };
}>;
// {
//   posts: {
//     id: number;
//     authorId: number;
//   }[]
// } & {
//   id: number;
// }

// selectで絞り込むこともできます
type UserWithPost = Prisma.UserGetPayload<{
    select: {
        id: true;
        posts: {
            id: true;
        };
    };
}>;
// {
//   id: number;
//   posts: {
//     id: number;
//   }[];
// }
```
【解決】WinUI3にてデバックできない

# はじめに
Microsoftが提供する最新のフレームワークを試してみようと思い調査を始めました。
**.NET MAUI** や **WinUI3**といった選択肢がありましたが、今回はクロスプラットフォーム開発を考えていなかったため、WinUI3を選択しました。

# WinUI3プロジェクトのデバッグ課題
WinUI3には、新規プロジェクト作成時にデバッグに関する問題が発生します。(2024/12/10時点)
この問題の原因は、生成されるプロジェクトファイル内のコード設定にあります。
具体的には、**.csproj** ファイルの設定がデフォルトではデバッグに適していない場合があります。

#### 環境
OS : Windows 11 Version 23H2
コードエディタ : Visual Studio 2022

↓実際に発生したエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954159/ef867664-416f-fbe2-5ee7-00591c21177d.png)

# 解決法

・修正前
```プロジェクト名.csproj
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.6.241114003" />
```
・修正後
```プロジェクト名.csproj
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240627000" />
```
Microsoft.WindowsAppSDKのバージョンをダウングレードすることによって、
デバックが可能になりました。

# 調査結果
上記のとおりに操作していただければ、デバックなどは可能になりますが、
WinUI3では、デザイナーを使用することができません。
また、Visual Studio 2022にはBlend for Visual Studio 2022がありますが、
いまのところ使用することはできませんでした。
まだまだ、問題点は多いですがダークモードに標準で対応しているなど、最新のWindowsアプリケーション開発に必要なライブラリを含んでいるため今後のアップデートに期待したいです。

参考
https://github.com/microsoft/WindowsAppSDK/issues/4698
生成AIでサイトを作ってみる

# はじめに
Vercel Labsが提供する生成AIサービス**V0**を使用して2か月ほど経ったのでレビューをします。

# V0とは
Next.jsで有名なVercel社独自が開発している生成AIとなっております。
v0は特にReactやNext.jsを使用したフロントエンド開発に強みを持っています。これらの技術を使ったウェブアプリケーションの設計、実装、最適化などを得意としています。
v0はフロントエンドだけでなく、Next.jsのサーバーサイド機能やAPIルートなど、バックエンド的な要素も扱うことができます。つまり、フロントエンドに特化しつつも、フルスタック開発のサポートも可能です。
https://v0.dev/

# 料金
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954159/4d314fdc-e05e-9e10-978e-c2ac65a23c6b.png)
有料プランではメッセージ制限はありますが10～20倍に増加のほか、プロジェクト作成が無制限であったり、モックアップ作成で有名なFigamaからデザインをインポートすることが可能になっております。

# 実際に使ってみる
以前まで日本語には対応しておらず、英語でプロンプトを入力しなければならなかったが、設定に **日本語(プレビュー版)** があったので、言語を日本語に変更しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954159/abc7c331-ab59-0cde-303c-ac15893f908d.png)

# 試しにECサイトを生成
参考にしたいサイトがあれば、スクリーンショットなどのキャプチャーからコードを生成することも可能ですが、
今回はプロンプトでコードを生成します。

プロンプト「ECサイトのログイン画面から商品閲覧画面まで実装してください。」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954159/1a9d5455-bf8f-749f-b5da-bbf59ffb3a73.png)

# 結果
プレビュー画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954159/fb110f1b-a9cc-d73f-356b-7ea3bc556ff5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954159/1f96b5a2-983f-27b1-64ff-c0660f5b4e2a.png)

実際に使用が可能なレベルのECサイトを生成してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954159/0f666952-f47f-7af2-e91a-583cd7062f53.png)

しっかりフォルダー構造を考慮してコードをコードが生成されるようになっております。

### 修正について
生成されたコードに対して修正を行うことも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954159/70692ddf-e9bd-e5f2-e1ad-f62053491ed4.png)

### ダウンロードについて
生成されたコードはZIPファイルでまとめてダウンロードすることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954159/72afbf7c-510d-b3e1-17f0-250d4c1f6b79.png)

### 公開について
生成したコードは公開することも可能です。
https://v0.dev/chat/VxyWo5hrDqe?b=b_DHxTrjpjpvR

# まとめ
今回はプロンプトによるコード生成を行いました。

機会があればスクリーンショットなどのキャプチャーによるコードの生成や、投稿主はC#(WPF)をよく使用するのでV0からXAMLのコードを生成する方法などについても共有したいと思っています。