OmniAICreator/Qiita-1.07M huggingface dataset:
[channel 3: open failed: connect failed: Name or service not known]...ssh ポートフォワーディングのせいでした

# 概要
自分用にメモ。
ただいまRailsのチュートリアルを触っている最中です。
状況としては、普段の作業PCからsshでUbuntuにリモートでログインし、RubyやらRailsやらのセットアップと試し打ち中。
`bundle exec rails server`を打ち込んでサーバを立ち上げて、localhostの3000番にアクセスしたところ、応答なし。
サーバログにはタイトルの

```bash:errorlog
channel 3: open failed: connect failed: Name or service not known
```

# 原因
調べてみたところ、今回の原因はrailsではなくsshのポートフォワーディング。
というのもUbuntuのネットワーク設定をするのが大変なので、railsサーバの状況を手っ取り早く確認するために、ローカルの3000番をリモートの3000番にsshでポートフォワーディングをしていました。
エラーが出た時に叩いていたsshコマンドがこちら。

```shell:bad-command
ssh -L 3000:[remote host name]:3000 [remote host name]
```

今回の正解がこちら。

```shell:correct-command
ssh -L 3000:localhost:3000 [user name]@[remote host name]
```

ネットワークだとか仕組みだとかを理解していればわざわざ間違えないような気もします。
精進します。

#### 今回参考にさせて頂いた記事
https://qiita.com/nyamada43/items/a2caf5d771bc81ee3dfa
AWS クラウドプラクティショナー試験に合格するまで

**AWSクラウドプラクティショナー**の試験に合格しました。合格までの道のりを記述します。

###概要
・AWSの**中級**の試験で、アーキテクトの他にはデベロッパー、運用と全３種類ある。
・
・受験料は**11,000円**
・試験時間は**90分**
・出題数**65問**
・合格は100~1000点間で**700点以上（おおよそ７割以上）**
・受験はビアソンかPSI（オンライン受験可能）


###予備知識
AWSへの移行や、既存AWS環境の保守などを片手間レベルでやったりしてたので、若干知識はありました。EC2、RDS、ELB、S3等主要なシステムはざっくり把握していた感じです。

###勉強期間
勉強期間は約1ヶ月で、毎日1時間程度、土曜はちょっと多めに。平日はできない日もあったりしたので、最終的なトータル時間は20h~30h程度だと思います。

###教材
**①徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/4e25a77c-346a-28fd-1ed9-bac1e73ca325.jpeg"![512lfKHsI+L.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/b77c6611-ec65-c047-4310-0ecfb2416fb2.jpeg)
 width=20%>
これは試験を考える前に読んだ本です。オールカラーで図も多く、すごい読みやすいです。**AWSの入門書としてはベストな一冊**です。私は２周読みました。

**②AWS認定資格試験テキスト**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984662/cbad14c2-d86e-f983-6782-5a40e829020d.jpeg" width=20%>
この試験の定番のやつです。①の参考書よりもより踏み込んでこの試験に近づいた内容が記載されています。ボリュームもそここあって**全278ページ**。これも２周読みました。

**③Udemy「この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集」**
https://www.udemy.com/course/aws-4260/
試験の問題集です。**基本２種、応用３種の構成でそれぞれ65問**あります。基本と応用①は３週、応用②、③は２週だけしました。全部７0%以上とれるところまで仕上げました。

###学習の流れ
**①「AWS仕組みと技術がしっかりわかる教科書」の読み込み**
とりあえず触りとしてこれをやりました。この参考書に限ったことではないですが、重要なのは**考えながら読む事**で、常に疑問を持ってそれを解決しながら読み進めました。その過程で「AWS仕組みと技術がしっかりわかる教科書」にもどったり、ググったりすることも頻繁にやりました。**システムなのでやはり図を読み解くと頭に入るなー**ってのが今回の印象です。

章末の問題ですが、難易度としては**やや高め**に設定されていると思います。これが初見で全部とけるなら十分合格レベルできるです。

**②Udemy**
基本①をやる→もう一回基本①をやる。これと同じことを応用③までやりました。２回目はそれぞれ**８０％以上**はとれるようにしています。

ここで重要なのは参考書を読むときと同様で、**解答を突き詰める**ことです。自分の中で消化できるところまで解説を読んで、ここでも参考書にもどったり、ググったりしてます。また、わからない単語も多数あったのですべてメモに残しました。

**③参考書に戻る**
ここで改めて全体像を把握したくなったので、「AWS仕組みと技術がしっかりわかる教科書」と「AWS認定資格試験テキスト」を再度読み直ししました。

**④再びUdemy**
基本①と②と応用①をやりました。②Udemyから１週間以上時間があきましたが、それぞれ**70%以上**とれました。

###試験
**①申し込み**（試験２週間前くらい）
試験はピアソンで申し込みました。１週間くらい先だとあんまり空きがなかったので、最低でも**半月くらい前**までには申し込んだほうが良さそうです。私はオンラインだったので、事前準備として**専用アプリをダウンロードして端末のチェック**を事前に行いまいした。

**②受験当日**
**30分前**から試験にチェックインできます。その後、スマホで本人確認、試験官と日本語チャットでやりとりしながら部屋のチェックがありました。部屋には本棚や、PC、ディスプレイ等いろいろありましたが、指摘されることはありませんでした。デスク周りはすっきりさせておいたので、**デスク周りさえ整っていれば**問題なさそうです。

**③受験**
一周してから十分に時間があまっていたので、その後見直しで数問修正しました。２週目になって冷静になってみるとやっぱりこっち！ってのがけっこうあるのでやっぱり見直しは重要です。見直しを終えた後、７割いった感じがしなくて落ちたかなって思ってました。試験直後に結果が出て、合格でした。

問題の傾向としては、**AWSの概念、DBまわり、監視系、ネットワーク、セキュリティ、コンプラ**あたりがよく出たように感じます。**反射的に答えられる問題が３割、考えて答えられる問題が４割、これわかんないかもって問題が３割**って感じでした。資格試験の定番ですが、知らない単語ももちろんでてきたりしました。

###どこまでやれば合格できるか
これが受験者の一番気になるところだと思います。私の所感としては、Udemyベースでいうと**基本①、②レベルを完璧にしておけば合格の土俵にたてる**と感じました。プラス保険をかけるために応用を上乗せしておくという感じです。また、**Udemyで出た単語の出現率が非常に高かったので、Udemyで出題された問題の単語を押さえておく**ことも非常に重要なポイントになります。

###さいごに
この資格学習をしたことで、AWSにどんなシステムがあるのかを一定レベルまで把握することができました。また、何より**このシステムはこういう導入の仕方をしたほうが良いという設計段階の思想**を学べたのが非常に大きいです。無事合格できてよかったです。この記事を見てくれた人が合格することを祈っております！！
LDAP記事まとめ

 ##記事一覧

* https://qiita.com/jca02266/items/bf00acf88fde8bc29775
* https://hogetech.info/2020/06/15/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-openldap-%E5%85%A5%E9%96%80/
*
【Rails】No route matchesの解決方法

# はじめに
この記事では、Routing Error No route matchesの解決方法を説明します。

# 環境
macOS Catalina 10.15.7にRails 6.0.4をインストールして使っています。
また、この記事はTwitterのようなアプリケーションを作成した際に発生した事象をもとに書かれています。

# 解決方法
1. メッセージに従い、ルーティングの設定に間違いないか調べます。
2. エラーが出たページの処理まわりで怪しいところがないか調べます。

## 1. ルーティングの確認
1.1 ターミナルでrails routesコマンドを入力し、ルーティングを確認します。
1.2 hoge/config/routes.rbを参照し、エラーが出たURLで正しくルーティングが設定されているか確認します。

### 今回の場合
エラーメッセージで「newアクションにこのPOSTが設定されていないよ」と言われていました。
![スクリーンショット 2021-07-07 0.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735747/39f04812-5396-face-8476-67bec707afe5.png)

rails routesでルーティングを確認し、routes.rbと照らしあわせます。

![スクリーンショット 2021-07-07 0.35.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735747/85cf6df8-2cb4-0ae5-4be2-66f10bf0af72.png)
![スクリーンショット 2021-07-07 0.35.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735747/d892e0d0-6b00-73eb-e44f-6fe3eff2561e.png)

たしかにnewにはGETが設定されています。エラーメッセージに従うとここでルーティングの設定を直せばOKなのですが、今回この設定で問題ないはずなので別部分のミスを疑いました。

## 2. エラーが出たページの処理で誤りがないか確認
MVCをそれぞれ確認します。

### 今回の場合
newアクション、特にformのsubmitボタンを押した際にエラーが発生したため、その周辺を重点的に見ました。
![スクリーンショット 2021-07-07 0.50.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735747/7c54b7a3-850e-7566-7f9d-885d0c911d7e.png)
![スクリーンショット 2021-07-07 0.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735747/2d4e95f5-3fc8-e26d-1a50-4a88d22dd381.png)
![スクリーンショット 2021-07-07 0.48.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1735747/4e357a9e-b6ec-3aec-e0d6-b0bbd42d1856.png)

コントローラーとnewアクションで同じにすべきインスタンス変数が違いました（単数形にすべきところを複数形にしていた）。
submitボタンを押した際にテーブルに投稿を登録する処理が始まるため、インスタンス変数の違いがこのタイミングで悪さをしていました。

## おわりに
非常につまらないミスではありましたが、ルーティングの設定は正しいはずなのにどうしてエラーが吐かれているんだろう…と困った方の役に立てば幸いです。
Module parse failed: Unexpected token のエラー


##バージョン
laravel 8
Vue.js 2.6

##内容

```
$ npm run watch
```

でエラーが出る

```
ERROR in ./resources/js/pages/Login.vue 1:0
Module parse failed: Unexpected token (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
> <template>
|   <h1>Login</h1>
| </template>
```

