OmniAICreator/Qiita-1.07M huggingface dataset:
ServiceNow - クライアントスクリプト作成方法

### 1.モジュールを開く
[System Definition] > [Client Scripts]
または、
対象テーブルフォームのコンテキストメニューからアクセスする。
以下はIncidentでの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843998/57eb360f-e1db-aa31-d56c-c10e69e15828.png)

### 2.新規作成フォームを開く
一覧のNewボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843998/9614fb9e-78c6-5b51-8709-6077bf36caeb.png)

### 3.Typeについて
Typeはこのクライアントスクリプトがどのタイミングで実行されるかを大まかに指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843998/00406eb5-20fd-1f6c-1ff9-f8a86f1fc055.png)
onCellEdit：レコードの一覧画面で、フィールド値の変更を行ったとき
onChange：レコードのフォーム画面で、フィールド値の変更を行ったとき
onLoad：レコードのフォーム画面で、画面の読み込みが行われたとき
onSubmit：サーバにデータ送信が行われるとき(主に更新ボタンなどを押したとき)

### 4.スクリプトを記載する
Scriptフィールドに実行したい処理や起動条件等を記載する。
画像の例では、Incidentフォームにて、[Channel]フィールドが"Phone"に変更されたとき、[Category]フィールドを"Hardware"に変更する機能を実装しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2843998/98e1bdb5-15a6-92c0-1077-df3a8a95035d.png)
人工知能学会2023年の発表の集計

# JSAI2023
ホームページ： http://ai-gakkai.or.jp/jsai2023/
日時：2023年6月6日（火）～9日（金）
会場：熊本城ホール(熊本県熊本市) 
今年は昨年に引き続き現地開催+オンラインになりました。
2020年のリベンジで無事、熊本城ホールで開催され、参加人数は対面とオンラインで3450人と学会史上最多また研究発表数も過去最多だそうです。
熊本城周辺は深夜までやってるお店が多く、料理（馬刺し）もお酒もおいしく大変良かったです。
来年は浜松で開催されるようです。（浜松は何がおいしいんですか？？）

さて[前回の記事](https://qiita.com/keeeeei0315/items/40cb7c1c98b360051482)と同じく単純な集計結果です。
一般セッション、インタラクティブセッション、オーガナイズドセッション、学術機関(大学、大学院、専門学校、国立研究所)、民間企業の発表件数、著者数を抽出してまとめた。
国際セッションは英語→日本語変換が面倒なのと、名寄せも面倒なので株式会社と(株)を取り除くくらいしかやってません。
集計した範囲では539組織、2289人の発表が述べでありました。

# 人工知能学会2023の発表集計

### 学術機関の発表件数(2023年)


| 順位 | 組織             | 件数 |
|------|------------------|------|
|1|	東京大学	|229
|2|	早稲田大学	|84
|3|	慶應義塾大学	|82
|4|	大阪大学	|75
|5|	名古屋工業大学	|74
|6|	東京電機大学	|64
|6|	公立はこだて未来大学	|64
|8|	立命館大学	|59
|8|	お茶の水女子大学	|59
|10|筑波大学	|55
|10|京都大学	|55
|10|産業技術総合研究所	|55
|13|電気通信大学	|53
|14|名古屋大学	|50
|15|静岡大学	|45
|16|明治大学	|43
|17|東京工業大学	|40
|18|北海道大学	|37
|19|同志社大学	|31
|20|兵庫県立大学	|28

例年通り東大が首位。
昨年と早慶が逆転してますが、東大、慶應、早稲田はだいたいTOP3というのが今年も見て取れます。



### 民間企業の発表件数(2023年)
| 順位 | 組織                                | 件数 |
|------|-------------------------------------|------|
|1|	日本電信電話株式会社|	42
|2|	富士通株式会社|	36
|3|	八千代エンジニヤリング株式会社|	30
|4|	ヤフー株式会社|	19
|5|	オムロン株式会社|	18
|6|	塩野義製薬株式会社|	16
|7|	日本電気株式会社|	15
|8|	沖電気工業株式会社|	14
|9|	野村アセットマネジメント株式会社|	13
|9|	株式会社KDDI総合研究所|	13
|11|株式会社サイバーエージェント|11
|11|京セラ株式会社|11	
|13|日立製作所研究開発グループ|10
|13|エヌ・ティ・ティレゾナント株式会社|10	
|15|日立製作所|9	
|15|三菱電機株式会社|9	
|15|中外製薬株式会社|9	
|15|株式会社NTTドコモ|9	
|15|株式会社NTTデータ数理システム|9	
|20|NTT社会情報研究所|8	
|20|パナソニックホールディングス株式会社|8	
|20|NTT|8	
|20|（株）東芝|8	
|20|株式会社アイシン|8	

今年も日本電信電話が首位。
また、八千代エンジニヤリングと富士通は2年連続で20件以上の発表を行っています。


### 著者別発表数(2023年)
| 順位 | 氏名        | 件数 | 所属 |
|------|-------------|------|------|
|1|高橋達二|	20|	東京電機大|
|2|松尾豊|	19|	東京大
|3|小林一郎|	16|	お茶の水女子大
|4|谷口忠大|	13|	立命館大
|5|岩澤有祐|	12|	東京大
|5|栗原聡|	12|	慶應義塾大
|7|後藤正幸|	11|	早稲田大
|8|甲野佑|	10|	東京電機大
|8|杉浦孔明|	10|	慶應義塾大
|10|谷中瞳|	9|	東京大
|11|小山聡|	8|	北海道大
|11|石黒浩|	8|	大阪大
|11|山下遥|	8|	上智大
|11|秋本洋平|	8|	筑波大学
|11|戸次大介|	8|	お茶の水女子大
|11|谷口彰|	8|	立命館大
|11|笹嶋宗彦|	8|	兵庫県立大
|18|中川慧|	7|	野村アセットマネジメント株式会社
|18|鈴木雅大|	7|	東京大
|18|村井源|	7|	公立はこだて未来大
|18|吉田光男|	7|	筑波大

東京電機大の高橋先生が驚異の20件で1位。
また我が国を代表する人工知能の専門家である松尾先生が19件で2位。
小林先生、谷口先生、栗原先生は常に上位でランクインしている。
Composerのコマンドにはエイリアスがあるらしい

[Composerのソースコード](https://github.com/composer/composer/tree/main)をチラッと覗いたら、エイリアスが設定されているコマンドがあるっぽいのでメモ程度にまとめる。

自分は初めて知ったけど割とみんな知っているのかもしれない……なんで教えてくれなかったんですか？

| コマンド | エイリアス |
| :- | :- |
| clear-cache | clearcache, cc |
| depends | why |
| dump-autoload | dumpautoload |
| browse | home |
| install | i |
| prohibits | why-not |
| remove | rm |
| require | r |
| run-script | run |
| self-update | selfupdate |
| show | info |
| update | u, upgrade |

requireをrで済ませれば入力する文字数は7分の1に削減されます。
つまり、単純計算で私の1日の作業量は7倍になります。？
オブジェクト指向とは

# オブジェクトとは
現実世界の概念やモノをデータ（属性）と機能（手続き）でひとかたまりにした実体の事。
オブジェクトはクラスという概念によって定義され、クラスのデータに具体的な値を当てはめることでインスタンスとなり、値を使ってインスタンスは機能（手続き）を使用できる。

### 例
車というクラスを定義し、クラスのデータ（エンジンパワー、ブレーキの強さ、重さ）に具体的な値（500馬力、500馬力を一瞬で止める、2110kg）を入れるとインスタンスとなる。
これを「最強の車」いう名前を付けて、走る・止まる・曲がるなどの機能（手続き）を使用することができる。機能を使用する際にはデータを使う。
インスタンスはデータに入れた値によって色々な車を表現できる。

# 参考サイト
オブジェクト
https://www.sophia-it.com/content/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88

質問コーナー　三菱
https://www.mitsubishi-motors.com/jp/sustainability/contribution/people/kids/question/box/category06/qa13/

オブジェクト指向「継承」とは？わかりやすく解説してみた
https://www.sejuku.net/blog/9598
John the Ripper使い方（zipファイルパスワード総当たり）

# zipファイルのパスワードを総当たりで解析

## 現在の状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/30561044-e217-2018-6316-c2ab1ae5e29a.png)




## John the Ripperインストール
下記からインストール

https://www.openwall.com/john/

赤枠で囲ったとこをクリック（1.9.0のwindows binaries zip）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/1db3a3aa-9278-d2af-50cb-8573769fe10d.png)

## インストールしたらデスクトップへ移動
名前をjohn-1.9.0-jumbo-1-win64からjohnに変更

## パスワードを解析したいzipフォルダをjohn>runにコピー
今回はcredentials.zipでやる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/e162e86a-0f56-26de-4c0d-522648cd3a50.png)

## Windowsのコマンドプロンプトを起動　（credentalsのとこは自分のzipフォルダ名に置き換えてね！）
コマンドプロンプトに以下のコマンドを入力

## john>runに移動
john>runディレクトリに移動 ホームディレクトリにいる前提
```コマンドプロンプト
cd ./desktop/john/run
```

