OmniAICreator/Qiita-1.07M huggingface dataset:
Docker-composeを使って、ローカルにJava+Mysql開発環境を作成した話

#筆者はこんな人
・10年間Javaのエンジニア（途中から独自FW触っていたせいかJavaを忘れた人）
・docker触って、1ヶ月位

#手順
こちらの方の手順を参考にさせていただきました
[【IntelliJ＋Docker】Spring Boot＋Java15＋MySQL環境構築]
(https://www.netbusiness123.com/docker-spring-boot-environment/)

#詰まった所

・その1
 Spring InitializrにJava15がなったので、16を選択
 その際にspring bootは「2.5.0 (SNAPSHOT)」を選択

 理由
  デフォルトの2.4.5は、Gradle 6.8であるため、Java16をサポートしていない
  ※dockerをbuildする時に、エラーで起動しない

 参考
  [@Gradle 7.0にアップデートしてJava16でビルドする]
  (https://yusuke.blog/2021/03/04/2942)

・その2
 JavaのDockerFileは、15ではなく16に修正

・その3
 IntelliJ IDEAの「Project SDK」と「Module SDK」を「openjdk-16」に修正
 ※「+（追加ボタン）」→「DownLoad SDK」から

 理由
  build Projectを行うと、「java:16は無効なソース・リリースです」でビルドが通らない

 参考
  [IntelliJでJava8入れた後に11入れたら｢Error:java: 11は無効なソース・リリースです｣と出て私はこう解消した]
  (https://colloidgel.hatenablog.com/entry/2019/01/14/233009)

#最後に
苦戦しましたが、なんとか動かすことに成功

次は、上記開発環境をベースとして、本番に自動デプロイできる仕組み作ろうかと
AI Platform Pipelines をデプロイする GKE は Container-Optimized OS with Docker でなければならない

## TL;DR

* AI Platform Pipelines をデプロイする GKE のノードプールのイメージタイプは `Container-Optimized OS with Docker` でなければならない。
* GKE 1.19 からデフォルトが `Container-Optimized OS with Containerd (cos_containerd)` に変わっており、それを選択しているとタスクが必ず失敗する。
* GKE の Web コンソールからノードプールを作り直すことで対処可能。

## K8s クラスタを手動作成した

[AI Platform Pipelines](https://cloud.google.com/ai-platform/pipelines/docs)（以後 Pipelines）のインスタンスを作るとき、デプロイ先となる k8s クラスタを自動的に作ってもらうことができます。

最近 Pipelines をデプロイする機会があり、自動的に作ってもらおうと思ったのですが、内部の仕様が変わったのか

> Basic authentication was removed for GKE cluster versions >= 1.19.

というエラーメッセージを出力して失敗しました。

これはこれで問題なのですが、自分ではどうすることもできないので仕方がなく [AI Platform Pipelines 用の Google Kubernetes Engine クラスタを構成する](https://cloud.google.com/ai-platform/pipelines/docs/configure-gke-cluster?hl=ja)を参照しながら GKE クラスタを手動で作ることに。設定は基本的にデフォルトのまま、唯一ドキュメントで指定されている下記の点だけを変更しました:

* 2 CPU 4 GB memory ノードが 3 つ以上必要
* アクセススコープは "Allow full access to all Cloud APIs"

## タスクを実行しても必ず失敗する

そうして起動した Pipelines に意気揚々とアクセスし、パイプラインをアップロードして Run を作ってみると、全て同様のエラーメッセージでタスクが失敗。

> This step is in Error state with this message: failed to save outputs: Error response from daemon: No such container: xxxxxxxx.

ログを見るとタスクの中身自体は適切に実行され成功している様子が伺えます。最初から存在するチュートリアル的パイプラインも同じように失敗することから、パイプライン側の問題ではないだろうことは明らかでした。

## イメージタイプが異なっていた

手元に以前 Pipelines が自動的に作成し、正しく動いている GKE クラスタが存在していたので、設定を比較してみることにしました。じっと眺めてみると、今回作ったクラスタはデフォルトノードプールのイメージタイプが `Container-Optimized OS with Containerd (cos_containerd)` な一方、動いているクラスタは `Container-Optimized OS with Docker` になっていることに気が付きました。どうやら GKE 1.19 からイメージタイプのデフォルト値が変わったようです。

## ノードプールを作り直したら直った

というわけで試しにイメージタイプが `Container-Optimized OS with Docker` になっているノードプールを新しく作って入れ替えたところ、正しく動くようになりました。
【AWS】データベースを構成する際のアーキテクチャ

#プログラミング勉強日記
2021年5月19日
　EC2インスタンスにプライベートサブネットに設定して、それをMySQLサーバーにするアーキテクチャを紹介する。
　まず、プライベートサブネット内にLinuxを選択したEC2インスタンスを起動して、このEC2インスタンスにMySQLをインストールしてMySQLのDBサーバーにする。この構成としては、WebサーバーからDBサーバーとなるEC2インスタンスにアクセスをする。これらの構成をするためにはアクセス時にはWebサーバーからダイレクトにアクセスするが、返信トラフィックを受け取るためにはNATゲートウェイが必要になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/c66feba8-e2b1-1844-bed9-41e3278b844f.png)

#アーキテクチャのパターン
　データベースを設定する基本的なパターンは3つある。

##WebサーバーもMySQLサーバーも1つのEC2インスタンスに入れる
　EC2インスタンスを作りすぎないため、コストを抑えられる。シンプルなWebサイトを作る際に向いている。(大きなサイトには向いてない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/597b0424-b375-9496-46bf-3ed517aab7bd.png)


##データベースレイヤーとWebサーバーのWebレイヤーを分ける
　基本的な主流なパターン。これには、EC2インスタンスにMySQLサーバーを設定するパターンとMySQLなどのデータベースを動かすことができるRDSを使う2つのパターンがある。
　こちらは2つのレイヤーに分かれているので、セキュリティを高めることや冗長化の構成をやりやすくすることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/e2512759-7814-dc02-d72e-c7c57c101c8a.png)
(↑パブリックサブネットにWebサーバーを設置してプライベートサブネットにEC2のMySQLサーバーを設置してレイヤーを分ける)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/aeadf4df-1c83-a424-31da-7b5865ec51c3.png)
(↑パブリックサブネットにWebサーバーを設置してプライベートサブネットにRDSのMySQLサーバーを設置してレイヤーを分ける)

　このEC2インスタンスにMySQLサーバーを設定する場合とRDSにMySQLサーバーを設定する場合の違いとしては、アンマネージド型とマネージド型というのが大きな違い。RDSはマネージド型サービスなので、スケーリングやバックアップなどの管理をAWS側で行ってくれる。MySQLサーバーをEC2インスタンス内に立ち上げると、ソフトウェアのメンテナンスはユーザ側が行う。
web proxyを構築したら凄い勢いで草が生えた話

#経緯
iframeなどで他サイトのページを画面に組み込む時にweb proxyがあると便利な事はよくあると思う(httpとhttpsが混在する時など)。
phpで受け取ったurlをcURLで取りに行ってbaseタグを書き加えるようなweb proxyを作り1ヶ月ほど放置していたら、徐々に動作が重くなり遂に動かなくなった。
メモリ不足かストレージが埋まったかと思ったが違った。
#原因
server-statusでも見るかと思って表示した状態がこちら。
![www.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563735/d7f0f5f0-a25c-e270-7dc3-bd362a8cd4a2.jpeg)
**埋まってるWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW**

公開proxyとして捕捉され、free proxyサイトに掲載されていました。
#対策
もともと公開proxyにならないようにhashキーを持ったアクセス以外は制限する機能はあったが、デバグのためにoffにしていた。
制限をonにしたら直りました。

めでたしめでたし😇
複数のdocker-composeで立ち上げたコンテナ間の通信


開発環境でタイトルの様なことを実現したい。

結論から言うと、通信したいコンテナを同じネットワークに配置すると通信が可能になる。


以下の様なRailsAPI、app1とapp2の通信を考える。

app1のdocker-compose

```yml:docker-compose.yml
version: '3'
services:
  app1:
    container_name: "app1"
    build: .
    volumes:
      - ./:/usr/src/app
    command: sh -c "rm -f tmp/pids/server.pid && yarn install --check-files && bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - "3001:3000"
    stdin_open: true
    tty: true
```
app2のdocker-compose

```yml:docker-compose.yml
version: '3'
services:
  app2:
    container_name: "app2"
    build: .
    volumes:
      - ./:/usr/src/app
    command: sh -c "rm -f tmp/pids/server.pid && yarn install --check-files && bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - "3002:3000"
    stdin_open: true
    tty: true
```


・app1 port 3001:3000 
・app2 port 3002:3000 

この設定のままだと、
app1から、

```
http.request(localhost:3002)
```
の様にしてAPIにアクセスしようとしても、
コンテナapp1では
localhost:3002　＝　app1の3002ポート　と解釈されてしまうため当然app2にはアクセスできない。

じゃあどうすればいいのか。。。

### 解決法

**app1とapp2を同じネットワークに配置する。**
現在がこうだとすると。

|container| network|
|:---:|:---:|
|app1|app1_default|
|app2|app2_default|


こうする。

|container| network|
|:---:|:---:|
|app1|app1_default|
|app2|app1_default|


app2のdocker-compose.ymlに以下を追記

```yml
   networks:
      - app1_default
      - app2_default #注1)
　networks:
  　app1_default:
      　external: true
```

注1)実際のdocker-composeには複数のserviceが定義されてると思うので、それらとの接続に必要

この状態で
app1から

```
http.request(host.docker.internal:3002)
```
の様にすると、app2にアクセスできる。

### 参考

[Qiita](https://qiita.com/blueskyarea/items/fc327ba5e6c5f4d75b12)
bash から API を操作するときのメモ

メモです！！！

変数を保管するファイルを用意すると便利。

```accessToken.txt
accessToken=iwe09qu0gq020f20q[jpjp2
```

リクエスト時のBodyも用意する。

```body.json
{
  "key1":"value1",
  "key2":"value2",
  "key3":"value3"
}
```

リクエストを送信するファイル
例では、YoutubeLiveBroadcast API にリクエストを送っている。

```request.sh
. ./variables.txt

curl \
. ./accessToken.txt

curl --request POST \
  'https://youtube.googleapis.com/youtube/v3/liveBroadcasts?part=snippet&part=id&part=contentDetails&part=status' \
  --header "Authorization: Bearer ${accessToken}" \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data-binary "@C:\Users\****\apiRequestBody.json" \
  --compressed
```
画像をTapするとアクションを起こす機能を作ってみた

画像をタップするとアクションを起こす基本的な実装方法をアウトプットしようと思います。

#環境
・Mac Book Pro(macOS:BigSur)
・Xcode(ver:12.5)

#実装例
![Unknown-4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864623/39ea1d00-93a8-a88a-a3af-ba59fd689c8b.gif)

#コード例
```ruby:ViewController.swift
class ViewController: UIViewController {
    
    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }


    @IBAction func tapAction(_ sender: Any) {
        let generator = UINotificationFeedbackGenerator()
        generator.notificationOccurred(.success)
        
        imageView.image = UIImage(systemName: "person.3")
    }
    
}
```

#注意点
TapGestureをIBActionで繋ぐだけでは、動作しなくて、
画像の設定の「Interaction」の「User interaction Enabled」にチェックを入れる必要があります。
東京都が公開しているAPIで毎日コロナ感染者数を取得するコード①

東京都がこんな感じでいけてるAPIを公開しているので、勉強がてらに毎日の感染数を取得するアプリを作成してみた

https://portal.data.metro.tokyo.lg.jp/opendata-api/

##コードはわずか18行程度

```python:tokyo_corona.py
import requests
import datetime
import pandas as pd

today = datetime.datetime.now().strftime('%Y-%m-%d')
payload = {'from': today, 'till': today, 'limit': 1000}

res = requests.get(
    "https://api.data.metro.tokyo.lg.jp/v1/Covid19Patient", params=payload)
data = res.json()

infect_data = data[0]
endCursor = data[1]

df = pd.DataFrame(infect_data)
total = df.shape[0]

print(f'本日の東京のコロナ感染数は{total}人です。')
```

```:出力結果(2021年5月19日現在)
本日の東京のコロナ感染数は766人です。
```

ただこれだとlimitの設定が1000人以上だと人数の取得ができない。
東京都のAPIのページには以下の通り書かれているので、
endCursorをパラメータに指定しないといけないらしい


>マッチレコード数がlimitを超える場合、前のレスポンスにおける"endCursor"の値を指定することで、>それ以降のデータを出力 (URLエンコードが必要)

こちらについては確かにレスポンスデータを見るとリスト形式で以下のフッターが存在するため、
そのendCursorの値をパラメータとして渡してやらなければいけないようだ。

>{'moreResults': 'MORE_RESULTS_AFTER_LIMIT',
 'endCursor': 'Cn4KHQoQ5YWs6KGoX+W5tOaciOaXpRIJCICA6saWp/ACEllqGmJ+dG9reW8tY2F0YWxvZy1wcm9kdWN0aW9ucjsLEghSZXZpc2lvbiISQ292aWQxOVBhdGllbnQ6NDIwDAsSDkNvdmlkMTlQYXRpZW50GICAgPS29ucLDBgAIAE=',
 'revision': 420,
 'updated': '2021-05-19T10:17:50.674Z'}

また1000件超えてレスポンスが存在しない場合は、次の通りのNO_MORE_RESULTSというmoreResultsの値となるためこちらをキーに判定させてやることができそうである。

> {'moreResults': 'NO_MORE_RESULTS',
  'endCursor': 'Cn4KHQoQ5YWs6KGoX+W5tOaciOaXpRIJCICA6saWp/ACEllqGmJ+dG9reW8tY2F0YWxvZy1wcm9kdWN0aW9ucjsLEghSZXZpc2lvbiISQ292aWQxOVBhdGllbnQ6NDIwDAsSDkNvdmlkMTlQYXRpZW50GICAgPS29v8LDBgAIAE=',
  'revision': 420,
  'updated': '2021-05-19T10:17:50.674Z'}]

よって上記を反映すれば1000件を超えた後も値を取得できそうであるが、
そのコードについてはまた別の日に対応しようと思う。
git fetchとは

**git fetchが何を意味するかについて調べたので備忘録**
環境：
git pullに似ているコマンドで、どちらもリモートリポジトリの内容をローカルリポジトリに引っ張ってくるコマンド。
git fetchとgit pullの違いは、
pullはリモートリポジトリの内容をマージするのに対し、fetchはマージされず確認だけする。
（実際にはfetchでも名前のないブランチとして取り込まれているらしく、FETCH_HEADという名前に対し、checkOutできる）
[備忘]AWSのIAM ロールとGCP のサービスアカウントを紐付ける時はIAMロール名に注意したい

ガッキーは掟上今日子のガッキーが一番好きな人です。

---

タイトルと見出し全く関係ありません。

さて、
ちょっとAWS LambdaからGoogle Cloud側のリソースにアクセスする必要があって、
最初、Google Cloudのサービスアカウントのキー情報を組み込んで作ったんですが、
リーダーから、**Workload Identity 連携**という機能があるという話を聞き、
こっちの方がキーファイル持たないので、セキュアだなあーってことで、対応していました。

やり方とかはこの辺参照のこと。
まあ、AWSのAssumeRole的なものですね（超絶大雑把）

- [Access GCP from AWS using Workload Identity Federation](https://blog.scalesec.com/access-gcp-from-aws-using-workload-identity-federation-829113ef0b69)
- [AWS の IAM ロールと GCP のサービスアカウントを紐付けて鍵なしでアクセスする方法](https://blog.yuu26.com/gcp-identity-federation/)

Lambda関数を直して、
Google Cloud側で
Workload Identity プールとプロバイダーを作成し、
それにサービスアカウントを紐づけて、認証情報ファイルを落として、いざ実行！
エラー・・・。

**「The size of mapped attribute google.subject exceeds the 127 bytes limit. Either modify your attribute mapping or the incoming assertion to produce a mapped attribute that is less than 127 bytes.」**

なんやなん？
しかも、**google-auth-library**で落ちている・・・。
どういうことや・・・。
別環境で試してみて、上手く行ってますます謎が深まり、色々と見比べてみた結果、
**IAMロール名が長いとエラーになる。**
ということが判明。
わかった時はまじかーって思いました。

---

ただ、冷静になって考えてみると、
これって、AWSのAssumeRoleするときも同じなんかなーと、
ちょっと調べたところ、Switch Roleするときにはロール名の制限あるんで、これと同じようなものかなと思った次第。

 ```
ロールをプログラムで作成する場合、RoleName に加えて、最大 512 文字の Path を追加できます。ロール名の長さは最大 64 文字です。ただし、AWS マネジメントコンソール の [Switch Role] 機能でロールを使用するには、Path と RoleName の合計が 64 文字を超えることはできません。
```

[ロールを切り替えるユーザーアクセス許可の付与](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html)

---

忘れてまたハマる嫌なので、備忘兼ねて書きました。
まだまだ勉強になることが多いです。
さてさて、Google Cloud側のリソース、Lambdaでアクセスするぞい（この話はスタートでしかない・・・orz）
正規表現を勉強しよう！

#はじめに
webサービスやスマホアプリを開発されている方ならログインやユーザーの新規登録でからなず必要となる正規表現について勉強したのでアウトプットとして記事にしたいと思います。

#正規表現とは
？？「文字列の集合を一つの文字列で表現する方法。」
me「は？」

勉強を始めて最初の感想でした。
どういうことかというと
パスワードが以下の条件だとします。
>大文字含む英数字８文字以上２０文字以下

この条件を一つの文字列で表現したものになります。

#必ず覚えたい正規表現
 文字|意味
-|-
\d           | 半角数字１文字
[ab]         | a~z までのアルファベット
{n, m}       | 直前の文字が n 文字以上 m 文字以下
{n}          | 直前の文字が n 文字
?            | 直前の文字が ０ or 1 個
.            | 任意の文字１文字
+            | 直前の文字が１文字以上
*            | 直前の文字が０文字以上
[^AB]        | A, B ではない任意の１文字

#メタ文字
メタ文字とは特殊な意味を持つ文字のことです。
どんなものがあるかみてみましょう

メタ文字|説明
--------------|-----
\|多目的に使う一般的なエスケープ文字
^|検索対象の始まりを言明
$|検索対象の終わりあるいは終端の改行文字の前
.|改行を除く全ての文字にマッチ
[|文字クラスの定義の開始
]|文字クラスの定義の終了
｜|選択枝の開始
(|サブパターンの開始
)|サブパターンの終了
?|0 or 1 回マッチ
*|0 回以上の繰り返し
+|1 回以上の繰り返し
{|最小 / 最大を指定する量指定子の開始
}|最小 / 最大を指定する量指定子の終了

※メタ文字をただの文字として扱いたい場合はエスケープ文字( `\` )を前につける必要があります。

#文字クラス
文字クラスとは`[]`で囲まれたものです。
汎用的な文字クラスは以下になります。

文字            |意味
---------------|------
\w             |[a-zA-Z0-9]と同じ
\W             |[^a-zA-Z0-9]と同じ※
\s             |任意のから文字
\S             |空白以外の文字
\d             |[0-9]と同じ
\D             |[^0-9]と同じ※

※文字クラスの中では`^`は否定の意味になります。
メタ文字の意味とは異なるので注意してください。

#練習
###郵便番号
定義は3文字の数字-４文字の数字とする

```
/^[\d]{3}-[\d]{4}$/
```
`^`は文字列の先頭を表します。
`[\d]`は０〜９の数字を表し、`{3}`は直前の文字（ここでは数字）が３回繰り返されることを意味します。
`&`は文字列の先頭を意味します。

###メールアドレス

```
/^[\w\-\._]+@[\w\-\._]+\.[A-Za-z]+$/
```

`\w`は[a-zA-Z0-9]と同じ意味で半角大小英数字を意味します。
`\-\.`は`-`と`.`が特殊文字なので`\`でただの文字として扱えるようにします。
`+`は直前の文字が１文字以上という意味です。

###パスワード
今回のパスワードの構成としては大小英数字を必ず１文字以上は含む８〜１００文字にします。

```
/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)[\w]{8,100}$/
```
これを理解するには`前方参照`と`最短マッチ`について知っていなければなりません。
前方参照は`(?=)`の部分に当たります。
例として
AA(?=BB)
というパターンで検索します。
前方参照によりマッチする条件の文字列は
AAが前方にあるBBという文字になります。

```
AABB
AACBB
AAABB
```
という３つの文字列があったとして上のパターンにマッチするのは

```
AABB
AAABB
```
になります。

また最短マッチは`.*?`の部分になります。
正規表現は普通に行うと最長マッチというものになります。

```
<tr><td>boom</td></tr>
```
という文字列があったとしてhtmlタグだけ取得したいとします。

```
/<.*>/
```
というパターンで確認すると

```
<tr><td>boom</td></tr>
```
が結果として返ってきてしまいます。
これは最長マッチの特性で一度目の`>`で区切られず一番最後まで検索してしまっているのが問題です。


一度目の`>`で区切るには

```
/<.*?>/
```
と`?`を加えてあげるだけでいけます。
これで検索すると

```
<tr>
```
が返ってきます。

ここからが本題です。

```
/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)[\w]{8,100}$/
```
は前方参照が文字列のはじまりを意味する`^`なのでa〜z、A〜Z、０〜９のいずれかから始まり大小英数字をそれぞれ１文字以上含む８〜１００文字以内の文字列とすることができます。
RHEL 8にPython 3.9をインストール（AppStream）

# はじめに

Application Stream(AppStream)を利用してRHEL8にPython 3.9をインストール
参考：[RHEL8のパッケージ構成 - BaseOSとApplication Stream - 赤帽エンジニアブログ]( https://rheb.hatenablog.com/entry/rhel8_baseos_and_appstream)
　　　[第4章 新機能 Red Hat Enterprise Linux 8 \| Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/8.3_release_notes/new-features#enhancement_dynamic-programming-languages-web-and-database-servers)

## サポート

本手法で導入した場合、[Red Hat Enterprise Linux 8 Application Streams Life Cycle - Red Hat Customer Portal](https://access.redhat.com/node/4079021)より、2024-05がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### インストール

```shell-session
# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.4 (Ootpa)

# yum install python39
... 略
```

### 各種確認

```shell-session
# which python
/usr/bin/which: no python in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin)

# which python3
/usr/bin/python3

# python3 -V
Python 3.9.2

# yum info python39
Updating Subscription Management repositories.
Unable to read consumer identity
Subscription Manager is operating in container mode.
Last metadata expiration check: 0:05:45 ago on Wed May 19 11:30:09 2021.
Installed Packages
Name         : python39
Version      : 3.9.2
Release      : 1.module+el8.4.0+10237+bdc77aac
Architecture : x86_64
Size         : 24 k
Source       : python39-3.9.2-1.module+el8.4.0+10237+bdc77aac.src.rpm
Repository   : @System
From repo    : rhel-8-for-x86_64-appstream-rpms
Summary      : Version 3.9 of the Python interpreter
URL          : https://www.python.org/
License      : Python
Description  : Python 3.9 is an accessible, high-level, dynamically typed, interpreted
             : programming language, designed with an emphasis on code readability.
             : It includes an extensive standard library, and has a vast ecosystem of
             : third-party libraries.
             :
             : The python39 package provides the "python3.9" executable: the reference
             : interpreter for the Python language, version 3.
             : The majority of its standard library is provided in the python39-libs package,
             : which should be installed automatically along with python39.
             : The remaining parts of the Python standard library are broken out into the
             : python39-tkinter and python39-test packages, which may need to be installed
             : separately.
             :
             : Documentation for Python is provided in the python39-docs package.
             :
             : Packages containing additional libraries for Python are generally named with
             : the "python39-" prefix.
             :
             : For the unversioned "python" executable, see manual page "unversioned-python".
```
Cloudflareでwww付きドメインをwww無しドメインにリダイレクトする

Cloudflare Pages でサイトを公開してカスタムドメインを設定した。
その時、ルート(APEX)ドメインをカスタムドメインとして登録した。
www付きはwww無しにリダイレクトしてほしかったので設定方法を探したけれど上手くいかなかったのでメモ。
`https://www.example.com`  -> `https://example.com` へ301リダイレクト

## ページルール
ページルールを作成します。

1. ルールタブに移動して「ページルールを作成」を選択する
1. 「URLが一致する場合」フィールドにwww付きドメインを入れる
 * `www.example.com/*`
     * `*`はワイルドカード
1. 「その後の設定は」でフィールドを選択・入力する
 * [URLの転送]、[301 - 永久リダイレクト]を選択
 * 転送先のURLに`example.com/$1`
     * `$1`は`*`の箇所を同じ文字列で埋めてくれる
1. 保存する


## DNS設定
DNSレコードの設定をします。

1. DNSタブに移動する 
1. 「レコードを追加」を選択
1. [タイプ]を`A`、[名前]に`www`、[IPv4アドレス]に`192.0.2.1`を入力
 * `192.0.2.1`は特に何もささない例示用アドレス。RFC5737に載ってる。
1. 保存する


## その他
ググったとき、ページルールの方が書いてあるサイトはよく見つかったのですが、DNSレコードでwwwを設定しないといけないということが出てこなくて困りました。

### 参考文献
コミュニティじゃなくてヘルプにDNSレコードのこと書いておいてほしかったなぁ……

https://community.cloudflare.com/t/using-page-rules-to-perform-redirects/55386

https://community.cloudflare.com/t/redirecting-www-to-non-www/2949/28
singletonについて

# singletonについて

SpringBootの動画学習で、singletonというプログラミング初心者には聞きなれない単語が出てきたのでsingletonについて調べてまとめてみました。

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# singletonとは？
singletonは、あるクラスのインスタンスが必ず一つであることを保証することを指します。

また、singletonはデザインパターンの一種です。

<br>
通常はインスタンス化する際、クラスオブジェクトが一つに対し、インスタンスオブジェクトは複数生成することが出来ます。

しかし、クラスオブジェクト一つに対し、一つのインスタンスのみを共有したい場合はsingletonを使用し他のインスタンスを生成できなくします。


## singletonの多用には注意
singletonはデザインパターンの中でも比較的理解されやすい、容易に利用できることから多用されがちです。

しかし、多用しすぎるとクラス間の依存関係を不必要に強めてしまう恐れがあるため、singletonは**どうしてもインスタンスを一つに制限しなくてはならない場合**にのみ使用するようにしましょう。



<a id="#Chapter2"></a>
# Javaでのsingletonパターン使い方
singletonパターンを使用する際のポイントは。以下の二つです。

**・コンストラクタをprivateで宣言する。**

**・singletonのインスタンスを使用するメソッドはstaticで宣言する。**

それでは実際にsingletonを使用したコードを紹介したいと思います。

```Java
public class Sample {
    
    //staticでクラスオブジェクトの中にインスタンスが生成される
    private static Sample singleton = new Sample();

    //他クラスでコンストラクタを使ってインスタンスを生成することを防ぐ
    private Sample(){};

        //インスタンス取得用のメソッド
        public static Sample getInstance() {
            return singleton;
        }
}
```
privateでコンストラクタを宣言することで、前行のnew Sample()のインスタンス生成時以外にインスタンスを生成することが出来なくなります。
よって他のクラスでコンストラクタを使用しインスタンス化することを防ぎます。

そして、singletonのインスタンスは取得用のメソッドを追加することで取得できます（getInstance()メソッド）。

getInstance()メソッドはstaticで宣言しています。これにより、利用する側はSample.getInstance()でインスタンスを取得できます。


<a id="#Chapter3"></a>
# まとめ
singletonはデザインパターンの一種で、あるクラスのインスタンスが必ず一つであることを保証する際に使用します。

singletonパターンを使用する際の主なポイントは以下の二つです。
・コンストラクタをprivateで宣言する。

・singletonのインスタンスを使用するメソッドはstaticで宣言する。

上記のポイントを押さえれば、singletonは簡単に使用できますが、多用しすぎるとクラス間の依存関係を不必要に強めてしまう恐れがあるため使用時には注意が必要です。
【一言で説明】MVCモデル


`「MVCモデルについて説明して下さい」`

面接で問われることがあると、ちらほら見かけました。
laravelを使っている以上ぼちぼち理解しているつもりではありましたが、いざ問われるとダラダラとまとまりなく話してしまいそう…。
と思い、"簡潔に”説明できるよう、自分なりの言葉でいま一度整理してみました。
<br>
では早速、MVCモデルとは。
<br>
**一言でいうと**
プログラムの整理方法

**もう少しつっこむと**
プログラムの中身を機能ごとに分類して記述することで、プログラムを整理しやすくする方法(たくさんある方法のうちのひとつ)

**もう一歩説明すると**
プログラムは、同じ処理をする場合でも色んな書き方ができます。
そこで、誰が見てもどこにどの処理が書いてあるか分かりやすくする為、MVCモデルのようにみんなの共通認識となる概念が使われています。
<br>
###改めて二言でいうと
誰が見ても分かりやすく、効率的で保守性の高いプログラムを記述する為の方法論のひとつ。3つの機能に分類してプログラムを記述する。
<br>
###3つの機能の分類
・モデル(Model) : アプリケーションで扱うデータの保存と計算を担当  
  
・ビュー(View) : UIへの出力を担当  
  
・コントローラ(Controller) : ビューとモデルの橋渡し役を担当(UIからの入力に対する処理を担当

<br>
丁寧に詳しく分かりやすく書いているサイトはたくさんありますが、「端的に分かりやすく」まとめられたものが無かったので自分で書いてみました。

よりブラッシュアップしていきたいと思いますので、ご指摘やアドバイスいただければ幸いです。
[Android]デフォルトのアクションバーとToolbar何がちゃうねん！

#デフォルトのアクションバーと何が違うの
どうもReoです。
以前、オリジナルアプリの作成中に、xmlファイルでToolbarを実装しました。
なんか、カスタム性強そうかなと思ってデフォルトのアクションバーを消しました。
そして、MainActivity上にFragmentが５つくらいの画面数だったのですが、全ての画面にそれぞれのアクションバーを設定するために、全画面のレイアウトファイルにToolbarを追加しました。

しかし、これはかなり冗長的なやり方でした。

どうやら、Activityで共有できる方法があるようです。

https://developer.android.com/training/appbar/setting-up?hl=ja

ちなみに、リファレンスにある通りデフォルトのアクションバーとToolbarの違いは、サポートライブラリの充実度です。
やはり、ただでさえ少ないAndroidユーザーですからｗ、しっかりとどの端末でも同じ機能を使えるように、Toolbarを使うべきですね。

実装方法は、ドキュメント通りなので割愛します。

#終わり
意外と知らなかった。
アクションバーにmenuファイルで作成したアイコンをセットして、処理を追加することもできる。
onOptionItemSelectメソッド、見たことあったけどこのことだったのか。
モダンなアプリでは、多用しているのでポートフォリオにはもってこいだ。

https://developer.android.com/training/appbar/actions?hl=ja
天気を取得するカスタムコネクタを作成してみる

# 天気を取得するカスタムコネクタを作成
カスタムコネクタを使ったことがなかったので、作成してみます。
使わせていただいたAPI：[Open Weather Map](https://openweathermap.org/)
忘れないようにメモ

# カスタムコネクタを作成する
一から作成で、名前を適当に決めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/ca516df7-2753-3f8d-3cc8-0d1eaed81742.png)

## セキュリティ
認証タイプはAPIキー
tokenはクエリパラメタ(appid)で指定するので、パラメタの場所はクエリにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/e132bbba-f9c3-126f-66e2-ac038dacc4ce.png)

## 定義
定義では、それぞれのAPIの定義を登録
[現在の天気を取得する](https://openweathermap.org/current)ものをつくる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/79fc7adc-421b-938b-958a-0831a8dee09f.png)

### 要求、応答

要求、応答はサンプルからインポートします。
### 要求

一度PostManなどで試し、実施したURLをインポートしました。以下例

```
http://api.openweathermap.org/data/2.5/weather?appid=XXXXXXXXXXXX&lat=35.6809591&lon=139.7673068&lang=ja&q=london&id=1859171&zip=673-0877,JP&units=metric
```

インポート画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/f2d53d10-fd4a-2404-fd66-31bef618991a.png)

インポート結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/abab4d18-3d71-fed8-31a9-0d514a23f831.png)
必須かどうかはそれぞれのパラメタの編集から設定可能でした。

