OmniAICreator/Qiita-1.07M huggingface dataset:
Rails:devise_token_authで発生するNoMethodError: undefined method `downcase' for nil:NilClass エラーについて

環境
ruby 3.2.2
rails 7.0.8
devise 4.9.2
devise_token_auth 1.2.2

# 1.エラー
Railsのログイン認証用のgemであるdevise_token_authを使ってログイン機能を実装しようとしたところ、APIにリクエストを送った時点でRails側のログでこのようなエラーが表示されました。

```text
NoMethodError in Api::V1::Auth::RegistrationsController#create
undefined method `downcase' for nil:NilClass
```

# 2.対処法
config/initializers/devise_token_auth.rbに:'authorization' => 'authorization'を追加

```ruby:config/initializers/devise_token_auth.rb
config.headers_names = {:'access-token' => 'access-token',
                        :'client' => 'client',
                        :'expiry' => 'expiry',
                        :'uid' => 'uid',
                        :'token-type' => 'token-type',
                        :'authorization' => 'authorization' }
```

# 3.authorizationについて

エラーが発生しているのはrackライブラリの以下の箇所でした

```ruby:rack-2.2.8/lib/rack/utils.rb
      def []=(k, v)
        p "#{k}: #{k.class} #{v.class}"
        canonical = k.downcase.freeze
        delete k if @names[canonical] && @names[canonical] != k # .delete is expensive, don't invoke it unless necessary
        @names[canonical] = k
        super k, v
      end
```
このk,vにそれぞれヘッダーのkeyとvalueが代入されているのでしょうがどうやらkeyにnilのデータが含まれているようです。そのため一旦initializerのauthorization設定を取り除きutils.rbに渡されるデータを取得しました。

```ruby:rack-2.2.8/lib/rack/utils.rb
      def []=(k, v)
        p "#{k}: #{k.class} #{v.class}" #ここを追加
        canonical = k.downcase.freeze
        delete k if @names[canonical] && @names[canonical] != k # .delete is expensive, don't invoke it unless necessary
        @names[canonical] = k
        super k, v
      end
```
```text:取得結果
"X-Frame-Options: String String"
"X-XSS-Protection: String String"
"X-Content-Type-Options: String String"
"X-Download-Options: String String"
"X-Permitted-Cross-Domain-Policies: String String"
"Referrer-Policy: String String"
"access-token: String String"
"token-type: String String"
"client: String String"
"expiry: String String"
"uid: String String"
": NilClass String"
```
そしてNilクラスに対応するvalueにはBearer Tokenが含まれていました
```
Bearer *******
```

エラーを解決後に通信を行った際のレスポンスヘッダーを見てみると:authorizationキーにはBearer Tokenが含まれているようでした。
```
authorization: Bearer *******
```
そのため、今回のエラーはinitializerでの設定が行われていなかったことによりヘッダーオブジェクトのキーがNilClassとなってしまっていたことが原因で発生したと考えられます。

# 4.参考
https://github.com/lynndylanhurley/devise_token_auth/issues/1540

https://qiita.com/Bjp8kHYYPFq8MrI/items/f2ad4f22b2b972227726
CircleCI でデータベース接続のHOST設定はどうすれば良いのか ( 127.0.0.1 / localhost で接続エラー )

# エラー例 -  Rails + Postgress の場合

`rails db:create` の実行でDBに接続できずにエラーが発生する


```
could not connect to server: Connection refused
        Is the server running on host "127.0.0.1" and accepting
        TCP/IP connections on port ****?
```

データベース接続のホストには何を指定すれば良いのか

# 解決

circleCIの設定で以下のように Dockerコンテナに付けた名前がそのままホスト名として使えるようだ

以下の例だとCircleCIの他のdockerコンテナからホスト名として `example-db` を参照できるようになる


```
.circleci/config.yml
```

```yml
jobs:
  test:
    docker:
      - image: <DB用のイメージ>
        name: "example-db"

```

ただしDBと他で jobs を分割してしまうと動かなかった

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
Flutter Firebase 苦戦したところ

Firebase Authenticationのアカウントと新規プロジェクトを作成
Flutter側でbuild.gradle等を一通り設定
エミュレーター起動OKだったが
メールアドレス、パスワードのログイン情報を送信しようとすると失敗する。

●エラー内容
Register Fail : [firebase_auth/network-request-failed] A network error (such as timeout, interrupted connection or unreachable host) has occurred.
Register Fail : firebase_auth/network-request-failed ネットワーク エラー (タイムアウト、接続の中断、ホストに到達できないなど) が発生しました。
![Screenshot_20230930_170341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388746/5dfdd406-c945-3023-5faa-454f5f926fd1.png)
・Firebase CLI　Node.j　の導入が必要だった。
・エミュレーターのネットワーク設定が(接続できていない状態)できていなかった。

通信に成功するとこうなる
![Screenshot_20231001_144453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388746/ee9d6e43-2c1e-8034-1511-38f489842cfd.png)

![スクリーンショット 2023-10-01 16.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388746/731f0f85-3905-eeed-a564-0890668596e4.png)

この辺りを参考にした。
https://qiita.com/Masaki_Mori07/items/70693d0be264e2295163
https://qiita.com/Umigishi-Aoi/items/32a46255bb935417ab3d
https://firebase.google.com/docs/cli?hl=ja#install-cli-mac-linux
https://firebase.google.com/docs/flutter/setup?platform=android&hl=ja
https://minpro.net/android-emulator-wifi-connected-with-no-internet
https://ittokoton.hatenablog.com/entry/2019/02/15/091939
「プロを目指す人のためのRuby入門」でRuby学んでみた

# はじめに
Rubyを勉強するために手にとった「プロを目指す人のためのRuby入門」所謂チェリー本を読了したので、読んだ所感を書きます。Rubyの入門書で迷っているひとの参考のひとつになればと思います。  
# 本の目次
この本の目次は以下のようになっています。
詳しい内容は省きますが、自分が勉強したいことにマッチしているか購入する前に参考にしてください。

- 第1章 本書を読み進める前に
- 第2章 Rubyの基礎を理解する
- 第3章 テストを自動化する
- 第4章 配列や繰り返し処理を理解する
- 第5章 ハッシュやシンボルを理解する
- 第6章 正規表現を理解する
- 第7章 クラスの作成を理解する
- 第8章 モジュールを理解する
- 第9章 例外処理を理解する
- 第10章 yieldとProcを理解する
- 第11章 パターンマッチを理解する
- 第12章 Rubyのデバッグ技法を身につける
- 第13章 Rubyに関するその他のトピック

実践的な内容が学べる参考書でRubyを学び始めるとき、もっとRubyの理解度を上げたいときにおすすめです。
一方で、いままでプログラムに全く触れてこなかったという未経験者は購入前にProgeteなどの手軽にプログラミング言語に触れられる教材に挑戦してからの購入をおすすめします。
その理由は以下です。

- 配列、条件分岐など未経験者からするととっつきにくい言葉が並ぶ
- 最低限の動作環境がないと勉強の効率が悪い

# 読み終わってみて
実際に読み終わってみて、良かった点です。

## 実践的
技術的な要素を並べるだけ終わらず、各章ごとに例題が用意されており現場ではどのように使われているか具体的にわかりました。

## テスト作成まで教えてくれる
各章の例題はプログラムするだけで終わらず、そのプログラムのテストを作成するまで教えてくれます。現場ではテストをつくらないことはほぼないため、より実践的に学べました。

## 章同士のつながりがわかりやすい
「何章に出てきた〇〇と関係が深い」「後の何章に出てくる〇〇と関係がある」と学習要素同士の関連が明確に記載されているので学んで終わりではなく、使い方まで発展しやすかったです。

# 最後に
これからRubyを学ぼうと考えている人にはお勧めできる一子札だと思います。教本選びの参考にしてください。
CSS flexbox の基本を学んでみた

～Flexboxを学習した際の備忘録～

前提知識
・HTML、CSSの基礎

### Flexboxとは
Flexbox は、CSS の Flexible Box（Flexbox）というプロパティの一部で、Flexbox を使うと、コンテンツの配置、方向、サイズなどを柔軟に制御できるようになる。

### 基本的な flex の使い方

**コンテナを flex または inline-flex に設定する**
まず、子要素をFlexアイテムとして配置する親要素（コンテナ）を指定。

```css
.container {
    display: flex; /* または 'inline-flex' */
}
```
**コンテナ内での主軸の方向を設定する**
flex-direction で主軸の方向を指定。

```css
.container {
    flex-direction: row; /*row はデフォルト */
}
```
デフォルトは row になっているが、他にも下記が選択可能。
・row : 左から右への横並び
・column : 上から下への縦並び
・row-reverse : 右から左への横並び
・column-reverse : 下から上への縦並び

**アイテム間の余白を制御する**
justify-content と align-items で、それぞれ主軸と交差軸上の位置を制御出来る。

