OmniAICreator/Qiita-1.07M huggingface dataset:
SNS侍の魅力と使い方を徹底解説

## 1. はじめに
近年、SNSを活用したマーケティングは企業にとって欠かせないものとなっています。そんな中、SNS管理ツール「SNS侍」が注目を集めています。本記事では、SNS侍の魅力や使い方、具体的な機能について詳しく解説します。SNS侍がなぜ多くの企業に選ばれているのか、その理由を明らかにします。

## 2. SNS侍の主な機能
SNS侍は、企業や個人がSNSの運用を効率化するための多機能ツールです。[インスタのフォロワーが購入できるSNS侍](https://maruwa-web.jp/products/instagram-followers-japanese)以下に、主要な機能を紹介します。

SNS管理ツールとしての役割
SNS侍は、複数のSNSアカウントを一元管理することができます。これにより、複数のプラットフォームにわたる投稿やコメントの管理が容易になります。

効果的な投稿のスケジューリング
SNS侍を利用することで、投稿のタイミングをあらかじめ設定することができます。これにより、最適な時間帯に投稿を行うことが可能となり、エンゲージメント率の向上が期待できます。

分析機能とレポート作成
SNS侍は、各SNSアカウントのパフォーマンスを詳細に分析する機能を備えています。フォロワーの増減、投稿の反応、エンゲージメント率などをレポートとして出力することができ、マーケティング戦略の見直しに役立ちます。

## 3. SNS侍の特長
SNS侍の特長を以下に挙げます。

使いやすいインターフェース
SNS侍は、初心者でも直感的に操作できるインターフェースを持っています。使いやすさを重視したデザインで、誰でも簡単に使いこなすことができます。

多機能ながら直感的な操作性
多機能でありながら、その操作は非常にシンプルです。複雑な設定や操作を必要とせず、必要な機能にすぐにアクセスできる点が評価されています。

他のSNS管理ツールとの比較
他のSNS管理ツールと比べても、SNS侍は機能の充実度と使いやすさで優れています。特に、スケジューリング機能や分析機能においては、他のツールよりも高い評価を受けています。

## 4. 実際の利用シーン
SNS侍は、様々な規模の企業や個人事業主に利用されています。以下に、具体的な利用シーンを紹介します。

中小企業や個人事業主の活用事例
SNS侍は、限られたリソースでSNS運用を効率化したい中小企業や個人事業主に最適です。例えば、小規模なオンラインショップでは、SNS侍を使って商品の紹介やキャンペーン情報を効果的に発信しています。

大企業のマーケティング部門での導入事例
大企業においても、SNS侍はマーケティング部門で活用されています。複数のSNSアカウントを一元管理し、統一感のあるブランド発信を実現するために利用されています。

## 5. SNS侍の料金プラン
SNS侍は、ユーザーのニーズに応じた複数の料金プランを提供しています。以下に、各プランの特徴を紹介します。

各プランの詳細と特徴
SNS侍には、無料プランから有料プランまで様々なプランがあります。無料プランでは基本的な機能が利用でき、有料プランではさらに高度な機能が追加されます。

コストパフォーマンスの評価
SNS侍の料金プランは、競合他社と比較してもコストパフォーマンスに優れています。特に、中小企業や個人事業主にとっては、手頃な価格で高機能なツールを利用できる点が魅力です。

## 6. クーポン情報とお得な使い方
SNS侍では、定期的にお得なクーポン情報が提供されています。以下に、最新のクーポン情報とその活用方法を紹介します。

最新のクーポン情報
現在、SNS侍では新規ユーザー向けの割引クーポンが提供されています。このクーポンを利用することで、初回契約時の費用を大幅に抑えることができます。

クーポンを利用した効果的な活用方法
クーポンを利用する際には、無料プランでまず基本的な機能を試し、その後有料プランに移行するのがおすすめです。クーポンを活用することで、よりお得に高度な機能を利用できます。

## 7. サポート体制とユーザーの声
SNS侍は、充実したサポート体制を整えています。以下に、サポート内容と実際のユーザーの声を紹介します。

サポート内容と対応速度
SNS侍のサポートチームは、迅速かつ丁寧に対応してくれます。困ったことがあれば、チャットやメールで迅速にサポートを受けることができます。

実際のユーザーのフィードバック
ユーザーからは「使いやすい」「サポートが充実している」といった高評価の声が多く寄せられています。特に、初心者でも簡単に使いこなせる点が評価されています。

## 8. まとめ
SNS侍は、SNS運用を効率化するための強力なツールです。その多機能さと使いやすさ、充実したサポート体制により、多くの企業や個人事業主に選ばれています。SNS侍を利用することで、SNSマーケティングの効果を最大化し、ビジネスの成長を加速させることができるでしょう。
AWS SSOを使用したECRへのログインとDockerイメージのプル方法


手順1: AWS SSOにログイン
```
aws sso login
```

手順2: ECRへのログイン
```
aws ecr get-login-password --profile <SSOプロファイル名> --region ap-northeast-1 | docker login --username AWS --password-stdin <AWSアカウントID> .dkr.ecr.ap-northeast-1.amazonaws.com
```

手順3: Dockerイメージのプル
```
docker pull <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/<ECRリポジトリ>

```
まとめ
これで、AWS SSOを使用してECRからDockerイメージをプルすることができるようになります。これらの手順を実行することで、セキュアにECRリポジトリへアクセスし、必要なDockerイメージを取得することができます。
Amazon VPC(Virtual Private Cloud)について勉強してみた

## 前提
- [SAA-C03](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)の資格取得勉強中
- 普段の業務では[Lambda](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)を使ってサーバーレスアプリケーションを開発
- 業務でインフラ構成図を書く機会があり、あまり触れてこなかったのでVPCについて勉強したのでまとめてみる

## Amazon VPCとは
> Amazon Virtual Private Cloud (Amazon VPC) とは、リソースの配置、接続性、セキュリティなど、仮想ネットワーク環境をフルで制御できるサービスです。
https://aws.amazon.com/jp/vpc/

> Amazon Virtual Private Cloud (Amazon VPC) を使用すると、論理的に隔離されている定義済みの仮想ネットワーク内で AWS リソースを起動できます。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/what-is-amazon-vpc.html

VPCとはクラウド上に作られる仮想ネットワークです。
ネットワーク上に、どんなリソースを置くか、どのネットワークと接続するか、接続に関する許可設定などを制御できます。

## 関係する機能
### サブネット
- VPCのIPアドレスの範囲
- ネットワークの中のネットワークのようなイメージ
- 1つのサブネットが複数のAZに跨って存在することはできません


![スクリーンショット 2024-08-07 12.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730913/a343212a-e4e8-6392-c0d5-efe065556047.png)

#### パブリックサブネット
- 直接インターネットへのアクセスが可能なサブネット
#### プライベートサブネット
- 直接インターネットへのアクセスができないサブネット

### ゲートウェイ
- VPCを別のネットワークに接続するもの
- 名前の通り、インターネットとVPC間の接続のために通る門、入り口のようなもの

#### インターネットゲートウェイ
- VPCとインターネットとの通信を可能にする
- パブリックサブネットに配置する
- パブリックサブネット内のリソースが、インターネットに接続できるようになる

![スクリーンショット 2024-08-07 12.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730913/2cfc3089-acec-9350-780c-52610f1f4da2.png)


#### NATゲートウェイ
- NAT(Network Address Translation)→ネットワークアドレス変換
- プライベートサブネット内のリソースがVPC外のインターネットに接続できるようになる

![スクリーンショット 2024-08-07 12.48.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730913/f354f553-b88a-9684-fef3-7680db5dcb56.png)


### ルートテーブル
- サブネット、ゲートウェイからのネットワークトラフィックを定義します
- VPC内のサブネット、ゲートウェイからどのネットワークに接続するかのルーティングを定義するものです

### VPCピアリング接続
- 2つのVPC間のネットワーク接続ができます
- 2つのVPCは別アカウント、別リージョンであっても接続可能です

![スクリーンショット 2024-08-07 12.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730913/287ccc88-ff6b-c314-a026-ece37e497123.png)

### Transit Gateway
- 複数のVPCやオンプレミスネットワークを相互接続可能にする、ハブのような役割をします

![スクリーンショット 2024-08-07 12.52.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730913/68336918-8ab7-7bfd-7927-6a2aeeca2002.png)


### VPCエンドポイント
- インターネットを経由することなく、VPC内のリソースとVPC外のリソースをプライベート接続することができます

![スクリーンショット 2024-08-07 12.38.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730913/8eab6622-4eef-f8b0-64c5-74a3757c22ca.png)

#### インターフェースエンドポイント
- VPC内にENI(Elastic Network Interface)が作成され、これを経由してVPC外のサービスに接続できます
- ENIはプライベートIPを持っています

#### ゲートウェイエンドポイント
- ルートテーブルにエンドポイントのルーティング設定を追加し、ゲートウェイを経由してVPC外のサービスに接続できます
- S3とDynamoDBへの接続のみ対応しています

## 参考にしたドキュメント
- https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/what-is-amazon-vpc.html
- https://aws.amazon.com/jp/vpc/
OSS Unity CatalogでGUIが提供されました！

以前、こちらでOSS版のUnity Catalogを動かしましたが、すべてがCLIでした。

https://qiita.com/taka_yayoi/items/4a9e191e0f85df5ab26b

https://qiita.com/taka_yayoi/items/c1d407c6ea45bbe39c02

そして、LinkedInのこちらの投稿でGUIがやってきたことに気づきました。

https://www.linkedin.com/posts/activity-7226591635902517250-gUuN?utm_source=share&utm_medium=member_desktop

こちらで公開されています。

https://github.com/unitycatalog/unitycatalog-ui

必要なのはNodeとYarnです。Macなので以下のコマンドでインストールします。

```sh
brew install node
brew install yarn
```

Unity Catalogサーバーを起動しておきます。

```sh
bin/start-uc-server
```

Yarnを起動します。

```sh
yarn
yarn start
```

少し待つとブラウザ上にGUIが表示されました！[カタログエクスプローラ](https://docs.databricks.com/ja/catalog-explorer/index.html)を踏襲しているようです。
![Screenshot 2024-08-07 at 12.42.50.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e3dc92fa-a268-14c2-e4bb-6f48da315784.jpeg)

テーブルスキーマを確認。
![Screenshot 2024-08-07 at 12.43.22.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b25fb2d5-432a-0514-6179-884e1d823f11.jpeg)

関数の詳細も確認できます。
![Screenshot 2024-08-07 at 12.43.44.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f8094530-6c6a-5d74-c0d5-ec2405888d36.jpeg)

まだ、基本的な機能のみなので今後のエンハンスに期待です！

### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Javaで「Matcherオブジェクトをリセットして位置情報をゼロへ戻す(Matcher.reset)」の動作を確認してみた

# 概要

Javaで「Matcherオブジェクトをリセットして位置情報をゼロへ戻す(Matcher.reset)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index29.html

# 実装

以下のファイルを作成しました。
```JSample29_1.java
import java.util.regex.*;

class JSample29_1{
  public static void main(String[] args){
    String regex  = "AA|BB|CC";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher("AA BB CC");
    if (m.find()){
      System.out.println(m.group());
    }

    if (m.find()){
      System.out.println(m.group());
    }

    m.reset();

    if (m.find()){
      System.out.println(m.group());  // AA
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample29_1.java 
$ java JSample29_1 
AA
BB
AA
```

# まとめ

何かの役に立てばと。
依存関係にあるJar内のパッケージ名を取得する

# やりたいこと  
あるプロジェクトが依存しているJarファイルは次のような構成をしていると仮定します。
```
com ─ sample ┰ hoge 
             └ fuga
```  
hogeパッケージとfugaパッケージの配下にはいくつかクラスがあります。今回はクラスについては関係ないので省略します。  

いま、com.sampleという入力に対して配下にあるパッケージ名を全て取得するような処理を作成したいです。  
つまり、例で言うならばcom.sample.hogeとcom.sample.fugaを`List<String>`で返却するメソッド`collectPackageNameFromJar(String rootPackage)`というメソッドを実装したい場面がありました。  

## サンプルプログラム  
```java
  public static List<String> collectPackageNameFromJar(String rootPath) {
    List<String> packages = new ArrayList<>();
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

    // 受け取ったルートパッケージ名の相対パスを取得
    URL root = classLoader.getResource(rootPath.replace('.', '/'));

    try (JarFile jarFile = ((JarURLConnection) root.openConnection()).getJarFile()) {
      Enumeration<JarEntry> entries = jarFile.entries();
      while (entries.hasMoreElements()) {
        JarEntry entry = entries.nextElement();
        if (entry.getName().endsWith(".class")) {
          String className = entry.getName().replace("/", ".").replace(".class", "");

          if (className.startsWith(rootPath + ".")) {
            // パッケージ名のみ取得する
            String packageName = className.substring(0, className.lastIndexOf('.'));
            if (!packages.contains(packageName)) {
              packages.add(packageName);
            }
          }
        }
      }
    } catch (IOException e) {
      // TODO 適切な例外処理を入れる
      e.printStackTrace();
    }
    return packages;
  }
```  

## 注意点
Jarファイル内から取得することを前提としているので、単純に自プロジェクト内のパッケージ取得には使えません。  
自プロジェクト内のパッケージ名から配下のパッケージ名を取得する場合はFileを使えば実装できます。
仮想通貨初心者が投資を学ぶためのWebメディア

ここでは仮想通貨投資におすすめの記事を紹介します。

Binance(バイナンス)の登録・口座開設方法｜やり方と開設できない原因・対処法も解説	https://www.dotmedia.co.jp/cryptocurrency/exchanges/binance/signup
Bitget(ビットゲット)の登録・口座開設方法｜やり方と開設できない原因・対処法も解説	https://www.dotmedia.co.jp/cryptocurrency/exchanges/bitget/signup
Bybit(バイビット)の登録・口座開設方法｜やり方と開設できない原因・対処法も解説	https://www.dotmedia.co.jp/cryptocurrency/exchanges/bybit/signup
Gate.ioの登録・口座開設方法｜やり方と開設できない原因・対処法も解説	https://www.dotmedia.co.jp/cryptocurrency/exchanges/gate-io/signup
MEXCの登録・口座開設方法｜やり方と開設できない原因・対処法も解説	https://www.dotmedia.co.jp/cryptocurrency/exchanges/mexc/signup
Zoomex(ズームエックス)の登録・口座開設方法｜やり方と開設できない原因・対処法も解説	https://www.dotmedia.co.jp/cryptocurrency/exchanges/zoomex/signup
仮想通貨(暗号資産)取引所 徹底比較	https://www.dotmedia.co.jp/cryptocurrency/exchanges
仮想通貨(暗号資産)取引所 海外 おすすめ比較ランキング	https://www.dotmedia.co.jp/cryptocurrency/ranking/overseas
仮想通貨(暗号資産)取引所 日本国内 おすすめ比較ランキング	https://www.dotmedia.co.jp/cryptocurrency/ranking/domestic
仮想通貨(暗号資産)取引所 手数料比較ランキング | 国内海外	https://www.dotmedia.co.jp/cryptocurrency/ranking/commission
仮想通貨(暗号資産)取引所 キャンペーン・ボーナス比較ランキング	https://www.dotmedia.co.jp/cryptocurrency/ranking/campaign-bonus
仮想通貨(暗号資産)取引所 FX・レバレッジ・先物取引 比較ランキング	https://www.dotmedia.co.jp/cryptocurrency/ranking/leverage
仮想通貨(暗号資産)取引所 セキュリティ・安全性 比較ランキング	https://www.dotmedia.co.jp/cryptocurrency/ranking/security
仮想通貨(暗号資産)取引所 スプレッド 比較ランキング	https://www.dotmedia.co.jp/cryptocurrency/ranking/spread
仮想通貨(暗号資産)取引所 スマホアプリ 比較ランキング	https://www.dotmedia.co.jp/cryptocurrency/ranking/smartphoneapp
仮想通貨(暗号資産)取引所 金融庁認可一覧	https://www.dotmedia.co.jp/cryptocurrency/ranking/financialservices
Alibaba CloudでCADT(Cloud Architect Design Tools)を使ってみる #3

# CADTの機能紹介

今回はCADTの目立った機能をいくつか紹介する。

## アーキテクチャのバージョン管理

アーキテクチャの変更履歴を図で比較したり、直前のバージョンへロールバックすることができる。

各バージョンにコメントを記録しておいたり、任意のバージョンをもとに新規作成することも可能だ。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/c580fd7e-a397-eede-c322-999668e71bfc.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/95cee9a6-5d6c-1373-92f6-9f27b4aa2a86.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/58625eee-6904-ac54-16e4-756643343f10.png)

## テンプレート

あらかじめ公式からテンプレートが提供されている。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/16a33237-6d18-2d55-061d-d9c6e99adb3c.png)

