OmniAICreator/Qiita-1.07M huggingface dataset:
ARKitでオブジェクトの方向を求めたい

Swift4.0でARKitを使いたくて、簡単なARシューティングゲームを作ってみました。そのときに、的となるオブジェクトを見失った時にヒントととしてオブジェクトの方向を出すようにしたいと思って実装して見たところ、結構教育的て面白かったので記事にしてみます。
同じように方向を計算したいという場合は参考にしてください。

# 全体のコード
最初に全体のコードを先に載せてしまいます
https://github.com/kamata1729/AR_Buster

#アプリの流れ
初めは`RootViewController`に入り、STARTボタンを押して`ARViewController`に遷移し、ゲームが終了すると`ResultViewController`に入る。
 ![](https://i.imgur.com/n8LORSu.png)
`ARViewController`では、下の図のようにオブジェクトがランダムな位置に出現してランダムに動くので、それを制限時間内にタップして消していくというゲームです。

<img src="https://i.imgur.com/mGVjOXW.png" width="400">

今回は、主にこれの**右下の矢印**の部分の実装を解説します。

# 三次元の方向を二次元に射影して表現する
やりたいことは、カメラ（iPhone）からオブジェクトまでの３次元空間での方向を、iPhoneの二次元の画面上に射影して表現することです。そのためにはまず、**オブジェクトの位置が記述される座標系を、絶対座標系$E$から、カメラ(iPhone)とともに動く座標系$E'$に座標変換**する必要があります。

![](https://i.imgur.com/pm64yPT.png)

座標変換した後は、座標系$E'$上でカメラとオブジェクトの角度$\theta$は、
$\theta = \arctan \dfrac{y'_2 - y'_1}{x'_2 - x'_1}$
として求めることが可能です。

![](https://i.imgur.com/uZI9OkN.png)

この部分の実装方法は以下のようになっています。

```swift
if let node = self.sceneView.scene.rootNode.childNodes.first { 
    if let camera = self.sceneView.pointOfView {                     
        let invMat :SCNMatrix4 = SCNMatrix4Invert(camera.transform) 
        let x = node.position.x 
        let y = node.position.y 
        let z = node.position.z 
        let transPosition :SCNVector3 = SCNVector3(x: x*invMat.m11 + y*invMat.m21 + z*invMat.m31, y: x*invMat.m12 + y*invMat.m22 + z*invMat.m32, z: x*invMat.m13 + y*invMat.m23 + z*invMat.m33) 
        let angle = (-1) * atan2(transPosition.y - camera.position.y, transPosition.x - camera.position.x) 
        imageView.transform = CGAffineTransform(rotationAngle: CGFloat(angle)) 
    } 
} 
```
1行目：オブジェクトを取得
2行目：カメラ(iPhone)を取得
3行目： 
`camera.transform`で、原点からカメラの位置への4×4の変換行列を取得する。
（4×4の変換行列について参考：https://qiita.com/kengo1008L/items/2d7319772e08f9465294）
これの逆行列を`SCNMatrix4Invert`で計算する。（変換行列は直交行列なので逆行列は存在）
4~6行目：オブジェクトの絶対座標系$E$での座標$(x,y,z)^T$を取得
7行目：
先ほど計算した逆行列のうち、回転角に関係する3×3の成分を$(x,y,z)^T$にかけることで、カメラとともに動く座標系$E'$に変換
8行目：回転角を計算
9行目：矢印の画像を`CGAffineTransform`で回転

`camera.transform`を使って、カメラの座標系に座標変換することが肝です。方向を計算したいときは参考にしてみてください。
TrueTypeフォントがインストールできなかった件

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Windows10 (Inside Preview)フォントのインストールできないの僕だけ...？</p>&mdash; Minimum-Opusᕱ⑅ᕱ (@MinimumOpus) <a href="https://twitter.com/MinimumOpus/status/1027894845908516864?ref_src=twsrc%5Etfw">2018年8月10日</a></blockquote>
まだ初めて間もないのですが[ブログを書いておりまして](http://minimum-opus.blog.jp)、
そのバナー作成に「GN-キルゴU」というフォントを使おうと思いました。
(この記事もそこからの転載です。もしよかったら遊びに来てね！)
ですが、しばらくインストールできず、ChromeでWebフォント指定してキャプチャ→ペイントに持っていくというクソみたいな方法でバナーは作る羽目になりました。

今回解決方法がわかったので、こんなくそみたいな手法みんながしなくて良いように公開しておこうと思います。

環境
====
 - Windows 10 Pro 64bit @ Insider Preview build-17723
 - ユーザー権限: 管理者
 - ユーザーアカウント制御: 通知しない(無制限)

インストールできなかった方法
==========================
1. フォントのプレビュー→インストール
---------------------------------
![Clipboarder.2018.08.15-005.png](https://qiita-image-store.s3.amazonaws.com/0/278909/dc4925ab-1b3a-5355-dbe3-ad1cf82f3277.png)
...まぁ、一番シンプルにこれですよね？というかこれになれすぎて他の方法をぶっちゃけ知らないレベルです。...**が**、
![Clipboarder.2018.08.15-007.png](https://qiita-image-store.s3.amazonaws.com/0/278909/a5a866ee-1784-0b6d-56e8-c95b485b22a5.png)
...お気に召さなかったようです。

2. コントロールパネル→フォント からドラッグアンドドロップ
-----------------------------------------------------
![Clipboarder.2018.08.15-006.png](https://qiita-image-store.s3.amazonaws.com/0/278909/d0777dee-33cb-7b76-a527-588ca030282d.png)
ここにドラッグアンドドロップしてもフォントをインストールできるはずなのですが...
同じメッセージが出てできず！
...どうすりゃええのよ

インストールできた方法
====================
### 右クリックして気づいた、「なにかおるぞ！？」###
万策尽きてポチポチクリックしていたときに気づいてしまいました...
![scs.png](https://qiita-image-store.s3.amazonaws.com/0/278909/3e27e494-96f0-c230-4996-ab33476678bd.png)
**...あれ？なにか知らんやつがおる...**
そして藁にもすがる思いでクリックすると...
![font2.png](https://qiita-image-store.s3.amazonaws.com/0/278909/1e842637-d916-f76c-a96b-0e90880d2c33.png)
**インストールできてるわ...**
# インストールできてるわぁぁぁぁぁぁぁぁぁぁ！！！！

...あれです、
**灯台下暗し！！！**
ちゃんと探そうね！
ImageMagickチートシート

# 画像にボーダーをつける

色に迷ったら[Webセーフカラー](https://www.colordic.org/s/)から

```sh:上下左右2pxの灰色のボーダーをつける
convert _01.png -bordercolor "#CCCCCC" -border 2x2 01.png
```

# PNGのdpiを変更する

```sh
convert _result.png -density 144 -units PixelsPerInch result.png
```

from: https://saba.omnioo.com/note/2040/2040/


# 画像を結合する

https://qiita.com/foo9/items/f930358d379c0fa9ceb5

# 高さだけ指定してリサイズする

```sh
convert vegetable_wasabi.png -resize x100 wasabi.jpg
```

- PNGからJPEGに変換する場合、透過色は`#000000`になる模様
- どうやったら透過色を指定できるのかまだよくわかってない
Python3系にてマルチスレッドでUDP通信

主に自分用のメモです。
# はじめに

- Pythonでメインのプログラムの傍らUDP通信をしたい
- マルチスレッドで通信内容を共有したい

ということで複数スレッドを立てて，片方のスレッドでUDPを受信しつつもう片方のスレッドで別の作業をできるようにします。

参考にしたページ群を以下に追記していきます。
- https://qiita.com/slowsingle/items/20d4d601a85470725eb3


# マルチスレッド

簡単なマルチスレッドでよければPythonのthreadingを用います。

- https://qiita.com/komorin0521/items/c25cfcff89c0b1afe882
- https://qiita.com/castaneai/items/9cc33817419896667f34



# UDP通信

以下の記事をソケット通信実装の参考にしました。

- https://qiita.com/msrks/items/0550603efc59f6e8ba09
- https://yukun.info/python-udp-socket-server-client/


- UDPとTCPの詳しい違いに関して：[記事](http://gihyo.jp/admin/serial/01/net_prac_tech/0007)

[UDP通信とマルチスレッドに関する記事](https://qiita.com/slowsingle/items/20d4d601a85470725eb3)はTCPで通信しており，UDPに変える必要がありますね。


## UDP クライアント

標準入力から入力を取得して送信するクライアントのプログラムをかきました。

`client.py`

```python
# coding: utf-8
from socket import *
HOST = gethostname()
PORT = 34512
BUFSIZE = 1024
ADDR = (gethostbyname(HOST), PORT)
USER = 'Client'
udpClntSock = socket(AF_INET, SOCK_DGRAM)
while True:
    data = input('%s > ' % USER) # 標準入力からのデータ入力
    udpClntSock.sendto(data.encode('utf-8'), ADDR) # データ送信
    #udpClntSock.setblocking(0)# Non blocking
    if not data:
        break
udpClntSock.close()
```


UDPなのでソケットを作ってぶち込むだけです。

## サーバー側

サーバー側では別のスレッドを立ててそこで受信を待ちつつ，main関数で受信した文字列を閲覧しています。
グローバル変数でも良いらしいですが，クラス変数を参照することによってわかりやすくなっています。

自分的ポイントは

- クラスの定義でThreadを継承
- 受信データをクラス変数に格納してmainで読めば良い

ってとこでしょうか。

```python
import threading
import time
from socket import *

class ServerThread(threading.Thread):
    def __init__(self, PORT=34512):
        threading.Thread.__init__(self)
        self.data = 'hoge'
        self.kill_flag = False
        # line information
        self.HOST = gethostname()
        self.PORT = PORT
        self.BUFSIZE = 1024
        self.ADDR = (gethostbyname(self.HOST), self.PORT)
        # bind
        self.udpServSock = socket(AF_INET, SOCK_DGRAM)
        self.udpServSock.bind(self.ADDR) # HOST, PORTでbinding

    def run(self):
        while True:
            try:
                data, self.addr = self.udpServSock.recvfrom(self.BUFSIZE) # データ受信
                self.data = data.decode()
            except:
                pass
                
if __name__ == '__main__':
    th = ServerThread()
    th.setDaemon(True)
    th.start()

    while True:
        if not th.data:
            break
        print(th.data)
        time.sleep(0.1)
```



## UDPサーバー
[非同期通信を行ったブログ](http://rinor.hatenablog.com/entry/2015/07/29/234600)が参考になります。


# メモなど
## strとbyte型の変換
Python3ではソケットを送る際にstr型からbyte型への変換を求められます。

str型はともかく，byte型とは`b'hogefuga'`で表される文字列で，''の前にbを入れればOKです。

また，encodeとdecodeで変換できます。

```python
>>> 'hogefuga'.encode('utf-8')
b'hogefuga'
>>> b'hogefuga'.decode('utf-8')
'hogefuga'
```
この`utf-8`を入力しないでも一応変換してくれますがデフォルトの変換がどのようなものかわからないので一応入れておくようにしましょう。



## 非同期通信を用いる
マルチスレッドの他にもノンブロッキングプロセスという仕組みを用いて通信待ちをしながら別の処理ができます。
気が向いたら追記します（PCの電池が切れそう）

[ノンブロッキングプロセスに関してはこちら](https://qiita.com/icoxfog417/items/07cbf5110ca82629aca0)。
Amazon EC2 - ElasticIP

**■ElasticIPとは**
固定IPです。


**■料金**
$0.00 : 実行中のインスタンスと関連付けられている Elastic IP アドレス 1 つ
$0.005 : 実行中のインスタンスと関連付けられている追加の Elastic IP アドレスあたり/1 時間（比例計算）
$0.005 : 実行中のインスタンスと関連付けられていない Elastic IP アドレスあたり/1 時間（比例計算）
$0.00 : Elastic IP アドレスのリマップ 1 回あたり（1 か月間で 100 リマップまで）
$0.10 : Elastic IP アドレスのリマップ 1 回あたり（1 か月間で 100 リマップを超える追加分）

もう少し噛み砕いて説明します。

・料金が発生しない場合 
基本的に 1 つだけです。
1.起動しているEC2インスタンスで、EIPを1つだけ使用している場合

・料金が発生する場合
無料枠で利用しており、EC2を停止している場合は 1 や 2 に該当しそうなのでで注意！！
1.EIPを関連付けているEC2インスタンスが停止している場合　
2.EC2に関連付いていない（= 使わずに放置されている）EIP　
3.関連付いているEC2は起動しているけれども、ふたつ目以降のEIPの場合
4.EIPの「リマップ(remap)」を、1ヶ月に100回以上行った場合（101回目以降について $0.1）


**■その他**
接続先でIPアドレスの制限がある場合、ElasticIPを用いてグローバルIPアドレスを固定化させて制限することも可能です。
このような場合、インスタンスごとに付与されるElasticIPを１つずつ登録すると手間になるため、NATゲートウェイを利用し、NATゲートウェイにElasticIPを付与することで、1つのグローバルIPアドレスに集約することができます。


**■逆引きDNS**

- [[2021/02/03]一部のリージョンで Elastic IP の逆引きDNSをカスタマイズできるように](https://aws.amazon.com/jp/about-aws/whats-new/2021/02/amazon-virtual-private-cloud-vpc-customers-customize-reverse-dns-elastic-ips-eip/)

今まではサポートにDNS逆引き申請をする必要がありましたが、*一部のリージョン*においてコンソールからできるようになりました。
![スクリーンショット 2021-02-07 13.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/93d73b19-3f03-5668-c7aa-2e1a1e590726.png)
⬇️
![スクリーンショット 2021-02-07 13.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/102e355f-4599-8889-41f1-cba1e5141251.png)
ラグランジュ運動方程式による振り子の動作シミュレーション

# ラグランジュ運動方程式による振り子の動作シミュレーション
振り子の運動を解析するには以下の２つの方法がある。

- ニュートン運動方程式 ２つの方向の２変数が必要になる
- ラグランジュ運動方程式 一般化座標として角度を選択することにより１変数となる

この投稿ではラグランジュ方程式による振り子の運動方程式を導出を行い、Siv3Dを使用して可視化する。

## 振り子の運動方程式の導出
質点の運動エネルギーをT, 位置エネルギーをUとしたときにラグランジアンLは以下の式で表せます。

$$ L = T - U $$
CakePHP入門（１） 〜初期設定〜

# 背景
Railsに続いてCakePHP 3の勉強を始めたのですが、参考書が少ない＆Railsチュートリアルのような分かりやすいサイトが無いため、とても勉強しづらいと感じました。

ということで、学んだ基礎的な内容をまとめ、自分でいつでも参照できるよう、書き留めることにしました。書いたことが、CakePHP初心者の方の参考になれば幸いです。

※MVC型のフレームワークに関する知識がある前提とします。

# 環境
MAC 10.13
MAMP 4.5
CakePHP 3
MySQL 5.6

# 内容
まずは、以下のコマンドでプロジェクトを作成します。

```
$ composer create-project --prefer-dist cakephp/app [アプリ名]
```

次に、プロジェクトで利用する DB を作成します。

```
$ mysql -u root -p
mysql> create databases [DB名];
```
作業用ユーザーを作成し権限を与えます。

```
mysql> create user [user名]@localhost identified by [パスワード];
mysql> grant all on [DB名].* to [user名]@localhost;
```

config/app.php の Datasources に、DB名、ユーザー名、パスワード、タイムゾーンを設定します。

``` php:app.php
    ...

    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',

            'username' => 'my_user',
            'password' => 'segk46dfkl8jdsn',
            'database' => 'my_db',

            'timezone' => '+09:00',
            'flags' => [],
            'cacheMetadata' => true,
            'log' => false,
    ...
```

config/bootstrap.phpのタイムゾーンも変更しましょう。

```php:bootstrap.php
...

date_default_timezone_set('Asia/Tokyo');

...
```

初期設定は以上です！
MVCファイルの作成、編集については（２）以降で書いていきます。

CakePHP入門（２）〜ファイルの作成〜
https://qiita.com/jinto/items/fe1da36b65fd6e704338

CakePHP入門（３）〜レイアウト〜
https://qiita.com/jinto/items/c9138faf65e417616086

CakePHP入門（４）〜バリデーション〜　
https://qiita.com/jinto/items/ebdc8b673b5b663de7df
ゼロからはじめるやさしいVim

モテたくてVimをちゃんと使い始めて２週間くらい経ちました。
Vim使ってる人ってかっこいいけど、初心者のためのVim入門みたいなのを見ても、コマンド多すぎでとにかくとっつきづらいと思ってました。
そんな私でも最近少しVim充できるようになるようになってきたので、もしかすると頑張りすぎなくてもVimとの仲を深められるかもしれません。

# 対象読者

* Vim使ってモテたいと思ってる人
* でもちょっと調べてはい無理〜ってなってる人

# Vimを開いて書いて保存して閉じる

とりあえず開いて保存して閉じるまではできる、と言う人は多いと思います。
私は初めてVimでファイルを開いた時、閉じるコマンドが打てずにあたふたしてました。

## 開く

ターミナルを開いて、とりあえずVimコマンドでなんか開きます。
指定したファイルがなかったら勝手に作ってくれます。

```bash
vim hoge.txt
```

## 書く

開いたらなんか書きたいですよね。
キーボードの`i`を押すと書けるようになるので`hogehoge`とか書きます。

## 保存する

残念ながら`Ctrl + s`では保存できません。
`Ctrl + [`キーを押してから、`:`+`w`+`Enter`で保存できます。
`w`はwriteの頭文字なのでそう覚えます。
この時`:w`と左下に表示されているのを確認してから`Enter`ターンッします。

## 閉じる

保存した時と同じように、`:`+`q`+`Enter`でVimでの編集を終了してファイルを閉じます。
保存しない場合は`:q!`、保存と終了を一気に行う場合は`:wq`でいけます。

ここまではVimを触ったことがあれば余裕ですね。

# モードを切り替える

Vimにはモードという概念があります。
モードによってできることが違うのがVimの難しいところですよね。
とりあえずプチVim充するためには、この２つを行き来できれば大丈夫。

* ノーマルモード
* インサートモード（ノーマルモードから`i`で入って`Ctrl + [`で抜ける）

そしてノーマルモードの使い方を少し覚えれば、おっVim使えそう、って思えます。（多分）

# ノーマルモード

## ノーマルモードとは

Vimを開いた瞬間のモードがノーマルモード。
Vimっぽいコマンドが色々使える。保存とか終了のコマンドを使っていたのもノーマルモード。
基本的に書いてる時以外はノーマルモードにいるのがVimmerの嗜みで、ノーマルモードでチャカチャカとコマンド使って編集するのがかっこいい。

*※追記:以下ではビジュアルモードも扱っていますが(範囲選択)、区別しなくても困らないと思うためこのように書いています。*

## ノーマルモードでやりたいこと

ノーマルモードでは色々出来すぎて覚えられなくて挫折しますが、Vim始めたての私はとりあえずこれだけ覚えました。
とりあえずこれだけで闘えます。

* カーソル移動
* 文字列削除
* コピペ

### カーソルの移動

ご存知の通り矢印キーで移動していてはVimmerにはなれません。

まずはこれ

`h`:← `j`:↓ `k`:↑ `l`:→

慣れるまでは割と辛いですがホームポジションで移動できるのは本当に快適になります。頑張りましょう。
とはいえ一文字づつ移動するのは苦行なので、左右には単語単位で移動できれば便利です。

`b`:単語の先頭へ移動 `e`:単語の末尾に移動

ざっくり移動してから`h`と`l`で微調整する感じで使いましょう。

上下は、

`Ctrl + u`:半ページ上へ移動 `Ctrl + d`:半ページ下へ移動

10000行とかのソースコードでなければ、とりあえずこれでほとんど対処できると思います。

### 文字列削除

削除するときはインサートモードに入って一文字ずつ、ではなくガバッと消したいので、最低限覚えました。

`x`:一文字削除
`dd`:行削除

範囲選択削除も覚ておきたいですね。

`v`を押してから`h j k l`で範囲選択→`d`で削除。
（`Shift + v`で行選択）

範囲選択を途中でやめる場合は、`Ctrl + [`で。

### コピペ

一応マウスでもできますがコマンドでやりたいですよね。

`v`を押してから`h j k l`で範囲選択→`y`でコピー
`v`を押してから`h j k l`で範囲選択→`d`で切り取り
貼り付け位置に移動して、`p`で貼り付け

# まとめ

ここまで挙げたコマンド一覧

**ファイル操作**
`:w`:保存
`:q`:編集終了
`:q!`:保存せずに終了
`:wq`:保存して終了
**モード切り替え**
`i`:インサートモードへ移動
`Ctrl + [`:ノーマルモードへ移動
**カーソル移動**
`h`:← `j`:↓ `k`:↑ `l`:→
`b`:単語の先頭へ移動 `e`:単語の末尾に移動
`Ctrl + u`:半ページ上へ移動 `Ctrl + d`:半ページ下へ移動
**範囲選択**
`v`を押して`h j k l`:範囲選択
`Shift + v`:行選択
**文字列削除**
`x`:一文字削除
`dd`:行削除
`d`:選択範囲削除。
**コピー切り取り貼り付け**
`y`:コピー
`d`:切り取り
`p`:貼り付け

こうしてみると20個もあるやんけって感じですが、見ながら使ってればなんだかんだすぐ覚えられると思います。
私の場合、一気にたくさん覚えるのは心が折れるので、最初２日３日は気が向いたときにVimを使って、これくらいの最低限のコマンドをチートシート見ながら覚える、くらいのカジュアルさで初めてみました。
特にカーソル移動に慣れてくるとこれだけでもある程度編集もスムーズになってくるので、不便だと思ったことを調べて、使えるコマンドとかプラグインを増やしていくという感じで無理なくVimと付き合ってます。

これからもよきVim充ライフを送っていきたいですね。
windows10 virtualbox centOS7 でdockerをインストールする

前提
virtulboxインストールがされていること
Tera Termがインストールされていること
centOSの仮想環境が作られていること

こちらを参考に設定してTera TermでcentOSの中に入る。

[山崎屋の技術メモ　VirtualBox に入れた CentOS のネットワーク設定]
(https://www.shookuro.com/entry/2018/02/10/172724)

```
// とりあえずアップデート
yum update -y

// dockerインストール
curl -sSL https://get.docker.com/ | sh

// dockerスタート
systemctl start docker
```

私はここで、次のエラーが出ましたが、エラーと同時に鍵が作成されたらしく、

```
warning: /var/cache/yum/x86_64/7/docker-ce-edge/packages/docker-ce-18.06.0.ce-3.
docker-ce-18.06.0.ce-3.el7.x86_64.rpm の公開鍵がインストールされていません
```

再度dockerをインストールしましたら起動しました。

```
curl -sSL https://get.docker.com/ | sh
systemctl start docker
```

参考にさせていただきました。
ありがとうございました。

[めもたんす CentOS７へのDockerのインストール]
(https://www.memotansu.jp/docker/214/)

[山崎屋の技術メモ　VirtualBox に入れた CentOS のネットワーク設定]
(https://www.shookuro.com/entry/2018/02/10/172724)
情報処理安全確保支援士を取得するための学習ログ　その3

# 初めに
この度、自分のスキルアップのために情報処理安全確保支援士の資格を取ることになりました。セキュリティに関する知識が乏しいため、勉強をしていくなかで普段の業務のセキュリティに関する知識を吸収することも目的としています。

# 本ブログの目的
このブログは、僕が情報処理安全確保支援士の勉強に使っている参考書[「うかる！情報処理安全確保支援士2018年版」](https://www.amazon.co.jp/情報処理教科書-情報処理安全確保支援士-2018年版-上原-孝之/dp/4798154180)の内容を自分で振り返るためのアウトプットの場にしようと思います。

# 1.3情報セキュリティマネジメントの基礎
情報セキュリティマネジメントとは、「明確な方針や規定に基づいて、組織の情報資産の機密性、完全性、可用性などの特性を適切に維持・管理すること」と定義できる。
情報セキュリティマネジメントは、PDCAサイクルを繰り返すことが望ましい姿と言える。PDCAサイクルとは、計画・策定（Plan）、導入・運用（Do）、評価・点検（Check）、見直し（Act）の四つのステップのサイクルのこと。
ISMSに関する国際規格は、ISO/IEC2700ファミリーと呼ばれており、これらの規格文書群に基づいた認証制度がISMS適合性評価制度である。

# 用語解説
「用語解説」で出てきた用語をまとめます。

## トップマネジメント
最高位で組織を指揮・管理し、組織内で権限を委譲し、資源を提供する力を持っている個人又は人々の集まり。

## リスクの需要
リスクの存在を認識しながらも、それを受け入れること。

## リスクコントロール
リスクに対応し、発声を抑制したり、損失を低減したりすること。

## リスクの回避
リスクの根本原因を排除すること。

## リスクの移転
契約等を通じてリスクを第三者へ移転すること。

## リスク所有者
リスクを運用管理することについて責任と権限を持つ人。

## マネジメントレビュー
経営陣がISMSの効果を把握し、改善するための意思決定を行う一連のプロセス。

# 理解度チェックテスト
Q1.ISMSの管理策は全部で何項目あるか。
Q2.ISMS確立までの流れの概要を示せ。
Q3.ISMSの浸透を図るためにはどのようなことを行うべきか。

# 前記事の理解度チェックテストの答え
前記事は[こちら](https://qiita.com/kabachanta/items/fae540652446734df3c5)

A1.「機密性」「完全性」「可用性」
A2.情報資源にアクセスする人間、プロセス、プログラム等に対して、常に必要最小限の権限のみを付与するように徹底すること。
A3.業務ごとに担当を適切に分離すること。
初めて投稿してみる。

paizaでプログラムの勉強中。
備忘録みたいに書いてみるけど、
書く場所はここじゃないと気がするけど初めてだしとりあえず書いてみる。
変数名とか適当に
◆--------------◆
標準入力で受け取ってを時刻を修正して表示してみる。
【入力】　08/01　26：30
【出力】　08/02　02：30

今回ちょっと手こずったのが
08/01　みたく二桁に表示するために
"%02d" % 8　==出力==> 08
もし"008"とする場合
"%03d" % 8　==出力==> 008
これで変換してみる。
time　を使えば直せるかと思ったけど通らなかったので今回はこれで。
テストは通って本番もパスしたけど絶対にもっと短くできるはずー。
ライブラリとかメソッドとか勉強しないとなぁ
サーバ証明書のデジタル署名は一体何に署名しているのかわからなくなったので慌てて調べなおした

# はじめに
openvpnの設定をやっていると、サーバ証明書って何なのかがわからなくなった。特にCAのデジタル署名がわからなくなった。
デジタル署名は何かのデータに対してハッシュ値を求めて、秘密鍵で暗号化しているのはわかっている。
しかし、一体何のデータをハッシュ化して秘密鍵で暗号化している(署名)しているのか。

#対象読者
SSLとかopenvpnでデジタル署名とデジタル証明書がもはや何が違うのかがわからなくなった彷徨うヨロイの人。


#こうだった
下はサーバー証明書の絵。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/228050/08511392-494e-4d0e-d6f7-025cdac8c911.png)

サーバ証明書のデータの一部（オレンジ）をそのまんまCAの秘密鍵で暗号化（CAのデジタル署名）しているだけだった。
そうだった。そんな話だった。

で、クライアントはCAの公開鍵を使ってデジタル署名を復号すると、サーバ証明書の一部のデータに対するハッシュ値が求まる（灰色と同じ値）。
そんで、クライアントはサーバ証明書を受け取っていてオレンジ部分を自分でもハッシュ化してみる。見事同じ灰色の値になったらOK。
オレンジ部分が改ざんされてたら、同じ灰色にはならないから、アウト。そんな感じだった。
Railsで遷移元のcontroller、action名などを取得する方法とエラー対応

#はじめに

Railsで遷移元(直前)のcontrollerやaction名を取得するやり方について説明する。また、途中でエラーのため詰まった部分があったので、その時の対処法も記しておく。

#やり方

```ruby:controller
path = Rails.application.routes.recognize_path(request.referer)
```

これだけです。
個別にcontrollerやactionを呼び出したいときは以下。

```ruby:controller
#controllerを取得
path[:controller]

#actionを取得
path[:action]
```

#エラー対応
`No route matches`というエラーが発生。

```ruby:controller
before_uri = URI.parse(request.referer)
path = Rails.application.routes.recognize_path(before_uri.path)
```

これで解決した。
SVD（Singular Value Decomposition = 特異値分解）

## F行列推定のためのSVDに関するノート
　
用途：F行列推定（=8点アルゴリズム）で8点以上の点から最適解を解析的に計算するのに使用




















概要：SVDは固有値解析と同様，ある行列を，対角行列のような疎行列に両側から正規直行行列を掛けた形式に分解する．

$$ A = U\Sigma V^\mathsf{T} $$
行列のサイズを表記すると，
$$ A_{m\times n} = U_{m\times m} \Sigma_{m\times n}V^\mathsf{T}_{n\times n}$$

これが何故F行列の推定に使えるかというと，与えられた行列$A$に対し，
$$ A\mathbf{f}$$
のノルムを最小にする，(ノルムが0でない)ベクトル$\mathbf{f}$を計算することが可能であるからである．

### F行列の推定
F行列の推定では，様々なベクトル対$\mathbf{b_1^n}$と$\mathbf{b_2^n}$（＝特徴点対応）に対し，
$$\mathbf{b_1^n}^\mathsf{T}F\mathbf{b_2^n} = 0$$ 
となるFを計算する．
ベクトル対が8つの場合，この等式が成立するFが存在するが，特徴点対応が誤差を含んでいることから，9個以上の正しいと判断された対応からFを推定する方が良い．
そのため，全てのnについて$e^n=\mathbf{b_1^n}^\mathsf{T}F\mathbf{b_2^n}$の2乗和が小さいような$F$を導出したい．
ここで，行列の表記を変える．

````math
\mathbf{b_1}=
\left[
\begin{matrix}
b_{11}\\
b_{12}\\
b_{13}
\end{matrix}
\right]
, 
\mathbf{b_2} = 
\left[
\begin{matrix}
b_{21}\\
b_{22}\\
b_{23}
\end{matrix}
\right]
,
F=
\left[
\begin{matrix}
f11 & f12 & f13 \\
f21 & f22 & f23 \\
f31 & f32 & f33 
\end{matrix}
\right]
````



とすると，



````math
e = b_{11}b_{21}f_{11} + b_{11}b_{22}f_{12} + b_{11}b_{23}f_{13} + b_{12}b_{21}f_{21} + b_{12}b_{22}f_{22} + b_{12}b_{23}f_{23} + b_{13}b_{21}f_{31} + b_{13}b_{22}f_{32} + b_{13}b_{23}f_{33}\\
= [b_{11}b_{21} + b_{11}b_{22} + b_{11}b_{23} + b_{12}b_{21} + b_{12}b_{22} + b_{12}b_{23} + b_{13}b_{21} + b_{13}b_{22} + b_{13}b_{23}]

\left[
\begin{matrix}
f_{11}\\
f_{12}\\
f_{13}\\
f_{21}\\
f_{22}\\
f_{23}\\
f_{31}\\
f_{32}\\
f_{33}
\end{matrix}
\right]
````

よって，ベクトル対がN個あった場合，

````math
\left[
\begin{matrix}
e^1 \\
e^2 \\
\vdots \\
e^N
\end{matrix}
\right]

=

\left[
\begin{matrix}
b_{11}^1b_{21}^1 + b_{11}^1b_{22}^1 + b_{11}^1b_{23}^1 + b_{12}^1b_{21}^1 + b_{12}^1b_{22}^1 + b_{12}^1b_{23}^1 + b_{13}^1b_{21}^1 + b_{13}^1b_{22}^1 + b_{13}^1b_{23}^1\\
b_{11}^2b_{21}^2 + b_{11}^2b_{22}^2 + b_{11}^2b_{23}^2 + b_{12}^2b_{21}^2 + b_{12}^2b_{22}^2 + b_{12}^2b_{23}^2 + b_{13}^2b_{21}^2 + b_{13}^2b_{22}^2 + b_{13}^2b_{23}^2\\
\vdots\\
b_{11}^Nb_{21}^N + b_{11}^Nb_{22}^N + b_{11}^Nb_{23}^N + b_{12}^Nb_{21}^N + b_{12}^Nb_{22}^N + b_{12}^Nb_{23}^N + b_{13}^Nb_{21}^N + b_{13}^Nb_{22}^N + b_{13}^Nb_{23}^N
\end{matrix}
\right]


\left[
\begin{matrix}
f_{11}\\
f_{12}\\
f_{13}\\
f_{21}\\
f_{22}\\
f_{23}\\
f_{31}\\
f_{32}\\
f_{33}
\end{matrix}
\right]
````

左辺を$\boldsymbol{e}$, 右辺の$b$の行列を$A$, $f$の行列を$\boldsymbol{f}$とすると

$$
\boldsymbol{e} = A\boldsymbol{f}
$$

ここで，推定したいF行列は，$argmin_\boldsymbol{f} ||\boldsymbol{e}||（||\boldsymbol{f}||=1)$と表記できる．
これを計算するためにSVDを用いる．

SVDによって $A$は
$$A_{N\times 9} = U_{N\times N}\Sigma_{N\times 9} V^\mathsf{T}_{9\times 9}$$

と分解される．
$V$を移項して
$$ A V = U \Sigma$$
ここで$\Sigma$の特異値が降順であるとすると，$i$個目の特異値は$\sigma_i$である．
$V$の第$i$列$\boldsymbol{v_i}$と$U$の第$i$列$\boldsymbol{u_i}$より，

````math
 A\boldsymbol{v}_　i = \sigma_i \boldsymbol{u}_i
````

両辺のノルムをとって

````math
||A\boldsymbol{v}_　i|| = ||\sigma_i \boldsymbol{u}_i|| = \sigma_i
````

9番目の特異値$\sigma_9$が最小のため，$i$=9としたとき$||A\boldsymbol{v}_　i||$が最小となる．

よって，$V$の9番目の列ベクトル$\boldsymbol{v}_9$を並び替えた$3\times 3$行列が求めたいF行列である．
setState 以降が実行されない

コードはこんなやつでした↓

```tsx
private someMethod = () => {
    this.setState({
        content: 'Hoge'
    })
    
    // ここから下にいろいろと
    // Firebase の Realtime Database のリスナー登録とか
```

コメント行以降は実行されなかった。

```tsx
private someMethod = () => {
    // 下に書いていた処理

    this.setState({
        content: 'Hoge'
    })
}
```

こうすると　ちゃんと実行された。
`setState` は `return` 的なものなんだろうか。
これで数時間無駄にした。
常識だったらごめんなさい。
Ubuntu18.04にインストールしたAtomで日本語入力が出来ない場合の対処法

#環境
Ubuntu18.04 64bit
(windows10 64bit Hyper-Vで構築した仮想環境)

#症状
Atomで日本語入力ができない

#条件
Ubuntuソフトウェア経由でAtomをインストールした。

#解決策

1. 一旦、AtomをUbuntuソフトウェア経由で削除（アンインストール）する。
2. [Atom公式サイト](https://atom.io/)からダウンロードしたインストーラを使って、新しくインストールし直す。
3. 再起動。

#参考
[Ubuntu 18.04のAtomで日本語入力できない？できるよ！](http://blog.livedoor.jp/tsuchiyano/archives/52205027.html)
>Ubuntuでも採用されているパッケージ管理システムであるSnapという仕組みで配布されるバイナリは，日本語入力に対応していないバイナリになっている，ということだと認識しました...あってるかな？Snapは多くのLinuxディストリビューションで使用可能なパッケージ管理システムで，もちろんUbuntuでも使用されている...というような認識．
HLSL Tools for Visual Studioで快適なUnityシェーダー開発をしていく

 (Unity2018.2, VS2017現在)

UnityとVisual Studioで開発してるそこのあなた、
シェーダー書いてますよね。
なんかC#書いてるときより苦しいですよね。
少し楽になれる方法教えます。

1. VSのプラグインの紹介
2. それだけじゃダメなところを紹介
3. ダメなところを改善
4. さらに改善

## HLSL Tools for Visual Studio

[HLSL Tools for Visual Studio](https://marketplace.visualstudio.com/items?itemName=TimGJones.HLSLToolsforVisualStudio)

![gif](https://github.com/tgjones/HlslTools/raw/master/art/go-to-definition.gif)

HLSLだと補完効いたりしてなんかVisual Studioっぽい感じになって嬉しいやつです。

## けどShaderLabの拡張子って `.shader`じゃん、使えないやんけ!

鋭い方々はこう思うかもしれません。
`.shader`拡張子にもHLSL Toolsを反応させることもできますが、HLSLじゃないShaderLabの部分に反応して不快です。

## HLSLじゃないならHLSLにしてしまえ

そうするのではなく、以下のようなコードを書けば快適になります。

```hoge.shader

Shader "Hidden/Hoge"
{
    SubShader
    {

        Pass
        {
            HLSLPROGRAM
            #pragma vertex VertDefault
            #pragma fragment Frag
            #include "hoge.hlsl"
            ENDHLSL
        }
    }
```

```hoge.hlsl
#include "PostProcessing/Shaders/StdLib.hlsl"
TEXTURE2D_SAMPLER2D(_MainTex, sampler_MainTex);
half4 Frag(VaryingsDefault i) : SV_Target
{
    float2 uv = i.texcoord;

    // Source color
    half4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
    half3 luminance = dot(color.rgb, half3(0.2126729, 0.7151522, 0.0721750));
    color.rgb = luminance;
    return color;
}
```

こうすることでロジックのほとんどをHLSLにまとめてHLSL Toolsの恩恵に授かれます。
ちなみにこの開発スタイルはUnityの[Keijiro Takahashi](https://github.com/keijiro/kino)さんを参考にしています。

しかし！これだけだと `#include "PostProcessing/Shaders/StdLib.hlsl"` で「こんなファイル知らんぞ」って怒られます。
Unityが見ているパスと、HLSL Tools for Visual Studioが見ているパスは違うのでHLSL ToolsにPostProcessing Stackのパスを教えてあげないといけません。

## shadertoolsconfig.jsonを使ってHLSL ToolsでもUnityのデフォルトシェーダーをincludeする

HLSL Tools for Visual Studioは`shadertoolsconfig.json`というファイルを現在開いているファイルのパスの親をたどりながら探します。
なので、Unityプロジェクトのルートディレクトリに `shadertoolsconfig.json` を入れておくとそこを基準にたどってくれます。
![ディレクトリ構成](https://qiita-image-store.s3.amazonaws.com/0/100271/a6b763f6-cd9a-56b5-8b32-bfc85c9de111.png)
Assetsとかがあるパスと同じところです。

Unityはデフォルトで `Unity/Editor/Data/CGIncludes` というパスからシェーダーをいくつかインポートしています。そこでUNITY_MATRIX_MVPなどのマクロが入っていたりします。([ここに全部載ってます](https://docs.unity3d.com/Manual/SL-BuiltinFunctions.html))

また、最近のUnity（5以来久々に触ったのが2018.2なのでいつ入ったかわからないのですが)はなんかPackage Managerとかいう機能が入っていて、PostProcessing Stackはそれを使ってプロジェクトに取り込みます。そうすると、`Assets/`配下ではなくProjectウィンドウの下のほうに生えたPackagesとかいうところに居ますが、プロジェクトのどこを探しても見つからないです。
Packageは`C:\Users\%username%\AppData\Local\Unity\cache\packages\`に置かれる模様です。なのでPostProcessing Stackのシェーダーを使いたい場合はそのパッケージまでのパスを通してあげないといけません。
最終的にはこんな感じになります:

```shadertoolsconfig.json
{
  "hlsl.additionalIncludeDirectories": [
    ".",
    "C:\\Users\\spaghet\\AppData\\Local\\Unity\\cache\\packages\\packages.unity.com\\com.unity.postprocessing@2.0.10-preview",
    "C:\\Program Files\\Unity\\Hub\\Editor\\2018.2.2f1\\Editor\\Data\\CGIncludes"
  ]
}
```

`shadertoolsconfig.json`について詳しくは [このissue](https://github.com/tgjones/HlslTools/issues/92)と[ドキュメント](https://github.com/tgjones/hlsltools#custom-preprocessor-definitions-and-additional-include-directories)を読んでみてください。
Issueにも書いてある通りShaderLab対応も実装中らしいのでこの記事はそろそろDeprecatedされるかと思います（笑）

これでかなり快適になったかと思います。
いかがでしょうか？
pytorchでCNNのlossが毎回変わる問題の対処法 (on gpu)

# はじめに
[pytorchでCNNのlossが毎回変わる問題の対処法 (on cpu)](https://qiita.com/chat-flip/items/4c0b71a7c0f5f6ae437f)の続きでgpu versionです。

pytorchのライブラリ以外は他の方が既に記事にされてます。
[ChainerでGPUを使うと毎回結果が変わる理由と対策](https://qiita.com/TokyoMickey/items/cc8cd43545f2656b1cbd)
[TensorFlowでGPUを使うと毎回結果が変わる理由と対策](https://qiita.com/TokyoMickey/items/57eb23e198ea6f29a1e8)

## 検証環境
ubuntu 16.04
python 2.7.15
pytorch 0.4.0
torchvision 0.2.1
cuda 8.0
cudnn 5.1


## 検証
cpu実行で同じ結果になるようになったプログラムで比較(長いので省略)
https://github.com/chatflip/qiita_code/blob/master/deterministic/deterministic_cpu.py

```bash:terminal
~/qiita_code/deterministic$ python deterministic_cpu.py
```

```実行結果:deterministic_cpu.py
							      	1回目           2回目            3回目
Train Epoch: 5 [0/60000 (0%)]	Loss: 0.143671	Loss: 0.068791	Loss: 0.094007
Train Epoch: 5 [64/60000 (0%)]	Loss: 0.118837	Loss: 0.269800	Loss: 0.131437
Train Epoch: 5 [128/60000 (0%)]	Loss: 0.176576	Loss: 0.265202	Loss: 0.206423
Train Epoch: 5 [192/60000 (0%)]	Loss: 0.420969	Loss: 0.569533	Loss: 0.391462
```

Epoch1の始めの方はlossの値が同じですが、Epoch2以降から違う値になりました。原因はcudnnによる最適化なんですが、プログラムが辿れないの詳しくは分からないです…
ただ`torch.backends.cudnn.deterministic = True`とすると決定論的振る舞いをするらしいです。

torch.backends.cudnn
https://github.com/pytorch/pytorch/blob/v0.4.0/torch/backends/cudnn/__init__.py
cudnn.deterministic関連issue
https://github.com/pytorch/pytorch/issues/6351

## 再検証
`torch.backends.cudnn.deterministic = True`を加えてプログラムを実行
https://github.com/chatflip/qiita_code/blob/master/deterministic/deterministic_gpu.py

```bash:terminal
~/qiita_code/deterministic$ python deterministic_gpu.py
```

```実行結果:deterministic_gpu.py
							      	1回目           2回目            3回目
Train Epoch: 5 [0/60000 (0%)]	Loss: 0.062156	Loss: 0.062156	Loss: 0.062156
Train Epoch: 5 [64/60000 (0%)]	Loss: 0.133375	Loss: 0.133375	Loss: 0.133375
Train Epoch: 5 [128/60000 (0%)]	Loss: 0.212103	Loss: 0.212103	Loss: 0.212103
Train Epoch: 5 [192/60000 (0%)]	Loss: 0.430716	Loss: 0.430716	Loss: 0.430716
```
lossが同じ値になりました

# おわりに
pytorch on gpuでlossが毎回変わる問題の対処法は

- `torch.backends.cudnn.deterministic = True`

cpu部分の対処法は[pytorchでCNNのlossが毎回変わる問題の対処法 (on cpu)](https://qiita.com/chat-flip/items/4c0b71a7c0f5f6ae437f)
ログイン機能の処理フロー

1. すでにログインしているかチェック（ログイン有効期限内のセッション有無チェック）
有効期限内ならマイページへ
有効期限外ならセッションクリアしてログアウト。ログインページへ。
セッション自体ない（未ログインユーザー）なら後続処理を続ける。
2. POSTされているかチェック
3. バリデーションチェック
4. DB接続しパスワード取得
5. パスワード照合
6. セッションに「最終ログイン日時」「ログイン有効期限」「ユーザーID」を保存。
ログイン保持にチェックがあれば「ログイン有効期限」を30日にのばす。
7. マイページへ

>[ウェブカツ！！](https://webukatu.com/?afid=p5lxu1kvh03rayd2ctjsw4e9bgzq8nom)
Macのターミナル（bash）を最低限色付けする


デフォルトのままターミナルを使っているデザイナーとかは多いのかなと思った．zshやfishを入れるのが最高なんだけど，そこまで手をかけられないことは多い．そもそも使用頻度低いし．でもさすがにどぎつい黒はちょっとなぁみたいな．

よくわからなくても記事通りに設定していけば出来上がるみたいな記事が見つけられなかったのでまとめてみる．既存のbashでも最低限いい感じに見やすくする設定を淡々と書き残していく．

ターミナルを何度か触っている人なら10分もあれば設定できると思う．

## デフォルト

既存はこんな感じで悲しくなるほど見にくい（モチベーションも上がらない．．．）
![a1.png](https://qiita-image-store.s3.amazonaws.com/0/55003/f4c74fc5-23d8-b054-ac4c-dd8b4aebb0f4.png)


## **1. bashrcを作る**

ターミナルを開いたら、

```
$ vi ~/.bashrc  
```

入力画面が出てくるのでキーボードの `i` を押すと 画面下部に `--INSERT--`と表示される．
その状態で下記の内容をコピーして黒い画面に `cmmand + v` （ペースト）する

``` ~/.bashrc  
# default:cyan / root:red
if [ $UID -eq 0 ]; then
    PS1="\[\033[31m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[00m\]\\$ "
else
    PS1="\[\033[36m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[00m\]\\$ "
fi

# "-F":ディレクトリに"/"を表示 / "-G"でディレクトリを色表示
alias ls='ls -FG'
alias ll='ls -alFG'

```

ペーストされたらキーボードの `esc` ボタンを押してから `:wq` と入力してファイルを閉じる．

## **2. 設定の反映を自動化**
```
$ vi ~/.bash_profile
```

1.と同様に，`i` を押してから，下記の内容をコピーして黒い画面に `cmmand + v` （ペースト）する

```~/.bash_profile
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi
```

キーボードの `esc` ボタンを押してから `:wq` と入力してファイルを閉じる．

## **3. 設定を反映する**

```
$ source ~/.bashrc
```

（上記コマンドを打たなくても，ターミナル再起動でもOK）
これで幾分かはましになる．
![a2.png](https://qiita-image-store.s3.amazonaws.com/0/55003/f98b793d-00d5-251f-f51e-3a7b931aa4c0.png)


## 4.より良くしたい場合はターミナルの環境設定をする

ここまででも最低限は良くなるけど，もうちょっといい感じにしたいと思う人は多いはず！

デフォルトから選んでもいいんだけど，個人的な好みでこのテーマを入れてみる．
[Iceberg](http://cocopon.github.io/iceberg.vim/)のページにアクセスして，ページ下部の `Download` からzipファイルをダウンロードする．
ダウンロードしたらzipファイルを解凍しておく．

[<img width="462" alt="ss 2018-08-14 23.23.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/55003/b62b0fe0-64d5-34fd-0f69-b1bbf5291b65.png">](http://cocopon.github.io/iceberg.vim/)


こんな感じの色味になるテーマです．
![macos-terminal.png](https://qiita-image-store.s3.amazonaws.com/0/55003/c19a4230-7226-788b-b5a1-46549305f54e.png)

#### ターミナルの環境設定を開く

##### **・テーマを読み込む**

![スクリーンショット 2018-08-14 23.29.55.png](https://qiita-image-store.s3.amazonaws.com/0/55003/a9c6b8e2-e1cc-e196-8e9e-aca2b9a41e48.png)

`⚙∨` をクリックして， `読み込む...` をクリックして，解凍したフォルダに入っている `Iceberg.terminal` を選択すると，左のテーマ一覧に Iceberg が追加されるので，クリックして選択したら， `デフォルト` ボタンを押す．

##### **・テーマを少し編集する**

テーマを選択したら， **背景** の `カラーとエフェクト` をクリックして 透明度を `90%` にする．

##### **・フォントを変更する**

**フォント** の `変更` ボタンをクリックして， 
ファミリーを `Menlo`  書体を `レギュラー` サイズを `18` にする

#### **ここまで設定するとこんな感じになった!!**
![a3.jpg](https://qiita-image-store.s3.amazonaws.com/0/55003/39434bac-bb7e-1b0d-b1b3-a2235131a29b.jpeg)

gitの設定は下記に書いてみました。
[gitのブランチ名をターミナルで表示できるようにする](https://qiita.com/lemtosh469/items/334ff76366e054a3a3aa)


参考：

- [Macのbash(ターミナル)を鮮やかにする](https://qiita.com/yoshi-yoshi/items/a0c76f660572652cd55c)
- [iTerm2のcolorschemeにIcebergを適用する場合](http://shinshin86.hateblo.jp/entry/2018/02/10/233159)

---

# 2020年11月追記

前職の時に書いたこの記事ですが、他の記事にもリンクして頂けているおかげもあるのか、実は4万近い方に見られております。（読んでいただいた方、ありがとうございます。）

gitの設定をする続きも書いて上記にリンクを載せているのですが、もうちょっとキャリア的なところも需要あるのかなと思い少し書き始めてみました。

[どんな流れでWebエンジニアになったの？](https://note.com/varbar/n/n679379ad3210)
NextJS + dockerでhmrが効かない時の対処方法メモ

# 概要
nextjs + typescriptをdockerとkubernetesを用いて動かすため、minikubeを使ってローカル環境で諸々を試していてhmrが効かないということに遭遇したので、その対処方法を備忘録としてメモ。


# 環境
* os x 10.11.6
* nextjs 6.1.1
* minikube v0.28.2
* virtualbox 5.2.16


# 何をしていたか
* nextjs + typescriptのアプリケーションを公式を参考に最低限動作させた
* `yarn dev`起動し、簡単にhmr導入できるなーと感動していた
* Dockerfileを作って↑をimage化
* docker runでも動くことを確認
* minikube、kubectl、helmを入れて諸々ゴニョゴニョ
* minikubeのhypervisorとしてはvirtualboxを使う
* helmのdeploymentでホストディレクトリをマウント
* helm installでアプリケーションが動くところまで漕ぎ付ける
* 達成感に浸っていた


# 何が起きたか
↑で作成したアプリケーションのテンプレート内の文字列を変えてみたところ、hmrが効かないことに気づく


# 原因
virtualbox上のコンテナにホストディレクトリをマウントしているわけですが、
NFS(Network File System)というファイルシステムを用いてマウントしている場合Watchが効かないらしい。。

webpackの公式に以下が。

>If watching does not work for you, try out this option. Watching does not work with NFS and machines in VirtualBox.

https://webpack.js.org/configuration/watch/


# 対処方法
nextjsの設定ファイルであるnext.config.jsにpollingするwatch optionを追加
具体的には以下

```
watchOptions: {
  // ミリ秒ごとにチェック
  poll: 1000
}
```

合わせて以下の設定もしておくと捗るかも

```
// 遅延時間.最初の変更からこの期間中に行われた変更は1回の再構築に集約される.ミリ秒
aggregateTimeout: 300,

// 除外ディレクトリ
ignored: [ 'node_modules' ]
```

できたnext.config.jsは以下（serverConfigあたりは省略）

```next.config.js
const withTypescript = require('@zeit/next-typescript')

module.exports = withTypescript({
  webpack: (config) => {
    return config
  },
  webpackDevMiddleware: config => {
    config.watchOptions = {
      aggregateTimeout: 300,
      poll: 1000,
      ignored: [ 'node_modules' ]
    };

    return config
  },
})
```

# まとめ
これで自分のところでは、virtualbox上で動いているアプリがhmrになったことを確認できました。が、ここまでやって身も蓋もないですが、結局のところminikubeを使って動作確認するのはservice間連携などに限定しようかと思いました。

というのも、開いているブラウザがもっさりしてて、ゴリゴリ開発するフェーズでは、単純に`yarn dev`でアプリを立ち上げて開発をした方が効率が良さそうだと感じたためです。
(自分のPCが非力ってのはありますが)

そもそもあまり問題にならないことかもしれませんが何かの役に立てばと思います。
JupyterのDockerイメージで日本語が使えるように、Dockerfileを書いた



Pythonを書くようになり、Jupyterを使って遊んでいます。matplotlibで遊んでいたのですが、日本語が文字化けする現象がおきました。

![野球選手の名前を出したかったんだけど.png](https://qiita-image-store.s3.amazonaws.com/0/110482/c94c1aa5-1e57-9591-0ba2-6a5aa0e3ab1f.png)



Jupyterを日本語化する方法はぐぐるとそれなりに数が出てきます。しかし、それらの記事は、JupyterのDockerイメージ環境とはキャッシュの場所が違うなどして、若干手間取りました。Dockerfileを書いて、いつでも日本語化できるようにしました。

## 参考サイト
最初に[参考記事](http://kaisk.hatenadiary.com/entry/2015/02/15/215831)をご紹介します。感謝感謝 :bow: 

## 作成したdockerfile

Dockerfileを見れば、何をしたかすぐに分かるのでひとまず読んで

``` Dockerfile
FROM jupyter/datascience-notebook

LABEL  maintainer "nassy20 <xxxx@gmail.com>"

RUN curl -L  "https://oscdl.ipa.go.jp/IPAexfont/ipaexg00301.zip" > font.zip
RUN unzip font.zip
RUN cp ipaexg00301/ipaexg.ttf /opt/conda/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/ipaexg.ttf
RUN echo "font.family : IPAexGothic" >>  /opt/conda/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc
RUN rm -r ./.cache

```

# 使い方

上記Dockerfileを置いたdirで以下のdockerコマンドを実行してください。

```
docker build -t jupyter-japanese:0.1 .
docker run -it --rm --name notebook -p 8888:8888 jupyter-japanese:0.1
```

すると、以下がコンソールに流れてくるので指示に従って、tokenも含めてブラウザで実行しましょう。


```
 Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://(4b42f5846e22 or 127.0.0.1):8888/?token=94ab1e2dd5ce91140e302af4e8565ebc9266465b1cf17994
```
<img width="1227" alt="スクリーンショット 2018-08-14 21.49.27.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/110482/d65de8cd-3bd6-59af-a7fa-dde681b8e5d5.jpeg">


問題無くjupyterのホームが表示されました。
右側のNewからpython3を選択し、以下を実行させましょう。

``` python
import matplotlib
import matplotlib.pyplot as plt
plt.figure()
plt.xlabel('豆腐 - tofu')
plt.title('豆腐 - TOFU')
```

<img width="1223" alt="スクリーンショット 2018-08-14 21.50.22.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/110482/a96f342e-fb12-9a9a-90b8-61e52876a871.jpeg">

日本語表示成功です :kissing_heart:

(```plt.figure()```の2回目でグラフが表示される理由は分かりません :bow: )

ついでに、甲子園の各都道府県の代表校のデータ可視化してみました。(やるー:relaxed:)

![20180805101300.png](https://qiita-image-store.s3.amazonaws.com/0/110482/34fe4131-dee1-8aa8-88ae-419e4037c752.png)
JavaおじさんがPythonを使えるようになるまでの全記録（その14）

#Djangoはアプリケーションアーキテクチャ設計が重要そうね
とりあえず何作ろうか悩んで一歩も動けないのも考え物なので、一応[チュートリアル](https://docs.djangoproject.com/ja/2.1/intro/)を参照しつつ手を動かしている。
まだまだ途中だけど。

今作っているのは[part4](https://docs.djangoproject.com/ja/2.1/intro/tutorial04/)でViewまで到達しているわけだけど、やっぱりアプリケーションアーキテクチャをきちんと定義しないといけないんだろうなーというのはすでに現時点で感じている。

Djangoでは永続化としてPoEAAでいうところのActiveRecordを採用しているわけだけど、[ここ](https://qiita.com/NaoyukiSakai/items/cd04d206c7dc835db6bb)でも言われている通りで実装に混乱が起きやすいのはある程度の開発経験を持っている人なら同意してもらえると思う。
特に複数モデルにまたがるトランザクションを解決しようとすると、アプリケーションアーキテクチャとしてかっちり遵守させるような仕掛けを施さないとすぐに崩れてメンテ不能になるのは目に見えてる。

これはルール作りではカバーしきれない。こりゃもう断言していい。

特に大規模システム開発/保守だと、まともにコーディング規約すら守れないような脳みそあんこちゃんまで紛れ込むので、仕掛けを守らないとまともに動かないようにしておかないと後で大変なことになる。
人間というのはコンピュータと違って勝手な判断をして、ブツが動いたらそれで満足してしまったりする生き物だし、悪い意味で怠惰になって「勉強する気ないから」と言い放ってチームを道連れにアーキテクチャガン無視して非効率なメンテ強行するPMも存在するくらいだかんね。

で、Java＋SpringだとAOPによるトランザクション管理によってDAOは単一モデルのCRUDに専念でき、複数のモデルがからむ処理に関してはControllerで処理を行い、トランザクション境界はServiceに置いて動的にトランザクションをまとめるという階層化が自然にできる。まあ強制できてるかと言われれば微妙なところだとは思うけど。
で、現状Djangoにはそういう道具立てがないように（今のところは）見える。
ないからやらなくていいかって？いやいや御冗談を。

とりあえず上記に類似したレイヤーで作っていこうとは思っているけど、Djangoでどう縛るかはこれから考えないといかんのよね。
はてさてどうなるものやら。

でもとりあえず大規模開発の文脈で言えば「Javaオワコン」と安易に言ってしまうのには少し抵抗がある。
少なくともここら辺の問題が解消できる言語やフレームワークが登場するまでは。
vimrc

"base
syntax on
set ignorecase
set smartcase
set termencoding=utf-8
set fileencodings=utf-8,euc-jp,cp932
set autoindent
set smartindent
set cindent
set showmatch
set ruler
set fdm=marker
set shiftwidth=4
set tabstop=4
" カーソル行をハイライト
set cursorline
" カレントウィンドウにのみ罫線を引く
augroup cch
  autocmd! cch
  autocmd WinLeave * set nocursorline
  autocmd WinEnter,BufRead * set cursorline
  autocmd InsertChange * :echo "insert change"
  autocmd InsertLeave,CursorMoved * :echo "auto save exec event in leave"
  autocmd CmdwinEnter,CmdwinLeave * :echo "auto save exec event"
augroup END
"highlight CursorLine ctermbg=white guibg=white
"highlight CursorLine ctermbg=white guibg=white
highlight CursorLine ctermbg=black guibg=black
""
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=lightblue
match ZenkakuSpace /　/
"　
set laststatus=2 " 常にステータスラインを表示

set history=100

nnoremap ;b <C-B> 
nnoremap ;f <C-F> 
nnoremap ;o o<ESC>
nnoremap ;r <C-R> 
"nnoremap lp $
"nnoremap <TAB> i// {{{ dust <ESC>
"nnoremap ;<TAB> i// }}} <ESC>
nnoremap ;j /^[^0-9*\/]<Enter>
nnoremap ;h :s/,/---/g<Enter>
nnoremap ;k /^[^0-9*\/]<Enter>:s/,/---/g<Enter>

nnoremap pa yyp<C-a>l<C-a>
npm でインストールした ot.js の EditorSocketIOServer が動かない問題

npm でインストールした [ot.js](https://github.com/Operational-Transformation/ot.js/) の EditorSocketIOServer が動かない。
OT サーバーにクライアントがアクセスして、切断したときにエラー落ちしてしまう問題。

#原因と回避策
npm でインストールした ot.js は、socket.io の最新版に対応していない。
しかし、[GitHub](https://github.com/Operational-Transformation/ot.js/blob/master/lib/editor-socketio-server.js) では EditorSocketIOServer.prototype.addClient() が修正されているので、パッチをあてよう。

```js:patch.js
var EditorSocketIOServer = require('ot/lib/editor-socketio-server');

/**
 * ot.js patch for socket.io >= 1.0
 * Copyright © 2012-2014 Tim Baumann, http://timbaumann.info
 * Released under the MIT License, https://github.com/Operational-Transformation/ot.js/blob/master/LICENSE
 */
{
    var EventEmitter = require('events').EventEmitter;
    var TextOperation = require('ot/lib/text-operation');
    var WrappedOperation = require('ot/lib/wrapped-operation');
    var Server = require('ot/lib/server');
    var Selection = require('ot/lib/selection');
    var util = require('util');

    EditorSocketIOServer.prototype.addClient = function (socket) {
        var self = this;
        socket
            .join(this.docId)
            .emit('doc', {
                str: this.document,
                revision: this.operations.length,
                clients: this.users
            })
            .on('operation', function (revision, operation, selection) {
                self.mayWrite(socket, function (mayWrite) {
                    if (!mayWrite) {
                        console.log("User doesn't have the right to edit.");
                        return;
                    }
                    self.onOperation(socket, revision, operation, selection);
                });
            })
            .on('selection', function (obj) {
                self.mayWrite(socket, function (mayWrite) {
                    if (!mayWrite) {
                        console.log("User doesn't have the right to edit.");
                        return;
                    }
                    self.updateSelection(socket, obj && Selection.fromJSON(obj));
                });
            })
            .on('disconnect', function () {
                console.log("Disconnect");
                socket.leave(self.docId);
                self.onDisconnect(socket);
                if (
                    (socket.manager && socket.manager.sockets.clients(self.docId).length === 0) || // socket.io <= 0.9
                    (socket.ns && Object.keys(socket.ns.connected).length === 0) // socket.io >= 1.0
                ) {
                    self.emit('empty-room');
                }
            });
    };
}
```

# Windows から OT サーバーを建てられるようにしました！
実は Node.js を使ったのは初めてだったのですが、想像以上に便利だったので C# で GUI 作りました。[localot GUI](https://apps.bluehood.net/localot/)
WindowsでEclipse+CDTにGNU MCU Eclipseプラグインを入れて環境構築


# インストール手順

GNU MCU Eclipse のページに掲載されているインストール方法に従って各種インストールしていく。

https://gnu-mcu-eclipse.github.io/install/

## Node.js (npm)

後述のxpmをインストールするために、Node.jsのパッケージマネージャであるnpmを使うので、Node.jsをインストールする。Windowsであれば、「Windows Installer」と書いてある箇所をクリックするとダウンロードできる。

https://nodejs.org/ja/download/

ダウンロードしたらインストール。Custom Setupの画面で「Add to PATH」が選択されているのを確認しておくと、あとでnpmを使うときにパス指定しなくてよいので便利。

![node_install_custom.png](https://qiita-image-store.s3.amazonaws.com/0/106819/da85e080-da18-00ec-191b-7a89ed9a9094.png)

![node_install_completed.png](https://qiita-image-store.s3.amazonaws.com/0/106819/093e7044-6ea5-ec9a-8641-a963bc2c5bc2.png)

これで完了。

## xPack package manager (xpm)

Node.jsで環境変数PATHに追加していればコマンドプロンプトからnpmを使えるようになっているはず。xpmはnpmで配布されているのでnpmを用いてインストールする。

```
$ npm install --global xpm
```

![cmd_xpm_competed.png](https://qiita-image-store.s3.amazonaws.com/0/106819/304de82a-91b0-3e1a-7ae7-b5631e6d7780.png)

これで完了。

## ARM Toolchain (RISC-V Toolchain)

GNU MCU Eclipse は arm系とrisc-v系のMCUに対応しているらしいので、必要に応じてどちらかをインストールする。特に気にしない人は両方入れてもOK。

```
$ xpm install --global @gnu-mcu-eclipse/arm-none-eabi-gcc
```

![cmd-arm-none-eabi_competed.png](https://qiita-image-store.s3.amazonaws.com/0/106819/10a214fb-7566-225d-e2d7-c3a5c4c9473d.png)

RISC-Vの場合は以下。

```
$ xpm install --global @gnu-mcu-eclipse/riscv-none-gcc
```

## Windows Build Tools

Windowsだとビルドができないので、automakeなどのビルドツールがまとまったパッケージを入れる。

```
$ xpm install --global @gnu-mcu-eclipse/windows-build-tools
```

## OpenOCD

デバッグのためのOpenOCDもxpmで入れることができる。

```
$ xpm install --global @gnu-mcu-eclipse/openocd
```

## QEMU

シミュレーションのためのQEMUもxpmで入れる。

```
$ xpm install --global @gnu-mcu-eclipse/qemu
```

## Eclipse & CDT

Eclipseを入れる。

下のGNU MCU Eclipseで用意しているリンクからインストールすると、CDTやプラグインが入った状態でインストールができる。

https://github.com/gnu-mcu-eclipse/org.eclipse.epp.packages/releases/

公式ページからEclipseをする場合はこっち。

https://www.eclipse.org/downloads/

インストール時に for C/C++ Developers を選んでおくとCDTが入った状態にできる。

![eclipse_setup.png](https://qiita-image-store.s3.amazonaws.com/0/106819/9c384b14-5aef-0b31-991c-24df9b492161.png)


## GNU MCU Eclipse プラグイン

すでにEclipseやCDTが入っていてプラグインのみを入れる場合は以下の手順で入れる。

https://gnu-mcu-eclipse.github.io/plugins/install/

まず、Help　＞Install New Software... で拡張機能のインストール画面を開く。

![eclipse_plugin.png](https://qiita-image-store.s3.amazonaws.com/0/106819/4af4a4a9-e203-2710-3729-eb1f371421a3.png)

Add Repository からGNU MCU Eclipse Plug-ins のリポジトリを追加する。

```
name: GNU MCU Eclipse Plug-ins
URL: http://gnu-mcu-eclipse.netlify.com/v4-neon-updates/
```

![eclipse_plugin_add.png](https://qiita-image-store.s3.amazonaws.com/0/106819/0a80199d-b10f-0fe0-2bb6-e9c81f18a251.png)

STM32を使う人は、一番下にある「STM32Fx Project Templates」を入れておくとよい。

![eclipse_setup_detail.png](https://qiita-image-store.s3.amazonaws.com/0/106819/02f526a8-cace-c7ee-e68d-fc1501635513.png)

これで環境構築はおわり。

# 使ったコマンドのまとめ

```
$ npm install --global xpm
$ xpm install --global @gnu-mcu-eclipse/arm-none-eabi-gcc
$ xpm install --global @gnu-mcu-eclipse/riscv-none-gcc
$ xpm install --global @gnu-mcu-eclipse/windows-build-tools
$ xpm install --global @gnu-mcu-eclipse/openocd
$ xpm install --global @gnu-mcu-eclipse/qemu
```
Java コレクションとは

# はじめに

様々なデータ構造(data structure) についてまとめてみました。

まず配列とは、「複数のデータを１つにまとめて扱う方法」 の代表的なものです。

その配列の仲間として代表的なものが下記の通りになっています。


* リスト(List) - 順序通り並べて格納する。（中身重複可）


* セット(Set)  - 順序があるとは限らない。（中身重複不可）


* マップ(Map) - ペアで対応付けて格納する。



Javaには様々なデータ構造に対応した「データをまとめて格納するための入れ物クラス達」が

APIとして準備されています。　それらはjava.util パッケージに属しています。

<b>コレクションフレームワーク（collection framework）</b>と呼ばれています。

## さいごに

これからコレクションのことについて学習し、理解を深めていきます。

間違えていたりした場合、ご指導ご鞭撻のほどよろしくお願いいたします！！！
体重ではなく体組成を管理しよう

# はじめに
## こんな経験はないだろうか？
「あっれれ〜？体重落ちてるのにぽっこりお腹が治らないぞ〜、おっかしいな〜？」
「いや筋トレとかツライのムリ。何度3日坊主になったことか」
「Rizapって食事制限いるんでしょ？ありえねーｗ」

### モチベーション問題
そう。大抵のダイエット手法はツライ。

そのうえ、めっちゃ頑張って1ヶ月で5kg落としても、リバウンドしたり体調が悪化する。
（1ヶ月で３kg以上の体重変化は体が覚えられないのだ）

私は筋トレ嫌だし、ジムに通って3度挫折した経験がある。美味しいもの食べに行くの大好きだ。

正直自分は意志の力でダイエットするのは諦めていた…


## 努力しないで検討的なダイエットは不可能か？

そんなことはなかった。

**筋肉をつけながら、体重を５kg落とすことに成功した。**

![Screenshot 2018-08-14 at 21.05.01.png](https://qiita-image-store.s3.amazonaws.com/0/206421/925fca36-d401-4b14-2d91-c4d971dd59a8.png)



去年あたりから履けなくなっていたお気に入りのズボンを履いてみたら…

なんとウエストに余裕すらある。


さらに！ズボンのポッケには５００円玉がｗｗ

なんということだろう。頑張ったね、という神様からのお駄賃だろうか…




## 筋トレ
```
筋トレ：　　　負荷の低い自重系トレーニングを5~10[min/day]
有酸素運動：　ステッパーを30[min]前後
```

なんだやってるじゃないか！と言われるかも知れない。

いやしかし、今回自分は**一切努力をした実感がない。**

そう、体組成管理がモチベーションを爆上げし、努力を努力を思わせなかったのだ！


# 体組成とは

>体組成計は単に体重だけでなく、体脂肪率、BMI、筋肉量や内臓脂肪レベル、皮下脂肪率などさまざまなデータが測定できる機器。健康目的であれ、美容目的であれ、体重の管理は重要だが、体脂肪率のチェックも欠かせない。見た目はやせていても内臓脂肪の多い「隠れ肥満」の人も増えているからだ。　
[アプリを活用して効率的に！　最新体組成計選び　より](http://www.asahi.com/and_bazaar/articles/SDI2018021430041.html)

上記以外にも色々指標は多いが、取り急ぎ気になるのは体重と体脂肪率だろう。

しかし、筋肉率にも注目して欲しい。
なぜなら筋肉率が低い程基礎代謝が減り、リバウンドしやすくなるからだ。

これではどんなダイエット法をおこなっても本末転倒である。

是非**筋肉率（あるいは除脂肪体重）をモニタリングして欲しい。**


## 現状の成果(2018/08/14)
![Screenshot 2018-08-14 at 21.43.40.png](https://qiita-image-store.s3.amazonaws.com/0/206421/2d93c97b-f6da-42d4-08af-2bb1545d4a34.png)
![Screenshot 2018-08-14 at 21.05.01.png](https://qiita-image-store.s3.amazonaws.com/0/206421/21c78a28-1ac1-c675-acc7-cd14fdef9d6e.png)

データを取り始めたのは2018/01〜だが、システムを組んでモニタリングし始めたのは2018/07〜だ。

システムについてはまた次回むしろQiita的にはそっちが本題なのにｗｗ
gem 'nested_form_fields'のremove_nested_fields_linkをRails 5で使うときの注意点

# gem 'nested_form_fields'のremove_nested_fields_linkをRails 5で使うときの注意点

## gem 'nested_form_fields'とは

[nested_form_fields](https://github.com/ncri/nested_form_fields) はネストされたフォームの作成などを助けるgem

## 問題：remove_nested_fields_linkが正常に動作しない

ヘルパーメソッドの一つである`remove_nested_fields_link`はネストされたフォームの動的削除のメソッドで以下のように使う（はず）。

```new.html.erb
<%= f.nested_fields_for :transitpoints, wrapper_tag: :div do |ft| %>
  ...省略...
  <%= ft.remove_nested_fields_link 'Delete', class: 'btn btn-danger', role: 'button'%>
<% end %>
```
そして生成されたHTMLのページで`Delete`ボタンを押すと、追加されたフォームが削除されるはずが、
`Uncaught TypeError: Cannot read property 'allowAction' of undefined`が発生してしまう。

## 解決策

//= require jquery_ujsを追加する

 ```app/assets/javascript/application.js
  ...省略...
  //= require jquery_ujs
```

なぜか？や本当に？とかは答えられません。
むしろ知っている人がいたら教えてほしいです。

ちなみに私が調べた範囲ではRails5になるにあたり、今まで`jquery_ujs`だったものが、`rails_ujs`になったとのことでした。
（が、`rails_ujs`は自分の環境では`require`しているのにエラーになるのは`jquery_ujs`内のものが`rails_ujs`に移動したわけではないからと予想しています）
SPF/DKIM/DMARC などのチェックをするサイト

SPF/DKIM/DMARC などのチェックするサイトのメモ。
dmarcian.com　に割と何でもある印象
見つけたら別途追記予定

# SPF

+ [dmarcian.com SPF Surveyor](https://dmarcian.com/spf-survey/)


# DKIM

+ [dmarcian.com DKIM Inspector](https://dmarcian.com/dkim-inspector/)
+ [DKIM core](https://dkimcore.org/tools/keycheck.html)

# DMARC


+ [dmarcian.com DMARC Inspector](https://dmarcian.com/dmarc-inspector/)

# 参考記事

+ [送信ドメインを認証するためのSPFレコードに詳しくなろう](https://sendgrid.kke.co.jp/blog/?p=3509)
+ [DMARCがもっとよくわかる！概要とレコードの読み方)](https://sendgrid.kke.co.jp/blog/?p=3137)
+ [切ない思いをしないためのDNSチェッカー](https://qiita.com/YamaguchiRei/items/cc6489fd22b0197cf797)
【JavaScript】配列の中身の型を文字列型から数値型へ

## やりたい事
```javascript
// 例えば、こういう配列を
["3", "4"] 

// こうしたい時
[3, 4]
```

## 解決策：mapを使う
配列オブジェクトに対して、mapメソッドを使う.

```javascript
//具体的にはこうする
var arrayString = ["3", "4"];
var arrayNumber = arrayString.map(function(n) {return Number(n)});
console.log(arrayNumber);
// [3, 4]
```

```javascript
//アロー関数使うなら
const arrayNumber = arrayString.map(n => Number(n));
console.log(arrayNumber);
```
Rohm sensorMedalをbluetoothctlで使う

# これは？
Raspberry pi zero wでRohm sensorMedalを使ってみるために、
bluezに入っているbluetoothctlを使って接続テストをしてみた。
(bluezをコンパイルするためには、swapを一時的に2Gに増やす必要があった。)

    $ sudo bluetoothctl
    [NEW] Controller B8:27:EB:E2:DD:XX raspberrypi [default]
で、起動し、

    [bluetooth] scan on
    [NEW] Device FE:2C:5D:1E:01:38 ROHM RAW

    [bluetooth] pair FE:2C:5D:1E:01:38
    Attempting to pair with FE:2C:5D:1E:01:38
    [bluetooth] connect FE:2C:5D:1E:01:38
    Attempting to connect to FE:2C:5D:1E:01:38    
ちょっとまって、attribute 一覧をget。
その中から、notifyのフラグが付いているattributeを探す。

    [FE:2C:5D:1E:01:38] attribute-info /org/bluez/hci0/dev_FE_2C_5D_1E_01_38/service0b00/char0b05
    Characteristic - Vendor specific
    UUID: 0179bbc3-0000-0100-8000-00805f9b34fb
    Service: /org/bluez/hci0/dev_FE_2C_5D_1E_01_38/service0b00
    Notifying: no
    Flags: notify
このattributeがそれっぽいので、

    [FE:2C:5D:1E:01:38] select-attribute /org/bluez/hci0/dev_FE_2C_5D_1E_01_38/service0b00/char0b05

    [service0b00/char0b05] notify on

これで、データが流れてくる。