OmniAICreator/Qiita-1.07M huggingface dataset:
nuxt3の本番実行と環境変数について(備忘)

## はじめに
Nuxt3を触っていて疑問になった点やそのうち忘れそうだと思ったことを残します
また、使用しているバージョンはRC13です

### 本番実行方法
package.jsonの中身は下記の前提
```json
{
  // ...中略
  "scripts": {
    "build": "nuxi build",
    "dev": "nuxi dev",
    "preview": "nuxi preview",
    "postinstall": "nuxi prepare"
  },
  // ...以下略
}
```

まずはビルドします
```bash
$ yarn build
```
実行結果として下記のような内容が出力される
```
Σ Total size: 5.6 MB (1.23 MB gzip)
✔ You can preview this build using node .output/server/index.mjs                         nitro 04:58:13
✨  Done in 9.46s.
```
下記で本番実行
```bash
$ node .output/server/index.mjs
```
たぶん、package.jsonに追記すれば使いやすくなる
```json
{
  // ...中略
  "scripts": {
    "build": "nuxi build",
    "dev": "nuxi dev",
    "preview": "nuxi preview",
    "postinstall": "nuxi prepare",
    "start": "node .output/server/index.mjs" // 追加
  },
  // ...以下略
}
```

```bash
$ yarn start
```

### 環境変数
開発モードでの実行時は.envやpackage.jsonに記載している内容を```process.env.*```で読み取れるけど、本番モードでは読めないっぽい
なので、nuxt.config.tsで```runtimeConfig```を設定してあげる必要がある

こんな感じ
```json:package.json
{
  "version": "0.1.0",
  "updated": "2022/11/16"
}
```

```properties:.env
HOGE=wkwkhogehoge
```

```ts:nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    HOGE: process.env.HOGE,
    VERSION: process.env.npm_package_version,
    UPDATED: process.env.npm_package_updated,
  },
})
```

ただ、これだとフロント側では読めないので、フロントで使う環境変数にはpublicをつけてあげる必要がある

```ts:nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    public: {  // 追加
      HOGE: process.env.HOGE,
    },
    VERSION: process.env.npm_package_version,
    UPDATED: process.env.npm_package_updated,
  },
})
```

~~だいぶ面倒だね！~~

1個1個書くの面倒だし、下記のような書き方ってできないのかな？（未検証）
```ts:nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    private: process.env,
  },
})
```

設定した環境変数をコード側で利用するには```useRuntimeConfig```を使う

```vue:page/index.vue
<script lang="ts" setup>
  const $config = useRuntimeConfig()
</script>
<template>
  <div>{{ $config.HOGE }}</div>
</template>
<style scoped></style>
```

```ts:server/api/env.ts
export default defineEventHandler((event) => {
  const $config = useRuntimeConfig()
  return {
    env: $config.HOGE
  }
})
```

### まとめ
- 本番実行するときはビルド後に```node .output/server/index.mjs```で実行できる
- 環境変数を使うときは```runtimeConfig```を設定しよう
railsチュートリアル中にHerokuの無料期間が終わることが分かり、Herokuからrender.comに気合いで移行した話

