OmniAICreator/Qiita-1.07M huggingface dataset:
040 AI屋さんの　プチ　ディープリサーチ　LLMにトークン全文入力　観光案内編



040 AI屋さんの　プチ　ディープリサーチ　LLMにトークン全文入力　観光案内編


軽い調査をお願いできる
　プチ　ディープリサーチさんに
観光案内や行動計画をいろいろ提案して貰います。

数十秒で回答が出てきて、
千変万化　なんでも答えてくれます。
「ちょっと詳しい人に聞いてみるか」くらいの、仕事量です。
普段使いには、これくらいで十分です。


プロンプト的には、条件を絞ってから
　場所、予算、目的、など
調査してもらうのが良い感じです。
プロンプト次第でもあるので、
工場や事務所の作業手順書を全文入力してあげれば、
良い仕事をしてくれそうです。



---
宴会・居酒屋

![スクリーンショット 2025-03-30 8.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/7b6b7f09-370c-4986-952f-461d11ab9a23.png)


![スクリーンショット 2025-03-30 10.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/afc7f514-3851-4e7d-8b7f-63b2cf6746de.png)






---
デート


![スクリーンショット 2025-03-30 8.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/8c9a754c-ce98-4c43-812a-727872296aea.png)





![スクリーンショット 2025-03-30 8.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/0df6a1f3-4def-49c6-86fd-400f89996960.png)








---
旅行

![スクリーンショット 2025-03-30 9.49.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/f95556b8-2807-4044-b9c7-4a82fa5c462b.png)






![スクリーンショット 2025-03-30 8.41.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/4fa5d675-79f5-4de5-bf3f-e21c00b6764f.png)





![スクリーンショット 2025-03-30 8.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/28b6f409-a611-4613-9a3f-e2912bdc8c25.png)







---
東京ディープ


![スクリーンショット 2025-03-30 8.37.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/8add1ac7-35ff-4e52-8dcc-13c3bd2a5671.png)


![スクリーンショット 2025-03-30 8.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/5e20b913-9b85-43bd-ba79-27a94387d490.png)


![スクリーンショット 2025-03-30 8.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/a45a2025-db19-4dfb-a91e-1f6a2dbeafac.png)












---

目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7



報告内容の
リンク先も生きているので、自分で追加調査も容易です。
大規模言語モデルの出力するリンク先は、
すでに死んでいる404が多かったりするので
地味にありがたいです。

応答速度も数十秒と比較的早目なので
軽めの調査に向いています。
カーナビや、電車の乗り換え検索　くらいのイメージです。
本格的な、コンサル報告書みたいなのは
ディープリサーチにお願いしましょう。




ー続くー
ABC399回答メモ

# 0.はじめに
　緑コーダーの最下層をうろついている今日この頃のコンテスト。
　今回もＡ～Ｃはすんなり通りましたが、Ｄでブレーキ。
　問題文を理解できていない点もあり
　結局1時間以上かけても回答できませんでした。
　レートは-1の802と、ギリギリ緑コーダー継続となりました。

# 1.A - Hamming Distance
　先頭からSとTを1文字ずつ比較し、異なる場合をカウント。
　最後にカウントした数を出力して終了。

　https://atcoder.jp/contests/abc399/submissions/64281805


