OmniAICreator/Qiita-1.07M huggingface dataset:
macosでGhosttyを使ってみる

quick terminalの表示はできるが、iTermと異なり、windowをグローバルなhot keyで呼び出す機能は現状なさそう。  
また、リモートでbyobu使おうとした際に詰まったが、解決した。
~~"ます"が"〼"と表示される問題が依然として残っている。~~
→2024/12/28 解決
## 導入
公式: https://ghostty.org/docs/install/binary  
によると、brewが使えるらしい
```zsh
brew install ghostty 
```

## 設定
command + , もしくはメニューバー>Ghostty>Settings... で開くことができる。
自分はターミナルアプリを使う際はfullscreenなので、以下のようにした。
```config
theme = Everblush
font-family = Monaco
font-size = 14
macos-titlebar-style = hidden
fullscreen = true
macos-non-native-fullscreen = true
background-opacity = 0.9

# quick-terminal周り
quick-terminal-position = "top"
quick-terminal-screen = "main"
quick-terminal-animation-duration = 0

keybind = global:ctrl+option+space=toggle_quick_terminal
```  
themeについては
```zsh
ghostty +list-themes
```
で色々試せるので、お好きなものを選ぶと良いです。

## byobuについて
リモート先で```byobu```したら
```
missing or unsuitable terminal: xterm-ghostty
```
と怒られてしまった。  
なんだかよくわからないが[reddit](https://www.reddit.com/r/linux/comments/1hmxpg1/ghostty_terminal_is_out/)を見ると
```
ssh -o SetEnv='TERM=xterm' [リモートホスト名]
```
のようにすると解決するらしい。
尚、```~/.ssh/config```での記載は以下のように1行足す。
```config
Host ホスト名
    (略)
    SetEnv TERM=xterm
```

## 表示バグ??
iTermでは正常に日本語が表示されるが、画面中の"ます"がなぜか自動で"〼"に置き換えられて表示される。

なぜ…
→フォントを合字のあるものに変えると、dlig (任意の合字; Discretionary Ligatures)が自動で有効になるからっぽい
```config
font-feature = -dlig
```
こちらの追加で解決


## 感想
itermは確かに遅いが便利なので、まだ乗り換えないかな…
ilasmでstack machine その63

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
AtCoderを解け。
500円玉、100円玉、50円玉を使ってXX円を支払う方法が何通りあるかを求める。


# サンプルコード

```

.assembly AtCoder {}
.method public static void Main() {
	.entrypoint
	.locals init ([0] int32 A, [1] int32 B, [2] int32 C, [3] int32 X, [4] int32 a, [5] int32 i, [6] int32 j, [7] int32 k, [8] bool, [9] bool, [10] bool, [11] bool)
	call  string  [System.Console]System.Console::ReadLine()
	call  int32  [System.Runtime]System.Int32::Parse(string)
	stloc.0
	call  string  [System.Console]System.Console::ReadLine()
	call  int32  [System.Runtime]System.Int32::Parse(string)
	stloc.1
	call  string  [System.Console]System.Console::ReadLine()
	call  int32  [System.Runtime]System.Int32::Parse(string)
	stloc.2
	call  string  [System.Console]System.Console::ReadLine()
	call  int32  [System.Runtime]System.Int32::Parse(string)
	stloc.3
	ldc.i4.0
	stloc.s  4
	ldc.i4.0
	stloc.s  5
	br.s  IL_0098
IL_0035:
	ldc.i4.0
	stloc.s  6
	br.s  IL_0083
IL_003b:
	ldc.i4.0
	stloc.s  7
	br.s  IL_006e
IL_0041:
	ldc.i4  500
	ldloc.s  5
	mul
	ldc.i4.s  100
	ldloc.s  6
	mul
	add
	ldc.i4.s  50
	ldloc.s  7
	mul
	add
	ldloc.3
	ceq
	stloc.s  8
	ldloc.s  8
	brfalse.s  IL_0067
	ldloc.s  4
	ldc.i4.1
	add
	stloc.s  4
IL_0067:
	ldloc.s  7
	ldc.i4.1
	add
	stloc.s  7
IL_006e:
	ldloc.s  7
	ldloc.2
	cgt
	ldc.i4.0
	ceq
	stloc.s  9
	ldloc.s  9
	brtrue.s  IL_0041
	ldloc.s  6
	ldc.i4.1
	add
	stloc.s  6
IL_0083:
	ldloc.s  6
	ldloc.1
	cgt
	ldc.i4.0
	ceq
	stloc.s  10
	ldloc.s  10
	brtrue.s  IL_003b
	ldloc.s  5
	ldc.i4.1
	add
	stloc.s  5
IL_0098:
	ldloc.s  5
	ldloc.0
	cgt
	ldc.i4.0
	ceq
	stloc.s  11
	ldloc.s  11
	brtrue.s  IL_0035
	ldloc.s  4
	call  void  [System.Console]System.Console::WriteLine(int32)
	ret
}





```

# 実行結果

```
>at4
2
2
2
100
2

```


以上。
Cursorプログラミング１日目

# 今日やった操作（ターミナル）

1.新しいディレクトリの作成:
```
mkdir flask_docker_app
```
2.ディレクトリの移動:
```
cd flask_docker_app
```
3.新しいファイルの作成:
```
touch app.py
touch requirements.txt
```
4.Dockerイメージのビルド:
```
docker build --no-cache -t flask_docker_app .
```
5.Dockerコンテナの実行:
```
docker run -p 5000:5000 flask_docker_app
```
ここでエラーが起きる・・
app.py１行目のimport flaskがうまくいってない。
pip コマンドでのインストールがうまくいっていないのでは？
確認するためのコマンド

6.Dockerコンテナの起動:
```
 docker run -it flask_docker_app /bin/bash
```
7.pipコマンドのインストール確認
```
pip show Flask
```

そもそもpipがインストールされていない。
pip の存在を確認

8.pipコマンドを確認
```
which pip
```
```
which pip3
```

pip3があることを確認して、pipで記載されているものを
pip3に書き換え。




# 今日書いたファイルの中身（app.py）
ただテキストを表示するWebページをローカルで表示する
```
from flask import Flask #Flaskモジュールをインポート

app = Flask(__name__) #Flaskのインスタンスを作成

@app.route('/') #ルーティングを設定
def hello():  #挨拶を返す関数を定義
    return 'DockerでFlaskを動かしてみる' #挨拶を返す

if __name__ == '__main__': #アプリケーションを実行
    app.run(host='0.0.0.0', port=5000, debug=True) 
```

# 今日書いたファイルの中身（requirements.txt）
FlaskとWerkzeugをインストール
```
Flask==2.0.1
Werkzeug==2.0.1
```
# 今日書いたファイルの中身（Dockerfile）
```
# ベースイメージとしてPythonを使用
FROM python:3.9

# 作業ディレクトリを作成
WORKDIR /app

# requirements.txtをコンテナにコピー
COPY requirements.txt .

# 依存関係をインストール
RUN pip3 install --no-cache-dir -r requirements.txt

# アプリケーションのソースコードをコンテナにコピー
COPY app.py .

# アプリケーションを実行
CMD ["python", "app.py"]```
```


Docker起動後、アクセスは以下で実施

```
http://localhost:5000
```
FastAPIの高速性の秘密

![表紙](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/29436288-31ee-4aec-4487-bba693bd8075.png)

FastAPIの高速性の秘密は何なのか？他のフレームワークを遠く後にしている秘訣は？

ここで紹介するのは「**Starlette**」「**Uvicorn**」「**Pydantic**」というトリオのディナミックスです。FastAPIが高速性を実現している秘密はこの他ならないバックボーンにあります。それぞれを見てみましょう：

## Starlette: 活発なバックボーン

StarletteはFastAPIのアシンクロナスマジックを支える覆面の強力な主力です。単なるフレームワークではなく、深さや駒動性を備えた最高の基盤といえます。

Starletteは非同期プログラミングを無理なく構築でき、重大な作業や高負荷を容易に変えます。HTTPリクエストやWebSocketに問題なく対応し、FastAPIの活発なパフォーマンスを支えています。

たとえば、FastAPIがロケットであるなら、Starletteはそのエンジンのような存在です。静かながらも力強く、平準化において鏡のような効率を保証しています。

## Uvicorn: 高速なASGIサーバー

UvicornはFastAPIを高速に動かすASGIサーバーです。このサーバーはFastAPIの信頼されたパートナーであり、アプリを高速にプロダクションへと押し上げます。

イベントループや効率的なHTTP処理など、Uvicornは平定して完璧に実行します。ステップもドラマもなく、ただ高速なパフォーマンスを提供しています。

ASGIワールドでは、Uvicornは他を大きく居抜き、その高速性は金メダルに値するほどです。

## Pydantic: データの安全性の要々々

ここで紹介するのは、FastAPIのデータを守る警備員Pydanticです。データに問題があれば、Pydanticはすぐさま検出します。

Pydanticは単なるデータ検証のみならず、Pythonの型ヒンティングを充分に活用します。アプリケーションの前にできるだけクリーンなデータを保証します。また、データの列値化も構築的に実行し、APIとクライアントの間の滑らかなコミュニケーションを実現します。

PydanticはFastAPIのエコシステムで信頼できる守護者であり、データの質を保証し、アプリケーションを安定した商用レベルに保ちます。

## 完璧なトリオ

FastAPIの凄まじいパフォーマンスは、Starlette、Uvicorn、Pydanticの組み合わせによるものです。APIの構築やスケーラブルなアプリの開発において、このトリオはFastAPIを現代開発者の最優先選択にしています。

---

FastAPIプロジェクトのホスト先を探しているなら、[Leapcell](https://leapcell.io/?lc_t=q_sf)を試してみてください！

[![Leapcell](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/bd77d2ec-e4b0-b85c-a0d0-9cf028f82e59.png)](https://leapcell.io/?lc_t=q_sf)

[Leapcell](https://leapcell.io/?lc_t=q_sf)は現代の分散式アプリケーションのために設計されたクラウドコンピューティングプラットフォームです。利用分に対する仕組みのため、使用した資源のみを支払うことができます。

詳しくは[Leapcellドキュメント](https://docs.leapcell.io/examples/python/fastapi/)をご覧ください。

Xで[@LeapcellHQ](https://x.com/LeapcellHQ)をフォローしてください！
バックエンドエンジニアなら知っておきたいB-treeインデックスの基本

# はじめに
RBD高速化のために使用されるINDEXですが、その仕組みについてみなさん語ることができますか？
テーブルの規模や保存されるレコードの特性を考慮した上で適切に設計しないと、貼ったINDEXがなぜか使われず性能改善が難航する...なんてことにもなりかねません。
一般的にRDBで利用されているB-tree INDEXについて、具体的にどのような仕組みで高速化が図られているのか、どのようなテーブル、カラムに対して設定するのが有効なのかまとめました。

# B-tree INDEXの仕組み
![スクリーンショット 2024-12-27 18.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948431/094dfca1-a9d6-c937-0941-c4fe82ec5783.png)
かなり簡略化していますが、BTree INDEXは上記のような構造になっています。
先に索引にアクセスし、必要なブロックだけ取得するため4ブロックのアクセスだけで済みます。

一方でINDEXを使用しない場合、シーケンシャルにブロックにアクセスするため200ブロック読み込む必要があります。

B-treeについてより詳しく学びたい方はこちらを参照ください
* [B-treeインデックス入門
](https://qiita.com/kiyodori/items/f66a545a47dc59dd8839)
* [B+Tree Guide](http://www.virtualmachinery.com/btreeguide.htm)

インデックスを貼ると更新系の処理が重くなる、という点も広く知られていますが、ここでは詳細な解説を割愛します。興味のある方は、**インデックスショットガン**で検索いただくと、参考になる素晴らしい記事が多数見つかるはずです。

（以降、INDEXと記載している部分はB-tree INDEXを指しているものとして読み替えてください。）
# INDEXのアンチパターン
上述のように探索を高速化してくれるINDEXですが、以下の場合RDBMSはINDEXを使ってくれません。

* 検索結果がテーブル全体のデータに対して一定割合以上占める場合
* カーディナリティの低い列に対する検索

### 検索結果がテーブル全体のデータに対して一定割合以上占める場合
例えば、総数が1万レコードのテーブルから5000レコード取り出す場合について考えてみます。

* INDEXが使用された場合
  * 上述の図において、1行取り出すのであれば「1行*4ブロック」でコスト4と考えることができます。5000行取り出すのであれば、「5000行*4ブロック」ですので**コストは20000**になります
* INDEXを使用しない場合
  * テーブルをフルスキャンして、対象のレコード5000行を取り出すので「1OOOO行*1ブロック」で**コストは10000**になります

少し極端な例でしたが、このようにINDEXを使わない方が早いケースがあるため、RDBMSは以下の条件でINDEXを使用するか否かを判断しています。（具体的な数値についてはRDBMSの種類や設定によって差分があります）
* 検索結果がテーブル全体の約20%以下であるか
* 検索対象にテーブルが数万レコード以上であるか

`USE INDEX`を指定するなどしてINDEXの使用を強制することもできますが、レコード数を考慮しながら慎重に考える必要がありそうです。

少し余談ですが、RDBMSは統計情報を基にしてSQLの実行計画を立てており、INDEXを使用するか否かもその実行計画ないで判断されるものになります。詳しくは[実行計画？？統計情報？？って人へ](https://qiita.com/NagaokaKenichi/items/5b6eb9887f88046a594d) に丁寧に書かれていたので参照ください。

### カーディナリティの低い列に対する検索
「列に格納されるデータの値にどのくらいの種類があるのか」をカーディナリティと言うらしいです。重複の少ないデータが格納されている場合は、カーディナリティは高くなります。

例えばカーディナリティが低い例として、男女2種類のデータが格納される想定のgender列が挙げられます。
男女の割合が1:1の場合 `WHERE gender = 男性`で検索するとテーブル全体の50%のレコードが取得されることになります。この場合、**検索結果がテーブル全体のデータに対して一定割合以上占める**ことになり上述の通り、INDEXが使われません。

まとめると、**カーディナリティの低い列**を基にした検索結果は、**検索結果がテーブル全体のデータに対して一定割合以上占める**ことが多いので、INDEXが使用されないことが多い、と言えることになります。

# まとめ
テーブルの特性を考慮しながら適切なINDEXを貼り、性能改善頑張りましょう。

# 参考
* [失敗から学ぶRDBの正しい歩き方](https://www.amazon.co.jp/%E5%A4%B1%E6%95%97%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6RDB%E3%81%AE%E6%AD%A3%E3%81%97%E3%81%84%E6%AD%A9%E3%81%8D%E6%96%B9-Software-Design-plus-%E6%9B%BD%E6%A0%B9-ebook/dp/B07P8PMHLL)
* [【図解】B-Treeインデックスを理解しよう](https://qiita.com/shibainuu/items/25d4d9c37d8e7ba04afa)
「誰でもわかる大規模言語モデル入門 」末次拓斗著　第9章　サンプルコードを変えてみた　

最近、購入したこちらの本の、サンプルコードをいろいろといじってみたので、忘備録として残します。
素直にコードも動いて、どういうことができるのか分かりやすかったので、非常におススメです！

[「誰でもわかる大規模言語モデル入門 」末次拓斗著](https://amzn.asia/d/eOKNSFH)

[サンプルコード](https://www.staffnet.co.jp/hp/pub/support/%E8%AA%B0%E3%81%A7%E3%82%82%E3%82%8F%E3%81%8B%E3%82%8B%E5%A4%A7%E8%A6%8F%E6%A8%A1%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB%E5%85%A5%E9%96%80/)

### 第9章：LLM を使用したレビュー分析プログラムの開発

まず、japanize-matplotlibをインストールしてもエラーがでてきます。（インストールできるが、走らせるとエラーが出る）
こちらの記事を参考に、matplotlib-fontjaにしたら、うまくいきました。

[japanize-matplotlibはpython 3.12ではエラーが出る→matplotlib-fontjaが代替](https://ujimushisradjp.hatenablog.jp/entry/2024/01/19/000354)

それから、この章では結果をまとめてグラフに表示しているが、実際に、どのように各レビュー分が評価されているのか、詳細が分かりません。
それで、このようにデータフレームで表示させてみました。

```python
pd.DataFrame(reviews_json)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/d37e38db-0e08-401c-643c-5b7fcebf6153.png)

