OmniAICreator/Qiita-1.07M huggingface dataset:
VMware Cloud on AWS から FSxN のマウント方式まとめ (ENI, VTGW, VPC Peering)

# 1. はじめに

VMware Cloud on AWS 環境から Amazon FSx for NetApp ONTAP (FSxN) を利用する際、複数の接続方式があるため簡単にまとめて比較してみます。

# 2. ざっくり比較してみた

VMware Cloud on AWS から FSxN をマウントして利用する際の簡単な比較表をつくってみます。

VMware Cloud on AWS は Single-AZ の場合を想定しています。2024 年 6 月時点での情報をベースにしています。

|  | 利用方式 | 接続方式 | FSxN が稼働する VPC | FSxN の AZ 構成 | マウントプロトコル | 接続コスト |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| # 1  | ESXi からマウント  | VPC Peering  | 任意  | Single-AZ のみ | NFS   | 無償 (同一AZ の場合)  |
| # 2  | ESXi からマウント  | VTGW  | 任意  | Single-AZ, Multi-AZ  | NFS  | 有償  |
| # 3  | VM からマウント  | ENI  | Connected VPC  | Single-AZ　のみ  | iSCSI/SMB/NFS  | 無償|
| # 4  | VM からマウント  | VTGW  | 任意  | Single-AZ, Multi-AZ  | iSCSI/SMB/NFS  | 有償  |

:::note warn
VMware Cloud on AWS がストレッチクラスター (Multi-AZ) 構成の場合、現時点では ESXi から FSxN のマウントには対応していない点はご留意ください。
:::

# 3. 接続方式別の構成図

それぞれまとめてみます。

## ESXi からの FSxN マウント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/187afd63-defb-6e58-27c4-eea56a8d3dda.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/adb902d3-1d0c-f55b-b2f1-30640b262eca.png)

## VM からの FSxN マウント

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/c308ee0c-7823-8c4f-a17f-981d13380d54.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/cbe114b7-384b-4a3f-f732-af132f21f0ff.png)

# 4. 接続コストについて

AWS 東京リージョンを前提とし、執筆時点の価格を記載します。
最新の正確な料金は AWS 公式サイトを参照お願いします。

### VPC Peering

「VMware Cloud on AWS」と「FSxN が稼働する VPC」が同一 AZ の場合、接続コストは無償です。

異なる AZ の場合、AZ 間データ転送コストが「データ転送 (IN)」と「データ転送 (OUT)」のそれぞれに USD 0.01/GB が発生し、まとめると `USD 0.02/GB` の転送コストが発生します。

https://aws.amazon.com/jp/ec2/pricing/on-demand/

### VTGW

正式名称は VMware Transit Connect であり、VMware-Managed Transit Gateway (VTGW) とも呼称されます。
VMware がマネージドで提供する AWS Transit Gateway (TGW) であるため、料金は AWS TGW と同一になります。

まとめますと、以下の利用料金が発生します。

`データ処理料金： USD 0.02/GB`
`アタッチメント費用： USD 0.07/hour`

アタッチメント費用は、

https://aws.amazon.com/jp/transit-gateway/pricing/

データ処理料金は当然ながら発生するトラフィックに比例するので、データの読み書きが多いと想定される際には注意が必要です。

一方アタッチメント費用は、VMware Cloud on AWS と FSxN (のVPC) の ２ つにアタッチすると考えます。例えば月額に換算すると、`アタッチメント費用 = USD 0.07/hour x 24 hours x 30 days x 2 attachement = $ 101.8/month`となり、月額は`約100USD`となります。

備考ですが、AWS TGW の通信においては AZ 間通信の費用は別途発生しません。
そのため、上記の費用のみを接続コストとして考慮すれば良いです。

https://aws.amazon.com/jp/about-aws/whats-new/2022/04/aws-data-transfer-price-reduction-privatelink-transit-gateway-client-vpn-services/

# 5. 参考資料

https://aws.amazon.com/jp/blogs/news/amazon-fsx-for-netapp-ontap-with-vmware-cloud-on-aws-virtual-machines/

https://aws.amazon.com/jp/blogs/news/introducing-vpc-peering-for-amazon-fsx-for-netapp-ontap-with-vmware-cloud-on-aws/

https://qiita.com/sanjushi003/items/455de98b17432499cba5

https://qiita.com/sanjushi003/items/c7b3ac92ecbf15d8a668
【初心者向け】仮想環境venvとは？venvの使い方

## 仮想環境とは

仮想環境とは、文字通り仮想の環境のことなのですが、言葉で説明するのは難しいので
仮想環境があった場合となかった場合、どのような違いが表れるのかを説明します。

#### 仮想環境が無い場合
Python3.6がインストールされいるパソコンを考えます。
そのパソコンのデスクトップフォルダにApp.pyを作成し、そのPythonファイルでプログラムを書いたとします。その後、Pythonをアップデートし、Python3.9になったとします。
この時、App.pyはPython3.6を前提として開発したものなので、Pythonのアップデートによりバグが発生したり、動かなくなってしまう可能性があります。

#### 仮想環境がある場合
同様にPython3.6がインストールされているパソコンを考えます。
パソコンのデスクトップに「Work_Python3.6」という作業フォルダを作成し、このフォルダで仮想環境をON(active)にします。このフォルダ内に同様のApp.pyを作成します。
Python3.9を使用したApp.pyを作成したくなった場合、デスクトップに新しく「Work_Python3.9」フォルダを作成し、仮想環境をONにします。その仮想環境内でPythonのアップデートを行います。

すると、「Work_Python3.9」内のみPythonのバージョンが3.9になり、それ以外のフォルダではPythonのバージョンは3.6のまま使用することができます。これが仮想環境です。

## 使用方法
1. 仮想環境を使用したいフォルダを作成し、cdコマンド等でそのフォルダ内に行く
1. ```python3 -m venv <仮想環境名>```コマンドを実行する
1. 仮想環境をactivateする
以下のコマンドを入力します。
Windowsの場合```.\仮想環境名\Scripts\activate```
Mac/Linuxの場合```source ./仮想環境名/bin/activate```
1. パスの先頭に```(仮想環境名)```が表示されていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820079/9f5be80b-19ef-e30a-ba5a-40d7e0141ae9.png)
画像の場合、仮想環境名に「jetson_study」を指定しました。

仮想環境をOFF(deactivated)したい場合は```deactivate```コマンドを入力するだけです。
React-Hook-Formでプリミティブの動的な配列を管理する方法

# はじめに
この記事では、Reactにおいてフォームのバリデーション管理ができる、`React-Hook-Form`ライブラリ（以降はRHF）において、プリミティブ型の配列のバリデーションを行う方法について記述します。

# 対象となる方
- react-hook-formを利用して、string[]のような、動的な配列のバリデーションをしたい人

# Reack Hook Formとは
Reack Hook Form（以降はRHF）とは、Reactアプリケーションにおいて、フォームのバリデーションを簡単に実装できるライブラリです。
その中で、動的な配列を簡単に実装できるフックとして、`useFieldArray()`が提供されています。
https://react-hook-form.com/docs/usefieldarray

## useFieldArray
ドキュメントのexampleにあるように、`fields`が配列自体、`append`・`remove`が配列に要素追加・削除する関数として取得できます。
これによって、TODOリストや参加者リストなど、配列の要素数が定まっていない値に対しても、RHFによるバリデーションの恩恵を受けることができます。

```tsx:実装例
export const FieldArray = () => {
  const { register, control } = useForm({
    defaultValues: {name: 'defaultUser', age: 18}
  });
  const { fields, append, remove } = useFieldArray({
    control,
    name: "hogeList"
  });

  const handleAdd = () => {
    append({name: 'testUser', age: 20})
  }
  
  return (
      <>
        {fields.map((item, index) => (
          <div key={item.id}>
            <input {...register(`hogeList.${index}.name`)} />
            <input {...register(`hogeList.${index}.age`)} />
            <button type="button" onClick={() => remove(index)}>Delete</button>
          </div>
        ))}
        <button type="button" onClick={handleAdd}>ADD</button>
    </>
  );
}
```

ただし、`useFieldArray`が利用可能な配列の種類は、オブジェクトの配列のみです。つまり、キーとバリューを持つデータ構造でなければなりません。

## 問題点
先の説明の際に、`useFieldArray`を利用することで、TODOリストもバリデーション可能となると述べました。
ただし、`useFieldArray`を利用するには、プリミティブの配列ではなく、オブジェクトの配列にする必要があります。
```ts
1. todoList: string[] // プリミティブの配列では動かない
2. todoList: { title: string }[] // オブジェクトの配列は動く
```
2番の実装のように、オブジェクトのvalueを管理したい値にすることで、`useFieldArray`を利用したバリデーションを実装することは可能です。
しかし、TODOリストとしての仕様は、文字列の配列で満たすことができるはずです。
それが、ライブラリの都合のみによって、実装が変わってしまうことは、可能であれば避けたいなと個人的には思います。

そこで、まずは簡単な解決策を考えてみました。
`useFieldArray`使わずに`map`でゴリ押すパターンです。

## 実装例
```tsx

export const TodoList = () => {
  const { register, setValue } = useForm({
    defaultValues: { list: [''] }
  });
  
  return (
    <>
      {list.map((value: string, index: number) => {
        return (
          <>
            <input key={index} {...register(value)} /> 
            <button onClick={() => setValue('list', details.toSpliced(index, 1))} >Delete</>
          </>
          )
      })}
      <button onClick={() => setValue('list', [...list, ''])}>Add</button>
    </>
}
```

