OmniAICreator/Qiita-1.07M huggingface dataset:
google-cloud-translate gemの翻訳結果でアポストロフィが実体参照(&#39;)で返ってきてしまう問題

# 遭遇したver

google-cloud-translate (3.2.3)
google-cloud-translate-v2 (0.3.1)
google-cloud-translate-v3 (0.4.2)

# 現象

```ruby
text = "お腹空いた"

response = Google::Cloud::Translate.translation_service.translate_text(
  contents:             [text],
  target_language_code: "en",
  parent:               YOUR_GOOGLE_CLOUD_PROJECT_ID
)

translate_result = response.translations.first
puts translate_result.translated_text
#=> "I&#39;m hungry"
```


# 解決法1: 返ってきたものをunescapeする

```ruby
text = "お腹空いた"

response = Google::Cloud::Translate.translation_service.translate_text(
  contents:             [text],
  target_language_code: "en",
  parent:               YOUR_GOOGLE_CLOUD_PROJECT_ID
)

translate_result = response.translations.first
puts CGI.unescapeHTML(translate_result.translated_text)
#=> "I'm hungry"
```

# 解決法2: mime_typeにtext/plainを指定してAPIを使う

ここのIssueのやりとりで見つけました。
https://github.com/googleapis/google-cloud-ruby/issues/4775

```ruby
text = "お腹空いた"

response = Google::Cloud::Translate.translation_service.translate_text(
  contents:             [text],
  target_language_code: "en",
  parent:               YOUR_GOOGLE_CLOUD_PROJECT_ID,
  mime_type:            'text/plain' # これを追加
)

translate_result = response.translations.first
puts translate_result.translated_text
#=> "I'm hungry"
```
text-transform【CSS】要素のテキストを大文字にする

```
要素 {
    text-transform: uppercase; 
}
```

大文字以外にも以下のような指定が可能。代表的なものを挙げています。

|  値  |  仕様  |
| ---- | ---- |
|  uppercase  |  全て大文字  |
|  lowercase  |  全て小文字  |
|capitalize | 単語の先頭を大文字 |
|none|変換させない|


詳細
https://developer.mozilla.org/ja/docs/Web/CSS/text-transform
IPアドレスについて（学習中・メモ)

IPアドレス
スマホやPCなどのネットワーク上の機器に割り当てられるインターネット上の住所のようなもの。
ページの閲覧やメールの送受信を行うときに送信元や送信先を識別するために使用される。
ネットワーク上でデータの送受信をする際、相手を指定するために使われる。
複数の種類がある

1,グローバルIPアドレス
世界でひとつだけの、インターネットに接続する際に割り振られるIPアドレス。同じグローバルIPアドレスが存在することはない。
ICANNという組織で世界的に管理されており、そこから日本の管理組織であるJPNICに割り振られ、インターネット・サービス・プロバイダ(ISP)を経由して利用ユーザーへと割り振られている。
ICANN->JPNIC->ISPの順
IPアドレスは、XXX.XXX.XXX.XXXのように0〜255の数字4組で表記される。*数は有限、割り当て範囲が決まっている

2,プライベートIPアドレス(ローカルIPアドレス)
自宅や会社など特定のネットワークの範囲内で用いられるIPアドレスのこと。ネットワーク内で識別できれば良いので、ほかのネットワークでは同じ番号が使われている可能性がある。*割り当て範囲が決まっている

3,グローバルIPとプライベートIPのつながり方
![de9855bd516610f50d58c1597ff497b7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/ebc064f2-3614-1776-6afd-a059cb40bd03.jpeg)

4、IPアドレスの割り振られ方
動的タイプと固定タイプの2種類

動的（可変）IPアドレス
インターネットに接続するたびに、ISPから新たなIPアドレスが自動的に割り振られるのが動的（可変）IPアドレスで、普段スマホやPCなどを利用するときに割り当てられるのがこちらのタイプとなる。一定時間が経過したり、ネットを切断するたびに番号が変更される。、番号が変動するので、ユーザーが特定されるリスクも低いだろう。

固定（不変）IPアドレス
常に同じIPアドレスで接続するケースに対応したものが固定（不変）IPアドレスだ。会社内のシステムなど特定の許可した人（機器）しか通信できないよう設定する場合は、接続のたびにIPアドレスが変わってしまっては、どこからのアクセスか特定できない。接続が許可された人であることを特定するために固定IPアドレスが必要になるのだ。

IPアドレスの枯渇問題。IPv4とIPv6
インターネット需要が拡大した現在、使用できるIPアドレスの数が追いつかなくなってきた。そこで新たに取り決めたプロトコルが「IPv6」だ。
IPv6では43億✕43億✕43億✕43億までIPアドレスを管理できる。

間違いやアドバイスなどあれば、遠慮なく言って欲しいです。


参考文献：https://time-space.kddi.com/ict-keywords/20200930/2984
Rust + Discord webhookで天気予報を取得した話

# 開発動機
外出たときに雲が多くても面倒くさくて傘持たずに出たらn回雨にあったため

しかし開発中に傘忘れて雨に振られたのでおそらく天気との和解でできていないです。

# 概形

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606626/36438f6d-1832-a12d-02df-576b7b804eec.png)

1． 毎日21時に`Cloud Run`上で動いている`Ageha`にリクエストを`Cloud Scheduler`で送る
2． Agehaはリクエストをもとに気象庁API(非公式らしい)から予報データを取得
3． データをWebhookでいい感じに送信

# つくったもの

https://github.com/raiga0310/Ageha/tree/dev

# 感想

開発中に***Webhookをおもらし***しました
コミットしてしまった部分はもう消して環境変数形式にしましたがプッシュする前に確認すればよかったですね

# 追記

技術的な話をすべて丸投げなのも良くないと思っていくつかコードを抜粋しながら書きます。

## HTTP request
### GET

```rust
    let response= client
        .get(jma_url)
        .send()
        .await?;
```

気象庁の予報を取得できるURLに対してGETリクエストを送る文です。
`reqwest::Client`を使用しています。
### POST

```rust
    let result = client
        .post(dis_url)
        .header(reqwest::header::CONTENT_TYPE, "application/json")
        .body(embed_text.to_string())
        .timeout(core::time::Duration::from_secs(10))
        .send()
        .await;
```

今回のDiscord WebhookはJSON形式でPOSTのとするといい感じに埋め込みで表示できるのでJSONで送ることを明示するためにヘッダーに`reqwest::header::CONTENT_TYPE`を使用してJSONをPOSTすることを示します。

## 関数の返り値
Rustには`Result<>`というものが存在し、エラーが発生する可能性のある処理に対してのハンドリングを行えるようになっているらしいです。細かい話はRustの公式ドキュメントなり身近なつよつよRustceanに聞いてください。私は雰囲気でRustを使っています。

```rust
async fn root() -> impl IntoResponse {
    match getOverview().await {
        Ok(overview) => match
            sendToDiscord(overview).await {
            Ok(()) => (StatusCode::OK, "sent"),
            Err(e) => (StatusCode::INTERNAL_SERVER_ERROR, "failed to send discord")
        },

        Err(e) => (StatusCode::INTERNAL_SERVER_ERROR, "failed to fetch weather overview")
    }
}
```
この`root()`関数は`getOverview()`の結果に応じて出力する文(=レスポンスの本文)を決めるやつですが、場合によって返り値の型が変わる恐れがあるので、`IntoResponse`というトレイト(interfaceより便利っぽいやつ)を実装しているモノを返す、というような型の指定をします。この`root()`はaxumでハンドラとして呼び出す関数なので、`IntoResponse`が実装されるものが期待できればいいのでこの記述になりました。
WP Mail SMTP Pro のインストール方法とIAM最小権限の設定

# はじめに
WP Mail SMTP Proの設定方法とIAMの設定について、簡単にまとめます。

# 環境構築

下記の通りに、EC2上でWordpressを構築しました。

https://qiita.com/holdout0521/items/342afcee0736a7165e7d

- Amazonlinux2
- PHP 8.0.8
- PHP-FPM 8.0.8
- nginx 1.20

SESの設定方法は、下記の通りにするとよいです。（Lambdaの構築工程は省きましょう）
ドメインメール設定です。

https://qiita.com/holdout0521/items/43a4b60810c094b42344

# Pro版 のインストール方法
まず、Wordpressの管理画面から`WP Mail SMTP`の無料バージョンをインストールします。
今回、`Amazon SES`を使用しますが、そのためには、`WP Mail SMTP Pro`にアップグレードする必要があります。



![スクリーンショット 2022-03-25 23.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/08c7ac99-0c23-96c3-dd12-c3959c966ae3.png)

Pro版にバージョンにアップグレードする方法は、下記のドキュメント通りに設定するとよいです。



https://wpmailsmtp.com/docs/how-to-upgrade-wp-mail-smtp-to-pro-version/


ただし、EC2上でWordpressを構築している場合、Pro版は、手動でインストールする必要があります。
手動でインストールする方法については、下記のドキュメント通りに行ってください。
Pro版をダウンロードし、Wordpressの管理画面からアップロードするイメージです。

https://wpmailsmtp.com/docs/how-to-install-the-wp-mail-smtp-plugin/