次は公式テンプレートの一例。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/ba3241cd-e512-74c8-c2f7-fc42929b4348.png)

さらにユーザー作成のApplicationもテンプレートとして他のユーザーへ共有することが可能となっている。

既存のアーキテクチャを複製し、アイデアや変更を即座に試すことができる。

## エクスポート

メニューバーの**Export**から図や資料を出力できる。

特に、ビジネスユーザーには役立つ機能だと思う。

- アーキテクチャ図(JPG)
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/a015e3ac-1929-85b5-fc85-154847ff01b5.png)

- デプロイのレポート(PDF)

  ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/65dd9c3a-f95c-335e-f21a-432bf0945c2a.png)

- 価格リスト(PDF)

  ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/620a566f-9bb4-2871-7d98-f9a5899cea8d.png)

- 見積もりシート(Excel)

  ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/7398bd94-273c-bfb4-913a-fed89ac2e509.png)

# CADTの使いどころ

**複雑で把握しづらいリソースの状況を図とともにわかりやすく表現できることに関しては優れている**と思う。

たとえば、チームでクラウドインフラについて話し合うとき、メンバー間の理解度の差を埋めるための**可視化ツールとして有用**かもしれない。画面共有で図やリソースの役割を解説しながらアイデアや課題を検討する、といった具合だ。

他、アーキテクチャの設計からコスト見積もりまでをスピーディかつ何度も繰り返せる点も良い。
個人的にはビジネス向けのレポート出力機能も推したい。

# まとめと雑感

