OmniAICreator/Qiita-1.07M huggingface dataset:
クロスアカウント・クロスリージョンなCodePipelineを実行する

# はじめに
[以前の記事](https://qiita.com/neruneruo/items/0daf2b30c59582007c4e)で、クロスアカウントなパイプラインを実行するコツをまとめてみた。

今回は、さらにこの2つのイベント連携部分をクロスリージョンにするにはどうしたら良いかを考えた。

最初に結論を書いておくと、CodePipelineのクロスリージョンアクションを使うのが良い、ということだ。

【AWS公式】[CodePipeline でクロスリージョンアクションを追加する](https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/actions-create-cross-region.html)

# 検討経緯
以下の記事を参考にして、CodePipelineの完了時にS3にファイルを突っ込んでトリガしたり、サービス側アカウントにSNSトピックを置いて、CodePipelineの完了時にビルドアカウント側からPublishしてリージョン跨ぎのLambdaを起動したりした。

【参考】【Developers.IO】[S3 Event Notificationを別アカウントのリージョンの異なるAmazon SNSに送信し、Lambdaを発火させる](https://dev.classmethod.jp/articles/s3-event-notification-sns-lambda-cross-region-cross-account/)

多少強引ではあるが、これなら別リージョンのCodePipelineに着火することはできそうだった。

だがしかし、結局は**CodePipelineのソースステージがクロスリージョン対応していなくて、別リージョンのCodeCommitを参照できない**ので、どうにもならなかった。S3でソース連携とか、あまりに泥臭すぎる。

素直にCodePipelineとソースステージは同一リージョンに置いて、ビルド・デプロイステージをクロスリージョンアクションを使うのが良いだろう。

# クロスリージョンアクションのためのIaC(Terraform)
マネージメントコンソールでの実施方法はAWS公式にもあるので、ここではTerraformの書き方を残しておく。

と言っても、そんなに難しいことではない。
以下のように、2つのリージョンのアーティファクトストアを用意して、★の箇所に```region```のプロパティを設定すれば良い。このケースでは、[以前の記事](https://qiita.com/neruneruo/items/0daf2b30c59582007c4e)のビルド側アカウントを```ap-northeast-1```、サービス側アカウントのクロスリージョン対応を```us-east-2```で行っている例だ。S3はグローバルサービスのはずなのに、クロスリージョンで動かす先のリージョンに作っておかなければいけないという制約は謎……。

```HCL
resource "aws_codepipeline" "service_account" {
  ：
(中略)
  ：
  artifact_store {
    region   = "ap-northeast-1"    ★
    type     = "S3"
    location = aws_s3_bucket.service_artifact1.bucket

    encryption_key {
      id   = aws_kms_key.cross_account.arn
      type = "KMS"
    }
  }

  artifact_store {
    region   = "us-east-2"     ★
    type     = "S3"
    location = aws_s3_bucket.service_artifact2.bucket
  }
  ：
(中略)
  ：
  stage {
    name = "Build"

    action {
      run_order        = 2
      name             = "Build"
      category         = "Build"
      owner            = "AWS"
      provider         = "CodeBuild"
      version          = "1"
      input_artifacts  = ["SourceArtifact"]
      output_artifacts = ["BuildArtifact"]
      region           = "us-east-2"         ★

      configuration = {
        ProjectName = aws_codebuild_project.service_account.name
      }
    }
```
Rust+wasmでJSONを扱う（配列型にも対応）

昨日の続きです。

https://qiita.com/usop4/items/59263c34a3ff96a5874d

Rust+wasmでJSONを扱うにはwasm_bindgenのJsValue型が使えると書きましたが、JSONに格納されている配列のデータを扱うには、もうひと工夫が必要です。

```rust:lib.rs
use wasm_bindgen::prelude::*;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
pub struct Monster {
    name: String,
    value: String
}

#[derive(Serialize, Deserialize)]
pub struct Monsters {
    monsters: Vec<Monster>
}

#[wasm_bindgen]
extern {
    pub fn alert(s: &str);
    pub fn console_log(s: &str);
}

#[wasm_bindgen]
pub fn return_name(val: &JsValue){
    let monsters: Monsters = val.into_serde().unwrap();
    let mut max_val: usize = 0;
    let mut max_val_monster = Monster{
        name: String::new(),
        value: String::new()        
    };
    let mut monster_name = String::new();

    for monster in monsters.monsters {
        let val: usize = monster.value.parse().unwrap();
        if val > max_val {
            max_val = val;
            monster_name = monster.name;
        }
    }
    console_log(&format!("{}",monster_name));
    console_log(&format!("{}",max_val));
}
```

昨日のコードではMonsterというstructだけ用意しましたが、MonsterをメンバとするMonstersというstructを用意して、こちらに`into_serde()`を使って読み込みます。

なお、昨日のコードでは`return_name()`では名前だけ返してましたが、同じ関数ですがvalueが最大のモンスターの名前を返すことにしています。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>hello-wasm example</title>
  </head>
  <body>
    <script type="module">
        import * as mod  from "./wasm.js";
        let monsters = {
          "monsters":[
            {"name":"pikachu","value":"10"},
            {"name":"eevee","value":"99"}
          ]
        };
        (async () => {
            await mod.default();
            mod.return_name(monsters);
        })();
    </script>
    <script>
      const console_log = (val) => {
        console.log(val);
      }
    </script>
  </body>
</html>
```

こちらでJSONに配列を入れてます。これで少しは汎用的になったでしょうか。
Qiita記事投稿のドキュメンテーションテクニック

## はじめに
　苦労して書いたQiita記事を少しでも多くの人に届けるための、ちょっとしたテクニックのまとめです。いつも忘れちゃうので半分は個人的メモです。直接プログラミングには関係ないですが、ドキュメント作成技術もソフトウェア技術の1部ということでご容赦下さい。

## Markdownや絵文字を使いたい
　記事を各画面の右上に、絵文字アイコンやヘルプアイコンがあります。ど忘れしちゃったときに結構便利です。

<img width="114" alt="qiita_help.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/a4adcfc5-627f-0512-f6fc-91d887c241c8.png">

　絵文字に関しては[EMOJI CHEAT SHEET](https://www.webfx.com/tools/emoji-cheat-sheet/)、[Qiita/Github/Slack/Discord 絵文字一覧](https://qiita.com/yamadashy/items/ae673f2bae8f1525b6af)を参照しても良いでしょう:smile: 

　また、ヘルプ（？マークのアイコン）リンク先の[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)は一度は目を通しておくと良いと思います。何かしらの新しい発見があるかと思います。

## テーブル補完
　[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)に書いてありますが、テーブル作りたいとき便利です。`3x2`とか作りたいテーブルのサイズを入力するだけで、勝手にベースを作ってくれます。

![入力補完を利用する場合](http://cdn.qiita.com/assets/table-dd5879120ce2f80c8443515d9f864ef3e52c1032c0682333daa0008b3f29c563.gif)
　こちらのアニメGIFは[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)からの引用です。

## GitHubのリポジトリへのリンクを目立たせる
　GitHubのリポジトリへのリンクは、以下のようにOGPっぽいリンクを貼ると目立って良いです。
<a href="https://github.com/karaage0703/uonome"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/karaage0703/uonome.png" width="460px"></a>

　[GitHub Link Card Creator](https://www.ghlinkcard.com/)というサービスを使うことで実現できます。

　使い方は簡単で `<GitHub user name>/<GitHub repository name>`を入力するだけです。上記のリンクだと `karaage0703/uonome`です。

　作者による、サービス作成の経緯などは以下記事参照ください。

[みんなにOSSを見てもらいたい人の為に、GitHubリポジトリのOGP的画像を自動生成してくれるサービスを作った](https://qiita.com/po3rin/items/eac851304cf058c532af)


## 他の人が書いた良さそうなQiita記事のソースを見る
　禁断の技？かもしれません。~~Qiitaにログインしている必要があります。~~ ログインしないで見る方法をTwitterで教えていただきました。

「あ、このQiita記事素敵…これは恋かも。もっとこの記事のこと知りたい！」

　~~と思ったら、ラブレターならぬ編集リクエストを送りましょう。記事の右上の「…」をクリックすると、以下のように出てくる「編集リクエストを送る」をクリックします。~~

　と思ったら、記事の右上の「…」をクリックすると、以下のように出てくる「Markdownで本文を見る」をクリックします。

<img width="292" alt="qiita_markdown.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/5a494d8d-3b4d-6689-d173-fc5759ef9852.png">

　すると、あら不思議（？）Qiita記事のソースが丸裸！参考にしちゃいましょう！

　もちろん、引用を超える範囲のコピーはダメです。気をつけましょう。

## 数式
　Qiitaでは数式も使えます。詳しくは以下参照ください。

[機械学習関係の論文を読み書きするための数式・記号まとめ](https://qiita.com/karaage0703/items/e04056649db4dc13f5ce)


## まとめ
　Qiitaに記事投稿するときの、ちょっとしたドキュメンテーションのTIPSを書きました。

　もちろん一番大切なのは中身なのですが、ちょっと工夫すると読者も自分自身も読みやすくなって良いなと思います。良いQiita記事の増加にこの記事が少しでも役立てば嬉しいです。

## 変更履歴
- 2020/08/07 Qiita記事のソースを見る方法をTwitterのコメントをもとに修正
Visual Studio Code で GitHub URL をコピーする

# Visual Studio Code で GitHub URL をコピーする

GitHub で管理されているリポジトリの中のファイルに対して、Visual Studio Code で開いている時に、そのコードの部分に対する GitHub URL をコピーするプラグインの紹介です。

## 追記 (2022/10/14)

vscode 1.72.2 時点で [Copy GitHub URL](https://marketplace.visualstudio.com/items?itemName=mattlott.copy-github-url) を使うと、(Ubuntu 上で) 以下のエラーになりコピーできない。

```
(Copy GitHub URL) Error: Couldn't find the xsel binary and fallback didn't work. On Debian/Ubuntu you can install xsel with: sudo apt install xsel
```

`sudo apt install xsel` を実行しても以下のエラーになり、コピーできない。

```
(Copy GitHub URL) Error: Both xsel and fallback failed
```

[GitHub Pull Requests and Issues](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github) プラグインを導入することにより、コピーできるようになる。

https://zenn.dev/mtmatma/articles/adc06eb115e1f2



## インストール

Visual Studio Code の拡張機能で `github copy url` で検索すると [Copy GitHub URL](https://marketplace.visualstudio.com/items?itemName=mattlott.copy-github-url) というプラグインが見つかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500246/32c62a0d-367c-bb9f-dece-815bd8c7d801.png)

`install` ボタンを押してインストールします。

## 前提知識

GitHub の URL には通常の Link と、Permanent Link があります。

通常の Link の場合は、どのブランチという情報は含まれていますが、git hash の情報は含まれていないため、もしブランチが更新されたら、意図したコードとずれてしまう可能性があります。

Permanent Link の場合は、git hash の情報が含まれているので、もし同じブランチが更新されても参照する git hash が指定されるので、意図したコードを指すことが保証されます。

なので、特に理由がなければ Permanent Link を使うのがいいです。

## 使い方

https://marketplace.visualstudio.com/items?itemName=mattlott.copy-github-url
に書いてあります。

上記サイトでは、一行だけの例が書いてありますが、複数行にも対応しています。

# 通常の Link の場合

Ctrl キーを押しながら、L キーを押します。
いったんキーを離して、 C キーを押します。

# Permanent Link の場合

Ctrl キーと Shift キーを押しながら、L キーを押します。
いったんキーを離して、 C キーを押します。

# Master への Link 場合

Ctrl キーと Shift キーを押しながら、L キーを押します。
いったんキーを離して、 M キーを押します。
MemuエミュレーターにXposedを入れてみた

#XposedをMemuエミュレーターに入れるには

MemuエミュレーターにXposedを入れてみた。

基本的にしたのURLに方法は書いていますが
https://www.memuplay.com/blog/xposed.html


この#6 Go into terminal emulatorがどこにあるのかわからなかったのでメモします

###注意:
MemuエミュレーターはデフォルトでAndroidバージョン７です(2020/8/9現在)

なので上記サイトではxposed-v85-sdk22-x86を入れていますが
xposed-v89-sdk25-x86を入れてください



環境はWindows10です

```cmd
where Memu
>>> C:\Program Files (x86)\Microvirt\MEmu\MEmu.exe
cd C:\Program Files (x86)\Microvirt\MEmu
memuc.exe -i 0 execcmd cd /storage/emulated/0/Download/xposed-v85-sdk22-x86/;sh flash-script.sh
```
-i 0(インデックス番号)はエミュレーターを指定するものです-n (エミュ名)でも代替可
execcmdでExecします

/storage/emulated/0/Download/xposed-v85-sdk22-x86
は解凍したXposedフレームワークのPATHを
;sh flash-script.sh
で実行します

１行で書いてるのは
動かすたびに毎回入力がリセットされるからです

```
C:\Program Files (x86)\Microvirt\MEmu>memuc.exe -i 0 execcmd pwd
/
C:\Program Files (x86)\Microvirt\MEmu>memuc.exe -i 0 execcmd cd storage

C:\Program Files (x86)\Microvirt\MEmu>memuc.exe -i 0 execcmd pwd
/
```
こうなります:(
ほかにいい方法があるのかもしれませんが
ちゃんと動いてるのでよし！



#追記
Shell　開けました
memuc.exe -i 0 adb shell
【講演メモ】AWS Summit システム運用管理の自動化

以下の講演メモです。
【初級】AWS におけるシステム運用管理の自動化 | AWS Summit Tokyo 2019
動画　https://www.youtube.com/watch?v=Lja1rMCSRV8
資料　https://pages.awscloud.com/rs/112-TZM-766/images/C1-05.pdf


#Systems Manager(SSM)とはどんなサービスか
　EC2インスタンスとオンプレサーバをまとめて設定管理することができる。

##SSMインベントリ
###課題　どのサーバに何がインストールされているか不明。
- OSバージョンは何？
- 必要なアプリケーション？不要なアプリ？
- パッチ適用済み？
- 
###解決方法　SSMインベントリ
SSMエージェントをEC2やオンプレサーバにインストールする。
SSMエージェントがOSやアプリ構成情報を収集してくれる。
※Systems Manager インベントリで収集できるメタデータのタイプの一覧
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-inventory.html

###応用　インベントリの収集と詳細な分析
インベントリの情報収集して一箇所のS3バケットへ転送。
 https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-inventory-configuring.html
↓
そのデータをAthenaで分析する

##SSMメンテナンスウィンドウ
###課題　たくさんのサーバに対して定期的に同じ処理をしたい

###解決法　メンテナンスウィンドウを利用
- SSMドキュメントという形で定義されたタスクを実行
- AWSの提供済みSSMドキュメントが利用可能
    - Automationタイプ　AWSサービスに処理を実施
    - https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-actions.html#automation-action-runcommand
    - Commandタイプ　サーバ内でコマンドを実行
        - https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/execute-remote-commands.html
    - その他
    　（初級者はAutomationタイプとコマンドタイプがあることを知っておく。）SSM ドキュメントのタイプ
    　https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-ssm-docs.html

##SSMステートマネージャー
　あるべき状態を保つため定期的にドキュメントを実行してくれる。

#AWS Configでリソースの変更を追跡
##課題　AWSがリソースがあるべき状態を保てない

解決方法　AWS Configを利用する
- 誰がいつ、どのような変更を行ったのか記録したい。
    - 記録場所はどこ？　強いて言うならAWSのポータルかな。基本はAPIで取得。
    　https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/looking-up-discovered-resources.html
　　　

- ルールに反する変更を修復
    - AWS Config マネージドルールをAWSが提供
        - https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/managed-rules-by-aws-config.html
        
#Amazon CloudWatch Eventsでイベントに自動的に反応
##課題　特定のイベントが発生した際になるべく早く解決したい。
##解決方法　CloudWatch Eventsで解決

- イベントソース　→　Amazon CloudWatch Events　→　ターゲット
    - イベントソースはイベントパターン or スケジュール
    - ターゲット　AWSサービスを指定

#SSMとCloudWatch Eventsの使い分け
- SSM 
    - SSMエージェントを介してEC2上のコマンド実行ができる。
    - 管理対象になにかをしたいとき
    - SSMセッションマネージャを使えば、ブラウザ上でSSHアクセス可能
    　（WindowsだとAWS CLI?)
　　　https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html
- Amazon CloudWatch Events
    - 汎用的なイベントドリブンなトリガーとして機能
    - 何らかの出来事に反応してタスクを実行したいとき

#所感
 AWSには運用自動化のため便利なツールが用意されているという印象。
 これに相当するAzureのサービスがわからないので調べておいたほうがいい・・・
[vue]css-loaderを4.*にしたらesModule optionを切ろう

# SSIA
私がパワプロ2020で遊んでる間にcss-loaderのv4.0.0がリリースされました。
そうとは知らずいつも通り1からプロジェクトを組んだ結果、vueコンポーネントに書いたsytleがあたらないという現象にぶち当たりました
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210844/8f60a24e-51b6-29df-70cd-ec8d91f973bc.png)
どうして…(ここで猫になる)

## SSIAは「タイトルで言うこと全部言ってますよ」という意味です
ではここで[css-loaderのv4.0.0のリリースノート](https://github.com/webpack-contrib/css-loader/releases/tag/v4.0.0)を見てみましょう

> * minimum required Node.js version is 10.13.0
> * minimum required webpack version is 4.27.0
> * the esModule option is true by default
> * default value of the sourceMap option depends on the devtool option
>
> ......

はい

> * the esModule option is true by default
> * the esModule option is true by default
> * the esModule option is true by default
> * the esModule option is true by default
> * the esModule option is true by default

ここが原因です
切りましょう

## これに気づくのに一晩かかりました

```javascript:webpack.config.js
{
  // 前略
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: "vue-loader",
        options: {
          hotReload: true,
        },
      },
      {
        test: /\.css$/i,
        use: [
          "vue-style-loader",
          {
            loader: "css-loader",
            // ココ
            options: {
              esModule: false,
            },
          },
        ],
      },
    ],
  },
  // 後略
}
```

## 参考
あったらこんなに苦労しなかったのに…強いて言うなら[公式](https://github.com/webpack-contrib/css-loader)です
リリースから日が浅いか自力でwebpack書いてる人が少ないからか騒いでる人は見当たりませんでした

## 未解決事項
- これはvueを使う場合に限った問題だろうか？
- css-loaderのesModuleを切らずにvueや`/^vue(-style)?-loader$/`側をesModuleに対応させることで解決できないだろうか？
  - loaderの読み込み順からして対応させるなら[vue-style-loader](https://github.com/vuejs/vue-style-loader)と推察されるがこちらにはesModuleスタイルに切り替えるオプションは見当たりませんでした:thinking:
  - [vue-loader](https://vue-loader-v14.vuejs.org/ja/options.html)はv14時点で強制的にesModuleスタイルになっています
macOS Catalina で Flutter の環境構築，アプリを Android デバイスで実行してみた

# Catalina に Flutter の環境を構築
Android，iOS の両方に対応可能な Flutter でアプリを作成したくなった．そのための準備として，macOS に Flutter の環境構築を行った．
## 開発環境と必要なツール
- macOS Catalina 10.15.4
- brew
- Android デバイス
    - HWー01K (型番)

## 参考サイト
https://qiita.com/eventerharuchan/items/f46cd0ee235559e33d60
基本的にこのサイトを見て行った．
Xcode はインストールしなくても xcode-select があれば大丈夫だった．
```sudo xcode-select --switch /Library/Developer/CommandLineTools```
だけできてれば大丈夫．
どうやら VSCode でのデバッグ，実行が楽そうなので，VSCode の環境構築は済ましておく．Extensions で Flutter を検索，インストールしておけば Dart も勝手にインストールしておいてくれるので基本的に大丈夫．

## Android デバイスでの実行 (環境構築後)
エミュレータをインストールするのが面倒であったため，手持ちの Huawei p20 pro で実行することにした．
### Android でのセットアップ
設定→ドコモのサービス/クラウド→USBデバッグ切替
でUSBデバッグ機能をONにする．こうすることで実行できるようになる．機種によって USBデバッグの場所は違う．

### セットアップ後
最初は```flutter run```しても
```Running Gradle task 'assembleDebug'...
(This is taking an unexpectedly long time.)```
となってしまい，実行できなかった．
しかし，
```flutter precache```
から，実行してみたところ，無事動作が確認できた．

これからこのアプリを色々自分なりに変えていきたいと思う．
7日移動平均を使った計算

コロナ感染の7日間の移動平均の計算プログラムを作って見ました。
当日のデータを入れれば、翌日にもそのデータがファイルに残り使えるように工夫してみました。
また　7日間の新規発生数に対する評価も入れてみました。埼玉県の人口データ等を使っています。
埼玉県の人口710万人、　7日あたりの新規発生合計15人/10万人
を使っています。
なにせPythonをボケ防止のためで学習している高齢者なので、皆さんから見たら
もっとうまい方法があるかもしれませんが、とにかく得られている知識だけで作ってみました。
これから更に勉強して改善していこうと思っています。
途中　確認のためのprintが多いですが、これは自分の確認のために行ったものですので、お許しを
願います。


#Data input and Save
#data : list
# use file, write and read to file

import csv
import codecs
import os

def read_data(filename):
    data = []
    with open(filename, 'r') as f:
        result = f.read()
        print('result=',result)      
    
def save_data(filename):
    data = []
    with open(filename, 'a+') as f:
        
        while True:
            x = input('add Numb. x=',)
            data.append(x)
            
            
            if x == '':
                break
            f.write(x + '\n')
            print('data=',data)
            
        data = list(data)
        print('Good luck!! Save data!! saved data =',data)
def calc_ave(filename):
    data = []
    data1 =[]
    with open(filename, 'r') as f:
        for line in f:
            data += [int(line.strip())]
        result = f.read()    
        print('data=', data)
        data1 = data[-7:]
        print('data1=',data1)
        data = data1
        data = list(data)
        print('data=', data)
        total = 0
        N = 7
        total = sum(data)
        print('total=', total)
        ave = total//N
        print('ave=' , ave)
        p = 710 # hundred thousand of population of saitama
        a = 15 #allowable number in 10 hundred thousand
        base = 10
        max_number = (p*a)/base
        print('max_number=',max_number)
        q = p*a /base
        ps = round((total/q)*100)
        print('ps=', ps, '%/ in max_number')
        if total <= max_number:
                print('Safty')
        else:
                print('Not safty')
         
        
if __name__== '__main__':
    numbers = read_data('sample.csv')
    numbers = save_data('sample.csv')
    ave = calc_ave('sample.csv')
@PropertySourceをapplication.propertiesに使ってはいけない

# 結論
```
@PropertySource(name = "application", value = "classpath:application.properties")
```
みたいに@PropertySourceを使ってapplication.propertiesを読み込むと、Spring BootのExternalize Configurationの仕組みが働かないので、やるべきではありません。
@PropertySourceの使いどころは、application.properties以外、かつ、環境依存しないプロパティファイルの読み込みに使うものと思います。

# やってみる
## ソースとプロパティファイル
```application.properties
key1 = value1
key2 = value2
```

```java:TestConfig.java
package com.example.demo;

