OmniAICreator/Qiita-1.07M huggingface dataset:
【2D OD】RCNN : 2D Object Detectionの基礎編

<h1>Rich feature hierarchies for accurate object detection and semantic segmentation</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/0b1aeb5e-0cae-f84c-d017-791ba41f8fe0.png)
2014年に発案された2D Object Detectionの基礎と言えるRCNNを見ていこう

<h1>アルゴリズム</h1>
1. Input Image
2. Extract Region Proposal
3. Compute CNN Feature
4. Classify regions

<h3>Extract region proposal</h3>
[selective search](https://qiita.com/minh33/items/1cb765861dcb8a98b4f5)により物体がありそうな所を提示する

<h3>warped region</h3>
selective searchによって得られたwindow sizeを固定のサイズ(任意)に変換する。
*物体の大きさや縦横比による影響を抑えるため

<h3>classify regions</h3>
Fully Connected Layerを用いてclass分類を行い。
softmaxにてclassの確率合計が1になるように正規化する。


<h1>参考文献</h1>
Rich feature hierarchies for accurate object detection and semantic segmentation
https://arxiv.org/pdf/1311.2524.pdf
Metabase with MariaDB on Raspberry Pi OS

# MariaDB の準備
インストール作業は終わっているものとします。
(参考) [Install MariaDB on Raspberry Pi OS](https://qiita.com/kentmori-8/items/08cd190253af442df908)

## データベースの作成
```sql
pi@raspberrypi:~ $ mysql -u root -p
Enter password:
<snip>
MariaDB [(none)]> CREATE DATABASE metabase DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> CREATE USER metabase IDENTIFIED BY 'metabase';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> GRANT ALL ON *.* TO 'metabase'@'localhost' IDENTIFIED BY 'metabase';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> quit;
Bye
pi@raspberrypi:~ $
```

## Metabase の設定
![Screen Shot 2020-09-25 at 14.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82774/c4471366-c50e-2c1d-72c6-f687b7956577.png)

完了です！
Reactコンポーネントの状態を確認するにはReact Developer Toolsを使う

#目的
WEB上で動作しているページでReactコンポーネントの中身がどのようになっているかを確認する。
→入力やページ遷移での変化を目視確認する

#導入方法

+ GoogleChromeの拡張機能「React Developer Tools」を利用する。
    + [React Developer Toolsのページはこちら](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi)

+ 導入後にコンポーネントを確認したいページでF12を押すと、
以下画像のように「Components」というタグが追加されている。
ここでそのページに関わるコンポーネントとその内容が全て確認できる。
デベロッパーツールのように直接編集することも可能。
![React Developer Tools](https://lh3.googleusercontent.com/W5h-3Esx-a2cOq4TaQ2O5tz-zLMjTupUgJjiFF_wZfszDGHdlGpH0JeZoT29399vLdkRRQqBEeM=w640-h400-e365-rj-sc0x00ffffff)
mindの研究 その16

#概要

mindが謎なので調べてみた。
vistaに入れた。
練習問題、やってみた。

#マウスの位置を取れ

```
メインとは
　結果は　変数
　結果xは　変数
　結果yは　変数
　３を　回数指定して
　　０をつみ
　　結果xの　アドレスをつみ
　　結果yの　アドレスをつみ
　　"user32"と　"GetCursorPos"で　ＡＰＩ呼出し２　結果に　入れ
　　エラー？　ならば
　　　エラー文字列を　一行表示し　終り
　　つぎに
　　「x=」を　表示し　結果xを　数値表示し
　　「 y=」を　表示し　結果yを　数値表示し　改行する
　　一秒待つ
　繰り返す




```

以上。
SpotBugs Gradle Plugin 4.5.0で指摘をコンソールに出力する

SpotBugsの警告をコンソールに出力するために、以下の記事で紹介されている方法を使わせてもらっていたのですが、SpotBugs Gradle Pluginを4系にアップデートしたタイミングでハマったのでメモ

* [Gradle の Findbugs の結果を標準出力に吐き出す](https://qiita.com/k_ui/items/c9b6789ec1b41e0a5060)

### 確認環境

* macOS 10.15.5
* Gradle 6.6.1
* SpotBugs Gradle Plugin 4.5.0
* SpotBugs 4.1.1

### エラー内容

SpotBugs Gradle Pluginを4系にアップデートしようとすると、次のエラーが発生するようになりました。SpotBugs実行後にレポートXMLファイルのパスを取得して読み込むようになっているのですが、そもそもパスを解決できなくなってしまったようです。

```
Execution failed for task ':printSpotBugsResults'.
> Could not get unknown property 'xml' for SpotBugsReport container of type org.gradle.api.internal.FactoryNamedDomainObjectContainer.
```

### 修正方法

レポートファイルを解決する処理を書き換えます。例によってGradle力が低いので、これが一番いい方法かは自信ないです。

```diff
--- a/build.gradle
+++ b/build.gradle
@@ -26,7 +26,7 @@ spotbugs {
 task printSpotBugsResults {
     doLast {
-        printSpotBugsXml spotbugsMain.reports.xml.destination
+        printSpotBugsXml spotbugsMain.reports.getByName("XML").destination
     }
 }
```

### 最終的なコード

最終的にはこんな感じのビルドスクリプトになりました。GradleやSpotBugsのバージョンを上げるたびにハマっている気がしますが、必要経費ということで我慢することにします。

```gradle:build.gradle
import edu.umd.cs.findbugs.SortedBugCollection

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // SortedBugCollectionクラスを使うため
        classpath 'com.github.spotbugs:spotbugs:4.1.1'
    }
}

plugins {
    id 'com.github.spotbugs' version '4.5.0'
}

spotbugs {
    excludeFilter = file('./config/spotbugs/excludeFilter.xml')
    ignoreFailures = false
}

task printSpotBugsResults {
    doLast {
        // NOTE: SpotBugs Gradle Plugin 4.0 以降は reports.xml で参照できない
        // printSpotBugsXml spotbugsMain.reports.xml.destination
        printSpotBugsXml spotbugsMain.reports.xml.destination
    }
}

spotbugsMain.finalizedBy printSpotBugsResults

def printSpotBugsXml(File xml) {
    // 参考URL の printFBXml() と同じ
}
```

### 参考情報

* [Gradle の Findbugs の結果を標準出力に吐き出す - Qiita](https://qiita.com/k_ui/items/c9b6789ec1b41e0a5060)
AWSルートアカウントへMFAを設定する

[AWSのアカウントを作ろう](https://qiita.com/hagaji/items/31717950902c2d8477e4)で作成したルートアカウントへMFAを設定します。

# なぜMFAをおこなうのか
ルートアカウントは、Administrator権限を有する非常に強力なアカウントなので、セキュリティを向上させるためにMFAを設定することが推奨されています。

# ここで行うこと
AWSのルートアカウントの多要素認証へ`仮想MFAデバイス`を設定する。

# MFAを設定する手順
1. AWSコンソールへログイン
2. `マイセキュリティ資格情報`へアクセス
3. `セキュリティ認証情報`で多要素認証（MFA）を有効化する
4. 設定するMFAデバイスを選択する
5. `仮想MFAデバイスの設定`をおこなう
6. `セキュリティ認証情報`で多要素認証（MFA）が有効化されたことを確認する

## AWSコンソールへログイン
ルートアカウントへログインし、AWSコンソールを表示します

![スクリーンショット 2020-09-25 11.51.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703384/4ef4c02b-51f7-2e3c-1ec3-8a82a92f57c8.png)

## `マイセキュリティ資格情報`へアクセス
右上のメニューバーの中にある`マイセキュリティ資格情報`から`セキュリティ認証情報`へアクセスします

![スクリーンショット 2020-09-25 11.52.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703384/074d129f-60ff-672b-4e7d-a536ed7c56c7.png)

## `セキュリティ認証情報`で多要素認証（MFA）を有効化する
多要素認証（MFA）のセクションを開き、`MFAの有効化`をクリックします

![スクリーンショット 2020-09-25 11.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703384/a59f3c42-1e29-c07f-984e-a3402c400998.png)

## 設定するMFAデバイスを選択する
MFAデバイスをここでは`仮想MFAデバイス`を選択します。

![スクリーンショット 2020-09-25 11.52.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703384/08659df2-b1ed-bbc6-0515-9eea66db61c4.png)

#### 補足
`ハードウェアMFAデバイス`を指定することも可能ですが、AWSがサポートされているMFAデバイスが必要になりますので、購入する際にはご注意ください。

## `仮想MFAデバイスの設定`をおこなう
この画面へ表示されたQRコードもしくはシークレッキーを`仮想MFAデバイス`となるアプリケーションへ入力してMFAコードを入手しましょう。

MFAコードが２つあり、ここには時間差で２つのコードを入力する必要があります。
まずは、コード１へ`仮想MFAデバイス`アプリへ表示されいてるコードを入力して、そして、３０秒ほど待ち、新しく表示されたコードをコード２へ入力して、`MFAの割り当て`をクリックします。

![スクリーンショット 2020-09-25 11.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703384/62bfe3a2-8489-48b8-4f7d-26cd75458677.png)

## `セキュリティ認証情報`で多要素認証（MFA）が有効化されたことを確認する
多要素認証（MFA）セクションへデバイスタイプ`仮想`のMFAが登録されていることを確認しましょう

![スクリーンショット 2020-09-25 11.55.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703384/0af7bcde-fbaf-b79a-57c5-dc14849986dd.png)

# AWS公式ドキュメント
[AWS アカウントの root ユーザーの仮想 MFA デバイスを有効にする (コンソール)](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html#enable-virt-mfa-for-root)
議論の前に、その前提を確認しておこう！（ソフトウエアの品質とは？）

# 1.問題提起
こちらのサイトでは様々な論が投稿されています。
僕は特に、プログラミング言語機能の解説や流行の開発パターンのメリットを語るものなど、根底にオブジェクト指向が潜むものに関心があります。

しかし、本来は有益な内容であったとしても曖昧な部分があって、結局は役に立たなかったり、理解できなかったりするものも少なくないように思います。惜しい気がするのです。

これは僕にとっての問題というだけでなく、おそらく、多くの人がその知識や経験を実際に応用しようとしたときに役に立てにくい、といった問題になっていると思うのです。

## 1-1.曖昧であったり、抽象的な説明に終始
我々善良なエンジニアは、誰しも「より良いものを作りたい」と思っているはずです。そして、このサイトでは知識や経験を共有してお互いにより良いものを作れるようになりたい、という願いがあるのだと思います。

その、**「より良いもの」ってなーに？**　（チコちゃん風に）

これをはっきりさせないために、目標がうまく定まらず、結果的に内容が曖昧になりがちなのではないかな、と思うのです。

## 1-2.誰にとっての問題か？
「こうすれば良くなりますよ」とか、「ああすればより安全なコードになりますよ」とか、
それがだれにとって良くなるのか、だれにとって安全になるのかが不明瞭な説明を多く見かけます。
自明であるかのような説明なのですが、いつの間にかその「だれ」が別な人に替わってしまっている、といった文章もありがちな気がします。それを読んで理解した気になっても、いざ実践の場で応用しようとするとうまく行かなかったりします。

# 2.ソフトウエアの品質とは？
「より良いものを作りたい」、つまり、品質の高いソフトウエアを作りたいということですね。
では、ソフトウエアの品質とは具体的にはどういうことでしょうか。
まずはここを確認しておきましょう。

1. 機能性
2. 安定性
3. 保守性

僕は、ソフトウエアの品質はこの3点に集約できると考えています。
そして、これらのどれに役立つ話なのか、しっかりと意識された文章が優れているのだと思います。

## 2-1.機能性
使いやすさや処理速度等の性能、ゲームなどではその面白さまで含まれます。

企画や機能設計など、プログラミング以前のフェーズが大きく影響し、プログラミングにおいては主に処理速度（場合によっては実行モジュールの小ささ）のことを指します。
安定性や保守性とトレードオフの関係になることがあります。

## 2-2.安定性
動作の安定性のことで、バグが含まれないことが求められます。

安定性と機能性は相反する場合がありますが、現在はハードウェアの性能が高くなった分労力を安定性に振り分ける余裕があるので、多くのプログラミングでこれがせめぎ合うケースは少ないと思われます。もちろん、リソースに余裕のないハードウェアをターゲットにしたり、処理速度に関する要求仕様が非常にシビアなジャンルもあり、全てが容易に両立できるわけではありません。

## 2-3.保守性
機能追加や修正のしやすさです。

他の要素に比べて見落とされがちですが、非常に重要な要素です。
機能性とはトレードオフの関係になる場合もありますが、安定性とはトレードオンの関係になる場合が多いと思われます。

# 3.全ての立場を見つけよう
少なくとも、以下に挙げるいくつかの立場については常に明確に意識して（あえて曖昧にすることを含め）議論を進めたいものです。足りなければ是非追加してください。
そして、どの立場にとっての話なのかを明確にすることで格段に読者の理解が進むのではないでしょうか（文章の作者にとっても思考の助けになるはずと思います）。
逆に避けたいのは、全ての立場を含んだような言い回しかも知れません。まるで、神の立場でのお言葉のような。
たとえば、そんなオブジェクト指向の聖書のような書籍は存在しそうですが、役に立て難いのです。

## 3-1.明日の自分は他人とみなす
人は忘れる生き物で、ソフトウエア制作の全工程を独りで行ったとしても、客観的な視点を忘れないようにしましょう、という言葉です。
ここでは客観的な視点、つまりコーディング担当者と、非担当者の2者が現れました。

## 3-2.各プログラム担当者
実際にAという部分プログラムとBという部分プログラムの担当者が異なる場合もありますが、同一人物だったとしてもそれは異なる立場であると考えます。

なぜなら、部分のプログラム（関数だったりクラスだったり）にはプロバイダとユーザが存在するからです。プロバイダというのは、実際にそれを造る人やそのプログラムそのもの。ユーザはそれを使ってプログラムを作る人、あるいは使う側のプログラムそのものです。
もちろん、ほとんどのプログラムはプロバイダとユーザの両方の立場を含みます。

この2者以外に忘れてならないのは、プログラムのプロバイダとユーザの両方を俯瞰する立場です。それは、3-1の非担当者とも共通する、言わば客観的な視点をもつ立場です。

## 3-3.その他の立場
プログラミングでは3-1、3-2等が考えられますが、完成したプログラムを前提にすれば、制作者と使用者といった立場などが考えられます。他にも見落としている立場があるかも知れませんので、随時追加して考えて見ましょう。
UWA GOT Online 機能紹介 /ローカルで任意テスト、オンラインで随時確認

UWA GOT はUWAが提供しているローカル性能診断テストツールで、開発チームが実機でテストを行い、Editorでローカルサーバーを構築し、テストしたデータを確認することができます。現在、UWA GOT既存のローカルテスト機能以外で、オンライン同期分析機能も追加しました。開発チームがローカルのテストデータを[UWAウェブサイト](https://jp.uwa4d.com/)にアップロード、オンラインテストレポートを生成します。**これによりテスト結果をさらに読みやすく、保存された過去のテスト履歴と比較しやく、またUWAからの性能改善レコマンド機能もあります。**
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/e10bd15b-692e-31be-03ed-704fbdabc6bd.png)

###UWA GOT（Online）のダウンロード先
https://jp.uwa4d.com/download にアクセスして「ツールのダウンロード」をクリックしてください。

###UWA GOT（Online）機能説明
UWA GOTでテストしたローカルデータをUWAウェブサイトにアップロードし、「プロジェクト」タブをクリックすれば、「Overview」、「Mono」、「Asset」、「Lua」四つの診断モードを確認できます。アップロードされたすべてのテストデータはそれぞれに対応するテストモードに保存されます。
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7bf79ec0-8a4c-dc7b-0efc-1b792ec834cb.jpeg)
各テストモードで保存されたテストデータの「詳細」をクリックし、左側のメニュー欄で詳細テスト情報を下図のように確認できます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/15ad4ec1-befa-0f92-8ebc-76e5aff11f56.png)
![4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/9b853789-36cc-a84c-ac04-97b6b4838f27.jpeg)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/f468b2d8-c33a-4a06-654f-5e69a0d4553b.png)

###UWA GOT（Online）レポートの特徴
UWA GOTの「ローカル化」と「素早く」というアドバンスのもとで、オンラインレポート機能はプロジェクトのテストニーズを迅速に対応でき、さらに見やすい、ユーザーフレンドリーの形でプロジェクトメンバーに情報を共有することができます。また、レポートでの各問題に対するレコマンド機能やソリューション提案などによって、開発者がタイムリーにプロジェクトのボトルネックの特定や問題解決することができ、プロジェクトの品質管理、改善に貢献します。

以下は「Overview」モードのレポートを一例として、皆様と一緒にUWA GOT (Online)の機能特徴について見ていきましょう！
![6-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/20c9df93-3f88-f424-ecdc-5ef759964d05.png)
概要ページは性能トレンド図とテスト履歴が含まれています。ユーザーは各テストの重要パラメータの性能トレンド、Unityのバージョン、デバイスの型番などの情報を確認したり、ほかのプロジェクトメンバーと共有したり、重要な情報に対して注意書きしたりすることができます。

概要ページ内のテスト履歴の「詳細」ボタンをクリックすれば、さらに詳細な性能情報や最適化レコメンドを確認できます。下図のように、テストしたデバイスの詳細なハードウェア情報や重要パラメータの性能トレンドも確認できます。
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/7e6b2198-238e-54c2-a2d0-b621999d6200.jpeg)
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/99b91ab4-eddd-31d3-24b3-723c851f5f67.jpeg)
上図のように、個別の関数を選択、比較することにより、開発者は正確にCPUコストの真の原因を特定することができます。

同じように， Mono—メモリ分析、Asset診断モードでも同じように重要なパラメータ情報のトレンドや実行時のスクリーンショット、最適化レコメンドなどがあります。
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/9d16d5b7-e478-435c-4e37-a7ea3bd7b98d.jpeg)
上図では，開発者がメモリの使用状況について明確に把握することができ、迅速にメモリコスト問題の特定や改善することができます。
![10.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/b97f01b6-0c55-61b4-f19d-67ab7fd93388.jpeg)
上図のように、性能に関する問題点を優先順位ごとにリストアップされます。それぞれに対して最適化のレコメンドがあります。これらの性能改善ソリューションはテストされたデータが見やすく、使いやすく、テスターでも簡単に問題点を早く見つけることができ、開発チームにフィードバックすることができます。また、重要なパラメータに対して、UWAは推薦値をユーザー様に参考用としてご案内しております。

「MAKE IT SIMPLE」という理念に基づいて、UWAはこれから日本のゲーム開発者のため、誰でもよいゲームをよい品質で開発出来ることに貢献いたします。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com
OneDrive > サイトの設定 > 検索のスクショ

OneDriveと検索について調べ物をしているのでメモ代わりに。
OneDrive内のサイトの設定、検索の画面をスクショします。
スクショ日：2020/09/25

###サイトの設定 > 検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/d6a18117-46a2-8847-5835-9f2f32024070.png)

個人のOneDriveなので私のアクセス許可レベルはフルコントロール。

###サイトの設定 > 検索先の管理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/be9cd146-c6ae-85bc-40ff-9c19fe68aa51.png)

文字が小さいかな。
この「状態」をネガティブすることができたら、検索先を絞れたりできないだろうか。

###サイトの設定 > 検索結果の種類の管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/654f4a1a-fafa-4fbb-234a-8dd052c75996.png)

###サイトの設定 > クエリ　ルールの管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/6e65f507-bfc2-5374-36ac-ddfe524a777f.png)

###サイトの設定 > スキーマ
タイトルが「サイトコレクションの管理-管理プロパティ」となっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/3ecb999e-a6b3-4ba3-15b5-a1247c306bbb.png)