最後に、IAMユーザーで作成したアクセスキーとシークレットキー、リージョンを記入し、`Add an Email Address`をクリックすると、SES設定が完了です。
![スクリーンショット 2022-03-25 23.14.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/ab96aa56-cf5e-558f-6731-06df2bf41244.png)
![スクリーンショット 2022-03-25 23.15.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/8a9733d8-ed31-c3fd-9b86-e801bf67cbb9.png)
![スクリーンショット 2022-03-25 23.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/dc76cd3e-5b1a-f268-e114-0b6bfd570ce1.png)


`Email Test`タブからテストメールを実行すると、SESを使い、メール送信することができました。
![スクリーンショット 2022-03-25 23.19.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/a9f50031-4710-70b4-030d-da4f667f29da.png)
![スクリーンショット 2022-03-25 23.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/84009786-6ff4-ab2a-d082-0632122aea74.png)


# DMARCエラー
テストメールを送信した際、以下のDMARCエラーに遭遇しました。
このエラーは、ドメインに対して、DMARCと呼ばれる成りすまし対策設定がされていないことを注意するメッセージでした。

そしてDMARCが正しく設定されていない場合、送信先が受信した際、迷惑メールフォルダに入るだけでなく（こちら側の送信は成功するのに相手側では）受信されないケースが出る可能性があるため、対策しましょう。


![スクリーンショット 2022-03-25 23.33.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/0ededa54-a9bf-2add-d051-1661feda5e15.png)

対策は、SESで設定したドメインと同じドメイン名のRoute53ホストゾーンに、下記のレコードを作成します。
- `レコード名`：`_dmarc`
- `レコード`：`TXT`
- `値`：`v=DMARC1; p=none; fo=1; rua=mailto:test@example.co`
  - `test@example.co`は、送信元のメールアドレスになります。
  - ホストゾーンは、`example.co`

![スクリーンショット 2022-03-25 23.49.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/293a3e4b-d79a-ba8d-20db-96cae14c15c8.png)

これで再度、テストメールを送信すると、成功します。

# IAMユーザーの最小権限の設定
IAMユーザーの権限は、`AmazonSESFullAccess`ですが、最小限の権限を設定しましょう。
以下の通りにIAMポリシーを作成し、IAMユーザーにアタッチしてください。

送信元IPでの制限をかけており、`111.11.11.11/32`は、EC2のIPを指定しています。
また、アクションも`ses:SendRawEmail`のみで問題ありません。

```json:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ses:SendRawEmail",
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "111.11.11.11/32"
                }
            }
        }
    ]
}
```
NowLearningでDelta試験の請求書を取得

<h1>はじめに</h1>
本記事ではServiceNowで資格維持費の請求書をNowLearningでゲットする方法を（私自身が忘れないように）書き残します。

ただしServiceNowは切り替えが早いので、すぐに場所が変わるかもしれません。
もしこの記事に出会ったときにすでに使えなくなっていたらごめんなさいm(__)m

<h1>ServiceNowの資格維持費とは</h1>
ServiceNowの認定資格の維持は、Delta試験の合格が条件になっています。

2021年あたりから年に一回維持費が徴収されるようになっています。

以前はDelta試験の再々試験から追加料金が発生する形でした。

<h1>資格維持費の請求書取得</h1>

[NowLearning](https://nowlearning.service-now.com/)にログインすると、”/lxp”に強制的に飛ばされます。
右上のアイコンをクリックして、”Profile”をクリック
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328767/a96456f2-bf90-7321-ee8b-f653a176c662.png)


"My Profile>My Invoices"と選択していくと、過去に支払った履歴が表示されます。
今回はRome,San Diegoのものが欲しいので、左の”Download Credit Card Invoice”をクリックします。
（私はクレジットカードで支払いをしたので下図のように表示されますが、ラーニングクレジットで支払った場合は不明です。）
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328767/640efeee-0a00-43f8-b1e1-c49e81f6a9d1.png)

PDF形式でダウンロードできます。
こちらの請求書の単位は米ドルとなってます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328767/d87522eb-af75-0eac-8633-49604f8ef88f.png)


<h1>おわりに</h1>
いかがでしたでしょうか？
私が「どこにあるんだよ～…」となって探して古い画像見つけて「なんだよ～…」となってヘルプ見たら書いてあったので、図ありで残しておこうと思い、記事にしました。（多分来年忘れるので）
もしこの記事が誰かのお役に立てたのであればうれしいです。

今回ダウンロードした請求書は米ドル表記ですので、会社の経理部へ持っていくときはきちんと日本円でいくら払いましたよ～ってことがわかるもの（カード明細とか）も持っていきましょう。
🍈
google 検索結果ページに桜吹雪を無限に舞わせる


# 春ですね！

昨日（2022/03/24）何気なく [「桜」で google 検索](https://www.google.com/search?q=%E6%A1%9C) したら花びら舞ってました。
doodle のロゴが変わるのはよくありますが、左カラムの検索結果表示領域まで見た目変わるの珍しいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35514/5697f809-d8b4-31ee-c523-adfc103b7e85.png)

1回表示させると30枚程度舞って落ちてなくなってしまうのが寂しいなぁと思ったので、
無限に舞わせるようにしたのでメモがてら手順まとめます（マジで需要ない自信ある）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35514/59a83ced-c71f-29a7-5b9c-684f74bed1be.png)

# 手順

DevTools でやります。


翌日の今日（2022/03/25）は単に「桜」で検索しても花びら舞わなくなってたのですが、、、
右カラムの桜の花クリックで同じように花びら舞うのに気づき、こちらでやります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35514/595aceb8-95d1-2536-be1b-e9965e2efbae.png)

mac なら「option ⌥ + command ⌘ + i」で DevTools 開けますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35514/89e94ad2-1bb1-71ca-9b45-c9e068d5ff5c.png)


## セレクタ取得

DevTools で桜の花を選択します。
＃DevTools UI 左上の斜め矢印選択して（青色になる）、桜の花要素をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35514/9255db11-0358-291f-c63d-62b07cec1bac.png)


HTML の該当要素が表示されるので、使えそうなの探すと、

```html
<img class="smm4bb" src="https://www.gstatic.com/delight/confetti/cherry/kp2_dm.gif" alt="" role="button" tabindex="0" jsaction="uG8GZb" data-atf="1" data-frt="0">
```

`class="smm4bb"` が使えそうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35514/d1166eb4-9320-8958-cce4-2ecdb4e6bb78.png)

## 桜吹雪1回実行

DevTools の Console から以下実行すると花びら一回分（30枚くらい？）舞います。

```javascript
document.getElementsByClassName("smm4bb")[0].click();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35514/9a9e5367-a510-3463-467b-7eaba3408196.png)


## 桜吹雪無限実行

DevTools の Console から以下実行すると花びら無限に舞います。

```javascript
setInterval(function() {
	document.getElementsByClassName("smm4bb")[0].click();
}, 100);
```

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35514/cf8474a4-c04a-249a-e8b3-057c2f0afecf.gif)


## まとめ

というわけで DevTools の基礎のお勉強でした。
週末花見行こう！
リーダブルコードを読んで（おすすめする人，読んでの内容，感想）

# 初めに
[リーダブルコード](https://www.oreilly.co.jp/books/9784873115658/)を読んで感じたことを書きます．参考になればと

# 読んだきっかけ
現在地方国立大学情報系の修士1年です．ここ1年間就活をしておりSIer企業に内々定を頂きました．そこで，新卒エンジニアとして入社前に勉強しようかなと思いこの本を見つけました．

# おすすめする人
　おすすめの人として，**最低限度プログラミングの知識がある人**におすすめできると思います．（初心者向けの教本くらいの知識は欲しいとこ）
　私自身この本に書かれていることの6～7割くらいしか理解できませんでした．（私自身現在，AtCoderで茶色ほどのプログラミングの能力になります．実務は約4か月IT企業でアプリ開発の長期インターンシップに参加した程度です．）

# 簡単な内容の感想

非常に基本的な内容から，少し応用なことまで書いてあります．
基本的なことであれば

- 変数や関数の名前の付け方
- コメントの書き方



応用的なことであれば
- 大きなプログラムの書き方
- テストについて

などコードを読みやすくするための具体的な方法が書かれています．
実際に基本的なことは言われてみればみたいなこともありますが，なかなか自分では気づけませんよね…
なので一度は読んで良いと思います．（私は，図書館で借りていたのですが自分で一冊もっておいて将来読み直そうと思いました!!）

# 内容のまとめ
内容についてまとめると
- 他人にもわかりやすく
- わかりやすい範囲で短く，無駄を省く

だと自分の中で感じました！！

# 最後に
少なくともエンジニアになるなら一度は読んでよい本だと思います!!ぜひ読んでみてください!!
GithubActions超解剖編：最小コードで動くコードと、リバースエンジニアリングで得た知見まとめ

:::note warn
登壇解説時にGithubActionsの説明について、挙動が分かりにくかったと思うので、一つずつリバースエンジニアリングした結果をまとめてます。
なお、ここではリバースエンジニアリングの是非については触れません。
:::

また、本稿はリバースエンジニアリングをした結果をドヤるものでもありません。
学習方法の一つとして、リバースエンジニアリングがあるよ、という紹介程度にとどめます。

## 最小構成で動くコード
一つずつチマチマやった結果、たぶんこれが最小です。

```
on: [push]
jobs:
  job_name:  # ここは任意。/actionsで見た時に表示させる名前を指定するのが良いでしょう
    runs-on: ubuntu-latest
    steps:
      - run: echo "OK"
