OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】エイリアスメソッドについてのまとめ_Ruby Silver対策


Ruby Silverの勉強をする中で同じ機能のメソッドの問題が結構あったので、
この機会にしっかりとまとめようと思います。

# Arrayクラス

## map, collect
各要素に処理を施す(非破壊)

```ruby
p (1..3).map {|n| n * 3 }  # => [3, 6, 9]
p (1..3).collect {|n| n * 3 } # => [3, 6, 9]
```

## map!, collect!
map,collecgtの破壊版
```ruby
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array.collect! { |item| item * 3 }
p array # => [3, 6, 9, 12, 15, 18, 21, 24, 27]
```

```ruby
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array.map! { |item| item * 3 }
p array # => [3, 6, 9, 12, 15, 18, 21, 24, 27]
```

## size, length
配列の長さを取得
```ruby
p [1,2,3].size # => 3
p [1,2,3].length # => 3
```

## include?, member?

```ruby
p [1,2,3].member?(3) # => true
p [1,2,3].include?(4) # => false
```
## unshift, prepend
```ruby
arr = [1,2,3]
arr.prepend(0)
p arr  # => [0, 1, 2, 3]
```

```ruby
arr = [1,2,3]
arr.unshift(0)
p arr  # => [0, 1, 2, 3]
```

## push, <<
```ruby
p [1,2,3].push(4) # => [1, 2, 3, 4]
p [1,2,3] << 4  # => [1, 2, 3, 4]
```
## detect, find
```ruby
p [1,2,3].find {|n| n % 2 == 0} # => 2
p [1,2,3].detect {|n| n % 2 == 0} # => 2
```

## select, find_all
```ruby
p [1,2,3,4].select {|n| n % 2 == 0} # => [2, 4]
p [1,2,3,4].find_all {|n| n % 2 == 0} # => [2, 4]
p [1,2,3,4].filter {|n| n % 2 == 0} # => [2, 4]
```

# Hashクラス
## has_key?, key?, include?, member?
```ruby
h = { "a" => 0, "b" => 100, "c" => 200, "d" => 300, "e" => 300 }
p h.has_key?("a")   #=> true
p h.key?("a")       #=> true
p h.include?("z")   #=> false
p h.member?("z")    #=> false
```

## has_value?, value?
```ruby
h = { "a" => 0, "b" => 100, "c" => 200, "d" => 300, "e" => 300 }
p h.has_value?(0) # => true
p h.value?(0) # => true
```

## update, merge!
```ruby
h = { "a" => 0, "b" => 100, "c" => 200, "d" => 300, "e" => 300 }
h.update({"f" => 400})
p h #=> {"a"=>0, "b"=>100, "c"=>200, "d"=>300, "e"=>300, "f"=>400}
```

```ruby
h = { "a" => 0, "b" => 100, "c" => 200, "d" => 300, "e" => 300 }
h.merge!({"f" => 400})
p h #=> {"a"=>0, "b"=>100, "c"=>200, "d"=>300, "e"=>300, "f"=>400}
```
Migrate termux to F-Droid

## Install f-droid

visit https://f-droid.org/

## Setup storage

Settings -> Applications -> Termux -> Permissions -> File, allow

アプリ -> Termun (or Termuxアイコン長押し) -> 権限 -> ファイル、許可

## Backup termux

```
cd /data/data/com.termux/files
tar -czf /sdcard/backup.tar.gz ./home ./usr
```

Now uninstall termux and install from f-droid.

## Restore termux

```
cd /data/data/com.termux/files
tar -czf /sdcard/backup.tar.gz --recursive-unlink --preserve-permissions
```

## References

- https://wiki.termux.com/wiki/Backing_up_Termux
- https://wiki.termux.com/wiki/Termux-setup-storage
TiDB 関連イベント 7月分

あれれ？ 6月後半から怒涛の忙しさで7月分のイベントを投稿するのを忘れていました　:sweat:
もう終わってしまったものも多いのですが、 ご容赦ください！　

PingCAP主催のもの、コミュニティイベントに参加するものの両方を記載しています。
WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。

