OmniAICreator/Qiita-1.07M huggingface dataset:
「現代数理統計学の基礎」演習問題解法メモ　第6章問1～3

第6章に入ります。指数型分布族の表記方法が図書によって様々なので戸惑います。
問1だけでボリュームが多いので、今回は問3までのUPです。
![第6章問1 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/f6ee932f-95db-169e-99f1-f714ecc42e51.jpeg)
![第6章問1 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/ba73f133-86f6-51e7-22d7-cdfb4da1799b.jpeg)
![第6章問1 P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/22a2091e-e12c-dade-db28-6fd4c0c99d08.jpeg)
![第6章問1 P4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/3bd54844-e654-b08d-8d63-30567cdc503e.jpeg)
![第6章問1 P5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/25da62c5-6d25-973f-439f-37dc6cc263f3.jpeg)
![第6章問1 P6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/b9b3b6b9-b71e-c392-9405-6885f5b755a0.jpeg)
![第6章問2 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/6f55960b-e6df-2212-d85c-ec49ea92efc3.jpeg)
![第6章問2 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/9507898a-9bb7-86b4-a999-61dd5bc49c5f.jpeg)
![第6章問2 P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/e6b73edc-939b-70d9-7add-2527a8b545e0.jpeg)
![第6章問3 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/db0961bc-99fd-625e-601a-24eb8dc4e1ec.jpeg)
![第6章問3 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/872e97a8-0afc-767d-4043-523e5f1a65f5.jpeg)
Entityがnullかどうかを知る

## 背景
javaの資材を修正した際に、作成されたentityListがnullかどうかで条件分岐した箇所があった。そこで自分は、CollectionとEntityをごっちゃにして考え、null判定をするためにメソッドを理解するのに時間を要した。そこで、メモとしてここに書き留めておく

## EntityがNullかどうか判定する
"isNull", "nonNull","==null", "!=null"の4つ。
直観的にわかりやすいのは"isNull", "nonNull"かと思う

## Listの中身がnullかどうか
"isEmpty()","list.size()==0"
EC2にターミナルソフトから接続する方法

## ターミナルソフト（ターミナルエミュレータ）とは

ネットワークを通じて他のコンピュータに接続し、コマンドライン方式で遠隔操作するためのソフトウェア。

- Teraterm
- Rlogin
- [MobaXterm](https://mobaxterm.mobatek.net/)

## AMIとしてWindows、ターミナルソフトとしてMobaXtermを使う場合

RDPクライアントを選択し、プライベートキーを使ってパスワードを入手。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/0fc671cf-e37e-b7d9-c33a-37d304d7f249.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/e209b2ab-9893-4ae5-123c-133d88bc23a5.png)


その後MobaXtermでSessionを選択し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/93703049-bb79-d170-aa82-7e120cf89441.png)

Remoteホストにはパブリック IPv4 DNSを、Usernameには「Administrator」を入力。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/09c0105a-30fb-4cbf-d411-7e3ea50ae096.png)

3389番ポートはWindowsのリモートデスクトッププロトコル（RDP：Remote Desktop Protocol）が通常使用するポート番号。

## AMIとしてAmazon Linux 2023、ターミナルソフトとしてTeratermを使う場合

- ホストはパブリック IPv4 アドレス
- ユーザ名は「ec2-user」を入力し、パスフレーズは空白。

- 認証方式の部分でキーペアを使用する、

- キーペアを作成する際に、RSAではなくED25519を選択する必要がある。これは、Amazon Linux 2023のSSHサーバー側はssh-rsa署名がデフォルトで使えないためである。rsa-sha2-256またはrsa-sha2-512では接続可能らしく、Tera Termのバージョンが古いとサポートしていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/9454967c-6745-7c77-3481-bc5246f4d3fc.png)
SQL ROW_NUMBER()

## ROW_NUMBER()とは
出力されたものに対して、番号を設定する
<b>構文</b>
```sql
ROW_NUMBER ( )   
    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
```
## PARTITION BYとは
value_expressionで指定した列ごとにデータをまとめる。

## order_by_clauseとは
by以下で指定した列を基準に昇順か降順を決めること

## 例
①nameを基準に昇順で並べて、番号を設定するケース
```sql
SELECT 
  ROW_NUMBER() OVER(ORDER BY name ASC) AS Row#,
  name, recovery_model_desc
FROM sys.databases 
WHERE database_id < 5;
```

②PARTITION BY 句を追加し、recovery_model_descごとにまとめ、nameを基準に並べ替えて、番号を設定する
```sql
SELECT 
  ROW_NUMBER() OVER(PARTITION BY recovery_model_desc ORDER BY name ASC) 
    AS Row#,
  name, recovery_model_desc
FROM sys.databases WHERE database_id < 5;
```

## 参照
https://learn.microsoft.com/ja-jp/sql/t-sql/functions/row-number-transact-sql?view=sql-server-ver16
環境変数って？ .envファイルって？

# はじめに
現在Reactとsupabaseで開発を行っているのですが、.envファイルというものが登場してきて環境変数などの周辺の知識が浅いなと思ったのでまとめます

# 環境変数とは？
まずはみんな大好きWikipedia

> 環境変数（かんきょうへんすう、英語: environment variable）はオペレーティングシステム (OS) が提供するデータ共有機能の一つ。OS上で動作するタスク（プロセス）がデータを共有するための仕組みである。特にタスクに対して外部からデータを与え、タスクの挙動・設定を変更するために用いる。
> [Wikipedia]()より引用

わかるようなわからないような、微妙なラインですね。

簡単にいうなれば、**環境変数とはOSがもつグローバル変数**という認識でよいかと思います。
linuxなどを使っている方ならコマンドラインで次のコマンドを打つと確認できます。
```terminal
$ env #$はターミナルにもともと書いてあります。
```

# .envファイルって何？
.envファイルに登録した値を環境変数として設定することが出来ます。
```:.env
MY_VALUE=123
GREETING="Hello"
```

nodejsの環境ならば上記の環境変数を以下のように参照することが出来ます。
```javascript
console.log(process.env.MY_VALUE) // 出力: 123
console.log(process.env,GREETING) //出力: Hello
```

# nodejsでの環境変数
はじめに環境変数をOSがもつグローバルな変数と説明しましたが、nodejsの環境では少し意味が違ってくるようです。

環境変数と名前がついているように、
<font color="red">**何かの環境がグローバルにもつ変数**</font>という認識に汎用性があるように思います。

nodejsでは、<font color="red">**サーバーを立てた時**</font>に.envに記述されている変数を環境変数として設定します。nodejsの実行環境にてグローバルに参照できる変数を環境変数と呼ぶらしいです。

# .envの使い道
基本的に接頭に.がつくファイルは隠しファイルとなっていて、よりセンシティブ・隠したいものを記述するファイルになっています。envはただの名前です。
現在僕はsupabaseとreactでWEBアプリ開発をしているのですが、supabaseのapiキーなどを管理するために使用します。
apiキーなどが公開されてしまうと多額の請求が飛んでくることがあるのでみなさんもご注意ください！

<font color="red">**githubにpushする際はapiキーが公開されないように！！！**</font>

# 終わりに
環境変数への理解が少し深まってよかったです。でもまぁあまり低レイヤーのことで沼らないように気を付けたいと思います(汗
VRAM12GBの4070TiでChat with RTXのLlama2が選択できない問題の解消


# 概要
- Chat with RTXをインストールしたがLlama2が選択できなかった
- GPUのVRAMは16GB以上を想定されているが私のGPUは12GBであることが原因だった
- インストールの設定ファイルを書き換えることでLlama2が選択できるようになった

# 環境
- Windows 10 64bit
- RTX4070Ti 12GB

# llama13b.nviの書き換え
インストーラの下記ディレクトリにあるllama13b.nviを書き換える。
```
NVIDIA_ChatWithRTX_Demo\ChatWithRTX_Offline_2_11_mistral_Llama\RAG\llama13b.nvi
```
こちらの26行目のMinSupportedVRAMSizeでVRAMサイズの下限が設定されている。
デフォルトで"15"の記載があるがVRAM16GBを最小と想定されている。
私のVRAM12GBに合わせてこの数値を"11"に書き換える。

### 書き換え前
``` 
    <string name="MinSupportedVRAMSize" value="15"/>
```

### 書き換え後
``` 
    <string name="MinSupportedVRAMSize" value="11"/>
```

# 起動確認
あとは普通にインストールするだけでLlama2が選択できるようになる。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159523/597b6f1e-8b6f-e761-6323-29a91a482ee6.png)
Vercel「Error: Command "vite build" exited with 127」

# Vercelにviteプロジェクトをデプロイしようとしたところで下記エラー
```
Running "vercel build"
Vercel CLI 33.5.1
sh: vite: command not found
Error: Command "vite build" exited with 127
```
# 解決
- VercelのProject SettingsからRootDirectoryを変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2963533/091aaf12-a78f-3464-d3c9-8c03da476fb3.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2963533/e21f8621-5ab4-3f5a-0595-ff221cb1d7fc.png)



