OmniAICreator/Qiita-1.07M huggingface dataset:
Red Hat Certified Specialist in OpenShift Administration（EX280）受験記録

#はじめに
[Red Hat Certified Specialist in OpenShift Administration](https://www.redhat.com/ja/services/certification/rhcoe-paas) を受験し、2回目で取得できました。

昨年、RHCSAやCKAを取得したのですが、これはそれらよりも難しく感じました。これからこの資格の取得を目指す方の参考になれば幸いです。

#試験内容
[こちらに](https://www.redhat.com/ja/services/training/ex280-red-hat-certificate-expertise-platform-service-exam?section=%E8%A9%A6%E9%A8%93%E3%81%AE%E5%86%85%E5%AE%B9)試験範囲が書かれています。
具体的な出題内容は書けませんが、この範囲の全てが出題されるわけではありません。また、2回受験しましたが2回とも同じ内容でした。

#事前準備
##学習
会社で[Red Hat ラーニングサブスクリプション](https://www.redhat.com/ja/services/training/learning-subscription)に参加させてもらえたので、以下の2コースをひたすらやりました。

- [Red Hat OpenShift I: Containers & Kubernetes(DO180)](https://www.redhat.com/ja/services/training/do180-introduction-containers-kubernetes-red-hat-openshift)を2周
- [Red Hat OpenShift Administration II: Operating a Production Kubernetes Cluster(DO280)](https://www.redhat.com/ja/services/training/do280-red-hat-openshift-administration-i)は5、6周

試験は実際のコマンド操作が必要になりますので、テキストを読んで勉強するだけではだめで、実際に手を動かさないとダメだと思います。
手が勝手に動くくらいまでひたすらコマンド操作を繰り返しました。

##申し込み、試験環境準備
[RHCSAと同じ](https://qiita.com/dingtianhongjie/items/4e863d764812c0567ba1#%E7%94%B3%E3%81%97%E8%BE%BC%E3%81%BF)です。自宅からリモートで受験しました。

#試験当日
##受験場所の準備、PCの準備、アンケート、事前確認
[RHCSAと同じ](https://qiita.com/dingtianhongjie/items/4e863d764812c0567ba1#%E5%8F%97%E9%A8%93%E5%A0%B4%E6%89%80%E3%81%AE%E6%BA%96%E5%82%99)です。

##受験
OCPクラスタにログインして問題を進めていきます。注意すること、気づいたことは以下になります。

- この試験環境がわかりづらくて、一回目に受験したときにはOCPクラスタにログインできるまでに30分くらいかかりました。
- パスワードやユーザアカウントが「redhat」とか単純なものではなくて、妙に打ちづらいワードなのでコピペが大切です。ブラウザではctrl+cでコピー、ターミナルにはctrl+shift+vでペーストできます。
- マニュアルを見ながら進められます。内容は[ここ](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.5/?extIdCarryOver=true&sc_cid=701f2000001Css5AAC)と同じですが、試験環境にローカルで落としてあるものを使います。
    - このマニュアルも使いにくくて、全体の検索ができません。「認証および認可」「ネットワーク」などの各項目のページ内であれば検索できます。なので、調べたい機能がどの項目に書かれているかは事前に把握しておいた方がよいです。
    - HTMLとPDFが見れますが、HTMLだと重くて全然開きません。PDFで見た方がよいです。
    - HTMLの方では日本語は選べるのですが、結局開きませんでした。英語のマニュアルを読むつもりでいた方がよいです。
- マニュアルよりは`oc adm policy -h`などコマンドの中で確認した方が早いです。
- DO280の演習が完璧にできるようになってもできない問題がありました。

#試験結果

1回目は合格スコアの半分程度しか届かず惨敗。2回目で何とか合格できました。
2回目は1問を除いて全部できたと思ったのですが、思ったよりもスコアが低かったです。どこを間違えたのか謎。

試験時間は3時間ですが、2回目は1時間残して終了できました。この場合は試験官に伝えれば終わりにできます。

https://rhtapps.redhat.com/certifications/badge/verify/YG54IZS72QXVJ4PW3QIGFH5MNEAEQU3CUPSQX2KSDXT6RW46LQ3USGMBTDNSOFVX22WYNJ63KCC3BBTAOIVCQWO7U3Z7NRP66BA673I=
Gitのローカルブランチを削除（マージせずリモートで削除したブランチも一括で消したい）

gitで、マージ済みブランチを一括で消す方法は沢山でてくる。

```
git branch --merged|egrep -v '\*|develop|master'|xargs git branch -d
```
参考リンク
https://qiita.com/hajimeni/items/73d2155fc59e152630c4


でもマージしないでリモートで削除しちゃったブランチについて、
ローカルブランチを一括で消す方法が日本語記事で出てこないので、
調べると、英語圏にはあった。

```
git fetch -p && git branch -vv | grep 'origin/.*: gone]' | awk '{print $1}' | xargs git branch -D
```

引用元
https://medium.com/darek1024/how-to-clean-local-git-branches-that-were-removed-on-the-remote-4d76f7de93ac


これでRstudioのgitのブランチ選択欄に
削除したブランチの亡霊がたまるのを回避できるよ！
Raspberry Pi Picoを入手してみた件

##買ったところ
いつものここ (https://shop.pimoroni.com/) です。
1個限定だったのですが、現在は購入できなくなってますね。
購入したときは£3、送料£5の合計£8でした(送料のほうが高い....)
発表された1/21にオーダー、1/28着でした。

##結構小さい
届いたものはこんな感じで、個装ですね。他にもなにか買えばよかったのですが
とりあえず注文しないと無くなりそう!ということで、ほんとにコレだけです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481194/734db8b0-dae0-0ded-6991-c26ba29a41db.jpeg" width="480">

##スペック
公式からのコピへは下記な感じです。

    RP2040 microcontroller chip designed by Raspberry Pi in the United Kingdom
    Dual-core Arm Cortex M0+ processor, flexible clock running up to 133 MHz
    264KB of SRAM, and 2MB of on-board Flash memory
    Castellated module allows soldering direct to carrier boards
    USB 1.1 with device and host support
    Low-power sleep and dormant modes

    Drag-and-drop programming using mass storage over USB
    26 × multi-function GPIO pins
    2 × SPI, 2 × I2C, 2 × UART, 3 × 12-bit ADC, 16 × controllable PWM channels
    Accurate clock and timer on-chip
    Temperature sensor
    Accelerated floating-point libraries on-chip
    8 × Programmable I/O (PIO) state machines for custom peripheral support


##micropythonを入れてみる
公式ページに記載あるので、手順はそのままです。
https://www.raspberrypi.org/documentation/pico/getting-started/

(1)公式ページのGetting Start with micropythonにあるUF2ファイルをダウンロードする
(2)PCB上のBOOTSELを押したまま、USB接続する
(3)Mass Storage Deviceに見えるので、ダウンロードしたUF2ファイルを放り込む
![RPP_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481194/64b727e5-9de2-b182-8428-dc4a3af9e588.png)

(4)勝手に再起動する
(5)WindowsだとデバイスマネージャでUSB-COMポートが見えるはず(下記例はCOM7)
![RPP_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481194/e5103f6d-8c99-7e92-54ae-c1631bebf04c.png)


##つないでみる
WindowsならTeratermなどで接続してみます。
シリアルポート設定は115200bps/8bit/none/1bit/none設定にしてみました。
![RPP_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481194/d64adae8-541c-f644-d91d-fcd60ff22f18.png)


##LED光らせてみる
オンボード上のLEDを光らせてみます。GPIO25に繋がっているっぽいので
そこのValueを1/0にするだけです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481194/fcebc5a5-79ec-3766-24f3-ed8c6b9b82a2.jpeg" width="480">



```python:LED&#x20;BLINK
>>> from machine import Pin
>>> led = Pin(25, Pin.OUT)
# LED光らせる
>>> led.value(1)
# LED消灯する
>>> led.value(0)
プログラミング日記

2021/01/28　day２３

Rails課題　Twitterクローン　3日目、、、　まだ終わらない
![スクリーンショット 2021-01-28 22.01.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954637/7379b3e9-87f6-1117-9db3-bb653572d085.png)

やっとここまできた、
あとはHTML/CSS仕上げるくらいで、ここもあと少しかな。

久々にHTML/CSSやったけど、久しぶりすぎてめっちゃ忘れてた
そして、今まで勉強してきたJs、Ruby、Railsとかと比べたら難易度が。。ヽ(；▽；)
分からんって思ってもすぐ調べられて気持ち的にも楽。。ヽ(；▽；)そしてデザイン楽しいw
やっぱりプログラミング言語むずかしいね。。もっと頑張ろ！！！




今日はこれしかないけど、メンターに質問した分からんやったところ
言語化って難しい。。


どこでつまずいたか 
①編集を押した際にエラーになる　②HTML　CSSの書き方、書く場所

エラー文　
NoMethodError - undefined method `update' for nil:NilClass:  app/controllers/words_controller.rb:36:in `update'

問題となっているコード
①if @words.update(word_params)

解決したいこと　
①ツイートが編集できるようになる　②HTMLCSSの各場所、書き方
調べた内容　
①カリキュラムのupdateの説明のところを見直す、スペルミス
②カリキュラムRubyを見直す、ググる

仮説　
①翻訳だとupdateが定義されていないとのことなので、定義すればいい？
②元々書かれていたコメントを翻訳したら、/単語コントローラーに関連するすべてのスタイルをここに配置します。//それらは自動的にapplication.cssに含まれます。//ここでSass（SCSS）を使用できます：http：//sass-lang.com/　との記載だったたため、CSSをwords.scss、HTMLをapplication.htmlに書くと反映される？

仮説をもとに行った検証
①binding.pry　
②試しにヘッダーの中身を書いてみたが反映されず
N+1問題とその解決方法

#目次
<b>①N＋１問題とは
<b>②具体例
<b>③解決方法



##①N＋１問題とは
データベースからデータを取り出す際に、必要以上にSQLが発行され動作が悪くなってしまう問題のことをいう。

##②具体例
例えば、Userがcommentを投稿するwebアプリがあるとする。ここで、複数のUserが投稿したcommentを全権取得する場合、ユーザーのnickenameを表示させることをしたいケースを考える。

``` 
class CommentsController < ApplicationController
  def index 
   @comments = Comment.all
  end
end
#コメントを全件取得している
```

``` 

<% @comments.each do |comment| %>
 <%= comment %>
<small><%= comment.user.nickname %></small>
<%end%>
#一つ一つのコメントに対してのユーザーのニックネームを表示している
```
上記の流れを言語化すると
まず、コメントを全件取得している(DBに入っているデータを2件とする。)→1回
そして、それに紐ずくuserを1人取得する→2回
最後に、紐づいているuserを1人取得する。→3回

commentsテーブルに対して1回、userの人数分取得(今回は2回)なので計3回アクセスしていることになる。
これがN+1問題。もしこれが1000件になったら、その分DBにアクセスしなければならなくなる。

##③解決方法
結論としては、icludesメソッドを使う。
icludesメソッドにより、commentsに紐づいているuserを一気に取得できる。
仮にcommentが3つ取得できて、user_idがid=1,id=4,id=8とわかっている場合、usersテーブルから一気に持ってくることでこの問題は解決する。

``` 
class CommentsController < ApplicationController
  def index 
   @comments = Comment.includes(:user)
  end
#コメントを全件取得し,それに紐づくuserをDBから一気に取得している
```
Windows + mamp 環境で mb_send_mail　を使って送信テストがしたい

はじめまして
mamenoといいます

今回は、あまり環境的にノーマルでない、
**Windows**と**mamp**という環境で**お問い合わせメールを送信する**方法が
3日かかってようやくわかったのでメモがてら残しておきたいと思います

#環境
* windows10
* mamp(php ver.7.4.1)

#一般的なパターン
###パターンA
**windows + xampp**
=>そもそもxamppにはFake Sendmailという設定ファイルがあり、その設定ファイルをいじれば送れるようになる

###パターンB
**mac +mamp**
=>mampにはメールを送るための設定ファイルみたいなものはないが、macにデフォルトで備わっているPostfixというものの設定をすれば遅れるようになる

#windiws + mamp でどうしてできないのか
windowsにはPostfixみたいなものはないし、mampにはFake Sendmailみたいなメール送信設定のファイルはない

じゃあwindowsにそういうファイルを別でいれればいいのでは？

ということで、

#fake sendmail のみのダウンロードをする
ダウンロードは[こちら](https://blog.ver001.com/windows_php_sendmail/)を参考に


ダウンロード出来たら解凍してC:直下にsendmailフォルダを保存する

さて、あとは設定を変えるだけ

###php.iniの[mail function]の設定
C\MAMP\conf\php7.4.1\php.ini の[mail function]を変更
（パスはあくまで一例）
変更箇所
SMTP = smtp.gmail.com
sendmail_from = 受け取りたいアドレス@gmail.com
sendmail_path = "\"C:\sendmail\sendmail.exe\" -t"
mail.log = "C:\MAMP\logs\php_mail.log"
→保存

###さっきダウンロードしたsendmail.iniを変更
変更箇所
smtp_server=smtp.gmail.com
smtp_port=587
auth_username=受け取りたいアドレス@gmail.com
auth_password=Gmailのアプリパスワード
→保存

これでお問い合わせが届きました

#超参考にしたサイト
* [PHPで日本語メールを送信するまでの足跡](https://www.storange.jp/2012/01/php.html)
* [XAMPPのFake Sendmail を使用したPHPのSendmail 送信テストの方法](https://kekaku.addisteria.com/wp/20181118071320)
* [Fake Sendmailってなに？？](https://qiita.com/mimuro_syunya/items/df87a14c52c334c460a8)
* [2段階認証に未対応のアプリからのログイン用にアプリパスワードを生成する](https://www.howtonote.jp/google-account/2step-verify/index6.html)
AWSクイックスタートでアーキテクチャや構築自動化を学べる件

こんにちは。AWS歴３年生の人です。突然ですが、AWSクイックスタート使っていますか？

そんなサービスありましたっけ？と、AWS管理コンソールにログインしてサービス検索してみたそこの貴方、管理コンソールに出てくるこのサービスのことではありません。

※こちらは「IoT Analytics」という別サービスです

![01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611580/fe526c40-25dd-1d67-3c80-888e3ac1406c.png)



AWSクイックスタートは日ごろアーキテクチャの参考によくチェックしていたのですが、周りでもあまり知られていないようでしたのでご紹介します。



## AWSクイックスタートとは

[AWSクイックスタート](https://aws.amazon.com/jp/quickstart/)

> AWS クイックスタートは、AWS クラウドでの主要なワークロード向けに自動化されているリファレンスデプロイです。

AWSクイックスタートではよくある構成やソフトウェアを設定込みでデプロイできる「手順」や「テンプレート」、「アーキテクチャ」が公開、共有されています。

短い時間、数ステップで目的の環境をソフトウェア込みで構築できる。さらにカスタマイズも可能。というのがAWSクイックスタートの特徴ですが（中には5分！というのも）、私の場合はアーキテクチャの参考やCloudFormationテンプレートやスクリプトの書き方など勉強目的でみることが多いです。



## 何が嬉しいのか

- 可用性やセキュリティがAWS のベストプラクティスに沿って作られている

  - 大事なところなので安心して構成を参考にできます

- テンプレートやソースコードが公開されている

  - AWSやソフトウェアを開発した専門家のコードを学ぶことができます

- アーキテクチャ図とその説明が記載されている

  - 触ったことのないサービスも具体的な使い方を知ることができます

- デプロイガイドも公開されている

  - 社内の人に共有するときの資料の作り方、配布の仕方などの参考にできます

- ユースケース別に検索できる

  - 例えば「IoT」「分析」「Windows」といった目的に応じた検索ができます。
- 「そんな機能やソフトウェアがあったのか！」というような新しい発見もあります
  


## 一部をご紹介

ソフトウェア会社が開発して提供しているクイックスタートもありますが、今回は主にAWSが開発したクイックスタートの中でインフラやCI/CDの一例を紹介します。



**インフラストラクチャ、セキュリティ**

##### [Linux 踏み台ホスト](https://aws.amazon.com/jp/quickstart/architecture/linux-bastion/)（デプロイ時間5分）

  > VPC 内の Linux インスタンスに安全にアクセスするための Linux 踏み台ホストを AWS インフラストラクチャに追加します。

##### [リモートデスクトップゲートウェイ](https://aws.amazon.com/jp/quickstart/architecture/rd-gateway/)（デプロイ時間30分）

  > リモートデスクトップゲートウェイをデプロイし、リモートユーザーと Microsoft Windows が実行されている EC2 インスタンス間のセキュアな暗号化接続を確立します。

##### [PCI DSS](https://aws.amazon.com/jp/quickstart/architecture/compliance-pci/)（デプロイ時間30分）

  > ペイメントカード業界 (PCI) データセキュリティ標準 (DSS) コンプライアンス向けに標準化されたアーキテクチャをセットアップします。

**DevOps**

##### [AWS CloudFormation テンプレート向け CI/CD パイプライン](https://aws.amazon.com/jp/quickstart/architecture/cicd-taskcat/)（デプロイ時間15分）

  > [CI/CD、テスト] AWS CloudFormation テンプレートを GitHub リポジトリから自動的にテストするためのパイプラインをデプロイします。テスト用の AWS TaskCat、継続的な統合のための AWS CodePipeline、ビルドサービスの AWS CodeBuild が含まれます。

##### [ブルー/グリーンデプロイ](https://aws.amazon.com/jp/quickstart/architecture/blue-green-deployment/)（デプロイ時間15分）

  > [CI/CD] AWS Elastic Beanstalk 環境にデプロイするために、AWS CodePipeline を使用してブルー/グリーンアーキテクチャを構築します。



## 最後に

[AWSソリューション](https://aws.amazon.com/jp/solutions/)というページでもアーキテクチャやCloudFormationのテンプレートが公開されているのでこちらも同じく参考になると思います。

一から作らず既にあるものを活用できたり、AWSのベストプラクティスも学べるのでとてもよいデプロイリファレンスだと思います。

いままでAWS管理コンソールでポチポチと時間をかけてGUIを操作して環境を構築していたのは何だったのか・・・。そう思わせてくれるような便利なアーキテクチャやソフトウェアが今後も増えていくことを期待しています！
Laravelでエラー「Trying to get property 〜 of non-object」が出た時の対処法

#問題

```
Trying to get property 'name' of non-object
```
オブジェクトにnameというプロパティがないということを言っています。
つまりこれは存在しない変数のプロパティやnullの値を参照した時に発生するもののようです。

#解決法

```
{{ $user->name ?? "名無しさん" }}
```
プロパティに値が入っていた場合の変数(値)だけでなく、??の後にプロパティがnullだった場合の変数(値)を記述して用意しておくことで解決できます。
脳波によるBMIあるいはBCIの情報収集 for Cardiologists

#Motivation
脳波で血管造影撮影装置のCアームを動かせたら楽しそう
PythonとC#で開発できれば嬉しい
個人的な情報収集用の記事です
#Devices
・Emotiv https://www.emotiv.com/
TED Talkに良い実例が出てくる https://youtu.be/fVhggGSjXVg
日本のものづくりサークルがアプリを作ってる https://connect-me-net.tumblr.com

HardwareはEmotive Insightが300ドルくらい https://www.youtube.com/watch?v=t6obs3zxpC8
SoftwareはEmotive BCIというアプリを用いるらしい MacとWin両方ある
Qiitaの記事だとこれ https://qiita.com/yuji_miyano/items/67e60e488b19e90a89d8
とりあえずダウンロードしてみた(2021-02-02)

・NEXTMIND https://www.next-mind.com/
注視した際の脳波の変化を読み取る
操作感としてはEye Trackingに近いもののよう
開発キットは400ドルほど
アジア圏には発送してくれないので手に入れるには工夫が必要

・Open BCI https://openbci.com/
BCIにも使える脳波計みたいな感じ?
3D printer用のデータが公開されているみたい

#進捗
調べ始めたところ
Emotivのアカウントを作って無料のアプリをMacにインストールするところまでやってみた
PHP,MySQLで開発したアプリをFTPを使いデプロイする(備忘録)

#FTPを使ったデプロイ手法
FTPを初めて使いデプロイした際、沼に入ったので備忘録として残します。

#開発手法
MAMPのパッケージを使いPHP、MySQLを使用しアプリを実装しました。

#FTPとは
サーバーにファイルをアップロード、またはその逆でファイルをダウンロードしたりしWebアプリやWebサイトをデプロイできるサービスです。
今回使用したのは```FileZila```です。

#サーバーの用意
サーバーは用意されていたものがあったのでそれを使用。

#サーバーに接続

.```FailZila```を開きローカルで開発したディレクトリに移動します
サーバーの接続
ファイル(F)をクリックしサイトマネージャー(F)をクリックし用意されてるサーバー情報を記入します。
ホスト名、ユーザー名、パスワードを記載し接続できたら
先ほどローカルで開発した、アップロードしたいファイルを右クリックしアップロードすればサーバーにファイルをアップロードできます。リモートにアップロードしたファイルを右クリックし[URLをクリップボードにコピー]を選択し
Googleに公開情報を確認

#沼に落ちたmysql構文
よしこれでデプロイできる！！と思いきや...あれ？エラーが起きてる．．．
DB関係で...
色々調べたら、DBをlocalにしておりそれをリモート環境のDBに反映できていなかったです。
そりゃそうだ．．．DBはローカルでしか保存させてないもんな...ローカル構文でしか記述してないもんな．．．知識不足は恥ずかしい...
そこでDB構文の記述を書き換えました。構文にすごく時間をかけました。

```dbconnect.php
try{
  $db = new PDO('mysql:dbname=用意しているdbname;host=ホスト名;port=webに表示させたいURL;charset=utf8','dbユーザー名','パスワード');
} catch(PDOException $e){
  print('DB接続エラー:' . $e->getMessage());
}
```
これでリモートに反映することができました。


知らないことを色々調べて論理付けて学べてよかった。
mergeメソッドについて

#目次
<b>①mergeメソッドとは
<b>②どんな時にしようするのか
<b>③まとめ


##①mergeメソッドとは
ハッシュを結合させる時に使うRubyのメソッド


##②どんな時にしようするのか
結論は、ハッシュを結合させる時。
例えば、form_withでユーザーが投稿した内容はハッシュの中に、キーと一緒に入っているが、ユーザーが記入しない内容も保存したい時に使う。ユーザーのidやその商品のidについては、ユーザーが直接入力することはないが、パラメーターに含めて、DBの保存したい。そのような時に、mergeメソッドを使って、パラメーターに含めたいキーと値を記述する。下記の例では、user_idをcrrent_user.idから、item_idをURLに含めたparamsから取ってきて、パラメーターに含めている。

```
 def image_params
    params.require(:image).permit(:memo,:text).merge(user_id:current_user.id,item_id:params[:id])
 end
```

##③まとめ
requireで指定したモデルに対して送られるパラメーター以外に、他のカラムと該当するデータを持ってきたい時に、mergeメソッドをつかう。
「procs：新しいプロセス表示・検索ツール」の更新紹介（2021/1）

# はじめに
procsというpsコマンドの代替ツールを作っているのですが、
久しぶりに大きなアップデートをしたので紹介します。

ツールの基本的な紹介や過去の更新は以下をご覧ください。

* [procs：新しいプロセス表示・検索ツール](https://qiita.com/dalance/items/388d98c99ae2857d73e6)
* [「procs：新しいプロセス表示・検索ツール」の更新紹介](https://qiita.com/dalance/items/419e516a31510ae0a9f6)

あとYouTubeで紹介してくれている人がいるようです。
英語ですが、10分以上にわたって使い方や設定の書き方など解説してくれています。

[Procs: Nothing Is Safe From A Rust Rewrite Not Even Ps](https://www.youtube.com/watch?v=GBem9cpe7GM)

# 特徴

[procs](https://github.com/dalance/procs)はpsコマンドの代替となるプロセス一覧の表示ツールです。主な特徴は以下の通りです。

* 色・単位付きの表示
* キーワードによる絞り込み
* psで表示できないカラムに対応
 * TCP/UDPポート
 * ディスクのRead/Write速度
 * Dockerコンテナ名
* ページャ対応
* topのような定期更新モード
* ツリービュー

# 更新内容

## ターミナルの背景に応じたテーマ切り替え

procsは出力を色付けするのですが、デフォルトの色は黒背景のターミナルを前提としていました。
そのため白背景のターミナルでは一部の表示が見づらくなってしまっていました。
「コンフィグで色をカスタマイズできるので白背景の人はそれで変えてもらえばいい」という想定でしたが
やはりデフォルト状態で実行したときの見栄えが悪いのは良くないので、背景色を自動検出して
それに応じたテーマを適用するようにしました。

以下はGNOME-terminalで白背景と黒背景にした例ですが、特に設定変更することなく自動で切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84296/7b625e8a-f503-1344-58f1-c423e3322b2f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84296/2225c19b-16cb-5cca-bba3-9fc46e203925.png)

ちなみに自動検出の方法は以前記事にしたので方法に興味のある方はご覧ください。

[ターミナルの背景色を取得する](https://qiita.com/dalance/items/300103cab3a484527d58)

## スレッド情報を表示する

これはかなり以前からの要望だったのですが、スレッドの情報も（特にツリーモードで）表示したいというものがあり、今回Linux限定ですが対応しました。
下のようにPIDが`[]`で囲まれたものがスレッドです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84296/188a6add-2587-815f-aa45-516d44342573.png)
コンソール アプリ向け、簡易版 Web サイト読み込み

極端な例ですが、コンソール アプリで、様々な問題は無視して

```swift
let ws = MyWebLoader("https://www.example.com/")
print(ws.data!)  // データを表示
```

として、サイトのデータを取得したいときの、MyWebLoader クラスです。

**注意: サイトが応答するまで処理がブロックされます**

```swift
class MyWebLoader {
    var sem = DispatchSemaphore(value: 0)
    var error: Error?
    var response: HTTPURLResponse?
    var data: Data?
    init(_ string: String) {
        let url = URL(string: string)!
        let req = URLRequest(url: url)
        let task = URLSession.shared.dataTask(with: req) { dat, res, err in
            self.error = err
            self.response = res as? HTTPURLResponse
            self.data = dat
            self.sem.signal()
        }
        task.resume()
        sem.wait()
    }
}
```
メタクラスを用いてサブクラスの妥当性検証をする

# はじめに

Twitterで一時期流行していた 100 Days Of Code なるものを先日知りました。本記事は、初学者である私が100日の学習を通してどの程度成長できるか記録を残すこと、アウトプットすることを目的とします。誤っている点、読みにくい点多々あると思います。ご指摘いただけると幸いです！

# 今回学習する教材

- [Effective Python](https://www.amazon.co.jp/Effective-Python-%E2%80%95Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%94%B9%E8%89%AF%E3%81%99%E3%82%8B59%E9%A0%85%E7%9B%AE-Brett-Slatkin/dp/4873117569/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Effective+python&qid=1609408832&sr=8-3)

    - 8章構成
    - 本章216ページ

- 第4章：メタクラスと属性

## サブクラスをメタクラスで検証する

### メタクラスとは

メタクラスはクラスより上の概念をぼんやりと意味する言葉であり、単純化すると、Python の class 文に割り込んで、クラスが定義されるたびに特別な振る舞いを与えるものです。
また、Python3 と Python2 で構文が違うようです。今回扱うのは Python3 です。

メタクラスは type からの継承で定義されます。
デフォルトでは、 `__new__`メソッドで関連するclass文の内容を受け取ります。

```python
class Meta(type):
    def __new__(meta, name, bases, class_dict):
        print((meta, name, bases, class_dict))
        return type.__new__(meta, name, bases, class_dict)
```

メタクラスを指定するには、metaclass=メタクラス名 とします。

```python
class MyClass(object, metaclass=Meta):
    one = 1
    
ex = MyClass()
```

メタクラスは、クラス名、それが継承している親クラス、class本体で定義されているすべてのクラス属性にアクセスできます。

```python
ex = MyClass()
# (<class '__main__.Meta'>, 'MyClass', (<class 'object'>,), {'__module__': '__main__', '__qualname__': 'MyClass', 'one': 1})
print(one)
# 1
print(ex.__qualname__)
# __main__
```

### サブクラスを検証

クラスが正しく定義されているかを検証することがメタクラスの使用法の一つです。
メタクラスは、新たなサブクラスが定義されるたびに妥当性検証(validation)コードを実行することで、正しく定義されているか確認することが可能です。
collections.abcなどによるクラスの妥当性検証は、基本的には`__init__`で実行されますが、メタクラスの場合は、それより前にエラーを発見できます。
例として、遠足のおやつの値段が300円以内か検証するコードを書きます。

```python
class ValidateSnack(type):
    def __new__(meta, name, bases, class_dict):
        # 抽象Polygonクラスは妥当性検証しない
        if bases != (object,):
            if class_dict['sides'] >= 300:
                raise ValueError('おやつは300円まで!')
        return type.__new__(meta, name, bases, class_dict)

class Snack(object, metaclass=ValidateSnack):
    price = None # サブクラスで規定される


class Umaibo(Snack):
    price = 10

class Butamen(Snack):
    price = 70

class Cake(Snack):
    price = 400
```

上記のコードを実行すると、300円以上の駄菓子を定義しようとするタイミングで、妥当性検証コードがclass文本体の直後でエラーを発生させます。

```result
Traceback (most recent call last):
  File "33_code.py", line 32, in <module>
    class Cake(Snack):
  File "33_code.py", line 19, in __new__
    raise ValueError('おやつは300円まで!')
ValueError: おやつは300円まで!
```

他にも、以下のようなことをしたいときにメタクラスを用いるようです。

- プログラムで型を自動登録する
- クラスが定義された後で、プロパティを修正したり、注釈を加える
MAX30102のデータシート読んでみた-1

# MAX30102とは？

- High-Sensitivity Pulse Oximeter and Heart-Rate Sensor for Wearable Health
-ウェアラブルヘルスのための高感度パルスオキシメータと心拍数センサー である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/f5cf796f-4572-ee7e-7b0a-95826572c54d.png)

# 買ったもの

- ベストセラーらしいです。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/2e70e9a8-97c0-6af6-903d-ba19358ad102.png)

# なんで？

- コロナウイルスで動脈血の酸素飽和度(経皮的動脈血酸素飽和度)も意味かあるのかな気になって買ってセンターをためしてみたかったです。

## 参考

- 新型コロナウイルス肺炎診療ガイドライン
- https://www.kansensho.or.jp/uploads/files/topics/2019ncov/clinical_protocols_v8.pdf

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/7f115176-627e-aa44-8442-66e1faf591f5.png)

- 酸素飽和度が93％以下かな？

# データシート

- https://datasheets.maximintegrated.com/en/ds/MAX30102.pdf

## General Description

```
The MAX30102 is an integrated pulse oximetry and
heart-rate monitor module. It includes internal LEDs,
photodetectors, optical elements, and low-noise electronics
with ambient light rejection. The MAX30102 provides a
complete system solution to ease the design-in process
for mobile and wearable devices.
The MAX30102 operates on a single 1.8V power supply
and a separate 3.3V power supply for the internal LEDs.
Communication is through a standard I2C-compatible
interface. The module can be shut down through software
with zero standby current, allowing the power rails to
remain powered at all times.
```

```
MAX30102は統合パルスオキシメトリであり、
心拍数モニターモジュール。それは内部LEDを含みます、
光検出器、光学素子、および低ノイズ電子機器
周囲光除去付き。 MAX30102は
デザインインプロセスを容易にする完全なシステムソリューション
モバイルおよびウェアラブルデバイス用。
MAX30102は単一の1.8V電源で動作します
内部LED用の独立した3.3V電源。
通信は標準のI2C互換です
インターフェース。モジュールはソフトウェアを介してシャットダウンできます
スタンバイ電流がゼロで、電源レールが
常に電源が入ったままです。
```

- 心拍と酸素飽和度を測定するためのセンサーですね！


## System Diagram

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/2a59357b-9758-61a6-49da-73ad2c269352.png)

- システム図みるとセンターの中に赤色のLEDとIR(IR・赤外線)LEDがあり、反射する光量をPHOTOダイオードが受けてデータにする。
- 18bitのADCを含めている。
- FIFOもある。


# つづく
Clojureで模様を作る

Clojureを使用し、下のような模様を描いてみました。
この記事は、これをどのように作成したかを説明しています。

![スクリーンショット 2021-01-27 13.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328817/1f3f0733-abce-9e40-65a2-2ce191a7218b.png)

##　準備

本記事のように、グラフィックスを扱う場合や、デスクトップアプリケーションを作る際に便利なのが、

[seesaw](https://github.com/clj-commons/seesaw)

というライブラリーです。seesawは、Javaのswingのハンドラーなのですが、とても簡単にswingの関数やクラスを呼び出す事ができます。

本記事では、以下のネームスペースを使用します。

```clojure
(ns triangle.core
  (:require
   [seesaw
    [core :refer :all]
    [graphics :refer :all]]))
```

## 図形の描画
本記事では、三角形だけしか描画していませんが、後ほど他の図形も描画する可能性があるので、一般に描画可能な図形のプロトコルを定義しておきましょう。

```clojure
(defprotocol Shape
  (painter [this]))
```

プロトコルは、Javaにおけるインターフェイスに対応しています。Shapeは図形を描画するためのプロトコルで、図形描画の際に必要となる関数としてpainterを含んでいます。

それでは、Shapeプロトコルを満たしている図形の集合を描画する関数viewを作ります。

```clojure
(def h 500)

(def w 500)

(defn view
"Shapeの集合を描画する。"
  [coll]
  (let [draw (fn [c g]
               ;; flip y-axis
               (scale g 1 -1)
               (translate g 0 (- (height c)))
               (doseq [x coll] ((painter x) c g)))
        cvs (canvas :paint draw)
        f (frame :width w :height h :content cvs)]
    (show! f)))
```

### 三角形を定義

三角形に対応するレコードTriangleを定義し、Shapeの要件であるpainterを実装します。

Triangleは、頂点の座標と、自分自身の色をデータとして持っています。
また、利便性を考慮し、Triangleを生成する関数（コンストラクター）も用意しておきましょう。

```clojure
(defrecord Triangle [a b c color]
  Shape
  (painter [_]
    (fn [_ g] (draw g
                    (polygon  a b c)
                    (style :foreground :black :background color)))))

;; constructor

(defn triangle [a b c &{:keys [color]}]
  (->Triangle a b c color))
```

### 三角形の分割

冒頭のような図形はどのようにすればできるのでしょうか。

まず、三角形の各変の中点をとり、それらの中点を結ぶ事で、全体を４つの三角形に分割します。

```clojure
(defn mid
  "x,yの中点を返す"
  [x y]
  (mapv (fn [x y] (/ (+ x y) 2)) x y))

(defn parts
  "三角形を４つの部分に分割する。中央の三角形を緑にする。"
  [^Triangle {:keys [a b c]}]
  (list (triangle a (mid a b) (mid a c))
        (triangle b (mid b c) (mid b a))
        (triangle c (mid c a) (mid c b))
        (triangle (mid a b) (mid b c) (mid c a) :color :green)))
```

そのようにできた４つの三角形に対して、これと同じ操作を行えば、全体がさらに細かな三角形に分割されます。これを繰り返していけば、いくらでも細かな模様を作成できるでしょう。

このように、ある操作の結果に対し、同じ操作を適用し、それを繰り返す、という処理を行うにはiterateを使うのが便利です。

```clojure
(defn parts-n
  　"partsをn回適用する事で、三角形を分割する"
  [n ^Triangle x ]
  (nth (iterate #(mapcat parts %) [x]) n))
```

##　結果確認

 以上で準備が整いました。n=3として、結果を確認します。

```clojure
  (view (parts-n 3 (triangle [100 100] [250 400] [400 100])))
```

上のコードで、冒頭に挙げた図形ができました。nの値を大きくすると、さらに細かな三角形で全体が分割されます。
Pythonのpandasで米国株価を取得する

以前、RapidAPIを使って米国株価を取得しました。
https://qiita.com/ShinPun/items/b035297e3fe36409f365

調べてみると以下のようにpandasで簡単に取得できることが分かりました。

```python
import pandas_datareader.data as pdr
import datetime

end = datetime.date.today()
start = end - datetime.timedelta(days=10)

pd_data = pdr.DataReader('MSFT',"yahoo", start, end)

print(pd_data)
```

結果は以下の通りとなりました。

```
High         Low        Open       Close    Volume  \
Date                                                                   
2021-01-19  216.979996  212.630005  213.750000  216.440002  30480900   
2021-01-20  225.789993  217.289993  217.699997  224.339996  37777300   
2021-01-21  226.300003  222.419998  224.699997  224.970001  30749600   
2021-01-22  230.070007  225.800003  227.080002  225.949997  30124900   
2021-01-25  229.779999  224.220001  229.119995  229.529999  33152100   
2021-01-26  234.179993  230.080002  231.860001  232.330002  49169600   
2021-01-27  240.440002  230.139999  238.000000  232.899994  69757500   

             Adj Close  
Date                    
2021-01-19  216.440002  
2021-01-20  224.339996  
2021-01-21  224.970001  
2021-01-22  225.949997  
2021-01-25  229.529999  
2021-01-26  232.330002  
2021-01-27  232.899994  

```
f.collection_selectにclassを設定する

##やりたいこと
collection_selectのクラスにform-controlを指定して見た目を整えたい。

##失敗例
```Ruby
f.collection_select :thank_ids, @thank, :id, :human, prompt: "選択して下さい", class: "form-control"
```
オプションの後にクラスを記述しても何故か適用されない。

##成功例
```Ruby
f.collection_select :thank_ids, @thank, :id, :human, {prompt: "選択して下さい"}, {class: "form-control"} 
```
オプションとクラスを{}で囲むことで適用された。クラスだけでなくオプションも{}で囲まないと適用されなかった。
ちなみにオプションを指定しない場合でも下記の通りクラスはオプションの後に書く必要がある。

```Ruby
f.collection_select :thank_ids, @thank, :id, :human, {}, {class: "form-control"} 
```
Google Maps API のAPIキーを取得するまでの流れ

##Google Maps API の機能について
Google Maps API の機能についてはこちらの記事がわかりやすいので、おすすめです。
https://www.zenrin-datacom.net/business/media/g004/

##1.Googleアカウントでログインする
こちらのリンクから飛んでGoogleアカウントにログインしてください。
https://cloud.google.com/maps-platform?hl=ja

##2.APIキーを取得するまで
1.ヘッダーのGoogle Cloud Platformという文字の右にあるプルダウンをクリックし、APIキーを追加するプロジェクトを選択または作成する。

2.右上のアイコン左にあるConsoleをクリックする。

3.左上のナビゲーションアイコンをクリックする。

4.APIとサービスの認証情報をクリック

5.+認証情報を作成をクリックし、APIキーをクリックする。

6.APIキーが作成される。

##参考サイト
https://developers.google.com/maps/documentation/android-sdk/get-api-key?hl=ja
__getattr__, ___getattribute__, __setattr__について

# はじめに

Twitterで一時期流行していた 100 Days Of Code なるものを先日知りました。本記事は、初学者である私が100日の学習を通してどの程度成長できるか記録を残すこと、アウトプットすることを目的とします。誤っている点、読みにくい点多々あると思います。ご指摘いただけると幸いです！

# 今回学習する教材

- [Effective Python](https://www.amazon.co.jp/Effective-Python-%E2%80%95Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%94%B9%E8%89%AF%E3%81%99%E3%82%8B59%E9%A0%85%E7%9B%AE-Brett-Slatkin/dp/4873117569/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Effective+python&qid=1609408832&sr=8-3)

    - 8章構成
    - 本章216ページ

- 第4章：メタクラスと属性

## 遅延属性には `__getattr__`, `__geatattribute__`, `__setattr__` を使う

### `__getattr__`メソッド

通常、オブジェクトのインスタンス辞書に属性が見つからない場合は、AttributeError になります。

```python
class Sample(object):
    self.exists = 5

sample = Sample()
print(sample.exists)
print(sample.foo)
```

実行結果

```result
5
AttributeError: 'Sample' object has no attribute 'foo'
```

`__getattr__`は、オブジェクトのインスタンス辞書に属性が見つからないときに呼び出されるメソッドです。
例を見てみます。

```python
class SampleGetattr(object):
    def __init__(self):
        self.exists = 5

    def __getattr__(self, name):
        print('__getattr__メソッドが呼び出されました。')

data = SampleGetattr()
print(data.exists)
data.foo
```

実行結果

```python
5
# __getattr__メソッドが呼び出されました。
```

このように、存在しない属性にアクセスしようとすると呼び出されます。
`__getattr__`メソッドは、遅延アクセス（実際にオブジェクトが必要になったときに初期化すること）したい場合に便利です。

```python
class LazyGetattr(object):
    def __init__(self):
        self.exists = 5

    def __getattr__(self, name):
        print('__getattr__メソッドが呼び出されました。')
        value = 12
        setattr(self, name ,value)    # インスタンス辞書に追加

data = LazyGetattr()
print('Before', data.__dict__)
data.foo
print('After', data.__dict__)
data.foo
```

実行結果

```result
Before {'exists': 5}
__getattr__メソッドが呼び出されました。
After {'exists': 5, 'foo': 12}
```

1回目にfooが呼び出されたときにインスタンス辞書に追加し、2回目に呼び出されたときは、既に辞書にあるので`__getattr__' は呼び出されません。

### `__getattribute__`メソッド

`__getattribute__`メソッドは、インスタンス辞書にアクセスしようとした属性が存在してもしなくても呼び出されます。

```python
class SampleGetAttribute(object):
    def __init__(self):
        self.exists = 5

    def __getattribute__(self, name):
        print('__getattribute__メソッドが呼び出されました')

data = SampleGetAttribute()
data.exists
data.foo
data.foo
#__getattribute__メソッドが呼び出されました
#__getattribute__メソッドが呼び出されました
#__getattribute__メソッドが呼び出されました
```

### `__setattr__`メソッド

`__setattr__`メソッドは属性がインスタンスで代入されるたびに呼び出されます。

```python
class SampleSetattr(object):
    def __init__(self):
        self.exists = 5   
        self.x = 2        

    def __setattr__(self, name, value):
        print('__setattr__メソッドが呼び出されました')
        super().__setattr__(name, value)

data = SampleSetattr()
data.x = 3  
data.y = 4 
```

```result
__setattr__メソッドが呼び出されました   # self.exists = 5 の初期化時に呼び出された
__setattr__メソッドが呼び出されました   # self.x = 2 の初期化時に呼び出された
__setattr__メソッドが呼び出されました   # data.x = 3 で x に代入されたので呼び出された
__setattr__メソッドが呼び出されました   # 新たな属性に代入されたので呼び出された
```

### `__getattribute__`と`__setattr__`の問題点

これらのメソッドは、オブジェクトのあらゆるアクセスで呼び出されてしまうため、無限ループの原因になります。回避するためには、インスタンス辞書から値を取り出す`__getattribute__`メソッドでは、`super.__getattiribute__`を使い、オブジェクトの属性を変更する`__setattr__`メソッドでは、`super.__setattr__`を使う必要があります。
親クラスのメソッドを使うことで無限ループに陥らずに済みます。
Railsで再帰的に自分自身を参照する外部キー制約を設定する方法

答えは全て↓にあります。
[アプリケーションのみで参照をコントロールするver](https://railsguides.jp/association_basics.html#%E8%87%AA%E5%B7%B1%E7%B5%90%E5%90%88)
[DBにも外部キー制約を付与するver](https://gist.github.com/seak0503/8c19fc65e129bf1262347efab45353c8)

このユースケースに特化した情報があまりない中で、非常に良記事なのですが、Google検索で引っかかりにくかったので、
どうせまた調べる未来の自分がまたアクセスしやすいように備忘録としてこの記事を作成しました。

未来の自分がこのユースケースで調べるときの検索ワード
「Rails 外部キー 再帰」
「Rails 外部キー 自分自身」
「Rails 外部キー 自分」
「Rails 外部キー 自身」
「Rails 外部キー 自分 参照」
「Rails 外部キー制約 再帰」
「Rails 外部キー 再帰 マイグレーション」

鬼門

- 再帰関数がヒットすること
- 再起するSQL文の作成（テーブル作成部分は前提の上で）
- rails以外の用途
データサイエンスって？

#目次
[1.はじめに](#1-はじめに)
[2.データサイエンスとは](#2-データサイエンスとは)
[3.データサイエンティストとは](#3-データサイエンティストとは)
[4.必要なスキル](#4-必要なスキル)
[5.参考文献](#5-参考文献)

#1. はじめに
皆さん、こんにちは！まさや([@masa__ya8](https://twitter.com/masa__ya8))です！
今回は__2020.12.01__に大学でデータサイエンスサークル(非公認)([@plot_niigata](https://twitter.com/plot_niigata))を設立し、新歓に向けて記事を書きました。記事に関して間違っている点などありましたら、コメントなどで指摘していただけると嬉しいです!


#2. データサイエンスとは
データサイエンスとは、
####「データを活用して課題を解決すること」
です。

インターネットの普及やIT・科学技術の発達などにより、ビックデータと呼ばれる膨大なデータも効率よく扱えるようになったことで、近年その注目が高まっています。

データサイエンスの一連のプロセスとしては、

__問題設定__
&dArr;
__データ収集__
&dArr;
__データ分析__
&dArr;
__モデル構築・精度検証__ &harr; __精度向上の取り組み__
&dArr;
__課題解決__

となります。

ビジネスはもちろん、医療や教育など様々な場面でデータサイエンスは多くの価値を生み出しています。

#3. データサイエンティストとは
データサイエンティストとは、データサイエンスを職業として扱う人のことです。
日本では不足しており、__需要が高く__、__魅力的な職業__と言われています。また、様々なスキルが求められ、統計学やAIに関するスキルが必要不可欠です。

「2.データサイエンスとは」で一連のプロセスを記載しましたが、実際に例を使って説明します。また、この例は「Python実践データ分析100本ノック」の第3,4,5章の内容を使用しています。
####「スポーツジムのデータ」
__問題設定__・・・退会してしまうのを防ぎたい！退会してしまう人はなぜ退会するのか？
&dArr;
__データ収集__・・・ジム利用履歴や会員データなどを使用する
&dArr;
__データ分析__・・・値がないデータ(欠損値)などを処理した後、顧客データの基礎集計や顧客行動の各種統計量を把握し、グラフや表にする（可視化）
&dArr;
__モデル構築・精度検証__ &harr; __精度向上の取り組み__・・・決定木というアルゴリズムを用いて、退会予測モデルを作成する。精度向上の取り組みとして、ここではモデルのパラメーターをいじっている(木構造の深さを浅くしている)
&dArr;
__課題解決__・・・構築したモデルから、どのデータが重要かがわかる。また、データを入力するだけでどの顧客が退会するのかが予測できる


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965545/a668174d-84ec-782b-c7ec-27b0163cd4e8.jpeg" width="25%">
<font color="red">楽天</font>&rarr;[こちら](https://books.rakuten.co.jp/rb/16017220/)
<font color="blue">amazon</font>&rarr;[こちら](https://www.amazon.co.jp/Python%E5%AE%9F%E8%B7%B5%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF-%E4%B8%8B%E5%B1%B1%E8%BC%9D%E6%98%8C-ebook/dp/B07ZSGSN9S/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1BI5XFH44TJJ9&dchild=1&keywords=%E5%AE%9F%E8%B7%B5%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90+100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF&qid=1611842746&sprefix=%E5%AE%9F%E8%B7%B5%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%2Caps%2C276&sr=8-1)

#4. 必要なスキル
以下は、一般社団法人データサイエンティスト協会が公開している情報をもとに作成した3つのスキルセットです。
![スライド1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965545/e4ee0059-a7fd-1c07-2d3a-3d097623227c.jpeg)

##データサイエンス

- データを最適な形式で集計、可視化

- 分析結果を正しく読み取る力

- 機械学習や統計モデルの知識・スキル

など

##データエンジニアリング

- 機械学習などの高度なアルゴリズムの開発・実装

- データ加工

- プログラミング(Python, R, SQLなど)

など

##ビジネス力

- 課題抽出・企画提案

- プレゼンテーション

- コミュニケーション

など

>下記の情報をもとに作成しました。詳しくはこちらをご参照ください。
>[AI drops -未来につながるAIメディア-](https://www.bigdata-navi.com/aidrops/841/)
>[一般社団法人データサイエンティスト協会 スキルチェックリスト(PDF)](https://www.datascientist.or.jp/common/docs/skillcheck.pdf)

#5. 参考文献
この記事は以下の情報を参考にして執筆しました。

- [一般社団法人データサイエンティスト協会](https://www.datascientist.or.jp/)

- [データアーティスト株式会社](https://www.data-artist.com/contents/data-science.html)

- [AI drops -未来につながるAIメディア-](https://www.bigdata-navi.com/aidrops/841/)

- [データラーニングギルド / サルでも分かるデータサイエンス(前編)~データサイエンスって一体何なの?~ (YouTube)](https://www.youtube.com/watch?v=9c8s_3OBtdU)

- 「Python 実践データ分析100本ノック」
合同会社アイキュベータ共同代表 下山輝昌・松田雄馬・三木孝行 著 (秀和システム)
Kerasで作成した機械学習モデルをcoremltoolsで変換する際のメモ

Kerasベースの機械学習モデル（画像認識用）をiOS上で動かす手法の一つとして、coremltoolsでCoreMLベースに変換する方法があります。
この手続き、言うは易しなんですが、公式ドキュメントとかを注意深く読んでいないと色々ハマりまくるので、気づいた注意点を共有したいと思います。

#主な注意点
- バージョン環境・構築（各FWのバージョンを注意深く合わせましょう。）
- 変換関数の選択と引数（変換はできるけど動かない・・・などの事態に対する対策です。）

詳しくは以下で説明します。

#その1：バージョン・環境
※超重要です。互換性がないバージョンが組み合わさると謎のエラーに苦しめられることになります。実行する前に各バージョン番号をよく確認し、入れ替え作業をしましょう。
※現時点でcoremltools4.X系がリリースされているようです。こちらの確認は追ってやりたいと思っています。本記事では3.X系で試行します。

- Python v3.6.9　→現時点ではTensorflowがPython3.7以降をサポートしていないようです。
- Tensorflow v1.14　→coremltools3.4ではTensorfrow2.X系はうまく動きませんでした。（サポートはされているようですが・・・現状は1.X系を強くお勧めです。）
- Keras v2.3.1
- coremltools v3.4
- Google Colab　→実行環境。これはローカルのJupyter Notebookなど、何でもいいと思います。

ちなみに変換後のモデルを動作させている環境は以下の通りです。
- iOS14.2
- Xcode 12.0 

###環境構築
Google Colab上でバージョンを入れ替えます。Google Colabでは"!"を先頭につけることで、コマンド実行できます。
ローカルでやる方は、普通にコマンドライン・ターミナル等で"!"を除去してpipしましょう。

```
!pip install tensorflow==1.14
!pip install keras==2.3.1
!pip install coremltools==3.4
```

また、Kerasはtf.kerasとkerasの2通りのimportが存在します。この2つは別物と考えるべきもののようです。
今回はimport kerasのパターンを使用します。
tf.kerasをimportしている場合は、後述のconvertメソッドの書き方が変わるはずです。

```Python
import keras
```

#その2：変換関数の選択と引数
いよいよモデル変換処理です。予めKerasで構築・学習済みモデルを変数として用意してください。
（以下の例では、target_model変数が該当します。）

```Python
import coremltools

mlmodel = coremltools.converters.keras.convert(target_model,
                                               input_names='image',
                                               image_input_names='image', #重要！
                                               output_names='prediction',
                                               image_scale=1/255) #重要！
```
ここでの注意点を以下に列挙します。
###coremltools.converters.keras.convert関数を使用する
coremltools.convertersモジュールには、kerasの他にtensorflowその他各機械学習FWに対応するモジュールが含まれています。
適切なモジュール・関数を選択しないと、意図通りには動きません。
ここでは、Kerasのモデルなのでcoremltools.converters.keras.convertを選択します。

###引数 image_input_namesの指定
この引数を指定することで、CoreML変換後モデルのデフォルトの入力形式が画像になります。
この引数が未指定だと、入力がMultiArrayになり取り扱いが難しくなります。
（指定する値、ここでは'image'はなんでも大丈夫だと思います。）

###引数　image_scaleの指定
回帰モデルを作成されている方で、出力値がやたらと大きな数値なって謎・・・という方、これが原因の可能性があります。
画像識別モデルを作成する場合は、画素を標準化するのが一般的かと思いますが、
学習段階でその処理を行なっている場合、coremltoolsで変換する場合も同じスケーリングを指定する必要があります。
これを指定しておかないと、SwiftのVisionフレームワーク等を使用する場合に255スケールで画像入力されてしまうようです。

#最後に
以上、タイトル通りメモ書き程度ですが、誰かの役に立てば幸いです。
もし誤りや変な記載があればご指摘いただければと思います。
【Java(Spring Boot)】@〇〇Mappingを理解する

#プログラミング勉強日記
2021年1月28日
[昨日の記事](https://qiita.com/mzmz__02/items/d8b8aee68932574517d5)で`@RequestBody`について扱った。Spring Bootの`@〇〇Mapping`についてちゃんと理解していなかったので、それぞれ理解する。

#〇〇Mappingとは
　簡単に言うと、コントローラクラスの`@〇〇Mapping`はどんな場所なのか知らせてくれるものである。〇〇Mappingのあとの`""`部分はそのURLにリクエストあったときにそれぞれの処理が行われる

## `@RequestMapping`の役割

　全体処理の入り口のようなもの。ここを通ることでいろいろな処理にいくことができる。

##`@GetMapping`の役割
　文字通りGET(取得)の役割を果たす部分。登録されているデータを取ってくる。


##`@PostMapping`の役割
　文字通りPOST(投稿)の役割を果たす部分。新しいデータ登録などをする。

##`@DeleteMapping`の役割
　文字通りDELETE(削除)の役割を果たす部分。既存データを削除する。

##`@PutMapping`の役割
　更新の役割を果たす部分。既存データや情報を上書きする。
Ansibleのcopyコマンドでバックアップファイルのタイムスタンプの書式を変更したい

##参考
[Ansible copy module (Advent Calendar 2018) - copy module (backup時のタイムスタンプの話)](https://blog.rotek.xyz/entry/2018/12/14/103428)

#以前は上記のサイトを参考にさせていただいて出来て
いたんですが、ansibleのバージョンが上がったせいなのか、ちょっとだけほんのちょっとだけ手順が違います。

#環境はCentOS8

#こんな感じで
Ansibleのソースを落とす際のコマンドが

`pip3 download ansible`

すると

```
ansible-base-2.10.5.tar.gz
ansible-2.10.6.tar.gz
```

な感じでbaseも落ちてきて、baseに`basic.py`が含まれています。

#好きなようにバックアップファイルの書式を修正して
あとはpipでインストールするだけ

```
sudo pip3 install -U ansible-base-2.10.5_hoge.tar.gz　　※sudoと-U付けないとエラーになった
sudo pip3 install -U ansible-2.10.6.tar.gz　　　　　　　　※sudoと-Uは不要かも
```

***

###ちなみに自分のbasic.pyの修正はこんな感じ

```python
backup_local

    def backup_local(self, fn):
        '''make a date-marked backup of the specified file, return True or False on success or failure'''

        backupdest = ''
        if os.path.exists(fn):
            # backups named basename.PID.YYYY-MM-DD@HH:MM:SS~
#            ext = time.strftime("%Y-%m-%d@%H:%M:%S~", time.localtime(time.time()))
#            backupdest = '%s.%s.%s' % (fn, os.getpid(), ext)
            ext = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
            backupdest = '%s.%s' % (fn, ext)

            try:
                self.preserved_copy(fn, backupdest)
            except (shutil.Error, IOError) as e:
                self.fail_json(msg='Could not make backup of %s to %s: %s' % (fn, backupdest, to_native(e)))

        return backupdest
```

playbookのファイルで書式が設定出来るといいんですけどねぇ
【MMDetection】 config実践編

## 概要
まだまだ日本語情報が少ない物体検出フレームワーク"MMDetection"について、学んだことを記録していこうと思います。間違い等ありましたらぜひコメントで教えてください。よろしくお願いします。

前回：[config基礎編](https://qiita.com/bellpond/items/75cf51cc48ed8ab50fff)

今回は、実践的にconfigを利用してオリジナルのMask R-CNNを学習していきます。

## configファイルの構造
configファイルにはモデルの構造だけでなく、データセットに関する設定等も記述します。
基本的に、configファイルは以下の4つのパートで構成します。

- model：モデルに関する記述
- dataset：データセットに関する記述
- schedule：学習のスケジュールに関する記述
- runtime：実行時の設定に関する記述（ログやチェックポイント等）

MMDetectionでは、各パートについてベースとなる設定が記述されたファイルが用意されています。詳しくは[こちら](https://github.com/open-mmlab/mmdetection/tree/master/configs/_base_)を覗いてみてください。

## モデルの構築
今回は、既存のモジュールを組み合わせてオリジナルのMask R-CNNを構築します。
既存のモジュールの一覧は[こちら](https://github.com/open-mmlab/mmdetection/tree/master/mmdet/models)。

- Mask R-CNN
- バックボーンはResNet50
- ネックは[Path Aggregation Feature Pyramid Network](https://arxiv.org/abs/1803.01534)（名前は正確かわからないです）
- 学習は12エポック
- データセットはCOCO

### 1. configの作成
Mask R-CNNのデフォルト設定とはネック部分だけが異なるので、その部分だけ修正します。
ファイル名は[ルール](https://qiita.com/bellpond/items/931a2c29a177bbc08888#config%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)に従って`mask_rcnn_r50_pafpn_1x_coco.py`となります。

```mask_rcnn_r50_pafpn_1x_coco.py
# 各パートのdefault設定を継承
_base_ = [
    '../_base_/models/mask_rcnn_r50_fpn.py',
    '../_base_/datasets/coco_instance.py',
    '../_base_/schedules/schedule_1x.py',
    '../_base_/default_runtime.py'
]

# modelのneck部分を修正
model = dict(
    neck=dict(
        type='PAFPN',                           # neckの名前
        in_channels=[256, 512, 1024, 2048],     # 各スケールの入力チャンネル数
        out_channels=256,                       # 各スケールの出力チャンネル数 
        num_outs=5                              # 出力スケール数
    )
)
```
具体的に各モジュールのどのkeyを修正すれば良いかは、各モジュールのソースコードを確認して、クラスのコンストラクタの引数を確認すればわかります。
モジュールは`mmdetection/mmdet/models/*/*.py`にあります。

### 2. 学習と評価
モデルの学習・評価は[こちら](https://qiita.com/bellpond/items/931a2c29a177bbc08888#%E6%97%A2%E5%AD%98%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%AD%A6%E7%BF%92)を参照してください。

## 参考文献
- [公式ドキュメント](https://mmdetection.readthedocs.io/en/latest/index.html)
プログラミング日記#1 

#はじめに#
はじめまして、ぱぱぱぺです‼
Qiitaはプログラミングの勉強をする中で分からないところを検索したり質問をするために始めました。
主にprogateでの自学をしており現在はweb開発パス(node.js)を勉強しており
HTML, JavaScript, MYSQL, Node.jsを一通り勉強しました:muscle:

#これから投稿していくこと
今後は勉強した知識をさらに落とし込むために自作でサイトを作っていこうと思います‼
なので、その日記的なモノを記事として投稿していきたいと思います。

他の人に発信することで勉強をさぼることを防止したり(さぼるなっ)
私と同じように初心者の参考になればなぁと思っています:raised_hands:

みなさん温かい目で見守りください
それでは～:wave:
Ubuntu 18.04の上で手軽にIntel HLS(19.2.0.57)を使うためにDockerでCentOS7を動かす


タイトルのまま...なのですが，以前
[Ubuntu16の上で手軽にIntel HLSを使うためにDockerでCentOS7を動かす](https://qiita.com/miyox/items/852faa5fee6fd6adf2ac)で環境をつくってたのだけど，19.2.0.57をインストールしようとしたら若干手順の変更が必要だったのでメモ．

なお，ホストであるUbuntu 16.04環境の /opt/intelFPGA_pro以下にQuartus一式がインストールしてある，という想定です．ちょっと変則的ですが、環境変数をこんな感じでセットするとすることを想定．

```quartus_env.sh
export LC_ALL=C
export LANG=C
export QSYS_ROOTDIR=/opt/intelFPGA_pro/quartus_19.2.0b57/quartus/sopc_builder/bin
export PATH=/opt/intelFPGA_pro/quartus_19.2.0b57/quartus/bin:$PATH
export PATH=/opt/intelFPGA_pro/quartus_19.2.0b57/qsys/bin:$PATH
export PATH=/opt/intelFPGA_pro/19.2/modelsim_ase/bin:$PATH
source /opt/intelFPGA_pro/hls/init_hls.sh
```

また、vsimが実行できるように

```
sudo ln -s /opt/intelFPGA_pro/19.2/modelsim_ase/linux /opt/intelFPGA_pro/19.2/modelsim_ase/linux_rh60
```

とかしとく。

## 準備
適当な作業ディレクトリを用意する

```
% mkdir -p $HOME/docker/intel_hls
% mkdir -p $HOME/docker/intel_hls/intel_hls
% mkdir -p $HOME/docker/intel_hls/intel_hls/files
% cp quartus_env.sh $HOME/docker/intel_hls/intel_hls/files/
```

`quartus_env.sh`は、`$HOME/docker/intel_hls/intel_hls`の下においておく。

## Dockerファイルの用意
↓の中身の Dockerfile という名前のファイルを`$HOME/docker/intel_hls/intel_hls`の下に用意する．sshでログインする前提は行儀が悪い？？

```Dockerfile
FROM centos:centos7

ADD quartus_env.sh /
RUN mkdir -p /opt
RUN yum -y update
RUN yum -y groupinstall "Development Tools"
RUN yum -y install epel-release
RUN yum -y install which
RUN yum -y install zlib-devel
RUN yum -y install glibc.i686 glibc-devel.i686 libX11.i686 libXext.i686 libXft.i686 ncurses-devel.i686
RUN yum -y install passwd openssh-server initscripts
RUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN echo 'root:password' | chpasswd
RUN ssh-keygen -t rsa -N "" -f /etc/ssh/ssh_host_rsa_key
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
```
以前との違いは、compat-gcc44とかインストールしないこと．インストールするとあとでIntel HLS向けのgccのセットアップでコケる．

## docker-compose.yamlの準備
こんな感じの`docker-compose.yaml`を、`$HOME/docker/intel_hls`の下に作成する。

```docker-compose.yaml
version: '3'
services:
  intel_hls:
    build: ./intel_hls
    image: intel-hls
    container_name: intel_hls
    ports:
      - "30022:22"
    volumes:
      - /opt:/opt
      - /home:/home
```

## 準備が終わったところ

```
% tree $HOME/docker/intel_hls
/home/miyo/docker/intel_hls
├── docker-compose.yaml
└── intel_hls
    ├── Dockerfile
    └── files
        └── quartus_env.sh

2 directories, 3 files
```

とこんな感じのファイルが `$HOME/docker/intel_hls` に作成されたことになる。

## コンテナの作成と起動
ファイルが用意できたら，コンテナ作って起動．

```
% cd $HOME/docker/intel_hls
% docker-compose build 
% docker-compose up -d
```

ホストの`/opt`と`/home`をそれぞれDockerゲスト内でも/optにマウントして使えるようにしている．

終了と二回目以降は，

```
% docker-compose stop
% docker-compose up -d
```
とか。

## HLSを使う

localhostの30022ポートにsshでログインして操作。

```
% source /quartus_env.sh
```

初回は`install_gcc`を実行しろと言われるので実行する．

```
/opt/intelFPGA_pro/hls/install_gcc
```

終わったら動作確認．

```
% cd /root
% cp -r /opt/intelFPGA_pro/hls/examples .
% cd examples/counter/
% make
% ./test-x86-64
% make test-gpp
% ./test-gpp
% make test-fpga
% ./test-fpga
```
バイト数での部分文字列取得

C#(.Net)の部分文字列取得処理は [String.SubString メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.string.substring?view=netcore-3.1) がありますが、これを文字列長ではなくバイト長で処理したいという要望が稀に良くあります。
日本だからね。仕方ないね。

ネット上に色々なサンプルがありますが、ここはシンプルにLinqで書き上げて見ましょう。

## サンプルコード

```csharp
using System.Linq;
using System.Text;

namespace MySample
{
    public class StringUtil
    {
        public static string ByteSubString(string text, int byteLength, int startByteIndex = 0, Encoding encode = null)
        {
            // エンコード未指定時はShift-JISを仮置き
            encode = encode ?? Encoding.GetEncoding("Shift-JIS");

            var cutChars = text
                .SkipWhile((x, i) => encode.GetByteCount(targetValue.Substring(0, i + 1)) <= startByteIndex)
                .TakeWhile((x, i) => encode.GetByteCount(targetValue.Substring(0, i + 1)) <= byteLength)
                .ToArray();

            return new string(cutChars);
        }
    }
}
```

## コード解説
簡単に解説をば。

まず考え方としては文字列を文字配列(char[])として捉えます。
文字配列を [Enumerable.SkipWhile メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.skipwhile?view=netcore-3.1)  で開始位置のバイト数を満たすまで先頭から読み飛ばします。
その後、呼び飛ばした後の文字列を [Enumerable.TakeWhile メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.takewhile?view=netcore-3.1) でバイト長を満たすまで取得します。
最後に取得したchar配列をstringのコンストラクタに投げてやれば文字列として返るので完成です。

汎用性を持たせるために、開始位置とか文字コードの指定は任意で出来るようにしてみました。
ここら辺はお好みでどーぞ。

----

## Q&A

### Q. 指定した開始位置が2バイト文字の間になる場合はどうなるの？
Skipの条件が「先頭から1文字ずつ確認し、開始位置を超えるまで」なので、指定バイト数より少なくSkipする事になります。
（例："ほげふがぴよ" で開始位置指定が「3」の場合は "げふがぴよ"。実際に開始している位置は2バイト目になる。）

### Q. 指定したバイト長が2バイト文字の間になる場合はどうなるの？
Takeの条件が「先頭から1文字ずつ確認し、指定バイト長を超えるまで」なので、指定バイト数より少なくTakeする事になります。
　（例："ほげふがぴよ" で取得バイト長が「5」の場合は "ほげ"。実際に返すバイト長は4バイトになる。）
JUCEで作成するPluginにMIDI Input / Output を付ける

![スクリーンショット 2021-01-28 16.33.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128735/f3d30dfb-297e-e42a-56b1-939181422a1e.png)

左上の歯車マークをクリック。  
表示される設定項目から
Plugin Characteristics -> Plgin MIDI Input
Plugin Characteristics -> Plgin MIDI Output
のそれぞれを☑️する。
【CSS・Chrome】クラスが正しく反映されているのにスタイルが適用されない時に確認したいこと。

個人メモです。

ローカルでcssの修正をして、localhostで正しく反映されていることを確認し、ステージング（or 本番環境）にアップしたところ、**cssが適用されていない場合の対処法**。

コードをみるとタグの**idやclass属性は正しく反映されている**のに、、という時。


##解決方法
キャッシュをクリアする。以上。

ブラウザに以前のキャッシュが残っているので、新しいcssが反映されていない。キャッシュクリアすれば新しいリソースを読みにいくので、意図したcssが正しく反映される。


###便利ツール
chromeツールの`Clear Cache`が便利。

アイコンをワンクリックすればキャッシュがクリアされる。

https://chrome.google.com/webstore/detail/clear-cache/cppjkneekbjaeellbfkmgnhonkkjfpdn

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/8cf7865f-fc92-9d89-397b-733ade2b9dde.png)
ActiveRecordにはどんな種類があるのか？書き方は？

##ActiveRecordとは
人間で言う「脳みそ」のようなものです。勉強し始めた頃、私はこのように覚えました（笑）データベースへ指示を送るメソッドの総称のことをいい、一つ一つのコードはコントローラーへ記述します。少し難しく言うと、ruby on railsでよく使われるORMの１つです。ORM（Object Relational Mapping）とはオブジェクト指向の言語でオブジェクトとして使うために変換してくれるものです。ActiveRecordのメソッドを使うことで、データベースのレコードからデータを取り出してくれたり、レコードへ新しいデータを追加することができます。よく使うActiveRecordのメソッドの種類と書き方をまとめてみました。
間違いやもっと良い書き方があれば、教えてください！
##種類と書き方
今回は「title」と言う名前のモデルがあるとして、コードの書き方を説明します。

__all__　全てのデータを受け取る

```ruby
Title.all
```

__find__　ある1つのデータを受け取る

```ruby
Title.find(取得したいテーブルの数字)
ex) Title.find(3)
#Titleモデルのtitlesテーブルの3番目の値を受け取る
```
__new__　インスタンスを生成する

```ruby
Title.new
```

__save__　インスタンスを保存する

```ruby
Title.save
```

__order__　並び順には2種類あり、それらを使って並び順を変更する
asc→小さいものから大きいもの、古いものから新しいもの（昇順）
desc→上の逆の並び(降順)

```ruby
Title.order("カラム名　並び順")
ex) Title.order("name ASC")
#nameカラムを古いものから並べて、受け取る
```

__where__ 条件に一致したテーブルを_配列_で受け取る

```ruby
Title.where('カラムを含ませた条件式')
ex) Title.where('name > 5')
#５より大きいnameカラムを受け取る
Title.where('id: 1')
#idが１のテーブルを受け取る
```

__create__ テーブルにレコードを保存する

```ruby
Title.create(カラム名： 保存する値)
ex) Title.create(name: params[:first])
#nameカラムにfirstと送られてきたparamsを保存する
```

__includes__ 関連するモデルを一度にまとめて受け取ることができる
allと似ているがallで受け取る場合、アソシエーションがある時に受け取る回数が多くなってしまい、N＋１問題が発生する。その時にincludesを使うことで一度のアクセスだけで多くのデータを受け取ることができるためN＋1問題を解決してくれる。

```ruby
Title.includes(:モデル名)
ex) Title.includes(:name)
#nameモデルが関連するモデル情報をまとめて受け取る
```

以上で紹介を終わります。一覧はこちらです。ぜひ参考にしてみてください！
[rails ガイド](https://railsguides.jp/active_record_querying.html)
【MySQL】外部キー制約

# RESTRICT、CASCADE、SET NULL、NO ACTIONの違い
## UPDATE、DELETEした時の結果
|| UPDATE | DELETE |
| --- | --- | --- |
| RESTRICT | エラー | エラー |
| CASCADE | 参照先の変更に追従する | 参照先が無くなると同時に削除される |
| SET NULL | NULLに置き換わる | NULLに置き換わる |
| NO ACTION | RESTRICTと同様 | RESTRICTと同様 |