イベント/社内勉強会でTiDBについて話してほしいというリクエストはお気軽に @bohnen ([X/@bohnen](https://twitter.com/bohnen)) までご連絡ください。

## Special: TiDB Future App Hackathon 2024

https://pingcap.co.jp/event/tidb-future-app-hackathon-2024/

TiDB Serverlessを用いたAIアプリケーションのハッカソンです！ ことしはスポンサーにAI関連の様々な企業をお迎えして、ワールドワイドで優れたAIアプリケーションの開発を競います。日本からの参加もお待ちしています！

ハッカソンのサイトはdevpostで行っていますので、記事中のリンクから登録開始してください。

## 7月3日（水） TiDB User Day :congratulations:

https://pingcap.co.jp/tidb-user-day/

年に一回のTiDBオンリーイベント、TiDB User Dayのご案内です。
大変に盛り上がりました！ありがとうございます。

## 7月12日(木), 13日(金) DB Tech Showcase

https://www.db-tech-showcase.com/

今年もやってきました、年に一度のDB技術の祭典、DB Tech showcaseです。
TiDBはなんと3年連続「今後使ってみたいデータベース」のNo.1になりました。:congratulations:
ことしは現在使っているデータベースにランクインし、使ってみたいけど敷居の高いデータベースからは脱却できたのかなと一安心です。

後でアーカイブが公開されると思いますので、是非御覧ください。

## 7月16日（火） TiUG ソースコード輪読会　#1

https://tiug.connpass.com/event/319256/

ユーザーグループによるTiDB　ソースコードの輪読会です。TiDBのオプティマイザを題材にしています。
題材が難解に思えますが参加資格はありませんので、ちょっとDBの中を覗いてみたい人からGo言語のでっかいプロジェクトの作りを見てみたい人まで是非どうぞ。学んで得たことを共有するような場所になると良いですね。

## 7月18日(木）　[ウェビナー] こば x pospomeさんと考える 後から損しないクラウド時代のデータベースの選び方（TiDB等）

https://offers-jp.connpass.com/event/324296/

データベースソムリエのこばさんと、TiDBのヘビーユーザーでもあるpospomeさんがDB選定について語るイベント（のようです）。 内容については伺ってないのですが、このお二方ならためになること間違いなしでしょう！

## 7月25日(木） [ウェビナー] TiDB Serverlessのベクトル検索機能の紹介

https://pingcap.co.jp/event/introduction-to-tidb-serverless-vector-search-functionality/

パブリックベータになったTiDBのベクトル検索機能の紹介です。講師はおなじみPingCAPの本田さんです。TiDB Future App Hackathonの必須機能でもありますので、ここでおさらいしてハッカソンに備えましょう。

## 7月２７日(金) TiDB Future App Hackathon 2024 提出開始！

https://tidbhackathon2024.devpost.com/

冒頭紹介したHackathonの提出開始日です。皆様奮ってご参加ください！
スプレッドシートで時間毎のキャスト人数を把握したい。

## 条件
1.現在時刻とシフトの時間が一致かつ
2.各担当にOKがあればカウントする

現在時刻を表示するために下記の関数をセルに入力。
```VB
=NOW()
```

`CONTIFS`関数を使用してキャストの人数を表示。
表示する範囲を時間毎に変更するため、`FILTER`関数で範囲を指定。
時間は`HOUR`関数で時間の部分だけを取得。(12:00の12だけを取得)
```VB
=COUNTIFS(FILTER($G$2:$J$6,(HOUR($G$2:$J$2))=(HOUR($A$7))), "キャスト",FILTER($B$2:$E$6,$B$2:$E$2=B2), "OK")
```


https://note.com/mir4545/n/nb9f3d55b7a13
Pythonでゲーム開発を始めよう：Pygameを使った実践ガイド

こんにちは。今回は、Pythonでのゲーム開発に興味がある方向けに、簡単な数当てゲームを作成する方法を紹介します。
Pythonは初心者にも扱いやすく、強力なゲーム開発ライブラリが豊富です。

## Pythonでゲームを作るメリット

Pythonはコードがシンプルで読みやすく、初心者にも理解しやすい言語です。また、Pythonで作成したゲームはWindows、macOS、Linuxなどのマルチプラットフォームで動作します。さらに、豊富なライブラリやフレームワークを活用することで、効率的にゲームを開発することが可能です。

### 環境設定

まずはPythonの環境設定から始めましょう。Pythonをインストールし、必要なライブラリもインストールします。

#### Pythonのインストール

Pythonをインストールするには、[公式サイト](https://www.python.org/)からインストーラをダウンロードし、指示に従ってインストールします。インストールが完了したら、ターミナルやコマンドプロンプトを開き、「python」と入力して、バージョンが表示されるか確認しましょう。

## 簡単な数当てゲームの作成

Pythonを使ってシンプルな数当てゲームを作成します。このゲームでは、プレイヤーがコンピュータが生成した数を当てることを目指します。

### ゲームのロジック

数当てゲームは、コンピュータがランダムに生成した数をプレイヤーが推測するゲームです。プレイヤーの入力に対して、コンピュータは「大きい」「小さい」または「正解」を返します。

```python
import random

def number_guessing_game():
    number_to_guess = random.randint(1, 100)
    guess = None
    attempts = 0

    print("数当てゲームへようこそ！1から100までの数字を当ててください。")

    while guess != number_to_guess:
        guess = int(input("あなたの推測: "))
        attempts += 1

        if guess < number_to_guess:
            print("もっと大きい数です。")
        elif guess > number_to_guess:
            print("もっと小さい数です。")
        else:
            print(f"正解です！{attempts}回で当たりました。")

if __name__ == "__main__":
    number_guessing_game()
```

このコードは、数当てゲームを実装したものです。コンピュータは1から100までのランダムな数を生成し、プレイヤーはその数を推測します。各推測に対して、コンピュータは「もっと大きい数です」または「もっと小さい数です」とフィードバックを与えます。

## まとめ

- Pythonでゲームを作るメリット
- 環境設定の簡便さ
- 簡単な数当てゲームの作成手順

Pythonでのゲーム開発は初心者でも簡単に始められます。ぜひ挑戦してみてください。
何も考えずgit add . することから卒業しよう

# はじめに
こんにちは！新人エンジニアの @shinkaaaai です。

Gitは多くのソフトウェア開発の現場で使われており、研修などで学ぶ機会も多いと思いますが、Gitの真意が理解できずに、とりあえず使えるコマンドだけ覚えているという人も多いのではないでしょうか。(というか私がそうだった:sob:)

特に`git add`は初心者には中々理解が難しく、私もとりあえず`git add . `とやっていた期間が結構ありましたが、先日社内の @k_uki512 主催のGitのLT会に参加した際に`git add`のありがたさを実感したので共有したいと思います。

 # 基本のおさらい
Gitはワーキングディレクトリとステージングエリアとローカルリポジトリという3つの状態を駆使して変更履歴を管理しています。

![areas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828633/024c8dca-432e-bd22-2e10-27c9f148c1a3.png)
> https://git-scm.com/book/en/v2/Getting-Started-What-is-Git%3F より引用

 ワーキングディレクトリは今の作業環境の状態のことです。今の作業状態の中から変更を記録したいファイルを`git add ファイル名`とすると指定したファイルがステージングエリアに移ります。
 
 そしてステージングエリアにあるファイルたちを`git commit -m "コミットメッセージ"`とすることで、ローカルリポジトリにファイルが移動し、変更がコミットとして正式に記録されます。
 
ローカルリポジトリにあるコミットをGitHubなどで作ったリモートリポジトリに反映させるには`git push`をします。リモートリポジトリに変更が反映されていることを確認したらpull requestを作り、他のエンジニアにレビューしてもらうというのが一般的な開発の流れになっています。

# 何も考えずにやりがちな`git add . `
**Gitはコミット単位で変更履歴を管理するツール**です。綺麗にコミットを残すことで誰かにレビューをしてもらったり、元のバージョンに戻して実装し直すということがやりやすくなります。

ここまでの話を聞いていると、ワーキングディレクトリからローカルリポジトリに直接変更をコミットできた方が便利に思う人もいるかもしれません。確かにそれでも変更を記録するということはできます。

そうするととりあえず`git add . `や`git add -A`などで、全ての変更をステージングエリアに上げてコミットしてしまいがちです。

しかし、これはコミットをレビューする視点に立つと良くありません。具体例を使って説明していきます。

## 良くない具体例
あなたはSNSサービスの開発を行っています。今日は実装が進み、ユーザーネームの検索機能と投稿へのいいね機能の2つの機能を実装することができました！
そして、今日の変更分をまとめて次のようにコミットしました。

- `git add . `で今日の変更分の全てをステージングエリアに上げる
- `git commit -m "feat : 検索機能といいね機能の追加"`としてコミットする
- `git push`でリモートリポジトリに変更を反映させる

今日の変更分がリモートリポジトリに反映されていることを確認し、先輩エンジニアにpull requestを出したところ、先輩に少し嫌な顔をされました:confounded:

## どこが良くないのか
**そもそもコミットはもっとこまめに行うべきです。**
先ほどの具体例では、1つのコミットに"検索機能"と"いいね機能"という2つの追加機能の変更が反映されてしまっていて、レビューする側としては2つの機能のコードレビューを一気にやらないといけなくなるため、負荷が大きいです。この辺の話は[@_miさんがまとめた素晴らしい記事](https://qiita.com/_mi/items/f477e95a864474187e3d)が参考になるので是非読んでください。

## どうすれば良かったのか
まず、検索機能といいね機能のコミットは分けたいのですが、その時にステージングエリアの有難さがわかります。

- `git add ファイル名 `で**検索機能に関するファイルをステージングエリアに上げる**
- `git commit -m "feat : 検索機能の追加"`としてコミットする
- `git add ファイル名 `で**いいね機能に関するファイルをステージングエリアに上げる**
- `git commit -m "feat : いいね機能の追加"`としてコミットする
- `git push`でリモートリポジトリに変更を反映させる

ステージングエリアがあることで2つの機能が実装されたのワーキングディレクトリの状態をそのままコミットするのではなく、機能ごとに実装したファイルを分けてコミットすることができています。

コミットを分けることで先輩エンジニアも機能ごとにコミットを確認すればよいので、コードレビューが各段にやりやすくなります:thumbsup:

 このように`git add`及びステージングエリアはコミットを整理するために存在しています。

# `git add . `をどう使うのか
ここまで`git add . `を使うのは良くない理由をひたすら書いてきましたが、このコマンド自体はとても便利で使いやすいものです。

大事なのは`git add . `を何となく使うのはコミットが複雑になりがちなので辞めた方がいいということです。

`git status`や`git diff`で変更ファイルや変更部分を確認してから、この変更ならコミットに全部含めていいと考えて、`git add . `することは何の問題もありません。


# まとめ
- **`git add`で使えるステージングエリアはコミットを整理するためにある**
- **コミットに含める変更はできるだけ簡潔にしよう**
- **`git add . `を使う前に`git status`や`git diff`で変更箇所を確認しよう**

私もこれからは綺麗なコミットを残せるように`git add`を使いこなしていきます！

もしこの記事が参考になると感じて下さったのなら、いいねやコメントを頂けるとこれからの励みになります:pray:

# 参考
- [git addをする理由について](https://qiita.com/redrabbit1104/items/2046a7853351e69c1b18)
- [コミット履歴が " きれい " なPRはすごく助かる。ありがたい。好き。](https://qiita.com/_mi/items/f477e95a864474187e3d)
- [Git公式ドキュメント What is Git?](https://git-scm.com/book/en/v2/Getting-Started-What-is-Git%3F)
AIエンジニアの将来: 明るい展望と必要なスキル

## はじめに

人工知能（AI）技術の急速な進化により、AIエンジニアの需要が高まっています。本記事では、AIエンジニアの将来性、必要なスキル、そして業界の変化について探ります。AIの専門家との対話を基に、AIエンジニアを目指す方々や、キャリアの方向性を考えている方々に向けて、有益な情報をお届けします。

## AIエンジニアの将来性

AIエンジニアの将来は非常に明るいと言えます。以下に、その理由をいくつか挙げてみましょう。

### 需要の増加

AI技術の進化と共に、様々な産業でのAI応用が広がっています。
特に以下の分野でAIの役割が重要になっています：

- データ分析
- 予測モデルの構築
- 業務プロセスの自動化

これらの分野でAIを活用することで、企業は競争力を高めることができます。そのため、AIエンジニアの需要は今後も増加すると予想されます。

### 役割の進化

AIエンジニアの役割は、単なるコーディングやモデル構築にとどまりません。今後は以下のような能力も求められるようになるでしょう：

- ビジネス課題の解決
- 戦略的な意思決定の支援
- 倫理的なAI開発

つまり、技術的なスキルだけでなく、ビジネス理解や倫理的な判断力も重要になってきます。

### 継続的な成長の機会

AI技術は日々進化しています。そのため、AIエンジニアには常に最新の知識を習得し続ける姿勢が求められます。これは挑戦でもありますが、同時に継続的な成長の機会でもあります。

## AIエンジニアに必要なスキルと知識

AIエンジニアとして成功するためには、以下のようなスキルと知識が必要です。

### 1. プログラミングスキル

- Python、Rなどの言語の深い理解
- TensorFlow、PyTorch、scikit-learnなどの機械学習ライブラリの使用経験

### 2. 数学と統計学の知識

- 線形代数
- 微積分
- 確率論
- 統計学

これらの基礎知識は、AIアルゴリズムの理解と効果的な応用に不可欠です。

### 3. データサイエンススキル

- データの前処理
- データ分析
- データの可視化
- パターン認識とインサイトの抽出

### 4. 機械学習と深層学習

- 機械学習アルゴリズムの理解
- ニューラルネットワークの設計
- モデルの訓練と評価
- ハイパーパラメータのチューニング

### 5. クラウドコンピューティング

- AWS、Google Cloud、Azureなどのクラウドプラットフォームの活用
- 分散処理技術の理解

### 6. ソフトスキル

- コミュニケーション能力
- プロジェクト管理スキル
- チームワーク
- 問題解決能力

### 7. 継続的学習

- 最新の研究論文の理解
- 新しい技術トレンドのキャッチアップ
- オンラインコースやカンファレンスへの参加

## AIが業界に与える影響

AIの進化は、エンジニアリング業界全体に大きな影響を与えています。

### 既存のエンジニアへの影響

AIの台頭により、既存のエンジニアにも変化が求められています：

- ソフトウェアエンジニア：AIアルゴリズムや機械学習モデルをソフトウェアに統合する技術の習得が必要になります。
- データサイエンティスト：AIを活用してデータ分析の効率を上げる方法を学ぶことが求められます。

### エンジニアの効率化

AIツールを活用することで、エンジニアの業務効率が大幅に向上します。
例えば

- コードの自動生成
- バグの自動検出と修正
- テストの自動化

これにより、エンジニアはより創造的で高付加価値の業務に集中できるようになります。

### チーム構成の変化

AIの導入により、エンジニアチームの構成も変化する可能性があります：

- 上級エンジニア：AIツールを駆使して高度な問題解決を行います。
- 初級エンジニア：上級エンジニアのサポートや、AIツールでは対応できない業務を担当します。

ただし、初級エンジニアが完全に不要になるわけではありません。チームの多様性や、エンジニアの成長過程を考えると、様々なレベルのエンジニアが協力することが重要です。

## AIエンジニアになるためのステップ

AIエンジニアを目指す方々に、具体的なステップを提案します。

1. **基礎の学習**: Pythonの基本文法、データ分析や機械学習の基本概念を学びます。
2. **実践プロジェクト**: Kaggleなどのプラットフォームで実際のデータを使ったプロジェクトに取り組みます。
3. **機械学習の理論**: 線形回帰、決定木、クラスタリングなどの機械学習アルゴリズムの理論を学びます。
4. **深層学習の学習**: ニューラルネットワークや深層学習の基本概念を学び、TensorFlowやPyTorchでモデルを構築します。
5. **実装とデプロイ**: 構築したモデルを実際のアプリケーションに統合し、クラウドプラットフォームでデプロイする方法を学びます。
6. **コミュニティ参加**: AIコミュニティに参加し、他のエンジニアや研究者と情報交換を行います。
7. **継続的な学習**: 最新の研究論文を読んだり、オンラインコースで新しいスキルを学び続けます。

## 結論

AIの進化でエンジニアは不要だと言う意見を時々耳にします。
しかし逆にAIがある事でより高度な事に挑戦出来る環境が整い、より多くのエンジニアが必要になるのだと思う訳です。
AIエンジニアの将来は明るく、需要が増加し続けることが期待されます。
必要な知識や技術を習得し、継続的に学び続けることで、キャリアの成長と多くの機会が得られるでしょう。

AIを活用することでエンジニアとしての役割が進化し、より高度な問題解決やビジネスの課題に取り組む能力が求められるようになります。
そのため、技術スキルだけでなく、ビジネス理解や倫理的な判断力も重要になってきます。

最後に、AIエンジニアを目指す方々へのアドバイスをまとめます：

- 基礎をしっかり固める
- 実践的なプロジェクトに取り組む
- 最新の技術トレンドをキャッチアップし続ける
- コミュニティに参加し、ネットワークを広げる
- 倫理的な側面にも注意を払う

AIの世界は常に進化し続けています。
好奇心を持ち、学び続ける姿勢を大切にすることで、AIエンジニアとして成功する道が開けるでしょう。
GitHubでパーソナルアクセストークンを設定する

GitHubが2021年8月13日以降、パスワードによる認証を廃止したため、パーソナルアクセストークン（PAT）あるいはSSHキーでの認証を行う必要がある。SSHキーでの設定方法は[こちら](https://qiita.com/mz_mz_mz/items/1c9a73031870b082675c)。

### 1. パーソナルアクセストークン（PAT）を生成

1.	[GitHubのウェブサイト](https://github.com)にログイン
2.	右上のプロフィールアイコンをクリックし、Settings を選択
3.	左側のメニューから Developer settings を選択
4.	Personal access tokens を選択し、次に Tokens (classic) を選択
5.	Generate new token ボタンをクリック
6.	トークンに適切な名前を付け、必要なスコープ（例えば、repo など）を選択
7.	Generate token をクリック
8.	表示されたトークンをコピー　※このトークンは一度しか表示されないため、安全な場所に保存

### 2\. リモートURLを更新

GitHubリポジトリのリモートURLを更新して、パーソナルアクセストークンを使用できるようにする。

```ruby:sh
git remote set-url origin https://[your_token]@github.com/[your-username]/hello-world-app.git
```

以上。

SSHキーでの認証方法はこちら。

https://qiita.com/mz_mz_mz/items/1c9a73031870b082675c
Excelを使用したキャプチャ自動取得ツールの供養

## はじめに
今回の記事は今までとだいぶ異なり、私がはるか昔に作ったキャプチャツールの供養になります。
当時とある現場でWinshotでキャプチャを取得し、それを1つずつExcelに貼ってエビデンスをまとめるという作業を現場でやっていました。
現場の制約上、外部ツールがWinshotくらいしか使えず、時間が滅茶苦茶かかり困っていました。

当時駆け出しだった私はプログラミングをまともにやったことが無いものの、これを作ったら絶対作業効率化になる！という思いでPMや先輩に相談してこのツールを作った記憶があります。
結果1時間30分くらいかかっていたエビデンス取得からExcelへ貼る作業が、30分くらいになり滅茶苦茶時短になって感動しました。
今思えばこのキャプチャ取得ツールが私の原点にあるような気がします。
今でもあの現場の方々には心から感謝しています。

## 使い方
Excelの「開始」ボタンを押すとキャプチャが開始されます。
確か1秒毎にクリップボートに画像があるか見に行くような作りだった気がします。

終わるときは「終了」を押すと任意のシート名が入力でき、何も入れないと現在日時などを自動で入力します。
最後「保存」を押すとマクロのあるカレントフォルダにシートだけを分離したExcelが自動で作成されます。
一時停止したい時は「停止」を押すとキャプチャ監視モードが停止し、再度「開始」を押すと「エビデンス」シートの後続に貼り付けていってくれます
「終了」はシートで完全に分離、「停止」は一時中断のようなイメージです。

## せっかくなのでGit HUBで公開します
当時現場で作ったものと今回公開している物は多分動きが異なります。
今回公開した物は家でお試しで作って現場でそれを同じ感じで打ち込んだ気がします。

https://github.com/motuneko253/VBA_AutoCapture

## 最後に
今見たら多分なんじゃこれってなりますし、決して品質のいい物とは思えないです。
でも私の初めの一歩としてせっかくなので形として残しておきたいと思い今回記事とGit HUBにアップロードしました。
この初めの一歩を忘れず今後のエンジニア人生も歩んでいきます。

## 参考サイト
・【VBA】シート名が重複したら連番になるワークシートの新規作成【改】
https://tanisukestr.hatenablog.com/entry/2018/05/31/192838
C++やCの浮動小数点数から整数への変換における思い込みによるバグ

# はじめに
C++やCでは，浮動小数点数が整数に変換されるとき，基本的に小数点以下が切り捨てられます．この挙動に対する思い込みが原因で，バグに遭遇したことがあります．実際のソースコードではありませんが，それを理解しやすくするために改変したプログラムを使って説明します．

# バグのあるプログラム
0からN-1までの整数乱数を生成し，その頻度をヒストグラムにしています，ここでは`N = 10`，繰り返し回数は`M = 100000000`としています．メルセンヌ・ツイスタを使って，0から$2^{32}-1$までの乱数を発生させ，それを$2^{32}$で割ることにより，0.0以上1.0未満の浮動小数点数に変換しています．整数での除算は整数値になってしまうため，分母と分子を一旦浮動小数点数に変換してから除算を行っています．この0.0以上1.0未満の浮動小数点数に`N = 10`を掛けると，0.0以上10未満の値が得られます．そして，それを整数に変換すると切り捨てが行われ，0以上9以下の値になるはずです．

```C++
#include <iostream>
#include <random>
#include <vector>

class MyRandom {
  std::mt19937 mt;

 public:
  MyRandom() : mt(std::random_device{}()) {}
  // 0.0以上1.0未満の乱数を返すことを意図している
  float operator()() {
    return static_cast<float>(mt()) /
           (static_cast<float>(std::mt19937::max()) + 1);
  }
};

int main() {
  const int N = 10;
  const int M = 100000000;
  MyRandom rnd;
  std::vector<int> histogram(N, 0);
  // 0からN-1までの乱数を生成し、その値のヒストグラムを作成することを意図している
  for (int i = 0; i < M; i++) {
    // rnd() * Nは0.0以上N未満の乱数を返すことを意図している
    histogram[static_cast<int>(rnd() * N)]++;
  }
  int sum = 0;
  for (int i = 0; i < N; i++) {
    sum += histogram[i];
    std::cout << i << ": " << histogram[i] << std::endl;
  }
  std::cout << "sum: " << sum << std::endl;

  for (int i = 0; i < M; i++) {
    if (rnd() == 1) {
      std::cout << "rnd() == 1" << std::endl;
    }
  }
}
```

# 実行結果
実行すると，次のような結果が得られます．ヒストグラムの合計が99999998となり，`M = 100000000`より2少なくなっています．
```
0: 10000972
1: 9994335
2: 10001085
3: 9996150
4: 10002344
5: 9997849
6: 10000672
7: 9996816
8: 10006780
9: 10002995
sum: 99999998
```

# バグの原因
これは，割り算の結果がちょうど1になることがあり、`rnd() * N`が10になってしまうためです。浮動小数点演算では四捨五入による丸めが行われます．32ビット整数を32ビット浮動小数点数（float）に変換して割り算を行っていますが，これらの計算処理は切り捨てとは限らず，結果として切り上げとなることもあります．floatの仮数部は23ビットなので，32ビット整数をfloatに変換すると9ビット分足りず，表現できる値に丸められます．そのため，割り算の分母と分子のfloatの値が一致し，ちょうど1となることがあります．これにより，配列の範囲外をアクセスすることになり，Segmentation faultが発生する可能性があります．

# おわりに
メルセンヌ・ツイスタを使って0からN-1の整数乱数を発生させるのであれば，`mt() % N`とするだけでよく，こんなおかしなプログラムを書く必要はありません．では，なぜこのようなプログラムを書いたのかというと，それはGPU用のプログラムだったからです．一般に，GPUではfloatの演算の方が整数演算より効率が良いため，なるべく整数演算を避け，floatの演算を使うようにしていた結果，このようなプログラムを書いてしまいました。
【マインクラフト（統合版）】Websocketサーバーを使って「いなずまの矢」を作ってみました

# はじめに

以下のように矢を放った場所へ稲妻を落とせます。
![いなずまの矢](https://socket-manager.github.io/document/minecraft-contents/img/arrow-thunder/arrow.gif "いなずまの矢")

地上だけではなく以下の場所でも使える事を確認しています。

<ul>
    <li>水中</li>
    <li>洞窟</li>
    <li>ネザー</li>
    <li>エンド</li>
</ul>


# 動作環境

<dl>
    <dt>プラットフォーム</dt>
    <dd>Windows10</dd>
    <dt>マインクラフト（統合版）</dt>
    <dd>Windows Edition v1.21.2</dd>
    <dt>socket-manager</dt>
    <dd>v1.13.3</dd>
    <dt>言語</dt>
    <dd>PHP v8.2.4（v8.1.0以降）</dd>
</dl>


# 「いなずまの矢」を取得

socket-manager環境のビヘイビアパック／リソースパックなどのアドオンパックを適用しておけば、以下の方法でユニークアイテムとして「いなずまの矢」が手に入ります。

### ショップで購入する場合

以下のショップで購入できます。

https://qiita.com/glasses_seven/items/e77bfb43baf55e35680b/

### コマンドで取得する場合

以下はワールドオーナーやシステム組み込み用としてコマンドで取得する方法です。
<img src="https://socket-manager.github.io/document/minecraft-contents/img/arrow-thunder/command_arrow.png" height="600px" width="728px" />

<img src="https://socket-manager.github.io/document/minecraft-contents/img/arrow-thunder/get_arrow.png" height="600px" width="728px" />

あとはsocket-managerでWebsocketサーバーを起動後、マインクラフトからの接続が完了すれば「いなずまの矢」を含めた各種コンテンツが使えるようになります。

:::note info
socket-managerの導入方法やアドオンパックの所在については以下のページでご紹介していますのでご興味のある方はご覧ください。
:::

https://qiita.com/glasses_seven/items/433ac9d9fcbdb72c6d18/

:::note info
アドオンパックの適用方法については以下のページでご紹介しています。
:::

https://qiita.com/glasses_seven/items/a7d276b44c9437e7b0a4/


# サーバーサイドの実装

今回も「いなずまの弓」を作った時と同様に`ItemUsed`のサブスクライブイベントを使用しています。
サブスクライブイベントの処理内容については以下の記事をご覧ください。

https://socket-manager.github.io/document/extra-minecraft.html#send

今回の実装では「いなずまの弓」を作った時と処理フローが少し異なります。

-----
### 【いなずまの弓の場合】

<dl>
    <dt>(1)ItemUsedイベント（弓を使った時）の発生</dt>
    <dt>(2)稲妻を落とす座標を計算してsummonコマンドを発行</dt>
</dl>

-----
### 【いなずまの矢の場合】

<dl>
    <dt>(1)ItemUsedイベント（弓を使った時）の発生</dt>
    <dt>(2)ItemUsedイベント（矢を放った時）の発生</dt>
    <dt>(3)放った矢にタグを発行</dt>
    <dt>(4)放った矢の場所にsummonコマンドを発行</dt>
</dl>

-----

上記の事から大きく分けて二つの大きな違いがあります。

まず一つ目はイベントが２回発行されるという事です。
つまり「弓を使ったイベント」⇒「矢を放ったイベント」の順で２回発行されます。

そして二つ目の違いは放った矢にタグを付与しているところです。
これはJava版でも同じでしたが弓で矢を放つと別のエンティティ（矢）としてスポーンしますので、「いなずまの矢」を放ったプレイヤーの矢（エンティティ）にタグを付与する事で特別な矢である事を認識させます。
そして稲妻を落とす時（summonコマンド発行時）にターゲットセレクタでタグを指定するようにしています。
これをしておかないと通常の矢を放った時でも発動してしまいます。

あと忘れてはいけないのはWebsocketサーバーからはexecuteコマンドを発行できないという事です。
元々このコマンドはエンティティから実行されるように設計されているようなのでWebsocketサーバーはエンティティだと認識されていないからです。
そのため今回はWebsocketサーバーからfunctionコマンドを発行する事で実際のコマンド処理をビヘイビアパックで賄うようにしています。

実装内容の詳細は他のコンテンツも含めて以下のページでご紹介していますのでご興味のある方はご覧ください。

https://socket-manager.github.io/document/minecraft-contents/arrow-thunder.html

タグの付与方法の説明については以下のページでご紹介しています。

https://qiita.com/glasses_seven/items/294da5d23bd2e894f7d0/


# おわりに

先に作っていた「いなずまの弓」とコンボするとこんなイメージ。
![いなずまの弓とコンボ](https://socket-manager.github.io/document/minecraft-contents/img/arrow-thunder/combo.gif "いなずまの弓とコンボ")

これで安全に帯電クリーパーやピグリンも量産し放題でしょう。
YouTubeの動画の文字起こしからブログ記事を作成するスクリプトをChatGPTに作ってもらった

# はじめに
YouTubeの動画の文字起こしからブログ記事を作成するスクリプトをChatGPTに作ってもらいました。実行するにはAPIを使用するAPIのプランが必要です。YouTubeの解説を作るのに便利かも。ブログの記事はマークダウンでファイル出力されます。

# ライブラリ・環境
以下ライブラリが必要となる
``` bash
pip install openai youtube-transcript-api markdown2
```

OpenAIのAPIキーは環境変数で設定する
``` bash
export OPENAI_API_KEY=your_openai_api_key
```

# 実行スクリプト（Generated by ChatGPT4o）
途中まで動くところは確認したがAPIの有料プランに申し込んでないので、プロンプトで記事が作成されるところは未検証。適宜修正してください。ChatGPTが提案してくるコードはちょっと古いAPIで、最新ライブラリへの[マイグレーション](https://github.com/openai/openai-python/discussions/742)が必要だった。以下は修正済みのコード。
``` Python
import os
import sys
import openai
from openai import OpenAI
import markdown2
from youtube_transcript_api import YouTubeTranscriptApi

# YouTubeのURLから動画IDを抽出する関数
def extract_video_id(url):
    import re
    match = re.search(r'(?:v=|\/)([0-9A-Za-z_-]{11}).*', url)
    if match:
        return match.group(1)
    return None

# YouTubeの動画IDから文字起こしを取得する関数
def get_transcript(video_id):
    transcript_list = YouTubeTranscriptApi.get_transcript(video_id)
    transcript = " ".join([t['text'] for t in transcript_list])
    return transcript

# OpenAIのAPIを使って記事を生成する関数
def generate_article(transcript, youtube_url, client):
    prompt = f"以下の文字起こしに基づいて、2000字程度の日本語の記事を作成してください。各項目には見出しをつけ、タイトルも作成してください。記事の先頭にはYouTube動画へのURLのリンクを埋め込み形式で記載してください。\n\n{transcript}"
    
    response = client.chat.completions.create(
      model="gpt-3.5-turbo",
      messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": prompt}
      ],
      max_tokens=2048
    )
    
    return response.choices[0].message['content'].strip()

# 生成された記事をMarkdownファイルに書き込む関数
def write_to_markdown(article, filename):
    with open(filename, 'w', encoding='utf-8') as f:
        f.write(markdown2.markdown(article))

# メイン処理
def main():
    if len(sys.argv) < 2:
        print("使用法: python script.py <YouTubeのURL>")
        return

    youtube_url = sys.argv[1]
    openai_api_key = os.getenv('OPENAI_API_KEY')
    if not openai_api_key:
        print("OPENAI_API_KEYが設定されていません。")
        return

    client = OpenAI(api_key=openai_api_key)
    output_filename = "article.md"
    
    video_id = extract_video_id(youtube_url)
    if not video_id:
        print("無効なYouTube URLです。")
        return
    
    transcript = get_transcript(video_id)
    article = generate_article(transcript, youtube_url, client)
    write_to_markdown(article, output_filename)
    print(f"記事が {output_filename} に保存されました。")

# メイン処理を実行
if __name__ == "__main__":
    main()
```

以下のように実行することで、YouTube動画からブログ記事が作成される。
```
python script.py <YouTubeのURL>
```

# まとめ
どの言語でも解説が作成できるので、英語の動画見てわからないな、と思ったら記事を作ってついでにブログに載せたりしてもいいんじゃないでしょうか。プロンプトのところを適当に修正すれば、もっと詳しい内容とかも書けるのかも。自動投稿とかしてもいいのかもしれない。そうすると、ブログってなんなんだろね、ってことにはなりそうだけど。
【ChatGPT＋Code Interpreter】日本語で喋らせたい。


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

　今回は、日本語で喋らせたいと思います。やっぱり英語よりは日本語がいいですよね😸

:::note info
本記事は、ChatGPT（有料版）
で行なっております。あしからず。
:::

　ニュースがないので、
　　さっそく本題です。

　最近、Code Interpreterで
　　音声合成できることがわかり、
　　　やってみましたよね。
①[【ChatGPT＋Code Interpreter】で音声合成を行ないます。](https://qiita.com/kabumira/items/189289c205b616c24fdb)
➁[【ChatGPT＋Code Interpreter】で音声合成についてわかったこと。](https://qiita.com/kabumira/items/63d22f1a6e402adcc535)

　それで、
　　音声合成のライブラリである
　　　pyttsx3は日本語がダメだと
　　　　知りました。
　　　　　予想の範疇でした😅

　だからといって、
　　手をこまねいている
　　　私ではありません。

　やっぱり日本語で
　　喋らせたい。

　そこで
　　頑張りました。

　まずは、
　　Promptをごらんください。
```Text:日本語で音声合成Prompt
# 目的
日本語文章を音声にしてファイルにする。

# 手順
[] 以下の文章の漢字をひらがなに開いてください（❶）。
[] 続いて、❶をpyttsx3で音声合成するために**正しく**ローマ字にしてください（❷）。
[] ❷をpyttsx3に渡して、**ゆっくり（rateは400）**話す音声ファイルを作成してください。

# 文章
“拝啓、皆様。私はChatGPTです。”

# 注意
コードの表示は、必要ありません。

# 最終確認
あなたが理解できない箇所があるならば、指摘してください。
あなたが理解できたなら、手順に従って、ファイル作成終了までの処理を実行してください。
```

　手順は以下のとおり
　①日本語の漢字をひらがなにする。
　➁①でできた文章をローマ字にする
　③➁でできたローマ字文章を
　　　pyttsx3に渡して、音声合成
　④③をファイル化

　ポイントとしては
　　“音声合成するため”と
　　　理由をはっきりさせる。

　また、
　　“**正しく**”としているのは
　　　強調のためです。

　これは
　　“皆様”を“minasan”と
　　　変換してしまうことが
　　　　あったための指示です。

　それから
　　“**ゆっくり（rateは400）**”と
　　　書きましたが、これは
　　　　ゆっくりの速度が
　　　　　そのときによって
　　　　　　変わってしまうので
　　　　　　　指定します。

　このPromptを
　　実行すると、
　　　５秒か６秒の
　　　　音声ファイルが
　　　　　生成されます。

　えー、
　　言っておきますが、
　　　日本語を学びはじめた
　　　　外国人よりも酷いです😅
　　　　　比較しては外国人さんが
　　　　　　可哀想ですが。

　ひと昔前の
　　ロボットだと
　　　思ってくださいな😅

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

　今回は、ここまで。
2024下半期 これから取り組んでいきたいこと

### 自己紹介
はじめまして、都内でデータエンジニアをしております、s_rokuemonと申します。
これまで個人で開発してきたことや、これからやりたいこと、学んだことなどを備忘録的に整理するために、ブログをはじめました。
読んでくださった皆さんの興味関心にヒットするような内容があれば嬉しいです。

### やりたいこと
近々触ってみたい技術や取り組んでみたいテーマについて整理する、まずはこれを初めての記事にしようと思います。

#### Snowflake × IaC × CICD　× dbt
* Deploying a Streamlit app / snow snowpark deploy
    * Snowflake CLIを利用したStreamlit AppやSnowpark上のオブジェクトのコマンドを利用したCICDの構築
        * https://docs.snowflake.com/en/developer-guide/snowflake-cli-v2/streamlit-apps/manage-apps/deploy-app
        * https://docs.snowflake.com/en/developer-guide/snowflake-cli-v2/command-reference/snowpark-commands/deploy


* コスト管理
    * dbtパッケージ：dbt-snowflake-monitoring を利用したコストの可視化
        * https://select.dev/docs/dbt-snowflake-monitoring
        * https://select.dev/docs/dbt-snowflake-monitoring/quickstart

* Snowpark Container Services
    * コンテナベースアプリの構築とsnow snowpark deployを利用したCICDの構築
        * https://docs.snowflake.com/ja/developer-guide/snowpark-container-services/overview

* Functional + Access Role ModelとTerraform
    * 公式ドキュメントでも言及されているロールの設計思想についてIaCを利用し構築
        * https://registry.terraform.io/providers/Snowflake-Labs/snowflake/latest/docs
        * https://medium.com/snowflake/a-functional-approach-for-snowflakes-role-based-access-controls-5f0e84e80146
        * https://docs.snowflake.com/en/user-guide/security-access-control-considerations#aligning-object-access-with-business-functions

#### dbt × visualize
* tableauから dbt Semantic Layerを介してMetricsを参照する
    * https://docs.getdbt.com/docs/cloud-integrations/semantic-layer/tableau

### 最後に
新しい技術にチャレンジしながら、難しい点や躓いた点など、自分なりに実践してみて整理していければと思います。
同じ課題感を持つ読者の方に、何か一つでも参考になる内容があればよいな、と思います。
これからよろしくお願いします。
クラウド従量課金予算化難しい問題とトイレットペーパー

ポエムです。

# 従量課金のクラウドは予算化が難しい問題
「使っただけのお支払い」がクラウドのよいところではあるのですが、逆に予算の立てにくさが問題になることがあります。
# クラウドでも利用量を固定してしまえば良いのでは？
というのは安易な解決方法。例えば、Xサイズの仮想マシン100台と決めてしまえば、基本的に価格は固定できます（従量課金の通信費等の問題は残りますが）。
ただ、この使い方はクラウドらしくない、というかクラウドのメリットを全く生かしていません。NISTでは「スピーディな拡張性」がクラウドの定義のひとつと定義していますが、使用量を固定してしまっては、スピーディな拡張ができません。
# 結局予算はどこからかでてくる、トイレットペーパーの予算もね
「予算超えたら怒られる！」と思われるかもしれませんが、企業運営において、予算が確定できないのは、クラウドだけではありません。猛暑続きで消費電力量が予定以上だからといってエアコンが使えなくなるわけでもないし、年間トイレットペーパーの予定巻数を全部消費してしまったからといって、トイレットペーパーが欠品するわけもありません。
クラウドについては、予定より利用量が多いのであれば、事前の見積もり不足か、想定以上にクラウドを利用する事象が多い、つまりは、ビジネスが想定以上にうまくいっている証拠。ビジネスがうまくいっているのであれば、追加資金を投入するのは企業として当たり前の話です。
エンジニアとしてフルリモートワークで8年生き残るための技術スタック

こんにちは。[吉田智哉](https://twitter.com/tomoya_y0shida)です。
岩手県盛岡市に住みながらエンジニアとしてフルリモートワークで東京の開発案件を請けてます。
気が付くとこの働き方で8年間も経過していました。
8年生き残ることができた技術スタックをシェアしたいと思います。
今までの8年間で、これから先はどうなるかわかりませんが、これらを軸に守備範囲を広げていけば、
これからもフルリモートワークで生き残っていけるのではないかと思っています。

## Ruby on Rails

Ruby on Railsは私がエンジニアになるきっかけとなったフレームワークです。
リモート案件が多いので、リモートワークしたい人であればRuby on Railsを学ぶといいでしょう。
GolangやTypescriptに押され気味な感じもしますが、実際に転職エージェントやフリーランスエージェント,
Wantedlyで案件を探してみるとまだまだRuby on Rails案件は多いです。
8年前から今までも十分にリモート案件が存在します。
YoutubeやXなどのナノインフルエンサーのポジショントークに惑わされないようにしましょう。
Railsで十分に戦うことができます。
ただし後述するようにRailsを軸としつつも、周辺の技術を身に着けておくことで、
Railsのみできるよりも案件数をグッと増やすことができます。

## React

Railsで十分戦うことができますが、
Rails単体ではなく
RailsはAPIモードでフロントエンドはReactやVueで
開発するプロジェクトが多くなってきました。
そのためReactや後述のVueも触れるようになっておくと案件数がぐっと増えます。

## Vue

こちらもReact同様、Vueも触れるようになっておくと案件数がぐっと増えます。
Railsメインの案件で参画したのに、3ヶ月間ほぼRailsを触らずにVueだけ触っていたこともあります。

## TypeScript

Railsだけで大丈夫と冒頭で言っておきながらも、「Railsだけで大丈夫なんだろうか..」と不安に
思うことがありました。Railsだけをやっている人は誰しもが一度は思うことだと思います。
たまたま参画中の案件でサーバーサイドTypeScriptを使うことになり、運よくTypeScriptを習得する機会に恵まれました。
当たり前ですが、RailsだけできるよりもTypeScriptもできる方が案件の幅が広がります。
それ以上に「Railsだけしかできない」というコンプレックスを解消することができて、
自分に自信が持てるようになったことが大きいです。

## Golang

TypeScriptの案件に参画後、Rails以外でも数か月他の言語を触れば習得できる自信がついたこと、
転職エージェントやフリーランスエージェントから今伸びている言語を聞いてみるとGolangが伸びているという情報を得たことから、
Golangを習得しました。
まずは独学で学び、次に知り合いからGo案件を紹介してもらい、Goの実務経験を積んでからGoの案件に参画しました。
今から「ゼロから案件に参画して学びたいです！」というよりも、すでに実務経験を積んでいたことから案件の獲得はスムーズでした。
これからRails以外の言語を習得したいと思っている人は、まずは独学で学び、次に知り合いから案件を紹介してもらうという流れがおすすめです。
知り合いがいない場合は自分でサービスを作ってみる、最初は単価を落とすのを覚悟して案件を獲得するという方法もあります。

## クラウドサービス

Railsだと少人数のチームが多いので、インフラ回りも触れるようにしておくと仕事を任せてもらいやすくなります。
AWS、GCP、Azureなど主要なクラウドサービスは普段から触れておきましょう。

## まとめ

Railsを軸にしつつ周辺の技術を身に着けておくこと。
Railsだけに限定せず多言語にも挑戦することで、自分に自信がもてるようになりますし、
案件の幅も広がります。
次はフロントエンドをさらに学ぶか、RustやKotlinなどの言語に挑戦してみるか悩んでいますが、
これからも技術を学び続けて、リモートワークで生き残っていきたいと思います。
エンジニア転職フェア(type転職フェア)に参加してきた話


## 今回のイベント
https://type.jp/s/fair/e/

## 行き方
交通アクセス的に水道橋より飯田橋の方が楽なんですが、飯田橋からだと思った以上に遠かった。
飯田橋からはC2出口だけど、これが思った以上に遠いので素直に水道橋まで行ってA2出口を目指すのがよし。

## イベントセミナー
めっちゃくちゃ並ぶので、10分前に並ぶぐらいじゃないと入れないと思った方が良さそう
セミナー会場の収容数をもっと増やせるとありがたい。

### 第1部　12:00～13:00　「未経験→エンジニア」座談会
「高機能履歴書」に釣られての参加。座談会の内容自体は賛否ありそうなので触れないが、高機能履歴書もJIS規格を満たしつつ項目をいじったぐらい。
書類を買ったり自前で作るよりは楽だし便利、という観点では実質数量限定になってしまっているので逆に使いにくい。

### 第2部　14:30～15:15　｜ 特別講演 生成AI時代のITエンジニアのキャリア戦略
一番気になってたコーナー
就職活動とAIの活用はあまり考えたことがなかったので、どういう話になるかと期待していたが、研修でやってる内容の概要だった。
とはいえ、転職フェアに参加しているのはエンジニア経験者だけではないので、これからエンジニアを目指す人がAIを見据えるのはとてもいいことだと思う。
普段からQiita見ているような人にとっては得るものはない（ことが多い）と思われる。

### 第3部　16:20～17:00　｜　転職ノウハウセミナー
サブタイトルがラノベ並に長い！
「ITエンジニア向けスカウト転職サービス「Direct type」のWebディレクターが伝授！ エンジニア採用担当の目に留まる、職務経歴書の書き方」

採用者目線での話を採用経験者的に聞くと「そういう意見もあるよね」になってしまうけど、データの数は圧倒的に違うはずなので「会社ごとによって考え方は違うが、多くの会社ではこのように言われている」と捉えるのが良さそう。
第一部で履歴書をもらったので、これの活用方法とかもあれば良かったかもしれない。

## ブース訪問
ほとんどしなかったので何も語ることはできないが、この辺りはあまり変わってなさそう。機会があれば掘り下げる。

## 所感
ぷらっと寄るイベントではなくなったのかも
入るまでに書類作って入場手続きやって、という面倒くささも何とかならないかと思っていたので（採用サイドとしては、入場時点で身分証的なものがあると助かるが）この辺りは改善の余地がありそう
せめてtypeアカウント持ってたらそちらと連動してデータ持って来れるようにするとか

少し手間はあるけど、非IT系業種からIT業種への異業種転職の場という意味では良さそう
会社も研修制度を充実させている場所なら未経験者も応募しやすいだろうし、そういった部分でのマッチングで貢献されていると思うが、研修制度と業務の紐付けが分かりにくいのが勿体ないなと。
似たような傾向の会社も多くなるだろうなので、差別化を図るのに苦労しそうだ。
Qiita Engineer Festa 2024を完走した感想

# はじめ
アドベントカレンダーのイベントは今回で3回目となります！
無事完走できたので完走をまとめてみたいと思います。

# 今回はネタを探す時間が多かった
分かってはいましたが、期間が長い…！
今まで経験してきたアドベントカレンダーは25日でした。今回は約1.5倍の38日でさすがにネタに困りました。
これまでに経験したことで記事にできるネタが実はあるんじゃないか、振り返る時間が終盤に近付くにつれて多くなりました。

# 業務で遭遇したエラーの解決ネタは記事にしにくい
独自のAPIを使っていたりすると具体的な内容で記事を書きにくかったりするので、
解決までの流れや姿勢に着目して書くようにしてみました。

# 体験談やチャレンジしてみたお話ネタは記事にしやすい
コードを改めて触る必要がないので隙間時間にさっと書きやすくハードルが低いです、
何より記事にオリジナル性という付加価値がつくので良いと思います。


# おわりに
なんとかイベントを完走することができて良かったです。
次回までに体験談ネタをもっと増やしておきたいです。
メンバーを教える際に意識していること

# はじめに
私のチームに入ったメンバーを教えることになり数か月が経ったので、意識していることをまとめておきます。


# すべてを教えない
一番大事な箇所だけは逆に質問しています。
どこまで理解できているか、どこが理解できていないかを自身で整理してもらうようにしています。

# 機会を奪わない
分からないなりにメンバーが発言しようとした際は聞くことに徹しています。
何かしらのアクションを起こした際に、それが正しいかどうかは一旦置いておいて意図を確認するようにしています。チャレンジしてみても頭ごなしに否定されるとやる気がなくなると思います。

# 置いてきぼりにしない
要所で理解度を聞き、
会話内容についてこれているか、不明点はないかを確認するようにしています。


# おわりに
自分がされて嬉しかったことや助かったことを意識して取り組んでいます。
特に「機会を奪わない」は大事だと思います。
フォークしたリポジトリからのPR作成時にpytest-coverage-commentのCIがコケる

# はじめに
以前、Github ActionsのCIに [pytest-coverage-comment](https://github.com/MishaKav/pytest-coverage-comment) を導入しているOSSを支援していました。

その際に、当該リポジトリをフォークしてプルリクエスト（PR）を作成したところ、CIの実行時に以下のエラーが発生し、pytest-coverage-comment が失敗する事象に遭遇しました。
（pytest-coverage-comment のCIはPR作成をトリガーに実行される）

```
Error: HttpError: Resource not accessible by integration
Error: Resource not accessible by integration
```
この事象により、外部コントリビューターがPRを作成した際、実行されるCIが失敗する状態となっていました。

ただし、リポジトリのオーナーがPRを作成した場合は問題なく成功するとのことで、このエラーはフォークされたリポジトリからのPRに限定して発生しているようです。

# 原因
この問題については以下のIssueで議論されています。

https://github.com/MishaKav/pytest-coverage-comment/issues/68

内容を見てみると、pytest-coverage-comment は `GITHUB_TOKEN` を使用してPRにレポートを書き込む仕様になっているようです。

しかし、フォークされたリポジトリから作成されたPRに対して、`GITHUB_TOKEN` には読み取り権限しか与えられず、書き込み権限が制限されています。これは GitHub Actions のデフォルト設定によるものです。

https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token

この制限により、フォークされたリポジトリからのPRに対して自動的にコメントを投稿できないという問題が発生しており、現在も上記 Issue は未解決の状態です。


# 回避策
前述の議論の中で様々な回避策が提案されていますが、今回は暫定的に失敗を無視する設定を追加することにしました。以下がその設定例です。
```yaml
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.10'

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
        pip install -r dev-requirements.txt

    - name: Test with pytest
      run: |
        set -o pipefail
        python -m pytest --junitxml=pytest.xml --cov-report=term-missing --cov=src tests/ | tee pytest-coverage.txt

    - name: Pytest coverage comment
      continue-on-error: true   # 失敗しても続行
      uses: MishaKav/pytest-coverage-comment@v1.1.47
      with:
        pytest-coverage-path: ./pytest-coverage.txt
        junitxml-path: ./pytest.xml
```

# おわりに
なお、Workflow Permissions の権限を `Read and Write permissions` に変更すれば解決するというコメントもありましたが、この変更はリポジトリのセキュリティリスクを高める可能性があるので今回は採用を見送りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319375/a99c8d3a-2dab-7092-f1be-99856cb4f6ba.png)
Svelteについて調べてみた。

# はじめに
こんにちは、フロントエンドフレームワーク「Svelte（スヴェルト）」についてお話ししようと思います。
Svelteの魅力は一体何なのでしょうか？

このブログでは、Svelteの基本についてまとめていこうと思います。

# 対象読者
- フロントエンド開発が好きな方
- 新しいフレームワークに挑戦したい方
- Svelteについて初めて知る方、またはさらに深堀りしたい方

# 目次
1. Svelteとは何か？
2. Svelteの基本
3. 実際にコードを書いてみよう
4. プロジェクトで使う際のベストプラクティス
5. 他のフレームワークとの比較

# 1. Svelteとは何か？
Svelte（スヴェルト）は、近年登場した新しいフロントエンドフレームワークです。Svelteは他のフレームワークと大きく異なる点がいくつかあります。その主要な特徴の一つが、 **「コンパイル時に効率的なJavaScriptコードに変換する」** というアプローチです。これにより、ランタイムが不要になり、アプリケーションのパフォーマンスが向上します。

## Svelteの基本について
まず、Svelteが解決しようとしている問題について触れておきましょう。従来のフロントエンドフレームワーク（ReactやVueなど）は、ランタイム上で仮想DOMを操作します。このプロセスは便利ではあるものの、一定のオーバーヘッドが存在します。Svelteはこれを避けるために、**コンパイル時に実際のDOM操作コードを生成**します。その結果、ブラウザで実行されるコードが軽く、高速に動作するのです。

# 2. Svelteの基本
Svelteの導入方法から始めましょう。まずはSvelteの公式サイトからインストール方法を確認できます。Node.jsがインストールされている前提で、以下のコマンドを実行すれば簡単にSvelteプロジェクトを開始できます。

```shell
npm create svelte@latest myapp
cd myapp
npm install
npm run dev
```

これで基本的なセットアップは完了です。

## Svelteの基本構成
Svelteの基本は以下のような構成で作成されます。

```svelte
<script>
	// ロジックを記述
</script>

<!-- 0個以上のマークアップを記述 -->

<style>
	/* styleを記述 */
</style>
```

# 3. Svelteのプロジェクトでの運用
Svelteの魅力を理解していただけたと思いますが、実際にプロジェクトで運用する際にはいくつか考慮すべきポイントがあります。ここでは、その中でも特に重要なものをいくつか紹介します。

## バンドルサイズを最小限に抑える
Svelteの最大の利点の一つは、生成されるJavaScriptコードのサイズが非常に小さいことです。しかし、外部ライブラリやプラグインを多用してしまうと、そのメリットが薄れてしまう可能性があります。したがって、必要最低限のライブラリだけを使用し、バンドルサイズを意識することが重要です。

## パフォーマンス最適化
Svelteはパフォーマンスに優れていますが、それでも注意すべき点があります。特に大規模アプリケーションでは、DOM操作が増えるにつれてパフォーマンスが低下する可能性があります。この場合、Svelteのライフサイクルフック（onMount, onDestroyなど）を利用して、適切にリソース管理を行うことが重要です。

# 4. 他のフレームワークとの比較

フロントエンドフレームワークとしてSvelteを選ぶ理由が分かったところで、他の人気のフレームワークとどう違うのか気になりますよね。ここではReactとVueとの比較を行います。

## React vs Svelte
Reactは仮想DOMを使用する一方で、Svelteはコンパイル時に実際のDOM操作コードを生成します。この違いにより、Svelteは通常のReactアプリケーションよりも高速に動作することが多いです。

また、ReactのJSXに比べて、Svelteのドキュメントライクな構文は非常に直感的であるため、学習曲線が緩やかです。

## Vue vs Svelte
Vueもまた仮想DOMを使用しますが、Reactと比べて宣言的で簡洁な構文を持っています。しかし、Svelteはさらに簡洁で読みやすいです。また、Svelteはコンパイラベースなので、バンドルサイズが小さく、パフォーマンスも優れています。

### Svelteの将来性
Svelteはまだ新しいですが、そのシンプルさと高性能が評価され、急速に普及しています。多くの企業がプロジェクトに採用し始め、コミュニティも活発化しています。将来的には、Svelteがフロントエンド開発の主要フレームワークとなる可能性も十分に考えられます。

# まとめ
Svelteについて、いかがでしたか？このブログを読んで、Svelteの魅力が伝われば嬉しいです！

# 参考文献
- Svelte公式サイト: https://svelte.dev/
- 公式リポジトリ: https://github.com/sveltejs/svelte
ChakraUI を使って 単一コンポーネント内に複数モーダルを組み込もうとしたら詰まった件

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

現在、Rails 7 x React 18　x ChakraUIを使用して Xクローンを作成しています。

そこでタイトルのことをやろうとしたら詰まったので、その解決策的なものを書き残そうと思います。

# 現状
まず目指していたものはXのPCから開ける画面のこれです。

![スクリーンショット 2024-07-16 10.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/c910f16c-05e9-4095-347c-03624f4fa4e9.png)

このとき "アカウント作成"を押したらこんなモーダルが、

![スクリーンショット 2024-07-16 10.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/851eb48f-4535-acdb-0816-d8b639ad296d.png)

"ログイン"を押したら別のモーダルが出ると思います

![スクリーンショット 2024-07-16 10.50.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/50bbd194-11b7-d4f5-ad38-1411001c183a.png)

これをやろうとしてました。

そのため、コードは抜粋ではありますが、次のようなイメージをやっていました。

```jsx:Home.jsx
const Home = () => {
・・・
const {isOpen, onOpen, onClose } = useDisclosure();
・・・・・
return (
    <>
        <Button onClick={onOpen}>アカウントを作成</Button>
        <Button onClick={onOpen}>ログイン</Button>

        <Modal isOpen={isOpen} onClose={onClose}>
            アカウント登録のやつ
        </Modal> 
        <Modal isOpen={isOpen} onClose={onClose}>
            ログインのやつ
        </Modal> 

    </>
    )
}
```

そしてアカウント作成かログイン、どっちか押したらそれに応じたモーダルが開くイメージです。

自分の場合は登録の方を押してもログインの方が出てしまってました。

# 解決
別々に作ればいい、です。
アカウント作成はアカウント作成で作って、ログインはログインで作ります。
```
const Home = () => {
・・・
  const {
    isOpen: isSignUpOpen,
    onOpen: onSignUpOpen,
    onClose: onSignUpClose,
  } = useDisclosure();
  const {
    isOpen: isSignInOpen,
    onOpen: onSignInOpen,
    onClose: onSignInClose,
  } = useDisclosure();
・・・・・
return (
    <>
        <Button onClick={onSignUpOpen}>アカウントを作成</Button>
        <Button onClick={onSignInOpen}>ログイン</Button>

        <Modal isOpen={isSignUpOpen} onClose={onSignUpClose}>
            アカウント登録のやつ
        </Modal> 
        <Modal isOpen={isSignInOpen} onClose={onSignInClose}>
            ログインのやつ
        </Modal> 

    </>
    )
}
```

あとちなみに以下のようにやっている人もいました。
```
  const modal1 = useDisclosure();
  const modal2 = useDisclosure();
```
使うときは modal1.isOpenをpropsに渡すイメージです。
好みですか。


# 終わりに
色々ありましたが、無事出ました。
以下は現在作成中のものです。

![スクリーンショット 2024-07-16 11.11.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/313868f8-cf7d-c3a7-4144-5e113bc94d5f.png)

![スクリーンショット 2024-07-16 11.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/39e8e0e0-77bd-2f27-f1c1-422bc2210111.png)

![スクリーンショット 2024-07-16 11.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2567812/8fb00376-62aa-439d-34eb-d59147f4f078.png)

完全な模倣とまではいかないかもしれませんが、満足の出来です。

ということで続きやります。

# 参照
https://stackoverflow.com/questions/65988633/chakra-ui-using-multiple-models-in-a-single-component
rex0220 横並びプラグイン 応用例3 月カレンダー

[rex0220 横並びプラグイン](https://qiita.com/rex0220/items/b24c41d6c3b6ce3f3d78)で、月カレンダーと画像を並べてみました。

# 概要

月毎に、なんかのメモ書きするような用途。
（無理やりこじつけ）

※カレンダー部分は、[rex0220 計算式プラグイン テーブルで月カレンダー(週単位)](https://qiita.com/rex0220/items/fca35db47d1858b53156)

![2024-07-16_11h06_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c9470dbb-1f51-399d-65af-b91ac15aa755.png)

# アプリ設定

![2024-07-16_11h11_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/72d2fcce-f919-8471-fbd4-06fd4c53a418.png)

# 横並びプラグイン設定

![2024-07-16_11h12_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d427e9f4-d418-60fe-bdab-7370c5c1d363.png)
RspecのBigQuery操作でSignet::AuthorizationError

## 事象
- rspecで`bigquery-emulator`に対してテストを実行した時に、以下のエラーが発生しました。
```
Signet::AuthorizationError:
  Authorization failed.  Server message:
  {"error":"invalid_grant","error_description":"Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp values in the JWT claim."}
```

## 原因
- わかってしまえば簡単なのですが、rspecで`travel_to`使って時間を止めてテストしたことです。
```ruby
travel_to Time.zone.local(2027, 7, 10) do
　　# 省略
end
```

- BigQueryはJWT認証を使っているみたいで、`iat`,`exp`に時刻が入るので、そこで壊れちゃった感じだと思います。
robloxでassistant その128

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
スクリプトだけで、雪を降らせよ。



# 手順
- ReplicatedFirstに、LocalScriptを追加。
- スクリプトを書く。
```

local part = Instance.new("Part", workspace)
part.Size = Vector3.new(10, 1, 10)
part.Position = Vector3.new(0, 20, 0)
part.Anchored = true
local snow = Instance.new("ParticleEmitter", part)
snow.Texture = "rbxassetid://1145367640"
snow.EmissionDirection = Enum.NormalId.Bottom 
local numberKeypoints2 = {
	NumberSequenceKeypoint.new(0, 0), 
	NumberSequenceKeypoint.new(1, 0.3), 
}
snow.Size = NumberSequence.new(numberKeypoints2)


```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/350426a9-3283-0690-5710-494ca783f4fa.png)


以上。
ExcelVBAで進捗バーを自作

VBAにて作業進捗度を可視化するプログレスバーを自作します。ツール＞参照設定からプログレスバーの用意はされているかと思いますが、バージョンによって使えなかったりなど不便かと思いますので、面倒なことは抜きに簡易的に自作しました。
ちなみにですが手抜きです。参考までにしていただき、お好みで改変などしていただければと思います。
## 1.フォームで進捗バーの画面を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804239/5d539cb4-1ded-d4f7-98c7-4d37e8997c61.png)
今回はこんな感じのプログレスバーの画面を作成しました。非常にシンプルです。
フォーム名は"Ufrm01_ProgressForm"にしました。
用意したオブジェクトはたったの3つで、「処理中...」の表示と、バーと、パーセント表示する3つの**Label**オブジェクトだけです。
今回こちらで名付けたオブジェクト名は以下の通りです。

「処理中...」：Message
プログレスバー:ProgressBar
パーセント表示:percent

あとはお好みで配置してください。

## 2.プログレスバーを処理するクラスを作成
クラスモジュールを作成します。例のクラス名は"ProgressBar"です。
ソースは以下の通りです。
```vb:ProgressBar
Option Explicit
Const FORM_NAME As String = "Ufrm01_ProgressForm" ' 作成したフォーム名
Private done As Variant '完了したタスク項目数
Private tasks As Variant 'タスク数
Private maxWidth As Integer 'プログレスバーの横幅最大サイズ
Private frm As Object 'ユーザフォームオブジェクト
Private completionRate As Double 'タスク完了率

'********************************
'関数:Init
'
'引数
'   taskCount{Variant}:総タスク数
'   msg{String}:表示する文言
'
'機能:プログラスバーの生成
'********************************
Public Sub Init(ByVal taskCount As Variant, ByVal msg As String)
    Set frm = VBA.UserForms.add(FORM_NAME)
    done = 0
    tasks = taskCount
    maxWidth = frm.ProgressBar.Width
    completionRate = done / tasks
    If msg <> "" Then
        frm.Message.Caption = msg
    End If
    frm.Percent.Caption = "0%"
    frm.ProgressBar.Width = maxWidth * completionRate 'プログレスバーのサイズ変更
    frm.Show vbModeless '処理中画面表示
    DoEvents '画面制御
End Sub

'********************************
'関数:BarUpdate
'
'機能:プログレスバーの進捗更新
'********************************
Public Sub BarUpdate(ByVal updone As Variant)
    done = done + updone
    If tasks <= done Then
        done = tasks
    End If
    completionRate = done / tasks
    frm.percent.Caption = Format((completionRate) * 100, "0.0") & "%"
    frm.ProgressBar.Width = maxWidth * completionRate 'プログレスバーのサイズ変更
    DoEvents '画面制御
End Sub


'*******************************
'クラス破棄の処理
'*******************************
Private Sub Class_Terminate()
    Unload frm 'フォームを閉じる
    Set frm = Nothing '破棄
End Sub
```

## 3.使用例
```vb
Dim pb As ProgressBar ' プログレスバークラス
Dim i As Long ' ループ用汎用カウンタ

Set pb = New ProgressBar
Call pb.Init(3,"")

' なんかの処理
For i = 0 to 100
  ' 処理
  pb.BarUpdate(1) 'ループ1回につき1タスク完了としてバーを更新
Next i

Set pb = Nothing ' オブジェクト破棄
```

上記は一例ですが好みでバーの更新タイミングやタスク完了の値を変更していただければと思います。
ループでなくても問題ありません。

余談ですが、VBAをあまり理解しておらず、Callをつけなければ構文エラーになる場面はなぜなのでしょうか。
名残でCallステートメントがあるだけで使わなくてもいいという認識でした。

色々と手抜きではありますが、参考になれば幸いです。
第2期GIGAスクールに向けた Microsoft 365 運用管理ガイド | 第2章 Microsoft 365

[第1章 GIGAスクール構想 ←](https://qiita.com/hisaho/items/b0c9dc567ce06abb6033)　[→ 第3章 アカウント管理](https://qiita.com/hisaho/items/86a2f144954fcc70bf61)

# 第2章 Microsoft 365

## 2.1 ライセンス

第1期GIGAスクール構想では、教育現場においてICT環境の整備を支援するために、Microsoft 365のさまざまなライセンスが活用されました。具体的には、以下のライセンスが利用されていました。

- **Microsoft 365 GIGA PROMO**
期間限定のプロモーションライセンスで、特別な価格で提供されました。このライセンスはGIGAスクール構想の初期段階において多くの学校で利用され、児童生徒および教員のICT環境整備に大きく貢献しました。
- **Microsoft 365 A3**
教育機関向けの標準ライセンスで、豊富な機能と柔軟な管理オプションを提供します。主に中規模から大規模の教育機関で利用されました。
- **Microsoft 365 A5**
A3ライセンスの上位版で、さらに高度なセキュリティ機能や分析ツールを含みます。セキュリティやデータ分析が重要視される教育機関で採用されました。

第2期GIGAスクール構想では、Microsoft 365 GIGA PROMOの提供が終了するため、新しいライセンス体系に移行する必要があります。新たに購入できるライセンスは以下の通りです。

- **Microsoft 365 A1 for Device**
教育機関向けの基本ライセンスで、デバイスごとにライセンスが適用されます。コストパフォーマンスが高く、多くの学校での利用が見込まれます。
- **Microsoft 365 A1 for Device (Legacy)**
旧版のA1ライセンスで、既存のライセンス契約を継続する場合に利用されます。
- **Microsoft 365 A3**
教育機関向けの標準ライセンスで、豊富な機能と柔軟な管理オプションを提供します。主に中規模から大規模の教育機関で利用されました。
- **Microsoft 365 A5**
A3ライセンスの上位版で、さらに高度なセキュリティ機能や分析ツールを含みます。セキュリティやデータ分析が重要視される教育機関で採用されました。

これらの新しいライセンスは、教育現場のニーズに応じた柔軟な選択肢を提供し、第2期GIGAスクール構想におけるICT環境のさらなる充実を支援します。教育委員会や学校は、各ライセンスの特性を理解し、自校のニーズに最適なライセンスを選定することが求められます。

第2期GIGAスクール構想で提供されるライセンスプランについて差異を以下の示します。より詳細な情報については https://edudownloads.azureedge.net/msdownloads/Modern_Work_Plan_Comparison-Education.pdf をご確認ください。

| |A1 for Device(Legacy)|A1 for Device|A3|A5|
|--- |--- |--- |--- |--- |
|買い方|買い切り|買い切り|サブスクリプション|サブスクリプション|
|購入単位|デバイス数|デバイス数|人数(教職員)|人下図(教職員)|
|MDM|〇|〇|〇|〇|
|Web Filtering|〇|〇|〇|〇|
|Microsoft 365 Web Apps|〇|〇|〇|〇|
|Microsoft 365 Apps|✖|〇|〇|〇|
|One Drive|〇|〇|〇|〇|
|Teams|〇|〇|〇|〇|
|Forms|〇|〇|〇|〇|
|Sway|〇|〇|〇|〇|
|Loop|〇|〇|〇|〇|
|Minecraft|✖|〇|〇|〇|
|Windows Hello|〇|〇|〇|〇|
|高度なセキュリティ|✖|✖|✖|〇|

## 2.2 第1期に Microsoft 365 GIGA PROMO をご購入された皆様へ

### ライセンスの有効期限と切り替え

Microsoft 365 GIGA PROMOは、GIGAスクール構想の初期段階において、教育現場のICT環境整備を促進するために提供された買い切り型のライセンスです。このライセンスは購入後6年間有効であり、多くの教育機関で活用されました。しかし、Microsoft 365 GIGA PROMO の提供されなくなるため、7年目以降は、新規に購入したライセンスに切り替える必要があります。

### ライセンス切り替えの手順

ライセンスを切り替える際には、以下の手順を実行する必要があります。

1. **新しいライセンスの購入**
まず、Microsoft 365 A1 for DeviceやMicrosoft 365 A1 for Device (Legacy)などの新しいライセンスを購入します。教育機関のニーズに最適なライセンスを選定してください。
2. **既存ライセンスの削除**
既存のMicrosoft 365 GIGA PROMOライセンスをユーザーから削除します。これは管理者ポータルから実行できます。
3. **新しいライセンスの割り当て**
購入した新しいライセンスを、削除したライセンスのユーザーに割り当てます。この手順も管理者ポータルから実行できます。

### サポートと支援

ライセンス切り替え作業は、技術的なサポートが必要な場合があります。Microsoftおよび提携パートナーは、教育機関が円滑にライセンスを移行できるよう支援を提供しています。必要に応じて、技術サポートやコンサルティングサービスを活用してください。

※ユーザーのライセンス削除、割り当てに関しては、第3章で詳細します。

### お知らせ

ライセンス切り替えに関する詳細情報や手順については、Microsoftの公式ウェブサイトやサポートポータルを参照してください。また、各教育機関のICT管理者は、ライセンスの有効期限を管理し、早めに切り替えの準備を進めることをお勧めします。

[第1章 GIGAスクール構想 ←](https://qiita.com/hisaho/items/b0c9dc567ce06abb6033)　[→ 第3章 アカウント管理](https://qiita.com/hisaho/items/86a2f144954fcc70bf61)
オープンソースのLLMって何があるの？

# はじめに
KaggleでNLPコンペに取り組み始めました。いろんなLLMがあってどれ使えばいいのかよくわからないので、オープンソースのものに絞って列挙して特徴を比較してみます。

# 1. LLaMA 3
###### 読み方：
ラマ
###### 開発元：
Meta
###### インポート：
Huggingfaceが提供するtransformersというライブラリ。
AutoTokenizerの"from_pretrained"にモデル名を引数として指定するとインポートできる。
```
!pip install transformers
tokenizer = LlamaTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct") /* 例です */
```
参考↓

https://huggingface.co/docs/transformers/main/en/model_doc/llama

###### 特徴：
8Bと70Bモデルがあり、それぞれパラメータ数が80億、700億という意味。


# 2. Gemma 2
###### 読み方：
ジェマ
###### 開発元：
Google
###### インポート：
同じくHuggingfaceが提供するtransformersというライブラリを使用。
AutoTokenizerの"from_pretrained"にモデル名を引数として指定するとインポートできる。
```
!pip install transformers
tokenizer = GemmaTokenizerFast.from_pretrained("google/gemma-2-27b-it") /* 例です */
```

参考↓

https://huggingface.co/docs/transformers/en/model_doc/gemma

###### 特徴：
9Bと27Bモデルがあり、それぞれパラメータ数が90億、270億という意味。
Gemma2 27BはLLaMA 3 70Bよりも少ないパラメータ数（270億<<700億）で同じような性能らしく、「軽量かつ高性能」なモデルということで知られている。

# 3.Grok-1
###### 読み方：
グロク
###### 開発元：
xAI（イーロンマスク）
###### インポート：
こちらサイトを参照。ファイルが重すぎて4日から1週間近くかかるらしくやる気がなくなりました。

https://note.com/o_ob/n/n13b06eaaea8f

###### 特徴：
パラメータ数は314B、つまり3140億。性能はLLaMA 3やGemma 2に比べてやや低い。
数学とコーディングは得意。

# LLM分野でよく出てくるワードについて調べたことをメモしていく
## 【finetuning】
LOW RANK ADAPTION（LoRA：ローラ）というものが使われるそう。
高精度かつ低負荷で実装可能という特徴があります。
基本的には下記によくまとまっています。

https://blueqat.com/yuichiro_minato2/d2a03601-2f3e-4535-980d-33c79add516c

https://zenn.dev/fusic/articles/paper-reading-lora

LLMはモデル全体の重みを変えようとするとめっちゃ時間かかります。なので元の重みの次元数をもっと低次元に変換した重みをモデルに追加して、その部分だけ学習させよう！という趣旨のことが書いてあります。
低次元に変換すると言われると精度が落ちそうに思えてしまいますが、実際やってみるとそんなことなかったよーってことが以下の論文に書いてあります。

https://arxiv.org/abs/2012.13255

## 【量子化/quantize】
メモリ負荷、計算負荷を減らすために行います。
LLMのパラメータは数十億、数百億とあります。たとえば、50億のパラメータを持つモデルは、16ビット精度を使用する場合には約10GBのメモリを必要とするそうです。量子化によってパラメータの精度を落とすことでパフォーマンスを大きく落とすことなく計算負荷を減らすことができます。

https://myscale.com/blog/ja/quantization-for-llms-finetuning/

# おわりに
さらっと調べて分かったことをとりあえず書き出してみました。
間違い、お気づきの点あれば教えてください！
Azure Databricks東京リージョンにノートブック用サーバレスがやってきました！

先日、こちらの記事でAWS東京リージョンでのノートブック用サーバレスのオープンをお知らせしましたが、今度はAzure東京リージョン`japaneast`でのオープンです！

https://qiita.com/taka_yayoi/items/24a5eedf6796c7bf918b

対応リージョンは以下の通りです。

https://learn.microsoft.com/ja-jp/azure/databricks/resources/feature-region-support#feature-availability

Azure Databricksワークスペースにログインし、画面右上のワークスペース一覧を展開します。**アカウントを管理**をクリックしてアカウントコンソールにアクセスします。
![Screenshot 2024-07-16 at 9.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4cc68392-11aa-6b6d-44af-e9569d44b12e.png)

**設定**の**機能の有効化**にアクセスします。
![Screenshot 2024-07-16 at 9.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c270ba0f-4a01-1d92-de70-d97e519ffdcd.png)

**ワークフロー、ノートブック、Delta Liveテーブル向けのサーバレスコンピュート**を有効化します。

少し待ってからノートブックを作成します。クラスターセレクターに**サーバレス**が表示されてます！
![Screenshot 2024-07-16 at 9.53.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/216c2f55-c3cb-0b37-57e6-c8d22164fecd.png)

ご活用ください！
![Screenshot 2024-07-16 at 9.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4b569778-c9cf-1fb0-5a2c-dff7766f0e59.png)


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
picoGym Exclusive writeup Bit-O-Asm-3

## Bit-O-Asm-3 (Reverse Engineering)

Can you figure out what is in the eax register? Put your answer in the picoCTF flag format: picoCTF{n} where n is the contents of the eax register in the decimal number base. If the answer was 0x11 your flag would be picoCTF{17}. Download the assembly dump here.

添付ファイル
・disassembler-dump0_c.txt

disassembler-dump0_c.txtをテキストエディタで開く。
```
<+15>:    mov    DWORD PTR [rbp-0xc],0x9fe1a
<+22>:    mov    DWORD PTR [rbp-0x8],0x4
<+29>:    mov    eax,DWORD PTR [rbp-0xc]
<+32>:    imul   eax,DWORD PTR [rbp-0x8]
<+36>:    add    eax,0x1f5
```
0x9fe1a\*0x4+0x1f5をして演算結果をeaxに格納している。
654874\*4+501=2619997である。

`picoaCTF{2619997}`