OmniAICreator/Qiita-1.07M huggingface dataset:
Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)の倒し方


Action_Mailerを使い、gmail経由でメール送信したかったが、`Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at)`が連発したのでメモリます。

## 結論

user_name と password は環境変数におくべし。

## 実際のコード

ガイドにある通りconfig/environments/development.rb に以下を追加

```ruby
  # MailCatcher Configuration
  config.action_mailer.raise_delivery_errors = true

  config.action_mailer.perform_caching = false

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = { address: 'smtp.gmail.com',
                                         port: 587,
                                         domain: 'gmail.com',
                                         user_name: ENV['GMAIL_ADDRESS'],
                                         password: ENV['GMAIL_PASSWORD'],
                                         authentication: 'plain',
                                         enable_starttls_auto: true, }

  config.action_mailer.asset_host = 'http://localhost:3100'
  config.action_mailer.default_url_options = { host: 'localhost:3100' }
```

▼パスワードの取得方法は以下の記事が参考になります。
[【Rails】メール送信設定 〜gmail利用〜](https://qiita.com/ozackiee/items/f260f34db4e5c887460d)



この時、user_nameとpasswordを直書きしていたのですが、認証が通らない。
そこで、環境変数として記載したところ、メールの送信ができました。
（僕は.envファイルに記載し、ENVコマンドで呼び出す方法を取りました。）

```.env
GMAIL_PASSWORD=gmailで設定した固有のパスワード
GMAIL_ADDRESS=gmailのメールアドレス
```

## 参考

[gmail用のaction-mailer設定](https://railsguides.jp/action_mailer_basics.html#gmail%E7%94%A8%E3%81%AEaction-mailer%E8%A8%AD%E5%AE%9A)
Knowledge Baseについて

### ナレッジ管理
「ナレッジ」というのは「知識や経験」を指します。
個人の知識や経験を組織として蓄積していこう、という試みをナレッジ管理と言います。
そして、ServiceNowにおけるナレッジ管理ツールをKnowledge Baseと言います。
今回はナレッジベースの実装について概略を見ていきます。

### ナレッジベースの特徴
ナレッジベースでは、
- 独自のライフサイクルワークフロー
- ユーザー基準
- カテゴリ構造及び管理アサイン

を設定可能になっています。

### 関連テーブル
- ナレッジベース[kb_knowledge_base]
- ナレッジ記事[kb_knowledge]

### ナレッジベースの作成
ナレッジ記事[kb_knowledge]を管理するためにナレッジベース[kb_knowledge_base]を作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/9f2e02fe-9729-ff9e-6bce-f5f08865cd65.png)

Knowledge BaseのNewで新規作成
新規作成した画面は以下、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/abbafa35-76dc-936f-ac4b-0e5aed91361e.png)

必須のフィールドは以下の４つがあります。

- タイトル
- 所有者
- **公開用ワークフロー**
- **廃止用ワークフロー**

### ナレッジベースワークフロー
ナレッジは作成しただけでは多くの方が見れる状態にはなりません。
公開（Published）の状態になることで他のユーザーも参照する事ができるようになります。
作成したナレッジを公開したり、廃止したりする場合には、デフォルトで以下の４つのワークフローの中から選択します。
- **Approval Publish**：公開承認 :作成したナレッジを公開する際に承認が必要となるワークフロー
- **Approval Retire**：廃止承認 :作成したナレッジを廃止する際に承認が必要となるワークフロー
- **Instant Publish**：すぐに公開 : 作成したナレッジを公開する際に承認が不要ですぐに公開されるワークフロー
- **Instant Retire**：すぐに廃止 : 作成したナレッジを廃止する際に承認が不要ですぐに廃止されるワークフロー

これら４つのワークフローは『公開用ワークフロー』・『廃止用ワークフロー』にて使用できます。

これらのワークフローもWorkflow Editorで管理されているので表示する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/fa050122-fb69-6e11-1b2d-ea54e204b083.png)
上記は承認された時にどうなるか、という流れです。

### 関連リスト
ナレッジベースの画面下部では以下がタブ表示されます。
- **ナレッジ（Knowledge）**
- **読込可能（Can Read）**
- **寄稿可能（Can Contribute）**
- **注目のコンテンツ（Featured Content）**
- **ナレッジカテゴリー（Knowledge Categories）**

そのうち**読込可能**と**寄稿可能**はナレッジのセキュリティを設定するためのタブです。
ここで**ユーザー基準**を指定することで、記事を読めるユーザー、記事をかけるユーザーを自由に設定できます。

**ナレッジカテゴリ**は記事のカテゴリ分けとグループ化・階層化をしたい時に使うタブです。
**ナレッジ**は記事の一覧が表示されます。
**注目のコンテンツタブ**には記事を追加することでユーザーはそのコンテンツを見つけやすくなります。
JavaScriptの親切過ぎる型変換

# 概要
jsの比較演算子に関する仕様です。
間違って配列と数値を比較してしまいましたが、処理が通ったので驚きました。

```js
// 比較A
1 == [1] // true
// 比較B
1 === [1] // false
// 比較C
'1' === [1] // false
```

# 種明かし
比較する値がオブジェクトの場合、手順を追ってプリミティブ型に変換した上で比較される。

