OmniAICreator/Qiita-1.07M huggingface dataset:
Node.js v14のOptional chainingについて調べてみた

## はじめに
仕事でNode.js v14を使っていますが、開発者が`?.`という記述を使っていました。イマイチ良く分からなかったので、整理しました。

## Optional chainingとは

オブジェクトのプロパティの値を明示的に確認せずに読み込むことができる。

## 具体例

### Optional chainingを使わない場合

以下のように`user`と`user.name`が存在することを確認してから、`user.name.kana`を取得する必要がある。

```js
let kana = null;
if (
  user &&
  user.name &&
) {
  kana = user.name.kana;
}
```

### Optional chainingを使う場合

上記のように、`user`と`user.name`の存在を明示的に確認しなくても、以下のように`user.name.kana`にアクセスできる。

```js
const kana = user?.name?.kana;
```

## 参考
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining
https://shisama.hatenablog.com/entry/2020/04/22/011221
BastilleBSDでupgrade

13.1Rが出たので、hostをfreebsd-updateでupgradeした後にBastilleBSDのjailもupgradeしてみました。

```
% sudo bastille upgrade 13.0-RELEASE 13.1-RELEASE
% sudo bastille upgrade 13.0-RELEASE install
% sudo bastille upgrade 13.0-RELEASE install
% sudo bastille list -a
```

素のjailだと一つずつfreebsd-updateしなければなりませんが、BastilleBSDだと一気にupgradeしてくれて便利です。

13.1Rにするのに13.0-RELEASE installはちょっと不思議な感じですが、

upgradeではreleaseは入らないので、新規作成の場合にはbasefileでrelaseファイルを入れておく必要があります。

リリースのパッチレベルを上げるupdateは以下のようにできました。

```
% sudo bastille update 13.1-RELEASE
```
ログインに関して

ログインに失敗するケースについて

条件
IDPASSWORDはこれまでとかわらない。
ログインしようとすると、処理が終わらない
シークレットモードでは処理が進んだのでキャッシュがあやしい

調査メモ
キャッシュがそもそもわかっていないので調べる。
ブラウザにページ情報の履歴を保存してページの表示高速化を行う仕組み
ブラウザとwebサーバーの間にある様子
ログイン処理に関してはセッションがかかわっている様子。

いまはここまで？
access2000の作法 その5

# 概要
access2000の作法、調べてみた。
ダミーデータを入れてみた。

# 参考にしたページ。

https://qiita.com/Q11Q/items/1793f43a1fd4dd3f480f

# テーブルにデータを挿入する手順。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く　キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く

```
Private Sub コマンド1_Click()
	Set db = CurrentDb
	GenRecs db.OpenRecordset("売上テーブル", DB_OPEN_DYNASET, DB_APPEND_ONLY)
	db.Close: Set db = Nothing
	MsgBox "ok"
End Sub
Sub GenRecs(rs)
	varSites = Array("新宿", "渋谷", "池袋", "上野", "品川")
	varProducts = Array("烏龍茶", "オレンジジュース", "グレープジュース", "コーヒー", "紅茶")
	varPrices = Array(150, 250, 250, 180, 180)
	With rs
		For i = Date - 30 To Date
			For j = 0 To (Int(6 * Rnd) + 5)
				.AddNew
				.Fields("支店").Value = varSites(Int(5 * Rnd))
				.Fields("販売日").Value = i + Rnd
				intProdId = Int(5 * Rnd)
				.Fields("商品").Value = varProducts(intProdId)
				.Fields("個数").Value = Int(10 * Rnd) + 2
				.Fields("売上").Value = .Fields("個数").Value * varPrices(intProdId)
				.Update
			Next
		Next
	End With
End Sub

```

- フォームを閉じる
- 保存する


以上。
Tailwind CSS for RailsがDockerコンテナ内で反映されないときの対処法。purge設定に"html.erb"を含めていないことが原因

Tailwind CSS for Railsがローカルの開発環境では動いていたのに、Dockerコンテナ内で突然反映されなくなるという現象に遭遇しました。

まず、よくある原因は次の通りです。

## よくある原因
tailwind.config.jsのpurge設定が正しくない。 

```
# ディレクトリ構造(Dockerコンテナ内)
/var/www
     └── myapp  # Rails
         ├── app
         │   ├── ...
         │   ├── ...
         │   └── views
         ├── ...
         ├── config
         │   ├── ...
         │   ├── tailwind.config.js
         │   └── ...
         ├── ...
         └── ...
```