今の私にはこれはまだ上手く扱えないな。

###サイトの設定 > 検索の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/99ff2e56-df0f-a587-dea5-ffe6c863b958.png)

###サイトの設定 > 構成のインポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/9b08a783-8ee8-8563-31b8-31ec9b45321e.png)

ものすごい細かいことだけど、画面上段の説明文は半端に可変らしい…

###サイトの設定 > 構成のエクスポート
これは画面遷移されるわけでなく、押下したらxmlファイルが作成されるのみ。

###(備考)OneDrive内のコンテンツを検索結果に表示させたくない場合(調査中)
Microsoft Searchから検索先として除外することはできないっぽい？

とすると、
①OneDrive側から検索結果に表示させない設定をする
②OneDrive内のドキュメントライブラリ単位で検索結果に表示させない設定をする
などの方法が考えられる。

②なら普通にライブラリの設定からできそうだけど…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317739/0588c47d-239c-accf-3bd9-2b82228c80d5.png)
MySQLでcase式を扱う

構文には以下の2通りがあるようだ。

````sql
CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE
````

````sql
CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE
````

まず1つ目の構文を試してみた

````sql
select shohin_mei,
case shohin_bunrui
    when "衣服" then concat ("A:", shohin_bunrui)
    when "事務用品" then concat ("B:", shohin_bunrui)
    when "キッチン用品" then concat ("C:", shohin_bunrui)
    else null