import javax.annotation.Resource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;

@Configuration
@PropertySource(name = "application", value = "classpath:application.properties")
public class TestConfig {
	@Resource
	ConfigurableEnvironment environment;
	
    @Bean
    public PropertiesPropertySource propertySource() {
        return (PropertiesPropertySource) environment.getPropertySources().get("application");
    }
}
```

key1は@PropertySourceで、key2は@Valueで読むようにしました。

```java:TestRunner.java
package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.stereotype.Component;

@Component
public class TestRunner implements ApplicationRunner {

	@Autowired
	PropertiesPropertySource propertySource;
	
	@Value("${key2}")
	String key2;

	@Override
	public void run(ApplicationArguments args) throws Exception {
		System.out.println("key1 = " + propertySource.getProperty("key1"));
		System.out.println("key2 = " + key2);
	}

}
```

## 引数なしで実行
```
key1 = value1
key2 = value2
```

application.propertiesの設定の通り出力されます。

## 引数を付けて実行
引数：--key1=value11 --key2=value22

```
key1 = value1
key2 = value22
```

key2は正しく引数の指定で上書きされていますが、key1は引数の指定を無視してそのままです。

# 動作環境
OpenJDK11.0.2
Spring Boot 2.3.2

# 参考
[Spring Boot Features - 2. Externalized Configuration](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config)
JSXのClassNameに文字列と変数を使用して詰まった際の解決策

以前、Reactで簡易的なTwitterのようなアプリを作っていた際、コンポーネントのclassName部分に文字列としてのクラス名と、条件分岐処理によって変数に違うクラス名が入る変数を設置しようとしたのですが、上手く行かずに詰まりました:sweat_smile:
その時の解決方法をメモします。

#何がしたかったのか
自分の場合、あらかじめlikeクラスを持ったspanタグがあり、投稿のいいねアイコンがクリックされるといいねアイコンに着色するlikedクラスを変数liked_classに格納しspanタグにつけようとしました。（今回は一時的に変数名を変えている為、少し命名がおかしいですが、気にしないでください笑）

![スクリーンショット 2020-08-08 23.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619769/f3c4294b-c48b-35e0-db84-dc6fc498e8b9.png)
↑投稿にいいねを付けていない場合（クラスはlikeのみ）
![スクリーンショット 2020-08-08 23.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619769/888bb459-c47c-56cf-674a-5017e1b7f131.png)
↑投稿にいいねを付けた場合（クラスはlikeと変数liked_classに格納されたliked）

因みにCSSは以下のような感じです。

```
.like{
        font-size: 30px;
}

