OmniAICreator/Qiita-1.07M huggingface dataset:
#プログラミング #Javascript #nodejs #chrome ビット演算・算術演算、領域管理の速度差

**本内容を利用した場合の一切の責任を私は負いません。**

いつもコーディングする時に、コンバイル言語の名残で、書き方で違いがでるか迷うので実験してみた。
実験結果から、ソースが違うだろうから、node.jsとChromeではやはり挙動に違いがありそう。
書き方は意識した方がいいのかも。
最適化もありそうな気がする。

# バージョン
- OS  
OS 名:                  Microsoft Windows 10 Home  
OS バージョン:          10.0.19045 N/A ビルド 19045
システムの種類:         x64-based PC
- node.js
node-v20.9.0-win-x64.zip
- Chrome
バージョン: 125.0.6422.114（Official Build） （64 ビット）

#ソース
```javascript:a.js
function aa() {
    let total;

    console.time("elap3");
    total = 0;

    for (let indexA = 0; indexA < 10; indexA++) {
        for (let index = 0; index < 1000 * 1000 * 1000; index++) {
            let c = index & 0xff;
            total += c & 1;
        }
    }

    console.timeEnd("elap3")
    console.log(total);

    console.time("elap4");
    total = 0;

    for (let indexA = 0; indexA < 10; indexA++) {
        for (let index = 0; index < 1000 * 1000 * 1000; index++) {
            let d = index % 0x100;
            total += d & 1;
        }
    }

    console.timeEnd("elap4")
    console.log(total);

    console.time("elap5");
    total = 0;

    for (let indexA = 0; indexA < 10; indexA++) {
        for (let index = 0; index < 1000 * 1000 * 1000; index++) {
            let d = index % 0xff;
            total += d & 1;
        }
    }

    console.timeEnd("elap5")
    console.log(total);

    console.time("elap1");
    total = 0;
    let a;

    for (let indexA = 0; indexA < 10; indexA++) {
        for (let index = 0; index < 1000 * 1000 * 1000; index++) {
            a = index;
            total += a & 1;
        }
    }

    console.timeEnd("elap1")
    console.log(total);

    console.time("elap2");
    total = 0;

    for (let indexA = 0; indexA < 10; indexA++) {
        for (let index = 0; index < 1000 * 1000 * 1000; index++) {
            let b = index;
            total += b & 1;
        }
    }

    console.timeEnd("elap2")
    console.log(total);
    return;
}

//ブラウザ時はコメントアウト
aa();

```

# 出力
```text:Chrome
a.js:14 elap3: 11638.322998046875 ms
a.js:15 5000000000
a.js:27 elap4: 12354.191162109375 ms
a.js:28 5000000000
a.js:40 elap5: 17977.928955078125 ms
a.js:41 4980392160
a.js:54 elap1: 12879.364013671875 ms
a.js:55 5000000000
a.js:67 elap2: 13187.98095703125 ms
a.js:68 5000000000
```

```text:node.js
elap3: 11549.76806640625 ms
elap3: 11.550s
5000000000
elap4: 11177.266845703125 ms
elap4: 11.177s
5000000000
elap5: 14984.0810546875 ms
elap5: 14.984s
4980392160
elap1: 11331.4638671875 ms
elap1: 11.332s
5000000000
elap2: 11503.802978515625 ms
elap2: 11.505s
5000000000
```
[Swift]Firebase Dynamic LinkからOneLinkへの移行:)

2025年8月にFirebase Dynamic Linksが廃止されます:(
移行先をOneLinkに決定し、実装まで行ったので、その過程をまとめておこうと思います！:)

# はじめに
* DynamicLink, カスタムURLスキーム, UniversalLink怪しい人へ

https://qiita.com/y-some/items/e0e0f5cb4d7d5559b09c#firebase-dynamic-links

* AASAファイル取得方法
AASAファイルは、AppsFlyerのOneLinkテンプレート作成時に自動的に作成してくれます！

https://qiita.com/toya108/items/73e4c683c78c9a4aa3d8#2apple-app-site-associationをサーバーに配置する

# やってみた
## 対応方法
1\. AppsFlyer側でサブドメイン登録
2\. iOSは以下を参考に実装

https://ja.dev.appsflyer.com/hc/docs/dl_ios_unified_deep_linking

パラメーター取得方法は、以下の8.9に載ってます！

https://ja.dev.appsflyer.com/hc/docs/dl_ios_unified_deep_linking#implementation

3\. ドメインの登録（Firebase同様に、applinks:を付与して登録）
4\. ビルド
5\. メモに記載したリンクをタップしてテスト

## 躓いた箇所
### ドメイン認識されない
一度アプリを削除してから、再インストールする必要があります。
→AASAファイルの読み込みが、初回起動時らしい

### デバッグ環境でテストできない
デバッグ環境がAppStoreに登録されていないアプリの場合、AppsFlyerのOneLink管理画面で、テストアプリを登録すると、リダイレクト先に、デバッグ環境が設定できます！

![スクリーンショット 2024-05-23 17.49.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640998/a8cf5a0a-aa47-a0c8-cf10-b063149cdb29.png)

https://support.appsflyer.com/hc/ja/articles/207032246-OneLinkテンプレート#add-redirection-logic-for-existing-app-users


### OneLink管理画面を更新したが、リダイレクトされない
反映に1時間ぐらいかかるらしいです！
リダイレクトされないから間違ってるかと思っても、時間が経つとリダイレクトするようになってたりするので注意です！🍔

> OneLinkテンプレートを保存または更新すると、AppsFlyerはあなたの設定したアプリドメインを検証するために、AASA および/またはDigital Asset Links JSONファイルを自動的に生成し、それをホストします。これは、あなたの設定したUniversal LinkとApp Linkが正しく機能するために重要です。
> 
> OneLinkテンプレートの更新が有効になるまでに最大 1 時間かかることがあります。

https://support.appsflyer.com/hc/ja/articles/207032246-OneLink%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88#add-redirection-logic-for-existing-app-users

### AASAファイルにアクセスできているか確認する
以下ターミナルで実行するとAASAファイルの中身とステータスもらえるので便利です！

> % curl -v https://{domain}/.well-known/apple-app-site-association

https://developer.apple.com/documentation/technotes/tn3155-debugging-universal-links#Host-and-verify-your-AASA

### ユニバーサルリンクが正常に動いているか確認する
https://developer.apple.com/documentation/technotes/tn3155-debugging-universal-links#Test-universal-links-behavior

### ユニバーサルリンクにリダイレクトすると、Safari経由になるらしい
> 別のアプリからユニバーサル リンクを開く場合、リダイレクトは許可されますが、推奨されません。ユーザーがタップしたリンクがユニバーサル リンクではなく、ユニバーサル リンクにリダイレクトされる場合、ユーザーは Safari 経由でアプリにルーティングされます。

https://developer.apple.com/documentation/technotes/tn3155-debugging-universal-links#Host-and-verify-your-AASA

ショートリンクを自作しようとしている方は、注意かもです！

### ディファードディープリンクのテスト
リンクタップしてAppStoreに飛ばされても、XcodeからアプリをインストールすればOKです！

https://ja.dev.appsflyer.com/hc/docs/dl_ios_unified_deep_linking#perform-the-test

# まとめ
互換性のため、Firebase側の実装もそのままにした上で、OneLinkの実装も行いましたが、どちらも正常に動いたので良かったです！🍎
この記事が少しでも皆様の負担を軽くできたら良いなと思っておりますー！🙇
フリーランス最大のメリットは「合理性」にある

フリーランスとして独立して2年半ほどが経ちました。
最近では知人から「フリーランスってどうなの？」と興味を持ってもらえることも増え、回答する中で自分にとってどういう点が良かったのかということを整理する機会がありました。
せっかくなのでここで共有したいと思います。

## 前提
フリーランスという働き方には実に様々な形態がありますが、この記事では私がこの2年半で経験した以下のような形態を前提とさせて頂きます。
* 週5日フルタイムの業務委託案件
* フリーランスエージェント経由で契約や報酬の支払いを行う

## 合理性
細かく言えばメリット（デメリットも）はいろいろあるのですが、フリーランスのメリットは「合理性」という言葉にまとめられると思いました。
フルタイムという働き方でありながら労使という関係ではなく、ビジネスという関係だからこそ様々な要素が合理的だと感じています。
この記事では、私が感じた以下のメリットについて解説したいと思います。
1. 基本的に実力主義で、学歴や職歴には左右されにくい
1. 期間ありの契約故に高い報酬が提示されやすい
1. 顧客やエージェントとの間でパワーバランスが保たれ、コンプライアンス違反が起きにくい

## 解説
### 実力主義について
私が最初に合理性を感じたのは、初めて案件を取るため商談に臨んだ時のことでした。

商談とは言いますが入社面接のようなものを想像して貰えばよく、先方から案件の詳細な説明や自分のスキルについての質問があったりします。
一般的な入社面接と違うのは志望動機や転職の面接における前の会社を辞めた理由、キャリアの中で力を入れてきたこと、などの質問がほとんど無いことです。

基本的には「どういうスキルを持っているのか」という実力の部分について問われ、私の場合学歴、社歴について質問されることもありませんでした。（私の利用していたエージェントでは提出する書類に学歴、社歴ともに記入する欄が無かった）

