OmniAICreator/Qiita-1.07M huggingface dataset:
android.support.v4.app.Fragmentを使用して起こる[Dagger/MissingBinding] エラー

#概要
これまでビルドできていたプロジェクトで特に変更を加えていないのに以下のエラーが出るようになった時の備忘録

```
エラー: [Dagger/MissingBinding] java.util.Map<java.lang.String,javax.inject.Provider
<dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>>
 cannot be provided without an @Provides-annotated method.
@Singleton
```

#原因
詳細は不明
以下の二つのライブラリのver2.17が出たタイミングで発生した
"com.google.dagger:dagger-android"
"com.google.dagger:dagger-android-support"

要はandroid.support.v4.app.Fragment使うときはAndroidInjectionModuleではダメ

#解決
SupportLibraryを使う場合はAndroidInjectionModuleではなく
AndroidSupportInjectionModuleが必要

```kotlin:AppComponent.kt
@Singleton
@Component(modules = [
//    AndroidInjectionModule::class,<−SupportLibrary使わないならこっち
    AndroidSupportInjectionModule::class,
    AppModule::class,
    ActivityBuilder::class])
```

参考
[Dagger-android application build failed #783](https://github.com/google/dagger/issues/783)
bash + ImageMagick > 無地の白画像に複数の文字列を書込む v0.1

```txt:動作環境
CentOS release 6.9 (Final)
GNU Bash-4.1
ImageMagick Version: ImageMagick 6.7.2-7 2017-03-22 Q16
```

### 処理概要

- 指定のサイズの白画像を用意する
- 指定の文字列(複数)を指定の形式で画像に書込む

### code v0.1

```bash:prepareStringImage_180808_exec
#!/usr/bin/env bash

# v0.1 Aug. 08, 2018
#   - overlay strings to a white canvas

set -eu  # just in case

OUTFILE="string_180808.png"
WRKFILE="wrk_180808.png"

###########
# CONFIGURATIONS
YPOSS=("30" "60" "90")  # start y positions
STSTRS=("0" "100" "200")  # start strings (ST)
EDSTRS=("100" "200" "300")  # end strings (ED)
UNIT="cm"
FORMSTR="%s to %s%s"  #format of the string using (ST, ED, UNIT)
CANVAS_SIZE="300x100"
FONT_SIZE="20"
###########

#1. prepare canvas
convert -size $CANVAS_SIZE xc:white $WRKFILE 

#2. overlay strings
((maxloop_st0 = ${#YPOSS[*]} - 1))
for idx in $(seq 0 $maxloop_st0)
do
	atxt="$(printf "$FORMSTR" ${STSTRS[idx]} ${EDSTRS[idx]} $UNIT)"
	echo $atxt
	prm="-pointsize $FONT_SIZE -annotate +10+${YPOSS[idx]}"
	convert $prm "$atxt" $WRKFILE $OUTFILE
	mv $OUTFILE $WRKFILE  # for overlay 
done

#3. rename as output
mv $WRKFILE $OUTFILE

#message
echo "[$OUTFILE] is created"

```

### 実行

```txt:run
$ bash prepareStringImage_180808_exec 
0 to 100cm
100 to 200cm
200 to 300cm
[string_180808.png] is created
```

下記は`eog string_180808.png`した結果。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cd1ecbe6-d7a2-3f52-50c9-0c0ea45e9c68.png)

### 関連 > 実装時の参考

