OmniAICreator/Qiita-1.07M huggingface dataset:
OTTO 環境セットアップ(m-block3)


## プログラミング環境設定(m-block3)
ここでは、小学生向けを想定してscratchベースのプログラミング環境の設定方法を記載します。

http://www.mblock.cc/mblock-software/

mblock 3 for PCの欄から使用しているOSのパッケージをダウンロードし、インストールします。

![mblock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/7d30a657-462d-4435-ed85-b7ecb008213c.png)

インストールが完了したらm-blockを起動してください。
起動後、下の画面のようにメニューの"Extensions"から"Manage Extensions"を選択します。

![mblock_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/8e77d795-b3db-33cb-54d9-3c4ea9f34bf8.png)

表示されるダイアログの"Search"欄に"ottodiy"とタイプします。
関係する項目に絞り込みされますので、"ottodiy"のdownloadボタンを押します

ダウンロード完了すれば画面のようのDownloadedとなりますので
右上の×ボタンを押してダイアログを閉じます。

![mblock_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/f8802a05-3039-ecc4-add2-c8fc2e07ff73.png)

Extensionが正しくインストールされているかを確認します。
下記画面のようにScriptsタブからRobotsを選択し、ottodiyの項目を確認ください。
（Arduinoの項目が先に出るので、下方にスクロールが必要です）

![mblock_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/0c49245c-4fc6-1fbc-753b-f9a8c5e2b1e1.png)


次に、ottodiy extensionに対応したサンプルプログラムをダウンロードします。
下記githubサイトから、"Clone or download"をクリックし、"Download ZIP"をクリックしてファイル一式をダウンロードします。ダウンロードできたらZIPファイルを解凍してください。

https://github.com/stembotvn/OttoDIY_mBlock_Extension

![git_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/3d404989-5fc7-d33a-5f32-59bab919806e.png)

サンプルプログラムの呼び出してみます。

mblockを開き、Fileメニューから"Load Project"をクリックしてください。

![mblock_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/68d0fafe-3838-f533-9c0c-2fd1e020fb61.png)

解凍したZIPファイルのフォルダ内の"Example"-"Demo"フォルダ内にあるファイルのいずれかを選択ください。

![mblock_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/e7f96c2c-9100-0f5d-d063-9802f84a5ea6.png)

下画面では"First Moving"をロードした例です。

![mblock_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/a921d5e6-4567-4dd4-df0f-a2f6ae25bda2.png)

arduinoにダウンロードして動作を確認します。

上では説明してませんでしたが、上の画面は「arduinoモード」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/51439715-decd-f815-ab6a-09fb47364d17.png)

制御ボードを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/cf7aed0d-a98d-2b8d-772d-b9a097dfea42.png)

arduinoをPCに接続し、メニューの”接続”の”シリアルポート”を指定します。
（私のPCではCOM5になってますが、最後の数字はPCによって異なります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/8ec75636-1981-f3c6-75f0-b31b585beb88.png)

開発環境右側にある”Arduinoにアップロード”を押し、コンパイルしてArduinoに転送します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438528/259de5ac-3796-5e2d-0fce-252eb6bcf15d.png)

以上
畑に農作物を植えてみたけど、忙しくて毎日水やりにいけないのに日照り続きでどうしたものかと悩んでいたら、自動で散水する方法を思いついて試してみたという話

# はじめに

タイトルのとおり、基本的に畑の観察も含めて足を運ぶようにしているのですが、どうしても行くことができない日があって、そういう時にかぎってむちゃくちゃ日差しが強かったりするので、これを「どげんかせんといかん」ということで、試行錯誤した結果をまとめてみます。

# 用意したもの

