OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのリモート実行環境ライブラリを公開しました

## Pythonリモート実行環境｀python-remoteexec｀

```sh
$ pip install python-remoteexec
```

## 何を作ったか

隔離されたサーバーやコンテナ環境でPythonコードを安全に実行するための新しいリモート実行環境です。

Pythonのexec組み込み関数を、別の場所で実行するライブラリ、といった感じです。

## 何のためにあるのか

ChatGPTのCodeInterapterのように、AIエージェントにソースコードを生成させてそのコードを実行する手法で、セキュリティを担保するために使用する想定です。

その他にも、ループ実行の周波数を指定したり、エラー発生時の例外の扱い方などを細かく設定できるので、AI生成コードのような正体のよく分からないコードを実行環境の側から制御することが出来ます。

またブレークポイントの設定等が出来るので、デバッグ環境の構築にも使えるんじゃないかと思います。


# 使い方：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595605/2c52155d-74e7-7362-2237-28f81d374d03.png)

- サーバー側

```python
from remoteexec.communicate import *
from remoteexec.inout import *

listen_addr = '1.1.1.1'
listen_port = 9165
sync_frequency = -1
fpS = SocketIO(listen_port=listen_port, listen_addr=listen_addr)
server = Communicator(connection=fpS, sync_frequency=sync_frequency, use_compress=True)
server.host(reciever=SocketReciever())
```

これでリモート実行環境のサーバーが起動します。
クライアントがサーバーにソースコードを送り付けて、サーバー上での実行結果をリアルタイムに同期する感じです。


## クライアント側

- オブジェクトの共有とループ周波数の制御

```python
import time
share = {'hoge':[]}
cond = RunningConditions(shared_objects=share)
code = """\
for i in range(500):
    if i%100==0:
        hoge.append(f'{i}')
"""

## The loop runs at 50Hz in the server
start = time.time()
runner.exec(code, cond=cond, frequency=50)  # take 10 sec to run
print(time.time() - start)  # around 10
print(','.join(share['hoge']))  # display '0,100,200,300,400'
```

上の例では、ループの実行周波数を50Hzに設定しています。

サーバーに送ったソースコードでは、500回のループが走るので、返ってくるまで10秒ほどかかることになります。

指定しないと最大速度での動作になります。サーバーのCPUリソース食い潰し対策などに。

- サーバー → クライアント側の関数呼び出し

```python
import os
@snippet_share
class clz1:
    def __init__(self):
        self.n = ''
    def p(self):
        return print(self.n)

share = {'clz':clz1()}
cond = RunningConditions(shared_objects=share)
code = """\
clz.n = 'aaazzz'
clz.p()
"""
runner.exec(code, cond)  ## display 'aaazzz'
```

`@snippet_share`を指定してクラスを作成して、共有オブジェクト化すると、サーバーに送ったソースコードの中からそのクラスのメンバーにアクセス出来ます。

関数呼び出しの引数と戻り値はシリアライズ可能な型である必要があります。

- セキュリティ対策

```python
cond = RunningConditions(allow_global_functions=['int'])
code = dedent("""\
a = int(10)
""")
runner.exec(code, cond)
```

組み込み関数`exec`のglobalsに相当します。何も指定しないと、`globals=None`相当、つまりPython標準の組み込み関数は何も使えません。

```python
cond = RunningConditions(allow_import_modules=['time'])
code = """\
import time
"""
runner.exec(code, cond)
```

インポートを許可するパッケージを指定します。何も指定しないと、`import`文が動きません。何でもインポート出来るようにするには、`dynamic_import=True`を指定します。

```python
cond = RunningConditions(allow_global_functions=COMMON_BUILTINS,
                         allow_import_modules=COMMON_MODULES)
```

とりあえず安心して使えるPython標準関数とパッケージのみ使うには、このようにします。`open`のようなファイルシステムに影響が出る関数とパッケージは使えなくなります。


# リポジトリ

https://github.com/reiwa-ai/python-remoteexec

他にもDockerコンテナ内でソースコードを実行するなど、色々な機能があります。

詳しい使い方はリポジトリのドキュメントを参照してください。

ではでは


-----

### おまけ

langchainで生成コードをDocker内で実行するようにしてほしかったので[Issue](https://github.com/langchain-ai/langchain-experimental/issues/25)立ててます。だれか実装してPR出してくれると嬉しいです。
Playストア付きWSAを入れよう

# WSAについて

https://github.com/LSPosed/MagiskOnWSALocal

「Magisk on WSA」というプロジェクトが2021年10月くらいからあって、これはwindows11のWindows Subusystem for Android(WSA)でAmazonアプリストアではなくGoogle Playストアを使いたいときにめちゃくちゃ重宝していました。当然僕もこれを使っていました。

WSAサ終(※)前に手持ちの別のマシンにも入れておきたいと思って再度試したのですが、どうやら現在のバージョンではPlayストアのサポートを終了した様子。許せん！
確かに LSPosed/MagiskOnWSALocal のクレジット欄からOpenGAppsが打ち消されています。

(※)

https://pc.watch.impress.co.jp/docs/news/1574050.html

# 代替手段
#### 旧バージョン？
LSPosed/MagiskOnWSALocal の前のバージョンを使えばいいんじゃね？と思い、git checkoutするも
```
keyerror: "there is no item named 'lib/x86_64/libmagisk64.so' in the archive"
```
とかいうエラーが出てビルド不可能。筆者はlinuxに詳しくないので断念。

### フォークをためそう

https://github.com/YT-Advanced/WSA-Script

なんとなんと、ビルド済みの実行ファイルを配布してるニキがいました。

https://github.com/YT-Advanced/WSA-Script/releases/latest
↑ここから↓をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719521/b15220bc-938b-0404-7db1-e51430bbc14d.png)

ダウンロードした.7zファイルを展開して(Windows11ではエクスプローラーでも直接できるようになりましたね。いい時代になったものです)、`Run.bat`を実行します。これだけです。簡単！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3719521/a50d5cd9-57d5-27a7-6f4f-5eeb9d3ac5ab.png)
祝！日本語プログラミング言語Mind生誕４０周年 2025年は日本語プログラミング言語イヤーなのか？祝！なでしこ生誕２０周年

# はじめに
日頃ご支援・交流いただいておりますみなさま、あけましておめでとうございます。今年もどうぞよろしくお願いいたします。


# 祝！日本語プログラミング言語Mind生誕４０周年 
今年は日本語プログラミング言語Mindが生誕４０周年を迎えます。バージョンも今年のリリースでついについに９となるようです。開発者の@killyさんにおかれましては長年の開発のご尽力にたいへん敬意を表します。また、日頃とくだんのご支援まことにありがとうございます。
わたしのような市井のユーザーにできることは限られますが、引き続きQiita上で応援させていただきたく、よろしくお願いいたします。

# 祝！日本語プログラミング言語なでしこ生誕２０周年
なでしこの生誕年は2004年説がありますが、なでしこの１５周年記念サイトが2020年にできていますので、公式的にはなでしこのバージョン１が正式リリースされた2005年をもって生誕すると想定いたします。ということはなでしこは今年で生誕２０周年ということに。Mindとの年の差はちょうど２０歳なんですね:grin:

https://www.eznavi.net/site/nade/event/15th-nadesiko/

上記サイトの利用者年齢分布や利用目的のアンケートは非常にすばらしいです。もしかして今年もやられるのでしょうか？開発者の方々のご尽力にたいへん敬意を表します。
わたしはユーザーともいえないような存在ですが、引き続きなでしこをQiita上で応援させていただきたく、よろしくお願いいたします。

# おわりに
「Mind」「なでしこ」この２つの日本語プログラミング言語の開発者は２名様ともQiitaユーザーさんでもあります。[^1] [^2] 
本格的なコンパイラを実装することは非常にたいへんなことです。この記事を読んでいただいたQiitaユーザーのみなさん、ぜひ日本語プログラミング言語の開発者Qiitaユーザーさんを応援して、盛り上げていきましょう！