.liked{
        color: #FF6699;
}
```
上記の説明と画像の通りですが、いいねアイコンのspanタグにlikedクラスが付与されると、colorプロパティにより、いいねアイコンが着色されます。


以下、上手く行かなかった際のコードです。

```
//投稿のlikeフラグ（hasliked）がtrueであればlikedクラスを変数に格納、falseなら空文字列を格納
const liked_class = post.hasLiked() ? 'liked' : '';

    return (
        //spanタグにlikeクラスと上記の処理で定義した変数、liked_classをセットする
        <span className="`like ${liked_class}`" onClick={() => {
            props.likePostToggle(post.id)
        }}>
            <FontAwesomeIcon icon={faThumbsUp} />
        </span>
    );
```
classNameの中で変数を展開して文字列と連結させようとしたのですが、`like ${liked_class}`が１つのクラス名と認識され上手く表示されませんでした。

#解決方法（classnamesライブラリのClassNamesメソッドを使用）
上記で詰まった点ですが、[こちらの記事を参考にして](https://www.yoheim.net/blog.php?q=20180701)classnamesライブラリが提供するClassNamesメソッドを使用することで解決できました。
以下、使い方です。

npm経由でclassnamesライブラリをインストールします。

```
npm install classnames --save
```
使用したいコンポーネント内で、classnamesライブラリが提供するclassNamesメソッドをインポートします。

```
import classNames from 'classnames';
```

classNameの内に文字列と変数を使用したいところでclassNamesメソッドを使用します。自分の場合は以下のようになりました。

```
//上記と同じくいいねフラグがtrueの場合likedクラスを変数に格納、falseはの場合空文字を格納
const liked_class = post.hasLiked() ? 'liked' : '';

