OmniAICreator/Qiita-1.07M huggingface dataset:
2024/6/17主にITとかセキュリティの記事

イセトーのランサムウエア感染についてまとめてみた(6/15)
https://piyolog.hatenadiary.jp/entry/2024/06/15/011339

九電グループ「キューへン」　顧客情報の流出は３７万件超か(6/14)
https://newsdig.tbs.co.jp/articles/rkb/1231978?display=1

【第２報】KADOKAWAグループにおけるシステム障害について(6/14)
https://withnews.jp/pressrelease/article/11673

ニコニコ動画の復旧に1カ月以上かかる見込み：KADOKAWAにも大打撃(6/15)
https://agora-web.jp/archives/240614225526.html

ニコニコのサービス停止、明かされた熾烈な攻撃被害　ランサムウェア原因でサーバー物理切断、動画は無事「不幸中の幸い」(6/15)
https://news.yahoo.co.jp/articles/9bfd4c3577e2beb21023ebc1bfe951c2986e2734

「ニコニコ」ハッキングで復旧に1カ月超の惨状「2007年の動画」限定公開で「インターネット老人会」爆誕(6/15)
https://news.yahoo.co.jp/articles/778a79e24b5807dafdf5d3627224236464e86e1e

KADOKAWAとニコニコ、「ランサムウェアを含む大規模なサイバー攻撃」と詳細を発表(6/14)
https://news.yahoo.co.jp/articles/dd0a687aa6389b4c09cfb84863a7514f44649d40

ランサムウェア被害で復旧に1ヶ月以上のニコニコ動画、急ごしらえでインターネット老人ホームを仮設
https://kabumatome.doorblog.jp/archives/66022576.html

ひろゆき　ニコ動サイバー被害の深刻さ指摘「復旧しても壊す罠残ってる」可能性を指摘(6/14)
https://news.goo.ne.jp/article/tokyosports/entertainment/tokyosports-306019.html#google_vignette
https://news.livedoor.com/article/detail/26603330/

ニコニコを襲ったサイバー攻撃の全体像まとめ　動画データは無事か、復旧に1カ月かかる理由は(6/14)
https://news.infoseek.co.jp/article/itmedia_news_20240614183/

サイバー攻撃でサービス停止 ニコニコ動画復旧に1カ月超(6/14)
https://txbiz.tv-tokyo.co.jp/wbs/news/post_298209

Androidユーザー狙う偽アプリに注意、3つの攻撃が進行中(6/15)
https://news.livedoor.com/article/detail/26606494/
https://www.mapion.co.jp/news/column/cobs2776930-1/

Flipper Zeroを使用して携帯電話のハッキングを防ぐ方法(6/14)
https://www.todoandroid.es/ja/%E3%83%95%E3%83%AA%E3%83%83%E3%83%91%E3%83%BC%E3%82%BC%E3%83%AD%E3%81%AB%E3%82%88%E3%82%8B%E6%90%BA%E5%B8%AF%E9%9B%BB%E8%A9%B1%E3%81%AE%E3%83%8F%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%92%E9%98%B2%E3%81%90%E6%96%B9%E6%B3%95/

国立中央図書館にＤＤｏＳ攻撃、接続が一時麻痺(6/15)
https://www.donga.com/jp/article/all/20240615/5004970/1

iOS 18の登場でiPhoneが生まれ変わる！ホーム画面のカスタマイズからAI機能まで気になる新機能をおさらい(6/15)
https://dime.jp/genre/1803063/

【生成AI×広告】AIで広告運用を最適化！企業の活用事例や導入時の注意点も徹底解説(6/15)
https://weel.co.jp/media/advertisement/

Windows狙うマルウェア、AndroidとmacOSまで標的広げて攻撃中(6/15)
https://news.mynavi.jp/techplus/article/20240615-2966114/

僕らがセキュリティ転職イベントを開催する理由(6/14)
https://zenn.dev/cybersec_plus/articles/200791e27bc06e

ChatGPTの画像編集機能とは？実際に使ってみた！
https://cybersecurity-park.com/1474/

バイデン氏、供給網強化へ大統領令　協議会を正式発足(6/15)
https://news.livedoor.com/article/detail/26603874/

AIで米を猛追する中国 街が丸ごと“データ化”の凄さ なぜAI規制は必要なのか(6/14)
https://www.khb-tv.co.jp/news/15306516
https://news.yahoo.co.jp/articles/40cba7f6a4c4cbb421d6cce3a4450e81bfa98ca5?source=rss
https://news.tv-asahi.co.jp/news_international/articles/000354589.html

ちょっと昔の日本を垣間見られる、マニアックな地図サービス5選(6/15)
https://news.infoseek.co.jp/article/mynavi_2776963/?tpgnr=it

国民スポーツ大会・全国障害者スポーツ大会に向けサイバーテロ対策　佐賀市で総会(6/14)
https://www.saga-s.co.jp/articles/-/1262005

ggrksという言葉、ご存知ですか？(6/15)
https://blogs.itmedia.co.jp/satou55_makoto/2024/06/ggrks.html?ref=rss

ＩＣＣ、ウクライナへのサイバー攻撃を戦争犯罪の疑いで捜査＝関係筋(6/15)
https://nordot.app/1174414240942736160?c=724086615123804160

ロシアのサイバー攻撃捜査 ＩＣＣ、戦争犯罪の可能性(6/15)
https://www.shimotsuke.co.jp/articles/-/910411?relatedarticle
NHKの番組表APIと聞き逃し配信サービスのAPIがいつの間にか変わっていたのでメモ

2024年6月から聞き逃し配信サービスのAPIを使って録音していたラジオドラマが録音できなくなったので調べてみたらタイトルの二つのAPIが変更になっていたのでメモしておきます。

# 聞き逃し配信サービスのAPI
手元のサーバーのログを見る限り、6月3日頃を最後に以前のURLが使えなくなっていました。

以前
 https://www.nhk.or.jp/radioondemand/json/<font color="red">**0324**</font>/bangumi_<font color="red">**0324**</font>_<font color="blue">**07**</font>.json

現在
 https://www.nhk.or.jp/radio-api/app/v1/web/ondemand/series?site_id=<font color="red">**0324**</font>&corner_site_id=<font color="blue">**07**</font>
 
 基本のURLと引数の表記方法は変わりましたが、パラメーターは同じようです。site_idとcorner_site_idは番組によって違います。調べ方は忘れてしまったので思い出したら書きます。
 
