OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelでYamlを扱う

PHPには`yaml_parse()`や`yaml_parse_file()`などがYamlをパースする手段としてありますが、PECL拡張モジュールとして用意されていて標準のPHPにはバンドルされていません。せっかくComposerで楽にLaravelを導入したのにYamlパースするほうが大変だというのは納得がいかないので、別の方法を調べてみると非常に簡単でした。

- PHP 7.1.12
- Laravel 5.5.25

# Yaml Componentのインストール

SymfonyのYaml Componentをインストールします。composerとgithubから導入できるとありますが、Laravel使っているならcomposerになるでしょう。

```
$ composer require symfony/yaml
```

# Yaml Componentの登録

`config/app.php`ファイルの下の方に、`aliases`の項目があります。ここには名前空間までを含めたクラスの別名を登録できます。ここを見るとよく見かける`App`の正体が、`Illuminate\Support\Facades\App`であることがわかります。インストールしたYaml Componentもaliaseを登録しておきます。

```php
'aliases' => [

    'App' => Illuminate\Support\Facades\App::class,

    ...

    'Validator' => Illuminate\Support\Facades\Validator::class,
    'View' => Illuminate\Support\Facades\View::class,
    'Yaml' => 'Symfony\Component\Yaml\Yaml', // 追加
],
```

# Yaml Componentを使う

aliaseを登録したので、`use Yaml;`してあげることでYaml Componentが使えます。`database/file.yml`をパースするコントローラを書いてみます。`database_path()`を使うことで`database`ディレクトリの中のファイルパスが得られます。

```php
<?php

namespace App\Http\Controllers;

use Yaml;

class YamlController extends Controller
{
    public function parse() {
        $yaml = Yaml::parse(
            file_get_contents(database_path('file.yml'))
        );
        var_dump($yaml);
    }
}
```

web.phpに`Route::get('/yaml', 'YamlController@parse');`のように追加すればブラウザから確認できます。
以上です。
Windows Server 2016 CoreインストールをPowerShellで設定する

Windows Server 2016から、初期インストール時にあえて選ばないとGUIが付いてこないようになりました。
RSATをインストールする前に、コマンドラインで少し頑張ってみました。


# 初期設定

`sconfig.cmd`で次の設定ができます。

- ドメインへの参加
- コンピュータ名
- ローカル管理者の追加
- リモート管理の有効化
- Windows Updateの設定
- リモートデスクトップの有効化
- IPアドレス

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/23c08fe4-824a-4163-d7f2-dbe19eee3732.png)


# プロキシの設定

`netsh`コマンドを使います。

```doscon
netsh winhttp set proxy my.proxy.server:8000 "localhost;<local>"
```

:disappointed_relieved:  これでいいはずなのですが、`update-help`してもヘルプをダウンロードできない。。。


# Windows役割/機能のインストール

```powershell
Install-WindowsFeature 役割名
```

役割名とインストール状況は`Get-WindowsFeature`でわかります。

# PowerShell Remotingを有効にする

```powershell
Enable-PSRemoting -Force
```

## リモートマシンからPowerShellを使う

```powershell
$cred = Get-Credential
Enter-PSSession -Credential $cred コンピュータ名
```

Get-Credentialでは、リモートマシンへ接続するアカウントを入力します。


# ドメインコントローラにする

```powershell
$cred = Get-Credential
Install-ADDSDomainController -Credential $cred -InstallDns
```

Get-Credentialでは、ドメイン管理者のアカウントを入力します。

参照: https://docs.microsoft.com/en-us/powershell/module/addsdeployment/install-addsdomaincontroller


# コマンドいろいろ

| 内容 | コマンド |
|:--|:--|
| ログオフ  | `logoff`  |
| 再起動  | `shutdown /t 0 /r`  |
| シャットダウン  | `shutdown /t 0 /s`  |
| タスクマネージャ | taskmgr |


# 感想

んn年前は、
「unixむりー、WindowsみたくGUIがないと管理できないー」
なんて言われることがよくありました。
Windows ServerがCUIオンリーになったのは、もうGUIなくてもいいくらいにITリテラシーが向上したという理解でいいのかな？
cesiumでkml

#概要
cesiumでkmlを表示してみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/84590c36-6e00-9a87-357d-40de17dedf53.png)


#サンプルコード

```
var kml = '<?xml version="1.0" encoding="UTF-8" ?><kml xmlns="http://earth.google.com/kml/2.0"><Placemark><name>東京タワー</name><address>東京タワー</address><styleUrl>#s_ylw-pushpin</styleUrl><Point><coordinates>139.745433,35.658581,0</coordinates></Point></Placemark></kml>';
var url = URL.createObjectURL(new Blob([kml]));
var viewer = new Cesium.Viewer('cesiumContainer');
viewer.dataSources.add(Cesium.KmlDataSource.load(url));
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(139.60, 35.60, 100000.0),
});


```

#成果物
http://jsdo.it/ohisama1/4F5x

以上。
cesiumでgltf

#概要
cesiumでgltfを表示してみた。

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/e9e1eb4f-151e-828e-a823-a6057b71f488.png)


#サンプルコード


```
var viewer = new Cesium.Viewer('cesiumContainer', {
});                               

var box0 = {
    "asset": {
        "generator": "COLLADA2GLTF",
        "version": "2.0"
    },
    "scene": 0,
    "scenes": [{
        "nodes": [0]
    }],
    "nodes": [{
        "children": [1],
        "matrix": [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
    }, {
        "mesh": 0
    }],
    "meshes": [{
        "primitives": [{
            "attributes": {
                "NORMAL": 1,
                "POSITION": 2
             },
             "indices": 0,
             "mode": 4,
             "material": 0
         }],
         "name": "Mesh"
    }],
    "accessors": [{
         "bufferView": 0,
         "byteOffset": 0,
         "componentType": 5123,
         "count": 36,
         "max": [23],
         "min": [0],
         "type": "SCALAR"
    }, {
         "bufferView": 1,
         "byteOffset": 0,
         "componentType": 5126,
         "count": 24,
         "max": [1.0, 1.0, 1.0],
         "min": [-1.0, -1.0, -1.0],
         "type": "VEC3"
    }, {
         "bufferView": 1,
         "byteOffset": 288,
         "componentType": 5126,
         "count": 24,
         "max": [0.5, 0.5, 0.5],
         "min": [-0.5, -0.5, -0.5],
         "type": "VEC3"
    }],
    "materials": [{
         "pbrMetallicRoughness": {
             "baseColorFactor": [0.800000011920929, 0.0, 0.0, 1.0],
             "metallicFactor": 0.0
         },
         "name": "Red"
    }],
    "bufferViews": [{
         "buffer": 0,
         "byteOffset": 576,
         "byteLength": 72,
         "target": 34963
    }, {
         "buffer": 0,
         "byteOffset": 0,
         "byteLength": 576,
         "byteStride": 12,
         "target": 34962
    }],
    "buffers": [{
         "byteLength": 648,
         "uri": "http://jsrun.it/assets/k/4/P/h/k4Phi"
    }]
};
var json = JSON.stringify(box0); 
var url = URL.createObjectURL(new Blob([json]));
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(140.0, 38.0, 100000.0),
});
var scene = viewer.scene;
var origin = Cesium.Cartesian3.fromDegrees(140.0, 38.0, 10000.0);
var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(origin);
var model = scene.primitives.add(Cesium.Model.fromGltf({
    url: url,
    modelMatrix: modelMatrix,
    scale: 200.0,
    minimumPixelSize: 128,
}));

```


#成果物
http://jsdo.it/ohisama1/oCy6

以上。
Growi(旧Crowi-Plus)にプラグインを導入する方法

## Growi(旧Crowi-Plus)のインストール
CentOS7向け手順: https://qiita.com/SkyLaptor/items/d963157b81a87f3b5726

## プラグインの導入
### Elasticsearch
検索機能を有効にする。
結構な量の物理メモリを消費するため、4GB以上のメモリを搭載していることが望ましい。

```shell-session:
# systemctl stop growi
# vi /etc/yum.repos.d/elasticsearch-5.x.repo
# yum install java-1.8.0-openjdk elasticsearch
# cd /usr/share/elasticsearch
# bin/elasticsearch-plugin install analysis-kuromoji
# bin/elasticsearch-plugin install analysis-icu
# systemctl start elasticsearch
# systemctl enable elasticsearch
# vi /etc/sysconfig/growi
# systemctl start growi
```

```bash:/etc/yum.repos.d/elasticsearch-5.x.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```

```bash:/etc/sysconfig/growi
# 追記
ELASTICSEARCH_URI="http://localhost:9200"
```

Growiの管理画面にアクセスし、検索管理からインデックスを構築する。
![build_index.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/698322b4-0378-7cbd-c371-a3abfd6ad51f.jpeg)



### lsx
コンテンツ内に`$lsx(パス)`と入力することで、配下のディレクトリをツリー表示できるようになる。

```
# systemctl stop growi
# cd {growiディレクトリ}
# yarn add growi-plugin-lsx
# systemctl start growi
```