# 解説
[stack overflow](https://stackoverflow.com/questions/1724255/why-does-2-2-in-javascript)でも解説をみつけましたが、概要にのせた中の`比較A`を例に解説します。
解説中にプリミティブ型とオブジェクト型が出てくるので、分からない方は以下を参考に
> プリミティブ型とオブジェクト型
> https://qiita.com/makotoo2/items/9566cebf205ef8b42505


```js
// 比較A
1 == [1]
```

1.　まず、右辺がオブジェクトなので、プリミティブ型に変換。
Arrayの場合、toStringメソッドによってstringに変換。
```js
1 == '1'
```
2.　それでもまだ左右で型が違うので、文字列をNumberオブジェクトに変換。
```js
1 == Number('1')
```
3.　右辺がオブジェクトなので、再度プリミティブ型に変換。
Numberの場合、valueOfメソッドによってintに変換
```js
1 == 1
```
4.　両辺の型が揃ったので、比較し結果を返す
```js
true
```

比較Bのように、比較演算子が`===` の場合、1の操作までで終わり、型を揃える操作は行われず`false`となります。
厳密な手順は少し違いますが、正確なのは上記のstack overflowでもChristophさんがおっしゃっているように、jsの規格(ECMA-spec)に載っています。

> **3rd edition**
> [ECMA-spec](https://www.ecma-international.org/wp-content/uploads/ECMA-262_3rd_edition_december_1999.pdf)
> (P67の11.9.3 The Abstract Equality Comparison Algorithm)

また、最新版でも同様
> **11th edition**
> [ECMA-spec](https://www.ecma-international.org/wp-content/uploads/ECMA-262_11th_edition_june_2020.pdf)
> (P129の7.2.19 Abstract Equality Comparison)


# 感想
さすがjsって感じの親切さですね。もちろん、この仕様に頼るとバグの元になる上に、読む人に理解されづらいので、自身のコードは別の書き方に修正しました。
また、jsの規格も初めて読みましたが結構簡単な英語で書かれているので、読みやすかったです。
非線形時系列解析  松葉育雄先生　朝倉書店



```r

#RCAモデル　p.52

#pthi(n)_{2}~N(0,exp(-(t(X)*c(beta)+c(alpha)))
#guzai_{n}~N(0,1)

#サンプルデータ
data("AirPassengers")
Y=as.numeric(t(AirPassengers))

p=6
y=c()
X=array(0,dim=c(length(Y)-p,p))

for(j in 1:nrow(X)){
val=Y[length(Y)-j+1]  
y=c(y,val)
vec=Y[(length(Y)-j):(length(Y)-j-p+1)]
X[j,]=vec  
}

Xn=y

#初期パラメータ
pthi=solve(t(X)%*%X)%*%t(X)%*%Xn
alpha=rep(10^(-6),p)
beta=array(10^(-6),p)


ite=10^5
eta=10^(-7)

for(l in 1:ite){
  
da=t(-exp(-(t(X)*c(beta)+c(alpha))))*X^2
db=t(-exp(-(t(X)*c(beta)+c(alpha))))*X^3 
 
star=apply(t(exp(-(t(X)*c(beta)+c(alpha))))*X^2,1,sum)+1

dLa=-t(da)%*%(1/star)/2+t(da)%*%c((Xn-X%*%pthi)^2/(2*star^2))
dLb=-t(db)%*%(1/star)/2+t(db)%*%c((Xn-X%*%pthi)^2/(2*star^2))
dLpthi=apply(X*c((Xn-X%*%pthi)/star),2,sum)

alpha=alpha+eta*c(dLa)
beta=beta+eta*c(dLb)
pthi=pthi+eta*dLpthi

loglik=-sum(log(2*pi*star))/2-sum((Xn-X%*%pthi)^2/(2*star))
print(loglik)
AIC=-2*loglik+nrow(X)*p
}



```
Rails 後からNot null 制約を付与する

テーブルのカラムに、後からNot null 制約をつける手順を書いていきます。


まず、新たに Not null 制約を付与するためのマイグレーションファイルを作成します。

```
rails g migration ChangeCloumnsNotnullAddテーブル名
```
↓
```
# rails g migration ChangeCloumnsNotnullAddMovies
```

マイグレーションファイルを作成


```db/migrate/***_change_columns_add_notnull_on_movies.rb
class ChangeCloumnsNotnullAddMovies < ActiveRecord::Migration[6.0]
  def change
    change_column :users, :title, :string, null: false
    change_column :users, :image, :string, null: false
    change_column :users, :released_year, :string, null: false
    change_column :users, :country, :string, null: false
    change_column :users, :screening_time, :string, null: false
    change_column :users, :synposis, :string, null: false
  end
end
```

```null: false```で制約を付与します
```null: true```で制約を付与しません

```
# rails db:migrate
```

するとエラーが、、、

```
# rails db:migrate
== 20220414030927 ChangeCloumnsNotnullAddMovies: migrating ====================
-- change_column(:movies, :title, :string, {:null=>false})
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Invalid use of NULL value
```

どうやら既に作ってあるmovieデータの中に、titleに何も指定されてない（```null```になっている）ものがあり、このままだとtitleカラムは```Not null```にできないということですね。

titleが```null```になっているデータがないか確認してみます。
```
# rails c


> movies = Movie.all

> movies.find(6)
```

一つずつ```movies.find```で確認してみたところ、```movie（id:6)```のデータのtitleがnullになっていました。なのであとはこれを消すだけです。

```
> Movie.find(6).destroy
```

無事```rails db:migrate```を実行できて、not null制約を付与することができました！


参考：https://qiita.com/pank24ever/items/b411fe0a238aadc03fb0
Scalaの勉強はじめました 8 〜関数型プログラミング編 エラー処理とOption〜

## はじめに
N予備校で「Scala応用」コースを受講しています。
今回はエラー処理について。

## require
### 例外を発生させる
```scala
def divStr(target: Int, divider: Int): String = {
  if(divider == 0) throw new IllegalArgumentException("dividerに0は利用できません。") 
  else (target / divider).toString
}
```

### require を使う
:::note
必要とされる条件を第一引数に、Boolean型の値となるように記述し、その後に例外処理時に表示されるメッセージを記述する。
:::

```scala
def divStr(target: Int, divider: Int): String = {
  require(divider != 0, "dividerに0は利用できません。")
  (target / divider).toString
}
```

### try catch を使う
```scala
val size = try {
  divStr(10, 0)
} catch {
  case e: IllegalArgumentException => 0
}
```

## Option
Java の null の代替として使われることが多い。
値を1 つだけいれることのできるコンテナ。

:::note
Some は何かしらの値が格納されている時の Option の型
None は値が何も格納されていない時の Option の型
:::

引数が`Null`の場合、`None`が返る。
`Option[String]`が`Null`だったら空文字を返す処理。

```scala
val o: Option[String] = Option("hoge")
o.getOrElse(")
```

`o.get`では別の例外が発生してしまうこともあるので、基本的には`getOrElse`を使う。

### パターンマッチ
```scala
val s: Option[String] = Some("hoge")
s match {
  case Some(str) => println(str)
  case None => println("None")
}
```

### コレクション
```scala
Some(3).map(_ * 3)
```

`_ * 3` は 無名関数の `(x) => x * 3`と同義。

### fold
:::note
none の場合に実行し、値を返す関数を定義できる
:::

`fold[B](ifEmpty: B)(f: (A) => B): B`
の形で利用できる。

```scala
// n は None
// ifEmpty に 0 を定義 => 本来None が返るところが、 0 が返るようになる
n.fold(0)(_ * 3)
// 9 が返る
Some(3).fold(0)(_ * 3)
```

### Map の getメソッド
デフォルトで`Option`型を返す。

```scala
val v1: Option[Int] = Some(3)
val v2: Option[Int] = Some(5)
v1.map(i1 => v2.map(i2 => i1 * i2))
// => Option[Option[Int]] = Some(Some(15))になる
```

入れ子の解消に`flatten`を利用する。
```scala
v1.map(i1 => v2.map(i2 => i1 * i2)).flatten
// => Some(15)
```

### flatMap
`map`と `flatten`を組み合わせたもの

```scala
v1.flatMap(i1 => v2.map(i2 => i1 * i2))
```

## まとめ
エラー処理は理解できるんですが、`Option`がややこしい印象。
`Option`というより、`map`関数。
次回もエラー処理の続きになります。
【Docker/MySQL】DBバックアップの取得・復元する手順

# はじめに
RailsアプリケーションでDBにMySQLを使用して開発しており、DBのデータを一時的に残して作業をしたいことがありました。
本記事では、バックアップと復元方法の手順を記述しています。

## 前提
Ruby: 2.7.3
Rails: 6.1.5
MySQL: 8.27
Docker: 20.10.5

## 開発環境構成図
docker-composeコマンドを実行してRailsコンテナとDBコンテナを立ち上げています。
今回はDBコンテナに接続しバックアップ作業を行います。

![スクリーンショット 2022-04-14 12.45.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230985/fd454282-2038-cc13-aff6-bdea0038de0a.png)




# 作業内容
## Dockerコンテナにログイン
バックアップ取得、復元作業はコンテナ内で行います。

```
docker exec -it DBコンテナ名 bash
```

## バックアップ取得
今回は特定のDBのみバックアップを取得しています。

バックアップコマンドには複数オプションが存在するので適宜、必要なオプションを追加してください。
https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html

```bash
mysqldump --single-transaction -u DBユーザ名 -p -h DBコンテナ名　DB名 > 出力先ファイル名.dump
```

## 復元

```bash
mysql -u ユーザー名 -p -h DBコンテナ名 データベース名 < 出力先ファイル名.dump
```

## dumpファイルの削除
サービスの起動を確認し問題がなければ、作成されたdumpファイルの削除して完了です。


# 参考URL
https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html
WordPressのカスタム投稿タイプとカスタムタクソノミー

WordPressのカスタム投稿タイプとカスタムタクソノミーについて対応を行なった際に色々と混乱したので、整理のためにメモしておきます。

# そもそもカスタム投稿タイプ・カスタムタクソノミーとは？

そもそもカスタム投稿タイプとかタクソノミーって何？っていうところが混乱の元になっていたのでその理解から。
簡単にまとめると以下の通り。

- 「固定ページ」：あまり編集されることがない固定内容を記述したページを使いたい時に利用
- 「投稿」：ブログなど、どんどん記事を追加したい場合に利用
- 「タクソノミー」：「カテゴリ」と「タグ」をまとめて「タクソノミー」と呼ぶ
- 「カスタム投稿タイプ」：「投稿」とは別グループで記事をどんどん作りたい場合に利用
- 「カスタムタクソノミー」：「カスタム投稿タイプ」に紐づく「カテゴリ」と「タグ」

:::note
カスタムタクソノミーには、投稿で利用しているカテゴリやタグ（WordPressコアというらしい)を利用する方法と別途カテゴリやタグを新規に作る方法があります。
:::

# カスタム投稿タイプやカスタムタクソノミーを追加する方法

カスタム投稿タイプやカスタムタクソノミーを追加するには大きく２つの方法があります。

1. functions.phpに追記する
1. Custom Posttype UIプラグインを利用する

プラグインを使う方が断然簡単なのですが、今回私の場合は利用しているテーマが自動で追加したカスタム投稿タイプがあり、そこにカスタムタクソノミーを追加する必要があったのでfunctions.phpに追記しました。

# まとめ
テーマとプラグインで色々できるのはいいのですが、こういった機能重複があった時の対応が大変ですね。。。

# 参考

https://wp-principle.net/taxonomy/

https://296.co.jp/article/52551120182310491
I/Oについて

## I/Oとは？

入出力(I/O)はメインメモリとディスク・ドライブ、ターミナル、ネットワークなどの外部デバイスとの間でデータをコピーする手段である。

操作 | 役割 | 関数
--|--|--
入力操作|I/Oデバイスからメイン・メモリにデータをコピーする|read
出力操作|メイン・メモリからI/Oデバイスにデータをコピーする|write

ハイレベルI/Oはシステムレベル`UNIX　I/O`関数を用いて実装される。

## UNIX I/O

LinuxカーネルはUNIX I/Oと呼ばれる、シンプルなローレベルアプリケーションインターフェースを提供する。

Linuxはデバイスのファイルへの洗練されたマッピングを行う。ネットワーク、ディスク、ターミナルなどのすべてのI/Oデバイスはファイルとしてモデル化され、すべての入出力は適切なファイルを読み書きする。

操作|説明|関数
-|-|-
ファイルのオープン|アプリケーションからカーネルに対応するファイルをオープンするように要求する。カーネルはディスクリプタ(非不整数)を返す|open
現在のファイルポジションの変更|カーネルはオープンされたファイルについて、初期値が0のファイルポジションを管理する。ファイルポジションはファイル先頭からのバイトオフセットである。アプリケーションはシーク操作を行うことで、明示的に現在のファイルポジションkを設定できる。|seek/read/write
ファイルの読み書き|　ファイルからメモリにnバイトをコピーする。ファイルポジションkから開始し、kをnだけ増加させる。最後まで読み取るとファイル終端(EOF)と呼ばれる状態になる。状態であり、EOF文字は存在しない。書き込み操作はその逆を行う。|read/write
ファイルのクローズ|カーネルにファイルへのアクセス終了を要求する。カーネルはファイルがオープンしたときに作成したデータ構造を解放し、利用可能なデスクリプタのプールにそのデスクリプタを戻すことで応じる。|close


## 標準I/Oとは？

標準I/Oは`UNIX I/O`のハイレベルな代替え手段を提供する。

UNIX I/O関数 | 標準I/O関数
--|--
open|fopen
close|fclose
read/gets|fread/fgets/scanf
write/puts|fwrite/fputs/printf

標準I/Oライブラリは、オープンしたファイルをストリームとしてモデル化している。プログラマにとってストリームはFILE型の構造体へのポインタである。
FILE型のストリームは、ファイルディスクリプタとストリームバッファの抽象化である。ストリームバッファの目的は、コストの高いシステムコールの数を最小にすることである。

## ファイル・タイプについて

ファイルタイプについては以下に別途まとめました。

[Linux & Mac　ファイルタイプ一覧 - Qiita](https://qiita.com/keitean/items/a0de35ce80cb9ce1e905)

## 参考

[コンピュータ・システム](https://amzn.to/3mlYzwZ)
PHPerKaigi 2022 に参加した

今年、初めて PHPerKaigi 2022 (2022/04/09〜4/11) に参加しました。

とても勉強になったし楽しかったです。

コロナ時代になって良いことなんて何もなさそうですが、こうしたイベントに奈良の田舎者が参加できるようになったというのはとても良いことでして、奈良の田舎者が簡単にイベントに参加できる喜びは嬉しい限りです。

コロナ前から PHPerKaigi のことは知っていましたが、東京まで出ていくのはとてもハードルが高かったのです。
こうしてオンラインで参加できると本当に嬉しい。
参加費用がある程度かかったって、東京までの交通費のことを思ったら全然痛くないし、ノベルティがあんなにたくさん届いたら、なんか申し訳なくなるぐらいでした。

オンラインなので、直接いろいろな方々とコミュニケーションを取ることはできませんでしたが、Discard やコメントなどで結構面白くやりとりができて楽しかったです。
逆にリアルに会場に行ってひとりぼっちでいるよりもコミュニケーションできていたかもしれません。

次に特に感激したトーク・アンカンファレンスについて書きます。

## 「予防に勝る防御なし - 堅牢なコードを導く様々な設計のヒント」

@t_wada さんの [「予防に勝る防御なし - 堅牢なコードを導く様々な設計のヒント」](https://fortee.jp/phperkaigi-2022/proposal/ef8cf4ed-63fe-42f8-8145-b3e70054458b) では、肺炎からの病み上がりだというのに丁寧に解説いただきました。（僕も経験があるけど、肺炎って本当に苦しいんですよ。そしてまともに戻るまでに時間がかかるんです。ほんまにしんどかったと思います。@t_wada さんありがとうございました）

トークでは堅牢なコードを書くための手法を順次説明していただきました。自分でもすでにやっている部分もありましたが、わかっていなかった部分も気づいていなかった部分もあり、勉強になりました。


中でも、正当性と堅牢性の話、それらをどこのレイヤーで担保するのか？という話は「なるほど」と思いました。
外界からやってくるものに対しては堅牢性を、ユースケース層やドメイン層では正当性を重んじるということ。

あと、PHPでインスタンスの `__construct` を呼べるというのは知りませんでした。びっくりしました。なんで呼べるんだ？ってなりました。

## 出張 Symfony Meetup がよかった

day1 の午後には、Track3 のアンカンファレンス枠で、 @ippey_s さんが、出張 Symfony Meetup を開催してくださったので、そこにも参加しました。
アンカンファレンスは zoom で参加するようになっていて、強いエンジニアの皆さんと直接やりとりすることができて、楽しかったですしとってもタメになりました。

Symfony の DIコンテナは PHP フレームワークの中でも最強。ということがよくわかりました。
レイヤードアーキテクチャで、依存性逆転の法則を適用するような場合にもしっかり対応できるんです。
レイヤーごとにリポジトリを分けて、Composer で require している場合でも、`service.yaml` に記述してやれば、DI の対象として組み入れることができます。

その他、開発上のちょっとした tips などを色々教えていただきました。ありがとうございました。

## 最後に

他にもたくさんのトークを聞かせていただきました。
まだ見ていないトークもたくさんあるんですが、１ヶ月後までタイムシフトで見られるので、ぼちぼち追いかけていこうと思っています。

開催者やスタッフの方々のご尽力のおかげで楽しいカンファレンス体験をすることができました。
厚くお礼を申し上げます。

田舎者の私からは、たとえコロナが収束してもオンラインでの開催を続けていただきたいです。
それとアンカンファレンスはとてもよかったので、こちらもぜひ続けてください。

ありがとうございました。よろしくお願いします。
【Salesforce】Ant移行（salesforce 本番リリース）ツール インストール手順

## Ant 移行ツール（salesforce 本番リリース用ツール）
【Ant 移行ツール】はローカルディレクトリと Salesforce 組織間でメタデータを移動する Java/Ant ベースのコマンドラインユーティリティです。
　Apatch Antベースで動作する、Salesforce環境からメタデータを取得・適用するためのツールです、Ant上で動作するビルドツールです。 
　詳しくは以下の公式サイトを確認してください。
　※https://developer.salesforce.com/docs/atlas.ja-jp.daas.meta/daas/meta_development.htm

## 構成イメージ

#### Ant移行ツールは下記の構成イメージで動作します。
　Java バージョン 11 以降
   　　⇒Apache Ant バージョン 1.6 以降
　　　⇒Ant移行ツール

## Java バージョン 11 以降のインストール
#### ①下記のサイトから、Java JDKの最新バージョンをダウンロードします。
【http://www.oracle.com/technetwork/java/javase/downloads/index.html】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/80a5b55c-3176-aae9-cf59-f3d6a1249364.png)
#### ②上記インストーラーをダウンロードし、インストールした後に、環境変数の設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/c58fa4af-2caa-324a-d692-2f318bdd31cc.png)
#### ③コマンドプロンプトで「java -version」と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/00ba333f-6515-7b8e-cbb4-0ac1490729df.png)

## Apache Ant バージョン 1.6 以降
#### ①下記のサイトから最新のApache Antをダウンロードします。
【https://ant.apache.org/bindownload.cgi】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/da720916-d4ba-39de-f3ab-5f41c3a98eaf.png)
#### ②上記インストーラーをダウンロードし、インストールした後に、環境変数の設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/ca113952-e9c6-5329-5d4d-cf819bdc9e93.png)
#### ③コマンドプロンプトで「Ant -version」と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/a7a3fb0d-4d32-d752-5ed0-f2549bfd049e.png)


## Ant移行ツール
#### ①下記のサイトから最新のAnt移行ツールをダウンロードします。
【https://gs0.salesforce.com/dwnld/SfdcAnt/salesforce_ant_54.0.zip】

#### ②【Ant移行ツール】のzipファイルをダウンロードして展開します。その中の、ant-salesforce.jarファイルを【Apache Ant】インストールパスのlibフォルダに配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/151307a9-bb78-12ae-7845-85a221a8161a.png)
Flowbiteを使ってStriped tableを作るときにodd, evenが効かない

Flowbite(TailwindCSS Utility) × Laravelで、
以下のようなシマシマのStriped Tableを作ろうと、サンプルコードをコピーしましたが、
odd, evenが効かなかったのでその対処法です。
![スクリーンショット 2022-04-14 10.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542326/9980b08c-3d5b-2dc8-18f7-1d59b11a12a4.png)

## 対処法

以下のコードを追加することで解決しました！
```tailwind.config.js
module.exports = {
  // ...
  variants: {
    backgroundColor: ['responsive', 'odd', 'even', hover', 'focus'],
  },
}
```

今回のケースは、そもそも、oddを使った記述がapp.cssにコンパイルされていませんでした。
これはFlowbiteの問題ではなく、Tailwindの設定の問題で、
Tailwindでは一部の擬似クラスは開発環境でのビルドでもcssファイルに取り込まれないため、
その設定を自分で書く必要があるとのことでした。

https://tailwindcss.jp/docs/pseudo-class-variants#default-variants-reference
SQLServerがVisual Studio Code上でも使える!?拡張機能のインストール方法から使い方まで解説

## 概要
こんにちは。shun198です。
VSCodeでコード書いてるのにDBの実行結果をわざわざSQL Serverから閲覧するのはめんどくさい。。
VSCode内で完結できたらいいのになあって思うことがあると思います
今回はSQLServerの拡張機能のインストール方法とその使い方について一通り解説します。

## 前提
Visual Studio Codeをインストール済み
SQL Serverをインストール済み
SQL Server認証を使って接続

## 手順

### SQL Serverの拡張機能のインストール
まずは下記の画像のように拡張機能のメニューからMicrosoftの公式の拡張機能である<Strong>SQL Server (mssql) </Strong>をインストールします
![sqlserver_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/737a5612-4347-8345-1d69-1933054ffc13.png)

### SQL Serverのデータベースエンジンへ接続
SQL Serverのアイコンをクリックし、<Strong>Add Connection</Strong>を押します
![sqlserver_add connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/2bc62b9a-3af0-93c0-9852-6bb5a79f6a57.png)

<Strong>Add Connection</Strong>をクリックしたあとにサーバー名を記入します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/598139eb-df1e-4650-0d12-67314b4be8e1.png)

オプションでデータベースを選択することができます。今回はEnterを押して飛ばします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/58665b8d-ff5d-c5a0-49ae-f58965657a6a.png)

認証方法を選択します。今回は前提にある通りSQL Server認証で接続するので<strong>SQL Login</strong>を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/ff99cc5a-e7bd-1c2e-531d-f31fec0923f0.png)

ユーザ名とパスワードを入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/d4048a48-833e-6b4b-bc24-998c303840e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/99302c21-ddfe-3be6-5556-f307d9bd91c1.png)

オプションで表示名を変えることができます。今回はDB_TESTにします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/82ae0a2b-4f6b-67fc-e7cd-f2ade83de8e1.png)