### 応答
応答も一度PostManなどで試し、実施した結果をインポートしました。以下例

```
{
    "coord": {
        "lon": 135.0003,
        "lat": 34.6491
    },
    "weather": [
        {
            "id": 804,
            "main": "Clouds",
            "description": "厚い雲",
            "icon": "04d"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 294.01,
        "feels_like": 294.71,
        "temp_min": 293.07,
        "temp_max": 295.43,
        "pressure": 1011,
        "humidity": 98,
        "sea_level": 1011,
        "grnd_level": 1009
    },
    "visibility": 2686,
    "wind": {
        "speed": 4.04,
        "deg": 282,
        "gust": 5.96
    },
    "clouds": {
        "all": 100
    },
    "dt": 1621391077,
    "sys": {
        "type": 1,
        "id": 7963,
        "country": "JP",
        "sunrise": 1621367684,
        "sunset": 1621418306
    },
    "timezone": 32400,
    "id": 0,
    "name": "Hitomaruchou",
    "cod": 200
}
```

インポート画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/10b6b94c-8675-c973-28ca-8d01f13db921.png)

インポート結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/b6139b8b-0624-ecdf-c188-fc5c3dbbf8dd.png)

## テスト
パラメタを設定して、テスト操作してみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/ed7c6906-4d0e-f2ae-7482-71a0cbc37095.png)

できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/ec4fc0d5-bb5e-f9a5-e4bb-72ebfd951c7d.png)

# PowerAppsと連携
PowerAppsの"データ"→"データソースの選択"から接続できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/fb9db822-e4c3-9926-9ee0-091077281adc.png)

# おわり
次はPowerAppsに連携して実際にアプリを作成してみます！
Amazon API Gatewayを独自サブドメインで使う

api.example.com のような独自ドメインのサブドメインでAPI Gatewayを使う設定をしてみます。
CloudFrontに独自ドメインのルートドメインを設定し、APIをサブドメインに紐付けるような使い方を想定しています。
先に独自ドメインのRoute53によるDNS設定が必要になりますが、この記事では説明しません。
下記の記事が参考になりました！
[freenomで取得したドメインをRoute53に委任する。 - サーバーワークスエンジニアブログ](https://blog.serverworks.co.jp/delegate-route53)


# ACM(AWS Certificate Manager)でSSL証明書を作る
まず、AWSコンソールのACM設定画面より、SSL証明書を作ります。CloudFrontの独自ドメイン設定では必ず us-east-1 リージョンで証明書を作成しますが、API Gatewayの場合は独自ドメインで使いたいAPIのリージョンでACM設定を行います。
ACM設定画面より「証明書のリクエスト」→「パブリック証明書のリクエスト」と入力を進めます。
<dl>
  <dt>ステップ 1: ドメイン名の追加</dt>
  <dd>利用したいサブドメインを入力します。　例：api.example.com</dd>
  <dt>ステップ 2: 検証方法の選択</dt>
  <dd>「DNSの検証」を選択します。</dd>
  <dt>ステップ 3: タグを追加</dt>
  <dd>必須ではありません。補足情報が必要な場合は入力してください。</dd>
  <dt>ステップ 4: 確認とリクエスト</dt>
  <dd>確認して「確定とリクエスト」ボタンを押してください。</dd>
  <dt>ステップ 5: 証明書のリクエスト</dt>
  <dd>
「Route53でのレコードの作成」→「続行」と入力してください。
![SS_証明書のリクエスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/f7d163eb-c271-357f-375b-95a2ed9608a4.png)
　</dd>
</dl>
入力を完了すると、設定したドメインがリストに追加され、「検証保留中」と表示されますが、数分待って更新ボタンを押すと「発行済み」になりました。

# API Gateway カスタムドメインの設定
API Gateway設定画面より、「カスタムドメイン名」→「作成」と入力します。
![SS_カスタムドメイン名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/5c3b3e27-1904-fedb-bd9d-4682eb87f1b0.png)
***
ドメイン名を入力し、ACM証明書は先程、作成した証明書を選択します。
![SS_ドメイン名を作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/9c4229e3-1a5b-08c0-dfb0-2b84fb0aa26a.png)
***
作成したカスタムドメイン名を選択し、APIマッピング設定へと進みます。
![SS_APIマッピング設定を開く2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/7a67286e-9c30-f26b-d2f9-6079e82e8798.png)

***
「新しいマッピングを追加」し、使用したいAPIを選択します。
ステージはAPIで作成しているステージから選択、パスは任意の値を入力してください。複数APIをマッピングする場合はパスが必要になります。
![SS_APIマッピング設定を入力2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/216f42fe-6dae-d0e7-5e57-136f503a3c73.png)



# Route53 Aレコードを作成
Route53設定画面より、「ホストゾーン」→（作成済みのドメイン名）→「レコードの作成」と進みます。
レコードの作成画面で、レコード名、レコードタイプ、エイリアス、リージョン、エンドポイントを入力します。
レコード名はサブドメインのサブの部分を入力します。
レコードタイプはAレコードを選択します。
エイリアスをONにして「API Gateway APIへのエイリアス」を選択します。
リージョンは使用したいAPIのリージョンを入力してください。
エンドポイントはカスタムドメインで設定したAPIが選択肢に出てきますので、選択します。
![SS_Aレコードの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/7671bf32-f037-a02f-59e7-c9974a8570fb.png)


# 独自サブドメインでAPIにアクセス
サブドメインでアクセスできるか試してみましょう。APIは直接ブラウザで開ける設定のREST APIです。
URLは下記の形式です。
```https://<サブドメイン>(/パス)/<APIのリソースパス>
```例：<code>https://api.example.com/users</code>


※普段、Chromeのアドレス欄に入力する際にはドメインから入力していましたが、この時は<code>https://</code>から入力しないと開けませんでした。ブラウザで開けなかった場合はお試しください。

![SS_ブラウザで開く.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1509934/16d58e14-241b-5c3a-ae22-970a1d951770.png)

無事、サブドメインでAPIにアクセスできました！
いろいろな会社のセキュリティ要件をAWSで乗り越えるために

# 概要

セキュリティ要件満たしてますか？と聞かれた時用に改めて整理した。
直近まさにこういう類の情報を求められる事が多く出てAWSの中の人にもヘルプを求めた。

あくまで私個人の理解および認識を書いただけなので、正しい情報は公式情報を参照のこと。つまり免責。

# 参考サイト 2021/05/24追記

https://qiita.com/leomaro7/items/604db3c021233ac2eaf0

https://dev.classmethod.jp/articles/security-for-infra/


#  WAF関連

WAF = Web Application Firewall
いわゆるDDoSやSQLインジェクションなどの明らかに攻撃の類であるものを防ぐもの

## AWS WAF

https://aws.amazon.com/jp/waf/?nc2=h_ql_prod_se_waf

詳しい概要はクラスメソッドさんの記事のがわかりやすいと思う
https://dev.classmethod.jp/articles/fully-understood-aws-waf-v2/

個人的にはALB(Application LoadBalancer)にデフォルト導入されてる AWS Shield Standard だけで大半は大丈夫だと思う。DDoS以外の条件や細かいルールカスタマイズなどうるさく求められる場合にはWAF導入かな。

AWS WAFのルールにひっかかってシャットアウトされたときに何が原因かわからなかったり、ルール管理は必要。
無害なのに殺される例としては、

1. JPGをアップロードする
1. バイナリデータがWAFのルールに抵触する文字列もってたりする
1. 攻撃と判断する
1. アップロードできない

みたいな流れ。机上の空論だけど起こりうる。が、それが起こっちゃった時に誰もわからんのじゃね？？？

# IPS/IDS

IPS = Intrusion Prevention System(不正侵入防止システム=侵入を防ぐ)
IDS = Intrusion Detection System(不正侵入検知システム=侵入をお知らせするだけ)

## AWS GuardDuty

https://aws.amazon.com/jp/guardduty/

GuardDutyに対してCloudTrailやVPCフローログなどを渡すことで驚異をチェックする。
かませたいデータの総量によって課金額が決まる。
GuardDuty + CloudTrail、GuardDuty + VPC Flow Logsみたいなセットで。
なお厳密にはIPSっぽい挙動を実現できるというのが正しい表現。いわゆるIPS/IDSと呼ばれて販売されてるサービスというわけではない。
が、ほぼ同じことができるので、回答としてはこれで正しいと思う。

# ドキュメント開示を求められたら

## AWS Artifact

https://console.aws.amazon.com/artifact/home?#

AWSコンプライアンスレポート(第三者監査レポート)のダウンロードサービス。
AWS自体をあーだこーだ言われた時に使う用。ほぼ言われなくなった気はします。病院とか学校とかはまだあるかも。。。

## FISC

https://aws.amazon.com/jp/compliance/fisc/

簡単にいうと金融関係向けのAWSが何をしているのかを明記したドキュメント。
ここに書かれているルールに対象項目があれば、◯◯の項目の通りですみたいな辞書的に参照する先として使う

# 終わりに

the なぐり書き。
細々違うと思うし自身もまだ使ったこと無いものもあるため説明不十分かもです。
まあでも十分の材料でしょう。ここから各自調べてもろて。オネシャス。
(それで出来ればおかしい点などご指摘ください！)
CloudFormation で Route53 に CloudFront のエイリアスレコードを作成する

CloudFormation で Route53 に CloudFront のエイリアスレコードを作成しようとした時にエラーが出てしまい、 エラーメッセージでググったら[^1] [CloudFront では作成できないから管理コンソールから作成したという古い記事](https://naughtldy.hatenablog.jp/entry/2018/05/10/160000) が最上位に出てきて諦めかけましたが、実際にはできたので記事に残しておきます。

# エラーメッセージ

```
Invalid Resource Record: FATAL problem: ARRDATAIllegalIPv4Address (Value is not a valid IPv4 address) encountered with 'abcdefghijkmn.cloudfront.net'
```

# 誤ったテンプレート

```yaml
  Route53RecordSet:
    Type: AWS::Route53::RecordSet
    Properties:
      Name: '*.example.com'
      Type: A
      ResourceRecords:
        - abcdefghijkmn.cloudfront.net
      TTL: 300
      HostedZoneId: ABCDEFGHIJKLMN
```

# 正しいテンプレート

```yaml
  Route53RecordSet:
    Type: AWS::Route53::RecordSet
    Properties:
      Name: '*.example.com'
      Type: A
      AliasTarget:
        DNSName: abcdefghijkmn.cloudfront.net
        HostedZoneId: Z2FDTNDATAQYW2 # 固定値
      HostedZoneId: ABCDEFGHIJKLMN
```

ResourceRecords で指定するのではなくて、 AliasTarget で指定する必要があります。
また、 HostedZoneId は CloudFront を指定する場合には `Z2FDTNDATAQYW2` 固定[^2]になります。


[^1]: 2021 年 5 月時点
[^2]: [AWS::Route53::RecordSet AliasTarget のドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget-1.html)
Swiftは何だろう？＿210519

### Swiftとは
iOSアプリの開発ができる言語としてはObjective-CとSwiftがあります。

Androidアプリの開発をするためのJava と Kotlin と使うことと同じです。

本人は現業でSwiftを通じてiOSアプリを開発しているため、スイフトに関する文を作成したいと思いました。

では今日は、Swiftとは何かについて見ていくことにしよう。


### スイフト？Swift！
スイフトはアップルのiOSとmacOSのためのプログラミング言語で、2014年6月12日に初めて紹介され、9月に正式発表されました。 既存のアップルOS用言語はObject-Cで、このように使用するために作られました。
従って、Object-Cと同様にLLVM(コンパイラ)を通じてビルドとなり、同じランタイムを共有します。

Object-Cにはなかった機能が追加されました。(クロージャー·多重リターンタイプ·ネームスペース·ジェネリック·タイプ類推など)

現在はアップルがオープンソースとして共有しながら、アップルプラットフォーム以外の様々なプラットフォームで使用できるようになっています。



### スイフトの言語的特性です。

アップルが初めて公開したとき、スイフトの特徴をSafe、Modern、Powerfulといいましたが、オープンソースに切り替わると同時にSafe、Fast、Expressiveと訂正しました。



1. 安全性です

スイフトは、安全なプログラミングを目指しているが、プログラマーが犯す可能性のあるミスを厳格な文法で適用し、未然に防止しようと努力しました。 オプショナルという機能をはじめ、guard構文、エラー処理、強力なタイプコントロールなどを通じてスイフトは安全性を構築しています。



2.迅速ですね

C言語を基盤としたC、C++、Object-Cのようなプログラミング言語を代替しようとする目的で作られたので、Cと似たようなレベルの性能を維持するのに焦点を合わせて開発されました。 実行速度の最適化だけでなくコンパイラを持続的に改良し、より速い性能を実現しています。



3.表現性です

スイフトはもっと使いやすく見やすい文法を具現しようと努力しました。 そうだそうです：）
### スイフトプログラミングパラダイム
スイフトは、様々なプログラミングパラダイムを借用したマルチパラダイムプログラミング言語です。

これについて簡単に調べましょう！



1.オブジェクト指向です。

コンピュータプログラムをコマンドリストで見る既存の命令型プログラミングパラダイムの視点から離れ、いくつかの独立した単位であるオブジェクトの集まりとして把握しようとしているのです。

そのため、プログラムを柔軟で容易に変更できるように作成でき、大規模ソフトウェア開発に使われやすいです。

また、メンテナンスが簡便になるメリットもあります。



2.関数型です

関数型のメリットは、大規模並列処理が容易である点です。

プログラムの状態変化なしに、データ処理を数学的関数計算で扱おうとするパラダイムです。

したがって、値や状態の変化に集中していたのとは異なり、関数そのものの応用を重要視しています。

まあ一応そうだと言うが理解するのが難しいです... ですね。



関数型パラダイムでプログラムを作成する場合、

種々の演算処理作業が同時に起こるプログラムを作りやすいといいます。

そして、マルチコアあるいは複数の演算プロセッサを使用するシステムで効率的なプログラムが作りやすいです。

その他にも、状態変化による副作用から自由になるので、純粋に機能実現に焦点を合わせることができます。



3.プロトコルを目指します

プロトコル指向は参照タイプのクラスのインスタンスよりも値タイプの方が効率的に使用でき、エラーを減らすことができるそうです。

スイフトでは、構造体と列挙型に従来のクラスで実装できたカプセル化、抽象化、アクセス制御などの機能をすべて実現することができます。 さらにプロトコルにエクステンションを活用できるため、プロトコル指向プログラミングが可能になったそうです。

つまり、多重相続が不可能な限界を乗り越えて、より良い抽象化メカニズムを実現できるわけです。



以上、スイフトの背景と特徴を探りました。

一生懸命に勉強します！！
【Wordpress】検索フォーム設置（search.php）テンプレ

最低限のやつです

#設置用タグ

```
<form action="サイトのURL" method="get">
    <input name="s" type="text" placeholder="キーワードを入力"/>
    <button type="submit">検索</button>
</form>
```

#結果用（search.php）

```
<?php
if (isset($_GET['s']) && empty($_GET['s'])) {
echo '検索キーワードが入力されていません'; 
} else {
echo '“' . $_GET['s'] . '”の検索結果：' . $wp_query->found_posts . '件';
} ?>
```
【ベイズ統計学再入門③】モンテカルロ法

復習がてら、ベイズ統計の解説とPythonでの実装を行います。
第三回は「モンテカルロ法」についてです。

<h1>モンテカルロ法とは</h1>
まずはモンテカルロ法とは何かについて説明します。

例えば以下の一辺が1の正方形の領域にランダムに点を打って円周率を求めることを考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182283/1907ac99-d2ef-d631-686f-7bd040c07e51.png)

ランダムに打った点の数を$n$，円の中に入った点の数を$p$とおいて

```math
\frac{p}{n}
```
を計算します。ランダムに打つ点を大きくしたとき、この計算は$\frac{\pi}{4}$（半径1の円の面積の4分の1）に近づくはずです。

```math
\frac{p}{n}\approx \frac{\pi}{4}
```
このように、乱数を使った数値計算法のことをモンテカルロ法といいます。

<h1>実装</h1>
モンテカルロ法も用いて円周率の近似値を求めてみます。

モンテカルロ法のステップを変えるスライドするバーを作成し、インタラクティブな描画ができるようなプログラムを書いてみます。

```python
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
#インタラクティブな描画
from IPython.html.widgets import interact
#グラフを埋め込むために以下を入力
%matplotlib inline

#ggplotというスタイルでグラフを表示する（お好みで）
plt.style.use("ggplot")
#乱数のseedを固定
np.random.seed(123)

NMC = 100
xmc = np.random.rand(NMC)
ymc = np.random.rand(NMC)
#スライドするバーの設定（0からNMCまで1刻み）
@interact(mcs=(0,NMC,1))
def animation(mcs=0):
    plt.figure(figsize=(6,6))
#グラフの描画範囲を明示的に指定
    plt.xlim([0,1])
    plt.ylim([0,1])
#円を描画
    x = np.arange(0,1,0.001)
    y = (1-x**2)**0.5
    y2 = np.ones(x.shape[0])#すべての要素が1のarray
    plt.plot(x,y)
#色を塗りつぶす（α値で透明に）
    plt.fill_between(x,y,alpha=0.3)
    plt.fill_between(x,y,y2,alpha=0.3)
    r = (xmc[:mcs]**2 + ymc[:mcs]**2)**0.5
#円の中に入ったかどうかの判定（r<=1ならば1，それ以外なら0）
    accept = np.where(r<=1, 1, 0)
    accept_ratio = np.sum(accept) / mcs
    plt.scatter(xmc[:mcs], ymc[:mcs], color="black", marker=".")
    plt.show()
    print("Monte Carlo: ",accept_ratio)
    print("pi/4: ",np.pi / 4.0)

```

![2021-05-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182283/1082e5a2-39d7-4aad-8b20-01c246bc7ee7.png)


100程度では精度が微妙ですね。点を打つ数を増やせばもっと近似してくれますが、ランダムに点を打つので、目的の値に近づいたり遠ざかったりとふらついて近づくことが知られています。

次回は棄却サンプリングやMCMCについて書きたいと思います。
Welcome to Taskvio! - 100s of bots for your day to day convenience.

Image Resizer

Even though it also consumes tons of your time to upload files on your internet website. When your image file is quite a requirement then also you've got to compromise yourself then you search for how you'll upload this file on your social media website without losing your real image quality.

Image resizer tool by Taskvio may be a free online tool that helps you to resize your image during a very simple way.

It also compresses your image in order that you'll upload it online very easily on your Email, website, and other social media page.

How image resizer tool goes to assist you
While we use social media we've to face tons of problems uploading our photos and pictures . Sometimes it happens because your image height is quite the need and sometimes you've got to face problems due to width right. So our Image Resizer tool is here to assist .

What you've got to try to to is just upload any of your chosen images here then you'll upload it here.

Now what you'll do is you'll change the image Width and height size as per your requirement and if you would like to take care of the ratio of your image then you'll simply tick a mark thereon in order that it can maintain your image ratio .

What is the image aspect ratio? 
So on affect the proportion of each day with CSS make adaptable components that keep their proportion (4:3, 16:9, then on) when resizing the program window. Now, what is the proportion? the attitude proportion of a neighborhood depicts the corresponding connection between its width and stature.

How to use this Image resizing tool?
Simply attend our website taskvio.com home page then look for Image resizer.

After finding this tool click thereon and open it.

Then you'll Upload your Image here whatever you would like to resize.

After uploading your image you only simply click on the Resize button to resize the image then you'll get a newly resized image. 

And this is often how you'll use this tool. you'll resize any quite image format and any size of your image here with this tool.


Free Online Bots for your day to day convenience from Taskvio. Taskvio provides Text Based Tools, Domain Tools, Image Editing Tools, Binary Converter Tools, Development Converter Tools, Unit Converter Tools, Text Content Tool, Website Management Tools, Password Management Tools, Proxy Tools, Website Tracking Tools.
Read More> https://taskvio.com/
[Ruby]define_methodを使えるようにしておきましょうか。

# define_methodとは
define_methodとは、簡単に言うとメソッドを動的に定義できるメソッドです。
これに関しては、言葉より実際に処理を見た方が理解できるかと思います。

## 基本的な使い方
第1引数には`メソッド名`、第2引数に`処理内容`を記述します。

```ruby
class Foo
  def foo
    p 'foo'
  end

  define_method(:bar, instance_method(:foo))
end

# barを直接定義しなくてもメソッドのように使えている
Foo.new.bar #=> "foo"
```

### 第2引数の代わりにブロックを渡すことも可能

```ruby
# wordには「foo」「bar」「baz」がそれぞれ入る
%w(foo bar baz).each do |word|
  define_method :word do |i = nil|
    # iがtrueの場合は、i + 1、falseの場合はメソッド名を返す
    i ? i + 1 : word
  end
end

puts foo #=> "foo"
puts bar(2) #=> 3
puts baz #=> "baz"
```

# まとめ
動的メソッドを使うことで、コードの重複を無くすことが可能なので、タイミングを見て活用することも一つの手段ですね！
AWS VPN Clientでプロファイル追加でエラーになるときの対処法

# はじめに
AWS VPN ClientにてVPN設定ファイルの読み込みでエラーにハマったので対処法をまとめました

# エラー内容
AWS VPN Clientをインストール後、プロファイルの追加にて、 `設定では、証明書とキー、auth-user-pass、または auth-federate のいずれかが指定されている必要があります。` とエラーメッセージが表示されたプロファイルの追加ができませんでした
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/e67bac97-ba20-6010-a834-8e6058d32ca3.png)