志望動機等「入社面接でよくある質問」が不要なものだとも、悪いものだとも思いません。ただやはりエンジニアの本質はスキルであり、そこにフォーカスして採否を決めることは合理的ですし、今後自分のスキルを伸ばすモチベーションにもなると感じています。

### 高い報酬について
業務委託契約は期間が決まっており、予め決まっているプロジェクト終了までの期間や、特に終了時期が決まってない場合3～6ヶ月程度の単位で更新を続けながら業務をすることになります。

世間一般では有期の仕事よりも無期の仕事の方が好まれる傾向にあると思いますが、フリーランスの場合これが必ずしもマイナスの要素にはなりません。
というのも、期間があるからこそフリーランスは高めの報酬が設定されやすいという事情があるからです。

近年、日本の終身雇用の弊害というものが言われるようになりました。
大きなデメリットに報酬が上げにくいということがあります。
労働者の解雇の規制が強い場合、人件費は固定費となってしまいます。経営側としては将来にわたって固定費が上がるリスクを考えると簡単に報酬を上げることは難しいです。
採用するタイミングにおいても、実力があると感じた人材に対して、万が一会社に合わなかったことを考えると最初から高い報酬を提示しづらくなります。

その点、フリーランスはある意味便利な人材です。
プロジェクトが終われば契約を終了すればよく、万が一会社に合わなければ早期に辞めてもらえばよいわけです。
これは採用する側のメリットである一方で、来て欲しい人にはとりあえず高い報酬を提示しやすいという、フリーランス側のメリットにもなります。

伝統的な終身雇用にももちろん良い点はありますが、私は欧米的なもっと流動性のある雇用に合理性を感じています。
そのような考えを持つ人にとって、フリーランスは良い選択肢だと思います。

### パワーバランスについて
私はフリーランスエージェントを利用しており、顧客との間に入って契約や報酬の支払い等を行ってもらっています。
エージェントは報酬の一部を手数料として徴収するため、エージェントを使わずに契約を行いたいという方もいるかもしれませんが、私は最初のうちはエージェントの利用をオススメします。

顧客、エージェント、私はあくまで対等な立場で、私はエージェントに所属しているわけではありません。
対等な立場であるというのが重要な点で、それぞれが互いにお客さんという関係になるため、コンプライアンス違反への抑止力が働くように思います。

エージェントの立場としては問題がある現場をフリーランスに紹介してしまっては、以降そのエージェントで仕事を探してもらえなくなるかもしれません。
逆に問題のあるフリーランスを顧客に紹介した場合も顧客からの信頼を失ってしまうため、業務のマッチングにはしっかり力を入れてくれます。
新卒や転職の就職エージェントが基本的に「入社させたら終わり」という関係性なのに対し、フリーランスのエージェントはその後も関係が継続するというのが大きな違いです。

顧客としては例えばパワハラなどの行為を行った場合、以降エージェントに人材を紹介してもらえなくなる可能性があるため、やはりコンプライアンス違反への抑止力が働きます。

当然私としても継続的に顧客と仕事をしたいですし、エージェントとも良好な関係を保ちたいので、業務や連絡事項は丁寧に行います。

本来労使の関係でも労働者と使用者の対等であるべきだと思いますが、実際には使用者側の立場が強い場合が多いと思います。
フリーランスの場合、ビジネスだからこそ互いに対等な関係が保ちやすいと考えています。（ただエージェントを挟まない直接契約だとそうもいかない場合もあると思います）

## 最後に
フルタイムの案件で仕事をしていると、なかなか独立したという実感がわかない時もあります。
日々の働き方が、サラリーマンと大きく変わらない場合もあるからです。
しかしながら、要所で「ビジネスとしてやっている」からこそ受けられる恩恵も多くあります。

一方でやはり安定性に欠ける点だったり、自営業ならではの事務作業（帳簿付けなど）の手間があったりと、メリットばかりではないのも事実です。

社員もフリーランスも、どちらが良いという話ではなく向き不向きを考えて選択するものだと思います。

フリーランスに興味のある方、キャリアについて悩んでいる方の参考に少しでもなれば幸いです。
Fly.io で cron を使って定期ジョブを実行する 🕰️

# はじめに

Fly.io 上で定期ジョブを実行する方法をお伝えします！
基本は以下ドキュメント通りで良いのだと思いますが、私はそのままの通りに設定しても動かず...😓
といった感じだったので、実際に動いた設定を共有します！

https://fly.io/docs/blueprints/supercronic/

# サンプル

実際に cron を実行できたサンプルコードです。

https://github.com/miyukikoga/fly-scheduler

# 詳細

## コンテナに Supercronic をインストール