無事データベースエンジンへ接続できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/a8c6214f-e8ad-99b6-c8e6-a3713df4f144.png)

### SQL Serverの拡張機能でできること
Microsoftが出している拡張機能なだけあってできることは思ってた以上に使い勝手がいいです
おもな機能をざっとあげるとこんな感じです
- DB内のテーブルの閲覧
- テーブル内のカラムの閲覧
- クエリの実行
- クエリの履歴が左下から簡単に見れる上に再実行できる
- PDF,Excel,Jsonとして保存できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/a4510c34-7595-c1d5-b328-6fb8283c361d.png)

また、SQLの拡張機能も一緒に入れるとクエリが見やすくなるのでデバッグがしやすくておすすめです
(SSMSだと見づらいので好きじゃないです。。)

コマンドパレットからも実行できるので使いやすいです
(shift+ctrl+pを押したあとにsqlと入力してください)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/547b8aca-644f-c104-b61a-684f736cdf45.png)

## まとめ
VSCode内で完結しているのと操作がわかりやすくて便利
ただ、テーブルをフィルターで絞ったりするなどの操作ができないので機能の充実度ではまだまだSSMSのほうが上だと感じました。
クエリを実行したりテーブルの中身を見るぶんには拡張機能のほうが使いやすいので入れておいて損はないかと思います
OCI Computeにログインする時にメール通知を送信する方法

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
誰かがOCI Computeインスタンスにログインしたときに、管理者にメール通知を送信したいという要望があるかもしれません。もちろん、これは可能で、セットアップ方法を紹介したいと思います。OCI電子メール配信サービスを使用している場合、やり方はとても簡単です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e6b76ac3-e881-8a5f-a8d2-64601228c1ac.png", width="550">