##解決方法
webpack.mix.jsに
.vue()
を付け足すことで解決

```webpack.mix.js
mix.js('resources/js/app.js', 'public/js').vue()
    .postCss('resources/css/app.css', 'public/css', [
        //
    ]);
```
【Ruby】【Trello】リストのカードを一括コピーする

TrelloのWebUIからならテンプレートのカードをポチポチ作れるのですが、複数カードをコピーするのは面倒。
APIからだとテンプレートに関する処理は無さそうだったので、普通に create_card なAPIでコピー元のカードをリストから取得してコピー処理を回すようにした。

下記のように回せば順番も同じでコピーできるみたい。

# 動いているところ

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/02ba61e3-ae23-2bc5-9a45-0c440e023209.gif)

# メモ
以下のライブラリを使いました。
https://github.com/jeremytregunna/ruby-trello

```ruby
require 'trello'

# 認証情報を登録する
Trello.configure do |config|
  config.developer_public_key = ""
  config.member_token = ""
end

class Trello::Board
  def find_list_by_name(list_name)
    self.lists.find do |list|
      list_name == list.name
    end
  end
end

board_id = "xxxxxx" # 書き換えること
board = Trello::Board.find(board_id)

src_list = board.find_list_by_name("src")
dst_list = board.find_list_by_name("dst")

src_list.cards.each do |card|
  Trello::Card.create(source_card_id: card.id, list_id: dst_list.id)
end
```

# 参考

https://developer.atlassian.com/cloud/trello/rest/api-group-cards/#api-cards-post
"SCRUMMASTER THE BOOK"読書ノート

# はじめに

"SCRUMMASTER THE BOOK 優れたスクラムマスターになるための極意"の読書ノート。

<a href="https://www.amazon.co.jp/SCRUMMASTER-BOOK-%E5%84%AA%E3%82%8C%E3%81%9F%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%A5%B5%E6%84%8F%E2%80%95%E2%80%95%E3%83%A1%E3%82%BF%E3%82%B9%E3%82%AD%E3%83%AB%E3%80%81%E5%AD%A6%E7%BF%92%E3%80%81%E5%BF%83%E7%90%86%E3%80%81%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%82%B7%E3%83%83%E3%83%97-Zuzana-Sochova-ebook/dp/B08CRMPQL8?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=SCRUMMASTER+THE+BOOK&qid=1625063014&sr=8-1&linkCode=li2&tag=i0fe2-22&linkId=02ee5255e2d2ce3643ad1d5e47c075f3&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B08CRMPQL8&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=i0fe2-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=i0fe2-22&language=ja_JP&l=li2&o=9&a=B08CRMPQL8" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

# 要約

## 自己組織化したチームとは

自己組織化したチームは、以下の特徴を有する。

1. メンバー自らが、工数、期間等の計画を立て、宣言し、それを実行できる。
2. メンバー自らが、「みんなはひとりのために、ひとりはみんなのために、みんなはひとりのために、ひとりのために」[(参考)](http://www.mahoroba.ne.jp/~gonbe007/hog/shouka/tomodachiwaiimonda.html)という自己犠牲の精神を有する。

## スクラムマスターとは

スクラムマスターは、次のような特徴を持つ。

2. スクラムマスターは、チームの自己組織化を促進するコーチであり、ファシリテーターである。
2. スクラムマスターは、役割を兼務すべきではない。特に、プロダクトオーナーとスクラムマスターの目標は相反しており、兼務すべきではない。兼務する場合は、役割をうまく切り替えなければならない。
2. スクラムマスターは、チームのことを第一に考えるサーバントリーダーシップを持つべきである。
2. スクラムマスターは、チームの一歩だけ先を歩くことが大事。先に行き過ぎるとついていけなくなる。
2. スクラムマスターは、どうしたらチームが効果的に動けるか、を自問する。
2. スクラムマスターは、管理職とは異なり、オーナーシップをチームに移譲する。
2. スクラムマスターは、スクラムマスター同士が自己組織化しなければならない。

## スクラムマスターの資質

スクラムマスターの資質(Scrum Master Piller)とスクラムマスター道(Scrum Master Way)をまとめると下図のようになる。

![scrum-master.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/c92f2d07-a397-15c7-bfcc-80726dd56431.png)

スクラムマスターの資質には、3つのコアコンピタンス、3つのコンピタンス、6つのメタスキルが含まれる。

### メタスキル

6つのメタスキルとは、

1. 好奇心
1. 傾聴
1. 忍耐
1. 遊び心
1. 尊敬
1. ティーチング

である。

### コアコンピタンス

3つのコアコンピタンスとは、

1. アジャイル
1. コーチング
1. ファシリテーション

である。

### コンピタンス

3つのコンピタンスとは、

1. ビジネス知識
1. チェンジマネジメント
1. 技術知識

である。

## スクラムマスターの成熟度

スクラムマスターが目指すべきキャリアパスであるスクラムマスター道は、3つの成熟度レベルを持つ。

3つの成熟度レベルとは、

2. Lv.1のスクラムマスターは、自分のチームを自己組織化するために働く。
2. Lv.2のスクラムマスターは、チーム内外のステークホルダと良好な関係を構築するために働く。
2. Lv.3のスクラムマスターは、自分の組織やその一部のために働く。

である。

## チェンジをもたらす

アジャイルマスターは、次の8つのステップで組織に変化をもたらす。

1. 危機意識を持つ
1. チームをガイドする
1. 変化のビジョン
1. 理解と了承
1. 人々の行動を促す
1. 短期の成功
1. 気を緩めない
1. 新しい文化を創る

まず、危機意識を持ち、チームをガイドしながら、変化のビジョンを示すことでチームを成長させる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/8424cf64-89e8-0854-f961-2032bf2837a6.png)

次に、成長したチームとともに、外部のステークホルダーに対して理解と了承を得て、組織の人々の行動を促し、短期の成功をともに祝おう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/f042e7ae-ce1d-ca11-75e6-d679933db591.png)

最後に、気を緩めずに、新しい文化を定着させよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/54d61573-e3e3-3b66-eb86-4869712d19a4.png)
Windows 10 にImageMagickをインストール後Excel VBAから動かしてみる

# 目的
以前Windows版ImageMagickをインストール後VBAで試していないことに気が付いたので、試してみる。
※どこかで仕様変更があったようなので、検索記事の日付を見て参考にできるかどうかの判断は必要です
ツール->参照設定->ImageMagickObject 1.0 Type Library を追加後オブジェクトブラウザでメソッドを確認するのが吉かと(古い記事だと存在しないメソッドを使用していたりします)
実行時にはImageMagickObject 1.0 Type Libraryのチェックは必要ない
※[Changelog](https://github.com/ImageMagick/Website/blob/main/ChangeLog.md)を見ると
7.1.0-25 - 2022-02-15
Removed ImageMagickObject because we no longer support this. 
なので、バージョン依存で以下は不可です

## ダウンロード＆インストール

[ImageMagick - Download](https://imagemagick.org/script/download.php)よりImageMagick-7.1.0-2-Q16-HDRI-x86-dll.exeをダウンロードする
インストール時 Select Additional Tasks 画面の一番下の
[Install ImageMagickObject OLE Control for VBScript, Visual Basic, and WSH] をチェックする

## サンプルプログラム
"C:\Program Files (x86)\ImageMagick-7.1.0-Q16-HDRI\images" 以下の適当な画像のリサイズ＆形式の変更を行う

```vb
Dim imgMkObj    As Object
Dim imgPath     As String
Dim outPath     As String
Dim msg         As Variant
Dim objFso      As New FileSystemObject
'
Set imgMkObj = CreateObject("ImageMagickObject.MagickImage.1")

imgPath = ActiveWorkbook.Path & "\" & "bluebells_clipped.jpg"
outPath = ActiveWorkbook.Path & "\" & "bluebells_clipped.png"
'    Debug.Print imgPath
'    Debug.Print outPath
'
' すでにファイルが存在する場合事前に削除する
'
If objFso.FileExists(outPath) Then
    objFso.DeleteFile (outPath)
End If

msg = imgMkObj.Convert(imgPath, outPath)

Debug.Print msg
'
' すでにファイルが存在する場合事前に削除する
'
If objFso.FileExists(outPath) Then
    objFso.DeleteFile (outPath)
End If

msg = imgMkObj.Convert("-resize", "400x300", imgPath, outPath)

Debug.Print msg
```

# 参考にしたのは以下のサイト
[Using Blobs from Excel VBA](https://legacy.imagemagick.org/discourse-server/viewtopic.php?t=29155)
[[DEV:003-01] ImageMagickをVBAから使う](https://sites.google.com/site/torimemoforwork/vba/dll/imagemagick)
[OutSystems]Human ActivityにGroupを割り当てる

OutSystemsでWorkflowを実現する機能がBPTです。
そのBPTにおいて、人にタスクを割り当てるHuman Activityは、個別のユーザー・Roleの他にGroupも対象にできます。
その方法を確認します。

# プロパティではGroupに割り当てられない
↓がHuman Activityのプロパティ。色を付けたところで個別のユーザー・Roleに対して割り当てる場所がありますが、Groupに割り当てをするUIは無い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f76437af-8e47-9099-8b70-bf648ed011c5.png)

# ActivitySetGroup Action
Groupに対してHumanActivityを割り当てるには、(System)に含まれるActivitySetGroup Actionを使います。
まずは参照を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f353e421-9d3d-d387-daf0-6f46d47f80c4.png)

パラメータは、

- ActivityId：割当対象のHumanActivityのId
- GroupId：HumanActivityを割当する対象のGroup（Usersアプリケーションで管理するGroup）のId

# サンプル実装
テスト用のユーザーを3人、そのユーザーを所属させるGroupを1つ用意しておきます。

ユーザーは、テストなので名前は何でもいいのですが以下の通りに。

- BPTTestUser1
- BPTTestUser2
- BPTTestUser3

作成したユーザーはGroup「BPTTestUserGroup」に所属。

Human Activity開始時点で、そのHuman ActivityをGroup「BPTTestUserGroup」に割り当ててみましょう。
処理はHuman ActivityのOn Ready Callbackが良さそうです。
Process内に置いたHuman Activityを右クリック→Add On Readyで作成したコールバックを以下のように実装。
これで、ProcessのHuman Activityの位置に来た時点でBPTTestUserGroupにそのActivityを割り当てしています。
（なお、ActivityIdはHuman ActivityのCallback内なので自分自身のIdに触れます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5896184b-4c3b-675f-691b-0de3ec79d7e6.png)

# 実行結果
Process開始後、BPTTestUser1・BPTTestUser2・BPTTestUser3ユーザーそれぞれでログインしてTaskboxを開いてみたところ。
以下のように、サンプル実装したHuman Activityがきちんと割当たっていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f6d5d298-2182-f703-1993-01f36043d237.png)