Dockerfile に[こちら](https://github.com/miyukikoga/fly-scheduler/blob/ea38bad8b6fd119492dae619168cf9fcdae17293/fly.toml#L11-L27)の処理を追加します。

Supercronic とは...
Supercronic は、コンテナ内で実行するように設計された crontab 互換のジョブ ランナーとのことです！

https://github.com/aptible/supercronic

## web と cron プロセスを設定する

fly.toml を[こんな感じ](https://github.com/miyukikoga/fly-scheduler/blob/ea38bad8b6fd119492dae619168cf9fcdae17293/fly.toml#L11-L27)に修正します。
`[processes]` セクションに web と cron を設定します。
`[http_service]` セクションに `processes = ['web']` を追加します。
`[[vm]]` セクションに `processes = ['cron', 'web']` を追加します。


## デプロイとスケール

[こちら](https://fly.io/docs/blueprints/supercronic/#deploy-amp-scale-the-new-processes)に書いてある通り、デプロイ後、スケールします。

```
$ fly deploy
$ fly scale count cron=1 web=
```
※ web はこれまで通りのコンテナ数を記載してください

これで全ておしまい！ お疲れ様でした🍵

# 参考

https://fly.io/docs/blueprints/supercronic/

https://qiita.com/solt9029/items/bd6a9bae247f74f3e3a2
【requests】同期処理と非同期処理

テストで初投稿。個人用のメモです。
今後もすこしづつ増やしていきます。よろしくお願いします。



画像サイトやツイッターなどのように、ページ全体がリクエストできない（設計によっては、タイムアウトしてしまったり、永遠スクロールする）場合は、非同期処理。
非同期処理によって、ページを処理することで、強制的に必要な静的コンテンツを獲得することができる。



# 同期処理
 
from requests_html import HTMLSession
from bs4 import BeautifulSoup
 
GAZOU_KEYWORD="Python 便利"
GAZOU_KEYWORD2=GAZOU_KEYWORD.replace("　","%20").replace(" ","%20")
 
session = HTMLSession()
resp = session.get("http://img.jpg4.info/"+GAZOU_KEYWORD2+"/pic1.html")
resp = resp.html.url
resp

# 非同期処理
 
import time
from bs4 import BeautifulSoup
from requests_html import AsyncHTMLSession
 
# JUPYTER LABで非同期使用する際に必要
import nest_asyncio
nest_asyncio.apply()
 
GAZOU_KEYWORD="Python 便利"
GAZOU_KEYWORD2=GAZOU_KEYWORD.replace("　","%20").replace(" ","%20")
 
async def get_pyconjp_2017():
    r = await asession.get("http://img.jpg4.info/"+GAZOU_KEYWORD2+"/pic1.html")
    time.sleep (3)
    return r
 
asession = AsyncHTMLSession()
results = asession.run(get_pyconjp_2017)
result = results[0]
 
soup = BeautifulSoup(result.content, "html.parser")
 
MAIN_KIJI = soup.find("div",attrs={"id":"picmain"})#記事部分
MAIN_KIJI
生成AIの無料ツールや無料ツールの選び方を紹介

生成AIの無料ツールは、テキスト、画像、音声などのコンテンツを自動生成し、生活や仕事に革命をもたらします。無料ツールの使用時にはいくつかの重要な注意点があります。

![生成AIの無料ツールや無料ツールの選び方を紹介.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3544821/17f2da03-8816-fd60-df12-cfa64bdc647c.png)

<h2>生成AIツールの概要

生成AIツールは、AIを利用して様々なコンテンツを自動生成するツールです。これにより、日常生活やビジネスでの効率化や創造性の向上が期待できます。おすすめの無料ツール
以下の無料ツールは個人や小規模ビジネスに有益です。
1. ChatGPT: 対話AI
2. Gemini: 仮想通貨取引プラットフォーム
3. Copilot: プログラミング支援AI
4. FireFly: クリエイティブコンテンツAI
5. Dream Studio: 映像・音声生成
6. Suno AI: 音声合成AI
7. beatoven.ai: 音楽生成AI
8. AIVA: オーケストラ音楽生成AI
<h2>無料ツールの選び方

<h3>目的を明確にする

ツールの利用目的と必要な機能を具体的に考えましょう。

<h3>機能の比較

複数の無料ツールをリストアップし、必要な機能が揃っているかを比較します。
<h3>使いやすさ

直感的な操作が可能で、分かりやすいインターフェースかどうかを確認します。

<h3>サポートとコミュニティ

ユーザーコミュニティやオンラインフォーラムでのサポートが充実しているかをチェックします。
評判とレビュー
他のユーザーの評価やレビューを参考に、ツールの実際の使い勝手や信頼性を判断します。

<h2>無料ツールの注意点

無料の生成AIツールを利用する際の注意点を以下にまとめます。

<h3>注意点1: プライバシーとデータセキュリティ

データ収集の透明性: どのデータが収集され、どう使われるのか事前に確認。
データの利用目的: マーケティングや開発目的のデータ利用に同意しているか確認。
プライバシー保護: 個人情報を含むデータを入力しない、定期的なデータ削除などの対策を講じる。
<h3>注意点2: コンテンツの品質と信頼性

コンテンツの偏り: 学習データに基づくバイアスを確認し、複数視点からチェック。
情報の正確性: 特に医療や法律情報の正確性を確認。
人間の監督: 生成されたコンテンツを人間がレビューし、必要に応じて修正。

<h3>注意点3: 著作権と法的問題

生成コンテンツの権利: コンテンツの著作権がツール提供者に帰属する場合があるため、利用規約を確認。
法的責任: 作成したコンテンツが法律に違反していないか確認し、法律を遵守。
安全な使用方法: 公正使用や適切な引用を行い、法的リスクを回避。
生成AIの問題点については下記の記事もご参照ください。
➡ <a href="https://hblab.co.jp/blog/explaining-the-mechanism-problems-and-future-of-generative-ai/" rel="nofollow noopener" target="_blank">生成AIの仕組み・問題点・将来を解説 | HBLAB</a>
<h2>終わりに

「Gemini 1.5 Flash」と「GPT-4o」のような新技術はAIの発展を加速させ、問題解決やコミュニケーション能力を向上させます。これからもAI技術の進歩に注目しましょう。
詳しくは下記の記事もご参照ください。
<a href="https://hblab.co.jp/blog/introducing-free-generation-ai-tools-and-how-to-choose-free-tools/" rel="nofollow noopener" target="_blank">生成AIの無料ツールや無料ツールの選び方を紹介</a>
Vision Proに2台目macを接続する

Vision Proのセットアップが終わっていて2台目macを接続する場合を想定しています。1台目も流れは同じです。


:::message
前提
- 同じWifiに接続していること
:::

## 手順
### 1. (mac) Apple IDサインアウトする
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345535/1b505fd2-4eae-4ba0-03df-f1f1c3e8cd2d.png">

### 2. (mac) Vision Proと同じApple IDでログインする
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345535/3e721f8e-69de-08c2-9493-9a65da9cdce3.png">

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345535/e9e9bd9c-a9ba-211a-9699-ae072b756243.png">


### 3. Vivsion Pro越しにmacを見て「Connect」する
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345535/8bd66f15-09c9-6218-0e94-1cf06574864b.png">
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3345535/1aa8e200-4ccf-7f66-7e23-0d64e35cbde0.png">


## 参考
https://qiita.com/purple_jp/items/17995d1c5405fb0fcaec
RESTとは？　webの設計思想であるRESTを理解する


# Webのアーキテクチャスタイル
* Webの設計思想であるRESTについて

## アーキテクチャスタイルとは？
通称「アーキテクチャパターン」
具体的なアーキテクチャを考える際の指針、流儀、作法となるもの。
アーキテクチャスタイルをもとにアークテクチャを作る。

## RESTとは？
ネットワークシステムのアーキテクチャスタイルの１つ。
「クライアント/サーバ」というアーキテクチャスタイルの派生系になる。
「クライアント/サーバ」にいくつかの制約をつけることで「REST」になる。

RESTはWeb全体のアーキテクチャスタイルでもあり、個別のWebサービスやWebAPIのアーキテクチャスタイルでもある。
一人ひとりが作る個別のWebサービスやWebAPIでもRESTの約束を守ることが重要。
個別のWEbサービスが全体の調和を乱しては、全体が統一したスタイルを守れないため。

## RESTにおける重要な概念
RESTにおける重要な概念の１つに「リソース」がある。

**リソース** = Web上にある名前を持ったあらゆる情報(ブックマーク、天気予報、Webページなど）

**リソースの名前** = URIという一意な名前

URIでプログラムはリソースが表現する情報にアクセスすることができる。

**アドレス可能性** = URIが備えるリソースの場所を簡単い指し示すことができる性質のこと

アドレス可能な状態は、名前(URI)がついていて、適切な手段でアクセスできる状態のこと。
そうすることで、プログラムが作りやすくなる。

## 様々なリソース
**①複数のURIを持つリソース**
例えば天気予報のリソース
```
https://hoge.com/2021/01/01

https://hoge.com/today
```
もし今日が2021年1月1日だった場合
上記は同じものを指す

**②リソースの表現**
クライアントとサーバ間でやり取りするリソースのことを **リソースの表現** と呼ぶ
１つのリソースは複数の表現を持つことができる
同じ天気予報のリソースでも
HTML形式 PDF形式 画像　といった異なる表現を持たせることができる。
表現ごとにURIを作っても良いしHTTPプロトコルを使用すれば１つのURIで扱うことができる。

**③リソースの状態**
リソースは状態を持つことができる。
取得する時の状況により天気情報が晴れ、曇り、雨など変化する等。

## スタイルを組みわせてRESTを構成する
RESTは複数のアーキテクチャスタイルを組み合わせて構成した複合アーキテクチャスタイル。
「クライアント/サーバ」の他のスタイルを追加し、制約を課して「REST」を構成していく。

### クライアントサーバ
HTTPプロトコルでクライアントとサーバがやり取りするアーキテクチャスタイル
クライアントがリクエストを送り、サーバがレスポンスを返す。
**利点** ・・・　クライアントとサーバが分離して処理ができる。
**クライアント** = ユーザインターフェースを提供
TV、PC、携帯　など　マルチプラットフォームに対応できる

**サーバ** = データストレージの機能を提供
台数を増やして冗長化し可用性を高めやすい

### ステートレスサーバ
サーバ側でクライアント側の状態を持たないアーキテクチャスタイル
これによりサーバ側はレスポンスを返した後すぐにリソースの解放ができる。

現実では、ステートレスではないWebAPIも存在する。
Cookieを使用したセッション管理などがそれに当てはまる。
ただ、HTTPの間違った拡張であること、ステートレスの利点を捨てていることを理解した上で最小限に使用することを意識する。

### キャッシュ
情報の鮮度に基づいて一度取得したリソースをクライアント側で使い回すためのもの。
これによりクライアント/サーバ間の通信を減らし効率的に処理ができる。
古いキャッシュを使用することによる情報の信頼性の低下のリスクがある。

### 統一インタフェース
URIで指し示したリソースに対する操作を限定的な統一されたインターフェイスで行うようにするアーキテクチャスタイル。
HTTPがそれにあたる。
HTTPには8つのメソッドしかない。あえて柔軟にせず、制約を加えることで全体のアーキテクチャがシンプルになる。クライアント/サーバの実装の拡張性が増す。

### 階層化システム
システムをいくつかの階層に分離するアーキテクチャスタイルのこと
これは統一インターフェースにより実現することができる
サーバとクライアントの間にロードバランサを設置して負荷分散したり、プロキシを設置してアクセスを制限するなど同じインターフェースで接続できるためクライアント側は意識する必要がなくなるため。

### コードオンデマンド
サーバからプログラムコードをダウンロードし、クライアント側で実行するアーキテクチャスタイル
JavaScriptなどがこれにあたる。
後から拡張していくことができる利点がある。

### 上記6つのアーキテクチャスタイルを組みわせた「REST」
実際にアーキテクチャを作る際はこのRESTをもとに考える。
要件により6つのうちどれかを除外しても良い、全て除外となるなら「REST」以外のアーキテクチャスタイルを参考にすべき。
何よりも大切なのは動く価値あるサービスを作ること。

## RESTの２つの側面
### RESTとハイパーメディア
いくつかのリンクを経て１つのアプリケーションを実現
RESTでは「アプリケーション状態エンジンとしてのハイパーメディア」と呼ぶ。
アプリケーションの状態はリンクを辿ることで遷移する。
リソースをリンクで接続することで１つのアプリケーションを構成する考え方を「接続性」と呼ぶ。

### RESTと分散システム
RESTはリンクを辿ることでアプリケーションを構成する。
URIが示すリソースは、それだけで意味をなす粒度の大きいデータの塊。
リンクを辿って状態を遷移する方が性能の劣化を抑えることができる。
GPCはネットワーク越しに呼び出すには粒度が小さい。
ライブラリの関数などの単位になるため。
それに加えて仕様が変わると互換性を保つことが難しい。(戻り値や引数、データ型などが変わるため）
HTTPはメソッドも変わらないため同じように接続することができる。

### 参考書籍

https://gihyo.jp/book/2010/978-4-7741-4204-3
TableGenの自動生成ファイルは2回includeする必要がある

# TL; DR
- TableGenの自動生成ファイルは2か所でincludeが必要
- マクロ定義によって挿入される内容が切り替わる（クラス定義 or クラス名一覧）ため

# はじめに
MLIRで言語処理系を作っていたところ[^lang]、TableGenの自動生成ファイルを利用するために同じファイルを2回includeする必要が出てきました。

```cpp:lib/CodeGen/Dialect.cpp
// 同じファイルを2回インクルードしている！
#define GET_OP_CLASSES
#include "filskalang/CodeGen/Ops.cpp.inc"

void FilskalangDialect::initialize() {
  addOperations<
#define GET_OP_LIST
#include "filskalang/CodeGen/Ops.cpp.inc"
      >();
}
```

上記は公式チュートリアルの[toy言語](https://github.com/llvm/llvm-project/blob/main/mlir/examples/toy/Ch7/mlir/Dialect.cpp#L638)実装を参考にして作成したものです。
はじめはチュートリアルの誤植かと思い片方を消してみたら、コンパイルエラーが発生してしまいました。

そこで本記事では、なぜ2回includeが必要なのか調べてみました。

# 自動生成ファイルの内容

`Ops.cpp.inc` の中身は以下のような形式になっていました。

```cpp:include/filskalang/CodeGen/Ops.cpp.inc
#ifdef GET_OP_LIST
#undef GET_OP_LIST

mlir::filskalang::HltOp,
mlir::filskalang::PrtOp,
mlir::filskalang::SetOp,
mlir::filskalang::SubprogramOp
#endif  // GET_OP_LIST

#ifdef GET_OP_CLASSES
#undef GET_OP_CLASSES

namespace mlir {
namespace filskalang {

static ::mlir::LogicalResult __mlir_ods_local_attr_constraint_Ops0(
    ::mlir::Attribute attr, ::llvm::StringRef attrName, llvm::function_ref<::mlir::InFlightDiagnostic()> emitError) {
  if (attr && !((::llvm::isa<::mlir::StringAttr>(attr))))
    return emitError() << "attribute '" << attrName
        << "' failed to satisfy constraint: string attribute";
  return ::mlir::success();
}
// ...
} // namespace filskalang
} // namespace mlir
MLIR_DEFINE_EXPLICIT_TYPE_ID(mlir::filskalang::SubprogramOp)


#endif  // GET_OP_CLASSES
```

役割の詳細は本題ではないので割愛しますが、ファイル内はマクロ定義によって大きく2つの部分に分かれています。

# GET_OP_CLASSES

`GET_OP_CLASSES` が定義されている場合は、クラスや関数の定義のみ挿入されます。`include` で想像する一般的な使い方です。

```cpp:挿入されるコード
namespace mlir {
namespace filskalang {

static ::mlir::LogicalResult __mlir_ods_local_attr_constraint_Ops0( /*...*/) {
    // ...
}
// ...
} // namespace filskalang
} // namespace mlir
```

# GET_OP_CLASSES
一方、`GET_OP_CLASSES` が定義されている場合は、クラス一覧のみ挿入されます。

```cpp:挿入されるコード
mlir::filskalang::HltOp,
mlir::filskalang::PrtOp,
mlir::filskalang::SetOp,
mlir::filskalang::SubprogramOp
```

このクラス一覧は `addOperations` のテンプレート引数として使用されます。

```cpp:これが
void FilskalangDialect::initialize() {
  addOperations<
#define GET_OP_LIST
#include "filskalang/CodeGen/Ops.cpp.inc"
      >();
}
```

```cpp:こうなる
void FilskalangDialect::initialize() {
  addOperations<
    mlir::filskalang::HltOp,
    mlir::filskalang::PrtOp,
    mlir::filskalang::SetOp,
    mlir::filskalang::SubprogramOp
      >();
}
```

1つのファイルに異なる2通りの役割を持たせて、マクロによって用途を切り替えていたというわけです。

`addOperations` のテンプレート引数はDialectにクラスを登録するために使用されています。
想像ですが、この登録を手軽に行えるようにするため上記のような2回includeする設計を取っていると思われます。
https://mlir.llvm.org/doxygen/classmlir_1_1Dialect.html#a60d2c0fbecac1d2f2714b8387466cfaa

[^lang]: 「[ストレンジコード](https://www.shuwasystem.co.jp/book/9784798069746.html)」のFilska言語をMLIRへ移植しています。https://qiita.com/Syuparn/items/e8f4046c4a5b551db310
【iOS】UITestの自動テストにて、フォームの自動入力が急にできなくなる問題の修正

# 状況
テストコードを実行してシミュレーターが起動し、登録画面のフォームを自動で入力するような動作をするが、他の開発者の環境だと動作するのに自分の環境だと動作しなかった。
つまり、Storyboard上のテキストフィールドやボタンなどに設定しているidは間違っていない。
しかし、なぜか途中で入力が中断されテストが終了されてしまい、テストNGとなってしまう

# 調査
いろいろググったら、tapと入力の間にsleepを挟まないとうまくいかないと書いている記事や、XCUIApplication()を代入している変数はテストのたびに代入してと書いてる記事はあったが、ググった情報では解決に至らなかった。

このように書いてある記事を見かけ、やはり配置が問題に関わっているかもと思った。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/b770694d-eef5-bc7d-7fad-30e4b37b93c3.png)
でも他の人の環境で動いているから、UIの位置を変更するのはちょっとなぁ、、、という感じだった。


# 解決方法
シミュレーターでの自動入力の動作をよくみたら、入力のたびにキーボードが閉じられるが、途中からキーボードが閉じれていなくてそこから数秒後にシミュレーターが強制終了となってしまっていた。
シミュレーターの機種のサイズとかによって自動操作が意図しない感じになる？？でもUIのidを指定して入力とかタップしているわけだからプログラム的には関係ないはずだが、、、

でもまあとりあえずキーボードがちゃんと閉じれれば解決する？？と思ってテストコードにおけるキーボードの閉じ方を調べたら、
入力の最後に改行を入力したら良いのだと知った

そして、入力の最後に改行も入力するよう追加したら、、、、解決！！
オープンテクノロジーだからGitHubに草を生やそう

### オープンテクノロジーとは
技術を自分の中に閉じ込めず広く世の中に開放しようという考え方

### GitHubの草の生やし方

Xなどで時々つぶやかれるGitHubの「草」とは正式にはコントリビューション、行動履歴のことです。
GitHub上でコミットなど特定のアクションを行うとそれがカウントされ、カウントされたものが以下の画像のような図に緑色で表示されるため、草と呼ばれているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/b02857b1-6312-134d-1677-29851662b1e9.png)

この図はGitHubのプロフィールページで見ることができるのですが設定前は非表示です。そのためこの投稿では図の表示方法をご紹介します。

①GitHubに、自分のユーザー名と同じ名前のpublicリポジトリを作成する。

・私であればユーザー名は「civichakkermofumofu」なのでリポジトリは「civichakkermofumofu/civichakkermofumofu」になります。

②プロフィールアイコンをクリックし「Setting」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/0173e2da-ff02-0ff5-50f0-00b191ed7d6d.png)

③Setting内をしばらく下にスクロールするとある、
「Contributions&activity」の「Include~」にチェックを入れ、
「Update preferences」ボタンを押下する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/7dae341d-1afb-892d-1730-52a9ea9501c3.png)

この手順でコントリビューションが図示されました。
まだまだ草が少ないので頑張ろう。。
Ubuntu 22.04 でキーボード入力がもたつく件

Ubuntuを22.04にアップグレードしたところ、terminalのキーボード入力で反応がワンテンポ遅れる現象が発生。

いろいろ探したところ、[こちら](https://askubuntu.com/questions/1509058/input-delay-on-terminal-ubuntu-22-04-4)で議論されており、その中で下記のスクリプトが提案されていた。

```bash:fix
arch=$(dpkg --print-architecture) # one of amd64 arm64 armhf ppc64el riscv64 s390x

# Ubuntu 23.10
#version="45.0-3ubuntu3"
#package="13-0"

# Ubuntu 23.04
#version="44.3-0ubuntu1.1" # only amd64
#version="44.0-2ubuntu4" # other archs
#package="12-0"

# Ubuntu 22.04
version="42.0-3ubuntu2"
package="10-0"

wget -nc http://se.archive.ubuntu.com/ubuntu/pool/main/m/mutter/libmutter-${package}_${version}_$arch.deb
wget -nc http://se.archive.ubuntu.com/ubuntu/pool/main/m/mutter/mutter-common_${version}_all.deb
if [ "$package" != "10-0" ]; then
  wget -nc http://se.archive.ubuntu.com/ubuntu/pool/main/m/mutter/mutter-common-bin_${version}_$arch.deb
fi

sudo dpkg -i *mutter*.deb

echo libmutter-$package hold | sudo dpkg --set-selections
```

Ubuntuのバージョンのところを適宜コメントアウトし、実行すれば解決した。

（実行後、システム再起動を忘れないように）
Spring 掲示板機能で、投稿時に作成日を表示させる方法　備忘録#1

## Spring 掲示板機能で、投稿時に作成日を表示させる方法


### 実行しようとした昨日
今回以下のように``作成日を、投稿と同時に自動的に付けてくれる機能``を実装しようとしました。
無事作成できたので、備忘録として投稿しようと思います。

![スクリーンショット 2024-06-03 22.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3807467/5fd7fd26-6c18-eaeb-38fe-37b256f0a511.png)


### データベース設計

```schema.sql
-- テーブル削除
DROP TABLE IF EXISTS posts;

-- カテゴリーテーブル
CREATE TABLE  posts
(
   id SERIAL PRIMARY KEY,
   title TEXT,
   content TEXT,
   create_date DATE,
   comments TEXT
);
```

### Entity
::: note info
Enitityでは、作成日をcreateDateとして扱います。
:::

```Post.java
package com.example.demo.entity;

@Entity
@Table(name = "posts")
public class Post {
    

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String title;
    private String content;
    @Column(name = "create_date")
    private LocalDate createDate;
    private String comments;
    
    public Post() {
        
    }
    
    public Post(String comments) {
        this.comments = comments;
    }
    
    public Post(String title, String content) {
        this.title = title;
        this.content = content;
        //コンストラクタの引数には入れず、フィールドに入れることで、作成時に現在の日付を表示。
        this.createDate = LocalDate.now();
    }
    
    public Post(Integer id,String title, String content, String comments){
        this.id = id;
        this.comments = comments;
        this.title = title;
        this.content = content;
    }
    
    public Post(String title, String content, String comments){
        this.comments = comments;
        this.title = title;
        this.content = content;
    }
    //ゲッター、セッター省略
}

```



### HTML

:::note info
タイムタイムリーフで、フォーマットを指定することができる。
:::

```post.html
 <table border="1" class="table">
        <tr class="table-secondary">
          <th>タイトル</th>
          <th>内容</th>
          <th>作成日</th>
        </tr>
        <tr th:each="post:${posts}">
          <td><a th:href="@{/detail/{postId}/show(postId=${post.id})}" th:text="${post.title}"></a></td>
          <td><a th:href="@{/detail/{postId}/show(postId=${post.id})}" th:text="${post.content}"></a></td>

          //以下のように書くことで、フォーマットを指定する。
          //出力結果：「06/04」
           <td th:text="${#temporals.format(post.createDate, 'MM/dd')}"></td>
       </tr>
      </table>
```

以上のようにして、投稿作成時に、作成日を自動生成することができるようになる。

これ以外にも、フォーマットの書き方として、

| 1 | 2 |
|:-:|:-:|
|  ${#temporals.format(time, 'yyyy/MM/dd HH:mm :ss')} |日付を自由にフォーマット|
|  ${#temporals.year(date)}	 |  年を取得|
|  ${#temporals.month(date)}	 | 月を取得  |
| ${#temporals.day(date)}	  |   日を取得|
|  ${#temporals.dayOfWeekName(date)}	 | 曜日を取得  |
|  ${#temporals.hour(time)}	 | 時間を取得  |
|  ${#temporals.minute(time)}	 | 分を取得  |
| ${#temporals.second(time)}	  |  秒を取得 |

があるみたいです。


 ### 参考サイト

 https://kumagoro-95.hatenablog.com/entry/2021/02/22/181053
p5.jsでフラクタル図形描画してSVGで保存

# はじめに
初学者のメモです。
現在のsvgの最新バージョンは1.5.1。
p5.jsの最新バージョンは1.9.4だが、動かない。1.6.0まで下げる必要がある。

# 円の中に２つの円が、入れ子になるフラクタル図形

https://editor.p5js.org/hextomino/sketches/2kOSu9sdX

```html:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/p5.js"></script>
    <script src="https://unpkg.com/p5.js-svg@1.5.1"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.4/addons/p5.sound.min.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
    <meta charset="utf-8" />
  </head>
  <body>
    <main>
    </main>
    <script src="c_in_c.js"></script>
  </body>
</html>
```

```javascript:sketch.js
function setup() {
  createCanvas(800, 800, SVG);
  noStroke();
  func(400, 400, 800, 9);
  save("c_in_c.svg");
}

function func(x, y, r, n) {
  if (0<n) {
    fill(n%2*255);
    circle(x, y, r);
    func(x-r/4, y, r/2, n-1);
    func(x+r/4, y, r/2, n-1);
  }
}
```

```css:style.css
html, body {
  margin: 0;
  padding: 0;
}
canvas {
  display: block;
}
```
# コッホ曲線

https://editor.p5js.org/hextomino/sketches/AZcWQMJAN

```javascript:koch.js
function setup() {
  createCanvas(900, 900, SVG);
  stroke(0);
  noFill();
  translate(0,400);
  func(5);
  save("koch.svg");
}

function gene(){
  line(0,0,300,0);
  line(300,0,450,-260);
  line(450,-260,600,0);
  line(600,0,900,0);
}

function func(n) {
  if (0<n) {
    push();
      translate(0,0);
      scale(1/3);
      func(n-1);
    pop();
    push();
      translate(300,0);
      rotate(-PI/3);
      scale(1/3);
      func(n-1);
    pop();
    push();
      translate(450,-260);
      rotate(PI/3);
      scale(1/3);
      func(n-1);
    pop();
    push();
      translate(600,0);
      scale(1/3);
      func(n-1);
    pop();
  }else{
    gene();
  }
}
```
Angular はじめました。

プログラムを勉強するのに何から始めたらいいのかわからないのですが
とりあえず、『あ』から始まるAngular（アンギュラー）と言うことで
挑戦してみることにしました。

周りにはあまりプログラムに興味を持っている人はおらず
自力でなんとか形になるところまで頑張っていこうと思っています。

もしかしたら諦めてしまうかも知れませんが
自分が頑張ったことは記録に残して、前に進んでいこうと思っています。

ということで、ここから頑張った記録になります。

#### １．環境の準備をします。
:::note info
私のパソコンでは、すでにインストールされていましたので、環境の確認のみ行います。インストール手順については割愛します。
:::
##### １－１．コマンドプロンプトを開きます。

（アウトプット）
![1-1-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/69dd108b-9fb6-e184-2ebc-82039a319523.png)

##### １－２．node.js のバージョンを確認します。
・コマンドプロンプトで以下のコマンドを実行します。
`node --version`

（アウトプット）
![1-2-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/fb607762-5394-6214-e789-cc7f8c0e45aa.png)

##### １－３．Angular のバージョンを確認します。
・コマンドプロンプトで以下のコマンドを実行します。
`ng version`

（アウトプット）
![1-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/94e5d7e8-34ed-0769-481a-f46b00314c2a.png)

一旦、この環境でいろいろ試してみます。

#### ２．Angular アプリケーションを作成します。

##### ２－１．ワークスペース用のディレクトリを作成します。
・コマンドプロンプトで以下のコマンドを実行します。
`mkdir Angular`

（アウトプット）
![2-1-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/a8b8cfd4-47ca-b05b-fd2e-5796152b651d.png)

##### ２－２．ワークスペース用のディレクトリに移動します。
・コマンドプロンプトで以下のコマンドを実行します。
`cd Angular`

（アウトプット）
![2-2-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/60773d5b-6d1a-3657-eb71-6f6831396384.png)

##### ２－３．Angular アプリケーションを作成するコマンドを実行します。
・コマンドプロンプトで以下のコマンドを実行します。
`ng new my-work`

:::note info
コマンドを実行したディレクトリに Angular アプリケーションが作成されます。
:::
（アウトプット）
![2-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/40cac151-a864-5dd6-58f9-a033ac37a401.png)

入力待ちとなりました。

##### ２－２．カーソルで CSS を選択し、[ENTER] ボタンを押下します。

（アウトプット）
![2-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/2a9dd194-e055-9488-37b5-cfee4e198875.png)

入力待ちとなりました。

##### ２－３．キーボードで、[y] ボタンを押下します。

（アウトプット）
![2-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/ed8a053b-6008-95ae-576a-8a577b3709c0.png)

しばらく我慢します。

（アウトプット）
![2-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/eea727ed-5453-26d3-c350-936dd5bb606d.png)

無事に正常終了しました。

#### ３．Angular アプリケーションを起動します。

##### ３－１．Angular アプリケーションのディレクトリに移動します。
・コマンドプロンプトで以下のコマンドを実行します。
`cd my-work`

（アウトプット）
![3-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/2f06264b-4959-af2e-5e73-795cb0dfdb52.png)

##### ３－２．Angular アプリケーションを起動するコマンドを実行します。
・コマンドプロンプトで以下のコマンドを実行します。
`ng serve`

（アウトプット）
![3-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/f234f338-4b69-9c06-ed4e-a5d1667c6ba7.png)

入力待ちとなりました。

##### ３－３．キーボードで、[y] ボタンを押下しました。

（アウトプット）
![3-3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/fe5f5063-3c05-0340-834e-646c58da5f39.png)

無事に起動できました。

##### ３－４．ブラウザで、Angular アプリケーションにアクセスします。
・以下のURLにアクセスします。
`http://localhost:4200/`

（アウトプット）
![3-4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798951/91430e4d-65eb-8a7f-f53f-f4dcb8779ede.png)

無事に動作しました。

上手くいったところで、今日はここまで。
Next.jsでTailwindcssのcolorが反映されない

## 問題

色を動的に変えたいcomponentがあって、tailwind.config.tsにcolorを設定していても真っ白になってしまうことがあった。

```typescript
'use client';

import React from 'react';

import { ColorType } from '@/define/color';

type Props = {
  type: 'submit' | 'button';
  color: ColorType;
  name: string;
};

export const Button = (props: Props): React.JSX.Element => {
  const color = `border-${props.color}-500 bg-${props.color}-500 hover:border-${props.color}-700 hover:bg-${props.color}-700 focus:ring-${props.color}-200 disabled:border-${props.color}-300 disabled:bg-${props.color}-300`;

  return (
    <div className="flex flex-wrap justify-center gap-5">
      <button
        type={props.type}
        className={`${color} rounded-lg border px-5 py-2.5 text-center text-sm font-medium text-white shadow-sm transition-all focus:ring disabled:cursor-not-allowed`}
      >
        {props.name}
      </button>
    </div>
  );
};
```

## 解決方法
tailwind.config.tsにsafelistを追加することで色が反映されるようになった。

```typescript:tailwind.config.ts
import colors from 'tailwindcss/colors';
import defaultTheme from 'tailwindcss/defaultTheme';

import type { Config } from 'tailwindcss';

const config: Config = {
  content: [
    './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
    './src/components/**/*.{js,ts,jsx,tsx,mdx}',
    './src/app/**/*.{js,ts,jsx,tsx,mdx}',
  ],
  safelist: [{ pattern: /^border-/ }, { pattern: /^bg-/ }, { pattern: /^text-/ }],
  theme: {
    extend: {
      // Set font family
      fontFamily: {
        sans: ['Inter', ...defaultTheme.fontFamily.sans],
      },
      // Set theme colors (Required config!)
      colors: {
        primary: colors.blue,
        secondary: colors.slate,
        green: colors.green,
        red: colors.red,
        blue: colors.blue,
        gray: colors.gray,
      },
    },
  },
  plugins: [require('@tailwindcss/typography'), require('@tailwindcss/forms')],
};
export default config;
```

## 原因

tailwindは未使用のcss classをpurgeするので色が未使用判定となり、cssクラスが定義されていない状態となってしまった。

## 備考

この記事の設定だと雑かもしれないので、本番に使う場合、もう少し精査した方がいいかもしれない。
SoftEther VPN Serverでビルドしたりバイナリエディタで編集せずに証明書認証等を利用する方法

:::note alert
本記事は技術的制限の回避を推奨するわけではありません。
発生したいかなる損害も責任を負いません。
ご自身の責任の元、技術的知見としてご活用ください。
:::

:::note warn
OpenWrtのSoftEther VPN Serverにて動作を確認しており、Windows版ではリージョンが戻される(JPになる)ことを確認されています。
その他のOSで確認はしておりませんのでご了承ください。
:::


# 手順
## 1. SoftEther VPN Serverに接続する
SoftEther VPN サーバー管理マネージャを使用して対象のSoftEther VPN Serverに接続してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/364bf352-7d1c-08d7-c783-a8dbeaee051a.png)

## 2. Configを取得する
`サーバー情報の参照及び設定(N)`より`Config 編集(K)`をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/79bec20b-c9ac-6219-af21-69804cfb2377.png)
`Config ファイルの編集`ウィンドウが表示されたら`ファイルに保存(S)`をクリックし、保存場所を指定してコンフィグを保存してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/79c041c8-bab5-4864-08c8-3ea273bda025.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/ad19da45-21ae-ff1e-f5f1-80cc64be39fb.png)

## 3. Configを編集する
保存したコンフィグファイルをメモ帳などのエディタで開き、下記の通りに編集してください。
- 14行目 `string Region JP` →`string Region $`
> JPとCN以外なら何でも良いです。でもUSにすると`$`にされたので`$`にしてます。

## 4. Configを書き込む
`Config ファイルの編集`ウィンドウに戻り、`ファイルからインポートして書き込み(I)`をクリックして編集したコンフィグファイルを指定して書き込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/1e2ee320-5ce3-f0d9-ef9e-c7583e92f4b9.png)
`はい(Y)`を押して続行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/a61deea2-9437-59db-6311-1e7c93882e40.png)
書き換えが完了したら`OK`を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/ad541bd1-2d4a-0007-88b1-0cc69f982cec.png)

## 5. おわり
以上で機能の有効化が完了しました。
仮想HUBにユーザーを追加し、証明書認証などが使えるかをご確認ください。

:::note alert
本記事は技術的制限の回避を推奨するわけではありません。
発生したいかなる損害も責任を負いません。
ご自身の責任の元、技術的知見としてご活用ください。
:::
pictureタグ入門

最近担当したLPで、画像が大きすぎて重くスマホの実機プレビューができない！
という問題が発生しました。

その経験をもとに、webpを利用する際にどのような実装をするのが適しているのか、
調べつつ覚書として記しておきます。


# pictureタグとは

私としては、
・画像を全部webpにしたいけど一応対応していないブラウザもあるしwebpと従来の画像を振り分けねば
・iPhoneなどの高画質スマホで画像の大きさ振り分けできる
の両者を叶えてくれる素敵なタグだと思っております。

基本的な構成が下記。

```html
<picture>
    <source
        srcset="img.webp 1x,img@2x.webp 2x,img@3x.webp 3x /"
        type="image/webp"
    />
    <img
        class="hoge"
        src="img@3x.png"
        alt="hogehoge"
    />
</picture>
```

### pictureタグ
何も意味を持たないという認識をしています。挟むだけのやつ。
### sourceタグ
こちらのタグには新しい拡張子のwebpやavirを格納します。
基本的には３サイズ用意するのが良さそう。
- srcset属性
    - 画像へのパスと、半角スペースを開けて表示サイズの何倍であるかを記載する。(呪文) 1x,2x,3x
- type属性
    - srcsetに記載した画像の拡張子を記載する。


### imgタグ
従来のjpgやpngのソースを記載し、webpやavirに対応していないブラウザを救う役割をしています。
classはこちらに記載し、スタイリングしていきます。
元あるimgタグを単純にpictureタグに置き換えていくと、スタイリングが崩れてしまったのでそこは注意していきたいですね。


~~もはやほとんどのブラウザが最新verにてwebpに対応している中、あまり気にするところではなくなってきたかもしれませんが、やはり掬い上げなければいけないインターネットリテラシーの低めな層。。~~
~~できればIE(R.I.P)さんのことは忘れたい~~

# 番外編　- cssのbackground-imageにもwebpを使いたい！
結論としては、このように@supportsを利用すればOKです！🙆
```css
@supports (background-image: url('image.webp')) {
  .background {
    background-image: url('image.webp');
  }
}
```

webpに加えてavif拡張子も出てきているというところですが、現状弊社のwebデザインチームではwebpに対応するところから始めていきたいと思っています！

また、pictureタグではメディアクエリを使わずにウィンドウサイズでの画像の切り替えも叶います。
そちらでの実装はまだチャレンジしてませんので、いずれ実装することになったらまた追記します。
初めてのアプリ制作挑戦から完成まで

# 目次
- [準備](#準備)
- [環境設定](#環境設定)
- [企画](#企画)
- [コード作成](#コード作成)
- [次回](#次回)

こちらが初めて作った完成品です。
感想やダメ出したくさんいただけると嬉しいです。
https://play.google.com/store/apps/details?id=com.test2.kibun_navi&hl=ja

## 準備
まずは開発するための言語から考える必要があったが、知っている言語はPythonとC言語だけだった。そのため、この２つを使って開発するつもりだったが、どうやらFlutterという言語を使えば、Android用アプリとiOS用アプリをほとんど同時に作成できるということを聞いた。
基本的には違うOSでリリースするとなると、ほとんの場合は言語ごと帰る必要がある。しかしFlutterではその必要がないという。詳しくは、以下の記事を参考。

https://hnavi.co.jp/knowledge/blog/flutter-description/


__iOSでリリースする場合は年間費(約10000円)を払う必要があるが、Androidの場合は一度登録(約3300円)するといつでもリリースできる。__ 最初は初期費用もそこまでかけたくなかったのでAndoroidだけでのリリースを考えていたが、将来iOSでもリリースする可能性を考えると、Flutterでつくっておくに越したことはないと思ったのでとりあえず、Flutterで作ることを目標にした。


## 環境設定
とりあえず何か動かせないとイライラしてしまうので、VScodeでFlutterを動かせるように設定。サンプルプログラムを起動してみた。以下のサイト通りにやれば動かせた。このサイト通り、Android StudioとXcodeもインストール（XcodeはiOSでリリーする場合のみ必要）

https://zenn.dev/lisras/articles/9f4fe12f920e59

問題なく起動完了。

## 企画
いよいよアプリ作成を始めるが企画はある程度考えていた。
当時、自分がメンタル不調であったのもあり、そのような人に手助けできるようなアプリがいいと思っていた。
私の場合は典型的なスマホ依存症であったので、スマホを触ったときにほかのことをしたくなるようなアプリを作りたかった。
そこで思いついたのが　__きぶんナビ__　だ。

ざっくりと自分で理解するための企画書をまずは作った。このときは、うつアプリと名付けている。
![スクリーンショット 2024-06-02 20.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804252/87bec449-7cb3-e1ff-971a-41b85e05bc8d.png)

ざっくりとした内容は以下だ。
- 元気度合いを入力
- インドアかアウトドアかを入力
- それに応じた提案（散歩をする等）を表示する

このような企画書を作成するのは初めてで、言わずもがなダメな企画書といえるのかもしれないが、作らないと進まないのでとりあえず書いてみた。

次にアプリ画面の企画書を書いてみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804252/dca0b453-d3c3-e051-4036-015a7667f57b.png)

これも単純だ。
バナー広告とタイトルの位置を考えて、元気度合いをスライドで決めようと考えたぐらい…

そして…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804252/e544262d-d765-93ee-65f3-babc5969ed42.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804252/9a9539b9-55e2-749d-ef58-5fdd1d808ceb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804252/b735c967-733a-ac98-5a7c-7b43fd0c9281.png)


こんな感じで作ってみた。
とりあえず、こんな感じでいこうと決めてみた。

## コード作成
ここからが本番だ。
まずは、仮でコードの作成をしようと思ったが、全くわからないのでほとんど知り合いに聞きながら行った。

Visual Studioをいじることもほぼ初めてだったので、とりあえず聞きまくりながら作業をした。また、困った時は __ChatGPT__ にきいた。

https://chatgpt.com/


__Flutterでボタンを押した時に次の画面に遷移するためのコードを方法を教えて__
などというとバンバン書いてくれる。
完璧ではないが、自分で考えるより圧倒的に速い。
しかし、ややこしい内容を入力する場合は入力内容によっては返答が大きく変わってくるので、その辺は工夫が必要。

たとえば、以下のように入力するなど…

__Flutterでアプリを作りたいので以下の内容を実現するコードを教えて
-　起動後の最初の画面は中央上部に”きぶんナビ”という文字、中央下部に”診断する”というボタンを配置
-　”診断する”ボタンを押すと、新しい画面に遷移__

上記のように段階に分けて入力すると正確なものを返してくれる印象がある。

だいたいの画面が完成するまでおおよそ __5時間__ はかかったと思う。なにせ全くの初心者なのでVScodeの使い方からなんやらいろいろ調べていたので…


## 次回
今回はここまでで、次回はできた画面とデザイン、音楽に関して苦戦したとこをまとめようと思う。
プリンターセッションをシュッと設定し、スプールファイルをPDF化する

# 前置き:raised_hand:
- プリンターセッションなんて当たり前にいつも作っているよ、という方も多いと思いますが、久しく作っていないと忘れてしまうこともありますよね
- ということで、備忘のために記事作成いたします
- 今回は複合機から印刷ではなく、PDF化の設定をしたいと思います

# 環境前提
## PC
- Windows：11
- ACS：1.1.9.5
    - ACSの最新バージョンインストール方法は@koga39chan さんの[こちらの記事](https://qiita.com/koga39chan/items/40a61868dba59f72a5dd)をご参照ください

## IBM i
- IBM i : 7.5
    - 今回はversions差については、あまり関係なし

# プリンターセッションを作る
- ACSを起動し、セッション管理機能をオープンする
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/247ccad5-7a7c-2036-17b5-dc3c560730cb.png)
- 新規プリンター・セッションを押下
    - ![スクリーンショット 2024-06-04 165304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/be94511b-a072-9b11-a57b-05b18bf23f88.png)
## 接続タブ
- 宛先アドレスにIP、ワークステーションIDにプリンターセッション名を入力する
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/25b061bd-0beb-4c02-0899-6bb8ad6cf96a.png)
## プリンター設定タブ
 - 印刷先：Windowsプリンター
 - Windowsプリンターの選択：その他
 - Windowsプリンター名：今回はMicrosoft Print to PDFを設定
     - PrimoPDF、CubePDFなどのフリーソフトの指定も可能
     - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/46a91a04-dc37-13e3-c1fe-b7b454764b28.png)

## ページ設定タブ
- Java印刷サービスの使用を「はい」にする
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/678818ad-6aef-2377-b140-60f89e83a749.png)

- すべての設定終了後、OKを押下してプリンターセッションを起動すると以下のように、1つセッションが表示される
    - ![スクリーンショット 2024-06-04 172213.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/2f8634ca-f546-b18b-bd88-f6a10f56538a.png)
    - プリンターセッションの保存はお忘れなく…！

# プリントテストをしましょう！
- プリンターセッションを作成したIBM i の区画にディスプレイセッションを立ち上げてアクセス
- 接続タブで設定下ワークステーションIDの名前で、OUTQが作成されていること確認する
    - `WRKOUTQ PRTKOI`
- QPRINT等にたまっている適当なスプールファイルをCHGSPLFAコマンドで、OUTQ:PRTKOIへ移動させた状態
- STSに応じて印刷実行指示をする（MSGWになっていればOPT'7'を実行）
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/674f9c37-a0f6-b4fa-f5d2-b6b98a56d8ca.png)
- Microsoft Print to PDFの場合は以下が開くので、PDFの名前を付けて保存
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/9011e8bc-d028-3145-e92f-7b8d4f8496b0.png)

# おわりに
- Java印刷サービスの使用設定をしそびれて、何度も「PDF化できない！:tired_face:」を繰り返す人生だったので、記事化いたしました
資料作成時の注意点について

初投稿のアラフォーのおじさんです。
以前の現場から外れると同時に都落ちになり、
新しい環境で何とか這い上がれる道が無いか模索しております…。


先日、仕事で怒られてしまったので、
備忘として残しておこうと思います。
口頭での指示で動くと大変な状況になる場合があるので、
確認はしっかり行うようにしたいと思います。


実例として、
お客様との打ち合わせの後、上司から口頭指示で
打合せ時の資料を一部修正して、先方に送付するよう資料を準備するよう話があり、
準備を進めていました。
しかし、翌日に準備資料の最終確認したところ、
打合せ資料以外に表紙等の資料が必要となる事、
また紙での印刷物も必要になる事を指摘され、
直前で上司を巻き込んでの準備となってしまった、という顛末になります。

口頭での指示では、言った言わない、聞いた聞いてないで齟齬が発生してしまいますし、
それ以前に両者の作成物イメージが一致していない場合があります。
（特に経験が少ない業務では尚更…）

その為、作成物について事前に確認・共有して、
イメージが合っているか認識を合わせる事が必要になると思います。

空中戦での水掛け論では立場が下だと勝ち目がないので、
そのような状況にならないよう注意が必要だとも実感しました…。

（特に今回は、会社毎(担当毎)のお作法に慣れるまでは、
　細かく確認した方が良いという事を実感しました…）

~~ただ、上司からのダブルバインドで、~~
~~「自分主導で資料作成しろ」「チェックに時間をかけさせるな」~~
~~とも言われているので、こちらの解決法は悩み中…。~~


※備考
空中戦　＝　口頭での意見交換、指示。
水掛け論　＝　両者が主張するだけで進まない議論。
PostgreSQL: SQL のサンプル （コラムの検索）

スキーマが　sch001 で、id00100001 というコラムを持つテーブルを探す

## 接続

```text
$ psql -Uscott db_common
psql (16.3 (Ubuntu 16.3-0ubuntu0.24.04.1), server 14.8 (Ubuntu 14.8-0ubuntu0.22.10.1))
Type "help" for help.

db_common=#
```

## スキーマの切り替え

```text
db_common=# set search_path=sch001;
SET
```

## スキーマの確認

```text
# select current_schema();
 current_schema 
----------------
 sch001
(1 row)
```

## 特定のコラムを持つテーブルの検索

```text
SELECT table_name FROM information_schema.columns WHERE column_name = 'id00100001';
```

実行結果

```text
db_common=# SELECT table_name FROM information_schema.columns WHERE column_name = 'id00100001';
 table_name 
------------
 grp001001
 ren001o005
 ren001o006
 ren001o015
 ren001o018
(5 rows)
```

## テーブル定義の確認

```text
\d grp001001
```
Javaで「while文を使った繰り返し処理」の動作を確認してみた

# 概要

Javaで「while文を使った繰り返し処理」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/for/index6.html

# 実装

以下のファイルを作成しました。
```JSample6_1.java
class JSample6_1{
  public static void main(String[] args){
    int num = 1;

    while (num < 100){
      System.out.println("num = " + num);
      num *= 2;
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample6_1.java 
$ java JSample6_1 
num = 1
num = 2
num = 4
num = 8
num = 16
num = 32
num = 64
```

# まとめ

何かの役に立てばと。
タイピングゲームのローマ字のテスト方法のちょっとした話


## ちょっとした話

タイピングゲームを作ったとして、ローマ字の変換が正しく行われているかどうかをテストしたいとする。

愚直にバグりそうなパターンを考えまくって単体テストする方法もあるだろうが、文字の組み合わせ、ローマ字入力の組み合わせは果てしなく多く、これは発狂不可避なのである。

という訳で、ランダムな文字列を作って、それを永遠に人力でテストしてみるのはどうだろうか？

終わり。

## ランダムな人力テスト

https://mogamoga1024.github.io/typing-jp/test/monkey_test.html

## 愚直な単体テストの例

https://github.com/mogamoga1024/typing-jp/blob/main/test/test1.js
MAP型のカラムを持つGlueテーブルに対して、Athenaでインサートしようとしたら詰まった話

# はじめに
最近、Athenaを使った集計基盤の構築を担当しています。
その集計処理の中で、MAP型を使う際にハマったので記録として残しておきます。

# MAP型とは
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/data-types.html)より、
>キーを使用して値を検索できるマップです。すべてのキーに同じ値が必要であり、すべての値に同じ値が必要です。

とのことです。
具体的には `{ hoge=1, huga=2 }` みたいな形式です。

# はまった事象
`INSERT INTO...SELECT` 構文を使用し、glueテーブル1のデータを基に集計処理を行い、glueテーブル２にinsertするという処理を実装していました。
glueテーブル2にはmap型のカラムが存在しています。具体的には以下のような感じです。

![スクリーンショット 2024-06-04 17.14.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1783922/2bf50239-2369-7f45-80b6-2d2787557e08.png)

MAP型のカラムに対しては `map_agg` と言う関数を用いて作成された値を入れようとしていました。
そして、`INSERT INTO...SELECT`しようとしたら、以下のようなエラーになりました。
```
HIVE_INVALID_METADATA: Glue table 'xxx' column 'test' has invalid data type: map<string, float>
```

# 解決策
結論から言うと、`map<string, float>` を `map<string,float>` に変更したらいけました。
`,` の後に半角スペースがあるのはダメみたいです。

厄介なのは、以下の二点です。
* マネジメントコンソールでglueのテーブル定義を見ると、`,` の後に半角スペースがあろうがなかろうがちゃんとMAP型として解釈されていること
    * しかも、普通に見るだけではどちらも同じ型のように見えること
    * そして、なぜか半角スペースがあるかないかで挙動が変わること
* 2024/06/04現在、この記事の「MAP型とは」のセクションであげた[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/data-types.html) には `MAP<key_type, value_type>` のように半角スペースが含まれていること


僕がこれに気づけた理由は、試しに`CREATE TABLE AS SELECT(通称CTAS)` して自動で作られたテーブル定義を見たら`map<string,float>`　となっていたので、念の為半角スペースを消してみたからです。
正直スルーしてもおかしくなかったし、解決したのは奇跡です。

# 最後に
どなたかの助けになれば幸いです。

...誰がわかるねんこれ。
[Windows][Linux] Aliasの設定方法。

## 参考
## 予備知識

## 結論

### Windows
```powershell
# パスを確認
$PROFILE
# 存在しない場合
New-Item -Path $PROFILE -ItemType File -Force
# 存在する場合
notepad $PROFILE
# プロファイルファイルに単一単語の実行コマンドのエイリアスを追加
Set-Alias エイリアス名 '実行したいコマンド'
# プロファイルファイルに複数単語の実行コマンドのエイリアス（関数）を追加
function 関数名 {
    実行したいコマンド $args
}
# ターミナルで変更を反映
. $PROFILE
# エイリアスを確認
Get-Command エイリアス名
# エイリアスを使用
エイリアス名
```

### Linux
```sh
# ホームディレクトリへ移動
cd ~
# vim で、.bashrc ファイルを開く
vi .bashrc
# エイリアスを追加
alias エイリアス名='実行したいコマンド'
# ターミナルで変更を反映
source ~/.bashrc
# エイリアスを確認
alias エイリアス名
# エイリアスを使用
エイリアス名
```

## Windows

### 1. プロファイルファイルの確認

まず、プロファイルファイルのパスを確認します。

```powershell
$PROFILE
```

### 2. プロファイルファイルの作成または編集

プロファイルファイルが存在しない場合は作成し、存在する場合は編集します。

1. **プロファイルファイルの作成**

   ```powershell
   New-Item -Path $PROFILE -ItemType File -Force
   ```

2. **プロファイルファイルの編集**

   ```powershell
   notepad $PROFILE
   ```

### 3. エイリアスの追加

プロファイルファイルに以下の内容を追加します。

1. プロファイルファイルに**単一単語**の実行コマンドのエイリアスを追加する場合
    ```powershell
    # 構文
    Set-Alias エイリアス名 '実行したいコマンド'

    # 例
    Set-Alias g 'git'
    ```
2. プロファイルファイルに**複数単語**の実行コマンドのエイリアス（関数）を追加
    ```powershell
    # 構文
    function 関数名 {
        実行したいコマンド $args
    }
    
    # 例
    function gs {
        git status $args
    }
    ```


### 4. プロファイルファイルの保存と再読み込み

プロファイルファイルを保存して閉じた後、以下のコマンドでプロファイルファイルを再読み込みします。

```powershell
. $PROFILE
```

### 5. エイリアスの確認

追加したエイリアスが正しく設定されているか確認します。

```powershell
# 構文
Get-Command エイリアス名（関数）

# 例
Get-Command g #-> 
Get-Command gs #->
```

### 6. エイリアス（関数）の使用

設定したエイリアスを使用してコマンドを実行します。

```bash
# 例
g
g status
gs
```
## Linux

Linuxでエイリアスを追加する手順は、主にホームディレクトリにあるシェルの設定ファイル（`.bashrc` など）にエイリアスを追加し、設定を反映させることです。以下はその具体的な手順です。

### 1. ホームディレクトリに移動

まず、ホームディレクトリに移動します。

```sh
cd ~
```

### 2. 設定ファイルを開く

使っているシェルに応じて、以下のファイルを開きます。

- Bashの場合：`.bashrc`

```sh
vi .bashrc
```

### 3. エイリアスの追加

ファイルの末尾にエイリアスを追加します。

```sh
# 構文
alias エイリアス名='実行したいコマンド'

# 例
alias g='git'
```

### 4. 設定ファイルの保存と終了
vim を使用している場合は、Esc キーを押して `:wq` を入力します。

https://qiita.com/hide/items/5bfe5b322872c61a6896

### 5. 設定を反映

追加したエイリアスを反映させるために、設定ファイルを再読み込みします。

```sh
source ~/.bashrc
```

または、シェルを再起動しても反映されます。

### 6. エイリアスの確認

エイリアスが正しく設定されているか確認します。

```sh
# 構文
alias エイリアス名

# 例
alias g
#-> alias g='git'
```

### 7. エイリアスの使用

設定したエイリアスを使用してコマンドを実行します。

```sh
g
g status
```
『ベイズ統計の理論と方法』関連リンク【コロナ社】

# 『ベイズ統計の理論と方法』関連Webサイトリンク
本書を取り上げていただいた，Web上の関連記事をまとめました。

## 内容梗概
ベイズ統計学に初めて出会う人が疑問に思うことを解説し，理論的な基礎を明らかにし，実用上で注意することを説明する。統計モデルとは何か，事前分布とは何か，ベイズ統計学ではどんな法則が成り立つか，などを学びたい人に最適。

&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;<img width="250" alt="『ベイズ統計の理論と方法』" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186227/6a12402b-339a-c933-55a1-95e26c093942.jpeg">

&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;[書籍詳細ページ](https://www.coronasha.co.jp/np/isbn/9784339024623/)(コロナ社)

## ご参考・ご紹介いただいているリンク一覧
・[「ベイズ統計の理論と方法」渡辺澄夫のメモ](https://statmodeling.hatenablog.com/entry/watanabe-bayes-book)
　by はてなid:StatModeling（はてなブログ）

・[「全数調査なら何でもわかる」という誤解 - 間違えがちな母集団とサンプリングそしてベイズ統計 -](https://ill-identified.hatenablog.com/entry/2020/10/21/224042)
　by はてなid:ill-identified (はてなブログ)

・[「Mathematical Theory of Bayesian Statistics」読後メモ(1) (「ベイズ統計の理論と方法」の比較)](https://qiita.com/hiroto1979/items/4985de1dd7a6c876d685)
　by @hiroto1979 (Qiita)　

・[「Mathematical Theory of Bayesian Statistics」読後メモ(2) (「ベイズ統計の理論と方法」の比較)](https://qiita.com/hiroto1979/items/618b62194c20b598e560)
　by @hiroto1979 (Qiita)

・[機械学習と表現論 (ざっくり)](https://qiita.com/ymsk_CM/items/b2efb4d1e2904497626b)
　by @ymsk_CM(t yamasaki)(Qiita)　

・[尤度比検定は単純仮説に対して最強力](https://qiita.com/toucan/items/5b39fac33876a87bd2b8)
　by @toucan(Toucan)(Qiita)

・[ベータ分布でベイズ推定するときの事前分布パラメータ評価](https://qiita.com/piyo7/items/b6a7461f748f0464e59a)
　by @piyo7 (Qiita)

・[データサイエンス関連の本を紹介する。](https://qiita.com/Mark-N/items/65f075b3ec1fa5d37f76)
　by @Mark-N (Qiita)

・[「はじめてのパターン認識」読書会 第一回(1,2章)の資料](https://qiita.com/todesking/items/7be111807e46e3d34f20)
　by @todesking (Qiita)

・[文系エンジニアが0からベイズ統計モデリングを学習するときに読むべき資料まとめ](https://qiita.com/yukinagae/items/513ae6b8be39366d5338)
　by @yukinagae(Yuki Nagae) (Qiita)

## 📖書籍詳細ページ
[『ベイズ統計の理論と方法』](https://www.coronasha.co.jp/np/isbn/9784339024623/)(コロナ社)