さらに、本来であれば、Amazonや価格.comには★で５段評価がついているが、このレビュー分にはない。 代わりにプロンプトで、100点満点でそのレビュー分の満足度を推測してもらいました。
以下の関数で「そして、全体の満足度を0-100で推測してください。100が最高です。」というところと、「 "推測満足度": 80」というのを３カ所、追加しました。 

~~~Python 
#---------------------------------------------------
#　#9.レビューテキストから要素を抽出する関数
#---------------------------------------------------
def extract_review_elements(model, review_text):
    prompt = f"""
    以下のテキストから高評価要素と低評価要素を分析してください。
    そして、全体の満足度を0-100で推測してください。100が最高です。

    テキスト: 音質は素晴らしかった。長時間使用しても疲れず、耳にもフィットして快適でした。
    {{
        "高評価要素": ["音質", "装着感"],
        "低評価要素": [],
        "推測満足度": 80
    }}

    テキスト: 迫力がなく音がスカスカ。音漏れが酷く電車などの公共の場で使えないレベル。
    {{
        "高評価要素": [],
        "低評価要素": ["音質", "音漏れ"],
        "推測満足度": 20
    }}

    テキスト: 値段を考えると音質はまあまあ良い。でも耳が痛くなるのが難点。長時間は使えない。あと届いた箱がつぶれていたのが残念。
    {{
        "高評価要素": ["音質"],
        "低評価要素": ["装着感", "梱包"],
        "推測満足度": 60
    }}

    テキスト: {review_text}
    """
    response = generate_content(model, prompt)
    try:
        json_result = json.dumps(json.loads(response), ensure_ascii=False, indent=4)
    except json.JSONDecodeError as e:
        return f"Error: Invalid JSON format. {str(e)}"
    return json_result

~~~ 

この点数付けは、人間がやってもばらつくが、それでもこのGeminiが出した点数はそこそこ納得感があると私は思いました。（以下、一番右の列参照）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823476/2067ddf6-7d9e-8647-a2e1-e1848a764e98.png)

そのうち、アマゾンや価格.comの実際のレビューを使って、試してみたいと思いました。
恐怖のifconfig　～Qiitaから懺悔～

## 最初に
職場の皆様にはご迷惑をおかけして大変申し訳ございませんでした。
部ミーティングで懺悔させて頂きます。

## 事の始まり
ある日、Zabbix自身のトラフィックの流量を確認したいと思いました。
Zabbixなので当然自分自身のメトリクスは収集しているけど、5分間隔です。
もう少し短い1分間隔で見たいと思いました。
なぜかというと、新しく構築された他システムがZabbixの監視データを取得するのですが、負荷試験を行っていないため今後Zabbixに問題が起きないか確認するため負荷試験を提案しようとしているからです。

## 方法はどうしよう
1\. Zabbixのトラフィック取得間隔を1分間隔に変更する。
2\. コマンドで取得する。

実はZabbixは本番環境のZabbixなのであまり手を加えたくないです。
なので、コマンドで取得しようと思いました。

## コマンド実行
コマンドはifconfigのRx, Txのパケットカウントから確認すればいいかと思いました。
Zabbixにrootでログインしました。　※反省ポイント1
下のコマンドを実行しました。
```
# ifconfig ens192 1
```
あれ？数字の1がなぜか入力されているぞ？　※反省ポイント2

## ガクブルの時間
あれあれ？？
TeratermのCLIが反応しなくなったぞ？
あれあれ？？？
Zabbixの画面も見れなくなったぞ？？

ZabbixはESX上で動作しているのでvCenterのWebConsoleからアクセスしてみました。
ログインできた！！
コンソールも反応しているぞ！！
デフォルトゲートウェイにPingを打ってみよう、、、届かない。。。

なぜだ？？？
こんな時のおまじない
```
# ifdown ens192
# ifup ens192
```

おお！復旧した！！
ネットワーク疎通が取れていなかったため大量の「<ICMP>Unavailable by ICMP ping」が発火して大量のメールが送付されましたとさ。

