OmniAICreator/Qiita-1.07M huggingface dataset:
お手軽 Django template 動作確認 (Django 1.11)

テンプレートファイルを作らず、文字列からテンプレートクラスを作って動作確認をしたい。

そんなときは、Django Shell を起動 (`python manage.py shell`) 下記のようにする。

```py
from django.template import engines

template_str = """Hello, {{ name }}!
{{ val|default:"I'm a default string." }}"""

django_engine = engines['django']
template = django_engine.from_string(template_str)

print(template.render(context={'name': 'world', 'val': None}))
```

結果

```
Hello, world!
I'm a default string.
```
参考: https://docs.djangoproject.com/en/1.11/topics/templates/
組み込み開発における最近の苦労ごと、常識（もしかしたら続くかも）

#マイコンの仕様書
最近のマイコンはARMベースが多いが、ARMについては英語の資料が主で未だにGICやキャッシュのプログラムについてはアセンブラで書かれており、理解が追い付いていない。
Cyclone V SoC FPGAの開発では基本的にLinuxでのサンプルしか公式からは無い為、リアルタイムOSでの周辺ドライバについての実装はかなり難解である。

#起動シーケンスの重要
電源が入ってからの起動シーケンスを仕様書から理解する事は重要です。
どの番地から起動するか、どこのアドレスにスタートアップアドレスが記載されているかの理解が重要です。
また、最近ではSPIやQSPIのROMからのブートもあり、この場合の起動シーケンスを理解する事も重要です。

#タイマー割り込みの重要性
機構制御プログラム、センサ制御プログラムはタイマー割り込みでの限りなく正確な周期でのサンプリングが重要です。

#ノイズ取りやA/D変換、D/A出力について
1. GPIOでのデジタルなセンサ情報ではノイズ取りの為に何回かの状態が連続して続いて初めて、その状態であると判断する必要がある。
2. A/D変換においては普通に平均値や移動平均など目的に応じてノイズ取りの処理が重要です。
3. D/A出力においては稀に電気ノイズによりD/A変換ICがリセットしてしまう為、周期的に同じ値、もしくは変化した値の出力が重要です。

#温度変化によるセンサ出力値
センサの出力値、入力値は温度によって変化するものです。
A/D変換でセンサのON/OFF監視を行う場合でも製品の仕様書に記載している範囲での変化をハード担当者に確認、または試作機で環境試験室でのデータ取りを行い、暫定的でも良いので閾値を決めておく必要がある。
これは開発ステージ毎に行う。　機構部やプリズムの金型化における変化がある事は常識でステージ毎での評価が重要です。

#全てにおいてバラつきはある。
機構部材、電子部材にはバラツキがある事は常識です。　このバラツキをソフトウェアで吸収することは常識です。
【Java】雑日付取得

抜粋……

#System.currentTimeMillis#
エポックから経過した時間をミリ秒で返す(long型)。
処理に何秒かかったかを計算したい時などに。

```Example.java
long start = System.currentTimeMillis();
// ここで何らかの時間のかかる処理
long end = System.currentTimeMillis();

System.out.println("処理にかかった時間は" + (end - start) + "msecです");
```

#Date.getTime#
ちゃんと書くとjava.util.Dateクラス。
newすることで時刻のフィールド(long型)を持つインスタンスになる。

```Example.java
// コンストラクタへの引数なしでインスタンス化
Date now = new Date();
System.out.println(now); // 現在時刻の表示

// これのlong値を取り出したいときはgetTime()メソッド
long lng = now.getTime();

// コンストラクタへの引数ありでインスタンス化
Date past = new Date(1316622225935L);
System.out.println(past); // 指定時刻の表示
```

`toString()`メソッドを使えば、読みづらいが文字列を取得できる。

```Example.java
Date d = new Date();
String str = d.toString()
System.out.println(str);
// Thu May 09 23:31:59 JST 2019 こういう見た目で出てくる。
```

#Calender クラスの諸々メソッド#
以下のフィールドを持つ。年月日時分秒のこと。すべて`public static final int`。

- `YEAR`
- `MONTH`
- `DAY_OF_MONTH`
- `HOUR`
- `MINUTE`
- `SECOND`

そして以下のメソッドを持つ。

- `getInstance()`
- `set()`：int型を6個渡すと、Calendarに時間をセットする。
- `get()`：`Carendar.YEAR`等を渡すと、Calendarにセットされているintを返す。
- `setTime`：Date型を渡すと、Calendarに時間をセットする。戻り値はvoid。
- `getTime()`：セットされている時間をDate型で返す。

```Example.java
import java.util.Calendar;
import java.util.Date;
public class Example{

    // 年月日時分秒を指定してDateインスタンスを生成する方法
    Calendar c = Calendar.getInstance();
    c.set(2019, 5, 13, 22, 37, 51); // 2019年5月13日22時37分51秒
    Date d = c.getTime();

    // set()メソッドはこういう書き方もできる。
    c.set(Calendar.YEAR, 2019);

    // Dateインスタンスから年月日時分秒を取得する方法
    Date d = new Date();
    Calendar c = Calendar.getInstance();
    c.setTime(d);

    int year = c.get(Calendar.YEAR);
    int month = c.get(Calendar.MONTH);
    int day = c.get(Calendar.DAY_OF_MONTH);
    int hour = c.get(Calendar.HOUR);
    int minute = c.get(Calendar.MINUTE);
    int second = c.get(Calendar.SECOND);
}
```
この他にも大量にメンバを持っているから使い方はまぁいっぱい……

#SimpledateFormatクラスの諸々メソッド#
書式文字列の形で日付を格納してくれる。

- y：年
- M：月
- d：日
- E：曜日
- a/p：午前/午後
- H：時(0〜23)
- K：時(0〜12)
- m：分
- s：秒

`yyyy/MM/dd HH:mm:ss`といった形で記述すると、
`2019/05/13 23:24:31`といった形で返ってくる。

`format()`メソッドと`parse()`メソッドでDate型とString型をやり取りする。

```Example.java
// Date型からString型の日付を取得
Date d = new Day();
SimmpleDateFormat f = new SimpleDateFormt("yyyy/MM/dd HH:mm:ss");
String s = f.format(d)

// String型からDate型を取得
Date d = f.format(2019/05/13 23:28:10); // 2019年5月13日23時28分10秒
```

#参考書籍#
[スッキリわかるJava入門第二版]
(https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1-%E6%B8%85%E5%96%AC/dp/484433638X)
Pp.532-540
pythonでslack apiのchannels.historyが使えない

# 問題
`pip install slackclients`をしてから、
slack apiのchannels.historyを以下のように叩いても

```history.py
import slack

slack_token = os.environ["SLACK_API_TOKEN"]
sc = SlackClient(slack_token)
res = sc.api_call("channels.history", json={
        "channel": "CEB1BL1MM",
    })
```

```
slack.errors.SlackApiError: The request to the Slack API failed.
The server responded with: {'ok': False, 'error': 'channel_not_found', 'warning': 'missing_charset', 'response_metadata': {'warnings': ['missing_charset']}}
```

とエラーが返ってきて、値が取得できない。
エラーメッセージを検索してもいまいち原因がわからないし、設定にはまちがいがないはず。
他のapiは正常に動く（例えばchat.post_messageとか）

# 原因（というか要因）
インストールしたslack clientが2.0.0以上だとできなかった。
しかたがないので
`pip uninstall slackclients`したのち
`pip install slackclient==1.3.0`と古いバージョンを入れなおしたら、正常に動いた

その際はapiの呼び方が変わるので注意

```history.py
response = sc.api_call(
        "channels.history",
        channel= "CEB1BL1MM"
    )
```