//classnamesライブラリが提供しているclassNamesメソッドを使用し、使いたい文字列や変数をセットする
    const liked_classes = classNames(
        'like', //あらかじめセットしておく文字列のクラス名
        liked_class //上記の条件分岐処理の結果で中に入るクラス名が変わる変数
    );

    return (
　　　　　//上記で定義した変数、liked_classesをclassNameに指定
        <span className={liked_classes} onClick={() => {
            props.likePostToggle(post.id)
        }}>
            <FontAwesomeIcon icon={faThumbsUp} />
        </span>
    );
```
また以下のように書くこともできます。
上のコードとの違いは、１行目に記述していた、いいねフラグの有無によって変数に格納する値を、likedか空文字列か決めていた部分を部分を削除し、classNamesの内部でいいねフラグがtrueの時のみlikedクラスを付与するようにしています。

以下のコードの方が変数を定義する必要がなくなるのでいいですね。

```
//ここの処理は不要
const liked_class = post.hasLiked() ? 'liked' : '';

    const liked_classes = classNames(
        'like', //あらかじめセットしておく文字列のクラス名
　　　　　//１行目に記述していた条件分岐処理をこちらに記述（いいねフラグがtrueの場合、likedクラスを付与）
        {'liked' : post.hasLiked()} 
    );

    return (
　　　　　//上記で定義した変数、liked_classesをclassNameに指定
        <span className={liked_classes} onClick={() => {
            props.likePostToggle(post.id)
        }}>
            <FontAwesomeIcon icon={faThumbsUp} />
        </span>
    );
```


こうすることで、投稿にいいねがついた場合のみspanタグにlikedクラスを付与し、いいねアイコンに着色することができました！
Macを初期化。Unityライセンス返却の記録

Macの調子が悪いのかBlenderの調子が悪いのか
これを機にMacを初期化してみようと思います。
必ずUnityのライセンス返却とログアウトを
忘れてはいけないと聞いた事があるので
備忘録として行った作業を記録しておく。

まずはライセンスの返却。
歯車の隣の自分のマークをクリック。
ライセンスの管理を選ぶ。
<img width="977" alt="スクリーンショット 2020-08-09 10.15.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650838/d91378c9-a55e-fa06-3298-f5c8d1e0d47f.png">

ライセンスの返却を選ぶ。
<img width="973" alt="スクリーンショット 2020-08-09 10.16.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650838/fc1b0be3-2699-2097-f08f-b7b496fdaed2.png">

ライセンスの返却
使用しているシリアル番号のアクティビティ？
2台までしか使えないのでこのMacを解除してという意味だろう。
またこのMacで使うので一旦ほっとこ。
確認を選ぶ。
<img width="955" alt="スクリーンショット 2020-08-09 10.16.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650838/266e152f-0890-49b8-8316-360cc89f89ba.png">

サインアウトをする。
<img width="966" alt="スクリーンショット 2020-08-09 10.19.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650838/74ceee09-4872-0e19-7fbe-926366c0d851.png">

さあ！これで上手いこといくかは初期化して起動するまでわからない。
Python「SyntaxError: Non-ASCII character〜」が出てしまった時


```
# -*- coding: utf-8 -*-
```

を確認

Python3 で UTF-8 なら、coding指定不要との事です。
参考： https://pep8-ja.readthedocs.io/ja/latest/

ASCII (Python 2) や UTF-8 (Python 3) を使用しているファイルにはエンコーディング宣言を入れるべきではありません。
VBAを舐めたらあかんぜよ：複数ファイルの固定レンジを纏めて、一つのファイルを作成

やる事
　複数ファイルの固定レンジを纏めて一つのファイルを作成

条件
　【対象ファイルについて】
　対象ファイル（ソース）は20ファイル
　1ファイルに5つのシートが対象
　1つのシートの固定レンジにある値
　（レンジは可変ではない）
　なので、対象シートは合計100
　対象ファイル20は全て1つのフォルダの同じ階層に入っている

　【作成するファイル】
　１つのファイル
　シートは10シートに分ける
　1シートに10シートから参照したレンジを並べる
　並べ方は5つのレンジを2段（10レンジ分）/１シート

処理の書き方
　【作成するファイルに関して】
　１．新規で作成するファイルのファイル名は「ヘルシーメニューまとめyyyymmdd_hhmm.xlsx」
　　　置く場所はデスクトップ（任意のWindowsユーザーの）
　２．まず存在確認して、なければ、新規作成。あれば、「1分待ってください。」というポップアップを出して処理終了。
　【対象ファイルへの処理】
　３．ユーザーに対象ファイルが入っているフォルダを指定してもらう
　４．指定したフォルダの全ての.xlsxファイルが対象。
　５．対象ファイルの対象シート
　　　（シート名も固定で、1ファイルに5シート）
　　　から固定レンジの情報を取ってきて、作成した「ヘルシーメニューまとめ」に情報を転記
　６．新規作成のシート名は１から順番に付番される。

実際のコード
golangのio.Readerは使い回しできない

# はじめに

こんにちわ、すえけん（@sueken5）です。この記事ではgolangのio.Readerが使い回しができないことを紹介します。

# io.Reader

io.Readerはioパッケージで提供されているインターフェースです。([ドキュメント](https://golang.org/pkg/io/#Reader))

```go
type Reader interface {
    Read(p []byte) (n int, err error)
}
```

具体的にこのインターフェースを満たしているものを例に挙げると

- http.ResponseのBodyフィールド ([ドキュメント](https://golang.org/pkg/net/http/#Response))
- os.File ([ドキュメント](https://golang.org/pkg/os/#File))

などが挙げられます。

いわゆるストリーム系のものがこのio.Readerインターフェースを満たしています。


# 使い回せない？

本題です。次の出力は何になるでしょうか？

```go

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"strings"
)

func main() {
	r := strings.NewReader("hello world")

	a, err := ioutil.ReadAll(r)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("a is", string(a))

	b, err := ioutil.ReadAll(r)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("b is", string(b))
}
```

予想される出力

```
a is hello world
b is hello world
```

実際の出力

```
a is hello world
b is 
```

実際の出力だと`b`が空になってしまっています。なぜでしょうか？

# Read()では何が起こっている？

今回サンプルで`strings.Reader`を見てみます

```go

type Reader struct {
	s        string
	i        int64 // current reading index
	prevRune int   // index of previous rune; or < 0
}

func (r *Reader) Read(b []byte) (n int, err error) {
	if r.i >= int64(len(r.s)) {
		return 0, io.EOF
	}
	r.prevRune = -1
	n = copy(b, r.s[r.i:])
	r.i += int64(n) // <= 内部でストリームのインデックスを持っている
	return
}
```

内部で`Read`が呼ばれるたびにストリームに対してのインデックスをカウントアップしています。

なので次の場合

```go
	a, err := ioutil.ReadAll(r)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("a is", string(a))

	b, err := ioutil.ReadAll(r) //すでにストリームの最後までいってるから何も返さない
	if err != nil {
		log.Fatal(err)
	}