- [bash > printf > プレフィックスを追加する方法 > filename3=$(printf "%s_%02d.nc" $prefix $idx) > $prefixに%が含まれる可能性も考慮](https://qiita.com/7of9/items/782d5cc6ff4b40c37320)
- [ImageMagick | Python 2 (v2.6.6) > ファイル名から日時を取得し、画像に日時ラベル追加 > label_image_171005.py v0.1 > subprocess.callにて項目の一つに空白がある場合は、それを避けて.split()する](https://qiita.com/7of9/items/75e04bcc6baafe62b6f6)
- [ImageMagick 画像中に文字を入れる](https://qiita.com/hsagae/items/1b72fb9f3d6024ba46f0) by @hsagae 様
    - 情報感謝です

### 関連 > 用途

- [Python 3 (v3.4.8) + ImageMagick > 複数画像を切出して合成する v0.1: ソース内の設定で動く | v0.2: JSONファイルから設定を読込む](https://qiita.com/7of9/items/245de7dfee4841593524)

例として、上記のスクリプトで用意された文字列画像を、リンク先の「画像切出し、合成」処理で合成する。
【惨敗記録】Professional Cloud Architect 模擬試験を受けてみた

# お題
GCPのアーキテクトスキルを問う資格の模擬試験が無料で受けられるのでトライしてみた。
https://cloud.google.com/certification/practice-exam/cloud-architect?hl=ja

# 経緯
GCPを使うプロジェクトに半年ほど参画したものの、アーキテクチャを考えたわけでも構築に関わったわけでもなく、いまいち知識がつかないので、現在の力量（＝ダメさ加減）を知るために受けてみることにした。

# 試験について
↓にある通り、（当然ですが）ちゃんと全体的に理解していないと取れない資格である印象。
単に、GCPとしてどんなサービスがあるか、名前と１行説明だけ覚えていれば済むレベルではない・・・。

![資格試験について.png](https://qiita-image-store.s3.amazonaws.com/0/180599/f2d45180-9d18-39a9-8d8c-d5093e5f42a5.png)

また、↓にある通り、２時間たっぷり試験時間が与えられていて、そして１回２万円以上かかるので軽い気持ちでは受けられない。

![資格試験について２.png](https://qiita-image-store.s3.amazonaws.com/0/180599/edafca64-0fdc-7e0e-41bc-a3883b035c59.png)

ちなみに、模擬試験については↓にある通り、本番の半分以下の試験時間が目安になっている。
（つまり、問題数もそれくらい（＝本番は模擬試験の倍以上！？）ということか）

![模擬試験の説明.png](https://qiita-image-store.s3.amazonaws.com/0/180599/de7b49bc-bb73-fc4f-aed4-6b28e8007302.png)

# 結果
さて、結果ですが、予想通り惨敗（20問中、9問正解）。
※正解したものも勘だったりするので。
FAQ見た限りでは何割正解で合格なのかがわからない。が、半分以下で合格ということはないだろうな・・・。

今回はアーキテクトの模擬試験だったけど、アソシエイトも模擬試験が受けられる。
アーキテクトはビジネス要件も踏まえたソリューション寄りだけど、アソシエイトはオペレーション寄りな雰囲気。
（だからといって自分が余裕で回答できる気はしないけれど）
今度はアソシエイトの模擬試験（今のところ英語版しかないみたい）も受けてみよう。

試験全般については以下参照。
https://cloud.google.com/certification/?hl=ja

さて、とりあえず、現在地はわかったので、模擬試験結果を見ながら、GCPサイトあさってみよう〜
react nativeアプリ　  appIcon をxcode に設定するときのエラー


validate 押した後にエラーになり、


Invalid Image Path – No image found at the path referenced under key ‘CFBundleIcons'



App  Icon をうまく設定できない！！
Info.plist をいじらなければいけない！！
たくさんのサイズの設定をしなければならない！！


などハマりにハマったので、みなさんのお役に立てればと思います。


１. Iconion で1024 ×　1024 のオリジナルIcon 作る
　　注意点は、透過性がついてるとかでエラーになるので
　　
Icon ダブルクリック　→  ファイル　→　書き出すで　アルファのチェック外してください

http://blog.livedoor.jp/eienf/archives/1020555111.html
→　参考になりました


２. できたやつを Images.xcassets に手動で1024pt のところにはる


３. Mac のsips コマンドを使う

http://unkillonline.hatenablog.com/entry/2017/07/24/144822
→　この記事がなければエラーが解決しませんでした

これで、いろんなサイズの画像ができます。
これをImages.xcassets に手動で貼ってください。


４. Info.Plist 変更する　(ここがハマりました)
open as source cord で以下の画像の様にうつ！

<img width="1141" alt="スクリーンショット 2018-08-08 16.44.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/232715/e429cab7-f119-4f5c-c66e-5501af0add73.png">




これで、validate がクリアできるはずです！
頑張ってください！
mongoDBコマンド関係[メモ]

## 概要
mongoDBの起動からのコマンド関連をまとめておきます。


## 起動
mongoDBを使うにあたり、データベース側のmongodを起動させます。

```shell-session:~
$ sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log
```

--dbpathで、mongoDBのデータベースとなるpathを指定します。
--logpathで、mongoDBのlogの保存先を指定します。

Macにログインするときのpasswordを入力すると、mongodが起動します。

次に、別のターミナルを開き、以下のコマンドでクライエント側のmongoを起動させます。

```shell-session:~
$ mongo
MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
Server has startup warnings:
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten]
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten]
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server.
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
2018-08-08T16:22:38.680+0900 I CONTROL  [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service to collect and display
metrics about your deployment (disk utilization, CPU, operation statistics,
etc).

The monitoring data will be available on a MongoDB website with a unique
URL created for you. Anyone you share the URL with will also be able to
view this page. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command:
db.enableFreeMonitoring()
---

>
```

## コマンド関連
データベースの表示

```shell-session:~
> show dbs;
admin    0.000GB
config   0.000GB
local    0.000GB
mydb     0.000GB
```
データベースの選択（切り替え）

```shell-session:~
> use mydb
switched to db mydb
```
データベースの削除

```shell-session:~
> db.dropDatabase();
```
コレクションの表示

```shell-session:~
> show collections
users
```
コレクションの作成

```shell-session:~
> db.createCollection("users");
{ "ok" : 1 }
```
コレクションの削除

```shell-session:~
> db.users.drop();
true
```
コレクションにドキュメントを追加する

```shell-session:~
> db.users.insert( { name:'cat', score:39 } );
WriteResult({ "nInserted" : 1 })
```

表示（全件取得）

```shell-session:~
db.users.find();
```

ドキュメントの全件削除

```shell-session:~
db.users.remove({});
```
【.htaccess】リダイレクトを行う際にクエリを削除する

.htaccessでリダイレクトをさせるときにクエリを削除したかったのですが、変なところで微妙にハマったのでメモ書きです。

# 対応例
例として、
http://example.com/hoge/?fuga=piyo
から
http://example.com/
へリダイレクトさせるとします。

# 解決法
クエリを削除するには、RewriteRuleの転送先URLの末尾に「?」（半角クエスチョンマーク）を指定すればOKです。

# コード
## 上手くいかない例
```Apache:.htaccess
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ /? [R=301,L]
```

上記の例だとクエリが削除されず、パラメータを引き継いだ状態で
http://example.com/?fuga=piyo
へとリダイレクトされてしまいます。

## 上手くいく例
```Apache:.htaccess
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ http://example.com/? [R=301,L]
```

どうやら、RewriteRuleの転送先URLを指定する箇所をサイトルート相対パスで記述しているときちんとクエリが削除されてくれないようです。なので、クエリを削除したい場合はきちんとフルパスでURLを記述しましょう。

```Apache:.htaccess
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/? [R=301,L]
```

こちらの記述でもOKです。
ただし、「http://」の部分はどうしようもなさそうなので、ここは固定で記述するしかなさそうです。

## おまけ
```Apache:.htaccess
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/? [R=301,L]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} ^/hoge/$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/? [R=301,L]
```

こうすれば本番環境とテスト環境でそれぞれSSL対応・非対応で分かれていても対応できますが、コードが冗長になってる感が否めず若干気持ち悪いです。ってかクエリを削除するだけなのに6行も使うのはいかがなものか。


どなたかいい解決法があったら教えてください。
react

react 어제 연습해보고 오늘 다시 연습할려고 하는데 잠시동안 당황했다
어떻게 해야하지??
요즘들어서 느끼는 거지만 머리로 이해하는것만이 전부는 아닌듯 하다.
실습하고 몸에 베이도록 하는것
이론만 안다고 되는것은 아니다.

```terminal
create-react-app //react 서버 실행

cd hello-react //해당 프로젝트 폴더이동

npm start //npm start
```
```react:MyName.js
import React, {Component} from 'react';

class MyName extends Component {
  /* 첫번째 방법
   * static defaultProps = {
   *   name: '기본이름'
   * }
   */
  render() {
    return (
      <div>
        hello my name is <b>{this.props.name}</b> 입니다.
      </div>
      );
  }
}
// 두번째 방법
MyName.defaultProps = {
  name : '기본이름'
};

export default MyName;
```
```react:App.js
import React, { Component } from 'react';
import MyName from './MyName';
import './App.css';

class App extends Component {
  render() {
    return (
        <MyName />
    );
  }
}

export default App;

```
# 함수형 컴포넌트
```react:MyName.js
import React from 'react';

const MyName = ({name}) => {
  return (
    <div>
    hello, MyName is {name} 입니다.
    </div>
    );
}

MyName.defaultProps = {
  name : '기본이름'
};

export default MyName;
```
ラズパイにADボードを装着して動かしてみる

ラズパイにADボードを装着して動かしてみます。必要物品は以下の通り。

* Raspberry Pi 3 Model B
* ラズパイ用ACアダプタ
* Micro SDカード（８GB以上推奨）
* SDカード用リーダ、ライタ
* Raspberry Pi用高精度AD/DAボード
* ディスプレイ
* マウス
* キーボード
* HDMIケーブル
* ラジオペンチ

では、Micro SDカードをSDカード用リーダ、ライターに装着します。
その後、ラズベリーパイの公式ダウンロードページにアクセスします。

https://www.raspberrypi.org/downloads/

ここで、僕はNOOBSをダウンロードしました。
結構サイズがでかいです。(1.5GB)ダウンロードするのに時間かかります。
ダウンロードしたイメージを解凍して、SDカードにコピーします。フォルダごと入れるのではなく、フォルダの中身を移してください。
SDカードにコピーしたら、ラズパイにSDカードを装着し、ラズパイの電源を入れます。
インストールのオプションが出てきたら、Raspbianを選択してインストールです。
インストーラーが起動して、インストールします。

Wifiでインターネットが繋がるはずなので、繋いでおきましょう。

次に、ラズパイ用　High-Precision AD/DA Boardをラズパイに接続します。
ラズパイの電源を切って、AD/DAボードをラズパイに装着しましょう。
スペーサーとネジがあるので留めてください。
こんな感じになると思います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/53172/034955b9-5c96-a976-af87-39cd8681c59e.jpeg" width=50%>

では、以下のサイトを参考にして、ピンを抜き差ししていきます。
https://www.waveshare.com/wiki/High-Precision_AD/DA_Board
今回は、DA出力する方向でやっていきます。
１、5VとVCCを接続
２、5VとVREFを接続
３、DA0とLEDA, DA1 と LEDBを接続、これによって、Analog outputの時に、LEDAとLEDBが光る

以下のソースコードをラズパイにダウンロード
https://www.waveshare.com/wiki/File:High-Precision-AD-DA-Board-Code.7z

ダウンロードしたら、以下のコマンドで解凍ソフトウェアをインストール

```
sudo apt-get install p7zip-full
```

以下のコマンドで解凍

```
7z e High-Precision-AD-DA-Board-Code.7z
```

以下のコマンドでコンパイル

```
make
```
bcm2835.hが無いよとエラーが出るので、以下のサイトを参考にして、インストール

http://www.airspayce.com/mikem/bcm2835/

```
tar zxvf bcm2835-1.xx.tar.gz
cd bcm2835-1.xx
./configure
make
sudo make check
sudo make install
```
これで

```
make
```
でインストール完了

```
sudo ./dac8532_test
```
で、波形が生成されます。

波形が出力されました

<img src="https://qiita-image-store.s3.amazonaws.com/0/53172/349875b6-0712-5e51-55db-57c9706e9b8c.jpeg" width=50%>

ちゃんちゃん
PromiseベースでImage().onloadする

#やりたいこと

JavaScriptで、画像の `width/height` が知りたいとき、以下のようにする。

```jsx
const img = new Image();

img.onload = () => {
  console.log(img.width, img.height);
}
img.src = '画像のパス';
```

`img.src` にパスをつっこんで、読み込み完了したタイミングで `onload` が走る。
このとき、 `onload` で完了を待たずに `img.width` などとしても0が返される（読み込み完了前の値が返される）。

これを `Promise` ベースで書いて、 `async/await` や、 `then/catch` の構文で使えると便利なのでは。

# 結果

こう書ける。Imageに限らず、onloadにコールバック指定する系はだいたい書き換え可能。

```jsx
new Promise((resolve, reject) => {
  const img = new Image();
  img.onload = () => resolve(img);
  img.onerror = (e) => reject(e);
  img.src = '画像のパス';
})
```

これで `await` でも `then` でも `catch` でもなんでも出来る

```jsx
// 関数化
loadImage(src) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    img.onload = () => resolve(img);
    img.onerror = (e) => reject(e);
    img.src = src;
  });
}

// then/catch
loadImage('なんか画像のパス').then(res => {
  console.log(res.width, res.height);
}).catch(e => {
  console.log('onload error', e);
});

// async/await
async function() {
  const res = await loadImage('なんか画像のパス').catch(e => {
    console.log('onload error', e);
  });
  console.log(res.width, res.height);
}
```
ProxySQL2.0をbuildしてrpmを作る

# 概要
[ProxySQL2.0](http://www.proxysql.com/blog/compiling-proxysql-2)がリリースされましたが、2018/8/8時点ではrpmがなかったのでbuildしてみました。
※ `make install` すれば使えますが

# 環境
* CentOS 7.3

# 手順
## 事前準備
* docker, docker-composeをインストールする
* dockerを起動しておく
* [ここの手順](http://www.proxysql.com/blog/compiling-proxysql-2)　の通りに `make` まで進めます。

## build手順
以下のコマンドでbuildが開始されます。今回はCentOS7用のrpmを作ります。

```
$ sudo make centos7
```

## エラー対応
### エラーメッセージ
私の環境では、以下のエラーメッセージが出力されbuildがこけました。

```
centos7_build_1        | error: Bad owner/group: /root/rpmbuild/SPECS/proxysql.spec
centos7_build_1        |     bogus date in %changelog: Sat Mar 11 2016 Rene Cannao <rene.cannao@gmail.com> 1.1.2
centos7_build_1        |     Bad owner/group: /root/rpmbuild/SPECS/proxysql.spec
centos7_build_1        |
centos7_build_1        |
centos7_build_1        | RPM build errors:
proxysql_centos7_build_1 exited with code 1
docker-compose rm -f
Going to remove proxysql_centos7_build_1
Removing proxysql_centos7_build_1 ... done
```

### 対応
調査してみると `proxysql.spec` の権限が `root:root`じゃないといけないようだったので修正しました。

```
# 編集
$ cd /path/to/source_proxysql_directory
$ vim docker/images/proxysql/rhel-compliant/entrypoint/entrypoint.bash

# 編集内容
$ diff -u /tmp/entrypoint.bash docker/images/proxysql/rhel-compliant/entrypoint/entrypoint.bash
--- /tmp/entrypoint.bash	2018-08-08 10:54:27.089378333 +0900
+++ docker/images/proxysql/rhel-compliant/entrypoint/entrypoint.bash	2018-08-08 15:15:25.336411161 +0900
@@ -18,6 +18,7 @@
 tar czvf proxysql-${CURVER}.tar.gz proxysql-${CURVER} && \
 mkdir -p /root/rpmbuild/{RPMS,SRPMS,BUILD,SOURCES,SPECS,tmp} && \
 mv /opt/proxysql/proxysql-${CURVER}.tar.gz /root/rpmbuild/SOURCES && \
+chown root:root /root/rpmbuild/SPECS/proxysql.spec
 cd /root/rpmbuild && rpmbuild -ba SPECS/proxysql.spec --define "version ${CURVER}" && \
 mv /root/rpmbuild/RPMS/x86_64/proxysql-${CURVER}-1.x86_64.rpm /opt/proxysql/binaries/proxysql-${CURVER}-1-${PKG_RELEASE}.x86_64.rpm && \
 # Cleanup current build
$
```

# 参考ページ
https://github.com/sysown/proxysql/wiki/Packaging
[Larabel] ２重にネストされたリクエストに対するバリデーション

#環境

CentOS: 7.4
PHP: 7.2
Laravel: 5.6

#例えばこんなパターン

一度に複数のユーザーが登録できる機能があった場合。

```sample.html
<form>
    <ul>
        <li>
            <input type="text" name="users[][name]">
            <input type="text" name="users[][email]">
        </li>
        <li>
            <input type="text" name="users[][name]">
            <input type="text" name="users[][email]">
        </li>

        <!-- つづく -->

    </ul>
</form>
```

このリクエストの中身を見てみると `user` という配列の中に、さらに連想配列が入ったような形になっています。

```php
$user = [
    ['name' => 'たなか', 'email' => 'tanaka@test.com'],
    ['name' => 'すずき', 'email' => 'suzuki@test.com'],
    // つづく
]
```

このようなリクエストを Laravel でバリデーションするときは「ドット記法」を利用します。

```UserController.php
$request->varidate(
    'users.*.name' => 'required|string',
    'users.*.email' => 'required|email',
);
```

`users.*` と書くと、`users` に含まれるすべての配列に対してバリデーションを行うことになります。

今回は `users` 内の連想配列に対してバリデーションを行いたいので、`users.*` にもう１つドットをつなげて `users.*.name` などとします。
アジャイル開発=スクラムでも無いし、テストもいらない

# 勘違いアジャイルに向けた気持ちを書いた

アジャイル開発をやり始めた最初のうちは一部の情報しかないので誤解してしまうのは仕方ないが、全体像を理解してから自分の開発プロセスが何を解決しようとしてるのかを考えてもいいんじゃないかなと、アジャイル開発を始めたい、始めました、みたいな人に向けた記事です。


# そもそもアジャイル開発とは？

開発プロセスの１つである。それは間違いない。
よく対比されるものがウォータフォールだが、ウォータフォールが悪いわけではない。目的が違うだけ。ウォータフォールが正解のときもある。

ウォータフォールがダメだって言っているのは、目的とフィットしてないこともあるが、ちゃんとウォータフォールが出来ていないだけの可能性がある。こちらのPDFはウォーターフォールの誤解などについて考察しているので参考になる。
[ウォーターフォールモデルの起源に関する考察 (PDF)](https://barrel.repo.nii.ac.jp/?action=repository_action_common_download&item_id=269&item_no=1&attribute_id=19&file_no=1)


ちょっと話が逸れました。アジャイル開発に戻ると、
アジャイル開発はアジャイルマニュフェストと呼ばれる４つの価値観を宣言し、12の原則を定義したもの。

- プロセスやツールよりも個人と対話
- 包括的なドキュメントよりも動くソフトウェア
- 契約交渉よりも顧客との協調
- 計画に従うことよりも変化への対応

この価値観に従っているなら、テストなんて無くたっていいんです。
ただし、右側だけをやるというのではなく、左側にも価値があると理解がしています。
つまり動くソフトウェアに価値を置くけれど、ドキュメントに価値が無いと言ってるわけではないです。

原則も含めてわずか２ページなのでぜひ全文読んでみてください。
[アジャイルソフトウェア開発宣言](http://agilemanifesto.org/iso/ja/manifesto.html)

この価値観を指針に状況に合わせて自分たちで考えてやれってことしか無いんです(笑)

変化への対応でテストがあったほうがいいって思えば書けばいいし、必要ないって思えば書かなくていい。
ドキュメントも必要だと思うなら書けばいいし、必要じゃないなら書かなくていい。
ルールを自分たちの事業やプロセスに合わせて定義するんです。ルールがあるから従うのではなく、合うルールを自分たちで定義していく。自分の頭で考えるのがアジャイルと言うことだけです。

# 草原に放り出された子羊

自分の頭で考えろって言われても無理やんwww
ってなるのが分かっているので、凄い人たちはフレームワークを作ってくれました。

まずはXPが流行り、最近はスクラム開発が流行っていますね。
このテンプレートに従えばアジャイルっぽい開発が出来るよって言うものです。
具体的なプラクティスに落とし込まれているため、実践しやすくなっています。

スクラム開発はアジャイル開発を具体化した１つの方法なだけです。同じレイヤーの話ではありません。
以前、登壇した時につかった図があるので貼っておきます。考え方的にはこのような構造です。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/17213/9d520290-714e-8d5a-7495-fe7e0843ffbd.png)

しかしプラクティスを実行していればアジャイルなわけではありません。
これはあくまでテンプレート。アジャイルであるためには自分の頭で考えることを辞めてはいけません。
テンプレートはカスタマイズするのが当たり前ですよね？チームで常にベストは何かを考えてください。

# ユースケースでラインを探す

つまり結局どうするかの答えはない。
なのでテストを書けばいいこともあるし、書かなくていいこともある。

また、放り出された子羊。
そのラインを探るために色々なユースケースをみんなが語ってくれる。

テストという手段の部分にフォーカスすると、変化への対応と動くソフトウェアという項目の価値についての方法に落とし込んだものだ。つまり、長期的なソフトウェアの変化への対応が必要ないときにはテストはいらない。プロトタイプ実装の時など。個人的には少なくとも３ヶ月程度可動する可能性があるなら、テストがあったほうが良いかんと思ってます。
他にはTDDで開発した方が早く作れる時ですね。テストを書くことに慣れればUIからポチポチテストするよりテストコード回したほうがテンポよく開発できます。

スケジュールが厳しかったら、書きませんね。変化への対応をするためにリリース後に書いたりするスケジュールを組んだりすることもあります。変化に対応したいだけなら、リリース前でもリリース後でもいいですよね？
ベストな方法は状況に寄る。コレを言ったら終わりだよってのがアジャイルです笑

テストについては今回、この記事を書くきっかけになったこちらの記事がとても綺麗に言及してくれているので、こちらを読んでみてください。
[アジャイル開発において「テストコードは当然」なのか？](https://qiita.com/zaramme/items/f6b825c9b72b8eb9502b)


ユースケースについて簡単まとめると、状況は千差万別。自分の頭で考えるのがアジャイル。
ユースケースはみんなで参考程度にしよう！って感じですね。
頑張って自分のチームのラインを作ってください。

# 終わり

一気に勢いで書いてみました。
なにかツッコミや良い情報などあったらぜひコメント下さいな。
もっと、ここのことを知りたいとかの質問などもお気軽に。
VOICEROIDはYoutubeのナレーションに使えるか？

最近、使えるようになったようです。

昔、使えなかった話
https://ptakato.com/youtube-advertisement-voiceroid/

最近、使えるようになった話
https://snake0053.xyz/20180601-ahs-commercial-license-changed/#outline__2_1_2:title

実際に使ってらっしゃるのらきゃっとさんのVtuber設備一覧
http://youtuberch.com/noracat-11397

番外編
棒読みちゃん
https://forest.watch.impress.co.jp/library/software/bouyomichan/
ファイル検索[find]コマンド[メモ]

## 概要
しばしばファイルの場所を忘れた時に、findコマンド使うので。

```shell-session:~
$ find *** -name hoge
```
***の中に、フォルダ名を入れて、-nameオプションで、ファイル名を指定することができる。

また、以下のようにして、拡張子を指定することも可能。

```shell-session:~
$ find *** -name \*.html
```
cakephp3のresources、mapを使ったルーティング書き方例


```PHP
$routes->resources('User', [ // Userはコントローラー名
            'map' => [ // 設定したルートを複数指定出来る
                'get-profile' => [
                    'action' => 'getProfile', // 実行するメソッド名
                    'method' => 'GET',
                    'path' => 'get-profile/:userId', // url (:userIdは動的に値を渡す場合に指定)
                ],
                'login' => [
                    'action' => 'login',
                    'method' => 'POST',
                    'path' => 'login'
                ]
            ],
            'only' => ['get-profile', 'login'], // resourcesを使っている場合メソッドを限定する
            'connectOptions' => ['pass' => ['userId']] // connectメソッドの場合のsetPass等の値をここで設定出来る
        ]);
```


```
$routes->connect(・・・)->setPass(・・・);
```
みたいなのをresourcesでどう設定するんだろう、と思ってたけど、`connectOptions`が使えるんやね。

以上。
composer updateに失敗する原因

# 症状
```
[root@xxxxxxx]# composer diagnose
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Checking composer.json: OK
Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: FAIL
[Composer\Downloader\TransportException] The "https://api.github.com/rate_limit" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed
Checking disk free space: OK
Composer version: 1.6.5
PHP version: 7.2.8
PHP binary path: /usr/bin/php
```
composer updateに失敗したのでcomposer diagnoseしてみるとこんな感じに。
rootでcomposer使うな！って警告出てるけどdockerコンテナ内なんで無視する。
エラーメッセージによるとSSL処理に失敗したらしいがブラウザから直接GitHubへの接続には問題ない。
意味がワカラン。。

# 原因
Kasperskyが邪魔してた模様。
機能を一時停止したら以下の状態へ。

```
[root@xxxxxx]# composer diagnose
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Checking composer.json: OK
Checking platform settings: OK
Checking git settings: OK
Checking http connectivity to packagist: OK
Checking https connectivity to packagist: OK
Checking github.com rate limit: OK
Checking disk free space: OK
Composer version: 1.6.5
PHP version: 7.2.8
PHP binary path: /usr/bin/php
```
これならイケる！


# 対処
Kasperskyの機能を一時停止して更新できた。
URLにパラメータを付与することになったときに使う技

#そのときの日付をJavaScriptでゲットする
ユーザーが会員登録をした時などその瞬間の日付を取りたいときがあるかもしれません。
実際パラメータを振っとくとあとから確認する時に便利です。
例えば2018年7月23日15時に登録したユーザーがいる場合、URLに
「201872315」をくっつける感じです。
これは簡単で普通に`Date()`を使えばいいです。

```typescript
var d = new Date();
var year = d.getFullYear();
var month = d.getMonth() + 1;
var date = d.getDate();
var hour = d.getHours();
var parameter = year + month + date + hour;
```
これで`parameter`に現在の日付が入ります。

別にこれでもいいのだが
ES2015(ES6)で書きたい気分のときはこういう書き方もあります。テンプレート文字列を使う方法。

```typescript
const d = new Date();
const parameter = `${d.getFullYear()}`  +
                  `${d.getMonth() + 1}` +
                  `${d.getDate()}`      +
                  `${d.getHours()}`;     
```

なんかこっちの方がスマートですね。
あとは簡単でlocation.hrefを使って現在のURLを取得してそのURLにパラメータをくっつけてあげます。

```typescript
location.href + parameter;  
```


#ランダム文字列を生成する
「ランダムに生成した文字列をURLにくっつけてユーザーを識別したい」
と思うこともあるかもしれません。
そういう時は`Math.floor(Math.random())`を使って生成してあげます。
変数`l`や`c`をいじることで桁数も含む文字列も自由に変えることができます。

```typescript
const l = 8;
const c = "abcdefghijklmnopqrstuvwxyz0123456789";
const cl = c.length;
let uniqueId = '';
for (let i = 0; i < l; i++) {
    uniqueId += c[Math.floor(Math.random() * cl)];
}
```
TortoiseSVNのスペルチェックを無効にする

こちらで発見。
https://stackoverflow.com/questions/41219850/disable-german-spellchecker-in-tortoisesvn-on-windows-10

> Open TortoiseSVN ==> Settings ==> General ==> Dialogs 2 and check "Only use spellchecker when tsvn:projectlanguage is set"

目のチカチカが解消しました。
【illustrator】マルチ解除 17のコマンドを1つのショートカットに【ショートカット拡張】

#オブジェクトを1つ選択
- グループを選択時 ・・・ 「グループ解除」
- クリッピングマスクを選択時 ・・・ 「クリッピングマスクを解除」
- ライブペイントを選択時 ・・・ 「ライブペイントを解除」
- ブレンドを選択時 ・・・ 「ブレンドを解除」
- 画像トレースフィルタのかかった画像を選択時 ・・・ 「画像トレースを解除」
- 複合シェイプを選択時 ・・・ 「複合シェイプを解除」
- メッシュを選択時 ・・・ 「メッシュのもととなるパスに変換」※メッシュは解除できない
- 複合パスを選択時 ・・・ 「複合パスを解除」
- シンボルを選択時 ・・・ 「シンボルへのリンクを解除」
- ガイドを選択時 ・・・ 「ガイドの解除」
- 不透明マスクのかかったパスを選択時 ・・・ 「不透明マスクを解除」
- 塗と線以外の効果のかかったパスを選択時 ・・・ 「線と幅以外の効果を解除」
- エリア文字を選択時 ・・・ 「ポイント文字に変換」
- 複数行のポイント文字を選択時 ・・・ 「1行ごとにテキストを分割」
- 1行のポイント文字を選択時 ・・・ 「1文字づつテキストを分割」

#オブジェクトを複数選択
- 「グループ解除」

#選択なし
- アウトライン表示のレイヤーがない場合、すべてのレイヤーをアウトライン表示
- アウトライン表示のレイヤーがある場合、すべてのレイヤーをプレビュー表示

　

```
var doc = app.activeDocument;
var selects = doc.selection;

if (selects.length === 1){
	for (iS=0; iS<selects.length; iS+=1){
		if (selects[iS].typename === "GroupItem"){
			if (selects[iS].clipped){
				app.executeMenuCommand('releaseMask'); // クリッピングマスク解除
			}
			else{
				app.executeMenuCommand('ungroup'); // グループ解除
			}
		}
		else if (selects[iS].typename === "PluginItem"){
			app.executeMenuCommand('Release Planet X'); // ライブペイント解除
			app.executeMenuCommand('Path Blend Release'); // ブレンド解除
			app.executeMenuCommand('Release Image Tracing');  // 画像トレースの解除
			app.doScript("複合シェイプを解除","#");
		}
		else if (selects[iS].typename === 'MeshItem'){
			app.doScript("アクション名","グループ名"); // ※「パスのオフセット 0指定」のアクションを登録し記述
			selects[iS].remove();
		}
		else if (selects[iS].typename === "CompoundPathItem"){
			app.executeMenuCommand('noCompoundPath'); // 複合パス解除
		}
		else if (selects[iS].typename === "SymbolItem"){
			app.doScript("シンボルへのリンクを解除","#");
		}
		else if (selects[iS].typename === "PathItem"){
			if (selects[iS].guides){
				selects[iS].guides = false;
			}
			else{
				app.doScript("不透明マスクを解除","#");
				selects2 = app.activeDocument.selection;
				if (selects2.length === 1){
					var sc = selects2[0].strokeColor;
					var sw = selects2[0].strokeWidth;
					var fc = selects2[0].fillColor;
					app.doScript("アピアランスを消去","#");
					selects2[0].strokeColor = sc;
					selects2[0].strokeWidth = sw;
					selects2[0].fillColor = fc;
				}
			}
		}
		else if (selects[iS].typename === "TextFrame"){
			if (selects[iS].kind === TextType.AREATEXT){
				selects[iS].convertAreaObjectToPointObject()
			};
			else{
				if (selects[iS].lines.length === 1){
					// 1文字分割のスクリプト
					// http://chuwa.iobb.net/tech/archive/2011/12/splitter.html
					#include "外部jsxファイル";
				}
				else{
					// 1行分割のスクリプト
					// https://www.tactsystem.co.jp/applescript/illustrator07.html
					#include "外部jsxファイル";
				}
			}
		}
	}
}
else if (select.length > 1){
	app.executeMenuCommand('ungroup'); // グループ解除
}
else{
	var layers = app.activeDocument.layers;
	var preview = true;
	for (i=0; i<layers.length; i+=1){
		if (!layers[i].preview){
			preview = false;
			break;
		}
	}
	if (preview){
		for (i=0; i<layers.length; i+=1){
			layers[i].preview = false;
		}
	}
	else{
		for (i=0; i<layers.length; i+=1){
			layers[i].preview = true;
		}
	}
}




```
Node-REDにおけるCSSファイルとJavascriptファイルの読み込み方

#背景
Node-RED、いじってますか。
最近ハッカソンなどで超高速開発をする機会が増え、[Node−RED on IBM Cloud](https://console.bluemix.net/catalog/starters/node-red-starter)を触ることが格段に多くなりました。

APIサーバーとしても非常に使えるツールですが、フロント部分でもかなり優秀です。

しかし、JavascriptとCSSの適用方法のベストプラクティスがよく分からないという声をよく聞きます。
これまで私は以下２つの方法を取っていました。

###**ファイルとしてサーバーに配置し、パスを指定して呼び出す**
だめです。
クラウドの場合、ローカルで変更したファイルはデプロイによる反映が必要のため、
数文字の変更でも1~2分のロスが発生してしまいます。

###**HTMLに直接記述**###
だめです。
NodeREDの場合デプロイが一瞬なので、この方法を取りがちですが、やはり可読性が非常に低くなります。
リッチなWebページの場合特に記述が多くなりますので、スクロールで該当箇所までたどり着くのが困難になってきます。

#本題
私が考えるベストプラクティスは以下です。

![スクリーンショット 2018-08-08 14.49.05.png](https://qiita-image-store.s3.amazonaws.com/0/143517/5fedfd4d-684d-db5c-3371-7fc070c68e70.png)

HTTP inノードから直接HTMLを記述したTemplateノードへ繋がず、複数の別Templateノードをはさみます。
上図のJavascriptノードを開くとこんな感じです。

![スクリーンショット 2018-08-08 14.51.04.png](https://qiita-image-store.s3.amazonaws.com/0/143517/2132a1f6-7a9e-49f1-f9da-c9027b68ad42.png)
Templateノードには「設定先」という項目があり、ここで指定した名前のオブジェクトに、記述内容が文字列として格納されます。

同様にCSSノードを開くとこんな感じです。
![スクリーンショット 2018-08-08 14.52.34.png](https://qiita-image-store.s3.amazonaws.com/0/143517/f4c0de0f-8507-002c-c871-15b3de78bd98.png)

各オブジェクトに格納したスクリプトとCSSをHTMLを記述したTemplateノードで呼び出します
![スクリーンショット 2018-08-08 14.54.44.png](https://qiita-image-store.s3.amazonaws.com/0/143517/7f7a911f-b686-78b1-7394-4a5256061303.png)
波括弧でmsgオブジェクト配下のデータを読み込むことができますが、このとき必ず「三重」波括弧で記述してください。
理由はいろいろありますが、二重だと勝手に特殊文字などに変換されてうまくいかないです。


#おわりに
いかがでしょうか。
これであなたもNode-REDマスターに3歩近づきました。
また小ネタあれば投稿します。

※もっと良い方法あればコメントどしどしお願いします。
Cloud Auto MLをとりあえず使ってみた。

先月の7/24に、GoogleからCloud Auto ML Natural Languageというものがリリースされました。
http://www.itmedia.co.jp/news/articles/1807/25/news066.html

**ページの後半で、Natural Languageを触った感触などを書いています。**

このCloud Auto MLというのは何かと言うと、ほぼGUIだけで機械学習したモデルを作ることができるサービスの総称で、その中にNatural Language(自然言語)、Translation(翻訳)、Vision(画像認識)というものがあります。


# それぞれのサービスの役割

## Natural Language
NLと銘打っておきながら、できることはテキストデータのカテゴライズです。
テキストとラベルの組み合わせをCSVなどで用意して、アップして数クリックするだけで、学習されたモデルが作成されるサービスです。

<img width="1906" alt="Screen_Shot_2018-08-08_at_14_36_44.png" src="https://qiita-image-store.s3.amazonaws.com/0/103745/5f5a65a5-8554-abd7-b6cf-664d62565acc.png">

## Translation
これは翻訳用のML自動化サービスです。機械翻訳をするために、テキストと翻訳データを用意して、自分のデータセットで学習させることができます。

## Vision
これは画像が何であるか、というカテゴライズをするための仕組みです。
画像の中の物体検知ではなく、あくまで一つの画像に対するラベリングですね。

# さて、NLを実際に使ってみたよ
某HKのニュースのRSSデータを取得して、それぞれもともとのカテゴリをラベル付けして、カテゴライズできるかをテストしました。

## APIの有効化
まずプロジェクトに対してAuto ML NLを使うために、APIを有効化します。
ワンクリックで自動でやってくれるボタンもありましたが、なかなか時間がかかっていたので、その横にあるマニュアル設定のボタンから、指示通りにAPIを有効化しました。

## 学習用CSVの用意
他にもやり方ありますが、CSVを使ってデータを登録する方法を書いていきます。

https://cloud.google.com/natural-language/automl/docs/prepare?hl=ja

実は一番困ったのはここで、公式ドキュメントに「どんな形式のデータを用意すればいいか」という具体例がないという。英語だけだったので不安でしたが、想像はできたのでなんとか作ることができました。
なのでここには具体例を書きますが、こんな形でデータトラベルの対のCSVを用意します。

```csv
"こんにちは、電気グルーヴです。電気で作る、グルーヴです。", denki
"僕は音楽家、電卓片手に足したり引いたり操作して作曲する", kraftwerk
"君に、胸キュン。浮気な夏が僕の方に手をかけて", ymo
"このボタン押せば、音楽奏でる", kraftwerk
"誰だ！ゴクミに似てるのは", denki
"日本でも放射能、今日もいつまでも", kraftwerk
"俺のビデオを消したやつは誰だ！", denki
...
```

ポイントは

- 1カラム目にテキストデータ、2カラム目にラベルデータ
- ラベルデータはマルチバイト文字を受け付けない
- データは20以上、100,000以下
- ラベルの種類は2以上、100以下
- ラベルあたりのコンテンツは最低10データ

これを守ればOK。

## GCSへのアップロード
他にもやり方あります。が、これが一番早い？

APIの有効化セクションで、GCSのバケットも作ったと思いますが、そのバケットに作ったCSVを入れます。

## + NEW DATASETからデータを作る
<img width="1906" alt="Screen_Shot_2018-08-08_at_14_36_44.png" src="https://qiita-image-store.s3.amazonaws.com/0/103745/586d779c-d9b8-fc4e-5bef-79541b423a47.png">

<img width="1903" alt="043fed41-96ee-2337-6088-ce9b846819af.png" src="https://qiita-image-store.s3.amazonaws.com/0/103745/8c237b9d-0b9c-40e5-50c6-1610d8a7d945.png">


これで「CREATE DATASET」を押せばデータのインポートが始まります。
**1000件のデータだけでも2時間位かかりました…**

## データがインポートできたらトレーニング開始
データのインポート後に、重複したデータを削除したと言うようなメッセージがあり、データのチェックもやってくれているようでした。
そのため1000件のデータが668件に。

作成されたモデルをクリックして、TRAINタブに移動します。
<img width="1907" alt="05c47749-9e5b-301b-3c47-3f5d88be238b.png" src="https://qiita-image-store.s3.amazonaws.com/0/103745/17fd0e30-fe39-f631-fdab-46a200233ba3.png">

さて、ここで待ちます。

待ちます
。

**5時間くらい待ちます。**

パチンコにでも行くか、Netflixでドラマを1シーズンまるっと見て気長に待ちましょう。

## モデルのテスト

<img width="1060" alt="5ea0bdb6-a5d4-3235-2db6-aa6344d12cad.png" src="https://qiita-image-store.s3.amazonaws.com/0/103745/8cf56bb7-7762-090a-27a0-49c2e372e78b.png">

# 使ってみた感想
700件弱のニュースデータのカテゴライズ（8ラベル）の学習を試してみましたが、2時間無料とは言え、1回の学習で1000円を越えました。

word2vecとKerasで自分で学習させたモデルも、同じデータのカテゴライズでは8割くらいの精度が出ていましたが、自分であれやこれやニューラルネットを試行錯誤して作っていくよりも安定しているのかなぁとは思いました。

AutoML Natural Languageでは、1つのInput、1つのOutputという感じのモデルになるので、InputやOutputの多いネットワークなどを作りたい場合などは、やはりまだ自前で組まないといけないようです。

まだまだこれから注視していきたいですね！
Raspberry Piに赤外線カメラを取り付けた時のメモ

ラズパイに赤外線カメラを取り付け、motionによりブラウザ経由でカメラの映像を閲覧できるまでセットアップした時のメモ。

# 使用した機器

- RaspberryPi 3 Model B+ <br>
OSはraspbian 2018-06-29を使用(http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2018-06-29/)
- Kumanの赤外線カメラ<br>
https://www.amazon.co.jp/gp/product/B01ICO5CFI/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1

# カメラセットアップ手順

* 赤外線カメラをラズパイに接続

* カメラの有効化
raspi-configから、cameraを有効化する

`sudo raspi-config`

* カメラドライバのロード<br>
アプリがカメラを参照できるように、カメラのドライバbcm2835-v4l2をロードする。<br>
modprobeで手動ロードするのは面倒なので、/etc/moduleに記述して起動時に自動ロードさせる。<br>
ロード後、/dev/video0が見えていたら準備おk。

```conf:/etc/module
bcm2835-v4l2
```

* motionライブラリのインストール

```sudo apt-get install motion```

* motionデーモンの設定
とりあえずブラウザ経由でカメラからの映像を見るため、適当に以下を設定値とした

```conf:/etc/motion/motion.conf
...
framerate 2
threshold 1500
stream_localhost off
...
```

* motionの自動起動 

```conf:/etc/rc.local
motion -b
```

* ブラウザで http://ラズパイのIPアドレス:8080/を開く

# 参考にさせて頂いたサイト
* motionライブラリの設定<br>
http://seesaawiki.jp/yattemiyo/d/Raspberry%20Pi3%A4%C7%A5%AB%A5%E1%A5%E9%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%A4%F2OpenCV%A4%C7%BB%C8%A4%A6
Presto, Hive の「行に番号を振る」関数のまとめ

Presto, Hive にある行番号や順位を振る関数の違いがややこしくて覚えられないのでまとめておく。

ちなみに「どれが速いか」についてはわかっていないので、わかる方がいたらコメント頂けると嬉しい。

## Presto
``` sql
WITH tbl AS (
  SELECT val
  FROM (SELECT ARRAY[100, 200, 200, 300] AS arr) AS t
  CROSS JOIN UNNEST(arr) AS t(val)
)
SELECT
  val,
  RANK() OVER (ORDER BY val),
  DENSE_RANK() OVER (ORDER BY val),
  ROW_NUMBER() OVER (ORDER BY val)
FROM tbl
```

|| RANK | DENSE_RANK | ROW_NUMBER |
|---|---|---|---|
| 100 | 1 | 1 | 1 |
| 200 | 2 | 2 | 2 |
| 200 | 2 | 2 | 3 |
| 300 | 4 | 3 | 4 |

- 同じの値があった場合、`RANK` は次の順位を飛ばすが `DENSE_RANK` は飛ばさない
- `ROW_NUMBER` は同じの値でも違う番号を振る

## Hive
Hive 0.11 以前は `ROW_NUMBER` が使えなかったが、最近の Hive では使えるので Presto と同じように使うことが出来る。

``` sql
WITH tbl AS (
  SELECT EXPLODE(ARRAY(100, 200, 200, 300)) AS val
)
SELECT
  val,
  RANK() OVER (ORDER BY val),
  DENSE_RANK() OVER (ORDER BY val),
  ROW_NUMBER() OVER (ORDER BY val)
FROM tbl
```

|| RANK | DENSE_RANK | ROW_NUMBER |
|---|---|---|---|
| 100 | 1 | 1 | 1 |
| 200 | 2 | 2 | 2 |
| 200 | 2 | 2 | 3 |
| 300 | 4 | 3 | 4 |

また、Treasure Data の Hive には `TD_X_RANK` という UDF がある。

``` sql
WITH tbl AS (
  SELECT "a" AS key, val
  FROM (SELECT EXPLODE(ARRAY(100, 200, 200, 300)) AS val) AS t
  ORDER BY key
)
SELECT
  key,
  val,
  TD_X_RANK(key)
FROM tbl
```

| key | val | TD_X_RANK |
|---|---|---|
| a | 300 | 1 |
| a | 200 | 2 |
| a | 200 | 3 |
| a | 100 | 4 |

- サブクエリであらかじめ `ORDER BY key` もしくは `CLUSTER BY key` しておく必要がある
- `key` ごとに区切って行番号が振られる
    - `ROW_NUMBER() OVER (PARTITION BY key)` と同じ

今の Hive は `ROW_NUMBER` があるのでそっちを使えばいいのでは？と思うのだけど、 `TD_X_RANK` のほうがパフォーマンスが良い、とかそういうのあるのだろうか。
PostgreSQLダンプ＆リストア

## 概要
Postgresのデータをコピーすることがあったのでとりあえず、メモとして残す。

## ダンプ
今回は、不要となったtextsearch_jaなどの拡張機能を取り除く意味で、スキーマ（構造）とデータを別々にダンプすることにします。

```sh:ターミナル
# スキーマ（構造）
$ pg_dump -U hoge_admin -h 127.0.0.1 -s -p 5432 --create hoge_db > ~/schema.sql

# データ出力
$ pg_dump -U hoge_admin -h 127.0.0.1 -a -p 5432 hoge_db > ~/data.sql
```

## ファイルの転送
下記コマンドにて、ダンプしたファイルを対象サーバへ転送する。

```sh:ターミナル
$ scp ~/schema.sql hoge@[IPアドレス(転送先)]:/home/hoge/
```

## リストア
下記コマンドにて、リストアする。

```sh：ターミナル
# 構造作成
$ psql -U hoge_admin -h 127.0.0.1 -d postgres -f schema.sql

# データ登録
$ psql -U hoge_admin -h 127.0.0.1 hoge_db < data.sql
```

## 件数確認
各テーブルのレコード数を確認してみる。

```sql:確認.sql
SELECT
    t2.relname,
    t2.reltuples
FROM
    pg_stat_user_tables AS t1
INNER JOIN
    pg_class AS t2 ON t1.relname = t2.relname
ORDER BY
    t2.relname
;
```

実際のテーブルのレコード数と比較すると、件数が異なる・・・
下記記事を見ると・・・

・[PostgreSQLでDBの各テーブルのレコード数を一覧で確認したいとき](https://ameblo.jp/smd310/entry-11377740731.html)

```
ひとつ注意すべき点は、reltuplesが
Number of rows in the table. This is only an estimate used by the planner. It is updated by VACUUM, ANALYZE, and a few DDL commands such as CREATE INDEX
つまり、「だいたいの数値であって正しいとは限らないぜ」ってトコ。
```

これでは、ダンプがうまくいっているかの確認には使えないみたい・・・
何かいい方法あるかな・・・

```
＜方法１＞
select count(*) from table_name;

＜方法２＞
select relname as name, reltuples as rows from pg_class where relname ='table_name'

※１と２で件数が異なる場合は、反映されていない状態なので、
「vacuum table_name」で反映させる。
```
http://blog.livedoor.jp/kumagai_nori/archives/52383430.html

なるほど、バキュームすると件数があうのか・・・

```sql
vacuum survey_responses
```

それか、下記SQLで、各テーブルの件数を取得するクエリを生成できそう

```sql
SELECT
  ARRAY_TO_STRING(
    ARRAY(
      SELECT
        ('SELECT ''' || relname || ''' AS table, COUNT(*) AS rows FROM ' || relname) AS query
      FROM
        pg_stat_user_tables
      ORDER BY
        relname ASC
    )
  , chr(10) ||' UNION ' || chr(10))
  || chr(10) || ';'
;
```

上記クエリの実行結果

```
SELECT 'hoge1' AS table, COUNT(*) AS rows FROM hoge1
 UNION 
SELECT 'hoge2' AS table, COUNT(*) AS rows FROM hoge2
 UNION 
SELECT 'hoge3' AS table, COUNT(*) AS rows FROM hoge3
 UNION 
SELECT 'hoge4' AS table, COUNT(*) AS rows FROM hoge4
 UNION 
SELECT 'hoge5' AS table, COUNT(*) AS rows FROM hoge5
 UNION 
SELECT 'hoge6' AS table, COUNT(*) AS rows FROM hoge6
;
```

これをコピペで実行してみれば、比較できそうですね。

以上。

## 参考サイト
- [PostgresSQLでDBの全テーブルのレコード数一覧を確認](https://qiita.com/fgnhssb/items/5fc1d7bb43c97d95b4c6)
- [SCPコマンドでローカルのファイルをサーバにアップ＆サーバ上のファイルをDL](https://qiita.com/ritukiii/items/c724f09fe66fedf2618b)
PHPの書き方

```php
<?php
$a = 'xoxo';
?>
```
1. <?php と　?>　の間に書く。
2. 1つの命令の終わりに「;」をつける。
3. 外部ファイルをつくって、そこにPHPを書くことも可能。htmlファイルのどこにでも外部のphpファイルを読み込める。こんなふうに↓

```php
<?php include('hoge.php'); ?>
```

##注意点
- その1

```php
<?php
 $str = 'サンプル1';
?>
<html>
 <head>
  <?php
   $str = 'サンプル2';
  ?>
  <meta charset="utf-8">
  <title>タイトル</title>
 </head>
 <body>
  <p><?php echo $str; ?></p>
 </body>
</html>
```
<?php echo $str; ?>で表示されるのは「サンプル2」になります。

- その2

全角はクォーテーション、ダブルクォーテーションで囲んでないとエラーになる。全角がいつのまにか入っててエラーになることがけっこうある。

>[ウェブカツ！！](https://webukatu.com/?afid=p5lxu1kvh03rayd2ctjsw4e9bgzq8nom)
Mac に Homebrew で composer をインストールする (201808)

ググって出てきた記事通りに `composer` をインストールしようとするとエラーになりました。

```sh
$ brew install homebrew/php/composer
```

こんなエラー。

```sh
Error: homebrew/php was deprecated. This tap is now empty as all its formulae were migrated.
```

coreに移行されたっぽいです。

```sh
$ brew search composer
```

```sh
==> Formulae
composer
```

ということで、単純に以下でOK。

```sh
$ brew install composer
```
研修をオンラインでやってみる（自習サポートっぽくなる）


#台風でなので実験的に研修はオンラインでやるよ。

##事前準備
研修の一貫ですが、Qiitaを使うなら、まずはQiitaのガイドラインを読むところから。
[コミュニティガイドライン - Qiita:Support](https://help.qiita.com/ja/articles/qiita-community-guideline)

##実施してみた課題（改訂版）
1. DokoJavaを使ってみた記事を投稿する。
1. だれでもよいのでいいねをもらう。
1. DokoJavaを使ってみた記事を削除する。（投稿の練習なので、いいねもらったら削除する。残したかったら個人ブログへ。）
1. すっきりわかるJavaを自分のスキルレベルにあった100〜150ページ分やって、要約と所感を投稿する。（該当ページも記載する）
1. sfujikawaがコメントをする。
1. sfujikawaのコメントにリアクション（記事の更新）する。

##期限
 -  8/8は100〜150ページ分を目安とする。
 -  仮に、8/9が午後出社となった場合、３００ページ分に相当。（あくまで目安）

##注意事項
 -  最初なので、マークダウン記法や、レイアウトには、あまりこらないように。
 -  課題の２は、自前のPCにエクリプスなり、ネットビーンズなりIDEを入れて、実行させた結果などあるとよい。
 -  書くことにまよったら、疑問点（Qiitaの活用方法含め）を書いていけば良い。
 -  １００％呼んでから記事を書くより、読みながら、コーディングしながら、記事も書く。
 -  記事は完成してから投稿せず、途中でも投稿して良い。後からいくらいでも編集できる。

#所感
 -  速攻でガイドライン読むように指摘されました（下記コメント参照）。確かに読んでなかった！ぐぬぬ
 -  課題や期限など、進め方の伝達は、Qiitaを使わない。Qiitaはあくまで、学んだ結果のアウトプットとして利用（ガイドライン：プログラミング以外の内容は投稿しない）
 -  同じ課題の結果のアウトプットだと、似たような結果になるので課題は別々の内容にする。（ガイドライン：いまある記事の価値を高めよう）
多次元配列のisset() は一気にチェックできる

`isset()` 関数で多次元配列のキー存在チェックをする際、たまに

```php
<?php
if (isset($a) && isset($a['foo']) && isset($a['foo']['bar'])) {
    // do something
}
```

と、上から丁寧にチェックしているソースを見かけますが
この場合、途中のチェックは不要で

```php
<?php
if (isset($a['foo']['bar'])) {
    // do something
}
```

とだけ書けば大丈夫です。

検証ソース

```php:test.php
<?php
error_reporting(E_ALL);

var_dump(isset($a['foo']['bar']));

$a = array();
var_dump(isset($a['foo']['bar']));

$a['foo'] = array();
var_dump(isset($a['foo']['bar']));

$a['foo']['bar'] = 1;
var_dump(isset($a['foo']['bar']));
```

実行結果

```shell-session
$ php test.php
bool(false)
bool(false)
bool(false)
bool(true)
```

途中 `$a` や `$a['foo']` が未定義でも、Undefined variable の Noticeはでません。
Corda サンプルCorDappを動かしてみる1

#目的
サンプルCorDappがどのように動作するのか確認する。

#環境
Mac環境。

#内容
##CorDappとは？
Corda上で動くスマートコントラクトコードのこと。

##事前準備

以下のリンクを参考に、JDKとIntelliJ IDEAとGitを導入する。
JDKはCordaが動作するために、IntelliJ IDEAはCorDappを開発するために、Gitはサンプルコードをダウンロードまたは作成したコードを管理するために必要。
https://docs.corda.net/getting-set-up.html

>Oracle JDK 8 JVM - minimum supported version 8u171
>IntelliJ IDEA - supported versions 2017.x and 2018.x (with Kotlin plugin version |kotlin_version|)
>Git

##CorDappをGithubからダウンロード
ダウンロードしたいディレクトリに移動してgit clone

```
$ cd $CORDA_HOME
$ git clone https://github.com/corda/cordapp-example
```


##IntelliJ IDEAでCorDappを開く
1. IntelliJ IDEAを起動
2. Openを選択してcordapp-exampleディレクトリをOpen<img width="780" alt="スクリーンショット 2018-08-08 13.09.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/59b757d2-6fe8-d7ff-d0bf-64844620ba1f.png">
3. File > Project Structure > Project SDK > New > JDK でデフォルトで使用するSDKを指定する(Macの場合でてきたHOMEをそのままOpenすればOK,Windowsの場合はC:\Program Files\Java\jdk1.8.0_XXXを指定)<img width="1025" alt="スクリーンショット 2018-08-08 13.15.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/5961e28c-6c9b-9115-3b23-98c3b55109d0.png">
4. プロジェクトをビルドするためにGradleをダウンロードする。File > Project Structure > Modules > + > Import Module でcordapp-exampleをOpen<img width="1024" alt="スクリーンショット 2018-08-08 13.23.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/e4b18686-5528-4f3d-ceeb-a500d4203983.png">
5. import module from external model でGradleを選択しNext > Fininsh > OK を選択し数分待つとGradleがダウンロードされプロジェクトをビルドする <img width="934" alt="スクリーンショット 2018-08-08 13.23.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/24e18811-a5ca-b404-2901-0191efcb7d83.png">



##Corda起動
Cordappがインストールされたノードがビルドできた。
続いてCordaノード+CorDappを起動するには、①IntelliJ IDEAから起動②Terminalから起動する方法がある。

###①IntelliJ IDEAから起動

右上のボックスでRun Example Cordapp - Java を選択して隣の矢印をクリック<img width="245" alt="スクリーンショット 2018-08-08 14.01.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/d66d1fd1-a0b7-a9eb-03e3-101268ce18e6.png">

停止するときは赤色の四角をクリック
<img width="332" alt="スクリーンショット 2018-08-08 14.01.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/231906/22cbe4f8-ccaa-f33c-ae72-3153736dc8c5.png">

###②Terminalから起動

IntelliJ IDEAから先ほどビルドしたが、Terminalからも可能

```
$ cd cordapp-example
$ ./gradlew deployNodes
...
BUILD SUCCESSFUL in 1m 7s
10 actionable tasks: 10 executed
$ 
```

ノード起動。サンプルではKotlinとJavaで書かれたソース2つを提供してくれているので、以下のどちらかを選択

```
$ kotlin-source/build/nodes/runnodes
または
$ java-source/build/nodes/runnodes
```
起動するとターミナルがたくさん開く。Cordaノードのターミナルとwebserverのターミナルが開く。webserverのターミナルでjava.lang.NullPointerExceptionが出るかもしれないが、起動していれば無視して問題ないらしい。


きりがよいので以上。次回はサンプルアプリの説明と動作確認を実施する。
[Corda サンプルCorDappを動かしてみる2](https://qiita.com/lcez1nna/items/e87f9986ab066f01ce30
"Corda サンプルCorDappを動かしてみる2")
#まとめ

簡単に動かせるのでぜひ試してみてください。
[別記事](https://qiita.com/lcez1nna/items/aa56ee11545cf3d838d4 "別記事")でCordaのデスクトップアプリDemobenchについても書いています。こちらはGitとかIntelliJ IDEAを導入しなくても簡単に動かせます。

#参考文献
QuickStart
https://docs.corda.net/quickstart-index.html
PythonでWebアプリ入門(Flask編)

唐突にWebアプリ作成に興味を持ったので，FlaskでチュートリアルのQuickstartを読んで実装していく．
(参考元 http://flask.pocoo.org/docs/1.0/quickstart/#quickstart )
この記事を書くとき，筆者はHTTPとHTTPSの違いを少し知ってるくらいの知識．

* 環境
    * OS    : Windows10 (2018/8/8最新version)
    * Python: 3.6.6
    * Flask : 1.0.2 

# とりあえずWeb上に文字を出してみる．

Quickstartのサンプルコードを実装する．

```Python:hello.py
# coding: utf-8


from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
    return 'Hello world!'

```

上記のコードを保存したのち，コンソール上で

```
$ set FLASK_APP=hello.py
$ flask run
```

を実行したのち，ウェブブラウザで`http://localhost:5000`にアクセスする．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/253125/d4ce8d43-a607-ad2d-d15b-3adf36438d5d.png)

表示する文字をurlに入力された文字によって変更させたい場合，`hello.py`を以下のように変更する．

```Python:hello.py

# coding: utf-8


from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
    return 'Hello world!'


@app.route('/<username>')
def name(username):
    return 'Hello {}!'.format(username)
```

変更したのち，`http://localhost:5000/yaruo`にアクセスする．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253125/222be9c0-1f42-23fd-bf6d-e5d3aaf6b21f.png)

ルートを指定するときに<>で囲まれた文字列(このときはusername)がPython上で扱える変数として認識されるっぽい．

最後に，表示させるhtmlのテンプレートを表示してみる．

```Python:hello.py
# coding: utf-8


from flask import Flask, render_template
app = Flask(__name__)


@app.route('/')
@app.route('/<name>')
def hello(name=None):
    return render_template('hello.html', title='flask test', name=name)
```

```HTML:hello.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>

    {% if name %}
        <h1>Hello {{ name }}!</h1>
    {% else %}
         <h1>Hello World!</h1>
    {% endif %}

</body>
</html>
```
`hello.html`は以下のディレクトリに保存する．

```
application/
│
├ hello.py
├ template/
│ └ hello.html
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/253125/e1c57476-0280-04ad-e7d4-1e948558d275.png)

タブのタイトルが変わって文字も太くなった．


他の使い方や機能をこれから勉強していく予定
Azure DevOps Projectsで.NET Core 2.1を使ってみる

#### はじめに
先月（2018年7月）にAzure DevOps ProjectsがGAされました。

[Azure DevOps Projects general availability](https://blogs.msdn.microsoft.com/devops/2018/07/12/azure-devops-project-general-availability/)

これを機会に、弊社のASP.NET Coreライブラリを突っ込んで動作確認をするために触ってみました。現時点（2018年8月）では、このAzure DevOps Projectsを作成した際にデフォルトで用意されるASP.NET Coreアプリでは.NET Core 1.1を使っています。これを.NET Core 2.1に更新して利用する手順を共有できればと思います。

#### アプリケーションの作成
以下を参考にAzureポータルからポチポチ設定していきます。
 
[.NETのクイックスタート](https://docs.microsoft.com/ja-jp/azure/devops-project/azure-devops-project-aspnet-core)

順番に［.NET］→［ASP.NET Core］→［Web App］を選択していって、最後に使用するVSTSとAzure Web Appsの設定をします。これで［Done］をクリックするとVSTSにASP.NET Coreアプリのリポジトリが作成されて、CI/CDパイプラインも作成されて、Azure Web Appsにデプロイされる、まで一気にできちゃいます。

![qiita-2.png](https://qiita-image-store.s3.amazonaws.com/0/80632/d386cef6-49ca-5b4e-092f-3dc90cf53662.png)

なかなかスバラシイではないですか。

#### VSTSでソースを覗いてみる
さて、ここからが本編。VSTSでソースのリポジトリにある`aspnet-core-dotnet-core.csproj`を開いてみると、.NET Core 1.1を使っていることが確認できます。

![qiita-3.png](https://qiita-image-store.s3.amazonaws.com/0/80632/c0e0908d-eb73-39b2-2b0b-21612b7342a8.png)

#### ローカルにクローンを作成して.NET Coreのバージョンを更新する
ローカルのVisual Studioでクローンして、.NET Core 1.1から最新の.NET Core 2.1に更新します。

![qiita-4.png](https://qiita-image-store.s3.amazonaws.com/0/80632/dd848aa6-a395-27d7-650e-2e91f64ab81c.png)

NuGetパッケージも更新しておきます。

![qiita-5.png](https://qiita-image-store.s3.amazonaws.com/0/80632/dbae3e25-b8a2-63df-d19e-fa707ccda4e2.png)

さらに`aspnet-core-dotnet-core.csproj`を編集します。以下をコメントアウトか削除します。

```
<PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
```

更新が終わったらVSTSへプッシュ...したいところですが、このままVSTSでビルドを走らせるとコケてしまいます。続いてVSTSのビルド構成を編集します。

#### VSTSでビルド構成を更新する
ビルドがコケるのは、ソース以外にVSTSのビルド構成でも.NET Coreのバージョンに依存する部分があるためです。この部分を更新していきます。

`.NET Core Tool Installer`の`Version`が`1.0.4`になっているので、こちらを`2.1.302`に更新します。

![qiita-6.png](https://qiita-image-store.s3.amazonaws.com/0/80632/8b7805bc-4f1e-1e15-6aa1-6a2f544a05d4.png)

.NET Core SDKのバージョンはVSTSにもリンクがありますが、以下に記載されています。

[https://github.com/dotnet/core/blob/master/release-notes/releases.json](https://github.com/dotnet/core/blob/master/release-notes/releases.json)

#### ローカルからプッシュする
ようやく設定完了です。Visual Studioからプッシュが終わるとビルドが走ります。ビルド構成も.NET Core 2.1にあわせたので成功するハズです。

![qiita-7.png](https://qiita-image-store.s3.amazonaws.com/0/80632/5ae9f0d9-d4c7-a65a-4518-2d3aff02ccc1.png)

#### まとめ
現時点（2018年8月）では、.NET Core 2.1で利用するのには若干の手間はかかりますが、このAzure DevOps Projectsは非常に期待したいサービスです。今後機会があれば.NET Core 2.1 + Razor Pagesや、JavaScriptフレームワークを使ったSPA + .NET CoreなどVisual Studio 2017で用意されているテンプレートをベースにしたソースを利用するケースについても書いてみたいと思います。