OmniAICreator/Qiita-1.07M huggingface dataset:
ociでインスタンスを作成

## 事前準備

```sh:ociコマンドを取得
pip install oci-cli
```

```sh:初期設定
oci setup config
```

* API キーをアップロード `~/.oci/oci_api_key_public.pem`
* コンパートメントを確認
    * https://cloud.oracle.com/identity/compartments?region=ap-tokyo-1

```
oci setup oci-cli-rc
```

* 最終行に以下追記

```sh:~\.oci\oci_cli_rc
[DEFAULT]
 compartment-id = <コンパートメントのOCID>
```


## availability-domain 一覧

* 参考: [コマンドライン(CLI)でOCIを操作する - Oracle Cloud Infrastruc... | Oracle Community](https://community.oracle.com/docs/DOC-1019624)

```sh
oci iam availability-domain list --query 'data[*].name'
```

* 日本では`fJNO:AP-TOKYO-1-AD-1`になると思う。

## image list の確認

```sh
oci compute image list

oci compute image list | grep -A3 aarch
```


## 作成コマンド

* 参考: [Getting started with the OCI Command Line Interface (CLI) | Oracle Cloud](https://oracle.github.io/learning-library/oci-library/DevOps/OCI_CLI/OCI_CLI_HOL.html)
* [コマンド・ライン・インタフェースの開始](https://docs.oracle.com/cd/E97706_01/Content/GSG/Tasks/gettingstartedwiththeCLI.htm)
* `--boot-volume-size-in-gbs`を未指定の場合、50GBが割り当てられると思う

```sh
~/.local/bin/oci \
 compute instance launch \
 --availability-domain "fJNO:AP-TOKYO-1-AD-1" \
 --display-name "インスタンス名を指定" \
 --image-id "ocid1.image.oc1.ap-tokyo-1.(略)" \
 --subnet-id "ocid1.subnet.oc1.ap-tokyo-1.(略)" \
 --shape VM.Standard.E2.1.Micro \
 --assign-public-ip true \
 --metadata '{"ssh_authorized_keys": "ssh-rsa AAAA(略)"}'
```

```sh:実際のコマンド
oci compute instance launch \
 --config-file ~/.oci/config \
 --availability-domain "fJNO:AP-TOKYO-1-AD-1" \
 --display-name "instance1" \
 --compartment-id "ocid1.tenancy.oc1..(略)" \
 --image-id "ocid1.image.oc1.ap-tokyo-1.(略)" \
 --subnet-id "ocid1.subnet.oc1.ap-tokyo-1.(略)" \
 --assign-public-ip true \
 --ssh-authorized-keys-file ~/.ssh/id_rsa.pub \
 --shape "VM.Standard.A1.Flex" \
 --shape-config '{"memoryInGBs":12.0, "ocpus":"2.0"}'
```


## block volume の作成 (使うことないかも)

* 47GBの作成例

```sh
oci bv volume create \
 --availability-domain "fJNO:AP-TOKYO-1-AD-1" \
 --size-in-gbs 47 \
 --display-name 47gb
```
マルウェアデータサイエンス本で使うため、Python3.7環境でNetworkxをインストール

# Python3.7環境でNetworkxをインストール
マルウェアデータサイエンス本で使ったが出版当時と色々違ったりインストール方法の説明が雑だったため残しておく。
環境はLinux Mint、Python3.7はインストール済、pipenvを使って環境構築した。

まず、インストールするためにはlibgraphviz-devとPython3.7-devが必要になる。
また、pygraphvizが必要になるので一緒にインストールする必要がある。

```sh
sudo apt install libgraphviz-dev python3.7-dev
pipenv install networkx pygraphviz
```
python3.7-devについては使っているPythonのバージョンに合わせる必要があると思う。
以上でとりあえずコードは動いた。

# 追記
Networkxの使い方が若干変わっていたのでそれについても記載する。
nodeとedgeの属性を追加する方法が変わっていた。

```python
network = networkx.Graph()

# nodeの追加と属性を設定
network.add_node(1)
network.add_node(2)
network.nodes[1]['attribute'] = 'value'

# edgeの追加と属性の設定
network.add_edge(1, 2)
network[1][2]['attribute'] = 'value'
```

以上のやり方で問題ないはず。
Amazon ECR のVPC エンドポイントを AWS Transit Gateway で共有する方法

AWS Transit Gateway の検証をしていて、アウトバウンド用 VPC に設置した Amazon ECR の VPC エンドポイントを他の VPC から参照する必要がありました。

Amazon ECR の VPC エンドポイントはインターフェイス型であるため、 [Integrating AWS Transit Gateway with AWS PrivateLink and Amazon Route 53 Resolver \| Networking & Content Delivery](https://aws.amazon.com/jp/blogs/networking-and-content-delivery/integrating-aws-transit-gateway-with-aws-privatelink-and-amazon-route-53-resolver/) を参考にすれば簡単にできると考えていましたが、一筋縄ではいきませんでした…。

Amazon ECR の VPC エンドポイントには ecr.api と ecr.dkr の2種類がありますが、前者は参考にした手順で設定することができましたが、 `ecr.dkr` は追加の手順が必要でした。そのため、ここに手順を残しておきます。

# 手順

## 1. ecr.dkr の VPC エンドポイントの作成

ecr.dkr の VPC エンドポイントを作成します。作成するときはプライベート DNS 名を無効にする必要があります。既存のエンドポイントもプライベート DNS を無効化することができます。

## 2. プライベートホストゾーンの作成

ドメイン名を `dkr.ecr.ap-northeast-1.amazonaws.com` でプライベートホストゾーンを作成します。

AWS CLI で作成する場合は、下記のような感じになります。

```bash
$ aws route53 create-hosted-zone \
  --name dkr.ecr.ap-northeast-1.amazonaws.com \
  --vpc VPCRegion=ap-northeast-1,VPCId=vpc-xxxx \
  --caller-reference 20200417102500 \
  --hosted-zone-config Comment='ECR DKR VPC Endpoint',PrivateZone=true \
```

## 3. レコードセットの作成

作成したプライベートホストゾーンに下記のレコードセットを作成します。

1. 名前が `dkr.ecr.ap-northeast-1.amazonaws.com`のレコードセット
    - エイリアスレコードとして VPC エンドポイントを設定
2. 名前が `*.dkr.ecr.ap-northeast-1.amazonaws.com`のレコードセット
    - CNAME として `dkr.ecr.ap-northeast-1.amazonaws.com` を設定

1 のレコードセットのみを作成した場合に、 Amazon ECR から Docker イメージがプルができなくなります。Amazon ECR の URI は 1234567892012.dkr.ecr.ap-northeast-1.amazonaws.com のようになるため、この URI でも名前解決できるようにする必要があるため、 2 のレコードセットを作成する必要があります。

AWS CLI で作成する場合は、下記のような感じになります。

```bash
aws route53 change-resource-record-sets \
  --hosted-zone-id /hostedzone/xxxx \
  --change-batch '{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "dkr.ecr.ap-northeast-1.amazonaws.com",
        "Type": "A",
        "AliasTarget":{
          "HostedZoneId": "Z2E726K9Y6RL4W",
          "DNSName": "vpce-xxxx.dkr.ecr.ap-northeast-1.vpce.amazonaws.com",
          "EvaluateTargetHealth": false
        }
      }
    },
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "*.dkr.ecr.ap-northeast-1.amazonaws.com.",
        "Type": "CNAME",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "dkr.ecr.ap-northeast-1.amazonaws.com"
          }
        ]
      }
    }
  ]
}' \
```
Windows10でVPN接続するまで

## 前提

VPNの種類 = 事前共有キーを使った L2TP/IPsec

## まずは接続してみる

- Windowsキーを押下して「VPN」と入力し、VPNの設定画面を開く。
- 接続名(任意の名前)、サーバー名またはアドレス、サインイン情報 等を入力。
- 「VPNの種類」は「事前共有キーを使った L2TP/IPsec」
    - ここで接続できれば以降の設定は不要。
    - こんな感じで接続できませんエラーが出る場合は以下の作業を行う。
        - 「エラー 809: リモートサーバーが応答しないため、使用するコンピューターとVPNサーバー間のネットワーク接続を確立できませんでした。」


## 接続できない場合

### Windowsレジストリ情報を変更

- Windowsキーを押下し「レジストリ エディター」を入力して開く。
- `HKEY_LOCAL_MACHINE` / `SYSTEM` / `CurrentControlSet` / `Services` / 
 `PolicyAgent` を開く。
- 右側のレジストリ情報が並んでいるところで右クリック
- 「新規」>「DWORD(32ビット)値」をクリック
- 追加された値の名前を「AssumeUDPEncapsulationContextOnSendRule」に変更
- 「値を右クリック」>「修正」をクリック
- 値を「2」にする
- 設定完了後、`データ` 列表示されている値が「0x00000002 (2)」となっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/113c4655-b72c-5f09-32d1-bb66a93e4ca0.png)

- Windowsを再起動

- 再起動後に再度VPN接続を試みるとエラーメッセージが変わるはず。
    - 「PPPリンク制御プロトコルを終了しました」
- 変わらない場合は「このアプリがデバイスに変更を加えることを許可しますか？」が出ていないか確認。出ている場合は「はい」を選択。

### VPNの設定を変更

- `設定` > `ネットワークとインターネット` > `状態/ネットワーク設定の変更/アダプターのオプションを変更する` 
- 該当のVPNを右クリックし `プロパティ` を選択。
- セキュリティのタブを開き、以下のように変更する。
    - データの暗号化 = 暗号化が必要
    - 認証 = 次のプロトコルを許可する
        - 「チャレンジハンドシェイク認証プロトコル」にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/ba183349-dce2-4f99-6272-d702ef9c9c3f.png)


これで何度か接続を試みたら出来るようになりました

## 参考

[Windows8でL2TPプロトコルのVPN接続を成功させる](https://colo-ri.jp/develop/2015/09/windows8-l2tp-vpn.html)
[外出先から自宅にVPN接続 -Windows10](https://securityup.net/%E5%A4%96%E5%87%BA%E5%85%88%E3%81%8B%E3%82%89%E8%87%AA%E5%AE%85%E3%81%ABvpn%E6%8E%A5%E7%B6%9A-windows10/)
【Go】英単語を 複数形 ⇔ 単数形 に相互変換

今日は 英単語を **複数形 ⇔ 単数形 に相互変換** してくれるGo言語ライブラリをご紹介します。

* go-pluralize<br />https://github.com/gertd/go-pluralize<br/>MITライセンス

```go
"factory" -> "factories"
```

こんな風に変換してくれます。
私は ORM(gorm) の モデル(構造体)名 から DBテーブル名 を逆算するのに使ったりしています。

コマンド実行機能も付いてるので、[Go本体をインストール](https://golang.org/dl/)してさえいればバッチ処理等にも活用できますね。
（コマンド方式の説明はこちらを。https://github.com/gertd/go-pluralize#pluralize-command-line ）


# Go言語での用例

```go
package main

import (
	"fmt"
	"github.com/gertd/go-pluralize"
)

func main() {
	plu := pluralize.NewClient()

	//複数形に
	print(plu.Plural("apple"))   // -> apples
	print(plu.Plural("factory")) // -> factories
	print(plu.Plural("fish"))    // -> fish

	//単数形に
	print(plu.Singular("apples"))    // -> apple
	print(plu.Singular("factories")) // -> factory
	print(plu.Singular("fish"))      // -> fish

	//複数形か判定
	print(plu.IsPlural("apple"))   // -> false
	print(plu.IsPlural("apples"))    // -> true

	//単数形か判定
	print(plu.IsSingular("apple"))   // -> true
	print(plu.IsSingular("apples"))    // -> false

	//複数形に
	// ・モノの個数を指定して単数か複数かを判定させて出力
	// ・個数を出力に含めるか指定できる
	print(plu.Pluralize("apple", 1, true)) // -> 1 apple
	print(plu.Pluralize("apple", 3, true)) // -> 3 apples
	print(plu.Pluralize("apple", 3, false)) // -> apples

	//例外単語を登録（ちなみに大文字小文字の違いは影響しない）
	plu.AddUncountableRule("final fantasy")
	print(plu.Plural("FINAL FANTASY"))   // -> FINAL FANTASY
	print(plu.Plural("FANTASY"))   // -> FANTASIES
}

func print(s interface{}) {
	fmt.Println(s)
}
```
CRUD処理短くする

こんな感じで少し短くなる


```
class PostsController < ApplicationController
  before_action :set_post, only: [ :show, :edit, :update, :destroy]

  def index
    @posts = Post.order(created_at: :desc)
  end
    
  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    if @post.save
      redirect_to @post, notice: '投稿を保存しました'
    else
      render :new
    end
  end

  def show
  end

  def edit
  end

  def update
    if @post.update(post_params)
      redirect_to @post, notice: "投稿を更新しました。"
    else
      render :edit
    end
  end

  def destroy
    @post.destroy
    redirect_to posts_path, notice: "投稿を削除しました。"
  end
  private

  def post_params
    params.require(:post).permit(:caption, :image)
  end

  def set_post
    @post = Post.find(params[:id])
  end

end
```

最初にここで処理

```
before_action :set_post, only: [ :show, :edit, :update, :destroy]
```

次にここに行く

```
def set_post
  @post = Post.find(params[:id])
end
```

以上
【Mac】ショートカットキー チートシート【Finder・Chrome・Jupyter・VSCode】

# はじめに
今回は元WindowsユーザーがMacを購入してから数ヶ月間使ってみて、最低限押さえておくべきだと思ったショートカットキーをまとめたいと思います。随時アップデート予定です。

以下、
`⌘` = command
`⌥` = option
`⇧` = shift
`⌃` = control

# Mac自体のショートカット

|キー|効果|
|:-:|:--:|
|⌘ + M|ウィンドウをDockに格納|
|⌘ + Tab|アプリ切り替え|
|⌘ + ⇧ + 3|スクリーンショット（全画面）|
|⌘ + ⇧ + 4|スクリーンショット（範囲指定）|
|⌘ + ⇧ + F|フルスクリーン オン/オフ|

# Finder

|キー|効果|
|:-:|:--:|
|⌘ + ↑/↓|進む/戻る|
|Enter|名前の変更|
|⌘ + ⇧ + .|隠しファイルの表示|

# Chrome

|キー|効果|
|:-:|:--:|
|⌘ + T|新しいタブを開き移動|
|⌘ + N|新しいウィンドウを開き移動|
|⌘ + L|アドレスバーに移動|
|⌃ + Tab|次のタブに移動|
|⌃ + Tab + ⇧|前のタブに移動|
|⌘ + W|現在のタブを閉じる|
|⌘ + リンク先をクリック|リンク先を新しいタブで開く|


# Jupyter Notebook
matplotlibを使うとき

```python:
%matplotlib inline
```

|キー|効果|
|:--:|:----:|
|⇧ + Enter|セルを実行|
|esc|編集モード→コマンドモード|

以下、コマンドモードにて

|キー|効果|
|:-:|:--:|
|M|セルをマークダウンモードに|
|Y|セルをコードモードに|
|A|上にセル追加|
|B|下にセル追加|
|C|セルのコピー|
|Z|セルの切り取り|
|V|セルの貼り付け|
|DD|セルを削除|
|F|検索・置換|
|Z|セルを元に戻す|
|J|行番号の表示/非表示|
|Z|セルを元に戻す|

# Visual Studio Code
Mac版VSCodeのショートカットです。*印がついているショートカットは自分で設定しました。VSCodeでは、`⌘`+`⇧`+`P`でコマンドパレットを開いてから、`key`と入力して先頭に出てきたものを選択するとキーボードショートカットの編集ができます。○はおすすめショートカットです。

## 全般

|キー|効果|
|:-:|:--:|
|⌘ + ⇧ + P|コマンドパレットを開く|
|⌘ + ,|設定を開く|
|⌘ + J|ターミナルの表示の有無|
|⌘ + B|サイドバーの表示の有無|
|⌘ + =|文字を縮小|
|⌘ + ⇧ + =|文字を拡大|

## コーディング

|キー|効果|
|:-:|:--:|
|⌘ + A|全選択|
|⌘ + C|一行コピー|
|⌘ + X|一行切り取り|
|⌘ + V|貼り付け|
|⌘ + Z|戻る|
|⌘ + ⇧ + Z|進む|
|⌘ + Y|進む *|
|⌘ + [|インデントを下げる|
|⌘ + ]|インデントを上げる|
|⇧⌥F|○全体のフォーマットを整える (インデント整形含)|
|⌘ + /|選択範囲をコメント/アンコメント|
|⌥ + ↑/↓|○一行まるごと上下に移動|
|⌥ + ⇧ + ↑/↓|一行まるごと上下にコピー|
|⌃ + D|一文字削除(WindowsのDeleteキー)|
|⌘ + ⇧ + K|一行削除|
|⌘ + F|検索|
|⌘ + H|置換 *|
|⌘ + Enter|○下に空行追加|
|⌘ + ⇧ + Enter|上に空行追加|

## 移動系

|キー|効果|
|:-:|:--:|
|⌥ + ←/→|単語ごとの移動|
|⌘ + ←/→|先頭/最後尾に移動|
|⌃ + G|指定行に移動|
|⇧ + fn + ↑/↓|画面の移動（カーソルは動かさず）|
|⌘ + fn + ↑/↓|画面の移動（1ページごと）|

## ファイル操作

|キー|効果|
|:-:|:--:|
|⌘ + N|新しいファイル|
|⌘ + ⇧ + N|新しいウィンドウ|
|⌘ + S|保存|
|⌘ + ⇧ + S|名前を付けて保存|
|⌘ ( +⇧) + Tab|タブ移動（連続して押すと選択が変わる）

# おまけ
自分は画面の分割用にShiftItというソフトを使っています。Windowsと同じ感覚で画面を二分割・四分割でき、非常に便利です。ショートカットは自分で設定できるのですが、参考までに一応自分の設定を書いておきます。

|キー|効果|
|:-:|:--:|
|⌘ + ⇧ + ←/→|画面の左右二分割|
|⌘ + ⌥ + 1/2/3/4|画面の上下左右四分割|
|⌘ + ⇧ + Enter|画面の分割解除（最大化）|
|⌘ + ⇧ + BackSpace|フルスクリーン化/解除|
ahrefs APIを使ってみたforPHP

1.ahrefsのAPIの登録手順
2.phpで実装する
3.ahrefs注意点

今回は上記を目的として記事を制作します。

##ahrefsとは
ahrefsはseo解析ツールです。
ドメインパワーや、被リンク数などの解析によく使われています。

ahrefsはツールを上で使うプランと、コード上で使うプランがあります。
https://ahrefs.com/api
上記にアクセスすると下記のような画面が出てきます（google翻訳しています）
<img width="1440" alt="スクリーンショット 2020-01-19 15.50.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515452/2c9cbf49-014a-7191-238b-14e22b238d5f.png">

__無料AIP機能__というのがツール上で使うプランです。
__有料APIサブスクリプション__というのがコード上で使えるプランです。
__有料APIサブスクリプション__だけ使いたくても、両方に申し込みが必要になります。

今回は有料APIサブスクリプションについて説明します。
##ahrefsのAPIの登録手順
上記画面で__有料APIサブスクリプション__をクリック。

<img width="1438" alt="スクリーンショット 2020-01-19 16.09.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515452/a63fd7ea-ba68-75ec-573e-b89e134b97d4.png">

上記のようなプライシング画面が出てくるので、必要な解析数によって最適なプランに申し込んでください。

申込みが完了し、https://ahrefs.com/api/profile　
アクセスすると下記のような画面が出ます。

<img width="1436" alt="スクリーンショット 2020-01-19 16.16.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515452/bb22b4a8-5649-e798-7b72-0f988ea9c841.png">


APIで使用するtokenが発行されています。
これを使用して、コードからAPIにアクセスし情報を取得します。
他にも上記画面では、今月どのぐらいAPIを使用したか確認できるのでおぼえておいてください。

これでAPIにアクセスする準備は整いました。次はコードからどのようにアクセスしていくか解析していきます。

##ahrefsAPIをPHPで使用する。

```composer require ahrefs/ahrefs-api-php``` 
もしくは、
```git clone https://github.com/ahrefs/ahrefs-api-php```

で必要ファイルを持ってきてください。色々ファイルがありますが__AhrefsAPI.php__と
__ArrayRules.php__だけで使用できます。

Laravelを使用しているのでfunction以下を参考にしてください。
ドメインパワーを取得してきたいと思います。

```php
<?php

namespace App\Http\Controllers;
use AhrefsAPI;

function ahrefs(){
    $Ahrefs = new AhrefsAPI('上記画面のtoken', $debug = false);
    $Ahrefs->set_target(取得したいサイトのURL)->mode_exact();
    $ahrefs = $Ahrefs->set_limit(取得件数)->get_domain_rating();
}
?>
```
これだけで取得できます。
コードを軽く解析していきます。

__set_target__
対象のURLを入れます。配列では渡せないのでページ毎にデータがほしい場合は、1URL毎に取得するしかありません。
__mode_exact__
完全一致のURLで取得するかどうかを指定してます。他にもサブドメインやドメインで指定する方法もあります。
__set_limit__
取得件数を指定します。数値を渡せばいいので最適な数値を渡しましょう。
__get_domain_rating__
ここで何を取得するか指定します。今回はドメインパワーでしたが、被リンク、流入ワードなど多数取得できますので、最適な物を指定しましょう

https://ahrefs.com/api/documentation　
↑にAPIのドキュメントがありますので参考にしてください。

https://ahrefs.com/api/api-request-builder
また、コードを書かなくてもformで選択するとどのようなデータが取得できるか確かめられる機能がありますのでこれも参考にしてください。


##ahrefs注意点
APIで取得した数値をそのまま公開すると違反になるため、数値をつかって自社のノウハウ（数値の重みづけ）など数値を加工して公開するようにしましょう。

##最後に
基本的にはドメインパワーと被リンク数の２つが重要かなと個人的には思います。
ドメインパワーはahrefs独自のアルゴリズムで計算されているため、ちょっとずれている部分はありますが他のseoツールよりは最適だと思います。
被リンク数も他のseoツールよりは正確で参考にしていいと思います。

流入キーワードやタイトルはやっぱりanalyticsやsearch consoleのほうが正確です。seoツールはいっぱいありますが何が最適か考えて色々組み合わせて使用しましょう。
Ruby on Rails チュートリアル 8日目

##8日目
今日は、チュートリアルの5章の途中まで進めました。
[5.1.2 BootstrapとカスタムCSS](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1#sec-custom_css)の途中でrails serverで確認しようとしたところ、しばらく開けなくなっていて大変でした。何か間違ったのかと何回も書き直しても開けなくなっていたのですが、ターミナルを新しく作り直してみたらすんなり行けてしまいました。何が駄目でうまく行けなかったのかがわからないまま出来るようになってしまった
AVRマイコンでいろいろやる②-3　シリアル通信3

ATmega328Pを使用してWindowsから受け取った値をインクリメントしてWindowsへ返すことを行いました。
これによりマイコンでのデータ受信、送信の両方の確認を行います。

Windows側のプログラムは以下の通りです。
しばらくいじって無くてVisualStudioだけはアップデートしてたら
なぜかSystem.IO.Portsが認識してくれませんでした。
NuGetパッケージ管理で探したら見つかったので
これをインストールしたら無事認識してくれました。

```Program.cs
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OnBoardTester
{
    class Program
    {
        static void Main(string[] args)
        {
            //受信Only
            SerialPort serialPort = new SerialPort("COM3", 500000, Parity.None, 8, StopBits.One);
            serialPort.Open();

            byte[] counter = { 0 };
            byte rcv;

            while (true)
            {
                serialPort.Write(counter, 0, 1);
                rcv = (byte)serialPort.ReadByte();

                System.Console.WriteLine(rcv.ToString("x2") + "\n");

                counter[0] = rcv;
            }
        }
    }
}
```


期待する動作は1通信ごとに値が1増えた値がかえってきて
さらにそれをまたマイコンに入力してと、
1往復ごとに1ずつ増えていくことを想定しています。


マイコン側は以下の通りです。

```main.c
#include <avr/io.h>
#include <avr/interrupt.h>

void InitC(){
	DDRC = 0b00111111;
}
int main(void)
{

	/* Replace with your application code */

	//int mode =0;
	InitC();
	PORTC = 1;  //PORTCはデバッグ用
	UCSR0A = UCSR0A |0b00000010; //倍速設定
	UCSR0B = 0b10011000;
	UCSR0C = 0b00000110;
	UBRR0 = 4;
	PORTC = 2;

	sei();//割込み有効

	while(1)
	{

	}
}
ISR(USART_RX_vect){
	unsigned char data;
	data =UDR0;
	PORTC =data;
	while ( !(UCSR0A & (1<<5)) );
	UDR0 = data + 1;
}
```

受信したら割込みが働き、
即PC側にインクリメントした値を送ります。

実行結果は以下のような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416780/cdf44889-aea4-c336-e20d-04eaa4862c10.png)

次は・・・・何する予定化も忘れましたが、
AD変換でもしますかね。
TextAnimation　Expression selector　エクスプレッション　コピペ用

![thumbnail.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178061/e8ef3e60-0789-d48c-0e00-4bf64f0f9c82.jpeg)


#詳しくは動画をご覧ください
動画は2020/04/24公開
https://www.youtube.com/watch?v=82MyU_21a3o

#コピペ用エクスプレッション
###In用
```jsx
amp = 100; //バウンスの強さ
freq = 2; //バウンスの周波数
decay = 5;//バウンスの減衰
delay = .02;//文字毎の遅延設定
charaDelay = delay*(textIndex-1)//文字毎の遅延の値
t = (time - inPoint)-charaDelay; //文字毎の遅延の時間

if (t > 0){
	amp*Math.cos(freq*t*2*Math.PI)/Math.exp(decay*t);
}else{
	100
}

```

###Out用
```jsx
NumChara = thisLayer.text.sourceText.length;
amp = 100; //バウンスの強さ
freq = 2; //バウンスの周波数
decay = 5;//バウンスの減衰
delay = .05;//文字毎の遅延設定
charaDelay = -delay*(textIndex-1)//文字毎の遅延の値
outTrigger = marker.key(1).time;
outTrigger = outTrigger+(NumChara*delay)-inPoint;
t = outTrigger-(time - inPoint)-charaDelay; //文字毎の遅延の時間

if (t > 0){
	amp*Math.cos(freq*t*2*Math.PI)/Math.exp(decay*t);
}else{
	100
}

```

###outをレイヤーのデュレーションで制御したい時は
こっちの方が使い勝手いいかも。

```jsx
NumChar = thisLayer.text.sourceText.length;
dealy = .05;
amp = 100;
freq = 2;
decay = 5;
charDelay = -dealy*(textIndex);
outTrigger = outPoint-(NumChar*dealy)-inPoint;
t = outTrigger-(time - inPoint)-charDelay;

if ( t >= 0){
	result = amp*Math.cos(freq*t*2*Math.PI)/Math.exp(decay*t)
}else{
	100
}

```
EC2インスタンスにSSHしたときに黄色いネズミを色付きで表示する

EC2インスタンス(Amazon Linux 2)にSSHでログインしたときに表示されるAWSのアスキーアートの代わりに黄色いネズミを表示させるようにします。

こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/61e9a4cf-7d69-a309-8b51-e048b468458f.png)


# ネズミのアスキーアートを用意する。
適当にアスキーアートを探してきます。
そして、`/home/ec2-user/banner.txt`としてファイルに保存しましょう。

banner.txtの例

```
     .--,       .--,
    ( (  \.---./  ) )
     '.__/o   o\__.'
        {=  ^  =}
         >  -  <
        /       \
       //       \\
      //|   .   |\\
      "'\       /'"_.-~^`'-.
         \  _  /--'         `
   jgs ___)( )(___

```

今回はhttps://ascii.co.uk/art/mouse からお借りしました。もちろんアスキーアートなら何でも大丈夫なので、お好きな黄色いネズミや青いタヌキを用意してください。

# AWSの表示を書き換える
`/etc/update-motd.d/30-banne`を書き換えます。
`sudo vi /etc/update-motd.d/30-banne`でファイルを開き以下のように書き換えます。

```
#!/bin/sh
#cat << EOF
#
#       __|  __|_  )
#       _|  (     /   Amazon Linux 2 AMI
#      ___|\___|___|
#
#https://aws.amazon.com/amazon-linux-2/
#EOF
echo -e "\033[1;33m$(</home/ec2-user/banner.txt)\033[00m"
```

`$(</home/ec2-user/banner.txt)`が先ほどのアスキーアートファイルで`echo "$(<ファイルパス)"`とすることでファイルの中身を出力します。また、`\033[1;33m`が色を指定しているところで黄色を指定しています。`\033[00m`が色の変更の終了を意味します。

別の色を指定したい場合は以下を参考にしてください。

| 色         | コード |
| ----------- | ------------ |
| RED         | '\033[0;31m' |
| GREEN       | '\033[0;32m' |
| ORANGE      | '\033[0;33m' |
| BLUE        | '\033[0;34m' |
| PURPLE      | '\033[0;35m' |
| CYAN        | '\033[0;36m' |
| LIGHTGRAY   | '\033[0;37m' |
| DARKGRAY    | '\033[1;30m' |
| LIGHTRED    | '\033[1;31m' |
| LIGHTGREEN  | '\033[1;32m' |
| YELLOW      | '\033[1;33m' |
| LIGHTBLUE   | '\033[1;34m' |
| LIGHTPURPLE | '\033[1;35m' |
| LIGHTCYAN   | '\033[1;36m' |
| WHITE       | '\033[1;37m' |

最後に

```
sudo update-motd
```

を実行すると反映されます。これでSSHをつなぎなおすと

![黄色いネズミ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/fe76fdc7-af3d-f396-7fea-9b1cb71eb3ac.png)


# おまけ プロンプトの色を変える
`~/.bash_profile`に以下を追記します。
これでユーザーのプロンプトの色を変えることができます。

```
COLOR_BEGIN="\[\e[1;36m\]"
COLOR_END="\[\e[m\]"
export PS1="${COLOR_BEGIN}${PS1}${COLOR_END}"
```

色の指定は`PS1_COLOR_BEGIN`で行っています。
これを保存してログインしなおすとこうなります。(***は実際はipなので一応隠してます。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/61e9a4cf-7d69-a309-8b51-e048b468458f.png)

# まとめ

AWS EC2インスタンスにSSHしたときに表示されるAWSのアスキーアートを変更し、色を付ける方法を(ついでにプロンプトの色変更も)紹介しました。似たような方法で他のOSでも実行可能だと思います。ただのネタのような内容ですが、本番・ステージングや他人の開発環境等へのログイン間違えを防ぐのに役立つので試してみてください。
Vundleのインストール

#VimにVundleをインストール
Windows10向けにインストール
以下の記事を参考にさせていただきました。

[Windows10にGitをインストールして初期設定する](https://qiita.com/taketakekaho/items/75161e1273dca98cb4e1)
[Windows+Vim+Vundle環境構築](https://qiita.com/morishima0524/items/96376659ec6b4d56ae70)

#gitのインストール
https://git-scm.com/
↑からダウンロードしてインストール

##Github用フォルダを準備してアカウント登録
とりあえずホームの下に作成する
C:\Users\XXXX\Documents\GitHub

```実行例
C:\Users\XXXX\Documents\GitHub> git config --global user.name GitHubName
C:\Users\XXXX\Documents\GitHub> git config --global user.email xxxx@xxx.xxx.xx.xx
```

##暗号鍵
```実行例
C:\Users\XXXX\Documents\GitHub>ssh-keygen -t rsa -b 4096 -C "xxxx@xxx.xxx.xx.xx"
```
##設定ファイルの置き場所をGitHub側に作る
GitHubにある例そのもの

```実行例
echo "# dotfiles" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/GitHubName/dotfiles.git
git push -u origin master
```

#Githubからdotfilesをクローンする
上で作成したREADME.mdはdotfilesフォルダの中にないとサーバー側とつじつまあわない？dotfilesフォルダを作成してから作業しないといけなかったかもと思ってローカルPC内の.gitを削除した

```実行例
C:\Users\XXXX\Documents\GitHub>git clone https://github.com/GitHubName/dotfiles
```

#Vundleのインストール
##Vimのプラグイン置き場を作る

```
C:\Users\XXXX\Documents\GitHub\dotfiles>mkdir vimfiles
C:\Users\XXXX\Documents\GitHub\dotfiles>cd vimfiles
C:\Users\XXXX\Documents\GitHub\dotfiles\vimfiles>mkdir bundle
C:\Users\XXXX\Documents\GitHub\dotfiles\vimfiles>cd bundle
```
##Vundleをクローンする
```
C:\Users\XXXX\Documents\GitHub\dotfiles\vimfiles\bundle>git clone https://github.com/VundleVim/Vundle.vim.git
```
##設定ファイル

設定ファイルをvimfilesの下にコピーする
HOMEの下に.vim _vimrc _gvimrc をリンクするため管理者権限つけてコマンドプロンプト立ち上げる

```
C:\Users\XXXX>mklink /D .vim C:\Users\XXXX\Documents\GitHub\dotfiles\vimfiles
.vim <<===>> C:\Users\XXXX\Documents\GitHub\dotfiles\vimfiles のシンボリック リンクが作成されました
C:\Users\XXXX>mklink _vimrc C:\Users\XXXX\Documents\GitHub\dotfiles\vimfiles\_vimrc
_vimrc <<===>> C:\Users\XXXX\Documents\GitHub\dotfiles\vimfiles\_vimrc のシンボリック リンクが作成されました
C:\Users\XXXX>mklink _gvimrc C:\Users\XXXX\Documents\GitHub\dotfiles\vimfiles\_gvimrc
_gvimrc <<===>> C:\Users\XXXX\Documents\GitHub\dotfiles\vimfiles\_gvimrc のシンボリック リンクが作成されました
```

##インストール準備
README.mdを参考にして_vimrcに設定を追記

##インストール実行
vim上で以下実行
:PluginInstall
APIGatewayでWebSocketを利用した場合のOpen時の認証処理

# はじめに
AWSのAPI GatewayがWebSocket対応しています。
この接続を認証したもののみでOpenするのにどうするか？の話です。
wscatなどでコマンドで叩かれると接続だけはできちゃったりするので、そのあたりをどう防止できるかというものです。
今回は別のシステムなりで認証後に発行されたIDがDynamoDBにあり、ブラウザ側へ送信されてるのを前提とします。
$connect時にそのIDがついてる時だけconnectionIdをDynamoDBに格納したい時にどのように出来るかの話となります。

# $connect時のみGetパラメータが取れる
もう結論出てるんですが、API Gatewayで設定したものはブラウザ上でnew WebSocket()などでOpenした時に、URLについたGetパラメータがいつも通りにLambda側で取得できます。

ブラウザ側

``` 
const socket = new WebSocket("wss://xxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod?id=xyz");
```

Lambda側

``` 
const id = event.queryStringParameters.id;
console.log(id); // xyzと出力する
```

このパラメータを利用して別の認証なりでDynamoDBに保存されたIDを参照して、そのまま切断するかなどを処理できます。

例えばここにRoomIDみたいなものをつけて、その部屋があいてる時だけ繋ぐなどの方法も使えます。
ただし、このパラメータは他の$disconnectなどの他の状態の時にはついてきませんので、どこのRoomに繋いでるかなどの前提の識別には利用できません。
そのため、$connect時以外では、よくあるサンプル通りにconnectionIdをキーとしてDynamoDBから状態の情報を取得する必要があります。
【Java】LocalDate, DateTimeformatterで取得した曜日を日本語で表示する方法

##開発環境

・ホストOS: Windows10 Home insider build preview
・ゲストOS: WSL2 Ubuntu18.04 LTS
・VScode ver1.44.2
・Java openjdk11

##問題

```java

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;


public class Time {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.of(2020, 6, 3).plusMonths(1).plusDays(24);
 
        DateTimeFormatter formmater = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)");
        
        String format = localDate.format(formmater);
        
        System.out.println(format);
    }
}
```

上記のコードをコンパイルして実行した結果

```
2020年07月27日(Mon)
```

と曜日の部分が英語で出力される。(Mon)ではなく(月)と表示したい。

##解決法

①java.util.Localeをインポートする
②ofPatternメソッドの第二引数にLocale.JAPANESEを渡して日本語表記を指定する

実際のコードで確認する

```java

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
//変更部分
import java.util.Locale;


public class Time {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.of(2020, 6, 3).plusMonths(1).plusDays(24);
        //変更部分                                                         
        DateTimeFormatter formmater = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)", Locale.JAPANESE);

        String format = localDate.format(formmater);

        System.out.println(format);
    }
}
```

出力結果は…

```
2020年07月27日(月)
```

無事曜日を日本語表記に変更することができた。


##参考資料

[Locale (Java Platform SE 7)](https://docs.oracle.com/javase/jp/7/api/java/util/Locale.html)
[DateTimeFormatter (Java Platform SE 8)](https://docs.oracle.com/javase/jp/8/docs/api/java/time/format/DateTimeFormatter.html)
[LocalDate (Java Platform SE 8)](https://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDate.html)
Markdown記法チートシート、README.md書き方

参考　Markdown記法 チートシート（Qiita公式）
https://qiita.com/Qiita/items/c686397e4a0f4f11683d

参考　README.md
https://qiita.com/aocattleya/items/5f836e9c65ba3eb3af03

# ライセンスの取得方法
上の記事にも記載してある
[![Image from Gyazo](https://i.gyazo.com/46bafef0d5e68eaaddd2ff95d90be890.png)](https://gyazo.com/46bafef0d5e68eaaddd2ff95d90be890)
jupyterlabのターミナルが動かない時の解決法。safariからchromeへ変更(mac)

# jupyterlabのterminalが効かない。safariからchromeへ変更(mac)
notebookだけでなく普通の.pyを実行しようとした時、terminalに文字が打ち込めない問題があり困りました。問題を解消するまでのメモをここに残します。
バージョンは、
- `macOS High Sierra 10.13.6`
- `Python 3.7.6`
- `jupyter lab --version 2.0.1`
## 問題
jupyterlab内のterminalで
`(base) xxxxxxxx:~ xxxx$ `から何も打ち込めない。
## やったこと
ググったらsafariが悪い可能性があるというのがわかったので、`jupyter lab`と叩いて開くブラウザを`safari`から`chrome`に変更した。

## 解決策
1. `jupyter_notebook_config.py`があるなら、これをいじる。ないならば、`jupyter notebook --generate-config`と打つ。`jupyter_notebook_config.py`を作ってくれる。どこにあるかは、上のコマンドのあとに表示される。
2. 1で`jupyter_notebook_config.py`のある場所がわかったので、そこへいく。自分はfinderを使って移動したが、コマンドで普通に移動しても良い。また、finderでは隠しファイルは表示されない。そんな時はfinderを開いた状態で`command+shift+.`を押すと表示される。  
<img width="202" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378494/e12d300a-bb70-9815-cded-8ef73aa79428.png">
3. ファイルをエディタで開いて、`c.NotebookApp.browser=''`と書いてあるところへ移動する。
4. `c.NotebookApp.browser=''`の直前の`#`を消す。そして、`c.NotebookApp.browser = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome %s'`として、保存。ここの`\`は空白文字のためのエスケープ。

**解決しました。以上です。**

## 参考文献
- http://www.yasunaga-lab.bio.kyutech.ac.jp/EosJ/index.php/JupyterLab
- https://medium.com/@tyagi.sudarshini/change-default-browser-in-jupyter-notebook-mac-667b56a3274e
- https://gist.github.com/davidcochran/a9e286646dec2bb65ac8b524a331c86d
docker exitedの原因究明


いつも通りdockerを立ち上げて、サーバーにアクセスするも繋がらず。
`docker ps -a`　でdockerの状態を調べると、 STATUSが`exited`に...
restartしても変わらず、でもコンテナは削除したくない!
なので、調査方法に関して色々調べてみました。

## 手順
まず試すこと

```
$ docker logs コンテナ名
```

log出力先を変更してない限り、今までのエラーに関するログが出ているはず。
それでもわからない or コンテナ内部で作業する必要がある場合は以下を試す。

1.エラー状態にあるコンテナをイメージ化する
2.作ったimageををrunしてコンテナ内でbashを起動して内部調査
## コンテナをイメージ化
コンテナをイメージ化するには`commit`コマンドを使用します。
http://docs.docker.jp/engine/reference/commandline/commit.html

```bash
$ docker commit コンテナID 任意のイメージ名
```

## 作ったimageををrunしてコンテナ内でbashを起動
```bash
$ docker run --rm 任意のイメージ名 bash
```
`--rm`オプションは、コンテナ実行後に削除してくるものです。
立ち上げたコンテナだらけになってしまうのを未然に防ぎます。


## 余談(attachとexecの違いについて)





今までdockerコンテナ内のbashを操作する際は

```bash
$ docker exec -it コンテナ名 bash 
```

としていたが、

```bash
$ docker attach コンテナ名
```

という方法もあるようだ。何が違うの？
と思ったが、
https://qiita.com/RyoMa_0923/items/9b5d2c4a97205692a560
こちらが参考になった。



・**attach**
PID=1の標準入力とエラー出力、標準出力をattachする。

・**exec**
コンテナ内で新たなプロセス（上記の例だとbash)を立ち上げる。 `-it`オプションで
それに標準入出力をつなぐ。

つまりexecではbashを起動してそれを操作しているのに対し、
attachはコンテナ直といった感じでしょうか。
なのでattachで`exit`してしまうとコンテナ自体が停止してしまうので注意ということですね。

## 要この先学習/調査ポイント

- 擬似ttyがよくわからなかった
- attachではエラー出力も繋がれてるけどexecではどうだろう？

## 参考にさせていただいたページまとめ
https://docs.docker.com/ (公式)
https://qiita.com/RyoMa_0923/items/9b5d2c4a97205692a560
https://qiita.com/galigalikun/items/a2436e07cf78713cf4b6
https://blog.namiking.net/post/2015/09/docker-exec-exited/
FFmpegを使って動画の手振れ補正をするバッチファイル

手振れ補正がスマホに入っていなくても、FFmpegの手振れ補正機能（vid.stab）を使えば手振れ補正をすることができます。
少し変な部分が出てきますが、撮影したそのままの動画より遥かにましになります。

vid.stabはかなり時間がかかるので、バッチファイルを使って寝ている間に処理させましょう。

vid.stabに対応したffmpegは https://ffmpeg.zeranoe.com/builds/ からダウンロードできます。  
解凍したら、binフォルダにパスを通すか、次のコードの`ffmpeg`を置き換えて、ffmpeg.exeが実行できるようにしてください。

以下のコードを「stab.bat」として保存し、手振れ補正したい動画を複数選択してstab.batに向けてドラッグアンドドロップしましょう。
そうするだけで処理が始まります。

```bash:stab.bat
@echo off
setlocal enabledelayedexpansion
cd /d "%~dp0"
cd ..
:loop
if "%~1" == "" goto end
ffmpeg -i "%~1" -vf vidstabdetect -an -f null -
ffmpeg -i "%~1" -vf vidstabtransform -y "%~dpn1-stab.mp4"
:finish
echo .
shift
goto loop
:end
```

`ffmpeg …`の部分をほかのコマンドに置き換えることで、寝ている間にいろいろな処理を行うことができます。

複数ファイルを処理するバッチファイルのひな型を忘れがちなのでメモ的に投稿しました。
winmail.datを開く

# macでwinmail.datを開く
## 概要
outlookユーザーから`winmail.dat`が添付されてきた。
brew でtnefをインストールしてこれを開く。
ファイル名がWindowsな感じの場合にも対応する。

## 前提条件
- mac
- brewがインストールされている
- 添付ファイルはwinmail.datという名前で保存してある。

## 作業
```shell 
brew install tnef
```
インストールが終わったらwinmail.datがあるディレクトリで、

```shell
tnef --unix-paths --interactive --file winmail.dat

```
あとは画面の指示に従う。(通常はyを押していけば良い)

だめなら

```shell
tnef --unix-paths --file winmail.dat --save-body
extract message.rtf?
```

で y をおす。
Registration-free Distortion Correction of Diffusion Weighted MRI ～Synb0-DisCoの実装～

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/0ecbc408-6c61-f926-f04e-f32fb5354c7d.png)
# 目的

