OmniAICreator/Qiita-1.07M huggingface dataset:
formにsubmit先が異なる複数のボタンを設置する

１つのformに送信先が異なる複数のボタンを設置する必要があったのですが、盛大にハマってしまったので備忘録です。
##方法

```html:index.html
<form method="POST" action="?">
  <input type="checkbox" name="tests[]" value="test1" />test1
  <input type="checkbox" name="tests[]" value="test2" />test2
  <input type="checkbox" name="tests[]" value="test3" />test3
  <button type="submit" name="_method" value="post" formaction="送信先のアドレス"></button>
  <button type="submit" name="_method" value="delete" formaction="送信先のアドレス"></button>
</form>
```
##解説

ポイントはformタグの`action`属性値を**「？」**にすることです。

formタグ内にsubmitボタンが１つの場合は、「送信先のアドレス」を設定しますが、
今回のような複数のsubmitボタンを用意する場合は、「送信先のアドレス」をbuttonタグの`formaction`属性に設定します。

ちなみにこの`formaction`属性はHTML5から使えるようになりました。
ファイルをEC2からS3にcronで定期バックアップする

## 経緯

EC2上に建てたkubernetesのログをEC2インスタンスの外に保存したかった時のお話。
EKSやGKEを使えばそのへんサクッと出来るみたいですが、今回はそれらを利用しない前提です。
半分くらいポリシーとロールの作成方法の説明になってしまいましたが、備忘録として載せておきます。

## 手順

### S3バケットの作成

ない場合は作成しておく

### EC2にIAMロールをアタッチする

保存先のS3を操作するためのIAMロール。
既に使えそうなロールがある場合はそれを利用しても良い。
ない場合は [IAMロールの割り当て/置換] から作成出来る。
<img width="513" alt="スクリーンショット 2020-03-05 12.21.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/1ea7e59a-01ef-8e3b-8e1a-26aa4116dac2.png">

* [新しいIAMロールを作成する]
* [ロールの作成]
* 「EC2」を選択して [次のステップ：アクセス権限]
* [ポリシーの作成]
    * サービス
        * S3
    * アクション
        * リスト/ListBucket
        * 読み込み/GetObject
        * 書き込み/PutObject
    * リソース
        * bucket [ARNの追加]
        * object [ARNの追加]
            * ディレクトリを制限する場合は ObjectName に入れる
            * 制限しない場合は すべて にチェックを入れる
* [ポリシーの確認]
* 適当な名前をつけて [ポリシーの作成]
* 作成が完了してポリシー一覧に戻ったら、ロール一覧に戻る
* ロール一覧を更新し、作成したポリシーを選択
* [次のステップ：タグ] → [次のステップ:確認]
* 適当なロール名をつけて [ロールの作成]
* 作成が完了しロール一覧に戻ったら、IAMロールの割り当て/置換画面に戻る
* IAMロール一覧を更新し、作成したロールを選択
* [適用]


### `aws s3 sync` を使う

バケットとディレクトリを指定すると、その内容を同期してくれる超便利コマンド。
指定のディレクトリとバケットの内容を比較し、バケットにないもののみアップロードしてくれます。
指定の同期先からデータが消えたとしても、S3上のオブジェクトは削除されないので安心。

今回はこれをcronで定期実行することで、EC2上のログをS3にアップロードします。

* awsコマンドが無い場合はインストールする [[手順](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)]
* `aws sts get-caller-identity` でアタッチしたIAMロールがちゃんとあるか確認
* `aws s3 sync EC2の同期先 s3://バケット名/ディレクトリ名(あれば)` で同期されるか確認

### cronを設定する

`aws s3 sync` が使えることが確認出来たら、あとはこれをcronに定期実行させるだけです。

* `crontab -e` で設定ファイルを開いて以下のように書き込む

```
*/1 * * * * /bin/bash -c ". /ホームディレクトリ/.bash_profile; 成功したawsコマンド"
```

今回は1分置きの設定。
最初に `.bash_profile` を読み込んでいるのはパスの設定を反映させるため。
awsコマンドを絶対パスで書くでも良かったかもしれない。

* `crontab -l` で設定済のジョブを確認

### おまけ

cronの実行ログを確認したい場合は、 `crontab -e` で開いた設定の末尾にこいつを書く。

```
> /ログの出力先 2>&1
```
HTMLの基本

# head要素
ウェブサイトの情報や、参照するCSSファイルを記載する部分です。ここに記述した情報は画面上には表示されない。
例

```
<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <title>サイトタイトル</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
  </body>
</html>
```

# body要素
画面上に表示したい情報を記載するところ。
要素はタグというものに囲まれて表現される。

# タグ
HTMLにおける要素のかたまりを示す記述です。
開始タグと終了タグで囲むことによって、コード全体のうち、どこからどこまでがhead要素で、どこからどこまでがbody要素か判断することができる。また、終了タグには/がある点に注意する。

# <!DOCTYPE HTML>
この文章がHTML文章であることを宣言する要素。閉じタグはない。
この要素を記述していないと、レイアウトが崩れたり、表示がされない場合がある。

# ＜html＞...＜/html＞
HTML文章の始まりと終わりを示す要素。

# ＜head＞...＜/head＞
ウェブサイトの情報を記述する部分。

# ＜div＞...＜/div＞
「特定の意味が無い」要素。汎用的に様々な用途で使うことができ、レイアウトを作成する際に重宝される。
classセレクタを付与して使用。

# ＜footer＞...＜/footer＞
フッターを示す専用の要素。
コメント数やコピーライトをfooter要素で囲うことによって、下部にあることがHTMLだけでわかるようになる。
footer要素は、ブロックレベル要素。

# ＜meta＞
文章に関する情報を指定する時に使用する。閉じタグが無い要素なので、注意する。
後に続く、charset="UTF-8"は文字コードを指定するもので、この記述が無いと文字化けしてしまう。

# ＜title＞...＜/title＞
ウェブサイトのタイトルを記述する場所。ここにタイトルを記述してもウェブサイトの画面上には表示されない。
Googleでの検索結果や、ブラウザのタブに表示するタイトルとして使用される。

# ＜link rel="stylesheet"＞
この記述によって、対応するCSSファイルを指定することができる。hrefには実際のファイル名を記載する。
＜link rel="stylesheet" "href="参照すべきCSSのファイル名を指定"＞

# ＜h1＞...＜/h1＞
文章の見出しを指定するもの。
＜h1＞.../＜h1＞で囲むと見出しと判断されて文字が太く大きく表示される。

# ＜p＞...＜/p＞
文章の段落を表すもの。
＜p＞...＜/p＞で囲むとひとかたまりの文章として認識される。

# ＜b＞...＜/b＞
文字を太くする要素。＜b＞...＜/b＞で囲まれている部分だけ太字になります。
上記のような要素はたくさんのものが存在する。

# ブロックレベル要素
ウェブデザインにおける箱となる要素の事。
＜h1＞...＜/h1＞や＜p＞...＜/p＞はブロックレベル要素。

# インライン要素
ウェブデザインにおける箱にはならず、主には文字の修飾などに使われるもの。
＜b＞...＜/b＞はインライン要素です。
GitHub ActionsにSSHで入る(簡単3ステップ)

## 1. SSHしたいタイミングに`action-tmate`を使うステップを差し込む

```yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    # 略(色々なstep)
    - name: Setup tmate session
      uses: mxschmitt/action-tmate@v3
    # 略(色々なstep)
```

## 2. Actionsのワークフローを動かす

pushする、PRを立てる等、ワークフローを動かすためのトリガーを実行してください。

ワークフローが動き出すと、`action-tmate`が動くステップでずっと止まっているので、そこを選択。

<img width="297" alt="スクリーンショット 2020-03-05 12.48.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/029b9d4c-21d6-1176-19bb-dae020fcd18e.png">

SSHコマンドが書かれているのでコピーする。

<img width="561" alt="スクリーンショット 2020-03-05 12.49.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/2e01925a-3e0f-cc1e-c2b9-0c468bfe5aad.png">

## 3. SSHログインする

ターミナルで先ほどコピーしたSSHコマンドを実行。

<img width="570" alt="スクリーンショット 2020-03-05 12.52.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/8cf0eec8-90de-f731-7a54-ca2208923292.png">

以上、3ステップでした。

## 後始末

SSHログイン後にやりたい作業が終わったら、ワークフローを停止しましょう。

![スクリーンショット 2020-03-05 12.59.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317369/3ce9ba8a-daa8-de73-6532-b08aa8a2decf.png)

## 参考