```

2回目にReadAllしたい場合にストリームが最後まで読み切られているので何も返さなかったということになります。

# 使い回す方法

使い回す方法として`io.TeeReader`があります。([ドキュメント](https://golang.org/pkg/io/#TeeReader))

先ほどの失敗例をTeeReaderを使って修正すると次のようになります。

```go
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"io"
	"strings"
	"bytes"
)

func main() {
	r := strings.NewReader("hello world")
	
	bBuf := new(bytes.Buffer)
	aBuf := io.TeeReader(r, bBuf)

	a, err := ioutil.ReadAll(aBuf)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("a is", string(a))

	b, err := ioutil.ReadAll(bBuf)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("b is", string(b))
}
```

出力

```
a is hello world
b is hello world
```

# 最後に

io.Readerは便利なのでもっと詳しくなりたいです。
VBAを組んでみた。閉じるときにダイアログを出さない。

#VBAを組んでみた。

##やってみたこと
記入したシートを新規のWorkに保存し、
使っていたWordはフォーマット以外全て消して閉じる。

##おこなった理由
毎日、社内の日報を以下の順に書いています。
①Excelにフォーマット通りに記入する。
②記入したExcelを別のexcelにコピペして保存する。
③フォーマットを保存せずに閉じる。

ご存じの通り、
編集をして保存せずに閉じようとすると下図のようなダイアログが毎回出現します。
<img width="345" alt="20200809_ダイアログの画像.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/a7812620-77a8-fe4f-1f96-f57fc77c9c87.png">
>Microsoft 365 バージョン2006の場合

Excelを閉じるときにダイアログが出てこないように組みました。


##コードの作成
###Key🔑コマンド
それが`ThisWorkbook.Saved = True`　コマンド
ダイアログ的には保存したけど、Excel自体は保存しないコマンド。

仮に`ThisWorkbook.Saved = True`　の**True**を**False**に変更すると、
コマンドの意味がなくなりダイアログが発生します。

###コード

```vb
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim rslt As VbMsgBoxResult
rslt = MsgBox("データを保存しましたか" & vbCrLf & "メールは送信しましたか", Buttons:=vbYesNo)
 
  If rslt = vbYes Then         

    'Yesの場合　保存せずに閉じる
     ThisWorkbook.Saved = True
                        
     Application.CutCopyMode = False
            
  Else
    'Noの場合　何もしない(閉じるを無効にする)
     Cancel = True
           
  End If


End Sub
```
###解説
今回は、閉じる直前に実行したかったため、
オブジェクトは、標準モジュールではなく**workbook**を選択し、
プロシージャは**BeforeClose**を選択しました。

宣言は、`Private Sub Workbook_BeforeClose(Cancel As Boolean)`としています。(コード内1⃣について)
このコードだとコード中に、`Cancel = True`を入れると「閉じるを無効する」という意味になり、何をしても閉じることができなくなります。

今回ダイアログの代わりにメッセージボックスを表示し、
キャンセルができるように使用しました。

`Cancel = True`を使用せずに、
`Application.CutCopyMode = False`ダイアログを非表示にするコマンドを
使用しても同じ結果が出ます。

ーーーーーーーーーーーーーーーーーーーーーーーー
閉じるときに出現するダイアログの他に、こんなダイアログも出てくることがあります。
<img width="392" alt="20200809_ダイアログの画像3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/f54d7d12-b8b1-ea71-def6-05805be871c0.png">
ダイアログに書いてある通り、閉じるときにコピーとして取得したデータをどうするのか聞いてくれます。

私はコピーを保存しておく必要がなかったため、
`Application.CutCopyMode = False`を使用し、コピーを無効化しました。
コピー後にEscapeキーを押して無効化するのと同じ感じです。

##気づき
初めは、`ThisWorkbook.Saved = True`ではなく、
`Workbooks(failename).Close`などの閉じるコマンドを書こうとしていました。
すると、閉じるコマンドが二重化してしまい、エラーは出てこないのですが、
下図のように何もない画面が出力されました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520258/bcf7031f-6d77-6208-a5a7-90f44fb18b24.png" Width = 80%>

##まとめ
考えてみるどこに保存するか、形式はどうするのか決めていないので理解できるのですが
`ThisWorkbook.Saved = True`コマンドを知ったときはサーブと書いてあるのにセーブされないことに疑問に思いました。
色々と苦戦はしましたが、無事動くようになり作成でき今は毎日使用しています。

ほかに作成したコード
[VBAを組んでみた。新しいbookに保存するの巻](https://qiita.com/yukina24/items/84625e931748a21c09a9)
[VBAを組んでみた。１か月分の作業時間を集計するの巻](https://qiita.com/yukina24/items/06e449952850091a8f50)
IPアドレス、サブネットマスク、ネットワークアドレス

平成31年春期 午前問題34

次のIPアドレスとサブネットマスクをもつPCがある。このPCのネットワークアドレスとして，適切なものはどれか。

　IPアドレス： 10.170.70.19
　サブネットマスク：255.255.255.240

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c7bca0ca-02ec-3b56-5b14-12e976dd7ee3.png)


１、ネットワークアドレス、ホストアドレス、IPアドレス、ブロードキャストアドレス
インターネットのような巨大なTCP/IPネットワークは、複数の小さなネットワーク（サブネット）に分割されて管理されており、各サブネットには連続する複数のアドレスをまとめたアドレスブロック単位でアドレスが割り当てられる。

このうち、ブロックの先頭にある、ホスト部分を表す下位側のビットがすべて0になっているアドレスをネットワークアドレスという。また、末尾にある、ホスト部分がすべて1のアドレスはそのサブネット内のすべてのホストに一斉送信を行うためのブロードキャストアドレスという。先頭と末尾を除いた残りのアドレスがサブネット内のホストアドレスとなる。

例として、
192.168.1.0～255の256個（サブネットマスクは255.255.255.0あるいは/24）のブロックが割り当てられている場合、
先頭の**192.168.1.0がネットワークアドレス**、
末尾の**192.168.1.255がブロードキャストアドレス**、
残りの**192.168.1.1～254がホストアドレス**となる。

具体的に、例として
IPアドレス：192.168.1.10
ネットワークアドレス：192.168.1.0
ホストアドレス：xxxx.xxxx.xxxx.10
※IPアドレス＝ネットワークアドレス＋ホストアドレス
ブロードキャストアドレス：192.168.1.255

２、ネットワークアドレスの計算
計算方法：サブネットマスク　AND　IPアドレス
例え：
サブネットマスク：255.255.255.0
IPアドレス：192.168.1.10

1111 1111 1111 1111 1111 1111 0000 0000
1100 0000 1010 1000 0000 0001 0000 1010
↓
1100 0000 1010 1000 0000 0001 0000 0000
192.168.1.0  ←ネットワークアドレス


当該質問としては、
サブネットマスク：255.255.255.240
IPアドレス：10.170.70.19


11111111 11111111 11111111 11110000
00001010 10101010 01000110 00010011
↓
00001010 10101010 01000110 00010000
10.170.70.16  ←ネットワークアドレス

サブネットマスクは、基本は、255.255.255.xxxxので、
ネットワークアドレスは、基本は、IPの先頭３つと一緒、一番後ろは、ANDの結果ですね。


参考：
https://www.fe-siken.com/kakomon/29_aki/q35.html

ネットワークアドレス  【 network address 】 
http://e-words.jp/w/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9.html

IP地址和子网掩码的关系, 如何计算网络地址
https://blog.csdn.net/weixin_42724467/article/details/90293151
Rails c　Rollbackエラー原因を探る

### はじめに
開発初期段階で、usersテーブルのレコードを作成したくてrails consoleを使用。しかし、Rollbackのエラーが出てしまい保存ができない。その上、Rollbackの原因も明記されていない。これでは原因を探すのが手探りになってしまう。ということで、原因を楽に探す方法はないものかとググった結果ありました！なので、その方法の備忘録として書き記します。

###方法
やり方はとてもシンプル！createメソッドの後ろに!をつけるだけ！
ベイズ推論の考え方（１）・・事前確率と事後確率

##Pythonで体験するベイズ推論
###ベイズ推定の考え方・・例題：司書か農家か

夏休みなので、「Pythonで体験するベイズ推論」を少しずつ勉強しています。簡単に勉強したことを`Python`とともに書いていこうと思います。


問題
スティーブは親切だが内向的である。他人にはほとんど関心がなく順番通りにやることが好き。スティーブは図書館司書になるか？農家になるか？

男性の農業家と男性の司書の比率は２０：１（これを事前確率という）

スティーブが司書である・・A
スティーブが農家である・・B

スティーブが司書である事前確率　$𝑃(𝐴)$　は、

```math
\displaystyle𝑃(𝐴)=1/21=0.047
```

になる。
スティーブの性格についての情報（性格が内向的）が入ったことを$X$とする。
ここで考えるのは、$P(A | X )$である。これは、$X$という情報がはいった条件の元でのスティーブが司書である事後確率である。
ベイズの定理の式から考えます。
ベイズの定理の式

```math

