OmniAICreator/Qiita-1.07M huggingface dataset:
ACDLを提唱します。その17

# 概要
ACDLとは、アプリは、クラウド、大切なデータは、ローカルです。
素晴らしいアプリ見つけたので、codepenに上げてみた。

# 参考にしたページ

https://qiita.com/tetsutakamurata76/items/5d7d2e0ed2fe542b5169


# 成果物

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="JjgOBJQ" data-pen-title="webrtc cam" data-user="ohisama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ohisama/pen/JjgOBJQ">
  webrtc cam</a> by ohisama (<a href="https://codepen.io/ohisama">@ohisama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


https://run.plnkr.co/plunks/nToWsuh4Wb3buuDx/


以上
AWS LambdaでOpenAIのライブラリを使おうとして「No module named 'jiter.jiter'」のエラー

## 環境
- AWS Lambda
- Python 3.12

## 先に解決策
openaiのバージョンを下げる(1.39.0にしたらエラーにならなかった)

## 何が起こったか
案件でAWS Lambdaを使ってChatGPTに投げたいということがあった。それこそchatGPTやQiitaを見ながら環境構築していきました。
- [AWS Lambda(Python)からOpenAIのGPT4のAPIを呼び出してみた](https://qiita.com/nabata/items/903a2ebff8e44516598e)

そこではじめは`Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core`というエラーになったのですが、これは解決策が載っていたので特に問題なく。
- [AWS Lambda Layers + OpenAI でつまづいた件](https://zenn.dev/galapagos/articles/a222e38a32f4ba)

次にタイトルにもある「No module named 'jiter.jiter'」と出ました。これはopenaiのライブラリで使っているらしく、レイヤーの中身を見ても確かにある。個別にjiterをrequirements.txtに書いても同じエラーになる。なぜだろうと調べたら以下の記事が出てきました。
- [Install of openai is failing with some issues related to jiter](https://github.com/chaquo/chaquopy/issues/1227)

これは
- Chaquopyを使用してAndroidアプリにOpenAIライブラリをインストールしようとした際、jiter という依存パッケージのインストールに失敗する
- jiter パッケージは Rust で書かれており、Chaquopy が現在 Rust のサポートを十分に提供していないため

ということが原因と書かれています。今回私の件で起きたことと全く同じ環境ではないのですが、解決策として
- OpenAI の古いバージョンを使用する
  - jiter に依存しない OpenAI の古いバージョンを使用することで問題を回避できる可能性がある

とあり、さらに
- 一部のユーザーは OpenAI バージョン 1.39.0 を使用することで問題を解決できた

とあったので、1.39.0にしたらエラーがなくなりました。
CodeWars オススメ問題 #9

# はじめに

個人的に好きなアルゴリズム学習サイト「CodeWars」の問題をシェア。

週1くらいのペースで、全10回を目指す予定。

:::note
CodeWarsはいいぞ！の紹介は[こちら](https://qiita.com/kohki_takatama/items/2ae2808b931e943262b8)

CodeWarsの始め方は[こちら](https://qiita.com/javacommons/items/7c473cda7825ab99e08c
)
:::

今回は（主観ですが）Rubyの特徴を活かせる問題です。

# オススメ問題

https://www.codewars.com/kata/514b92a657cdc65150000006/ruby

### 問題
1. 数字が与えられます
1. その数字以下の、3と5の倍数を求めます
1. 求めた倍数の合計を返します

※15など、3と5両方の倍数は、一回だけカウントします
※負数の場合はゼロを返します


```rb
solution(10) # => 23
# 10未満の、3, 5の倍数の合計
# 3, 5, 6, 9の合計 => 23
```

### 難易度
分類は 6kyu です。

アルゴリズム問題として手応えがあるレベル。
ベタ書きもできますが、ぜひきれいなアルゴリズムを目指していきたい。

# オススメの回答
「評価が高い回答」の中から、学びの多い回答をピックアップしてご紹介。

:::note
<details><summary>模範解答</summary>

```rb
def solution(n)
  sum_up_to = -> i { i * (1..((n - 1) / i)).sum }
  sum_up_to.(3) + sum_up_to.(5) - sum_up_to.(15)
end
```

丁寧に書くと以下の形ですね
```rb
def sum_up_to(n, i)
  # (n - 1) / i の範囲を作成し、その範囲の合計に i を掛ける
  maximum = ((n - 1) / i).floor
  (1..maximum).sum * i
end

def solution(n)
  # sum_up_toメソッドを使って3、5、15の倍数の合計を計算
  sum_up_to(n, 3) + sum_up_to(n, 5) - sum_up_to(n, 15)
end
```

アルゴリズムを解説します。
与えられた数が`10`である場合を考えます。

3の倍数は`3, 6, 9`
5の倍数は`5`

これはそれぞれ、以下のように変換できます。
`3*1, 3*2, 3*3` = `3*(1+2+3)`
`5*1`

よって、`x*(1..n)`という共通化ができます。

次に、`n`を求めましょう。

10に対し、3の倍数のnは3です（3 * 3 = 9が最大のため）。
これは`10/3 => 3.3333 => 3（切り捨て）`で求まります。

ここまでの処理をまとめたものが、メソッド`sum_up_to`です。

この`sum_up_to`を使用し、3と5の倍数を求め、2回カウントされている15の倍数を引いて答えを求めます。

---

短いコードの方では、`floor`の記述がありません。
これは`range`オブジェクトの`step`のデフォルトが`1`に設定されていることを利用した短縮です。

詳しくは[こちら](https://zenn.dev/haneru/scraps/41a653010a0883)

</details>
:::





:::note
<details><summary>短いが不足のある解答</summary>

```rb
def solution(number)
  (1...number).select {|i| i%3==0 || i%5==0}.inject(:+)
end
```

短く読みやすいコードですが、`number`が負数であるときに正常に動作しません。

問題文でも「負数の場合はゼロを返す」と示されている以上、負数を無視したコードは不足があると言わざるを得ません。

</details>
:::

# おわりに
以上、CodeWarsオススメ問題でした。


オススメ問題・解法など、ぜひコメントお待ちしております！
PythonでRPGをつくる！#1

記事を書くのはこれが初めてですが、できるだけ見やすいように努力します。

# 環境
プログラムを書く環境
・「IntelliJ IDEA Community Edition」に、Pythonプラグインを入れている。

ドット絵を描く環境
・「edge」を使用（ブラウザのedgeではない。関係ないが私はfirefox派。）

# とりあえずmap作る
といってもやっぱりmap editor的なものが欲しいので作ります。
マップデータは
```
map_deta = [[0,0,0],[0,0,0],[0,0,0]]
```
って感じで保存するつもりです。
これを元に作りました。

~~これは本題じゃないからこれで許して~~
気が向いたらmap editorについての記事書きます。

・・・

そういえばmap editorがあったとしても、マップタイルがないとだめですね。
なので描きました。
~~これも本題ではないので割愛。~~

# RPGの基礎作っていくぞー！
とりあえず画像を簡単に読み込めるようにしました。
```
def load_image(path):
    image = pygame.image.load(path)
    return pygame.transform.scale(image, (tile_size,tile_size))
```
こんな感じ。
説明書くと、
```
変数名 = load_image(ここに画像名)
```
で変数にその画像が保存される（保存とはちょっと違う気がしなくもないが）
まあ、画像が使いやすくなるってわけよ。

ちなみに「ここに画像名」ってところに"imgages/mountain.png"を書くとimagesファイルにあるmountain.pngを保存になる。
# がんばる
まだここまでしかプログラム考えてないのでいい感じのところまで行ったら#2として書きます。
私の転職活動戦略

## はじめに
転職ドラフトのイベントが開催されていたため、
「今年の転職活動で考えたこと・やったこと」をテーマに投稿します。
O’Reilly Japanの本が欲しいでーす。

ざっくりとした私の経歴としては、
今まで転職は4回経験しており現在で5社目です。

今までの経験を踏まえてお話しできればと思います。

## 気をつけていたこと
- 離職前に転職先を決めること
- SES企業だけには転職しないこと

転職活動中にこの２点を必須条件にしていました。

### 離職前に転職先を決めること
離職後に転職活動を始めてしまうと、
すぐに内定が出なかった際に焦りが生まれます。

開発に触れていない期間が伸びるにつれ技術力の低下を心配し、
早く転職先を見つけなければならないとプレッシャーに感じました。

- 空白期間が伸びる
- 貯蓄が減る
- 技術力の低下
- 周りのエンジニアの成功体験を聞いて自分と比較する

などなど焦る要因はたくさんあります。

こんな状態では、***転職先に妥協し本来入りたくないような企業へと転職してしまいます。***

### SES企業だけには転職しないこと
私は2社のSES企業に在籍していました。
どちらも「他社SESとは違い正当に評価します」と謳っていましたが、
きちんと評価されたことは1度もありませんでした。

また、常駐先企業からの単価の増額は必ずどこかで頭打ちになると思っています。
そのため、自社の昇給も限界が来るため長く働ける環境とは思えませんでした。

定年まで働けるかという意味でも私は無理だと思ったので、
どうしても転職前提で入社することになります。

## やっていたこと
- 業務時間外に学習をする
- 複数の転職サービスを利用する

### 業務時間外に学習をする
社会人の学習時間は週平均7分、1年のうち1度でも学習に着手した有業者はたったの4割です。
業務時間外に学習している社会人は希少です。

今現在の業務が転職先で通用しないことは多々あると思いますが、
学習することで自分に付加価値をつけるべきです。

私の場合、競プロやQiitaへの記事投稿、資格取得に力を入れていました。

### 複数の転職サービスを利用する
転職サービスは複数利用した方が絶対に良いです。
持っている求人が本当に異なります。

SESの求人しかなかったり、
転職ドラフトだと逆に受託開発や自社内開発がメインだったり。

私の場合はPaiza転職がかなり合っていて、直近の転職もPaiza経由でした。
競プロの解答結果は企業も閲覧できるため、ある程度の技術力はわかってもらえるはずです。

## 最後に
転職を考えてる方に、
少しでもタメになったら幸いです。

励みになるので、いいねお願いします。
励みになるので、いいねお願いします。
ゼロから始めるAIシステム開発 #05 「プロンプトエンジニアリング」

## 入門書3章「生成AIアプリ開発手法」
たびたび同じ画像で申し訳ないですが、こちらの入門書の第3章へ。今回は前半。
**Amazon Bedrock 生成AIアプリ開発入門 ［AWS深掘りガイド］**
https://amzn.asia/d/co7MB5S
![2240915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885923/644c78f6-022e-6115-34f4-de9085a66320.jpeg)

## プロンプトとは
生成AIモデルとのやり取りに使用する文字列のこと。以下の3種類がある。
### システムプロンプト
AIの口調や役割など、システムとして指定しておきたいことを記述するプロンプト。2章で実践したSDKによるAPI呼び出しを使用する。一つだけ指定可能。
### ユーザープロンプト
AIの利用者が入力する部分。
### アシスタントプロンプト
AIの出力結果。
## トークンとは
AIの内部で処理する文字列の単位のこと。トークン数によって生成AIの利用料金が決まる。
## トークンの分割
トークナイザーという処理によって文字列をトークンに分割する。以下ではJurassic-2のトークナイザーを利用。
```python:1_ai21lab-token.py
from ai21_tokenizer import Tokenizer
tokenizer = Tokenizer.get_tokenizer()
text = "Amazon BedrockはAWSの生成サービスです。"
encoded_text = tokenizer.encode(text)
tokens = tokenizer.convert_ids_to_tokens(encoded_text)
print(tokens)
```
- モジュールのインポート
- トークナイザー生成
- トークナイザーでテキストをエンコード
- トークンに分割して出力
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885923/7cc0d212-f47f-2432-796e-2f48bed26531.png)
アルファベットは単語や略称で区切られているが日本語は句読点も含めて一文字ずつで区切られるようだ。空白も＿で表現されるので情報が欠落することはない。
## トークン数を算出
BedrockにはAPIを呼び出す前にトークン数を算出する方法はないが、生成AIモデル開発元が提供するSDKを使うと事前に確認できる。
```python:3_ai21lab-token-count.py
from ai21_tokenizer import Tokenizer
tokenizer = Tokenizer.get_tokenizer()
encoded_text = tokenizer.encode("Amazon BedrockはAWSの生成AIサービスです。")
print(len(encoded_text))
encoded_text = tokenizer.encode("Amazon Bedrock is an AWS generative AI service")
print(len(encoded_text))
```
- モジュールのインポート
- トークナイザー生成
- トークナイザーでテキストをエンコードして長さを出力×2
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885923/1bad105b-ef83-a3cd-e8a6-e3360efcd12f.png)
トークン数は**同じ文字列でもモデルによって異なり、日本語のほうがトークン数が多くなる傾向にある。**
日本語が一文字ずつに分割されるのはトークナイザーが日本語に最適化されていないためであり、日本国内ではトークナイザーを日本語に最適化した生成AIが開発されているとのこと。
ELYZA社
https://elyza.ai/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885923/f061c0fb-1291-8ba8-f92e-29936994c5eb.png)
東京工大のSwallow
https://www.titech.ac.jp/news/2023/068089
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885923/c241a9d4-fba8-0fdf-0ed4-7c21ca11f765.png)
## プロンプトエンジニアリング
プロンプトを使用して生成AIに指示を出す手法をプロンプトエンジニアリングと呼ぶ。
### タスクを明確にする
「あなたは作詞家です」と役割を与えたり「科学的な原理を示して」など求める回答の傾向を指定したりできる。
### ドキュメントを提示する
ドキュメントを提示してその内容に基づいた回答を生成させる。引用部分を＜Document＞タグで囲うのが一般的だがタグの名前に決まりはない。引用部分以外の付加情報も記述することができる。
### 詳細なルールを指定する
「重要な部分を箇条書きにして」などのルールを細かく指定することができる。
### 例を示す
＜example＞などタグを使って回答の形を指定できる。
### 順序立てて考えさせる
回答だけ、あるいは回答に至るまでの過程を表示させたりできる。過程と結果を別タグで分けて表示も可能。

## プロンプトエンジニアリングのガイドライン
Bedrockのユーザーガイドではさまざまな生成AIのプロンプトエンジニアリング手法が紹介されている。
https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/prompt-engineering-guidelines.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885923/0acc1575-0eef-5a60-1152-a8d692657668.png)
Anthropic社提供のガイドラインではプロンプトのサンプルテンプレをまとめた**プロンプトライブラリ**も用意されている。
https://docs.anthropic.com/en/prompt-library/library
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885923/70f85ccb-308d-4641-40d7-00f9f447eb52.png)
## 次回へ
今回で入門書は全体の30％くらいまで進んだ。次回は3章のハンズオンで**実際にアプリを作るところまで行く**らしい。ほんとに？？
Firebase App Distributionを用いてUnityで作ったモバイルアプリのテストをする。

## 1. ビルドする
UnityのBuild Settingsからアプリケーションをビルドし、apkファイルを入手する。
## 2. Firebase App Distributionの設定
### 2.1. 入手したapkファイルをアップロード
![スクリーンショット 2024-10-25 095301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896631/82695b0c-eba5-6f88-1b60-aaddc6394423.png)
APKファイルをドラッグ&ドロップするか参照からファイルを選択する。
### 2.2. テスターを追加する
![スクリーンショット 2024-10-25 100938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896631/00af9130-7b3b-c7f0-4f98-7f1a4d451163.png)
グループを追加から新しいグループを作成し、テスターを追加からテスターのメールアドレスを追加する。
## リリースする
Firebase App Distributionのリリースから作成したグループにアプリをリリースする。
Gitクローン、ブランチ作成と削除、特定ファイルマージなどのよく使うコマンド一覧(kosekiメモNO7)


# はじめに
gitでバージョン管理するのは最強です、
こちらがよく使っているものをメモしておきます。

# 動作環境
git version 2.41.0.windows.3

※基本コマンドのため、gitバージョンを無視しても大丈夫かと思う。


# Gitクローン(From codecommit)
codecommitのコマンドラインでのクローン。
前提としては、codecommitサービスにアクセスできるIAMユーザーであること。
- koseki-memo: aws profile
- testrepo: aws codecommit repository name
```shell:git.bash
git clone codecommit://koseki-memo@testrepo
```
# Git alias設定
- 自分がよく使ってるコマンド
```shell:git.bash
git config --global alias.st 'status'
git config --global alias.b 'branch'
git config --global alias.l 'log'
git config --global alias.ck 'checkout'
```
# Gitブランチ作成と削除
- ローカルブランチ一覧取得
```shell:git.bash
git branch
```
- リモートブランチ一覧取得
```shell:git.bash
git branch -r
```
- ローカルブランチと該当ブランチ対応するリモートブランチの状態を確認
```shell:git.bash
git branch -vv
```
- リモートからローカルにチェックアウト
```shell:git.bash
git checkout -b localBranchNm origin/branchNm
```
- ローカルブランチ名変更
```shell:git.bash
git branch -m oldNm newNm
```
- ローカルブランチ削除
```shell:git.bash
git branch -d oldNm newNm
```
- リモートブランチ削除
```shell:git.bash
git push origin --delete remoteBranchNm
```
- ローカルブランチをリモートにUP
```shell:git.bash
git push origin localBranchNm
```

# Gitマージ
- 特定ファイルをマージ
```shell:git.bash
# git checkout [取り込み元ブランチ]　-- "対象ファイル"
git checkout devBranch -- "koseki-memo.java"
```

- コミット履歴IDよりマージ
```shell:git.bash
git cherry-pick commitID
```

# Git履歴確認
- 特定コミットIDより更新ファイルを確認
```shell:git.bash
git show commitID | grep "diff --git"
```
- 特定ファイルのログを確認
```shell:git.bash
git log -- "koseki-memo.java"
```

# Git pull
git pullはマージコミット履歴を作成するので、
git pull --rebaseを利用してください。

違いは以下の記事を参照できるかと思います。
[知っていたら実務で最強！　git pullとgit pull --rebaseの違い](https://qiita.com/Hashimoto-Noriaki/items/6e183f738289cf288b23)

# 参考文献
[Git | Book](https://git-scm.com/book/zh/v2)

***
以上
投稿 117 Rubyのバージョンによるエラー文 2024/10/25

Ruby環境構築の際、このようなエラーが出ました。



---
ERROR:  Error installing rails:
	There are no versions of irb (~> 1.13) compatible with your Ruby & RubyGems. Maybe try installing an older version of the gem you're looking for?
	irb requires Ruby version >= 2.7. The current ruby version is 2.6.10.210.
 ---

上記エラーは、インストールされているRubyのバージョンが古いため
Railsのインストールがうまくいっていないことにありました。
Rails 7.xはRuby 2.7以降が必要ですが、
現時点でインストールされているRubyのバージョンは2.6.10です。


解決策: Rubyをアップグレードする
rbenvでRubyをインストールして管理: rbenvを使用してRubyの新しいバージョンをインストール


利用可能なRubyバージョンを確認:
```
rbenv install -l
```
このコマンドで利用可能なRubyのバージョンが一覧で表示されます。
Ruby 3.1.0をインストール:
```
rbenv install 3.1.0
```
インストールしたRubyを設定:
```
rbenv global 3.1.0
```
Rubyのバージョンを確認:
```
ruby -v
```
Railsのインストール:
Ruby 3.1.0が正しくインストールされたら、再度Railsをインストールします。
```
gem install rails
```
Railsが正常にインストールされたら、次のようにバージョンを確認できます。
```
rails -v
```
これで、Railsのセットアップが完了しました！
投稿 116 Mac OSでのrailsコマンドが認識されない場合 2024/10/24

本日の勉強時間　3H


Rubyのバージョンを確認: 正しいRubyバージョン (3.1.0) が使われているか確認します。以下のコマンドを実行してください。
```
rbenv global 3.1.0
```
その後、Rubyのバージョンを確認します。
```
ruby -v
```
rbenvを再ハッシュする: rbenv を再ハッシュして、rails コマンドが使えるようにします。次のコマンドを実行してください。
```
rbenv rehash
```


※ここでいう再ハッシュとは
ハッシュ法において、衝突が発生したときに別のハッシュ値を計算して格納する処理です。﻿
ハッシュ法とは、キーの値をデータが格納される位置に直接関連づける手法です。ハッシュ法では、データの個数によらずに挿入、探索、削除の操作を一定時間で実行できます。





Railsを再インストール: もし rails がまだ認識されない場合、もう一度Railsをインストールしてみましょう。
```
gem install rails
```
Railsのバージョンを確認: 最後に、再ハッシュ後に以下のコマンドでRailsのバージョンを確認してください。
```
rails -v
```





-おわりに,,,-



投稿者の場合、最初の段階ではRailsがシステムに正しくインストールされていなかったため
```
rails-v
```
コマンドを実行したときに
「Rails is not currently installed on this system.」
というエラーメッセージが表示されました。
その後
```
rbenv global 3.1.0
```
でRubyのバージョンを設定。
```
rbenv rehash
```
でコマンドラインの環境を再構築しました。
これにより、gem install rails で最新のRailsバージョンをインストールすることができ、最終的に rails -v でRailsのバージョンが正しく表示されるようになりました。


投稿者は現在、Ruby 3.1.0 と Rails 7.2.1.2 が正常にインストールされました！
axiosのinterceptorを使って、submitするdataを全てスネークケースにする方法

# はじめに
みなさん、こんにちは **torihazi**です

今日は実務でタイトルのことをやる機会があって、

色々と調べたのでそれを書き残そうかと思って今書いてます

# 経緯
frontendとbackendでキャメルケースかスネークケースかで違うと思います。

frontはuserDataみたいなキャメルで、backはrailsだとuser_dataみたいな

スネークケースですよね。

今までもスネークケースにする処理はfrontでやっていたり、

それか
```
user_data: {
  name: data.hoge
  age: data.age
  ・・・
}
```

みたいにしてわざわざベタ書きしている箇所もあり統一性がありませんでした。

あと何よりも保守性がよろしくない。

ということでこれを機に手をつけたというわけです。

# どうやるか

```ts
import { snakeCase } from "change-case";

const METHOD_WITH_PAYLOAD = ["post", "put"];

const convertToSnakeCase = (obj: any): any => {
  if (Array.isArray(obj)) {
    return obj.map(convertToSnakeCase);
  } else if (obj !== null && typeof obj === "object") {
    return Object.entries(obj).reduce(
      (result, [key, value]) => ({
        ...result,
        [snakeCase(key)]: convertToSnakeCase(value)
      }),
      {}
    );
  }

// api: axiosのinstance
api.interceptors.request.use((config: InternalAxiosRequestConfig) => {

  if (
    config.method &&
    METHOD_WITH_PAYLOAD.includes(config.method.toLowerCase())
  ) {
    config.data = convertToSnakeCase(config.data);
  }

  return config;
}

  
```

これをすれば、postかputの時だけ全部勝手にsnakecaseに変換してbackendに飛ばしてくれます

# 終わりに
以上！

実務でやって初めてこういう変換処理を加えるべきなんだと思いました

まだまだ発展途上です

# 参考
https://axios-http.com/ja/docs/interceptors
投稿 115 Mac OSでのRubyインストール 2024/10/23

本日の勉強時間　3H


Mac OSでRubyの環境構築をする手順は以下の通り。
Homebrewを使う方法が一般的です。
1. Homebrewをインストール
HomebrewはMac OSで使えるパッケージ管理ツールです。まずはHomebrewがインストールされていない場合、ターミナルを開いて以下のコマンドを実行します。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

2. Homebrewでrbenvをインストール
rbenvはRubyのバージョン管理ツールです。これを使うことで、複数のRubyバージョンを簡単に切り替えられます。
```
brew install rbenv
```
3. rbenvの設定
rbenvを使用するために、シェルの設定ファイル
（例: ~/.bash_profileや~/.zshrc）に以下を追加します。
```
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile  # bashを使っている場合
```
もしくは
```
echo 'eval "$(rbenv init -)"' >> ~/.zshrc
source ~/.zshrc  # zshを使っている場合
```

4. Rubyのインストール
rbenvを使ってインストールできるRubyのバージョンを確認します。
```
rbenv install -l
```
必要なバージョンをインストールします
（例: 3.2.2をインストールする場合）。
```
rbenv install 3.2.2
```
インストール後、そのバージョンをデフォルトとして設定します。
```
rbenv global 3.2.2
```
5. Rubyのインストール確認
インストールが成功したか確認するために、以下のコマンドを実行します。
```
ruby -v
```


これで、Rubyのバージョンが表示されれば、環境構築は完了。
【超初心者向け】Dockerについて優しく解説

# はじめに
　当然の話だが、Qiitaの初心者向け記事は**そのジャンルの初心者**向けの内容になってしまっていて、ITそのものの初心者には難しい内容が多くなってしまっている。
　そこで、本記事では**可能な限りIT用語を使わず**Dockerについて解説していこうと思う。


# Dockerとは
　コンピュータで使うアプリを作ったり、動かしたりするために使うツールの一種。アプリの作成や実行には準備が必要なことがあるが、Dockerを使うと、その準備を簡略化することが出来る。


## Dockerの基本用語

- **Dockerコンテナ**  
  アプリを動かすために必要なものが揃った特別な空間（仮想環境）、アプリを入れた箱のようなものだと考えてください

- **Dockerイメージ**  
　コンテナを作るための設計図のようなもので、アプリを動かすために必要なファイルが全て入っています
 
- **Dockerfile**  
  Dockerイメージを作るための具体的な指示が書かれたテキストファイルです

- **Docker Hub**  
  使用される頻度の多いDockerイメージが多数登録されている場所。ここからアプリを動かすための材料（Dockerイメージ）をダウンロードします

- **Docker Compose**  
  複数のDockerコンテナを1度に操作するためのツール。複数同時に起動する状況でよく使用されている

## Dockerの特徴
　Dockerがよく使用される理由は、アプリをいつどこで誰が動かしても同じように動くからです。通常、アプリを使用するためには各自準備や設定が必要になりますが、Dockerを使うとその準備がほとんど不要になります。アプリとその動作に必要な設定をすべてDockerコンテナにまとめておくことができ、簡単にアプリを動かすことができます。

## Dockerの使い方
※飽くまでも一例であり、ほかの使い方もあります。

1. **Dockerイメージを取得する**  
   Docker Hubからイメージをダウンロードするには、`docker pull`コマンドを使用します。  
   例: `docker pull [取得したいイメージ名]`

2. **Dockerコンテナを起動する**  
   取得したイメージを使ってコンテナを起動します。`docker run`コマンドを使用。  
   例: `docker run [1で取得したイメージ名]`

3. **コンテナを停止する**  
   アプリの使用をやめる際は、コンテナの停止が必要です。`docker stop`コマンドを使用。  
   例: `docker stop [コンテナ名 or コンテナID]`

4. **コンテナを再開する**  
   停止したコンテナは`docker start`コマンドで再開できます。  
   例: `docker start [コンテナ名 or コンテナID]`

5. **コンテナを削除する**  
   不要なコンテナは削除できます。削除には`docker rm`コマンドを使用。  
   例: `docker rm [コンテナ名 or コンテナID]`

## まとめ
　Dockerを使用することで、アプリの準備や設定の手間が大幅に減り、どの環境でも同じように動かすことが可能になります。
　実際に使用する場合は本記事だけでなく、**さらに詳細を解説している記事も参照した上で使用することをお勧めします**。
クラウドでも使えるインテル® Xeon® プロセッサーの AI を加速するインテル® AMX

【開発と活用を推進するインテルの AI】
インテルはクラウドからデータセンター、エッジにおいて、あらゆる場所での AI 活用を目指す、ソフトウェアやハードウェアでの AI 開発、さらには AI ソリューションへの活用を動画で解説するWebサイトを公開しています。
https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

＜AI 活用を動画で学ぶ＞
インテルのエキスパートたちが、ソフトウェアやハードウェア、AI ソリューションに関してのノウハウを動画で解説。今回ご紹介するのは、「推論 / エッジ推論」
学習によって作成された推論モデルのエッジへの実装や、効率的な推論の実行など、推論に関して紹介します。

タイトル：
クラウドでも使えるインテル® Xeon® プロセッサーの AI を加速するインテル® AMX

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/9d824eb6-76fa-9e0e-c47a-be78d50ce64f.png)

AI の活用と進展と共に、サーバー CPU の AI ワークロード処理能力も重要性を増してきており、インテル® Xeon® プロセッサーは AI を高速化する拡張命令、インテル® AMX を搭載しています。サーバー向け CPU の新機能は、クラウドで利用可能な環境が増加しています。ここでは、インテル® Tiber™ デベロッパー・クラウド上で、インテル® AMX を利用した簡単なコードを実行するデモンストレーションを紹介します。

https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

是非この機会にAI Everywhere を実現するインテルのソリューションをご覧ください！
【Ethereum】メッセージ署名について調べてみた

本記事では、Ethereumのメッセージ署名について考えられるユースケース、仕組みと実装方法を記載します。
# 1.メッセージ署名とは
dAppsを触っていると、以下のように、何らかのメッセージに対して署名を求められることが多くあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/ba0d055c-3e09-58f1-0f6b-13011c6bd37f.png)
出典: https://note.com/takatangame/n/nfb0e690d7337

これは**メッセージ署名**と呼ばれます。
メッセージ署名は、トランザクションと同じく、MetaMask等のウォレットアプリから署名することで作成できます。
ただし、メッセージ署名自体はブロックチェーンに何かしら作用するわけではない(オフチェーンでのやり取り)ので、ガス代が発生したりはしません。

# 2.ユースケース
メッセージ署名はどのように活用されるのか、具体例を交えつつ考えてみます。
## 2.1.ユーザー認証
Ethereumアドレスとユーザーを紐づけることで、Ethereumアドレスを用いた認証が行えるようになります。
UIとしては、従来のユーザーID・パスワード入力ではなく、MetaMask等ウォレットでメッセージに署名することでログインできる、といった形です。
例えば、Web3知識の学習やプロジェクト発見のためのプラットフォームであるLayer3では、MetaMaskによるサインイン機能が提供されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/a7762ada-0d49-43c5-87ac-377012ef5e11.png)