- [GitHub Actionsでtmateを使ってシェルに繋いでデバッグする](https://blog.n-z.jp/blog/2019-11-10-github-actions-tmate.html)

- https://github.com/mxschmitt/action-tmate
PyCharm入門 project-level dictionary について

## 対象
PyCharm初心者

## 動作環境
Windows10
Pycharm

## 事の発端
PyCharmでSave xxxxxx to Project-level dictionry を実行したらどうなるのかのメモです。

## project-level dictionary
pycharmで自分で指定した文字列に下線がつく。
下線がついた文字にカーソルをあわせて、More Actionを選択すると、以下の表示がでてくるので、Save [文字列] to Project-level dictionry を選択すると、Project-level dictionryができる。
![pycharm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262477/2ed4c571-0b9d-fa72-372b-aa52502999b5.png)

## 出力ファイルはどこにあるのか
.idea/dictionaries/xxxxxx.xml

## 感想
便利さがまだ良くわかっていない。
ただ、下線が消えて見やすくなります。
時差出勤始まったので退勤時刻を教えてくれるBotを作った

昨今の感染症の影響で時差出勤が始まったので
出勤時間を投稿すると退勤時間を教えてくれるBotを作ってみました。

## 環境
* python 3.6.6
* Heroku

## 参考
SlackBotプロジェクトのディレクトリ構成、Herokuとの連携については以下サイトを参考にさせていただきました。
https://qiita.com/akabei/items/ec5179794f9e4e1df203

## ソースコード
上記、参考にさせていただいたサイトを元にSlackBotの動作が確認できた（おみくじ引けた）ので、退勤時間を計算するコードを作成していきます

・投稿時刻を出社時刻として退勤時間を計算する

```python
from datetime import datetime, timedelta, timezone
from slackbot.bot import listen_to

@listen_to(r'^出勤$')
def work_time(message):
    JST = timezone(timedelta(hours=+9), 'JST')

    start_now = datetime.now(JST)
    end_time = start_now + timedelta(hours=8, minutes=45)
    message.reply(end_time.strftime("%H:%M"))
```
実行結果 ↓↓
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318316/42ac1c3e-3a61-63b5-c59b-dd76aa6e4288.png)

これだと出社してすぐにメッセージを送らないといけないので、時間指定できるパターンも作ります

・出勤時刻を指定して退勤時刻を計算する

```python
import re
from datetime import datetime, timedelta, timezone

from slackbot.bot import respond_to, listen_to

@listen_to(r'^出勤\s[0-9]+:[0-9]+$')
def work_time(message):

    JST = timezone(timedelta(hours=+9), 'JST')
    current = datetime.now(JST)

    text = message.body['text']
    result = re.match(".*\s([0-9]+):([0-9]+)", text)

    hour = result.group(1)
    minute = result.group(2)

    start_now = datetime(
        year=current.year,
        month=current.month,
        day=current.day,
        hour=int(hour),
        minute=int(minute))
    end_time = start_now + timedelta(hours=8, minutes=45)
    message.reply(end_time.strftime("%H:%M"))
```
実行結果 ↓↓
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318316/6d47dd6f-1101-e3ad-4db8-a46a94cf0f0f.png)

こでれ何時に出社しても、定時は何時だ？と悩まなくてもよくなりました

## まとめ

・（わかりやすくまとめていただけていた記事があったので）SlackBotをデプロイしてやりとりできるようになるまでが簡単だった
・多くの人が時差出勤になったことで、遅い時間の電車が混んできたので結局元の時間に戻って、Botの活躍の場はなくなってしまった
vue-cli-3で作成したアプリを、bitbucket pipelinesでS3にデプロイする方法

# 参考
- [Continuous deployment of Vue.js app to AWS using Bitbucket Pipelines](https://dev.to/pavanvora/continuous-deployment-of-vue-js-app-to-aws-using-bitbucket-pipelines-3ol7)

# bitbucket-pipelines.yml

```
image: node:10.15.3

pipelines:
  branches:
    master:
      - step:
          name: Build
          caches:
            - node
          script: # Modify the commands below to build your repository.
            - yarn
            - yarn run build --mode staging
          artifacts:
            -dist/**
      - step:
          name: Deploy to S3
          deployment: staging
          script:
            - pipe: atlassian/aws-s3-deploy:0.4.1
              variables:
                AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID
                AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY
                AWS_DEFAULT_REGION: "us-west-1"
                S3_BUCKET: "YOUR_BUCKET_NAME"
                LOCAL_PATH: "dist"
                ACL: "public-read"

```

- この例ではステージング環境にデプロイします。
- masterブランチにマージした時のみパイプラインを実行します。
FujiSSLのDNS認証でつまづいた件

[FujiSSL](https://www.fujissl.jp/)は

* 手続きが迅速
* 費用が低廉

なので重宝している。

さて今般あるサブドメインについて更新を行うにあたって、つまづいたことがあったので共有する。
# シーン
私のケースは以下の条件だった。

1. 以前に既にFujiSSLで取得したSSL証明書の更新
2. DV（ドメイン認証）クラス
    3. EVやOVではない
4. ドメイン使用権の確認方法を「DNS認証」方式を選択した

FujiSSLにおける「ドメイン使用権」確認方法は、昨年2019年11月19日以降、ドメイン認証（DV証明書）にも「DNS認証」を選ぶことができるようになった。

[認証方式追加のお知らせ（ドメイン認証※DV証明書）](https://www.fujissl.jp/info/1970/)

新規取得であれば仮のホスティング環境を設けて「ファイル認証」を選んでもいいし、メールサーバを既に立てていれば「メール認証」を選んでもいいが

> DNS認証はWEBサーバを公開できない、メールサーバを公開できない方にもFujiSSLの発行を可能にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43711/d3b3fec2-ef26-cd5d-882b-def728233aca.png)

というのが魅力で、今回はこの「DNS認証」を選択した。選択した画面はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43711/449c6b44-03ac-4522-03cd-d0ffd5cbab0d.png)

# ケース
私が更新しようとしたDV認証SSLのドメインは、いわゆる「www」ドメインや「wwwなし」つまり「ネイキッドドメイン」ではなく、特定のサブドメインを付したドメインだった。ここでは仮に

```
sub.hoge.com
```
とする。
##届いたメール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43711/8f549d84-19b8-a2ce-9c11-2f7177053d01.png)

##私の過誤
以下の記述を見落としてしまった

>※DNSの設定は申請ドメイン（例：aaa.bbb.example.com）のベースドメイン（例：example.com）に
　対する設定になります。

というのも少し上にあった、この記述に首を傾げていたいたせいで、注意力が散漫になっていました。

> サブドメイン：無し
※サブドメインがある場合は、サブドメインがついた
　TXTレコードも同じ値で追加してください。

大反省。

### 当初DNSに設定したTXTレコード

```
sub.hoge.com. IN TXT "202003041643030A04A88A2CC98F41BED0F050A1E14F190B3EA0CB1EE7146125765ED1A3291B60"
```

これだけ設定して、FujiSSLから「ドメイン所有権を確認しました！」みたいなメールが届くのを首を長くして待ち続けていました（ざっと半日）。

### 不足していたTXTレコード

```
hoge.com. IN TXT "202003041643030A04A88A2CC98F41BED0F050A1E14F190B3EA0CB1EE7146125765ED1A3291B60"
```

はい、つまりネイキッドドメインと両方にTXTレコードを設定せねばならかったのでした。

#反省したこと
指示の要点に注意して処理を行うこと。
MacOSでもMicrosoft Teamsを使え

> そもそも、私はMicrosoftの回し者でもなんでもありません。
使っているPCはMacOSです

## そもそもMicrosoft Teamsは無料
https://products.office.com/ja-jp/microsoft-teams/free

なんと無料です。
もちろん企業用の有料版もあります。（そもそも企業でOffice365契約したらついてくいるのでわ）

## 通話・ビデオ通話・画面共有完備
ビデオ通話は簡単にできます。
![スクリーンショット 2020-03-05 12.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/74d995b8-9616-e9df-c29a-3c8684b43e75.png)

### カメラのボタンを押せばビデオ通話ができます。
音声だけで通話する場合は受話器のボタンを押すだけです。

### 画面の共有・制御がかんたん
相手にプレゼンの資料見せながら会話したりすることができます。
さらにに画面操作の権限を渡せば許可したユーザーに自分のパソコンを操作させたり逆に権限を貰えば操作もできます。
#### MacOSも対応
これはWindows→Windowsはもちろん
Windows→Mac
Mac→Windowsも可能です。
ただし、Macでやる場合は制御系のプライバシーに許可を入れないと画面共有や画面制御できないので使用する場合はセキュリティとプライバシーの設定をしっかりと確認する必要があります。

<img width="608" alt="スクリーンショット 2020-03-05 12.10.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/ad0849ff-2800-99eb-2571-da7a945c6263.png">

<img width="637" alt="スクリーンショット 2020-03-05 12.10.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/6ddc2a9c-b391-d544-f722-a5f4e7ee03fd.png">

共有してるときは自分と共有相手のアイコンとカーソルが見えてます
<img width="96" alt="スクリーンショット 2020-03-04 17.07.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546003/797db3dc-5ee8-ad1d-0b55-07b38c2aff1b.png">


## Sharepointとの連携
Teamsで投稿したりしたファイルは企業アカウントであれば企業アカウントのSharepointに保存されます。Office365ユーザーであればSharepointに保存されているファイルをいつでもどこでも編集保存できます。


## 外部の招待もできる
https://docs.microsoft.com/ja-jp/microsoftteams/guest-access
社外の人とかを招待して会議も可能です。


## Teamsを使え
リモートワークの環境を構築することが急がれている現在、Teamsを導入することでリモートワークを円滑にすすめることができるはずです。
Office365ユーザーであれば使わない理由はないはずです。
最近ではPower Automateを使ってOffice製品を連携させることもできますのでぜひ色々検討してみてはどうでしょうか。

4月より正式サービス開始ですしね。
https://us.flow.microsoft.com/ja-jp/

ちなみにうちの会社はWindowsOSをメインで使っていて、私一人MacOSを使っているのですがOffice365を使っているのでWord・Excel・PowerPointを違和感なく使えますしRemote Desktopを使ってWindows機に入って検証したりTeamsでメンバーと連絡はかんたんに取れるのでWindowsじゃなければいけない理由は特にないです。

(っ’ヮ’c)ｳｩｯﾋｮｵｱｱｧｱｱｱｧ

3/5　13:16追記
MicrosoftからOffice365のE1トライアルが半年無料だそうです。
https://docs.microsoft.com/ja-jp/microsoftteams/e1-trial-license
なんかタイムリー。
色々条件はあるかもしれませんが企業の方は導入検討になるんではないでしょうか。
AWS データベースサービス　DynamoDBについて

#DynamoDBとは
マネージド型のNosqlデータベースサービス。
DynamoDBはリージョンサービス
<img width="749" alt="スクリーンショット 2020-03-05 12.45.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/19992315-8b17-99df-bb49-4881502ef8f6.png">

###ポイント
DynamoDBのアクセス制御はIAMで行い、EC2インスタンス上で実行されるプログラム認証はIAMロールを活用する


#DynamoDB特徴
• 完全マネージド型の NoSQL データベースサービス
• ハイスケーラブル、低レイテンシー
• 高可用性– 3x レプリケーション
• シンプル且つパワフルAPI
• ストレージの容量制限がない
• 運用管理必要なし

##ストレージの容量制限がない
• 使った分だけの従量課金制のストレージ
• データ容量の増加に応じたディスクやノードの増設作業
は一切不要

##管理不要で信頼性が高い
• 単一障害点（SPOF）を持たない構成
• データは3箇所のAZに保存されるので信頼性が高い

##プロビジョンドスループット
テーブルごとにReadとWriteそれぞれに対し、必要な分だけのスループットキャパシティを割り当てる（＝プロビジョンする）ことができる

• 例えば下記のようにプロビジョンする
– Read : 1,000
– Write : 100
• 書き込みワークロードが上がってきたら
– Read : 500
– Write : 1,000
• この値はDB運用中にオンラインで変更可能


##強い整合性の読み込み
##Write
• 少なくとも２つのAZでの書き込み完了が確認とれた時点でAck
##Read
• 結果整合性のある読み込み
• 最新の書き込み結果が即時読み取り処理に反映されない可能性がある
• Consistent Readオプションを付けたリクエスト
• GetItem、Query、Scanでは強力な整合性のある読み込みオプションが指定可能
• Readリクエストを受け取る前までのWriteがすべて反映されたレスポンスを保証
• Capacity Unitを２倍消費する

#DynamoDBが使われているユースケース
###KVSとして
ユーザー情報の格納するデータベース

###広告やゲームなどのユーザー行動履歴DBとして
ユーザーIDごとに複数の行動履歴を管理するためのデータベース

###モバイルアプリのバックエンドとして
モバイルアプリから直接参照できるデータベースとして]

