OmniAICreator/Qiita-1.07M huggingface dataset:
Kaggle初心者に読んでほしい 超オススメ書籍 & 学習方法

## 概要・想定対象読者
以下のような人を __対象読者__ としてKaggle初心者がコンペに参加するまでの学習方法とオススメの書籍を紹介
* 「Deep Learningを勉強してみたい」「Kaggleに参加に参加してみたい」けど何から手を付ければよいかわからない
* Kaggleを始めてみたけど、機械学習の全体像や次に何を勉強すればいいかが分からない

## はじめに
2019年くらいにDeep Learningについてちょっと興味を持って[「ゼロから作るDeep LearningーーPythonで学ぶディープラーニングの理論と実装」](https://www.oreilly.co.jp/books/9784873117584/)で初歩理論を理解したは良いけど、「実際どう使えばええんや？」ってなって学習進捗が滞ってました。
が、最近(2022年)本屋にいったら自分にぴったりのKaggleとDeep Learningの全体像がわかる本に出会い、めちゃめちゃ学習が捗りました！！
結論としては下記の2冊が超オススメの書籍で、特に[Kaggleスタートブック](https://www.kspub.co.jp/book/detail/5190067.html)は自分にとってKaggleの全体像が分かる神書でした。初心者はこの2冊で十分だと思いますし、あまり手を広げすぎるとノイズになるかなと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602075/41ac2200-5c4d-b7b3-f4c3-5772ea00c9fd.jpeg" width=25%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602075/a2a5e38d-6fd7-274c-f665-9cf4e03faa0d.jpeg" width=25%>

## 学習方法

Kaggleコンペ参加までの学習プロセス・媒体をまとめるとこんな感じかなと思います。
下部を見てわかる通り、とりあえず開催中のコンペに参加！というレベルであれば、書籍は「Kaggleスタートブック」と「Kaggleで勝つデータ分析の技術」だけでいったん大丈夫かなと思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602075/5543b209-cbfc-2467-58cb-6b7fa8a62c92.jpeg" width=100%>



### ①過去問を確認
まずはKaggleのTutorialにあるTitanic問題で、コンペの参加方法や各種データ(trainデータ等)のDL方法・submit方法などKaggleのお作法を一通り学べます。沈没するTitanicの船で誰が生存するかを予想する問題です。
Kaggleスタートブックでは、このTutorialを題材として、Kaggleのアカウント作成方法から分析結果のsubmit方法まで丁寧に解説してくれています。またとりあえずsubmitまでやってみようということで、すぐに動かせるSampleコードも用意してくれているので、写経してすぐにsubmitすることが可能です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602075/b06210f0-92b4-351b-90ba-cf72187a7ae6.jpeg" width=50%>


### ②学習計画
Kaggleスタートブックでは上記のすぐに動かせるSampleコードについて、Deep Learningの処理フロー毎に詳細に解説が載っています。
* データの読み込み
* 特徴量エンジニアリング
* データの前処理(Null埋め等)
* モデリング
* データ出力
* 精度向上の工夫(アンサンブル等)

そのため初心者でも1つの模範解答についてたやすく理解でき、現状足りていない、あるいは今後学習すべき知識が何かを把握しやすい仕組みとなっています。
さらにKaggleスタートブックでは、3章にて「Titanicの先に行く」と題して今後学習すべき方向性を示唆してくれていますので、Next Stepも非常にクリアです。

### ③学習・研鑽
上述の通りKaggleスタートブックでは、3章に「Titanicの先に行く」と題して今後学習すべき方向性を示唆してくれており、代表例として「Kaggleで勝つデータ分析の技術」を参考にすべき旨があります。
実際「Kaggleで勝つデータ分析の技術」を一通り理解できれば、モデルの精度を上げる方法(例: 勾配ブースティング)について実践で活用が可能となります(自分はまだ全てを理解しきれていませんが・・・)。

Kaggle本番への参加に向けては基本的には上記2冊で足りますが、必要に応じて別の学習媒体も参考にすればよいと思います。
* 例①: Titanic問題をやる中で、そもそもPythonのコードが読めない等の問題があれば必要に応じて無料学習サイト([CodePrep](https://codeprep.jp/featured)等)で学べば良い。
* 例②: 判定処理がLogisticRegressionのパッケージの中でブラックボックスになって気持ち悪いという人は、どういう理論(勾配法)で判定処理が行われているのかを「[ゼロから作るDeep Learning](https://qiita.com/TATETATE0927/items/30c8f38ee4bb91c6fe1f)」で学ぶ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602075/cb7f5681-b84c-c52d-4015-812d78c8d8f9.jpeg" width=75%>

### ④本番
現在行われているコンペに参加！


## 最後に
Kaggleの勉強も大学受験の勉強と流れは同じですね。
* 過去問を答え丸写しでいいからとりあえず解く
* 何ができないか理解し、一個一個不明点を潰していく学習計画を立てる
* 計画に従って参考書をもとに勉強する
* 入試本番

時間を見つけて②学習計画～④本番までのサイクルを回していきたいと思います。
ここまで読んでいただきありがとうございました。:bow:
<Spigot>1回だけ発動するClickEventを作る


# 1回だけ発動するClickEventを作る ~Spigot~

ちょっとしたメモ程度に書くことにします。
初めての投稿なので読みにくくなってしまっているかもしれませんがどうぞ。

## ClickEventが何度も発動してしまう
「一度だけクリックして処理を行うことのできるチャットメッセージ」を送信できるようにしたいなと思い様々なところのスレッドを覗いてみて、どうにかこうにか
* クリックしたら様々な処理が実行されるメッセージ

を作成することができた。
しかしそのメッセージはクリックされると何度でも処理を行ってしまう。
一度だけ行いたい処理を任せようと思っていたがこれではいけない。
「only once」など私の貧相なボキャブラリの中から絞り出した英単語を並べて検索をしてみるも、Javaに触れ始めて1週間も経っていない私にはなんだか難しい魔法の解説をしているようにしか見えなかった。
早い話が理解することができなかったのだ。

というわけで、無い頭からアイデアを絞りだしてどうにかこうにか形になるものを作ってみたので書き残してみる。

## ClickEventと独自コマンドのリレー
これから説明する方法はClickEventを何度も発生させる。
しかしその先の処理にちょっとした細工をすることで目的の処理を一度しか発動しないようにしてみた。

流れとしては
***
1. 引数を複数個持ったコマンドを作成<br>
2. UUIDを生成<br>
3. setClickEventのClickEvent.Action.RUNCOMMANDを用いてクリックされた時に実行するコマンドを作成
(この時、実行するコマンドにUUIDを引数として記述)<br>
***
となる。
核となる0のみ解説をしていく。

まず0の「引数を複数個持ったコマンドを生成」について。
これは2で実行されるコマンドとなる。
ちなみにこいつが今回のミソである。

引数を複数個持つ、と書いたが実際にはUUIDのみを引数に持つ、でも構わない。
どのようなコマンドにするか自分と相談して引数の個数は決めよう。

肝心の処理部分はというと
***
1, (引数で送り込まれてきたUUID).txt　という名前のファイルが存在するかチェック<br>
2, 1で存在すると返ってきたらreturn false;で処理を抜ける。
***
以下2でファイルが存在しないと返ってきたときの処理↓

3, 行いたい処理をここに記述
4, (引数で送り込まれてきたUUID).txt　という名前のファイルを作成
***
というような構造になっている。
要するに「UUIDをメッセージに割り振り、目的の処理を実行したら生成されるテキストファイルの有無で処理を変えている」ということである。

↓
![bandicam_2022-05-25_15-11-10-157_AdobeCreativeCloudExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403016/df395380-4fdc-4474-429f-29616080d6b6.gif)

## なぜファイル名で判定するのか
ファイルの中身を読むよりも処理が速く済みそうだったからです。
それ以上の理由はありません。（浅はか）

## さいごに & 書き忘れの補足
もちろんClickEventから実行されるコマンドはplugin.ymlのdefaultをtrueにしなくてはならない。

加えて、そのまま放置していては膨大な量の中身のないテキストファイルが生成されてしまうのでonDisable時に生成したファイルを消去するようにしたりしなくてはならないだろう。

UUIDを用いているのでユーザーが自由にアクセスできるコマンドとはいえ悪用されることはほぼないと言っていいところが数少ない利点なのかもしれない。

※クリックされただけClickEventが出るので、画面上では最初の1回以外反応していないように見えるもののサーバーコンソールにはissued server commandのログがめちゃくちゃ吐かれてたりします。


5/30追記分
読み返してみたらめちゃくちゃ分かりづらいような気がするので近いうちに書き直してみようと思います。




日本語へたっぴでごめんなさい。
CakePHPでヘルパーをコントローラで使う

# 意外と見つけるのが大変だった。

システム全体をSPAへの置き換え時にありがちな、ヘルパーの処理をコントローラに移行したいという状況が発生したのでメモ


(追記)　コメントがあり、レジストリを用いる方法の方が良さそうなので、記事の内容を変えました。


MyHelperを利用する場合。
```php
use Cake\View\View;
use Cake\View\HelperRegistry;

---

// ヘルパーを使うおまじない
$HelperRegistry =  new HelperRegistry(new View());
$this->MyHelper =  $HelperRegistry->load('My');
$fuga = $this->MyHelper->hoge()
```

直接呼び出す方法。

```php
use Cake\View\View;
use App\View\Helper\MyHelper;

---

// ヘルパーを使うおまじない
$this->MyHelper = new MyHelper(new View());
$fuga = $this->MyHelper->hoge()
```

コントローラ内で対処している記事がほとんどなかったので、エラーから逆引きしました。
Windows PCのルーター化

## はじめに

元々、インターネットに接続していない実験環境(ラズパイやJetsonなどのボードコンピュータや何か特別なデバイスが接続されているPC、など)に対して、一時的に、デバッグや何かのインストールのためにネットに接続させたい、というときがあるかと思います。

そういうときに、手持ちのWindows PCをルータのように使用して、対象のシステムをネットにつなぐ、という方法を紹介します。

## 設定方法

設定すべきは以下の2点。

### サービスRouting and Remote Accessを実行する

「ファイル名を指定して実行」からservices.mscを実行して、サービスの一覧を表示させ、その中から、
Routing and Remote Accessというサービスを実行する。
![RoutingAndRemoteAccess.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998321/8c075494-106e-021b-36de-ef9a4e25cfcd.jpeg)

### インターネット接続の共有を設定する

Windows PCでインターネットに出て行っているネットワーク(例えば、WiFi)のプロパティにて、「インターネット接続の共有」という設定内にある、「ネットワークのほかのユーザに、...」のチェックボックスを有効にし、その「ホームネットワーク接続」のところで、インターネット接続を共有させたい側のネットワーク(例えば、イーサネット」を選択する。

<img width="200" alt="WiFiPropertyCommon.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998321/c6a87465-59e0-0cfb-4196-eb1840415df4.jpeg">

## 結果

上記の2点を設定することで、そのWindows PCをルータとして機能させることができる。(例えば、イーサネットに接続している他のPCやデバイスが、WiFiを経由してインターネットに出ていける)

ただし、192.168.137.1というアドレスになってしまうので、このサービスを使用したいPCやデバイスには、192.168.137.1をゲートウェイに設定し、かつ、例えば、192.168.137.50などと同一セグメント上の静的IPアドレスを設定する。あるいは、DHCPサーバにもなってくれるみたいなので、DHCPを選択してもよさそう。

## おわりに

Windows 11で試しましたが、Windows 10でも大丈夫だと思います。これ、以前に一度、トライしていて、うまく行かなかったのですが、そのときは、二番目の、「インターネット接続の共有を設定する」設定しかやってませんでした。Routing and Remote Accessの方も実行しないといけない、というのがポイントだったかと思います。

(2022/10/15追記)

この機能を毎日は試用していないので、ちょっと条件がよくわかっていないのですが、しばらくして、Windows PC越しにインターネットにアクセスしようとしてダメだったときに、「インターネット接続の共有」を一旦解除して再設定するといけた、ということが何度かありましたので、ここに追記しておきました。

(ほかにも暗黙の設定条件があるかもしれませんが、もしうまく行かない人がいらしたら、ご指摘下さい。)
GASでスクリプトを作成・実行する方法 　参考サイト

https://blog-and-destroy.com/35768

### スクリプトの関数を実行する方法

__スクリプト編集画面の上部メニューから行う場合__

1. スクリプト編集画面の上部メニュー内にある関数名から、実行する関数を選択します。
2. メニュー内にある「実行」を選択します。

__スクリプトを実行するショートカット(mac)__
 `command＋R`

### Google アカウントのデータへのアクセスを許可する方法

スクリプトの初回実行時にデータへのアクセス権を許可する必要がある。
参考サイトは画像付きでわかりやすいので参考サイト参照のこと。

1. スクリプトの初回実行時にダイアログが表示されるので「権限を確認」を選択します。
2. Googleアカウントを選択する画面となるので、スクリプトで操作したいGoogleアカウントを選択します。
3. 下部にある「詳細」を選択します。
4. 画面内に詳細が表示されるので、下部にある「プロジェクト名（安全ではないページ）に移動」を選択します。
5. 下部にある「許可」を選択します。
Spring Boot 用語１

1．ウェブブラウザ(Web Browser):HTTPを利用してハイパーテキスト文書を検索させるプログラム。つまりHTMLを解析する解析器

2.ウェブサーバ(Web Server):ウェブブラウザのようなクライアントからHTTP要請を受け入れ、各種リソースを返却するソフトウェア

3. HTML(HyperTextMarkupLanguage):ウェブでコンピュータがハイパーテキストを作成するための言語

4. HTTP(HyperTextTransferProtocol):インターネット上でユーザーとウェブサーバーがデータをどのようにやり取りするかを定めた規約。
   つまりHTML転送プロトコル

5. HTTPS(HTTP+overSecuresocketlayer):HTTP規約にセキュリティをさらに強化したバージョン

6. URI(UniformResourceIdentifier):インターネットにあるリソースを表す唯一のアドレス。 
   インターネット上の情報リソースを固有に識別可能。 インターネットで要求される基本条件で、インターネットプロトコルに常に付く

7. URL(UniformResourceLocator):ネットワーク上で資源がどこにあるかを知らせるための規約。
   つまりクライアントがHTMLを訪れるアドレス。 URIの下位概念

8. アパッチ(apache):ウェブサーバー。 静的ページの遂行に適切

  クライアントはプログラム(ブラウザ)を決定し、サーバ(アパッチ)に要請→応答

  静的ファイル(.html,.png...)は理解するが動的ファイル(.jsp)は理解できない-(委任)->トムケット

9.トムケット(tomcat):アプリケーションサーバー(WAS:WebApplicationServer)。 動的ページの遂行に適切

  委任されたものをhtmlに置き換える(ブラウザが理解できないコードのみ解析して渡す)

  ex)b.jsp->b_jsp.java->b_jsp.class->html

  タブレットに変えコンパイルしてhtmlに変える

=>こうなると、トムケが使用されるときだけ使用される場合があるので、いつもURIを送るように設計される。

​  タブレット:クライアントの要請をサーバで処理し、その結果を再びクライアントに転送するジャワプログラミング技術。 
            これをルータ/コントローラともいう。

​10. MVCモデル: URIを受けたタブレットがview(jsp)を探して応答-CV.

    データ関連のすべてのロジック-M

    データが必要であればMに減(db使用)

11. stateless:クライアントとサーバの連続した動作状態情報を保存しない。 すなわち、サーバはデータ伝送後に切れる。

12. stateful:サーバにクライアントとサーバの連続状態情報を保存。ソケット通信 = 認証のような仕事を処理する際にstatefulしなければな 
    らない。 
    つまり、ウェブサーバーをstatelessで維持しながらstatefulに騙せばいい。
    ->これをsessionとcookieが実行（クライアントと情報維持を行うためのもの）

​13. session:ウェブサーバーが実行された時点から終了する時点までサーバーに保存する領域。 セッションクッキー

            各クライアント固有のセッションid付与->これに区分し、各クライアント要求に応じたサービスを提供

14. sessionid:最初に実行されるときに持つid

              ex）画面が移動してもログインが維持される

15. cookie:あるウェブサイトのサーバーからクライアント(ブラウザ)に保存する領域

           ex）訪問したサイトに再度訪問した場合、IDとパスワードを自動入力

​16. HTTPheader:本文(body)及びリクエスト/応答に関する情報を含む。

17. HTTPbody:もたらすデータの本文

​18. post:bodyにデータを入れて転送（長さ制限x）。 内容が目に見えない(but敏感なデータは暗号化)

         リクエストヘッダーのContent-Typeにリクエストデータのタイプを明示

19. Content-Type:送信される内容が何かを知らせる形式名

20. get:URLにパラメータを含めて要請する方式。 セキュリティに脆弱 データをheaderに含めて転送

​21. scope:このデータがいつまでメモリに生きているのか。 トームケットにあり

   - application

         session:クライアントごとに1つずつ空間を生成し、状態情報維持のために使用するscope。

         request:httpリクエスト(クライアント、ユーザの要請)をWASが受けてウェブブラウザに応答するまで変数が維持される場合に使用
                 requestは要請するクライアントの変数のようなもの(応答時に飛んでいく)。

   - page


22. HTTP状態コード:クライアントが送信したHTTP要請に対するサーバの応答コードで、状態コードによって要請の成功/失敗可否を判断

100番台 - 条件付き回答(要請を受け、作業を続ける)

200番台 - 成功

300番台 - リダイレクト(他を応答-内部的にrequest2回される)

400番台 - クライアントエラー

500番台 - サーバーエラー

​
23. response.sendRedirect:既存のrequestがなくなり、新しくできる。 実行時アドレス変更

24. request.getRequestDispatcher:再びrequest作られるときに被せ（requestは最初のものとなる）。 
    被せ物のため実行時に住所が変更されない。

​25. UTF-8:1~4Byte可変長文字エンコード。 英語は1Byte、ハングルは3Byte絵文字4Byte。すべてをUTF-8に統一。
Swift画像トリミングアプリ

SwiftのAddPackagesにてCropViewControllerを導入し、簡単に画像トリミング処理を実行してみる。
開発環境
xcode13
TOCropViewController

Swift Package Managerを利用してCocoapodを使わず、下記のようにインストール。
File->AddPackages->🔍に`https://github.com/TimOliver/TOCropViewController.git`セット
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/a857297d-f4e4-8e48-4f07-6ac3683670ef.png" width="80%">
下記追記
import CropViewController

![スクリーンショット 2022-05-25 15.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/65a40da1-f6c8-dcbd-9530-c12ead1a2d52.png)


```
import UIKit
import CropViewController

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate,CropViewControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!
    var image:UIImage?
    
    override func viewDidLoad() {
        super.viewDidLoad()
 
    }
    
    @IBAction func startView(_ sender: Any) {
        
        setImagePicker()
        
    }
    func setImagePicker(){
        let picker = UIImagePickerController()
        picker.sourceType = .photoLibrary
        picker.delegate = self
        present(picker, animated: true, completion: nil)
        
    }

    func cropViewController(_ cropViewController: CropViewController, didCropToImage image: UIImage, withRect cropRect: CGRect, angle: Int) {
        updateImageViewWithImage(image, fromCropViewController: cropViewController)
    }
        
    func updateImageViewWithImage(_ image: UIImage, fromCropViewController cropViewController: CropViewController) {
        imageView.image = image
        cropViewController.dismiss(animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let image = info[.originalImage] as! UIImage
        guard let pickerImage = (info[UIImagePickerController.InfoKey.originalImage] as? UIImage) else { return }
        
        let cropController = CropViewController(croppingStyle: .default, image: pickerImage)
        cropController.delegate = self
        cropController.customAspectRatio = CGSize(width: 100, height: 100)
        
        //今回は使わないボタン等を非表示にする。
        cropController.aspectRatioPickerButtonHidden = true
        cropController.resetAspectRatioEnabled = true
        cropController.rotateButtonsHidden = true
        
        //cropBoxのサイズを固定する。
        cropController.cropView.cropBoxResizeEnabled = true
        //pickerを閉じたら、cropControllerを表示する。
        picker.dismiss(animated: true) {
            self.present(cropController, animated: true, completion: nil)
        }
    }


}
```
画像セットボタンにてライブラリより画像選択し枠フレームにてトリミングし、Doneボタンにて実行。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/c4342314-409d-bf29-2c03-49656752803c.png" width="40%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/a14be49f-6161-1f99-3964-3a1d73bb7992.png" width="40%">
操作ミスでCloud9の環境データが飛んだ

先日のことです。

AWSAcademyには６時間の制限時間なるものがあると聞き、
いつもなら『End Lab』のところを押せば、
遷移先のデータもそのままで
Cloud9を開けたのですが、

焦りすぎて『Reset』のボタンを誤って押してしまい、
立ち上げたCloud9の環境データが全て飛ぶという
事故が起きました:scream:


![スクリーンショット 2022-05-25 14.57.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687611/8a0f11e8-d84e-661f-6988-a18796e09dbf.png)

一応自分なりの認識を書いておくと、

『Start　Lab』⇨コンソール立ち上げ
『End Lab』⇨コンソール終了
『Reset』⇨コンソール内のデータのリセット

こんな感じでしょうか。

バックアップとしてGitにリポジトリを保存していたので、
Zipファイルとしてダウンロード→その後は開発環境を
立ち上げて、データを引っ張ってきて、助かりました

今月頭に人生で初めてAWSを触ったもので
色々とつまづいています。

間違っていたら教えてください:bow_tone2:

今後はこのような操作ミスで
時間をロスしないように気をつけます
Pythonにおける配列（リスト）の初期化に関して

## はじめに
４月からIT業界に飛び込み、研修期間真っ最中の初心者エンジニアです。
Pythonの勉強をしている際に、お恥ずかしい話ですが、初歩中の初歩の部分で少しつまずいた経緯があり、ここに自分なりに残しておこうという次第です。

## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者

## 目次
<!-- タイトルとアンカー名を編集 -->
1. [配列（リスト）とは](#Chapter1)
1. [リストの初期化について](#Chapter2)
1. [まとめ](#Chapter3)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
## 配列（リスト）とは
同じ型の要素を一列に並べたデータ型のものです。
Pythonにおける配列型のデータは、辞書、リスト、集合、タプルがあります。

※配列という単語を多く使っていますが、Pythonにおいて配列という言葉はなく、リストと呼ぶそうです。

配列を使うと、文字や数値のデータをひとまとまりに扱うことができ、効率よく進めていくことができます。

<a id="#Chapter2"></a>
## リストの初期化について
Pythonのリストを初期化する大まかな流れは、以下の２つです。

1. 空リストを作成
1. 適当な値、要素数で初期化

**空リストを作成**
```
empty_list = []
print(empty_list)

# []
```
空のリストは上記のように作ります。
リスト内の要素数は、len()で確認することが出来ます。
```
print(len(empty_list))

# 0
```

もちろん空なので要素数は0です。

**適当な値、要素数で初期化**
作成した空リストなどに最初の値を入力することが、初期化といいます。
```
list_a = [1, 2, 3, 4, 5]
print(list_a)

# [1, 2, 3, 4, 5]
```
これで初期化は完了し、ここからリストとして活用していくことが出来ます。


## まとめ ##
今回は初歩的な部分である、配列（リスト）に関してと、その初期化について書きました。ほかにもリストでは、append()で要素を追加したり、remove()で要素を削除出来たり、作業を効率よく進めるのにとても役に立つ部分だなと感じています。

<a id="#reference"></a>
## 参考文献
- [Pythonにおける配列初期化について現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/46150#ta-toc-2)
SaaS,PaaS,IaaS,MaaSとは？

近年のIT業界以外でも目にすることが多くなってきた言葉にクラウドやAI、DXなどがあります。<vb>
すでに市民権を得ている言葉が数多くある一方で、これから「当たり前」となってくる言葉もあると思っております。<vb>

個人的にそう感じている言葉がタイトルにもある「SaaS」「PaaS」「IaaS」「Maas」です。<vb>
これらがどういう言葉なのか。どういったことを表しているのかについて、今回自分用の記事として執筆をいたします。<vb>


# 1.SaaS（サーズ）とは？
SaaS（サーズ）とは、「**Software as a Service**」の略称で、「**サービスとしてのソフトウェア**」を意味します。
スマートフォンやPCなどにアプリケーション等をインストールするのではなく、
事業者が提供するクラウドサーバーにあるソフトウェアを、インターネットを通じて利用できるサービスです。

例えば、**QualityForwardやOffice365、GmailなどがSaaS**となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/28fec443-6ee7-af29-cfae-21e0b4e66339.png)

# 2.PaaSとは？
PaaS（パース）とは、 「**Platform as a Service**」の略称で、「**サービスとしてのプラットフォーム**」を意味します。
アプリケーション開発や実行環境で利用するサービスです。
これまでのシステム開発では、全て自社内で用意をしていたものがサービスとして利用することで、面倒な環境構築や保守・運用から開放されます。

例えば、**AWS**(Amazon Web Services)や**Microsoft Azure**、**GCP**(Google Cloud Platform)があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/b733a793-f5df-ea70-bb9e-57ac7fd9206b.png)


# 3.IaaSとは？
IaaS（イアース/アイアース）とは、「**Infrastructure as a Service**」の略称で、「**サービスとしてのインフラ**」を意味します。
インフラを利用するので、仮想サーバや仮想マシンがイメージしやすいかと思います。

**IaaS**：**仮想サーバーを構築し、**
**PaaS**：**AWSやAzureでプラットフォームを構築し、**
**SaaS**：**ソフトウェアを構築する**
ようなイメージとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/71ccd031-29d4-eb7b-868b-cee6e5a16a3a.png)

# 4.MaaSとは？
MaaS（マーズ）とは、「**Mobility as a Service**」の略称で、**SaaS/PaaS/IaaSから派生した言葉**になります。
「サービスとしての移動手段」と訳すことができますが、**国交省の定義をざっくりと書き表すと、
「さまざまな交通手段の垣根をなくすことで、移動における利便性を向上させたサービス」となります。**

例えば、**タクシー配車アプリの「GO」など**があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/83ae9483-97b3-a22f-e931-ff420cda90e5.png)

# 5.まとめ
最近のシステムはほとんどSaaS/PaaS/IaaSに分類できるかと思います。
これまでと違い、自社でサーバを立てて～という開発よりも近年はクラウドサービスを使ったやり方が一般的となっているので、
IT界隈にいる限りは、この違いは覚えておいて損はないかと思います。
最後にNoelさんがNoteに投稿していた図が分かりやすいので、こちらを引用しまとめとさせていただきます。
（引用元：NOTE Noel：SaaSの説明　https://note.com/noel20181016/n/n2b14877db56b ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288745/65fb3f9b-86e5-e1e7-44d7-c802088032d8.png)
SQLAlchemy Core (SQL Expression Language) を使うときの備忘録

# 概要
- SQLAlchemyには`ORM`と`Core`があるが、今回は**Coreのみを扱う**。

# 参考
https://docs.sqlalchemy.org/en/14/core/

# 環境構築
```
# Pythonのバージョンを確認
python --version
> Python 3.7.3

# SQLAlchemyのインストール
> pip install SQLAlchemy
```
# メタデータによるスキーマの定義
メタデータとは、テーブルのスキーマをPythonのコード上で定義する方法。
データベース管理システム（DBMS）に依存しない方法でスキーマを記述できる。

以下のようにPythonで書く。

```python
from sqlalchemy import Table, Column, Integer, String, MetaData, create_engine

# インメモリデータベースを使用
engine = create_engine('sqlite:///:memory:')

meta = MetaData(engine, reflect=True)
users = Table('Users', meta,
            Column('id', Integer, primary_key=True),
            Column('name', String),
            Column('age', Integer)
            )

# metaデータの内容をデータベースに反映
meta.create_all()

with engine.connect() as con:
    rows = ({"id": 1, "name": "Sato", "age": 31},
            {"id": 2, "name": "Suzuki", "age": 18},
            {"id": 3, "name": "Yamada", "age": 40},
            {"id": 4, "name": "Tanaka", "age": 30},
            )
    # INSERT文を実行
    for row in rows:
        con.execute("INSERT INTO USERS (id, name, age) VALUES(:id, :name, :age)", row)

    # SELECT文を実行
    rows = con.execute("SELECT * FROM USERS")
    for row in rows:
        print(row)
```
# 結果
```
(1, 'Sato', 31)
(2, 'Suzuki', 18)
(3, 'Yamada', 40)
(4, 'Tanaka', 30)
```
### 補足
- `reflect=True`を指定することにより自動的にデータベースのテーブル情報がメタデータに格納されていることが確認できる。
- `インメモリデータベース`はデータをHDDやSSDに保存するのではなく、メモリ上に記録する。そのため、ファイル実行が完了した時や、Pythonコマンドラインを抜けるなど、一連の処理が完了したら記録されていたデータは消えるので簡単に操作を試すときに有用。
Mac VScode 新規作成したファイルの言語モードをキーボードだけで変更する

# 概要

- VScodeにて新規作成したファイルの言語モードをキーボードのみで変更する方法をまとめる。

# 方法

1. VScodeのウインドウをクリックしてアクティブ状態にする。
1. 下記キーを押下して新規ファイルを行う。

    ```
    「cmd」+「n」
    ```

1. 下記キーを押下して言語モード変更メニューを開く。

    ```
    「cmd」+「k」してから「m」
    ```

1. 言語を入力して選択してEnterを押下する。（JSONなら検索ウインドウに「json」と入力してJSONを選択してEnter）

    ![Untitled-1_—_src.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d6d420e9-79aa-8bf5-18cb-eceb9c8dd10b.png)

1. 新規ファイルが特定の言語で作成される。
TypeScriptの等価演算子(==)と厳密等価演算子(===)について

## 等価演算子(==)と厳密等価演算子(===)とは
JavaScriptでもそうですが、基本的にTypeScriptでも
等価演算子(以下、==)ではなく、厳密等価演算子(以下、===)を用いることが推奨されています。

というのも==と===は厳密には違う挙動をします。

>等価演算子 (==) は、二つのオペランドが等しいことを検査し、論理値で結果を返します。厳密等価演算子とは異なり、オペランドの型が異なる場合には型の変換を試みてから比較を行います。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Equality

>厳密等価演算子 (===) は、二つのオペランドが等しいことを検査し、論理値で結果を返します。等価演算子とは異なり、厳密等価演算子はオペランドの型が異なる場合、常に異なるものと判断します。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Strict_equality

実際に試してみます。
数値型の比較。

```TypeScript
const a: number = 1;
const b: number = 1;

// 両方ともtrue
console.log(a == b);
console.log(a === b);
```

文字列型でも同じです。

```TypeScript
const a: string = "hoge";
const b: string = "hoge";

// 両方ともtrue
console.log(a == b);
console.log(a === b);
```

数値型と文字列型の比較は、
TypeScriptではコンパイル(トランスパイル)時に以下のように怒られます。
※コンパイル自体は通るので注意。

```TypeScript
const a: number = 1;
const b: string = "1";

// JavaScriptではtrue
console.log(a == b);
// JavaScriptではfalse
console.log(a === b);
```

```
error TS2367: This condition will always return 'false' since the types 'number' and 'string' have no overlap.
```

なので以下のようなfalsyな値の比較にも用いることが出来ません。

```TypeScript
const a: string = "";
const b: number = 0;

// JavaScriptではtrue
console.log(a == b);
// JavaScriptではfalse
console.log(a === b);
```

```
error TS2367: This condition will always return 'false' since the types 'string' and 'number' have no overlap.
```

==は二つのオペランドの型が異なる場合、暗黙の型変換が行われ、それ同士を比較してtrueとなることがあります。

===は二つのオペランドの型が異なる場合、常にfalseになるのでより厳密な一致判定が行えるということですね。

## ==を使えそうな場面を考えてみる

オブジェクト型を比較した場合(構造の等価性)

```TypeScript
const a = { id: 1, name: "hoge"};
const b = { id: 1, name: "hoge"};
const a2 = a;

// どちらもfalse
console.log(a == b);
console.log(a === b);

// どちらもtrue
console.log(a == a2);
console.log(a === a2);
```

残念ながら、==と===でも別々に作られたオブジェクトはfalseになるようです。

>==/===は、2つのオブジェクトの構造を比較したい場合は、使えません。

https://typescript-jp.gitbook.io/deep-dive/recap/equality


ではbool値ではどうでしょうか。

```TypeScript
const a: boolean = null;
const b: undefined = undefined;

console.log(a == b); // true
console.log(a === b); // false
```

nullとundefinedを比較した場合、==ならtrue、
===ならfalseを返します。
さらにnullとundefinedの比較はコンパイル時にも怒られず、
使えそうです。

しかし、以下のように書けば同じことが出来そうです。

```TypeScript
const a: boolean = null;
const b: undefined = undefined;

// どちらもtrue
console.log(a === null || a === undefined);
console.log(b === null || b === undefined);
```

この場合、若干コードが短く書けるぐらいなので、
基本的には===を使用した方が良さそうです。

## まとめ
公式で推奨されていた通り、型まで等価であることが確認できる===を使うのが良さそうです。

これに限ったことではないですが、なにがどう推奨されているのかという理由を理解出来れば、ただ良いとされているからなんとなく使うということも無くなるかと思います。(自分への戒め)

少しでも参考になれば幸いです。

## 参考
https://typescript-jp.gitbook.io/deep-dive/recap/equality

https://typescript-jp.gitbook.io/deep-dive/recap/null-undefined

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Equality

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Strict_equality

## 追記(2022/5/26)

falsyな値とは、falseとみなされる値のことです。

https://developer.mozilla.org/ja/docs/Glossary/Falsy
青空文庫のルビを消すスクリプト


# 概要

青空文庫から手っ取り早くテキストをコピーしたいときに、そのままコピーすると「ルビ」のひらがなが混じってコピーされます。これを取り除くJavaScriptの紹介です。ブックマークレットとして使えます。自然言語処理でちょっとしたデータが欲しいときに使えます。

# 使用前

例として「吾輩は猫である」で試してみます。

https://www.aozora.gr.jp/cards/000148/files/789_14547.html

何もせずにコピーすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/907d26bd-0ac0-712a-3f2f-5b753d37fbf5.png)

以下のように「ルビ」もコピーされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/92bbcc85-084b-fcb3-137b-183aa876e089.png)

> 吾輩わがはいは猫である。名前はまだ無い。
> 　どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。この書生というのは時々我々を捕つかまえて煮にて食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌てのひらに

# 使用後

そこでブラウザのF12キーを押して「Console」を開き、以下Scriptをペーストして実行します。

```javascript
(function(){var e = document.getElementsByTagName("rt"); for(idx = e.length -1 ; idx >= 0; idx--){e[idx].parentNode.removeChild(e[idx]);}})();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/45c27823-e34a-0f23-eb99-e1297f75bc44.png)



すると「ルビ」が消えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4e2777d9-b032-e0b0-fd97-5f462ddf1f25.png)

コピーしてもテキストが消えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/f4243b59-480b-58ca-7c1c-8cdea765788b.png)


コピーした結果。

> 　吾輩は猫である。名前はまだ無い。
> 　どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。この書生というのは時々我々を捕えて煮て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶だ。その後猫にもだいぶ逢ったがこんな片輪には一度も出会わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽せぽくて実に弱った。これが人間の飲む煙草というものである事はようやくこの頃知った。

ブックマークレットにすると以下のようになります。

```javascript
javascript:(function(){var e = document.getElementsByTagName("rt"); for(idx = e.length -1 ; idx >= 0; idx--){e[idx].parentNode.removeChild(e[idx]);}})();
```

# 所感

DOMで消すのではなく、スタイルシートを変更したほうが速いとは思います。


以上。
学会・研究会一覧【自然言語処理】【音声処理】個人的まとめ 

# 学会とは
特定の分野の勉強したい人が集まって討論や研究成果を発表したりするところである！！
研究者同士の交流などを深めることのできる機関で，広い分野を扱っている学会と一つの分野に特化している学会がある．
### 研究会とは
学会の中に分野ごとに研究会が設立されている．
広い分野を扱っている学会はほとんど研究会がある．気がする...
## 発表の種類
### 全国大会
学会単位で行われ，1年に1回程度で行われる．
発表件数が多く複数の部屋を使って発表が行われ，発表分野が広いのも特徴．
論文は査読されず，研究内容の評価と関係なく発表することができる．
### 研究会
研究会単位で行われる発表をそのまま研究会というらしい． #ややこしいのでやめてほしい．
全国大会に比べたくさん行われ，複数の研究会で主催されることもあるそう．
論文を提出するが査読はなく，回数が多い&分野が限定されているため発表件数が少ない．
### シンポジウム・ワークショップ
1つ以上の研究会が主催しておこなわれる研究会よりも大きめのイベント．
論文に査読があり，論文の結果次第で発表できない人もいる．
### 論文誌
まとまった内容の論文を投稿する．
学会ごとに発行される．
### ポスター発表
ポスターとして論文が記載される．
査読はまちまち．
# 学会・研究会一覧
## 自然言語処理系
### 言語処理学会
https://www.anlp.jp
### 電子情報通信学会 思考と言語研究会
https://www.ieice.org/ess/tl/
### 電子情報通信学会 言語理解とコミュニケーション研究会
https://www.ieice.org/iss/nlc/wiki/wiki.cgi
### 情報処理学会 自然言語処理研究会
https://nl-ipsj.or.jp
### 人工知能学会 言語・音声理解と対話処理研究会
https://jsai-slud.github.io/sig-slud/
## 音声処理系
### 日本音響学会
https://acoustics.jp
### 電子情報通信学会 音声研究会
https://www.ieice.org/iss/sp/jpn/
### 情報処理学会 音声言語情報処理研究会
http://sig-slp.jp
# 終わりに
個人的に興味のあることを勉強がてらまとめました．
多分時々更新すると思います．
間違いなど指摘ください．
ある分野に偏ったり，まとめ方が雑ですみません．
Spatie laravel-data ライブラリ リクエストを定義する

# 概要

- laravel-dataにて受け取るリクエストのデータ構造を定義する方法をまとめる。

# 方法

1. 下記の情報がリクエストボディーで送られてくるとする。

    ```json
    {
      "name": "Foo Bar",
      "age": 26
    }
    ```

1. 上記のデータ構造をlaravel-dataを用いて定義してみる。
1. 下記のクラスを定義する。
    - `app/Http/Requests/PostUserRequest.php`

1. 下記の様にリクエストクラスを記載する。（Dataクラスの継承を忘れずに）

    ```app/Http/Requests/PostUserRequest.php
    <?php
    
    namespace App\Http\Requests;
    
    use Spatie\LaravelData\Data;
    
    class PostUserRequest extends Data
    {
        public function __construct(
            public string $name,
            public int $age
        )
        {
            
        }
    }
    ```

1. あとは下記の様にリクエストボディーを受け取るコントローラーの関数の引数にformRequestのときと同じように記載すれば良い。（コントローラー内部の処理は任意）

    ```app/Http/Controllers/UserContrller.php
    <?php
    
    namespace App\Http\Controllers;
    
    use App\Http\Requests\PostUserRequest;
    
    class UserController extends Controller
    {
        public function post(PostUserRequest $request)
        {
            return $request;
        }
    } 
    ```

# 参考文献

- [https://spatie.be/docs/laravel-data/v1/introduction](https://spatie.be/docs/laravel-data/v1/introduction)
- [https://spatie.be/docs/laravel-data/v1/as-a-data-transfer-object/request-to-data-object](https://spatie.be/docs/laravel-data/v1/as-a-data-transfer-object/request-to-data-object)
keras.optimizersから読み込む最適化手法のエラーについて

画像分類に取り組んでいる際にkeras.optimizersの読み込みでエラーが出たので調べてみた。


# 環境
google colaboratory
Python 3.7.13
Keras 2.8.0


# エラー内容
```python:Adam
import keras
from keras.optimizers import Adam

# エラーコード----------------------------------------------------------------------------
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-6-7e4e00d780ab> in <module>()
     1 import keras
---> 2 from keras.optimizers import Adam

ImportError: cannot import name 'Adam' from 'keras.optimizers' (/usr/local/lib/python3.7/dist-packages/keras/optimizers.py)
```
アップデートでkeras 2.5.0から読み込み方が変わったそう。
新しい読み込みは以下のとおり


# 修正後
```python:adam_v2
# 修正前
from keras.optimizers import Adam

# 修正後
from keras.optimizers import adam_v2
```

また、compileで使う際には以下のようにしてAdamを指定する。

```python:
# 修正前
model.compile(loss='categorical_crossentropy',
              optimizer=Adam(learning_rate=0.001),
              metrics=['accuracy']) 

# 修正後
model.compile(loss='categorical_crossentropy',
              optimizer=adam_v2.Adam(learning_rate=0.001),
              metrics=['accuracy']) 

# オプティマイザを名前で指定すると，デフォルトパラメータが利用される
model.compile(loss='categorical_crossentropy',
              optimizer="Adam",
              metrics=['accuracy']) 
```
その他のoptimizerやパラメータの中身については、Kerasの[ドキュメント](https://keras.io/ja/optimizers/ "optimizer")を参照。
リッジ回帰・lasso

# introduction

機械学習や非線形回帰を行う際、モデルが複雑になるにつれ、過学習が起きやすくなるので、モデルの複雑さに依存して（比例して）値が増加する項、パラメータに制約を課す項のどちらかを設けよう。

誤差の２乗和や対数尤度関数による評価関数に基づいて正則化法でモデルを推定する。

# 関連記事

https://qiita.com/yudaiyamashita/items/87ce37d9033fc4972ac4

# 荷重減衰
ここまで非線形回帰モデルのパラメータの最小２乗推定量は
$$\hat{\boldsymbol \omega}=(B^{T}B)^{-1} y$$
で与えられる。
大雑把に言ってモデルが複雑になると、基底関数の増加に伴い$(B^TB)^{-1}$の計算が不能と「なることもある。」
こういうとき、複雑になるにつれ小さくなる誤差項とは対照的に、大きくなるペナルティ項を加えた関数
$$S_{\gamma}(\boldsymbol \omega)=(\boldsymbol y -B\boldsymbol \omega)^T(\boldsymbol y -B\boldsymbol \omega)+ \gamma R(\boldsymbol \omega)$$の最小化をはかる。この$\gamma$は正則化パラメータと呼ばれる。モデルの適合度を調整し、推定量の安定化に寄与する。ペナルティ項は正則化項とも呼ばれ、こういった手法を正則化最小２乗法という。


正則化法
$$R(\boldsymbol \omega)= \omega^T \omega= \sum_{j = 1}^{m} |\omega_j|^2$$
モデルのパラメータベクトル$\boldsymbol \omega$の正則化最小2乗推定値$$\hat{\boldsymbol \omega}=(B^{T}B+\gamma K)^{-1} y$$
上記の$K=I_d$と置いたリッジ型の推定量を与え機械学習の分野では${\boldsymbol 荷重減衰}$として知られている.
より拡張した正則化最小2乗法
$$S_{\gamma}(\boldsymbol \omega)=(各成分の誤差の２乗和)+ \gamma L_p(\boldsymbol \omega)$$

$L_p$:ベクトルを引数とし$L_p$ノルムをとる関数

$p=2$ リッジ型推定
$p=1$ $L_1$ lasso推定
vscDebuggerを使ってVisual Studio CodeでR言語を実行する

# R LSP Clientとかradianとかがよく分からない
「R言語 VSCode」などと検索すると上のものを使ったやり方が出てくるがよく分からない。そもそもR LSP Clientとか拡張機能で検索しても出てこない。
radianで頑張ってもうまくいかず、それはさておき最初からやけに「vscDebugger入れてきてね」みたいなエラーが出てくるので、"vscDebugger"とは何ぞや、というかんじであるが、調べてやってみたらうまくいった。今回はそれを使った方法を紹介する。

# Rのインストール
[The R Project for Statistical Computing](https://www.r-project.org/)よりダウンロード

1. "download R"のリンクをクリック![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/8521e671-73d0-9c9e-3e2d-d9a17fbf6b67.png)

1. 0-Cloudの下にあるリンクをクリック![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/45890e14-3849-6c35-2279-80837ea21ea7.png)

1. OSを選択（以下windowsの場合）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/09645a25-460a-2046-36fe-88241c8758f6.png)
1. なんやかんやしてinstallerをダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/65565759-56a3-7f10-2d2e-d993d3ddf08e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/427a3723-3104-bbcf-9289-b7fdf6ed0726.png)

1. installerを実行（特にカスタマイズする必要はなくデフォルトで大丈夫）

# languageserverをインストール
1. インストールしたRを実行![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/a98f9b0f-322c-176b-9097-fc036b449b4e.png)
 おそらくこんな画面が出てくる。ちっちゃいwindowがRのコンソール画面（vscodeのターミナル的な）
1. コンソールに ```install.packages("languageserver")``` と入力してenter
なんか出てくるので適当にJapanにしておく ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/ac176372-4ae6-f080-a190-56ebacf52ffd.png)

# RToolsをインストール
vscodeでRをデバッグするためにvscDebuggerというpackageがいるらしい。それもinstall.packages()でインストールできればいいが、バイナリがGitHubに公開されているだけなのでRToolsというものが必要らしい。

1. [RTools](https://cran.r-project.org/bin/windows/Rtools/)のサイトで赤枠のリンクを順にクリック![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/312069a2-0b7c-1331-8be6-7942b2039a4b.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/ab83cf9c-d97d-589f-f39f-41b481f87869.png)

1. installerを実行（これもデフォルトのままでいい）

# vscDebuggerをインストール
やり方はいろいろある。[GitHub](https://github.com/ManuelHentschel/vscDebugger/releases/tag/v0.4.7)からダウンロードしてinstall.packages("ダウンロードしたやつの絶対パス")としてもいいが、Rのコンソールにて```remotes::install_github("ManuelHentschel/vscDebugger")```とすればvscDebuggerがインストールされる。

# VSCodeの拡張機能を入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/7bf8e9f2-81c9-ff15-32eb-af89765c87b9.png)
この２つを入れれば大丈夫。settings.jasonも特にいじる必要はない。

# コードを書いて実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2687626/fd112afe-ec33-46eb-7755-094f300d8c8b.png)
言語をRに指定してF5で実行する。問題なく実行できている。
pREST & PostgreSQL

pREST 可以将 PostgreSQL 数据库的操作转换为 RESTful API 请求，通过 http 请求的方式提供了比 psql 控制台和代码更为轻量更为灵活的方式。prestd 也支持类 PostgreSQL 的其他数据库，诸如 TimescaleDB 和 Redshift 。

pREST 与 [PostgREST](https://qiita.com/shooter/items/4b14ab217664ea6a50e1) 的定位是一样的。pREST 使用 Golang 开发，而 PostgREST 基于 Haskell，前者更方便做二次开发。


---

Ref:

https://old-panda.com/2022/03/19/prestd-tutorial-ii/
【VBA】ブックが開かれたらPowerQueryを起動し、保存して終了させる

# 正しく動かすための準備

- クエリと接続のプロパティより、「バックグラウンドで更新する」のチェックを外す

# これだけ
標準モジュールへ記述。

```vba:query.vba
Private Sub Auto_Open()
    If Workbooks.Count > 1 Then
        ThisWorkbook.Close SaveChanges:=True
    Else
        ActiveWorkbook.RefreshAll
        ThisWorkbook.Save
'        MsgBox "保存完了"
        Application.Quit
    End If
End Sub
```

準備をお忘れなく。
Terraformで最新のAMIを使ってEC2を構築する設定、の注意

# 概要

「Terraformで最新のAMIを使ってEC2を構築する設定」をしたら、悲劇が起きたのでメモです。

# 前提

* 「Terraformで最新のAMIを使ってEC2を構築する設定」自体はググると出てくるので割愛します
* 「一時的なテスト環境構築」ではなく、「恒久的に利用する環境」の構築に利用しました　　　　　　　　
    * 環境を変更するときはTerraformの設定を変更して反映する感じです

# 起きたこと

1. 「Terraformで最新のAMIを使ってEC2を構築する設定」をして、一通り環境を構築
2. 1週間後くらいに環境を変更するために、設定を変更して `terraform apply`
3. EC2インスタンスの作り直しが発生
    * terminateして、新しいインスタンスが起動した
    * EC2インスタンス上で設定した作業が無に帰す

# 原因

上記「1」と「3」の間でAMIが新たにリリースされるなどで、「最新のAMI」が変わってしまった。
「Terraformで最新のAMIを使ってEC2を構築する設定」　+ AMIの変更 によりインスタンスの作り直しが発生

# まとめ

「恒久的に利用する環境」では、「Terraformで最新のAMIを使ってEC2を構築する設定」はしない方がよさげ？
【勉強】レーティングシステム Colley's Method

# はじめに
この記事は、[【勉強】レーティングシステム Massey's Method](https://qiita.com/takenakadx/items/d06921bc9e5741e1a1d6)の続きである。
前回は、Masseyの方法を使って得点を予想できるようなレーティングシステムの構築を行った。今回はもっとシンプルなColleyの方法について解説する。

Colleyの方法は勝利数のみを用いる為次のような利点があると言われている。
- 弱いチームから大量得点したチームにバイアスがかからない
- シーズンのはじめにすべてのチームのレートは0.5となり、どこかのチームのレートが上がると他のチームのレートがさがる。

# Colleyの方法
Colleyの方法の基本となる考えは、「勝率をそのままレートにしてしまおう」という考えである。
しかし、単なる勝率だと引き分けのあるゲームに対応できなかったり、敵チームの強さを考慮していないなどの問題がある。そこで、ラプラスの継承の法則を利用して、次のようにレートを設定する。

``` math
r_i = \frac{1 + \frac{w_i-l_i}{2} + \Sigma_j r_j}{2 + t_i} \tag{1}
```

ここで、$r_i$はチームiのレートであり、$w_i,l_i$はそれぞれチームiの勝利数と敗北数、$t_i$はチームiの試合数である。

これを行列で表すと、
``` math
(2I + M) \vec{r} = \vec{b} \tag{2}
```
ここで、Mは[前回の記事](https://qiita.com/takenakadx/items/d06921bc9e5741e1a1d6)にも出てきたMasseyの行列で各要素は次のようになっている
- 行列Mの対角要素$M_{ii}$はチームiの総試合数
- 行列Mの非対角要素$ M_{ij} $はチームiとチームjが戦った試合数に-1をかけたもの

さらに、IはMと同じ形をした単位行列であり、ベクトル$\vec{b}$は次のように定義できる。
``` math
b_i = 1 + \frac{w_i - l_i}{2}　
```

ここで、行列$2I + M$は正則である事が保証されるので、(2)は解く事ができる。

# Colleyの方法の例題
[前回の記事](https://qiita.com/takenakadx/items/d06921bc9e5741e1a1d6)と同様に、[RLCSのシーズン10の試合結果](https://liquipedia.net/rocketleague/Rocket_League_Championship_Series/Season_X/Spring/North_America/3)からレートを導出してみよう。

試合結果は以下の通りであった。
|  teamA  |  teamB  | score |
| ------- | ------- | ----- |
|  RGE    |   VOLT  | 4-2   |
|  RGE    |   VOLT  | 4-1   |
|  RGE    |   VOLT  | 4-0   |
|  SQ     |   OXG   | 1-3   |
|  SQ     |   OXG   | 4-1   |
|  SQ     |   OXG   | 0-3   |
|  SQ     |   OXG   | 3-1   |
|  SQ     |   OXG   | 1-2   |

これより、行列Mは前回と同様に
``` math
M = \begin{pmatrix} 
  12 & -3 & 0 & -4 & -5 \\ 
  -3 & 9  & -3 & -3 & 0 \\
  0  & -3 & 12 & -5 & -4 \\
 -4  & -3 & -5 & 15 & -3 \\
  -5 & 0  & -4 & -3 & 12 
\end{pmatrix}
```

さらに、ベクトル$\vec{b}$は
``` math
\vec{b} = \begin{pmatrix}
2 \\ 3 \\ 1 \\ 2 \\ 3
\end{pmatrix}
```

以上より次のような方程式が成り立つ。
``` math
\begin{pmatrix} 
  14 & -3 & 0 & -4 & -5 \\ 
  -3 & 11  & -3 & -3 & 0 \\
  0  & -3 & 14 & -5 & -4 \\
 -4  & -3 & -5 & 17 & -3 \\
  -5 & 0  & -4 & -3 & 14 
\end{pmatrix}
\vec{r}
 = \begin{pmatrix}
2 \\ 3 \\ 1 \\ 2 \\ 3
\end{pmatrix}
```

これを解いて次のようにレートが求まる。

| team | rate |
| ----  |  --- |
| RGE   | 0.58 |
| VOLT  | 0.17 |
| SQ    | 0.50 |
| OXG   | 0.55 |
|  V1   | 0.69 |

# まとめ
今回はColleyの方法について解説してみた。
Colleyの方法で出てくるレートは$0\ge r_i\ge1$であるので非常に扱いやすいと思う。さらに利用する情報が試合の勝ち負けだけなので様々なゲームについて利用できる方法であると思う。

ちなみに、MasseyとColleyの方法を実装したコードをgithubに載せておいたので、興味がある方はそちらも見ていただきたい。
[https://github.com/takenakadx/Rating_Models](https://github.com/takenakadx/Rating_Models)
【Jenkins】CentOSにJenkinsをインストールしてみました

# はじめに
Jenkinsをサーバー上にインストールしてみました。
サーバーOS情報：CentOS 7

# インストール手順
1.EPELとJavaのインストール
```
$ sudo yum install -y epel-release java-1.8.0-openjdk-devel
```

２．リポジトリの追加
```
$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
```

３．パッケージの秘密キーをインポート
```
$ sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
```

４．Jenkinsのインストール
```
$ sudo yum install -y jenkins
```

５．Jenkinsの起動設定
```
$ sudo systemctl enable jenkins
$ sudo systemctl start jenkins
```

６．ブラウザで接続確認
```
http://<サーバーのIP>:8080/
```
接続すると、下記のように``Administrator password``が聞かれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/cc00003b-7cb8-f8f7-f97e-dc1269868178.png)

７．``Administrator password``の取得
サーバーで下記のコマンドを叩いて、パスワードを取得します。
```
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
```

８．プラグインのインストール
上記で取得したパスワードを入力後に、プラグインをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/c8dc247e-17c8-7246-431f-a6781adb37c1.png)
左側のインストールボタンを押下すると、プラグインのインストールが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/6b6d4447-1272-22f3-5d9a-160799f47f38.png)

９．Adminユーザー作成
上記プラグインがインストール完了後に、Adminユーザーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/457269d3-f5d6-5a3f-b861-ec3585247df6.png)

１０．インストール完了
これでJenkinsのインストールが完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/be64aab9-f607-7ebd-da03-0dac9da50d6c.png)
[iOS][Firebase] プッシュ通知のテストメッセージが届かなかった時の対処メモ

# 状況

Firebase公式ドキュメントを見ながらプッシュ通知の設定をした後、ブラウザで Firebase Cloud Messaging のコンソールからテストメッセージを送信してみたが、実機RUN中の iPhone に通知が届かない...

https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ja

# 解決方法

AppDelegateに[application(_:didRegisterForRemoteNotificationsWithDeviceToken:)](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622958-application)を書いたら解決した。

Apple 公式ドキュメントの「デバイストークンをAPNsに登録する方法」というページでこの関数が紹介されていた。

https://developer.apple.com/documentation/usernotifications/registering_your_app_with_apns
【VSCode】全角文字が黄色い枠で囲まれるのを解除する方法

Visual Studio Code バージョン 1.63 で導入された Unicode 強調表示機能により、デフォルトで文字列内の全角文字が黄色い枠で囲まれて表示されるようになった。

# 解除方法
1. 「管理」＞「設定」を開く。（macOS：⌘,）
2. 「設定の検索」ボックスで「unicode highlight」を検索。
3. 「Editor › Unicode Highlight: Include Strings」を「false」に設定。
コマンドラインで乱数(ランダムな数)を取得

shを書くときに乱数を生成したくなったのでやり方を調べた。

## bash / zsh で`$RANDOM`を使う

bash / zsh は`$RANDOM`というシェル変数を参照することで、0~32767までの乱数を取得することができる。
```
$ echo $RANDOM
26236
```
では、上記より広いレンジで乱数を生成したい場合どうするか。

## jot コマンド
連番やランダムなデータ生成には、`jot`コマンドが使える。
`-r`オプションでランダムなデータを生成することができ、レンジの指定もできる。
`jot -r [出力数] [min] [max]`
```
$ jot -r 10 1 100
10
60
65
43
1
85
68
61
94
99
```

## shuf コマンド
`shuf`も`jot`と同様、ランダムなデータの出力に使える。
`-i`オプションでレンジの指定をし、`-n`オプションで出力数を指定する。
`shuf -i [min-max] -n [出力数]`
```
// Macは以下のモジュールインストールが必要
$ brew install coreutils

$ shuf -i 1-100 -n 10
58
9
63
40
42
95
19
51
71
86
```
Jiraで完了した過去の課題を検索する

## はじめに
Jiraのボードで完了した課題がスプリント完了後にバックログから見えなくなってしまい、直リンク以外での探し方が分からず格闘したため残しておきます。

## 解決方法
結論から言うと、 `課題ナビゲーター` を有効にすることで完了した課題を含む全ての課題を参照・検索できるようになります。

## 手順
1. Jiraの該当プロジェクトの`設定`を開く
1. 設定タブ内の`機能`を選択
1. 機能の一覧から`課題ナビゲーター`を有効にする
1. プロジェクトに戻ると`課題`タブが追加されているので、そこから課題を参照できるようになります

## 最後に
Jiraはデフォルトで有効になっている機能が限られているので、初めにプロジェクトに必要な機能を有効にしておくといいと思いました。
M1 Mac で Airflow Breeze を動かす

# 環境
- M1 MacBook Pro
- macOS Montery

# インストールとセットアップ

必要なものを brew install

- breeze が pix を使っているので必要

```bash
$ brew install gnu-getopt coreutils pipx
```

必要なPATHを通しておく（ ~/.zshrc などに)

```bash
export PATH="$(brew --prefix)/opt/gnu-getopt/bin:$PATH"
export PAHT="$HOME/.local/bin:$PATH"
```

airflow を git clone して、breeze をセットアップ

```bash
$ git clone https://github.com/apache/airflow.git
$ cd airflow
$ ./breeze
```

breeze コマンドが使えるとおもうので、ターミナルで起動してみる

```bash
$ breeze
```

コンテナが立ち上がっている
```bash
$ docker ps
CONTAINER ID   IMAGE                                             COMMAND                  CREATED          STATUS          PORTS                                                                     NAMES
f86600f6a60b   ghcr.io/apache/airflow/main/ci/python3.7:latest   "/usr/bin/dumb-init …"   45 minutes ago   Up 44 minutes   0.0.0.0:12322->22/tcp, 0.0.0.0:25555->5555/tcp, 0.0.0.0:28080->8080/tcp   docker-compose_airflow_run_caf3858cbf2f
```

Web UI 含めて起動してみる

- 初回は時間がかかるよ

```bash
$ breeze start-airflow
```

127.0.0.1:28080 でブラウザアクセスできる

![スクリーンショット 2022-05-25 12.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147174/855f13c1-b85f-55e1-0dee-e122a0c0df54.png)

デフォルトは admin/admin でログイン可能

![スクリーンショット 2022-05-25 12.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147174/9b428bac-fa17-8fb9-1cdc-ecf0c9f361ac.png)


# DAG の配置

git clone した airflow の files/dags 配下に置くと良い
（自分の場合は `~/git/airflow/files/dags/` )

# 余談

- start-airflow すると、tmux で4つセッションが立ち上がるんだけど、ぼくは普段からtmux使っているので nested tmux になってしまいちょっとうざい...が、まぁいったんそのままつかっている


# 参考にしました

- https://github.com/apache/airflow/blob/main/BREEZE.rst
- https://future-architect.github.io/articles/20210528a/
- https://zenn.dev/keyem4251/articles/airflow-breeze
GitHub ActionsでC#のビルド可否の確認とユニットテストを自動化する方法

C#のプロジェクトをGitHubで管理しています。
そこでGitHub Actionsを使って、ビルドの可否確認とユニットテストを自動化する様にしたので、やり方を残しておこうと思います。

## 前提

まず、この方法は.Net6.0で作成されたプロジェクトを対象としてます。
.net core5以前でも問題ないと思いますが、コーティング規約などの静的チェックも行おうとすると現在は初期値では無効になっているはずの[CA1801](https://docs.microsoft.com/ja-jp/dotnet/fundamentals/code-analysis/quality-rules/ca1801)が有効化されてしまいビルドが通らないという現象が出てしまいます。
Microsoftのサポート的にも.net6が良いと思うので、自動化に伴い.net6で作成しています。

## workflow設定

workflowのやり方については、GitHub上で書いていく方法もありますが、今回はローカルでVSCodeで書いています。

プロジェクトフォルダに`.github/workflows/build.yml`を用意してください。
下記のコードを`build.yml`に書きます。

```yml:build.yml
# GitHub Actionsの名前
name: Build .NET Core 6.0
# GitHub Actionsを実行させたい動作
on:
  # 今回はpush時に実行させる 
  push: 
# 自動化
jobs:
  build:
    # GitHub Actionsで動作させる仮想OS環境(今回はubuntuを指定)
    runs-on: ubuntu-latest
    # 自動化する動作
    steps:
      # プロジェクトをチェックアウトする
      - name: checkout
        uses: actions/checkout@v2
     # .Net のRuntimeを仮想OSにインストールする
      - name: Setup .NET
        uses: actions/setup-dotnet@v1
        with:
          # インストール.netのバージョンを指定(今回は.net6.0を指定) 
          dotnet-version: 6.0.x
      # プロジェクトで必要なライブラリなどをインストールする
      - name: Restore dependencies
        run: dotnet restore
      # ビルドを行う(同時にコーティング規約の静的チェックを行う)
      - name: DotNet Build Restore
        run: dotnet build --no-restore /warnaserror
      # ユニットテストを行う
      - name: DotNet Unit Test
        run: dotnet test
```

後は通常の流れでCommitしてPushを行えば、その度にGitHub Actionsが動き出します。
また、今回はブランチを問わずPushされれば実行される様にしてあります。
ブランチを指定する事もできます。

その際は、以下の様にします。

```yml:build.yml
# GitHub Actionsの名前
name: Build .NET Core 6.0
# GitHub Actionsを実行させたい動作
on:
  # 今回はpush時に実行させる 
  push:
    # GitHub Actionsを実行させたいブランチを指定する(今回はdevelopを指定)
    branches: [ develop ]
# 自動化
jobs:
  build:
    # GitHub Actionsで動作させる仮想OS環境(今回はubuntuを指定)
    runs-on: ubuntu-latest
    # 自動化する動作
    steps:
      # プロジェクトをチェックアウトする
      - name: checkout
        uses: actions/checkout@v2
     # .Net のRuntimeを仮想OSにインストールする
      - name: Setup .NET
        uses: actions/setup-dotnet@v1
        with:
          # インストール.netのバージョンを指定(今回は.net6.0を指定) 
          dotnet-version: 6.0.x
      # プロジェクトで必要なライブラリなどをインストールする
      - name: Restore dependencies
        run: dotnet restore
      # ビルドを行う(同時にコーティング規約の静的チェックを行う)
      - name: DotNet Build Restore
        run: dotnet build --no-restore /warnaserror
      # ユニットテストを行う
      - name: DotNet Unit Test
        run: dotnet test
```

今回はPushに対して行っていますが、プルリクエストでも行えます。
その付近は、まだ学習中なので次回以降にします。
XMLをJSONに変換できるxml2js

とあるAPIで返ってくるレスポンスがXML形式だったため、jsonに変換したくて方法を探していたところ、
xmlをjsonに変換できる「xml2js」というモジュールがあることが分かったので、実際に使ってみました。


## xml2jsをインストール
まず初めにxml2jsをインストールします。
```
$ npm install xml2js
```

そして、xml2jsをrequireでインポートします。

```javascript
const xml2js = require('xml2js');
```

この時、Typescriptを使っていたので、エディタ上で下記のようなエラーが出ました。
`ESLint: Require statement not part of import statement.(@typescript-eslint/no-var-requires)`

これを回避するには、`@types/xml2js`をインストールして、それをインポートします。
```
$ npm install --save @types/xml2js
```

```javascript
import xml2js from 'xml2js';
```

これでエラー回避できました。

あとのところは下記記事を参考に実装し、問題なくXMLデータをjsonに変換することができました。

参考にさせていただいた記事：
[Node.js + axios で XMLのレスポンスを扱う
](https://qiita.com/fossamagna/items/411ec63cf62dc73784da)

## 難点

このxml2jsを使って一つ躓いたのが、jsonの形式です。
今回、APIを叩いて返ってくるデータが１つだったり、複数だったり様々なパターンのものでした。

例
```
[
  {
      apple:　りんご,
      banana: バナナ,
      orange: みかん
  },
  {
      apple:　りんご,
      banana: バナナ,
      orange: みかん
  }
]
```
このように、xmlからjson形式に変換した後、複数データの時は配列で返ってくるのですが、
１つのデータだった場合は、配列ではなくobjectになっていました。

例
```
{
  apple:　りんご,
  banana: バナナ,
  orange: みかん
}
```

この後のコードで繰り返し処理(map)させたかったので、objectだとエラーになってしまいます。
xml2jsのオプションの中に`explicitArray`というものがあったので、
なんとなくこれをtrueにしてみましたが
```
[
  {
    apple:　[りんご],
    banana: [バナナ],
    orange: [みかん]
  }
]
```
なんでそんなことになるん？？？？？となったので、
面倒ですがレスポンスデータが配列の時とオブジェクトの処理の時を条件分岐させることにしました。
配列で返ってくるように選択できればいいのにな・・・
Android Studioのショットカートが効かない

## 背景
Android: BumbleBee

`Run`というショットカートが効かない

![Screen Shot 2022-05-25 at 11.51.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37718/1c2878b3-bd6c-8d4e-8405-cdc366303e85.png)

## 対策
設定し直す: もともと`^R`ですが、効かないため、`⌃⌥R`に変えた。

- 前のショットカートを消す
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37718/482e7784-1ec2-0f4b-c85c-048689aa452e.png)
- 新しいショットカートをバインディングする
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37718/1cb74e45-8f80-8785-5c6a-2a380df69fea.png)


警告が出ますが、設定の修正（edit configurations）はそこまで使わないので、そのまま上書きします。
Study Note #1

2022/04/01にAWSエンジニアに転職しました。

社内では今までの経験を活かし、採用とフルタイムでのAWSエンジニアとして勤務しております。

経営にも関わっていきますが、技術者としてのレベルもしっかりと上げていきます。

早速１か月後のAWSクラウドプラクティショナー認定試験に申し込みを済ませました。
（締め切り効果を狙って）

https://aws.amazon.com/jp/certification/certified-cloud-practitioner/


6月25日に受験予定です。



合格の為にそれまでやる事。

・くろかわこうへいさんのクラウドプラクティショナー試験対策本を2022/5/27までに読み切る。（234/449ページ目）


・緑のAWSクラウドプラクティショナーの教科書を6/3までに読み切る。（第5章の途中まで読み終わっている）


・読書後に、試験問題の演習を2周6/11までにやり切る。


・自信が出てきたら、可能なら試験日を6/18にリスケして受ける。
Power Appsのポータル画面で、チャットを構築する


## はじめに
Dynamics 365 Customer Serviceのポータル画面上にチャットを構成するためにやったこと。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/0d73e245-e80c-5779-73cc-181ee46f4470.png)

### 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/e509f45c-f59d-fcf1-24b3-ab2adc331ead.png)

## Dynamics 365 Customer Service　Admin Center チャット　ウィジェットをコピーする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/70170cd1-f8ba-5c9b-bbac-fce065825d95.png)

### 張り付けるがうまく表示されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/7228a24a-e034-386b-0327-bb171f5cbaa0.png)


Docs見ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/fff0bf68-780d-61df-2f74-9c46dd261d01.png)

### dynamics customer service チャット ウィジェット

https://docs.microsoft.com/ja-jp/dynamics365/customer-service/add-chat-widget?tabs=customerserviceadmincenter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/eded6d82-7804-7ed3-f4d1-debcfc5cac69.png)


### チャットをポータルに埋め込む

https://docs.microsoft.com/ja-jp/dynamics365/customer-service/embed-chat-widget-portal

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/aa2cbdac-0502-7a14-37eb-6d64e82e39c4.png)


原因判明↓これやっていなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/38866842-4bfd-c4f3-2561-07f68a267a3c.png)

https://docs.microsoft.com/ja-jp/dynamics365/customer-service/troubleshoot-omnichannel-customer-service


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/b4a8e9fd-4f8f-f080-47dc-f78cff63c093.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/56be356a-1074-1bcd-4f80-8ebad84df3b3.png)

設定完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/cb40e19e-5003-4d1c-619c-413bc8df5d31.png)

チャット画面が右下みえる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/1bf70e19-6854-6c38-bb01-1c62c78954b9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/355b527f-7167-1ab7-4a7e-fa900bc0e255.png)

以上。


### 参考
https://docs.microsoft.com/ja-jp/dynamics365/customer-service/initiate-chat-wait-time

https://docs.microsoft.com/ja-jp/dynamics365/customer-service/troubleshoot-omnichannel-customer-service