OmniAICreator/Qiita-1.07M huggingface dataset:
iOS AutoLayoutに甘んじた結果の失敗談

昔と違い、近年ではiPhoneの画面サイズも多様かされていて、Android開発同様にAutoLayoutでデザインするのが常識のとなっています
そんな中、AutoLayoutに任せっきりのマインドからきた「おやっ？」と思った失敗談です

※時系列として、iPhone 13が出る前の話です

## 前提
- XCode 12.0
- 画面のレイアウト（制約含む）はStoryboardを使って定義している  
一部、データ条件に応じた、表示/非表示、画像の切り替えはコード側で制御
- iPhoneだけをターゲットにした開発

## 発生した問題
iPhone 12 Pro Maxの時だけ、TabBarの表示領域が意図した通りに確保されていなかった
これにより、操作はできるものの見栄えが極めて悪い状態となってしまった

よく見たら、Storyboard上でアイコンが■で表示されているではないか。。
（この時点で、開発者の意図した状態ではなかった）

制約の設定内容

- Tab BarはView上で下付き  
Tab Bar自体には高さの制約は設定しない
- UIViewはTab Barにびったりくっつける  
VerticalがBottom Space to: Tab Bar
- VIEW上で、制約のPriorityは全て同じ


### iPhone 12 Pro Max（想定外）
UIViewがTab Barに被っている？ように表示される
![iphone12promax-459x1024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521484/8aff0d34-fb82-3a32-a623-7424006b3db7.png)


### Other（期待通り）
期待した通り、表示される
（Tab Bar内のアイコンに対して、領域が確保されている）
![other.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521484/6e259313-4379-9750-062c-2071d0115377.png)

# 原因

①
StoryboardでBar ItemのImageを正しく設定できていなかった？ことにより、TabBar内のItemのコンテントのサイズが正しく伝播できなかった模様
※ただし、実機や、シミュレータで対象の画面を表示した場合には、意図した画像は表示されている

Tab Bar ItemのImage（Selected Imageにも）の箇所に意図した画像が表示されていなく、"画像不明"として表示されている
青色のヤシの木みたいになっているのが、Storyboard上で画像を認識できていないことを指している
![detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521484/72a3b568-c118-68aa-96fc-6d3ab8715a7f.png)

設定されていた画像自体は、プロジェクト内に存在していたが、拡張子は指定していなかった

最初からこうなのか、途中からこうなったのかは記憶が定かではないが、ダークモードの画像を整理している時に、漏れた気がする
で、適当な実機、適当に選んだシミュレータで問題なかったので、気づくのに遅れた（実機はiPhone 11、シミュレータはiPhone SE（第二世代）で主に確認していた）

# 対応
Storyboard上のTab Bar ItemのImage（Selected Imageにも）に、表示したい画像が認識されるように指定
※前述の"画像不明"になってしまっていた箇所を画像を認識できるように指定

# 余談
原因が分かった後に、気になり、コードをおかしかったバージョンに戻してStoryboardでがちゃがちゃレイアウト確認のiPhoneを切り替えていたら、いつのまにか、期待した通りに表示されるようになっていました
（切り替えると、Storyboardのxmlが変わるので、それがスイートスポットにはまった？）

iPhoneぐらいのパターンなら、全パターン確認した方が良かったなと後悔。。
しかも、iPhone 12 Pro Maxとなると当時の最上位機種ですからね、それをカバーできていなかったと思うと残念でならなないです
正規表現(^, \A, \z \Z, $)の違い

Ruby を使って 正規表現の違いを説明します。

`\A`, `^`, `\Z`, `\z`, `$` は微妙に異なります。

## `\A`

文字列の始まり

### Sample

```ruby
"abc \n def \n ghi \n".gsub(/\A.*$/, '')
# => "\n def \n ghi \n" 
```

文字列の最初から行末までマッチしました。

## `^`

行の始まり

### Sample

```ruby
"abc \n def \n ghi \n".gsub(/^.*$/, '')
# => "\n\n\n"

"abc \n def \n ghi \n".gsub(/^ .*$/, '')
# => "abc \n\n\n"
```

行頭から行末まで、改行を除いてマッチしました。

## `\Z`

文字列の終わり。 改行を含まない。

### Sample

```ruby
"abc \n def \n ghi \n".gsub(/.*\Z/, '')
# => "abc \n def \n\n" 
```

改行を除いた最後の行にマッチしました。

## `\z`

文字列の終わり。

### Sample

```ruby
"abc \n def \n ghi \n".gsub(/.*\z/, '')
# => "abc \n def \n ghi \n" 
```

改行を含む最後の行にマッチしました。

## `$`

行の終わり。

### Sample

```ruby
"abc \n def \n ghi \n".gsub(/.*$/, '')
# => "\n\n\n" 

"abc \n def \n ghi \n".gsub(/ .*$/, '')
# => "abc\n\n\n"
```

改行を除く行末にマッチしました。


## 使用した環境

* Ruby 2.7.1

## 関連