学習コストを省いてクラウドの導入をすばやく容易にするというコンセプトは大変素晴らしい。
他社にはないAlibaba Cloud発の非常に面白いプロダクトだといえる。

今回は日本語での情報があまり見当たらなかったCADT(Cloud Architect Design Tools)にスポットを当てた。

Alibaba Cloudに触れるのはこれが初めてなので、ローカライズが不十分な点や慣れない管理コンソールの挙動に戸惑うことが多かった。

また、他社プラットフォームと比較してユーザーへの情報や事前の説明が不足しているように感じたが、こう思ってしまうのは自分が日本育ちだからかもしれない。仮に、多くの日本人を「自己解決志向」をするならば、中国の人たちは、わからないことはすぐ問い合わせる「即行動志向」の文化的背景が強い気がする。あくまで想像の話だが、Alibaba Cloudはユーザー向けコンテンツの拡充よりも ”充実したサポート体制の構築” を重視しているとして合点がいく。

特に印象深かったのは次の文言だ。管理コンソールのチャットボタンにカーソルを合わせると表示される。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/3a15c527-8cce-be63-1593-c3d4c5e7528a.png)

> **提案を大切にし、フィードバックを歓迎**
Alibaba Cloud は完璧ではありません。あなたの提案を歓迎し、大切にします。

なんてことない惹句のように思うかもしれないが、言葉遣いも含めて素敵だなと思った。
親身になって対応してくれそうかも、と安心感を抱く。とても好印象だ。

ひとまず、公式サイトで案内のあったDiscordサーバーには参加してみたりした(英語メインのため見る専)。
日本国内でも交流会やイベントなどが開催されているようで、[ユーザーコミュニティ](https://www.alieaters.com/)も存在するようだ。
Alibaba CloudでCADT(Cloud Architect Design Tools)を使ってみる #2

# CADT(Cloud Architect Design Tools)で既存のApplicationを編集してみる

前回はCADTでECSインスタンスを起動してみた。

単にECSインスタンスを立ち上げるだけでは外部からアクセスすることができないためEIP(パブリックIPアドレス)を追加してみる。
既存のApplicationを編集状態にして、**EIP** を図へドラッグする

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/e37a80d7-6742-1010-473e-cb51c27b7065.png)

LineでEIPとECSを紐づける

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/c390db78-a181-500f-8d69-436339cb0151.png)

**Save**して、

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/8857d3c4-35e3-0829-5f59-525d821a3f02.png)

一瞬で検証が完了する

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/7c50fb3a-f863-d094-12ce-2fba2db3bdc1.png)

追加でかかる費用の案内

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/6b08a8ef-898f-ea27-9c60-f15c823b218e.png)

ほんとわかりやすくていいよね

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/5c13dedf-b294-50de-4801-8a508dbaba51.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/45f090a3-16be-1e7b-c53b-bcf2a4ad1154.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/d5d0fa0a-7b92-6e46-3640-0d40f070d0a5.png)

あっという間にデプロイが完了した。

EIPが追加されていることがわかる

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/49f95342-2e1e-66f5-d526-9b4a93d5c395.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/68df26f1-4fa9-b2d9-f717-2d84156a1b5c.png)

ここでトップページへアクセスしてみる。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/84a77588-3eb3-df64-9903-3473bbd21d62.png)

地図上でリージョンを選択すると、画面右側からApplicationと各リソースのステータスを確認できる。

Deployedの一覧。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/340f051b-ce84-6d3c-9c21-5e271c6bac54.png)

# CADTでリソースの状況を把握する

デプロイ済みのApplication内では画面下部からリソースの詳細を確認したり、各リソースに対する操作を実行できる。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/2bcfd611-ce03-0b6d-a002-1ee0599e499b.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/28fc9114-b452-71c1-d559-66004bd381a1.png)

図へのマウスオーバーでリソースの詳細や状態が表示される。

また、リスト上で各リソースの **Locate** をクリックすると図のどの部分にあたるかが強調表示されるのでどこに何があるのかわかりやすい。
リソース名からは各リソースの管理コンソールに直で飛べるし、 **View Details** で詳細なパラメーターも取得できる。

ただ、操作メニューは未翻訳の部分が多い。ここは改善してもらえるとありがたい。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/edc93e46-5c9b-cdc7-ac98-6090abb3f395.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/737f81ea-358d-989d-6dff-554457b2527a.png)

ブラウザのページ翻訳でなんとか

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/973b4b43-e74c-65e0-f7e5-a489d6afa3e6.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/755b4141-5e8c-7106-1ad0-e6de263095b2.png)

一括操作系が多いみたいだ。
該当のリソースがなければ動かない項目もあるように見える。

次回はCADTの主要な機能を紹介したい。
Pythonでシンプルなパスワードジェネレータを作成する

# Pythonでシンプルなパスワードジェネレータを作成する

こんにちは！今回はPythonを使って、簡単にパスワードを生成するプログラムを作成してみましょう。

## 目的

セキュリティを強化するためには、強力なパスワードを使用することが重要です。このプログラムでは、ランダムな文字、数字、特殊文字を組み合わせたパスワードを簡単に生成できます。

## 必要なライブラリ

Pythonの標準ライブラリである`random`と`string`を使用しますので、特別なインストールは必要ありません。

## コードの説明

以下がパスワードジェネレータのコードです。

```python
import random
import string

def generate_password(length=12):
    # パスワードに使用する文字のセットを定義
    characters = string.ascii_letters + string.digits + string.punctuation
    
    # 指定された長さのランダムなパスワードを生成
    password = ''.join(random.choice(characters) for _ in range(length))
    
    return password

# パスワードを生成し、表示
password = generate_password(16)  # パスワードの長さを16文字に設定
print("Generated Password:", password)
```

### コードの詳細

1. `import random` と `import string`: ランダムな文字列を生成するために必要なライブラリです。
2. `generate_password` 関数: この関数は、指定された長さのパスワードを生成します。デフォルトの長さは12文字ですが、必要に応じて変更可能です。
3. `string.ascii_letters + string.digits + string.punctuation`: 大文字、小文字、数字、特殊文字を含む文字セットを定義しています。
4. `random.choice(characters)`: 指定された文字セットからランダムに文字を選びます。
5. `''.join(...)`: 選ばれた文字を連結して、1つのパスワード文字列として返します。

### パスワードの生成

パスワードを生成する際には、`generate_password()`関数を呼び出すだけです。デフォルトの設定では12文字のパスワードが生成されますが、例えば16文字のパスワードが必要な場合は以下のように呼び出します。

```python
password = generate_password(16)
print("Generated Password:", password)
```

これにより、16文字のパスワードが生成されます。

## まとめ

このプログラムを使えば、簡単に強力なパスワードを生成できます。セキュリティを意識した開発にぜひ活用してみてください！

