OmniAICreator/Qiita-1.07M huggingface dataset:
CWL User Guide 4: Returning Output Files をやってみた

# CWL User Guide 4: Returning Output Files

[Common Workflow Language User Guide: Returning Output Files](http://www.commonwl.org/user_guide/04-output/)

出力ファイルについて書かれています
具体的なこととしては、
`tar`コマンドを使って`hello.tar` から `hello.txt` を取り出します。
この`hello.txt`が出力ファイルにあたります。

# この回にでてくる主なキーワード

* outputs
* id
* type
* outputBinding
* glob


# CWLファイル、tar.cwl

```tar.cwl
#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: CommandLineTool
baseCommand: [tar, xf]
inputs:
  tarfile:
    type: File
    inputBinding:
      position: 1
outputs:
  example_out:
    type: File
    outputBinding:
      glob: hello.txt
```

# パラメータファイル、tar-job.yml

```
tarfile:
  class: File
  path: hello.tar
```

# 必要なファイル、hello.txt, hello.tar

空のファイル(`hello.txt`)と、それをtarでまとめたファイル(`hello.tar`)が必要です。

このコマンドで生成していました

```
touch hello.txt && tar -cvf hello.tar hello.txt
```

# 実行

## 実行方法

```
cwltool tar.cwl tar-job.yml
```

## 実行結果

```
 cwltool tar.cwl tar-job.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved 'tar.cwl' to 'file:///home/vagrant/cwl_user_guide_work/04-output/tar.cwl'
[job tar.cwl] /tmp/tmpwqAqkk$ tar \
    xf \
    /tmp/tmpirn_6n/stg38b98960-f441-49fd-8138-2ab607ac51e7/hello.tar
[job tar.cwl] completed success
{
    "example_out": {
        "checksum": "sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709",
        "basename": "hello.txt",
        "location": "file:///home/vagrant/cwl_user_guide_work/04-output/hello.txt",
        "path": "/home/vagrant/cwl_user_guide_work/04-output/hello.txt",
        "class": "File",
        "size": 0
    }
}
Final process status is success
```

### ちょっと試してみたい

一番最後に `glob` についての説明があります。
前もってファイル名がわからないときはワイルドカードがつかえるとあるので試してみるとよいです。

```
glob: '*.txt'
```

また、間違えたファイルを書くとどうなるかを試してみるのも良いでしょう

```
glob: 'nosuchafile.txt'
```

# 今回使ったファイル

以下の場所においておきました。

* [cwl\_user\_guide\_work/04\-output at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/04-output)
PCでAndroidスマホを操作する方法

![mirror.jpg](https://qiita-image-store.s3.amazonaws.com/0/217403/65c6cca8-062b-e7db-16a5-8d41e9177b30.jpeg)
スマホのスクリーンサイズがますます大きくなりますが、PCに比べてまだまだ小さいです。スマホの画面をPCの大画面に出力したいでしょうか？PCからAndroidスマホのゲームをやりたいでしょうか？本記事には、実現方法をご紹介します。
#PCでAndroidスマホを操作する
『ApowerMirror』というソフトを使って、AndroidとiPhoneの画面をPCに出力し録画できる上、PCからAndroidスマホを操作することができます。

では、以下にその使い方をご紹介します。
## 『ApowerMirror』のインストール
『ApowerMirror』の公式ページ：https://www.apowersoft.jp/phone-mirror

１．この公式ページにアクセスし、「ダウンロード」ボタンをクリックして、そのインストーラーをダウンロードします。
２．その後、インストーラーを実行し、インストールウィザードに従ってインストールを実行します。
３．インストール完了後、ソフトのアイコンをクリックして、ソフトを立ち上げます。
![whiteboard.jpg](https://qiita-image-store.s3.amazonaws.com/0/217403/034c811e-6ca0-c5b9-2af1-7db60426fb96.jpeg)

## スマホと『ApowerMirror』との接続
１．USBケーブルを使って、スマホをPCに接続します。
２．少々待った後、『ApowerMirror』アプリはスマホに自動的にインストールされます。
３．スマホ画面に下図のようなメッセージが表示されたら、「今すぐ開始」をタップします。すると、Androidスマホの画面がPCにミラーリングされます。
![apowermirror-notification.jpg](https://qiita-image-store.s3.amazonaws.com/0/217403/027a525d-da79-2ba2-dfd6-08529aac5215.jpeg)

## PCからスマホを操作する
これで、PCのマウスやキーボードでスマホを操作できるようになります。
『ApowerMirror』では、同時に3台のスマホをPCにミラーリングし、PCから操作できます。
![mirror-multiple-devices.jpg](https://qiita-image-store.s3.amazonaws.com/0/217403/9b868006-ff3b-9174-39ba-a3131ded3eb8.jpeg)
GPGを使ってcommitの署名をする


GPGのバージョン違いでググった通りにいかなかったのでメモ。
ほとんど参考サイトと同じです。

# 環境
- Version 2.2.3

```bash
$ gpg --version
gpg (GnuPG) 2.2.3
libgcrypt 1.8.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /Users/hoge/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
```

# 作成方法
## 暗号鍵を作成
多くの記事で`gpg --gen-key`とありますが、それだとRSAの4096bitに設定できず、いきなりはまりました。

```bash
$ gpg --full-generate-key
```

鍵の確認
`XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`がIDにあたるところです。

```bash
$ gpg --list-keys
/Users/hoge/.gnupg/pubring.kbx
-------------------------------------
pub   rsa4096 2017-11-28 [SC]
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uid           [ultimate] Your Name <example@example.com>
ssb   rsa4096 2017-11-28 [E]
```

# GitHubにGPG公開鍵を登録する
```bash
$ gpg --armor --export [ID]
```

出てきたものをGitHubに登録します。
https://github.com/settings/keys

# 署名付きコミットをできるようにする
```bash
$ git config --global user.signingkey [ID]
```

コミットするときに `-S` をつけなくてもよくする

```bash
$ git config --global commit.gpgsign true
```



# 参考
- https://qiita.com/pontago/items/5867b6492e09c34084fe
- https://qiita.com/prince_0203/items/ef0e12f2f6d150ff0485
CWL User Guide 3: Essential Input Parameters をやってみた

# CWL User Guide 3: Essential Input Parameters

[Common Workflow Language User Guide: Essential Input Parameters](http://www.commonwl.org/user_guide/03-input/)

今回は、入力パラメータの取扱について書いてあります

以下のようなことが解説されています。

* inputs
* id
* type
* class
* File
* path
* inputBinding
* prefix
* separate
 * prefixと値を結びつけるときに、空白をいれるかどうかのフラグ
* baseCommand
* /tmp ディレクトリはどうしてできるのか？

用語の数は結構ありますが、１つ１つ短い解説なのとサンプルがあるのでよいとおもいます

## CWLファイル、inp.cwl

```
#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: CommandLineTool
baseCommand: echo
inputs:
  example_flag:
    type: boolean
    inputBinding:
      position: 1
      prefix: -f
  example_string:
    type: string
    inputBinding:
      position: 3
      prefix: --example-string
  example_int:
    type: int
    inputBinding:
      position: 2
      prefix: -i
      separate: false
  example_file:
    type: File?
    inputBinding:
      prefix: --file=
      separate: false
      position: 4

outputs: []
```

## パラメータファイル、inp-job.yml

```inp-job.yml
example_flag: true
example_string: hello
example_int: 42
example_file:
  class: File
  path: whale.txt
```

## 実行に必要なファイル whale.txt

空のファイルを

```
touch whale.txt
```

で、作ると買いてありました

## 実行



### 実行方法

```
cwltool inp.cwl inp-job.yml
```

### 出力

```
$ cwltool inp.cwl inp-job.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved 'inp.cwl' to 'file:///home/vagrant/cwl_user_guide_work/03-input/inp.cwl'
[job inp.cwl] /tmp/tmpY9KcLB$ echo \
    -f \
    -i42 \
    --example-string \
    hello \
    --file=/tmp/tmpS_fjZW/stg5cd096d0-2e2f-4011-badb-89a51c92a9ed/whale.txt
-f -i42 --example-string hello --file=/tmp/tmpS_fjZW/stg5cd096d0-2e2f-4011-badb-89a51c92a9ed/whale.txt
[job inp.cwl] completed success
{}
Final process status is success
```

# 使ったファイル

[cwl\_user\_guide\_work/03\-input at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/03-input)
Windows でアルファ付き動画の覚え書き


# 前提知識
## コンテナとコーデック
http://aviutl.info/dougakeisiki-konntena/
## WebM をWindows で再生するにはインストールが必要
https://forest.watch.impress.co.jp/library/software/webmie/

# 解釈
× H.264 はアルファを持つことができない
○ MP4  はアルファを持つことができない

× VP8 はアルファを持つことができる。
○ WebM はアルファを持つことができる。

で合っていると思いたい。
H.264 も VP8 もデコードすると YUV カラーフォーマットのはず・・

# つまるところ
WebM をメディアプレイヤーで再生できれば、
DirectShow なんかで再生できると思いたい。未検証
マルチバイト文字をpreg_replaceで置換すると増殖することがある

こんにちはみなさん

へんてこな挙動に見舞われてキョドったので、その記念に記事書いちゃいます。

# 何が起こったのか
文書の校正を自動でやるツールをPHP作っている最中、表記ゆれのようなものがあったら、正しいものに書き換える、みたいなものを作っていました。
そのとき、正規表現を置換するのですが、次のような状態になりました。

```
$ php -a
php > $state = 'あああ';
php > echo preg_replace('/[あ]/', 'o', $state);
ooooooooo
```
おかしいな、３文字しか置換していないので、９文字に増えてしまったぞ???
ちなみに、

```
php > $state = 'あああ';
php > echo preg_replace('/あ/', 'o', $state);
ooo
php > $state = 'あああ';
php > echo preg_replace('/(あ|い)/', 'o', $state);
ooo
php > $state = '111';
php > echo preg_replace('/[1]/', 'o', $state);
ooo
```
となっていて、UTF-8のマルチバイト文字を文字セットで置換したときのみ、このような事象が発生する模様です。
また、この置換の際に文字化けも発生しているようで、判定外の文字が化けたりしました。

```
php > $state = 'あいうえお';
php > echo preg_replace('/[あう]/', 'え', $state);
えええええ�えええええ�ええ�
```
もうなにがなんだか。

# どうすればいいのか
超単純な話をすれば、問題はマルチバイト文字をちゃんと扱えていないから、だと思われるので、uフラグをつければいいだけですね。

```
php > $state = 'あいうえお';
php > echo preg_replace('/[あう]/u', 'え', $state);
えいええお
```
それはいいのですが、なんで普通の置換 `preg_replace('/あ/', 'o', $state);`は普通に動くのに、文字セットを使った場合にバグるのか。。。
というわけで、日本語を使いそうな場合はuフラグを付けたほうがいいみたいな話...になるのでしょうかね？

多分、文字コードの問題なんだろうなぁと思いつつ、そこまで詳しく確かめる気にもならないので、今回はこのへんで失礼します。
FOVE導入


## セットアップ

https://www.getfove.com/setup/

> 参考
[視線追跡機能付きVRヘッドセット「FOVE 0」実機レビュー](http://japanese.engadget.com/2017/02/06/vr-fove-0/)
[FOVE届いたので弄ってみた](https://qiita.com/tarosuke@github/items/b403e53bd80573572680)


## キャリブレーションのエラー

[FOVEのキャリブレーションが動かない](https://qiita.com/mo4_9/items/d9078ffb6a1d0739cc2d)


## Unityで使用する際の設定

### 垂直同期をオフ

[Edit] -> [Project Settings] -> [Quality] で`Other > V Sync Count`を`Don't Sync`に変更する

### FoveRigを配置

https://www.getfove.com/developers/
こちらから`UNITY PLUGIN`を取得、
Prefabsにある`Fove Rig`をHierarchyに置く。

これで再生すると二眼になる。

> 参考
[視線追跡型VRゴーグル 「FOVE0」を試してみたお話 [サンプルプロジェクト調査編]](http://techblog.forgevision.com/entry/2017/05/10/154947)

## アイトラッキングについて

- メガネのまま使えない。
- コンタクトをしたままだと精度が落ちる。
- 展示する際にいちいち体験者の眼球の動きをキャリブレーションするわけにはいかない。
- そもそも精度がいまいちなので大雑把な当たり判定にしないとストレス溜まる。
- 開発するにあたって容易に検索できる情報がほとんどない。
- [バーチャルゲート](http://www.virtual-gate.com/)でもFOVEは利用されているが、アイトラッキングは使用されていない。


現状アイトラッキングは使わない方がいろいろと安全・安心。VRのインプット手段としてのアイトラッキングが魅力的なのは変わらないけれど、今ある他のHMDを差し置いてFOVEを使う必要性はないと言える。


## 目を閉じているかどうかの状態取得

[CheckEyesClosed()](http://docs.getfove.com/unityapi/classUnityEngine_1_1FoveInterface.html#a2120ecfd677bf986bfaea0f9c87c2917)で取得できる

[[VR] Foveで取得できるEyeClosedをInputとして使用してみた](https://atsushishi.xyz/2017/12/fove_inputeyeclosed/)
こちらを参考にするとよい
ほんとうにあったサマータイムについて

メリークリスマス。
トラブルの事例は多い方がいいということもあり、「社内の問い合わせでこんなことがあった！」という現象を共有させていただければと思います。

# 問い合わせの内容
弊社のシステムでは、人物についてのマスターデータを登録いただくと、会計システムや税務システムのデータを作る際に必要な情報は再入力をしないで連動が自動的に行われるようになっています。
あるとき、「マスターに登録されているデータと税務データに連動されたデータに1日ずれが発生してしまう」というお問い合わせがありました。
「ただ連動しているだけなのにずれるって事は無いよなぁ」とおもって調査をしたところ、特定の年月でだけ現象が出ているということが判明し・・・、このあたりから「あれ？」となっていきます。

# 発生した日は？
お問い合わせがあったマスターの登録日は
昭和26年5月11日でした。
そのデータのみ、連動を実施すると昭和26年5月10日になってしまいます。
しかし、昭和26年12月1日のデータを作成すると、そのまま正しく連動されます。
この日にはいったい何があったのだろうか？と調べてみたところ・・・

# 日本にもあったサマータイム
原因はサマータイムにありました。

サマータイム（夏時間）とは、特定の期間中は時計の時間を1時間ずらすして、それを基準に生活をすることです。
例えば、朝9時に出勤して18時に帰っているひとは、実際は朝10時に出勤して19時に帰ることになります。
で、サマータイムが終わったら時計の針を1時間戻します。

明るい時間を有効に活用しようって政策のようですが、これが問題でした。

## 時刻の変換
Javaで日付の情報を扱う際に、弊社のシステムでは年月日＋時刻で取得していました。
問題の昭和26年5月11日で登録されているデータベースからは西暦変換して、
1951-5-11 00:00（日本時間）
と時刻付きのデータが生成されます。

これをJavaではサマータイム期間中ですので、内部的に1時間戻してしまいます。
そうなると、取得した際には
1951-5-10 23:00（日本時間）
となり、日付のみを表示に使っていると1日戻ってしまう現象が発生するということです。

なかなか気が付きませんでした・・・。

## サマータイムの期間
このあたりの情報は、
http://d.hatena.ne.jp/nowokay/20130917
こちらのページにも詳細にありますので、より詳細に把握したい場合はご参照ください。

ちなみに日本でサマータイムに該当する期間としては以下の通りです。
昭和23年5月3日(月)～9月11日(土)
昭和24年4月4日(月)～9月10日(土)
昭和25年5月8日(月)～9月9日(土)
昭和26年5月7日(月)～9月8日(土)

日本でもいろいろな施策が過去に実施されていたのですね・・・
この件では背景も含めて勉強になりました。
VMware vSphere Hypervisor で月末に処理を動かす

#結論
VMware vSphere Hypervisorのdateコマンドは`+1 day`という表記が使えない。日本時間で月末の23時0分に実行したいコマンドがある場合、`/var/spool/cron/crontabs/root`は以下の通り。

```
0    14   *   *   *    test $( date -d 24:00 +%d ) -eq 01 && 実行したいコマンド
```
以下、2017/11/28に色々試した記録。

#CentOSのdate
```
date -d '+1 day'
2017年 11月 29日 水曜日 16:40:02 JST
```
翌日の日付を取得できている。
#VMware vSphere Hypervisor 6.5のdate
```
date -d '+1 day'
date: invalid date '+1 day'
```
CentOSと同じ表記ではエラーになる。

```
BusyBox v1.22.1 (2016-03-26 07:03:26 PDT) multi-call binary.

Usage: date [OPTIONS] [+FMT] [TIME]

Display time (using +FMT), or set time

        [-s,--set] TIME Set time to TIME
        -u,--utc        Work in UTC (don't convert to local time)
        -R,--rfc-2822   Output RFC-2822 compliant date string
        -I[SPEC]        Output ISO-8601 compliant date string
                        SPEC='date' (default) for date only,
                        'hours', 'minutes', or 'seconds' for date and
                        time to the indicated precision
        -r,--reference FILE     Display last modification time of FILE
        -d,--date TIME  Display TIME, not 'now'
        -D FMT          Use FMT for -d TIME conversion

Recognized TIME formats:
        hh:mm[:ss]
        [YYYY.]MM.DD-hh:mm[:ss]
        YYYY-MM-DD hh:mm[:ss]
        [[[[[YY]YY]MM]DD]hh]mm[.ss]
        'date TIME' form accepts MMDDhhmm[[YY]YY][.ss] instead
```
`Recognized TIME formats:hh:mm[:ss]`とあったので、+24:00（秒は省略）としてみた。

```
date -d +24:00
Wed Nov 29 00:00:00 UTC 2017
```
翌日の日付を取得できた。+はなくてもいいようだ。

```
date -d 25:00
Wed Nov 29 01:00:00 UTC 2017
```
#実際に /etc/rc.local.d/local.sh に追記した部分
```
cat<<_EOT_>>/var/spool/cron/crontabs/root
0    16   *   *   *   test \$( date -d 24:00 +%d ) -eq 01 && /bin/sh 実行したいコマンド
_EOT_
```
cronを再起動する処理は諸説あるので省略。
Java未経験がAndroidStudioを扱う自分向開発手順

写真編集アプリ開発から学ぶAndroid Studio
１、ローカル写真リストアンドセレクト
　　①写真サムネイルリストより選択した写真の拡大表示　　　

　　②保存された写真を全検索してデータベース化
　　　・Sqlite3のローカルデータベースへ写真ごとのパスを保存
　　　・各写真からExifデータを元にデータベースへ更新
　　　・写真選択拡大表示と同時にコメント、キーワード等を
　　　　データベース化

　　③ローカル写真検索処理
　　　・キーワード及び分類キーにより写真を整理し条件指定でリストアップ
glmnetでポワソン回帰の標準回帰係数を計算する

前回の
[glmnetでロジスティック回帰の標準回帰係数を計算する - Qiita](https://qiita.com/omizu032/items/edf7b25da9a1a83405e1)
を元に、今度はポワソン回帰をした時の標準回帰係数について調べてみました。

前回同様、データとして`birthwt`を使います。(1列目は削除)

```r:R
data(birthwt)
df<-birthwt[,-1]
```
同様に説明変数に、生のデータと標準化したデータの2つを用意します。

```r:R
# 目的変数
dy <- df[, 9]
# 生データ
dx <- data.matrix(df[, -9])
# 標準化したデータ
dx_std<-data.matrix(scale(df[,-9]))
```
目的変数としてbwtをつかっていいのか?という議論はココでは無視しますw

まずは、生のデータを使い、`glmnet()`の中でデータを標準化`standardize=TRUE`させた場合。

```r:R
require(glmnet)
set.seed(123)
cvfit <- cv.glmnet(x = dx, y = dy, family = "poisson", standardize = TRUE)
coef(cvfit, s = "lambda.min")
```

```
9 x 1 sparse Matrix of class "dgCMatrix"
                        1
(Intercept)  8.0390164625
age          .           
lwt          0.0008950326
race        -0.0520953345
smoke       -0.0999303805
ptl         -0.0098804539
ht          -0.1635103496
ui          -0.1671385398
ftv          .           
```
次に、説明変数を事前に標準化して、`glmnet()`の中でデータを標準化させない`standardize=FALSE`場合

```r:R
set.seed(123)
cvfit_std <- cv.glmnet(x = dx_std, y = dy, family = "poisson", standardize=FALSE)
coef(cvfit, s = "lambda.min")
```

```
9 x 1 sparse Matrix of class "dgCMatrix"
                       1
(Intercept)  7.982804430
age          .          
lwt          0.027369544
race        -0.047841346
smoke       -0.048904913
ptl         -0.004874442
ht          -0.039977228
ui          -0.059533132
ftv          .    
```
とロジスティック回帰の時と同じような結果に。   
同じ`glmnet()`なので、係数もロジスティック回帰と同様にagresti変換しているんじゃないかな～？、ということで検証。

```r:R
set.seed(123)
cvfit <- cv.glmnet(x = dx, y = dy, family = "poisson", standardize = TRUE)
# 標準化されていない回帰係数
cf <- coef(cvfit, s = "lambda.min")[,1]
# 各変数の標準偏差
sds <- sapply(as.data.frame(dx), sd)
# 各変数の平均
mus <- sapply(as.data.frame(dx), mean)
# 回帰係数を標準化する
cf_std <- cf * c(1, c(sds[names(cf)][-1]))
# 切片を標準化する
cf_std[1] <- cf[1] + sum(cf[-1] * mus[names(cf)][-1])
as.data.frame(cf_std)
```

```
                  cf_std
(Intercept)  7.982804430
age          0.000000000
lwt          0.027369544
race        -0.047841346
smoke       -0.048904913
ptl         -0.004874442
ht          -0.039977228
ui          -0.059533132
ftv          0.000000000
```
と、読みが大当たり！標準化したデータによる回帰係数と同じ値になりました。
Raspberry PiにSSHで "WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!" エラー

######株式会社XSHELL　デベロッパー　植田歩

## 環境

- mac OS X El Capitan
- Raspberry Pi 3
- OS 2017-08-16-raspbian-stretch-lite.img

## 概要
ssh接続しようとした時にエラーが出て繋がらない。


```

user-no-MacBook-Air-2:git user$ ssh pi@192.168.0.10

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Please contact your system administrator.
Add correct host key in /Users/user/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/user/.ssh/known_hosts:54
ECDSA host key for 192.168.0.10 has changed and you have requested strict checking.
Host key verification failed.
```

- 何台もRaspberry Piを使ったりしているとよくなる。
- 別にRaspberry Piだからなるわけではない。
- あと厳密にいうとエラーというよりか警告。
- 直さないと進めないので気持ち的にはエラー。



## 手順

```

#鍵作成
ssh-keygen -R 192.168.0.10

#成功
user-no-MacBook-Air-2:git user$ ssh-keygen -R 192.168.0.10
# Host 192.168.0.10 found: line 54
/Users/user/.ssh/known_hosts updated.
Original contents retained as /Users/user/.ssh/known_hosts.old

#接続時に聞かれる質問はyes
Are you sure you want to continue connecting (yes/no)? yes
```


---
######株式会社XSHELL　デベロッパー　植田歩
[XSHELL](https://xshell.io/)はSBCを使いやすくするソリューションを提供しています。
[isaax](https://isaax.io/)、[IoTit](https://github.com/xshellinc/iotit)ぜひご使用になってご意見を頂きたく思います。
共に素晴らしいプロジェクトを実現させましょう！

---
ExUnit実行制御チートシート

## 基本
- すべてのテスト実行: `mix test`
- 指定したファイルのテストを実行: `mix test test/my_test.exs`

## 実行するテストの制御
```elixir:hoge_test.exs
defmodule HogeTest do
  use ExUnit.Case
  @moduletag :something

  describe "foo" do
    @tag :important
    test "test1"  do: # テストコード
    @tag :external
    test "test2"  do: # テストコード
  end
  describe "bar" do
    @tag :pin
    test "test1"  do: # テストコード
    @tag :skip
    test "test2"  do: # テストコード
  end
end
```
```elixir:fuga_test.exs
defmodule FugaTest do
  use ExUnit.Case
  @moduletag :pending

  describe "foobar" do
    test "test"  do: # テストコード
  end
end
```

### 指定したテストのみを実行
- タグ: `mix test --only important`
    - 複数も指定可能: `mix test --only important --only pin`
- モジュールタグ: `mix test --only something`
- test: `mix test --only test:"test foo test1"`
    - `test [describe名] [test名]`を指定
- describe: `mix test --only describe:"foo"`
- モジュール: `mix test --only case:FugaTest`

他にもExUnit側で用意されているタグがある。
詳しくは [HexdocsのExUnit.Case](https://hexdocs.pm/ex_unit/ExUnit.Case.html)中のKnown tagsを参照。

### テストをスキップ
- タグ: `mix test --exclude important`
    - skipタグ(`@tag skip`)が付いているテストは特に指定しなくてもスキップされる
- describe、モジュール等も「指定したテストを実行」する場合と同様

### 特定のタグをデフォルトでスキップ
test/test_helper.exsにデフォルトでスキップするタグを指定できる

```elixir:test/test_helper.exs
# 実用例: 次のタグの付いたテストはデフォルトでスキップ
# - external(外部サービスに依存するテストに付ける想定)
# - pending(一旦実行から除外するテストにつける想定)
ExUnit.configure(exclude: [:external, :pending])
ExUnit.start
```

### デフォルトでスキップしたテストを含めて実行
- externalも含めて実行: `mix test --include external`

### その他
- 前回失敗したテストのみ実行: `mix test --stale`
- テストの詳細を出力: `mix test --trace`

## 余談
### includeとexcludeの組み合わせの制約
includeとexcludeを併用した場合、以下のような処理になる。
1. `exclude`で該当するテストをスキップ対象にする
2. `exclude`でスキップ対象にされたテストのうち`include`に該当するテストを追加

結果として、次のようになる。

- 「`exclude`は除外、ただし`include`は除外しない」は実現できる
- 「`include`したものは除外しない、ただしその中で`exclude`したものは除外」は実現できない

例えば、このようなコードがあった場合、

```elixir:some_test.exs
defmodule SomeTest do
  use ExUnit.Case
  @moduletag :external

  describe "foo" do
    @tag :important
    test "test1"  do: # テストコード
    @tag :pending
    test "test2"  do: # テストコード
  end
end
```

- `mix test --exclude external --include important`とすれば、このモジュール全体は除外するが、importantのついたテストは実行する、となる。
- デフォルトでexternalを除外してあるとして、 `mix test --include external --exclude pending`とやってexternalは実行しつつ、pendingを除外しようとしても、pendingの付いたテストも実行されてしまう。


### onlyの仕組みと制約
`only`は`include`と`exclude`の組み合わせで実装されている。
内部的には次のような処理になる。

1. `--exclude test`ですべてのテストをスキップ対象にする
    - ※すべてのテストには自動で`test`タグが付いている
2. `--include [タグ]`で指定のタグが付いたテストだけがスキップ対象から外れる

そのため、onlyもinclude、excludeの組み合わせの制約を受ける。
some_test.exsの例で`mix test --only external --exclude pending`としてもpendingタグが付いたテストはスキップされない。
JUCEでのデバッグ目的でのコンソール出力

# Loggerクラスを使う

fileへの出力の場合ではLoggerクラスを継承したFileloggerクラスを使用する。
デバッグコンソールへの出力が必要な場合は、静的関数のLogger::outputDebugStringを使うと便利。


```cpp:example.cpp

	Logger::outputDebugString( juce::String(v) );

```

[Logger document](https://juce.com/doc/classLogger#a037cd16034c0663805f301b0e95c0be6)
CWL User Guide 1: Introduction と 2: First Example をやってみた

# Common Workflow Language(CWL) User Guide について

[Common Workflow Language User Guide](http://www.commonwl.org/user_guide/)

公式サイトにあるドキュメントで、いろいろなことが２１ステップで学習できます。

各ステップには以下がかならずついているので、学習の目安になると思います。

* 何が学習できるのか(冒頭QuestionsとObjectives)
* 最後に Key Points

１ステップにつき、５分から１０分くらいで終わるようにできていて、目安の時間では３時間１５分で全部終わります。

実際に試したところ大体それくらいの時間でおわりました。

ぜひ試してみてください。

いろいろなことが学習できます。

アドベントカレンダーの私の担当分は、１ステップが１日なっています。

# CWL User Guide 1: Introduction

[Common Workflow Language User Guide: Introduction](http://www.commonwl.org/user_guide/01-introduction/)

CWL とは何か、といったようなことが書いてあります。
Key Points のところは、ぜひ読んだほうが良いです。

Key Points を引用すると次のようにかいてあります。

```
* CWL describes command line tools and workflows.
* CWL is not software.
* Descriptions in CWL aid portability between environments
```

CWLを記述し、それを動かす部分はないです。

# ２にはいる前に、CWLを動かす環境を整備

pythonがすでに使えるのであれば

```
pip install cwltool
```

これだけで、必要なものがはいります。
あとは、dockerを使うサンプルもあるので、でてきたときにdockerをいれたいとおもいます。

また、vagrant が使えるのであれば、

[manabuishii/vagrant\-cwl\-impl\-test](https://github.com/manabuishii/vagrant-cwl-impl-test)

```
git clone https://github.com/manabuishii/vagrant-cwl-impl-test.git
cd vagrant-cwl-impl-test
vagrant up
```

これで、cwltoolも含めて必要なものがはいった仮想マシンができあがります。

User Guide のなかでは、`cwl-runner` と書いてありますが、今回のCWL Advent Calendar 2017は`cwltool`を使って、すすめてみようとおもいます。
これについては、後述の予定です。

## データについて

User Guideを進めていくと、前のステップの結果を使うといったことがでてきます。
途中の日からでもはじめられるように、必要なデータをいれたレポジトリをつくりました。

[manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work)

```
git clone https://github.com/manabuishii/cwl_user_guide_work.git
```

# CWL User Guide 2: First Example

[Common Workflow Language User Guide: First Example](http://www.commonwl.org/user_guide/02-1st-example/)

この回では `Hello world!` を表示します。
そのためにCWLを記述したファイルと、パラメータを記述したファイルの２つのファイルを用意します。

この回では
`Hello world!` を表示するための書き方について１行１行解説してあります。
Key Points もぜひ読んで下さい。

## CWL ファイル、1st-tool.cwl

```1st-tool.cwl
#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: CommandLineTool
baseCommand: echo
inputs:
  message:
    type: string
    inputBinding:
      position: 1
outputs: []
```

## パラメータ用のファイル、echo-job.yml

```echo-job.yml
message: Hello world!
```

## 結果

```console
$ cwltool 1st-tool.cwl echo-job.yml
/usr/local/bin/cwltool 1.0.20171107133715
Resolved '1st-tool.cwl' to 'file:///home/vagrant/cwl_user_guide_work/02-1st-example/1st-tool.cwl'
[job 1st-tool.cwl] /tmp/tmppJq7QV$ echo \
    'Hello world!'
Hello world!
[job 1st-tool.cwl] completed success
{}
Final process status is success
```

## 使ったファイル

[cwl\_user\_guide\_work/02\-1st\-example at master · manabuishii/cwl\_user\_guide\_work](https://github.com/manabuishii/cwl_user_guide_work/tree/master/02-1st-example)

## 少し試してみよう

`echo-job.yml` の `Hello world!` 部分を変更して、もう１度実行してみましょう。
表示されるメッセージがかわることが確認できるとおもいます。

次回へ続きます
Raspberry Pi 3 複数台利用時のIP紛失問題。

######株式会社XSHELL　デベロッパー　植田歩

ネットワーク内のRaspberry PiのIPアドレスを調べます。
nmap とか Bonjour とかの方法もありますが、arp-scan を使うやりかたを紹介します。


##環境

- Mac OS X El Capitan
- Raspberry Pi 3
-- OS 2017-08-16-raspbian-stretch-lite.img


##インストールから使用するまでの手順

```
brew install arp-scan
ifconfig
sudo arp-scan --interface en0 -l | sort -k 1 -n
```
Mac に brew でインストールしましょう。
ifconfig でネットワークインターフェース（この場合en0とか）を調べましょう。
「|」で繋げてる後はsort（順番並び替える）なので必須ではないです。
出力されたとき少し見やすくなります。

### 出力例

```

nding arp-scan 1.9: 256 hosts scanned in 1.903 seconds (134.52 hosts/sec). 51 responded
Interface: en0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
10.0.1.1	dc:a4:ca:eb:2a:42	(Unknown)
10.0.1.100	a8:66:7f:xx:xx:xx	(Unknown)
10.0.1.101	d0:03:4b:xx:xx:xx	(Unknown)
10.0.1.104	b8:27:eb:xx:xx:xx	Raspberry Pi Foundation
10.0.1.104	b8:27:eb:xx:xx:xx	Raspberry Pi Foundation (DUP: 2)
10.0.1.11	2c:f0:a2:xx:xx:xx	(Unknown)
10.0.1.15	b8:27:eb:xx:xx:xx	Raspberry Pi Foundation
10.0.1.15	b8:27:eb:xx:xx:xx	Raspberry Pi Foundation (DUP: 2)
・
・
・
```

---
######株式会社XSHELL　デベロッパー　植田歩
[XSHELL](https://xshell.io/)はSBCを使いやすくするソリューションを提供しています。
[isaax](https://isaax.io/)、[IoTit](https://github.com/xshellinc/iotit)ぜひご使用になってご意見を頂きたく思います。
共に素晴らしいプロジェクトを実現させましょう！

---
ファッションサイトの投稿の傾向を知る

##概要
前回の
[ファッションサイトからファッション画像とラベルを取ってくる](https://qiita.com/nimani76/items/caa74707c15f3052fb4d)
からとってきたlabels.txtから傾向を知る

###コード

```py:fat.py
#!/usr/bin/python
# coding: UTF-8
import math
import numpy as np
import matplotlib.pyplot as plt
from collections import OrderedDict

search = "トップス"

dict = {}

with open('labels.txt',encoding="utf-8_sig") as f:
    line = f.readline()
    while (line) :
        line = line.strip()
        #print(not line.isalpha())
        try:
            int(line)
        except Exception as e:
            if line in dict.keys():
                dict[line] =dict[line] + 1
            else:
                dict[line]  = 1
        line = f.readline()

valist = []       
for y in c.values():
    valist.append(y)
        
c = OrderedDict(sorted(dict.items(), key=lambda x:x[1]))


pupu = []
for i in c.keys():
    pupu.append(i.split())

pan = []
num  =[]
for y in range(len(pupu)):
    if search in pupu[y][0]:
        pan.append(pupu[y][1])
        num.append(valist[y])
print (pan)
print (num)

x = range(len(pan))
y = num

plt.bar(x,y, align="center")
plt.xticks(x,pan,rotation=90)
plt.show()

```

###結果
![tops.png](https://qiita-image-store.s3.amazonaws.com/0/187924/7b57b682-dad4-5ac4-0eba-7acb2ad7aa1c.png)

###補足
matplotlibを日本語表示にするために[IPAexフォント](http://ipafont.ipa.go.jp/node26#ja)を使用しています
Live2D Modelar が重くて動かないとき

メモリ割り当てを変更する．
ファイルを開くだけで数GBメモリを食うようなので、設定を高めにしておく．

![image](https://qiita-image-store.s3.amazonaws.com/0/31862/371f3297-90ec-9055-9583-01c97acd7db0.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/31862/832cf4d2-8eee-7759-ef2f-8d1431c66f2f.png)
Rails5で都道府県、市区町村のマスターデータをワンライナーで作成

郵便局が提供している[郵便番号データ](http://www.post.japanpost.jp/zipcode/download.html)から都道府県と市区町村のMySQLのマスタデータをワンライナーで作成します

## 処理の流れ
- 郵便番号データを郵便局のサイトからダウンロード
- ダウンロードしたZIPファイルを解凍し保存
- 保存したCSVファイルを読み込みMySQLに保存

## テーブル作成
最終的に完成するテーブルは以下のようになります
今回は必要最小限の構造となってます。

#### 都道府県テーブル
|id  |name  |
|----|------|
|1   |北海道 |
|2   |青森県 |

#### 市区町村テーブル
|id  |pref_id|name|
|----|-------|----|
|1   |1      |札幌市北区|


### マイグレーション
#### 都道府県テーブル
```create_prefs.rb
class CreatePrefs < ActiveRecord::Migration[5.1]
  def change
    create_table :prefs do |t|
      t.string :name, :limit => 4, :unique => true

      t.timestamps
    end
  end
end
```

#### 市区町村テーブル
```create_cities.rb
class CreateCities < ActiveRecord::Migration[5.1]
  def change
    create_table :cities do |t|
      t.integer :pref_id
      t.string :name, :limit => 16

      t.timestamps
    end
  end
end
```

### マイグレーション実行
マイグレーションを実行しテーブル作成

```bash
rails db:migrate
```


## seedファイル
今回は初期データを追加するので
**db/seeds.rb**に追記していきます


```seeds.rb
require 'csv'
require 'zip'

DLURL           = "http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip"
SAVEDIR         = "db/"
CSVROW_PREFNAME = 6
CSVROW_CITYNAME = 7

savePath = ""

# 住所CSVダウンロード、解答し保存
open(URI.escape(DLURL)) do |file|
  ::Zip::File.open_buffer(file.read) do |zf|
    zf.each do |entry|
      savePath = SAVEDIR + entry.name
      zf.extract(entry, savePath) { true }
    end
  end
end

# 住所CSVを読み込みDBに保存
CSV.foreach(savePath, encoding: "Shift_JIS:UTF-8") do |row|
  prefName = row[CSVROW_PREFNAME]
  cityName = row[CSVROW_CITYNAME]
  pref = Pref.find_or_create_by(:name => prefName)
  City.find_or_create_by(:name => cityName, pref_id: pref.id)
end

File.unlink savePath
```

### seed実行
以下コマンドで上記スクリプトを実行するとデータが完成
```
rails db:seed
```
larave-mixでtypesctipt + reactをビルドする

[元記事](http://ghken.hatenablog.com/entry/2017/11/29/135729)

# 目的

laravel-mixでtypescript + reactのフロントエンド環境を構築する

# 手順

laravelのプロジェクト作成は省略

## ビルドに必要なモジュールのインストール

typescriptのコンパイラーとreact

```shell
npm install --save-dev typescript ts-loader react react-dom @types/react @types/react-dom
```

## typescriptのビルド設定

tsconfig.jsonの生成

```shell
./node_modules/.bin/tsc --init
```

編集

```json
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs", 
    "jsx": "react",
    "strict": true 
  },
  "exclude": [
    "node_modules",
    "vendor"
  ]
}
```

## webpack.mix.js編集

`resources/assets/js/app.js`をエントリポイントにしてるので変更

`*.ts`と`*.tsx`はts-loaderを使うように

```js
let mix = require('laravel-mix');

mix.js('resources/assets/ts/app.tsx', 'public/js')
   .sass('resources/assets/sass/app.scss', 'public/css')
   .webpackConfig({
        module: {
            rules: [
                {
                    test: /\.tsx?$/,
                    loader: 'ts-loader',
                    exclude: /node_modules/,
                },
            ],
        },
        resolve: {
            extensions: ['*', '.js', '.jsx', '.ts', '.tsx'],
        },
   });
```

## app.tsxを用意してビルド

`resources/assets/ts/app.tsx`

```tsx
import * as React from 'react';
import { render } from 'react-dom';

interface Props
{

}

const App = (props: Props) => (
    <div>hello react</div>
);

render(<App/>, document.getElementById('app'));
```

ビルド

```shell
npm run dev
```

## 確認

![laravel-mix-react-ts.png](https://qiita-image-store.s3.amazonaws.com/0/47597/b09396da-4119-e8e0-a366-b003e5423fd4.png)
Fluentdのin_httpプラグインでJSONを受け取るときのTip

# はじめに

fluentdのin_httpプラグインを使うと、一般的なHTTP POSTメソッドでJSONを投げ込むことでfluentdにデータを送ることができます。
その時に微妙に引っかかった点について書いていきます。

なお、ここではtd-agent-2.3.6-0.el6.x86_64を使用したときの話を書いているので後継バージョンで異なる可能性があります。

# in_httpプラグインについて

ビルトインに含まれるプラグインで、HTTPで投げ込めます。

```
<source>
  @type http
  port 9880
  bind 0.0.0.0
  body_size_limit 32m
  keepalive_timeout 10s
  add_remote_addr true
</source>
```

上記のような設定時は以下のように投げ込むことでデータを入れられます。

```
curl -X POST -d 'json={"message":"TEST","user":"cuturn"}' http://example.com:9880/fluentd.tag.to -v
```

ポイントは、json={JSON} という形で投げ込むことです。また、in_httpプラグインはin_tailやin_tcpと違ってタグを送り元が決めることができることがポイントです。特にヘッダを指定する必要はありません。

ただし、上記設定はJSONデータ部分が誤っていても200OKが返ってしまうという問題があります。

# 普通にやるとJSONが間違っててもエラーを返さないので、少し設定を修正しましょう

通常通りの設定で動かすと、実はJSON文字列が多少間違っててもエラーレスポンスを返しません。json={}の形でさえあれば、200OKを返します。これはデバッグ上非常に宜しくありません。またlog_level debugとしたとしても、何のログもでてきません。

そこで、以下のようにformatを指定します。

```
<source>
  @type http
  port 9880
  bind 0.0.0.0
  body_size_limit 32m
  keepalive_timeout 10s
  add_remote_addr true
  format json
</source>
```

上記のように設定すると、以下のようなCURLで投げ込むことができます。json=は不要になりました。

```
curl -X POST -d '{"message":"TEST","user":"cuturn"}' http://example.com:9880/fluentd.tag.to -v
```

間違ったJSONを送った場合は、送信コマンド/応答含めて以下のような感じになります。

```
$ curl -X POST -d '{"message":"TEST","user":"cuturn",}' http://example.com:9880/fluentd.tag.to -v
...
> POST /log HTTP/1.1
> Host: example.com:9880
> User-Agent: curl/7.56.1
> Accept: */*
> Content-Length: 35
> Content-Type: application/x-www-form-urlencoded
>
...
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 400 Bad Request
< Content-Type: text/plain
< Connection: Keep-Alive
< Content-Length: 80
<
400 Bad Request
Received event is not json: {"message":"TEST","user":"cuturn",}
* STATE: PERFORM => DONE handle 0x600057950; line 1993 (connection #0)
* multi_done
* Connection #0 to host example.com left intact
* Expire cleared
```

というわけで、必ず安定してjsonを送れる自信があるならいいですが、フォーマット間違えたときにきちんと失敗した旨受け取りたい場合はformatを指定するよう設定しましょう。

# HTTPS化したいとき

HTTPSで受け取りたい場合は、同サーバ上にNginxを立ててリバースプロキシするのがオススメになります。以下のような設定を/etc/nginx/conf.d/に置くことで、Nginx経由でfluentdへの通信が通るようになります。cipherとかログ設定とかSSLとかは適宜どうにかしてください。

```
### /etc/nginx/conf.d/fluentd.conf
server {
    listen                      443;
    server_name                 example.com;

    ssl                         on;
    ssl_certificate             /etc/nginx/ssl/server.crt;
    ssl_certificate_key         /etc/nginx/ssl/server.pem;
    ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                 HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    #charset koi8-r;
    access_log  /var/log/nginx/fluentd.access.log  main;

    location / {
        proxy_set_header Host             $host;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_pass http://localhost:9880/;
    }
}
```

なお、X-Forwarded-Forヘッダを設定することでFluentdはREMOTE_ADDRフィールドにこのヘッダ内容を入れてくれます。これでばっちり送信元情報が使えます。BIG-IPや他のLoadBalancerを導入する場合も、同じ考え方をしてください。

またin_httpプラグインはtd-agent.logにアクセスログを出してくれないので、アクセスログが欲しいというだけであったとしてもNginxを立ててリバースプロキシする価値はあるかもしれません。
Webアプリケーションのチュートリアルを作りたい時に利用してみたいJSライブラリを探してみた

# WebアプリケーションのチュートリアルをJavascriptで表現したい
- 業務でとあるWebアプリの使い方をより簡単に理解してもらえる様に、実際の画面に操作ガイドや設定項目の説明をチュートリアルの様に表示したい要件があり、巷にあるJavascriptライブラリで使えるライブラリが無いかちょっと探してみた。

## intro.js
#### 概要
既存のHTMLタグにプロパティを追記することで、
操作説明や案内が表示できる。

#### メリット
- ライブラリ本体と、関連するCSSを夫々1ファイルづつインポートするだけで
基本的な設定が済んでしまう為、既存のコードに様々なJavascriptをインポートしていても、
影響が限定的。
- 説明パネル、対象項目のハイライト等がデフォルトで表示される。細かい設定をしなくても
それっぽく動作する為、初期導入コストが低めで済みそう。

#### デメリット
- 特筆すべきデメリットはなし

#### サンプル
http://www.venezia-works.com/html5_vol10/

#### 参考URL
https://introjs.com/
http://www.atmarkit.co.jp/ait/articles/1402/03/news080.html

## Bootstro.js
##### 概要
既存のHTMLタグにBootstro用のCSSクラスを設定して利用する。
説明パネルの内容も同様にクラス以降に説明パネル用のプロパティとして、利用するタグそれぞれに設定する。

#### メリット
- 説明パネル、対象項目のハイライト等がデフォルトで表示される。細かい設定をしなくてもそれっぽく動作する為、初期導入コストが低めで済みそう。
- CSSクラスで動作を割り当てるので、説明内容を共通化したい時等は、共通化したぶんだけ導入コストを抑える事はできそう。 

#### デメリット
- $(document).ready メソッドに開始用のメソッド実行を入れたりする分、既存の画面動作に何らかの依存関係が発生する可能性が否定できない。
- 説明パネル用に入れる設定も実装箇所毎にひとつひとつ設定しなければならない為、導入時の実装量はintro.jsに比べて多くなりがち

##### サンプル
http://htcsjq-book.ardito.jp/samples/42/

##### 参考URL
http://clu3.github.io/bootstro.js/
http://design-develop.net/web-design/bootstro-js.html

## Chardin.js
#### 概要
既存のHTMLタグにChardin用のプロパティを設定して利用する。
説明パネルの内容も同様にクラス以降に説明パネル用のプロパティとして、利用するタグそれぞれに設定する。

#### メリット
- 他2種と比べた時に大きく違うのが、1ページ内の全要素のチュートリアルを一度に表示するものなので、全体の操作の流れを説明する時はわかりやすいかもしれない。
- 表示開始が独自のjavascript Functionになっている為、表示のタイミングを自由に決める事ができる。

#### デメリット
- 1項目づつ説明していく仕組みでない為、操作手順が伝わりづらい可能性がある。

##### サンプル
http://heelhook.github.io/chardin.js/

##### 参考URL
http://notsleeeping.com/archives/2584
http://heelhook.github.io/chardin.js/
Wordpressの自動アップデート中にサーバ負荷で画面真っ白になった件の対応まとめ

# Wordpressで事故る
wordpressのアップデート中に事故って画面真っ白になりました。
原因はそのwordpressの自動アップデートを押したら、サーバ負荷でトんで、各ファイルを中途半端に上書きしたせいで死んだようでした。

## 環境
AWS EC2 AMIMOTO仕様。

## wordpressの復旧の際にやったこと
やろうと思ったこととして、

1. wordpressのdebugモードをOnにする
2. SQLバックアップ
3. サーバ上の全ファイルバックアップ(主にwp-uploadsやwp-config.phpの確保)
4. SCPで、dumpとtar.gzを手元ダウンロード
5. wordpress最新版とってきてSCPでアップロード
6. cpコマンドで必要ファイルを上書き **<= ここで治った**

でした。

# やったことまとめ

## 1. wordpressのdebugモードをOnにする
wp-config.phpをいじります。

```
define('WP_DEBUG', false);
```
を `define('WP_DEBUG', true);` する。

が、真っ白のままでログが出ぬ。

## 2. SQLのバックアップ(mysqldumpで作成)

```
# ex
mysqldump -u DATABASE_USER -p DATABASE_NAME> /home/ec2-user/dump.sql
```

## 3. サーバ上の全ファイルバックアップ(主にwp-uploadsやwp-config.phpの確保)

```
# ex
tar cvzf HOGEHOGE.tar.gz /var/www/vhosts/HOGEHOGE/
```

## 4. SCPで、dumpとtar.gzを手元ダウンロード

```
# ex
scp -i ~/.ssh/HOGEHOGE.pem ec2-user@AWS_IP_ADDRESS:/home/ec2-user/HOGEHOGE.tar.gz ./
```

## 5. 最新のwordpressの全ファイルアップロード(scp アップロード)

```
# ex
scp -i ~/.ssh/HOGEHOGE.pem ./WORDPRESS.tar.gz ec2-user@AWS_IP_ADDRESS:/home/ec2-user/
```

## 6. cpコマンドで必要ファイルを上書き
普通にcpしたら、「YES/NO」を聞かれまくる。
forceオプションとかないのかなと思って調べても見つかりません。

```
# ex
tar xvzf WORDPRESS.tar.gz
\cp -R ./WORDPRESS/* /var/www/vhosts/HOGEHOGE/
cp -R ./HOGEHOGE/wp-config.php /var/www/vhosts/HOGEHOGE/ #wp-config.phpはバックアップから復元
```
ということで、cpコマンドにバックスラッシュつければ、--force っぽい感じでコピーされます。

ファイルをちゃんと上書きしたら、無事wordpressの画面が出ました。良かった。

# まとめ
結局、wordpressのコアファイルだけ中途半端に上書きされたため、ディレクトリ上のファイルだけwordpressの最新版で上書きすれば対応できました。
ディレクトリ毎ごそっといってもファイルがあれば上書き、無ければ上書きされない（当たり前)ので、自分が勝手に入れたthemesなどは上書きされないため見た目も問題なしでした。

cpコマンドにforceオプションがなくて、バックスラッシュ先頭に入れろが渋い。
インストール権限がないPCでSceneBuilderをEclipseから使えるようにしてみた

今の環境が特殊（というかセキュリティ的に厳しい）環境下で、JavaFXを使えるようにするのに「無理やり」構築した手順のメモ。
あくまで私個人が行った方法であり、この方法が正しい手順ではありません。この記事どおりにやってもうまくいかないかも知れませんし、最悪Eclipseが起動しなくなるかもしれませんので**すべて自己責任で**行ってください。

# 環境
- OS : Win7Pro 64bit
- Java : Java8
- Eclipse : 4.7 Oxygen All in One Ultimate Win64bit Full Edition
- Eclipseが入っているPCは外部（インターネット）に直接接続できない
- しかも権限がないためInstallerでのアプリのインストールは不可
- 外部への接続はリモートデスクトップ経由でのリモートPCのみ

# 手順
## SceneBuilderの非インストール版の入手
リモートPCで作業。
[Gluon](http://gluonhq.com/products/scene-builder/)のページより「Executable Jar」版をダウンロード。今回はJava8用。
ダウンロード後、作業PCにファイルをコピー。

## e(fx)clipseプラグインのマーケットプレース非経由での取得
とりあえずあちこち探したけど見つからず。
なので、**リモートPC上に最小限のEclipseを構築しマーケットプレース経由で追加して、追加前のファイルと追加後のファイルを比較して追加されているファイルを持ってくる**という強硬手段をとる。**なお、featuresフォルダとpluginsフォルダ内のみとした。**
必要ファイルを抽出後、作業PC上のEclipseの各フォルダ内にコピー。

## eclipseのクリーンアップスタート
eclipse.exe -clean.cmdを実行。

## SceneBuilderとEclipseの連携
[この辺](https://qiita.com/opengl-8080/items/de390c063db52e04b591)を参考に、ダウンロードしたSceneBuilder.jarを設定してみたがNG。
.fxmlファイルを右クリック→SceneBuilderで開くを実行するとエラーが発生。どうもExeファイルでないとだめみたい。
なので**SceneBuilder.jarを起動するだけのExeファイルをCで作成**して、そのExeファイルを設定。

```c:scenebuilderstartup.c
#include "stdio.h"
#include "stdlib.h"

int main(int argc, char *argv[]){

	char ph[_MAX_PATH];

	sprintf(ph, "java -jar [jarをコピーしたフォルダ]\\scenebuilder-8.4.1-all.jar %s", argv[1]);

	system(ph);

	exit(0);
}
```

これにて、設定完了。
動作確認の結果OK。
デザインとフォントの選定


##デザインとフォント

デザインにとってフォントはかなり重要な部分になると思います。
この記事では以前行ったアートディレクター水野学さんの講演会の内容の一部を私なりにまとめつつ少しだけフォントの選び方について書かせていただければと思います。

##日本語フォントの選定
例えば引退された力士さんから力士をイメージさせる感じで「お相撲さんのちゃんこ鍋」という飲食店のロゴを作って欲しいと依頼された際どちらのフォントが雰囲気がでると思いますか。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/202257/0f42d48f-5879-72e5-5815-31a88719b94a.png)

こちらは下になります。
ほとんどの日本人が下を選ぶと思います。

##英字フォントの場合
女子大生向けに安くておしゃれなイタリアンレストランのロゴを依頼された際に適したフォントはどちらになるでしょうか。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/202257/823cb16d-9339-2019-1d3a-83c7174af3c0.png)


こちらも下になります。
上のフォントは「[Copperplate Gothic](https://en.wikipedia.org/wiki/Copperplate_Gothic)」というフォントになります。
こちらのフォントは、
1901年にフレデリック・ウィリアム・ゴーディという書体デザイナーの手によって生まれました。その名の通り、銅版文字が元になっております。また作られた当時は貴族しか使えない、高貴な書体でした。

どちらかというと高貴で高級感のあるフォントですので、女子大生向けに安くておしゃれなお店等には向いていないフォントになります。

## 英字フォント選定のミスマッチ
海外に行くとミスマッチな日本語の看板がよくあります。
これはその国のデザイナーが日本語フォントの雰囲気や背景をよく知らずにデザインしているからです。
お相撲さんのちゃんこ鍋のお店が上のフォントであったりなど。
逆に日本人が英字でデザインする場合にそれと同じ現象がよく起こっており、外国の方はミスマッチを感じるそうです。

##英字フォントと意味
英字フォントは歴史も古く、そのフォント自体に意味があるものも多いです。
例えば定番フォントである「Helvetica」これは「スイスの」という意味です。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/202257/2564b905-daf8-d4a6-ffcb-6f63474c7a5b.png)


そのためスイスの航空会社などはこのフォントを多用するそうです。
もちろんフォントの意味など関係なしに使っても問題ないと思います。
例えばJR東日本の駅名標のローマ字もHelveticaです。

![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/f481eafe-3cb7-8232-f5f3-8b6dada63824.jpeg)

ただどうしてこのフォントなのかは必ず説明できないといけないと思います。
ヘルベチアの場合、可視性も高く余白感が駅ごとの文字数の関係で変化しても美しさが崩れることのないフォントのためここはHelveticaである必要があるなど。

##実際にあったフォント選定の実務例
以前の会社で起業したい人向けのサービスのロゴを依頼されたことがあります。
その際にベースとしたフォントは「Futura」を選びました。

![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/202257/0c80beab-d24f-9acd-9a11-16404fd808cd.jpeg)

フォント自体のクオリティが高く、近代的、幾何学的な雰囲気を持つ有名書体ですが、このフォントはラテン語で「未来」という意味ももっております。
そのためこのフォントを使用し、コンセプトとして「未来」を意味するフォントを使用し、このサービスを使って未来を切り開いてほしいという意図をアイコンやレイアウトだけでなくフォント自体にも込めましたとお話ししました。
もちろん見ただけで「Futura」だとわかる起業したい人は少数でしょう。
しかし、説明を受けた上でそれ以上のフォントを提案してくれというのも難しいと思います。
他にも複数候補を作成しておりましたが、無事そのロゴでクライアントから大きな変更もなくOKをいただくことができました。

##フォント選定のコツ
フォントの候補を上げる際には必ず
**・どの国で生まれ
・いつ頃の年代に
・何を目的につくられた書体なのか**
は簡単にでも調べた方がいいと思います。

なぜなら、フォントのバッググランドや、どのように使われてきたのかというコンテクストを把握することで、
より目的に即したフォント選定を行うことができる（ミスマッチを防げる）からです。

ちなみに私はこの事例に限らずロゴを作る際はかならずロゴの案と一緒にフォントの説明やロゴの意図を入れたコンセプトシートを作成いたしますが、この方法を使うとフィードバックはかなり減ると思います。


フォントを選ぶ際にはしっかり理由をもち、フォントの可視性や形、フォント自体の意味や背景など、依頼した人にしっかり説明することは大切だと思います。
カンタン♪空の描き方

#はじめに
光源とか気にせずにざっくり書く空の描き方になります。

#使うもの
・Photoshop（フリーの雲ブラシがあれば他でも問題ないです）
・マウスなど（使い慣れているもの）

#ベースを書く

![1.png](https://qiita-image-store.s3.amazonaws.com/0/202257/a639a14e-c9f3-62ed-0544-1c61015c81c9.png)

1、縦の線形グラデーションのを制作します。
2、新規レイヤーで円形グラデーションを作成します。
今回は(1)はレイヤースタイルで(2)はグラデーションツールで作ってありますが、どちらで作っても大丈夫です。
※この際(2)のグラデーションは明度彩度高めの方がおすすめです。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/202257/0ec529b9-8e05-9f7d-627f-a2bbda51aa36.png)

(2)を通常のまま透明度60%程度にします。

#雲を書く
「使うソフト名　雲ブラシ」でブラシをググって、インストールします。
下記のようなまとめてくれたサイトもあるので、複数入れておくと選べるので複数インストールしておくとのちに便利です。
http://photoshopvip.net/22452
http://cgtracking.net/archives/34640

##ベースを作成する

雲ブラシは写真ベースのものが多いので、リアルでまた透け感があります。
イラスト感を出すためそのまま同じ場所で同じブラシを何度かクリックし、透け感をなくします。

![空.gif](https://qiita-image-store.s3.amazonaws.com/0/202257/51c653bf-f1ba-6248-2074-7736a6611506.gif)


透け感はなくなったのですが、縁が強く硬くなってしまったため縁を指先ツールなどでぼかします。

![392012bd-d588-d104-b555-c454b217a090.png](https://qiita-image-store.s3.amazonaws.com/0/202257/3852a632-3dc1-7933-439e-004368bf6a6d.png)


風の流れをイメージしながら縁をさらっと流すようにぼかします。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/202257/3490f10c-8680-1e86-f4d4-af1518dbcca0.png)


##影を書く
先ほどの雲のレイヤーに影を入れる際にはみ出ないようにクリッピングマスクで新規レイヤーを追加します。

![bcb8aa3f-c815-9a40-69b3-b8e92c7fa71f.png](https://qiita-image-store.s3.amazonaws.com/0/202257/ebbbcc69-70c5-24ad-01d9-762ec1f271fd.png)


そのレイヤーにイントールした雲ブラシの中に入っていたベースとは異なる形の雲、もしくはベースと同じブラシの場合サイズを変えて、青系の色で影をポンポンかいていきます。
本来は光源とか反射光とかを考えて描きますが、今回はざっくりでいくので、適当にブラシで描けば大丈夫です。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/202257/c0902666-d586-808b-9288-f8eabc362e15.png)

同じ要領で異なるブラシでベース→影でレイヤーを増やします。
※気に入らなかった時に簡単に削除できるように1つの雲に1レイヤーで増やしていくことをおすすめします。
![9d8d018a-d57b-22a0-a06b-2fbbc2f13f3a.png](https://qiita-image-store.s3.amazonaws.com/0/202257/19684ebb-25f5-ce4b-8d26-197750ff0e58.png)


#仕上げ
一度しかクリックせずで雲を描き、透明度を65%くらいに下げ、空気遠近法的な奥行きをだします。
※赤丸箇所の薄い雲を追加してます。
![6_5.png](https://qiita-image-store.s3.amazonaws.com/0/202257/9cc977ad-54d2-0e4d-6b8c-790d056267c1.png)


ベースの青を色調補正します。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/202257/b8927306-de45-06df-4da7-1171e5bae534.png)

ピンクや黄色で雲にハイライトを入れます。
お好みでチリのブラシなどを追加して完成になります。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/202257/f4ca08ad-048b-f6ff-4a9b-4d9c5e7b8c96.png)


ブラシなどを利用することによってかなり時短で空が描けます。
サンプルで書いたこちらはだいたい45分くらいになります。

ぜひ試してみてください。
メールフォームプロで件名を変更する

###1.mailformpro/config.cgiを開く。

###2.設置者に届くメールの件名の部分を、

```php
## 設置者に届くメールの件名
$config{'subject'} = $_TEXT{'subject'};
```
に変更

###3.下記のコードを追加する。追加する場所は@Modules = ();の下あたり。

```php
@Modules = ();
push @Modules,'CustomSubject'; ## 件名モジュール
```
###4.mailformpro/configs/CustomSubject.cgiを開いて、件名を変更する。
Ubuntu 16.04 LTS > setup Jupyter (Python3 + Numpy + Scipy + Matplotlib)

Ubuntu 16.04 LTS > setup Jupyter (Python3 + Numpy + Scipy + Matplotlib)
Updated: Dec. 2, 2017

```txt:environment
Ubuntu 16.04 LTS desktop amd64
```

### Setup Jupyter (Python3 + Numpy + Scipy)

Following is the procedure to setup [Jupyter notebook](http://jupyter.org/) together with [Python3 pip](https://pypi.python.org/pypi), [Numpy](http://www.numpy.org/), and [Scipy](https://www.scipy.org/) .

```bash
$sudo apt-get update
$sudo apt-get install python3-pip
$sudo pip3 install jupyter
> You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
$sudo pip3 install scipy
```

### Setup Matplotlib

[The Matplotlib](https://matplotlib.org/) is used to display processed data in a varierty of graphs.

```bash
$sudo pip3 install matplotlib
```

### Setup Git

```bash
$sudo apt-get install git
```

### Optional (update of pip)

During the [Setup Jupyter], following messages are shown.

> You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

For Python3 pip, following command is used to upgrade the pip version.

```bash
$sudo pip3 install --upgrade pip
```

It is noted that **the pip** shown in this environment is the Python2 pip not the Python3 pip. 

### Trouble shooting

During the procedure shown above, following error messages sometimes appear. 

```
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
```

In this case, following commands are used to avoid the error.

```bash
$sudo rm /var/lib/apt/lists/lock
$sudo rm /var/lib/dpkg/lock
```
YAML の動作確認なら Online YAML Parser がオススメ

YAML を入力すると、ほぼリアルタイムでサクサクと解釈結果やエラーを教えてくれる。
[Online YAML Parser](http://yaml-online-parser.appspot.com/)

個人的にはYAMLの文法が苦手だが、すごい学習速度で馴染める気がした。

# 例

全要素を継承して、特定の値を上書きするのってどうやるの？

```yaml
yaml1: &anchor
  a: a
  b: b
  c: c
yaml2:
  <<: *anchor
  b: x
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/357ad8cf-dd36-5a4c-8bf2-9553757a13e6.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[RaspberryPi]他のデータベース接続問題。外部接続


#Problem1
```
2003, "Can't connect to MySQL server on 'server ip' ([Errno 111] Connection refused)"
```

#Solution1

/etc/mysql/myconf についか。

```
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

[mysqld]

bind-address = 0.0.0.0

```




#Problem2
```
1130, "Host 'ip-address' is not allowed to connect to this MariaDB server"
```

#Solution2 

```
grant all privileges on *.* to username@'%' identified by 'root';
```
flutter_toolsのテストを実行する

あまりないかもしれませんが、Flutterのpackagesの一つ `flutter_tools` のテストを実行する時のやり方をメモしておきます。

https://github.com/flutter/flutter/tree/master/packages/flutter_tools

# 1. 実行するflutter_toolsがいるflutterにPATHを通す
テストを実行したい `flutter_tools` が入っているflutterにPATHを通します。
すでに通してあるなら何もしなくていいですが、テストを実行したいということは何かしらコードを変更したいということだと思うので、念のため。

```shell
export PATH=/Users/konifar/private/flutter/bin:$PATH
```

# 2. 実行する
[CONTRIBUTING.md](https://github.com/flutter/flutter/blob/master/CONTRIBUTING.md#running-the-tests)にあるように `flutter` package のテストを実行する時は `flutter test` ですが、 `flutter_tools` のテストを実行する時は次のように実行します。

```shell
cd packages/flutter_tools
DART_VM_OPTIONS=--assert-initializer ../../bin/cache/dart-sdk/bin/pub run test
```

----
以上です。
【ubuntu】Pythonの標準出力で日本語出力が出来なかった話


Windowsで作成したpythonプログラムをubuntuで実行しようとしたときにはまった，文字コード関係のエラーについてまとめます．

# エラーの内容

作業環境をWindowsからubuntuサーバに移行し，dockerを使ってpythonで書いたプログラムを実行する準備を進めていました．
コンテナを起動し，その中でプログラムを走らせたとき，次のエラーメッセージが表示されました．

```
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-24: ordinal not in range(128)
```
どうやら`print("")`で日本語を表示させようとするときに発生しているようでした．
しかし，ubuntuインストール時には日本語版パッケージを利用したので，全く日本語が表示できていないわけではありません．catコマンドでは日本語のテキストファイルを表示できていました．

# 原因
コンテナ内のターミナルで`echo $LANG`を実行して環境変数$LANGを確認したところ，空になっていました．
コンテナの外では日本語版utf-8(ja_JP.UTF-8)が設定されていたため，気づくのに時間がかかってしまいました．


# 解決方法
`locale -a`コマンドを実行してja_JP.UTF-8があるかどうかを確かめます．
存在していなければ，apt-getでlanguage-pack-jaをインストール．
その後，$LANGにja_JP.UTF-8を追記する．
LC_ALLにja_JP.UTF-8を指定する．
これらのコマンドをまとめると以下のようになります．

```
$ apt-get update
$ apt-get install language-pack-ja
$ export LANG=$LANG=:ja_JP.UTF-8
$ LC_ALL = ja_JP.UTF-8
```

exportを使っているので暫定的な処置にはなっていますが，ひとまずこれで標準出力で日本語を表示することに成功しました．
環境変数$LANGの設定だけでなく，LC_ALLの設定も必要でした．
pythonのターミナルがlocaleの設定ファイルを参照していて，その設定が適切でなかったために起きてしまったようです．具体的にどのlocaleを参照しているのか，時間があるときに調べたいです．
macOS 10.13 High Sierraのヤバすぎるバグの対応方法（GUI）

# 起きている事象

rootアカウントにパスワードなしでログインできてしまう..!!
これはやばい..（笑）

https://japan.cnet.com/article/35111084/

<img width="433" alt="スクリーンショット 2017-11-29 11.56.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/33013/fcf4b769-363b-052e-39c4-e49fa66778c1.png">


# 対応方法

「rootアカウントにパスワード設定をすればOK！」

設定方法はこちら => https://support.apple.com/en-us/HT204012

■ 簡単に説明すると

1. rootアカウントでログインする。ログイン画面で、ユーザー名にrootと入れてパスワードは空白でEnter
2. ログインができたら、システム環境設定 => ユーザーとグループ => パスワードを変更（現在のパスワードは空白で新しいパスワードが設定できます）

<img width="495" alt="スクリーンショット 2017-11-29 12.09.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/33013/553c300b-7b06-db8b-c798-dff4d84ec437.png">
TeraTermでDB2への接続方法

Tera Termは、Windowsで最も有名でよく使われているSSH(Secure Shell)クライアントです。

1.インスタンスユーザにスイッチする。

```
su - db2inst1
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204707/0b0dfb91-7aa0-c33a-005e-391d14fd94b3.png)

2.DB2を起動する

```
db2start 
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204707/e368679b-5759-b2a3-4d18-bff4d096c6db.png)

3.DB2へ接続する

```
db2 connect to database1
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/204707/6c5cde47-8d3e-6080-65a1-34eeb9f0b9ca.png)

4.db2コマンド/SQLを実行する