上記URLからjsonをダウンロードすると、中に番組情報やストリーミングをダウンロードするためのURLが記載されています。
 中身のjsonも内容が変わりましたが、以前のjsonデータは手元に残ってないので説明は割愛します。

 # NHKの番組表API
 NHKの[お知らせ](https://api-portal.nhk.or.jp/info-20240301)でも案内されていましたが、2024年2月29日で以前のURLが変更になっていました。基本的にはURL中のv1がv2に変わっただけで、中身は変わっていないようです。API keyも以前のものがそのまま使えました。
 APIの使い方は[NHKのページ](https://api-portal.nhk.or.jp)を参照してください。
 
 以前
http://api.nhk.or.jp/v1/pg/list/${area}/${channel}/${date}.json?key=${apikey}
現在
http://api.nhk.or.jp/v2/pg/list/${area}/${channel}/${date}.json?key=${apikey}
Neovimのinit.luaで特定の言語だけタブ幅を変える

## 背景

プログラムを読みやすくするために必須なインデントですが、「字下げを何文字分すべきか」はプログラミング言語によって異なります。
今回はNeovimをLua言語を用いて`init.lua`で設定する場合に、特定のプログラミング言語の場合だけインデント幅を変える方法を紹介します。

## 基礎知識：LuaでNeovimのインデント幅を設定する方法

NeovimをLua言語で設定する場合、インデント幅を調整する設定は主に次の3つです。

```lua
vim.o.expandtab = true
vim.o.tabstop = 4
vim.o.shiftwidth = 4
```

それぞれの設定項目は

* `vim.o.expandtab` - `true`ならtabキー入力時にtab文字の代わりに同じ幅の半角スペースを入力する。
* `vim.o.tabstop` - tab文字の幅を指定
* `vim.o.shiftwidth` - Neovimがインデントを入力する際（例えばnormalモードでの`>>`）の幅を指定

です。
ここで`vim.o`の「o」は「option」のことです。
`init.lua`にて`vim.o`で指定した設定はすべてのバッファで有効になります。

## 本題：特定の言語だけインデント幅を変える

### ソースコード

以下のコードを`init.lua`に記載することで、プログラミング言語ごとにインデント幅を変更できます。
1行目の`filetype_tabstop`テーブルの定義だけ調整してください。

```lua
local filetype_tabstop = {lua=2, markdown=2} -- filetype毎のインデント幅
local usrftcfg = vim.api.nvim_create_augroup("UserFileTypeConfig", { clear = true})
vim.api.nvim_create_autocmd("FileType", {
  group = usrftcfg,
  callback = function (args)
    local ftts = filetype_tabstop[args.match]
    if ftts then
      vim.bo.tabstop = ftts
      vim.bo.shiftwidth = ftts
    end
  end
})
```

### 解説

1行目の`filetype_tabstop`にてプログラミング言語ごとにインデント幅を`filetype名=インデント幅`で列挙します（`vim.o.tabstop`等で定義した幅をそのまま用いる言語については、わざわざ記述する必要はありません）。
この部分については利用する言語にあわせて変更してください。

プログラミング言語に応じて設定を変更するために`autocmd`を利用します（一応セットで`augroup`も設定しておきます）。
`vim.api.nvim_create_autocmd`の第1引数に`FileType`すなわち「バッファの`filetype`が設定されたとき」を指定することで、既存ファイルを開いた場合および`filetype`を手動で設定した場合に処理を実行させます。

条件を満たした場合に実行する処理を`callback =`で定義します。
つまり

```lua
function (args)
  local ftts = filetype_tabstop[args.match]
  if ftts then
    vim.bo.tabstop = ftts
    vim.bo.shiftwidth = ftts
  end
end
```

が実際の処理内容です。  

まず`args.match`はVim Scriptの`<amatch>`に該当する変数で、`FileType`の場合にはバッファに設定された`filetype`が格納されます。
よって`filetype_tabstop[args.mathc]`とすることで、1行目にて定義したインデント幅を得ることができます。
その値を一旦`ftts`変数に格納した後、`vim.bo.tabstop`および`vim.bo.shiftwidth`に設定します。
ここで`vim.bo`の「bo」は「buffer option」のことであり、指定したバッファでのみ有効になる設定です。
当該バッファにおける`tabstop`と`shiftwidth`を上書きすることで、そのプログラミング言語に合わせたインデント幅を利用できます。

以上の説明は`filetype_tabstop`にて当該`filetype`のインデント幅が指定されている場合の動作です。
もし`filetype_tabstop`に指定のないプログラミング言語を用いた場合はどうなるでしょうか？  

Lua言語では、テーブルに含まれないインデックスが指定された場合は`nil`を返します。
したがって、バッファの`filetype`が`filetype_tabstop`に含まれていない場合は`ftts = nil`となります。
そして`if`文は条件が`nil`であれば`then`以降の処理を実行しないため、`if ftts then ~ end`の内側はスキップされます。
この場合は、`vim.o.tabstop`および`vim.o.shiftwidth`の値がそのまま利用されます。

このようにして、プログラミング言語ごとにインデント幅を変更できます。

## 補足

今回説明した設定は`init.lua`に書き込むことを想定し、比較的コンパクトな記述で済むよう心がけたものです。  
`filetype`毎により込み入った設定をしたい場合は、以下の記事が参考になります。  
[[Neovim]filetype毎の設定をluaの関数単位で分ける](https://zenn.dev/rapan931/articles/45b09b774512fc)
忙しい人向けのコードレビューの観点について

# はじめに
皆さんもコードレビューを依頼されることがあると思いますが、時間取れない時はどうしているでしょうか。
後回しでしょうか？それとも、今やっているタスクを止めてでもやっていますか？
自分は前者です。そのため、レビューがボトルネックになることが多いです。（反省）

今回は、自分がぱつっていて、どうしても時間が取れない時に、どうしてもやらないといけないコードレビューが発生した時に、外さない観点についてお伝えできればと思います！

# レビュー時に見る観点
他にもあるかと思いますが、自分はだいたいこんなところを見ます。
・設計書通りに動くか
・命名規則に忠実であるか
・変数・関数のスコープは最小限にできているか
・長すぎるロジックがないか
・共通化すべきところを適切にできているか
・コメントをちゃんと書いてるか
・ロジックを適切な場所に記載できているか

全部見ようとすると結構時間がかかるのですが、レビューをすることがメインタスクではないため、後回しになりがちです。（申し訳ない気持ちで押しつぶされる）

# 忙しい時に見ているレビュー観点
返済しづらい技術負債になりがちな下記観点は見るようにしています。

***・ロジックを適切な場所に記載できているか***

ロジックの置き場所を間違えると、だいたい同じだけど微妙に違うコードが別で記述されてしまったり、利用してはいけない場所で利用されて思わぬところに影響範囲を持ってしまった可哀想な子が生まれたりと、変更する心理的ハードルが高いコードが誕生してしまいます。

# ロジックを適切な場所に記載するために必要な考え方
よくRoRのレビューする機会があり、MVCの観点でどこにビジネスロジックを記述するのが適切かという話題になるのですが、基本Modelだよねという話は皆さん共通の認識かと思います。それでは、「どのModelに記述して、どう呼び出すべきか」という観点になると、どうでしょうか。経験上、答えはばらけることが多いです。

私がその際に利用している考え方は、ドメイン駆動設計の***集約***です。

# ドメイン駆動設計の集約とは
ドメイン駆動設計の集約 (Aggregate) とは、関連するオブジェクト群を 1 つのユニットとして管理するための手法です。集約は、1 つのルートエンティティ（集約ルート）と、それに関連するエンティティや値オブジェクトで構成されます。

その集約を設計に適用する考え方については、こちらの記事がわかりやすかったです。([ドメイン駆動設計の集約のわかりにくさの原因と集約を理解するためのヒント](https://masuda220.hatenablog.com/entry/2021/05/07/142824))
上記の記事で「集約の設計は、ロジックの置き場所の設計」と記載がある通り、集約はロジックを適切な場所に記載するための設計をするのに重要な考え方です。

# 実際に集約をレビュー観点に落とし込むとどういったことを見るか
具体的には下記項目となります。そして、1・2・3に関しては設計段階でレビューをすることが多いです。ここの設計がある程度正しく、チームのメンバー間で認識が擦り合っていれば、ほぼなんとかなります。
また、PR時のレビューもそんなに時間がかかりません。

1. 現実とリンクするように、意味のあるクラスの集合体（集約）を適切に設計できているか
2. 集合体の各要素に適切にメソッドを生やせているか
3. それぞれの要素のメソッド名が意味のある言葉になっているか
4. 集合体（集約）に含まれる要素を更新する際に、代表クラス（集約ルート）のメソッドの呼び出しでのみ、変更できるようになっているか
5. [デメテルの法則](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%A1%E3%83%86%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87)に著しく違反していないか

# 総括
生成AIでこの辺りも自動でレビューしてくれるようになると捗りますね。
レビューを短時間で行えると開発の生産性も向上するというデータもあるので、忙しくても、レビューはすぐできるような文化づくりをしていきましょう！（自戒）
bufio で string を取ろうとして詰まった話

## RE?
Atcoder で https://atcoder.jp/contests/abc237/tasks/abc237_d を解いていて、
テストケースのうち数ケースのみ RE ( Runtime Error ) になってしまった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817605/735d6903-d2ae-a11b-b4af-f5f74a4ab26f.png)

## 原因
### 自分の実装
bufio の scanner をこんな感じで使っていたのが原因
```golang
var sc = bufio.NewScanner(os.Stdin)

func main(){
    sc.Split(bufio.ScanWords)
    s:=scanString()
}

func scanString() (s string) {
	sc.Scan()
	s = sc.Text()
	return
}
```
### ソースコード

#### 定数
```golang
const (
	// MaxScanTokenSize is the maximum size used to buffer a token
	// unless the user provides an explicit buffer with [Scanner.Buffer].
	// The actual maximum token size may be smaller as the buffer
	// may need to include, for instance, a newline.
	MaxScanTokenSize = 64 * 1024

	startBufSize = 4096 // Size of initial allocation for buffer.
)
```
https://cs.opensource.google/go/go/+/refs/tags/go1.22.4:src/bufio/scan.go;l=77

`MaxScanTokenSize` を最大のバッファサイズ
`startBufSize` をはじめに確保されるバッファのサイズ
として定義されている

#### `bufio.NewScanner` の実装
```golang
func NewScanner(r io.Reader) *Scanner {
	return &Scanner{
		r:            r,
		split:        ScanLines,
		maxTokenSize: MaxScanTokenSize,
	}
}
```
https://cs.opensource.google/go/go/+/refs/tags/go1.22.4:src/bufio/scan.go;l=93

bufio.NewScanner を呼ぶと、Scanner に対して `maxTokenSize` が設定される

#### `func (s *Scanner) Scan() bool` の実装
```golang
func (s *Scanner) Scan() bool {
    
    // 省略
    ...
    
    // バッファサイズが最大トークンサイズを超えていないかチェック
    if len(s.buf) >= s.maxTokenSize || len(s.buf) > maxInt/2 {
        s.setErr(ErrTooLong)
        return false
    }
    
    ...
    // 省略
    ...
    
    // バッファサイズの初期化
    if newSize == 0 {
        newSize = startBufSize
    }
    
    ...
    // 省略
}
```
https://cs.opensource.google/go/go/+/master:src/bufio/scan.go;l=206

上のチェックの部分は、今回のエラーの原因であると考えられる
下の部分で、バッファが確保されていない場合 ( 初期の状態 ) 、startBufSize の 4096 bytes が指定される

## 解決
今回の Atcoder の問題では、入力される `string` のサイズの制約が
```math
1\le n \le5×10^5
```
となっていたので デフォルトのバッファサイズの最大値である `64 * 1024 = 65,536` を超えてしまった
以下のコードを `Scan()` を行う前に記述することで解決した

```
sc.Buffer(make([]byte, 64*1024), 1e6)
```
https://pkg.go.dev/bufio#Scanner.Buffer

これは、scanner が使用するバッファを指定するもの
- 第 1 引数の `[]byte` は初期バッファ
今回は、デフォルトの最大 `64 * 1024 = 65,536` を超えることがわかっていたので、初めから `64 * 1024` のサイズを確保した

- 第 2 引数の `1e6` は最大バッファサイズ
最大 `1*10^6` 文字と少し多めにとっている
開発に使用するなら、2 の累乗単位で取るべきなのかもしれないが、今回は競技プログラミングなので深く考えなかった

## まとめ

競技プログラミングで bufio パッケージを使用するときは、適切なバッファサイズの設定が重要。
特に大量のデータを扱う場合には、事前に適切なサイズを確保する。
Windows 11で日付と時刻の形式を変更する方法

# 経緯

海外に住み始めてから月に対して数字ではなくJuneなど表記で扱うことが多くなってきたのでWindowsの画面右下にある日付の表示を変更したいと思いやってみた


# 結論

![スクリーンショット 2024-06-16 181312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353033/4d17590a-f7c4-e591-83a6-ec65022c5e52.png)

上記の表記から下記の表記に変更できた
写真の通り、方法さえわかれば3分でできる

![スクリーンショット 2024-06-16 181638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353033/1eb1079f-188d-2178-0502-dd913e2b1fef.png)

# 手順

具体的な手順は[この記事](https://thewindowsclub.blog/how-to-change-date-and-time-formats-in-windows-11/#:~:text=1%20%E3%81%BE%E3%81%9A%E3%80%81Win%2BR%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%20%5B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%5D%20%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%20%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E9%96%8B%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%202%20%E6%AC%A1%E3%81%AB%E3%80%81%E9%96%8B%E3%81%84%E3%81%9F%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%81%AB%E3%80%8C,%E3%81%9D%E3%81%AE%E5%BE%8C%E3%80%81%E6%97%A5%E4%BB%98%E3%81%A8%E6%99%82%E5%88%BB%E3%81%AE%E5%BD%A2%E5%BC%8F%E3%82%92%E9%81%A9%E5%88%87%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%205%20%E6%9C%80%E5%BE%8C%E3%81%AB%E3%80%81%20%5B%E9%81%A9%E7%94%A8%5D%20%3E%20%5B%E9%81%A9%E7%94%A8%5D%20%E3%82%92%E6%8A%BC%E3%81%97%E3%81%A6%E5%A4%89%E6%9B%B4%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20)を見てもらえばいいので割愛

記事との相違点だけ下記に記載する

# 相違点

「カレンダー設定の変更」から表記を英語するために

形式で英語(世界)を選択

![スクリーンショット 2024-06-16 181437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353033/4da7758d-8a54-2169-81ed-584ad02cde26.png)


選択したら自動で日付と時刻の形式が変更されると思うがこれをお好みで変更

自分の場合は下記の通り

![スクリーンショット 2024-06-16 181618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353033/8ba59789-6bd1-f8e2-5b95-a4a761696eae.png)

適用を押したら右下の表示形式が変更できていることが確認できる

再度「カレンダー設定の変更」を開くと下記のようになっているのが確認できる

![スクリーンショット 2024-06-16 182638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353033/c83ff9ea-7ddd-5221-9f67-e99d8d78c627.png)

以上
会議もSNSも、もっと伝わるはず

# はじめに

皆さん、こんにちは！ 
日々進化を続けるテクノロジーの中で、私たちは情報伝達手段とも向き合わなければなりません。

特にオンライン会議や組織内SNSは、現代社会において欠かせないツールですが、その一方で、**情報が十分に伝わらないという課題**を抱えています。

この記事では、**誰もが抱える情報伝達の問題点**を紐解きながら、**未来を見据えた解決策**と、**さらなる可能性**について考えていきます。

## 🗣️ オンライン会議の課題

オンライン会議は、場所や時間にとらわれずコミュニケーションを図れる便利なツールですが、対面でのコミュニケーションと比べて**情報伝達の質に差**が生じることがあります。

**例えば**、

* **表情や声のトーンが伝わりにくい**
* **会議中に集中力が途切れてしまい、重要な情報を見逃してしまう**
* **議論が白熱して、全員が同じ方向を向いているか確認するのが難しい**

など、さまざまな課題が挙げられます。

### ✨ 解決策✨

これらの課題を克服するために、以下の解決策を考えました。

#### 1. AIで会議内容を自動で文字起こし

会議の自動文字起こしはすでに普及していますが、デフォルトで文字起こしをすることで、参加者は会議に集中することができます。
また、文字起こしデータは議事録として活用できるだけでなく、**AIによる自動要約機能**によって、会議内容を効率的に理解することも可能になります。

#### 2. 理解度ボタンの設置

会議中の参加者の理解度を把握するために、**理解度ボタン**を設置。
例えば、
- **理解できました**
- **よく分かりません**
- **補足説明をお願いします**

などのボタンをクリックすることで、リアルタイムに理解度の共有ができます。
これにより、参加者の理解度を把握することができ、適切なフォローが行えるようになります。

#### 3. AIで理解度チェック問題を自動生成

会議終了後、**AIが自動で理解度チェック問題**を生成することで、参加者の理解度を客観的に評価できます。
二択など、**簡単なクイズ形式**にすることで、参加者は楽しみながら理解度を確認できます。
また、AIは参加者の回答結果に基づいて、**必要なフォローアップ**を行うことも可能です。

## 💬 組織内SNSの課題

Teams、Slack、Googleチャットなど、組織内SNSは情報共有の効率化に役立ちますが、**情報が多すぎて伝わらない**、逆に**情報が少なすぎて伝わらない**などの課題を抱えています。

### ✨ 解決策：テンプレート機能による標準化 ✨

組織内SNSにおける情報伝達を効率化するために、**テンプレート機能**が有効ではないでしょうか。
例えば、

* **作業指示:** 担当者、内容、期日、背景や前提条件、成果物の粒度などの項目をあらかじめ設定したテンプレートを使用
* **質問:** 知りたいこと、やってみたこと、その結果何に困っているか、回答期限、関連情報などを明確に記載したテンプレートを使用
* **報告:** タスク、進捗状況、残タスク、課題、今後の予定などを簡潔にまとめたテンプレートを使用

など、**状況に応じたテンプレート**を複数用意することで、**情報の粒度を統一**し、**相手に伝わりやすい情報共有**を実現できます。

## 🌐 未来への展望：デジタルとアナログの融合

この記事では、オンライン会議と組織内SNSにおける情報伝達の問題点と、AI技術やテンプレート機能を活用した解決策について解説しました。

今後もどんどん新しいツールが生まれます。
しかし、情報伝達の基礎となる部分は、これからも変わらないのではないでしょうか。

新しい技術と、テンプレートなど、経験に基づく改善。

もっと便利で、もっと伝わる世の中にするため、一緒に歩んで行きましょう！
PowerShellとCommand Promptの違いについて調べた

書籍を読んでいて気になったので、タイトルの通りPowerShellとCommand Prompt(cmd)の違いについて調べてみました。
調べた結果見つけたのはこちらの記事
[コマンドプロンプトとPowerShellの違い](https://zenn.dev/mom/books/ca5cefe5d0855e/viewer/b7f5bc "zenn")

リンク先の記事も読んだところ、**PowerShellとcmdはどちらもWindows OSのシェルであることに変わりない**らしい。
PowerShellはcmdをより便利に使えるように発展させたシェルであるとのこと。
cmdで実行可能なコマンドはPowerShellでも全て実行可能である。
これに加えて、PowerShell独自のコマンドの実行やユーザーが作成した関数の利用による自動化を行えるとのこと。

スクリプトの例を見てみましたが、僕にとってはcmdのバッチファイルよりも理解しやすい形式でした。(JavaScriptの知識があればおおよそ内容は把握できそう)
PowerShellでコマンドやスクリプト作成に慣れれば、Linuxのシェルスクリプトへの取っ掛かりにもなるかしらね。。
Webcam Motion Captureで取得したFBXファイルからVRMAファイルを作成してChatVRMで動かす

# 概要
[ChatVRM](https://github.com/pixiv/ChatVRM)を使ってカメラでキャプチャしたモーションを再生できるようにした際の備忘メモ

# 成果物
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207491/bf344ced-7afd-4e37-ca45-504819354490.gif)
- (参考) 利用しているモデル

https://acidicdollz.booth.pm/items/4951937



# 作業の流れ
- [Webcam Motion Capture](https://webcammotioncapture.info/ja/) を使ってFBXを作成
- [AnimationClipToVrmaSample](https://github.com/malaybaku/AnimationClipToVrmaSample) をUnityで開く
- UnityでFBXファイルのAnimation TypeをHumanoidに設定してVRMAでエクスポート
- [ChatVRM](https://github.com/pixiv/ChatVRM)でVRMAファイルを読み込み


# Webcam Motion Capture を使ってFBXを作成

https://webcammotioncapture.info/ja/

- Webcam Motion CaptureでWebカメラキャプチャをアニメーションにすることができる
- 2024/6/17時点で最新のVersion 1.10.1を利用
- FBXエクスポート機能の利用にはサブスク登録が必要
- とりあえず下記設定でFBXファイルをエクスポート
  - VRMAみると目や髪は動いてないようにみえるのでチェックいらないかも

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207491/60806607-a860-0e6a-5a9a-6c75e6b3c4ad.png)


# AnimationClipToVrmaSample をUnityで開く

https://github.com/malaybaku/AnimationClipToVrmaSample

- Unity Hubをダウンロード
- AnimationClipToVrmaSampleをgit clone
  - 自分の環境だとなぜか途中でgit cloneが失敗(error: RPC failed; curl 92 HTTP/2 stream 0 was not closed cleanly: CANCEL (err 8))したためリポジトリをZipダウンロードして対応した  
- Unity HubのProjectsのAddでダウンロードしたリポジトリのフォルダを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207491/4f1d1ff8-1b97-bf74-d476-42da904f27d3.png)

- プロジェクトを開くのに必要なEditorなどが要求されたのでダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207491/09073bd6-ca6d-996a-d988-ecd2255a25c2.png)

- プロジェクトを開く
  - VRM1 > VRM Animation Exporterが表示されていればOK
  - 自分の環境だと最初表示されず何度か起動しなおしていたらうまくいった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207491/11e529c3-183a-8b2d-2e24-5dda17612778.png)


# UnityでFBXファイルのAnimation TypeをHumanoidに設定してVRMAでエクスポート
- SampleMotionフォルダにWebcam Motion CaptureからエクスポートしたFBXファイルを設置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207491/2bb442a1-2a88-7053-f2f2-c75f18909426.png)
- FBXファイルを選択し画面右のInspectorでAnimation TypeをHumanoidに設定
  - Rigを選択
  - Animation TypeをHumanoidに設定
  - Apply
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207491/fbc9da8b-3ad0-d2cf-a6eb-d655b17142e5.png)
- FBXファイルのアニメーションクリップをVRMAに変換して保存する
  - FBXファイルの中身を表示(ファイル右のアイコン)
  - アニメーションクリップ(三角形のアイコン)を右クリック
  - VRM > Convert to VRM Animationを選択しVRMAでエクスポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207491/ec774c58-a945-241f-6260-3392c6852be9.png)



# ChatVRMでVRMAファイルを読み込み

- ChatVRMでVRMAを読み込んでアニメーションすることを確認
- (参考) 自分は下記リポジトリのソースを参考にVRMAをドラッグアンドドロップで表示するようにしている

https://github.com/susurobo/ChatVRM-animate
ReactでGoogleFonts使ってみた

# ReactでGoogleFonts使ってみた
この記事ではweb分野始めて二か月ほどの初心者がReactでGoogleFontを使う方法をメモしたものです。フレームワークでNext.jsを使ってます。

## 適応前の状態
適応前のコードはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815854/4562f3e4-70ea-2d76-a7aa-4c8304b9ff05.png)

titleのところに文字が入る予定です。今回はtitle="ABOUT"にしてみました。
適応前のフォントはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815854/d58a7512-2682-4c8f-4b9b-0c6092864384.png)
これはこれでいいのかもしれないのですが、なんだか物足りないですね。
ここでGoogleFontsを使って文字を豪華にしていきます。

