OmniAICreator/Qiita-1.07M huggingface dataset:
Autonomous DatabaseのTable AI Assistを試してみた

# はじめに
* Autonomous Databaseの新機能の[Table AI Assist](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/table-ai-assist-tool.html#GUID-1DD0FE6F-2DBD-40BC-8F64-8031ED559DDE)がリリースされました。
* この機能は、Database Actionsのツール群であるData Studioに追加されたものです。AIを活用して、自然言語プロンプトによって表の情報を補強・修正することができます。

# 下準備
* [こちらの記事](https://qiita.com/bambooseven/items/956a80f767ec11a52a0f#%E4%B8%8B%E6%BA%96%E5%82%991--ai%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A)の下準備1,2をもとに、Data Studio内でAIを活用するためにAI Profileの作成、登録をします。


# Table AI Assistを使ってみる
* Database Actions>Data Studioにアクセスをします。
* 画面右側のTable AI Assistをクリックすると、下記のように表示されます。
    ![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/a047dbf3-25e2-44b3-b091-d9e10f960f08.png)

* 「+New Recipe」をクリックします。レシピでは一連のステップを通して、実表を変更せずに列を追加、置換、削除および名前変更できます。必要な数のステップをれしぴｎ追加することができます。レシピをスキーマに保存するか、JSONとしてファイルにエクスポートできます。保存したレシピに戻り、作業を再度編集することもできます。
    ![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/11d3dbde-e888-41ba-85eb-c6564e477e0c.png)

* Target Typeでは4つの選択肢があります。ビューの作成、表の作成、表の追加、クエリからタイプを選択します。今回は「Create Table」を行ってみます。
    ![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/7b838461-d51c-4acb-b564-99363c6257b8.png)
* 「ステップの追加」をクリックします。
* すると、下記のような表示になります。
* 列アクションが3つあり、列の追加、削除、名前の変更から選択します。今回は自然言語プロンプトを試したいので、「Add or Replace」を選択します。
* 青字で自然言語プロンプトの例がいくつか提供されています。その中の1つをクリックして、自然言語プロンプトを入力します。
* すると、SQLが生成されます。そして、自然言語をもとに新しい列が作成されています。ラジオボタンで「New Column」を選択しているので、新規に列が作成されていますが、「Replace Column」を選択して置き換えることもできます。
* 元の列と、新しく作成された列が表示されています。
* 右下の「ステップの追加」を押します。
    ![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/c74a1456-4cb8-437d-b077-ffc1671a97df.png)

* すると、下記のように一番右にYEAR列が新規に作成できていることが確認できます。
    ![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3058002/8426db99-aa41-4fc8-8f1b-6e8c5bd009be.png)
* 作成したレシピを画面左上のフロッピーディスクマークのボタンから保存することができます。また、矢印マークのボタンを押すと、レシピの内容をjson形式で出力することができます。
Linuxでドキュメントスキャナーを使う方法 (scanservjs)

# Linuxでドキュメントスキャナ

そもそも企業は基本的に**Mac**または**Windows**のOS向けのドライバーしかサポートしません。Linuxは大衆向けではないことは明らかですからLinuxユーザは割り切って前者OSをインストールするか、Wineで実行するなどする必要があります。

しかし、Linuxユーザはそのために高いライセンスを支払ってOSをインストールすることを嫌う人も居るでしょう。社会に敗北するといった感覚に陥ります。(?)かくいう私もその一人です。

## SANE 

Scanner Access Now Easyの略です。Linuxでドキュメントスキャナを手軽で実行できるように、そしてどのスキャナでも同じようにスキャンできるように目指して開発されたものです。

https://qiita.com/H-goto16/items/283dd4fb77f945d6eb48

以前、SANEをバックエンドで実行した記事を投稿してあります。硬派な方や仕組みを知りたい方は手始めにコマンドラインから実行してみても良いでしょう。

しかしやや煩雑かつ実用的かと言われると決してそうではありません。

## scanservejs

世の中にはSANEフロントエンドはたくさんありますが、手軽にリッチに利用できそうなものがありました。今回は実際にドキュメントとをscanしてみたいと思います。

### Installation

+ Debian

```bash:bash
curl -s https://raw.githubusercontent.com/sbs20/scanservjs/master/bootstrap.sh | sudo bash -s -- -v latest
```

を実行すればOKです。もちろんyayをお使いの方やインストールしたくない方はDockerも用意されていますので公式サイトを確認してください。

https://sbs20.github.io/scanservjs/docs/01-install.html

```bash:bash
scanservjs installed and running:  http://127.0.0.1:8080
```

のログがでたらOKです！

ブラウザのアドレスバーに http://localhost:8080 または表示されたアドレスにアクセスします。

### UI

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/538fbdd3-20ec-466b-8220-150ee72f4cba.png)

アクセス直後はこのような画面でした。接続はとくに何もしていなくても自動でマシンを検出します。

+ モード選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/955575d0-9d00-46b9-9337-fc070e819858.png)

+ Resolution

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/a9127dce-07fc-4dae-aede-c059019a2d33.png)

+ Color mode

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/5bc0c14f-babe-4071-9d8a-600278cf0940.png)

+ 出力形式

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/eff11695-aeba-450d-91a7-6a5b90d7247d.png)

OCRもここで選べば当たるのでかなり便利いいですね！

### スキャン

PREVIEWを押せばプレビュー画面でスキャンした用紙を簡単に確認できるのはありがたいです。正直scansnap homeなどはそういった機能はないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/a252fa16-e476-4d32-8ab7-8c91f2ceba51.png)

SCANを押すとその設定でスキャンがスタートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/3596d8f3-ef74-4be4-a0d6-fc57d9658e80.png)

スキャン後の画像はこんな感じでした。Qiitaが10MBまでなので画質は下げてます。

![scan_2025-03-14 12.35.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/16fd57dc-818f-42ec-abe9-992c42a85ded.png)

## 不満点

+ 日本語OCR未対応...?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/31c10008-bc96-43eb-891d-f9afb5a11089.png)

+ サイズを超えた指定ができない。

なぜか278mmまでしかスキャンできず、A4は290mmのはずですが...???
UIで指定してもなぜかValueは更新されます。
かなり謎です。

+ 斜めスキャン自動補正はない

+ 便利な裏写り防止や自動2値化などがないまたはかなり設定がシビア

といったところでしょうか？

## 感想

使えなくはないし、レスポンシブ対応なので、起動させてて同一ネットワークならスマホからスキャンもできる点は優れていると考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/58659c95-0054-460b-aa26-1a28cd691428.png)

APIも用意されているのでカスタマイズ性は高いですが...自動補正機能が崩れてしまって使えなかったです。

あと両面スキャンモードが失敗するので安定性と言う面ではまだまだなのかなと感じました。

ちょっとスキャンはLinuxで、大量のファイルはWindowsといった使い方が便利かもしれません。

余談ですが、フロントはどうやらVue.jsで作られているようです。

以上です。簡単なのでぜひ利用してみてください。
定数を#defineで宣言する

質問：「定数を#defineで宣言する場合がありますが，なぜわざわざ#defineを使うのですか？」
以下はChatGPTの回答．

---

`#define`を使って定数を宣言する理由には、いくつかの利点があります。具体的には、以下の点が挙げられます。

### 1. **コンパイル時に定数を直接置換する**
`#define`はプリプロセッサディレクティブであり、コンパイル前にコード内で指定された定数に対して文字列置換を行います。例えば、次のように書かれたコードは：

```c
#define PI 3.14159
```

コンパイラがコードをコンパイルする際、`PI`という名前を見つけると、それを`3.14159`に置き換えます。このため、`PI`は実行時の変数としてではなく、**コンパイル時に値として直接置換**されます。

### 2. **パフォーマンスの向上**
`#define`で定義された定数は実行時に変数としてメモリを消費しません。コンパイラは定数をコード内で使用するたびにその値を直接挿入するため、変数のようにメモリに格納されたり、ポインタで参照されたりしません。このため、特に数値定数を多く使う場合には、`#define`を使うことで **余分なメモリやアクセスコストを削減**できます。

例：

```c
#define MAX_SIZE 1000
int arr[MAX_SIZE];  // 配列のサイズを1000に指定
```

`MAX_SIZE`は実行時にメモリを消費せず、コンパイル時に直接`1000`に置き換わります。

### 3. **可読性の向上**
`#define`を使うことで、コード内での定数値に意味のある名前を付けることができます。これにより、コードの可読性が向上します。例えば、`3.14159`という値を直接使う代わりに、`PI`といった名前を使うことで、コードが直感的に理解しやすくなります。

```c
#define PI 3.14159
double circle_area = PI * radius * radius;
```

上記のコードでは、`PI`という名前が円周率であることが明確に示されており、コードがより理解しやすくなります。

### 4. **条件付きコンパイルを行いやすい**
`#define`を使うと、条件付きコンパイルを容易に行うことができます。たとえば、あるコードがデバッグモードで動作する場合や、プラットフォームによって異なる動作をする場合に、`#define`でフラグを定義し、それに基づいてコードの一部を有効/無効にすることができます。

```c
#define DEBUG

#ifdef DEBUG
  printf("Debug mode is enabled\n");
#endif
```

このようにして、コード内の条件付きコンパイルを簡単に管理できます。

### 5. **簡単な型安全が不要な場合**
`#define`はあくまでテキスト置換であるため、型安全のチェックは行いません。しかし、型安全が特に必要ない場合や、シンプルな定数の定義においては非常に便利です。例えば、数値の定義やマクロの定義などです。

### 6. **名前空間汚染を防ぐための工夫**
`#define`で定義された名前はグローバルスコープで有効なので、名前の衝突を防ぐために適切な名前付けが重要です。例えば、`PI`という名前を使うと他のライブラリと衝突する可能性があるため、プレフィックスを付けることが一般的です。

```c
#define MYLIBRARY_PI 3.14159
```

### まとめ