## 参考
https://github.com/orgs/vercel/discussions/5158
【Laravel】sailのtinkerの日本語対応をDockerfileを修正せずに行う

## 参考記事
https://qiita.com/naporitan/items/d8b312b9a8e66d9cabfb

## 必要なパッケージと設定
* パッケージ: language-pack-ja
* 環境変数: LANG=ja_JP.UTF-8

## コンテナからインストール
```console
$ sail bash
# apt-get install -y language-pack-ja
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
```

でけへんやないか〜い

## rootユーザーでシェルにアクセス
### コンテナIDを確認する。
```console
$ docker ps
```

### rootユーザーでコンテナに入る
```console
$ docker exec -it --user root コンテナIDまたは名前 bash
```

これでrootユーザーで入れたので
```console
# apt-get install -y language-pack-ja
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package language-pack-ja
```

んで環境変数を設定します。

```console
# export LANG=ja_JP.UTF-8
```

これでtinkerの日本語対応OK
```
# php artisan tinker 
Psy Shell v0.11.18 (PHP 8.2.6 — cli) by Justin Hileman
> 'あ'
= "あ"
```

この方法だと、ビルドするたびに毎回パッケージインストールと環境変数設定が必要になると思います。

しかしチーム開発の場合、Dockerfileでパッケージのインストールなどはインフラチームとかが管理していて勝手に修正することができない場合もあるのではないでしょうか。

でも動作確認でいろいろコマンドを実行したいけど、`コマンドが見つかりません`って出て「インストールせなあかんやん」って場合に、とりあえずその場だけでもってこともあるでしょう。

そういう時に役立つかもですね。

ま、参考までにお願いします。
GraphQLの基礎知識

GraphQLを使っているエンジニアの人と話していて、自分がGraphQLをよくわかってないことに気づいたので、基本的な情報を調べてみた。

# GraphQL

Metaが開発したOSS。APIを効率よく呼び出すために作られたクエリ言語。

SQLがRDBを使うように、GraphQLはGraphQL用の特殊なDBを使うのかと思いがちだが、そういうわけでは無い。GraphQLもRDBなどを使う。なので、DB内の計算などを効率化するわけでは無い。backend側のコードを見通し良く効率的に書ける、というモチベーションが強い印象。

## GraphQLの特徴

必要なデータを過不足なく、一度で取得できる(アンダーフェッチ、オーバーフェッチが無い)。そのため、データフェッチの効率性が高い。

基本的に、1つのデータを取得する際1つのエンドポイントを呼ぶだけで完結するので、APIの設計をシンプルにすることができる。クエリ言語を柔軟に記載することができる。

色々なサポート機能がある。例えば、Subscriptionsという機能を使って、リアルタイムデータを効率的に扱うことができる。

### 向いているサービス

ソシャゲ、eコマースなどの複雑なデータ構造を持つサービス、リアルタイムデータを扱うアプリケーションなどで真価を発揮する。

一方で、データ構造がシンプルなサービス、キャッシュが重要なサービスなどには向いていない。

### データベース

特定のデータベースに依存していない。RDBでも、NoSqlでもOK。必ずしも、GraphQLを使うとREST APIよりもデータベースからfetchする回数が減るとは限らない。実装次第。

### Resolver

スキーマとデータソースを結びつける役割を持つ。スキーマはあくまで定義のみで、Resolverが実際の操作を行なってくれる。

### Subscriptions

GraphQLサーバーにデータ変化などの特定のイベントが生じるたびに、クライアントにデータ送信するPubSubのような仕組み。クライアントがサーバーにGraphQLのクエリ、クエリ変数を送信する。サーバーは、イベントがトリガーされたらクエリを実行する。

### DataLoader

データ取得に使用される汎用的なツール。データ取得をbatch処理する機能と、結果をcacheする2つの機能がある。

batchは、データ取得のリクエストを一定時間待って、その間に行われたリクエストを統合してbatch処理してくれる。

cacheは、batchに登録されるkeyと、それに対応するvalueの組をメモ化する。

これらの機能を使うと、データアクセスの回数が減少する。

DataLoader導入前

```sql
SELECT item_id, amount FROM orders WHERE customer_id = "foobar";

SELECT name, description, price FROM items WHERE id = "hoge";
SELECT name, description, price FROM items WHERE id = "fuga";
SELECT name, description, price FROM items WHERE id = "piyo";
```

DataLoader導入後

```sql
SELECT
  name, description, price
FROM
  items
WHERE
  id IN ("hoge", "fuga", "piyo");
```

### N+1問題

N件のデータレコードを取得した時、関連レコードの取得にN回のfetchを行なって、N+1回のfetchをしてしまうこと。DataLoaderで解決できる。

### Relay

Metaが開発しているGraphQLクライアント。

- 全てのObjectに対して、一意のGlobal IDを要求するので、データの再利用性が高い
- リスト、ページネーションなどの際、Connectionという仕様を使うことで効果的に処理できる
- Mutationを行いやすい
- Fragment colocationによって、データフェッチが最適化される

### Fragment colocation

コンポーネントとGraphQLフラグメントを密接に配置するデザインパターン。

以下のような利点がある。

- 明確な依存関係を示すことができる
- 再利用性の向上
- 効率的なデータフェッチ
- 保守性の向上

## GraphQLのメリット

クライアントはスキーマをもとに、欲しいフィールドだけをリクエストできる。

リレーションがある値は、一度のリクエストで取得できる。例えば、twitterのフォロー数、フォロワー数を取得する際、REST APIだと2回のリクエストが必要だが、GraphQLであれば一度で取得できる。

スキーマをもとに開発するので型の不一致が起きない。強い型付けが採用されている。

## GraphQLのデメリット

クエリが複雑になる可能性・学習の難しさが挙げられる。

また、GraphQLのメリットを享受するのが難しい。GraphQLはMetaがReact・Relayと組み合わせて使い始めた。「RelayスタイルでないGraphQLに価値はない」と言うGraphQL有識者もいる。Relayを使わないにせよ、Fragment Colocationがわかってないとメリットを享受しづらい。

RESTでやっていたことが直感的にやり辛くなる側面もある。

# gqlgen

GraphQLサーバーを構築するGoライブラリ。GraphQLスキーマ定義言語を使用してAPIを自動生成してくれる。

# 参考文献

https://sizu.me/adwd/posts/34mkeimfb06x

https://lyohe.github.io/blog/2021/12/16/reading-dataloader/#:~:text=graphql%2Fdataloader
【Emmet】AWS Cloud9での使用方法と略語まとめ(HTML編)

こんにちは～！
今日は最近学んだ爆速でHTMLとCSSを記述できる**Emmet**について紹介します！
今回はHTML編のため、HTMLの略語を紹介します！
使用しているエディタはAWS Cloud9です。他のエディタではプラグインで導入できるものや、デフォルトで備わっているものもあるようです。
公式サイトのチートシートはこちらからどうぞ。

https://docs.emmet.io/cheat-sheet/

## AWS Cloud9でのEmmet使用方法
　AWS Cloud9ではもともと備わっているようなので、まずは略語を入力をし`Ctrl+Alt+E`を押すと変換できます。Cloud9ではEmmetがなくても元々それなりに変換できるようになっていますが、Emmetを使用した方が変換できる幅が広がるように思います。

## 実際に使ってみよう
### HTMLの略語紹介
#### !
`!`を打ったあとに`Ctrl+Alt+E`を押すとこのように表示されます。細かい設定はともかく、htmlの基本形はすぐ出来上がるのでおすすめです！
```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  
</body>
</html>
```
#### タグ名
基本ですが、<>を入力せずタグ名を入れて`Ctrl+Alt+E`を押すとこのように表示されます。
`div`と打った場合
```html
<div></div>
```
**応用** : `a{click}`のように{}の中に文字を打ち込むとタグで囲む文字を指定することができます。
```html
<a href="">click</a>
```
#### タグ名＋タグ名
異なるタグを入れ子ではない状態で入力したい場合、`タグ名＋タグ名`を入力後`Ctrl+Alt+E`を押すとこのように表示されます。
`div+a`の場合
```html
<div></div>
<a href=""></a>
```
#### タグ名*必要なタグの個数
例えばdivタグを3つ用意したい場合、`div*3`のように入力し`Ctrl+Alt+E`を押すとこのように表示されます。複数同じタグが欲しい場合はわざわざ何回も打ち込んだりしなくても、一気に入力できるのでとても便利です！
```html
<div></div>
<div></div>
<div></div>
```
#### nav>ul>li
入れ子構造は`タグ名`と`>`を組み合わせ、`Ctrl+Alt+E`を押すとこのように表示されます。
```html
<nav>
  <ul>
    <li></li>
  </ul>
</nav>
```
nav>ul>li以外にも、sec>h1>divなどでもできます。(組み合わせは自由です。実際に試してみましょう。)