この記事が参考になりましたら、ぜひ「いいね」やフォローをお願いします！コメントもお待ちしております。
(まとめ）スクラム入門: スクラム開発のガイド

# スクラム入門: スクラム開発のガイド
※初心者に説明するときに、まとめた方が楽だったのでまとめた。

## 0. 用語説明

#### プロダクトオーナー
- 製品の価値を最大化する責任を持つ人。
- 顧客のニーズを反映し、優先順位を設定する。

#### スクラムマスター
- スクラムのプロセスをサポートし、チームが効果的に働けるようにする人。

#### インクリメント
- スプリント終了時に完成する製品の一部。
- 動作可能な状態にある必要がある。


#### スプリント
- 固定された短期間（1～4週間）で、特定の目標を達成するための作業期間。


#### スプリントプランニング
- スプリントの開始時に行う計画会議。
- スプリントの目標とタスクを決定する。


#### デイリースクラム
- 毎日行う短いミーティング。
- 進捗状況を確認し、次の日の計画を立てる。


#### スプリントレビュー
- スプリント終了時に行うレビュー会議。
- 完成した作業を発表し、フィードバックを受ける。


#### スプリントレトロスペクティブ(ふりかえり)
- スプリント終了後の振り返り会議。
- プロセスの改善点を議論し、次のスプリントに向けてアクションを決める。


#### プロダクトバックログ
- 製品に必要な全ての機能や改善項目のリスト。プロダクトオーナーが管理する。


#### スプリントバックログ
- スプリント中に取り組むタスクのリスト。
- 開発チームが管理する。


#### クロスファンクショナル
- 開発チームが様々なスキルを持ち、多様なタスクを自律的にこなすことができる状態を指す。

## 1. スクラムの概要

- スクラムは、複雑な製品開発のプロセスを効率的に管理するためのフレームワークです。
- 主な目的は、チームが迅速に価値を提供し、変化に対応できるようにすることです。

## 2. スクラムチーム

スクラムチームは、次の3つの役割から構成されます。

### ①プロダクトオーナー
- プロダクトの価値を最大化する責任があります。
- プロダクトバックログを管理し、ステークホルダーと連携して優先順位を設定します。
  
### ②スクラムマスター
- スクラムプロセスの促進者であり、チームがスクラムの原則を遵守できるようサポートします。
- 障害を取り除き、チームの効率を向上させます。
  
### ③開発チーム
- プロダクトのインクリメントを作成するメンバーで構成されます。
- チームは自己組織化されており、クロスファンクショナルです。

## 3. スクラムイベント

- スクラムには、次の5つの公式イベントがあります。

### ①スプリント
- 1〜4週間の固定期間で、プロダクトのインクリメントを作成します。
- スプリント中には他のイベントが実施されます。
  
### ②スプリントプランニング 
- スプリントの開始時に行われる計画会議で、スプリントゴールとスプリントバックログを定義します。
  
### ③デイリースクラム
- 毎日15分程度の短いミーティングで、進捗状況を確認し、翌日の計画を立てます。
  
### ④スプリントレビュー
- スプリントの終了時に行われ、完成したインクリメントをステークホルダーに発表し、フィードバックを収集します。
  
### ⑤スプリントレトロスペクティブ
- スプリントの終了後に行われる振り返り会議で、プロセスの改善点を議論し、次のスプリントに向けたアクションを決定します。

## 4. スクラムアーティファクト

- スクラムには、次の3つの主要なアーティファクトがあります：

### ①プロダクトバックログ
- プロダクトに必要な全ての機能や改善項目のリストで、プロダクトオーナーが管理します。
  
### ②スプリントバックログ
- スプリント中に取り組むタスクのリストで、開発チームが管理します。
  
### ③インクリメント
- スプリントの終了時に完成するプロダクトの一部で、動作可能な状態にあることが求められます。

## 5. スクラムの価値

スクラムは次の5つの価値を重視します。

- **①コミットメント**
    - チームはスプリントゴールに対して責任を持ちます。
- **②フォーカス**
    - チームは最も重要な作業に集中します。
- **③オープンネス**
    - チームは進捗状況や問題点を透明にします。
- **④リスペクト**
    - チームメンバーは互いを尊重し、各自の能力を信頼します。
- **⑤カレッジ**
    - チームは困難な課題に立ち向かい、リスクを取る勇気を持ちます。


## 6. おわりに
* 世の中には銀の弾丸はありません。スクラムも万能ではありません。ただの手段（フレーム）に過ぎません。導入したからと言って勝手に善くなるものでは決してありません。
* 個人的な感覚として、スクラムは「問題を露呈させる」フレームワークであるため、必ず痛みが伴います。
    * しかしその痛みは"プロダクトやチームを前進する糧" に間違いなくなります。
* スクラムを導入することで、チームの協力と効率を向上させ、世の中の誰かに価値を迅速に提供していきましょう。
既存Next.jsプロジェクトにTypeScriptを導入する方法

## アジェンダ
既存プロジェクトにTypeScriptを導入する方法を簡単にまとめます。今回は、Next.js、 JavaScriptの既存プロジェクトがあることを前提にいたします。

## 手順
### 1. TypeScriptと必要なパッケージのインストール

次に、TypeScriptとその型定義ファイルをインストールします。

```zsh
npm install --save-dev typescript @types/react @types/node
```

### 2. TypeScriptファイルの作成

`tsconfig.json`ファイルをプロジェクトのルートディレクトリに作成します。Next.jsはこのファイルが存在することを検出すると、自動的にTypeScriptサポートを有効にします。

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
  "exclude": ["node_modules"]
}
```

また、プロジェクトのルートディレクトリに`next-env.d.ts`ファイルを作成します。

```ts
/// <reference types="next" />
/// <reference types="next/types/global" />
```

### 3. TypeScriptにファイルを変換

既存のJavaScriptファイル（.js）をTypeScriptファイル（.ts または .tsx）に変換します。例えば、`pages/index.js`を`pages/index.tsx`にリネームします。

### 4. TypeScript設定の微調整

必要に応じて`tsconfig.json`ファイルの設定を調整します。`strict`モードを無効にするなど、プロジェクトのニーズに応じて変更できます。

### 5. プロジェクトの実行

TypeScriptの設定が正しく行われたことを確認するために、プロジェクトを実行します。

```bash
npm run dev
```

エラーが発生しないことを確認してください。

## まとめ

Next.jsプロジェクトにTypeScriptを導入するには、TypeScriptと型定義ファイルをインストールし、`tsconfig.json`ファイルと`next-env.d.ts`ファイルを設定するだけです。これにより、TypeScriptを使用した型安全な開発が可能になります。
ai動画編集一連の流れ

個人的メモ随時追加していきます。

windows版だと、

run_windows_human.bat をダブルクリックして起動するだけ。

photosフォルダとmoviesフォルダは自分で作成

```
python inference.py -s photos/s42.jpg -d movies/d3.mp4 --no_flag_pasteback

```

切り抜き無し

```
python inference.py -s photos/s42.jpg -d movies/d3.mp4 --no-flag-do-crop --no_flag_pasteback
```

エラーが出た場合は

```
pip install pykalman
pip install -r requirements.txt
```

これでいける

# まとめて処理

・moviesフォルダのd3.mp4を元に
・photosフォルダの女の子全員の表情を変更したものを作成したい

以下のファイルを作成

```process_photos.ps1

# フォルダパスを指定
$photosFolder = "photos"
$outputFolder = "movies"

# 出力フォルダが存在しない場合は作成
if (-not (Test-Path -Path $outputFolder)) {
    New-Item -ItemType Directory -Path $outputFolder
}

# 指定したフォルダ内のすべての写真ファイルを取得
Get-ChildItem -Path $photosFolder -Filter * | ForEach-Object {
    $photo = $_.FullName      # 現在の写真ファイルのフルパス
    $baseName = $_.BaseName   # ファイル名（拡張子なし）

    # 出力ファイル名を生成 (例: movies/s42.mp4)
    $outputFile = "$outputFolder\$baseName.mp4"

    # inference.py を実行
    python inference.py -s $photo -d movies/d3.mp4 --no_flag_pasteback
}

```

powershellで実行


```
.\process_photos.ps1
```

これでphotosフォルダにある女の子の動画を連続して生成し、
animationsフォルダに保存することができる。






---


powershellを起動して

動画を生成

```
cd C:\Users\h\liveport\liveportraitmonitor
python inference_org.py -s assets/examples/source/hage.jpg -d assets/examples/driving/d3.mp4 --no_flag_pasteback
```

liveport
```

.\venv\Scripts\activate