## ZIPフォルダのハッシュを定義
run内のzip2john.exeを実行
よくわからんけどzipのハッシュファイルができる
```コマンドプロンプト
zip2john.exe credentials.zip >credentials.hash
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/4240591e-2160-c539-b520-ff020cd8daf0.png)

is not encrypted!と書いてあるがjohn>run内のファイルをみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/4b460b44-fbc6-7146-deb9-4b4e693f2ace.png)

発見！
中は…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/5032e311-1edf-ee17-4422-0eeef7ed7a37.png)

今回はPKZIP2というフォーマットが利用されている。
なんかそれっぽいのが入っとる

## パスワードの解析（パスワードリストと比較）

run内に入っているpassword.listと比較する

```コマンドプロンプト
john.exe --pot=credentials.pot --wordlist=password.lst credentials.hash
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/ee0197ab-35bd-6b61-1d48-5a9870849753.png)

何もわからないままDONEになってしまう。
password.listに該当するものがなかったっぽい？


## パスワードの解析（辞書を使わず、総当たり）

今度はパスワードリストを使わず、すべてを総当たりで調べる
```コマンドプロンプト
john.exe --pot=credentials.pot --incremental=ASCII credentials.hash
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/6565fe4d-fe58-4132-2da4-2a20702a0b76.png)


実行結果が出るまでちょっと時間かかるよ
赤枠で囲った部分がzipフォルダのパスワードになる

## パスワード入力！！！
zipを展開するからパスワードを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/909ad0fa-8349-b593-7579-3777fa122e51.png)

わーい！できた～～！！！
長かった…





### 参考にしたサイト3つ

https://lonesec.com/2021/12/07/zip_password_security/

https://www.wikihow.jp/%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84ZIP%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E8%A7%A3%E9%99%A4%E3%81%99%E3%82%8B

http://trynet.fc2web.com/john-j.html
undefined method `question_url' for #<QuestionsController:0x0000000000feb0>

# redirect_to @インスタンス変数　でエラーがでる


![スクリーンショット 2023-06-15 20.57.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808947/19a35782-79a0-7789-e181-17ef8368be30.png)

@インスタンスってrailsのバージョンによって使えないんだっけ？とか考えたり
コードは正しいように見えるが、、
```questions_controller.rb
class QuestionsController < ApplicationController
.
.
.
    def create
        # 初期化
        @question = Question.new(question_params)
        # DBに保存
        @question.save
        # リダイレクト
        redirect_to @question 
        # redirect_to action: :show
    end
.
.
.
```

関連するソースを見ていったところ

```ruby:routes.rb
resource :users
```
スペルミスでｓが抜けていた、、


```ruby:routes.rb
resources :users
```
修正したら無事動きました。
スペル間違いどうにかしたい、、

同じエラー出た人は関係してるソース見返すと間違いが見つかるかもしれません。
WSL×NeoVim(init.lua) クリップボードにコピーできるようにする方法

# はじめに
この記事では、**neovimでヤンクしたテキストをwindowsのクリップボードにコピーする方法**及び、init.luaの設定を紹介します。
neovimを使い始めてまず当たった壁がこれだったのでお役に立てれば幸いです。

## 問題
windowsのWSL上でnvimを使用する際に%yなどでヤンクした行が、windowsのクリップボードに反映されない事象が起こった。

環境: windows11 WSL

# 手順
## 1. [win32yank](https://github.com/equalsraf/win32yank/releases)をインストール

環境に合わせてください。私はwin32yank-x64.zipをインストールしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261812/f57954fe-be13-4322-6b26-faf32c45fd55.png)


## 2. ~/binを作成し、win32yank.exeを移動

win32.yank-x64.zipを解凍してください。その後、exeファイルを~/binに移動します。

```:wsl
mkdir ~/bin
mv ~/Downloads/win32yank.exe ~/bin
cd ~/bin
chmod +x win32yank.exe
```

## 3. PATHを通す
```nvim ~/.bashrc```

.bashrcの最後に以下を追記し、wslの再起動を行います。(普通にexitでOKです)
```
export PATH=$HOME/bin:/usr/local/bin:$PATH
```

## 4. PATHの確認

これで、先ほど追加したパスが出てくれば完了です。
```
echo $PATH
```

## 5. init.luaの設定

お待ちかねの、init.luaの設定です。
init.luaは```~/.config/nvim/init.lua```にあります。
まだ作っていない場合は以下で作成してください

```
mkdir ~/.config/nvim/
cd ~/.config/nvim
touch init.lua
```

以下のように記述します。
(2024/04/17追記)
コメントにもありますよう、ddでクリップボード共有をしたときに非常に遅くなる事象が発生しました。
以下の設定で問題なくできました。

https://stackoverflow.com/questions/75548458/copy-into-system-clipboard-from-neovim

```init.lua
if vim.fn.has("wsl") == 1 then
    if vim.fn.executable("wl-copy") == 0 then
        print("wl-clipboard not found, clipboard integration won't work")
    else
        vim.g.clipboard = {
            name = "wl-clipboard (wsl)",
            copy = {
                ["+"] = 'wl-copy --foreground --type text/plain',
                ["*"] = 'wl-copy --foreground --primary --type text/plain',
            },
            paste = {
                ["+"] = (function()
                    return vim.fn.systemlist('wl-paste --no-newline|sed -e "s/\r$//"', {''}, 1) -- '1' keeps empty lines
                end),
                ["*"] = (function() 
                    return vim.fn.systemlist('wl-paste --primary --no-newline|sed -e "s/\r$//"', {''}, 1)
                end),
            },
            cache_enabled = true
        }
    end
end
```


# 補足

- 私はwsl以外にVirtualBox上にUbuntu22.04を乗せて使ってます。
```vim.opt.clipboard = "unnamedplus"```を追加しているので、Linuxのクリップボードでもコピーができました。

- ```if vim.fn.has('wsl') == 1 then```と書くことで、wsl以外ではこの設定が読み込まれないようにしてあります。これを書かないとLinux環境でバグが発生しました。



# 参考
ほぼパクリ感がありますが、configがluaで書いてあるということで許してください。

参考
[WSL2でtmux/vimのクリップボードをwinと共有する設定](https://zenn.dev/kujirahand/articles/4b37160f781be7)
未経験からアメリカのスタートアップで働いてみた感想 🥸  

今年の6月に、初めてエンジニアとして働いたアメリカのスタートアップを辞めたので、
アメリカのベンチャーこんなんだったよ、を共有しようと思います（この会社特有のことも結構あるけど）。

## 自身のバックグラウンド 🌝
- 元々はエンジニア職ではない
- 2021年5-7月にコーディングブートキャンプに参加
- 2021年9月にアメリカのスタートアップにAndroidエンジニアとしてjoin（現地ではなく日本からリモートです）
- 2022年4月から会社の事業方針が変わりAndroid -> Webエンジニアへ
- 2023年5月末に退職
- 6月からサイバーエージェントでエンジニアしてます

## 会社の概要 🏢
- アメリカのスタートアップ
- チームは入社当初めちゃくちゃグローバルで、アメリカ・日本・ロシア・ヨーロッパ（どこか忘れた）、ただレイオフもあり、最終的にはアメリカと日本のみ
- リモートワークが基本（たまに日本に来日してオフラインで会ったりもした）
- 元々はネイティブアプリのみ開発 -> Web3業界へ
- 総従業員数は10人以内 -> 最終的には5人

## どんな働き方だった ✍🏻
- 契約はContractor (日本語だと契約社員？)
- 日本から完全リモートワーク
- 有給は年15日、ケガ・病気の場合は回数上限なしで休める
- 基本的には日本のタイムゾーンで勤務OK（大体9-18時くらい）
- たまに全員参加のMTGの際は、早朝や夜中になりがち
- シェアオフィスを契約してもらい週1−２通ってた
- 祝日を自由に動かせる謎の仕組みがあり、GWをGWの次の週とかにずらして旅行とかも行けた（神制度）
- 副業もちょこちょこしていた

## 働いて見た感想 ☘️
- 目安の勤務時間はあったが、成果を出していれば、割と自由な時間に働ける
- MTGがほとんどないので開発にずっと集中できた
- Android時代はテックリードがロシアにいて、時差の都合上質問しにくくストレスだった
- 為替の影響もあり給与はめちゃ良かった（ドル払い）
- 早朝・深夜MTGは続くと結構辛い
- 社員旅行でメキシコ行けた
- めっちゃ褒めてくれる
- 上下関係とかなくてみんなフラットに一緒に働く同僚、という雰囲気
- 評価制度がなかったので、自分が何を成し遂げたから給料上げてほしい、という交渉はやった
- 頑張ってたらいきなり昇給もあった

今思うと、割と夢のような職場だった。

## なぜやめた？ 🤯
- レイオフがちょくちょく発生していたので、明日は我が身の気持ちで毎日働いていると、だんだんモチベーションが保てなくなった（基本は当日に、レイオフを言い渡されその日中にはSlack見れなくなる）
- いろいろなバックグラウンドを持った開発メンバーと一緒に開発したいと思った
この2点が結構大きいです。

あとはカジュアル面談をとかを通して、一緒に働きたい、刺激をもらえそう、成長できそう、面白そうな分野！などなどを思ったところに転職を決めました。

## まとめ 👣
未経験な私を受け入れてくれた前職には、ほんと感謝してもしきれないです。
エンジニアとして２年目、新しい環境でいっぱい吸収して、いっぱい貢献して、一緒に働きたい！って思えるエンジニアになりたいです。
Java はif 文書く時{}の中の記述が一行だけの時は{}を省略できる

```
class Main{
    public static String firstLastCharacter(String word){
        // return "Type random words";みたいに一行だけの時に使用可能。
        if(word.length() == 0) return "Type random words";
        else return word.charAt(0) + " " + word.charAt(word.length()-1);
    }
```
ストロングパラメータ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/3ff440de-fc3f-17d2-9574-034364de00b0.png)
１：ストロングパラメーター
ストロングパラメーターを使用する理由は、意図しないデータベースの読み書きを防ぐためです。