## GoogleFontsでフォントを選ぶ
まず、GoogleFontのページに飛びます。
https://fonts.google.com/

ここから、自分の好きなフォントを探します。種類が沢山ありますね。
今回はこのフォントを選びました。これをコードに組み込んでいきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815854/8eecfbea-bb89-25da-31de-cb11953ac7ce.png)

## GoogleFontsをコードに組み込む
適応させたいフォントが見つかったら右上のGet fontボタンをクリック。続けてGet embed code をクリックすると次のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815854/8e906c51-e1e0-f498-ed76-343098b46b16.png)
インストールの方法として<link>とimportがあるのですが、今回はimportを選択します。
まず、

>@import url('https://fonts.googleapis.com/css2?family=Jomolhari&display=swap');

の部分をコピーして、TSファイル（ページを作成しているファイル）と同じフォルダにstyle.cssを作成し、そこに貼り付けます。
```style.css
    @import url('https://fonts.googleapis.com/css2?family=Jomolhari&display=swap');
```

続けて、フォントを使用するファイルに、CSS classの部分を以下のように貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815854/61afa7ad-9190-304d-ab4a-cd5559cc0388.png)
この際、CSSファイルをインポートするのを忘れずに！！
CSSを記載する部分に

```
font-family: "Jomolhari",
  font-weight: 400,
  font-style: normal,
```
を書きます。
GoogleFontsには　font-family: "Jomolhari", serif;　と記載されていましたが、私の場合は必要なかったです。