venv で入って
PS C:\Users\h\flp3> py -3.10 app.py
```

これでwebサーバーを起動できる。

カメラを使う絶対パス

```
(venv) PS C:\Users\h\flp3> py -3.10 run.py --src_image C:\Users\h\flp3\ryouko.jpg --realtime --dri_video 0
```

音声生成

```
cd C:\Users\h\vallex\VALL-E-X
```
【ChatGPT＋Code Interpreter】で文章が波打つアニメGIFを作成します。


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

　今回は、文章が波打つアニメGIFを作成します。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::

　まずは、ニュース。

　ChatGPT で
　　不具合が発生しています。
　　　2024/08/07の10:30ぐらいから
　　　　でしょうか。

　Code Interpreterで
　　ダウンロードしようとすると、
　　　リンクが表示されない。

　記述はされていたので、
　　その後の表示が
　　　うまくいっていないようです。

　過去のセッションの
　　ダウンロードリンクも
　　　表示されなくなっています。

　GPT-4oとGPT-4と無料版で確認。

　記事の検証が
　　できないよう😭

　この記事は
　　すでに書いたあとですけど。
***
　さて、本題です。

　今回は、
　　文字列を波打たせたい
　　　と思います。

　文字が上下して
　　少しズラして、
　　　次の文字を上下させる。
　　　　それを文章全体で行ないます。

　出来上がりがこちら。
![wavy_text (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/5242b9fc-5c9b-5ab7-13f7-37a6522f3d82.gif)


　Promptがこちらです。
```Text:
CodeInterpreterで、白い正方形（512×512）の中央に、“I am a ChatGPT.”という文章を黒色で、フォントサイズを48で、文字列を文字が波を打つようにアニメGIFを作成してください。
コードは不要です。
指示に不明な点があれば質問してください。
```
　主な部分は
　　“文字列を文字が波を打つように”
　　　のところですね。

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

　今回は、ここまで。
Microsoft Graph API を Graph Client Service を利用せずに GET PUT POST を実行する（C#）～認証の取得編～

## 1. はじめに

Microsoft Graph API は、MSの公式ドキュメントを読むと、ほとんど Graph Client Service を使ってAPIを実行しています。  
しかし、私はある事情でGraph Client Service を利用できませんでした。  
従って、HttpClient を使用してAPIを実行したので、この方法についてご紹介します。
なお、デスクトップアプリ開発を想定しており、言語はC#です。

## 2. 認証の取得の実装

apiの実行について、今回は GET PUT POST の３つのリクエストを紹介しますが、そのどれにも必要なのが認証トークンの取得です。  
ということで認証トークンの取得から説明していきます。

ただ、認証の取得といっても様々な認証の取得方法があります。
今回は対話型の認証方法を実施します。
※認証の種類については[こちら](https://learn.microsoft.com/ja-jp/graph/sdks/choose-authentication-providers?tabs=csharp)を参照ください。

### 2.1. アプリケーションの生成

認証には以下の情報が必要です。  
 - アプリケーションId
 - テナントId
 - 認証スコープ
 - 認証インスタンス

ただこれらの情報の取得には、Azureのアプリの登録が必要になりますので、Azureの登録方法について知りたい方は、[こちら](https://qiita.com/Takuma_Kondo/items/3746c67b0b4f01f4e42f)の記事をご覧ください。

今回は認証を行うサービスクラスを実装します。
まずはコンストラクタでアプリケーションの生成をします。
```C#
// 認証のサービスクラス
public AuthenticationService(string applicationId, string tenantId)
{
    // アプリケーションの生成
    var builder = PublicClientApplicationBuilder.Create(applicationId)
        .WithAuthority($"{c_Instance}{tenantId}")
        .WithDefaultRedirectUri();
    m_App = builder.Build();

    // キャッシュの有効化
    TokenCacheHelper.EnableSerialization(m_App.UserTokenCache);
}
```

ここで、キャッシュの有効化を TokenCacheHelper でしています。
今回は対話型のフローを使用しているため、キャッシュの有効化をしておけば、何度も認証を実施する必要がなくなります。

### 2.2. 認証トークンの取得

では実際に認証トークンを取得します。

```C#
// 認証の取得
public async Task<AuthenticationResult> AcquireTokenAsync()
{
    var accounts = await m_App.GetAccountsAsync();
    var firstAccount = accounts.FirstOrDefault();

    // 認証トークンの取得
    // サイレント認証を試行し、失敗した場合にインタラクティブ認証を試行する
    AuthenticationResult? authResult = null;
    try
    {
        authResult = await m_App.AcquireTokenSilent(c_Scopes, firstAccount)
            .ExecuteAsync();
    }
    catch
    {
        try
        {
            authResult = await m_App.AcquireTokenInteractive(c_Scopes)
                .WithAccount(firstAccount)
                .WithPrompt(Prompt.SelectAccount)
                .ExecuteAsync();
        }
        catch
        {
            // 失敗
        }
    }

    return authResult;
}
```

今回の例では、キャッシュを有効化しているため、はじめにサイレント認証、つまりキャッシュを用いて認証を取得します。  
キャッシュがなかった場合に、対話型の認証を実施します。  

上記のメソッドで認証を取得することができました。  
ただGET PUT POSTには認証トークンが必要になります。  
従って、先ほど取得した認証から認証トークンを取得します。
```C#
var token = authResult.AccessToken;
```
これで完了です。

## 終わり

これで認証トークン取得は完了です。
後はこれを用いて、GET PUT POSTを実行します。

この続きは以下の記事をご覧ください
[Microsoft Graph API を Graph Client Service を利用せずに GET PUT POST をHTTPで実行する（C#）](https://qiita.com/Takuma_Kondo/items/8102977024231d33fdb1)
【VBA】ファイル作成マクロ

# ファイル作成マクロの作成方法について

VBA (Visual Basic for Applications) を使って新しいファイルを作成するマクロを作成するのは比較的簡単です。以下は、Excel VBA を使って新しい Excel ワークブックを作成し、指定したパスに保存するサンプルコードです。

```vb:CreateNewWorkbook
Sub CreateNewWorkbook()
    Dim newWorkbook As Workbook
    Dim filePath As String
    
    ' 新しい Excel ワークブックを作成
    Set newWorkbook = Workbooks.Add
    
    ' 保存先のパスとファイル名を指定
    filePath = "C:\Path\To\Your\Directory\NewFile.xlsx"
    
    ' 新しいワークブックを指定したパスに保存
    newWorkbook.SaveAs filePath
    
    ' 新しいワークブックを閉じる
    newWorkbook.Close
    
    ' 変数のクリア
    Set newWorkbook = Nothing
    
    ' メッセージボックスで完了を通知
    MsgBox "新しいワークブックが作成され、保存されました。", vbInformation
End Sub
```

### コードの説明

1. `Dim newWorkbook As Workbook`  
   新しいワークブックを格納するための変数を宣言します。

2. `Set newWorkbook = Workbooks.Add`  
   新しいワークブックを作成して変数にセットします。

3. `filePath = "C:\Path\To\Your\Directory\NewFile.xlsx"`  
   新しいファイルの保存先とファイル名を指定します。自分の環境に合わせてパスとファイル名を変更してください。

4. `newWorkbook.SaveAs filePath`  
   指定したパスに新しいワークブックを保存します。

5. `newWorkbook.Close`  
   ワークブックを閉じます。

6. `Set newWorkbook = Nothing`  
   変数をクリアして、リソースを解放します。

7. `MsgBox "新しいワークブックが作成され、保存されました。", vbInformation`  
   完了を知らせるメッセージボックスを表示します。

### 他のファイルタイプの作成

もし Excel 以外のファイルタイプ（例えばテキストファイル）を作成したい場合は、`FileSystemObject` を使って以下のように書き換えます：

```vba
Sub CreateNewTextFile()
    Dim fso As Object
    Dim file As Object
    Dim filePath As String
    
    ' FileSystemObject を作成
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    ' 新しいテキストファイルのパスを指定
    filePath = "C:\Path\To\Your\Directory\NewFile.txt"
    
    ' テキストファイルを作成
    Set file = fso.CreateTextFile(filePath, True)
    
    ' テキストファイルに書き込む内容
    file.WriteLine "Hello, World!"
    
    ' テキストファイルを閉じる
    file.Close
    
    ' 変数のクリア
    Set file = Nothing
    Set fso = Nothing
    
    ' メッセージボックスで完了を通知
    MsgBox "新しいテキストファイルが作成されました。", vbInformation
End Sub
```

このコードは、指定されたパスに新しいテキストファイルを作成し、"Hello, World!" と書き込みます。

必要に応じてコードを調整し、目的に合わせてファイルを作成してみてください。
Laravel Viteでphp側からvueにimport.meta.url経由でクエリパラメータを渡す

## `import.meta.url` 
モジュールの場合、`import.meta`オブジェクトを使用して自身のメタ情報にアクセスできる。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/import.meta

そのため、
```html
<script type="module" src="app.js?someURLInfo=5"></script>
```
このとき、app.js内では`import.meta.url`で自身のURLをクエリパラメータやハッシュ付きで取得することができる。
つまり、
```js
new URL(import.meta.url).searchParams.get('someURLInfo') // '5';
```
のようにしてクエリパラメータ経由で値を渡すことができる。

## Laravel Viteでの利用

さて、Laravel Viteでこれを利用しようと思うと、jsの読み込みは
```php
@vite('resources/js/app.js')
```
のように書くので
```php
@vite('resources/js/app.js?someURLInfo=5')
```
とすれば良さそうだが、これでは上手く行かない。
正確には、`npm run dev`で開発サーバを起動してローカルで開発する分には動くが、`npm run build`を実行して本番にデプロイすると生成されたjsファイルの参照に失敗して500エラーになる。

そこでLaravelのドキュメントを読むと、Viteプラグインには高度なカスタマイズとしてパスの値を変更する`createAssetPathsUsing`というメソッドが用意されているようだ。

https://readouble.com/laravel/11.x/ja/vite.html#advanced-customization

つまりこう書けば良いらしい。
```php
    {{
        Vite::withEntryPoints(['resources/js/app.js'])
            ->createAssetPathsUsing(function (string $path, ?bool $secure) {
                return "/{$path}?someURLInfo=5";
            })
    }}
```
ところが、これはこれで今度は本番では上手く動くが`npm run dev`で開発サーバを起動してローカルで開発しようとすると`createAssetPathsUsing`で設定した事が無視されてしまい上手く行かない。

しかし裏を返せば片方は本番で上手く動き、片方は開発サーバで上手く動く訳だから、両方を組み合わせれば良さそうだ。そのためには開発サーバを起動して開発中なのかどうかが判別出来れば良い。
ドキュメントを読むと幸いViteクラスにはそのようなメソッドが用意されている。
`isRunningHot`がそれだ。

https://laravel.com/api/11.x/Illuminate/Support/Facades/Vite.html#method_isRunningHot

つまりこうだ。
## TL;DR
```php:index.blade.php
// Viteのエイリアスを設定しておくこと
// 'Vite' => \Illuminate\Support\Facades\Vite::class,
@if(Vite::isRunningHot())
@vite('resources/js/app.js?someURLInfo=5')
@else
    {{
        Vite::withEntryPoints(['resources/js/app.js'])
            ->createAssetPathsUsing(function (string $path, ?bool $secure) {
                return "/{$path}?someURLInfo=5";
            })
    }}