仮に全てのパラメーターを受け取る仕様の場合、悪意のあるパラメーターによって第三者にデータを改竄されてしまうなど、セキュリティ上の欠陥を作り出してしまう恐れがあります。最悪の場合、ユーザーへ不利益を与えてしまう事態へと繋がる可能性もあります。

このような状況を回避するためには、ストロングパラメーターを使用して受け取るパラメーターを制限することが大切です。

ストロングパラメーターの定義には、requireメソッドと、permitメソッドを組み合わせて使用します。

２：requireリクワイアメソッド
送信されたパラメーターの情報を持つparamsが、使用できるメソッドです。
requireメソッドは、パラメーターからどの情報を取得するか、選択します。

ストロングパラメーターとして使用する場合は、主にモデル名を指定します。

【例】require
params.require(:モデル名)  # 取得したい情報を指定する
params[:モデル名]としても同じ情報を取得できますが、requireメソッドを使うことで、意図しないパラメーターであった場合にエラーとして返すことができ、原因特定やユーザーにエラーを示すなどの対応ができます。

requireメソッドによって必要なパラメーターのほとんどを取得できますが、取得するパラメーターをより意図したものだけに制限するため、permitメソッドを使用して、カラムに保存したいデータのみに絞りましょう。

３：permitパーミットメソッド
requireメソッドと同様に、paramsが使用できるメソッドです。
permitメソッドを使用すると、取得したいキーを指定でき、指定したキーと値のセットのみを取得します。

【例】permit
params.require(:モデル名).permit(:キー名, :キー名) # 取得したいキーを指定する

４：記述例
　private
 　 def tweet_params
   　　 params.require(:tweet).permit(:name, :image, :text)
 　 end
grant usageしていないスキーマが表示されてしまったと思ったら仕様通りだった話

Redshiftクラスター内にユーザを作成してDBeaverで接続したところ、左側のDB一覧にgrant usageしていないスキーマが表示されて焦るということがありました。
以前Redshiftのクエリエディターv2で同様のことをしたときは、grant usageしていないスキーマは一覧に表示されなかったと記憶していたため、挙動確認を行いました。

## 前提条件
* Redshiftクラスター構築時に作成した管理者ユーザawsuserでRedshiftクラスターに接続し、`create user test_user password xxxxx;`を実行します。
* Redshiftクラスターには、以下のDB・スキーマ・テーブルがあるものとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/a2d7328b-2d04-d173-a73b-caf603a849fa.png)

## 挙動確認
### 接続
DBeaverとクエリエディターv2を使い、test_userでRedshiftクラスターに接続します。

### DB一覧を確認
左側のDB一覧を展開して、どのスキーマとテーブルが表示されるか確認します。

##### DBeaverの場合
![grant1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/77afea5a-11c4-d4a1-c37d-b2fb740af71b.png)
AWSの公式ドキュメントには「デフォルトでは、PUBLIC スキーマに対して、すべてのユーザーが CREATE および USAGE アクセス許可を持ちます。」という記載があります。(※1)
そのため、grant usageをしていないtest_userでログインするとpublicスキーマだけ表示されて、publicスキーマ配下のテーブルやschema1は表示されないことを期待していたのですが、publicスキーマ配下のテーブルとschema1、schema1配下のテーブルが表示されてしまいました。
さらに、おそらくRedshift構築時に自動的に作成されたであろうcatalog_historyというスキーマも表示されています。

##### クエリエディターv2の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/60cb61e8-a44b-a2f7-f574-1ab27ded8702.png)
こちらは期待通りpublicスキーマだけが見えています。publicスキーマ配下のテーブルは0になっているので、これも期待通りです。

### システムカタログpg_namespaceを確認
test_userでログインした際に表示された情報はDBeaverとクエリエディターv2で異なりましたが、クライアントツールによってアクセスできる範囲が異なることはないはずです。
なので、それぞれのクライアントツールでスキーマ一覧の情報を持っているpg_namespaceにアクセスした際は何が表示されるか確認するため、`select * from pg_namespace;`を実行します。

##### DBeaverの場合
![grant2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/4a21bacb-d54d-379f-05db-39d121d24545.png)
test_userがシステムカタログのpg_namespaceに対してアクセスできるか確認したところ、問題なくアクセスできてschema1が一覧に表示されました。

##### クエリエディターv2の場合
![grant4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/7326cefa-5b88-8507-e826-26d9a83945e8.png)
クエリエディターv2の場合もpg_namespaceにアクセスできて、出力内容はDBeaverと同じでした。
左側のDB一覧に表示されなくても、pg_namespaceにアクセスすると全てのスキーマの存在が確認できますね。

### システムカタログpg_tablesを確認
pg_namespaceと同じく、pg_tablesにアクセスした際は何が表示されるか確認するため、`select * from pg_tables;`を実行します。

##### DBeaverの場合
![grant3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/3c5e1927-08f7-7ab8-8ca9-3a1e74e5c7f0.png)
test_userはpg_tablesにもアクセスできて、public_1_tableとschema1tableの存在が確認できました。

##### クエリエディターv2の場合
![grant5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/5fa5e142-9f59-cf01-e245-06a51bc87cf1.png)
クエリエディターv2の場合もpg_tablesにアクセスできて、出力内容はDBeaverと同じでした。
pg_namespaceと同様、左側のDB一覧に表示されなくても全てのテーブルの存在が確認できます。

## 結論
Redshiftでは、そのスキーマに対してgrant usageを実行していないユーザであっても、pg_namespaceやpg_tablesにアクセスすることができ、どのようなオブジェクトが存在するかは知ることができるようです。
そしてusage権限がないテーブルをDB一覧に表示するか否かはクライアントツールによって異なるようですね。
使い慣れていないDBeaverの挙動に焦ってしまいましたが、どのような動きをするか確認できてよかったですw

## 参考資料
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_GRANT.html
【知っておくと便利】エンジニアの私がよく使うWEBサイト

# はじめに
私はSIerでエンジニアとしてWEBサイトの構築や運用をおこなっています。
業務中によく使う便利なWEBサイトがいくつかあるのでご紹介します。

# この記事の対象読者
* WEBブラウザを使って作業する人
* コーディング（プログラミング）を頻繁にする人
* よくある定型作業を効率化したい人

# おことわり
あくまで私視点で「便利だなぁ」と思ったサイトを紹介しています。
（ちょっと皆さんと認識違っていたらごめんなさい）
他にも「こんなサイト便利だよ！」なんてサイトあれば教えてください。

# パスワード生成ツール

https://www.luft.co.jp/cgi/randam.php

「テスト用ユーザーとかのパスワードいちいち考えるの面倒だなぁ」
「お客さんのアカウントのパスワードどうしよう」
なんて思う時ありませんか？

このサイトは英数字記号、文字数など指定して推測されにくいパスワードを自動生成してくれるツールです。

l（エル）と1（いち）や、O（オー）と0（ゼロ）など似た文字を除くこともできますし、
かなり推測されにくいパスワードを作ってくれるので結構重宝します。

# placehold.jp

https://placehold.jp/

このサイトはサイズや色などを指定してモックアップ用の画像を自動生成してくれるサイトです。
画像は保存しても使えますし、URLから生成してくれるので保存せず直接参照することもできます。

「UIのレイアウト確認したいけど良いサイズの画像がない」
なんて時に助かります。

# 文字数カウント

http://www1.odn.ne.jp/megukuma/count.htm

このサイトでは入力した文字数をカウントしてくれます。
バリデーションチェックで文字数の境界値を確認するときのテストデータを作るときに使ってます。

# difff

https://difff.jp/

このサイトでは２つのテキストの差分を表示します。

「diffコマンドとか似たようなツールを使えば良くね？」と思いますが、２つの理由からよく使います。
* いちいちファイル２つ作って、ターミナル開いて、コマンド打つのが面倒な時
* ブラウザでできるからPCが重くなりづらい

# UNIXタイムスタンプ変換ツール

https://url-c.com/tc/

このサイトはUNIXタイムスタンプのフォーマットを変換したり、現在のタイムスタンプを取得できます。
私の場合、デバッグをしているときに取れたタイムスタンプを時分秒に直して理解したいときなどに使います。

# 使用中のIPアドレス確認（CMAN）

https://www.cman.jp/network/support/go_access.cgi

このサイトは今使っているグローバルIPアドレスを知りたいときに使います。

ここではIPアドレス確認をご紹介しましたが、CMANには他にも便利なツールがあります。
Ex.) DNSの確認、SSLのステータス確認、などなど・・・

# 原色大辞典

https://www.colordic.org/

このサイトでは実際の色を見てカラーコードを確認することができます。
VSCodeとか使っているとカラーパレットから選べば良い話なのですが、色の名前も確認できるのでちょっとタメになるので使ってます。

# JSTとESTの変換と時差の計算

https://www.jisakeisan.com/?t1=est&t2=jst

このサイトではJST（日本標準時刻）とEST（米国標準時刻）を変換することができます。
海外のサポートに問い合わせをするとき、日時について話す場合は「JSTなのか？」「ESTなのか？」を意識しないと認識齟齬が発生してしまいます。
メンテナンスの依頼などで齟齬があるのでいけませんので、JSTとESTともに時刻を確認するようにしています。