1. 2種類のPhase Encodingを撮像していないDiffusion dataであってもFSLのTOPUPのように歪み補正(distortion correction)
2. 1.を実現するために[Synb0-DisCo](https://github.com/MASILab/Synb0-DISCO)を実装

参考文献は[こちら](https://www.biorxiv.org/content/10.1101/2020.01.19.911784v1)。
詳しい解説とコードは、[Registration-free Distortion Correction of Diffusion Weighted MRI ～Synb0-DisCoの実装～](https://www.aiprogrammers.net/entry/2020/04/20/141634)をご覧ください。
【AWS・EC2】メッセージ「コマンドが見つかりません」の対処法


###エラー内容

``` 
[shogo@ip-10-0-0-58 Portfolio]$ bundle exec rake secret
bash: bundle: コマンドが見つかりません
```  

```ruby -v```をしてもコマンドが見つかりません、とのこと。


###解決法

以下を上から順に試す。

``` 
[shogo@ip-10-0-0-58 Portfolio]$ cd 
[shogo@ip-10-0-0-58 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
(#rbenvのインストール) 
[shogo@ip-10-0-0-58 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
(#パスを通す)
[shogo@ip-10-0-0-58 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
[shogo@ip-10-0-0-58 ~]$ source .bash_profile  
(#.bash_profileの読み込み)
[shogo@ip-10-0-0-58 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
(#ruby-buildのインストール)
[shogo@ip-10-0-0-58 ~]$ rbenv rehash  
(#rehashを行う) 
``` 


一度EC2からログアウトするとパスが通らなくなるのが原因かもしれません。

後、ユーザーも関係している可能性があります。
（私の場合、ec2-userで上記コマンドを実行してもうまくパスが通りませんでした。）

間違っていたらコメントください。
勉強中のため詳しい方がいましたら教えていただければと思います。


参考
https://qiita.com/naoki_mochizuki/items/814e0979217b1a25aa3e
LaTeX環境について

LaTeX環境というと、ちょっと前までは当たり前のように自分のパソコンに初めにインストールするものの一つでした。最近MacOSXをクリーンインストールした時にまた入れるの面倒だなぁと思い、そろそろ基本的にはクラウドに移行しても良いのかと思ったので、メモを残しておきます。
基本的にMacのことしか書きません。

## LeTeX環境に関する雑感
LaTeXは一度環境を作ってしまうとそのまま数年は触らないことが多いのですが、気付いたら色々なことが新しくなっていて時代遅れになっていることがあります。例えば、私がLaTeXを使い始めた当初（20年くらい前）は、図はepsで作ること、出力はpostscriptというのが常識でしたが、最近はpsやepsを使うことはないです。基本的にはpdfやjpgを使い出力もpdfというのが常識だと思いますが、いまだに「図はeps」のような指定してくることがあって絶句することは、まれによくあります。
余談で、かつかなり業界が限られてますが、私が普段使っているグラフ作成ソフトのCERNのROOTではTikZのサポートもしてました。
https://root.cern.ch/content/saving-canvas-tex
これを使う人がどれくらいいるのか知りません。私自身は結局pdfを使っていますが、特にグラフの軸や凡例などで数式を使いたい時や、グラフと本文の文字のフォントを揃えたい、というこだわりがある人には良い選択肢なのだと思います。

図だけでなく、日本語の扱いとかコンパイラ（TeXエンジン）も多種多様で、とても全部を追いきれないというのが実情です。pdfLaTeX、upTeX、XeTeX、LuaTeXあたりが最近はよく目にするものですが、それぞれ得意不得意や歴史的な経緯があるみたいで、素人にはどれを使って良いのか分かりません。自分で一から文章を書くときは基本的に最新のものを使えば良いと思っているのですが、論文は投稿予定の論文誌のテンプレートを使うことになるので、そのテンプレがどのコンパイラに対応しているかに依存してしまいます。英語の論文ならばpdfTeXかLuaTeXを使えば大抵の場合は問題ないのですが、日本語の場合はその場その場で対処するしかないです。あまりにわからないので、私は可能な限り日本語の文章はLeTeXでは書かないようにしています。

## 英語で論文を書くならばOverLeafを使うのが良いと思う
https://www.overleaf.com/

一番有名なので、こだわりがなければこれを使うのが無難です。ただし、外国のサービスなので日本語対応は微妙なところがあります。
英語で論文を書く場合は、これを使うと共著者と同時編集もできるのでとても便利です。いちいちPDFにコメントをもらってそれを一つ一つ対応して、という手間がなくなります。無料アカウントでもgitに対応しているので、ローカルの環境で書いて、それをアップロードする、という使い方もできます。
ちゃんと検証したわけではないですが、図が表示されないことがあります。コンパイラをXeTeXにすることで正しく図が表示されるようになりました。

日本語の対応は色々な方法があります。公式のヘルプに少しだけ書かれています。
https://www.overleaf.com/learn/latex/Japanese
公式では書かれていませんが、一番簡単なのはコンパイラをXeTeXにする方法です。`\documentclass`にも少しだけ変更が必要で、下記のように書けば使えるようになります。

```latex
\documentclass[xelatex,ja=standard,jafont=noto]{bxjsarticle}
```

ただし、エディタが日本語に対応していないため、日本語で長い文章を書くには少しストレスがあるかもしれません。海外のサービスなので、おそらく今後も日本語の細かい対応は期待できないと思っています。

無料でも十分な機能を持っていますが、学生ならば有料サービスを年80ドルで使えるみたいです。Studnet Planと書いてあってアカデミックライセンスではなさそうなので、大学のスタッフでも割引はないのかな。そのうち必要になったら確認してみるかも。

## 日本語環境ならばCould LaTeXの方が使いやすい
https://cloudlatex.io/ja

日本語限定ならばこちらの方が良いかもです。OverLeafとの違いは、
- 共有機能がない
- 日本語には初めから対応している
- 無料
くらいです。ひとりで書く日本語の文章で必要になったときはこちらを利用しています。学生向けの解説書とか日本語のマニュアルですね。

## でも結局ローカルにもLaTeX環境が必要になってしまう理由

もうLaTeXのインストールとか環境設定とかも必要なくなってクラウドの時代なんだなぁ、思っていたのですが、いくつかの理由があって結局ローカルにもMacTeXをインストールすることになってしまっています。

一つ目の理由は日本語環境です。複数人で編集が必要な日本語のレポートがあったので、Overleafで書きはじめたのですが、短い文章ならば良いのですが、長い文章になると色々とエディタがイマイチなのでストレスがたまります。Overleafはgitが使えるので、gitで拾ってきて、編集して、アップロードしてコンパイル、という流れの作業をしていたのですが、細かな調整を確認しながらする作業はいちいちgitの作業が入るのがストレスになってしまい、結局自分のローカルにも環境を作ることになりました。

もう一つは、LaTeXiTです。プレゼンで利用しているのですが、これが使えないことに気づきました。色々とオンラインでできる代替サービスはないかと探してみたのですが、やっぱりプレゼンに差込で数式を入れるのはLaTeXiTが優秀でした。

## 結局適材適所で、いろいろなソフトが必要になってしまう

ホントはに文章を書くソフトは一つに統一できた方が色々と楽なのでしょうけど、なかなかそうもいかないのが現状ですね。世の中の人だと、文章作成=Wordという人がほとんどだと思うので、それで統一できると色々と楽なんだろうなぁ、とは思います。自分の現状を書いてみます。

ワープロソフトは、AppleのPagesを使っています。こだわりというよりは、慣れと惰性で使っています。Wordの使い方に慣れていない、WordはMacでもemacsのキーバインドが使えない、あたりも理由です。

最近Google Docsを使えないかと模索中なのですが、まだ慣れないので急ぎで必要になった文章はPagesで作ってしまいます。時間がある時にはGoogle Docsで使って、使い方に慣れようと頑張っているところです。やっぱりローカルに環境を用意しないで良くOSを選ばないので可能な限りクラウドに移行したいとは思っているのです。

コンパイルが必要なLaTeXは出来ることならば使いたくないのですが、数式が多い文章だったり、テンプレが決まっている文章など、必要なときはなるべくOverleafを使うようにしています。日本語で絶対に共有する可能性がない、というときのみCouldLatexを使っています。
Zoom でセミナーに参加する前に、自分の音声と顔をオフにする

## はじめに
新型コロナの影響もあり、オンラインで開催されるイベントや会議が多くなってきましたね。セミナーに Zoom で参加する機会も増えたのではないでしょうか。
ところで、セミナーに参加するとき、自分の音声（マイク）がオンのままになっていて、自分と同僚の会話がほかのセミナー参加者につつぬけになって、あわててマイクをオフにした経験はありませんか？

この記事では、音声（マイク）と顔（映像）をオフにしておく方法を紹介します。自分も発言する会議などに参加する場合は、必要に応じてその都度自分の音声（マイク）をオンにすることができます。

## ダウンロードしてから設定画面の表示まで
zoom.us から Zoom クライアントをダウンロードしてインストールします。zoom.us の Web サイト右上の「リソース」メニューからダウンロードページを選択できます。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/06e9bc14-d9bc-cfb4-8dab-213c84c33289.png)

インストールが完了すると画面上に Zoom のサインオン画面が出ます。下のタスクバーのアイコンを右クリックしてください。もしタスクバーになければ、「Ｖ」が上向きになったような記号をクリックして隠れているアイコンを出して右クリックしてください。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/384521ad-312b-8983-a244-e76fbd7762ed.png)

メニューから「設定」を選びます。
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/0b820beb-54b9-f96d-9de1-1a373a13f12b.png)