`#define`はコンパイラのプリプロセッサによって、定数やマクロをコード内で直接置き換える機能を提供します。これにより、パフォーマンス向上や可読性の改善、コードの再利用が可能となり、特にシンプルな定数や数値の管理には非常に有用です。ただし、型安全性を必要とする場合や、複雑な定数には `const` や `enum` を使用することもあります。それぞれの方法には適した用途があるため、状況に応じて使い分けることが重要です。
Linuxコマンド入門：useradd passwd userdel の使い方をシンプルなコマンドでハンズオンしてみた

## はじめに

Linuxのユーザー管理は、システム管理者にとって重要なスキルの一つです。

:::note warn
**ユーザーの追加、パスワードの設定・変更、不要になったユーザーの削除といった基本操作を適切に行うことで、システムのセキュリティや管理の効率を向上させることができます。**
:::

本記事では、Linuxでユーザーを管理するための基本コマンドである `useradd`、`passwd`、`userdel` の使い方について解説します。

## 書こうと思ったきっかけ

Linux環境でのシステム管理を行う際に、ユーザー管理の基本コマンドを覚えておくことは非常に重要です。

:::note info
***特に、新しくLinuxを学び始めた人にとって、適切なユーザー管理ができるかどうかは、セキュリティや運用の観点から大きな影響を与えます。***
:::

今回の記事では、Linuxのユーザー管理に関する基本的なコマンドをわかりやすく整理し、実務でも活用できるようにすることを目的としています。

## Linuxのユーザー管理コマンド

Linuxでは、ユーザーの追加・管理・削除を行うためにいくつかの基本的なコマンドが用意されています。この記事では、以下の3つのコマンドについて詳しく解説します。

- `useradd`：新しいユーザーを作成する
- `passwd`：ユーザーのパスワードを設定・変更する
- `userdel`：ユーザーを削除する

### 1. `useradd` コマンド（ユーザーの追加）

`useradd` コマンドは、新しいユーザーアカウントを作成するためのコマンドです。

#### 基本的な使用方法
```sh
sudo useradd ユーザー名
```

このコマンドを実行すると、指定したユーザー名のアカウントが作成されます。しかし、デフォルトではホームディレクトリが作成されないため、通常は `-m` オプションを付けて実行します。

#### ホームディレクトリを作成してユーザーを追加
```sh
sudo useradd -m ユーザー名
```

#### 指定したシェルを設定してユーザーを追加
```sh
sudo useradd -m -s /bin/bash ユーザー名
```

#### UID（ユーザーID）を指定して追加
```sh
sudo useradd -m -u 1002 ユーザー名
```

#### グループを指定して追加
```sh
sudo useradd -m -g グループ名 ユーザー名
```

### 2. `passwd` コマンド（パスワードの設定・変更）

ユーザーのパスワードを設定・変更するには `passwd` コマンドを使用します。

#### 基本的な使用方法
```sh
sudo passwd ユーザー名
```

このコマンドを実行すると、新しいパスワードの入力を求められます。

#### 自分のパスワードを変更
```sh
passwd
```

#### ユーザーのパスワードを無効化
```sh
sudo passwd -l ユーザー名
```

#### ユーザーのパスワードを有効化
```sh
sudo passwd -u ユーザー名
```

### 3. `userdel` コマンド（ユーザーの削除）

不要になったユーザーアカウントを削除するには `userdel` コマンドを使用します。

#### 基本的な使用方法
```sh
sudo userdel ユーザー名
```

このコマンドを実行すると、指定したユーザーが削除されます。ただし、ホームディレクトリはそのまま残ります。

#### ホームディレクトリも削除
```sh
sudo userdel -r ユーザー名
```

### まとめ

| コマンド | 目的 | 使用例 |
|----------|------|---------|
| `useradd` | ユーザーの追加 | `sudo useradd -m ユーザー名` |
| `passwd` | パスワードの設定・変更 | `sudo passwd ユーザー名` |
| `userdel` | ユーザーの削除 | `sudo userdel -r ユーザー名` |

これらのコマンドを適切に使用することで、Linuxシステムのユーザー管理をスムーズに行うことができます！
エンジニアに必要な技術を見直そう

私事ですが、先日ヨガ通学の第一課程を無事修了することができました！
また、４月から決済基盤を担当するチームへ新たに案件のジョインが決まりました。

本日はエンジニアとして必要な技術について語らせていただきます。

# エンジニアに必要な技術とは
エンジニアと聞くと、プログラミングやアルゴリズムの知識、最新の技術トレンドを追いかけることが必要だと考えがちです。しかし、エンジニアに求められるスキルはそれだけではありません。技術力だけでなく、柔軟な思考や心の安定が、より良い仕事へとつながります。本記事では、エンジニアにとって大切な「技術」と「マインドセット」について考えてみましょう。

## 1. 問題解決力と論理的思考

エンジニアの本質的な仕事は、コードを書くことではなく「問題を解決すること」です。どのような問題や課題を抱えていて、どのようなアプローチをするかを適切に考える力が必要です。エラーの解析やシステムの最適化を行うには、物事を論理的に捉え、仮説を立てて検証する能力が求められます。そのためには、日頃から論理的に考えるクセをつけることが大切です。

## 2. コミュニケーション能力

技術職であっても、チームワークは欠かせません。自分の考えを的確に伝えたり、他人の意見を受け入れたりすることで、より良いプロダクトが生まれます。

## 3. ヨガ哲学から学ぶ「安定した心と健康」

意外に思われるかもしれませんが、エンジニアの仕事には「心の安定」が大きく影響します。集中力が続かない、ミスを繰り返す、モチベーションが上がらない——このような問題の多くは、心の状態や健康状態に密接に関係しています。

ヨガ哲学では、「サントーシャ（満足）」という概念があります。これは「今ある環境や状況を受け入れ、満足する心」を意味します。エンジニアとして仕事をしていると、新しい技術を学ぶプレッシャーや、納期のストレスに晒されることが少なくありません。しかし、常に焦るのではなく、今の自分の成長を認め、小さな成功に目を向けることが大切です。

また、「アヒンサー（非暴力）」という考え方も役立ちます。これは他人に対するだけでなく、自分自身にも適用できます。無理なスケジュールで自分を追い込みすぎることは、心身の健康を害します。自分を大切にし、適切に休息を取ることも、長期的な成長につながります。

## 4. 学び続ける姿勢

エンジニアリングの世界は日々進化しています。そのため、新しい技術に対する好奇心と学び続ける姿勢が欠かせません。ただし、すべてを追いかけるのではなく、自分の専門分野にフォーカスしながら、必要な知識を深めていくことが大切です。
また、「IT技術」以外の視野を持つことで、プロダクトをより魅力的にし、経験に生かすこともできると考えています。

## まとめ
エンジニアとして成功するためには、技術力だけでなく、論理的思考、コミュニケーション能力、心の安定、そして学び続ける姿勢が必要です。特に、ヨガ哲学に基づく「サントーシャ」や「アヒンサー」の考え方を取り入れることで、精神的な負担を軽減し、より充実したエンジニアライフを送ることができるでしょう。

技術を磨くだけでなく、心も整える。そんなバランスの取れたエンジニアを目指してみませんか？

今後、エンジニア向けのヨガワークショップも開催予定です。興味がある方は、ぜひ参加してください！
今後もエンジニア向けのヨガ情報や講座の企画を発信していきますので、ぜひチェックしてください！

noteのフォローや支援、X（https://x.com/darupu_tech) のフォローはヨガや個人開発に向けた活動の支援となりますので、よろしければ支援いただけると幸いです！
【勉強記録】長期休みで勉強から離れたときの対処法

# はじめに
こんにちは。アメリカ在住で独学でエンジニアを目指している taira です。
実は約1か月ほど日本に一時帰国しており、その間、勉強を一時中断していました。
理由としては、普段なかなか会えない友人や家族との時間を大切にしたかったからです。
1カ月も勉強をストップするのは珍しいかもしれませんが、GW や年末年始などの長期休暇で勉強を中断してしまうことは、誰しも経験があるのではないでしょうか。
中には「以前勉強した内容をすっかり忘れてしまった…」という方もいらっしゃると思います。
そこで今回は、長期休みのあとにスムーズに勉強を再開するための、私なりの方法を共有したいと思います。
これは仕事にも応用できる（実際、私が仕事をしていたときにもやっていた方法）ので、参考になれば幸いです。


## まずは自分の立てた計画を見直そう
独学をしているときは、何をどのように進めるかの計画をあらかじめ立てる方が多いと思います。
しかし、長期休みが明けた1日目は、すぐに勉強を再開するのではなく、「自分が立てた計画を振り返る」ことがとても大切だと考えています。
以前に立てた計画をそのまま使わず、一度見直す理由は大きく2つあります。

### 1. 自ら立てた計画を自分事にする
長期休み後ということは、その勉強計画を立てたのは少なくとも1～2週間前になるでしょう。
しかし、なぜその計画を立てたのか、すぐに説明できますか？ これが「自分で立てた計画を自分事にする」ということの本質です。
計画を振り返らずに「とりあえずある計画を進めておけばいい」と思考停止状態で作業していると、途中で計画の誤りや新しい情報をキャッチアップしづらくなる可能性があります。
理想としては、長期休みが終わる1日前くらいから計画を再確認して、「なぜその計画にしたのか」「時間配分はどうだったのか」などを思い出し、考え直すのがおすすめです。これにより、思考停止を防ぐことができます。
私の場合、時差ぼけもあるため、再開初日は「時差ぼけの解消＋計画の見直し」の日にあてました。
少し話が逸れるかもしれませんが、思考停止を避けるために、私は1～2週間に1回は必ず計画を見直すようにしています。

### 2.自分の思考が変わっている可能性がある
これは自覚しづらいことですが、長期休み中の経験や会った人との会話などを経て、自分の考え方が変化している場合があります。
例えば、スケジュールを前倒しにして一気に進めたいと思うようになったり、逆にじっくり取り組むために少しペースダウンしようと考えたり。
そうした変化を踏まえると、以前の計画を一度見直す必要が出てくるのです。