# まとめ
ここでは日々開発や運用をしているエンジニアがよく使う便利なサイトをご紹介しました。
少しでも興味あるサイトあればぜひ使ってみてください。
またよく使いそうなサイトはブラウザの**お気に入りに追加**するのをオススメします。
MessagingAPIでFlexMessageを動的に作成する

# はじめに
研究で開発しているLINEBotで,取得したデータに応じて[FlexMessage](https://developers.line.biz/ja/docs/messaging-api/using-flex-messages/)を動的に変化させて作成する必要がありました．しかし，その部分に関して記事があまり見つからなかったのでせっかくならと書くことにしました．

:::note warn
これがベストプラクティスという保証はできないです
:::

# 実装環境
- node.js 18.12.1
- typescript 4.9.0
- @line/bot-sdk 7.5.2

# つくりたいもの
今回では例として次のようなFlexMessageを作るとします.
[FlexMessageSimulator](https://developers.line.biz/flex-simulator/)で適当に作ったものです．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741818/e0f6b1bf-de23-c2ce-c5b7-c1acd73ca774.png" width="400px">
データの数によってリストの列数が変化したり，カルーセルのバブル数を増やしたりといった内容です．

# 実装
では実際に，このFlexMessageを作成するコードを書いていきます

```getListFlexMessage.ts
// FlexMessageやFlexBubbleの型をインポート
import {FlexBubble, FlexMessage} from "@line/bot-sdk";

function getListFlexMessage(data: string[]): FlexMessage {
  // リストを保持する配列
  const contents: FlexBubble[] = [];
  // 配列を10要素ごとの配列に分割し,それぞれに合わせてリストを作成する
  arrayChunk(data, 10).forEach((events) => {
    // 作成したリストを追加
    contents.push(getListContent(events));
  });
  //　作成したFlexMessageを返す
  return {
    "type": "flex",
    "altText": "イベントリスト",
    "contents": {
      "type": "carousel",
      "contents": contents,
    },
  };
}

// データに合わせたリストの作成
function getListContent(data: string[]): FlexBubble {
  // リストの要素を持つ配列
  const listItems: any = [];
  // データの数だけループを回してリストの要素を作成する
  data.forEach((itemData) => {
    listItems.push(getListItem(itemData));
  });
  // リストを返す
  return {
    "type": "bubble",
    "header": {
      "type": "box",
      "layout": "vertical",
      "contents": [
        {
          "type": "text",
          "text": "イベントリスト",
          "align": "center",
        },
      ],
    },
    "body": {
      "type": "box",
      "layout": "vertical",
      "contents": listItems,
    },
    "styles": {
      "header": {
        "backgroundColor": "#f0f0f0",
      },
    },
  };
}

// データに合わせたリストアイテムの作成
function getListItem(data: string): any {
  return {
    "type": "box",
    "layout": "vertical",
    "contents": [
      {
        "type": "text",
        "text": data,
        "margin": "md"
      },
      {
        "type": "separator"
      }
    ]
  }
}

// 配列を指定した長さの配列に分割する
function arrayChunk<T>(array: T[], size: number): T[][] {
  if (size <= 0) return [[]];
  const result = [];
  for (let i = 0, j = array.length; i < j; i += size) {
    result.push(array.slice(i, i + size));
  }
  return result;
}
```

コンテンツの内容をオブジェクトで作成して配列に格納していくのが基本的な方法です．

# おわりに
以上でFlexMessageの動的作成は以上です．
戻り値のオブジェクトを使いたい形式に変換して利用すれば,複雑なFlexMessageも作ることができるんじゃないかなと思います．
ただFlexMessageにはデータ量に上限([バブル](https://developers.line.biz/ja/reference/messaging-api/#bubble)は30KB,[カルーセル](https://developers.line.biz/ja/reference/messaging-api/#f-carousel)は50KB)があるので利用する際は気を付けてください．
Elixirの対話モードで日付と時間について動作を確認してみた

# 概要
Elixirの対話モードで日付と時間について動作を確認してみました。以下のページを参考にしました。

https://elixirschool.com/ja/lessons/basics/date_time

# 対話モードで実行
以下のコマンドを実行してみました。
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Time.utc_now
~T[11:32:30.767728]
iex(2)> ~T[19:39:31.056226]
~T[19:39:31.056226]
iex(3)> t = ~T[19:39:31.056226]
~T[19:39:31.056226]
iex(4)> t.hour
19
iex(5)> t.minute
39
iex(6)> t.day
** (KeyError) key :day not found in: ~T[19:39:31.056226]

iex(6)> Date.utc_today
~D[2023-06-15]
iex(7)> {:ok, date} = Date.new(2020, 12,12)
{:ok, ~D[2020-12-12]}
iex(8)> Date.day_of_week date
6
iex(9)> Date.leap_year? date
true
iex(10)> NaiveDateTime.utc_now
~N[2023-06-15 11:34:32.105147]
iex(11)> NaiveDateTime.add(~N[2018-10-01 00:00:14], 30)
~N[2018-10-01 00:00:44]
iex(12)> DateTime.from_naive(~N[2016-05-24 13:26:08.003], "Etc/UTC")
{:ok, ~U[2016-05-24 13:26:08.003Z]}
```

# まとめ
何かの役に立てばと。
OracleBronze合格体験記 -文系新人SEが60日で合格するには-

(※この記事は約5分で読めます。)
# はじめに
コンサルからSEに転向し、システムのド素人が
1日1時間×2ヶ月(土日祝休み)でOracleBronze合格したノウハウを記載していきます。
「試験前に知りたかったがググっても見つからない情報」を意識して記載しました。
受験予備校や資格予備校などで得た受験テクニックも盛り込んでいるので、
最後までお付き合いいただけるとありがたいです。
![26287088_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472719/69731f78-e87c-b0f8-01c7-d9309ea8ec73.jpeg)



# OracleBronzeってどんな出題形式なの？
イメージは自動車免許の学科試験が近いです。
試験ごとに問題用紙が作成されるのではなく
予め登録された数百問の問題からランダムに出題しているものと思われます。
(あくまで筆者の予想です。)
つまり、__問題と答えを覚えれば突破できてしまう…！__
![26849717_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472719/e9e99aa0-4870-795b-3f58-85926aeb925a.jpeg)


# OracleBronzeの難易度は？
資格情報のポータルサイトなどでは偏差値50程度とされることが多いようです。
合格までの勉強時間目安は20〜40時間程度とされているようですが、
データベース未経験者は40時間～と考えていた方が良いと思います。

# 受験キャンペーンについて
2023/06末の受験を予定していましたが、
2023/05/31まで再試無料のキャンペーンがあったので受験時期を早めました。
Oracle認定試験では不定期的にキャンペーンを実施しているため、
受験を検討される方はチェックしておくことをお勧めします。
https://blogs.oracle.com/oraclemaster/category/omj-%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%9A%E3%83%BC%E3%83%B3


# 受験に際して
※2023/05時点の情報です。最新の情報をご確認ください。
自宅PCからの受験も可能なのですが、
トイレなどの理由であっても試験中はWebカメラの範囲外に出ることができないため
試験会場での受験を選択しました。

試験会場での受験の場合、
筆者の受験時(2023/05)は**身分証明書が2種類必要**でしたのでご注意ください。
受験申込メールや受験番号の提示などは必要なく、身分証明書さえあれば受験可能でした。
試験中のメモ用紙としてA4サイズのホワイトボードが渡されます。
書くと消せませんが、試験官に言えば真っ新なものと交換できました。
120分70問のため、じっくり考える余裕はあると思います。
![MS251_nazeyaranai_TP_V4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472719/161c3124-b13a-4389-1957-80781b8feed7.jpeg)


# 【重要】効率の良い勉強法は？
__参考書(「オラクルマスター教科書 Bronze DBA Oracle Database Fundamentals」、
通称黒本)をとにかく回転させることが合格までの最短ルートです。__
最初は全然正解できず苦しいと思いますが、
回数を重ねるごとに答えを暗記していくので正答率がどんどん上がります。
__理解はあとからついてくるので、とにかく答えを覚えることを意識してください。__
ネット上の合格体験記も参考にしてください。

# 【重要】学習の心構え
模試を解くごとに正答率を記録してください。
最初は20%や30%かもしれませんが、__回を重ねるごとに正答率は確実に上がります。__
「もう試験まで時間が残ってないのに合格ラインを超えられない」ではなく
__前回よりも上がっている__ ことに目を向けてください。
また、試験日が近づいてくると不安を感じるかもしれません。
__不安を感じたら勉強をしてください。勉強だけが不安を和らげます。__

# 試験前一週間の学習法
過去に説いた問題の**誤答のみ**解説を見返してください。
まぐれで正解した問題も見返さなくてよいです。
(試験前にまぐれで解けた問題は本番でもまぐれで解けます。)
逆に正解がわかっていたのにケアレスミスしたものは見返してください。
(試験前にケアレスミスした問題は本番でもケアレスミスします。)

# さいごに
最後までお付き合いくださりありがとうございました。
どこかの誰かの役に立てば幸いです。
ライブラリって何？

ライブラリとはプログラミングを効率的で簡単に行う便利な機能です
これを使うか使わないかではかなりの違いがあります
似たような差でいうと
例えば
「1723+983+3+90を計算しなさい」と言われ
これを”ペンで書いて計算する”のと”電卓で計算する”くらいの違いがあります

プログラミングにおいては例えば「csvFileを読み込む」という一つの作業を
ライブラリを使わずにコードを書こうとなると膨大な量になります
(CSVファイルはデータ分析の時に使います)

しかしライブラリを使うことによって下のような一行で済むようになります
「import ライブラリ」

このimportというのは”データを取り込みますね～”と宣言しているのです！
”どんなデータ”なのかというのが”ライブラリ”に入りますね

具体的なコードでいくと
import pandas

このpandasというのは”CSVファイルを取り込む”のに必要なのです！



追記
「import ライブラリ」と書いた後にコードを書くとき、この「ライブラリ」は後々何度か書かなければならないのです
なので、それらを書きやすくするために省略で表記するのです
（基本的にはなんでもいいと思います）

そうすると「import ライブラリ as ライブラリの別名」という感じで書きます！

さっきのpandasだと
import pandas as pdとかいいのではないでしょうか？
ぜひ実践してみてね！
統計検定2級の勉強したことまとめ

先日無事に統計検定2級に合格しました。ｲｪｰｲ
点数自体は合格ラインを少し超えたくらいだったのですが、「合格は合格」と捉えています。

ここでは私が合格までにしたことなどをまとめていきたいと思います。

## 統計検定を受けた目的
転職というか就職、今後つきたい職業で使う知識だから。
データ関連の仕事に就くために勉強をしている現在、大学を出ていない私にとっては仕事で使う知識を学んだという証明になります。ここに書いていることもその一環といえます。

## 勉強したこと

1.全体の知識を見たことある程度にする。
2.過去問を解く。
3.間違えたところを中心に勉強しなおす。

以上が大まかな流れです。
### 1.全体の知識を見たことある程度にする

最初からすべてを完璧に学びながら進めていくのは無理だと感じたので、とりあえず聞いたことあるな、見たことあるな、レベル。統計検定2級と顔見知りになることを目指しました。

幾人にも語られるこちらのサイト。[統計WEB](https://bellcurve.jp/statistics/course/)。
統計検定2級の範囲がすべて網羅されています。無料。ありがたい。

こちらを読み進めていきます。といっても内容は私には難しく、なんとなく眺めながら進んでしまったページも多々ありました。あとから戻ってくることを前提にしていたのでざっくり進めました。

意識したのは時間をかけないこと。さっさと読み進めて終わらせることで次のステップに進むことでやる気の低下を防ぎました。この段階では書いてあること、特に後半がちんぷんかんぷんでつまらなかったのでぴゃっぴゃと眺めました。

### 2.過去問を解く
過去問を解いていきます。公式から無料で公開されているものとかはないので過去問の本を買いましょう。私が購入したのは2016-2018年の3年分の過去問です。1年分につき2回の過去問が収められているので3年で6回分です。それくらいあると飽きも来ずに回せます。

初めての過去問に挑戦するも正答率は40%程度。問題形式に慣れていないというのもありますが、ほぼほぼ何を言っているかわからない。8割が勘で答えたものです。

### 3.間違えたところを中心に勉強しなおす
ここが一番大事なところ。世の中復習が一番大事なんです。

最初のうちは解けなかった問題についての解説を読むのではなく、解けなかった分野？について書き出していきました。解説なんて読んでも基礎知識がスカスカなのでなにいってるか理解できませんからね。

最初のうちはこれがどこの分野のこといってるのかすらわからねぇ。
となるので [統計WEB:統計検定2級 解説記事一覧](https://bellcurve.jp/statistics/blog/19188.html) こちらのページを参考にどこの分野についての問題なのかを書き出していきました。

書き出せたなら上記で紹介した[統計WEB](https://bellcurve.jp/statistics/course/)で勉強しなおし、YouTubeの[とけたろうチャンネル](https://www.youtube.com/@toketarou/about)も参考にしながら勉強しなおしました。
2つめのとけたろうチャンネルさんはすべての範囲を網羅しているわけではないですが重要な単元を順序だてて教えてくれているので大変勉強になりました。

2,3を繰り返し、過去問を3周して検定に挑みました。


## 検定を受けてみて
### 必要な数学知識
正直高校2年生までの数学知識があれば十二分に感じました。
特に必要となったのは
-　確率
-　微分
-　積分
-　シグマ(Σ)
ここらへんは検定には必要最低限な知識であったと思います。

### 実際の試験
準1級以下の試験は2022年?ごろから全員がパソコンで受験、その場で合否がわかるなどの変更があったそうです。
過去問を3周してから試験に赴いたわけですが、雰囲気は似ているが過去問とはやや違った問題？の雰囲気になっていました。最近の方式に対応した問題集があるそうなので、そちらも解いておくと慣れがあったのかなと思います。

時間に関してはかなりシビアで、全問解き終えたとほぼ同時くらいに試験時間が終わりました。見直す時間など全くなかったので問題集を解いておく重要性が少しあると感じました。


## 参考資料
統計WEB
https://bellcurve.jp/statistics/course/
https://bellcurve.jp/statistics/blog/19188.html

とけたろうチャンネル
https://www.youtube.com/@toketarou/about

## おわりに
先人たちの無料で公開してくれている解説などのおかげでぎりぎりではありましたが、合格できました。この場で御礼申し上げます。
JCOM InMyRoomの物件でポート解放できなかった件について

## 経緯
先日JCOM物件に引っ越して回線を引いてもらい、持っていたサーバー（笑）のためにポート解放をしようとしていました。
ルーター側でのポート解放設定を済ませ、LAN内からはアクセス可能なのに外側からはアクセスできない、という状況になりました。
また、他のJCOMユーザーの方はポート解放できていることから、自分の設定を疑っていたのですが、どうやらこの物件では外側に何か公開するというのは無理っぽい感じでした。
（筆者はネットワーク全く知識ありません）

## 状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1281879/913ffaf5-11d1-effe-c49a-1bbab5821f0a.png)


実際にネットにアクセスする際に使われているIPと、部屋にあるモデムに割り当てられているIPアドレスが違いました。
このモデムに割り当てられているIP経由でサーバーにアクセスすると開けることから、ルーターまでの設定は正常に行われており、その向こう側の機器にも設定が必要みたいです。

ですがそんな権限はもちろん持っていないので、自分が思っていた感じのポート解放は諦めました。

## 対処法
Cloudflare 最強！ということで、cloudflare tunnelを使いましょう。
これが一番すぐできる手段だし、使い勝手もいいと思います。

https://qiita.com/youtoy/items/3d312552f08a729bb5bb
【GTM】モバイルデバイスを判定するカスタムJavaScript変数の作り方

## 背景
モバイルデバイスの判定には長らくUser-Agent文字列が用いられてきましたが、主要なブラウザでは[フィンガープリントへの悪用](https://gigazine.net/news/20230323-web-fingerprinting/)対策などの理由によりUser-Agent文字列の情報量を減らす方針を発表しています。
これに伴いUser-Agent文字列の情報のみに頼ったモバイルデバイス判定は一部ブラウザで将来的に動作しなくなる可能性があります。
本記事のコードを使うことによりこの問題に対応したモバイルデバイス判定が可能になります。

## 作り方
カスタムJavaScript変数「cjs - isMobile」を作成し、以下コードを貼り付けて保存します。この変数設定はページを閲覧しているデバイスがモバイルと判定できるときのみ真偽値で`true`を返し、そうでないとき`false`を返します。

```js:
function(){
  var regex = /iphone;|(android|nokia|blackberry|bb10;).+mobile|android.+fennec|opera.+mobi|windows phone|symbianos/i;
  var isMobileByUa = regex.test(navigator.userAgent);
  var isMobileByClientHint = navigator.userAgentData && navigator.userAgentData.mobile;
  return isMobileByClientHint || isMobileByUa;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/f1b19038-ace3-90fc-dc02-f7cf31c3fb0c.png)


## 活用例
### デバイスタイプを返す変数設定を作る
#### ルックアップテーブルを使う場合
エンジニア以外にも分かりやすくしたいときにオススメの方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/7049e44e-cb71-4989-3364-419599a7dd3b.png)
※ `cjs - isMobile`部分はこの記事で作成した変数を選択

#### カスタムJavaScriptを使う場合
「タブレットデバイスも判定したい」「公式アプリ判定も入れたい」等、応用・改造して使う可能性がある場合、自由に書き換えられるカスタムJavaScript変数で作成すると便利です。

```
function(){
  var isMobile = {{cjs - isMobile}};
  return isMobile ? 'mobile' : 'desktop';
}
```
※ `{{cjs - isMobile}}`部分はこの記事で作成した変数名に置き換えて使う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/4c56fd37-f9c8-e9aa-a203-a29fe4632f7e.png)

### タグをモバイルデバイスで発火させないようにする
以下のようなカスタムイベントトリガーを作成して、目的のタグ設定の例外トリガーとして設定します。
- イベント名 : .*
- 正規表現一致を使用 : チェック
- 一部のカスタムイベント : チェック
    - [今回作ったカスタムJavaScript変数] 等しい `true`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/dd49af13-198c-5c9a-e526-4c8b5b2f44b1.png)

### タグをモバイルデバイス以外で発火させないようにする
以下のようなカスタムイベントトリガーを作成して、目的のタグ設定の例外トリガーとして設定します。
- イベント名 : .*
- 正規表現一致を使用 : チェック
- 一部のカスタムイベント : チェック
    - [今回作ったカスタムJavaScript変数] 等しくない `true`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103957/61d1c814-e59e-1da6-79b1-1a60bf6a0dd3.png)