以下の記事では細かな認証フローも検討されていました。

https://www.slideshare.net/drecom/dapps-web3ethpersonalsign#8

https://alis.to/fukurou/articles/aEO1lOPNyMqd

https://tech.drecom.co.jp/dapps-use-web3-eth-personal-sign/

## 2.2.特定のアカウントへの認可
アカウントの残高取得などを、事前にメッセージ署名により同意を得てから行うケースも考えられます。
パブリックチェーンでは、Ethereumアドレスさえ分かれば同意を得ることなく各種情報を取得できますが、より信頼性が求められるdAppsであれば、このような認可へのメッセージ署名の活用も意味があるかもしれません。
## 2.3. 規約への同意
2.2.とも関連しますが、アプリケーションの利用規約等に、メッセージ署名によって同意する、というケースも考えられます。
オフチェーン上の操作であれば、あらゆる操作への同意に利用することができます。
具体例としては、エアドロップ(あるアドレスに、アプリケーションの利用など特定の評価基準に応じてトークンを配布すること)の規約への同意があったりします。

# 3.メッセージ署名の作成
メッセージ署名は以下の手順で作成されます。
1. メッセージを準備し、ハッシュ化する(これをメッセージ1とする)
1. メッセージ1に、「\x19Ethereum Signed Message:\n + {メッセージ1のバイト数}」というプレフィックスを追加する(これをメッセージ2とする)
1. メッセージ2をさらにハッシュ化する(これをメッセージ3とする)
1. メッセージ3に秘密鍵で署名する