## 反省ポイント1
rootじゃなければ。。。実行されなかったのに。。。
※検証環境で実施しています。
```
$ ifconfig ens224
ens224: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 0.0.0.1  netmask 255.0.0.0  broadcast 0.255.255.255
        inet6 fe80::6ba8:5e2f:1df8:17d2  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:db:d0:68  txqueuelen 1000  (Ethernet)
        RX packets 1639131  bytes 103069830 (98.2 MiB)
        RX errors 0  dropped 23  overruns 0  frame 0
        TX packets 17723  bytes 1440895 (1.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ ifconfig ens224 1
SIOCSIFADDR: Operation not permitted
SIOCSIFFLAGS: Operation not permitted
```

## 反省ポイント2
知識不足。
⇓のコマンドを実行した時の動作が分かっていないってこと。
```
# ifconfig ens224 1
$ ifconfig ens224
ens224: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 0.0.0.1  netmask 255.0.0.0  broadcast 0.255.255.255
```
あれあれ？IP Addressが0.0.0.1になってるぞ？？

ifconfigでインターフェースのアドレスを一時的に変更する、ってことを人生でやってこなかったなぁ。大半は/etc/sysconfig/network-scripts/ifcfg-ens224を直接編集してインターフェース再起動。

せめてx.x.x.xの形式以外はエラーにしてほしい。サンタさんどうぞよろしくお願いします。
block_given?

# ブロックであり、イテレートできるかを調べる
>block_given? -> bool
iterator? -> bool
メソッドに`ブロックが与えられていれば真`を返します。

>このメソッドはカレントコンテキストにブロックが与えられているかを調べるので、メソッド内部以外で使っても単に false を返します。

>iterator? は （`ブロックが必ずイテレートするとはいえない`ので）推奨されていないので `block_given? を使ってください`。

例
```rb
irb(main):016* def check
irb(main):017*   if block_given?
irb(main):018*     puts "Block is given."
irb(main):019*   else
irb(main):020*     puts "Block isn't given."
irb(main):021*   end
irb(main):022> end
=> :check
irb(main):023> check{}
Block is given.
=> nil
irb(main):024> check
Block isn't given.
=> nil
```
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/block_given=3f.html

### プライベートメソッドになっているため使えない。
```rb
irb(main):025> [1, 21, 2].block_given?
(irb):25:in `<main>': private method `block_given?' called for [1, 21, 2]:Array (NoMethodError)
```
* カレントコンテキストとは
【AWS re:Invent 2024】生成AIのアップデートで感じたセキュリティの重要性

こんにちは！
AWS Jr.Championsの贄川です！

AWS re:Inventに参加して少し時間が経ったので、振り返りの意味を込めてAWS re:Inventの概要と個人的に重要だなと感じたセキュリティと生成AIの変化についてご紹介します！

今回の内容は、Matt Garmanさんなどが講演するのKey Noteの内容と「The good, the bad, and the ugly of Al and cybersecurity」というタイトルのLTの内容をもとに書いています。

## AWS re:inventのアップデートの概要
![AWS_reInbent_keynote.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883129/26f45d23-bdf0-fe5a-b5a5-a0b179fc6cb6.jpeg)

今回のAWSのアップデートは「生成AIのためのアップデート」という内容で、「Compute」「Storage」「Database」「Inference」という４つの要素からより生成AIを効率的に使用できる内容が多くありました。

昨年のアップデートではAmazon BedrockやAmazon Qなど生成AIを使用したサービス自体の内容がほとんどだったのですが（今年も生成AIサービス自体のアップデートはありましたが）、今年はS3 Tables, MetadataやAmazon Aurora DSQL,DynamoDB global tablesなど関連したサービスのアップデートがメインとなっていました。

## 生成AIの発達によるサイバー攻撃の変化
![d7ea3b88-dc0c-4b0c-9fda-b421bb5c06ac.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883129/7d90f7d7-4d6a-8210-0928-7e993e589739.jpeg)
Key Noteでは生成AIに関するアップデートにより、もっと便利で使いやすい、ビジネスで必要不可欠なものになるという前向きな発表がされていましたが、もちろん生成AIの発達によって悪い効果もあります。

それが生成AIを用いたサイバー攻撃です。

サイバー攻撃を行う攻撃者の視点で見ると、生成AIにより攻撃は自動化され、脆弱性を発見することも非常に容易くなりました。
また攻撃に必要なコストも大幅に低くなりました。

しかし攻撃を受ける側の視点で見ると、サーバー攻撃に対して気づくのが少しでも遅くなると被害があっという間に大きくなり、生成AIを用いていないセキュリティの場合、アラームの数が非常に増え、対応に追われてしまいます。

LTの中でサイバー攻撃の被害額の平均は約500万ドル以上と言われていました。

生成AIの発達により、攻撃者側の負担が減っているのに対して、守備側の負担が非常に増えているという話を他のセッションでもよく聞きました。

## サイバー攻撃の対象の変化
![2a1c41b2-f595-4bb7-a820-f9e98823b67b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883129/c11f8d01-9641-5d1c-20c7-aeb873db1f26.jpeg)
またLTでは現在のセキュリティの仕組みも効率的ではないという話もされていました。

現在の生成AIを用いたセキュリティは、攻撃を受けた後に修復を行ったり、攻撃パターンから脆弱性の分析をしたりなど後手に回りがちな方法となっています。

攻撃に対して機械学習を行いセキュリティの堅牢度を高めていくのですが、この仕組みを標的にした生成AIを用いたサイバー攻撃が増えているようです。

攻撃手法としては2つあります。
- アドバーサリアルアタック (敵対的攻撃)
機械学習モデル、特にディープラーニングモデルに対して行われる攻撃の一種で、攻撃者が意図的に設計した微小な変化を入力データに加えることで、モデルの出力を誤らせることを目的とします。
- AIデータポイズニング
攻撃者がAIに不正なデータや誤ったデータを意図的に学習させ、モデルの学習プロセスを妨害することで、本来検知すべき悪意のある行動を「通常の動作」と誤認識させる手法です。

セキュリティ側の機械学習用のデータに対してサーバー攻撃を仕掛けることで、セキュリティとしての機能を正常に稼働させなくなる攻撃方法が主流になりつつあります。

## 望ましいセキュリティとは
望ましいセキュリティは「生成AIを用いた自律的なセキュリティ」です。

要するに、人間の労力をなしに攻撃されることなく、事前にセキュリティの堅牢度を高くする仕組みがこれからは必要であると話されていました。

また個人的には人間も生成AIを用いたセキュリティについて詳しくある必要があると感じました。
セキュリティ系のサービスでAIを使用しているものはWAFぐらいしか知らなくて、内部的な仕組みについては全然理解できていませんでした。。。

またAmazon Q Businessを用いたトラブルシューティングのハンズオンを受けてみました。
AIとの対話を通じて原因を突き止めるのですが、Amazon Qがリソース情報を内部で集めてくれるので非常にトラブルシューティングがスムーズにできましたが、慣れるのには時間がかかりそうだなとも感じました。

なので今後はセキュリティに関しての学習を中心に行っていきたいです。

## 終わりに -AWS re:Inventの感想-
![276b8697-1ef2-43fd-9dae-d20de343d6df.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883129/ff261af1-21db-6512-e899-d04ec8078ca9.jpeg)
AWS re:Inventの5日間はとても楽しかったです！
私は英語が出来ないので、英語のセッションで聞き取れるか不安な気持ちでしたが、スライドの英語を和訳したり、英語が分かる人に教えてもらってなんとか理解できました！
外人の方と一緒にAWS BuilderCardsをプレイしたのもいい思い出です！
（勝利条件が分からなかったので負けてしまいまいたが。。。）

ぜひまた来年のAWS re:Inventに行きたいです！
S3とCloudFlareで独自ドメインの静的ホスティング対応

# 概要

`S3`と`CloudFlare`を使用した独自ドメインの静的ホスティング方法についてまとめました。

# 対応事項

## 0. アカウント作成

事前に`AWS`のアカウントと、`CloudFlare`のアカウントを作成しておきます。
詳細は各種サポートページをご確認ください。

## 1. [AWS] S3バケット作成

アカウントの発行が完了したら、`AWS`の`S3`バケットを作成します。
`S3`コンソールの「バケットを作成」からバケットを作成してください。

パブリックアクセスをすべてブロック を `OFF`にした状態でバケットを作成してください。
その他の設定はデフォルトのままでOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842674/be4153e6-a1fc-84c2-f73b-7e63ee2a8bd1.png)


## 2. [AWS] バケットポリシーの更新

パブリックアクセスをすべてブロック を `OFF` にしただけでは、バケットへのアクセスは許可されていません。
バケットポリシーを更新し、`GET`でのリソースアクセスを許可します。

**※Action を `"*"`とすると、リソースの作成や削除が行えてしまうので注意！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842674/7fcf9403-0af7-425c-d8ec-e3d48e251ef5.png)

設定した`json`
```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AddPerm",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::xxx.test.jp/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "0.0.0.0/1",
            "128.0.0.0/1"
          ]
        }
      }
    }
  ]
}
```

## 3. [AWS] 静的ウェブホスティングの有効化

[プロパティ]タブの[静的ウェブホスティング]からホスティングを有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842674/374378eb-f51b-d7bc-7e8a-7f718ec60af6.png)

静的ウェブホスティングを有効にすることで、バケットにアクセスするためのエンドポイントが払い出されます。
このエンドポイントに対して、特定のドメインでアクセスできるように`CloudFlare`で設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842674/73ac5c7c-1484-a7cb-3d01-d4aa7424e886.png)

設定後、適当なファイルを`index.html`としてバケット内に作成しておきます。

## 4. [CloudFlare] CNAMEレコードの作成

`CloudFlare`にログインし、`CNAME`レコードを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842674/e1a10df6-1338-74a4-7fcf-78b8b0715ef9.png)

- タイプ: `CNAME`
- 名前: （任意）
- ターゲット: 静的ウェブホスティングで払い出されたエンドポイント

保存後、設定したドメインでS3バケットへのアクセスが可能かご確認ください🙏
バケットTOPに配置した`index.html`が表示されればOKです。

# まとめ

以上です。
どなたかの役に立てたのであれば...
「ドラゴン桜」から学んだビジネススキル（人の褒め方）

# はじめに
あなたは人を褒めたことがありますか？
大体の人は何かしら人を褒めたことがあると思います。
例えば、今まで達成できていなかった目標を達成したとき、人に親切な行動を見たとき。
などなど、日々褒めることを何かしらはしているはずです。
しかし、場合によっては褒めることが逆効果になって、その人のパフォーマンスを落としてしまったり、関係性を悪化させてしまうこともあります。
なぜ、そのようなことになってしまうのでしょうか？
それは、きちんとして褒め方を知らないことが原因です。
私自身も人の褒め方についてあまり考えたことがなく、その時の感性で人を褒めていました。しかし、漫画「ドラゴン桜」にある人の褒め方を見て、それではだめだと気づくことができました。
その学んだことを忘れない、かつ色んな人に褒めることの重要性について知ってほしく記事を書きました。

# そもそも褒める理由は？
なぜ褒めるのでしょうか。
色々あると思いますが、仕事ありきだと私は以下だと考えます。
- **褒めることでモチベーションをアップさせ、成果を上げさせるため**

ちなみに上記のような効果を「ピグマリオン効果」と呼ぶらしいです。
私自身、今まで知りませんでした、、、

https://schoo.jp/biz/column/618



# よくない褒め方とは？
### よくない褒め方
よくない褒め方の例を書いてみます。
>例えば、あなたが保険の営業マンだと思ってください。
>個人ごとの売上が可視化されており、売り上げ目標がそれぞれ存在します。
>あなたは会社や個人事業主などの顧客に対して、地道に提案をしていくことで
>徐々に契約数を増や、営業成績を上げていきました。
>営業成績を上げると、その度に上司に褒められます。
>

よくある場面かなと思います。
人によっては、ぱっと見るとめちゃ褒めているからいいじゃんと思いがちになりませんか。
そこに落とし穴があります。
褒めを受ける側は、**褒めれば、褒めるほど営業成績を上げないといけないという気持ち**になり、それが重荷になります。
最後には、相手が自分を操ってもっと働かせるために褒めているのではないかと感じるようになり、その結果どんどんパフォーマンスが落ち、成績も悪くなってしまう可能性があります。

### なぜそうなるのか
相手の気持ちを察することなく、ただ褒めることは相手からすると思い通りに支配したいと考えているように思われるためです。
営業成績を思い通りに上げてもらうために褒める。
これは、相手のためではなく、自分のために褒めることを利用してませんか。
それがだめだと漫画では言われています。


# いい褒め方をするために
「よくない褒め方とは？」でよくない褒め方について書きましたが、じゃあどのような褒め方がいい褒め方なんだって思いますよね。

大事なことは「承認」と「確認」の２つです。
漫画の中では、「承認」と「確認」を以下で定義しています。
> 承認は相手の存在を認めてあげること
> 確認は相手のしたいいことを一緒に確かめること
>
>出典：「ドラゴン桜9巻」

上記だけでは具体的にどうすればいいかイメージしずらいと思います。
漫画では具体的に10か条としてどのような行動が必要かまとめられていました。
> **ホメ方テクニック十か条**
>1. 具体的にほめる
>2. 抽象的にほめる
>3. すぐほめる
>4. 「これは」と思うことをいつまでもしみじみとほめる
>5. 理由をつけてほめる
>6. 理由なしでほめる
>7. 褒め言葉のバリエーションを増やす
>8. 感謝の言葉も誉め言葉である
>9. 第3者も褒めていたと伝える
>10. その子の思いれの大きいことを褒める
>
>出典：「ドラゴン桜9巻」


試しに実践してみます。
例えば「1.具体的にほめる」の悪い例／いい例をやってみます。
```
**悪い例**
「今月も営業目標達成していてすごいじゃないか！来月も頑張っていこう！」