@endif
```
スクラム（Scrum）においての、スパイク（Spike）について要約した

## スパイクについて要約した
* ※初心者に説明する際に使用した。
* 要約しないものが正なので、詳細はそっちをご参照ください。
  * https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf 

### スパイクとは
* エクストリームプログラミング（XP）の発明
* 技術的アプローチのリスクを減らすための特別なユーザーストーリー
* 必要条件をよりよく理解するために使用
* ストーリー推定の信頼性を高めるための知識を得るために使用
* スプリントの最大タイムボックスサイズを持つ
* スプリントの最後に実行されるかどうかが決定される

### スパイクの利点
* リスクを早期に軽減する
* チームがフィードバックを確認できる
* 今後予定されているPBIの複雑さについて理解を深める

### スパイクを使用する場面
* チームがストーリーを完成させる自信がない場合
  * 潜在的なブロッカーのために
* プロダクトオーナーが構築する必要があるものと、その方法を判断するために投資として見なす
* プロダクトオーナーがチームのキャパシティの一部を割り当てる
  * ストーリーがスプリントになったときに何をすべきかを知るため

### スパイクが使用される例
* チームが新技術についての知識を持っていない場合
  * 新技術の実現可能性を確実にするための基礎研究
* ストーリーが不十分に書かれたAPIを持つサードパーティのライブラリを使用する必要がある場合
* ストーリーに重大な技術的リスクが含まれる場合
  * 将来のタイムボックスにユーザーストーリーを反映させる技術的アプローチに自信を得るために、実験またはプロトタイプを作成する必要がある
【VBA】セルの値からシートを追加するマクロ

VBAでシートを作成するマクロを作りたいと思い作ってみた。

以下にそのサンプルコードを示します。
```vb:CreateSheetsFromA1Values
Sub CreateSheetsFromA1Values()
    Dim ws As Worksheet
    Dim newSheet As Worksheet
    Dim cell As Range
    Dim lastRow As Long
    Dim sheetName As String

    ' 作業中のシートを設定
    Set ws = ThisWorkbook.Sheets("Sheet1") ' ここで"Sheet1"を対象シート名に変更してください

    ' A列の最終行を取得
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    ' A1から最終行までのセルをループ
    For Each cell In ws.Range("A1:A" & lastRow)
        sheetName = cell.Value

        ' シート名が空でないことを確認
        If Len(sheetName) > 0 Then
            ' シート名の重複をチェック
            On Error Resume Next
            Set newSheet = ThisWorkbook.Sheets(sheetName)
            On Error GoTo 0

            ' すでに同名のシートが存在しない場合に新規作成
            If newSheet Is Nothing Then
                ' 新しいシートを追加して名前を変更
                ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)).Name = sheetName
            End If

            ' 変数をリセット
            Set newSheet = Nothing
        End If
    Next cell
End Sub
```
# 説明:
1. 対象シートの設定: Set ws = ThisWorkbook.Sheets("Sheet1") で対象となるシートを指定します。ここで "Sheet1" を対象シート名に変更してください。
2. 最終行の取得: lastRow でA列の最終行を取得します。
3. ループ処理: For Each cell In ws.Range("A1:A" & lastRow) でA1から最終行までのセルをループします。
4. シート名のチェック: If Len(sheetName) > 0 でシート名が空でないことを確認します。
5. シート名の重複チェック: すでに同じ名前のシートが存在しないかを確認し、存在しない場合には新しいシートを作成してその名前にします。

# まとめ
このマクロを実行することで、指定されたシートにA1から最終行までのセルの値を名前にした新しいシートが作成されます。シート名がすでに存在する場合はスキップされます。
AI議事録作成サービス「Tactiq」で作業コストを軽減する

:::note info
本記事は、VR法人HIKKYのorganization下のQiita/Zenn両方に投稿しております。
:::

# はじめに
皆さんは、議事録を取ったり読んだりした経験はありますでしょうか？
ITに会議は付きものなので、ほとんどの方が触れていると思います。

ただ会議の頻度が高いと、逐一議事録を取るのも大変なため、議事録の書かれない会議も存在してきます。

しかし議事録が存在しないと、会議参加者はどういう発言経緯で結論に至ったかを忘れてしまう場合もあります。
そして会議に参加していない人間が後日、会議の流れを確認したくてもできません。

弊社でも同じような悩みがあり、「議事録作成の作業コストを軽減できないか？」と探して出会ったのが「AI議事録」でした。

# AI議事録とは？
近年ChatGPTなどAIの発展が目覚ましいですが、このAIの力で発言を書き起こしさせ、要約まで行わせて議事録化するのがAI議事録の機能となります。

弊社のように社員がほぼリモートワークの場合、会議というのは必然的にオンラインです。
そのため、オンラインの会議から議事録の書き起こしを行ってくれるAI議事録を探していました。
## AI議事録作成サービス「Tactiq」

![スクリーンショット 2024-08-01 015856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/4c19b93e-eed4-3379-009e-1c4766ffc6bb.png)
[公式サイト](https://tactiq.io/)

AI議事録に関するサービスは数多く提供されていますが、私が実際に複数のサービスを試したうえで「これは良い！」と感じたのがこの「Tactiq」です。
「会議を行う人間に負担をかけず、議事録を着実に記録し、会議の要約とアクションアイテムの自動作成を行う」という、まさに人間の負担を代替わりしてくれるAIの理想的な立ち位置だと思っています。

## Tactiqの使い方
[公式サイト](https://tactiq.io/)でTactiqのアカウント登録をしたあと、ChromeにTactiqの拡張機能を入れます。

![スクリーンショット 2024-08-01 021737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/fa4e7274-e8ac-8aa9-a14f-284e97776195.png)

拡張機能にTactiqのアカウントでログインすれば、あとはChrome上でビデオ会議ツール（ZoomやGoogle Meetなど）に入室するたび自動的にTactiqが動作し、発言の書き起こしを行ってくれます（画面右にあるウインドウがTactiqです）。

![スクリーンショット 2024-08-01 022258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23925/a29845f2-e1c7-0b26-f25d-9f1d5e6a2fd4.png)

会議が終われば自動的にTactiqのサイトに保存されます。
ここにはリアルタイムで記録されているので、途中退室した場合でも抜けるまでの分は記録されています。
![スクリーンショット 2024-08-01 022720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/96acc2cf-3e37-e425-2222-f03529e69bdb.png)

AI機能が要約した会議はどのレベルなのかお見せしたい…のですが、会議内容は弊社の機密情報であるため、ここには貼れません。
しかし「驚くほど的確に」内容を理解して纏めてくれるので、皆さんも試してみて下さい（無料で始められます）。
また、録音や録画データからも議事録を作成してくれるのですが、こちらもリアルタイムには劣るものの、かなり精度がいい議事録を書き起こしてくれます。
（ただしオンライン会議ツールから書き起こすのと違って発言者がわからないので、ハキハキと喋らないと発言者の名前がおかしくなると思います）。

# AI議事録を使ってみて変わったこと
弊社ではまだAI議事録については調査段階であり、本格導入しているわけでは有りません。
以下は私がこ3ヶ月ほど実際の会議で使用してみて起こった変化なのですが、「会議の全ての発言内容が書き起こされている」うえに「要約から発言に飛ぶことも容易」であるため、定期的に行われる会議が始まる前には「必ずTactiqで前回の議事録を読む」というクセが付きました。

何より会議が発生すれば自動的にTactiqが書き起こしてくれるので、「Tactiqが議事録を必ず取ってくれる安心感」というものを強く感じます。

# 終わりに
AI議事録の所感をまとめると以下となります。

**・会議が始めれば自動的に記録してくれるという安心感と利便性がある**
**・情報が確実に残されるので、会議の参加者にも参加していない人間にも共有しやすい**
**・人的コストが非常に低い**

AI議事録を使ってみて、これまで人的負担により、議事録がうまく取られていないために起こっている問題が多いという事が浮き彫りになったように感じています（弊社に限らない話かと思いますが）。
今後は、この便利なツールを具体的にどう業務に取り込んでいくのかが課題です。

ここまでお読みいただきまして、まことにありがとうございました。
package-lock.json の改行方式とインデントは package.json から推測されて設定される

# 背景
prettier や `.editorconfig` を導入していた時、`package-lock.json` のインデントが npm のデフォルトの挙動の 2 から 4 に変わってしまい、`npm install` で再生成しても 4 のままだったのでちょっと調べた。

# 原因
https://docs.npmjs.com/cli/v10/configuring-npm/package-lock-json#description
> When `npm` creates or updates `package-lock.json`, it will infer line endings and indentation from `package.json` so that the formatting of both files matches.

より、package-lock.json の改行とインデントは package.json から推論されて設定される。

今回、prettier で一度 `package.json` のインデントを 4 に書き換えてしまったため、`package-lock.json` のインデントも 4 に設定されたようである。

`package.json` のインデントを 2 に変更して再度 `package-lock.json` を生成したところ、2 に戻った。

# 対応
`.prettierignore` で `package-lock.json` は無視する。
```.prettierignore
# Ignore package-lock.json
package-lock.json
```

もし、プロジェクトの基本のインデント幅が 4 なら prettier の設定で `package.json` の `tabWidth` を2にオーバーライドしておく。
参考：https://prettier.io/docs/en/configuration#configuration-overrides

```js: prettier.config.js
    overrides: [
        files: "package.json",
        options: {
            tabWidth: 2
        }
    ]
```

:::note warn
prettier の 2017年ごろのIssue [package.json 2+ spacing / tabs #3533](https://github.com/prettier/prettier/issues/3533) では、`package.json` は `.prettierignore` で無視したほうがよい、という議論もある。

→ npm バージョン 5 未満では インデント幅 2 以外は使用できなかったり、npm/yarn 間でフォーマットが異なる、のこと。

前者は現在(2024年時点)では殆ど気にしなくて良さそう。後者については yarn の Issue [Package.json indent #1091](https://github.com/yarnpkg/yarn/issues/1091) で、package.json のインデントを検出し変更しないようにする修正が入っているため、こちらも気にしなくて良さそう。

package.json のインデント以外のスタイルを統一するためのにも、個人的には overrides のメリットが大きいと考える。
:::
Qiita上でUMLを描く方法 -PlantUMLとmermaid-

## PlantUML
三点ダッシュの後ろにplantumlの文字を置き、`@startuml`,`@enduml`の間にコードを書くと表示される。
~~~
```plantuml
@startuml
@enduml
```
~~~

PlantUMLのCheatSheetは以下の記事に詳しく書かれている。

https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48

以下は試した結果。
```plantuml
@startuml