設定画面が表示されました。メニューのうち、「ビデオ」と「オーディオ」を使用します。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/7a81afaa-ef03-51b0-c788-d77bb4cfc260.png)

## 自分の音声（マイク）をオフにしておく
設定画面で「オーディオ」を選択し、画面の下のほうにある「ミーティングの参加時にマイクをミュートに設定」にチェックを付けます。これで自分の音声（マイク）はデフォルトでオフになります。
なお、矢印で示した２つめのチェックボックスにチェックを付けただけだと、セミナー講師の音声も聞こえません。
その上の「ミーティングへの参加時に、自動的にコンピューターでオーディオに参加」にもチェックを付けましょう。自分の音声（マイク）はオフにしたまま、セミナー講師の音声（マイク）が聞こえるようになります。
![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/f0e0a3f3-1eee-f70a-3ee6-450a842b80e7.png)

## 自分の顔（映像）をオフにする

### デフォルト値としてオフにしておく
設定画面で「ビデオ」を選択し、画面の下のほうにある「ミーティングに参加する際、ビデオをオフにする」にチェックを付けます。これで自分の顔やオフィス内（室内）の映像は、デフォルトでオフになります。
![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/2b584b89-dafb-583b-d33f-25afa6ea8edc.png)

### 今回のセミナーだけ自分の顔をオフにする
Zoom を起動した後、「ミーティングに参加」ボタン[^1]を選択しますが、
![temp_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/8e703386-1e12-bc39-8a28-dce8a0ee6e59.png)