# まとめ
slack apiのv2自体が[二週間前(2019/05/14時点)にリリースされた](https://github.com/slackapi/python-slackclient/releases)もののため、バグがのこっていたということだろうか・・・
治ってほしい
【Swift】iOSアプリのUISwitchのUserDefaults設定方法？

#きっかけ
UISwitchのUserDefaultsの呼び出し方がイマイチわからなかったから
ここに記す

環境 Xcode 10.1、swift 4.2.1

#コード
やっぱりコード全文

```swift:
class ViewController: UIViewController {
    
    // UserDefaults のインスタンス
    let userDefaults = UserDefaults.standard

    @IBOutlet weak var switchName: UISwitch!
    @IBAction func switchFuncName(_ sender: UISwitch) {
        if(sender.isOn) {
            // オンの場合の処理
        } else {
            // オフの場合の処理
        }
        // ユーザーデフォルトにスイッチの状態をBool値でで渡す
        // if文でも使ってるけど sender.isOn でBool値をくだはります
        userDefaults.set(sender.isOn, forKey: "bool01")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // スイッチへのBool値の渡し方がハマった
        // アニメーションはお好きな設定をどうぞ
        // switchName = switchBool と書いて怒られまくった
        let switchBool = userDefaults.bool(forKey: "bool01")
        switchName.setOn(switchBool, animated: false)
    }
}
```

#最後に
数時間を費やしてここまでたどり着きました。
英語が読めないって辛いですね
結局自分へのメモ書きになってる投稿です
GoogleAppsScript（GAS）のスクリプトレット経由でオブジェクトを受け取る

# はじめに
GoogleAppsScript（GAS）では、doGet/doPost関数を定義することにより、簡易的なWebアプリを作ることもできます。
GASを使ったWebアプリでは、クライアントサーバー間の通信は `google.script.run` を使用します[^1]。

[^1]: https://developers.google.com/apps-script/guides/html/communication

`google.script.run` は実行が完了するまで少しタイムラグが発生します。また非同期処理となるため、複数回呼び出す必要があったときにネストが深くなってしまう問題（所謂コールバック地獄）もあります。

この問題を回避すべく、 `google.script.run` を使わずにスクリプトレット[^2]を使い、スクリプトタグ内に直接オブジェクトを吐き出す方法を紹介します。

[^2]: https://developers.google.com/apps-script/guides/html/templates

# スクリプトレット経由でオブジェクトを受け取る

## ソースコード
```javascript:main.gs
var data = {data: 'データ'};

function doGet() {
    return HtmlService.createTemplateFromFile('content').evaluate();
}

function getData() {
    return data;
}
```

```html:content.html
<!DOCTYPE html>
<html>

<head>
    <base target="_top">
</head>

<body>
    <script>
        window.onload = function () {
            // google.script.run使った方法
            google.script.run.withSuccessHandler(function (data) {
                console.log(data);
            }).getData();

            // 方法1
            var data = <?!= JSON.stringify(data); ?>;
            console.log(data);

            // 方法2
            data = JSON.parse('<?!= JSON.stringify(data).replace(/\\/g, "\\\\"); ?>');
            console.log(data);

            // 方法3
            data // <?!= "\n = " + JSON.stringify(data); ?>;
            console.log(data);
        }
    </script>
</body>

</html>
```

## 実行結果
chromeのコンソール画面。
それぞれの方法で問題なくデータが受け取れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126305/18a60962-857d-f1a8-3f5e-070d0403a442.png)

## 解説
- 方法1
  - `<?!= ~~ ?>` （スクリプトレット）内に書かれたコードはサーバー側で実行され、結果だけがクライアント側で表示されます。
  - `JSON.stringify` した結果を、そのままクライアント側のスクリプトの一部として評価しています。
- 方法2
  - VSCodeだと、スクリプトレットの部分が問題扱いされてしまうため、この部分をシングルクオートで囲み、さらに `JSON.parse` でオブジェクトに変換します。
  - そのままだとバックスラッシュが消えてしまうので、スクリプトレット内で置換し二倍に増やしておきます。
- 方法3
  - 方法1を何とかVSCodeでも問題扱いされないように書き換えたものです。苦肉の策。
  - スクリプトレット内で改行を入れてあるので、クライアント側では二行で表示され、ちゃんと代入されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126305/984d56e9-3ac5-576d-ae86-85e351208a8b.png)

# まとめ
`google.script.run` を使わずにスクリプトレット経由でオブジェクトを受け取る方法を紹介しました。
スクリプトレットの部分がVSCodeで問題扱いされるため、代わりの方法を考えてみましたが...ちょっと読みにくいかな...

もっとエレガントな解決方法があればぜひ教えてください。
AWS クラウドプラクティショナー に合格までの対策 (2019年5月時点の情報)

#はじめに
[AWS認定クラウドプラクティショナー](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)に合格したので、やってきたことをまとめました。
なるべく時間を掛けずに合格したかったので、仕事しながら資格取得を目指している方にはオススメかもしれません。
#筆者スペック
- 社内SE
- AWS未経験
- 社内の友人にマネジメントコンソール画面を見せてもらって、うらやましがっていた
- AWSアカウント作成 2019/4/01
- クラウド関連は興味あったが、知識が無いため手も足も出ず

#試験結果
- [合格] 801点 / 1000点

#対策
試験に向けての対策を書き残しておきます。