```

一つずつ解説していきます。

- on: このCIが実行されるトリガーです。
- jobs: これがないと動かないです。シンタックスエラーになるのですぐに気付けます。
  - job_name: 項目として必須ですが、名前はなんでもよさそうです。Actions画面で見た時の名前にもなります。
    - runs-on: 実行環境です。
    - steps: 実行部分です。やりたいことはこの下に書いていきます。
      - `- run`: 使いやすいのでrunを使いましたが、動くもの（echo $?で結果を得られるもの）ならなんでもよさそうです。
      - たとえば、`- uses: actions/checkout@v2`でも問題ないです。

### 画像で見る
今回ガチャガチャいじったのは`test.yml`です。
執筆時点だとリアルタイムでガチャガチャやりながら記事を書いているので、一番上がエラーになってしまうという締まらない状況です😓
![GithubActions直後の画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/0bc447d7-826b-bf00-04b7-72f3d1b45136.png)

ポイントは、Summaryの下のアコーディオン風のサイドバーが「job_name」となっていることです。
右カラム下の「test.yml」の下にもjob_nameがあります。

![タスクを開ける](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/f9074a75-a39b-bf0d-d2d3-80ce53c7e516.png)

最後に、右カラムjob_nameを開けます。
それぞれのステップに色々書いてますね。
（Run sleep 1となっているステップは、当時sleepで出力のタイミングを制御したりしていたためです。echo "OK"に読み替える事もできます）

![詳細を開ける](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/36679e30-a977-dfd2-81b9-633b1a29f6f1.png)

## 名前をつける
まずはこれらを変えてみましょう。
名前をつけて管理しやすくすることは大切です。

```
name: test.yml書き換える場所
on: [push]
jobs:
  change:  # job_nameを書き換える
    runs-on: ubuntu-latest
    steps:
      - name: Run なんとか〜を書き換える
        run: echo "OK"
```

ちょっと分かりにくいんですが、コミットメッセージの下にあった「.github/workflows/test.yml」が「test.yml書き換える場所」に変わっています。

![コミットメッセージの下が変わってる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/82087363-53f7-18e2-098e-09207c4ddc22.png)

タイトルが「コミットメッセージ test.yml書き換える場所」になっていますね。
Summary欄も「change」になっています。job_nameから書き変わりましたね。

![変更が顕著に](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/72470145-14ec-4e2b-3c3b-2266e2d59a1f.png)

`Run sleep 1`（今回はecho "OK"に差し戻しましたが）が`Run なんとか〜を書き換える`と変化しました。
nameはそれぞれのstepにつけられそうです。

![項目名も変わる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/f1512c43-a9f3-0fab-150a-f54beed1d3ae.png)

ところで、`Set up job`と`Complete job`の名前は書き換えられないんでしょうかね。
シンタックスエラーになったので、ここの調査は諦めました。
「これはそういうものだから」と考えることにして、名前を変えられなくても困りませんので残置します。

## 本稿は受講生向けに書いていました。
何かの学習を始める際に、いったん全てを真っ新にして最小コードで動かす方法は何かを考える・調べることは学習を効率的にする助けになります。
たとえばJavaScriptやPHPやJavaなどのテキストやサイトを読む時に、書いてある内容で必須項目と任意項目が何かを気にしながらハンズオンを進めるのも一手です。
その場合、今回のように一つずつ付けたり外したりするので、エラーメッセージに助けられている実感を持つことができると思います。

いつもエラーメッセージが表示されてぐぬぬ…！している人は、「エラーメッセージは敵じゃないよ！味方だよ！」という実感をどこかでしておくと、開発（エラー）に抵抗感が少し薄れるんじゃないかと思います。
Lambdaに課金するとDynamoDBが爆速になるかも(続・AWS Lambda から利用するならもうほとんど S3 じゃなくて DynamoDB では？)

# TL; DR

Lambda の設定ででメモリサイズを増やすと、それに従って処理速度も向上するので DynamoDB の入出力速度が速くなる可能性がある

# 起きたことの概要

Node で　Lambda を動かして S3 や DynamoDB との入出力速度の計測をしていたのですが、メモリサイズの増加に伴って DynamoDB の入出力(PUT/UPDATE/GET)にかかる時間は 10ms 未満まで高速化したのですが　S3 への入出力(PUT/GET)は二桁ms代のままであった(しかも、時々 100ms 近くまで時間がかかる事があった(入出力にかかる時間が不安定である可能性がある))

このあたり、何のランタイムを使ってどのようにやるかによって結果が異なる可能性があるので、一概に言い切ることが難しいと思いました……が Lambda のメモリサイズを 128MB のまま使い続けている人は、時々ちょっと増し増しして動かしてみると処理時間がグッと改善するかも知れません。
Node - How to npm run dev at the background?

1. Used command line
```
(npm run dev&)
```

2. Used pm2
```
npm install pm2 -g
pm2 start "npm run dev" --name myAppName
```

https://medium.com/idomongodb/how-to-npm-run-start-at-the-background-%EF%B8%8F-64ddda7c1f1

https://stackoverflow.com/questions/42912067/how-should-i-use-pm2-command-for-npm-run-dev
5Gでビジネスはどう変わる？

# 5Gとは
`第5世代(5th Generation)移動通信システムのことで「超高速大容量」「超低遅延」「多数同時接続」という3つの特徴があります。`


# 5Gでビジネスがどう変わる？
### ■サブスクリプションモデルからリカーリングモデルへ
以前別記事で __クラウド__ を使用することで、ビジネスが売り切り型からサブスクリプション型へ変わるという内容の記事を書きました。
参照：[クラウド×ビジネス](https://qiita.com/7_inai_/items/befadfdc51e33d240ede)
5G時代ではこのサブスクリプション型から更に __リカーリング型__ が主流になってくると言われています。
サブスクリプション型もリカーリング型も、共に __継続収益を目的とするストック型__ のビジネスモデルですが、簡単に分けると以下のような違いがあります。
・サブスクリプションモデル：定額制(決まった額を決まった時期に納める)
・リカーリングモデル：従量課金性(使用する量に応じて金額が変わる)

※ちなみにですが、継続収益を目的とするビジネスモデル(サブスクリプションモデル、リカーリングモデル)をストック型というのに対し、商品に対して1度限りの収益を得るビジネスモデル(売り切りモデル)をフロー型と言います。
・ストック型の一般例：マンション、学習塾、保険、電話、メルマガ
・フロー型の一般例：小売店、飲食、美容院、コンビニ

リカーリングモデルについてもう少し詳しく説明していきます。
リカーリングは __循環__ という意味です。どういうことかと言うと、まず顧客に提供した価値に対して、「顧客の反応や感情」といったデータを取得します。また、そのデータを分析し更に顧客にとって良い価値を提供する。それに対する顧客のデータを取得する...というように、 __データ取得と価値提供が循環__ するのです。

またリカーリングモデルでは、IoT対応機器により収集したビッグデータが __5G__ 経由でAIによって分析されます。前置きが長くなりましたがここでようやく5Gが出てきました。もしこれが __4G__ だった場合ではどうでしょうか？
冒頭に戻りますが、5Gには次の3つの特徴があります。この3つの特徴を踏まえると想像しやすいかと思います。
>「超高速大容量」「超低遅延」「多数同時接続」

まず、4Gでは5Gほど大量のデータを保存できないため、取得するデータ量に限界があります。また、大量のデータを取得するため通信が圧迫され、データの取得速度が遅くなります。更に、同時接続台数も限られてくるため、1度に複数のユーザーのデータを取得するのが難しくなります。つまり、4Gではリカーリングモデルで求められる水準のデータ分析を行うことは困難でしたが、5Gを使用することで効率よく実現できるようになるのです。

# 終わりに
4Gから5Gに変わることでビジネスがどう変わるかを説明しました。売り切り型→サブスクリプション型→リカーリング型と変わっていっていると述べましたが、売り切り型が最も悪くリカーリング型が最も優れているというわけではありません。そのものにあったビジネスモデルを考えることが大切だと私は思います。
AWS SNSでeメールを送信する

### はじめに

前々から、AWS SNSについて学ぼうと思っていたので、今回記事にしてみました。

### AWS SNSとは

フルマネージド型のプッシュ型メッセージングサービス。
フルマネージド型サービスとはサービス提供以外にもAWS側が管理しているサービス。
サービスを利用することだけ考えればいいので、管理が楽。

### AWS SNSを実装する
まずはAWSのコンソール画面からSNSを検索。

![AWS-SNS説明資料1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1928016/c2cdfdcc-2ead-208e-3d6b-2ce4237833d5.png)

SNSの画面に遷移したら、トピックの作成をクリック。

>Amazon SNS トピックは、通信チャネルとして機能する論理アクセスポイントです。


![AWS-SNS説明資料2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1928016/07647a86-9aa2-8dac-8e38-3c695f78dee9.png)

**今回はeメールを送信する方向で実装を進めていくのでタイプをスタンダードに指定。**

トピックを作成したら、次はサブスクリプションを作成する。
トピックのエンドポイントをサブスクライブし、サブスクリプションの確認を行うとメッセージの受信が可能になる。

![AWS-sns説明資料3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1928016/fe5cff29-d428-5640-c3d4-468e1b5034f0.png)

プロトコルでエンドポイントの種類を選択。
今回はeメールでの受信を行いたいので、eメールに設定。


eメールを選択すると、プロトコルの下にエンドポイントの入力欄が出てくる。
ここでeメールを受信したいメールを入力。


サブスクリプションの作成ボタンを押すと、入力したメールアドレス宛に確認メールが届く。
確認メールの中身を開いて、確認用URLに飛んで認証をする。

これでトピックからメッセージを発行する際にeメールが送信されるようになる。

後はトピックからメッセージの発行を行うことで通知を行える。

### lambdaでSNSを実行する

**ここからはAWS lambdaでSNSを実行する手順。**

![AWS-sns説明資料4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1928016/0fff5b4e-326e-6f10-c929-2a65de0f6a77.png)


**lambdaのポリシーテンプレートからもSNS発行ポリシーをアタッチできる。**

今回はpythonの3.9で実装。



```
import boto3