その次の画面で「自分のビデオをオフにする」にチェックがついていることを確認します。自分の顔やオフィス内（室内）の映像をほかの参加者にも見せたければ、チェックを外します。
![temp_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27855/beb85d7c-7507-8ee0-e89c-afeca75f5d01.png)

[^1]: 「サインイン」ボタンは、セミナーや会議を主催する人が使います。他の人が主催したセミナーや会議に参加する人は、「ミーティングに参加」を使用してください。

この記事がお役に立てば幸いです。
nginx + django でcssが出ない

django単体だと大丈夫なのにnginxと連携させるとdjangoの管理者画面がcssなしになる。
管理者画面のcssは普段見えないがdjango単体で動かすときは実行時に生成される模様？
nginxと連携するときnginx管理下にcssを配置してあげることで解消する。

以下のコマンドを実行すると、settings.pyで指定しているstaticフォルダに管理者画面のcssなどがコピーされる。

```console
python manage.py collectstatic
```

綺麗に掃除してコピーする場合はこれ。

```console
python manage.py collectstatic --clear
```
一つの画像ファイルから複数のサイズの画像を作成するAppleScript

　Xcodeで iOS アプリを作成する時に必要なアイコン用の複数のサイズの画像を作成するAppleScript を作成したので、コードとポイントを記す。
`MacOSX 10.15での実行を確認しています。`