実装においては、ethers.js等のライブラリを使えば簡単にできます。
```sign.js
const wallet = ethers.Wallet.createRandom();
const sig = wallet.signMessage("hello");
```
:::note info 
**「\x19Ethereum Signed Message:\n + {メッセージ1のバイト数}」** は、ERC191で定められたフォーマットのひとつです。
このプレフィックスが、署名対象のデータがRLPエンコードされた結果トランザクションとして扱われてしまう可能性を排除し、メッセージとして解釈されることを保証しています。
:::

https://eips.ethereum.org/EIPS/eip-191

https://qiita.com/cardene/items/ee4edd15ad6fe7f58f7e


# 4.メッセージ署名の検証
通常のトランザクションの署名と同じく、メッセージ署名は検証することができます。
メッセージ署名とメッセージがあれば、そのメッセージに署名者のアドレスを復元することができます。
こちらも、ethers.jsで簡単に記述できます。
```verify.js
const verifiedAddress = ethers.verifyMessage("hello",sig)
```
また、solidityで検証を行うこともできます。
詳細は下記を参照ください。

https://solidity-by-example.org/signature/



# 5.所感
トランザクションへの署名、メッセージ署名の違いを明確に理解する良い機会になったと思います。また、メッセージ署名のみならず、Ethereumにおける署名と検証を再確認することができました。
分散型RPCについて調べてみた ~dRPC~