ただし、削除・挿入の際に起きる再レンダリング範囲が、useFormを利用してバリデーション実装をしているコンポーネントすべてになってしまうという課題が存在してしまいます...。
フォームの部品すべてが再レンダリングの範囲に含まれてしまうことは、特にフォームの入力要素数が多い場合には、望ましいことではありません。　

# 結論
この記事では、RHFを利用して、動的なプリミティブの配列を扱うときの実装方法について述べていきました。
実現方法としては2つ存在しています。
1. 管理したい値をvalueとしたオブジェクト型にして、`useFieldArray`を利用する
2. `useFieldArray`を利用せずに、mapを用いる

それぞれ、メリット・デメリットが存在するため、管理するフォームの規模や実装方針に合わせて選定すると良いと思いました。
順序回路の作法 その11

# 概要
順序回路を理解する。
リレー回路が、良いと閃いた。
リレー回路で説明してみた。
R1_Bは、リレー１のブレーク接点。
R2_Aは、リレー2のメイク接点。

# flip flop回路
on-off-on-offで出力は、一回のon-off。

```
(+)                                               (-)
|                                                   |
|  SWITCH1                                 R1       |
+----| |----------------------------------(    )----+
|                                                   |
|  R2_A                    R3_B            R2       |
+----| |-----------------+-| |------------(    )----+
|          +-------| |---+                          |
|  R1_B    |        R5_B                   R3       |
+----| |---+--| |---+---------------------(    )----+
|            R5_A                                   |
|  R1_A      R2_A                          R4       |
+----| |---+--| |-------------------------(    )----+
|          +-------| |---+                          |
|  R5_A           R2_B   |                 R5       |
+----| |-----------------+-| |------------(    )----+
|                          R4_B                     |
|  R1_A                                    LAMP1    |
+----| |----------------------------------(    )----+
|                                                   |
|  R5_A                                    LAMP2    |
+----| |----------------------------------(    )----+
|                                                   |
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b0856bbf-3d4e-0038-3fc3-af6300829692.png)


以上。
組込み機器の通信セキュリティ対策は待ったなし！（その２）

## 組込みソフト屋から見た証明書による認証の仕組み

前回（https://qiita.com/Cente_mw/items/fd6b331a45e86f0c3b82） は組込機器に対するセキュリティ対策が待ったなし！な状態だ、ということと、例として認証というものの大事さについてお話しました。今回は認証の中でも秘密情報が第三者に流出しない公開鍵暗号を使った仕組みについて解説します。

普段なんとなく「証明書を使ってサーバが正しいことを確認して…」とか「IoT時代はクライアント証明書が必須で」 のように会話していますが、 __「結局誰が誰を正しいと確認することで、それは証明書の何を拠り所にしているのか？」__ をパッと答えるのは難しいのではないでしょうか。

組込みソフトの世界でもTLS通信が一般的になり、「証明書による認証」を実装する機会も増えていると思います。外部ソフトウエアを導入するとしても、その基本的な考え方を理解しておいた方が良いです。

まず、公開鍵暗号には2つの使い道がある、という話をします。（公開鍵暗号とは何ぞやという部分はQiitaにもたくさん良い解説記事がありますのでそちらをどうぞ。）

__A 送信側が公開鍵で暗号化して、受信側が秘密鍵で復号する__
これは、第三者が見ているような経路で秘密情報を相手に送信する場合に使われます。つまり盗み見防止です。公開鍵で暗号化した情報は秘密鍵でしか復号できないので、仮に第三者が公開鍵を入手しても問題ありません。逆に、秘密鍵は絶対外部に漏らしてはいけません。
この仕組みはTLSでは共通鍵生成に使う乱数を相手に送る際に使われます。そんなに便利なら共通鍵暗号なんて使わずにずっと公開鍵暗号でデータも暗号化すりゃいいじゃん、と思うかもしれませんが、公開鍵暗号の計算はとっても重いのです。特に組み込み機器向けCPUを相手にしている我々から見ると、一回の公開鍵暗号の計算だけで数秒はかかるボリュームです。とてもとてもデータ通信には使えません。

:::note
####
それで思い出しましたが、以下余談です…

そんな知識もまだなかった若い頃、確かOpenSSLをルネサスSH7710環境に移植したときだったと思いますが、この計算の重さがハングアップの症状に見えたことを思い出します。移植は問題ないはずなのに、何度電源投入からやりなおしても同じところで機器の応答がなくなってしまう…。1時間くらいソースコードを追ったのですが原因がわからず、反応がなくなったデバッグシェル画面を目の前に腕組みをして長考に入っていると、処理完了時に表示されるよう仕込んだ「OK」の文字がぽろっと表示されたのです。ハングアップではなく単に公開鍵の計算に数十秒かかっているということにその時初めて気づいて、組み込みプログラミングの厳しさをまた一つ学んだ瞬間でした。
:::

__B 送信側が秘密鍵で暗号化して、受信側が公開鍵で復号する__
これは、確かに本人が送信した内容であることを確認する場合に使われます。つまりなりすまし、改ざん、否認防止です。秘密鍵で暗号化した情報は公開鍵でしか復号できないので、自分が持っている相手の公開鍵が正しい（相手の秘密鍵とペアのものである）という前提において、相手から送られてきたデータを公開鍵で復号して得られた情報は、間違いなく相手が送信したものであると確認できます。公開鍵とペアの秘密鍵を持っている本人以外、そのデータを作ることができません。
だからこそ、このケースでも秘密鍵は絶対外部に漏らしてはいけません。

では、TLSの通信時にサーバ認証とクライアント認証が動く、とはどういうことかというと、サーバ・クライアント双方で上記「B」が走る、ということです。
クライアントの方はTLSハンドシェイクでサーバ証明書（CAの署名入り）を受け取って、別途持っているCAの公開鍵でサーバ証明書を検証（具体的には、署名をCA証明書内の公開鍵で復号した値と、自らサーバ証明書内容から計算したハッシュ値を比較。下図参照。）します。
これらが一致した、ということはサーバ証明書内容について確かであることをCAが保証している、ということです。サーバ証明書内容としてはURLのFQDN、組織名、住所、公開鍵が含まれていますので、結果的にクライアントとしては正しいサーバと通信していることを確認した上でサーバの公開鍵を得るわけです。
ここで、あらかじめクライアントに必要なのは上位CAの証明書（公開鍵）です。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032022/2ca4d0e0-bb36-7d40-d592-ee44892ba2ae.png)
図　クライアントでのサーバ証明書検証

逆にサーバの方は上記と全く同じことをすることでクライアントを認証します。デバイスの数だけクライアント証明書が存在することになるので、どう用意するのかが問題となりますが、IoT時代の現代ではクラウドのクライアント証明書発行サービスを使うケースが多くなってきているように思います。
ここで、あらかじめサーバに必要なのはクライアント証明書の署名をした上位CAの証明書（公開鍵）です。

以上が証明書を使った対象の認証（正当性確認）の仕組みです。これは組み込み開発の立場から見るとTLSだけではなくOTAで外部から受信したファームウエアが正しいことの確認や、セキュアブート時にファームウエアが正しいことの確認などにも応用されており、仕組みを理解しておくと「それを運用するにあたって考えなければいけないこと」が理解できると思います。

## 今日の閑話
セキュリティ関連の開発に携わっていると暗号・復号というキーワードはよく出てきますが、誤りだとわかっていてもつい「復号化」って言ってしまいます。落ち着いて考えるとわかるのですが、「暗号」とは平文から変換された結果を指す言葉で、平文を暗号に変換する行為のことを「暗号化」と言うわけです。一方「復号」は暗号文を平文に戻す行為そのものを指す言葉です。だから「化」の字は不要なんです。あえて「化」の字を使うなら、復号は「平文化」が正しいんでしょうね。


Cente：
https://www.cente.jp/

お問合せはこちら：
https://www.cente.jp/otoiawase/
Jetson Nanoを使用する前準備

Jetson Nanoを使用するための前準備について解説する。

## 準備するもの
1. Jetson Nano本体
1. 冷却ファン
Jetson Nano本体に大きいヒートシンクが付属していますが、冷却能力が不足しているため、Jetson Nano用のサードパーティー製の冷却ファンを購入することをおすすめします。
1. microSD Card 32GB以上
1. WiFiドングル
有線LANを使用するなら不要ですが、これがあればWiFiを使用することができますので、初心者の人は購入をおすすめします。
自分はtp-linkのTL-WN725Nを使用しています。
1. ACアダプター/ケーブル
5V/2A以上の出力が可能なUSBmicroB端子のアダプターとケーブルを用意する。たまにアダプターが対応していてもケーブルが対応していないケースがあるので注意。
1. モニター/HTMLケーブル
ディスプレイポート端子もあるのでそちらでもよき
1. キーボード/マウス
Blutoothは対応していないので、USBレシーバーか有線のものを使用する。

## OSを用意する

1. [公式サイト](https://developer.nvidia.com/embedded/downloads)から
「Jetson Nano Developer Kit SD Card Image」のバージョン4.6.1をダウンロードし、zipファイルを解凍する。
1. SDカードにダウンロードしたOSのイメージファイルを焼く
「[balenaEtcher](https://balenaetcher.jp.download.it/)」等のソフトを使用してSDカードにイメージファイルをFlashする
![スクリーンショット 2024-07-01 105558.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820079/14b571c6-6308-d5ea-91e2-da9c4ddc2d08.jpeg)
「Flash from file」に拡張子[.img]のイメージファイルを選択し、
「Select target」にmicroSDカードを指定する。
「Flash!」をクリックし、完了するまで待つ。


## Jetson Nanoを起動する

1. Jetson NanoにOSが入ったmicroSDカードを挿入し、モニター、キーボード、マウス、WiFiドングルを接続させ、最後に電源のmicroBを接続する。
1. NVIDIAのロゴがモニターに出力され、Ubuntuの設定画面が開かれるので、そこで国の設定やキーボードの設定を入力し、ずっと[Next]から[Finish]までクリックしまくればセットアップ完了。

これでセットアップが完了しました。
OpenCV等を用いて開発する場合、ちゃんとGPU対応版にしないとJetson NanoのGPUを活かすことができないので注意する。

[Jetson NanoにOpenCVをインストールする方法](https://qiita.com/TooMe/items/a4cc9cf4398ee8a5929f)
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（33/100）

【33日目】
トピック 3：SAPS/4HANAのマスタデータ（22/22）

≪問題33≫
連産品と副産物の違いは何ですか。
□プロセスまたは製造指図の決済規則には連産品のみが表示される。
□主要製品から独立して製造できるのは連産品のみである。
□部品表/配合表（BOM）で特殊明細カテゴリによって特定されるのは連産品のみである。
□連産品のみがゼロ在庫評価になる。

≪解答≫
■プロセスまたは製造指図の決済規則には連産品のみが表示される。
□主要製品から独立して製造できるのは連産品のみである。
□部品表/配合表（BOM）で特殊明細カテゴリによって特定されるのは連産品のみである。
□連産品のみがゼロ在庫評価になる。

≪解説≫
◆連産品、副産物、廃棄物の主な特徴は以下の通りです。
（1）連産品
- 主製品と同時に製造される品目であり、与えられた生産工程では、主要品目を分離して製造することはできず、連産品のみの製造もありません。
- 在庫としての評価額があります。
- プロセス指図のライフサイクル終了時に原価決済の対象となり、ヘッダ決済規則に表示されます。
- マスタレシピのBOMにマイナス数量構成品目として設定されます。
（2）副産物
- 主製品と同時に製造される品目であり、与えられた生産工程では、主要品目を分離して製造することはできず、副産物のみの製造もありません。
- 在庫としての評価額があります。
- プロセス指図のライフサイクル終了時に原価決済の対象とはならず、ヘッダ決済規則に表示されません。
- マスタレシピのBOMにマイナス数量構成品目として設定されます。
（3）廃棄物
- 主製品と同時に製造される品目であり、与えられた生産工程では、主要品目を分離して製造することはできず、廃棄物のみの製造もありません。
- 在庫としての評価額がありません。
- プロセス指図のライフサイクル終了時に原価決済の対象とはならず、ヘッダ決済規則に表示されません。
- マスタレシピのBOMにマイナス数量構成品目として設定されます。
もうCSSを書かないで済む！ミニマムCSSフレームワークの紹介

# ミニマムCSSフレームワークの有効性
シンプルなHTMLだけでCSSを書かなくても、見栄えの良いWebページを作成できるフレームワークがあります。
このフレームワークを使うことで、CSSを書く手間が省けるため、開発効率が向上します。
また、デザインが統一されるため、見栄えの良いWebページを作成できます。
セマンティックHTMLを使うことになるので、意味のあるマークアップが記述できます。

![html](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/3185a93a-266b-1a70-9c3d-dc8dd2f1fca3.png)
> 引用：https://www.semrush.com/blog/semantic-html5-guide/

divとcssで構成されたHTMLと比べて、セマンティックHTMLを使うことで、意味のあるマークアップが記述できます。これによりアクセシビリティが向上し、SEO対策にもなります。

## フレームワークの紹介
以下におすすめのミニマムCSSフレームワークを紹介します。
- [simple.css](https://github.com/kevquirk/simple.css)
- [pico](https://github.com/picocss/pico)

## simple.css
simple.cssは、個人的にイチオシのミニマムCSSフレームワークです。
![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/e66058a3-679f-9f5d-24ab-f9b319e748e8.png)

## pico
![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/f2634aef-4545-41fc-90f0-f669d3dd395e.png)

他にも色々なサンプルがあるので、確認してみてください。

https://picocss.com/examples


## まとめ
CSSを書かなくても、見栄えの良いWebページを作成できるミニマムCSSフレームワークを紹介しました。
開発効率が向上し、デザインが統一されるため、Webページ作成におすすめです。
おすすめのフレームワークがあれば、ぜひ教えてください！
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（32/100）

【32日目】
トピック 3：SAPS/4HANAのマスタデータ（21/22）

≪問題32≫
SAP S/4 HANAで品目マスタの採番を使用するときには、何を考慮する必要がありますか。
（２つ選択）
□品目の採番はクライアントレベルで定義される。
□品目コードの最大長は18文字（外部番号）または18文字（内部番号）である。
 □品目の採番はクライアントに依存せずに定義される。
□品目コードの最大長は40文字（外部番号）または18文字（内部番号）である。

 ≪解答≫
■品目の採番はクライアントレベルで定義される。
□品目コードの最大長は18文字（外部番号）または18文字（内部番号）である。
 □品目の採番はクライアントに依存せずに定義される。
■品目コードの最大長は40文字（外部番号）または18文字（内部番号）である。 

≪解説≫
◆各品目に対して一意の品目コードを割り当てる方法は以下の通りです。
（1）外部番号
外部的に品目コードを割り当てる場合、品目登録時に必要な文字列を入力する必要があります。
（2）内部番号
内部的に品目コードを割り当てる場合、品目登録時に品目コードを入力する必要はありません。品目を保存するまで、システムによって適切な項目に内部品目コードが設定され、保存時に次に使用可能な番号が自動的に割り当てられます。
◆使用できる番号割当のタイプは品目タイプによって異なり、カスタマイジングで定義されます。このため、番号範囲グループを更新し、品目タイプをグループに割り当てる必要があります。
◆品目の採番はクライアントレベルで定義されます。
◆品目コードの長さは標準で18文字ですが、カスタマイジングで40文字の長い品目コードを使用する設定も可能です。ただし、長い品目コードには内部採番は使用できません。
テスト管理ツール「TestRail」を試してみた

# はじめに

ソフトウェア開発において、テスト管理は品質保証の観点で必要です。普段、Excelやスプレッドシートを使ってテストケースや結果を管理していますが、今回は専用のテスト管理ツール「TestRail」を試してみました。

## Excelやスプレッドシートの魅力

### 手軽で直感的

Excelやスプレッドシートは、多くの人が使い慣れており、直感的な操作が可能です。学習コストがほとんどかからず、すぐにテスト計画を立てたりデータを入力したりできます。

### 高いカスタマイズ性

自由にシートやセルを編集できるため、プロジェクトのニーズに合わせて柔軟にカスタマイズできます。マクロを使えば、自動処理も追加できます。

### 無料で利用可能

ExcelやGoogleスプレッドシートは、無料で利用できるため、簡単に利用できます。

### オフラインでの利用が可能

Excelはオフラインでも作業ができるため、インターネット接続が不安定な環境でも安心して使えます。また、ファイルをローカルに保存できるのでデータの管理も手軽です。

## TestRailを選ぶ理由

Excelやスプレッドシートには多くのメリットがありますが、TestRailにはそれらを超える利点があります。

### 一元管理と追跡性

TestRailでは、全てのテストケースや結果を一元管理することができます。プロジェクトの進捗状況をリアルタイムで把握し、不具合やテストケースの状態を簡単に追跡できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/9d8720c8-4ee3-22f0-058a-f0f97bb951a5.png)


### テスト実施の準備と結果の共有が容易

テストケースの作成から実施、結果の記録までのフローがスムーズに行えます。テスト実施の準備に必要な情報が全て一元管理されるため、テスト担当者は効率的に作業を進めることができます。さらに、実施したテストの結果を共有する機能が充実しており、関係者全員が容易に最新のテスト状態を把握することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/1f8f503e-f297-ce3f-72a0-fa1aa2141ab4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/d1c3004a-3ec0-1bc8-101c-fe2f26dbc04e.png)


### 直感的なレポート機能

TestRailの詳細なレポート機能を使えば、テストの進捗や不具合の状況を視覚的に確認できます。そのため、関係者やマネージャーへの報告がしやすくなり、意思決定も迅速に行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/8f2b73e5-421d-6ecb-83c9-24cf7f404716.png)


### さまざまな課題管理ツールと連携

TestRailはJIRAなどのバグトラッキングツールなどとシームレスに連携できます。その結果、テストデータの手動入力や移行が不要になり、人的ミスが減少します。

![スクリーンショット 2024-07-01 10.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/a4b8133c-f398-797a-6fd0-c816a93c6a19.png)

## さいごに

Excelやスプレッドシートはその手軽さと高いカスタマイズ性で便利ですし、特に小規模なプロジェクトや予算が限られている場合には、重宝します。

ただ、大規模なプロジェクトになると、TestRailの有り難みがすごく感じられました。一元管理で全ての情報が見えるし、コラボレーションも簡単。レポート機能のおかげで報告も簡単で、意思決定も進みやすそうに思いました！

# 謝辞
記事内の画像はTestRailの商品紹介ページから引用させていただきました。

https://www.techmatrix.co.jp/product/testrail/index.html
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（31/100）

【31日目】
トピック 3：SAPS/4HANAのマスタデータ（20/22）

≪問題31≫
SAP S/4HANAでBOMを定義できるカテゴリはどれですか。
（２つ選択）
□クラス
□受注
□文書構成
□作業区

≪解答≫
□クラス
■受注
■文書構成
□作業区

≪解説≫
◆BOMカテゴリによって、さまざまなオブジェクトを形成し、オブジェクト関連データを管理することができます。
（1）品目BOM：SCM（サプライチェーンマネジメント）で製造される製品の構造を表します。
（2）受注BOM：特定の受注向けに製品を生産するために使用されます。
（3）文書構成BOM：プログラム、技術図面、紙ベースの文書、写真など、複数の文書で構成されます。これらの文書には、文書情報レコードを登録する必要があります。
（4）設備BOM：プラント保全において、設備の構造を説明したり、設備保全のための予備部品を割り当てるために使用されます。
（5）機能場所BOM：プラント保全において、設備を特定の場所にリンクするために使用されます。
（6）WBS（Work Breakdown Structure）BOM：プロジェクト管理における製品の構造を表します。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（30/100）

【30日目】
トピック 3：SAPS/4HANAのマスタデータ（19/22）

≪問題30≫
品目をファントム組立品として設定するにはどうすればよいですか。
（２つ選択）
□BOM内で特殊調達タイプを定義する。
□品目マスタ内で特殊調達タイプを定義する。
□ファントム組立品の明細カテゴリをBOMで変更する。
□ファントム組立品のファントム明細フラグをBOMで変更する。

≪解答≫
■BOM内で特殊調達タイプを定義する。
■品目マスタ内で特殊調達タイプを定義する。
□ファントム組立品の明細カテゴリをBOMで変更する。
□ファントム組立品のファントム明細フラグをBOMで変更する。

≪解説≫
◆ファントム組立品は、品目マスタレコードの特殊調達キーで定義するが、この設定は、BOMで無効化することができる。
（1）品目マスタの設定-品目は、部品をファントム組立品として設定できる最高レベルにある。-ファントム組立品として明細を設定するには、MRP2ビューで特殊調達キーを設定する必要がある。これにより、プラントレベルのこの部分は製造も棚卸もされなくなる。
（2）構成品目のBOMの設定-MRPセクションの構成品目の詳細で、展開タイプまたは特殊調達を設定する。-展開タイプを使用すると、このBOMでファントム組立品を無効にすることができる。この設定により、明細に対して計画手配が登録され、品目マスタ設定が上書きされる。
-BOMの特殊調達キーをファントム組立品に設定すると、関連BOMで使用される場合、この明細がファントムとして扱われる。
-BOMの設定は、用途または製造プロセスに固有のものであるため、品目マスタよりも優先される。
MATLABでシンボリック配列の参照x(1)と代入x(1)に悩まされた話

MATLAB R2024aでやってます。おかしなところがあれば教えてください...
## 軽い背景説明
タイトルだけ見ると何言ってんだという感じですね。
ある配列の１つ目の要素が欲しいときに`q(1)`と書いたら、そうではなく$\boldsymbol{q}(t)|_{t=1}$が返ってきた、なんでや！というお話です。
## 結論
配列の定義の時に、tの関数なら`(t)`を付けておけば、n個目の要素を指定できる。
付けないと代入になっちゃう。
### シンボリックな配列から要素を抜き出したい時
```
syms x(t) y(t)
q = [x(t) y(t)]
q(1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819721/07f441a2-2021-d4af-4e0d-048f99d0edc6.png)