def lambda_handler(event, context):
    
    sns = boto3.resource('sns')
    platform_endpoint = sns.PlatformEndpoint('MY TOPIC ARN')
    
    msg = """testです\n
             testです\n
             testです"""
    subject = "test"

    response = platform_endpoint.publish(
        Message = msg,
        Subject = subject
    )

    return response

```


これでlambda関数を実行すると、指定したメールアドレスにメールが送信されている。



### 参考資料
[boto3　ドキュメント](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html)

[AWS SNSドキュメント](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-configuring.html)
pythonによるStandard受験編数1,2(247から250)

**247**
```math
f(x)=x^3 + ax^2 + bx+c  \\
g(x) = x+3
```
とする

曲線y=f(x)は直線y=x+3と点P(-1,2)で接している。
また、y=f(x)上の点Ｑ(2,f(2)における接点は点Ｐを通る。
このとき定数a,b,cを求めよ


```Python:monda247.py
#-------------------
#247の検算
#--------------
from sympy import *
x=Symbol("x") 
a=Symbol("a") 
b=Symbol("b") 
c=Symbol("c") 
f=x**3+a*x**2+b*x+c
f1=diff(x**3 + a*x*x + b*x+c, x)
exp1=f.subs(x, -1)#f(-1)
exp2=f1.subs(x, -1)#f'(-1)
exp1=exp1-2#f(-1)=2
exp2=exp2-1#f'(-1)=1

print("f(-1)=2 →",exp1)
print("f(-1)=1 →",exp2)
katamuki=f1.subs(x,2)
katamuki

exp3=2-f.subs(x,2)-katamuki*(-1-2)
exp3

print(solve([expr1, expr2,expr3]))
```
**248**
aは実数とする。2つの曲線
```math
f(x)=x^3 + 2ax^2 -3a^2-4  \\
g(x) = ax^2-2a^2-3a
```

はある点で両方の曲線に共通な接線をもつ。
このときaの値を求めよ




```Python:monda248.py
#248
from sympy import *
x=Symbol("x") 
a=Symbol("a") 
f=x**3+2*a*x*x-3*a*a*x-4
g=a*x*x-2*a*a*x-3*a
f1=diff(f,x)
g1=diff(g,x)
print("f1=",f1)
print("g1=",g1)
expr1=f-g
expr2=f1-g1
print(solve([expr1, expr2]))

```
249
a,b,cを実数として

```math
f(x)=x^3 + ax^2 +bx+c  \\

```


とおく。曲線C:
```math
y=f(x)

```
上に異なる2点P
```math
P(s.f(s)),Q(t,f(t))
```

がある
(1)PにおけるCの接線とQにおけるCの接線が平行になるための条件を


```math
s,t,a の関係式として求めよ
```

```Python:monda249.py
#249
from sympy import *
x=Symbol("x") 
a=Symbol("a") 
b=Symbol("b") 
c=Symbol("c")
s=Symbol("s")
t=Symbol("t")

f=x**3+2*a*x**2+b*x+c
f1=diff(x**3 + a*x*x + b*x+c, x)

expr1=f1.subs(x, s)
expr2=f1.subs(x, t)
expr3=expr1-expr2
expr4=factor(expr1-expr2)
print(expr4)
print(solve([expr3],s))

```
250
```math
曲線C:f(x)=x^3 -kx上の点P(a,a^3-ka)\\
における接線がｌが点Pと異なる点Qで曲線Cが交わっている。\\
さらに、点Qにおける曲線Cの接線が直線ｌと直交している。
```
(1)点Qの座標をa,kで表せ
```Python:monda248.py

```Python:monda250.py
from sympy import *
x=Symbol("x") 
a=Symbol("a") 
p=Symbol("p")
k=Symbol("k")

f=x**3-k*x#f(x)の定義
f1=diff(f, x)#f'(x)を求める


m=f1.subs(x, a)#f'(a)を求める。接線の傾きx=aにおける
yy=f.subs(x,a)#f(a)を求める
expr1=m*(x-a)+yy#接線の方程式
expand(expr1)#式の展開


f-expr1#接線の式=f(x)を求める
expand(f-expr1)

expand((x-a)*(x-a)*(x-p))#接線があるので重解があるので以下の方程式になるので展開しとく

expand(expr1.subs(x,-2*a))#係数比較するとｐ=-2aなのでこれを接線の式に入れてｙ座標を求める

```
NaN === NaN はfalseで判定される

条件式で
```javascript
if (Number(var) !== NaN) {
...
```
のように書いて、`var`が数字文字列（例： `'1'`)だった時の処理をif文内で行おうしたら、なぜか`Number(var) !== NaN`が`true`判定されてしまい、想定通りの処理ができなかった。

調査したところ、どうやら`NaN === NaN`が`false`判定される仕様らしい。この場合、
```
if (!isNaN(Number(var)) {
...
```
で想定通り動くようになった。が、今度はeslintに
```
Unexpected use of 'isNaN'
```
と怒られる。
```
if (!Number.isNaN(Number(var))) {
...
```
これでeslint先生のお叱りも回避できた。よかったよかった。

### 参考記事
https://yosuke-furukawa.hatenablog.com/entry/2018/01/30/174425
Amazon Kinesis

# 調べる前のイメージ
SAA模試でちょこちょこ出題される。今一度知識の定着のため、主な特徴をまとめる。

# Amazon Kinesis
主にストリーミングデータの収集・処理・リアルタイム分析に利用される。
サーバーレスかつ処理ボリュームに応じて拡張するため、Auto Scaling+EC2などを自前で構築するよりも、簡単かつ低コストでデータの処理が可能。
Amazon kinesis Data Streams、Amazon kinesis Data Firehose、Amazon kinesis Data Analyticsから構成される。

### Amazon kinesis Data Streams
ストリーミングデータをほぼリアルタイムで収集することができ、収集されたデータはEMRやAWS lambdaなどのサービスに構築された独自アプリケーションに連携して処理することが可能。
また、流れてくる大容量のデータを効率的に処理するために、「シャード」と呼ばれる単位でデータを分割して処理することが可能。

### Amazon kinesis Data Firehose
独自にアプリケーションを構築することなく、ストリーミングデータをAmazonの各サービス（S3やRedshift）に簡易に配信・保存できるサービス。

### Amazon kinesis Data Analytics
ストリーミングデータに対して、SQLクエリ処理を実行し、リアルタイム分析を行うサービス。
【UE5】ルートモーション込みでリターゲットする

### 追記

本記事の内容は公式の動画でより詳しく説明されているので、こちらも参考にしてみてください。

https://youtu.be/nb8P_VmRKog

:::note warn
以下は UE5 Preview 時点での内容です。
現行の UE5 のバージョンとは仕様が異なる可能性があります。
:::

# 概要

例として、UE 標準のマネキンのアニメーションを「ウィンドウォーカー エコー」にリターゲットする。

https://www.unrealengine.com/marketplace/ja/product/windwalker-echo-01

# 1. リターゲット元の IK リグを作成する

右クリック > アニメーション > **IK リグ** を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/ed3221c3-d8c5-1d60-765a-d9e75e6da12f.png)

リターゲット元のスケルタルメッシュを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/6014a149-dee8-0756-e453-9fbb25d72637.png)

# 2. リターゲティングルートを設定する

作成した IK リグを開く。
階層タブで **pelvis** を右クリックし、「リターゲティングルートの設定」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/e41884fa-0ae7-bd44-5577-a167915a98f7.png)

# 3. リターゲティングチェーンを作成する

IK リターゲティングタブでルート、背骨、腕、手の指、頭、脚のそれぞれに対してリターゲティングチェーンを作成する。
UE 標準のマネキンと同じボーン構造であれば、下の画像のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/a9c8e9c5-97b6-4ebd-6242-3336be43d1f7.png)