#最後に
参照
サービス別資料参照
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
Amazon DynamoDB
LT用: 最近寝る前に見てる動画の話

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/eac35463-82de-8baa-e708-d9637f5ebdce.png)
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/b47eea02-9893-d520-40b1-e0f66cd712a9.png)
![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/28f9bd97-e419-86ad-d69b-e1b52707516c.png)
![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/51cd396b-8b8e-baae-0b70-2f1b25f688b0.png)
![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/bde0f608-a54e-11ee-515d-b89c63ff6a4f.png)
![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/02f5106d-6ca2-57b4-17c1-1abbc8971881.png)
![スライド7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/1c5fb16d-8115-68ac-5f46-104e43bddd3b.png)
![スライド8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/7255774f-64a5-97b2-4038-4bd5730ac0db.png)
![スライド9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/9a70823f-5b75-909e-0763-8d655173a972.png)
![スライド10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/989d993c-fdaf-d4fc-e0a7-bc17b5510124.png)
![スライド11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/664781da-2e5a-c6ec-21cc-d34903a54ae5.png)
![スライド12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/3ad50582-878e-dd5e-a750-55e5ee7c8291.png)
![スライド13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/69589dab-caa3-abda-2d3b-eb0463558863.png)
![スライド14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/e8eb10f3-aff0-0316-c380-ea2910dd620a.png)
![スライド15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/a96851e3-71b8-5c13-2a30-628b247a822b.png)
![スライド16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/e57b39d9-6d18-688d-c18c-9f8238f61a73.png)
![スライド17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/79e3efeb-7364-cdbe-bc05-35fbdd8535ef.png)
![スライド18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/44dbbaac-655d-6504-81a2-44f956012bf5.png)
![スライド19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420547/1de5a705-3492-b975-d0ff-dae0e175b89d.png)
TortiseGitでDisconnectedエラー

TortiseGitでGithubからリポジトリをクローンしようとした際にエラーが発生。
>Disconnected: No supported authentication methods available (server sent:publickey)

Gitをしばらく使っていなかったので、何か設定が変わったかな。

調べたところ、どうもGithubとの接続時にSSH認証がうまくいってないみたい。。
TortiseGitはPageantというツールを用いて認証鍵を管理しているらしく、
Pageantに鍵を認識させることでGithubリポジトリにアクセスできるようになった。

## 1.Putty Key Generatorで鍵を生成
Puttyを起動し、「Generate」で鍵を生成。
マウスの動きに応じて鍵を作っていくらしいので、ひたすらマウスを動かす。。
生成されたキーはどっかにコピペしておく。

## 2.鍵を保存
「Save Private Key」でppk形式で鍵を保存。

## 3.pageantに鍵を認識させる 
2で保存した鍵をpageantに登録。
>pageant C:\private_key_path\id_rsa.ppk

## 4.GitHubにSSHキーを登録
GithubのSetting > SSH Key and GPG keysで１でコピペしたキーを登録。

上記を実行後、再度クローンすると成功した。

参考
https://paskov.vmsoft-bg.com/tortoisegit-disconnected-no-supported-authentication-methods-available-server-sent-publickey/
https://qiita.com/EvilSpirit39/items/d383c5dc1e0be0c6bbde
[linux] sudo su しようとしたら /usr/local/bin/zsh　を実行できなとき

# はじめに
sudoでコマンドが見つかりませんになったので
suしてrootユーザのパスを設定しようと思ったら拒否られたので調べました

# 原因
bashからzshに移行したさいに~~手違いでrootのデフォルトシェルが/usr/local/bin/zshになってしまったか~~、そもそもrootシェルの設定をしてないが原因とみられる

<font color="Red">rootパスを設定していないので、chshでrootシェルを設定できるはずがない！</font>


```terminal:実際のパス
❯ echo $SHELL                                      
/usr/bin/zsh
```

# まずシェルを変更する

```
sudo chsh root -s /usr/bin/zsh
```

####認証失敗のとき
```
sudo chsh root -s /usr/bin/zsh
chsh: PAM: 認証失敗
```

`/etc/pam.d/chsh`を編集してシェルを変更できるようにする。

```
#
# The PAM configuration file for the Shadow `chsh' service
#

# This will not allow a user to change their shell unless
# their current one is listed in /etc/shells. This keeps
# accounts with special shells from changing them.


# ここをコメントアウトする
# auth       required   pam_shells.so

```

この状態でもう一度`sudo chsh root -s /usr/bin/zsh`すれば変更できる。
変更できたら、コメントコメントアウトした行を元にもどす。


# rootパスを変更する


```
$ sudo su -
```
```
$ passwd root

新しい UNIX パスワードを入力してください: xxx
新しい UNIX パスワードを再入力してください: xxx
passwd: パスワードは正しく更新されました