### シンボリックな配列に代入したい時
```
syms x(t) y(t)
q = [x y]
q(1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819721/2d114fcd-2982-09b6-fb51-2d5a5f36bca4.png)
これ、世間のつよつよMATLABユーザーたちは普通に使い分けているのだろうか...

## 背景
ラグランジュの運動方程式の計算を格好良くやろうとした際に、
```math
\frac{d}{dt} \frac{\partial L}{\partial \dot{q_i}} 
- \frac{\partial L}{\partial q_i} 
+ \frac{\partial D}{\partial \dot{q_i}}
= F_i
```
この計算を
```matlab
L = T - U            % ラグランジアン(Tは運動エネルギー、Uは位置エネルギー)
q = [x(t); theta(t)] % 一般化座標
dq = diff(q,t)
F = [u(t); 0]        % 一般化力

eqn = sym(zeros(2,1))
for i = 1:2
    eqn(i) = diff(diff(L,dq(i)),t) - diff(L,q(i)) - F(i)
end
```

こうやりたかったんです。最初は一般化座標の定義のところに`(t)`を付けておらず、付けたらうまくいきました。
高専の卒業研究のころにも同じようなことで困って、その時は結局解決できなかったので別々に定義して計算した気がします。
IBM Power で OS 上での  processor compatibility mode の確認


#### はじめに

Linux(RHEL) サーバーで、IBM Power プロセッサー互換モードを確認するコマンドを少々探したので、備忘録で記載します。


<br>

---

#### プロセッサー互換モードとは？


IBM Power にはプロセッサー互換モードがあり、POWER10 のサーバーで POWER9 モードで稼働する、ということが可能です。

プロセッサー互換モードを筐体のデフォルトと異なるモードを設定すると、一部の機能制約が発生することがあります。(Power10 サーバーで Power9 モードで稼働すると、MMA(Matrix Multiply Assist) が使用できないなど)

また、LPM (Live Partition Mobility)/ IPM (Inactive Partition Mobility) の筐体移動での互換性確認で注意する必要があります。

<br>

・プロセッサー互換モード
https://www.ibm.com/docs/ja/power10?topic=mobility-processor-compatibility-modes





---

#### Linux 上での processor compatibility mode の確認


Linux OS 上で以下を実行すると、プロセッサー互換モードが判明します。



```
# LD_SHOW_AUXV=1 /bin/true | grep _PLATFORM
AT_PLATFORM:     power10
AT_BASE_PLATFORM:power10
```

RHEL サーバーで確認しています。
Power10 サーバーですが、両方とも Power10 モードで動かしている場合です。


<br>

(参考) [Determining processor type and compatibility mode](https://www.ibm.com/docs/en/linux-on-systems?topic=modes-determining-processor-type-compatibility-mode)

"AT_BASE_PLATFORM" が "Actual processor type" で、筐体のデフォルトのプロセッサーモード、
"AT_PLATFORM" が "Processor compatibility mode" で実稼働している プロセッサーモードを示しているそうです。


---



#### AIX 上での processor compatibility mode の確認


AIX の場合は、prtconf コマンドで確認可能です。

https://www.ibm.com/docs/ja/aix/7.3?topic=p-prtconf-command


LANG=C で prtconf を実行して　"Processor" で grep して表示しました。

```
# oslevel -s
7200-00-01-1543