* [Anchors in Regular Expressions](https://docs.microsoft.com/en-us/dotnet/standard/base-types/anchors-in-regular-expressions)
systemd-analyze calendarでスケジュールを確認する

systemdでcronのようなスケジュールを設定する場合timerユニットを書きますが、これがcronの書式とは全然違うのでなかなか慣れないかと思います。

## timerユニットの書き方（OnCalendarの場合）

たとえばこんな感じですね。

```text:foo.timer
[Unit]
Description=Run foo weekly

[Timer]
OnCalendar=Sat *-*-1..7 18:00:00
Persistent=true     
 
[Install]
WantedBy=timers.target
```

この`OnCalendar`のところの書式がcronとは違います。

```
# 毎週（月曜日の0時）実行
OnCalendar=weekly

# 毎月の1日から4日まで、月曜日か火曜日の場合にのみ、12時に実行
OnCalendar=Mon,Tue *-*-01..04 12:00:00

# 毎週第1土曜日の18時に実行
OnCalendar=Sat *-*-1..7 18:00:00

# 毎日4時に実行
OnCalendar=*-*-* 4:00:00
```

ちなみに`OnCalendar`は複数指定できます。

```
# 平日の22:30と土日の20:00
OnCalendar=Mon..Fri 22:30
OnCalendar=Sat,Sun 20:00
```

## この書式が具体的に何時に動くのか確認する

よほど慣れているならともかく、ぱっと見ていつ実行されるのかいまいち確信が持てなかったりしませんか？
業務で運用しているシステムに設定するときなんて「本当にこれで合ってるのか？」ってめちゃくちゃ不安になりますよね！

そこで`systemd-analyze`の登場です。

こいつはいろいろなサブコマンドを持っているのですが、これの`systemd-analyze calendar`を使うと、`OnCalendar`に指定する書式が実際にいつ実行されるかというスケジュールを確認することができます。

```console
$ systemd-analyze calendar --iterations=5 '*-*-* 00/12:00/30:00'
Normalized form: *-*-* 00/12:00/30:00
    Next elapse: Thu 2021-09-30 00:00:00 JST
       (in UTC): Wed 2021-09-29 15:00:00 UTC
       From now: 9h left
       Iter. #2: Thu 2021-09-30 00:30:00 JST
       (in UTC): Wed 2021-09-29 15:30:00 UTC
       From now: 9h left
       Iter. #3: Thu 2021-09-30 12:00:00 JST
       (in UTC): Thu 2021-09-30 03:00:00 UTC
       From now: 21h left
       Iter. #4: Thu 2021-09-30 12:30:00 JST
       (in UTC): Thu 2021-09-30 03:30:00 UTC
       From now: 21h left
       Iter. #5: Fri 2021-10-01 00:00:00 JST
       (in UTC): Thu 2021-09-30 15:00:00 UTC
       From now: 1 day 9h left
```

試しに実行してみるとこんな感じになりました。

`*-*-* 00/12:00/30:00`は毎日00:00、00:30、12:00、12:30に実行という指定です。見るからにややこしい指定ですが、具体的にいつ実行されるかがずらっと表示されました。わかりやすいですね！

## 使える環境

`systemd-analyze`コマンド自体はだいたいの環境にあると思うのですが、`calendar`サブコマンドが追加されたのは`systemd 236`からのようです。

加えて、上記の例のように指定の周期分出力する`--iterations`オプションが追加されたのは`systemd 242`からのようです。

ちょっと古めのOSだと使えない可能性がありますね。
まぁ、確認するだけならどこかで新しいOSを動かしてコマンド叩けばいいですね。

- `calendar`サブコマンドは`systemd 236`から
- `--iterations`オプションは`systemd 242`から

参考までによくあるOSとバージョンです。

| OS                               | systemdのバージョン |
|----------------------------------|---------------------|
| CentOS 7                         | systemd 219         |
| CentOS 8                         | systemd 239         |
| CentOS 8 Stream                  | systemd 239         |
| Ubuntu 18.04 LTS (Bionic Beaver) | systemd 237         |
| Ubuntu 20.04 LTS (Focal Fossa)   | systemd 245         |

## 参考

- [systemd/タイマー \- ArchWiki](https://wiki.archlinux.jp/index.php/Systemd/%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC)
- [systemd タイマーの書き方。OnCalendarのtimer 設定の記述方法とチェック方法をおさらいする。cronの代替にするサンプル集 \- それマグで！](https://takuya-1st.hatenablog.jp/entry/2020/04/24/032822)
cloud-initでswapを設定する

t3.nanoみたいなメモリが0.5GBぐらいしかないインスタンスで遊んだりすると、ちょっとサービス起動したり、下手するとパッケージの大量アップデートなどがあるだけでメモリ不足になることがあります。

EC2に限らず昨今のクラウドサービスの仮想マシンは基本的にswapが設定されていないのですが、それだと色々困ったので、今回はcloud-initでswapの設定をやってみようと思います。

※ここではAWSを前提に進めていきますが、だいたいどの環境でも一緒でしょう。

## インスタンスストアがない場合

既存のボリュームにswapファイルを作りましょう。
気の利いた設定機能はないので`runcmd`でゴリゴリ書きます。

流れとしてはこのような感じになります。

1. `dd`コマンドでswap用のファイルを作る
2. `mkswap`でスワップ領域を作る
3. `swapon`でスワップ領域を有効化する
4. 再起動時に自動マウントされるように`/etc/fstab`に設定を書いておく

```
#cloud-config
runcmd:
  - [ sh, -c, "dd if=/dev/zero of=/swapfile bs=64M count=32" ]
  - [ sh, -c, "chmod 600 /swapfile; mkswap /swapfile; swapon /swapfile" ]
  - [ sh, -c, "echo '/swapfile none swap defaults 0 0' >> /etc/fstab" ]
```

サイズは環境に合わせて適宜調整してください。
`dd`のブロックサイズ(`bs`)はあまり大きくするとメモリ不足でエラーになるので、小さめにしたほうが無難です（ブロックサイズ分のメモリを消費するため）。

時々「`dd`より`fallocate`がいいよ」みたいな記事を見かけますが、`fallocated`で作成したファイルを`swapon`しようとするとエラーになるケースが存在するので`dd`が無難だと思います。

## インスタンスストアをまるまるswapにする場合

インスタンスストアがあってそれをまるまるswapにする場合は……調べてみても古めの記事しか出てこないのと、実際に試したことがないので、ここではあえて触れません。
ただ、やることは大体同じでしょう。最初からデバイスがマウントされてるので、少し手順が変わるだけです。

`cloud-config ephemeral swap`とかで検索すると参考になりそうな記事が出てきます。

## 参考

- [スワップファイルを使用して Amazon EC2 インスタンスのスワップ領域としてメモリを割り当てる](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-memory-swap-file/)
- [Amazon EC2\(Linux\)のswap領域ベストプラクティス \| DevelopersIO](https://dev.classmethod.jp/articles/ec2linux-swap-bestpractice/)
- [Amazon Linux 2のswapファイル作成にfallocate、ダメ、ゼッタイ \| DevelopersIO](https://dev.classmethod.jp/articles/al2-swapfile-fallocate-ng/)
cloud-initでSSHのポート変更と公開鍵の設定をする（AWS編）

※cloud-initの機能はクラウドサービスやOSによって使える機能が微妙に異なっていたりするので、ここではAWSのAmazon Linux 2を前提としますが、他の環境でもだいたい応用できるかと思います。

EC2でインスタンスを立てる際に「SSHのポート変更と公開鍵の追加設定もcloud-initでできたらなー」「Ansible使うほどじゃないんだよなー」と色々調べてたらどうにかなったというお話です。

## 背景

- Terraformなどで自動化してEC2インスタンスを立てる
- インスタンスを立てる際に、SSHのポート変更と鍵の追加も自動でやりたい
- インスタンス作成時にキーペアを設定できるが（ひとつしか設定できないので）、複数（メンバー全員分）の公開鍵を追加したい
- Ansibleは使わない[^1]

## やり方

```
#cloud-config
ssh_authorized_keys:
  - ssh-rsa AAAAB3Nza...
  - ssh-ed25519 AAAAC3Nza...

runcmd:
  - sed -i -e 's!#Port 22!Port 12345!' /etc/ssh/sshd_config
  - systemctl restart sshd.service
```

こんな感じでいけました。

### 鍵の追加

`ssh_authorized_keys`なんて設定があるんですね。
これを設定すると`ec2-user`の`authorized_keys`に全部追加されました。

### SSHポートの変更

SSHのポート変更については、そのような設定はないようなので、`runcmd`で`sed`を叩いて設定を書き換えることにします。
この辺はディストリビューションなどによって変わってくることもあるかもしれないので、確認の上調整してください。

あとはセキュリティグループや各種ファイアウォール等のポート変更も忘れないようにしましょう。

## （参考）個別にユーザを作る場合

`ec2-user`にみんなの鍵を追加するのではなく、個別にユーザを作る場合はこんな感じです。

```
#cloud-config
users:
  - default
  - name: ansible
    gecos: ansible
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    ssh_pwauth: False
    ssh_authorized_keys:
      - ssh-rsa AAAAB3Nza...
```

`users`に個別のユーザ設定を並べて、その中で`ssh_authorized_keys`を設定してあげます。

本題とは関係ありませんが、`users`設定を使うときに最初の`default`を忘れるとデフォルトユーザが作成されなくなるので注意が必要です。
この場合だと`ansible`ユーザだけが作成されて、普段ならあるはずの`ec2-user`は作成されなくなります。たぶん（やったことないからわからない）。
先頭に`default`を追加することで、ここに書いてあるユーザ＋いつも自動作成されるデフォルトユーザの両方が作成されるようになります。

[^1]: 別にAnsibleが嫌いなわけではないです。今回は他にAnsibleでやる作業もなかったので、cloud-initだけでゴリ押せないかなと挑戦してみただけです。
【Qiita】記事を書くときによく使うMarkdown記法

<!-- ================================================= -->
# 概要
<!-- ================================================= -->
Qiitaの記事を書くときによく使うMarkdown記法をまとめました。
書き方を強要する意図はないですので、ご参考までに。

<!-- ================================================= -->
# 基本的な記法
<!-- ================================================= -->
Qiita公式のチートシートです。

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

<details><summary>折りたたみ</summary><div>

```.tsx
console.log('Hello, World')
```
</div></details>

や

:::note info
補助説明
:::

の記述方法も記載されています。

<!-- ================================================= -->
# テキストに色を付ける
<!-- ================================================= -->
<font color="red">text</font>

:::note info
&lt;font color="red"&gt;text&lt;/font&gt;
:::

https://qiita.com/twipg/items/d8043cd4681a2780c160

* カラーリスト

https://www.w3.org/wiki/CSS/Properties/color/keywords

<!-- ================================================= -->
# 画像のサイズを変える
<!-- ================================================= -->
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358498/8e00c951-fe29-d7f5-d208-fd49ef2ef673.png" width="200">

:::note info
&lt;img src="url" width="size"&gt;
:::

https://qiita.com/shti_f/items/b819d7fd8cb79ae29687

<!-- ================================================= -->
# 見出しの付け方
<!-- ================================================= -->
:::note info
&lt;!-- ================================================= --&gt;
\# 見出し1
&lt;!-- ================================================= --&gt;
\### 見出し1-1

\### 見出し1-2
:::
* `#`の見出しは、**<!-- ===== -->**で囲います。

<!-- ================================================= -->
# リストの改行
<!-- ================================================= -->
* リストを途中で改行したい場合は、<br>
`<br>`タグを挟みます。

:::note info
* リストを途中で改行したい場合は、&lt;br&gt;
`&lt;br&gt;`タグを挟みます。
:::

<!-- ================================================= -->
# コードブロックのタイトル
<!-- ================================================= -->
```.tsx:React（TypeScript）のコードです
console.log('hello')
```

:::note info
```.tsx:React（TypeScript）のコードです
console.log('hello')
```
:::
* コードのタイトルを入れるには、**```.拡張子:タイトル**と記述します。
* タイトルに半角スペースは入れられません。
三項演算子 ( a ? b : c ) に true や false が出てきたら書き換えを検討しよう

JavaScript の例ですが、Java や Ruby など、同じような三項演算子の文法をもっているものには同じように使えます。

## (1)

### BAD

```javascript
const a = x === y ? true : false
```

### GOOD

```javascript
const a = x === y
```

## (2)

### NORMAL

```javascript
const a = x === y ? true : null
```

### BETTER

```javascript
const a = x === y || null
```

## (3)

### NORMAL

```javascript
const a = x === y ? f() : false
```

### BETTER

```javascript
const a = x === y && f()
```

## (4)

### NORMAL

```javascript
const a = x === y ? false : f()
```

### BETTER

```javascript
const a = x !== y && f()
```
React + Reduxを基本からまとめてみた【2】【Reducers】

##Fluxフロー図
![flux_flow.png]
(https://camo.qiitausercontent.com/cdd0824a85a48f51dacc8ec20fa5cf5ce6ec8093/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3434303539332f33313139643830622d383163642d633664382d636233312d6132383837386261313738312e706e67)

##Reducersとは
stateの変更を管理する役割を持っている

##Reducersの役割

Actionsからデータを受け取り、Storeのstateをどう変更するのかを決める<br/>⇨　Store内のstate(状態)の管理人

##initialStateを作ろう

- Storeの初期状態
- アプリに必要なstateを全て記述
- exportしておく


```initialState.js
//src/reducks/store/initialState.js
const initialState = {
   products: {

   },
   users: {
       isSignedIn: false,
       uid: "",
       username: ""
  }
};
export default initialState
```

##Reducersの書き方(1)

```reducers.js
//src/reducks/users/reducers.js
import * as Actions from './actions'
import initialState from '../store/initialState'

```

① actionファイル内のモジュールを全てimport (Actionsという名前を付ける)

② initialStateをimport

##Reducersの書き方(2)

```reducers.js
//src/reducks/users/reducers.js
import * as Actions from './actions'
import initialState from '../store/initialState'

export const UsersReducer = (state = initialState.users, action)=> {
//                   第一引数にstate   第二引数にactionがreturnした値
//Actionsのtypeに応じてstateをどう変更するか決める
switch (action.type) {
   case Actions.SIGN_IN:
     return {
　　　　　...state,
        ...action.payload
　　　}
   default:
        return state
    }
}
```

#####スプレッド構文とは<br/>⇨ 配列やオブジェクトの要素を展開する<br/>spred:広げる、開く

```sample.js
const payload = {
    uid: '00000',
    username:'torahack'
}
console.log({...payload})
//{uid: '00000', username: 'torahack'}

//Merge Objects
const state = {
  isSignedIn: false,
  uid: "0",
  username: "fuga"
}
console.log({...state, ...payload})
// {isSignedIn: false, uid: "1", username: "hoge"}
```

##参考サイト
[日本一わかりやすいReact-Redux入門#5...Reducersの作り方とスプレッド構文の使い方](https://www.youtube.com/watch?v=2j4c_O2s1uU)
[React- Redux 入門]
(https://qiita.com/shtwangy/items/4f9993ade64c3c6858d3)
【AWS SAA対策】最初に見ておくとよいExam Readiness 

概要
-
SAA 試験準備に関するEラーニングの紹介記事になります。
無料で勉強することが出来ます。

Exam Readiness: AWS Certified Solutions Architect – Associate（日本語実写版）
https://www.aws.training/Details/Curriculum?id=83470




Exam Readinessについて
-

とても優秀なAWS公式の試験対策リソースです。
Exam Readinessについてあまり情報が出回っていなかったので、是非参考にしてください。
試験範囲や勘所の把握だけでなく、試験準備前の総復習にも活躍しますよ！

2時間くらいで終わります。


##コースの目標

コースより抜粋
>このコースの学習内容は、以下のとおりです。

>試験手順に関する注意事項を確認する
>試験の構成と問題のタイプを理解する
>問題が AWS のアーキテクチャの設計の概念とどのように関連しているかを識別する
>試験問題で出題される概念を理解する
>AWS Certified Solutions Architect – Associate 認定試験のために学習する時間を配分する


##コースの項目

コースでは下記の項目(Module)を学習します。

###Module 1
・弾力性に優れたアーキテクチャの設計
・信頼性と弾力性に優れたストレージを選択する
・AWSのサービスを使用した疎結合化メカニズムの設計方法を決定する
・多層アーキテクチャソリューションの設計方法を決定する
・可用性や耐障害性に優れたソリューションの設計方法を決定する
・AWS CloudFormation
・AWS Lambda

###→Module 1で学習した機能、サービス
　 -Amazon EC2 インスタンスストア
　 -Amazon EBS
　 -Amazon SQS
　 -Amazon EBS
　 -Amazon DynamoDB
　 -Amazon EFS
　 -Amazon S3
　 -Amazon S3　アクセスコントロール
　 -Amazon S3　Glacier
　 -Amazon CloudFormation
　 -AWS Lambda


###Module 2
・高パフォーマンスなアーキテクチャの設計
・高パフォーマンスなストレージ及びデータベースを選択する
・Amazonデータベースサービス
・キャッシュを適用してパフォーマンスを高める
・ソリューション設計が目指す伸縮性とスケーリング
・運用上の優秀性を実現するソリューションの設計機能

###→Module 2で学習した機能、サービス
　 -Amazon S3
　 -Amazon RDS
　 -Amazon DynamoDB
　 -Amazon Redshift
　 -Amazon CloudFront
　 -Amazon EC2 Auto Scaling
　 -Amazon CloudWatch
　 -Amazon ELB
　 -Amazon config/CloudFormation/Trusted Advisor/Inspector/VPC フローログ/CloudTrail　＊概要紹介
　 -Amazon CloudWatch



###Module 3
・セキュアなアプリケーションとアーキテクチャの設計
・アプリケーション層の保護方法を決定する
・データの保護方法を決定する
・単一VPCアプリケーション向けのネットワークインフラストラクチャを定義する

###→Module 3で学習した機能、サービス
　 -AWS IAM
　 -AWS KMS
　 -AWS CloudHSM
　 -Amazon VPC

###Module 4
・コストを最適化したアーキテクチャの設計
・コストを最適化したストレージの設計方法を決定する
・コストを最適化したコンピューティングの設計方法を決定する

###Module 5
コースのまとめ


最後に
-
無料で受けられるのはとてもありがたいです。
あと、記事には書いていませんが講座の間にサンプル問題を解説してくれるため
なぜその答えになるのか分かり、勉強になります。
[Ruby] AtCoder過去問 B - Contest with Drinks Easy

##はじめに
AtCoder過去問B問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認してください↓

https://atcoder.jp/contests/abc050/tasks/abc050_b

##B - Contest with Drinks Easy
まずは入力値を受け取る記述を書きます。今回は少々多めでした。
p_xに関しては(4行目以降)二次元配列として受け取っています。

```ruby
n = gets.to_i
t = gets.split.map(&:to_i)
m = gets.to_i
px = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}
```

僕は頭の整理がしやすいように、pとxはそれぞれの配列に入れ直しました。

```ruby
n = gets.to_i
t = gets.split.map(&:to_i)
m = gets.to_i
px = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}
p_ary = []
x_ary = []
px.each do |p_x|
  p_ary << p_x[0]
  x_ary << p_x[1]
end
```

pだけの配列とxだけの配列が作れました。

x_aryとp_aryを使って、問題文通りに配列tを書き換えて、sumメソッドで合計して出力というのを繰り返します。

```ruby
n = gets.to_i
t = gets.split.map(&:to_i)
m = gets.to_i
px = readlines(chomp: true).map{|line| line.split(' ').map(&:to_i)}
p_ary = []
x_ary = []
px.each do |p_x|
  p_ary << p_x[0]
  x_ary << p_x[1]
end

cnt = 0
p_ary.each do |x|
  t_tmp = t.dup
  t_tmp[x-1] = x_ary[cnt]
  puts t_tmp.sum
  cnt += 1
end
```

each文の1行目は配列tを初期化しているという感じです。

##おまけ

実は最初、each文の1行目は```t_tmp = t```としていたのですが、t_tmpの中が初期化できなかったんですね。。。
おそらくrubyという言語の構造の話だとは思うのですが、t_tmp=tという記述でt_tmpとtが同じものとして認識されているので、t_tmpを加工したらtも加工されている。。。？ということなのでしょうか

配列tをコピーするにはdupメソッドをつけてやればt_tmpとtは別物と判断してくれて、初期化できました。
Wekan_Winodws版起動方法

##プロジェクト管理ツールのWekan（Windows版）の起動方法

Windows版のWekanを起動させる手順

**環境**
Windows10上に直接Wekanを構築

**方法**
1. 「Wekan」をインストールしたフォルダを開く
1. 「bundle」フォルダを開く
1. 「start-wekan.bat」を管理者権限で実行する
1. 　開いたコマンドプロンプトウィンドウを放置する
2021年版 Pythonでword2vecの実装と利用

# Install

環境：Jupyter Lab
pip で簡単にインストールできます．

```python
!pip install gensim
```

# 利用

ここのtxtファイルは既にわかち書き済みのデータなので，ご注意ください．

昔のバージョンのsizeはvector_sizeに変更し，iterはepochsに変更しました．

```python

# Ref: https://teratail.com/questions/131715
# Ref: https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Text8Corpus
# data training

# vector_size : ベクトルの次元，いわゆるニューロンの数
# min_count : 出現頻度が〇〇以下の語を無視；出現頻度が少ない語はword2vecの仕組みに適用できない
# window : 対象単語を中心とした前後の単語数
# epochs : epochs数，デフォルトは5


from gensim.models import word2vec


sentences = word2vec.LineSentence('Alldata.txt')
model = word2vec.Word2Vec(sentences,vector_size=600,window=3,min_count = 20, epochs = 5)
model.save('mymodel.model')
```

# 類語推定

「部屋」とのcos類似度がTop 10の語を出力します．

```python
# Ref: https://techacademy.jp/magazine/30591
from gensim.models import word2vec
model   = word2vec.Word2Vec.load("mymodel.model")
results = model.most_similar(positive="部屋", topn=10)
for result in results:
    print(result[0],  result[1])

```
今回はテストデータ（10000件）で学習したので，精度はまだまだです．
テストデータの学習結果：

```python
お部屋 0.9306197166442871
良く 0.915359377861023
ただ 0.9132060408592224
丁寧 0.909668505191803
よく 0.9088638424873352
広く 0.9085277318954468
朝食 0.9038276672363281
や 0.9029475450515747
料金 0.9026759266853333
きれい 0.9010841846466064


```

# トレーニング時間
あくまで参考ですが，
3300万件，5GBのデータを使って，次元が600，windowsが3に設置する場合，1 epochsのトレーニング時間は20~25 minでした．


# Ref

赤石雅典，江澤美保，2020『Python自然言語処理入門』


https://teratail.com/questions/131715

https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Text8Corpus

https://techacademy.jp/magazine/30591
Polyglotファイルについて



## 背景
先日たまたまPolyglotについて知る機会があったので、その復習も兼ねて概要についてまとめる。

## Polyglotの意味

もとの言葉の意味としては、複数の言語を話せる人のことを指す。

そのとき自分が扱ったのはPolyglotファイルといわれるもので、1つのファイルが複数のファイル形式で正しく解釈されるファイルのことを指す。

## ファイルの解釈？

###解釈 → 形式の判定

もう少し詳しく。

画像であればjpg, png, bmp, gif, 音声ならwov, mp3といったようにファイルには形式が存在する。この形式の判定を行うことをここでファイルの解釈という。

### imghdrにおける判定

具体的な例として、pythonの画像の形式を判定するライブラリに[imghdr](https://docs.python.org/ja/3/library/imghdr.html)というものがある。

このimghdrは画像の形式判定を、ファイルのバイナリデータを読み出して特定の文字列を抽出することで行なっている。

jpeg形式の画像の場合、ファイルヘッダの7~10バイト目にJFIFの文字が入っている。
``hexdump -C example.jpeg |head``のコマンドで確認が可能。結果は以下の画像。
![スクリーンショット 2021-10-04 15.14.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521871/3b882174-51e8-ae70-a3a7-e0471137c3e5.png)
imghdrはファイル内のJFIF, Exifなどの文字列を抽出することでファイル形式の判断を行なっており、逆にいえばこの文字列が特定の位置にさえ入っていれば**実際は異なる形式のファイルでも画像として判断される。**

### 改ざん例

試しに手元でrtf(リッチテキストファイル)ファイルのバイナリを編集した。内容については以下の画像。
![スクリーンショット 2021-10-04 15.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521871/9aeefc46-2fa8-f026-ed8a-177ca58b655a.png)
このファイルをimghdrに判定させるとjpegとして判定される。

## 危険性と対策

以上のように複数の形式で解釈可能なファイルをPolyglotという。上記のrtfのように別段害のないものばかりではなく、無害なファイルのふりをして実行可能なスクリプトが含まれている場合などもある。

[こちら](https://portswigger.net/research/bypassing-csp-using-polyglot-jpegs)は画像内にjavascriptが仕込まれているケースが挙げられている。

実行可能なスクリプトの注入された画像などがサーバでのファイルチェックをバイパスしアップロードされることで、異なるオリジンからのスクリプトの読み込みを許可しないアプリケーションにおいて、**同一オリジンのスクリプトとして画像が読み込まれる可能性がある。**
![スクリーンショット 2021-10-04 16.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1521871/1b558d75-65a2-5287-70f0-681e26eca98c.png)

図の赤字で示すように、攻撃を成り立たせるためにはアップロードしたPolyglotをスクリプトとして読み込むためのスクリプトタグが必要になる。
ファイルそのものに対するチェックには限界があるため、悪質なPolyglotがアップロードされてもスクリプトが実行されないようにXSSなどの脆弱性を残さない必要がある。

## 感想
ファイル自体の作りはすごいと思ったが、攻撃を行う手段としては回りくどいようにも感じる。ここからさらに発展を遂げる(どんな？)ことも考慮すると一応知っておく必要はあるかもしれない。というか単純にPolyglot単体でもキメラのようで十分面白い。
[JavaScript] クラスの実装


JavaScriptでのクラスの実装について学習した。

#１．クラスの定義
クラスの定義方法には「クラス宣言」と「クラス式」がある。
#### ■　クラス宣言
クラス宣言によるクラスの定義は以下のように記述できる。

```javascript:例：Sampleクラス
class Sample{
    // クラスでの処理を定義
}
```
#### ■　クラス式
クラス式によるクラスの定義は以下のように記述できる。

```javascript:例：Sampleクラス
const MyClass = class Sample{
    // クラスでの処理を定義
}
```
ここで、クラス宣言にはクラス名が必要である一方で、クラス式の場合はオプションである。

#2.インスタンスの生成
 クラスから、クラスのインスタンスを作成するには、<font color="Red">new演算子</font>を使用する。

```javascript:例：Sampleクラス
const object = new Sample()
```

#3.コンストラクタ
 コンストラクタは、オブジェクトを生成する際に初期化関数として呼ばれるメソッド。クラスに1つしか定義することができない。

```javascript:例：Sampleクラス
class Sample{
    constructor(){
        // 初期化処理
    }
}
```
【Visual Studio】特定メンバーのXMLコメントを使う


# やりたいこと
例えば、下のようなクラスがあったとき、HogeClass は Hoge プロパティ専用のクラスなので、Hoge プロパティの XML コメントを、HogeClass のと同じに（共通化）したいと思った。

```C#
class TestClass
{
	// このsummaryを、HogeClassと共通化したい
	/// <summary>
	/// 説明文
	/// </summary>
	public HogeClass Hoge { get; }

	/// <summary>
	/// 説明文
	/// </summary>
	public class HogeClass { }
}
```

# 解決策
summary タグの代わりに、 inheritdoc タグを使い、cref="" に XML コメントを同じにしたいメンバーの名前を入れる。

```C#:
class TestClass
{
	/// <inheritdoc cref="HogeClass"/>
	public HogeClass Hoge { get; }

	/// <summary>
	/// 説明文
	/// </summary>
	public class HogeClass { }
}
```

# 参考
- [クラスとそのメンバー用として推奨される XML ドキュメント タグ | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/xmldoc/recommended-tags#inheritdoc)
Gitブランチでフォルダーの運用

# 背景

会社はGithubでGitflowを管理しています。最近開発の業務が大幅増えてきて、ブランチの数も以前より何倍になりました。Gitブランチについて、現状は下記となります。
1. 大きな機能に対して、featureブランチを作成して、細かい機能は更にチケットを切ってfeatureブランチ向けのPRを作って作業します。
2. テスト環境のデポロイやリリースのために、github actionでスクリプトを作って、毎回featureブランチ向けのPRがマージされたら、自動的にデポロイやリリース用のブランチへPRを生成します。
3. 毎回リリースの直前にfeatureブランチの内容を確認して、リリースを行うとなります。

# 気がついたところ

最近はGitブランチの管理で下記の何点に気が付きました。
1. Sub-featureと所謂細かい機能を改修するブランチが多いので、ブランチの管理が難しくなる。更に考慮漏れや用件追加によって、命名が似ているブランチも増えて来ました。例えば、チケットAに向けのブランチ`ticket_a`。一回マージして、また新しい改修を追加したい場合は、`ticket_a_fix`、`ticket_a_add_XXX`、`ticket_a_remove_XXX`などのブランチが作成されました。
2. 毎回新規のfeatureブランチを追加する際に、github actionのスクリプトを変更しなければいけないとなります。例えば、今期の`sprint_a`がリリースされたら、来期の`sprint_b`を追加する必要があります。
3. featureブランチのnamespaceが混乱になりました。featureブランチの命名規則がまたありませんので、基本は改修内容に元ついて命名します。結果としては、毎回リリースする前に今期リリースの内容をちゃんと確認しないとリスクが高いと思います。
4. github actionのブランチ管理が難しい。github actionでブランチやPRを管理したいの場合は、featureブランチを全部揃う必要があると思うので、実装や更新は確認するコストがあります。

# Gitフォルダーの運用

Gitflowで正式的にメンションしていなかったですけど、下記の３つくらいのGitフォルダーを作って運用した例が多いと思います。

* feature[s]
* hotfix[es]/fixes
* release[s]

ref: https://dev.to/hardkoded/how-to-organize-your-git-branches-4dci

# まとめ

1. namespaceがフォルダー名でしっかりと分割されているので、Sub-featureの数が多いでもfeatureブランチの命名は混乱されてないになると思います。
2. フォルダー名によって、github action側でfeatureブランチなどの制御が簡単にできます。
composerでパッケージをインストールするときにメモリサイズでエラーが出る場合の対処

## はじめに
composerでなにかしたときにこういうエラーが起きたときの対処方法
`PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted 以下省略`

## 対処法

#### 1. まずは読み込まれているphp.iniのメモリサイズを確認

~~~
$ php -r "echo ini_get('memory_limit').PHP_EOL;"
128MB

おそらくこの状態になっているので、この上限を増やしてやればOK
~~~

#### 2. php.iniの場所を確認

~~~
$ find / -name php.ini

↓　実行結果　ここにあるのがわかる

etc/php.ini
var/www/html/vagrant/conf/php.ini
~~~ 

#### 3. php.iniがたくさんある場合
phpinfoで読み込んでいるphp.iniがなにか確認しよう
[phpinfoの使い方](https://on-ze.com/archives/2253)
みるべき場所： `Configuration File (php.ini) Path`で示されるパス

~~~
例
phpinfoで見たphp.iniのパスが
/etc
であれば、/etc/php.ini　が読み込まれている
~~~

#### 4. php.iniを編集する

~~~
$ vi etc/php.ini  (php.iniのパスは手順２，３で確認したものに変えてください)

/  で検索モードへ
memory  と打ち、enter
i  でインサートモード（編集できるようなモード）
memory_limit = 128MB　　を
memory_limit = -1　　へ変更
ctrl + C でノーマルモードへ
:wq  で保存して終了
~~~

#### 5. 再度1の手順を実行して変更が読み込まれているか確認する

~~~
$ php -r "echo ini_get('memory_limit').PHP_EOL;"
-1
~~~
こうなっていればOK
あとは先程失敗したcomposerでやりたかったことを実行しよう
webdriver-manager で Chrome webdriver を自動更新する

#問題
* PythonでChrome webdriverを使っていると、Chrome本体とのバージョンの不整合で、頻繁にアップデートが必要になる。

```
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 90
Current browser version is 94.0.4606.71 with binary path /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
```

* 面倒くさいので自動化したい。

#解決方法
* モジュール `webdriver-manager` を用いることで自動化できる。

##インストール
    $ pip install webdriver-manager

#コードの改変
* 元のコードの例

```python
import chromedriver_binary
from selenium.webdriver import Chrome
driver = Chrome()
```

* 改変後のコードの例

```python
# import chromedriver_binary
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver import Chrome
# driver = Chrome()
driver = Chrome(ChromeDriverManager().install())
```

* 実行すると、Chromeのバージョンに合ったドライバをインストールしてくれる

```
====== WebDriver manager ======
Current google-chrome version is 94.0.4606
Get LATEST driver version for 94.0.4606
There is no [mac64] chromedriver for browser 94.0.4606 in cache
Get LATEST driver version for 94.0.4606
Trying to download new driver from https://chromedriver.storage.googleapis.com/94.0.4606.61/chromedriver_mac64.zip
Driver has been saved in cache [/Volumes/Home/ynaito/.wdm/drivers/chromedriver/mac64/94.0.4606.61]
```

### 2022.10.17時点での問題点と姑息的対応
* Google が Chromeドライバの名称を`chromedriver_mac64_m1.zip`から`chromedriver_mac_arm64.zip`に変更したために、以下のようなエラーを吐く。
```
ValueError: There is no such driver by url https://chromedriver.storage.googleapis.com/106.0.5249.61/chromedriver_mac64_m1.zip
```
* 緊急避難的な対応として、`.../site-packages/webdriver_manager/core/download_manager.py` の末尾から２行目（執筆時点で28行目）の
```python
        response = self._http_client.get(url)
```
を
```python
        response = self._http_client.get(url.replace('chromedriver_mac64_m1', 'chromedriver_mac_arm64'))
```
に書きかえて対応している。（webdriver_managerが対応するまでの弥縫策）

# おしまい
rails5, rails6以降のchartkicksの導入方法

railsの情報って5が圧倒的に多いですけど、6って意外と情報少ないですよね...
はい。その罠にかかって時間を費やしてしまったわけです。
そこで、railsに見やすいグラフを導入してくれるchartkicksのバージョン別導入方法を記述していきます！
結果から言ってしまうと公式読めば済むことでしたが...。

https://github.com/ankane/chartkick

# 共通手順
gemfileに記述して

```:gemfile
gem "chartkick"
```

ターミナルで以下を実行
`bundle install`

gemなのでこの流れは必須ですね。

# rails５のchartkicksの導入手順

headタグに以下を記述

```html.erb:view/layout/application.html.erb
<%= javascript_include_tag "//www.google.com/jsapi", "chartkick" %>
```

そして、app/assets/javascripts/application.jsに以下を記述

```javascript:app/assets/javascripts/application.js
require chartkick
require Chart.bundle
```

これで導入できます

# rails６以降のchartkicksの導入手順

以下の記述をapp/javascript/packs/application.jsにします。

```javascript:app/javascript/packs/application.js
import "chartkick/chart.js"
```

ちょっとした違いですけど、公式読むまでたどり着けませんでした。
おかげさまで公式読む癖がつきましてけどね！

頑張っていきましょう！
hardhatを用いたpolygonへのcontractのdeploy

#はじめに
Ethereumの開発に、truffleを利用していましたが、最近はhardhatをよく使っています。
TypeScriptが対応しているのでTruffleよりも良いのでは、、という気もします。
他にも様々な支援ツールが存在しているので、利用してみるのも良いかもしれません。
ここではhardhatを利用して、polygonに接続をして、サンプルをdeploy,executeする流れのメモ書きです。

Truffle
Embark
Create Eth App
scaffold-eth
Epirus
Solidity template
Brownie
Dapptools
Waffle

#hardhatを使って環境を準備

$ mkdir hardhat_workspaces
$ cd hardhat_workspaces
$ npm init -y
$ npx hardhat init

//Create a basic sample projectを選択
✔ What do you want to do? · Create a basic sample project
✔ Hardhat project root: · /Users/.../Documents/hardhat_workspaces
✔ Do you want to add a .gitignore? (Y/n) · y
✔ Help us improve Hardhat with anonymous crash reports & basic usage data? (Y/n) · true

//nodeを立ち上げる
$ npx hardhat node
//他のコンソールからtestを実行する
$ npx hardhat test --network localhost

#maticをmetamaskに設定し、testcoinを取得する

//faucet
https://faucet.polygon.technology/


#Contractのdeployとexecute

// maticにGreeter.solをdeployする
$ npx hardhat run scripts/sample-script.js --network matic

Downloading compiler 0.8.0
Compiling 2 files with 0.8.0
Compilation finished successfully
Greeter deployed to:xxxxxx

```sample-test-script.js
const hre = require("hardhat");
async function main() {
  const Greeter = await hre.ethers.getContractFactory("Greeter");
  const CONTRACT_ADDRESS = ""
  const contract = Greeter.attach(CONTRACT_ADDRESS);
  const greet = await contract.greet();
  console.log("Greet: ", greet);
}
main().then(() => process.exit(0)).catch(error => {
  console.error(error);
  process.exit(1);
});
```

// matic　でGreeter.solを実行する
npx hardhat run scripts/sample-test-script.js --network matic

Greet:  Hello, Hardhat!


#network

RPC URL： https://rpc-mumbai.matic.today
ChainID： 80001
シンボル： MATIC
エクスプローラー
https://mumbai-explorer.matic.today


RPC URL： https://rpc-mainnet.matic.network
ChainID： 137
シンボル： MATIC
ブロックエクスプローラー
https://explorer.matic.network/

#tools
Exploler
https://mumbai.polygonscan.com/

Faucet
https://faucet.polygon.technology/
[Kotlin] data class と普通のクラスの違い

# 事の発端
師匠に突っ込まれたので。
まだまだ、思考が浅かったです。

https://twitter.com/dosukoi_android/status/1444626896939995136?s=20


# データクラスとは？
データクラスとは、Kotlin特有の仕様で、データを保持するだけのクラスはdataマークをつけることで定義されます。
データクラスとして成り立たせるには、

- プライマリコンストラクタに引数を一つは持たせること。
- val or var でイミュータブルか否かを明示すること
- 抽象クラス、openクラス,シールドクラス、インナークラスであってはならない

が必要です。

Javaでは、フレームワークに依存していない無添加なオブジェクトによって、（いわゆるPOJO）データを保持するだけのクラスは作れますが、かなりボイラープレート多いです。


# 普通のクラスとの違い
上記３つの縛りはあるものの、確かに違いは何かと言われるとちゃんと考えていなかった。
恐らく、dataマークを付与することでデータを保持するのに特化した仕様になるのだろうが、何が違うのか？・・・

結論を先に言うと、「データを扱うのに便利なメソッドが自動で実装される」です。
# どんなメソッド？
元々全クラスの継承元、Anyクラスが持つ

- toString()
- hashCode()
- equals()

に加え

- copy()：コピーできる
- componentN()：N番目のプロパティを返す

が実装されます。

また、同じメソッドでも仕様に違いが生じます。

```kotlin
class Hoge() {}

data class Piyo(val fuga: String)

class Main() {
     val hoge = Hoge()
     val hoge2 = Hoge()

     print(hoge.toString()) // Hoge@12345 <- ハッシュ値を含んだこんな感じのが出力される
     print(hoge.equals(hoge2)) // false <- 当然別インスタンスなので、異なるという判定

     val piyo = Piyo("Kotlin")
     val piyo2 = Piyo("Kotlin")

     print(piyo.toString())  // Piyo(fuga = Kotlin) <- データのプロパティを含んだものが出力される
     print(piyo.conponent1()) // Kotlin <- 一番目のプロパティが出力される
     print(piyo.equals(piyo2())) // true <- 別インスタンスであるが、プロパティが同じなので同一という判定

}
```

それと、hashCode()に関しては、データクラスの場合プロパティに基づいたハッシュ値ですが、普通のクラスはインスタンスに基づくものです。

この点からもデータを扱うという目的に特化していることがわかりますね。

# 終わりに
データクラスは、魔法のクラスから少し理論的に踏み込めたので、書いていて楽しかった。
# 参考

https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/data-classes.html

https://medium.com/mindorks/data-classes-in-kotlin-369e95c2f0ea

https://pouhon.net/kotlin-dataclass/3375/
マテリアルズインフォマティクス ことはじめ -化学構造生成器の紹介-

こんにちは。スキルアップAI編集部です。

新薬の開発には長い期間や大きな費用が必要です。その中でも候補となる化合物の選択は非常に重要です。近年、創薬にも人工知能の技術を取り入れる試みは非常に盛んであり、新薬開発の期間短縮や費用削減に寄与することが期待されています。今回はその中でも、新規化合物の探索を手助けする化学構造生成器の紹介をします。

<目次>
1.VAEとは
2.SMILESについて
3.Chemical VAEについて
4.まとめ
5.参考文献

# 1.VAEとは
Variational Autoencoderer(VAE；変分オートエンコーダ)は、ニューラルネットワークによる生成モデルの1つです。VAEは、AE(Autoencoder；オートエンコーダ)の1種ですが、通常のAEとは異なり、潜在変数を確率変数で表します。図1に通常のAEとVAEの違いを示します。VAEでは、確率変数としての潜在変数を変化させることで、様々なデータを生成します。

<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/1593a285-0e01-33ee-f75f-765f53ba4d2c.png">
図1.通常のAEの構造とVAEの構造の違いについて

# 2.SMILESについて
一般的な化学構造式の表記は、人間が理解するための表現形式としては便利なものですが、機械学習のプログラムにとって理解しやすいものでありません。機械学習のモデルで、化学構造を扱うときは、通常、化学構造式をSMILES記法という表現形式に変換します。SMILES記法では、化学構造式を英数字や記号で構成される文字列で表現します。例えば、以下の図2のように表記します。SMILES記法へ変換する際や、SMILES記法のデータを扱う際には、RDKitと呼ばれるオープンソースライブラリがよく用いられます。

<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/40b67685-5460-b9ce-7fcd-6bdc374c4584.png">
図2.SMILES記法の例

# 3.Chemical VAEについて
マテリアルズインフォマティクスという分野では、近年、化学構造生成器が盛んに研究されています。Chemical VAEは、その1つです。
Chemical VAEは、名前の通り、VAEをベースとしたモデルです。Chemical VAEのエンコーダは、受け取ったSMILES記法のデータをベクトルに変換し、それをもとに潜在空間を構成します (図3)。Chemical VAEのデコーダは、潜在空間からサンプリングされた潜在変数を受け取って、SMILES記法のデータを出力します。出力された化学構造は、入力された化学構造に似た新たな化合物となります。学習後に、潜在空間からのサンプリングを何度も行えば、サンプリングした分の化学構造を生成することができます。
このChemical VAEが提案された背景には、「既知の化合物に類似した新規化合物は、その既知の化合物に似た性質を持つことが多い」という薬学者の経験則があります。そのため、この提案手法は、完全に新しい化合物ではなく、既存の化合物に似た新しい化合物を生成することを目的としています。

<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/7acf04fc-06b4-4004-e9e8-aa9b79fb93d1.png">
図3.Chemical VAEの仕組み
(参考文献[1]より引用)

# 4.まとめ
AEやGAN（敵対的生成ネットワーク）を取り入れた化学構造生成器は、これまでに数多く提案さていますが、Chemical VAEは、その先駆者的存在です。Chemical VAEは、今でも化学構造生成分野の論文にて、比較対象としてよく用いられます。これから、化学構造生成器を学ぼうと思っている方には、Chemical VAEから勉強されることをお勧めします。

# 5.参考文献
[1] [Rafael Gómez-Bombarelli, et al., “Automatic Chemical Design Using a Data-Driven Continuous Representation of Molecules” arXiv:1610.02415v3 [cs.LG] 5 Dec 2017](https://arxiv.org/pdf/1610.02415.pdf)

# 25卒向け！AIエンジニアになるための長期インターンプログラム参加者募集中！
25卒学生向けに、AIの基礎を学びながら就活も一括サポートする無料カリキュラムを提供しています。
修了するとE資格の受験資格も獲得できるプログラムとなっています！

<img width="700" alt="長期インターン" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889700/bfce4c26-1ebe-c54d-bacb-e804048a7a08.png">

**特長①AIエンジニアやデータサイエンティストの基礎が身に付く**
AIジェネラリスト基礎講座や機械学習のためのPython入門講座など、市場価値向上のための基礎を習得。

**特長②AI・データ分析領域の優良求人を紹介**
非公開求人や選考直結型インターンをご紹介し、早期内定の獲得をサポート。

**特長③長期インターンプログラム専用の学生コミュニティ参加可**
学生同士で就活情報をシェアしたり、学習を進めるうえでアドバイスをしあったりできるコミュニティに参加可能。

＞＞[長期インターン詳細](https://bit.ly/3pXW5JM)

☆☆☆
スキルアップAIのメールマガジンでは会社のお知らせや講座に関するお得な情報を配信しています。
配信を希望される方は[こちら](https://share.hsforms.com/1_XlReV-4Te-zcxCl9lhffA2mtef)

また、SNSでも様々なコンテンツをお届けしています。興味を持った方は是非チェックしてください♪
Twitterは[こちら](https://twitter.com/SkillupAi)
Facebookは[こちら](https://www.facebook.com/skillupai)
LinkedInは[こちら](https://www.linkedin.com/company/skillup-ai)
フィボナッチ数列を行列を使ってO(log(n))で計算する

(更新 2022/06/24 行列は累乗はよく使うので汎用関数 mtxPowMod(mtx, n, m)を定義してそれを使ったコードを加えました。)

以下のような例題を解くためにフィボナッチ数列を高速で計算する方法はないかと探していたら[「行列累乗でフィボナッチ数列を計算する」](https://qiita.com/flour/items/9f8a20112f45f0ee5f71)という投稿が見つかりました。これを参考にしてPythonのプログラムを書いてみました。

**例題. フィボナッチ数列を$f(n)$としたとき$f(10^{14})$をmod 100007で求めよ**

これをループや再帰関数で求めるのはできないので以下の行列の累乗を使って求めるようにしました。
式はWikipediaの[フィボナッチ数](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)にも載っています。

```math 
\begin{align}
\large \begin{pmatrix} F_{n+1} & F_n \\\ F_n & F_{n-1} \end{pmatrix}
= \begin{pmatrix} 1 & 1\\\ 1 & 0 \end{pmatrix}^n
\end{align}
```

従ってnが$2^k$の時は行列の2乗をk回繰り返せばよいので以下のようになります。この時に要注意なのがpythonのnp.arrayの要素はint64なのでMがもっと大きいとオーバフローを起こしてしまいます。arrayを作るときにdtype='object'とすると通常の整数変数と同様に桁数が無制限にできました。

```python 
import numpy as np
import math
M = 100007
def fibmtx2n(k):   # n = 2 ** n2
  fm = np.array([[1,1],[1,0]], dtype='object')
  for i in range(k): 
    fm = np.dot(fm,fm) % M
  return fm
```
このfibmtx2n()を使って任意のnを2のべき乗の和に分解して呼ぶことで計算することが出来ます。

```python 
def fibmtx(n):
  fm1 = np.array([[1,0],[0,1]],dtype='object')
  while n > 0:
    l2n = n.bit_length()-1
    fm1 = np.dot(fm1, fibmtx2n(l2n)) % M
    n -= 2**l2n
  return fm1[0][1]
```
fixbtx()関数を使って以下のように例題の計算を瞬時に行うことが出来ました。

```python 
n = 10**14
print(n, fibmtx(n))
# 100000000000000 63949
```
さらにこれを何度も使うときにはfibmtx2n()関数に@lru_cacheを適用することでさらに早くすることが出来ます。

(* 2021/10/06 コメントを反映してbit_length()に変更)

(以下 2022/06/24に更新)
#### 関数 mtxPowModを使ったコード

pythonのpow関数と同様のmoduloを指定できる行列の累乗関数**mtxPowMod**で、よりシンプルなコードになりました。

```python 
import numpy as np
# matrix exponentiation, (mtx:matrix, k: power, M: modular)
def mtxPowMod(mtx,k, M):               
  ret = np.identity(len(mtx), dtype=int)  # identity matrix
  while k > 0:
    if (k % 2) == 1: ret = ret @ mtx % M
    mtx = (mtx @ mtx) % M
    k //= 2
  return ret

def fibn(N, M):  # n-th Fibonacci mod M
  fmtx = np.array([[1,1],[1,0]], dtype=object)
  return mtxPowMod(fmtx,N, M)[0,1]

N, M = 10**14, 100007
print(N, fibn(N, M))
# 100000000000000 63949
```
（開発環境：Google Colab）

このやり方はProject Euler Problem 304: Primonacci等解くのに役に立ちます
汎用デシジョンテーブルIMSが新たに追加になりました。

#はじめに
ifLinkマイクロサービスを開発している八教と申します。
新たにデシジョンテーブルにより判定して結果を送信するフィルターIMS
「汎用デシジョンテーブルIMS」が追加されましたので、紹介させていただきます。

#ifLinkとは
https://iflink.jp/

#汎用デシジョンテーブルIMSについて
IMSのデータがデシジョンテーブルに合致するか判定し、
最初に合致したデシジョンテーブルの結果を返却します。

デシジョンテーブルってなに？という方は以下参照
https://medium-company.com/%E6%B1%BA%E5%AE%9A%E8%A1%A8/

例えば入力に乗車駅、降車駅、支払いを出力するIMSがあった場合、
それらの入力を受け取ってデシジョンテーブルより運賃を算出。
算出結果をトーストに表示することができます。

IF-THEN のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/95fa5881-447f-10b5-456e-64683a517ea9.png)

デシジョンテーブルはルールマネージャでルール作成時にIMS設定でJSON形式で設定します。
上記デシジョンテーブルをJSONにすると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/b34d707c-26d6-cede-ce88-c5b64cc54a06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/1e74cea8-5eb7-3024-6a93-b2cd99e6f0b4.png)

デシジョンテーブルでは入力値に対して条件を設定することができます。
使用できる条件は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/51dc9574-3a94-fd7b-0a5b-41e4d3bd41ca.png)

デシジョンテーブルIMSの取得結果を判断するルール作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/32a3eefd-51a6-9c5a-0536-f462fdcdf8d1.png)


ルール上デシジョンテーブルを取得するための入力項目を、
どのように取得しているのかをデバイスサービスXMLで説明いたします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/9c5bfc70-ecfc-965b-27e2-5ab2437f88c7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/e3f49a70-cbdb-efe2-8388-eab8e23c42b7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/09660fb6-94f0-d5de-4cc8-ebecfdfbebe2.png)

デシジョンテーブルの取得可否をTHEN起動条件とするルール作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/727e7604-d06f-f080-508c-9c2a425dd127.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780474/3b63d153-8ee0-3b14-e906-da504044fc55.png)


是非お試しいただければと思います。
【Flaskエラー】TypeError: exceptions must derive from BaseExceptionが出た時

## 環境
Python 3.9.0
Flask 2.0.1

## エラーに詰まったのでメモ

Flaskで**flask run**すると下記のエラーが発生

```
TypeError: exceptions must derive from BaseException
```

エラーをみても例外処理がどうのこうの言われていて全く心当たりがなかった。

## 解決方法
```
flask run --eager-loading
```
本来は遅延読み込みに関する実行方法らしいがこれで本来のエラーが表示されるようになった。

## 原因
調べてみるとFlaskのバグらしいので次のバージョンでは修正される模様
SFDC IDかどうかの判断（判断是不是SalesforceId)

 


```

/**
     * isSalesforceId
     * @description 参照コンポーネント用　SFDC IDかどうかの判断
     * @param str 判断文字列
     * @return 判断結果
     */
    public static Boolean isSalesforceId(String str) {

        Boolean rs = false;
        Integer len = str.length();

        if (len == 15 || len == 18) {
            String regex = '(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{' + len + '}';
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(str);

            List<String> kl = new List<String>();
            while(m.find()){
                kl.add(m.group());
            }

            if (kl.size() > 0)  rs = true;
        }

        return rs;
    }
```
VB.Net から移行した人のための C# Tips

VB.Net が、言語的な発展をしないということなどから、VB.Net を C# に移行しました。
その際に、もうちょっと早くに知っていればよかった、、、という C# 経験者には不要ですが、VB.Net から移行した人向けの Tips で検索にひっかかりにくいものをまとめてみました。
間違いがあったらすいません💦


#特定のModuleの関数をグローバル関数にしたい。
C# でグローバル関数を使う事の是非はあるかと思いますが、そんな時はソースの最初にこんなのを書きましょう。

```C#
using static Project.Module1;
```

これで、Module1 に書いた static な関数がグローバルに(クラス名を記載せずに)呼び出せるようになります。


#複数のファイルに共通した using を定義したい。
上のようなことをやろうとすると、すべてのファイルに `using` を書かないといけないので面倒ですよね。
~~VB.Net では、それをプロジェクトの定義でできたのですが、(たぶん)C#ではできません。
ソースコードを、他のプロジェクト等に移行しやすいように、プログラムはソースコードで完結すべきというのが理由のようです。
残念ですが、あきらめましょう。~~
コメントで[@karakun](https://qiita.com/karuakun)さんから教えていただきましたが、.NET 6 が使えるようになる C# 10.0 から `global using` で宣言できるようです。
詳細は[こちら](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using-directive)。

#System.IO.File を IO.File で記述したい。
C# では残念なことに、`using System;` と書いても、その namespace 内のクラスが直接書けるようになるだけです。
そのため VB.Net では `Imports System` と記述すると `System.IO.File` 内のクラスを書きたいときには、`IO.File` と書いて参照できましたが C# では参照してくません。
こんな時は、下記のように書きましょう。

```C#
using IO = System.IO;
```

参照先ひとつづつ書くのは面倒ですが、がんばりましょう。

#インデックスプロパティを使いたい。
VB.Net ではプロパティに引数をつけれるインデックスプロパティというのがあります。
**残念ながら、C# にはありません。**
Dictionary の Item のように、C# にもあるじゃないかと思うこともありますが、これは各クラスに一つだけインデクサとして作成することができます。
VB.Net では次のように、Default をつけたプロパティが、C# でいうインデクサに相当します。そのため一つしか作成できません。

```VB
Public Default Property Hoge( key As String )
```

回避するには、次ぐらいでしょうか。

1. 代入構文での記述をあきらめて、SetHoge というような関数を作る。
2. 配列や、Dictionary オブジェクトを返すようにする。
3. 専用のクラスを作る。

これだけでも、それぞれをまじめに書くとけっこうな量になるのでとりあえずこれぐらいで。


#==演算子のoverload はやめておいた方がいい。
あんまり使ってる人もいない気がしますが、まれに==演算子を overload することがあるかと思います。
VB.Net では Nothing との比較に Is や IsNot を使う事が多いので Nothing との比較に ==演算子を使う事はあまりないかと思いますが、C# では isnot 比較演算子がないことから null との比較を == や != でやることが多いです。
その際に、== 演算子を overload していると想定外の動作をすることがあります。詳しくは、[こちら](https://ufcpp.net/blog/2020/12/isnull/)

#イベントを一覧から追加したい。
VB.Net だと、ソースエディタの上の方でイベントを追加できましたが、C# では(たぶん)できません。
プロパティウィンドウの中に「雷」アイコンがあるのでそこから追加しましょう。
![vb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84226/fb9595b4-40a3-1f92-0ca6-9a81daa833dd.png)

#ByRef 相当の構文は二つある。
VB.Net は値の参照渡しで、ByRef という構文要素がありました。
これは C# では `out` と `ref` と二つに分かれます。使い分けは、こんな感じ。

```C#
void Hoge( out int value ) {
    value = 0;
}

void Fuga( ref int value ) {
    value = ( value == 0 ? value : value + 1 );
}
```

つまり `out` は中身を参照しない値、`ref` は値を参照したうえで結果も渡す場合。
ぶっちゃけ、`ref` だけでもそんなに問題ない気もしますが、ちゃんとしておくと変数の初期化の警告で丁寧に教えてくれるので幸せになれます。


#カッコとかのコーディング規則は、後から決めてもいい。
VB.Net だとほとんど強制されるので気にしなくてよかったですが、C# では、`{` の位置とか、いろいろ決めたくなります。
これは、後から Visual Studio のツールで一括変換できるので後から考えても大丈夫。
VB.Net だと、`Me` をつけるかどうか統一されてなかったりしますが、C# はこういうのもツールで一括変換できるのでこういうところでも C# にしてよかったなぁと思っちゃいます。
java:5: エラー: この文字(0x98)は、エンコーディングwindows-31jにマップできません

#はじめに
はじめまして。
駆け出しJavaエンジニアです。
研修中初歩的なところで躓きまくっているので、アウトプットとして駆け出しエンジニアの方々のお力になれたらうれしいです。
環境はwindowsで、

#今回のエラーと直し方
java:5: エラー: この文字(0x98)は、エンコーディングwindows-31jにマップできません
というコンパイルエラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1302414/7dca4bd2-f3b1-c290-e46e-9118a6484c14.png)

結論を言ってしまうとサクラエディタの文字コードが間違っておりました。
右下の文字コードのところクリックで他の文字コードに変えることができます。
デフォルト設定がUTF-8で、その部分をSJISにしたら無事コンパイルされました。

以下の@HachiwareWorks様が書いた記事のやり方でも無事コンパイルできたので、参考として張らせていただきます。


#参考にしたサイト
https://qiita.com/HachiwareWorks/items/2b23b180d328df597fe4
RX65N のクロスコンパイラーを使う

Ubuntu 21.04 で確認しました。

次のサイトからダウンロードします。
[Toolchainsダウンロード Renesas RX](https://llvm-gcc-renesas.com/ja/rx-download-toolchains/)
ダウンロードするには、ログインする必要があります。

次のファイルがダウンロードされます。
>gcc-8.3.0.202102-GNURX-ELF.run

インストール

```bash
chmod +x gcc-8.3.0.202102-GNURX-ELF.run
./gcc-8.3.0.202102-GNURX-ELF.run
```

$HOME/toolchains にインストールされます。

パスの設定

```text
(省略)
export PATH=$PATH:/home/uchida/toolchains/gcc_8.3.0.202102_gnurx-elf/bin
```

ログインし直してパスを有効にします。

バージョンの確認

```text
$ rx-elf-gcc --version
rx-elf-gcc (GCC_Build_20210527) 8.3.0.202102-GNURX 20190222
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

サンプルのプログラム

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

int main(void)

{   
  int ret;

  ret = printf("Hello World!\r\n");

  return ret;
}
```

```text:Makefile
hello.out: hello.c
	rx-elf-gcc  hello.c -o hello.out -g -msim
clean:
	rm -f hello.out
```

実行

```text
$ rx-elf-run hello.out
Hello World!
```

もう少し複雑なサンプル

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

void main(void)
{   
	printf("*** start ***\n");

	int nmax = 20;
	for (int it=1; it<nmax; it++)
		{
		int it2 = it * it;
		for (int jt=it; jt<nmax; jt++)
			{
			int jt2 = jt * jt;
			int itjt2 = it2 + jt2;
			for (int kt=jt; kt<nmax; kt++)
				{
				int kt2 = kt * kt;
				if (itjt2 == kt2)
					{
					printf("%d\t%d\t%d\n",it,jt,kt);
					}
				}
			}
		}

	printf("*** end ***\n");

}
```

```text:Makefile
ex01.out: ex01.c
	rx-elf-gcc  ex01.c -o ex01.out -g -msim
clean:
	rm -f ex01.out
```

実行結果

```text
$ rx-elf-run ex01.out
*** start ***
3	4	5
5	12	13
6	8	10
8	15	17
9	12	15
*** end ***
```

RX デバイスへのプログラムの書き込み方法についてはこちら
[Renesas RX マイコン・フラッシュ・プログラミング・ツール (rx_prog)](https://github.com/hirakuni45/RX/blob/master/rxprog/READMEja.md)

コンパイル

```bash
git clone https://github.com/hirakuni45/RX
cd RX/rxprog/
make
```

バージョンの確認

```text
$ ./rx_prog
Renesas RX Series Programmer Version 1.30
Copyright (C) 2016,2020 Hiramatsu Kunihito (hira@rvf-rc45.net)
```

rx_prog の使い方については、こちら
[マルチプラットホーム、ＲＸマイコン、フラッシュプログラム](https://qiita.com/hira_kuni_45/items/6c09cc1381f30c7364c7)
「スーパーリロード」location.reload(true)は現在使えない


#キャッシュを使用しないリロードを実装したかった。

javascript スーパーリロード 等で検索すると
location.reload(true)
trueを入れるとサーバーから読み込むが多数出てきたので、すぐ実装。
しかし、動作は上手くいかず...。
いろいろ調べた結果を書きます。

##スーパーリロード不可能
```javascript:javascript
location.reload(true)
```

##リダイレクト設定
```javascript:javascript
window.location.href = window.location.href
```
こちらなら実質スーパーリロード。
キャッシュを使用せずサーバーから直接読み込みます。

```javascript:jQery
$(document).ready(function(){
    if(document.URL.indexOf("#")==-1){
    url = document.URL+"#";
    location = "#";
    window.location.href = window.location.href;}
});
```
直入れだと画面が開いた途端に、画面が移動してしまいそうだったのでif文を追加。

###参考サイト
https://highmoon-miyabi.net/blog/2020/10/29_000581.html

https://flutterq.com/location-reloadtrue-is-deprecated/

https://try2explore.com/questions/jp/10142227

#まとめ、学び
公式ドキュメントに書いていないことは出来ないのかもしれない。
MySQLのint型をint(11)にする必要ある？単純にintでいいのではないかと。

#【MySQLのint型をint(11)にする必要ある？単純にintでいいのではないかと。】

##MySQLのint(11) ： MySQLの方言

- ()内で指定した桁数に満たない場合は、左側を空白で埋める。
- int(11)は表示幅を11に指定している
- 表示に関する指定をしているだけ。
- ※ 有効桁数の指定をしている訳ではない
- 格納するデータに関する指定では決してない。


**int(11)でもint(1)でもint型に入れられる値の範囲は同じ　　**
　→　それなら、intにZEROFILLを指定する意味ってある？？
　→　パフォーマンスにも特に影響がないので何か理由がない限りは不要で良いと思いました

（この解釈が誤っている場合はご指摘くださいm(_ _)m）

##int型に入れられる値の範囲

- **signed：** -2,147,483,648　～　2,147,483,647
- **unsigned：** 0　～　4,294,967,295
【Rspec】before / let / let!

##環境
Ruby 3.0.2
Rails 6.1.4.1

##before
describeやcontextの内部に書いたテストを実行するたびに毎回実行されるため、使う必要のないデータを作成してテストを遅くする原因になることがある

```spec/models/article_spec.rb
describe "文字列に一致する記事を検索する" do
    before do
      @article1 = create(:article, title: "first")
      @article2 = create(:article, title: "second")
      @article3 = create(:article, title: "first article")
    end

    context "一致する記事が見つかるとき" do
      it "検索文字列に一致する記事を返すこと" do
        expect(Article.search(title: "first")).to include(@article1, @article3)
        expect(Article.search(title: "first")).to_not include(@article2)
      end
    end
end
```

##let
letは呼ばれたときに初めてデータを読み込む、遅延読み込みを実現するメソッド

letを使うメリットは下記の記事がわかりやすい

https://qiita.com/jnchito/items/cdd9eef2ed193267c651

```spec/models/article_spec.rb
describe "文字列に一致する記事を検索する" do
    let(:article1) { create(:article, title: "first") }
    let(:article2) { create(:article, title: "second") }
    let(:article3) { create(:article, title: "first article") }

    context "一致する記事が見つかるとき" do
      it "検索文字列に一致する記事を返すこと" do
        expect(Article.search(title: "first")).to include(article1, article3)
        expect(Article.search(title: "first")).to_not include(article2)
      end
    end
end
```


##let!
letとは異なり、let!は遅延読み込みされずすぐ実行されるためデータがすぐ作成される

```spec/models/article_spec.rb
describe "文字列に一致する記事を検索する" do
    let!(:article1) { create(:article, title: "first") }
    let!(:article2) { create(:article, title: "second") }
    let!(:article3) { create(:article, title: "first article") }

    context "一致する記事が見つかるとき" do
      it "検索文字列に一致する記事を返すこと" do
        expect(Article.search(title: "first")).to include(article1, article3)
        expect(Article.search(title: "first")).to_not include(article2)
      end
    end

    context "一致する記事が見つからないとき" do
      it "空のコレクションを返すこと" do
        expect(Article.search(title: "third")).to be_empty
        expect(Article.count).to eq 3
      end
    end
end
```


##参考

https://qiita.com/jnchito/items/cdd9eef2ed193267c651