```css
.container {
    justify-content: center; /* 主軸上の中央揃え */
    align-items: center; /* 交差軸上の中央揃え */
}
```
中央揃え以外にも下記が選択可能。
・flex-start : アイテムをコンテナの始点に揃える。
・flex-end : アイテムをコンテナの終点に揃える。
・center : アイテムをコンテナの中央に配置する。
・stretch : アイテムをコンテナの高さまたは幅に合わせて伸縮させる。


以下は、これまでの説明を踏まえたサンプルコード。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Flexbox Test</title>
    <style>
        .container {
            display: flex;
            justify-content: space-between;
            align-items: center;
            height: 200px;
            border: 1px solid black;
        }

        .item {
            width: 100px;
            height: 100px;
            background-color: #59bb0c;
            text-align: center;
            line-height: 100px;
        }
    </style>
</head>
<body>

<div class="container">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
</div>

</body>
</html>
```
この例では、3つのアイテムが主軸で均等に間隔を持って配置され、交差軸上で中央揃えしている。
![Flexbox_test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568359/bba87e90-0515-b271-163f-b2cc871e0cbe.png)



このように、Flexbox は便利で柔軟なレイアウトを実現することが出来る。
【chart.js】x軸ラベルの重複を排除して先頭の値だけ出力したい！

# 📝 前提
- **chart.js 0.1.4** (下記を参考に導入)
https://qiita.com/kei-kun1960/items/b84a7e421e3ed2620be9
- **Rails 6.1.7.3**
- **ruby 2.7.5**

# 💻 実践
## 【課題】chart.jsでx軸ラベルで重複を除きたい
例えば同じ日のデータが複数ある場合に
x軸ラベルに同じ日付が並ぶと凄く見づらいし冗長。

こんな感じ😢![スクリーンショット 2023-10-01 15.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073335/b0ce9181-5e1a-871e-3d07-42e074107406.png)

## 【解決法】 データラベルの配列に「空白」を格納する
chart.jsへ渡すx軸用のデータを編集する際に、配列の一個前の要素と比較し空白を格納していきます。

```ruby:model
  # グラフのx軸ラベルを返す
  def graph_label
    days = Match.league(@mg_ids).pluck(:match_on)
    days.unshift('') #グラフの最初のデータは0ptのため、''を先頭に追加する
    # 同じ日が複数ある場合は最初の日付だけグラフ上に出力するよう配列を編集
    days.map.with_index do |day, i|
      next day if i == 0
      day == days[i - 1] ? '' : day.to_date.to_s(:date)
    end
  end
```

[補足]
・`days`がx軸ラベルの配列。日付が入ってます(yyyy/mm/dd形式)
・`days.unshift('')`は実現したいグラフによっては不要。
・`day == days[i - 1]`で一個前の要素と比較し、同じである場合は''(空白)を返す。
・`to_s(:date)`は、Dateクラス`Date::DATE_FORMATS[:date] = "%-m/%-d"`のようにしているため、日付がmm/ddのフォーマットで出力されます。

👇 編集後のx軸ラベルの配列はこんな感じになる
![スクリーンショット 2023-10-01 16.35.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073335/0d4a2c0a-cf7f-ef1e-fafb-49925e3503ed.png)



## 【結果】ラベルすっきり！
こんな感じ。すっきり!🤗
![スクリーンショット 2023-10-01 15.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073335/6dea6925-5d3d-2c52-2a55-3c9aa06d0406.png)

# 📊 終わり
読んでくださり、ありがとうございます！他のやり方やアドバイスあれば教えてください！

👉　**[chart.js](https://www.chartjs.org/)**
Rails7 ActiveStorage レコードに画像添付済みかの判定を行う


This article shows how to judge whether to be  arleady attached an image when using ActiveStorage.

## 環境情報＆前提条件
* Ruby 3.2.1
* Rails 7.0.0

## 解決したい内容
* ActiveStorageで画像を添付する。レコードにすでに画像が添付済みかの判定を行いたい。
* `nil?`で判定すると常時`false`が返ってくるので、一見画像が添付されているように見える。しかし、画像の実体をうまく取得できない。

## 解決手順
* nil判定ではなく、`attached?`メソッドを使用して判定する。
  * 補足：画像の実体は`blob`レコードなので実体を見たい場合は`image.blob`のようにして参照を１段階深くたどる必要がある。

```rb
# 例）Userモデルのimage項目に画像を添付する
# nil判定では添付済み判定を正しく行えない。画像自体は未添付でもnil?はfalseを返す。

# id=1のレコードのimageには画像添付されていないとする
user = User.find(1)
# 画像自体は未添付（=blobレコードが存在しない）でもActiveStorageのレコードは紐づいているのでnil判定が使えない。
user.image
=> <ActiveStorage::Attached::One:0x0000ffff7d63c450>
user.image.nil?
=> false

# 解決策：attachedメソッドを使用して判定する。
user.image.attached?
=> true

# 補足：画像が添付されている場合は、blobレコードが添付される。
# id=2のレコードにはimageが添付されているとする
attached_user = User.find(2)
attached_user.image.nil?
=> false
attached_user.image.blob
=> <ActiveStorage::Blob:0x0000ffff80499898>
attached_user.image.blob.nil?
=> false
```
ハッキングされたときの対処法


# 渋谷でハッキングされたときの、とりあえずの対処法
#### まずGoogleアカウントが取られるときの話です。
私が出会ったのは電波系のハッカーのようで、サイドチャンネル攻撃やテンペストが主な技のようでした。普通になりすましサイトとかも入れてパスワード盗んだりもしてきます。
Googleアカウントは２段階認証など色々とセキュリティが強いです。ただ、Google以外の部分が弱いと意味がないです。例えば二段階認証に電話のSMSを使っている場合は偽の基地局を立てられて認証用のメッセージが盗まれます。基本的には複数人のおじさんと若者らがリアルにつきまとってきます。そのうち気づくので時々笑えるくらいわかりやすいです。なんでかしらんけどタイにもいましたｗ。ついて来たときはiPhoneがやられて位置情報が把握されていたようです。
ここにある対策はWebの専門知識がなくても、個人でできる対策ばかりです。普段から注意していると良いかもしれません。

# 最低限の対策
まずは基本的なネットワーク機能が使えるように、Googleアカウントと端末の確保が必要になります。とりあえず使えるようにするためのベストな組み合わせは

### ・Chromebook(最新のがベスト、必ずBluetooth とWiFiは使わずにUSB有線LANアダプタを使うのがベスト)
### ・Google Titan Security Key（**物理キー**）で二段階認証をする（必須）。予備キーもあると安全。
### ・Google Pixcel 7以降（組み込みセキュリティを歌った商品が必要。)
(セキュリティソフトだけでは防ぎにくい。セキュリティが強くても、WiFiとBluetoothは使わないように。ちなみにiPhone（ios16）はやられました）

### ・画面のキータッチのアニメーション表示をOFFにする。
PINなどいれるときに画面のアニメーション表示があると何が起きているかが見れれてしまいます。生体認証などで防ぐのもよいのですが、生体認証自体を無効化して侵入しようとするので注意しましょう。生体認証の様子がおかしいときはオフラインにしてから設定を見直してみましょう。オンラインで再起動してからPINを入れないようにすると効果的です。

最低限、物理キーがあればメールやチャット、その他の連絡や他社サービを使うことができます。パスワードなど入れるときにパスワードが見える状態で入力や確認をしないでください。常に見られていると思ったほうが無難です。

# テンペスト対策
市販のair spyなど使うと近くのモニターが簡単に見えます（なんで市販してるんだろ？）
対策は色々ありますが、この攻撃は家にいるときなど特定の場所にいるときにやられます。対策はChromebookの解像度をよくわからんような値にしておくことや、ノイズを発生させる（電気の小さなスパークや回転している小さなDCモーター等をモニターに近づけるなど）。

# DNSリーク対策
ブラウザのセキュリティレベルを上げて、DNS設定はGoogle public DNSを使いましょう。


# VPNを使う

このときGoogleアカウントでログインするのが良いです。Chromebookのブラウザ拡張機能のNord VPNを使います。Androidアプリも入りますが、Androidアプリが有効だと別の侵入方法を与えてしまうかもしれません。

# トラベルSIMを使う
特定の電話番号のSIMを使っていると、端末を変えても入ってこれるようです。（通信会社はここの対策してるんでしょうか…？）そこでトラベルSIMしか使わない端末を用意して、SIMからの侵入を防ぎます。電話番号が特定できないと入ることは難しいようです。使っていた電話番号のSIMは通話専用にして、データ通信はOFFにしておきましょう。

# Windowsを使う
やはりWindowsが使いたい場合はクラウドのWindows365を使いましょう。マイクロソフトアカウントが非常に取られやすいので、Googleアカウントで保護するか、別でセキュリティ用の物理キー(Windows端末でしか使えないようなのでどうにかしてほしい)を使いましょう。googleのセキュリティキーとは別のマイクロソフトアカウント対応の物を用意してください。マイクロソフトアカウントを取られると端末の居場所がわかるので注意してください。またiCloudも取られると同じようなことになります。


# その他の対策
ローカルのWindowsのセキュリテイは非常に弱いので、使うなら特にやられても良いアカウントで使いましょう。ウィルスバスターやノートンを入れると良いと思います。また、指紋認証などを使って都度パスワードを入れるのはやめましょう。

基本的にはDifenderなどを無効にしてAdminのパスワードを盗もうとしてきますので、ユーザーアカウントを作って、そちらで普段は使うほうが良いです。ユーザーアカウントでもインストールのときなどにAdminのパスワードを盗み見ようとするので注意してください。
php artisan route:list 実行後→Class "PostController" does not exist

## 開発環境

- Mac OS Monterey（バージョン12..2.1）
- MacBook Air （M1）
- composer version 2.0.9
- Laravel Framework 10.10

Todoアプリのバックエンド側を実装中、Laravelでルーティングの設定をしており、ルートの確認をしようと以下を実行

```php
php artisan route:list
```

すると…

```php
Class "PostController" does not exist
```

とエラー表示が！！！

PostControllerが存在しないと怒られている…が、PostControllerはあるんだけどな〜となりました。

色々調べていると、どうやらver7→ver8で、この辺のルーティングの設定方法が異なっているっぽいことが判明。

いくつかのサイトを参考にしたので、追記しておきます。



## 試したこと


今回試したこととしては、以下になります。

- RouteServiceProvier.phpで名前空間を追記
- アクション構文の使用
- オートローダーの実行

### RouteServiceProvider.phpで名前空間を追記
---

こんな感じで、/homeの下に、`protected $namespace = 'App\Http\Controllers';` を追加。

```php
public const HOME = '/home';