P( A | X ) = \displaystyle \frac{ P(X | A) P(A) } {P(X) }

```
近所の住人がスティーブの性格を内向的であると語る確率$P(X|A)$を0.95とする。
次に$𝑃(X)$を考える。これは、誰かが近所の住人に内向的であると言われる確率である。これは分解して考える。

```math
\begin{align}
P(X ) &= P(X \text{ and } A) + P(X \text{ and } \sim A)\\
&= P(X|A)P(A) + P(X | \sim A)P(\sim A)\\
&= P(X|A)p + P(X | \sim A)(1-p)\\
\\
&*P(\sim A)=P(notA)

\end{align}
```

1行目はこういう意味である。
スティーブが内向的$P(X)$で司書$P(A)$である確率と内向的$P(X)$で司書でない$P(\sim A)$（農家である）確率を足したもの。つまりスティーブの職業が何であれ（今回は司書か農家か）内向的な確率の総和である。

ここまでで、わかっているのは、$P(X| A)=0.95$と$P(A)=0.047$である。また、$P(\sim A)$は、$P(\sim A)=1-P(A)=20/21$である。
後、わかっていないのは、$P(X | \sim A)$である。これは彼が農家である場合に近所の人が内向的と語る確率である。ここは設定するしかないようで、一応$0.5$とする。これで、$P(X)$がわかる。

```math
\begin{align}
P(X ) &= P(X \text{ and } A) + P(X \text{ and } \sim A)\\
&= 0.95*1/21+0.5*20/21\\
&= 0.52
\end{align}
```
これで、$P(X)$がわかったので、ここから、ベイズの定理で、$P(A | X )$がわかる

```math
\begin{align}
P( A | X ) &= \displaystyle \frac{ P(X | A) P(A) } {P(X) }\\
&= \displaystyle \frac{0.95*1/21}{0.52}\\
&= 0.087
\end{align}
```
つまり、スティーブの性格の情報がない場合のスティーブが司書である確率$𝑃(𝐴)=0.047$であったのが、スティーブの性格が内向的としった後にスティーブが司書であると考える確率は$𝑃(A | X )=0.087$と倍増しているのである。

これら事前確率と事後確率の関係とかは、基本となるのでしっかり覚えておきたいと思う。
この例題は、本に載っていたのですが、僕は今までのいろいろ読んだ中で一番わかりやすかったと思っています。

ここで、`Python`のスクリプトです。
`jupyter notebook`形式でgithubリポジトリにあります。
https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers

でも、よく見たら、この最初の例題の`Python`スクリプトは、グラフを書くだけのスクリプトでした。。

```python

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt 

colours = ["#348ABD", "#A60628"]

prior = [0.20, 0.80]
posterior = [1./3, 2./3]
plt.bar([0, .7], prior, alpha=0.70, width=0.25,
        color=colours[0], label="prior distribution",
        lw="3", edgecolor=colours[0])

plt.bar([0+0.25, .7+0.25], posterior, alpha=0.7,
        width=0.25, color=colours[1],
        label="posterior distribution",
        lw="3", edgecolor=colours[1])

plt.xticks([0.20, .95], ["Bugs Absent", "Bugs Present"])
plt.title("Prior and Posterior probability of bugs present")
plt.ylabel("Probability")
plt.legend(loc="upper left")
plt.show()
```
![1_2_2_Figure 2020-08-09 100624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/2ad377e6-bfc9-81f2-1d35-18330201bdd2.png)

次の記事です。
[「ベイズ推論の考え方（２）・・ベイズ推定と確率分布」](https://qiita.com/motoyuki1963/items/904d8c8ecb340a801ebb)
聞いたことはあるがよくわからないJavaScript周辺のあれこれ

JavaScriptを学習していると、よくわからない概念やライブラリに出会う機会が多いです。
その中でも特によく耳にするものをざっくりまとめてみました。(ホントにざっくり)
各内容をもっと掘り下げた参考記事も貼っているので気になる方はそちらも読んでみてください。

# ECMAScript
ECMAScriptとはJavaScriptの言語仕様の取り決め。
よく耳にする `ES2015` や `ES6` といった用語はJavaScriptのバージョンを表し、ここで出てくる `ES` がECMAScriptのこと。

[【JavaScript】JavaScript、その前に〜ECMAScriptとは？](https://qiita.com/yukibe/items/acd0bafcf2a10c99d0f6)

# npm
Node Package Manager、すなわちNode.jsのパッケージを管理するもの。
npmのおかげで、 `npm install 〇〇` と打つだけで便利なライブラリを簡単にインストールして利用することができる。

[npmとは](https://qiita.com/lelouch99v/items/05f973df9c54cec23419)

# yarn
2016年にFacebookが公開したかなり新しめのJavaScriptパッケージマネージャ。
役割はnpmとほぼ同じだが、npmと比べてインストール・セキュリティ・バージョン管理の面で優れている。

[yarnとは](https://qiita.com/lelouch99v/items/c97ff951ca31298f3f24)

# package.json
パッケージマネージャを用いてプロジェクトを作成する際に、プロジェクトが依存するパッケージに関する情報（さらにはプロジェクト全体に関する情報）を記録するファイルがpackage.json。
プロジェクトを動作させるために必要なパッケージをdependencies属性とdevDependencies属性に記述しておけば、`npm install` コマンドを打つだけでプロジェクト環境を復元できるため、非常に便利。

[【初心者向け】NPMとpackage.jsonを概念的に理解する](https://qiita.com/righteous/items/e5448cb2e7e11ab7d477)

# Babel
BabelはJavaScriptのコンパイラ。
これを使うとJavaScriptのコードを新しい書き方から古い書き方へと変換してくれる。
ブラウザによって対応しているJavaScriptのバージョンや仕様が異なるので、各ブラウザの環境に合わせて記法を変換する必要がある。

[【５分でなんとなく理解！】Babel入門](https://qiita.com/Shagamii/items/a87181c22ea777ee2acc)
[webpackとBabelの基本を理解する(1) ―Babel編―](https://qiita.com/koedamon/items/92c986456e4b9e845acd)

# webpack
webpackはモジュールバンドラ。
モジュールバンドラとは、複数のファイルを１つにまとめて出力してくれるツールのこと。
webpackはJSファイルだけでなく、CSSや画像ファイルも1つにまとめてくれる。
webpackを使えば、開発時には機能ごとにファイルを分割して開発を進めることができ、読み込み時には1つのファイルとして読み込めるので、非常に便利。

[webpackってどんなもの？](https://qiita.com/kamykn/items/45fb4690ace32216ca25)
[webpackとBabelの基本を理解する(1) ―webpack編―](https://qiita.com/koedamon/items/3e64612d22f3473f36a4)

# ESLint
ESLint は JavaScript のための静的検証ツール。
コードを実行する前に明らかなバグを見つけたり、括弧やスペースの使い方などのスタイルを統一したりするのに役立つ。

[ESLint 最初の一歩](https://qiita.com/mysticatea/items/f523dab04a25f617c87d)
Unityでbmp画像を読み込むと色がおかしくなる症状

# 概要

表題の通り、bmp画像をunityにインポートすると色がおかしく表示される現象についての解決策になります。

以下の通り、左がbmp画像ファイルですが、unityにインポートすると右のように青くなった色で表示されます。

<img width="863" alt="bmpcolor.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89429/5e1bedad-63cb-f373-5e55-63acd734fd5f.png">


# 対策

対策としては、bmp画像をpng画像に変換してから読み込むと色合いがおかしくならずに読み込むことができました。

<img width="744" alt="pmg.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89429/829b3aa3-6c55-00ba-bac8-7560eab02512.png">

3Dモデル（fbxとかMMDモデルとか）でbmpファイルがテクスチャとして使われているケースがあるので、そのときはお気をつけください。
AtCoder Beginner Contest 169 A問題「Multiplication 1」解説(Python3,C++,Java)

AtCoder Beginner Contest 169 A問題「Multiplication 1」の解説を行います。

>問題URL :
https://atcoder.jp/contests/abc169/tasks/abc169_a

#問題概要
整数$A$,$B$が与えられる。
$A×B$を求めよ。

##制約
・$1 \leq A \leq 100$
・$1 \leq B \leq 100$
・入力は全て整数

#解説
問題文通りに実装すれば良いです。
以下、Python3,C++,Javaでの解答例を示します。

<details><summary>Python3での解答例</summary><div>

```{A169.py}
x,y = map(int,input().split())
print(x*y)
```

</div></details>

<details><summary>C++での解答例</summary><div>

```{A169.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  int x,y;
  cin >> x >> y;
  cout << x * y << endl;
}
```

</div></details>

<details><summary>Javaでの解答例</summary><div>

```{A169.java}
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner scan = new Scanner (System.in);
    int x = scan.nextInt();
    int y = scan.nextInt();
    System.out.println(x*y);
  }
}
```

</div></details>
##類題(オーバーフローに注意しましょう)
今回は制約が両方とも100以内なので大丈夫なのですが、このような場合はどうでしょう？

>$X×Y$を求めよ。
ただし制約は以下の通りである。
・$1 \leq X \leq 10^5$
・$1 \leq Y \leq 10^5$

Python3の場合はint型で扱える値は無限なので大丈夫なのですが、

C++の解答例のコードでこの問題の最大制約の場合で実行してみます。

入力

```{input.txt}
100000 100000
```

出力

```{output.text}