# 解決方法
VPN設定ファイルに cert と key の読み込みがされていないことが原因でした
設定ファイルに cert と key の読み込みを設定してあげればOKです
以下に記入例を書きます

```
・
・
・
</ca>

cert /path/hoge.crt
key /path/hoge.key

reneg-sec 0
・
・
・
```

他にも cert と key の中身を設定ファイルに記入する書き方もあるようです
その場合は `<cert></cert>` と `<key></key>`ダグの間に中身を記載するようです

```
・
・
・
</ca>

<cert>
Contents of client certificate (.crt) file
</cert>

<key>
Contents of private key (.key) file
</key>

reneg-sec 0
・
・
・
```

# 参考
[Export and configure the client configuration file](https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/cvpn-working-endpoints.html#cvpn-working-endpoint-export)
UP12調査

ハードオフで青いジャンク箱に眠っていた、古いドコモの携帯をUSB接続するケーブル(UP12 USB-PDC Converter)を110円で購入してきました。

FreeBSDにつないでusbconfigで見てみます。

```
% sudo usbconfig -d 0.4 dump_device_desc 
ugen0.4: <USB-RS232 Interface Converter USB Ver1.1 Device> at usbus0, cfg=0 md=HOST spd=FULL (12Mbps) pwr=ON (100mA)

  bLength = 0x0012 
  bDescriptorType = 0x0001 
  bcdUSB = 0x0110 
  bDeviceClass = 0x0000  <Probed by interface class>
  bDeviceSubClass = 0x0000 
  bDeviceProtocol = 0x0000 
  bMaxPacketSize0 = 0x0010 
  idVendor = 0x0711 
  idProduct = 0x0230 
  bcdDevice = 0x0102 
  iManufacturer = 0x0001  <USB-RS232 Interface Converter>
  iProduct = 0x0002  <retrieving string failed>
  iSerialNumber = 0x0003  <>
  bNumConfigurations = 0x0001 
```
 
とりあえずばらしてみました。

中にはPhilips(現NXP)の87C52UBBBとPDIUSBD12というチップが入っています。マーキングから2003年製造のようです。

![IMG_20210520_071309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/1842a42e-30b4-65fa-1870-05b1b5a4e4d1.jpeg)

87C52は8051系のチップでOTP EPROMが内蔵されているようです。PDIUSBD12はUSBドライバーのようです。

未実装のSOP 8ピンのパターンは3線式のEPROMのような気がしたのですが、3,4が同じところにつながれているので、違うようです。

この頃はまだProlificやFTDIのUSBシリアルチップが普及していなくて、またUSBが使えるEZ-USBなどのマイコンなどもあったが、こうやって複数のチップで作りこんであるのは興味深い。またTX,RXしか接続されていないのも時代を感じる。

この製品の開発元はMagic Control Technology Corporation.(MCT)だったようです。

FreeBSDにはumctというドライバーがありますが、cuでループバックを試したのですがうまくいきませんでした。Debianでも認識されたのですが、動きがおかしいです。

アマチュア無線関係でWindowsから使われているページがいくつかありました。

http://kousaku.sblo.jp/article/44387768.html

![USPPDC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8e6b4345-1a72-62de-e5c3-ff05bb193425.png)

Windowsではループバックが正しく動作しました。

コネクタを替えて5V系のTX/RXのみのシリアルとして使えそうです。

なにか利用方法があれば部品取りをしても元がとれると思います。

結局、PC-8001の内蔵シリアルとWindowsの接続用にしてみました。PC-8001の内蔵シリアルはTTLレベルなのですが、反転しているので何かの基板から剥がしたSOP 74HC04を裏に貼り付けてパターンカットして配線してみました。

![IMG_20210723_175054.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d01ca500-ebb1-82a9-49fb-be9388538493.jpeg)

こちらを参考にしました。

https://kuninet.org/2021/04/27/pc-8001%E5%86%85%E8%94%B5%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%A8%E9%80%9A%E4%BF%A1/
Android 12 で更新された Widget についてセッションを見たメモ

Google I/O 2021 で発表された Android 12 の Widget についてセッションの動画 ( Refreshing widgets ) を見たメモです。

セッションの動画はこちら ↓

https://youtu.be/cHv84zXZf6E

- Widget の基本的なこと
  - Android Cupcake (1.5) で初めて登場
  - アプリを起動しなくて情報を確認できるので便利
     - ユーザの 84% が 1 つは Widget を利用しており、63% が複数の Widget を利用している
- Android 12 で大きく変更
  - チェックボックス、スイッチ、ラジオボタンのサポート
  - RemoteView から取ってくるのはこれまでどおり
  - Material のアニメーションにも対応

```
<!-- res/layout/my_layout.xml -->
<Checkbox
    android:id="@+id/my_checkbox" 
    android:text="@string/my_label" />

/* com/google/example/MyWidget.kt */
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true)
remoteView.setOnCheckedChangeResponse(
    R.id.my_checkbox,
    RemoteResponse.fromPendingIntent(
        onCheckedChangePendingIntent
    )
)
```
- Widget の再構成
  - `android:widgetFeatures="reconfigurable"` で Widget を再構成可能に
  - `android:widgetFeatures="reconfigurable|configuration_optional"` で初期構成の Activity をスキップできる
- Widget のプレビューを改善
  - `android:previewLayout="@layout/"` で画像ではなくプレビューを表示できる
     - これまでの Widget はプレビュー用の画像が必要だった
  - `android:description="@string/` で説明文
- Widget はデバイスの検索や Google Assistant に表示される
  - Google Assistant との統合で Widget でタスクを完了できるように
  - Capabilities API で実現できる
  - `AppWidgetHelper` を使ってテキスト読み上げ機能を実装できる
  - 音声の読み上げと Assistant との組み合わせで音声で注文を完結させることもできる

- システムレベルのデザインを適用
  - 既存の Widget は自動的に Padding と角丸のマスクが適用される
- Rounded Corner の実装

```xml
<!-- res/drawable/my_widget_background.xml -->
<shape android:shape="rectangle">
   <corners android:radius="@android:dimen/system_app_widget_background_radius" />
</shape>

<!-- res/layout/my_widget_layout.xml -->
<LinearLayout
    ...
    android:background="@drawable/my_widget_background">
</LinearLayout>
```

- レスポンシブ
  - 折り畳みデバイスやタブレットを考慮してレスポンシブに表示できるようデザインと実装することが重要

```kotlin
val widgetSizes = appWidgetManager
    .getAppWidgetOptions(appWidgetId)
    .getAppWidgetSizes()

appWidgetManager.updateAppWidget(
    appWidgetId,
    RemoteViews(
        widgetSizes.associateWith { size ->
           createSizedLayout(size) // Create RemoteView
        }
    )
)
```

- Theme と Color
  - ユーザやメーカーが色と Theme をカスタマイズ
  - Pixel は壁紙から色を抽出
     - Material You 文脈

```xml
<LinearLayout
    android:theme="@style/Theme.DeviceDefault.DayNight">
    <CheckBox />
</LinearLayout>
```

- Widget とアプリの Transition をスムーズに
  - background に id をつけるだけ

```xml
<LinearLayout
    android:id="@android:id/background">
</LinearLayout>
```

- ガイドラインも Android 12 に沿ったものを作成している
- Compose と Widget
  - 2021年内に **Compose で Widget を実装するライブラリが登場予定**
    - 以下のような感じになる予定

```kotlin
@Composable
fun ListWidget(items: List<Item>) {
    Column {
        Text("Shopping list")
        items.forEach { CheckListItem(it) }
    }
}

@Composable
fun CheckListItem(item: Item) {
    Checkbox(
        item.name,
        isChecked = item.isChecked,
        onStateChanged = { isChecked -> updateItem(item, isChecked) }
    )
}
```
ターミナル　立ち上げ　自分用

https://techacademy.jp/magazine/5155
基本操作


最初に入力・zshにする

touch ~/.zshrc
echo 'export PATH=$PATH:/opt/homebrew/bin' >> ~/.zshrc
source ~/.zshrc


バージョン確認
brew --version

サーバー起動
mysql.server start

これも必要
mysql -uroot

文字通り
show databases;
create database tech_db;

テーブル作成/名前・id・住所など親要素
create table テーブル名 (id int,name varchar(10),adress varchar(10), age int);

テーブル内に入力子要素
insert テーブル名 values (1,'タロウ','東京都',29);

テーブルの中身を見る
select * from テーブル名;
[Ruby]オープンクラスについて理解する

# オープンクラスとは
いつでも既存のClassを再オープンして、その場で修正出来ること。

## オープンクラスの例

### 新規メソッドを作成
※Stringクラスにfooメソッドを追加してみる

```ruby
class String
  def foo
    self + 'foo!'
  end
end

'My name is '.foo #=> "My name is foo"
```

### 既存のメソッドを上書き
※superclassメソッドを上書きしてみる

```ruby
# 通常の動作
String.superclass #=> Object

class String
  def superclass
   'superclass!'
  end
end

# 上書き後の動作
String.superclass #=> "superclass!"
```

## オープンクラスの問題点
既存のメソッドを上書きしてしまうことが可能なので、他の部分で上書きしたメソッドが使用されていた場合、`エラーもしくは想定外の動作`をしてしまいます。

このように、オープンクラスにより既存のメソッドを置き換えることを**モンキーパッチ**と言います。

### モンキーパッチは善？悪？
結論を先に言うと、`ケース・バイ・ケース`です。
意図的にモンキーパッチした場合は、悪いことでは無いので、「善」と言えます。
逆に、意図していない状態でモンキーパッチしてしまった場合は、「悪」と言えてしまいます。

## 注意点
オープンクラスを用いる際は、、

- 全ての関連するデータが保持しても問題のない機能か見極める
- テストコードを書く
- 拡張Stringクラスを定義
- （Ruby2.0以上の場合は）Refinementsを用いる

上記のポイントを意識することが重要です！

## Refinementsとは
指定したクラスまたはモジュールだけに対して、ブロックで指定した機能を提供できるモジュールを定義します。これは、既存の機能を局所的に修正したい場合などに用いる事ができます。

`using`は「ここ以降でRefinementsが有効」という意味で、モジュールに対して適用します。
`refine`はRefinementsとして拡張するclassの指定です。

```ruby
# Fooクラスの定義
class Foo
  # fooメソッドの定義
  def foo
    puts "Foo#foo"
  end
end

# Barモジュールの定義
module Bar
  # FooクラスをRefinementsとして拡張
  refine Foo do
    def foo
      puts "Bar::Foo#foo"
    end
  end
end

f = Foo.new
f.foo # => "C#foo"

# ここ以降でRefinementsが有効
using Bar

f = Foo.new
f.foo # => "Bar::Foo#foo"
```

# 終わりに
オープンクラスは、便利な分、ダークサイドも併せ持つメタプログラミングなので、理解して使うことが大事だと思いました。しかし、武器にすれば心強い。。！
Dockerでjupyter_notebook_config.pyが読み込まれないのですが？

# はじめに
Kaggleに本腰を入れようかと思い、Kaggle用の環境を`Docker`を利用して作成していました。
[こちら](https://amalog.hateblo.jp/entry/data-analysis-docker)の記事の通りに環境を作成しました。

普段は`URLのトークン`や`パスワード`を入力せずに、`localhost:8888`にアクセスするだけで`Jupyter notebook`が利用できる環境を使っているため、今回も`jupyter_notebook_config.py`を導入したのですが、それがうまく読み込まれず、困ったので記事にしました。

`jupyter_notebook_config.py`を追加することで、パスワードの設定などができるのでおすすめです。

# 問題

Dockerfileでjupyter_notebook_config.pyをローカルからコンテナにコピーしているが読み込まれていませんでした。
読み込まれて入れば、jupyter_notebook_config.pyに設定をした以下3点が反映されるはずでした。

1. wording_dirが設定される
2. トークンの設定無効化
3. パスワードの設定

# 各ファイルについて

ディレクトリ構成は以下のようになっています。

```
┣ libraries
  ┣ setting
    ┣ jupyter_notebook_config.py
┣ notebook
┣ docker-compose.yml
┣ Dockerfile
```

各ファイルは以下のようになっています。

`docker-compose.yml`

```
version: "3"
services:
    jupyter:
        build: .
        volumes:
            - ./notebook/:/tmp/working
        ports:
            - 8888:8888
        command: jupyter notebook --ip=0.0.0.0 --allow-root --no-browser
```

`Dockerfile`

```
FROM gcr.io/kaggle-images/python:v56

RUN apt-get update
RUN apt-get install vim -y

RUN pip install -U pip && \
        pip install fastprogress japanize-matplotlib

COPY ./libraries/setting/jupyter_notebook_config.py .jupyter/
```

`jupyter_notebook_config.py`

```
c.NotebookApp.notebook_dir = "/tmp/working"
c.NotebookApp.password = ""
c.NotebookApp.token = ''
```

# なぜか動く現象
docker-compose.ymlのvolumeの位置にjupyter_notebook_config.pyをコピーしてworking_dirを設定するとなぜか`jupyter_notebook_config.py`が読み込まれた。

```
version: "3"
services:
    jupyter:
        build: .
        volumes:
            - ./libraries/setting:/tmp/working
        working_dir: /tmp/working
        ports:
            - 8888:8888
        command: jupyter notebook --ip=0.0.0.0 --allow-root --no-browser
```

# 解決方法

`root`でjupyterを起動しているため、`root/.jupyter/`にコピーする必要があった。

以下のコードに修正することで動きました。

`Dockerfile`

```
FROM gcr.io/kaggle-images/python:v56

RUN apt-get update
RUN apt-get install vim -y

RUN pip install -U pip && \
        pip install fastprogress japanize-matplotlib

COPY ./libraries/setting/jupyter_notebook_config.py root/.jupyter/

```

`docker-compose.yml`

```
version: "3"
services:
    jupyter:
        build: .
        volumes:
            - ./notebook/:/tmp/working
        ports:
            - 8888:8888
        command: jupyter notebook --ip=0.0.0.0 --allow-root --no-browser
```

なぜか動く現象はよくわからないが、volumeするディレクトリ直下にjupyter_notebook_config.pyがあればちゃんと動くようだった。ここはさらに調査が必要そう

# おわりに

この記事は[teratail](https://teratail.com/questions/339026)で実際に質問した内容をまとめたものになります。この質問は具体的すぎるから返ってこないだろうなと思いましたが、回答があり驚きました。

とりあえず質問を投げるのはアリだと思いました。

私も詳しくなってきたら質問を答える側に回りたいです。

# 参考記事
https://amalog.hateblo.jp/entry/data-analysis-docker

https://qiita.com/taka4sato/items/2c3397ff34c440044978

https://teratail.com/questions/339026