OmniAICreator/Qiita-1.07M huggingface dataset:
API Best Practices ~map型を使おう

## map型を使おう

https://protobuf.dev/programming-guides/api/#use-proto-maps

proto3 からmap型が実装されました。
proto2 にもバックポートされています。

独自に KVPair を定義するよりよいでしょう。

事前に構造がわからない任意のデータを表現したい場合は、google.protobuf.Any.Map<scalar, **message**>を使用してください。
https://protobuf.dev/reference/protobuf/textformat-spec/#any
Derive Public Key

[Previous << Decode Public Keys](https://qiita.com/flowcadence/items/8b86c8d0e1ae633de84e)
[Next >> Start Emulator](https://qiita.com/flowcadence/items/877ef913d31e57413692)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl

Flow CLIは、秘密鍵から公開鍵を導出するコマンドを提供しています。

```ruby
flow keys derive <private key>
```

<h1>Example Usage</h1>

<h3>Derive Public Key from a Private Key</h3>

```ruby
> flow keys derive c778170793026a9a7a3815dabed68ded445bde7f40a8c66889908197412be89f
```
<h3>Example response</h3>

```ruby
> flow keys generate

🔴️ Store Private Key safely and don't share with anyone! 
Private Key     c778170793026a9a7a3815dabed68ded445bde7f40a8c66889908197412be89f 
Public Key 	    584245c57e5316d6606c53b1ce46dae29f5c9bd26e9e8...aaa5091b2eebcb2ac71c75cf70842878878a2d650f7
```

<h1>Arguments</h1>

<h3>Private Key</h3>

* Name: `private key`
* Valid inputs: valid private key content 

<h1>Flags</h1>

<h3>Signature Algorithm</h3>

* Flag: `--sig-algo`
* Valid inputs: `"ECDSA_P256"`, `"ECDSA_secp256k1"`

キーペアのECDSA署名アルゴリズムを指定します。

Flowでは、secp256k1とP-256曲線をサポートしています。

<h3>Filter</h3>

* Flag: `--filter`
* Short Flag: `-x`
* Valid inputs: a case-sensitive name of the result property.

結果から、唯一の値として取得したいプロパティの名前を指定します。

<h3>Output</h3>

* Flag: `--output`
* Short Flag: `-o`
* Valid inputs: `json`, `inline`

コマンド結果のフォーマットを指定します。

<h3>Save</h3>

* Flag: `--save`
* Short Flag: `-s`
* Valid inputs: a path in the current filesystem.

結果を保存したいファイル名を指定してください。


*Last updated on **Dec 6, 2024** by **Alex Ni***

翻訳元

https://developers.flow.com/tools/flow-cli/keys/derive-keys

***
<b>[Previous << Decode Public Keys](https://qiita.com/flowcadence/items/8b86c8d0e1ae633de84e)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Derive Public Key)

<b>[Next >> Start Emulator](https://qiita.com/flowcadence/items/877ef913d31e57413692)</b>
Elixirで作る「DDJ-FLX4のジョグ対応ブロックくずし」　その6 対策をする、そしてプロジェクトを3分割のつづきddj_client編

前回のつづきです

https://qiita.com/t-yamanashi/items/d648b9c183181aafd3a2


# ddj_client

```elixir:ddj_client/lib/ddj_client.ex
defmodule DdjClient do
  @moduledoc """
  Documentation for `DdjClient`.
  """

  alias Socket.Web

  def hello do
    socket =
      Web.connect!("localhost", 4000, path: "/socket/websocket?token=undefined&vsn=2.0.0")
      |> join()

    {_, input} = PortMidi.open(:input, "DDJ-FLX4 MIDI 1")
    PortMidi.listen(input, self())
    midi_in(input, socket)
    PortMidi.close(:input, input)

    :world
  end

  def midi_in(input, socket) do
    receive do
      v ->
        jog(v, socket)
    end

    midi_in(input, socket)
  end

  def jog({_, [{{176, 33, 65}, _}]}, socket) do
    IO.inspect("右 1")
    send_data(socket, "1.0")
  end

  def jog({_, [{{176, 33, 63}, _}]}, socket) do
    IO.inspect("左 -1")
    send_data(socket, "-1.0")
  end

  def jog(_, _) do
    nil
  end

  def send_data(socket, data) do
    data = """
    ["3","4","ddj:lobby","new_msg",{"body":"#{data}"}]
    """

    Web.send!(socket, {:text, data})
    socket
  end

  def join(socket) do
    phx_join = """
    ["3","3","ddj:lobby","phx_join",{}]
    """

    Web.send!(socket, {:text, phx_join})
    socket
  end
end
```
- hello
  - WebSocketサーバーに接続
  - DDJ-FLX4を開く
  - DDJ-FLX4の受信開始
  - midi_in（受信ループ）開始
  - DDJ-FLX4を閉じる今は事実無効

- midi_in
  - jog関数を呼ぶ
  - midi_inを呼んでループ


- jog
  - ジョグを回したら1.0又は-1.0をサーバーに送る

つづく
次回はサーバー編です

https://qiita.com/t-yamanashi/items/7b147ceab43fdb0fb195
Rust で Windows のアクセントカラーを取得する

# はじめに

Tuari などで GUI アプリケーションを作っていると、どこかでテーマカラーに対応したくなる時がある。
ユーザーは任意の色を「個人設定」-> 「アクセントカラー」として設定するが、これらをカスタムで取得しようとすると Windows 内の情報にアクセスする必要が出てくる。
ということで、今回はその色情報を取得するためだけの小ネタ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/ae7fb0c1-a268-512d-3f54-d4d756170e71.png)

### 参考

参考はこちらの Tauri のやりとりにて。

https://discord.com/channels/616186924390023171/1261703538409738354/1317116432210853958

# 依存ライブラリのインストール

このアクセントカラーにアクセスするには Windows レジストリにアクセスする必要がある。
ということで、そのためのライブラリ `winreg` を追加する。

```powershell
cargo add winreg
```

# 実装

Windows レジストリにアクセスしつつ、それをパースしていく。
結果として、`Vec<u8>` として RGB 色配列を返す形。

```rust:main.rs
use winreg::enums::HKEY_CURRENT_USER;
use winreg::RegKey;

fn get_windows_accent_color() -> Vec<u8> {
    let mut color: Vec<u8> = vec![0, 0, 0];
    let hkcu =
        match RegKey::predef(HKEY_CURRENT_USER).open_subkey(
                "SOFTWARE\\Microsoft\\Windows\\DWM") {
            Ok(key) => key,
            Err(_) => return color,
        };

    let c = match hkcu.get_value::<u32, _>("AccentColor") {
        Ok(value) => value,
        Err(_) => return color,
    };

    color[0] = (c & 0xff) as u8;
    color[1] = ((c >> 8) & 0xff) as u8;
    color[2] = ((c >> 16) & 0xff) as u8;

    color
}
```

これを使って実行すると次の様に取得できる。

```rust:main.rs
fn main() {
    let color = get_windows_accent_color();
    println!(
        "Windows accent color (HEX) :: #{:02x}{:02x}{:02x}",
        color[0], color[1], color[2]
    );
    println!(
        "Windows accent color (RGB) :: Red: {}, Green: {}, Blue: {}",
        color[0], color[1], color[2]
    );
}
```

```text:結果
Windows accent color (HEX) :: #d13438
Windows accent color (RGB) :: Red: 209, Green: 52, Blue: 56
```

試しに Google の色変換機に入力してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/68d37af9-94e7-077a-abf7-3113a782f935.png)

ちゃんと取れてる！

# さいごに

Windows レジストリのどこにあるのかというのも知れたのでよかったが、何気に Windows レジストリにアクセスする方法は初めてやってみたので、その方法を知れたのも良かった。
今さら MAX® V 5M240Z に触れる

<img width="300" alt="MAX V" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/386b78a6-31f3-a9ba-dda7-598562d13a01.png" />



# 0. はじめに

Complex Programmable Logic Device (CPLD) である『 [ALTERA（現 INTEL）MAX® V 5M240Z](https://www.intel.co.jp/content/www/jp/ja/products/sku/210260/max-v-5m240z-cpld/specifications.html) 』が載った [組立キット](https://www.cqpub.co.jp/hanbai/books/I/I000332.htm)を購入した。

[<img width="200" alt="max5-tg4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/6405371f-00bc-78f4-4d0b-f931b3ba967d.png" />](https://www.cqpub.co.jp/hanbai/books/I/I000332.htm)

そのままハンダ付けして VFD時計を仕上げてもよいのだが、せっかくなので、[トランジスタ技術2019年12月号](https://toragi.cqpub.co.jp/tabid/887/Default.html)で特集されている『第1部　第3章［準備3］エディタを起動して回路図を入力する』を実践してみることにする。

_『タクトスイッチが3個と, LEDが4個ある』という、一致点だけが今回の **動機** です。_

今回は、Windows11 Pro 24H2 で環境を構築した。

# 1. 回路図

[Intel® Quartus® Prime Lite Edition Design Software Version 23.1 for Windows](https://www.intel.com/content/www/us/en/software-kit/795188/intel-quartus-prime-lite-edition-design-software-version-23-1-for-windows.html)をインストールして、トラ技の内容に従って、次の回路を作成した。

ただし、ピンの割り当ては、トラ技の内容ではなく、実際のプリント基板のピン配置に変更している。

![cir1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/4247473b-14c4-9f66-7406-deb200869b82.png)

_SW1〜3を押している間、対応するLED1〜3が光る。 3つのSWを同時に押すと、LED4も光る。_

# 2. 必要なパーツのみハンダ付け

上の回路を実際に動作せる最小のパーツだけプリント基板にハンダ付けする。


- 電源関係

| No | Parts |
|:-:|:-|
| J1  | DCジャック  |
| IC4  | 三端子レギュレータ（1.8V）  |
| IC5  | 三端子レギュレータ（3.3V）  |
| C12, C14, C16 | 10μF x3 |

- Programmer関係

| No | Parts |
|:-:|:-|
| CN1  | 5Px2 ボックスヘッダ  |
| R4, R5, R7  | 5.1kΩ x3  |
| R6  | 1kΩ  |

- タクトスイッチ関係

| No | Parts |
|:-:|:-|
| SW1, SW2, SW3  | タクトスイッチ x3  |
| R1, R2, R3  | 10kΩ x3（プルアップ抵抗）  |
| C1, C2, C3  | 0.1μF x3  |

- LED関係

| No | Parts |
|:-:|:-|
| LED1 - LED4 | LED x4  |
| R8 - R11 | 470Ω x4（制限抵抗）  |

- 5M240Z VCC関係

| No | Parts |
|:-:|:-|
| C4 - C11 | 1μF x8 |

<br>↓ 以上のパーツだけをハンダ付けした状態

<img width="300" alt="pcb_3883.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/2d32a7c6-d648-0650-89d5-39d0c8ebe140.png" />


# 3. 5M240Z への書き込み

前項で作成した回路データを コンパイルし、USB-Blaster（書き込み装置）を使って、Max V へ書き込む。


# 4. 動作確認

期待通り動作しました✌️

<img width="300" alt="IMG_3889.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/18d3538c-0a23-0410-73ea-d3295ccfd065.png" />

今回はじめて触って、CPLD（FPGA）に興味を持ちました。
今さらですが、Max® V か Max® 10 の開発ボードを入手したくなりました。


# 追伸

単純な上記回路は、問題なく動作したのですが、
JKフリップフロップを4段使った 4ビットカウンタの回路は、同期式・非同期式とも、なぜか期待通りには動きませんでした。

タクトスイッチによるクロック入力がチャタリングを起こしてカウントミスするのかと考えて、別なマイコンから1Hz程度のパルスを与えてみましたが、結果は同じでした。


![4bit_6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/c802f72a-e517-2ae3-9002-d73518bd782f.gif)（手ブレご容赦ください）


原因が分からず諦めました。そのこともあって開発ボードで再挑戦したいと思いました。<br><br><br>



**以上**
マハラノビス分類器

<a href="https://qiita.com/murasaki1994/items/a450795b65392a311d2c">前回</a>マハラノビス距離を使った分類をしたのですが

https://qiita.com/murasaki1994/items/a450795b65392a311d2c

実際どのような形で分類されているのか今回は機械学習っぽく実装してみました。
# ライブラリのインポート
```Python3
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import distance
from sklearn.datasets import make_blobs
```
# データの作成
```Python3
x_train, y_train = make_blobs(n_samples=300, centers=4, random_state=0, cluster_std=1.0)
```

# マハラノビス分類器
```Python3
class MahalanobisClassifier:
    def __init__(self):
        self.x_train = None
        self.y_train = None
        self.cov_i = None
    
    def fit(self, x_train, y_train):
        self.x_train = x_train
        self.y_train = y_train
        cov = np.cov(x_train.T)
        self.cov_i = np.linalg.inv(cov)
    
    def predict(self, x_test):
        predictions = []
        for i in range(len(x_test)):
            tmp_mrv = []
            for j in range(len(self.x_train)):
                tmp_mrv.append([self.y_train[j], distance.mahalanobis(x_test[i], self.x_train[j], self.cov_i)])
            tmp_mrv = sorted(tmp_mrv, key=lambda x: x[1])
            predictions.append(tmp_mrv[0][0])  # 最も近い点のクラスを返す
        return np.array(predictions)
```
# 描画関数
```Python3
def visualize_classifier(model, X, y, ax=None, cmap='brg'):
    ax = ax or plt.gca()
    
    # トレーニングデータのプロット
    ax.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=cmap,
               clim=(y.min(), y.max()), zorder=3)
    ax.axis('tight')
    ax.axis('off')
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    
    # 決定境界の計算
    xx, yy = np.meshgrid(np.linspace(*xlim, num=200),
                         np.linspace(*ylim, num=200))
    grid_points = np.c_[xx.ravel(), yy.ravel()]
    Z = model.predict(grid_points).reshape(xx.shape)
    
    # 結果を色分けして描画
    n_classes = len(np.unique(y))
    ax.contourf(xx, yy, Z, alpha=0.3,
                levels=np.arange(n_classes + 1) - 0.5,
                cmap=cmap, clim=(y.min(), y.max()),
                zorder=1)
    ax.set(xlim=xlim, ylim=ylim)
```

# では描画してみましょう

```Python3
model = MahalanobisClassifier()
model.fit(x_train, y_train)
plt.figure(figsize=(8, 6))
visualize_classifier(model, x_train, y_train)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/685ea87a-8fc5-37ee-9480-bb3d7675c679.png)

これだけ見るとかなり柔軟なモデルになっていると思いますが、まあでも過学習も心配ですね。

ちなみにですが今回はChatGPTを使って作りました。
Decode Public Keys

[Previous << Generate Keys](https://qiita.com/flowcadence/items/31669ba30375cd713c54)
[Next >> Derive Public Key](https://qiita.com/flowcadence/items/e4b469f269cab3442f12)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#flow-cli-と-fcl

Flow CLIは、暗号化(符号化, encoded)された公開アカウントキーを復号化するコマンドを提供しています。

```ruby
flow keys decode <rlp|pem> <encoded public key>
```

<h1>Example Usage</h1>

<h3>Decode RLP Encoded Public Key</h3>

```ruby
> flow keys decode rlp f847b84084d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db2402038203e8

Public Key 		 84d716c1...bcc9ecb59568c996d342db24 
Signature algorithm 	 ECDSA_P256
Hash algorithm 		 SHA3_256
Weight 			 1000
Revoked 		 false
```
<h3>Decode PEM Encoded Public Key From File</h3>

```ruby
> flow keys decode pem --from-file key.pem

Public Key 		 d479b3c...c4615360039a6660a366a95f 
Signature algorithm 	 ECDSA_P256
Hash algorithm 		 UNKNOWN
Revoked 		 false
```

<h1>Arguments</h1>

<h3>Encoding</h3>

* Valid inputs: `rlp`, `pem` 

最初の引数は、提供された公開鍵の有効なエンコードを指定します。

<h3>Optional: Public Key</h3>

* Name: `encoded public key`
* Valid inputs: valid encoded key content

オプションの2番目の引数は、エンコードされた公開鍵の内容を提供します。この引数が省略された場合は、`--from-file`を代わりに使用する必要があります。

<h1>Flags</h1>

<h3>From File</h3>

* Flag: `--from-file`
* Valid inputs: valid filepath

エンコードされた公開鍵のファイルを指定します。

<h3>Filter</h3>

* Flag: `--filter`
* Short Flag: `-x`
* Valid inputs: a case-sensitive name of the result property.

結果から、唯一の値として取得したいプロパティの名前を指定します。

<h3>Output</h3>

* Flag: `--output`
* Short Flag: `-o`
* Valid inputs: `json`, `inline`

コマンド結果のフォーマットを指定します。

<h3>Save</h3>

* Flag: `--save`
* Short Flag: `-s`
* Valid inputs: a path in the current filesystem.

結果を保存したいファイル名を指定してください。

<h3>Version Check</h3>

* Flag: `--skip-version-check`
* Default: `false`

低速なネットワーク接続における処理を高速化するために、起動時のバージョンチェックをスキップします。


*Last updated on **Dec 6, 2024** by **Alex Ni***

翻訳元

https://developers.flow.com/tools/flow-cli/keys/decode-keys

***
<b>[Previous << Generate Keys](https://qiita.com/flowcadence/items/31669ba30375cd713c54)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Decode Public Keys)

<b>[Next >> Derive Public Key](https://qiita.com/flowcadence/items/e4b469f269cab3442f12)</b>
sudo で nohup ＋ リダイレクト したい

nohup に関する記事は色々と出てきますし、昨年のアドベントカレンダー、
[cp, mv, rsync 等の verbose が遅い時は nohup か ＆ で](https://qiita.com/sw_sc/items/b3bd50a0df08e3c68a67) にも書いているのですが、

sudo と リダイレクト を組み合わせる方法が、あまり検索にヒットせず、
色々と試行錯誤した結果、下記でいけました。

例
```
sudo nohup sh -c 'sleep 20; echo finish > nohup-test.log 2>&1' > /dev/null 2>&1 &
```
冗長に見えますが、上記のように

* nohup sudo ではなく、sudo nohup
* コマンド内容は通常のリダイレクトで
* sudo を バックグラウンドで処理させるために、末尾に > /dev/null 2>&1 & を付ける
* * sudo nohup を 末尾の > /dev/null で捨てないと nohup.out が作成され、画面が「固まったように見える」ので注意

※動作確認環境は RHEL や Amazon Linux 2023 等の RedHat系OS
TailwindCSSでレスポンシブなサイトを構築する件


フルスタックエンジニアのあかつきゆいとです。
今回はTailwindでレスポンシブデザインを構築する方法をつらつら書いていきたいと思います。

## Tailwindはモバイルファースト

Tailwindの公式ドキュメントでは、モバイルファーストという理念が書かれています。
これは、最小の画面サイズのときのスタイルを書け、大きい画面のものはsmなどをつけて書き足せというものです。

例えば、これは私のサイトのプログラムを一部改変したものですが、

```tsx
<main className="flex flex-col md:flex-row gap-8 row-start-2 items-center justify-center grow w-full mb-10 md:mb-0">
  <div className="flex flex-col gap-8 justify-center md:w-1/3 md:ml-20 w-3/4">
    // Description
  </div>
  <div className="flex flex-col justify-center items-center md:max-w-1/2 gap-5">
    // Image
  </div>
</main>
```

これで実際に何が行われているかを見てみましょう。

### 画面サイズのプレフィクス

mainのClassの中に、mdという単語が見えますか？
これは画面サイズを表しています。
他にも、

> sm: min-width:640px;
> md: min-width:768px;
> lg: min-width:1024px;
> xl: min-width:1280px;
> 2xl: min-width: 1536px;

このように定義されています。

例えば今回であれば、768px以上横幅があればflex-row、横並びにするということです。
他にも、md:max-w-1/2は、mdであればどれだけ大きくても50%という指示です。

このように画面サイズによって変えることができます。

## 参考文献

https://tailwindcss.com/docs/responsive-design
NECソリューションイノベータ株式会社の Qiita 投稿記事への日本国内からの累計アクセス数が 10 万件を突破！Google Analytics & Looker Studio でのアクセス数の推移の可視化について

# はじめに

弊社では 2021年1月頃から Qiita を利用した社外情報発信活動が試験的にスタートし、今年のアドベントカレンダーが終わって年が明けると、5 年目に突入します。

私が会社の Qiita を利用した社外情報発信活動に参加してから、会社の Qiita Organization に Google Analytics の導入をお願いして、アクセス数の推移が分かるようになったのが、2022年10月からとなりますが、今年の 11 月に、Google Analytics を導入してからの日本国内からの累計アクセス数が 10 万件を超えたことが分かりました。

今回のアドベントカレンダーでは、Looker Studio を利用して、どのようにアクセス数の推移を可視化しているのかを紹介してみたいと思います。



# Looker Stuido で作成したレポート

## 全期間のアクセス状況[^*1]

![全期間のアクセス状況](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104325/60c5e36a-fc07-d7d3-ae62-30f2d02beb41.png)


Google Analytics の導入前はデータがありませんが、活動がスタートした 2021 年 1 月を集計の開始日、当日を集計の終了日に設定して、投稿記事ごとのアクセス数、投稿ユーザ数ごとのアクセス数、月ごとのアクセス数の推移、全期間の累計アクセス数を表示しています。

当然のことなんですが、投稿者と投稿記事数が増えるほど、記事の投稿頻度が多いほど、アクセス数は増加しているのが分かりますね。



このレポートを作成するにあたって、以下の 2 点についてカスタマイズを行っています。

1. 投稿者名の取得
   - だれが投稿した記事なのか？を知りたい。という要望があったので、URL のパスに含まれるユーザ名を取得するため、データソースに以下のようなカスタム計算フィールドを追加しています。
     `REGEXP_EXTRACT(ページパス + クエリ文字列, '/([^/]+)/')`

2. 表示内容のフィルタリング
   - 投稿記事ではない、パスが `/organizations` のアクセスが表示されるのを除外。
   - 日本国内（国が `Japan`）のアクセスのみを含める。これは、国外からのアクセスが 1% 未満であるのと、国外からのアクセスで記事のタイトルがその国の言語で表示されて、見にくかったので暫定処置として除外しています。



## Qiita Advent Calendar 2024 投稿記事のアクセス状況

![Qiita Advent Calendar 2024 投稿記事のアクセス状況](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104325/15a13762-138d-89e3-ff0e-50e6922190f2.png)


今年のアドベントカレンダーに向けて、アドベントカレンダーだけのアクセス状況は見れないの？という問い合わせがあったので、作成してみました。

Google Analytics に蓄積されている情報の中に、何か識別する情報があるだろう。と思っていたのですが、それらしきデータが見つからず、最終的に Qiita 公式に問い合わせてみたところ、以下のような回答がありました（一部抜粋）。

> 恐れ入りますが、お問い合わせいただいた「Qiita Advent Calendarへの紐付きを識別する情報」については現在ご用意できておりません。

> 今回いただいたご意見は、検討課題として社内へ共有いたしました。

> Google Analytics上で記事のUUIDでの絞り込みは可能なため、お手数ではございますが、アドベントカレンダーに紐付けられた記事のUUIDで絞り込みを行っていただき、ご確認いただけますと幸いです。

ということで、最初はレポートのフィルタに、パスの一致条件を OR で毎日記事が公開されるたびに追加していたのですが、フィルタの OR 条件の上限が 12 件だということが 13 日目の朝に発覚。

どうすればいいのか？と色々考えた結果、データソースに以下のようなカスタム計算フィールドを作成して、毎日記事が公開されるたびに集計対象の記事のパスを追加しています。

```
IF(
	ENDS_WITH(ページの完全な URL, "/bbd48ffc7cdc10071a8b") OR 
	ENDS_WITH(ページの完全な URL, "/c7a806911aea6dfb1e24") OR 
	ENDS_WITH(ページの完全な URL, "/292d43606ad4c658c2ae") OR
	ENDS_WITH(ページの完全な URL, "/55d85fc2adcdfe4ba864") OR 
	
	(途中省略)
	
	ENDS_WITH(ページの完全な URL, "/f024a105cb6520a11243"), 1, 0)
```

（来年は、Google Analytics のフィールドから簡単に取れるようになってるといいなぁ〜）



# 可視化することの意義

ここで可視化しているのはアクセス数だけですが、アクセス数の多寡に一喜一憂するのではなく、そのデータから見えてくることを深堀りして、自分自身の活動に役立ててほしい。

例えば、以下のようなことが挙げられますが、

- 情報発信を行うメディアの向う側にいる今どきのエンジニアが、どのような技術やテーマに興味を持っているのか？世の中のトレンドを把握していくための手段の１つとしての活用
- よく読まれている記事は、単にテーマだけが優れているのか？同じ会社の仲間の投稿した記事との違いなども含めて、良いアウトプットを行う力を養う

これだけに限らず、情報発信スキルの向上、自己成長とキャリア形成、など、さまざまな側面において、何かを考えるきっかけになるはずです。



# 最後に

今年度から会社の CTO オフィスの所属となりましたので、NECソリューションイノベータの社員 12589名（2024年3月31日時点）の中から、たくさんのエンジニアが Qiita を始めとしたさまざまなメディアでの社外情報発信活動に参加できるよう、そのための会社制度やルールを整備していく活動にも取り組んでいきたいと考えています。



[^*1]: 	"Google Analytics のデータにはすでに弊社を退職された方の投稿記事の情報も含まれています"
Flaskアプリを作る際の自己流最低限構築

# 初めに
Flaskでアプリを作ろうとして毎回何が必要だったか見直すのが面倒くさいのでQiitaにまとめておきます！(最初の記事投稿がこれでいいのだろうか,,,)

**!Flaskをインストールしているの前提です**
## ディレクトリ構造
```
root
├─templates
│　└─index.html
│─static
│　└─style.css
└─app.py
```

### app.py
Flaskアプリの起動、ルート処理など
```python:app.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/", methods=["GET"])
def index():
    return render_template("index.html")

if __name__ == "__main__":
    app.debug=True
    app.run(host="localhost", port=5000)

```

### index.html
```html:indedx.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport">
    <title>title</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">
    <link rel="stylesheet" href="{{url_for('static',filename='style.css')}}">
    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.16"></script>
</head>
<body>
    
    <div class="m-5">
        <p class="display-1">Hello World</p>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" crossorigin="anonymous"></script>
    
</body>
</html>
```

### style.css
```css:style.css
*{
    margin:0px;
    padding:0px;
}
```

## 終わりに
最低限なのでSQLなどは別途追加していくって感じです。また、ほかの人と違う部分が多少あるかもしれないです。
今回がQita初投稿ですがこれからQiitaの記事をどんどん出していこうと思うのでお願いします！
初めての社外勉強会に参加したよ日記

[ユニークビジョン株式会社 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/uniquevision) 12月10日の記事です。


# はじめに
12/4に[2024年を振り返ろう！若手エンジニアのための交流LTナイト](https://buysell-technologies.connpass.com/event/335378/)に登壇枠として参加してきました。
初社外の勉強会で懇親会も最後まで参加してきました。
今記事は、個人的な感想というか日記みたいなものです。

## 参加の経緯
最初に言いたいのが
勉強会に参加を決意した理由は
**下期の評価面談でプラスなこととして話せる話題が欲しかった**
という純然たる下心でした。


とはいっても、最初は登壇までは考えていなかったです。
恥ずかしい話、いまだに自分の業務で触っている技術スタックに関しても人前で話せるほどの知識がついたわけではないですし、かといってなにか日ごろ知識を取り入れるようなことをしているのかというとしていないわけで...

ただ今回のイベントは
> 今年がんばったことや失敗したこと、そしてそこから得た成果や成長、学びや反省を、5分間のLTで発表してください！

とのことで、技術以外の話をしても受け入れてもらえそうなノリだったので、登壇を決めたという流れです。

## 登壇内容
タイトルは
**（気軽に）質問をできるようになるまで**
周りの雰囲気や顔色ばかり見て全然質問できなくて生産性上がらなくて悲しいねという導入から、あまり悩まず周りに助けを求められるようになるための自分の中での気持ちの整理の話をしました。

# ここからは勉強会自体の感想

## 懇親会
一番良かったな～と思ったのは懇親会。
社外のエンジニアと技術の話をするだけではなく、他社の社内文化の話を聞けたり、取り組みだったりを聞くことができたのはとても良い体験ができたと感じています。
逆に、自社の話をしたときに、
**「それめちゃくちゃ良いですね！」**
って言ってもらえると、自社の社内文化は他社では普通ではないし、ありがたみを感じることもできます。
おまけで自己肯定感も上がります。(私が作り上げたものではないですが)

そんな良いこと尽くしの懇親会ですが最もよかったと思えた点は
**うんうんってうなずいてるだけでも有益な時間を過ごせる**ことです。

### そもそも自分は懇親会の参加には腰が折れるくらい後ろのめりでした。

- 自分はまだ語れるほど技術の知識がない
- 同様に相手が話すことをかみ砕けるほどの知識がない
- そもそもコミュ力低い
- 帰って寝たい

後半二つは置いといて、前半二つの
**外部のエンジニアとエンジニアン(?)な場において対等に話せる知識がない**
って個人的にはめっちゃ致命的だし、懇親会意味ないじゃんって思ってました。
でも他の人同士の会話を聞いてたりするだけで、先に挙げた、他社の社内文化、取り組みの話のキャッチアップができるので、
**無意味だと思ってたけど、めっちゃ有益だった**
というギャップから懇親会参加の評価が一番高いです。

## 登壇したこと
懇親会のセクションでも自白した通り、
**自分はまだ語れるほど技術の知識がない**
ので、技術の話ではなく、新人らしさも兼ね備えた
**（気軽に）質問をできるようになるまで**
という題で、メンタルやマインド的な話題で登壇したわけです。

登壇したことの一番大きなメリットは
**懇親会で登壇した内容について聞いてもらえる**
ことだと思っています。

勉強会のすべてが懇親会で話すための布石になっているようです。

# まとめ
まずはめちゃくちゃマイナス思考な自分が社外の勉強会に登壇できたことを褒めます。
お前はおそらく偉かったぞ！

あまり中身では触れませんでしたが、他の人の登壇はすべてが自分に刺さる内容のものばかりでした。
**うわー1年目で同じなのにこんなことを考えて、もうこんなことまでしてるのかー**
自分も頑張ろ！ってなりました。

自分の登壇内容は、最終的に「なにも分からないんですけど」で始まってもいいから質問しに行くべきだという主張で終わりましたが、いつまでも甘えた新人ではいられません。もう4ヶ月したら後輩ができるわけで、ばぶばぶ言って、先輩におぎゃってたら恥ずかしいですから...

来年度は技術的な話で登壇できるようにがんばります。
声でつながるAIとの対談: 挿入曲 #8 - Chill, Jazz, Piano, Brass【Suno AIでつくった楽曲】 v4 & Custom Mode: On 【動画 3分41秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ 声でつながるAIとの対談_ 挿入曲 #8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/7236ff0c-b615-b8ea-b868-8f528549d687.png)




* # 動画URL
    * https://youtu.be/ddQ-VMp05z0

<br>

* # 動画タイトル
    * 声でつながるAIとの対談: 挿入曲 #8 - Chill, Jazz, Piano, Brass【Suno AIでつくった楽曲】 v4 & Custom Mode: On 【動画 3分41秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-12-12(木)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

“声でつながるAIとの対談”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao
👆の挿入曲としてつかう予定です。

ぜひ聴いてみてください。
そして、ぜひみなさんも、ご自身の対談、番組、コンテンツのために楽曲をつくってみてください！

作曲日:
2024-12-02(月)

Suno AI 契約の種類:
Pro Plan

Suno AI Version:
v4

楽曲の正式名称:
声でつながるAIとの対談: 挿入曲 #8 - AI Voice Talks: Minimal Melody

Suno AI Library URL:
https://bit.ly/AI-Voice-Talks-Minimal-Melody-08

Custom Mode: On

Audio Inputs: Not Used

Instrumental:


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

Hip hop[Jazz][Piano][Chill][220 Seconds][Break][Outro]


🇯🇵日本語訳

[ヒップホップ][ジャズ][ピアノ][チル][220秒][ブレイク][アウトロ]


---


Suno AI 公式URL
https://accounts.suno.ai


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“声でつながるAIとの対談”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOpTHU0rmfXSgjqV1_j6Eao


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/41qZDVH
Bootstrap5のviteを使用したsassのカスタムについて

## Bootstrap5とViteの設定について

Bootstrap5には、Viteの環境構築の方法が公式ドキュメントに記載されていますが、Bootstrap5のsassカスタム変数を変更してcssクラスを対応したい場合の方法については記載されていせん。

下記から解説していきます。

・公式ドキュメントURL
https://getbootstrap.jp/docs/5.3/getting-started/vite/

### Bootstrap5とは

Bootstrap 5は、HTML、CSS、JavaScriptを用いてウェブサイトやウェブアプリケーションのユーザーインターフェイスを効率的に構築するためのフロントエンドフレームワークで、もともと旧Twitter社によって開発され、現在では世界中で広く利用されています。

### Viteとは

Vite（ヴィート）は、Vue.jsの作者であるEvan You氏によって2020年に開発された、次世代のフロントエンドビルドツールで、フランス語で「速い」という意味を持つ名前通り、開発者体験（DX）の向上を目的としており、高速な開発サーバーや効率的な本番ビルドを提供する開発ツールです。

### sassカスタム変数設定方法

公式ドキュメントの通り進めると下記のようなディレクトリ構造になります。

``` ディレクトリ構造
my-project/
├── src/
│   ├── js/
│   │   └── main.js
│   └── scss/
│   |   └── styles.scss
|   └── index.html
├── package-lock.json
├── package.json
└── vite.config.js
```

vite.config.jsとnpm scriptを設定した状態で、src/scss/_custom.scssフォルダを作成します。既存のsassフォルダを別ファイルにして、styles.scssでまとめると保守しやすくなります。
ここでは、独自のsassファイルを_main.scssにして、Bootstrap5のカスタム変数用のファイルを_custom.scssで作成しました。

``` ディレクトリ構造
my-project/
├── src/
│   ├── js/
│   │   └── main.js
│   └── scss/
│   |   └── styles.scss
|   |   └── _custom.scss
|   |   └── _main.scss
|   └── index.html
├── package-lock.json
├── package.json
└── vite.config.js
```

_custom.scssの中身ですが、node_modulesのbootstrapの変数が記載されているコードを記載します。

```
node_modules/bootstrap/scss/_variables.scss
```

先にbootstrapのfunctionsファイルをインポートして、その後bootstrapのsassの変数を修正します。最後に必要なファイルをインポートすると完成です。

ファイル容量を少なくしたい場合は、不必要なインポートを避けることで対処できます。

・例
```

//functionsファイルをインポート
@import "bootstrap/scss/functions";

// 変数の書き換え
$white: #fff !default;
$gray-100: #f8f9fa !default;
$gray-200: #e9ecef !default;
$gray-300: #dee2e6 !default;
$gray-400: #ced4da !default;
$gray-500: #adb5bd !default;
$gray-600: #374038 !default; //修正
$gray-700: #495057 !default;
$gray-800: #343a40 !default;
$gray-900: #212529 !default;
$black: #000 !default;

// 必要なファイルのインポート
@import "bootstrap/scss/variables";
@import "bootstrap/scss/maps";
@import "bootstrap/scss/mixins";
@import "bootstrap/scss/utilities";
@import "bootstrap/scss/root";
@import "bootstrap/scss/reboot";
@import "bootstrap/scss/type";
@import "bootstrap/scss/images";
@import "bootstrap/scss/containers";
@import "bootstrap/scss/grid";
@import "bootstrap/scss/tables";
@import "bootstrap/scss/buttons";
@import "bootstrap/scss/transitions";
@import "bootstrap/scss/close";

// Utilities
@import "bootstrap/scss/utilities/api";
```

以上です。
VBAはオワコンなのか？

## 導入

初めてプログラミングを勉強した言語もpythonだった私は、簡潔で柔軟なPythonのコードに慣れ、これ以上のツールはないと感じていた。ところが、職場ではExcelを使った業務が多く、VBAを駆使する場面に直面することが増えてきた。
「Pythonの方が簡単で効率的なのに、なぜ今さらVBAを？」という葛藤を抱えながらも、現場の現実を受け入れる中で、VBAの意義を再発見する。


## Kaggleの意見から見たVBAとPython
Kaggleでは、Pythonを活用した高度な分析や効率化を実現しているエンジニアが多い一方、外国ではVBAは一般的にメジャーな言語なのかkagglerに聞いてみた。

![スクリーンショット 2024-12-14 14.11.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/72e33d94-b7f5-1290-770c-f982e67fb3fb.png)



### 意見や回答
１人目：
![スクリーンショット 2024-12-14 14.13.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/a93e5682-137a-d644-3158-9f6273f06ba4.png)

![スクリーンショット 2024-12-14 14.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/2968639c-ad1c-eb02-a702-71e526783cb1.png)

![スクリーンショット 2024-12-14 14.14.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/88b57f96-dbdd-5388-cbab-6d6db83c8f60.png)

２人目：
![スクリーンショット 2024-12-14 14.14.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/13189271-af3c-9170-3b45-b70347c81566.png)




## 結論
どこの国でも一般的に使われている。



## 日本におけるエクセル文化とVBAの必要性
日本の職場では、Excelが業務の中核を担うことが多い。そのため、Excelと密接に連携するVBAは、現場での即効性のあるツールとして重宝されている。ただ、Pythonを使う自分にとっては、VBAの以下の特性がストレスになることもある。

:::note alert
・冗長なコード: Pythonの簡潔さに比べ、同じ処理でもVBAでは多くのコード行数が必要になる。
エラー処理の煩雑さ: Pythonの例外処理に慣れていると、VBAのエラー対応が面倒に感じる。

・拡張性の限界: 大量データや複雑な処理をVBAで行うのは非効率的。

:::

:::note info
VBAの強み: 環境構築しないで使用でき、Excelに密着した現場での即効性が強み。
:::



まとめ：VBAは本当にオワコンなのか？
結論として、VBAはオワコンではない。
Pythonの柔軟性や効率性に慣れていると、VBAは不便に感じることもあるが、職場がVBAに依存している以上、「その環境で最適な成果を出す」ことが求められる。ここで重要なのは、PythonとVBAを比較して嘆くのではなく、VBAを使いこなすことで環境に貢献する姿勢だと気づかされるのであった。。　　　　（社会人辛いですね笑）
守った方が良いと感じたマクロ開発ルール



1. **On Errorステートメントを必ず入れよう！**  
   これはVBAだけでなくプログラム開発であれば多くの現場で入れることを
   推奨されているエラー処理です。  
   ただ、これまでの経験上、お客様が作成したものを見ていると意外とこのエラー処理が
   入ってないことが多いです。  
   特にお客様に提供する場合は必ず入れてあげないと、
   技術力が低いと見られてしまう可能性もあります。  
   どれだけ短い処理だったとしても、エラー処理は入れた方が良いと思います。<br><br>

2. **改行やコメントを入れよう！**  
   これも私の経験なのですが、他の方が作成したものを改修しないといけなくなったときに、改行もないコメントもない。だととても見辛くなってしまいます。  
   改行とコメントも入れすぎてもまた見辛くなってしまうため、やりすぎ注意ではありますが、見やすいプログラムを作る = 技術力高いに繋がります。<br><br>

3. **マクロの記録は使わないようにしよう！**  
   これも経験があるのですが、明らかにマクロの記録で作りましたね？というExcelを見たことがあります。  
   マクロの記録は不要な処理が書き込まれていたりしますし、出来上がった際も見辛いことが多いです。 
   絶対に使わないで！とまでは言いませんが、参考にする程度での使用を個人的にはお勧めします。<br><br>

4. **変数名に日本語は使わないようにしよう！**  
   変数名に漢字を使っているものもよく見かけます。
   漢字はバグを発生させるきっかけになりやすいです。  
   確かに漢字を使った方が後から見た方が分かりやすいかもしれませんが、プログラムの世界では基本NGだという認識です。  
   アルファベットで変数名を設定し、後から読みやすいようにコメントを付けるなどの工夫をすれば良いと思います。
[チーム開発]学びの多さ以上に楽しい一週間だったよって話。

現在自身が参加中のアプレンティスでチーム開発をすることになったのでそのレビューを。

まだチーム開発なんてしたことないよって方々の一助になれば幸いです。

## プロジェクト概要
プロジェクト名：apprentory(アプレンティス生向けの教材共有サービス)

開発期間：１週間

チーム構成：３人

使用技術：PHP, JavaScript, MySQL,HTML,CSS, GitHub
## 筆者の担当部分
・チーム全体の方針決定
・フロント処理、デザイン決定

## 開発の流れ
1,アイデア出し
2,要件定義
3,設計
4,実装
5,テスト
## 学んだこと
1:コミュニケーションの重要性
これは最初からわかっていたことだったのでチーム開発期間以前から過剰なほどにコミュニケーションを取るように心がけていました。
結果的に、実装の一週間は夜中に全員で集まってdiscord繋ぎながら朝まで作業･･･なんてのがザラだったのですが終始ゲラゲラ笑いながら作業するとても良いチームになったと感じています。

2:バージョン管理
githubを使ってバージョン管理を行ったわけですが全員複数人での作業には不慣れなこともありコンフリクトが起きる起きる。その解消に時間を取られたのは反省点の一つかなあと。

3:プレゼンの重要性
最終的にはUIも凝ったものが出来てセキュアコーディングへの配慮もバッチリ･･･だったんですが最終日にあった発表会での結果は満足できるものではなく。
プレゼンターを担当しましたが聴衆や評価する側を惹き込む、自チームの強さをもっと全面に出すプレゼンが出来ていればもっと良い結果になったのかなと。
## さいごに
弊チームは幸いフロントが得意、バックエンドが得意、と得意分野がきれいに分かれていたため役割分担は非常に楽かつ明確にできてました。
最終日は小さな不具合等を解消しながらギリギリまで作業を詰めてくれたこともあり、プレゼン中にサイトが動かない、なんて憂き目に遭うこともなく無事想定していたプレゼンを行うことが出来ました。

あともう一度チーム開発があるそうで、今回の反省点は改善し、良かった点はそのままに活かしてもっと良いものが作れたらなと。

それでは。
起業するならElixirシリーズSTEP17.機能戦略

https://qiita.com/Yoosuke/private/b569ccf7b7d9734bd0aa

前回の続きです。

## 機能戦略

事業戦略を作った後は、機能戦略を作ります。
機能戦略では、以下のような機能部分の戦略を作っていきます。

* マーケティング戦略
* ブランド戦略
* 研究開発（R&D）戦略
* 人事戦略
* 生産・オペレーション戦略
* IT戦略
* サプライチェーン戦略

ちなみに、どの機能戦略を検討して進めるかは進める事業において取捨選択する事になります。また、限られた経営リソースに基づきフェーズによってもどこから進めるかは重要なポイントになります。

例えば、製造業なら生産戦略は重要な要素になります。
サービス業なら、IT戦略やオペレーション戦略
スタートアップなら最初は、マーケティング戦略やR&Dになります。

このように、リソースの効率的配分が重要になるので前回までに立てた事業戦略をベースに
どの機能戦略を優先的に立てるかについて検討していきます。

ちなみに、IT戦略では以下のような事を検討していきます。

全社戦略・事業戦略との整合性確保
* DXの推進方針
* ITによる業務効率化の範囲と優先順位
* デジタル化による新規事業機会の特定

システムアーキテクチャの設計
* 基幹システムの構成
* クラウド活用方針
* セキュリティ対策
* システム間連携の設計

データ戦略
* データガバナンスの方針
* データ収集・分析基盤の整備
* AIやBIツールの活用計画

IT投資計画
* システム更新・刷新の計画
* 新規IT投資の優先順位付け
* 投資対効果(ROI)の評価基準

運用体制の設計
* 内製/外注の方針決定
* IT人材の育成計画
* ベンダーマネジメント方針
* システム保守・運用体制

リスク管理
* 事業継続計画(BCP)
* 情報セキュリティ対策
* コンプライアンス対応

変革マネジメント
* ユーザー部門との連携方針
* IT活用促進のための教育計画
* デジタル文化醸成の施策

こうやってみると、IT戦略１つとってもやる事多いですよね、そして、これもまた、現在の自社の状態によって、今必要な計画は何かを見極めて、資源配分していかなければいけません。

私の考えは、機能戦略で最初にやるべき事は、どの業種であってもマーケティング戦略を一番に据えた方が良いと考えてます。そして、ブランディング戦略ですね。マーケティングとブランディングは対です。

そしてこのスピードをあげるために、IT戦略を交えて事業を展開していくのが今の時代に必須な選択だと考えてます。
アップデートしたAI Chat Playground

# AI Chat Playgroundとは
- MATLAB Centralで提供されている生成AIで、MATLABコードを生成したり、チャットボットとしてMATLABに関する質問に答えることができます
- 2024.12現在 この生成AIのエンジンに、OpenAI社の言語モデルGPT-4o-miniが使われています

https://jp.mathworks.com/matlabcentral/discussions/highlights/875730-ai-chat-playground-upgrades-openai-gpt-4o-mini-and-matlab-r2024b

# OpenAI社の開発ロードマップ
5段階の開発ステージを定義しているとの情報があります。
[Chat GPT-o1](https://openai.com/index/learning-to-reason-with-llms/)では、推論能力を高める方策がとられているようです。

|  |  |
|------|--------|
| Chatbots | 会話能力を持つAI |
| Reasoner(推論者) | 人間レベルの問題解決能力を持つAI |
| Agent | ユーザーの代わりに行動を起こせるシステム |
| Innovators | 発明や発見を支援できるAI |
| Organization | 組織全体の業務を遂行できるAI |]

https://xenospectrum.com/openai-rates-ai-levels-on-a-five-point-scale-and-says-it-is-currently-approaching-level-2-reasoner/

# GPT4-o-miniとは
- GPT-4oと同等程度の性能を持ちながら、コスパに優れているモデルという位置づけのようです
- OpenAI社の情報によると、推論能力、数学的能力、コーディング能力に重点がおかれています

https://openai.com/ja-JP/index/gpt-4o-mini-advancing-cost-efficient-intelligence/

# AI Chat Playgroundの利用
下記より試すことができます。

https://jp.mathworks.com/matlabcentral/playground/new


* 事例を模索中:sweat_smile:

# 関連情報
https://qiita.com/covao/items/fc922229e8f49c5d04d2

### 12月に発表されたOpenAI社ChatGPTの新機能

https://openai.com/12-days/

# まとめ
- UIは以前とあまり変化していないので、地味なアップデートですが...:grin:
体感的には、コード生成の性能が以前より向上している気がします。
今後、OpenAI社のChatGPTの進化に追従していく可能性も考えられます。
- OpenAI社のロードマップにある、Innovatorsのステージに相当する生成AIエンジンが出てきたとき、AIがMATLABシミュレーションを自ら実行し、イノベーションを生み出すという事例がでてくるかもしません:grinning:
LINE WORKS API メールフォルダリストの取得

# LINE WORKS メールフォルダリストを取得する方法

LINE WORKS のメールフォルダリストを API を使用して取得する方法を紹介します。このガイドでは、Google Colab 上で動作する Python スクリプトを提供し、簡単に試せる方法を説明します。

## 概要

LINE WORKS のメールフォルダリスト API を使用することで、以下の情報を取得できます：
- システムフォルダ（受信トレイ、送信済みフォルダなど）の情報
- ユーザーが作成したカスタムフォルダの情報
- 各フォルダの未読メール数、総メール数、使用容量

Google Colab を活用することで、環境構築なしで API の動作を確認できます。

## 必要な準備

### 1. アクセストークンの取得

LINE WORKS メールフォルダリスト API を利用するには、以下のいずれかのスコープを含むアクセストークンが必要です：
- `mail`
- `mail.read`

アクセストークンの発行方法については、以下の記事を参考にしてください：

- [LINE WORKS User Account 認証によるアクセストークン生成 (Qiita)](https://qiita.com/iwaohig/items/a7392f2d09b6fc70d8bb)

### 2. Google Colab を開く

Google Colab を利用してスクリプトを実行できます。以下のリンクから直接ノートブックを開いて試すことができます：

[Google Colab: LINE WORKS メールフォルダリスト取得サンプル](https://colab.research.google.com/drive/1l6Z6AeEJOwY-na1zX_qC9qNoPo-psqdr?usp=sharing)

## サンプルコード

以下は、Google Colab 上で実行できるサンプルコードです。

```python
# 必要なライブラリをインストール
!pip install requests

# ライブラリのインポート
import requests
import json

# 必要な変数を設定
ACCESS_TOKEN = "your_access_token"  # @param {type:"string"}
USER_ID = "me"  # @param {type:"string"} "me" または LINE WORKSユーザーID

# API エンドポイント
API_ENDPOINT = f"https://www.worksapis.com/v1.0/users/{USER_ID}/mail/mailfolders"

# メールフォルダリストを取得する関数
def get_mail_folders(access_token):
    headers = {
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json"
    }

    # GET リクエストを送信
    response = requests.get(API_ENDPOINT, headers=headers)

    # レスポンス処理
    if response.status_code == 200:
        print("✅ メールフォルダリストを取得しました！")
        folders = response.json().get("mailFolders", [])
        for folder in folders:
            print(json.dumps(folder, indent=4, ensure_ascii=False))
    else:
        print(f"❌ フォルダリストの取得に失敗しました。ステータスコード: {response.status_code}")
        print(response.text)

# 関数の実行
get_mail_folders(ACCESS_TOKEN)
```

## 実行結果例

成功時の例：
```plaintext
✅ メールフォルダリストを取得しました！
{
    "folderId": 0,
    "folderType": "S",
    "folderName": "受信トレイ",
    "unreadMailCount": 15356,
    "mailCount": 15540,
    "usage": 37151934
}
{
    "folderId": 1,
    "folderType": "S",
    "folderName": "送信済みメール",
    "unreadMailCount": 0,
    "mailCount": 159,
    "usage": 62219082
}
```

エラー時の例：
```plaintext
❌ フォルダリストの取得に失敗しました。ステータスコード: 403
{"code":"ACCESS_DENIED","description":"Access is denied for userId."}
```
## 注意事項

1. **スコープの確認**
   - アクセストークンに必要なスコープ（`mail` または `mail.read`）が含まれていることを確認してください。

2. **アクセストークンの有効期限**
   - トークンが期限切れの場合、新しいトークンを発行してください。

## まとめ

このスクリプトを活用することで、LINE WORKS のメールフォルダ情報を簡単に取得できます。Google Colab を使用すれば、手軽に動作確認を行うことが可能です。

LINE WORKS メールフォルダリスト API を活用して、メールの管理を効率化しましょう！質問やフィードバックがあれば、ぜひコメントをお寄せください。
So as a software engineer, I aspire to be a better English speaker.

This is the 16th article for the “write something” advent calendar looking back on the year. As I wrote the topic yesterday: [勉強を「楽しみ」に変えて中毒になれば毎日続くよねと Duolingo を続けて思っている話 #Duolingo - Qiita](https://qiita.com/e99h2121/items/189b654cfe874fccb767) for today's article, I want to express my challenge to be a better English speaker/writer to be better software engineer. Let's go~~

## My English is not powerful.

I had been staying in Shanghai for around 3 years before my daughter was born. I had to go back to Tokyo for my pregnancy. I spend time using English and Chinese in Shanghai. So my English was made in China. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/68c4cb1d-6470-c713-f27b-42b8c6cf79db.png)
This is my 孤独のグルメ in Shanghai...

It was a very impressive experience for me, and I have confidence. I want to show my gratitude for the boss and colleagues, but still I want to improve my skills. Because my English is just survival English.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/ac3f9fcb-0d80-4d08-0d38-8a52424d3b8d.png)


I wish I could be better spearker. 


## Learn English.

In my previous job, our boss and colleagues were unique. So it was very exciting and very comfortable for me because I love such a unique environment. I could say "no" anytime if I cannot accept any opinion or unacceptable idea if only we can discuss.

But one of the thing I need to understand is...

Just "not to do" should not be equal with "not to learn". 
It means trying something should be extremely valuable rather than not taking any action.

Especially regarding English. If it is necessary, I should learn.

- I wish to tell what I want for the engineer internationally. 
- I wish to express my appreciation for the engineer.
- I wish to interact more impressively with our boss overseas...


## Be better English speaker.

In this 2024, I felt clearly that my English is still weak. So I decided my mind that to be more strong English speaker.

- Speak anything.
- Speak anything if there is any time with [勉強を「楽しみ」に変えて中毒になれば毎日続くよねと Duolingo を続けて思っている話 #Duolingo - Qiita](https://qiita.com/e99h2121/items/189b654cfe874fccb767).
- Just think in English if there is any time.
- Communicate more actively: [自分の要件を伝える英語 #コミュニケーション - Qiita](https://qiita.com/e99h2121/items/06d0405f60f7fa6ddddd)
- Regard that My English is not powerful.


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/ebc2246b-30ad-7f6c-2c03-63fa1404d260.png)

For my effective work.

https://github.com/Azure/LogicAppsUX/issues/5101

https://github.com/Azure/LogicAppsUX/issues/6239




## Reference

[目指せグローバルエンジニア！今日から使えるシーン別英語表現20選](https://zenn.dev/loglass/articles/e5138fb0a7c9e7)

https://quillbot.com/grammar-check


## So as I wrote

Duolingo must be a key to being a better speaker. I'd like to improve my English and want to interact more. Continue to 2025 !!
[sox] 音声や動画のデータが、合計何分あつまったか計算する方法

## まえがき
![mic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908981/0796d806-bd86-61b3-52ea-200f8d477fc9.png)


機械学習用に音声データを集めている時
合計で何分集まったか調べるのがめんどくさかったためコマンドでサクッとできないか調べた。

## 前提
筆者はMacでのみ導入を確認した。

## soxパッケージをインストール
### ・Macの場合
```
brew install sox
```

### ・Ubuntuの場合
```
sudo apt update
sudo apt install sox
```

### ・Windowsの場合


SoX の公式サイト (http://sox.sourceforge.net/) にアクセスします。
"Windows binaries" のリンクをクリックし、Windows 用のインストーラーをダウンロードします。
ダウンロードしたインストーラーを実行し、画面の指示に従って SoX をインストールします。
インストールが完了したら、コマンドプロンプトまたは PowerShell で sox と入力し、ヘルプメッセージが表示されることを確認します。


# ディレクトリ内の特定の拡張子のファイルが合計何秒か調べる
小数点以下2桁

### ・wavの合計の長さを調べる
小数点以下切り捨て
```
soxi -D *.wav | paste -sd+ - | bc | awk '{m=int($1/60); s=int($1-m*60); printf "%d分%d秒\n", m, s}'
```
小数点以下1桁まで( 桁数は'f秒'の前の数値を書き換えることで操作できる。)
```
soxi -D *.wav | paste -sd+ - | bc | awk '{m=int($1/60); s=$1-m*60; printf "%d分%.0f秒\n", m, s}'
```
小数点以下2桁まで
```
soxi -D *.wav | paste -sd+ - | bc | awk '{m=int($1/60); s=$1-m*60; printf "%d分%.2f秒\n", m, s}'
```

# その他の拡張子
他にもmp3、mp4、mov、aiffなど、音声や動画のさまざまなファイルに対応している。

### ・mp3の合計の長さを調べる
```
soxi -D *.mp3 | paste -sd+ - | bc | awk '{m=int($1/60); s=$1-m*60; printf "%d分%.2f秒\n", m, s}'
```

### ・mp4の合計の長さを調べる
```
soxi -D *.mp4 | paste -sd+ - | bc | awk '{m=int($1/60); s=$1-m*60; printf "%d分%.2f秒\n", m, s}'
```

### ・movの合計の長さを調べる
```
soxi -D *.mov | paste -sd+ - | bc | awk '{m=int($1/60); s=$1-m*60; printf "%d分%.2f秒\n", m, s}'
```
Elixirで作る「DDJ-FLX4のジョグ対応ブロックくずし」　その5 対策をする、そしてプロジェクトを3分割

Elixirで作る「DDJ-FLX4のジョグ対応ブロックくずし」　その４　portmidiとRayexの相性のつづきです

https://qiita.com/t-yamanashi/items/e817a9d8fbd9792c16b5

前回ライブラリの相性が悪かったのでプロジェクトを3分割します


# ソース

https://github.com/ymn-t-yamanashi/ddj_block/releases/tag/v0.04

各プロジェクトの役割

- ddj_block 描画のみします
- ddj_client　DJコントローラーの値を取得します
- ddj_server WebSocketサーバーでddj_clientのデーターをddj_blockに届けます

# ddj_block

```elixir: ddj_block/lib/ddj_block.ex
defmodule DdjBlock do
  @moduledoc """
  Documentation for `DdjBlock`.
  """
  alias Rayex.Structs.Rectangle
  use Rayex
  alias Socket.Web

  @sleep 10

  def main() do
    Agent.start_link(fn -> 400.0 end, name: __MODULE__)
    socket = Web.connect!("localhost", 4000, path: "/socket/websocket?token=undefined&vsn=2.0.0")

    socket
    |> join()

    Task.async(fn ->
      socket_loop(socket)
    end)

    init_window(800, 800, "DdjBlock")
    main_loop(true)
  end

  def socket_loop(socket) do
    {_, text} = Socket.Web.recv!(socket)

    text
    |> Jason.decode!()
    |> Enum.at(4)
    |> Map.get("body", "0.0")
    |> String.to_float()
    |> add_state()

    socket_loop(socket)
  end

  defp main_loop(true) do
    begin_drawing()
    clear_background(%{r: 0, g: 0, b: 0, a: 0})
    draw()
    end_drawing()

    Process.sleep(@sleep)
    main_loop(!window_should_close())
  end

  defp main_loop(_), do: nil

  defp draw() do
    rectangle = %Rectangle{x: get_state(), y: 700.0, width: 100.0, height: 50.0}
    draw_rectangle_lines_ex(rectangle, 1, %{r: 0, g: 255, b: 0, a: 255})
  end

  def send_data(socket, data) do
    data = """
    ["3","4","ddj:lobby","new_msg",{"body":"#{data}"}]
    """

    Web.send!(socket, {:text, data})
    socket
  end

  def join(socket) do
    phx_join = """
    ["3","3","ddj:lobby","phx_join",{}]
    """

    Web.send!(socket, {:text, phx_join})
    socket
  end

  def get_state, do: Agent.get(__MODULE__, & &1)

  def add_state(v) do
    st = get_state()
    Agent.update(__MODULE__, fn _ -> st + v * 10 end)
  end
end
```

- main
  - Agentの初期化 プレイヤーの位置を保存
  - WebSocketサーバーに接続
  - 非同期でWebSocketサーバーのデーター受信
  - 画面の初期化
  - 画面のループ処理開始

- socket_loop
  -　データーを受信する
  -　JSONを解析
  -　floatに変換
  -  add_stateでプレイヤーの位置変更
  -  データー受信のループを繰り返す

- main_loop
  - 描画開始宣言
  - 画面クリア
  - draw関数で1フレーム描画
  - 描画終了宣言
  - スリーブ 10ミリ(負荷対策)
  - 画面のループを繰り返す

- draw
  - get_stateでプレイヤーの位置取得
  - 長方形描画

 
# 今回はここまで

次回つづきはddj_clientから

https://qiita.com/t-yamanashi/items/adc407d463b713623115
【zustand】基本メモ

```ts:type.ts
export type OwnerState = {
    flowTitle: string;
    qNodeNum: number;
    setQnodeNum: (by: number) => void;

};
```

```ts:store
import { create } from "zustand";
import { OwnerState } from "./types";

export const useOwnerStore = create<OwnerState>((set) => ({
    flowTitle: "",
    qNodeNum: 0,

    setFlowTitle: (by: string) => set({ flowTitle: by }),
    addQnodeNum: (by: number) =>
        set((state) => ({ qNodeNum: state.qNodeNum + by })),
}));
```

```tsx:コンポーネント
const setFlowTitle = useOwnerStore((state) => state.setFlowTitle);
const addQnodeNum = useOwnerStore((state) => state.addQnodeNum);

```
CVATのannotation import で詰まったので共有

## はじめに

こんにちは！yukkyです。今回はCVATを使ってみて、少し仕様を理解できたので、メモ代わりに投稿します。この記事は、以下のようなユースケースに基づいており、他のCVAT関連記事よりも実用的な内容になっていると思います。

- **データはSSH先のリモートサーバーにあり、ローカルにダウンロードしない**
- アノテーションの付与のみローカルPCから行う
- **既に付与されたアノテーションを編集・修正・削除する**

## CVATの使い方

CVATのセットアップ方法については、[こちらの記事](https://dev.classmethod.jp/articles/annotate_objects_in_image_with_cvat/)を参考にしてください。基本的には、Gitでリポジトリをクローンし、`docker-compose`コマンドを実行するだけでWebサーバーが立ち上がります。そのサーバーにアクセスして作業を開始します。

リモートサーバー上で立ち上げたWebサーバーにアクセスするには、以下のコマンドを実行してください。

```bash
ssh -L 8080:localhost:8080 username@remote_server_ip
```

さらに、リモートサーバー上のデータ（画像データ）をCVATに認識させるには、以下の内容で`docker-compose.override.yml`ファイルを作成し、クローンしたCVATディレクトリに配置します。

```yaml
services:
  cvat_server:
    volumes:
      - cvat_share:/home/django/share:ro
  cvat_worker_import:
    volumes:
      - cvat_share:/home/django/share:ro
  cvat_worker_export:
    volumes:
      - cvat_share:/home/django/share:ro
  cvat_worker_annotation:
    volumes:
      - cvat_share:/home/django/share:ro
  cvat_worker_chunks:
    volumes:
      - cvat_share:/home/django/share:ro

volumes:
  cvat_share:
    driver_opts:
      type: none
      device: 認識させたいimgがあるディレクトリ
      o: bind
```

その後、[先ほどの記事](https://dev.classmethod.jp/articles/annotate_objects_in_image_with_cvat/)を参考に、`Create a new task`画面でデータセットを選択する際、`My computer`ではなく`Connected file share`を選択すると、リモートサーバー上に配置した画像データを直接利用できます。

## アノテーションのインポート時の注意点

ここで一つ注意点があります（私がハマったポイントです…）。`Connected file share`を選択すると、そのディレクトリ構造がそのまま保持されます。例えば、`docker-compose.override.yml`の`device`フィールドに`/datas`を指定し、以下のようなディレクトリ構造だったとします（YOLO形式を想定）。

```
/datas
├── images
│   ├── train
│   │   ├── image1.jpg
│   │   ├── image2.jpg
│   │   └── ...
├── labels
│   ├── train
│   │   ├── image1.txt
│   │   ├── image2.txt
│   │   └── ...
├── train.txt
└── data.yaml
```

この場合、`image1.jpg`や`image2.jpg`をアノテーションしようとすると、CVAT上では以下のようなディレクトリ構造として認識されます。

```
data
├── images/train/images/train
│   ├── image1.jpg
│   ├── image2.jpg
│   └── ...
├── labels/train/images/train
│   ├── image1.txt
│   ├── image2.txt
│   └── ...
├── train.txt
└── data.yaml
```

なぜこのような構造になるかというと、CVATは現在`/datas`でマウントされているため、各画像を`images/train/image1.jpg`のように認識します。しかし、YOLO形式の構造である`images/train`と重なることで、結果的に`images/train/images/train/image1.jpg`のように認識されます。

このため、`labels`ディレクトリも同様の構造を求められるため、`train.txt`も上記のように修正する必要があります。あるいは、画像が直下にあるディレクトリをマウントするよう設定を変更することで、より簡単に対応できます（個人的には後者の方法がおすすめです）。

## まとめ

CVATを使ったアノテーション作業では、リモートサーバー上のデータを直接利用することで、効率的なワークフローを実現できます。ただし、ディレクトリ構造の扱いには注意が必要で、特にYOLO形式のデータセットを使用する場合には、適切な設定や構造変更が求められることがあります。

この記事では、私が実際にハマったポイントや解決方法を共有しました。同じようなユースケースに直面している方の助けになれば幸いです！
[備忘録]　Youtubeを見ながらUnityの勉強　7日目

# はじめに
　こんにちは，Umamusume22です。最近、業務でUnityを使っているのですがUnityが分からないので自主的に勉強を始めました。とりあえず、Youtubeを見ながらUnityの勉強を行います。学んだことはここの記事にアウトプットしていきます。
 今日は以下の動画を見てUnityの勉強を行いました

 https://youtu.be/APchcG-n86o?si=V4M2n2r48SxfBjIp

 
 # 備忘録
 - rigidbody：重力の計算を行う
     - Inspectorからrigidbodyの追加を行う
     - 再生ボタンを押したら物体がストンと落ちる (物体が浮いている場合)
 - Componenet：Inspectorに記載されているTransform、Meshといった一つのこと



# 最後に
　勉強した内容を備忘録にしました。備忘録の内容が短くてすみません

 

ここまで記事を読んでいただきありがとうございました！

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteもやっています．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!
AWS Marketplace に公開済製品の新バージョンを追加するときにハマった話

この記事は [**セゾンテクノロジー Advent Calendar 2024**](https://qiita.com/advent-calendar/2024/saison-tech) 16日目の記事です。
シリーズ2は [**HULFT10**](https://www.hulft.com/software/hulft-10) のエンジニアによる投稿をお届けします。

## はじめに
10年振りのメジャーバージョンアップ HULFT10 が 12/10 にリリースされました。

その中で新たなラインナップとして、
コンテナサービスで利用する HULFT10 for Container Services が加わっています。

## AWS Marketplace に製品を出品するためには

- AWS Marketplace 販売者としての登録
- 出品製品の準備
    - 製品形態を決める
    - 価格モデルを決める
    - ドキュメントを整備する(EULA、製品マニュアルなど)
    - リポジトリに製品を登録する
- パブリック公開申請

ざっくりですが、上記のような準備実施した上で申請をおこない、
審査を得て問題がなければ、AWS Marketplaceに製品が出品されます。

## 新バージョンを追加することはとても簡単

AWS Marketplace Management Portal にアクセスし出品製品を選択後、
「Request changes」 - 「Update versoins」 - 「Add new version」から、
必要事項を入力し「Submit」を押すだけです。

![addnewver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944083/aff692fd-d38f-5422-5f04-61c26d419125.png)

## 新バージョンを追加するときに思わぬ所でハマった

### 新バージョン追加時、公開ステータスを指定できない

新バージョンを登録しAWSの承認プロセス(約3時間以内)が完了すると、すぐに製品がパブリック公開されます。

いきなり製品が公開されるため、<font color="red">**登録内容に問題がないかなどの事前検証ができません。**</font>

![versioninfo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944083/7172b700-78df-c113-3b4e-553855a36195.png)

バージョン情報の一覧画面には、「Version visibility」が存在するため、設定できそうに見えますが、新バージョンの登録画面にはそれを指定する項目は存在しません。

### 公開内容に誤りがあった場合、一部の項目しか修正ができない

新バージョンはすぐ公開されてしまうので、登録内容に誤りがないかは事後検証になります。

内容に誤りがあった場合、
修正可能な項目はこれらの製品に関連する説明文のみとなっており、

- Release notes
- Delivery option description
- Usage instructions

<font color="red">**以下の製品を動作させるために必要な項目は変更することができません。**</font>

- Version title
- Container Image
- Deployment templates

したがって、
間違って登録してしまうと登録したバージョン自体が利用できなくなってしまいます。

### 新たに同じバージョンを登録することもできない

登録内容に問題があるため、新規に同じバージョンを登録したくなります。

<font color="red">**エラーになります。既に登録済みのものを削除することもできません。**</font>

![errversion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944083/f9392b22-f250-aae9-e44b-737c8e19d2c1.png)

## ではどうすればよいのか

AWS Maketplace の問い合わせ窓口に誤った部分について修正依頼をかけるしか対処法がありません。AWS Maketplace の問い合わせは英語でおこなう必要があります。

## 今回ハマった件について

AWS Maketplace のご担当者の方々に色々ご協力いただくと同時に、
新バージョン追加時にすぐパブリック公開されるのではなく、

- 非公開状態でバージョンを追加できる
- 登録内容を検証し間違いがあった場合は修正ができる
- 内容の確認が終わったらパブリック公開する

これらの改善リクエストを送らせていただきました。

## まとめ

- 出品製品の新バージョンを追加することはとても簡単
- 新バージョンの追加が完了するとすぐユーザーに公開されます
    - 登録内容が正しいかは事後でしか検証できない
- 内容に問題があっても大事な情報は修正することできない
    - 修正する場合は、AWS Maketplace の問い合わせ窓口で修正依頼が必要


## さいごに

AWS MarketPlace から「HULFT10」と検索していただければ、すぐにご利用が可能です。
この機会にぜひ HULFT10 for Container Services をお試しいただければと思います。