本記事では、分散型RPCを実現するサービスの一つである「dRPC」について、概要と仕組みを記述します。

# 1.RPCノード
前提として、ブロックチェーンにはクライアント呼び出しのゲートウェイとなる**RPCノード**が存在します。
残高の参照やトランザクションの送信など、JSON-RPC APIを用いてクライアントとブロックチェーンがやり取りするにあたり、ブロックチェーン側のゲートウェイとなるのがRPCノードです。

https://www.gate.io/ja/blog/2706/understanding-blockchain-rpc-nodes-what-are-they-and-how-do-they-work
# 2.分散型RPC

RPCノードは自前で用意することも可能ですが、コストや保守性の面から、多くのケースではRPCプロバイダー(主に従量課金制でRPCノードを貸し出す)が利用されます。

こうした状況の中で、**分散型RPC**と呼ばれる分野が存在します。分散型RPCは、単一のRPCプロバイダーを利用する際の問題点を解消できる選択肢となっています。


# 3. 分散型RPC提供サービス「dRPC」
## 概要
dRPCはその名の通り、コミュニティによって運営される、分散型RPCを提供するサービスです。
無料プランからエンタープライズプランまで用意されており、サポートも手厚いようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/dfa38867-b35a-6b1b-f7f6-03df4204a86e.png)

https://drpc.org/

https://github.com/drpcorg/drpc-nextra


## 仕組み
dRPCは**DProxy**と**Dshacle**というコンポーネントで構成されています。
DProxyはクライアントからのJSON-RPCリクエストを受け付け、それをDshacleへ受け渡します。そしてDshacleは、適切なRPCノード(ドキュメントでは「Data providers」と呼んでいます)にリクエストルーティングします。
つまり、RPCノードの前に置くロードバランサーのようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/41427fd7-8e2d-28ab-137d-df0b9f321ca6.png)
出典: https://drpc.org/docs/howitworks/overview

ちなみに、DshacleはもともとEmerald社が開発したOSSライブラリですが、dRPCは独自にforkしたものを使用しているようです。

## メリット
ドキュメントから、dRPCを利用することによるメリットをいくつか記載します。
- 低遅延
    - 遅延のないRPCノードへ優先的にルーティングすることができる
- 耐障害性
    - あるRPCノードがダウンしても、別のRPCノードへルーティングできる
- RPCプロバイダーへの依存からの脱却
    - dAppsが大手プロバイダー(Infura、Alchemy、Quicknodeと名指しされていました)に依存してしまう状況を解消できる
## 料金体系
プラン制で、「Free」「Growth」「For Enterprise
」の3つから選べるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/b67bd69f-cc27-9bb0-691e-b55d03e2afc7.png)
出典: https://drpc.org/pricing

FreeとGrowthの大きな違いとして、ルーティングされるノードの種類があります。
Freeプランでは、パブリックノードのみがルーティングの対象となりますが、Growthプランでは有料のノード(RPCプロバイダが提供するノードと思われます)もルーティング対象となります。
このとき、有料ノードの利用料は**Compute Units(CU)** という独自の単位で表され、RPC methodの内容によってCU消費量が変わります。例えば、`eth_getBlockByHash`には21CU、`eth_sendRawTransaction`には90CU消費します。
Growthプランでは163 Million CU が付与されるようなので、その範囲内で利用する必要があります。

# 4.所感
dRPCは、分散型RPCを手軽に導入できる良いサービスだと感じました。
一方、Dshackleへの依存について疑問が湧きました。すべてのトラフィックは、各RPCノードへルーティングされる前にDshackleを経由するので、Dshackleが単一障害点となりえないのか、またはその解決策はあるか気になりました。
Playwrightを使用してe2eテストの環境を構築

# はじめに
ディレクトリ構成は以下を想定しています。
```shell
|--app
   |--frontend
   |--backend
   |--e2e
```

