OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonの簡易http.serverをDockerでたててファイルを公開する。

# この記事の目的
- Pythonの簡易WEBサーバーをDockerコンテナで起動し、ファイルを公開するためのメモ。

# 手順
## Dockerfileを作成する
```
FROM python:latest #任意のバージョンを指定してください

WORKDIR /publish_data

EXPOSE 50080

CMD [ "python", "-m", "http.server", "-b", "0.0.0.0", "50080" ]
```
## 公開するファイルを格納するディレクトリと確認用ファイルを作成する
```
mkdir publish_data
touch ./publish_data/test.txt
```
## Dockerイメージをビルドする
```
docker image build \
-f ./Dockerfile \
-t python_web_server:1.0.0 \
.
```
## Dockerコンテナを起動する
```
docker container run \
-itd \
--name python_web_server \
-p 10080:10080 \
-v ${PWD}/publish_data:/publish_data \
python_web_server:1.0.0
```
## 接続確認をする
```
(base) user@host ~ % curl hostname:50080
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
<li><a href="test.txt">test.txt</a></li>
</ul>
<hr>
</body>
</html>
(base) user@host ~ %
```
## WEBブラウザから確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2167304/8c0c7174-f3b9-e2b9-c875-a51ef2f31b22.png)
---
本番運用はしないように[公式ドキュメント](https://docs.python.org/ja/3/library/http.server.html)で警告されています。
しかしながら、チームや組織内で一時的にファイルを公開する必要がある時などは、便利かも知れません。
以上です。
理系だけど情報系じゃない新卒がエンジニア職の内定を得るために立てた戦略

# はじめに
「理系だからエンジニアになるのは簡単」と思われがちですが、実はそうでもありません。やはり情報系出身の方が信頼度はあるでしょう。
私は理系の学部に所属していましたが、情報系ではありませんでした。そんな私が、なぜ情報系の知識や経験が問われるエンジニアの仕事を目指し、どのようにして社内SEとして内定を得たのかを書きます。

# 対象読者
- 情報系出身ではない人
- 就活で悩んでいる人
- エンジニアになりたい人

# 背景: 理系だけど情報系じゃない
私は理系の学部に在籍していましたが、専攻は情報系ではありませんでした。
プログラミングの経験も学校の情報の授業程度で、言語も少し触ったことがある程度。小さい頃からプログラミングに慣れ親しんでいたわけではなく、特別に「ITに詳しい」というわけでもありませんでした。
それでも、「エンジニアとして働きたい」と思うようになったのは、就職活動の軸を決める過程で気づいた、次の2つのポイントが理由です。

## 就活の軸
はじめからソフトウェアエンジニアとして働きたかったわけではありません。就活のエントリーシートを書く段階で自己分析をして、以下の3点が自分の職種に対する就活の軸だと分かったのでこの軸で仕事を探しました。

1\. 資格が取れるか、経験がものをいう仕事がしたい
勉強して自分が成長する、キャリアを積みやすい職種を求めていました。

2\.	自分が人より嫌だと思わない仕事
長時間パソコンに向き合って文字に向かう仕事に抵抗がないのは、私にとって強みでした。

# 現実: 情報系出身でないことの壁
エンジニアを目指す中で、最初にぶつかった壁は、情報系の学部ではないことがソフトエンジニアになれる可能性の高いIT系会社就活には不利だという現実でした。

- 書類選考の壁
「情報系出身でない」上に実績もないので、多くのIT系企業で書類選考が通りませんでした。

- 業界の労働環境に不安
さらに、IT企業の労働環境にも不安を感じていました。「長時間労働が当たり前」とされる会社が少なくないことを知り、「自分に合う環境が見つかるのだろうか」と悩むこともありました。

# 戦略: ITメインではない企業を狙う
「情報系の学部出身でない」という弱点をカバーするため、私は以下のように視点を変えました。

 __ITを活用する企業を探す__

IT業界の企業にこだわるのではなく、事業メインがIT以外で、ITを活用している会社に目を向けました。具体的には、次のような企業です：
- メーカー（組み込みエンジニア）
- 農業や製造業といったIT以外の業種のSE

ITを活用する企業の中には、中途採用で人気のある会社でも、 __新卒採用では競争が少ない場合__ もあります。これを狙って応募することで、書類選考のハードルを下げることができました。

# 結果: 社内SEの内定を獲得
このような戦略を採用した結果、私はメーカーの組み込み系エンジニアや製造業の社内SEとして内定を得ることができました。

社内SEを選んだ理由
- ITを活用して会社全体を効率化するという役割に魅力を感じたため
- 長時間労働が少なく、自分のライフスタイルに合っていたため

# まとめ: 情報系じゃなくても情報系の仕事を目指せる
情報系の学部に所属していないと、エンジニアとして就職するのは難しいと感じるかもしれません。しかし、戦略次第で道は開けます。

今回のポイント
1. IT業界にこだわらず、ITを活用している企業を狙う
2. 自分の強みを明確にし、応募企業にアピール
3. 新卒市場の競争が少ない企業をリサーチ

私の経験が、これからエンジニアを目指す方の参考になれば嬉しいです！
もし同じような状況で悩んでいる方がいれば、ぜひコメントで教えてください！
【Advent Calendar 2024 #8日目】AWS学習〜生成AI/ML編〜 AWSの⾔語系（チャットボット・検索）AIサービス

# はじめに
本記事は、「初めての一人アドベンドカレンダー2024 by hohe」の8日目の記事となります。
Advent Calendar 期間中は、AWSの生成AI/ML関連を中心に記事を投稿していきます。
8日目はAWSの⾔語系AIチャットボット・検索サービスについてまとめます。

# Amazon Lex
音声やテキストを使用したチャットボット構築サービスで、ユーザーが自然言語の音声またはチャットを使用して任意のアプリケーションとインタラクションできるようにする AI チャットビルダーであり、任意のアプリケーション用の会話型AIインターフェイスを構築およびデプロイする。

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

# Amazon Kendra
機械学習を利用したエンタープライズ向け検索サービスで、組み込みコネクタを使用してさまざまなコンテンツリポジトリを検索できるようにする。

https://aws.amazon.com/jp/kendra/
LF AI Community Japan (仮)を立ち上げます！

富士通(株) 人工知能研究所の木村です。

[2025/01/30追記: LF AI&Data Japan RUG発足しました](https://x.com/kimusaku/status/1884725636465557622)

LF AI&Dataでの活動がメインですが、ご縁があってOpenChain Japan Advent Calendar 2024に参加させていただくことになりましたのでよろしくお願いいたします（投稿が遅れてしまいましたが…）

2024年10月28-29日に開催されたOpen Source Summit Japanにて、Linux FoundationにおけるAI系OSSの日本コミュニティの位置づけとしてLF AI Community Japan (LFAICJ)の立ち上げをアナウンスいたしました。
この度、LF AI&DataからJapan Regional User Group (RUG)として承認され、2025年1月に正式アナウンスすることとなりましたので、本記事にてLFAICJ立ち上げの背景や趣旨について紹介いたします。

## LF AI&Data Foundationについて

[LF AI&Data Foundation](https://lfaidata.foundation/)はLinux Foundation傘下の団体で、AI関連の様々なOSSプロジェクトをホストしています。LF AI&DataにはAWS、Microsoft, NVIDIA等多数のメンバー企業が加入しており、弊社富士通も日本唯一 (2024年現在) のメンバー企業として加入しています。
LF AI&Dataのホストするプロジェクトには、有力なものとしてAIモデルのオープンソースフォーマットを提供している[Open Neural Network Exchange (ONNX)](https://github.com/onnx/onnx)やローカル環境でLLMを利用可能にする[vLLM](https://github.com/vllm-project/vllm)等が挙げられます。
弊社からは[SapientML](https://github.com/sapientml/sapientml) (高速で軽量なAutoMLツール)と[Intersectional Fairness](https://github.com/intersectional-fairness/isf) (AIの公平性の検証や改善を行うツール)の2つのOSSを寄贈しています。
[LF AI&Data Foundation Interactive Landscape](https://landscape.lfai.foundation/?project=hosted)にOSSの鳥観図がありますのでご覧いただければと思います。

## LFAICJで何をやるの？

LFAICJ立ち上げの目的としてはいくつかあります。まずは**日本固有のAIに関する課題をOSSで解決したい**というものがあります。日本語や日本文化・慣習・法制度への対応等、オープンソースAIの日本へのローカライズやそれに派生する様々な問題を取り扱う場を作りたいと思っています。
次に、**AIについて日本語で議論・情報共有できる場を作ることで、日本のAIエンジニアを増やす**というものがあります。AI関連の様々なOSSコミュニティに参加されている日本の方は多くいらっしゃるかと思いますが、日本のOSSユーザ全体から見るとまだまだ少ないのではないかと思います。日本国内で日本語にて議論できるコミュニティがあり、そこで多様な意見を取り込んだり新しいアイデアが生まれやすくなったりすることで、より多くの方々がOSSへコミットできるようになるのではないかと思っています。このためにLFAICJではLF AI&DataやPyTorch、またこれらに限らないAI関連OSSの日本語での紹介や、技術情報の日本語翻訳、また対面／ハイブリッドでのミートアップの開催による日本国内でのネットワーキングを実施していきたいと思っています。

LF AI&Dataメンバーである私達の思いとしては、**LFAICJを起点に数多くのコラボレーションが生まれてほしい**というのがあります。弊社では2023年8月頃からLF AI&DataでOSSプロジェクトを公開して、OSSコミュニティを共に盛り上げていくコラボレーター探しを行っていました。実際にやってみた結果としては、Open Source SummitやAI_dev等のイベントでの露出や興味を持ってくださった企業様への訪問等いろいろやってみたもののまだ結果が出ていないと考えています。OSSプロジェクト単体で活動していくにはリソースもノウハウも圧倒的に不足していると感じていて、そもそも我々のOSSのニーズを持つと思われる人達にうまくリーチできていないというのも感じていました。そのため、LFAICJでは、OSSプロジェクトからは一段拡げてAI関連OSS全般に興味のある日本国内の方々に気軽に入ってきていただき、様々なトピックを扱いその中からニーズのあった方達により具体的なコラボレーションが走っていけるようになると良いなと考えています。

## 今後の予定

まずはLF AI&Dataから2025年1月中にLFAICJ発足を正式にアナウンスする予定です。
また、2025年2月（17日週を想定）にLFAICJの第一回ミートアップを開催したいと思います。この回では、AIの活用状況、AI関連OSSへの取り組み状況、課題、ノウハウの共有等を、登壇予定の各社様から行っていただこうと思います。詳細は後日リンクを貼らせていただきますので、今後ともよろしくお願いいたします！

## 2025/01/30追記: LF AI&Data Japan RUG発足しました

2025/01/30にLF AI&Data Japan Regional User Group (RUG)という名称で正式に発足しました！アナウンス記事は[こちら](https://lfaidata.foundation/blog/2025/01/29/launching-the-lf-ai-data-japan-regional-user-group-rug-for-ai-collaboration/?utm_content=323210514&utm_medium=social&utm_source=twitter&hss_channel=tw-976478457881247745)です。

日本語でオープンソースAIの議論や情報共有を行うコミュニティとして盛り上げていきたいと思いますので、よろしくお願いいたします！

また、Japan RUG最初のミートアップを2/18 (火)に開催しますので皆様ご参加ください！
https://community.linuxfoundation.org/e/mb5dn7/
【Advent Calendar 2024 #7日目】AWS学習〜生成AI/ML編〜 AWSの⾔語系（テキスト）AIサービス

# はじめに
本記事は、「初めての一人アドベンドカレンダー2024 by hohe」の7日目の記事となります。
Advent Calendar 期間中は、AWSの生成AI/ML関連を中心に記事を投稿していきます。
7日目はAWSの⾔語系AIテキストサービスについてまとめます。

# Amazon Translate
ニューラル機械翻訳のサービスで、高速で高品質かつカスタマイズ可能な言語翻訳を手ごろな料金で提供する。

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

# Amazon Textract
ファイルからテキストを抽出するフルマネージドな機械学習サービスで、スキャンしたドキュメントからテキスト、手書き文字、レイアウト要素、データをあらゆるドキュメントから自動的に抽出する。

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

# Amazon Comprehend

機械学習を利用した自然言語解析サービスで、ドキュメント、カスタマーサポートチケット、製品レビュー、電子メール、ソーシャルメディアフィードなどに含まれるテキストから、価値あるインサイトを発見する。

https://aws.amazon.com/jp/comprehend/
SQLの歴史と標準化

## はじめに

こんにちは！今日は、リレーショナルデータベース操作言語として世界中で使われているSQL（Structured Query Language）の歴史と、その標準化の流れについてまとめます。SQLは、データベース技術を学ぶうえで避けて通れない存在であり、過去から現在に至るまでの発展を理解することで、なぜSQLがここまで広く普及し、標準化が進められてきたかを確認できます。

## 本文

### SQLとは

**SQL（構造化問合せ言語）** は、関係データベース管理システム（RDBMS）に対するデータ定義、データ操作、データ制御など、あらゆる操作を行うための宣言的な言語です。

#### SQLの由来

SQLの起源は1970年代にIBMが研究していた **SEQUEL（Structured English Query Language）** という言語です。この言語は、関係モデル（エドガー・F・コッドが提唱）の理論に基づくデータ操作を実現するために考案されたものでした。後に商標権などの問題から名称が変更され、 **SQL（Structured Query Language）** という名称が定着しました。

当時、IBMだけでなく他のベンダも関係データベース製品を開発しており、共通のデータベース操作言語としてSQLが受け入れられました。SQLは英語に近い文法で学習しやすく、広く普及しました。その結果、ほとんどの商用・オープンソースDBMSでSQLが標準的な問い合わせ言語として使われるようになりました。

### 標準SQLの制定と拡張

SQLは複数のベンダが実装し、機能拡張を行ってきたため、一時期はベンダごとの独自仕様が乱立していました。これが開発者やユーザーにとって混乱のもととなったため、ANSI（米国規格）やISO（国際標準化機構）が中心となって標準規格が策定されました。

- **SQL-86（1986年）**：最初のSQL標準規格で、ANSIによる標準化が行われました
- **SQL-89（1989年）**：整合性制約が追加されました
- **SQL-92（標準SQL2 / 1992年）**：大幅に改訂（ISO 9075として標準化）されました。データ型の拡張、動的SQL、言語の直交性の改善、整合性機能拡張、外部結合、一時表、動的SQL、DDL拡張、トランザクション分離レベルなど多くの機能が盛り込まれました
- **SQL-99（標準SQL3 / 1999年）**：現在主流の標準SQL規格は1999年に制定されたSQL99で正規表現検索、再帰問合せ（推移的閉包）、トリガー、手続き型や制御フロー文、配列型などを導入しました。オブジェクト指向的要素やJavaとの連携（SQL/OLB, SQL/JRT）も追加されました
- **SQL:2003 / SQL:2008 / SQL:2011 / SQL:2016**：定期的な改訂により、XML関連機能、ウィンドウ関数、階層型問い合わせ、JSONサポートなど、現代的なニーズに応える機能が追加されています

#### ベンダ独自拡張と標準SQLの関係

OracleやMicrosoft SQL Server、MySQL、PostgreSQLなど、主要なRDBMSは標準SQLに従いつつ独自拡張を追加しています。これらの拡張は高機能かつ便利ですが、移植性を下げる原因にもなります。そのため、システム間連携やDBMS移行を考慮する場合は、可能な限り標準SQLを優先する設計が推奨されます。

#### 日本国内規格と情報処理試験

日本では **SQL:JIS X 3005** 規格群（ISO/IEC 9075に準拠）が存在し、情報処理技術者試験ではこの規格を参照しています。SQL:2008相当の機能がベースとなりますが、実務上はこれ以降のバージョンの機能がサポートされているケースも多くあります。

### 現在のSQLと今後の展望

SQLは、関係データベースのみならず、分散型システムやクラウド環境でのデータ分析にも用いられるようになりました。NoSQLデータベースの一部がSQLライクなクエリ機能を提供するなど、SQLの文法や考え方が非伝統的なデータストアにも波及しています。

## まとめ

SQLは1970年代のSEQUELから始まり、多くのベンダと標準化団体の努力によって整備・発展してきました。標準SQL規格（SQL-86、SQL-92、SQL:1999、SQL:2008、SQL:2016など）の更新に伴い、SQLはより豊かな機能と明確な定義を獲得し、関係データベース操作の事実上の標準言語となりました。

今後もSQLは進化を続け、非関係データストアや先端技術と組み合わせることで、データ活用の幅がさらに広がります。標準に沿ったSQLを学び、DBMSベンダ独自機能や最新規格をキャッチアップしていくことで、データベースエンジニアや開発者としてのスキルを強化できます。
laravel 自作command（バッチ処理）を追加する

## 概要

laravelにて自作のcommand（バッチ処理）を追加する方法をまとめる。
実は下記の記事で記載済みの内容ではあるが、見苦しい記事なので再度書き直す。

https://qiita.com/miriwo/items/1ab9d01744417a272e67

## 方法

1. 下記コマンドを実行して自作commandを作成

    ```terminal
    php artisan make:command EchoHelloWorldCommand
    ```

1. 作成された`app/Console/Commands/EchoHelloWorldCommand.php`を展開、下記のように記載

    ```app/Console/Commands/EchoHelloWorldCommand.php
    <?php
    
    namespace App\Console\Commands;
    
    use Illuminate\Console\Command;
    use Illuminate\Support\Facades\Log;
    
    class EchoHelloWorldCommand extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'app:echo-hello-world-command';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'Command description';
    
        /**
         * Execute the console command.
         */
        public function handle()
        {
            $str = 'Hello World';
            echo $str . PHP_EOL;
            Log::info($str);
            return;
        }
    }
    ```

1. 下記を実行して作成したcommandを実行「Hello World」が出力され、laravel.logに「Hello World」が出力されていたら完了

    ```terminal
    php artisan app:echo-hello-world-command
    ```
Module-LLMのNPU Modeについて

## 目的
M5Stack Module-LLM(ax630c)のNPU Modeについて紹介します。


## NPU Modeについて

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/f0452ad0-be71-895b-9274-d80cfb5368dd.png" width="80%">

M5Stack Module-LLMには、AXERA-TECHのAX630CというSoCが載っています。AX630CにはデュアルコアのCortex-A53に加えて、NPUが搭載されています。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/81fc2f44-0aed-d664-f2ca-f4d5b6a9025b.png" width="80%">


Pulsar2という、深層学習の推論モデルをNPUで動作するように、モデルを変換するツールがあるのですが、
Pulsar2の設定項目の中に、NPU Modeというものがあります。
NPU Modeは、NPU1がNPUをAI-ISPと共通するhalf coreのモードで、NPU2がNPUを推論で占有するfull coreのモードです。NPU2を選択した方が推論の速度が速くなります。
AI-ISPは、主にカメラからの入力画像に対して、暗視強化と超解像度の画像処理を行うために使われるものです。

‐ NPU1: shares compute with AI-ISP
‐ NPU2: runs independently at full power (faster)

YOLO11のオブジェクト認識モデルで確認したところ、NPU2はNPU1と比べて、シングルコアと比べて2割くらい早くなりました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Module LLMのYOLO11の推論で、NPU dualコアモードを試してみる。シングルコアと比べて2割くらい早くなりますね。 <a href="https://t.co/aSNtJjcGVB">pic.twitter.com/aSNtJjcGVB</a></p>&mdash; nnn (@nnn112358) <a href="https://twitter.com/nnn112358/status/1864293846898880682?ref_src=twsrc%5Etfw">December 4, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>






### 参考
<https://en.axera-tech.com/Product/126.html>
<https://x.com/nnn112358/status/1864335300245475682>
<https://x.com/HanxiaoM/status/1868995075298168950>
<https://x.com/HanxiaoM/status/1869223722475008406>
VSCode で Java の依存ライブラリのソースコードを見る方法

VSCode で依存ライブラリのソースコードが知らない間に見られるようになったそうなので、操作感をまとめてみます。

# デモ用の Java プロジェクトを作成

シンプルな Maven のプロジェクトを作成し、以下のコードを追加 or 修正します。

## pom.xml の修正

Jakarta JSON Processing を Maven の dependency に追加します。

```xml:pom.xml
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.12.0</version>
        </dependency>
    </dependencies>
```

## Java コードの実装

以下のサンプルコードを実装します。

```java:Main.java
    public static void main(String[] args) throws IOException {
        // CSVファイル書き込み
        try (CSVPrinter printer = new CSVPrinter(new FileWriter("data.csv"), CSVFormat.DEFAULT)) {
            printer.printRecord("id", "name", "score");
            printer.printRecord(1, "Alice", 95);
            printer.printRecord(2, "Bob", 82);
            printer.printRecord(3, "Charlie", 78);
        }

        // CSVファイル読み込み
        CSVFormat format = CSVFormat.Builder.create(CSVFormat.DEFAULT).setHeader().build();
        try (CSVParser parser = new CSVParser(new FileReader("data.csv"), format)) {
            parser.forEach(record -> System.out.printf("%s: %s点%n", record.get("name"), record.get("score")));
        }
    }
```

この時点で `CSVPrinter` のクラスを Ctrl+Click するとコンパイルされる前の Java のソースコードで確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/815825a5-bb79-1f6f-d9b1-a315e1e47650.png)

デバッグ時にステップインした場合でも、該当の行でステップ実行が実施できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/a33da627-5274-e264-0a0b-bab9a587c393.png)

なかなか良いです。

# もしデコンパイルされた Java が表示される場合

基本的にはない想定ですが、 Maven のローカルリポジトリに `*-sources.jar` が存在していないと、以下のようにデコンパイルされた Java のコードが開かれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/a3e64b13-6234-c6bc-b77e-a98e2212475b.png)

上のような状態の場合、 class ファイルを開いた状態で右クリックし、「Attach Source...」からローカルの Maven リポジトリに入っている `*-sources.jar` を選択すれば、ソースコードで確認することができます。

また、 `*-sources.jar` ファイルがない場合は、以下の mvn コマンドで追加できます。

```bash:pom.xml があるディレクトリで実施
mvn dependency:sources
```

# pom.xml からも依存ライブラリの pom.xml に飛べる

pom.xml の dependency の箇所で Ctrl を押しながらマウスオーバーすると、dependency の部分が丸ごとリンクになって、クリックでライブラリの pom.xml が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/d89d2819-c07e-4a0a-fcc5-a34903ce8315.png)

Maven のローカルリポジトリにある pom.xml が直で開かれるようになっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/e8e5fea4-bd1a-f5e0-2471-23ae46b0eeef.png)

# 感想

もう、他の IDE との差分がどんどんなくなってきている。 VSCode の進化早し。
「【Advent Calendar 2024 #6日目】AWS学習〜生成AI/ML編〜 AWSの⾔語系（音声）AIサービス

# はじめに
本記事は、「初めての一人アドベンドカレンダー2024 by hohe」の6日目の記事となります。
Advent Calendar 期間中は、AWSの生成AI/ML関連を中心に記事を投稿していきます。
6日目はAWSの⾔語系AI音声サービスについてまとめます。

# Amazon Transcribe
フルマネージド型の自動音声認識 (ASR) サービスで、音声をテキストに変換する機能を任意のアプリケーションに簡単に追加できるようにします。

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

# Amazon Polly
オンデマンドで音声を生成し、あらゆるテキストを音声ストリームに変換するフルマネージドサービスで、既存のアプリケーションに優れた会話機能を提供、何十種類ものリアルな音声を複数の言語でサポートしているため、最適な音声を選択して、音声対応アプリケーションを多くの地域で配信できます。

https://aws.amazon.com/jp/polly/
Sequence Makerが動作中はスタンバイ等にならないよという話

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerは長期試験とか大量のデータ取りに使用するので、PCが勝手にスタンバイになったりするととても困ります。この記事では、Sequence Makerが動いているときは、スタンバイになったりしないという解説です。なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## 結論
**Sequence Makerが動作中はスタンバイにならない**
以上！

## 解説
Sequence Makerで「コマンド送受信」ボタンを押して、シーケンス動作中は、以下の動作が無効になります。

### スクリーンセーバーの起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/9881cd30-8131-d2a0-e477-aabcb4e8fcb4.png)

スクリーンセーバーが設定されていても、実行されません。

### ディスプレイの電源を切る　＆　コンピューターをスリープ状態にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/f1e94b63-968b-f9a4-7e69-2f6f68f9380b.png)

これらが設定されていても、実行されません。

## まとめ
これで安心して長期試験ができますね！！
ちなみにWindows Updateによる強制再起動は適用される可能性があります。
毎月第2水曜日は恒例のWindows Updateがあるので、気をつけましょう。
起業するならElixirシリーズ. STEP25. 最後に

https://qiita.com/Yoosuke/private/3eb67f73c8beff05a83b

続きです。

というか、集大成ですね。

PAY.JPの実装は、ちょっと間に合わなかったので、（というか書いてる時間取れなかったので、趣味的に時間見つけて投稿します。年末になるかなぁ...）

さて、途中アンケートとった結果発表をしないと、と思いまして。なんと！3件もアンケート書いてくださってる方いました！　わーいぱちぱちぱち。

正直、一人もいなかったです。というオチになると思っていただけに、三人も書いてくださってありがとうございます。(T T）

アンケート項目
現在のご職業をお選びください

![スクリーンショット 2024-12-22 22.11.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/a2444478-996c-fc63-ad10-19b279948005.png)

会社員2名、フリーの方1名の結果です。

![スクリーンショット 2024-12-22 22.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/b6c12273-9992-57b9-d052-e763571a3775.png)

まぁ、この記事を見てくださってる母集団の中からなので、まだぼんやりと「いつか起業したいなぁ」くらいの方なのかもしれません。

主な不安や課題は以下の４つですね。最初のスタートアップの時に当時の社長が言ってた言葉を思い出しました。

「頭のいい人はリスクを考えて起業しないんだよ。」

当時は会社員気質だった自分もリスクを考えて起業を選ばないタイプだったので納得したのを覚えてます。

![スクリーンショット 2024-12-22 22.19.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/5b4a936e-2d7c-3234-7d3e-d62a1594e92c.png)

とまぁ、こんな感じでシンプルなアンケートでしたが、このアンケートに協力いただけた、3名のうち2名の方がフィードバック希望と来てたので、100万円未満から始めるならどのようにするかのプランやステップのアクションプランを考えた手順書とリスクを最小限にその代わり、リターンもそこまで大きくないけど、サラリーマンで稼ぐよりも多く稼げるExitプランが喜ばれそう。という最初の仮説をベースに展開してみようと思います。

![スクリーンショット 2024-12-22 22.22.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/56b9844e-2492-3f3b-f75c-08e7622f2d3d.png)
【Next.js】ページをリロードせずURLを変更する方法

ネイティブの`History API`を使用して、ページをリロードせずにブラウザの履歴スタックを更新できます。

## `window.history.pushState`の使用方法

`pushState`メソッドを使用すると、ブラウザの履歴スタックに新しいエントリを追加できます。これにより、ユーザーは前の状態に戻ることができます。例えば、商品のリストをソートする際に利用します。

```jsx
'use client'

import { useSearchParams } from 'next/navigation'

export default function SortProducts() {
  const searchParams = useSearchParams()

  function updateSorting(sortOrder: string) {
    const params = new URLSearchParams(searchParams.toString())
    params.set('sort', sortOrder)
    window.history.pushState(null, '', `?${params.toString()}`)
  }

  return (
    <>
      <button onClick={() => updateSorting('asc')}>Sort Ascending</button>
      <button onClick={() => updateSorting('desc')}>Sort Descending</button>
    </>
  )
}
```

- `useSearchParams`を使用して現在の検索パラメータを取得します
- `updateSorting`関数でソート順を設定し、`pushState`を呼び出してURLを更新します

## `window.history.replaceState`の使用方法

`replaceState`メソッドを使用すると、現在の履歴エントリを置き換えることができます。これにより、ユーザーは前の状態に戻ることができません。例えば、アプリケーションのロケールを変更する際に使用します。

```jsx
'use client'

import { usePathname } from 'next/navigation'

export function LocaleSwitcher() {
  const pathname = usePathname()

  function switchLocale(locale: string) {
    // 例: '/en/about' または '/fr/contact'
    const newPath = `/${locale}${pathname}`
    window.history.replaceState(null, '', newPath)
  }

  return (
    <>
      <button onClick={() => switchLocale('en')}>English</button>
      <button onClick={() => switchLocale('fr')}>French</button>
    </>
  )
}
```

- `usePathname`を使用して現在のパスを取得します
- `switchLocale`関数で新しいロケールに基づいたパスを生成し、`replaceState`を呼び出してURLを更新します
キャリアブレイク中の人との交流

# キャリアブレイク中の人との交流
キャリアブレイク中、特に始めたころは、結構頻繁に人に会っていました。まあ退職という目立ったことをしたので呑みに誘われたり、自分が会いたい人を誘ったりで、週一以上のペースで呑みに行っていました。呑み会自体は好きだし、友達と呑みに行けるならほぼ断ることはないんですが、問題は時間とお金です。

# お金と時間
自分が自由期間とはいえ、相手は仕事があるので基本夜に会うことが多いです。現在は22時には寝室に向かう生活スタイルなので、19時スタートとかで盛り上がったりすると割とタイムオーバーになったりします。でも、基本それが理由で解散になることは少ないので、必然的に夜遅くなって、次の日の朝起きることが遅くなります。また大阪で呑んで、往復すると1000円以上かかり、これも結構馬鹿にならない金額です。

# 出たいイベントもある
なので自由期間にしていた10月は兎も角それ以降は自分から積極的に誘うのは大分辞めました。もちろん優先したい交流もあるので、ゼロにはしていませんが、それまでに比べれば本当に数えるぐらいに抑えています。とはいえイベントとか自分にとって有益なものは当然続けているので、その分お金と時間は削ることになります。

# オンライン
ただ、以前に比べると人と話すハードルはかなり下がっていると思います。なんといってもオンラインで話すことが出来ます。オンラインであれば、距離も関係ないし、移動時間もいりません。また会ったことない人でも、いきなり呑みに行くのは難しくてもオンラインミーティングならハードルが下がります。これは本当にコロナによって人類が得たとても良い方法だと思っています。

# キャリアブレイクきっかけ
特にキャリアブレイクをしたことで連絡をくれた方がいます。どちらも直接お会いしたことはなかった相手で、いきなりDMもらって会うことになりました。どちらの出会いも自分にとっては刺激的で意味があり、こういう新しい出会いがあっただけでもキャリアブレイクした意味があったように感じます。

# 時間があることがきっかけ
また以前からの交友関係が、たまたまこのタイミングでつながり、自分に時間があるからこそ出来たこともあります。まだタネみたいなものですが、もしかしたらこういう所から仕事につながるようなこともあるかもしれません。

# さくらインターネット blooming camp
また、さくらインターネットのblooming campの第一期メンバーに選ばれたこともラッキーでした。3回ほどお邪魔していますが、都度知り合いが増えて広がりを感じます。正直もう少し何をしていいのかわからない感じになると思っていましたが、ここからも新しいつながりが持てそうで楽しみが増えました。

# まとめ
というわけで、わりと11月からは交流は減らしていくと思っていたのですが、どちらかというと増えているように思います。一方で今は勉強期間で優先順位はそちらにしたいので、時間の振り方はより難しくなっている気もします
【転職活動】入社後やりたいことがあるのは分かりました。今は何をしていますか？

# はじめに
アドベントカレンダーも残り一週間となりました。~~この記事を書いているのは22日(日)~~

# 本題

「入社後やりたいことがあるのは分かりました。今は何をしていますか？」

転職活動中に面接官に言われました。
正直ポートフォリオになるようなものは作っておらず、今後のキャリアついて話しているだけ...

面接官からしたら、「本当にやりたいなら自分である程度やっているはずでは？」と思うはずです。

当時の私はデータサイエンスとエンジニアの２軸で企業選びをしており、直近で経験しているエンジニアとしてやってきたことは地に足ついた話ができていましたが、データサイエンス周りは正直ふわふわした話しかできませんでした。

「データサイエンス周りは何やっていますか？」
と聞かれた際は、「データサイエンス分野と相性の良いpythonの勉強をしています」と答えることしかできませんでした。

~~回答として良くないですね~~

転職活動を振り返ったときに、唯一心残りだったのが自分で何か作らなかったということです。

この心残りを晴らすため、アドベントカレンダーを機にAIやデータサイエンス周りの記事などを投稿してきました。

複数の記事に分けて投稿しています👇

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

ちなみにこの手の質問をされたのは、2次面接の役職陣のパターンが多かったです。
しっかり見抜きにきていますよね。

次転職活動する機会があれば反省を生かしたいと思います。

# おわりに


現在転職活動をされている方で、何かやりたいことがある場合はかんたんなものでもいいので自分で作ってみたりやってみることをおすすめします。

レベル感どうあれ、本当にやりたいことが伝わるので好印象だと思います。
MySQLの出力結果を見やすくして作業効率を上げる

この記事は[株式会社カオナビ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kaonavi)の23日目の記事です。

## MySQLのページャーを変えてみる

MySQLのデフォルトのページャーは標準出力や `more` になっていてカラム内の文字列が長かったりカラムが多いと
折り返してしまって見づらい。

![more.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935013/0dad07a8-987f-2b18-c950-20e100540120.png)


そこでmysqlクライアントのページャーを `less` にすることで見やすくなり結果の検索も行えるようになる。
（改善後）
![less.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935013/34d87321-14da-67e2-5ecb-5db55f216d41.png)


## 検証環境

Windows11 

ubuntu バージョン

```
root@:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04.1 LTS
Release:        24.04
Codename:       noble
```

mysqlバージョン

```
root@:~# mysql --version
mysql  Ver 8.0.40-0ubuntu0.24.04.1 for Linux on x86_64 ((Ubuntu))
```

less バージョン

```
root@:~# less --version
less 590 (GNU regular expressions)
Copyright (C) 1984-2021  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Home page: https://greenwoodsoftware.com/less
```


## 設定方法

mysqlクライアントでmysqlサーバーに接続後、以下を実行

```sql
mysql> \P less -SinX
```

* `\P`: mysqlの接続したコネクション内のページャーを変更する。mysqlから抜けると元に戻る
* lessオプション内容
  * S: 長い文字列を折り返さず表示
  * i: 検索時に大文字小文字の区別をしない
  * n: 結果の行数のカウントを行わない。大量の結果が出力される場合には負荷軽減効果があるかも。
  * X: これ入れないとlessから抜けたときに画面に何も表示されないので不便。
* ページャーを元に戻す場合は `mysql> nopager`

## \P less -SinX の問題点

### 連続したクエリーを張り付けるとうまくいかない

以下のようにまとめて出力結果を取得、INSERTしたい場合などに
複数クエリーをコピーして貼り付けることがあるが、
ひとつめのlessが開いた状態で次のコマンドが実行されるので予期せぬ出力、結果になってしまう

* 初期状態のページャーでの出力結果（２つのクエリーをコピーして張り付けた）。うまくいく。

```sql
mysql> select count(*) from information_schema.TABLES;
+----------+
| count(*) |
+----------+
|      329 |
+----------+
1 row in set (0.01 sec)

mysql> select count(*) from information_schema.INNODB_COLUMNS;
+----------+
| count(*) |
+----------+
|      265 |
+----------+
1 row in set (0.00 sec)
```

* `\P less -SinX` にした場合の出力結果。lessのログ出力が呼ばれてしまっている。ディレクトリに酷い名前のファイルが作成される・・・

```sql
mysql> select count(*) from information_schema.TABLES;
+----------+(*) from information_schema.INNODB_COLUMNS;
| count(*) |
+----------+
|      329 |
+----------+
log file: elect count(*) from information_schema.INNODB_COLUMNS;
```

こういったクエリーを実行したい場合は
 `less` のオプション `-F` を利用することで画面内に収まる出力の場合は即座にlessが終了するのでうまくいくようになる。

ただ１つの出力結果が画面内に収まらない場合も考えられるので素直に `nopager` でページャーをリセットしたほうがよい。



## デフォルトでmysqlクライアントのページャーを変える

ページャーをセットしてもコネクションを切断すると元の設定に戻ってしまうため
デフォルトのページャーを変更する。

### mysqlclientの設定ファイルを変更できる場合

MySQLの設定ファイル(my.cnf)にてページャーの指定をすることが可能。

```bash
root@:~# cat /etc/mysql/conf.d/mysql.cnf
[mysql]
pager='less -SinX'
```

### mysqlの設定ファイルを変更できない場合

`.bashrc` などにaliasで設定する(ここでは別名のコマンドとして登録）

```
alias mysqlp='mysql --pager="less -SinX"'
```

## おわりに

mysqlのページャーを `less` にすることで見やすくその場で検索可能になるため非常に便利になる。
ただし問題点であげたように連続クエリーを実行する場合は意図しない動作になるため注意が必要。
もうずっとこのページャーの設定でやっているがなかなか問題点が解決するようなmysqlのアップデートや
lessのオプション追加はない。必要に応じて都度ページャーを戻している。
自分でスクリプトを作成してページャーに指定するとうまくいくらしいので時間を見て挑戦してみたい。
[Rust]BoxとDeref

## スマートポインタとしての`Box`

Rustでは、プログラム実行中にデータをメモリに格納するとき、状況に応じてスタックかヒープのどちらかに格納します。
スタックは出し入れが高速な一方で、データの型（すなわち、確保しなければならないデータ領域のサイズ）が定まっている必要があります。ヒープは可変サイズのデータも格納できる一方、アクセス速度はスタックに劣ります。

デフォルトでは可能な限りデータはスタックに格納されます。もしデータを明示的にヒープに格納したい場合は、スマートポインタの`Box`を利用できます。データの本体はヒープに置きつつも、そのデータへの参照を`Box`として宣言すれば、その参照自体はスタックに積むことができます（なぜなら、参照自体は固定長だから）。

### `Box`の使い方

`Box::new(値)`で作成できます。

```rust
fn main() {
    let x = 5; // スタックに格納
    let y = Box::new(5); // ヒープに格納

    println!("x = {}", x);
    println!("y = {}", y);
}
```

### `Box`を使うユースケース：再帰的なデータ構造

`Box`を使ってあえて明示的にヒープ領域を使うように指示するユースケースとして、再帰的なデータ型（構造体）を定義したいときがあります。
ある構造体のプロパティにその構造体自身が含まれている場合（構造体のネストがあり得る場合）、構造体のネストがどれだけ続くか分からず、構造体のデータサイズが決定できません。そこで、構造体そのものを含むのではなく、構造体へのポインタを含むように定義することで、構造体自身のサイズは固定になります。

```rust
enum List {
    Node(i32, Box<List>),
    Nil,
}

fn main() {
    let list = List::Node(1, Box::new(List::Node(2, Box::new(List::Nil))));
}
```

上記の例では、`List`は再帰構造になっていますが、`Node(i32, Box<List>)`のように`Box<T>`を使ってスマートポインタを含むようにしています。もしこれを`Node(i32, List)`のようにしてしまうと、コンパイラエラーになります。


## `*`で行うDeref

ポインタに`*`をつけて参照先の値を取得する操作をderefといいます。`Box`はスマートポインタでポインタの一種であるため、derefすることができます。

```rust
fn main() {
    let x = 5;
    let y = Box::new(x);

    assert_eq!(5, *y); // Derefを使用して値にアクセス
}
```

`*`をつけてderefできることは、厳密にいえば`Deref`トレイトを実装していることと等しいです。言い方を変えれば、`Deref`トレイトを実装することで、独自の型であっても`*`を使ってderefすることができます。

### 独自に`Deref`を実装する

`Deref`を実装するには、以下の定義が必要です。

- 関連型`Target`
- `Target`を返す`deref`メソッド

関連型とは、トレイトが要求する型で、トレイト実装のために必要なメソッド（今回でいえば`deref`）のシグネチャに必要な型になります。`deref`メソッドによってどのような型が返却されるかは、実装先の構造体がどのような型を返すつもりなのかによって決まります。そのため、実装先の構造体に`Target`という型を決めさせておき、それを返すように`deref`を定義しています。

```rust
use std::ops::Deref;

struct MyBox<T>(T);

impl<T> MyBox<T> {
    fn new(x: T) -> MyBox<T> {
        MyBox(x)
    }
}

impl<T> Deref for MyBox<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

fn main() {
    let x = 5;
    let y = MyBox::new(x);

    assert_eq!(5, *y); // Derefトレイトにより値にアクセス
}
```

:::note
分かりにくいですが、`MyBox`はタプル構造体になっています（`(T)`）。そのため、値は`&self.0`から取得できます。
:::

### 参照外し型強制

`Deref`トレイトを実装するメリットの一つに、参照外し型強制があります。`Box::new`を使って作成したスマートポインタの型は`Box<T>`になります。
例えばある関数が`&i32`を要求しており、その関数の引数に`Box<i32>`を渡したいとします。`Box<i32>`をderefすることで`i32`を取り出す必要があるように思えますが、実際はその操作をせずともコンパイルに成功します。

```rust
fn print_value(x: &i32) {
    println!("{}", x);
}

fn main() {
    let value = Box::new(42); // Box<i32>
    print_value(&value);      // Rustが自動的に参照外しして&Box<i32> -> &i32に変換
}
```

これは参照外し型強制という仕組みで、`Deref`トレイトが実装されている型を関数の引数に使うと、引数として要求されている型になるまで自動でderefを繰り返してくれる機能です。
AndroidViewで対象のアイテムを最上位にスクロールさせる

# はじめに
今回はAndroid ViewでRecyclerViewの最上位に任意のアイテムまでスクロールする方法を紹介します
### 本文
早速ですが、コードは下記のようになります
```kotlin
binding.recycler.post {
                val smoothScroller: RecyclerView.SmoothScroller =
                    object : LinearSmoothScroller(context) {
                        override fun getVerticalSnapPreference(): Int {
                            return SNAP_TO_START
                        }
                    }
                smoothScroller.targetPosition = it
                binding.recycler.layoutManager?.startSmoothScroll(smoothScroller)
            }
```
postはViewの準備ができたときに呼ばされるコールバックになっており、その中でRecylcerViewのSmoothScorllerに対して`SNAP_TO_START`を設定します
こうすることでSmoothScrollを呼び出したときに該当のアイテムがトップに来るようにスクロールしてくれます
### 最後に
よくあるScrollToではギリギリ見えるところまでしかスクロールしてくれなかったので躓いてしまいました
備忘録として残しておきますが、どなたかのお役に立てたら幸いです
今年1年を通じたエンジニアとしての働き方・価値観の変化についてふりかえる

# はじめに
今年1月に今の会社に入社し、約1年が経過しました。
新天地から新年がスタートし、この1年は私の中でエンジニアとしての働き方や価値観が大きく変わったなと感じているので、そのふりかえりをしようと思います。

:::note warn
個人の主観が含まれているため、必ずしも全ての内容が正しいということではないのでご注意ください。
:::

## 現環境での気づきと学び

- 何もかも自分でできなきゃいけないということはない
- 何回でも質問して良い姿勢
- エンジニアはただ物を作れば良いということではないこと
- フォロワーシップ

### 何もかも自分でできなきゃいけないということはない
入社した当初は、何もかも自分でできなきゃいけないという気持ちで業務に取り組んでいました。しかし、当時のスクラムマスター（@YUM_3）に全てできなくていいんですよという言葉と共に下記の記事を共有していただきました。

https://overreacted.io/things-i-dont-know-as-of-2018/

上の記事は、Reactの共同開発者の方が書いた記事になり、その方が知らないことをまとめている記事になります。
これを知った当時は、React開発者の方でもこんなに知らないことが沢山あるんだと衝撃を受けました！
（知らないのレベルがそもそも違う説はありそうですが...）
その時に全てできる必要はないんだなとすごく痛感しました！
これをきっかけに、**必要になった時にその分野について学ぶ** という姿勢に変わっていきました。
苦手な分野やあまり知見がない分野については、周りに助けを求めながら解決するようになりました！
周りに助けを求めることをできるのが組織の強みでもあると思います。

### 何回でも質問して良い姿勢

> 分からなかったら何度でも質問して良いので！

この言葉は、私がチームに参画した当初、業務委託の方からいただいた言葉になります。
私は理解するスピードが早い方ではないので、この言葉は気持ちがすごく楽になったのを今でも覚えています！
こういう発言しやすい環境をつくることや、みんなが楽しく働けるようにコミュニケーションを取っていくことは今でも大事にしています！

### エンジニアはただ物を作れば良いということではないこと
正直、上から渡ってきたものをそのまま作る方が楽だとは思います。
（こちらは業務形態によって変わるものかと思います）
私も前職では、上から渡ってきたタスクをそのままこなしていました。そのタスクが渡ってきた背景だったり、前提を疑うみたいなことは特に意識しておりませんでした。
というのも、私の中でエンジニアは求められている物を開発できれば、それで良いと思っていたからです。
前提、求められているものを開発できることはとても大切なことだと思います。

現環境は、正反対で手を動かす時間が前職と比べると短く、ステークホルダーと一緒に要件を詰めていく作業を行ったり、必要に応じてヒアリングしたりする時間が多くなりました。

現環境を通じて、より使われるプロダクトになるためには、ステークホルダーとの対話や、ユーザーの業務フローを開発者側がしっかり理解することがとても大切だなと思いました。
そうすることによって、そもそもの前提を疑ったり、こうしたらもっと業務フローをシンプルにできるのではないか、こういう機能があったらもっと楽になるのではないかというのが発見できるかもしれないからです。
それらのことが頭の中にあるかないかで、出来上がってくるものの質に大きく影響するのではと思いました。

### フォロワーシップ
こちらは、同じチームでPOを担当していた野澤（@TairaNozawa）さんと業務委託の方からいただいたアドバイスになります。
例えば、日頃の問い合わせなどから、今相手が必要としている情報は何なのか、どんな情報が共有されていたら嬉しいのか、問い合わせいただいたことに対する感謝の気持ちを意識するなどです。
現在は、相手の気持ちを考えて、また気軽に相談できるような関係を日頃の業務から意識するようになりました！

また、この情報は新しいメンバーが参画してきた時に欲しいだろうなと思うことは、自分の中でクローズするのではなく、なるべく知っているノウハウはドキュメントなどでオープンにすることを意識するようになりました。

## 最後に
私の中で今年1年は、エンジニアとしての働き方や価値観が大きく変化した年だったと思います。来年も大切だと思ったことは引き続き継続しつつ、日々アップデートしていければと思います。
この記事が少しでも参考になりましたら幸いです。

最後まで読んでいただきありがとうございました！
日報半自動化ツール

### 今回、「エニプラアワード2024」という社内のチームごとに成果物を発表するイベントにて、所属チームの成果物として発表した「日報半自動化ツール」について紹介します。

 
##  作成目的
本プロジェクトの目的は以下の3点です。

 
#### １. **過去に作成した日報自動化ツールのブラッシュアップ**
#### ２. **日報作成業務の効率化と記載ミスの低減**
#### ３. **プログラミング初心者メンバーへの学習機会提供**

 
## 2022年度に作成していた日報自動化ツールとの比較
2022年度に作成した日報自動化ツール
【2022年度（前回）】
■言語：ExcelVBA
■目的：日報送付時に使用するWebメールソフト「Roundcube」（以下、Roundcube）を介さず、Outlookからの日報メール作成及び送信の自動化。
■結果：Outlookからの日報メール送信の自動化に成功。しかし、日報提出時に使用するメールアカウントからの送付は、サーバー情報が必要であり、セキュリティの関係上情報取得NGとなり未実装。
 
【2024年度（今回）】
■言語：Java Development Kit
■目的：Outlook上からではなく、Roundcube自体へのログイン、メール記載、送信までの自動化。
■結果：次項目以降にて記載##  技術スタックと開発内容

### 技術スタックと実装内容
 ・ Java
 ・ Eclipse 
 　　-Springboot
・Java Development Kit
・HTML
### 実装内容
- **Roundcubeへの半自動ログイン機能**
- **入力内容のテキスト出力**
 ※ただし、Roundcubeのメール作成ページへの内容転記は未実装

### ディレクトリ構成（日報入力サイトへ接続する為のEclipse構成画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329731/1ed20067-2a8d-be49-134f-97339961c40f.png)

##  成果物
### テキスト出力手順
Eclipseのスクリプト実行後に「日報入力」画面へ接続される為、下記手順にて日報作成及びRoundcbeログインを実施。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329731/a7cea6f2-13f1-7e47-1bea-dea518636a01.png)

1.各項目に内容を入力
2.送信を押下する
3.テキスト出力される
4. 「ラウンドキューブへ」ボタンを押下する
5.自動的にRoundcubeにログインする

##  今後の展望・課題
### ■作業後の感想
### ・良かった点
・昨年のアワード成果物である「Pythonを利用したゲーム制作」と比較し、今回、日報という実際の業務でも使用できるツール作成を目標としたことで、より具体的に方向性を見据えた開発・改良ができ、チーム全体で使用感、課題を共有しやすかった。
・ツールを１から新規作成するのではなく、既存のツールを改良することで、何を目標や課題として進めていくか明確化できた。

### ・反省点
・要件定義を詰めることができず、開発における障害になってしまった。
・課題に対して「どのように構築を進めていけば解決できるか」が検討しきれなかった。
・スキルや手順の難易度が高かったことにより、達成できず課題となってしまった部分があった。

##  最後に
### 【チーム内感想】
#### 2022年度の成果物を基に更なる改良を重ねた今年ですが、まず成果物をしっかりと形にすることができたことは、非常に良かった。
#### 一方で、改善点や追加できる点も多くあると認識しており、来年以降もチームでの作成を継続していければと検討している。
#### 全体を通して、プログラミングに慣れていないメンバーにとって学習の機会となり、参考資料や意見交換など、チームとして成果物を作成することに集中できた点は大きな成果だった。
#### 今回のアワード成果物を作成する過程で学んだIT技術やチームでの行動は、今後の業務にも生かしたい。
Advent Calendar 2024 #5日目】AWS学習〜生成AI/ML編〜 Amazon Q

# はじめに
本記事は、「初めての一人アドベンドカレンダー2024 by hohe」の5日目の記事となります。
Advent Calendar 期間中は、AWSの生成AI/ML関連を中心に記事を投稿していきます。
5日目は、Amazon Qについてまとめます。

# Amazon Qとは
Amazon Q Business は生成 AI を活用したアシスタントで、企業のシステム内のデータや情報に基づいて、質問への回答、要約の提供、コンテンツの生成、およびタスクの安全な実行を行うことができる。

https://aws.amazon.com/jp/q/?gclid=CjwKCAiAjp-7BhBZEiwAmh9rBYy96p_mU4u_KoGeSEBUu0JcAgUaaZQ3PlNHtT1QpBEqFnvhkvjZBhoC1IgQAvD_BwE&trk=c7a6dda4-2145-422b-bbe8-258d95ff033f&sc_channel=ps&ef_id=CjwKCAiAjp-7BhBZEiwAmh9rBYy96p_mU4u_KoGeSEBUu0JcAgUaaZQ3PlNHtT1QpBEqFnvhkvjZBhoC1IgQAvD_BwE:G:s&s_kwcid=AL!4422!3!706705912535!p!!g!!%22%E3%82%A2%E3%83%9E%E3%82%BE%E3%83%B3%20q%22!21474321550!173353350148


### Amazon Q Business
生成 AI を活用したアシスタントで、企業のシステム内のデータや情報に基づいて、質問への回答、要約の提供、コンテンツの生成、およびタスクの安全な実行を行うことができる。

https://aws.amazon.com/jp/q/business/

### Amazon Q Developer
アプリケーションのコーディング、テスト、アップグレードから、エラーの診断、セキュリティスキャンと修正の実行、AWS リソースの最適化まで、あらゆるタスクにおいてデベロッパーと IT プロフェッショナルをサポートする。

https://aws.amazon.com/jp/q/developer/

### Amazon QuickSight
クラウド規模のビジネスインテリジェンス (BI) サービスで、ブラウザからアクセスしてAWSに蓄積されたデータの分析や可視化を実現する。

https://aws.amazon.com/jp/quicksight/q/

### Amazon Connect
コンタクトセンターの顧客とユーザーに 1 つのシームレスなエクスペリエンスを提供する AI ベースのアプリケーション。

https://aws.amazon.com/jp/connect/q/

### AWS Supply Chain
クラウドベースのサプライチェーン管理アプリケーションで、サプライチェーンデータを統合し、機械学習 (ML) を活用したコネクタと実用的なインサイトをもたらし、組み込みのコンテキストコラボレーションを実現する。

https://aws.amazon.com/jp/aws-supply-chain/
【GPTプロンプト講座基礎編⑦】プロンプトをシステム化して活用する方法

# §プロンプトエンジニアリング基礎編⑦
※本記事は執筆にあたり生成AIツールを使用している箇所があります
※プロンプトの基礎部分は生成AIで作成し、具体例や体験談を自分の視点で補完しています

こんにちは。ゆずかきです。
前回は、プロンプトエンジニアリングを学ぶためのマインドセットや学習方法についてお話ししました。今回は、それを一歩進めて、「プロンプトをシステム化して活用する方法」をご紹介します。

プロンプトエンジニアリングは、単発の使い方だけでなく、仕組みとして組み込むことで真価を発揮します。たとえば、業務や趣味のプロジェクトで定型作業をAIに任せるようにすれば、大幅な効率化が期待できますよ。
定型作業の効率化は、AI活用の真骨頂ですね。

それでは、実際のアイデアや実例を交えながら、プロンプトのシステム化について見ていきましょう！


# §システム化の基本的な考え方
プロンプトをシステム化する際に押さえておきたいポイントは以下の3つです。

- 反復可能なプロンプトを作る
毎回異なる指示を投げるのではなく、再利用可能なプロンプトをテンプレート化しておきます。TXTファイルやExcelにストックするのがおすすめです👆
これにより、作業の安定性と効率が向上します。
　
- プロンプトと目的を紐づける
プロンプトをシステム化する際は、「このプロンプトで何を解決したいのか」を明確にすることが重要です。
たとえば、「データを要約する」「顧客メールを生成する」といった具体的な目的を設定しましょう。
　
- ツールやAPIを活用する
手動でプロンプトを入力するだけでなく、Pythonや各種APIを使えば、定型タスクを自動化する仕組みを作れます。
これがシステム化の鍵となります。
※ただし、API利用などには料金が発生することもあるので、十分に調べてからお願いします。


# §実例: テンプレート化されたプロンプトの活用
私が実際に活用しているテンプレート例をいくつかご紹介します。これらを参考に、自分の用途に合ったプロンプトを作ってみてください。

#### 1. データ整理用のプロンプト
目的: 散らばった情報を効率的にまとめる
- 「次のデータセットを箇条書きで要約してください。」
- 「以下の文章から、重要なキーワードを3つ挙げてください。」
　
#### 2. 文章生成用のプロンプト
目的: ブログやメールなどの文章作成を効率化する
- 「上司への報告メールを200字以内で作成してください。」
- 「次のテーマでブログ記事の冒頭文を書いてください：エンドラ討伐。」
　
#### 3. 創造的タスク用のプロンプト
目的: アイデア出しやブレインストーミングをサポート
- 「エコをテーマにした新しい日用品のアイデアを5つ挙げてください。」
- 「次のキャラクター設定をもとに短編小説の冒頭を考えてください。」

　
**重要なのは、テンプレートをストックしておいて、いつでも取り出せるようにしておくこと！これにより、AIを使う速度と効率が向上します！**


# §プロンプトのシステム化を実現する手順
では、テンプレート化したプロンプトをどのようにシステム化すれば良いのか、具体的な手順を説明します。

#### 1. プロンプトを整理して保存する
まずは、日常的に使うプロンプトを整理し、手軽にアクセスできる場所に保存します。
ExcelやGoogleスプレッドシートを使えば、簡単に管理できます。

- カラム例: プロンプト内容 / 目的 / 出力形式 / メモ
→この下に、具体的な内容を書いてストックしていきます

#### 2. 日常タスクに組み込む
スクリプトをスケジュール管理ツール（例: cronやタスクスケジューラ）に登録すれば、指定した時間にプロンプトを自動実行する仕組みを構築できます。
これにより、頑張れば、完全な自動化が実現します。


# §プロンプトシステム化の応用例
さらに高度なシステム化のアイデアをいくつか挙げます。

#### 1. 業務プロセスの自動化
- 毎日の定型メール作成をAIに任せる
- 会議の議事録を要約し、簡潔にまとめる
　
#### 2. 創作活動のサポート
- 小説やブログのアイデア出しをルーチン化する
- キャラクター設定やプロット作成を効率化する
　
#### 3. データ分析の効率化
- データセットの要約やグラフ作成の手助けをAIに依頼
- トレンド分析や結果予測をプロンプトで補助


# §まとめ
プロンプトをシステム化することで、定型作業を効率化し、時間を他の創造的なタスクに使えるようになります。
テンプレート化、ツールの活用、そして自動化のステップを踏むことで、AIの可能性をさらに広げることができます。
　
**🔑 この記事のポイントまとめ**
**反復可能なプロンプトを作る → テンプレート化して再利用せよ。**
**プロンプトと目的を紐づける → 解決したいタスクを明確にせよ。**
**ツールやAPIを活用する → 手動から自動化へシフトするのもアリ。**
**プロンプト管理をシステム化 → 整理してアクセスしやすくすること！**
**業務や創作活動に組み込む → 日常タスクを自動化し、時間を創造的活動に使うこと。**
　
次回は、プロンプトエンジニアリングの実務応用や、さらに高度な応用事例について掘り下げていきます。どうぞお楽しみに！

ご訪問ありがとうございました！
TypeScriptとPythonの違い

## PythonとType Scriptって何が違うの？

#### 結論
- Pythonは動的型付け言語
    - 　変数を宣言するときに型を指定しなくても問題なし
    - 　ランタイム時に型を指定する
- Type Scriptは静的型け言語
    - 変数を宣言する際に方を明示するのが一般的
    - コンパイル時に型エラーを検出できる
        - const は再代入不可、letは再代入可

#### 例
- Python
``` index=len(arr)-1```
- TypeScript
``` let index:number=len(arr)-1;```
【MUI DataGrid × dnd kit】 指定したrenderCellのコンポーネントのみドラッグが反応するようにする

# はじめに

今回は、MUI DataGrid × dnd kitで、指定したrenderCellのコンポーネントのみドラッグが反応するようにする方法を紹介します。

正直、かなり無理矢理な方法なのでもっと良い方法があればコメントで教えていただけると幸いです🙇‍♂️

## バージョン

- @dnd-kit/core: ^6.3.1
- @dnd-kit/sortable: ^10.0.0
- @mui/x-data-grid: ^7.22.3
- react: 18.3.1
- next: 15.0.3

## サンプルコード

```tsx
import { useSortable } from '@dnd-kit/sortable';
import Box from '@mui/material/Box';
import {
  GridRow,
  type GridRowProps,
  type GridRenderCellParams,
} from '@mui/x-data-grid';
import { cloneElement, isValidElement, memo } from 'react';
import { CSS } from '@dnd-kit/utilities';

const DraggableGridRow = memo((params: GridRowProps) => {
  const { attributes, listeners, setNodeRef, transform, transition } =
    useSortable({ id: params.rowId });

  const style = {
    transform: CSS.Transform.toString(transform),
    transition,
  };

  const enhancedParam = (param: GridRowProps) => {
    const updatedVisibleColumns = [...param.visibleColumns];
    if (updatedVisibleColumns[0]?.renderCell) {
      const originalRenderCell = updatedVisibleColumns[0].renderCell;

      // renderCellをラップして新しいものに置き換え
      updatedVisibleColumns[0] = {
        ...updatedVisibleColumns[0], // renderCell以外のプロパティを維持
        renderCell: (cellParams: GridRenderCellParams) => {
          // 元のrenderCellが返す要素を取得
          const originalElement = originalRenderCell(cellParams);

          if (isValidElement(originalElement)) {
            // ドラッグ用の属性を追加し要素をクローンして返す
            return cloneElement(originalElement, {
              ...attributes,
              ...listeners,
            });
          }

          return originalElement;
        },
      };
    }

    return {
      ...param,
      visibleColumns: updatedVisibleColumns,
    };
  };

  const updatedParams = enhancedParam(params);

  return (
    <Box ref={setNodeRef} style={style}>
      <GridRow {...updatedParams} />
    </Box>
  );
});

DraggableGridRow.displayName = 'DraggableGridRow';

export default DraggableGridRow;
```

### ちょこっと解説

useSortableで返されるattributesとlistenersを、GridRowのrenderCellで返されるコンポーネントに渡すことで、行の中でそのコンポーネント部分のみドラッグできるようになります。

他の列をドラッグできるようにしたい場合は、`updatedVisibleColumns[0]`の部分のインデックスを変更してください。

## おわりに

短いですが、以上がMUI DataGrid × dnd kitで、指定したrenderCellのコンポーネントのみドラッグが反応するようにする方法の紹介でした。

もっと良い方法があればコメントで教えていただけると幸いです！

最後まで読んでいただき、ありがとうございました！
エンコーダの波形　オシロスコープで観察

こんにちは　ロボットテクノ部です。
今回は、ロボットの走行した距離を調べるため、エンコーダの特徴や、プログラムの勉強をしました。![1000000105.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914799/0ea2ee19-5b52-5eaf-69e1-c60d4e563029.jpeg)

使用したもの
Arduino MEGA
エンコーダ:HCLT-2017-A00
水晶発振器:TO-92型　水晶発振器10MHz
【PowerShell】年月日が含まれるファイル名をまとめてリネーム

該当フォルダの年月日が含まれているファイル名をまとめて変更します。
議事録20241101-作業.txtのようなファイルを１つ１つリネームしていました。
量は多くないのですが精神的負担を解消するために作成しました。

以下バッチファイルを実行、同フォルダのパワーシェルが起動して以下の画面のようになります。
変更したい年月日、新しい年月日を入力するとまとめて変更ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968014/c60719eb-8076-7e0f-5411-0f359ef2335d.png)

```rename_yyyyymmdd.bat
@echo off
powershell -executionpolicy RemoteSigned -File ".\%~n0.ps1"
pause
```

実行するディレクトリの配下のtestフォルダにあるファイルに対して実行しています。
-executionpolicy RemoteSigned:

-executionpolicy オプションは、PowerShell のスクリプト実行ポリシーを指定します。スクリプト実行ポリシーにはいくつかの種類がありますが、RemoteSigned は、ローカルで作成したスクリプトは制限なく実行でき、リモートからダウンロードしたスクリプトは信頼されている証明書が必要であるという設定です。つまり、この設定では、インターネットなどからダウンロードしたスクリプトは、署名されていなければ実行できません。

".\%~n0.ps1":

. \ は現在のディレクトリを示す相対パスです。
%~n0 はバッチファイル内で使われる特殊な変数です。バッチファイルの名前を拡張子なしで取得します。%~n0 はバッチファイルの名前そのものを指します。
したがって、%~n0.ps1 は、バッチファイルと同じ名前の .ps1 拡張子を持つ PowerShell スクリプトファイルを指します。例えば、script.bat というバッチファイルがある場合、%~n0.ps1 は script.ps1 を意味します。

```rename_yyyyymmdd.ps1
#名前を変更するパスを指定
$directory = "$PSScriptRoot\test"
# 古い日付を入力として受け取る
$oldDate = Read-Host "変更したい年月日をYYYYMMDD形式で入力してください(例:20241101)"
# 新しい日付を入力として受け取る
$newDate = Read-Host "新しい年月日をYYYYMMDD形式で入力してください(例:20241201)"
Write-Host "$oldDate -> $newDate"

if ($newDate -match "^\d{8}$" -and $oldDate -match "^\d{8}$") {　
    # 指定された oldDate に一致するファイルを取得
    $files = Get-ChildItem -Path $directory -Filter "*$oldDate*"
    
    if ($files.Count -eq 0) {
        # ファイルが見つからない場合
        Write-Host "$oldDate が含まれるファイルが存在しません " -ForegroundColor Red
    } else {
        # 見つかった場合の処理
        foreach ($file in $files) {
            # 新しいファイル名を作成
            $newFileName = $file.Name -replace $oldDate, $newDate
            
            # 新しいファイルのフルパスを作成
            $newFilePath = Join-Path -Path $directory -ChildPath $newFileName
            
            # ファイル名を変更（リネーム）
            attrib -r $file.FullName
            Rename-Item -Path $file.FullName -NewName $newFileName
            
            # 結果を表示
            Write-Host "Renamed: $($file.Name) -> $newFileName"
        }
    }
} else {
    Write-Host "YYYYMMDDの形式で入力してください(例:20241101)" -ForegroundColor Red
}

```

ps1とbatファイルがある配下にtestファイル（対象ディレクトリ）を作っていますが、使用する際はお好きなパスをいれてください。
これがエンジニア流のクリスマスプレゼント！🎅

# はじめに

この記事は、株式会社スピードリンクジャパン Advent Calendar 2024 の24日目の記事です。

https://qiita.com/advent-calendar/2024/slj

今年のクリスマス、大切な人にサプライズプレゼントを贈りませんか？
今回紹介するflutterのパッケージを使えば、QRコードを通じて特別な画像やメッセージを簡単に作成できます。
初心者でも楽しく取り組める内容をゼロから解説しますので、ぜひ挑戦してみてください！

## **クリスマスQRコードの完成イメージ**

今回は私から皆さんへのクリスマスプレゼントです！
以下の画像が今回の記事で作成したQRコードの成果物です！
QRコードを読み込んでみてください。
サンタさんからの特別なプレゼントが表示されます！

<br>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798484/c4f1900e-b6f9-df4e-1367-9977796f1d5d.png
" alt="QRコード作成画面" width="250">
<br>

---


以下の画像が表示されたかと思います。

<img src="https://drive.google.com/uc?id=1nqa0RaXHWRTEOo2_r2MyAIZT7JFQJig_" alt="QRコード作成画面" width="200">

こちらの画像は知人に作成していただきました。
どなたでも自由にダウンロードしてお使いいただけますので、クリスマスの演出にぜひご利用ください！

---


## **作成の流れ**

### 使用したパッケージ

この記事では以下のFlutterパッケージを使用しています。

- **qr_flutter**: QRコードを簡単に生成・表示するためのパッケージ。
    - [qr_flutter パッケージページ](https://pub.dev/packages/qr_flutter)

以下のコマンドでパッケージをプロジェクトに追加してください：

```
flutter pub add qr_flutter
```

---

### 1. プレゼント用のURLを用意する

QRコードには、贈り物として表示したい画像やメッセージのURLを埋め込みます。

例えば、特別なクリスマスカード画像のリンクを以下のように設定します：

```
https://example.com/sample-christmas-image.png
```

### 2. QRコード生成コード

qr_flutterを使えば、簡単にQRコードを生成できます。以下のコードを参考にしてください：

```dart
Container(
  padding: const EdgeInsets.all(16),
  decoration: BoxDecoration(
    color: Colors.white,
    borderRadius: BorderRadius.circular(16),
    boxShadow: [
      BoxShadow(
        color: Colors.black.withOpacity(0.3),
        blurRadius: 8,
        offset: const Offset(0, 4),
      ),
    ],
  ),
  child: QrImageView(
  //実際のurlを入れてください。
    data: 'https://example.com/sample-christmas-image.png',
    version: QrVersions.auto,
    size: 200.0,
    backgroundColor: Colors.white,
  ),
)
```

このコードで、プレゼント用のQRコードを簡単に作成できます。

---

## **遊び心を加えたクリスマスアイデア**

- **背景デザインを工夫する**:
クリスマスらしい背景画像を追加することで、より季節感を演出できます。
- **Flutter Webで公開する**:
作成したQRコード生成アプリをWebに対応させれば、家族や友人と簡単に共有できます。
- **サプライズメッセージ**:
QRコードのリンク先に、個別のメッセージや写真を埋め込んでみましょう！

---

## **完成したら教えてください！**

ぜひ、あなたもこのQRコードを作って、家族や友人に贈ってみてください！
もし完成したら、コメント欄やSNSでシェアしてみんなでクリスマスを盛り上げましょう！ 🎄🎅

---

## **まとめ**

サンタさん気分で、QRコードを使ったクリスマスプレゼントを作ってみませんか？
この簡単なコードで、きっと特別な思い出を作ることができます。
ぜひ、この記事を参考にしてFlutterで素敵なクリスマスを演出してみてください！ 🎄🎁

メリークリスマス！🎅
【メモ】linux 環境における vuetify の設定

<h1>なにをつくるのか</h1>
<p>
【名称】<br>
ウェブ版スタンプラリー
</p>
<p>
【制作理由】<br>
特定の地域の方との提携のため。産学連携の一種。
</p>
<p>
【用途】<br>
　特定のイベントが開催された際に、購入時に店側が提示したQRコードを読み取ってスタンプを取得、その数に応じて地域特有のクーポンを配布する。いたって単純なスタンプラリー。
</p>

<h1> vuetifyを選んだ理由 </h1>
<p>
　私は、これまで簡易的なウェブサイト（自己紹介など）の制作をおこなってきましたが、今回は実用性のあるものにし、提供・公開利用されるということで、コード直書きの修正をやめる必要がありました。
</p>
<p>
　そこで自分が所属している課外活動でお会いするアドバイザーに尋ね、おすすめを聞いたところ、<a href="https://vuetifyjs.com/ja/">Vuetify</a> を教えていただきました。制作期間に対して、提供までの猶予時間が残り３か月を切っており、複雑なプログラムをまだ書いていなかったことから、このツールを利用（移行）することを決めました。
 </p>
<h1>環境づくり</h1>
<h2>パッケージ</h2>
<p>
　私は今回、<a href="https://bun.sh/docs/quickstart">Bun</a> での環境づくりをおこないました。
</p>
<h2>設定方法</h2>
<p>
　これからは公式ドキュメントに従ってコードを書いていきます。
 </p>
<h3>Bun のインストール</h3>
 
```
# Linux ユーザのみ
$ sudo apt install unzip # Bun インストールに必要な unzip パッケージをインストール
# 以下、Lnux ユーザ、macOS ユーザ
$ curl -fsSL https://bun.sh/install | bash # for macOS, Linux, and WSL
$ curl -fsSL https://bun.sh/install | bash -s "bun-v1.0.0"
```

<h3>Docker</h3>
<p>
　Bun は、Lnux x64 と arm64 の両方をサポートする <a href="https://hub.docker.com/r/oven/bun/tags">Docker イメージ</a>を提供する。
</p>

```
$ docker pull oven/bun
$ docker run --rm --init --ulimit memlock=-1:-1 oven/bun
```

<p>
　そのほかは<a href="https://bun.sh/docs/installation#docker">公式ドキュメント</a>に記載してるので割愛する。
</p>

<h3>インストールの確認</h3>
<p>
　Bun が正常にインストールされたことを確認するには、新しいターミナルウィンドウを開いてつぎのコードを実行する。
</p>

```
$ bun --version
# 1.x.y
```

<p>
使用している  oven-sh/bun の正確なコミットを確認するには、次を実行する。
</p>

```
$ bun --revision
# 1.x.y+b7982ac13189
```

<p>
また、必要があれば次のようにアップグレードする。インストールされると、バイナリは自動的にアップグレードされる。
</p>

```
$ bun upgrade
```

<h1>おわりに</h1>
<p>
　私個人が発するなかに、有益な情報はなかったと思いますが、それは許してほしいです。なにせ自分自身に対するメモの一つでもあるため、のちにここを更新していく可能性があるものの、はじめのほうはテンプレートのような書き方でおさまってしまうためです。これからもいい記事を書けるように努めていきます。
</p>
<p>
公式サイト確認日：2024/12/22
</p>
<p><a href="https://bun.sh/docs/installation">公式ドキュメント</a></p>
Siv3D × photonの公開前β版でゲームを作った話

# はじめに
[photon](https://www.photonengine.com/ja-jp)とは、Exit Gamesが提供するマルチプレイヤーゲーム用の通信フレームワークサービスの総称で、photon Realtimeやphoton Fusionなどいくつか製品が存在し、無料で使えるフリープランも用意されています(*katteni Direct Marketing*)。

2022年5月21日に[Siv3D@0.6.4](https://siv3d.github.io/ja-jp/releases/)がリリースされ、Siv3D内でphoton Realtime SDKと連係したコードを書ける公式アドオンが追加されました。

…が、実は僕(たち)はそれ以前のSiv3D@0.6.2の頃、いろいろあってこのアドオンの開発者さんと連絡をとり、未完成のβ版を使わせていただいたことがあったので、その時作ったゲームの概要を紹介しようと思います。
また、最新のSiv3D@0.6.15 & 公式アドオン環境への移植については、作ったのが2年前であり~~あれそもそもおれなにかしてたっｋ~~
中身をすっかり忘れてしまい解読作業から始めているため作業が終わっておらず(というかほぼ書き直し状態)、先日のSiv3D京都実装会にて**移植するより自分で2を作ろう**、という話になって今鋭意制作中なのでここではその話は省略します。
# 作ったもの(3年前)
動作するバイナリは残っていたので、Releaseからぜひ遊んでみてください。

https://github.com/nitsc-proclub/Bunaiprocon2022

1 vs 1の2D陣取りゲームを作りました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/LIc5r0kGuOc?si=Za8iPURBwY0KVrqo" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## マップ
- マップ(迷路)はランダムに自動生成される
- 基本視点は見下ろし型で、自分の周囲しか見えない
- マップ上を歩くことで地面を塗り進める
    - 移動速度は**敵陣の塗り返し** < **中立地帯塗り** < **自陣移動** 
    - 全体マップには塗った自陣だけが表示され、リアルタイムに更新される
- 相手とぶつかると両者ランダムな地点にワープ
## 目的
- より多くのマスを塗り、迷宮を**脱出**すること
- ゴール(出口)の上に立ち、Enterキーでゴールする
    - 素通りして、もっと塗ってからゴールする戦略も○
    - 一方がゴールすると**制限時間短縮** & ゴール出来ないと最終陣地数に**ペナルティ**
        - 後からゴールしたことによるペナルティは無し
## アイテム
- マップには**アイテム**が落ちていて、拾うと任意のタイミングで使える
- バフは自分に、デバフは相手に適用される
- アイテムの種類は以下の通り：
    - 移動速度バフ・デバフ
    - 視界バフ・デバフ
    - ゴールへの方向表示
    - 相手プレイヤー位置への方向表示
        - 方向表示系はコンパスのような感じで、効果時間中はリアルタイムで更新
- 効果時間は**10秒**、ゴール方向表示のみ5秒
## リザルト
- 塗ったマス数(+ ペナルティ)で勝敗が決まる
- 全体マップでの早送りリプレイ、使用アイテム数が表示される


# 実装
実装の解説は軽くに留めます、~~もう覚えてないので~~ 
## オンライン通信
イベントコードによる場合分けを多用しているため、かなり可読性が低くなってしまっていますが、これらのデータを相手クライアントに送っています。
- 自プレイヤーの位置のPoint(毎フレーム)
- デバフアイテムを使ったという情報
- アイテムを使い切ったという情報(リザルトのアイテム履歴のため、全アイテムで送る)
- 自視点のマップGrid( = 自陣の情報)
    - ちょっとした工夫として(先輩による実装)、マップのGridをそのまま送るのではなく文字列に圧縮してから送るようにしています。

## リザルト
リザルト画面のリプレイ表示は、単純にマップのGridを毎秒Arrayに保存し、それを呼び出すという力技で解決しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620524/49348e63-9807-762f-aa96-06a9e6c33559.png)

# おわりに
せっかくの(恐らくは)初Siv3D x Photonゲームなので、２作って復活させたいね
BigQuery Workflows でワークフローを作成する

# BigQuery Workflows でワークフローを作成する
## はじめに
以前 BigQuery Dataform でワークフローを作成しました。

https://qiita.com/ysmmb12/items/823e45a73579e5ab480c

Google Cloud Next '24 で発表されたワークフローサービス BigQuery Workflows がプレビューとなったので、Dataform と比較しつつ試してみました。

## BigQuery Workflows 
BigQuery コンソール画面のタブ追加から、「ワークフロー」でエディタを開けます。

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/176e6ef6-6c88-f1cc-83ea-adfe7fe59bcb.png)

### 設定
Workflows ごとに、そのワークフローを実行するサービスアカウントを指定する必要があります。
Dataform では「デフォルトの Dataform サービスアカウント」（`@gcp-sa-dataform.iam.gserviceaccount.com`）が用意されていますが、Workflows ではデフォルトの Compute Engine サービスアカウントを指定できます。
また、Workflows 専用のロールを付与する必要があります。設定タブから指定できます。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/9b42d868-552b-e814-22f4-ebb7fa570805.png)

### ワークフロー作成
2024/12 現在、ノートブックと SQL の2種類を使えます。
それぞれワークフロー用に新規に作成することもできますし、すでにプロジェクトに保存しているノートブック・SQLを使うことができます。

![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/a4e72bc2-f90c-2888-5f82-f205cff697eb.png)

タスクの実行順は、タスク選択後そのタスクの前に実行したいタスクを指定します。

![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/783cf02f-1118-fa18-de9f-6eefedc63475.png)

前に実行したいタスクは複数指定可能です。ワークフローの図は自動で成形されるので、ユーザーが動かすことはできません。

![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/5933f250-0bf9-cbc6-de37-3aff6d464e74.png)


ワークフローの実行履歴は「実行数」タブより確認できます。
ツリー展開でタスクごとの実行状況を確認できます。

![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426544/2fb5c1d2-a710-04c5-9cd4-abcba673edbe.png)

Dataform では実行や編集などの各操作の権限管理はないですが、Workflows ではワークフローごとに共有したいユーザー・グループを指定する必要があります。
このあたりの権限周りはクエリやキャンバスなど、他の権限管理と同じのようです。

### 触ってみて
Dataform は sqlx を使って実装する必要がありますが、Workflows は BigQuery で使っている SQL をそのまま使用できる、すでに作成した SQL やノートブックをすぐ組み込めるという点で使い始めやすいと感じました。
一方で、Dataform の利点であった変更履歴管理はないので、チームで開発する場合は Dataform、個人で使う場合は Workflows という使い方を想定していると感じました。

以上です。