# export LANG=C
# prtconf | grep Processor
Processor Type: PowerPC_POWER8
Processor Implementation Mode: POWER 7
Processor Version: PV_7_Compat
Number Of Processors: 1
Processor Clock Speed: 3891 MHz
  Model Implementation: Multiple Processor, PCI bus
+ proc0                                                               Processor
#
```

このサーバーでは、Power8 サーバーで Power7 互換モードで稼働しています。


----


#### ご参考


Power10 モードを完全サポートするのは、AIXでは 7.3 のみで、AIX 7.2 だと、Power10 サーバでも Power9 モードでの稼働となります。

・[IBM AIX operating system for IBM Power](https://www.ibm.com/downloads/cas/O1YP5RYZ)

> P3. Figure 2. Overview of available AIX support for Power processor compatibility


<br>

VIOS 3.1.4 は Power10 モードでは稼働できないそうです。
(VIOS 3.1.4 のベースが AIX 7.2 ベースのため)

・[New VIOS at 3.1.4 on Power10 shows Effective Processor Compatibility Mode as Power9](https://www.ibm.com/support/pages/node/7014055)

<br>


以上です。
一年間のチームビンゴを振り返る

# はじめに

こちらの記事で取り上げたチームビンゴの振り返りになります。

https://qiita.com/does_not_exist/items/b8d01aea587f6962d87b

# 思ったよりビンゴ揃ってなかった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/6f246420-6c02-4a09-e923-0a912b172da8.png)

- あと一個でビンゴになるパターンが多かった

- 進捗率が半分くらいなので×ではなく斜線になるパターンも多かった

- 毎月一人あたり4つの目標(業務系2つ＋プライベート系2つ)を決めていたが、大体半分の2つを達成する傾向にあった

# でもコミュニケーションの一環なので揃えることが目的ではない

一年間のビンゴシートを見返すと当時の流行りや会話内容などを思い出し懐かしく感じる

# おわりに
毎月のビンゴ内容が思いつかないときはランダムなお題を提供するような取り組みを入れても面白そうです。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（29/100）

【29日目】
トピック 3：SAPS/4HANAのマスタデータ（18/22）

≪問題29≫
SAPS/4HANAで製品マスタを登録するときに必要となる情報はどれですか。
（２つ選択）
□ビューの選択画面
□プラントの選択画面
□品目タイプ（製品タイプ）
□基本数量単位

≪解答≫
□ビューの選択画面
□プラントの選択画面
■品目タイプ（製品タイプ）
■基本数量単位

≪解説≫
◆製品マスタデータ管理アプリを使用することで、製品のマスタデータを効果的かつ迅速に検索、照会、編集、登録、およびコピーすることができます。
◆新規製品マスタデータレコードを登録する際の必須入力項目は以下の通りです。
（1）製品番号
（2）製品タイプ
（3）基本数量単位
（4）テキスト
ffmpegを利用してフォルダ内のファイルを一括変換する

# ffmpegを使ってaviをmp4に変換する
ffmpegは基本的に以下の使い方をする.
MacのQuickTimeでも開くことので出来るmp4ファイルとするためには、"-pix_fmt yuv420p"などのオプションをつけて変換する必要があります[^1].
[^1]:[【備忘録】ffmpegを利用した動画ファイルフォーマット変換](https://qiita.com/mriho/items/a16b3c618c378efeb58f)

```
$ ffmpeg -i input.avi -pix_fmt yuv420p output.mp4
```

# 複数ファイルの一括変換
参考文献[^2]をもとに作成したのが以下のコマンドである.
[^2]:[Macで複数のAVCHDファイルを、ffmpegを使ってmp4、movファイルに一括変換する方法](https://doctor-m.xyz/mac-ffmpeg-conversion/)
```
$ for f in *.avi ; do  ffmpeg -i $f  -pix_fmt yuv420p ${f%.avi}.mp4 ; done;
```

これによりフォルダ内のavi拡張子を持つものについてdo以降の繰り返し動作を行う. また, `${f%.avi}.mp4`とすることでファイル名から`.avi`を除いたものを出力ファイル名とすることができる.

# 複数ファイルの再生速度の一括変更
以下のコマンドを実行する.
```
for f in *.mp4 ; do  ffmpeg -i $f  -pix_fmt yuv420p -vf "setpts=PTS*50" ${f%.mp4}-002.mp4 ; done;
```
`-vf "setpts=PTS*50"`で再生速度を変更している.
    たとえば, 0.5倍速にしたい場合は`-vf "setpts=PTS*2"`とすればよい.
[AWS SUMMIT2024 セッションレポート] DAY2 基調講演　ビルダーとテクノロジーが加速する次のイノベーション

# はじめに
受講セッションの個人的な所感と、メモです。
メモの内容は、誤字脱字などあるやもしれませんが、ご了承ください。

# 概要
> 最新のテクノロジー活用により、ビルダーにとってこれまでにないイノベーションの機会が到来し、迅速にアプリケーションを構築するだけでなく、可用性、弾力性、持続可能性、コスト、パフォーマンスも実現します。さらに生成AIにより、企業はデータをより戦略的かつ簡単に活用でき差別化やイノベーションを加速します。テクノロジーが創り出す新しい時代を、それらの実現に向けてのAWSの戦略や支援を、これまで日本のお客様と創出してきたイノベーション事例とともにご紹介します。

# 所感
2日目、基調講演です。
初日に、昨年以上の参加者の数に圧倒され、その盛り上がりをひしひしと感じましたが、
2日目になっても、その盛り上がりは冷める事はありませんでした。

AWSを使い始めてから、いろんなイベントに参加し、AWSに追加されていく多種多様な、様々な機能やサービスを見てきましたが、その勢いは衰えるどころか年々増していますね。

今や２４０を超えるサービス数、年間３４１０回のアップデート・・・・。
とてつもないです。

さて、2日目の基調講演も、やはり話の中身はAIですね。

活用事例における、そのスケール感の大きさは初日でも感じた事ですが、やはりここでも感じました。
そしてそれに追随している中小企業やスタートアップが多数存在すると言うことも、
参加者・展示などからも感じ取ることができ、自分たちもしっかり向き合って取り込んで行かねばと思いました。

印象的で面白いと思ったのは、JRさんの音の学習。
動作音を学習させて異常検知をする、というのはまさAIならではの使い方ですね。
人間では、超能力レベルで優れた音感を持つ一握りの天才ぐらいにしかできないことも、AIを使えば誰もがその能力の恩恵を受けることができます。

そして、電通デジタルさんのAIペルソナの話もとても興味深かったです。
この活用は可能性がすごくありそう。
終わりがけぐらいにブースにいくと、チラシがなくなった、と言うことなので、とても反応が良かったのでしょう。

ともあれ、基調講演を経て一つ言える事は、AI関連含め、エンジニアとしてのモチベーションをとても刺激された事。
上手ですね、すごくやる気にさせられた気がします。

# 受講メモ

## AWS SUMMIT2024
150以上のセッション
260超える展示

## AWSの歴史
### 2006年
Amazonのビジネス課題の解決が起源

### 2011年
世界で5番目に東京リージョン

### 2018年にローカル大阪リージョン開設
2021年にフルオープン

日本に2兆2600億の投資

年間3410回のアップデート
240を超えるサービス

## 金融
SBI証券
- オンライン取引システムを展開
- 1日2兆円の取引
- IaC

## 自動車
自動運転
- TIER IV
- 開発にマネージドサービスを活用

## 通信事業
docomo
- 5G無線ネットワークの展開にAWSを利用

プロジェクトカイパー
- 地球上のあらゆる場所にブロードバンドネットワークを提供

## 航空
ANA
- グループのデータレイクを作成し、分析
- データの民主化を進めている

## 生成AI
- コンピューティング
- 基盤モデル
- アプリケーション

LLM開発支援プログラム

### リコー
- 独自のAIモデルを3ヶ月で作成
- 45%のコスト削減と12%の開発コスト削減

## Bedrock
- 基盤モデルを選択し、活用
- 自社データを使用しチューニング
- 責任あるAI

---

**高度に発達した技術は魔法と見分けがつかない**

## AI時代

JR東海　中央新幹線リニア
- データドリブン
- 業務の中心にデータを
- データに仕事をさせる

リニア
- 地上からの遠隔操作
- データをもとに指示を行う

保守用車
- IoTを活用して監視、管理
- 機械学習による電気設備の異常検知
    - 動作音を学習させて異常検知

---

## 次なる革新
- Project Ceiba
    - AWS上でAIスーパーコンピュータをNvidiaと共同開発
- 生成AI専用チップ
    - 推論時のエネルギー効率が50%向上

万能なモデルは存在しない

責任あるAI
- Responsible AI

今日成功しているモダンビジネスは、すべてデータビジネス

アナリティクス
- データベース
- データレイク

Bedrock
- モデルのトレーニングにユーザーデータは使用しない
- モデル選択
- カスタマイズに必要なツール
- 責任あるAIに関するベストプラクティス

---

電通デジタル
- 無限AI Ads
    - 訴求軸発見AI
- 100人のAIペルソナを作りDEIを評価
- 無限AI Chat
    - 2ヶ月のプロトタイピングで完成
        - For sales
            - チャット履歴を要約分析、トークスクリプトを作成
- 対話AIを活用しデータを蓄積し、広告、セールスの効率を最大化

# 関連
- [AWS SUMMIT2024 参加レポート](https://qiita.com/yukiMiyoshi_fcafe/items/220bf886aa94ea552d3e)
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（28/100）

【28日目】
トピック 3：SAPS/4HANAのマスタデータ（17/22）

≪問題28≫
以下のどの時間要素が作業手順に含まれますか。
（３つ選択）
□ピッキング梱包時間
□開始待ち時間
□移動時間
□段取時間
□製造後余裕

≪解答≫
□ピッキング梱包時間
■開始待ち時間
■移動時間
■段取時間
□製造後余裕

≪解説≫
◆作業手順に含まれる時間要素（作業の所要時間）は以下の通りです。
（1）作業間時間 ⇒ 開始待ち時間、完了待ち時間、移動時間
（2）実行時間 ⇒ 段取時間、処理時間、片付時間
◆製造前余裕と製造後余裕は、品目マスタレコードで日程計画余裕キーを使用して定義します。
【HTML&CSS】disabled属性ではまったこと

# disabled属性とは
HTMLの論理属性で、付与対象のフォームコントロール要素の各操作が有効か無効かを
決定するもの。
各操作とは、例えばフォーカスの付与・ボタン操作・入力・選択などのこと。
※論理属性：存在するか否かでtrue/falseを判定する属性のこと。
　　　　　　属性が存在すればtrue、存在しなければfalseとなる。
　例：```disabled```・```checked```・```required```など

# 例：buttonタグでのdisable属性の挙動
**①正しい挙動：disabled属性自体の有無で制御する方法**
・非活性化（押下不可）としたい場合
```HTML
<button disabled>ボタン</button>
```
・活性化（押下可能）としたい場合
```HTML
<button>ボタン</button>
```
**②間違った挙動：diabled属性の値を真偽で制御する方法**
・非活性化（押下不可）としたい場合
```HTML
<button disabled="true">ボタン</button>
```
・活性化（押下可能）としたい場合
```HTML
<button disabled="false">ボタン</button>
```
上記のようにdisabled属性の値の真偽値で制御できると勘違いしやすいのですが、
この場合は両方とも非活性となってしまいます。
理由はdisable属性自体は両方存在しており、その値の内容に関わらずtrueと
なってしまうためです。
# 活用例
JavaScriptを利用して、[無効化][有効化]ボタンにより動的に[ボタン]ボタンの活性状態を
変更するコードを記述します。
```HTML
<button id="target_button">ボタン</button>
<button onClick="updateDisabled()">無効化</button>
<button onClick="updateEnabled()">有効化</button>
```
JavaScriptでは、disabledプロパティをbool値で指定することでdisable属性自体の
有無を設定することができます。
```JavaScript
const targetButton = document.getElementById("target_button");
function updateDisabled(){ targetButton.disabled = true; }
function updateEnabled(){ targetButton.disabled = false };
```
・[無効化]ボタンを押下時
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/0121b35a-6919-df02-c1e3-940ed8a0c1af.png)
※Chrome[検証]で確認すると、以下のようにdisabled属性が付与されています。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/024386e5-dc8e-d579-ed2d-c31d53290560.png)
・[有効化]ボタンを押下時
![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/75629389-4f5f-2da4-6ea3-b594323d2a00.png)
※Chrome[検証]で確認すると、以下のようにdisabled属性がありません。
![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846445/6f2bc38c-02a5-3183-b5d5-e863f5b30af2.png)

また、参考までにですが以下のようにsetAttribute、removeAttributeメソッドでも
同様の動きが実現できます。しかし、上記方法の方がシンプル・直感的・高パフォーマンスのため、
基本的には上記方法が良いと思います。
```JavaScript
const targetButton = document.getElementById("target_button");
function updateDisabled(){ targetButton.setAttribute("disabled", ""); }
function updateEnabled(){ targetButton.removeAttribute("disabled", ""); }
```
※プロパティ操作```targetButton.disabled = true;```が
　属性操作```targetButton.setAttribute("disabled", "");```と比較して高パフォーマンス
　である理由ですが、調査したところ以下のようになります。
　　・属性操作：DOMツリーを辿って対象要素を発見し、属性を操作（トラバースという）
  　　　　　　　　を行うため、その分時間がかかる
　　・プロパティ操作：対象要素をトラバースせず、直接要素のプロパティにアクセス
　　　　　　　　　　　し、操作を行う

　なんとなくはイメージできた（ような気がする…）のですが、このあたりの知識に詳しい
　方がいらっしゃいましたらコメントで教えていただけますと幸いです。


# 参考
https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/disabled

https://developer.mozilla.org/ja/docs/Web/API/Element/setAttribute

https://developer.mozilla.org/ja/docs/Glossary/Boolean/HTML
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（27/100）

【27日目】
トピック 3：SAPS/4HANAのマスタデータ（16/22）

≪問題27≫
どのような場合に派生部品表/配合表（BOM）を使用しますか。
□複数の品目のBOMが類似している場合
□1つの品目に1つの選定可能BOMがある場合
□複数の品目に複数のBOMがある場合
□1つの品目に複数のBOMがある場合

≪解答≫
■複数の品目のBOMが類似している場合
□1つの品目に1つの選定可能BOMがある場合
□複数の品目に複数のBOMがある場合
□1つの品目に複数のBOMがある場合

≪解説≫
◆さまざまな状況に応じて、複数の（代替）BOMを使用して管理することができます。
（1）1つの品目に複数の構成品目の一覧がある場合 ⇒ マルチBOMを使用します。
（2）多くの品目で類似の構成品目が使用されている場合 ⇒ 派生BOMを使用します。
pytrendsでGoogleトレンドデータを取得してみる

## はじめに
pytrendsは[Googleトレンド](https://trends.google.co.jp/trends/)のデータを取得するためのライブラリです。

https://github.com/GeneralMills/pytrends

## インストール
`pipenv`が導入されている前提で進めます。
```bash
$ pipenv install pytrends
```

## get started
まずは、動かしてみます。今日本でトレンドになっている検索ワードを取得してみます。
```python
from pytrends.request import TrendReq