階層タブで開始ボーンから終了ボーンまでを選択 > 右クリック >「選択ボーンからリターゲティングチェーンを新規作成」とすると楽。
（ヒューマノイドリグ的なプリセットが欲しい…）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/d94ec26b-ed8a-3090-d50d-c652d295cadb.png)

# 4. リターゲット先の IK リグを作成する

同様にリターゲット先のスケルタルメッシュを選択した IK リグを作成し、2. と 3. を繰り返す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/7369815a-3df0-cd9f-48f3-3e2307ccdf22.png)

# 5. IK リターゲッタを作成する

右クリック > アニメーション > **IK リターゲッタ**を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/f0302a54-8220-fea9-eb37-c7308a2bc658.png)

リターゲット元の IK リグを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/99bd9bf0-6465-4a73-1189-6a10b4acbdda.png)

# 6. IK リターゲッタにリターゲット先の情報を設定する

作成した IK リターゲッタを開き、詳細タブでリグの Target IKRig Asset にリターゲット先の IK リグを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/52541cf8-ea4b-745e-4da1-d389563595f6.png)

チェーンマッピングタブでそれぞれのターゲットチェーンに対応したソースチェーンを選択する。
チェーン名が同じ場合は、タブ上部の「チェーンの自動マップ」ボタンを押せば自動で選択される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/45797724-5c61-203a-a6e4-7572325416d9.png)

# 7. ルートチェーンのトランスレーションモードを変更する

チェーンマッピングタブでルートチェーンを選択し、詳細タブで FK アドジャストメントのトランスレーションモードに **Globally Scaled** または **Absolute** を選択する。
この設定を行うことで、ルートボーンの移動量がリターゲットされるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/943fbd55-8a02-491c-d391-c4bb374474bb.png)

# 8. リターゲットされたアニメーションをエクスポートする

アセットブラウザタブでリターゲットしたいアニメーションを選択し、タブ上部の「選択したアニメーションをエクスポート」ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/b59e0304-f8f6-91c5-ffb3-669890d374b4.png)

# 結果

![result.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239989/3730fe22-3061-b925-b1ee-91c6ed0ea5ed.gif)
Railsで作成したアプリをGitHubで管理する方法

# 結論　　　　

アプリを保管するための倉庫を`自分のパソコン`（local repository）と`GitHub`(remote repository)上に作成して、`送り込む`(push)。

### ちなみに

remote: 遠隔
local: 地元
repository: 倉庫、保管庫


## 1.リモートリポジトリを作成

```
GitHubで新規リポジトリを作成する。
```

## 2.ローカルリポジトリを作成し、送り込むための準備

```ターミナル
$ git init　　　　　　　　#local ripositoryが作成されるだけ

$ git add . 　　
 
 # 編集中のコードをGitで管理対象にするという意味のコマンド　　　
 # 'index'にステージングともいう

$ git commmit -m  ”どんな機能を実装したのか等のコメントを残す”  
 
 #local repositoryにプログラムを保存するコマンド
 #これでremote repositoryに送り込む準備は整った
```
### ちなみに
initialize：初期化、使える状態にする
add: ~を追加する
commit:　記録などを書き留める

## 3.ローカルリポジトリからリモートリポジトリへ送り込む
```
$ git remote add origin URL #GitHubでURLをコピーし、貼り付ける
 #データの送り込み先を指定している

$ git push origin HEAD
 #local reppsitory　から remote repository へ送り込まれる
```

これでGitHubで管理することができます。
以上です。
【備忘録】Django IISデプロイ

## 経緯
社内本番環境へデプロイした際に、半日ほどはまったので、
対応した内容を個人的備忘録として残しておく。
他の環境に影響を与えないよう、仮想環境を使用。

## 参考にさせて頂いたサイト
1. DjangoのチュートリアルをIISにデプロイする①
https://qiita.com/reinexxx/items/ad60261815a5555e914e

2. Python(Django) をWindows+IISで動かす
https://qiita.com/miltood/items/14491e1da28bd953ee4c

## IISのインストール
なにはともあれインストールします。
インターネットインフォメーションサービスを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521517/d2832b3e-3d3f-ed36-3dae-481750a67fd1.png)

CGIを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521517/bae40c0a-4072-7a60-9485-73bb31f2e97e.png)

## 開発したdjangoフォルダを展開
ここでは下記に展開したとする。
C:\django_apps

## IISのサイトに追加
Webサイトに追加を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521517/1e587a07-70d1-71c9-5090-54c3ee7cd171.png)

サイト名は「django_apps」とした。物理パスはmanage.pyがある階層を設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521517/b89f1bbd-f23d-148e-e3df-d494fe23b72a.png)

## MySQLユーザ追加 ※MySQLを使用する場合のみ
作成権限のあるユーザでMySQLにログイン。
~~~:MySQL
CREATE USER user_name IDENTIFIED BY 'PW'
~~~
スキーマを追加。MySQL workbench（GUIで操作ができるツール）より操作するのが簡単。
作成したユーザに対して、スキーマに対するALTER権限など付与する。これもworkbenchからがすごい楽。

https://www.mysql.com/jp/products/workbench/

## 仮想環境（virtualenv）構築
~~~:cmd
pip install virtualenv
virtualenv myenv
myvenv\Script\activate
~~~
ここまでで仮想環境が起動。
requirements.txtをインストール（django含）
~~~:cmd
cd C:\django_apps
pip -r install requirements.txt
~~~
必要ライブラリがインストールされる。IISで必要なwfastcgiをインストール。
~~~:cmd
pip install wfastcgi
~~~

## IIS環境構築
管理者権限でコマンドプロンプトを起動する。
仮想環境に起動し、IISにwfastcgiを設定する。
~~~:cmd
C:\myvenv\Script\activate
%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers
wfastcgi-enable
~~~
web.configをmanage.pyがあるフォルダに設置する。
中身は下記。
~~~:web.config
<configuration>
  <appSettings>
    <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
    <add key="PYTHONPATH" value="C:\django_apps" />
    <add key="DJANGO_SETTINGS_MODULE" value="mysite.settings" />
  </appSettings>
  <system.webServer>
    <handlers>
        <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="c:\myenv\scripts\python.exe|c:\myenv\scripts\lib\site-packages\wfastcgi.py" resourceType="Unspecified" />
    </handlers>
  </system.webServer>
</configuration>
~~~

## 一旦起動してみる
IISが開始されていることを確認し、ブラウザからアクセスしてみる。
閲覧はできたが、CSSが効いていない。

## collectstaticコマンド実行
settingsファイルのDEBUG=Falseにすると、DEBUGの際に使用していたstaticフォルダにアクセスできなくなる。
それを綺麗に１つのフォルダに集めてくれるコマンドを実行する。

仮想環境に入り、下記コマンドを実行する。
~~~:cmd
python manage.py collectstatic
~~~

この状態でもう一度アクセスしてみるが、CSS類が軒並み404エラーになる。めちゃくちゃはまったが、解決方法は下記。

## web.configをもう一つ設置する
IIS全体のweb.configとは別に配信の例外ルールを記載した静的ファイル用のweb.configを作成し、
collectstaticで作成されたstaticフォルダ直下に設置する。中身は下記。
なので、全体で２つweb.configを用意する必要がある。
~~~:web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <remove name="Python FastCGI" />
    </handlers>
  </system.webServer>
</configuration>
~~~
これで、無事CSSが読み込まれるようになった。

## 参考（他要因でつまづいた部分）
一旦起動してみた際に、エラー発生（※詳細を失念、別途記載します）。
本番環境へファイルをデプロイした際に、下記ファイルをsetttingのフォルダとviewのフォルダから削除していたのが原因。
設置しなおして、完了。
~~~
__init__.py
~~~

# 結果
無事デプロイができました。
node.jsでslackのchat.postMessageで改行ができなかった

node.jsでslackの@slack/web-apiを使った際ににてchat.postMessageで改行がうまくいかなかったのでメモ。

<pre>await app.chat.postMessage({
   channel:channel_id,
   text:"Hello &yen;n World!",
});</pre>

「&yen;n」を「\n」にするだけだった。

<pre>await app.chat.postMessage({
   channel:channel_id,
   text:"Hello \n World!",
});</pre>
Scipyの階層クラスタリング結果をNewick形式に変換する

Scipyで階層クラスタリングを実行した時に、結果として出力されるデンドログラムをSeaviewのような系統樹ビューアで見れるようにしたいと思ったのでNewick形式での出力を試みた。

やり方を調べてみると、stackoverflowに今回の目的と同じことを質問している人がいて、参考になる実装コードが回答に提供されていた。

https://stackoverflow.com/questions/28222179/save-dendrogram-to-newick-format

以降、上記サイトのコードを参考に実装例と出力結果を記載する。

# コード実装例

クラスタリング結果のデンドログラムツリーは木構造ノードオブジェクト([ClusterNode](https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.ClusterNode.html))で表現される。下記の実装(dendrogram2newick)では、木構造のルートノードから再帰的に子ノードを取得して、各ノードに対応するデータを文字情報として連結していくことでNewick形式へ変換する。