[^1]: Qiita [スタックコンピュータとFORTHと日本語プログラミング言語Mind(2/2)](https://qiita.com/killy/items/c5a966aeb3be20b748fb)　参照
[^2]: Qiita [これまでに実装した「日本語プログラミング言語」を回顧しRust版を動かす](https://qiita.com/kujirahand/items/903a15d4dc38a5262557)
NuxtプロジェクトにTailwindCSSをセットアップする方法


NuxtにTailwindCSSを導入する一連の作業を残しておきます．

## 環境

- Node: 23.5.0
- npm: 10.9.2

## Nuxtプロジェクトの作成

Nuxtのプロジェクトを[リファレンス](https://nuxt.com/docs/getting-started/installation)の通りに作成します．

```bash:shell
npx nuxi@latest init my-project
```

下記の確認プロセスのあとNuxtプロジェクトが作成されます．

1. パッケージマネージャの選択
2. Gitリポジトリの初期化

状況に合わせて選択します．

この時点で以下のように実行するとNuxtの開発用サーバが立ち上がります．

```bash:shell
cd my-project
npm run dev -- -o
```

デフォルトは http://localhost:3000 でアクセスできます．

## Tailwind CSS の導入

Nuxtのモジュールとして公開されている[Nuxt Tailwind](https://tailwindcss.nuxtjs.org/)を利用してみます．
[リファレンス](https://tailwindcss.nuxtjs.org/getting-started/installation)の通り作業します．

```bash:shell
npx nuxi@latest module add tailwindcss
```

`nuxi module add` を利用すると nuxt.config.ts に勝手にモジュールが追加されるので楽ですね．

```typescript:nuxt.config.ts
export default defineNuxtConfig({
  :
  modules: ['@nuxtjs/tailwindcss']
  :
})
```

tailwind.config.js と asset/css/tailwind.css が無くて怒られるため準備します．
tailwindcss モジュールを使って tailwind.config.js を生成します．

```bash:shell

npm install -D tailwindcss
npx tailwindcss init
```

次に，assets/css/tailwind.cssを作成し，Tailwind CSS のユーティリティクラスをインポートします．
ディレクトリが存在しない場合は作成してください．Nuxt Tailwindのデフォルト設定でフォルダ階層とファイル名が指定されているので特別な理由がない限りは守ります．

```diff_css:~/asset/css/tailwind.scss
+ @tailwind base;
+ @tailwind components;
+ @tailwind utilities;
```

ファイルの位置を変更したい場合は次節で後述するnuxt.config.tsに設定を変更することができます．

# Nuxtプロジェクトの設定変更

[Nuxt Tailwind](https://tailwindcss.nuxtjs.org/getting-started/configuration)ではnuxt.config.tsに`tailwindcss`要素を追加して設定するようです．
tailwind.cssのファイル名や置き場所を変更する場合は`tailwindcss.cssPath`を設定するといいようです．
TailwindCSSのクラスが認識されるように`tailwindcss.config.content`要素を追加します．

```diff_typescript:~/nuxt.config.ts
  // https://nuxt.com/docs/api/configuration/nuxt-config
  export default defineNuxtConfig({
    compatibilityDate: "2024-11-01",
    devtools: { enabled: true },
    modules: ["@nuxtjs/tailwindcss"],
+   tailwindcss: {
+     cssPath: ["~/assets/css/tailwind.css", { injectPosition: "first" }], // Default
+     config: {
+       content: [
+         "~/components/**/*.{js,vue,ts}",
+         "~/layouts/**/*.vue",
+         "~/pages/**/*.vue",
+         "~/plugins/**/*.{js,ts}",
+         "~/app.vue",
+         "~/error.vue",
+       ],
+     },
+     viewer: true,
+   },
  });
```

`tailwindcss.viewer` は何ぞと思い `true` にしてみましたが，[http://localhost:3000/\_tailwind](http://localhost:3000/_tailwind) にデザインのカタログのようなものが一覧で確認できるようです．

導入作業は以上です！

## 動作確認

簡単に動作確認をしてみます．
app.vue を簡単に下記の通りに変更してみました．

```vue:app.vue
<template>
  <div class="font-black text-center text-3xl">Nuxt Tailwind</div>
</template>
```

クラスを指定するだけでデザインが変更されていたら導入完了！

![Nuxt Tailwind](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36125/479c2a13-e98f-255b-949f-9d4f4acc1a79.png)
【アップデート情報】Amazon Locations Serviceがマレーシアリージョンで利用可能になりました

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

AWSアップデート情報で2024年最後の情報が投稿されていたので簡単ですが共有いたします。

### Amazon ロケーション サービスが AWS アジアパシフィック (マレーシア) リージョンで利用可能になりました（2024/12/30)

https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-location-service-aws-asia-pacific-malaysia-region/

- 翻訳
>本日、AWS アジアパシフィック (マレーシア) リージョンでAmazon Location Serviceが利用可能になったことをお知らせします。Amazon Location Service は、開発者が簡単かつ安全にマップを追加したり、場所やジオコードを検索したり、ルートを計画したり、デバイス追跡機能やジオフェンシング機能をアプリケーションに有効にしたりできるようにする位置情報サービスです。Amazon Location Service を使用すると、開発者は新しい位置情報プロジェクトを開始したり、既存のマッピングサービスのワークロードを移行したりして、コスト削減、プライバシー保護、および他の AWS サービスとの統合のしやすさのメリットを得ることができます。

ざっくり言えば、**マレーシアリージョンで位置情報サービスのAmazon Location Serviceが利用可能になった**っぽいですね！

マレーシアを拠点に観光ビジネスを展開されている方にとっては、自国のリージョンでサービス管理できるので少しうれしいのかなぁと思いました。

それでは、コンソール上で利用可能なのか見てみたいと思います。

:::note info
余談ですが、マレーシアリージョンはデフォルトで有効化されていないため、有効化処理（AWS Billing>アカウントのこ項目で設定可能）が必要となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/354ff359-ee27-2ddc-84f1-cc08df8fd6ad.png)

また、有効化処理時に知ったことですが、ミラノリージョンとアラブ首長国連邦リージョンは有効化しようとするとエラーになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/09b70bac-439c-11ce-a752-f16416a18956.png)
:::


### コンソール画面

コンソール画面で、マレーシアリージョンが選べるようになっていましたね

- トップ画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/981db49c-425f-12c7-e88c-b685a13a034e.png)

- APIエクスプローラー画面（マレーシアリージョン）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/083f9843-d403-e6b0-4d63-9fe69ae02c39.png)

### 余談

スタートメニューにデモ用アプリの画面ページがあるのでクリックしてみると、こんな感じで地図が表示されるようですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846878/f1215bc4-cd1e-2080-7e60-82895d8962d0.png)

おそらく、そこまで取り上げられないアップデートかと思いますが、自分の備忘として記事化してみました。
今後、Amazon Location Service機能の味見も行ってみたいと思いました。

### 参考サイト

**サービス紹介サイト**

https://aws.amazon.com/jp/location/

**ブログ記事**

https://qiita.com/yoshii0110/items/26022631e2672169f7bd

https://qiita.com/zumax/items/762d69911de9248a62ab

最後まで記事を読んでいただきありがとうございました👍
今一度基礎からアウトプットしていこう。AWSサービス【ストレージ】編

### Simple Storage Service(S3)
![Arch_Amazon-Simple-Storage-Service_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/19e62648-56db-011e-513b-cd0651233ec1.png)
- インターネット対応の完全マネージド型オブジェクトサービス。
#### 無制限のストレージ容量
- **パケット**と呼ばれるデータの入れ物を作ることでデータの保存ができる。ストレージ容量は無制限である。
#### 高い耐久性
- 一つのリージョンを選んで複数のAZに自動的にオブジェクト形式で冗長化しながら保存する。
#### セキュリティについて
- アイデンティティベースのIAMポリシー・・・使用するユーザやサービスに付与する。
- リソースベースのパケットポリシー・・・S3パケット自身にポリシーを付与する。
- アクセスコントロールリスト(ACL)・・・割愛
#### 主なユースケース
- アプリケーションデータ保存
- HTML,CSS,JavaScriptなどの静的コンテンツのホスティング
- データレイクのためのデータ保存と分析
---
### Macie
![Arch_Amazon-Macie_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/4cc38ae8-bab6-064a-d6bc-2dd2858c68b7.png)

- S3に保存されているデータを自動的にスキャンし、個人情報やキー情報を分類する。パスワードやクレジットカード情報がないか検出してくれる。
---
### Elastic Block Store(EBS)
![Arch_Amazon-Elastic-Block-Store_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/8e954d26-112e-11d1-0a0f-251b9a7f7346.png)

- EC2インスタンスにアタッチして使用するブロックストレージサービス。EBSは必要な時に必要な容量を確保して利用できる。
#### AZ内でレプリケート
- 同じAZ内の複数サーバ内で自動的にレプリケートされるため、ハードウェア障害があってもデータがなくならない。EBSでスナップショットを作るとS3の機能でスナップショットがバックアップ保存される。S3自体も複数のAZに複数の施設に自動的に冗長化させる。

#### ボリューム暗号化
- 暗号化を有効化にすることでボリュームが暗号化される。スナップショットも暗号化される。設定後は追加操作必要なし。

#### 永続的ストレージ
- EBSはインスタンスのホストとは異なるハードウェアで管理されている。よってインスタンスを一時停止して再起動してもデータは残っている。これとは反対に、インスタンスのローカルホストを使用するのがインスタンスストア。こちらはEC2が起動している時にのみ、データを保持する。

#### ボリュームタイプの変更
- 汎用SSD
- スループット最適化HDD
- プロビジョンドIOPS SSD(io2)
- Cold HDD
いずれも使用中に変更することが可能。容量の変更も可能。

#### スナップショット
- AZが使用不可になった場合の対応策としてスナップショットがある。
 ---
### Elastic File System(EFS)
![Arch_Amazon-EFS_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/7abc61e1-8f4a-b347-a115-ccbe38e700bf.png)

- LinuxサーバからNFSプロトコルでマウントして使用するファイルストレージ。複数のAZで冗長化されているときに使う。このように高可用性をとる場合やインスタンスにデータを保存したくない場合に使われる。
---
### FSx for Windows File Server
![Arch_Amazon-FSx_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/30e9b45b-75a1-6fac-06b7-e2e809196441.png)

- SMBプロトコルを利用したWindowsファイルサーバのマネージドサービス
### Backup
![Arch_AWS-Backup_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332976/cdcb3c56-2a68-da8d-9ffc-66d41ea9d990.png)

- これまで紹介したS3,EBS,EFS,FSxのサービスのバックアップかつ一元的な管理をするサービス。
Inventor  VBA  のご紹介

インダストリー５．０の時代
３Dモデルを時間かけて作っていて大丈夫⁉
   
Inventor　VBA　による　３Dモデル自動作成技術の紹介です。

若手技術者の教育用にテキストとしてまとめた
『Inventor VBA　テキスト　入門編　』　から抜粋してご紹介します。
　
 ※１.具体的な３Dモデル作成例（押し出し品、回転軸）を　Youtubeにupしています。
 　テキストで扱っている例になります。ご覧ください。
　　Excelデータを使って３Dモデルを短時間で作成できるのを実感ください！
  　Inventorの３D作成技術を知らない人でも簡単に３Dモデルが作成できます。
    https://www.youtube.com/watch?v=cNgs2d4Ilgc
    https://www.youtube.com/watch?v=ZPjvXaJuFe4
※２.テキストは　下記ホームページからご購入いただけます。
 　　　　https://www.autotex.org/
     
 テキストの目次
![スクリーンショット 2025-01-01 100045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/bcf0de43-500b-0381-59b9-08cbbfb277c7.png)
![スクリーンショット 2025-01-01 100402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/23590b24-f7c9-81d6-3dfa-783ef6a0bdd5.png)
![スクリーンショット 2025-01-01 100514.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/5e38010b-d0f1-e088-bce8-802897ab9391.png)
![スクリーンショット 2025-01-01 100541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/f5082f07-ff26-12b6-4069-0a9b2fcd31a4.png)

紹介サンプル・・・基本から実務範囲（回転軸、押出し品等）をカバーしています。　
![REI　１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/1823acb7-2816-f5b3-e77f-496a85badd1e.png)
![REI　2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/758ceaf8-f648-b94b-8aaf-398e09da7b4e.png)
![REI　3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/f3ff1916-437a-4abb-a84a-587465c698b6.png)
![REI　4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/4621d714-6081-d088-db5a-7872dce43b38.png)

オブジェクトモデル図（入門編で扱う範囲のみ）
![obj zu1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/61567de4-8d7f-f84f-c9d6-de75b77c3c51.png)
![obj zu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3373976/3a6f2cbd-a29a-87ab-32a9-8d4887acd33a.png)
firewall設定をtuiで触る方法

# 1. 目的
firewallのtuiによる操作
# 2. 背景
「設定から運用管理までBIND9によるDNSサーバ構築」という本を読みながらサーバ構築していたところ、system-config-securitylevel-tuiというコマンドが記載されていた。
どうやらfirewallをtuiで操作するコマンドらしいが、CentOS5までにしかないコマンドのため、現環境で触る方法を調査。
# 3. 環境
CentOS7.2
# 4. 実施手順
&emsp;1. system-config-firewall-tuiコマンドのyumインストール
&emsp;2. firewalldの停止
&emsp;3. firewallのtui操作
# 5. 詳細手順
&emsp;5.1. 仮想マシンがインターネットにつながっており、yumコマンドが実行できる状態である前提。
&emsp;&emsp;下記コマンドを実行し、パッケージをインストール。
```
yum install system-config-firewall-tui
```
&emsp;5.2. firewalldが起動状態だとtui起動コマンドが使えなかったので、下記コマンドを実行して、firewalld停止。
```
systemctl stop firewall
```
&emsp;5.3. 下記コマンドを実行し、tui起動。
```
system-config-firewall-tui
```
# 6. その他検証
設定ファイルは/etc/sysconfig/iptables。
tui画面でfirewallを有効にすると上記設定ファイルが作成される。
今回は信頼したサービスとしてDNSにチェックボックスを入れたが、
上記設定ファイルに53ポートへ送られるtcp/udpパケットが許可される設定となっていた。
# 7. 参考リンク
https://centos.bungu-do.jp/archives/31
https://qiita.com/dharry/items/72e26a1606eb6e6cc355
24/1/1 読書記録 ~土台からしっかり学ぶソフトウェアテストのセオリー~

# 書籍
[土台からしっかり学ぶソフトウェアテストのセオリー](https://amzn.asia/d/hvYdYEd)

# 第2章 ソフトウェアテストのプロセス

## 2-3. テストフェーズとテストレベル

### 用語集 :pencil: 

 - テストフェーズ
     - ソフトウェア開発におき、ある種のテストを行う期間を意味する
     - ex) 「xx/ooに実装が終わるので、xx/△△から単体テストに入る予定です」
 - テストレベル
     - テストの対象物やテストの目的、テストの内容などによって論理的に決まるもの
     - ex) 単体で動作するコンポーネントが想定通り動作するかを確認するため、単体テストを行う

### 気付き / 学び:writing_hand_tone5: 

#### テストフェーズとテストレベルの違いは？

- テストフェーズが時間的工程を表し、テストレベルはテストの論理的な種類を表す
- 統合テストのフェーズ（テストフェーズ）で何らかの欠陥が見つかる場合
    - 修正したコンポーネントが意図した挙動かを確認する（テストレベルとしての）単体テストを行う

## 2-4. ソフトウェアテストのプロセス

### 気付き / 学び:writing_hand_tone5: 

#### ソフトウェアテストで必要な業務は？

- テスト計画
- テストのモニタリングとコントロール
- テスト分析
- テスト設計
- テスト実装
- テスト実行
- テスト完了

## Chap2. 感想 

テスト行程について網羅的に学ぶことができた。

特に、V字モデルとW字モデルのメリット・デメリットを整理できたことが大きな学び。
自分の開発組織では要件定義 > 設計 > 実装 > 単体テスト > 統合テスト...となるため、V字モデルのフローに沿って実行されてそう。

しかし、品質を重視するのであれば、W字モデルに寄せ、テスト設計を実装前に入れても良いのかもしれない。業務が逼迫している現在、実用は考え難いが、覚えておきたい。
セイウチ演算子と出会った経緯

# 課題
Pythonでファイル読み取りを行いたくなった。

一行ずつwhileループでぶん回して読み込みたい。

```python
line = file.readline()
while line:
    print(line)
    line = file.readline()
```

と、書くのは、なんだか野暮ったいので、もっとスマートに書けたらいいな。

# 課題の検討

C言語は下記みたいな感じにした覚えがある。

```C
while (c = getchar()) {
    /* to do something */
}
```

よしじゃあ、こうしようと、以下のように書き、無事シンタックスエラーを引き起こしました。

```Python
while line = file.readline(): # <--- SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
    print(line)
```

エラー文が教えてくれたのを試したら、動きました。

```diff:Python
- while line = file.readline(): # <--- SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
+ while line := file.readline(): # <--- SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
    print(line)
```

知らない演算子が出てきたので、調べてみると、`:=`は、セイウチ演算子、Walrus operatorというらしい。

https://docs.python.org/ja/3.13/whatsnew/3.8.html#assignment-expressions

これで代入すると、代入の結果を式として利用できるということで、C言語でやったようなことができるらしいです。

# 所感

おそらくC言語ベースでこのような動作を厳密に理解するなら、アセンブラレベルで考えないとならない雰囲気があるため、深入りはしないでおきます。

ですが、最近、Rustを学んでいるため、式とは？文とは？をあいまいに再確認したところなのですが、なんとなくそれを思い出す学びでした。


# 余談

余談ですが、はじめに書いたCのコードは、こう書いたほうがまだマシでしょうか。

```c
while ((c = getchar()) != EOF) {
    /* to do something */
}
```

C言語を一から書くことが少なくなったので、だいぶ記憶がふわふわしていますし、実行環境がプライベートにないため、上記コードは試していません。

ご注意を。
equalsメソッドについての理解を深める　Java

## はじめに
インフラの分野でも、Iac化が進んで行くと考えています。そこで、ノウハウが体系だっているものが学び易いと考えて、Javaを学びはじめました。

## 今回は、`equals`メソッドをオーバーライドして、`Sample`クラスの2つのオブジェクトを比較する方法です。

### 間違い探し

```java
public class Sample {
    private int num;
    
    public Sample(int num) {
        this.num = num;
    }
    
    public boolean equals(Sample obj) {
        if (obj == null) {
            return false;
        }
        return this.num == obj.num;
    }
}

public class main {
    public static void Main(String[] args) {
        Object a = new Sample(10);
        Object b = new Sample(10);
        System.out.println(a.equals(b));
    }
}
```

### 1. `equals`メソッドのオーバーライドに関する問題

まず、`Sample`クラス内での`equals`メソッドは`Object`クラスの`equals`メソッドをオーバーライドするべきですが、シグネチャが少し間違っています。

- `Object`クラスの`equals`メソッドは、`Object`型の引数を受け取ります。したがって、`Sample`クラスの`equals`メソッドは、`Object`型の引数を取るべきです。
- さらに、`Object`型の引数に対応するために、型キャストを行う必要があります。

☝️修正後のコードでは、`equals(Object obj)`に変更します。

### 2. `equals`メソッド内での型キャスト

`equals`メソッドをオーバーライドする場合、引数として渡された`Object`型を`Sample`型にキャストする必要があります。キャストが失敗した場合のエラーを防ぐために、`instanceof`を使って型チェックを行うことが一般的です。

### 修正後のコード

```java
public class Sample {
    private int num;
    
    // コンストラクタ
    public Sample(int num) {
        this.num = num;
    }
    
    // equalsメソッドのオーバーライド
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;  // 同一オブジェクトであればtrueを返す
        if (obj == null || getClass() != obj.getClass()) return false; // nullまたは異なるクラスならfalse
        Sample sampleObj = (Sample) obj; // 型キャスト
        return this.num == sampleObj.num; // numフィールドを比較
    }
    
    // hashCodeもオーバーライドすべき
    @Override
    public int hashCode() {
        return Integer.hashCode(num); // numに基づいたhashCodeを返す
    }
}

public class Main {
    public static void main(String[] args) {
        Object a = new Sample(10);
        Object b = new Sample(10);
        System.out.println(a.equals(b)); // trueを出力するはず
    }
}
```

1. **`equals(Object obj)`メソッドのオーバーライド**
   - `equals`メソッドを`Object`型の引数を取るように変更しました。これにより、`Object`クラスの`equals`メソッドを正しくオーバーライドすることができます。
   - `this == obj`を最初にチェックすることで、同一オブジェクトであれば即座に`true`を返します。
   - `obj == null || getClass() != obj.getClass()`で、`obj`が`null`か、異なるクラスである場合は`false`を返します。これにより、型の不一致を防ぎます。
   - `Sample sampleObj = (Sample) obj;`で、`obj`を`Sample`型にキャストします。
   - 最後に`this.num == sampleObj.num`で、`num`フィールドを比較して、オブジェクトが等しいかどうかを判断します。

2. **`hashCode`のオーバーライド**
   - `equals`メソッドをオーバーライドした場合、`hashCode`メソッドもオーバーライドすることが推奨されます。`hashCode`は`equals`と一貫性を持つ必要があるため、`num`フィールドを元にした`hashCode`を生成します。

### 出力結果

```
true
```
読書感想文「ITエンジニアのための業務知識がわかる本」 販売管理部分

# 書籍名「ITエンジニアのための業務知識がわかる本」
著者：三好康之

# 読もうと思った動機
・担当した案件が販売管理ものが多く、知識不足を感じたため。
・仕様を理解するのに時間がかかるのでそれを解消
・自分でも仕様の不足点や、問題点に気付けるようにしたい。
・基本的な用語と抑えることと　次のアクションを決めるために読む。


# 印象に残った部分

## p150
・掛取引・・商品の注文や納品の時に代金を支払うのでなく、一定期間の取引にまとめて請求すること

・取引先信用調査
　相手が掛取引するのに信頼できるかの調査。例：クレジットカードの審査


## p152 売買契約書締結
売買が成立すると、売買契約書を締結する。
一般的には初回取引開始時、基本契約書を締結し、その後、ここの注文に対して個別契約書や、覚書を交わすことも多い。


## p154 受注
・顧客から注文すること
・注文と出荷及び売上計上の間にタイムラグがあるので、その間忘れないようにきちんと管理する。
・受注入力・・顧客から注文を受けた時に使う。入力処理で受注データを作成する。データ

## p166 売上計上基準
・企業会計原則
　売上高は実現主義の原則に従い商品などの販売又は、役務の給付によって実現したものに限る
　具体的には出荷基準、納品基準、検収基準などがある。



## p168 売上入力
顧客入力からの考えを正常に処理できたら、売上処理を行う。この時販売管理システムでは、受注データを本に売上データを作成することが多い。

## p170 赤黒処理
・売上入力後の売上訂正や取り消し処理は、たとえそれが単純ミスだったと
　内部統制上、たとえそれが単純ミスだったとしても内部統制上、その経緯を記録して保存して置く必要がある。そこで売上訂正入力や、売上取り消し入力を行った場合、まずマイナスの伝票を発行しその後、訂正の場合は訂正後の伝票を発行する。前者を「赤伝」、「黒伝」とする。



## p174 債権業務
・掛取引で、商品を販売した場合売上計上と同じ売掛金という債権が発生する。売上から回収完了までの管理業務を債権管理業務という。
請求締処理、請求書、入金処理

## p180
商品や原材料、部品などを発注する。
この段階では、会計帳簿に記録する必要はないので財務会計関連で規制されている業務ではない。ｌ
そのため様々な提案　端末を導入できる分野
２つの発注方式
・定期発注方式
・定量発注方式

## p188 仕入
・発注した商品や原材料、消耗品などが送られてきて、受け取った段階で会計処理と在庫の計上を行う。
・販売目的の商品や製造目的の原材料を購入することを仕入という。

購入目的|購入～使用時|
-------|----------|
販売|棚卸し資産（商品）
製造|棚卸し資産（原材料）
会社で使用|資産（消耗品、固定資産）


## p193 債務管理
債務：勘定科目において　買掛金や未払金
発生するタイミング：商品や原材料を仕入れ、仕入計上した時点や、消耗品を計上した時点で発生した。

処理：支払処理処理、支払確認処理、支払処理、支払消込処理



# 実践できること or 感想


## 実践すること
・以下の業務について,具体的な例を考え、アクティビティ図でまとめてブログに投稿する。
　新規取引開始　ｐ１５０
　受注を入力するまで　ｐ１５９
　検収から売上　ｐ１０８
　赤黒処理　ｐ１７０
　値引き処理・返品処理
　請求締処理　ｐ１７５
　請求発行の処理　ｐ１７６

・流通業の入門書を読んで読書感想を書く
　「とことんやさしい小売、流通の本」

・データモデル大全の販売管理の部分を読み直す

・以下本を読む
「グラス片手にデータベース設計 販売管理システム編」
【勉強記録】12月の成果

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
アメリカはまだ12月31日ですが、日本はすでに2025年になったということで、ここでは12月の成果を振り返りたいと思います。


# 12月の勉強成果
12月は中旬ごろに大学が終わり、勉強時間をかなり増やすことができました。継続している学習に加えて、新しく始めたこともいくつかあるので、そちらも紹介します。

## 勉強時間
12月の勉強時間は約135時間でした。先月と比べて45時間増えています。
妻との予定がない日は1日8時間続けて取り組んでいたので、これくらいの時間になったのだと思います。
来月は土日に外出の予定が多いため、平日はできるだけ8時間の勉強時間を確保できるよう継続していきたいです。
とはいっても、あくまでも時間数はモチベーション管理のために記録しているもので、「ここまでやってきた！」と振り返るための目安です。

## 大学が終わって気づいたこと
10月中旬から12月中旬までの約2カ月間は、英語を学ぶために大学に通っていました。宿題があったこともあり、1日平均2~3時間ほどしか勉強できませんでした。
その期間は「たのしいRuby」という教材をメインに進めていましたが、大学が終わり1日8時間勉強できるようになると、さまざまな面でプラスに働いたと感じます。

1. 理解度が上がった気がする
もちろん積み重ねの成果もあると思いますが、以前のように勉強日数を分散するよりも、1回の学習時間を長く取れるようになったことで理解度が大きく向上したと感じます。
2. 今やっている勉強だけでなく全体を考えるようになった
大学に通っている間は大学の課題や予定などに意識が向きがちでした。今は時間に余裕ができた分、ただ勉強を継続するだけでなく、「どういうエンジニアになりたいか（スキル面）」「そのためには何が必要か」を常に考えるようになりました。

## 先月の目標について
先月の記事で書いた目標がどれくらい達成できたか、振り返ってみます。

* 大学が中旬に終わるまでに交友関係を広げて英語力向上を図る
交友関係は広がりました！ ただ、遊びすぎると勉強に支障が出るのでほどほどにしています。

* アウトプットのためにオンライン英会話を始める
オンライン英会話ではなく、「瞬間英作文」を1冊終わらせて、瞬間的に英文が出てくるまで繰り返しています。文法を深く考えずに話せるようになってきたので、今後はインプットをさらに増やしていきたいです。なお、アウトプットはChatGPTの音声機能を使えばオンライン英会話のように練習できるのでおすすめです。

* Internationalイベントに参加して、引き続き交友を広げる
これは行きたかったのですが、予定が重なってしまい参加できませんでした。

* 「たのしいRuby」がかなり手ごわいので12月中に終わらせてRailsを始める
こちらは無事達成。Railsチュートリアルは6章まで進めました。

* 語学学校が終わったら午前中も時間ができるので、Ruby以外のスキル（Webやインターネット周りの知識）の勉強も併せてやる
これも無事に達成しています。1日1.5時間ほど、こういった分野の勉強に割くようにしています。

## 12月の新たな取り組み
* Chatgpt plusに入った
* ポモドーロ勉強を取り入れて、無理ない勉強スケジュールを組んだ
* Listening,Speakingの勉強を1日1時間とるようにした
* Rubyの演習問題を解き始めた
* 土日にLinux,Git,SQLの復習を始めた



## 1月の目標
* Linux,Git,SQLの演習を始める(土日の時間？)
* GitHub Copilotを使ってみる
* 勉強時間150時間
* 今思いついていない新しいこと1つはじめる

# まとめ
12月が終わり2025年が始まりました。これまで自分で計画を立てながら勉強を続け、合計で630時間を積み上げられたことを、まずは自分で評価してあげたいと思います。
2025年中には新しい企業で働き始めているはずなので、未来の自分をイメージしながら、今後の勉強も頑張っていきたいです。
声でつながるAIとの対談: 挿入曲 #12 - Bossanova, Jazz, Piano【Suno AIでつくった楽曲】 v4 & Custom Mode: On 【動画 2分22秒】【YouTubeチャンネルからの転記です】

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

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

こちらが動画内容です👇

***

![01 YouTubeサムネイル & 再生中の画像 Suno AI _ 声でつながるAIとの対談_ 挿入曲 #12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/9ae68399-42fa-1e09-8c00-5c34a1db0413.png)




* # 動画URL
    * https://youtu.be/51xwvIcgUO8

<br>

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

<br>

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

📅撮影日 = 2025-01-01(水)

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-04(水)

Suno AI 契約の種類:
Pro Plan

Suno AI Version:
v4

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

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

Custom Mode: On

Audio Inputs: Not Used

Instrumental:


---


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


🇬🇧English

[Jazz][Bossanova][Piano][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/40c93Dj
プログラミング初学者のためのfor文説明(python)

## この記事の主な対象読者
python以外の本格的なプログラミング言語でfor文を習ったこと・学習したことが全くない人を対象としています。なるべく理解しやすく、難しい言葉は使わずに進めます。
(※というより私自身、中学2年生でそこまで難しい言葉は逆に使えません)

### 必要最低限な前提知識
「print」「変数」「配列(リスト)」「len()」
この中に分からない内容があれば先に調べることを推奨します。

## for文その1(range)
まずよくpythonで使用されるプログラムとしてこのようなものがあります
```python
for i in range(10):
    print(i)
```
これを簡単なscratchという言語に置き換えてみると
![スクリーンショット (65).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3975134/c8531e74-b07b-b8aa-9f05-572b410b0b1d.png)
このようになります。つまりrange(10)というのは10回処理を繰り返すということで、iというものは変数で、このiは1回の処理ごとに1ずつプラスされていきます。
(iが一般的だけど、あくまで変数名なのでなんでも大丈夫です)

つまりこの場合、実行結果は
```
0
1
2
3
4
5
6
7
8
9
```
となります。しかし、すでにご存じの方もいると思いますがここで「あれ?これ0から始まって9で終わってるくね」と思う方もいると思います。そうなんです!pythonに限らず、基本プログラミング言語は0から始まることが多いです。

ちなみにこのようなものもあります。
```python
for i in range(10,15):
    print(i)
```
実行結果
```
10
11
12
13
14
```
こうすることで、最初を0からではなく10からにして、10から15(- 1で14)まで繰り返すことができます。

他にも
```python
for i in range(0,10,2):
    print(i)
```
実行結果
```
0
2
4
6
8
```
こうすることで0から10(- 1で9)までの範囲でiを2ずつ変えることができます。
(範囲を0から-10までなどにしていれば-2ずつ変えることも可能)


## for文その2(rangeなし)
このようなプログラムがあったとして、
```python
list = ["A","B","C"]

for i in list:
    print(i)
```
実はこのプログラムは
```python
list = ["A","B","C"]

for i in range(len(list)):
    print(list[i])
```

これと同じです。そして実行結果は
```
A
B
C
```

となります。listという配列を最初の要素(この場合"A")から最後の要素(この場合"C")まで1回ずつiという変数に代入しています。

繰り返す数は文字の集まり(この場合リストの要素数)の量になります。(この場合は3回)
ちなみに文字の集まり分繰り返すのでこのように文字列を1つずつ取り出すこともできます。
```python
var = "ABC"

for i in var:
    print(i)
```
実行結果
```
A
B
C
```

## for文その3(enumerate)
まず初めに例文がこちらです。
```python
list = ["A","B","C"]

for j,i in enumerate(list):
    print(j,i)
```
そして実行結果はこちらです。
```
0 A
1 B
2 C
```
まず変数がiだけではなくjが増えていますよね。これは左の変数(この場合j)に今何回目の繰り返しかが入り、右の変数(この場合i)に先ほど同様listの要素が最初の要素から順番に代入されます。

## for文その4(zip)
まず初めに例文がこちらです。
```python
list1 = ["A","B","C"]
list2 = ["D","E","F"]


for i,j in zip(list1,list2):
    print(i,j)
```
そして実行結果はこちらです。
```
A D
B E
C F
```
これは左側の変数に(この場合i)にlist1の要素を、右側の変数に(この場合j)list2の要素を、最初から順番に代入します。

ちなみにこのようなプログラムがあったとします
```python
list1 = ["A","B","C"]
list2 = ["D","E",]


for i,j in zip(list1,list2):
    print(i,j)
```
この場合要素が少ないほうのlist2に合わせられ、実行結果は
```
A D
B E
```
となります。
Raspberry Pi pico向け実行環境別での、I/F別ドライバ対応状況

「使いたいデバイスありき」の場合
※TOPPERSおよびTRON BSP以外は、ネット上の情報のみ
|  | [pico-sdk+FreeRTOS](https://qiita.com/yunkya2/items/7b9b38b7c8c33a6327af) | [TRON BSP](https://github.com/tron-forum/mtk3_bsp/tree/pico_rp2040) | [TOPPERS](https://qiita.com/2hobata/items/581a99ede6b578623836) |micro Python|Arduino IDE|
|:-:|:-:|:-:|:-:|:-:|:-:|
|UART| 〇 |  〇 |  〇 |〇 |  〇 |
| adc  | 〇 | 〇 |  ｘ |〇 |  〇 |
| gpio  | 〇 | 〇 |  ｘ |〇 |  〇 |
| gpio割り込み  | 〇  | ｘ  |  ｘ |[〇](https://tech-and-investment.com/raspberrypi-pico-14-gpio-interrupt/) |  [〇](https://garchiving.com/how-to-interrupt-with-pico/) |
| pwm  | 〇  | △(*1)  |  ｘ |〇 |  〇 |
| i2c  | 〇  |  〇 |  ｘ |〇 |  〇 |
| spi  |  〇 | ｘ | ｘ |〇 |  〇 |
| pio  |  〇 | ｘ |  ｘ |[〇](https://zenn.dev/parityc3/articles/a9ae5d65e1f30b) |  ▲(*2) |
| おまけ：dual core対応  |  〇 | ｘ |  〇 |〇 |  〇|


(*1) config\config.hの以下を、0→1に変更する。
    #define USE_PTMR       (0 )    /* Use Physical timer */  
(*2) [記述方法が癖あり](https://qiita.com/MergeCells/items/b55a5136ec92733d9205)
【Happy New Year 🙌 】転職して３ヶ月が経過した


明けましておめでとうございます🐍
本年もどうぞよろしくお願いします🎍
2025年があなたにとって素敵な一年になりますように！☀️

---

[BeeX](https://www.beex-inc.com/) に転職して３ヶ月が経った。

今の仕事では主に Python や Go、AWS に Docker などを使っている。自分の興味のある技術要素を使った開発に携われるのは素直に嬉しい。

今回は、今の職場について、自分が思う良いところや、生じた変化を紹介したい。

## 働く環境

技術に対するサポート制度が充実している。

社員には AWS アカウントが付与されるので、検証のために活用ている。これがすごくありがたい。お客さんにも羨まれるほどだ。希望すれば Azure や Google Cloud も利用可能だ。

[最近 Github Copilot Free が出た](https://github.blog/news-insights/product-news/github-copilot-in-vscode-free/)けど、この会社では以前から誰でも有料プランが使えていた。

Udemy Business アカウントも付与されていて、資格対策や技術の学習に使っている。正直、新卒１年目の時に欲しかった。大喜びで使ったんじゃないだろうか。

技術以外では、私の部署にはブラザーシスター制度があり、先輩社員が仕事上の相談に乗ってくれていてありがたい。ちなみにその先輩はフルリモート勤務で、会話は Web ミーティングで行っている。

## Slack での活発な情報共有

社内 Slack では日々、技術情報が活発に共有されている。

自分のタスクに直接関係がなくても、常に新しい知見を得られるのは非常に刺激的だ。

この環境のおかげで自分の仕事だけに閉じこもらず、自然と視野を広く保つことができる。

最近共有されていたのはこちらだ。

https://speakerdeck.com/handy/20241220-s3-tablesnoshi-ifang-wojian-zheng-sitemita

## ブログを始めた

転職して生じたポジティブな変化の一つは、Qiita ブログを書き始めたことだ。

この会社に来るまでブログを書いたことはなかったが、入社して間もなく先輩から「書くといいよ」と言ってもらったし、ブログは BeeX の文化に組み込まれていると思っていたので、とにかく始めた。

個人的に思うブログのいいところは、誰かが過去に書いてくれた記事が、時間や場所を超えて私を助けてくれるところだ。

いつまで続けられるかもわからないが、私も誰かの助けになる記事を書きたいと思っている。

Qiita の Organization という機能は面白いと思う。他の部署の人が今どんなことに興味を持ち、取り組んでいるのかがわかる。

## 生成 AI に関わり始めた

入社直後、BeeX は生成 AI アプリケーションをテーマに [Japan DX Week 秋 2024](https://www.japan-it.jp/autumn/ja-jp.html) に出展し、私もスタッフを務めた。

生成 AI を導入したいお客さんだけではなく、協業パートナーを探している方も来場しているのが印象的だった。研究開発した技術をどう応用すべきか悩む方もおり、そういった接点には新しい可能性を感じた。

当日にスタッフを務めた別のメンバーの感想も、ぜひご覧いただきたい。

https://qiita.com/curlneko/items/4a4bc481ddd5939b8647

<br>
IT 企業にいると気づきにくいが、生成 AI はまだ一般の人々には広く使われていない印象だ。身の回りの非 IT 系の人の話を聞いてみても、生成 AI はそんなに使われいない。

エンジニアなら、生成 AI に積極的に触れて、その便利さを理解して安全に活用しているはずだ。

でも自分たちだけではなく、より多くの人にその便利さを享受してもらいたいではないか。

# 最後に

転職して１月経った頃、ある先輩エンジニアが「以前より明るくなったね。楽しそう」と言ってくれた。自覚はなかったけど、環境が新しくなり、希望に満ちて見えたのだと思う。

大変なこともあるが、転職して初めて得られたポジティブな経験がたくさんある。

また会った時、楽しい報告ができたら嬉しい。

---

BeeX は仲間を募集している。
もしあなたが求職中で、興味のあるポジションがあれば、応募を検討してみて欲しい。
<br>

https://hrmos.co/pages/beex
M5NanoC6、Lチカで遊ぶ。( Ubuntu 24.04 lts , Arduino IDE 2 )


x 過去ログを見よ!!!


目的
M5StackシリーズのM5NanoC6をLinux環境で遊ぶ


結果(成功)

![o_coq723.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/688ae493-a2a4-9a6f-4fef-5fbc18d56de9.jpeg)

![o_coq724.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/70ec3d2e-c4ea-8627-374b-6ccd9771c7bd.jpeg)



● とりあえず、まず、「dmesg」でログを表示
----

```

sudo dmesg

```


![o_coq725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/20f756a6-0733-f59f-0963-0b5ddb4de81c.jpeg)


● 「ボードマネージャー」を選択
----

![o_coq726.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9b94545c-dd4f-208d-880d-09e63b6f9a38.jpeg)



● 「esp32」と入力
----


![o_coq727.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e06b88f6-9f61-33ca-42ae-44072eed39c8.jpeg)


● インストール
----


![o_coq728.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/577797e2-193f-dffe-f6a5-53602170a2a1.jpeg)


● 「ボードマネージャー」を消す
----

![o_coq726.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/05b0353d-e47d-a74f-1027-52d6ebf004c4.jpeg)


● 「esp32」を選択
----

![o_coq729.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6bed35b7-487a-6f40-046f-3d7d5fb53a57.jpeg)



● 「M5NanoC6」を選択
----

![o_coq730.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d97a9b68-c8f8-77c5-d31c-e8ae2fc46c10.jpeg)



● 「ttyACM0」を選択
----

![o_coq731.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/86adb12e-e1e5-2ede-bb45-0ecb4d4631ce.jpeg)


● Lチカのコンパイル実行
----

ファイル-スケッチ例-01.basics-Blink を　選択
実行する


![o_coq732.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/37a83d50-ae05-5976-a6e9-0bf5eed767eb.jpeg)
GitHub：ftp upload via Github Actionsのエラー解消

# はじめに
VS Code上でソースコードをGitHubにpushすると、サーバーへ自動アップロードされるActionを設定しています。
このActionでエラーが出るようになってしまったので、解消の手順メモです。

環境はつぎのとおりです。
* GitHub Actionsライブラリ
	* [SamKirkland/FTP-Deploy-Action@4.1.0](https://github.com/SamKirkland/FTP-Deploy-Action)
	* ※mainブランチへのpushをトリガーにFTPサーバーへアップロード
* サーバー
	* [さくらのレンタルサーバ - ライトプラン](https://rs.sakura.ad.jp/lite.html)

# やったこと
## エラーの内容の確認
GitHubのActionsをみると、直近のworkflowがエラーでこけていました。
![2025-01-01-04-44-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/83286f77-07c6-38d7-e81d-2399369b3084.png)

エラーの内容は、「そのようなファイルもしくはディレクトリーはありません」とのことです。
![2025-01-01-04-46-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/245bc499-b89d-6ee0-8ee5-e45b6027738f.png)
```log
Error: FTPError: 550 xxx/xxx/: No such file or directory
```

ただ、HPはちゃんと更新が反映されており、アップロード自体は完了していそうでした。

## エラーの解消
FTPアップロードする際は、差分をみて変更分だけサーバーへアップロードしており、サーバー上の`.ftp-deploy-sync-state.json`というファイルで差分を管理しているようです。

サーバーを確認したところ、`.ftp-deploy-sync-state.json`の更新日が、前回Actionが成功した日で止まっていました。
おそらくこのファイルが何らかの原因でおかしくなったと推測して、このjsonファイルを削除（は怖いのでリネーム）しました。

差分情報がないために、全件アップロードすることになり、Action完了までにいつもより時間かかりましたが、無事にエラーが解消されました。

# 手順まとめ
1. Actionsのエラーの内容を確認する 
	* エラー内容：`Error: FTPError: 550 xxx/xxx/: No such file or directory` 
1. サーバー上の`.ftp-deploy-sync-state.json`を確認する
	* 更新日が前回Action実行日でとまっていた
1. サーバー上の`.ftp-deploy-sync-state.json`を削除（もしくはリネーム）する
1. 再度Actionを実行する
	* 全件アップロードしなおすため時間がかかるので注意

# おわりに
以前にも同じような内容のエラーが起きて、忘れないように手順をまとめておこうと思っていましたが、そこから1年半もたってしまっていました…。
おそらく同じエラーだろうとあたりをつけることはできましたが詳しい手順は忘れていたので、ちゃんと当時メモしておけばよかった、後回しにするとダメだなと反省です。
量子コンパイラを作る。 その12

# 概要
量子コンパイラを作る。
blueqatから、qiskitに変更する。
elixirで書いてみた。
and,xorを検証。

# and

## 投入したソース

```
make 3
in 0 1
out 2 2
and 0 1 2
```

## 生成されたqiskit

```

from qiskit import QuantumCircuit
from qiskit.primitives import StatevectorSampler
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.ccx(0, 1, 2)
qc.measure_all()
print(qc)
sampler = StatevectorSampler()
job = sampler.run([qc], shots = 100)
result = job.result()
counts = result[0].data.meas.get_counts()
print(f" {counts}")




```

## qiskit実行結果

```
$ python3 test15.py
        ┌───┐      ░ ┌─┐
   q_0: ┤ H ├──■───░─┤M├──────
        ├───┤  │   ░ └╥┘┌─┐
   q_1: ┤ H ├──■───░──╫─┤M├───
        └───┘┌─┴─┐ ░  ║ └╥┘┌─┐
   q_2: ─────┤ X ├─░──╫──╫─┤M├
             └───┘ ░  ║  ║ └╥┘
meas: 3/══════════════╩══╩══╩═
                      0  1  2
 {'000': 21, '010': 23, '001': 31, '111': 25}
```

# xor

## 投入したソース

```
make 3
in 0 1
out 2 2
xor 0 1 2
```

## 生成されたqiskit

```

from qiskit import QuantumCircuit
from qiskit.primitives import StatevectorSampler
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(0, 2)
qc.cx(1, 2)
qc.measure_all()
print(qc)
sampler = StatevectorSampler()
job = sampler.run([qc], shots = 100)
result = job.result()
counts = result[0].data.meas.get_counts()
print(f" {counts}")


```

## qiskit実行結果

```
$ python3 test16.py
        ┌───┐           ░ ┌─┐
   q_0: ┤ H ├──■────────░─┤M├──────
        ├───┤  │        ░ └╥┘┌─┐
   q_1: ┤ H ├──┼────■───░──╫─┤M├───
        └───┘┌─┴─┐┌─┴─┐ ░  ║ └╥┘┌─┐
   q_2: ─────┤ X ├┤ X ├─░──╫──╫─┤M├
             └───┘└───┘ ░  ║  ║ └╥┘
meas: 3/═══════════════════╩══╩══╩═
                           0  1  2
 {'011': 21, '101': 29, '000': 32, '110': 18}
```

以上。
mono版プロデル1.9.1263に存在するバグ（あるいはドキュメントとの不一致）

### 追記（2025-01-02T22:21+09:00）
翌日に全て直したバージョンが出ておりビックリ。
ありがとうございます。
# はじめに
AtCoderの言語アップデートの時期になりました。現在`mono版プロデル1.9.1263`をインストールする予定なので、mono版プロデルがこのまま更新されない場合、現バージョンの挙動について知っておく必要があります。また更新が間に合ってほしい気持ちもあるため、なるべく早めに書き上げようとしています。
# 環境
基本的に`mono版`でコンパイル(`rdrc.exe`を利用)したときの挙動を対象としていますが、`.Net版`でも大抵同じです。
# 本編
## みなす文
[みなす文のページ](https://produ.irelang.jp/docs/syntax/minasu.htm) にある2つのコードはどちらも動作しません。
以下のように変更すると動きます。
```diff
入力値は｛「山田太郎」，23，「神奈川県足柄下郡箱根町」｝
- 入力値を｛名前，年齢，住所｝とみなす
+ 入力値を｛【名前】，【年齢】，【住所】｝とみなす
名前を表示する
年齢を表示する
住所を表示する
```

```diff
- 「1 2 3」を「 」で区切って{【A】,【B】,【C】}とみなす
+ (「1 2 3」を「 」で区切る)を{【A】,【B】,【C】}とみなす
Cを出力する
```

ちなみに下のような書き方もできません。これはmono版でのみ動きません。
```
(「1 2 3」を「 」で区切る)を{【A：整数】,【B：整数】,【C：整数】}とみなす
Cを出力する
```

## 条件判断文
[条件判断文のページ](https://produ.irelang.jp/docs/syntax/if.html)
もとのコードだと「123」を入力したとき以外、全て「より大きい」と出てしまいます。以下のように変更することで意図通りに動きます。（どういう扱いになってるのかわかってません）
```diff
正解は123
+ 【数字：整数】
「数値を入力してください」と聞いて、数字とする
数字が正解なら
　　「正しい」を表示する
他で数字が正解より大きいなら
　　「［数字］より小さい」を表示する
他で数字が正解より小さいなら
　　「［数字］より大きい」を表示する
そして
```
条件文の始めの条件で括弧を使わずに `=` を使うとコンパイルエラーになります。これは`pconsole`でも再現でき、`1.9.1290`で修正されています。
```diff
正解は123
「数値を入力してください」と聞いて、数字とする

- 数字＝正解なら
+ (数字＝正解)なら
　　「正しい」を表示する
他で数字≧正解なら
　　「［数字］より小さい」を表示する
他で数字≦正解なら
　　「［数字］より大きい」を表示する
そして
```

## カスタムソート
[配列のページ](https://produ.irelang.jp/docs/primitive/array.htm#%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88%E3%82%8B)
```
一覧は{12,3,5,6}
一覧を『
	それを{左,右}とみなす
	左>右なら
		-1を返す。
	他で左<右なら
		1を返す。
	そうでなければ
		0を返す
	そして
』で並べ替える
一覧を表示する
```
『それ』という名前の手順または変数はありません、と出ます。改善方法はわかりません。
最新の`.Net版`ではコンパイルできるものの、文字列扱いでソートされます。

## 文字目
[文字目のページ](https://produ.irelang.jp/docs/primitive/string.htm#%E6%96%87%E5%AD%97%E7%9B%AE)

```
内容は「こんにちは プロデル」
X＝内容の3文字目
Xを表示する
```
なぜか上記のように変数に代入すると、文字位置の数が代入されます。下のように書くことで回避できます。
```
内容は「こんにちは プロデル」
【X：文字列】＝内容の3文字目
Xを表示する
```
最新の`.Net版`では解決しています。
Nerves初回起動

Nervesの初回起動からラズパイ上に設置したボタンを押してLEDを光らせるまで

この記事ではラズパイ3B+を使って初回起動までを記述していきます
基本的にはエリクサーチの内容で問題ありませんが一部わかりづらかった箇所があるので補足します

https://elixir-lang.info/topics/iot

ファームウェアの microSD への書込みまではエリクサーチを参考にします
そこからは以下の動画が参考になりました

https://www.youtube.com/watch?v=-c4VJpRaIl4

特に注意点となるのは以下の２点です

・Raspberry Pi Imagerを使う
Etcherでイメージを焼いたのですがうまくいきませんでした
最初はzipでのやり方を試していなかったのでzipにすれば問題がなかったのかもしれませんが一応動画に従ってRaspberry Pi Imagerを使います

・zipファイルを手に入れてそれをmicroSDに焼く
エリクサーチでは
> Githubのリポジトリよりv1.0.0のファームウェアnerves_livebook.img をダウンロードしてください。

となっていますがGitHubページのnerves_livebookからReleasesをクリックして最適なAssetsを入手します
今回のケースですとnerves_livebook_rpi3.zipが該当します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/0e9a6070-7f9c-e4ab-a9ae-795d94b384a3.png)

https://github.com/nerves-livebook/nerves_livebook/releases

以上で初回起動に対しての注意点となります
後はSDカードをセットしたラズパイを起動させれば初回起動が完了しています

以上となります
[振り返り]2024年を振り返る

# 結論
- 本業であるシステム開発では、余裕をもって、タスクを完了できない場面が多かったため、<font color="#ff0000">仕事の進め方を思考錯誤し、生産性を上げていきます</font>
- [JPAUG広島](https://jpaug-hiroshima.connpass.com/)のコミュニティーで登壇を<font color="#ff0000">継続して、コミュニティーのコンセプトである腕を上げるに貢献していきます
- [ラーメンインスタ](https://www.instagram.com/tsusho20240908/)、[知見共有のためのQuita](https://qiita.com/TsuSho)の<font color="#ff0000">投稿頻度を上げていきます</font>

# 挑戦したこと
- 基幹システム刷新する大規模パッケージ開発したこと
- [JPAUG広島](https://jpaug-hiroshima.connpass.com/)のコミュニティーに参加し、人生初のコミュニティー登壇をしたこと
- 自分用の名刺、SNS、Quitaを作成して、活用したこと

# 振り返り
### 基幹システム刷新する大規模パッケージ開発したこと
- <font color="#ff0000">業務中に得た知見をOneNoteなどを活用し、チームメンバーに共有し、</font>チーム全体の生産性を上げることができました。継続します。
- タスクの納期を余裕をもって、完了することができませんでした。<font color="#ff0000">進め方を思考錯誤して、</font>生産性を上げます。

### [JPAUG広島](https://jpaug-hiroshima.connpass.com/)のコミュニティーに参加し、人生初のコミュニティー登壇をしたこと
- <font color="#ff0000">1スライド1フレーズ</font>を意識したことでリスナーの聞きやすい発表にすることができました。継続します。
- 登壇<font color="#ff0000">継続して、コミュニティーメンバーとともにIT技術の腕を上げていきます。</font>
- <font color="#ff0000">コミュニティーメンバーの登壇内容、投稿記事を読む頻度を上げ、</font>IT技術の腕を上げていきます。

### 自分用の名刺、SNS、Quitaを作成して、活用したこと
- <font color="#ff0000">SNS、Quitaを継続して、</font>投稿できませんでした。ラーメンを食べたら、ラーメンインスタは投稿するようにします。Quitaは2週間に1回投稿するようにします。
HTMLとCSS : [新卒時代に戻って学び直すシリーズ]

header: ヘッダー(必須ではない)
footer: フッター
main: メイン部分、ヘッダーフッター以外の部分
nav: 所謂メインメニュー。uiを囲むように配置するのが一般的
     基本的に一つのページに一つしか表示しない
ul: リスト表示
li: リストの中身
h1~h6: 見出し。数字が小さい方が重要度が高い
p: 文章、段落
br: 改行
img: 画像を表示
a: リンク
div: 装飾用のブロック
article: そのページの核となるようなブロック
         このブロックだけで一ページ成立するようなブロック
section: 章分け。articleより小さい分類
aside: 副次的なコンテンツ。広告など。

cssとは：装飾のための言語(HTMLは主に意味づけ)
インライン・styleタグ・別ファイル
基本的にCSSフォルダの中にCSSファイルを作る
パス/ディレクトリという概念
HTMLの要素は実は箱っぽい
セレクタには色々な指定方法がある
クラス、id
ボックスモデル(margin padding borderの関係)
CSSの優先順位

cssを書く方法は、三つある
・styleの要素内に書く
・cssファイルを作成して書く
・styleタグに書く
インライン>styleタグ>cssファイル
結論:cssファイルは、外部ファイルでの記載にする

cssは、一番下のものが優先的に適用される


クラス
<タグ class="任意のクラス名">
・アルファベットのみを使う
・ローマ字表示は避ける
・スペースは使わない(別の意味になってしまう)
・単語は「」や「-」でつなぐ

id
<タグ id="任意のid名">
・基本クラスと一緒
・同じ名前のidはページ内に存在してはいけない

# padding margin
paddingは、箱の中(border)に隙間
・padding:全方向px;
・padding:上下px 左右px;
・padding:上px 左右px 下px;
・padding:上px 右px 下px 左px;

marginは、箱の外(border)の隙間

検証ツールの見方
mac command+option+i
win Ctrl+Alt+i

# なぜhtmlで意味を示すのか
    機械が理解しやすいようにする為
# なぜ機械に理解させるのか
    検索エンジンなどで上位に表示される。または検索ワードとの関連性の高さなども示せる。
# アクセシビリティ
## アクセシビリティとは？
例えば、視覚に障害がある人は、webサイトの文章を読み上げるツールを使っています。適切にhtmlで意味づけをする(マークアップをする)ことで、これらのツールがより解析しやすくなり、わかりやすい形で読み上げを行うことができます。
あとは、開発者側も意味が理解しやすいので、読みやすい・管理がしやすいことや、将来htmlの仕様が変化した時にも、修正がしやすくなる可能性があることなどがあげられる。
2000円で10年使えるIoTサービス1NCEって何？

10年間2000円で使えるLTEサービス1nceというサービスがあり、かなり興味深かったので調べてみました。

https://www.softbank.jp/biz/services/module/1nce/
# 本当に2000円で10年間？
まず、これは誤りです。
500MBまでがミニマムチャージとして使用可能で10年間は最長です。
さらにSIMカードと送料（消費税も？）がかかります。
# 月額利用料無し
500MBの中であれば月額使用料がかかりません。
このため、低容量の通信であれば1nceが最安といえます。
- データ容量：５００MB
- SMS：250通
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f46b51e3-2bfb-b067-1de5-b706f45475d1.png)
# デメリット
もちろんデメリットがあります。
まず、対象が法人であること。
次に送料1500円がかかります。
５００MB　2000円＋SIMカード　２００円＋送料　１５００円＝３７００円
よって３７００円となります。
更に消費税がかかる場合があるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2609ea09-b68a-2ae2-8132-6eeb61d74a3c.png)
つまり、法人なら最長10年間3700円で使用可能なIoTサービスといえます。
# 通信規格
対応している通信規格は４GとLTE-Mです。
- 4G
- LTE-M
IoTで使用したい通信規格が使えます。
特にLTE-Mはキャリアによっては割高な場合がるだけに最適です。
# 使用用途
常時通信を行う用途には向きません。
あくまでもIoTデバイスのセンサ値を送る程度の通信に向いているものといえます。
10年間500MB、年間50MB、月4MB、日140KB程度の通信となります。

@kaz19610303(上野 和昭)さんの記を参考にすればセンサ値だけであれば10年程度使用可能といえます。

:::note info
転送方式 : http GET によるデータポスト
ディバイスID、温度、湿度、CO2の4つのデータを次の形式で転送
id=xxxxxxxxxxxxxxx&co2=xxx.xx&temp=xx.xx&hum=xx.xx
転送間隔 : 5分(1日288回)
30日間のデータ転送量(計算値)
5.67MB
:::
https://qiita.com/kaz19610303/items/a205e3e47033f9c2a125

ただし、デバイスが10年持つのか？10年も使用するのかという方が問題です。
2025年 SRE生き残り戦略

# はじめに

事業会社でクラウドサービス開発のテックリードを担当しながら副業でSREを行っている山口と申します。
この記事では生成AIの進化とSREとしての携わり方を予測しながら2025年の生き残り戦略を考えてみたいと思います。

# 自己紹介など
普段はクラウドシステムの開発に携わっているのですが、2024年は最初から最後までどっぷりと生成AI漬けの日々を送っておりました。
プロンプトを投げて開発の手助けしてもらうのもそうですが、業務で活用するための企画を行ったり、GenOpsやRAGOpsを構築するためのクラウドアーキテクチャを検討・検証したりと、生成AIに触れない日はありませんでした。

# SREにおける具体的な影響
以下はChatGPTに出力してもらった業務へ及ぼす影響です。
2024年ではまだ業務へ本格的に活用されているケースはぼちぼちだと思いますが、2025年にAIエージェントがリリースされたら一気に実用化されていくと思ってます。特に注目して欲しいのが4の**知識の民主化**です。

 1.	トラブルシューティングの効率化
    * ログ解析やアラートの優先順位付けをAIが支援
	* 障害対応の提案や手順生成がリアルタイムで可能に
2.	インフラ管理の自動化
    * AIがインフラのスケーリングや最適化を提案・実行
    * 生成AIを活用したインフラコードの生成（例: Terraform, Kubernetes）
3.	観測性の向上
    * Observabilityデータの分析・可視化をAIがリアルタイムで提供
    * トレンド予測や潜在的な問題の事前検知
4.	知識の民主化
    * SRE固有の知識やノウハウが生成AIを通じて共有可能に
    * チームメンバー間の知識格差の縮小

# 生成AIによって失われる価値
今までジュニアとシニアで一番差が出るのはスキルレベルだったと思いますが、生成AIによって格差は解消されもはや差別化要因ではなくなります。また、2024年までは生成AIを使って生産性を上げることが加点要素だったと思いますが、2025年以降は使っていないことがマイナスとなり、生成AIありきの生産性やクオリティ、人によって書き方に差が出ないコードの標準化が求められていくと思います。

## 価値を失うスキルの例

### シェル芸
ワンライナーでunixコマンドを駆使してテキストを加工するスキルはベテランならではの知識が要求されてましたが、生成AIが一瞬で生成できるようになってしまいました。
さらに、過去に生産された特定の人しか読めないようなシェルも生成AIが一瞬でリファクタリングしてくれます。同様に、複雑な正規表現が書ける技術なども価値を失っていくと思います。

### クラウドアーキテクチャ設計
2024年では設計ができることに価値がありましたが、2025年以降は生成AIの精度向上と共に誰でも設計できるようになり、かつそこからご丁寧に解説もしてくれるため、急速に価値を失っていくと思います。ただしTerraformのstate分割手法やリポジトリ最適化などは弱いので、高度なIaC設計技術はまだまだ価値を持ち続けると思ってます。

### 簡単なスクリプトの作成
例えば、S3やCloudStorageに置いてあるファイルを何らかのETLを行ってBigQueryへInsertするようなスクリプトであればおそらく誰でも作成できると思いますが、今後は生成AIが数秒で作成できるようになります。今までもお金をもらえた作業がそうでなくなるというのも意識すべきポイントだと思います。

# 生き残り戦略
前述の通り、技術にこだわる生き方は生成AIの進化と完全に競合するため、他の道も模索する必要があると思います。そんな中特に価値が出てくると思っているのは以下の4点です。

1. ドメイン知識のエキスパート
自社や業界特有の知識をサービス企画を行っているメンバーに匹敵するくらい身につけましょう。
生成AIが習得し得ない知識をIT技術にプラスで持っていることが大きな強みになります。
いずれファインチューニングや独自LLMの敷居が下がってきたら価値は失われていきますが、まだまだ時間がかかると思います。

2. 生成AI用のシステムを構築する側へ
はじめにで触れたGenOpsやRAGOpsは比較的新しい考え方でどんどん発展し続けてます。
ベクトルDB、アノテーションツールの選定、構成によってはKubernetesの知見など、求められる技術は非常に多く、現時点でこの分野を極めているスペシャリストは少ないので、今から取り組んでいく価値はあると思います。
特に複数のクラウドサービスで同等のサービスが組めるようになると非常に重宝されると思います。

3. 生成AIを使いこなす側へ
生成AIはアイデア次第で色んな可能性を持っており、使いこなすには想像力や発想力が求められます。社内で活用方法についてブレストやアイディエーションを実施すると、たまに生成AIでも発想できないようなことを思いつく人がいます。SREでもそういった人材は今後更に重宝されると思います。

4. エンジニアリング力の向上
色々なスキルの価値が無くなっていくとはいえ、システムの原理原則を理解しているということは引き続き重要な要素となり、例えば緊急トラブル対応には欠かせない知識となります。サービス停止時に生成AIが自動復旧してくれるところまではもう少し時間が掛かると思うので、エンジニアリング力を高めていくのは今後もSREにとって重要な要素だと考えます。

# まとめ
生成AIによってSREの価値は今後大きく変動し、個人的にはフロントエンドやバックエンドエンジニア以上に影響を受けると思ってます。
この記事が少しでもご参考になれば幸いです:grinning:
【Tableau】tabcmd実行時にエラー：You must accept the End User License Agreement (EULA) using --accepteula.

tabcmdのコマンドを実行した際、以下のようなエラーが表示された。
> You must accept the End User License Agreement (EULA) using --accepteula. Cancel.
> You can find the EULA in /opt/tableau/tabcmd

[Tableau Community](https://community.tableau.com/s/question/0D54T00000C5SFOSA3/tabcmd-error)見ると `--accepteula`オプションをつけたらええでって書いてるけど、毎回つけるのめんどい（毎回つけないといけない）

`/opt/tableau/tabcmd`フォルダを1回別のところへ退避して元のフォルダ削除→再配置したらエラー出なくなった。意味が分からんけど使える。意味がわからんけど。
Visual Studio Code 拡張機能の選定

# VS Code拡張機能
  VS Codeの拡張機能を効率的に使うためのメモ

  **コンセプト**  
  Devcontainerを使用することを前提に、  
  ローカルのPCを汚すことなくVS Codeの拡張機能を使う効率的な方法を目指す

  **VS Codeのバージョン**  
  1.96.2

## 必須の拡張機能
  Docker + Devcontainerを使用することを前提にしているため、以下の拡張機能は必須  

:::note info
  以下の２つの拡張機能は必ず使用するためローカルPCにインストールしてしまう
:::

  - Docker
    ```
    ms-azuretools.vscode-docker
    ```
  - Remote Development
    ```
    ms-vscode-remote.vscode-remote-extensionpack
    ```

## 共通の拡張機能
:::note info
  ここからの拡張機能はDevcontainerの中で使用するつもりのため、
  ローカルPCにはインストールしない
:::

  **開発言語に関係なく使用する拡張機能をまとめる**

  - indent-rainbow
  ```
  oderwat.indent-rainbow
  ```

  - Prettier - Code formatter
  ```
  esbenp.prettier-vscode
  ```

  - Better Comments
  ```
  aaron-bond.better-comments
  ```

  - Path Intellisense
  ```
  christian-kohler.path-intellisense
  ```

  - Auto Rename Tag
  ```
  formulahendry.auto-rename-tag
  ```

  - Auto Close Tag
  ```
  formulahendry.auto-close-tag
  ```

  - Code Spell Checker
  ```
  streetsidesoftware.code-spell-checker
  ```

  - Trailing Spaces
  ```
  shardulm94.trailing-spaces
  ```

  - Todo Tree
  ```
  Gruntfuggly.todo-tree
  ```

  - Git Essentials
  ```
  TechieCouch.git-essentials
  ```

  - Bookmarks
  ```
  alefragnani.Bookmarks
  ```

  - Error Lens
  ```
  usernamehw.errorlens
  ```

  - Regex Previewer
  ```
  chrmarti.regex
  ```

  - DotENV
  ```
  mikestead.dotenv
  ```

  - Peacock
  ```
  johnpapa.vscode-peacock
  ```

## 言語ごとの拡張機能
  **言語ごとに使用する拡張機能をまとめる**

  ### フロント系
  - Live Server
  ```
  ritwickdey.LiveServer
  ```

  ### バックエンド系
  - Thunder Client
  ```
  rangav.vscode-thunder-client
  ```

  #### Java
  - Extension Pack for Java
  ```
  vscjava.vscode-java-pack
  ```

  - Spring Boot Extension Pack
  ```
  vmware.vscode-boot-dev-pack
  ```

  #### Python
  - Python
  ```
  ms-python.python
  ```

  - Python Indent
  ```
  KevinRose.vsc-python-indent
  ```

  - autoDocstring - Python Docstring Generator
  ```
  njpwerner.autodocstring
  ```

  #### C++
  - C/C++ Extension Pack
  ```
  ms-vscode.cpptools-extension-pack
  ```

## あえて入れない拡張機能
  **VS Codeで逆輸入されデフォルトで備わっている機能**

  - zenkaku
  ```
  mosapride.zenkaku
  ```

  - Rainbow Brackets
  ```
  2gua.rainbow-brackets
  ```

## 検討
  **導入を検討している拡張機能**  
  サブスクリプション未購入のため未導入
- GitHub Copilot
  ```
  GitHub.copilot
  ```

## 随時アップデート
上記で確定というわけではない、  
VS Codeの逆輸入や新規のより便利な拡張機能の登場などがあるたびに
更新していく予定