## User-Agentの縮小について参考になる記事

https://tech.drecom.co.jp/ac2021-client-hints-update/

https://developer.chrome.com/ja/articles/user-agent-client-hints/

https://www.chromium.org/updates/ua-reduction/

https://developer.mozilla.org/ja/docs/Web/API/User-Agent_Client_Hints_API
【コードを綺麗に書く】というのはこういうことな気がしてきた

## はじめに
最近コードを書いていてふと、今の自分は以前とは全く違う思考でコードを書くようになってるな。。。と気づいたので、少しまとめたいと思います。

## 以前
「本でこういうコードの書き方が良いって書いてあったな〜」
「本でこういうコードの書き方だめって書いてあったな〜」
「凝集度あげるためにデータとメソッドは一箇所にまとめた方がいいな〜」
「単一責務の原則に反しているからなおさないとな〜」
↓
実際に改善
↓
「よし綺麗になった」


## 最近
「使いやすい形のインタフェースになっているかな？」
「メンテのためにも共通化しておいたほうが良いな。。。」
「どういうデータ構造で持っておくのが嬉しいだろうか？」
「直感的に理解できるようになっているだろうか？意図などは伝わるかな？」
↓
実際に改善
↓
結果的に綺麗になっている

## 以前と最近との違いは？
**以前**と**最近**の主な違いは、思考の過程で具体的に自分のコードを読んだりメンテナンスをする**他の開発者のことを想像できているかどうか**です。
あとは綺麗な形を目指しているのか、結果的に綺麗になっているかの違いもあります。