```python
import numpy as np
import scipy.cluster.hierarchy as hc
from scipy.cluster.hierarchy import ClusterNode
from typing import List

def dendrogram2newick(
    node: ClusterNode, parent_dist: float, leaf_names: List[str], newick: str = ""
) -> str:
    """Convert scipy dendrogram tree to newick format tree

    Args:
        node (ClusterNode): Tree node
        parent_dist (float): Parent distance
        leaf_names (List[str]): Leaf names
        newick (str): newick format string (Used in recursion)

    Returns:
        str: Newick format tree
    """
    if node.is_leaf():
        return f"{leaf_names[node.id]}:{(parent_dist - node.dist):.2f}{newick}"
    else:
        if len(newick) > 0:
            newick = f"):{(parent_dist - node.dist):.2f}{newick}"
        else:
            newick = ");"
        newick = dendrogram2newick(node.left, node.dist, leaf_names, newick)
        newick = dendrogram2newick(node.right, node.dist, leaf_names, f",{newick}")
        newick = f"({newick}"
        return newick

# クラスタリング結果が明らかなテストデータ
num_list = [2, 5, 10, 3, 0, 6, 7, 9]
name_list = [f"num={num}" for num in num_list]
# クラスタリングしてデンドログラムツリーを取得
linkage = hc.linkage([[n] for n in num_list], method="ward")
tree = hc.to_tree(linkage)
# dendrogram2newickでNewick形式に変換
newick = dendrogram2newick(tree, tree.dist, name_list)
print(newick)
```

# 出力結果

```
((((num=6:1.00,num=5:1.00):0.73,num=7:1.73):3.69,(num=9:1.00,num=10:1.00):4.42):5.68,((num=3:1.00,num=2:1.00):1.89,num=0:2.89):8.22);
```
出力結果をSeaviewで下記のように正常に読み込むことができた。
![newick_seaview_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/5021e7d1-c3a5-08e1-5ec3-ab7565017fe1.png)
UiPath ブラウザIE11からEdge変更のノウハウ_3

前回からの続きです。下記からご確認くださいね！
UiPath ブラウザIE11からEdge変更のノウハウ_1
https://qiita.com/rpa_hanako/items/3146a7cec384a071cf24
UiPath ブラウザIE11からEdge変更のノウハウ_2
https://qiita.com/rpa_hanako/items/fd31f2195bc599fc7409


# セレクター
## 「クリック」アクティビティ
「UiPath ブラウザIE11からEdge変更のノウハウ_2」で作成した
シナリオのアクティビティ「クリック：PDFファイルを保存」のセレクターの比較です。
左は「IE11」右は「Edge」です。
![セレクター比較.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/d26acbf2-c351-27b9-addc-5481523f25d9.png)

大きな違いは「app='msedge.exe'」を入力することでEdge対応することができます。
シンプルなものは「app='msedge.exe'」を入力するだけでOKです。
今回IE11に「app='iexplore.exe'」の記載はないですが、ある場合は削除して「app='msedge.exe'」に変更してくださいね。

### セレクター操作方法
「セレクター編集」を選択して「セレクターエディター」を開いて
![セレクター編集.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/4b76f428-3c44-dd3f-5ffc-5a8f4b9a4cf2.png)

「セレクターを編集」に直接「app='msedge.exe'」と記載してください。
![セレクターを編集.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/1d0ad346-2264-3eed-160c-7e8c3fe43d4f.png)


もしくは、「要素を選択」で再度要素を選択すると自動的に「app='msedge.exe'」が入力されます。
![セレクター1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/0e98de04-3918-0aa4-9b47-58943c469458.png)

左上の「検証」が緑になっていればＯＫです。
赤もしくは黄色であれば緑なるようにセレクター変更をしてみてください。

## 変化に強いセレクター設定！
こちらも上記同様「app='msedge.exe'」を変更。
さらにですがよく見ていただけるとわかりますが、「title='ご契約者さま｜◎◎ - Microsoft​ Edge'」の部分をできるだけ正規表現に変更するようにしています。セレクターを再取得で取得直後は下記のようになっておりセレクター情報が多くなっていきます。不要な情報はなるべく削除していくとサイト変更などに強くなります。
![セレクター変更前.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/da26926f-1f02-a4fb-6373-60035de781e3.png)

変更後は下記のようにすっきりさせました。「title='ご契約者さま*Microsoft​ Edge'」のようにアスタリスクを使って名称変更に対応しています。余計な空白は特に注意します。
![セレクター変更後.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/004f7e52-0408-a571-0445-f7a9c86138db.png)


# まだまだある細かい違い！
大きな違いは「ダウンロード」と「セレクター」になりますがそれ以外もちょっとした動作違いがありました。

## 「アプリケーションを閉じる」
IEで複数タブ開いていると下記のような通知を見たことありますでしょうか？
この通知が出るのでクリックの動作が追加で必要になってきますが、Edgeの場合はこの操作は必要ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/4bba0a10-16a5-2874-4105-9908b576d81e.png)

## 「クリック」
IE11 の時は問題なかったのにEdgeだとクリックが空振りしてしまうということがありました。
そういうときは「クリックをシミュレート」を「True」をしてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35333/c0a55ed1-a756-edf5-21a8-b65c57fc935e.png)

# 感想
IE11からEdge変更を初めて手作業でやってみて、かなり大変でした。ですが、やらないわけにはいきませんから、試行錯誤してやりました。

工数は1シナリオ10人日から14人日ほど。
シナリオ修正だけでなく、環境構築、ドキュメント修正やリグレッションテストなどなど含めてます。
シンプルにシナリオ修正だけは3人日から5人日ぐらいでした。

IE11とEdgeの影響の大きな違い
・CSS（スタイルシート）の取り方が違うこと
・IE11とEdgeの振る舞いが違うこと

この違いを意識して改修作業頑張ってください〜！

【UiPath ブラウザIE11からEdge変更のノウハウ】シリーズはこれで最後になります。
また思い出したら追加していきます。

最後まで読んでいただき、ありがとうございました！
ITIL(V3-2011) ファンデーション受験記

# はじめに
今更な感じではありますが、ITIL(V3-2011)ファンデーションを今年2月に受験し合格しました。
受験するにあたって私自身が感じたことなどを記載していこうと思います。

※2022年現在、2019年に誕生したITIL4が最新となっています。
ITIL4はITILv3のステップアップ的な位置づけのようでしたので
ITILの基礎的な知識を身に着けたいと考え、ITILv3を受験しました。

# ITIL(V3-2011)ファンデーション試験について

ITIL(V3-2011)ファンデーションの試験概要は以下の通りです。

・試験方式：CBT方式
・出題数：40問
・出題形式：4択
・試験時間：60分
・合格基準：26問以上の正解（65%）
・受験料：43,890円（税抜）
・試験日：随時（テストセンターにより異なる）
・受験資格：特になし

# 学習方法について

