OmniAICreator/Qiita-1.07M huggingface dataset:
定期的にスクリプトを自動実行させる

cronというものを使います。以下の3ステップでできます。

#### 1. 実行するスクリプトをつくります

ここでは `myjob.sh`という名前でつくってみます

```bash:myjob.sh
echo "hello"
```

#### 2. 自動実行ルールを書いたファイルをつくります

以下の書式に従って記述します

```bash
分 時 日 月 曜日 <実行コマンド>
```

ここでは毎時0分に実行するルールを `cron.conf`という名前でつくってみます

```bash:cron.conf
0 * * * * /bin/bash myjob.sh
```

>間隔指定・複数指定・範囲指定もできます
>
```bash
*/5 * * * * /bin/bash myjob.sh # 5分おきに実行
0,30 * * * * /bin/bash myjob.sh # 0分と30分に実行
3-5 * * * * /bin/bash myjob.sh # 3分、4分、5分に実行
```

#### 3. cronにジョブとして登録します

```bash
$ crontab cron.conf
```

以下のコマンドで現在のジョブを確認できます。

```bash
$ crontab -l

0 * * * * /bin/bash myjob.sh
```

これで完了です。
Pythonによるデータ解析


# Pythonによるデータ解析

## 環境構築（Python 2）

### 仮想環境を作る

yml形式で以下のようなファイルを作成しておく。

name: 仮想環境名 (ここではpy2)
dependencies: 必要なパッケージリスト

```
name: py2
channels:
    - conda-forge
dependencies:
    - python=2.7
    - xarray
    - netCDF4
    - seaborn
    - numpy
    - matplotlib
    - scipy
    - pip:
        - cyordereddict
        - sqlalchemy
        - model-organization
```

その後、以下のコマンドで仮想環境を新規構築、アクティベートする。

```
$ conda env create -f environment.yml
$ source /home/user-name/.pyenv/versions/anaconda3-4.1.0/envs/py2/bin/activate py2
（activateをフルパスで指定しないと落ちる場合がある。）
```

### AnacondaでPython環境を構築しているが、ほしいパッケージがcondaにない場合

```
$ source activate <anaconda環境名>
$ pip install　<モジュール名>
```

既存の環境名の確認
デフォルトはroot

```
$ conda info --envs
```


## jupyter notebook

### localhostのポート番号を指定して立ち上げる。

```
$ jupyter notebook --port xxxx
```

あるいは、jupyter notebookの設定を編集する。
c.NotebookApp.portをコメントアウトしてポート番号を設定する。

```
$ .jupyter/jupyter_notebook_config.py
c.NotebookApp.port = xxxx
```

### プロファイルの設定

プロファイルを作成していなければ以下のコマンドで作成する
```
$ ipython profile create
```

これにより、
~/.ipython/profile_default/ipython_config.py
が作成される。

以下のように編集すると、起動時に%matplotlib inlineが読み込まれ、matplotlibのグラフがインラインで表示されるようになる。

```
# lines of code to run at IPython startup.
# c.InteractiveShellApp.exec_lines = traitlets.Undefined
c.InteractiveShellApp.exec_lines = ['%matplotlib inline']
```
PocketMine-MPサーバー構築

# スマホ or Windows10版マインクラフトサーバー

スマホで出来るマインクラフト「Minecraft PE」のマルチサーバー、「PocketMine-MP」を、オフィシャルサイトから落としてきて実行してもなぜかスマホからは接続出来なかったが、とあるサイトに貼ってあったアドレスからのダウンロードで、なぜか接続出来るようになったので備忘録。

最初は、PHP5.6に戻したからだと思っていたが、PHP7.1.4のサーバーでもちゃんと動いている。

接続出来るようになるのは、

```wget -q -O - https://get.pmmp.io | bash -s -```

でダウンロードしてから「start.sh」でインストーラーを実行すると出来たもの。
Grails 3.Xのcreate-appでrest-apiプロファイルのアプリを作成する（２）

# 概要

Grails 3.2.7 でRESTのアプリのプロファイルを使ってお手軽にドメインを叩けるようにするまでのお話。前回はcreate-appからgenerate-allまでやったので、今回はRESTのAPIの叩き方とMySQL 5.7への接続の部分をまとめたいと思います。

### 使用環境

* Windows7 64bit
* posh-gvm
* Grails 3.2.7
* Groovy 2.4.9
* MySQL 5.7.17
* mysql-connector-java 6.0.6

# 手順

## REST-APIの動作確認

前回作成したREST APIを叩く部分をもう少し掘り下げていきたいと思います。

## MySQL 接続設定

Grails 3ではデフォルトのDB接続先はメモリDBのh2が指定されるようになっていて、これはこれで便利なのですが、実際にh2でプロダクト作ることはあんまりないと思うので、MySQLにつなぐやり方で接続の設定を入れていきたいと思います。

### MySQL側セットアップ

ローカルにMySQL 5.7をインストールして、スキーマを作成する。
UTF8はutf8mb4を指定しておく。

WorkBench使えばGUIで設定できますが、念のためSQL書いておく。

```sql
CREATE SCHEMA myschema DEFAULT CHARACTER SET utf8mb4;
```

### build.gradle

ビルドの依存関係にJDBCを追加しておく。
セントラルリポジトリは以下なので、適宜最新版なり対応しているバージョンを使う。

https://mvnrepository.com/artifact/mysql/mysql-connector-java

```
dependencies {
    //runtime "com.h2database:h2"
    runtime 'mysql:mysql-connector-java:6.0.6'
}
```

### application.yml

Grails 3からConfig.groovyじゃなくてapplication.ymlで設定するのがお作法のようだ。
接続先データソースの設定とかは従来のGrailsやJDBCの接続URIと変わらないので、各自の環境に合わせて記載してください。
以下の例だとローカルに立てたMySQL 5.7のmyschemaにつなぐやり方です。

dialectは ORマッパー Hibernate の値を指定することになりますが、ドキュメント見ていくとMySQL57InnoDBDialectってのがあるのでコレっぽい感触。MySQL5Dialect とか MySQL5InnoDBDialect とかいろいろあってややこしい事この上ない。

https://docs.jboss.org/hibernate/orm/5.1/javadocs/org/hibernate/dialect/package-summary.html

```yaml
environments:
    development:
        dataSource:
            dbCreate: create-drop
            url: jdbc:mysql://localhost:3306/myschema?useSSL=false&requireSSL=false&characterEncoding=utf8

dataSource:
    pooled: true
    jmxExport: true
    driverClassName: com.mysql.cj.jdbc.Driver
    dialect: org.hibernate.dialect.MySQL57InnoDBDialect
    username: mysql
    password: mysql
```