$ exit
```
Pandas DataFrame を CSV ファイルとしてダウンロードさせる

Web サーバを Python で作っていて、Pandas DataFrame を CSV ファイルとしてダウンロードさせたいときのメモ。

``` python
body = df.to_csv(index=False).encode('utf_8_sig')
headers = {
    'Content-Type': 'text/csv',
    'Content-Disposition': 'attachment; filename="data.csv"',
}
return web.Response(body=body, headers=headers)
```

これは aiohttp Server の例だが、他のフレームワークでも同様だと思う。

- `pandas.DataFrame.to_csv` は出力先を指定しなければそのまま CSV 文字列を返してくれる
- CSV ファイルが Excel で開かれることが想定される場合は `utf_8_sig` (BOM 付き UTF-8) でエンコードしておくと文字化けしなくて良い
- `Content-Disposition` ヘッダを付加することでダウンロード時のファイル名を指定することができる
    - 日本語ファイル名を使う時はエンコードが必要

このあたりがポイント。
【Power BI Report builder】Azure Analysis Servicesに接続した際の"指定された資格情報を使って認証トークンを取得できません"のエラーへの対応について

# 【Power BI Report builder】Azure Analysis Services(以下、AAS)に接続した際の"指定された資格情報を使って認証トークンを取得できません"のエラーへの対応について

　Power BI Report builderにて、AASに接続した際に、下記のエラーにより接続ができなかった場合、"資格情報"タブにて、”資格情報を使用しない”に設定することで解決したので共有します。





>指定された資格情報を使って認証トークンを取得できません。
(英語表記:Unable to obtain authentication token using the credentials provided.)
![erro_message.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bc7d191c-5cc6-c95f-1f95-3ea8568859ae.png)




## 留意事項

本情報は、2020年3月5日時点での情報です。



## 前提事項

Power BI Report Builderのバージョン	：	15.0.1517.0



## 対応方法

1. AASの情報を入力して、"OK"を選択します。この際に、"Test Connection"を選択すると、エラーとなります。
![image-20200305110311625.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a6a61f47-3db2-5c7e-9d63-69afc1e5ac21.png)
![image-20200305105456055.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/cfd27e6b-09b2-1e2a-91fa-8b459fa8d864.png)





2. "資格情報"タブにて、"資格情報を使用しない"を選択します。
![image-20200305105931856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e1f63fcd-6518-f822-aa69-dd3aefc50a20.png)



3. ”全般”タブを選択後、”接続テスト”を選択すると、"接続が正常に作成されました"と表示され、接続テストが正常終了することを確認します。”接続テスト”を選択した際に、ログインが求められる場合があります。
![image-20200305111018061.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/85446a67-55cb-cc76-ed44-f7e2602ca3bc.png)




## 私見

　本エラーは、PCにログインしているWindowsアカウントがAzure ADアカウントと紐づいていない場合におこるようです。AASに対して開発アカウントでログインする場合などに注意が必要です。
Power BI ページ分割レポートをPower BI Service上からAzure Analysis Servicesへ接続する場合のファイヤーウォールの設定

# Power BI ページ分割レポートからAzure Analysis Services（以下、AAS）に接続する際のAzure AS側のファイヤーウォールの設定について



Power BIにおけるページ分割レポートから、AASに接続する際には、AASのファイヤーウォールの設定をオフにする仕様を共有します。

検証を実施したところ、Azureのデータセンター以外のパブリックIPアドレス（検証時は104.209.182.1）から、Power BIページ分割レポートから接続する仕様となっているようです。




Power BI ページ分割レポートのドキュメントにデータソースに関して下記の記載があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2639bd05-0916-64e0-f691-aef8d9969be8.png)

引用元:[Power BI のページ分割されたレポートでサポートされるデータ ソース](https://docs.microsoft.com/ja-jp/power-bi/paginated-reports-data-sources)





## 留意事項

本情報は、2020年3月5日時点での情報です。





## Azure Analysis Servicesにてファイヤーウォールを”オン”に設定した場合

1. Azure Analysis Servicesにて、下記のファイヤーウォールを”オン”に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3f4812ad-2946-59dc-f522-e83414e7e394.png)





2. Power BIにおけるページ分割レポートから接続すると、エラーとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9c5ef9f9-58f5-f466-9e2e-f0d9ccadf94e.png)

> Could not connect to the data source.
> There was an error communicating with Analysis Services. Please verify that the data source is available and your credentials are correct. Cannot connect to server 'shimamuratest12'. Client with IP Address '104.209.182.1' is not allowed to access the server. To enable access, use the Firewall settings in Azure Management Portal. It may take up to 5 minutes for this change to take effect. More information on configuring firewall and setting IP address ranges can be found here httpsgo.microsoft.comfwlinklinkid=2099963
>
> Technical Details
> RootActivityId 84892977-9675-4bf9-83d4-06cde0f3784d
> Date (UTC) 342020 30959 PM
> Activity ID 57359ed9-b1be-5f14-5911-e8feae350837
> Request ID 57359ed9-b1be-5f14-5911-e8feae350837
> Correlation ID d93e1b061a794e8b8982716ab1d34b36
> Status code 200
> Time Thu Mar 05 2020 001001 GMT+0900 (日本標準時)
> Cluster URI httpseastus2.pbidedicated.windows.netwebapicapacities0129103E-63A3-4921-92D4-5C4BF73E5524workloadsRsRdlEnginersautomaticv1.0





## Azure Analysis Servicesにてファイヤーウォールを”オフ”に設定する場合

1. Azure Analysis Servicesにて、下記のようにファイヤーウォールを”オフ”に設定します。

![image-20200305113942619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/7aac4bd5-ac55-9a08-8fae-05730886f49e.png)




2. Power BIにおけるページ分割レポートから接続すると、正常に表示できます。

![PowerBIPremiumからAASへの接続_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/5b1af660-beb5-2615-d45a-0f80093d5b0c.png)




## 参考リンク

- [Power BI のページ分割されたレポートでサポートされるデータ ソース](https://docs.microsoft.com/ja-jp/power-bi/paginated-reports-data-sources)
- [[Deprecating] Microsoft Azure Datacenter IP Ranges](https://www.microsoft.com/en-us/download/details.aspx?id=41653)
Zend Serverのoci8

# Zend Serverのoci8
Oracleインタフェース案件で、`Zend Server for IBM i`のoci8モジュールを使用しているが、この度Oracle側の更新で嵌ったので、備忘として。

## 開発内容
- Oracle ： 11g → 12c へ更新
- 該当PHPプログラムを12cの新DBに対応させる

## 環境
### 本番環境
- OS ： IBM i V7R1M0
- Zend Server for IBM i ： 5.5
- OCI8 ： 2.0.8
- Oracle Run-time Client Library Version ： 10.2.0.5.0 
- Oracle Compile-time Instant Client Version ：10.2 
- Oracle : 12.1

### 開発環境
- OS ： Windows 10
- Zend Server for Windows ： 9.1
- OCI8 ： 2.1.8
- Oracle Run-time Client Library Version ： 12.1.0.2.0
- Oracle Compile-time Instant Client Version ：12.1
- Oracle : 12.2 (Vagrant上)

## ORA-28040（認証プロトコル・エラー）
ORA-28040（認証プロトコル・エラー）までの流れ

- 12c上にDB接続ユーザーを作成
- 開発環境で、**oci8**で12c接続プログラムを開発し問題なく動作
- 同プログラムを本番環境へデプロイ
- 本番環境でプログラム実行
- ORA-28040（認証プロトコル・エラー）

開発環境では、正常に接続できたOracleに対して、本番環境では、`28040 ORA-28040: No matching authentication protocol`が発生。  
この場合、**oci8**のバージョン自体は最新でも、`Oracle Run-time Client Library Version` が、Windows版 Zend Server（12系）とIBM i版（10系）で、異なる事が原因と考えられる。
対処方法として、`sqlnet.ora($ORACLE_HOME/network/admin/sqlnet.ora)` を次の様に変更する事で、下位バージョンのクライアントと互換性を保つことが出来る。  
指定は**認証バージョン**であり、Oracleのバージョンではない。

```sh
cd $ORACLE_HOME(/opt/oracle/product/12.2.0.1/dbhome_1)/network/admin
sudo vi sqlnet.ora

----- ファイル編集 -----
NAME.DIRECTORY_PATH= (TNSNAMES, EZCONNECT, HOSTNAME)
## ↓を追加
SQLNET.ALLOWED_LOGON_VERSION_SERVER=11（※認証バージョン）
```

|認証バージョン|生成パスワードのバージョン|
|---|---|
|12a|12c|
|12|12c,11g|
|11|12c,11g,10g|
|10～8|11と同じ|

変更後に`リスナーの再起動`を行う。

## 嵌ったポイント
### ORA-01017: invalid username/password;
前述の`ORA-28040`までは、直ぐに気づき対処出来たが、この後に`ORA-01017: invalid username/password; logon denied`が発生し、少し躓いた。  
普段Oracleを使用しない私は、`SQLNET.ALLOWED_LOGON_VERSION_SERVER`設定を、てっきりスイッチだと思っていたが、Oracleユーザーにパスワード・バージョンはキャッシュされており、`SQLNET.ALLOWED_LOGON_VERSION_SERVER`設定後に作成されたユーザーでないと、認証バージョンが反映されていない。  
`SQLNET.ALLOWED_LOGON_VERSION_SERVER`設定前に作成したユーザーに、パスワード・バージョンを反映させたい場合は、該当ユーザーのパスワード更新が必要となる。  
パスワード更新後は無事接続出来た。
ユーザーに登録されているパスワード・バージョンの確認する場合は、`SQL*Plus`や`SQL Developer`を使用して、次の*SQL*を実行する。

```sql
select 
 username,password_versions 