end as concat_shohin_bunrui
from Shohin;
````

![スクリーンショット 2020-09-25 13.46.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/46414730-df8c-3829-27af-4550d4ca1009.png)

2つ目の構文

````sql
select shohin_mei,
case 
    when shohin_bunrui = "衣服" then concat ("A:", shohin_bunrui)
    when shohin_bunrui = "事務用品" then concat ("B:", shohin_bunrui)
    when shohin_bunrui = "キッチン用品" then concat ("C:", shohin_bunrui)
    else null
end as concat_shohin_bunrui
from Shohin;
````

![スクリーンショット 2020-09-25 13.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/e68298ca-5f5b-83c2-100f-0e53b87c8965.png)


###case式を使った行列変換
以下のようなcase式を使わないgroup byでの出力では行として出力される。

````sql
select shohin_bunrui, sum(hanbai_tanka)
from Shohin
group by shohin_bunrui;
````


![スクリーンショット 2020-09-25 14.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/40f6d2d6-6cc8-572b-16c8-2bc6f58e5d83.png)



case式を使うとこで列として出力することもできる。

````sql
select 
sum(case when shohin_bunrui = "衣服" then hanbai_tanka else 0 end) as sum_ihuku,
sum(case when shohin_bunrui = "事務用品" then hanbai_tanka else 0 end) as sum_jimu_yohin,
sum(case when shohin_bunrui = "キッチン用品" then hanbai_tanka else 0 end) as sum_kitchen_yohin
from Shohin;
````

![スクリーンショット 2020-09-25 14.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/0a7e2e5b-0028-d7b4-6fef-fd95fbf45d90.png)

以下のようなsqlでは、値段ごとの列を作り、数を数えることもできる。

````sql
select 
sum(case when hanbai_tanka <= 1000 then 1 else 0 end) as low_price,
sum(case when hanbai_tanka <= 3000 then 1 else 0 end) as mid_price,
sum(case when hanbai_tanka >= 3001 then 1 else 0 end) as high_price
from Shohin;
````

![スクリーンショット 2020-09-25 14.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197834/43ede338-3ae4-34f4-c1fc-0bb5d1aec0c8.png)


こちらを参考にさせていただきました。
<a href="https://www.amazon.co.jp/dp/B01HD5VWWO/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1">SQL 第2版 ゼロからはじめるデータベース操作
</a>
<a href="https://dev.mysql.com/doc/refman/5.6/ja/case.html">MySQL 5.6 リファレンスマニュアル
</a>
f(x)＝0 であるxの値を近似的に求めるアルゴリズム

応用情報技術者平成28年秋期 午前2

0≦x≦1の範囲で単調に増加する連続関数f(x)が f(0)<0≦f(1) を満たすときに，区間内で f(x)＝0 であるxの値を近似的に求めるアルゴリズムにおいて，(2)は何回実行されるか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/eb678e30-795f-82dc-bc94-a6e7d5d169f7.png)


１、考え方：
f(x)=0の近似的に求めるアルゴリズムので、xは何かは分からないです。
なので、仮にf(0.01)=0とかを使って、実行回数を考えましょう。

・仮の条件：
f(0.01)=0
f(0.01より以上)>0