## 概要
タイトル通り
5章やってたら突然無料終わります言われて泣いちゃった
## 対応内容
下記様を参考にデプロイ手前まで作業完了。
[Render.comでRailsアプリの本番環境を作成する方法をどこよりも優しく伝える！](https://qiita.com/ysk91_engineer/items/b7db950f4739fa896f57)
[Render.com公式](https://render.com/docs/deploy-rails)

設定をしていくうち、`config/master.key`が必要とわかる。
その際、現在の`Gemfile`のrailsのバージョンではダメなことが分かり。
以下の様に`Gemfile`を設定変更
```ruby
source 'https://rubygems.org'

ruby "2.6.8" #念のためrender.comがこのバージョンの為、変更

gem 'rails',        '= 6.0.3.2' #updateしたら怒られたので怒られた通りに変更
gem 'bootstrap-sass', '3.3.7'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '< 6' #updateしたら怒られたので怒られた通りに変更
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.7.0'

group :development, :test do
  gem 'sqlite3', '~> 1.4'
  gem 'byebug',  '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.1.1'
  gem 'spring-watcher-listen', '2.0.1'
end

group :test do
  gem 'rails-controller-testing', '~> 1.0.2' #updateしたら怒られたので怒られた通りに変更
  gem 'minitest',                 '5.16.3'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.16.2'
  gem 'guard-minitest',           '2.4.4'
end

group :production do
  gem 'pg', '0.20.0'
end

# Windows環境ではtzinfo-dataというgemを含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```
変更後`bundle update`を通る様にする。

render.yamlは下記のように設定。
```render.yaml
databases:
  - name: <設定したデータベース名>
    databaseName: <設定したデータベース名>
    user: <設定したユーザー名>
    region: singapore

services:
  - type: web
    name: <設定したサーバー名>
    env: ruby
    region: singapore
    buildCommand: "./bin/render-build.sh"
    startCommand: "bundle exec puma -C config/puma.rb"
    envVars:
      - key: <%= ENV['DATABASE_URL'] %>
        fromDatabase:
          name: <設定したデータベース名>
          property: connectionString
      - key: <%= ENV['RAILS_MASTER_KEY'] %>
        sync: false
```
なんやかんやでシェルとか色々設定してビルドしたらもちろんビルドできなかったのでログを参照。
自分の場合公開鍵とrender.comの鍵があってないっぽいエラーを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90415/f731d080-25df-d047-d4a0-f9da92255d34.png)

いろいろガチャガチャしてたのが悪いんかなと思い、一旦
`master.key`と`credentials.yml.enc`を削除。
以下コマンドで再生成すればよいとのこと
```
EDITOR="mate --wait" bin/rails credentials:edit
```
各ファイルが生成された事を確認。
改めてビルドしたら無事移行できました。

一応同じ様にrailsチュートリアル中の方に向けて記事にしておきます。

## おわりに
webサーバはこれでいいけど、
DBの方は無料で使えるのは90日までみたいだから、結局Heroku無き今、チュートリアル難民はDBで頭を抱えるのである…
2022/11/16主にITとかセキュリティの記事

「Spring Security」に複数の脆弱性 - アップデートにて修正
https://www.security-next.com/141423

Cloudflareのゼロトラストサービスでポリシーのバイパス可能となる脆弱性
https://www.security-next.com/141420

FortinetのSIEM製品にローカル環境より悪用可能な脆弱性
https://www.security-next.com/141427

外部指摘で4年以上前の不正アクセスが判明 - 美容関連出版社
https://www.security-next.com/141390

一時操業停止にも至ったサイバー攻撃 - 侵入口は廃棄直前の「VoIP GW」
https://www.security-next.com/141258

個情委への漏洩報告が約3倍に - 医療機関や不正アクセスなどに起因
https://www.security-next.com/141308

ランサムウェア攻撃の被害が増加している背景は何か。デロイトが企業経営者に「攻撃者目線」での対策を主張している理由(11/14)
https://diamond.jp/articles/-/312168

ランサムウェア被害が急増する今こそ再検討したい、自社の事業を守る「最後の砦」バックアップ(11/14)
https://atmarkit.itmedia.co.jp/ait/articles/2211/14/news005.html

JTBから1万人超の個人情報が漏洩、その原因は？(11/14)
https://xtech.nikkei.com/atcl/nxt/column/18/01672/110900039/

情報漏洩を恐れるのは日本人だけ？ 【アメリカと日本の情報セキュリティの現状を比較・その１ 】(11/15)
https://note.com/takoyaki_master/n/n21526c3e69d6

サイバー犯罪者がクレカ情報を盗む5つの手口とは(11/14)
https://news.nicovideo.jp/watch/nw11691455

バラクーダのXDRによるインサイト「脅威の深刻度が休暇期間中に上昇」
2022年6月から9月末までに検知された脅威アラームの5分の1は高リスクに(11/14)
https://prtimes.jp/main/html/rd/p/000000036.000031256.html

【龍谷大学】近年急増するサイバー犯罪　犯罪捜査のデジタル化のなか、法律の現場ではなにが起きているのか　デジタル・フォレンジック鑑定と向き合うために　オンライン公開　第1回「司法におよぶ情報技術」< 11/19（土）18:00-20:00>
https://www.u-presscenter.jp/article/post-49431.html

脆弱性に優先順位をつけてアップデートするにはどうすべきか？(11/14)
https://news.mynavi.jp/techplus/article/20221114-2510166/

cURLの脆弱性 ～ヒープバッファオーバーフロー～(11/14)
https://gihyo.jp/article/2022/11/prevent-vulnerability-0001?utm_source=feed

実録 社内向けに事業部門が考えるべきセキュリティトレーニングをやってみた【第2回】トレーニング環境を短期間で実装(11/14)
https://www.trendmicro.com/ja_jp/jp-security/22/k/securitytrend-20221114-02.html

【Emotet (エモテット) 駆除ツール】感染確認法・対策も含めて解説(11/14)
https://cybersecurity-jp.com/column/74984

日本政府が名指し 北朝鮮ハッカー「ラザルス」とは何者か？(11/14)
https://www3.nhk.or.jp/news/html/20221114/k10013890411000.html

Androidに偽のTodoアプリと経費アプリ、インストールしていないか確認を(11/14)
https://news.mynavi.jp/techplus/article/20221114-2512406/

急増するサイバー犯罪サービス、驚くべき安さ-Webサイトダウンはわずか5分で5ドル(11/14)
https://news.mynavi.jp/techplus/article/20221114-2508943/

米国家安全保障局、CやC＋＋からメモリー安全性の高いJavaなどへの移行を推奨(11/14)
https://japan.zdnet.com/article/35195997/

中国政府が世界各国からデータを入手する3つの手法とは...(11/14)
https://www.newsweekjapan.jp/ichida/2022/11/3-2.php

Krakenニック・パーココCSOが6億ドルのFTXハッキング犯を特定したと主張(11/14)
https://nextmoney.jp/?p=54404

こだわりユーザー向けの「クセ強」Webブラウザー、使い分けで快適環境に(11/15)
https://xtech.nikkei.com/atcl/nxt/column/18/02255/111100002/

大量のアカウントでも安心、覚えやすく「強いパスワード」の作り方と管理方法(11/15)
https://xtech.nikkei.com/atcl/nxt/column/18/02229/102700009/

大阪急性期・総合医療センターより4日早くランサムウエアに感染した病院、紙カルテに(11/15)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/070100190/
ER図作成ツールはDraw.ioが良さげ

ER図の作成に便利なツールはいくつかあります。

## ツール選定のポイント

自分的選定のポイントは以下

- 無料
- 画像やPDFなど何かしら書き出しが可能
- 簡単に作成・更新が可能
- 図形としてみやすい
- IE表記でかける

いくつか使ってみて、最終的に選んだのは「****Draw.io****」です。

## ****Draw.io****

[Flowchart Maker & Online Diagram Software](https://app.diagrams.net/)

[Draw.io](https://app.diagrams.net/?src=about)は登録せずに豊富なテンプレートからER図などのさまざまな図形を作成できる無料Webツールです。

作成した図形は画像形式の他にも豊富な拡張子でエクスポートが可能です。

Drow.ioが他のER図作成ツールより優れていた点としては、無料なのに制限がほぼなく、機能が充実しているところ！

後でまとめている通り、他のツールは機能制限がありせっかく作成しても最終的に使えないものもあります。

そして、なんとVSCodeでの利用も可能です！

Web上での利用も不便な点など特にないですが、使い慣れているVSCodeで利用できるのはそれだけで使いやすく感じます。

### **導入方法**

VSCodeの拡張機能検索窓で「Drow.io Integration」と検索し、インストールします。

[Draw.io Integration - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio)

### ****使い方****

1. 拡張子を `.dio`　のファイルを作成します。
2. ER図の図形を使うには、左下の「その他の図形」をクリックし、「ER」にチェックを入れて適用をクリックします。
3. 左側にERという項目が追加されるので、そこからER図で使いたい図形をドラックアンドドロップします。
4. エクスポートしたい場合は左上の「ファイル」をクリックし、「Export」から好きな形式を選択します。

## **他ツールのレビュー**

### ****SqlDBM****

[SqlDBM - Online Database Modeler](https://sqldbm.com/)

最初に使ったツールで、完全に見た目が好みで使い始めました。

[sqlDBM](https://sqldbm.com/)はER図作成に特化した機能充実しており、テンプレートや表示がかなり見やすいツールです。

しかし、無料だと機能制限があり、その中に書き出しが含まれていました。

また、使い方に関する記事が日本語ではあまりヒットしなかったという印象があります。

### ****Lucidchart****

[Intelligent Diagramming | Lucidchart](https://www.lucidchart.com/)

2つめに使ったのがこのツールで、他の図形作成でも使ったことのあるツールでした。

[Lucidchart](https://www.lucidchart.com/)は選定のポイントは押さえていて使いやすかったのですが、一文書あたりのオブジェクト制限があり、データベースの数が増えると無料枠では対応できなくなります。

作成の終盤に気づき、かなりがっかりしました。
【Swift】ビルド後、黒画面になる。結論：Info.plist Fileの削除を復元させて解決

# はじめに
ビルド後にシミュレータでも実機でも、黒画面になってしまいました。
どこかのタイミングで黒画面しか映らなくなり、ググりまくりましたが、どれも解決策にはなり得ませんでした。

そこで、新しいプロジェクトを作成し直し、少しずつ実装していき、設定も一つ一つ見直していったら、やっと解決したので、ここにしたためます。

# 環境
| No |    項目     |   内容    |
|---:|-------------|------------|
| 1  |      OS       |   MacOS Monterey ver 12.5.1     |
| 2  |      Xcode     |   14.1 |
| 3 |     Swift     |   5.7.1|

# 結論
Info.plist Fileをなんとなく削除してしまっていた。info.plistは使用していないという認識でした。
三日三晩悩み、それを復元させたら解決しました。

# 解説
TARGETS => Build Settings => Packaging => info.plist Fileに入り、ハイライトの部分を丸ごと削除すると、黒画面になります。
**↓削除前**
<img width="1400" alt="TARGETS" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/07914789-5775-cdb7-c159-1a8d0a8524be.png">
**↓削除後**
<img width="1400" alt="黒画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/d0a455bb-a421-cdab-d970-b9d7bd031ff4.png">
**↓起動時のシミュレータ　黒画面**
<img width="200" alt="黒画面" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/dc647937-cb5f-9fdf-d67b-64374dc19b65.png">
適当なプロジェクトを作るか既存のプロジェクトからこの部分をコピペすると正常に起動します。
**↓適当なプロジェクトのInfo.plist Fileをコピペ**
![スクリーンショット 2022-11-16 2.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/cf925298-1724-91e3-5dca-e7b69b26f3d6.png)
**↓コピペした部分のValueをプロジェクト名/Info.plistに変更**
![スクリーンショット 2022-11-16 2.11.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/d4fe5dd8-6a4e-178b-aaa4-8566ada5f758.png)
**起動成功！！**

# おわりに
むやみやたらに必要なさそうと、設定を削除したり変更したりするのは危険でありつつ、今回のことはいい教訓になりました。

それとなぜ、今回の部分を削除したら黒画面になったのか。
それは、Storyboard Nameの設定をMainにしている行があります。これが読み込まれなくなるから、黒画面になったと考えます。（あくまで個人の予想です。）
![スクリーンショット 2022-11-16 2.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/bdf474db-a663-e31d-c370-a58552d86dd1.png)
[Go] Cloud OS Login APIを使ってComputeEngineにサービスアカウントのユーザーを作成する

あまり探してもサンプルコードはドキュメントが発見できなかったためメモ
いい感じに使って下さい
```go
package main

import (
	"context"
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"log"
	"os"
	"time"

	oslogin "cloud.google.com/go/oslogin/apiv1"
	"cloud.google.com/go/oslogin/apiv1/osloginpb"
	"golang.org/x/crypto/ssh"
	"google.golang.org/api/option"
	"google.golang.org/genproto/googleapis/cloud/oslogin/common"
)

// generatePrivateKey 指定したビットサイズで秘密鍵を作成する
func generatePrivateKey(bitSize int) (*rsa.PrivateKey, error) {
	// Private Key generation
	privateKey, err := rsa.GenerateKey(rand.Reader, bitSize)
	if err != nil {
		return nil, err
	}

	// Validate Private Key
	err = privateKey.Validate()
	if err != nil {
		return nil, err
	}

	return privateKey, nil
}

// generatePublicKey 秘密鍵から公開鍵を生成する
func generatePublicKey(privatekey *rsa.PublicKey) ([]byte, error) {
	publicRsaKey, err := ssh.NewPublicKey(privatekey)
	if err != nil {
		return nil, err
	}

	pubKeyBytes := ssh.MarshalAuthorizedKey(publicRsaKey)

	// Remove last element(newline)
	return pubKeyBytes[:len(pubKeyBytes)-1], nil
}

// encodePrivateKeyToPEM 秘密鍵をRSAからPEMへ変換する
func encodePrivateKeyToPEM(privateKey *rsa.PrivateKey) []byte {
	// Get ASN.1 DER format
	privDER := x509.MarshalPKCS1PrivateKey(privateKey)

	// pem.Block
	privBlock := pem.Block{
		Type:    "RSA PRIVATE KEY",
		Headers: nil,
		Bytes:   privDER,
	}

	// Private key in PEM format
	privatePEM := pem.EncodeToMemory(&privBlock)

	return privatePEM
}

// writePemToFile 鍵を書き込む
func writeKeyToFile(keyBytes []byte, saveFileTo string) error {
	err := os.WriteFile(saveFileTo, keyBytes, 0600)
	if err != nil {
		return err
	}
	return nil
}

func main() {
	// contextの生成
	ctx := context.Background()

	// クライアント作成
	ols, err := oslogin.NewClient(ctx)
	if err != nil {
		log.Fatal(err)
	}
	// 一応deferしてるけど、Fatalの場合動かないと思う 本番で使う場合治してね
	defer ols.Close()

	// SSH用の鍵の生成 お好みでビットサイズを調整
	pvtKey, err := generatePrivateKey(1024)
	if err != nil {
		log.Fatal(err)
	}
	pk := encodePrivateKeyToPEM(pvtKey)
	log.Println("generated private key:", string(pk))

	pubKey, err := generatePublicKey(&pvtKey.PublicKey)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("generated public key:", string(pubKey))

	// 秘密鍵の書き込み
	err = writeKeyToFile(pk, "./id_rsa")
	if err != nil {
		log.Fatal(err)
	}

	// 公開鍵の書き込み
	err = writeKeyToFile(pubKey, "./id_rsa_test.pub")
	if err != nil {
		log.Fatal(err)
	}

	// sshキーを読み込ませる
	// parent は"users/{サービスアカウントのmail の形式で入力する}
	parent := "users/compute-engine-user@project-id-xxxxxxxxxxxxxxxxxxxxx.iam.gserviceaccount.com"
	projectID := "yourproject-xxxxx"
	exp := time.Now().Add(6 * time.Hour)
	log.Println("Your key will be expires at", exp)
	is, err := ols.ImportSshPublicKey(ctx, &osloginpb.ImportSshPublicKeyRequest{
		Parent: parent,
		SshPublicKey: &common.SshPublicKey{
			Key:                string(pubKey),
			ExpirationTimeUsec: exp.UnixNano(),
		},
		ProjectId: projectID,
	})
	if err != nil {
		log.Fatalln("is err:", err)
	}
	log.Println("is:", is)
}

```
Error: error:0308010C:digital envelope routines::unsupported の解決策

## 状況
```
rails webpacker:compile
```
このコマンドを実行しようとした。

## エラーログ
```
Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:140:10)
    at module.exports (/Users/***********/Desktop/rails_tuning_sample_app/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/Users/***********/Desktop/rails_tuning_sample_app/node_modules/webpack/lib/NormalModule.js:417:16)
    at handleParseError (/Users/***********/Desktop/rails_tuning_sample_app/node_modules/webpack/lib/NormalModule.js:471:10)
    at /Users/***********/Desktop/rails_tuning_sample_app/node_modules/webpack/lib/NormalModule.js:503:5
    at /Users/***********/Desktop/rails_tuning_sample_app/node_modules/webpack/lib/NormalModule.js:358:12
    at /Users/***********/Desktop/rails_tuning_sample_app/node_modules/loader-runner/lib/LoaderRunner.js:373:3
    at iterateNormalLoaders (/Users/***********/Desktop/rails_tuning_sample_app/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
    at iterateNormalLoaders (/Users/***********/Desktop/rails_tuning_sample_app/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
    at /Users/***********/Desktop/rails_tuning_sample_app/node_modules/loader-runner/lib/LoaderRunner.js:236:3
    at context.callback (/Users/***********/Desktop/rails_tuning_sample_app/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
    at /Users/***********/Desktop/rails_tuning_sample_app/node_modules/babel-loader/lib/index.js:44:71 {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}
```
こんな感じのエラーが出た。

## 解決策
```
export NODE_OPTIONS=--openssl-legacy-provider
```
これで解決できた。
esolangとは何か

みなさまはesolangをやってますか？
やってない人は今すぐ初めてみるのがおすすめです。

# esolangとは何か
## esolangの語源
esolangとはesoteric programming languageの略です。
esotericとは"難解な"といった意味の単語で、そのまま難解なプログラミング言語という意味です。

esolangの特性はなんといってもその可読性の低さでしょう。
~~正直、可読性が低く人間が記述することを想定していない機械語またはアセンブリ言語ではない言語はesolangだと思います。~~

## 有名なesolang
有名なesolangは以下の通りです。

### Brainfuck
言わずと知れた代表的なesolang。使用する文字は`+`,`-`,`>`,`<`,`.`,`,`,`[`,`]`の8文字でそれぞれが8種類の命令と対応しています。それ以外の文字は無視されます。
この言語は非常に仕様が簡単なので~~実用性を求めないのであれば~~プログラミング初心者にもおすすめできます。
あとはこの言語のインタプリタを作ることが個人的な技術的なベンチマークになってます。

### Piet
画像がソースコードになる言語。画像でプログラミングができるという性質から一定の知名度はあるけど仕様が曖昧なesolangの一つです。
wikiなどに添付されているものであっても正しく動作しないことなども普通にあります。

### Lazy K
純粋な関数型言語です。これはUnlambdaというesolangを純粋な関数型言語にすることをモチベーションとして作成されました。
Lazy Kではいくつか記法があるもののそのいずれでも根幹を成す技術はSKIコンビネーターというものです。

### JSFuck
JavaScriptが動作する環境では動作する言語です。使用する文字は`[`,`]`,`(`,`)`,`+`,`!`の6種類でこれらを組み合わせてJavaScriptの仕様を悪用する感じです。
ちなみに上記6文字以外を使った`alert("hello!");`のようなソースコードも動作はします。
~~まあそれはJSFuckではないのですが。~~
つまり、*適当な手段を用いることで*JavaScriptのソースコードの一部をJSFuckに置換するということが可能ということです。

## esolangの有用性
~~**ないです。**~~
真面目な話、全く有用性がないわけではありません。
例えばBrainfuckはチューリング完全(C言語やJava、Pythonなどと同等の十分な計算能力があるという意味)を示すために用いられることがあります ~~[誰によって?]~~。
また、プログラミング言語の中でも比較的小さい構成なのでLazy Kなどの言語は研究的な価値があると言われています ~~[要出典]~~。
【Unity】空気抵抗を持つ物体の放物線の座標を取得できる関数

# 概要
![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/d56a650e-c755-4bc5-193a-44d5e211fb64.gif)
空気抵抗を持つ物体の放物線の座標を取得できる関数を作りました。

# コード
下記の関数をお手持ちの PhysicsUtil クラスに追加してご利用ください。

``` C#
public static Vector3 ParabolaPos(Vector3 position, Vector3 velocity,
    float time, float drag = 0f, Vector3? gravity = null, float? deltaTime = null)
{
    if (!gravity.HasValue) gravity = Physics.gravity;
    if (!deltaTime.HasValue) deltaTime = Time.fixedDeltaTime;

    if (drag <= 0f)
    {
        return position + velocity * time + gravity.Value * 0.5f * (time * time + time * deltaTime.Value);
    }

    var r = Mathf.Clamp01(1f - drag * deltaTime.Value);
    var r2 = 1f / (1f - r);
    var n = time / deltaTime.Value;
    var p = r * (1f - Mathf.Pow(r, n)) * r2;

    var result = position + velocity * deltaTime.Value * p;
    return result + gravity.Value * r * deltaTime.Value * deltaTime.Value * r2 * (n - p);
}

```

# 参考にさせていただいたブログ

https://karanokan.info/2018/08/09/post-861/
ajax通信を用いて非同期でコメント機能を実装する

ほとんど私が書くことはないのですが、こことここの記事を参考にさせていただいたら簡単に実装できたよ！
ということで備忘録。
ajax通信を用いて非同期でコメント機能を実装するには、こちらの方のページが私にはとてもわかりやすかったです。（コメント欄も参考にされてください）
https://qiita.com/miyazaki_yusuke/items/dd1c053851a042cae893

そして、コメント欄も含めて余さず実行したけどうまくいかないぞ・・・？と思った時に、「そうだ！jQueryの実装してない！」となり外部検索でgemがあることを知り導入。けどうまくいかない。のでさらに検索したところ、こちらの方の記事で救われました。
https://qiita.com/tatsuhiko-nakayama/items/b2f0c77e794ca8c9bd74

素晴らしい方がたくさんいてよかった・・・
先人の方の知恵は偉大です。
position:fixedがスマホでうまく動かないとき

これで1日潰したので

## 結論

`head`に↓を追加でいけた。

`<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">`

## 参考:
https://stackoverflow.com/a/9524534

`position:fixed`は親要素にtransform指定してると上手く動かなかったり罠が多くてつらい...
１つの自動スケールプロファイル内に複数の規則が構成されている場合の判定方法

●１つの自動スケールプロファイル内に複数の規則が構成されている場合

１つの自動スケールプロファイル内で、スケールアウト・スケールインについての複数の規則を構成することができる。
１つの自動スケールプロファイル内で複数の規則が構成されている場合は、スケールアウトとスケールインでは規則の判定方法が異なる。

▲スケールアウトの規則は「いずれか」が満たされていれば自動スケールが実行される。
▲スケールインの規則は「すべて」が満たされている場合に限って自動スケールが実行される。
Ethereum理解②（Wrold State編）

## はじめに
Ethereumの勉強しているため、理解したことをまとめる。
第二弾は、Wrold State編。

※間違っている情報があれば、ご指摘いただければ幸いです。



## World Stateとは
World Stateとは、Ethereumのブロックチェーン上の全てのState（状態）のことである。
例えば、以下は全てWorld Stateの一部である。
・アカウントのETH残高
・アカウントが実行したTXの回数
・NFTの所有者アドレス
・コントラクトのオーナアドレス

World Stateは、Ethereumネットワークに参加しているフルノードのストレージに保存されている。
TXの実行によって、World Stateは常に変化していく。

## World Stateの詳細
World Stateは、「Address」と「Account State」のマッピングである。
![world-state.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526265/1bea8180-0618-8683-2957-0fb35f4aa8a6.png)
Addressは、Ethereumのアドレスのことで、20byteの16進数文字列である。
Account Stateは、Ethereum上のアカウントが持っている以下の4つの状態のことである。
・**nonce** （EOAによって実行されたTXの数 or CAによって作成されたコントラクトの数）
（ EOA = Externally Owned Account , CA = Contract Account）
・**balance**（アカウントが所有しているETH残高）
・**codehash**（アカウントに紐づくコントラクトコードのハッシュ値。EOAの場合は、空文字のハッシュ値）
・**storageRoot**（スマートコントラクトに保存されているデータの、マークルルートハッシュ）

データの保存のされ方は、キーと値の単純なマッピングではなく、**Merkle Patricia Trie**（= MTP）という木構造になっている。
World Stateは、**MTPで表現できる。


## World State の Merkle Patricia Trieの作成
以下の4つのAccount Stateを表現するMTPを作成する。
0x517b3a => 10ETH
0xc3a292 => 5ETH
0xc7520d => 16ETH
0xc7528e => 7ETH
（※アドレスは本来20byteだが、分かりやすくするため3byteとしている）
![world-state-MPT.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526265/bfa2ba92-694f-f56b-bd9b-0bfe6d2ea10d.png)




## Merkle Patricia Trieのハッシュの求め方
MTPの各ノードのハッシュは、ノードの値をRLPエンコードし、Keccak256によって求められる。

##### ブランチノードのハッシュの求め方
keccak256( rlp( Array(17) ) )
hashBの例： keccak256( rlp( [null, null, null, null,　null, hashA, null, null, null, null, null, null, hashB, null, null, null, null] ) )

##### リーフノードのハッシュの求め方
keccak256( rlp( [prefix + path, value] ) )
hashCの例： keccak256( rlp( [0x20a292, 5ETH] ) )


##### エクステンションノードのハッシュの求め方
keccak256( rlp( [prefix + path, value] ) )
hashDの例： keccak256( rlp( [0x0052, hashE] ) )


## まとめ
Merkle Patricia Trieは難しかったが、Ethereumのデータ構造について理解が深まった。
npm run storybook が動かなかったが、あるjs に1行足せば動いた話

# 前提
```
$ node -v
v18.7.0
```

## 参考書
TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発

https://www.amazon.co.jp/dp/B0B74C3TNQ

# 起きたこと
storybook が起動しない！

```
$ npm run storybook 

> nextjs-gihyo-book@0.1.0 storybook
> start-storybook -p 6006

info @storybook/react v6.5.13
info 
info => Loading presets
info Addon-docs: using MDX1
info => Using implicit CSS loaders
info => Using default Webpack5 setup
<i> [webpack-dev-middleware] wait until bundle finished
9% setup compilation DocGenPluginnode:internal/modules/cjs/loader:959
  throw err;
  ^

Error: Cannot find module 'webpack/lib/util/makeSerializable.js'
Require stack:
＜略＞
  ]
}

Node.js v18.7.0
```

# 対処方法
`storybook Cannot find module 'webpack/lib/util/makeSerializable.js'` でググる

## ヒットした記事
https://dev.classmethod.jp/articles/tried-to-add-storybook-to-nextjs-project/

> 対処方法としては、下記コメントで言及されているとおり.storybook/main.jsを修正することで対処できました。

```.storybook/main.js
module.exports = {
  "typescript" : { reactDocgen: false }, // 追加
  ＜略＞
}
```

## 参考
https://github.com/storybookjs/storybook/issues/15336

# 結果
上記の対応で、無事動きました。
Javaで何か作ってみる(2022/11/15 Day26)

## 今日やった事
- Javaの動画教材の演習問題である、Jihanプログラムの作成を行った。  
&rarr;コミットした内容は[こちら](https://github.com/takamatsuryota3/Java/commit/debd8725465fdbfadf83c547f16ce5576f07d72f)
## 参考にしたもの
- [【超絶丁寧解説】Javaプログラミングをゼロから学ぶ！絶対挫折させない「基礎入門」講座【講師評価4.3】](https://www.udemy.com/course/uz-java-kiso/)  
&rarr;今回取り組んだのは、この動画教材の中の、**J1-EX1_総合演習（アルゴリズム）** の**総合演習（Jihanプログラムの作成）** になる。
- [[Java]Integer.parseIntメソッドの使い方とは？parseIntメソッドやparseUnsignedIntメソッドの使い方・例外の発生するケース・配列の変換Javaコラム](https://www.fenet.jp/java/column/java_tips/6643/)  
&rarr;演習問題では触れられていないが、Integer.parseIntメソッドは、数字じゃない文字列（ex. aaaとか、あああ等）を変換しようとすると、例外発生する為、  
どういう対策がいいか参考にした。
## 所感
- Jihanプログラムを完成させる事が出来た。
- アルゴリズムを、「あーでもない、こーでもない」って考える時間が好きだなと改めて思った。  
&rarr;何気に風呂入っている時にも考えてた。
## 明日の予定
- 明日はケーキ屋さんプログラムを進めていきたい。
localhost_スマホ実機確認方法


localhostはパソコンそのものを表す別名？なのでプライベートIPを調べる必要がある。
自信はないが恐らくよく聞くイチクニイチロッパのアドレスのこと。

# 1. 現在のネットワーク・インターフェース構成情報を表示
```shell
ifconfig
```

# 2. ファイアーウォールが起動しているかの確認
```shell
sudo ufw status
```
**コマンド実行結果**
```shell
状態: アクティブ
```

「3.ファイアーウォールの無効化」もしくは「4.ファイアーウォール有効のままポートの開放」を行い実機から確認出来るように設定を変更する。
3.は多分セキュリティ的によろしくなさそうだがかなり手軽。とはいえ4.も実施するだけなら余裕。

# 3. ファイアーウォールの無効化
```shell
sudo ufw disable
```
**コマンド実行結果**
```shell
ファイアウォールを無効にし、システム起動時にも無効にします
```
※ちなみに再度有効化する場合は以下
```shell
sudo ufw enable
```

# 4. ファイアーウォール有効のままポートの開放
```shell
sudo ufw allow proto tcp to 0.0.0.0/0 port 開放したいポート番号
```

念の為確認
```shell
sudo ufw status
```

**コマンド実行結果**
```shell
状態: アクティブ

To                                                Action      From
--                                                ------      ----
前の手順で開放したポート番号/tcp                  ALLOW       Anywhere 
```

後は一番最初に確認した自分のプライベートIPアドレスのポートにPCと同じネットワークにつないだスマホからアクセスしたらOK

<br>
<br>
ポートの許可ではなく禁止するやり方とかifconfigの詳細等は以下参考にさせていただいたサイトにまとまってます。
<br>
ありがとうございました！！
<br>
<br>

以下参考サイト
- [【Ubuntu】ufwの使い方ー入門編ー](https://vpslife.server-memo.net/ubuntu_ufw_start/#toc3)
- [ufwの基本操作](https://qiita.com/RyoMa_0923/items/681f86196997bea236f0)
- [ifconfigの出力結果に書いてあること](https://qiita.com/pe-ta/items/aff8db72530c6baa11b2)
- [Ubuntuのファイアウォールを設定する](https://qiita.com/htshozawa/items/e24729a4ab332cb40313)
ObnizからEDUじゃないTelloを動かしてみた

# 前提
telloって何？っていう方はこちら。要は手のひらサイズの高機能ドローン。
15k円ぐらいあれば新品が買えるっぽい。

https://www.ryzerobotics.com/jp/tello

ちなみに私はガード付きにしました。イカツイ！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/811ac66e-d0a3-872b-423a-8cfb31092f79.jpeg" alt="tello本体とガード付き" width="500">

# はじめに

- EDUじゃないtelloは子機としてwifiにつなげるのは不可能。
- 中継を挟むことでObnizからtelloを操作する。

[参考]

https://shinkudrone.com/wp-content/uploads/2021/06/telloedu.pdf?fbclid=IwAR1ahIkgqH2IpQZXX50Npo_Ux17R3IrLRSoGPF6ia9ZT1XLqQAYS7QaSuCA

# やったこと

- EDUじゃないtelloと接続するために、telloと一対一で接続する仲介役をM5Atomをつかって用意した。
- Obnizから仲介するM5Atomに対して制御内容を送ることで、obniz→M5Atom→telloという連携パスを構成した。

# 構成
事前にM5Atom liteに対して[tello-UART-porter](https://github.com/henjin0/tello_UART_porter)を書き込んでおく。その後、
Obniz Board 1YとM5Atom liteをUART通信するために結線すればハードウェアの準備は完了。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271381/e5782124-fafd-50ce-ba3d-681c24bdbb78.jpeg" alt="UARTでObniz　BoardとM5Atomを結線" width="500">

## tello-UART-Porterについて
要はUARTから送られたコマンドを解釈してtelloへ制御指定を送ってくれるやつです。
インストール方法などはREADMEを参照する。

https://github.com/henjin0/tello_UART_porter

# Obniz Cloud側のコードについて

実を言うとこちらに公開していたり。

:::note alert
必ずコマンドの最後に改行(char(10))を入れてください。
これがないとコマンドが入力されたことを認識できません。
:::

https://github.com/henjin0/tello_UART_porter/blob/main/Obniz_tello_UART_porter.html

# 結果

Obnizから制御して、telloを離着陸させてみました。

<iframe width="560" height="315" src="https://www.youtube.com/embed/W9lqhjZJ0YA?start=2" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# おわりに

- Obnizからtelloを制御することができた。
- また、telloから得られた信号もtello-UART-porterから取得できるので、ページ上にいい感じにUI組んでも面白いかも？
YAMAHA RTXだけでBGP網を構築する。

## はじめに
YAMAHA RTXシリーズに慣れ浸じんでいる方は大変多いと思いますが、私もその中の一人です。
今回ルータはRTXのみで２拠点間の __場内検証__ を行うことになりました。
## 検証内容
ルーティングプロトコルはBGPです。
拠点間を結ぶWAN回線はL3閉域網全体。間にRTXを挟む形で擬似網構成にしました。
場内検証の目的は、拠点間での疎通確認です。


RTX同士でBGPネイバ確立、ルート広報を行って両拠点のルーティング情報を学習できている事を確認しました。
擬似閉域網見立てのRTXは検証用にキッティングしました。


## 沼にハマったポイント
__擬似閉域網のRTXが各ルータとBGPネイバを確立するが、ルートをアドバタイズしないという事象が発生しました。__ 

## 設定
AS番号の書きっぷりがポイントなので、bgp neighborは記載省きます。

```ruby:RTX
RT-A # bgp autonomous-system 65000
RT-B  # bgp autonomous-system 65001
MOU-RT # # bgp autonomous-system 6000
```
:::note info
___検証環境___
RT-A 
__AS65000__
 |
 |
MOU-RT
__AS6000__
 |
 |
RT-B
__AS65001__
:::


## 失敗例

```ruby:MOU-RT
    bgp use on
    bgp autonomous-system 6500
    bgp import filter 1 include all
    bgp import 65000 bgp 6000 filter 1
    bgp import 65001 bgp 6000 filter 1
    bgp export filter 1 include all
    bgp export 65000 filter 1
    bgp export 65001 filter 1
```
## 成功例

```ruby:MOU-RT
    bgp use on
    bgp autonomous-system 6500
    bgp import filter 1 include all
    bgp import 65000 bgp 65001 filter 1
    bgp import 65001 bgp 65000 filter 1
    bgp export filter 1 include all
    bgp export 65000 filter 1
    bgp export 65001 filter 1
```

## 解説
RT-1⇨MOUーRT⇨RT-2のようにルート広告するためには、
MOU-RTのbgp　import 65000　bgp　__FROM_AS__　を自分（MOU-RT_AS番号）ではなく
RT-2　AS番号を指定してあげる必要がありました。
```ruby:MOU-RT
[書式]
bgp import REMOTE_AS PROTOCOL [FROM_AS] filter FILTER_NUM ...
```

## 終わりに
From＿ASということで自身のAS番号を入れてしまいそうですが、
BGPをRT-1からRT-2へ流す役割のルータなので、それを意識してimportさせることを学びました。
【Git】リポジトリ名を取得する方法

## 取得方法

以下のコマンドを実行することでリポジトリ名を取得できます。  

```terminal
$ basename -s .git `git remote get-url origin`
sample-repo
```

- `git remote get-url origin`
  リポジトリのURLを取得する。  
  `https://github.com/UserName/repo-name.git`のように取得できる。  

- `basename`  
  `git remote get-url origin`の実行結果から`repo-name.git`部分のみ取得する。  

- `-s .git`  
  `repo-name.git`から`.git`を除外する。
【Flutter】BuildしたipaをiOSにインストールした[DeployGate]

## 記事を書くきっかけ
FlutterはiOSで動作確認するときに有線である必要がある。
正直、だるかったしアプリを起動してない状態からのテストが厄介だった。

-> アプリをipaにしてインストールしてみよう。

今回は以下の２パターンを紹介します。
1. Buildしたいプロジェクトが一つの場合(`dev`と`release`で分かれていない)
1. Buildしたいプロジェクトが複数の場合(`dev`と`release`で分かれている)
## 方法
### 1：Buildしたいプロジェクトが一つの場合(`dev`と`release`で分かれていない)
簡単である。
(表題とは異なるが、2の方で`DeployGate`を使う手順を書く)

- デバイス名を取得
```
flutter devices

-> iPhone 13 Pro Max (mobile) • 端末のUDID • ios  • com.apple.CoreSimulator.SimRuntime.iOS-15-2 (simulator)
```
- iOSでbuildする
```
flutter build iOS
```
- 任意の端末にインストールする
```
flutter install -d 端末のUDID
```

### 2：Buildしたいプロジェクトが複数の場合(`dev`と`release`で分かれている)
厄介である。
ここでは`DeployGate`を使った方法で端末にインストールする。

- 準備するもの
以下ファイルを作成し、いい感じのところに配置する。
今回は`ios/`に配置した。
わかりやすく`ExportOptionsDev.plist`という名前にしたので、当然任意で良い。
``` ExportOptionsDev.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>compileBitcode</key>
   <true/>
   <key>method</key>
   <string>development</string>
   <key>signingStyle</key>
   <string>automatic</string>
   <key>stripSwiftSymbols</key>
   <true/>
   <key>teamID</key>
   <string>XXXXXXXXX</string>
   <key>thinning</key>
   <string>&lt;none&gt;</string>
</dict>
</plist>
```
- buildでipaを作成する。
`flutter build ipa`はipaを作成する。
`--debug`はswift側で決めたものを入れる。(あまり理解してない)
`--export-options-plist="ios/ExportOptionsDev.plist"`は先程作ったファイルをoptions.plistに指定する。
```
flutter build ipa --debug --export-options-plist="ios/ExportOptionsDev.plist"
```
->>> ipaファイルが作成される。
- 任意の端末にインストールする
1. DeployGateに作成したipaをドラッグ＆ドロップ
1. プロジェクトを作成し、配布用リンクを作成
※UDID未登録端末にはインストールできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633771/da1bdf8c-b115-6dd5-bbad-8b0d98b12bae.png)

## 最後に
iOSアプリ開発をしています。
主にSwiftですが、最近は熱が入ってきてFlutterも🦾
色々やってます。もし良かったら見てってください。

https://sogablog.net/
Sensor data fusion, ボッシュ自動車handbook 11版(146) p.1860

Drive assistance and sensors, Sensor data fusion,  ボッシュ自動車handbook 11版(146)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>
# ボッシュ自動車ハンドブック version 11, 2022
Automotive Handbook  May 2, 2022
https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new
https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
Vehicle bodies,  1310
Comfort and convenience, 1392
Safety systems in the motor vehicle, 1410
Vehicle security systems, 1430
Automotive electrics, 1450
Vehicle electrical systems for hybrid and electric vehicles, 1560
Automotive electronics, 1620
Infotainment 1780
Drive assistance and sensors, 1804
Drive assistance systems 1872
Future of automated driving 1934
Appendics, 1940

#  Sensor data fusion, p.1860
## Introduction
## Sensors
## Fusion types
## AI based sensor data fusion

# Reference
[1] A. Elfes, Using occupancy grids for mobile robot perception and navigation, Computer, Vol. 22. No. 6 pp.46-57, 1989
# 自己参考資料(self reference)
ボッシュ自動車ハンドブック 
https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook
https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

数学関連記事１００
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事一覧
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
### 文書履歴(document history)
ver. 0.01 初稿 20221115
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
今日のdocker error : Unable to locate package 



```macOS:bash
$ docker run -it ubuntu /bin/bash
```

https://github.com/COVESA/vsomeip

Dockerを用いてVSOMEIPを使ってみる

https://workspacememory.hatenablog.com/entry/2020/11/08/193105


```docker:bash
# apt install tzdata gcc build-essential cmake make wget libtool unzip net-tools 
# apt -y install libboost-system1.71-dev libboost-thread1.71-dev libboost-log1.71-dev  
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package libboost-system1.71-dev
```
今日のdocker error: has no installation candidate




```macOS:bash
$ docker run -it ubuntu /bin/bash
```

https://github.com/COVESA/vsomeip

Dockerを用いてVSOMEIPを使ってみる

https://workspacememory.hatenablog.com/entry/2020/11/08/193105



```ubuntu:bash
# apt -y install wget 
# apt install  libboost-system1.55-dev libboost-thread1.55-dev libboost-log1.55-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package libboost-system1.55-dev is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

Package libboost-thread1.55-dev is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

Package libboost-log1.55-dev is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Unable to locate package install
E: Package 'libboost-system1.55-dev' has no installation candidate
E: Package 'libboost-thread1.55-dev' has no installation candidate
E: Package 'libboost-log1.55-dev' has no installation candidate
```
Active RecordでUNIONする方法

## はじめに
Active Recordでは `union` メソッドは提供されていません。ですが、運用上どうしても UNION したい場合はどうすればいいのか調査を行い培った知見をまとめます。

## 前提
* 以下の環境を利用します
    * `Rails 7.0.3.1`
    * `Active Record 7.0.3.1`

## UNIONする方法
1. `active_record_extended` gemを `bundle install` する
https://github.com/GeorgeKaraszi/ActiveRecordExtended

2. `active_record_extended` gem で提供されている `union` メソッドを利用する

以下のように簡単にUNIONのSQLが発行できます。

```ruby
irb(main):001:0> Author.union(Author.where(id: 2), Author.where(name: 'Yoko Sato'))
  Author Load (3.6ms)  SELECT "authors".* FROM (( (SELECT "authors".* FROM "authors" WHERE "authors"."id" = 2) UNION (SELECT "authors".* FROM "authors" WHERE "authors"."name" = 'Yoko Sato') )) authors
=>
[#<Author:0x000000010b5249a8
  id: 2,
  name: "Taro Yamada",
  created_at: Mon, 14 Nov 2022 00:14:13.438430000 JST +09:00,
  updated_at: Mon, 14 Nov 2022 00:14:13.438430000 JST +09:00>,
 #<Author:0x000000010b5844c0
  id: 3,
  name: "Yoko Sato",
  created_at: Mon, 14 Nov 2022 00:14:28.093465000 JST +09:00,
  updated_at: Mon, 14 Nov 2022 00:14:28.093465000 JST +09:00>]
```

実行結果は `where` メソッドと同じように `ActiveRecord_Relation` で返ってくるので、通常のActive Recordの絞り込みや並び替えが使えるのがありがたいです。

```ruby
irb(main):003:0> result.class
=> Author::ActiveRecord_Relation
```

## active_record_extended gem の良い点

### 継続的にメンテナンスされている

[CHANGELOG](https://github.com/GeorgeKaraszi/ActiveRecordExtended/blob/master/CHANGELOG.md)を見た限りでは、2019年5月から2022年8月まで継続的にメンテナンスされています。これからも引き続きメンテナンスされる印象です。

### Ruby 3.1.x /Rails 7.0.xに対応

現時点(2022/11/15)で最新バージョンに対応しているので安心です。


### PostgreSQLの拡張機能に対応している

標準のActive Recordが対応していないPostgreSQL固有の機能を使うことができ、用途によっては便利だと思います。

## UNIONする他の方法はあるか :thinking: 

他にも以下の方法があります。

* 生SQLで書く
* [active_record_union](https://github.com/brianhempel/active_record_union) gem を利用する
    * ダウンロード数は1040万件と圧倒的に多いのですが、2018/01/14を最後に更新が停止やRailsのサポートバージョンが `5.2` と最新を追従できていませんでした。

あるにはありましたが、安全性・長期的な利用を考えると現時点(2022/11/15)では `active_record_extended` が良さそうでした。


## まとめ

Active Recordを拡張するgemを利用して union を実現する方法を紹介しました。ただできればActive Recordの標準メソッドで union ができると一番ありがたいです。パフォーマンス的に問題なければ無理して union せずに `or` メソッドでも良いと思います。どうしても UNION でないと実現できない・パフォーマンス的に良い場合は候補として検討してみてください。
【Perl初学者】Perlの真偽値について

# 最初に
Perlには真偽値(ブール型)というのが無い。
Perlにおける「偽」と評価される値

### 数値

| 数値 |  |
|:-:|:-:|
| 0.00  | 0でも偽となる  |
|  0e2 | 0*10の２乗のこと  |
| 0*0  | 答えが0になるもの  |

### 文字列

""(空文字列), "0"

### 未定義値

- my;
    - `my;`などで宣言だけをして代入をしなかった（初期化をしていない）または`undef`を使用して未定義にされた変数のこと。
    
- undefを含む、返り値を返さないでサブルーチンの評価結果

### 「未定義値」とは

変数の中が何も入っていない値のこと。`何も入っていない値`なので一応値として判別されるらしい。
`==`や`eq`は使えない。（だがundefが入った変数==数値０でIF文を使い比較した場合、通ってしまったので一応報告していく）

### ついでに

Perlは普通のオブジェクト指向とはすこしちがった性質がある
一般的なオブジェクト指向だと`$x = "1" + "2";`だとエラーになるがPerlだとこれは文字列の数字同士を足してしまう。
これはPerlの性質で式の２項演算子(+のこと)が両辺のデータの形を決定するらしい。目から鱗。
今日のdocker error The user name or passphrase you entered is not correct.``

アプリはログインできるのに、コマンドでログインできない。

```macOS:bash
Error saving credentials: error storing credentials - err: exit status 1, out: `error storing credentials - err: exit status 1, out: `The user name or passphrase you entered is not correct.``
```

過去にもあったような気がする。　

どう解決したんだっけ。
資格取得について　資格取得を無駄と言ってくるモブキャラたちは無視してください

# わたしの自己紹介
1社目：テストをする人　350万円
2社目：SE　430万円
3社目：AWSに関わる人　600万円

:::note info
3社目で大きく**年収**が上がりました。
:::
趣味：節約（風呂なし4万5000円、半額弁当生活）
資格：AWS SAA、TOEIC 700点オーバー

# 資格取得について
新卒や転職面接で資格が取得できているかどうかは重要な1要素です。
わたしは転職面接の時に1年目から全く履歴書の資格欄が更新していないことから

:::note info
最終面接の時に役員から「成長意欲のないエンジニアと評価せざるを得ない」
と言われました。
:::


それを経てIT関連のAWSの資格と外資系企業へチャレンジするためのTOEIC700点を突破しました。
そんな中勉強を邪魔してくる対象と回避策を記載します。

## 勉強を邪魔してくる上司
正直にいってどうしようもないと思っています。
部下の頑張りを応援できない人は上司としてどうかと考えています。
### 邪魔してくる理由
①部下が自分よりできるようになると、上司の上司から横槍が飛んでくる
②勉強していない自分を正当化したい
③今の仕事に関係ないから無駄だと言い切る
### 対処方法
クビになった時のことを考えて勉強をしていると
暗に転職を視野に入れていることを促す
出ていくものに対しては基本的に優しい（興味がない）です。

## 勉強を邪魔してくる同僚
水は低きに流れ、人は易きに流れるという昔の人の言葉がありますが、まさにその通りだと思います。
同僚たちは邪魔をしている感覚はなく、モチベーションが低い人間が束になると勉強をしている自分が馬鹿馬鹿しくなります。

### 邪魔してくる理由
①勉強する人がいると空気が乱れるという謎理論を振り翳し、している人間をしないように仕向ける
②表彰などされて、会社全体が勉強しましょうという流れになると面倒なので、出る杭は先に打つスタイル
### 対処方法
勉強することを大々的に公開し、逆に引かせる。
わたしは、TOEIC600点取るということを部門MTGでも社内のSlackでも発信し続け
うちは英語使わないのにどうして勉強なんてという声に関しては
いつまでもここにいるとは限らないという神返答を行い自分にプレッシャーを課してました。

## 勉強を邪魔してくる家内
純粋に家族の時間が取れないことやリビングでいる時間を捨てて自分の部屋に篭るのでもちろんいい気はしません。
併せて、自分から一緒に勉強しようと誘っても基本的には断られますw
### 邪魔してくる理由
①リビングで一緒にテレビを見たい
②家事をしなくなる
### 対処方法
必ずお皿洗いやお風呂掃除は行う。ご飯を一緒に食べてテレビを見る。相手が一人でできる趣味（ゲーム・音楽）を一緒に見つける

## 勉強を邪魔してくる自分
ゲームやテレビや昼寝をしている方が圧倒的に楽なので、自分が一番厄介になる。
### 邪魔してくる理由
①失敗をしたくない
②楽をしたい
③努力をしたくない
### 対処方法
長期的なスパンで必ず考える。
TOEICやAWSを取得しても現職では給与アップなどほとんど評価はされませんでした。
挙句の果てには上司にはTOEICなんてなんで勉強してるの無駄という激励もいただきました。
が、年収を150万円あげた背景に間違いなく資格取得は生きていると思います。
450万円で4年間働いて得るお金を600万円の人間は3年で得ることができます。
必然的に1年間遊べると理解してもなんら遜色ありません。
資格取得において8ヶ月近くしか勉強はしてませんが、効果としては絶大だったと思います。

:::note info
資格を勉強する目的を必ず見つけましょう。
お金◎、転職◎、上司に言われたから✖︎
:::
ElixirでQRコードを表示して楽しむ


[Elixir]: https://elixir-lang.org/
[Erlang]: https://www.erlang.org/
[IEx]: https://elixirschool.com/ja/lessons/basics/basics/#%E5%AF%BE%E8%A9%B1%E3%83%A2%E3%83%BC%E3%83%89
[req]: https://github.com/wojtekmach/req
[toolshed]: https://github.com/elixir-toolshed/toolshed
[QRコード]: https://ja.wikipedia.org/wiki/QR%E3%82%B3%E3%83%BC%E3%83%89
[QRenco.de]: https://qrenco.de
[chubin/qrenco.de]: https://github.com/chubin/qrenco.de
[fukuchi/libqrencode]: https://github.com/fukuchi/libqrencode
[iodevs/qr_code]: https://github.com/iodevs/qr_code
[remiq/qr_code]: https://github.com/remiq/qr_code
[nbw/qrusty]: https://github.com/nbw/qrusty
[pggalaviz/qrcoder]: https://github.com/pggalaviz/qrcoder

> [QRコード（キューアールコード）は、1994年（平成6年）に自動車部品メーカーであるデンソー（愛知県）の開発部門（現在は分社化してデンソーウェーブ）が発明したマトリックス型二次元コードである。][QRコード]

https://qiita.com/torifukukaiou/items/17d55cf896c24b13350e

## Toolshed

[IEx]シェルを起動します。

```
iex
```

[toolshed]をインストールします。

```elixir
Mix.install [{:toolshed, "~> 0.2.0"}]
```

`Toolshed.qr_encode/1`を使います。

```elixir
use Toolshed
qr_encode "elixir-lang.org"
```

:tada:　以上

## `Toolshed.qr_encode/1`

`Toolshed.qr_encode/1`は[QRenco.de]というウエブサービスを使って[QRコード]を生成しています。

https://github.com/elixir-toolshed/toolshed/blob/eb5630fbe87542bbc8b1b4a56c72122379c3aa32/lib/toolshed/qr_encode.ex#L19-L25

## QRenco.de

[QRenco.de]は[fukuchi/libqrencode]というプログラムを使って[QRコード]を生成しています。

https://github.com/chubin/qrenco.de

https://github.com/fukuchi/libqrencode

## Req

[QRenco.de]はウエブサービスなので[Elixir]コードから直接使うこともできます。試しに[req]というHTTPクライアントを使ってやってみます。

[IEx]シェルを起動します。

```
iex
```

[req]をインストールします。

```elixir
Mix.install [{:req, "~> 0.3.0"}]
```

[req]は柔軟性のある構造をしていまして、パイプで繋いで書くこともできますし、関数一個で書くこともできます。

```elixir
form = [x: "elixir-lang.org"]

Req.new(url: "https://qrenco.de", method: :post)
|> Req.Request.merge_options(form: form)
|> Req.Request.put_header("User-Agent", "curl")
|> Req.Request.run!()
|> then(&IO.puts(&1.body))
```

```elixir
form = [x: "elixir-lang.org"]

Req.post!("https://qrenco.de", form: form, headers: [{"User-Agent", "curl"}])
|> then(&IO.puts(&1.body))
```

## [他のQRコード関連Elixirパッケージ](https://hex.pm/packages?search=qr)

- [iodevs/qr_code]: Elixir 100%
- [remiq/qr_code]: Elixir 100%
- [nbw/qrusty]: Elixir + Rust
- [pggalaviz/qrcoder]: Elixir + Rust

順不同

## ご参考までに

https://qiita.com/piacerex/items/e0b6e46b1325bb931122

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

https://qiita.com/piacerex/items/e5590fa287d3c89eeebf
ABC113 C - ID(diff 878) を C++ で解く

既に解いた方も多いと思うが、
解説記事が Qiita に少ないので書いてみる。

https://atcoder.jp/contests/abc113/tasks/abc113_c

思考のアプローチはシンプル。
**step 1**. 入力を丸ごと 昇順で sort。
**step 2**. 上から順番に答えとなる文字列を作り、map で保存。
**step 3**. 入力の順番に沿って map から取り出す。

あとは実装。

```id.cpp
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
using namespace std;

int main() {
	int N, M; cin >> N >> M;
	int P, Y; vector<pair<int, int>>memo;
	for (int i = 0; i < M; i++) {
		cin >> P >> Y;
		memo.push_back(pair(P, Y));
	}
	vector<pair<int, int>>ans = memo;
    //step1: sort
	sort(memo.begin(), memo.end());

    //step 2: make map
	map<string, string>list;
	string temp = "000000";
	int cur = memo[0].first; int cnt = 1;
	for (int i = 0; i < M; i++) {
		string key = to_string(memo[i].first) + "_" + to_string(memo[i].second);

		if (cur != memo[i].first)
			cnt = 1; cur = memo[i].first;

		string A = to_string(memo[i].first);
		string B = to_string(cnt);
		cnt++;

		list[key] = temp.substr(0, 6 - A.size()) + A + temp.substr(0, 6 - B.size()) + B;
	}

    //step 3:output answer
	for (auto x : ans) {
		string key = to_string(x.first) + "_" + to_string(x.second);
		cout << list[key] << "\n";
	}
	//while (1) {}
	return 0;
}
```

有識者によると座標圧縮なる考え方があるらしい。

https://qiita.com/gummie/items/ddcbed2a255ea8e65b18

コメント少なすぎ!? 解説になったのかな;( ;•ω•ก)
Google Chrome で簡易スクレイピング

# 同じクラス名の複数のタグのデータを取得する

```html:スクレイピング対象HTML
<a id="NameId">
    <span class="paramName">
        NameId <span class="paramOptional">optional</span>
    </span>
</a>
```

```javascript:スクレイピングスクリプト
$(".paramName").toArray().map(e => e.innerText)
```
gnuplot でファイルを読み込めない

# 解決策
- cmd(コマンドプロンプト)でリダイレクト(ファイルを出力)する。
- powerShellで```./実行ファイル名 | Out-File -Encoding utf8 出力ファイル名```
# VSCode で gnuplot を使う上での注意点
### エラーが出る
```sample.gp
plot "sample.txt" u 1:2 t "a" w lp, "sample.txt" u 1:3 t "b" w lp

set  xlabel  "xlabel"
set  ylabel  "ylabel"
set  title  "title"
set xzeroaxis

replot
quit
```
gnuplot を用いてグラフを描写するとき、以下のコマンドを入力する。
```
gnuplot> load "sample.gp"
```
このとき以下のようなエラーが出ることがある。
```
"sample.gp" line 1: warning: Skipping data file with no valid points
"graph.gp" line 1: x range is invalid
```
### エラーの原因
このエラーの原因は、```sample.txt```が```UTF-16 LE```などの```UTF-8```**以外の文字コード**で保存されていることが原因であった。

### なぜ```UTF-16 LE```で保存されたのか
VSCode を使用している場合、ターミナルとして無意識的に PowerShell を使っていることがある。PowerShell で以下のコマンドを実行してexeファイルを他のファイルに出力すると、なんと```UTF-16 LE```で保存されてしまう。
```
$> sample.exe > "sample.txt"
```
### 解決策
最も簡単な解決策として **Commmand Prompt にターミナルを切り替える**がある。Commmand Prompt で上のコマンドを実行すると、しっかり```UTF-8```で保存される。また，powerShellで以下のようなコマンドを実行することでも```UTF-8```で保存される。
```
./実行ファイル名 | Out-File -Encoding utf8 出力ファイル名
```
# おまけ
### ターミナルを切り替える方法
- ターミナルの右上の + マークの横の三角をクリックする
- 任意のターミナルを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969230/7c995011-93e2-ac52-7684-65f75a9b5a66.png)

# 変更履歴
2022/11/22 powerShellから文字コードを指定する方法を追記
PythonでFlaskを使ってPOSTで送られたデータの確認用

PythonでFlaskを使い、ウェブアプリを作っています。
POSTで送られたデータの確認をしたいと思い、コードを書きました。
このコードは、汎用で使えると思います。
HTMLの部分は、base.htmlで作って継承できるように書きました。

```Python
{% extends 'base.html' %}
{% block head %}
<title>データの出力</title>
{% endblock %} 
{% block content %}
<h1>キーとバリュー</h1>
<div>
    <h2>キー一覧</h2>
    <ul>
    {% for key in user_data.keys() %}
    <li>{{ key }}</li>
    {% endfor %}
    </ul>
</div>
<div>
<h2>入力されたデータ</h2>
<ul>
    {% for key, value in user_data.items() %}
    <li>{{ key }}: {{ value }}</li>
    {% endfor %}
</div>
{% endblock %}
```
下記の記事を参考にして、書きました。

https://fuji-pocketbook.net/flask-form/

https://tanuhack.com/flask-temp-extends/

https://yohei-a.hatenablog.jp/entry/20180503/1525366741
『サイバーセキュリティプログラミング第2版』の読書メモ (4)

ひきつづき『サイバーセキュリティプログラミング第2版』の読書メモです。

https://www.oreilly.co.jp/books/9784873119731/

4.3 章まで進みました。記載されているコードをじっくり確認しながら読み進めています。

## P86 detect 関数より

python から OpenCV を使って画像データに人の顔が含まれるかを検出する関数です。が、「ある一行」の理解につまづきました。

```python
rects[:,2:] += rects[:,:2] # ⑤
```

P87 の解説によると、

> … rects は (x, y, width, height) という形式であり、x, y は四角形の左下の座標、width, height は四角形の幅と高さを表す。
> ⑤に示す Python のスライス構文により上記の rects データを (x1, y1, x1+width, y1+width) ― 言い換えると (x1, y1, x2, y2) ― に変換することで、cv2.rectangle の引数として利用しやすくしている。

著者は「Python のスライス構文」と言っていますが、これはどうやら **NumPy モジュールの配列演算**ということでした。

以下のようにして処理内容を確認してみました。

```python
import numpy
rects = numpy.array([[1,2,10,20],[3,5,30,50],[7,9,70,90]])
print(rects)
rects[:,2:] += rects[:,:2]
print(rects)
```

このコードを実行すると、

```
>>> import numpy
>>> rects = numpy.array([[1,2,10,20],[3,5,30,50],[7,9,70,90]])
>>> print(rects)
[[ 1  2 10 20]
 [ 3  5 30 50]
 [ 7  9 70 90]]
>>> rects[:,2:] += rects[:,:2]
>>> print(rects)
[[ 1  2 11 22]
 [ 3  5 33 55]
 [ 7  9 77 99]]
>>>
```

図示すると、青で囲った部分の各要素を赤で囲った部分の各要素でインクリメントしています。

![fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960096/543e69e3-b538-f0d4-8906-dd72ee776df6.png)


同等の処理を泥臭い書き方をすると次のようになります。

```Python
for i in range(len(rects)):
	rects[i][2] = rects[i][2] + rects[i][0]
	rects[i][3] = rects[i][3] + rects[i][1]
```

この3行が先ほどの 1行に凝縮されているということでした。
相手の反応から自分の器を広げるチャンスに変わる

とある案件の仕様について上の人と話すこととなり、
ミーティングをした時の話。

その上の人はまじめな方で、お客さんに質のよい成果物をつくるため、
質問やご指摘などいろいろ頂いていた。

とある指摘を上の人がした際、一瞬その指摘を受けた人が返事するまで結構長い時間、間があったタイミングがあった。

上の人の傾向として、
クオリティを上げようとしてその指摘をあげたのだが、その指摘を受けた人はどうやら納得がいかなかったようだ。
（あとから「指摘を受けた人」から聞いた。）

指摘を受けた人の考えでは、
それだけの時間や労力をかけてその指摘を対応したとしても、効果が見込めないと思っていたのだ。

そこでぼくが感じたのが、この場面で上の人が指摘を押し通すことはできるが、
これだと非常にもったいない。。と思った。

なぜかというと、「結構長い時間、間があった」ということは何か指摘を受けた人が不満に思っているサインだし、指摘受けた人がどう思っているか聞くチャンスだから。

「どう思っているか」聞くことで、自分の器が広がるし、指摘を受けた人が意見をいいやすい状況を作りやすくなると思う。

また、もしその意見がまとを得ていなかったとしても指摘を受けた人がなぜそういう過ちをしたのか、
深く知れる機会になる。

ボクもあいての反応には敏感になろうと思う。
「人の振り見て我が振り直せ」とはこのことだな。