actor Entrant

Entrant -> Ticket : Attend Event Request

activate Ticket
Ticket -> Member : Create Member Request

activate Member
Member -> Member : Create Member
Ticket <-- Member : Create Member Response
deactivate Member

Ticket -> Ticket : Create Ticket
Entrant <-- Ticket : Attend Event Response
deactivate Ticket

@enduml
```

## mermaid
三点ダッシュの後ろにmermaidの文字を置き、コードを書くと表示される。
~~~
```mermaid
```
~~~

以下は試した結果。
```mermaid
sequenceDiagram
    participant ユーザー
    participant ブラウザ
    participant データベース
    ユーザー->>ブラウザ:ログインする
    ブラウザ->>データベース:会員情報を照合
    データベース-->>ブラウザ:結果
```

## 引用
https://qiita.com/ker38c/items/c51b780aeb6665a8a974

https://qiita.com/espritfort_tech/items/bf30c88ad5638d7be622
ODBC接続に必要な接続文字列を取得する

# 目的
プログラムからデータベースに接続する際、接続文字列を設定する必要があります。接続文字列は接続方法やRDBMS（OracleやPostgreSQL等）によって微妙に異なったりします。
ネットで調べると接続文字列の定型文が出てきたりしますが、間違っていたり情報が不足していたりする場合があるので**自分のPC・環境で適切な接続文字列を取得する方法**をここに記録しておこうと思います。
今回はあくまでも**ODBC接続の場合**ですのでご注意を。

# DSNファイルを作成して接続文字列のサンプルを取得する
1. まず初めに **ODBCデータソースアドミニストレーター** を起動します。32bitと64bitの2つがあるので適切な方を選んでください。（接続に使用するプログラムやソフトに合わせる）

1. 起動ができたら**ファイルDSN**を選択して`追加`をクリックします。

1. `データソースの新規作成`で使用するデータソースのドライバーを選択してください。選択したら[次へ]で進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303641/d042818c-53e7-6324-2229-57e0b397371a.png)


1. ファイルを出力する場所を聞かれるので適当な場所にDSNファイルを出力します。指定出来たら`次へ`で進んで`完了`をクリック。

1. 接続情報を入力する画面が開くので入力する。（接続可能な正しい接続情報を入力しないと、この後で接続文字列を得られない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1303641/ac7c3ea7-ee80-ab34-7b79-45d7baf15500.png)


1. 出力されたDSNファイルをメモ帳等で開いてください。
(一部を`*`と`X`で伏字にしています)

``` :DNSファイル（Oracleの場合）
[ODBC]
DRIVER=[ドライバー名]
UID=[ユーザー名]
LPS=XXXX
AST=FLOAT
TSZ=XXXX
STE=*
ODA=*
MLD=X
TLO=*
FBS=XXXXX
FWC=*
CSR=*
MDI=**
MTS=*
DPM=*
NUM=***
BAM=IfAllSuccessful
BNF=*
BTD=*
RST=*
LOB=*
FDL=XX
FRC=XX
QTO=*
FEN=*
XSM=Default
EXC=*
APA=*
DBA=*
DBQ=[データベース名]
SERVER=[サーバー名]
```
<details><summary>PostgreSQLの場合</summary>

```:DNSファイル（PostgreSQLの場合）
[ODBC]
DRIVER=[ドライバー名]
UID=****
XaOpt=X
FetchRefcursors=X
OptionalErrors=X
D6=-XXX
LowerCaseIdentifier=X
UseServerSidePrepare=X
ByteaAsLongVarBinary=X
BI=X
TrueIsMinus1=X
UpdatableCursors=X
LFConversion=X
ExtraSysTablePrefixes=
Parse=X
BoolsAsChar=X
UnknownsAsLongVarchar=X
TextAsLongVarchar=X
UseDeclareFetch=X
CommLog=X
Debug=X
MaxLongVarcharSize=XXXX
MaxVarcharSize=XXX
UnknownSizes=X
Fetch=XXX
ShowSystemTables=X
RowVersioning=X
ShowOidColumn=X
FakeOidIndex=X
Protocol=X.X
ReadOnly=X
SSLmode=disable
PORT=5432
SERVER=[サーバー名]
DATABASE=[データベース名]
```
</details>

# DSNファイルを参考に接続文字列を組み立てる
DSNファイルを参考に実際に使用する接続文字列を組み立てます。
一応、DSNファイル内の記述を全て使用しても接続できるのですが、無駄が多いので必要最低限のものだけをピックアップします。

ピックアップする項目は
- `DRIVER` 
- `UID` 
- `DBQ` もしくは `DATABASE` 
- `SERVER` 

の4つです。
実際に接続文字列を組み立てる時は、さらに`PWD`も加えます。（パスワードなのでセキュリティ上の都合かDSNファイルには記述されていない）

他のRDBMSでもこれに当たるものをピックアップすれば良いでしょう。

# 組み立てた接続文字列

以上のことから組み立てた実際の接続文字列は以下のようになります。

``` :接続文字列（Oracleの場合）
DRIVER=[ドライバー名];SERVER=[サーバー名];DBQ=[データベース名];UID=[ユーザー名];PWD=[パスワード];
```

``` :接続文字列（PostgreSQLの場合）
DRIVER=[ドライバー名];SERVER=[サーバー名];DATABASE=[データベース名];UID=[ユーザー名];PWD=[パスワード];
```
セミコロン`;`で値を区切るのを忘れないようにしましょう。

# 参考資料
https://learn.microsoft.com/ja-jp/sql/integration-services/import-export-data/connect-to-an-odbc-data-source-sql-server-import-and-export-wizard?view=sql-server-ver16
Polacodeの使用方法

## アジェンダ

Polacodeは、VS Codeの拡張機能で、綺麗なコードスニペットを作成するために使用されます。
その使用方法について簡単にまとめます。

## Polacodeの使用方法

1. **Polacodeを開く**  
   インストールが完了したら、コマンドパレット（`Ctrl+Shift+P` または `Cmd+Shift+P`）を開き、「Polacode」を検索し、「Polacode: Open」を選択します。

2. **コードをコピー**  
   美しいスニペットを作成したいコードを選択してコピーします（`Ctrl+C` または `Cmd+C`）。

3. **Polacodeウィンドウにペースト**  
   Polacodeのウィンドウが開いたら、コピーしたコードをウィンドウ内にペーストします（`Ctrl+V` または `Cmd+V`）。

4. **カスタマイズ**  
   コードスニペットの背景色やテーマは、VS Codeの設定やテーマに依存します。必要に応じて、VS Codeの設定を変更してカスタマイズできます。

5. **画像を保存**  
   Polacodeウィンドウ右下のカメラアイコンをクリックすると、コードスニペットの画像が生成され、保存ダイアログが表示されます。保存先を選択して「保存」をクリックします。

## Polacodeのバグ: 注意点
ただ、Polacodeを使用しているとコードが正しくスニペットに反映されないことがあります。
`()`がなぜか全然関係ない冗談に移動していたり、コードとコードが重なっていることがあったりと正しく表示されないことがあったりします。

## 参考
[Visual Studio Code拡張機能「Polacode」でソースコードを手軽にキャプチャ | フロントエンドBlog | ミツエーリンクス](https://www.mitsue.co.jp/knowledge/blog/frontend/201804/02_1600.html)
[備忘録]改めてDNS/Web Server/Mail Serverの関係をイメージできる様にNote

## DNS/Web Server/Mail Serverの相関イメージ
サーバーからメールを送るために、ESPのAPIを契約しようと思った時に所有しているドメインを聞かれて、そういえば、ウェブサーバーとメールサーバーは別物だし、送信自体はESPのSMTPサーバーがやってくれるわけで、送信元ってウェブと同じドメインを使う必要はない様な気がするし、そもそも送信元アドレスも必要ないよなあと思い、改めて相関関係のイメージを整理してみたので、メモを残しとく。

### DNS: アドレス帳

**ドメインネームシステム (DNS)**:
- **機能**: DNSは、人間が読みやすいドメイン名（例: `example.com`）を、コンピュータ同士がネットワーク上で互いに識別するために使用するIPアドレスに変換。
- **イメージは**: DNSはアドレス帳。名前をアドレス帳で調べると、対応する住所や郵便番号がわかるのと同じように、ドメイン名を調べると対応するIPアドレスがわかる。

### Webサーバー: 家、マンションの部屋

**Webサーバー**:
- **機能**: Webサーバーはウェブサイトをホストし、ブラウザを通じてドメインにHTTPリクエストを送ると、ウェブページのデータを送り返す。
- **イメージは**: Webサーバーは家のようなもの。誰かがウェブサイト（家または部屋）を訪れたいとき、ドメイン名（住所）を使ってその場所を見つけられる。

### メールサーバー: 郵便局

**メールサーバー**:
- **機能**: メールサーバーは、メールの送受信と保存をする場所。送信はSMTP、受信はIMAP、POPなどのプロトコルを使用してメールを管理。
- **イメージは**: メールサーバーは郵便局の仕事をやってる。郵便住所（メルアド）が郵便物（メール）を受け取るのと同様に、メールサーバーはEメールを受け取り、適切なメールボックス（メールアカウント）に配布。


### まとめると

1. **DNSはアドレス帳**:
   - ブラウザやメールクライアントにドメイン名を入力すると、DNSがそのドメインを見つけ、対応するIPアドレスを提供する。AレコードやMXレコードにそのドメインに対応するIPやメールサーバーの情報が書き込まれている。

2. **Webサーバーは家またはアパートの部屋**:
   - アドレスに来たHTTPリクエストに対して、DNSはウェブサーバーのIPアドレスを提供。ウェブサーバーはリクエストされたウェブページをブラウザに送り返す。

3. **メールサーバーは郵便局**:
   - メールアドレス（例: `myname@example.com`）に対して、DNSのMX（メール交換）レコードが対応するメールサーバーを教えてくれる。メールサーバーは受信メールを処理し(SMTPサーバー)、受信者のメールボックス(IMAP/POPサーバー)に保存。で、各メーラーがそれを受け取りに行く。



### 関連の用語

- **DNSレコード**:
  - **Aレコード**: ドメインをIPアドレスにマッピング（例: `example.com`から`192.0.2.1`）。
  - **MXレコード**: ドメインのメールサーバーを指定（例: `example.com`に送られるメールは`mail.example.com`に送信される）。
  - **CNAMEレコード**: 別のドメインのエイリアス（例: `www.example.com`は`example.com`を指す、また、blog.example.comもexample.comを指す。）。

- **Webサーバーの構成要素**:
  - **HTTP/HTTPS**: 訪問者が入るためのドアやセキュリティシステム。

- **メールサーバーの構成要素**:
  - **SMTP**: 郵便物を送る（郵便物を持ち込んだ）郵便局。
  - **IMAP/POP**: 郵便物を保持しておく地元の郵便局や郵便箱。
基礎数学の理解

#### まえがき
データ分析において、数学的な基礎を理解することは非常に重要です。この記事では、微分と積分、線形代数の基本概念とその実生活や実務での応用について学びます。

#### 微分と積分

**定義と実生活への応用**
- **微分**：変化の速度を測る手法。例えば、車の速度は距離の微分です。
- **積分**：累積量を求める手法。例えば、車の走行距離は速度の積分です。

**具体例**
例えば、車が走行しているときの速度（m/s）が次のようなデータがあったとします。

| 時間 (s) | 速度 (m/s) |
|----------|------------|
| 0        | 0          |
| 1        | 2          |
| 2        | 4          |
| 3        | 6          |
| 4        | 8          |
| 5        | 10         |

このデータを用いて速度の変化（微分）と累積走行距離（積分）を計算します。

**コード例**

```python
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成
time = np.array([0, 1, 2, 3, 4, 5])
speed = np.array([0, 2, 4, 6, 8, 10])

