OmniAICreator/Qiita-1.07M huggingface dataset:
ページをリロードしないとJavaScriptが動かない

# ページをリロードしないとJavaScriptが動かない
会社検索のボタンをJavascriptで実装し１回目の条件検索を行うときはボタンを押せるが、一回絞り込み検索した後に再度ボタンを押そうとすると反応しない。</br>

# 解決方法
### app/views/layouts/application.html.erb
```
<body data-turbo="false">
    <main>
      <%= yield %>
    </main>
  </body>
```
bodyタグに`data-turbo="false"`を記載し、turboを無効化にすると解決しました。
</br>

もしくは
### app/views/companies/index.html.erb
```
<script data-turbo="false">

</script>
```
scriptタグに`data-turbo="false"`を記載し、turboを無効化にすると解決しました。
</br>


# 解決できなかった方法
色々な記事を見ていると大体は下記をJavaScriptの描かれているところに記載すれば解決できると書いていたが、これでは解決できなかった。
```
<script>
document.addEventListener("turbolinks:load", function() {
  // ...
})
</script>
```
</br>

# turboとは
従来、Railsはサーバーサイドレンダリングを利用し、ページ遷移の度にページ全体をリロードしていた。しかし、この方法ではレスポンスの待機時間が増えてしまうことが問題だった。そこで、Turboはページ遷移を軽量化し、部分的にHTMLを更新することで、ユーザーの待機時間を減らし、インタラクションをスムーズにした。
Turbo発動時、遷移先のページを一から新たに読み込んでいるわけではないので、jsファイルが読み込まれていないという状況が発生し動作しないということが起きる。


# 参考文献
https://qiita.com/shibata0406/items/861df68467f3bee22a94
https://zenn.dev/takeda_kaho/articles/a37d064db1bad4
https://www.next.inc/articles/2025/railsのhotwireとturboとは
https://zenn.dev/shita1112/books/cat-hotwire-turbo/viewer/turbo-drive
１ページに複数のモーダル

# 1ページに複数のモーダル
1ページに複数のモダールを実装するには、dialogタグに` id="modal1"`を書き、buttonのopenの方に`data-modal-target="modal1"`を指定する必要がある。

### app/views/companies/search.html.erb
```
<%# 1つ目モーダル　%>
<div data-controller="modal">
 <dialog id="modal1" data-modal-target="dialog" class="bg-[#f7f8fb] p-8 rounded-lg m-auto backdrop:bg-black/80">


<button type="button" data-action="modal#close"   class=" mt-5 px-4 py-1 bg-white text-[#143993] font-bold text-sm  border-2 rounded-full">
          この条件を追加する
        </button>
        
      
    </div>
  </dialog>

  <button data-action="modal#open" data-modal-target="modal1"class="   text-base ">所在地を選択</button>


<%#　 2つ目モーダル　%>
 <div data-controller="modal">
  <dialog id="modal2" data-modal-target="dialog" class="bg-[#f7f8fb] p-8 rounded-lg m-auto backdrop:bg-black/80">


<button type="button" data-action="modal#close"   class=" mt-5 px-4 py-1 bg-white text-[#143993] font-bold text-sm  border-2 rounded-full">
          この条件を追加する
        </button>
       
  </dialog>

  

  <button data-action="modal#open" data-modal-target="modal2" class="   text-base ">業種を選択</button>
</div>

```
【CodeBuild】ビルドステージのサーバレス化によるDevOps基盤構築

プロジェクトの基盤チームにてCICDの第一歩である、ビルドのサーバレス化に取り組みました！

## 現状・課題
複数のチームがmasterブランチから派生して別々のブランチを切り、最後にマージして一つのアプリケーションを作っていく構成となっていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552177/5f801099-078e-4e5a-9da6-9b48f31d139f.png)


各チーム（ブランチ）ごとに環境を作成しており、各環境にECR、EKS等のアプリケーションに必要な構成をデプロイ。ビルドサーバは単一のEC2（Linux）サーバを利用していました。
ビルドサーバのメモリ上限によって、別チームのビルドが終わらない限り他のチームのビルドを実施することができず、困っていたのが当時の状況です。

## 打ち手
以下の3点を意識して構成の検討～実装まで行いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552177/06fb65d9-57cb-4e6e-8626-51dd22731d11.png)

①拡張性：単一のCodeBuildを構築。AWS CLIで引数に環境識別子を必須入力とし、環境ごとに動的にECRへプッシュする向き先を変更可能にしました。
②セキュリティ：SecretsManagerを活用し秘密情報をセキュアに保持し、IAMサービスロールを利用して最小限の権限設計を行いました。
③運用保守性：CloudWatchからDynatraceへリアルタイムログ転送を設定。開発者のトラブルシュートを容易にしました。

## 結果
開発者は他チームを意識せずビルドが実施可能となり、また1時間のビルド時間を半分に短縮することに成功。
開発効率を大幅に向上することができました！
BizRobo!で時刻表記を正規表現でフォーマットする方法

## はじめに
BizRobo!を使った業務自動化では、様々なデータ形式の変換が必要になることがあります。その中でも時刻のフォーマット変換は頻繁に発生する処理の一つです。
例えば、「940」や「1140」といった3〜4桁の数値を「9:40」や「11:40」のような「時:分」形式に変換したいケースがあります。このような変換にはいくつかの方法がありますが、今回は特に正規表現を使った変換方法に焦点を当ててご紹介します。

## 問題の定義
以下のような時間データがあるとします：

- 940（9時40分）
- 1140（11時40分）
- 1305（13時05分）

これらを以下のような形式に変換したいと考えます：

- 9:40
- 11:40
- 13:05

つまり、「最後の2桁の前にコロンを入れる」という処理を行いたいわけです。
## BizRobo!での実装方法

### 正規表現による解決法
今回のケースでは、「最後の2桁の前にコロン」を入れる必要があるため、次のような正規表現が有効です：

```
(?=\d{2}$)
```
この正規表現パターンは「末尾2桁の直前の位置」にマッチします。


パターンの構成要素：
- (?=...) : 先読み（lookahead）
- \d{2} : 2桁の数字
- $ : 文字列の末尾

### エクスプレッションでの実装
エクスプレッションを使用する場合：

```
replacePattern(時間数値, "(?=\\d{2}$)", ":")
```

例えば、時間数値が940の場合、このエクスプレッションは「9:40」を返します。

## 各言語の正規表現との比較

BizRobo!の正規表現はJavaの正規表現と似た実装になっていますが、完全に同一というわけではありません。

正規表現の基本的な文法（メタ文字、量指定子、グループ化など）はほとんどの言語で共通していますが、違いもあります。

以下に主な言語での同等表現を示します：

### Java

```java:java
String formatted = timeStr.replaceAll("(?=(\\d{2}$))", ":");
```

Javaでは、正規表現中のバックスラッシュを二重にエスケープする必要があります。

### JavaScript
```javascript:javascript
const formatted = timeStr.replace(/(?=\d{2}$)/, ":");
```
JavaScript: Javaと同様に\を2つ使いますが、独自の拡張もあります。
（ES2018以降で同様の書き方をサポート）

### Python
```py:python
import re
formatted = re.sub(r'(?=\d{2}$)', ':', timeStr)
```
Perl/Python: エスケープに\を1つ使います

### PHP
```php:php
$formatted = preg_replace('/(?=\d{2}$)/', ':', $timeStr);
```

### Ruby
```ruby:ruby
formatted = timeStr.gsub(/(?=\d{2}$)/, ':')
```

### 注意点

- 正規表現は強力ですが、入力データのバリデーションも重要です。例えば、分が60以上の値（例：980 → 9:80）は時刻として不適切です。
- 3桁未満の入力（例：45）や5桁以上の入力（例：12345）に対する対応も考慮する必要があります。

### まとめ

今回は、BizRobo!を使って3-4桁の時間数値を「時:分」形式に変換する方法を紹介しました。特に正規表現の先読み機能を使用することで、「最後の2桁の前にコロンを入れる」という要件を簡潔に実装できることを示しました。
正規表現は一見複雑に見えますが、一度理解すれば様々なテキスト処理を効率化できるツールです。ぜひ業務自動化の武器の一つとして活用してみてください。

参考リンク
<!--
- BizRobo! コンバータについて
- BizRobo! エクスプレッションについて-->
- <a href="https://www.regular-expressions.info/" target="_blank">正規表現の基礎</a>
Pythonでオブジェクトをファイルに保存・読み込みをする

```py
import json

def save_object(obj, file_path):
    """
    任意のオブジェクトをJSON形式でファイルに出力する関数。
    """
    try:
        with open(file_path, 'w', encoding='utf-8') as file:
            json.dump(obj, file, ensure_ascii=False, indent=4)
        print(f"オブジェクトを {file_path} に保存しました。")
    except (TypeError, IOError) as e:
        print(f"エラーが発生しました: {e}")

def load_object(file_path):
    """
    JSON形式のファイルを読み込み、オブジェクトとして返す関数。
    """
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            obj = json.load(file)
        print(f"{file_path} からオブジェクトを読み込みました。")
        return obj
    except (json.JSONDecodeError, IOError) as e:
        print(f"エラーが発生しました: {e}")
        return None
        
```
2025-03-27 共有記事ログ

# 技術系
## [JSONとYAMLどっちがいい？APIフォーマット選びで悩んでいる開発者必見！](https://qiita.com/takuya77088/items/935ca090323049280e64)
YAML の特徴とメリットを示す記事です
JSON と YAML のどちらが良いかと問われるとケースバイケースだと思いますが、人が読むことを前提とするのであれば YAML の方が嬉しいことが多いかなと思います
YAML もよく使う記法なので、是非とも構文を理解しておくことをおすすめいたします！

## [GitHub Actions をローカルで実行！ nektos/act の紹介](https://zenn.dev/chot/articles/f7c02e79e1f73b)
Github Actions をローカルで実行可能なツールの紹介記事です
Github Actions は Default Branch になければ動作しない都合上、どうしても検証に時間がかかってしまう問題があるかと思います
そういったものもローカルで検証できればとても楽に実装が可能だと思いますので、Github Action を利用する際には、使ってみても良いのではと思います！