```myapp/config/tailwind.config.js
module.exports = {
  content: [
    // "./app/**/*.{html,js}",        <= パス間違い
    "../myapp/app/**/*.{html,js}",  //<= 正
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

※"puege"はtailwindcss v3.0 から"content"に変更されたようです。

しかし、この設定ではRailsアプリ上で意図したようにCSSが反映されません。
Tailwind CSSをRailsで運用する場合にはもう一つ注意点があります。

## 結論
tailwind.config.jsのpurge設定にhtml.erbを指定する。 
```myapp/config/tailwind.config.js
module.exports = {
  content: [
    // "../myapp/app/**/*.{html,js}",
    "../myapp/app/**/*.{html.erb, html, js}", //<="html.erb"を指定する
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
```

$ `rails tailwindcss:build`を実行後、無事にTailwind CSSが反映されました。
[JavaScript, eslint]for...in→forEachに変更した時の注意点

# はじめに

最近アサイン中のプロジェクトでのeslintが厳格化したので、その解析エラーの対応をしていた時のメモ

# ハマったとこ①

エラーを吐くソースコードはコレ。

ちなみにVueで書いてます。

```jsx
data() {
  return {
    amountErrors: []
  };
},
created() {
	for (let formName in this.errors) {
	  let messageOrder = formName.split('.')[1];
	  if (formName.match(/amount/)) {
	    this.amountErrors[messageOrder] = this.errors[formName][0];
	  }
	});
},
```

実際のエラーはコレ。

```
for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array. (no-restricted-syntax
```

Deeplによる日本語訳は

> for..inループはプロトタイプチェーン全体を繰り返し処理しますが、これは事実上望んだものではありません。Object.{キー,値,エントリ}を使用し、結果の配列に対して反復処理を行います（無制限構文）。
> 

とのこと。

ちょっと理由まで把握しきれませんでしたが、eslintとしては「事実上望んだものではありません」とのことなので、エラーが出るんだな、と把握

# ググってみると…

とはいえ、先ほどのエラー文で検索した結果の記事の一つに

> 「私はforEachに変更して解決しました。」

とあったので、参考にさせてもらった

「なんでforEach？」と思ったが

- 反復処理ができる（これは知っている。PHPとかとイメージ合う）
- コールバック関数で引数を持たせることができる（？！）

ことが分かりました。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

後者の「引数を持たせることができる」ってのが前述のeslintのエラー文の「Object.{キー,値,エントリ}を使用し」に該当するんだな、と推測

---

※追記
ここについては @htsign さんのコメントが参考になるので、合わせてご確認くださいませ。

---

# 対応

なので、さっきのコードを以下のように変更

```jsx
Object.keys(this.errors).forEach(function makeErrors(formName) {
  let messageOrder = formName.split('.')[1];
  if (formName.match(/amount/)) {
    this.amountErrors[messageOrder] = this.errors[formName][0];
  }
});
```

for...in構文をforEachに変更しただけ

これでeslintは通るようになりました。よかったよかった。

### その他参考

https://stackoverflow.com/questions/19445599/accessing-this-in-a-foreach-loop-results-in-undefined

# ハマったところ②

さらにハマりました。笑

原因は元々for分内で使っていた`this`

forEachに変更したコードをブラウザで動かすと

```jsx
Uncaught TypeError: Cannot read properties of undefined (reading 'amountErrors')
```

と言うコンソールエラーが表示されてコードが動きませんでした。

dataプロパティであるamountErrorsを参照しているthisがundefinedになっているらしい。

## 対応

どうもstrict モードだと関数コンテキスト内ではグローバルコンテキストが参照できずundefinedが返る。

なのでforEach内でなにもしなければ`this`は `undefined`になる。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/this#%E9%96%A2%E6%95%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88

じゃあどうするのかと言うとforEachは第二引数に値を渡すと、渡された値がforEach内でも使える、とのこと。（先ほどのforEachの説明のところにしれっと書かれている）

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#parameters

なので、こうしてみた。

```jsx
Object.keys(this.errors).forEach(function makeErrors(formName) {
  let messageOrder = formName.split('.')[1];
  if (formName.match(/amount/)) {
    this.amountErrors[messageOrder] = this.errors[formName][0];
  }
}, this);
```

これで今まで通りカードが動くようになり、マージリクエストを出すことができました〜

# おわりに

普段PHP使ってる自分からしたらJSの forEachはPHPと同じように使えない点で、すごくクセがある気がしてなるべく避けていたんですが今回いい機会でした。笑

特にforEachは`return;` や`break;`による中断処理ができない点で詰まったトラウマがあって…

第一引数のクロージャーの中にもいろいろ引数を渡すことができて、できること多いんだなぁと知れたので、少しづつ慣れていこうかと思います

お読みいただきありがとうございました。
2022/5/28主にITとかセキュリティの記事

VMware製IDアクセス管理製品の脆弱性狙う攻撃コードが公開 - パッチから1週間強で
https://www.security-next.com/136862

「Citrix ADC」「Citrix Gateway」にサービス拒否の脆弱性
https://www.security-next.com/136838

HTTPクライアント機能を提供するライブラリに脆弱性 - CMSにも影響
https://www.security-next.com/136842

「Trend Micro Apex One」に権限昇格の脆弱性 - アップデートで修正
https://www.security-next.com/136858

「個人情報を考える週間」、2022年は5月30日から
https://www.security-next.com/136865

サイバー犯罪者集団「Lapsus$」による被害が相次ぐ
大手IT企業に次々と不正侵入　多要素認証を破る手口も報告される(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/051900174/

脆弱性
セキュリティーの問題を引き起こす欠陥(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/091900032/051800045/

日本を覆うクラウドロックイン、政府が目指す「マルチクラウド」が危ない(5/27)
https://xtech.nikkei.com/atcl/nxt/column/18/00989/052400085/

マカフィーが控訴取り下げ、サードウェーブへの賠償命じた一審判決が確定(5/27)
https://xtech.nikkei.com/atcl/nxt/news/18/12938/

半導体大手がソフトウエア企業の大型買収、BroadcomがVMwareを約610億ドルで(5/27)
https://xtech.nikkei.com/atcl/nxt/news/18/12936/

ランサムウェア攻撃の被害にあった日本企業、75%が未公表(5/27)
https://www.zaikei.co.jp/article/20220527/674108.html

DeFiプロジェクトやブロックチェーンの台頭で懸念されるセキュリティリスク(5/27)
https://japan.zdnet.com/article/35188075/

メールをクリーンアップするように警告する新手のフィッシング詐欺に注意(5/27)
https://news.mynavi.jp/techplus/article/20220527-2352238/

米商務省、サイバーセキュリティー関連ソフトなどの輸出管理に関わる最終規則を発表(5/27)
https://www.jetro.go.jp/biznews/2022/05/f5132ae13ccb19c7.html

なぜ、データバックアップへの企業投資の優先度が急上昇しているのか(5/27)
https://japan.zdnet.com/article/35188066/

ゼロトラストは攻撃者から見たら実はセキュアではない
ペンテスターの目線から考える、監視システムの現状ペンテスターから見た最近のセキュリティ状況 #1/4(5/27)
https://logmi.jp/tech/articles/326637

2022 年 6 月 7 日 〜 8 日：データ分析、データベースをテーマに Data Analytics & Database OnAir 開催
https://cloud.google.com/blog/ja/topics/events/2022june-data-analytics-database-onair

【本日の材料と銘柄】ブロードコム、ヴイエムウェア買収で合意(5/27)
https://finance.yahoo.co.jp/news/detail/20220527-00935704-fisf-stocks

フェイクニュース、デマツイートを拡散する人に共通する意外な特徴とは？ -- 追手門学院大学のニュース発信サイト「OTEMON VIEW」に掲載(5/27)
https://japan.cnet.com/release/30698885/?ref=rss

「経済安全保障の確保に向けて２０２２～技術・データ・製品等の流出防止～」を公表しました。(5/27)
https://www.moj.go.jp/psia/keizaianpo.leaflet.html

Windows 11初のフィーチャーアップグレード版公開は10月中旬か(5/27)
https://news.mynavi.jp/techplus/article/20220527-2352726/

アプリがつかむ患者の心　課題突破のデザインを(5/27)
https://www.nikkei.com/article/DGXZQOCD24DB10U2A520C2000000/

「Google ドキュメント」で複数テキストを選択して一括編集が可能に
離れたテキストへのアクションが一度に可能。順次ロールアウトへ(5/27)
https://forest.watch.impress.co.jp/docs/news/1412425.html

ショートカットキーを覚えてパソコン操作を時短しよう！ 【2022年5月27日】
https://dekiru.net/article/22894/

5月30日以降はあなたのメールソフトでGmailの送受信ができなくなるかも！
ユーザー名とパスワードのみでログインするアプリがブロックされるように(5/27)
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1412401.html

シスコ、「ハイブリッドワークに関するグローバル調査 2022」の結果を発表(5/27)
https://www.nikkei.com/article/DGXZRSP633219_X20C22A5000000/
access2000の作法 その4

# 概要
access2000の作法、調べてみた。
テーブル作ってみた。

# テーブルを作る手順。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く　キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く

```
Private Sub コマンド0_Click()
	Set db = CurrentDb
	db.Execute "CREATE TABLE 売上テーブル " & "(販売コード AUTOINCREMENT " & "CONSTRAINT PrimaryKey PRIMARY KEY, " & "支店 TEXT(255), " & "販売日 DATETIME, " & "商品 TEXT(255), " & "個数 INTEGER, " & "売上 CURRENCY);"
	db.Execute "CREATE INDEX 販売日 " & "ON 売上テーブル (販売日) WITH DISALLOW NULL;"
	MsgBox "ok"
End Sub
```

- フォームを閉じる
- 保存する

以上。
Android で指定した時間後に処理を行う方法についての話

## はじめに

Android で指定された時間後に処理を実行する方法についての備忘録まとめとなります。
「10 秒後に処理を実行したい！」「1 分間隔で繰り返し実行したい。」などの時に実装します。

> Android Developers Reference

- [Handler](https://developer.android.com/reference/android/os/Handler)

## 10 秒後に処理を実行する

```Java
// Java
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // do something
    }
}, 10 * 1000);
```

```Kotlin
// Kotlin
val handler = Handler(Looper.getMainLooper())
handler.postDelayed({
    // do something
}, 10 * 1000)
```

## 1 分間隔で処理を繰り返し実行する

```Java
// Java
final int delayMillis = 1 * 60 * 1000;
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // do something

        handler.postDelayed(this, delayMillis);
    }
}, delayMillis);
```

```Kotlin
// Kotlin
val delayMillis: Long = 1 * 60 * 1000
val handler = Handler(Looper.getMainLooper())
val runnable = object : Runnable{
    override fun run() {
        // do something

        handler.postDelayed(this, delayMillis)
    }
}
handler.postDelayed(runnable, delayMillis)
```
Denoのバージョンを上げたり下げたりする

Node.jsやPythonだと公式Webサイトからインストーラーをダウンロードして…となるところですが（これが本当に辛い）、Denoはコマンド1発でバージョンを上げたり下げたりできます。

## 最新バージョンへ上げる

`deno upgrade`コマンドで最新バージョンへアップデートされます。

```shell:最新バージョンへ上げる
> deno upgrade
```

## 任意のバージョンをインストールする

`--version`フラグで任意のバージョンをインストールできます。

```shell:特定のバージョンをインストールする
# v1.21.0をインストールしたい時
> deno upgrade --version=1.21.0
```

## canary版の最新バージョンへ上げる

canary版は、開発者向けの先行公開バージョンです。
Denoの場合、[GitHubリポジトリ](https://github.com/denoland/deno/commits/main)のmainブランチに新しいコミットが入るたびに、新しいcanaryバージョンがリリースされます。

canary版をインストールするには`--canary`フラグを付けます。

```shell:最新のcanary版へアップデート
> deno upgrade --canary
```

## canary版の任意のバージョンにする

GitHubのコミットハッシュを`--version`フラグで指定します。

```shell:任意のcanary版をインストール
# コミット69be1f3cf7d11bb6b440f5d1e65988ed7c76f53dをインストールしたい時
> deno upgrade --canary --version=69be1f3cf7d11bb6b440f5d1e65988ed7c76f53d 
```

以上、Denoのバージョンを上げたり下げたりする方法でした。
Pythonで環境構築のオススメ(venv/pip)

# 概要

pythonで開発をする時、以下のツールを使っている。
仮想環境 -> venv
パッケージ管理 -> pip



# VenvとPipで環境構築

環境構築をしていく。
```
sudo apt install python3.8-dev
sudo apt install python3.8-venv
mkdir /home/${USER}/venv
python3.8 -m venv  /home/${USER}/venv/test-env
source  /home/${USER}/venv/test-env/bin/activate
pip3 install pip --upgrade
```

pipでパッケージを入れていく。
```
pip3 install -r requirements.txt
```

例)requirements.txt
```
torch==1.12.0
torchvision==0.13.0
pytorch-lightning==1.7.0
```

# (余談)AnacondaではなくVenv&Pipを使う理由
まずAnacondaは仮想環境とパッケージ管理を両方行うツールである。慣れたら大丈夫だと思うが初心者はVenv&Pipの方がシンプルだと思う。Anacondaの気になる点を幾つかあげる。

1. Anaconda社が認めたパッケージしかinstall出来ない為、結局pipを併用する事となる。そうすると、Anacondaとpipで同じlibraryをインストールしてしまう事があり、環境が壊れやすい。
2. パッケージをinstallするのに時間が掛かる。恐らくライブラリー同士のコンフリクトしないかなどの確認をしている為。
Lambda 関数で EC2 インスタンス作成時にエンコードされた認証メッセージが出力された時の対処方法

権限が足りないのは明かです。ただ、Action, Resource がわからないので、対応できません。

エンコードされたメッセージをデコードすることにより、対応ができました。

```
$ aws sts decode-authorization-message --encoded-message <message>
```

関数を作成した時に作成した Lambda の実行ロールに、最小特権のベストプラクティスに則り、一つ一つ出力されたものを追加していきました。

```
...(snip)...
           "Effect": "Allow",
            "Action": [
                "ec2:<xxx>",
...(snip)...
            ],
            "Resource": [
                "<ARN>",
                "<ARN>",
                "<ARN>",
...(snip)...
            ]