## 1. 環境構築
詳細は[公式](https://playwright.dev/docs/intro)を参照
```shell
npm init playwright@latest
```
コンソールで質問に回答する。
```shell
✔ Do you want to use TypeScript or JavaScript? · TypeScript
✔ Where to put your end-to-end tests? · tests
✔ Add a GitHub Actions workflow? (y/N) · false
✔ Install Playwright browsers (can be done manually via 'npx playwright install')? (Y/n) · false
```

playwright用の設定ファイルを設定
```typescript:playwright.config.ts
import { defineConfig, devices } from '@playwright/test';
import 'dotenv/config'

export default defineConfig({
  testDir: './tests',
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 1 : undefined,
  reporter: 'html',
  timeout: 20000,
  use: {
    baseURL: process.env.CI ? 'http://localhost:8080' : 'http://localhost:5173',
    video: 'on',
    trace: 'on',
  },
  projects: [
    {
      name: 'Google Chrome',
      use: { ...devices['Desktop Chrome'], channel: 'chrome' },
    },
  ],
});

```

インストールする
```shell
npm install
```

デフォルトで追加されたサンプルテストを実行
```shell
npx playwright test
```

e2e用のtypescript-eslintを[インストール](https://typescript-eslint.io/getting-started/)([公式の推奨](https://playwright.dev/docs/best-practices#lint-your-tests))
```shell
npm install --save-dev eslint @eslint/js @types/eslint__js typescript typescript-eslint
```

eslintの設定ファイルをe2eディレクトリ直下に作成([公式の設定](https://typescript-eslint.io/getting-started/#step-2-configuration))
```javascript:eslint.config.mjs
// @ts-check

import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';

export default tseslint.config(
    eslint.configs.recommended,
    ...tseslint.configs.recommended,
);
```

## 2.e2eテストを書く
[公式](https://playwright.dev/docs/pom)を参考にlogin.spec.tsとlogin.spec.tsを作成。
```shell
|--app
   |--frontend
   |--backend
   |--e2e
     |--tests
       |--login.spec.ts
       |--page-objects
         |--login.spec.ts
```

```typescript:llogin.page.object.ts
import {Locator, Page} from "@playwright/test"
export class LoginPageObject {
    readonly authLink: Locator;
    constructor(private page: Page) {
        this.authLink = page.getByRole("link", {
            name: "ログイン",
        });

    }
    async goto() {
        await this.page.goto("/");
    }
    async doLogin() {
        await this.goto();
        await this.authLink.click();
        await this.page.waitForURL("/sample");
    }
}
```

```typescript:login.spec.ts
import {test} from "@playwright/test";
import {LoginPageObject} from "./page-objects/login.page.object"

test("should display sample page after login is successful", async ({page}) => {
    const loginPageObject = new LoginPageObject(page);

    await loginPageObject.doLogin();
});
```

アプリを起動した後に、e2eディレクトリで以下のコマンドを実行
```shell
npx playwright test
```
Cloud Scheduler からの HTTP リクエストのタイムアウトに対処する

:::note warn
Cloud Scheduler のジョブ実行でこんなエラーに遭遇したことはありませんか？
```
httpRequest: {
	status: 504
}
jsonPayload: {
	@type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
	debugInfo: "URL_TIMEOUT-TIMEOUT_WEB. Original HTTP response code number = 504"
	status: "DEADLINE_EXCEEDED"
	targetType: "HTTP"
	url: "https://hogehoge-fugafuga-an.a.run.app/"
}
```
:::

Cloud Run Functions のタイムアウト時間は、（HTTP 関数で）最大 60 分です。

https://cloud.google.com/functions/docs/configuring/timeout?hl=ja

> Cloud Functions（第 1 世代）の最大タイムアウト時間は 9 分（540 秒）です。

> Cloud Functions（第 2 世代）の最大タイムアウト時間は、HTTP 関数の場合は 60 分（3,600 秒）、イベント ドリブン関数の場合は 9 分（540 秒）です。

だからと言って、Cloud Scheduler が HTTP リクエストの完了を最大で 60 分待ってくれるわけではないようです。

Cloud Scheduler の ジョブ試行のタイムアウト時間は、最大 30 分です。

https://cloud.google.com/scheduler/quotas?hl=ja#limits

> HTTP ターゲットを使用するジョブの実行の最長時間（開始時刻から終了時刻まで）。この上限を超えるジョブはタイムアウト エラーで終了し、構成された再試行ポリシーに従って再試行されます。

つまり、冒頭のエラーは、HTTP リクエストが完了するまでの時間よりも、設定している Cloud Scheduler のジョブ試行のタイムアウト時間が短いことによるものです。

タイムアウトはデフォルトで 3 分になっており、HTTP リクエストの完了に時間がかかることが想定される場合はコンソールから変更することができます。
https://console.cloud.google.com/cloudscheduler/jobs/edit/asia-northeast1/[job-name]

![Cloud Scheduler の試行期限1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1504894/0f114827-b093-f9c6-5fc6-fe0ad3afe971.png)

![Cloud Scheduler の試行期限2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1504894/4716ddbc-bd7d-59de-86ce-46ffd915872f.png)


下記を参考にさせていただきました。

https://dev.classmethod.jp/articles/gcp-cloud-scheduler-http-target-attempt-deadline/
第11章 正規分布に関する検定

# 1標本検定（分散が既知の場合）
# https://bellcurve.jp/statistics/course/9319.html

# 1標本検定, 2標本検定（分散が未知の場合）
https://avilen.co.jp/personal/knowledge-article/t-test/

# 例題11.1
(1)t検定。
$T=\frac{\bar{X}-\mu_0}{s/\sqrt{n}}=\frac{125-120}{10/\sqrt{10}}=1.581$

(2)p321を参照.自由度9のt分布の2.5%点は2.262

(3)1.581 < 2.262より、棄却域に入っていない。

(4)

# 例題11.2
分散が既知の場合の検定。回答の通り
[PLATEAU] demデータファイル名の"00", "50"とは

## 結論
頭の6ケタ数字はわかるとして、後半の--00_op.gmlや--50_op.gmlってなんの違いでしょうか？
![スクリーンショット 2024-10-25 061521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1241658/718665a2-1027-984d-edb3-4f1d0a6f1b7b.png)

単純なことなので、結論から書きます。
**下の写真のようなマップの分割**です。
![画像_2024-10-25_062058906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1241658/f55f5220-17c1-cf4b-7de1-ca72b41138bc.png)

↓検証時のデータの中身。00と55を選択してたかな？？
（順番間違っていたらコメントに修正ください。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1241658/f1a315b3-38ea-e550-9d71-7eddb9046d04.png)


## 経緯
こちらの記事を参考にCityGMLをfbxに変換してた際に、そこに関する言及がなく、軽く調べてもわからなかったのでメモ程度に書いておきました。

https://www.mlit.go.jp/plateau/learning/tpc04-1/


* Plateau Open Date Listはここからみれます↓

https://www.mlit.go.jp/plateau/open-data/


____
HTTP/1.1からHTTP/2へ！Webが劇的に速くなる理由とは？

# はじめに
Web開発において、より高速で効率的な通信が求められる現代、HTTP/2はその要求に応えるために登場しました。従来のHTTP/1.1と比較して、どのようにパフォーマンスが向上し、なぜHTTP/2が次世代の通信プロトコルとして注目されているのかを具体的に見ていきましょう。本記事では、HTTP/2の特徴や、HTTP/1.1との違いを詳細に解説します。

# HTTP/1.1とは？
まず、HTTP/1.1は1997年に登場したプロトコルで、今日でも多くのWebサイトが使用している通信方式です。主に以下の特徴を持っています。

### HTTP/1.1の特徴
- **リクエストごとにTCP接続が必要**：ブラウザがサーバーにリソース（HTML、CSS、画像など）を要求するたびに、HTTP/1.1ではそれぞれにTCP接続が必要です。
- **ヘッダーの冗長性**：リクエストごとに同じヘッダー情報（例：User-Agentなど）を毎回送信するため、通信効率が悪くなります。
- **パイプライニングの限界**：HTTP/1.1ではパイプライニングによって複数のリクエストを順番に処理できますが、リクエストの順番が厳格に守られるため、1つのリクエストが遅れると全体が遅延する問題がありました。
# HTTP/2とは？
一方で、2015年に登場したHTTP/2は、これらの問題点を解消し、より高速で効率的な通信を実現するために設計されました。HTTP/2は、特にWebサイトの高速化に大きく貢献しています。

## HTTP/2の特徴
### 1. マルチプレックス通信
HTTP/1.1では、1つの接続につき1つのリクエストしか送れませんが、HTTP/2では**マルチプレックス通信**により、**1つのTCP接続で複数のリクエストを同時に送信・受信**することができます。これにより、ネットワーク帯域がより効率的に利用され、待ち時間が大幅に短縮されます。

### 2. ヘッダー圧縮
HTTP/2では、**HPACKアルゴリズム**を用いて、ヘッダー情報を効率的に圧縮します。これにより、HTTP/1.1で発生していたヘッダー情報の冗長性が削減され、通信の無駄がなくなります。

### 3. サーバープッシュ
HTTP/2では、**サーバープッシュ**という新機能が導入されました。これは、クライアントがまだリクエストを送っていないリソースを、サーバーが事前にクライアントに送ることができる機能です。たとえば、HTMLファイルをリクエストした際に、それに必要なCSSやJavaScriptも同時に送信することで、ページの表示速度が向上します。

### 4. バイナリプロトコル
HTTP/2はテキストベースではなく**バイナリプロトコル**を採用しており、これによりデータの解析と処理が高速になります。従来のHTTP/1.1はテキストベースのプロトコルで、解析に余計な時間がかかっていました。

# HTTP/1.1とHTTP/2の比較
|特徴	|HTTP/1.1	|HTTP/2|
|---|---|---|
|マルチプレックス|	なし（リクエストごとに1つの接続）|	あり（1つの接続で複数のリクエストを並列処理）|
|ヘッダーの圧縮	|なし（冗長なヘッダー情報）	|あり（HPACKによる圧縮）|
|サーバープッシュ	|なし	|あり（事前にリソースをプッシュ）|
|プロトコルの形式	|テキスト	|バイナリ|
|速度のボトルネック|	パイプライニングによる遅延|	パフォーマンス最適化|

# 具体例：HTTP/2の効果
### 1. ページの表示速度の向上
HTTP/1.1では、複数のリクエストが必要なページ（画像が多いページなど）は遅くなりがちです。しかし、HTTP/2では、同時に複数のリクエストを送信できるため、ページ全体のロード時間が短縮されます。

### 2. サーバープッシュでの高速化
たとえば、あるWebサイトがHTMLファイルをクライアントに返すと同時に、CSSやJavaScriptファイルをプッシュすることで、ブラウザ側がすぐに必要なリソースを取得できます。これにより、Webページの表示がさらに高速化されます。

```html
<link rel="stylesheet" href="/style.css">
<script src="/script.js"></script>
```
HTTP/1.1の場合、これらのリソースはHTMLを取得した後に個別にリクエストが送られるため、追加の待ち時間が発生しますが、HTTP/2のサーバープッシュではそれを事前に送信できます。

### 3. ヘッダー圧縮によるデータ削減
API通信などで同じヘッダー情報を何度も送る場合、HTTP/2のヘッダー圧縮が効果を発揮します。これにより、データ転送量が削減され、全体の通信コストも低減します。

# HTTP/2がWeb開発に与える影響
### 1. Webパフォーマンスの向上
HTTP/2の導入により、ページの読み込み時間が劇的に短縮されるため、ユーザー体験が向上します。特にモバイル端末では、ネットワークが遅い環境でもパフォーマンスの改善が期待できます。

### 2. SEOへの影響
Googleはページの表示速度をランキング要因にしています。HTTP/2の導入によりWebサイトの表示速度が向上すれば、SEOパフォーマンスも改善される可能性があります。

### 3. 既存のWeb開発環境への適用
HTTP/2は既存のHTTP/1.1と互換性があり、SSL/TLSによって暗号化されるため、HTTPSを導入しているサイトは簡単に移行できます。設定を変更するだけでHTTP/2のメリットを享受できるため、すぐに導入を検討する価値があります。

# まとめ
HTTP/2は、従来のHTTP/1.1に比べて、通信の効率化とパフォーマンス向上を大幅に実現するプロトコルです。特に、マルチプレックス通信やサーバープッシュ、ヘッダー圧縮による改善により、Webサイトの表示速度が向上します。

もしまだHTTP/2を導入していない場合、Webサイトの高速化やSEOの改善を目的に、早急な対応を検討する価値があるでしょう。HTTP/2がもたらす次世代の通信技術を、ぜひあなたのプロジェクトでも体感してみてください！
サーバ上でデータセットをダウンロードする方法

# 概要
今回は、wgetを用いたデータセットのダウンロード方法とKaggleのAPIを用いたデータセットのダウンロード方法をまとめてみました。

## wgetを用いてデータセットをダウンロード
### 例: CoCoデータセットをダウンロード
1. [公式サイト](https://cocodataset.org/#download)にアクセスし、ダウンロードしたいファイルを右クリックして「リンクのアドレスをコピー」を選択します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2473523/0a086004-8103-71b9-1a69-712978c97f29.png)
2. サーバ上のターミナルで、以下のコマンドを実行して任意の場所にダウンロードします。
    ```shell
    $ wget http://images.cocodataset.org/zips/train2014.zip
    ```
3. ダウンロードしたzipファイルを展開するには、unzipコマンドを使用します。
    ```shell
    $ unzip train2014.zip
    ```

## [Kaggle](https://www.kaggle.com/)のデータセットをダウンロード
    
Kaggleのデータセットをダウンロードするには，KaggleのAPIを利用します ([公式github](https://github.com/Kaggle/kaggle-api))。

1. Kaggle APIのインストール
    ```shell
    $ pip install kaggle
    ```
    
2. アカウント認証
    1. Kaggleのアカウントページから「Settings」に移動し、「Create New Token」をクリックしてAPIキーを生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2473523/2c7b63f1-db22-db0b-74d5-261aa476a991.png)

    2. `kaggle.json`がダウンロードされるので、これをサーバ上の`~/.kaggle/kaggle.json`へ配置します。
    
    3. ターミナルでkaggle.jsonのアクセス権限を変更します。
        ```shell
        $ chmod 600 ~/.kaggle/kaggle.json
        ```

3. データセットのダウンロード
    1. ダウンロードしたいデータセットのページにアクセスし、`ユーザ名/データセット名`をコピーします。
    2. 以下のコマンドを実行してデータセットをダウンロードします。
    ```
    $ kaggle datasets download ユーザ名/データセット名
    ```
    
    以下，実行例です．
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2473523/f1144348-1aff-fda6-d36d-d257df24fae3.png)
    ```
    $ kaggle datasets download andrewmvd/lits-png
    ```
【UiPath】UiPathの環境構築

UiPathの環境構築は比較的シンプルですが、いくつかのステップに分かれています。ここでは、基本的な手順を紹介します。

### 1. **UiPath Studioのインストール**
   - [UiPath公式サイト](https://www.uipath.com/ja/start-trial)から、UiPath Studioをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782903/19d5adae-b6d3-fe67-9907-bce038e8c6e0.png)

※「Community Edition」や「Enterprise Edition」を選択できますが、個人や小規模プロジェクトの場合は「Community Edition」で十分です。
   - ダウンロードしたインストーラーを起動して、指示に従いインストールを進めます。
※ 依存ライブラリもインストールされるため、数分かかることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782903/f0da57e8-8a64-6b68-b2a2-e149b5b9dab5.png)

   - Quick及び同意をチェックし、インストールを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782903/6a1ead98-a23e-19cf-7f65-426f82578fd6.png)

   - 完了するまで待ち（約5分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782903/f2c10e38-e7c7-ab74-eed7-53414bb4657d.png)

   - セットアップ完了を確認し、「UiPath Studio を起動」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782903/4e87a134-8314-1b95-2b62-64af68652338.png)

   - 

### 2. **アカウントの作成とサインイン**
   - インストール後、UiPath Studioを開くと、アカウントへのサインインが求められます。
 
### 3. **Studio設定の選択**
   - 初回起動時に「デザイナー設定」が表示されます。
   - 「UiPath Studio」のモードを「Studio（デザイン開発用）」、「StudioX（初心者向け）」などから選びます。標準的な業務自動化においては「Studio」を選択します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782903/54d5ce6c-ffc7-718d-9a27-2e33c5c66799.png)
   - Studioが立ち上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782903/ab2222e7-58f3-9b3a-a0c6-6d8ba7689e4e.png)