Service CenterのMonitoring>Processesを確認すると、Human ActivityがGroupに設定されているのも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/ba1bd793-1a27-33f6-1016-dd805bec15b9.png)
jenkinsのSCMポーリングの謎発火バグの回避

# 前提
あまりに古のJenkinsを使っているせいか、
ビルドを実行するとSCMポーリングによるジョブが自動登録される
（ちなみにSCMをポーリングする設定は使っていない。ON/OFF切り替えても未来日付にしても解決しなかった）
（定期的に実行もしてない）


ビルド時間も長いのでまじでやめてほしいバグだ

え？Jenkinsのバージョン上げろって？

そんな工数もらえれば苦労しない。残業はしたくないのだ。

# 解決策
jenkinsで自動付与される変数に「BUILD_CAUSE」というのがある

手動実行の場合は「MANUALTRIGGER」
定期実行の場合は「TIMERTRIGGER」
BuildFlowの場合は「UPSTREAMTRIGGER」

が入っていた

問題のバグの場合は「SCMTRIGGER」が入るので
if分岐して強制終了にした

# 結論
jenkinsの安定化ってめんどくない？
みんなどうしてるのか知りたい
docker-compose build が失敗する


##現象

dockerfileに修正を入れたところ、

```
$ docker-compose build
```
がうまくいかない...

##エラー文

```
Reading package lists...
W: GPG error: http://deb.debian.org/debian buster InRelease: At least one invalid signature was encountered.
E: The repository 'http://deb.debian.org/debian buster InRelease' is not signed.
W: GPG error: http://security.debian.org/debian-security buster/updates InRelease: At least one invalid signature was encountered.
E: The repository 'http://security.debian.org/debian-security buster/updates InRelease' is not signed.
W: GPG error: http://deb.debian.org/debian buster-updates InRelease: At least one invalid signature was encountered.
E: The repository 'http://deb.debian.org/debian buster-updates InRelease' is not signed.
```

##解決方法

使用していないDockerオブジェクトの削除を行いました

```
$ docker image prune
$ docker container prune
```

参考
https://docs.docker.jp/config/pruning.html
電子国土の本質は分散

2000年に発表された[「２１世紀の基本測量 ～電子国土の実現に向けて～」](https://www.gsi.go.jp/common/000032041.pdf)（平成１２年１２月　国土地理院政策懇談会）の13ページ以降に**電子国土構想**のことが書いてある。私が重要と思う表現を抜き出してみると、次のとおり（太線はこのエントリの執筆者による）。

> ２１世紀には地理情報へのニーズが拡大し、その内容も多様化する。**特定の機関がすべての情報を整備し供給する手法では、多様な情報ニーズを満たすことは難しい**。多くの地理情報の作成者がその情報を公開し、利用者が自ら必要な情報を探して自らの責任で目的に応じて加工し利用することで対応しなければならない。

> 「電子国土」は、...**分散システム**である。

> 当面の目標は、国の行政における地理情報の共有と統合利用であり、それを踏まえ、地方公共団体も含めた国土管理行政での活用を図る必要がある。

> 「電子国土」を構成する地理情報は、それぞれの情報の**生成者の下に分散して管理される**ため、情報の**更新**が迅速に行えるとともに、最も**信頼性**の高い情報となる。利用者は、これらの**多様な**情報を**自由に**統合して活用することにより、**それぞれの立場で**適切な国土管理を効果的に行うことができる。

> 特に、災害対応等の危機管理にあたっては、リアルタイムな災害情報を提供することにより、国や地方公共団体等災害対応にあたる機関や研究者が適時的確に状況を把握し、迅速に対応することが可能となる。

> 政策の選択や施行に関する情報を、国民、ＮＰＯ、企業、行政等が**共有**することにより、**共同**して国土管理を推進する**社会の形成**が促進される。

> 「電子国土」が活用されるためには、...情報を利用者が自由かつ容易に「**自分の好きな態様で**」加工・表現するためのコンピュータシステムが求められる。

> 多様な地理情報を利用者に負担をかけずに統合して表示する仕組みと手法が用意されなければならない。

上記は、情報技術者の観点からみた**電子国土構想**の要点であろう。また、DFFTやベース・レジストリの萌芽もすでにここに見えているとも言える。平成12年は2000年なので、かなり高い先見性がここにあるとも言えるし、物事の本質は20年程度では変わらないとも言える。

この構想が発表された後で実装された電子国土ウェブシステムは、当初よりベクトルタイルを使用するなど意欲的な設計であったが、当時のウェブブラウザの制約、つまり ActiveX Component を提供しなければ実用にならないといった制約、やその他の当時の慣行によって、**データの仕様の公開**や**ソースコードの公開**にまでは至らず、停滞する。また、地理空間情報の標準化や SDI 構想の停滞の影響を受けて、低調な時代を迎える。

最も問題であったのは、国土地理院以外の者が地理空間情報を公開し、利用者が自ら必要な情報を探して自らの責任で目的に応じて加工し利用する部分の推進が進まなかったことである。

その後、オープンソース方式の導入や、オープンなベクトルタイル仕様の採択の機会を得て、電子国土構想は実現に向かいつつある。

地理空間情報をどれだけ与えることができるかということが、地理空間情報における豊かさの定義であるという認識が必要である。もっと言えば、地理空間情報は、情報である以上、与えることでしか価値を生まない。情報管理（Information Management）こそが価値の源泉であり、それ以外の方法で情報が価値を生み出すことを想像することは困難だ。

国土地理院職員による国連事務局での能力構築という機会を経て、地理空間情報を日々とに与える技術を共用できることを可能にすることを目指す「国連ベクトルタイルツールキット」は、電子国土構想の直系のプロジェクトであると言えるし、同キットのサブプロジェクトである「里親ジオデータ」プロジェクトは、**多くの地理情報の作成者がその情報を公開し、利用者が自ら必要な情報を探して自らの責任で目的に応じて加工し利用する**ことを広めるための実践である。

# 感想
- 2000年時点において、国土地理院は相当先進的な構想を持っていたように見える。しかし、先進的であったがゆえに、その後**オブジェクト指向、UML、XML**の弊害を大きく被って辛い時期を迎えることになる。しかし、その辺りの弊害を真正面から受けたからこそ、その後の**オープンソース、REST、ベクトルタイル**といった長期的な潮流を読み誤らず、しかも周到で大胆なトランジッションに成功したようにも思える。
AWSのセッションマネージャーの設定に失敗する

EC2インスタンスにセッションマネージャーからRDPする方法を試した。

まずは無料枠で使えるWindows Server 2019を作成。

そのあと、以下のURLに従ってSystem Managerの高速セットアップを実施。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-quick-setup.html

そしたら、「AWS-QuickSetup-SSMHostMgmt-AttachIAMToInstance」に失敗している･･･

ステートマネージャーで履歴を確認し、エラー内容を見てみる。

「Step fails when it is Execute/Cancelling action. An error occurred (Throttling) when calling the CreateRole operation (reached max retries: 4): Rate exceeded. Please refer to Automation Service Troubleshooting Guide for more diagnosis details.」

どうやらアタッチしたいロールの作成に失敗しているらしい･･･

ていうか勝手に調整エラーになって勝手に失敗するとは･･･ここだけ切り取ると自爆だろう･･･


というわけで、しばらく待った後に関連付けの実行をもう一度やったら無事成功した。
Tableauの計算フィールドでExcelのRANK.AVGを再現する

## はじめに
Tableau Desktopの計算フィールドには、ExcelのRANK.AVG()に相当する関数がないことがありません。
僕も業務で、このExcelをTableauで再現してほしいといわれたときRANK.AVG()が使用されていて困った経験があります。

今回は、備忘もかねてRANK.AVG()の再現方法を共有します!!

## version
Tableau Desktop 2020.4

## 使用データ
Iris dataset

## Excelで順位付けした場合
**入力方法と引数**
RANK.AVG(数値, 参照, 順序)

**仕様**
RANK.AVGの仕様は、同じ数値が複数ある場合、順位の平均値が返されるものとなっています。
以下の図のように、同じ値が4つあり、その順位が5位であるとき、いずれの順位も(3＋4＋5+6)÷4＝4.5となり、四捨五入され表示される順位は5位となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599573/76ae2ef5-545b-6b21-1f7e-fa11f36d7c19.png)


## Tableau Desktopで順位付けした場合
Tableau Desktopには順位付けの計算フィールドが複数用意されています。
詳しくはこちらをご覧ください。

https://help.tableau.com/current/pro/desktop/ja-jp/functions_functions_tablecalculation.htm

表計算関数の中から2つの関数を使用し、比較します。

