OmniAICreator/Qiita-1.07M huggingface dataset:
【macOS Catalina】crontab -e でOperation not permittedの解消方法

# 【macOS Catalina】crontab -e でOperation not permittedの解消方法

既にQiitaにもいくつかエントリーがありますが、それでも解決できない場面があったので、補足として記載します。

[macOS Mojave で crontab -e できない](https://qiita.com/labocho/items/e1d8ae8223f60ad9d4ee)
[【Mac】crontabでOperation not permittedと出た時の解決方法](https://qiita.com/nishina555/items/b8b0800800ccb46333af)

[2020/8/5 追記]

解決方法を見つけたので追記しました。
p.s. 以下のページが参考になりました。ありがとうございます。

<https://mac-ra.com/catalina-crontab/>

## 一般的な解消方法

```:log
crontab: installing new crontab
crontab: tmp/tmp.7351: Operation not permitted
crontab: edits left in /tmp/crontab.ji8RUZh6dh
```

上記のエラーが発生した場合、以下を開く。
「システム環境設定 > セキュリティとプライバシー > プライバシー > フルディスクアクセス」
iTermを使用している場合は、iTermにチェックを入れて追加する。

## 上記で解決できない場合

### mountしたドライブ(外付けSSD)にcronが実行できない

`crontab -e`で以下のような記述をしました。
`Seagate_5TB_y`が外付けSSDで、その中の`Google Drive`フォルダに個人のGoogle Driveフォルダをマウントさせています。

```bash=
*/1 * * * * tar zcvf /Volumes/Seagate_5TB_y/Google\ Drive/ssh.tar.gz ~/.ssh/
```

しかしながら、結果は、、

```bash=
tar: Failed to clean up compressor
```

となり、mount先に新しいファイルを作成することができません、

## 最後に

現在では、gdriveコマンドやskickコマンドがGoogleの認証が使用できない事象が発生してます、
そこと関係があるのかもしれません。

解決方法をご存知の方はご教授頂ければと思います。

[追記]

解決方法がわかりました。

1. 「システム環境設定 > セキュリティとプライバシー > プライバシー > フルディスクアクセス」
2. +をクリック
3.  [command] + [shift] + [G] で`/usr/sbin/cron`を入力

以上で解決できました。

## Reference

[macOS 10.15 catalina で crontab を使用する](https://mac-ra.com/catalina-crontab/)
DynamoDB作成時のCloudFormation とSAM CLIの使い分け

## 概要
DynamoDBを使用するときにLambdaから読み書きさせるためSAM(Serverless Application Model)を使おうとしたときにうまくいかなかったのでその時の

## 発生した問題点
Lambdaを作成するついでにDynamoDBの定義も記載しようとしたところ `GlobalSecondaryIndexes` を指定することができませんでした。
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-property-function-dynamodb.html)を見るとなかった・・・

## 対応
DynamoDBで `GlobalSecondaryIndexes` を使用するときはCloudFormationを使用する。
今回作成予定のDynamoDBはSAMで登録しようとしたLambda以外にも別にLambdaを作成する予定だったためほかの更新に引っ張られないようにするためにも別にするのは良かったかなと思います。
ただ、今回は検索処理の都合で PrimaryKey以外でも検索をしたかったので  `GlobalSecondaryIndexes`  を使う予定だったのですが、本当に `GlobalSecondaryIndexes` を使うべきかを考える必要もありそうです。
【Docker】3分でjupyterLab(python)環境を作る！

# はじめに
docker-composeファイルを使ってjupyterLabの環境構築方法を記す。



> JupyterLabとは、Jupyter(iPython notebook)をベースにしたインタラクティブな開発環境

## 必要なファイル、ディレクトリ
- docker-compose.yml
    - jupyterLab環境に必要な設定などを記述するために使用する。
 
- workディレクトリ
    - ipynbファイルなどを保存するための使用する。

## ディレクトリ構成

以下のような構成図になるようにファイル、ディレクトリを作成。

```:構成図
.
├── docker-compose.yml
├── work
　　  
```


## docker-compose.ymlの内容
jupyterLab環境を構築するために、docker-compose.ymlに必要な設定を記述する。

```yml:docker-compose.yml
version: "3"
services:
  notebook:
　　 # https://hub.docker.com/r/jupyter/datascience-notebookからimageをpullする
    image: jupyter/datascience-notebook
    # ポートの設定("ホスト：コンテナ")
    ports:
      - "8888:8888"
    # 環境変数の設定
    environment:
      - JUPYTER_ENABLE_LAB=yes
    # ボリューム(データの永続化の場所)の設定(ホスト:コンテナ)
    # ホスト内のworkディレクトリとコンテナ内の/home/jovyan/workディレクトリが紐づいているイメージ
    volumes:
      - ./work:/home/jovyan/work
    # 最後にjupyterLabに接続するためのコマンドを実行する。
    command: start-notebook.sh --NotebookApp.token=''

```

## 起動方法

docker-compose.ymlを書き終えたら、以下のコマンドを実行


```
$ docker-compose up -d
```

初回はimageのpullなどで時間がかかる。

コンテナが立ち上がったら、http://localhost:8888 にアクセス。

以下のような画面が立ち上がれば成功！

<img width="708" alt="スクリーンショット 2020-06-21 23.24.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308470/585615d9-2d48-a768-23f8-53da09fdce61.png">

## 補足(docker runコマンドで起動したい人向け)

個人的はdocker-composeファイルを利用して起動する方法が好みだが、docker-composeファイルを作るのが面倒な方は以下のコマンドで起動することも可能。

```
$ docker run --rm -p 8888:8888 -e JUPYTER_ENABLE_LAB=yes -v ./work :/home/jovyan/work jupyter/datascience-notebook
```

起動時、コンソールに以下のようなログが出てくるので、[トークン]の部分をコピ-。

```
Copy/paste this URL into your browser when you connect for the first time,
  to login with a token:
  http://7dae9a493ca7:8888/?token=[トークン]
```
 
http://localhost:8888 にアクセス。 

すると、パスワードなどを求められるので、password欄に先ほどコピーしたtokenをペースト。

すると、jupyterLabの画面となる。


# 補足2
## pythonライブラリをインストールしたい
pythonライブラリをインストールしたい場合は、pipコマンドを使用する。
jupyterLabの場合は、Cellで実行することができる。

```
!pip install [pythonライブラリ]
```
Lambdaのトリガーの作成中にエラーが発生しましたの対処法

#Lambdaでトリガーを指定したい

###エラー内容

LambdaでS3のputをトリガーを指定しようとした時

#####trigger の作成中にエラー が発生しました: Configurations overlap. Configurations on the same bucket cannot share a common event type. (Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; Request ID: 8659097E5FCA60E1; S3 Extended Request ID: 2PrYTEd8BysODQscbugs/nK2CtkwOQPjw4JXuWgP6rF18PrrvTkq7cgsbs5gDDwKZdB+9qXAE1o=; Proxy: null)

というエラーが出ました。

同じバケットで同じイベントタイプでは作れませんよ的な内容です。


##同じトリガーの関数を消すだけではダメ

消しても同じエラーでした。

##解決策

トリガーで指定していたS3のバケット→プロパティ→イベントで該当のイベントを削除する

<img width="643" alt="スクリーンショット 2020-06-21 23.38.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447711/84566923-d48d-c4ec-c475-1c40533d519f.png">

##まとめ

覚えることいっぱいですね。
windows10でHDDを外したら起動できなくなった件

#HDDを１台外したらwindowsが起動できなくなった
##構成
- SSD１台（windows10proがインストールされている）
- HDD１台

上記構成でHDDを外すとwindowsが起動できなくなった。メッセージとしては「Operating System Not Found」
しかもHDDを初期化してどうにもならない状態になってしまった。
##原因
初期インストール時にSSDにwindows自体はインストールしたが、HDDに「システムで予約済みのパーティション」を割り当てていたため
##対処法
対処法としてはDVDより起動し、コマンドプロンプトで下記を指定して「システムで予約済みのパーティション」を作成する。

プロンプトで下記を実行する。

```:コマンドプロンプト
:diskpart
diskpart
list disk ←diskの一覧を表示。操作したい番号を書きで指定
select disk n
list partition
select part n
active
list volume
select volume n
exit
bcdboot.exe C:Windows /l ja-JP と入力
exit
```
エラー対処：error Expected linebreaks to be 'LF' but found 'CRLF'

## 起こったこと

Windows で、
vue.js の web アプリ (git clone してきた) をローカルで動かしてて
`App.vue` を編集したら
以下のエラーメッセージが画面いっぱいに出ました。（スクショ撮っておけばよかった）

**error  Expected linebreaks to be 'LF' but found 'CRLF'**

改行コードが違うよってやつです。

## やったこと

それで、以下の対処をしたらエラー消えました。（正しいのかはわかりませんが、実際に消えたので一応 記しておきます）

1. いったん実行を止める
2. `.eslintrc.js` の `rules` ブロックに `'linebreak-style': ['error', 'windows'],` を追加、保存
3. もう一度 `npm run serve`

## ESLint 

```js:.eslintrc.js
module.exports = {
  (略)
  rules: {
    'linebreak-style': ['error', 'windows'],
    (略)
  },
};
```

## その後

Git for Windows が改行コードをよしなにやってくれる機能が起因しているっぽいとお聞きしたので

```shell
$  git config --global core.autocrlf input
```
しておいた
H2 databaseのインストール手順

#はじめに
H2 databaseは、Javaで開発されている軽量データベースです。簡易に導入が出来る為、ちょっとしたサンプルアプリケーションの動作検証などに最適です。
本ページでは、最新バージョン（2020.6.21時点）のH2 databaseのインストール手順を説明します。

#導入環境
H2 databaseをインストールするPC環境は以下を前提とする。

| 種別               | プロダクト                  |
|:-------------------|:---------------------------|
| JVM                | Java 11                    |
| OS                 | Windows 10 64bit           |


#H2 databaseのインストール手順

1. [H2のダウンロードサイト](http://www.h2database.com/html/main.html)へアクセスし、「Windows Installer (5 MB)」リンクを押下してインストーラ（exeファイル）を任意の場所（デスクトップなど）にダウンロードする。
　※執筆時点でのダウンロードファイル名は、「h2-setup-2019-10-14.exe」です。
![h2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244937/1d2dde71-8017-d2b5-9b90-66b9fb3d25b9.png)

2. ダウンロートしたexeファイルをダブルクリックする。
　※「この不明な発行元からのアプリがデバイスに変更を加えることを許可しますか？」のダイアログが表示された場合は、[はい]を選択する。

3. セットアップウィザードが表示されたら、「インストール先フォルダ」を変更しないで、「次へ」ボタンを押下する。
![h2install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244937/7e91c433-b8d8-ce20-5dda-2d89132646fc.png)

4. 下図のセットアップ完了画面が表示されたら「完了」ボタンを押下する。

#H2コンソールの起動

1. スタートメニューから「H2 Console」を選択する。
![h2console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244937/06d52d78-2c2d-931a-6bf1-09479ce9eae2.png)

2. ブラウザに下図のログイン画面が表示されたら、「Saved Settings:」プルダウンから「Generic H2（Server）」を選択し、「Connect」ボタンを押下する。
　※他の入力項目の変更は不要です。
![h2connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244937/38239a42-e000-aaa4-e192-127586b4eabe.png)

3. 下図のコンソール画面が表示されたら接続完了です。
![h2console2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244937/f564e388-48dc-80f7-5a16-ca6150f485da.png)

#サンプルSQLを実行する。

1. コンソール画面下部の「Sample SQL Script」にある青い文字列をクリックすると、上部のテキスト入力欄にSQLがコピペされます。
コピペされたSQLは、最初にテーブルがドロップし、次に「TEST」テーブルを作成し、レコードを２件インサートし、全件取得し、レコードをアップデートし、レコードを削除しています。
![samplesqlcopy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244937/092eb965-a4e7-868e-e66d-2e48dbf5476d.png)

2. 「Run」ボタンを押下すると上記手順でテキスト入力欄にコピペされたSQLが実行されます。
SQLの実行結果が画面下部(下の赤枠の部分)に表示されます。
![samplesqlrun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244937/a64a92cd-9388-f09a-4527-d01299622fb1.png)

以上です。
Power Apps - Choice 関数 Dropdown List 

備忘録として；

One Drive の中のExcel をデータソースとして使用している場合、Choices 関数を使用してデータを引っ張ることが出来なかった。
Share Point Online のリストを使用しているであれば出来る。

Gallery 内のItem編集をするために、Field として Dropdown List を追加し、そのItems に Choice(Excel Table.列名) としてもエラーとなる。
↓↓これをやろうとした；
>https://youtu.be/gX5q_V3U8-s (Power Apps Patch Function)

Microsft docs に何となくそれっぽいことが書いてある。
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-choices#examples
>現時点では、参照列は SharePoint と Common Data Service でのみ使用できます。

※ Excelをソースとして Choice 関数を使う方法は模索中（2020/06/21）
【FuelPHP】Html::anchorを使わずにページ遷移させる

#問題点 : Html::anchorを使った時

```
//返り値 <a href="http://www.domain.com/example">Example</a>
echo Html::anchor('example', 'Example');

//返り値 <a href="http://www.otherdomain.com/example">Example</a>
echo Html::anchor('http://www.otherdomain.com/example', 'Example');
```

公式のドキュメントには上記のように書いていますが、
次のようにaタグの中にspanタグなどを入れたい場合の書き方が解説されていませんでした。

```
<a href="http://www.domain.com/example>
 <i class=""></i><span>Qiita</span>
</a>
```

#解決策 ： Uri::base()を使う

半日頭を悩ませて、Uri::base()を使う結論に至りました。

```
<a href="<?php echo Uri::base(); ?> example>
 <i class=""></i><span>Qiita</span>
</a>
```

事前にconfigファイルのbase_urlにベースのurlは書いておかないと使えません。

```:fuel/app/config/config.php
'base_url'  => 'http://www.domain.com/',
```


もっといい方法あれば教えていただけると嬉しいです。

ありがとうございました。
AtCoder 生活　82日目

[前回](https://qiita.com/flandrescarlet237/items/19537bb6e3f841878b40)

#82日目
今回は茶色diffの問題を1問解き,ABC171に参加しました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|ABC166|D|◯|12分35秒|


![スクリーンショット 2020-06-21 22.41.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/e4631f47-420f-ab0b-6535-2f7bf4fe5e92.png)


##[ABC166_D](https://atcoder.jp/contests/abc166/tasks/abc166_d)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int x;
    cin >> x;
    for(ll i = -200;i <= 200;i++){
        for(ll j = -200;j <= 200;j++){
            ll a = i*i*i*i*i;
            ll b = j*j*j*j*j;
            if(a - b == x){
                cout << i << " " << j << endl;
                return 0;
            }
        }
    }
}

```

解くのにかかった時間：12分35秒


##[ABC171](https://atcoder.jp/contests/abc171)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    char a;
    cin >> a;
    if('A' <= a && a <= 'Z') cout << 'A' << endl;
    else cout << 'a' << endl;
}

```

###B

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n,k;
    cin >> n >> k;
    vector<int> p(n);
    rep(i,n){
        cin >> p[i];
    }
    sort(p.begin(),p.end());
    ll ans = 0;
    rep(i,k){
        ans += p[i];
    }
    cout << ans << endl;
}

```


###最後に
ABC171のC問題は26進数で行けることには気づけたが実装できなかった…

難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|D|12分35秒|1問中1問|
ゼロから始めるLeetCode Day63 「195. Tenth Line」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day62「83. Remove Duplicates from Sorted List」](https://qiita.com/KueharX/items/0dbe2ebde8aa5dd7432d)

今はTop 100 Liked QuestionsのMediumを優先的に解いています。
Easyは全て解いたので気になる方は目次の方へどうぞ。

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！

# 問題
[195. Tenth Line](https://leetcode.com/problems/tenth-line/)

嗜好を少し変えて今回はshellについての問題です。

問題としては、テキストファイルである`file.text`が与えられます。10行目を出力してください。

>Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Your script should output the tenth line, which is:

Line 10



# 解法

awkコマンドを使って以下のように叩けば問題の条件を満たすことができます。

```
# Read from the file file.txt and output the tenth line to stdout.
awk 'NR == 10' file.txt
```

実はLeetCodeの問題はアルゴリズムだけではなく、データベースなどについての問題もあります。（数は少ないですが・・・）

今後はアルゴリズムだけではなく、こういった問題もたまには乗せていけると良いかなぁと思います。

では今回はここまで。お疲れ様でした。
CpawCTF level1

セキュリティの勉強しようとして調べたらCTF(Capture The Flag)っていう競技が出てきたので遊んでみた。もう答えもたくさんあがっているけど,
知らなかったこともあるので一応アウトプット。[CpawCTF](https://ctf.cpaw.site/index.php)のlevel1。

### 問題
#### [Crypto] Classical Cipher
解答がすべて`cpaw{答え}`の形式になるので、アルファベットを3前にずらす。ブラウザのF12からコンソールで

```
const str = "Fdhvdu_flskhu_lv_fodvvlfdo_flskhu";
let ans = "";
for(let i=0;i<str.length;i++){
    ans += String.fromCharCode(str.charCodeAt(i) - 3);
}
console.log(ans);
```
でいった。`_`が`\`なってエラーが出たが、アルファベット以外は直さないらしく、`{_}`はそのまま出力。

#### [Reversing] Can you execute ?
`file`コマンドで拡張子を調べられるらしい。
ELFファイルでinterpreterはlinuxなんちゃらと出てきたので、ubuntuにコピーして`./ exec_me`でこたえ。まぁ`file`ででたメッセージあんまよんでなくてググったけど。。。

#### [Misc] Can you open this file ?
これも拡張子がないので`file`で調べると今度はWordで作りました、みたいな文が出るのでWordで開く。

#### [Web] HTML Page
F12でソースコード内をflagで検索したらmeta dataのところに書いてある。

#### [Forensics] River
指示通りjpgファイルのプロパティみたら位置情報とか撮影日の情報書いてあった。google mapに経度と緯度入力したらデカい画面で見られた

#### [Network]pcap
ちょっと時間かかった。wiresharkっていうパケットキャプチャツールを入れて、pcapファイルをそれで開く。すぐ消すしdockerでインストール。https://hub.docker.com/r/linuxserver/wireshark が見つかった。

```
# 上記のHPに書いてある
docker create \
  --name=wireshark \
  --net=host \
  --cap-add=NET_ADMIN \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Europe/London \
  -p 3000:3000 `#optional` \
  -v /path/to/config:/config \
  --restart unless-stopped \
  linuxserver/wireshark

docker container start wireshark 
```
でhttp://localhost:3000にアクセス。pcapファイルがwiresharkから見つからなくて、dockerで起動していることを忘れていた。HPのコマンドコピペしたせいでマウントディレクトリが/path/to/config/になっていたので、そこにファイルをおいてopen。適当に開いてたら見つかった。

#### [Crypto]HashHashHash!
ググったら出てきたので以下のサイトで戻してもらった。
https://hashtoolkit.com/decrypt-hash/?hash=e4c6bced9edff99746401bd077afa92860f83de3

#### [PPC]並べ替えろ!
これもブラウザのコンソールから。
javascriptの配列のsort、数値の並べ替えにcompare関数が必要って知らんかった...

```
console.log(((arr.sort((a,b)=>b-a)).join("")));
```

### まとめ
面白そうだから本買ってみるけど、初心者が問題解く→解説見て勉強みたいな環境が競プロほど整ってないのか、Atcoder的なとりあえずここやっとけ的なものがわからなかった。解説がないサイトが多い？
組込ソフト開発の基礎(物理値と内部値の関係)

#はじめに
　組込エンジニアのソフト開発はテクニックが多いけど、Pythonやweb系プログラミングに比べると情報量が少ないので備忘録として紹介したいと思いました。
　学生時代からプログラミングを勉強してきたけど、組込プログラミングを初めた頃は知らないテクニックが多くて驚きました。

#自己紹介
　組込エンジニア歴15年くらい。
　情報系大学院を卒業後、そのまま組込分野に携わっています。

#数値の扱い方
　未だに整数演算しかできないマイコンも存在するし、過去リソーセスを利用するため、浮動小数点演算を禁止していることがあります。
ソース上では小数点演算も整数演算で表現しなければいけません。
そのため、**物理値と内部値**という考え方をします。

#物理値と内部値
　現実世界の電圧(2.45[V])をどうやって、コンピュータ内で表現するか考えます。

>物理値の条件
>最大電圧：5[V]
>最小電圧：0[v]
>変化量　：0.01[V]ずつ変化させる
>表現したい値：2.45[V]

この物理値をunsigned型、1バイトの変数で表現する方法を考えます。

>内部値の条件
>符号：なし(unsigned)
>サイズ：1バイト(8ビット)
>最大値：255
>最小値：0

#物理値から内部値へ変換
 内部値1で物理値がいくつになるか考えればいい。
　これを**LSB**と呼んでいます。
  LSBがいくつになるか考えていきます。

>5[V] / 255 = 0.019607843137255[V]

内部値：1→物理値：0.019607843137255[V]
となるので、
>物理値：2.45[V]は、内部値：124.95
しかし、整数値しか表現できないので
**内部値：124**
となります。

#検証
内部値：124が物理値：2.45[V]を表現できるか検証します。

> 124 * 0.019607843137255[V] = 2.43137254901961[V]

真値との誤差を検証する。

> 2.45[V] - 2.43137254901961[V] = 0.018627450980393[V]

物理値の変化量が0.01[V]なので電圧の変化を表現することができない。
**なお、物理値：2.44[V]も内部値：124となってしまう。**

#必要な精度にするために
1バイトで物理値を表現することはできない。そのため、2バイトで表現することで精度上げる。

#2バイトで内部値を表現した結果
>内部値(2バイト)の条件
>符号：なし(unsigned)
>サイズ：2バイト(8ビット)
>最大値：65535
>最小値：0

LSBと2.45[V]を表現した結果を示します。

>LSB:5/65535 = 7.62951094834821 * 10^-05

>2.45[V]は内部値：32112

#再検証
　内部値：32112が物理値：2.45[V]を表現できるか検証します。
>32112 * 7.62951094834821 * 10^-05 = 2.44998855573358[V]
>2.45[V] - 2.44998855573358[V] = 1.14442664225223 * 10^-05[V]

物理値の変化量が0.01[V]なので、電圧の変化を表現することができます。

#まとめ
　小数点演算を整数演算で考えるためには、物理値から内部値に変換する必要があります。
　その際、表現したい精度を考え、変数の型を決める必要があります。

#注意点
・今回決めた2バイト型とLSBは、ソースを触る人全員が知っている必要があります。
・全て一番大きな型で表現すれば、物理値の精度はある程度保証できると思います。
　しかし、物理値の計算する場合、最大の型でしか持ってないと、演算がオーバーフローするので注意が必要です。
Go Web開発の大枠

#Web開発の大枠

今日学んだWeb開発の大枠の流れについてまとめてみた。

(参考)
[Goプログラミング実践入門　標準ライブラリでゼロからWebアプリを作る](https://www.amazon.co.jp/Go%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Sheong-Chang-ebook/dp/B06XKPNVWV)
##HTTP通信の流れ
まずHTTP通信の流れを理解する。

1.クライアントがサーバに**リクエスト**を送る。
　※この時Cookieなどのデータがあれば一緒に送る

2.サーバ側で処理

3.クライアントに**レスポンス**を返す

##サーバが行う処理の流れ
次に実際にサーバで行われている処理を理解する。

1.クライアントからのリクエストを**マルチプレクサが受理する**

2.URIを解析し、指定の**ハンドラ**に処理を要求する

3.ハンドラで処理を行う
　※必要なデータがあればデータベースにデータを要求し、**データモデルとなる　構造体**でデータを受け取る

4.ハンドラで**テンプレートエンジン**を呼び出し、**テンプレート**を作成

5.マルチプレクサに処理した内容を送り、クライアントにレスポンスを返す。
PostGIS on windows10

## はじめに
フリーのGISソフトを試すため、ジオデータベースとして **"PostGIS"** をインストールしてみたので、その時の手順を整理する。
※ジオデータベースとは、GISデータ（空間データ）を格納するための場所。

## 前提条件
【PC環境-OS】
　　・Windows 10 Pro　

【今回インストールするもの】
　　・PostgresSQL 10.13
　　・PostGIS 2.5

## 手順

１．PostgreSQLのインストール
２．PostGISのインストール
３．確認


### １．PostgreSQLのインストール

**■以下のサイトから、Windows向けのインストーラをダウンロードする。**
https://www.postgresql.org/download/

※今回インストールするのは **ver10.13[64bit]** のもの。本当はver12をインストールしたかったけど、ver12/11はWindows10でテストされていない的な事が書かれていたので・・・

**■ダウンロードした『postgresql-10.13-1-windows-x64.exe』を管理者権限で実行**

・Setup Wizardが開くので、『NEXT』をクリック。

・インストール先を指定して『NEXT』をクリック。

・インストールするコンポーネントを選択して『NEXT』をクリック。
　　※基本的に全部でOK。[pg admin] と [Stack Builder]は後で使うので、チェックを外さない事！

・データ格納先を指定して『NEXT』をクリック。

・Postgres データベース管理者のパスワードを設定して『NEXT』をクリック。

・ポート番号を設定して『NEXT』をクリック。

・ロケールの設定。**[Japanese, Japan]**を選択して『NEXT』をクリック。

・インストール内容について確認画面が表示されるため、問題なければ『NEXT』をクリック。

・『Ready to Install』という画面が表示される。『NEXT』をクリックしてインストール開始。

・インストールの完了画面が表示されるので、『Stack Builder ～～』にチェックを入れて『Finish』をクリック。

### ２．PostGISのインストール

**■Stack Bulderを起動させる。　※PostgreSQLインストールの最後にチェックを入れれば自動起動される**
・「PostgreSQL 10 ... on port ... 」を選択して『次へ』をクリック．
![Qiita-no004_img01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/60821454-d02b-403b-cb8f-6d099d5eb548.jpeg)

・Spatial Extensions ＞ PostGIS 2.5にチェックを入れて『次へ』をクリック。
![Qiita-no004_img02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/1bdbc860-f6fc-2dd0-8e12-c83592bf07a4.jpeg)

・PostGISインストーラのダウンロード先を指定して『次へ』をクリック。
　（デフォルトだとユーザー直下になっていたので、**ユーザー＞ダウンロード**に一応変更。）

・ダウンロード完了画面が表示されたら、『次へ』をクリック。

・ライセンス契約書の内容を確認して、『I Agree』をクリック。

・コンポーネントを選択して『NEXT』をクリック。
※[Create spatial database] にチェックを入れる。
![Qiita-no004_img03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/5c11a29a-038c-c0e9-1ece-710f2d609f40.jpeg)

・インストール先を指定して『NEXT』をクリック。

・PostGISデータベースの作成先のサーバー(PostgreSQL)のパスワードを入力して『NEXT』をクリック。

・PostGISのデータベース名を設定して『Install』をクリックするとインストールが開始。
　※環境設定についてのダイアログがいくつか表示された場合、一旦は全て『はい』でOK、

・インストール完了画面が表示されたら『終了』をクリック。

**これで PostgreSQL ＆ PostGIS のインストール完了！**

### ３．確認
**■『pgadmin』を開いて先程のDBが存在しているか確認**
※初回はマスターパスワードの設定を求められるので適当に入力する。
![Qiita-no004_img04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654767/690a858e-61d3-3ea0-73de-bc8b2ccb3317.jpeg)
上図の様に『Postgis』のDBもあればOK！


## まとめ
PostGISのインストールが無事完了したので、次は実際に緯度・経度情報からジオメトリデータを作って、GISソフト上で表示させる手順をまとめたいと思います。⇒[こちらの記事](https://qiita.com/smiler5617/items/220050cb06ae9a71c0ed)
Nuxt.js + VuetifyでFontAwesomeを使用する

Nuxt.jsでVuetifyを使用するときに、Vue.jsのときのように`plugins/vuetify.js`がなくどこで設定すればいいのか迷ったのでメモ。

# FontAweSomeをインストール

ここは公式通り。

```sh
yarn add @fortawesome/fontawesome-free -D
// OR 
npm install @fortawesome/fontawesome-free -D
```

# nuxt.config.jsに追加

`nuxt.config.js`の`vuetify`に以下を追加

```diff:nuxt.config.js
   vuetify: { 
++   defaultAssets: {icons: 'fa'}
     customVariables: ['~/assets/variables.scss'], 
     theme: { 
      dark: true, 
       themes: { 
         dark: { 
           primary: colors.blue.darken2, 
           accent: colors.grey.darken3, 
           secondary: colors.amber.darken3, 
           info: colors.teal.lighten1, 
           warning: colors.amber.base, 
           error: colors.deepOrange.accent4, 
           success: colors.green.accent3 
         } 
       } 
     } 
   }, 
```

これでOK。

```vue
<v-icon>fas fa-pen</v-icon>
```
WioTerminalでROMデータのJpegを表示する

# どんな内容か？
WioTerminalのLCD（320x240）に画像を表示しようとした場合に、SDカードからファイルを読み込んで表示するサンプルは多数見つかるのですが、WioTerminalは潤沢なFlashROMを持っているので、Constでプログラム中に持っていてもいいよなぁと思ったので作りました。その場合に、C言語のconstで画像のROMデータを作成するのが手間なので、JpegファイルからROMのConstデータを生成するWebサイトも作成しました。プログラムはたいしたことが無いので、この変換サイト作ったのがメインかもしれませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143415/6719904d-3be4-6cf8-710d-1b3113e6ac01.png)

# プログラムについて
説明するほどではありませんが主要な部分を簡単に解説します。★部分

```c:WioMemoryJpeg.ino
// ★Jpegの表示には、@lovyan03さんの高速描画ライブラリを利用しました。
// https://platformio.org/lib/show/7359/LovyanGFX
#include <LGFX_TFT_eSPI.hpp>

static TFT_eSPI tft;               // TFT_eSPIがLGFXの別名として定義されます。

// ★画像のサイズを定義します。
#define IMG_WIDTH  (320)
#define IMG_HEIGHT (240)

extern const uint8_t img[15687];

void setup()
{
  tft.init();
  tft.setRotation(1);

  // ★ここでJpegを描画します。ROMテーブルの先頭アドレスと画像のサイズを与えるだけです。
  tft.drawJpg(img, sizeof(img), 0, 0, IMG_WIDTH, IMG_HEIGHT);
}

void loop() {
  // put your main code here, to run repeatedly:

}

// ★Jpegのデータを作成するのが、手作業やバイナリエディタで作成するのが手間でしたので
//   Javascriptでデータを作成できるサイトを作りました。
// https://wioterminal.s3-ap-northeast-1.amazonaws.com/index.html
const uint8_t img[15687] = {
0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x46, 省略・・・・};
```

全プログラムは[Github](https://github.com/carcon999/WioTerminal-WioMemoryJpeg)からダウンロードが可能です。

# Webサイトについて
[こちら](https://wioterminal.s3-ap-northeast-1.amazonaws.com/index.html)から、利用することが可能です。
使い方については説明不要だと思います。ファイルを指定すると、右下にconst定義のコードが出力されるので、コピペしてArduino IDEでご利用いただけます。特に画像サイズ制限は行っていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143415/445101cc-fb19-fdc9-36ec-027eb7f62c3a.png)

以上です。
S3 MFA Delete

# S3 MFA Deleteとは
S3でオブジェクトを削除(※)する際にMFA認証を必須とする機能。
※ ここでいう削除は特定バージョンの削除。表面的なファイル削除は可能。

- 該当S3バケットのバージョニングが有効になっていることが前提条件
- マネジメントコンソール上でMFA認証は行えないため、同設定を行った場合、CLIからのみしか操作ができない
- 利用可能なMFA認証はrootアカウントのMFAデバイスのみとなる
- MFA Deleteが有効になっている際はバージョニングの無効化不可

ユーザの誤操作でバージョンが消失することを防ぎたい場合に有効か。

# やってみる
**注意：rootアカウントのアクセスキー/シークレットアクセスキーは作業完了次第、消す！**

###1.事前準備
rootアカウントのアクセスキーID/シークレットアクセスキーをIAMから発行。またMFAデバイスのARNを控えておく。

###2.設定用profileの作成
rootアカウントで操作するための設定用profileを用意する(終わったら速やかに消す)

```
% aws configure --profile mfa-delete
AWS Access Key ID [None]: [rootアカウントのアクセスキーID]
AWS Secret Access Key [None]: [rootアカウントのシークレットアクセスキー]
Default region name [None]: ap-northeast-1
Default output format [None]:
```

###3.MFA Delete有効化
以下コマンドでMFA Deleteを有効化する。

```
% aws s3api put-bucket-versioning --bucket [バケット名] --versioning-configuration Status=Enabled,MFADelete=Enabled --mfa '[MFAデバイスのARN] [MFAデバイスのトークン]' --profile mfa-delete
```

###4.結果確認
マネジメントコンソールからバージョンの削除を行ってもできない。

また、バージョニングの無効化ができない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37901/b2422abe-39c2-e659-4d79-465725c02feb.png)


###5.後片付け
やめたいときはDisabledに戻す

```
% aws s3api put-bucket-versioning --bucket [バケット名] --versioning-configuration Status=Disabled,MFADelete=Enabled --mfa '[MFAデバイスのARN] [MFAデバイスのトークン]' --profile mfa-delete
```

**rootアカウントのアクセスキーとprofileも忘れずに削除！**
pandas での reset_index() で series を dataframe にする

[データサイエンス１００本ノック](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)やっています。
わからなかったことのメモです。

```
P-030: レシート明細データフレーム（df_receipt）に対し、
店舗コード（store_cd）ごとに売上金額（amount）の標本分散を計算し、降順でTOP5を表示せよ。
```

という問題で、自分の答えは以下でしたがうまくいきませんでした。
`df_receipt.groupby("store_cd").amount.var(ddof=0).sort_values("amount", ascending=False).head(5)`

正解は以下でした。
`df_receipt.groupby('store_cd').amount.var(ddof=0).reset_index().sort_values('amount', ascending=False).head(5)`

違いは `.reset_index()`だけです。
`reset_index()` はインデックスを振り直すためのメソッドです。
ただし、結果として `series`型 として取り出したデータを `dataframe`型 に変換することになるみたいです。
`sort_values()`は`series` では使えないので `reset_index()` で `dataframe` に変更する必要があった、ということのようです。

ここまでの問題も回答では `reset_index()` を使っていましたが、自分は使っていませんでした。
`reset_index()`をしなくても同じ回答が出ていたので、なんで使うのかわからなかったんですが、こういう理由だったんですね。
Raspberry Pi0W にHugo最新版をインストールする(2020.06.21)

Raspberry PiZeroW にHugo最新版をインストールしようとしたら苦労した備忘録。

## なぜPiZeroWにHugo?

オーディオ再生の実験用にPiZeroWを買ったけど、実験が終わって使い道がなくなった。
有効利用に低消費電力（1Wくらい）を活かしてWebサーバーなんでどうか？
せっかくならSSG（静的サイトジェネレーター）もインストールして単体でWebサイトが構築できるようにしたいなぁ。
PiZeroはCPUが低速なので高速なSSG、Hugoをインストールしよう！

## 問題点

Ubuntu はPiZeroに対応してない。
Raspberry Pi OS(旧Raspbian)はaptでインストールできるHugoのバージョンが古い。

SnapパッケージにはPiZeroのarmv6lが無い！（Pi2以降ならSnapが使える）

そもそもSnapパッケージはSandBoxの中で動くのでasciidoctorなどの外部プログラムと連携できない。

Hugo公式サイトにバイナリがあるが、やはりPiZero（armv6l）に対応したものはない。

Hugoをソースからインストールする必要があるが、Raspberry Pi OSでaptでインストールできるgolangはバージョンが古くてコンパイルできない。

## 必要な手順

### 公式サイトからgolangの最新版のバイナリをインストールする。
golang 公式サイト https://golang.org/
ダウンロードページ https://golang.org/dl/
2020/06/21時点のPiZeroに対応した最新版
go1.14.4.linux-armv6l.tar.gz

```
# ダウンロード (2020/06/21時点)
curl -O https://dl.google.com/go/go1.14.4.linux-armv6l.tar.gz
# チェックサム確認
sha256sum go1.14.4.linux-armv6l.tar.gz

# インストール
tar -C /usr/local -xzf go1.14.4.linux-armv6l.tar.gz

# パスを通す　~/.bashrcに追記
export PATH=$PATH:/usr/local/go/bin
```

### 公式サイトからHugo のソースをダウンロード、コンパイルする。
Hugo 公式サイト https://gohugo.io/
インストールは公式サイトのドキュメント（Sourceの項）通り
https://gohugo.io/getting-started/installing/

```
mkdir $HOME/src
cd $HOME/src
git clone https://github.com/gohugoio/hugo.git
cd hugo
go install
```

PiZeroでは小一時間かかる。


## 結論

最速のSSG、HugoをもってしてもPiZeroは遅く実用にするには辛い。
Hugoを使うのは非常用で、通常は別のPCでHugoを使って、出来上がったのもを転送するだけのほうが良さそう。
っていうか、PiZeroじゃなくて、Pi2以降を使おう。
競技プログラミング練習記 No.18【ABC171参加】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[ABC171](https://atcoder.jp/contests/abc171)に参加しました。
5完です。
本番で5完したのは初めてです。
それと、初めて水色Performanceをとりました。嬉しい。

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A | 2min |char|5ms|
| B | 2min |-|9ms|
| C | 9min |対数|8ms|
| D | 8min |しゃくとり法|39ms|
| E | 7min |xor|44ms|



## A - αlphabet
```c++
	char a;
	cin >> a;
	cout << ((a - 'A') <= 26 ? "A" : "a");
```
`char`型は内部では文字コードを数字として持っています。
その性質を利用して大文字か小文字かを判定しています。
`A`が`65`、`a`が`97`で`A`のほうが小さいのでこの式になっています。


## B - Mix Juice
``` c++
	int n, k;
	cin >> n >> k;
	vector<int> p(n);
	for(int i = 0; i < n; ++i)
	{
		cin >> p[i];
	}
	sort(p.begin(), p.end());

	int ans = 0;
	for(int i = 0; i < k; ++i)
	{
		ans += p[i];
	}
	cout << ans;
```
`K`個選んだ時の合計価格の最小値を求めます。
入力数列をソートして、小さい順から`k`個分の和が答えになりますね。


## C - One Quadrillion and One Dalmatians
``` c++
	ll n;
	cin >> n;
	ll loop_cnt = 0;
	ll log = 1;
	while(n >= log)
	{
		n -= log;
		log *= 26;
		loop_cnt++;
	}

	for(int i = 0; i < loop_cnt; ++i)
	{
		log /= 26;
		cout << (char)(((n / log) % 26) + 'a');
	}
```
対数が使えそうで使えない問題ですね。
でも考え方では対数を使います。

`n` が `1 ~ 26^1` なら1文字
`n` が `26^1 + {1 ~ 26^2}` なら2文字
`n` が `26^1 + 26^2 + {1 ~ 26^3}` なら3文字
...
`n` が `26^1 + ... + 26^(k-1) + {1 ~ 26^k}` なら`k`文字
です。

`{}`で囲んだ部分を取り出して、`26^i` で割って `% 26` を計算すると`i`番目の文字がわかります。
`( ( n - (26^0 + 26^1 + ... + 26^(k-1)) ) / 26^i ) % 26` ですね。

式が複雑になっちゃいました。。。
以上をプログラムにすると上のようになります。

## D - Replacing


``` c++
	int n, input;
	cin >> n;
	vector<int> a(100001, 0);
	for(int i = 0; i < n; ++i)
	{
		cin >> input;
		a[input]++;
	}

	ll ans = 0;
	for(int i = 0; i <= 100001; ++i)
	{
		ans += a[i] * i;
	}

	int q, b, c;
	cin >> q;
	for(int i = 0; i < q; ++i)
	{
		cin >> b >> c;
		ans += (c - b) * a[b];
		a[c] += a[b];
		a[b] = 0;
		cout << ans << endl;
	}
```
厳密には違いますが、考え方のベースはしゃくとり法ですね。
それと[bin sort (bucket sort)](https://www.google.com/search?ei=cFvvXr5U1OL4BuTciuAO&q=bucketsort&oq=bucketsort)の考え方を組み合わせています。
`a[i]`には数列に含まれる`i`の個数が入っています。

余談ですが、bin sortは条件付きで`O(N)`のソートです。
通常のソートは最速で`O(N logN)`なので、とても速いです。

クエリ`q`では`b`が`c`に変わります。
つまり、`b`の個数が`0`になり、そのぶん`c`の個数が増えます。
`b`が`a[b]`個減って`c`が`a[b]`個増えます。
全体の合計値で考えると` - b * a[b] + c * a[b]`となります。
これをまとめて、以下の式がでてきます。`ans`は全体の合計値であり答えです。

```c++
ans += (c - b) * a[b];
a[c] += a[b];
a[b] = 0;
```

## E - Red Scarf

```c++
	int n, sum = 0;
	cin >> n;
	vector<int> a(n);
	for(int i = 0; i < n; ++i)
	{
		cin >> a[i];
		sum ^= a[i];
	}
	for(int i = 0; i < n; ++i)
	{
		cout << (sum ^ a[i]) << " ";
	}
```
xorの問題ですね。
求める答え以外のxorによる合計値が入力です。
つまり、求める答えは`全体の合計値 - 入力値`になります。

xorは足しても引いても同じ数になります（逆演算が自分自身です）。
つまり、足すことが引くことになります。
そのため、`全体の合計値 xor 入力値`が答えになります。

全体の合計値`sum`がわかれば答えが出せますね。
`sum`については、「入力値の合計」と「求める数列の合計」が一致します。
というのもxorの面白い性質によるものです。

同じ数値同士のxorによる演算結果は 0 になります（逆演算が自分自身です）。
つまり、`a xor a = 0` です。
少し拡大して、「同じ数値を偶数個」足した値は0になります。
これにより、「同じ数値を奇数個」足した値は「同じ値を1つ」足した値と等しくなります。
`a xor a = 0` なので、 `a xor a xor a xor a xor a = a xor a xor a  = a` です。

また、求める数列は要素数が偶数です。
そのため、試してみると分かりますが、「入力値の合計」には「求める数列の全要素」が奇数個含まれることになります。
「入力値の合計」には「求める数列の全要素」が奇数個含まれるので、「求める数列の全要素」を1つずつ足した値と等しくなります。
つまり、「入力値の合計」と「求める数列の合計」が一致します。

これらから`sum`がわかるので、答えをだせます。

以上です。ありがとうございました。
【JavaScript】条件式で0とnull/undefinedの判定を分ける

# JavaScriptでは`0`も`null`、`undefined`もすべて同じ判定になるけど分ける方法ないの？
タイトルの通り、こんな場合どうするか。`if (!value)`と書いてしまうと、0、null、undefinedの全部が`true`として判定されてしまう。
null、undefinedだけ`true`判定にしたいケースがあったので調べてみた。

[[JavaScript] null とか undefined とか 0 とか 空文字('') とか false とかの判定について](https://qiita.com/phi/items/723aa59851b0716a87e3)に大体書いてあるが、このトピックの部分だけまとめてみた。

## TL;DR

`if (value == null)`を使うのが一番スマートな書き方のようです。

## 1. `if (value === undefined || value === null)`
愚直に値をundefinedとnullと比較する方法。

誰が見ても分かりやすいが、どこか野暮ったい。

この書き方が最も明示的で誰にもわかりやすいと思うが、もっとシンプルに書きたい場合もあるだろう。

## 2. `if (!value && value !== 0)`
2番目の書き方よりは短くなったが、少し分かりづらくなった気がする。

## 3. `if (value == null)`
この書き方だと`value`の値が`0`の時は`false`判定になる。厳密等価演算子ではなく等価演算子「`==`」を使っているため、valueの値が`null`と`undefined`の時は同様に`true`として判定されるようだ。２、３番目の書き方よりも簡潔な条件式になった。

厳密には次のようなカラクリらしい。

[比較演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)
> 等価演算子は、2 つのオペランドが同じ型でないならばオペランドを変換して、それから厳密な比較を行います。両方のオペランドがオブジェクトならば、 JavaScript は内部参照を比較するので、オペランドがメモリ内の同じオブジェクトを参照するときに等しくなります。

ということで、`if (value == undefined)`でも同じ結果となるが、文字数的にはnullの方が簡潔になる。

否定の時は`if (value != null)`でOK。（valueがnullとundefined以外の時にtrue判定となる）

**ESLintで引っかからないか気になったが、大丈夫だった（設定によっては指摘されるかも？）**。

## 4. ~~`if (value ?? true)`~~

【2020/07/04追記】
コメントで[Null合体演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator)というのを教えてもらった。これを使うと、nullとundefinedの時は右の値を返して、それ以外のとき（0も空文字も）は左の値を返してくれるそう。

```javascript
// `leftVal`が`null`と`undefined`の時だけ`rightVal`を返す
if (leftVal ?? rightVal)
```

~~等価演算子を使わなくてもいいので、これが一番きれいに書けそう（だが知らない人も多そうという個人的印象）。~~
=>**【2022/11/07追記】`leftVal`がtruthyな値の場合は真と判定されて処理が進んでしまうため誤り。コメント参照**
※最近のES2020で策定された仕様なので、バージョンの古いブラウザやnode.jsでは使用できないことがある点に注意です。

## まとめ
- 基本的に`if (value == null)`~~かプラットフォームの実装が対応していれば`if (value ?? true)`を使う~~のが簡潔にかけてよさそう。
- 等価演算子「`==`」を使いたくなかったり、分かりやすさを求める場合は２、３番目の書き方が良さそう。
VScodeでもPowershellでコマンド履歴検索をしたい

# 三行で

1. :sparkles:VScodeでもPSReadlineが正常に動くようになりました
2. :rotating_light: だけど、コマンド履歴検索はVScodeの他のキーバインドと競合しているため正常に動作しません
3.　:wrench: なんとかするには`keybindings.json`に設定を書き込めば良いらしい

# 設定はこちら

この設定を作成、もしくは追加します。[stackoverflow](https://stackoverflow.com/questions/60857148/vs-code-terminal-history-search-windows-powershell)に感謝

```json:keybindings.json
// 既定値を上書きするには、このファイル内にキー バインドを挿入しますauto[]
[
    {
        "key": "ctrl+r",
        "command": "workbench.action.terminal.sendSequence",
        "when": "terminalFocus",
        "args": { "text": "\u0012" }
    }
]
```

これでコマンド履歴を検索出来ます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107934/a5d25daf-0382-3c1a-59dd-e4b40aea5563.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107934/8b69bd8e-8027-071c-758c-8c95ff05b952.png)
ちなみに、bashもこの設定で同じことが出来ました。

# 動作環境

```console
❯ $PSVersionTable
Name                           Value          
----                           -----
PSVersion                      7.1.0-preview.3
PSEdition                      Core
GitCommitId                    7.1.0-preview.3
OS                             Microsoft Windows 10.0.19041                                                     
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}       
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

❯ Get-Module psreadline
ModuleType Version    PreRelease Name                                ExportedCommands
---------- -------    ---------- ----                                ----------------
Script     2.1.0      beta2      PSReadLine  

Visual Studio Code 1.46.1
ms-vscode.powershell-preview
```
WebでMIDIを記録して保存できるものをつくりました

# 概要
WebでMIDI入力を受け取って記録し、SMF(Standard MIDI File)の書き出しまで行えるものをつくりました。

動作には以下の条件が必要です。
・Web MIDI API対応のブラウザであること([Can I use](https://caniuse.com/#feat=midi))
・MIDI入力ができるデバイス等があること

## デモ
https://cagpie.net/web-midi-recording/
UIの作りがだいぶアレですが、

- 1) `Web MIDI API start` を押すとMIDIデバイスへアクセスを開始し、
  - この状態から、繋いだMIDIデバイスから入力を送ると音が出ます(音が出る部分はソースコード的には `Sample` にあたります)
- 2) `recording start` で記録を開始し、 `recording stop` で終了してSMFの書き出しが走ります。
- 3) `play` で書き出したSMFの再生、また `download` からSMFのダウンロードができます。
  - playでの再生は、WebAudioAPIを用いてSMFを再生する [PicoAudio.js](https://github.com/cagpie/PicoAudio.js) を用いています。


## ソースコード
https://github.com/cagpie/web-midi-recording
記録部分のみを本体としており、音がなる部分は本体に入っていません。
上記のデモは `Sample` の内容になります。

# MIDIを記録して保存する とは
例えば、
MIDIデバイスとして使用するピアノの真ん中の方の「ミ」の鍵盤を押したとします。
すると、 `0x90 0x40 0x7F` というMIDIメッセージが送られます。
(このデバイスの接続と、MIDIメッセージの受け取りにWeb MIDI APIを用いています)

このイベント(MIDIメッセージ)を、押したタイミングと一緒に記録しておきます。

最終的に保存する際に、SMF形式にするのですが、
これは、上記のイベントの内容と、それがいつ実行されるか(正確には前回のイベントからの差分時間)の情報を交互に記述します(ざっくり)
それら情報と、ヘッダ情報などを含めれば完成です。

バイナリデータに起こし保存すれば、
DAWやMIDIシーケンスソフトで開いたりすることができます。

# おわり
おわりです。
Web×MIDI Web×音楽 がもっと見られますように


# 参考
MIDIメッセージ一覧
https://www.g200kg.com/jp/docs/tech/midi.html

SMF (Standard MIDI Files) の構造
https://sites.google.com/site/yyagisite/material/smfspec
組み込みエンジニアがC#を勉強するメモ

本記事は以下の実務経験のある人がC#参考書をもとに勉強するメモになります。

- C
- Python
- VBA
- Rails(短期)

# 参考書

[基礎からしっかり学ぶC#の教科書 改訂新版 (マイクロソフト関連書)](https://www.amazon.co.jp/gp/product/4822286533/ref=ppx_yo_dt_b_asin_image_o02_s00?ie=UTF8&psc=1)

# 環境

OS: MacOS Catalina(バージョン10.15.5)

**環境構築は下記の項目を順番に実行(インストールプロセス略)**
(詳しい記事：[Visual Studio Code ではじめての C# アプリケーションを作る](https://qiita.com/nskydiving/items/4127c96e9588016566fe))

1. [.NET Core SDK (バージョン：3.1.301)](https://dotnet.microsoft.com/download/dotnet-core/3.1)
2. [Visual Studio Code(バージョン：1.46.1)](https://code.visualstudio.com/download)

**VSCodeにインストールした拡張機能:**

- C# for Visual Studio Code (powered by OmniSharp)
- Japanese Language Pack for Visual Studio Code

<font color="Red">**※ハマりポイント**<font/>

上記インストール&セッティング完了後、ビルド&デバッグ問題なく行えるが、ソースコードに赤波線が付いてしまう。2日ぐらいハマったが、下記リンクの解決策で解消できた！
https://github.com/OmniSharp/omnisharp-vscode/issues/3289#issuecomment-534396993
> If you are on Linux or MacOS you may want to try install Mono 6.0.0 https://www.mono-project.com/download/stable/

<font color="Blue">**要は「mono」というパッケージ？をインストールしろと…**<font/>

*これで、スッキリしたので勉強を進められる〜*

> ## C#が実行できるWebサービス
> 
> .NET Fiddle
> https://dotnetfiddle.net/
>
> .NET Fiddle (モバイル向け)
> https://dotnetfiddle.net/Mobile
ibus-setup-kkcがエラーを吐いて困る

# まずはじめに伝えておきたいこと

完全に私が悪いです。
すべてが解決した今、ibus-kkcは安定していますし、何の不満もありません。
私と同じようなミスをしてしまった人のために記録に残そうと思います。

# 経緯

古くからATOKユーザの私はkkcのキーバインドのATOKにしたい。upstreamにはATOKキーバインドが既にmergeされており、Debianパッケージのバージョンには含まれていなかったため、upstreamから設定部分だけ持ってこようとしました。そして失敗しました。しつこいようですが完全に私が悪いです。

その際、表示されたエラーは下のとおり。

```sh
$ /usr/lib/ibus/ibus-setup-kkc 
**
ERROR:setup.c:2389:setup_dialog_populate_shortcut_treeview: assertion failed: (parent_metadata != null)
Bail out! ERROR:setup.c:2389:setup_dialog_populate_shortcut_treeview: assertion failed: (parent_metadata != null)
Aborted (core dumped)
```

多分、どこかにATOKリファンレスを参照する設定が残っていることが原因と思い、原因を追いました。

# ソースコードのエラー箇所を探す

https://github.com/ueno/ibus-kkc/blob/v1.5.22/src/setup.vala

```vala

469     void populate_shortcut_treeview (Kkc.InputMode input_mode) {
470         Variant? variant = preferences.get ("typing_rule");
471         assert (variant != null);
472
473         var parent_metadata = Kkc.RuleMetadata.find (variant.get_string ());
474         assert (parent_metadata != null);
475
```

474行目。parent_metadataがエラー表示されているのと、関数名が一致していることから怪しい。
ここでは、名前"typing_rule"で保存された設定情報に基づいて、kkcのルールを探そうとしています。kkcのルールが存在せずassertされていますので、typing_ruleがどこに保存されているか、今の値が何か、がはっきりすれば修正できそうです。

# アクセスするファイルを特定する

どこかのファイルから設定情報を読み込んでいるはず。githubにソースコードはあるもののリコンパイルするのもひと手間なので、とりあえずトレースしてみました。

```
$ strace -o strace.log /usr/lib/ibus/ibus-setup-kkc
```

存在しないファイルは除外。/usr,/etcなどシステム全体で扱うようなファイルはPermissionの都合で変更出来無いことから除外。/home以下に存在するファイルに絞っていきます。

```

$ grep /home/hiromotai/.config strace.log | grep -v NOENT 
openat(AT_FDCWD, "/home/hiromotai/.config/dconf/user", O_RDONLY) = 8
access("/home/hiromotai/.config/gtk-3.0/settings.ini", F_OK) = 0
openat(AT_FDCWD, "/home/hiromotai/.config/gtk-3.0/settings.ini", O_RDONLY) = 13
mkdir("/home/hiromotai/.config/ibus/bus", 0700) = -1 EEXIST (ファイルが存在します)
stat("/home/hiromotai/.config/ibus/bus", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
stat("/home/hiromotai/.config/ibus/bus", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
inotify_add_watch(13, "/home/hiromotai/.config/ibus/bus", IN_MODIFY|IN_ATTRIB|IN_CLOSE_WRITE|IN_MOVED_FROM|IN_MOVED_TO|IN_CREATE|IN_DELETE|IN_DELETE_SELF|IN_MOVE_SELF|IN_UNMOUNT|IN_ONLYDIR) = 1
openat(AT_FDCWD, "/home/hiromotai/.config/ibus/bus/838350fdf26046b0b7dc4b20674d3783-unix-wayland-0", O_RDONLY) = 14

```

ディレクトリエントリを除くと、"/home/hiromotai/.config/dconf/user" に絞られました。これが怪しいですね。

# dconf

wikipediaによると、dconfとはシステム設定の塊のようです。
> dconf is a low-level configuration system and settings management tool. Its main purpose is to provide a back end to GSettings on platforms that don't already have configuration storage systems. 

探してみるとatokエントリを発見しました。defaultに戻して修正完了です。

```
$ dconf dump /desktop/ibus/engine/kkc/
[/]
show-annotation=true
typing-rule='atok'
```

# 参考文献

- [wikipedia dconf(English)](https://en.wikipedia.org/wiki/Dconf)
- [ibus-kkc github.com](https://github.com/ueno/ibus-kkc) (以前は[bitbucket.org](https://bitbucket.org/libkkc/libkkc/)で開発していた様子)

以上，誰かの参考になれば幸いです。
React-redux

#なぜReduxを使うのか？
  1.stateの見通しをよくするため
  2.どこからでもstateを参照/変更可能にするため
  3.モジュールを疎結合にするため→これにより機能Aと機能Bが影響し合わない

storeで管理してあげることで伝達による意図しない副作用を阻止することができる

#Fluxフローってなに？
  1.データフロー設計の一つ
  2.データが常に１方向に流れる
  3.イベントが発生したらデータが変化(イベント駆動)

Flux思想をReactの状態管理に適用したライブラリ＝**Redux**
2020/06/21
Promiseとは・非同期処理時にPromiseを使うメリットとは

##Promiseとは
非同期処理のコードを扱いやすくするもの。
Promiseを用いると、非同期処理のコールバックの扱いがより簡単になる。

##Promiseを使った実装・使わない実装

・Promiseを使わずに実装

```javascript
//doWorkCallback関数の定義
const doWorkCallback = (callback) => {

//非同期処理。2秒後に[1,2,3]を返す
setTimeOut(() => {
callback(undefined, [1,2,3])
}, 2000)
}

//doWork関数の実行
//第一引数：エラー時の返り値、第二引数：処理成功時の返り値
doWorkCallback((error, result) => {

if(error){
return console.log(error)
}
console.log(result)
})

```
↓
２秒後に[1,2,3]が返る
または、2秒後にerrorが返る

・Promiseを使って実装

```javascript
//doWorkPromise関数の定義
const doWorkPromise = new Promise((resolve, reject) => {

//非同期処理。2秒後に[1,2,3]を返す
setTimeOut(() => {


//処理成功時の処理をresolve関数として実装
resolve([1,2,3])

//エラー時の処理をreject関数として実装
reject('Things went wrong')
}
},2000)

//doWorkPromise関数の実行
//成功時の処理を、「.then()」をつなげることによって記述
doWorkPromise.then((result) => {
console.log('success', result)

//エラー時の処理を、「.catch()」をつなげることによって記述
}).catch((error) => {

console.log('Error',error)
})
```
↓
2秒後に「success, [1,2,3]」が返る
または、2秒後に「Error Things went wrong」が返る

##Promiseを使用するメリット

Promiseを使って実装すると・・・

①成功時の処理はresolve関数、エラー時の処理はreject関数と、２つの別々の関数て処理している為、何が起こっているかわかりやすい。

Promiseを使わないと：　関数１つで成功時とエラー時の処理を行うことになる、
コールバックの全ての呼び出しを調べてから、引数errorと引数result、どちらが提供されたか判断することになる。

②処理結果によって呼び出される関数はresolve関数かreject関数かのどちらか一つ。
呼び出されるとPromiseは終了する為、後から実行結果の値や状態が上書きされることがない。

Promiseを使わないと：　コールバックが２回呼び出され、結果が変わるリスクがある。

##Promise処理中におこっている事

Promiseが作成される
↓
Pending:非同期処理実行中。Promiseの結果は保留
↓
①fulfilled:処理成功
②rejected:処理失敗

##Promiseをチェインさせる
複数の非同期メソッドをつなげて処理を行う時、Promiseをチェインさせて書くことができる。

・Promiseチェインを使わず実装

```javascript
//add関数の定義。Promiseを使った非同期処理とし、２秒後にa+bの結果を返す
const add = (a, b) => {
  return new Promise ((resolve, reject) => {
    setTimeout(() => {
      resolve(a + b)
    }, 2000)
  })
}

add(1, 2).then((sum) => {　　
  console.log(sum)

  add(sum, 5).then((sum2) => {　　//add関数で、「add(1,2)の結果」と「5」を処理する
    console.log(sum2)
  }).catch((e) => {
    console.log(e)
  })
  
}).catch((e) => {　　//add(1,2)のエラー処理
  console.log(e)
})
```
↓
２秒後に「3」、さらに２秒後に「8」が返る

・Promiseチェインを使って実装

```javascript
//add関数の定義。Promiseを返し、２秒後にa+bの結果を返す
const add = (a, b) => {
  return new Promise ((resolve, reject) => {
    setTimeout(() => {
      resolve(a + b)
    }, 2000)
  })
}

add(1,1).then((sum) => {
  console.log(sum)
  return add(sum, 4)　　//add関数で、「add(1,1)の結果」と「4」を処理する。2つ目の非同期処理を　returnで返すようにしている
}).then((sum2) => {　　//2つ目の非同期処理を「.then()」で返す

  console.log(sum2)
}).catch((e) => {　
  console.log(e)
})
```
↓
２秒後に「２」、さらに２秒後に「６」が返る

<h6>・Promiseチェインを使うメリット</h6>
①ネストを深くせずに、複数の非同期処理を繋げて行える
②エラー時の処理コードを重複して書かなくてすむ

##Promiseを更に理解するために今後学習したいこと

「JavaScript Promiseの本」
https://azu.github.io/promises-book/

##参考文献
「The complete Node.js Developer Course」
https://www.udemy.com/share/101WGiAEIedVpTTX4D/
実機テストで「The maximum number of apps for free development profiles has been reached.」のエラーが出て困った話。

カメラアプリの開発中、実機にてビルドを行うと「Unable to install "product name"」と出てきて、詳細を確認すると「The maximum number of apps for free development profiles has been reached.」のエラーが出て、実機にアプリのインストールができず困った話です。

実行環境
xcode：version 11.5
iOSバージョン：13.5.1
実機：iphone7　

お金を払って開発者アカウントにしない限り、xcodeで作成したアプリを実機に三つまでしかインストールできないとのことだったのですが、私は初めての実機テストだったためインストールしているアプリが０の状態で、エラーが発生していました。

上記のような状況で、私が解決できた方法について以下に記載いたします。

1.Window->Devices and Simulators->実機を選択してOpen Consoleボタンをクリックしてログを表示
2.アプリを実行して実機へのインストールを試みる。
3.右上の検索にMIFreeProfileValidatedAppTrackerを入力してログを絞り込む。

<img width="1259" alt="コンソールログのコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640161/d20a9d61-cf82-7056-bbf0-87630745fff2.png">

ログメッセージを確認すると、AppStoreから以前ダウンロードしたであろうアプリが表示されます。ここに表示されているアプリは、以下の写真のように実機ホーム画面の雲マークがついたアプリになるかと思います。

![iphoneホーム画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640161/438e332a-7839-0489-f7cb-8faf85ae084b.png)


雲マークがついたアプリをインストールもしくは削除することで、今回のエラーは解消されました。

「非使用のAppを取り除く」という設定をONにしていると、長期間使用されていないアプリが削除され、雲マークがつくようです。

xcodeのアプリが問題ではなく、AppStoreのアプリ原因だったのは盲点で、かつ実機のログまで確認しないとエラーの原因にたどり着かないので、教えていただいた方には本当に感謝しております。

似たような状況の方の解決につながれば幸いです。
YouTube APIでSuperChatを取得してUnity上でお札を降らせる

YouTubeのスーパーチャットに反応してUnity上でお札が降るようにしてみます。
1から書くわけではなく、出来合いのものを組み合わせて完成させます。

※随分前に実装したので、記憶が曖昧です。間違ってたらすみません。

#使用ツール
[UnityでYoutube Liveのコメント・スパチャを取得できるツール](https://booth.pm/ja/items/1902935)

#完成形
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">スパチャでお札舞うスクリプト、今日の配信で試しに動かしたら無事に動いた。アタッチしてるオブジェクト変えたから非表示しても大丈夫。<br><br>ちなみにQiita初見プレイ配信、記事最後までかけませんでした･･････酔って喋って終わりました･･････<a href="https://twitter.com/hashtag/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%A2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#バーチャルモーションキャプチャー</a> <a href="https://twitter.com/hashtag/EVMC4U?src=hash&amp;ref_src=twsrc%5Etfw">#EVMC4U</a> <a href="https://t.co/zwRxHdb95L">pic.twitter.com/zwRxHdb95L</a></p>&mdash; 大福らな🧷4/24 21:00 エヴァ同時視聴 (@daifuk_lana) <a href="https://twitter.com/daifuk_lana/status/1252997129557012480?ref_src=twsrc%5Etfw">April 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

#方法
今回使用するツールの使い方にも書いてありますが、YoutubeCommentのBeginGetComments()関数を呼ぶことでコメント取得を開始でき、OnCommentで新しいコメントがコールバックされ、OnSuperChatでスーパーチャット投稿時にコールバックが呼ばれます。その通りに実装しますが、今回はパーティクルを呼び出して紙幣を降らせることにします。

上記使用ツールをUnityにインポートしましたら、パーティクルを実装していきます。
私はこちらを参考にパーティクルを実装しました。

[【Unity】パーティクルで紙ふぶきを散らす](http://tsubakit1.hateblo.jp/entry/2015/09/04/233000)

実装後、使用ツールを説明に従って使用可能な状態にしておきます。

その後、スーパーチャットに反応してパーティクルを起動させるよう実装していくわけですが、インポートした使用ツールのExampleフォルダにcsファイルがありますので、こちらを改変していくのが簡単ですので、その前提で進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582055/76299883-bb96-3903-03e6-ae71cc6df0ca.png)

まずクラスの開始時に```ParticleSystem particle;```などと宣言しておき、先程実装したパーティクルのGameObjectを代入しておきます。
```particle = GameObject.Find("hogehoge").GetComponent<ParticleSystem>();```という感じでしょうか。"hogehoge"は各自のGameObject名に書き換えて下さい。updateの中ではFindしないみたいな話はここでは割愛します。

その後、Start内で```particle.Stop();```として予め対象のパーティクルを止めておきます。うまいこと設定で止められるならそれでも良いです。

そして、OnSuperChatメソッド内で```particle.Play();```（particleの部分は宣言した変数名）と書けば、スーパーチャットが飛ぶたびにパーティクルが実行されます。

YouTubeのAPIはすぐ使い切ってしまうため、そのあたりは調べるなり計算するなりで、自分が最大限使う時間を考慮して取得間隔を設定してください。
上記ツールのYouTube CommentスクリプトのGet Comment Intervalで設定して下さい（秒）。
ちなみに、24時間連続稼働の想定だと60秒に一回の取得です。

【参考】
[YouTube Data APIの使用量上限について](https://sites.google.com/site/suzuniwa/home/youtube-quota-limit)

よろしくおねがいします（酔っているのでこのへんで）
プログラミング TypeScript：第 2 章 TypeScript 全体像

## はじめに
TypeScript の学習のために「プログラミング TypeScript ―スケールする JavaScript アプリケーション開発」を購入しましたので、自身の学習のためにも本プログで数回に渡って、重要な部分に絞って紹介していければと思います。

[プログラミングTypeScript](https://www.oreilly.co.jp/books/9784873119045/)

学習用にサンプルプログラミングも Github で紹介されていますので、合わせて紹介していきます。
[『プログラミングTypeScript』のリポジトリ](https://github.com/oreilly-japan/programming-typescript-ja)

本記事についての内容は以下を参照してください。
[プログラミング TypeScript：第 2 章 TypeScript 全体像](https://freedom-tech.hatenablog.com/entry/2020/06/21/212557)
【AWS】用語を整理しながら学ぶAWS - part2


# はじめに

この記事では
AWSのあんなことやこんなことについて
まとめた記事です。
ベストプラクティスや間違いがあれば
書き直していく予定です。
今回はAmazonEC2とそれを扱う上で重要な用語について整理してみました。

参考図書：[さわって学ぶクラウドインフラAmazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/dp/B084QQ7TCF/ref=cm_sw_r_tw_dp_U_x_-vD5EbQCMD1A9)


--------------------------------
# Amazon EC2とは

Amazon ECS（Amazon Elastic Container Service）で動作する
インスタンスのこと

[AmazonEC2開発者ガイドより](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html)

単にEC2インスタンス呼ぶことが多い。

--------------------------------
# 仮想サーバを作成するとき
Amazon EC2を使えばAWS上に
Amazon Linux 2の仮想サーバを作成できる。

何がすごいってブラウザから
AWSマネジメントコンソールを開いて
ポチポチすれば数秒で仮想サーバを構築できるというところ

--------------------------------
# Amazon Linux 2とは

Red Hat Enterprise Linux 7(RHEL7)をベースとした
Amazon Web Services用のLinux OSのこと

使われているDBは「MariaDB」

--------------------------------
# 実際にOSを使うときは
Amazon Linux 2 Amazon Machine Imageを
EC2インスタンス作成時に選択する。

（以下、Amazon Linux 2 AMI）

--------------------------------
# 課金
EC2インスタンスの課金タイミングは
インスタンスを「running」にしているとき

※ただし、Amazon EBS(Amazon Elastic Block Store)は容量を確保しているとき

--------------------------------
# 注意事項
Amazon Linux 2 AMIをベースにして
EC2インスタンスで作成すると
Amazon EBSが消費される。（課金される）

--------------------------------
# Amazon EBS

AWS上で確保できるハードディスクのこと
Amazon EBS(Amazon Elastic Block Store)と呼ぶ。

--------------------------------
# まとめ
・AWS上でサーバを建てるときはEC2インスタンスを用いる。
・インスタンスを「running」にすると課金が始まる。
・EC2インスタンスを作成するとAmazon EBSが消費される。
・EBSは容量を確保すると課金が始まる。


--------------------------------
# おわり
TypeScript をはじめてみた！

## はじめに
[ArcGIS API for JavaScript](https://developers.arcgis.com/javascript/) を使用した簡単な Web マッピングアプリの開発に TypeScript を使用してみました。  
ArcGIS API for JavaScript は、Google Map API と同じような Web マッピングアプリを開発するための API です。ArcGIS API for JavaScript は、Google Map とは異なり 空間検索などの GIS の機能やデータのビジュアライゼーションも豊富に対応しています。  

今回は、ArcGIS API for JavaScript で TypeScript を使用するための準備として、開発環境の構築や簡単なサンプルアプリを作成までの手順を紹介したいと思います。また、TypeScript を使用するメリットについても紹介します。

本記事についての内容は以下を参照してください。
[TypeScript をはじめてみた！](https://freedom-tech.hatenablog.com/entry/2020/06/14/014805)
製薬企業研究者がPythonにおける正規表現についてまとめてみた

# はじめに

ここでは、Pythonにおける正規表現の基本について解説します。

# 主な正規表現

```python
import re

m1 = re.match(r'ab*', 'a') # 直前の文字（b）の0回以上の繰り返し
if m1:
    print(m1.group(0))
else:
    print('Not match')

m2 = re.match(r'ab+', 'a') # 直前の文字（b）の1回以上の繰り返し
if m2:
    print(m2.group(0))
else:
    print('Not match')

m3 = re.match(r'ab?', 'abb') # 直前の文字（b）の0回または1回の繰り返し
if m3:
    print(m3.group(0))
else:
    print('Not match')

m4 = re.match(r'ab$', 'abb') # 文字列の末尾と合致するか
if m4:
    print(m4.group(0))
else:
    print('Not match')

m5 = re.match(r'[a-e]', 'f') # []内のいずれかの文字（a, b, c, d, e）とマッチするか
if m5:
    print(m5.group(0))
else:
    print('Not match')
```


# 正規表現の関数

```python
import re

# 先頭からマッチするか
match = re.match(r'\d+-*\d+$', '012-3456')
print(match.group(0)) # '012-3456'

# 途中でマッチするか
search = re.search(r'\d{3}', '012-3456')
print(search.group(0)) # '012'

# マッチするパターンを全て列挙
print(re.findall(r'\d{3}', '012-3456')) # ['012', '345']

# 指定したパターンの区切り文字で分割
print(re.split(r'[,、]', '1,2、さん')) # ['1', '2', 'さん']

# 指定したパターンの文字を別のパターンに変換
print(re.sub(r'(\d),(\d)', r'\2,\1', '1,2、さん')) # 2,1、さん
```


# まとめ

ここでは、Pythonにおける正規表現の基本について解説しました。
特定の文字列パターンと合致させたい場合は正規表現を利用すると便利です。

# 参考資料・リンク

[プログラミング言語Pythonとは？AIや機械学習に使える？](https://pharma-engineer.com/basic-programming/python-summary/)