protected $namespace = 'App\Http\Controllers';
```

このタイミングで、以下の部分にも追記を行った。

```php
public function boot(): void
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });

        $this->routes(function () {
            Route::middleware('api')
                ->prefix('api')
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)//←追記
                ->group(base_path('routes/web.php'));
        });
```

コマンドを実行するも、変化なし。

### アクション構文の使用

---

こちらは、既にやっていたもののとりあえず、再度確認。

```php
//todo作成
Route::get('/todo', [PostController::class, 'create']);
//todo一覧表示
Route::post('/posts', [PostController::class, 'index']);
//todo削除
Route::delete('/todoDelete', [PostController::class, 'todoDelete']);
```

### オートローダーの実行

---

オートローダーがPHPクラスを見つけることができず、エラーが発生しているのではないかと思いこちらを実行。

```php
composer dump-autoload -o
```

こちらも変化なし。

※オートローダーとは

→ファイルを自動で読み込む仕組みのこと。これがあると、requireをしなくても名前空間を指定するだけで、クラスを使用できる。

特に解決法が見つからないまま、画像検索をしていたらあることに気づいた。

「namespaceの部分1つしか追記してないな〜」

というのも、api.phpは特に設定したりしていなかったので、特別気にしていなかった。

ということで、改めて、apiの方にも追記。

```php
public function boot(): void
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
        });

        $this->routes(function () {
            Route::middleware('api')
                ->namespace($this->namespace)//←追記
                ->prefix('api')
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)//←追記
                ->group(base_path('routes/web.php'));
        });
    }
```

これでコマンドを実行すると…

![routeList.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2597943/4293b225-c854-87b0-a5d5-c300154cf745.gif)


表示できた！！！

色んなサイト渡り歩きましたが、上記３つをするとほぼ解決するみたいです。

僕みたいに、見落としてる可能性もあると思うので、同じ実装になってるかはちゃんと確認をした方が良さそうですね（自戒）

## 参考


https://readouble.com/laravel/10.x/ja/routing.html

https://qiita.com/tamakiiii/items/e71040173fa0a1fcad83
ニューラルネットワークの予測の不確実性（deep Gaussian process・概要編）

# はじめに
deep Gaussian processでニューラルネットワークの予測の不確実性を算出する手法を紹介します。  


# Gaussian process (ガウス過程)  
ガウス過程では、データセット$\{(x_1, y_1), ..., (x_n, y_n)\}$の関数$y=f(x)$を、多変量正規分布を用いてモデル化します。  
平均関数$m(x_i)$とカーネル関数$k(x_i,x_j)$を用いて下記のように定義します。  
```math
p\left(\begin{bmatrix}
   y_1 \\
   \vdots \\
   y_n
\end{bmatrix}\right)
= \mathcal{N}\left(
\begin{bmatrix}
   y_1 \\
   \vdots \\
   y_n
\end{bmatrix}
\middle|
\begin{bmatrix}
   m(x_1) \\
   \vdots \\
   m(x_n)
\end{bmatrix}
,
\begin{bmatrix}
   k(x_1,x_1) & \dots & k(x_1,x_n)\\
   \vdots &  \ddots & \vdots \\
   k(x_n,x_1) & \dots & k(x_n,x_n)
\end{bmatrix}
\right)
```
このように定義される関数を$f\sim GP(m,k)$と書きます。  

$$
Y=[y_1,...,y_n]^T, X=[x_1, ..., x_n]^T,m(x_i)=0,  
$$
```math
k(X,X)=\begin{bmatrix}
   k(x_1,x_1) & \dots & k(x_1,x_n)\\
   \vdots &  \ddots & \vdots \\
   k(x_n,x_1) & \dots & k(x_n,x_n)
\end{bmatrix}
```
の場合を例に説明します。  
また、ノイズ$\epsilon \sim \mathcal{N}(0,\beta^{-1})$を考慮して、$y=f(x)+\epsilon$を考えると、$f \sim GP(0,k(x_i,x_j)+\delta_{ij}\beta^{-1})$となります。

教師データ$\{X,Y\}$を用いて、テストデータ$X^\*$の予測を行う場合は、同時分布を考えます。
```math
p(Y^*,Y|X^*,X) =  \mathcal{N}\left( 
\begin{bmatrix}
Y^* \\
Y
\end{bmatrix}
\middle|
0,
\begin{bmatrix}
   k(X^*,X^*) + \beta^{-1}I & k(X^*,X) \\
   K(X,X^*) & K(X,X)+ \beta^{-1}I
\end{bmatrix}
\right)
```
この同時分布から条件付き確率を求めると下記のように書くことができます。  
```math
p(Y^*|Y,X^*,X) = \mathcal{N}(Y^*|\mu^*,\Sigma^*) 
```
```math
\mu^* = k(X^*,X)(k(X,X)+\beta^{-1}I)Y 
```
```math
\Sigma^* = k(X^*,X^*)+\beta^{-1}I-k(X^*,X)(k(X,X)+\beta^{-1}I)^{-1}k(X,X^*)
```
このように、テストデータの予測値の事後分布を求めることができます。  

カーネル関数としては、$k(x_i,x_j)=\sigma^2\exp(-\frac{1}{2}w_l\sum_{l}(x_{il}-x_{jl})^2)$のような関数が用いられます。  
$l$は$x$の要素のインデックスで、$w_l$はパラメータです。  
$w_l$を最適化することで、予測性能が高いモデルを得ることができます。  


# deep Gaussian process (深層ガウス過程)  
ニューラルネットワークの各層にガウス過程を用いたものが、深層ガウス過程になります。  
3層のニューラルネットワークを考え、入力層を$X^1$、中間層を$X^2$、出力層を$Y$とします。  
中間層と出力層は下記のようにガウス過程で定義されます。  
```math
f^{X^2} \sim GP(0,k^1(X^1,X^1)) 
```
```math
f^Y \sim GP(0,k^2(X^2,X^2))
```

深層ガウス過程では、学習のためにinducing points（誘導点）を導入します。  
3層のニューラルネットワークの場合は、入力層の誘導点$Z_1$と、中間層の誘導点$Z_2$を導入します。  
誘導点は変分推論で最適化する変数で、観測データを用いて、誘導点、平均関数、カーネル関数の最適化を行います。  
この最適化は、大規模な観測データを少数の誘導点に圧縮していると捉えることができます。  
新たなデータが与えられた場合は、学習結果を用いて事後分布を計算します。



### 参考資料
- 須山敦志, ベイズ深層学習, 2019.
- A. C. Damianou and N. D. Lawrence, Deep Gaussian Processes, AISTATS, 2013.
- H. Salimbeni and M. P. Deisenroth, Doubly Stochastic Variational Inference
for Deep Gaussian Processes, NeurIPS, 2017.
Code Spell Checker はデフォルトで全てのファイルをチェックしてくれるわけではない

VSCode でコードを書いている皆さんは拡張機能の [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) を使っている方が多いと思いますが、一部の (マイナー) 言語ではデフォルトでスペルチェックが有効になっていません。~~私はこれを知らずに typo だらけのファイルを GitHub に push しました。~~

## 言語を指定して有効化する
エディタ設定の `C Spell: Enable Language Ids` に言語 id を追加します。デフォルトで有名な言語などが追加されています。特定の言語を追加したい場合はこちらの方法を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1291112/294c40fe-7293-cc79-a852-058dc58e527d.png)

## ファイルタイプを指定して有効化する

エディタ設定の `C Spell: Enable Filetypes` にファイルの種類を追加します。デフォルトでは空です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1291112/1844ddb0-473b-4339-af38-5ff133702aa5.png)

## その他

`C Spell: Overrides` で特定のファイル名パターンにマッチして言語の設定を適用するなどの設定も可能です。
Splunk: BY句以外で集計データに元の値を表示したい、LIST関数とVALUES関数の使い方


###### 実施環境： Splunk Free 8.2.2

### やりたいこと

Splunk で stats 関数などを用いて集計する際、合計や平均などではなく「値そのまま」を出力したい場合があります。
そのような際に用いるのが、 list 関数と value 関数です。

### 実行例

 list 関数と value 関数は使用方法がよく似ていますが、大きく異なる点が1つあります。
集計範囲に同じ値があった場合、 list 関数は「重複したまま出力する」のに対し、 value 関数は「重複を排除して出力する」という違いがあります。
以下の例を見るとそのことがよくわかるかと思います。

```Splunk:Splunk
| makeresults count=10
| streamstats count AS CNT
| eval NUM = CNT % 2
| stats sum(NUM)    AS SUM,
        list(NUM)   AS LIST,
        values(NUM) AS VALUES