__検証環境__

|項目|内容|コメント|
|--|--|--|
|OCIリージョン|東京|他のリージョンにも適用|
|Computeインスタンス|Oracle Linux 8|[<font color=blue>サンプルのシェル・スクリプト</font>](#2-シェルスクリプトの作成)をご参考ください。|
|メール送信用ソフト|mailx|手動でインストール済|

__ステップ__
[1. OCI Email Deliveryのセットアップ](#1-oci-email-deliveryのセットアップ)
[2. シェル・スクリプトの作成](#2-シェルスクリプトの作成)
[3. OCI Computeにログインし、メール通知を確認](#3-oci-computeにログインしメール通知を確認)

# 1. OCI Email Deliveryのセットアップ
もちろん、他のメールサーバーを使用してメールを送信することもできますが、OCIネイティブサービスであるOCI電子メール配信を利用することをお勧めします。

OCI電子メール配信を既にセットアップ済の場合は、次のステップから実行してください。

セットアップをまだ行っていない場合は、私の前回の記事に従ってを設定してください。[OCI電子メール配信サービスの概要](https://qiita.com/liu-wei/items/9878ea57ddde7933813a)

__注意__
上記の記事には、各機能（DKIMとSPF）をカバーしている完全なステップ・バイ・ステップのガイドがあります。もし軽い検証だけをしたい場合は、全てのステップを実施しなくてもよいです。

最小限のステップ: 「OCI Email Deliveryでメールを送信するクイック・スタート」部分の<font color=blue>Step 1, 4, 6, 7</font>


# 2. シェル・スクリプトの作成
SSHログインが検知されたときに、メール送信をトリガーするシェルスクリプトが必要です。簡単なサンプルを作成しましたので、ご参考までにどうぞ。

パスとファイル名: `/etc/ssh/sshrc`
所有者: `root:root`

```bash
[opc@linux8 ~]$ cat /etc/ssh/sshrc
# Name:  /etc/ssh/sshrc
# Purpose: Sending email notification when SSH login is detected.
#
# Please replace variable "Recipient" with the mail address to which you want to send.

Recipient="<mail_address>"
IP_From=`echo $SSH_CONNECTION | cut -d " " -f 1`
Host_Name=`hostname`

logger -t ssh-wrapper $USER login from ${IP_From}

Message="`date`: User $USER just logged in ${Host_Name} from ${IP_From}"

echo $Message >> /home/opc/ssh_login_mail_alert.txt
echo $Message | mailx -s "Notification of SSH Login" $Recipient
[opc@linux8 ~]$
```
# 3. OCI Computeにログインし、メール通知を確認
OCI ComputeインスタンスにSSHログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ed918e66-9651-042f-4e7f-b1443ce33ff6.png)
受信者は以下のメールを受け取りました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a27e646f-51f3-bc5d-c860-46639c13639f.png" width="500">

以上です。

----

__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[OCI電子メール配信サービスの概要](https://qiita.com/liu-wei/items/9878ea57ddde7933813a)
[Autonomous DBでOCIメール配信サービスを使用してメールを送信](https://qiita.com/liu-wei/items/55093572803ab77b2935)
HeidiSQL で「Unable to use key file」と出たときの対処法

# どうしてエラーが出たのか
AWSのpemキーを持っていたが、HeidiSqlからpemキーを利用してsshする方法がわからなかったので（出来ない？）
puttygen( https://www.puttygen.com/ )を利用してppkファイルを作成したが
dbに接続しようとしたところ、タイトルのエラーが発生した。

# 原因
puttygenで作成したppkファイルのバージョンがHeidiSQLで対応していなかった。

# 解決方法
PuTTY 0.75で導入された新しい鍵形式(PPK バージョン 3)でppkファイルが作成されていたため、
バージョン２でppkファイルを作り直した。

# 手順
## ①「Load」ボタンからpemキーを選択
（デフォルトではppkしか選択出来ないので、選択範囲を「ALL Files(*.*)」に変更するとpemキーを選択可能）

## ②作成するバージョンを選択する
puttygen左上のタブより
Key　＞　Parameters for saving key files 
を選択した先にある、バージョンを２に変更して「OK」
![ロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589022/7af9a7ee-2d0f-9e3a-72bd-1ff5b499e438.png)


## ③Key作成
Save private key
を押下で完了
PostgreSQLのLogical Decodingを試す

# 有効化手順

postgresql.confを書き換えて再起動します。

```
wal_level = logical			# minimal, replica, or logical
max_replication_slots = 10	# max number of replication slots
```

AzureのFlexible Serverでも設定可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16609/5c68b7f7-c3d2-4a4b-cff5-e006f32e6242.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16609/063324b0-3dc7-9d8d-7256-4a5986f22a47.png)

Logicalレプリケーション用のスロットを作ります。

```sql
SELECT * FROM pg_create_logical_replication_slot('rep_slot', 'test_decoding');
```

# 使い方

* pg_logical_slot_get_changes 変更情報を取り出す。取ると消える
* pg_logical_slot_peek_changes 変更情報を取り出さずにチェックする。消えない

引数は同じ

1. 読み出し先の論理レプリケーション・スロットの名前
1. 読み出しを終えるポイント(トランザクションログのIDであるLSN、もしくは行数で指定）
1. 出力プラグインのオプションをkeyとvalueで指定

# 動作確認

### 2行INSERTした場合

```sql
INSERT INTO test (id, name) VALUES (7, '7');
INSERT INTO test (id, name) VALUES (8, '8');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16609/bb0fa1a6-db58-b234-ba0c-c632bac36ce0.png)

### 複数行の一括更新の場合

テーブルに6件のレコードが入っている状態でUpdateを行う。

```sql
UPDATE test SET name = '1234'
```

行ごとのデータになった。

```sql
SELECT * FROM pg_logical_slot_get_changes('rep_slot', NULL, NULL);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16609/fd8c878a-efac-0442-016c-f65191693ece.png)

### カラム追加

```sql
ALTER TABLE test ADD COLUMN num bigint;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16609/86fdbdbc-7ddb-0c7c-531a-424ebdad3a1a.png)

### カラム追加。デフォルト値あり

```sql
ALTER TABLE test ADD COLUMN num_default_zero bigint DEFAULT 0 NOT NULL;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16609/877704c5-e034-4582-366a-53606b562956.png)

### 削除した場合

```sql
DELETE FROM test
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16609/17a0a644-78cd-995c-7f42-acb9bb4cf797.png)

便利なような、イレギュラー対応しずらいような…
【Bash】シェルスクリプト終了時に遅延実行（後処理）させる【Bash版 Cleanup, defer や register_shutdown_function のたぐい】

> Bash で<font color=darkorange>**スクリプトの終了時に締め処理を実行させたい**</font>。キャッシュや一時ファイルの削除など。

締め処理を関数に定義して `exit` 直前に実行させればいいのですが、なぜか毎回入れ忘れる沼にハマったので[ポカヨケ](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%AB%E3%83%A8%E3%82%B1)が欲しかったのです。

つまり `OnExit` で `CleanUp` 的なことをさせたいのです。Go 言語でいう `defer`（延期・遅延） や、PHP でいう `register_shutdown_function`（終了時自動実行関数の登録）のようなもの。

たまにしか使わないので、すぐ忘れてしまう。

しかし[「bash シェル 遅延 終了時 実行」でググって](https://www.google.com/search?q=bash+%E3%82%B7%E3%82%A7%E3%83%AB+%E9%81%85%E5%BB%B6+%E7%B5%82%E4%BA%86%E6%99%82+%E5%AE%9F%E8%A1%8C)も `sleep` を使った記事ばかり。意外なことに、なかなかドンピシャに記事がヒットしないというトラップにかったので、自分のググラビリティとして。

## TL;DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

- `trap` を使う
- 発動シグナルに `EXIT` を使う
- `Ctrl+C` や `SIGKILL` などのシグナルにも発動させたい場合は以下の記事を参照。
    - [`trap` コマンドのまとめ](https://qiita.com/ine1127/items/5523b1b674492f14532a#trap-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81) | shellのtrapについて覚え書き @ Qiita

```bash
#!/bin/bash

cleanup() {
    echo "cleaned up!"
}
trap cleanup EXIT

echo "forced error!"
exit 1

# Output:
# forced error!
# cleaned up!
```
- [オンラインで動作をみる](https://paiza.io/projects/m7iZIfLpWlPQCrqBA2dtLA) @ paiza.IO

## 参考文献

- [How "Exit Traps" Can Make Your Bash Scripts Way More Robust And Reliable](http://redsymbol.net/articles/bash-exit-traps/) @ aaron maxwell
- [shellのtrapについて覚え書き](https://qiita.com/ine1127/items/5523b1b674492f14532a) @ Qiita
[Rails]Webフォームからアップロードされたファイルデータについて

# 概要
Webフォームからアップロードされたファイルデータの扱いがよくわかっていないので、
文献を拾ってまとめた。
前提として、「file」というキーで、「PC内の/home/user/xxx.csv」という適当なCSVファイルがアップロードされたものとする。

# 参考
- [ActionDispatch::Http::UploadedFile](https://api.rubyonrails.org/v6.0.2.2/classes/ActionDispatch/Http/UploadedFile.html)

- [Tempfile](https://docs.ruby-lang.org/ja/latest/class/Tempfile.html)
→Fileクラスと同じように扱える。
スクリプト実行が終了したとき削除される。

# まとめ
```
# アップロードファイル情報
uploaded_file = params[:file]
→ActionDispatch::Http::UploadedFile型でアップロードしたファイルの情報が返ってくる。
　以降、uploaded_fileは「ActionDispatch::Http::UploadedFile」のインスタンスになっていることを意識。

# ファイル名
uploaded_file.original_filename
→String型でファイル名(パスを含まず、拡張子を伴うもの)が返ってくる(xxx.csvとか)

# コンテンツタイプ
uploaded_file.content_type
→String型でMIME_TYPEが返ってくる(text/csv とか)

# アップロードされたファイルのTempfileインスタンス
uploaded_file.tempfile
→ファイルをformからアップロードすると、tempfileインスタンスが作られ、リクエストに対するサーバー側での一連の処理終了後に削除される模様。

# Tempfileインスタンスを経由するショートカットメソッド群
## 一時ファイルのサイズ
uploaded_file.size
→Integer型でファイルサイズ(バイト単位)が返ってくる

## 一時ファイル本体の読み込み
uploaded_file.read
→String型で読み込んだ全行分の文字列が返ってくる

## 一時ファイルのパス
uploaded_file.path
→String型でパスが返ってくる
```

# アップロードしたファイルの保存
リクエストに対するサーバー側での一連の処理が終わり一時ファイルが削除される前に、
独自に保存処理を書いてやらなければならない。

```
# アップロードファイル情報を取得
uploaded_file = params[:file]

# アップロードファイル(一時ファイル)パス
uploaded_temp_file_path = uploaded_file.path

# アップロードファイル(元ファイル)名
uploaded_file_original_file_name = uploaded_file.original_filename

# アップロードファイル(一時ファイル)を全行分読み込んだもの
uploaded_file_content = uploaded_file.read

# 保存先ディレクトリパス
save_dir_path = Pathname("/aaa/")

# 保存先ディレクトリを作成
run_cmd("mkdir -p #{save_dir_path}")

# 保存先ファイルパス
save_file_path = save_dir_path.join(uploaded_file_original_file_name)

# ファイルを保存(〜へ〜を書き込むという引数順序)
File.binwrite(save_file_path, uploaded_file_content)
```
React.jsコンポーネントを使用する7つの理由

React.jsは、プロジェクトをより早く、より簡単に作成することができます。2013年にFacebookによって設計されたReact.jsは、モバイルアプリやシンプルなWebページを構築することができます。しかし、そのシンプルさに惑わされてはいけません。このライブラリには、デザインプロセスを高速化する強力なオプションがたくさんあります。用意されているコンポーネントを使えば、新しい情報やデータの収集に応じて瞬時に更新されるアプリを作ることができます。
以下では、Reactコンポーネントの魅力7選をご紹介します。

#  1. ページの再読み込みなしに瞬時に更新
Reactの最大の利点は、ページ全体をリロードすることなく、Webページやアプリの[個々の要素を更新](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction)できることでしょう。Facebookでは、人々が「いいね！」をクリックしたり、コメントを書き込んだりすると、すぐに表示されるという動作を見ることができます。過剰なローディングは必要なく、この機能により、情報が入ってきたときに更新することが可能になります。
# 2. JSXの中で条件文を使う
JSXとは、React.jsのコンポーネントをより効率的にするためのJavascriptの拡張機能です。これを使うと、マークアップとロジックの両方を1つのファイルにまとめることができ、複数のファイルで作業する必要がなくなります。JSXを使えば、デザインやアプリの機能を向上させるための条件文を簡単に作成することができます。実際、HTMLとJSXをブレンドすることで、思い通りの結果を得ることができるのです。

また、JSXはJavascriptよりもはるかに高速なので、プロジェクトをより早く終わらせることができます。独自のテンプレートを作るのはとても簡単だと感じるでしょう。
# 3. 同じコンポーネントを再利用できる
モバイルアプリを設計する際、同じアセットを使用することができます。Reactはもともとコードのコンポーネントを再利用しないため、多くの時間が無駄になっていました。しかし、そのオプションが利用できるようになり、同じコードやアセットを使用してからニーズに合わせて調整することで、さらにスピードアップすることができます。
# 4. 1つのコンポーネントだけをアップデートする
React.js のコンポーネントはすべて個別に動作するので、アプリのある部分を変更しても、すべてを更新する必要はありません。つまり、アプリの各エリアで同じコンポーネントを使用し、個々のパーツを変更することができるのです。アップデートの回数が減るので、プロセス全体がはるかに効率的になります。 

エラーが発生したり、アプリを更新する必要がある場合も、簡単に行うことができます。多くのアプリやプログラムでは、コードが複雑なためにアップデートが困難です。ある部分を簡単に変更しただけで、アプリ全体に問題が発生してしまうこともあります。しかし、React.jsのコンポーネントを使えば、安心して好きな場所を素早く調整することができます。
# 5. コードがきれいで安定している
他の多くの選択肢とは対照的に、React.jsは安定したコードを提供します。これは、下向きのデータフローを使用することで実現しています。これは、子構造の変化から親構造を守るためのコードです。

これまで、不安定なコードや不具合、長くかかる保守作業に悩まされてきた人は、React.jsを気に入るはずです。そのコンポーネントだけに集中して不具合を修正できるので、より多くの時間を節約できます。
# 6. React.jsは学ぶのが簡単
React.jsのコンポーネントはとてもユーザーフレンドリーなので、誰でも使いこなせるようになります。Reactの最大のメリットの1つは、[Javascript](https://code.visualstudio.com/docs/nodejs/reactjs-tutorial)を知っていればReactの使い方がわかるということです。また、Javascriptがわからなくても、コンポーネントを学ぶことに問題はないでしょう。コンポーネントは非常によくセットアップされ、設計されているので、理解するのに時間はかかりません。コードも非常に焦点が絞られているので、多くのことをするためには少しだけ学べばいいのです。
# 7. React.jsの背後にいる、非常に頑丈なエンジニアリングチームの存在
もともとはFacebookが社内で使用するために設計されたものでしたが、React.jsライブラリは現在、誰もが利用できるようになっています。しかし、その設計を支えているエンジニアリングチームは、今でも大きな存在です。その中には、FacebookやInstagramのチームや、その分野に精通した外部の開発者も含まれています。
自分のアプリにReact.jsのコンポーネントを使うときは、専門家の手に委ねることになります。また、世界最大のアプリのいくつかがReactを使用していることを覚えておくと、Facebookが今後何年もReactをサポートする可能性が高くなります。Netflix、Paypal、Dropbox、Khan Academy、Lyft、Reddit、Coursera、BBCなどは、React.jsコンポーネントで構築されている数多くのサイトのほんの一例です。React.jsの人気が高まるにつれ、Fortune 500企業のサイトでもReact.jsのフレームワークを目にするようになるでしょう。

世界中で重要視されているReact.jsは、今後も改良を重ね、既存の要素を強化していくことが期待できます。React.jsを使えば、完璧なユーザーインターフェースをより簡単に作ることができ、製品やサイト、アプリをこれまで以上に早く市場に投入することができます。

__[UXPin](https://www.uxpin.com/jp/merge) は、世界中の製品チームがアイデアをより早く製品にするためのデザインプロセスツールです。__
__UXPinの革新的なテクノロジーである[Merge](https://uxpin-jp.notion.site/UXPin-Merge-7153e34032f548929321dbbd2878ac56)により、DesignOpsの課題を簡単に解決することができます。UXPin Mergeでは、Reactコンポーネントを使ってデザインし、最終製品と完全な一貫性を持ったプロトタイプを実現することができます。__
__さあ、今すぐ[無料トライアル](https://www.uxpin.com/jp/sign-up)を！__
![スクリーンショット 2022-04-12 11.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037046/1d0d129d-4194-7dae-5c5d-966870c4441f.png)
C# 非同期メソッドをテスト用にmock化したい

## 目的
非同期メソッドをテスト用にmock化したい

## こうやって見た
Task を作る部分をmock化するとやりやすい
Task.FromResult で作ったものを async なメソッドでつかってやればよい

```C#
using System;
using System.Threading.Tasks;

public class Hello
{
    public static void Main()
    {
        var test = new TestClass();
        Console.WriteLine(test.GetInt().Result);
    }
}

public abstract class AbClass
{
    public abstract Task<int> MakeTask();

    public async Task<int> GetInt()
    {
        return await MakeTask().ConfigureAwait(false);
    }
}

public class TestClass : AbClass
{
    public override Task<int> MakeTask()
    {
        return Task.FromResult(100);
    }
}
```
Pythonでファイル名一覧を取得

#### 任意のフォルダ内のファイル名とフォルダ名を全取得
sudoフォルダ内のファイル名とフォルダ名を取得したいときは，
```python:
import os
file_names = os.listdir('sudo/')
```
でlistで返ってくる．

#### 任意のフォルダ内の任意の拡張子のついたファイル名を全取得
フォルダを含めたくない時，あるいは拡張子を指定したい場合は，

```python:
import glob
file_paths = glob.glob('sudo/*.wav')
```
で欲しい拡張子のついているもののみをlistで取得できる．こちらはファイル名だけでなく相対パスも含まれることに注意．

相対パスが要らないのであれば，

```python:
file_names = []
for file in file_paths:
    tmp = os.path.split(file)[1]
    file_names.append(tmp)
```
で除去できる．
プログラミングスクール進捗

2月中旬からプログラミングスクールを始めて現在の進捗をお話します。
# コピーアプリでも難しいものはある。
スクールのカリキュラム（テキスト）にコピーアプリの作り方が書いてあり、それはそのままコードを書いていけば良いのですが、追加機能のものはテキストの課題として下のほうに問題が載っています。その課題をやるうえで、自分で考えないといけないのですが、テキストの内容を流しているだけでは、理解できません。
# 意味や仕組みを理解すれば分かってくる。
課題の中のファイル階層やコードの書き方の意味が分かれば、コードのファイルの作り場所などが分かってきます。が、自分で考えてもわからないことはあります。
# 結局はメンターの人に聞く。
分からないところをいつまでも悩んでても仕方ないので、最終的にメンターの人に聞いています。わからないところをその都度聞くのも良くないかもしれませんが。
# で、進捗は？
メイン部分は終わり、機能追加が8割くらい終わった感じです。
今は、メンターの人の宿題をこなしているところですが、キーワードが難しく時間がかかっています。

進捗は以上です。
PHP　関数の引数にデフォルトの値を設定

## 用途
- functionの引数にデフォルト値を設定したいときに使う。
- 関数内で変数を宣言することが省ける場合がある。

## 使用方法
```php:書き方
function 関数名 ( 引数 = 設定したいデフォルト値 ) {
  // 関数が呼ばれた時の処理を書く
}
```
関数の引数に `=` をつけてデフォルト値を設定する。

```php:例
function hoge ($hoge1 = 1, $hoge2 = 2) {
  $add = $hoge1 + $hoge2;
  var_dump($add);
}

hoge();
// 引数を指定しないで呼び出した結果
// 3  (1+2が行われた)

hoge(2, 3); 
// 引数に 2 と 3 を指定して呼び出した結果
// 5  (2+3が行われた)
```
※関数を呼び出すときに引数を指定すると、デフォルト値ではなく呼び出し時に指定した値が使われる。
　

**デフォルト値を設定した引数と、指定していない引数を混合で使うこともできる**
```php:例
function 関数名 ( 引数, 引数 = デフォルト値 ) {
  // 関数が呼ばれた時の処理を書く
}
```
Excelで勝手に色がつく

例えば色付きのセルの下行に文字を入力すると、勝手に上の行の色がつく。

これが便利な人なんか居るの？と些か疑問。

[ファイル] > [オプション] > [詳細設定] > [データ範囲の形式および数式を拡張する] のチェックをOff!!

まぁ～ったく余計なお世話だよホント。
医療機器データでpythonの特徴量選択　分散とベルヌーイ分布について


https://qiita.com/FukuharaYohei/items/db88a8f4c4310afb5a0d

@FukuharaYohei様が作成された上記記事のFilter Methodについて自分なりに調べてみました

# Filter Method
Filter Methodは統計的な手法(分散やχ二乗検定など)で特徴量の評価・選択
他の手法に比べると計算量が少なく、最初に足切りで実施するものとのことです

# 機械学習では説明変数（特徴量）の選択が重要
機械学習（教師あり学習）を使用する際に
目的変数　と　説明変数（特徴量）　が重要となります

私が、医療機器管理データベースを利用して医療データ予測のソースコードを研究用に作成している最中に
説明変数（特徴量）がのデータ数が莫大になり　
予測に多くの時間がかかり、データ数が多く予想できないとエラーコードが出てしまったため

説明変数（特徴量）を削除しなければいけない状態となりました
そこで@FukuharaYohei様の記事に出会い助けられたため内容を共有します

# 低分散変数の削除
分散が低ければ、説明変数（特徴量）としての意味ないと考え特徴から削除する方法です
VarianceThreshold関数を使います
今回の例では分散0としており、まったく変動していない特徴を対象とします

分散(variance)の意味
https://ai-trend.jp/basic-study/basic/variance/

統計学において、分散とは数値データのばらつき具合を表すための指標

私が実施したデータでは分散が0の場合
ほとんど特徴量削減ができませんでした

そこで記事でもあったベルヌーイ分布の分散を使いました

# ベルヌーイ分布とは
https://ai-trend.jp/basic-study/bernoulli-distribution/bernoulli-distribution/

ベルヌーイ分布とは、「成功か失敗か」「表か裏か」「勝ちか負けか」のように２種類のみの結果しか得られないような実験、試行（ベルヌーイ試行）の結果を0と1で表した分布を指します

1である確率がpであるとき0である確率は1-pとなる、非常にシンプルな確率分布です

今回はこのベルヌーイ分布の分散であるp(1 − p)を利用しました


以下のソースコードで
ベルヌーイ分布を利用しpandas.DataFrameデータから特徴量を削減します

```
#医療機器関連　dataframe から 日付（day）データを消して　ベルヌーイ分布の分散期待値を使い　特徴量を削減
import pandas as pd 
from sklearn.feature_selection import VarianceThreshold

X = df.drop("day", axis=1)

# デフォルトはしきい値が0、変えたければthresholdに値を渡す
# sel = VarianceThreshold(threshold=(.8 * (1 - .8))) #ベルヌーイ分布の分散期待値を使った例
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
sel.fit_transform(X)

X_new = pd.DataFrame(sel.fit_transform(X), columns=X.columns.values[sel.get_support()])
print('Before Feature Selection:', X.shape)
print('After Feature Selection:', X_new.shape)

result = pd.DataFrame(sel.get_support(), index=X.columns.values, columns=['False: dropped'])
result['variance'] = sel.variances_
print(result)
```

# 分散閾値 VarianceThreshold について

分散は正式には　「各データと平均値との差の2乗の平均」です
分散は英語でVariance　分散閾値は英語でVarianceThreshold

VarianceThresholdの公式ドキュメントは以下となります
https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.VarianceThreshold.html

公式ドキュメントではVarianceThresholdについて

Feature selector that removes all low-variance features.
低バランスの特徴をすべて取り除く特徴セレクタ

This feature selection algorithm looks only at the features (X), not the desired outputs (y), and can thus be used for unsupervised learning.
この特徴選択アルゴリズムは、望ましい出力（y）ではなく、特徴（X）のみを見るので、教師なし学習に用いることができる

としています
(threshold=(.8 * (1 - .8)))の部分はthreshold　閾値が
.8 * (1 - .8)=0.16としているという意味です


分散閾値　VarianceThreshold　の設定はどのような特徴量を利用したいかで
特徴量を選定できる便利な手法であることがわかります

今回の事例では私が医療機器データをどのように前処理したかにより結果は変わりますが

https://www.nikkei-r.co.jp/glossary/id=1657

のサイトでも記載されているように

分散が0になるということは

極端な事例　30歳以上の日本人を対象とした調査で「あなたは成人ですか」と質問したら、全員が「ハイ」と回答し、分散0となった　ここに情報はない

となってしまいます

今回私が使用した医療機器データに直すと

医療機器データの特徴量として「その日医療機器関連で何があった？」と質問したら、「何もない」とほぼ毎日回答し、
分散がほぼ0となった

となってしまいます

このようなデータを機械学習の特徴量にするには　意味を持たない情報の可能性が高いので
分散が小さいものを　ベルヌーイ分布の分散　を利用し選定したということとなります


# まとめ
機械学習（教師あり学習）を使用する際に
目的変数　と　説明変数（特徴量）　が重要となります

今回　医療機器データベースのAI解析で　特徴量を減らす必要がありました
そこで　分散閾値　VarianceThreshold　の設定　ドキュメントを利用しました

医療機器データの特徴量として「その日医療機器関連で何があった？」と質問したら、「何もない」とほぼ毎日回答し、
分散がほぼ0となった　情報がかなり乏しい　特徴量を削減することに成功しました

次回の記事では医療データにおける機械学習の実装部分を記載したいと思います！
railsサーバー起動時のnokogiriエラーの解決策


# 概要
`rails s`起動時にnokogiriのライブラリのエラーとなりました。
その解決策の備忘です。

# 確認環境
M1 Mac上でdocker起動


# エラー内容
```
/usr/local/bundle/gems/bootsnap-1.11.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:15:in `require’: cannot load such file -- nokogiri/nokogiri (LoadError)
```

# 解決策
bundle installする前に以下コマンドを実行
`bundle config set force_ruby_platform true`

# おわり
M1 Macが原因と思われた（根拠なし)。
`bundle install`時のログがこんな感じだったのが気になったので試してみたらうまくいきました！
```
Using nokogiri 1.13.3 (aarch64-linux)
```

# 参考
https://stackoverflow.com/questions/69807153/macos-m1-arm64-unable-to-load-nokogiri-using-system-default-ruby
jQuery　functionが効かない　jsで後から追加した要素

## 用途
- jsで後から追加した要素にfunctionを効かせたい時に使う。
- ページの読み込みが終わった後に作られた要素に対して、functionを効かせたいときに使う。
- jsでfunctionが効かない時に試してみる。

## 使用方法
```js:効く書き方
$(.hoge1).on("click", ".hoge2", function(){
  // クリックした際の処理を書く
});
```
hoge1クラスがhoge2クラスの親要素。
hoge2クラスはページ読み込み後にjsで追加された要素。

**このコードが効く理由**
親要素である「hoge1クラス」はページ読み込みの際には存在していて、後から追加した「hoge2」クラスも「hoge1クラス」に `on` をしたことに含まれているから、このような形で効くようになる。
　

```js:効かない書き方
$(.hoge2).on("click", function(){
  // クリックした際の処理を書く
});
```
**上記のコードが効かなかった理由**
ページ読み込みの際には「hoge2クラス」は存在しておらず、その要素に対して `on` をしていたから。
※一般的なhtmlに対しては効く。jsで後から追加した要素には効かない。
　
　
　
下記のサイトを参考に執筆しました。
- https://webcreatetips.com/coding/1683/
HTTP経由で任意のコマンドを実行する

```bash
echo GET / H | nc -l 8080 && systemctl poweroff -i
```

http://localhost:8080/ にアクセスするとシャットダウンできます。ポートフォワーディングすれば外出先からシャットダウンできます

```bash
curl localhost:8080
```

```javascript
fetch('http://localhost:8080/')

// 動画が終了したらシャットダウン
document.querySelector('video[src]').addEventListener('ended', () => fetch('http://localhost:8080'))
```

### Firefoxを開く
```bash
echo GET / H | nc -l 8080 && firefox
```

### 参考
http://blog.livedoor.jp/sonots/archives/34703829.html
立方根をArrayFireで

ArrayFireと言う行列計算を高速化するライブラリがあります。
ArrayFireの開発元であるArrayFireと言う会社はDARPAから資金を調達しています。

今日はGoogleのColabで簡単にできるコードをご紹介します。
ランダムに2x2の行列をArrayFireの立方根の関数に入れます。
まだまだ僕はArrayFireは初心者ですが、頑張って行きたいと思っています。

加藤翼
株式会社インスパイアサーチ
CEO・サーチエンジニア

```Python3
!pip install arrayfire==3.8.0+cu112 -f https://repo.arrayfire.com/python/wheels/3.8.0/
import arrayfire as af
af.set_backend('cuda') 
x = 0
while (x <= 100):
  print(af.cbrt(af.randu(2,2)))
  x = x + 1
```
ローカルで実行する際ですが、
```bash
LD_PRELOAD=/home/tsubasa/arrayfire/lib64/libafcuda.so python3 arrayfire-test.py
```
のように、LD_PRELOADの指定をするとローカルで上手く動きます。
出力：
```
arrayfire.Array()
Type: float

[2 2 1 1]
    0.7732     0.5434 
    0.6455     0.9065 


arrayfire.Array()
Type: float

[2 2 1 1]
    0.7622     0.5552 
    0.6934     0.7520 


arrayfire.Array()
Type: float

[2 2 1 1]
    0.8781     0.9823 
    0.9209     0.8469 


arrayfire.Array()
Type: float

[2 2 1 1]
    0.0760     0.9735 
    0.8136     0.7804 
...
```
また、エラー（RuntimeError: Can not change backend to cuda after loading cuda）が出る場合、
https://github.com/arrayfire/arrayfire-python/wikiを参考にして、
```
export LD_LIBRARY_PATH=/path/to/arrayfire/lib64:$LD_LIBRARY_PATH
```
```
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/cuda/lib64:/path/to/cuda/nvvm/lib64
```
を設定してください。

```
ERROR: GLFW wasn't able to initalize
```
が出る場合は気にしなくても良いみたいです。
https://github.com/JuliaGPU/ArrayFire.jl/issues/41

多分GLFW付きでArrayFireをコンパイルしていない時に出るようなので、
```
export AF_DISABLE_GRAPHICS=1
```
で消えるそうです。
Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)' instead.という警告

railsコマンドを実行するたびに下記の警告文が出てきます。

```
# rails db:migrate
Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)' instead.
```



ここではこの警告を出なくさせる方法を書いていきます。

参考：https://github.com/rubygems/rubygems/issues/5234


# 解決策
どうやらbundlerのversionを変えると出てこなくなるみたいです。

参考記事によると
Also, just to make sure there's an easy way out of this posted here, running

```bundle _2.3.3_ update --bundler```

と書いてあるので、今のversionを確認してupdateしてみます。

```
# bundle -v
Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)' instead.
Bundler version 2.2.15
```
```
# bundle _2.3.3_ update --bundler
```

# 結果
無事に警告が表示されなくなりました！
AWS EC2内のアプリをVSCode のremote ssh接続するまで

初めての投稿です！！
AWS: EC2
rails 6.0
VSCode

趣味でrailsアプリを開発しています。
Dockerを導入し、AWSへのデプロイを目指していますが、EC２内に置いたアプリケーション（local１ではない）をVSCodeで触れないかと考え備忘録として残します。

１　拡張機能の導入
![645ea5bf97cb4b202c7defa28740c64f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/c5bb7c4a-d578-27da-a1cc-d331d3dd1fbc.png)
　Remote-sshという拡張機能を有効にします。

２　configの編集
![1487bf5303579f09f99754e539836bd7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/efb25f62-bec2-1380-82b5-5a8ff16cc9f9.png)
左下のこのマークをクリックし、![5f32ea739e3bf5859726825961feee46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/076869dc-654f-76ff-5e61-2462b7933f04.png)


Remote-SSH：　Open SSH Configration Fileを選択し、一番上に表示される/Users/登録名/.ssh/configを選択します。
```merkdown:config
Host remotessh
    HostName <IPアドレス>
    User ec2-user
    Port 22
    IdentityFile ~/Desktop/○○.pem（pemファイルがあるパスを指定します。） 
```
その後また左下のマークをクリックし
![1487bf5303579f09f99754e539836bd7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/cf4cce9f-199b-1d7e-1d32-cef6054af8e0.png)
![2f5e4979a66ad96e9a1548e64ab7e950.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/297a53ea-94f4-90db-6fb9-a4c4ed8393b6.png)
Remote-SSH：　Connect to Hostを選び、remotesshを選択。
![9e6b760cef6f73232c83b06989b4accd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/cf81fdb6-171e-df4c-5068-4e02260de4fd.png)
フォルダを開く画面から自分のEC2からアプリへのパスを入力します。
![f1699de9dbc9858ee8c2f137bebbdb46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/41583047-0d4e-3358-3bd9-9dc698af9c67.png)

するとできました！！![7d2ce3235a6ba68f022873520ee58c22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1431393/51526261-49cc-200e-45bf-7086e5eb6abd.png)
サービスカタログ作成

## サービスカタログ
ServiceNowにてサービスカタログは、組織の各部署が提供するサービスや製品を注文するときに使用します。具体的には、メールアドレスの発行などのサービスやPCなどのハードウェアの注文を行う事ができます。

### サービスカタログのコンポーネント
サービスカタログの主要コンポーネントとしては以下のようなものがあります。
- カタログアイテム
- 変数・変数セット
- レコードプロデューサー
- 注文ガイド
- フロー


### サービスカタログの処理フロー
1. 一般ユーザーが管理者に問い合わせを作成する。
2. 担当者に自動的に業務が割り振られる。
3. 担当者から上長に処理内容がエスカレーションされる。
4. 上長が処理内容を確認して承認を行う。
5. 処理が完了するので、それを一般ユーザーに通知を行う。

今回は問い合わせの一般的な実装について記述します。

### 技術スタック

1.Catalog Item
2.Workflow Editor
3.Service Portal

### 技術スタックについて
#### Catalog Itemについて
ServiceNowプラットフォームの[sc_cat_item]テーブルに定義されているレコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/4cd4a94e-a5f6-2fc1-630d-df78b4a451f6.png)

上記のレコードが表しているものは、以下サービルポータル画像にある、
数量指定や注文と言ったひとつの要求画面である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/122b170b-0c52-c345-1e2b-8d537770f56e.png)

なので上画面でいえば、一番目のレコードの[3M Privacy Filter - Lenovo X1 Carbon]というレコードの内容が、下画面の画像と説明文と数量指定と注文にあたる。これは商品の発注画面と発注を受けての担当者の管理画面での処理内容についてをまとめたものになっている。

上記レコードを開くと、
入力されたフォーム内容があって、そこの値をリッチにサービスポータルで出力している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/5200cf7f-aece-6b94-8cda-6729c2ab0516.png)

