OmniAICreator/Qiita-1.07M huggingface dataset:
ログローテーションの設定方法

#いきさつ
アプリのログがローテーションできていない。。。でも、ソースを触りたくない。。。
ということで、ひとまずLinuxのlogrotateで対処することにしました。

#設定ファイル
/etc/logrotate.conf に設定ファイルがあります。
ただし、個別の設定は/etc/logrotate.d/ ディレクトリで行います。
参考になる設定ファイルがあったのでコピーして編集します。

###ファイルをコピー
わかりやすい名前をつけた方が良いです。（システム名など）

```bash
sudo cp /etc/logrotate.d/file /etc/logrotate.d/new-file
```

###ファイルを編集
必要に応じた設定に編集します

```bash
sudo vim /etc/logrotate.d/new-file
```

設定ファイル内容です。
1行目はローテションを設定するファイルです。

```bash
/var/log/system-name/info.log {
  daily
  rotate 90
  missingok
  notifempty
  copytruncate
  dateext
  dateformat %Y-%m-%d
}
```

| オプション | 説明 |
|:--|:--|
| daily | 日ごとに実行 |
| rotate 90 | ローテーションする世代数は90 |
| missingok | 指定のログファイルがない場合もエラーを出さない |
| notifempty | ファイルが空の場合はローテーションしない |
| copytruncate | ログファイルのコピー後に、元ファイルの中身を削除する |
| dateext | ローテーションしたファイルの末尾に日付をつける |
| dateformat %Y-%m-%d | ファイル末尾の日付フォーマット |


###実行してみる（動作確認）

```bash
sudo /usr/sbin/logrotate -f /etc/logrotate.d/new-file
```

末尾に日付のついたファイルが作成され、元のファイルはサイズが0となりました。


###設定反映

```bash
sudo /usr/sbin/logrotate /etc/logrotate.conf
```

1週間経過しましたが、「info.logyyyy-mm-dd」のファイル名で毎日ローテションされています。
[ActiveDirectory]ADアカウントユーザにデフォルトでローカルユーザの管理権限を設定する方法

#はじめに

ADで作成されたアカウントユーザでクライアントPCにログインすると、通常は管理権限なしの一般ユーザとなっています。

一般ユーザではアプリケーションの追加ができず、PCに変更することが一苦労。
管理権限を追加するため、ローカルの管理ユーザでログインし、ADアカウントユーザへ管理権限を付与する。
結構めんどうな作業ですよね？

初回ログイン時から自動的にローカル管理権限がついていればとっても楽！
今回はこの部分をADのOGP設定で解決します！

環境：
Amazon Directory Service MicrosoftAD

#グループポリシーの管理で制限されたグループの設定を行う

まず、スタートボタン　＞　管理ツール　＞　グループポリシーの管理　を開きます。
管理ツールにグループポリシーの管理が表示されない場合は、

サーバマネージャ　＞　機能　＞　機能の追加　＞グループポリシーの管理をチェック　＞　インストール
で機能の追加をおこなってください。

グループポリシーの管理を開いたら、【Default Domain Policy】配下の【Computer】を右クリック。
【このドメインにGPOを作成し.....】をクリック。