###　やりたいこと
　iOSアプリケーションを開発する際、iPhone, iPad, さらに Mac Catalyst それぞれのアプリケーションを作成するには複数のサイズのアイコン（App, Notification, Settings, Spotlight）を作成する必要がある。一つひとつの作業は簡単だが、サイズの種類が多く、全てを作成するには手間がかかる。そこで、AppleScript により一つのファイルから複数のサイズのアイコンを一気に作成したい。

### 画像のサイズを変更する方法
　AppleScript で画像のサイズを変更するには、AppleScript専用の補助アプリケーションとしてMac OS に標準で装備されているImage Events というツールを利用する。

Image Eventsについては以下を参照。
https://qiita.com/ynomura/items/76bde7935af4b82ab8b1

　なお、MacOS 10.15 Catalina では、Image Events が標準では利用できなくなっているので、システム環境設定のセキュリティ設定からフルディスクアクセスに登録する必要がある。
　詳しくは「AppleScriptの穴」を参照。
http://piyocast.com/as/archives/8301

### AppleScriptコード
　作成したいアイコンのサイズは、targetImageSize として定義しておく。以下の例では {58, 76, 87, 120, 152, 167, 180} という7種類のサイズを作成する。
　元となる画像ファイルを大きなサイズで作成しておき、ファイル選択ダイアログ`choose file`で選択し originalFile に設定るす。さらに、フォルダ選択ダイアログ`choose folder`で、サイズを変更したファイルを保存するフォルダを指定する。
　repeat では、アイコンサイズ・リストの要素の数だけファイルをコピーし、ファイル名にアイコンサイズを追加し、画像サイズを変更する処理を繰り返している。