from dba_users where account_status='OPEN'
;
```
VSCodeとClaspでGASプチ開発の環境作り(Javascript　ES6)

やっぱり流行りはTypeScriptらしくて、GAS＋Claspの関係はTypeScriptでの環境構築は多いんだけど、Javascriptは見当たらない気がする
というわけで、自分の環境を書き残しておこう

# 1.VSCode
特に意識せずDLして使ってます。Unityソースもいじるので拡張それなり。

#2.Clasp

Claspを入れる前に、
[Node.JS](https://nodejs.org/ja/)
Npm
が必要。
Npmは別にインストールが必要かと思ったけど、[本家バイナリ](https://nodejs.org/ja/)だと一緒にインストールできるのね。
NodeJSってナニソレ、的な人はこれでよいかと。
*Node入れるにはHomebrewをいれてnodebrewをいれてバージョンを管理して、というのがほとんどで、そこで引いちゃう可能性があるなぁ、と感じる*

サーバ側の開発でNodeJSを使う人は指定されるバージョンがあったりするので、Node自身のバージョンを切り替える必要があり、上記をやるのは正しいのだけど、今回の場合などは本家バイナリでよいのではないかなぁ、と程度の差はあれ思ったり。

#3.素の環境づくり
GAS側でプロジェクトを作るでも（clasp clone)、ローカルから作る（clasp create）でもプロジェクトのフォルダー上に
 Code.js
 .clasp.json
 appsscript.json
がいる。ファイルが多くなりそうな場合は、rootDirの設定をする。（多くなくてもやったほうがきれいね）
以下すべてVSCodeのターミナルからの入力MyDirはそれぞれ自分の開発フォルダに置き換えてください

```
MyMac:MyDir$clasp clone --rootDir src
or
MyMac:MyDir$clasp create --rootDir src
```

#4.GASのコード補完

GASのたくさんあるクラスを使うのにタイプミスをへらすために、コード補完の準備

package.jsonの準備

```
MyMac:MyDir$npm init --y
```
これでpackage.jsonができたり、NPMでNodeのパッケージをプロジェクトに入れる準備ができた

GASの定義ファイルの準備

```
npm i @types/google-apps-script --save-dev
```
これでTypeScriptのGASのクラス定義ファイルがプロジェクトフォルダにインストールされます。
そうTypeScriptの。。。

JavaScript(ES6)でも使えるようにjsconfig.jsonを作成

```jsconfig.json
{
    "compilerOptions": {
      "target": "ES6"
    }
}
```

これでソース記載時に、GASのクラスのヘルプがでる、、はず。
（VSCodeのExtensionがいるかもしれないけど、もはやどれかわからず。。。）

#4.設定ファイルをいじる

##appsscript.json
場合によって追加が必要そうなのは２点
###webapp
こちらは作ったスクリプトをWeb公開するパターンで必要。（[前エントリ参照](https://qiita.com/ume3003/items/cd9d05dff014952a73f8)）
###oauthScopes
こちらは、
・スタンドアローンスクリプトでDocumentやSpreadsheetを使う
・ビルトインスクリプトで他のSpreadsheetやDriveを使う
・とにかくUIを使う
際に権限設定として必要になる（こちらも前[エントリ参照](https://qiita.com/ume3003/items/34b6ede7aa8ae89549ef)）
また、このファイルは、GASエディター上で「表示」→「マニフェストファイルを表示」で確認できる

##.clasp.json
普通につくるとこんな感じ

###scriptId
```.clasp.json
{
    "scriptId":"あなたのScriptId"
}

```

複数ファイルで作りたい人は以下エントリ追加
###filePushOrder

```.clasp.json
{
    "filePushOrder": [
        "src/constants.js",
        "src/baseClass.js",
        "src/extendClass.js"
    ]
}

```
上から順番に変数定義の参照がされる。
*余談；クラスをnewするときはClass定義は後ろでもOK、extendsするときは前じゃないとだめなのね*

###rootDir
なお、createやclone時にrootDirオプションつけてたら

```.clasp.json
{
    "rootDir" : "src"
}
```
のエントリが存在するはず。
また、つけわすれてても、自分で記載することも可能

##package.json

こちらは一部便利なところを利用させていただく

```
  "scripts": {
    "web:deploy": "clasp deploy -i [deployId]",
    "web:push": "clasp push",
    "web:pull": "clasp pull",
    "web:open": "open 'https://script.googleusercontent.com/macros/s/[deployId]/exec?'"
  },