```

![スクリーンショット 2021-12-19 15.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1c15bbef-3188-d525-b42c-17efbd8a86fe.png "stats")

なお、 list 関数や value 関数を用いて出力した値は「マルチバリュー」となります。
そのため、加工する際は mvexpand コマンドなどマルチバリューに用いるコマンドや関数を利用することが多いです。

```Splunk:Splunk
| makeresults count=10
| streamstats count AS CNT
| eval NUM = CNT % 2
| stats sum(NUM)    AS SUM,
        values(NUM) AS VALUES
| mvexpand VALUES
```

![スクリーンショット 2021-12-19 15.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/649802f6-080e-266c-e0a4-31813be83b31.png "mvexpand")
C言語で現在時刻をテキストファイルに書き込むプログラムを作成しました。

現在時刻をテキストファイルに保存するプログラムです。
実行後にスペースキーを押すことで保存を行うことが可能です。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>

#define MAX_TIMESTAMPS 1000
#define DELAY_TIME 1000
typedef struct {
      time_t timestamp;
      long sys_val;
    }data_t;


void writeTimestampsToFile(const char* fileName, data_t* data, int count) {
    FILE* file = fopen(fileName, "w");
    if (file == NULL) {
        perror("ファイルを開けません");
        return;
    }
    time_t *timestamps;
    for (int i = 0; i < count; i++) {
        fprintf(file, "%d ",data[i].sys_val);
        fprintf(file, "%s", ctime(&data[i].timestamp));
    }
    fclose(file);
}
 
int main() {
    
    data_t *data = (data_t*)calloc(MAX_TIMESTAMPS, sizeof(data_t));
    time_t *timestamps = (time_t*)calloc(MAX_TIMESTAMPS, sizeof(time_t));
    if (timestamps == NULL) {
        perror("メモリを確保できません");
        return 1;
    }

    int currentIndex = 0;

    printf("スペースキーを押すとタイムスタンプを記録します。Ctrl-Cで終了します。\n");

    while (1) {
        time_t currentTime;
        time(&currentTime);
        timestamps[currentIndex] = currentTime;
        data[currentIndex].timestamp = currentTime;
        (data[currentIndex].sys_val) = rand();
        currentIndex = (currentIndex + 1) % MAX_TIMESTAMPS;
        if (_kbhit()) {
            char keyPressed = _getch();
            if (keyPressed == ' ') {
                printf("space\n");
                writeTimestampsToFile("time.txt", data, MAX_TIMESTAMPS);
            }
        }
        Sleep(DELAY_TIME);
    }
    // プログラムがCtrl-Cで終了する場合、すべてのタイムスタンプをファイルに書き込む
    free(timestamps);
    return 0;
}
```
Rails7 Docker環境 deviseで生成されたviewの変更が反映されない


This article shows how to reflect view file change when using devise gem and Docker container.

## 環境情報＆前提条件
* Ruby 3.2.1
* Rails 7.0.0
* 開発環境
  * Docker使用
  * DBのimage postgres:14-alpine

### gem
* devise 4.9.2

## 解決したい内容
* deviseで生成されたviewの変更がブラウザ仮面上で表示しても反映されない。
* 開発時にはDocker環境を使用している。

## 解決手順
* deviseの設定ファイルの編集
```rb:config/initializers/devise.rb
# デフォルトでコメントアウトされている箇所を解除し、trueに変更する。
config.scoped_views = true
```

* コンテナの再起動を行う。
  * ※Docker環境で変更が変更されないような場合は、コンテナ再起動をすると反映されるケースがままあります。
```sh
$ docker compose restart
```