# 2.B - Ranking with Ties
　なかなかややこしい問題。
　問題文の理解に時間がかかりましたが、こういう時は
　問題文通りにロジックを作るという自分の原則に従い
　以下の実装
　【実装】
　　1.NとAをインプット
　　2.各Aの位置毎の順位リストLを0で初期化
　　3.flgに１をセット
　　4.現在の順位rに1をセット
　　5.以下flgが1の間ループ
　　　-1.変数C(この周回内で順位付け対象の点数
　　　　　＝順位がまだついていない人の中での得点最大値）を0で初期化
　　　-2.以下iを0～N-1まで繰り返し
　　　　-1.L[i]が0の時（順位未設定の時）CにCとA[i]の大きい方をセット
　　　-3.Cが0の時はflgに0をセットしループ終了
　　　-4.Cが0以外の時
　　　　　-1.C2(C点を取った人の数をカウント)に0をセット
　　　　　-2.以下iを0～N-1まで繰り返し
　　　　　　-1.A[i]がCの時L[i]にrをセットし、C2に1加算
　　　　　-3.rにC2を加算
　　6.Lの内容を1つずつ改行して出力

　https://atcoder.jp/contests/abc399/submissions/64295583


# 3.C - Make it Forest
　なれないグラフ問題。
　閉路判断は、UNION-FIND木で同じ根になった時に閉路になるという
　うっすらした記憶をもとに、昔使ったUNION-FIND木ロジックを持ってきて
　辺ごとに、違う根の場合は結合
　同じ根の場合は結合せずカウントし
　最後にカウントして終了としたらACとなりました。
　考慮不足のケースがあったら打つ手なしだなと思いましたが何とかなりました。

　https://atcoder.jp/contests/abc399/submissions/64301973


以上
【pandas】skiprowsで先頭複数行を無視してDataframeを読み込む

# 結論

`pd.read_csv`でデータを読み込む際に`skiplows`オプションを指定する。

```python
df = pd.read_csv(data, skiplows=low_number)
```

# 背景

オープンデータの中には、不要なメタデータ行やヘッダー行が含まれている場合がある。
データ取得と加工を同時に行わない場合、ダウンロードした元データを直接編集することもできる。多くの場合、こちらの方法の方が簡単かつ再利用しやすい。
一方、これらを同時に行いたい場合、プログラムの中でヘッダーを無視する方法を検討する必要がある。

以下のデータは、[e-Stat api](https://www.e-stat.go.jp/api/)を使用して取得した「年齢（3区分），男女別人口及び年齢別割合 － 都道府県，市区町村（令和2年）　北海道　～　沖縄県」である。e-Stat apiではjsonとcsvの二つの形式でデータが与えられているが、以下はcsv形式で取得したものである。
これをみると、本来利用したいデータ以外にも、統計実施期間や統計表名といったメタデータが記載されていることが確認できる。

```
"SURVEY_DATE","202001-202012"
"OPEN_DATE","2022-03-31"
"SMALL_AREA","0"
"COLLECT_AREA","該当なし"
"MAIN_CATEGORY","02","人口・世帯"
"SUB_CATEGORY","01","人口"
"OVERALL_TOTAL_NUMBER","41244"
"UPDATED_DATE","2024-09-30"
"STATISTICS_NAME_SPEC","時系列データ","男女，年齢，配偶関係","","","",""
"TITLE_SPEC","","年齢（3区分），男女別人口及び年齢別割合 － 都道府県，市区町村（令和2年）　北海道　～　沖縄県","1) 年齢（3区分）の「総数」には、年齢「不詳」の者を含む。<br>2) 割合は、年齢「不詳」の者を除いて算出している。","","",""
"NOTE","***","当該数値がないもの"
...
"020","人口","100","総数","100","総数","01108","札幌市厚別区","2020000000","2020年","人","125083",""
"020","人口","100","総数","100","総数","01109","札幌市手稲区","2020000000","2020年","人","142625",""
"020","人口","100","総数","100","総数","01110","札幌市清田区","2020000000","2020年","人","112355",""
"020"
```

# データ読み込み

`pd.read_csv()`でデータを読み込む際に`skiplows`引数を指定する。引数は`int`型を。

[公式ドキュメント](https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#:~:text=spaces%20after%20delimiter.-,skiprowsint,-%2C%20list%20of%20int)

また、同様に末尾複数行をスキップする`skipfooter()`もある。

以下のコードは、先述の文字列を読み込むことを想定した例である。`StringIo(text)`を利用してテキストファイルと同様に`pd.read_csv()`を使えるようにしている。また、区切り文字を認識するために、`sep=","`を設定している。

```python
data = StringIo(text)

try:
    df = pd.read_csv(data, sep=",", encoding='utf-8', skiprows=27)
except pd.errors.ParserError as e:
    print("Error parsing CSV:", e)
```
Geminiで勇者を描いてみた。

# 概要

Geminiで勇者を描いてみました。

# 実装

以下のリクエストで勇者を描いてもらいました。

```
勇者がスライムと戦っているシーンを描いてください。
```

![勇者がスライムと戦っているシーン_20250329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/0c5a2e97-7af7-4aaa-b879-c3124da10e02.png)

```
勇者がゴブリンと戦っているシーンを描いてください。
```

![勇者がゴブリンと戦っているシーン_20250330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/c07d1598-0b19-483b-be19-046701883ed3.png)

```
勇者がワイバーンと戦っているシーンを描いてください。
```

![勇者がワイバーンと戦っているシーン_20250330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/cbd207c9-010d-4a98-ba11-286e7fb99a1a.png)

```
勇者がドラゴンと戦っているシーンを描いてください。
```

![勇者がドラゴンと戦っているシーン_20250330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/7994a5e4-fee0-43a8-b52f-57898469262d.png)

```
勇者が町の人と話しているシーンを描いてください。
```

![勇者が町の人と話しているシーン_20250330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/a7bc902f-5cc3-406f-a02f-2ae80626085c.png)

```
勇者が仲間と旅をしているシーンを描いてください。
```

![勇者が仲間と旅をしているシーン_20250330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/70dc6a2e-b273-4aff-8f7e-a1edc83d511b.png)

総じてうまく描けていると思います。こんな感じのゲームでも作ろうかな。

# まとめ

何かの役に立てばと。
Slackで残タスクのリマインダーを作ってみる

こんにちは。

テックリードのTerukiです。

Oh my teethではSlackをフル活用して日々の業務を行っているのですが、そこで実装しているリマインダーについて紹介します。

# Slackのリマインダー

Slackにはもともとリマインダーの機能がありますが、今回はそれらの機能ではできないチャンネルに投稿されたメッセージすべてに対してリマインドしてくれるようなものを作ってみます。

https://slack.com/intl/ja-jp/resources/using-slack/how-to-use-reminders-in-slack

例えば、<font color="#1D9AD0">#todo-something</font>チャンネルのようなタスクがひたすら投稿されるチャンネルがあった場合、リマインド機能がないとほぼ確実に漏れが発生します。

Slackの公式リマインダーはメッセージに対して自分でリマインダーを設定しますが、毎日100件など対応するものがある場合はとても非現実的です。

# 実装

例えば、18時になったら未対応のTodoに対してリマインドをしてもらうとします。

未対応かどうかの判定は特定の絵文字がメッセージについているかどうかで行います。

イメージ：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192685/03bd08ac-887f-4ee2-8fa0-015bd3435a2c.png)

この機能はSlackの「conversations.history」APIで実現できます。

https://api.slack.com/methods/conversations.history

このAPIは最大1000件のチャンネルのメッセージを取得できます。

レスポンスの中に何のリアクションが付いているが載っているのでここを見れば判定できるというわけです。

リアクションがなければ「chat.postMessage」にthread_tsとreply_broadcastを追加して呼び出せばOKです。

https://api.slack.com/methods/chat.postMessage

thread_tsに指定するべき値は「conversations.history」のレスポンスに載っています。

何も考えずにループでchat.postMessageを実行するとリマインド量によっては、ほぼ確実にレートリミットに引っかかってしまうので1ループごとに500ミリ秒程度遅延させるのが良いと思います。

重要なリマインドの場合はリマインドメッセージに特定のグループをメンションさせることもできますが、量が多いと毎日定時にグループに入っている人のアクティビティを破壊してしまうので使い所は要検討です。

# おわりに

Oh my teethはこのリマインダーをC#で実装しています。
コード自体が業務システムと結びつきすぎているためコードは公開できないのですが、やっていることは紹介しているAPIにHttpClientでアクセスしているだけです。

個人的な考えですが、Slackに限らず公式のSDKがない時は下手にサードパーティや非公式OSSを利用せずに自分たちで直接HTTPリクエストを実行するようなコードを書くのが良いと思っています。

依存関係を増やさなくて済みますし、HttpClientにリトライ機能を実装しようとしてもライブラリに隠蔽されていると実装できなくなってしまいます。

リマインド量が多くSlackアプリを自作できる方は試してみてはいかがでしょうか。


# Oh my teethについて
[Oh my teeth](https://www.oh-my-teeth.com/?tags=qiita)では未来の歯科体験を創るために日々活動しています。

Techチームではより良いユーザー体験を提供するべく、Webフロントエンドからバックエンド、スマホアプリに機械学習モデルなど、さまざまなプロダクトを開発しています。

一緒に未来の歯科体験を創りませんか？興味がある方は是非こちらを確認してください。

https://oh.careers/

カジュアル面談も可能なので気軽に応募してみてください！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192685/0138b492-e02b-852e-61fa-fc065b53d285.png" width="450" />
[Linux][command] プロセス管理_プロセス終了_kill, killall, pkill, Ctrl + C, Ctrl + Z 

# シグナル名とシグナルID
| シグナル名 | シグナルID | 由来 | 動作 |
|:--|:--|:--|:--|
| `HUP`  | 1  | **Hang UP**         | 端末切断の終了 |
| `INT`<br>`Ctrl`+`C`  | 2  | **Interrupt**       | キーボードからの割込み終了 |
| `KILL` | 9  | **Kill**            | クルーンアップせずに終了<br>(強制終了) |
| `TERM` | 15 | **Terminate**       | クルーンアップして終了<br>(デフォルト) |
| `CONT` | 18 | **Continue**        | 一時停止中のプロセス再開 |
| `STOP` | 19 | **Stop**            | 一時停止 |
| `TSTP`<br>`Ctrl`+`Z` | 20 | **Terminal Stop**   | キーボードからの一時停止 |

# プロセスの終了
## killコマンド
~~~terminal:killコマンド
$ kill -[シグナル名またはシグナルID] PID
$ kill -SIGシグナル名　PID
$ kill -s [シグナル名またはシグナルID] PID
~~~

## killallコマンド
~~~terminal:killコマンド
$ killall -[シグナル名またはシグナルID] プロセス名
$ killall -SIGシグナル名　プロセス名
$ killall -s [シグナル名またはシグナルID] プロセス名
~~~

## pkill
~~~terminal:pkillコマンド
$ pkill -[シグナル名またはシグナルID] プロセス名(正規表現)
$ pkill -s [シグナル名またはシグナルID] プロセス名(正規表現)
~~~

# Ping-t
- [3198_kill, killall, pkill](https://mondai.ping-t.com/question_subjects/31/question_sessions/32311097/progressing_questions/495045362)
- [3478_killall -s 15, killall -SIGTERM](https://mondai.ping-t.com/question_subjects/31/question_sessions/31870469/progressing_questions/488372712)
- [3479_killall -HUP](https://mondai.ping-t.com/question_subjects/31/question_sessions/32246633/progressing_questions/494045386)
- [3480_kill -INT, killall -INT, Ctrl + C](https://qiita.com/Jochun/items/bd514fcd21b32d1d3b68)
- [3483_kill -SIGTSTP, Ctrl + Z]()
- [3569_kill -CONT](https://mondai.ping-t.com/question_subjects/31/question_sessions/31941533/progressing_questions/489430942)
- [3681_kill -SIGSTOP, kill -SIGTSTP, Ctrl + Z](https://mondai.ping-t.com/question_subjects/31/question_sessions/31870469/progressing_questions/488372716)
- [3667_kill -TERM, kill -SIGTERM]()
【Carbon】Carbon::now()->subMonth()の使用の罠にハマりそうだった件

今日は2025年3月30日。
処理の中で前の月を取得したいと思い下記のコードを実装した。
```php:
Carbon::now()->subMonth()
```

<br>

で、うまく取得できているか確認しようと思いデバックしたところ、下記の表示が出た。
```php:
2025-03-02 09:43:23
```
<br>

あれ、おかしい。
自分が取得したいのは2月の日付である。
<br>
その後、何回実行しても3月の日付が取得されてしまう。。。
ここで少し詰まった。
<br>
## 確実に前の月の値を取得したいならfirstOfMonth()を使おう

どうやらsubMonth()の仕様だと1ヶ月前の日付を取得する為、例えば3月30日に実行すると2月30日が存在しないため3月に調整されることが発生する仕様とのこと。
<br>
なので、確実に前の月を取得するにはfirstOfMonth()メソッドを使ってその月の初日が始まった日付を取得することで、確実に前の月を取得するようにした方がよさそう。

```php:
// 修正コード
$lastMonthDate = Carbon::now()->firstOfMonth()->subMonth();
$year          = $lastMonthDate->year;
$month         = $lastMonthDate->month;

// ログで出した結果
[2025-03-30 09:37:32] local.DEBUG: 2025-02-01 00:00:00  
[2025-03-30 09:37:32] local.DEBUG: 2025  
[2025-03-30 09:37:32] local.DEBUG: 2
```
windows11で、sketchup6 その28

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
korpus1、見つけたので、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1e41714a-e68a-45fc-80bd-c100602b6434.png)

# サンプルコード

```

require 'sketchup.rb'

def create_korpus1
	prompts = ["Breite-Aussen ", "Hoehe-Aussen", "Tiefe-Innen", "Seiten-Staerke", "Boden-Staerke", "Ruckwand-Staerke "]
	values = [550.mm, 762.mm, 540.mm, 16.mm, 19.mm, 10.mm]
	results = inputbox prompts, values, "Korpus-Masse"
	return if not results 
	xx, zz, yy, d1, z1, r1 = results
	model = Sketchup.active_model
	model.start_operation "Create Box"
	entities = model.active_entities
	group = entities.add_group
	entities = group.entities
	pts = []
	pts[0] = [0.mm, 0.mm, 0.mm]
	pts[1] = [d1, 0.mm, 0.mm]
	pts[2] = [d1, yy, 0.mm]
	pts[3] = [0.mm, yy, 0.mm]
	base = entities.add_face pts
	zz = -zz if( base.normal.dot(Z_AXIS) < 0 )
	base.pushpull zz
	model.commit_operation 
	model = Sketchup.active_model
	model.start_operation "Create Box"
	entities = model.active_entities
	group = entities.add_group
	entities = group.entities
	pts = []
	pts[0] = [0.mm + xx, 0.mm, 0.mm - zz]
	pts[1] = [0.mm + xx - d1, 0.mm, 0.mm - zz]
	pts[2] = [0.mm + xx - d1, yy, 0.mm - zz]
	pts[3] = [0.mm + xx, yy, 0.mm - zz]
	base = entities.add_face pts
	zz = -zz if( base.normal.dot(Z_AXIS) < 0 )
	base.pushpull zz
	model.commit_operation 
	model = Sketchup.active_model
	model.start_operation "Create Box"
	entities = model.active_entities
	group = entities.add_group
	entities = group.entities
	pts = []
	pts[0] = [0.mm + d1, 0.mm, 0.mm]
	pts[1] = [0.mm + xx - d1, 0.mm, 0.mm]
	pts[2] = [0.mm + xx - d1, yy, 0.mm]
	pts[3] = [0.mm + d1, yy, 0.mm]
	base = entities.add_face pts
	z1 = -z1 if( base.normal.dot(Z_AXIS) < 0 )
	base.pushpull z1
	model.commit_operation 
	model = Sketchup.active_model
	model.start_operation "Create Box"
	entities = model.active_entities
	group = entities.add_group
	entities = group.entities
	pts = []
	pts[0] = [0.mm + d1, 0.mm, 0.mm + zz]
	pts[1] = [0.mm + xx - d1, 0.mm, 0.mm + zz]
	pts[2] = [0.mm + xx - d1, yy, 0.mm + zz]
	pts[3] = [0.mm + d1, yy, 0.mm + zz]
	base = entities.add_face pts
	z1 = -z1 if( base.normal.dot(Z_AXIS) < 0 )
	base.pushpull z1
	model.commit_operation 
	model = Sketchup.active_model
	model.start_operation "Create Box"
	entities = model.active_entities
	group = entities.add_group
	entities = group.entities
	pts = []
	pts[0] = [0.mm, 0.mm + yy, 0.mm]
	pts[1] = [0.mm + xx, 0.mm + yy, 0.mm]
	pts[2] = [0.mm + xx, 0.mm + yy + r1, 0.mm]
	pts[3] = [0.mm, 0.mm + yy + r1, 0.mm]
	base = entities.add_face pts
	zz = -zz if( base.normal.dot(Z_AXIS) < 0 )
	base.pushpull zz
	model.commit_operation 
end





```

以上。
【AWS】LightsailでデプロイしたアプリケーションをHTTPS化する

# 前提
+ Route53にドメインは登録済み（＝レコード作成済み）
+ LightsailでWordpressやDrupalのアプリケーションを立ち上げていること

購入したドメインをRoute53に登録するやり方については以下の記事を参考にしてください。

https://qiita.com/nekihcom/items/db6baca953d3ed6dfc78

# やり方

## インスタンスの設定画面にアクセスする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/a5727ea6-7b4f-4b5d-a82f-087f7a351d3a.png)

## 静的IPを固定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/8fbeac92-bff5-4d81-9c67-9e28b85f14d3.png)

Networkingタブから静的IPを固定します

## インスタンスにSSH接続する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/d8b0f10f-db40-49fd-a1c1-7d36fbc96a91.png)

インスタンス一覧の上図赤枠のリンクからブラウザ上でSSH接続できます

## bncertツールでHTTPS化する

```
sudo /opt/bitnami/bncert-tool
```
SSH接続できたら👆のコマンドを実行する


```
Domain list []: www.example.com example.com
```

ドメインの入力が求められたらインスタンスに紐づけたいドメインを入力します。
複数あるなら空白スペースで区切ります。


```
Enable HTTP to HTTPS redirection [Y/n]: y
```
httpからhttpsへのリダイレクトを希望するならyを、そうでないならnを入力します。


```
The following changes will be performed to your Bitnami installation:

1. Stop web server
2. Configure web server to use a free Let's Encrypt certificate for the domains: www.example.com
3. Configure a cron job to automatically renew the certificate each month
4. Configure web server name to: example.com
5. Enable HTTP to HTTPS redirection (example: redirect http://www.example.com to https://www.example.com)
6. Start web server once all changes have been performed



Do you agree to these changes? [Y/n]: y
```
色々設定するからインスタンスを再起動するね、ということが書かれています。
サービスに問題なければ再起動します。

```
Create a free HTTPS certificate with Let's Encrypt

Please provide a valid e-mail address for which to associate your Let's Encrypt 
certificate.

(中略)

The Let's Encrypt Subscriber Agreement can be found at:

https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf

Do you agree to the Let's Encrypt Subscriber Agreement? [Y/n]: y
```
bncertツールを使ってHTTPS化する上での規約に同意を求められます。
同意するのであればyを、そうでないならnを入力します。
同意しない場合はコマンドが終了します。


```
----------------------------------------------------------------------------
Performing changes to your installation

The Bitnami HTTPS Configuration Tool will perform any necessary actions to your 
Bitnami installation. This may take some time, please be patient.

----------------------------------------------------------------------------
Success
```
最後に👆のよう成功したことが表示されればHTTPS化が完了しています。
ブラウザでアプリケーションを開いて確認してみましょう。

:::note warn
HTTPS化されていなければ、数分時間をおいてアクセスし直してみてください。
それでもダメだったらブラウザのキャッシュクリアをしてみてください。
:::

手順は以上です。


# 参考

https://docs.aws.amazon.com/ja_jp/lightsail/latest/userguide/amazon-lightsail-enabling-https-on-wordpress.html#https-wordpress-enable
Google Cloud認定Cloud Digital Leader受験談＆学習方法

## 概要
2025年3月29日にGoogle Cloud認定Cloud Digital Leaderの試験を受けて合格しましたので、学習したこと等を情報共有として書いていきます。
合格基準は70%以上の正答率ですが、自分の得点は分からず、合格という連絡だけ受け取りました。
会社としてGoogle Cloudに力を入れていくということなので、まずは初級レベルのCloud Digital Leaderの試験を受けてみました。

## 前提の知識と経験
パブリッククラウドとしてはAWSをメインに扱い、SAPやDOPの試験に合格しているということが、私の前提になっています。
AWSでの設計・構築経験を含め3年くらいになりますが、Google Cloudは試しにサーバを立ち上げるためコンソール画面をポチポチするくらいの経験です。

## 学習期間
今回は大体2週間くらいで、平日は1日2〜3時間、休日は5〜6時間くらいです。並行してAssociate Cloud EngineerやProfessional Cloud Architectも勉強していたので、勉強時間は大体です。

## 学習教材
### 1. Google Cloud公式サンプル問題
Cloud Digital Leaderのサンプル問題が確か20問あり、レベル感も本番と近かったかなと。まずはこのサンプル問題で自分の実力を把握して、100パーセント正答できるようにしておきましょう。

https://docs.google.com/forms/d/e/1FAIpQLSedAmf77MGS7FGEaylFzY51KtBd7kkIZJIMDsV5zSRSmpKIOA/viewform

### 2. Google Cloud認定 Cloud Digital Leader（CDL） トレーニング

Udemyの動画教材で、試験に出題されるGoogle Cloudのサービスを網羅的に把握できます。Google Cloudのサービス名から分からないので、AWSとの比較のために一度見ておいた方が良いかも知れないです。

https://www.udemy.com/course/google-cloud-cloud-digital-leader-cdl


### 3. GCP：Google Cloud Digital Leader模擬試験問題集（6回分320問）
Udemyの模擬試験で、本番試験のレベル感に近いかなと思います。6回分ありますので、2〜3周やってみて、9割以上の正答率まで持ってこれたら、おそらく合格できます。

https://www.udemy.com/course/google-cloud-digital-leader6320

### 4. 【GCP】短期突破！Google Cloud Digital Leader模擬試験問題集（6回分）

こちらもUdemyの模試ですが、、、本番試験よりレベルが高かったような気がします。
試験の合格だけを目指すなら上記の模試だけで大丈夫かも知れないです。

https://www.udemy.com/course/gcpgoogle-cloud-digital-leader6/?couponCode=25BBPMXPLOYCTRL

## 試験2週間前、、、登録している名前が運転免許と違う
実は本番試験自体より試験前の準備段階が一番気を使った気がするので、そちらも共有しておきます。
まずは試験ですが、Google Cloud用の「CertMetrics」に登録し、そこから「Kryterion」が運営する「My Assessments」に登録します。
「CertMetrics」は資格一覧やクーポンなどを管理していて、「Kryterion」は試験の監視や運営自体を管理していると考えています。

で、「CertMetrics」経由で「My Assessments」の登録時、何の気なしにローマ字で氏名を登録しました。

ただ、受験日の登録後、「身分証明書と登録されている氏名が一致していること」とのルールが記載されているメールが届き、、、「しくじった」となりました。

私のパスポートは期限切れで使えなく、運転免許証とマイナンバーカードしか持ってないので、日本語の氏名と「My Assessments」に登録されている氏名が一致していないという状況。
どこかに変更できるフォームがないかなと探しましたが、「My Assessments」にはなく、「CertMetrics」には表示名だけを変更できる入力フォームしかない、、、ということで、Google Cloudのサポートに連絡して、名前を変更することにしました。

何度かやり取りを繰り返し、1日後に「CertMetrics」と「My Assessments」に氏名を日本語に変更できることに成功。

これ、直前に気がついたら終わっていましたね〜

ちなみにAWS認定試験では気にしていないですし、CNCF系の試験では登録氏名と身分証明証の氏名の一致は厳格ですが、こちらでいくらでも変更できます。
Google Cloudはサポート頼りという状況なので、気をつけてください。

## 試験直前
こちらも身分証明に少し時間がかかりました。
試験直前にスマホを使って「運転免許証」を登録しましたが、その後に試験官とのチャットで、「身分証明証が正式に受け取れない、他に身分証明書はないか？」とのこと、、、私は「マジか!?」となりました。
とりあえず「日本のマイナンバーカードはある」と伝え、「カメラの前に提示して」と誘導されたので、提示すると試験官から「OK」とのこと、、、マジで焦りましたね。生きた心地がしなかったです。

一応、本番試験では身分証明証をできる限り用意しておきましょう。

## 本番試験
100分の試験時間で30分で見直し含めて終了しました。一般的なクラウドの知識、Google Cloudのサービス、AI系の知識がバランスよく配置されていて、私の場合は50問出題されていました。
解答を提出後、すぐに合格の結果が表示されましたが、正式な結果は18時間後にメールで届きました。

## 最後に
Cloud Digital Leaderはクラウドの基礎的な知識を問う試験ですので、もしAWS認定プラクティショナーに受かっている人であれば、簡単に合格できる感じです。
次はAssociate Cloud Engineerですかね〜頑張ります:muscle:
この記事が何かしら参考になればと幸いです。
OpenRB-150 Starter Kit でサーボモータ XL330-M288-T を動かすまで（その1）

Arduino互換ボードであるOpenRB-150とサーボモータXL330-M288-Tのセットである[OpenRB-150 Starter Kit](https://e-shop.robotis.co.jp/product.php?id=488)を今回は、ROBOTIS様のご厚意で提供いただきました。ROBOTIS様に感謝申し上げます。

以下は、キットを動かすまでの備忘録です。
ROBOTISのe-manualの通りで、動作確認できました。
![OpenRB-150_XL330-M288-T_2_mini.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2583728/b6861551-bc17-4f69-98dc-1808d861e4f4.jpeg)

事前準備
OpenRB-150 と XL330 はあらかじめ接続しておく。
低トルク・低速でサーボを動かすならUSBパワーでよいが、
高トルク・高速で動かすなら、外部電源でサーボモータを動かすこと。
その場合、ジャンパーをVIN側に差し替えて、±に気を付けて外部電源端子に供給すること。

Arduino IDE のインストールと設定
Arduino IDE　を [ここから](https://www.arduino.cc/en/software/)インストール（2025.3.29時点で、ver. 2.3.5）以下はWindowsの場合。

A「インストールしようとしているアプリは、Microsoft検証済みアプリではありません」と表示されるが、B「了解してインストール」を選択

B　が表示されない場合、
「アプリ推奨事項の設定変更」をクリックして、「アプリを入手する場所の選択」で
「入手元を制限しないが、Microsoft Store以外からのアプリをインストールする前に警告を表示する」を選んでおくこと

1. Arduino IDE を起動
2. File > Preference で Additional Boards Manager URLS の欄に以下をコピペし、OK をクリック
3. https://raw.githubusercontent.com/ROBOTIS-GIT/OpenRB-150/master/package_openrb_index.json
4. Tools > Board > Boards Manager で　「Arduino SAMD」を検索し、インストール
（2025.3.29時点で、ver. 1.8.14）
5. Tools > Board > Boards Manager で　「OpenRB」を検索し、「OpenRB-150」をインストール
（2025.3.29時点で、ver. 0.2.1）
6. Sketch > Include Library で　「Manage Libraries ...」を選択し、
「dynamixel2arduino」を検索し、インストール
（2025.3.29時点で、ver. 0.8.0）
7. XL330とつないだOpenRB-150をPCと接続してから、
8. Tools > Board > OpenRB-150 で「OpenRB-150」を選択 
9. Tools > Port で COM# を選択（＃は数字）
9. File > Examples で 最下段の Dynamixel2Arduino > basic > position_mode を選択
9. 新しく窓が開くので、「→」でコンパイル＋書き込みをする
9. XL330が動く

XL330の設定は e-mannual の [こちら](https://emanual.robotis.com/docs/en/dxl/x/xl330-m288/)を参照のこと

``` : position_mode の一部のみ
void loop() {

  // GoalPosition は Min-Maxの間の値で、defaultは Min=0、Max=4095
  // 0:0 deg., 2048:180 deg., 4095: 360deg.
  // 1000 なら 約90 deg.
  dxl.setGoalPosition(DXL_ID, 1000); // GoalPositionをセット
  int i_present_position = 0;
  float f_present_position = 0.0;

  // 現在位置と目標位置(1000)の差が10以下になるまで繰り返す
  while (abs(1000 - i_present_position) > 10)
  {
    i_present_position = dxl.getPresentPosition(DXL_ID);
    DEBUG_SERIAL.print("Present_Position(raw) : ");
    DEBUG_SERIAL.println(i_present_position);
  }
  delay(1000); // 1000ms 待つ

  // Goal Position を 5.7 deg. にセット
  // UNIT_DEGREE で 単位は deg. になる
  dxl.setGoalPosition(DXL_ID, 5.7, UNIT_DEGREE);
  
  // 現在位置と目標位置(5.7)の差が 2.0 deg. 以下になるまで繰り返す
  while (abs(5.7 - f_present_position) > 2.0)
  {
    f_present_position = dxl.getPresentPosition(DXL_ID, UNIT_DEGREE);
    DEBUG_SERIAL.print("Present_Position(degree) : ");
    DEBUG_SERIAL.println(f_present_position);
  }
  delay(1000); // 1000ms 待つ
}
```
reCAPTCHAなりすましウイルス？の解析

:::note alert
この記事が原因でこれらのウイルスで被害を負っても
筆者は一切責任を負いません。
:::

# 今回調べたもの
![fake-recaptcha](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/ad02c896-2861-45e9-8713-aeaa0516585a.png)
今回調べたのは、一見普通のreCAPTCHAにも見えるこの
ウイルス的なものです。

### 発生箇所
主に、某大企業などのドメインのタイポで、このようなサイトに
行き着くことがあるようです。

### 認証しようとすると？
認証しようとすると、先ほどの画面に「認証ステップ」と書かれた
手順が表示されます。
![fake-verification-steps](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930283/7886aba4-95f5-4287-b96a-84fd43594baa.png)

#### 解説
このサイトではおそらく、
1. ユーザーが「I'm not a robot」ボタンを押す
2. クリップボードにWindowsで実行可能な
   悪意あるコマンドがコピーされる
3. ユーザーが「ファイル名を指定して実行」ウインドウに
   コマンドを貼り付け、実行する
   
という手順を踏ませています！

### どんなコマンド？
Windowsに搭載されている、HTMLアプリケーションを実行する
「mshta」というコマンドを悪用しているようです。
実際の悪意あるコマンドは、mp3ファイルと見せかけて
scriptタグをバイナリに埋め込み実行させているようでした。
HTMLアプリというのは少し特殊で、
- ローカルファイルへのアクセス
- コマンドの実行
などができるそうです。

# 対策
対策としては、よくあるものですが
- そもそも、偽サイト等に飛ばされても、すぐにタブを閉じる
- 偽サイトの疑いがあるサイトのコマンドを実行しない
- Windows側がmshtaのセキュリティを高める(そうして欲しい)

# 参考文献
[トレンドマイクロ セキュリティブログ - HTAを利用したワンクリックウエアの新たな手口](https://blog.trendmicro.co.jp/archives/2729)

最後まで読んでいただきありがとうございます。
herokuでアプリをデプロイした時にForbidden You don't have permission to access this resource.というエラーが出る

## やりたいこと


herokuを利用して作成したアプリをデプロイしたい。


## 発生したエラーの内容



heroku infoコマンドを打った時に表示されたWebURLをブラウザから入力したところ以下のようなエラーが発生する


![スクリーンショット 2025-03-30 8.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949461/1b26573d-e605-45a4-8ccc-0bbc3e349317.png)

このようにエラーが発生してしまい、画面が表示されません


## 解決法



### アプリフォルダ直下にあるProcfileの名前が間違っていた。

![スクリーンショット 2025-03-30 1.11.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949461/a0cadbed-29a0-480b-a9b0-1273a941cfe3.png)


※正しくはProcfileです（pは大文字）
そこで以下のように修正して再度デプロイすると、、、解決しました！


![スクリーンショット 2025-03-30 8.38.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949461/d8837447-7d87-4967-bf43-acbae668ca43.png)
windows11で、sketchup6 その27

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
リングを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c975f798-ba04-4276-87f7-baa234b9dd9d.png)



# サンプルコード

```

require 'sketchup.rb'

#SinCurvedRing.new

class SinCurvedRing
	def initialize
		xya = 3
		zza = xya * 8
		xys = 118.400962 / 25.4
		zzs = 22 / 25.4
		cxy = 0
		czz = 0
		p = []
		while cxy < 360
			x = Math.cos(cxy * Math::PI / 180) * xys
			y = Math.sin(cxy * Math::PI / 180) * xys
			z = Math.sin(czz * Math::PI / 180) * zzs
			p[p.length] = [x, y, z]
			cxy += xya
			czz += zza
			if (czz >= 360)
				czz = 0
			end
		end
		p[p.length] = p[0]
		model = Sketchup.active_model
		entities = model.active_entities
		curve = entities.add_curve(p)
		circleEdges = entities.add_circle [0, 10, 0], Y_AXIS, 0.4, 24
		base = entities.add_face(circleEdges)
		base.reverse!
		base.followme(curve)
		model.entities.erase_entities(curve)
	end
end




```

以上。
業務システム開発での生成AIエージェント（Devin）の事例（本家サイトの日本語要約）

Devinの導入により、エンジニアが移行作業を委任でき、エンジニアリング時間を12倍節約し、コストを20倍以上削減できた事例。

以下は「DevineによるNubank（※） が数百万行のコードをリファクタリングしてエンジニアリング効率を向上させる方法」の要約です。

元記事：https://devin.ai/customers/nubank

※：Nubank：ラテンアメリカ最大の金融テクノロジー銀行であり、2013 年の設立以来、ブラジル、メキシコ、コロンビアで 1 億 1,000 万人以上の顧客にサービスを提供しています。



## 効果
### コスト
Devinに委任した移行範囲で20倍以上のコスト削減 Devinの実行コストと、そのタスクを完了するエンジニアの時間当たりコストを比較して算出。 タスク実行の速度と、人間のエンジニアリング時間と比較したDevinのコスト効率による。 プロジェクト全体を予定より数か月早く完了することで得られる価値は考慮されていない。

### スピード
移行速度が8～12倍高速化 データ クラス移行タスクを完了するために必要な一般的なエンジニアリング時間と、同じタスクでDevinの作業を促し、レビューするために費やされた合計エンジニアリング時間を比較して算出。

サブタスク 1 つあたりの所要時間がおよそ 40 分から 10 分に短縮。



## 適用対象
### 技術
数百万行のコードで構成されたモノリシックなETL (Extract, Transform, Load) システムのリファクタリング。

8年前に構築された古いシステム。

具体的な技術要素としては、データクラスの実装、インポート処理、複数の繊細なリファクタリング手順、エッジケースへの対応などが挙げられる。

Devinは、移行の機械的なコンポーネントで再利用可能な古典的なツールとスクリプトを独自に構築した。例として、ファイルパスに基づいてデータクラスの国別の拡張子（「br」、「co」、「mx」）を検出するスクリプトを自動化した。

微調整により、Devinのタスク完了スコアが2倍になり、タスク速度も4倍向上した。微調整には、エンジニアが手作業で行った以前の移行例が用いられた。

### 規模
100,000 のデータ クラスの実装を移行する大規模なプロジェクト。

1,000 人を超えるエンジニアが手作業で行うと 18 か月を要する予定だった作業。

Nubank は、ブラジル、メキシコ、コロンビアで 1 億 1,000 万人以上の顧客にサービスを提供しているラテンアメリカ最大の金融テクノロジー銀行。

特に、データ、コレクション、リスクの各ビジネス ユニットで効果が検証され、数週間で移行が完了した。

## その他ポイント
Devinの導入により、エンジニアは移行作業から解放され、より価値の高い業務に集中できるようになった。

Devinは、類似のタスクを学習することで、時間経過とともに速度と信頼性が向上する。

人間のエンジニアは、Devinの変更を確認し、小さな調整を行い、プルリクエストをマージする役割を担う。

この事例は、大規模なコード移行やリファクタリングタスクにおいて、AIエージェントが効率とコスト削減に大きく貢献できる可能性を示唆している。



## 自分の不明点や気付き

- スクラッチで作られたETLのイメージがつきづらい。情報系だろうか？

- 「100,000のデータクラス」にかんして、もしかしたらボイラーコードだらけみたいなイメージで、処理構造自体は単純ではないだろうか？

- 変換ルール自体のチューニングは、エンジニアが手作業で行った以前の移行例を使ったと本文にある。どのくらいの量の例が必要になったのだろうか？どのくらい固有性のあるものなのだろうか？
Arduino IDEで簡単に始めるSeeedStudio製 Wio BG770A のはじめの一歩

# はじめに

https://soracom.jp/store/30926/

Wio BG770Aは、Seeed株式会社が開発したLTE-M・NB-IoTのセルラー通信に対応したボードです。Quectel社のBG770A-GLが搭載していて、さまざまな通信に使用できそうですし、ボード上に4つのGroveコネクタが実装されているので、いろいろ試すことができます。

# 使用するデバイス
- Wio BG770A v1.0

https://soracom.jp/store/30926/



# 開発環境：Arduino IDE

Arduino IDEを使って開発することが出来ます。
ドキュメントも整備されているので、以下のサイトを参考にすれば着々と進みます。

https://seeedjp.github.io/Wiki/Wio_BG770A/user-manual

私の場合は、既にArduinoIDEがインストールされている環境でのスタートでしたが、ドキュメントを見ながら、ボード／ライブラリを追加することで簡単に環境構築ができました。


# まずはLED点滅のサンプルスケッチ！

まずはLED点滅スケッチから始めます！
一番シンプルなサンプルスケッチを試すことで、「開発環境が正しく構築出来ているか」「ボードが正しく動作していて書き込みできるか」を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/fa18baa1-bb74-404c-a114-c33dd37bcf62.png)

このサンプルスケッチが動作したら、まずは安心。このまま開発を進められます。ボードの真ん中付近にある青色のLEDが点滅するので確認してみてください！

サンプルスケッチのソースコードはこちらです。

https://github.com/SeeedJP/wio_cellular/tree/main/examples/basic/blink

# サンプルスケッチ一覧
いろいろなサンプルスケッチが用意されているので、どんどん試すことができます。
興味があるところから動かしてみることで、どんどん理解も深まっていくと思います。

https://seeedjp.github.io/Wiki/Wio_BG770A/examples.html


<br>
開発環境がちゃんと構築されているのは確認できたので、次は、せっかくなので、セルラー通信を試してみようと思います。



# 参考リンク

https://seeedjp.github.io/Wiki/Wio_BG770A/home.html

https://qiita.com/yukima77/items/45793e72b2347ecbb18b
windows11で、sketchup6 その26

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
バネを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1a89f41f-d14f-4f08-817b-050a8b94b7af.png)

# サンプルコード

```

require 'sketchup.rb'

def spring
	turns = 5
	height = 12.0
	r = 12.0
	wireRadius = 1
	verticesPerTurn = 24
	circleRes = 24
	prompts = ["Turns", "Spring Height", "Spring Radius", "Wire Radius", "Segs/Turn", "Circle Segs"]
	values = [4, 1.feet, 1.feet, 1.inch, 24, 24]
	results = inputbox prompts, values, "Spring Dimensions"
	return if not results
	turns, height, r, wireRadius, verticesPerTurn, circleRes = results
	pts = Array.new
	model = Sketchup.active_model
	0.upto(verticesPerTurn * turns) do |i|
		af = (i % verticesPerTurn) / (verticesPerTurn * 1.0)
		angle = af * 6.283185307
		x = r * Math.cos(angle)
		y = r * Math.sin(angle)
		z = height * ( i / (verticesPerTurn * turns * 1.0))
		pts[i] = [x, y, z]
	end
	spring = model.entities.add_curve(pts)
	v = Geom::Vector3d.new(pts[1].x - r, pts[1].y, pts[1].z)
	circleEdges = model.entities.add_circle pts[0], v, wireRadius, circleRes
	base = model.entities.add_face(circleEdges)
	base.reverse!
	base.followme(spring)
end




```

以上。
【Google Cloud】2週間でPCAを取得する

# はじめに
Google Cloudの勉強を始めてから2週間でGoogle Cloud PCAを取得したため、振り返り。
- 3/16(日) 学習開始
- 3/29(土) PCA受験(テストセンター)

# 前提
- AWS資格15冠
- AWS実務経験あり
- Google Cloudは使用経験なし

# 試験対策
合格体験記参照 → 知識インプット → 問題集を解くというやり方で進めました。

## 情報収集
他の方の合格体験記を参照。
試験の傾向や合格者の使用教材の情報を集める。
- [GCP PCA合格記(2023/2/3投稿)](https://qiita.com/handy-dd18/items/4e2d60db1f68a1f5c5d7)
- [GCP PCA合格体験記](https://qiita.com/num-bx77/items/9a6b84fb2ffe24573397)
- [AWSエンジニアによるGoogleCloud PCA合格体験記2025](https://zenn.dev/kubo_gene/articles/7bf2a6021e9108)

## インプット
### 公式ドキュメント
- [AWS サービスや Azure サービスと Google Cloud を比較する](https://cloud.google.com/docs/get-started/aws-azure-gcp-service-comparison?hl=ja)
Google Cloudのサービスを理解するにあたってAWSで提供されているサービスと比較できないか調べていたところ、こちらの公式ドキュメントにたどり着きました。

### ブログ記事
- [for Google Cloud PCA](https://zenn.dev/kept1994/scraps/7215c41bbb7c75)
こちらの記事ではGoogle Cloudの各サービスについての概要やポイントがわかりやすくまとめられており、非常に参考になりました。
筆者の方ありがとうございます。

## アウトプット
他の方の合格体験記を参考に以下の問題集を使用しました。

- [公式模擬問題](https://cloud.google.com/learn/certification/cloud-architect)
- [【最短攻略】Google Cloud 認定 Professional Cloud Architect 模擬問題集](https://www.udemy.com/course/google-cloud-professional-cloud-architect-i/?utm_source=adwords&utm_medium=udemyads&utm_campaign=Search_DSA_GammaCatchall_NonP_la.JA_cc.JP&campaigntype=Search&portfolio=Japan&language=JA&product=Course&test=&audience=DSA&topic=&priority=Gamma&utm_content=deal4584&utm_term=_._ag_167497670358_._ad_711539479846_._kw__._de_c_._dm__._pl__._ti_dsa-1456167871416_._li_1009252_._pd__._&matchtype=&gad_source=1&gclid=EAIaIQobChMIrdmXvvGsjAMVX1wPAh21vTyjEAAYASAAEgI_DfD_BwE&couponCode=CM240325) 
こちらは問題集①~④を2周し、間違えた問題は解説や公式ドキュメントを読み直すなどして復習しました。<br>一部情報が古いため要注意。

# 試験結果
合格できました。
正直なところ、AWS SAPと比較してかなり余裕でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1086543/8183e78a-a7a3-4eca-a39c-61109d895cd0.png)

# おわりに
Google CloudのサービスとAWSのサービスを比較しながら勉強を進めることで思っていたよりも内容がすんなり入ってきました。
他のGoogle Cloud資格も徐々に取得を進めていきたいと思います。
個人的備忘録：RedisとMemcachedにハマったので、自分用のメモ書きとしてアウトプットしてみた

## はじめに
Webアプリケーションや大規模サービスを開発・運用していく中で、パフォーマンスを最適化するためのキャッシュ戦略はとても重要です。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

特にRedisやMemcachedといったインメモリ型のデータストアは、その代表格として多くの現場で利用されています。

---

## Redisとは
Redis（Remote Dictionary Server）は、分散型のインメモリ・キー／バリュー型データストアであり、以下のような特徴を持ちます。

- 開発言語：最初はTcl、後にC言語で再実装
- データ構造：文字列、リスト、セット、ハッシュ、ソート済みセット などをサポート
- ユースケース：
  - セッション管理
  - ジョブキュー（例：Sidekiq）
  - リアルタイムランキング
  - Pub/Sub メッセージング
  - 永続化付きキャッシュ
- 永続化機能：スナップショット（RDB）やAOF（Append Only File）で対応可能
- 使用例：Twitter、GitHub、Stack Overflow、Snapchatなど

**参考文献**

https://qiita.com/keinko/items/60c844bcf329bd3f4af8

---

## Memcachedとは
Memcachedもまた、分散型のインメモリ・キー／バリュー型データストアであり、以下のような特徴を持ちます。

- 開発言語：最初はPerl、後にC言語で再実装
- 特徴：非常にシンプルで高速なキャッシュ専用システム
- サポートデータ型：基本的に文字列のみ
- ユースケース：
  - Webページキャッシュ
  - データベースクエリ結果のキャッシュ
  - 一時的なセッション情報
- 永続化機能：なし（あくまで一時的なキャッシュ）
- 使用例：Facebook、YouTube、Shopify、Pinterestなど

**参考文献**

https://qiita.com/juve_534/items/54f7732641a406f31b55

---

## RedisとMemcachedの主な違い

| 特徴             | Redis                          | Memcached                      |
|------------------|-------------------------------|--------------------------------|
| 永続化           | あり（RDB/AOF）                | なし                           |
| データ型         | 複数（リスト、セット等）        | 文字列のみ                     |
| パフォーマンス   | 書き込みにも強い                | 読み取り特化                   |
| 機能性           | Pub/Sub、トランザクション等     | シンプルなキャッシュ機能に特化 |
| メモリ管理       | より柔軟（LRU制御など）         | 固定サイズでのLRU             |

---

## まとめ
RedisとMemcachedはどちらも高速なキャッシュシステムとして非常に優れていますが、用途や要件によって選び方が変わってきます。

- 一時的な読み取りキャッシュだけならMemcached
- 構造化データや永続化、Pub/Subなども活用したいならRedis

今後のプロジェクトでどちらを使うか検討する際の参考になればと思い、こうして整理しておきました。**必要があれば、実際の設定例やDocker環境での構築方法も追記していきます！**

## **参考文献**

https://zenn.dev/marshmallon/articles/27e279e41a98d6

https://www.sunnycloud.jp/column/20210428-01/

https://aws.amazon.com/jp/elasticache/redis-vs-memcached/
個人的備忘録：インフラ初心者必見！ミドルウェアの種類と役割を簡単にまとめてみた

## はじめに

システムインフラを構成するうえで欠かせない存在となっているのが「ミドルウェア」です。

:::note info
**OSとアプリケーションの中間に位置し、様々な機能を提供することで、開発や運用の効率化を支えています。**
:::

この記事では、インフラ領域でよく使われるミドルウェアの種類をカテゴリごとに紹介します。

---

## 1. Webサーバ
WebブラウザなどのクライアントからのHTTPリクエストを受け取り、静的コンテンツやアプリケーションサーバとの連携を通してレスポンスを返す役割を担います。

### 代表例
- Apache HTTP Server
- Nginx
- Microsoft IIS

---

## 2. アプリケーションサーバ
Webサーバと連携し、アプリケーションのビジネスロジックを処理するミドルウェアです。主にJavaアプリケーションの実行環境として使われます。

### 代表例
- Tomcat
- JBoss / WildFly
- WebLogic
- GlassFish

---

## 3. データベース管理システム（DBMS）
構造化データを保存・取得・管理するためのミドルウェアです。アプリケーションと連携して、データを効率よく扱えるようにします。

### 代表例
- MySQL / MariaDB
- PostgreSQL
- Oracle Database
- SQL Server
- MongoDB（NoSQL）

---

## 4. メッセージングミドルウェア
複数のシステム間で非同期通信を可能にし、キューイングやストリーミング処理を行います。マイクロサービス構成などで活用されます。

### 代表例
- RabbitMQ
- Apache Kafka
- ActiveMQ
- Amazon SQS

---

## 5. 認証・認可系ミドルウェア
ユーザー認証やアクセス制御を担い、セキュリティを強化するための基盤を提供します。

### 代表例
- OpenLDAP
- Keycloak
- Auth0
- Shibboleth

---

## 6. キャッシュサーバ
データベースへのアクセス頻度を減らし、レスポンス速度を向上させるためのキャッシュ機能を提供します。

### 代表例
- Redis
- Memcached

---

## 7. 監視・ロギング系
システムの状態を可視化し、異常をいち早く検知するための仕組みを提供します。また、ログを収集・分析することで、トラブルシューティングやセキュリティ対応にも役立ちます。

### 代表例
- Prometheus + Grafana
- Zabbix
- Datadog
- Elasticsearch / Logstash / Kibana（ELK Stack）

---

## 8. リバースプロキシ / ロードバランサ
トラフィックを複数のサーバに分散し、システムの可用性とスケーラビリティを向上させるためのミドルウェアです。

### 代表例
- HAProxy
- Nginx
- AWS ALB / ELB

---

## 9. コンテナオーケストレーション
コンテナベースのアプリケーションを効率よく管理・スケーリングするためのミドルウェアです。

### 代表例
- Kubernetes
- Docker Swarm
- Amazon ECS

---

## おわりに
インフラ領域におけるミドルウェアは、システムの安定稼働や運用効率に大きな影響を与える重要な要素です。

:::note warn
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

プロジェクトの目的や構成に応じて適切なミドルウェアを選定し、導入することが成功への鍵となると思っています！
個人用備忘録：Microsoft IISでハマったので、未来の自分へのメモとしてアウトプットしてみた

## はじめに
Microsoft IIS（Internet Information Services）は、Windows Serverで提供されるWebサーバー機能です。

:::note warn
**GUIによる管理のしやすさとWindowsとの親和性が高く、.NETアプリケーションや社内向けのWebシステムで広く使われています。**
:::

ここでは、自分用にIISの基本設定や運用時のポイントをまとめておきます。

---

## 書こうと思ったきっかけ
自宅のWindowsサーバー上でWebアプリケーションをホストする必要があり、IISの設定を行う機会がありました。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

GUI中心の設定に戸惑うこともあり、毎回手順を検索する手間を省くため、備忘録として記録しておくことにしました。

---

## IISの基本機能
- 静的・動的コンテンツ（ASP.NET、PHPなど）の配信
- Webサイトのホスト（複数サイトのバインド設定）
- SSL/TLSの設定とHTTPS対応
- Windows認証や基本認証によるアクセス制御
- ログ記録とアナライザーとの連携

**参考文献**

https://www.kagoya.jp/howto/it-glossary/server/iis/

---

## よく使う操作（GUI中心）
- **IISマネージャーの起動**：Windowsの「管理ツール」から「IISマネージャー」を起動
- **Webサイトの追加**：IISマネージャー → サーバー名 → 右クリックで「Webサイトの追加」
- **アプリケーションプールの管理**：アプリごとにプールを分けて設定可能
- **HTTPSの設定**：証明書のインポート後、「バインドの編集」でポート443を追加

---

## 基本的な設定ファイル（参考）
- `applicationHost.config`：IIS全体の構成設定（`C:\Windows\System32\inetsrv\config`）
- `web.config`：個別サイトやアプリごとの設定ファイル（アプリケーションルートに設置）

**参考文献**

https://learn.microsoft.com/ja-jp/iis/get-started/planning-your-iis-architecture/introduction-to-applicationhostconfig

## サンプル web.config 設定（URL書き換え）
```xml
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Redirect to www">
          <match url=".*" />
          <conditions>
            <add input="{HTTP_HOST}" pattern="^example\.com$" />
          </conditions>
          <action type="Redirect" url="http://www.example.com/{R:1}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>
```

**参考文献**

https://learn.microsoft.com/ja-jp/aspnet/core/host-and-deploy/iis/web-config?view=aspnetcore-9.0

---

## ログ確認の場所
- IISログの出力先：`C:\inetpub\logs\LogFiles`（サイトごとにフォルダが分かれる）
- Windowsイベントログ：`イベント ビューアー → Windows ログ → アプリケーション`

---

## まとめ
Microsoft IISは、Windows環境において非常に便利なWebサーバーです。GUIで直感的に操作できる一方で、細かい構成をするにはweb.configやIISの内部設定ファイルの理解も必要になります。

今後は、リバースプロキシ設定、負荷分散（ARR）、セキュリティ強化などにも取り組み、より高度なIIS運用ができるようにしていきたいと思います！
個人用備忘録：Apacheでハマったので、未来の自分へのメモとしてアウトプットしてみた

## はじめに
Apache HTTP Server（通称：Apache）は、最も広く使われているオープンソースのWebサーバーの一つです。

:::note warn
**動的コンテンツから静的ファイルの配信、モジュールによる拡張性まで、幅広く対応できるのが特徴です。**
:::

ここでは、自分用の設定メモや使い方のポイントをまとめておきます。

---

## 書こうと思ったきっかけ
開発したWebアプリを社内サーバー上に簡単に公開するためにApacheを使う機会があり、設定のたびに毎回ドキュメントを探すのが手間だったため、基本的な構成や操作方法を備忘録として整理しました。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

---

## Apacheの基本機能
- Webサーバーとして静的・動的コンテンツを配信
- モジュールを使った柔軟な拡張（PHP, CGIなど）
- バーチャルホストによる複数サイトの運用
- アクセス制御、認証、HTTPS対応
- ログ出力やリバースプロキシ機能もサポート

---

## よく使うコマンド
```bash
# サーバーの起動・停止・再起動
sudo systemctl start httpd
sudo systemctl stop httpd
sudo systemctl restart httpd

# 設定ファイルの文法チェック
sudo apachectl configtest

# ログの確認
sudo tail -f /var/log/httpd/access_log
sudo tail -f /var/log/httpd/error_log
```

**参考文献**

https://qiita.com/bezeklik/items/990bed2e7e529584fa57

---

## 基本的な構成ファイル
- `/etc/httpd/conf/httpd.conf`：メイン設定ファイル
- `/etc/httpd/conf.d/`：追加の設定ファイル格納場所
- `/var/www/html/`：デフォルトのドキュメントルート

## サンプル設定（静的ファイル配信）
```conf
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /var/log/httpd/example.com_error.log
    CustomLog /var/log/httpd/example.com_access.log combined
</VirtualHost>
```

**参考文献**

https://qiita.com/100/items/ab31e57fcc66ac661d5c

---

## リバースプロキシ設定の例（mod_proxy使用）
```conf
<VirtualHost *:80>
    ServerName app.example.com

    ProxyPreserveHost On
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/

    ErrorLog /var/log/httpd/app_error.log
    CustomLog /var/log/httpd/app_access.log combined
</VirtualHost>
```

**参考文献**

https://dev.classmethod.jp/articles/introduction_mod_proxy/

---

## まとめ
Apacheは長年使われてきた信頼性の高いWebサーバーであり、柔軟な設定やモジュールによって多様な用途に対応できます。**ローカルでの開発環境から本番公開まで、用途に応じた設定パターンを覚えておくことで、運用の効率が大きく向上します。**

今後は、HTTPS対応（Let's Encrypt）、パフォーマンスチューニング、アクセスログ解析などにも取り組んでいきたいと考えています。
windows11で、sketchup6 その25

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
geomテストを書け。


# 写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a98421da-0e77-4453-9d43-a5cd27f3027c.png)

# 

```

require 'sketchup.rb'

def closestPointsGeomTest
	line1 = [Geom::Point3d.new(0, 0, 0), Geom::Vector3d.new(0, 0, 1)]
	line2 = [Geom::Point3d.new(0, 0, 0), Geom::Vector3d.new(0, 0, 100)]
	pts = Geom.closest_points line1, line2
	if (pts)
		UI.messagebox pts
	else
		UI.messagebox "Failure"
	end
end

def fitPlaneToPointsGeomTest
	point1 = Geom::Point3d.new 0, 0, 0
	point2 = Geom::Point3d.new 10, 10, 10
	point3 = Geom::Point3d.new 25, 25, 25
	begin
		plane = Geom.fit_plane_to_points point1, point2, point3
	rescue
		UI.messagebox $!.message
	end
	if (plane)
		UI.messagebox plane
	else
		UI.messagebox "Failure"
	end
end

def intersectLineLineGeomTest
	line1 = [Geom::Point3d.new(10, 0, 0), Geom::Vector3d.new(1, 1, 0)]
	line2 = [Geom::Point3d.new(0, 10, 0), Geom::Point3d.new(20, 10, 0)]
	pt = Geom.intersect_line_line line1, line2
	if (pt)
		UI.messagebox pt
	else
		UI.messagebox "Failure"
	end
end

def intersectLinePlaneGeomTest 
	plane1 = [Geom::Point3d.new(-10, 0 , 0), Geom::Vector3d.new(1, 0, 0)]
	line1 = [Geom::Point3d.new(-10, 0, 0), Geom::Vector3d.new(1, 0, 0)]
	pt = Geom.intersect_line_plane(line1, plane1)
	if (pt)
		UI.messagebox pt
	else
		UI.messagebox "Failure"
	end
end

def intersectPlanePlaneGeomTest 
	plane1 = [Geom::Point3d.new(-10, 0 ,0), Geom::Vector3d.new(1, 0, 0)]
	plane2 = [Geom::Point3d.new(0, -10, 0), Geom::Vector3d.new(0, 1, 0)]
	line = Geom.intersect_plane_plane(plane1, plane2)
	if (line)
		UI.messagebox line
	else
		UI.messagebox "Failure"
	end
end

def linearCombinationGeomTest
	point1 = Geom::Point3d.new 1, 1, 1
	point2 = Geom::Point3d.new 10, 10, 10
	point = Geom.linear_combination 0.25, point1, 0.75, point2
	if (point)
		UI.messagebox point
	else
		UI.messagebox "Failure"
	end
end

def pointToPolygon2DTest
	point = Geom::Point3d.new(5, 0, 10)
	triangle = []
	triangle << Geom::Point3d.new(0, 0, 0)
	triangle << Geom::Point3d.new(10, 0, 0)
	triangle << Geom::Point3d.new(0, 10, 0)
	hits_on_border_count = true
	status = Geom.point_in_polygon_2D(point, triangle, hits_on_border_count)
	if (status)
		UI.messagebox status
	else
		UI.messagebox "Failure"
	end
end




```
個人用備忘録：NGINXでハマったので、未来の自分へのメモとしてアウトプットしてみた

## はじめに
NGINXは、高速・軽量なWebサーバーおよびリバースプロキシとして広く利用されているソフトウェアです。Webサービスの公開やロードバランシング、静的ファイル配信など、多様な用途で活躍します。

ここでは、自分用の設定メモや使い方のポイントをまとめておきます。

---

## 書こうと思ったきっかけ
ローカルで開発した静的Webサイトを公開したり、Docker上のアプリをリバースプロキシ経由で外部に見せたりする場面がありました。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

毎回設定を調べ直すのが非効率に感じたため、基本的な設定や操作方法を備忘録として整理しました。

---

## NGINXの基本機能
- Webサーバー（静的コンテンツの配信）
- リバースプロキシ（バックエンドアプリケーションへのルーティング）
- ロードバランサー（複数のアプリへの負荷分散）
- HTTPS対応（Let's EncryptなどによるSSL化）
- URLリライトやアクセス制御などの柔軟な設定

---

## よく使うコマンド
```bash
# サーバーの起動・停止・再起動
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx

# 設定ファイルの文法チェック
sudo nginx -t

# ログの確認
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
```

**参考文献**

https://qiita.com/katzueno/items/44e02db2f1bfa0de5860

---

## 基本的な構成ファイル
- `/etc/nginx/nginx.conf`：メイン設定ファイル
- `/etc/nginx/sites-available/`：仮想ホストの設定
- `/etc/nginx/sites-enabled/`：有効化された設定ファイルのリンク

## サンプル設定（静的ファイル配信）
```conf
server {
    listen 80;
    server_name example.com;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
```

**参考文献**

https://qiita.com/ponponnsan/items/23e1aa6f7dd4eadde5df

---

## リバースプロキシ設定の例
```conf
server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

**参考文献**

https://zenn.dev/teasy/articles/nginx-reverse-proxy

---

## まとめ
NGINXはシンプルながらも非常に高機能なWebサーバーです。ローカル開発から本番公開、SSL対応、Docker連携まで幅広く活用できるため、基本的な設定パターンを身につけておくと大変便利です。

今後は、Let's EncryptでのHTTPS化やキャッシュ設定、アクセスログの分析なども取り入れて、より実践的な運用につなげていきたいと考えています！
jq風のJSONクエリをPerlで！純Perl製モジュール「JQ::Lite」紹介


---


PerlでJSONを扱う際に、**jqのようにスマートにデータを抽出・整形できたらいいな**と思ったことはありませんか？

そこで、jqライクな文法でJSONを操作できる軽量モジュール  
👉 [`JQ::Lite`](https://metacpan.org/pod/JQ::Lite) を作成＆CPANに公開しました。

---

## 🔧 JQ::Liteとは？

[`JQ::Lite`](https://github.com/kawamurashingo/JQ-Lite) は、Perl上で jq のような記述でJSONデータを処理できる**純Perl製のモジュール**です。

### 特徴

- ✅ **Pure Perl**（XS・外部バイナリ不要）
- ✅ ドット記法 (`.users[].name`)
- ✅ オプショナルアクセス (`.nickname?`)
- ✅ 配列インデックスや展開 (`.users[0]`, `.users[]`)
- ✅ `select(...)` による絞り込み（比較演算・論理演算対応）
- ✅ 組み込み関数多数：`length`, `keys`, `first`, `last`, `reverse`, `sort`, `unique`, `has`
- ✅ CLI対応：`jq-lite` コマンドで `stdin` やファイルからも使える

---

## 📦 インストール方法

```sh
git clone https://github.com/kawamurashingo/JQ-Lite.git
cd JQ-Lite
perl Makefile.PL
make
make test
make install
```

CPANから直接：

```sh
cpanm JQ::Lite
```

---

## 🐪 Perlモジュールとして使う場合

```perl
use JQ::Lite;

my $json = '{"users":[{"name":"Alice"},{"name":"Bob"}]}';
my $jq = JQ::Lite->new;
my @names = $jq->run_query($json, '.users[].name');

print join("\n", @names), "\n";
```

---

## 💻 CLIツールとして使う場合

```bash
cat users.json | jq-lite '.users[].name'
jq-lite '.users[] | select(.age > 25)' users.json
jq-lite -r '.users[].name' users.json
```

> ※ `jq-lite` という名前は本家 `jq` と競合しないようにしています。

---

## 🧪 JSON例とクエリ例

### 入力（`users.json`）

```json
{
  "users": [
    {
      "name": "Alice",
      "age": 30,
      "profile": {
        "active": true,
        "country": "US"
      }
    },
    {
      "name": "Bob",
      "age": 25,
      "profile": {
        "active": false,
        "country": "JP"
      }
    }
  ]
}
```

### クエリ例

| クエリ | 説明 |
|-------|------|
| `.users[].name` | 全ユーザーの名前を抽出 |
| `.users | length` | ユーザー数 |
| `.users[0] | keys` | 最初のユーザーのキー一覧 |
| `.users[].nickname?` | nicknameがあれば取得（なければスキップ） |
| `.users[] \| select(.age > 25)` | 年齢が25より上のユーザー |
| `.users[] \| select(.profile.active == true) \| .name` | activeなユーザーの名前 |

---

## 🤔 どう使い分ける？

| やりたいこと | ツール |
|--------------|--------|
| JSONのシンプルなデコード | `JSON::PP` |
| Bashなどでの高度なJSON処理 | `jq` |
| Perlの中でjqっぽく書きたい | **`JQ::Lite`** |
| 軽量＆移植性重視でCLIにも使いたい | **`JQ::Lite`** |

---

## 🔗 関連リンク

- 🐫 CPAN: [JQ::Lite](https://metacpan.org/pod/JQ::Lite)  
- 🐙 GitHub: [https://github.com/kawamurashingo/JQ-Lite](https://github.com/kawamurashingo/JQ-Lite)

---

## 👋 最後に

Perlの中でも **軽快にjq風のクエリを扱いたい** というニーズに応えるモジュールです。  
フィルタやソート、配列処理などがスッキリ書けて、ワンライナー的にも使いやすいはずです。

ぜひ使ってみて、**不具合や要望などあればGitHubのIssueで教えてください！**  
Starもいただけると励みになります⭐
pod install で Error running pod install が出たとき

Flutter で開発をしています。ios の実機で pod 関連のエラーが出たときの対処法です。

## Error running pod install

running pod install と出たら Flutter プロジェクトの ios フォルダに移動して以下のコマンドを試してください。

```
cd ios
sudo gem install cocoapods
pod repo update
pod update
```

## RunnerTests がないと言われる

実行しようとしたら RunnerTests がないと言われます。xcode のプロジェクトをみると存在しているのです。ios/Podfile で削除したら実行できました。

ios/Podfile
```
...

target'Runner'do
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_podsFile.dirname(File.realpath(__FILE__))
  #target'RunnerTests'do    ←削除
    #inherit!:search_paths  ←削除
  #end                      ←削除
end
```

## あとがき

もっとまとめようとしましたが力尽きました。
CompoundBarcodeViewでコード読み取り

CompoundBarcodeViewででバーコードやQRコードを読み取る方法をメモします。

```xml
<com.journeyapps.barcodescanner.CompoundBarcodeView
    android:id="@+id/barcodeView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

```

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val cameraSettings = CameraSettings().apply {
    requestedCameraId = 0 // 0 = 背面カメラ, 1 = フロントカメラ
    isAutoFocusEnabled = true // オートフォーカスを有効
    isScanInverted = true // 明るいバーコードをスキャンしやすくする（例：白地に黒バーコード）
    }

    barcodeView.decodeSingle { result ->
        runOnUiThread {
            Toast.makeText(this, result.text, Toast.LENGTH_SHORT).show()
        }
    }
}

override fun onResume() {
    super.onResume()
    // 読取開始
    barcodeView.resume()
}

override fun onPause() {
    super.onPause()
    // 読取停止
    barcodeView.pause()
}
```

最初にXMLでCompoundBarcodeViewを使用します。match_parentにすると画面いっぱいにカメラビューが広がります。
CameraSettings() を使うと細かくカスタマイズでできます。他にも暗い場所でフラッシュ自動ONか、露出補正を有効にするか、連続フォーカスを有効にするかなどあります。
読取後の処理はシンプルに書きたいなら`decodeSingle { result -> ... }`にて行います。
エラー処理など複雑な処理を行いたい場合は、下記のオブジェクト式`decodeSingle(object : BarcodeCallback { ... })`を使用します。
```kotlin
barcodeView.decodeSingle(object : BarcodeCallback {
    override fun barcodeResult(barcodeResult: BarcodeResult) {
        runOnUiThread {
            if (barcodeResult.text.isNullOrEmpty()) {
                Toast.makeText(this@MainActivity, "QRコードが読み取れませんでした", Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this@MainActivity, "barcodeResult.text", Toast.LENGTH_SHORT).show()
            }
        }
    }

    override fun possibleResultPoints(resultPoints: MutableList<ResultPoint>?) {
        // 読み取りの補助情報が取れる
    }
})
```

#### 参考

https://psytousan.hatenablog.com/entry/android/ZXing
Todoアプリ完成！

#### 目標にしていた「入社までになにかアプリを完成させること」を達成しました。
　言語はjavaでサーブレット、JSP、Mysqlを使って作りました。
やりきった感想は、正直かなりchatGPT頼りで進めていったので力がついている実感はあまり湧きません。コードの意味や、どのように処理が進んでいくかは理解できているので、一年前に挑戦した時よりは成長を感じています。

　画面設計だけやってみて、いざ開発しようとすると何していいかわからなくて困りました。ですが、一つの機能ごとに自分が分かる場所を進めていくと違う景色がどんどん見えてきていつのまにか進んでいるという感じでした。

 　新鮮な気持ちだったのは、エラーが出ることをそんなに怖がらなかったことです。やはり処理がどのように動いているかを理解していることで、エラーにちゃんと向き合えて解決できたのだと思います。（大体ChatGPTに投げてますが、、、）

  　初のデータベース連携や、画面遷移がうまくいかなかったりいろいろ苦戦しましたが、なんだかんだ一番苦労したことは環境構築でした。
   Eclipseでtomcatが起動しなくて、その原因がエラーログに表示されないという状況が一週間続いて心が折れそうでした。原因はpleiadesフォルダ内のTomcatが破損していて、手動でインストールしたTomcatを配置すると解決しました。ここで挫折せず粘り切った自分を褒めてあげたいです。
   　
    　入社までにいろいろ勉強する予定だったことは全然終わらなかったですが、一番の目標であったアプリ開発を達成できて嬉しいです。入社後の研修で少しでも頑張りを褒められたいという密かな思いを胸にこれからのエンジニアライフ頑張っていきたいと思います。