```

なお、iam:PassRole も必要なようでしたので、同じく追加しておきました。

（参考）
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-not-auth-launch/
Lambda boto3 の run-instances でEBSボリュームを暗号化した時の嵌り

Lambda 関数で boto3 を利用時、run-instances を使用して EC2 マシンを作成する際にEBSボリュームを暗号化する設定を入れると、インスタンス起動してすぐに Terminate されてしまいました。

```
...(snip)...
        response = client.run_instances(
            BlockDeviceMappings=[
                {
                    'DeviceName': '/dev/xvda',
                    'Ebs': {
                        'VolumeSize': 20,
                        'VolumeType': 'gp3',
                        'KmsKeyId': 'xxxx-xxxx-xxxx-xxxx-xxxx',
                        'Encrypted': True
                    }
                }
            ],
            ImageId='ami-xxxx',
...(snip)...
```

KMS のキーポリシに当該 Lambda 関数の実行ロールを追加したら、Terminate されなくなりました。

```
...(snip)...
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<ACCOUNT-ID>:role/service-role/<ROLE>",
                    "arn:aws:iam::<ACCOUNT-ID>:user/<USER>"
                ]
            },
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<ACCOUNT-ID>:role/service-role/<ROLE>",
                    "arn:aws:iam::<ACCOUNT-ID>:user/<USER>"
                ]
            },
...(snip)...
```

（参考）
https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html#key-policy-default-allow-root-enable-iam
CentOSでホームディレクトリを英語で表示されるように変更する

日本語のCentOSをインストールすると、ホームディレクトリが日本語で表示されます。
英語で表示されるように変更します。

端末を起動し、以下のコマンドを入力して実行してください。
```
$ LANG=C xdg-user-dirs-gtk-update
```


以下の画面が表示されます。
[Update Names]をクリックしてください。
![スクリーンショット 2022-05-28 7.15.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/3f501793-26b0-0f9b-2785-3bdc046b37bb.png)

以上で、作業は終わりです。
Gentoo Linux 2ch(5ch)スレまとめ

# Gentoo Linux
完全なる自分用です
コンパイル中の時や暇なときに良く見ていますが、いちいち過去ログから遡るのは面倒くさいのでまとめました。

夏休み冬休みになれば厨等が湧き、今ではemerge -eで済んでしまうstage1からのインストール、他のディストリビューションを布教してくる人など見ていて面白いですよ。

### 一覧
[Gentoo Linux part1](https://itest.5ch.net/pc/test/read.cgi/linux/1024483126/)
[Gentoo Linux part2](https://itest.5ch.net/pc/test/read.cgi/linux/1041348878/)
[Gentoo Linux part3](https://itest.5ch.net/pc/test/read.cgi/linux/1049981814/)
[Gentoo Linux part4](https://pc.5ch.net/test/read.cgi/linux/1047823838/)
[Gentoo Linux part5](https://pc.5ch.net/test/read.cgi/linux/1065520318/)
[Gentoo Linux part6](https://pc.5ch.net/test/read.cgi/linux/1071138693/)
[Gentoo Linux part7](https://pc3.5ch.net/test/read.cgi/linux/1076059699/)
[Gentoo Linux part8](https://pc5.5ch.net/test/read.cgi/linux/1080398777/)
[Gentoo Linux part9](https://pc5.5ch.net/test/read.cgi/linux/1084107269/)
[Gentoo Linux part10](https://pc5.5ch.net/test/read.cgi/linux/1088540408/)  
[Gentoo Linux part11](https://pc5.5ch.net/test/read.cgi/linux/1094915653/)
[Gentoo Linux part12](https://pc5.5ch.net/test/read.cgi/linux/1100349348/) 
[Gentoo Linux part13](https://pc8.5ch.net/test/read.cgi/linux/1106552166/)
[Gentoo Linux part14](https://pc8.5ch.net/test/read.cgi/linux/1114410802/)
[Gentoo Linux part15](https://pc8.5ch.net/test/read.cgi/linux/1123823485/)
[Gentoo Linux part16](https://pc8.5ch.net/test/read.cgi/linux/1129969471/)
[Gentoo Linux part17](https://pc8.5ch.net/test/read.cgi/linux/1135506335/)
[Gentoo Linux part18](https://pc8.5ch.net/test/read.cgi/linux/1141465277/)
[Gentoo Linux part19](https://pc8.5ch.net/test/read.cgi/linux/1150058871/)
[Gentoo Linux part20](https://pc8.5ch.net/test/read.cgi/linux/1155599053/)
[Gentoo Linux part21](https://pc11.5ch.net/test/read.cgi/linux/1164820259/)
[Gentoo Linux part22](https://pc11.5ch.net/test/read.cgi/linux/1174358448/)
[Gentoo Linux part23](https://pc11.5ch.net/test/read.cgi/linux/1183983773/)
[Gentoo Linux part24](https://pc11.5ch.net/test/read.cgi/linux/1197184271/)
[Gentoo Linux part25](https://pc11.5ch.net/test/read.cgi/linux/1209714287/)
[Gentoo Linux part26](https://pc11.5ch.net/test/read.cgi/linux/1222004664/)
[Gentoo Linux part27](https://pc11.5ch.net/test/read.cgi/linux/1233563294/)
[Gentoo Linux part28](https://pc11.5ch.net/test/read.cgi/linux/1242550977/)
[Gentoo Linux part29](https://pc11.5ch.net/test/read.cgi/linux/1255956757/)
[Gentoo Linux part30](https://hibari.5ch.net/test/read.cgi/linux/1270796287/)
[Gentoo Linux part31](https://hibari.5ch.net/test/read.cgi/linux/1294700891/)
[Gentoo Linux part32](https://engawa.5ch.net/test/read.cgi/linux/1318891441/)
[Gentoo Linux part33](https://engawa.5ch.net/test/read.cgi/linux/1353822959/)
[Gentoo Linux part34](https://hayabusa6.5ch.net/test/read.cgi/linux/1379339307/)
[Gentoo Linux part35](https://mao.5ch.net/test/read.cgi/linux/1415989434/)
## 2018-現行
[Gentoo Linux part36](https://itest.5ch.net/mao/test/read.cgi/linux/1514892799/)
【Docker】ボリュームのバックアップ方法

## ボリュームのバックアップ方法

以下のコマンドを実行することでボリュームのバックアップを作成することができます。

```:ターミナル
$ docker run --rm --volumes-from バックアップするコンテナ名 -v $(pwd)/backup:/backup ubuntu tar cvf /backup/backup.tar バックアップするパス
```
Amazon Lambda デプロイ＆アップデート用のスクリプト(PowerShell)のテンプレ作ってみた


```json:trust-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": "lambda.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }
  