pytrends = TrendReq(hl="ja-JP", tz=360)

print(pytrends.trending_searches(pn="japan"))
```

出力はこのようになります。
![console](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/542fd715-6140-234d-e24c-4e4c03472e5f.png)

最近のトレンドを取得できました。

## リアルタイムのトレンドを取得する

リアルタイムのトレンドを取得するには、`realtime_trending_searches`を使います。
```python
print(pytrends.realtime_trending_searches(pn="JP"))
```
返却値は`pandas.DataFrame`です。

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/f5b6e1d1-54fb-f21f-b051-3ef25f635aaa.png)

## まとめ
Googleトレンドのデータを取得するためのライブラリ`pytrends`を使ってみました。
今ある技術を組み合わせることで、トレンドの分析や予測などに使えるかもしれません。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（26/100）

【26日目】
トピック 3：SAPS/4HANAのマスタデータ（15/22）

≪問題26≫
部品表/配合表（BOM）の登録を始める前に回答する必要のある質問は以下のどれですか。
（２つ選択）
□BOMのステータスは何か。
□BOMに必要な保管場所はどれか。
□BOMで品目タイプを許可するか。
□品目の基本数量単位は何か。

≪解答≫
■BOMのステータスは何か。
□BOMに必要な保管場所はどれか。
■BOMで品目タイプを許可するか。
□品目の基本数量単位は何か。

≪解説≫
◆BOMを登録する前提条件として、以下の要件を決定しておく必要があります。
（1）BOMヘッダに対して品目マスタが存在するか。
（2）BOMをどのように使用するか。
（3）この品目タイプがBOMで許可されているか。
（4）どのプラントでBOMが必要か。
（5）いつBOMを有効にする必要があるか。
（6）品目がBOMグループに属しているかどうか。
（7）BOMのステータスは何か。
（8）初期値が設定されているか。
基本情報の学習

## はじめに
今更ですが4月頃に基本情報技術者試験を合格したので、学習した教材やスケジュール、勉強方法などをまとめたいと思います。

## 取得きっかけ
とりあえず生でのノリと同じくらい、とりあえず基本情報をとりなさいと言われたのでとってみました。あと、お給料も増えるのでそれも狙いです。

## 取得した後感じたこと
気のせいかもしれないですが、取得した後は先輩たちとの会話がすっと入ってくるようになった気がします。
以前は分からない単語が飛んできてそれについて考えるせいで相手が聞きたい意図を理解できませんでしたが、取得後は「あ～、それね」というように意図を理解して会話や説明を考える余裕ができたなと思います。

## 筆者の前提レベル
ITパスポート取得
SIerエンジニア２年目
ITパスポート取得済みであること、エンジニアということもあり完全に未経験の方よりかはとっつきやすく
取り組めたかなと思います。

## 試験勉強で感じたこと
新形式になり易化したとの声がありましたが個人的には全然難しかったです。特に科目Bはしっかり対策を
しないと、慣れていない人は苦戦すると思いました。


## 基本情報技術者試験とは？
ITの基本を問う試験で、登竜門的な立ち位置にある試験です。
IT用語や知識を幅広く学べます。
|  |  |  |  |  |
|:-:|:-:|:-:|:-:|:-:|
| 試験| 試験時間  | 出題形式  | 出題数  | 合格点  |
| 科目A | 90分  | 四択  | 60問  | 600/1000  |
| 科目B | 90分  | 多肢  | 20問  | 600/1000 |

## 勉強時間
平日１時間、休日3時間程です。２か月勉強したので、だいたい100時間くらいになります。

## 学習スケジュール
４週目：ひたすら過去問道場で10年分の過去問をやる
２週目：科目Bの参考書の問題を解く
２週目：科目Aと科目Bのサンプル問題を解く

### ４週目
もともとITパスポートをやっていたので、参考書などは読まずひたすら過去問道場というところで過去問を解いていました。80%の正答率を連続５回くらいできるまでやりました。
コツとしては、正解の問題を選ぶのではなく不正解の問題に対して「これは、こういう理由で違う」と消去してから最後に残った正解のものを選ぶというやり方が個人的には良かったです。
過去問からそのまま出題される場合もあるので、範囲を広げて10年分行いました。
暗記も一つの手ですが、同じような語句で全然違う意味の単語などもあるので理解しながらの方が結局早いと思います。

https://www.fe-siken.com/fekakomon.php

６週目
科目Bに着手し始めます。ここでは、科目Aと全く毛色の違うことをやるので戸惑う方もいらっしゃると思います。１問１問しっかりと理解して行うことが重要です。すぐ答えは見ず、わからなくても１５分は考えるようにしましょう。ここでは問題数に限りがあるので、科目Aのように多くの問題をひたすらに解くやり方をしていると、答えはわかるけど解き方はわからないという状態になり最悪、詰みます。
私は以下の本で勉強しました。~~女の子が可愛かったので買いました~~
解説が丁寧で、難しい問題には動画解説がついているのでアルゴリズムを全くやったことがない方でもすらすらできるようになると思います。
科目Bに関してはこの本を１冊をやりきれば十分だと思っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733438/4a1227de-7150-acb6-ae23-1643b45b55b3.png)

### ８週目
ここからは、科目A・科目Bを並行して過去問を再度解いていきます。この時、サンプル問題というのがあるので科目Bは腕試しを兼ねて解いてみましょう。初見で８割解ければ本番でも問題ないかと思います。
サンプル問題は実際の試験より簡単に作られているので６割以下だった場合はちょっと気合を入れて復習したほうがよいかもしれないです。

## 最後に
こんなに偉そうなことを書きましたが、実際の試験での点数は
科目A　654/1000、科目B　600/1000
とかいうとんでもないがけっぷち点数でした。コスパを求めている方の参考になれば、幸いです。
配列の要素を削除する方法

## 要素の値を指定して削除する
deleteメソッドを使用することで、引数の値と一致する要素だけを削除することができる。
```
a = [1,3,5,6,1,7]
a.delete(1)
a
=> [3, 5, 6, 7]
```
## 添え字から削除する
delete_atメソッドを使用することで、特定の位置にある要素だけを削除することができる。
```
a = [1,3,5,6,1,7]
a.delete_at(0)
=> 1
a
=> [3, 5, 6, 1, 7]
```
## 繰り返し処理を行い、条件に当てはまるものを削除する
delete_ifメソッドを使用することで、配列の要素を１つずつ取り出し、条件に当てはまるものだけを削除することができる。
例えば、配列の中から、偶数の要素を削除するコードは以下のようになる。
```
a = [2,3,6,3,2,8,9]
a.delete_if do |n|
  n.even?