## 参考記事
以下記事を大いに参考にさせていただきました。
* [[rails]deviseで作成したviewページの編集が反映されない](https://qiita.com/yusuke1209kitamura/items/dcaf3622c21cf08ebdba)
灰色15級がABC322をpythonでやってみた。

初めまして。あおぷと.zipです。久しぶりにAtCoderをやってみました。
やったのは[ABC322](https://atcoder.jp/contests/abc322)です。
ちなみに解けたのはA問題だけです。
# A - First ABC 2
## 問題

https://atcoder.jp/contests/abc322/tasks/abc322_a

問題文と入出力例を見てみると

>2行目の入力の中で初めて"ABC"が出てくるのは何文字目か。

ということです。
```python:main.py
input()
line = input()
answer = line.find("ABC")

if answer == -1:
    print(answer)
else:
    print(answer+1)
```
:::note
1行目の入力はpythonでは不要なのでinput()だけ入れて飛ばしています。
:::
【Rails】TimeZoneを使えば中学地理の時差計算は満点


# はじめに
先日`Time.current`を使う機会があり、これを出力してみると以下のような結果が出ました。
```
Sun, 24 Sep 2023 23:27:44 JST +09:00
```
`JST`とは日本標準時(Japan Standard Time) 
`+09:00`とは世界標準時から+9時間の時差がある という意味です。

ふと、こんなことを考えました。

**「これ、日本以外の時差も見れんじゃね？」**

2つの方法があるのでハワイの時差を例に出して紹介します。

## 方法1  　　　　　　　　　　　　　　　　　　　　　`config/application.rb`で　　　　　　　　　　`config.time_zone = '○○'`を変更する

手順は以下の通りです。

#### 手順１
`config/application.rb`で`config.time_zone = '○○'`を特定の地域名に変更する
```config/application.rb
config.time_zone = 'Hawaii'
```

#### 手順２
`pp`で`Time.current`を出力する
```
pp Time.current

-> Sun, 24 Sep 2023 05:32:51 HST -10:00
```
`HST(ハワイ標準時) - 10:00`　と表示されていますね。
これは世界標準時より-10時間の時差があることを示しています。

日本は+9時間の時差なので、「ハワイと日本の時差は19時間で、日本の方が時間が進んでいる」ということがわかりますね。

## 方法2 　`　ActiveSupport::TimeZone`を利用する
手順は以下の通りです。
#### 手順１
下記のコードを書く
```
ActiveSupport::TimeZone.all.each {|tz| 
      pp tz.to_s
}
```

結果
```
"(GMT-12:00) International Date Line West"
"(GMT-11:00) American Samoa"
"(GMT-11:00) Midway Island"
"(GMT-10:00) Hawaii"
・・・
# 各都市の名称と時差
・・・
"(GMT+13:00) Nuku'alofa"
"(GMT+13:00) Samoa"
"(GMT+13:00) Tokelau Is."
```
#### 手順2
`cmd + F　`で"Hawaii"と検索

結果
```
"(GMT-10:00) Hawaii"
```
`GMT（世界標準時）-10:00`と表示されていますね。
これは世界標準時より-10時間の時差があることを示しています。
方法１と同じ結果が取得できましたね。

ここからはハワイと日本の時差を求めていきます。

`cmd + F　`で"Hawaii"と検索すると以下の結果が返ってきます。
```
"(GMT+09:00) Tokyo"
```
日本は`(GMT+09:00)`と表示されているので世界標準時より+9時間の時差があります。
ハワイと日本の時差は、下のイメージで簡単に計算できます。
```
"Hawaii" <---- GMT ----> "Tokyo"
　　　　　　　　　　　　　　　　　　-10時間　　　　　　　　+9時間
```
ハワイと日本の時差は19時間と求められましたね。
そして、"Tokyo"の方が"Hawaii"より右にあるので、日本の方が時間が進んでいると理解できますね。


##### ちなみにこの方法だと151の地域の時差を一括取得できます。　便利ですね
```
１ "(GMT-12:00) International Date Line West"
2 "(GMT-11:00) American Samoa"
3 "(GMT-11:00) Midway Island"
4 "(GMT-10:00) Hawaii"
・・・
# 各都市の名称と時差
・・・
149 "(GMT+13:00) Nuku'alofa"
150 "(GMT+13:00) Samoa"
151 "(GMT+13:00) Tokelau Is."
```

# まとめ
#### 方法１
メリット： 時差だけでなく現在時刻も表示してくれる

デメリット：　`config/application.rb`を修正するのが面倒

#### 方法２
メリット： 方法１と違い、`config/application.rb`をいじる必要がない
　　　　　  151の地域の時差が一覧で表示される

デメリット：現在時刻が表示されない

# 最後に問題
上記の方法を使って
ロシアのヤクーツク("Yakutsk")という地域と日本（"Tokyo"）
の時差を求めてみましょう。

求められた人には
**離れていても同じ時間に生きていることの神秘さ**が伝わったと思います。

記事は以上です。では、さようなら
キャラクターぬいぐるみの写真はアイコンにしてもいいのか

何かアカウントを作成したときにせっかくだからアイコンを設定したいと思いました。
しかし、使いたい画像が既存のキャラクターのぬいぐるみの写真だったので、著作権的に大丈夫か気になり調べました。

## 結論
大量生産されたぬいぐるみで自分で所持・撮影していれば問題ありません。

## 違法になる可能性がある場合
- 購入前のぬいぐるみを撮影した写真
- ぬいぐるみが１点ものなど希少価値があるもの
など……

※対象にフォーカスしていないいわゆる「写り込み」の場合は、また別の規定があるそうです。

## まとめ
問題ないケースがあるということでした。
今回はぬいぐるみに限ったことで、また自分で既存のキャラクターの絵を描いてアイコンにするという場合はまた別で調べる必要がありそうです。

アイコンを設定するとモチベーションが上がりますし、
複数のSNSのアカウントで同じアイコンを使用していると認知度も多少上がるのでおすすめです。

## 参考サイト
https://maruc.work/20230712-youtube
https://usakuma-do.jp/archives/2448
ロジカルシンキングで技術を比較検討・選定する

# 概要
受託開発企業で働くfussasyといいます。普段は、SAPのクラウド環境上でアプリケーション開発をしています。縁あって、某外資系コンサルティングファームにサブコン（ITコンサルタント）として、新規システム開発案件に企画から参画しました。その際、利用技術の比較検討・選定と、その根拠をスライドにまとめてクライアントに説明する機会が多くありました。資料構成パターンは汎用的に利用できる思うので、まとめておきます。

# ロジカルシンキングで技術の比較検討・選定をする
ロジカルシンキングは、社内外問わずクライアントやステークホルダーに接する機会のある、ビジネスパーソンには必須のスキルとなります。ロジカルシンキングとは何か、という解説は以下のGLOBISの資料を参照いただければと思います。

https://globis.jp/article/6305

以下を意識して技術の比較検討・選定を行うと、説得力を持ちやすくなります。

・主要な技術比較要素をMECEに分類・因数分解し比較検討する。
・技術に対する事実（何ができて、何ができないのか）を定量的に記載する。
・技術に対してバイアスを含む感情論は記載しない。
・主張と根拠、因果関係は明確に記載する。

箇条書きの説明は極力避け、ロジカルシンキングに沿ったフレームワークを使って、穴埋め式のように書き上げると綺麗な資料ができます。

# 技術の比較検討・選定のための整理パターン
例として、以下に基本的なパターンを示します。簡潔なメッセージラインも加えると良いです。必要に応じて、枠線・色分け・強調・注釈書き等を加えると良いですが、やりすぎるとスライドあたりの情報量が過多になってしまうので注意です。

### ①技術の特徴・注意について、概要を記載
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/ae172651-55a6-dbbe-1aea-1246290343df.png)
### ②複数の技術について、概要を比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/499c8521-0b2e-75e3-2331-96f0a8c18e99.png)
### ③複数の技術について、メリデメを比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/80ef651e-ab89-8c5b-79aa-a1cf782cf638.png)
### ④MECEに因数分解した比較群・比較区分で複数の技術について、横並びで比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/554d3901-3a34-acf0-cfa9-ce09a2b61427.png)
### ⑤ディシジョン・ツリーで技術を決定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/f50c6d2d-c352-9baa-6f8c-856b2ca06dfe.png)

# さいごに
例えば、エンタープライズアーキテクチャであれば、開発領域・実行領域・運用領域に分類します。開発領域のうち実装・テスト・移行に分類し、実装に絞ってみても、さらに多様な目的に応じた技術・ツールが存在します。一つの目的（例：開発言語）だけでも類似技術・ツールがあるので、比較検討して何が最適かを決定しなければいけません。
検討材料の元情報は公式ドキュメントを中心にQiita、Zenn、他社事例から得ると良いですが、その後の膨大な情報量を、効率的・機械的に選定していくために、定型的な整理パターンに当て込んでしまうのが、手っ取り早く説得力を持たせられる方法だと思います。

# その他参考記事
https://qiita.com/okmttdhr/items/45bda0af2d7caaac4525
SHARP Brain で動作するアプリを開発する (X1エミュレータもあるよ)

# 概要
- 初心に帰り WindowsCE アプリを作成してみる

# 必要なもの
- eMbedded Visual C++ 3.0
  - 参考: ハードディスクに残っていたファイル名 evt2002web_min.exe 210,485KB
  - PocketPC SDK も同梱されているので これだけで OK!

# eVC3 を実行
- Windows 2000 で evt2002web_min.exe を実行するだけで良い
  - web_min となっているがオフラインでインストール可能
  - [Windows 11 にもインストール可能でした](https://qiita.com/nekopro2/items/b78c256c84a54417c58a)

- 当時のプロジェクトを開いて ビルドしてみました
![evc3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/ec9a3979-31d2-cd5b-0631-a1553ac24f92.png)

# Brain での動作方法
- アプリ¥[名前] のフォルダを作成する
- 作った .exe を アプリ¥[名前]¥AppMain.exe という名前で配置する
- 0バイトの空ファイルを アプリ¥[名前]¥index.din に配置する

追加アプリから起動できるようになります。
![Brain.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/8bd8c33c-da38-d9bc-829a-cf2d97e6a945.jpeg)

- ビルドしたバイナリ [xmil-brain-20231001.zip](https://turboz.to/xmil/xmil-brain-20231001.zip) 166KB

# バッド ノウハウ集
- eVC4 + SigmarionIII SDK はダメでした
  - フリーズしまくり
  - リンクでこける
  - SP2 (evc4sp2J.exe 42,475KB) を当てても解決しない
- GAPI (gx.dll) が提供されていないので、使わずにビルドしよう
  - ~~恐らく GAPI for Brain を作成すればいいだけな気がする~~
    [偽gx.dll を作成することで 当時の PPC 版ビルドが実行可能でした](https://qiita.com/nekopro2/items/9a44e8f28e52c1eb5b02)
Rails7 ActiveStorage レコードに添付済みの画像を複製して別レコードに添付する


This article shows how to duplicate a image flie already stored when using ActiveStorage.

## 環境情報＆前提条件
* Ruby 3.2.1
* Rails 7.0.0
* 開発環境
  * Docker使用
  * DBのimage postgres:14-alpine
* 本番環境
  * Herokuにデプロイ(stack heroku-22)
  * Active Storageの画像の保存にはAmazon S3使用

## 解決したい内容
* 別レコードにすでに添付されている画像データを別レコードに複製して添付する。
* 新規添付時には以下のように添付できるが、既存レコードに添付済みの画像を複製して添付したい。
```rb
# 例）Productモデルのimage項目にasset内のdummy.jpgを添付する場合
product.image.attach(io: File.open(Rails.root.join("app/assets/images/dummy.jpg")),
                       filename: "dummy.jpg")
```

## 解決手順
* `product.image.blob`として`blob`メソッドを使用することで既存レコードの画像情報を取得可能

```rb
# 例）Productテーブルのid=1のレコードに添付されている画像を複製し、新規作成するレコードに添付し直す場合

# Productテーブルのid=1のレコードの取得
existing_product = Product.find(1)

# 既存レコードの画像を複製し、新規作成するレコードに再添付する
new_product = Product.new
new_product.image.attach(existing_product.image.blob)

# 新規レコードの保存
new_product.save
```
aa

## 参考記事
* [How do I duplicate a file stored in ActiveStorage in Rails 5.2](https://stackoverflow.com/questions/49631530/how-do-i-duplicate-a-file-stored-in-activestorage-in-rails-5-2)
ランダムサンプリングによる被覆半径の期待値

# 導入

空間が与えられたとき，ランダムに点を取ることにより，どれくらい空間を近似できるかを考える．今回は，空間からランダムに点を取ったときにどれくらい近似できているかを測定する被覆半径を紹介し，被覆半径の値の確率とその期待値について紹介する．

# 被覆半径の定義

距離空間$( X,\delta )$に対する部分集合$Y$の被覆半径とは
$$ \rho (X , Y) := \sup_{x \in X} \inf_{y \in Y} \delta (x,y) $$である．被覆半径$\rho (X , Y)$は$X$と$Y$のHausdroff距離と見なすこともできる．

今回は，集合$X$から$n$個ランダムに取ったときの，被覆半径は何なのか，特に，期待値はいくらなのかについて考える．

以下，空間$(X,\delta)$は$C^1$級$d$次元コンパクト(角付き)Riemann多様体とする．コンパクトRiemann多様体はEuclid空間にある有界でなめらかな図形，を想定している．

# ランダムサンプリング

[Reznikov-Saff][RS2016]によって，被覆半径の確率評価，及び，期待値について，計算されている．

> \[[RS2016][RS2016] , 系2.3 \] 空間$(X,\delta)$は$C^1$級$d$次元コンパクト(角付き)Riemann多様体とする．また，$X_n$を空間$(X,\delta)$上の体積測度由来の確率分布から$n$点サンプリングした確率分布とする．このとき，ある$c_1, c_2 >0$が存在して，任意の$\varepsilon >0$に対して，ある$N(\varepsilon) \in \mathbb{Z}_{>0}$が存在して，$N > N(\varepsilon)$ならば
>　$$ \mathbb{P} \left[ c_1 \left( \frac{\log N}{N} \right)^{1/d} \leq \rho (X_n , X) \leq c_2 \left( \frac{\log N}{N} \right)^{1/d} \right] > 1 - \varepsilon .$$
> その上，ある定数$C_1, C_2 > 0$が存在して，
> $$ C_1 \left( \frac{\log N}{N} \right)^{1/d} \leq \mathbb{E} \rho (X_n , X) \leq C_2 \left( \frac{\log N}{N} \right)^{1/d} . $$

※実際はより一般の場合で示している．

証明は[RS2016][RS2016]に投げることとする．

# 理論値限界との比較

[Reznikov-Saff][RS2016]は点群の被覆半径の理論限界を示した．
> 定理 2. \[[RS2016][RS2016], p. 3 \] 空間$(X,\delta)$は$C^1$級$d$次元コンパクトRiemann多様体であるとする．このとき，ある定数$C_1$が存在して，任意の正数$n \in \mathbb{Z}_{>0}$に対し，$n$点の任意の点群集合$X_n (\subset X)$は
> $$ \rho (X , X_n ) \geq C_1 n^{-1/d}  .$$

※実際はより一般の場合で示している．

定理 1.より，ランダムに取った場合より，$\log $の分だけ計算効率が悪いことが言える．
また，[Flatto-Newman][FN1977]により，定理2の不等号を定数倍を除いて達成する点列の取り方が存在する[FN1977][FN1977]．つまり，最良に点を取ったときに比べて，$\log $の分だけ計算効率が悪いことが言える．

# 参考文献

\[[FN1977][FN1977]\] L. Flatto, D. J. Newman, Random coverings, Acta Math. 138: 241-264 (1977). DOI: 10.1007/BF02392317

\[[RS2016][RS2016]\] A. Reznikov, E. B. Saff, The Covering Radius of Randomly Distributed Points on a Manifold, International Mathematics Research Notices, Volume 2016, Issue 19, 2016, Pages 6065–6094, https://doi.org/10.1093/imrn/rnv342

[FN1977]:https://projecteuclid.org/journals/acta-mathematica/volume-138/issue-none/Random-coverings/10.1007/BF02392317.full

[RS2016]:https://academic.oup.com/imrn/article-abstract/2016/19/6065/2399425?redirectedFrom=fulltext&login=true
Android Studio: Kotlin を使う

こちらと同様のことを、Ubuntu 23.04 にインストールした Android Studio Giraffe | 2022.3.1 で行いました。
[Let’s Build Your First Android App in Kotlin (Android Studio Giraffe)](https://bigknol.com/android/lets-build-your-first-android-app-in-kotlin-android-studio-giraffe/)

## Empty Views Activity を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/626d52db-f49a-c5f7-fe57-6a2f99a09c41.png)

## Language は Kotlin にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2572f3da-c0cb-af12-0c57-1f93e76c97e2.png)

## activity_main.xml を次のようにする

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/84fb5241-d5a2-a79e-55a5-c02f257777d1.png)


## MainActivity.kt を次のようにする

```kt:MainActivity.kt
package com.example.n003

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import kotlin.random.Random

class MainActivity : AppCompatActivity() {

    private  val list = listOf("東京", "新橋", "品川", "川崎", "横浜", "戸塚", "大船")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val button: Button = findViewById(R.id.button)

        button.setOnClickListener {
            val index: Int = Random.nextInt(list.size)
            val randomDogName = list[index]
            Toast.makeText(this,randomDogName, Toast.LENGTH_SHORT).show()
            button.text = randomDogName
        }
    }
}
```

## Run
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/adef7f47-00f5-95b4-22ac-7bfeeb28b1a5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5cf7fab6-9dae-9c09-2786-d5d504571d33.png)

## Build APK(s)
右下に、次のウインドーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/562b0a60-71dc-5bde-d97a-c803e79363c0.png)

locate をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/8a93503e-2a30-488e-0838-b4343028049a.png)

app-debug.apk を USB などで、実機に持って行って、インストールします。
つまり、app-debug.apk はインストーラーです。
flow field でコードを書こう

# flow field の可視化
flow field を可視化するコードの書き方を紹介しよう。

## 準備

javascriptライブラリのp5jsを使用する。ベクトルの考え方は仮定。

## flow field とは

各点にベクトルがくっついたもの。以下のような図を想像してもらえればよい。
![IMG_0197.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576323/dcdd7f81-eba5-cd03-4afb-05d64e045585.jpeg)


点が変化した時、ベクトルも変化するのが通例。（もちろん、変化しないこともある。この場合、変化しないflow fieldとなる）
その変化の仕方、各点にどんなベクトルが定義されているのか、それを記述したものが、flow fieldです。

## 実際の記述

では、実際にflow field を一つ書いてみよう。
点座標に対して、ベクトルを一つ作るのが、flow fieldだから、引数として、x,yと言う点座標を受け取り、p5.jsのベクトルを返す関数を書けばいい。

```javascript
function my_field(x,y){
    let vec = createVector(x,y);

    return vec;
}
```
この時点で、もうflow fieldはできている。どんなflow fieldか想像できるだろうか？

## グリッドの用意
ここから、flow fieldを可視化する手続きに入る。各点で、flow field　のベクトル情報を受け取ることができれば、OKなので、各点に点を打っておく。

```javascript
    for(let i=0; i<10; i++){
    for(let j=0; j<10; j++){

    let x = width/10*i;
    let y = height/10*j;

    point(x,y);

    }
    }
```
ここまでのコードをp5.jsで表示してみよう。

```javascript:sketch.js
function setup() {
  createCanvas(400, 400);
}

function my_field(x,y){
    let vec = createVector(x,y);

    return vec;
}

function draw() {
  background(220);
  
    for(let i=0; i<10; i++){
    for(let j=0; j<10; j++){

    let x = width/10*i;
    let y = height/10*j;

    point(x,y);

    }
    }
}
```

![ダウンロード - 2023-10-01T145438.833.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576323/ec14ff89-2e18-7f47-1365-ebf090c7cf01.png)

現状、flow field と、グリッドが別々に存在している状態です。

## 反映
では、flow fieldを可視化してみよう。
ベクトルの大きさをとって（magメソッド）、それを、pointの大きさに変えてみよう。

```javascript
let w = my_field(x,y).mag();
strokeWeight(w);
```
この二行を、pointを描画する手前に挿入。

```javascript
function setup() {
  createCanvas(400, 400);
}

function my_field(x,y){
    let vec = createVector(x,y);

    return vec;
}

function draw() {
  background(220);
  
    for(let i=0; i<10; i++){
    for(let j=0; j<10; j++){

    let x = width/10*i;
    let y = height/10*j;

    //反映  
    let w = my_field(x,y).mag();
    strokeWeight(w);
      
    point(x,y);

    }
    }
}
```
![ダウンロード - 2023-10-01T150228.588.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576323/62c7a085-dd3e-2ec7-d2c0-f3f1893b0d05.png)


ちょっと値が大きすぎる。wを調整するために、1/10をかけてみる。

```javascript
function setup() {
  createCanvas(400, 400);
}

function my_field(x,y){
    let vec = createVector(x,y);

    return vec;
}

function draw() {
  background(220);
  
    for(let i=0; i<10; i++){
    for(let j=0; j<10; j++){

    let x = width/10*i;
    let y = height/10*j;

    //反映  
    let w = my_field(x,y).mag();
    strokeWeight(w/10);
      
    point(x,y);

    }
    }
}
```
![ダウンロード - 2023-10-01T150439.019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2576323/19d039de-19d4-1d1e-b5e1-599c0a3dcfab.png)
できました。とりあえず、今回はここで終わります。
「Mind」「プロデル」「なでしこ」「ドリトル」４大日本語プログラミング言語と「Re:Mind」を系統図で分類

# はじめに

「日本語トランスコンパイラ言語 Re:Mind（リマインド）」という自作トランスコンパイラ言語[^1] の企画意図を再確認するため、主要な日本語プログラミング言語と差別化特徴をまとめています。

## 対象読者
日本語プログラミング言語に偏見のない方、むげに否定しない方

# 日本語プログラミング言語とは？
##  日本文字（日本漢字、ひらがな、カタカナ）を使ったプログラミング言語
あくまで形式言語の範疇で、主に英文字ではなく日本文字（日本漢字、ひらがな、カタカナ）を使ったプログラミング言語のことです。自然言語としての日本語の語順を取り入れるかは必須要件ではありませんが、これからご紹介する4言語は取り入れていて1言語(Re:Mind)は取り入れていない例です。

# 主要日本語プログラミング言語の特徴別系統図とRe:Mind（リマインド）のポジション

```mermaid
flowchart TD
    start(((開始))) --> A{"日本語語彙を使用"}
    A --> |しない|C["ASCIIプログラミング言語"]
    C --> stop(((対象外)))

    A --> |する|B["日本語プログラミング言語"]
    B --> J{"日本語語順を使用"}

    J --> |する|W1{"分かち書きを"}
    W1 --> |する|O1{"オブジェクト指向に"}
    O1 --> |対応しない|M["日本語プログラミング言語</BR>Mind"]
    O1 --> |対応する|D["日本語プログラミング言語</BR>ドリトル"]
    W1 --> |しない|O2{"オブジェクト指向に"}
    O2 --> |対応しない|N["日本語プログラミング言語</BR>なでしこ"]
    O2 --> |対応する|P["日本語プログラミング言語</BR>プロデル"]

    J --> |しない|W2{"分かち書きを"}
    W2 --> |する|O3{"オブジェクト指向に"}
    O3 --> |対応する|R["日本語トランスコンパイラ言語</BR>Re:Mind"]
```
日本語語彙を使用する|しない→日本語語順を使用する|しない→分かち書きをする|しない→オブジェクト指向に対応する|しない　で分類した、非常にざっくりした系統図ですが、ドリトルがMind側に寄ったのはちょっと驚きでした。

# おわりに
「Mind」「プロデル」「なでしこ」この３つの日本語プログラミング言語の開発者は３名様ともQiitaユーザーさんでもあります。[^2] [^3] [^4]
本格的なコンパイラを実装することは非常にたいへんなことです。この記事を読んでいただいたQiitaユーザーのみなさん、ぜひ日本語プログラミング言語の開発者Qiitaユーザーさんを応援して、盛り上げていきましょう！

[^1]: Qiita [オープンな実装言語仕様 日本語トランスコンパイラ言語 Re:Mind（リマインド）2023 Lv1.1ドラフト](https://qiita.com/mylifewithviolin/items/ee1a16a363aaa4fe3f4c)　参照
[^2]: Qiita [まるで詩のような日本語で書いたプログラム - 実際に動きます](https://qiita.com/killy/items/0b5eb530fdceebd8c03e)　参照
[^3]: Qiita [なでしこでもっと美しくFizzBuzzを書く](https://qiita.com/kujirahand/items/4d6a0166f54e4d6290fc)　参照
[^4]: Qiita [日本語プログラミング言語「プロデル」でズンドコキヨシ](https://qiita.com/jpl_produire/items/e28a54709b7eb73cd201)　参照
【Java・学習ログ11】カプセル化について

<br>
教本に沿ってやってみたシリーズ、『第13章』。

≪使用教材≫スッキリわかるJava入門　第3版　スッキリわかるシリーズ

## ■カプセル化(アクセス制限)

フィールドへの読み書きやメソッドの呼び出しを制限する機能。
悪意や間違いによるメンバの使用を防止する。

《できること》
* 例1)Heroクラス以外からは勇者のHPフィールドを設定できない。
* 例2)dieメソッドを呼べるのはHeroクラスだけ。

カプセル化とはこのような制限を実現できる仕組みのことである。

#### アクセス方法の指定方法

|制限の名称|アクセス許可をする範囲|
| --- | --- |
| private | 自分自身のクラスのみ |
| package private | 自分と同じパッケージに属するクラス |
|protected |自分と同じパッケージに属するか、自分を継承したクラス|
|public|すべてのクラス|

* private (自分自身のクラスのみアクセス可能)
HeroのHPクラスをほかのクラスから変更されるのを防いだ例。
thisを用いれば同じクラスからは読み書き可能。
フィールド、またメソッド名の頭に付ける。
```java
private class Hero {
	private int hp;
	String name;
	Sword sword;
	
	public void sleep() {
		this.hp = 100;
		System.out.println(this.name + "は、眠って回復した");
	}
}
```
※ほかのクラスからhpを直接変更することは不可能。
　しかしsleepメソッドはどのクラスからでも呼び出し可能なため、経由すればアクセスできる。

* public (すべてのクラスからアクセス可能)
* package privete（同じパッケージに属するクラスからの呼び出しが可能）
```java
public class Hero{
    void sleep(){...} 
    // 何も書いていなければpackage privateを指定したとみなされる。
    public void attack(){...} 
```
## ■getter・setter
* **getterメソッド** 
特定のフィールドを取り出すメソッド。これによりprivateに指定した値を呼び出せる。
```java
public class Hero {
	private int hp;
	private String name;
	Sword sword;
	
	public void attack() {...}
	public void sleep() {...}
	public String getName() { // ★追加
		return this.name;
	}
}
    /* 呼び出し */
public class King {
	void talk(Hero h) {
		System.out.println
			("王様:ようこそ我が国へ、勇者" + h.getName() + "よ。");
	}
}
```
* **setterメソッド**
特定のフィールドに値を代入するメソッド。ほかクラスから値を受け取れるようになる。
```java
	public void setName(String name) {
		this.name = name;
}
```
getterメソッド、setterメソッド。この２つを総称して<font color = red>**アクセサ**</font>と呼ぶ。

#### ◎アクセサを使用するメリット
例えばフィールド名を変えたくなった場合。privateに指定したフィールドは先述のとおりほかクラスからの書き換えは不可能である。単純なフィールド名をあちこちで使用して読み書きを行っていると、その部分すべてを新たなフィールド名に変更しなければならない。getterメソッド・setterメソッドを経由すれば、メソッド内のみ書き換えを行えばよく、ほかクラスに影響を及ぼすことなくフィールド名を変更できる。

#### アクセスを検査する
外部から設定されようとしている値の検査を行う。
妥当でない値の場合はエラーになるよう設定するのが定石。
```java
private String name;
public void setName(String name) {
	if (name == null) { 
		thow new IllegalArgument Exception
			("名前がnullです。処理を中断します");
	}
	if (name.length() <= 1) { 
		thow new IllegalArgument Exception
			("名前が短すぎます。処理を中断します");
	}
	if (name.length() >= 8) { 
		thow new IllegalArgument Exception
			("名前が長すぎます。処理を中断します");
	}	
	this.name = name;
}
```
- - -
[用語早見表]Amazon Web Services 基礎からネットワーク&サーバー構築

# はじめに
[Amazon Web Services基礎からのネットワーク＆サーバー構築改訂４版](https://bookplus.nikkei.com/atcl/catalog/23/04/06/00757/)を読むにあたって専門用語をわかりやすいようにまとめました。
構築手順に関してはこの記事では扱いませんので書籍をご覧ください。

# 用語解説
## VPC(Amazon Visual Private Cloud)
自分のネットワークを作ること。どのようなIPアドレス範囲を使うかを指定

### IPアドレス
インターネットと接続可能なネットワークではTCP/IPというプロトコル(ルール)を使用。
TCP/IPではそれぞれのサーバーにIPアドレスという番号を振る。
「10.0.1.10」といったピリオドで区切られた4つの数字。

TCP/IPに関しては[こちら](https://cloudapi.kddi-web.com/magazine/twilio-sip/what-is-tcp-ip#:~:text=TCP%2FIP%EF%BC%88Transmission%20Control%20Protocol,%E3%82%82%E5%88%A9%E7%94%A8%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)がわかりやすいと思います。

### CIDR
使用可能なIPアドレス範囲が「192.168.1.0 ~ 192.168.1.255」の表現をわかりやすくしたもの。
上記の場合はプレフィクスは24ビットになります(計算式は長くなるので割愛)。
そのため上記の使用可能なIPアドレスのCIDR表記は「192.168.1.0/24」となります。
IPアドレス範囲をCIDR表記する時、その範囲をCIDRブロックと呼びます

### サブネット
上記例の「192.168.1.0/24」は256個のIPアドレスの範囲になりますが、実際にこんな多く使うことはありません。CIDRを細分化することをサブネットと呼びます。分けるメリットとしては以下のようなことがあります。

- 物理的な遠隔
  - 社内LANを構築する時、1階と2階で別のサブネットを分けるなど。万が一どちらかに障害が発生してもリスクを減らすことができる
- セキュリティリスク
  - サブネットごとにネットワークとかの設定ができる。例えば経理部のネットワークに関しては他の部署が見れないようにするなど   

### インターネットゲートウェイ
サブネット(VPC)をインターネットに接続する。
自分のネットワークにインターネット回線を引き込むイメージ

### ルートテーブル
ネットワークにデータを流すため必要な設定。
VPCを設定すると自動で設定されるが、デフォルトだと設定したVPCの範囲外の宛先のパケットは全て破棄(無視)される。
つまり自身のネットワーク以外は全て破棄されるので外部からアクセスできないということになる

### バケット
データを細切れにした状態のこと。
TCP/IPというプロトコルではそのようにデータを送受信するように決まっている

### インスタンス
ここではAmazonEC2で作成した仮想サーバーのこと。以下解説記事
- [仮想サーバー](https://it-trend.jp/server-virtualization/article/beginners_course)
- [EC2](https://www.itechh.ne.jp/blog/column/ec2-explain.html#:~:text=Amazon%20EC2%E3%81%AF%E3%80%81Amazon%20Elastic,%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)

### AMI
Amazon Machine Imageの略。
インスタンスを起動する時に使用するファイル的な存在。

### ポート
他のコンピューターと、データを送受信するためのデータの出入り口。
これのおかげで1つのIPアドレスに対して複数のアプリケーションを同時に通信できる。

### ウェルノウンポート
Well Know Port(よく知られてるポート)で代表的なアプリケーションが使うポート番号。
クライアントが接続先のポート番号を省略した時には自動でそのポートが使われる。
SSHは22、HTTPは80など。

### エフェメラルポート
クライアント側で使われる一時的なランダムなポート番号。
サーバーと接続している時だけ使われ、切断されると開放(リセットされる)

### ドメイン名
wwww.example.co.jpといったIPアドレスに名前をつけること。
IPアドレスは覚えにくいので基本的にはドメイン名でアクセスする。

### DSN
Domain Name Systemの略。
あるドメイン名から対応するIPアドレスを探すこと(名前解決)
名前解決にはDNSサーバーを使うことが多い

### HTTP
通信プロトコルの1つ。[詳細](https://www.itmanage.co.jp/column/about-http-https/#:~:text=HTTP(Hypertext%20Transfer%20Protocol)%E3%81%A8,%E3%82%84%E3%82%8A%E5%8F%96%E3%82%8A%E3%81%8C%E8%A1%8C%E3%82%8F%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82)はこちらをご覧ください

### ICMP
通信プロトコルの1つ。
TCP/IPでネットワークの疎通ができているか確認するために使われる

### NAT
プライベート(インターネットと通信できない)サブネット→インターネット の向きの通信だけ許可すること。
解説は[この記事](https://wa3.i-3-i.info/word11978.html)がわかりやすいと思います。
Rails7 devise4.9.2 ユーザ新規登録時のメール送信でNet::ReadTimeoutエラー


This article shows how to resolve an error when devise's sign-up mail sending.

## 環境情報＆前提条件
* Ruby 3.2.1
* Rails 7.0.0
* テンプレートエンジンとしてslimを使用
* 開発環境でDocker使用
### gem
* devise 4.9.2

## 解決したい内容
* deviseを使用してユーザの新規登録を行いたい。
* 新規登録した際のメール送信後に以下エラーがブラウザ上で表示される。
```
Net::ReadTimeout (Net::ReadTimeout with #<Socket:(closed)>)
```

## 解決手順
* deviseで生成される`app/views/users/registrations/new.html.slim`内のformタグに`data: {turbo: false}`をつけることで解消
* ※画面遷移系で原因不明のエラーに悩まされる場合、turboを無効化することで解決するケースが多いです。

```slim:app/views/users/registrations/new.html.slim
# before
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|

# after
= form_for(resource, as: resource_name, url: registration_path(resource_name), data: { turbo: false }) do |f|
```

## 参考記事
* [Rails 7.0 + Ruby 3.1でゼロからアプリを作ってみたときにハマったところあれこれ Turboがいろいろと厄介](https://qiita.com/jnchito/items/5c41a7031404c313da1f#turbo%E3%81%8C%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E3%81%A8%E5%8E%84%E4%BB%8B:~:text=%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82-,Turbo%E3%81%8C%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E3%81%A8%E5%8E%84%E4%BB%8B,-Rails%207.0%E3%81%A7)
DatashareのmacOSへのインストール

macOSへの Datashareのインストールが上手くいかなかったので、上手くいくために行ったことです。

## 環境
macOS Sonoma 14.0

## やったこと

### Homebrew経由でのjavaのインストール

```
brew install java
brew link java --force
```

### Datashare.commandファイルの修正

以下のファイルへ修正をしました。
/Applications/Datashare.app/Contents/MacOS/Datashare.command

以下をコメントアウト。
```
# java_bin="$(/usr/libexec/java_home -F -v $jre_version)/bin/java"
```

`which java` でJavaの場所を調べて、以下を追記。

```
java_bin="/opt/homebrew/bin/java"
```

## 参考

https://github.com/ICIJ/datashare/issues/1139
量子情報科学入門 - memo #5

### 測定とは
1 qubit前提だけど、以下のページがすごくわかりやすくまとまってあった。POVMは単に$M^{\dagger}_i M_i$に名前をつけただけ

https://whyitsso.net/physics/quantum_mechanics/measurement_partial_trace.html
Next.js初学者向け勉強会を受けて

## はじめに
普段は主にLaravelを使ってwebアプリケーションの開発を行っています。
最近、Reactなどのフロント系の勉強を少しずつ始めており、先日は[Next.jsで加速するWebアプリケーション開発](https://forkwell.connpass.com/event/294852/)に参加しました。
その際に学んだことと、実際にNext.jsを少し触ってみたことについてアウトプットしたいと思います。

## Next.jsの特徴について
下記の3つの特徴について紹介します。
- ファイルベースルーティング
- ルートハンドラ
- サーバーサイドレンダリング

### ファイルベースルーティング
Next.jsアプリケーション内のページルーティングをシンプルかつ直感的に設定する方法です。ファイルベースルーティングにより、ページコンポーネントを特定のディレクトリに配置することで、自動的にルーティングが設定されます。

### ルートハンドラ
ルートハンドラはページやAPIエンドポイントのルーティングに関連する特定の機能を提供するための概念です。
Next.jsのバージョンが13.4以降からApp Routerが導入できるようになり、定義の仕方が以前と変わっています。
App Routerを利用した場合のルートハンドラは、Next.jsの`app/`ディレクトリ内で使用され、サーバーレス関数やAPIルートを作成するために利用されます。
App Routerを利用せず、Page Routerを利用する場合は、`pages`直下につくったファイルがすべてルーティングされます。

下記App Routerを利用したい場合の例です。

``` bash
my-nextjs-app/
├── app/
│   ├── api
|        ├──hello.ts
│ 
├── ...
```

``` ts
// app/api/hello.ts
export async function GET(req:Request) {
    return new Response('Hello!');
}
```

### サーバーサイドレンダリング
Next.jsは、サーバーサイドレンダリングと静的生成をサポートし、ページをサーバーサイドで事前にレンダリングすることができます。

#### サーバーサイドレンダリング（SSR）
Next.jsは、ページをサーバーサイドで動的にレンダリングすることができます。
これは、クライアントからのリクエストごとにページの内容をサーバーで生成し、HTMLとしてクライアントに返すことを意味します。

#### 静的生成（SSG）
Next.jsは、ページを事前に生成し、HTMLファイルとして配信する静的生成もサポートします。これにより、サーバーサイドの負荷を減らし、高速なパフォーマンスを実現できます。また、静的生成されたページはCDNにキャッシュされ、大規模なトラフィックでも高いスケーラビリティを提供します。


## Next.jsを試してみる
アプリの作成方法
``` 
$ npx create-next-app nextjs-sample
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias? … No / Yes
Creating a new Next.js app in /Documents/nextjs-sample.
```

GitHubのユーザーを表示する簡単なアプリを作成してみる。
`page.tsx`のファイルを下記に変更する。

``` ts
import { use } from "react";

type User = {
  id: number;
  login: string;
  avatar_url: string;
};

const fetchUsers: () => Promise<User[]> = async () => {
  const res = await fetch("https://api.github.com/users");
  return res.json();
};

export default function Page() {
  const users = use(fetchUsers());
  return (
    <div>
      <h1>GitHub Users</h1>
      <div>
        {users.map((user) => {
          return (
            <div key={user.id} className="ml-2 mb-2">
              User NAME：{user.login}
              <img src={user.avatar_url}></img>
            </div>
          );
        })}
      </div>
    </div>
  );
}
```

実行してみる
```
$ npm run dev
```

`http://localhost:3000`にアクセスし、Githubのユーザー一覧が表示されることを確認します。

## 感想
今回は、Next.jsの勉強会で学んだことと、実際に少し触ってみたことについて自分なりにまとめてみました。
普段はLaravelで開発をしているため、Next.jsのようなファイルベースのルーティングは新鮮な感じがしました。まだまだ知らないことや、理解が及んでいないことが多いので、少しずつ学びながらアウトプットできればと思います。