- [工進 家庭用バスポンプ KP-104](https://amzn.to/2OCW2zQ)  
  10L/分(3mホース使用)
- [Arduino Nano V3.0互換ボード](https://amzn.to/2Kd8UZs)
- [1チャンネルリレーモジュール](https://amzn.to/2Kfg4fE)
- [多結晶ソーラーパネル 12Vシステム系](https://amzn.to/2KshNNF)
- [12V 12Ah 高性能シールドバッテリー](https://amzn.to/2KpHaiV)
- [DC-DC降圧パワーモジュール 12V/5V](https://amzn.to/339Lcos)

# 回路図

![20190804065840888.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/2e919370-7d5a-2dea-1def-f6d2cbbeefc3.png)

# 組み立て

1. バスポンプの電源ケーブルを切断し、12Vを直接供給
1. バスポンプの電源のプラス側にリレーモジュールを入れる
1. バッテリーの出力電圧をDC-DC変換により5Vとし、Arduinoの電源とする
1. リレーのON/OFF信号をArduinoのDIO端子に接続
1. ソーラーパネルの出力をバッテリーに接続

# プログラム

12時間おきにリレーを数分間ONさせ、散水するようArduinoのプログラムを作成

※後日公開

# 外観

![IMG_8403.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/c20028f7-55ce-ad7e-19dd-1ec77439792b.jpeg)
下の箱の中にバッテリーとArduinoなどが入っています。
![IMG_8404.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/cc0b4aa2-7175-54ea-a3c7-7187bc6a5f11.jpeg)
ポンプを水の中に入れておきます。
![IMG_8406.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/65c9928b-9529-8e31-45a5-c8d11d07f8a2.jpeg)
ホースにあけた穴から水がちろちろと出ているのがわかりますでしょうか...(^_^;)

ということで、完成。

Arduinoのプログラムは現在修正中なので、後日公開いたします。

# その後

現在も試行錯誤を繰り返しているところですが、とりあえずホースの穴をキリではなく、ドリルの刃で開けてみたらかなり水量が増したので写真を撮ってみました。
![IMG_8504.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/07aa8a96-ac7d-98d0-33cf-a944ea7cd573.jpeg)
今度は出過ぎていて、散水の時間を短くしなくてはならなくなりました(^_^;)
AWS EC2, Cloud9 composer create-project でメモリ足りない問題の対策

AWS EC2 や Cloud9 で `composer create-project` コマンドでLaravelをインストールする際メモリ不足で失敗する場合があります。

## 環境

- OS: CentOS7.6

Linuxであれば同様の手順でSwapを設定できると思います。

## エラー

```
$ composer create-project --prefer-dist "laravel/laravel=5.8.*" .
The following exception is caused by a lack of memory or swap, or not having swap configured
Check https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors for details
```

## Swapがないことの確認

Swapを確認する方法は3つあります。(他にもあったら教えてください)

### free コマンド

```
$ free -m
              total        used        free      shared  buff/cache   available
Mem:            989          71         633          12         284         718
Swap:             0           0           0
```

Swap が 0 になっていること

### /proc/meminfo

```
$ cat /proc/meminfo
(一部省略)
MemTotal:        1013196 kB
MemFree:          648760 kB
MemAvailable:     735956 kB
Buffers:               0 kB
Cached:           208092 kB
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
```

SwapTotal と SwapFree が 0 になっていること

### /proc/swaps

```
$ cat /proc/swaps
Filename                                Type            Size    Used    Priority
```

Swapが結果に出てこないこと

## swapファイル領域を確保

```
$ sudo /bin/dd if=/dev/zero of=/swap bs=1M count=1024

1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 12.9409 秒、 83.0 MB/秒
```

```
$ ls -lh /swap
-rw-r--r--. 1 root root 1.0G  8月  4 05:52 /swap
```

1G分の領域が確保されました。

## パーミッションを変更

```
$ sudo chmod 600 /swap
$ ls -lh /swap
-rw-------. 1 root root 1.0G  8月  4 05:52 /swap
```

rootユーザーのみ読み書きできるようにします。

## swapの作成（ファイルシステムをswapにする）

```
$ sudo mkswap /swap

スワップ空間バージョン1を設定します、サイズ = 1048572 KiB
ラベルはありません, UUID=8bf61268-456b-4bd4-a9ac-9adf03415098
```

## swapの有効化

```
$ sudo swapon /swap
```

## Swapがあることの確認

```
$ free -m
              total        used        free      shared  buff/cache   available
Mem:            989          68          80          12         840         718
Swap:          1023           0        1023
```

### /proc/meminfo

```
$ cat /proc/meminfo | grep Swap
(一部省略)
MemTotal:        1013196 kB
MemFree:           82220 kB
MemAvailable:     735656 kB
Buffers:               0 kB
Cached:           768612 kB
SwapCached:            0 kB
SwapTotal:       1048572 kB
SwapFree:        1048572 kB
```

### /proc/swaps

```
$ cat /proc/swaps
Filename                                Type            Size    Used    Priority
/swap                                   file            1048572 0       -2
```

## Laravelのインストールを再実行する

```
$ composer create-project --prefer-dist "laravel/laravel=5.8.*" .
```

問題なくインストールできればokです。

## Swap領域の無効化

```
$ sudo swapoff /swap
$ sudo rm /swap
```

Swap領域を残しておくとそれだけディスク容量を使ってしまうので、今度はディスク足りない問題が発生するかもしれません。(デフォルト8GBだったと思うので)

今回はSwap領域を無効化、Swapファイルの削除をしておきましょう。

## 補足

### swapの永続化

システムを再起動した場合、swap領域が無効化されてしまいます。
永続化するためには、viなどで `/etc/fstab` を開き下記の1行を追記する必要があります。

```
/swap swap swap defaults 0 0
```

今回は `composer create-project` コマンド実行時にエラーとなったので、インストールできたらswapは不要になるので永続化の必要ありません。

## 参考記事

- [CentOS7 スワップファイル（swap file）の作成方法](https://qiita.com/wmx/items/631222f2e5a9e7a59fb4)
「Docker」＆「Kubernetes」について簡単に解説(学習まとめ)

本文は、筆者個人が学習のまとめとして作成したものですが、一人でも、だれかのお役に立てればと思います。
筆者は、某IT会社にて研修を受けている身で、技術的に(非常に)拙いため、内容に漏れや誤りがあるかもしれませんので、
より詳細で正確な情報については、読者の方々ご自身がネット上の各ソースについてあたっていただければと思います。
それでは、少しの間お付き合いください。


##「Docker」とは？
Dockerとは、ホストマシンにコンテナと呼ばれる仮想のアプリケーション実行環境を用意してくれるソフトウェアです。

Dockerは、VMwareなどの従来の類似製品に比べると、
実行環境(コンテナ)の構築やアプリケーションの起動が速く、ディスク使用量が少ないなどのメリットがあります。
これは、VMwareでは「ハイバーバイザ」といって、複数の異なるOSをサポートする仕組みを採用しているためです。
(Dockerでは、Linuxのみのサポートとなります)。

Dockerでは、一つのホストマシンに複数のコンテナを構築することができ、
コンテナは互いに通信をすることで連携して動作することが可能となります。
また、同一のホストマシンに搭載されるコンテナ同士は、
プライベートなネットワークを経由することで通信することができますが、
複数のマシンに跨ってコンテナ同士が通信する場合は、NAT(IP Masquerade)を用いる必要があります。
Dockerの標準の環境では、この複数のマシンに跨ったコンテナ間の通信・連携が難しいため、
複数のマシンで構成される環境では、コンテナ間の通信・連携を代行するソフトウェアを用意する必要があります。
(また、複数のマシンで構成される環境のことを「クラスタ」と呼びます)。


##「Kubernetes」とは？
Dockerの章で書きましたが、Docker単体では、複数のマシンに跨ってのコンテナ間の通信・連携を行うことが難しいため、
これを代行するソフトウェアを用意する必要があります。これを行うのが、Kubernetesになります。

Kubernetesを導入することで、クラスタをあたかも一台のマシンのように扱うことができます。
したがって、複数のマシンに跨ったコンテナ間の通信・連携を容易に行うことができるようになるのです。

また、Kubernetesの持つ機能としては、「スケジューリング」「スケーリング」などがあります。
スケジューリングとは、外部からコンテナを起動する要求があると、
クラスタ全体のリソース(CPU＆メモリ＆補助記憶)の使用状況を把握した上で、
現在の状況に最適なコンテナを自動的に選定してくれる機能です。
スケーリングとは、要求の増大に伴って、マシンを増設するなどしてクラスタ全体の性能を向上させることです。


以上で解説を終えます。
個人的には、できれば、具体的にクラスタ全体でなにができるのか、
MapReduceなどの手法やアルゴリズムについても解説したかったのですが、
いかんせん、筆者の勉強不足からそこまでには至りませんでした。
今後は、その辺りのことについても勉強して内容をまとめた上で解説したいです。

Dockerについて参考になったサイト
[https://ja.wikipedia.org/wiki/Docker]

Kubernetesについて参考になったサイト
[https://ja.wikipedia.org/wiki/Kubernetes]
Vue.js 単一ファイルコンポーネントの作成とRouterの設定

####新規ファイルを作成する
src/components/〇〇.vueを作成し、タグを追記します。

```
<template>
<div>
    <h1>ここの文字を表示します</h1>
  </div>
</template>

<script>
export default {
  
}
</script>

<style lang="scss" scoped>
  
</style>
```
####インポートする
src/views/Home.vue(例)

```<template>
  <div class="home">
下記を削除する
    <img alt="Vue logo" src="../assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>

※ここでインポートする
<〇〇/>>
  </div>
</template>

<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'

※ここでインポートする
import 〇〇 from '@/components/〇〇.vue'

export default {
  name: 'home',
  components: {
    HelloWorld,

※ここに追記する
    〇〇
  }
}
</script>
```
これで、表示することができました。
####Vue Routerの設定
src/router.js

```
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
※ここから下を変更します
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/about',
      name: 'about',
      // route level code-splitting
      // this generates a separate chunk (about.[hash].js) for this route
      // which is lazy-loaded when the route is visited.
      component: () => import(/* webpackChunkName: "about" */ './views/About.vue')
    }
  ]
})
```
MIPSアーキテクチャでの乗算、除算


パタヘネ[^1] 読んでたら乗算、除算のアーキテクチャ実装が載っていたのでRustで書いてみました。

ビット演算だけで表現できるのすごいなほへーってなりました。またbit演算のいい練習になりました。

あとこの調子でいったらアセンブリ言語のインタプリタとか作れそう!（小並

低レイヤー全般全くの無知なので間違ってたりとかこうした方がいいとかあったらコメントしていただけると嬉しいです。

パタヘネまだ上巻しか読んでないけどわかりやすくて脳汁ブシャーってなるかなりいい本

```Rust
struct Register {
    hi: i32,
    lo: i32
}

impl Register {
    // 乗算
    fn mult(&mut self, rs: &i32 , rt: &i32) {
        let mut rt = *rt as i64;
        for _ in 0..32 {
            if rt & 1 == 1 {
                rt += (*rs as i64) << 32;
            }
            rt >>= 1;
        }

        // hi: rtの上位32ビット
        // lo: rtの下位32ビット
        self.hi = (rt >> 32) as i32;
        self.lo = rt as i32;

        // オーバーフロー検知
        // オーバーフローの条件 → hi と lo の符号が異なる
        if  self.hi ^ self.lo < 0 {
          // オーバーフロー発生時の例外処理
        }
    }
    
    // 除算
    fn div(&mut self, rs: &i32, rt:  &i32) {
        let mut rs = *rs as i64;
        for _ in 0..32 {
            rs <<= 1;
            // rs - ((*rt as i64) << 32: rsの上位32ビットからrtを引く
            if  rs - ((*rt as i64) << 32) < 0 {
                // 最下位桁を0にする
                rs &= !1;
            } else {
                rs = rs - ((*rt as i64) << 32);

                // 最下位桁を1にする
                rs |= 1;
            }
        }

        // hi: rs ÷ rt
        // lo: rs mod rt
        self.hi = (rs >> 32) as i32;
        self.lo = rs as i32;

        // オーバーフロー検知
        // オーバーフローの条件 → hi と lo の符号が異なる
        if  self.hi ^ self.lo < 0 {
          // オーバーフロー発生時の例外処理
        }
    }
}


fn main() {
    let mut register = Register {hi: 0, lo: 0};

    register.mult(&2, &3);
    println!("{} {}", register.hi, register.lo); // 0 6

    register.div(&7, &2);
    println!("{} {}", register.hi, register.lo); // 1 3

}

```

# 参考
[^1]: [パーターソン&ヘネシー コンピュータの構成と設計 第３版](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E6%A7%8B%E6%88%90%E3%81%A8%E8%A8%AD%E8%A8%88-%E7%AC%AC5%E7%89%88-%E4%B8%8A-%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BBL-%E3%83%98%E3%83%8D%E3%82%B7%E3%83%BC/dp/4822298426/ref=sr_1_1?adgrpid=53613622259&gclid=CjwKCAjw4ZTqBRBZEiwAHHxpftL2fiHvynVbopzzdsoVWCHGB2ol52V4meBxO4pHsOm_YLPTbOQ2vRoCzgUQAvD_BwE&hvadid=338538632779&hvdev=c&hvlocphy=1009292&hvnetw=g&hvpos=1t1&hvqmt=b&hvrand=10643053287392727833&hvtargid=aud-759242200046%3Akwd-332760947213&hydadcr=27265_11561134&jp-ad-ap=0&keywords=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E6%A7%8B%E6%88%90%E3%81%A8%E8%A8%AD%E8%A8%88&qid=1564855981&s=gateway&sr=8-1)

[ビット演算 [3]：特定のビットを0にする](https://qiita.com/vivisuke/items/49aa87579ac69045d43b)
[ビット演算 [2]：特定のビットを1にする](https://qiita.com/vivisuke/items/46f7347ddb17f3a8ae18)
List of realtime lighting visualizers

# MA3D
![2019-08-04_023840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/04d4da12-e44b-ae1d-3f5e-46737f12698b.png)
https://www.malighting.com/product/ma-3d-grandMA_3D/
Free

# Light Converse (L8)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/9d20f4e6-67ac-c69c-625d-a884a3f5d053.jpeg" width="400">
https://l8.ltd/l/
![2019-08-04_030239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/7f5e2035-0398-d52c-c364-4acb820227f5.png)

# Wysiwyg
![2019-08-04_022418.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/5a6ab643-0e0a-e072-a52d-1eba39920a67.png)
https://cast-soft.com/wysiwyg-lighting-design/
![2019-08-04_025604.png]()
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/71944bba-a45f-f8d7-f27f-d3ad72151dfe.png" width="600">


# Capture
![capture_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/824c51e0-9ef4-b098-42e7-fb6b21c31ebd.png)
http://www.capture.se/Products/Software
![2019-08-04_022033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/799d276e-20ea-c7ad-3063-a58512c9bba4.png)

# MagicQ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/f10fd8fa-71ea-93a0-88fc-6c172d99bfc9.jpeg" width="400">
https://chamsyslighting.com/products/magicq?variant=7841688715300

# Martin ShowDesigner MSD
![nws-19-2014-05-05-16-36-46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/bb962e1a-dec5-40d2-fdb5-1b7e4db47a81.jpeg)
http://www.martinshowdesigner.com/
![2019-08-04_030019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/5aebd90b-ed0d-55a7-cbfa-fb616c679c8e.png)

# Realizzer
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/84bcdb38-3f16-9156-7f62-60b218fd13cf.jpeg)
http://www.realizzer.com/
![2019-08-04_025414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/45830121-6646-2944-688e-c2891dfd4da7.png)


# VECTORWORKS Vision (ESP Vision)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/e1ad6d33-8fdb-f83d-a8ad-8c37b0802bcc.png" width="400">
https://www.vectorworks.net/en/vision

# Studio DMX 
![Chromateq_WebSite_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127402/664751fd-d26f-37ee-57c3-70327f57e3e5.png)
http://www.chromateq.com/71-chromateq-studio-dmx-3d-viewer.htm
M5 StickV がPCから認識できない問題と解決方法

M5 StickVをようやく入手したけどもPCにつないで認識できない、、という悲しい状況を解決できました。

状況
　不明なUSBデバイス（デバイス記述子要求の失敗）」や「不明なデバイス」
原因
　USBポートの電圧低下。M5 StickV 接続後に4.9V未満か
対策
　ACアダプタ付きのUSBハブ利用で解決。

テスト画面や起動時の音を小さくする方法は [ブログ](http://ssj.siosalt.tokyo/?p=89)に上げておきました。
Androidの開発者オプションの最小幅を上げすぎたら起動しなくなった話

#はじめに
みなさん最小幅いじってますかー？

でも何事もやりすぎはよくないよねって話。

#環境
OS：Android 9

#事の顛末
なんとなく最小幅をいじってあそんでた
↓
調子に乗って1000 dpにしてしまう
↓
画面が表示されなくなる
↓
強制終了からの再起動してみる
↓
ブートループに陥る ((＾ω＾≡＾ω＜ｷﾞｬｱｱｱｱｱｱｱ
↓
TWRPを焼いてデータを救出しようとするもブートアンロックしてないことを思い出す
↓
.
.
.
↓
やむなくWipe Dataすることに（ｱｱ...ﾃﾞｰﾀｶﾞ...）

悲しいなぁ...(´・ω・｀)

#結論
- 最小幅のいじりすぎはよくないよ
- データはバックアップしとこうね
- 念のためブートアンロックしとくと何かあった時に役に立つよ
private な Generics Type のインスタンス化

## はじめに

Unit Test を書く際に private や internal なクラスのインスタンスを作りたくなることがあります。
(internal については自分で書いたライブラリであれば `InternalsVisibleTo` でテスト用のプロジェクトを指定すればテストが簡単になる)

この時、Generics ではない普通のクラスであれば `Assembly` の `GetType` メソッドにクラス名を指定してあげることで型情報を取得することができます。
しかし Generics の場合、型をパラメータとして与えることができるため、型情報を取得するときに名前の指定方法を少し気を付ける必要があるのでその情報をまとめます。

なおこのサンプルで使用する Unit Test のライブラリは xUnit を使用していることとします。

## 方法
例えば Sample.csproj の Sample.cs に以下のような `Sample` クラスが定義されていたとします。

```Foo.cs
namespace Sample
{
    class Foo<TBar, TBaz>
    {
        public TBar Bar { get; set; }
        public TBaz Baz { get; set; }
    }
}
```
このクラスをテストプロジェクトである Sample.Tests.csproj でインスタンス化するには以下のようにします。

```FooTest.cs
using System:
using System.Reflection;
using Xunit;

namespace Sample.Tests
{
    public class Bar
    {
    }

    public class Baz
    {
    }

    public class FooTest
    {
        [Fact]
        public void Test()
        {
            // Hoge は Sample.csproj で public なクラス
            // テスト対象の Assembly を取得する方法はいくつかあるがライブラリのテストであれば
            // プロジェクトの参照を持っているだろうし public なクラスもあるはずなので GetAssembly で取得するのが楽
            var asm = Assembly.GetAssembly(typeof(Hoge));

            // Generics の場合はパラメータとして与えられた型の個数を「`」の後に指定する
            // そして具体的に Generics のパラメータにどのような型を指定するかは
            // 型の最後に[[{型の名前1}],[{型の名前2}],...,[{型の名前n}]]のように指定する
            var type = asm.GetType("Sample.Foo`2[[Sample.Tests.Bar, Sample.Tests],[Sample.Tests.Bar, Sample.Tests]]");
            
            // 取得した type を使用して CreateInstance でインスタンスを作成する
            var instance = Activator.CreateInstance(type);

            Assert.NotNull(instance);
        }
    }
}
```

また、 `type` を取得するには以下のような方法もあります。

```C#
var type = asm.GetType("Sample.Foo`2").MakeGenericType(typeof(Bar), typeof(Baz));
```
この方法は Generics で指定する型のパラメータがテストプロジェクトからアクセスできる場合に有効です。
Intellisense や IDE のリファクタリング機能が作用するので使用できるのであればこちらのほうがおすすめです。

## `Foo` が Nested Type の場合
`Foo` が別の Generics Type の Nested Type の場合もあるかもしれません。

```C#
namespace Sample
{
    class Qux<TQuux>
    {
        private class Foo<TBar,TBaz>
        {
            public TBar Bar { get; set; }
            public TBaz Baz { get; set; }
            public TQuux Quux { get; set; }
        }
    }
}
```

この場合に `type` を取得する場合は以下のようにします。

```C#
// Nested Type の場合 Declaring Type の後に「+」を付けてそのあとに名前を指定します
// Generics の具体的な型の指定は Declaring Type も Nested Type もまとめて配列で指定します
var type = asm.GetType("Sample.Qux`1+Foo`2[[Sample.Tests.Quux, Sample.Tests],[Sample.Tests.Bar, Sample.Tests],[Sample.Tests.Baz, Sample.Tests]]");
```
または

```C#
var type = asm.GetType("Sample.Qux`1+Foo`2").MakeGenericType(typeof(Quux), typeof(Bar), typeof(Baz));
```

このように private な Generics 型でもインスタンス化できるので Unit Test で今までテストができていなかったところもテストできるようになります。

## Sample Source
今回のサンプルを GitHub に上げました。
[generics-type-instance-creating-sample](https://github.com/uttne/generics-type-instance-creating-sample)
KerasのLSTM実現についての疑問

# 「Deep Learning」本のLSTMに関する状態更新式
Ian Goodfellow, Yoshua Bengio, Aaron Courville著「Deep Learning」の10.10 [The Long Short-Term Memory and Other Gated RNNs](https://www.deeplearningbook.org/contents/rnn.html)の中に、LSTMの状態更新式は以下です。

## forget gate(f), state(s), external input gate(g), output(h), output gate(q) 
```math
f_i^{(t)} = \sigma \Big(
b_i^f + \sum_j U_{i,j}^f x_j^{(t)} +
\sum_j W_{i,j}^f h_j^{(t-1)}
\Big)
```
```math
s_i^{(t)} = 
f_i^{(t)} s_i^{(t-1)} + g_i^{(t)} \sigma \Big(
b_i + \sum_j U_{i,j} x_j^{(t)} +
\sum_j W_{i,j} h_j^{(t-1)}
\Big)
```
```math
g_i^{(t)} = \sigma \Big(
b_i^g + \sum_j U_{i,j}^g x_j^{(t)} +
\sum_j W_{i,j}^g h_j^{(t-1)}
\Big)
```
```math
h_i^{(t)}=tanh(s_i^{(t)}) q_i^{(t)}
```
```math
q_i^{(t)} = \sigma \Big(
b_i^q + \sum_j U_{i,j}^q x_j^{(t)} +
\sum_j W_{i,j}^q h_j^{(t-1)}
\Big)
```

<img width="602" alt="Screen Shot 2019-08-04 at 1.21.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216936/d85b1656-9cfe-e67d-a921-b3791e584d6c.png">


<img width="848" alt="Screen Shot 2019-08-04 at 1.27.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216936/7a7e85f9-551c-0f54-60b4-d18c649b3b02.png">


# KerasのLSTM実現方法
Keras発明者Francois Chollet著、「Deep Learning with Python」の6.2.2 [Understanding the LSTM and GRU layers](https://livebook.manning.com/book/deep-learning-with-python/chapter-6/165)にLSTMについて下記の状態更新式が書いてあります。

```
output_t = activation(dot(state_t, Uo) + dot(input_t, Wo) + dot(C_t, Vo) + bo)

i_t = activation(dot(state_t, Ui) + dot(input_t, Wi) + bi)
f_t = activation(dot(state_t, Uf) + dot(input_t, Wf) + bf)
k_t = activation(dot(state_t, Uk) + dot(input_t, Wk) + bk)

c_t+1 = i_t * k_t + c_t * f_t
```
![figure_6-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216936/439a1638-f27f-9266-d8bd-2f2d525673de.png)


これらの式とDeep Learning本の式が似てますが、少なくとも違いは２箇所があると思います。

まず、Francois氏はc_tとstate_tを分けています。
しかし、「Deep Learning」だと、c_tとstate_tは、s(state)だけで十分です。
c_tとstate_tが分けられているから、唯一違う形の式（activation(dot(state_t, Uo) + dot(input_t, Wo) + dot(C_t, Vo) + bo)）が出ました。

また、output_tの計算方法が違います。
もしi_tがinput gate, f_tがforget gateだとしたら、k_tはoutput_gateになります。
つまりoutput_tを計算する時、k_tを使うべきです。
Deep Learningの方は、h(ここのoutput_t)を計算する時、output gate q(ここのk_t)を使います。

この理由で、KerasのLSTMの実装は正しいかどうかに疑問を持っています。

Francois氏の式とKerasソースコードが一致しているかを確認するために、Kerasのソースコードも見ましたが、まだ確認できていないです。
[Kerasのrecurrent.py](https://github.com/keras-team/keras/blob/master/keras/layers/recurrent.py)の2015行目~2022行目に更新式がありそうです。後ほどまた確認します。

# PyTorchのLSTM実装方法
念の為PyTorchのソースコードも見てみました。
PyTorchのLSTMクラスに綺麗に数学式コメントが書いてありますので、**Deep Learning本の式と完全に一致していることを確認しました！**
[PyTorchのLSTMコメント](https://pytorch.org/docs/stable/_modules/torch/nn/modules/rnn.html)は以下になります。

<img width="638" alt="Screen Shot 2019-08-04 at 2.02.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216936/bfd5d100-4158-0c7d-e1f4-32bcda5291f2.png">

PyTorchのLSTMコメントと比べると、KerasのLSTMコメントはあんまりないです。
この理由で今後PyTorchを使おうという気持ちになっています。
Unityのフリック処理，ひっぱり判定メモ

# フリック判定・ひっぱり判定の実装
実装するもの
- フリック操作
- ひっぱり操作
フリックを判定して，デバッグ出力する
ひっぱりを判定してオブジェクトの大きさと角度を変更する

```cs:InputManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class touchEvents : MonoBehaviour {
    [SerializeField] Vector2 prevPos;
    [SerializeField] Vector2 targPos;

    //フリック判定用 時間しきい値
    [SerializeField] float flickTime = 0.15f;
    //フリック判定用 移動距離
    [SerializeField] float flickMagnitude = 100;
    // ひっぱり判定用
    [SerializeField] float graspThreshold = 1.0f;
    //フリック判定用 ローカルタイマー
    private float timer = 0.0f;

    // Start is called before the first frame update
    void Start() {
    }

    // Update is called once per frame
    void Update() {
        if (Input.GetMouseButtonDown(0)) { // タップされたとき
            prevPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            timer = 0.0f;
        } else if (Input.GetMouseButton(0)) { // タップ長押し中
            targPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            Vector2 diffPos = targPos - new Vector2(transform.position.x, transform.position.y);

            // ひっぱり判定
            float magnitude = diffPos.magnitude; // ひっぱりの強さ（距離依存）
            float rad = Mathf.Atan2(diffPos.y, diffPos.x); // ひっぱり角度
            // ひっぱり時のアクション
            this.transform.localEulerAngles = new Vector3(0f, 0f, rad * Mathf.Rad2Deg);
            this.transform.localScale = new Vector2(magnitude, magnitude);
            // タイマー更新処理
            timer += Time.deltaTime;
        } else if (Input.GetMouseButtonUp(0)) { // タップを離したとき
            targPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            isFrickd(targPos - prevPos);
            timer = 0.0f;
        }
    }

    void isFrickd(Vector2 mouseMove) {
        // フリック判定
        // 距離が指定以上、タップ時間が指定以下の場合、フリックと判定
        if (mouseMove.magnitude >= flickMagnitude && timer <= flickTime) {
            //x軸の距離が大きい場合は左右へのフリック
            if (Mathf.Abs(mouseMove.x) >= Mathf.Abs(mouseMove.y)) {
                if (mouseMove.x >= 0) {
                    Debug.Log("Right Frick");
                } else {
                    Debug.Log("Left Frick");
                }
            }
            //y軸の距離が大きい場合は上下のフリック
            else if (Mathf.Abs(mouseMove.x) < Mathf.Abs(mouseMove.y)) {
                if (mouseMove.y >= 0) {
                    Debug.Log("Up Flick");
                } else {
                    Debug.Log("Down Flick");
                }
            }
        }
    }
}

```
【Swift】最前面のViewControllerの取得方法（備忘録）

最前面のViewControllerの取得方法が、しばしば記憶から消えるので備忘録的に。

##お手軽パターン

```Swift:ViewControllerExtension.swift

func topViewController() -> UIViewController? {
        var vc = UIApplication.shared.keyWindow?.rootViewController
        while vc?.presentedViewController != nil {
            vc = vc?.presentedViewController
        }
        return vc
    }
```
大体の場合、Google先生に聞いた時はこちらが出てくる。
presentでViewControllerをどんどん重ねていく系のアプリではこれでも問題がない。

が、NavigationControllerやTabBarControllerを使っている場合、それらの中身までは判定できない。
つまり、返り値がNavigationControllerやTabBarControllerになってしまう。
大抵の場合、それではNGなことが多いので次の方法を考える。

##少し改善したパターン
```Swift:ViewControllerExtension.swift
func topViewController(controller: UIViewController?) -> UIViewController? {
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        }

        if let navigationController = controller as? UINavigationController {
            return topViewController(controller: navigationController.visibleViewController)
        }

        if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        
        return controller
    }
```
こちらのパターンだと、NavigationControllerやTabBarControllerに当たっても、その中身までを吟味するため正確なViewControllerを取得することができる。
nginxで強制的にhttpsにする

httpsが必須になってきた昨今、nginxでhttpのアクセスをhttpsにリダイレクトさせることがよくあるけどよく忘れるのでメモ。__（※証明書はlet's encryptで取得済みの前提）__

xxx.comの部分は設定するドメインに変更。

```nginx
server {
    listen 80;
    server_name xxx.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    ssl on;
    ssl_certificate     /etc/letsencrypt/live/xxx.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxx.com/privkey.pem;

    server_name xxx.com;

    # ...etc..
}
```

以上。
Terraformのコンポーネント分割について検討する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/f13ec916-f616-470b-279f-b9e2695cc379.png)

## はじめに
こんにちわ。Wano株式会社エンジニアのnariと申します。
前回のmoduleの記事に引き続き、terraformの話を記事にしたいと思います。
今回は**tfstateをどの単位で分割し管理するか、というコンポーネント分割問題**に関して書いていきます。

**ただし、今回の記事の構成はプロジェクトの一旦の落とし所であって、ベストな構成とは限らないのでご了承ください。**
## 対象読者
- **モノシリックなtfstateの管理が辛い方**
- **コンポーネント分割の粒度に同じく悩んでいる方**

## 前提
- 筆者のプロジェクトのサービスはAWS上で構築しているため、providerはAWS 

## 何故コンポーネントを分割するのか
- **terraformの結果ファイル(tfstate)をモノシリックにするのは怖い**
    - 変更の影響範囲が読めない
    - ファイル自体の可読性が終わる
- **かといってawsサービスごとに分けると、細かくなりすぎて運用がかなり煩雑になる**(makefileやterragruntなどのツールでカバーしても)

## 分割する際の視点
- 安定度
- ステートフル
- 影響範囲
- 組織のライフサイクル
- 関心ごとの分離
- 依存関係の制御  

(**Pragrmatic Terraform on AWS 17章より**)

## コンポーネント分割の全体像
<img width="546" alt="スクリーンショット 2019-08-04 00.31.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321850/55d8a2ee-a6bf-cb84-a491-8280ca4e8d0a.png">

## どのように上記の分割に行き着いたか
**分割する際の視点を利用し、現実的に分割粒度を検討していった**

- 安定度  高
    - **network**(vpc,subnet周辺)
- 安定度 低
    - **routing**(route53,alb,acm)
- 関心ごとの分離
    -  **services** ecsのサービス単位(ecs cluster,taskdifinition,service,それに付随するec2系リソース ecr pipeline系)  
    -  **opsserver**(session manager,ec2)
    -  **events** やりたい処理単位(lambda cloudwatchEvents ここはApex+Terraform)
        - モニタリングとかもここに
    -  **state machine**(step function)　
- ステートフル
    - **storage**(s3)
        - 依存関係を制御できる自信がない+複数の関心ごとの対象となるストレージが出てこなさそうなので、backend以外全て他のコンポーネントに寄せることとする(今回はコンポーネントとして登場させない)　
    - **datastore**(elasticache,RDS)
        - elasticache,RDSを別々に管理する(それぞれクラスターごとに)
- 組織のライフサイクル
    - **iam user**
 
- 依存関係の制御
   - **コンポーネント図を起こし、terragrunt.hclのdependenciesでしっかり管理する**
   
```terragrunt.hcl
dependencies {
  paths = ["../../network","../../routing"]
}
```


## 課題
- iam roleやpolicyの管理をそれぞれのコンポーネントに寄せてしまっているので、**同じようなpolicyが量産されてしまう**
- ストレージはステートフルとは言え、それぞれ独立したコンポーネントで管理すると、**今度は依存関係の管理でかなり疲弊**することになるので、個別管理できていない
- **そもそもここまで厳密にコンポーネントを分割して運用している例を見ない**(メルカリさんなどの例でも、マイクロサービス毎くらいにしか管理していないぽい)

## その他
### Q.こんなに分割すると**デプロイの運用がめんどくさい**のでは？
### A.**そこまで面倒臭くはない。**
- [terragrunt](https://github.com/gruntwork-io/terragrunt)というツールを使うと、それぞれのサブディレクトリでplanやapplyを打ってくれるplan-allやapply-allが使えるようになるので、**コマンド一発の運用に集約できる**
- 前述したterragrunt.hclという設定ファイルで**コンポーネント間の依存関係も管理できる**
-  CIでもterragrunt plan-allをdindで唱えて差分チェックをしている（sampleのdockerfileは[こちら](https://github.com/takafk9/terraform-checker/blob/master/Dockerfile))
- codebuildでのdindの設定に関しては[こちらの記事](https://qiita.com/fukubaka0825/items/d2f19d1d6d1bc2b7edac)参照

## 終わりに
皆さんのプロジェクトでのコンポーネント分割粒度についても教えていただけると大変嬉しいです。
よろしくお願いいたします。   
## 参考文献
[terraformはどの単位で分割すべきか - Qiita](https://qiita.com/yukkyun/items/0981a262a0df18f11121)
[オレオレterraformディレクトリ構成ベストプラクティス - Qiita](https://qiita.com/eigo_s/items/02264a5a7ad0ff6c5387)
[Terraformにおけるディレクトリ構造のベストプラクティス ｜ DevelopersIO](https://dev.classmethod.jp/devops/directory-layout-bestpractice-in-terraform/)
[Terraform Best Practices in 2017 - Qiita](https://qiita.com/shogomuranushi/items/e2f3ff3cfdcacdd17f99)
[Terraform 運用ベストプラクティス 2019 ~workspace をやめてみた等諸々~ - 長生村本郷Engineers'Blog](http://kenzo0107.hatenablog.com/entry/2019/04/17/103558)
Railsチュートリアル（第5章）

# はじめに
Railsチュートリアルの第5章が終わりました。
ポイントだけメモしておきます。

# 条件付きコメント
以下のように記述することで、Internet Explorerのバージョンが9以下の場合のみ、コメント内の処理が実行されます。

```
<!--[if lt IE 9]>
  <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/r29/html5.min.js">
  </script>
<![endif]-->
```

# リンク用のヘルパー 
以下のように記述することで、リンクを記述することができます。
最終的には`a`タグになります。

```erb
<%= link_to "テキスト", "URL" %>
```

# CSSの記述
`app/assets/stylesheets/`ディレクトリ配下に置いたcssやscssファイルはアプリケーション全体で使用することができます。
また、bootstrapを使用する際は、ファイルの先頭に以下の内容を記述します。

```scss
@import "bootstrap-sprockets";
@import "bootstrap";
```

# パーシャル
viewのコードをひとまとまりにして別ファイルにすることができます。これによって似たような記述を使いまわしたり、コードをわかりやすくすることができます。
パーシャルのファイル名は、`_`から始まる必要があります。

パーシャルをviewに組み込む場合は、以下のように記述します。

```erb
<%= render ”ファイルパス” %>
```

例えば、以下であれば`app/view/layouts/_header.html.erb`というファイルの内容を埋め込むことになります。
renderに記述する際は、先頭の`_`を外して記述します。

```erb
<%= render `layouts/header` %>
```

# 名前付きルート
`routes.rb`に記述したルートに名前を付けてリンク等に使うことができます。
以下のように記述します。

```rb:config/routes.rb
  root 'static_pages#home'
  get  '/help',    to: 'static_pages#help'
  get  '/about',   to: 'static_pages#about'
  get  '/contact', to: 'static_pages#contact'
```

rootで記述したルートには、`root_path`でアクセスできます。
その他のルートは、上記の例だと、以下のようにアクセスできます。

```rb
  get  '/help',    to: 'static_pages#help'
  # help_pathによって'static_pages#help'にアクセスする

  get  '/about',   to: 'static_pages#about'
  # about_pathによって'static_pages#about'にアクセスする

  get  '/contact', to: 'static_pages#contact'
  # contact_pathによって'static_pages#contact'にアクセスする
```

これで、`link_to`を記述すると以下のようになります。

```erb
<%= link_to "About", about_path %>
```

また、以下のように`as`を使って記述することで、名前付きルートの名前を変えることができます。

```rb
get  '/about',   to: 'static_pages#about', as: 'hoge'
```
Android Studioのスペルチェックを含むInspectionをコマンドラインから実行する

Lintのみの解析であればgradleを利用してコマンドから実行できるものの、スペルチェックを含む解析をコマンドから実行する方法が見つからなかったので、メモしておく

# 前提となる環境
- Windows 10
- Android Studio 3.4

# Android Studioから実行
該当プロジェクトを開き、メニューの「Analyze」から「Inspect Code」を選択する

ちなみにスペルチェックのみを実行したい場合は、メニューの「Analyze」から「Run Inspection by Name」を選択し、「Typo」と入力しEnterを押せば、スペルチェックのみの実行画面が開く

# コマンドラインから実行
Android Studioが保持している`inspect.bat`ファイルと、ユーザディレクトリに用意されているInspectionのデフォルト設定ファイルを利用する

- `inspect.bat`ファイル
  64bit版を利用している場合は、おそらく以下のパスとなる
  `C:\Program Files\Android\Android Studio\bin\inspect.bat`

- Inspectionのデフォルト設定ファイル
  ユーザ設定保存ディレクトリを変更していない場合は、おそらく以下のパスとなる
  `C:\Users\${ユーザ名}\.AndroidStudio3.4\config\inspection\Default.xml`
  設定ファイルが存在しない場合は、Android Studioのメニューの「Analyze」から「Inspect code」を選択し、「Inspection profile」に表示されている3点リーダボタンから「Inspections」ウィンドウを表示し、「Default」設定をExportすることで設定ファイルを作成する

`inspect.bat`ファイルに以下のような引数を渡して実行することで、Inspectionが走る

1. プロジェクトディレクトリ
2. Inspection設定ファイル
3. 結果出力ディレクトリ

以下のようなコマンドとなる

```powershell:PowerShell
& 'C:\Program Files\Android\Android Studio\bin\inspect.bat' `
    C:\Users\hoge\Documents\SampleProject `
    C:\Users\hoge\.AndroidStudio3.4\config\inspection\Default.xml `
    C:\Users\hoge\Desktop\inspection
```

Android Studioが既に起動している場合は二重起動できない旨のエラーが表示されるため、終了したのちコマンドを実行する
Macにbrewでmavenインストールしようとしたらエラーが出た

# 動作環境
macOS Mojave 10.14.5

# エラー内容
自分のMacにmavenをインストールしようとしたら、
以下のようなエラーが。。。

```shell:Terminal
$ brew install maven
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
Error: An exception occurred within a child process:
  CompilerSelectionError: maven cannot be built with any available compilers.
Install GNU's GCC:
  brew install gcc
```

GCCを入れろって書いてあるので、「brew install gcc」を打ってみると、
また別のエラーが。

```shell:Terminal
$ brew install gcc
Error: Xcode alone is not sufficient on Mojave.
Install the Command Line Tools:
  xcode-select --install

```

# 対処法
なので言われたとおりに`xcode-select --install`を実行してみる。

```shell:Terminal
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

すると、自動的にポップアップが立ち上がるので、指示に従って進める。
![eqYJxt6YQqyZJvFgzBTcIA_thumb_52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335792/6cf5fb11-e83d-c639-1be8-7063940dcbc3.jpeg)
　→「インストール」を選択

![8ckSSxE5SV29PiZJ1WdTew_thumb_53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335792/18f07825-3154-c85a-8d6c-f7ee50dad0b4.jpeg)
　→「同意する」を選択

するとインストールが走るので、完了まで待つ。

改めてmavenのインストールコマンド実行したら、インストールできた！

```shell:Terminal
$ brew install maven
==> Downloading https://www.apache.org/dyn/closer.cgi?path=maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
==> Downloading from http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
######################################################################## 100.0%
🍺  /usr/local/Cellar/maven/3.6.1: 79 files, 10.2MB, built in 15 seconds

$ mvn -v
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T04:00:29+09:00)
Maven home: /usr/local/Cellar/maven/3.6.1/libexec
Java version: 12.0.1, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/openjdk-12.0.1.jdk/Contents/Home
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.5", arch: "x86_64", family: "mac"
```

#　補足
MacOSをアップデートするとAppleのコマンドラインツールが使えなくなり、入れ直しが必要になることがあるとのこと。

Homebrewもこのコマンドラインツールを使っているらしく、影響が出たんですね。

<参考リンク>
[macOS を Mojave にあげた後に Homebrew を使うとエラーが出る問題](https://gotohayato.com/content/487)
TypeScriptをはじめよう 2

#前回のはなし
[TypeScriptをはじめよう 1](https://qiita.com/Miso_DengakuTY/items/f7fb971c1d85b824f3a5)でHello,world!の出力まで行いました。そこで、

```typescript
 const greet : String = "Hello, world!"
```
と書きましたが、JavaScriptやTypeScriptの変数宣言にはECMAScript6からlet/constが追加され、var/let/constの3つが存在します。それでは、これら3つはどのように使い分ければいいのでしょうか。はじめは変数宣言の使い分けについて説明します。


#var/let/consの使いわけ
これら変数宣言の大きな違いはローカル変数の参照できる範囲（スコープ）と再宣言可能性と再代入可能性です。それでは例を見てみましょう。


```typescript
function test(){
    {
        var x = 1
        let y = 1
        const z = 1
    }
    console.log(x) // 1
    console.log(y) // error
    console.log(z) // error
}
```
上記のコードではブロック内でそれぞれの変数を宣言されています。しかし、y,zは変数が見つからないとエラーを起こしてしまいます。これは、varが関数スコープであり、let/constがブロックスコープであることに起因します。では、これを書き換えます。

```typescript

function test(){
    var x = 2
    let y = 2
    const z = 2
    {
        var x = 1
        let y = 1
        const z = 1
    }
    console.log(x) // 1
    console.log(y) // 2
    console.log(z) // 2
}
```

上記のコードではエラー無く実行することができました。しかし、ここで注意が必要となります。このコードでは問題がありませんが、

```typescript

function test(){
    var x = 2
    let y = 2
    const z = 2
    {
        var x = 1
        let y = 1
        const z = 1
    }
    var x = 3
    let y = 3 // error 
    const z = 3 // error
    
    console.log(x)
    console.log(y)
    console.log(z)
}

```
上記のコードのように同一ブロック内で宣言するとlet/constではエラーを起こします。これはlet/constが再宣言を許していないからです。
また、

```typescript

function test(){
    var x = 2
    let y = 2
    const z = 2
    {
        var x = 1
        let y = 1
        const z = 1
    }
    x = 3
    y = 3 
    z = 3 // error
    
    console.log(x)
    console.log(y)
    console.log(z)
}

```
このように、変数に再代入をする場合、letは許していますがconstではエラーを起こします。

まとめると、以下のようになります。

| |ローカルスコープ|再宣言|再代入|
|---:|:---:|:---:|:---:|
|var|関数|○|○|
|let|ブロック|☓|○|
|const|ブロック|☓|☓|

[TypeScriptをはじめよう 3](https://qiita.com/Miso_DengakuTY/items/7cd1b54a9c32197168e3)
Pythonでディレクトリの中の条件に合うファイルを取り出す

**リスト内包表記**を使ってこんな風に書けば良い。

```python
path = '任意のディレクトリ'
file = [i for i in os.listdir(path) if 条件]
```

例えば **'image'** というディレクトリに入っている **jpgファイル**を取り出したかったら以下のようにすれば良い。
ただし **jpgファイル**でなくても **'.jpg'** という文字列が含まれていたらそのファイルも返してしまうので注意。

```python
path = 'image/'
jpgfile = [i for i in os.listdir(path) if '.jpg' in i]
```
VBAでの、行列計算

職場のPCでは、プログラミングとしてエクセルVBAしか使えないというケースが割とあるのではないでしょうか。

データ分析やシミュレーションを行う上で行列計算をよく使いますが、
VBAで３次元以上の高次元の行列計算に関する情報を入手するのに少し苦労したので、ここでメモします。

事例
　平成元年から３１年までの、プロ野球チーム（全１２球団）の、全試合（１４３と仮定）における勝敗を記録したい。

コード例

　Dim matrix(1 to 31,1 to 12,1 to 143) as long
　又は
　Dim year as long
　year = 31
　ReDim matrix(1 to 31,1 to 12,1 to 143) as long

　　以上のコードで、
　　（１）　「1 to 31」によって、平成元年から３１年までの年度を指定しています。
　　（２）　「１ to 12」によって、どのプロ野球チームかを指定しています。
　　　　（１は巨人、２は阪神など、あらかじめ別途数字を割り振る必要は有）
　　（３）　「1 to 143」によって、何試合目かを指定しています。

　ここで、巨人を「１」、勝ちを「１」、引き分けを「０」、負けを「−１」という数字で表すとすると、

　「平成３０年の巨人の１０試合目の試合結果は勝ちであった」という情報は、
　matrix(30,1,10) = 1
    で表すことができます。

　なお、「平成２９年の巨人の２０試合目の結果は負けであった」という情報は、
　matrix(29,1,20) = -1
    となります。

　これを使って行列の計算を簡単に行うことができます。

　実務を意識した、より具体的な使用例は、別途アップしたいと考えています。
Vue.js 基本のファイル構成について

###publicフォルダ
public」と「src」という２つのフォルダによて構成されています。publicには「index.html」という通常のhtmlファイルが入っています。これが、アプリのビューの大元になります。
###srcフォルダ
主に編集するのはsrcフォルダになります。srcフォルダには、「assets」「components」「views」という３つのフォルダに加えて、「App.vue」「main.js」「router.js」という３つのファイルがあります。
###assetsフォルダ
画像やテストデータなど、静的なファイルを保管する場所です。
###componentsフォルダ
Vue.jsでは、ページ内の各要素（ヘッダー、フッター、リストなど）を「コンポーネント」という区分に小分けして管理します。コンポーネントファイルの名前は大文字で始めることが慣習化しています。
###viewsフォルダ
各ページ用のファイルを保管する場所です。コンポーネントがインポートされ使用されていることがわかります。このように、Vue.jsアプリでは、ページ用のvueファイル側でコンポーネント用のvueファイルをインポートして使うことになります。
###App.vue
App.vueは、各ページのベースです。ヘッダーやフッターなど、全ページに共通して表示させたいコンポーネントは、このファイルでインポートします。<router-view />の部分が、viewsフォルダ内の各ページ用のファイルを受け取って表示させる役割を担っています。
###main.js
全ページに反映させたいJavascriptコードを書くためのファイルです。
###router.js
ルーティングの設定を行う際に編集します。

```
routes: [
{
      path: '/',
      name: 'home',
      component: Home
    },
```
実際に編集するのはroutes:の中になります。
【Xcode】ジャンプバーにアノテーションを追加するには

#この記事は何
ソースエディタでは、コードに __アノテーション__（注釈）を付けることができます。
アノテーションには以下の種類があります。
- Todo
- バグ修正リマインダ
- セクション見出し
- セパレータ

アノテーションはジャンプバーのシンボルポップアップメニューに追加されます。

<img width="779" alt="スクリーンショット 2019-08-04 0.05.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70476/65e67372-510f-123e-8411-a5eafafe2c0b.png">


### 環境
macOS Mojave
Xcode11 beta

# 書き方
## to-do アイテムを追加する
Insert a comment with the prefix `TODO:`. 


````swift:Todo
// TODO: [your to-do item]
````

## bug fix リマインダを追加する
Insert a comment with the prefix `FIXME:`.

````swift:
// FIXME: [your bug fix reminder].
````

## heading を追加する
`MARK:` プレフィックスを使うと、いわゆる __見出し__ を表示できます。
ポップアップでは太字になります。

````swift:heading
// MARK: [your section heading].
````

## セパレータを追加する
アノテーションの上部に分割線を表示します。
アノテーションコメントに `-` をつけて、開始します。

````swift:separator_on_above
// MARK: - [your content].
````

アノテーションの下部に分割線を表示します。
アノテーションコメントの最後に `-` をつけます。

````swift:separator_on_below
// MARK: [your content] -.
````
Vue.js　環境構築

#公式リファレンス
https://jp.vuejs.org/
###npmをインストール
macの場合、ターミナルでコマンドを入力して実行します。
Node.jsをインストールすることで、自動的にnpmもインストールされます。
Node.jsをインストールするには、Homebrewというパッケージ管理ソフトを使う方法が最も簡単です。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

```
brew install node
```
インストールが終わったらそれぞれのバージョンを確認してみましょう。

```
node -v
```

```
npm -v
```
###Vue CLIをインストール
バージョンを指定したい場合には指定してください。

```
npm install -g @vue/cli
```
インストールが完了したらバージョンを確認しましょう。

```
vue --version
```
###Vue.jsのアプリを作成する
まずデスクトップに移動します。

```
cd Desktop
```
次にアプリを作成します。

```
vue create アプリ名
```
実行すると選択できるようになりますので、作成したいアプリに合わせて選択しましょう。
今回は、以下のようにします。

```
Vue CLI v3.8.2
? Please pick a preset: (Use arrow keys)
  default (babel, eslint) 
❯ Manually select features
```

```
? Check the features needed for your project: (Press <space> to select, <a> to toggle 
all, <i> to invert selection)
❯◯ Babel
 ◯ TypeScript
 ◯ Progressive Web App (PWA) Support
 ◉ Router
 ◯ Vuex
 ◉ CSS Pre-processors
 ◯ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing
```

```
? Use history mode for router? (Requires proper server setup for index fallback in pro
duction) (Y/n) Y

? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by def
ault): 
  Sass/SCSS (with dart-sass) 
  Sass/SCSS (with node-sass) 
  Less 
❯ Stylus 
```
Y/NはYを選択します。以上でデスクトップにアプリのディレクトリが作成されました。
###アプリを起動する

```
cd アプリ名
```

```
npm run serve
```

```
App running at:
  - Local:   http://localhost:8080/ 
  - Network: http://172.20.10.2:8080/
```
ブラウザでlocalにアクセスしてVueのロゴが表示されていれば完了です。
自宅のグローバル IP を LINE に定時報告

外から ssh したいとき、ちょいちょい IP アドレス変わってて面倒なので、LINE に定期的に報告させる。
一行でお手軽に。LINE Notify て便利ですねー。

```sh

curl -X POST -H 'Authorization: Bearer <token>' -F "message=`curl -4 ifconfig.co`" https://notify-api.line.me/api/notify
```
`<token>` に LINE Notify のトークン入れて、好きなお時間に cron 仕込んでおけば完成。

https://github.com/8mamo10/ip_notifier
https://notify-bot.line.me/
WebVRで、選択すると拡大するオブジェクトを配置する　A-Frame連載(2)

# はじめに

前回記事↓の続きです。
[HTML13行あればWebVRアプリが作れる！　A-Frame連載(1)](https://qiita.com/rf_p/items/d4e000140b445f8874b1)

A-Frameを使い3D空間にオブジェクトを配置できたので、マウスやコントローラーで選択できるようにしてみましょう。

# 完成図

Oculus Questで実行した結果は以下の通り。

![com.oculus.vrshell-20190803-234610.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/69d70a7a-84dd-6683-2668-081d778adedb.gif)

# ソースコード全文

```html
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Web VR Test</title>
    <script src="https://aframe.io/releases/0.9.2/aframe.min.js"></script>
    <script>
      AFRAME.registerComponent('collide', {
        init: function() {
          this.interactiveAnimations();
        },
        interactiveAnimations: function() {
          this.el.setAttribute('animation__mouseenter', 'property: scale; to: 1.5 1.5 1.5; startEvents: mouseenter; dur: 200');
          this.el.setAttribute('animation__mouseleave', 'property: scale; to: 1 1 1; startEvents: mouseleave; dur: 200');
          this.el.setAttribute('animation__click', 'property: scale; to: 3 3 3; startEvents: click; dur: 200');
        }
      });
    </script>
  </head>
  <body>
    <a-scene>
      <a-sky color="#a0d8ef" wireframe="true"></a-sky>
      <a-entity cursor="rayOrigin: mouse"></a-entity>
      <a-entity laser-controls="hand: right" raycaster="far: 50;"></a-entity>

      <a-box position="0 0 -10" width="2" height="1" depth="1.5" color="#333" collide></a-box>
    </a-scene>
  </body>
</html>
```

# ソースコード解説

```html
...
    <script>
      AFRAME.registerComponent('collide', {
...
      <a-box position="0 0 -10" width="2" height="1" depth="1.5" color="#333" collide></a-box>
...
```
collideというコンポーネントを作っています。そして選択できるオブジェクトにcollideを指定しているので、選択オブジェクトとなります。
つまり選択可能なオブジェクト全てにcollideという属性を付与し、選択不可オブジェクトは付与しなければOKです。

```html
          this.el.setAttribute('animation__mouseenter', 'property: scale; to: 1.5 1.5 1.5; startEvents: mouseenter; dur: 200');
          this.el.setAttribute('animation__mouseleave', 'property: scale; to: 1 1 1; startEvents: mouseleave; dur: 200');
          this.el.setAttribute('animation__click', 'property: scale; to: 3 3 3; startEvents: click; dur: 200');
```

collideオブジェクトに対し、3つの属性を付けています。

１つ目はstartEvents: mouseenterなので、オブジェクトにマウス（もしくはVRコントローラーのフォーカス）が乗った際に起きるイベント。scaleの1.5 1.5 1.5なので、マウスで選んだオブジェクトがx,y,zそれぞれ1.5倍の拡大がされます。

2つ目はstartEvents: mouseleaveなのでその逆で、フォーカスが外れた際にscaleをx,y,z軸で1倍にします。つまりマウスが乗る前のサイズに戻しているわけです。

３つ目はstartEvents: clickなので、マウス(もしくはVRコントローラー)でクリックした際に、scaleを3倍にしています。

```html
      <a-entity cursor="rayOrigin: mouse"></a-entity>
      <a-entity laser-controls="hand: right" raycaster="far: 50;"></a-entity>
```

マルチデバイス対応です。
前者はPC等のVR機器でないもので、マウスで選んだ際に当たり判定が出るように設定しています。
後者はVR機器でコントローラーが接続されている場合、右手のコントローラーに当たり判定を付けています。

# 最後に

次回は選択時、もう少し分かりやすいようにパーティクルを生成しエフェクトが出るような仕組みを解説します。
MacBookのトラックパッドでのChromeのズームを初期化するショートカット

## MacBookのトラックパッドでのChromeのズームを初期化するショートカット
トラックパッドでChromeをズームすると、虫眼鏡マークが出ないので戸惑う時があります。

そのときに使えるコマンドがcommand + 0です。

これによりズーム状況を初期化できます。

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
PHPでamazonAPIを使い図書管理システムをつくってみよう

#PHP図書管理システムが早くも頓挫しそう
**1.設計思想**


##1.設計思想
だが似たようなシステムは既にあるし、書籍やネットでサンプルコードを見ていけばある程度まで自力で出来るはずだ。
とりあえず、なにを作りたいのか、どんな機能を最初はつけるのか。それにはなにが必要かをここで整理していこう。

・ユーザが既読・未読・欲しい本といった３カテゴリ分ける
・ユーザが気軽に本を探せる検索機能
・３つカテゴライズし、CRUDできる機能
・タグ分け（作者、ジャンル、５０音順、既読、未読、欲しい）

-**追加したい機能:fist:**
・タグ訳は動的なアクション
・amazonだけでなく市の図書館などのOPACからも検索できる機能
・隠れ本棚機能（通称：ベッドの下）
・欲しい本で未発売のものが発売されたら通知する機能

---
※追加したい機能より設計思想で挙げた機能を優先する
Nano Pi NEO2 実験報告書

#実験目的
Nano Pi NEO2 の開発環境を整える.

#実験環境
- Nano Pi NEO2
- FT232RL
- 無線LAN子機
- ジャンパーピン
- ACアダプター 5V 2A
- SDカード
- ケーブル
- パソコン

#実験手順
1.SDカードにISOイメージを書き込む．
2.シリアル通信をするために，FT232RLとNano Pi NEO2を接続する
3.パソコンにscreenをインストールする．
4.シリアル変換器に割り振られているポート名を調べる．
5.シリアル変換器に接続する．
6.Nano Pi NEO2に接続する．
7.無線LAN子機を有効にする．
8.無線LANを使ってSSH接続する．

#実験結果
SDカードのデバイス名はfdiskコマンドを使用して調べた．

```terminal:terminal
fdisk -l
```

ISOイメージはddコマンドを使って書き込んだ．

```terminal:terminal
sudo dd if=nanopi-neo2_sd_friendlycore-xenial_4.14_arm64_20190430.img of=/dev/sdb
```
ddコマンドの進捗については，もう一つターミナルを開きwatchコマンドを使用して監視した．実際の実験では秒数を指定したが，watchコマンドはデフォルトで秒数が2秒に指定されているため以下のオプションは必要ない．

```terminal:terminal
watch -n 2 sudo pkill -USR1 dd
```

Nano Pi NEO2のピン配置は以下の図のようになっている．シリアル変換器とNano Pi NEO2をジャンパーピンで接続する．接続は以下のようにする．なお，電源はACアダプターから供給するため5Vピンは接続しない．シリアル変換器の電圧は3.3Vとする．

![NEO2_pinout-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192626/6164e4f4-eea8-cb75-daa8-e86ef3f96c47.jpeg)

| Nano Pi NEO2    | FT232RL          |    
|:----------------|:-----------------|
| Tx              | Rx               |       
| Rx              | Tx               |      
| GND             | GND              |       



![IMG_20190803_221619_9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192626/1c4abe6c-3f7a-cc0f-b7c9-dc04f9252cc6.jpeg)

以下のコマンドでシリアル通信をパソコンで出来るようにする．

```terminal:terminal
sudo apt-get install screen
```

シリアル変換器に割り振られているポート名を調べる．

```terminal:terminal
ls -l /dev/serial/by-id/
```

シリアル変換器に接続する．

```terminal:terminal
screen /dev/ttyUSB0　115200
```

Nano Pi NEO2の電源を入れると以下のような画面になり接続することが出来た．

![Screenshot from 2019-08-03 20-42-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192626/271368b2-ae9f-31dc-f0a0-5e2d344cd24e.png)

WIFIのセットアップをする．

```terminal:terminal
#NetworkManagerが認識するデバイスとその状態を表示する
sudo nmcli dev

#WiFiを起動する
sudo nmcli r wifi on

#WIFIをスキャンする
nmcli dev wifi

#wifiに接続する
sudo nmcli dev wifi connect "SSID" password "PASSWORD"
```
Nano Pi NEO2にシリアル通信で接続した際に表示されたipアドレスを元に，ホスト側のパソコンからssh接続でNano Pi NEO2に接続出来た．

```terminal:terminal
sudo arp-scan -l --interface wlan0
sudo ssh pi@XXX.XXX.X.XX
```

#考察
SDカードの構造やパーティションなどの知識が必要だと感じた．また，アーキテクチャやそれに対応するOSについての知識も深めるべきだと思った．MACアドレスを使用してSSH接続を簡単にするプログラムを作成したいと思う．

#結論
Nano Pi NEO2 の開発環境を整えることができた．

#参考文献
- http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO2
-  https://qiita.com/sttn/items/567c9f49b88ff275b51a
- http://www.shangtian.tokyo/entry/2017/12/20/082512
- https://www.jh1lhv.tokyo/entry/2017/08/21/213816