```
普段はpush、pullだけでよい気がする。web公開版の場合にdeployやらopenを入れとくと楽〜
（なお、openはMac版の話。Winはもってないのでわからないっす）
次にVSCodeの設定から

```
"npm.enableScriptExplorer": true
```
で、これを保存すると、VSCodeのNPMScriptのマドにコマンドが並ぶのでマウスでポチポチクリックで実行してくれる、と。

##.claspignore

ファイルの操作をするアプリには必須のignore

```.claspignore
**/**
!*.js
!*.html
!appsscript.json
```

忘れないように書いておきます
salesforce ISNEW 式 の覚え

[Answersで回答する時に使う情報のまとめに戻る](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)

私もはまってしまった。いい解説をしてくれています。

```
OR(
ISNEW(), 
ISCHANGED(Date_Sourced__c)
),
```

ISNEW if most obvious, it detects that the RECORD is new, not the value of the field etc.
ISCHANGED checks that the field is change from previous to now and returns TRUE.  But when we have a new record, ISCHANGED by itself returns FALSE.  Basically, it has no previous value to compare.
So the check is IF its new OR the field DateSource is changed - this will cover both scenarios.


ISNEW最も明白な場合は、フィールドの値などではなく、RECORDが新しいことを検出します。
ISCHANGEDは、フィールドが以前から現在に変更されていることを確認し、TRUEを返します。ただし、新しいレコードがある場合、ISCHANGED自体はFALSEを返します。基本的に、比較する以前の値はありません。
したがって、チェックは、新しいか、フィールドDateSourceが変更されたかどうかです。これは、両方のシナリオをカバーします。

[Validation Rule not working on ISNEW() but works on ISCHANGED](https://success.salesforce.com/answers?id=9063A000000tIY3)
unity1week初参加の所感

※ Qiitaなのに技術的な話は少なめです...

## [unity1week](https://unityroom.com/unity1weeks)とは
[<img width="500" alt="スクリーンショット 2020-03-01 19.00.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236499/e8c35206-6665-6df4-a930-5e95c819d039.png">](https://unityroom.com/unity1weeks)
出されたお題に沿ったゲームをUnityで1週間以内に作成しWebGL版を公開、その後1週間で評価し合い結果発表!!って流れです
1週間以内に間に合わなくても罰則なしで遅刻公開できますし、アセットの使用や諸々特に制限ないので制作物の最低限の倫理観と著作権さえ守れれば自由に作れるのがいいですね
またTwitter投稿やランキングの実装など普遍的な機能はサイト運営者がライブラリを作ってますので初心者にも安心です

## 作ったゲーム
今回テーマが「逆」だったので、ブロック崩しのブロックを守るディフェンスゲームを作ってみました
タイトルは[ブロック崩し被害者の会](https://unityroom.com/games/reverse-breaker)です
[<img width="300" alt="スクリーンショット 2020-03-01 19.00.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236499/221e2922-a684-5221-9ee2-4e9b0417307b.png">　<img width="300" alt="スクリーンショット 2020-03-01 19.00.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236499/b48fa86a-2d29-69a9-ebd4-ca8621c57bf4.png">](https://unityroom.com/games/reverse-breaker)

バーから発射されるボールをクリックした場所に発生する爆風に巻き込んで壊していくゲームです
クリアまで3分とかからないので良かったら遊んでみてください

## 参加して学べたこと
※ 普段スマホでゲーム作成をしている者としての所感です

### WebGLビルドの経験
ビルドファイルをアップロード後起動中に何度かエラーが発生しました。そのエラーメッセージがJavaScirptに関するもので、UnityのWebGLに関する資料が少なく、対応に四苦八苦しました(私の場合は再ビルドであったり環境設定を見直したりすることでなんとかなりました)
また、Unity単体でローカルサーバーを立てて動作確認ができるのですがセキュリティソフトに引っかかって起動ができないってのもありました(ポート設定大事)

### 入力デバイスの違い
今回PCで制作するにあたり、キーボード+マウスで操作させなきゃいけない訳で...普段スマホでカジュアルゲームを作っているので即座に「マウスのみ」という選択に至りました
ただ考慮漏れで...マウスと言っても
・マウス
・トラックパッド
・タッチスクリーン
等々様々なものがあるわけで。私自身MacBookProで開発しているのでトラックパッド基準で開発したのですが、実際に遊んでもらうとマウスやタッチスクリーンだとかんたんにクリアできることが分かり、デバイス差を吸収できるゲーム性じゃないとダメだなぁと反省しました

### 遊んでもらう対象の見誤り
unity1weekって約300本ほどのゲームが投稿されるんですね
なので今回は「30秒ほどで雰囲気を理解してもらい、3分ほどでクリアできるようなゲーム」と思って作ったんですが...他のゲームを遊んでるともっと短いスパンで理解し楽しんでもらう必要があるなと
自身、たくさんのゲームを遊ばせてもらったのですがルールが分からず最初の20秒ほどでゲームオーバーになったものは「他のゲームに移ろ」ってなりました

またunity1weekを遊ぶ層はゲーム好きが多いので、コア向けに楽しんでもらえるようランキング機能の実装やそれに即した内容を追加すべきでした
今回のゲームだと...タイムアタックですね。ステージ10まであるんですが、残存するブロックが多いほどゲームテンポを上げて難易度が上がるようにし(太鼓の達人方式)より高難易度で素早く倒すゲーム作りにしてヘビーユーザーに何度も楽しんでもらえるようにすればよかったなと反省です

## 遊んでて感銘を受けた他ゲーム
### [ヒイテケス](https://unityroom.com/games/popnpush)
![cvzsn-5jpgp__1_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236499/260519cc-335f-43e6-3ab0-9ff545b51968.gif)

クリックしてブロックを掴み、他の場所にブロックを移動させて一行の累計数字を10の倍数にするゲームです
これ序盤は適当にしてても偶然10の倍数になったりするんですよ、でも進めていくとスピードアップしてきてうまく作れなくてヒヤヒヤしちゃう...でもその中で活路を見出して10の倍数が連続で発生したときにはまぁ気持ちいい！！
普通にスマホゲーとして遊びたい作品です

### [Coin&Block](https://unityroom.com/games/coin-block)
![coinBlock_thumbnail_lite.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236499/122e5c91-5315-11d5-4fc6-7b60143518a2.gif)
ボタン操作でブロック部分とコイン部分が変わるので、それを巧みに操作しながらゴールを目指すゲームです
このゲームはテンポ感がいい！リトライやクリア後の転換時間も丁度いいし、それを美麗なアニメーションを用いてて更に気持ちよく進んでいるように感じさせてくれました
また、クリアするだけなら容易なのですが、コイン数を多く取ろうとすると途端に難しくなり、その難易度設計が丁度良かったです

## 最後に
今回作成した何倍もの時間をかけてスマホゲーをリリースしても、宣伝がないとDLって殆ど発生しないんですよ
でもunity1weekだと他の人のゲームを遊べば遊ぶほど自分のゲームが他者に遊んでもらいやすくなりますし、そういったことがなくてもYoutubeでの「unity1week全ゲーム遊ぶ」企画等もあり100PV以上遊んでもらえる...しかもありがたいコメントもいただける
作り手として嬉しいことって「遊んでもらうこと」と「フィードバックをもらう事」だと思ってますんで、それが確立しているunity1weekっていい環境だなぁと思いました

今回参加できて本当に良かったです、また次回も参加したいですね!!
【Nuxt.js】JSONファイルを読み込み共通データ作成する

Nuxt.js、VuetifyでWebサイトを作成していたときにグローバルナビやフッターナビなど同じ項目で流用でき、まとめておくようなデータを作成できないかと思いました。

下記にそのときの方法をまとめてみました。

## グローバルナビを作成
Headerにグローバルナビを設置するとき下記のように配置していました。

```header.vue
<template lang="pug">
v-app-bar
  v-layout
    v-btn(href="about") about
    v-btn(text href="case") case
    v-btn(text href="price") price
    v-btn(text href="help") help
    v-btn(text href="information") information
</template>
```
この形でも表示されるのですが、フッターにも同じメニュー」を並べたり、他にも流用して使えないかとおもいました。

## JSONデータの作成
まず流用できるデータとしてこのようなJSONデータを作成します。

``` menu.json
[
  { "id": 1,
    "category": "about",
    "link": "about"
  },
  { "id": 2,
    "category": "case",
    "link": "case"
  },
  { "id": 3,
    "category": "price",
    "link": "price"
  },
  { "id": 4,
    "category": "help",
    "link": "help"
  }
  { "id": 5,
    "category": "information",
    "link": "information"
  }
]
```
## JSONデータの読み込み
JSONを読み込み表示させるだけなら下記のような書き方で表示することができます。

```header.vue
<template lang="pug">
  v-app-bar
    v-layout
      v-btn(v-for="(menu, index) in menus" v-bind:key="menu.id" :href="menu.link") 
        | {{ menu.category }} 
</template>

<script>
import menus from '@/assets/json/menu.json'

export default {
  data () {
    return {
      menus: menus
    }
  }
}
</script>
```

## Vuexを使用する
Nuxt.jsで共通データを作成するならVuexを利用すると便利なので使っていきます。

### Storeにデータを作成

Storeにmenu.jsonを読み込ませていきます。
Nuxt.js ではstoreディレクトリ内にモジュールと対応するファイルを持つことができます。
[モジュールモード](https://ja.nuxtjs.org/guide/vuex-store/#%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89)

```store/json.js
import jsonData from '@/assets/json/menu.json'

// 状態の管理
export const state = () => ({
  data: jsonData,
})

// getters
export const getters = {
  getAll: (state) => {
    return state.data
  },
}
```

gettersはこのように増やしていくことも可能です。

```js

export const getters = {
  getAll: (state) => {
    return state.data
  },
  getAll2: (state) => {
    return state.data2
  },
}
```


### 共通データを呼び出す
先程作成したデータを表示さえたいファイルに下記のように書き込みます。
mapGettersで呼び出し、v-forで繰り返し表示させます。

```header.vue
<template lang="pug">
  v-app-bar
    v-layout
      v-btn(
        v-for="(menu, index) in getAll"
        v-bind:key="menu.id"
        :href="menu.link") 
        | {{ menu.category }} 
</template>

<script>
import { mapGetters } from 'vuex'

export default {
  computed: {
    ...mapGetters({
      getAll: 'json/getAll',
    }),
  },
}
</script>
```

これで最初に書いたメニューと同じ表示になります。
また、このデータを流用しほかの部分でも使うことが可能になりました。
文系未経験から2か月ほどでAWS認定ソリューションアーキテクトを取得したときの勉強法

#はじめに
クラウドに興味を持ったため、一つの目標としてAWSの資格を取得しようと思い勉強しました。
勉強期間としては、だいたい去年の4月～6月くらいです。
自分用の備忘録と資格取得に少しでも役に立てればと思いまとめておこうと思いました。

※試験内容について、3月23日から変更があるそうです。そちらの点はご注意ください。

#資格取得を思い立ったときの知識
- パソコンには触れていましたが(ゲームなど)、IT知識はほぼゼロ
- AWSに関する知識ももちろんなし
  - クラウドに関してはiCloudなどで聞いたことはあった

#試験について
勉強法の前に軽く試験について記載しておきます。
試験ガイド、サンプル問題、試験の時間などについては以下のサイトにあります。
[AWS 認定ソリューションアーキテクト – アソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)

受験料金は15.000円+税と決して安くはないので、
しっかりと対策して1回で取得できるようにしましょう。

#勉強法
おおまかな流れとしましては、**試験ガイドを読み概略をつかむ→インプット(テキストの読み込み)→アウトプット(模擬試験やサンプル問題)**をおすすめします。
###1.とりあえず試験ガイドを読む。
3月22日までに受験をされる方
[(SAA-C01)試験ガイド](https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS%20Certified%20Solutions%20Architect%20-%20Associate%20Exam%20Guide%20001%20v1.5%20JPN.pdf)

3月23日以降に受験をされる方
[(SAA-C02)試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-assoc/AWS-Certified-Solutions-Architect-Associate-Exam-Guide_v1.1_2019_08_27_FINAL.pdf)

知識がないとよくわからないと思いますが、これから受験するんだという気持ちを高めるために読みました。
また、勉強後にもう一度読むことをおすすめします。

###2.インプット
私がテキストとして利用したのは、以下の1冊のみです。
[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://www.amazon.co.jp/gp/product/4295005495/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4295005495&linkCode=as2&tag=torabo-22&linkId=fc1bb46129ea97fadee13bf7e2ac250d)

選んだ理由としましては、分厚くないことと付属で模擬試験がついていたことです。
※私が受験したときは、3冊ほどしか試験対策本が無かったのですが、現在は結構出ているようなので
　自分に合ったものを見つけましょう。

大事なこととしては、インプット時にわからないことがあったらささいなことでもすぐ調べましょう。
調べることの積み重ねで徐々に知識が増えていきます。

###3.アウトプット
私がアウトプットとして利用したのは、以下の2つです。
・[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://www.amazon.co.jp/gp/product/4295005495/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4295005495&linkCode=as2&tag=torabo-22&linkId=fc1bb46129ea97fadee13bf7e2ac250d) の付属の模擬試験
・公式の模擬試験

試験でどのような問題が出るかなど模擬試験は受けたほうがよいです。
公式の模擬試験は2000円ほどお金はかかりますが、一度は受けておいた方がいいと思います。

#試験の受験
試験を予約して会場で試験を受けましょう。
　[AWS 認定申し込み](https://www.aws.training/certification?src=cert-prep)
当日、身分証を持っていくことをお忘れなく。

試験時間は130分間と長く感じるかもしれませんが、しっかり勉強していれば時間はあまると思います。
(私も1時間くらいで終わりました)
あまった時間は問題の見直しなどにあてましょう。

結果は、試験後すぐに表示されます。(私はこういった試験を初めて受験したのでびっくりしました)

#さいごに
実際にAWSアカウントを作成し、触ってみるのもいいと思います。
無料枠もあるので時間があったら触ってみると理解が深まると思います。

個人的に試験で出題され重要だと思う分野
基本サービス(EC2, VPC, ELB, RDS, Lambda, Route53, SQS, SNS, AutoScaling等)
セキュリティ(IAM, セキュリティグループ, ネットワークACL)
ログ(CloudWatch, CloudTrail)
これらは特に細部まで勉強することをおすすめします。

長くなりましたが最後に一言
初めはわからないことだらけだと思いますが、しっかりと勉強していれば合格ができると思います。
また、こちらの記事が少しでもためになれたら幸いです。
UiPath UnAttended実行 VDI環境で画面解像度を指定する方法

VDI環境にてUnAttendedロボを実行する際に、画面の解像度を指定する方法

1. OrchestratorのROBOTS登録画面にて、"SETTINGS"タブを開く
1. "Login To Console" を Noに設定
1. "Resolution Width" に 幅を指定
1. "Resolution Depth" に 縦を指定
1. UPDATEボタンを押す

![UiPath_VDI環境解像度設定.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158953/0b7b259d-20cb-4026-1f2b-06bf21824d94.png)
ドリルTX４５　

class ArticlesController < ApplicationController

  def show
    article = Article.find(params[:id])
  end
end


これでは表示されない、、、

Railsではコントローラで設定された「インスタンス変数」がビューに渡される仕組みになっている。

コードのarticleは通常のローカル変数であるためビューで使うことができない。そのため、articleを@articleに変更すればよい。


4行目のArticle.find(params[:id])という記述のうち、params[:id]には詳細表示されたいレコードのidが格納されます。なぜそのような動作になるのか、「rails routes」という言葉を使って説明してください。


rails routesを使ってアプリケーションのルーティングを確認すると、通常showアクションには以下のような設定がされている。

1 Prefix Verb   URI Pattern                                   Controller#Action
2 tweet  GET    /tweets/:id(.:format)                         tweets#show
そのため、例えば「localhost:3000/tweets/3」というURLが指定されると、paramsの「:id」というキーのバリューとして「3」が代入される。

そのため、そのあと呼び出されたコントローラー内でparams[:id]と取り出すことができる。
Javascriptで全部のDOMにアクセスしたい時

しょっちゅう書いてるのに忘れるからメモ
再帰的に処理するだけ

``` javascript
const getRecursionNodes = node => {
  node = node.firstChild;
  while (node) {
    getNodes(node);
    node = node.nextSibling;
  }
};
```

フレームワーク内で書いたら負け。
node.jsでスクレイピングしたい時とかにね

例えばこんなDOMっぽい文字列一部だけでもいいし全部でもいいし
axiosとかで普通に取得する。

```javascript
const tagText = `
<div>
  <div>
    タイトル
    <span>サブタイトル</span>
  </div>
</div>
`;
```

で文字列をパースする

```javascript
  const parser = new DOMParser();
  const doc = parser.parseFromString(tagText, 'text/html');
  getRecursionNodes(doc.getElementsByTagName('body')[0]);
```

こんな風に書くとgetRecursionNodesのwhile内で
body内の全要素をぶん回して処理できる。

parseFromStringはDOM Tree一部だけのつもりでも
htmlとbodyタグを勝手に付与しやがるので重複に注意。

空DOMをすっ飛ばしたい時は`nextElementSibling`を使うと少し軽くなるかも。
この書き方だと文字列だけのnodeとかを処理したい時は
`node.nodeType`で判定してあげる必要がある。
https://developer.mozilla.org/ja/docs/Web/API/Node/nodeType
/bin/sh: next: command not found

# 背景
```
$ yarn start
```
をした際に発生したエラー

# エラーの内容
```
/bin/sh: next: command not found
error Command failed with exit code 127.
```

コマンドがないよっていうエラー

# 解決策

```
$ yarn upgrade
```

upgrade で足りないものを補填したら無事ローカルホストが立ち上がりました。


## 参考
https://github.com/facebook/create-react-app/issues/1155
AWS　データベースサービス　RDSについて

#AWSのデータベース
大きく分けて2つあります。
**RDB（リレーショナルデータベース）**と**Nosql**に分ける事ができる。

#RDS
様々なデータベースソフトウェアに対応したフルマネージドなリレーショナルデータベース
<img width="671" alt="スクリーンショット 2020-03-05 11.20.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/7a67b875-1105-299a-bf63-6c22066b23d1.png">

#AWSのデータベース構築
EC2インスタンスの中で構築する、専用DBサービスを利用するかの２種類
<img width="657" alt="スクリーンショット 2020-03-05 10.35.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/020f3cb7-8c60-22e6-377b-5530a456f20e.png">
EC2インスタンス
メリット：自由にDB構成や機能を利用
デメリット：構築・運用が手間

RDS
メリット：構築・監理が楽（大部分がAWS側）
デメリット：AWS提供の範囲内での利用制限
#RDSの特徴
・シンプルな構築
・高い可用性
・パフォーマンスの向上
・運用負荷の軽減
・セキュリティ

##シンプルな構築
DBインスタンス作成時にマルチAZ構成を選択する事で、後は全てAWSが自動でDBの冗長性に必要な環境を作成してくれる。
<img width="496" alt="スクリーンショット 2020-03-05 10.47.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/792d879b-f8e2-13e0-16c6-1bc25eeff7bd.png">

##高い可用性
###マルチAZ構成
一つのリージョン内で2つのAZにDBインスタンスそれぞれ配置して、障害発生時やメンテナンス時のダウンタイムを短くする事で高可用性を実現できる。
<img width="893" alt="スクリーンショット 2020-03-05 10.50.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/c9914bb3-8d8c-7891-7d99-f5733590bb76.png">


##パフォーマンスの向上
###リードレプリカ
リードレプリカとは通常のRDSとは別に、参照専用のDBインスタンスを作成する事ができるサービス。
MySQL, MariaDB, PostgreSQL, Auroraに対応
<img width="893" alt="スクリーンショット 2020-03-05 10.56.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/09635a63-e0e4-5000-d8e5-0458ed727bbc.png">
リードレプリカを作成する事で、マスターDBの負荷を抑えたり、読み込みが多いアプリケーションにおいてDBリソースのスケールアウトを容易に実現できる。

**スケールアウト**とは
コンピュータシステムの性能を増強する手法の一つで、コンピュータの台数を増やすことでシステム全体の性能を向上させること。 処理を並列化、分散化できるシステムで適用される。

**ポイント**
欠点として、マスターとリードレプリカのデータ同期は**非同期レプリケーション方式**なのでタイミングによっては、マスターの更新がリードレプリカに**反映されてない**事がある！

##運用負荷の軽減
###バックアップ/リストア
・自動バックアップ
自動スナップショット＋トランザクションログをS3に保存
保存期間は最大35日分 (0日～35日の間で設定可能)

・手動スナップショット
任意のタイミングでRDBのバックアップを取得できる。
１リージョンあたり１００個までという取得制限

・データのリストア
リストア：スナップショットを元にDBインスタンス作成
Point-in-Timeリカバリ:
指定した時刻（5分以上前）の状態になるようDBインスタンス作成

##セキュリティ
###ネットワークセキュリティ
RDSはVPCに対応しているため、インターネットに接続できないAWSのVPCネットワーク内で利用可能サービス
<img width="664" alt="スクリーンショット 2020-03-05 11.16.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/5fcd9fa1-600e-bd0c-a9ce-f2e7e9cf6ce8.png">

###データ暗号化
保管時のインスタンスとスナップショットの暗号化が可能
<img width="444" alt="スクリーンショット 2020-03-05 11.17.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522222/7a673a1d-3313-3b0d-8083-7dbdd1ea5897.png">


#最後に
参照
サービス別資料参照
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/
Amazon Relational Database Service (RDS)
[GitHub] 東京都公式 新型コロナウイルス対策サイトがプルリク募集してる[COVID-19]

![stopcovid19.metro.tokyo.lg.jp.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551993/00005c8a-70f9-8549-6e8e-96bbb52c07e5.png)
[東京都公式 新型コロナウイルス対策サイト](https://stopcovid19.metro.tokyo.lg.jp/)のリポジトリが、[GitHub上に公開](https://github.com/tokyo-metropolitan-gov/covid19)されています。
[Issueは大歓迎、~~Pull Requestは受け入れ体制を今調整しているそうです。~~] (https://github.com/tokyo-metropolitan-gov/covid19/issues/328)
※追記　Pull Requestに対するレビュー、受け入れ既に始まってます。

[行動規範](https://github.com/tokyo-metropolitan-gov/covid19/blob/development/.github/CODE_OF_CONDUCT.md)が最強にかっこいいので是非一読を。
序文だけ引用(一部言葉を補ってます。)
> **我々はなぜここにいるのか**
> ・ 都民の生命と健康を守るため
> ・ 正しいデータをオープンに国内/海外の人に伝えるため
> ・ 正しいものを正しく、ともに作るプロセスの効果を具体的に示すため

主にVue.js (nuxt.js)で作成されているようなので、
貢献したい方は、[ReadMe](https://github.com/tokyo-metropolitan-gov/covid19#readme)と[How to contribute](https://github.com/tokyo-metropolitan-gov/covid19/blob/development/.github/CONTRIBUTING.md)を確認するといいと思います。
## 一言
東京都がこういう運用できるということに驚きました。すごい。
~~[Vtuberの公式サイトをプルリクで作る](https://qiita.com/unsoluble_sugar/items/120f0856d497ef96010e)を思い出す。~~

## リンク
- [東京都公式 新型コロナウイルス対策サイト](https://stopcovid19.metro.tokyo.lg.jp/)
- [GitHub ソースコード](https://github.com/tokyo-metropolitan-gov/covid19)
- [行動規範 (Principle)](https://github.com/tokyo-metropolitan-gov/covid19/blob/development/.github/CODE_OF_CONDUCT.md)
- [東京都がGitHubで公開、「東京都公式 新型コロナウイルス（COVID-19）対策サイト」のオープンソース共同作業始まる](https://techwave.jp/archives/tokyo-opens-github-covid19-countermeasure-site.html)
- [東京都 新型コロナウイルス対策サイトへの貢献方法を解説](https://qiita.com/FPC_COMMUNITY/items/b9cc072813dc2231b2b2)
Microsoft Azure Cognitive Services Faceを動作させてみる　その１

#この記事で伝えたいこと
・世間には多様なCognitiveなサービスが存在するのですが、大抵は、クラウドだけだったり、Localだけだったりで、どちらでも実装できる場合は結構なコストや手間がかかります(Cognitiveなサービスを提供するPaaS環境を一括買い取り、という意味)。が、Azure Cognitive ServiceについてはAzureの無料サブスクリプションがあれば、クラウドでもLocalでもCognitiveなサービスを比較的簡単に実装できそう、というのが面白いので、整理してみました。
・当然のCRUD操作、つまりperson_idと顔画像を登録して、別の顔画像のInference結果(person_idやname)を受け取ったり、登録済のpersonを削除する処理を実装したいだけなのに、マニュアルやソースが多くて英語で読むのが面倒だ、という人向けです。つまり、QuickStartの説明と補足です。
・Edge側でカメラ撮影してFaceでInferenceして出力するというPython Flaskアプリケーションにおける、Face部分の処理を想定しています(Python Flaskアプリそのものの記事は未定です)。

#Azure Faceとは
・Microsoftが提供している顔認識機能(Imageから人間の顔を抽出、登録したIDと照合、など)で、Azure上でもLocalのDockerコンテナーでも動作します。トレーニング処理(=顔画像とIDの登録)にGPUは不要です。
・技術的な概要はMicrosoft社のWebサイトの[Azure Face サービスとは](https://docs.microsoft.com/ja-jp/azure/cognitive-services/face/overview)で確認します。ちなみに、コンテナに割り当てる推奨HWリソースは、1コア、4GBメモリと記述されています。
・営業的な概要はMicrosoft社のWebサイトの[顔認識|Microsoft Azure](https://azure.microsoft.com/ja-jp/services/cognitive-services/face/)で確認します。
・一般的には、画像処理についてはデータ転送のためのネットワーク帯域を考慮するとEdge側でCognitiveな処理を行うことが有利です。その意味で、上記サイトそれぞれの[クラウドからエッジまで、どこにでも配置](https://docs.microsoft.com/ja-jp/azure/cognitive-services/cognitive-services-container-support)、[コンテナーの使用](https://docs.microsoft.com/ja-jp/azure/cognitive-services/face/face-how-to-install-containers)で紹介されているように、クラウドでもLocalのDocker環境で実行可能なことであり、代表的なIoTアーキテクチャである、[Dell Technologies](https://www.delltechnologies.com/en-us/service-providers/edge-computing.htm)のEdge-Core-Cloudモデルや、[Azure IoT 参照アーキテクチャ](https://docs.microsoft.com/ja-jp/azure/architecture/reference-architectures/iot/)と相性がよいです。

#Azure FaceのLocalコンテナーについて
・PublicのAzure上でFaceを実行するためには、Azure portal にサインインしてFaceのResource Groupを作成すればよいです。しかし、LocalのDocker環境で実行するためには、左記の作業に加えてコンテナーを実装したいユースケースに関するアンケートに答える必要があります。そのアンケートに答えるとCognitive Service専用のプライベートコンテナーレジストリとアクセス情報を教えてもらえるので、Docker pullできるようになります。詳細は上記のサイトで確認します。
・FaceのDockerコンテナー起動時に、有効なAzure FaceサービスのResource GroupのEndpointとAPI Keyを引数で渡して、かつ、Dockerコンテナーが課金情報を送信するためにインターネット経由でAzure portalと通信できる必要があります。

[その2](https://qiita.com/yoshiono/items/fc0b696e97a8690ddd05)に続きます。
Model#xxx_before_type_cast / Get instance / Not type casted inputs ( attributes ) / e.g invalid Date to be nil / #Rails 

```rb

# == Schema Information
#
# Table name: users
#
#  id                       :bigint           not null, primary key
#  birth_date               :date             not null

class User < ApplicationRecord
end

# Valid Date
# type casted 
# be Date
User.new(birth_date: "19800229").birth_date
# => Fri, 29 Feb 1980

# valid Date
# before Type Casted
# be String
User.new(birth_date: "19800229").birth_date_before_type_cast
# => "19800229"

# Invalid Date
# type casted 
# be nil
User.new(birth_date: "19800230").birth_date

# Invalid Date
# Get not type casted input 
User.new(birth_date: "19800230").birth_date_before_type_cast
# => "19800230"

```

# Other methods

```rb
User.new.methods.grep /birth_date/
=> [:birth_date=,
 :birth_date,
 :birth_date?,
 :birth_date_changed?,
 :birth_date_change,
 :birth_date_will_change!,
 :birth_date_was,
 :birth_date_previously_changed?,
 :birth_date_previous_change,
 :restore_birth_date!,
 :saved_change_to_birth_date?,
 :birth_date_before_last_save,
 :saved_change_to_birth_date,
 :birth_date_change_to_be_saved,
 :will_save_change_to_birth_date?,
 :birth_date_in_database,
 :birth_date_before_type_cast]
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3009








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
xxx_before_type_cast  / #Rails で 不正な日付を ActiveRecord に渡すと nil に変換されてしまうため 、タイプキャストする前の入力値を得る

```rb

# == Schema Information
#
# Table name: users
#
#  id                       :bigint           not null, primary key
#  birth_date               :date             not null

class User < ApplicationRecord
end

# Valid Date
# type casted 
# be Date
User.new(birth_date: "19800229").birth_date
# => Fri, 29 Feb 1980

# valid Date
# before Type Casted
# be String
User.new(birth_date: "19800229").birth_date_before_type_cast
# => "19800229"

# Invalid Date
# type casted 
# be nil
User.new(birth_date: "19800230").birth_date

# Invalid Date
# Get not type casted input 
User.new(birth_date: "19800230").birth_date_before_type_cast
# => "19800230"

```

# Other methods

```rb
User.new.methods.grep /birth_date/
=> [:birth_date=,
 :birth_date,
 :birth_date?,
 :birth_date_changed?,
 :birth_date_change,
 :birth_date_will_change!,
 :birth_date_was,
 :birth_date_previously_changed?,
 :birth_date_previous_change,
 :restore_birth_date!,
 :saved_change_to_birth_date?,
 :birth_date_before_last_save,
 :saved_change_to_birth_date,
 :birth_date_change_to_be_saved,
 :will_save_change_to_birth_date?,
 :birth_date_in_database,
 :birth_date_before_type_cast]
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3010








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->