#### .クラス名
`.クラス名`を打ち込み`Ctrl+Alt+E`を押すとこのように表示されます。(今回は.practice-classと打ち込みました)そうすると勝手にdivタグにクラス名を入れた形で反映してくれます。
```html
<div class="practice-clas"></div>
```
#### タグ名.クラス名$*必要なタグの個数
`タグ名.クラス名$*必要なタグの個数`を打ちこみ、`Ctrl+Alt+E`を押すとこのように表示されます。この時に自動でクラス名に数字を振ってくれるのでとても便利です
`ul>li.box$*4`の場合
```html
<ul>
  <li class="box1"></li>
  <li class="box2"></li>
  <li class="box3"></li>
  <li class="box4"></li>
</ul>
```
#### #id名
`#id名`を打ち込み`Ctrl+Alt+E`を押すとこのように表示されます。(今回は#practice-idと打ち込みました)
```html
<div id="practice-id"></div>
```

### 最後に
今回はHTMLでしたが、CSSの場合もかなり実用的なものが多いので次回はそれについて載せたいとおもいます！
【Android】Throwableから呼び出し元の関数名を取得する方法

# はじめに
日常的にフロントエンドの開発を進めていると、必ず経験することになるであろう対応のひとつがエラーハンドリングかと思います。
このエラーハンドリングを如何にシンプル且つ汎用的に書くかというのはある種の永遠の課題でもあるかと思いますが、今回はエラーハンドリングなどで活用できる、Throwableから呼び出し元の関数名を参照する方法を備忘録的にまとめておこうと思います。

# 呼び出し元の関数名を参照方法
実装方法は非常にシンプルで、以下になります。

```main.kt
    val methodName = Throwable().stackTrace[0].methodName
```

以上になります。
Logを出す際などに使うと便利だと思います。

# おまけ
せっかくなので、Throwable以外からも関数名を取得する方法をまとめておこうと思います。

```main.kt
    val methodName = Thread.currentThread().stackTrace[1].methodName
```
stackTraceの二番目には現在の関数が割り当てられているので、こちらから関数名を取得できます。

# さいごに
急に暖かくなったからか、身内では花粉症が蔓延しています、、、😷
GitLabのcommitメッセージをNotionで確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320824/95959ccd-582c-586b-a030-7113ee4782a4.png)

- NotionとGitLabを連携してると良いことがありました。
- GitLabのcommitごとに発行されるURLをNotionに貼り付けると、いい感じにcommitメッセージを表示してくれる。
- エンジニア以外でも作業内容が見やすいですね〜。
- 上の画像はcommitのURLを１つ１つ貼り付けてるだけなので、貼り付ける順番次第で順番を変えたりできるから便利〜



## ユースケース
1. 特定のcommitだけまとめてレポートを作る
Linux起動時にtmuxセッションを立ち上げてtmux上で何か実行する

### サンプル

例えば、起動時にrcloneのマウントをtmux上で実行したい場合は以下をcrontabに登録する。

```bash
@reboot /bin/bash -l -c 'tmux new -d -s rclone_session;tmux send-keys -t rclone_session "rclone mount remote:remote_path local_path" KPEnter'
```

### 解説

```bash
@reboot /bin/bash -l -c 'tmux new -d -s [セッション名];tmux send-keys -t [セッション名] "[セッションの中で実行したいこと]" KPEnter'
```
KPEnterとかがダサいけど、tmux自体が仮想スクリーンなのでキー送信をしてるのだという心構えは忘れずに。

### なぜtmux？

- 普通に実行したいだけならcronで直接実行すればいい
- 標準出力を後追いで見たいのならログファイルとして出力すればいい
- ログがたまりすぎるのが嫌ならローテートすればいい
- だけどログローテートって忘れたころに失敗してることがわかる
- だったら初回からtmuxで標準出力と標準エラー出力眺める方式に合わせておけばいいんじゃない？
- 色付きでみやすいし
ABC341回答メモ

# 0.はじめに
　最近デイリーコンテストでの練習時間をとれていない事に
　不安を覚えつつ参加。
　てこずりながらもDまで解けましたが、E以上は
　解けず及第点といった結果でした。
　レートは+5と微増で900台はキープできています。


# 1.A - Print 341
　最初に"1"を格納したリストansを用意。
　そのリストに、N回"01"を追加し
　最後にansを結合した文字列を表示して終了

　https://atcoder.jp/contests/abc341/submissions/50333119

# 2.B - Foreign Exchange
　問題文を読むと両替する順番とか一部両替で得するケースが
　あるかとか考えてしまいそうな気がしましたが、結局
　1つ目の国から順番にすべて両替していくだけでした。

　【実装】
 　　・変数ansを0で初期化
 　　・N-1回以下繰り返し
 　　　・S,Tをインプット
 　　　・両替単位p(現在のi国のコインをもとに
 　　　・何セットi+1国のコインが得られるかの数)を求める
 　　　・p=(ans+A[i])//S
 　　　・ansにp*Tをセット
 　　・最後にans+A[N-1]を出力して終了

　https://atcoder.jp/contests/abc341/submissions/50339276

# 3.C - Takahashi Gets Lost
　なんとなく飛ばしてしまいたくなる面倒そうな2次元表
 問題でしたが、まぁ、D以降も簡単そうではなかったので
 取り掛かりました。

 制約から、500×500×500が最大かなーとおもいつつ、陸地スタート
 の場合だけ、3つ目の500がかかると思えばいけそうかなと
 とりあえず単純に実装。
 実行時間2974msと奇跡的にぎりぎりでACを頂けました・・・。
 TLEするようなら、上下左右の移動範囲をもとにスタート
 地点を狭めることも考えていましたが、そこまでしないで
 済みました。

 【考え方】
 　・MAP情報を表に格納
 　・MAPを順にみていき、”.”の時移動チェック関数を実行
 　・移動関数チェックの結果を集計し、最後に表示

  [移動チェック関数(引数MAPのマス位置i,j)]
  　・移動情報もとにマスを動かしていき
   　 海マスを通ったら0を返す。
      海マスを通らず最後まで移動出来たら1を返す。
 

　https://atcoder.jp/contests/abc341/submissions/50353788

# 4.D - Only one of two
　まず、単純にNとMの小さい方から1ずつカウントアップしていき
 NかMどちらかでしか割り切れない時にカウントアップ。
 カウントがKになった数字を表示して終了としました。
 もちろん例題３でTLEとなったので、まじめに考え始めました。