1410065408
```

本来、$10^5 × 10^5 = 10^{10}$なので、<b>このような表記にはならない</b>...と思った方も多いと思います。

これは<b><font color="#FF0000">オーバーフロー</font></b>という、C++やJava等、int型で表現できる値で制限がかかっている言語で発生する現象です。

$10^{10}$ を $2^{31}$で割ると余りが$1410065408$となります。

C++やJavaのint型で表現できるのは $-2^{31}$から$2^{31}-1$までの値です。
よってint型とint型の積がint型であることから、<b>このようなオーバーフローが発生してしまうのです。</b>

C++では、例えば `long long int`を使うことで表現できる値が増えます。
<font color = "#808080">`long long int`で表現できる値は$-2^{63}$から$2^{63}-1$です。
よって、以下のコードを書けば先ほどのような問題を回避できます。</font>

```{overflow対策.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  long long int x,y;
  cin >> x >> y;
  cout << x * y << endl;
}
```

```{output.text}
10000000000
```

AtCoderの問題文やサンプルには　たまに<b>`オーバーフローに注意して下さい`</b>や<b>`32bit 整数に収まらない場合もある.`</b>などの表記がある場合があります。
そのような場合は、変数の型が`long long int`であるかどうかを<b>疑ってから</b>提出するようにしましょう。
<font color = "orange">余計なWA(不正解)ができてしまいペナルティ5分が発生してしまうので....</font>
Railsでのカラムの追加

#カラムの追加

新しいカラムの追加（基本）
$rails g migration （行う処理＋テーブル名）(追加したいカラムとデータ型など)
```$rails g migration AddColumnToUsers  name:string age:integer
```

新しいカラムにインデックスを追加
```$rails g migration AddColumnToUsers name:string:index
```

カラムの削除
```$rails g migration RemoveNameFromUsers name:string
```

テーブルの作成と同時にカラムの作成
```$rails g migration CreateUsers name:string age:integer
```
AngularでヘッダーにJWTトークンを常につけたい

Angularで取得した認証用JWTトークンを、ヘッダーに常につけておきたいですよね。

1.そんな時はInterceptorを使います。

`ng g interceptor JwtToken`

```JwtTokenInterceptor.ts
import { Injectable } from '@angular/core';
import {
    HttpRequest,
    HttpHandler,
    HttpEvent,
    HttpInterceptor
} from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable()
export class JwtTokenInterceptor implements HttpInterceptor {

    constructor() {
    }

    intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
        const token = localStorage.getItem('jwt-token'); // 何らかの方法でJWTトークンを保持・取得
        if (token) {
            const req = request.clone({
                setHeaders: {
                    'Content-Type': 'application/json',
                    Authorization: 'Bearer ' + token,
                },
            });
            return next.handle(req);
        }
        return next.handle(request);
    }
}

```

2.app.module.tsのprovidersにinterceptorを登録する。

```app.module.ts
    providers: [
        {provide: HTTP_INTERCEPTORS, useClass: JwtTokenInterceptor, multi: true},
    ]


```

これでリクエストごとにヘッダーにAuthorizationが追加され、JWTトークンが送られます。
eclipseからIntelliJに移行してみた

# はじめに
私はいままでJavaを好み、それでゲームを作っていました。しかし、Javaって**記述が冗長**で読みにくいんです！それで違う言語を使ってみようとしたんですが、Javaのライブラリが素晴らしくて、JVMで走る言語で遊んでいこうと考えたわけです。そこでKotlinという言語でこれからは遊んでいくとしました。ついでにeclipseをいままで使っていたのですがIntelliJというIDEをこれから機能がすごいと聞いたので、切り替えました。そこでIntelliJって最高と感じたため、この記事を作りました。

※JavaとJavaScriptはサーバーと鯖寿司のように違います
※IntelliJの無償版の感想です

# IntelliJのメリット
- KotlinのファイルにJavaのコードをコピペすると、Kotlinのコードに変換してくれる
- Mavenを使ったときにeclipseと違ってゴール一覧が表示される
- ターミナルが使える
- プラグインの追加が簡単で速い
- UIがシンプル（ツールバーがにlipseのようにたくさんボタンがない）
- Kotlinなどのmainメソッドのところに実行ボタンが出て、その場で実行できる

# IntelliJのデメリット
- ショートカットキーが独特(`Ctr+D`で行削除でなく、行のコピーが作られるなど)
- eclipseの情報のほうが多い（気がする）
- 課金しないと使えない機能がある

# 終わりに
この記事を読んでいただきありがとうございます。よければ、LGTM:lgtm:をお願いいたします。
Pythonの定数、Noneとか（リファレンスによると)

#はじめに
pythonの**定数**について調べた。
しっくりは、きていませんが。

#pythonの定数

python,　定数
とかでぐぐると、リファレンスの以下の項にたどり着く。
https://docs.python.org/ja/3/library/constants.html

以下、引用。
>組み込み**定数**
組み込み名前空間にはいくつかの**定数**があります。**定数**の一覧:

念のため、
https://docs.python.org/3/library/constants.html
も引用しておく

>Built-in Constants
A small number of constants live in the built-in namespace. They are:

ここでは、以下の6つが示されている。

False
True
None
NotImplemented
Ellipsis
\_\_debug\_\_

値をみてみる

```
>>> False
False
>>>
>>> True
True
>>>
>>> None
>>>
>>> NotImplemented
NotImplemented
>>>
>>> Ellipsis
Ellipsis
>>>
>>> __debug__
True
>>>
```


値を代入してみる

```
>>>
>>> False = 3
  File "<stdin>", line 1
SyntaxError: can't assign to keyword
>>>
>>> True = 3
  File "<stdin>", line 1
SyntaxError: can't assign to keyword
>>>
>>> None = 3
  File "<stdin>", line 1
SyntaxError: can't assign to keyword
>>>
>>> NotImplemented = 3
>>>
>>> Ellipsis = 3
>>>
>>> __debug__ = 3
  File "<stdin>", line 1
SyntaxError: assignment to keyword
>>>
>>>

```

⇒　**↓↓↓NotImplementedとEllipsisは、値が代入できてしまう。(定数なのに。。）**ちょっと、意味の違う定数なんでしょう。

```
>>> NotImplemented
3
>>>
>>> Ellipsis
3
>>>
>>> type(NotImplemented)
<class 'int'>
>>> type(Ellipsis)
<class 'int'>
>>>
```
↑↑↑　本気で、代入されていますね。。。intになっていますね。。。

#補足
コメント頂いたので補足。
False
True
None
は、**キーワード**でしょう、とのこと。

以下の
https://docs.python.org/ja/3/reference/lexical_analysis.html#identifiers
を引用すると、

>2.3.1. キーワード (keyword)¶
以下の識別子は、予約語、または Python 言語における キーワード (keyword) として使われ、通常の識別子として使うことはできません。キーワードは厳密に下記の通りに綴らなければなりません:
>
**False**      await      else       import     pass
**None**       break      except     in         raise
**True**       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

また、
コメントで示して頂いた
http://python-history.blogspot.com/2013/11/story-of-none-true-false.html
https://www.python.org/dev/peps/pep-0285/
も参考になります。



#まとめ
あまりしっくりは、きませんでした。
コメントなどあればお願いします。:candy:

どちらかというと、**『リファレンスで残念な気分になったあるある』**という感じの記事にいまのところなっています。。。
AtCoder Beginner Contest 170 B問題「Crane and Turtle」解説(Python3,C++,Java)

AtCoder Beginner Contest 170 B問題「 Crane and Turtle 」の解説を行います。

>問題URL :
https://atcoder.jp/contests/abc170/tasks/abc170_b

#問題概要
庭に何匹かの動物がいる。
情報として、
・庭の動物の総数$X$,
・足の総数$Y$
が与えられる。
鶴の足の本数は$2$本、亀の足の本数は$4$本である。

$X$,$Y$の情報にあてはまるような鶴と亀の数の組み合わせが存在するかを判定せよ。
出力：
・存在する `"Yes"`と出力
・存在しない `"No"`と出力

##制約
・ $1 \leq X \leq 100$
・ $1 \leq Y \leq 100$
・入力の全ての値は整数

#解説
##解法1(全探索)

幸い、$X$と$Y$の制約が小さいので、以下のような処理を行えばよいです。

・$X,Y$を入力
・フラグ関数$flag$を宣言し0で初期化する
・亀の匹数を$i$として、$i$を$(0,X)$の区間でとり　以下の繰返し処理を行う
　　・もし $Y - 2i $が$4$で割り切れ、かつその商が$X-i$であれ
　　　ば`"Yes"`と出力し、以降のループを終了する
　　　これにより組み合わせのフラグが立ったので$flag$に1を加算する
・もし$flag = 0$ならば組み合わせはないので`"No"`と出力する

Python3での解答例は以下のようになります。
(C++,Javaでも同様の解法で解くことができます)
<details><summary>Python3での解答例(解法1)</summary><div>

```{B.py}
x,y = map(int,input().split())
flag = 0
for i in range(x+1):
  if (y - 2*i)%4 == 0 and (y -  2 * i)//4 == x - i:
    flag += 1
    print("Yes")
    break