　ややつまずいた点が、Image Events の open コマンドへの引数が furl だという点。そのため、画像ファイルを`imageFile`に設定する際には`POSIX path of`でパスを指定している。


※以下のスクリプトをスクリプトエディタに貼り付ければ実行できます。

```applescript
set targetImageSize to {58, 76, 87, 120, 152, 167, 180} --作成するアイコンサイズ
set originalFile to choose file with prompt "元ファイルを選択してください" --大きなサイズの元ファイルを指定
set targetFolder to choose folder with prompt "コピー先フォルダを指定してください" --コピー先フォルダは空にしておいて下さい。エラー処理などはしていません。

tell application "Finder"
	
	set extentionName to name extension of originalFile as string --拡張子
	set l to the length of (name of file originalFile as string) --作成するアイコンの数（アイコンサイズのリストの要素をカウント）
	set fileName to characters 1 thru (l - (the length of extentionName) - 1) of (name of file originalFile as string) --ファイル名（拡張子なし）
	
	repeat with i in targetImageSize
		duplicate originalFile to targetFolder --ファイルをコピー
		set targetFileName to fileName & "(" & (i as string) & ")." & extentionName as text --
		set name of alias (targetFolder & fileName & "." & extentionName as text) to targetFileName --ファイル名にアイコンサイズを追加
		set imageFile to POSIX path of (targetFolder & targetFileName as text) --イメージファイルを設定
		
		tell application "Image Events" -- Image Events を呼び出す
			launch
			set aImage to open imageFile
			scale aImage to size i
			save aImage in imageFile
			close aImage
		end tell
	end repeat
	
end tell
```