![GPO0.png](https://qiita-image-store.s3.amazonaws.com/0/174392/415de7d7-0f22-877c-7cf9-2e6d07a8c627.png)

任意のGPO名を入力。ここではtest00としています。

![GPO01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/75f512d3-a9b0-1cc6-d337-4cae2cebe1e1.png)

作成したGPOを右クリックして編集。

![GPO03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/2d27230a-3acb-c2f8-b2f7-7fc9e1af156d.png)

Windowsの設定　＞　セキュリティの設定　＞　制限されたグループ　

![GPO04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/a12141eb-f0b8-9a61-6742-0a643461c878.png)

制限されたグループを右クリックし、グループの追加

![GPO05.png](https://qiita-image-store.s3.amazonaws.com/0/174392/5b57be17-d388-7e19-25bb-e32a29a710fc.png)

参照をクリックしたら、【Administrator】を入力し、選択。選択したらOK。

![スクリーンショット 2017-05-22 11.34.53.png](https://qiita-image-store.s3.amazonaws.com/0/174392/d4ed8f7f-60ab-ca39-e0ff-f6b47337932f.png)

その後、プロパティが表示されるので、上段のこのグループのメンバーに【Domain Users】を追加。

![GPO06.png](https://qiita-image-store.s3.amazonaws.com/0/174392/59a0c6fb-9d5c-e642-170c-78dd6c0ca2cf.png)

※注意点※
Administratorsへのメンバーを指定する場合、指定したメンバー以外のもともと所属していたメンバー
[(例)クライアントPCの管理権限をもつローカルユーザ]は自動的にAdministratorsから除外されます

続いて同じように、【Domain Users】側からも【Administrator】への所属をさせます。
今回は下段に【Administrator】を追加。

![GPO07.png](https://qiita-image-store.s3.amazonaws.com/0/174392/207fc68a-3296-cee0-0b90-3ae528b92b42.png)

※注意点※
指定のグループにAdministratorsを所属させる場合は、既存の登録メンバーに追加する形で追加が行われます。

以上で、GPOの設定は完了です。

#設定したGPOを即時反映させるには

クライアントに反映されるまで時間がかかるよようなので、強制的に有効化を行いたい場合は、コマンドで実行。

```
gpupdate /force
```

#設定内容の反映を確認

クライアントPCを再起動させて、ローカルアカウントに権限が追加されているか確認します。

コントロールパネル　＞　ユーザアカウント　＞　ユーザアカウントの管理　＞　詳細設定タブ

![スクリーンショット 2017-05-22 11.56.18.png](https://qiita-image-store.s3.amazonaws.com/0/174392/650005ef-a18d-36de-6da0-817e05297913.png)

グループからAdministratorの詳細を確認します。

![スクリーンショット 2017-05-22 11.56.28.png](https://qiita-image-store.s3.amazonaws.com/0/174392/30004e95-c996-9977-fff2-7a3cc7d23551.png)

【Domain Users】がグループに追加されていることが確認できました！

![権限確認.png](https://qiita-image-store.s3.amazonaws.com/0/174392/3743a1b6-973f-e244-53da-901dd6400bd5.png)

これで、ADで追加したユーザがクライアントPCに管理権限が付与された状態でログインすることができるようになりました。
lodashを使って、CSVっぽいデータから、大カテゴリ別で良い感じにJSONにするやつ

```categorize.js
const prefs = [
['北海道','北海道'],
['東北','青森'],
['東北','岩手'],
['東北','宮城'],
['東北','秋田'],
['東北','山形'],
['東北','福島'],
['関東','東京'],
['関東','神奈川'],
['関東','埼玉'],
['関東','千葉'],
['関東','茨城'],
['関東','栃木'],
['関東','群馬'],
['関東','山梨'],
['信越','新潟'],
['信越','長野'],
['北陸','富山'],
['北陸','石川'],
['北陸','福井'],
['東海','愛知'],
['東海','岐阜'],
['東海','静岡'],
['東海','三重'],
['近畿','大阪'],
['近畿','兵庫'],
['近畿','京都'],
['近畿','滋賀'],
['近畿','奈良'],
['近畿','和歌山'],
['中国','鳥取'],
['中国','島根'],
['中国','岡山'],
['中国','広島'],
['中国','山口'],
['四国','徳島'],
['四国','香川'],
['四国','愛媛'],
['四国','高知'],
['九州','福岡'],
['九州','佐賀'],
['九州','長崎'],
['九州','熊本'],
['九州','大分'],
['九州','宮崎'],
['九州','鹿児島'],
['沖縄','沖縄'],
]

const categorized = _.mapValues(
  _.groupBy(prefs, 0),
  values => _.map(values, 1)
)
console.log(categorized);
```



```js:出力結果
{
  中国: ["鳥取", "島根", "岡山", "広島", "山口"],
  九州: ["福岡", "佐賀", "長崎", "熊本", "大分", "宮崎", "鹿児島"],
  信越: ["新潟", "長野"],
  北海道: ["北海道"],
  北陸: ["富山", "石川", "福井"],
  四国: ["徳島", "香川", "愛媛", "高知"],
  東北: ["青森", "岩手", "宮城", "秋田", "山形", "福島"],
  東海: ["愛知", "岐阜", "静岡", "三重"],
  沖縄: ["沖縄"],
  近畿: ["大阪", "兵庫", "京都", "滋賀", "奈良", "和歌山"],
  関東: ["東京", "神奈川", "埼玉", "千葉", "茨城", "栃木", "群馬", "山梨"]
}
```
mysqldumpとXtraBackupによるバックアップ／リストアを比較してみる


#はじめに
mysqldumpとXtraBackup、それぞれを利用したMySQLバックアップ／リストアの比較をしてみます。

#環境
- CentOS7 64bit
- 1 vCPU
- Mem：1GB
- MySQL5.7
- XtraBackup2.4.7
- MySQLデータディレクトリ：12GB

#サマリ



|  | バックアップファイル容量 | バックアップ時間 | リストア時間 |
|:-----------|------------:|------------:|------------:|
| mysqldump       |        １.４GB |     10分     |69分
| XtraBackup     |      ３.７GB |    14分    |5分

#バックアップ
##mysqldump

```BASH:command
# time mysqldump -uroot --all-databases --opt --add-drop-table --single-transaction | gzip > mysqldump_`date +"%Y%m%d"`.sql.gz
 
real    9m34.698s
user    6m29.454s
sys 0m4.611s
 
# ll mysqldump_20170427.sql.gz
-rw-r--r-- 1 root root 1482934317  4月 27 14:56 mysqldump_20170427.sql.gz
```

##XtraBackup

```BASH:command
# time innobackupex --user=root --stream=tar /tmp | gzip - > /tmp/xtrabackup_`date +"%Y%m%d"`.tgz
 
real    13m43.295s
user    13m20.367s
sys 0m13.710s
 
# ll xtrabackup_20170427.tgz
-rw-r--r-- 1 root root 3747612166  4月 27 16:03 xtrabackup_20170427.tgz
```

#リストア
##mysqldump

```BASH:command
# time zcat mysqldump_20170427.sql.gz | mysql -uroot
 
real    68m53.569s
user    2m13.969s
sys 0m3.885s
```

##XtraBackup

```BASH:command
# time tar zxvf xtrabackup_20170427.tgz
 
real    3m4.192s
user    1m33.344s
sys 0m12.697s
 
# time innobackupex --apply-log /tmp/xtrabackup/
 
real    0m4.099s
user    0m0.077s
sys 0m0.074s
 
# service mysqld stop
# mv /var/lib/mysql /var/lib/mysql.bk
# mv /tmp/xtrabackup /var/lib/mysql
# chown -R mysql:mysql /var/lib/mysql
# service mysqld start
```

#まとめ
XtraBackupによるリストアは、ほぼ解凍の時間だけなのでmysqldumpに比べて非常に高速なのが分かります。
単純なgzip圧縮だとXtraBackupの方が容量・時間ともにmysqldumpに劣りますが、[こちら](http://blog.father.gedow.net/2012/12/05/percona-xtrabackup-parallel/)のように圧縮形式や並列化をチューニングすることでパフォーマンス向上が見込めると思います。
XMLをターミナル上でさくっと整形

XMLを整形したい。

`xmllint` というツールもあるようだが、Arch Linuxではパッケージマネージャから入らなかったので自作しました。

参考：
http://d.hatena.ne.jp/benikujyaku/20150103/1420218205

調べたら素のRubyでできるようでした。

https://docs.ruby-lang.org/ja/latest/class/REXML=3a=3aFormatters=3a=3aPretty.html

こんな感じでパイプで渡せるようにしておくと便利でした。

```~/bin/pp-xml
#!/usr/bin/env ruby

require 'rexml/document'
require 'rexml/formatters/pretty'

doc = REXML::Document.new(STDIN.gets)

pretty_formatter = REXML::Formatters::Pretty.new
output = StringIO.new
pretty_formatter.write(doc, output)
puts output.string
```

使い方はこんな感じ。パイプで渡せれば十分。

```html
echo '<a><b>aaa</b></a>' | pp-xml

<!-- 出力 -->
<a>
  <b>
    aaa
  </b>
</a>
```
你为什么会推崇 REST 而非 RPC 呢?


idea from https://apihandyman.io/do-you-really-know-why-you-prefer-rest-over-rpc/

什么是 API 的 RPC 风格? 而什么又是 REST 风格?

通常后来者年轻人都会趋向于 REST 风格吧, 基于 JSON 响应内容格式, 各种大行其道的 web framework. 究竟在我们想要选择某个设计的时候是否考虑我们更加趋向于面向资源的 REST 风还是面向操作的 RPC 风呢? RPC 就很 low 而 REST 就看上去高上大?


这里先来看看 RPC 和 REST 他们看上去到底什么样子.

在对比之前我们先看看他们长什么样子吧. 

# HTTP 请求

对于 RPC 和 REST 来说, 他们都是使用了 HTTP 协议来表达实现一个 http 的请求, 一个所谓的 http 请求它就包括了动作和资源.

- verb
- resource

对于`动作`来说,

- get 获取资源 操作幂等 安全 可缓存
- post 创建资源或者出发数据处理 不幂等 不安全 可部分缓存
- put 完全创建一个对象或者替换 幂等 不安全 不可缓存
- patch 部分更新资源 不幂等 不安全 部分缓存
- delete 删除一个资源 幂等 不安全不可缓存


## RPC 操作请求风格

对于 RPC 来讲,它通常代表`remote procedure call`, 这里我们把它理解成为` WYGOPIAO`, 也就是` what you get or post is an operation`. 通过这个 RPC 类型,你通过 http 协议暴露出自己的动作以及数据封装. 据我所知, 通常也没有什么规则可循, 但是大致是这样的:

- endpoint 通常都是包括动作名称的
- 通常只是使用 get 或者 post 来通信

```
GET /someoperation?data=anId

POST /anotheroperation
{
  "data":"anId"; 
  "anotherdata":"another value"
}
```

那么通常又是怎么选择`get` 或者` post` 呢?

- get 通常也就是只是获取而不修改东西
- 不考虑什么http 协议, 只是通过少许参数来获取而非大量的参数
- 基本上都用 post


## REST 风格

这里不谈什么是 REST, 而就单单说说如何通过 REST 描述表达及操作 http 协议.

- endpoint 通常会包含要操作的资源
- 通常会使用 CRUD 来描述对于资源的操作

```
GET /someresources/anId

PUT /someresources/anId
{"anotherdata":"another value"}

```


## 比较 RPC 和 REST

- 优雅
- 设计
- API 定义语言
- 可预测和语义性
- 超媒体
- 可缓存
- 可用


## REST 挺好?

其实 REST 胜在哪里? 我想也就是可预测性和语义性了. 而面向资源和面向操作, 哪个更好? 仁者见仁.
Laravel Mix の deploy タスクが Heroku でコケまくるのでTips


`npm run production`が通らない

## 1 `--progress` オプションは切る

 Heroku のビルド時に `npm run production`するとコケる。

中に入って `npm run production` しても普通に実行できるのに…

エラーログには以下のような記録が

````
couldn't write 83961 items to stdout: Resource temporarily unavailable
````

こういうときには、 `--progress`オプションを外すと良い。

https://github.com/webpack/webpack/issues/1553#issuecomment-159648679

> i had the same issue, try to remove the --progress flag from webpack command, its worked for me.
looks like heroku stop and failed the build if its prints too many logs.

とのこと。

## 2 node-sass は rebuild する。

> Error: ENOENT: no such file or directory, scandir '**/node_modules/node-sass/vendor'

のエラーで詰む。

https://github.com/sass/node-sass/issues/1579
 
 
````
node node_modules/node-sass/scripts/install.js
npm rebuild node-sass
````

こちらの２つを実行すればOK
MySQLとPHPの週番号の日付フォーマット。

### 週番号
- 2017年1月1日は日曜日なので「月曜始まり」or「日曜始まり」で週番号が変わる

<img width="637" alt="スクリーンショット 2017-05-22 11.06.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/9907/e50c3d10-0034-af1b-d0c0-9a9ba2b62d24.png">

### MySQL
- MySQLのマニュアルには日曜始まり、月曜始まりがある。

```sql
select 
    date_format('2017-01-01', '%X%V') as nichiyou_start, -- 201701 
    date_format('2017-01-01', '%x%v') as getsuyou_start; -- 201652
```

### PHP
- PHPのマニュアルには月曜始まりしかない

```php
$this->assertEquals('201652', \Carbon\Carbon::parse('2017-01-01')->format('oW'));

```

### 参考
- MySQL5.6
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html
- PHP
http://php.net/manual/ja/function.date.php
リモートのブランチを削除する


GitHubを使う場合。

#Github上でブランチを消す

![スクリーンショット 2017-05-22 10.45.26.png](https://qiita-image-store.s3.amazonaws.com/0/109241/53dcfc88-82e4-5a29-8f8c-d8bb9b1bc96b.png "スクリーンショット 2017-05-22 10.45.26.png")

のbranchのところをクリックして、いらないbranchを消す。

#手元に残っているブランチを消す

```
git fetch [リモート名] --prune
```
Mongodb Mac

Brewでインストールする

```tcsh
brew install mongodb
```
データフォルダー作成

```tcsh
sudo mkdir -p /data/db
```
アクセス権を設定

```tcsh
sudo chown '<username>' /data/db
```
Listen Port

```tcsh
mongod
```

Open a new terminal window

```tcsh
mongo
```

<img src="https://content.screencast.com/users/kamao/folders/Jing/media/29e2b202-f939-45b8-ac66-19f5c0412a60/00000821.png">
CNNに入れるデータの作り方 (Chainer)

ハッカソンで学習回して独自モデル作ろうとしたけどCNNに入れるデータの作り方を調べるのに時間がかかってしまったのでmemo

```python
from PIL import Image
import numpy as np
import glob
import random

def load_image():
    filepaths = glob.glob('data/*.png')

    datasets = []
    for filepath in filepaths:
        img = Image.open(filepath).convert('L')  #Pillowで読み込み。'L'はグレースケールを意味する
        img = img.resize((32, 32)) # 32x32xにリサイズ
        label = int(filepath.split('/')[-1].split('_')[0]) # ラベル(0以上の整数) (自分の場合はよくファイル名の先頭にラベル名をつけている。)

        x = np.array(img, dtype=np.float32)
        x = x.reshape(1,32,32) # (チャネル、高さ、横幅)
        t = np.array(label, dtype=np.int32) 

        datasets.append((x,t)) # xとtをタプルでリストに入れる

    random.shuffle(datasets) # シャッフル
    train = datasets[:1000] # 最初の千個を学習用
    test = datasets[1000:1100] # 千個めから1100個目までをテスト用
    return train, test


def main(): # 以下、chainer exampleのcifer10を参考

    class_labels = 10
    train, test = load_image()
    
    model = L.Classifier(models.VGG.VGG(class_labels))
    if args.gpu >= 0:
        # Make a specified GPU current
        chainer.cuda.get_device_from_id(args.gpu).use()
        model.to_gpu()  # Copy the model to the GPU

    optimizer = chainer.optimizers.MomentumSGD(args.learnrate)
    optimizer.setup(model)
    optimizer.add_hook(chainer.optimizer.WeightDecay(5e-4))

    train_iter = chainer.iterators.SerialIterator(train, args.batchsize)
    test_iter = chainer.iterators.SerialIterator(test, args.batchsize,
                                                 repeat=False, shuffle=False)
    # Set up a trainer
    updater = training.StandardUpdater(train_iter, optimizer, device=args.gpu)
    trainer = training.Trainer(updater, (args.epoch, 'epoch'), out=args.out)

    # Evaluate the model with the test dataset for each epoch
    trainer.extend(TestModeEvaluator(test_iter, model, device=args.gpu))

    # Reduce the learning rate by half every 25 epochs.
    trainer.extend(extensions.ExponentialShift('lr', 0.5),
                   trigger=(25, 'epoch'))

    # Dump a computational graph from 'loss' variable at the first iteration
    # The "main" refers to the target link of the "main" optimizer.
    trainer.extend(extensions.dump_graph('main/loss'))

    # Take a snapshot at each epoch
    trainer.extend(extensions.snapshot(), trigger=(args.epoch, 'epoch'))

    # Write a log of evaluation statistics for each epoch
    trainer.extend(extensions.LogReport())

    # Print selected entries of the log to stdout
    # Here "main" refers to the target link of the "main" optimizer again, and
    # "validation" refers to the default name of the Evaluator extension.
    # Entries other than 'epoch' are reported by the Classifier link, called by
    # either the updater or the evaluator.
    trainer.extend(extensions.PrintReport(
        ['epoch', 'main/loss', 'validation/main/loss',
         'main/accuracy', 'validation/main/accuracy', 'elapsed_time']))

    # Print a progress bar to stdout
    trainer.extend(extensions.ProgressBar())

    if args.resume:
        # Resume from a snapshot
        chainer.serializers.load_npz(args.resume, trainer)

    # Run the training
    trainer.run()

```
Rails 5.1のencrypted secretsの運用について考える


## 環境
Ruby - 2.4.1
Rails - 5.1.0

## 背景
* Rails 5.1から[encrypted secrets機能が追加](http://weblog.rubyonrails.org/2017/4/27/Rails-5-1-final/)され、Rails wayに乗った状態で、環境変数を暗号化した状態でgit管理できるようになった
* `gibberish` などのgemを使って.envファイルを暗号化して、git管理していた人は運用を乗り換えると良さそう


## セットアップ

```console:console
$ bin/rails secrets:setup

Adding config/secrets.yml.key to store the encryption key: 
0123456789abcdef0123456789abcdef

Save this in a password manager your team can access.

If you lose the key, no one, including you, can access any encrypted secrets.

      create  config/secrets.yml.key

Ignoring config/secrets.yml.key so it won't end up in Git history:

  1 development:
      append  .gitignore

Adding config/secrets.yml.enc to store secrets that needs to be encrypted.

      create  config/secrets.yml.enc

For now the file contains this but it's been encrypted with the generated key:

# See `secrets.yml` for tips on generating suitable keys.
# production:
#  external_api_key: 1466aac22e6a869134be3d09b9e89232fc2c2289…

You can edit encrypted secrets with `bin/rails secrets:edit`.
Add this to your config/environments/production.rb:
config.read_encrypted_secrets = true
```

`config/secrets.yml.key` と `config/secrets.yml.enc` が追加され、`.gitignore` に下記の記述が追加される。

```text:.gitignore
# Ignore encrypted secrets key file.
config/secrets.yml.key
```

ちなみに、`secrets.yml.key` の中身は下記の通り、keyが入っているだけである。

```text:config/secrets.yml.key
0123456789abcdef0123456789abcdef
```

この `secrets.yml.key` を元に、暗号化と復号化を行うが、上述の通り、このファイルはgit管理しないので、別の管理が必要となってくる。keyの管理方法については後述。

## 暗号化されたsecretsを編集する
```console:console
$ bin/rails secrets:edit
```

デフォルトだとtextmateで開こうとする

```console:console
$ EDITOR="mate --wait" bin/rails secrets:edit
```

vimmerの人は

```console:console
$ EDITOR=vim rails secrets:edit
```

atom派の人は

```console:console
$ EDITOR="atom --wait" rails secrets:edit
```

のように適宜、好きなエディタで編集する。エディタ内で復号化された状態で編集することができ、ファイルを保存して閉じると暗号化されて、`config/secrets.yml.enc` が更新される。編集する内容は、secrets.ymlと書き方は変わらない。

```yml:config/secrets.yml.enc(editing)
development:
  api_key: api_key_for_development

test:
  api_key: api_key_for_test

production:
  secret_key_base: generatedsecurerandomhex64
  api_key: api_key_for_production
```

## 暗号化されたsecretsを使う
```ruby:ruby
Rails.application.secrets.api_key
```

## keyの管理方法について
`config/secrets.yml.key` ファイルを配置する方法の他、`RAILS_MASTER_KEY`　という環境変数に `config/secrets.yml.key` の中身を渡すことでも暗号化、復号化を行うことができる。

そのため、`config/secrets.yml.key` が配置されていない状態でも、

```console:console
$ RAILS_MASTER_KEY=0123456789abcdef0123456789abcdef EDITOR=vim bin/rails secrets:edit
```

とすると、復号化の上、編集することができる。

そのため、環境変数を管理する方法として、下記、2種類の管理方法がある。

* `config/secrets.yml.key` を配置する
* 環境変数 `RAILS_MASTER_KEY` にkeyを渡す

2種類の方法の使い分けは自由だが、一例として、下記にユースケースを示す。

### developmentでは、`config/secrets.yml.key`を配置する
```
$ echo 0123456789abcdef0123456789abcdef > secrets.yml.key
```

などで、各個人にファイルを配置する。`0123456789abcdef0123456789abcdef` の管理は各チーム内のパス管理方法で取り扱う。

### productionでは、環境変数 `RAILS_MASTER_KEY` にkeyを渡す
* docker-composeのenvironmentで `RAILS_MASTER_KEY` を渡す
* Circle CIなども同様に `RAILS_MASTER_KEY` を環境変数に渡す

## 最後に
とりあえず、上記構成で運用を始めてみます
RHEL7 ffmpegインストールメモ（May '17 時点）

オーディオファイルを処理するためにffmpegが必要となったので、RHEL7.3でffmpegをインストールしました。でもなんか依存関係とかの解決が随分面倒だったので、楽そうな手順をメモ。
環境の再現とか楽にしたいし。

## 1. epelを有効にする

```
$ sudo yum install epel-release

もし無かったら直接fedoraから取ってくる

$ sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```

## 2. rpmfusion freeを有効にする
[こちら](https://rpmfusion.org/Configuration)にセットアップ用のrpmがおいてあります。

```bash:
$ sudo rpm -Uvh https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
```

## 3. li.nux.roリポジトリ

libfribidiの依存があるので、ここも追加する。

```bash:
$ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
```

4. libfiribidi単体をインストールでもOK

```
$ curl -LO ftp://ftp.pbone.net/mirror/li.nux.ro/download/nux/dextop/retired/libfribidi-0.19.2-3.el7.nux.x86_64.rpm
$ sudo -ivh libfribidi-0.19.2-3.el7.nux.x86_64.rpm
```


## 4.ffmpegのインストール

あとは普通にffmpegをyumでインストールできるはず。

```
$ sudo yum install ffmpeg
```

 以上
Mac版のncコマンドでモックアップサーバー

MacOS上で、例えばlocalホスト(127.0.0.1)で8000ポートで、スタータスコード200を常に返す場合、以下のコマンドをTerminalで実行する

```bash
while : ; do (echo -ne "HTTP/1.0 200 OK\nContent-Length: 0\n\n") | nc -l 127.0.0.1 8000; done
```

参考リンク
[netcat Mac 編](http://d.hatena.ne.jp/shammer/20111120)
[nc コマンドで簡易HTTPサーバ](http://blog.livedoor.jp/sonots/archives/34703829.html)
[ncコマンド使い方メモ](http://qiita.com/yasuhiroki/items/d470829ab2e30ee6203f)
[nc(netcat)コマンドで覚えておきたい使い方8個](https://orebibou.com/2015/11/ncnetcat%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B98%E5%80%8B/)
いい感じに画像をリサイズしてくれる React Component を作ってみた

こんな感じで画像の縦横比を変えずに指定したサイズにリサイズする React Component を作りました。

| 横長画像の場合 | 縦長画像の場合 |
|:-----:|:-----:|
|<img width="240" alt="horizontally.png" src="https://qiita-image-store.s3.amazonaws.com/0/63056/21dffe6e-5d68-b859-fa34-13ae148c9380.png">|<img width="240" alt="vertically.png" src="https://qiita-image-store.s3.amazonaws.com/0/63056/13a31a82-0f12-813d-70a3-c74db1242d71.png">



画像の長辺を枠に合わせ縦横比を変えずに画像全体が枠内に収まるようにリサイズするものです。

画像の縦横比を保ったままのリサイズは ``` object-fit ``` や ``` backgound-size ``` でも可能ですが、
IE で対応してなかったり背景画像でしか使用できないので自作しました

github: https://github.com/sottar/react-image-resizer

github の [README](https://github.com/sottar/react-image-resizer/blob/master/README.md) にもありますが、使い方は簡単で画像のパスとリサイズ後の ``` width```, ``` height ``` を指定するだけでリサイズされたの画像を返してくれます。
画像取得できなかった場合（主に404を想定）用の画像パス ``` noImageSrc ``` や、画像にstyle を ``` props ``` で指定できるようにしてます。


プロダクトでも使用していて、いい感じで動いてくれてます。

よかったら使ってみてください。
要望とかバグとかいつでもお待ちしております。


npm の module も初めて公開しました。
このページを参考に思っていたよりも簡単に公開できました。

github: https://github.com/sottar/react-image-resizer
npm: https://badge.fury.io/js/react-image-resizer
海外でリモートワークをするときの注意すべき３つのこと


先日家族とハワイへ旅行の際に、初めて海外でリモートワークしました。
海外でのリモートワークの記事があまりなかったので、記録としてこの記事ではまとめた。

## はじめに

私は現在フリーランスのエンジニアとして活動している。
普段からクライアント/パートナー企業のオフィスには常駐せず、基本自宅や自宅周辺のカフェなどを作業場所とし、リモートで働いている。
数週間に一度、クライアント/パートナー企業のオフィスに数時間程度の打ち合わせに行くことがありますが、普段はSlack等のチャットツールを使用して連絡を取りながら仕事している。
今回は初めて海を越えて仕事をするに辺り、注意すべきことを３つの観点でまとめた。

## 1.時差

まずは海外で仕事をするに辺り、一番注意すべきは「時差」だ。
今回、私はハワイに4泊6日で滞在していたのですが、日本とハワイの時差は、 __19時間__ある。
10:00〜19:00で、日本とハワイでお互いが作業すると、以下のように時差が発生する。

| 日本 | ハワイ |
|:-----:|:-----------:|
|  5:00 | 10:00（前日） | 
| 10:00 | 15:00（前日） | 
| 14:00 | 19:00（当日） |
| 19:00 |  0:00（当日） | 

海外で作業するときには時差を上手く利用し、作業時間を調整することが必要だ。
打ち合わせや確認が必要な事項は日本にいるメンバーの作業時間に合わせて行い、個別で可能な作業は日本の深夜の時間に集中して行うのが、一番効率が良いだろう。

空いた時間は遊びに行くことや、買い物/観光/食事なども可能なので、上手くやりくり出来ると良いでしょう。
作業時間については、滞在先の時差も考慮して、事前にメンバー間で相談/共有しておくとスムーズに行えると思われる。


## 2.通信環境

私のようなエンジニアの場合、ノートPC1台とインターネットの通信環境があれば、基本作業が可能だ。
海外では日本と異なり、ホテルやレストラン等でWi-Fiの電波が飛んでいるところがとても多いだろう。
ですがエンジニアという職業柄、機密性の高い情報を扱っていることも多いため、通信環境については注意が必要だ。
今回は以下の点に気をつけました。

### 2.1.事前に滞在先周辺の通信環境を確認する

宿泊するホテルや滞在先でWi-Fiスポットがあるかを出発前に確認すると良いだろう。
ホテルの場合はホームページなどにWi-Fiやインターネット設備についても記載していあることが多いので、それらの有無で滞在先を選ぶのも一つの手段だ。

### 2.2.通信速度

これは現地に行ってみないと何とも言えない部分が多い。
しかし滞在してみて分かったことは、以下のような傾向にあるということだ。

* フリー（無料）のWi-Fiスポットは不特定多数の人が接続するため、接続が不安定になりやすい
* ビーチやプールサイドは、Wi-Fiスポットのあるホテルの建物から遠いため、電波が入りにくい
* 日本は通信インフラがやはり最高で、その感覚だと割と遅く感じる
* 通信速度を気にするのであればWi-Fi等の __無線__ではなく、LANケーブルなどが使える __有線__環境がオススメ

この辺は作業内容と好みもあるので、事前に滞在先の通信環境の評判を調べて見るのもアリだとは思う。

### 2.3.不安な場合はWi-Fiルータの使用も

通信速度に不安がある場合は出国する際に、空港でレンタルできるWi-Fiルータを使用するのもアリだと思う。
Wi-Fiスポットから電波が届かない屋外で作業する場合はあった方が良いだろう。

### 2.4.VPN接続

滞在先のWi-Fiスポットにはホテルやレストランの利用者のみ使用できるよう、接続の際にパスワードが設定してあるものもある。
しかしこちらも不特定多数が利用するため、セキュリティレベルは決して高くはない。
HTTPSやSSLで通信していても少し不安だろう。。。

そこでオススメなので __VPN接続__による通信だ。
私の場合は普段は __Wi-Fi__で繋いでいますが、開発サーバなどには __固定IP__でないとログイン出来ない作業環境も存在する。
そのような環境には、VPN用の踏み台サーバを経由してアクセスすることが多いだろう。
VPNの導入が必要なため、コストはだいぶ高いですが、開発者によっては上記の理由により、VPNのアカウントを保有していることもある。
セキュリティを確保する意味でも大事な手段だ。

## 3.コミュニケーション

お互いに作業する上で最も重要なのが、コミュニケーションの手段だと思う。
私は普段からリモートワークのため、以下のようなツールを使ってクライアント/パートナー企業のメンバーと仕事をしている。

* チャットツール（Slack、Skype、Zoom、チャットワーク等）
* ファイルストレージ（Dropbox、Google Drive等）
* 課題管理ツール（Github Issue、Waffle、Backlog、Redmine等）
* バージョン管理ツール（Git、Subversion等）

普段からこれらのツールを使用している人はもちろん、対面でのコミュニケーションが多い方もこれらのツールを使用することでお互いの作業効率が上がる場合がある。
ここで述べたポイントは海外だけでなく、国内でもリモートワークでも応用できるポイントだ。

大事なのは常に対面によるオンラインの同期的なコミュニケーションだけでなく、オフラインの非同期的なコミュニケーションとうまく使い分けることだろう。

## 最後に

今回、海外でリモートワークした経験をまとめてみた。
振り返ると時差や通信環境については滞在先によって、だいぶ格差がありますが、それ以外は国内でのリモートワークと変わらずに行うことが出来た。

政府が現在推し進める働き方改革の一環として、リモートワーク/テレワークは大きな手段として挙げられる。
いざという時のために普段からコミュニケーションの手段など、リモートで作業を行う方法を確立しておくことも重要だ。

## 参考
* [MacからVPNでリモート接続する方法](http://qiita.com/SRAUFactory/items/e0feba288f0924725fe3)
* [海外レンタルWiFiを受取返却できる国内空港とブランド一覧](https://skyticket.jp/wifi/airport)
* [イモトのWi-Fi](https://www.globaldata.jp/pccp/?gclid=Cj0KEQjw9YTJBRD0vKClruOsuOwBEiQAGkQjP_rWoDIB-8t3jFfDCGP9iBIMibvIF_gW1x4bLe_XfekaAsJr8P8HAQ&referrer=https%3A%2F%2Fwww.google.co.jp%2F)
[AWS] DynamoDB は空文字を登録できない

**（追記）DocumentClient には空文字を NULL 型に変換するためのオプトイン機能が存在する、というコメントをいただきました。**
[DynamoDB は空の値を登録できないけど DynamoDB document client のコンストラクタにオプションを渡すだけで空の値を NULL 型には変換できるよ？](http://qiita.com/kotarella1110/items/070c4544c7d836b82a3a)

**記事を削除しようとも思ったのですが、検索で引っかかって見にきた人のリンクになると思ったので、ひとまず記事自体は残しておきます。**
**いつか余裕がある時に書き直すかもしれません。。**


DynamoDB は空文字を登録できないため、空文字チェックしてエラー回避する実装にする必要があります。

が、JSONとかの関係でどうしても登録したい場合は、以下のように単純にスペースで登録するとよいかもしれません。

ちなみに Lambda - Node.js 6.10 での例です。

```js
'use strict';

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {

    // 空文字チェック
    // ※DynamoDBの仕様で空文字を登録できないため、半角スペースで登録
    let resourcesPara = ' ';
    if (event.resources !== undefined && event.resources.length > 0) {
        resourcesPara = event.resources;
    }

    const params = {
        TableName: "tableName",
        Item: {
            "id": "newId",
            "resources": resourcesPara
        }
    };

    docClient.put(params, function(err, data) {
        if (err) {
            console.error('Unable to add item. Error JSON:', JSON.stringify(err, null, 2));
            // エラー
            callback(null, err);
        } else {
            console.log('Added item:', JSON.stringify(data, null, 2));
            callback(null, {"id": "newId"});
        }
    });
};
```

取得するときも単純に半角スペースを空文字にして返却。

```js
'use strict';

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = (event, context, callback) => {

    const params = {
        TableName: "tableName"
    };
    
    docClient.scan(params, function(err, data) {
        if (err) {
            console.error('Unable to get item. Error JSON:', JSON.stringify(err, null, 2));
            // エラー
            callback(null, err);
        } else {
            if (data.Count > 0) {
                // データあり
                for (let i = 0; i < data.Count; i++) {
                    // スペースのみの場合空文字にする
                    // ※DynamoDBの仕様で空文字を登録できないため、半角スペースで登録している
                    if (data.Items[i].resources === ' ') {
                        data.Items[i].resources = '';
                    }
                }
                callback(null, data.Items);
            } else {
                // データなし
                callback(null, '404 Not Found. Data is nothing.');
            }
        }
    });
};
```
Angular？　AngularJS？　両者は違うの？？　間違いやすい用語

AngularJSとAngularは同じものだと思っていませんか？
ネットの情報も間違っていることが多いので注意が必要です。

実は両者はバージョンによって読み方が違うのです。

AngularJS: version 1系
Angular: version 2以降
Rails初心者がもっと早く知りたかったこと

#スペック
・現PHPエンジニア(1年弱)
・Railsエンジニア転向のため、TechAcademyのRails講座を1ヶ月受講
・現在Railsで個人開発中
・個人開発でわからないことが続出、調べながら何とか進めています。

#タイムゾーン設定

APIを叩いて外部サービスの時刻を取得するのだが、日本のタイムゾーン(JST)ではなく、UTC(協定世界時)で取得するので、困った。
結論として、config/application.rbにタイムゾーンの設定を書く。

```config/application.rb
require_relative 'boot'

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
Bundler.require(*Rails.groups)

module Typetalks
  class Application < Rails::Application
    config.time_zone = 'Tokyo' # <= タイムゾーンを東京にする!!
  end
end
```

`config.time_zone = 'Tokyo'`と書くことで、RailsアプリケーションのタイムゾーンがTokyoになる。

UTC => JSTに変換するときは、`in_time_zone`メソッドまたは`zone`メソッドを使う。

```rb
irb(main):018:0> Time.now
=> 2017-10-18 03:21:01 +0000
irb(main):020:0> Time.now.in_time_zone
=> Wed, 18 Oct 2017 12:21:23 JST +09:00
irb(main):021:0> Time.zone.now        
=> Wed, 18 Oct 2017 12:21:29 JST +09:00
```

#DBの初期化
開発環境でDBを初期化してやり直したい時がある。
そういうときは以下のコマンドを実行する。

```
$ rails db:reset
```
1. 全てのテーブルを drop
2. "db/schema.rb" を元にテーブルを再作成

ケースによってはmigrateファイルからテーブル作成を行いたい場合もあるだろう。
そのような場合は下記のコマンドを実行する。

```
$　rails db:migrate:reset
```
1. 全てのテーブルを drop
2. "db/migrate/" 以下の全ての migration を実行してテーブルを再作成

#requireするライブラリファイルの記述箇所
最初はcontrollerやmodelの先頭に書いていたが、何回も同じことを書くのは面倒なので、
config/initializers/stdlibs.rbで一括管理する。

```config/initializers/stdlibs.rb
require 'net/https'
require 'uri'
require 'json'
require 'time'
```

###参考資料
[RailsでDBをリセットして最初からつくり直す [俺の備忘録]](http://o.inchiki.jp/obbr/183)
windows10のIE11からローカルのexeを実行 (URIスキーマ,ActiveX)

## レジストリにURIスキーマを新規登録する方法

Edgeでは実行できなかった。IEでは実行できた。

* [Registering an Application to a URI Scheme (Windows)](https://msdn.microsoft.com/en-us/library/aa767914(v=vs.85).aspx)
* [windows - ActiveXを使わずにwebブラウザ上でクライアントのexeを実行する方法 - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/27343/activex%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E3%81%ABweb%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E4%B8%8A%E3%81%A7%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AEexe%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

```go:note.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\note]
"URL Protocol"=""

[HKEY_CLASSES_ROOT\note\shell]

[HKEY_CLASSES_ROOT\note\shell\Open]

[HKEY_CLASSES_ROOT\note\shell\Open\command]
@="\"C:\\Windows\\notepad.exe\""
```

![reg0.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bc0ae005-0ff6-061b-6244-e05190b14286.png)
![reg1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d2e6a11c-57de-c5ba-f404-5da538fb3405.png)

```html:
<a href="note:">notepad</a>
```

![open.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8b712861-c4db-7888-7860-52b4f0317096.png)
![open2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/19dc7e5d-5fdd-cbfa-a5e5-c3ebff1d9c46.png)

## ActiveX 例1

* [ブラウザからローカルマシンにインストールされているEXEファイ… - 人力検索はてな](http://q.hatena.ne.jp/1145354904)

```html
<script LANGUAGE="JavaScript">
function cmd() {
	var obj = new ActiveXObject("WScript.Shell");
	obj.Run("cmd.exe");
}
</script>
<body>
<a href="javascript:cmd()">コマンドプロンプト</a><br>
</body>
```

## ActiveX 例2

* [JavaScriptを使って、exeファイルを実行してみる。 - ちんとんがめ♪色々備忘録・・・](http://chintongame.hatenablog.com/entry/2015/02/10/102655)

```js
function _notepad(filename) {
	var shell = new ActiveXObject("WScript.Shell");
	shell.Run("C:\\windows\notepad.exe" + filename);
}
```

## ローカルにhttpサーバーを建ててそこからexe実行

* http://localhost:8000/ にアクセスしたら c:\windows\notepad.exeを実行するようなの作るとか。
【データベース設計】リレーションの区別

DB設計をする際、テーブル同士には関連（リレーション）というものが存在します。リレーションはデータモデリングを進める上で必要な基礎知識になるのでひとつずつ覚えていきましょう。

#一対多
![スクリーンショット 2017-05-22 5.32.07.png](https://qiita-image-store.s3.amazonaws.com/0/110022/1a029669-a8ce-d6b6-4f1f-7ca360d0f23f.png)
まずはじめに一対多についてです。
ECサイトのユーザーテーブルと注文テーブルを例にとって考えてみましょう。
ECサイトでは、１ユーザーに対して注文は「複数」存在し、１注文に対してユーザーは「１」つ存在することになります。
このようなリレーションを一対多と呼ぶことができます。
#多対多
![スクリーンショット 2017-05-22 5.06.34.png](https://qiita-image-store.s3.amazonaws.com/0/110022/c888300f-6f1b-0dce-5c5b-e4ea10d983cd.png)
次に多対多です。
履修登録システムで生徒テーブルと科目テーブルがあった時、１生徒に対して科目は「複数」存在します。
そして同じように１科目に対して生徒も「複数」存在します。
この時、生徒テーブルと科目テーブルの関係は多対多であると言えます。
この場合、科目テーブルには登録している生徒が持つ同じ科目データが重複するので、冗長性が残ります。
この冗長性は、中間テーブルを設けて正規化することによって解決できます。

#一対一
![スクリーンショット 2017-05-22 5.06.40.png](https://qiita-image-store.s3.amazonaws.com/0/110022/365818f6-570e-edfe-e1c4-b99c22551487.png)
最後に一対一のリレーションです。
これは同じ主キーを扱っていて、本来分ける必要のないテーブルを分けるような時のリレーションです。
ユーザーテーブルとフリガナテーブルがあるとして、双方のデータは一対一に対応しています。
また主キーが同一なので、同じテーブルにまとめることができます。
このリレーションは特殊で実際にはあまり用いられることが少ないようです。
それでもFirebaseを使うべき5つのメリット

# 背景
先日、『[Firebaseをやめた4つの理由](http://qiita.com/ko2ic/items/3d25d41971636a28cc1c)』という記事が出ていて、注目を集めていた。
確かにFirebaseではこちらに書かれているような圧倒的に弱い部分があるのは確かである。
しかし、以下に示す５つのメリットを考えたときに、本当に導入しないのは適切かという想いがあり、この記事を書き起こした。

# ５つのメリット
## ① 機能の組み合わせで他ツールで難しいことが可能に！

例えばFirebase Analyticsの[はじめに](https://firebase.google.com/docs/analytics/)のページに以下の記載があるが、このように**特定のユーザーにのみ絞って画面の出し分け/ABテストや通知を送ることが可能**になる。
また、**その特定のユーザーをクラッシュしたユーザーやある通知を受け取ったユーザー、コンバージョンしたユーザーとすることもできる**。
そして、これらは**Firebaseだからこそ容易に実現できる**ことであり、他のツールでは労力を要したりそもそも実現が難しかったりする。

>**Firebase Crash Reporting**
Firebase Analytics はクラッシュが発生するたびにイベントをログに記録します。バージョンごとや地域ごとにクラッシュ発生頻度を把握できるため、影響を受けるユーザーに関する洞察が得られます。また、クラッシュが複数回発生しているユーザーのリストを作成し、そのリストを対象に Firebase Notifications を送信することもできます。

>**Firebase Notifications**
Firebase Analytics は Firebase Notifications に対応するイベントのログを自動で記録したり、実行した各キャンペーンの効果に関するレポートを作成したりすることができます。

>**Firebase Remote Config**
Firebase Analytics のユーザー定義を使用して、複数のバージョンを用意することなく、ユーザー層ごとにアプリの動作や外観を変更することができます。

## ② 実装コストのかかる機能も簡単に実装可能!
認証機能やプッシュ通知など、従来実装に負荷がかかっていた機能も容易に実装が可能である。
プッシュ通知やクラッシュレポートに至っては、**ライブラリをアプリに入れるだけ**で使えるようになる。

## ③ Googleがモバイル端末用プラットフォームとして強く推進!
従来、Googleの独立ツールであったApp IndexingやCloud Messagingを、Firebaseの機能の１つにするなど、Firebaseをモバイル端末用プラットフォームとしてGoogleは強力に推進している。
また、直近のGoogle I/O 2017でも買収したTwitterのモバイル開発プラットフォームであった『Fablic』のノウハウを活かすことを筆頭に様々な機能の成長に振れられていたり、[リリースノート](https://firebase.google.com/support/releases)を見ても活発な更新がなされていたりと今後更なる成長が見込める。

参考：
[Google、Twitterのモバイル開発プラットフォーム「Fabric」を買収、モバイルバックエンドサービスの「Firebase」に統合。Firebaseのクラッシュ解析機能など強化へ － Publickey](http://www.publickey1.jp/blog/17/googletwitterfabricfirebasefirebase.html)
[What’s new from Firebase at Google I/O 2017](https://firebase.googleblog.com/2017/05/whats-new-from-firebase-at-google-io.html)

## ④ エンジニア以外もWebコンソール上から容易に機能の使用可能!
一度、実装を行えば、プロダクトオーナーやマーケターなどビジネスサイドの人間でも、FirebaseのWebコンソール上から通知を送信したりABテストのラベルを変更したりすることが可能になる。
そのことで、その部分におけるエンジニアの負荷も低減できる。

## ⑤ 年齢・性別などがAnalyticsを導入するだけで解析可能に!
[こちらのページ](https://support.google.com/firebase/answer/6317486?hl=ja)に記載されているように、以下のユーザーの情報がFirebase Analyticsを導入するだけで解析可能になる。

**アプリのバージョン
端末の機種
性別
年齢
興味 / 関心
OS バージョン
新規 / 既存**

性別・年齢を筆頭に、アプリによっては従来取得困難だったプロパティを解析できるのは大変な強みであると思う。


# まとめ
上記記事で出てたようなFirebaseを使わない理由もわかるし、自身も『[Firebase AnalyticsのイベントプロパティはWebコンソールで反映されない](http://qiita.com/hinom77/items/9e7ab2880a12858a3d03)』や『[Firebase Analyticsの真面目なユーザープロパティ戦略](http://qiita.com/hinom77/items/37f930b9cc5cbfb1e6a6)』の記事で、FirebaseのAnalyticsが弱い話をしていたこともあるように実際に弱い部分も確かにある。
しかし、Firebaseはメリット③でも触れたように、成長の過程で頻繁な更新がなされているし、他ツールとの使い分けで弱い部分は補えばいい。
こんな使えるツールを弱い部分が目立つからと相手にしないのは、一方で実に惜しいと自身は思う。

---
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、どうか「いいね」よろしくお願いいたしますm(_ _)m
IPv6でアクセスすると"via IPv6"って出るやつ

IPv6でアクセスすると"via IPv6"って出る例のやつ作りました。
（HTMLタグ貼るだけのやつが見つからなかったので）

[表示してみる](http://viav6.kibousoft.co.jp/)

IPv6から繋ぐと
![Screen Shot 2017-05-22 at 3.19.22.png](https://qiita-image-store.s3.amazonaws.com/0/41274/d051c38f-f699-45a2-6caf-cd83cbd043ef.png)
が表示されます。

IPv4から繋ぐと
![Screen Shot 2017-05-22 at 3.19.41.png](https://qiita-image-store.s3.amazonaws.com/0/41274/97030035-c15a-2f71-c90b-c2be0a0a9f95.png)
が表示されます。

# 使い方

```html
<span id="kibousoft-viav6"></span>
<script type="text/javascript">
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://viav6.kibousoft.co.jp/', true);
xhr.onreadystatechange = function(){
if (xhr.readyState === 4 && xhr.status === 200){
   var dom = document.getElementById('kibousoft-viav6');
   dom.innerHTML = xhr.responseText;
 }
};
xhr.send(null);
</script>
```

# ソースコード
汚いですが直書きです。大したことしてない。

```php:index.php
<a href="https://github.com/kibousoft/viav6_web/" style="text-decoration: none; color: white;">
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$headers = apache_request_headers();
if ($headers['X-Forwarded-For']) {
	$ip = $headers['X-Forwarded-For'];
}

if (preg_match('/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $ip)) {
	echo '<div style="background: linear-gradient(#FF0000, #FF99CC); padding: 5px; border: 1px solid #333333; border-radius: 3px; font-size: 13px; width: 50px; text-align: center; font-family: sans-serif;">via IPv4</div>';
} else {
	echo '<div style="background: linear-gradient(#0000FF, #99CCFF); padding: 5px; border: 1px solid #333333; border-radius: 3px; font-size: 13px; width: 50px; text-align: center; font-family: sans-serif;">via IPv6</div>';
}
?>
</a>
```

# CORSの話

外部からXHRで取得される可能性のあるサイトでは、
`Access-Control-Allow-Origin` , `Access-Control-Allow-Methods` ヘッダーを返す必要があります。
.htaccessで以下を設定しました。

```apache:.htaccess
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET"
```

# インフラの話
最初Amazon API Gatewayでやろうとしたんですが、API GatewayはIPv6対応していませんでした。
なので、OpsWorksでPHP App Serverを立てて動かしています。
OpsWorksにも以下の問題がありました。

- Application Load Balancer（IPv6対応）には対応していない
- EC2へのIPv6アドレスのアタッチには対応していない
- セキュリティグループでIPv6のTCP 80番が許可されていない

そのため、上記の設定は手動で行いました。

# 備考
- Happy Eyeballsの関係で、サイトにはIPv4で繋がって、XHRはIPv6で繋がるケースもあるよねとか細かい話はなしで。
Udacity Deep Learning Nanodegreeの紹介

## tldr
[Udacity](https://www.udacity.com)のDeep LearningのNanodegreeを受けました。
Tensorflowつらい。Hyper Parameterのチューニングつらい。
でも、勉強になりました。

## Udacity Nanodegreeとは
UdacityはいわゆるMOOC(Massive Open Online Course)でプログラミングやデザインがオンラインの講座として学べます。
Udacity自体は無料ですが、いくつかのコースをまとめた有料のミニ学位(Nanodegree)を提供していて、そこでしか見れない講座もあります。

オンライン講座だと他にLynda.comやCode Schoolなどもありますが、動画を見るだけでなく、課題の提出を要求され、要求水準を満たさないと合格になりません。同種の形態のCourseraとの違いはCourseraがどちらかというと大学の講義に近いのに対して、Udacityは企業の研修に近いです。

## Deep Learning Nanodegreeとは
[Deep Learning Nanodegree](https://www.udacity.com/course/deep-learning-nanodegree-foundation--nd101)は2017年から始まった新しいNanodegreeです。

深層学習に特化していて、無事終えると自動運転やArtificial IntelligenceのNanodegreeへの入学許可がもらえます。
[Techcrunchの記事](https://techcrunch.com/2017/01/13/udacity-launches-deep-learning-nanodegree-foundation-program/)によると、それぞれ本来16%、4.5%のみ入学許可が出ているとの事なので価値はありますが、自動運転のコースでいうと、機械科卒の自分がPythonできますと言い張れば普通に通ったので、工学系卒ならお目当の講座一直線でもいいかもしれません。

なお、Deep Learnig Nanodegreeには自動運転コースにあるようなSVMやDecision TreeのようなNon-deepな機械学習はありません。逆にRNN系はこちらのみ(少なくともTerm1までで確認した限りでは)。
Machine Learning Engineer Nanodegreeだと両方入っていたりするんでしょうか。

## Sirajさんはそんなに教えてくれない
さて、本講座ですが、Udacityのページを開くとYoutuberのSirajさんが教えてくれることを大々的に宣伝しています。
![udacity_top.png](https://qiita-image-store.s3.amazonaws.com/0/103496/a463e27e-fced-badb-3808-ef7f2f5c9fe6.png)

ただ、実際やってみてわかったのは、むしろメインの講師は横にいるMatさんということです。課題のプロジェクトの前に予備的な説明パートがいくつかあるのですが、そこでの講師も基本Matさんです。一応Siraj講座とMat講座が交互になる構成になっていますが、Sirajパートは独立したYoutubeの転載なので、敷居を下げるための導入担当という印象でした。

なお、GANのパートではGANの論文の著者Ian Goodfelow自らGANを説明してくれます。すごいですね。
![ian.png](https://qiita-image-store.s3.amazonaws.com/0/103496/22b342a2-cc83-867e-33e9-5d9c782be71f.png)


## フレームワークはTensorflow
さて実際の講義ですが、Web上での説明の動画やテキストの他にJupyter Notebookでの作業を伴います。
コードは全てGithubで[公開されていて](https://github.com/udacity/deep-learning)、課題は穴埋めしたJupyter Notebookを提出することになります。

Deep Learningの性質上、GPU必須なのでAWSやFloydHubの無料枠が一応もらえますが、Jupyter Notebookをサーバーとして動かす都合上、IP制限かけないと誰でも見えてしまうので、手元にGPUマシンがあると安心かもしれません。

フレームワークはTensorflowなのでChainerやKerasと比べると低いレイヤーでの実装が度々要求されます。その分力がつくとも言えますが、相応の時間をコミットすることが要求されます。一応SlackのチャンネルやForumもありますが、だいたい日程通りに進めていても、Project4終了時点で君はTop 20%にいると言われたので、挫折率は高いのかもしれません。

## 実際の講義の内容
以下、実際に学べる内容です。
### 1. Neural Networks
AnacondaやJupyter Notebookの使い方の説明。課題はNeural Networkの構築でnumpyを使ってsigmoid関数ベースのニューラルネットワークを実装します。

### 2. Convolutional Networks
Sentiment AnalysisやTFLearnの解説、誤差逆伝播法の実装、CNNの解説。課題は画像分類。Dopoutの解説もあります。

### 3. Recurrent Neural Networks
RNN、 Word2vec、 ハイパーパラメター、 TensorBoard、初期化、転移学習、seq2seq、強化学習(さわりだけ)。課題はシンプソンズの会話の生成と機械翻訳。

個人的に一番面白かったのは初期化の部分です。
レンジの違いや([0,1]か[-1,1])、分布の違い(uniform、truncated_normal)による最終精度を比較していたのがタメになりました。

### 4. Generative Adversarial Networks
GAN, DCGANの解説、半教師あり学習。課題は顔画像の生成。
実装上間違えやすい部分の説明もあり、わかりやすかったです。
ただ、それをもってしても中々チューニングがうまくいかず、GANは難しいです。

## 全体を通して
講義を受けている中でTensorflow 1.0やKeras 2.0の発表がありました。後半の講義でも早速サンプルのバージョンがTensorflow 1.0となっていて対応がとても早かったです。

機械学習分野は進化が早いので紙の本だと情報が古くなりがちです。オンライン講座の醍醐味は継続的にアップデート可能ということなので、うまくフィットしていて良いと感じました。
Font Awesomeのファイルアイコンの中にテキストを追加する

[Font Awesome](http://fontawesome.io/) のファイルアイコンは何種類か用意されていますが、
そこにない形式のファイルも手っ取り早くアイコンにする方法です。

![](https://qiita-image-store.s3.amazonaws.com/0/94124/4ac80ab4-767d-2306-ae90-eba5f0b75cd8.png) → ![](https://qiita-image-store.s3.amazonaws.com/0/94124/42d1edcc-ad24-27ff-ea63-644fcd19ce3f.png)

こんな感じで、何も書いていないアイコンの上に、ファイル形式のテキストを追加します。

## やり方

[Font Awesome の Stacked Icons](http://fontawesome.io/examples/#stacked)（アイコンを重ねる）機能を使います。
ここで、２つのアイコンを重ねるのではなく、後に書く方をテキストにします。

```HTML:HTML
<span class="fa-stack fa-lg">
  <span class="fa fa-file-o fa-stack-2x"></span>
  <span class="fa fa-stack-1x">psd</span>
</span>
```
これだけでファイルアイコンと文字が重なるので、あとは CSS でバランスを整えます。

```CSS:CSS
.fa-stack {
  color: #666;
  font-size: 3em;  /* ← アイコン全体の大きさをここで変更できる */
}
.fa-stack-1x {
  /* 中のテキストのバランスは ↓ を好みで調整 */
  font-size: 0.9em;
  font-family: monospace;
  margin-top: 8px;
}
```
以上です。

実際のサンプルはこちら
https://jsfiddle.net/k3mp7vce/
【初心者】React.jsのチュートリアルの環境をwebpackで作る

これからReact.jsを勉強しようという初心者です。
公式のチュートリアルの簡単なゲームを実際に自分で作ってみて勉強しようと思っています。
https://facebook.github.io/react/tutorial/tutorial.html
![スクリーンショット 2017-05-22 0.53.37.png](https://qiita-image-store.s3.amazonaws.com/0/142910/6bd291a4-ef7a-b85a-d761-577fe987f875.png)

公式ではcreate-react-appコマンドで簡単に環境が作れますが、
Reactの記事にはよくwebpackも一緒に語られているので、せっかくなのでそちらで環境を作ってみようと思っています。

**注意**
私はただReactを趣味で勉強し始めただけで、業務でやってるわけでもなんでもありません。
間違っていることも書くと思います。
ただ、コピペしただけでReactとwebpackの環境を作成できるものにはしようと思います。
それとこの記事でReactのチュートリアルをやるわけではありません、環境を作るだけです。
他にも同じような記事がたくさんがありますが、自分の勉強のために書きました。間違っていたら指摘してほしいです、、、

##最終的なディレクトリ構成
このような形になります。

```
├　dist
│　└ bundle.js
├ node_modules
├ src
│　　├ index.css
│ └ index.js
├ index.html
├ package.json
└ webpack.config.js
```

##npmで必要なものをインストール
```
npm init -y
npm install --save-dev webpack react react-dom babel-loader babel-core babel-preset-react babel-preset-es2015 style-loader css-loader
```
package.jsonが作成されてインストールしたものが書いてあればOK

```json:packge.json
{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-core": "^6.24.1",
    "babel-loader": "^7.0.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "css-loader": "^0.28.1",
    "react": "^15.5.4",
    "react-dom": "^15.5.4",
    "style-loader": "^0.17.0",
    "webpack": "^2.5.1"
  }
}
```

##webpack.config.jsを作成

```javascript:webpack.config.js
module.exports = {
   context: __dirname + '/src',
   entry: {
      'index':'./index.js'
   },
   output: {
      path: __dirname + '/dist',
      filename: 'bundle.js'
   },
   module: {
      loaders: [
         {
            test: /.js?$/,
            loader: 'babel-loader',
            exclude: /node_modules/,
            query: {
               presets: ['babel-preset-es2015', 'react']
            }
         },
         {
            test: /\.css$/,
            loaders: ['style-loader', 'css-loader'],
         },
      ]
   }
}
```

webpackの設定ができました。

##cssとjsのコードを用意
srcフォルダを作成して、公式にある通り、index.cssとindex.jsの内容をコピペする
index.css
https://codepen.io/gaearon/pen/oWWQNa?editors=0100
index.js
https://codepen.io/gaearon/pen/oWWQNa?editors=0010

index.jsの上にimportを書き込んでおく

```javascript:index.js
import React from 'react';
import ReactDOM from 'react-dom';
import styles from './index.css';

// 以下コピペしたコード
class Square extends React.Component {
  render() {
     //...
```

##webpackでコードをバンドルする
```
$ ./node_modules/.bin/webpack
```
distフォルダとbundle.jsが作成されたら成功。

##ブラウザで表示させる

index.htmlで先ほど作成したbundle.jsを読み込む

```html:index.html
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <title>React</title>
</head>
<body>
   <div id="root"></div>
   <script src="dist/bundle.js"></script>
</body>
</html>
```
![スクリーンショット 2017-05-22 0.43.44.png](https://qiita-image-store.s3.amazonaws.com/0/142910/350dea1a-00ac-746b-c19e-a2b5b6b248bf.png)

マス目が表示された！

チュートリアルの環境を作ることができました。これから頑張って勉強していくつもりです。
ここまで読んでくださってありがとうございました。
raspberrypi3 自分用URLメモ

①無線のアクセスポイントにする方法
ここが一番読みやすかったかな

http://hyottokoaloha.hatenablog.com/entry/2015/02/24/000655

自環境に置き換える際に気を付けなければならないのは/etc/network/interfacesのインターフェース設定で、
たとえば僕の環境ではraspberry側のインターネットアクセスを有線にしてeth0からmanual（DHCP)でアドレス取得にしている
WiFiアクセスポイントにする場合はアクセスポイントにするwlanとは異なるインターフェースを設定しないと、GUIでWiFI設定した際などに書き変わってしまう可能性アリ、このインターフェース設定さえ気を付ければ上の参考記事でいける、わかりやすい。

②passoriは扱えるがACRのNFCリーダが読めない問題
http://enjoy-rfid.blogspot.jp/2015/03/raspberry-pi-nfc.html

これ

③raspberrypi3上でNFC操作用の javax.smartcardioでアプリケーションを記述する場合

https://stackoverflow.com/questions/12376257/accessing-javax-smartcardio-from-linux-64-bits

java実行の際に-Dをつけてlibpcsclite.so.1.0.0のパスを指定する
なお、自分の環境では /usr/lib/arm-linux-gnueabihf/libpcsclite.so.1.0.0であった
よって、
$java -Dsun.security.smartcardio.library=/usr/lib/arm-linux-
gnueabihf/libpcsclite.so.1.0.0 -jar test.jar

windows環境で動作したjavaアプリケーションの持ち込み時に動作不可となったが②と③が原因だった
さくらクラウドssh設定

#はじめに
友人から「さくらのクラウド」のクーポン券(２万円分)をもらったので借りてみた。
その時の設定を備忘録的な感じで書き記します:-)

#環境
サーバープラン : 仮想１コア、メモリ1GB
ディスク : SSD 20GB
OS : Ubuntu16.04 LTS

#ssh設定までの流れ
クラウドの登録からユーザーの作成、各種設定までの流れを記述していきます。
##クラウド登録の際の作業
まずさくらのクラウド登録の際にsshキーが必要になるのでローカル環境で公開鍵を作成。
`$ ssh-keygen -t rsa`
鍵の作成場所を聞かれるが、デフォルトの`~/.ssh/"キーの名前"`で構わない。
`"キーの名前".pub`が公開鍵となるのクラウドに登録する。
##ローカルからのルートログイン
クラウドの登録が完了したら、まずはローカルのターミナルからsshしてみよう。
Ubuntuにはデフォルトで`ubuntu`というユーザが作成されているのでそれでログイン。
```
$ ssh ubuntu@[サーバのIP] -i [先ほど作成した秘密鍵のパス]
```
サーバのIPは、「さくらのクラウド」コンソール画面の
サーバ→インターフェース に記載されている。
先ほどのコマンドでもsshできるが、いちいち鍵のパスを入力するのが面倒なので`ssh-agent`に鍵を登録しておこう。
`$ ssh-agent bash`
`$ ssh-add [秘密鍵のパス]`
で登録できる。登録の際、鍵作成時に入力したパスフレーズを求められるのでお忘れなく。
登録したら`$ ssh-add -l`で確認。

無事登録できていたら、
`ssh ubuntu@[サーバのIP]`
でssh接続が可能になっているはず。

##作業用ユーザーの作成とsudo権限の付与
Ubuntuでは基本的にubuntuユーザーで作業することはなく、作業用のユーザーを作成してそこで作業するのが一般的。以下のコマンドでユーザーを作成しよう。
`$sudo adduser [任意のユーザー名]`
次にこのユーザーにsudo権限を付与する。
`$sudo gpasswd -a [作成したユーザー名] sudo`

##sshの設定変更
sshの設定は/etc/ssh/sshd_configに記載してある。
セキュリティ面を考慮して、デフォルトの設定からいくつか変更していこう。
ひとまずは、

* sshポートの変更  `Port [任意のポート番号]`
* rootログインの禁止 `PermitRootlogin no`
* パスワード認証方式の禁止 `PasswordAuthentication no`
* 空パスワードの禁止 `PermitEmptyPasswords no`

を設定すればいいはず。
sshd_configの各部分を上記のように変更すれば設定完了。
また、パスワード認証方式を禁止したので、authorized_keysの設定をする必要がある。

```
$ sudo cp -r /home/ubuntu/.ssh .
$ sudo chown -R [ユーザー名]:[ユーザー名] .ssh
```


#最後に
備忘録的なのを書いていくのはいいことだと思うので、これからちょくちょくやっていこう。
turbolinksのせいで、setIntervalが全ページに反映されてしまった！！

## 概要
- jQueryでsetIntervalを使い、ページのreload（自動更新）機能を作ろうとしていました。
- reload（自動更新）したかったのは、indexページだけだったのですが、turbolinksというrailsにもともと備わっている機能のせいで、全ページにreload（自動更新）機能が発生・・・・・・
- その解決法を説明。

## turbolinksについて
- この記事（とそこで紹介されている記事）が参考になります。
[Turbolinksさんと上手く付き合う10の方法](http://qiita.com/seri_k/items/164accd9ef8ddb4a942e)

## 解決したコード

```reload.js
  function reload() {
   中略
  }

  var pathname = location.pathname.match(/messages/)
  var reg = RegExp(pathname);
  if(reg.test("messages")){
    setInterval(reload,60000)
  }

```

- こうすると、URLにmessagesが含まれているページだけで（自分が作っているアプリでは,messagesをURLに持つビューはindexのみ）、setIntervalが発火する。

### コードの説明
```js
var pathname = location.pathname.match(/messages/)
```
- location.pathnameで現在いるページのパスが取れる。.match(/messages/)でその中から、messagesを抽出する。

```js
var reg = RegExp(pathname);
```
- 変数pathnameを正規表現化する（この後、testを使うため。)

```js
  if(reg.test("messages")){
    setInterval(reload,60000)
  }
```
- 正規表現(reg).test("文字列")で,regに文字列が含まれている場合、trueを含まれていないとき、falseを返す。
- 今回だと、regにmessagesが含まれていると、trueになり、setIntervalが発火する。
Visual Studio 2017でPython開発

Visual Studio 2017でPythonの開発ができるようになりましたのでその手順です。

#環境
Windows 7 Professional SP1 64bit
Visual Studio 2017 Community 15.2 (26430.6)
Python 3.6.0
※Pythonは事前にインストールしていません。

#Python開発インストール
Visual Studio 2017のインストーラーからPython開発をインストールします。

![aaaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/2303ef45-4791-cb4e-2f4e-73824bfe1c61.png)

#Pythonプロジェクト作成
Visual StudioからPythonの新規プロジェクトを作成します。
今回はコンソールアプリケーションにします。

![bbb.png](https://qiita-image-store.s3.amazonaws.com/0/112075/cb106449-5149-7f2f-905c-e6cd53111843.png)

プロジェクトが作成されるので、「Hello World」を表示するプログラムを作成します。

```Python:PythonSample.py
print("Hello World")
```

![ccc.png](https://qiita-image-store.s3.amazonaws.com/0/112075/11450ffe-721d-3dbc-a5db-05c44605bd53.png)

プログラムを作成したら実行します。「Hello World」が表示されます。

![ddd.png](https://qiita-image-store.s3.amazonaws.com/0/112075/49797dc5-58f4-94ff-0966-fa1457ea1fe5.png)

以上でプロジェクトの作成は完了です。
turnipクイックスタート

## 概要
turnipはGUI画面の試験の自動化ツールです。
詳細な解説のページは他にあるので、そちらを参照下さい。
例えば以下のページなど。
http://gongo.hatenablog.com/entry/2013/05/29/223218

ここでは単純に実行だけするサンプルを提示します。

## サンプル
サンプルのテストとしては
"yahooで「富士山」と検索してwikiページを表示"
するような動作をさせています。

# 環境
ruby(多分2.1以上)が必要です。
またbundlerが無い場合は予め入れておいて下さい。


```
$ sudo gem install bundler 
```

あと、x上で実行する必要があります。そうしないとブラウザが起動しないです。
実機上か、vncでサーバに接続して実行しましょう。

## 実行
物資はgitにあげてます。
以下の順に実行すればとりあえず、ブラウザが勝手に立ち上がってyahooで「富士山」
と検索をしてwikiページにアクセスします。



```
$ git clone https://github.com/krawczyk2003/turnip_sample
$ cd turnip_sample
$ ./install.sh
$ ./run.sh
```




## 実行動画

<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr"><a href="https://t.co/weXV0f3x9A">pic.twitter.com/weXV0f3x9A</a></p>&mdash; tanaka-kj (@tanaka__kj) <a href="https://twitter.com/tanaka__kj/status/866313107613687809?ref_src=twsrc%5Etfw">2017年5月21日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
metalsmithでサイト再構築中です

##本文
とりあえず軽くご報告だけです。ただいまブログ高速化施策として、netlifyへの移行を目指していまして。そのためのフレームワークとして、metalsmith with handlebar.jsを選びました。後々、管理しやすいようにヘッドレスCMSも組み合わせる予定です。現在進行中でテンプレートをいじっているので、ビルト不可な時もございますが大枠は流用かだと思います。以下にてご参照ください。
##参考
[Github](https://github.com/wkwkrnht/metalsmith-simple-example)
[試験運用サイト](https://wkwkrnht-blog.netlify.com)