**入力方法と引数**
・RANK(expression, ['asc' | 'desc'])
・RANK_MODIFIED(expression, ['asc' | 'desc'])

**仕様**
下記の表をご覧ください。
RANKは同一の順位があった場合、最上位の順位が表示されるのに対して、RANK_MODIFIEDは最下位の順位が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599573/ccc56484-173e-02e3-fb37-a78fd1bee5a5.png)


## 解決方法
以下の画像のようにRANKとRANK_MODIFIEDを使用し、計算フィールドを作成します。
最上位と最下位の平均を求めることで、ExcelのRANK.AVGと同様の順位を表示させます。

![スクリーンショット (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599573/7ba34229-f511-39cf-d4b4-a8a527c3fc03.png)

実際にTableau Desktopで作成した表です。
無事、ExcelのRANK.AVGを再現できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599573/8f3d3351-0941-e270-d0da-97d0135e7ec5.png)

## まとめ
ExcelのRANK.AVGとTableau Desktopの表計算関数の比較、Tableau DesktopでのRANK.AVGの再現まで行いました。
かなり力技でしたが、皆様の力になれば幸いです。
最後までご覧いただきありがとうございました。
[nextjs]子コンポーネントでのgetStaticPropsが呼ばれない

# はじめに
子コンポーネントで外部ファイルのJSONファイルから取得した値を表示しようと、
getStaticPropsに処理を書いてみたところ、何度表示してもgetStaticPropsが呼び出されず３時間悩んだのでメモします。

# 結論
子コンポーネントにgetStaticPropsを記述しても呼び出されない。
ページコンポーネントではないと呼び出されない。
（注：2021年7月時点）

# 参考資料
ちなみに公式ページにもさらっと書いてありました。
ですが、getInitialPropsのページに書いてあるのでgetStaticPropsのページを何度見てもわかりません。
[nextjs - getInitialProps#caveats](https://nextjs.org/docs/api-reference/data-fetching/getInitialProps#caveats)

getInitialPropsがgetStaticPropsとgetServerSidePropsに分かれたので、大元のgetInitialPropsが呼び出されないということは、
必然的に分かれた２つも呼び出されないということのようです。
DjangoでAPIのキャッシュ方法をデコレータで実装してみた

# はじめに

python、django勉強始めて２ヶ月くらいなので、スネークケース、キャメルケース適当です！！

それでは、、、
Djangoのキャッシュ方法は下記３つあります。
①「ページごと」キャッシュ
②「API」キャッシュ
③「テンプレート」キャッシュ

で、今回やりたいのは、②「API」キャッシュ。

「@cache_page」が使えると書いてあったけど、ビューキャッシュ（上記①）しかダメっぽい。

@cache('cache_key', 'key_param')
みたいにさ。書いたら自動でキャッシュしてよしなにしてくれるデコレータを探したけど、どこにも情報ない。。。

# んで、、、とりあえず、実装してみた。

```python:cacheUtil.py
from django.core.cache import cache
from django.conf import settings

DEFAULT_CACHE_TIMEOUT = settings.CACHES['default']['TIMEOUT']
CACHE_KEY_FORMAT = '{}_{}'
KEY_PARAM = 'k_p'

# 呼び出し元にk_p引数をいれる
# キャッシュがあればキャッシュを取得。なければメソッドを実行してキャッシュして返す。
def api_cache(key, timeout=DEFAULT_CACHE_TIMEOUT):
    def _api_cache(func):
        def wrapper(*args, **kwargs):
            new_key = key_generate(key, kwargs.get(KEY_PARAM))
            cache_value = cache.get(new_key)
            if not cache_value:
                result = func(*args, **kwargs)
                cache.set(new_key, result, timeout)
                return result
            return cache_value
        return wrapper
    return _api_cache

def key_generate(key, key_param):
    if key_param:
        return CACHE_KEY_FORMAT.format(key, key_param)
    else:
        raise ValueError("Cache用の'k_p'引数が未設定です")

```

上記Utilを使ったキャッシュ方法

```python:キャッシュをしたいdef
# 上記のcacheUtil.pyはutilsというディレクトリに入れてます。
from utils.cacheUtil import api_cache

# 第一引数はキーとして、他の関数と被らないように設定してください。
# timeoutは指定しなかったら、defaultの値が入ります。
@api_cache('get_all_data', timeout=60 * 60 * 24)
def get_all_data(town_cd, k_p):
    〜〜〜処理〜〜〜
```

```python:キャッシュをしたdefを使う場合
town_cd = 'shibuya'
# 呼び出し元が@api_cacheがついたdefを使う場合は、必ずk_pに値を入れる。
# k_pは、キャッシュを持つ時に一意になる値です。
# k_p入れてないとエラーでるようになってます。
hoge = get_all_data(town_cd, k_p=town_cd)
    〜〜〜処理〜〜〜
```



もし、、、上記みたいに実装しなくても、もうすでにあるよ〜〜〜って知ってる人いたら教えてください！！！


参考にしたやつ
https://docs.djangoproject.com/ja/3.2/topics/cache/
dnd_areaを利用すると可能になること：part1

dnd_areaを利用すると編集画面の「セクションをスタイル設定」で下記設定が可能になる。

- 背景色
- 背景画像
- 幅（全幅・コンテンツ幅）
- マージン
- パディング
- コンテンツの縦位置

※dnd_area毎に個別の設定が可能


## 注意点
入力欄が１つしかないため、PCとSPで同じ設定となる。

## 結論
現時点では積極的に利用しようと思えない。
UITabBarControllerのボタンの色を変える


## はじめに
UITabBarControllerのボタンの色を変えたい。

## 環境
Xcode 12.4
Swift 5.3.2

## 実装

タブバーコントローラーに遷移する前の画面で色を指定しました。

```swift:MenuViewController
override func viewDidLoad() {
    UITabBar.appearance().tintColor = .red
    UITabBar.appearance().unselectedItemTintColor = .darkGray
}

func next() {
    let storyboard = UIStoryboard(name: "Next", bundle: nil)
    let next = storyboard.instantiateViewController(identifier: "Next")
    guard let tabBarCon = next as? UITabBarController else { return }
    self.navigationController?.pushViewController(tabBarCon, animated: true)
}
```

## 結果
![スクリーンショット 2021-07-06 23.35.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/7b3683e4-c6d1-a92a-f4ec-0146c5e0b4fe.png)

## 感想
今後も何度か調べそうな内容だなと思いました。
参考記事に感謝です。

## 参考記事
https://egg-is-world.com/2016/09/25/tabbar-icon-unselected-color/
PythonでのJSON読み込みエラー　JSONDecodeError 

環境　Windows10
Python３
Anaconda3

JSONファイルを読み込む為に以下のように記述しました。
````

````
import json
with open('file.json') as f:

    file_keys = json.load(f)

````
しかし、以下のようなエラーが発生しました。
````
````

```
JSONDecodeError                           Traceback (most recent call last)
<ipython-input-18-e6de140fc2b0> in <module>
      1 import json
      2 with open('file.json') as f:
----> 3     file_keys = json.load(f)

```
JSONファイルの構文をチェックしましたが、問題ない。
ググって、ググりまくっているうちに、どうも、コードの記述に間違えがあるような感じがする。
JSONファイルはこのコードと同じパスに入っているので、読み込んでくれるはず。
諦めて・・。
今度は、書き方を変えてみました。

````
import json

filename = "C:/Users/User/src/file.json"
with open(filename, "r", encoding="utf-8") as f:
    file_keys = json.load(f)
````

無事、JSONファイルを読み込んでくれました。
コンストラクタは自動生成だとだめなのか？

# 導入

「デフォルトコンストラクタは自動生成してくれるのなら定義する意味とは？」という質問を受け、自分なりの回答を書いていたら長文になったので、せっかくなら公開しようとなったので書きます。

# 結論

そもそも自動生成でもいいケースが少ないから大体のケースにおいて定義が必要になる。
そうすると定義されていないクラスが、実装漏れなのか意図的なのかレビュアーからは分かりにくい。
結果、ほぼすべてのクラスで宣言することになる。

# 自動生成される条件

自動生成される「コンストラクタを定義しない」です。
なおdelete宣言しても自動生成されません。

# 自動生成でもいい条件

自動生成でもいい条件は以下のいずれか一つを満たすことです。

(1) 初期化する必要がない
(2) 自動生成で正しく(意図したとおりに)初期化される。
(3) コンストラクタで初期化する必要がない

以下、細かく見ていきます

## (1) 初期化する必要がない

初期化が必要がない、つまりメンバ変数がないケースです。
以下の3ケースがあると思います。

(1-1) 静的クラス（静的メソッドのみで構成されるクラス）
(1-2) インターフェースクラス（純粋仮想関数のみで構成されるクラス）
(1-3) メンバ変数がない関数オブジェクト
(1-4) メンバ変数がない普通のクラス

### (1-1) 静的クラス（静的メソッドのみで構成されるクラス）

このケースでは、インスタンスの生成をされたくないので、delete宣言するはずです。

```C++:静的クラスの例
class StaticClass
{
public:
    StaticClass() = delete;

    static void XXX();
}
```

### (1-2) インターフェースクラス（純粋仮想関数のみで構成されるクラス）

このケースでは、暗黙的に自動生成されるデフォルトコンストラクタでもよいかもしれません。
default宣言しなくてもインターフェースクラスであることが明示されていれば、コンストラクタの定義がなくてもレビュアーも混乱しないでしょう。

```C++:インターフェースクラスの例1
class Interface
{
public:
    virtual void XXX() = 0;
}
```

```C++:インターフェースクラスの例2
class Interface
{
public:
    Interface() = default;
    virtual ~Interface() = default;

    virtual void XXX() = 0;
}
```

### (1-3) メンバ変数がない関数オブジェクト

operator()を定義したクラスのオブジェクト。
（クラスには名前はないんだろうか？関数クラスとか・・・）

メンバ変数を持たない関数オブジェクトの用法が、ラムダ式以外にない気がピンときてない。
（計算式の一部の値をメンバ変数として保持する、、、見たいなイメージだった）

### (1-4) メンバ変数がない普通のクラス

このケースは、通常ありえないケースです。
状態値を持たないなら、すべて静的メソッドでよいはずで、静的クラスとして定義するべきです。
ただもし設計上の理由で定義する場合には、default宣言をして自動生成されるコンストラクタを使用することを明示するべきでしょう。

## (2) 自動生成で正しく(意図したとおりに)初期化される。

該当するのは以下のケースのみです。

(2-1) 引数なしのコンストラクタで初期化するメンバ変数のみでメンバ変数で構成される

逆に自動生成で正しく初期化されないのは以下のいずれかのケースです。

(2-2) [NGケース] 組込み型のメンバ変数を持つ
(2-3) [NGケース] publicな引数のないコンストラクタを持たないクラスのメンバ変数を持つ
(2-4) [NGケース] 引数を指定してコンストラクタで初期化したメンバ変数を持つ

### (2-1) 引数なしのコンストラクタで初期化するメンバ変数のみでメンバ変数で構成される

このケースでは意図したとおりに初期化することができます。
ただし、レビュアーはコードのみを見て意図的なのかどうかを判断することはできないので、default宣言するべきでしょう。

### (2-2) [NGケース] 組込み型のメンバ変数を持つ

組込み型の場合、自動生成されるコンストラクタでは初期化されません。
結果不定値となります。
不定値は意図した初期化ではないのでNGです。

### (2-3) [NGケース] publicな引数のないコンストラクタを持たないクラスのメンバ変数を持つ

コンパイルエラーとなるケースです。
当然NGです。

### [NGケース] 引数を指定してコンストラクタで初期化したメンバ変数を持つ

自動生成されるコンストラクタで、メンバ変数に引数を指定することはできないのでNGです。

## (3) コンストラクタで初期化する必要がない

該当するのは以下のケースです。

(3-1) 別に初期化するケース
(3-2) 変数の初期化をコンストラクタ外で行うケース

### (3-1) インスタンス生成後に別途初期化するケース

Factoryパターンなど、インスタンスの生成後に別途初期化を行うことが保証できるケースでは、別途正しく初期化するため(2-2)～(2-4)に該当するケースでも自動生成でも問題ないでしょう。
このケースでもdefault宣言はしておくべきでしょう。

### (3-2) 変数の初期化をコンストラクタ外で行うケース

[非静的メンバ変数の初期化](https://cpprefjp.github.io/lang/cpp11/non_static_data_member_initializers.html) で初期化するケース。

# まとめ

default宣言なしで自動生成されるコンストラクタを使用できるケースは、(1-2)のインターフェースクラスのみです。
ほぼすべてのケースでなんらかの宣言をしなければならないのではないかと思います。
PHPの変数をJavaScriptで使いたい（PHP変数をJavaScriptへ渡す方法）

PHPファイルでPHPの変数をJavaScriptで使う方法（JavaScriptへ渡す方法）をメモ的にまとめておきます。

#数値・文字列を渡すとき：そのままecho

```php:sample.php
<?php
$num = 1;
$str = 'abc';
?>

<script type="text/javascript">
var num = <?php echo $num; ?>;
console.log(num); // 1
var str = '<?php echo $str; ?>';
console.log(str); // abc
</script>
```

#配列を渡すとき：json_encodeでJSON形式にして渡す

```php:sample.php
<?php
$hoge = array('aaa', 'bbb');
?>

<script type="text/javascript">
var hoge = JSON.parse('<?php echo json_encode($hoge)?>');
console.log(hoge); // ["aaa", "bbb"]
</script>
```
Python&Flaskでコヨーテのカード出現率を計算するAPIを実装してみる

こちらの記事で、今弊社で話題沸騰のカードゲーム「コヨーテ」の使用済みカードをメモするフロントエンドを実装しました。

https://qiita.com/araya/items/4c4116ec02f968c9e78d

その後、各カードの出現率がわかるともっといいなと思い、フロントエンドだけでも完結できそうですが、Python & FlaskでAPIを実装してみました。

# flaskのインストール
Flaskをインストールします。
グローバルを汚したくないのでカレントディレクトリ以下にpipインストールしました。

```
$ pip install flask -t site-packages
```

# APIの実装
早速APIの実装です。
少しダサいですが、GETパラメータで使ったカードのJSON文字列を受け取って、総カード数から引き算をして出現率を算出するような実装にしました。

シンプルですが以下のような感じです。

```python:api.py
# -*- coding: utf-8 -*-
import os, sys
sys.path.append(os.path.join(os.path.dirname(__file__), 'site-packages'))

from flask import Flask, request, make_response
import json

api = Flask(__name__)

@api.route('/coyote', methods=['GET'])
def get_cards():
    cards = {
        "20": 1,
        "15": 2,
        "10": 3,
        "5": 4,
        "4": 4,
        "3": 4,
        "2": 4,
        "1": 4,
        "0": 3,
        "0 CLEAR": 1,
        "-5": 2,
        "-10": 1,
        "x2": 1,
        "MAX->0": 1,
        "?": 1,
    }
    used_cards = json.loads(request.args.get('cards', ''))

    for key in used_cards:
        cards[key] = cards[key] - used_cards[key]

    total_cards = 0
    for key in cards:
        total_cards+=cards[key]
    rate = {}
    for key in cards:
        rate[key] = cards[key] / total_cards * 100

    return make_response(rate)

if __name__ == '__main__':
    api.run(host='0.0.0.0', port=8080)
```

# 試してみる
Postmanで試してみました。

```
$ python3 api.py
 * Serving Flask app 'api' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://192.168.31.33:8080/ (Press CTRL+C to quit)
```

で起動して、

こんな感じです！
パーセンテージが返ってきてますね。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74622/0ee47eb4-defd-0319-0249-1e547e3ec627.png)|
|:--|

# Github
Githubはこちらです。
IssueやPRお待ちしています。

https://github.com/arkth-araya/coyote-api
Power Automate で作成した所有者を削除する方法。今は出来るようになってます

# 何のために？
作成したフローを引き継ごうとしたら、簡単に出来ないことに気づいたので・・
※アクセス管理という表向き理由ですが・・ずっとアクセス出来ると、相談が続きそうで嫌だなぁと😜

## 解決策 2022/6/21 追記
Solution Flow にしたら Owner(所有者) 移転できるようになったらしい

https://powerautomate.microsoft.com/en-us/blog/change-owner-of-a-solution-flow/

### 回避策
- Export/Import😢

### 予想していた方法
- 所有者から単純に削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b115cb79-5fb8-7998-3038-15b101519e98.png)