if flag == 0:
  print("No")
```

※for i in range(x+1)としているのは、iの値を$(0,x)$の区間で取っているためです。 for i in range(x)とすると、iの値を$(0,x-1)$の区間でとることになります。
</div></details>

##解法2

鶴の匹数を$a$,亀の匹数を$b$とおくと、以下のような連立方程式が成り立つことになります。

```math

  \begin{cases}
    a+b = X \\
    2a+4b = Y
  \end{cases}

```

これを解くと

```math

  \begin{cases}
    a = \frac{4x-Y}{2}　\\
    b = \frac{-2x+Y}{2} \\
  \end{cases}

```

という2つの解が得られます。
<b>この両方が整数解でかつ0より大きいかどうかを判定すればよいです。</b>
<font color = "#808080">(制約が小さいので、今回は解法1
でも余裕で実行時間制限に間に合います)</font>

<details><summary>Python3での解答例(解法2)</summary><div>

```{B2.Py}
x,y = map(int,input().split())
a = (4*x-y)/2
b = (-2*x+y)/2
if a%1 == 0 and 0 <= a and b%1 == 0 and 0 <=b:
  print("Yes")
else:
  print("No")

```

</div></details>

一般的には解法2ではなく解法1で解かれる方が多いので、ここでは解法1で解いたC++,Javaの解答例を以下に示します。

<details><summary>C++での解答例(解法1)</summary><div>

```{B1.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  int x,y;
  cin >> x >> y;
  int flag = 0;
  for (int i = 0; i <= x; i++){
    if ((y-2*i)%4 == 0 && (y - 2 * i)/4 == x-i){
      flag++;
      cout << "Yes" << endl;
      break;
      }
    }
  if (flag == 0){
    cout << "No" << endl;
  }
}
```

</div></details>

<details><summary>Javaでの解答例(解法1)</summary><div>

```{B1.cpp}
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    int x = scan.nextInt();
    int y = scan.nextInt();
    int flag = 0;
    for (int i = 0; i <= x; i++){
      if ((y-2*i)%4 == 0 && (y - 2 * i)/4 == x-i){
        flag++;
        System.out.println("Yes");
        break;
      }
    }
    if  (flag == 0){
      System.out.println("No");
    }
  }
}
 ```

</div></details>
Flask GETのクエリパラメーターを取得する

Flask https://flask.palletsprojects.com/en/1.1.x/ 
でGETのパラメータを取得した時のメモ

```python:
@app.route('/search')
def analyzer():
    
    query = ""

    if request.args.get('q') is not None:
        query = request.args.get('q')
    else:
        query = "パラメーターがないよ"
    
    return query
```

http://localhost/search?q=クエリだよ

で試す
アルゴリズムの基礎

#アルゴリズムについての勉強メモ

##アルゴリズムとは
- 問題や課題を解決するための処理手順を、もれなく表現したアイディアや考え方
- 料理のレシピ、音楽の楽譜、取扱説明書など
- 手順、アイディアや考え方

##いいアルゴリズムとは
- わかりやすい、高速、効率的、再利用しやすい

##アルゴリズムの3つの基本
- 順次構造　順序通りに処理する
- 選択構造　条件式で判定して実行する処理を切り替える
- 反復構造　条件を満たす間、同じ処理を繰り返す手順



## 学ぶべき9つのアルゴリズム
- 線形探索法（リニアサーチ）
- 二分探索法（バイナリサーチ）
- ハッシュ探索法
- 単純交換法（バブルソート）
- クイックソート
- エラトステネスのふるい
- ユークリッドの互除法
- 単純選択法（選択ソート）
- 単純挿入法（挿入ソート）


### 参考
アルゴリズムをはじめよう　伊藤静香　著
なぜかCSSがあたらないってとき

自分用メモみたいな感じですが

どう考えてもちゃんと書いてるのになぜか反映されず、キャッシュクリアしても chrome の検証にもそもそも出てこないってときは、一番基本に立ち返ってよーくコードを見ます。
タイプミスもしくは余計な文字が入っていることでしょう（`}`が一個多いとか）。
ワークフローエンジン Digdagについてのメモ

- サーバのバッチ処理の管理に「ワークフローエンジン」というのが良さそうな感じ。企業情報システムで「ワークフローシステム」というと、稟議書等で役職者の承認を管理するものと思ってしまうが、ここでは「複数タスクを依存関係に従って実行、状況管理するツール」くらいの意味で、最近特にデータ分析の前処理にあたる「データパイプライン」を扱うものを指すことがある。自分の管理したいジョブもまさにこれ。
- タスクの依存関係の構造はDAG(Directed acyclic graph, 有向非巡回グラフ)等と言われて研究されているみたい。
- ジョブ管理したいサーバはlinuxとWindows。ワークフローエンジンはapache airflowというのがメジャーな感じだけど、Windowsサーバには対応してないみたい。さらに調べて、公式ドキュメントにWindowsの記載もあるdigdagを使ってみることにする。
  - [Digdag – Open Source Workflow Engine for the Multi-Cloud Era](https://www.digdag.io/)
- digdagにはserver modeとclient modeがある。server mode はクライアントからの接続を受け付ける。Webの管理画面の表示も行える。デフォルトのポートは65432だが、セキュリティのこともあるので変えた方が良いかも。
- client mode は他のサーバにジョブの登録をしたり、他のサーバに登録してあるジョブを起動したりできる。
- digdagはjava8の実行環境がセットアップしてあれば単一ファイルで動く。必要に応じて他の設定ファイル等を作成する必要があるが、インストールが簡単なのがこのツールの特徴。そのためかWindows版は単一ファイルdigdag.batの中にいろいろ詰め込まれている感じだけど、細かいことは気にしない。
- [Command reference — Digdag 0.9.42 documentation](http://docs.digdag.io/command_reference.html?highlight=server#server)
- ただしjava8の実行環境をどうやって用意するかは、javaに詳しくない人には少し難しいかも。自分も詳しくなくて、当初はjavaの新しいバージョンなら上位互換だろうとタカを括ってjava14で試したらdigdag起動しなかった。
- それで困って、ネットを検索して見つけた下記のページを参考にしてAdopt Open　JDKのjava8を使った。Amazon Corretoという環境もあるみたい。
  - [Oracle Java有償化。無料で商用利用可能なJavaはどれを選ぶか | TeraDas](https://www.teradas.net/archives/30444/)
  - [AdoptOpenJDK - Open source, prebuilt OpenJDK binaries](https://adoptopenjdk.net/index.html)
  - [Amazon Corretto（﻿本番環境に対応したOpenJDKディストリビューション﻿）| AWS﻿](https://aws.amazon.com/jp/corretto/)
- digdag serverを起動すると、ジョブ名さえわかればよそからそのジョブを起動できる。これはすごく便利だけどどこからでも起動可能というのはさすがに危険で、認証をつけたいのだけど、digdag本体にbasic認証をつけるという手順は自分が試した範囲ではうまくいかなかった。試したのは下記だが、自分が何か勘違いしているのかもしれない。
  - [Seven Useful DigDag Tips and Tricks | Thejesh GN](https://thejeshgn.com/2019/10/30/seven-useful-digdag-tips-and-tricks/)
- 結局、nginxを別に立ててリバースプロクシとし、digdagのWeb画面はnginx経由でアクセスする。digdag serverはファイアーウォール設定でnginxサーバ以外からのアクセスを禁止し、nginxサーバにbasic認証をつけた。
- 以降、また何かあれば追記予定。