end
=> [3, 3, 9]
```
処理の流れとしては、配列の要素を１つずつ取り出し、ブロック変数nに渡す。
n.even?の戻り値が真である場合（つまりnに偶数が入っている場合）に、要素を削除するという流れになっている。
SvelteKitでContentfulのデータを取得・表示する



**今流行りのSvelteKitを使ってみたい**、そしてContentfulも活かしたい、でも[Contentful公式のスターター](https://www.contentful.com/sveltekit-starter-guide/)はなんか古い！
ので、下記はSvelteKitでContentfulのデータを取得して表示するためせっせと調べながらやったメモです。

# SvelteKitを入れる

[SvelteKitのドキュメント](https://kit.svelte.jp/docs/creating-a-project)を頼りに`npm create svelte@latest`などしてSvelteKitを入れる。

```package.json
{
	"name": "svelte",
	"version": "0.0.1",
	"private": true,
	"scripts": {
		"dev": "vite dev",
		"build": "vite build",
		"preview": "vite preview",
		"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
		"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
		"lint": "prettier --check . && eslint .",
		"format": "prettier --write ."
	},
	"devDependencies": {
		"@sveltejs/adapter-auto": "^3.0.0",
		"@sveltejs/kit": "^2.0.0",
		"@sveltejs/vite-plugin-svelte": "^3.0.0",
		"@types/eslint": "^8.56.7",
		"eslint": "^9.0.0",
		"eslint-config-prettier": "^9.1.0",
		"eslint-plugin-svelte": "^2.36.0",
		"globals": "^15.0.0",
		"prettier": "^3.1.1",
		"prettier-plugin-svelte": "^3.1.2",
		"svelte": "^4.2.7",
		"svelte-check": "^3.6.0",
		"tslib": "^2.4.1",
		"typescript": "^5.0.0",
		"typescript-eslint": "^8.0.0-alpha.20",
		"vite": "^5.0.3"
	},
	"type": "module",
}
```

# Contentfulのトークンまわりを準備する

Space settingsで確認できる[Space ID](https://app.contentful.com/spaces/47971ckyi12s/api/keys)と[Content Delivery API](https://www.contentful.com/developers/docs/references/content-delivery-api/?utm_source=webapp&utm_medium=knowledge-base-delivery_api&utm_campaign=in-app-help)を準備し、`.env`に転記する。

```.env
CONTENTFUL_SPACE_ID = 
CONTENTFUL_ACCESS_TOKEN = 
```

# ContentfulのSDKを入れてデータを取得する

```
$ npm install contentful
```

```src/lib/contentful.ts
import contentful from 'contentful';