### 試行１：Modify-Owner での削除
まぁ、予想通りダメです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/7681ace2-b984-5c4e-31f0-8f82df68d720.png)

### 試行２：Power Shell で削除・・・Flowと同一、ということが確認できただけ・・😅
1. AzureAD　を利用する準備<br>

    ```powershell:Install-AzureAD
Install-Module -Name AzureAD
    ```
1. Power Automate/Apps を利用する準備

    ```powershell:Install-Automate/Apps
Install-Module -Name Microsoft.PowerApps.Administration.PowerShell
Install-Module -Name Microsoft.PowerApps.PowerShell -AllowClobber
    ```
- Power AutomateのOriginal Owner を削除
    1. AzureADへの接続

        ```powershell
Connect-AzureAD
        ```      
    1. アカウント追加

        ```powershell
Add-PowerAppsAccount
        ```          
    1. 所有者のIDを取得

        ```powershell
Get-AzureADUser -SearchString {targetMailAddress}
        ```        
        取得例
       ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/779c1bb7-faac-3ac2-b09c-b6e706732398.png)


    1. 変えたいFlowの情報を取得

         ```powershell
        Get-Flow -Filter {フロー名}  # 例 {test*}
         ```          
        Flow情報
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/aed4d2d4-fd1b-90c8-499d-f6b20f33da5b.png)

    1. 上記を元に削除

        ```powershell
Remove-AdminFlowOwnerRole -EnvironmentName {EnvirionmentName} -FlowName {FlowName} -RoleId {UserID}  
        ```       
        結局同じエラー
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/54603add-8111-767d-65ee-858e402ea88a.png)

    1. 作成者以外の所有者の削除
        **問題なし**
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/519c3eb3-0a38-a0f9-9cc9-54de7325b02d.png)

### 試行３：管理センターで
- 詳細表示<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/483277ad-3f52-cf28-f475-a1bc7de6cc63.png)
- 共有設定でも特になし・・<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/1a13951f-8fb9-28c1-9bb6-a894807af203.png)

# 現状の結論
- 何か方法があると思っていたけど、見つけられず・・