## 完成
無事適応されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815854/c4b684e7-df05-f9f8-c1ca-dc96f8401a3f.png)

まだまだ初心者ですので、表記が正しくない点などありましたら気軽に教えてください。精進します。
ReflexをCloud Shell Editorで起動するまで

# ReflexをCloud Shell Editorで起動する
この[記事](https://qiita.com/SFITB/items/c3361979b86f441993ff)に触発されて、こうしたライブラリで社内向け便利アプリを作っていけるのでは？？と思ってます。

https://qiita.com/SFITB/items/c3361979b86f441993ff

やることはシンプルで、環境構築して、サンプルを実行するところまでを、とりあえずできるようになりたいと思います。

# 環境構築
いつものごとく、`venv`でPython環境を構築する。

```bash
python3 -m venv .venv
source .venv/bin/activate
```

次にReflexをインストールする
```bash
pip install reflex
```

そして、サンプルコードを持ってくる

```bash
reflex init
(お好みのサンプルを選択可能)
```

これで、サンプルコードが入る。
最近は色々を`reflex init`で選択できるようです。

ダッシュボードとかもあるようで、`PowerBI`では結局Excelの可視化専用ツールになってる......という人にうってつけかも。

ダッシュボードだけだったら `Streamlit`がもっと簡単かもしれませんが。

# 実行

```bash
reflex run

──────────────────────────────────────────── Starting Reflex App ────────────────────────────────────────────
Compiling: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 13/13 0:00:00
──────────────────────────────────────────────── App Running ────────────────────────────────────────────────
App running at: http://localhost:3001
```

この状態のまま、プレビューを見てみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68673/51e8dfaa-d49e-33c7-10ac-144b567ac145.png)

見たいのは3001ポートなので、ポートを変更して、プレビューを見る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68673/2a72d747-30bd-356e-e9fb-b816db9832b4.png)

出てきました！かっこいいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68673/89f7e614-c270-8497-ba3f-19641adfeaba.png)


# 設定をいじってみる
GCPではポートを選択できるので問題ないですが、AWSのCloud9だと`8080`、`8081`、`8082`ポートしか使わせてくれないので、`3001`では困ってしまいます。

https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/app-preview.html#app-preview-preview-app

そのため、フロントエンドのポートを`8080`に変えてみます。結構あっさり変更できます。

↓↓ なお、この記事を読んで、試してなんとかなりました。

https://qiita.com/kins/items/319cfb4f56aabbc50526

`rxconfig.py`を、次のように変更します。

```py
import reflex as rx

config = rx.Config(
    app_name="reflex_sample",
    frontend_port=8080,
)
```

`frontend_port`というオプションをつけてあげればOKとのこと。他のコンフィグも、

https://reflex.dev/docs/api-reference/config/

ここに書いてあります。
そして、起動しなおすと、

```bash
reflex run
──────────────────────────────────────────── Starting Reflex App ────────────────────────────────────────────
Compiling: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 13/13 0:00:00
──────────────────────────────────────────────── App Running ────────────────────────────────────────────────
App running at: http://localhost:8080
```

プレビューも`8080`ポートで見られるようになりました。

# おわり
５月初めにReflexを試してみたときは、フロントエンドのポートを変えられなくて挫折してしまいました。そのときは`Cloud9`で見たかったので、`8080`が必要でした。

当時は、`reflex`コマンドの引数で設定しても反映されなかった記憶がありましたが、いつの間にか使えていて、単なる記憶違いだったかもしれません。

このReflexは、特に非IT、製造関係の企業には朗報かもしれません。フロントエンドの開発できる人を用意するのは至難の業ですが、Pythonならなんとかなるという人材は、最近のAIブームのおかげでそこそこいるはずです。

社内アプリのひとつふたつ、作ってみたいなと思います。
変数固定化

```powershell:Constants.ps1

function Set-Constant {
    param (
        [string]$Name,
        [Object]$Value
    )
    
    if (-not (Get-Variable -Name $Name -Scope Global -ErrorAction SilentlyContinue)) {
        Set-Variable -Name $Name -Value $Value -Option Constant -Scope Global
    }
}

# 定数を定義
Set-Constant -Name "PI" -Value 3.14159
Set-Constant -Name "EULER" -Value 2.71828
Set-Constant -Name "GRAVITY" -Value 9.80665

# 配列を定義
Set-Constant -Name "PRIMES" -Value @(2, 3, 5, 7, 11, 13)

# 列挙型を定義
Add-Type -TypeDefinition @"
public enum Colors {
    Red,
    Green,
    Blue,
    Yellow
}
"@
Set-Constant -Name "Colors" -Value [Colors]

```


```powershell:MainScript.ps1

# Constants.ps1をインポート
. .\Constants.ps1

# 定数を使用
Write-Host "PIの値は: $PI"
Write-Host "オイラー数の値は: $EULER"
Write-Host "重力加速度の値は: $GRAVITY"

# 配列を使用
Write-Host "素数の配列: $PRIMES"

# 列挙型を使用
Write-Host "色の列挙型: $([Colors]::Red), $([Colors]::Green), $([Colors]::Blue), $([Colors]::Yellow)"
```
日本語生成AIの品詞付与「精度」をUD_Japanese-GSDで測る