export const client = contentful.createClient({
  accessToken: process.env.CONTENTFUL_ACCESS_TOKEN || "",
  space: process.env.CONTENTFUL_SPACE_ID || "",
});
```

# 取得したデータを出力する

```src/routes/+page.server.ts
import { client } from '$lib/contentful';

export const load = async () => {
  const posts = await client.getEntries({ content_type: 'post' });
  return {
    posts: posts.items
  };
};
```

`content_type:`の部分は適宜Contentfulのモデル名を入れてください。

```html:src/routes/+page.svelte
<script lang="ts">
  export let data: { posts: any[] };
</script>

{#each data.posts as post}
  <article>
    <h1>{post.fields.title}</h1>
    <p>{post.fields.content}</p>
  </article>
{/each}
```

できた……？

めちゃめちゃ手探りなので引き続き精進します。

参考: https://dev.to/wesleymutwiri/create-a-blog-with-contentful-and-sveltekit-3bd6
PostgreSQL: 変数の使い方

## 変数に値を設定

```text
city=> \set table cities
```

## 変数を使う

```text
city=> \d :table
                        Table "public.cities"
   Column   |         Type          | Collation | Nullable | Default 
------------+-----------------------+-----------+----------+---------
 id         | character varying(10) |           | not null | 
 name       | text                  |           |          | 
 population | integer               |           |          | 
 date_mod   | date                  |           |          | 
Indexes:
    "cities_pkey" PRIMARY KEY, btree (id)
```

```text
city=> select * from :table;
  id   |  name  | population |  date_mod  
-------+--------+------------+------------
 t3461 | 広島   |      72814 | 2001-09-14
 t3462 | 福山   |      41738 | 2001-07-21
 t3463 | 東広島 |      92513 | 2001-06-12
 t3464 | 呉     |      93167 | 2001-09-29
 t3465 | 尾道   |      95419 | 2001-03-18
 t3466 | 竹原   |      82314 | 2001-02-21
 t3467 | 三次   |      76152 | 2001-08-16
 t3468 | 大竹   |      37541 | 2001-07-07
 t3469 | 府中   |      46518 | 2001-10-09
(9 rows)
```
画面中央のコンテンツだけスクロールできるようにしたい

# はじめに

このような動きを作ります。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/e7fa50d4-dcef-268d-b0fa-9303ff8d1544.gif)

以下のサイトからWebデザインのレイアウトを探していたところ、

https://choooodoii.com/

こちらのサイトに目が留まりましたので真似てみました。

https://choooodoii.com/gallery/580/


# やりたいこと
- 中央コンテンツをスクロールできる
- 中央コンテンツをスクロールしても左右コンテンツはスクロールされない
- 左右コンテンツのボタンをクリックすると該当箇所にジャンプできる


# コード

```tsx:App.tsx
import React, { useRef } from 'react';
import { Box, Button, Container, Flex, VStack } from '@chakra-ui/react';
import { Content1 } from './pages/Content1';
import { Content2 } from './pages/Content2';
import { Content3 } from './pages/Content3';

function App() {
 const contentRef1 = useRef<HTMLDivElement>(null);
 const contentRef2 = useRef<HTMLDivElement>(null);
 const contentRef3 = useRef<HTMLDivElement>(null);

 const handleScrollToContent = (ref: React.RefObject<HTMLDivElement>) => {
    ref.current?.scrollIntoView({ behavior: 'smooth', block: 'center' });
 };

 return (
    <>
    <Flex direction="row" h="100vh" overflowY='scroll'>

      <Container w="50%" h="100vh" position="relative" zIndex="20" >
        <Box width="500px" h="100vh" ref={contentRef1}><Content1></Content1></Box>
        <Box width="500px"  h="100vh" ref={contentRef2}><Content2></Content2></Box>
        <Box width="500px"  h="100vh" ref={contentRef3}><Content3></Content3></Box>
      </Container>

      <VStack spacing={4} w="50%" position="fixed" right="0" top="50%" zIndex="30">
        <Button onClick={() => handleScrollToContent(contentRef1)}>中央コンテンツ1へ</Button>
        <Button onClick={() => handleScrollToContent(contentRef2)}>中央コンテンツ2へ</Button>
        <Button onClick={() => handleScrollToContent(contentRef3)}>中央コンテンツ3へ</Button>
      </VStack>
    </Flex>
    </>
 );
}

export default App;

```

## ポイント
- レイヤー構造をつくる
左右コンテンツのz-indexを高くすることで、スクロール時の画面の動きを中央コンテンツと切り離すことができます。



# おわりに
Webデザインのレイアウト集は眺めているだけでも面白いですね。
【Figma Plugins】Quick actionsでFigma Pluginsを動かす

## はじめに
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/a6bdaa44-66b6-72cb-41c7-5b8d5b4d76da.png)

FigmaのPluginを開発する際、Figma PluginsをQuick actionsから動かしたいと思ったことはありますか？
この記事では、Figma PluginsをQuick actionsから動かす方法を解説します。

## Figma PluginsをQuick actionsから動かす

### 0. Quick actionsの基本

Quick actionsでPluginを動かすには、プラグイン名を入力します。
コマンド名は、任意です。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/4bed4b3f-1383-e3ef-8a8d-b5a3e3700b80.png)

パラーメーターも一緒に入力することができます。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/176ff8f6-9e8d-dff1-8739-8e4809939e1c.png)

:::note alert
`figma.showUI`が実行されていると、Quick actionsのFigma Pluginsで実行しないので、注意してください！

:::



### 1. command・parameterを決める 
まずは、Quick actionsで、入力するcommand・parameterを決めます！
command・parameterを決めるには、`manifest.json` 以下のようにします。

```manifest.json
{
  "menu": [
    {
      "name": "Create Text",
      "command": "text",
      "parameters": [
        {
          "name": "Text",
          "key": "text",
          "allowFreeform": true,
          "optional": true
        }
      ]
    }
  ]
}
```

menuは、以下のようなInterfaceになっています。
```ts
type ManifestMenuItem =
  // Clickable menu item.
  { name: string, command: string, parameters?: ParameterList[], parameterOnly?: boolean } |
  // Separator
  { separator: true } |
  // Submenu
  { name: string, menu: ManifestMenuItem[] }
```


+ **Clickable menu item**
    + `name`：メニューアイテムの名前
    + `command`：メニューアイテムのコマンド
    + `parameters`（任意）：メニューアイテムに合わすパラメーター
    + `parameterOnly`（任意）：コマンドなしのパラメータのみ実行するか
+ **Separator**
    + 区切り線
+ **Submenu**
    + `name`：メニューアイテムの名前
    + `menu`：サブメニューのアイテム

### 2. パラメーターにサジェストを表示させるようにする
`figma.parameters.on("input", () => {})` を使うことで、サジェストを表示させることができます。

以下のようにすることで、key が color の時に suggestItem が表示されます。

```ts
figma.parameters.on("input", (
  ({ parameters, key, query, result }: ParameterInputEvent) => {
    switch (key) {
      case "color":
        const suggestItem = [
          "Color",
          "Color 2"
        ]
        result.setSuggestions(suggestItem.filter(s => s.includes(query)))
      break
    }
  }
))
```

### 3. 実行する
`figma.on("run", () => {})` を使うことで、Quick actionsからFigma Pluginsを実行することができます。

以下のようにすることで、commandがtextの時に、`create` 関数（自作）を実行しています。
```ts
figma.on("run", ({ command, parameters }: RunEvent) => {
  if (command === "text")
  if (parameters) {
    create(parameters.color, parameters.text);
  }
})
```

## まとめ
この記事では、Figma PluginsをQuick actionsから動かす方法を解説しました。
この記事を参考に Quick actions から Figma Pluginを実行してみてください！

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
Reactでメタ情報の書き換えはreact-helmetでなくreact-helmet-asyncを採用しよう

React実装でtitleやmeta、linkなどのメタ情報を書き換える時は、[react-helmet](https://github.com/nfl/react-helmet)がよく使用されていました。
しかし、現在では4年以上更新されていないことと、もしインストールして使おうとすると`Warning: Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code.`という警告が出てしまいます。

react-helmetは長らく更新が止まっていますが、[react-helmet-async](https://github.com/staylor/react-helmet-async)という後継となるようなライブラリが出ています。
更新も直近まで行われているため、HTMLのメタ情報を書き換えるライブラリを採用したい場合は、react-helmet-asyncをおすすめします。

# 使い方
使い方はREADMEを参照してください。

https://github.com/staylor/react-helmet-async?tab=readme-ov-file#readme

# 警告について
発生している警告は、StrictモードでUNSAFE_componentWillMountを使用することは、バグの発生原因となる可能性があるため非推奨としているということを意味しています。
react-helmetの依存ライブラリであるreact-side-effectが、UNSAFE_componentWillMountを使用しているため警告が発生しています。

# React 19からライブラリが不要になるかもしれない？
React 19から、ライブラリを使わずにHTMLのメタ情報を書き換え可能な機能が搭載されるそうです。

# 参考
https://chaika.hatenablog.com/entry/2021/07/27/160000

https://dev.classmethod.jp/articles/react-helmet-async-instead-of-react-helmet/

https://zenn.dev/terass_dev/articles/3a1d59f4a3421b
【Docker Storage】バインドマウントでホストマシンのファイルを Ruby コンテナで実行する

# はじめに
この記事では、Docker のバインドマウント機能を利用して、ホストマシンのファイルを Ruby コンテナで実行する手順について記載します。
バインドマウントへの理解促進の一環で行っています。

https://docs.docker.com/storage/bind-mounts/

# バインドマウントとボリューム
バインドマウントと似た概念として、ボリュームがあります。

https://docs.docker.com/storage/volumes/

両者ともデータをコンテナとは別に管理するという役割を持っていますが、データの保存先が異なります。

- バインドマウント : ホストマシンのファイルやディレクトリ
  - ユースケース : ホストマシンのエディタでファイルを編集して、コンテナで実行する 
- ボリューム : ホストマシンの Docker のストレージ
  - ユースケース : データベースサーバーのデータを保持する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/3ff42e0e-3872-8e9f-41df-b3dc5f280c38.png)
[^1]
[^1]:https://docs.docker.com/storage/bind-mounts/

:::note
ボリュームについては、[こちら](https://qiita.com/Yasushi-Mo/items/fbf08cbb612138c69c3e)の記事に記載しています。
:::

# 開発環境
開発環境は以下の通りです。

- Windows 11
- Docker Engine 26.1.1
- Ruby 3.3.3

# コンテナにバインドマウントする
まず、コンテナにバインドマウントするためのデータとして、ホストマシンに Ruby ファイルを追加します。

```hello.rb
puts "Hello world from host machine"
```

次にボリュームと同じく`docker container run` コマンドの `--mount` オプションを指定して、作成した Ruby ファイルをマウントします。

https://docs.docker.com/reference/cli/docker/container/run/#mount

| \<key> | \<value> | 備考 |
|---|---|---|
| type | bind |  |
| source | "$(pwd)" | `pwd` コマンドで作業ディレクトリの絶対パスを展開 |
| target | /my-work | 任意のパス |

それでは、**Ruby ファイルを作成したディレクトリ**で、Ruby コンテナを起動します。

```powershell
# docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker container run                              `
--name ruby                                       `
--rm                                              `
--interactive                                     `
--tty                                             `
--mount type=bind,source="$(pwd)",target=/my-work `
ruby:3.3.3                                        `
bash
```

:::note
コンテナ内でファイル操作をしたいため、`[COMMAND]` に `bash` を指定しています。それに伴いコンテナを対話操作するため `[OPTIONS]` に `--interactive` と `--tty` を指定しています。
:::

プロンプトが変わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/40d15cbf-983f-2068-4fde-fb7dd0bebff0.png)

`destibation`（マウント先）として指定したパスに Ruby ファイルが存在するか確認します。

```powershell
ls /my-work/
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/5033e9db-5f26-db28-cfea-d156fd3c30e9.png)