**いい例**
「過去の顧客情報などを分析して、提案しているからこそ営業目標達成できたのか。他メンバーがしていない取り組みを考えて実践できてるのはすごくいいね！その取り組みが今後の君のキャリアを絶対豊かにしてくれるから、引き続き来月も頑張ろう！」
```
比較してどうでしょう？
具体的に何がいいか褒めらえることで、うれしくなりますし、今後も色々と工夫して頑張ろうという気になりませんか？


### 結論「承認」と「確認」とは
:::note info
どんな場面でも相手のいい所を無条件でほめること、これが「承認」になります。
:::
**例「1.具体的にほめる」の「承認」は？**
>他メンバーがしていない取り組みを考えて実践できてるのはすごくいいね！

相手のいいところを見つけて褒めています。

:::note info
褒めることと一緒に自分の気持ちを伝えること、これが「確認」になります。
:::
**例「1.具体的にほめる」の「確認」は？**
>その取り組みが今後の君のキャリアを絶対豊かにしてくれるから、引き続き来月も頑張ろう！

考えて取り組むことでキャリアが絶対よくなるという自分の気持ちを伝えています。



### 「承認」と「確認」をする前に一番大事なこと
以下に尽きると思います。
>相手の人格を
>すべて受け入れる
>そこから人間関係が始める
>
>心を通いだせば
>言葉が自然と
>相手の胸に
>響いていく
>
>出典：「ドラゴン桜9巻」

信頼のある人間関係が出来上がっているからこそ、「承認」と「確認」が発揮され、今までよりその人のやる気やパフォーマンスを向上してくれます。
これがどちらか一方的になってしまってはいけないです。
**私は信頼関係を築くことができていると強く思っている**ほど、一旦落ち着いて本当に問題ないか確認することが大事だと思います。
最初は信頼関係を築くことができていたのに、いつの間にかそうではなくなっているかもしれません。
当たり前ですが、時間の経過で最初と今とでは状況などが異なることが多いはずです。


# さいごに
私はエンジニアとしてヒューマンスキルを疎かにしないよう日々意識しています。
それは当たり前とされ軽視されがちなこと、今回の「人を褒める」ことや「コミュニティの取り方」なども同じだと考えています。
それを蔑ろにしているような環境では、根っこがしっかりしていないのにきれいな花を咲かそうとしている植物と変わらないと思います。きれいな花を咲かす植物は、根っこがしっかりして悪天候や強い風にも負けず、栄養を吸収して成長できる環境で間違いないはずです。
私自身、エンジニアとしてまだまだ未熟なところばかりですが、技術面だけではなく人としても評価され、誰かにそのスキルを伝えられるように少しづつ頑張って行きたいと再度思いました。

最後に、「ドラゴン桜」を見たことがない人はぜひ見てください！
話としては、東大合格を目指す受験生と学校の経営を立て直す弁護士の話になっていますが、そこで出てくる内容は社会人として身につけたい内容ばかりだと思ってます！
Jenkinsビルド中に「行連結文字 '_' は、その前に少なくとも 1 つの空白文字が必要で…」というエラーが発生した場合の対処法

# はじめに
開発環境とCI/CD環境で異なるコンパイラバージョンを使用していると、思わぬビルドエラーに直面することがあります。この記事では、Jenkinsを使用したCI/CD環境でVB.NETデスクトップアプリのビルド中に発生する特定のエラーに対する有効な解決方法について解説します。

# 事象
JenkinsでVB.NETデスクトップアプリのビルド中、以下のようなコンパイルエラーが発生し、ジョブが異常終了してしまいました。

- **エラー内容**: `行連結文字 '_' は、その前に少なくとも 1 つの空白文字が必要で、また行の最後の文字でなければなりません`
- **エラー対象コード**:
    ```vbnet
    IF (a == b) _ 'コメント
        Andalso c == d _ 'コメント
    ```

一方、同じソースコードはローカル環境のVisual Studioで正常にビルドが成功しています。この違いは、ローカル環境で使用しているVisual Studioのバージョンが異なる可能性が高いです。

# 原因
このビルドエラーの原因は、コンパイラのバージョンの仕様差異に起因します。具体的には、以下の通りです：

- **VS2015以前**: 行連結文字 `_` の直後には改行が必要。コメントを付けることができません。
```ruby:vb.net
IF (a == b) _
  Andalso c == d _
```
- **VS2017以降**: 行連結文字 `_` の直後にコメントを付けることが可能。
```ruby:vb.net
IF (a == b) _ 'コメント
  Andalso c == d _ 'コメント
```

ローカル環境ではVS2017以上を使用しているのに対し、JenkinsではVS2015のmsbuildが使用されているため、エラーが発生していました。

# 対策
この問題を解決するためには、Jenkinsで使用するmsbuildバージョンをVS2017以上にアップデートする必要があります。具体的な手順は次の通りです：

1. JenkinsサーバーにVS2017以上のビルドツールをインストールする。
2. Jenkinsの設定で、msbuildのパスをVS2017以上のものに変更する。

これにより、JenkinsでのビルドもVS2017以上の仕様に沿ったビルドが可能となり、エラーが解消されます。

# まとめ
Jenkinsを使用したCI/CD環境で発生するVB.NETのビルドエラーは、開発環境とCI/CD環境のコンパイラバージョンの違いによって引き起こされました。ビルドに使用するmsbuildのバージョンをVS2017以上にすることで、問題を解決することができます。設定を見直し、統一した環境でのビルド運用を心がけましょう。

この記事が皆さんの環境整備に役立つことを願っています。質問や問題があれば、お気軽にコメントしてください。


# 参考文献
https://learn.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/program-structure/how-to-break-and-combine-statements-in-code
DRP-AI日記その3 Kakipネットワーク等初期設定

Kakipのネットワーク等を初期設定しました．

DRP-AIシリーズ・Kakip

- [DRP-AI日記その1 なぜDRP-AIシリーズに取り組むのか](https://qiita.com/zacky1972/items/3ebf021cab1e972890f8)
- [DRP-AI日記その2 Kakipを起動してみた](https://qiita.com/zacky1972/items/438ddc192fc499fb697c)

電力が不足しているのか，熱がまずいのか，ディスプレイ出力が安定しません．USBハブを使うのを諦めて，キーボードとマウスを抜き差ししながら，慎重に作業を進めます．

1. 最初にキーボードを繋いで初期ユーザー・初期パスワードでログインします．
2. 次にマウスに繋ぎかえます．
3. 「Ubuntu 24.04.1 LTSへようこそ」で「次へ」をクリック
4. 「Ubuntu Pro」で「Skip for now」を選択して「次へ」をクリック(もちろんUbuntu Proにしても良いです)
5. 「Ubuntuの改善を支援する」で「はい、システムデータをUbuntuチームと共有します」を選択して「次へ」をクリック(もちろん共有しない設定にするのもありです)
6. 「さらにアプリケーションを追加する」の画面で「完了」をクリックする

次に左下の「Show Apps」アイコンをクリックして，「設定」を選択します．

1. ネットワークタブを選択して，有線の歯車アイコンをクリックする
2. IPv4タブを選択して，固定IP設定にする

次に左下の「Show Apps」アイコンをクリックして，「端末」を選択します．

1. `sudo apt update`
2. `sudo apt upgrade`

続いてユーザーを新たに作ります．`ユーザー名`には実際には作成するユーザーアカウントの英数字を入れます．

1. `sudo adduser ユーザー名`
2. `sudo gpasswd -a ユーザー名 sudo`

一旦ログアウトして新しいユーザー名でログインしなおします．その後，デフォルトユーザー`ubuntu`を削除します．

1. `sudo userdel -r ubuntu`

## sshd のポート変更

現在のUbuntuでは`systemd`を用いて`sshd`を運用しているようです．下記で確認できます．

```bash
sudo systemctl status ssh.socket
```

ポート番号を書き換えるには，まず次のコマンドを実行して，エディタを好きなものに書き換えます．

```bash
sudo update-alternatives --config editor
```

そして次のコマンドを実行します．

```bash
sudo mkdir -p /etc/systemd/system/ssh.socket.d
sudo systemctl edit ssh.socket
```

`/etc/systemd/system/ssh.socket.d/override.conf`というファイルが作成されて，テキストエディタが開きます．

```txt:/etc/systemd/system/ssh.socket.d/override.conf
### Editing /etc/systemd/system/ssh.socket.d/override.conf
### Anything between here and the comment beflow will become the contents of the drop-in file