[6月11日の記事](https://qiita.com/KoichiYasuoka/items/c6abf04ee5478b2df924)で書いた「国語研短単位でのUPOS品詞付与をFew-Shot Promptingでやる」という手法を、[UD_Japanese-GSD](https://github.com/UniversalDependencies/UD_Japanese-GSD)を使ってベンチマークっぽくしてみた。UD_Japanese-GSDは`ja_gsd-ud-test.conllu`が543例文、`ja_gsd-ud-train.conllu`が7050例文あるので、trainから12文とってくるごとにtestを1文処理するよう実装してみた。いわば12-Shot Promptingである。

```
#! /usr/bin/python3
# pip3 install transformers accelerate spacy-alignments
model="tokyotech-llm/Swallow-MS-7b-v0.1"
ud="https://github.com/UniversalDependencies/UD_Japanese-GSD"
import os
d=os.path.basename(ud)
os.system(f"test -d {d} || git clone --depth=1 {ud}")
os.system("for F in train dev test; do cp "+d+"/*-$F.conllu $F.conllu; done")
with open("train.conllu","r",encoding="utf-8") as r:
  trn=r.read().strip().split("\n\n")
with open("test.conllu","r",encoding="utf-8") as r:
  tst=r.read().strip().split("\n\n")
def ext(x):
  u=v=""
  for s in x.split("\n"):
    if s.startswith("# text ="):
      u=s[8:].strip()
    else:
      t=s.split("\t")
      if t[0].isdigit():
        v+="|"+t[1]+"_"+t[3]
  return (u,v[1:])
from transformers import pipeline
nlp=pipeline("text-generation",model,max_new_tokens=256,device_map="auto")
from spacy_alignments import get_alignments
i,j=0,int(len(trn)/len(tst))
gold=system=correct=0
for t in tst:
  w="\n".join("###text:"+"\n###UPOS:".join(ext(x)) for x in trn[i*j:i*j+j])
  u,v=ext(t)
  w+="\n###text:"+u+"\n###UPOS:"
  g=v.split("|")
  s=nlp(w)[0]["generated_text"].split("\n")[j*2+1][8:].split("|")
  gold+=len(g)
  system+=len(s)
  correct+=sum(1 for t,k in zip(s,get_alignments(g,s)[1]) if len(k)==1 and t==g[k[0]])
  i+=1
print("\n***",model)
print("Precision",correct/system if system else 0.0)
print("Recall   ",correct/gold)
print("F1 Score ",2*correct/(system+gold))
```

3行目の`model`を変えつつ実行した結果、私(安岡孝一)の手元では以下の結果が得られた。

```
*** tokyotech-llm/Swallow-MS-7b-v0.1
Precision 0.6868431771894093
Recall    0.6468467086082553
F1 Score  0.6662452092141136

*** stabilityai/japanese-stablelm-base-gamma-7b
Precision 0.6976513992621255
Recall    0.5948289090072119
F1 Score  0.6421501635813973

*** rinna/youri-7b
Precision 0.633976833976834
Recall    0.5669019487494246
F1 Score  0.598566163068573

*** rinna/llama-3-youko-8b
Precision 0.6315032797196514
Recall    0.5392051557465092
F1 Score  0.581715846542234

*** Rakuten/RakutenAI-7B
Precision 0.5840498913351602
Recall    0.47422126745435017
F1 Score  0.5234365076004573

*** cyberagent/calm2-7b
Precision 0.5589371980676329
Recall    0.44383918981126286
F1 Score  0.49478275744098527

*** lightblue/suzume-llama-3-8B-japanese
Precision 0.5029414697377605
Recall    0.38698787785791006
F1 Score  0.4374105710445302
```

残念ながらF1値が低く、品詞付与の「精度」としては不十分と言わざるを得ない。12-Shot程度では品詞付与は難しいのか、それとも、そもそも生成AIは品詞付与に向いていないのか、そのあたり、どうやって見極めようかな。
Arduinoで温度センサを使うときのポイント

# 精度が悪い時
LM35とかTMP36GZを使うときに温度と電圧は以下に従います。

```math
\begin{eqnarray}
V &=& 0.25 + (T[℃]-25) \times 0.01 \\
&=& T[℃] \times 0.01 \\
&=& T[℃] \times 10[mV/℃]
\end{eqnarray}
```
次のコードで電圧を測ると誤差が出ます。

```C++
void setup() {
  pinMode(A0,INPUT);
  //analogReference(INTERNAL);
  Serial.begin(9600);
}

void loop() {
  int data = analogRead(A0);
  float temp = data * 0.48828;  //5/1024÷0.01 
  Serial.println(temp,3);
  delay(100);
}
```
室温27℃に対して38℃とか**ずれた値が計測されます**。

## 原因
**A/Dコンパレータの基準電圧が5Vからずれていたことです。**

5V端子（Vcc）の電圧を計測したところ3.7Vになっていました。結果として1.35倍高い温度が計算されていました。
室温27℃に対して38℃とかずれた値も1.41倍となっており、基準電圧が原因ということを裏付けています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/5c345c06-4588-030e-6e98-4459e37d23af.png)

https://akizukidenshi.com/catalog/g/g103142/

**基準電圧はAVCCまたは内部基準電圧1.1Vで選択可能です。**


## 対処法
内部基準電圧1.1Vを使います。

```C++
analogReference(INTERNAL);
```
を実行することでA/Dコンバータの基準電圧が1.1Vになります。
これで精度が上がります。

http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2190

```C++:sample_program
void setup() {
  pinMode(A0,INPUT);
  analogReference(INTERNAL);
  Serial.begin(9600);
}

void loop() {
  int sum = 0;
  for(int i=0;i<100;i++){
    sum += analogRead(A0);
    delay(1);
  }
  float data = sum / 100;
  float temp = data * 0.10752688;
  Serial.println(temp,3);
  //delay(100);
}
```
100回計測して平均化していますが、これをしているのはかなり計測結果がぶらつくためです。

平均なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/822efd1c-b5a3-8632-d67b-f2d87ed6e251.png)

10回平均(計測間隔1ms)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/140dafd2-e9e6-9383-abe9-76080e0363ce.png)

10回平均(計測間隔0ms、delayなしで連続)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/1b92fd9b-6b26-7340-c857-7205b29a45c8.png)

100回平均
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/18036248-7d86-84c9-8113-1067b14dcced.png)

* 平均回数は10回ほど必要
* 計測間隔はあったほうが精度良好、なしで連続にしても効果はあり
Spring Data JPA(Java Persistence API)のクエリメソッドの種類一覧