```

deploy.ps1
```powershell:deploy.ps1
#メモリはデフォルト
#Layer不要の場合
$NAME = "LAMBDANAME"

#Deploy用
Write-Output "-------------------------------------------------------------"
$TIMEOUT = 60
$REGION = "us-east-1"
$ROLENAME = "ROLLNAME"
$HANDLERPATH = "main.FUNCTIONNAME"
$PERMISSIONARN = "Copy&Paste permission arn"

$compress = @{
    Path = ".\main.py"
    CompressionLevel = "Fastest"
    DestinationPath = ".\$NAME.zip"
}
Compress-Archive @compress

$ARN = (aws iam create-role --role-name $ROLENAME -assume-role-policy-document file://.\trust-policy.json --permissions-boundary $PERMISSIONARN| ConvertFrom-Json).Role.Arn

aws lambda create-function `
    --function-name $NAME `
    --runtime python3.9 `
    --role $ARN `
    --handler $HANDLERPATH `
    --timeout $TIMEOUT `
    --zip-file fileb://.\$NAME.zip `
    --region $REGION `
    --output json
Write-Output "-------------------------------------------------------------"

#Update用
# aws lambda update-function-code -function-name $NAME --zip-file fileb://.\$NAME.zip `


#確認PAUSE
PAUSE
Remove-Item .\$NAME.zip
```

レイヤーもCLIで追加できるようにしたら、次は`lambda-uploader`の方が簡単そうなのでそっちに切り替える。
ros2 でpackage.yaml書くときに気をつけること

## はじめに

ros2で、package.yaml適当に書いてPull Request送ったら、
それ名前が違うと怒られたので、二の次を踏まないための備忘録


## 役割
rosdep installをするときに、バージョン、環境に合わせて、installするpackageを決めるために利用されるファイルです。なので適当にファイル名を決めたら動かない


## どうするべきか
ROS2のPackage名管理しているgithubがあるのでそちらを確認すると正式名称が整理されてるので
そこを確認すると正式名称がわかる

https://github.com/ros/rosdistro
Flutterに'Cannot mix 2018 and 2021 terms in call to TextTheme() constructor.'といわれた際の解決法

# この記事は

Flutter開発時に発生した「なんぞ？」となったエラーとその対処のメモです。
たぶん将来的にも同じ問題を踏みそうなのでメモです。

# 発生したこと

## やっていたこと

WidgetBook上でText()のデザインを組んでいたところ、flutterの描画エラーが出力された

## エラー内容

エラー文言は"Cannot mix 2018 and 2021 terms in call to TextTheme() constructor."

![centinel 2022_05_28 2_21_18 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18557/06c75ddc-3f89-0327-735e-dded15a456f4.png)

## 調査内容

flutterコミュニティにて似たようなログをはっているIssueを発見
https://github.com/flutter/flutter/issues/51698

flutter apiドキュメントにてTextThemeの部分を確認
https://api.flutter.dev/flutter/material/TextTheme/TextTheme.html

```
assert(
       (displayLarge == null && displayMedium == null && displaySmall == null && headlineMedium == null &&
           headlineSmall == null && titleLarge == null && titleMedium == null && titleSmall == null &&
           bodyLarge == null && bodyMedium == null && bodySmall == null && labelLarge == null && labelSmall == null) ||
       (headline1 == null && headline2 == null && headline3 == null && headline4 == null &&
           headline5 == null && headline6 == null && subtitle1 == null && subtitle2 == null &&
           bodyText1 == null && bodyText2 == null && caption == null && button == null && overline == null),
       'Cannot mix 2018 and 2021 terms in call to TextTheme() constructor.'
     ),
```

エラーに書いてある通りなのね。
headlineX系の新しいシンボル名とbodyLarge系の古いシンボル名を混在して定義するなということらしい。

ということで自作のTextTheme定義を見に行く。

``` 
      textTheme: Typography.dense2018.copyWith(
        ...
        headline5: const TextStyle(
            fontFamily: 'Roboto',
            color: Color(0xff354052),
            fontSize: 18,
            fontWeight: FontWeight.bold),
        headline6: const TextStyle(
            fontFamily: 'Roboto',
            color: Color(0xff354052),
            fontSize: 16,
            fontWeight: FontWeight.bold),
        bodyLarge: const TextStyle(
            fontFamily: 'Roboto',
            color: Color(0xff354052),
            fontSize: 14,
            fontWeight: FontWeight.normal),
        bodyMedium: const TextStyle(
            fontFamily: 'Roboto',
            color: Color(0xff354052),
            fontSize: 12,
            fontWeight: FontWeight.normal),
        bodySmall: const TextStyle(
            fontFamily: 'Roboto',
            color: Color(0xff354052),
            fontSize: 9,
            fontWeight: FontWeight.normal),
```

やってましたね。手癖でbodyLargeとか書いたけど新旧体系をまぜるなということで。

## 対処法

体系を変更

- bodyLarge => Subtitle1
- bodyMedium => bodyText1
- bodySmall => bodyText2

無事エラー解消
独自の確率分布からアイテムを抽籤する機能の実装

無作為にレベルを選択し，そのレベルの中から無作為にアイテムを選択するというような機能を実装する必要があった．そこで実装されたコードが次である．

```ruby
def lootbox_of_item
  case $lootbox
  when 0..40
    rand($level[1])
  when 40..60
    rand($level[2])
  when 60..80
    rand($level[3])
  when 80..90
    rand($level[4])
  when 90..100
    rand($level[5])
  end
end

$level = {
  1 => 1..459,
  2 => 460..1362,
  3 => 1363..1755,
  4 => 1756..2101,
  5 => 2102..2184
}

$lootbox = rand(0..100)
```

何これ…きも…

`lootbox_of_item`関数でアイテム番号を選択しているが，全てのwhen文にrand関数を適用していたり，ハッシュの値が何を指すのか分からなかったり，とかく酷いコードである．ゴミをGitHubに上げるな．

というわけで，一度実現したい機能を整理することにした．

ほとんどは [Rで学ぶ逆変換（逆関数）法](https://www.slideshare.net/teramonagi/r-14810107) にて述べられているが，一度振り返ってみる．

## 確率論による解法

### 条件

問題は問題番号と重要度をもつ．重要度は出題確率をもつ．

### 確率質量関数

確率変数 $X$ を問題の重要度とする．確率質量関数$P(X)$ を次のように定義する．

$$P(X=x_k) = p_k $$

分布関数 $F(X)$ は次のように定義される．

$$F(X=x) = P(X \leq x) = \sum_{k=1}^x P(X=k) $$

確率変数 $Y$ を問題の番号とする．確率質量関数 $P(Y)$ を次のように定義する．

$$P(Y \mid X = k) = 1/n_k $$

しかるに $n_k$ は，問題の重要度の集合 $C = \\{ 1, 2, \cdots, c\\}$ に写像される，各重要度に含まれる問題数をもつ数列の項である．

$$\\{n_k\\}_{k \in C} $$

重要度 $k$ の問題番号の範囲を $s_k$から $e_k$ とすると，これらは次で求められる．

$$s_k=\sum_{l=1}^{k-1} n_l + 1 $$

$$e_k=\sum_{l=1}^{k} n_l $$

よって，次の等式が成り立つ．

$$e_k=s_k+n_k-1 $$

分布関数 $F(Y)$ は，$s_k \leq y\leq e_k$ を満たす $k$ を用いて，次のように定義される．

```math
\begin{aligned} F(Y=y \mid X = k) &= \sum_{l=s_k}^{y} P(Y=l \mid X = k) \\ &= \frac{y-s_k+1}{n_k} \\&= 1 - \frac{e_k-y}{n_k} \end{aligned}
```

### 逆変換法

確率変数 $u$ が一様分布 $[0, 1)$ に従うとする．このとき，関数 $F_X^{-1}(U)$ を次のように定義すると，サンプリングを行うことができる．

$$F_X^{-1}(U=u) = \inf{\\{X \mid F(X \leq u)\\}} $$

$F_Y^{-1}(U)$ についても同様である．

これで幾分か見通しが良くなった気がする．

# Scipyで離散分布を扱う

Scipyには独自の離散分布を扱うことができるクラスがある．

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_discrete.html#scipy.stats.rv_discrete

確率変数のリストと確率質量関数のリストをそれぞれ定義し， `stats.rv_discrete`インスタンスの`rvs`（random variates）メソッドを呼べば，以上で述べた $u \sim [0, 1)$ の逆変換法のような機能を作れる．

初めに述べたコードは，次のように可読性を高めることができた．ちなみに，PyCallでScipyのモジュールを呼び出している．

```ruby
  def get_level(levels, probabilities)
    pyfrom :scipy, import: :stats

    xk = levels
    pk = probabilities
    custm = stats.rv_discrete.call({ values: [xk, pk] })
    custm.rvs
  end

  def get_problem_id(level, ctgr_attr)
    range = ctgr_attr[level]['range']
    start = range['start']
    end_ = range['end']
    rand start..end_
  end
```

ちなみに，レベルと確率分布は別のyamlファイルに分けた．

上で考察したことを吹っ飛ばして機能を実装できてしまった 😲

:::note info
ちなみに確率の和が1でないとき

```ruby
raise ValueError("The sum of provided pk is not 1.")
```

と例外処理される[^1]．
:::

[^1]: https://github.com/scipy/scipy/blob/4cf21e753cf937d1c6c2d2a0e372fbc1dbbeea81/scipy/stats/_distn_infrastructure.py#L3682
pandera の SchemaModel で MultiIndex の DataFrame をバリデーションする方法

# やりたいこと

MultiIndexのDataFrameを`pandera.SchemaModel`を使ってバリデーションしたい


```python:DataFrame例
import pandas as pd

idxs = pd.MultiIndex.from_product([['foo', 'bar', 'buz'], [0, 1, 2]], names=['idx_0', 'idx_1'])
cols = pd.MultiIndex.from_product([['ham'], ['bacon', 'eggs']], names=['col_0', 'col_1'])
data = list(zip([100., 200., 300.], 'abc')) * 3
df = pd.DataFrame(data=data, index=idxs, columns=cols)
```

```text:df
col_0          ham     
col_1        bacon eggs
idx_0 idx_1            
foo   0      100.0    a
      1      200.0    b
      2      300.0    c
bar   0      100.0    a
      1      200.0    b
      2      300.0    c
buz   0      100.0    a
      1      200.0    b
      2      300.0    c
```

# 結論

## MultiIndex Indexes
+ `df.index.names`の各インデックス名で指定
+ `pandera.typing.Index`で型指定

## MultiIndex Columns
+ `pandera.Field(alias=)`でカラム名をタプルで指定
+ `pandera.typing.Series`で型指定

## Schema Modelsによるバリデーション

```python:Schema例
import pandera as pa
from pandera.typing import Index, Series

# スキーマモデルの定義
class MultiIndexSchema(pa.SchemaModel):
    idx_0: Index[str] = pa.Field(str_length=3)
    idx_1: Index[float] = pa.Field(ge=0, le=2)
    col_00: Series[int] = pa.Field(alias=('ham', 'bacon'), coerce=True)
    col_01: Series[str] = pa.Field(alias=('ham', 'eggs'))

    class Config:
        multiindex_name = 'hogehoge'
        multiindex_strict = True
        multiindex_coerce = True

# バリデーション実行
MultiIndexSchema.validate(df)
```

```text:MultiIndexSchema.validate(df)
col_0         ham     
col_1       bacon eggs
idx_0 idx_1           
foo   0.0     100    a
      1.0     200    b
      2.0     300    c
bar   0.0     100    a
      1.0     200    b
      2.0     300    c
buz   0.0     100    a
      1.0     200    b
      2.0     300    c
```

# 参考
公式チュートリアル

`pandera.SchemaModel`を使ったMultiIndexのバリデーション

https://pandera.readthedocs.io/en/stable/schema_models.html#multiindex

`pandera.DataFrameSchema`を使ったMultiIndexのバリデーション

https://pandera.readthedocs.io/en/stable/dataframe_schemas.html#multiindex-columns
RubyとJavaScriptの.sliceの違い

# はじめに
この記事は、エンジニア経験1年の大学生が実務や個人の学習で勉強になったこと、詰まったことをまとめています。間違っている箇所などがございましたら、指摘していただけると幸いです。

# 背景
コーディングテストの学習している中、RubyとJavaScriptの両方で挑戦していました。そんな中、JavaScriptでは通ったが、Rubyではテストが通らず、混乱しました。そのため、記事にしました。

# Rubyの`.slice`
```ruby
[1, 2, 3, 4, 5].slice(1, 2)

# [2, 3]
```
`.slice(index, length)`となっており、`length`で長さを指定して取り出す。

[参考: Rubyリファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/Array/i/slice.html)

# JavaScriptの`.slice`
```javascript
[1, 2, 3, 4, 5].slice(1, 3);

// [2, 3]
```
`.slice(begin, end)`となっており、`start`は取り出しの開始位置を示す 0 から始まるインデックスである。`end`は取り出しを終える直前の位置を示す 0 から始まるインデックスであり、`end`自体は含めず、その直前まで取り出す。

[参考: MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
【HTML】pictureタグによるレスポンシブ毎に画像切り替え

# レスポンシブごとに画像切り替え
これまではpc、スマホごとの画像切り替えはcssによるブレイクポイントごとのスタイル表示、非表示で行っていたが、それではpcで読み込む必要のないsp画像を読み込むなど、無駄な読み込みを行っていた。なのでpictureタグ、srcset属性による画像切り替えを行うようにする。

## pictureタグによる画像の切り替え
pictureタグを使用すると、cssを使わず、画面幅による画像切り替え、webp未対応ブラウザに別画像表示などのことが可能になる。

### 解説
 `<picture>`の中に一つ以上の`<source>`と一つの`<img>`を記述。
 `<source>`を上から1つずつ順番に読んでいくので、記述順に注意。
条件に当てはまれば、その画像を表示。当てはまらなければ、下の`<source>`へと進む。
`<source>`のどれにも条件が当てはまらなければ`<img>`を表示する

### ブラウザ幅による画像切り替え
`media`属性でメディアクエリ（画面幅に応じた条件）を指定。
`media="(min-width: 765px)" srcset="img_2.jpg"`なら765px以上で'img_2.jpg'を表示する。
```html
<picture>
		<source media="(min-width: 765px)" srcset="img_2.jpg">
		<source media="(min-width: 375px)" srcset="img_1.jpg">
		<img src="img_3.jpg" alt="pictureタグで画像を切り替えてます">
</picture>
```

### 画像形式による切り替え
`type="image/webp"`でwebp対応ブラウザには表示させることができる。
webp対応ブラウザと未対応ブラウザで画像切り替える記述。
```html
<picture>
  <source srcset="/sample.webp" type="image/webp"/>
  <img src="/sample.png" /><!-- ブラウザがwebpに対応していない場合に表示 -->
</picture>
```
JavaとPythonのHello World(http getバージョン)

## ■前提
Javaのフレームワーク：spring boot
Pythonのフレームワーク：fastapi

## ■本題
### Java
ファイル
```HelloApplication.java
package com.example.hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloApplication.class, args);
	}
}
```


```GreetingController.java
package com.example.hello;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {
	private static final String template = "Hello, %s!";
	private final AtomicLong counter = new AtomicLong();

	@GetMapping("/greeting")
	public Greeting greeting(@RequestParam(value="name", defaultValue="world") String name) {
		return new Greeting(counter.incrementAndGet(), String.format(template, name));
	}
}
```


```Greeting.java
package com.example.hello;

