OmniAICreator/Qiita-1.07M huggingface dataset:
[HTML/CSS] ある要素をWindowに無理やり合わせつつ、拡大率に対応する

## はじめに
「普段は画面の横幅いっぱいに表示されてほしいけど、ブラウザの拡大率を操作したら拡大はされてほしい」を出来るだけ簡単に（雑に）実現する。
（ブラウザ依存、PC以外の動作は見ていません）

## 背景
普通は、

1. 要素のwidthを100%にする
2. Viewportで調整する[^1]

で、解決すると思いますが、
例えば、対象の要素を直接触れないとか、画面ないの一部の要素だけに適用したいとかで使えない想定。
[^1]: Viewportで初期の拡大率を1以下にすると問題があるよという記事を見たので参考に > [もう逃げない。HTMLのviewportをちゃんと理解する](https://qiita.com/ryounagaoka/items/045b2808a5ed43f96607)

## 方針
transformでどんなサイズでも合わせてしまえばいいじゃない

## 結果
CSSだけで実現できないかと思ったが、早々に断念しJavascriptを利用。
（Javascriptを使うのであれば如何様にもやり方はあると思うが）

- スクロールバーに対応してない
- ほかのWidth:100%のものと横幅が合わなくなる

あたりは対応していない。

※Windowにfitするように試してるのでCodePenだと確認し辛いです。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="minilabo" data-slug-hash="eqeOGB" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Element Window Fit Test">
  <span>See the Pen <a href="https://codepen.io/minilabo/pen/eqeOGB/">
  Element Window Fit Test</a> by minilabo (<a href="https://codepen.io/minilabo">@minilabo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

[^3]: 余談で文字を親要素にfitさせるパッケージがあったので[fitty](https://github.com/rikschennink/fitty)

## 試したこと
### CSSだけで実現
最初はCSSだけで実現できないかと試したが、scale + calcを上手く扱えず、時間がかかりそうだったので断念

```css:example.css
/* 計算結果の単位のせいか適用されない */
.ng {
  transform: scale(calc(100vw/2))
}

/* これだと動く */
.ok {
  transform: scale(calc(100/2))
}
```

### 諦めてJavascript使って動的に適用する
Javascriptで大きさを合わせるだけだと拡大率などに関わらず、Windowに合うだけなので、そのあたりの情報を調査する。

- 拡大しているかの判定  
[innerWidth](https://developer.mozilla.org/ja/docs/Web/API/Window/innerWidth)が表示領域、[outerWidth](https://developer.mozilla.org/ja/docs/Web/API/Window/outerWidth)がwindowの大きさを表す。  
ブラウザの機能で拡大するとinnerWidthが小さくなるので、outerWidthに比べてinnerWidthが小さい場合、拡大されている。

```javascript:main.js
// スクロールバーなどが含まれる為、このまま計算すると少しずれる（が、雑に丸める）
const zoom = Math.round(window.outerWidth / window.innerWidth);
```

- transformでサイズを変更しても親の要素のサイズに反映されない  
`element.getBoundingClientRect()`で高さを取得して、親要素に適用（単純に`element.offsetHeight`だと、transform前の大きさがとれる）  
この関数はとても便利だが、環境によってはダメかも？（参考: https://developer.mozilla.org/ja/docs/Web/API/Element/getBoundingClientRect）

```javascript:main.js
// tramsformの適用後の高さを取得して、親要素に適用してスペースを確保（今回は高さのみ）
parent.style.height = element.getBoundingClientRect().height;
```
ラズパイ初心者がRaspberry Pi 3 Model B+とPythonを使ってLチカに挑戦してみた。

Raspberry Pi(通称ラズパイ)を始める方が、一番最初に恐る恐る挑戦するだろう「Lチカ」。
例に漏れず自分も挑戦することにしてみた。

さて、ラズパイこそ初心者ではあるものの、普段電子工作を生業としているので幾分気は楽、だがどうしても最初は不安。
まずは先人の記録を~~パクらせて~~参考にさせてもらい、別なアプローチでのLチカも試してみたので学習記録として残しておく。
使用言語はPython。

# やりたいこと
下記先人の記録の後半にある、「LEDを点滅させる」動画のようなことをやりたい。

[ラズパイでLチカをしてみる（入門編）](https://qiita.com/RyoheiTomiyama/items/b0c221ea97aff454b6a0)
[レッツラズパイ！〜Lチカ＆Lピカをマスターしよう編〜](https://qiita.com/westvirginia/items/e339dbaf3286ea966483)

# 準備した物
グーグル先生の助けを借り、必要な物としてこれらをリストアップ。
大半の方の手元にないであろう電子工作品類(②～⑤)は1000円程度で揃えられる。

|No.|品名|数量|備考|
|:---:|:---:|:---:|:---:|
|①|Raspberry Pi 3 Model B+|1||
|②|ブレッドボード|1|小さな物でOK|
|③|LED|1|安価な砲弾型|
|④|330Ω抵抗|1|小さな物でOK|
|⑤|ジャンパーワイヤー|2|オス～メスタイプ|
|⑥|マウス|1|まずはUSB対応品|
|⑦|キーボード|1|まずはUSB対応品|
|⑧|HDMIケーブル|1|ディスプレイ出力はHDMIのみ|
|⑨|HDMI対応ディスプレイ|1||

# ラズパイセットアップ
今回購入したのはこちら。
初心者にとっての鬼門である「SDカードへのOSインストール」が、ありがたいことにプロによって完了されている。
安心、安全をお求めの方は是非。
**尚、自分はOSインストールが完了されていることに気付かず購入した。**

[Pi3 B+ スターターキット V3 16GB 透明](https://raspberry-pi.ksyic.com/)

もし、OSをインストールされていない場合は下記を参考にしていただくとわかりやすい。

[Raspberry PiにOSインストールする](https://qiita.com/kanaisawa/items/4723f72a28084263ae1f)
[Raspberry Pi 3 Model B+の初回セットアップ（購入から起動まで）](https://qiita.com/Higemal/items/c817b96c3806f23b35f6)

# 接続
今回は赤枠内の、GPIO17と隣にあるGroundを使用する。
![gpio-numbers-pi_mark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472694/132b49f4-2552-4a54-4426-133fb2f05d75.png)
実際の接続はこのような感じ。(ラズパイの向きが上図と逆なので注意)
![sch_flitzing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472694/27c80871-6778-ec51-02d6-9657704913e7.png)

# コード作成ツール
初心者用ツールとして、ラズパイにプリインストール(最初からインストール)されている「Thonny Python IDE」というツールでコードを作成していく。

![Thonny_only.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472694/6213b906-3b8a-8063-ddcf-92a472444225.png)

# コード記述
ググるとよく出てくるのがこのようなコード。
GPIO17ピンにLEDを接続すれば、コード実行後LEDが点灯し1秒後消灯する。

```python
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)
time.sleep(1)
GPIO.cleanup()
```

これでLチカ完了である。
**<font color=blue>コピペしてしまえば確認まで1分もかからない。</font>**

あっさり終わってしまうのもなんなので、他の手法がないか調べてみた結果、下記を発見。
これは1秒毎にLEDが点滅してくれるもの。

```python
from gpiozero import LED
from time import sleep

led = LED(17)

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)
```

**<font color=blue>やはりこれもコピペしてしまえば確認まで1分もかからない。</font>**

消化不良なので↓ココでさらに調べてみた。
[Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/)
全て英語なので慣れていないと苦痛だが、

```python
from gpiozero import LED

led = LED(17)

led.blink()

```

**<font color=red>LEDを点滅させる為に8行も記述していたのが、なんとたったの3行で済んだ。</font>**
しかも挙動は全く同じである。

ちなみに、カッコの中にパラメータを追加で記述するとLEDの点滅時間、回数を調整可能だ。

```python
led.blink(
on_time=x.x, #ON時間
off_time=x.x, #OFF時間
n=x #点滅回数
)
```

# 作動確認
下記のようなコードにし高速でLEDをチカチカさせることに成功。
(動画は2秒程度なのでn=100の意味がない)

```python
from gpiozero import LED

led = LED(17)

led.blink(on_time=0.1, off_time=0.1, n=100)
```

![LED2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472694/397e61b0-d6aa-7adf-4021-033553ab4509.gif)

# おわりに
Python学習の足掛かりとして初めて投稿しようと試みてみたが、やはり慣れない作業に大分時間がかかった。
この投稿で使い方は大体わかったので、引き続きPWMやThermal関連についての調査・学習内容をアウトプットしていきたい。
【Ubuntu 18.04】Ansible で Docker と docker-compose をインストールする

業務で Ansible を使い始めたので、プライベートの Ubuntu マシンも Ansible で環境構築中です
公式サイトでの手順を Ansible のお作法にのっとって書き直しただけですが、無事にインストールできました🎉

【参考】
https://docs.docker.com/install/linux/docker-ce/ubuntu/
https://docs.docker.com/compose/install/
https://gist.github.com/rbq/886587980894e98b23d0eee2a1d84933

## 前提

- Ansible Roles を使用
- sudo のパスワードは別途指定が必要
- Docker/docker-compose のバージョンを固定したい場合はそれぞれ追加の指定が必要

## できたもの

```yaml:roles/docker/tasks/main.yml
---
- name: Add docker GPG key
  apt_key:
    url: https://download.docker.com/linux/ubuntu/gpg
  become: yes

- name: Install basic list of packages
  apt:
    name: "{{ packages }}"
    state: present
    update_cache: yes
  vars:
    packages:
      - apt-transport-https
      - ca-certificates
      - curl
      - gnupg-agent
      - software-properties-common
  become: yes

- name: Add apt repository
  apt_repository:
    repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
  become: yes

- name: Install Docker packages
  apt:
    name: "{{ packages }}"
    state: present
  vars:
    packages:
      - docker-ce
      - docker-ce-cli
      - containerd.io
  become: yes

- name: Add user to docker group
  user:
    name: "{{ ansible_env.USER }}"
    groups: docker
    append: yes
  become: yes

- name: Ensure docker service is enabled
  systemd:
    name: docker
    state: started
    enabled: yes
  become: yes

- name: Install docker-compose
  get_url:
    url: "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-{{ ansible_system }}-{{ ansible_architecture }}"
    dest: /usr/local/bin/docker-compose
    mode: +x
  become: yes
```

## 一部解説

### GPG Key

```sh
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

公式では上記コマンドですが、`apt-key` モジュールのパラメータで url が指定できるので簡潔にできます

```yaml
- name: Add docker GPG key
  apt_key:
    url: https://download.docker.com/linux/ubuntu/gpg
  become: yes
```

### Docker 用リポジトリ

```sh
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

`lsb_release -cs` は bionic や xenial などの ubuntu のリリースバージョンを取得するコマンドですが
Ansible では `gather_facts` を有効にしていれば `ansible_distribution_release` で取得できます

```yml
- name: Add apt repository
  apt_repository:
    repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
  become: yes
```

### docker-compose

```sh
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

公式は curl なので `get_url` モジュールを使います
`uname -s`/`uname -m` はそれぞれ `ansible_system`/`ansible_architecture` で取得しています
また、ダウンロード先のパーミッションも同時に指定できるので1回のタスクで済みます

```yml
- name: Install docker-compose
  get_url:
    url: "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-{{ ansible_system }}-{{ ansible_architecture }}"
    dest: /usr/local/bin/docker-compose
    mode: +x
  become: yes
```
localでnginxを立ち上げてKibanaで可視化

# やりたいこと
nginxのアクセスログをKibanaで見る
filebeatやlogstashの実験のためlocalにDockerで環境を作ってみたかった

# やったこと
Dockerを4つ立ち上げた

- Elasticsearch
- logstash
- Kibana
- nginx with filebeat

nginxが動作しているサーバにfilebeatもインストール。
アクセスログをlogstash経由でElasticsearchに送って、Kibanaで可視化。

[完成品](https://github.com/tky/elk1)

# 動かし方

```
$ git clone git@github.com:tky/elk1.git
$ cd elk1
$ docker-compose up
```

```docker-compose up```で```-d```つけない方がログが見えてよい。
console が落ち着いたら```http://127.0.0.1```に何回かアクセスしてみると
ログが転送されているのがわかる。

## Kibana設定
http://localhost:5601 からKibanaにアクセス。

- 左メニューの一番下、Management(ギア？のアイコン）を選択。
- Kibana Index Patternsクリック後Create index patternという青いボタンをクリック
- Step1 index patternのテキストボックスに```logstash-*```入れてNext step
- Step2 Time Filter field nameのセレクトから@timestampを選択してCreate index patternをクリック
- 左メニューのDiscover(コンパス？のアイコン）をクリックするとグラフが表示される

# 参考サイト
https://github.com/spujadas/elk-docker
UnicornがResource temporarily unavailableを吐いたらbacklogの値を確認してみる

# 背景

railsアプリケーションをnginx+unicornで稼働させている際、以下のエラーが発生していました。
nginxとunicorn間は、UNIXソケットで通信しています。

```nginx.log
connect() to unix:/tmp/unicorn.sock failed (11: Resource temporarily unavailable) while connecting to upstream
```

この時の事象としては、UNIXソケットへの接続がbacklogの値(接続キューのサイズ)を超えてしまったため発生していました。
AmazonLinuxですと、最大接続数の上限はデフォルトだと128となっていました。

`ss`コマンドで、各ソケットのbacklogの値を確認できます。

```bash
$ ss -ax | grep -e unicorn
u_str  LISTEN     0      128    /tmp/unicorn.sock 38120                 * 0
```

```bash
$ sysctl net.core.somaxconn
net.core.somaxconn = 128
```

# 対応内容

OSのbacklogの上限変更を行います。
以下のコマンドで変更可能ですが、再起動で元に戻ってしまいます。

```bash
$ sudo sysctl -w net.core.somaxconn=256
net.core.somaxconn = 256
```

`/etc/sysctl.conf`に追記すると起動の都度反映されるようになります。

```/etc/sysctl.conf
net.core.somaxconn = 256
```

railsアプリケーション上での設定は、listenする際に指定可能です。
`config/unicorn.rb`に指定した値は、OSでの上限より大きくはなりません。

```ruby:config/unicorn.rb
listen "/tmp/unicorn.sock", backlog: 256
```

unicornを再起動すると、以下のようにbacklogの値が変更されていることを確認できます。

```bash
$ ss -ax | grep -e unicorn
u_str  LISTEN     0      256    /tmp/unicorn.sock 38120                 * 0
```
Eslint設定

４ヶ月ぶりにReactのプロジェクトを触ることになりその際に環境構築などの設定を１から設定したいのでその為にeslintの簡単な設定を忘れてしまったので備忘録までにメモ

今回はyarnを使用しています

先ずはeslintのinstallから

```
$ yarn add eslint 
```

reactも入れたいので

```
$ yarn add eslint-plugin-react
```

今回はairbnbのstyleを使用します

```
$ yarn add eslint-config-airbnb eslint-plugin-import  eslint-plugin-jsx-a11y
```

これを入れた後に

```
$ ./node_modules/.bin/eslint --init
```

諸々設定していると.eslintrc.jsが生成されるので

```
module.exports = {
    "env": {
        "browser": true,
        "es6": true
    },
    "extends":  "airbnb",
    "globals": {
        "Atomics": "readonly",
        "SharedArrayBuffer": "readonly"
    },
    "parserOptions": {
        "ecmaFeatures": {
            "jsx": true
        },
        "ecmaVersion": 2015,
        "sourceType": "module"
    },
    "plugins": [
        "react"
    ],
    "rules": {
    }
};

```

僕のはこうなっていました。

あまり理解できていない箇所も多いので今後調べらたアップデートしていこうと思います
RPC、Web API、或いはWebサービス

##始めに
将来、unityやsteam works関連で apiを使用しますので、関連技術を簡単にまとめておきます。

##RPC
RPCにより、ネットワークを通じ、別ユーザの作成したプログラムを使用することが出来ます。

ただし、作成されたプログラムは個別の呼び出しには対応していません。そこで、 apiと呼ばれるインタフェースを挟み、ユーザに対応を依頼する事で、円滑な手続きを可能にする訳です。

 この場合、apiはRPCプロトコルを内包している、と表現しても、設計によりますが、良いと思います。

RPCで呼び出されるのは、プログラムです。これを、自分の作りたいプログラムに組み込みます。

##Web api
Web apiにおいては、ユーザは、プログラムではなく、何らかのサービスを享受します。

基本的な考え方はRPCと同様、 api、すなわち手続きを以て呼び出しを行い、呼び出されたシステムを自分の作りたいアプリケーションに組み込みます。

多くの場合、httpプロトコルが用いられます。

この考えは、つまるところ、Web サービスと同じ訳です。利用者層が違うくらいです。

##デメリット
多くの便利な外部ツールの利用は有用ですが、実装過程のブラックボックス化を伴います。自社開発能力の低下を招きます。

外部サービスに依存するというのは、怖い事と考えています。利用する際には、せめて、背景にある技術は把握しておいた方が良いと思います。

RPCに関連する所では、外部のプログラムに合わせたコーティングを強いられる問題もあります。

自社開発能力などの、所謂、組織の知識について、考えてみると良いかと思います。

##今後

個人的には、RPCにより呼ばれるプログラム、これのオープンソース化進展を期待しております。

soap、restなどの概念、httpリクエストの詳細などは、おいおい勉強致します。

##最後に

お読み頂きありがとうございました。
要件、仕様、処理の違い

要件、仕様、処理の違いを整理してみました。

要件、仕様、処理の違いが曖昧になった方にオススメです。
私の主観なので、間違っていたらすみません。

# 要件
何をしたいのか？
例）数値のみを入力したい
## 要件の背景
なぜ、その要件なのか？
例）金額だから
# 仕様
人が理解できる要件の実現方法
例）数値以外が入力された場合、エラーとする
# 処理
コンピュータが理解できる仕様の実現方法
- 数値を正規表現で定義
- 入力された値を正規表現で、数値かどうか判定する
SSMと起動テンプレートを使って最速でお砂場EC2を用意する

zennに移行しました: https://zenn.dev/cumet04/articles/ssm-ec2-sandbox-template
qiita側の記事を消す予定は特にありませんが、更新することはありません。

---

「面白そうなプロダクト出てるな。ちょっとEC2用意して遊んでみるか。」

そう思ったとき、何も考えずにEC2にsshするところまで辿り着くための下準備設定を用意してみました。

## 方針
起動テンプレートを使うことで諸々の設定をすっ飛ばします。
またSessionManagerのsshを使うことでアクセス元IP制限や秘密鍵の手間を減らします。

※インスタントなお砂場想定のため、長期安定性やちゃんとしたセキュリティはあえてそれ相応です。

## SessionManager
セッションマネージャを使えば、awscliによるIAM認証でsshすることができます。

インスタンスに対する秘密鍵の管理の必要がなくなり、またセキュリティグループで22ポートを開ける必要がないため自宅のグローバルIPがころころ変わる場合でも使いやすいです。

このセッションマネージャによるsshの導入については詳細はこれらの記事を見るのがオススメです:
[SSH不要時代がくるか!?AWS Systems Manager セッションマネージャーがリリースされました! ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/ssm-session-manager-release/)
[AWS Systems Manager セッションマネージャーでSSH・SCPできるようになりました ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/session-manager-launches-tunneling-support-for-ssh-and-scp/)

本記事では詳細な説明は省略しますが、あらかじめ準備しておくことは以下となります。

* awscliの設定を済ませておく
* `AmazonEC2RoleforSSM`が付与されたIAM roleの作成
* （クライアントマシンで）[セッションマネージャプラグインのインストール](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)
* 下記ssh configの追記

```
host i-*
  ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'
```

その他サーバ側の設定は起動テンプレート側に記述します。

## 起動テンプレート
起動テンプレートには自分のお好みの設定＋SSMのsshに必要な設定を埋めていきます。
ポイントとなるのは以下です:

* AMI ID: AmazonLinux2のもの[^1]
* インスタンスタイプ: お好みで入力しておく
* キーペア・セキュリティグループ: SSMするので不要
* セキュリティグループ: SSMするので不要
* IAMインスタンスプロフィール: 事前に準備した`AmazonEC2RoleforSSM`のものを指定
* ユーザデータ: 以下で入力

```bash:ユーザーデータ
#!/bin/bash

yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm

passwd -d ec2-user

sed -i /etc/ssh/sshd_config -e 's/^#PermitEmptyPasswords.*$/PermitEmptyPasswords yes/g'
sed -i /etc/ssh/sshd_config -e 's/^PasswordAuthentication no$/#PasswordAuthentication no/g'
sed -i /etc/ssh/sshd_config -e 's/^UsePAM yes$/#UsePAM yes/g'
systemctl reload sshd
```

記事執筆時のAmazonLinux2 AMIではSSMエージェントのアップデートが必要だったためyumコマンドでインストールしています。

ssh設定については`ec2-user`を認証なしログインできるようにしています。
22ポートは開けず、認証はawscliで行うことを前提とした方針です。

また起動テンプレートにはお好みでスポットインスタンスのリクエストを入れておくとリーズナブルになります。


[^1]: SSMエージェントが入れられればなんでもよいはず

## 実際に動かす
準備ができたのでインスタンスを作成してsshします。
実際に行うことは

1. 起動テンプレートからインスタンスを起動する画面に遷移
2. ソーステンプレートのバージョンを選択して起動ボタンを押す
3. インスタンス一覧の画面に戻り、インスタンスIDをコピーしておく

だけです。設定ダイアログをポチポチ進めたり秘密鍵を探したりセキュリティグループを追加したりする必要はありません。
あとは少し待ってインスタンスが起動したら

```bash
ssh ec2-user@i-XXXXXXXX
```

するだけで見慣れたshell画面が登場します。簡単ですね。

## awscliも使う
これだけでも簡単ですが、よりサクッとterminalから作れるようにスニペットを用意しました。[^2]

[^2]: [jq](https://github.com/stedolan/jq)がインストールされてない人はいれましょう

```bash:インスタンス起動＆ID表示
aws ec2 run-instances --launch-template '{"LaunchTemplateId":"lt-xxxxxxxxxxxxxxxxx"}' | jq -r '.Instances[].InstanceId'
```

```bash:インスタンスリスト表示
aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [.State.Name, .LaunchTime, .InstanceId] | @csv' | sort | column -t -s","
```

## まとめ
地味に面倒なEC2作成作業ですが、起動テンプレートとSSMを活用して楽にできました。

一度頑張って用意しておくと、以後のサーバ遊びが大変捗ります。
30日間os自作(2日目) アセンブラ編

<h2>内容</h2>
『helloos.img』をアセンブラで作成してVirtualBoxで実行させてみました。

<h2>環境</h2>
環境
・widows10
・MS-DOS(コマンドプロンプト)

<h3>アセンブラとは？</h3>
>
マシン語の数値が表す命令にニックネーム（英語を短縮したようなもの）を付け，ニックネームを使ってプログラミングする手法が考案されました。これを「アセンブリ言語」と呼びます。
参照元：https://tech.nikkeibp.co.jp/it/members/ITPro/ITBASIC/20021218/1/
>

<br />
・アセンブラで書かれた『helloos.img』(下記画像)。
これをnask.exeでアセンブルしてhelloos.imgファイルを作成する。
<img width="576" alt="アセンブラ画像.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131238/91de9a50-4312-ddd8-3d15-1a12c15034a5.png">


<h2>流れ</h2>
<h3>1, アセンブラで書かれたhelloos.nasを用意する。</h3>
→書籍サポートページかCD-ROMからDLします。

自力で書きたい方はこちらをマネてください。
<img width="576" alt="アセンブラ全体画像.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131238/97ddd470-08f4-4af6-86d3-22935ad29882.png">


<h3>2,『helloos.nas』をアセンブルして『helloos.img』にする。</h3>

```MS-DOS:コマンドプロンプト
プロンプト>..￥z_tools￥nask.exe helloos.nas helloos.img
```

各自の環境でnask.exeとhello.nas、helloos.imgでパスを合わせて実行させます。


<h3>3,作成したhelloos.imgをVirtualBoxで動かす</h3>

前回の記事を参考にやってみてください。
https://qiita.com/nao18/items/e1b9b77f154e4d5239e5

参考になれば幸いです！
AamazonLinuxにてphp7.3のxdebugを有効にする

# 背景

php7.3にアップグレード後、phpunitにてカバレッジレポートを出力しようとしてxdebugをinstallしようと思いましたが、
2019年08月01日時点で`amzn-main`リポジトリには`php73-pecl-xdebug.x86_64`パッケージは存在しませんでした。

# 対応方針

以下の理由により、`remi-php73`リポジトリからphp7.3をインストールしました。
それぞれのリポジトリからのインストールにおいても回避方法はあると思いますが、WEB上の事例が多い方法として`remi-php73`を選択しています。

- `amzn-main`にはphp7.3のxdebugのパッケージが無い
- `remi-safe`ではphpコマンドではなくphp73コマンドになりphpunitがそのまま動作しない
    - (aliasを貼れば動くかもしれない)
- `phpenv`は利用経験がなかったためskip

# 導入

## remiリポジトリを設定

```
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

## install

`amzn-main`が有効な状態でphpモジュールを導入しようとすると、php5.4が導入されます。
`remi-php73`を有効化、`amzn-main`を無効化してから、`yum installl php`するとうまく指定できました。

```
$ sudo yum install --enablerepo=remi,remi-php73 --disablerepo=amzn-main php php-fpm php-xdebug
```

# 導入途中で発生した事象

## httpd24との依存関係でエラー

```
エラー: httpd24-tools conflicts with httpd-tools-2.2.34-1.16.amzn1.x86_64
エラー: httpd24 conflicts with httpd-2.2.34-1.16.amzn1.x86_64
```

apache2.4を利用していないのであれば、httpd24モジュールを削除。

```
$ sudo yum remove httpd24 httpd24-tools
```

## libwebpとの依存関係でエラー


```
エラー: パッケージ: gd-last-2.2.5-5.el6.remi.x86_64 (remi-safe)
             要求: libwebp.so.5()(64bit)
```

`amzn-main`で導入されているlibwebpですと依存関係でエラーが発生するようです。
一旦libwebpを削除し、epelから入れ直します。

```
$ yum remove libwebp
$ yum --disablerepo=amzn-main --enablerepo=epel install libwebp 
```
Apexで簡単なバリデーションチェックを作ってみた。

salesforceには標準機能が充実しているので標準でもできるやん。というような内容ですが、複雑な組み合わせの入力規則などをapexで作ることもあるかもしれないので、バリデーションチェックのサンプルを作ってみました。

# 機能
顧客作成画面みたいなものをイメージしてみました。
使っているのは標準オブジェクトの取引先責任者です。
今回のバリデーションチェックは、
1.携帯電話の090、080，070から始まっているかどうか
2.携帯電話が11桁かどうか
の二つです。

では実際のコードです。

#####VF画面

```ruby:samplepage.vfp
<apex:page controller="samplepagecontroller" sidebar="false">
    <apex:pageMessages id="message"/>
    <apex:sectionHeader title="顧客作成画面"/>
    <apex:form >
        <apex:pageBlock >
            <apex:pageBlockSection columns="2" showHeader="true" title="個人情報">            
                <apex:inputField value="{!conditions.LastName}"/>
                <apex:inputField value="{!conditions.FirstName}"/>
                <apex:inputField value="{!conditions.MobilePhone}"/>
                <apex:inputField value="{!conditions.LeadSource}"/>
            </apex:pageBlockSection>
            <apex:pageBlockButtons location="bottom">
                <apex:commandButton action="{!save}" value="保存"/>
            </apex:pageBlockButtons>
        </apex:pageBlock>
    </apex:form>
</apex:page>
```
####Apexコード

```ruby:samplepagecontroller.cls

        String left = conditions.MobilePhone.left(3);
        Integer length = conditions.MobilePhone.replace('-','').length();
        //電話番号チェック
        if ( left == '090' || left == '080' || left == '070') {
            if ( length != 11 ) {
                Apexpages.addMessage(new ApexPages.message(ApexPages.Severity.INFO,'携帯番号は11桁で入力してください。'));
            }
            insertContact.MobilePhone = conditions.MobilePhone.replace('-','');
        } else {
            Apexpages.addMessage(new ApexPages.message(ApexPages.Severity.INFO,'携帯番号は090、080、070から始まる番号を入力してください。'));
        }

```

まず、.left(3)で最初の3桁を判定します。
その後問題なければ、.length（） != 11で11桁の判定をしています。


####3桁チェック
<img width="1530" alt="スクリーンショット 2019-08-04 21.17.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/03bd8b2f-f215-b083-bbe3-d39a9b57ec25.png">
####11桁チェック
<img width="1530" alt="スクリーンショット 2019-08-04 21.17.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472705/bd435052-315a-0312-d6d7-90524b1145fd.png">

このように組み合わせればより複雑なバリデーションチェックも可能だと思います。
経済数学とベンサム

経済学者のジェレミ・ベンサムの「最大多数の最大幸福」(the greatest happiness of the greatest number)を
現代風に定義すると、

　　　　公正なルールの下で競争が行われた場合、個人財産曲線は正規分布を描く。

と同値になる。ここで、個人財産曲線は、X軸に個人財産額、Y軸にX軸の個人財産を持つ人口と定義する。

計算機でシミュレーションする場合は、最初に税などの財産の再分配ルールを決めておいて、
任意の初期状態から始める。プレーヤーからは個人財産曲線は、『みえざる手』としておく。
現代経済学の動学的均衡論を前提としていない。

富の偏在が決められた割合よりも大きくなったら、王様の首が物理的に切られてバッドエンド。
個人財産曲線の面積である人口がある割合（軍隊だと７割）以下になったら、全滅判定される。
財産が０となった個人は、シミュレーションから外れる。すなわち死亡判定もしくは奴隷落ち。

このゲームを、『ベンサム・ゲーム』と名付けたが、これと同じようなゲームがあるのだろうか。
あったら教えて下さい。

ルールを追加することによって、色々なゲームができるのが特徴ですので、
ルールのアイデアがあったら教えて下さい。

簡単にするために外国がない前提となっていますが、他国との戦争や貿易とかの
パッケージ追加もできそうです。

ご意見をお待ちします。


# 参考文献
- 経済数学の直観的方法　マクロ経済学編(長沼伸一郎）
- ケインズの経済学と現代マクロ経済学（大矢野栄次）
- 中高の教科書でわかる経済学マクロ編（菅原晃）
- 教養としてのマクロ経済学（薮下史郎）
- 現代社会で乙女ゲームの悪役令嬢をするのはちょっと大変（北部九州在住）
- 幼女戦記（カルロ・ゼン）
- 財務大臣になって財政改革を進めよう(財務省)
“Docker" First Try (2)

My Studied Log

<overall>
1. Created Docker file
2. Build Container by referencing Docker file
3. Run Container

■"From”
pointing out Base Image file composing dockerfile

(1)Start Docker deamon
$sudo systemctl start docker
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
4173f3027999        ubuntu:16.04        "bash"              16 hours ago        Exited (0) 16 hours ago                       dreamy_elion
7f5e26aad2ce        hello-world         "/hello"            23 hours ago        Exited (0) 23 hours ago                       agitated_galileo

(2)Create Dockerfile ,then build Docker image using it.
*Posted created file into below directory.
/home/ec2-user/samplefilebox
*contents
$ cat Dockerfile_sample
FROM ubuntu

RUN echo foo
RUN echo bar

$ chmod +x Dockerfile_sample
$ docker build -f Dockerfile_sample -t build:from_simple .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu
latest: Pulling from library/ubuntu
7413c47ba209: Pull complete 
0fe7e7cbb2e8: Pull complete 
1d425c982345: Pull complete 
344da5c95cec: Pull complete 
Digest: sha256:c303f19cfe9ee92badbbbd7567bc1ca47789f79303ddcef56f77687d4744cd7a
Status: Downloaded newer image for ubuntu:latest
 ---> 3556258649b2
Step 2/3 : RUN echo foo
 ---> Running in e0f5b8c0b42c
foo
Removing intermediate container e0f5b8c0b42c
 ---> cf507a94be22
Step 3/3 : RUN echo bar
 ---> Running in 463f6b46421a
bar
Removing intermediate container 463f6b46421a
 ---> 450c66ab74e2
Successfully built 450c66ab74e2
Successfully tagged build:from_simple

*-f : quating file
*-t : pointing out tagname

(3)comfirmed from "docker images"
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
build               from_simple         450c66ab74e2        3 minutes ago       64.2MB
sampledocker        latest              f669c3195c60        16 hours ago        203MB
ubuntu              16.04               5e13f8dd4c1a        11 days ago         120MB
ubuntu              latest              3556258649b2        11 days ago         64.2MB
hello-world         latest              fce289e99eb9        7 months ago        1.84kB

■ENV
setting Environment variable into docker container.
stile is below 2type there.
1. ENV <key><value>
2. ENV <key>=<value>...

■LABEL
Added metadata to Docker images.

■RUN
by executing shell command, setup container.

■EXPOSE
Declarate Port that will use in the container.

■ENTRYPOINT / CMD
Specified command that will be executed when container starts
TypeScriptをはじめよう 3

#TypeScriptの型のはなし
TypeScriptはJavaScriptと異なり、静的型付き言語です。また、型推論も備えています。今回は、TypeScriptを使う上で必要な型について説明します。

#型の種類
現在、TypeScriptにはプリミティブ型が7種類あります。プリミティブ型とはメソッドを持たないデータそのものを指します。また、それ以外のメソッドを持つ型をオブジェクト型といいます。今回は基本的なプリミティブ型を紹介し、他の型についてはWebアプリ開発を通して説明したいと思います。

***プリミティブ型の種類***

- number
- bigint
- string
- boolean
- symbol
- null
- undefined

## number
number型は浮動小数点数を表す型です。TypeScriptでは、16進数、10進数、8進数、2進数のリテラルを使うことができます。

```typescript
var num : number = 123
```

## bigint
bigint型は整数を表す型であり、TypeScript3.2より追加されました。number型はIEEE 754に決められた浮動小数点数を扱うため、大きい整数を扱うことができません。そのため、大きい整数が必要な時はbigint型を使います。

```typescript
var num1 : bigint = BigInt(123)
var num2 : bigint = 123n
```

## string
string型は文字列を表す型です。文字列を扱いたい場合は、他の言語と同様に、「'」、「"」、「`」のいづれかで括ります。

```typescript
var string1 : string = "foo"
var string2 : string = 'bar'
var string3 : string = `baz`
```

## boolean
boolean型は真偽を表す型です。値はtrue/falseの2つのみです。

```typescript
var tr : boolean = true
var fa : boolean = false
```

## symbol
symbol型はユニークな値を表す型であり、ECMAScript6より追加されました。一般にはプログラムの挙動に関わらせず、デバッグなどに使います（主観）。また、global symbolとlocal symbolの使いわけが必要です。

```typescript
// local symbol
var sym1 = Symbol("foo")
var sym2 = Symbol("foo")
// global symbol
var sym3 = Symbol.for("bar")
var sym4 = Symbol.for("bar")

console.log(sym1 === sym2)  // false
console.log(sym3 === sym4)  // true
```
※JavaScriptとTypeScriptには等価を示す演算子が「==」と「===」の2種類あります。前者は型変換を行った結果が等しい場合は真を返しますが、後者は型変換を行わずに型が異なれば偽となります。

```typescript
"1" == 1 // true
"1" === 1 //false
```

## null/undefined
nullは変数の使用不可、undefined型は未初期化を表す型です。null型、undefined型は他の型のサブタイプとして実装されています。

```typescript
var nullvar : null = null
var undefinedvar : undefined = undefined
```
---
はじめてのマークダウン：Markdown Essentials

初投稿！
マークダウンのテストするで〜

基本半角。
スペース入れなあかんとか
スペース入れても一緒とかは
ちょくちょくある。

##見出し
# #見出し１：だんだん
## ##見出し２：小さく
### ###見出し３：なっていく

##強調
** **これ** ** で強調できるねんな

##リンク
そのまま貼るだけでええんか
https://qiita.com/drafts/03c7a1f1e740927ffe62/edit

##コード
``半角のバッククォートで挟むねん` `

```
// ```
// 半角のバッククォート
// 3連チャンで
// 挟むねん
// ```
```

##リスト
###普通のリスト
- `- `リスト1
- `- `リスト2
 - `- `リスト2-1（1文字目は半角スペースやで）

* `* `これでもええで1
 * ` * `これでもええで1-1（1文字目は半角スペースやで）

###番号付きリスト
1. `1. `番号付きリスト1
2. `2. `番号付きリスト2
3. `3. `番号付きリスト3
4. `4. `...

###チェックボックス
- [ ]  `- [ ]`チェックボックス1
- [ ]  `- [ ]`チェックボックス2
- [x]  `- [x]`チェックボックス3

以上。
初心者による、初投稿：はじめてのマークダウン
でした〜
LeetCode / Balanced Binary Tree

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/08/04/203459)からの転載）

[https://leetcode.com/problems/balanced-binary-tree/]

Given a binary tree, determine if it is height-balanced.

For this problem, a height-balanced binary tree is defined as:

a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example 1:
Given the following tree [3,9,20,null,null,15,7]:
<img width="95" alt="スクリーンショット 2019-08-02 15.03.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/d61fb251-7187-0096-1fa7-fc905aeaecae.png">
Return true.

Example 2:

Given the following tree [1,2,2,3,3,null,null,4,4]:
<img width="92" alt="スクリーンショット 2019-08-04 20.37.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122973/9b34e1af-63c2-fade-b91a-a894b62a55fe.png">
Return false.

どのsubtree間の深さの違いが1以下であるtreeを、balanced binary treeと言っています。
treeがbalanced binary treeになっているか判定せよという問題です。

#### 解答・解説

##### 解法1
subtreeの深さの違いからbalancedな状態か判定する問題なので、subtreeの深さを取得しながら、左右のsubtreeの深さの違いが1以下であるか判定する、再帰的な処理を書くこととします。
以下ではcheck関数を定義し、(subtreeの深さ, 左右のsubtree間の深さの差が1以下であるかのboolean)をtupleで返す構造とし、rootがない末端では(0, True）を返すこととして、再帰的な処理をかけます。
isBalanced関数の返り値としては、tupleの2つ目の要素を返すことになります。

```python
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

def check(root):
    if not root:
        return (0, True)
    l_depth, l_balanced = check(root.left)
    r_depth, r_balanced = check(root.right)
    return max(l_depth, r_depth) + 1, l_balanced and r_balanced and abs(l_depth - r_depth) <= 1

class Solution:
    def isBalanced(self, root):
        return check(root)[1]
```

iterativeなコードはちょっと長くなるので、recursiveが良いと思います。
考え方は同じですが、違う書き方をすると例えば以下の通り。

```python
def check(root):
    if not root: return 0
    l_depth = check(root.left)
    r_depth = check(root.right)
    if l_depth == -1 or r_depth == -1 or abs(l_depth - r_depth) > 1: return -1
    return max(l_depth, r_depth) + 1

class Solution:
    def isBalanced(self, root):
        return check(root) != -1
```
rails webpacker:install実行時にrun() in thread failed: inotify event queue has overflowed

#現象
rails webpacker:installを実行するとrun() in thread failed: inotify event queue has overflowedと表示される。


#環境
docker-composeでruby:2.6.3をベースに構築。

#対応
###方法その1.Dockerの設定を変更する。
　環境設定→AdvancedのCPUs,Memory,Swapの値を増加する。

###方法その2.コンテナ内のファイル以下の記述を追加しsysctl設定にロードする。
```/etc/sysctl.conf
fs.inotify.max_user_watches = 999999
fs.inotify.max_queued_events = 999999
fs.inotify.max_user_instances = 999999
```
以下のコマンドを実行

```bash
sudo sysctl -p
```

実行結果確認

```bash
cat /proc/sys/fs/inotify/max_user_watches   #=> 999999
cat /proc/sys/fs/inotify/max_user_instances #=> 999999
cat /proc/sys/fs/inotify/max_user_watches   #=> 999999
```


補足：以下のエラーが表示される場合、privilegedでコンテナを起動する必要がある。

```bash
sysctl: setting key "fs.inotify.max_user_watches": Read-only file system
```

privilegedを以下の通り記載してコンテナを起動し、再度コンテナ内でsudo sysctl -pを実行する。

```docker-compose.yml
version: '3'
services:
  web:
    privileged: true
```

#結果
rails generate react:installでエラーが出なくなる。エラーによってどういう影響があるかわからないがエラーはない方がいいはず。

参考にさせていただいたサイト
https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers
https://github.com/guard/rb-inotify/issues/61
https://qiita.com/osamunmun/items/1786aac5904439522d72
https://wadap.hatenablog.com/entry/20100123/1264211202
C++Builder 10.3.2でyaml-cppを使う

# yaml-cpp
https://github.com/jbeder/yaml-cpp
# 動機
PCアプリの動作をカスタマイズする設定ファイルについて消去法で考えると、

- 階層をサポートしたい<br/>
INIファイルが消える
- 設定ファイルは人間様が読み書きする<br/>
レジストリ・XMLが消える
- コメント書きたい<br/>
JSONが消える

で、自分が知っているもので残ったのがyaml
というか、他の案件の客先作成のアプリがyaml-cppを使ってたので使い方を知っていたのが大きい。（但しそのアプリはVisual Studio使ってる）

# 問題点 (今はあまり問題ではなくなった。はず)
最大の問題点は、今や誰も使ってない(ヲイ)C++Builderでオープンソースのライブラリが使えるのか？という点。
なんせつい2.5ヶ月まではバンドルされてるBoostのバージョンが、従来コンパイラのbcc32では**2009年リリースの1.39**ってな状態でして。
数年前にリリースされたclangベースの新コンパイラ bcc32c でもBoostのバージョンは2013年リリースの1.55という体たらく。

これがようやく2018/11月のC++Builder 10.3でbcc32cがC++17に対応して、Boostのバージョンも1.68になって巷に溢れるOSSも使えるようになる。はず。
(yaml-cpp自体の要求はC++11準拠でBoostには依存してないけど、新しいBoostが使えれば最近のC++規格に準拠していて安心という事になる)

関係ないけど、2018/11月の10.3リリース時に「Boostはすぐ(年内くらい)に出ます」って言ってたのに、実際にリリースされたのは**半年後の2019/5月**でこの間10.3が使えなかった恨みは一生忘れない。

# 結局どうなの？
結論から言うと、3時間くらいでちゃんと使えた。
C++11の件よりも、前バージョンの10.2.3でCMakeが使えるように対応してくれてた事が大きかった。
[C++ Builder での CMake の利用](http://docwiki.embarcadero.com/RADStudio/Rio/ja/C%2B%2B_Builder_%E3%81%A7%E3%81%AE_CMake_%E3%81%AE%E5%88%A9%E7%94%A8)
CMakeって今回初めて知ったけど、なんだかスゴいものだね。

# 手順
1. CMakeとNinjaをインストール<br/>
[C++ Builder での CMake の利用](http://docwiki.embarcadero.com/RADStudio/Rio/ja/C%2B%2B_Builder_%E3%81%A7%E3%81%AE_CMake_%E3%81%AE%E5%88%A9%E7%94%A8) の通り、CMakeの設定ファイルをRAD Studioからコピーする必要がある事に注意
1. CMakeを実行<br/>
これも上記URLの通りなんだけど、なんと**Win32のコマンドが間違っている**ので注意されたし<br/>
誤記については、[ここがソース](https://community.idera.com/developer-tools/b/blog/posts/new-in-10-2-3-using-cmake-with-ninja?CommentId=54ed150c-dc66-4828-8c9b-d90010ba2589)。今見てきたら[USのWiki](http://docwiki.embarcadero.com/RADStudio/Rio/en/Using_CMake_with_C%2B%2B_Builder)も間違ったままだ。
   * 誤：```cmake -DCMAKE_C_COMPILER=bcc32x.exe -DCMAKE_CXX_COMPILER=bcc32x.exe -G Ninja```
   * 正：```cmake -DCMAKE_C_COMPILER=bcc32c.exe -DCMAKE_CXX_COMPILER=bcc32c.exe -G Ninja```<br/>
bcc32x ではなく、 bcc32c<br/>
さらに、yaml-cppではtestとutilでビルドエラーになったので対象から除外した<br/>
```cmake -DCMAKE_C_COMPILER=bcc32c.exe -DCMAKE_CXX_COMPILER=bcc32c.exe -G Ninja -DYAML_CPP_BUILD_TESTS=OFF -DYAML_CPP_BUILD_TOOLS=OFF -DYAML_CPP_BUILD_CONTRIB=OFF```
1. build.ninja 変更
上記の手順で準備はOK、後はninjaを実行すればコンパイル・リンク(アーカイブ)してビルド完了のはずなんだけど、残念ながらアーカイブのtlib.exeでエラーになってしまう。
原因は「yaml-cpp」の名前にある「-」ハイフン文字。
tlib.exeは入力ファイル指定に「-」があると「既存ライブラリからモジュールを削除する」指定になる。
このため、入力ファイル指定のコマンドライン「CMakeFiles\yaml-cpp.dir\src\binary.cpp.obj」が「CMakeFiles\yaml」と「-cpp.dir\src\binary.cpp.obj」に分割され、「CMakeFiles\yaml.obj」から「binary.cpp.obj」を削除しようとしてしまう。

    1. Ninjaのビルド設定ファイル build.ninja 内の文字列「CMakeFiles/yaml-cpp.dir」を「CMakeFiles/yaml_cpp.dir」に置換<br/>
置換対象は「yaml-cpp」だけでなく「CMakeFiles/yaml-cpp.dir」にする事、そうしないと余計なところまで変わってしまう
    2. ビルド出力ディレクトリ「CMakeFiles/yaml-cpp.dir」を「CMakeFiles/yaml_cpp.dir」にリネーム

1. Ninja実行
`ninja`
yaml-cpp.libが出来れば完了
1. アプリでのリンク
IDEでプロジェクトにソースとしてyaml-cpp.libを追加するとリンカが読み込んでくれる。

# yaml-cppの使い方
既に別の記事 [C++でYMLファイルが読みたい...読めた](https://qiita.com/Sashimimochi/items/bb9dd3e6e459bc31a95d) がある、と思ったけどこれは0.3.0のOld APIだね。
後日別の記事に書く

# 最後に
Qiita使い始めたばかりで記法に慣れていないので、見にくい所があれば指摘下さい
TypeScriptの型定義毎のObjectに対するプロパティの追加可否

# やったこと
Objectの型定義の仕方によって、定義に無いプロパティの追加や不足を許容するかが変わってくるため、試してみた


# コード
```typescript
/**
 * - プロパティ追加不可
 * - プロパティ不足不可
 */
type UserNotAddProperty = {
    name: string
    age: number
}

const userA: UserNotAddProperty = {
    name: 'より',
    age: 22,
}

/**
 * - プロパティ追加可
 * - プロパティ不足不可
 */
type UserAddProperty = {
    name: string
    // インデックスシグネチャ・・string型のキーにstring | number型の値
    // ただし、keyが数値の場合もstringにキャストされる
    // keyの型はstring or numberのみ
    [key: string]: string | number // string or number型の値が入る
}

const userB: UserAddProperty = {
    name: 'ひろ', // これが無いとコンパイルエラー
    type: 'おたく', // 定義してないプロパティを追加出来る
    tall: 178, // 定義してないプロパティを追加出来る
    11: 192 // 定義してないプロパティを追加出来る
}

/**
 * - プロパティ追加不可
 * - プロパティ不足可 
 */
type UserWiding = {
    name?: string
    age?: number
}

const userC: UserWiding = {
    name: 'かつ'
}

```

# プロパティをUnion型で定義も出来る

```typescript
/**
 * - プロパティの値をUnion型で定義
 */
type Answer = 'a' | 'b' | 'c' | 'd'
type Question = 'question1' | 'question2'
type Target = {
    name: string
    answer: {
        // ?がついているので、プロパティが不足しててもOK
        [key in Question]? : Answer
    }
}

const target: Target = {
    name: 'MyName',
    // answerが無いとエラーになる
    answer: {
        // question2がなくてもエラーにならない
        question1: 'c',
    }
}

```
プログラミング初心者が初心者に向けて今日学んだことを説明してみる　その１

プログラミング初心者が今日学んだことを自分の言葉で説明してみる記事です。
初心者なので勘違いしているところもあるかと思いますがコメントにて言っていただけるととてもうれしいです。
~~なので「全然ちがったんだけど！？！？！？オォン！？！？！？」は怖いので辞めて（切実）~~
この記事の目的はあくまで自分の記憶力向上のための記事になっています。
毎日投稿予定です。

#自己紹介から

はじめまして　tateと申します。
パソコン一つでモノづくりできるのが魅力的だなと思って最近プログラミングを始めてみた高校二年生です。
文章力は全然ないので文章が拙く見ずらいかもしれませんが見てくださると嬉しいです。
サイトを作るためにRubyを学習する予定です。

#今日学んだことリスト
- html
 - タグの種類（h1.p.a.コメント.img）

#学んだことの説明

- 「h1タグ」は見出しを作るタグでh1~h6まであって数字が大きくなっていくほど見出しの文字の大きさが小さくなる
- 「pタグ」は段落のタグ　見出しに対して改行される
- 「aタグ」はリンクのタグ　aタグで囲んだ部分がリンクになる
 - リンクの飛び先を指定する方法は「a href ="リンク先"」
- 「コメント」はwebサイト上には出ないメモみたいなもの　
 - ctrl＋/で簡単にコメントにできる
- 「imgタグ」は指定した画像を表示させるタグ
 - 「img src ="画像の名前"」で指定できる　
 - ファイルの位置に注意する
CData Excel Add-in for Gmailを使ってみた

#ソフトの概要
Gmailのデータをデータベースライクに抜いてくれるもの。

#インストール
下記のURLより評価版（無料のやつ）をダウンロードします。
https://www.cdata.com/jp/drivers/gmail/download/excel/

※ダウンロード終わって、起動したらあとはウィザードに従えば準備完了です。

#エクセルを開く
リボンに「CDATA」が追加されます。

![cdata1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244716/49fa2532-cd67-4b8e-00bd-b85de3ecfbca.jpeg)

#接続ウィザード
データを抜きたいGmailアカウントの情報を入れます。
「必須を表示」をクリックして、[Password]と[ユーザー名]を登録します。
※ちなみに2段階認証を行っている場合、エラーになります。（なりました。）
　このエラーを回避するには、Gmailアカウント側でアプリパスワードなるものを発行します。
　下記のURLの手順に従い、アプリパスワードを生成し、そのパスワードでログインしたら接続できました。
　https://support.google.com/accounts/answer/185833?hl=ja

![cdata2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244716/00540516-dd29-772a-ccbe-7b6cfe8dc445.jpeg)

#データ選択
接続が確立できたら、あとはデータをとってくるだけです。
今回は誰からメールが来ているか（From）のデータだけとります。

![cdata3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244716/f952cf09-a83a-51b2-8d37-2dd353f64d6b.jpeg)


1000件分の送信元データが取れました。
※いちおう隠してます。わかりづらくてすみません。:bow:

![cdata4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244716/105d5a02-5793-bda0-265a-0ced6211db67.jpeg)

#活用

・・・・とりあえずピボット組んで、件数ランキングにしてみました。
僕のメールボックスを圧迫しているランキングですね。こちらを参考に購読解除をしていこうと思います。

![cdata5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244716/4349b06d-1e71-cf46-6769-9a358768d4fe.jpeg)


#使ってみた感想

自分の発想力が乏しく大したことには活用できませんでしたが、
データを抜くまでの操作が非常にシンプルだと感じました。
同じことをVBAとかでやるとけっこうなコード量になりそう・・・。
IDとパスワードの入力、取得する情報の選択だけで済むので、エンジニア以外でもすぐ使えそうです。

以上です！！
ナビゲーションバーをグリッドレイアウトにしてみた

１ヶ月くらい、HTMLの書籍を読んで、一通り目を目を通した。
(といっても、まだ、理解できていないが...)

タイトルの通り、ナビゲーションバーをグリッドレイアウトでやってみた。

#レイアウト
![navbar.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262917/6aedab5c-a8f5-7806-140e-b84eb25bb60e.png)



#ソース1
最初に書いたソースは下記の通り。

```grid_practice1.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>グリッドレイアウト　練習</title>
	<link rel="stylesheet" href="base.css">
</head>
<body>
	<header>
		<nav id="nav_bar">
			<ul>
				<li><a href="#">ナビ1</a></li>
				<li><a href="#">ナビ2</a></li>
				<li><a href="#">ナビ3</a></li>
				<li><a href="#">ナビ4</a></li>
				<li><a href="#">ナビ5</a></li>
				<li><a href="#">ナビ6</a></li>
			</ul>
		</nav>
	</header>
</body>
</html>
```

```base.css
body {
	width: 600px;
	margin-left: auto;
	margin-right: auto;
}

/* ヘッダー */
header {
	text-align: center;
}

#nav_bar {
	display: grid;
	grid-template-columns: 1fr 1fr 1fr;
	grid-template-rows: auto auto;
	margin: 0;
	padding: 0;
}

#nav_bar li {
	list-style: none;
	margin: 0;
	padding: 0;
	border: solid 1px;
	background: #f3f3f3;
}

#nav_bar a {
	text-decoration: none;
	margin: 0;
	padding: 0;
}
```
#結果1
上記のソースで行けると思っていたが、結果は下のようなレイアウトになった...
![navbar2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262917/044ff29c-7df8-245b-9d10-f8e8046154eb.png)

cssが適用されていないのかと思ったが、きちんとソースには書いている..
デバッグモードで確認してみた。
すると、下の画像のように右に２つ領域が割り当てられているのを確認できた。
![navbar2_debug.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262917/da98c25c-e0e2-fafd-ac92-b1a0cb156184.png)

左端に、カーソルを合わせると、下のようになった。
![navbar2_debug2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262917/cff17a65-30dd-6c67-edb3-8052fa3eac9d.png)

#ソース2
上の画像から、`nav`要素はきちんと適用されているが、`ul`要素には適用されていない。
ソースを変更してみた。

```grid_practice2.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>グリッドレイアウト　練習</title>
	<link rel="stylesheet" href="base.css">
</head>
<body>
	<header>
		<nav>←元々、ここにidを書いていた
			<ul id="nav_bar">←ここにidを移動した
				<li><a href="#">ナビ1</a></li>
				<li><a href="#">ナビ2</a></li>
				<li><a href="#">ナビ3</a></li>
				<li><a href="#">ナビ4</a></li>
				<li><a href="#">ナビ5</a></li>
				<li><a href="#">ナビ6</a></li>
			</ul>
		</nav>
	</header>
</body>
</html>
```

すると、望んだレイアウトになった。
idを書く場所を間違えていた...
グリッドの適用先が間違ってた...

#おわりに
なぜ、うまくいかなかったのか？
nav要素に適用すれば、ul要素が自動的に割り当てられると思っていた。
けど、グリッドを適用したのはnavであって、ulではない。
だから、うまくいかなかった。
レイアウトの左上にulが埋め込まれ、そのなかで上から順にli要素が並んだ。

適用先をulに変えることで、li要素が左上から右に割り当てられた。
(この考えであってるはず...)

ここまで読んでくれた上で、自分の考えが間違えていたら、指摘してくれるとありがたいです。
webpの読み込み判定 nuxt vue-lazyload


# 手順
1. nuxt.config.jsに追記
1. webpをimport(webpは作成済みとする）
2. data()でwebpをリターン
3. webpを使用可能かを判定するmethodsを追記
3. webpを使いたいところに追記

## nuxt.config.jsに追記します

```js:nuxt.config.js
build: {
    extend(config, {
      isClient
    }) {
      config
        .module
        .rules
        .push({
          test: /\.(webp)$/i,
          loaders: [
            'file-loader?hash=sha512&digest=hex&name=[hash].[ext]'
          ]
        })   
     }
  },
```

## webpをimportします

```js
import imgwebp from '../static/images/lp/elem/abtest/image.webp'
import imgpng from '../static/images/lp/elem/abtest/image.png'
```

## dataでreturnします

```js
data () { 
  return {
    imgwebp: imgwebp,
    imgpng: imgpng
  }
}
```

## methodにwebpを使えるか判定するメソッドを追記します [^4]

```js

async canUseWebP () {
  if (process.browser) {// because require window variable
      var elem = await window.document.createElement('canvas')
    if (elem.getContext && (await elem.getContext('2d'))) {
        // was able or not to get WebP representation
      return (
          (await elem.toDataURL('image/webp').indexOf('data:image/webp')) ===
        0
      )
    }
    // very old browser like IE 8, canvas not supported
    return false
  }
}
```

## 使いたいところに記載します

```vue

<img
  :src="canUseWebP() ? imgwebp : imgpng"
/>
// OR
<img v-if="canUseWebP()" src="../static/images/lp/elem/abtest/image.webp">
<img v-else src="../static/images/lp/elem/abtest/image.png">
```


<details><summary>webp＋lazyload</summary><div>

https://unpkg.com/vue-lazyload/vue-lazyload.js
cdnを使ってwebp＋lazyloadを実現できます(多分nodemoduleでもできる)

headerのscriptに追記します[^7]<-リンク[^8]<-スクショ

```
{
  src: "/js/vue-lazyload.js"
}
```

先ほどの記述を変更します

```vue:

<img
  v-lazy="this.canUseWebP() ? imgwebp : imgpng" // :srcをv-lazyに変更
/>
```


</div></details>

### 原因？
https://github.com/vuejs/vue-loader/pull/953
https://github.com/vuejs-templates/webpack/issues/396

# 以下参考

.webpを作るには[^5] | [^6]

webpを/staticに配置します[^2] | [^3]



[^1]: https://github.com/nuxt/nuxt.js/issues/1656#issuecomment-350671357
[^2]: https://qiita.com/gyarasu/items/171ff1569cc71c71ac28#static
[^3]: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/39f123c1-5399-40a1-91e7-a313da48dc76.png)
[^4]: https://stackoverflow.com/a/27232658/10677105
[^5]: https://qiita.com/itosho/items/50636b1b3ff7e83dc0f2
[^6]: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/9c55ff80-e764-901d-8603-c7032129098d.png)
[^7]: https://nuxtjs.org/faq/
[^8]: ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253014/c444bd93-e549-013b-1898-279b38923621.png)
goでmklを使ってみる

Goからmklを呼び出してみたいと思い試行錯誤したので記録しておきます。
環境はmacOS Mojaveです。

# TL;DR;

* Step1: mklをインストール
* Step2: `/opt/intel/mkl/bin/pkgconfig/*.pc` ファイルを修正
* Step3: 環境変数 `PKG_CONFIG_PATH` を設定
* Step4: cgoで呼び出すコードを書く
* Step5: `go build`


# 詳細

## Step1: mklをインストール

Intelのページからmklをダウンロード・インストールします。
ダウンロードにはユーザー登録が必要でした。

## Step2: `/opt/intel/mkl/bin/pkgconfig/*.pc` ファイルを修正

私がインストールした環境ではデフォルト値が間違っていました。
以下のように修正しました。

```diff

diff /opt/intel/mkl/bin/pkgconfig/mkl-static-lp64-iomp.pc /opt/intel/mkl/bin/pkgconfig/mkl-static-lp64-iomp.pc.back
14c14
< prefix=/opt/intel/compilers_and_libraries_2019.4.233/mac/mkl
---
> prefix=/opt/intel/compilers_and_libraries_2019.4.233/mac/mkl/bin/pkgconfig/mkl
```

## Step3: 環境変数 `PKG_CONFIG_PATH` を設定

cgoでは内部で `pkg-config` を実行するため設定ファイルの在りかを教えてあげる必要がありそうです。
私はGoLandを使っているので以下のようにビルド設定しました。

<img width="430" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106966/0cb2541a-ecf1-831e-85a7-ac2034891ca8.png">

## Step4: cgoで呼び出すコードを書く

cgoで呼び出しましょう。今回は練習としてblasに含まれているasumを呼び出しました。

### コード例

```golang

package main

import (
	// #cgo pkg-config: mkl-static-lp64-iomp
	// #include "mkl.h"
	"C"
	"fmt"
)

func main() {
	n := 10
	vec := make([]float32, n)
	for i := 0; i < n; i++ {
		vec[i] = float32(i) + 1.0
	}

	result := C.cblas_sasum((C.int)(n), (*C.float)(&vec[0]), 1)
	fmt.Printf("result=%v", result)
}
```

## Step5: `go build`

ビルドして実行できるようになっているはずです。

# 感想

package-configの設定が間違っていたところでハマりました。

# 参考文献

* https://software.intel.com/en-us/mkl-developer-reference-c-blas-routines
* https://golang.org/cmd/cgo/
* https://r9y9.github.io/blog/2014/03/22/cgo-tips/
Ubuntu Desktop 18.04LTS に CUDA 10.0 の環境を作る。

# 環境

- CPU: Intel i3
- GPU: GTX 780 Ti

画面表示は CPU の内臓グラフィックを使って、GPU は計算専用にしてみる。


# Nouveau ドライバの無効化
Ubuntu Desktop 18.04LTS はデフォルトで nouveau というドライバが使用されている。これがあると nvidia の GPU 用のドライバが入らないので無効化する。

- ブラックリストに入れる

/etc/modprobe.d/blacklist-nouveau.confを以下の内容で作成する。

```bash
blacklist nouveau
options nouveau modeset=0
```

- Initramfs(Ubuntuのイメージファイル)を再作成する。

```bash
sudo update-initramfs -u
```

- Ubuntu をリスタート

# build-essential をインストール

```
$ sudo apt update
$ sudo apt install build-essential
```


# CUDA Toolkit 10 をインストール

ドライバも同時にインストールされる。

`https://www.developer.nvidia.com/cuda-downloads`

ここで

`Linux -> x86_64 -> Ubuntu -> 18.04 -> runfile [local]`

~~を選択してダウンロード。~~

~~完了したらダウンロードしたフォルダで~~

を選択すると、

`$ wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run`

しろといってくるので、wget でダウンロードして

`sudo sh cuda_10.1.243_418.87.00_linux.run `

（ファイルの名前はちょと違うかもしれない）

後は画面の指示に従ってインストールすれば OK。


# 感想

前に Ubuntu 14.04 + CUDA 7.0 でやった時は Nouveau を外すと CPU の内臓グラフィックがうまくうごかなくてかなり苦労したのだが、今回は楽チン！

https://qiita.com/Satachito/items/2350f83fd3276d825f96

と思ってたら Ubuntu の System Update が走ったらドライバが消えてしまったようだ。CUDA Toolkit 10 をインストールしなおして対処。
mvコマンドでディレクトリの移動 mac編

Finderからドラッグ&ドロップで移動することも可能ですが､
コマンドから移動する方法｡


ホームディレクトリのRubyディレクトリの配下に"practice1"というディレクトリが存在するとします｡  ```~/Ruby/Git/practice1```

"practice1"ディレクトリを､```~/Ruby/HTML```の配下に移動させたいとき


```$mv 移動元 移動先```
```$mv ~/Ruby/Git/practice1 ~/Ruby/HTML```
これで移動できます｡

practice1の場所は､ ```~/Ruby/HTML/practice1``` になりました｡
連鎖行列積問題

# 連鎖行列積問題とは

- 行列連鎖積問題とは、行列を乗算するとき、使用される乗算の総数が最小になる乗算の順序を見つけることです。
- 行列連鎖積問題の解決策を見つけるために動的計画法を使用します。
-> [動的計画法とは](https://qiita.com/mk668a/items/54dc0d17d46947e2e656)
<br/>
<br/>

𝒍×𝒎行列𝑨と𝒎×𝒒行列𝑩が与えられる時、積𝑪は 𝒍×𝒒 行列です。
式から、𝑪の計算に使用される乗算数は、 𝑙×𝑚×𝑞 になります。

```math
(𝒍 × 𝒒)　　　(𝒍 × 𝒎)　　　(𝒎 × 𝒒)
```
```math
𝑪　　=　　𝑨　　×　　𝑩
```
```math
𝑪[𝑖, 𝑗] = ∑(k=1→m)𝑨[𝑖, 𝑘] × 𝑩[𝑘, 𝑗]

```

<br/>

ここで、次の行列の連鎖𝑴𝟏,𝑴𝟐,...𝑴𝒏(1 ≤ 𝑖 ≤ 𝑛 )の積𝑴を考えます。

```math
(𝑟1 ×𝑟2)　 (𝑟2 ×𝑟3)　 (𝑟3 ×𝑟4) 　... 　(𝑟𝑛−1 ×𝑟𝑛) 　(𝑟𝑛 ×𝑟𝑛+1)
```

```math
𝑴𝟏 　　　𝑴𝟐 　　　𝑴𝟑 　　　...　　　 𝑴𝒏−𝟏　　　　𝑴𝒏
```

𝒏行列が一緒に乗算されることとします。
各行列は𝑟𝑖行と𝑟(𝒊+1)列を持つので、𝑴𝒊×𝑴(𝒊+1)の乗算数は、𝑟𝑖×𝑟(𝑖+1)×𝑟(𝑖+2)になります。

```math
(𝑟𝑖 × 𝑟(𝑖+1))　(𝑟(𝑖+1) × 𝑟(𝑖+2))
```
```math
𝑴𝒊　　×　　𝑴(𝒊+1)
```

<br/>

積𝑴はさまざまな順序で計算できます。
例えば、𝑛 = 4のとき、 M1, M2, M3, M4 = A(𝟒×𝟐), B(𝟐×𝟑), C(𝟑×𝟏), D(𝟏×𝟐) とすると
1. (((A×B)×C)×D) 
2. (A×((B×C)×D)) 
3. ((A×B)×(C×D))
4. ((A×(B×C))×D)
5. (A×(B×(C×D)))
の5通りの順序があります。
1と5の乗算数を比較すると、
1. ((A×B)×C)×D)=4×1×2=8、 5. (A×(B×(C×D)))=4×2×2=16
このように、計算に順序によって計算回数が変わることが分かります。

## アルゴリズム
- 𝑴𝟏𝑴𝟐, 𝑴𝟐𝑴𝟑, ... の乗算数は 𝒓𝟏 × 𝒓𝟐 × 𝒓𝟑, 𝒓𝟐 × 𝒓𝟑 × 𝒓𝟒, ...のように一つしか存在しません。
- これらのコスト（乗算の回数）をテーブルに格納します。
- 連続した3つ(𝑀1𝑀2𝑀3 , 𝑀2𝑀3𝑀4 ,..., 𝑀𝑛−2𝑀𝑛−1𝑀𝑛)を乗算するための最良の方法を見つけます。


例）𝑀1𝑀2𝑀3の最小コストは、次のどちらかになります。
1. 𝑀1𝑀2𝑀3 = 𝑀1𝑀2のコスト + (𝒓𝟏×𝒓𝟑×𝒓𝟒)
2. 𝑀1𝑀2𝑀3 = 𝑀2𝑀3のコスト + (𝒓𝟏 ×𝒓𝟐 ×𝒓𝟒)
((𝑀1𝑀2)𝑀3)と(𝑀1(𝑀2𝑀3))のコストを求めるとき、(𝑀1𝑀2)と(𝑀2𝑀3)のコストを再計算するのではなく、テーブルから見つけるようにします。

- (𝑀1𝑀2𝑀3 , 𝑀2𝑀3𝑀4 ,..., 𝑀𝑛−2𝑀𝑛−1𝑀𝑛)の最小コストをテーブルに格納します。

この段階でのテーブル
<img width="422" alt="スクリーンショット 2019-08-04 18.15.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267721/32b7234a-3609-c24a-a6d1-365877e91e73.png">


- このように、 (𝑀𝑖𝑀𝑖+1 ...𝑀𝑖+𝑗)のコストを求めるときは、(𝑀𝑖𝑀𝑖+1...𝑀𝑘−1)と(𝑀𝑘...𝑀𝑖+𝑗)の最小コストをテーブルから見つけることでコスト（𝑟𝑖 × 𝑟𝑘 × 𝑟(𝑖+𝑗+1)）を求められます。
- (𝑀𝑖𝑀𝑖+1 ...𝑀𝑖+𝑗)の最小コストをテーブルに格納します。
- これを繰り返します。

## 擬似コード
```python

def MATRIX_CHAIN_ORDER(r):
    # r - 行列のリスト
    # m - コストのテーブル, s – 最適なコストの指標となるテーブル
    n = r.length - 1
    m = matrix(1...n, 1...n)
    s = matrix(1...n - 1, 2...n)
    for i = 1 to n:
        m[i, i] = 0
    for l = 2 to n:
        for i = 1 to n – l + 1:
            j = i + l–1
            m[i, j] = ∞
            for k = i to j – 1:
                q = m[i, k] + m[k + 1, j] + ri - 1rkrj
                if q < m[i, j]:
                    m[i, j] = q
                    s[i, j] = k
    return m, s


# 計算の順序を見る為に、最適な括弧を表示する
def PRINT_OPTIMAL_PARENS(s, i, j):
    # 与えられたsから、最適な括弧を出力する
    if i == j:
        print "A"(i)
    else:
        print "("
        PRINT_OPTIMAL_PARENS(s, i, s[i, j])
        PRINT_OPTIMAL_PARENS(s, s[i, j] + 1, j)
        print ")"
```

## 実装

以下参照
- [Matrix chain multiplication](https://rosettacode.org/wiki/Matrix_chain_multiplication)
動的計画法

# 動的計画法(Dynamic Programming)とは
- 動的計画法は、対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法です。

- 細かくアルゴリズムが定義されているわけではなく、下記2条件を満たすアルゴリズムの総称である。

1. **帰納的な関係の利用：** より小さな問題例の解や計算結果を帰納的な関係を利用してより大きな問題例を解くのに使用する。
2. **計算結果の記録：** 小さな問題例、計算結果から記録し、同じ計算を何度も行うことを避ける。帰納的な関係での参照を効率よく行うために、計算結果は整数、文字やその組みなどを見出しにして管理される。

[Wikipedia](https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E8%A8%88%E7%94%BB%E6%B3%95)より

## 考え方
1. いくつかの小さな問題の解が、大きな問題の解になるように再帰を設定する。
2. 小さば問題を一度解決し、解をテーブルに記録する。
3. そのテーブルから最初の問題の解を取り出す。

※ 問題を独立した部分問題に分割し、それらを再帰的に解く分割統治法とは異なる。

# 使用例
## フィボナッチ数列の再帰呼び出し
𝐹(𝑛) = 𝐹(𝑛−1) + 𝐹(𝑛−2)
n = 0 のとき 𝐹(0) = 0
n = 1 のとき 𝐹(1) = 1

### n番目のフィボナッチ数を再帰的に（トップダウンで）計算する
```
                  𝐹(𝑛)

    𝐹(𝑛 − 1)      +      𝐹(𝑛 − 2)

𝐹(𝑛−2) + 𝐹(𝑛−3)       𝐹(𝑛−3) + 𝐹(𝑛−4)
                . . .
```

## 連鎖行列積問題
連続した行列の積を計算するとき、計算回数を最小にする積の順序を求める
https://qiita.com/mk668a/items/bc5cc36f472487eaf0d8

## その他
- 二項係数の計算
- 最長共通部分列問題
- 推移閉包のためのワーシャルのアルゴリズム
- 最短経路に対するフロイド法
- 最適二分探索木の構築
- 離散最適化問題のいくつかの例：
 - 巡回セールスマン問題
 - ナップザック問題