# 微分
acceleration = np.gradient(speed, time)

# 積分
distance = np.cumsum(speed) * (time[1] - time[0])

# プロット
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(time, speed, label='Speed (m/s)')
plt.plot(time, acceleration, label='Acceleration (m/s^2)')
plt.xlabel('Time (s)')
plt.ylabel('Speed and Acceleration')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(time, distance, label='Distance (m)')
plt.xlabel('Time (s)')
plt.ylabel('Distance')
plt.legend()

plt.show()
```

**アウトプット**
![スクリーンショット 2024-08-07 10.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3851752/12d5484e-f6d8-04d4-df52-f6a9ba6000fb.png)


#### 線形代数

**ベクトルと行列**
- **ベクトル**：方向と大きさを持つ量。例：力のベクトル。
- **行列**：ベクトルの集合で、複数のデータを一度に操作可能。

**実務での応用例**

例えば、2つのベクトル間の内積を計算する例を示します。

**コード例**

```python
import numpy as np

# ベクトルの作成
v1 = np.array([1, 2])
v2 = np.array([3, 4])

# 内積
dot_product = np.dot(v1, v2)
print(f"Dot Product: {dot_product}")

# 行列の作成
matrix = np.array([[1, 2], [3, 4]])

# 行列の逆行列
inverse_matrix = np.linalg.inv(matrix)
print(f"Inverse Matrix:\n{inverse_matrix}")
```

**アウトプット**

```
Dot Product: 11
Inverse Matrix:
[[-2.   1. ]
 [ 1.5 -0.5]]
```

#### あとがき
微分と積分、線形代数の基本を理解することで、データ分析の基礎を固めることができます。これらの数学的手法は、実務でも広く応用されており、データの理解と解析に欠かせません。
リーダーデバイスがアップデートしないこと

# CSS組版アプリに関する興味

それは多くの人々に共有されていますが、現在のepubリーダーが約10年前の規格にしか対応していないという事実に対する失望もまた広く感じられています。この技術の遅れは、ユーザーの間で疑問を呼び起こし、最新の機能や改善がなぜ組み込まれないのかという疑念を抱かせます。

# microsoft edge 

しかし、最近の動向として、Microsoft EdgeがePubリーダー機能を再導入したことが報告されており、これは業界における一歩前進と見なすことができます。このような進展は、将来的に他のデバイスやアプリケーションにも波及する可能性があり、ユーザー体験の向上に寄与することが期待されます。

![ebook_reader.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305812/ab99f89d-0688-75ea-98bb-73da644e215b.png)


# vivliostyleがんばれ

https://vivliostyle.org/ja/
ノーコードで超簡単！WebSimで量子リバーシゲームを30分で作ってみた【誰でもできる・無料】

# WebSimがすごい！
https://websim.ai/

皆さん、[WebSim](https://websim.ai/)というサイトを知っていますか？
このサイトはAnthropicの[Artifacts](https://engineering.nifty.co.jp/blog/27182)のように、簡単な指示をだすだけでゲームやWebサイトが構築できるサイトです。現在はGoogleアカウントでサインインすれば、無料でClaude-3.5-Sonnetなどを使えるので、非常に便利なサイトと言えるでしょう。

# 作成した量子リバーシゲーム
https://websim.ai/c/WJq00RgJAlaVn9JGL

量子リバーシゲームとは、各ターンに置く石が、その色になる確率を持っているリバーシゲームです。「観測」ボタンを押すと、盤面上の全ての石の色が確率に基づいて確定します。色が確定した後もゲームは続行され、新しく置く石は再び確率を持ちます。観測を駆使して、CPUに勝利してください。

## WebSimの使い方
まずサイトを訪れるとこんな画面が表示されます。
![スクリーンショット 2024-08-09 11.56.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/37fde42b-7409-4154-9255-18a2b61c8b4d.png)

赤枠の部分に、作成したいゲームの詳細を入力していきます。**日本語で入力して構いません。**
他の人が作った作品も見ることができ、例えば自分が作った量子リバーシゲームを見ると、以下のように表示されます。
![スクリーンショット 2024-08-07 9.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503518/231e67b1-ac34-00a1-2a33-5f0a99efdb60.png)
URLが表示されている部分をクリックすると、作者がどんなプロンプトでその作品を作ったのかを見ることができます。これを参考にしてみるのもいいですね。

## 量子リバーシゲームを作成するのにどのような指示を出したか
自分がどのようなプロンプトで量子リバーシゲームを作ったかを見せます。
基本的には作りたい機能を指示して、できていない箇所を修正指示を出すの繰り返しです。
|No.|指示|
|---|---|
|1.|リバーシゲームを作成してください|
|2.|量子リバーシゲームを作ります。このリバーシをベースとして白のターンの場合は白の確率が80%の石と白の確率が30%の石を交互に置きます。黒のターンの場合は黒の確率が80%の石と黒の確率が30%の石を交互に置きます。観測ボタンも置いてください。|
|3.|白のターンの時には白の確率が80%の石と白の確率が30%の石を交互に置いてください。今は黒の確率しか表示されていません。観測ボタンを押すと確率に基づいて色が決まりますが、観測が終わると元の確率状態の石に戻ります。石が確定したままゲームを続けないでください。|
|4.|やはり観測後は石を確定するようにしてください。石を置く順番と確率は黒の手番から始まるとすると(B:90%,W:10%) -> (W:90%,B:10%) ->(B:60%,W:40%)->(W:60%,B:40%)を繰り返してください。|
|5.|石を置く順番と確率は黒の手番から始まるとすると(B:90%,W:10%) -> (W:90%,B:10%) ->(B:60%,W:40%)->(W:60%,B:40%)を繰り返すというのが守れていません。|
|6.|観測した後に石が置けなくなっています|
|7.|盤面の石の表示を黒９０％の時には(B:90%,W:10%)、白９０％の時には(B:10%, W:90%)としてください。|
|8.|CPU対戦機能をつけて|
|9.|CPUは後手で、石を置ける箇所にランダムに置くようにして|
|10.|英語にして|
|11.|スマートフォンでも操作しやすいようにして|
|12.|日本語にして、説明書きも追加して|

盤面に石を置くときに確率を黒90%、白90%、黒60%、白60%と繰り返したかったのですが、そこがどうしてもうまくいきませんでした。

## まとめ
WebSimは、非エンジニアの方でも簡単にゲームが作れるサイトです。
無料で使えるのは今だけかもしれないので、今のうちに楽しんでみてください。