[別記事](http://qiita.com/KKZ@github/items/a898c52ac16a5215af32 "Grails 3 + MySQLでrun-app時にSSL証明書で警告が出る場合の対処")でも書いてますが、SSLの設定はdevlopmentやらproductionで適宜変更してください。

昔とドライバのクラス名も変わってるので注意。

[Windows環境だと出るっぽいトラブル](http://qiita.com/KKZ@github/items/e3f594b04c9233a86419 "Grails 3 + MySQLでrun-app時に「The server time zone value」でエラーが出る場合の対処")もあったりします。
react nativeでLinker command failed with exit code 1が出た時


react nativeでXcodeから端末にビルドしようとした時
`Linker command failed with exit code 1`
が出た。コマンドライン上では
`:CFBundleIdentifier", Does Not Exist`
と表示され、`BUILD FAILED`となっている。

SwiftでApp開発をされていた方なら簡単に対処できたのだろうが、私はCordovaとreact nativeしか経験がなかったので少し苦戦した。
ぐぐったら、
http://qiita.com/Horie1024/items/b31316b62949455ff8d5#_reference-79259bc121e52df6fc50
ここでMac OS, Xcodeのバージョンを最新にすると良いとあったので、Mac OSを最新にしたが結果は変わらず、、

原因はcheck boxのpackageをインストールして削除したからだ。と推測していたので、`package.json`から削除し、
`rm -rf node_modules && yarn`
を実行。だが結果変わらず。

ググっていくと
https://github.com/mapbox/react-native-mapbox-gl/issues/297
このページで、XcodeのBuild Phases以下のLink Binary With Librariesでpackageを読み込んでいることがわかった。
ここで私が追加した、check boxのpackageを削除したらビルド成功。
コマンドラインで出ていた
`:CFBundleIdentifier", Does Not Exist`
も消え、`BUILD SUCCESED`になった。

むやみに、やたらに一般のpackageを追加して開発するのは控えよう
unzipコマンドで日本語が文字化けした際の文字コード指定

```bash
unzip -O sjis hoge.zip
```

これだけですが、意外と検索上位に出てこないのでメモです。
あと、元々文字コードが違う場合は、utf8とかいろいろと適当に試してみるとヒットすると思います。
centos7からメールを送信する

# ssmtpを使用してcentos7からメールを送信する設定

## 1,ssmtpインストール
yum install ssmtp
  ※見つからない場合は、epelリポジトリをインストール（有効化）する。
  yum --enablerepo=epel install ssmtp 

## 2,コンフィグファイル修正
vi /etc/ssmtp/ssmtp.conf


\#/etc/ssmtp.conf -- a config file for sSMTP sendmail.

\#See the ssmtp.conf(5) man page for a more verbose explanation of the
\#available options.

\#The person who gets all mail for userids < 1000
\#Make this empty to disable rewriting.
\#root=postmaster 　← ___コメントアウト___
root=XXXXXXXX@gmail.com　←___アドレス記入___

\#The place where the mail goes. The actual machine name is required
\#no MX records are consulted. Commonly mailhosts are named mail.domain.com
\#The example will fit if you are in domain.com and your mailhub is so named.
\#mailhub=mail ←___コメントアウト___

\#Example for SMTP port number 2525
\#mailhub=mail.your.domain:2525
\#Example for SMTP port number 25 (Standard/RFC)
\#mailhub=mail.your.domain
\#Example for SSL encrypted connection
\#mailhub=mail.your.domain:465

mailhub=smtp.gmail.com:587 ←___smtpサーバ追記___

\#Where will the mail seem to come from?
\#RewriteDomain=

\#The full hostname
\#Hostname=

AuthUser=XXXXXX@gmail.com　←___ログインID___
AuthPass=XXXXXX ←___パスワード___

\# Set this to never rewrite the "From:" line (unless not given) and to
\# use that address in the "from line" of the envelope.
FromLineOverride=YES ←___コメントアウト外す___

\# Use SSL/TLS to send secure messages to server.
\#UseTLS=YES
\#IMPORTANT: The following line is mandatory for TLS authentication
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt ←___コメントアウト外す___

\# Use SSL/TLS certificate to authenticate against smtp host.
\#UseTLSCert=YES

\# Use this RSA certificate.
\#TLSCert=/etc/pki/tls/private/ssmtp.pem

\# Get enhanced (*really* enhanced) debugging information in the logs
\# If you want to have debugging of the config file parsing, move this option
\# to the top of the config file and uncomment
\#Debug=YES

UseSTARTTLS=YES　←___追記___

## 3,メール送信
echo -ne "To: XXXXXX@gmail.com(宛先)\nSubject(件名): TestSend1(本文)\n\n送信テスト1" | ssmtp XXXXXX@gmail.com(宛先)

echo -ne "To: XXXXXXX@gmail.com\nSubject: TestSend1\n\n送信テスト1" | ssmtp XXXXXXX@gmail.com

※UTF-8に変換しないとOutlook等で文字化けするため以下を追加する。
\nContent-Type: text/plain;charset=\"UTF-8\"\n

例：
echo -ne "To: XXXXXXX@gmail.com\nContent-Type: text/plain;charset=\"UTF-8\"\nSubject: TestSend1\n\n送信テスト1" | ssmtp XXXXXXX@gmail.com

※シェルで流すときに「sh」ではなく「bash」で実施する。
「sh」だと宛先や件名にアドレスが入らず本文に記載されてしまう。
\#!/bin/sh　　×
\#!/bin/bash　〇

以上でメール送信できます。
GCSライフサイクル機能を使ってファイルを定期削除する

# GCSライフサイクル機能を使ってオブジェクトをファイルを定期削除する

GCS (Google Cloud Storage)上のオブジェクトを自動削除するために、gsutilを利用してライフサイクルを設定する

## 何ができるの
便利なオンラインストレージであるGCS(Google Cloud Storage)。
しかし、データをずっと溜めっぱなしだと課金金額がかさんでいく。

「いちいち手動で削除するのも面倒だし~」という場合に、簡単なjsonを作成し、gsutilというツールを使用してコマンドを打つだけで、簡単に自動削除設定することができる。

これを設定すれば、例えば「1年以上前のデータは保存する必要ないから自動で削除したいなー」という要望を簡単に満たすことができるのだ。

## gsutilツールとは
> コマンドラインから Cloud Storage にアクセスできる Python アプリケーションです

引用元
https://cloud.google.com/storage/docs/gsutil

## GCSの用語
大切なのは、バケットとオブジェクト

詳しいことは公式の以下のリファレンスに記載されているので、簡単に説明
https://cloud.google.com/storage/docs/key-terms?hl=ja

### バケット
Google Cloud Storage 内のデータを格納するための入れ物。
ファイルサーバで言うところのディレクトリのようなもの。
この中にオブジェクトを格納する。
ただし、バケットは入れ子にできないので注意。

### オブジェクト
Google Cloud Storage 内に保存する個々のデータ。

## GCSのオブジェクトのライフサイクル管理
オブジェクトに対して様々な設定をし、管理することができる。

以下のようなことが可能になる。
> バケットにライフサイクル管理の設定を割り当てることができます。たとえば、バケット内のすべてのオブジェクトに適用されるルールを設定できます。オブジェクトがいずれかのルールの条件に一致すると、Google Cloud Storage はオブジェクトに指定された操作を自動的に実行します

引用元
https://cloud.google.com/storage/docs/lifecycle?hl=ja

例えば、「1年間経過したオブジェクトを削除する」という設定をすることができる

## 実際にやってみた
大まかな流れとしては以下になる
1. オブジェクトのライフサイクル管理の設定を記述したjsonファイルを作成する
2. gsutilツールのコマンドで、1で作成したjsonの設定をGCSに設定する

### オブジェクトのライフサイクル管理の設定を記述したjsonファイルを作成する

以下では、365日経過後に自動削除を行う設定をしている
詳しいことは以下の公式リファレンスを参照
https://cloud.google.com/storage/docs/lifecycle

``` json
{
    "lifecycle": {
        "rule": [
            {
                "action": {
                    "type": "Delete"
                },
                "condition": {
                    "age": 365,
                    "isLive": true
                }
            }
        ]
    }
}
```
`"type": "Delete" `
ライブ オブジェクトまたはアーカイブされたオブジェクトを削除する

`"age": 365 `
日数指定条件、ageで指定した日数が経過したら条件が満たされたとして、actionが発動する


### gsutilツールのコマンドで、1で作成したjsonの設定をGCSに設定する
以下のコマンドでjsonの設定をGCSに設定する

```
gsutil lifecycle set [jsonのファイル名] gs://[設定対象のGCSのバケット名]
```

詳しいことは以下の公式リファレンスを参照
https://cloud.google.com/storage/docs/managing-lifecycles


## 設定できたかどうかの確認 (2017年5月11日追記)
以下のコマンドで、GCSのバケットのライフサイクルの設定を確認することができる

```
gsutil lifecycle get gs://[設定対象のGCSのバケット名]
```
こんな感じのデータが返ってくる

```json
{"rule": [{"action": {"type": "Delete"}, "condition": {"age": 365, "isLive": true}}]}
```


## 設定後の注意
上記の手順でライフサイクル設定を行っても、更新が反映されるまでに、MAX 24 時間かかるそうなので、あれっと思うことがあるかもしれないが、そこは気長に待つしかない


## 参考にさせていただいたサイト
[gstutil](https://cloud.google.com/storage/docs/gsutil "gstutil")

[GCSの用語](https://cloud.google.com/storage/docs/key-terms?hl=ja )

[ライフサイクルの管理](https://cloud.google.com/storage/docs/managing-lifecycles)

[オブジェクトのライフサイクル管理](https://cloud.google.com/storage/docs/lifecycle#configuration)
ssh agent forwardingを行うサーバー側の要点の備忘録

ssh-agent forwardingするのにハマったので備忘録として残す。

# ssh agent forwardingとは
ssh agentで登録させた情報を、接続後のssh接続に引き継ぐやり方である
よく、ssh秘密鍵をサーバーにコピーしないで、ssh秘密鍵認証する際に使われる

![ssha1.jpg](https://qiita-image-store.s3.amazonaws.com/0/137052/099d619a-9793-a1ea-2326-d2327d58bc27.jpeg)

上図を例にとると、

- サーバーA上にのみあるssh秘密鍵をサーバーAのssh agentに登録
- サーバーBにssh公開鍵認証で接続
- そのままサーバーBからサーバーCに接続する際に
- ssh秘密鍵をサーバーAのssh agentから引き継ぎ、ssh公開鍵認証する

そういう状態のことである

# 設定方法

## クライアント側
putty　なら agent forwardingを許可する設定をON
LinuxやMacOSなどなら eval \`ssh-agent\` と ssh-add などする

## サーバー側

まず、sshdデーモン側でAgentForwardingを許可する必要がある

```text:sshd_config

AllowAgentForwarding yes

```

このsshd_configのowner/groupとパーミッションは
root root -rw------- とする

つぎに、sshコマンドする際にAgentForwardingをする

- 接続毎にコマンドライン許可する場合には -A オプション
- ユーザー毎にデフォルトで許可する場合には ~/.ssh/config に ForwardAgent yes 設定
- システム全体でデフォルトで許可する場合には /etc/ssh/ssh_config に ForwardAgent yes 設定
する必要があるを記載する

#### 接続毎許可

```shell-session
ssh -A (接続先ユーザー)@(接続先サーバー)
```

#### ユーザー毎許可

```text:~/.ssh/config
ForwardAgent yes
```
この~/.ssh/configのowner/groupとパーミッションは
(実行ユーザー) (実行グループ) -rw------- とする

#### システム全体許可

```text:/etc/ssh/ssh_config
ForwardAgent yes
```
この/etc/ssh/ssh_configのowner/groupとパーミッションは
root root -rw-r--r-- とする
(実行ユーザーが参照できるパーミッションが必要)

ちなみに、これらの設定の参照順位については、下記となっている

- 1番目に コマンドラインオプションを参照し
- 2番目に ユーザー設定ファイル(~/.ssh/config)を参照し
- 3番目に システム設定ファイル(/etc/ssh/ssh_config)を参照する

# おまけ
踏み台以降のサーバーにssh秘密鍵をコピーしない(させない)のに、ユーザーとユーザー毎に公開鍵をauthorized_keysを設置するのは面倒なので、サーバー側の公開鍵管理はLDAPサーバーで集中管理でやるのがお薦め、[既存のユーザーでも公開鍵のみLDAPサーバーで管理できる](http://qiita.com/hirotaka-tajiri/items/c7e04fbfa303c953f3f5)
Eclipseマーケットプレイスからプラグインがインストールできない場合の対処方法

Eclipseマーケットプレイスからプラグインがインストールできずハマったのでメモ。STS以外でも発生する現象かもしれません。

## 環境

Elipse4.6Neon pleiades All in One
SpringToolSuit(STS) for Eclipse 3.8.4.Release

## 事象
<font color="BlueViolet">「リポジトリー (URL略) に接続できません」</font>とか<font color="BlueViolet">「(URL略).jar のリポジトリーを読み取ることができません。」</font>とかメッセージが出てプラグインのインストールに失敗します。 
しかもEclipseが勝手に解決手段を探し始めちゃうので**インストール→解決手段を探しています・・・→エラーが発生しました**まで２時間くらいかかったりとかします。

## 原因

マーケットプレイスに接続する時にネットワーク接続の設定がバグるらしい。　
Eclipse側のネットワーク設定を修正する必要があります。無論リポジトリが落ちてる可能性は低いです。

## 対処１. ネイティブ接続をマニュアル接続にする（解決）

ウインドウ→設定→一般→ネットワーク接続 
アクティブ・プロバイダーをネイティブから**マニュアル**に変更します。ほかは何もいじらずOKします。 
eclipse.exeと同じフォルダにある**eclipse.exe -clean.cmd**を叩いてクリーン起動を行い再インストールを行います（クリーン起動をしてからでないと相変わらず失敗する）。
自分はこれで解決しました。

## 対処２. All in Oneではなく本家Eclipseを使う（未検証）

All in Oneの初期設定のせいでネットワーク接続が釣られておかしくなっちゃう説 
これで解決してる人もいるようですが試してません。対処1がダメなら試す価値はあるかもしれません。

## 対処３. リポジトリURLの再確認
マーケットプレイス経由でインストールすると起き得ないのですが、「新規ソフトウェアのインストール」から自力でリポジトリを指定している場合には確認を行ったほうがいいかもしれません。

## 参考
[【eclipse】　eclipseマーケットプレイスに接続できない](http://app.road.jp.net/?p=1704)
リモートのphoenixで作成したアプリをobserverでモニタリングする

# 概要
リモートのphoenixアプリをobserverでモニタリングする方法を記載します。

下記の記事を参考にしました。
http://qiita.com/ohr486/items/16066c275e9e37a0fb5a

phoenixのコマンドで起動するかの違いだけなので、内容はほぼ同じです。
適宜変更が必要な値は【】で囲ってます。

# 方法
## 1. リモートサーバー上でcookieを指定しアプリを起動（リモートで実行）
```
elixir --name root@127.0.0.1 --cookie phoenix_cookie --erl "-kernel inet_dist_listen_min 9001 inet_dist_listen_m 9001" -pa _build/prod/consolidated -S mix phoenix.server
```
※rootで実行しました

## 2. ローカルからリモートサーバーへポートフォワーディング（ローカルで実行）
```
ssh -N -L 9001:localhost:9001 -L 4369:localhost:4369 【sshユーザー名】@【グローバル
IP】
```

## 3. リモートサーバー上のErlangVMをモニタリング（ローカルで実行）
```
erl -name monitor@127.0.0.1 -setcookie phoenix_cookie -run observer
```
reactの反省とこれから@ギフティ

# 概要

1. 自己紹介
1. 反省
  - 管理者画面でのreact
  - 販売窓口画面でのreact
  - カスタマー画面で使わなかったreact
1. これから
  - SSRしたい
  - bff

---

# 1.自己紹介

---
自己紹介

- 名前: やまたつ
- 所属: 株式会社ギフティ
- バックエンド: rails, java
- フロントエンド: react, redux, flowtype, backbone風独自フレームワーク
    - (なのでreactバナというよりspaバナになってしまうかもです。。。)

---

作ったもの

- しまとく
    - 長崎の離島で使える地域通貨
        - 旅行客向け
        - 島内で使える電子通過
        - 5,000円払うと、6,000円分の通貨が手に入る
    - 管理者画面、販売窓口画面、カスタマー画面
    - 使ってるのも
        - rails
        - webpack, babel
        - react, redux
        - Immutablejs, lodash

---

# 2.反省

---

# 管理者画面でのreact

---

# だめでした

---

- railsで雑く作ればよい
- admin系のgemだとしんどいかも
    - 多少見た目は必要。使うのが社外のヒトなので
    - Foundationとか使えばよさそう

---

# 販売窓口画面でのreact

---

# 良かった

---
画面遷移
<img src="https://i.gyazo.com/8f67f2a2342892321faa7143107b228f.png" width=80%>

---

- ウィザード的な画面にはよい
    - step毎にサーバーに問い合わせる必要がなくなるので。
- step途中のバリデーションのためにサーバーに問い合わせたくなる時がある
    - バリデーション用のapi開けた（RESTであり続けるのが難しくなった）
    - 本気でuniversalすると解決するのかも
- 非SPAでもウィザード部分にだけ使うの良さそう

---

# カスタマー画面で使わなかったreact

---

# 使っても良かった

---

- 使わなかったのはガラケー対応が必要だったので
    - ユーザー層的にどうしても。。。
- ガラケー画面を別でrailsで作るとしても、reactにしても良かった
    - 結局アレヤコレヤと画面要件が増えるので
    - ガラケー画面はデザインも機能も削りがち
        - なので結局ガラケーのエンハンス少ない
- でもSSRはほしい。。。
    - 管理者画面と販売窓口画面はSSRしてない

---

# これから

---

# SSRしたい

---

# ギフティがSSRしたい理由

- SEO
    - いらない
- 描画速度
    - ほしい
        - スマホで、かつ、Webなので

---

# SSRへのアプローチ

- railsでやる
    - react-rails
    - hypernova
- bff(backend for front)
    - nextjs
    - nuxtjs
    - hypernova

---

# bff

---

初回表示
<img src="https://i.gyazo.com/91c36c3fe963ee9c2dc0ca2592d1f133.png" width=50%>

respect for [コレ](http://qiita.com/shimpeiws/items/f0bf909079b939b354e3)

---

SPAとして振る舞う時
<img src="https://i.gyazo.com/312dfbc6dd26c3c16cd9da9d001316bf.png" width=50%>

respect for [コレ](http://qiita.com/shimpeiws/items/f0bf909079b939b354e3)

---

何が幸せ？

- railsでSSRやるよりシンプル
    - apiだけがインターフェース
- クロスプラットフォームでのapi再利用
- サーバーサイドの選択肢が増える

課題とか

- クレカ決済とかのrails実装資産を使いまわせない

---

とかいって。。。
まだ何もできてない。。。
反省することすらできない。。。。
夢か。。。。

https://github.com/yamatatsu/my-nextjs-bff-boilerplate

---

# ご清聴ありがとうございました :bow:

---

株式会社ギフティでは、react書いたり、書かなかったりしてくれるエンジニアを募集しています。
デバッガでSwiftコードの変数の中身が見えなくなった時に確認すること

  
Objective-C・Swift混在環境において、デバッガでSwiftコード上の変数の中身が見れなくなってしまう問題の対処方法です。具体的な症状としてはlldbコンソールで`po`を叩くと以下のようなエラーが表示されます。

```
(lldb) po self.anyVariable
warning: Swift error in module Debug.
Debug info from this module will be unavailable in the debugger.

error: in auto-import:
failed to get module 'Debug' from AST context:
```

# 1. Bridging headerに不要なものを書いていないか
Swift側にブリッジする必要のないヘッダがimportされているとこのような症状が起こります。例えばBridging headerで以下のようにCocoaPodsライブラリのヘッダをimportしているとこの問題を引き起こす事があります。

```App-Bridging-Header.h
#import <LibraryName/LibraryName.h>
```

# 2. ヘッダと実装ファイルで重複したimport文がないか
以下のようなケースです。重複していてもコンパイル警告は出ませんが、Bridging headerでこのヘッダを読み込んでいるとSwiftコードに影響が出るようです。

```SomeCode.h
#import <LibraryName/LibraryName.h>
...
```

```SomeCode.m
#import "SomeCode.h"
#import <LibraryName/LibraryName.h>
...
```

# まとめ
Objective-C・Swift混在環境でのデバッガのトラブルについて対処方法を説明しました。同様の問題が起こった場合はヘッダ読み込み周りを見直してみるといいかもしれません。
PSReadLineでPSのキーバインドをBashみたいにする

## Powershellのキーバインドをbashみたいに変更

最近Poweshellを使う機会が増えたので、PSReadLineを使ってbashで慣れているキーバインドに変更をしてみました。

- PSReadLineキーバインドの確認
　Get-PSReadlineKeyHandler

- 変更したキーバインド

| Key       |       Function |    Description    |
|:-----------------|------------------:|:------------------:|
|Ctrl+u|BackwardDeleteLine|カーソル位置から行頭までのテキストを削除します|
|Ctrl+b|BackwardChar|カーソルを 1 文字前に戻します|
|Ctrl+f|ForwardChar|カーソルを 1 文字先に進めます|
|Ctrl+d|DeleteChar|カーソル位置の文字を削除します|
|Ctrl+h|BackwardDeleteChar|カーソルの前の文字を削除します|
|Ctrl+p|HistorySearchBackward|履歴を逆方向に検索します|
|Ctrl+n|HistorySearchForward|履歴を順方向に検索します|
|Ctrl+a|BeginningOfLine|カーソルを行頭に移動します|
|Ctrl+e|EndOfLine|カーソルを行末に移動します|

- 設定方法

Set-PSReadlineKeyHandler -Key 'Ctrl+u' -Function BackwardDeleteLine
Set-PSReadlineKeyHandler -Key 'Ctrl+b' -Function BackwardChar
Set-PSReadlineKeyHandler -Key 'Ctrl+f' -Function ForwardChar
Set-PSReadlineKeyHandler -Key 'Ctrl+d' -Function DeleteChar
Set-PSReadlineKeyHandler -Key 'Ctrl+h' -Function BackwardDeleteChar
Set-PSReadlineKeyHandler -Key 'Ctrl+p' -Function HistorySearchBackward
Set-PSReadlineKeyHandler -Key 'Ctrl+n' -Function HistorySearchForward
Set-PSReadlineKeyHandler -Key 'Ctrl+a' -Function BeginningOfLine
Set-PSReadlineKeyHandler -Key 'Ctrl+e' -Function EndOfLine
Javaの勉強 - 3

# 四則演算とか
数値を足したり、引いたり、そういうの

・足し算 ⇒ +
・引き算 ⇒ -
・掛け算 ⇒ *
・割り算 ⇒ /
・割り算の余り ⇒ %

気になるのは『割り算の余り』くらいか。
とりあえず、いつもの基本形に各計算処理を入れてみる。

```java:Yomogi.java
public class Yomogi{
	public static void main(String[] args){
		int a, b, result;		
		a = 3;
		b = 2;
		
		result = a + b;
		System.out.println(result);
		
		result = a - b;
		System.out.println(result);
		
		result = a * b;
		System.out.println(result);
		
		result = a / b;
		System.out.println(result);
		
		result = a % b;
		System.out.println(result);
	}
}
```

・変数は整数でa,b,resultの3つ
・計算結果をresultに入れて、出力
・resultは一度出力したら次の計算で再利用

実行

![pic005.JPG](https://qiita-image-store.s3.amazonaws.com/0/179949/4aa91dcb-a467-3e97-8921-aa45082d7c7c.jpeg)


なるほど、余り（%）って
3 / 2 = 1 **余り1** 
この部分だけが表示されるのね。

それにしても
計算結果だけ表示されても分かりづらい。
あと、割り算（/）は小数点以下も表示したいところ。

なので、次は小数点が使えるようにするのと
計算結果の前に何の計算なのか、文字列を入れたい。

# 変数で小数点を使う
整数は「int」だったけど、小数点まで必要なら「double」らしい。
他にも「float」とかあるみたいだけど、気づかなかったことにする。
必要になったときに覚えればいいし。

・浮動小数点の変数は「double」

```
double a, b, result;
a = 3.0;
b = 2.0;

result = a / b;
```

これで小数点まで使えるはず。
実行は↓の文字列追加とまとめてやることにした。

# 出力時に**文字列**と**変数内の数値**を続けて表示させる
実行結果で「a / b = 答え」的な出力になることを目標とする。

・「a / b = 」部分は**文字列**として出力
・答えの部分は変数「result」の**数値**を表示
・printやprintlnで文字列と変数をつなぐのは「**+**」
　※「+」は四則演算の足し算ってイメージが強いな・・・

これらを実現するには↓こんな感じか

```
System.out.println("3.0 / 2.0 = " + result);
```

いつもの基本形の中に入れる。

```java:Yomogi.java
public class Yomogi{
	public static void main(String[] args){
		double a, b, result;		
		a = 3.0;
		b = 2.0;
		
		result = a / b;
		System.out.println("3.0 / 2.0 = " + result);
	}
}
```

・変数を「double」で定義
・printlnの中で**文字列**と**変数**を「+」で繋いで出力

実行

![pic006.JPG](https://qiita-image-store.s3.amazonaws.com/0/179949/7963a840-e49e-51c2-67f2-7b2ebe08309c.jpeg)

intのときは余りが切り捨てられて答えが「1」になっていたが
doubleでは無事「1.5」で表示された。

計算結果の前に式も表示されてイメージどおり。

# 整数と浮動小数点の混ざった計算とか
整数と浮動小数点で計算した結果を変数に入れるときに気を付ける。

いろいろな状況が考えられるだろうけど
とりあえず↓の6つのパターンだけ覚えておくことにした。

①
整数と浮動小数点の結果を**浮動小数点の変数**に入れる⇒**OK**

```
double result;
result = 3 - 1.5;
```

「result」には「1.5」が入る。
浮動小数点に変換されるっぽい？

②
整数と浮動小数点の結果を**整数の変数**に入れる⇒**NG**

```
int result;
result = 3 - 1.5;
```

実行したらエラーになる。
整数には変換してくれないみたい。

ここで①のとき勘違いしていたことに気づいた。
変数に入れるタイミングで整数⇒浮動小数点に変換していたと思っていたが
計算するときに浮動小数点に変換されていたのでは？と。

だからdoubleで定義した変数は使えて、intで定義した変数は使えなかった。
と言うことではないかと。

③
整数同士の計算結果を**浮動小数点の変数**に入れる⇒**OK**

```
double result;
result = 3 / 2;
```

「result」には「1.0」が入る。
整数で計算されているので小数点以下は切り捨てられる。

あれ？やっぱり変数に入れるタイミングで変換されてね？
計算時も変数への代入時もdoubleに変換されるのかもしれない。

④
浮動小数点同士の計算結果を**整数の変数**に入れる⇒**NG**

```
int result;
result = 3.0 / 2.0;
```

実行したらエラーになる。

⑤
②や④のとき、浮動小数点の数値を**整数の変数**に入れるには
↓のようにすればエラーではなくなる。

```
int result;
result = (int)(3.0 - 1.5);
```

計算式をカッコで囲んだ前に「(int)」をつければ強制的に整数に変換される。
これなら計算結果を整数の変数(result)に入れることができる。

ただし、整数にする時点で小数点以下は切り捨てられるので
「result」には「1」が入る。

⑥
整数の計算結果を強制的にdoubleに変換することもできる。

```
double result;
result = (double)(3 / 2);
```

「result」には「1.0」が入る。
整数で計算されるので小数点以下は切り捨てられる。
その後、浮動小数点に変換されるみたい。

③と一緒じゃね？「(double)」つけなくても浮動小数点に変換されるし。
と思ったが、どこかで使うかもしれないから一応覚えておくことにした。

今回はココまで。
ConstraintLayout tips


## ConstraintLayout とは

iOS の AutoLayout のような機能をもったレイアウト (ViewGroup)

### AutoLayout との違い

- Storyboard と違って人間が編集できるレベルの xml
- レイアウトの機能は一長一短
	- 複数レイアウトをまとめてセンタリングしたりできる (後述)
	- ビューAの右端をビューBの中心に揃えるなどは一工夫必要 (後述)
		- Alignment constraints with different attributes 的なやつ

## ConstraintLayout の基本的な使い方

- 新しめの Android Studio であれば、新規プロジェクトを作成するときに Empty Activity などを選択するとデフォルトで ConstraintLayout が使われるようになっている

- 基本的には上下左右 (+ 利用可能ならベースライン) 間の制約を設定することでレイアウトを表現

## ConstraintLayout でできること

- 上下 or 左右の両方に制約を設定すると、どこにレイアウトするかを割合で定義することができる
	- デフォルトは 50% なので中央にレイアウトされる
	- 一見単純だが、色々なレイアウトテクニックに使えるので大事

- View のサイズは、Wrap Content, Match Constraint, Fixed のどれか
	- 従来の match_parent は廃止され 0px + 両端への制約で定義するようになる
	- 縦横どちらかを Match Constraint にすると、アスペクト比でサイズを定義できる

- Margin はこれまで通りに指定できるが、負の値を指定できない
	- RelativeLayout でも公式にサポートしていたわけではない、というスタンスらしい
	- 実現方法は後述

- 複数の View をまとめて扱う (チェインさせる) ことができる
	- 以下のいずれか
		- Spread: 適切にスペーシング (両端にもスペースが入る)
		- Spread Inside: 適切にスペーシング (両端にもスペースが入らない)
		- Packed: ひとまとまりの View として扱える
			- bias の定義もできる
	- Spread (Inside) の場合は 1 つ以上の View を Match Constrain にすることで、LinearLayout のように weight を指定することができる

- Guideline
	- 便利そう

- Gone Margin
	- 制約の参照先が gone になった場合の margin を定義することができる

## ConstraintLayout で難しいこと

- ビューAの右端をビューBの中心に揃える
	- ビューBの左右の制約をビューAに張れば OK

- 負の margin を指定するには
	- margin 用の Space を追加するのが best practice
	- 早く公式で対応して欲しいところ

- [IMO] 既存のレイアウトの自動変換とか `Infer Constrains` という自動で制約を設定してくれる機能があるけれど、微妙な結果になることがままあるので結局 1 から自分で書くことになるような

## ConstraintLayout でできないこと

- 頭をひねれば割と色々できる
- 複数のレイアウトから最大/最小のものを参照する、とかは難しそう
	- これについては素直に LinearLayout を使うのが良さそう?
	- 良い方法あれば是非教えてください
Python3.6 でDjango1.11スタート

#Python3.6で速攻Djangoスタート

```shell-session
$ python3 -m venv pyworks
$ ls pyworks/
bin		include		lib		pyvenv.cfg
$ . pyworks/bin/activate
(pyworks)$ pip install Django
(pyworks) $ cd pyworks
(pyworks) $ django-admin startproject mysite
(pyworks) $ cd mysite
(pyworks) $ python manage.py startapp myapp
```
ESP8266（NODE MCU）で起動時やプログラム書き込み時にサーボが動いちゃうGPIO

最近、[SG90](http://amzn.to/2q0SoBA)や、[MG996R](http://amzn.to/2q0JNic)等のサーボを使って色々作っていますが、

[ESP8266（NODE MCU）](http://amzn.to/2zoZ2aj)で起動時やプログラム書き込み時に、勝手にサーボが動いてしまうのが厄介だったので、GPIO毎の挙動を調べて一覧化しました。（ニッチかも）

| GPIO | サーボの挙動（起動時やプログラム書き込み時） |
|:-:|:-:|
| 0  |動かない   |
| 1  |動く   |
| 2  |動く   |
| 3  |動く   |
| 4  |動かない   |
| 5  |動かない   |
| 12  |動かない   |
| 13  |動かない   |
| 14  |動かない   |
| 15  |動かない   |
| 16  |動かない   |

まとめると、GPIO1～3は、起動時やプログラム書き込み時に勝手にサーボが動いてしまいます。
UARTのGPIO1はTXD0、GPIO3はRXD0に繋がっていて、シリアル通信の影響を受けるのは分かるとして、
TXD1のGPIO2で動くのは謎ですね。

PWM出来ないはずのGPIO16でもサーボの制御ができたのも意外でした。

![Image.png](https://qiita-image-store.s3.amazonaws.com/0/157770/86bc92dd-a6c6-ff10-c80b-12bac4ec9a06.png)
5/10

#Audacity
8チャネル同時録音を行い、audacityの環境設定より、メタデータエディタを書き出しの前に表示という欄のチェックを外す。
このことにより、8チャンネルで録音した音をファイルに書き出す際に、今までは８つのファイル一つ一つに対して、アーティスト名やアルバム名などのメタデータを書き込む必要があったが、チェックを外すことによりそれらを書き込む必要がなくなり、１度に８つのデータを書き込むことが可能になった。![スクリーンショット 2017-05-10 12.16.05.png](https://qiita-image-store.s3.amazonaws.com/0/165517/f9b04f89-2dca-6a24-1557-3bc51dd988b6.png)
#Hark
audasityに行き詰まったので、Harkを使ってみることにしました。
Harkでは、マイクロホンからのリアルタイム音源定位などが行えるらしく、それにカメラを組み合わせれば、発言者の方にカメラを向けたり出来て便利なのでは、と思い使ってみようかと考えました。
Harkを利用するにあたってhttp://www.hark.jp/document/2.0.0/hark-cookbook-ja/subsec-LearningHARK-001.html　
のサイトを参考にした。
まず録音をすることからはじめる。
このサイトによると録音方法が2通りあり、一つがwiosというサポートツールを用いる方法であり、もう一つが録音を行うためのネットワークを作成する方法である。
録音ネットワークをサイトの書いているように作成しようとしたものが下の図です。
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/165517/6ca004f3-cf5a-9565-e66f-f7aac1dc91bf.png)
Raspberry Pi をミャンマーで使おうとして timezone の設定で泣く

# 前提知識
## zoneinfo
timezone の設定は ```/usr/share/zoneinfo/``` フォルダ配下に
`地域名/都市名`という形で定義ファイルがあるので、そこから選んで ```/etc/timezone``` ファイルに `地域名/都市名` を記載する形で設定します

例えば日本時間(UTC+9.00)を設定しようとおもうと ```usr/share/zoneinfo/Asia``` に `Tokyo` というファイルがあるので ```/etc/timezone``` に `Asia/Tokyo` と書きます

## なぜ国名じゃないのか
[wiki](https://ja.wikipedia.org/wiki/Tz_database#)によると`政治的な変更や国境変更は頻繁にあるため国名を利用するスキームではデータの更新作業が煩雑になることが挙げられる`というなんか`要出典`って言いたくなっちゃう説明がありました

***都市は国よりも不変*** なんですかね

# 問題
で、ミャンマーのタイムゾーンを設定しようとしてまず現在（というか、これからと言うべきなのか）の首都 ***ネピドー*** を Asia の下で探します
Naypyidaw... Naypyidaw... やっぱないな

多分、最近まで首都だった ***ヤンゴン*** で登録されてるんでしょうね
Yangon... Yangon あれれ？ない？？？
どういう事？？？

念のために Mandalay もさがしてみるもののやっぱりない。ミャンマーに他に大きな都市って聞いたことが無いので本当にもうパニック状態

UTC+6:50 で設定しろということなのかな？と思って raspi-config の timezone 設定で `None of the above` を見てみても GMT+6:00 と GMT+7:00 はあるけど GMT+6:50 がない

***ミャンマーって Linux から無視されてる？？？***

# 回答編
## 解決にいたる道
もしかしたら GMT+6.50 の国がミャンマーの近所にあって、そっちを設定することで workaround にしてくださいね、ってことなのかと思い、世界地図を見てみるもののよくわからない

こうなったら google 先生に聞いてみるしかない
`zoneinfo myanmar` で検索するも、めぼしい情報がでてこない
だんだん半泣きになってきます

`zoneinfo UTC+6.50` で検索したところ、やっと [こちら](http://www.fileformat.info/system/timezone.htm)がでてきました...が、

なんとそこには ***衝撃の事実！*** が

| [Asia/Rangoon] | ミャンマー時間 | +6.50 |
|:-----------|------------:|:------------:|

あのー、***ラングーンってどこ***ですか？？？

なんと！ ***ヤンゴン*** って ***何十年も前まで(1989年まで)*** は ***ラングーン*** という名前だったんだそうです！って、そんな昔の事、知りませんがな！1989年ってまだ世の中がメインフレームな時代、都立大学が都立大学駅にあったほど大昔の事じゃないですか

 ***都市は国より不変*** って全然 ***そんなことない***じゃん

## 回答
というわけで、RPi を Myanmar でつかうための timezone の設定は
`Asia/Rangoon` になります

めでたしめでたし

# 感想
私の半日をかえせ！

# future works
Asia の下に ***Peking*** も ***Beijing*** もなかったりする所に一抹の不安を覚えるものの、当面、中国で仕事する予定はないので深入りしないことにする

ってか、この***都市名***を設定しろという***クイズみたいなの***が本当に便利なんだろうか？なんで  ***UTC±*** なり ***JST*** や ***MMT*** で設定させてくれないんだろ？

# 2018.10.17 補足
不平を言ってるだけで終わるのも建設的じゃなくてかっこ悪いので 3G ドングルが***接続している通信キャリアの国コードをみて linux の timezone を設定する***スクリプトを[***こちら***](https://github.com/UedaTakeyuki/gc_modem/blob/master/scripts/settimezone.py)にご用意させていただきましたので、その旨、ご報告させていただきます次第です

ppp で通信はじめる前の tty がまだ busy じゃない時に呼び出していただければと存じます

***ミャンマー、セネガル、日本で実際に機能いたしました***事、合わせてご報告させていただきます次第です

ちなみに U.S. とかロシアとかインドネシアとか、複数のタイムゾーンがある国もあるので、この方法は万能ではないんですよね
という事もあって萎えちゃってたまたま作業した前述の[***３カ国のテーブルしか用意してない***](https://github.com/UedaTakeyuki/gc_modem/blob/master/scripts/settimezone.py#L26) のですが、 fork して [国コード（MCC, Mobile Cantry Code といいます）](https://clients.txtnation.com/hc/en-us/articles/218719768-MCCMNC-mobile-country-code-and-mobile-network-code-list-) を追加して使っていただく事が叶えましたら光栄の極みですし、pull request まで賜りましょうものならもう至福の至りでございます

もしくは「追加して」というリクエストだけでも [こちら](https://github.com/UedaTakeyuki/gc_modem/issues)にいただければ avec plaisir でご対応させていただきます次第です
C/C++で64bit整数を使ってシフト演算をするときの注意点

`unsigned long long`や`uint64_t`などの64bit整数では数値リテラルに接尾辞を忘れたためにビット演算を期待通りに行えないことがあります. ビット演算で謎の結果が出た時はこの辺を疑ってみるとよいでしょう.

# 例
指定した位置のビットを立てて返す関数`set_bit`を考えます.

```cpp
#include <bits/stdc++.h>
#include <stdint.h>

using namespace std;

// vのpos桁目のビットをたてる
uint64_t set_bit(uint64_t v, uint pos)
{
  assert (1 <= pos && pos <= sizeof(uint64_t)*8);
  return v | (1 << (pos-1));
}

int main()
{
  uint is[] = {1,31,32,33,64};
  for (uint i : is) {
    uint64_t set = set_bit(0,i);
    cout << "i=" << i << endl;
    cout << set << endl;
  }
  return 0;
}
```
gcc5.4.0でコンパイルしたところ, これは次のような結果を返しました.
 
```shell-session
i=1
1
i=31
1073741824
i=32
18446744071562067968
i=33
1
i=64
18446744071562067968
```

この例の場合, `1`は最大で63ビットシフトされるのでそれだけのビット幅を持たなければいけません. したがって`ull`を付加してやれば修正できます.

```diff
@@ -7,7 +7,7 @@
 uint64_t set_bit(uint64_t v, uint pos)
 {
   assert (1 <= pos && pos <= sizeof(uint64_t)*8);
-  return v | (1 << (pos-1));
+  return v | (1ull << (pos-1));
 }
```

```shell-session
i=1
1
i=31
1073741824
i=32
2147483648
i=33
4294967296
i=64
9223372036854775808
```
# 関連リンク
[INT34-C. 負のビット数のシフトやオペランドのビット数以上のシフトを行わない](https://www.jpcert.or.jp/sc-rules/c-int34-c.html)
[UndefinedBehaviorSanitizer — Clang 5 documentation](http://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html)
続：ES5のReact.jsソースをES6ベースに書き換える

今回はReact15.5への対応について、元投稿の補足もしくは備忘として書きなぐりました。
ですので、詳細については他の方の投稿のほうが詳しいと思います。

# 概要
Reactのバージョン15.5でcreateClassやPropTypesがReactモジュールから切り離され（完全に分離するのは16とのこと）、これらを使っているとブラウザのコンソール上にWarningが出力されるようになりました。
相変わらずフロントエンド界隈は移り変わりが激しいですね。。

さて、

[ES5のReact.jsソースをES6ベースに書き換える](http://qiita.com/kuniken/items/2e850daa26a10b5098d6)

では、React.Componentを使用するようにしましたので、
今回はreact-codemodを使用して、PropTypesを外部パッケージを使用するように対応し、さらに＋αについて触れてみたいと思います。

# react-codemodを使って書き換え作業をする
react-codemodはDeprecatedになったメソッドやクラスを使用して実装していたプログラムをReactが提示する代替案を使用した実装へ移行してくれるツールです。

## セットアップ
[https://github.com/reactjs/react-codemod](https://github.com/reactjs/react-codemod)
の、
[setup & run](https://github.com/reactjs/react-codemod#setup--run)
を参考にセットアップを行います。
jscodeshiftをグローバルインストールした後、react-codemodを適当なディレクトリに置きます。

## PropTypesの移行
作業は結構簡単に完了できました。

PropTypesと言っているのは、下の部分です。

```
hoge.propTypes = {
  num: React.PropTypes.number
       ~~~~~~~~~~~~~~~←ここ
}
```

本家サイトに案内が掲載されていました。
[https://facebook.github.io/react/blog/2017/04/07/react-v15.5.0.html#migrating-from-react.proptypes](https://facebook.github.io/react/blog/2017/04/07/react-v15.5.0.html#migrating-from-react.proptypes)

該当のコマンドは、
[React-PropTypes-to-prop-types](https://github.com/reactjs/react-codemod#react-proptypes-to-prop-types)の項にあります。

```
// react-codemodディレクトリの一つ上で実行する場合
$ jscodeshift -t react-codemod/transforms/React-PropTypes-to-prop-types.js <置き換えたいソースのパス>
// 実行するときに「<」「>」は書かないよ！
```

インストールをお忘れなく。。

```
$ npm install prop-types --save-dev
```

# サードパーティーのパッケージの対応
## React-Bootstrap
業務上使用していたのですが、Warningが消えず厄介でした。
が、4月の終わり頃に対応版（0.31.0）をリリースしてくれたおかげで解消されました。

```
$ npm install react-bootstrap@0.31.0 --save
```

# おまけ
React.createClassの代わりにReact.Componentを使用することを考えると、ES6(ES2015)ベースで実装することが必要になるようです。
React.Componentを使用しない場合は、`create-react-class`パッケージを使用する必要があります（こちらもインストールをお忘れなく）。
本家サイトでは、置き換えのための案内が掲載されていました。
[https://facebook.github.io/react/blog/2017/04/07/react-v15.5.0.html#migrating-from-react.createclass](https://facebook.github.io/react/blog/2017/04/07/react-v15.5.0.html#migrating-from-react.createclass)

```
$ jscodeshift -t react-codemod/transforms/class.js <置き換えたいソースのパス>
```
RxSwiftでいい感じにQueue処理するRxObservableQueueを作った

# サマリ
[RxObservableQueue](https://github.com/notohiro/RxObservableQueue) (Carthage, Cocoapods対応しました:yum:)
Observableでemitされたitemをqueueとして保持し、好きなタイミングで好きな並列数で取り出す事ができます。
(わかりづらい:disappointed:)

# もうちょっとわかりやすいユースケース
例えば、ユーザ操作に対して大量のオブジェクトをネットワークから先読みをする時に使えます。
[あめくる](http://notohiro.com/Amekuru)で使うために作りました。ここでの要件は下記になります。

- 表示している地図領域の、現在時刻分の画像(10枚程度)を最優先で取得する
- 未来の時間軸12個分(計120枚程度)を現在時刻に近い順に取得する
- 過去の時間軸12個分(計120枚程度)を現在時刻に近い順に取得する
- ユーザが表示領域を変更したら↑の取得処理は全てキャンセル
- 取得・画像処理は負荷が高いので同時処理数は制限したい

上記の処理をこんな感じでかけるようになります。

```swift
// 例: Observable<MKMapRect> ユーザが地図領域を変更するとemitされるObservable
visibleMapRect 
	// 地図領域をflatMapLatestし、最後の地図領域分以外はdispose()する
	.flatMapLatest { mapRect -> Observable<(Request, Counter)> in 
		// 地図領域から、先読み処理に必要な情報が入ったRequestをemitするObservableを作成する
		let request: Observable<Request> = makeRequest(mapRect)

		// RxObservableQueueで同時実行数3でキュー作成
		return RxObservableQueue.create(observable: request, maxConcurrentCount: 3)
	}
	.subscribe(onNext: { request, counter in
		// 同時実行数を超えない様にrequestがemitされる
		// 処理が終わったらコンプリーションハンドラでcounter.signal()すると、次のrequestがemitされる
		model.process(request, completionHandler: { counter.signal() })
	})
	.addDisposableTo(bag)
```
Excelでシリアル値をYYYY-MM-DD HH:MM:SS形式で表示

http://asahi.gr.jp/wp01/1668
http://reboot-reboot.blogspot.jp/2008/01/yyyymmdd-hhmmss.html
をくっつけただけ

```
TEXT((A1+32400)/86400+25569, "YYYY-MM-DD HH:MM:SS")
```
NSViewのmouseEnteredとmouseExitedの有効化をProtocol Extensionで実装してみる

##デフォルトでは無効化されているイベント
NSViewのmouseEnteredやmouseExitedはデフォルトでは無効化されており、有効化させるには
1.NSViewのupdateTrackingAreasをoverrideし、
2.NSView自身のサイズと同じ領域でaddTrackingAreaメソッドを用いてNSTrackingAreaを指定する
という手順をふむ必要があります。

~~~swift
override func updateTrackingAreas() {
    
    //すでに指定済みのtrackingAreaを一旦解除しておく
    if !trackingAreas.isEmpty {
        for area in trackingAreas {
            removeTrackingArea(area)
       }
    }

    //自分のsizeが0ならば何もしない
    if bounds.size.width == 0 || bounds.size.height == 0 { return }
        
    //トラッキングオプションを指定(Enter / Exit と一緒に Moved も対象にしてます)
    let options: NSTrackingAreaOptions = [
                 .mouseEnteredAndExited,
                 .mouseMoved,
                 .activeInActiveApp,
                 .assumeInside
    ]
    //NSTrackingAreaのインスタンスを作り、addTrackingAreaで指定
    let area = NSTrackingArea(rect: bounds, options: options, owner: self, userInfo: nil)
    addTrackingArea(area)  
 }
~~~

コピペだと芸がありませんし、SuperClassに機能を持たせてもいいのですが、NSButtonなどを拡張したい場合も考えて、ここはひとつProtocol Extensionで実装をまとめてしまいましょう。

##NSTrackingAreaを有効化するメソッドをプロトコルに実装するよ

~~~swift
//空のプロトコルを定義
protocol MouseTrackableView {}

//MouseEnter や Exit Moveのイベントを有効化させる機能を持ったプロトコル拡張でNSViewにのみ有効にする
extension MouseTrackableView where Self: NSView {
    /*
    現在のrectに合わせてTrackingAreaを更新するメソッド
    このプロトコル拡張では複数のTrackingAreaを保持することは許容しておらずに
    renewTrackAreaを呼び出したタイミングで、必ず自身のRectに合わせたTrackingAreaを
    一つだけ保持することになる
    */
    func renewTrackArea() {
        //すでに指定済みのtrackingAreaを一旦解除しておく
        if !trackingAreas.isEmpty {
            for area in trackingAreas {
                removeTrackingArea(area)
            }
        }

        //自分のsizeが0ならば何もしない
        if bounds.size.width == 0 || bounds.size.height == 0 { return }
        
        //トラッキングオプションを指定(Enter / Exit と一緒に Moved も対象にしてます)
        let options: NSTrackingAreaOptions = [
                 .mouseEnteredAndExited,
                 .mouseMoved,
                 .activeInActiveApp,
                 .assumeInside
        ]
        //NSTrackingAreaのインスタンスを作り、addTrackingAreaで指定
        let area = NSTrackingArea(rect: bounds, options: options, owner: self, userInfo: nil)
        addTrackingArea(area)  
    }
}
~~~

##使い方


後は、updateTrackingAreasをoverrideします

~~~swift
class MouseEventView: NSView, MouseTrackableView {
    override func updateTrackingAreas() {
        renewTrackArea()
    }
    override func mouseEntered(with theEvent: NSEvent) {
        NSLog("mouseEntered")
    }
    override func mouseExited(with theEvent: NSEvent) {
        NSLog("mouseExited")
    }
}
~~~
bordercolorlight と bordercolordark を滅する

#どうしたの急に
修正な仕事で見つけてしまい滅したい気持ちになった。

#なにそれ
IE方言のHTMLのtableタグの属性

#bordercolorlightとは
テーブル全体の枠線のうち`右と下` の枠線の色を指定できる。

#bordercolordarkとは
テーブル全体の枠線のうち`左と上` の枠線の色を指定できる。

#思うこと
CSS指定でよくね？

#CSSに置き換える
##変更前
```
<table class='table1' bordercolorlight="#000000" border="1" cellspacing="0" bordercolordark="#FFFFFF">
```

##変更後
```
.table1{
    border-width: 1px;
    border-style: solid;
    /*
    記述した順に[上][右][下][左]の色を指定
    つまり[bordercolordark][bordercolorlight][bordercolorlight][bordercolordark]
    */
    border-color: #000 #fff #fff #000;
}

.table1 td th{
    border: 1px solid #000;
}
```

#最後に
CSSで書けるもんはCSSで書くのが一番だと思います。
もし修正依頼などで見つけたら滅していきましょう。
Ubuntu16.04でスクリプトを起動時に自動実行する

ubuntu14.04 と ubuntu16.04では、サービス管理方式が SysVinitから systemdに変更されたので、少し手順が異なります。

## Ubuntu 14.04

/etc/rc.local 内に スクリプトを記述しておくと実行してくれます。

exit 0 の前に 1行追加すればよい。

## Ubuntu 16.04

/etc/rc.local 内に スクリプトを記述しておくだけでは実行してくれません。

そこで、[リンクの wiki](https://wiki.archlinux.org/index.php/User:Herodotus/Rc-Local-Systemd)を参考にしました。

#### 1. /etc/rc.local を作ってスクリプトを記述する

#### 2. /etc/systemd/system/rc-local.service にサービスファイルを作る

```bash:rc-local.service
[Unit]
Description=/etc/rc.local compatibility

[Service]
Type=oneshot
ExecStart=/etc/rc.local
# disable timeout logic
TimeoutSec=0
#StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target
```

#### 3. systemdの仕組みでサービスの自動起動設定をする

```bash
$ systemctl enable rc-local.service
```

>追記 @170511
>
cronを使っても、以下のように.confに記述すれば、起動時の処理が設定できるようです。
>
```bash:cron.conf
@reboot <実行コマンド>
```
cronの使い方は[前回の記事](http://qiita.com/msrks/items/6a180e03d7af622f2101)を参照してください
ETロボコン mruby用教材の補足ページ(2017年)

**こちらは2017年度用の補足ページです。2018年度版は[こちら](https://qiita.com/yamanekko/items/fa6b53f3fc02347b46a8)にあります**

教材リリース後に見つかったバグ情報や、mruby on EV3RT+TECSの使い方の補足をこちらのページで更新していきます。

ETロボコン 2017年度 より、C++を用いて作成されている技術教育の教材をmrubyでも学習できるように mruby版を作成しています。
(2018/07/12 追記)
~~使用しているmruby　は mruby on EV3RT+TECS(v2.0.0以降) です。~~
**2017年度版教材はmruby on EV3RT+TECS v2.0.1のみ対応** しています。
v2.0.0は下記不具合がありますので使用をおすすめしません。
v2.1.0以降は仕様が変わっているので試すにはv2.1.0のドキュメントに従って修正が必要です。（こちらでは現時点で動作確認できていません）

## 不具合情報

### タッチセンサー
~~タッチセンサーが反応しないという不具合が発生しています。~~
~~近々リリース予定の~~mruby on EV3RT+TECS v2.0.1 で修正されま~~す~~した

### STACK_SIZE
ETロボコン教育教材を動かすにはデフォルトのStackサイズが小さすぎるようです。
hr-tecs/workspace/etrobo_tr_ex1/tEVSample.h　にある

```hr-tecs/workspace/etrobo_tr_ex1/tEVSample.h
#define	STACK_SIZE 4096
```

の値を大きくしてください。
私のところでは単純に10倍してみたら動いたのでそのまま使用しています。

```
#define	STACK_SIZE 40960
```
こんな感じで
入力 C#


http://agc014.contest.atcoder.jp/tasks/agc014_a
![qiita2.PNG](https://qiita-image-store.s3.amazonaws.com/0/180642/594af649-f919-158d-f2f3-635ec39a53e7.png)
こんな入力のときは

```
string[] str = Console.ReadLine().Split();
int A = int.Parse(str[0]);
int B = int.Parse(str[1]);
int C = int.Parse(str[2]);
```
こんなんでもいいと思う。でも
http://agc013.contest.atcoder.jp/tasks/agc013_a
![qiita1.PNG](https://qiita-image-store.s3.amazonaws.com/0/180642/1348e9ae-4a11-f9ff-c3ad-47c44fa75dc5.png)
こんなのが来たら流石に面倒くさい

```
int N = int.Parse(Console.ReadLine());
int[] a = new int[N];
string[] str = Console.ReadLine().Split();
for(int i = 0; i < N; i++)
{
a[i] = int.Parse(str[i]);
}
```
こんなの問題解く度書くのはアホ臭すぎる。
LINQのSelect句を用いればより短く出来る
楽な入力

```
int N = int.Parse(Console.ReadLine());
int[] a = Console.ReadLine().Split().Select(int.Parse).ToArray();
```
multiprocessing を使って raspberry pi で LED を点燈

```py3:led01.py
#! /usr/bin/python3
# -*- coding: utf-8 -*-
#
#	led01.py
#
#		for Raspberry Pi
#
#						May/10/2017
# --------------------------------------------------------------------
from multiprocessing import Process
import time
import sys
#
from gpiozero import LED
# --------------------------------------------------------------------
def led01(port):
	sys.stderr.write("*** ff01 *** start *** port = %d\n" % port)
	led = LED(port)
	led.on()
	time.sleep(3)
	led.off()
	sys.stderr.write("*** ff01 *** end *** port = %d\n" % port)
#
# --------------------------------------------------------------------
def proc01():
	pp1 = Process(target=led01,args=([16]))
	pp1.start()
	time.sleep(1)
	pp2 = Process(target=led01,args=([12]))
	pp2.start()
	time.sleep(1)
	pp3 = Process(target=led01,args=([14]))
	pp3.start ()
#
	pp1.join()
	pp2.join()
	pp3.join()
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
try:
#
	icount = 0
	while True:
		proc01()
		time.sleep(1)
		sys.stderr.write("icount = %d\n" % icount)
		icount += 1
except KeyboardInterrupt:
	print("STOP")
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

次の環境で動作を確認しました。

```text
$ uname -a
Linux sunflower 4.14.34-v7+ #1110 SMP Mon Apr 16 15:18:51 BST 2018 armv7l GNU/Linux
$ python3 --version
Python 3.5.3
```
Windows 10 Creators Update (Build 1703) > Microsoft Edge で Google サイトにアクセスできない > パッチが公開された

```txt:動作環境
Windows 10 Pro (64bit) Creators Update適用済
```

Microsoft Edgeにてgoogleなどに接続できない症状。

手動対応方法は以下で紹介されています。
[Windows 10 Creators Update (Build 1703) の Microsoft Edge で Google サイトにアクセスできない](http://qiita.com/yunarsoa/items/5427969b71edf418ae68)

一方で、5月9日に以下のパッチが公開されたようです。
https://support.microsoft.com/ja-jp/help/4016871/windows-10-update-kb4016871

> Addressed an issue where Microsoft Edge users in networking environments that do not fully support the TCP Fast Open standard may have problems connecting to some websites. Users can re-enable TCP Fast Open in about:flags.  

以下も関係するかもしれません。
https://support.microsoft.com/ja-jp/help/4016240/windows-10-update-kb4016240
Vagrant+CentOS6.8+Phalconの環境

# Install Vagrant
```bash
brew cask install virtualbox
brew cask install vagrant
brew install vagrant-completion
```
# CentOS6.8
```bash
vagrant box add centos-6.8-v2.3.4 https://atlas.hashicorp.com/bento/boxes/centos-6.8/versions/2.3.4/providers/virtualbox.box

vagrant init centos-6.8-v2.3.4
vagrant up

vagrant ssh

sudo yum -y install epel-release.noarch
sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo yum -y install --enablerepo=remi --enablerepo=remi-php56 php56

echo '. /opt/remi/php56/enable' >> ~/.bash_profile

. ~/.bash_profile

sudo yum install -y php56-php-phalcon2
```
# Vagrantでポートフォワードを有効にする
```Vagrantfile
  config.vm.network "forwarded_port", guest: 80, host: 8080
```
ブラウザの時にaxiosのPOSTの値が送信されない？そんなことはない

#はじめに

最近Vue.jsをよく触るようになって、Ajax使いたいなら [axios](https://github.com/mzabriskie/axios) を使うといいよとVue.js公式も言っていたので使っていろいろ試していました。

#POSTをしてみる

さてさて、早速ブラウザでaxiosを使ってPOSTしてみるか。

テストなのでこんなものを用意。

```php:test.php
<?php
// $_POST の値をJSONにして返す簡単なお仕事
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['text' => $_POST['text']]);
```

##Exampleの通りに書いてみる

```js:JavaScript
axios.post('test.php', {
  text: 'テストだよー'
})
  .then(response => {
    console.log('送信したテキスト: ' + response.data.text);
  }).catch(error => {
    console.log(error);
  });
```

結果を見てみると

```js:結果
"送信したテキスト: "
```

あれ、値が送信されてない？

##そうか、application/x-www-form-urlencoded を入れなきゃ

サーバーにPOSTで送信するヘッダーに `application/x-www-form-urlencoded` 入れないとダメだよね。

```js:JavaScript
axios.post('test.php', {
  text: 'テストだよー'
}, {
  headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
  .then(response => {
    console.log('送信したテキスト: ' + response.data.text);
  }).catch(error => {
    console.log(error);
  });
```

結果を見てみると

```js:結果
"送信したテキスト: "
```

あれ、これも違うみたい

おかしいなぁ [axiosの使用例](https://github.com/mzabriskie/axios#example) を見てもこの書き方で合ってるはずなのに……うん？

##`URLSearchParams` を使う

よくよく見てみるとaxiosの [Using application/x-www-form-urlencoded format](https://github.com/mzabriskie/axios#using-applicationx-www-form-urlencoded-format) にこう書いてある。

> By default, axios serializes JavaScript objects to `JSON`. To send data in the `application/x-www-form-urlencoded` format instead, you can use one of the following options.

デフォルトではaxiosはPOSTパラメーターをJSON形式にして送信するから、`application/x-www-form-urlencoded` で送信したいならこの方法を試してねって感じに書いてある。

ブラウザでは `URLSearchParams` というAPIを使う。

```js:JavaScript
let params = new URLSearchParams();
params.append('text', 'テストだよー');

axios.post('test.php', params)
  .then(response => {
    console.log('送信したテキスト: ' + response.data.text);
  }).catch(error => {
    console.log(error);
  });
```

結果は

```js:結果
"送信したテキスト: テストだよー"
```

送信できた！

#おわりに

Exampleだけ見て試しておかしいと思う前に README.md は最後まで読みましょうという教訓でした。
Issuesでも最後まで読んでない人がちらほらいた模様。
Linux（CentOS）の初期環境構築（vagrant＋Parallels向け）


## Java環境

```
yum list | grep java
sudo yum install java-1.8

readlink $(readlink $(which java)) //javaパスの確認

echo "export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el6_8.x86_64" >> /home/vagrant/.bashrc
echo "export PATH=$PATH:$JAVA_HOME/bin" >> /home/vagrant/.bashrc
echo "export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar" >> /home/vagrant/.bashrc
source /home/vagrant/.bashrc

export CLASS_PATH=.:./analyticsreporting/*:./analyticsreporting/libs/*
javac -cp $CLASS_PATH SampleAnalyticsReporting.java
java -cp $CLASS_PATH SampleAnalyticsReporting

```
「analyticsreporting」はフォルダ名・ファイル名の例です

## LAMP環境

###  １．Apacheインストールなど

下記は実行済のものをvagrant boxで保存しておくと便利。
vmNetCentOSのような名前で保存しておく

* sudo yum -y install httpd
* sudo service httpd start
* sudo chkconfig httpd on
* sudo service iptables stop
* sudo chkconfig iptables off
* cd /var/www/html
* sudo vi index.html
* cat index.html


### ２．LAMP環境構築
* sudo yum -y install php php-mysql
* sudo yum -y install mysql* 
    * 75MBくらいのダウンロードになるので注意
* sudo service mysqld start
* sudo chkconfig mysqld on 
* exit
* mysql -u root < all_db_dump20161213.sql　//dumpファイルから復旧の例
* sudo service mysqld restart



## 時刻合わせ（時刻がおかしいとき）
まず時刻確認

```
date
```

普通におかしいだけならvagrant haltで再起動。
自動で時刻合わせしたいときはntpdを導入する。

```
[root@foo ~]# /etc/init.d/ntpd restart
Shutting down ntpd:                                        [  OK  ]
Starting ntpd:                                             [  OK  ]
```
docker-compose up したコンテナを起動させ続ける方法


こんにちはsekitakaです。

ポート待受とかしていないコンテナを`docker-compose up`で起動するとコンテナがすぐ終了してしまうと思います。
そんなときは以下のようにdocker-compose.ymlのttyをtrueに設定しておくと、コンテナが起動し続けます。

```yaml:docker-compose.yml
version: '2'
services:
  mypy:
    image: python:latest
    tty: true
```

その後調査などでコンテナにbash起動が必要であれば、以下のようにして接続することができます。

```bash
docker exec -it <コンテナID_or_NAME> bash
```
新規 pythonプロジェクト スタート時のタスク

## pyenv, virtualenvのインストール

### MacOS

```shell-session
$ brew install pyenv
$ brew install pyenv-virtualenv
```

### CentOS

```shell-session
$ sudo su - user
$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
```

下記を`~/.bash_profile`に追加しろ〜とかメッセージ出るので必要に応じて

```text
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

## 環境作成

### pythonインストール、virtualenv作成

```shell-session
$ cd path/to/repo
$ pyenv install 3.5.2 # pyenv install whence してリストから選んでも可
$ pyenv virtualenv 3.5.2 virtualenv-name # virtualenv-nameは任意
$ pyenv local virtualenv-name
```

### 依存パッケージインストール

```shell-session
$ cd path/to/repo
$ pip install pip-package # 個別インストール
$ pip install -r requirements.txt # 一括インストール
```

### 依存パッケージリスト作成

```shell-session
$ cd path/to/repo
$ pip freeze > requirements.txt
```
Bitcoindの起動と停止

# Bitcoindの起動と停止

### 0.はじめに

gitでクローンしたフォルダから、便利な機能を設定します。

bashのオートコンプリート機能を追加しましょう。
これがを設定すると、tabキーでオプションの補完が可能となります。
※：次に開くbashから補完機能が適用されます。

```bash
cd # git clone dir
cd bitcoin
sudo cp contrib/*.bash-completion /etc/bash_completion.d/
```

bitcoin.confを設定しましょう。

※：bitcoin.confは無くても問題ありません。（デフォルトで動く）
　　ここでは、テスト環境をデフォルトで動かしたり、RPCを利用したりする場合、
　　起動オプションを付けるより、このファイルで操作した方が楽なので設定します。

※：ここでは、.bitcoinフォルダをLinuxのデフォルトにしています。
　　MacやWindowsでは場所が異なるので注意してください。
　　詳しくは、[Running Bitcoin](https://en.bitcoin.it/wiki/Running_Bitcoin)に記載されていますので、参照ください。

```bash
mkdir -p $HOME/.bitcoin
cd # git clone dir
cp bitcoin/contrib/debian/examples/bitcoin.conf $HOME/.bitcoin/
```

### 1.Bitcoindの起動

Bitcoindの起動です。
Bitcoindには、３つの環境を提供しています。
詳しくは、後述しますが、ここではregtestという環境で起動してみます。

デバッグモードで起動する場合

```bash
cd # git clone dir
cd bitcoin/src
./bitcoind -regtest -printtoconsole
```

デーモンとして起動する場合

```bash
cd # git clone dir
cd bitcoin/src
./bitcoind -regtest -daemon
```

### 2.Bitcoindの停止

プロセスが見えている場合
`./bitcoind -regtest -printtoconsole`などで起動した場合
コンソールから`Ctrl-C`で停止しても、シグナルを受信して正常に終了します。

デーモンで起動した場合
以下の手順で停止できます。
※：プロセスが見えている場合でも停止は可能です。

```bash
cd # git clone dir
cd bitcoin/src
./bitcoin-cli -regtest stop
```

### 3.Bitcoindの設定

テスト環境で起動する場合は必ず`-regtest`を付加しなければなりません。
bitcoinの設定ファイルに、`regtest=1`を設定すると、`-regtest`を付加しなくても`Regression test mode`で実行されます。

直接ファイルに記述してもいいですが、以下の手順でコマンドを実行すると設定されます。

```bash
cp $HOME/.bitcoin/bitcoin.conf $HOME/.bitcoin/bitcoin.conf.org
sed -i -e "/#regtest=0/i regtest=1" $HOME/.bitcoin/bitcoin.conf
diff $HOME/.bitcoin/bitcoin.conf.org $HOME/.bitcoin/bitcoin.conf
```

Bitcoindが起動している場合は、次の起動から反映されます。


### 4.Bitcoindの環境

bitcoindでは、`mainnet`、`testnet`、`regtest`の３つの環境を持っています。

- mainnet

実際にインターネットで取引が行われている環境です。
それなりのデータ量があるので、ある程度のディスクサイズが必要となります。
また、ウォレットは使えますが実際の取引に使われている為
鍵管理などを安全に管理（暗号化など）する必要があります。

- [Testnet](https://en.bitcoin.it/wiki/Testnet)

インターネット上のテスト環境です。
定期的にリセットされます。
多くの人が利用するので、まずマイニングができません。
ビットコインが欲しい場合は、`bitcoin testnet faucet`などで検索すると
お試し用のビットコインを配布してくれるサイトがあり、
そこからビットコインを取得することができます。

- regtest

ローカル用のテスト環境です。
[Regression test mode](https://en.bitcoin.it/wiki/Regression_test_mode)
最初にビットコインを入手する為には、マイニングが必要となります。
ビットコインはマイニングしてから100ブロック経過しないと使用できない為、
最初は101回マイニングする必要があります。

---