### Workflow
上記は注文入力フォームなので注文すると裏で
・リクエストレコード[sc_request]
・リクエストアイテムレコード[sc_req_item]
・タスクレコード[sc_task]
・承認レコード[sysapproval_approver]
が作成される。タスクレコードと承認レコードに関しては、各業務担当者が自動で割り当てられる。こうした入力フォームごとに自動的に処理内容が規定されているが、それをUIリッチに記述しているのがWorkflowであり、Workflow Editorです。

要求番号には以下のように階層構造で「要求アイテム番号」と「カタログタスク番号」が関連付けられます。
- 要求番号：REQ
- --要求アイテム番号：RITM
- ----カタログタスク番号：SCTASK

上記レコードの以下の部分、[Procurement Process Flow - Hardware]として設定されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/8832e56b-e388-5372-4355-41d04c207390.png)

Workflow Editorを実際に見てみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/ad7681b7-d629-0f0d-b3ff-432511a32813.png)

beginを始点として、いくつかのブロックを経てEndで終わる一連の処理となっている。
以下画面のStageのリスト内容がWorkflow上でのカタログタスクに当たる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/617ec2e2-7d99-45df-d35d-b8c5a778ffba.png)

上記画像で言うところの、Fullfillment,Awaiting Derivery,Configuration,Completed,Request Approvedといった処理が存在し、それら全てをこなしたら商品の発注処理が完了した、という状態になる。