### 4. **プロジェクトの作成**
   - 新規プロジェクトを作成する際、テンプレートや使用するワークフローデザインを選択します。
   - 例えば、「プロセス」テンプレートを選ぶと、基本的なプロセス自動化ができるプロジェクトが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782903/aed40598-a592-dd88-64f9-a6adab625fac.png)
   - プロジェクトが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782903/02992079-1ac5-392c-496a-7b6bdcfebb3e.png)

### 5. **パッケージのインストール**
   - UiPath Studioの「パッケージ管理」から、プロジェクトに必要なアクティビティパッケージを追加します。
   - 例えば、メールの自動化やExcel操作の自動化を行いたい場合は、それに関連するパッケージをインストールします。

### 6. **Orchestrator（オプション）**
   - 複数のロボットを管理したり、大規模なプロジェクトを実行する場合は、UiPath Orchestratorのセットアップが必要です。
   - Orchestratorは、ロボットのジョブ管理、ログ管理、スケジュール設定などを一元管理するクラウドまたはオンプレミスのツールです。

### 7. **UiPath Robotの設定**
   - UiPath Robotは、作成した自動化プロセスを実行するためのアプリケーションです。Studioと連携して動作します。
   - 「サービスモード」と「ユーザーモード」の2種類がありますが、通常は「ユーザーモード」でインストールされます。
   - Orchestratorと接続する場合は、OrchestratorのURLやマシンキーを設定する必要があります。

### 8. **実行とデバッグ**
   - プロジェクトを作成したら、「実行」ボタンを押して自動化をテストします。
   - エラーや問題が発生した場合は、デバッグモードで詳細なエラーメッセージを確認し、修正を行います。

### 9. **バージョン管理（オプション）**
   - 大規模な開発や複数人でのプロジェクトの場合、GitやTFSなどのバージョン管理システムを使うと便利です。
   - UiPathはこれらのバージョン管理システムに対応しているため、プロジェクトを簡単に管理できます。

---

これらの手順に従うことで、UiPathの基本的な開発環境を整えることができます。さらに詳細な設定やカスタマイズが必要な場合は、開発プロジェクトや利用するアクティビティに応じて調整することが可能です。
objective-c製のUIViewControllerからSwiftUIで作った画面を呼び出したいときにすること

まだまだobjective-cのプロダクトってありますよね

でも新しい画面はSwiftUIで作りたい・・・
プレビュー表示が便利・・・

ということでobjective-cで作られたUIViewControllerからSwiftUIの画面をpresentで呼び出して表示するtipsです

objective-cを書いてるような人なら細かい説明しなくてもわかると思うので、

いきなりコード例出します


まずSwiftUIで画面を作ります

```SubsctiptionView.swift
import SwiftUI

struct SubscriptionView: View {
    var body: some View {
        Text("Subscription View")
    }
}
```

次にこの.swiftファイルに以下をつけたします

```SubsctiptionView.swift
import SwiftUI

// ↓ここからobjcからswiftUI呼び出すためのクラス
@objc class SubscriptionViewClass: NSObject {
    @objc static func createUIViewController() -> UIViewController {
        let subscriptionView = SubscriptionView()
        let hostingController = UIHostingController(rootView: subscriptionView)
        return hostingController
    }
}
// ↑ここまで追加

struct SubscriptionView: View {
    var body: some View {
        Text("Subscription View")
    }
}
```

そしてこの画面を呼び出したいUIViewControllerで以下のようにして使います

```MyViewController.m
- (void)subscribeButtonTapped
{
    UIViewController *vc = [SubscriptionViewClass createUIViewController];
    [self presentViewController:vc animated:YES completion:nil];
}
```

たったこれだけでSwiftUIの画面を同居できます！

ぜひお試しください
[Scala] for expression の中で Future を並列に走らせる方法

## ダメな方法

```scala
for {
    res1 <- Future.value(1)
    res2 <- Future.value(2)
} yield res1 + res2
```

## 良い方法