###　参考資料
　以下の資料を参考にしました。
AppleScript 全般。ファイル操作や文字列の扱いなど。
長野谷隆昌@Piyomaru Software 著『AppleScript 最新リファレンス』
https://piyomarusoft.booth.pm/items/307646
http://piyocast.com/as/

Image Eventsによる画像のリサイズ方法について。
https://qiita.com/ynomura/items/76bde7935af4b82ab8b1

OS X Catalina で Image Events.app がデフォルトではファイルにアクセスできない設定になっていることについて。
http://piyocast.com/as/archives/8301
Prestoにとって最適なCassandraテーブル設計


# 必要な前提知識

- Cassandra のアーキテクチャ
- Prestoの簡単な動作の流れ



# 目的

- Cassandraの新テーブルを作成するにあたって、PrestoのSQL的に効率良いテーブルとは何か？　を探る。

以下に今回作成したテーブル毎のprestoの挙動をまとめる。



##  test.test （keyspace.table）

※（p= Partition Key, c=Clustering Key）


p=0,1　に10万件ずつデータを書き込み, c=0~10万
p=2~10万 に1件ずつデータを書き込み, c=0


### テーブル全体にSQL
```
SELECT * FROM cassandra.test."test"
```
![スクリーンショット 2020-04-20 13.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/4033e3d8-e371-90a1-6d69-9f1244430cec.png)

- taskが綺麗に分解され（✔️マークがその数）処理が走っている。




### 特定の１つのPartitionにSQL
```
SELECT * FROM cassandra.test."test" WHERE p=0
```
![スクリーンショット 2020-04-20 13.19.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/0f855e50-8305-1247-006e-0f53dc9f9710.png)

- Partitionを１つに特定すると、Prestoのtaskは分解されない。
-> 一つのサーバー（worker）のみが動く。


### 特定の1つのPartitionで、ClusteringKey を選択。

```
SELECT * FROM cassandra.test.test WHERE p=0 AND t=120
```
![スクリーンショット 2020-04-20 13.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/95529eb0-cafe-7a74-3900-a8592a462e1d.png)


- このPartition には10万件あるが、1行しか読まれていない。（効率良い。）




### 特定の1つのPartitionで、ClusteringKey を選択。（ver2）


```
SELECT * FROM cassandra.test."test" WHERE p=0 AND t>0 AND t<100
```
![スクリーンショット 2020-04-20 13.32.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/d9b18126-8b81-8d36-59b1-9a8d500691a4.png)

- このPartition には10万件あるが、(><)でClusteringKey を選択してもそれしか読まない（効率良い！）



### Partitionを範囲選択してSQL

```

SELECT * FROM cassandra.test."test" WHERE p>10 AND p<100
```


![スクリーンショット 2020-04-20 13.35.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266096/52e51a73-6ddf-4dee-60c5-4dfcb7e6ea5e.png)


- P=10~100　はデータが一件しかないPartition
- 一つ上のSQL と比べると、ある程度は１つのPartitionにデータをまとめるとSQL効率が良い。
→公式では1Partitionに10万件程度のitemを推奨。（itemとはrowではなく各値。）





# 結論

- Cassnadra のテーブル設計のトレードオフ。
`Partition にデータをある程度溜める <---> 適度に分散させる。`
→１Partitionに10万件のitemを溜める程度、それ以上は分散した方が良い。

- ClusteringKey にはSQLでよく範囲選択に使う値を設定するのが良い。
（例：timestamp）

# 所感
- やっぱり早い。
- Cassandra & Prestoでなんでもできる気がしてきた...
- Cassandra は超柔軟で、カラム追加等も簡単にできるが、最初のテーブル設計は肝
（PrimaryKey の変更はできないので。）
CentOS 7にDockerとKubernetes（minikube）をインストール

# 目的
公式サイトを参考に以下のようなDockerとKubernetes（以下K8s）の環境を構築する

- Docker: v19.03.8
- kubectl: v1.18.2
- minikube: v1.2.0