[Socket]
ListenStream=
ListenStream=(指定したいポート番号)

### Edits below this comment will be discarded
```

(指定したいポート番号)のところにポート番号を記載します．その前の `ListenStream=`という空の行で既存のエントリを削除しています．これが無いと，22番ポートでも待ち受けてしまいます．


その後，次のコマンドを実行します．

```bash
sudo systemctl restart ssh.socket
sudo systemctl status ssh.socket
```

## そのほかのsshdの設定

```bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
```

* rootユーザーでのログインを抑止(PermitRootLogin)

```bash
sudo systemctl restart ssh.socket
sudo systemctl restart ssh
```

パスワード認証でログインし，公開鍵を配置します．

その後，次の処理をします．

* パスワード認証の抑止(PasswordAuthentication)

```bash
sudo systemctl restart ssh.socket
sudo systemctl restart ssh
```

パスワードでのログインが禁止されたことを確認しました．

## さいごに大事なこと

`apt upgrade`で`systemd`が保留になっていたので，気になって，`apt install`で強制アップグレードしたら，起動しなくなってしまいました．原因を突き止めるまではアップグレード禁止．
孫正義さんの講演の感想（OpenAI o1モデルについて）

# 孫正義さんの講演の感想

## はじめに
こんにちは。私はIT業界への就職を目指している大学二年生です。この記事では、先日ユーチューブにアップされた孫正義さんの[SoftBank World 2024 孫 正義 特別講演 超知性が10年以内に実現する](https://youtu.be/BzJHh5IZV2o?si=NB-0yASAqglsoB6a)を拝見した感想を書きたいと思います。


## OpenAI o1モデル
講演の内容は、孫正義さんが今後10年以内に起こると予想する「超知性」についてでした。超知性とは何かと端的にいうと、進化した**AIが人間一人一人のメンターとなり人間の幸せを達成する**という目標に向けて最適な方法を提案、実現するというものでした。数か月前にChatGPTの新モデルである”o1”が登場しました。o1の最も画期的な特徴は”考える”というところにあります。

## 考えるとは
旧モデルと新モデルの大きな違いは”考える”ということだと、孫正義さんはおっしゃっていました。そこには”知能”と”知性”という違いがあります。旧モデルは、インターネット上の情報を集めて適切な回答を出すという”知能”としての役割を果たしていました。一方で、新モデルは集めた情報から三段論法を使って、最適解を出す”知性”を実現しました。正確には三段論法以上の段階を踏んで答えを出すということをおっしゃっていました。

では、人間が考えるときはどのような段階があるのだろうかと私は考えました。結論として、人間はほとんどの事柄を三段論法を使って理解していると考えました。例えば、「ソクラテスは人間である」「人間は必ず死ぬ」という仮定があると、「ソクラテスは必ず死ぬ」ということが理解できるということです。ほかのことでも同じです。人間は何かを推理したり理解したりするとき、三段論法を用いています。つまり、**生成AIはすでに人間と同じような方法で思考できるようになっている**ということです。しかも、人間より多くの情報を同時に得て考慮することができるので、人間より賢いし、人間が考えるより最適な結論を出すことができると考えられます。コーディングの正答率は旧モデルの5倍以上ということで、エンジニアの良いパートナーとなること間違いなしですね。

## 超知性について
### 超知性の概要
超知性が実現すると何が起こるかというと、私たちの生活が一変します。私たちの脳内をAIが完全にコピーしており、様々な感情や記憶に基づいて私たちの生活がよりよくなるように導いてくれます。その媒体をエージェントといい、エージェント同士のやり取りによって身の回りのすべてのことを把握し、適切に管理します。例えば、ほかの人とのメッセージのやり取りはエージェント同士で行われ、アポイントメントは私たちが寝ている間に済んでしまいます。また、寒い日は家に着く前に家電のエージェントと私たちのエージェントがやり取りをしてお風呂を沸かしてくれるかもしれません。孫正義さんは、さらにAIが進化すると自己を持つようになると予想しています。IoTの先にAIoTがあるということです。

### 超知性は人間の幸せを実現できるのか
超知性は教科学習によって、学習し成長するということでしたが、その報酬は人間の幸せであると孫正義さんはおっしゃっていました。つまり、人間の幸せが点数として与えられ、より高い点数を得ることを目的にAIが学習するということです。私は、**幸せは相対的なものであり、絶対的な基準を作ることはできない**と考えています。しかし、これはAIが人間の幸せを達成できないと言っているわけではありません。もし、**AIが人間のその性質を理解すれば最適解を導ける**という可能性も考えられます。結論として、私はAIが人間を幸せにすることに期待しています。

## まとめ
今回の孫正義さんの講演から、AIの進化が私たちの生活にどれほど大きな影響を与える可能性があるのかを強く感じました。特に、新モデル「o1」の登場によるAIの"考える力"の進化は、私たちの理解力を超え、より人間的な知性を備えた未来をより現実的にしたと考えます。また、超知性が生活のさまざまな側面を改善し、幸せの実現を目指すという考え方には大きな期待が寄せられる一方で、その実現には倫理的・哲学的な課題が残っていることも明らかです。この点についてはまた別の記事に書きたいと思います。

この講演を通じて、AIが単なる道具の域を超え、人間社会において真のパートナーとしての役割を果たす未来像を深く考えさせられました。今後、自分自身もIT業界を目指す者として、この進化をどう活用し、どのような貢献ができるのか考え続けたいと思います。
【MLS-C01】AWS Certified Machine Learning Specialty 合格体験記

# はじめに
2024年の12/26にAWSのSpeciality資格であるMachine Learning Specialty(MLS)を合格したので、これまでやってきた勉強や試験の傾向について共有していきたいと思います。

## 試験結果
スコアは849点でした。
前日にやったskillbulderの練習問題では8割ほどだったので、本番少し上振れてくれました。
![スクリーンショット 2024-12-27qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828633/7b686447-7472-fbfc-b686-2f5b00c7ff1d.png)


## 勉強前の私の状態
- 昨年まで大学院で自然言語処理の研究をしていた
- アルバイトで1年半ほどデータ分析のプロジェクトに従事していた
- 2か月ほど前にAWS SAA資格を取得した

## 勉強方法
試験対策をした期間は2週間でした。
勉強時間はトータルで30時間くらいだったと思います。

勉強方法としては、愚直にひたすら練習問題を解くといったことをしました。
各問題集だいたい2週ほど回しました。
間違えた問題は解説を読みこみ、不明点はChatGPTとGoogle検索で補填していた感じです。

練習問題に使った問題集は以下の3点です。

### 問題集
- [公式練習問題集](https://explore.skillbuilder.aws/learn/course/internal/view/elearning/12469/aws-certified-machine-learning-specialty-practice-question-set-mls-c01-english?ml=sec&sec=prep)
- [【最短攻略】AWS 認定機械学習 – 専門知識 模擬問題集](https://www.udemy.com/course/aws-30-b/?srsltid=AfmBOorEyeU_ZJ-PL4jVPLu5m-fm0LTg7rNxbqzOG7EaSv_Hp-Qlqi2Q)
- [CloudLicense](https://cloud-license.com/)

# 試験を受けた印象
- 機械学習の知識だけで解ける問題は全体の3割
  - 回帰、分類、特徴量削減など各モデルがどの用途で良く使われるのかを整理しておくのがおすすめです
  - モデル選定の問題は[AWSの組み込みアルゴリズム](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/algos.html)なども含むので、AWS以外でデータ分析をしてきた人などはひっかかることが多そうです
- 生成AI以外の機械学習についての知識が問われる
  - Bedrockなどは試験範囲に含まれていません
  - 勾配ブースティング(XGBoost等)についての知識はよく出てきた印象でした
- AWSサービスではSageMakerについて最も多く問われていた
  -  Ground Truthでラベル付けができたり、Data Wranglerでデータの前処理もできるので登場機会が多かったです
  -  [A/Bテストのアーキテクチャ](https://aws.amazon.com/jp/blogs/news/a-b-testing-ml-models-in-production-using-amazon-sagemaker/)も抑えたほうがいいです
- データ処理のAWSサービスも頻出
  - データ収集ではKinesisが良く出てくるので抑えておきましょう
    - 特にFirehoseとStreamsのユースケースの違いは頻出です
  - 複雑なETLになるとGlueもよく登場してきました

# おわりに
大学時代のバックグラウンドが機械学習だったので、機械学習系の問題は大丈夫だろうと思っていたら、初見の練習問題では5割ほどしか取れずショックを受けました:cry:

AWSのサービスについて理解が必要なのはもちろんですが、欠損値の処理などはあまりやったことがなかったのでこの試験で知見を深めることができました。

資格試験全般に言えると思いますが、合格のカギはとにかく練習問題の数をこなすことにあると思います。

私もまた機会があれば、AWSの別の資格にもチャレンジしていきたいです:muscle:
TypeScriptとReactを学ぶためには

# 1. TypeScriptの基本を学ぶ

- TypeScriptの基本構文（変数宣言、型アノテーション、型推論）
- オブジェクトと配列の型
- Union型、Intersection型
- インターフェースと型エイリアス
- クラスと継承
- ジェネリクス
- モジュールと名前空間

# 2. JavaScript/Reactの基礎を復習する

- ES6+の基礎（アロー関数、デストラクチャリング、スプレッド演算子など）
- モジュールとエクスポート/インポート
- 関数とオブジェクトの基礎

# 3. Reactの基本を学ぶ

- Reactの基本概念（コンポーネント、Props、State）
- JSXの使い方
- React Hooks（useState, useEffectなど）
- イベントハンドリング
- コンポーネントのライフサイクル

# 4. TypeScriptでReactを使う

 - Reactコンポーネントに型を付ける方法
 - Propsの型指定
 - useState, useReducerの型
 - Reactのイベントに型を付ける
 - Context APIやReduxとTypeScriptの組み合わせ
 - カスタムHooksに型を付ける

# 5. プロジェクトを作成して実践

- ToDoアプリ
- 簡単なブログサイト
- カレンダーアプリ
- APIを利用した天気情報アプリ

# 6. コミュニティに参加して学ぶ

 - Stack Overflowで質問する
 - GitHubで他のプロジェクトを読んだり、コントリビュートする
 - TwitterやDiscordの技術系コミュニティに参加する

# 環境設定

- エディタ: Visual Studio Code
- 拡張機能
ESLint、Prettier、TypeScript Plugin for VSCode、React Developer Tools
- 環境: Node.js、npm（またはyarn）
to_enum

# Enumeratorクラスに変換する
>to_enum(method = :each, *args) -> Enumerator[permalink][rdoc][edit]
enum_for(method = :each, *args) -> Enumerator
to_enum(method = :each, *args) {|*args| ... } -> Enumerator
enum_for(method = :each, *args) {|*args| ... } -> Enumerator

>`Enumerator.new(self, method, *args)`を返します。
>
>ブロックを指定した場合は Enumerator#size がブロックの評価結果を返します。ブロックパラメータは引数 args です。
>
>[PARAM] method:
メソッド名の文字列かシンボルです。
[PARAM] args:
呼び出すメソッドに渡される引数です。

#### str.enum_forでEnumeratorクラスが生成されメソッド(each_byte)が繰り返し実行されている
```rb
irb(main):008> str = "xyz"
irb(main):009>
irb(main):010> enum = str.enum_for(:each_byte)
irb(main):011> p(a = enum.map{|b| '%02x' % b }) #=> ["78", "79", "7a"]
irb(main):012>
irb(main):013> # protects an array from being modified
irb(main):014> a = [1, 2, 3]
irb(main):015> p(a.to_enum)
["78", "79", "7a"]
#<Enumerator: [1, 2, 3]:each>
=> #<Enumerator: ...>