```scala
val f1 <- Future.value(1)
val f2 <- Future.value(2)

for {
    res1 <- f1
    res2 <- f2
} yield res1 + res2
```

Futureは初期化した時点で実行が開始するので、この書き方なら２つのFutureは並列に実行される。



## Ref

https://stackoverflow.com/questions/19045936/scalas-for-comprehension-with-futures
コマンドプロンプトで相対パスを絶対パスに変換して環境変数に代入する

# 結論

Powershellのコマンドを叩いて、環境変数に代入する。

```bat:相対パスを絶対パスに変換して環境変数に代入
REM 末尾に\を付ける
if not [%BASE_PATH:~-1%] == [\\] (set BASE_PATH=%BASE_PATH%\)
REM 絶対パスを標準出力するコマンド
set COMMAND=powershell "[uri]::new([uri] '%BASE_PATH%', '%RELATIVE_PATH%').LocalPath"
REM 絶対パスを環境変数に代入する
for /f "usebackq" %I in (`%COMMAND%`) do set ABSOLUTE_PATH=%I
```
バッチファイル内に書く場合は最後の行を下のようにする（`%I`を`%%I`に置換）。
```bat:バッチファイル用
for /f "usebackq" %%I in (`%COMMAND%`) do set ABSOLUTE_PATH=%%I
```

カレントディレクトリの一つ上のディレクトリの絶対パスが欲しい場合は下のように書ける。
```bat
set COMMAND=powershell "[uri]::new([uri] '%cd%\', '..').LocalPath"
for /f "usebackq" %I in (`%COMMAND%`) do set ABSOLUTE_PATH=%I
```
これを一行で書くと下のようになる。
```bat
for /f "usebackq" %I in (`powershell "[uri]::new([uri] '%cd%\', '..').LocalPath"`) do set ABSOLUTE_PATH=%I
```

## 末尾に`\`を付ける理由