**以前**は本に書いてあることや原理原則を重要視していて、そこにできる限り近い形が綺麗なコード（正解に近いコード）なのだろうという価値観を持っていました。
コードレビューでも、こっちの形の方が良いとされてるからなおした方が良いよ！というような指摘もしていました。
ただしこの時のことを振り返ってみると、【自分以外のコードを読む人、メンテナンスをする人、機能開発や改修をする人】のことは全く目に入っていませんでした。
技術書のようになっていればよい、技術書に載っているようなアーキテクチャになっていればよいと思っていました。

この思考だと、しっかりと層に分かれているもののなんか使いづらいな。。。メンテナンスしづらいな。。。というコードを生み出してしまいます。
メソッドの呼び出し方、引数をこういう感じで呼べると嬉しいだろうな〜というような、自分ではない他の開発者の視点がないと、表面上の形だけ正しく見えて、良いコードだと思っていたけど、実際に再利用してみると使いづらい。。。みたいなコードを生み出してしまいます。

**最近**は「こういう形の方が使いやすいよね？」「こういうふうにまとめておくとメンテするときに楽になるよね？」というような思考が増えました。

SOLID原則やDDDやクリーンアーキテクチャなどに特別こだわることはなく（もちろん大切ではありますが）、【**自分以外の人に対して意図が伝わる形になっている、再利用しやすい形になっている、メンテナンスしやすい形になっている】という状態**を目指してコードを書くようにしています。

## 最後に
【コードを綺麗に書く】というのは、技術書に書いてあるような形に近づけるのではなくて、**他の人に意図が伝わるように、他の人が再利用しやすいように、他の人がメンテナンスしやすいように自分以外の開発者のことを想いながらコードを書いていくということ**だという気がしています。
（これもまた絶対的な正解ではない）

とはいえ技術的な成長をするためには技術書を読んだり、Webで色々と調べることも重要だと思っています。
技術書も読んだらそれを絶対的な正解だと思わず、自分以外の開発者（将来の自分という意味で自分も含む）を楽にするための手段の一つとして捉えられるようになるとまた有意義なのかなと最近思っています。

逆に技術書を絶対的な正解だと思い込み、その形にすることこそが正解だ。。。というふうになってしまうと身の回りの人も、自分自身も、自分が関わっているプロダクトもみんな辛くなってしまうのではないかと思っています。

自分達の仕事はプロダクトを開発して、**プロダクトを通して価値提供をすること**であって**コードを技術書通りの形のように綺麗に書くことではありません**。
プロダクトを最大限成長させるためにも、プロダクトを通してたくさんの価値提供をしていくためにも、他の開発者の人が楽になるような、他の開発者の開発速度や改修速度が上がるような、そんなコードを書けるようになれたらベストだと思います。
こんな偉そうなことを言っている自分もまだまだまだ未熟なので頑張ります。。。
ブロック要素からはみ出た文字列の最後を「...」にする方法

# やること
今回は以下のように付箋に何か書き込んだときにはみ出てしまうのを直していきたいとおもいます。テキストに続きがある場合、末尾を「...」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663896/2bb9710d-1096-e9d6-3844-c45f8318b44a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663896/10d74515-5678-74bf-1a69-ec05e1173c30.png)

## 元のソースコード
```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <title>Document</title>
    <link rel="stylesheet" href="../reset.css" />
    <link rel="stylesheet" href="./styles.css" />
    <style>
      body {
        display: flex;
        justify-content: center;
        align-items: center;
      }

      .sticky-note {
        width: 200px;
        height: 200px;
        background-color: antiquewhite;
        box-shadow: 2.8px 2.8px 2.2px rgba(0, 0, 0, 0.02),
          6.7px 6.7px 5.3px rgba(0, 0, 0, 0.028),
          12.5px 12.5px 10px rgba(0, 0, 0, 0.035),
          22.3px 22.3px 17.9px rgba(0, 0, 0, 0.042),
          41.8px 41.8px 33.4px rgba(0, 0, 0, 0.05),
          100px 100px 80px rgba(0, 0, 0, 0.07);
      }
    </style>
  </head>

  <body>
    <div class="sticky-note">
      <p>
        こんにちは。私の名前はタスです。名古屋に住み名古屋を愛し、名古屋に愛されている者です。そんな私が最近ハマっていることは乾電池熱目です。あれはいいいですよね。単1だったり単3だったり単4だったり色々種類があります。そう言えばお蕎麦は好きですか？僕はパスタよりもラーメン派です。
      </p>
    </div>
  </body>
</html>
```
# -webkit-line-clampを使う
最初はtext-overflow:ellipsisでなんとかなると思っていなのですが、インライン要素にしか効かないようです。

https://developer.mozilla.org/ja/docs/Web/CSS/text-overflow#:~:text=text%2Doverflow%20%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AF%E3%80%81%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AE%E9%80%B2%E8%A1%8C%E6%96%B9%E5%90%91%E3%81%AB%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%83%BC%E8%A6%81%E7%B4%A0%E3%82%92%E3%81%AF%E3%81%BF%E5%87%BA%E3%81%99%E5%86%85%E5%AE%B9%E3%81%AB%E3%81%AE%E3%81%BF%E4%BD%9C%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99%20(%E4%BE%8B%E3%81%88%E3%81%B0%E3%80%81%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E4%B8%8B%E3%82%92%E3%81%82%E3%81%B5%E3%82%8C%E3%82%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB%E3%81%AF%E4%BD%9C%E7%94%A8%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93)%E3%80%82