```
https://docs.ruby-lang.org/ja/latest/method/Object/i/enum_for.html#:~:text=to_enum(method%20%3D%20%3Aeach,2%2C%203%5D%3Aeach%3E

### Enumeratorクラス ブロック処理するときに使うクラス 使用するには`each`メソッドが必要
>`each 以外のメソッドにも Enumerable の機能を提供`するための`ラッパークラス`です。また、外部イテレータとしても使えます。

>Enumerable モジュールは、Module#include 先のクラスが持つ each メソッドを元に様々なメソッドを提供します。例えば Array#map は Array#each の繰り返しを元にして定義されます。 Enumerator を介することにより `String#each_byte のような異なる名前のイテレータについても each と同様に Enumerable の機能を利用`できます。

>Enumerator を生成するには Enumerator.newあるいは Object#to_enum, Object#enum_for を利用します。また、一部のイテレータはブロックを渡さずに呼び出すと繰り返しを実行する代わりに enumerator を生成して返します。

https://docs.ruby-lang.org/ja/latest/class/Enumerator.html#:~:text=each%20%E4%BB%A5%E5%A4%96%E3%81%AE,%E6%B3%A8%E6%84%8F

### Enumeratorを介することでeach と同様に Enumerable の機能を利用できる
https://qiita.com/masatom86650860/items/d7e8242024b6e0ed4fa9

### イテレータとは
https://qiita.com/masatom86650860/items/d1622e7267c654a559ec
AWS App Runnerをプライベートで使ってみた

今年の8月ころにプライベートの開発でApp Runnerを使ったので、その際に感じたことを書きます。

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

## 良かった点

- リクエスト数でオートスケールができる
- ACMのSSL証明書を使える
- 前段にロードバランサーが配置されている
- デプロイが楽
    - ECRにプッシュするだけでデプロイされる

そのうちの、オートスケールとデプロイが簡単なのは、ちょっとアプリケーションをデプロイするのに良いと感じました。
オートスケールは同時リクエスト数に合わせてのみになりますが、ほとんど設定が不要でオートスケールの設定ができるようです。
（自分は使わなかったが、便利そう）

https://docs.aws.amazon.com/ja_jp/apprunner/latest/dg/manage-autoscaling.html

また、デプロイはECRにプッシュするだけで自動でBlue/Greenデプロイしてくれます。
ECR以外にもソースコードを管理しているリポジトリに連携し、コミットをプッシュすると自動デプロイが走るようにもできるようです。

https://docs.aws.amazon.com/ja_jp/apprunner/latest/dg/manage-deploy.html

## ちょっと残念だったところ

- プロビジョニングされたコンテナインスタンスが最低でも1つ必要
    - コンテナインスタンスに割り当てたメモリに対して費用がかかる（0.009 USD/GB 時）
- 利用しない間の料金を0にするにはApp Runnerサービスを一時停止しないといけない
    - 一時停止すると、サービスが停止してしまう
- 複数のコンテナを組み合わせたサービスをつくれない
    - できるのは1種類のコンテナをホストするだけ
    - Nginx + Railsみたいな構成をつくれない
- 自動デプロイに1USDかかる
- Arm非対応

特に、複数のコンテナを組み合わせたサービスをつくれないのは残念でした。
静的なコンテンツの配信やデータベースなどは、他のマネージドサービスを使うことが前提になっているのかもしれません。

## Ref