public class Greeting {
	private final long id;

	private final String content;

	// コンストラクタ
	public Greeting(long id, String content) {
		this.id = id;
		this.content = content;
		this.higaGreeting();
		Greeting.higaGreeting2();
	}

	// Getters
	public long getId() {
		return id;
	}
	public String getContent() {
		return content;
	}
}

```

### Python

```
python -m venv venv
```
```
pip install fastapi
```
```
pip install uvicorn[standard]
```


```main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
    return {"message":"Hello World"}
```

## ■所感
何を大事にするか、生きている間は考え続けますか
Windows10で実行中のVMRC経由でESXi上のUbuntuの音を出力する

# 問題
- VMware ESXi上のUbuntu（ゲストOS）にWindows10のVMRCからアクセスすると、Windows10の端末のスピーカーから音が出ない
※ゲストOSのサウンド出力が「ダミー出力」になっている

# 手順
- Windowsの「ステレオミキサー」を有効化する
- ゲストOSの「仮想ハードウェア」に「サウンドカード」を追加する

>以下のWebサイトを参考に解決しました
http://blawat2015.no-ip.com/~mieki256/diary/202007101.html

# 詳細
1. 構成
    - ホスト：Intel NUC （NUC11PAHi3）
    - ハイパーバイザー：VMware ESXi 7.0 Update 2
    - ゲストOS：Ubuntu 20.04 LTS
    - クライアント：Windows10 21H2 （Panasonic CF-RZ6）
    
2. 手順
    1. Windowsのコントロールパネルから「サウンド」を開き、「録音」の「ステレオミキサー」を有効化する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344462/b94307d1-b834-0fd4-16d9-2473740997de.png)
    2. Windowsを再起動する
    
    2. ESXiの「ナビゲータ」から対象の仮想マシンを選択する
    2. 「アクション」から「設定の編集」を開く
    2. 「その他のデバイスの追加」から「サウンドカード」を追加する
    ※以下の画像はすでに追加済みのため、グレーアウトされている
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344462/947a298f-4209-7572-e9a8-24c56e7eec4d.png)
    2. 「設定の編集」に「サウンドカード」が表示されていることを確認する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344462/918fdb80-eaeb-808a-ca23-4e8fbc16bed0.png)
    2. VMRCを起動する
    2. Ubuntuの設定から、サウンドの出力が「ライン出力-HD Audio Controller」等になり、Windowsのスピーカーから音が出ることを確認する。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344462/fb72bea7-56fb-d88d-6c2f-155108c84b35.png)

以上です。お疲れさまでした。
※ほかのWebサイトも見ていると、上の方法で解決しないときもあるようで…
【AWS / Omniverse】 GPUインスタンスでOmniverse Createを動かす際GPUが認識されない

# TL;DR

AWSのGPUインスタンスでOmniverseを使うにはゲームドライバのインストールが必要でした。
手順はAWSにあるけど、Windows向けは英語しかないよ。

# やりたかったこと

[Omniverse](https://www.nvidia.com/ja-jp/omniverse/)を触ってみたかったのですが、GPU複数枚が刺さったマシンを買うのはお財布的に厳しい……
AWSのGPUインスタンスなら初期投資がなくてもお試しできる！と目論見を立てました。

# 実行環境

以下が一緒であれば再現すると思います。

- インスタンス: g4dn.xlarge
    - GPU: Tesla T4
- OS: Windows Server 2022

# エラー内容

Omniverse Launcher、Createのインストールは問題なく完了したので、Createを起動しようとするとスプラッシュ画面だけ出て反応しない。。。
実行ディレクトリをたどって`omni.create.bat`を直接起動すると、以下のエラーが出ました。OmniverseからGPUが認識されていないようです。
![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696677/e8b0c17d-4c92-a17d-b68f-347c3cd8ec7b.png)

OmniverseのGPUドライバ確認手順通りにみてみると、GPUドライバは問題なくインストールされているようでした。

# やったこと

GPUインスタンスのドライバについて調べると、[Install NVIDIA drivers on Windows instances](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/install-nvidia-driver.html)にある通り、ドライバが3種類ある模様。
OmniverseはRTXシリーズを推奨しているので、とりあえずゲームドライバをインストールしました。

## 手順

上記リンクを日本語でまとめました。読める人は直接見たほうがよいです。
<details>

- `AmazonS3ReadOnlyAccess`ポリシがアタッチされたIAMユーザを作る
    - コンソールアクセスできるようにすること
    - credentialは発行しておくこと（すぐに使います）
- ドライバをインストールしたいインスタンスでPowershellを管理者権限で開き、以下をすべて実行
    - `Access key ID`と`Secret Access Key`はcredentialにあります
```powershell
Set-AWSCredential -AccessKey <Access Key ID> -SecretKey <Secret Access Key>
```


```powershell
$Bucket = "nvidia-gaming"
$KeyPrefix = "windows/latest"
$LocalPath = "$home\Desktop\NVIDIA"
$Objects = Get-S3Object -BucketName $Bucket -KeyPrefix $KeyPrefix -Region us-east-1
foreach ($Object in $Objects) {
    $LocalFileName = $Object.Key
    if ($LocalFileName -ne '' -and $Object.Size -ne 0) {
        $LocalFilePath = Join-Path $LocalPath $LocalFileName
        Copy-S3Object -BucketName $Bucket -Key $Object.Key -LocalFile $LocalFilePath -Region us-east-1
    }
}
```

```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\NVIDIA Corporation\Global" -Name "vGamingMarketplace" -PropertyType "DWord" -Value "2"
```

```powershell
reg add "HKLM\SOFTWARE\NVIDIA Corporation\Global" /v vGamingMarketplace /t REG_DWORD /d 
```

```powershell
Invoke-WebRequest -Uri "https://nvidia-gaming.s3.amazonaws.com/GridSwCert-Archive/GridSwCertWindows_2021_10_2.cert" -OutFile "$Env:PUBLIC\Documents\GridSwCert.txt" 
```

</details>

# 結果

GPUインスタンス上でOmniverse Createが動きました！
![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696677/3cff908e-9e4f-9b9e-5888-e3a73a9dc24a.png)


# Refs
Linux向け: [Linux インスタンスへの NVIDIA ドライバーのインストール](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-nvidia-driver.html)
🔰【初学者用】kaminariを使ってページネーションを実装しよう！【Ruby on Rails】

# はじめに
現在Ruby on Railsでオリジナルアプリを作成しています。
その際にGemの`kaminari`を使ってページネーションを実装しました。
ページネーションはとても簡単です！是非実装の参考にしてください！
Googleでなにかしらを検索したときに下の画像のようなページ遷移の番号がでてきますよね。これがページネーションです！
ページネーションの参考画像↓

https://gyazo.com/5039e4f4574713dc5cbdc396e3dd0332

# kaminari導入
ますはページネーションの実装を簡単にする`gem'kaminari'`を導入しましょう！
```rails:Gemfile
gem 'kaminari'
```
記述を終えたらターミナルにて
```rails:ターミナル
bundle install
```
を行います。
# コントローラーの記述
```rails:controller.rb
def index
  @users = User.page(params[:page]).per(15)