# ■ 概要
Spring Data JPAの機能であるクエリメソッドで使いそうなメソッドをまとめた
- [基本的なクエリメソッド](#-基本的なクエリメソッド)
- [リポジトリで定義できる単純なクエリメソッド](#-リポジトリで定義できる単純なクエリメソッド)

# ■ 基本的なクエリメソッド
### ● 全てのエンティティ
```java
List<Item> items = itemRepository.findAll();
```
```sql:生成されるクエリ
SELECT i FROM Item i
```

### ● 指定されたIDに対応するエンティティ
```java
Optional<Item> item = itemRepository.findById(1);
```
```sql:生成されるクエリ
SELECT i FROM Item i WHERE i.id = :id
```

### ● 指定されたIDのエンティティが存在するかを確認
```java
boolean exists = itemRepository.existsById(1);
```
```sql:生成されるクエリ
SELECT COUNT(i) > 0 FROM Item i WHERE i.id = :id
```

### ● 単一のエンティティを保存または更新
```java
Item savedItem = itemRepository.save(item);
```
```sql:生成されるクエリ
-- 挿入の場合
INSERT INTO Item (fields...) VALUES (values...)
-- 更新の場合
UPDATE Item SET field1 = value1, field2 = value2, ... WHERE id = :id
```

### ● 複数のエンティティを保存または更新
```java
List<Item> items = Arrays.asList(item1, item2);
List<Item> savedItems = itemRepository.saveAll(items);
```
```sql:生成されるクエリ
INSERT INTO Item (fields...) VALUES (values...)
UPDATE Item SET field1 = value1, field2 = value2, ... WHERE id = :id
```

### ● 指定されたIDのエンティティを削除
```java
itemRepository.deleteById(1);
```
```sql:生成されるクエリ
DELETE FROM Item i WHERE i.id = :id
```

### ● 全てのエンティティを削除
```java
itemRepository.deleteAll();
```
```sql:生成されるクエリ
DELETE FROM Item
```

### ● エンティティの総数を返します。
```java
long count = itemRepository.count();
```
```sql:生成されるクエリ
SELECT COUNT(i) FROM Item i
```


# ■ リポジトリで定義できる単純なクエリメソッド
### ● 並び替え
OrderBy   : 指定されたプロパティでソートすることを指定
Asc, Desc : 昇順、降順でソートすることを指定

```java
public interface ItemsRepository extends JpaRepository<ItemsEntity, Integer> {
    // 昇順
    List<Item> findAllByOrderByPriceASC();
    // 降順
    List<Item> findAllByOrderByPriceDesc();
}
```
```sql:生成されるクエリ
SELECT i FROM Item i ORDER BY i.price ASC
SELECT i FROM Item i ORDER BY i.price DESC
```

### ● 条件検索
```java
public interface ItemsRepository extends JpaRepository<ItemsEntity, Integer> {
    List<Item> findByPrice(Integer keyword);
}
```
```sql:生成されるクエリ
SELECT i FROM Item i WHERE i.keyword = :keyword
```

### ● 条件検索 複数の場合
And : 複数の条件を組み合わせることを示す
```java
public interface ItemsRepository extends JpaRepository<Item, Integer> {
    List<Item> findByNameAndPrice(String keyword1, Integer keyword2);
}
```
```sql:生成されるクエリ
SELECT i FROM Item i WHERE i.keyword1 = :keyword1 AND i.keyword2 = :keyword2
```

### ● 曖昧検索
Containing : 部分一致検索を行うことを示す
```java
public interface ItemsRepository extends JpaRepository<Item, Integer> {
    List<Item> findByNameContaining(String keyword);
}
```
```sql:生成されるクエリ
SELECT i FROM Item i WHERE i.name LIKE %:keyword%
```
LLVMのMachine IRの学習メモ #1

この記事は個人的な学習メモです。
LLVMの中間言語の一つであるMachine IR(MIR)を公式ドキュメント等を参考に少しずつ理解したいと考えています。

https://llvm.org/docs/MIRLangRef.html

### Machine IR(MIR)とは

MIRは、LLVMのバックエンドの最適化で扱われるコード表現（中間言語）である。IR(intermediate representation)よりもマシンコードに近い表現で、命令やレジスタなどを含んだアーキテクチャ固有の表現となっている。
ヒューマンリーダブルなMIRは、主にLLVMバックエンドのコード生成パスをテストを記述するために利用される。例えば、```llc```（LLVMのバックエンドでアセンブリを生成するコマンド）を使用して、以下のようにLLVMのコード生成パスをテストことができる。

- オプション```-run-pass=<pass>```で、指定したパスのMIRの変化を確認する
- オプション```-stop-before=<pass>```で、指定したパスの直前のMIRを確認する
- オプション```-stop-after=<pass>```で、指定したパスの直後のMIRを確認する


### MIRの記述例

MIRには、*alignment*, *tracksRegLiveness*, *frameInfo* などのアトリビュート情報とregisters（レジスタ情報）、liveins（データが割り付けられたレジスタの情報）、body（命令列）などが含まれている。bodyには、ブロック開始時のliveinsや後続ブロックを示すsuccessorsが記載されている。 

```mir
...<IRモジュール>...
---
name:            f
alignment:       16
tracksRegLiveness: true
registers:
  - { id: 0, class: gr64 }
  - { id: 1, class: gr64 }
  - { id: 2, class: gr64 }
  - { id: 3, class: gr64_nosp }
...<中略>...
liveins:
  - { reg: '$rdi', virtual-reg: '%14' }
  - { reg: '$rsi', virtual-reg: '%15' }
  - { reg: '$rdx', virtual-reg: '%16' }
  - { reg: '$ecx', virtual-reg: '%17' }
frameInfo:
  maxAlignment:    1
machineFunctionInfo: {}
body:             |
  bb.0.entry:
    successors: %bb.1(0x50000000), %bb.11(0x30000000)
    liveins: $rdi, $rsi, $rdx, $ecx
  
    %17:gr32 = COPY $ecx
    %16:gr64 = COPY $rdx
    %15:gr64 = COPY $rsi
    %14:gr64 = COPY $rdi
    TEST32rr %17, %17, implicit-def $eflags
    JCC_1 %bb.11, 14, implicit $eflags
    JMP_1 %bb.1

...<中略>...

...
```

また、通常MIRにはIRモジュールも含まれている。上記のコードでは省略しているが、```name: f```の前に記載されている。MIRにはグローバル変数や外部関数への参照、関数属性、メタデータ、デバッグ情報に相当するものがないため、IRを参照してそれらの情報を得る必要があるからである。MIRコードがIRに依存しない条件であれば、IRモジュールを記載する必要はない。

なお、上記のMIRはx86_64で以下のコマンドにより出力している。

```bash
$ cat << EOF > test.c
void f(float *a, float* b, float*c, int n) {
  for(int i=0; i<n; i++) {
    c[i] = a[i] + b[i];
  }
}
EOF
$ clang -c -S -emit-llvm test.c
$ llc -simplify-mir -stop-after=dead-mi-elimination test.ll
```
課題（014）ー3

お疲れ様です。

先日提出してきた課題ですが、Googleフォントの指定や、ルート要素の指定に誤りがあったため再提出し、合格をいただいてきました:sweat:

![2024-06-16 230716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/06d80cf6-0e0f-49d6-e8cc-2e1e5750dae3.png)

![2024-06-16 230750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/ed75c5f3-d44b-fcdd-cdf9-bdac17b0c3d5.png)

font-family で指定するだけかと思いきや、ちゃんとGoogleのフォントサイトへ行って、コードなど入手しないといけなかったのですね…
この方法は知らなかったため、調べながら必要なコードを加筆:writing_hand:
<br>
また、ルート要素の指定で、 bodyタグにfont-sizeを書いていましたが、 htmlタグでなければならなかったため書き直し、更に「ルート要素の2倍」という指定がありましたので、 2rem にして再提出してきました。
<br>
別でJavascriptの勉強法についてchatGPT先生に提案してもらったところ、MDN様のページの中で入門編から勉強できるということでしたので、時間で区切って両立していこうと思います。
![2024-06-16 233841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/f64e1ff5-e9d2-387f-2dee-599517368c36.png)
EC2の混同しやすいインスタンスストア、EBSの違い

## よく混同してしまうインスタンスストア、EBS
よくEC2関連でEBSとインスタンスストアの2つを聞くと思います。
ただ、揮発性どっちで、容量多いのがこっちだっけとよく混同してしまいます。
なので、この際まとめてみようと思います。

## インスタンスストアとは
### 概要
インスタンスストアはインスタンス用の一時的なストレージを提供するもので、バッファ、キャッシュ、スクラッチデータ、その他の一時的データのように頻繁に変化する情報の一時的なストレージに最適だそうです。
以下要点をまとめます。
- EC2インスタンスの一時的なブロックストレージ
- インスタンスストアボリュームの数、サイズ、タイプは、インスタンスタイプとインスタンスサイズ
- インスタンスが停止、終了するとデータは失われる
- 高いIOPS性能が求められる場合に適しているが、耐久性は低い


### 料金
インスタンスストアボリュームは、インスタンスの使用料に含まれるそうです。（無料）

## EBSとは
### 概要
Amazon Elastic Block Store (Amazon EBS) は、Amazon Elastic Compute Cloud (Amazon EC2) 向けに設計された、使いやすく、スケーラブルで、高性能なブロックストレージサービスみたいです。
以下要点をまとめます。
- EBSはインスタンスストアと違いデータは消えない
- 最大サイズは16TB
- ボリュームタイプがある
    - 汎用 SSD（gp3, gp2）
    - Provisioned IOPS SSD（io2, io1）
    - スループット最適化 HDD（st1）
    - Cold HDD（sc1）
- EBSボリュームはデフォルトで暗号化され、保存中と転送中のデータが保護される
- EBSスナップショットを使用して、ボリュームのバックアップをAmazon S3に保存できる

### 料金
使用したストレージ容量とパフォーマンスオプションに基づいて料金が発生します。（有料）

## まとめ
インスタンスストアはEC2インスタンスのタイプなどによって、決まり、付与される揮発性のストレージ（無料）。
EBSはEC2インスタンスのタイプ関係なく、ボリュームやパフォーマンスを選べる不揮発性のストレージ（有料）。
混同しやすいので、インスタンスによって決まる揮発性のインスタンスストア、インスタンスとは関係なくきまる不揮発性EBSをしっかり覚えておきたいです。
【VSCode】現在開いているファイルの名称を変更する方法

## 拡張機能を使用する

File Utils という拡張機能を使用するとエクスプローラを開かずに現在開いているファイルの名称を変更できます。

https://marketplace.visualstudio.com/items?itemName=sleistner.vscode-fileutils

拡張機能をインストールし、コマンドプロンプトから `File Utils:Rename...` を実行するとファイル名が変更できます。

![スクリーンショット 2024-06-16 23.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/cdee5454-1494-e178-16d8-b3189e34f86f.png)

ファイル名の変更の他にも移動、複製、削除などができます。

![スクリーンショット 2024-06-16 23.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/91ab70ac-1277-6991-3c26-666cfdb388fe.png)
masterとorigin/masterの違い

# この記事を書くきっかけ

Gitには「masterブランチ」と「origin/masterブランチ」というブランチがデフォルトで用意されています。
SourceTree（Gitでのファイル管理をコマンド入力ではなく視覚的な操作で行うことができるソフトウェア）を使い始めたとき、新しいブランチを作っていないのに、「masterブランチ」と「origin/masterブランチ」の２つのブランチが表示されていることに疑問を感じていました。

今回は、その疑問を解消するべく、それぞれの違いについて説明します。

# masterとorigin/master
### master
- master はローカルリポジトリのブランチを指します(ローカルブランチ)。
- ローカルでの作業やコミットは、このブランチに対して行われます。
- master はリモートリポジトリにプッシュされる前の状態を保持します。

### origin/master
- origin/master は、リモートリポジトリ（GitHubなど）におけるmasterブランチの最新の状態を指します。
- また、ローカルリポジトリが最後にリモートリポジトリと同期したときのリモートのmasterブランチの状態を示します。



`git fetch` や `git pull` コマンドを実行すると、origin/master がリモートリポジトリの最新のmasterブランチに更新されます。

# 両者の違い
**ローカルリポジトリ**側から見た場合の、
masterとは、ローカルリポジトリのブランチ。ローカルでの作業やコミットが行われる。
origin/masterは、最後にリモートからフェッチまたはプルしたときのリモートのmasterブランチの状態を表すもの。

**リモートリポジトリ**側から見た場合の、
masterとは、リモートリポジトリのmasterブランチ。リモートリポジトリ上の最新のコミットを含むもの。

つまり、
ローカルリポジトリのmasterブランチは「master」、リモートリポーターのmasterブランチは「origin/master」という書き方をしているわけですね。

### 実際の使用例

1. ローカルでファイルを編集し、ローカルリポジトリのmasterブランチにコミットしたい！
`git add .`
`git commit -m "メッセージ"`

1. ローカルの変更をリモートリポジトリのmasterブランチにプッシュしたいな！リモートリポジトリのmasterブランチの名前はorigin/masterだから、コマンドはこうね！
`git push origin master`

1. リモートリポジトリの最新の状態をローカルに反映させるためにプルしたいな。リモートリポジトリのmasterブランチの名前はorigin/masterだから、コマンドはこうね！
`git pull origin master`

これで変更がローカルに反映させれ、ローカルのmasterブランチとリモートのmasterブランチ（origin/master）が最新の状態に保たれます。

# originとmasterが指しているものは
### originとは？

originは、リモートリポジトリのデフォルトの名前です。Gitでリポジトリをクローンすると、クローン元のリポジトリに対してこのデフォルトの名前が自動的に付けられます。
例えば、GitHubからリポジトリをクローンする場合、クローン元のURLがoriginという名前で登録されます。

### masterとは？
masterは、Gitのリポジトリでデフォルトのブランチとして作成されるブランチの名前です。最近では、mainがデフォルトブランチとして使われることが増えています。master/slaveというようなIT用語が主人と奴隷を連想させてしまい、言葉として現代の世相にそぐわないみたいです。

### master と origin/master の現在の状態を確認する方法

ローカルのmasterブランチのログを表示（ローカルリポジトリのmasterブランチのログを見せてくれ！）
`git log master`

リモートのmasterブランチのログを表示（リモートリポジトリであるoriginリポジトリのmasterブランチのログを見せて！）
`git log origin/master`

# まとめ
masterとorigin/masterについて知ることができて良かったです。
Nuxt3で使えるPWA対応プラグインを探す旅 〜2024年夏〜

Nuxt3で使えるPWA対応プラグインを探す旅をしたので、旅程を記録します。

### 現在地:house_abandoned:
nuxt@3.10.3

# 結論
### 試したプラグイン
[nuxt/pwa](https://pwa.nuxtjs.org/) ← 結論から言うとダメだった（Nuxt3に対応してない）
[vite-pwa-nuxt](https://vite-pwa-org.netlify.app/) ← 使える。だけど英語で書かれた最初のステップを見落としがちかと。← これが記事化の理由です。

# @nuxt/pwa について
ググると最初に出てくるのですが、Nuxt2までの対応でした。
公式サイトからNuxt.jsへのリンクも、Nuxt2リファレンス行きになっていました。

# @vite-pwa/nuxt
[Nuxt3公式](https://nuxt.com/modules/vite-pwa-nuxt)にも掲載があり、対応してくれているようです。

それではこちらをビルドできるまでの旅（やったこと）を記録します。

### インストール
まずはドキュメントに則ってインストールします。

```
npm i @vite-pwa/nuxt
```

### モジュールに追加
次に`nuxt.config.ts`に追加します。

```nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    '@vite-pwa/nuxt'
  ],
  pwa: {
    /* PWA options */
  }
})
```

### ここでエラー
このタイミングで、 `npm run dev`などで開発サーバが動いていると、ビルドエラーが出ます。こんなやつ。

```
Cannot restart nuxt:  Cannot destructure property 'nuxt' of 'this' as it is undefined. 
```

ふう。さてガイドを読み直そう。

### ガイドの「Examples」に何やら書いてある:beach:

You need to stop the dev server once started and then to see the PWA in action run:
nr dev:preview:build: Nuxt build command + start server
nr dev:preview:generate: Nuxt generate command + start server

そ、そうなのか。
いったんdevサーバを止めて、build と generateをする必要があるそうなのでその通りにします。

### 無事導入の旅終了:airplane:

ありがとうございました。うまくいきました。
【論文読み】Auto-WEKA モデル選択とハイパラ最適化

# はじめに
元論文: Auto-WEKA: Combined Selection and Hyperparameter Optimization of Classification Algorithms
著者: Chris Thornton, Frank Hutter, Holger H. Hoos, Kevin Leyton-Brown

https://arxiv.org/abs/1208.3719

ちょっと古い論文です．(2013)

従来，アルゴリズムの選択とハイパーパラメータの設定は個別に行われてきましたが，これらを同時に自動で最適化する手法です．

# 既存手法の問題点
従来の機械学習アルゴリズムの選択やハイパーパラメータの選択ではユーザが意思決定をする必要があり，人間の判断による選択には限界がありました．

ここで機械学習アルゴリズムを自動で選択する場合，手法ごとに使用するハイパラが違うという問題があります．

# 提案手法のアイデア

## CASH
アルゴリズム選択とハイパーパラメータ最適化を同時に行うために CASH (combined algorithm selection and hyperparameter optimization problem)を定義．
アルゴリズムとハイパラの探索空間から，最適な組み合わせを探索することを目指します．

探索自体は普通にアルゴリズムとハイパラを選択したらデータで訓練・推論して，ロスを最小化することを目指すみたいです．

## SMAC
SMAC (Sequential Model-Based Algorithm Configuration) はCASHを最適化するために使用されている既存手法で，ベイズ最適化をするみたいです．

ハイパラに対する損失を計算し，これを最小化します．

いくつかのtrain・validateデータで出した損失の平均を使って一度に計算することで，精度と効率を両立しています．

## TPE
TPE (Tree-structured Parzen Estimator) は損失関数のモデル化に密度推定 (density estimate) を用いる既存手法です．

損失が閾値を超えるかどうかに基づいて，"良い"設定と"悪い"設定の2グループに割り振ります．
それぞれの設定について別の損失関数として密度推定することで，損失が低い = 良い設定のグループに対してより良い推定ができる，という狙いです．

## Auto-WEKA
Auto-WEKAは多種多様なアルゴリズムを自動的に選択し，ハイパラを最適化してくれるツールです．

コードが公開されている他，Pythonのためのwrapperもあります．

# さいごに
実験ではちゃんと適切な手法とハイパラを選択し，良い結果を残していました．

少し古い手法なので，ハイパラ最適化なら他に色々手法があるかと思います．
しかし多種多様なアルゴリズムに対応し，アルゴリズムの探索ができるような手法はまだまだ貴重だと思います．
初めての個人開発でRustを触ってみた感想

# はじまり
　会社の業務を通してwebアプリ開発の知識が少しついたので、個人でも何か作ってみたい。作るネタなら趣味のTRPGのサポートツールでいいんじゃないか。Rustが好きなのでせっかくだからバックエンドにRustを採用したい。というざっくりした興味と開発意欲で、先月から色々作り始めました。
　コード書き始めて1年ちょっとのぺーぺーのボヤキにお付き合いください。
# 先月何してたのか
 　先月は、vue+rust+postgreSQLでTRPGサポート用のwebアプリを作っていました。このアプリ自体はルールブックの中のデータを入力してたりするので個人利用限定になりますが......
  　こちらでは、バックエンドのwebフレームワークにactix-webを。SQLライブラリにはsqlxを使用しました。
   　この時は、単純に選定理由は興味でした。知らんから使ってみようという。
    　ただ、Dieselは非同期対応してないらしい(今はdiesel_asyncなるものがあるらしい?)ので外しました。sea-ORMはまずsqlxを触ってみてからにしようということで先送りにしました。
### actix-webを使った所感
　actix-webに関しては、私の知識のある範囲内では何らストレスなく使えました。(昔は依存しているTokioのバージョン等で使いづらかったらしいですが今はそんなことありませんでした。)
 　一応有志で日本語訳されたドキュメントがあるのですが、途中までで止まっているのは少し残念です。しかし私にはどうすることもできない無力感......
　ネットで情報を探してみても、古いバージョンの記事は見つかるのですが、今回使った4.x.x~の日本語記事はあまり見つかりませんでした。
 　ただ、英語ですが公式ドキュメントはなかなか読みやすく、シンプルな造りになっていて助かりました。あとRustにはRustDocsがあり、これがなかなか見やすい(個人的にはjavadocより好き)ので、困った時の公式ドキュメントというのが他の言語より頼れる気がします。
### sqlxを使った所感
　使用自体に特に思うことはありませんでした......と思うくらいシンプルで使いやすかったです。
 　ただ、VSCodeのrust-analyzer都合かもしれないけれど、以前にPC自体の環境変数に引っ張られて、SQLiteを使っているのに「PostgreSQLのドライバーが検出されませんでした」とおこられてしまう。なんてことがありました。
### rust自体の所感
　書いていてむちゃくちゃ楽しい。これに尽きます。
 　所有権やスコープを意識してコーディングすることになりますが、これのおかげで後から見返したときに変数の動きがわかりやすいです。最初は&とか*とか(たまに'とか)で何が起きてるかわからないけれども、読み書きできるようになると他言語より読みやすいです。
　書いていて思うのは、参照がわかるのでjavaとかでよくやらかした参照先の上書きを起こしにくいのがありがたいです。Rustだとそういうのは必ず可変参照を取らないといけないので一発でわかります。
　必要以上に長く生きる変数を作らないとか、エラーハンドリングの考え方等、他言語を書く時にも意識したいことがいっぱい詰まっています。
 　現に業務ではどこから値を取ってきて、どこで編集されているかわからない、なんなら初期化されないまま再利用もされるクラス変数、グローバル変数に散々苦しめられているので......
# おわりに
　フロントに関しては特に思うことはないです。むしろSFCは詰め込みすぎると記述量が必然的に増えるので、積極的に切り分けをする習慣がつくので開発体験的にはいいです。(会社業務で3000行以上書かれてるコンポーネント見て発狂したりはしていますが)
 　バックエンドはjava,python,rustと触ってきましたが、ダントツでRustが好みです。エラーハンドリングが一番しっくりきますね。
　今後も個人でRust,vueを中心として知らないものに触っていこうと思います。
リーダブルコード勉強会の話

先日、社内で実施していたリーダブルコード勉強会を完遂しました！
そこで、この勉強会の内容や、企画・実施してみた感想を書き留めようと思います。

### 学習教材
[リーダブルコード より良いコードを書くためのシンプルで実践的なテクニック](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)
[リーダブルコード 英語版PDF](https://mcusoft.wordpress.com/wp-content/uploads/2015/04/the-art-of-readable-code.pdf)

勉強会のテーマとしてこの本を選択した、というよりは、業務で読みやすいコードを書けるようになりたい、という思いを持つ人が複数いたので、それなら勉強会という形にして一緒に学ぼう、という流れで勉強会の実施が決まりました。

### 進め方
1. 勉強会の事前準備として、各自2章分を読み進め、各章のキーワードやその意味、自分の考えをMiroボード上のふせんに記載しておきます。
2. 週一で設定された30分の共有・議論の時間枠内で、各自がふせんに基づき自分の意見や感想を発表します。その後、お互いの発表内容に対して質問・コメントしたり、業務にどのように活かせるかを具体的に議論したりします。

![勉強会に使用したMiroボード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513849/3848f2ea-b4b5-56a8-ee1c-d59f91c3e4b0.png)


このような進め方になった背景は次の通りです。

まず、この勉強会をいつまでに完了したいかを話し合い、勉強会の期間を2ヶ月に設定しました。リーダブルコードは15章から構成されるので、一週間に2章のペースで進めることとしました。

次に、開催形式を決めるにあたり、以下の記事を参考に議論しました。事前準備の負担が重すぎると継続が大変になります。一方で、事前準備なしで集まってから読書をするのでは、複数人で集まる意味が薄れてしまいます。そこで、以下の記事のダイアログ・リーディング型を採用し、先述のような進め方としました。この進め方では、事前準備にかかる時間は一週間あたり1~1.5時間程度と、程良い分量だったと感じています。

https://note.com/takuya_l_q_e/n/nf510cbd3d627

最初は3人で始まった勉強会でしたが、次第に人数が増え、最終的には7人ほど参加することもありました。人数が増えてからは発表する章を分担することにより、議論の時間が個人の発表時間によって削られすぎないように注意しました。

### 感想
本勉強会を通して、リーダブルコードとは何かを把握できただけでなく、勉強会の企画および実施という経験も得ることができました。今回の開催形態において、特に良かったと感じた点を3つ紹介します。

1. 互いの着目点や考えを聞くことで、自分が気にとめていなかった箇所に改めて考えを巡らせることができ、単に一人で読むよりも理解が深まりました。

2. 事前準備が間に合わなくても、週一の勉強会に参加するだけで学びが得られるようになっていました。各章の感想だけでなく、キーワードとその意味も含めて共有したことで、各章の要点をおさえることができるようになっていました。

3. 各章が独立しているという書籍の特徴もあり、途中から参加したり、業務都合で一部欠席したりする人にとって、参加のハードルを低くすることができました。

今後は、勉強会で学んだことをコーディングの際に活かしていきたいと思います。また、新たな勉強会にも挑戦したいです。
最後までお読みいただきありがとうございました。
G検定-1.2.人工知能研究の歴史

## エニアック(ENIAC) 1946年　
**世界最初のコンピューター**
electronic numerical integrator and computer(ENIAC)　

## ロジック・セオリスト(Logic Theorist)
1955年から1956年にかけてアレン・ニューウェル(Allen Newell)、ハーバート・サイモン(Herbert Alexander Simon)、J・C・ショーが開発したコンピュータプログラム。人間の問題解決能力を真似するよう意図的に設計された世界初のプログラムであり、「世界初の人工知能プログラム」と称された。

## 人工知能のブーム(主役)
### 第1次AIブームー推論・探索(レベル1)の時代（1950年代後半〜1960年代)
**<特徴>** 特定問題に対して解を提示できるようになったことがブームの要因です。
**<社会背景>** 東西冷戦下のアメリカでは特に英語ーロシア語の機械翻訳が注目された
**<成果>** トイ・プロブレム(おもちゃの問題）ー迷路や数学の定理の証明のような簡単な問題を解ける
**<課題>** 複雑な現実の問題は解けない

### 第2次AIブームー知識(レベル2)の時代（1980年代)
**<技術背景>** ハードウェア、ソフトウエアの発展　大量の専門知識を溜め込むことが可能になった時代
**<成果>** 大量の専門知識をため込んだ**エキスパートシステム**と呼ばれる実用的なシステムがたくさん作られました。日本では政府によって**第五世代コンピューター**と名付けられた大型プロジェクトが推進されました。
**<課題>** 知識を蓄積管理することの大変

### 第3次AIブームー機械学習・特徴表現学習(レベル3,4)の時代（2010年~)
**<社会背景>**　ビッグデータ
**<成果>** 人工知能が自ら知識を獲得する**機械学習**が実用された；
特徴量(変数)を人工知能が自ら習得する**ディープランニング(深層学習)**　が登場した。


**この3つはお互いに重なりあっています。主役が違うだけです。
第3次ブームの主役である機械学習は、本質的な技術の提案は、第１次ブームの時にすでに起こっており、逆に、第１次ブームで主役だった推論や探索も、第２次ブームで主役だった知識表現も、今でも重要な研究として継続されています。**


## 復習
https://qiita.com/YOYONIA/items/e5f337f19600c0069d0f
Vue ライフサイクルフックまとめてみた

今回は、Vueのライフサイクルフックについてまとめてみたので、よかったら見てください！

# ライフサイクルフックとは
そもそもライフサイクルフックとは、Vueコンポーネントインスタンスが生成された時に発生する一連の初期化の過程で実行することのできる関数のことです。

ちなみに、生成時に発生する一連の初期化とは、下記のようなものです。
- データ監視のセットアップ
  - コンポーネント内のリアクティブなデータを監視して、変更された時自動的にDOMを更新する仕組み
- テンプレートのコンパイル
  - `<template>`タグ内を仮想DOMに変換するプロセス

ここで、「テンプレートのコンパイル？？」「そもそもVueの処理の流れがわからない」と感じた方もいるのではないでしょうか？（僕だけかもしれませんが。。）
そこで、Vueの処理の流れをつかみながら、ライフサイクルフックの説明をしたほうがわかりやすいと思うので、流れに沿って解説していきます。

# Vueの処理の流れ（上から）
-  Vueインスタンスの生成
    -  アプリケーションが起動し、Vueインスタンスが生成される
-  ライフサイクルフックの実行（初期段階）
    -  `beforeCreate`：コンポーネントインスタンスが初期化される直前に呼び出される
    -  `created`:コンポーネントインスタンスが生成された直後に呼び出される
-  リアクティブシステムセットアップ
    -  リアクティブシステムがデータオブジェクトを監視するように設定される（つまり、リアクティブなデータの変更が追従されるようになる）
-  テンプレートのコンパイル
    -  コンポーネントのテンプレートが仮想DOMを生成するレンダリング関数にコンパイルされる
-  ライフサイクルフックの実行（マウント前）
    -  `beforeMount`: コンポーネントのテンプレートが仮想DOMにレンダリングされる直前に呼ばれる（この時点ではまだ実際のDOMには反映されていない）
-  仮想DOMの生成とマウント
    -  レンダリング関数が実行されて、仮想DOMツリーが生成される（生成されたのち、実際のDOMにマウントされる）
-  ライフサイクルフックの実行（マウント後）
    -  `mounted`：コンポーネントが実際のDOMにマウントされた後に呼び出される（DOM操作が可能になる）
-  データの変更と再レンダリング
    -  リアクティブなデータが変更されると、その変更が自動的に仮想DOMに反映される（変更が検出されると、レンダリング関数が再実行され、差分が実際のDOMに適用される）
    -  `beforeUpdate`：コンポーネントが再レンダリングされる直前に呼び出される
    -  `updated`：コンポーネントが再レンダリングされた後に呼びだされる
-  コンポーネントのアンマウント
    -  コンポーネントが不要になった場合にアンマウントされる
    - `beforeUnmount`：コンポーネントがアンマウントされる直前に呼び出される
    - `unmounted`：コンポーネントがアンマウントされた後に呼び出される

## 補足
### Vueインスタンスとコンポーネントのインスタンの違い
- Vueインスタンス
    - 定義
        - アプリケーション全体のエントリーポイントとして機能する
    - 役割
        - アプリケーション全体を管理して、ルートコンポーネントをマウントする
- コンポーネントインスタンス
    - 定義
        - Vueコンポーネントの具体的な実態を表す
    - 役割
        - 特手のUI要素を管理して、その要素に紐づいている李アクティブな値に関するデータやメソッドおよびライフサイクルフックを持つ

| 特徴              | Vueインスタンス                         | コンポーネントインスタンス                  |
|-------------------|------------------------------------------|--------------------------------------------|
| **目的**          | アプリケーション全体のエントリーポイント | 個々のUI要素の管理                         |
| **生成**          | 通常、アプリケーションごとに1回          | コンポーネントが使用されるたびに           |
| **マウント**      | ルートコンポーネントをマウント            | 親コンポーネントやテンプレート内でマウント  |
| **スコープ**      | アプリケーション全体をカバー              | 特定のUI要素に限定                         |

### SFCで記載をした時は、テンプレートのコンパイルはビルド時に行われる
SFCの場合、ビルド時にテンプレートはコンパイルされるため、本番環境でリアクティブな値が変更されたときに発生するのは、「仮想DOMの再生成と差分適用（パッチ）」です。

つまり、本番環境ではテンプレートの再コンパイルは発生しません。

# まとめ
ライフサイクルに関する解像度が少しでも上がってくれたらうれしいです！
ここまで読んでくださり、ありがとうございました！
問題の定式化に損失関数を使おう

## 主旨：
多くのアルゴリズム開発は、損失関数の最小化という定式化ができる。
そのような定式化に成功したとき、根拠が明確なアルゴリズムを構築できる。


### かつての私のアプローチ：
- 経験的なパラメータが多数あるアルゴリズム
- 経験的な評価指標
- 限られた評価シーンデータ
- 経験的なパラメータのチューニングの模索

### その結果がもたらしたもの：
- その多数の経験的なパラメータを用いたものが本当に最適な結果になっているのかがわからなくなった。
- 例：対象物の移動速度、カメラの画角などの設置条件
　それらを変えた時に、簡単にうまくいかない。
 どのようにすれば、いいアルゴリズムを作れるのか見失う状況にはまった。
 
## 最近の論文を読んでみよう：
- 明確な損失関数を定義している。
- 訓練に用いたデータ・セット・評価用のデータ・セットを明確にしている。
かつての私のようなアプローチはしていない。

## 損失関数に基づくアプローチは、アルゴリズムの構築の手順を明確化する。
- 追加したい拘束条件が、損失関数への項の追加として記述できる。
- どの量を最小化するアルゴリズムなのかがわかりやすくなるので、どの量が計算に反映されていないのかがわかる
- 反映されてない部分で精度がでないのは自然なこと
- 学習は、損失関数を最小化するものです。
- 損失関数の最小化においては、パラメータを利用して損失関数が微分可能であることが必要になります。
- 画像のレンダリングにおいても微分可能なレンダリングが必要になる理由はそこにあります。
- 損失関数の計算がを複数のGPUボードに分割しても効率を損なわないような損失関数が、複数GPUボードでの効率のよいアルゴリズムです。
- 例：
    - 背景の影響によって、対象物の分類・動作の分類などが影響を受けないようにする損失関数の定義例がある。

## 最小化というアプローチは数学・物理学の分野で頻出するアプローチ
- そのため、最小化の計算手法が高い。
- 最小化問題はよく解かれているのでノウハウも多い。
- 損失関数を１つ用意して、その量を最小化するアプローチは、物理学のいたるところで登場する。
    - 例：ラグランジアン
ラグランジアンという関数を定義して、その停留値を求める手法である。
最小値は、なめらか関数においては、停留値の一つである。
運動の記述を一般化座標で定義して、そのラグランジアンの停留値を求める条件として、Euler-Lagrangeの方程式を得て、それを解くことで、力学系の解を求める。

## See Also
[明日使えるかもしれないLoss Functionsのアイディアと実装](https://speakerdeck.com/ftakahashi/ming-ri-shi-erukamosirenailoss-functionsnoaideiatoshi-zhuang)