## リハビリ期間は必要。人間意外と忘れやすい生き物なのです
久々に勉強を再開すると、前回どこまでやったか思い出せないことが往々にしてあります。
このことを自覚していないと「勉強してもすぐに忘れてしまう…」と感じるかもしれませんが、人間は本来忘れやすい生き物。むしろ自然なことです。
私は勉強した内容をブログにまとめているので、忘れているときは自分のブログを見返して補強しています。
また、教材を進めるときは、できるだけ章の途中で終わらないように心がけるなど、再開をスムーズにする工夫をしています。
リハビリ期間としては、だいたい1週間くらい見ておくとよいかもしれません。急に頭が回らないような感覚があると思いますが、「そういうもの」と割り切って進めるのが大事です。
また、長期休みの前にこうしたことを知っておけば、休み明けのリハビリも含めた計画を立てることができるのでおすすめです。

## まとめ
今回は、長期休みのあとに勉強を再開する方法についてお話しました。これはプログラミング学習だけでなく、英語学習などにも応用できると思います。
「継続は力なり」という言葉があるように、小さな継続がいずれ大きな力になるときが必ず来るはずです。そのためには、誤った方法で続けないよう、定期的に計画を見直しながら進めることも大切だと考えています。
AIで画像を回転させて3Dモデルを作る

# 簡単にわりと高速に作れる。

**この画像から作ってみる**

![pexels-philboakye-1813947.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/49bb0883-8183-4f2f-ae5d-8b84ea64dea3.jpeg)

![Mar-14-2025 12-05-30.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/8b9c589c-1ff8-4089-85d4-25f957338c5e.gif)

# 使い方

インストール

```shell
git clone https://github.com/Tencent/Hunyuan3D-2.git
cd Hunyuan3D-2
pip install -r requirements.txt
# for texture
cd hy3dgen/texgen/custom_rasterizer
python3 setup.py install
cd ../../..
cd hy3dgen/texgen/differentiable_renderer
python3 setup.py install
```

実行

```python
from hy3dgen.texgen import Hunyuan3DPaintPipeline
from hy3dgen.shapegen import Hunyuan3DDiTFlowMatchingPipeline

# let's generate a mesh first
pipeline = Hunyuan3DDiTFlowMatchingPipeline.from_pretrained('tencent/Hunyuan3D-2')
mesh = pipeline(image='image.jpg')[0]

pipeline = Hunyuan3DPaintPipeline.from_pretrained('tencent/Hunyuan3D-2')
mesh = pipeline(mesh, image='image.jpg')
mesh.export('mesh.glb')
```


🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Miraiに感染する機器の観測状況

## はじめに
はじめまして、三菱電機の坂本です。

三菱電機　情報技術総合研究所では、製品開発時のセキュリティ対策にフィードバックする目的で、複数種類のハニーポットを設置・運用しています。

運用しているハニーポットの1つに、IoT機器を応答機能に設置した「IoT家電ハニーポット」があります。これは、IoT機器の普及に伴い増加した「IoT家電を使用している家庭」を模擬しています。

ハニーポットとは、攻撃される環境を模擬した囮システムであり、サイバーセキュリティの研究に使用されます。一般的に、攻撃を観測したいシステムを模擬するため、様々な種類のハニーポットが目的に合わせて設置されています。

IoT家電ハニーポットでは、IoT家電を標的としたサイバー攻撃を観測しており、さらに、IoT家電に搭載されたサーバ類を標的としたサイバー攻撃についても観測しています。

今回は、IoT家電ハニーポットで観測した、Miraiに感染した機器の攻撃件数や、攻撃パケット内に含まれるIPアドレスについて分析した結果をご紹介します。

## Miraiとは
MiraiはルーターやWebカメラなどのIoT機器を標的とするマルウェアです。

IoT機器がMiraiに感染すると、他のMiraiに感染したIoT機器とボットネットと呼ばれるグループを構築し、DDoS(Distributed Denial of Service attack)攻撃と呼ばれる攻撃対象の機器に一斉に大量の通信を行う攻撃を行います。

攻撃を受けた機器は大量の通信を処理しきれず、処理能力が低下し、最悪の場合、機器が停止してしまいます。

![Mirai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900963/98e31aba-2179-4618-805e-f19000e9df9d.png)

MiraiはIoT機器のデフォルトのユーザ名およびパスワードを利用して機器への侵入を試みます。

一度IoT機器が感染すると、MiraiはそのIoTデバイスを制御下に置き、他のデバイスへの侵入を試みます。
## Miraiに感染した機器による攻撃の特徴
Miraiに感染した機器の攻撃パケットには以下の特徴があります。

- TCPヘッダのシーケンス番号とIPヘッダの宛先IPアドレスの値が一致する
- 送信元ポート番号が1024より大きい


## 観測したMirai感染機器の攻撃

2024年11月16日～2025年2月15日の期間にて、弊社ハニーポットで運用している1つのIPアドレスに対し、上記の特徴を持つ攻撃を1,473,544件観測しました。

## 分析方法
以下の観測期間、分析対象、観点で分析を実施しました。

観測期間：2024年11月16日～2025年2月15日

分析対象：以下の条件を満たすパケット1,473,544件
- TCPヘッダのシーケンス番号とIPヘッダの宛先IPアドレスの値が一致する
- 送信元ポート番号が1024より大きい

分析観点

1. 日別のMiraiに感染した機器の攻撃パケット数
2. 攻撃元ホスト情報

## 分析結果

### 日別のMiraiに感染した機器の攻撃パケット数

Miraiに感染した機器による日別の攻撃件数は以下のとおりです。

![DayPacket1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900963/185f723e-e636-49f0-92d6-e3350a033b22.png)

![DayPacket2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900963/4d2eadc5-04e9-46a0-bdea-198c177bf1a8.png)

Miraiに感染した機器による攻撃は毎日観測されており、少ない日でも2,000~3,000件の攻撃が確認されました。
多い日では50,000件の攻撃あり、特に攻撃が多かった12/14には103,217件ものパケットを観測しました。

12/14に観測されたデータを分析してみると、受信されたパケットの内、41.0%がアメリカの、38.5%が日本の、それぞれ特定の1つのIPアドレスから送信されたパケットで、12/14に観測された攻撃のほとんどはこの2つのIPアドレスからの攻撃でした。

### 攻撃元ホスト情報

12/14に観測されたデータでは2つのIPアドレスからの攻撃が多かった一方、観測期間全体で見ると、特定のIPアドレスからの攻撃が突出していた訳では無く、様々なIPアドレスを観測しました。

攻撃元の国の割合は以下のとおりです。

![Country.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900963/7bdd295b-7af6-410e-a405-b877e926e281.png)

攻撃元の国としては、台湾、中国、アメリカの順に多い結果となりました。

日本からの攻撃も上位10番目に多いことを確認し、割合としては1.5%でした。





## Miraiに感染しないためには
Miraiに感染しないための対策としては、IoT機器にログインする際のパスワードを複雑かつ長いものに設定することが有効と言われています。

Miraiはデフォルトのユーザ名およびパスワードでIoT機器の侵入を試みる特徴があるので、IoT機器のパスワードをデフォルトから他の人に解読されにくいパスワードに設定することで、MiraiによるIoT機器の侵入のリスクを大幅に低減させることが可能です。

また、IoT機器の電源を入れたまま長期間放置していると、インターネット経由でIoT機器が乗っ取られるリスクが高まります。

更に、乗っ取られたことに気づくのが遅れるため、被害が拡大しやすい傾向にあります。

上記のリスクを低減させるために、IoT機器を使用しない期間は電源を落とすことが重要です。

## おわりに
ここまでお読みいただきありがとうございました。

今後も、ハニーポットを用いた観測・分析結果について、こちらで発信していく予定です。

ご質問やコメントもお待ちしております。
[C] structとenumを併用して共用体の型安全性を確保する

質問：「struct と enum の併用によって型安全性が保たれるのはなぜですか？」
以下はChatGPTの回答．