end
```
コントローラーの選択は任意です。
`page`と`per`メソッドはkaminariで定義されているメソッドです。
上記の場合perメソッドの引数である(15)の表示により15ページ分のページネーションが実装されます。
※(10)なら10ページ・(5)なら5ページ

# ビューでページネーションを表示

```rails:index.html.erb
<%= paginate @users %>
```
**これで実装完了です！!**


**え、、、終わり!????????**

**はい。完成です。**

# 細かい設定
細かい設定をしましょう！
```rails:ターミナル
rails g kaminari:config
```
を行います。すると以下のファイルが生成されます。
```rails:config/initializers/kaminari_literal
Kaminari.configure do |config|
  # config.default_per_page = 25 # 1ページ辺りの項目数
  # config.max_per_page = nil    # 1ページ辺りの最大数
  # config.window = 4            # ex 値が2の場合 .. 2 3 (4) 5 6 ..
  # config.outer_window = 0      # ex 値が2の場合 .. (4) .. 99 100
  # config.left = 0              # ...になったときの左側の表示数
  # config.right = 0             # ...になったときの右側の表示数
  # config.page_method_name = :page # メソッド名
  # config.param_name = :page    # ページネーションのパラメーターの名前
end
```
お好みで修正してください！

また、下記のコマンドでビューを編集したい場合、下記コマンドでビューを作成できます！
```rails:ターミナル
rails g kaminari:views default
```
app/viewsフォルダにkaminariが追加されるのでそちらを書き換えましょう！

# おわりに
今回はページネーションをまとめてみました！
本当に簡単に実装できましたよね？私も実装が終わったときは　**え、、、終わり!????????**　と叫びました。
これからは5分で実装できますね(^^)

※初学者のため、間違い等があれば指摘ください。最後まで見ていただきありがとうございました！

### 余談
今日からできるだけ毎日１記事アウトプットとして投稿していきたいと思います。とここに宣言。
AMPのやめ方

GA4のAMPタグがマニュアル通りに設定しても動かなくてむしゃくしゃしてやった。

とりあえずhtmlタグに入っていた `amp` 宣言を抜けばGoogleはAMPページとしてキャッシュを保存しなくなる。

インデックスにおけるAMP優遇は終わっているので今のところPVに影響は無さそう。
（サーチコンソールで有効なAMPページが減り、有効なインデックスが減っていないことを確認済み。）

気になるのがLCPなどだがこれは正直まだわからない。
何故なら **宣言を抜いてもAMPのスクリプト自体を使い続ける事は可能** だからだ。
つまり私はhtmlから高々4文字消しただけで、他は放置している。
AMPページとしてインデックスしていた時は色々とうるさかったサーチコンソールも、通常ページならどんなJavaScriptが動いていても文句を言わない。

という事で、やめたければ宣言を抜くだけで良い。
勿論AMPで作っていた部分の機能が気に入らなくてやめるのであれば他のタグも抜いて行くことになるが、一気にやったり急いでやらなくても問題はない。
Bentoに乗り換える必要もない。

とまあ、このようにAMPのアドバンテージが無い状態だといつ終わってしまうかもわからないので、未来永劫使い続ける訳にはいかないが、ネイティブAMPのサイトでも宣言さえ抜いてしまえばあとはゆっくり通常のhtmlに置き換えていけば良い。
AMPをやめて本当にPV等が大丈夫かを確認する場合も、とりあえず宣言を抜けば良いと思う。
dotnet ef コマンド

## 参考サイト
https://docs.microsoft.com/ja-jp/ef/core/cli/dotnet


## コマンド一覧

### dotnet efツールのインストール

```bash
# ツールのインストール
$ dotnet tool install --global dotnet-ef