　【考え方１(ちょっと間違ってる)】
 　・ある数Pが、問題の条件で言うX番目かの判断方法
  　　LCをNとMの最小公倍数とした場合
  　　X=(P//N)+(P//M)-((P//LC)×2）
　 →2分探索でPを探し、X=Kとなったら、Pを出力して終了
 　　
　例題3を解いてみると考え方1でのPは、X番目からX+1番目の
 間であり、ちょうど割り切れる数ではないことに気づきました。
 ただ、Pが求まれば、答えは、N×(P//N)か、M×(P//M)になるので
 （まぁ大きい方なんだと思いますが）
 Pを2分探索で求めたあと、↑のどちらがピッタリなのかを求め
 答えとしました。

　【実装】
 　 1.N,M,Kを入力
 　 2.変数LCにNとMの最大公倍数をセット
 　 3.Lに0、RにLC×Kをセット
   以下繰り返し
   　-1.変数Midに（L+R）//2をセット
   　-2.変数cntに(Mid//N)+(Mid//M)-((Mid//LC)×2）
   　-3.cnt=Kの時
   　　-1.AにN*(Mid//N)をセット
   　　-2.BにM*(Mid//M)をセット
   　　-3.(A//N)+(A//M)-((A//LC)*2)がKの時Aを出力して終了
   　　-4.(A//N)+(A//M)-((A//LC)*2)がKではない時Bを出力して終了
   　-4.cnt>Kの時、RにMidをセット
   　-5.cnt<Kの時、LにMidをセット

　https://atcoder.jp/contests/abc341/submissions/50380972


以上
Viteでprocess.envを使う方法

# はじめに

Viteで環境変数を使うのにimport.metaを使わずにprocess.envを使いたかったのでまとめます

# やり方

`vite.config.ts`に以下を追加します

```
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
+ import env from "vite-plugin-env-compatible";

// https://vitejs.dev/config/
export default defineConfig({
    plugins: [
    react(),
+   env({ prefix: "VITE",  mountedPath: "process.env" }) 
  ],
});
```

そして必要なライブラリをインストールします

```
$ npm i --save-dev vite-plugin-env-compatible
```

これで通常通りprocess.envが利用できるようになります

もしdotenvの読み込みの設定を行なっていない場合はそれも併せてやりましょう

# おわりに

import.meta...を使うのが微妙だったので解決できてよかったです
GitLabテンプレートを他のレポジトリから参照できるようにした


# 背景
[GitLabテンプレート](https://docs.gitlab.com/ee/user/project/description_templates.html)を複数リポジトリで使用しているのですが、MRのテンプレートを修正したいことがあって、1個1個のmdファイルを修正するのがダルい。

[グループレベルのテンプレート](https://docs.gitlab.com/ee/user/project/description_templates.html#set-group-level-description-templates)はPREMIUMクラスで使えるのですが、gitのコマンドを使って１つのtemplateプロジェクトを参照するようにして、templateの修正箇所を一元化できるようにできないか試してみました。

# git submodule使ってみた(結果:NG)

**手順**
* [template](https://gitlab.com/esper2/template)というプロジェクトを作って、そのプロジェクトのroot直下にmerge_request_templates/Template.mdを置いた
* [go-sample](https://gitlab.com/esper2/go-sample)というプロジェクトのroot直下でtemplateプロジェクトを.gitlabという名前でサブモジュールとして置いた
   * 　`git submodule add git@gitlab.com:esper2/template.git .gitlab` したものをcommit & pushした

MRを作ってみたのですが、上手くいかないorz

![スクリーンショット 2024-02-18 8.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244232/26625a4b-aee4-7937-ee8e-550f9235c853.png)

![スクリーンショット 2024-02-18 8.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244232/f947778b-77cd-e3ba-2caf-ebc67c71fe25.png)



![スクリーンショット 2024-02-18 9.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244232/013e8bbd-194d-7320-d6be-3e8cd5e8add9.png)

# git subtree使ってみた(結果:OK)

**手順**
* sub-originという名前のリモートリポジトリを追加した(sub-originの内容はtemplateプロジェクト)
  * `git remote add sub-origin git@gitlab.com:esper2/template.git`
* リモートリポジトリのmasterブランチを.gitlabというフォルダ名で取り込む(clone)
  * `git subtree add --prefix=.gitlab sub-origin master`(※)
* 上記の内容をpushした

※コミットログを汚さないためにgit subtree addには--squashをつけた方が良さそう
`git subtree add --prefix=.gitlab sub-origin master --squash`

できた！！！
![スクリーンショット 2024-02-18 11.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244232/eb31868b-c338-5711-452c-512cfe761a5a.png)

![スクリーンショット 2024-02-18 11.03.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244232/0366e4ad-b6b4-3b61-1b7a-4a11368a156e.png)

# 考察

## 何故git submoduleだと上手くいかなかったか

* [公式ドキュメント](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)を見てみると、以下の通り

* git submodule init でローカルの設定ファイルを初期化し、次に git submodule updateしないとTemplate.mdが置かれた状態にならないので、GitLabのGUIからMRを出した時にTemplate.mdを参照できない

```
サブモジュールを含むプロジェクトのクローン
ここでは、内部にサブモジュールを含むプロジェクトをクローンしてみます。 
デフォルトでは、サブモジュールを含むディレクトリは取得できますがその中にはまだ何もファイルが入っていません。
```


## 何故git subtreeだと上手くいくか

* git subtreeではtemplateのブランチをcloneしており、.gitlab/merge_request_templates以下にTemplate.mdが置かれるため

# おまけ：templateを更新するときは

**手順**

* templateプロジェクトを更新する
* templateをcloneしたプロジェクトでgit subtree pullする
  * `git subtree pull --prefix=.gitlab sub-origin master --squash`

# 参考

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB

https://qiita.com/mellbrother/items/f22cd2e613ab926ca19d

https://zenn.dev/kyoh86/articles/58c8546ed2307b
Wordpress開発フロー

```mermaid
 flowchart TB
	subgraph GitLab
	  gitlab-1[リポジトリ作成] --> gitlab-1-2[環境変数の設定]
	end
    gitlab-1-2 -.- git-1
  	subgraph Dockerコンテナ
	  git-1[git clone ...]
	  git-1 -.- a
		subgraph DBコンテナ
	  a[初期mysqlファイル] --> a2[コンテナ起動]
		a2 --> a3[DB内に初期データが入る]
		end
		a3 -.- |depends on|b
		subgraph Wordpressコンテナ
		  b[Wordpress起動] --> b2[テーマ編集作業]
		  b2 --> b3[Gitでcommitまで]
		end
	end
	b3 -.- |push|gitlab-2
	subgraph GitLab
	  gitlab-2[CICDで自動デプロイスタート]
	end
	gitlab-2 -.- |CICD|d
	subgraph レンタルサーバー
	  d[ファイルの書き換え]
	end
```
Volta導入（Macbook Pro）

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事をかきました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的
前回の続きです！あれ、nodebrew入れて終わりじゃないの？と思われるかもしれませんが、Voltaの方が良さそうなのでそちらに移行してみます！

https://qiita.com/mr_noppo/items/fb9dbd302e214d400fda

# 使用したものや事前準備
Macbook Pro
Homebrew

# 主に参考にさせていただいた記事
https://isub.co.jp/%E3%80%90%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%80%91/%E3%80%90node-js%E3%80%91%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%92volta%E3%81%AB%E7%A7%BB%E8%A1%8C%E3%81%99%E3%82%8B/

# なんでnodebrewから移行するの？
nodebrewだけでもだいぶ便利になりましたよね、プロジェクトごとにバージョンが違うのですぐに切り替えられるのがとても魅力できたと思いました。:fist:
Voltaにしようと思ったのは、「プロジェクトごとにバージョンを固定できる」というところにさらなる魅力を感じたからです！切り替えすらいらないなんて・・・。
ただ、仕組みとしてはpackage.jsonにNode.jsのバージョンを保持することで切り替えるようです。なのでチーム開発で全員使っていないと固定は使えないかも。
でも、nodebrewと同じように切り替えは自在なので対応は柔軟にできそうです！

# 早速入れるためにnodebrewとはさようなら

まずは念のため、不要なNode.js関連のものをアンイストールしていきます。（nodebrew配下にデータがあるはずのでnodebrew自体を消せば全部綺麗に消えるとは思いますが。）
何をインストールしたか確認。

```
nodebrew list
```

![スクリーンショット 2024-02-18 8.34.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/7743e11a-bed2-fdb9-82c6-61dda733d1b1.png)

アンインストールコマンドはこちら。全部消します。
```
nodebrew uninstall v18.17.0
```

homebrewからnodebrewをアンインストールします。
```
brew uninstall nodebrew
```

PATH 環境変数も消しておきましょう。(zshの方の説明になります）
```
vim ~/.zshrc
```
iキーを押した後に下記のコマンドを削除します。（ない方はそのまま）
```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```
:wqで保存して抜けます。

.nodebrewを削除します。(rm -rfは扱い方注意）
```
rm -rf ~/.nodebrew/
```

# Volta導入
では、Voltaは導入していきます！

https://formulae.brew.sh/formula/volta
```
brew install volta
```

次にセットアップをコマンドを打ちます。自動でPATH 環境変数をカスタマイズしてくれます。
カスタマイズ用のファイルを検索して書き込んでくれるようなので、zshの方は「~/.zshrc」をvimでもいいので作成しておきましょう。
```
volta setup
```

PATH 環境変数が入ったか確認します。
```
cat ~/.zshrc
```
しっかり入ってますね！
![スクリーンショット 2024-02-18 8.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/99ed6e1a-73ab-931b-9dc2-85f93445da83.png)

即適用するようにコマンドを実行します。
```
source ~/.zshrc
```

# hello Volta
では、先ほどアンインストーしたバージョン18.17.0をインストールしてみます。
```
volta install node@18.17.0
```
無事成功しました。
![スクリーンショット 2024-02-18 9.05.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/7148c4c5-4825-337e-c5f8-390ac0df1ef9.png)

他のバージョンもインストールし、現在のアクティブなNode.jsを確認します。
```
volta list node
```

(default)が今設定しているバージョンのようです。（インストールがある意味、バージョン指定になりそう）
![スクリーンショット 2024-02-18 9.08.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/287b057b-35ec-d8d2-819a-6be27b7cd7d4.png)

# 最後に
package.jsonでの固定化はプロジェクトが全然ないので今回は省略します。参考サイトをご覧ください！
PowerPointで作成したスライドをbeamerに変換したい！

# pptx2tex

## テキスト部分と画像部分にわけてかんがえる

ただし、動画がはりこまれていないものとします。

PowerPointで作成したプレゼンテーションの文章をWord文書に流用したい場合、プレゼンテーション全体のスライドテキストを一括してエクスポートする方法もあります。

## 最新版のMicrosoft Officeを使用している場合

以下の手順でプレゼンテーションのスライドテキストをWordにエクスポートできます

## PowerPointファイルを開きます。

- 「Office」ボタン（または「ファイル」タブ）をクリックし、
- 「発行」→「Microsoft Office Wordで配布資料を作成」を選択します。:relaxed:

## 開く

ダイアログボックスで「アウトラインのみ」を選択し、「OK」ボタンをクリックします。:frowning2:

これにより、自動的にWordファイルが開かれ、プレゼンテーションのスライドテキストが取り込まれます。ただし、箇条書きのレベルは一律になるため、Word文書内で再度調整して利用しましょう!!:relaxed:

```
\begin{frame}
  \titlepage
\end{frame}
```

みたいなかんじで、チクチクはりつけましょう。

## 画像部分について

プレゼンテーション全体をzipファイルに変換してから画像を取得する方法もあります。

以下の手順で行います:

## プレゼンテーションファイルを選択

- pptx拡張子を持つファイルを右クリックします。
- コピーを選択します。
- 任意のフォルダに移動し、ペーストしてコピーしたファイルを作成します。

## コピーしたファイルを`.zip`に変更します。

- `zip`ファイルをダブルクリックして展開します。
- pptフォルダ内のmediaサブフォルダに画像ファイルが含まれています。
- 必要な画像を選択してコピーし、他の場所に貼り付けてください。

```
\begin{frame}
\includegraphics[width=\linewidth]{}
\end{frame}
```

みたいなかんじで画像をとりこみましょう。

# pandocつかう手

もちろん、markdownでつくって、pandocでbeamerに変換するというオプションもあります。
名言「エンジニアは失敗すると強くなる」に感動する IT用語に「ミニマムサクセス」はなさそうだが、あってもいい感じ3

# はじめに
先日、SLIM（スリム: Smart Lander for Investigating Moon）月面着陸成功をお祝いして、「 [IT用語に「ミニマムサクセス」はなさそうだが、あってもいい感じ](https://qiita.com/mylifewithviolin/items/1e754f04ea40959cba79)」という記事で強引に宇宙開発に触れさせていただきました。その後の、SLIM月面着陸ミッションは「フルサクセス」ではないかという[記事](https://qiita.com/mylifewithviolin/items/699c4352a2a16d2140d0)の中で、次の「フルサクセス」祈願として述べさせていただいていたのが…

# 祝「フルサクセス」:tada:
昨日2024年2月17日のH3次期国産基幹ロケット2号機の打ち上げのことでした。
土曜日ということもあって、午前8時半ごろからJAXAのYoutubeライブ配信チャンネルをテレビに展開して固唾を呑んで見守っておりました。

当初2月15日の予定であったのが天候の都合で2月17日に延期されたのが幸いしてJAXAのYoutubeライブ配信を始めてリアルタイムで見ることができました。

この2月17日というのはH3にとっては因縁深い日で、JAXAさんもある意味リベンジの意味を込めて選ばれたのか偶然お天気の都合でそうなったのかはよくわかりません。次期国産基幹ロケットH3初号機が発射シーケンス中に「フェールセーフ」して発射が中断したのが2023年2月17日でした。

これに関連して[IT用語の「フェールオーバー」と制御システム用語の「フェールセーフ」を念のため再確認](https://qiita.com/mylifewithviolin/items/bd4fa6ca7551f9a62d11)という記事を2023年2月19日に書いていたようです。

今回は無事にペイロードの軌道投入も成功し、「フルサクセス」達成でしたね。

# 名言「エンジニアは失敗すると強くなる」
ロケット開発なんて、ハードウェアエンジニアの冥利に尽きるのではと思ってしまいがちですが、「ロケット開発には魔物が棲んでいる」とか名言を残しているJAXA（とMHIさん）のエンジニアにとっては、まさに失敗すると巨額の製造費のハードウェアが一瞬で消失するリスクと隣あわせで、確かに心臓がいくつあっても足らない気がします。

IT業界に移る前は製造業でエンジニアをしておりましたが、ミッションクリティカルな事案に参画するわけでもなく、自分の計算したシミュレーションの結果と試作品の物理挙動が大きく乖離するというのはありましたが、その試作で得られた挙動からシミュレーションのパラメータを補正して2次試作ではリカバーしたというのが失敗と言えば言えるくらいです。

# おわりに
IT業界に移ってからの現役時代（フリーランスになってプチリタイアするまで）は、民間製造業のインターネットシステムに多く携わってまいりましたので、日本の製造業大応援です。H3とか水素っぽいネーミングが日本の将来をしょってるみたいで大好きです。（Hシリーズは液体水素燃料エンジンに由来）
ファイル所有者の変更

```bash
# 現在のユーザーを確認
$ whoami
-> {{自分のユーザー名}}

# rootユーザーでファイル作成
$ su　touch test

# ファイルの権限がrootになっていることを確認
$ ls -l test

# ファイルの権限を自分に変える
$ chown {{自分のユーザー名}}:{{自分のユーザー名}} test

# ファイルの所有者が自分になっていることを確認
$ ls -l test
```
最高レベルの背景除去 RMBG-1.4

# 画像内の顕著なオブジェクトがくっきりとれる
以下のように、細部や前景の扱いが上手い。

![pexels-oleksandr-p-1004359.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/34af8629-c6d9-f898-9f02-b9a7ec8aa2d0.jpeg)

![example_image_no_bg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7a19252d-b1d1-9d17-8dde-3d5de6bcae5f.png)

![IMG_0895.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/305eb682-07ce-e381-a219-6be35191c796.jpeg)

https://huggingface.co/briaai/RMBG-1.4

ISNetを独自データセットでトレーニングしたもの

https://github.com/xuebinqin/DIS

デモもある。

https://huggingface.co/spaces/briaai/BRIA-RMBG-1.4

# 使い方

### インストール

```shell
git clone https://huggingface.co/briaai/RMBG-1.4
cd RMBG-1.4/
pip install -r requirements.txt
```

### Run

```python
from skimage import io
import torch, os
from PIL import Image
from briarmbg import BriaRMBG
from utilities import preprocess_image, postprocess_image

im_path = "example_image.jpg"

net = BriaRMBG()
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
net = BriaRMBG.from_pretrained("briaai/RMBG-1.4")
net.to(device)

# prepare input
model_input_size = [1024,1024]
orig_im = io.imread(im_path)
orig_im_size = orig_im.shape[0:2]
image = preprocess_image(orig_im, model_input_size).to(device)

# inference 
result=net(image)

# post process
result_image = postprocess_image(result[0][0], orig_im_size)

# save result
pil_im = Image.fromarray(result_image)
no_bg_image = Image.new("RGBA", pil_im.size, (0,0,0,0))
orig_image = Image.open(im_path)
no_bg_image.paste(orig_image, mask=pil_im)
no_bg_image.save("example_image_no_bg.png")
```

iOS/macOS/VisionOS用の変換はこちら。

https://qiita.com/john-rocky/items/5b18132b98a5b1671e30

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Dockerfileでユーザーを作成して切り替える

## 問題
- root以外のユーザーでDockerを操作したい！

## 解決策
- イメージビルド時のDockerfileで任意のユーザーを作って切り替えてしまう。

Dockerfile
```yml
FROM ubuntu:20.04

# 環境変数の設定
ENV DOKCER_OPERATION_USER=任意のユーザー名

# 日本語文字化け対策
RUN apt-get update && \
    apt-get install -y language-pack-ja-base language-pack-ja locales gawk bc && \
    locale-gen ja_JP.UTF-8 && \
    echo "export LANG='ja_JP.UTF-8'" >> "${HOME}/.profile" && \
    echo "export LANG='ja_JP.UTF-8'" >> "${HOME}/.bashrc"
ENV LANG "ja_JP.UTF-8"

# ユーザーを作成して切り替え
## dockerグループを作成
RUN groupadd docker
## dokcerグループに所属するユーザーを作成
RUN useradd -g docker -u 1000 ${DOKCER_OPERATION_USER} -m
## sudo権限付与
RUN usermod -aG sudo ${DOKCER_OPERATION_USER}
## ユーザーの切り替え
USER ${DOKCER_OPERATION_USER}

# 作業用ディレクトリの作成
RUN mkdir /src
WORKDIR /src
```
"libtiff dot org" is restored. (2024年からね!)

libtiffのサイトを見ていたのです。そうしたら、素晴らしい話が！！
libtiff orgのコントロール権を取り返す事ができた、とのことです。
ありがとうございます！ありがとうございます！

- http://www.simplesystems.org/libtiff/index.html
- https://www.awaresystems.be/imaging/tiff/tml.html
- https://www.awaresystems.be/imaging/tiff/tml/tm202402.html

原文
====
https://www.asmail.be/msg0055015786.html

> 2024.02.03 15:00 "[Tiff] www.libtiff.org is restored", by Bob Friesenhahn
>
> Lee Howard has managed to acquire the libtiff.org domain (with great effort and expense to himself).
> 
> The libtiff.org domain was hijacked many years ago, and since then it has only provided stale pages for an archaic version of libtiff.
> 
> Now "http://www.libtiff.org/" leads to the latest libtiff HTML pages, and the same server/directory which already provides > "http://www.simplesystems.org/libtiff/".
> 
> This is still a server with limited bandwidth which runs out of a server closet in my residence. Please treat it kindly!
> 
> Bob

和訳
====
> Lee Howard は、(多大な努力と費用をかけて) libtiff.org ドメインを取得することに成功しました。
> libtiff.org ドメインは何年も前にハイジャックされ、それ以来、libtiff の古いバージョンの古いページのみを提供してきました。
> 現在、「http://www.libtiff.org/」は、最新の libtiff HTML ページと、すでに「http://www.simplesystems.org/libtiff/」を提供している同じサーバー/ディレクトリにつながります。
> これは依然として帯域幅が限られたサーバーであり、私の自宅のサーバークローゼットから使い果たしています。優しく扱ってください！
FontAwesomeのCDNを読み込む方法


FontAwesomeのCDNは廃止されたそうです。
詳しくはこちらの記事をご覧ください。
https://10to1travel.com/fontawesome-cdn-sunsetted-25221.html


Font AwesomeのKit CodeであればCDNまで辿り着けるようですが、アカウント登録しないといけないという手間があります。
ですので、海外サイトですがFontAwesomeのCDNをまとめてる「cdnjs」というサイトがあります。
以下サイトに入ってCDNリンクをコピペしてください。
https://cdnjs.com/libraries/font-awesome

![スクリーンショット 2024-02-18 7.23.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678283/dc9b8c68-fbba-9695-3de0-2d6a11fbefe6.png)


●使用例
```html
<!-- href=""の中に適宜書き換える -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" type="text/css" />```
生成AIの情報をSNS以外で取得する方法について考えてみた[10選]

初めまして、現在アメリカの大学でデータサイエンスと言語学を学んでいるヤマダと申します。
今回は、生成AIの情報をSNS以外で取得する方法についてリストアップしてみようと思いこの記事を書くことに決めました。ご一読いただけますと嬉しいです。

ここ1年は生成AIに関する情報がSNS上に点在し、とてつもない速さで流れているため他の方法で一次情報により近い情報へアクセスできる手段（サイト）を１０個リストアップすることにしました。今回のリスト化のポイントとしては、企業からのリリースよりも研究などのキャッチアップに重きを置いています。
以下リストです。ぜひ、日常の情報収集に活用してみてください。
<br>

- **MIT News**
組織名：マサチューセッツ工科大学
更新頻度：1~3日に一本
カテゴリ：リサーチペーパー・ニュース
言語：英語
https://news.mit.edu/topic/artificial-intelligence2?page=0
<br>

- **The Berkeley Artificial Intelligence Research**
組織名：UCバークレー　バークレー人工知能研究所
更新頻度：1ヶ月に1本弱
カテゴリ：リサーチペーパー
言語：英語
https://bair.berkeley.edu/blog/
<br>

- **arXiv**
組織名：Cornell University
更新頻度：毎日たくさん
言語：英語
カテゴリ：論文
https://arxiv.org/
<br>

- **Open AI Blog**
組織名：Open AI
更新頻度：1ヶ月に数本
言語：英語
カテゴリ：企業ブログ・リサーチ・サービス内容
https://openai.com/blog
<br>

- **NVIDIA Blog**
組織名：NVIDIA
更新頻度：1ヶ月に数本
言語：英語カテゴリ：企業ブログ・リサーチ・ビジネス
https://blogs.nvidia.com/
<br>

- **TensorFlow Blog**
組織名：TensorFlow
更新頻度：1ヶ月に数本
言語：英語
カテゴリ：開発
https://blog.tensorflow.org/
<br>

- **Google DeepMind Blog**
組織名：Google DeepMind 
更新頻度：1ヶ月に数本
言語：英語
カテゴリ：企業ブログ・リサーチ・サービス内容
https://deepmind.google/
<br>

- **ScienceDaily**
組織名：ScienceDaily
更新頻度：1週間に数本
言語：英語
カテゴリ：リサーチ・ニュースhttps://www.sciencedaily.com/news/computers_math/artificial_intelligence/
<br>

- **Tech Xplore**
組織名：Science X Network
更新頻度：ほぼ毎日
言語：英語
カテゴリ：論文・ニュース
https://techxplore.com/
<br>

- **Techmeme**
組織名：Techmeme
更新頻度：ほぼ毎日
言語：英語
カテゴリ：ニュース
https://techmeme.com/
<br>

ここまで読んでいただきありがとうございました！この記事が参考になったと思った方は拡散をお願いできますと嬉しいです！他にもこんなサイトもあるよという方は是非、教えていただけましたら学びになります。

参考サイト：
- https://feedly.com/i/top/ai-blogs
- https://mrnouman.medium.com/top-ai-blogs-and-websites-to-follow-in-2024-3cd7cee69bd7
時系列データかイベントデータか？迷わないために

<font color="Grey">*[Time series or event data? Get less confused](https://aiven.io/blog/time-series-or-event-data-get-less-confused)の翻訳です。*</font>

2021年7月15日

# 時系列データかイベントデータか？混同を減らそう

時系列データとは何か？どのようなデータなのでしょうか？時系列データとイベントデータの見分け方をご覧ください。

[時系列データ](https://aiven.io/time-series-databases)は、異なる時間に取得されたデータ・ポイントまたは測定値の集まりと定義することができます（1つの時点に関する多くのオブジェクトに関するデータとは異なります）。そのため、構造的には、時系列データはイベントストリームと多くの特徴を共有している。


この記事では、この2つを見分けるためのヒントを紹介します。


### タイムスタンプはあるか？


時系列データには必ずタイムスタンプがあり、イベントデータにも通常タイムスタンプがあります。イベント・データも通常そうです。このことを分かりにくくしているのは、非常に多くの他のデータモデルもタイムスタンプを含んでいるということです。


### 更新されたことはありますか？


時系列データもイベントストリームも更新されることはありません。データが記録された後、その記録は不変です。時系列データは、ある時点から収集されたデータです。イベントは（その名の通り）1つのイベントを指す。後で何か別のことが起これば、それはどちらの場合も新しいデータ・ポイントとなる。


### フィールドはいくつありますか？


時系列データには通常、各データポイントに1つの測定値しかありません。また、どの測定値であるか、どのサーバーとCPUに関連しているかなどを示す多くの「ラベル」を含む場合もあります。


イベントは通常、発生したイベントの詳細を提供するため、より多くのフィールドを持つ。ユーザーがログインした場合、数値の測定値だけでなく、ユーザーとおそらくリファラー情報を取得します。


### この値を時系列でグラフ化しますか？


時系列データのもう一つの特徴は、通常、ポイント・イン・タイムの測定であり、時間の経過とともに、また通常、複数の測定項目にわたって、想像を絶するほど多くの回数繰り返されるため、生のデータを扱うのが難しいということです。グラフがきれいで、特にこのデータに対して定量的な質問をすることに意味があるならば、それは時系列データとして特徴づけることができる。


一連の無関係な単発メッセージを送信するイベントは、このモデルにうまく当てはまらないので、これも有用な区別である。


## 仕事に適した道具


データを理解し、モデリングすることは、次のアプリケーションに導入したいツールや機能を特定するのに役立ちます。より複雑なアプリケーションでは、必要なプラットフォームを構築するために複数のデータソリューションを使用することがありますが、ニーズが何であれ、Aivenのオープンソース製品カタログから選択することができます。


今日の記事の2つの例では、ある場所から別の場所へのイベントのストリーミングには[Aiven for Apache Kafka](https://aiven.io/kafka)を、時系列データのニーズには[Aiven for M3](https://aiven.io/m3)を試してみてください。


## まとめ


Aivenのサービスをまだご利用でない方は<https://console.aiven.io/signup>から無料トライアルにお申し込みください！


また、[changelog](https://aiven.io/changelog)や[blog](https://aiven.io/blog)のRSSフィード、または[LinkedIn](https://www.linkedin.com/company/aiven/)や[Twitter](https://twitter.com/aiven_io)のアカウントをフォローし、製品や機能関連の最新情報をご確認ください。
nftables が動かない AL2 kernel-4.14.336-255.557.amzn2.x86_64

## AWS Lightsail で yum update を実行したら nftables が動かなくなった

理由がさっぱり分からないが、yum update したら nftables が動かなくなって大層あせった。

```
[root@ip-XX-XX-XX-XX ~]# nft add table inet hoge
Error: Could not process rule: Operation not supported
add table inet hoge
^^^^^^^^^^^^^^^^^^^^
```

過去スナップショットからの復元を考慮したが、現インスタンスに上書き復旧する方法が無い。新規インスタンスに復元した場合、IPv6 アドレスが変わってしまうので困る。

仕方無しに、新規インスタンスで起動し、更新されたパッケージを比較してみるが、nftables に関わりそうなところには更新は入っていなかった。

残るは kernel 位なので、試しに使用されている最新のカーネルを削除して見たところ、無事起動し、nftables も利用可能になった。

## 復旧手順

現行の最新 kernel を削除し、リブートするだけ。

```
[root@ip-XX-XX-XX-XX ~]# uname -a
Linux ip-XX-XX-XX-XX.ap-northeast-1.compute.internal 4.14.336-255.557.amzn2.x86_64 #1 SMP Tue Jan 30 09:50:19 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
[root@ip-XX-XX-XX-XX ~]# /bin/rpm -q kernel
kernel-4.14.334-252.552.amzn2.x86_64
kernel-4.14.336-253.554.amzn2.x86_64
kernel-4.14.336-255.557.amzn2.x86_64
[root@ip-XX-XX-XX-XX ~]# /bin/rpm -e kernel-4.14.336-255.557.amzn2.x86_64
[root@ip-XX-XX-XX-XX ~]# /bin/rpm -q kernel
kernel-4.14.334-252.552.amzn2.x86_64
kernel-4.14.336-253.554.amzn2.x86_64
[root@ip-XX-XX-XX-XX ~]# /sbin/init 6
```

## 確認

```
[root@ip-XX-XX-XX-XX ~]# nft list tables
table inet filter
[root@ip-XX-XX-XX-XX ~]# uname -a
Linux ip-XX-XX-XX-XX.ap-northeast-1.compute.internal 4.14.336-253.554.amzn2.x86_64 #1 SMP Fri Jan 12 09:58:17 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
[root@ip-XX-XX-XX-XX ~]# 
```

Lightsail でのシリアル・コンソール利用可否や grub.cfg の確認等も含め、
お陰で 4時間程無駄になった。

# 追記

CVE を見ると netfilter 周りの問題が幾つか散見されるが、まさかその影響で乱暴にごっそり機能ごと落としたとか？
それはそれで、凄く困るんだけれど？

https://alas.aws.amazon.com/cve/html/CVE-2023-6040.html

https://alas.aws.amazon.com/AL2/ALAS-2024-2443.html

# 結末

kernel-4.14.336-256.559.amzn2.x86_64 がリリースされたので、入れてみた所、問題なく nftables が利用できた。本件は、これで終了。

```
[root@ip-XX-XX-XX-XX ~]# nft list tables
table inet filter
[root@ip-XX-XX-XX-XX ~]# uname -a
Linux ip-XX-XX-XX-XX.ap-northeast-1.compute.internal 4.14.336-256.559.amzn2.x86_64 #1 SMP Tue Feb 13 09:50:28 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
[root@ip-XX-XX-XX-XX ~]# 
```
GWT は日本語の文字も、サーバクライアント通信も簡単

# GWTは、いちいち日本語を通信する際の文字処理もそのままでできますよ
![GIF 2024-02-18 4-50-09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132663/b9c916eb-7884-e41e-5668-ca51193ab08b.gif)
RailsのActive StorageでCloud Storageを設定をする

# 概要
Rails7でActive Storageを使用して、Google CloudのCloud Storageの設定の仕方の記事です。設定するときに、このような記事がありそうでなかったので書きます。

# 前提
Active Storageの設定が終わって、保存先が以下のlocalの設定では動くものとします。
```development.rb or production.rb
  config.active_storage.service = :local
```
Active Storageの設定が終わっていな人は[こちら](https://qiita.com/nagumo01/items/76b97a98e83604150496)を参考に設定してください。

# Google Cloudの設定
### Cloud Storageの設定
1. Cloud Storageを開いてバケットの作成
1. ロケーションタイプ、リージョンを設定（単一リージョンが1番安い）
1. デフォルトのクラスやアクセス制御を設定
1. 公開アクセスを禁止で問題ない

### サービスアカウントの作成
1. APIとサービスを開いて、メニューから認証情報を開く
1. 認証情報を作成からサービスアカウントを選択
1. サービス名を入力して、ロールをCloud Storageのオブジェクト管理者に設定して完了
1. 作成したサービスアカウントを選択、メニューからキーを選択、鍵を追加、新しい鍵を作成、キーのタイプをJSONで作成し保存

# Railsの設定
1. 以下をGemfileに追加
    ```sh
    gem "google-cloud-storage"
    ```
1. google-cloud-storageをインストール
    ```sh
    bundle install
    ```
1. config/storage.ymlに以下を記述する。{プロジェクト名}、{バケット名}に先ほど設定したものを記入
    ```yml
    google:
      service: GCS
      project: {プロジェクト名}
      credentials:
        {
          "type": "service_account",
          "project_id": "<%= Rails.application.credentials.dig(:google_cloud_storage, :project_id) %>",
          "private_key_id": "<%= Rails.application.credentials.dig(:google_cloud_storage, :private_key_id) %>",
          "private_key": "<%= Rails.application.credentials.dig(:google_cloud_storage, :private_key) %>",
          "client_email": "<%= Rails.application.credentials.dig(:google_cloud_storage, :client_email) %>",
          "client_id": "<%= Rails.application.credentials.dig(:google_cloud_storage, :client_id) %>",
          "auth_uri": "<%= Rails.application.credentials.dig(:google_cloud_storage, :auth_uri) %>",
          "token_uri": "<%= Rails.application.credentials.dig(:google_cloud_storage, :token_uri) %>",
          "auth_provider_x509_cert_url": "<%= Rails.application.credentials.dig(:google_cloud_storage, :auth_provider_x509_cert_url) %>",
          "client_x509_cert_url": "<%= Rails.application.credentials.dig(:google_cloud_storage, :client_x509_cert_url) %>",
          "universe_domain": "googleapis.com"
        }
      bucket: {バケット名}
    ```
1. Credentialsにキーを書く
    vimで開いて
    ```sh
    EDITOR="vim" bin/rails credentials:edit
    ```
    先ほど作成したJSONのキーを参考に以下を記入して保存
    jsonファイルから"と,を削除すればコピペするだけ
    ```yml
    google_cloud_storage:
        type: service_account
        project_id: xxxx
        private_key_id: xxxx
        client_email: xxxx
        private_key: xxxx
        client_id: xxxx
        auth_uri: xxxx
        token_uri: xxxx
        auth_provider_x509_cert_url: xxxx
        client_x509_cert_url: xxxx
    ```
1. development.rbまたはproduction.rbで保存先をgoogle cloud storageに設定
    ```rb
    config.active_storage.service = :google
    ```

これで設定完了
【Xcode Cloud】OSS側でプラグイン使用時にCI環境でビルドできない時の対応

## 概要
普段、Xcode Cloudを使用してビルド・リリースをしているのですが、
LicenseListというライブラリを入れたら、Xcode Cloudのビルドでエラーが発生するようになりました。

本記事はその対応内容のメモになります。

## まず最初に
LicenseListというライブラリについて
https://github.com/cybozu/LicenseList

このライブラリはOSSのライセンス情報を一覧で画面に表示してくれるライブラリです。
使い方は、このライブラリを入れて、指定の画面を起動するだけ！
開発時はOSSを入れたり消したりするので、このライブラリは非常にありがたいです :pray: 

## 起こったエラーの内容
下記エラーがXcode Cloudのログに書かれてました。
```
Validate plug-in “PrepareLicenseList” in package “licenselist”
“PrepareLicenseList” is disabled
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469133/4e463e86-d277-7d39-740c-10e9f876078b.png)
※黒塗りはアプリ名です。

## 原因
外部のライブラリが`XcodeBuildToolPlugin`を組み込んでビルドを行う場合、安全性を考慮して、ビルドが失敗するようになっていました。

`LicenseList`では`PrepareLicenseList`というプラグインをビルド時に実行しています。

## 対応
Xcode Cloudで下記コマンドを実行するような`ci_post_clone.sh`ファイルを作成しました。
```sh
defaults write com.apple.dt.Xcode IDESkipPackagePluginFingerprintValidatation -bool YES
```

### 内容
xcodebuildコマンド時に`-skipPackagePluginValidation`オプションをつければ良いが、Xcode Cloud環境ではコマンドのオプションはカスタムできません。

したがって別の対応として、対応欄に書いたコマンドを実行することで、上記オプションと同じ設定内容でビルドが実行されます。

## 感想
いつも便利なOSS群のおかげで、楽に開発ができています。ありがとうございます :pray: :pray: :pray: 
Xcode Cloud環境でもオプションのカスタマイズとかできれば、わざわざファイルなんか作らなくていいからありがたいな〜。

## 参考
https://zenn.dev/kyome/articles/56974297795cb5
https://forums.swift.org/t/telling-xcode-14-beta-4-to-trust-build-tool-plugins-programatically/59305
空ではない既存のGitリモートリポジトリに対して初期commitをgit pushする手順

# はじめに

Azure DevOpsのReposなど、一部のGitリモートリポジトリでは、空のGitリモートリポジトリに加えて、README.mdファイルを含めた状態でリモートリポジトリを作成することが出来ます。

しかし、README.mdファイルを含めた状態で作成されたリモートリポジトリは、空のリモートリポジトリとは手順が異なり、以下のコマンドでリモートリポジトリに対して初期commitをpushすることができません。

```
$ git init
$ git remote add origin <gitリポジトリのURL>
$ git commit -m "<コミットメッセージ>"
$ git push -u origin main
```

一番手っ取り早い方法は、`git clone`後に.gitディレクトリ（フォルダ）を、Git管理したい既存のディレクトリへ移動し（あるいは既存ディレクトリの中身をcloneされたディレクトリ配下に移動し）、その後`git push`&`git commit`する方法ですが、スマートな方法とはいえません。やはり、既存ディレクトリをそのままGit管理出来ることがスマートであるといえます。

ということで、以下に自分のメモをかねて手順をまとめておきます。
（たまにこういうケースがあり、この手順をよく忘れてしまう・・・）


# 手順

```shell
$ git init
$ git remote add origin <gitリポジトリのURL>
$ git pull origin main
$ git add -A
$ git commit -m "<コミットメッセージ>"
$ git push -u origin main
 ```

# おまけ

ブランチ名をmaster→mainに変更する
```
$ git branch -m master main
```
【TSエラー】型 'string' の式を使用して型にインデックスを付けることはできないため、要素は暗黙的に 'any' 型になります。   型 'string' のパラメーターを持つインデックス シグネチャが型 ' に見つかりませんでした。

## はじめに

ReactでTypeScriptを書いていたとき、タイトルのエラーに遭遇したので備忘録として残します。

## 発生した問題

オブジェクトから、メソッドの引数に対応したkeyのvalueを取得するとき、エラーが発生しました。
以下再現コードです。

```ts
// 飼っている猫のname(key)に対応するageを取得したい

const catAge = (name: string) => {
    const { age } = catObject[name];
    return age;
};

const catObject = {
    虎丸: {
        age: 3,
        breed: "キジトラ",
    },
    ミケ: {
        age: 7,
        breed: "三毛猫",
    },
};
```
エラー
```
型 'string' の式を使用して型 '{ 虎丸: { age: number; breed: string; }; ミケ: { age: number; breed: string; }; }' にインデックスを付けることはできないため、要素は暗黙的に 'any' 型になります。
  型 'string' のパラメーターを持つインデックス シグネチャが型 '{ 虎丸: { age: number; breed: string; }; ミケ: { age: number; breed: string; }; }' に見つかりませんでした。
```

## 解決方法
結論から言うと、今回は`index signature`を使用して解決しました。
`Recoed`を使用する解決策もありましたが、今回は`Recoed`を使うメリット（key をユニオン型で指定することが可能）があまり活かせないと判断しました。

以下、解決したコードです。
```ts
interface Cat {
    [name: string]: { age: number; breed: string };
}

const catObject: Cat = {
    虎丸: {
        age: 3,
        breed: "キジトラ",
    },
    ミケ: {
        age: 7,
        breed: "三毛猫",
    },
};

const catAge = (name: string) => {
    const { age } = catObject[name];
    return age;
};
```

interfaceを使用して、オブジェクトの取り得る値を記述しておくことでエラーを回避できます。


## 参考サイト
https://zenn.dev/buzzkuri_tech/articles/3807d042d310a7#1.-index-signature-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B

https://www.typescriptlang.org/docs/handbook/2/objects.html#index-signatures
ABC340の記録

# はじめに
2完どまりになってしまった。厳しい。

https://atcoder.jp/contests/abc341

成績：AB2完（250）

# A
1と0のセットがn個あって最後に1がついていると解釈する。
```python:A
n = int(input())
print("10"*n + "1")
```

# B
問題を理解するのに時間がかかってしまった。
n-1番目がなくなるまでn番目に変換し、n-1番目がなくなったらn-2番目にさかのぼって補充して……と考えていたが提出してみるとTLEだった(WAも2個あったし)
```python:B-TLE
n = int(input())
A = list(map(int, input().split()))
ex = []
for i in range(n-1):
    s,t = map(int,input().split())
    ex.append([s,t])
while A[0] >= ex[0][0]:
    for i in range(n-2,-1,-1):
        if A[i] >= ex[i][0]:
            A[i] -= ex[i][0]
            A[i+1] += ex[i][1]
            break
print(A[-1])
```

じゃあどうすんねん！と一瞬思ったが、前から変換できるだけ変換していけばいいことにすぐ気づいた。
```python:B-AC
n = int(input())
A = list(map(int, input().split()))
ex = []
for i in range(n-1):
    s,t = map(int,input().split())
    ex.append([s,t])
for i in range(n-1):
    sho = A[i]//ex[i][0]
    A[i+1] += ex[i][1]*sho
print(A[-1])
```
前回のBは言われたとおりにやればできたのでその感じでやってしまった（なんで前回のBが200点でこれ150点なんだよ）。
これで30分かけたのが敗因1。

# C
問題を見たときの印象は「全探索しかなさそうだけど間に合わなさそ～～」だった。計算量が$O(HWN)$で、最大$1.25\times10^8$なので無理だろうと考えてしまった。
しかし高速化の方法が全然思いつかない（端のマスを探索しないとかあるが焼け石に水だろうし）のでとりあえず全探索で実装しようとしたが、ミスを連発して心が折れてしまい時間切れに。

正解は全探索だったので終了後実装してみた。
```python:C
h, w, n = map(int, input().split()) 
t = input()
route = [[0,0]]
for i in t:
    if i == "L":
        route.append([-1,0])
    if i == "U":
        route.append([0,-1])
    if i == "R":
        route.append([1,0])
    if i == "D":
        route.append([0,1])
grid = []
for i in range(h):
    grid.append(input())
cnt = 0
for i in range(w): #スタート地点のx座標を0からw-1まで動かす。
    for j in range(h): #スタート地点のy座標を0からh-1まで動かす。
        x = i
        y = j
        for k in range(len(route)):
            x += route[k][0]
            y += route[k][1]
            if w-1 >= x >= 0 and h-1 >= y >= 0 and grid[y][x] == ".":
                pass
            else:
                break
        else:
            cnt += 1
print(cnt)
```
とりあえず入力例1と2が合ったのでどんなもんかなと投げてみたら860 msでACでした。結構余裕あんのかい！！
$10^8$くらいでも全然通るんですね。勉強になりました。というか全探索だと思ったならとりあえずやってみればいいわけで、こういうのをスッと実装して投げてみるというのを速くできないと今後きつそう。

前回は新しいアルゴリズムを身に着けたいな～とか思っていたが、まず実装を速くできるようにしていくのが先決に思えてきた。少しずつでもやっていきましょう。
OpenWRTとWireGuardでIPv6を通す為に必要な設定

# はじめに  
下記の構築が完了していることを前提とします
- OpenWRT
- WireGuardのインストール
- IPv4でのトンネル疎通確認

そしてAllowedIPsに`::/0`を追加したのに繋がらない事で苦しまれていることを前提とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/e2877a8d-c64e-d46e-08df-9338357879de.png)

# 設定内容
## 1. IPアドレスにULA(ローカルIPv6アドレス)を設定する
これはリーチできる他のネットワークと重複しなければ何を使っても良い…と思います。
自分はfd00::1を使用しました。サブネットは不要。
    
## 2. PeerのIPアドレスにもULAを設定する
許可されたIPのところに、適当に設定しましょう。
自分はfd00::2のように、順番に割り振りました。

## 3. クライアント側のコンフィグにもULAを設定する
IPアドレスはAddressにカンマ区切りで書けばOKです。
Peerに設定したのと同じのにしてください。
もしくはPeerをレンジで許可したらその範囲のIPv6アドレスは適当に使えます。多分。

```
[Interface]
PrivateKey = <見せられないよ！>
Address = 192.168.200.2/32, fd00::2
DNS = 192.168.0.1

[Peer]
PublicKey = <見せられないよ！>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <見せられないよ！>:<見せられないよ！>
PersistentKeepAlive = 25
```

## 4. IPv6のWANインターフェースからIPv6 Source Routingを無効にする
下記の通り、IPv6のWANインターフェースのIPv6 source routingのチェックを外してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/9733be77-eb6a-b8f4-7eeb-f8e5dcc5cd13.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/6fc2d703-f7f3-f9d7-1a65-3d22b9815468.png)
    
## 5. `設定`→`ファイアウォール`→`NATルール`でマスカレード設定する
コマンドとか無しでこれだけでOKでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/2cbfdbbb-7af9-1df6-00ba-1247ed578283.png)

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314743/28575dab-56d1-1fa3-3505-7449424365a3.png)
OpenWRTのグローバルIPv6アドレスが見え、IPv6で通信ができることがわかります。
確定申告のためAWS利用料をコマンドで求めようとしたが…

確定申告の時期です。

Google Workspace に Microsoft 365、お名前.com、エックスサーバー、開発に使っているAWSなど、まとめて「通信費」として計上しているのですが、AWSはドル建てなので為替の影響を受け、月毎の請求額が変わります。

本来は毎月記帳するべきですが放置してしまい、月毎の請求書またはCSVファイルを12回ダウンロードすることになりそうなので、コマンドで毎月の請求額を取得してみたわけです。

AWS CloudShell から次のワンライナーを実行すると、

```
aws ce get-cost-and-usage --time-period Start=2023-01-01,End=2024-01-01 --granularity MONTHLY --metrics UnblendedCost|jq -r '.ResultsByTime[]|"\(.TimePeriod.Start),\(.Total.UnblendedCost.Amount)"'|awk -F, '{printf "%s, %.2f\n",$1,$2}'
```

下のようにUSDで結果が得られます。

```
2023-01-01, 6.59
2023-02-01, 6.22
2023-03-01, 6.59
2023-04-01, 6.47
2023-05-01, 6.52
2023-06-01, 6.47
2023-07-01, 6.59
2023-08-01, 6.59
2023-09-01, 6.47
2023-10-01, 6.59
2023-11-01, 6.47
2023-12-01, 6.59
```

請求書に記載のJPYで返す方法が見つからないです。
（誰か知っていたら教えて欲しい）

クレジットカード明細のCSVファイルも、月毎にダウンロードする方法しかないので、諦めて12回繰り返すしかなさそう。

参考にならない記事でしたね。

ちなみに、AWS利用料にも消費税が上乗せされているので消費税の仕入税額控除を受けられます。