- [AWS入門ブログリレー2024〜AWS App Runner編〜 | DevelopersIO](https://dev.classmethod.jp/articles/introduction-2024-aws-app-runner/)
- [AWS App Runner はおもちゃなのでそれ以上の用途には使ってはならない - koudenpaのブログ](https://koudenpa.hatenablog.com/entry/2022/05/04/183326)
- [AWS App Runnerがそろそろ本番環境でも使い物になりそう｜AWS｜開発ブログ｜株式会社Nextat（ネクスタット）](https://nextat.co.jp/staff/archives/308)
- [AWS App RunnerとECS Fargateの違い・メリットとデメリット - 365歩のテック](https://go-to-k.hatenablog.com/entry/2022/02/13/035248)
- [App Runnerの特徴9つまとめてみた #AWS - Qiita](https://qiita.com/yoshii0110/items/ec209712cafa7547c680)
- [AWS App Runner を早速さわってみた【接続数でオートスケーリング・ゼロスケール（？）】 - 完全に理解した.com](https://www.kanzennirikaisita.com/posts/getting-started-with-aws-app-runner)
【Unity】Android Buildでエラー「mainTemplate.gradle file is using the old aaptOptions noCompress property definition which does not include types defined by unityStreamingAssets constant.」の対応


# はじめに
Unity2019で作られたAndroidプロジェクトをUnity2022にアップグレードしてBuildしたときに以下のエラーが発生しました。

```
UnityException: Error
mainTemplate.gradle file is using the old aaptOptions noCompress property definition which does not include types defined by unityStreamingAssets constant.
```

# 対応

以下を参考に修正しました。

https://support.unity.com/hc/en-us/articles/4408584577044-Why-do-I-get-errors-when-using-a-Gradle-file-with-an-old-aaptOptions-noCompress-property

https://discussions.unity.com/t/streamin-assets-files-optional-compression-for-android/930071

https://docs.unity3d.com/2022.3/Documentation/Manual/android-gradle-template-variables.html

プロジェクト内の"mainTemplate.gradle"を開き、以下の修正をしました。

修正前
```
    aaptOptions {
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
    }**PACKAGING_OPTIONS**
```
修正後
```
    aaptOptions {
        noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
    }**PACKAGING_OPTIONS**
```
AndroidViewのPager2で特定のページに移動する

# はじめに
今回はAndroidViewのPager2とTabLayoutを使った画面で特定のページに移動する方法を紹介していきます
### 本文
まず、Pager2で特定のページに移動するためのよくあるコードは下記のものかと思います
```kotlin
binding.viewPager.currentItem = targetPosition
```
しかし、今回の自分の場合はこれではうまく動いてくれませんでした。
そこで調べた結果理想通りに動いてくれたのが下記のコードです。
TabLayoutのコードはついでですが、`currentItem`に代入するのではなく、関数を呼び出してfalseを引数に追加してあげることで動いてくれました
```kotlin
binding.tabLayout.getTabAt(targetPosition)?.select()
binding.viewPager.setCurrentItem(targetPosition, false)
```
### 最後に
久しぶりにAndroidViewで実装をしていてすこし手間取ったのでこの記事を書いてみました
どなたかのお役に立てれば幸いです
画像生成やデザインのAI

## Runway
クリエイティブなプロジェクトを効率的に進めるためのAIツールやプラットフォームを提供するサービス

https://runwayml.com/

## Midjourney
AIによる画像生成ツールで、テキストプロンプト（指示文）を入力するだけで、オリジナルの画像を生成するサービス

https://www.midjourney.com/

## KREA
AIを活用して画像生成やデザインを行うプラットフォーム

https://www.krea.ai/

## Image to Video
画像を生成


## Midjourney
画像を生成、少しむずかしい
プロンプトをChatGPTで出力する
GTPsを作るといい


##　Gen-2(3)
画像を動かす
【個人用】AWS Solution Architect Associate対策ノート(S3編)

## S3のアクセス制御方法

### バケットポリシーを使う場合
・自分のAWSアカウントのIAMユーザーやほかのAWSアカウントに対して、オブジェクトもしくはバケットへの**アクセス権限を設定する**場合はこれを使う

・アクセスしてきたIPアドレスやドメイン名を見て、アクセス制御することもできる

### S3のACLを使う場合
・ほかのAWSアカウントに対して、オブジェクトもしくはバケットへの**読み取り/書き込み操作を許可する**場合はこれを使う

・アクセスしてきたIPアドレスやドメイン名を見て、アクセス制御することは**できない**

### 署名付きURLを使う場合
・非公開設定されたオブジェクトに対して、AWSアカウントを持ってないユーザーなどにアクセスさせたい場合はこれを使う

・署名付きURLとは、非公開オブジェクトにアクセスでき、ダウンロード/アップロードをこなせる有効期限付きのURLのこと

## オブジェクトロックの種類

### リーガルホールド
ロック期間が無限の設定

権限を持たないユーザーに対して、リーガルホールドが解除されるまでオブジェクトを読み取り専用にする

### リテンションモード
ロック期間が有限の設定

一定の期間だけ、オブジェクトを読み取り専用にする

期間中、ルート含むすべてのユーザーが読み取り専用になる**コンプライアンスモード**と、権限を持たないユーザーのみ読み取り専用になる**ガバナンスモード**の２種類がある

## ライフサイクルポリシー

S3バケット内のデータに対して、ストレージクラスの変更やオブジェクトの削除を自動化する機能

## S3のストレージクラス

### ①スタンダード
すぐアクセスできて、アクセス頻度の高いデータ向け

### ②STANDARD-IA
すぐアクセスできて、アクセス頻度の低いデータ向け(1ヶ月に１回くらい)

### ③One Zone-IA
すぐアクセスできて、アクセス頻度が低く(1ヶ月に１回くらい)、万が一ぶっ飛んで消えてもいいデータ向け

### ④Intelligent-Tiering
アクセス頻度が不明なデータ向け

### ⑤Gracier Instant Retrieval
すぐアクセスできて、4ヶ月に１回くらいアクセスするデータ向け

### ⑥Gracier Flexible Retrieval(ふつうのGracier)
アクセスに数分から数時間かかり、1年に１回くらいアクセスするデータ向け

### ⑦Gracier Deep Archive
アクセスに数時間かかり、１年に１回アクセスするかどうかもわからないデータ向け

## Gracierのデータ取り出しオプション

### ①標準取り出し
普通に取り出す

### ②迅速取り出し
追加料金を払って標準取り出しよりも早くデータを取り出す

### ③大容量(バルク)取り出し
バカでかいデータを取り出す
標準より時間かかるけど、料金は安い

## S3のデータ暗号化

### サーバー側の暗号化
データをS３に保存するときにサーバー側で暗号化する方法
S3にデータが保存されるタイミングでS3が暗号化する
複合化もS3が行う

・SSE-S3
複合化のカギはS3が管理する

・SSE-KMS
複合化のカギはKMSで管理する

・SSE-C
複合化のカギはユーザーで管理する

### クライアント側の暗号化
データをユーザーが暗号化してからS3に保存する方法
複合化もユーザーが行う

## マルチパートアップロード
S3に一度にアップロードできるファイルの最大サイズは5GBまで
もし5GBを超えるファイルをアップロードしたい場合は**マルチパートアップロード**を行う
単一のオブジェクトをパートと言われる複数のデータに分割して、S3にアップロードする

## S3 Transfer Acceleration
ユーザーとS3間の通信を高速化できる機能
データ転送時にエッジロケーションとAWSネットワークを使っているので、高速転送が可能
Webプロキシ

# キャッシュでネットワーク負荷を減少、性能改善
>キャッシュは応答時間を短縮し、ネットワーク負荷を減少させることで減少させることで性能を改善する。ブラウザがキャッシュされたページが新鮮であることが自分で判断できれば、すぐにキャッシュからページを取得でき、ネットワーク・トラフィックは全く発生しない。しかし、ブラウザがサーバーにページの鮮度で確認する必要がある場合でも短いメッセージを送信するだけので良いため、特に大きなページでは応答時間が短くなり、ネットワーク負荷が軽減される。

# サーバーから取得せずに済むが動的ページはキャッシュできない場合がある
>キャッシュをより効果的にする一つの方法は、複数のユーザー間でキャッシュを共有することである。そうすれば、あるユーザーがすでに取得したページを、他のユーザーが要求した時に返すことができる。ブラウザのキャッシュがなければ、両方のユーザーがサーバーからページを取得しなければならない。もちろん、暗号化されたトラフィックや認証を必要とするページ、プログラムによって返されるキャッシュできないページについてはこのような共有を行うことができない。特にプログラムによって作成される動的ぺーじは、増加しつつあるキャッシュが有効でないケースである。それでもなお、多くのユーザーに表示され、どのユーザーが要求しても同じに見えるWebページはたくさんある。

# ユーザー間でキャッシュして通信を近くで済ます
>Webプロキシ(Web proxy)は、ユーザー間でキャッシュをするために用いられる。プロキシとはユーザーなどの誰かの代わりに行動する代理人である。多くの種類のプロキシが存在する。例えば、ARPプロキシは他の場所にいる（したがって自分で応答できない)ユーザーに代わってARP要求に応答するが、ユーザー間で共有されるため、ブラウザよりもかなり大きなキャッシュを持つ。

# 企業やISPがプロキシを使って要求を高速化させる
>プロキシの使用における典型的な設定例は、組織がそのすべてのユーザーに対して一つのWebプロキシを運用する物である。組織は企業の場合もISPの場合もある。どちらもユーザーのWeb要求を高速化し、必要帯域幅を減少させることで利益を得る立場にある。家庭のユーザーにとっては、使用料によらない定額制料金が一般的であるが、企業やISPの場合、使用する帯域幅に応じて課金されることがほとんどである。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
Jenkinsでのビルド実行時に「パス~の一部が見つかりませんでした」というエラーが発生した場合の対処法

## はじめに
JenkinsからWindows環境にてソースコードをビルドする際に、「パス~の一部が見つかりませんでした」というエラーが発生することがあります。この記事では、このエラーの原因と対策について解説します。

# 事象
ビルド実行時に以下のようなエラーメッセージが表示されることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963503/fb51a147-3cdc-622b-35e5-4bfa7e419c14.png)

# 原因
このエラーの原因として、コピー先の絶対パスの文字数の合計が255文字を超えていないか確認してください。Windowsのファイルシステムには、パスの長さが255文字以内という制限があります。この制限を超えると、ファイルやフォルダへのアクセスや操作が正常に行えなくなります。

# 対策
このエラーを解消するためには、Jenkinsにてクローンしたソースコードの絶対パスの文字数が255文字以下になるように設定を変更します。以下の手順を実施してください。

## 1. Jenkinsジョブ名を短縮する
コピー先のパスには、Jenkinsジョブ名が含まれます。ジョブ名が長すぎる場合は、ジョブ名を短くすることでパスの文字数を減らすことができます。

### 手順:
1. Jenkinsにて該当するジョブを選択し、設定画面を開きます。
2. ジョブ名を短縮して保存します。

## 2. 短縮したジョブの表示名を短縮前のジョブ名に設定する
ジョブ名を短縮した結果、表示名がわかりにくくなるのを防ぐために、表示名を短縮前のジョブ名に設定します。

### 手順:
1. ジョブ設定画面の「一般情報」セクションに移動します。
2. 「表示名」フィールドに短縮前のジョブ名を入力します。
3. 設定を保存します。

これにより、ユーザーがジョブを簡単に識別できるようにしつつ、パスの文字数の制限を満たすことができます。

# まとめ
Jenkinsで「パス~の一部が見つかりませんでした」というエラーが発生した場合、その原因の１つとして絶対パスの文字数が255文字を超えている可能性があります。この問題を解決するためには、ジョブ名を短縮し、表示名を短縮前のジョブ名に設定することで、パスの文字数を制限内に収めることができます。

これらの対策を実施することで、エラーを回避し、ビルドを正常に進行させることができるでしょう。この記事がお役に立てば幸いです。エラーの解消に向けて、ぜひ手順を試してみてください。
プライベートサブネットで起動するEMRクラスターが異常終了したときの解決方法

本記事を閲覧いただき、ありがとうございます。
駆け出しクラウドエンジニアの青木です。
今回は私がEMRクラスターの異常終了時に解決した方法についてです。

参考サイト(公式)：
https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-vpc-host-job-flows.html 

## エラーの内容
プライベートサブネットに起動する6つのEMRクラスターの起動を試みたところ、4つが「**INTERNAL_ERROR** (内部エラー)」、2つが「**BOOTSTRAP_FAILURE**(ブートストラップエラー)」表示となり、6つすべてのEMRクラスターが異常終了となってしまいました。

おそらくネットワーク周りのエラーではあるのだろうと思ったのですが、具体的にどこが悪いのか見当がつかなかったためサポートに問い合わせを行いました。

## 実行条件
（エラーの解消とは関係がない部分ですが、一応掲載）
今回、私の動作環境ではEMRクラスターはDataPipelineから呼び出しを行っていました。

具体的な流れとしては、
DataPipelineにて「EmrActivity」オブジェクトを実行 →「EmrCluster」オブジェクトのEMRを起動
以上です。


## エラーの解消方法
EMRが起動するサブネットのVPCに設定した**DHCPオプションセット**の設定が誤っていました。

詳しくは、
① 動作しているリージョンが「**US East (N. Virginia)**」であれば、DHCPオプションセット内「domain name」を「**ec2.internal**」に設定する。
　 それ以外のリージョンであれば、「domain name」を「**use リージョン名.compute.internal**」（例: use us-west-2.compute.internal）
② DHCPオプションセット内「domain-name-servers」を「**AmazonProvidedDNS**」に設定する。

私は以上で解決しました。

また、プライベートサブネットで起動するための要件である、S3へのアクセス経路についても、VPCエンドポイントの設定に問題があるとエラーとなるようです。
参考サイト(公式)：
https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-clusters-in-a-vpc.html#emr-vpc-private-subnet 

最後までお読みいただき、ありがとうございました！
IntelliJを使い、gradleでjarファイルを作成する方法。【備忘録】

IntelliJで、GradleでJarファイルを作成する方法。
いつも忘れて混乱するから、備忘録。
ちなみに、ビルドシステムで、IntelliJを選ぶと、Jarファイルを作るのが大変。
最初から、GradleかMavenを選びましょう！

1
GradleとGroovyを選ぶ。（Kotlinを選ぶと、Build時に謎のエラーがでる。）
![名称未設定10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/e172db90-19a4-a845-33e1-b76031e0dbbc.png)

2
サンプルコードは、下記。
```Main.java
package org.example;

class Main{
    public static void main (String[] args) {
        System.out.println("Hello Naiveprince1227");
    }
}
```
３
build.gradleファイルの追加部分は下記。

```build.gradle

//追加する
jar{
    manifest{
        attributes 'Main-Class' : 'org.example.Main'//クラス名を指定する
    }
}
//追加ここまで
```

全体は、こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/749d067f-73b8-6c27-fe90-25e8af1f0bf4.png)

４
ビルドする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/ec80f207-04bd-089d-b657-e6ec76737256.png)

５
ビルド完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/7e15e32e-562a-f8ce-c6a6-a2947e49b844.png)

６
jarファイルが作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/2b2dc598-270f-68d7-7cc0-d21438255dbf.png)