関連：[[C, C++] 共用体のメリット・デメリット](https://qiita.com/mgmnkwii/items/29a0ead60f7cb5f68563)

---

`struct` と `enum` の併用によって型安全性が保たれる理由は、主に次の2つのポイントに関連しています：

### 1. **`enum` によるデータ型の管理**

`enum` は、データの「型」を明示的に示すため、現在保持しているデータがどの型に対応するものかを明確にすることができます。これにより、プログラムの各部分がそのデータをどのように扱うべきかが分かりやすくなります。

たとえば、`enum` を使用することで、データが `int` か `float` か、あるいは文字列かを区別できます。これにより、後でデータを使う部分（例えば、表示する部分）が、どの型を扱っているかを明確に認識でき、誤った型にアクセスすることが防げます。

### 2. **`struct` によるデータ構造の明確化**

`struct` は複数の異なる型のメンバーをまとめるための構造体です。`struct` 内に `union` を使って異なる型を格納する場合もありますが、`enum` を併用することで、現在格納されているデータがどの型に対応するものかを管理できます。これにより、特定の `struct` のフィールドをアクセスする際に、適切な型が選ばれていることを保証することができます。

### 具体例

以下のコード例を見てみましょう。このコードは、`enum` と `struct` を併用して型安全を確保し、データの扱い方を明確にしています。

```c
#include <stdio.h>

typedef enum {
    TYPE_INT,
    TYPE_FLOAT,
    TYPE_STRING
} DataType;

typedef struct {
    DataType type;   // 現在のデータの型を指定するenum
    union {
        int i;
        float f;
        char *str;
    } data;
} Data;

void print_data(const Data *data) {
    switch (data->type) {
        case TYPE_INT:
            printf("Integer: %d\n", data->data.i);
            break;
        case TYPE_FLOAT:
            printf("Float: %.2f\n", data->data.f);
            break;
        case TYPE_STRING:
            printf("String: %s\n", data->data.str);
            break;
        default:
            printf("Unknown type\n");
    }
}

int main() {
    Data data1 = { TYPE_INT, .data.i = 10 };
    Data data2 = { TYPE_FLOAT, .data.f = 3.14f };
    Data data3 = { TYPE_STRING, .data.str = "Hello, World!" };

    print_data(&data1);
    print_data(&data2);
    print_data(&data3);

    return 0;
}
```

### このコードで型安全性が保たれている理由：

1. **`enum` がデータの型を管理**:
   - `Data` 構造体内の `type` メンバは `enum` 型（`DataType`）で、どの型のデータが格納されているかを示します。これにより、データが格納されているフィールドを適切に選択することができます。

2. **データの型に合わせて処理が決定される**:
   - `print_data` 関数内で、`switch` 文を使って `type` メンバの値に基づき、適切な型のデータを出力しています。このように、`enum` が型の情報を提供することで、データが不適切に処理されることを防ぎます。
   
   - 例えば、もし `type` が `TYPE_INT` のときに `data->data.f` にアクセスしようとした場合、それは誤った型のデータにアクセスしていることになるため、コンパイラやプログラムのロジックによって誤った動作を防げます。

3. **型の整合性**:
   - `enum` を使用することで、`type` に不正な値を入れることができないようにすることができます（`TYPE_INT`, `TYPE_FLOAT`, `TYPE_STRING` 以外の値は許されません）。
   - `type` が指定されていれば、それに対応する `data` フィールドのみにアクセスするように設計することで、型に関するバグを防げます。

### 結論

`enum` を使うことで、データの型を明示的に管理でき、`struct` のフィールドがどの型のデータを格納するべきかが明確になります。これにより、異なる型のデータが混在する状況でも、プログラム全体での型の整合性が保たれます。結果として、誤った型を使用したり、アクセスするフィールドを間違ったりすることが減り、型安全性が向上します。
Obsidianの小技その14｜右寄せでPDFの見た目を整える

![250314_right_opt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/32f6dd0e-0b4f-4a7e-9562-45c4059fd813.jpeg)

## はじめに

全世界のObsidianユーザーの皆さん、こんにちは！

ObsidianのノートをPDFに出力するとき、少しの工夫で見栄えが良くなります。今回は、PDF出力に右寄せ要素を追加する方法をご紹介します。日付や署名などを右寄せで配置するのに便利なテクニックです。

### これまでの小技

*   [小技その12｜がしがしPDFにエクスポート](https://qiita.com/hann-solo/items/1a2a8a4b1b795256767f)
*   [小技その13｜フォントサイズで調整するPDFレイアウト](https://qiita.com/hann-solo/items/7746c44f7fed2944045d)

## 右寄せのテクニック

Obsidianでは、HTMLタグを埋め込むことで、PDF出力時のレイアウトを調整できます。右寄せを実現するには、`<div>`タグに`style="text-align: right;"`属性を追加します。

### 実装方法

```html
<div style="text-align: right;">
  ここに右寄せしたいテキストを記述します。
</div>
```

このコードをObsidianのノートに記述すると、PDFエクスポート時に指定したテキストが右寄せで表示されます。

### 具体的な使用例

**例1：日付と作成者**

```html
<div style="text-align: right;">
  2025-03-14（金）<br>
  作成者氏名
</div>
```

**例2：文末の「以上」**

```html
<div style="text-align: right;">
  以上
</div>
```

これらのコードを文書の適切な場所に挿入することで、PDF出力時に見栄えの良いレイアウトを実現できます。

### 応用：複数の要素を組み合わせる

`<div>`タグの中に複数の要素を記述することも可能です。例えば、日付、作成者、部署名などを右寄せでまとめて表示することができます。

```html
<div style="text-align: right;">
  2025-03-14（金）<br>
  作成者氏名<br>
  所属部署名
</div>
```

## 補足

*   **改行**:  `<br>`タグを使用して改行を挿入します。
*   **CSS**: スタイルはインラインで記述しています。CSSスニペットでも実現できますが、手軽さ重視でインラインスタイルを愛用しています。

*   **スニペット**: Alfredスニペットを使い、 `;ijo` や `;br` でhtmlタグが展開されるようにしています。

## おわりに

この小技で、ObsidianノートをPDFに出力する際、かんたんに右寄せ要素を追加できます。日付や署名などを右に配置することで、文書の見栄えが向上し、よりプロフェッショナルな印象を与えることができます。ぜひお試しください！

:::note
このテクニックは、会議資料や報告書など、フォーマルな文書を作成する際に特に役立ちます。
:::

![out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/52d0f6de-9e5f-47d4-8efa-b6d2e2851c0b.png)

### 参考リンク

*   [Obsidian｜使いかたとコツ（目次）](https://qiita.com/hann-solo/items/ac8fa75394813e8adcf4)

### 環境

ここで書いていることは、下記のバージョンで実施しました。

*   Obsidian v1.8.9
*   macOS Sequoia 15.2
*   MacBook Pro (14-inch, 2021)
Azure/AWS/オンプレ Windows 11 リモートデスクトップが不安定になる事象の改善策(2025年2月頃以降)

Windows 11 を最新にしているとリモートデスクトップが最近不安定になる現象が世界的に起きているようだ。私の環境もリモートデスクトップ画面がフリーズしてキーボードやマウスで身動き取れなくなる。再接続すると解決するのだが頻発しすぎると仕事にならない。AWS, Azure, シンクラのような環境を導入している企業では死活問題。世界的に発生しているようで次の記事に見かけたグループポリシーを設定、配布し始めたところ状況の改善が見られました。時折事象がWindows Updateにより発生するようなので今後も兼ねて設定しておいたほうが良さそうです。

https://www.pcworld.com/article/2616124/windows-11-remote-desktop-issues-heres-what-you-can-do.html

「サーバーのネットワーク検出を選択する」を有効にし、
「接続時検出と継続的ネットワーク検出を無効にする」にしました。「継続的ネットワーク検出を無効にする」のみでも問題がなさそうな投稿でどちらでも改善がみられるそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/8eaf6506-51a3-462b-9c1a-3a2877a135db.png)
クライアントサイドで外部サイトのページをモーダルウィンドウで表示する

外部サイトのページに誘導する必要があったが、別ウィンドウや別タブで開くとユーザビリティが低下するため、モーダルウィンドウで対応したかった。
モーダルウィンドウをクライアントサイドで実装し、表示するURLや閉じた際の処理はサーバーサイドで実装する。

「開く」ボタンを押下時にモーダルウィンドウを表示する。
モーダルウィンドウの中にIframeでページを埋め込む。
```html:main.aspx
<div id="customModal">
    <div id="customModalContent">
        <span id="closeModal" onclick="closeModalPopup()">✖</span>
        <iframe id="modalIframe" src="" width="100%" height="100%" frameborder="0"></iframe>
    </div>
</div>

<style>
/* モーダルの背景（オーバーレイ） */
#customModal {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 10000;
}

/* モーダルウィンドウ本体 */
#customModalContent {
     position: absolute;
     top: 50%;
     left: 50%;
     transform: translate(-50%, -50%);
     background: white;
     padding: 20px;
     width: 90vw;
     max-width: 1200px;
     height: 80vh;
     max-height: 600px;
     border-radius: 10px;
     box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
     overflow: auto;
 }
    
 /* 閉じるボタン */
 #closeModal {
     position: absolute;
     top: 10px;
     right: 10px;
     cursor: pointer;
     font-size: 18px;
 }  
</style>

<script type="text/javascript">
function openModalPopup(url) {
    document.getElementById('modalIframe').src = url;
    document.getElementById('customModal').style.display = 'block';
}

function closeModalPopup() {
    document.getElementById('customModal').style.display = 'none';
    __doPostBack('PopupClosed', ''); // ASP.NET 側の処理を呼ぶ
}
</script>
```

```vb:main.aspx.vb
Private Sub lbtnOpen_Click(sender As Object, e As EventArgs) Handles lbtnOpen.Click
    'URLを作成する処理
    Dim url As String = String.Empty
    CreateURL(url)

    'モーダルウィンドウを開く処理
    OpenModal(url)
End Sub

Private Sub OpenModal(url As String)
    Dim script As String = "openModalPopup('" & url & "');"
    ScriptManager.RegisterStartupScript(Me, Me.GetType(), "OpenPopup", script, True)
End Sub

'モーダルウィンドウを閉じた際の処理
Public Sub RaisePostBackEvent(ByVal eventArgument As String) Implements IPostBackEventHandler.RaisePostBackEvent
    '画面を更新するなど必要に応じて
End Sub
```

![モーダルウィンドウイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721559/81633679-96ae-4d3d-b4a2-3569e8de3e4b.png)
UI/UX改善でアプリの成功率をアップ！よくある課題と解決策

【UI/UX改善でアプリの成功率をアップ！】よくある課題と解決策
はじめに
モバイルアプリの成功には、優れたUI/UXデザインが不可欠です。デザインが直感的で使いやすいほど、ユーザーの満足度が向上し、結果としてアクティブ率や売上の向上につながります。しかし、多くの企業が「見た目がいいデザイン＝良いUX」と誤解し、本質的な課題を見落としがちです。

本記事では、よくあるUI/UXの課題とその改善策を紹介します。がるのかを解説します。


よくあるUI/UXの課題と改善策
1. ナビゲーションが分かりにくい
💡課題
「どこに何があるのかわからない」「目的のページにたどり着くまでに迷う」といった問題は、ユーザー離脱の大きな要因になります。

✅改善策
直感的なメニュー設計を意識し、主要機能をすぐに見つけられるようにする
ハンバーガーメニューの乱用を避ける（重要なナビゲーションは常に表示）
ユーザーの行動データを分析し、最適な導線設計を行う



2. フォーム入力がストレスになる
💡課題
「入力項目が多すぎる」「エラーメッセージが分かりにくい」といった理由で、ユーザーが離脱するケースが多発しています。特に、会員登録や決済時のUXが悪いとCVR（コンバージョン率）に大きく影響します。

✅改善策
入力項目を最小限に（不要な項目を削減）
リアルタイムバリデーション（ユーザーが入力した瞬間にエラーチェック）
オートコンプリートや外部サービス連携（Googleアカウントなどでの簡単ログイン）


3. 読みにくいテキストと配色
💡課題
テキストが小さすぎたり、コントラストが低すぎると、ユーザーが情報を認識しにくくなります。特に、視認性が悪いとアプリの利用率が低下する傾向にあります。

✅改善策
フォントサイズは16px以上を推奨
色のコントラスト比を考慮（WCAGのアクセシビリティ基準を意識）
適切な行間・字間を確保し、読みやすさを向上


4. ロード時間が長い
💡課題
ページの読み込みが遅いと、ユーザーの40%以上が3秒以内に離脱すると言われています。（Google調査）

✅改善策
画像や動画の圧縮を行い、軽量化を実施
不要なアニメーションやスクリプトを削減
キャッシュやLazy Loadを活用し、読み込み速度を最適化


まとめ
UI/UXの改善は、単なるデザインの変更ではなく、ビジネス成果に直結する重要な施策です。使いやすいアプリは、顧客満足度を向上させ、結果として収益アップにつながります。



【企業向けセミナーのご案内】
「顧客満足度向上のカギ！UI/UXによるアプリ改善成功のステップ」

上記のようなUI/UXの課題をより詳しく解説し、実際の成功事例や即実践できる改善ポイントを紹介する企業向けセミナーを開催します。

詳しくはこちら👉 セミナー詳細 : https://techplay.jp/event/974689
【2025年03月版】捗る、教わる側の心得メモ

# はじめに

教える側の心得はよくきいたりするけど、教わる側の心得が少なく思えたのでメモ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/9aa19ff0-3e12-4727-bbfd-fc66a95271f9.png)

ここでは、以下の心得を書いています。

- 教えるのが下手な人から、うまく教わる方法
- 教えるのが上手い人から、もっと効果的に教わる方法

## 教えるのが下手な人から、うまく教わる方法

### ① 前提の確認を自分からする
- **聞くべきこと**：「これは何についての話ですか？」「前提となる知識や背景はありますか？」
- **ポイント**：分からない単語や前提があいまいなまま進めると迷子になるので、まず確認。
- 例：「そもそも〇〇って、どういうことなんでしょうか？」

---

### ② 範囲を自分で明確にする
- **聞くべきこと**：「今日は何をゴールに話してくれるんですか？」
- **ポイント**：説明があちこち飛ぶ人は多いので、自分から「どこからどこまでの話？」と範囲を区切ってもらう。
- 例：「今日は基本のはなしでしょうか？」

---

### ③ 自分で話の構成を整理しながら聞く
- **やるべきこと**：メモをとる、構成をまとめる
- **ポイント**：相手が話の順番を飛ばしてしまっても、自分の中で構成を作る。
- 例：「今の話は、手順でいうと環境構築のことですよね？」と確認する。

---

### ④ 例え話を求める
- **聞くべきこと**：「たとえば、どんなケースですか？」
- **ポイント**：具体例や自分が知っているものに置き換えてイメージしやすくする。
- 例：「野球に例えるとどうなりますか？」とか、自分の知っているものに引き寄せると◎。

---

### ⑤ 情報量をコントロールする
- **伝えるべきこと**：「ちょっと情報量が多いので、1つずつにしてください！」
- **ポイント**：分からなくなったら遠慮せずストップをかける。
- 例：「整理するのでちょっといいですか？」

---

### ⑥ 話すスピードを自分で調整する
- **伝えるべきこと**：「もう一度、ゆっくり説明してもらえますか？」
- **ポイント**：速すぎたら聞き直す、ペースを取り戻す。
- 例：「今のところ、こう理解してるんですが合ってますか？」と確認する。

---

### ⑦ 分からない言葉はすぐ質問する
- **聞くべきこと**：「その言葉の意味をもう少し説明してもらえますか？」
- **ポイント**：そのままスルーすると、後でついていけなくなる。
- 例：「〇〇って、つまりどういうことですか？」

---

### ⑧ 自分で「ケア」してペースを作る
- **やるべきこと**：疲れたら「少し整理させてください」と区切る。
- **ポイント**：相手はペース配分が苦手なので、自分で「休憩」「確認」のタイミングを作る。
- 例：「ここまでのまとめを言ってみますね。合ってるか確認してもらえますか？」

---

## 教えるのが上手い人から、もっと効果的に教わる方法

### ① 前提の確認に積極的に参加する
- **やるべきこと**：「自分はこういう知識があります！」を最初に伝える
- **ポイント**：前提確認をしてくれる人には、こちらも「知っていること」「知らないこと」をハッキリ伝えることで、話がもっとピンポイントに！
- 例：「○○は分かりますが、△△は初めて聞きます」

---

### ② 範囲を意識してゴールを共有する
- **やるべきこと**：「この部分を重点的に知りたい」と希望を伝える
- **ポイント**：相手は範囲を提示してくれるけど、こっちから「今はざっくりでいい」「細かいところを知りたい」などニーズを伝えると◎
- 例：「今日は概要だけ掴みたいです」「次回は実務の例をお願いします」

---

### ③ 構成を一緒に意識しながら学ぶ
- **やるべきこと**：「いまどのフェーズ？」を意識する
- **ポイント**：うまい人は段階を踏んでくれるので、「いま全体のどの部分か」を意識しながら聞くと理解が深まる
- 例：「これが全体の流れの中の、どこに当たる話か」を確認しながらメモする

---

### ④ 例え話をどんどん自分の世界に置き換える
- **やるべきこと**：相手が出した例を、自分に合うものに言い換えて理解を深める
- **ポイント**：「それって、自分の○○に似てるかも！」と置き換えると、定着しやすい
- 例：「この説明、仕事の○○にも応用できそうです！」

---

### ⑤ 情報量を自分で整理・復習する
- **やるべきこと**：その場で「理解したこと」をまとめて話す
- **ポイント**：情報が整理された状態で届くから、そのまま吸収するのではなく、自分の言葉に置き換えてアウトプットする
- 例：「今の話を整理すると、A→B→Cですね！」

---

### ⑥ 理解スピードは自分で調整・フィードバック
- **やるべきこと**：「ここは大丈夫」「ここは少し難しい」などを伝える
- **ポイント**：ペース調整は相手がしてくれるけど、自分の状態を伝えればもっと最適化される
- 例：「そこはすんなり分かりました」「そこはもう少し時間をかけたいです」

---

### ⑦ 言葉を自分の中で定義し直す
- **やるべきこと**：キーワードや専門用語を、自分なりの言葉で再定義する
- **ポイント**：分かりやすい語彙で話してくれるので、その言葉をどう自分の言語に変換するかがカギ
- 例：「この“○○”は、自分の中では“□□”と似てるイメージで覚えます」

---

### ⑧ 自分の状態を観察して「ケア」する
- **やるべきこと**：疲れたら休憩を提案する、質問タイムを自分で作る
- **ポイント**：相手が気遣ってくれるけど、自分も「今、何が分からないか」「どこがあいまいか」を見つめて、適宜立ち止まる
- 例：「いったんここまでで理解度を確認したいです」「質問してもいいですか？」

---

## おまけ：気楽に聞く心構え
- **下手な説明はあくまで材料**
  →「材料さえ手に入れば、あとは自分で調理できる！」くらいの気持ちでOK
- **フィードバックをあげる**
  →「さっきの説明、すごく分かりやすかったです！」と伝えると、相手もやりがいUP！  
- **「相手をトレーニングしてる」つもりで**
  →「どう伝えたらわかりやすいか」を一緒に考えるゲームだと思えば気楽です
- **学んだことをすぐ誰かに教える**
  → 学んだことは、そのまま別の人に「伝え方」として実践すると、理解が深まる！

# さいごに

かんたんでしたね
Laravel Eloquent ORMの効率的なデータ取得とスマートな書き方


## はじめに
LaravelのEloquent ORMは、シンプルで直感的に使える強力なツールですが、使い方次第ではパフォーマンスが最適化されない場合があります。例えば、不用意にJOINを使用してクエリが重くなる、繰り返し使うコードが冗長になってしまうといった問題です。今回は、これら欠点の解決策を紹介し、効率的かつパフォーマンスを向上させる方法を解説します。

## 1. **サブクエリを活用した効率的なデータ取得**

### 従来の書き方
大量のデータがある場合、JOIN によりパフォーマンスが悪化する場合がある。
```php
// JOINを使用したデータ取得
$users = User::with('orders')->get();
```

### 解決策
サブクエリを使用してパフォーマンス向上。
```php
$users = User::addSelect(['latest_order' => Order::select('id')
    ->whereColumn('user_id', 'users.id')
    ->latest()
    ->limit(1)
])->get();
```

## 2. **動的スコープでコードをすっきりさせる**

### 従来の書き方
似たようなクエリがあった時に記述が重複して冗長、保守性からもあまり望ましくない。
```php
$activeUsers = User::where('status', 'active')->get();
$inactiveUsers = User::where('status', 'inactive')->get();
```

### 解決策
Model内で動的スコープを活用し呼び出すことで、再利用性を高める。
```php
class User extends Model {
    public function scopeActive($query) {
        return $query->where('status', 'active');
    }
    public function scopeInactive($query) {
        return $query->where('status', 'inactive');
    }
}

// 使用例
$activeUsers = User::active()->get();
$inactiveUsers = User::inactive()->get();
```

## 3. **`firstOrCreate` / `updateOrCreate` を活用**

### 従来の書き方
対象のuserが存在するかどうかで分岐するので少し冗長。
```php
$user = User::where('email', 'example@example.com')->first();
if ($user) {
    $user->update(['name' => 'John Doe']);
} else {
    User::create(['email' => 'example@example.com', 'name' => 'John Doe']);
}
```

### 解決策
`firstOrCreate` , `updateOrCreate` を使用。
```php
// firstOrCreate を使用
$user = User::firstOrCreate(
    ['email' => 'example@example.com'],
    ['name' => 'John Doe', 'status' => 'active']
);

// updateOrCreate を使用
$order = Order::updateOrCreate(
    ['user_id' => 1, 'product_id' => 10],
    ['quantity' => 5, 'status' => 'pending']
);
```

## 4. **少しマイナーなメソッドを活用する**

### `whereExists()` を使ったサブクエリの最適化

### 従来の書き方
`whereHas` を利用すると内部で別のクエリが実行されるため、場合によってはパフォーマンスに影響がでる可能性がある。
```php
$users = User::whereHas('orders', function ($query) {
    $query->where('status', 'completed');
})->get();
```

### 解決策
サブクエリ `whereExists` を活用して冗長な処理を簡潔に。
```php
$users = User::whereExists(function ($query) {
    $query->select(DB::raw(1))
          ->from('orders')
          ->whereColumn('orders.user_id', 'users.id')
          ->where('orders.status', 'completed');
})->get();
```

## 5. **クエリビルダーとEloquentの融合**

### 従来の書き方
DBファサード（`DB::table`）を使用する場合、Eloquentモデルが持つメリット（リレーションの扱いや保守性）が失われることがある。また、パラメータバインディングが正しく行われていないとSQLインジェクションなどのリスクが生じる可能性がある。
```php
$users = DB::table('users')
    ->whereRaw("DATE(created_at) = ?", [now()->toDateString()])
    ->get();
```

### 新しい方法
Eloquentを利用することで、パラメータバインディングが自動的に適用されるため、モデルレベルのセキュリティ対策やその他の便利な機能が得られる。
```php
$users = User::whereRaw("DATE(created_at) = ?", [now()->toDateString()])->get();
```

## まとめ

-   **サブクエリを活用**して不要なJOINを削減
-   **動的スコープを利用**してコードの再利用性を向上
-   **`firstOrCreate()` や `updateOrCreate()` を活用**して冗長な処理を簡潔に
-   **`whereExists()` を利用**してサブクエリを最適化


## **採用拡大中！**

アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニア仲間を募集しています！
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう！

お問い合わせはこちらから↓  
[https://official.assisteng.co.jp/contact/](https://official.assisteng.co.jp/contact/)
spreadsheet APIで値を入力する方法 - Android Kotlin

```kotlin
  val sheets = Sheets.Builder(
      NetHttpTransport(),
      GsonFactory.getDefaultInstance(),
      HttpRequestForGoogle(accessToken)
  )
      .setApplicationName("任意のアプリケーション名")
      .build()
      
  val values = ValueRange().setValues(listOf(listOf("test")))
  
  
  sheets.spreadsheets().values().update(
      spreadsheetId,
      "更新したいシートの範囲", // 例: "シート1!A1:A1"
      values,
  )
      .setValueInputOption("USER_ENTERED")
      .execute()
```
引っ掛かりポイントとしては「setValueInputOption」の設定が必須である部分です。設定を忘れると下記エラーが出力されます。
```
400 Bad Request
PUT https://sheets.googleapis.com/v4/spreadsheets/指定したid/values/指定した範囲
{
  "code": 400,
  "errors": [
    {
      "domain": "global",
      "message": "'valueInputOption' is required but not specified",
      "reason": "badRequest"
    }
  ],
  "message": "'valueInputOption' is required but not specified",
  "status": "INVALID_ARGUMENT"
}
```
ValueInputOptionに設定できる値は[公式](https://developers.google.com/sheets/api/reference/rest/v4/ValueInputOption)にもありますが、下記に和訳を置いておきます。
<table>
  <thead>
    <tr>
      <th>Enums</th> 
      <th>Enumsの訳</th>
      <th>詳細</th>
    </tr>
  </thead>
  <tr>
    <td>USER_ENTERED</td>
    <td>ユーザー入力</td>
    <td>
        UI操作でスプレッドシートに値を入力した場合と同じように、入力した値によってデータの型を変更します。例えば、文字列「123」は数字として入力されます。
    </td>
  </tr>
  <tr>
    <td>RAW</td>
    <td>修正なし</td>
    <td>
        USER_ENTEREDのようにデータの型を変更せずに、そのままで値を入力します。
    </td>
  </tr>
</table>

:::note warn
注意
・公式には「INPUT_VALUE_OPTION_UNSPECIFIED」がありますが、説明欄には「使用しないでください」の表記があるため表には載せていません。
・読みやすさのため、表のアイテムの順番を入れ替えています。
:::
GASはJSと書き方同じらしい？全くわからんから調べてみました！

# GASとJSの違い

参考サイト:https://trends.codecamp.jp/blogs/media/difference-word234

基本構文や関数を使用出来るが、それぞれGoogleサービス上で動くか、ウェブサイト上で動くかに違いがあるので、それぞれの特有の機能などは使用できないと言うのは言わずもがなでしたね。

違いを見つけるというよりは書き方が似てるだけ、という認識の方が正しそうです。


# スプレッドシートにボタンを配置して関数を実行させる


基本操作として、図形(ボタン)を描いて、その図形に関数を割り当てる方法、沢山参考出てきました。

参考サイト:https://www.acrovision.jp/service/gas/?p=269

,https://zenn.dev/rabee/articles/google-apps-script-spreadsheet-button


非常に直感的に実装出来て良い感じですね👌


# GASからCloud Runを呼び出す方法

呼び出しの際にまずプリンシパル(Google Cloud に対して認証された ID を表すもので、リソースへのアクセスを制御する仕組みで)の設定が必要みたいです。


参考サイト:https://dev.classmethod.jp/articles/202501-three-way-to-access-to-gcp-from-gas/

___
時間が来たので今日はここまで！
【Xcode】【CocoaPods】キャッシュクリア

```
rm -rf ~/Library/Caches/CocoaPods
```
```
pod cache clean --all
```
```
rm -rf ~/Library/Developer/Xcode/DerivedData
```

Preview画面キャッシュ一括削除コマンド
```
xcrun simctl --set previews delete all
```
PDF切り抜き

自分用

### ツールインストール

```shell
sudo yum install -y texlive-pdfcrop qpdf poppler-utils
```

### ページ切り抜き

```shell
qpdf --empty --pages [もとのPDFのパス] [ページ番号] -- [出力PDFのパス]
```

### ページサイズの確認

```shell
pdfinfo [出力PDFのパス] | grep -i size
```

出力例)
```shell
$ pdfinfo esp32c3_schematic.pdf  | grep -i size
Page size:       842 x 1191 pts (A3)
File size:       456706 bytes
```

### サイズ切り抜き

```shell
pdfcrop --bbox "[left] [bottom] [right] [top]" [もとPDFのパス] [出力PDFのパス]
```
左下が(0,0)なので注意


A3の下半分を切り抜いてA4にする例
```shell
pdfcrop --bbox "0 0 842 595" original.pdf lower.pdf
```
DAX の基礎から実践まで: CALCULATE, SUM, COUNT, DIVIDE の完全ガイド



## はじめに

Microsoft Power BI や Excel の Power Pivot では、DAX (Data Analysis Expressions) を活用することで、データの集計・分析をより高度かつ柔軟に実現できます。
DAX はシンプルな集計関数から、複雑なフィルタ条件を設定しての計算まで、幅広い用途に対応しており、ビジネスインテリジェンスの現場では欠かせない技術です。
本記事では、データ分析で頻繁に利用される **SUM**、**COUNT**、**DIVIDE** 関数と、条件付き計算を実現する **CALCULATE** 関数について、基本的な使い方や実践的な活用シーン、注意点などを詳しく解説します。

---

## DAX の基本概念と役割

DAX は、Power BI や Power Pivot の計算列・メジャー作成の根幹をなす関数群です。
主な役割は以下の通りです。

- **集計の実行**: 数値の合計、平均、最大値など、基本統計の計算に利用
- **フィルタリング**: 特定の条件に沿ったデータ抽出や絞り込みが可能
- **条件付き計算**: 複雑な条件の組み合わせでカスタム計算を実現

この柔軟性により、DAX は多種多様な分析シナリオで活躍します。

---

## SUM 関数の基本と応用

### 基本的な使い方

SUM 関数は、指定した列内の数値をすべて合計するシンプルな関数です。
例えば、売上データの合計を計算する場合は、以下のように記述します。

```dax
Total Sales = SUM(Sales[Amount])
```

この例では、`Sales` テーブルの `Amount` 列にある全ての数値を合計し、総売上を算出しています。

### 応用例

- **フィルタ付き合計**: CALCULATE 関数と組み合わせることで、特定の条件下の合計を算出することが可能です。
- **データ検証**: シンプルな関数であるため、計算結果の整合性チェックにも有用です。

---

## COUNT 関数と COUNTROWS 関数の使い分け

### COUNT 関数

COUNT 関数は、指定した列に存在する値（NULL以外）の個数をカウントします。
例えば、注文数をカウントする場合は次のようになります。

```dax
Order Count = COUNT(Orders[OrderID])
```

この例では、`Orders` テーブルの `OrderID` 列に値が入っている行数をカウントしています。

### COUNTROWS 関数

一方、テーブル全体の行数をカウントする場合は COUNTROWS 関数を使用します。

```dax
Total Rows = COUNTROWS(Orders)
```

**ポイント**: 「特定の列の値が存在する行数」と「全行数」を区別して、適切な関数を使い分けることが重要です。

---

## DIVIDE 関数で安全な割り算を実現

### 基本構文とメリット

DIVIDE 関数は、分母がゼロになるリスクを考慮した安全な割り算を実行するための関数です。
その基本構文は以下の通りです。

```dax
DIVIDE(
    分子,
    分母,
    代替値（オプション）
)
```

通常の割り算 `n1 / n2` では、`n2` がゼロの場合エラーが発生しますが、DIVIDE 関数を使うことで、分母がゼロの場合にあらかじめ指定した代替値を返すことができます。

### 利用例: 利益率の計算

例えば、利益率を算出する場合は次のように記述できます。

```dax
Profit Margin = 
VAR TotalProfit = SUM(Sales[Profit])
VAR TotalAmount = SUM(Sales[Amount])
RETURN DIVIDE(TotalProfit, TotalAmount, 0)
```

この例では、`Sales[Profit]` の合計を `Sales[Amount]` の合計で割り、もし `TotalAmount` がゼロの場合は `0` を返します。

**注意**: ゼロ除算によるエラーを防ぐため、割り算を行う際は常に DIVIDE 関数の利用を検討してください。

---

## CALCULATE 関数の使い方

### 基本的な使い方

たとえば、特定の地域と年度に絞った売上を算出する場合、以下のように記述します。

```dax
Sales in Region A and 2021 = CALCULATE(
    SUM(Sales[Amount]),
    Sales[Region] = "A",
    YEAR(Sales[Date]) = 2021
)
```

この例では、`Sales[Region]` が "A" で、かつ `Sales[Date]` の年が 2021 のデータのみが対象となります。

### 複数条件の指定方法

#### AND 条件の場合

CALCULATE に複数のフィルタ条件を渡すと、各条件は **AND 条件** として評価されます。
上記の例はその典型です。

#### OR 条件の実装

意図的に OR 条件を適用したい場合は、論理演算子を使って明示的に条件を組み合わせる必要があります。
以下の例では、`A[xxx]` が 1 **または** `A[yyy]` が 3 **または** `A[zzz]` が 6 のいずれかの条件を満たす場合に、データを抽出します。

```dax
Filtered Sales = CALCULATE(
    SUM(A[Amount]),
    (A[xxx] = 1) || (A[yyy] = 3) || (A[zzz] = 6)
)
```

**ポイント**:

- カンマ区切りで条件を並べると自動的に AND 条件になるため、OR 条件を実現する場合は必ず括弧と論理演算子を用いてください。
- 複雑なフィルタ条件を扱う際は、条件の優先順位や括弧の使い方に十分注意しましょう。

---

## まとめ

DAX を活用することで、Power BI や Excel でのデータ分析がより柔軟かつ高度に行えるようになります。
特に、**SUM**、**COUNT**、**DIVIDE** といった基本関数と、フィルタ条件を自在に操作できる **CALCULATE** 関数の理解は、精度の高いレポートやダッシュボード作成の鍵となります。

---

## おわりに

DAX の習熟は継続的な学習と実践が必要ですが、今回の内容が皆様の分析業務における一助となれば幸いです。

Happy coding!
この住所、読めますか？ 難読地名チャレンジ！ 北海道・東北編

# 🗾 はじめに❄️
北海道・東北地方は、広大な自然と独自の文化が息づくエリア！  
そのため、地名にも **アイヌ語由来のものや古い日本語・方言が反映** されていて、初見では読めないものがたくさんあります。  

例えば…  
📍 **北海道**：「占冠（しむかっぷ）」「倶知安（くっちゃん）」  
📍 **東北**：「猪苗代（いなわしろ）」  

「知ってる！」と思ったあなたは **地名マスター** かも？✨  
由来を知ると、さらに面白くなること間違いなし！  

### 🏆 難読地名チャレンジ、スタート！  
今週は **北海道・東北地方の難読地名に挑戦！**  
あなたはいくつ読める？🎯 ぜひ挑戦してみてください！

## 🔍 住所検索で使ったAPIはこちら！ 🚀  

今回の **YomiMap** で使用したAPIはコチラ👇  
[🌍 ZENRIN Maps APIは２か月お試し無料！🚀](https://www.zenrin-datacom.net/solution/zenrin-maps-api/trial?fm_cp=6757baf3203e3a00bb118509&fm_mu=67639f3faffc4405037dbd24&utm_campaign=6757baf3203e3a00bb118509&utm_medium=else&utm_source=Qiita46)  

## 🎯 アプリの概要
このアプリでは、以下の機能を提供します。

✅ 難読住所クイズ：複数の選択肢から正しい読み方を選ぶ
✅ 地図表示：正解すると、その住所の位置を地図上に表示
✅ ZENRIN Maps API 活用：住所検索と位置情報の取得をAPI経由で実現

## 🎯 さあ、あなたも難読地名に挑戦しよう！  
実際にクイズを楽しめます。
実際の動作は、以下のデモをご覧ください。
[YomiMap（読みマップ　北海道・東北編）](https://goldiek24.github.io/address_quiz/address_quiz_hokkaido_tohoku.html)
![zma_address_quiz_hokkaido_tohoku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965389/a3b01c4a-31b7-4859-8aab-26936a77cbc6.png)

## 🛠 開発の流れ
#### 1. クイズデータの作成
まず、難読住所クイズのデータを用意しました。JavaScriptのオブジェクト配列として、住所名とその選択肢を定義しています。

```javascript
const quizData = [
    { question: "「長万部」の読み方は？", options: ["おしゃまんべ", "ながまんぶ", "ちょうまんぶ"], correctAnswer: "おしゃまんべ" },
    { question: "「小鳥谷」の読み方は？", options: ["ことりや", "しょうちょうこく", "こずや"], correctAnswer: "こずや" },
    ...
];
```

#### 2. クイズ画面の作成
ユーザーが選択肢をクリックできるよう、HTMLとCSSでクイズのレイアウトを作成しました。
```html
<div id="quiz-container">
    <h2>問題 1</h2>
    <p>「長万部」の読み方は？</p>
    <div class="button-group">
        <button onclick="checkAnswer('おしゃまんべ')">おしゃまんべ</button>
        <button onclick="checkAnswer('ながまんぶ')">ながまんぶ</button>
        <button onclick="checkAnswer('ちょうまんぶ')">ちょうまんぶ</button>
    </div>
</div>
```

#### 3. ZENRIN Maps API を使った地図表示
クイズに正解したら、その住所の位置を地図上に表示します。
ZENRIN Maps API を利用して、住所を検索し、緯度経度情報を取得して地図を更新します。
```javascript
async function searchAddress(address) {
    const response = await fetch('https://test-web.zmaps-api.com/search/address', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'x-api-key': 'YOUR_API_KEY',
            'Authorization': 'referer'
        },
        body: new URLSearchParams({ word: address, word_match_type: '3', address_level: 'SHK,OAZ', sort: 'address_read' })
    });

    const data = await response.json();
    if (data.status === "OK" && data.result.info.hit > 0) {
        const location = data.result.item[0].position;
        const latLng = new ZDC.LatLng(location[1], location[0]);
        map.setCenter(latLng);
    } else {
        alert("住所の位置情報が見つかりませんでした");
    }
}
```
## 🚀 今後の展望  
**問題の追加：** 北海道・東北ならではの難読地名をさらに充実！  
**エリア別モード：** 道央・道東・南東北など地域ごとに挑戦できる機能を追加  
**ご当地ヒント機能：** その地名にまつわる歴史や名産をヒントとして表示  

ZENRIN Maps API を活用すれば、正確な地図データとともに、より楽しく学べるコンテンツが作れます！  
ぜひ皆さんも、APIを活用して面白い地図アプリを作ってみてください！  

📢 ご意見・感想をコメントでお待ちしています！
【Go】簡単なAbstract Factoryパターンのサンプルコード


## 概要

- Goで簡単なAbstract Factoryパターンを実装。

## 実装内容

- 異なる通知方法（EmailやSMS）のインスタンスを生成し、メッセージを送信するサンプルコード
	- Notifierインターフェース: 通知を送るためのメソッドを定義
	- EmailNotifier と SMSNotifier: それぞれEmailとSMSの通知を実装
	- NotificationFactoryインターフェース: Notifierのインスタンスを生成するためのファクトリインターフェース
	- SendNotification関数: ファクトリを使って通知を送ることができる

## サンプルコード


```go
package main

// Notifier は通知を送るためのインターフェース
type Notifier interface {
	// SendNotification は通知メッセージを送信する
	SendNotification(message string) string
}

// EmailNotifier は Email 通知の実装
type EmailNotifier struct{}
func (n *EmailNotifier) SendNotification(message string) string {
	return "Email: " + message
}

// SMSNotifier は SMS 通知の実装
type SMSNotifier struct{}
func (n *SMSNotifier) SendNotification(message string) string {
	return "SMS: " + message
}

// NotificationFactory は Notifier を作成するファクトリインターフェース
type NotificationFactory interface {
	// CreateNotifier は Notifier を作成する
	CreateNotifier() Notifier
}

// EmailNotificationFactory は Email 通知のファクトリ
type EmailNotificationFactory struct{}
func (f *EmailNotificationFactory) CreateNotifier() Notifier {
	return &EmailNotifier{}
}

// SMSNotificationFactory は SMS 通知のファクトリ
type SMSNotificationFactory struct{}
func (f *SMSNotificationFactory) CreateNotifier() Notifier {
	return &SMSNotifier{}
}

// SendNotification はファクトリを使って通知を送信
func SendNotification(factory NotificationFactory, message string) string {
	notifier := factory.CreateNotifier()
	return notifier.SendNotification(message)
}

// 使用例
func main() {
	// Email 通知の送信
	emailFactory := &EmailNotificationFactory{}
	emailMessage := SendNotification(emailFactory, "Hello, Email!")
	println(emailMessage)

	// SMS 通知の送信
	smsFactory := &SMSNotificationFactory{}
	smsMessage := SendNotification(smsFactory, "Hello, SMS!")
	println(smsMessage)
}

// 出力
// Email: Hello, Email!
// SMS: Hello, SMS!
```
ローカル環境で AWSSDK.Extensions.NETCore.Setup 3.7.x を使った初期化が遅い場合は 3.7.1 を使うか DefaultsMode に Standard を指定する。

## はじめに

AWSにデプロイしたアプリでは問題ないのですが、ローカル環境でAWSSDK.Extensions.NETCore.Setupで構成したAWSの各種クライアントを初期化するときに数秒から数十秒かかる現象に遭遇しました。

この問題はAWSSDK.Extensions.NETCore.Setup 3.7.2で行われた改善が原因で、現在プレビュー版の4.xで改善されるらしいですが、現時点では最新版の3.7.400でも同様に発生しています。

現時点の対応としては、appsettings.jsonで`AWS:DefaultsMode`を`Standard`にすると回避できます。AWSSDK V4では`Standard`がデフォルトになるようなので、問題が出ている場合は先行して変更するということですね。

## 3.7.2 以降で初期化に時間がかかる

.NETでAWSSDKを利用する場合、GenericHost下であればAWSSDK.Extensions.NETCore.Setupを使って次のように初期化することがほとんどでしょう。

```cs
services.AddDefaultAWSOptions(configuration.GetAWSOptions()!);
services.AddAWSService<IAmazonS3>();
```

AWSSDK.Extensions.NETCore.Setup のバージョン 3.7.2 以降では、DIでAddAWSServiceに登録したサービスを受け取ったり、ServiceProviderからインスタンスを取得したりする場合、ローカル環境では初回のインスタンスの解決に数秒から数十秒時間がかかります。

## 原因

AWSSDK.Extensions.NETCore.Setup 3.7.2 で入った、インスタンスの遅延初期化に関する問題で、ローカル環境実行時に存在しない[IMDS(インスタンスメタデータサービス)](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)と通信を行おうとして失敗し、数回のリトライを待機することが原因のようです。

https://github.com/aws/aws-sdk-net/issues/3678#issuecomment-2689554787

## 対処

4.xで解消されているということですが、現在(2025/02/28)時点ではプレビュー状態でまだ利用できないため、appsettings.jsonを次のように修正します。

```diff_json:appsettings.json
{
  "AWS": {
    "Region": "ap-northeast-1",
-    "Profile": "myprofile"
+    "Profile": "myprofile",
+    "DefaultsMode": "Standard"
  }
}
```

`DefaultMode`は`スマート設定デフォルト`という機能で利用される設定値です。下記のページに概要が示されていますが、AWS SDKを利用する際の再試行の方法や回数などに影響するようです。

https://docs.aws.amazon.com/ja_jp/sdkref/latest/guide/feature-smart-config-defaults.html

## おわりに

`DefaultMode` が各サービスに与える影響が確実につかめたわけではありませんが、設定後、ローカルおよびAWSかんで動作させてみた感じ問題なさそうなのでとりあえず様子見にしようと思います。
java memo

```
---java memo


1
java 変数下の青い線を削除

デバッグではない状態、変数の上にマウスオンにする、
出た窓の三番目の Deactivate xxxxxxをクリック

2
java  行に大文字TODO 書くと、右に青い小さいな□でる

3
java 変数使わないとき、下に黄色線がでます。

4
@Injcet
Test test;
new不要ですので、非常に便利です。
@Injcet
注目してほしいのは@Injcetを使用すると　「new」を用いることがないということです。

5
文字列の一目文字のcharとして取得方法
String str = "T試験";
char str1 = str.charAt(0);

6
全角チェック
if (str.charAt(0) == "\u3000")
全角、半角チェック
Character.isSpaceChar(str1)
【Teams電話】不在時のボイスメール

# はじめに

Teams クライアントのボイルメールの設定には、通常のボイスメールの設定のほかに、「不在時のボイスメール」の設定があります。これらの違いについてまとめました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/f2c204bd-5f2d-4259-81f2-20f580ed5ce0.png)

# 不在時のボイスメールとは？

ボイスメールは着信へ応答できない場合に、応答メッセージを再生して音声を録音する機能です。そして、この「応答できない場合」には 2 つのパターンがあります。

1. 偶然そのタイミングで着信へ応答できない
   別の通話に対応しているなど
2. 一定期間不在でその間着信に応答できない
   休暇など

ここで、パターン 1 とパターン 2 で応答メッセージが同じだと、電話を掛けてきた人には偶然タイミングが悪かったのか、相手が休暇なのか分かりません。

不在時のボイスメールの設定を使用すると、パターン 1 とパターン 2 で異なる応答メッセージを流すことで、電話を掛けてきた人に不在であることを伝えることができます。

::: note
「不在時」は英語ドキュメントでは 「out-of-office」と記載されています。ここでは「不在」を一時的に離席している状況ではなく、「外出中」や「休暇中」と考えれば分かりやすいと思います。
:::

(参考：ユーザーのクラウド ボイスメール設定を管理する)
https://learn.microsoft.com/ja-jp/microsoftteams/manage-voicemail-settings
※ 英語版
https://learn.microsoft.com/en-us/microsoftteams/manage-voicemail-settings

# 不在時のボイスメールの設定方法

先のパターン 2 の応答メッセージを設定するには、以下の 2 箇所の設定を行います。

* 不在時のボイスメールの設定
* 不在時の自動返信の設定

## 不在時のボイスメールの設定

Outlook の自動応答がオンである場合：✅
ユーザー設定の応答メッセージ：不在時の応答メッセージを入力

入力した応答メッセージの後に、「発信音の後にメッセージをどうぞ」と音声が流れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/617de13f-28c3-4eae-8993-05b5d5341fc2.png)

::: note warn
入力した応答メッセージがボイスメールの言語と異なっていると、設定されている言語で既定の応答メッセージが再生されます。
:::

::: note
[あいさつ文が再生されるタイミング] で [常時] に ✅ すると、常に不在時の応答メッセージが使用されます。
:::

※ 関連記事

https://qiita.com/atsmin77/private/4c53de2ca8dc7cd6342d

## 不在時の自動返信の設定

Outlook の不在時の自動返信を設定します。この設定は Teams クライアントからも設定することができます。設定内容は Outlook にも同期されます。

[設定] - [一般] - [不在] から スケジュールする] をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/feb3770b-1831-4a20-8d5b-315a98334d75.png)

自動応答を有効にする：オン
不在時の自動応答メッセージ：自動返信の内容を入力します。
この期間に買い切り応答を送信する：✅

自動返信の開始日と終了日を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680397/33936470-a636-4400-83d0-dc89b1abcedf.png)

このように設定しておくと、不在時の自動返信が有効な期間は、ボイルメールも不在時の応答メッセージが使用されます。
Docker環境における「vite: not found」エラーについて

### はじめに
Docker環境下でフロントエンド開発を行っていた際、npm run dev を実行すると、以下のような「vite: not found」エラーが発生した。

```
2025-03-13 23:58:45 frontend-1  | > frontend@0.0.0 dev
2025-03-13 23:58:45 frontend-1  | > vite
2025-03-13 23:58:45 frontend-1  | 
sh: 1: vite: not found
```

### 試した対処法
viteコマンドが見つからない……？
依存関係のエラーか、viteのインストールに失敗しているのではないか、と思い一旦設定ファイルを見返すことに。

```
# docker-compose.yml
version: "3"
services:
  backend:
    build:
      context: .
      dockerfile: Dockerfile.backend
    ports:
      - "5000:5000"
    volumes:
      - ./backend:/app
    environment:
      - CHOKIDAR_USEPOLLING=true
    restart: always
  frontend:
    build:
      context: .
      dockerfile: Dockerfile.frontend
    ports:
      - "3333:3333"
    volumes:
      - ./frontend:/app
    environment:
      - CHOKIDAR_USEPOLLING=true
    tty: true

```

```
# Dockerfile.frontend
# ベースイメージとして公式のNode.jsイメージを使用
FROM node:18

# コンテナ内の作業ディレクトリを指定
WORKDIR /app

# package.jsonとpackage-lock.jsonをコピー
COPY frontend/package.json ./
COPY frontend/package-lock.json ./

# ソースコードを全てコンテナにコピー（必要に応じて .dockerignore を設定）
COPY frontend/ .

# 依存関係をインストール
RUN npm install


# コンテナ起動時にnpm run devを実行
CMD ["npm", "run", "dev"]

```

```
# package.json
{
  "name": "frontend",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc -b && vite build",
    "lint": "eslint .",
    "preview": "vite preview",
    "openapi:generate": "npx rtk-query-codegen-openapi openapi-config.ts" 
  },
  "dependencies": {
    "@reduxjs/toolkit": "^2.6.0",
    "react": "^19.0.0",
    "react-dom": "^19.0.0"
  },
  "devDependencies": {
    "@eslint/js": "^9.19.0",
    "@rtk-query/codegen-openapi": "^2.0.0",
    "@types/react": "^19.0.8",
    "@types/react-dom": "^19.0.3",
    "@vitejs/plugin-react-swc": "^3.5.0",
    "esbuild-runner": "^2.2.2",
    "eslint": "^9.19.0",
    "eslint-plugin-react-hooks": "^5.0.0",
    "eslint-plugin-react-refresh": "^0.4.18",
    "globals": "^15.14.0",
    "openapi-typescript": "^7.6.1",
    "ts-node": "^10.9.2",
    "typescript": "~5.7.2",
    "typescript-eslint": "^8.22.0",
    "vite": "^6.1.0"
  }
}

```

ぱっと見npm installが走ったタイミングでviteはインストールされるように見える。
Dockerのimageとcontainerを削除して走らせてみてもダメ。
RUN npm install -g viteをDockerfileに書き込んでみたが、これもダメだった。

node_modules/.binへのパスが通っていないのか？
と思い、ENV PATH="/app/node_modules/.bin:${PATH}"
も試したがやはりダメ。

どうやら本当にviteがインストールされていない様子。

### 解決
困り果てていたところで、https://qiita.com/shoki-y/items/1be906c372c8a9a993a3
ここにたどり着いた。

どうやらホスト側の node_modules ディレクトリをコンテナ内にマウントすることで、依存関係が正しく同期されるように対策しないといけない様子。
Dockerコンテナ内で依存関係のインストール（npm install）が完了する前に npm run dev が実行され、Viteの実行ファイルが存在しないようだ。
試しにDocker compose内へ
```
- /app/node_modules
```
を追記してみたところnpm install 実行後に生成される node_modules がコンテナ内でも参照可能となり、Viteが正しく実行されるように！

### 原因
Dockerの挙動について全然理解できていなかったことが一番の問題だった。
おそらく、ホスト側でファイルをコピーしたタイミングで、Dockerがまだ依存関係のインストール処理中だった可能性がある。
volumeについて学び直す良い機会になった。

今回の解決方法が同様の問題に直面している方の参考になれば嬉しい。
理解が間違っているところなどあればコメントでご指摘いただけると喜びます。