Ruby ファイルの内容を出力します。

```powershell
ruby /my-work/hello.rb
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/1199fa76-5932-3cc9-e8d9-fec9b426de2e.png)

ホストマシンで Ruby ファイルの内容を変更して、再度 Ruby ファイルの内容を出力します。

```hello.rb
puts "Hello world!"
```
```powershell
ruby /my-work/hello.rb
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/1b0847ec-bca2-d89a-f2df-5cdd70daac4f.png)

:::note warn
コンテナで Ruby ファイルを削除すると、ホストマシンからもファイルがなくなるので、注意が必要です。

```powershell
rm /my-work/hello.rb
```
:::

# 参考
- [docker container run](https://docs.docker.com/reference/cli/docker/container/run/)
- [Volumes](https://docs.docker.com/storage/volumes/)
- [	鈴木亮「開発系エンジニアのためのDocker絵とき入門」秀和システム、2024](https://www.shuwasystem.co.jp/book/9784798071503.html)

# 関連記事

https://qiita.com/Yasushi-Mo/items/fbf08cbb612138c69c3e
Go言語の特徴

# はじめに
ソフトウェア開発の世界には、多くのプログラミング言語があります。
Python、JavaScript、C、Ruby、最近ではRustやKotlinなど、それぞれ特徴があります。
様々なプログラミング言語に触れてきました。その中でも私が特に印象に残っているGo言語について解説したいと思います。
# Go言語とは
"**Go**"という名前にもあるようにGoogleが開発した言語です。
2009年に発表され、現在では様々なサービスに利用されています。
日本のサービスだと、メルカリやクックパッドなどがあります。[^1]
![スクリーンショット 2024-06-06 160725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/2075dcef-9ad5-e3ed-9f04-dfe5fde9b159.png)
# 特徴
特徴は大きく分けて3つほどあります。後ほど順に解説します。
* コンパイラ型
* 記述がシンプル
* 未使用の変数、モジュールはエラーになる

## コンパイラ型
まずはコンパイラ型であるという点です。
プログラム言語は大きく分けると、インタプリタ型とコンパイラ型があります。

インタプリタ型はpythonを代表としたソースコードを**1行ずつ**機械語プログラムに変換する言語です。

コンパイラ型は**全て**変換して実行するので**実行速度が速い**という特徴があります。
## 記述がシンプル
pythonのように、変数宣言で型推論が行われます。以下は変数宣言の例です。
```go
var num int //初期値なし
var num int = 0 //初期値あり
var num = 0 //型推論あり
num := 0 //型推論あり varなし
```

他の言語では普通に備わっている機能がいくつか使用ができません。
その分書き方が統一され、シンプルになります。
以下に例を挙げます。
* while文
* 三項演算子
* 例外処理
## 未使用の変数、モジュールはエラーになる
プログラム内に**未使用**の変数やモジュールがあるとエラーになり、ビルドができません。
```go:test.go
package main

import "fmt"
import "io"
func main(){
    a := 1
    b := 2
    c := 3
    fmt.Printf("num = %d", a+b)
}    
```
ビルドしようとするとエラーになります。

```
.\test.go:4:8 "io" imported and not used
.\test.go:8:2 c declared and not used
```
動作しているコードに宣言されている変数やモジュールは**必ず**どこかで使われているので、可読性が高まります。

# 開発方法
クロスコンパイルに対応しています。
Windows環境でMacOSやLinuxで動作するバイナリを生成するといったことが可能です。
Go開発者の多くはVisual Studio Code を使用しています。[^2]
環境構築も簡単なので是非触ってみてください。

https://qiita.com/melty_go/items/c977ba594efcffc8b567

[^1]:[Go.dev](https://go.dev/)
[^2]: [Go Developer Survey 2020 Results](https://go.dev/blog/survey2020-results#:~:text=For%20the%20first%20time%2C%20editor%20preferences%20appear%20to%20have%20stabilized%3A%20VS%20Code%20remains%20the%20most%20preferred%20editor%20(41%25)%2C%20with%20GoLand%20a%20strong%20second%20(35%25).%20Together%20these%20editors%20made%20up%2076%25%20of%20responses%2C%20and%20other%20preferences%20did%20not%20continue%20to%20decrease%20as%20they%20had%20in%20previous%20years.)