### 承認処理と通知処理に関して、
今回の例では出てこなかったが、Workflowにおける、
・Approval
・Notification
といったイベントを作成することで、処理内容を上長承認させたり、処理の状況を問い合わせしたユーザーに通知をすることが可能である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/ddf104b8-8d4e-ac03-d6cf-ce9a29ce51ef.png)

### 最後に
私の書いた記述よりも100倍わかりやすく解説した記事が以下になります。ご参考ください。
[【ServiceNow】CSA対策　〜サービスカタログ〜
](https://mekeblog.com/servicenow-csa-service-catalog/)
C言語学び直しメモ　随時更新

#
物理アドレス０番地にはリセットベクタでブートローダが入っている（ことが多い）
仮想アドレス０番地にはNULLが入っている


#
```c
#include <stdio.h>

int sum(int array[]);

int main(void){
    int vector[5];
    printf("len=%zu\n",sizeof(vector)/sizeof(int));
    sum(vector);
}


int sum(int array[]){
    printf("len=%zu\n",sizeof(array)/sizeof(int));
    return 0;
}
```
とすると以下のようになる。
```
len=5
len=2
```
配列を宣言したスコープ内では確保したサイズから要素数を取得できるが、引数として渡すと確保したサイズが取得できないため要素数を取得できない。
つまり配列を引数として渡すことはできない（ポインタ扱いになる）
ここによるとhttps://www.jpcert.or.jp/sc-rules/c-arr01-c.html
>配列型又は関数型を持つと宣言された仮引数に適用する場合、sizeof 演算子は、型調整された（ポインタ）型の大きさを与える。
[Python3 / pynamodb] create_table時に Table read and write throughput must be at least 1, and cannot be null

# 発生したエラー

> E           pynamodb.exceptions.TableError: Failed to create table: An error occurred (ValidationException) on request (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) on table (some_data) when calling the CreateTable operation: Table read and write throughput must be at least 1, and cannot be null
>
>.venv/lib/python3.8/site-packages/pynamodb/connection/base.py:651: TableError

`Table read and write throughput must be at least 1, and cannot be null`がエラーの原因っぽいことはすぐにわかった。
けれど、`Table read and write throughput`をどうやって設定するのかが一見してわからない。

この対処法を本記事に記載する。

# 環境


# ソースコード

```python:ダメなやつ
from pynamodb.models import Model


class SomeModel(Model):
    class Meta:
        table_name = "some_data"
        region = "us-east-1"

    some_id: UnicodeAttribute = UnicodeAttribute(hash_key=True)
    user_id: UnicodeAttribute = UnicodeAttribute()


def create_some_table():
    model = SomeModel
    model_meta_class = getattr(SomeModel, "Meta")
    setattr(model_meta_class, "host", "http://localhost:8000")
    setattr(model_meta_class, "region", "ap-northeast-1")
    setattr(model_meta_class, "table_name", "some_data")
    setattr(model_meta_class, "aws_access_key_id", "dummy")
    setattr(model_meta_class, "aws_secret_access_key", "dummy")

    model.create_table(wait=True)


create_some_table()
```

このソースコードのままcreate_some_tableを実行すると、以下のようなエラーが出る


> E           pynamodb.exceptions.TableError: Failed to create table: An error occurred (ValidationException) on request (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) on table (some_data) when calling the CreateTable operation: Table read and write throughput must be at least 1, and cannot be null
>
>.venv/lib/python3.8/site-packages/pynamodb/connection/base.py:651: TableError

# 対処法

以下のように、`setattr(model_meta_class, "billing_mode", "PAY_PER_REQUEST")`を追加したら直った。

```python:対処後
from pynamodb.models import Model


class SomeModel(Model):
    class Meta:
        table_name = "some_data"
        region = "us-east-1"

    some_id: UnicodeAttribute = UnicodeAttribute(hash_key=True)
    user_id: UnicodeAttribute = UnicodeAttribute()


def create_some_table():
    model = SomeModel
    model_meta_class = getattr(SomeModel, "Meta")
    setattr(model_meta_class, "host", "http://localhost:8000")
    setattr(model_meta_class, "billing_mode", "PAY_PER_REQUEST")  # <- 追加
    setattr(model_meta_class, "region", "ap-northeast-1")
    setattr(model_meta_class, "table_name", "some_data")
    setattr(model_meta_class, "aws_access_key_id", "dummy")
    setattr(model_meta_class, "aws_secret_access_key", "dummy")

    model.create_table(wait=True)


create_some_table()
```

これでOK。

`Table read and write throughput`というのは、`billing_mode`で指定できるものだったようだ。

なら、そう書いて欲しいぽよ...

# 参考資料

https://tech.jxpress.net/entry/testable-pynamodb-model
変数は「箱」では無くて、数学における変数Xとして扱う

私としてはこちらの記事が良かったので紹介します。

また、古い記事なのですが、埋もれてしまうのが勿体無いというのも理由です。

https://atmarkit.itmedia.co.jp/ait/spv/0211/29/news004.html

なお、Java は知らなくても読めます
オブジェクト指向における継承は、メモリを意識すると良いかも


クラスclassはメモリの観点から把握すれば、「継承」や（オブジェクト指向で出現する）「静的領域」なども理解しやすいかと思っています。
ということで、書かれた記事が良かったので紹介します。


下記URLの「クラスを継承すると何が起きるのか」以下が該当箇所です
https://atmarkit.itmedia.co.jp/ait/spv/0303/08/news002.html