・流れ：
(1回目）
No 式
1  x0=0,x1=1
2  x=0.5
3  x1-x=1-0.5<0.001だと end
4  f(0.5)>0  x1=0.5
5  2に戻る

(2回目）
No 式
1  x0=0 x1=0.5
2  x=0.25
3  x1-x=0.5-0.25<0.001だと end
4  f(0.25)>0  x1=0.25
5  2に戻る

下は、No3だけをリストします：
回目 No3の結果 
3   0.125
4   0.0625
5   0.03125
6   0.015625
7   0.0078125
8   0.003906
9   0.001953
10  0.000976　< 0.001ので、終了

合わせて１０回です。




参照：

https://www.ap-siken.com/kakomon/28_aki/q2.html
seed-fuを使ってseedデータを作成する方法

## はじめに
railsにはデフォルトでseedが使えますが、初期データを入れる際にはseed-fuを使う方が便利なようです。
sedd-fuでは一部のレコードを更新したり、指定のモデルだけのデータを作成したりできます。
今回は、seed-fuの導入方法と基本的な使い方をご紹介します。

## seed fuをインストール
Gemfileに記載して、bundle installします。

```:Gemfile
gem 'seed-fu'
```

```:ターミナル 
$ bundle install
```


## ディレクトリ構成
`db/fixtures`は最低限必要なディレクトリなのでこちらは作成してください。
`db/fixtures` に作成した seedファイルを置くこともできますが、`db/fixtures/development`、 `db/fixtures/production`のようにseedファイルを作成すると環境ごとに異なるデータを作成することもできます。

また、`db/fixtures`以下のseedファイルはアルファベット順に読み込まれます。
以下のようにファイル名に数字を入れると読み込む順番を指定することが可能になります。

db
├ fixtures
&nbsp;&nbsp;&nbsp;&nbsp;├ 01_group.rb
&nbsp;&nbsp;&nbsp;&nbsp;├ 02_user.rb
&nbsp;&nbsp;&nbsp;&nbsp;├ 03_tweet.rb

例として`02_user.rb`を記載します。

```02_user.rb
10.times do |n|
  User.seed do |s|
    s.name = "name-#{n}"
    s.email = "user-#{n}@test.com"
  end
end
```
## rails db:seedでseed fuが使えるようになる設定
`rails db:seed_fu`で全てのデータを順に作成することができますが、
下記のようにseeds.rbに一文書くことで、通常のseedのようにデータを作成することもできます。
seed-fuを知らない人でもデフォルトのseedと同じようにデータを作成できるので設定しておくと良いと思います。

```seeds.rb
# rails db:seed で Seed Fu 呼び出せるように設定
SeedFu.seed
```

## ファイルを指定してデータを作成する場合のコマンド
下記のコマンドでモデルを指定してデータを作成可能です。

```:ターミナル 
rake db:seed_fu FILTER=01_group, 02_user  # 複数指定する場合はカンマ区切り
```

## 終わりに
seed-fuではいろいろと便利な機能があるので、詳細は下記を参考にしてください。
[railsで初期データを入れる(seed-fuの使い方)](https://qiita.com/ko2ic/items/be96e450a33d631e0059)
[seedデータってどうやって入れる？seed-fuを使った便利なSeedデータ挿入法](https://t1gerk1ngd0m.hatenablog.com/entry/2019/08/23/231129)
Firebase Hostingで特定Pathのみ異なるFileを読み込みたい - hosting rewrites exclude source path

もっといい方法が有ればコメントで教えて下さい！！

## 結論

```json
{
  "hosting": {
    "site": "my-project",
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "!/login",
        "destination": "/index.html"
      },
      {
        "source": "/login",
        "destination": "/login.html"
      }
    ]
  }
}

```

## 問題提起

### SPAサイトでindex.html以下とlogin.html以下で分けてbuildしてHostingしたい

まず、それシングルじゃ無いやん。
というツッコミは置いておいて、

Firebase Hostingで特定のURLの場合だけ
index.htmlとは異なるファイルを読み込んで欲しいというニーズが有ったので書いてみます。

### 除外するpathの書き方

`"source": "!/login"`

この書き方で`/login`以外のpathでは`/index.html`が読み込まれるようになります。
ただ、この書き方では`/login`にアクセスするとnot foundになってしまうので追記します。

※ `"public": "dist"`の指定で`/index.html`は`/dist/index.html`が読まれている。

```json

{
  "hosting": {
    "site": "my-project",
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "!/login",
        "destination": "/index.html"
      }
    ]
  }
}
```

###  /login以外は/index.htmlを読み、/loginは/login.htmlを読み込む

こちらが冒頭の結論のコードと同じものになります。

```json
{
  "hosting": {
    "site": "my-project",
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "!/login",
        "destination": "/index.html"
      },
      {
        "source": "/login",
        "destination": "/login.html"
      }
    ]
  }
}

```

## 補足

### 除外pathの複数指定

`"source": "!/@(login|lp)"`

`!/@(path|path)`で除外ファイルを複数指定する事が出来ます。

詳しくは下記を参考にしてください。
[Firebase Hosting Glob pattern matching](https://firebase.google.com/docs/hosting/full-config#glob_pattern_matching)

```json
{
  "hosting": {
    "site": "development-concru-react",
    "public": "dist",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "!/@(login|lp)",
        "destination": "/index.html"
      },
      {
        "source": "/login",
        "destination": "/login.html"
      },
      {
        "source": "/lp",
        "destination": "/lp.html"
      }
    ]
  }
}

```
４. Koa2を使ってWebページを作成しよう ~koa-bodyでpostパラメーターを取得~ 

## 記事一覧
* [第一回 Koa2の環境を構築する](https://qiita.com/MEDICE-NOTE/items/0c0d18cf01bc4ae50c05)
* [第二回 Hello World!! を表示する](https://qiita.com/MEDICE-NOTE/items/6260a7a58bc0c3303de0)
* [第三回 koa-routerでGETパラメーターを取得する](https://qiita.com/MEDICE-NOTE/items/bb363d091bff59345da7)

## 概要
当ページでは、koa-bodyを利用してPOSTパラメーターの取得を行います。
また、前回の続きとして進めて行くので、上手くいかない場合は以前の記事をご覧ください。

## koa-bodyとは
formなどで送信されたリクエストを取扱うミドルウェアで、multipartやjson形式のデータも扱うことができる特徴があります。
https://github.com/dlau/koa-body

### インストール
コンソール上で以下のコマンドを入力
`npm install koa-body`
 
### 導入

koa-bodyを利用するために、`/index.js`を以下のように修正してください

```index.js

const path = require('path');
const Koa = require('koa');
const render = require('koa-ejs');
const koaBody = require('koa-body');

const app = new Koa();
render(app, {
   root: path.join(__dirname, 'view'),
   layout: 'layout',
   viewExt: 'ejs',
   cache: false
});

app.use(koaBody());

// POSTの送信を行うページをルーティングに追加
const postRequestRouter = require('./router/post-request');
app.use(postRequestRouter.routes());
app.use(postRequestRouter.allowedMethods());

// その他routerの記述は省略

app.listen(5000);
```

次に、POSTリクエストをクライアントから送信するために、送信フォームを作成します。

## 送信フォームを作成
`/view/post-request.ejs`を作成し、以下の記述を追加してください。

```post-request.ejs
<form action="/post-request" method="post">
   <input type="text" name="post-text">
   <input type="submit" value="送信">
</form>
```

次に、今作成したejsをレンダリングする処理を作成します。
`/router/post-request.js`を作成し、以下の記述を追加してください。

```post-request.js
const Router = require('koa-router');
const router = new Router();

router.get('/post-request', async (ctx) => {
   // GETリクエスト時の処理
   console.log('GETリクエストを受け付けました。')
   await ctx.render('post-request');
});

router.post('/post-request', async (ctx) => {
   // POSTリクエスト時の処理
   // POSTされた値はctx.request.bodyに連想配列で格納される
   console.log('POSTリクエストを受け付けました。テキスト: ' + ctx.request.body['post-text']);
   await ctx.render('post-request');
});

module.exports = router;
```

以下のコマンドでサーバーとして起動し、**localhost:5000/post-request** にブラウザでアクセスしてください。

`npm start`

すると、 アドレスバーでのアクセス時にはGETが、送信ボタンが押された時にはPOSTが呼ばれており、POST時は入力した値を取得できていることがコンソール上で確認できます。

次に、これをブラウザの画面上で表示できるように、ejsファイルを修正します。
ejsの解説は前回の記事に書いているので、こちらをご覧ください。

## POSTパラメーターをブラウザ画面に表示
`/router/post-request.js`を以下のように修正してください。

```post-request.js
router.get('/post-request', async (ctx) => {
   await ctx.render('post-request');
});

router.post('/post-request', async (ctx) => {
   let text = ctx.request.body['post-text'];
   await ctx.render('post-request', {postText: text});
});
```

`/view/post-request.ejs`に以下の記述を追加してください。

```post-request.ejs
<% if(typeof postText === "undefined"){ %>
   <p>GETリクエストを受け付けました。</p>
<% } else { %>
   <p>POSTリクエストを受け付けました。<%= postText %></p>
<% } %>
```

以上でPOSTパラメーターの取得と表示は完了です。

## 最後に
次の投稿では、MySQLへの接続とログイン機能を実装していく予定です。
SES(雇用形態の方)の特徴

## 記事を書く目的
これからプログラマになる方、プログラマになったが今後どのように進んでいくか検討している方に、
__・SES(プログラマ):3年__
__・受託開発:1年__
__・自社開発:2年__
を経験して感じた情報を発信し一人でも多く納得したキャリアを進んでほしいなと思い書きました。

ちょっとした業界の説明も入れています。

後々、受託開発や自社開発で掴んだ特徴も書いてみたいと思います！

__※所属企業によって異なる部分もあります。意見交換できると嬉しいです！__

## SES
所謂派遣として現場にアサインして、一定期間働く形態ですね。
助っ人外国人枠です。(活躍するかどうかはその人次第的な)

基本的に、
__1.案件を自身が所属している会社の担当営業からこれを受けてみないかと提案される__
__2.承諾すると面談が組まれる__
__3.1～2回ほど面談する(自身のスキルシート等プレゼン資料持ち込みの就活面談みたいな感じ、偶に実力試験もあり)__
__4.合格するとアサイン決定__
__5.契約終了で次の案件へ__
以下ループ...
といった流れです。

#### 特徴
__・比較的採用される際のハードルが低い__
文系未経験でもOK！とかの触れ込みの企業の多くがこのSESの形態を取っています。
入社時のスキルはあまり求められない傾向。
研修で最低限のスキルを学ばせて、あとは自分で頑張ってね！スタイルです。

__・所属する会社の営業力によって仕事内容の振れ幅が大きい__
基本的にスキルの浅いプログラマを開発者枠としてアサインさせるのはリスクなので極力避けたく、中々設計～開発フェーズの案件に関われないパターンがあります。
ポートフォリオを用意したり、資格を取得してポテンシャルの高さをアピールすればアサインできるパターンもありますが、実務経験がないとちょっと...とお断りされるパターンも多いです。
そこで__先輩とセットでアサインさせる営業ができる会社ですと、比較的ロースキルプログラマでも開発できるチャンスに恵まれます。__
~~怖いところだと、ちょっと話題になったスキル詐(略~~

__・勤怠が重視される__
エンジニアなら技術第一だろ！と思いたい面もありますが、
__決まった時間に安定して与えられた業務をこなすことが重視される会社が多い傾向__があります。

__・スキルの成長も案件に大きく左右される__
良く案件ガチャとか揶揄されるやつですね。
勿論自学習でスキルを伸ばすことも出来ますが、
__実務で素晴らしいプロの技術に、プロの本気目線でレビューされながら触れられる経験__はかなり貴重だと思います。__SESで人を集めている企業=受託or自社開発で実績を出せている会社が多い__ので、学ぶポイントはたくさんあります。
・セキュリティ
・ツールの選定
・組織形態
・アーキテクチャ
・ソースコード
・ディレクトリ構成
...etc
私の場合ですと、__SES時代に関わったシステムや社員の方から学び取った内容が今自社開発を行う指針となり、かなり役立っています。__

__・多くの人と異なる環境で働ける__
受託・自社開発の会社ですと、基本的に転職でもしない限り、大きな環境の変化はありません。(メンバーの入れ替えはありますが)
それに比べると、SESの場合__色々な開発現場に出会うチャンスに多く恵まれます。__


__・穏やかな人の方が向いている__
アサインする側の視点からすると、
__SESで入る人員は外部の人間であり、契約して借りてきた商品__となります。
職場に悪い影響を与えるような商品ならクレームしたくなると思います。
ケースによりますが、受託開発や自社開発の場合よりも、
__人間関係を穏便に済ませられる性格の方が向いていると思います。__
私の場合ですと、あくまで現場の主役は雇い主である受託or自社開発の企業であり、自身は脇役と考えるとしっくりきます。

__・現場で仕事を生み出せるセールスエンジニアは重宝される__
スキル・コミュ力がともに高いと、現場に入って次の案件や補充要因案件を引っ張ってこれる事があります。その場合、自身の査定評価に反映する企業も多く、給与アップに繋がります。

## 最後に
あまり書き過ぎると怖いのでこのくらいにしたいと思います・・・。
近年SESはやめとけという声が非常に大きいので、私なりに特徴を並べてみました。

__個人的な総評としては、良く企業の分析を行ったうえで、良い取引をしている、比較的商流の高そうなSES事業ならば、若いうちの武者修行に選択してもいいと思います！__
PHP Laravel 6 おすすめ映画投稿サイト作成過程 8:ジャンルタグ追加編（前編）

#ジャンルタグの追加

####映画のジャンルをタグで分けられるようにします


##必要なファイルの作成
※-a はallオプション

```
$ php artisan make:model Modesl/Tag -a
```

##マイグレーションファイルの設定

タグは以下の5種類にしますが、いずれもタイトルカラムの一つとなります。
よって、追加するのはタイトルカラムのみです。

タグ：SF アクション　コメディ ドキュメンタリー サスペンス

```recommend/database/migrations/2020_09_25_124109_create_tags_table.php
 public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->timestamps();
        });
    }

```


##初期データの作成
まず、シーダーファイルを作成します。
![Screen Shot 2020-09-25 at 12.57.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/736153/a9717fa7-8529-9e8f-f9c2-e4d768a5915b.png)

次に、以下の要領でタグを作成します。

```recommend/database/seeds/RecommendTagSeeder.php
<?php

use Illuminate\Database\Seeder;
use App\Models\Tag;

class RecommendTagSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Tag::create([
          'title' => 'SF',
          'title' => 'アクション',
          'title' => 'コメディ',
          'title' => 'ドキュメンタリー',
          'title' => 'サスペンス',
        ]);
      }
    }
```

##データベースの作成

```
$ php artisan migrate
```

##シーダの実行
オートローダを再生成します。

```
$ composer dump-autoload
```
シーダーを読み込みます。
今回は読み込むシーダーを指定するため、以下のようにします。
なお、指定しない場合はDatabaseSeederクラスが実行されます。

```
$ php artisan db:seed --class=RecommendTagSeeder
```
３. Koa2を使ってWebページを作成しよう　〜GETメソッドの利用〜


## 記事一覧
・[第一回 Koa2の環境を構築する](https://qiita.com/MEDICE-NOTE/items/0c0d18cf01bc4ae50c05)
・[第二回 Hello World!!を表示する](https://qiita.com/MEDICE-NOTE/items/6260a7a58bc0c3303de0)

## 概要
KoaではGETとPOSTが異なる手段で認識されるため、GETパラメーターは`koa-router`を、POSTパラメーターは`koa-body`を利用して、それぞれ分けて取得する必要があります。
なので、当ページではまずはGETのみについて扱い、POSTは次の投稿で書く予定です。
また、前回の続きとして進めて行くので、上手くいかない場合は以前の記事をご覧ください。

## GETパラメーターを表示しよう
ますはGETリクエストをクライアントから送信するためのHTMLフォームを作成します。
`/view/get-request.ejs`を作成して以下のコードを追加してください。

```get-request.ejs
<form action="/get-request/form" method="get">
    <input type="text" name="get-text">
    <input type="submit" value="送信">
</form>
```

次にHTMLのレンダリングを実行する処理を記載したRouterを作成します。
`/router/get-request.js`を作成して以下のコードを追加してください。

```get-request.js
const Router = require('koa-router');
const router = new Router();

router.get('/get-request', async (ctx) => {
    await ctx.render('get-request');
});

router.get('/get-request/form', async (ctx) => {
    // GETパラメータはミドルウェアのkoa-routerがctx.request.queryに配列で格納しており、
    // get-request.ejs内のテキストボックスのnameの値であるget-textをキーとして、入力した値が取得できる。
    let text = ctx.request.query['get-text'];
    console.log('テキスト: ' + text);
    await ctx.render('get-request');
});

module.exports = router;
```

作成したRouterを読み込む処理をindex.jsに追加します。
index.jsに以下のコードを追加してください。

```index.js
const getRequestRouter = require('./router/get-request');
app.use(getRequestRouter.routes());
app.use(getRequestRouter.allowedMethods());
```

以下のコマンドでサーバーとして起動し、**localhost:5000/get-request** にブラウザでアクセスして下さい。
`npm start`

送信ボタンを押すと、コンソール上に入力した値が表示されていることが確認できます。

次に、これをブラウザの画面上で表示できるように、ejsファイルを修正していきます。
ejsはjsの処理でレンダリングする時に、jsからの値の受け取りやjsの実行ができます。
これを利用することでHTMLを動的に生成することができます。
具体的には、`render()`関数の第二引数に指定した値がejsに渡され、ejsファイル内にjsを記載して<% %>で囲うことで、レンダリング時にjsが実行されます。

`/view/get-request.js`のrouterの処理を以下のように修正して下さい。

```get-request.js
router.get('/get-request', async (ctx) => {
    await ctx.render('get-request');
});

router.get('/get-request/form', async (ctx) => {
    let text = ctx.request.query['get-text'];
    // 'getText'をkey、GETパラメータの値をvalueとしてget-request.ejsに連想配列を渡して、
    // レンダリングを実行
    await ctx.render('get-request', {getText: text});
});
```

以下のコードを`/view/get-request.ejs`に追加して下さい。

```get-request.ejs
<% if(typeof getText === "undefined"){ %>
    <p>テキストを入力して下さい</p>
<% } else { %>
    <p>GET [<%= getText %>]</p>
<% } %>
```

if文でgetTextを受け取っているかの判定をして、受け取っていない場合は 
`<p>テキストを入力して下さい</p>`
を出力し、受け取っている場合は 
`<p>GET [<%= getText %>]</p>` を出力する。
<%=  %> では、囲った変数の値をHTMLとしてレンダリングするので、GETパラメータで「HogeHoge」を渡している場合は 
![get-request2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685849/875734d1-2910-9bc3-5936-7ea51083b155.png)

が最終的に出力されます。

## まとめ
以上でGETパラメータの取得と表示は完了です。
次の投稿では、初めにも触れたkoa-bodyを使ったPOSTパラメータの取得を書いていきます。
Google Cloud Vision APIをrailsに導入する際、ドキュメント通り進めてみた。

##環境
・Rails 6.0.3.3
・ruby 2.7.1

##参考資料
Google Cloud Vision APIドキュメント
１、https://cloud.google.com/vision/docs/libraries?hl=ja

#導入手順
##1、gemインストール

gemfileに記述

```
source "https://rubygems.org"
gem "google-cloud-vision"
```

そのあとに、

```
bundle installl
```

<font color="red">※公式では「gem install google-cloud-vision」の手段での方法を推奨されているが、私のappではうまくいきませんでした。</font>
後ほど出てくる

```
require "google/cloud/vision"
```
という記述でエラーが発生て詰まった。（これのせいで凄く時間食った）




##2、認証の設定
Google Cloud Vision APIを利用するために専用のjsonファイルを作成し、対象のrailsappに読み込ませる必要がある。
・jsonファイルを作成
▶︎ドキュメント通りの手順で詰まることはない。出来上がったファイルはこんな感じ


```
{
  "type": "",
  "project_id": "",
  "private_key_id": "private_key_idの中身",
  "private_key": "-----BEGIN PRIVATE KEY-----の中身\=\n-----END PRIVATE KEY-----\n",
  "client_email": "",
  "client_id": "",
  "auth_uri": "",
  "token_uri": "",
  "auth_provider_x509_cert_url": "",
  "client_x509_cert_url": ""
}
```
・railsappに読み込ませる
▶︎.bash_profileに入力してパスを通す

```
export GOOGLE_APPLICATION_CREDENTIALS="$PATH:パスを書く/ファイル名.json"
```

##3、実際に使ってみる。

```routes.rb
get  "contents/index"  => "contents#index"
```

```contents_controller.rb
class ContentsController < ApplicationController
  def index
  end
end
```



```index.erb
<%=
# さっきインストールしたgemの読み込み
require "google/cloud/vision"

# インスタンス化
image_annotator = Google::Cloud::Vision.image_annotator

# 画像のパスを入力（ローカルでもネット上の画像でも問題ない）
file_name = "./resources/cat.jpg"

# 画像を認識した後に返す返り値
response = image_annotator.label_detection image: file_name
response.responses.each do |res|
  puts "Labels:"
  res.label_annotations.each do |label|
    puts label.description
  end
end
%>

```

##4、contents/indexリダイアルすると…


![スクリーンショット 2020-09-25 13.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640569/a5a0e840-8cce-c26b-8055-01df31384502.png)

こんな感じの返り値が表示されてたら成功です！
（試しに猫の画像を取り込んだので「Cat」が出てますね。笑)


ここから、自分が欲しい情報を取得し整形することで、よしなに利用できます！
読んでくださりありがとうございました!!
【SEO】URLはすべてのページcanonicalをつけて正しく正規化しろ

【備忘録】

たまにcanonicalの設定がないページを見かける



「 https://www.example.com/ 」をindexさせたい

「 https://www.example.com/?hogehoge 」もindexされていたら、どちらかがコピーコンテンツ扱いされるよね。

```
<link rel="canonical" href="https://www.example.com/">
```

ちゃんとcanonicalつけておこうね
GridViewの表示を自分で制御したい

GUIを利用せずに自分で制御する方法を記載。

##GridViewタグのプロパティは以下を設定

AutoGenerateColumns　⇒　DataBindしたときに、指定したColumn以外は表示しないようにする。
ViewStateMode　⇒表示だけの利用ならdisabledにすると余計な情報を送らなくて済む。


```html
<asp:GridView ID="grd01" runat="server"  AutoGenerateColumns="False">
    (中身は後述)
</asp:GridView> 
```

##asp:GridViewタグ配下の設定
* 構成は、 asp:GridView ＞ columns ＞ asp:TemplateField　の順にする。
* asp:TemplateFieldタグ配下にHeaderTemplateタグ（ヘッダー行に利用）とItemTemplateタグ(表示モードの表内容)を用意する。

これで１つの列

```html
                <asp:TemplateField>
                    <HeaderTemplate><!-- この中をHTMLで自由に装飾できる --></HeaderTemplate>
                    <ItemTemplate><!-- この中をHTMLで自由に装飾できる --></ItemTemplate>
                </asp:TemplateField>
                ：
                必要な列分だけ繰り返す。
```

##asp:TemplateFieldタグ配下の設定
* HeaderTemplateタグの中には、一般のhtmlタグを利用できる。
* ItemTemplateタグの中には、一般のhtmlタグとaspのコントロールを設定できる。
* .cs側で設定したDataBindの値は<%# DataBinder.Eval(Container.DataItem, _{列名}_ ) %>で注入できる。

こんな感じ

```html
                <asp:TemplateField>
                    <HeaderTemplate><div>列01</div></HeaderTemplate>
                    <ItemTemplate>
                        <div>
                            <asp:Label ID="iptCol01" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "col01") %>' />
                        </div>
                    </ItemTemplate>
                </asp:TemplateField>
```

##まとめ（サンプル）

aspx側

```html
    <asp:GridView ID="grd01" runat="server"  AutoGenerateColumns="False" ViewStateMode="Disabled" >
        
        <Columns>
                <asp:TemplateField>
                    <HeaderTemplate><div>列01</div></HeaderTemplate>
                    <ItemTemplate>
                        <div>
                            <asp:Label ID="iptCol01" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "col01") %>' />
                        </div>
                    </ItemTemplate>
                </asp:TemplateField>

                <asp:TemplateField>
                    <HeaderTemplate><div>列02</div></HeaderTemplate>
                    <ItemTemplate>
                        <div>
                            <asp:Label ID="iptCol02" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "col02") %>' />
                        </div>
                    </ItemTemplate>
                </asp:TemplateField>
         </Columns>
    </asp:GridView>
```


aspx.cs(C#)側

```C#
        //(ここから)実務ではDBから取得したデータをBindするが、サンプルなので、データを自作
        DataTable table = new DataTable();
        table.Columns.Add("col01",typeof(String));
        table.Columns.Add("col02",typeof(String));
        table.Columns.Add("col03",typeof(String));

        DataRow row = table.NewRow();
        row["col01"] = "ID 001";
        row["col02"] = "サンプル太郎";
        row["col03"] = "あいうえお";
        table.Rows.Add(row);

        row = table.NewRow();
        row["col01"] = "ID 002";
        row["col02"] = "サンプル 次郎";
        row["col03"] = "かきくけこ";
        table.Rows.Add(row);
        //(ここまで)実務ではDBから取得したデータをBindするが、サンプルなので、データを自作

        //C#側は、DataGridオブジェクトにデータを設定して、Bindするだけ。
        grd01.DataSource = table;
        grd01.DataBind();
```
【備忘録】Djangoの単体テスト実行時にカバレッジを計測する

## 目的
Django上で実装した単体テストが網羅出来ていない箇所を探索する為, `coverage`を導入してカバレッジの計測を行う.

## 検証

### 環境
- [Django](https://docs.djangoproject.com/en/3.1/): 3.1
- [coverage](https://coverage.readthedocs.io/en/coverage-5.3/): 5.3

### 導入
Djangoは既にインストール済みであることを前提とする.

```shell
$ pip install coverage
```

### 計測
全テストを実行し, 計測を行う. この時に`.coverage`ファイルを生成される.

```shell
$ coverage run --source=. --omit='*/tests*' manage.py test
```

この時, 単体テストを集約している任意のディレクトリを対象外にする為, `--omit`オプションを使用してカバレッジの計測の対象外としている.
計測時のオプションの種類についてはhelpを参照する.

```shell
$ coverage run --help
```

### 結果
計測結果を出力する.

```shell
$ coverage report -m
Name                                                 Stmts   Miss  Cover   Missing
----------------------------------------------------------------------------------
auth/models.py                                          61      7    89%   15, 28-30, 115-116, 119
...
config/__init__.py                                       0      0   100%
...
----------------------------------------------------------------------------------
TOTAL                                                  967    207    79%
```

カラム名とその意味については以下の通りである. `Missing`は, `-m`オプションを使用することで出力される.

|カラム名|意味|
|:-:|:-:|
|Name|カバレッジ計測の対象ファイル名を指す.|
|Stmts|Statementsの略称. 実行可能コードの行数を指す.|
|Miss|Stmtsの中で実行されなかった行数を指す.|
|Cover|カバレッジ(網羅率)を指す.|
|Missing|Missの対象となった行番号を指す.|

結果出力時のオプションの種類についてはhelpを参照する.

```shell
$ coverage report --help
```

また, HTMLやXML, JSON形式などでレポートを生成することも可能とのこと. 詳細は[ドキュメント](https://coverage.readthedocs.io/en/coverage-5.3/cmd.html#html-annotation-coverage-html)に記載されている.

## まとめ
Djangoの単体テスト実行時にカバレッジを計測することで, 網羅していない箇所を可視化した.

## 参考
- https://coverage.readthedocs.io/en/coverage-5.3/
MDM経由でChromeをGsuiteの管理対象ブラウザにする方法

## 管理対象ブラウザって何？
* 会社のGsuiteに登録した状態のChrome。詳しくは[公式参照](https://support.google.com/chrome/a/answer/188446?hl=ja)
* GsuiteからいろいろChromeのポリシーを配れるようになる
* Chromeに入っている拡張機能などの情報をGsuiteのAdminコンソールから確認できる

ブラウザの拡張機能って制限するの厳しくね？　じゃあせめて可視化したくね？　って言い始めた人がいたのが今回記事をかくことになった発端。

## 各端末のChromeを管理対象にする方法
やっぱり詳しくは[公式参照](https://support.google.com/chrome/a/answer/9301891?hl=ja&ref_topic=9301744)。概要としては以下の3ステップでよい。

1. 登録用のトークンをGsuite Adminコンソールで発行する
2. このトークンを端末に配布・設定する
3. 端末でChromeを再起動すると管理対象としてAdminコンソールで管理できるようになる

あとは定期的に監視するなりポリシーを配るなり。

## トークンの配布をMDMで行う方法
### Mac x Jamfのケース
* Jamfについては[Google公式で手順がある](https://support.google.com/chrome/a/answer/9771882)。こちらの手順に従って進めればOK。
* 簡単に言うとConfiguration Profileを作成して、配布してやればよい。簡単。

### Windows x Intuneのケース
* Windowsは[レジストリに登録トークンを設定してやる](https://support.google.com/chrome/a/answer/9301891?hl=ja&ref_topic=9301744)必要がある。
* ADにドメイン参加してる端末とかならGPOで終了だが、フルリモート環境とかでやろうとするとVPNがなかったりした場合結構辛い。というかそもそもADが存在しないケースとかもある。（今回はAzureAD単独の環境）
* regファイル配ってユーザーに実行してもらうというのももちろん手だが、ここは[IntuneでPowershellスクリプトのリモート実行を行う](https://docs.microsoft.com/ja-jp/mem/intune/apps/intune-management-extension)。
    * Intune Management Extensionが必要なので注意。といっても、Win10 1607以降でIntuneに登録すれば自動でインストールされる。古い端末等ではケアが必要。

まずはレジストリを変更するためのPowershellを作る。[参考にしたサイト](https://www.vwnet.jp/Windows/PowerShell/Regedit.htm)

```enrollment.ps1
$RegPath = "HKLM:\SOFTWARE\Policies\Google\Chrome"
$RegKey = "CloudManagementEnrollmentToken"
$RegKeyType = "String"
#Gsuite側で発行した登録用トークンを入れる
$RegKeyValue = "XXXXXXXXXXXXXX"

#登録済みだった場合、Enrollmentのレジストリができちゃってるので、そちらを消す
$EnrollmentRegPath = "HKLM:\SOFTWARE\Google\Chrome\Enrollment"
$Enroll_CHK = Get-Item $EnrollmentRegPath -ErrorAction SilentlyContinue
if ( $Enroll_CHK -ne $null ) {
    Remove-Item -Path $EnrollmentRegPath -Recurse
}

#登録作業
$RegPath_CHK = Get-Item $RegPath -ErrorAction SilentlyContinue
if ( $RegPath_CHK -ne $null ) {
    #レジストリがあるなら、キーもあるか確認
    $RegKey_CHK = Get-ItemProperty -Path $RegPath -Name $RegKey -ErrorAction SilentlyContinue
    if ( $RegKey_CHK -ne $null ) {
        # キーがあれば値を更新。
        Set-ItemProperty -Path $RegPath -Name $RegKey -Value $RegKeyValue
    } else {
        # キーが無ければ新規作成
        New-ItemProperty -Path $RegPath -Name $RegKey -PropertyType $RegKeyType -Value $RegKeyValue
    }
} else {
    #レジストリがなかったらどっちも新規で作る
    New-Item -Path $RegPath -Force
    new-ItemProperty -Path $RegPath -Name $RegKey -PropertyType $RegKeyType -Value $RegKeyValue
}
```


その後、Intune上でPowerShellスクリプトを登録する。(※2020年9月時点の情報なので、適宜読み替えてください)

1. Intuneの[管理画面](https://endpoint.microsoft.com/)にアクセス(最近Azureポータルから独立したらしい)
2. デバイス > スクリプト > 追加 > Windows10
3. `基本` → ポリシー名と説明を適宜記入
4. `スクリプト設定`
    1. ↑で作成したスクリプトファイルをアップする
    2. `このスクリプトをログオンしたユーザーの資格情報を使用して実行する`は**いいえ**に設定(レジストリの変更にあたって管理者権限が必要なため。ログオンユーザーが管理者権限持ってるならはいでもOK)
    3. `スクリプト署名チェックを強制` → `いいえ`
    4. `64 ビットの PowerShell ホストでスクリプトを実行する ` → `はい` (これは環境に合わせて適宜変えてください)
5. `割り当て` → **デバイスグループ**を指定

以上。あとはスクリプトのチェックインが1時間毎(もしくは再起動の度)に走るので、テスト機で動作を確認すればOK。
なお、スクリプトの中身を変えれば他のレジストリのメンテナンス等にも利用できます。

## さいごに
前々からいってるがMSはドキュメントや管理画面のUIをだな。。
TestFlightで内部テスターにアプリをテストしてもらう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d6bf2217-3603-8316-dbb3-c278bd0dc57c.png)

リリース前のアプリを内部ユーザーにインストールしてもらってテストしてもらう手順です。

# 手順

###１、テストするアプリをApp Store ConnectにUploadする。
XcodeからArchiveしていつも通りアップ。
###２、テストユーザーを登録。
App Store Connectの「ユーザーとアクセス」の＋ボタンでテストユーザーのメールアドレスを指定して追加。
**テストユーザーに招待メールリンクから承認してもらう必要があります。**

###３、TestFlightでテスター登録
App Store ConnectのAppからテストするアプリページを開き、TestFlightタブを開く。
**アプリがアップロードされていれば、ビルドに表示されているので、クリックして「輸出コンプライアンス」の設定をしておく。**これしておかないとテストできません。

左のメニューから内部グループのApp Store Connectユーザーを選び、＋ボタンから２、で登録したテストユーザーをテスターに追加する。
**２、でユーザーに承認してもらっていないと、テスター候補に表示されません。**

###４、TestFlightアプリをダウンロードしてもらう。
テスターにはTestFlight招待メールが送信されます。App StoreからTestFlightアプリをダウンロードすると、招待されたアプリをインストールしてテストできます。

内部テスターは１００人まで登録できます。

１万人までテストできる外部テストには、アップルのアプリ審査を受ける必要があります。

****
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
AWSって何？

生徒　ジョン:relaxed:
講師　先輩:frowning2:
　　



ここで登場するのは、

プログラミング歴なしのジョン（主人公）。

AWS講師の先輩。

ジョンが一人前のAWSエンジニアになる物語です。

インフラって何？？それ美味しいの？？？

って方に向けて、極力わかりやすくAWSを紹介していきます。
＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿_

ジョン
「インフラって言葉聞いたことあるんだけど、ネットにおけるインフラってなんっすか？」

先輩
「そんなの自分で調べろ。ググったら出てくる」

ジョン
「え？わからないんですか？www」

先輩
怒。。
「生活や仕事などを営む上で不可欠なものあるだろ（公共の福祉のため整備・提供される施設）。水道とか道路とか」
「ネットでもこの土台部分が整備されてないとコンテンツすら見れないって訳だ」
「だからネットにおけるインフラとは、主にサーバーやストレージやネットワークのことを指すんだ」

ジョン
「おお。わかりやすい。」
「じゃあ。クラウドってなんですか？」

先輩
「雲だよ！！！！！！！」

ジョン
「馬鹿にしないでくださいw」

先輩
「馬鹿にしてるようだけど、間違ってもいないんだな」

ジョン
・・・・・？？？？？

先輩
「そもそもクラウドって定義が曖昧なんだ」
「インフラにおけるクラウドとは。。。。。」
「簡単に説明すると、ジョンがサーバーを持っていなかったとしても、ネット上でサーバーを持つことができるんだ」
「サーバーに限らず、ストレージっていうデータの保管場所やネットワークも構築できる」
「ようは、秋葉や日本橋に行ってサーバーを購入してーセットアップしてーなんてことしたくねーだろ？」

ジョン
「そんなことしてる時間があれば、BBQでもしたいっすねw」

先輩
「遊ぶことしか頭にねーのか。w」
「時間だけでなく、サーバーを借りることで費用も抑えられる。」
「１台サーバーを用意して何万って払うのと、借りて１ヶ月課金の何百円ならどっち選ぶ？」

ジョン
「後者ですねーー」

先輩
「もちろんここだけ伝えれば、クラウドのメリットばかりに感じるよな」
「でも自前でインフラを準備する。これをオンプレ（オンプレミスの略）っていうんだが、オンプレにした方が有利な場合もある。」
「ケース×ケースだが、例えば自社で独自のセキュリティーを高めたいとかの場面に有効なんだ」
「しかし、そうなったらセットアップやサーバーを構築・維持する技術者も必要だよな」

ジョン
「確かに。」

先輩
「固定費を支払っても十分メリットがある場合はオンプレにする場合もあるんだ」
「でも時代はクラウド化してるらしいけどな」

ジョン
「どこでそのインフラを借りることができるのですか？」

先輩
「いろいろあるけど、今後インフラに興味があるならAWSがいいんじゃなかな？」

ジョン
「【AWS】って？？？？」

先輩
「みなさんお馴染みのAmazon.com社が提供するクラウドコンピューティングサービスのことだ」
「Amazon Web Serviceの頭文字をとったものだな」
「Amazonって、膨大な情報量（商品や顧客などなど）を処理しなければならないだろ？その技術を一般の人にも提供してる訳」

ジョン
「AWSがなぜおすすめかというと」

・低価格、初期費用なし、従量課金制
　→使用した分しか費用が発生しないし
・継続的な値下げ
　→過去10年で７０回の値下げ
・サイジングからの解放
　→サーバーの台数を瞬時に増減できる。
・ビジネス機会を逃さない
　→オンプレだとサーバーを運用するまでに、購入、セットアップなどで半年や数年かかることもあるが、AWSなら瞬時にサーバー構築ができる。
・最先端の技術をいつでも使用可能
　→AWS では 165 を超えるサービスを提供(投稿日現在)
・いつでも即時にグローバル展開
　→AWSでは世界中にデータセンター(リージョン)があり、アベイラビリティゾーン（複数のデータセンター郡）が存在しているため。グローバルに展開可能。
・開発速度の向上と属人性の排除
・マネージドサービスによる、運用負荷の軽減
・高いセキュリティーを確保
・24時間365日日本語によるサポート

詳しくは
https://aws.amazon.com/jp/aws-ten-reasons/

ジョン
「訳わからないですけど、とりあえずメリットは沢山あるってことですね」
「ちょっとAWSに興味を持ってきました。今から勉強します！！！」

先輩
「質問も従量課金だからな」
Railsでアプリを作るためのチュートリアル1(Yay! You're on Rails!までの最初の手順)

新規アプリケーションの立ち上げ

```
rails _railsのバージョン_ new アプリ名 -d 使用するdb(mysqlなど)
```

データの保存形式の変更

```config.database.yml
encoding: utf8mb4
encoding: utf8 #<=変更
```

データベースの作成

```
rails db:create
```

サーバーの起動

```
rails s
```

ローカルホストにアクセス
「Yay! You're on Rails!」
PHP Laravel 6 おすすめ映画投稿サイト作成過程 7:ルートの制限編

#ルートの制限

####レート制限
Laravelには、ルートにレート制限をかける便利なミドルウェアが用意されています。
今回は、ゲストと認証ユーザー別のレート制限をかけて、ログインしていないとRecommendContorollerのページに遷移できないようにしてみました。

```recommend/app/Http/Controllers/RecommendController.php
Auth::routes();

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
  Route::resource('recommends', 'RecommendController');
  Route::get('/', 'RecommendController@index');
});
```

誤って　Auth::routes();　を制限下に置かないようにしましょう。
以下のようにしてしまうと、ログインページにも遷移できなくなってしまいます。

```recommend/app/Http/Controllers/RecommendController.php

//このように書いてはいけません
  Route::middleware('auth:api', 'throttle:60,1')->group(function () {
  Auth::routes();//遷移できません
  Route::resource('recommends', 'RecommendController');
  Route::get('/', 'RecommendController@index');
});
```
Android SDK platform-tools 旧バージョン インストール

## 結論
Xの部分を欲しいリビジョン番号に書き換えます。

`https://dl.google.com/android/repository/platform-tools_rXX.X.X-darwin.zip`

## URLの雛形が変わった場合の対応方法
URLの雛形が変わる場合があるので、雛形入手の手順も記載しておきます。

### URLの雛形
Android SDK platform-toolsに関する情報は下記を参照します。

https://developer.android.com/studio/releases/platform-tools.html

最新版は画面トップでインストールできるので、まずは最新版インストールのURLを入手しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/fddeda05-430b-6ae2-4d9c-3b932eca3c4d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/ac876429-f490-b9ee-97b6-1b8409a8f31f.png)

#### 入手したURL
`https://dl.google.com/android/repository/platform-tools-latest-darwin.zip`

### 欲しいリビジョン番号の入手
画面を下にスクロールすると過去のリビジョンについての情報が記載されてます。
欲しい番号を入手しましょう。
※画面上部にある言語設定はEnglishにしましょう。他の言語だと更新されてない場合があります。

https://developer.android.com/studio/releases/platform-tools.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237014/958252fd-7976-bff7-25a6-70bf7eb3b8fd.png)

URLの雛形の`tools-latest`の部分を欲しいリビジョン番号で書き換えます。

`https://dl.google.com/android/repository/platform-tools_r29.0.6-darwin.zip`

これでダウンロードできます。


### 参考
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14182946004
Red Hat OpenShift Operator Workshop - データベースの公開と確認 (Part 4/4)

皆さん、こんにちは。戸倉彩です。

今回は、2020年9月24日(木)にオンライン開催されたIBM主催の **[「Digital Developer Conference Hybrid Cloud」](https://developer.ibm.com/conferences/digital-developer-conference-hybrid-cloud-apac/)** のTrack 3 Hands-on Labsで提供されている **「Operator Workshop」** の手順内容について、全スクリーンショット付きで日本語で解説した記事となります。実際にOpenShift Operatorに触れてみたい方も参考にしていただければと思います。
参照元: [Digital Developer Conference Hybrid Cloud - Lab Stream](https://ibm-developer.gitbook.io/digital-developer-conference-hybrid-cloud/)

## 前提条件
IBM Cloud上でOpenShiftクラスタを作成してください。※IBM Cloudの有料サービスとなりますので、ご利用の際には十分に気をつけて操作を行ってください。
Digital Developer Conference Hybrid Cloudに参加されている方は、**[「Pre-Work」](https://ibm-developer.gitbook.io/digital-developer-conference-hybrid-cloud/getting-started/pre-work)**サイトで公開されている申請方法で、Workshopを体験いただくためのOpenShift on IBM Cloud環境を一時的に無償で手に入れることができます。

## Part1 PostgreSQL Operatorのインストール
こちらのQiita記事[「Red Hat OpenShift Operator Workshop (Part 1)」](https://qiita.com/ayatokura/items/0021bdda8db54c100ed2)をご覧ください。

## Part2 データベースのインスタンス作成
こちらのQiita記事[「Red Hat OpenShift Operator Workshop (Part 2)」](https://qiita.com/ayatokura/items/177014873200091b241b)をご覧ください。

## Part3 スキーマのロード
こちらのQiita記事[「Red Hat OpenShift Operator Workshop (Part 3)」](https://qiita.com/ayatokura/items/177014873200091b241b)をご覧ください。

## Part4 データベースの公開と確認
参照元: [Expose and verify](https://ibm-developer.gitbook.io/digital-developer-conference-hybrid-cloud/operator-workshop/lab2/lab2_expose)

1. データベースを公開するためのコマンドを実行する。  

```
oc expose deploy creditdb --port=5432 --target-port=5432 --type=LoadBalancer --name my-pg-svc
```

2.`oc get` コマンドを使って自分のデータベースの外部IPアドレスを確認する。

```
oc get svc
```

3.`my-pg-svc` サービスの外部IPアドレスをコピーし、接続する。パスワードは `postgres` です。

```
docker run -it --rm postgres psql -h <ip> -U postgres
```

4.下記のコマンドを実行して確認する。

```
\c example
\dt *.
```
<img src="https://uvxxdq.by.files.1drv.com/y4m6DoVEmO3mr5oTirkbiftcPY3MkEn2TucdFnvkdJmAxYzMb7MVNKpZSSWrOTXWHida_P3pZiMhuUAmwMyQkxi0i8srtvp4UEAUf6ycpsIemjU8ZIxeZfeFibqCHJBGQaIC_NmxJZxhNGmYus7tYx3cN3Tkc8nTYF--HJuo2hXzd1BOwzBJLLhXNzAHTLcukO8YUZ9tz-BS00atTO2kYWlMw?width=1283&height=769&cropmode=none" width="600">

5. 確認を終えたら `exit` で終了する。

Part4の操作は以上です。
これでRed Hat OpenShift Operator Workshopパートはすべてとなります。お疲れ様でした。

## 参考
英語で操作可能な方は、下記サイトにアクセスして操作をお試しください。
- Part 1 [Install the PostgreSQL Operator](https://ibm-developer.gitbook.io/digital-developer-conference-hybrid-cloud/operator-workshop/lab2/lab2_install)
- Part 2 [Create an instance of a database](https://ibm-developer.gitbook.io/digital-developer-conference-hybrid-cloud/operator-workshop/lab2/lab2_create)
- Part 3 [Load the schema](https://ibm-developer.gitbook.io/digital-developer-conference-hybrid-cloud/operator-workshop/lab2/lab2_load)
- Part 4 [Expose and verify](https://ibm-developer.gitbook.io/digital-developer-conference-hybrid-cloud/operator-workshop/lab2/lab2_expose)

★Twitterで最新情報配信中 [@ayatokura](https://twitter.com/ayatokura)