OmniAICreator/Qiita-1.07M huggingface dataset:
VirtualBox上のServerLinuxへのGuestAdditionsの導入方法

# はじめに

ServerLinux（Ubuntu Serverなど）にGuest Additionsを導入するのって意外とめんどくさいんですね

# 手順

まずは上のタブから`Devices -> Insert Guest Additions CD image...`でGuest Additionsイメージを挿入します。
この時、Guest Additionsは/dev/cdromに仮想的に挿入されます。
この時、何かしらのisoが一つ以上無いと/dev/cdromに挿入されないので注意してください。
無事エラー無く挿入できたら、任意のディレクトリにマウントします。
マウント先のディレクトリ名は何でも良いです。

```
mkdir $HOME/GuestAdditions
sudo mount /dev/cdrom $HOME/GuestAdditions
```

次に、apt-update/upgradeします。

```
sudo apt -y update; sudo apt -y upgrade
```

そして、必要なパッケージを入れます。

```
sudo apt -y install gcc make xorg build-essential module-assistant
```

インストールが終わったら、再起動します。
再起動後、インストールスクリプトを実行します。

```
cd $HOME/GuestAdditions
sudo ./VBoxLinuxAdditions.run
```

失敗した場合は、/var/log/vboxadd-install.logや/var/log/vboxadd-setup.logで原因を探して、解決した後にもう一度実行します。

`to enable the Guest Additions.`と表示されたら成功です。
成功したら、serviceをenableします。

```
sudo systemctl status vboxadd.service
sudo systemctl enable vboxadd.service
sudo systemctl status vboxadd-service.service
sudo systemctl enable vboxadd-service.service
```

おそらくvboxadd-service.serviceは失敗しているはずです。
enableした後にrebootすれば、activeになるはずです（なるとは言っていません。でもとりあえずやってみてください）。

```
reboot
```

実はなぜかactiveになりません（起動中にもFAILEDという赤い文字が見えるかもしれません）。
実はなぜか（２回目）もう一度VBoxLinuxAdditions.runを実行させると、activeになります。

```
sudo mount /dev/cdrom $HOME/GuestAdditions
cd $HOME/GuestAdditions
sudo ./VBoxLinuxAdditions
reboot
```

# コマンド全文

Guest Additionsイメージを挿入してから行ってください。

```
mkdir $HOME/GuestAdditions
sudo mount /dev/cdrom $HOME/GuestAdditions
sudo apt -y update; sudo apt -y upgrade
sudo apt -y install gcc make xorg
cd $HOME/GuestAdditions
sudo ./VBoxLinuxAdditions
sudo systemctl status vboxadd.service
sudo systemctl enable vboxadd.service
sudo systemctl status vboxadd-service.service
sudo systemctl enable vboxadd-service.service
reboot
```

```
sudo mount /dev/cdrom $HOME/GuestAdditions
cd $HOME/GuestAdditions
sudo ./VBoxLinuxAdditions
reboot
```
Windows > エクスプローラー > ファイルにジャンプ > ファイル先頭文字列を3秒(?)以内に入力 > 続き: ソース解読

```txt:動作環境
Windows 7 Pro (32bit)
```

- 状況
    - エクスプローラーで下記ファイルがあるフォルダにいる
        - 例: `myGreatLibrary.c`
    - リスト表示で、そのファイル名は隠れている

- ファイルにジャンプ
    - ファイル名先頭文字列(例: `mygre`)を3秒?以内に入力
        - >> `myGreatLibrary.c`にジャンプ

### 後続の処理

ファイルへジャンプしたら、以下の処理を続けることで、ソース内の気になる箇所にたどり着く。