参照
Docker: [Install Docker Engine on CentOS](https://docs.docker.com/engine/install/centos/)
K8s: [Install kubectl on Linux](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux)


ちなみにKubernetesの略語であるK8sの由来は公式では下記のように説明されている
>Kubernetes という名前はギリシャ語で 操舵手 や パイロット という意味があり、知事 やサイバネティックスの語源にもなっています。K8s は、8文字の「ubernete」を「8」に置き換えた略語です。



# リポジトリを使用してDockerインストール

**※以下コマンドはすべてrootユーザーとして実行してます**

リポジトリの設定

```
$ yum install -y yum-utils

$ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
```

最新バージョンの
Dockerのコミュニティエディション（Docekr-ce）、Dockerコマンドを実行するコマンドラインツール（docker-ce-cli）、containerdをインストールする

```
$ yum install docker-ce docker-ce-cli containerd.io
```

インストールが終わったらdockerを起動する

```
$ systemctl start docker
```

`hello-world`イメージを実行できることを確認する

```
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
：
：
```

下記コマンドでインストールしているDockerのバージョンを確認できる

```
$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:27:04 2020
 OS/Arch:           linux/amd64
 Experimental:      false
：
：
```

CentOS 7での自動起動設定にDockerを指定する
上記設定のままではCentOS 7を再起動するたびにDockerが停止してしまうため、起動時にDockerも自動起動する設定をするのもおススメ

```
$ systemctl enable docker
```


# Linuxにkubectlをインストールする

最新リリースをダウンロードする

```
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
```

kubectlバイナリを実行可能にする

```
$ chmod +x ./kubectl
```

バイナリをPATHに移動する

```
$ mv ./kubectl /usr/local/bin/kubectl
```

インストールしたバージョンが最新であることをテストして確認する

```
$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:56:40Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
```

# Minikubeをインストールする

スタンドアロンバイナリをダウンロードし、minikubeバイナリを実行可能にする

```
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
  && chmod +x minikube
```

Minikube実行可能ファイルをパスに追加する

```
$ install minikube /usr/local/bin/
```

K8sクラスターを起動する
ここでクラスターの起動コマンドは`minikube start`であるが、これはVirtualBoxがインストールされていることが前提となっている
これはK8sのクラスターがVirtualBoxに仮想マシン上で起動されるからである
今回はVirtualBoxを使っていないためオプションで指定する

```
minikube start --vm-driver=none
```

このとき以下のようなエラーメッセージが表示された
```
* Centos 7.7.1908 上の minikube v1.9.2
* Using the none driver based on user configuration
X Sorry, Kubernetes v1.18.0 requires conntrack to be installed in root's path
```

この場合は指示に従って`conntrack`をインストールする

```
yum install conntrack
```

Kubernetesクラスターを起動したら、クラスターのステータスを確認する

```
$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
```

このようにステータスがRunningとなっていればOK
以上
メモ　jQueryとは

jQueryとは
JavaScriptのライブラリ（拡張機能）の事。補助機能が優秀でプログラムの実装が簡素化できる。  

jQueryのメリット
・プラグインと呼ばれる追加プログラムが豊富
・主要のブラウザへ対応している
・補助機能によるコードの短縮化

jQuertのデメリット
・たくさんの機能が追加されるので処理にかかる時間がわずかに増える
・本体のJavaScriptの理解度が減る

webページの技術の進化と大きな変更などあった際に生じる作業の手間などにより、2020年現在人気は下降中。
しかし、まだまだjQueryが適切だと言われる場面は多くあり過ぎた人気が落ち着いたとも考えられる。
フォームやボタンでのURL指定について

##編集機能のフォーム
`<%= form_tag("/memos/"+@memo.id.to_s, :method=>:patch) do %>`

「え…idって数値じゃないの？なんで""から外すの？」
=>数値は“”で囲われることで文字列になるから

@memoはインスタンス変数として使いたいから""で囲わない
=>囲うと**"@memo"**という**文字列**になってしまい、インスタンス変数としての機能が無くなる

そのため、まずidを取得してから**.to_s**で文字列に変え、**+**を用いて文字列と連結させた

##削除機能のボタン
`<a href="/memos/<%= memo.id %>" data-method="delete" >`

**<%= memo.id %>**はもちろん数値であり、それを""で囲うことで文字列となった

* * *
URLに<%= ~ %>の形を組み込むか、インスタンス変数を組み込むかで変わってくる
D言語で解く AtCoder Beginner Contest 163 (A〜D)

[Atcoder Beginner Contest 163](https://atcoder.jp/contests/abc163)に参加してきたので、その記録です。

テンプレートが長くなってきたので、GitHubのリンクを載せておきます
実際のテンプレート:https://github.com/jj1lis/atcoder/blob/master/templates/template.d
読みやすい版:https://github.com/jj1lis/atcoder/blob/master/templates/maint_template.d

やる気の上下のせいで奇数番しか記事を書けていませんが、そのうち偶数番もなんとかします。

#A - Circle Pond
[問題文](https://atcoder.jp/contests/abc163/tasks/abc163_a)

こいつの障害（問題ページが開けない、ジャッジが通らないetc...）のせいで今回はUnratedになりました。ちぇ、残念。

$10^{-2}$までの絶対誤差は許容されます。$n \le 100$なので....まあ、念の為`3.141592`くらいまで書いておけば問題ないでしょう。

```d:a.d
void main(){
    auto r = scan!long;
    (2*r*3.141592).writeln;
}
```

#B - Homework
[問題文](https://atcoder.jp/contests/abc163/tasks/abc163_b)

(特に言うことは)ないです。

```d:b.d
void main(){
    long n,m;
    scan(n,m);
    auto a = scanarr!long;
    auto ans = n-a.sum;
    (ans<0?-1:ans).writeln;
}
```

#C - management
[問題文](https://atcoder.jp/contests/abc163/tasks/abc163_c)

なんかよくわからんが、C問題にしてはめっちゃ簡単でした。色々な解法があると思いますが。自分は連想配列をつかってラクラク書きました。たしか連想配列のキー検索は$O(1)$だったと思うので、全体でも$O(n)$なので妥協点。

```d:c.d
void main(){
    auto n = scan!ulong;
    auto a = scanarr!ulong;
    ulong[ulong] boss;
    a.each!(i => boss[i-1]++);
    n.iota.map!(i => i in boss?boss[i]:0).each!writeln;
}
```

#D - Sum of Large Numbers
[問題文](https://atcoder.jp/contests/abc163/tasks/abc163_d)



$[K,\ N+1]$内の自然数$L$について考えると、答えは、

```math
\sum_{L=K}^{N+1} 「\{10^{100},10^{100}+1,...,10^{100}+N\}からL個選んだ和の組み合わせの数」
```

になります。

最初かなりの時間、組み合わせ全探査とか赤黒木とか悩んで無駄に時間を使いました。
しかしよくよく考えると、

- $L$個選ぶとき、和として考えられる最小の数を$A_L=10^{100}+(10^{100}+1)+...+(10^{100}+L-1)$、最大の数を$B_L=(10^{100}+N-L+1)+(10^{100}+N-L+2)+...+(10^{100}+N)$とおくと、$[A_L,\ B_L]$内の全ての自然数は和としてあり得る

ことがわかります(証明はしません）。

$K=N+1$となる場合は$L$も$L=N+1$だから$A_L=B_L$と、１パターンだけになります。
したがって次は$K \le L<N+1$の場合を考えます。

-  全ての$K \le L<L' \le N+1$について、$L$個選んだ和の組み合わせと$L'$個選んだ和の組み合わせは重複しない

が成り立つ事を示します。

```math
K<N+1であるとき、B_K<A_{K+1}を示す。\\
B_K=\sum_{a=0}^{K-1}(10^{100}+N-a)=K(10^{100}+N)-\frac{1}{2}K(K-1)\\
A_{K+1}=\sum_{a=0}^{(K+1)-1}(10^{100}+a)=(K+1)10^{100}+\frac{1}{2}K(K+1)\\
K\le N \le 2 \times 10^5であるので、A_{K+1}-B_K=10^{100}+K^2-KN>0\\
よって、B_L<A_{L+1}\\
同様に、B_{K+1}<A_{K+2},B_{K+2}<A_{K+3}...B_{N}<A_{N+1}がいえるので、\\
全てのL<L' \le N+1について、B_L<A_{L'}
```

以上と$A_L,B_L$の定義から、先の事項が示されます。

さて、ここで$A_L=10^{100}L+\sum_{a=0}^{L-1}a,\ B_L=(10^{100}+N)L-\sum_{a=0}^{L-1}a$ですから、$[A_L,\ B_L]$内の自然数の数は$NL-2\sum_{a=0}^{L-1}a+1=L(N-L+1)+1$となります。

```d:d.d
void main(){
    ulong n,k;
    scan(n,k);
    ulong sum;
    foreach(l;k..n+2){
        sum=(sum+l*(n-l+1)+1)%(10^^9+7);
    }   
    sum.writeln;
}
```

と、$10^9+7$でmodを取ることを忘れなければACです。
でも実際は、$[A_L,B_L]$の自然数の個数の求め方はもっと適当にやりました。

#感想
毎回出る数学系の問題、こんなのコンテスト中に証明できませんよね。今回は見当が当たったので良かったですが...経験値が足りないのか、勉強が足りないのか、もしくはその両方か。
やっぱりD言語は、書いていると手足のように思った通り動いて気持ちいいですね。