# ツールのアップデート
$ dotnet tool update --global dotnet-ef

# 特定のプロジェクトでツールを使用するには、その前に Microsoft.EntityFrameworkCore.Design パッケージを追加する必要がある
$ dotnet add package Microsoft.EntityFrameworkCore.Design
```

### dotnet ef
インストールの確認。

```bash
$ dotnet ef
```

### dotnet ef database drop
データベースを削除する。

```bash
$ dotnet ef database drop
```

### dotnet ef database update
データベースをアップデートする。

```bash
# データベースをマイグレーションファイルを使用してアップデート
$ dotnet ef database update
# 移行名を使用
$ dotnet ef database update InitialCreate
# 移行IDと指定された接続を使用します。
$ dotnet ef database update 20180904195021_InitialCreate -connection your_connection_string
```

### dotnet ef dbcontext info
DbContext 型に関する情報を取得する。

```bash
$ dotnet ef dbcontext info
```

### dotnet ef dbcontext list
使用可能なDbContext型を一覧表示する。

```bash
$ dotnet ef dbcontext list
```

### dotnet ef dbcontext scaffold
DbContext のコードとデータベースのエンティティ型を生成する。

```bash
# dotnet ef dbcontext scaffold "接続文字列" "プロバイダー(通常はnugetのパッケージ)" -o "エンティティクラスを出力するディレクトリ"
$ dotnet ef dbcontext scaffold "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models
```

### dotnet ef migrations add
新しいマイグレーションファイルを追加する。

```bash
$ dotnet ef migrations add [マイグレーション名]
```

### dotnet ef migrations list
使用可能なマイグレーションを表示する。

```bash
$ dotnet ef migrations list
```

### dotnet ef migrations remove
最後のマイグレーションを削除して、最新のマイグレーションのために行われたコード変更をロールバックします。

```bash
$ dotnet ef migrations remove
```
独り言で解説するCarthageの導入方法



# オンボーディングにて
会社「では、Carthage でこのアプリを作ってください。よろしくお願いします。」
わい「ん、おかのした。(カルタゴ？)」

その夜
わい「はえー、[カルタゴって地名](https://wikitravel.org/ja/カルタゴ_(チュニジア))なんやな」

わい「…そこに行けと？」

# Carthageとは
https://github.com/Carthage/Carthage

↑が Carthage の GitHub やな。

この GitHub の About を見てみると。

>A simple, decentralized dependency manager for Cocoa

日本語に直すと「**Cocoa用のシンプルで分散化された依存関係管理ツール**」と言っているんや。

...

さっぱりわからん...。

Cocoa というのは、MacOS 用のアプリケーションを構築するフレームワークのことやから。

要は、Carthage は**たくさん存在するiOSアプリのライブラリを管理するツール**ってことやな。

# Carthageのインストール
Carthage をインストールするやり方は沢山あって、主に以下の 4 つの方法があるんや。

- リポジトリの main ブランチからクローンを作成する
- インストーラー
- Homebrew
- MacPorts

Mac ユーザーは Homebrew をよく使うから(偏見)

今回は、**Homebrew**を使ったやり方を紹介するで。

## Homebrewを利用したインストール
Homebrew を入れたことのない人は、ターミナルで以下を実行すると導入できるで。

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

詳しくは、[この記事を参考にする](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)とええで。

Homebrew を導入できたら、同じくターミナルで以下を時刻すると Carthage がインストールされるんや。

```
brew install carthage
```

# Cartfileの作成
いよいよ**Carthageをプロジェクトに導入**していくで！

まず、Carthage を導入したいプロジェクトのディレクトリをターミナルで開くんや。

```
cd hogehoge/
```
`hogehoge` は導入したいプロジェクト名やで〜。

そしたら、**touchコマンドで `Carthage` というファイル**を作成するで！
この中に、使用したいライブラリを入れていくんや。
```
touch Cartfile
```
↑を実行したら、**`Cartfile` を編集**していくで！
編集できるのなら、どんなエディタを使っても OK やで〜。
Vim が好きな人は以下を入力すると、Vim が開いて編集が可能や。
```
vim Cartfile
```

Vim などの CUI 形式のエディタが苦手な人は、Finder からプロジェクトのディレクトリを開いて、GUI 形式のエディタ(VScode など)で編集するのも OK や。

最後に、使いたいライブラリを記述していくで！
具体的には、R.swift なら。
```
github "mac-cain13/R.swift.Library"
```
Alamofier なら。
```
github "Alamofire/Alamofire"
```
↑と記述するんやで。

これは主に GitHub の README に書いてあで。
それを参照して記述すると不具合なく導入できるで。
↓は実際の Alamofire の README や
![スクリーンショット 2022-05-27 23.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/06687da9-e15b-5e11-40e6-1067b178d5b8.png)

https://github.com/Alamofire/Alamofire

以上で、Cartfile の作成は終わりや。

# Carthageの実行
Cartfile の作成も終わったので、Carthage を実行していくで！
今までは `$ carthage update --platform iOS` と入力していたんや。
しかし、Xcode12 以降からは、以下のコードを実行すると、`.xcframework` を作成してくれるんや。
```
carthage update --use-xcframeworks
```

実際に、プロジェクト内の `Carthage/Build` 以下に `.xcframework` が生成されているで。

最後に、Xcode 内の `General` から `Frameworks, Libraries, and Embedded Content` セクションに、`.xcframework` を追加するんや。

以上で、**Carthageを利用したライブラリの導入は終了**や。お疲れ様やで。

## 少し余談

実は、`$ carthage update --platform iOS` を実行していた際は Build Phase 設定をイジイジしなくちゃいけなかったんや。

XCFrameworks 対応後はそれが不必要になったんや！便利な世の中になったで。

# まとめ
1. Carthage を導入していない場合は、`brew install carthage` を実行
1. プロジェクト下で `Cartfile` を作成
1. `Cartfile` に使うライブラリを導入する
1. Carfile を保存後、`carthage update --use-xcframeworks` を実行
1. Xcode 内で、`Frameworks, Libraries, and Embedded Content` に `.xcframework` を追加する

# 最後に
今回は初めて Carthage を利用した際に調べていたら、情報が古いものばかりだったので誰かの助けになればと思って書いてみました。はじめて Carthage を使う方、英語に苦手意識がある方に役立てば嬉しいです。
また、諸先輩方は間違った内容がございましたら、ご指摘のほどよろしくお願いいたします。

また、書き方は[とある方の記事に影響を受けて](https://qiita.com/Yametaro)、エセ関西弁の独り言形式で書いてみました。読みにくかったら**サーセン**
【Kotlin】Exposedでcreated_atとupdated_atカラムを付けて自動的に更新する方法

おはようこんにちはこんばんは。

RailsのActive RecordやLaravelのEloquentを普段使っていると、モデルにcreated_atやupdated_atが生えてきて勝手に更新してくれますがExposedの世界に来るとそれは自動的に出来ないので何とか出来るようにする方法を模索してみました。

流石にUpdateをする処理で毎回毎回手動で更新していたら超面倒くさいし、漏れも出てくるので仕組みで解決してあげます。

## というわけでExposedのクラスを継承して早速実装してみる
今回はIdをPrimary Keyとして扱うIntIdTableを使いたいので、それらのクラスを継承してUpdate時の処理に自動的にタイムスタンプを更新させる処理を入れておきます。

```kotlin
abstract class ExposedTimestampIdTable(name: String = "", columnName: String = "id") : IntIdTable(name, columnName) {
  val createdAt = datetimeWithTZ("created_at").clientDefault { Clock.System.now() }
  val updatedAt = datetimeWithTZ("updated_at").clientDefault { Clock.System.now() }
}