- [秀丸エディタ > エクスプローラからファイルを秀丸エディタで開く > 右クリック, N, H (sendto登録後)](https://qiita.com/7of9/items/ecdfb7847849874ee5da)
- [ソース解読 > 秀丸エディタ > 謎変数(配列)の使用関数の確認](https://qiita.com/7of9/items/c7c2c11edec261ed059c)

このルーチンを繰返しながら、ソースを理解しようとしている。

### link

エクスプローラつながり。

- [Windows > エクスプローラ > フォルダばかり表示されているフォルダへファイルをコピーしたい > 下側にドラッグする](https://qiita.com/7of9/items/a377a3a9851b56cadf88)
CDNって何？

今度CDN（Content Delivery Network）を扱うことになったが、知識０なので勉強していく。
下記サイトで分かりやすく解説されていたので、まずは参考にさせてもらった情報を自分用に整理する。

[キャッシュ屋blog 第１回 ＣＤＮ の 仕組み （CDNはどんな技術で何が出来るのか）](https://blog.redbox.ne.jp/what-is-cdn.html)

# CDNって一言で何？
**Webコンテンツ（画像など）をキャッシュして配信する仕組みのこと。**

![01-content-cache.png](https://qiita-image-store.s3.amazonaws.com/0/217027/c7714f90-885e-78db-3d2f-e89e9e94ee47.png)


# 何のために導入するの？
**Webコンテンツを素早く提供するため。**

例えば、日本に設置されたサーバでWebサイトを提供しているとする。
極端な話だが、Webサーバに「日本国内からアクセスするケース」と「アルゼンチンからアクセスするケース」では後者の方がWebサイトの表示に時間がかかる（ネットワーク的な距離が遠いから）。

![02-content-access.png](https://qiita-image-store.s3.amazonaws.com/0/217027/6054ecb2-121d-d21f-0714-c0dcdcf7ceea.png)

そこで、Webサイトのコンテンツをキャッシュさせたサーバをアルゼンチン国内に設置し、アルゼンチンからのアクセスはキャッシュサーバから配信するとWebサイトの表示時間が改善できる。

![03-cdn-access.png](https://qiita-image-store.s3.amazonaws.com/0/217027/27a61537-9e06-2d02-9709-e541c9a67198.png)


このように、地理的に離れた場所にキャッシュサーバを設置してWebコンテンツを素早く提供することがCDNの目的。

# グローバル展開してなければ要らない？
それでは、日本国内からしかアクセスされないのであればCDNの意味はないのだろうか？
CDNには下記のようなメリットもあるため一概にそうとも言えない。

1.Webサーバの負荷軽減（トラフィック分散）
2.可用性向上

複数のキャッシュサーバを分散させておけば、Webサーバのトラフィックを軽減させることが可能。また、キャッシュサーバに障害が発生しても残りのキャッシュサーバで継続してWebコンテンツを配信可能。
VirtualBoxにKUSANAGI for VMware入れたらネットワークから外に出られない問題

最近、WPのテーマ開発をするのに、ちょっとKUSANAGIが気になっておりまして、ローカルの開発環境でこれを使う方法を模索しているのですが、KUSANAGIのVirtualBox用イメージがないため、やきもきしていたところ、VMWare版のovaファイルがあることに気づき、導入を試してみまして。ただ、普通にこのovaをVirtualBoxに読み込ませたら、どうもネットワークの設定に問題があるらしく、外に出られない。故に```yum update```が```Could not resolve host```なんてシャレたことを言ってくるので、それに対応した際の備忘録

# 結論
ova時点の設定では、ブリッジネットワークになっているので、IPアドレスの設定を自分のローカルネットワークの物に合わせる。
例えば、192.168.1.*なネットワーク内であれば、

```vim
# /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=noe
NAME=eno16777736
UUID=...
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.123.193 # -> 192.168.1.193 
PREFIX=24
GATEWAY=192.168.123.254 # -> 192.168.1.1
DNS1=192.168.0.1
```

しかしこれでも```yum update```でmiirorサイトが404になる…。
```Could not resolve host```ではなくなったので、普通に存在していないのかしら…？

# 参考
- [VirtualBoxのCentOS7\(CUI\)でブリッジ接続でインターネットに繋がらない時の対応 \- Qiita](https://qiita.com/ponsuke0531/items/7e69155e1a2258d444c9)
PHP curl WEB APIを使って郵便コードから住所を取得してみる

環境:
PHP 7

curlでWEB APIを叩くために必要な手順は下記の通りです。

```php:php7
<?php
$ch = curl_init(); //1.初期化
curl_setopt($ch, CURLOPT_URL,'URL'); //2.URLをセット
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); //3.HTTP リクエストをセット（GET,POST等)
//.. 4.その他必要オプション
$result= curl_exec($ch); //5.実行して、レスポンスを取得
curl_close($ch); // 6.終了


```

大体の場合、この流れでWEB APIを叩くことができます。
今回は、[zipcloud](http://zipcloud.ibsnet.co.jp/)さんの郵便番号から住所データを取得するWEB APIを使わせていただきます。次にサンプルを示します。

```php:php7
<?php
$baseurl = "http://zipcloud.ibsnet.co.jp/api/search"; 
$zipcode = "5300012"; //郵便番号

$ch = curl_init(); //1.初期化
curl_setopt($ch, CURLOPT_URL,$baseurl . '?zipcode=' . $zipcode); //2.URLをセット
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); //3.HTTP リクエストをセット（GET,POST等)
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); //文字列で返す
//curl_setopt($ch, CURLOPT_HEADER, true);   // ヘッダーも出力する

 //..4.その他必要オプション
$result = curl_exec($ch); //5.実行して、レスポンスを取得
var_dump($result); // 出力
print("-------------------------------");
$resultarr = json_decode($result,true); //jsonを配列に
var_dump($resultarr); //配列で出力

curl_close($ch); // 6.終了

```

この場合、下記のように出力されます。

```:output
string '{
	"message": null,
	"results": [
		{
			"address1": "大阪府",
			"address2": "大阪市北区",
			"address3": "芝田",
			"kana1": "ｵｵｻｶﾌ",
			"kana2": "ｵｵｻｶｼｷﾀｸ",
			"kana3": "ｼﾊﾞﾀ",
			"prefcode": "27",
			"zipcode": "5300012"
		}
	],
	"status": 200
}' (length=293)
-------------------------------
array (size=3)
  'message' => null
  'results' => 
    array (size=1)
      0 => 
        array (size=8)
          'address1' => string '大阪府' (length=9)
          'address2' => string '大阪市北区' (length=15)
          'address3' => string '芝田' (length=6)
          'kana1' => string 'ｵｵｻｶﾌ' (length=15)
          'kana2' => string 'ｵｵｻｶｼｷﾀｸ' (length=24)
          'kana3' => string 'ｼﾊﾞﾀ' (length=12)
          'prefcode' => string '27' (length=2)
          'zipcode' => string '5300012' (length=7)
  'status' => int 200

```

ちなみに、

```php:php7
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); //文字列で返す

```
をセットした場合、curl_exec()のレスポンスは文字列なので、今回の場合json形式の文字列となります。[郵便番号検索API-zipcloud](http://zipcloud.ibsnet.co.jp/doc/api)を参考にしてください。

また、PHPでjson形式の文字列は扱いずらいので、下記のように配列に変換すると色々と便利かと思います。

```php:php7
$resultarr = json_decode($result,true); //jsonを配列に

```

以上です。
phpのcurlオプションは数が多すぎるので、適時リファレンスを見て対応するのがいいかと思います。



引用
[zipCloud 郵便番号検索API](http://zipcloud.ibsnet.co.jp/doc/api)
GoPro HERO5 Blackで撮影した動画からKMLファイルを抽出してみました

[GoPro HERO5 Black](https://jp.shop.gopro.com/APAC/cameras/hero5-black/CHDHX-502-master.html)で取得したGPS情報をKMLファイルに出力して欲しいと依頼されました。
[QUICKというソフトで軌跡は表示できる](https://jp.gopro.com/help/articles/Block/How-to-Use-Gauges-in-Quik-for-Desktop)ようなのですが、地図上に表示することは出来ないんですね。
[Extracting GPS From Go Pro Hero 5](https://blog.programster.org/extracting-gps-from-go-pro-hero-5)を参考にしました。
ただし、Linux・json出力、で書かれているので、Windows・KML出力として残しておきます。

*追記*
HERO7では動かないとのこと。[nbangさんがアップデートしてくれました。](https://code.g-nab.net/archives/73)

# 準備
## 必要なもの
- ffmpeg
- git
- Go

### ffmpeg
動画を扱いたいならとりあえずこれですね。
1. [FFmpeg Builds](https://ffmpeg.zeranoe.com/builds/)から`Static`版をダウンロードします。
2. どこかに解凍します。
3. Pathを通します。

### git
[自分用 Git For Windowsのインストール手順](https://qiita.com/toshi-click/items/dcf3dd48fdc74c91b409)が参考になると思います。
ここもPathが通っていないと後々つまづきます。

### Go
[Windows に インストーラを使って GoLang を インストールするときの注意点](https://qiita.com/kent_ocean/items/566e6a23d76ef3b4d125)が参考になります。
`GOROOT`とか`GOPATH`とか、Pathを通す必要があったりするので、よく読んでください。


## 再起動
Pathをもろもろ通したらサインアウトか再起動します。

# 手順
## 1. Streamを調べる
GPS情報は、撮影した動画ファイル`GOPRxxxx.MP4`にメタデータとして入っています。
まずはこれを確認します。

```markdown
ffprobe GOPRxxxx.MP4
```

```markdown
  Duration: 00:11:56.80, start: 0.000000, bitrate: 30165 kb/s
    Stream #0:0(eng), 1, 1/60000: Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 29972 kb/s, 59.94 fps, 59.94 tbr, 60k tbn, 119.88 tbc (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    : 	GoPro AVC
      encoder         : GoPro AVC encoder
      timecode        : 13:55:26:27
    Stream #0:1(eng), 1, 1/48000: Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    : 	GoPro AAC
      timecode        : 13:55:26:27
    Stream #0:2(eng), 1, 1/60000: Data: none (tmcd / 0x64636D74) (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    : 	GoPro TCD
      timecode        : 13:55:26:27
    Stream #0:3(eng), 0, 1/1000: Data: none (gpmd / 0x646D7067), 38 kb/s (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    : 	GoPro MET
    Stream #0:4(eng), 4, 1/60000: Data: none (fdsc / 0x63736466), 13 kb/s (default)
    Metadata:
      creation_time   : 2018-04-11 13:42:19
      handler_name    : 	GoPro SOS
```
このファイルの場合、`Stream #0:3(eng), 0, 1/1000: Data: none (gpmd / 0x646D7067), 38 kb/s (default)`がGPS情報なので、この`0:3`を覚えておきます。

## 2. バイナリで抽出する
ffmpegの細かいオプションはよく分かりませんが、ファイル名と`Stream`を変えて実行します。
`ffmpeg -y -i GOPRxxxx.MP4 -codec copy -map 0:3 -f rawvideo GOPRxxxx.bin`

## 3. バイナリからGPXに変換する
まず、[github.com/stilldavid/gopro-utils](https://github.com/stilldavid/gopro-utils)から`git clone`するかzipでダウンロードして展開しておきます。

次に、この二つのパッケージをgetします。

```go
go get github.com/stilldavid/gopro-utils/telemetry
go get github.com/paulmach/go.geo
```

あとは、`build`しても良し、`run`しても良しですが、ここでは`run`します。

```go
go run gopro2gpx.go -i GOPRxxxx.bin -o GOPRxxxx.gpx
```
## 4. GPXからKMLに変換する
本当はここから先も`Go`で変換できたら良かったのですが…。
見つからなかったので[GPX2KML](http://gpx2kml.com)を使いました。

GPXからKMLへの変換ツールはいくつかあるようなので、お好きなものを使えると思います。
タブレットPCでAndroidエミュレーターが動いた

先日以来タブレットPCでAndroidアプリを作ることに、挑戦しています。
今回、色々試している中で、Googleエミュレーターのことで閃いたので、試してみました。

私は、chromeを使っています。
chromeは、拡張機能でメモリを色々と使います。
そんため、今回は、chromeを使う前に、VisualstudioでGoogleエミュレーターを起動してみました。

Googleエミュレーターの電話を選択したときは、前回の記事の通りadb.exeを開くことが出来ないとエラーになります。

でも、今回は、Googleエミュレーターのタブレットを選択しました。
すると、なんと正常に起動できました。
![デバッグ2.png](https://qiita-image-store.s3.amazonaws.com/0/20977/331a058e-e96d-6f16-bd00-72602ea288db.png)
私の制作中のアプリを起動できました。

![デバッグ3.png](https://qiita-image-store.s3.amazonaws.com/0/20977/6f5ac04d-2509-40be-e939-cdb3b2ac4b4f.png)
このように、ホームも表示されます。

私が実機をUSBで接続してデバッグできないのは、スマホのOSのバージョンが合っていないからなのかなと思ったりしています。
USBでスマホは、認識されています。

何で今回標準のエミュレーターを使おうとしたかというと、センサーの動きの表示がVisualstudioで出るからです。
その画面のキャプチャを取りたいと思ったのですが。
アプリで、onsen-UIの読み込み完了のイベントが発生しないので、今回センサーの画面が出なかったのかもしれません。
プラグインは、入れています。
本当は、方位磁石の画面とmotionの画面が出ます。
私は、２つのプラグインを入れていますので。
motionの画面では、センサーの値が自動で変わったので、デバッグで使いたかったのです。

標準のエミュレーターを使い前は、一旦タブレットPCを再起動してメモリの空きを確保した方が良いのかもしれません。
CircleCIでDockerコマンドを使う

CircleCI以下のことをしようとした。

1. Dockerイメージをビルド
2. リモートレポジトリ(e.g. DockerHubとか)にプッシュ
3. それをデプロイ

すると、dockerコマンドが見つかりませんと怒られる。
dockerコマンドを実行しているdockerコンテナにdockerコマンドが入っていないから
そりゃそうかと思い、調べてみた。
以下が必要なことがわかった。

1. dockerコマンドが入ったイメージを使う、もしくはstepsでdockerコマンドを入れる。
2. `setup_remote_docker`をstepsで指定することでビルドやプッシュをリモートのdockerエンジンで走らせるようにする

```yaml:.circleci/config.yml
- jobs
  # ...
  - deploy
    # ...
    - docker
      - image: circleci/python:3.6.5 # (1)
    - steps
       - setup_remote_docker # (2)
    # ...
```

1に関して、CircleCIがDockerHubで提供しているイメージは基本的に
dockerコマンドが入っているっぽいのでCircleCIのものを使うようにした。
自分で入れるのはめんどくさいし、何よりあってるか不安。
Numpy > Fancy indexing > ary[mask, 2] > 2, 22, 52の取得 > Scipy Lecture noteのコード間違い

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p59
https://www.scipy-lectures.org/intro/numpy/array_object.html#fancy-indexing

3.1.7 Fancy indexing
図の赤色の要素。

どうしてこうなったのか。

```py
>>>mask = array([1,0,1,0,0,1],dtype=bool)
>>>a[mask,2]
array(2,22,52)
```

実装してみた。

https://ideone.com/iyPo9u

```py
import numpy as np

ary = [
	[0,1,2,3,4,5],
	[10,11,12,13,14,15],
	[20,21,22,23,24,25],
	[30,31,32,33,34,35],
	[40,41,42,43,44,45],
	[50,51,52,53,54,55]]
ary = np.array(ary)
mask = np.array([1,0,1,0,0,1], dtype=bool)
print(mask)
print(ary[mask, 2])

```

```txt:run
[ True False  True False False  True]
[ 2 22 52]
```

理解はできたが、Scipy Lecture noteのコードは間違っている。
(array -> np.array)
https://github.com/scipy-lectures/scipy-lecture-notes/issues/372
Used Nginx 1.10.3 as Reverse Proxy with Tomcat 8.5.30 in AWS Ubuntu Server 16.04 and Setup SSL, Redirect Http to Https

# 0. Install Tomcat 8.5.30 (Remember install JDK 8 first.) and Nginx 1.10.3
```
# cd ~/
# wget http://ftp.mirror.tw/pub/apache/tomcat/tomcat-8/v8.5.30/bin/apache-tomcat-8.5.30.tar.gz
# tar zxvf apache-tomcat-8.5.30.tar.gz
# ./apache-tomcat-8.5.30/bin/catalina.sh start
# sudo apt-get update
# sudo apt-get install nginx
```

# 1. Create self-sign ssl
```
# sudo mkdir /etc/nginx/ssl
# sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/XXXXX.key -out /etc/nginx/ssl/XXXXX.crt
# sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096 <--- You can use 2048 length.
```

# 2. Modified nginx configuration file
```
# sudo vim /etc/nginx/sites-available/default
...
...
...
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name 192.168.1.1;  <--- You can change to domain name

        return 301 https://192.168.1.1$request_uri; <--- You can change to domain name
}
...
...
...
server {
        # SSL configuration
        #
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        ssl_certificate /etc/nginx/ssl/XXXXX.crt;
        ssl_certificate_key /etc/nginx/ssl/XXXXX.key;
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;

        server_name 192.168.1.1;  <--- You can change to domain name

        # Specify a charset
        charset utf-8;

        # disable autoindex
        autoindex off;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                proxy_pass http://127.0.0.1:8080;  <-------  Tomcat Service
                #try_files $uri $uri/ =404;
        }
        ...
        ...
        ...
}
...
...
...
```

# 3. Restart Nginx
```
# sudo nginx -t
# sudo systemctl restart nginx
```

https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04
https://blog.gtwang.org/linux/nginx-create-and-install-ssl-certificate-on-ubuntu-linux/
Numpy > Fancy indexing > It creates copies not views

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p57
https://www.scipy-lectures.org/intro/numpy/array_object.html#fancy-indexing

3.1.7 Fancy indexing

> It creates copies not views.

パフォーマンスを気にする場合、viewとcopyの違いを意識することになるだろう。
【PHP】単純な文字列検索を行うならstrposを使おう

単純な文字列検索であればstrposが高速であるということですが、どれくらい違うのか検証してみました。

## 対象関数
- [preg_match](http://php.net/manual/ja/function.preg-match.php)
- [strstr](http://php.net/manual/ja/function.strstr.php)
- [strpos](http://php.net/manual/ja/function.strpos.php)

## 検証
```php:search.php
<?php

$word = 'hogehoge';

$start = microtime(true);
for ($i=0; $i < 10000000; $i++) {
    preg_match('/hoge/', $word);
}
$end = microtime(true);
$elapsed = $end - $start;
echo "preg_match：time = " . $elapsed . "[sec]" . PHP_EOL;

$start = microtime(true);
for ($i=0; $i < 10000000; $i++) {
    strstr('hoge', $word);
}
$end = microtime(true);
$elapsed = $end - $start;
echo "strstr：time = " . $elapsed . "[sec]" . PHP_EOL;

$start = microtime(true);
for ($i=0; $i < 10000000; $i++) {
    strpos('hoge', $word);
}
$end = microtime(true);
$elapsed = $end - $start;
echo "strpos：time = " . $elapsed . "[sec]" . PHP_EOL;
```

```bash
$ php search.php
preg_match：time = 2.2518329620361[sec]
strstr：time = 0.7945499420166[sec]
strpos：time = 0.43859314918518[sec]
```
Prettierで特定のコードをignoreする

小ネタ

# Prettierの整形対象にしたくないコードを指定する

[Prettier](https://prettier.io/)は近年注目のフロント向けコードフォーマッタ。

エディタ統合の自動整形やprecommit hookでの整形はとても重宝するが
特定のコードブロックに関しては可読性を上げるために整形対象外にしたいケースもある。

そんな時は「`// prettier-ignore`」コメントを使うといい。

```javascript
matrix(
  1, 0, 0,
  0, 1, 0,
  0, 0, 1
)

// prettier-ignore
matrix(
  1, 0, 0,
  0, 1, 0,
  0, 0, 1
)
```

↓Prettier実行

```javascript
matrix(1, 0, 0, 0, 1, 0, 0, 0, 1);

// prettier-ignore
matrix(
  1, 0, 0,
  0, 1, 0,
  0, 0, 1

```

こんな具合に「`prettier-ignore`」コメントの直後にあるコードのみignoreされる。
（関数、変数、コードブロックの単位）


react-routerのルーティングの一覧性を損ないたくない時に使えるなとおもった。

```jsx
// prettier-ignore
export default (
  <App>
    <Switch>
      <Route exact path="/" component={Home}/>
      <Route exact path="/about" component={About}/>
      {/* ↓が改行されずにすむ */}
      <Route exact path="/hello-long-length-path-page" component={HelloLongLengthPathPage}/>
      <Route exact path="/login" component={Login}/>
      ...
    </Switch>
  </App>
)
```


参考:
https://prettier.io/docs/en/ignore.html


おためし用リポジトリ:
https://github.com/kashira2339/prettier-demo
Numpy > np.may_share_memory() > may give you false positives

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
p56
3.1.6 Copies and views
https://www.scipy-lectures.org/intro/numpy/array_object.html#copies-and-views

(Note:下記、強調部分は記事執筆者が強調)
> You can use `np.may_share_memory()` to check if two arrays share the
same memory block. Note however, that this uses heuristics and may give you **false positives**.

https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.may_share_memory.html

> A return of True does not necessarily mean that the two arrays share any element. It just means that they might.
riot.js single tagの拡張。

### 配下に従属するタグが必要ない場合、tag無し表記で拡張できる。
```html
<script src="//gnjo.github.io/riot.js"></script>
<div data-is='text'>eeee xxx </div>
<hr>
<text>eeeee</text>
```
```js
riot.tag(`text`,false
,`contenteditable='plaintext-only' onclick={click} oninput={input}`
,function(opts){
 let o=this;
 o.click=function(ev){
  console.log('click')
 }
 o.input=function(ev){
  console.log('input',ev.target.textContent)
 }
});
riot.mount('text')
```
.split()と.sliceでデータを欲しい状態に整える

この記事は、プログラミング歴3ヶ月の私が、初心者の目線で、これからプログラムを勉強し始める方対象の記事です。
もし間違い等がございましたら、ご指摘いただけると幸いです。

# .split()でできること

.split()は入力されたデータに対して使用することのできるメソッドで、()内に含まれる文字列やデータで「分ける」ことができます。そして分けたものを、リストとして出力してくれるのが.splitメソッドの特徴です。

例えば、
"abcdabcdabcd"という文字列を "d"という文字列で区切ってみると

```js
var str = "abcdabcdabcd";   //strはstringの略で文字列の変数を作るときによく使うようです。
var s_str = str.split("d");　//1行目で定義したstrに対して文字列dで分けたものをs_strとします
console.log(s_str);　　//s_strを出力します。
```

という具合に使えます。
各行での処理結果は以下の通りです。
2行目と3行目の結果がリスト（[]←コレ！）になっていることがポイントです。

```js
var str = "abcdabcdabcd";   //abcdabcdabcd  
var s_str = str.split("d");　//  ["abc", "abc", "abc", ""]
console.log(s_str);　　// ["abc", "abc", "abc", ""]
```

## /\n/と/\s/でのsplit


### /\n/の使い方
入力されるデータが

```
Qiitaって
便利
だよね
```

というように改行がつけられていたときに使えるのが、/\n/です。
実はこの場合の入力データはPC内では以下のように認識されています。

```js
"Qiitaって\n便利\nだよね"
```

そのため、このデータを改行区切りするためには以下のような処理を行います。

```js
var str = "Qiitaって\n便利\nだよね"
var s_str = str.split(/\n/);
console.log(s_str);  // ["Qiitaって", "便利", "だよね"]
```

### /\s/の使い方
空白文字で区切るときに、/\s/を利用します。
入力されたデータが

```
I love JavaScript
```

だった場合、以下のような処理結果になります。

```js
var str = "I love JavaScript";
var s_str = str.split(/\s/);
console.log(s_str); // ["I","Love", "JavaScript"]
```
 
※ /\n/や/\s/と表記しましたが、大事なのは/nと/sという部分です。ちなみに、これらのことを正規表現と呼ぶみたいで、他にもいろんな種類があるので、興味がある方は"JavaScript 正規表現"とかでググってみてください！


# .slice()でできること

.slice()は、**リストに対して使える**メソッドです。
()内に、リストの何番目から何番目までの指定された範囲の部分文字列を出力します。

```js
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1, 3);
console.log(citrus);   //["Orange","Lemon"]が出力される
``` 

もっとわかりやすい説明があったので別サイトから引用させていただきます！
>"Thank you"という文字列を例に考えてみます。文字列は9個の文字が含まれており各文字に対するインデックスは次の通りです。 

``` 
T   0
h   1
a   2
n   3
k   4
    5
y   6
o   7
u   8
``` 

> この時、sliceメソッドを使用すると次のような部分文字列を取得できます。 

``` js
slice(0, 1) --> "T"
slice(0, 2) --> "Th"
slice(0, 3) --> "Tha"
slice(0, 4) --> "Than"
slice(0, 5) --> "Thank"
slice(3, 7) --> "nk y"
``` 
``` js
slice(0) --> "Thank you"
slice(6) --> "you"
``` 

出典：
sliceメソッド - Stringクラス - JavaScript入門
https://www.ajaxtower.jp/js/string_class/index6.html






## 不要な要素をsliceで削る
不要な要素をsliceを使って削るやり方を記載します。以下のように使えます。

```js
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var cutfruits = fruits.slice(0,-1);  //一番最後の要素から1番目を削除
console.log(cutfruits);  //["Banana", "Orange", "Lemon", "Apple"]
```

という具合にも使えます。

splitとsliceをうまく使えば、自分が処したいかたちのデータに変形することができるので、試してみてください！
CentOS 6.9 > nautilus > Move To Trash > デスクトップ上のTrashへ行かない | ファイルも消えない | 行方不明 > 発見: ~/.local/share/Trash

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```


データ処理をした結果ファイルの古いものをnautilusから消していた。

1. `nautilus .`
2. List表示
3. ディレクトリを選択
4. Move To Trash

df -k で容量を見ていたら、Availableがほとんど増えない。
GNOMEデスクトップ上のTrashにも来ていない。

同じディレクトリを`rm`で消した時は、Availableがきちんと増える。

行方不明となったディレクトリはどうしたものか。

### 発見

https://askubuntu.com/questions/288513/cant-move-files-to-the-trash
> answered May 9 '13 at 8:50
kr4utz

`~/.local/share`以下にTrashがあり、そこで見つかった。

242GBもデータがある。

どうりで、Availableが少ないはずだ。
gulp v4 ことはじめ 基本の基本


理解しやすいよう、ステップに分けて解説。
babel を使い、ES2015 (ES6) で書く。

## 前準備

"project/" ディレクトリをルートとし、その中で作業する。
以下、最終的なファイル構成。

```
project/
 ├ package.json
 ├ package.lock.json
 ├ gulpfile.babel.js
 ├ .babelrc
 ├ node_modules/
 │  └ インストールした npm パッケージ群
 ├ (style.css) // gulp の CSS タスクで style.scss から生成
 └ src/
   └ style.scss
```

package.json の作成 (-y は全てyes設定)
`npm init -y`

ES6 → ES5 のトランスパイルに必要なパッケージをインストール
`npm install -D babel-core babel-preset-env`
この時、package.lock.json が自動で生成される

gulpfile.babel.js、.babelrc、Sassファイルの作成
`mkdir src | touch src/style.scss gulpfile.babel.js .babelrc`

".babelrc" (bebel の変換設定ファイル) に以下を記述

```
{
  "presets": [
    ["env", {
      "targets": {
        "browsers": ["last 2 versions"]
      }
    }]
  ]
}
```


## gulp本体のインストール
`npm install -D gulp@next`
※ @nextを付けないとv3.9が入る (2018年4月8日現在)

gulp のコマンドを試してみる。
`npx gulp -v` → バージョンが表示される

補足：
npm 5.2 以降は `npx コマンド` でパッケージを直接実行できる。
gulp のグローバルへのインストールや、package.json の "scripts" 経由での実行は不要。


## gulp のタスクを書く

サンプルとして、[gulp-sass パッケージ](https://www.npmjs.com/package/gulp-sass) を使い、SCSS から CSS に変換するタスクを書く。

gulp-sass をインストール
`npm install -D gulp-sass`



gulpfile.babel.js に以下を記述

```gulpfile.babel.js
import gulp from 'gulp';
import sass from 'gulp-sass';

// パスの設定 (他タスクが増えた時に管理しやすいように)
const paths = {
  css: {
    src: './src/style.scss',
    dest: './'
  }
};

// `npx gulp css` で実行される CSS タスク
export function css() {
  return gulp.src(paths.css.src)
    .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError))
    .pipe(gulp.dest(paths.css.dest));
}
css.description = '変換：SCSS → CSS'; // gulp --tasks で注釈を表示

// `npx gulp` で実行されるデフォルトタスク
export default css;

```

タスクの書き方は何通りかあるが、今回は関数をそのままエクスポートする書き方を使った。関数名がタスク名となる。


## タスクを実行する

src/style.scss にサンプルコードを書く

```style.scss
$font-stack:    Helvetica, sans-serif;
$primary-color: #333;

body {
  font: 100% $font-stack;
  color: $primary-color;
}

```

`npx gulp css` で、CSS タスクを実行。
project/src/style.scss → project/style.css が生成される。
(※ "Failed to load external module @babel/register" とエラーが出るが、動作は問題ない。
babel-register をインストールしても同エラーは消えなかった)

default タスクに CSS タスクをセットしているので、`npx gulp` でも実行できる。


## 参考記事

* [gulpjs/gulp: The streaming build system](https://github.com/gulpjs/gulp/tree/master)
* [gulp/README.md at master · gulpjs/gulp](https://github.com/gulpjs/gulp/blob/master/docs/README.md)
* [gulp v4.0.0がプレリリース！ 移行方法と変更点まとめ - satoyan419.com](https://satoyan419.com/gulp-v4/)
circleCI2.0をローカルで実行する

# 概略

circleCI2.0から実行環境でDocker Imageが使えるようになりました。
ローカルのPCにDockerを入れてcircleCIを実行します。

OS : Mac OS X Yosemite version 10.10
docker : Version 18.03.0-ce

# circleCI2.0をローカルで実行するまで

### まずはdockerをインストール

```
$ brew cask install docker
```

### circleciのコマンドをインストール

```
$ curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci
```

### rootでなくても実行できるように権限を変更

```
$ chmod +x /usr/local/bin/circleci
```

### ビルド実行

```
$ circleci build --job hoge-test
```

hoge-testのところに、.ymlファイルのjob名を入れます。
※ymlの書き方については割愛

### Imagesの確認をする

入っいるimagesを確認
ビルド(circleci build)を実行した際にImagesが追加されていきます。

```
$ docker images
```

※始めて実行する時は時間がかかりますが、imagesが一回入っていればあとは早いです。imagesはvagrantのboxみたいなもので、.ymlファイルで定義してあるものです。

### Dockerコンテナの起動

入っているimagesを使いdockerを走らせログインすることも可能です。

```
docker run --rm -i -t circleci/php:hoge-images /bin/bash
```

※vagrant upに近いイメージです。exitで抜けるとdestroyするので使い切りのイメージです。

### おしまい

これで毎回リモートにプッシュしてビルドして確認しなくて済み、ローカルでdebugが可能となりました。

ただしjobのキャッシュはスキップされるのでローカルでは確認できないので注意が必要です。
( save_cacheとrestore_cache)

```Error: Skipping cache - error checking storage: not supported```
Word2vecのSkip-Gramについて


#はじめに
Word2vecのモデルの一つであるSkip-Gramについて説明する。



##Skip-Gram
Skip-Gramとは、雑に言うと、「ある単語が与えられたときに、その周囲に現れる単語を予測する」という問題を考え、これを精度よく答えられるように各単語の分散表現ベクトルを学習していくモデルである。

今以下のような語彙リストと文を考える。
V={$I$, $am$, $like$, $a$, $student$, $apple$}

$I$ $am$ $a$ $student$.

$am$を今注目する単語とする。このとき、$P(I|am)$と$P(a|am)$が高くなってほしい。逆に$P(like|am)$が低くなってほしい。


Skip-Gramのモデルは下記のように定式化できる。

```math
\max \dfrac{1}{T}\prod_{t=1}^{T} \prod_{-m\le j \le m, j\neq 0}P(w^{(t+j)}|w^{(t)})             \tag{1} 
```
$w^{t}$を今注目する単語とし、周囲の前後$m$個単語について出現する条件付き確率を計算する。この条件付き確率を文全体を通して最大化する。ここで、$m$はウインドウサイズ（window size）と呼ぶ。$T$はの文の長さとする。


次に、（1）式を変形して、次のようになる。

```math
\min-\dfrac{1}{T}\sum_{t=1}^{T} \sum_{-m\le j \le m, j\neq 0}\log P(w^{(t+j)}|w^{(t)})         \tag{2}
```

ここで、（2）式の中の確率の部分について詳しく説明する。
語彙のリストを$V$とする。注目する単語を中心語（center word）と呼び、$w_{c}$と表す。周囲の単語を背景語（outside word）と呼び、$w_{o}$と表す。中心語$w_{c}$を表すベクトルは$v_{c}$とする。背景語$w_{o}$を表すベクトルは$u_{o}$とする。

$w_{c}$の周囲に$w_{o}$が出現する確率はsoftmax関数を使って次のように計算する。

```math
p(w_{o}|w_{c})=\dfrac{\exp(\textbf{u}_{o}^{T}\textbf{v}_{c})}{\sum_{i \in \textit{V}} \exp(\textbf{u}_{i}^{T}\textbf{v}_{c})}   \tag{3}
```

ここで注意すべきところは、任意の単語wは中心語として使われる時もあるし、背景語として使われる時もある。したがって、任意の単語は二種類のベクトル表示がある。


学習する際に交差エントロピー関数を使って学習すればよいが、そのときの勾配の計算は次のようになる。

```math
\dfrac{\partial \log P(w_{o}|w_{c})}{\partial \textbf{v}_{c}}=
\textbf{u}_{o} - \sum_{j \in \textit{V}}\dfrac{\exp(\textbf{u}_{j}^{T}\textbf{v}_{c})}{\sum_{i \in \textit{V}}\exp(\textbf{u}_{i}^{T}\textbf{v}_{c})}\textbf{u}_{j}   \tag{4}
```

```math
\dfrac{\partial \log P(w_{o}|w_{c})}{\partial \textbf{u}_{o}}=
\textbf{v}_{c} - \dfrac{\exp(\textbf{u}_{o}^{T}\textbf{v}_{c})}{\sum_{i \in \textit{V}}\exp(\textbf{u}_{i}^{T}\textbf{v}_{c})}\textbf{v}_{c}   \tag{5}
```

また、（4）式と（5）式はそれぞれ次のように変形できる。

```math
\dfrac{\partial \log P(w_{o}|w_{c})}{\partial \textbf{v}_{c}}=
\textbf{u}_{o} - \sum_{j \in \textit{V}}P(w_{j}|w_{c})\textbf{u}_{j}   \tag{6}
```

```math
\dfrac{\partial \log P(w_{o}|w_{c})}{\partial \textbf{u}_{o}}=
\textbf{v}_{c} - P(w_{o}|w_{c})\textbf{v}_{c}   \tag{7}
```

（6）式から分かるように、一つの$v_{c}$について勾配を求めるには、$j \in V$を満たすすべての$w_{j}$について出現する確率を求める必要があるため、Skip-Gramの計算量が非常に大きい（実質不可能）。したがって、これを避けるため、Skip-GramではNegative Samplingという手法が使われて、Skip-Gram Negative Sampling（SGNS）と呼ばれることが多い。
個人開発用のインフラ選び（IaaS/PaaS/VPS）

#この記事はなに？
個人開発で、Railsを使ったWebサービスを公開するための環境選びをしたので、そこで調べた・考えた内容を共有します。
基本的に「最初はなるべくお金をかけず」「必要になったら課金すればスペックを上げられる」ことを重視しました。

実際の作業は2018年3月上旬に実施。
記事の情報は2018年4月12日時点まで更新済みです。

※あくまで個人で調べた範囲であり、個人の見解です。
サービス内容は随時変更されると思いますので、最新情報は各社サイトでご確認ください。

#サマリー
##目的
ちょっとしたWebサービスをいくつかリリースするための、インフラを確保する。
dockerの上に nginx+rails+postgres な環境を構築する想定。

##結論
自分はカゴヤVPSを選択。

#主な選択肢
- IaaS系*
 - Amazon Web Services (AWS)
 - Google Cloud Platform (GCP)
 - Microsoft Azure
 - IBM Cloud
- PaaS系
 - Heroku
- VPS系
 - ConoHa
 - GMOクラウド
 - さくらインターネット
 - WebArena (NTTPC) 
 - カゴヤ
 - VULTR（海外）
 - Digital Ocean（海外）

\*PaaS的な機能も多々展開されていますが、ここでは他との対比でIaaSというくくりにしました。

#比較1：IaaSかPaaSかVPSか
##IaaS系の特徴
- ○急にトラフィックが増えても対応しやすい
- ○なんかイケてる感
- ×時間課金。個人としては課金額が青天井になるのが怖い
- ×データ転送にも課金されることが多く、費用が読みにくい

##PaaS（というかHeroku）の特徴
- ○環境構築をほとんど意識しなくて良い
- ○Rails使うなら第1選択肢かも
- ○無料プランで試せる（ただし30分でサーバがスリープに入る）
- △有料プランは月額745円前後（$7）から。ドル建てなので為替の影響を受ける
- 独自ドメインでHTTPS対応にするには、有料プラン必須
- ×ファイルアップロードが必要なサービスを作る場合は、S3など外部ストレージとの連携が必須。最長でも24時間おきに実施されるサーバ再起動のタイミングでgit管理下にないローカルファイルは消去される仕様。

##VPS系の特徴
- ○月額固定料金で費用が読めるので個人でも安心
- △急にトラフィックが増えた時、スケールアップはできるがクラウドほど対応が早くない
- ×共有サーバなので、同居している他所様次第では処理スピードが出ないこともある
- ×海外のVPSはデータ転送量に制限があるか、従量課金になる

##個人としてはどれがいい？
青天井課金でクラウド破産したくないので、IaaS系は除外。
転送量の従量課金も避けたいので海外VPSも除外。
Herokuは良さそう。インフラを気にせず最速でアプリをリリースするにはベストかも。
国内VPSだと、月額が安く転送量課金もないので「お小遣いの範囲」で構築するには最適。その代わりインフラの知識はある程度必要。特にOS周り。

今回は、インフラ周りの勉強も兼ねようということで、あえて国内VPSを選択しました。

#比較2：どのVPSにする？
最小プランで比較しました。
※2018年4月時点の情報です。お読みの時点では変化している可能性もあります。最新情報は各社公式サイトでご確認ください。

##費用一覧（最小プランの月額料金が安い順）
|       |初期費用|月額料金|メモリ|CPU |ディスク|データ転送量|
|:-------|------|------|-----|-----|------|---------:|
|WebArena| 無料  |360円 |512MB|1core|SSD 20GB|無制限|
|ConoHa | 無料   |630円 |512MB|1core|SSD 20GB|無制限|
|カゴヤ  | 無料   |648円 |1GB |1core|SSD 20GB|無制限|
|さくら  |1,080円|685円 |512MB|1core|SSD 20GB|無制限|
|参考：WebArena*| 無料  |720円 |1GB|2core|SSD 30GB|無制限|
|GMOクラウド| 無料 |780円**|1GB  |2core|SSD 50GB|無制限|

\*WebArenaの1GBプランは最安プランではないので参考扱いですが、コア数・ディスク容量も多く魅力的です。
\*\*12ヶ月契約時の月額。1ヶ月契約だと980円。


##カゴヤを選択するまでの道のり
###1.WebArena良さそう
3月上旬時点では512MB・1GB・2GBのプランが「在庫切れ」。2018年2月以降在庫切れが続いていたようです。
よって、残念ながら契約できませんでした。機会損失ですね。
その後3月下旬に一度復活したようですが、4月12日現在512MB・1GBのプランが「在庫不足」でインスタンスを生成できないことがあるようです。
気長に待てる人なら単価が安いので良いかもしれません。

###2.じゃぁConoHaか？
DoS攻撃を食らった時に、利用者側のせいにされて解約に至るという事例が複数あったことが判明。
[事例1(https://qiita.com/suin/items/58ddfc5b6186b1b8a4af)]
[事例2(https://i-think-it.net/conoha-vps-server-shutdown-cancel/)]

DoS攻撃を食らうかどうかは運次第なので、さすがにそれでは安心してサーバ運用できないと考え、選外に。
同じ理由でGMOクラウドも選外。スペックからみたコスパは比較的良さそうでしたが。

###3.それならカゴヤは？
以前セキュリティ事故（クレジットカード情報の漏洩）があった模様。ちょっと微妙か。
（と、この時点ではこれ以上調べず次へ行きました）

###4.では、さくら？
試用してみたところ、外部のストレージサービスへデータバックアップを取ると、転送量増加により処理制限がかかってしまうことが判明。
→試用期間中は転送量制限があるとの情報をコメントでいただきました。調べ切れていませんでした...
~~よって~~転送量制限は本契約後も続くと誤解してしまったこともあり、試用期間満了を待たずに契約終了。
~~試用期間内にわかったからよかったようなものの、初期費用を払った後だったら撤退判断ができたかどうか。~~

初期費用なしの方が機動的に対応できますし。

###5.カゴヤを改めて調べてみる
セキュリティ事故の後、クレジットカード決済関係は完全に外部委託*になっていることが判明。
なので、その点は問題なしと判断。
そうなると、契約できる中で最安なので、カゴヤに決定。
費用が日割りなのもプラス要素。最悪何かデメリットがあっても出費を抑えやすいので。

*GMOペイメントゲートウェイ株式会社。EC決済関係の大手ですね。

#さいごに
このような流れで、私はカゴヤの採用を決定しました。
人により採用基準は色々あると思いますが、何かの参考になりましたら幸いです。
【Raspberry Pi 2 Model B】初めての電子工作 タクトスイッチに挑戦

##概要
[別の記事](https://qiita.com/sunaga70/items/89e2d1eecfd73d3fef21)で作ったリモートボタンが地味に便利で、某Dashとかいろいろ試している最中であり、せっかくラズパイなんだから、王道の物理ボタンにもチャレンジしてみようと思ったのがきっかけです。

##参考にしたサイト

- [Raspberry Pi 3でタクトスイッチを使ったLED制御](http://l-w-i.net/t/raspbian/led_002.txt)
- [Raspberry Pi タクトスイッチの入力を扱う その1](http://robocad.blog.jp/archives/678444.html)
- [ラズパイ+タクトスイッチでSlack用へぇボタン作成してみた](https://qiita.com/toshihirock/items/bfdbc8bcf7165ef1aa18)

##前提条件

- モデル : Raspberry Pi 3 Model B
- OS : Raspbian Stretch

```Bash:
$ uname -a
Linux raspberrypi 4.14.32-v7+ #1106 SMP Wed Apr 4 18:19:23 BST 2018 armv7l GNU/Linux
```

##構成
電子工作はほぼ初めてなので単純構成。スイッチと3.3V、GPIO14を接続しただけです。中学？高校？くらいの知識を思い出して理解しました。プルダウン抵抗がない？気にしない！
![Untitled Sketch 3_ブレッドボード.jpg](https://qiita-image-store.s3.amazonaws.com/0/247920/3d1b61bd-5e3d-11bd-0a36-725d706ea8a2.jpeg)

##動作確認
Pythonで動作確認します。

```Python:button_test.py
#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

try:
    while True:
        if GPIO.input(14) == GPIO.HIGH:
            print("14")
            
        time.sleep(0.1)

except KeyboardInterrupt:
    pass

GPIO.cleanup()
```
Raspberry Piには内部にプルダウン抵抗が用意されていて、通常
GPIO.setup(14, GPIO.IN) と書くところを
GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) とすることで有効になる模様。
では実行。停止はCTRL+Cで。

```Bash:
$ python button_test.py
14
14
14
```
スイッチを押したとき、14が表示されれば成功です。

##もっとボタンが欲しい
ということで４つ接続しました。
![Untitled Sketch 3_ブレッドボード2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247920/54ffa0c1-acfc-fcf4-8c91-7fcac441f809.jpeg)

```Python:button_test.py
#!/usr/bin/env python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

try:
    while True:
        if GPIO.input(14) == GPIO.HIGH:
            print("14")
        elif GPIO.input(15) == GPIO.HIGH:
            print("15")
        elif GPIO.input(23) == GPIO.HIGH:
            print("23")
        elif GPIO.input(24) == GPIO.HIGH:
            print("24")
            
        time.sleep(0.1)

except KeyboardInterrupt:
    pass

GPIO.cleanup()
```

```Bash:
$ python button_test.py
14
15
23
24
```
これで、４つの処理を割り当てることができそうです。
携帯性は失われましたが・・・
![DSCN5666.JPG](https://qiita-image-store.s3.amazonaws.com/0/247920/d3ee12ee-62ac-7dd9-aae5-4a444cfa0b83.jpeg)
VirtualBox上の仮想OSでWebカメラを使えるようにする

# はじめに

VirtualBoxでは仮想OSでWebカメラを使用する際に設定が必要だ.備忘録としてここに手順を残す.

**環境**

|||
|:-:|:-:|
|ホストOS| Windows10 Home|
|ゲストOS|Ubuntu16.04LTS|
|VirtualBox|VirtualBox 5.1.3|

# Extension Packの導入

使用しているVirtualBoxのバージョンに合ったExtension Packをダウンロードする.

[ダウンロードページ](https://www.virtualbox.org/wiki/Downloads)

# ホストOS上での操作

Extension Packのダウンロードに成功したら,ターミナルにてコマンドによるVirtualBoxの操作を行う.

今回はホストOSがWindows10であることを想定しているのでコマンドプロンプト上による操作を前提とする.

コマンドプロンプトからVirtualBoxのプログラムファイルが格納されているディレクトリに移動することでVirtualBoxに設定を行う`VBoxManage`コマンドを使用できる.

```
C:\Users\username>cd ../../
C:\>
C:\>cd Program Files\Oracle\VirtualBox
C:\Program Files\Oracle\VirtualBox>
```
`VBoxManage list runningvms`で使用している仮想マシンの環境を表示できる.

```
C:\Program Files\Oracle\VirtualBox>VBoxManage list runningvms
"<Guest Machine name>" {}

```

`VBoxManage list webcams`で仮想マシンにて使用可能なWebカメラを確認できる.

```
C:\Program Files\Oracle\VirtualBox>VBoxManage list webcams
Video Input Devices: 1
.1 "Chicony USB 2.0 WebCamera"
"path of webcam"
```
上記の実行結果に表示されている`.1`がWebカメラに割り振られている番号である.

仮想マシン名とWebカメラの番号が確認できた場合,仮想マシンにてWebカメラを使用する設定を下記のコマンドで行う.

```
C:\Program Files\Oracle\VirtualBox>VboxManage controlvm "<Guest Machine name>" webcam attach .1
```

# VirtualBoxの設定

設定に成功すると,VirtualBoxのウィンドウにて`Devices`のメニューに`Webcams`の項目が追加されている.

この項目にチェックを入れることで仮想マシン上でWebカメラが使用できるようになる.
改行コードをCRLFからLFに変換する

何番煎じかわかりませんが備忘録。

# コマンド
```
cat input.txt | tr -d '\r'
```

正確にはtrコマンドでCRを取り除いています。

## 補足
trコマンド : 文字を一括置換する
-d オプション : 対象文字を削除する
Setに無ければ追加、あればエラーメッセージ

例えば、「何かのリストなどからランダムに選び、すでに選んだものをSetに入れる」ということをする場合、
「選んだものがSetに無ければ追加、あればエラーメッセージなどの処理を行う」というのは割とありそう。
これは直感的には

```java:無ければ追加、あればエラー
Set<Integer> set = new HashSet<>();
for (int i = 0; i < 10; i++){
    int r = (int)(Math.random() * 10);
    if (!set.contains(r)) {
        set.add(r);
    } else {
        System.out.println(r + "はすでに入っている");
    }
}
```

このように、入れる前にcontainsで調べる、と書きたくなる。
しかし、実はこんな書き方もできる。

```java:追加できなかったらエラー
Set<Integer> set = new HashSet<>();
for (int i = 0; i < 10; i++){
    int r = (int)(Math.random() * 10);
    if (!set.add(r)) {
        System.out.println(r + "はすでに入っている");
    }
}
```

入っているかどうかを事前にチェックせず、いきなりaddし、それをifに入れることができるのである。

実はあまり日の目を見ることはないが、Setをはじめとする[Collectionインタフェース](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collection.html)のaddメソッドはbooleanを返す。
内容を見ると、

> 指定された要素がこのコレクションに格納されていることを保証します(オプションの操作)。この呼出しの結果、コレクションが変更された場合はtrueを返します。このコレクションが要素の重複を許可せず、指定された要素がすでに含まれている場合はfalseを返します。

addは「追加する」メソッドではなく、「その要素があることを保証する」メソッドであり、その前後でコレクションが変わったかどうかの結果を返す。
Setの場合は入れようとした要素がすでにある場合は追加しない。つまりSetが変更されることはないため、falseを返す。これがそのまま「入っていたかどうか」の判定に使えるわけだ。同時に、無かった場合はすでに追加を完了しているため、「無かった場合」に追加する処理を改めて書く必要がなくなる。

##とはいえ
直感的に読みにくいコードであることには違いないだろう。Set以外にこのCollection#addの性質を活かせる場面はあるのだろうか…？
アプリケーションサーバをpumaからunicornに変更した

pumaを使用していてハングアップする現象が発生したから、unicornにしてみた。
って時にやったことを書きます。（ほぼほぼ自分メモです。）
ruby on rails初心者、初投稿なので、優しい目で読んでいただけたらと思います。
（コメントもお待ちしています）

# 内容
puma→unicornに移行した時にやったこと。
gemとか設定ファイルとか・・・

# やったこと
## Gemfileの編集
Gemfileに記載している内容を変更

pumaの箇所をコメントアウト
`#gem 'puma'`

unicornを追加
`gem 'unicorn'`

## unicorn.rbを作成
`config/unicorn.rb`を作成
監視を行うと設定が増えるらしい・・・

```ruby:config/unicorn.rb
rails_root = ENV['RAILS_ROOT']
worker_processes Integer(ENV['WEB_CONCURRENCY'] || 1)
timeout 300 # タイムアウト
preload_app true # 更新時ダウンタイム無し

# listen 8080
listen "#{rails_root}/tmp/unicorn.sock"
pid "#{rails_root}/tmp/unicorn.pid"

# ログの出力
stderr_path File.expand_path('log/unicorn.log', rails_root)
stdout_path File.expand_path('log/unicorn.log', rails_root)
```

## railsの実行コマンドを変更
Dockerfileに記載しているrails実行コマンドを変更
今回はdevelopモードで起動
※docker-compose.ymlに記載する場合もある

```text:Dockerfile
# 既存の実行コマンドをコメントアウト
#CMD ["rails", "s"]
CMD ["bundle", "exec", "unicorn_rails", "-c", "/opt/application/current/config/unicorn.rb", "-E", "development", "-l", "3000"]
```

## railsのコンフィグを編集（development.rb）
ブラウザから接続した際に、assetsの内容（cssとか）のダウンロードに失敗していたため、コンフィグファイルを編集（config/environments/development.rb）
[参考にしたもの](https://teratail.com/questions/56894)

```ruby:config/environments/development.rb
# 追加
config.logger = ActiveSupport::Logger.new(STDOUT)
```


些細なことでも書いていこー！
Outlook2013でメールが元に戻せなくなった場合

は
削除して下書きに移動してやると移動フラグがリセットされるのかも知れないけど
元に戻せましたっ(*^^*)

まぁ多分サーバーとの整合性のため元に戻せなくなったのかと思いますけどねっ
メモ；rubyのsystemとrequireの違い

eachメソッドで、rubyスクリプトを回数指定実行→成功すれば繰り返し、失敗すれば停止の簡単なスクリプトを制作した。

```rb
(1..n).each { |i|
result =system("./test.rb")
   if( result == true )
      puts ="success"
   else
      puts "error"
      break
end
```

こんな感じ

requireでも実行出来ると知って実行してみた
すると


systemでの実行→successが入りループ
requireでの実行→success後else文を読み込んでしまう

eachかifかと機能できない？

何故だか検証していないにでわからないけれど、こんな結果があったというメモ

追記
requireの特徴に同じファイルは二度以上ロードしないがあるらしいですね。なるほど


追記
コード部分の編集理解していなくて困ってました。編集リクエストありがとうございました！助かりました。
【メモ】GitHubでレビューを依頼するときにはReviewersとAssigneesをつける

# GitHubでレビューを依頼するときにはReviewersとAssigneesをつける

GitHubで実装し、pull/reqを出してレビューをしてもらう際に、pull/req画面の右側で以下のReviewersとAssigneesを設定すると誰がレビューア(Reviewers)で誰が担当者(Assignees)かを明確にすることができる。

### レビューア(Reviewers)
![スクリーンショット 2018-04-12 10.22.56.png](https://qiita-image-store.s3.amazonaws.com/0/145611/864e9cb1-d36f-1e95-8ab9-2d1a629f0c76.png)



### 担当者(Assignees)
![スクリーンショット 2018-04-12 10.23.06.png](https://qiita-image-store.s3.amazonaws.com/0/145611/613f37e3-908f-e8a2-a0ec-601bf0cdbc7d.png)
OpenPose - 公式ドキュメントについて

公式ドキュメント：https://github.com/CMU-Perceptual-Computing-Lab/openpose/tree/master/doc

## フォルダ/ファイル名と概要
- [**GUI_help**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/tree/master/doc/GUI_help) : GUIのショートカット
- **UML/1_0_0r3** : 
- **media** : 
- [**3d_reconstruction_demo.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/3d_reconstruction_demo.md) : 3次元Keypoint構築の実験的モジュールとデモ方法
- [**contributors.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/contributors.md) : 開発者の情報
- [**demo_overview.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/demo_overview.md) : デモに必要なコマンドとオプションの値**【★】**
- **doc_autogeneration.doxygen** : 
- [**faq.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/faq.md) : よくある質問
- [**installation.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation.md#installation---demo) : 高度な利用を行う人向けのインストールマニュアル
- **installation_deprecated.md** : 
- [**installation_jetson_tx2.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation_jetson_tx2.md) : NVIDIA Jetson TX2向けのインストール方法
- **library_add_new_module.md** : 
- **library_extend_functionality.md** : 
- **library_how_to_develop.md** : 
- **library_introduction.md** : 
- **library_overview.md** : 
- [**output.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/output.md) : データ出力フォーマット, Keypoint番号等**【★】**
- [**quick_start.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/quick_start.md) : とりあえず動かしてみたい人がまず見るところ**【★】**
- [**release_notes.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/release_notes.md) : リリースノート．過去の変更点と将来の変更予定
- [**released_features.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/released_features.md) : 過去リリースの特徴
- [**standalone_face_or_hand_keypoint_detector.md**](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/standalone_face_or_hand_keypoint_detector.md) : FaceかHandだけ(Bodyなし)検出したい場合
wxPythonを使ってみる (1)

## はじめに
#### 対象
　Python3による開発経験のある方を対象としています．Python3プログラミングの基礎や開発環境の作り方，使い方は特に説明しません．
　既にPython3とwxPythonがインストールされていることを前提としています．
#### wxPythonとは
　wxPythonは，Python3から利用できるGUIツールキットです．
#### 動作環境
　動作確認に使用したバージョンは以下のとおりです。
　Python 3.6.4
　wxPython 4.0.1

## windowを使う
### 単純なwindow表示

```python3:window_display01.py
import wx
app = wx.App()
frame = wx.Frame(None, -1, 'Hello,World!',size=(500,500))
frame.Show()
app.MainLoop()
```

まず，```import wx``` を使ってwxモジュールのインポートを行います．もちろん，wxPythonをインストールしていないとImportErrorが発生します．

```app = wx.App()``` はwx.Appオブジェクトをインスタンス化しています．wxPythonを利用するため必須なインスタンス．

3行目は，親オブジェクト，ID，タイトルの引数でwx.Frameオブジェクトをインスタンス化しています．また，sizeはwindowのサイズ(幅×高さ)となります．

```frame.Show()``` はwx.FrameクラスのShow関数を呼び出すことによって，作成されたフレームが可視化されます．window_display.pyの実行結果は下の図となります．
<img width="503" alt="スクリーンショット 2018-04-10 11.10.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/b1157daa-6255-e164-854e-eaa93c465690.png">

```app.MainLoop()```  はwx.AppのMainLoop関数を呼び出しを行い，イベントのキャッチを開始します．この行をコメントアウトして再実行すると，フレームが一瞬表示されたあと，アプリケーションが終了してしまいます．


#### 追記：
今回のサンプルコードではwx.Appクラスを引数なしでインスタンス化していますが，最大で4つの引数を渡すことができます．以下の4つのappをそれぞれ試してください．

```python3:window_display02.py
import wx
(1) app = wx.App()
(2) app = wx.App(False)
(3) app = wx.App(True,"出力ファイルパス")
(4) app = wx.App(True,None)
frame = wx.Frame(None, -1, 'Hello,World!',size=(500,500))
frame.Show()
print("Welcome")
app.MainLoop()
```

## 予約済みID

以下のサンプルコードは予約済みIDを利用したwx.Buttonの例です．

```python3:window_display03.py
import wx
app = wx.App(False)
frame = wx.Frame(None, -1, 'Hello,World!' ,size=(300,100))

wx.Button(frame, wx.ID_OPEN, pos=(10,10) ,label="開く")
wx.Button(frame, wx.ID_CLOSE, pos=(10,40))
wx.Button(frame, wx.ID_NEW, pos=(100,10))
wx.Button(frame, wx.ID_SAVE, pos=(100,40))
wx.Button(frame, wx.ID_HELP, pos=(200,40))

frame.Show()
app.MainLoop()
```
下の図は実行結果となります．
wx.ID_OPEN，wx.ID_CLOSE，wx.ID_NEWなどは「予約済みIDとなります．
posはボタンの配置座標(縦×横)となります．
labelはボタンのラベル名となります．

<img width="292" alt="スクリーンショット 2018-04-10 12.19.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/53a6e5f5-db88-77cb-faae-8408fd0154ad.png">


今回のwxPythonを使ってみる(1)は以上で終わります．
読んでいただいてありがとうございます．
また今度で会いましょ！
scpでリモートサーバーからリモートサーバーにファイル転送

# やりたいこと

```text
[localhost] ┬────ssh接続可能────────[remotehost1] 
            │                           │
            │                           ×ここはつながってない
            │                           │
            └────ssh接続可能─────────[remotehost2]
```

上記のような環境で、localhostから、remotehost1のファイルをremotehost2にできれば **ワンコマンド** でコピーする

# 答え

結論から言うと、`-3` オプションをつけることで可能となります。

```bash
scp -3 remotehost1:text.txt remotehost2:
```

# 解説

興味のある方のみどうぞ。。
大したことではなく、scpの仕様の問題です。

単純にやろうとすると、以下を書きたくなります。

```bash
scp remotehost1:text.txt remotehost2:
```

→これは、失敗します。

```
ssh: connect to host [remotehost2のIP] port 22: Connection timed out
lost connection
Connection [remotehost1のIP] closed.
```

なぜなら、上記のような書き方をした場合、

```
[localhost]───────ssh接続可能────────[remotehost1]──────────ssh接続可能──────────[remotehost2]
```

であることが条件となります。
つまり、実際のファイル転送は、`remotehost1`が行うようです。
CSSフレームワークBulmaの概要をまとめてみた

![bulma-banner.png](https://qiita-image-store.s3.amazonaws.com/0/172399/bc67931c-06b0-c10a-483f-0e44b30e201c.png)

# 本記事の内容
簡単な文法で、モダンなWebデザインが構築可能な[BULMA](https://bulma.io/)の概要をまとめまてみました。
以下の内容は、公式HPの[Overview](https://bulma.io/documentation/overview/start/)をまとめたものです。

# 関連記事
概要ではなく、個別の機能については以下の記事にまとめています。

- [CSSフレームワークBulmaのModifiersとは](https://qiita.com/yampy/items/c93067f85beac9f84abd)
    

# BULMAとは
CSS3標準のFlexboxをベースにした、オープンソースのCSSフレームワークです。

公式HP:https://bulma.io

# Overview

## Getting started
BULMAの利用方法は3つあります。
npm, CDN, github直接ダウンロードにより利用可能です。

ex) npmの場合：

```
npm install bulma
```

## Customize
BULMAのすべてのscssクラスは、独自に上書き可能です。

ex) `pink`, `primary`の上書き

```
$pink: #ffb3b3;
$primary: $pink;
```

## Modular
BULMAのモジュールは、個別にimpot可能です。
全部で39のscssクラスがあります。

ex) クラスの個別import

```
@import "bulma/sass/utilities/_all"
@import "bulma/sass/grid/columns"
```

## Responsiveness
BULMAの全要素はモバイルファーストであり、縦スクロール読みに最適化されています。

- `columns`：縦に積み上がる
- `level`：コンポーネントの子要素を縦に積み上げる
- `nav`：（モバイルで）非表示される

水平なレイアウトにする場合、`is-mobile` modifierを追加することで強制できます。

BULMAでは、各種端末画面用のサイズ（`mobile`, `tablet`, `desktop`, `widescreen`, `fullhd`）がデフォルトで設定されています。

各画面の境界値は、以下参照：
https://bulma.io/documentation/overview/responsiveness/#breakpoints

## Variables
初期設定された変数が、簡単な文字列により利用可能です。

ex)
- 色：`$blue: hsl(217, 71%, 53%)`
- フォントサイズ：`$size-1: 3rem`
- 幅：`$gap: 32px`
- 他の設定：`$easing: ease-out` や `$radius-large: 5px`など

Variablesの詳細は、以下参照：
https://bulma.io/documentation/overview/variables/#initial-variables

## Colors
ほとんどのコンポーネントは、`is-primary`や`is-dark`などのmodifierにより色の変更が可能です。

Colorsの詳細は、以下参照：
https://bulma.io/documentation/overview/colors/

## Functions
カスタムファンクションによって、値や色の計算が動的に可能です。

ex)
- `powerNumber($number, $exp)` : 累乗計算。数値を返却します。
- `colorLuminance($color)`
- `findColorInvert($color)`

findColorInvert()の具体例は、以下参照：
https://bulma.io/documentation/overview/functions/#the-code-findcolorinvert-code-function

## Mixins
その他、要素のカスタマイズやレスポンシブの為の様々な機能が用意されています。

ex)
- `=block` :要素の最後の子要素の下部に、1.5remのマージンをセットする。 
- `=center($size)` : 位置を親要素の中心にセットする。
- `fa($size, $dimensions)` : Font Awesomeアイコンのコンテナをセットする。

Mixinsの詳細は、以下参照：
https://bulma.io/documentation/overview/mixins/

# 参考
- [BULMA](https://bulma.io)
PhpStormでパラメタの値を使ってない警告を黙らせたい

PhpStormはコードを検査しておかしなものはいろいろ警告してくれて有り難いのですが、ちょっとうるさすぎることがあります。

そのひとつに、パラメタの値を使ってない場合の警告があります。場合によっては本当に使わないのだけどだからといってパラメタを削るわけにはいかないこともあります。

例えばLaravelで独自のバリデータを定義する `Validator::extend` ではバリデート処理を定義するための無名関数にいろいろ渡されてきますが、結局の所そのパラメタの値である `$value` だけしか使わないことがよくあります。

![スクリーンショット 2018-04-12 9.27.40.png](https://qiita-image-store.s3.amazonaws.com/0/41523/19f506d2-bff3-aed6-57ca-4836167a56f5.png)


PhpStormの機能としてこれを黙らせるには以下のような方法があります。

* Preferenceで設定する。オプションで無名関数についてだけ黙らせることも可能。
* アノテーション `/** @noinspection PhpUnusedParameterInspection */` を使う

でもどちらもちょっと範囲が広すぎて、上の例だと `$value` 以外の3つのパラメタについてだけ黙らせたいのですがうまくいきません。Perferenceはそもそも全体に影響しますし、`@noinspection` アノテーションでもブロックの最後までが影響範囲になってしまうのでパラメタごとに抑止するかしないか切り替えることはできないようです。

そこで考えたのが以下の方法です。

```php
        Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {
            assert([$attribute, $parameters, $validator]); // unused
            
            return $value === 'foo'
        });
```

使ってないとおこられるのなら使えば黙るんだろうということですね。PHP7だと `zend.assertions` を-1にしとけば `assert()` のコード生成がされなくなるので本番系などではそうしとけば性能への影響はないはず。やりすぎ?

PHPにも他の言語でよくある使わないパラメタを明示する方法(たとえば `function (_, $value, _, _)` みたいの)があるといいんですけどね。
Storjを利用する方法

2018/4/12時点では、Storjは「次の世代のネットワークを作るまで、制限中」とのことでストレージ利用(storj.ioでの新規アカウントの発行)は受け付けていません。(正確には、アカウントは発行できるのだけどアクティベーションできない状態になる。)

状況変わったら更新します。

(Storjにストレージを提供する方法についてはこちら→https://qiita.com/kikuzo/items/e1fa9184cfc792862afc)

<img width="721" alt="storj-register.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/172921/ce2e9db7-5a86-becc-5b64-873a65494a14.jpeg">
<img width="1237" alt="storj-accountcreated2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/172921/a03be3a3-ba47-0d06-b7b2-1a784aa6da26.jpeg">


### 参考リンク
- Storj本家サイト : https://storj.io/
- アカウント発行ページ : https://app.storj.io/signup

- やってみた人の記事 : http://mogamin.hatenablog.jp/entry/HowtoStorj
 - 1月時点ではアカウント登録を受け付けていたようだ...。