末尾に`/`もしくは`\`が付いていないとディレクトリとみなされず、階層がずれてしまう。
```powershell:Powershell実行結果
> [uri]::new([uri]'c:\hoge\fuga', '..').LocalPath
c:\
> [uri]::new([uri]'c:\hoge\fuga\', '..').LocalPath
c:\hoge\
```

# 伝統的な手法

一度カレントディレクトリを移動し、移動先のカレントディレクトリの絶対パスを環境変数に代入して戻る。目的のパスが存在しない場合は利用できない。
```bat
pushd %RELATIVE_PATH%
set ABSOLUTE_PATH=%cd%
popd
```

# 参考

https://qiita.com/yumura_s/items/0aed4c275432993e9174
Dev ContainersでJava8 AzureFunctions環境構築時に沼ったのでメモ

今更Java8でAzureFunctionsを構築する人なんていないと思いますが、構築の際に沼ったのでメモとして記載します（試してないですが多分Java11でも発生する）。

VSCodeからだと簡単にdevcontainerの環境を作ることができます。
1. `Dev Containers`の拡張機能をインストール
2. `F1`を押して`開発コンテナー: コンテナー機能の構築(Dev Containers: Configure Container Features)`を選択
3. `Azure Functions (Java)`を選択
4. `8-bullseye`を選択(`8-bookworm`を選択するとコンテナビルド時にエラーで止まる)
5. インストールする追加機能は自由に
6. オプションも自由に
7. `開発コンテナー: コンテナーで再度開く(Dev Containers: Reopen in Container)`

これでコンテナ完成かと思いきや

## バージョン確認
```
$ java -version
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (Temurin)(build 25.372-b07, mixed mode)

$ mvn -v
Unrecognized option: --enable-native-access=ALL-UNNAMED
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
```

Mavenのバージョン情報が取れない・・・
色々調べているとMavenの`4.0.0`がインストールされているっぽい
`4.0.0`はJava17以上が必須要件

## Mavenのバージョン指定
```devcontainer.json
    "ghcr.io/devcontainers/features/java:1": {
      "version": "none",
      "installMaven": true,
      "mavenVersion": "3.8.8"
    }
```
mavenVersionを追記しましょう（投稿時の安定版は3.8.8）。
コンテナのリビルドを行い、再度バージョン確認
```
$ mvn -v
Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
Maven home: /usr/local/sdkman/candidates/maven/current
Java version: 1.8.0_372, vendor: Temurin, runtime: /usr/local/sdkman/candidates/java/8.0.372-tem/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.15.133.1-microsoft-standard-wsl2", arch: "amd64", family: "unix"
```
:thumbsup:
ここまでたどり着くのに大分沼りました・・・

## プロジェクト作成
あとはMS公式のテンプレートがあるのでそれに沿って構築すれば動作確認までできます。

https://learn.microsoft.com/ja-jp/azure/azure-functions/create-first-function-cli-java?tabs=linux%2Cbash%2Cazure-cli%2Cbrowser#create-a-local-function-project

同じように沼った人をこの記事で一人でも助けられたら幸いです。
【Ruby】オブジェクトとインスタンス

# はじめに
こんにちは、現在アメリカの大学に行って語学を学びながらソフトウェアエンジニアになるために独学で勉強しているものです。
本日はRubyを勉強しているとよく出てくるオブジェクトとインスタンスについて整理していきます。
というのも現在たのしいRubyという書籍でRubyを勉強しているのですが、これらの単語が出てきて「あれ、これはどういう意味だ？」とごっちゃになっているために整理をするべく記事にしました。


# オブジェクトとは
これは以前のオブジェクト指向のところでも触れましたが、Rubyは「すべてがオブジェクト」であることが特徴です。
数値、文字列、配列、クラス自体も含め、すべてがオブジェクトとして扱われます。
オブジェクトとは、データ（状態）とそのデータに対する操作（メソッド）をまとめた存在です。
Rubyのオブジェクトは、それに応じたクラスのインスタンス（実体）です。例えば、1は`Integer`クラスのインスタンス※であり、"hello"は`String`クラスのインスタンスです。
```ruby:instance1.rb
num = 1        # num は Integer クラスのオブジェクト
str = "hello"  # str は String クラスのオブジェクト
```

# インスタンスとは
ここではオブジェクトの違いに触れながら説明していきます
インスタンスとは特定のクラスから生成された具体的なオブジェクトを指します。
言い換えれば、「インスタンス」は「クラスを元にして作られたオブジェクト」なので、クラスから生成された瞬間に「インスタンス」と呼ばれることが多いです。
```ruby:animal.rb
class Animal
end

# これはクラス Animal のインスタンス
dog = Animal.new
```
`dog`はクラス`Animal`のインスタンスです。同時に、`dog`はRubyのオブジェクトでもあります。
このように、`dog`は「`Animal`というクラスから生成されたインスタンス」であり、Ruby全体では「オブジェクト」として扱われます。

ここまで聞いて、インスタンスは特にクラスをもとにして作られたオブジェクトを指しておりここでいう`dog`をインスタンスと呼びます。
一方で※で書いてある「1は`Integer`クラスのインスタンス」という言い方に少し引っ掛かります

というのも、`num = 1`のように変数として定義しているだけで`dog`のように`Animal.new`と宣言してインスタンスを作成しているわけではありません。

### なぜ数値がクラスから生成されたインスタンスなのか？
通常、`animal = Animal.new`のように明示的に`new`メソッドを使ってクラスからインスタンスを生成しますが、Rubyでは<strong>数値などの基本的なデータ型（整数や文字列、配列など）は、言語仕様上すでに自動的にそのクラスのインスタンスとして生成されています。</strong>
これはプログラミング言語がユーザーに簡便さを提供するための機能です。
```ruby:instance2.rb
puts 1.class  #=> Integer
```
このコードは、1が`Integer`クラスのインスタンスであることを確認できるものです。
上記の`Animal`クラスの例でいえば、`p dog.class`とクラス名を調べることができます。
1は`dog`と同じ振る舞いをしているため、インスタンスであることが確認できるということです
つまり、1という数値は明示的に`Integer.new`のようにして生成されたわけではないですが、Rubyの内部では1が`Integer`クラスに属するインスタンスとして扱われています。

ここまでをまとめると、Rubyのすべてのものはオブジェクトであり、その中でもクラスから生成できたオブジェクトをインスタンスと呼びます。
数値などの基本的なデータ型（整数や文字列、配列など）は言語の使用上インスタンスとして存在しています

これでもわからないという方向けにほかの例を考えてみましょう
オブジェクトは「何か具体的な物そのもの」、インスタンスは「その物がどの設計図（クラス）から生まれたかを示す特定の状態」と考えることができます。
例えば、スマホ全般を「オブジェクト」と呼ぶことができ、特定の製造メーカーやモデル（クラス）に基づいて作られた具体的なスマホ(iPhone)が「インスタンス」となります。

# まとめ
今回の記事では、Rubyにおける「オブジェクト」と「インスタンス」の違いについて整理しました。
* オブジェクト
Rubyでは、すべてがオブジェクトとして扱われます。数値や文字列、配列だけでなく、クラス自体もオブジェクトです。オブジェクトとは、データとそれに対する操作を持つ存在であり、クラスのインスタンスでもあります。
* インスタンス
特定のクラスから生成されたオブジェクトを指します。クラスはオブジェクトの設計図のようなもので、そこから生成された具体的なオブジェクトをインスタンスと呼びます。例として、Animal.newで作成されたdogはAnimalクラスのインスタンスです。

Rubyでは、数値など基本的なデータ型も自動的にクラスから生成されたインスタンスとして扱われます。
これにより、プログラミングが簡単に行える仕組みとなっており、数値の1もIntegerクラスのインスタンスです。
このように、Rubyではオブジェクトとインスタンスが密接に関わっており、クラスから生成される具体的なオブジェクトがインスタンスと呼ばれる点が重要です。
LambdaのログをCloudWatchLogsからS3へ転送してAthenaでキレイに参照したかった

前回の続き的なもの

前回はECSにあるログをAthenaから参照することを目的にした内容でしたが、
今回はLambdaから出力されるログもAthenaから参照することを目的にしています。


## 目的（背景）
1. Lambdaのログも可能な限りリアルタイムで参照したい
2. AthenaのテーブルをECSからのログとLambdaのログで分けることはしたくない
3. ロググループは一つではなく多数
4. ロググループ自体に入っているログの量の合計は月あたり1GBにも満たない


## 構成図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917787/b130a342-64c4-c39d-3adb-bd0251e94990.png)

## 処理詳細

目的（背景）にも書いてあるように、ログの容量自体そこまで多くないためDataFirehoseを使ってます。
CloudWatchLogsのサブスクリプションフィルターからパターンにログレベルを指定（NOTICE WARN ERROR）して、FirehoseからS3にDIRECT PUTしています。

Firehoseの設定は下記を有効化しておきましょう。
JSON形式でログを出力していたのでメッセージデータのみにしないとAthenaでの参照がうまくいかなかったりします。

**ただ、ここに仕様というなのハマりポイントがありました。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917787/9436b8fb-1fba-d2ca-37c2-e20205849b82.png)

## ハマりポイント

ハマったというのも自分ところの環境が悪いのか、それとも仕様なのか現状把握できていないんですが
ログイベントからのみメッセージデータを抽出した場合、下記のような出力がされていました。

```
{
 "owner": "111111111111",
 "logGroup": "CloudTrail/logs",
 "logStream": "111111111111_CloudTrail/logs_us-east-1",
 "subscriptionFilters": [
 "Destination"
 ],
 "messageType": "DATA_MESSAGE",
 "logEvents": [
 {
 "id": "31953106606966983378809025079804211143289615424298221568",
 "timestamp": 1432826855000,
 "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root1\"}"
 },
 {
 "id": "31953106606966983378809025079804211143289615424298221569",
 "timestamp": 1432826855000,
 "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root2\"}"
 },
 {
 "id": "31953106606966983378809025079804211143289615424298221570",
 "timestamp": 1432826855000,
 "message": "{\"eventVersion\":\"1.03\",\"userIdentity\":{\"type\":\"Root3\"}"
 }
 ]
}
```

こんな感じでLambdaのログ出力されているものに対して、メッセージデータ抽出した場合

```
{"eventVersion":"1.03","userIdentity":{"type":"Root1"}
\n
{"eventVersion":"1.03","userIdentity":{"type":"Root2"}
\n
{"eventVersion":"1.03","userIdentity":{"type":"Root3"} 
\n
```

\nが入ってS3に格納されてました。

これがかなり厄介でAthenaから参照すると、この\nの行もレコードとして認識して1レコード毎に何も無いレコードが挟まるという状態です。

この1byteを除去するためにLambda挟むの本末転倒すぎるのもあって、結局Athenaのクエリで適当なカラムに対してis not null つけて有耶無耶にするしか思いつかないのが現状

動的パーティションの何かしらのオプション使うなり、ログ形式変えればうまくできるんですかね、

https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/Message_extraction.html

~~(改行入ってないやんけ)~~
Quitaデビュー + Atcoderで得た学びを書く日記的な

# 目次
[1.初めに](#初めに)
[2.今日行ったこと](#今日行ったこと)
[3.次やりたいこと](#次やりたいこと)
[4.最後に](#最後に)

## 初めに
筆者は某IT系？の会社で働いている一般エンジニアです。
エンジニアとして働くうえで色々勉強をするモチベーションが沸いてきて、それと同時に何かアウトプットを発信してみたい！と思ったのでQiitaを始めてみました。
これから勉強をしていく上で得た学びみたいなものを無理しないペースで書いていこうと思います。

## 今日行ったこと
###### ・Atcoderの環境設定
以下の記事を参考にしました！言語はPythonを選択。

https://qiita.com/marogoma/items/c39ee7638c2a3ae7552d

###### ・[AtCoder Beginners Selection](https://atcoder.jp/contests/abs)を3問解く
Pythonが初めてなので入力とかってどうやって受け取るんだ？とかからスタート。
楽しい！
![スクリーンショット 2024-10-25 003640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3888319/cd7399e3-4acc-5e33-330b-262f09c76ae5.png)

以下は参考にしたもの

https://note.nkmk.me/python-str-count/

https://qiita.com/scythercas/items/5e08dfffb49468dd1176

###### ・Qiita初投稿
Markdown記法に慣れないが、とりあえず調べながらわかりやすいように書いてみた。
記事ペタペタ貼ってるだけだけど。。。

https://qiita.com/konyaru/items/ffd0b7edb11dfeb98a3f

https://qiita.com/Kanako9581/items/c41ddc14fa39d1c66c27

## 次やりたいこと
・AtCoder Beginners Selectionを全問解く
・AWS Certified Cloud Practitionerの受験に向けて勉強

## 最後に
こういった形で毎日更新ってわけではないけど、今後節目だったりで書いてみます！
いつか成長したときにこの記事を見て懐かしめることを目標にします！
混合分布の期待値、分散

```math
\begin{align*}
E[X]&= \sum_{i=1}^np_i\mu_i  \\

E[g(X)] &= \sum_{i=1}^np_iE[g(X_i)] \\

V[X] &= \sum_{i=1}^np_i\sigma_i^2 + \sum_{i=1}^{n-1} \sum_{j=i+1}^np_ip_j(\mu_i - \mu_j)^2 \\
&= \sum_{i=1}^np_i\sigma_i^2 + \frac{1}{2} \sum_{i=1}^n\sum_{j=1}^np_ip_j(\mu_i - \mu_j)^2
\end{align*}
```
表示を新しい順にする【備忘録】

写真とか投稿とか普通に記述すると左上から右下にかけて古い順（記録順）に表示されるけど、順序を逆に、新しい順に表示したいとき。

orderメソッド（まずこれで順序を並び替える）
created_at: （データベースのカラム名、情報をいつ登録、保存したかが記録されているのでこれが基準になる日時情報（タイムスタンプ）。
:desc （「降順（Descending）」の略。降順は新しいものから古いものへという順序。新しく保存された商品から順に並べる、という意味になる。逆に、:asc（「昇順（Ascending）」）を使うと古いものから新しいものへ並ぶ。

実際の書き方は
```
app/controllers/items_controller.rb
Item.all.order(created_at: :desc)
Item.order(created_at: :desc)
```
両方とも同じ意味（allは省略できる）。orderメソッドは内部的にallも含んでいる。データベースの全レコードを対象に処理が行われるので、全てのデータを取得して並べ替えが行われてる。
【学習記録　2024-10-24】


## 使用した教材など
Udemy：【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）
## 学習内容
- 模擬問題演習

## 所感
　そこそこ理解が深まってきました。今月中には合格できるかもです！
RiderとWebStormの"非商用利用"が無料になった（2024年10月）


JetBrains社製の.NET向けIDEであるRider、そしてウェブ開発向けのIDEであるWebStorm。この2つのIDEの「非商用利用」が無料になったと、公式ブログで2024年10月24日発表されました。

なお、無料になったのは「非商用利用」である点に注意してください。


---

* [公式ブログ（英語版）](https://blog.jetbrains.com/blog/2024/10/24/webstorm-and-rider-are-now-free-for-non-commercial-use/)より

> WebStorm and Rider are now free for non-commercial use!

* [公式ブログ（日本語版）](https://blog.jetbrains.com/ja/blog/2024/10/24/webstorm-and-rider-are-now-free-for-non-commercial-use)より

> WebStorm と Rider の非商用利用が無料になりました！

---

繰り返しになりますが、無料になるのは「非商用利用」です。

「この場合どうなる？」という説明が、詳しく公式ブログのFAQに載っています。まずはそちらを読むことをオススメします。

* [公式ブログ（英語版）のFAQ](https://blog.jetbrains.com/blog/2024/10/24/webstorm-and-rider-are-now-free-for-non-commercial-use/)
* [公式ブログ（日本語版）のよくあるご質問](https://blog.jetbrains.com/ja/blog/2024/10/24/webstorm-and-rider-are-now-free-for-non-commercial-use/#よくあるご質問)

---

「Rider、商用目的に使ってみたいんだけれど、まずは機能をためしてみたいな〜」という方もいるでしょう。

RiderなどJetBrainsのIDEには「無料30日間体験版」があり、そちらで機能を試すことができます。商用利用を検討している人は、「無料30日間体験版」でRiderの素晴らしい機能を試してから、購入を検討することをおすすめします。

* 購入ページ : https://www.jetbrains.com/ja-jp/rider/buy/?section=personal&billing=yearly

---

また、実はもともとRiderなどJetBrainsのIDEには、学生やスタートアップ向けの特別オファーがあります。
特別オファーの条件を満たせば、かなりお得に購入することもできます。商用目的で利用したい方は、自分が満たす条件がないか、チェックすることをおすすめします。

* 特別オファー : https://www.jetbrains.com/ja-jp/store/?section=discounts&billing=yearly
* 学生向けオファー : https://www.jetbrains.com/ja-jp/store/?section=students&billing=yearly

---


RiderとWebStormの"非商用利用"が無料になりました。Rider好きな自分（WebStormも好きですよ）としては、これをきっかけにRider愛好家・JetBrains IDE愛好家が増えればとても嬉しいです。

非商用で利用される方は無料で、商用目的で利用される方は適切にライセンスを購入・獲得して、Riderを活用しましょう！Riderはいいぞ！

※本記事は、2024年10月25日時点の情報で執筆しています。