# 参考情報
- [Remove-AdminFlowOwnerRole](https://docs.microsoft.com/en-us/powershell/module/microsoft.powerapps.administration.powershell/remove-adminflowownerrole?view=pa-ps-latest#:~:text=The%20Remove-AdminFlowOwnerRole%20cmdlet%20removes%20owner%20permission,to%20a%20flow%2C%20depending%20on%20parameters.)
- [Azure PowerShell documentation](https://docs.microsoft.com/ja-jp/powershell/azure/?view=azps-6.1.0)
- [Change the original Owner of a Power App & Flow](https://ashiqf.com/2020/05/18/change-the-original-owner-of-a-power-app-flow/) 所有者がいなくなった場合の対処方法は、所有者追加だけと認識
プログラミングには何が必要か？

記事一覧

プログラミングを始める前の準備体操
[考え方のフレームワーク](https://qiita.com/WaterIsland/items/0214adb38cdcda4bdfe8)

プログラミング時に考えながら
[McCabe の循環的複雑度（McCabe Cyclomatic Complexity）](https://qiita.com/WaterIsland/items/a8b0507bb54734c9f94b)
DDL（データ定義言語）の基本的な知識

#はじめに

SQLには三種類の分類があり、DDL、DML、DCL、に分けられます。

今回は、そのうちのDDLについてや、その基本的な命令を備忘録として記事にします。

#DDLとは
DDLは、データベースやテーブルを作成するSQLの処理群のことを指します。

一方、作成したデータベースやテーブルからデータを取り出したり、データを追加したりする、データ操作に当たる処理軍は、DMLと呼ばれます。

#DDLの基本的な命令

・データベースを作成する

```
create database データベース名
```


・データベースを削除する

```
drop database データベース名
```


・テーブルを作成する

```
create table 所属するデータベース名.テーブル名(
   カラム名 データ型 default デフォルト値 制約 comment 'コメント',
   ・
　　　　　　・
　　　　　　・
   表制約
);
```


・テーブルを削除する

```
drop table 所属するデータベース名.テーブル名
```

・テーブル定義を表示する

```
desc 所属するデータベース名.テーブル名

または

show full columns from 所属するデータベース名.テーブル名

または

show create table test_db.test_table
```

・単一主キーの作成

```
create table 所属するデータベース名.テーブル名 (
	ID名 データ型 PRIMARY KEY
);
```

・複合主キーの作成

```
create table 所属するデータベース名.テーブル名 (
	一つ目のID名 データ型,
	二つ目のID名 データ型,
    PRIMARY key(一つ目のID名, 二つ目のID名)
);
```

・テーブル定義の変更

```
alter table 所属するデータベース名.テーブル名
(以下に次の命令を用途に合わせて書く)
追加→add
変更→modify
削除→drop

ex) add column key2 varchar(20) not null
```

・外部キー作成

```
alter table テーブル名
add constraint 制約名（削除する際に使用する）
foreign key (対象のキー名)
references 親テーブル名(テーブルキー名)
on update cascade 
on delete restrict;（省略可能）
```

・外部キーの削除

```
alter table テーブル名
drop foreign key 制約名;
```
考え方のフレームワーク

#最初に
初学者に対してプログラミングを良きものにするために必要なことは何か？ということを述べている書籍は少ない、と私自身はこれまでの経験から単に感じているだけかもしれない。
ある程度慣れ、効率的で、可読性に優れ、再利用性に優れたような素敵なコードを書きたいなと感じだしたような人向けの書籍は多々あるだろう。
なので、このシリーズではそういった人は対象にしない！と断言はしないが、特に初学者がどんな視点を持ってプログラミングをすると良いかに焦点を当てていく。
一般的な仕事や勉強するときにも役に立つフレームワークを用意しているので、冒頭だけでも読んでみると何かを発見できるかもしれないと前置きをし、さっそく具体的な内容に入っていこう。

#5W1Hで考えよう！
と書いたものの、いきなり全てを利用することはお勧めしない。
その理由は単純で、5Wで考えることは物事の大枠を考える時に最適
で、さらに切り込んでどうやったらいいのか（Howが出現！）という物事の詳細化は1Hで考えるという段階を踏む方がスッキリと考えられることが多いからだ。

それを踏まえ、これ以降の流れは以下のようになっているのでそのつもりで読んで欲しい。
(1) Why(&Because)でそれを実行する理由を考える
(2) 残りの4Wで大まかに必要な情報収集方法を考える
(3) 1Hで手段を具体化する


#最初は5Wで考える
例えば、

>こんなゲームを作ってみたい！
手作業を省略したい！
効率よく勉強したい！

といった問題に出会った時、まずは5Wを武器に解決すべき問題の大枠を組み立てると良いだろう。
なぜか？（さっそくWhyが出てきた！）なぜならば、それによって目的が明確化するからである。そうするとそこに意味が発生する。そのように考えて取り組んだ事は忘れないし、人に伝える事もできる、人が容易に理解することができる（もしかすると、あなたがいてもいなくても）、さらにそこから発展させることも容易になるだろう。
では、少し具体的にしていこうと思う。
\#この記事はあくまでプログラミングについてなのでそこから脱線はしないような内容をチョイスして…

まずは目の前に

>Excelやcsvファイルのデータを手作業でcopy&pasteする作業が面倒だ

という問題が転がっているとする。それをプログラミング(もしくはExcelの関数のみ)で解決しようとあなたは考えた。
何も考えずに取り組めば、それは時間を大幅に短縮できるのか？実は必要ないことでは？と人からのWhyの雨にさらされることになる。
そこであなたはそのWhyを振り払うような理由(Because)を考える必要がある。

Why
>なぜそれをしようと考えたのか？

Because
>毎日１時間の手作業を１０分にできるはずだ、そうすれば他の作業ができる。
それが１週間に5日働くとして約４時間／週、ということは約２１６時間／年の時間削減になる。
さらに同じチームメンバーが n 人いると...（以下略）

実際にはもっと掘り下げる必要はあるかもしれないが、これで誰もWhyの雨を降らせることはなくなるだろう。
\#ここで気が付く方もいらっしゃるかもしれないが、スタートはWhy(&Because)であることがほとんどだと考えて良い。

では次に別のWで具体化していこう。

What(Which要素も含む)
>どのOS上で動作させるか？
どのプログラミング言語を使うか？
どのデータが対象か？
どのデータが必要か？

Who
>誰が開発するか？
誰が恩恵を受けるか？
誰が用意するデータか？

When
>いつ制作するか？
いつ実行するか？
いつテストするか？
いつ手に入れられるデータか？

Where
>どこからデータが来るのか？
どこにデータが移動するのか？
どのサーバーで実行するのか？


他にも項目はあるだろうが、こんな感じで大枠をかんがえたら次は1Hの出番となる。


#1Hは最後に考える
なぜ最後に1Hに取り組むのか？という疑問に対する答えは"Howは具体的手段へのブレイクダウン"ということに直結しやすいからである。
プログラミング的には、問題解決のために利用するアルゴリズムとデータ構造を考える、というとわかりやすいかもしれない。
では、早速取り掛かってみよう。

How
>どんなアルゴリズムで処理できるか？どうすればデータを取得できるか？



初めからどうやって解決する？を考えていると井の中の蛙大海を見ず状態になり、別の注意すべき問題に気がつかなかったり、構築したHowが別の要因が原因で崩壊する可能性が高まることはよくあることだろう。
\#大枠を捉えていないと、大枠の一部が変更した時に柔軟に対応できなくなる、とでも言うべきかもしれない。



#課題
以下の課題は自由に設定を考え、自分で想定できる範囲で5W1Hを書いていこう。その際、マインドマップや木構造等の構造化ツールを利用すると便利かも知れない。

#####課題1 : 郷土の名産品を使った料理を作り、イベントで周知することになった。何を作るかは自由に考え、それを達成するために必要なことを5W1Hで考えてみよう。

#####課題2 : 複数の CSV ファイルの内容を１つのファイル（CSV, Excel, txt 等は自由）に集約することになった。それを達成するために必要なことを5W1Hで考えてみよう。

#####課題3 : 数学ではお馴染みの食塩水を混ぜる問題を考えてみよう。3%の濃度の食塩水と8%の食塩水を混ぜて５％の濃度の食塩水を500g作りたい。その時に連立方程式では以下のような式となるが、なぜこのような式になっているか、それぞれの式が何を表しているのか、を考えて実際に解いてみよう。
```math
\left\{
\begin{array}{ll}
\frac{3}{100}\times x+\frac{8}{100}\times y=\frac{5}{100}\times 500\\
x+y=500
\end{array}
\right.
```
AWS ELB（ALB, NLB）の違い

#【AWS ELB（ALB, ELB）の違い】

こちらも選考面接の際に理解が浅いことを痛感しました。
まとまりの悪い記事になりましたが、備忘録として残します。
追記していけたらいいなと思っています。

##ELB

**AWSが提供するロードバランサー**
受信したアプリケーション、ネットワークトラフィックをEC2インスタンスなど、複数のターゲットに分散させることができる。

##ALB、NLBについて。

ヘルスチェックを利用して、異常なターゲットを検出すると、それらのターゲットに対するトラフィックの送信を中止して、その他残りの正常なターゲットに負荷を分散する。

###ALB

**レイヤー7（HTTP/HTTPSリクエストの負荷分散）**

クライアントとLBの間のHTTPSターミネーションをサポート。
SGによるアクセス制限が可能。

スティッキーセッションを使って、同一のクライアントからのリクエストを同一のターゲットにルーティング可能。

###NLB

**レイヤー4（TCP/UDPトラフィックの負荷分散）**

高可用性であり、高スループット（数百万件/秒のリクエスト分散が可能）であり、低レイテンシ。
長時間セッションを維持することが可能。

送信元IPアドレスを保持できる。
固定IPアドレスであり、静的IP、ElasticIPをサポートする。

※SGを関連付けることができない。インターネットからNLBのトラフィックを制限するには、NLBのバックエンドに配置したインスタンスに関連付けるSGによって制御する。

##送信元IPアドレスの保持について。

**ALBとNLBで、送信元IPアドレスは異なる。**

・ALBは送信元IPアドレスをALBのIPアドレスに書き換える。

・NLBはターゲットグループにインスタンスIDを登録している場合、クライアントの送信元IPアドレスがターゲットまで保持される。これをアプリケーションで使用することで、IPアドレスに応じた処理が実行可能。
 
##参考

[新しいNetwork Load Balancer – 秒間数百万リクエストに簡単にスケーリング](https://aws.amazon.com/jp/blogs/news/new-network-load-balancer-effortless-scaling-to-millions-of-requests-per-second/)

ありがとうございました。
もっと知識を深めたいので、貪欲に学んでいこう。
Node.jsでsetIntervalを使ったタイマー

#はじめに

Node.jsでループ処理の勉強のため、[Node.jsのタイマー](https://nodejs.org/ja/docs/guides/timers-in-node)を使ってみたときのメモです。
setInterval()を利用して指定時間間隔ごとに無限に処理を実行し、条件に合致する場合にclearInterval()を利用して処理を停止する仕組みにしています。



#準備
## date-utilsの導入
時刻の取得は[こちら](https://qiita.com/n0bisuke/items/dd28122d006c95c58f9c)の記事を参考にさせていただき、date-utilsを利用しました。下記を実行してdate-utilsを導入します。

```
$ npm install date-utils
```


## タイマー

簡単のため、時刻指定は直接入力する方法にしています。
setIntervalを使い1秒(1000ms)おきに現在時刻を表示し、指定時刻になるとclearIntervalにより処理が終了します。

```javascript:timer.js
'use strict';
require('date-utils');

var intervalID = setInterval(() => {
    var dt = new Date();
    var formatted = dt.toFormat("HH24:MI:SS");
    console.log("しばらくお待ち下さい、只今の時刻：",formatted);
    if(formatted === '22:20:00' ) {  //タイマーを止める時刻を指定する
        console.log("時間になりました！");
        setTimeout(()=>{
            clearInterval(intervalID)
        })
    }
}, 1000);
```

#実行結果

```:実行結果
$ node timer.js
しばらくお待ち下さい、只今の時刻： 22:19:18
しばらくお待ち下さい、只今の時刻： 22:19:19
しばらくお待ち下さい、只今の時刻： 22:19:20
：
しばらくお待ち下さい、只今の時刻： 22:20:00
時間になりました！
```

以上です。
カテゴリ変数の加工

## カテゴリ変数とは

カテゴリ変数の値は、相互に排他的なカテゴリまたはグループです。
論理的順序がある場合とそうでない場合とがあります。

カテゴリ変数の例：

* テキスト
    * 支払方法（現金またはクレジットカード）
    * 機械設定（低、中、高）
    * 製品タイプ（木製、プラスティック製、金属製）
* 数値
    * 性別（1=男性、2=女性）
    * 調査結果（1=そう思う、2=どちらでもない、3=そう思わない）
* 日付
    * 曜日（月、火、水）
    * 月（1月、2月、3月）

## なぜ加工が必要か

カテゴリ変数は、多くの機械学習のモデルでそのままインプットできず、モデルごとに適した形へ加工する必要があります。

## 加工前の注意点

### テストデータにのみ存在するカテゴリ

テストデータにのみ存在するカテゴリが存在する場合、
そのレコードについて変換中にエラーが発生したり、予測値がおかしくなってしまう可能性があります。
このようなカテゴリがある場合以下の対応が考えられます。

* そのままにする（該当レコードが少なく、予測スコアにほとんど影響を与えない場合）
* 最頻値や予測値によって補完する
* 変換における平均といえる値にする

### 順序変数

順序変数は、値の順序に意味があり、値の間隔に意味がない変数です。
例えば順位（1位、2位、3位）や評価（A、B、C）などです。
決定木系のモデルは変数の順序にしか依存しないので、そのまま整数に変換して扱えば良い。
数値変数として扱うか、順序の情報を無視してカテゴリ変数として扱うか、モデルによって判断が必要です。

### カテゴリ変数の値の意味

カテゴリ変数の値に意味を持っている場合、単にencodingしてしまうとその情報が消えてしまいます。
例えば以下の場合注意が必要です。

* ABC-00123やDEF-00456の場合、前3文字と後5文字に分割する
* 1,2,3,Aのように数字・英字が混じっている場合、数字か否かを特徴量とする
* AB,CDE,FGHIのように文字数が違う場合、文字数を特徴量とするなど

## カテゴリ変数の加工方法

* one-hot encoding
* label encoding
* feature hashing
* frequency encoding
* targe encoding
* embedding
M5Stackとロードセルでスケール（はかり）を作る


# スケール（はかり）を作る
M5Stack を使ってはかりをつくるために試行錯誤したので記録しておきます。
今回は5kgまで測定できるはかりを作りました。

# 材料
* M5Stack Basic
* Groveケーブル
* ジャンパワイヤ4本
* <a href='https://amzn.to/3Aw1CrK'>デジタルロードセル</a>　下の写真のように組み立て済みのタイプなので使いやすいです。5kgまで測れます。
 ![unnamed (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308578/c8649a5f-9379-170b-582d-97561934b946.jpeg)

# つなぎ方
![PXL_20210706_122539744.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308578/edbae519-e730-e87f-37d0-b4caf632a694.jpeg)

写真のようにつなぎます。

ロードセルに繋がっている基板（HX711）に、セット品であるワイヤー（両端メス）を接続した後、Groveケーブルに接続します。
私は今回、間にジャンパワイヤ（両端オス）を挟んで接続しました。
<b>
HX711　VCC　-（紫）-（赤）-　M5Stack 5V
HX711　SCK　-（灰）-（白）-　M5Stack 22ピン（SCL）
HX711　DT 　-（白）-（黄）-　M5Stack 21ピン（SDA）
HX711　GND　-（黒）-（黒）-　M5Stack GND
</b>

![PXL_20210706_122420841.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308578/9ceb0214-98e8-56c0-95ef-9e80fd729154.jpeg)
![PXL_20210706_122533887.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308578/e3efd267-86ba-a6ce-d20d-428a008101a4.jpeg)

# プログラム
利用するライブラリは<a href="https://github.com/bogde/HX711">こちら</a>（https://github.com/bogde/HX711）
ソースコードは以下のように書きました。

```c:
#include <M5Stack.h>  // M5Stackを使用
#include <HX711.h>

// HX711 circuit wiring
const int LOADCELL_DOUT_PIN = 21;
const int LOADCELL_SCK_PIN = 22;

void setup() {
  M5.begin();
  M5.Lcd.setTextSize(2);      // 文字サイズを2にする
  M5.Lcd.fillScreen(BLACK);   // 背景を黒にする

  Serial.begin(115200);
  Serial.println("Initializing the scale");
  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN);
  
//  scale.set_scale(LOADCELL_DIVIDER);
//  scale.set_offset(LOADCELL_OFFSET);
  
　// ☆それぞれの環境で適切な値を設定する☆
  scale.set_scale(475.f); 
  // 現在を0gにセット
  scale.tare();               // reset the scale to 0
}

void loop() {

  if (M5.BtnA.wasPressed()) {
    Serial.println("M5.BtnA.wasPressed()");
    // ☆それぞれの環境で適切な値を設定する☆
    scale.set_scale(475.f);
    // 現在を0gにセット
    scale.tare();
  }
  M5.update();
  int weight = scale.get_units(5);
  M5.Lcd.setCursor(40,30,4);
  M5.Lcd.printf("%1d g          ", weight);
  M5.Lcd.fillRect(0, 80, 320, 80, TFT_BLACK);
  M5.Lcd.fillRect(0, 80, weight*0.16, 80, TFT_BLUE);
  Serial.print("average:\t");
  Serial.println(weight, 1);
}
```

最初にやることは、
scale.set_scale(475.f);　
　…　「☆それぞれの環境で適切な値を設定する」という部分。後述します。
scale.tare();　
　…　現在を0グラムとしてリセット
の2行だけ。

あとは測定時に、
int weight = scale.get_units(5);
で値がとれます。
引数の5というのは5回計測した平均値を出力するということだそうです。

HX711について色々情報があって混乱したのですが、
scale.set_offset()　
などは使わなくて大丈夫でした。

# set_scaleに設定する値
プログラム中の☆の部分、set_scaleには引数にそれぞれの環境に合った値を引数にセットしなくてはなりません。
この値を何にすればよいか調べる方法なのですが、適当な値を入れて試してみて、実際にあるたとえば65グラムの物が正しく65グラムと測定される値になるように値を変更して測定して～を繰り返して割り出しました。

# 大変だったところ
結構簡単かなと思いきや時間がかかってしまいました。

じつは最初M5StickCでやっていたのですがどうしても調整しても測定値が定まらず、途中うまくできた！と思った瞬間はあったのですがそのあともおかしくなり最終的には何も載せていない0gのときも値が変動し始めたのでこれはおかしいと思ってM5Stack Basicに変更してやっと安定しました。

https://twitter.com/siroitori0413/status/1411329315644444673?s=20
SSL/TLSの仕組み。

##初めに
今回はSSL/TLSの仕組みについてアウトプットを兼ねて解説します！

##SSL/TLSとは
SSL（Secure Sockets Layer）/TLS（Transport Layer Security)の略です。
ブラウザとサーバー間のデータのやり取りを暗号化することで、第三者によるデータの盗聴や改竄を防止します。

###SSLとTLSの違い
大枠の仕組みは同じです。SSLがバージョンアップを重ねて3.0になった際に、TLS1.0と呼ばれるようになりました。SSLの名称は広く普及しているため、TLSを指しても現在ではSSL/TLSと呼ばれています。


##SSL/TLSの仕組み
###前提知識
####共通鍵暗号方式
共通鍵暗号方式とは、送信者と受信者の間で行われるデータの暗号化と復号を同じ鍵で行う暗号方式です。
通信をする際には、送信者は受信者ごとに共通鍵を渡す必要があります。
そのため共通鍵を第三者に漏洩させないことが重要です。共通鍵暗号方式は公開鍵暗号方式と比較すると処理が速いという特徴があります。
現在主流の暗号化方式はAESです。

####公開鍵暗号方式
公開鍵暗号方式とは、送信者と受信者の間で行われるデータの暗号化と複合を異なる鍵で行う暗号方式です。
具体的にはデータを暗号化する公開鍵、復号するための秘密鍵を作成します。
データの送信者は受信者の公開鍵を使用してデータを暗号化して送信、受信者は受け取ったデータを自らの秘密鍵で復号します。
そのため公開鍵はあらかじめ通信相手に送信する必要がありますが、公開鍵は暗号化するための鍵なので、例え漏洩したとしてもデータの復号はできません。

###SSL/TLSの仕組み
#####事前準備
1 送信者(ブラウザ)は暗号化するための公開鍵、復号するための秘密鍵を作成します。
2 受信者(サーバー)は送信者に公開鍵を送信し、送信者(ブラウザ)はその鍵で共通鍵を暗号化して受信者(サーバー)に渡します。
3 受信者(サーバー)は渡された共通鍵を秘密鍵を用いて復号します。
この過程を踏むことで、サーバーとブラウザは共通鍵を所持します。
![kagoya1611-3_2_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025549/af83ce2a-d072-28e5-28c5-ad283ab303f4.jpeg)

画像引用 
https://www.kagoya.jp/howto/rentalserver/ssl/

#####本番
上記の過程を踏むことで、ブラウザとサーバーは共通鍵を所持します。
両者はデータを共通鍵で暗号化、復号することでデータの盗聴、改竄を防止します。

![kagoya1611-3_2_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1025549/4278d7eb-c23d-3d90-740e-3af2ca473a46.jpeg)


画像引用 
https://www.kagoya.jp/howto/rentalserver/ssl/

##SSLサーバ証明書
上記のSSL/TLSの仕組みで、事前準備として以下のステップを行うと解説しました。
>「2 受信者(サーバー)は送信者に公開鍵を送信し、送信者(ブラウザ)はその鍵で共通鍵を暗号化して受信者(サーバー)に渡します。」

しかし実際はサーバーから送信されるものは公開鍵だけではなく、SSLサーバ証明書が送信されています。
SSLサーバ証明書とは、ウェブサイトの「運営者の実在性を確認」し、ブラウザとウェブサーバ間で「通信データの暗号化」を行うための電子証明書で、GMOグローバルサインなどの認証局から発行されます。 SSLサーバ証明書には、ウェブサイトの所有者の情報や、暗号化通信に必要な鍵、発行者の署名データが含まれています。

##終わりに
SSL/TLSの知識はwebアプリケーションをデプロイ・運営するにあたって、必須となる知識です。
理解するとそこまで難しいものではありませんので、私と同じ初心者エンジニアの方は良ければ参考にしてください！
【講義08.sql基礎_後半】テーブル設計のアンチパターンまとめ


#本記事について
今後のデータベース設計時の参考になればと思い、テーブル設計について、講義内容や職場での体験をまとめたもの。

##テーブル設計する上で大切なこと
 データが取り出しやすいか？
 更新がしやすいか？
 将来変更を強いられた場合、柔軟な対応が可能か？

##1つのテーブルにコードと名称が入っている
　名称とコードを分けた方が良い。
　都道府県、市区郡町村、住所1、住所2、建物名というように、住所を過剰に分割している。

| ID | 都道府県コード | 都道府県名 | 市区郡町村コード | 市区郡町村名 | 住所1 | 住所2 | 建物名 |
|:-|:-|:-|:-|:-|:-|:-|:-|
| 1 | 13 | 東京都 | 103 | 港区 | 西麻布1丁目 | 1番1号 | XXビル |

##同じ意味、同じ値のカラム
　作成日時と登録日時は同じ値が入る。どちらか1つで良い。

| ID | 作成日時 | 登録日時 | 更新日時 |
|:-|:-|:-|:-|
| 2 | 2021-07-05 01:58:04| 2021-07-05 01:58:04 | 2021-07-06 02:30:01 |

##一つに統一できるカラムが存在する
　削除日時に日付が入っていれば、いつ削除したかどうか判別できる。つまり、削除区分は不要。

| ID | 削除日時 | 削除区分 |
|:-|:-|:-|
| 2 | 2021-07-01 03:20:10 | 削除済 | 


##カラム名、値が無駄に分かれている
　登録年月日1つあれば、登録年、月、日は取得できる。なぜ分けたのか謎。

| ID | 登録年 | 登録月 | 登録日 | 登録年月日 |
|:-|:-|:-|:-|:-|
| 10 | 2021 | 07 | 01 | 2021-07-01 03:20:10 |

##同じ意味かつ、今後追加される可能性のあるカラムが複数存在
　コメントが横持ちになっている。
　コメントが増える都度、テーブル変更が発生する上、sqlも複雑になる。

| ID | 名前 | 予定１ | 予定２ | 予定３ | 予定４ |
|:-|:-|:-|:-|:-|:-|
| 20 | 田中一郎 | 今日は宿題をする | 明日は買い物に行く | 明後日は学校に行く | 明明後日はデートする |　

##備考になんでも詰め込む
備考やその他のように、入力ルールが不明確なカラム。
後で分けようと思ってもデータを取り出すことができない。
電話番号を自宅番号と携帯番号に分ければ良い。
都合の良い時間は、配達希望時間などのカラム名が望ましい。

| ID | 名前 | 郵便番号 | 住所 | 電話番号 | 備考 |
|:-|:-|:-|:-|:-|:-|
| 33 | 鈴木二郎 | 1231234 | 東京都葛飾区柴又 | 09012345678 | 携帯番号は080XXXXXXXX、配達に都合の良い時間は午前中 |

以上。
正規表現にマッチした文字列すべてを取得したい

必要になるたびググって、そのたびに忘れている気がするので、自分用にメモしておきたいと思います。

正規表現にマッチした文字列すべてを取得したい場合、Java8以前であれば以下のようなイディオムとなります。

```java
String s = "111 AAA 222 BBB 333";
Pattern p = Pattern.compile("[0-9]{3}");
Matcher m = p.matcher(s);

List<String> results = new ArrayList<>();
while (m.find()) {
    results.add(m.group());
}
System.out.println(results); //=> [111, 222, 333]
```

Java9以降であればStreamを使って、シンプルに書くこともできます。

```java
String s = "111 AAA 222 BBB 333";
Pattern p = Pattern.compile("[0-9]{3}");
Matcher m = p.matcher(s);

List<String> results = m.results().map(MatchResult::group).toList();
System.out.println(results);  //=> [111, 222, 333]
```
GridSearchCV メモ

[sklearn.model_selection.GridSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html)をもとに作成しました.

メモみたいな感じです.


### Parameters

#### 1. estimator : estimator object
ここにはモデルが入ります.
ex.) 

```python 
  lgb.LGBMClassifier(silent=False) や,
  keras.layers.Sequential()
     .add(Dense((units=64, activation='relu', input_dim=100))))
     .add(Dense(units=10, activation='softmax'))
 など,いわゆるモデルです.
```

#### 2. param_grid : dict or list of dictionaries
ここでは,GridSearchで探すハイパーパラメータの辞書です.
つまり,この辞書はモデルに依存します.
ex.) LGBMにおいて


```python
grid_param = {
    'objective': ['multiclass'],
    'class_weight':['balanced'],
    'learning_rate':[0.2,0.5],
    "num_leaves":[31,33],
    'metric': ['multi_logloss'],
    "n_estimators": [100],
    "reg_alpha":[0.1,0.3],
    "reg_lambda":[0.1,0.3],
    'verbosity':[ -1]
}
```

など


#### 3. scoring: str, callable, list, tuple or dict, default=None

このメトリックはスコアの査定のために使用される指標(メトリック)です.
そのため,モデルに依存させず,GridSearchCVが提供しているmetricを使用する必要があります.
つまり,この中([Metrics and scoring: quantifying the quality of prediction](https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter))から選ぶ必要があります.

#### 4. n_job: int, default=None
これは並列に動かす数です.つまり,考えるハイパーパラメータを並列に処理し
実行時間を抑えてくれます(-1にするとコア数になります).


#### 5. refit:bool, str, or callable, default=True

最良だと考えられるモデルを"best_estimator_"で簡単にとってこれるようにします.
(実際の学習に便利)

#### 6. cv: int, cross-validation generator or an iterable, default=None

これでデータを何分割してk-Fold CVをするか決定します.

#### 7. verbose: int

GridSearchCVを使用した際の出力(output)に関する設定を行います.
 x>1 で,一つのパラメータの一つのk-foldにかかった時間を表示し,
 x>2 で,そのスコアを表示し,
 x>3 で,今までかかった時間も表示します.

(これだけdefaul値が書いてないですが,おそらく4くらいがデフォルトだと思います.)

#### 8. pre_dispatch: int, or str, default=n_jobs

並列実行時にディスパッチされるジョブの数を制御します.
これをすることで,メモリ消費量が爆発的に増加するのを防ぐことができます.

(None にすると早くすみます.)

#### 9. error_score: ‘raise’ or numeric, default=np.nan

エラーが起きた際に割り当てるスコアを決定できます.

#### 10. return_train_score: bool, default=False
Falseの場合, cv_results_ 属性にトレーニングスコアが含まれません.
トレーニングスコアを計算することで，さまざまなパラメータ設定が
オーバーフィッティング／アンダーフィッティングのトレードオフに
どのような影響を与えるかを知ることができますが,
トレーニングセットのスコアを計算するのは計算量が多く,
最良の汎化性能をもたらすパラメータを選択するためには,厳密には必要ありません．
残プロ　第-35回　~pythonでキャリッジリターン~

# キャリッジリターン

pythonではエスケープシーケンスの中にキャリッジリターンが含まれます．

~~~ python:
print("hi!\r")
print("bye!")
~~~

文字列の先頭にカーソルを移動させるため，出力文字列の上書きができます．