abstract class ExposedTimestampIdEntity(id: EntityID<Int>, table: ExposedTimestampIdTable) : IntEntity(id) {
  val createdAt by table.createdAt
  var updatedAt by table.updatedAt
}

abstract class ExposedTimestampIdEntityClass<E : ExposedTimestampIdEntity>(table: ExposedTimestampIdTable) :
  IntEntityClass<E>(table) {
  init {
    EntityHook.subscribe { action ->
      if (action.changeType == EntityChangeType.Updated) {
        action.toEntity(this)?.updatedAt = Clock.System.now()
      }
    }
  }
}
```

今回は独自に実装した `datetimeWithTZ` を使っているので、下の記事を参考に実装しておきましょう。
(タイムゾーン要らない場合は通常の `datetime` にしておきましょう)

https://qiita.com/tumugin/items/be806107fa05f22d32ff

`created_at`と`updated_at`は勝手に生やしておいて欲しいので、`Table` と `Entity` に `createdAt` と`updatedAt` を実装して、 `EntityClass` に自動的に `updatedAt` を更新する処理を入れてあげます。

これらのクラスをどこかに実装しておきましょう。

## 使ってみる
```kotlin
object Users : ExposedTimestampIdTable("users") {
  val name = varchar("name", 255)
  val email = varchar("email", 255).nullable()
  // 以下省略...
}

class User(id: EntityID<Int>) : ExposedTimestampIdEntity(id, Users) {
  companion object : ExposedTimestampIdEntityClass<User>(Users)

  var name by Users.name
  var email by Users.email
  // 以下省略...
}
```

いつも通り、`IntIdTable`と`IntEntity`と`IntEntityClass`を使った時みたいに実装出来ますね！

## さいごに
Exposedを使っているとActive RecordやEloquentで最初から出来ることが出来なかったりして、むむ？？？ってなることが多いですが、非常に拡張性が高く便利なライブラリなので使いやすいように育てながら使っていきましょう！
ubuntu22.04にROS2 Humbleをインストールする

# はじめに

ubuntu22.04LTSにROS2 Humbleをインストールしたので最低限必要なコマンドをメモ


# aptリポジトリの追加

```bash
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
```

# リポジトリをsource listに追加

```bash
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```

# ROS2 インストール

```bash
sudo apt update
sudo apt install ros-humble-desktop
```

# 動作テスト

Talkerを実行

```bash
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker
```

別のTerminalでListenerを実行

```bash
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_py listener
```



# 環境設定

```bash
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source .bashrc
```


# ワークスペースの作成

colconのインストール
```bash
sudo apt install python3-colcon-common-extensions
```
```bash
mkdir -p ~/ros2_ws/src
cd ros2_ws/
colcon build
```



# Gazeboのインストール

ros-desktop-full でGazeboがインストールされなくなったので別にインストール

```bash
sudo apt -y install gazebo
sudo apt install ros-humble-gazebo-*
```

# rqtのプラグインをインストール

rqt_tf_treeなどよく使うものはデフォルトではインストールされないのでaptから入れる

```bash
sudo apt install ros-humble-rqt-*
```


# Reference 

https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html
Arduino Nano 33 IoTを始めてみた

# はじめに
Arduinoの始め方についての記事は大量にあるにも関わらず、なぜ筆者がこの記事を残したかについて触れておく。
Arduinoにはたくさんの種類があり、それぞれの種類ごとに少しずつインポートすべきライブラリだったり、選択すべきボードが違う。これを理解せずに、Arduino Nano 33 IoTのセットアップをするのに、沢山記事のあるArduino UNOのセットアップを参考に挑戦して、少々痛い目にあった。なので、今回は圧倒的に記事の少ない「Arduino Nano 33 IoT」のセットアップを残しておこうと思った、という次第である。
ゆえに、この記事では他のArduinoと共通するような基本的なArduino開発環境の操作についてはそこまで詳細に説明を加えていない。初見でも分かるかもしれない程度には書いてあるが、そこまで丁寧でもないので、一度本記事に目を通して右も左も分からない場合については、Arduino UNO用のセットアップ記事などを参考に開発環境等の操作に慣れつつ、本記事を見ると良いだろう。

# Arduino IDEのダウンロード
まず、Arduinoを使うにはPCにArduino IDEという「Arduinoで操作できるソフトウェアを開発するための統合開発環境」をダウンロードする必要がある。
ダウンロードは[こちらの](https://www.arduino.cc/en/software)リンクから可能。自らのPC環境に合わせてダウンロードしよう。ダウンロード方法の詳細については、ほかにたくさん記事があるし、どのArduinoだろうがここは変わらないので安心してダウンロードすればよい。

# Arduino IDEのセットアップ
Arduino IDEがダウンロード出来たら、必要なライブラリをインポートして環境を整えていこう。必要なライブラリを以下に挙げる。

- Arduino SAMD boards（Arduino Nano 33 IoT用のボード・必須）
- WiFiNINA（WiFi用）
- Arduino LSM6DS3
- Arduino BLE（Bluetooth用）

まず、ボードをインポートするために、Arduino IDEの左上の　ツール＞ボード＞ボードマネージャー　に行き、「Arduino SAMD boards」と検索し、インポートしよう。
（もしArduino Nano 33 IoTをPCに繋いだ状態でArduino IDEを開けば、左下に、Arduino Nano 33 IoTを使用するためにはこちらが必要です、といった具合のアドバイスが出てくるので、そちらからインポートしてもよい。）
他の3つは必要に応じてインポートすれば良いが、わざわざArduino Nano 33 IoTを選んだということはきっとWi-FiもBluetoothも使うだろうから、インポートしておくと良いだろう。Arduino IDEの左上の　スケッチ＞ライブラリをインクルード＞ライブラリを管理　でライブラリマネージャーに行き、3つを検索してインポートしよう。

# Lチカしてみよう
さて、必要なものは揃ったので、せっかくならここでLチカまでやってしまおう。Arduino Nano 33 IoTの基板上にLEDランプがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696621/76aa716c-51b6-c857-0f1c-a67aa8b1a3f4.png)
（図の引用元　https://store-usa.arduino.cc/products/arduino-nano-33-iot)

こちらのLEDを試しにチカチカさせてみようと思う。
Arduino IDEに以下のコードを書く。

```cpp
void setup() {
  // put your setup code here, to run once:
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(LED_BUILTIN, HIGH);
  delay(500);
  digitalWrite(LED_BUILTIN, LOW);
  delay(500);
}
```


ここで、接続しているArduino Nano 33 IoTに以下の手順でプログラムを書き込んでいく。

①ツール＞ボード＞Arduino SAMD boards　に行き、「Arduino Nano 33 IoT」を選択しよう。筆者はここでArduino AVR boardsのなかにArduino Nanoという選択肢があるもんだからそれを選択してしまい、二日間エラーの嵐に見舞われた。
②ツール＞シリアルポート　より、Arduino Nano 33 IoTが認識されているポートを選択しよう。
③マイコンボードへの書き込みボタン（IDEの左上にある、右矢印のマーク）を押して書き込みをしよう。
④Arduino Nano 33 IoT基板上のLEDがチカチカしたら成功！

# エラーが出た場合の対処法
本記事の通りに手を動かしたのに書き込みができない場合は、大方以下のようなことが原因かもしれない。

- PCとArduino Nano 33 IoTを繋いでいるケーブルが充電専用である可能性（これは意外とやりがちなミスである）
- シリアルポート、選択したボードが正しくない可能性（ダメ元でもう一度確認してみてほしい）
- Arduino Nanoが純正ではない可能性（純正でない場合は正しく認識されない場合があり、色々PC側の設定やソフトのインストールが必要だったりする。今一度自分が使っているArduinoを確認して、純正じゃない場合は対策をネットで調べてみると良いだろう。色々出てくる。）

# まとめ
いかがだっただろうか。Arduinoはたくさん種類があり、それぞれ出来ることもセットアップも少しずつ異なる。
この記事でエラーの嵐に見舞われている人を一人でも救えたなら幸いである。