７
ターミナルで動作確認
こんな感じでターミナルで動きます。
```
test_user@test-mac naiveprince1227r2 % cd build
test_user@test-mac build % ls
classes         generated       libs            tmp
test_user@test-mac build % cd libs
test_user@test-mac libs % ls
naiveprince1227r2-1.0-SNAPSHOT.jar
test_user@test-mac libs % java -jar naiveprince1227r2-1.0-SNAPSHOT.jar
Hello Naiveprince1227
test_user@test-mac libs % 
```
Unity6でEnter Play Mode Settings


Unity6になってちょっとだけ変わったので書いておきます。

# Enter Play Modeとは
Unityエディター上で実行するときに普通は少し待たされますね。
これはUnityが実行するたびにReload DomainというものとReload Sceneというものをしているためです。
- Reload Domain
C#スクリプトを再起動しています。
C#スクリプトを編集するたびにUnityの画面が少し固まりますが、それを実行の度に行っています。
- Reload Scene
シーンを再起動しています。

しかし、これらの処理は設定からなくすことができます。
そうすることで実行が劇的に早くなり、快適なゲーム開発をすることができます。

# やりかた
Edit > Project Settings > Editorを開いてください。
すると、下の方にEnter Play Mode Settingsという項目があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/73e3e92d-96a3-2547-93bd-a4e5e4adaaca.png)

デフォルトはReload Domain and Sceneになっていますが、以下の4つの選択肢から選ぶことができます。

- Reload Domain and Scene
- Reload Scene only
- Reload Domain only
- Do not reload Domain or Scene

基本的にはDo not reload Domain or Sceneでいいんじゃないかと思います。
これでUnityエディタ―上での実行を高速化することができました。

# 最後に
こちらが公式マニュアルになります。

https://docs.unity3d.com/6000.0/Documentation/Manual/configurable-enter-play-mode.html
会計額を表示する表示するプログラムを作成しよう

```java:CalcCakeSum
class CalcCakeSum{
	public static void main (String[] args){
		
		double cakeTotalAmount = 0; // ケーキの合計金額
		
		for ( int i = 0 ; i < args.length ; i+=2){
			
			String cakeName = args[i]; // ケーキ名
			int count = Integer.parseInt(args[i + 1]); // 個数
			int cakePrice = 0; // ケーキの値段
			
			// 商品ごとの価格を判定
			if (cakeName.equals("ショートケーキ")){
				
				cakePrice = 320;
				
			}else if (cakeName.equals("モンブラン")){
				
				cakePrice = 350;
			
			}else if (cakeName.equals("チョコレートケーキ")){
				
				cakePrice = 370;
				
			}else if (cakeName.equals("いちごのタルト")){
				
				cakePrice = 400;
				
			}else if (cakeName.equals("チーズケーキ")){
				
				cakePrice = 300;
			
			}
			
			// ケーキの合計金額
			cakeTotalAmount += cakePrice * count;
			
		}
			
		// 合計金額が1000円以上の時、20％引き
		if ( cakeTotalAmount >= 1000 ){
			
			cakeTotalAmount  = cakeTotalAmount * 0.8;
			
		}
		
		// 税込みの値段(8％)
		cakeTotalAmount  = cakeTotalAmount * 1.08;
		// 小数点以下切り捨て
		cakeTotalAmount  = Math.floor(cakeTotalAmount);
		System.out.println("合計金額は" + (int)cakeTotalAmount + "円です。");
		
	}
}
```

今回は、ケーキの注文を受け付け、コマンドライン引数で入力したケーキの合計金額を出すプログラムに挑戦した。

～～～今回の学び～～～
・ケーキの合計金額をcakeTotalAmountという変数を使って、int型ではなくdouble型を使用した。
└なぜなら「合計金額が1000円以上の時、20％引き」と「税込みの値段(8％)」を適用させないといけなかったから。そして最後に出力するときには1000.0円のような表記だとおかしいので少数から整数に直す必要があった。
```java:四捨五入
cakeTotalAmount  = Math.round(cakeTotalAmount);
```
```java:小数点以下を切り捨て
cakeTotalAmount  = Math.floor(cakeTotalAmount);
```
Math.floor()を使って四捨五入しないようにして、System.out.println()の中に(int)を付けることで整数とすることに成功。

・==と.equals()の違い
└int型などの基本データ型の場合、値が等しいかどうかは==演算子を使用する。配列や文字列などの参照型の場合、==演算子は同じオブジェクトを参照している場合にtrueとなるため、例えば、2つの文字列が同じ値であっても、参照している文字列のオブジェクトが異なる場合はfalseとなる。
```java:
String msg1 = "Hello";
String msg2 = new String(msg1);

System.out.println(msg1 == msg2);  // false
```
2つの文字列が同じ文字列オブジェクトを参照している場合は==演算子はtrueとなる。
```java:
String msg1 = "Hello";
String msg2 = msg1;

System.out.println(msg1 == msg2);  // true
```
2つの文字列に格納されている値が等しいかどうかを調べるには、Stringクラスで用意されているequalsメソッドを使う。以下は2つの文字列が格納している値が同じなのでtrueが返されました。このように文字列と文字列の値を比較する場合には、Stringクラスのequalsメソッドを使用したほうがいい。
```java:
String msg1 = "Hello";
String msg2 = new String(msg1);

System.out.println(msg1.equals(msg2));  // true
```
2つの変数に同じ文字列リテラルを格納した場合は==演算子でもtrueとなりますが、それ以外の方法で文字列を作成した場合にはfalseとなるためです。
```java:
char[] c = {'A', 'B', 'C'};
String msg1 = new String(c);
String msg2 = new String(c);

System.out.println(msg1 == msg2);       // false
System.out.println(msg1.equals(msg2));  // true
```

参考：==と.equals()の違いhttps://www.javadrive.jp/start/string/index4.html#section1
React

# Reactとは
Facebook（現在の Meta）によって開発された JavaScript ライブラリで、ユーザーインターフェース（UI）を効率的に構築するためのもの。柔軟性、巨大なエコシステム、継続的な進化により、将来もウェブおよびモバイル開発において主要な技術であり続ける可能性が高い

## 主な特徴
- コンポーネントの設計：UIを小さなコンポーネントに分割
- 仮想DOM：効率的なレンダリングを実現
- 状態管理：Reactの`useState`や`useRuducer`でコンポーネントの状態を管理
- シングルページアプリケーション（SPA）に最適

:::note info
コンポーネントとは
React において UI（ユーザーインターフェース）を構築するための基本的な単位、画面の特定の部分を独立して定義・管理できる、小さな再利用可能なコードの塊
:::

:::note info
レンダリングとは
プログラムやデータを元にして、画面上に視覚的な結果を生成するプロセスのこと。特に、ウェブやアプリ開発においては、ユーザーが実際に目で見て操作する画面を描画する工程を指す
:::

:::note info
`useState`とは
React の フック (Hooks) のひとつで、関数コンポーネント内で状態 (state) を管理するために使われる。れにより、クラスコンポーネントでしか扱えなかった状態管理が、関数コンポーネントでも簡単に扱えるようになる
:::

:::note info
`useReducer`とは
React の フック (Hooks) のひとつで、複雑な状態管理を簡単に行えるようにするためのもの、`useState`と同様に状態管理に使用さるが複数の状態や複雑な更新ロジックを扱う場合に適している
:::

:::note info
シングルページアプリケーション（SPA）とは
1つのHTMLファイルを元に動的にページを更新するウェブアプリケーションのアーキテクチャのこと、伝統的なウェブサイトのようにページ全体をサーバーから再読み込みすることなく、部分的にコンテンツを変更してユーザーに表示する仕組みを持っている
:::

## TypeScript と React を組み合わせる理由
React のプロジェクトで TypeScript を使うと、コードの保守性が向上し、バグを事前に防ぐことができる

### メリット
- Props（プロパティ）の型を明確に定義できる
- コンポーネントの再利用性が向上
- 大規模プロジェクトのチーム開発に最適

:::note info
Props（プロパティ）とは
React のコンポーネントにデータを渡すための仕組み、Props を使うことで、親コンポーネントから子コンポーネントへデータや値を渡すことができる。Props は 読み取り専用（不変）で、コンポーネント内で直接変更することはできない。`useState`と組み合わせて動的にデータを扱うことで、柔軟な UI を構築可能
:::

## React の市場需要
### 1.採用企業の増加
React は企業での採用が非常に多く、特にフロントエンド開発の求人市場で最も需要が高いスキルのひとつ

### 2.長期的な需要
モダンなウェブ開発やモバイルアプリ開発において、React は依然として選ばれる技術
React エコシステムの広がりにより、学習コストが低く、参入しやすい


## React の課題
### 1.エコシステムの複雑さ
多くの周辺ツール（Redux、React Router、状態管理ツールなど）を学ぶ必要がある
初心者には敷居が高いと感じられることがある

### 2.技術の進化が早い
React 自体の更新に加え、周辺技術も頻繁に変化するため、キャッチアップが必要

### 3.SSR（サーバーサイドレンダリング）の進化との競合
Next.js などのフレームワークが強力だが、標準的な React だけでは不十分な場合もある