- 書籍で対策
![書籍](https://images-fe.ssl-images-amazon.com/images/I/51nA2BTUquL.jpg "book")
    - [AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/gp/product/B07QX45RXM/ref=ppx_yo_dt_b_d_asin_title_o02?ie=UTF8&psc=1)
    - １周斜め読み（２日間）、１周章末問題解きながら読み込み（2日間）、以下に記載の模擬テスト受講後に再度読み込み（１日間）

- AWS公式の情報で対策
    - [AWS　無料アカウント作成](https://aws.amazon.com/jp/register-flow/)
![account](https://d1.awsstatic.com/icons/jp/register-flow/Step1_Credentials_Collection_1200x690.6712166f4baaa9849f7f92b28c28618177bdfa39.png)
- 
    - [AWS Cloud Practitioner Essentials (Digital) (Japanese) (デジタル) (日本語版)](https://www.aws.training/learningobject/curriculum?id=17954)
    - 所要時間：7時間！！！　これが、なかなか時間がかかります。動画が長いため、見てるだけでも数時間かかります。
![training](https://cdn.aws.training/kiku/prod/Kiku_212/build/static/media/logo-color-dark.e2c9fdd2.svg)

- 実際にAWSマネジメントコンソールで操作しながら覚える。 所要時間：１〜２日間
    - 書籍の手順を見ながら、S3へのファイルアップロードやEC2のインスタンス起動などは、やった方がすぐに覚えます。
    - IAMのroot-PW削除や、MFA設定など、まずやることシリーズも以下を見ながらやった方が良いです。
    - [AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](https://qiita.com/tmknom/items/303db2d1d928db720888)
    - コマンドIFのAWS CLIも触れるようになっておいた方がイメージが持てて良い。
    - [Mac OS XでAWS EC2のLinuxインスタンスにssh接続する](https://qiita.com/tomoktan_cansell/items/5c83f090f958ca35b1d2)

#模擬試験
- 本試験の前日に受験。2000円かかるが安心のために、やっておいた方が良い。
- 結果、ほぼ満点。簡単過ぎると感じた。

#本試験
- ピアソンVueにて試験申し込み。
![Vue](https://wsr.pearsonvue.com/pvueImages/clients/aws/aws_logo.gif)

- で！模擬試験は簡単過ぎるから本試験は覚悟しろ！って他サイトにも書かれていたので、ビビっていたら、、、
- 本試験も呆気なく１５分で終了（全部で事前確認５分＋本試験９０分＋アンケート５分のはずが、たったの２５分くらいで終了）
- アンケートが終わると、すぐその場で合否が出ます。

#まとめ
- まとめると、難易度は　模擬試験 < 本試験 <<< 上記の書籍
- なので、上記、書籍で対策しておけば、問題なし！！！！
![書籍](https://images-fe.ssl-images-amazon.com/images/I/51nA2BTUquL.jpg "book")
   - [AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/gp/product/B07QX45RXM/ref=ppx_yo_dt_b_d_asin_title_o02?ie=UTF8&psc=1)

- さて、次はソリューションアーキテクト アソシエイトだー
ビットコインで利用されている暗号技術の役割

暗号術の基礎的な導入知識です。

<h1>ビットコインと暗号技術(Cryptography)</h1>
<p>日本では仮想通貨という言葉がよく使われますが、英語では暗号通貨(Crypto Currency)という言葉を使います。</p>
<p>その呼び名の通りビットコインは暗号技術(Cryptography)に基づいて設計された通貨であり、その技術の至る所に暗号技術が使われています。</p>

しかし、ビットコインは<b>「暗号化」</b>されているわけではありません。

それを理解するために、暗号技術の役割を確認していきましょう。

<h2>暗号技術の3つの役割</h2>
暗号技術には以下の大きな三つの役割があります。
<ul>
  <li>暗号化(encryption)</li>
  <li>電子署名(digital signature)</li>
  <li>デジタル指紋(digital fingerprint)</li>
</ul>

それぞれ説明していきます。

<h2>1.暗号化(encryption)</h2>
<p>暗号化は、データを特定の人にしか解読できない形式に変換し秘密にする技術です。</p>
<p>ウェブ上ではクレジットカード情報など秘匿性の高い情報は暗号化され送受信されます。</p>

<h2>2.電子署名(digital signature)</h2>
<p>電子署名は、ある秘密情報を明かさずに、秘密情報を知っていることを証明する技術です。</p>
<p>電子署名を用いることで、秘密鍵の情報を公開せず、秘密鍵を所有していること(=秘密鍵の所有者本人であること)を証明することができます。</p>

<h2>3.デジタル指紋(digital fingerprint)</h2>
<p>デジタル指紋はデータの完全性を保証します</p>
<p>デジタル指紋を用いることで、あるデータが不正なデータに書き換えられているかどうかを確認することができます。</p>
<p>ハッシュ化、チェックサムなどがこの目的で利用されます。</p>

<p>暗号通貨という言葉からは真っ先に「暗号化」のイメージが湧くかもしれませんが、実はビットコインで利用されている技術は、電子署名とデジタル指紋です</p>

<p>ビットコインのセキュリティーを守るために「暗号化」は必要なものではありません。</p>
Docker プライベートレジストリのWebUI調査 (1)

[Docker プライベートレジストリのWebUI調査 (2)](https://qiita.com/rururu_kenken/items/ff9b5b755d7c5735065e)
[Docker プライベートレジストリのWebUI調査 (3)](https://qiita.com/rururu_kenken/items/996076daaea11e657995)
[Docker プライベートレジストリのWebUI調査 (4)](https://qiita.com/rururu_kenken/items/fb7e6758a3fa60a83314)
[Docker プライベートレジストリのWebUI調査 (5)](https://qiita.com/rururu_kenken/items/b5b6b754774d76b08c53)
[Docker プライベートレジストリのWebUI調査 (6)](https://qiita.com/rururu_kenken/items/530ef38fe0342d6e2bfa)

#hyper/docker-registry-web

[Dockerイメージ](https://hub.docker.com/r/hyper/docker-registry-web/)
[WebUIから Docker Registry 2.0上のimageをDELETE](https://qiita.com/tukiyo3/items/0d3814b78f555e78d0f5)

**OS**
　Amazon Linux release 2 (Karoo)
**Docker**
　Docker version 18.06.1-ce, build e68fc7a215d7133c34aa18e3b72b4a21fd0c6136

**■前提条件**

docker network作成、プライベートレジストリのコンテナ作成、イメージ登録済

```
docker network create registry-ui-net

docker run -d \
  -p 5000:5000 \
  --net registry-ui-net \
  --name registry-srv \
  registry:latest

docker pull ubuntu:16.04
docker tag ubuntu:16.04 localhost:5000/ubuntu:16.04
docker push localhost:5000/ubuntu:16.04
```

コンテナ起動

```
docker run -d \
  -p 8080:8080 \
  --net registry-ui-net \
  --name registry-web \
  -e REGISTRY_URL=http://registry-srv:5000/v2 \
  -e REGISTRY_NAME=localhost:5000 \
  -e REGISTRY_READONLY=false \
  hyper/docker-registry-web:latest
```
![image3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/f3a9b972-0aaa-f210-d84d-2d2f1770fbee.png)
![image2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/2c3251dd-b726-e8b3-d13f-09495661deea.png)
![image1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208807/a0ee879a-6588-fff2-282f-fb6ef06c39bb.png)
大学の課題のためにクソコードを作った話

大学の課題で「400字以上の英文を適当に選び、その文字数をカウントし、その文字を打つのに適したキーボード配列を考案せよ」という課題が出た。手作業でカウントするのがめんどくさかったのでこういうものを作った。

```python:count.py
import sys

word = sys.stdin.read()
print("aは " + str(word.count('a')) + " 回")
print("bは " + str(word.count('b')) + " 回")
print("cは " + str(word.count('c')) + " 回")
print("dは " + str(word.count('d')) + " 回")
print("eは " + str(word.count('e')) + " 回")
print("fは " + str(word.count('f')) + " 回")
print("gは " + str(word.count('g')) + " 回")
print("hは " + str(word.count('h')) + " 回")
print("iは " + str(word.count('i')) + " 回")
print("jは " + str(word.count('j')) + " 回")
print("kは " + str(word.count('k')) + " 回")
print("lは " + str(word.count('l')) + " 回")
print("mは " + str(word.count('m')) + " 回")
print("nは " + str(word.count('n')) + " 回")
print("oは " + str(word.count('o')) + " 回")
print("pは " + str(word.count('p')) + " 回")
print("qは " + str(word.count('q')) + " 回")
print("rは " + str(word.count('e')) + " 回")
print("sは " + str(word.count('s')) + " 回")
print("tは " + str(word.count('t')) + " 回")
print("uは " + str(word.count('u')) + " 回")
print("vは " + str(word.count('v')) + " 回")
print("wは " + str(word.count('w')) + " 回")
print("xは " + str(word.count('x')) + " 回")
print("yは " + str(word.count('y')) + " 回")
print("zは " + str(word.count('z')) + " 回")
print("合計" + str(len(word)) + "文字")
```

これで実行したのがこれ(使用文字列は https://www.japantimes.co.jp/news/2019/05/13/national/politics-diplomacy/xi-visit-japan-state-guest-put-off-next-year/#.XNmg-KRUuHs)

```
aは 140 回
bは 18 回
cは 37 回
dは 38 回
eは 171 回
fは 17 回
gは 29 回
hは 61 回
iは 141 回
jは 3 回
kは 10 回
lは 44 回
mは 29 回
nは 111 回
oは 91 回
pは 30 回
qは 2 回
rは 171 回
sは 103 回
tは 140 回
uは 39 回
vは 22 回
wは 14 回
xは 2 回
yは 20 回
zは 2 回
合計1804文字
```

今からキーボード配列について復習します
対象ファイルをBase64でエンコード（デコード）するWindowsバッチ

自分用のメモ
コマンドラインから実行が面倒だったので、作ってみた。
Windowsバッチ書いた経験あまりないので、無駄はあるかもしれない。


##Base64エンコード

```base64_encode.bat
@echo off

echo 変換するファイルをこのバッチと同じ場所においてください

set /P INPFILE="変換するファイル名を入れてくれよな（例 test.png） ： "

set /P OUTFILE="出力先ファイル名を入れてくれよな（拡張子はいりません。テキストで出力されます） : "

set outfile=%OUTFILE%".txt"

if exist %INPFILE% (

 certutil -f -encode %INPFILE% %outfile% 

) else (

 echo 変換元ファイルがみつからないよな

)
pause
```
##使い方
上記で作成したバッチファイルと同じ場所に変換したいファイルを配置してバッチファイル実行。

変換元ファイル名を入力（拡張子含む）
変換後ファイル名を入力。なければ作られるので何でもよい。
こちらは拡張子不要。テキストで作られる。

##Base64デコード
ちなみにデコードする場合はencodeがdecodeに変わるだけで同じ使い方ができる。

```base64_decode.bat
～省略～

certutil -f -decode %INPFILE% %OUTFILE%

～省略～ 
```
Multiple Linear Regression(重回帰)を使ったモデルトレーニング-Breast Cancer Wisconsin (Diagnostic) Data Set-

#現在書きかけです
現在、内容が正しくない状態です。
目的変数がカテゴリデータになってしまっているので、連続変数の予測の内容に修正予定です。

#やりたいこと
重回帰を使ってモデルをトレーニングする。

####重回帰:multiple linear regression
目的変数に対応する複数の説明変数を用いて、未知のデータを予測する。
例えば、駅から徒歩何分、公園までの距離、スーパーまでの距離、都心からの距離などを使って土地の価格を予測したい場合などは、土地の価格が目的変数、その他のものが説明変数。

##環境

Python 3.6.8
scikit-learn 0.21.x

##コード
```
'''
Created on 2019/05/13

@author: tatsunidas
'''

#重回帰のモデルインポート
from sklearn.linear_model import LinearRegression

#訓練データとテストデータを分ける
from sklearn.model_selection import train_test_split

#データの読み込み
from sklearn.datasets import load_breast_cancer
dataset = load_breast_cancer()
#データの詳細
# print(dataset.DESCR)
# 各変数の相関
import pandas as pd
# df = pd.DataFrame(data=dataset.data, columns=dataset.feature_names)
# print(df.corr())

#目的変数(y)と説明変数(X)を設定
X = dataset.data
y = dataset.target#[0 = 'malignant' 1 = 'benign']

#訓練データとテストデータに分ける
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.5,random_state=0)

#重回帰の初期化
model = LinearRegression()
#学習
model.fit(X_train, y_train)

#決定係数を表示
print('決定係数[train] %.3f ' %model.score(X_train, y_train))
print('決定係数[test] %.3f ' %model.score(X_test, y_test))

#回帰係数と切片
print('回帰係数(30の説明変数それぞれ) \n{}'.format(pd.Series(model.coef_,index=dataset.feature_names)))
print('切片 %.3f' %model.intercept_)
```

##結果
<font color="blue">
決定係数[train] 0.803 
決定係数[test] 0.690 
回帰係数(30の説明変数それぞれ) 
mean radius                 0.341929
mean texture               -0.008644
mean perimeter             -0.036507
mean area                  -0.000275
mean smoothness             1.415929
mean compactness            4.480886
mean concavity             -1.726748
mean concave points        -1.238104
mean symmetry              -2.159746
mean fractal dimension      9.975549
radius error               -0.455605
texture error              -0.052298
perimeter error             0.091585
area error                 -0.001560
smoothness error           -7.886853
compactness error          -3.008553
concavity error             0.989225
concave points error        3.732295
symmetry error            -10.175903
fractal dimension error    34.423064
worst radius               -0.230093
worst texture               0.001301
worst perimeter            -0.002159
worst area                  0.001369
worst smoothness           -1.981650
worst compactness           0.527437
worst concavity            -0.165751
worst concave points       -3.146116
worst symmetry              1.130800
worst fractal dimension    -9.315617
dtype: float64
切片 2.783
</font>

##モチベーション
教師あり学習の初歩としてコーディングして学ぶべきと思ったので書いてみました。

##参考図書や参考URL
* 東京大学のデータサイエンティスト育成講座
* https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
ChromeDriver を Chromeのバージョンに合わせてインストール


## Chromeのバージョンを確認する

`設定 -> Chromeについて` から確認できる。 僕の場合 v74

![スクリーンショット 2019-05-14 1.19.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212928/ded4ecb2-fbcc-2f4d-741d-b535d2d9e7c7.png)
 

## サイトから zip ファイルを落としてくる

[こちら](http://chromedriver.chromium.org/downloads)から。自分のバージョンと OS に一致するものを落としてくる。

## 解凍、リンク

```shell
mv ~/Downloads/chromedriver_[各自].zip ~/Applications/chromedriver_[各自].zip
cd ~/Applications
unzip chromedriver_[各自].zip
#以下のように表示されたら成功
Archive:  chromedriver_mac64.zip
  inflating: chromedriver
# リンク       
ln -s chromedriver /usr/local/bin/chromedriver
```

以上。
AndroidQ対応 通信系の不具合

#ACCESS_FINE_LOCATIONのパミッションがないとTelephony, WiFi, Bluetoothのライブラリ(*一部)が動かなくなった

上記のライブラリ全てではないが、
以下のライブラリもしくは一部メソッドに関しては、動かなくなった。

* TelephonyManager
    * getCellLocation()
    * getAllCellInfo()
    * requestNetworkScan()
    * requestCellInfoUpdate()
    * getAvailableNetworks()
    * getServiceStateForSubscriber
    * getServiceState()
* TelephonyScanManager
    * requestNetworkScan()
* TelephonyScanManager.NetworkScanCallback
    * onResults()
* PhoneStateListener
    * onCellLocationChanged()
    * onCellInfoChanged()
    * onServiceStateChanged()
* WifiManager
    * startScan()
    * getScanResults()
    * getConnectionInfo()
    * getConfiguredNetworks()
* WifiAwareManager
* WifiP2pManager
* WifiRttManager
* BluetoothAdapter
    * startDiscovery()
    * startLeScan()
    * LeScanCallback()

[ref:: Android Developer](https://developer.android.com/preview/privacy/camera-connectivity#top_of_page)
とあるRailsエンジニアが再就職活動を共有したがっているようだ 2019-05-13 on Twitter

# とあるRailsエンジニアが再就職活動を共有したがっているようだ 2019-05-12 on Twitter
 [*](https://twitter.com/YumaInaura/status/1127592486514429953")
<https://github.com/YumaInaura/YumaInaura/issues/1793>
# とあるRailsエンジニアが再就職活動を共有したがっているようだ 2019-05-12 on Twitter [ポエム] on @Qiita
 [*](https://twitter.com/YumaInaura/status/1127607031047774209")
<https://qiita.com/YumaInaura/items/9bd71ca98912dbab92b3>
# dockerを始めるとインフラ知識全般の巨大な世界に出くわすよね。

 [*](https://twitter.com/YumaInaura/status/1127720800281190400")
[@a_aaachan7](https://twitter.com/a_aaachan7/)

>PHPの勉強で初めてつまずいたのはDockerの環境構築でした。
>奥が深いし難しい。
>しかも1つの事を調べはじめると、あれも分かんない、これも分かんない、
>でどんどん調べてしまって、そもそも何調べてたんだっけ？ってなる。。。
>悪い癖😭
>1日が28時間くらいになればいいのに😂もっと時間ほしい！
# プログラミング学習で挫折するのはあなたが悪いんじゃなくてプログラムの方が悪い。

 [*](https://twitter.com/YumaInaura/status/1127748647079120896")

# 「エンジニアリングが分からない人がエージェントをやっていることに不安を覚える」
 [*](https://twitter.com/YumaInaura/status/1127768457674551296")
[@kaede75101560](https://twitter.com/kaede75101560/)

>ゆるぼ
>
>呼びかけてどれだけ集まるかわからないのですが、、、
>
>エンジニア兼エージェントやってみたい人bosyu！！！！
> https://t.co/w9XBoSYGfe #bosyu #エンジニア
>
>資格はこちらで用意します←
# django モデルの null / blank オプションは両方 True もしくは 両方 False のどちらかで良さげ on @Qiita
 [*](https://twitter.com/YumaInaura/status/1127794891289874434")
<https://qiita.com/YumaInaura/items/c07a1a06eecdd0fdab16>
# プログラミングで大事なのは
 [*](https://twitter.com/YumaInaura/status/1127795609778380800")
![image](https://pbs.twimg.com/media/D6a8ICVUcAIKH3k.jpg)

# プログラマ的原因切り分けの結果なのかどうか？ Mac Book でキーボードを叩くとディスプレイがチラつく問題の原因がついに分かったかもしれ... on @Qiita
 [*](https://twitter.com/YumaInaura/status/1127832753356005376")
<https://qiita.com/YumaInaura/items/08cd0f09fa43a4249248>
# プログラミングで思うように書ける喜びに何度でも癒されたいじゃないか僕らって。

 [*](https://twitter.com/YumaInaura/status/1127861401467465728")

# 自宅の窓が後2倍広かったらきっと3倍素敵にプログラミングできるのに。

 [*](https://twitter.com/YumaInaura/status/1127862292442488833")

# 文字コードなんて人類に理解できるはずがない。


Python2で文字列を処理する際の心掛け - Qiita
 [*](https://twitter.com/YumaInaura/status/1127865958033268736")
<https://qiita.com/FGtatsuro/items/cf178bc44ce7b068d233>
# python2と3で文字列の扱いが違うかもしれなくてビックリしてて咳き込んだ。

 [*](https://twitter.com/YumaInaura/status/1127867929821794304")

# みんなどんな姿勢でプログラミングしてるんだろう。

 [*](https://twitter.com/YumaInaura/status/1127876894710386688")
<https://qiita.com/YumaInaura/items/2cab7c3dd9d6700e4df9>



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1808








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
法律事務所の事務員がWebサービスを作るはめになった話

これはたしかにWebサービスの話だけど、
素人がWebサービスを作る話だ。

ここは技術の話を書くところだと聞いた。

今、たしかに私はWebサービスを運営しているけれど、技術の話に触れるのは遥か先のことだろうし、できればそんな機会が訪れないことを祈っている。

その程度のヤツが書く話だと思っておいてもらいたい。

法律事務所に勤めることになった。
家から近いところで事務員募集を探していたら法律事務所に行き当たった。深い意味はない。

初日に「ここがあなたのデスクよ」と言われた場所の隣には、複合機が置いてあった。
まだあったのか複合機。
驚きを隠しながら説明を聞いていると、複合機から音がした。

ぴーひょろろろーるーるるる

ん？
この音はもしや、、、FAX？
いや、まさかFAXなんてもうなくなったでしょ。平成も終わるというのに。
いやいや、マジか。FAXってフロッピーとかと一緒に絶滅したと思ってたわ。

事務所内には大量の書類があり、シュレッダーに紙が溢れてした。
2穴ファイルが所狭しと並び、机にはメモ用紙がたくさん置いてある。
本棚は書籍と、たぶん分類するのを飽きられたのだろう書類が横積みになっている。
久しぶりにこんなにたくさんの紙を見た。

ネイティブスマホ世代、メモはパソコンで取るような私がこんな世界で生きていけるのだろうか。
スマホでメモとか取ったら怒られる気がする。
Windows Terminal (Preview版)を起動する右クリックメニューを作る

この記事は，過去に書いた[エクスプローラで開いているフォルダをVSCodeで開く右クリックメニューを作る
](https://qiita.com/WGG_SH/items/efa3a83ca1b9add1cc01)の流用です

Windows Terminalの正式リリースで普通に実装されそうな機能なので(issueまだ追えてないです)，今導入してもあまり意味はないかもしれません

## 動作環境
* Windows 10 Home: バージョン-1903 OSビルド-18362.86 (Insider Preview)
* Windows Terminal (Preview版)

## 手順
1. レジストリエディタ(`regedit.exe`)を起動
1. `HKEY_CLASSES_ROOT\Directory\Background\shell` 下にキー作成(`WindowsTerminal`)
1. キーの値を右クリック時に表示する名前に(今回は`Open Windows Terminal here`)
1. 作成したキーの直下に名称`command`でキーを作成
1. キーの値を"C:\Users\<UserName>\AppData\Local\Microsoft\WindowsApps\wt.exe"に設定 (<UserName>は適宜自分のユーザー名に置き換える)
     `wt.exe`がWindows Terminalの起動エイリアスです
1. 完成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/6d80c7d1-5196-2090-e01b-83609c21150e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/096b3283-64f4-a68d-4eab-2c5965414cee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/0b63b62d-037f-67a1-c749-0ee12040d6ef.png)

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170422/6eba8e30-3783-8bfb-b65e-c38ab498b555.png)

## 問題点
* 何故か`%LOCALAPPDATA%`を使うとエラーが起きて起動できなかった(パスの展開はできたっぽいので権限周りで弾かれてる?)
* Windows Terminalの`profiles.json`で`startingDirectory`にパスを設定しているとそちらが優先されるので注意
* おとなしく正式リリース待ってれば良い気もする
Google Cloud Platform (GCP)の基礎知識を学ぶ

# はじめに
この記事は、[Google Cloud Platform (GCP)](https://cloud.google.com/) を利用しようとしている人が
GCPの基礎知識を学ぶことを目的としています。

私はプライベートでGCPとIBM Cloudを少し触ったくらいの経験しかありませんが、
今後は業務でGCPを使用することになりそうなので、まずは基礎知識を学ぼうと思います。

# GCP概要
![gcp_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406684/f7c78b7d-282c-1be8-9e17-1c514d6e7922.jpeg)
Googleがクラウド（インターネットなどのネットワーク経由でユーザーにサービスを提供する形態）
で提供するサービス群の総称です。
IaaS（インフラをネット上のサービスとして提供）、
PaaS（アプリを実行するためのプラットフォームをサービスとして提供）
を有していて、Googleが保有するインフラやサービスをオンデマンド（使った分だけの支払い）
で利用することができます。
基本的な構成要素が初めから各種サービスとして用意されているため、
それらを使用してすばやく開発を行うことができます。
また、サーバの起動が早いのでゲームやWEBサービスに適していて、
機械学習やビッグデータ解析といった分野に強みがあります。

# GCPが主にできること
**・コンピュート**
　　Google Compute Engine
　　　Googleのデータセンターとネットワークで運用する仮想マシン(VM)を提供します。
　　　IaaSに分類されますね。

　　Google APP Engine
　　　開発したウェブアプリケーション（PHP・Python・Java・Go言語）を
　　　Googleのインフラストラクチャー上で実行、バージョン管理することができます。
　　　PaaSに分類されますね。

**・ストレージとデータベース**
　　Google Cloud Storage
　　　クラウドベースのストレージサービス。GCPの「MySQL」および「PostgreSQL」が使用できます。
　　　フルマネージドサービス（リレーショナルデータベースの設定、メンテナンス、運用、管理など）
　　　を提供します。

**・ビッグデータ**
　　Big Query
　　　フルマネージドかつ低コストのビッグデータ分析サービス。
　　　大規模なデータセットに対して高速なSQLライクのクエリーを高速に取り出すことができます。

**・機械学習**
　　Cloud Machine Learning
　　　クラウド上で機械学習（データから反復的に学習し、そこに潜むパターンを見つける）
　　　を行うクラウド機械学習サービス。
　　　例えば、Googleの音声検索、Google Nowの提案機能、Googleフォトの画像分類機能、Google翻訳、
　　　メールアプリInboxの返信自動生成機能などがクラウド機械学習によって開発されているそうです。
　　　これらのGoogleのサービスを支えるクラウド機械学習機能が利用できます。

# GCP以外の主要クラウド概要
・[**Amazon Web Services（AWS）**](https://aws.amazon.com/jp/?nc2=h_lg)
　　世界シェア一位のクラウドサービスです。
　　サービス系アプリやビッグデータ分析、ストレージなど、幅広い利用に適しています。
　　オープンソースのソフトウェアをフルマネージドな状態で提供してくれるサービスが多いです。
　　長く豊富な実績があるので情報収集がしやすく、信頼性と堅牢性もあります。

・[**Microsoft Azure（Azure）**](https://azure.microsoft.com/ja-jp/)
　　Microsoft製品との連携と、Azure Marketplaceが活用できます。
　　Azure Marketplaceとは、
　　Azure仮想マシン上でのサービス構築に役立つオンラインマーケットプレイスです。
　　ソフトウェアベンダー各社が提供する仮想マシンイメージ、仮想マシン拡張機能、
　　アプリケーション、API、Machine Learningサービス、データサービスなどが提供されています。
　　また、リージョン（データセンターが置かれているエリア）が他のどのクラウドよりも多いです。

・[**IBM Cloud**](https://www.ibm.com/jp-ja/cloud)
　　エンタープライズ（大規模向け）のクラウドサービスです。
　　Watsonと呼ばれるAIの提供や機械学習に関するAPIを多く取り扱っています。
　　SaaS、PaaS、IaaS、といった提供形態から、
　　パブリック/プライベート/ハイブリッドといったサーバ提供形態まで幅広く提供しています。
　　また、IBMは企業向けにオンプレによる基幹系システムを多く構築してきた実績があるので、
　　基幹系システムのクラウド移行に強みがあります。

# GCP導入事例
・[株式会社ディー・エヌ・エー様](https://cloudplatform-jp.googleblog.com/2019/03/DeNA-Advanced-Solutions-Lab-GCP.html)
・[株式会社メルカリ様](https://cloudplatform-jp.googleblog.com/2018/01/Google-Cloud-Platform-Mercari-kubernetes.html)

# おわりに
GCPの基礎知識を学ぶことができました。
余談ですが、クラウドを技術選定するときは、
以下がざっくりと目安になりそうですのでメモっときます。

・とりあえずクラウドというものを試す → AWSかGCP
・機械学習やAI分野で開発する → GCPかIBM
・ゲームやWEBサービスを開発する → GCP
・基幹系システムをクラウドにする → IBM
・Microsoft製品を多用している → Azure
・可能な限り遅延を避けたい → Azure

もちろん利用環境によって最適なクラウドは変わってきますが、
どれもアカウント登録して無料トライアルができるので、とりあえず触ってみるのが一番ですね。
Blender：キーフレーム登録（Material）

# はじめに
Materialのキーフレーム登録の方法を調べても乗ってなかったので備忘録的に。
（Python歴2ヶ月ないぐらい）

# 本文
最初から。このへんは色んなとこに乗ってた
Material生成→カラーセットまで

```python:main.py
    mat = bpy.data.materials.new('Mat')
    obj.data.materials.append(mat) #add the material to the object
    bpy.context.object.active_material.diffuse_color = (0, 0, 0.5) #change color
```

なんかいい感じにキーフレーム登録させる。

```python:main.py
    bpy.context.object.active_material.keyframe_insert(data_path='diffuse_color')
```

できる。
今回の場合はディフューズを登録してる。
他のやつでやりたい場合は、`data_path='diffuse_color'`の部分を変える。

data_pathは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383695/36838935-fd1e-565c-6caf-34509f2517af.png)
これでコピれる。

# おわり
備忘録的なそれなので頑張って読んで。
シェルスクリプトでbooleanを使う

シェルスクリプトでも`true`と`false`が使えることを知ったのでメモ。

それぞれexit statusを０と1で返す性質があります。

```bash
#!/bin/bash

true
echo $? # = 0

false
echo $? # = 1
```

この性質を使うと下記のような制御が可能です。

```bash
#!/bin/bash

bool=true
$bool && echo "true" # = true

bool=false
# falseの時に"false"を出力
$bool || echo "false" # = false
echo $? # = 0
```

trueについては文字列が入ってたり未定義の場合と同じ挙動であまり使いみちが思いつかないかったですが、
falseの場合だけ処理させるケースを`||`を使って1行で表現できるのは便利でした。
CKADに合格するためにやったこと

# はじめに
ゴールデンウィークにCertificated Kubernetes Application Developer（CKAD）を受験して合格したので、そのときのことを書きます。

# 受験勉強

## やったこと
1. [Kubernetes完全ガイド](https://www.amazon.co.jp/dp/B07HFS7TDT/)を読む。
    - 個人的にはCKAD受験とか関係なくk8s使うなら是非読んでおくべきオススメ本だと思います。
1. [CKADをさっさと合格するためのTips - Qiita](https://qiita.com/kentakozuka/items/c1a30f1545752264dfe6)を読む。
    - ここに書いてあることは概ね正しかったです。
1. https://github.com/dgkanatsios/CKAD-exercises をやる。
    - 私は２週やりました。

## 理解しておくとよいこと
- Pod, Deployment, Service, ConfigMap Secret, CronJobの作り方
    - 試験時間がたりないので簡単なリソースは `kubectl run` や `kubectl create` で作れるようになっておきましょう
    - ConfigMapやSecretをPodの環境変数やボリュームとして指定できるようになっておきましょう
- 既存リソースを変更する方法
    - `kubectl edit`などで修正します
- 障害が起きているリソースを見つけて修正する方法
    - `kubectl get`や`kubectl describe`で何が起きているか把握して`kubectl edit`などで修正します
- `kubectl rollout`の使い方（ロールバックや履歴の確認など）
- Liveness Probe, Readiness Proveの設定方法
- NetworkPolicyの設定方法

# 試験申し込み
- 方法１：[Certified Kubernetes Application Developer (CKAD-JP) - Linux Foundation - Training](https://training.linuxfoundation.org/certified-kubernetes-application-developer-ckad-jp/)
	- 直接LinuxFoundationに申し込む方法
	- $300、クレカ払い
- 方法２：[CKA/CKAD 試験 - クリエーションライン株式会社](https://www.creationline.com/cka-ckad-exam)
	- クリエーションライン経由で申し込む方法
	- 5万円、請求書払い

為替次第ですが概ね方法１の方がお得です。

# 試験当日

オンライン試験です。試験官はWebカメラ・マイク・画面共有を使ってリモートからこちらを監視します。

## 受験に必要なもの
- パスポート
- マイク・Webカメラ
- １人になれる環境

## 試験内容
- 難易度はそんなに高くありませんが、時間があまり足りません（2時間19問）。「〇〇なリソースを作れ」みたいな問題をちゃっちゃかこなせる必要があります。
- 操作は全てLinuxのターミナルで行います。CLI操作に慣れてない人は辛いかもしれません。エディタはemacsは使えました。
- 問題によってnamespaceやcontextが違うので、切り替えながら操作します。

## その他
- 試験中、トイレに離席することは可能でした。

# 結果
１回目は62点で不合格、２回目は92点で合格でした。合格ラインは66点です。

１回の支払いで２回まで受験できるので、早めに１回目を受けて、試験問題の雰囲気を把握すると良いと思います。
【Unity】VRゴーグル用に１眼と２眼に切り替える方法（スマホとVRゴーグル切り替え）

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1
⭐️Android8.1


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">💖【VR】Androidアプリ💖リリース<br>😍ピヨくまちゃん💫シューティングVRゲームリリースしました。😊VRゴーグルであそびます。🍩<br>💎とっても💎キレイで🤩楽しいです👍<br>↓↓Google Play 無料Free<a href="https://t.co/DmkV8ltaCD">https://t.co/DmkV8ltaCD</a><a href="https://twitter.com/hashtag/Piyo_Kuma_chan_Shooting_VR_game?src=hash&amp;ref_src=twsrc%5Etfw">#Piyo_Kuma_chan_Shooting_VR_game</a> <a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://twitter.com/hashtag/Unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#Unity3d</a> <a href="https://t.co/fFVADdAiDV">pic.twitter.com/fFVADdAiDV</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1127938600501334016?ref_src=twsrc%5Etfw">May 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


起動時は、２眼表示
![No1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/9d112cda-82c1-daf4-f1a5-c0f2a07b33c7.png)

最初の画面は１眼表示
![No2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/76d21efc-a0f2-7252-3fe1-45df9048a7b5.png)

VRゴーグル用の２眼表示
![No3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/8c6d6527-1a10-117f-d7df-ac5743fc843c.png)

![No4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/7e076d99-1797-b138-8da8-8a9ba9cf910a.png)

![No5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/98fac158-80d3-1be6-c68e-64e35c5adac1.png)

![No6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/a86e9f53-8bd3-3df9-4a5e-f33160376d1d.png)

最後の画面は１眼表示
![No7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/1abf2f1d-ec1c-629a-e4ad-c2d4356f0884.png)



まず、VR用の設定にする
【Unity】VR用に出力する方法（VRゴーグルで遊ぶ２眼ビューア）
https://qiita.com/nonkapibara/items/05741f8a87026751aab0


対象のシーンにAwakeで、XRSettings.enabledを設定するする


```c#
using UnityEngine;
using UnityEngine.XR;

public class SceneTopScript : MonoBehaviour
{
    private void Awake()
    {
        // VR未設定（１眼）にする
        XRSettings.enabled = false;
    }
}
```

```c#
using UnityEngine;
using UnityEngine.XR;

public class SceneLastScript : MonoBehaviour
{
    private void Awake()
    {
        // VR未設定（２眼）にする
        XRSettings.enabled = true;
    }
}
```
<br>
↓↓Google Play 無料Free
VR ピヨくまちゃんのシューティング〜VR Shooting Piyo-Kuma-Chan
[![vrpiyokumachan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/7407a010-942e-dfa8-879a-11d014353f53.png)](https://play.google.com/store/apps/details?id=com.non.VRPiyokumaChanShooting)

<br>
<br>
<br>
手軽にEthereumスマートコントラクトを叩くならEtherscanが良い件

## 手軽にEthereumスマートコントラクトを叩くならEtherscanが良い件
Ropstenや本番ネットワークにデプロイしたスマートコントラクトの関数を呼び出したい時があると思います。

得意にトランザクションを必要とする場合(view,pureでない関数を呼び出しするとき)はコードで呼び出すのは面倒です。

その時にはEtherscanのWriteタブから関数を呼び出すのがおすすめです。Metamaskログインしておくことでトランザクションを送ることができます。

ぜひ参考にして下さい。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
DBの汎用テーブルほど闇の深いものはない

# 汎用テーブルとは
誰が思いついたのか生まれてしまった、業の深いテーブルのことである

``` 汎用・・・［名］(スル)いろいろの方面に広く用いること。「同一規格の部品を汎用する」 ```

[From コトバンク](https://kotobank.jp/word/%E6%B1%8E%E7%94%A8-607406)

つまり、 __いろんなデータを格納できるテーブル__ のこと、または __その設計__


## 具体的例

こんなテーブル定義見たことないでしょうか？？

| # | カラム名 | データ型 | 備考 | 
| :-: | :-: | :-: | :-: |
| 1 🔓 | KEY | VARCHAR | キー値（検索用に使用）|
| 2 | NAME | VARCHAR | キーとその値に対応する名称 |
| 3 | VAL | VARCHAR | キーに対応する値 |
| 4 | DEL_FLG | CAHR(1) | 論理削除フラグ |
| 5 | INSERT_DTM | DATETIME | システム挿入日付 |
| 6 | UPDATE_DTM | DATETIME | システム更新日付 |

## 汎用って聞こえはいいけどさ・・・

### 汎用テーブルのデメリット
- 個別に切り出していないため、以下のデメリットがある
    - 該当のデータが __どういった型であるのが望ましいのか、テーブル定義だけでは分からない__
        - 仕様把握を困難にする
        - 思わぬエラーの原因となる
    - したがって以下の対応をしようとするケースが多い
        - 資料で頑張ってまとめて管理しようとする<BR>（※大概の場合、資料の更新が等閑になり、最終的に資料が消え去る）
        - View/Functionを使用して単一のテーブルかのように振舞わせる<BR>（※最初から個別テーブル化したほうが労力は少ないはず）

上記のデメリットが重なると、そのシステムの達人的な人に仕様知識が集中し、いずれ崩壊する
__仕様が個人の知識に依存するような設計は全力で回避したほうがいい__

(・・・自分がその会社に縛り付けられたいのであれば、話は別)

### 汎用テーブルのメリット
- 各種テーブルのキー値の説明用のテーブルとしては◎
    - というか、この用途に至っては __キー値の説明用のテーブル__に限って使用しているので厳密には汎用ではない
    - (私にはメリットが思いつきませんでした・・・誰か思いつく方はコメントください・・・ORZ)

## まとめ

- テーブルは、 __保持するデータの中身を明確に定義づけることが大切！！__
    - テーブル名、カラム名が、__データを表す名称になっていること__
    - データ型がデータに即していて、 __用途に適していること__ ≒ __それ以外の用途に使用できない限定された型を使用すること__
        - ex.)
            - 名前なら文字列型
            - 電話番号なら数値型
            - 誕生日なら日付型など
[Rails] rescue_fromに関する留意点

## はじめに
業務で`rescue_from`メソッドの挙動について調べる機会があったので、記事にまとめておこうと思います。
もし内容に間違い等ありましたらご指摘いただけると幸いです。

## rescue_fromはスタック形式で積まれる
`rescue_from`を複数記述した場合、**下から上の順に動作します**。下記の場合、`rescue_from FugaError`->`rescue_from HogeError`の順に動作していきます。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  rescue_from HogeError, with: :hoge_error_handler  # 2番目に動作
  rescue_from FugaError, with: :fuga_error_handler  # 1番目に動作
```

## rescue_fromは発生した例外クラスの継承元まで評価する

例えば下記のような場合、

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  rescue_from HogeError, with: :hoge_error_handler
  rescue_from FugaError, with: :fuga_error_handler
# 以下省略
```

```ruby:hoge_error.rb
class HogeError < FugaError  # HogeErrorクラス は FugaErrorクラス を継承している
# 以下省略
```


```ruby:hoge.rb
class Hoge
  def raise_hoge_error
    raise HogeError
  end
end
```

`raise_hoge_error`メソッドでraiseした`HogeError`は、**`FugaError`クラスを継承しているため`rescue_from FugaError`で引っかかり、`fuga_error_handler`が実行されることになります**。

このため、例えば**`rescue_from StandardError`などを下の方に書いてしまうと、`StandardError`クラスを継承した例外クラスは全て`rescue_from StandardError`で引っかかることになります**。
下記の場合、raiseした`FugaError`は`rescue_from FugaError`ではなく`rescue_from StandardError`で引っかかることになります。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  rescue_from HogeError, with: :hoge_error_handler
  rescue_from FugaError, with: :fuga_error_handler
  rescue_from StandardError, with: :standard_error_handler  # raise_fuga_errorメソッドでraiseしたFugaErrorはここで引っかかる
# 以下省略
```

```ruby:fuga_error.rb
class FugaError < StandardError  # FugaErrorクラス は StandardErrorクラス を継承している
# 以下省略
```


```ruby:fuga.rb
class Fuga
  def raise_fuga_error
    raise FugaError
  end
end
```

このようなケースを危惧してか、[Railsガイド](https://railsguides.jp/action_controller_overview.html#rescue-from)には以下のように書かれています。

> rescue_fromにExceptionやStandardErrorを指定すると、Railsでの正しい例外ハンドリングが阻害されて深刻な副作用が生じる可能性があります。よほどの理由がない限り、この指定はおすすめできません。

## 例外クラスをラップしている場合、外側の例外から順にrescue_fromのスタックを一巡していく

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  rescue_from FooError, with: :foo_error_handler
  rescue_from HogeError, with: :hoge_error_handler
  rescue_from FugaError, with: :fuga_error_handler
# 以下省略
```

```ruby:foo.rb
class Foo
  def error_wrap
    raise FooError  # FooErrorクラス は StandardErrorクラス を継承しているものとする
  rescue
    raise BarError  # FooErrorクラス を BarErrorクラス でラップ
  end
end
```

`error_wrap`メソッドが実行されたとき、まずは`BarError`クラスが`rescue_from`のスタックを一巡します。上記の場合はどの`rescue_from`にも引っかからないため、続けてラップの内側の`FooError`クラスが`rescue_from`のスタックを一巡し、最終的に`rescue_from FooError`で引っかかることになります。


## 参考文献

- [Railsガイド](https://railsguides.jp/action_controller_overview.html#rescue-from)
- [rescue_fromメソッド（GitHub）](https://github.com/rails/rails/blob/97321956e6c2d2bae1bf6f76fce5bfb909ab58b0/activesupport/lib/active_support/rescuable.rb#L17-L72)
書き取りをしてみる

# 真似て書いてみる
- その昔買った厚切りジェイソンさんの本に「書き取りはとてもいい勉強方法だ」書いてあった。本曰くジェイソンさんは新聞や雑誌のに書かれている漢字を毎日書き取りしているそう
- それを思い出したので購入した本に書かれているプログラムを書き取って動かしてみようと思って
- twitterでもやはり同じような事が沢山書いてあってともかく真似して動かす事が大事とあったので真似してやってみる

# そして書き取り
- やってみるもエラー（涙
- ガチャガチャやってみるもエラー。１つのファイル消しても同じエラーを吐き続けているので、各ファイルで書いている形式がそもそも違う。一度ハマってしまうとなかなか抜けれない性分だし、遅いので続きはまた明日。きっと簡単なところでハマっている気がする。
- エラー文言では「インデントです、でもtypeが見つかりました」と表示されている。そして数字は行なり場所なりだがどこか理解出来ていない（汗
- ここに書くのは恥ずかしいけどまあ何でも勉強です（言い訳

```
$ go run main.go
main.go:6:2: 
type/sake.go:1:9: expected 'IDENT', found 'type'
type/sake.go:2:2: expected ';', found 'EOF'
```
爆速でWebアプリを開発する

# TL;DR

bottleでローカルteapotサーバ立てます。

# 超軽量フレームワーク

Webアプリ開発って最初に覚えることが結構たくさんあって挫折しちゃう人が多いみたいです。
でも何か動くものをWebに公開するだけなら超簡単なんです。そう、この[bottle](https://bottlepy.org/)があればね!

# bottle

bottleはpython製のWebアプリケーションフレームワークです。
[Flask](http://flask.pocoo.org/)がマイクロフレームワークを名乗っていますが、それより小さくファイル1つ置くだけで使えてしまいます。
動かすだけなら何も覚えることはありません。一瞬です。

# 作るもの


ステータスコード 418を返すサーバを作ります。
Googleによる同様の実装は[こちら](https://www.google.com/teapot)

418については[こちら](https://ja.wikipedia.org/wiki/Hyper_Text_Coffee_Pot_Control_Protocol)にあるようにジョークコードですが、HTTPでは[Unusedとして予約される](https://qiita.com/flano_yuki/items/ea251ac6b53bc54677d2)そうなので、むやみに使うと刺されます。場をわきまえて使いましょう。

# 開発環境

この環境で作業します。

```console

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.14.2
BuildVersion:   18C54
$ python --version
Python 3.7.2
```

# 導入

`pip install`が推奨なのですが、せっかくなのでファイルをダウンロードして利用してみましょう。
macにwgetが入っていなかったため、curlでbottle.pyのファイルをダウンロードしてきます。

```console
$ mkdir teapot
$ cd teapot
$ curl -L http://bottlepy.org/bottle.py > bottle.py
```

1ファイルとはいえ4000行以上あります。

```console
$ wc -l bottle.py 
    4418 bottle.py
```

# 開発

ドキュメントのこのあたりを見つつ次のように書きます。読めば何となく分かると思います。
https://bottlepy.org/docs/0.12/tutorial.html?highlight=httpresponse#the-response-object

```python:teapot.py

from bottle import route, run, HTTPResponse

@route('/')
def teapod():
    return HTTPResponse(status=418)
    
run(host='0.0.0.0', port=80)
```

フォルダ構造も超シンプルです

```console
$ tree
.
├── bottle.py
└── teapot.py

0 directories, 2 files
```

# 起動

開発用にローカルでサーバを起動します。

```
$ python teapot.py 
Bottle v0.13-dev server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:80/
Hit Ctrl-C to quit.
```

ブラウザで`localhost`にアクセスします。
`Listening on http://0.0.0.0:80/`と出ますが、[ここ](https://qiita.com/amuyikam/items/0063df223aed40193ba9)で見たように、0.0.0.0で待ち受けているわけではありません。

<img width="456" alt="スクリーンショット 2019-05-13 午後11.22.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266939/e71b5b13-1dc7-1864-703b-a524cf2e2572.png">

できました。
Chromeとしてはエラーとして扱っていますが、よく見ると`HTTP ERROR 418`が返ってきていることがわかります。
(Chromeは４００番代なのでエラー画面を出しているようで、これは完全に正しいです。)

念の為curlでも確認してみます。

```console
$ curl -v http://localhost/
*   Trying ::1...
* TCP_NODELAY set
* Connection failed
* connect to ::1 port 80 failed: Connection refused
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.54.0
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 418 I'm a teapot
< Date: Mon, 13 May 2019 14:26:14 GMT
< Server: WSGIServer/0.2 CPython/3.7.2
< Content-Length: 0
< Content-Type: text/html; charset=UTF-8
< 
* Closing connection 0
```

curlは`418 I'm a teapot`と表示してくれますね。

# まとめ

pythonのbottleフレームワークを使い爆速でWebアプリケーションを作成しました。
Hello, World!でもいいのですが、見飽きたと思うのでI'm a teapotを実装しました。
特に引っかかる要素が無いため私はCICDを試す時なんかに利用しています。

# 参考

https://bottlepy.org/
Realmのマイグレーションをやってみた

Realmを使う時、カラムを追加したり、変更すると、少し大変です。
ローカルで開発しているのであれば、アンインストールして、実行すれば問題ないですが、仮にリリースしていたら、Modelを変えるだけだと更新した際に起動できなくなります。

リリースしている場合に必要な実装を残したいと思います。

####①モデルの変更

```kotlin:Task.kt
open class Task: RealmObject() {
    var id : Long = 0
    var deleteflg: Int = 0
}
```
例えばですが、今回の場合は上記のdeleteflgを変えるので、下記のように変更します。

```kotlin:Task.kt
open class Task: RealmObject() {
    var id : Long = 0
    var isDelete: Int = 0
}
```

このように、カラム名を変更したり、追加したりを行います。

####②マイグレーションの変更

変更する前までは、特に必要がないですが、カラムを変更するとマイグレーションが必要になります。新しいスキーマであることを定義しないといけません。

```kotlin:Migration.kt
class Migration : RealmMigration {

    override  fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
        val realmSchema = realm.schema
        var oldVersion = oldVersion

        if (oldVersion == 0L) {
            val userSchema = realmSchema.get("Task")
            userSchema!!.renameField("deleteFlg", "isDelete")
            oldVersion++
        }
    }
}
```
`oldVersion`が今までのスキーマのバージョンで今回+1します。
スキーマを取得して、`userSchema!!.renameField("deleteFlg", "isDelete")`でカラム名を変更しています。
そのほかには`addField`や`removeField`などがあるので、必要に応じて実装します。

####③マイグレーションの変更
Applicationを継承したクラスの頭で初期化しておくとどこからも使えて便利なので、そうしていたので、マイグレーションの設定を読み込むように追加しました。

```TaskSchedulerApplication.kt
class TaskSchedulerApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        Realm.init(this)
        val builder = RealmConfiguration.Builder()
        builder.schemaVersion(1L).migration(Migration())
        val config = builder.build()
        Realm.setDefaultConfiguration(config)
    }
}
```

Migrationクラスの設定を呼び出し、新しいバージョンスキーマでRealmを使うように設定します。
新しい定義や構成をRealmに設定します。

これらの手順でアプリを更新しても新しいModelを読み取ってくれるので、アプリは起動できます。
ただ、データの中身を変えないといけない場合は、さらに大変だと思います。

####参照
[RealmObjectSchema]
(https://realm.io/docs/java/latest/api/io/realm/RealmObjectSchema.html)
[公式ドキュメント]
(https://realm.io/jp/docs/java/latest/#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)
[RealmConfiguration]
(https://realm.io/docs/java/latest/api/io/realm/RealmConfiguration.html)
sourcetreeでcloneした時に warning: templates not found /usr/local/git/share/git-core/templates　というエラーが出る

どうやら、データ容量が重たいとこのエラーが出るみたい。
対応方法
pcがmacの場合は
sourcetreeを使わずに
terminalから行う
cd /Users/hoge/
git clone –-depth 1 http://hogehoge.git
その後、sourcetreeと連携する
git fetch --depth 5
単一命令列・複数データ(SIMD: シムディー)の並列

# はじめに

このテキストではSIMD(シムディー)について解説します。

# GPUの動作原理

最近のCG，3Dグラフィックというのは数学的な演算を非常に多く行うものなので，CPUにも勝る計算能力を備えたGPUが一般的に出回るようになってきました。3Dグラフィックでは，整数や浮動小数点の演算を非常に数多く並行して行う必要があることから，最近のGPUにはCPU以上の並列処理機能が備わっています。

![GPU.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/afd4c426-0921-8ea6-bc3a-c769df69d688.jpeg)

上図↑は少し古いグラフィックボードですが，これらの中にGPUが入っています。

# SIMD と MIMD

一般的なGPUの並列プログラミングのモデルは，**SIMD** (シムディー)と呼ばれるものです。SIMD は Single Instruction, Multiple Data の略で，直訳すると，単一の命令列で複数のデータを処理するということになります。GPUは同じような計算を異なるオブジェクトに対して行うことが多いので，SIMDが適合します。

ちなみにSIMDを「シムディー」と読むのは米国流だそうです。日本の多くの方は「シムド」と読むことがあるそうです。「シムド」だと外国に行くと通じないので，注意してくださいね。(私はもともと「シムディー」と呼んでいて「シムド」と読むことを知りませんでした)


これに対し一般的なCPUの並列プログラミングのモデルは，MIMD(ミムディー)と呼ばれるものです。MIMD は Multiple Instruction, Multiple Data の略で，直訳すると複数の命令列で複数のデータを処理するということになります。CPUは異なるタスクを並行動作させて雑多な処理をすることが多いことから，SIMDは適合せずにMIMDで処理する必要があります。

SIMDとMIMDでは異なる進化を遂げてきました。SIMDは単純な処理ができるプロセッサを100以上とか1000以上といった超並列で動作させるという方向で進化してきています。最新のGPU，たとえばNVIDIAのGeForce GTX 1080 Tiでは3000を超えるコア数からなる並列度を備えています。Intel や AMD の x86 互換のCPUのコア数がせいぜい数10くらいのレベルに留まっていることを考えるとすさまじいです。

そのかわり，MIMDであるCPUでは1つのコアでの高度な処理能力を発展させてきました。特に違いが顕著なのは，CPUでは高度な分岐予測と投機的実行の機能を備えることにより，複雑な条件分岐と複雑なデータ構造からなるプログラムを高速に実行できるように進化してきました。このようなプログラムをGPUに与えても性能を発揮しません。

# SIMD や GPU が向いている計算

**GPUが向いているのは，単純な構造で均質で大量にあるデータを，ほぼ同じような命令列で処理する場合です。**多くの画像処理があてはまります。また最近の流行りですと**ディープラーニング**や**ビットコインのマイニング**もあてはまります。このようにグラフィック処理だけでなく一般的な目的でGPUを活用することを**GPGPU** (General Purpose computing on Graphics Processing Units)と呼びます。

まったくの余談ですが，中古のグラフィックボードの価格は，仮想通貨の価格に連動することが知られていますが，それはGPUでマイニングするのが一般的だからですね。なので，ゲーム用途やVR/AR用途，画像処理用途，人工知能用途などでGPUを利用する人は，仮想通貨の価格が下がったら，中古で良質のグラフィックボードが市場に出回っていないか，チェックするといいですよ。

# CPU の SIMD 命令

PCで用いられるIntelやAMDのx86互換CPUや，携帯電話などで使われる ARM などのCPUには，最近は SIMD 命令というのが搭載されています。CPU の SIMD 命令では，いくつかのレジスタを同時に演算することができます。

たとえば x86CPU の SSE 命令では128ビットの浮動小数点数レジスタ，AVX 命令では256ビットの整数/浮動小数点数レジスタ，AVX-512命令では512ビットの整数/浮動小数点数レジスタを搭載しています。

単精度浮動小数点数(C言語のfloat)でしたら1個あたり32ビットですので，AVX命令で256/32=8個，AVX-512命令で512/32=16個の浮動小数点数を同時に計算できます。

倍精度浮動小数点数(C言語のdouble)でしたら1個あたり64ビットですので，AVX命令で256/64=4個，AVX-512命令で512/64=8個の浮動小数点数を同時に計算できます。

# SIMD のコード生成

SIMDのコード生成の考え方を示します。

* ループしたい回数を `n` とします。
* `m`個の演算を同時に実行できるSIMD命令を活用することを考えます。
* それとは別に1個の演算を同時に実行できる同様の命令もあるものとします。

1. `n`を`m`で割った時の商 `l` と余り `r` を求めます。
2. SIMD命令で`m`個分演算をします。
3. `l`を1減らして非0ならば2へジャンプします。
4. (以上で `l` * `m` 回の演算を実行できました。残りは `r`個の演算です)
5. `r`が0ならば**終了**します。
6. 1個分演算をします。
7. `r`を1減らして5へジャンプします。

これにより，`l + r` 回の演算で実行することができます。すなわち C言語で書くと，`(n / m) + (n % m)` 回の演算で実行することができるというわけです。

# SIMD を活用した研究例

筆者の研究室で研究・開発している Hastega (ヘイスガ) は，SIMDによる高速実行を行う処理系です。

原理としては，Elixir (エリクサー)という並列プログラミング言語で書いたコードを，CPUのSIMD命令やGPUで実行できるコードに変換します。

興味があったら下記のポスターを参照してください。

[<img width="981" alt="Hastega.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55223/c79ea479-7762-f1ce-5669-bce1c7761a5e.png">
](zeam-vm.github.io/papers/SWEST_Hastega.pdf)
ロストテクロノジー：SRAMのつなぎ方

# SRAMのつなぎ方
最近、40代のエンジニアと話をしたときに「16ビットバス幅のSRAMに1バイトだけデータを書き込むのはどうやって動いているんでしょう」という質問を受けました。えっ？！とビックリしたのですが、確かに最近は非同期のSRAMをCPUバスに直接つなぐことはなかなか無いので、知らない人がいても不思議じゃないです。インターネットを検索してもズバリな情報が見つからなかったこともあって、ロストテクロノジーを残しておこうと、この記事を作りました。
# ハードウェア接続
以下の図のように接続します。
<img width="669" alt="スクリーンショット 2019-05-13 22.42.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/8875e79b-e238-f273-a7ad-23d048423d1e.png">
この時、nBE0とnBE1はそれぞれアドレス0とアドレス1の位置につなぎます。
リトルエンディアンの場合は以下です。
<img width="541" alt="スクリーンショット 2019-05-13 22.45.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/046f7171-2e0f-4350-f156-c2fad827d488.png">
D15-D8にnBE1を、D7-D0にnBE0をつなぎます。
# タイミングチャート
アドレス0に1バイト書き込むときには信号線は以下のようなタイミングチャートになります。
<img width="402" alt="スクリーンショット 2019-05-13 22.48.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/60bd8a9a-871a-9a81-fb92-455f958a3e72.png">
この時R/nWの信号の立ち上がりエッジでデータがSRAMに書き込まれます。
アドレス1に1バイト書き込むときには信号線は以下のようなタイミングチャートになります。
<img width="402" alt="スクリーンショット 2019-05-13 22.49.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/40afab84-3b24-d0dd-4a62-29f2caada9fb.png">
アドレス0と1に同時に2バイト書き込むときには以下のようなタイミングチャートになります。
<img width="402" alt="スクリーンショット 2019-05-13 22.50.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/8c483425-1a51-8726-ccf5-653d7013c62c.png">
# 補足
一般的には16ビットバス幅のSRAMはアドレス0と1につなぎますが、全てのCPUがそうとは限りません。データシートをよく読んで判断してください。