そこで、-webkit-line-clampというプロパティを使用して、行数を指定することで実現できました。
```css:styleタグに追加
p {
        /* ここから追加 */
        overflow: hidden;
        display: -webkit-box;
        -webkit-box-orient: vertical;
        -webkit-line-clamp: 8;
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663896/66f6d4cb-816c-a091-e8b6-1de5a03eda7f.png)

しっかりブラウザ対応するとかでなければこれで良さそうです👍
ViTのキーとバリューを小さくするPVTの進化【PVTv2】



**原論文**
PVT v2: Improved Baselines with Pyramid Vision Transformer
https://arxiv.org/abs/2106.13797



# 関連研究

Vison Transformerの解説
https://qiita.com/wakanomi/items/55bba80338615c7cce73

CNN+ViTモデルの傾向【サーベイ】
https://qiita.com/wakayama_90b/items/96bf5d32b09cb0041c39

PVTの解説（PVTv2の元となったモデル）
https://qiita.com/wakayama_90b/items/77c4c6857210b73e24b8


# 結論
PVTから以下を改善した．
- 位置埋め込みを削除
- パッチ埋め込みに畳み込みを採用（局所的な認識を補助と特徴量のダウンサンプリング）
- キーとバリューのダウンサンプリングに平均プーリングを採用
- FFNにDWConvの追加（位置情報の保存と性能向上）




# 概要
ViTの問題に，計算量が膨大であるという問題点がある．この問題をPVT含め，PVTはキーとバリューをダウンサンプリングすることでこの問題を解決する．また，ViTは画像を小領域のパッチに分割し，パッチ間の類似度計算をする認識を行うため，パッチ内の特徴を抽出できず，画像の細かい認識が苦手である問題点もある．これをViTの構造に細かい認識が得意な畳み込み層を組み込むことにより，ViTの認識を補助する．
ViTにはパッチの情報を並列に処理するため，パッチの位置を保存するために，位置埋め込みを行う．しかし，位置埋め込みによる性能低下する可能性がある．PVTv2は，FNNに畳み込み層を追加することにより，位置情報を保存の役割をすることにより，位置埋め込みを削除する．



# モデル構造
PVTv2のモデル構造はPVTを元としたステージ4の階層型モデルが採用されている．以下に変更点を示す．

- 位置埋め込みを削除
- パッチ埋め込みに畳み込みを採用（局所的な認識を補助と特徴量のダウンサンプリング）
- キーとバリューのダウンサンプリングに平均プーリングを採用
- FFNにDWConvの追加（位置情報の保存と性能向上）


（注）以下のモデル構造はPVTv1
![スクリーンショット 2023-06-15 17.56.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/82fa8371-d8c1-816f-33a7-97d5fcea5dfd.png)



## パッチ埋め込みとFNNの改良



<img width="500" alt="スクリーンショット 2023-06-15 17.52.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/0844575a-9749-18df-b5de-9ebfd3eae071.png">

### パッチ埋め込み（a）
畳み込み処理でカーネルのサイズを大きくする．また，0パディング（特徴量の外周に0の値を付与する）．特徴を抽出をオーバーラップさせる．オーバーラップとは，重複するようにカーネル（フィルタ）を通す．
図(a)の上段のPVTv1は特徴抽出で赤い範囲をずらした時に他と被らないようにする．下段のPVTv2は赤い範囲を被るように移動させる．


### FFN（b）
カーネル3，パディング1のDWConvを追加する．PVTv2は位置埋め込みを行なっていない．これを，FFNに追加したDWConvを用いて位置情報の保存の役割をする．





![スクリーンショット 2023-06-15 18.25.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457775/5b942847-e7e3-8ca2-097d-85ac5c2ef9ce.png)


# 実験結果
画像分類，物体検出，セグメンテーションで良い精度．


# まとめ
今回は，ViTのキーとバリューを小さくするPVTの進化【PVTv2】について解説した．
PVTを改善して良くなった．
Payaraの2台構成

### はじめに
Payaraサーバのクラスタについて、よくわからなくて気が進まないが、ちょっと調べて動作確認した。

### 環境
* Payara 5（コミュニティ版）×２
* Apache2.4
* CentOS Stream 9（docker）

### 単純に2台並べる(Stickyセッション使用)

【参考】インスタンスを作ったり、Domain Administration Server(DAS)は1台で、ssh経由で2台目をコントロールできるみたい。やらなかったが。

https://blog.payara.fish/configuring-sticky-sessions-for-payara-server-with-apache-web-server

JvmRouteオプションを追加するのみで、それ以外はデフォルトのまま使用して動作確認した。

イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/5481e0e2-900b-6df8-fd48-952fb9d031b8.png)

メモ：
* PayaraのJavaオプションにjvmRouteオプションをつけて起動。
* Payara1とPayara2の構成は、jmvRouteオプションの引数以外は同じ。
* インスタンスも作成せず、デフォルトの状態でアプリケーションをデプロイ
* PayaraのアプリケーションのHTTPポートは8080
* mod_proxyでリクエストを振分け。sitckyセッションにより、リクエストは同一サーバに送られる。
* ユーザ接続中のサーバに障害が発生した場合、そのユーザの処理は継続できない。
* アプリケーション配置先は、/opt/payara5/glassfish/domains/domain1/applications/配下
（payara5を/opt/payara5に配置した場合）


mod_proxyの設定。
```conf
<Proxy "balancer://payara/">
 BalancerMember "http://<payara1のIP>:8080/" route=app1
 BalancerMember "http://<payara2のIP>:8080/" route=app2
 ProxySet lbmethod=byrequests
 ProxySet stickysession=JSESSIONID
</Proxy>

ProxyPass / "balancer://payara/"
ProxyPassReverse / "balancer://payara/"

```

### デプロイメントグループで構築
デプロイメントグループは、アプリケーションをグループ化して管理するための機能とのこと。
1つのコンソールから複数台のサーバに同時にデプロイしたり、起動、停止を操作することができる。台数が少なく、あまり管理コンソールから操作しないところであれば、それほどうれしくない。


【参考】

https://blog.payara.fish/creating-a-simple-deployment-group

イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1284235/e4f0b2b4-e3c7-907a-5a8f-3715cb68fa5f.png)




メモ：
* 構築時は、Payara1のみ用意しておけばよい。Payara2は、Payra1からssh経由でコピー、展開までしてくれる。
* node➾インスタンス➾デプロイメントグループの順に構築する。
*  各サーバから、/asadmin start-local-instance　<インスタンス名>で個別にアプリケーション起動可能。
*  アプリケーションは、

mod_proxyの設定。
```conf
<Proxy "balancer://payara/">
 BalancerMember "http://<payara1のIP>:28080/" 
 BalancerMember "http://<payara2のIP>:28080/" 
 ProxySet lbmethod=byrequests
</Proxy>

ProxyPass / "balancer://payara/"
ProxyPassReverse / "balancer://payara/"
```
使ったことない人に向けたDynamoDBの基本と操作方法

# はじめに
本投稿はDynamoDBの入門記事です。
Webエンジニアが初めてDynamoDBを利用したサービスを構築した際に学習したことを記す。

# DynamoDBとは
`1 桁ミリ秒単位で規模に応じたパフォーマンスを実現する高速で柔軟な NoSQL データベースサービス`です。

Oracle, MySQLなどのリレーショナルデータベース(RDB)に対してNoSQLは"Not Only SQL"と言われていてRDB以外を指す。
例えば以下のタイプがある

## Key Value Store(KVS)
その名の通りKeyとValueのデータを管理するデータストアでDynamoDBはこのタイプ。
高度なパーティション化に対応しており、他のタイプのデータベースでは達成できない大規模な水平スケーリングが可能となる。

## ドキュメント型
JSONやXMLなどの形式で書かれたデータを管理するストア。
構造を柔軟に決めることが可能で開発者からしたら直感的に操作できる。
MongoDBがこのタイプ。

## インメモリ
ディスクベースのデータストアではなくメインメモリ上にデータをストアする。基本的に早い
Amazon ElastiCache は、1 秒あたり数億回の操作までスケーリングが可能。



# 設計
RDBとは異なる概念となるので、RDBに慣れている人は特に注意されたし。

DynamoDBはテーブルのデータをパーティションと呼ばれる領域に分けて保持する。

データがどのパーティションへ配置されるかは”パーティションキー”によって決定されます。
パーティションにデータを格納する場合は”ソートキー”として指定した順序でデータを格納する。
データが格納されすぎているパーティションがある場合（そのようなパーティションをホットパーティションといいます）、データのクエリ速度が遅くなる場合があります。また、データの検索手段として、フルスキャンと、パーティションキーを指定した上でのソートキーによる範囲を指定したスキャンの方法があり、ソートキーを指定している場合は後者の検索が可能となり、検索速度が向上する。
（パーティションとソートキーの設計が超重要）

またDynamoDBはインデックスとして、LSI（Local Secondary Index）とGSI（Global Secondary Index）の2種類がある。LSI は、Partition Keyが同一なアイテムを、ほかのアイテムからの検索するために利用する。


## 注意

データ構造だけ定義しクエリーを柔軟に発行できた RDBMS と違い、DynamoDB はクエリーが柔軟ではありません。
また、データ集計にも強くありません。そのため、設計段階で各種データへどのようなアクセスがされるかをきちんと考えておく必要があります。

また、システム全体をDynamoDBだけで無理やり実現しようとせずに、DynamoDBに向いている機能に限定して採用しようとする考え方が大切です。

 ~残念ながら~ 銀の弾丸にはなっていない。

# 操作

aws cliをインストールしてコマンドで実行します。

## テーブル作成
```sh
aws dynamodb create-table \
    --table-name SampleTable \
    --attribute-definitions \
        AttributeName=SamplePartitionKey,AttributeType=S \
        AttributeName=SampleSortKey,AttributeType=S \
    --key-schema \
        AttributeName=SamplePartitionKey,KeyType=HASH \
        AttributeName=SampleSortKey,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=5,WriteCapacityUnits=4000 \
    --table-class STANDARD
```

## データ投入
```sh
aws dynamodb put-item --table-name 'SampleTable' --item '{"SamplePartitionKey": { "S": "00000000" },"SampleSortKey": {"S": "SampleSortkeyValue"}, "Value": {"N": "5000"}}'
```

## クエリ

```s
aws dynamodb query --table-name SampleTable \
    --key-condition-expression 'SamplePartitionKey = :code and begins_with (SampleSortKey, :sub)' \
    --expression-attribute-values '{":code": { "S": "00000000" },":sub": {"S": "Sample"}}' \