## [最近のCSSを改めてちゃんと学んでみた](https://zenn.dev/gmomedia/articles/6ed3718b4c6bc1)
最近利用可能になったCSSの紹介記事です
SASSが不要なのではと思うくらい便利になっています！
是非目を通してみてください。やりたいことを簡単に実現できるかもしれません！！

## [新卒エンジニアが書籍「脳に収まるコードの書き方」から得た学びとコード改善の実践](https://tech-blog.rakus.co.jp/entry/20250324/code-that-fits-in-your-head)
脳に収まるコードの書き方という書籍の輪読会を行った感想記事です
この記事の後半で『どんなものも、与える役割は「専用の機能１つ」だけ』と『人間の脳は7つまでしか覚えられない』という記載があります
これは自分たちが現在やっている勉強会の内容でもある、Class 単位で分離することや疎結合を目指すところと似ていると思います
ここで示される例でもかなり細かく Class を分離していることから、小さな部品として Class 設計をして関心事をまとめるほうが良いということだと思いますので、今後も Class が量産されることを恐れずに高凝集疎結合なプログラムを作りましょう！

# 共有するほどではないけど興味があったもので読んだもの
* [世はまさに大AI時代！「仕事はどうなるのか」不安な人に今やってほしい事](https://qiita.com/zazen_inu/items/9920bea2e15ecaaf1131)
    * AIによって作業するだけの人はかなり減りそう
    * 指示できる人、判断できる人が今後求められる人材なのかもしれない
* [非同期処理って結局なに？](https://qiita.com/asa129/items/a79231425296e507c8bf)
    * JSにしか触れていない。完全に個人用メモ
* [ITエンジニア3年過ぎてキャリアがまずいことに気づく](https://qiita.com/hosh00990/items/29acb17dfc7bf5a8a2f2)
    * スキルではなく業務経験を条件にされると難しいよね…
* [元ヤフーエンジニア社長が考える、ITエンジニアに向いている人/向いていない人](https://qiita.com/ryoheiiwamoto/items/bd080a2062817c4aa302)
    * 確かに学ぶことが嫌いな人には向かないね
* [そのGitHub Copilotの機能、Preview版じゃない？](https://qiita.com/cazamir0/items/ae71c3bce51fd5a3fa8d)
    * コメント見る限りプレビュー版でも Opt in の設定があるらしい
* [C++しか使ってこなかった男がRustを使ってみた](https://qiita.com/Enuwbt/items/5b822020e575c5250606)
    * Rust という言語が気になってきた
* [リーダーの話し方 これでうまくいく！！](https://toranoana-lab.hatenablog.com/entry/2025/03/19/100000)
    * リーダー業務だけではなく、子育てにも通用しそうな考え方だなって思った
* [遅いエンジニアリング](https://zenn.dev/fukurou_labo/articles/c0471f954ecbcd)
    * 遅いエンジニアリングという考えは新しいなと思った
* [助けて！ CloudWatch Logs のコストが急上昇!! ログ管理の最適化でコストを 1/3 にした話](https://kaminashi-developer.hatenablog.jp/entry/2025/3/21/aws-cloudwatch-cost-optimization)
    * 当社は現状ではログは一切問題とはなってなさそうだった
* [社内でCTFを開催してみた](https://blog.cybozu.io/entry/2025/03/21/112000)
    * 自分たちでCTFを開催するのは楽しそう
* [リスキリングのジレンマ ─学ばない人を動かすべきか？](https://note.shiftinc.jp/n/n96d956c498ae)
    * やる気がない人にやる気を出させるのは難しいよね… コスパ悪いし
    * それよりもやる気がある、学習意欲がある人たちを評価・支援する方が何倍も効果ありそう
    * ただタイプ１の支援を最低限にするのであれば、評価は最もされる仕組みを作らないといなくなりそうw
* [正論が意図しない暴力に？デキる人こそ気をつけたいコミュニケーション事故](https://note.shiftinc.jp/n/n1dd3251ee392)
    * 自分も思考が遅いから、時間をもらえないと思考停止に陥りがちだから気持ちはわかる
    * ただ逆に言ってしまうことも多々あるので気をつけなければならないと思った
* [自動化頼りすぎて失敗した話](https://techblog.jmdc.co.jp/entry/2025/03/24/110000)
    * そこまで自動化に頼り過ぎな感じはしなかったが、AIの件はプロンプトの改善でなんとでもなりそう
* [品質保証の"お作法"　〜テストプロセス解体新書〜](https://tech.unifa-e.com/entry/2025/03/24/070000)
    * テストしない範囲を決めると本当にテストするべき範囲が決まるという考え方はなるほどと思った
    * ここまでしっかりとしたテストをするのは大変そうだけど、それがQAとしての専門部隊なのかもしれない
＜簡単＞（最新2025年3月版）量子ソフトウェアの始め方（IBM Composer実践編）

安定するqBarid環境（Python3+Qiskit1.3+JupyterNotebook）とIBM Composer環境が入手出来たら、次はいよいよ量子コンピューターを動かしてみよう。

IBM ComposerはOpenQASM2.0というコードで記載することができる。ただ、そのお作法を量子コンピューターに触れるためだけに学ぶのはちょっとハードルが高い。そこで、Shorのアルゴリズム（素因数分解）とGroverのアルゴリズム（データ検索）をPythonからOpenQASM2.0に変換したコードがあるのでここに公開する。

## Shorのアルゴリズム（素因数分解）OpenQASM2.0サンプル
```text:
OPENQASM 2.0;
include "qelib1.inc";
qreg q[4];
creg c[4];
h q[0];
h q[1];
h q[2];
h q[3];
cx q[0],q[1];
cx q[1],q[2];
cx q[2],q[3];
h q[0];
rz(pi/4) q[1];
rz(pi/4) q[0];
cx q[1],q[0];
rz(-pi/4) q[0];
cx q[0],q[1];
cx q[1],q[0];
rz(pi/8) q[2];
rz(pi/8) q[0];
cx q[2],q[0];
rz(-pi/8) q[0];
cx q[0],q[2];
cx q[2],q[0];
rz(pi/16) q[3];
rz(pi/16) q[0];
cx q[3],q[0];
rz(-pi/16) q[0];
cx q[0],q[3];
cx q[3],q[0];
h q[1];
rz(pi/4) q[2];
rz(pi/4) q[1];
cx q[2],q[1];
rz(-pi/4) q[1];
cx q[1],q[2];
cx q[2],q[1];
rz(pi/8) q[3];
rz(pi/8) q[1];
cx q[3],q[1];
rz(-pi/8) q[1];
cx q[1],q[3];
cx q[3],q[1];
h q[2];
rz(pi/4) q[3];
rz(pi/4) q[2];
cx q[3],q[2];
rz(-pi/4) q[2];
cx q[2],q[3];
cx q[3],q[2];
h q[3];
measure q[0] -> c[0];
measure q[1] -> c[1];
measure q[2] -> c[2];
measure q[3] -> c[3];
```

## Groverのアルゴリズム（データ検索）OpenQASM2.0サンプル
```
// Name of Experiment: Grover N=2 A=11 v1

OPENQASM 2.0;
include "qelib1.inc";


qreg q[5];
creg c[5];

h q[1];
h q[2];
h q[2];
cx q[1],q[2];
h q[2];
h q[1];
h q[2];
x q[1];
x q[2];
h q[2];
cx q[1],q[2];
h q[2];
x q[1];
x q[2];
h q[1];
h q[2];
measure q[1] -> c[1];
measure q[2] -> c[2];
```

これでIBM Composerを使って、ShorのアルゴリズムをIBM Quantumで実行した場合の観測結果が得られる。
ただこれは観測結果を受け取るだけで、観測結果を評価、利用は出来ない。

観測結果を評価、利用するにはPythonで実装する必要があります。
弱小プログラマー、個人開発1年勝負の記録：今後の戦略

個人開発で一年間生計を立てる——そんな無謀（？）な挑戦をしてる、chantoです。

正直なところ、うまくいく確率は低いかもしれません。けれど、「どれ、見てやろうじゃないか」と思ってくれている方に向けて、試行錯誤の過程を赤裸々に綴っていきます。

# 6つ目のアプリ、リリースしました。

6つ目のアプリをリリースしました。
"サイズごとに把握できる子供服管理 - こどものたんす"という子ども服の管理アプリです。
お子様の服を管理したい人はぜひ使ってみてください。
![Frame 1 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3987263/6f83d29c-10c5-4177-90f6-77a3ae1631b3.png)

https://apps.apple.com/jp/app/%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%94%E3%81%A8%E3%81%AB%E6%8A%8A%E6%8F%A1%E3%81%A7%E3%81%8D%E3%82%8B%E5%AD%90%E4%BE%9B%E6%9C%8D%E7%AE%A1%E7%90%86%E3%82%A2%E3%83%97%E3%83%AA-%E3%81%93%E3%81%A9%E3%82%82%E3%81%AE%E3%81%9F%E3%82%93%E3%81%99/id6743574835?platform=iphone


# まずはAppleの壁

一度アイコンに"こども"という文言を入れていたのがNGで、Appleに棄却されました。
Appleの審査は厳しいとは聞いていたけど、やっぱり細かい。特に子供向けに関する規制はシビアですね。

さらにスクリーンショットもリジェクト。理由は「UIが存在しない要素の比率が高い」らしい。
なるほど、そういうのも見てるのか…と勉強になりました。

修正して再提出し、ようやくリリースに至りました。

# AdMobが未だに止まっている

そして、次なる問題は広告。
AdMobの広告がいまだに止められている。
原因を調べてはいるものの、はっきりとした理由が分からず、現状収益化はストップ状態。

とはいえ、焦っても仕方ないので、まずは市場に価値を提供することを優先するフェーズにします。

# これからの戦略

今までは「作ってリリース」を繰り返してきたけど、ここで一旦整理。
とりあえず、以下の戦略で進めるつもり。

現在、リリースしたアプリの総インプレッションは7000程度。

まずはこれを10000まで伸ばす。

広告も止まっているし、課金機能もつけていないので、10000インプレッションまでは純粋に市場に価値を提供する。

10000インプレッションに達した時点で、

- どのタイミングでマネタイズするか？

- どの機能に課金をつけるか？

を具体的に考えて実施する。

このループを期限まで繰り返し、ブラッシュアップしていく。

正直、闇雲に動いていた時よりも、戦略を決めたことでやるべきことがはっきりしてきた
AWSのデプロイのいろいろな手法

# AWSのデプロイのいろいろな手法
`ローリングアップデート`と`Blue/Greenデプロイ`が有名

# ローリングアップデートのやり方
古い方のコンテナと新しい方のコンテナを1つずつ入れ替えていく手法のことである。

## ローリングアップデートのメリット
・稼働しているコンテナをすべて一括で削除しないためダウンタイムが発生しない。
・問題が発生しても元の状態に戻すことが容易な点。

## ローリングアップデートのデメリット
・ロールバックが複雑になることがある。

# Blue/Greenデプロイとは
新しいコンテナと古いコンテナを並行して稼働させる手法である。
古いコンテナへの通信を徐々に新しいコンテナの方の通信に切り替えていく。
## Blue/Greenデプロイの図

![スクリーンショット 2025-03-27 133740.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750795/9c4b530e-18d5-40d5-baa9-377ccd1828ad.png)

## Blue/Greenデプロイのやり方
①新しいコンテナをすべて一気に作成して稼働させる。
②新しいコンテナが正常に稼働するかを確認する。
③新しいアプリのコンテナにユーザからの通信を切り替える。
④古いコンテナを削除する

## Blue/Greenデプロイのメリット
・ダウンタイムを最小限に抑えることができる
・新しいコンテナ(Green)に問題が発生しても古いコンテナ(Blue)に戻すことが容易。(ロールバックが簡単)
・Green環境で事前に動作確認やテストを実施できる。
## Blue/Greenデプロイのデメリット
・GreenのコンテナとBlueのコンテナを同時に稼働させるためコストが2倍かかる。
・管理・運用が複雑。

## Load Balancerとは
Load Balancerはユーザーからの通信を複数のインスタンスやコンテナに分散させる仕組みのこと。
## Listenerとは
特定のポートで通信を待ち受け、ルールに基づいて適切なターゲットグループへルーティングするシステムのこと。
## Target Groupとは
ターゲットグループは、ロードバランサーからのトラフィックを受け取り、特定のEC2インスタンスやECSのコンテナ、Lambdaなどのターゲットに転送する仕組み。
## セキュリティグループとは
AWSでインスタンスやサービスの通信を制御する仮想ファイアウォールのこと。
notes

Sub UpdateAttachment()
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim rtitem As NotesRichTextItem
    Dim embObj As NotesEmbeddedObject
    
    ' 対象のDBを開く
    Set db = session.CurrentDatabase
    
    ' 文書Aを取得（適切な条件で取得する）
    Set doc = db.GetDocumentByUNID("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") ' 文書AのUNIDに置き換える
    If doc Is Nothing Then
        MsgBox "対象の文書が見つかりません。", 16, "エラー"
        Exit Sub
    End If
    
    ' リッチテキストフィールド「RT」を取得
    If doc.HasItem("RT") Then
        Set rtitem = doc.GetFirstItem("RT")
        If rtitem.Type = RICHTEXT Then
            ' 既存の添付ファイルを削除
            Forall obj In rtitem.EmbeddedObjects
                If obj.Type = EMBED_ATTACHMENT Then
                    Call obj.Remove
                End If
            End Forall
        End If
    Else
        ' フィールドがない場合、新規作成
        Set rtitem = New NotesRichTextItem(doc, "RT")
    End If
    
    ' 新しいファイルを添付
    Set embObj = rtitem.EmbedObject(EMBED_ATTACHMENT, "", "c:\temp\CCC.xlsx")
    
    ' 文書を保存
    Call doc.Save(True, False)
    
    MsgBox "添付ファイルを更新しました。", 64, "完了"
End Sub
VBで外部機器から測定値をシリアル通信で取得

## はじめに
やりたいこととしては、外部機器に測定指示を出し、測定値を取得し、それを画面に表示させることです。  
本記事では、測定指示と測定値の取得にフォーカスします。  
※古いシステムへの導入だったため、ターゲットフレームワークは .NET Framework 2.0 を想定します。


## シリアル通信の設定
外部機器とシリアル通信を行うためには、`SerialPort` クラスを使用します。  
まず、シリアルポートの各種設定を行います。
※シリアルポートの設定は環境によって適宜変えてください。

```vb
SerialPort2.PortName = "COM6"                   ' ポート番号の設定
SerialPort2.BaudRate = 9600                     ' ボーレートの設定
SerialPort2.Parity = IO.Ports.Parity.None       ' パリティの設定
SerialPort2.DataBits = 8                        ' データビット長の設定
SerialPort2.StopBits = IO.Ports.StopBits.Two    ' ストップビット数の設定
SerialPort2.ReadBufferSize = 4096               ' 入力バッファサイズの設定
SerialPort2.WriteBufferSize = 4096              ' 出力バッファサイズの設定
SerialPort2.Handshake = IO.Ports.Handshake.None ' フロー制御の設定
```

上記の設定は、外部機器の仕様に応じて適宜変更する必要があります。


## シリアルポートのオープンとバッファのクリア
ポートを開く際に、既存のデータを破棄することで、不要なデータを受信しないようにします。

```vb
Try
    SerialPort2.Open()
Catch ex As Exception
    MessageBox.Show("シリアルポートを開けませんでした: " & ex.Message)
End Try

SerialPort2.DiscardInBuffer()  ' 受信バッファをクリア
SerialPort2.DiscardOutBuffer() ' 送信バッファをクリア
```

シリアルポートが正常に開けない場合、エラーメッセージを表示する処理を入れています。



## 測定指示の送信
測定値を取得するには、まず測定指示を外部機器へ送信します。

```vb
Dim strCommand As String = "XXX"  ' 送信コマンド
SerialPort2.WriteLine(strCommand)
```


## 測定値の受信
外部機器から送信される測定値を受信し、適切に処理します。

```vb
Dim strReadLNG As String = ""

Try
    strReadLNG = SerialPort2.ReadLine()
    If strReadLNG = "" Then
        Console.WriteLine("測定器から値が取得できませんでした。")
    End If
Catch ex As TimeoutException
    Console.WriteLine("【測定値受信エラー】通信に失敗しました: " & ex.Message)
End Try
```

測定器がデータを送らない場合や、通信がタイムアウトした場合の処理も考慮しています。
しかし、この状態では受信がうまくいきませんでした。
以下の設定を受信の前に追加することで、測定値の受信が正常に行えるようになりました。

```vb
SerialPort2.RtsEnable = True
```


## 測定値の解析
受信した測定値を解析し、適切に処理します。

```vb
If Microsoft.VisualBasic.Left(strReadLNG, 1) = "G" Then
    If Val(Mid(strReadLNG, 3)) > 99999 Then
        Console.WriteLine("異常値検出: " & strReadLNG)
    Else
        Console.WriteLine("取得した測定値: " & Val(Mid$(strReadLNG, 3)))
    End If
Else
    Console.WriteLine("測定値のフォーマットが正しくありません: " & strReadLNG)
End If
```

ここでは、測定値のフォーマットが正しいかどうかを確認し、異常値（99999以上）を除外する処理を行っています。


## まとめ
本記事では、VBで外部機器とシリアル通信を行い、測定指示を送信し、測定値を受信する方法について解説しました。
特に 「SerialPort2.RtsEnable = True」 を設定しないと受信がうまくいかない点に注意が必要です。
自動テストによるリファクタリング支援手法の提案と実装例

## はじめに

リファクタリングは、コードの可読性や保守性を高めるために欠かせない作業です。しかし、「挙動を変えずに構造を変える」という前提のもとでは、**その変化が正しいことを保証するための自動テスト**が不可欠になります。

ところが、自動テストを書くには多大な労力がかかり、特に既存コードに対する後付けのテスト導入はハードルが高いものです。本記事では、この問題に対して「出力の一致」に注目した**シンプルかつ強力なテストアプローチ**を提案します。

---

## 提案手法の概要

### 目的の再定義

従来の自動テストは、**個々の関数の正当性や副作用まで検証**するため、設計・実装・保守のコストが高くなりがちです。  
本手法では、目的を次のように再定義します：

> **「リファクタリング前と後でシステムの出力が同じであること」を保証できれば十分とする**

### 実現アプローチ

- 入力の自動生成（モンテカルロ法）
- 出力ログの自動記録
- ログのハッシュ化による高速比較
- 差異検出時にWinMergeで可視化
- 修正前後のプログラムを**同時に並列実行**してリアルタイムに差分検出

---

## 実装手法の詳細

### 1. モンテカルロ法による入力生成

たとえば、以下のような関数があるとします：

```python
def process(x: int, y: int) -> str:
    ...
```

引数 x が 0〜10,000、y が 0〜10,000 を取る場合、全組み合わせは1億通りにもなります。
このような場合、テストケースを手作業で選定するのは非現実的です。

モンテカルロ法では、次のようにします：

- 各引数を乱数で生成（例：x = random.randint(0, 10000)）
- 数千〜数万回呼び出して、挙動をサンプリング
- 「仕様に対する検証」ではなく「前後の振る舞いの差異検出」を目的とする

### 2. 出力ログの統一フォーマット化
すべての実行結果を、次のような形式でログ出力します：

```json
{
  "time": "2025-03-27T15:32:10",
  "input": {"x": 1234, "y": 5678},
  "output": "OK",
  "context": "case42"
}
```

これを使うことで、後でハッシュ化して差分を検出しやすくなります。

### 3. 仮想時間ベースのハッシュ比較
ログを**仮想時間（またはN件ごとのブロック）で区切り**、各区間ごとにハッシュ値を計算します：
```text
[0s〜5s] → ハッシュA
[5s〜10s] → ハッシュB
...
```
前後のログが同じ区間で異なるハッシュを出した場合、そこで差異が発生したことがわかります。

### 4. 並列実行と同期比較の仕組み
- 修正前後のプログラムを同時に実行
- 同じ入力を両方に与え、同じ仮想時間でログ区間を記録
- 双方の区間のハッシュ値を比較
- **ハッシュ値が一致しなければ、差異箇所のログをWinMergeで表示**
- 一致すれば次の区間へ進行

---

## 導入による効果と応用
✅ テスト作成・保守コストの大幅削減
- テストコードを書く必要がなく、初期導入が極めて手軽
- 複雑な条件分岐にも広く対応

✅ リファクタリングがしやすくなる
- 「テストがないから手を付けられない」状況を回避
- コード改善の習慣が自然と根付きやすくなる

✅ 修正確認・影響分析にも応用可能
- 修正後の出力差異を即座に検出
- 「どこがどう変わったか？」をログ差分から直感的に把握可能

---

## 適用範囲の補足
本記事では説明のために「単一関数への入力と出力」を例に挙げていますが、**本手法の適用対象はそれに限定されません。**

たとえば、以下のような**複雑なシステムや大規模アプリケーション**にも同じ考え方が適用できます：
- 複数モジュールが連携するWeb APIシステム
- GUIアプリケーションのユーザー操作のシミュレーション
- 内部状態を持つ非同期処理やイベント駆動型サービス
- バッチ処理やデータ変換パイプライン

これらのシステムでも、入力を乱数ベースで再現可能にし、出力を一貫して記録できる設計にすることで、モンテカルロ法＋ログ比較による検証が実現可能です。

---

## 今後の展望と課題
この手法は、初期段階からテストが整備されていないプロジェクトにも非常に有効です。今後は以下のような発展も考えられます：
- CIツールとの統合による差分自動検知
- ログフォーマットの標準化・ハッシュ処理の高速化
- 出力差分のAI解析による意味的変化の分類

## まとめ
本記事では、「振る舞いの一致」だけに焦点を当てた軽量な自動テスト手法を紹介しました。
モンテカルロ法とログハッシュ比較を組み合わせることで、最小限の労力で最大限の安心感を得ることが可能です。
この方法が、リファクタリング文化の導入・定着の一助となれば幸いです！
【ChatGPT】昨日の続き、新画像生成についてです。


　どうも、カーブミラーです。

　今回は、昨日の続き、新画像生成についてです。主にX-Twitterでの反響です。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　ではさっそく、【本題】です。

　今回は、昨日の続き、
　　新画像生成についてです。

　新画像生成の名称は
　　“Images in ChatGPT”とも
　　　“4o Image Generation”とも
　　　　呼ばれているようです。
　　　　　主には後者ですね。

　DALL-E3が
　　バラバラの写真を貼り合わせて
　　　1枚の絵にする感じだったのに
　　　　対して、

　4o Image Generationは
　　絵をストーリーみたいに、
　　　ちゃんと順番に描いていくから
　　　　完成度が高くて
　　　　　自然な絵ができるのです。
***
　ちなみに、ここで残念なお知らせ。
　　無料版ユーザーへの提供は
　　　遅れそうです。
　　　　[サム・アルトマンポスト](https://x.com/sama/status/1905000759336620238?t=6cf0KlYGj3XgUVZLm-yo_g&s=19)

　サムによれば、
　　こんなに、4o Image Generationが
　　　人気が出るとは思わなかった
　　　　のだとか。

　ようするに
　　アクセス過多で
　　　ヒイヒイ言ってるよ
　　　　という話のようです😅
***
　それはさておき。

　みなさんが
　　熱狂しているのは
　　　次の三点かな。

　　・日本語がほぼ完全に描画できる
　　・一貫性が守られる
　　・コンテンツポリシーがゆるい

　上のふたつはわかります。
　　しかし、“コンテンツポリシーが
　　　ゆるい”というのが
　　　　わかりませんよね。

　実際やってみると
　　有名人のフェイク画像は
　　　簡単に生成できてしまいます。

　　アメコミ系はダメっぽいですが、
　　　日本のアニメ・マンガは
　　　　一部おかしいですが
　　　　　出てきます。

　　そういう意味では
　　　コンテンツポリシーが
　　　　ゆるいと言えるでしょう。
***
　次は、活用事例です。

　X-Twitterでは
　　多くの実験が
　　　行なわれています。

　・コマ数の少ないマンガ
　・書籍の表紙や広告ポスターなど
　・与えた画像の装飾
　・落書き→リアル→落書き
　・情報をグラレコ風に図解する
　・スプライトシート
　・gitアニメ
　・画風変化
　・LPの大量生成
　・同キャラの別ポーズ
　・コントロールネットの代替
　・3Dモデル用のモック画像の作成
　・depthの生成
　・書道（横書きが良き）
　・タイポグラフィロゴ
　・LINEスタンプ
　・迷路
　・家系図
　・VTuberキャラと
　　　そのパーツ分け済PSDの作成
　・動画生成AIの
　　　StartFrameから
　　　　EndFrameの画像を作成し、
　　　　　動画にする

　また、
　　DALL-E3ではできなかったことも。
　　・背景透過
　　・HEXコードを元に、
　　　　画像の色を変える
***
　描画の向上させるためのヒントとして
　・結果を褒める（褒めて伸ばそう😸）
　・フォントの指定は
　　「明朝体風」「セリフ体風」に。
　　　完全再現は無理。
　・文字に色を付ける。
***
　ただ、
　　一貫性が守られるためか
　　　ガチャ的な変化が
　　　　起こりにくい。

　だから
　　DALL-E3を
　　　使ってきた人間からすると
　　　　残念なところ。

　これはもう
　　まったく別の画像生成AIと
　　　考えた方が良さげだ。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
JavaScript（ES6〜）条件分岐

## if文
条件式が真である場合に特定のコードブロックを実行するために使用される制御構造
falsyな値は必ずfalseになり、コードブロックは実行されないです
- null
- undefined
- false
- NaN
- 0
- 0n
- “” (空文字列)

```javascript
const age = 18;

// 1行のみの場合は、ブロック省略ができます
if (age >= 18) console.log("成人です。");

if (age >= 18) {
  console.log("成人です。");
}

// 実行されない
if (null) {
  console.log("成人です。");
}
```

## else if文
複数の条件分岐を書く場合に使います
```javascript
const age = 20;

if (age < 18) {
  console.log("未成年です。");
} else if (age >= 18 && age < 20) {
  console.log("成人ですが、アルコールは制限があります。");
} else {
  console.log("成人です。");
}
```


## else文
if文で条件に一致しなかった場合、使います

## ネストしたif文
ネストは深くなってしまうと可読性が低下するので、なるべくしないようにします
```javascript
// ネストした例
const age = 20;
const hasPermission = true;

if (age >= 18) {
  if (hasPermission) {
    console.log("成人で許可があります。");
  } else {
    console.log("成人ですが、許可がありません。");
  }
} else {
  console.log("未成年です。");
}
```
```javascript
// ネストしていない例
const age = 20;
const hasPermission = true;

if (age >= 18 && hasPermission) {
  console.log("成人で許可があります。");
} else if (age >= 18) {
  console.log("成人ですが、許可がありません。");
} else {
  console.log("未成年です。");
}
```

## switch文
変数の値に基づいて複数の条件を評価し、それに対応する処理を実行する制御構造
- 条件に合致する`case`があれば、その処理が実行されます
- どの`case`にも当てはまらない場合は、`default`の処理が実行されます
```javascript
switch (式) {
  case 値1:
    // 式が値1と一致した場合の処理
    break;
  case 値2:
    // 式が値2と一致した場合の処理
    break;
  default:
    // どのcaseにも該当しない場合の処理
}

// if文バージョン
if (式 === 値1) {
  // 式が値1と一致した場合の処理
} else if (式 === 値2) {
  // 式が値2と一致した場合の処理
} else {
  // どのcaseにも該当しない場合の処理
}
```
- `case`：各条件を定義
- `break`： それ以上の`case`の実行を防ぐ（省略すると次の`case`の処理も実行される）
- `default`：どの`case`にも一致しなかった場合に実行される（オプション）

```javascript
const score = 85;

switch (true) { 
  case score >= 90:
    console.log("Aランク");
    break;
  case score >= 80:
    console.log("Bランク");
    break;
  case score >= 70:
    console.log("Cランク");
    break;
  default:
    console.log("Dランク");
}
```

## break文
`switch`文の`case`では、通常`break;`を使って処理を終了し、次の`case`に処理が流れないようにします
`break;`を書き忘れると、意図しない`case`の処理まで実行されてしまい、不具合の原因になることがあります
```javascript
// break;がない場合
const fruit = "りんご";

switch (fruit) {
  case "りんご":
    console.log("これはりんごです。");
  case "バナナ":
    console.log("これはバナナです。");
  default:
    console.log("不明なフルーツです。");
}

// 出力
// これはりんごです。
// これはバナナです。
// 不明なフルーツです。
```

```javascript
// break;がある場合
const fruit = "りんご";

switch (fruit) {
  case "りんご":
    console.log("これはりんごです。");
    break;
  case "バナナ":
    console.log("これはバナナです。");
    break;
  default:
    console.log("不明なフルーツです。");
}

// 出力
// これはりんごです。
```

## まとめ
if文は条件に応じてコードを実行し、`else if`や`else`で複数の分岐が可能ですが、ネストは可読性が低下するので極力避けてください。switch文は特定の値に対する処理を簡潔に記述でき、`break`を適切に使わないと意図しない処理を実行されることがあります
設計書のテンプレート

## Contents
⁠目次

## Requirement
チケット、要件定義などへのリンク

## ⁠Overview
⁠概要

## （必要あれば）Wireflame
画面作成するときとか
![スクリーンショット 2025-04-14 085701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942091/6e545b15-0d44-4011-822d-83b1750c34dd.png)


## （必要あれば）Flowchart
シーケンス図と、フローチャート
![スクリーンショット 2025-04-14 090218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942091/96ed229e-1337-4b9a-8752-1da04617d951.png)


## Details
### 1.○○
処理詳細、修正内容詳細

### 2.○○
処理詳細、修正内容詳細

<table>
  <caption>○○を取得するSQL</caption>
  <thead>
    <tr>
      <th>Clause</th> <th>Table</th> <th>Column</th> <th>Condition</th> <th>Remarks</th> 
    </tr>
  </thead>
  <tr>
    <td> SELECT </td> <td>-</td> <td>*</td> <td></td> <td></td>
  </tr>
  <tr>
    <td> FROM </td> <td>Users</td> <td>  </td> <td>  </td> <td>  </td>
  </tr>
  <tr>
    <td> INNER JOIN </td> <td>Clients</td> <td>  </td> <td> Clients.userid = Users.id </td> <td>  </td>
  </tr>
  <tr>
    <td> WHERE </td> <td>Users</td> <td> id </td> <td> = 1 </td> <td>  </td>
  </tr>
</table>
PHPerKaigiに参加しての感想

3/22~3/23にPHPerKaigi参加させていただきました。
行かせていただいた会社に感謝です！

聞いた内容の感想を書きます。

## BCMathを高速化した一部始終をC言語でガチ目に解説する

直近でBCMathに触れており、私にとって刺さるタイトルで、
C言語は大学で苦労したなーと思い出しながら聞いておりました。

普段BCMathを利用する際は内部の構造は何も知らないままPHPで記述しておりましたが、
以下のフローになっているのは非常に勉強になりました。

1. 文字列解析
2. 文字列をBCDへ変換
3. 計算処理
4. BCDを文字列に変換

だからbcaddなどの引数は文字列なんだとなんとなく疑問に思っていたことがスッキリしました。

## PHPStan七転八倒

PHPカンファレンス福岡でうさみさんのPHPStanの登壇を聞いてから、
会社でも導入してみて現在も運用してみています。

導入・運用してみ1年ぐらいはたっていますが、
dumpTypeというの便利なものは知らなかった・・・

https://phpstan.org/user-guide/troubleshooting-types#debugging

## 私の愛したLaravel 〜レールを越えたその先へ

破綻への道がとても共感しつつも、一部やちゃっているなーと思い聞いておりました。
「Laravelの設計を知る」というのは非常に重要だなと思い、
Laravelだけではなく他のフレームワークでも同じことが言えると捉えております。

普段Laravelを使っているので、とても参考になった内容でした。

## レガシーシステムのリプレイスを安全に完了させ、高い生産性とモダン環境を獲得するまで

ちょうどリプレイス案件に関わっており、関わる前にこちらの内容を聞いていれば、
もう少し上手くリプレイスできたのではないかと思いました・・・
次のリプレイス案件に関わる際に参考にさせていただきます。

あと、「Lefthook」は導入して運用してみます。


## OpenSearchのデータを Grafanaで可視化して、 自由の翼を授ける

以前から「Grafana」というのは聞いていたのですが、
2日目の「OpenTelemetry」と一緒に使えそうでしたので、
早速携わっている案件のDockerに入れ込ませていただきました！

試行錯誤しながら触っています

## PHPから考える クレジットカードにおける3Dセキュア決済

3Dセキュア対応をしましたが、決済代行会社が提供している仕様書を見ての実装のみでしたので、
全体ではどのようなフローになっているか初めて知りました。

基本的にサブスクリプションの場合は3Dセキュア認証は発生しないというのは、知らなかったです。
各企業様にお問い合わせしていただきありがとうございました！

## ソフトウェア開発におけるインターフェイスという考え方

こちらの内容を聞いて、確かにここもインターフェイスだなーと感じることが多くあり、
「インターフェイスは不明瞭であってはならい」というのは確かになーと思いつつ、
自分が定義したインターフェースは大丈夫か？と不安にもなりました・・・

もう一度インターフェイスについて考える良いきっかけになりました。

## 非エンジニアにも伝えるメールセキュリティ

SPF,DKIM,DMARCは普段なんとなく、理解はしているが説明はできない状態でした・・・
こちらの内容がすごくすごくわかりやすく良い資料だなーと思い感動しました。
特に「DMARCの結果」に関してはわかりやすい表だと思いますので、活用させていただきたいです。

本当に非エンジニアでもわかる内容だと感じました。

## モジュラーモノリスでスケーラブルなシステムを設計・開発する

前回の発表からどうなったかという内容で、気になるなーと思いながら聞いていました。
「UnitOfWork」という言葉は初めて知りました。
あと、フレームワーク依存が非常に小さいことに驚きました。

## OpenTelemetryを活用したObservability

「OpenTelemetry」というワードはここ最近よく耳にしていたので、気になっていた内容でした。

内容を聞いていてローカル環境でも使えるのでは？と思い
現在開発している案件に「Jeager」でDockerコンテナを立てて触ってみています！
今すぐの本番運用までは難しいそうですが、導入してみたいと感じました。

## アーキテクトと美学：美しさがシステムにもたらす秩序と未来

アーキテクトの美的感覚を言語化するのは重要だなーと感じました。
三角形構図が印象に残っており、写真などを見ると三角形を探してしまうようになってしました。笑
とても面白い内容でした。

## php-fpm がリクエスト処理する仕組みを追う

普段PHPを書いていて、どのような仕組みで動いているなどは知らずに動くなーと思っていましたが、
確かに内部ではどのような仕組みで動いているかを知るのは面白いなーと思いました。
php-srcを除いてみるきっかけになりました。


## まとめ

去年初めてPHPerKaigiに参加させていただきました、今年も楽しく勉強になることが多くありました。
実行委員の皆様このような楽しいカンファレンスにしていただきありがとうございました！

また参加したいです！
AWS CLIでS3 Glacierのオブジェクトを日付指定して一括で復元する

# コマンド
```shell
aws s3api list-objects-v2 \
  --bucket <bucket_name> \
  --prefix <prefix> \
  --query 'Contents[?(LastModified >= `開始日時` && LastModified <= `終了日時` && StorageClass==`ストレージクラス`)].[Key]' \
  --output text | \
  xargs -I {} sh -c \
  "aws s3api restore-object --bucket <bucket_name> --key \"{}\" --restore-request Days=5,GlacierJobParameters={Tier=Standard} || true"
```

# 使い方
- `開始日時`, `終了日時`を`2025-01-01`, `2025-01-01T10:00:00`, `2025-01-01T10:00:00+00:00`のようにISO 8601形式のUTCで記述
- `<bucket_name>`を対象のバケット名で置き換え
- `<prefix>`を対象のオブジェクトで共通の[プレフィックス](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/using-prefixes.html)で置き換える
- `ストレージクラス`を対象オブジェクトに合わせて`GLACIER`または`DEEP_ARCHIVE`に置き換える
- `Days=5`, `Tier=Standard`も適宜変えてください

# 解説
## Tier (BulkとStandard)
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/restoring-objects-retrieval-options.html

違いはトレードオフになっている復元の料金と時間です。

- Standard (デフォルト)
    - 12時間以内で復元できます
    - 東京リージョンで1 GBあたり0.022 USDかかります cf. https://dev.classmethod.jp/articles/tsnote-s3-glacier-deep-archive-cost/
- Bulk
    - ペタバイト級のデータを安く復元させるユースケースで使います
    - 最大48時間かかりますが、Standardに比べて8割ほど安いです

## `--query`で使うJMESPath
https://jmespath.org/specification.html#comparison-operators

リファレンスを見る限り、文字列で解釈される`LastModified`で順序演算子（`>`, `<`など）を使うと結果は`null`になると書いてますが、動作確認する限りはちゃんと使えていました。

JMESPathとか詳しくなりたくないので、よく分からないです :stuck_out_tongue:

一応、AWS CLI v2ユーザーガイドでも別のケースで日付をフィルターする例が紹介されています。

[指定した作成日より後のスナップショットを表示するには - AWS Command Line Interface バージョン 2 用ユーザーガイド Filtering output in the AWS CLI](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-filter.html#:~:text=east%2D1f%22%0A%20%20%20%20%5D%0A%5D-,%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E4%BD%9C%E6%88%90%E6%97%A5%E3%82%88%E3%82%8A%E5%BE%8C%E3%81%AE,-%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA)

# 参考
https://docs.aws.amazon.com/AmazonS3/latest/userguide/archived-objects.html

https://repost.aws/knowledge-center/s3-batch-operation-initiate-restore

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/list-objects-v2.html

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/restore-object.html

https://tech.itandi.co.jp/entry/2019/02/12/150000
notes

Sub UnzipWithSystemIO()
    Dim zipFile As String
    Dim destDir As String
    Dim cmd As String
    
    zipFile = "C:\temp\AAA.zip"
    destDir = "C:\temp\BBB"
    
    ' PowerShell コマンドで System.IO.Compression 使用
    cmd = "powershell -Command ""Add-Type -AssemblyName 'System.IO.Compression.FileSystem'; " & _
          "$zip = '" & zipFile & "'; " & _
          "$dest = '" & destDir & "'; " & _
          "[System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $dest)"""
    
    ' 実行
    Call Shell(cmd, 0)
End Sub
【Rails】DB上の属性をアップデートするメソッド

# はじめに

こんにちは。アメリカに住みながら独学でエンジニアを目指しているTairaです。

RailsのActive Recordでは、モデルの属性を更新するために様々なメソッドが用意されています。
ここでは、代表的なメソッドである`update`, `update_attribute`, `update_columns`をピックアップし、それぞれの特徴や利用シーンを整理してみましょう。

---

### 1. `update`

**概要**
- Railsでよく使用されるアップデートメソッドの一つで、レコードの一部または複数の属性を一括で更新します。
- 更新後は、モデルインスタンスのバリデーションを実行し、不正な値の場合は更新がキャンセルされます。

**使用例**
```ruby
@user = User.find(1)
@user.update(name: "Alice", age: 30)
```

**ポイント**
- バリデーションが走る。
- 更新時にコールバックが呼び出される。
- 更新成功時に`true`、失敗時に`false`を返す。

---

### 2. `update_attribute`

**概要**
- 一つの属性を更新するためのメソッドです。
- バリデーションが実行されず、コールバックは`before_update`と`after_update`のみが呼ばれます。
- DBのカラムを直接更新する動作に近く、特定の制約を無視してでも更新したい場合に使われることがあります。

**使用例**
```ruby
@user = User.find(1)
@user.update_attribute(:name, "Bob")
```

**ポイント**
- バリデーションが実行されないので注意が必要。
- 一つのカラムのみ更新できる。
- `save(validate: false)`に近い動きをするが、コールバックは実行される。

---

### 3. `update_columns`

**概要**
- バリデーションやコールバック、タイムスタンプの更新を一切行わずに、指定したカラムだけを直接更新します。
- DBのコラムに直接SQLを発行するようなイメージです。
- 大量レコードの更新や、高パフォーマンスが必要な場面で役立つケースがありますが、注意点も多くあります。

**使用例**
```ruby
@user = User.find(1)
@user.update_columns(name: "David", updated_at: Time.current)
```

**ポイント**
- バリデーションを行わない。
- コールバックは呼ばれない。
- `updated_at`などのタイムスタンプが自動更新されないため、明示的に指定が必要。
- コードの保守性や整合性を損なうリスクがあるため、使用時は十分注意。

---

## まとめ

| メソッド             | バリデーション | コールバック               | 複数属性 | タイムスタンプ自動更新 | 代表的な使い所                                    |
|----------------------|---------------|---------------------------|----------|-----------------------|------------------------------------------------|
| `update`            | あり          | すべて呼ばれる            | 可能      | あり                  | 標準的な更新。モデルのバリデーションを尊重したい場合に。          |
| `update_attribute`  | なし          | update系コールバックのみ  | 単一属性   | あり (対象属性がタイムスタンプであれば)  | バリデーションを無視して特定の1属性のみ更新したい場合に(ただし注意)。 |
| `update_columns`    | なし          | 呼ばれない                | 可能      | なし                  | 直接DBカラムを更新したい場合。大量更新やパフォーマンス重視。     |

バリデーションやコールバックの要否、どの程度フレームワークの恩恵を受けたいかによって使い分けると良いでしょう。通常は`update`を使用し、どうしてもバリデーションを無視したい場合には`update_attribute`、高パフォーマンスが求められる際やコールバックを走らせたくない時には`update_columns`を選択する、という使い分けを意識してみてください。

---

以上が`update`, `update_attribute`, `update_columns`の基本的な使い方や違いです。Railsのバージョンによって非推奨になっているメソッドもあるため、常に最新のガイドやリリースノートを確認しながらメソッドを選択していくと良いでしょう。
Databricks SQLウェアハウスにCAN VIEW権限が追加されました

こちらのアップデートです。

![Screenshot 2025-03-27 at 11.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d4e6ee79-45cf-4bd5-a595-f88e8643aaf3.png)

**SQLウェアハウスのCAN VIEW権限のパブリックプレビュー**

> 「CAN VIEW(閲覧可能)」権限によって、ユーザーはクエリー履歴やクエリープロファイルへのアクセスを含むSQLウェアハウスを監視できますが、クエリーの実行権限は付与されません。

マニュアルはこちらです。

https://docs.databricks.com/aws/ja/security/auth/access-control#sql-warehouses

試してみます。

# ユーザーAの作業

SQLウェアハウスの権限を設定します。私(ユーザーB)に**閲覧可能**権限を付与します。

![Screenshot 2025-03-27 at 11.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d94d5bd2-c928-4051-855a-03e35495a23c.png)

# ユーザーBの作業

閲覧可能権限が付与されたユーザーでDatabricksにログインし当該のSQLウェアハウスにアクセスすると、**モニタリング**タブにアクセスでき、メトリクスやクエリー履歴にアクセスできます。

![Screenshot 2025-03-27 at 11.45.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d6beed5c-945a-432a-a80b-8e1d5ebb5943.png)

しかし、SQLウェアハウスを用いてクエリーを実行することはできません。

![Screenshot 2025-03-27 at 11.44.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e8afec8e-6c7d-4bc5-947e-52519b28a63e.png)

計算資源のモニタリングのみを許可したい場合にご活用ください。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Pythonのバージョンについて

## はじめに
　Pythonのバージョンについてまとめてみました。

## Pythonのバージョン
　Pythonはバージョンアップを重ね続けている。そのバージョン番号は、A.BあるいはA.B.C形式で表されている。Aはメジャーバージョン番号、Bはマイナーバージョン番号である。末尾のCは、小変更やバグフィックスのときに上げられる。
　1991年に0.9、1994年に1.0、2000年に2.0、2008年に3.0が発表された。
　Pythonが大きな注目を浴びたのは、2系からであり、数多くのライブラリが作成された。3系は、言語レベルで大きな変化が施された。2系と3系は、互換性に欠けており、2系で作成したプログラムの大部分は、そのままでは3系では動作しない。2系のサポートは2020年までである。2系用のライブラリを使用しなければならない、などの特別な理由がない限り、3系を使うべきである。

## おわりに
ここまで読んでいただきありがとうございます！

## 参考文献
・新・明解Python入門 (新・明解シリーズ) 単行本 – 2019/5/23
柴田 望洋 (著)
p.4
Satya Nadella氏セッション 爆速レポ AI 変革の時代をリードする ( Leading in the age of AI transformation )　Microsoft AI Tour Tokyo 2025

## はじめに
**Microsoft AI Tour**は大盛況です。

https://aitour.microsoft.com/ja-JP/sessions?filter=event%2FlogicalValue%3ETokyo

ライブ放送が[X](https://x.com/i/broadcasts/1MnGnwobVddJO)でも行われていたことに驚きを感じました。
今回はスタッフとしての参加でしたが、この基調講演は誰もが視聴することができました。

まるで映画のような導入から始まり、AI時代の幕開けを伝える基調講演となりました。この機会に参加されたすべての方が心躍る時間を共有されたのではないかと思います。
メッセージの方向性は、開発者や技術関係者だけでなく、より広い層に向けられていることが感じられました。

Satya Nadellaと数十メートルの距離でその力強いメッセージを直接聞けたことは、非常に濃密な時間だったといえます。

--- Copilot 依頼分

## イベント詳細
**タイトル:** AI変革の時代をリードする (Leading in the age of AI transformation)  
**日時:** 木曜日, 2025年3月27日 | 10:15 - 11:15 JST  
**場所:** 東京, 東7ホール (Stages 1-4)  

## スピーカー
- **Satya Nadella (サティア・ナデラ)** - Microsoft Corporation 会長兼CEO  
- **藤長 国浩 (Kunihiro Fujinaga)** - ソフトバンク株式会社 専務執行役員  
- **宮坂 学 (Manabu Miyasaka)** - 東京都副知事  
- **津坂 美樹 (Miki Tsusaka)** - 日本マイクロソフト株式会社 代表取締役社長  

--- 

## AI-driven business transformation

ムーアの法則からさらに飛躍し、パフォーマンスをどれほど発揮できるか、その方程式は大きく変わりました。正にブレークスルーと言えるでしょう。
ユーザーインターフェースはマルチモーダルになり、推論やプランニングが可能になり、その基盤が高度かつ長期的な記憶をもとに構築されています。

テクノロジーの力を用いて、より多くのことを達成できるということは、実体験を通じて実感することができます。一日に達成できるタスク、自分が解決できる課題、それがAIという強力な力を借りることによって実現可能になります。

個人の領域でもそうですから、`Copilot`という個人から組織までの窓口を担うツールは、さらに多くの発展をもたらすことに間違いありません。
私自身のこのレポートも、日時の記録や参加者の記録のような定型的な作業からコピペする不毛な時間から解放され、自分が感じたこと、アイディアや想像にフォーカスすることが可能になります。

## Talk to Copilot - Microsoft 365

日常生活のお供としても`Copilot`は活躍します。まるで気のいい友人のように、言葉で相手の要望をくみ取り、言葉とチャットでベストな回答を提供します。

Microsoft 365に組み込まれたWord、Excel、PowerPointは日常の記録という作業から解放されることを実現し、そのデータ資産をコラボレーションするツールとして`Copilot Pages`が活躍します。さらにコラボレーションが深まり、チームワークが強化されるのではないでしょうか。

## Bringing the power of reasoning to Microsoft 365 Copilot

- `Researcher agent`
- `Analyst agent`
- `Reasoning and agent flow in Copilot Studio`

調査、分析、仮説と示唆を出すこと。これは正に人が苦労してきたタスクです。これらのエージェントは実際に製品でもデモンストレーションが実施されました。

`Researcher`が定義された範囲から高品質な調査結果をチームに`Copilot Pages`の形式で共有し、分析はスプレッドシートを用いて`Python`を使ったハイレベルな分析を提供します。
より思考に力を費やし、人が意思決定までのプロセスが凝縮されることになります。

少ない労力でベストパフォーマンスができる環境に最適化されるのでしょう。

## 考えるべきことはデータ

`Copilot`を活用するにあたっても、その知識基盤となるData Platformを最適化しなければならない課題があります。数多くのDatabaseサービスがすでに存在しており、AzureやPower Platformで我々はその運用に真剣に向き合わなければなりません。

Azure AI model breadthは安全な形で180以上の最先端なAIモデルを供給します。インフラストラクチャーとデータ、アプリケーションがそろっているのです。

## おわりに

基調講演ではその他にも、日本における事例の紹介や`Copilot+PC`のビデオデモンストレーションがありました。また、`Security Copilot agents`という非常に重要なエージェントや量子コンピュータといった先進的な概念にも触れられました。

セッション全体を通して、VTRはグルーヴィーな音楽とともに、ワンタッチまたは限りなく少ない動作でイノベーションを起こすことが可能になる未来を描いていました。その様子はまるでスーパースターのライブのようで、心躍る発表が、強力なリーダーシップを持つSatya Nadellaから力強く訴えられました。

`VTR`はグルーヴィーな音楽とともに、ワンタッチまたは限りなく少ない動作でイノベーションを起こすことが可能になります。
様子は`Super Star`のライブのようです。心躍る発表が、強力なリーダーシップを持つサティアから強く訴えられます。

自分も今から何かイノベーションを起こせるのでは🧐そんな気持ちが強く掻き立てられますね。
どきどきしっぱなしの基調講演でした。

`Copilot`を中心にテクノロジーを活用することで明日はもっといい日になることは間違いないですね。
以上、走り書きでした！
【SQLアンチパターン解説】ポリモーフィック関連（Polymorphic Associations）

## はじめに
SQLアンチパターンの中でも、柔軟性を求めた結果、整合性や保守性を犠牲にしてしまう「ポリモーフィック関連（Polymorphic Associations）」について解説します。

## ポリモーフィック関連とは？

複数の異なるエンティティ（例：`posts`や`photos`など）に関連付けるために、1つのテーブルに対して汎用的な外部キーを持たせる方法です。

一見便利そうに見えますが、実はデータ整合性・クエリの可読性・保守性に大きな問題を抱えています。

## ❌ アンチパターンの例

```sql
CREATE TABLE comments (
  id INT PRIMARY KEY,
  commentable_id INT,
  commentable_type VARCHAR(50), -- 'post', 'photo'など
  body TEXT
);
```

この設計だと、`commentable_id`がどのテーブルを参照しているかを`commentable_type`で判断する必要があり、以下の問題が発生します。

### 問題点
- 外部キー制約を使えない（整合性の保証なし）
- JOINが動的になりSQLが複雑化
- 不正データの混入（存在しないpostやphotoにコメントが付けられる）


## 解決策①：テーブルを分ける

対象ごとに個別のコメントテーブルを作成します。

```sql
CREATE TABLE post_comments (
  id INT PRIMARY KEY,
  post_id INT,
  body TEXT,
  FOREIGN KEY(post_id) REFERENCES posts(id)
);

CREATE TABLE photo_comments (
  id INT PRIMARY KEY,
  photo_id INT,
  body TEXT,
  FOREIGN KEY(photo_id) REFERENCES photos(id)
);
```

- 各コメントは明確な対象に結びつき、整合性が保証されます。
- JOINや検索もシンプルになります。



## 解決策②：共通親テーブルを使う（継承パターン）

全ての対象エンティティに共通の親テーブルを持たせる方法です。

```sql
CREATE TABLE entities (
  id INT PRIMARY KEY
);

CREATE TABLE posts (
  id INT PRIMARY KEY,
  title TEXT,
  FOREIGN KEY(id) REFERENCES entities(id)
);

CREATE TABLE photos (
  id INT PRIMARY KEY,
  url TEXT,
  FOREIGN KEY(id) REFERENCES entities(id)
);

CREATE TABLE comments (
  id INT PRIMARY KEY,
  entity_id INT,
  body TEXT,
  FOREIGN KEY(entity_id) REFERENCES entities(id)
);
```

- commentsは`entities`を介してpostsやphotosと間接的に紐付きます。
- 柔軟性と整合性のバランスが取れる方法です。



## まとめ

| 項目 | ポリモーフィック関連 | 対応策 |
|------|----------------------|--------|
| 柔軟性 | 高い | 中〜高 |
| 整合性 | 低い | 高い |
| クエリの容易さ | 難しい | 比較的簡単 |

便利そうに見えるポリモーフィック関連ですが、長期的に見てトラブルの原因になります。  
設計段階で「何と何を関連付けたいのか」を明確にして、**正規化された設計**を心がけましょう！
aarch64対応のGCC(mingw-woarm64)をインストールする

Amazon Linux 2023のオンプレミスでの検証環境をWSL上で動かすのに[WSL-ToyC](https://github.com/noumia/wsl-toyc/)を使っているのですが、作者さんがリリースしてくれているバイナリにはx86-64アーキテクチャ向けのものしかなく、[Prism](https://learn.microsoft.com/ja-jp/windows/arm/apps-on-arm-x86-emulation#prism)ではなく、できる限りネイティブなバイナリで動かしたい自分としてはなんとなくもやもや～っと。
そんなわけで、自分で[WSL-ToyC](https://github.com/noumia/wsl-toyc/)をGitHubからダウンロードしてコンパイルしようとしたのだけど、MakefileをみるとどうやらWSL-ToycはLinux上でWindowsの実行ファイル(.exe)を作れるGCC(GNU C Compiler)`x86_64-w64-mingw32-gcc`を使ってビルドされているらしい。
`x86_64-w64-mingw32-gcc`はその名前から判るようにx86-64向けのバイナリを吐き出すコンパイラなので、これをそのまま使ってWSL-Toycをビルドしても元とおなじくx86-64ターゲットのものになっちゃう。
そこでちょろっとソースコードを覗いてみたら、それほど複雑なコードでもなく、普通にAarch64向けのバイナリを吐き出す`x86_64-w64-mingw32-gcc`のようなものがあればいいわけで、さくっとGoogleさんでアプリ名の頭の`x86_64`を`aarc64`や`arm64`に変えて探してみましたｗ
そしたら、まだまだ安定版とは言えないらしいこど、それなりには動くようになったよとアナウンスされている[Windows on Arm64 GNU Toolchain Cross-Compiler](https://github.com/Windows-on-ARM-Experiments/mingw-woarm64-build/)というGitHubのページを発見！
**ビルド作業は**といっても実に簡単、リポジトリの`README.md`に書かれているとおりにWSL2のUbintuやネイティブに動作しているUbuntu上でリポジトリをクローンしてビルド用のシェルスクリプトを動かすだけでホームディレクトリ上にビルドされたコンパイラ環境がインストールされます。

GitHubからソースコードを取得する
```bash
git clone https://github.com/Windows-on-ARM-Experiments/mingw-woarm64-build.git
```

クローンしたソースコードをビルドする
```bash
cd mingw-woarm64-build
./build.sh
```

ビルドされたコンパイラ環境(GNU Toolchain Cross-Compiler)はホームディレクトリの` ~/cross-aarch64-w64-mingw32-msvcrt`以下にインストールされるので、実行ファイルがある` ~/cross-aarch64-w64-mingw32-msvcrt/bin`をパスへと追加してあげれば利用することができます。

とりあえず、手動でパス`PATH`に追加してみる
```
export PATH=~/cross-aarch64-w64-mingw32-msvcrt/bin:$PATH`
```

GCCを起動してバージョンを確認
```bash
aarch64-w64-mingw32-gcc --version
```

```console
aarch64-w64-mingw32-gcc (GCC) 15.0.1 20250131 (experimental)
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

ちなみに、ここでビルドしたGCCを使って無事にWSL-ToycをAarch64へと対応させることができました。
ちなみに、ARM64アーキテクチャの表記って`aarch64`だったり、`arm64`だったり、一文字目だけ大文字の`Aarch64`だったり、`Arm64`だったり、あるいは全部大文字の`AARCH64`だったり、`ARM64`だったりと統一されていないのはなんとかならないものでしょうか？
【Power BI】スライサーやフィルター条件を保存しない設定

こんにちは。
株式会社エーティーエルシステムズの大場です。

Power BI サービスでレポートを閲覧するとき、前回設定したスライサーやフィルターの条件を常に初期状態に戻したいと感じたことはありませんか？
レポート単位で設定を変更することができます。


業務中にこの機能を知り、便利だと感じたためまとめました。


## 設定方法1　Power BI Desktop
フィルターの自動保存（固定フィルター）を無効にする方法は2つあります。
まず、Power BI Desktopでの設定方法を説明します。

Power BI Desktopを開いた状態で、左上の「ファイル」をクリックします。

画像左下にある「オプションと設定」をクリックします。
![opusyonn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013595/3d567a08-8aaa-4a8f-a420-78d3a8107d64.png)


下図のように、「オプションと設定」が表示されます。
「オプション」を選択します。
![2025-03-26_21h12_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013595/d3ea1141-cd4b-479c-b0fe-ca67199c33a6.png)


すると、以下のオプション画面が表示されるので、
「現在のファイル」のなかにある「レポートの設定」を選択してください。
「固定フィルター」という設定項目があります。

![スクリーンショット 2025-03-27 103047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013595/83c2ac3f-64af-4370-a1b5-0bfc7ebf5516.png)


固定フィルターとは、レポートに適用したスライサーやフィルター条件を自動的に保存できる設定のことです。

固定フィルターを無効化したい場合、「エンドユーザーがこのファイルのフィルターをPower BI サービスに保存することを許可しない」にチェックを入れます。



## 設定方法2　Power BI サービス
固定フィルターに関する設定は、Power BI サービスでも変更可能です。



ワークスペースのレポート一覧を開きます。
設定したいレポートの「...」（その他のオプション）をクリックし、「設定」を選択します。
![そのた14310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013595/f4bfbf46-007b-4a1c-8c7a-6b70cfb33d93.png)

画面左側に表示される、以下の設定に「固定フィルター」の項目があります。
チェックを入れて、設定を保存してください。


![214001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4013595/19e7f09f-7d0a-49e5-bca8-394b849cb606.png)



## まとめ

デフォルトでは固定フィルターは有効になっており、レポート閲覧者はフィルターを保存することができます。
固定フィルターを無効化したい場合は、上記の設定をしておく必要があります。

特に、他のユーザーにレポートを共有する場合は、他者が設定したスライサー条件が残ってしまうため、固定フィルターの無効化を活用してみてください。


## 参考

https://learn.microsoft.com/ja-jp/power-bi/create-reports/power-bi-report-filter?tabs=powerbi-desktop#:~:text=%E5%88%B6%E5%BE%A1%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%81%AE%E4%BF%9D%E5%AD%98%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B,-%E6%97%A2%E5%AE%9A%E3%81%A7%E3%81%AF%E3%80%81%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88
動画生成AIおすすめ＆比較

今日は動画生成AIのおすすめを紹介します！

*   **PixVerse**
    *   特徴: テキストや画像から動画を生成できるAIツールです。特にアニメ系の動画生成機能が強化されており、水や火の動きなどの物理系の再現度が高いです。上位の有料プランでは1080Pの高解像度動画を作成できます。画像や動画をアップロードしてエフェクトを選択することで、ミーム系のネタ動画を簡単に作成することも可能です。作成した動画は画質を上げたり、延長したり、音声をアップロードして動画内の人物を喋らせたりすることもできます。
    *   料金プラン: **無料プラン**があり、Googleアカウントなどでログインすると毎日動画を生成できるクレジットが付与され、お試しで利用できます。無料プランでは高解像度モードが3回ほど利用可能です。**有料サブスクリプション**に登録すると、より多くのクレジットが付与されるほか、高解像度モードをクレジットが尽きるまで利用でき、ウォーターマークのない動画をダウンロードできるなどの特典があります。

*   **Kling AI**
    *   特徴: テキストや画像から高品質な動画や画像を生成できるAIプラットフォームです。2024年12月に大きなアップデートがあり、入力テキストに忠実で、より一貫性のある動的な動画を作成できるようになりました。物理表現なども大きく増強された動画生成AIモデル「Kling 1.6」が実装されています。
    *   料金プラン: **無料プラン**があり、任意のメールアドレスを登録してログインすると、毎月動画や画像を作成するためのクレジットが付与され、ある程度無料で利用可能です。**有料サブスクリプション**に登録すると、毎月多くのクレジットをもらえたり、ウォーターマークを消すことができ、無制限に高画質な動画を作成できるモードや動画を延長できる機能を利用できるようになります。

*   **Hailuo AI**
    *   特徴: 中国のAIスタートアップminiMAXが開発した、2024年10月にリリースされたばかりの動画生成AIツールです。テキストや画像から高品質な動画を生成できるAIモデル「T2V01」が搭載されています。12月には2Dのイラスト画像を動画化できるイラスト特化の動画AIモデル「hro I 2 V01 Live」も実装されました。テキストから音声を生成できるAI機能も今後実装される予定です。
    *   料金プラン: **無料プラン**があり、ツールページからGoogleアカウントでログインすると、毎日動画を作成するためのクレジットが付与され、ある程度無料で利用できます。**有料サブスクプラン**も用意されており、より多くのクレジットをもらえたり、ウォーターマークを消したりできます。最上位のアンリミテッドプランに登録すれば、無制限に動画を作成可能です。

*   **Kaiber**
    *   特徴: 動画生成AIの黎明期から存在する、テキストや画像から5秒の動画を作成できるAIツールです。2024年10月に「下 1.5」に、12月に「下 2.0」にアップデートされ、生成できる動画の画質が大きく向上し、動画に様々な効果を加えるエフェクト機能が実装されました。
    *   料金プラン: **無料プラン**があり、ログインページからGoogleアカウントなどでログインすると、動画を作成するためのクレジットが月に150クレジットもらえます。**有料サブスクリプション**に登録すると、月に付与されるクレジットが増え、月35ドル以上の有料サブスクリプションプランに登録すると、動画を商用利用できるようになります。

*   **Boo 2 (Google)**
    *   特徴: Googleが発表した、画像やテキストから様々なスタイルに対応した動画を生成できるAIツールです。最新モデルのBoo 2は、テキストから最大4Kの超高画質な数分間の動画を生成可能です。動画生成AIのベンチマークデータを使った人間による評価では、OpenAIのSoraを超える評価を獲得したとされています。動きが非常に滑らかで、現在公開されている他の動画生成AIと比較しても品質が高いです。
    *   料金プラン: 先行で一部のユーザーにのみ提供されており、公式サイトで順番待ちリストに登録することで後日利用できるようになるようです。**料金プランの詳細は現時点では不明**です。

*   **MovieGen (Meta)**
    *   特徴: Metaが発表した、テキストから高品質な動画と音声を生成できる動画生成AIツールです。豊富なカメラワークを備えており、テキストから最大16秒の動画生成が可能です。動画内の対象物をテキスト指示で編集する機能や、人物の画像とプロンプトからパーソナライズされた動画を作成する機能、動画に同期した環境音や効果音、BGMを作成する機能などが実装されているようです。2025年中にInstagramに登場する予定です。
    *   料金プラン: **料金プランの詳細は現時点では不明**です。

*   **Adobe Firefly Video Model (Adobe)**
    *   特徴: Adobeが発表した、テキストから動画を生成可能なAIモデルです。テキストやカメラコントロール、参照画像を駆使して動画を生成できます。他のFireflyモデルと同様に商用利用するのに問題がないように設計されており、Adobeが使用許可を得たコンテンツのみで学習されています。ベータ版はAdobe Fireflyで利用できるようになる予定です（2025年1月上旬時点）。
    *   料金プラン: **料金プランの詳細は現時点では不明**ですが、Adobeの他のFireflyモデルと同様の体系になる可能性があります。
KintoneとZoom Phoneの連携 ~着信ポップアップ編~

# はじめに
CybozuさんのKintoneでZoom Phoneをもっと便利に使うことができたら、と考えている方がいらっしゃればと思い、Kintoneの開発者向けテスト環境とZoom Phoneを連携させてみました。この記事はKintoneとZoom Phoneの連携についての3回に分けたシリーズの2回目となります。

:::note info
今回は、おそらくきっと多分めちゃ短い記事になるので、サクサクいきます。
:::

- **Click to Call** : 顧客情報にある電話番号をもとに、Zoom Phoneで電話をかける方法を説明します。いくつか注意点もありますが、十分実現できる内容です。
- ***今回→着信時の顧客情報ポップアップ***：Zoom Phoneに着信があった際、自動的にその番号をKintoneで検索し、該当する顧客がいればその情報をウェブ画面上で提示する方法について説明します。
- **通話後の活動履歴登録**：通話終了後に顧客情報ページなどから活動履歴を手動で登録する代わりに、終了後に自動的に活動履歴を登録する方法を説明します。これは少し高度な技術と知識が必要となるかもしれません。

この記事は、基本的にZoom Phoneをインストールしているデスクトップ環境を前提に説明しています。モバイル環境では動作しない可能性があるため、あらかじめご理解ください。

# Kintone のアプリについて
前回に引き続き、Kintoneアプリストアにある「営業支援パック」を前提にお話しします。このアプリパックには、顧客管理アプリが含まれています。
Click to Callや着信時のポップアップには、このアプリの持つレコードの中の「TEL」フィールドや「担当者名」フィールドを活用してみたいと思います。
# 着信時の顧客情報ポップアップ : レベル0
今回はZoomのサポートページにある一般的な方法だけ紹介します。そこまで難しくはないのでよければ参考にしてみてください。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442226/18d79920-5fa6-4c95-9ec1-1dc35c200ed6.gif)

簡単な作業だけで、Zoom Phoneで着信を受けると自動的に顧客管理アプリの検索画面がブラウザで開き、検索が始まります。該当のキーワードでヒットするデータがあればそれを見つけることができます。

![Screenshot 2025-03-27 at 10.22.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442226/39c66432-3b14-4c64-9392-b4e525f64dd9.png)

早速結論ですが、以下のZoomサポートページにある通り、Zoomクライアントの設定画面を開き、[電話]セクションの[着信に対してアプリや URL を起動]にチェックを入れます。

https://support.zoom.com/hc/ja/article?id=zm_kb&sysparm_article=KB0068194

![Screenshot 2025-03-27 at 10.25.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442226/9fa501cb-0da1-4fce-a41a-d46790bc1f82.png)

ここで、顧客管理アプリの右上にあるアプリ内検索の窓に何か入力して検索をしてみてください。すると、

![Screenshot 2025-03-27 at 10.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442226/0ae1c9e2-8f45-4f9a-9bf7-dc9898e34f0f.png)

このような画面に遷移しつつ、URLが以下のようになると思います。

```
https://{YOUR_SUBDOMAIN}.cybozu.com/k/search?keyword={QUERY}&app=3
```

:::note
末尾の`app=3`は顧客管理アプリのアプリID
:::

このURLをそのままコピーして、先ほどの設定画面の入力欄に貼り付けます。

![Screenshot 2025-03-27 at 10.32.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442226/5aa34306-eaad-4c44-8344-4cbd40af6f58.png)

その上で、先の`keyword=`と`&app=3`に挟まれている、検索キーワード部分（上の例では`{QUERY}`としている部分）をその下の説明にある通り、好きなものに差し替えます。

どのパターンを使うかについては、状況に合わせていろいろ試しつつご検討ください。`Test`ボタンで挙動を確認することも可能です。クリックすると、サンプルデータを入れた形でブラウザが開くと思います。

これで着信ポップアップは完了です。ぜひお試しください。

# 次回
次回はいよいよ最終章、通話後の活動履歴登録に挑みます。少し長くなると思いますが、お付き合いください。
YOLOv11を使ってiPhoneでリアルタイム・セグメンテーションを始めよう

YOLOv11がリリースされ、Ultralyticsの公式Swiftパッケージ「YOLO」を使えば、iPhoneアプリに驚くほど簡単に組み込むことができます。

![seg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7851ec29-ee94-40aa-a790-f5d104d4d8d5.gif)

# YOLOパッケージの3つの魅力

### 圧倒的なシンプルさ
たった数行のコードで、どんなYOLOモデルも利用可能。機械学習初心者でも迷わず使えます。

### セグメンテーションがリアルタイムで使える
物体の境界をピクセル単位でリアルタイムに検出し、マスク表示ができます。今までiPhoneで難しかったリアルタイムのセグメンテーションを簡単に実現。

### 公式・自作モデルどちらもOK
Ultralyticsの公式モデルだけでなく、自分で学習させたオリジナルのYOLOv11モデルも簡単に統合可能。

# 最短で動かす方法

### ① Swiftパッケージを追加

Xcodeで「File > Add Packages」から以下のURLを追加します。

https://github.com/ultralytics/yolo-ios-app.git

### ② YOLOv11モデルを用意する

公式モデルまたはカスタムモデルを用意し、CoreML形式（.mlmodel）でプロジェクトにドラッグ＆ドロップするだけ。

公式モデル：
https://github.com/ultralytics/yolo-ios-app/releases/tag/v8.3.0

カスタムモデルエクスポート：
https://docs.ultralytics.com/ja/integrations/coreml/

### ③ たった数行のコードで推論！

```swift
import YOLO

let model = try YOLO("yolo11n-seg",task: .segment) // Load model

let results = model(image) // # SwifUIImage, UIImage, CIImage, CGImage, bundle name, local path, remote URL
```

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/251543db-d7c1-488a-a364-777a77c4ae82.png width=300>

リアルタイム推論も非常に簡単です。

```swift
YOLOCamera(
    modelPathOrName: "yolo11n-seg",
    task: .segment,
    cameraPosition: .back
)
.ignoresSafeArea() // SwiftUIの推論カメラViewを初期化
```

これだけで、カメラ映像上でリアルタイムに物体セグメンテーションが実行されます。

こんな用途にぴったり

人や物体のリアルタイムマスク表示
スポーツやフィットネスアプリでの動作解析

ぜひ、このシンプルで強力なライブラリを使ってみてください！

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)