### pukiwiki-like-linker
PukiWikiのようなリンク構文を使えるようになる。
`[[このページ>https://qiita.com/SkyLaptor/items/c121a86318fdae1d64f4]]` → [このページ](https://qiita.com/SkyLaptor/items/c121a86318fdae1d64f4)

```
# systemctl stop growi
# cd {growiディレクトリ}
# yarn add growi-plugin-pukiwiki-like-linker
# systemctl start growi
```
LinuxやMacのターミナルを使うのにこれだけは覚えておいたほうがいい！ってコマンドなんかを書いてみる

Qiita初投稿です。緊張です。

メモ代わり&普及のためによく使うコマンドやシェルなどをつらつら書いてみようと思います。

主にmacのターミナルやlinux上で実行することを想定してます。
windowsだと最近はコマンドプロンプトで実行できるのかな？未検証です。
bashを想定して書いてます。cshとかの場合は設定ファイルなどが少し変わります。
それぞれのコマンドにはオプションが多数あります。全ては書いてません。

# コマンド
## 基礎中の基礎

### ls
list
ディレクトリの内容を表示する

```console
$ ls [-option]
// 詳細（更新日とか権限とか）も表示する
$ ls -l
// 最終更新日（タイムスタンプ）でソート（新しい物が上）
$ ls -t
// 逆順にソートする
$ ls -r
// 隠しファイルも表示する
$ ls -a
// ファイル・タイプを表す記号をつけて表示する（ディレクトリ:「/」、シンボリック・リンク:「@」など）
$ ls -F
// ディレクトリを指定して表示する
$ ls [-option] [表示したいディレクトリのパス]
```

```console
// 上記を組み合わせて自分がよく使うコマンド
$ ls -ltr
$ ls -ltra
```

よく設定するエイリアス

```shell:.bashrcとか.bash_profileとか
alias ls='ls -F --color=auto'
alias ll='ls -l'  # centosとかだとデフォルトで設定されてたりする
alias la='ls -a'
```


### cd
change directory
ディレクトリの移動（変更）する

```console
// ホームディレクトリに移動する
$ cd 
// 指定したディレクトリに移動する
$ cd [移動したいディレクトリのパス]
```


### pwd
print working directory
作業中のディレクトリパスを表示する

```console
// 今どこにいるか表示する
$ pwd
```


### history
コマンド実行の履歴を表示する

```console
$ history
```

よく設定するエイリアス

```shell:.bashrcとか.bash_profileとか
alias h='history'
```

### date
日時を表示する

```
// 現在時刻を表示する（サーバ内の時間）
$ date
```


## とっても便利

### ln
link
リンク（ショートカット）を作成する

```console
// シンボリックリンクを作成する
$ ln -s [リンク元のパス] [リンクの名前]
```

### grep
globally search a regular expression and print
文字列を検索する

```console
// 特定のファイル内から文字列を検索する
$ grep [検索したい文字列] [パス/検索したいファイル名]
// ディレクトリ内のファイルから文字列を検索する（ワイルドカードを使用する）
$ grep [検索したい文字列] [パス/*] # 拡張子指定や部分一致も可能
```

### find
ファイルを検索する

```console
// 今いるディレクトリからファイル名を指定して検索する
$ find ./ -name "[検索したいファイル名]"
// 今いるディレクトリからファイル名をあいまい検索する（ワイルドカードを使用する）
$ find ./ -name "*[検索したいファイル名]*"
```

### tail
ファイルの末端を表示する

```console
// ファイルの末端10行を表示する
$ tail [ファイル名]
// ファイルの末端を表示し続ける（ログの監視等に使用）
$ tail -f [ファイル名]
```

### コマンドの停止
永続的に実行されているコマンドや不具合などで処理が終わらない時などに終了させる方法
typoなどで入力をリセットしたいときなどにも使える

```
// コンソールに入力するものではないので注意
ctrl + c
```


## 自作シェルツール
よく使うコマンドを使いやすくしたりが多い。

### log_tail.sh
tailの拡張
ログファイルのディレクトリが、```年/月/日.php```とかになってる場合に、いちいち```cd```して```tail```して。。。がめんどくさいので作成
ログファイルの出力の仕方によって参照先を調整

```shell
#!/bin/bash

YEAR=$(date '+%Y')
MONTH=$(date '+%m')
DAY=$(date '+%d')
tail -f [ログファイルのディレクトリパス]/logs/$YEAR/$MONTH/$DAY.php
```

### fg.sh
grepの拡張
再帰的にgrepしたかったので作成
find&grep

```shell:fg.sh
#!/bin/bash
find ./ -name "*.$2" | xargs grep -nr `echo $1 | nkf -s` | nkf -w
```
```shell:.bashrcとか.bash_profileとか
# 自作シェルを置いてあるディレクトリのパスを通しておく
export PATH=/Users/sakuma/.tools:$PATH:
function fg(){
    echo "fg $1 $2"
    LC_CTYPE=C LANG=C fg.sh $1 $2
}
```
```console
$ fg [grepしたい文字列] [検索するファイルの拡張子]
```

### jg.sh
grepの拡張
Mac向け
日本語のgrepが上手く動かなかったりするので作成

```shell:jg.sh
#!/bin/bash
grep -nr `echo $1 | nkf -s` $2 | nkf -w
```
```shell:.bashrcとか.bash_profileとか
# 自作シェルを置いてあるディレクトリのパスを通しておく
export PATH=/Users/sakuma/.tools:$PATH:
function jg(){
    echo "jg $1 $2"
    LC_CTYPE=C LANG=C jg.sh $1 $2
}
```
```console
$ jg [grepしたい文字列] [grepするファイル]
```

# まとめ
コマンドはいっぱいあります。
自分も知らないもののほうが多いです。

LinuxやUnixなどが基本CUIのため、
コマンドと聞くとサーバ関連を連想する人が多いと思いますが（そんなことない？）、
コマンドにはPCを操作する上で便利なものもいっぱいあるので、
サーバエンジニアではない人もぜひ触って覚えて使いこなしてほしいと思います。

続編やるかは不明
やるとしたら`cp` `mv` `touch` `cat` `rm` `mkdir` `chmod`この辺のファイル操作系
まだまだ基礎中の基礎！
Virtual Boxに立てたCentOS7がインターネットにでれないのでDHCPで振られるはずのIPを強引に設定してなんとかする

■環境
[Host]
Windows 7
Virtual Box 5.1.30

{guest]
CentOS7

■やりたいこと
Elastic Search+Kibanaをインストールしてみたい
CentOS6でも7でも良いようなので自分的にまだバリバリ慣れてはいないCentOS7を選択

■ハマったこと
Virtual Boxには何度もLinuxをインストールしたことあり
最近はVagrantでUbuntu立ててみたり
でのほほんといつもとおりVM立ててCentOS7インストール
インストール後、まずSSHがつながらない、yumがつかえない(NWでれない)

■試行錯誤(時系列)
CentOS7インストール後、そのままの状態で、Virtual Boxのネットワーク - NAT - 高度 でポートフォワーディングを有効にする(ホスト:2222 -> ゲスト:22)
Teratermからlocalhost:2222 でアクセス
ログインダイアログが表示されたのでおお、すぐつながる状態なのか(=sshdが起動していてファイアウォールの制限もない)。へ～となる。
rootログインも最初からできるのかな? とrootログインを試みようとするが、パスワード入れてOKボタンを押しても反応がない(これ最近Vagrant試したときもこうなったな・・そのときはVMが起動完了できてなかっただけだったけど)
ググった結果、VMに2つめのNICを追加することにする(ホストオンリーアダプタ)
Virtual Boxを手軽に安全にサクっと使うには、デフォルトのNAT+ホストオンリーアダプタの2つのNICを利用するのがベストプラクティスみたい(これはもちろん使い方と環境による)。社内LAN上にローカルのVMを存在/認識させたくないしVMからはPC経由してyumとか使いたいので自分的にはこれがハマり。
設定手順は、CentOS7をシャットダウンして、Virtual BoxのVM設定画面 - ネットワーク - アダプター2 - ホストオンリーアダプタを有効化して、CentOS7起動。
起動後、# nmcli conn show コマンドを叩くと、「有線接続 1」が追加されてる。# nmcli conn show "有線接続 1" を実行するとDHCPで自動的に振られたIPが確認できる。※接続名が日本語うぇ・・気にしない
設定されたIP:22に対してTeratermで接続してみる。今度はログインOK! ここからはPC(Windows)とのクリップボード介したコピペができて嬉しい
がまだyumつながらない。インターネット出れないんだ。こういうときはまず# ping 8.8.8.8 (->Googleが好意で公開してるDNSサーバ) がとおることを目標にしていろいろ切り分ける
結果、Virtual BoxさんがやってくれてるはずのDHCPが、NATのネットワークに利いてないんだと理解する。
Virtual Boxの環境設定でDHCPはちゃんと設定されてるのでこれどうしようかなと・・
強引ですけど、DHCPで当てられるであろうIPアドレスなどを静的にNATネットワークにひもづいてるifcfg- ファイルに書いてしまって解決しました。
NATでVMに振られるのは10.0.2.15/24, GW=10.0.2.2 のようなのでコレをスタティックに振っちゃいます！

```
# cd /etc/sysconfig/network-scripts
# cp -p ifcfg-enp0s3 ifcfg-enp0s3.bak #戻せるように
# vi ifcfg-enp0s3

BOOTPROTO=none
ONBOOT=yes
IPADDR=10.0.2.15
NETMASK=255.255.255.0
GATEWAY=10.0.2.2

# systemctl restart network
```

 # ping 8.8.8.8 でつながるようになりました！
プラス、社内で使われてるDNSサーバを/etc/resolv.confに書いてあげて、社内外のサーバの名前解決もOK！
yumを使えるようになりました。

＃Virtual Boxの仕組みにちょっと強くなれたけど、VMのネットワーク不通の切り分けはつらい・・
ディレクトリ内のファイルのHash一覧を作る

#ディレクトリ内のファイルのHash一覧が欲しい

Script書く必要あるのかなとか思っていたのですが、結論から言うとコマンドだけでOK

```
$ find . -type f -exec md5sum {} \;
```

これでファイルの一覧が表示される。

複数のファイルが存在していて、ある拡張子のファイルのHash一覧が必要であれば

```
$ find . -name "*.txt" -exec md5sum {} \;
```
となる。

Macだとmd5sumが使えないので、

```
$ find . -name "*.ｔｘｔ" -exec openssl md5 {} \;
```
とこれで行けた。
[AWS QuickSight]ELBのログをURLパスでフィルタする

# 概要
ELBのアクセスログをQuickSightで分析したいとき、URLのパスでフィルタしたいのはよくある用途かと思います。
ですが、ELBのアクセスログにはフルパスしか存在しないため、ホストやクエリストリングも付与されており、分析がしにくい状況です。
また、QuickSightのフィルタにも正規表現等は存在しないので、文字列操作で無理やりぶっこぬきました。

# 前提
ELBのアクセスログをQuickSightで分析する方法に関しては下記を参考にさせていただきました。
https://dev.classmethod.jp/cloud/aws/20170226-quicksight-elb/

QuickSightで任意のフィールド（計算フィールド）を追加する方法については下記を参考にしていただければと思います。
https://dev.classmethod.jp/cloud/aws/tips-quicksight-date-type-format/

# 本編
## サービスのURLパスが全て/hoge/で始まる場合
データセット編集画面でフィールドの追加を選択し、Formulaに下記をぶちこむ。

```
substring(substring({url}, 1, ifelse(locate({url}, '?') = 0, strlen({url}), locate({url}, '?') - 1)), locate({url}, '/hoge/'), strlen(substring({url}, 1, ifelse(locate({url}, '?') = 0, strlen({url}), locate({url}, '?') - 1))) - locate({url}, '/hoge/') + 1)
```

クエリストリングを切り捨てたのち、ホスト部分を切り捨てています。

## co.jpドメインの場合
弊サービスの場合は上記で事足りたのですが、一般的にはログが全て/hoge/で始まってることはないかと思い、ドメインの終端文字列がco.jpで終わるバージョンもつくりました。

```
substring(substring({url}, 1, ifelse(locate({url}, '?') = 0, strlen({url}), locate({url}, '?') - 1)), locate({url}, 'co.jp') + strlen('co.jp') + ifelse({ssl_protocol} = '-', strlen(':80'), strlen(':443')), strlen(substring({url}, 1, ifelse(locate({url}, '?') = 0, strlen({url}), locate({url}, '?') - 1))) - (locate({url}, 'co.jp') + strlen('co.jp') + ifelse({ssl_protocol} = '-', strlen(':80'), strlen(':443'))) + 1)
```

http/httpsが混在している場合にも対応しています。

# まとめ
こんなんしなくてもできるよ等あったらコメントお願いします。

# 参考資料
## QuickSightの計算フィールドについて
http://docs.aws.amazon.com/ja_jp/quicksight/latest/user/working-with-calculated-fields.html
CentOS7にGrowi(旧Crowi-Plus)をインストールする方法

2018.4.18現在の最新版Growi(v3.0.7)向けの手順。
Growiバージョンにより要求されるモジュール（nodejsやnpmなど）のバージョンが異なる場合があるので、[Growi GitHub](https://github.com/weseek/growi)の説明をよく読むこと。

## OS初期セットアップ
OSのインストールが完了していなければ、下記ページを参考にセットアップを済ませておく。
https://qiita.com/SkyLaptor/items/1036d470c2d4117b9954

## 前提モジュールの導入
```shell-session:
# vi /etc/yum.repos.d/mongodb-org-3.4.repo
# curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
# wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
# yum install git gcc-c++ make nodejs yarn mongodb-org
# npm install -g npm@5.8.0
# systemctl start mongod
# systemctl enable mongod
```

```bash:/etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
```

```shell-session:npmのバージョンを列挙したい場合のコマンド
# npm info npm versions --json
```

## Growiの導入
もし[バックアップから復元する](https://qiita.com/SkyLaptor/items/d02b702764428a08e3f5)予定であれば、この時点でGrowiを起動(`systemctl start growi`)しないこと。

```shell-session:
# cd /usr/local/bin
# git clone https://github.com/weseek/growi.git
# cd growi
# git checkout v3.0.7
# yarn
# vi /etc/systemd/system/growi.service
# vi /etc/sysconfig/growi
# systemctl daemon-reload
# systemctl start growi
# systemctl enable growi
```

```bash:/etc/systemd/system/growi.service
[Unit]
Description=Growi
After=network.target mongod.service

[Service]
WorkingDirectory=/usr/local/bin/growi
EnvironmentFile=/etc/sysconfig/growi
ExecStart=/usr/bin/npm start

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

```bash:/etc/sysconfig/growi
PORT=3000
NODE_ENV=production
PASSWORD_SEED="`openssl rand -base64 128 | head -1`"
MONGO_URI="mongodb://localhost/growi"
FILE_UPLOAD=local
```

2-3分待った後に`http://{サーバーIP or FQDN}:3000/`にアクセスすると、初回セットアップ画面が表示される。

![setup.jpg](https://qiita-image-store.s3.amazonaws.com/0/97774/742312ab-7198-01da-7000-51d09d75df6a.jpeg)


システム管理者の情報を入力し、ログインできるようにすること。

## 参考
https://qiita.com/yuki-takei/items/5df9601039ccfc1df01f
https://github.com/weseek/growi
Magento2でサンプルデータを後から簡単にインストールする


この記事は[Magento Advent Calendar 2017](https://adventar.org/calendars/2349)の15日目です。



#　はじめに

Magento2をComposerで入れて、Magento2 Cookbookを片手にいじっていたのですが、サンプルデータがないとどうも不便なことに気づきました。
自分でデータを入れるのはめんどくさいので、サンプルデータを後から入れようと思ったんですけど、[サンプルデータを入れてMagentoをセットアップする方法](https://principle-works.jp/blog/how-to-setup-magento2-with-sample-data/)という情報はあっても、意外とMagentoをセットアップしてから、サンプルデータを入れたくなったっていう情報は少ないんですね。

ってことで、Magento初心者の方に参考になれば幸いと思い、この度は、Magento2セットアップ後に、後からサンプルデータを簡単にインストールする方法を紹介したいと思います。



# 開発環境

・ホストOS Mac
・ゲストOS Ubuntu16.04
・MySQL14.14
・Apache2.4.18
・PHP 7.0.22
・Vagrant 2.0.0



# 1. モードを切り替える。

まずサンプルデータを入れるために、開発モードにMagentoを切り替えます。
何も手を加えていなければ、Defaultになっていると思います。
はじめに**Magentoのルートディレクトリ**に移動してください。
今のモードを下記のコマンドで見てみましょう。

`$ php bin/magento deploy:mode:show`

"Developer"となっていなければ、下記のコマンドで変更しましょう。

`$ php bin/magento deploy:mode:set developer`


変えたらまた同じコマンドで開発モードになっているか確認しましょう。

`$ php bin/magento deploy:mode:show`


Developerになっているのが確認できたと思います。



# 2. サンプルデータを既存のMagentoに取り組む。



早速サンプルデータを既存のMagentoに取り組みます。

コマンドは下記です。

`$php bin/magento sampledata:deploy`


途中でMagentoをセットアップした際に聞かれたIDとパスワードが聞かれます。
これはMagentoをセットアップした際に使った**public key/private key**です。

MagentoにログインしMarketplace→My access keyで見ることができます。


これでサンプルデータが入りました。
→インストール中にkillされた場合、下記の**補足**を参照してください。



# Magentoに反映させる。


今度はサンプルデータをMagentoに反映させます。

`$php bin/magento setup:upgrade`

完了です。



## 補足

サンプルデータは大きいです。
デフォルトのメモリだと、インストール中に実行中のプログラムが殺される場合があります。
なので、インストール中にkillされた場合、たいていの場合はメモリ不足です。


以下のコマンドでログを見て原因を探りましょう。**out of memory**とあればメモリ不足が原因となります。

`$cat /var/log/kern.log`


VagrantのメモリがDefaultになっている場合は増やすべきです。
１Gでは足りません。4Gに増やしましょう。
＊メモリは高い方がいいかもしれませんが、高すぎるとうまく動作しないことがあるので注意しましょう。

Vagrantfileに以下のコマンドを追加。

`Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 4096`

結果的にVagrantfileの終わりにendが3つになることに注意してください。
endを忘れていたりすると、Vagrant reload時に怒られます。


あるいは、LanchpadからVirtual Boxを開き、

`メインメモリー＞システム＞設定`

でメインメモリーを**4096**に増やしてください。

（こっちの方が簡単です。）


そして、`$vagrant reload`をし、
`$vagrant up`で起動し、
`$vagrant ssh`でゲストOSに戻ります。


仮想OSにあるメモリ量を確認しましょう。

freeコマンドで全容量と使っているメモリを確認できます。
`$free -m`
(-mというのはメガ単位でメモリを見るということです)


メモリが上がっていると思います。


### さらにメモリをあげたい場合

サンプルデータを入れるためには、4Gで十分ですが、さらにメモリをあげたい場合は、Swapを追加しましょう。

SwapはDefaultでは入っていません。

Swapを使うためには、/var/tmp　に空ファイルswapfileを作ります。
`$cd /var/tmp`
`$vim swapfile`

そして**tmpディレクトリ**がカレントディレクトリの状態で、1Gのswapを作ります。
`$ dd if = /dev/zero of=/var/tmp/swapfile bs=1m count1024`
`$mkswap swapfile`
`$swapon swapfile`

うまくいかない場合は、単純エラーの可能性がありますので、一度起動し直しましょう。
`$swapoff swapfile`
`$mkswap swapfile`
`$swapon swapfile`

これでswapが作られたか確認します。
`$free -m`

メインメモリの下に、swap欄がありますが、そこに1G追加されたのが見えると思います。


*Vagrantを停止すると、再度swapを起動させる必要があります。
その際は以下のコマンドで起動させることができます。
（ここでは起動自動化については割愛させていただきます。）
`$mkswap swapfile`
`$swapon swapfile`




以上です。




次回の16日目の記事はkzkick2ndさんで[”サーバー1つで頑張るMagento2インフラ”](https://adventar.org/calendars/2349)です。
Geekbench4 on Ubuntu 16.04

Geekbench4のCUDAベンチをUbuntu 16.04で取りたい時のメモ

```
# wget http://cdn.geekbench.com/Geekbench-4.2.0-Linux.tar.gz
# tar zxvfp Geekbench-4.2.0-Linux.tar.gz
# cd Geekbench-4.2.0-Linux/
# ./geekbench4 --compute CUDA
```
CUDAベンチをする場合にはライセンスが必要な為、10ドル程支払いライセンスの取得後に、CUDAテストの実行

```
# ./geekbench4 -r [mail-address] [メールで送られてきたライセンス番号]

複数枚のGPUが刺さっている場合には下記コマンドで確認と指定
# ./geekbench4 --compute-list
Geekbench 4.2.0 : http://www.geekbench.com/

CUDA
0 0 GeForce GTX 1070
0 1 GeForce GTX 1050 Ti
OpenCL
0 0 GeForce GTX 1070
0 1 GeForce GTX 1050 Ti

GPUを指定してCUDAベンチの実行 (GTX 1070)
# ./geekbench4 --compute CUDA --compute-platform-id 0 --compute-device-id 0

GPUを指定してCUDAベンチの実行 (GTX 1050 Ti)
# ./geekbench4 --compute CUDA --compute-platform-id 0 --compute-device-id 1
```
[ブログ紹介] Monapartyで何か作ってみる備忘録的な

Monaparty トークンを使ったサービスを PHP で作る際に参考になるブログ記事がありましたので紹介します。

* [Monapartyで何か作ってみる備忘録的な](http://blog.utyuu.space/2017/12/09/monapartyasobu/)

ずがーん氏は Monaparty トークンを使った web ゲームアプリ「[TOKENBATTLE](http://blog.utyuu.space/tokenbattle_in/)」の作者でもありますね。

初学者向けの良記事なのですが、一箇所だけ誤解があるようでした。
現在 Monaparty 用で公開されている counterpartyd は無いものの、[Counterblock API に proxy_to_counterpartyd というメソッドがあり](https://counterparty.io/docs/counterblock_api/#proxy_to_counterpartyd)、Counterparty API を間接的に呼び出せます。

ドキュメントによると proxy_to_counterpartyd は将来削除予定となっているのですが、公式ウォレットである Counterwallet でも用いられており、しばらくは安泰と思われます。
Qiita の投稿をターミナルにコピペする時に注意すること

# はじめに
Web ページは JavaScript を使用したり、[CSS で実際の内容を非表示にしたり](http://thejh.net/misc/website-terminal-copy-paste)、古くは [Flash を利用したり](http://www.st.ryukoku.ac.jp/~kjm/security/memo/2008/08.html#20080820_setClipboard)することにより、クリップボードに安全でない内容を保存することができます。そのため、信頼できない Web ページに書いてあるコマンドをターミナル (端末エミュレータ) に直接コピーアンドペーストしないことを心がけている人もいるでしょう。それでも、Markdown で投稿されている Qiita に書いてある内容は比較的安心してコピペしてしまっている人も多いのではないでしょうか。

しかし、Qiita でも不可視の画像を使用することでクリップボードに閲覧者が意図しない内容を挿入することが可能です。

# 動作を確認したブラウザ
- Google Chrome 63.0.3239.84 (Windows)
- Google Chrome 63.0.3239.84 (macOS)
- Opera developer 51.0.2802.0 (macOS)
- Vivaldi 1.13.1008.36 (macOS)

恐らく WebKit/Blink 系なら動作します。Edge はコピー自体が行われず、Firefox はコピーは行われましたが改行文字が除去されました。

# サンプル
macOS などの Unix 系 OS を利用している場合、以下のただの `echo` 文に見えるテキストをターミナルにコピペするとログインユーザ名が表示されます (使用しているシェルとターミナルの組み合わせによっては、実行されないこともあります)。

<code>$ echo<img src="https://qiita-image-store.s3.amazonaws.com/0/214275/042204db-cb5c-2024-6840-35126696e941.png" width="0" alt="; clear; echo Hello, $USER!&#x0a;echo"/> Hello, world!</code>

# 解説
サンプルの Markdown は次の通りになっています。Markdown と言っても、ただの HTML ですね。

```
<code>$ echo<img src="https://qiita-image-store.s3.amazonaws.com/0/214275/042204db-cb5c-2024-6840-35126696e941.png" width="0" alt="; clear; echo Hello, $USER!&#x0a;echo"/> Hello, world!</code>
```

Qiita では Markdown 中の一部の HTML 要素と属性値がそのまま出力されます (それ自体は Markdown の仕様のうちです)。今回は出力されるものの中でも `img` 要素と `code` 要素を利用しています。

`` ` ` `` を利用したコードインライン表示では内部の HTML がエスケープされてしまいますが、`code` 要素を利用することでコード表示の中に `img` 要素をそのまま出力することが可能です。`img` 要素をコピーするとクリップボードには `alt` 属性の値が入りますが、この時属性値の中に `&#x0a;` が含まれていることに注意してください。`&#x0a;` は HTML 中で[数値文字参照](https://html.spec.whatwg.org/multipage/syntax.html#character-references)として扱われ、表示時には `0x0A`、つまり改行文字 (`LF`, `\n`) に展開されます。そのため、クリップボードにコピーされる内容に改行文字が含まれることになり、ターミナルへのペーストと同時にコマンドが実行されます。また、表示される画像には 1px の画像を利用していますが、より目立たなくするために `width` 属性の値を0にして完全に非表示にしています。

# 対策
## コピペしない・コピペした内容をエディタなどに貼り付けて内容を確認する
正道と言えば正道なのですが、そうは言っても人間にうっかりは付きものです。人間の注意力だけに頼るのは限界があるでしょう。

## Bracketed Paste Mode に対応したシェルとターミナルを使用する
最近のシェルの多くは Bracketed Paste Mode と呼ばれる xterm の拡張に対応しており、この機能が有効な状態かつターミナル側も対応している場合、複数行のペーストをしてもすぐに実行されないようになっています。zsh や fish ではデフォルトで有効になっているため、サンプルが動作しなかった人も多いかもしれませんね。

しかし、古いシェルのサーバへ SSH でアクセスしたりすることを考えるとこれも完璧ではないでしょう。また、Qiita では表示時に除去されているようですが、コピーする内容にペースト終了のエスケープシーケンスを含めた場合はエスケープシーケンスがフィルタされていないターミナルではコマンドが実行されてしまいます。

## ターミナルの確認機能を利用する
お使いのターミナルに複数行ペーストしようとした時に確認する機能があれば、それを有効にするのが一番良いかと思います。

iTerm2 では Edit → Paste Special の "Warn Before Multi-Line Paste" と "Warn Before Pasting One Line Ending in a Newline at a Shell Prompt" を ON に、"Limit Multi-Line Paster Warning to Shell Prompt" を OFF にすれば複数行や改行で終わっている内容のペースト時に警告が行われるようになります。
CakePHP3 BootstrapUIで、col-md-xxを変更する

# やりたいこと

[BootstrapUI](https://github.com/FriendsOfCake/bootstrap-ui) の FormHelper::control() を使って表示される html の `col-md-6` を `col-md-8` 変更したい。

こう書くと...

```php
echo $this->Form->control('title', ['label' => 'タイトル']);
```
こういう出力になる。

```html
<div class="form-group text">
<label class="control-label col-md-2" for="title">タイトル</label>
<div class="col-md-6">
<input type="text" name="title" id="title" class="form-control" value="">
</div>
</div>
```

デフォルトはこんな感じ
https://github.com/FriendsOfCake/bootstrap-ui/blob/master/src/View/Helper/FormHelper.php#L104-L111

# やり方

## 全体に反映する場合

```php:src/View/AppView.php
    use UIViewTrait;

    public function initialize()
    {
        $this->initializeUI();
        $helpers = $this->helpers();
        $helpers->Form->setConfig('grid.middle', 8);
    }
```

## ビュー毎に反映させたい場合

```php:src/Template/Controller/add.ctp
$this->Form->setConfig('grid.middle', 8);
```

# まとめ

面倒だけど、ビュー毎に設定した方が無難　:sweat: 

## 環境

- CakePHP: 3.5.7
- BootstrapUI: 1.2.1
【Django】Model定義周辺の小ネタ


今年に入ってDjangoをやり始めたヒヨっこですが、そのヒヨっこがDjangoでアプリケーションを開発するにあたって「これはよいかもなー」などと思った、Model定義周辺の知見を書いていきます。
すでに長年使われている方々にとっては「何を今更」という話題かもしれませんが。
あと、ほとんど[Two Scoops of Django 1.11](https://www.twoscoopspress.com/products/two-scoops-of-django-1-11)の受け売りです。


## TimeStampedModelを定義する
DjangoでModleを定義するにあたって、大抵の場合レコードが作成された時の日時を格納するフィールドと、レコードが更新された時に日時を格納するフィールドを持っていると思います。
んで、Model定義ごとにそれらを定義してもいいんですが、テンプレートを作って、それを継承させたほうが楽だよね、という話です。

```python:core/models.py
from django.db import models

class TimeStampedModel(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True
```

`abstract = True`にしておくと、マイグレーションしてもテーブルが作られることはない。

んで、これを以下のように継承するという感じです。take it easy.

```python:apps/models.py
from django.db import models

from core.models import TimeStampedModel

class Sample(TimeStampedModel):
    title = models.CharField(max_length=200)
```


## ENUMを使って定数/選択肢を定義する
通常、Modelに定数/選択肢を設定する場合は、以下のように書くと思います。

```python:apps/models.py
from django import models

class Idol(models.Model):
    ATTRIBUTE_CUTE = 'cu'
    ATTRIBUTE_COOL = 'co'
    ATTRIBUTE_PASSION = 'pa'

    ATTRIBUTE_CHOICES = (
        (ATTRIBUTE_CUTE, 'Cute'),
        (ATTRIBUTE_COOL, 'Cool'),
        (ATTRIBUTE_PASSION, 'Passion')
    )

    name = models.CharField(maxlength=255)
    attribute = models.CharField(
        max_length=2,
        choices=ATTRIBUTE_CHOICES
    )
```

この場合、attributeを条件にオブジェクトを取得する場合、以下のようになります。

```
pa_idols = Idol.objects.filiter(attribute=Idol.ATTRIBUTE_PASSION)
```


Python3.4以降には標準ライブラリとして、`enum`が追加されており、これを使って、定数/選択肢を記述することができます。(3.4以前の場合は`pip install enum34`をする必要があります)

```python:apps/models.py
from django import models
from enum import Enum

class Idol(models.Model):
    class ATTRIBUTE(Enum):
        cute = ('cu', 'Cute')
        cool = ('co', 'Cool')
        passion = ('pa', 'Passion')

        @classmethod
        def get_value(cls, member):
            return cls[member].value[0]


    name = models.CharField(maxlength=255)
    attribute = models.CharField(
        max_length=2,
        choices=[x.value for x in ATTRIBUTE]
    )
```

オブジェクトの取得の仕方については、以下のようになります。

```
passion = Idol.ATTRIBUTE.get_value('passion')
pa_idols = Idol.objects.filter(passion)
```


## Model Managerをカスタマイズする
DjangoのORMはModel ManagerというI/Fを使用していて、このI/Fを通してDBにアクセスしている、ということを最近知りました。
んで、このModel Manager自体をカスタマイズすることもできるとのこと。

例えば、models.pyに以下のように書く。

```python:apps/models.py
from django.db import models
from django.utils import timezone

class PublishedManager(models.Manager):

    use_for_related_fields = True

    def published(self, **kwargs):
        return self.filter(pub_date__lte=timezone.now(), **kwargs)

class Sample(models.Model):
    review = models.CharField(max_length=255)
    pub_date = models.DateTimeField()

    objects = PublishedManager()
```

このようにしておくと、以下のようにして、`pub_data`が現在時刻以前のオブジェクトのみを取得することができる。

```
Sample.objects.published()
```

いちいち、filter()やexclude()を使わなくてもよくなる。
エンジニアでもこっそりイケメンに？！ Photoshopかんたん顔イジり講座 

はじめまして！本日の記事を担当するのは「ひとりご飯でもいただきますをしてるよね」とイジラれがちなデザイナーmamitasoです。
よろしくお願いしますヽ( ･ω･)/！！


# 突然ですが質問です。
簡単に**かっこよくなりたい**。**かわいくなりたい**。**痩せたい**。**モテたい**。
そう思ったことはありますか？

ふむふむ。そうですか。

私が働いている会社ではエンジニアがcssを、デザイナーがPHPを理解しよう（相互理解を深めよう）という
好奇心旺盛な人が非常に多い気がします。
ですので、今回は是非同じようなエンジニアの方にもお遊び感覚でPhotoshopを触ってもらえればと思い
実用的な(？)画像加工方法を簡単にご紹介します！
(Photoshopの使用バージョンはCCです)

# かっこよくなりたい人、募集しました。
募集したらまさかの推薦が来ました！
↓　↓　↓
でで～ん
![0.jpg](https://qiita-image-store.s3.amazonaws.com/0/214489/651bdc4d-2fde-afb1-8206-221cd4cd401a.jpeg)

**＜パッションTさん 営業 30歳♂＞**

ちなみに、パッションTさん（以下Tさん）は弊社で1番デキる営業マンです！
つぶらな瞳が可愛いですよね。30歳とは思えない貫禄…さすがトップ！！

そんなTさんにも悩みはあるようで
**「最近外食が多くてむくみがちなんだよね…(´・ω・｀)ｼｮﾎﾞﾝ」**


「…そうみたいですね(´・ω・｀)ｼｮﾎﾞﾝ」
お察し致します。
と、いうことでモデルはTさんに決定！

## 「シュッとして、キリッとして、キラッとさせてほしいんだ。」
シュッ…( ´ー｀)ﾌｯ
はい！Tさんをいい感じに変身させてみましょう！テーマ決定。

<h3>■ 加工ポイント</h3>
- フェイスライン（2~3㎏減くらい）
- 眉毛（もう少しだけ長さを）
- 青ヒゲ(つるつるに)
- 肌のコンディション（飲み過ぎ？）
- 瞳にフレッシュ感（おつかれさまです）

<h2>1.まずはお肌のベースを整えます</h2>
はじめに元画像を複製して加工用のレイヤーを用意します。（各処理で調整しやすいように）

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/214489/c97efd76-19ca-f739-2bf2-4760811a3123.jpeg)

- 使用ツール / **コピースタンプツール**
- 用途 / **青ヒゲ、肌のコンディション調整**

まずは［コピースタンプツール］を使用して、しみやホクロなどの消したい~~汚~~点の付く（きれいな所）で
Alt キー (Windows) ／ Option キー (Mac OS) を押しながらマウスクリックで近似色をコピーします。
そして消したい所の上でポンポンとクリックします。コツはこまめに消すことくらい。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/214489/e6585d18-b216-0466-f4b1-04d156b3b6a2.jpeg)

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/214489/551e6879-52eb-6d68-6bcb-8aa46ccd6dab.jpeg)

こんな感じで簡単に消せます。
この調子で青ヒゲもニキビも肌の凹凸も消しましょう。

**で、こんな感じ。**

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/214489/62170fc9-5737-50e2-ccc3-e30ab4bb8114.jpeg)

ちゅるんとしましたね。

<h2>2.つぎにお顔をリフトアップします</h2>

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/214489/491c05da-0053-6e65-9dbb-b1e89866a7c8.jpeg)

- 使用ツール / **ゆがみツール**
- 用途 / **フェイスラインの調整**

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/214489/2c457c87-ec85-353e-0912-91835eb704f1.jpeg)

これです！この［ゆがみツール］がめちゃくちゃ面白いんです！！
勝手にTさんの顔が認証されて、画像右のバーを調整するだけで
「目」「鼻」「口」「顔の形状」などが加工できるんです！

![ゆがみ.jpg](https://qiita-image-store.s3.amazonaws.com/0/214489/cf8376c2-ee4f-fc4f-65bd-b7bc474fccaf.jpeg)


これはもう感覚です。
好きなようにイジってみて下さい。どうぞ！

# で、イジってみた結果がこちら。

![完成.jpg](https://qiita-image-store.s3.amazonaws.com/0/214489/d5e3351c-861f-e7c9-f596-d6155b19e9cc.jpeg)



どうでしょうか？いい感じ？

<h3>社内の人に見てもらった。</h3>
- 小物感がすごい
- 弱そう
- なんかウザい
- なんかヤダ
- なんか気に入らない

…あれ？…なんか辛い。。笑
いや、でもまあ今回のテーマは「シュッとして、キリッとして、キラッ」だったので
まぁ良かったんじゃないでしょうか( ´ー｀)
パッションTというよりはベビーフェイスTですね。素敵！

<h2>まとめ</h2>
と、まぁこんな感じで誰でもサクッとイメチェンできちゃいます！今回はだいぶざっくりとご紹介しましたが
なんとなく出来そうな感じがしませんか？

来週末はクリスマスだし、それまでに出会いを増やしたい…という方は
出会い系アプリのプロフィール画像用に作成してもいいですよね！CTRは高くなると思います！（CVRは分かりませんが…）
あなたにも素敵な出会いがありますように( ˘ω˘)ｽﾔｧ

<h2>明日は</h2>
なんと明日は(自称)山崎賢人にそっくりな個性派エンジニア[phigasui](https://qiita.com/phigasui)の登場です！
顔出しはあるのかな～？お楽しみに！
Vueコンポーネントのpropsについて

コンポーネントが他から使われる際に重要になってくる要素の一つにpropsがあると思います。propsは、コンポーネントを使う際に渡されるものなので、コンポーネントがいかに使いやすいかの重要な要素の一つになります。そこで使いやすいコンポーネントのためにpropsをどう記述するかまとめました。

## propsの記述
propsはなるべく詳細に書きます。
propsを詳細に書くことで、そのコンポーネントを使う時どのような値を渡せばいいのかがわかり、使いやすくなります。
また`default` や `require` を使うことで、値の渡し忘れや設定忘れを検知したり防いだりできます。

```
props: ['defaultInput']
```

ではなく、

```
    props: {
      defaultInput: {
        type: String,
        default: 'Hello!'
      }
    }
```
のようにしましょう。

## propsの型
propsの型はなるべくプリミティブな型やStringなどにします。
propsの型に独自のObjectなどを渡すと、可読性が低くなります。そのObjectはどんな値を持っているのか、何を渡せばいいのかがすぐにはわかりづらくなり、ソースコードを追うことになる場合があります。

```
    props: {
      defaultInput: {
        type: MyObject
      }
    }
```
よりも、

```
    props: {
      title: {
        type: String
      },
      description: {
        type: String
      }
    }
```
の方がわかりやすいです。  
もちろん場合によっては全てプリミティブで渡そうとすると、propsが多くなり、逆に使いづらくなることもあるので、その辺りはバランスの問題になるかと思いますが、できるだけpropsはわかりやすくするのがいいと思います。
arduinoとスマホで強力に傘を忘れなくする試み

この記事はbenridane(みやまる)のAdventカレンダーArduinoの16日目の記事です。

傘をよく忘れるので、忘れないようにしたい。
とても忘れっぽいので雨の日にLEDを光らせても何の光だったかを忘れて、傘を忘れたりする。
強引に傘を差し出してくれれば、たぶん忘れないだろうという狙い。そこには眠っていたスマホとArduinoがあった。

#そしてできたもの
雨になるとサーボモータが動作して傘をカバンの上に落とす仕組み
![videotogif_2017.10.30_21.52.18.gif](https://qiita-image-store.s3.amazonaws.com/0/104300/00f607bc-a16f-c338-b41a-62cbf4e13178.gif)
朝にドスンとという音とともにカバンに落ちる。

# 用意するもの
Android端末　(一台ぐらい余ってるでしょう)
taskerアプリ　(最初に買った有料アプリ)
arduino UNO (互換品でもいい)
cdsセンサー (なんなら１００均のを分解)
10k抵抗
サーボモーター

# 一番簡単にAndroidスマホとarduinoをつなげる方法
普通はBluetoothだろうけど、もっと簡単に接続する。
今回はコミュニケーションの手段にスマホのライト機能とarduinoのCdsセンサーを使う。
Taskerアプリで、スマホのライトを光らせて、光センサーであるCdsセンサーが検知すると、サーボモータを動かすのだ。
なんとも原始的で技術的にはLチカから脱していないが、単純明快でインターフェイスとしてもすごい汎用性があると思う。なんせ光が出ていれば、アクションを起こせるんですから。

#やってることと接続
![IMG_20171214_235119.jpg](https://qiita-image-store.s3.amazonaws.com/0/104300/7152a93f-3805-dcc3-b0f7-3e48dc1abfe5.jpeg)
(ホコリかぶりすぎ)

配線がごちゃごちゃして分かりにくいが、Cdsセンサーに抵抗をつなぎ、5VとGNDにつなぐ、抵抗の後をA0ピンにつないでモニタリングする。サーボモータは、5VとGNDにつなぎ、13ピンにて信号線とする。Cdsセンサー とAndroidのカメラのライト部分を外の光が入らないようにガムテープで接着する。

#Arduinoプログラム
```
#include <Servo.h>
Servo myservo;

int val = 0;
int iPin = A0;
int oPin = 13;

void setup() {
  Serial.begin(9600);
  pinMode(oPin, OUTPUT);
  myservo.attach(9);
  myservo.write(90);
}

void loop() {
  val = analogRead(iPin);
  Serial.println(val);
  if(val<10){
 //   digitalWrite(oPin, LOW);
  }else{
 //   digitalWrite(oPin, HIGH);
    myservo.write(180);
    delay(10000);
    myservo.write(90);
  }
  delay(2000);
}
```
ループでCdsセンサーを確認して、閾値を超えると、サーボモータを動かす。

#Tasker設定
1.朝７時にアクションを設定する。
2. HTTP GETにて天気予報を取ってくる。(livedoorAPIを利用)
 - weather.livedoor.com/forecast/webservice/json/v1?city=270000
 - Variable Search Replaceにて必要な情報に整形
 - Variable %HTTPD Search "telop":"temperature"
 - Take PhotoでフラッシュをON if %Tenki11 ~R .*96e8.* (APIがUnicodeエスケープシーケンス。96e8が雨のユニコードでそのまま使う)

# まとめ
日常生活にarduinoから光以外のアプローチできた。
おそらく一番簡単なAndroidスマホとarduinoとを繋ぐハック。
これを作ってから雨に打たれることが無くなった。(うまく動作しているか毎日天気を気にするようになった。[重要])


#余談
スマホを使うのは大げさかもしれない。ただ、スマホはWifi、Bluetooth、場合によってはSIMという強力なインターフェースにバッテリーまで持ちつつコンパクトに収まっているし、なんなら画面に表示して確認とかできる。大量に生産されているので、手に入りやすく型落ちスマホは安い。スマホを使う上で、一番ネックになるのはスマホとarduinoをどうやって情報を伝えるかだ。ソフトウェア開発者が日常生活にアプローチしようとすると、時折とんでもないことになる。スマホのBluetoothとarduionoのBluetoothモジュールを繋いで、、待てよ、Bluetoothモジュール買わないと。。Bluetoothとarduionoはどうやって通信する？　arduinoにBluetoothをつなぐプログラムをかいて。。Android側はアプリ開発からはじめるのか。。仕様を調べよう。。ﾔｯｸｼｪｰﾋﾞﾝｸﾞ。どんどん物理的なコストと期待していない仕様が増えてくる。時には愚直な選択も必要かと思いました。
Windows-TortoiseGit サーバー移管に伴いリポジトリを変更してみました

git用のサーバー移管を行い登録済みの環境変更が必要になったので手順を覚え書き

`.git/config ファイル内の [remote "origin"] 部分の url を新環境用の情報に変更`

上記作業を行うだけで無事通信が行えました
monacoind 不要の  faucet を作ってみた (骨格だけ)

# はじめに

Monacoin に限らず、Bitcoin 由来の暗号通貨(いわゆるオルトコイン)のサービス開発入門者が陥ってしまう罠に __「フルノード [^fullnode] を立ち上げようとする」__ があります。

[^fullnode]:  Monacoin なら monacoind のこと

これをやってしまうと、外部公開する際に VPS や VMインスタンスを調達する必要が生じ、保守コストが跳ね上がります。お勧めできません。

お勧めは Heroku や Azure Web のような PaaS を使うことなのですが、なぜか必要な情報を見かけないので、具体的なコードでコツを説明していきます。

筆者の個人的趣味で Node で例示しますが、Python [^monaparty] や Ruby などでも同じ方針で実装可能です。

[^monaparty]: Counterparty は Python で記述されており、その Monacoin 版である Monaparty は Python 上で本稿と似た移植戦略を取っています。

# monacoind の代わりに何を使うのか

インターネットに公開されているブロックチェーンエクスプローラやウォレットのバックエンドを使います。
Monacoin の場合は Insight や Multi Block Explorer など複数のエクスプローラが存在しています。
ウォレット・バックエンドなら後述する ElectrumX が強力です。

これらの後ろには結局フルノードが存在するのですが、より抽象化された API によりフルノードを隠蔽してくれます。

この戦略を使う場合、UTXO の収集やトランザクションの生成や署名は、サービス内で行う必要があります[^secure]。そのあたりのソースコード量が増えるのが欠点とはいえますが、運用コストからすれば微々たるものです。

[^secure]: 暗号鍵をエクスプローラやウォレットのバックエンド置くわけにはいきませんから

# ソースコード例

「ソースコードを見たほうが早いんじゃ」という方はこちらを御覧ください。
これに Web なり Chatbot へのインタフェースを付け、やたらとアクセスしてくる、いわゆる「乞食」を弾く処理を加えれば faucet の完成です[^work]。もちろん送付先を `MA375uccLzk4w5MmsGuex24iHs11tYtdsL` から変更しないといけません。(変更しないと筆者が儲かります)

[^work]: …など軽く書きましたが、乞食対策が実は一番難しいところだったりします。

https://github.com/monaco-ex/sample-sending-monacoin/blob/master/app.js

「ソースコードだけじゃわからんぞ」という方に向けていくつかコツを記します。

## coininfo は神

魔改造が施されすぎたいくつかの例外はあるものの、Bitcoin 由来のオルトコインは Bitcoin のライブラリをそのまま流用できます。その際に必要な作業として core の `chainparams.h` に記述されているようなパラメータの追加が必要になります。
npm パッケージ coininfo はこの辺りの記述を容易にしてくれます。

```
const network = coininfo('MONA').toBitcoinJS();
network.messagePrefix = ''; //hack
```


事前に上記のようにしておき、WIF (Wallet Import Format) 形式の秘密鍵から鍵ペアを作成する際や

```
const keyPair = bitcoin.ECPair.fromWIF(wif, network);
```

未署名トランザクションを生成する際に

```
let txb = new bitcoin.TransactionBuilder(network);
```

など指定します[^replace]。

[^replace]: 実は network を指定せずに済むようにする技もあるのですが、Monacoin の場合 Testnet v4 で罠があるので本稿ではお勧めしません。

あとの処理フローは Bitcoin の豊富な情報をそのまま使えます。

## Electrum-client も神

```
const ElectrumClient = require('electrum-client');
const cli = new ElectrumClient(50001, 'electrumx.tamami-foundation.org', 'tcp');
```

これだけで electrum サーバとお話できるようになります。
Monacoin は有志による ElectrumX サーバ群が充実しており、Android ウォレット Coinomi もバックエンドは ElectrumX であることから、安定した運用を期待できます。
もしそれらが全滅したら(たぶん無いと思いますが)、自前で立てるしか無いですが、[Kubernetes 環境へデプロイするためのスクリプトが公開されており](https://github.com/monaco-ex/electrumx-kubernetes)、最近のクラウド環境を使えば保守の手間はかなり減らせます。

# まとめ

フルノードを立てるので疲弊するのはもうやめよう。作りたいのはWebサービスだったはず。サービスに集中！


# お詫び

JPYマイニングに追い立てられていて、アドベントカレンダ遅刻しました (平伏)
Pythonのlen()のオーバーヘッドについて

# Pythonをちょっとでも速く

## len()をたくさん呼ぶとどうなるか

ためしに10^8回`len()`を呼び出してみました

```python3
import time

N = 10**8
foo = []

begin = time.monotonic()
for _ in range(N):
    x = len(foo)
end = time.monotonic()
print('len in the loop: {}'.format(end - begin))

begin = time.monotonic()
length = len(foo)
for _ in range(N):
    x = length
end = time.monotonic()
print('len outside the loop: {}'.format(end - begin))

```

## 結果
```
len in the loop: 9.045869614987168
len outside the loop: 4.380809306981973
```
すごくたくさん呼ぶときは`len()`はループの外に出してあげたほうが速そうです。
RubyのGemパッケージ管理

#Gemとは
Rubyで使われるアプリケーションやライブラリをパッケージにしたもの。
[この記事で](https://qiita.com/rinren/items/10cf3b61ebd54fa11d5c)Railsを入れた時のコマンドが

>gem install rails

だったのはそーゆうことだったんだね。

#Bundlerとは
Railsアプリケーションに必要となるGemパッケージの種類やバージョンを管理しインストールしてくれる物。Rails3系からこの仕組みが導入されているらしい。
この仕組みがありがたいのは、別PCでRailsアプリケーションを作成するとき、必要なGemパッケージを自動的にインストールしてくれるところにある。(まぁ私には関係ないかも。)
Gemのインストールが行われると、Gemの名前とバージョンが書かれた**Gemfile.lock**が自動生成されるので、**プログラムファイルと一緒に違う環境に送ってあげる**と、送った先でbundle installを実行すると、このGemfile.lockに基づいて同じGemを入れてくれるってわけだ。
ルールベースのチャットボット

挨拶を返してくれるチャットボットを作ります。
![ダウンロード.gif](https://qiita-image-store.s3.amazonaws.com/0/192887/572e30d0-ae2f-49ac-0dce-ee4379f5f23c.gif)



#会話の流れ　ー挨拶を返す

>
人間「おはよう」
bot「おはようございます！」

ここまで！

</br>
</br>
</br>


【Intent】から【挨拶】の会話を開きます。
【User says】には人が入力する言葉
【Response】にはbotが返す言葉

が入るので、以下を入力して、右上の【SAVE】を押してください。
>
【User says】　おはよう
【Text Response】　おはようございます！(1行目のこんにちはを書き換える)


<img width="1680" alt="スクリーンショット 2017-12-15 10.17.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/28e598ef-766a-7362-2fda-83327b5d3fe3.png">

【SAVE】を押してください。
右下に
<img width="314" alt="スクリーンショット 2017-12-15 10.27.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/6fbc206f-7918-6b25-5f19-b1759f80ea6e.png">がでたらOKです！
（時間がかかるので注意！）

セーブできたら、右枠の【Try it now】で確認してみましょう。
以下入力。
>
おはよう

入力してreturnキーを押してください。
<img width="359" alt="スクリーンショット 2017-12-15 10.44.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/69d68c99-c5ab-004a-bf7b-275f295e4c83.png">
おはようございます！とレスポンスがあれば成功です。

</br>
</br>
</br>
</br>
</br>


#同義語定義

どんな人が入力しても「挨拶は挨拶だ」とbotがわかるようにしましょう。
より人間ぽくなります。


左メニューの【Entities】から【hello】を開きます。

<img width="1004" alt="スクリーンショット 2017-12-15 10.54.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/81a1cf03-d0e8-5d36-780c-a892cfb9a755.png">

外国人がきてもわかるように、英語バージョンもいれてみましょう。
以下を入力します。
>
【Enter reference value】 Hello
【Enter synonym】　Hello　　ハロー 　へろー
<img width="970" alt="スクリーンショット 2017-12-15 11.02.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/2ece4900-e48d-c2a2-63ea-d9c7d3c23592.png">

【SAVE】します。
これで「ハロー」も挨拶だとわかってくれたようなので、【Try it now】で確認してみましょう。

<img width="1375" alt="スクリーンショット 2017-12-15 11.07.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/9bee6699-df62-6bb6-263b-7597fcf52a90.png">
うまく「Hello」だと認識しているようです！
ですが、レスポンスがおはようのままなので、次の項目で調整します。


</br>
</br>
</br>
</br>
</br>

#返事のバリエーションを増やす

人間の会話に応じて、ボットも会話を変えてくれたら嬉しいですね。

【Intent】→【挨拶】で先ほどの会話を作る画面に戻ります。
【Response】が「おはようございます！」のままだったので、以下のように調整しましょう。
>【Text response】
1　$hello!

<img width="985" alt="スクリーンショット 2017-12-15 11.22.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/15b19997-267d-f3cd-b4e1-7621b7be174f.png">


この$は、すぐ上にある【Action】の中にあるVALUEと同じです。
先ほど定義した【Entities/hello】とも同じです。

よくわからなくても大丈夫なので、**【SAVE】**をして【Try it now】で「ハロー」や「こんにちは」「こんばんは」と試してみましょう。

<img width="364" alt="スクリーンショット 2017-12-15 11.36.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/36b1810d-1085-6500-9fbc-a1d0e9f51ea1.png">

入力に応じて変わっていれば大成功！
時間があれば、スペイン語の「Hola(オラ)」も認識させてみましょう。
</br>
</br>
</br>
</br>
</br>


#まとめ
【Intent】では会話の構造や、流れが、細かく設定できます。
　ex.人間「おはよう」→bot「おはようございます！」　の設定
【Entitis】では、言い回しや表記揺れなど、違う言葉だけど同じ意味の単語を設定できます。
　ex.おはよう(と同じ意味)：おはようございます、オハヨ、おっはー、おはよー　の設定

基本的に、【Intent】のUser saysがたくさん入っていると、認識の精度が上がります。


#Next
[前のページ](https://qiita.com/ume1126/items/da518b8351af9b1c5d86)に戻って、
会話のフローから FAQbotやラーメン注文botを作ってみましょう。
jupyter インストールメモ

## 2025.1.11 改定開始
# Jupyter notebook をインストールする時の自分向けのメモです。他人が読んでも、役立つかもしれませんぐらいには書いたつもりです。

### 対象OS

Windows 11(WSLではないです。）

### 準備 [python をまずインストール]

- 面倒なので一度、すべてのversion をアンイストール
- 最新版をインストール　（どこからなどは、ググる）
### 準備 [jupyterlab をインストール]
- pip install jupyterlab
- http://localhost:8900/lab　で動作確認

------------------------------------------------------------

**jupyter インストール**
`conda install jupyter`

**notebook 設定ファイルをつくる**
`jupyter notebook --generate-config`
$HOME/.jupyter/jupyter_notebook_config.py に作成されます。

**設定する（自分で使うので、セキュリティ甘く）**

パスワード平文で、xxx
`c.NotebookApp.token = 'xxx' `
ブラウザーはひらかない設定にする。
` c.NotebookApp.open_browser = False`
パスは、ホームディレクトリ直下の note にする。
フルパスの指定にしないといけないようです。$HOME 部分は適宜変更おねがいします。
`c.NotebookApp.notebook_dir = '$HOME/note'`

どっからでもアクセスできるようにする。気になるなら、制限してください。
` c.NotebookApp.ip = '*'`

### 起動する(ブラウザー起動しないオプションつけます。)
`jupyter notebook -no-browser`

ブラウザを開かない設定にしているのですが、開こうとするみたいです。
http://localhost:8888 にアクセスして、パスワード xxx をいれます。
CTRL+C で、停止します。

### 追加の設定
**拡張(nbextension)を入れる**
`conda install -c conda-forge jupyter_contrib_nbextensions`
これで拡張メニューが使えます。

**拡張のうちHide input を設定**
これで、セルごと隠すことが可能になります。長いスクリプトがある場合に、隠せて便利です。
`http://localhost:8888/tree#nbextensions_configurator`
他にも便利なのがいっぱいあると思うので適宜いれてください。

**自分用のメモ（皆さんは、いれなくてよいです。必要ならいれてください。）必要な python 用module　をいれる(conda,pipどちらを使ってもよし)**
mysql を使うための pymysql 
`conda install pymysql`
ssh tunnel　用の sshtunnel 
`pip install sshtunnel`

**Fabric3 いれる**
https://github.com/mathiasertl/fabric/
sshポートフォーワーディングでjdbcによるDB接続

# 背景

DIHを利用したインデックス更新の際に、踏み台サーバ経由でしか接続出来ないDBサーバから
JDBC接続をどうやればよいか調査したので、その備忘録です。

# 構成

最終的な接続構成は下記の通りです。
JDBC側で特別な設定はなく、sshのポートフォワーディングを利用します。

![screenshot 2017-12-15 11.25.38.png](https://qiita-image-store.s3.amazonaws.com/0/65095/cf9ff25c-0885-2d60-41b7-e4f028f35c6f.png)

# ポートフォワーディング

ssh -f -N -L 6666:[DBサーバホスト名]:3306 [sshアカウント]@[踏み台サーバホスト名]

* オプション
  * -L ： ポートフォワード(ローカルポート:ホスト:ホスト側ポート)
  * -f ： バックグランドで実行
  * -N ： SSHトンネリングのみに使用

# JDBCの設定

url="jdbc:mysql://127.0.0.1:6666/[接続先DB名]"

# 参考

下記の記事を参考にさせていただきました。
[SSHのポートフォワーディングでMySQLに接続する方法](https://www.tamurasouko.com/?p=1092)
[sshポートフォワーディング](https://qiita.com/mechamogera/items/b1bb9130273deb9426f5)
Vimのレジスタを使う

Vimのレジスタを5秒後に使えるように最小限だけ書く。

# レジスタへ登録

ノーマルモード(ESCを連打して戻ったモード)で操作する。

```:vim
aaa
bbb <-- ここの行にカーソルを置いて "ayy を実行する。
ccc
ddd
```

|文字|意味|備考|
|----|----|----|
|"|レジスタ操作始めるよ|:w(保存)のコロンは「コマンド始めるよ」|
|a|aという名前を使うよ。|名前はa~zまで使える|
|yy|ヤンク(yy=行コピー)だから登録するよ。|2yy(2行コピー)等でもOK|

これで レジスタa に bbb を登録。

# レジスタ内容をペースト(ノーマルモード版)

```:vim
aaa
bbb
ccc <-- ここの行にカーソルを置いて "ap と入力する。
ddd
```

↓↓↓

```:vim
aaa
bbb
ccc
bbb <-- 行コピー内容がペーストされる。
ddd
```

|文字|意味|備考|
|----|----|----|
|"|レジスタ操作始めるよ|:w(保存)のコロンは「コマンド始めるよ」|
|a|aという名前を使うよ。|名前はa~zまで使える|
|p|ペーストだから登録内容を呼び出すよ。|PでもOK(挿入位置が変わる)|


# レジスタ内容をペースト(インサートモード版)

文字入力するインサートモードでレジスタ内容を使うときは `ctrlキー + r` で
![vim.png](https://qiita-image-store.s3.amazonaws.com/0/11203/04c6fb9c-8560-d261-846a-ed9c1c753b30.png)
レジスタの印(”)が出てくるので、あとはレジスタ名（aとか）を入力するとペーストできます。
macにaws cliを入れて簡単な動作確認まで (今さら..)

# インストール
    $ brew install awscli

# 初期設定/認証設定 (例)
    $ aws configure --profile hoge1
    AWS Access Key ID [None]: xxx
    AWS Secret Access Key [None]: xxx
    Default region name [None]: ap-northeast-1
    Default output format [None]: json
※~/.aws 配下に config と credentials ファイルができる
※複数アカウントを設定して切り替えて使う予定なので --profile オプションを使用した。

# 動作確認
    $ export AWS_PROFILE=hoge1
    $ aws ec2 describe-regions
    →リージョン一覧がJSONで表示されれば初期設定/認証設定はok

# サンプル (sample.sh)
    #!/bin/bash

    ### AWS
    AWS_PROFILE=hoge1
    #AWS_PROFILE=hoge1-ro

    ### main
    export AWS_PROFILE

    aws ec2 describe-regions
Blockchain EXE #7 の超概要レビュー

どうも、Blockchain初学者です。
先日、Blockchainコミュニティ「Blockchain EXE」のイベント、「Blockchain EXE #7 2017年総括！ 世界のブロックチェーン最新動向と今後の展望」に参加しましたので、イベントで聞いたことのメモを残しておこうと思います。
ほとんど自分のためのメモです。キーワードの羅列みたいな感じになるかもしれませんが、ここでのキーワードを参考に、今後詳しい記事を書いていきたいと思います。
なお、以下の記事（メモ）はイベント内容の抜粋です。全ての登壇者の発表について書いているわけではありません。全体を知りたい方は後日アップされるスライドなどをご覧ください。（アップされたらリンクを貼ります）

## プライベートブロックチェーンの特徴と今後の進化（鍛 哲史氏｜ソラミツ）

スライドは[こちら](https://www.slideshare.net/blockchainexe/private-blockchain)

### アイスブレイク
[Bitcoinは雑所得！](https://www.nta.go.jp/taxanswer/shotoku/1524.htm)

### Hyperledger Framework
Hyperledger Frameworkの紹介。（ステータスは2017/12/13時点のもの）

- Hyperledger Sawtooth　（Status：Active）
- Hyperledger Iroha　（Status：Active）
    - シンプルで高速
    - モバイル対応
- Hyperledger Fabric　（Status：Active）
    - IBM主体
    - エンタープライズ観点で設計
    - 400件以上の活用(検証)事例あり
- Hyperledger Burrow （Status：Incubation）
- Hyperledger Indy （Status：Incubation）

### Blockchainのユースケース
- 中央銀行による仮想通貨・決済インフラの開発
- 国家システムのブロックチェーン活用（エストニア、スウェーデン）
- 本人確認サービス（KYC:Know Your Customer）※今ホット

### Private Blockchainの最近の動向
- 技術はまだまだ発展途上
- ユースケースが不明瞭
- KYCが流行り
- BFTは不要か？
- ビジネスと技術の乖離が激しい

### Private Blockchainの未来　つながるブロックチェーン
- Interledger
    - Rippleが考案
    - 2004年から開始された分散型決済プロトコル
    - ledgerとledgerを繋げる。
- Polkadot
    - Web3のプロジェクト
    - Parachainsによるスケーラビリティ問題の解消
    - Relay chain
- Cosmos
    - Interchain Foundationのプロジェクト

#### 複数のブロックチェーンをつなげることのメリットとデメリット
- メリット
    - あらゆるブロックチェーンの水平統合
    - 取引所などの中間業者の排除
- デメリット
    - 遅くなりそう

### 最近進んでいる事例やホットな事例
- P2P保険
- IoTとの連携


## 特別レポート：実際に訪れて感じた世界情勢（石井 敦氏｜クーガー）
### New York
Keyword：パーミッションレス型、パーミッション型、エンタープライズ

パブリックチェーンとプライベートチェーンは将来共存可能か？ → 91%がYES

- TOKEN SUMMIT 2017
    - ブロックチェーンによるP2P Video配信
    - ブロックチェーンを活用した非中央集権型保険
    - IoTとの連携
- EEA Meetup（Enterprise Ethereum Alliance）
    - uPort（非中央集権でのユーザーID認証・共有）
    - GRID＋（P2P電力売買、供給側と需要側で自動売買）

### Frankfurt
Keyword：IoT、ハードウェア

- IoT/Ethereum Summer Camp
    - テーマ
        - Mobility、Digital Science、Energy、Logistics/SCM、Other
    - アイデア
        - Farm、Park、Drone（自動で充電しながら目的地に向かうドローン）、etc...

### San Francisco
Keyword：AI、ロボティクス

- ethereal
    - SingularityNET（非中央集権型、AIのオープンマーケット）
- Blockchain Expo
    - XAIN（ブロックチェーンをベースとした拡張可能なAIネットワーク）

## ディスカッションや懇親会でのメモ
- ブロックチェーンは非中央集権型であるべき！（サーバがない純粋なP2P）
- 2018年から2019年にかけてブロックチェーンを活用したアプリケーションが本格的に動きだすのでは？
- ブロックチェーンにする必要がないサービスでもブロックチェーンを活用しておかないと今後対応できないのではないか
- 改ざん不能重視、スピード重視などのニーズによって、利用するブロックチェーンは分かれていくだろう
- ブロックチェーンは地方創生に活用できる！
vccw site.xmlで変更できること

vccwでWordPress環境を作成する際、デフォルトの設定からsite.ymlにて設定を変更することができます
# site.ymlの作成方法

vccwを展開したところにprovisionディレクトリがあるので、その中のdefault.ymlをコピー
一つ上のディレクトリに移動させ、site.ymlにリネームするのが分かりやすい。
よく使うであろう項目はここに含まれているので、パラメータを変更するだけで使える。
もちろん、変更する項目だけを記載したsite.ymlを１から作成する方法でもよい。
未指定の項目はdefault.ymlの項目が使用される。

#site.ymlで変更できる項目

## 基本編
### 日本語で使いたい
普通にインストールされると管理画面なども英語になるため、
日本語として使いたいなら下記の設定を変更する

```
lang: ja
```

###ドメインを変更したい

```
hostname: vccw.test
```
ただし、事前にvagrant-hostsupdaterをインストールしていないと自前でhostsファイルを編集する必要があるので要注意

### 複数台並行して起動したい or IPアドレスを変更したい
同時に２台vccwで作成した環境を動かそうとすると、IPアドレスが重複して動かなくなるため、
環境ごとにIPアドレスを変更する必要がある

``` 
ip: 192.168.33.3
```

## バージョン指定編

###PHPのバージョンを指定したい

~~デフォルトでは最新版がインストールされるらしくPHP7になるが、~~
~~まだPHP5系の環境も多いため、PHPのバージョンを指定したい場合。~~
~~なお、default.ymlにはこの項目の記載がなく、指定がない場合は最新版が使われる模様~~
vccw3系だとPHP7系が、vccw2系だとPHP5系が使用できるようです。
環境に合わせて使用するvccwを変更する必要があります。

```
php_version: 5.6.9
```

###WordPressのバージョンを指定したい

WordPressのバージョンも通常最新版になるため、
バージョンを指定を行う場合は下記を変更する

```
version: 4.1
```
## 応用編
### インストールされるディレクトリを１階層下げたい

vccw.testのドメインでvccwをインストールした際、WordPressはvccw.testにインストールされる
これをvccw.test/wordpress/にインストールしたい場合、下記のように変更する

```
wp_siteurl: 'wordpress'  # Path to the WP_SITEURL like "wp"
wp_home: 'wordpress'     # Path to the WP_HOME like "wp"
```

その他、何かあれば追記していきます