```
jqで二次元配列の行と列を入れ替える。

jqで↓これを
```
[
    {
        "role": "A",
        "members": ["taro", "hanako"]
    },
    {
        "role": "B",
        "members": ["jiro"]
    },
    {
        "role": "C",
        "members": ["hanako", "jiro"]
    }
]
```

↓こうしたい
```
[
    {
        "member": "taro",
        "role": ["A"]
    },
    {
        "member": "jiro",
        "role": ["B", "C"]
    },
    {
        "member": "hanako",
        "role": ["A","C"]
    },
]
```

二次元配列の転置ですかね。
行列の入れ替え。

# やりかた
```
jq 'map({"role": .role, "member": .members[]}) | group_by(.member) | map({"member": .[0].member, "role": map(.role)})'
```

# 解説
参考

https://stackoverflow.com/questions/32357240/transposing-objects-in-jq

いきなり理解するのは苦しいので、ひとつずつ解説。

## 元データ
再掲
```
[
    {
        "role": "A",
        "members": ["taro", "hanako"]
    },
    {
        "role": "B",
        "members": ["jiro"]
    },
    {
        "role": "C",
        "members": ["hanako", "jiro"]
    }
]
```

## map({"role": .role, "member": .members[]})
まずは、配列を展開して下記の形に変換します。
```
[
  {
    "role": "A",
    "member": "taro"
  },
  {
    "role": "A",
    "member": "hanako"
  },
  {
    "role": "B",
    "member": "jiro"
  },
  {
    "role": "C",
    "member": "hanako"
  },
  {
    "role": "C",
    "member": "jiro"
  }
]
```
こちらの記事にもお世話になりました。
書き方違いますが、参考にどうぞ。

https://qiita.com/sotoiwa/items/431358283dee00eb6f46

## group_by(.member)
members毎に集め直します。

```
[
  [
    {
      "role": "A",
      "member": "hanako"
    },
    {
      "role": "C",
      "member": "hanako"
    }
  ],
  [
    {
      "role": "B",
      "member": "jiro"
    },
    {
      "role": "C",
      "member": "jiro"
    }
  ],
  [
    {
      "role": "A",
      "member": "taro"
    }
  ]
]
```

## map({"member": .[0].member, "role": map(.role)})
最後がややこしいですね。

↓これを
```
  [
    {
      "role": "A",
      "member": "hanako"
    },
    {
      "role": "C",
      "member": "hanako"
    }
  ]
```
↓これに変換する事を考えてみます。
```
  {
    "member": "hanako",
    "role": [
      "A",
      "C"
    ]
  }
```

入力された各要素を使って目的のオブジェクトを組み立てます。

### "member": .[0].member
一つ前の手順で group_by() しているので、`.member` は全部同じはずです。
なので、1つ目の `member` の値を採用します。

### "role": map(.role)
map関数を使って、各要素を集めて配列にまとめます。

### map({ })
集めた各要素をオブジェクトとして出力します。
map関数なので、配列で出力されます。

参考

https://jqlang.github.io/jq/manual/#map(x),map_values(x)

## 完成
全部まとめると、行列が入れ替わりました。

```
[
  {
    "member": "hanako",
    "role": [
      "A",
      "C"
    ]
  },
  {
    "member": "jiro",
    "role": [
      "B",
      "C"
    ]
  },
  {
    "member": "taro",
    "role": [
      "A"
    ]
  }
]
```

# 備考
記事を書くために jqplay.org 使ってみました。
便利ですね。

https://jqplay.org/
Dapps開発でコントラクトをMumbaiにデプロイするまでの流れのカンペ（仮）

Solidityで以下の要件を満たすコントラクトを記述し、mumbaiにデプロイするまでの流れ。

要件：
・コントラクト名「SuperCoin」
・シンボル「SPC」
・SPCをアドレスからアドレスへ移転できる
・当然、自分の保持するSPCしか移転権限を持たない
・アドレスが保持するSPCを確認できる、確認は誰でも可能
・移転がイベントとして記録される
・SPC発行上限は10000
・初めはデプロイヤーが10000SPC保持

流れ：
1. Hardhat初期設定
2. コントラクト定義
3. コンパイル
4. デプロイスクリプト作成
5. ローカルチェーンへデプロイ
6. mumbaiへデプロイ
7. Verify

## 1. Hardhat初期設定
ディレクトリを作成し、そのディレクトリでHardhatを初期設定。

```
mkdir SuperCoin
cd SuperCoin
npx hardhat
```

## 2. コントラクト定義
contractsディレクトリにSuperCoin.solという名前でコントラクトを作成。

```contracts/SuperCoin.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract SuperCoin is ERC20 {
    constructor() ERC20("SuperCoin", "SPC") {
        _mint(msg.sender, 10000 * 10 ** decimals());
    }
}
```

※ERC20の継承で以下の機能が実装される
- transfer: トークンをアドレスからアドレスへ転送する関数
- balanceOf: 特定のアドレスが保有するトークン数を返す関数、誰でも任意のアドレスのトークン数を参照可
- Transferイベント: transfer実行でトリガーされるイベント

## 3. コンパイル
コントラクトをコンパイル。

```
npx hardhat compile
```

## 4. デプロイスクリプト作成
scriptsディレクトリを作成し、その中にdeploy.jsを作成。

```scripts/deploy.js
async function main() {
    const [deployer] = await ethers.getSigners();
    const Token = await ethers.getContractFactory("SuperCoin");
    const token = await Token.deploy();
    console.log("Token address:", token.address);
}

main()
    .catch(error => {
        console.error(error);
        process.exit(1);
    });
```

## 5. ローカルチェーンへデプロイ
デプロイ実行。

```
npx hardhat run scripts/deploy.js
```

## 6. Mumbaiへデプロイ
.envに、MumbaiネットワークAPIキーと、PolygonSCANのAPIキー、Metamaskのプライベートキーを設定。
MumbaiネットワークAPIキーは、AlchemyかInfuraで取得。
POLYGONSCAN_API_KEYはVerify用。

```.env
MUMBAI_URL="https://polygon-mumbai.g.alchemy.com/v2/xxxxxxxxxxxxxxxxxx"
PRIVATE_KEY="xxxxxxxxxxxxxxxxxx"
POLYGONSCAN_API_KEY="xxxxxxxxxxxxxxxxxx"
```

hardhat.config.js を編集。

```hardhat.config.js
require("@nomiclabs/hardhat-waffle");
require("@nomiclabs/hardhat-etherscan");
require('dotenv').config();

module.exports = {
  solidity: "0.8.9",
  networks: {
    mumbai: {
      url: process.env.MUMBAI_URL,
      accounts: [process.env.PRIVATE_KEY]
    }
  },
  // Verify用
  etherscan: {
    apiKey: process.env.POLYGONSCAN_API_KEY
  }
};
```

デプロイ実行。
```
npx hardhat run scripts/deploy.js --network mumbai
```

## 7. Verify
Verify実行。

```
npx hardhat verify --network mumbai <Token address>
```
【Herokuデプロイエラー】Precompiling assets failed / Error: Cannot find package '@babel/plugin-proposal-private-property-in-object' 対処法

## はじめに

Ruby on RailsアプリをHerokuにデプロイしようとして、
` Precompiling assets failed.` というエラーになり、はまってしまったので
その対処法を記述しておきます。

## 環境
ruby 3.0.1
Rails 6.0.6.1

## エラー内容

Herokuデプロイ時、 `git push heroku master`を実行したところ、以下エラーが発生しました。

```
Precompiling assets failed
Error: Cannot find package '@babel/plugin-proposal-private-property-in-object'
```

## 解決方法

以下のコマンドを実行
```:ターミナル
$ yarn add @babel/plugin-proposal-private-methods
$ yarn add @babel/plugin-proposal-private-property-in-object
```

その結果、`package.json`は、このような構成になる。
![スクリーンショット 2023-06-15 17.21.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468263/afa54cdf-9c99-aa90-cdc6-a5ca4138a86c.png)
※`@babel/plugin-proposal-private-property-in-object` が、`dependencies`ではなく、`devDependencies`の中に配置される場合があります。その時は、`devDependencies`内の`@babel/plugin-proposal-private-property-in-object`を削除し、再度 `yarn add @babel/plugin-proposal-private-property-in-object` を実行すると解消されます

続いて、`yarn.lock`ファイルと、`node_modules`フォルダを削除し
![スクリーンショット 2023-06-15 17.51.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468263/6791795a-4273-1036-eff0-280f771d6417.png)

以下3つのコマンドを実行
```:ターミナル
$ yarn install
```

```:ターミナル
$ rails webpacker:compile
```

```:ターミナル
$ RAILS_ENV=production bin/webpack
```
 （実行した結果がこちら）
![スクリーンショット 2023-06-15 17.12.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468263/911d13c3-dd9a-cc22-a574-898d350842fd.png)

ここから
```:ターミナル
$ git add .
$ git commit -m "(コミットメッセージ)"
$ git push heroku master
```
にて、無事デプロイ成功！！

## 参考にさせていただいた記事
[Webpacker::Manifest::MissingEntryErrorについて](https://zenn.dev/redheadchloe/articles/3615a4d9bcd8a4)
[AWS Q&A 365][StepFunctions]AWSのよくある問題の毎日5選 #79

# 1. AWSステップファンクションズ開発者ガイドに記載されているエラー名は何ですか？
回答：ガイドに記載されているエラー名は、Retry、Timeout、Heartbeat Timeout、Task Failed、States Timeout、及びStates Runtimeです。

# 2. AWSステップファンクションズでエラー後にどのようにリトライしますか？
回答：AWSステップファンクションズは、ステートマシンの定義にリトライフィールドを設定することで、エラー後にリトライを許可します。リトライの回数と各リトライ間の間隔を設定することができます。

# 3. AWSステップファンクションズのフォールバックステートとは何ですか？
回答：フォールバックステートは、ステートマシンの実行中にエラーが発生したときに実行される状態です。これらはエラーを処理し、回復操作を実行するために使用されます。

# 4. AWSステップファンクションズでエラーをどのようにキャッチしますか？
回答：AWSステップファンクションズは、ステートマシンの定義にキャッチフィールドを設定することで、エラーをキャッチすることを可能にします。キャッチするエラー名とエラー発生時に実行する状態を指定することができます。

# 5. AWSステップファンクションズのRetryとCatchの違いは何ですか？
回答：Retryは、状態が失敗したときにそれをリトライするために使用され、Catchはステートマシンの実行中に発生するエラーを処理するために使用されます。Retryはステートの定義で設定され、Catchはステートマシン定義のcatchフィールドで設定されます。