学習時間は平日1日1時間程度で1か月程です。
通勤中や仕事の空き時間、休憩時間に黄色本と呼ばれる
[ITIL ファンデーション シラバス2011](https://www.shoeisha.co.jp/book/detail/9784798125701)と[Ping-t](https://ping-t.com/)の問題集で勉強しました。

黄色本で各プロセス毎に勉強して、Ping-tでも同じく各プロセス毎に模擬試験を受け、
よく間違える問題や理解できていない用語は黄色本やPing-tの解説を読みつつノートにまとめる。
Ping-tで全問正解（コンボ318）になったら、全問を通しで解いて90%以上を
連続で3回ほどとれるようになるまで自由演習を行いました。

極力お金をかけたくなかったため私は利用しませんでしたが、
[クラムメディア](https://www.crammedia.com/EX0-001-ITIL-Foundation-syllabus-2011/p/247/204)で販売されている問題集はネットの評判を見る限り
的中率が高く、ほぼ同じ問題が本番でも出題されるらしい。

1か月6,000円と少々お高いですが、確実に合格したい方は利用するのもいいかと思います。

# 試験の流れについて

札幌市のテストセンターで受験しました。
受付では身分証明書2つ（写真入り身分証明書＋保険証や署名入りクレジットカードなど）を
見せて本人確認をします。私は運転免許証と署名入りのクレジットカードを出しました。

試験会場に持ち込めるのはハンカチ、ティッシュ、目薬、写真付き身分証明書と
ロッカーのカギでそれ以外のものはすべてロッカーへ。

必要なものは事前に手元に用意し、受付で見せてから入室する流れでした。
机にはメモ用紙や筆記具、ほかにイヤーマフが用意されています。
上記持ち込んだものは机の上に置いておきます。

実際の試験についてはそれほど難易度は高くありませんでしたが
この試験特有なのか？海外の資格特有なのか？問題文や回答文の言い回しがわかりづらく、
私が学習の為に利用したPing-tや黄色本の問題文との違いがあり、少し面食らいました。

試験の合否は試験終了時にPCの画面に表示されます。
具体的な得点や合格証書については試験終了後、登録したメールアドレス宛にリンクが
届くようになっていてメールのURLから受験番号など入力して確認できます。
合格証書を紙で欲しい場合は別途申請（有料）する必要があるみたいです。

試験終了15分前くらいで完了し無事、約8割の正解率で合格することができました。

# 最後に

合格できてひとまず安心しました。
受験費用も会社の資格取得補助制度のおかげで戻って来ています。ありがとうございます。

ITIL4がリリースされて早3年経っており、また、ITIL3ファンデーションの英語版については
すでに配信終了しているため、日本語版も近いうち終了になるとみられます。
ITIL4を受けるべきだったかな？

これから勉強を始められる方はITIL4取得を目指すのがよろしいかと思います。
pandasデータフレーム特定列に対し、条件別で文字列から数値を抽出

↓コンペのデータ前処理で、処理時間のかかるコードを書いてしまったため、反省の意味を込めて共有。。
https://www.nishika.com/competitions/25/summary

# 1. 対象となる処理:
 DataFrameのobject型pandas DataFrameにおいて、Object型(文字列型)である特定列から、数値のみ取り出す。

例: 和暦(平成20年, 令和1年)を、西暦(2008, 2019)のように変換。

# 2. 対象データのイメージ
以下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194473/cd864483-1e9b-18bb-3fd8-950abeda2be8.png)



# 3. 解決法
以下流れのコードを書きました。
70万行のデータですが、概算2秒弱ほどで処理終了いたしました。
変更前(4.に記載)のコードは10min(600秒)ほどかかりました。

1. 対象列(column)のuniqueな値をキー、
和暦と西暦の整合性をとる数字をアイテムとした
辞書(jap_yeaar)を作る

2. キーごとに対象indexをリストでとってくる
3. pandasのstr.extract(("\d+))[0]を使い、
　　文字列から数値部分のみとってくる。
 　※イメージ "平成15年"　から 15　をとってくる。
4. 3.でとってきた数値と、辞書(jap_year)のitemを加算する。

```python

jap_year = {"戦前":1920,"昭和":1926,"平成":1989,"令和":2019}

for k in jap_year.keys():
    #indexをリスト型でとってくる。
    index = df_train.index[df_train["建築年"].str.startswith(k) == True].to_list()
    
    if k == "戦前":
        df_train.loc[index,"建築年"] = 1920
    else:
        df_train.loc[index,"建築年"] = df_train.loc[index,"建築年"].str.extract("(\d+)")[0].astype(int) + jap_year[k]

```

# 4. 変更前のコード
実行に10分ほどかかるコードです。
re モジュールで文字列から数値を取り出すことが先行し、
70万行あるデータを1行ずつ変更しようとしたものになります。。

```python
import re
import numpy as np

#学習用データ
for i, x in enumerate(df_train["建築年"]):
    
    if pd.isna(x): #欠損値の場合、変換しない。pd.isna()使うと、文字列型の欠損値判定できる。np.isnan()では不可能。
        pass 
    
    elif x[0:2] == "昭和":
        s = df_train["建築年"][i]
        year = int(re.sub(r"\D", "", s))
        df_train["建築年"][i] = year + 1926
        #print(year + 1926)
    elif x[0:2] == "平成":
        s = df_train["建築年"][i]
        year = int(re.sub(r"\D", "", s))
        df_train["建築年"][i] = year + 1989
        #print(year + 1989)
    
    elif x[0:2] == "令和":
        s = df_train["建築年"][i]
        year = int(re.sub(r"\D", "", s))
        df_train["建築年"][i] = year + 2019
        #print(year + 2019)
        
    elif x[0:2] == "戦前":
        df_train["建築年"][i] = 1920

```

以上です。最後までみていただき、ありがとうございました！
【Linux】パーティション操作の練習・検証方法

Windowsに慣れている人にとって、Linuxにおけるパーティション操作は複雑で難しいです。
また、一歩間違うとファイルシステムが壊れてしまったり、OSを再インストールしなければいけなくなったりするなど、リスクも大きいです。
操作を練習、検証したりして、手順を確立してから実際の作業を行うのが望ましいです。
そのためには、練習・検証用の環境が必要です。
この記事では、Linuxにおけるパーティション操作の練習・検証するための手段を簡単に紹介します。

## パーティション操作の練習・検証方法概要
簡単な方法としては以下の3つが挙げられます。
- 物理ディスクを挿す
- 仮想化ソフトウェアの機能で仮想的にディスクを追加する
- ループバックデバイスを使用する


マシン環境が物理なのか仮想なのかで、上記方法の実現性が変わってくるので、下記の表にまとめておきます。

|| 物理マシン | 仮想マシン |
| :---| :---: | :---: |
|物理ディスクを挿す|〇|〇<br>ホストマシンにUSBを挿すと、仮想化ソフトウェアが検知し、<br>あたかも仮想マシン側に直接挿したかのように扱うことができます|
|仮想化ソフトウェアの機能で<br>仮想的にディスクを追加する|×|〇|
|ループバックデバイスを使用する|〇|〇|

## 物理ディスクを挿す
余っているUSBメモリや外付けHDDなどをマシンに挿し、検証に利用します。
どんなに古くて容量が小さいものでも、マシンに挿して認識されるのであれば検証用としては十分です。
仮想マシンでも、USB機器を利用することができます。
下記で、VMWare Workstation 15 Playerで操作の一例を示します。(OSはCentOS7です)

### 仮想マシン(VMWare Workstation 15 Player)にUSBメモリを挿す
仮想マシンを立ち上げた状態で、USBメモリを挿します。
下の画像のように「新しいUSBデバイスが検出されました」とポップアップが表示されます。
「仮想マシンに接続」、対象仮想マシンを選択し、OKをクリックします。
![vm_usb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524631/57213bfc-db20-aa26-8612-6434de9ab4e7.png)
lsblkコマンドで確認すると、どこにもマウントされていないsdbというディスクがあることがわかります。これが先ほど挿したUSBメモリです。

```
# lsblk -i
NAME                          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                             8:0    0   50G  0 disk
|-sda1                          8:1    0    1G  0 part /boot
`-sda2                          8:2    0   49G  0 part
  |-centos_vpc01-root         253:0    0   47G  0 lvm  /
  `-centos_vpc01-swap         253:1    0    2G  0 lvm  [SWAP]
sdb                             8:32   1 14.9G  0 disk
`-sdb1                          8:33   1 14.9G  0 part
```


## 仮想化ソフトウェアの機能で仮想的にディスクを追加する
仮想マシンであれば、仮想化ソフトウェアの機能で、仮想的にディスクを追加することができます。
仮想ディスクであればファイルシステムを壊そうが何が起きようが怖くないのでいくらでもガチャガチャできます。
ここでは、VMWare Workstation 15 Playerでの操作方法を説明します。
まず、仮想マシンの設定を開きます。
ハードウェアタブで「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524631/74fdf093-b102-c157-628c-9965d0a8e546.png)

「ハードディスク」を選択し、「次へ」をクリックします。
SCSI(S)を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524631/50f30cfd-02ae-98ac-f71c-72282f94c537.png)

「仮想ディスクの新規作成」を選択し、「次へ」をクリックします。
ディスクサイズを設定します(ここでは1GBとしています)。
「仮想ディスクを複数のファイルに分割」を選択します。
「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524631/330afd06-4612-6079-36cb-03c4318e0b86.png)

「完了」をクリックします。
「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524631/59a08d25-2330-1234-07e9-11d12d67a640.png)

これで1GBの仮想ディスクを追加できました。

## ループバックデバイスを使う
ループバックデバイスとは、一般的なファイルを，あたかもハード・ディスクなどのデバイスであるかのように扱う機能です。この機能を使って、パーティション操作の検証を行うことができます。今回は具体的な操作方法は割愛します。
【Linux】ディスク構成、パーティション構成の確認

Linuxを触り始めたころ、

- このマシンにはハードディスクが何本挿さっていて、パーティション分割はどうなっているのか？
- sdaとかsdbとかsda1,sda2とか何なんだ？

などが個人的分かりづらいと思っていました。
初歩的な話ですが、自分の復習も兼ねてまとめます。

## ディスク・パーティションの確認
```
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sdb  /dev/sdb1  /dev/sdb2  /dev/sdb3  /dev/sdc  /dev/sdc1
```
- <strong>sda,sdb...はLinuxにおけるハードディスクのデバイス名</strong>
/devにsdaやsdbなどのファイルがあります。
これらが、**挿さっているディスクを示すファイル**です。
このようにLinuxでは、**HDDやUSBメモリなどの装置を/dev/sdaなどのデバイスファイルとして管理**します。
上の例では、sda、sdb、sdcがあるので、ディスクが3本挿さっていることになります。
- <strong>sda1,sda2などの数字はパーティション番号</strong>
sda1,sda2などの数字はパーティション番号です。
例えば上の例のようにsdb1~sdb3がある場合、sdbというディスクが3つのパーティションに分割されていることを意味します。
sdaとsdcはそれぞれsda1とsdc1があるので、パーティションは一つだけとなっていることが分かります。

## lsblkコマンド
ディスク構成、パーティション構成を確認するにはlsblkコマンドが便利です。
下の例では、「lsblk -ip」と実行しています。ここで、「-i：ascii表示」、「-p：フルパス表示」です。
ディスクが何本挿さっていて、それらがどのようにパーティション分割されているのか、論理ボリュームの構成、マウント先などが分かります。
例えば、/dev/sdaはパーティションが1つで、それが論理ボリュームによって2つに区切られていることが分かります。
論理ボリュームの内lv_nasは、/mnt/usbhddにマウントされています。
/dev/sdcはパーティションが1つで構成されています。sdc1はマウント先がありません。そのためsdcというディスクは挿さっているだけでどこにもマウントされていないことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524631/b1bf165c-b936-3546-f4c2-2dae23448337.png)
OODA とは

## 勉強前イメージ

PDCAのお友達？

## 調査

### OODA とは

OODAでウーダと読み
`Oberve:観察` , `Orient:状況判断` , `Diecie:判断` , `Action:行動` の頭文字を取ったものになります。
意思決定と実行の一連の流れを表したもので状況の変化に対して柔軟に対応できるというフレームワークになります。

- Oberve:観察

現状を確認し、情報を収集します。
この段階での推測はせず、事実のみの情報収集をします。

- Orient:状況判断

収集した情報を元に判断を下します。
この段階では、今までの傾向や経験などを元に判断します。

- Diecie:判断

上記の観察と状況判断から具体的に次行う行動を決定します。

- Action:行動

上記で判断したことを実行します。
実行が完了すれば、また観察に戻ってループを繰り返します。

### PDCAとの違い

そもそもPDCAとは
Plan(計画), Do(実行), Check(評価), Act(改善) のサイクルを回すことで問題の解決を行います。
基本的には、PDCAは最初の計画を重視します。

PDCAとの違いとしては何に重点を置いてるか、になります。

- OODA : 当初立てたプランを達成するため、プロセスを重視
- PCDA : 柔軟な判断や実行を重視

OODAのメリットとしては状況に対して素早い対応ができるところですが、
長期的な改善などには向いておらず、その場の対応が多くなります。

## 勉強後イメージ

PDCAよりはその場の対応ってのが多いイメージがした。
状況が変化しやすい状況ならこっちのほうがいいかもしれない？

## 参考

- [OODAとは？ 意味、PDCAとの違い、実行手順、メリット・デメリット、取り入れるためにやるべきことについて](https://www.kaonavi.jp/dictionary/ooda/)
- [「OODA」って知ってる？PDCAの次に流行るかもしれないビジネスメソッド](https://www.jscore.co.jp/column/lifestyle/2017/ooda/)
化石エンジニアの野良リカレント教育～わからないことリスト～

# 前段：

●年前は現役プログラマーだったが、PLだのなんだのやっているうちにすっかり最前線から遠ざかり、自身が生きるレガシーとなった化石エンジニア・アンモナイト（現在地・太古の海の底）が上陸→人類を目指して、再勉強を始めた。
　「●年前」のヒント1：こんなレガシーエンジニアでも、いまだにだいたい読めるSQLの普遍性と不変性はすごい。
　「●年前」のヒント2：こんなレガシーエンジニアなので、変数と定数は型まできっちり宣言しないと、なんか気持ち悪い。え、定数がないって、どういう、こと……？

# 1：わからないことリストとは：

現在、レガシーエンジニアのアンモナイトは自分を再教育中である。
他社研修（サイボウズ様、ありがとうございます）を視聴した結果、
「自分がどこでおいていかれているのか」
「何が理解できないのか」
がわかってきた。

下記が今後の（自分の）教育方針：

現在地把握（他社研修視聴）：Done!
　→わからないこと把握（リスト化・見える化し、調査）：Done!
　　→のばしたいところ把握（やりたいこと・興味を感じたこと）：in progress
　　　→わからないところ・のばしたいところ、それぞれをフォローしていく：To do

今宵、わからないことリストをさらしてみようと思う。

# 2：わからないことリスト：

わからない化石がわからないことをリストアップしているので、
「おいおい、そもそもリストの分類がちげえよ！」とツッコミたくなる誤りや、
「あー……残念過ぎる」と目を覆いたくなる方もいるかもしれない。
そっと目薬を差しだすので、涙をぬぐってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1668633/052da290-c387-de79-4792-e89ae89b2fcb.png)

あれ、なんかめっちゃ細かくてほぼ読めないリストになってしまった……。
要はIT系を19に分類して他社研修で聞いた単語やニュースで見た単語をチェックしてみた結果、
「赤字＝わからぬ…」/「青字＝わかる」になりました。
小さすぎて詳細見えないと思いますが、一瞥しただけで、「ほぼ真っ赤」ということは判明できる。
だが、全方面をカバーする必要はなく、課題の明確化のためにリスト化したので、
「得意ジャンルと必要最低限の知識が必要なところ」が見える化されればOK。

なので、次に着手すべきはやっぱり、「Python」「Kaggle」かなと思います。
最終目的はアプリ作成だが、いまは絶対できないという揺るぎない自信と自負がある。（断言）

では次回から、再度、Pythonで挑戦するKaggleで行ってみよう！

本日は以上で終わりです。お付き合いいただき、ありがとうございました！
alertの「 OK」を押すと処理を実行

今回説明するのは、アラートダイアログの「OK」ボタンを押した時、
特定の処理をする方法です。

_JSコード_
```
alert("タゴちゃん");
```
![スクリーンショット 2022-03-25 20.37.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521240/19f0c3f1-b212-e7e7-ba58-4fbb1d2ec244.png)
まずは基本的な「alert」メソッドの説明です。
このようにalert()を使用すると、ダイアログと「OK」ボタンが表示されます。
この「OK」を押すとダイアログが消えるというものです。

今回はこの「OK」が押された時に何か処理を実行させていきます。
まず理屈として「alert」で「OK」を押すと、
戻り値としては「true」でも「false」でもなく、「undefined」が返されます。なので、

_JSコード_
```
if(!alert("タゴちゃん")){
	//「OK」が押されたら実行する処理
}
```
このようにif文の条件式内にalertメソッドを入れ、
返される戻り値である「undefined」を否定して、
条件式内を「true」にするための「!」を追加しています。

_JSコード_
```
if(!alert("タゴちゃん")){
	document.write("タゴちゃんです");
}
```
![スクリーンショット 2022-03-25 20.37.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521240/9aad5a88-1ef5-498e-e575-e0cee3459559.png)
↓↓↓↓↓↓↓↓↓↓↓
![スクリーンショット 2022-03-25 20.44.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521240/ceee7ec6-0719-caaa-2653-f28759ad83ed.png)
「処理」部分に上記コードを記述することで、
アラートダイアログの「OK」ボタンを押したら、
ブラウザ上に「タゴちゃんです」と自動で表示されるようになりました。

今回の説明は以上です。
ご購読ありがとうございました!
multipass のインスタンスは、日本語化するとコマンドが受け付けられなくなる？


こちらの記事で、Ubuntu１８.０４で、multipassのことを書きました。

https://qiita.com/masaru21/items/e38fa560b5e759b8502f

色々と試している中で、インスタンスにリモートディスクトップで接続できたことので、日本語化しようとしました。

こちらの記事を基に、ubuntu-desktopとxrdpをインストールしました。

https://zenn.dev/kujirahand/articles/f70183a6f19879

でも、何故かメニューなど日本語にならなかったのです。
薄く長い英語のメッセージが、地域と言語の設定の画面で日本語を選択しようとすると出ていました。
![VirtualBox_Ubuntu0319_26_03_2022_10_47_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/dfefcde7-6086-2720-f73f-f715e4c6af7f.png)

2022/03/26この画像の言葉を機械翻訳してみました。

:::note warn
この 設定 は、 デスクトップ と アプリケーション が 表示 さ れる 言語 に のみ 影響 し ます。 通貨 や 日付 形式 の 設定 など、 システム 環境 は 設定 さ れ ませ ん。 その ため に は、[ 地域 の 形式] タブ の 設定 を 使用 し ます。 ここ に 表示 さ れる 値 の 順序 によって、 デスクトップ に 使用 する 翻訳 が 決まり ます。 最初 の 言語 の 翻訳 が 利用 でき ない 場合 は、 この リスト の 次 の 言語 が 試 さ れ ます。 この リスト の 最後 の エントリ は 常 に「 英 語」 です。 「 英 語」 の 下 の すべて の エントリ は 無視 さ れ ます。
:::

それで、シェルから日本語化すると良いかもと閃いて、試しました。
そうしたら、下記の画像のように、コマンドを入力すると文字化けしてしまいました。

![VirtualBox_Ubuntu0319_25_03_2022_20_05_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/2954673e-183f-50f6-7b3f-d9800338a29c.png)

慌てて下記の記事を見つけて、英語に戻そうとしました。

https://www.kwonline.org/memo2/2020/09/23/ubuntu-20_04_update-locale/

でも、直すことができませんでした。

念の為、プライマリーとして作ったインスタントのシェルを確認したら、無事でした。
影響を受けていなかったので、今回文字化けしたインスタントは、削除することにしました。

こちらの記事でも日本語入力できるようにしていますが、デスクトップ全体を日本語化はしていませんでした。

## 日本語化できないかも
今回の経験から、multipassで作ったインスタンスは、日本語化できないと思われます。