OmniAICreator/Qiita-1.07M huggingface dataset:
Graal関連メモ

# Graal関連メモ
## 言語連携
R
[Enhance your Java Spring application with R data science](https://medium.com/graalvm/enhance-your-java-spring-application-with-r-data-science-b669a8c28bea)

Clojure
[Native Clojure with GraalVM](https://www.innoq.com/en/blog/native-clojure-and-graalvm/)

## 論文
[An object storage model for the truffle language implementation framework](https://dl.acm.org/citation.cfm?id=2647517)
SentOS7にApache2.4をインストールする

# Apacheインストール
SentOS7にApache2.4をインストールする方法

まずはyumリポジトリに、どのバージョンのApacheがあるのか確認するため、以下のコマンドを入力
`# yum info httpd`
バージョンが2.4になっているか確認する。

確認できたら、`su`コマンドでユーザーをrootに切り替える
ちなみに`su -`との違いは、rootディレクトリに移動するかの違い

```text:rootになるコマンド
# su
```

次にApacheをインストール

```text:インストール
# yum -y　install httpd
```

これでApacheをインストール出来たので、次にApacheの起動する

```text:操作
起動
# systemctl start httpd

再起動
# systemctl reload httpd

停止
# systemctl stop httpd

自動起動
# systemctl enable httpd

ステータス確認
# systemctl status httpd
```

起動したら`http://localhost`にアクセスしてページが開けたら、インストール完了
Windows ServerのDHCPフィルタリング

# Windows ServerのDHCPフィルタリング機能を使う

## やりたいこと

- 特定のMACアドレスに対してはIPアドレスを割り当てたい ⭕

例えば、会社支給のPCや自宅PCなど

- 特定のMACアドレス以外にはIPアドレスを割り当てたくない ❌

持ち込みPCや、認可していないPCなど

## そもそも

Windows ServerのDHCPサーバー機能を使用していることって
結構珍しいことだと思います👀

一般的にはネットワーク機器などをDHCPサーバーとしているところが多いかもしれませんね...


## 本題

DHCPサーバーとなっているサーバーへログインします👀

![スクリーンショット 2018-05-16 14.56.19.png](https://qiita-image-store.s3.amazonaws.com/0/127585/b83af123-8eec-fcec-bbda-f3a459278ec7.png)


スタートメニューのアプリから、 `管理ツール` のところにDHCPがあるはずです。
なければDHCPの機能がインストールされていない可能性があります😤

![スクリーンショット 2018-05-16 14.57.04.png](https://qiita-image-store.s3.amazonaws.com/0/127585/67a49552-8f5c-8399-64ec-1bb4f05e5a8c.png)

DHCPのスナップインが表示されるので、フィルタリングしたいDHCPサーバーを選択します👀

![スクリーンショット 2018-05-16 14.58.29.png](https://qiita-image-store.s3.amazonaws.com/0/127585/112b6d27-d969-ef3c-fd07-5ea4a921e6eb.png)

IPv4 / IPv6 目的のものを選択し、最下部の `フィルタ` を選択します。

これは現在のフィルタ状態を表しています。

その為、設定していない場合はどちらもスナップインは空の状態になります。

実際にフィルタしてみましょう👀

### スコープから対象を選択する

実際にアドレスをリースしているスコープを選択し、対象を見つけます。

![スクリーンショット 2018-05-16 15.03.19.png](https://qiita-image-store.s3.amazonaws.com/0/127585/23626169-3435-5db3-c9e0-3a054d118b3c.png)

対象を見つけたら、右クリック ➔ `フィルターに追加` ➔ `許可` または `拒否` を選択します。

今回は、例として拒否を選択しました。

![スクリーンショット 2018-05-16 15.03.37.png](https://qiita-image-store.s3.amazonaws.com/0/127585/4ac0e24d-0dd0-b0ce-47ab-a64b2e76ce22.png)

これで、フィルタへの追加は完了です。

フィルタの `拒否` を見てみましょう👀

![スクリーンショット 2018-05-16 15.06.53.png](https://qiita-image-store.s3.amazonaws.com/0/127585/aa187c10-0852-067f-29f0-ef22ae41c52a.png)

はい、 `拒否` に追加されましたね。

このままでは、まだ拒否リストに突っ込んだだけなので

有効化してあげましょう。

![スクリーンショット 2018-05-16 15.09.29.png](https://qiita-image-store.s3.amazonaws.com/0/127585/48d7637d-a043-6253-1e61-e897678e8314.png)

`拒否` を右クリックし、有効化を選択します。

この時点で、 `拒否` に登録されているMACアドレスには

IPアドレスがリースされなくなります。

実際の挙動を見てみましょう😃

### 有効化する前

正常にスコープ内のIPアドレスを取得し、Googleへアクセス出来ています。

![d1.PNG](https://qiita-image-store.s3.amazonaws.com/0/127585/6ce2cb83-7f8c-7533-fd22-5b327cec0ee7.png)

### 有効化した後

`ipconfig /release` `ipconfig /renew` でIPを更新しました。

すると、IPアドレスを引っ張ってこないですね・・・:thinking_face:

正解です:ok_woman:

![d2.PNG](https://qiita-image-store.s3.amazonaws.com/0/127585/2331490a-7d93-cf22-e261-60afdfcac276.png)

これで、フィルタリング完了です:bow:
SQL の結合方法について

#はじめに
このブログは授業で受けた内容のまとめや感想などを記述しています

今回はSQLの結合について少しまとめてみました。

#まずテーブルの結合とは

他のテーブル同士をまとめることです。
例えば、AテーブルとBを作り、AテーブルとBテーブルを別々に調べてから検索結果を合わせていると、時間がかかってしかたがないです。
なので、AテーブルとBテーブルをまとめてから検索すると、時間の短縮もでき、何よりも見やすいです。
結合にもいろいろなものがあるので今回はそちらのほうをブログに書こうと思います。

##inner join(内部結合)

inner joinはそれぞれのテーブルの指定したカラムの値が一致するものだけを結合するものです。
inner joinの構文は

```

select * from テーブル名
inner join 結合したいテーブル名
on テーブル名.フィールド名=結合したいテーブル名.フィールド名;
```
になります。
##left outer join(左外部結合)
###left outer joinは外部結合の一つで、左側のテーブルを軸として外部結合を行います。
内部結合とは違い、外部結合は、それぞれのテーブルに指定したカラムの値が一致するものを結合するのに加えどちらかのテーブルにしか存在しないものに関しても取得します。
###基本構文は

```
SELECT * FROM テーブル名
LEFT(RIGHT) OUTER JOIN 結合したいテーブル名 ON 結合条件
```
になります。

##Cross Join(クロス結合)

cross joinは各テーブルに存在する行同士の全ての組み合わせを得ることができます
###基本構文は

```
SELECT * FROM テーブル名 CROSS JOIN 結合したいテーブル名;
```

になります。

##natural join(自然結合)

natural joinは内部結合や外部結合の後ろにNATURALキーワードを指定することで、カラム名を指定しなくても、二つのテーブルで同じ名前のカラム名を使って結合を行います。
###基本構文は
内部結合の場合

```
SELECT * FROM テーブル名1 NATURAL INNER JOIN テーブル名2;
```

仕様変更に対応するとき大変になるので
NATURALは使用せず、JOINで全て結合条件を書くことをお勧めします。

外部結合の場合

```
SELECT * FROM テーブル名1 NATURAL LEFT OUTER JOIN テーブル名2;
```

になります。
React native で iOSサンプルアプリ(シミュレータ)を立ち上げてみた

作業環境はmacOS。

Xcodeのシミュレータが最終的に立ち上がる手順。
Xcodeはよくライセンス条項が更新されたりして、確認を求められる事が多いので、一度起動して、必要に応じてライセンス条項に同意、等をしておくと良いかもしれない。

* https://facebook.github.io/react-native/docs/getting-started.html

**「Building Projects with Native Code」** タブを開き **「macOS」 「iOS」** が選択されている事を確認（選択されていなければクリック）

**基本的には上記URLの手順の通りにやれば良い。**

**「英語を読むのが面倒だ！」「俺は今直ぐコピペで React native したいんだ！」**と言う人（主に自分）の為に、以下実際に叩くコマンドのみを抜粋した。

```
$ brew install node
$ brew install watchman
$ npm install -g react-native-cli
$ react-native init AwesomeProject
$ cd AwesomeProject
$ react-native run-ios
```

2行目の `brew install watchman` はオプションっぽい。ただ `highly recommended` `for better performance.` と書かれているので、入れておくのが良さそう。

自分のマシンでは `node` は既にインストール済みであり、そう言った場合 **「npmをアップグレードしてくれ」** と言われる場合がある。 `npm i npm` とすると最新になってくれるようだ。

4,5行目の `AwesomeProject` は**何でも良い**。今は取り敢えず動かしてみたかっただけなので、サンプル通りの名前とした。

6行目、 `react-native run-ios` をすると、シミュレータが立ち上がり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/13836/e30cc7bf-7361-3487-1a74-fb3388851a73.png)

の画面が確認出来る。ただ、この画面が表示されるまで結構時間が掛かった。
**「立ち上がらんやんけ」** とトラブルシューティングを見ていた。
10分またはそれ以上の時間が掛かった気もする。気長に待とう

この時、コンソールがもう一個立ち上がるが、こいつが立ち上がっている限り、`Cmd + R` で変更したコードがリロードされる（素晴らしい）。

確認が不要になったら、このサブのコンソールは落としてしまって構わない（Ctrl+Cとかで）
railsでwebpackerを使用する際、Error: Chunk.entrypointsが出てハマった

# 概要
railsもwebpackもズブの素人がハマった軌跡。

# 環境
* Windows 10 Pro(Windows Subsystem for Linux)
* rails 5.2.0
* ruby 2.5.0
* webpacker 3.5

# 現象  
`webpack-dev-server`を実行すると下記エラーが出る。  

```log
(node:20569) DeprecationWarning: Tapable.plugin is deprecated. Use new API on `.hooks` instead
/xxxxx/Desktop/testProject/node_modules/webpack/lib/Chunk.js:712
        throw new Error(
        ^

Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead
    at Chunk.get (/xxxxx/Desktop/testProject/webpack/lib/Chunk.js:712:9)
    at /xxxxx/Desktop/testProject/node_modules/extract-text-webpack-plugin/dist/index.js:176:47
    at Array.forEach (<anonymous>)
    at /xxxxx/Desktop/testProject/node_modules/extract-text-webpack-plugin/dist/index.js:171:18
    at AsyncSeriesHook.eval [as callAsync] (eval at create ...(省略)

```

# 原因
**extract-text-webpack-plugin** のバージョンの問題の模様。
自環境ではwebpackerのバージョンが3.5で、webpack自体はバージョン4系を使用していたのが原因か。
パッケージの依存性管理とかよくわかってないのに色々やりすぎるもんじゃないなぁ・・・。

# 解決策
下記いずれかで解決するものと思われる。
1. **extract-text-webpack-plugin@nextをインストールする。**
下記参照。
[Webpack 4 · Issue #760 · webpack-contrib/extract-text-webpack-plugin · GitHub](https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/760)
救済措置(?)として公式からアナウンスが出ているようです。  
2. **webpackerをupdateする。**
私はこちらの方法で直りました。
キッカケはpackage-lock.jsonとyarn.lockを見たとき。
前述のプラグインをremoveして1番の方法をとってみました。
が、package.jsonからは消えているのに、package-lock.jsonからは消えていませんでした。
また、webpackerのdependenciesには以前のバージョンが・・・。
と、いうわけで下記コマンドを実行。

```Shell
$ yarn add @rails/webpacker@4.0.0-pre.2
$ npm install
```

動いた・・・。
ただしバージョンにpreって書いてあるので保証はできませぬ
# まとめ
中途半端に最新バージョンばっかり使うと痛い目を見るので
バージョン管理はきちんとしましょう。
また、最新技術を学びたいからといってあれやこれや手をつけすぎないように。
自戒の意味も込めて・・・。

# 余談
まだyarnとかnpmとか使い始めたばかりで、yarn.lockとpackage-lock.jsonが
同一フォルダ内に共存している状況は果たして正解なのかがわかりません。
その当たり、わかる方がいらっしゃいましたらご教授願います。
railsも覚えなきゃ...
MonacaアプリのAndroid端末へのプッシュ通知設定

#MonacaアプリでAndroid端末へプッシュ通知を送る#
Monacaで開発したアプリでAndroidへのプッシュ通知を可能にするには、以下の3つの手順を踏む必要があります。

1. 「サーバーキー」と「送信者ID」の取得
2. 「サーバーキー」の設定
3. 「送信者ID」の設定


「サーバーキー」をmonacaの設定の「APIキー」（）
[iOsでmonacaのアプリをリリースする場合](https://qiita.com/TaskForceYokohama/items/d57ed4ba5947db33122a)、証明書やプロ…ファイルが必要だったりして煩雑でしたが、Androidはサーバーキーと送信者IDのみ分かっていれば大丈夫なようです。


###1.「サーバーキー」と「送信者ID」の取得###


①[Firebase](https://console.firebase.google.com/)にアクセスします。

②「プロジェクトを追加」をクリックし、プロジェクト追加画面の各項目を入力して「プロジェクトを作成」ボタンをクリックします。
![Andr1.png](https://qiita-image-store.s3.amazonaws.com/0/256202/1de92946-0495-a605-0680-1ca1008cb47b.png)

③次の画面で「次へ」をクリックし、コンソール画面が表示されたら「プロジェクトの設定」をクリックします。
「サーバーキー」と「送信者ID」が表示されているので控えておきましょう。
![Andr2.png](https://qiita-image-store.s3.amazonaws.com/0/256202/742d00a5-30e8-3c54-2a6e-88aac0992486.png)

以上で「サーバーキー」と「送信者ID」の取得の手順は終了です。

###2.サーバーキーの設定###
サーバーキーをmonacaアプリと紐づける設定を行います。

①[mobile backend](http://mb.cloud.nifty.com/)にログインしてプッシュ通知を設定するアプリを選択し、「アプリ設定」＞「プッシュ通知」と進みます。


②「Androidプッシュ通知」の「APIキー」に先ほど取得した「サーバーキー」を入力します。
>APIキーとは、あるWebサービスが持つサイトの機能を、外部のサイトやアプリケーションから利用できるようにする際に発行する暗号鍵のこと。（[参考](www.nan-paso.com/w-1459.html)）

③「保存する」ボタンを押したらサーバーキーの設定は終了です。
![Andr3.png](https://qiita-image-store.s3.amazonaws.com/0/256202/8e123a0e-6f79-a1ac-cc08-7049a32f2377.png)

###3.送信者IDの設定###
①\<script>\</script>タグ内の「送信者ID」を入力する部分に、1．で取得した「送信者ID」を書き込んで保存したら終了です。
![Andr4.png](https://qiita-image-store.s3.amazonaws.com/0/256202/1e5627f0-1d61-1c6f-d647-05f3b2587e74.png)
【MarkLogic】クエリコンソールで使う検索系XQuery集

# はじめに

ドキュメントが増えてくると、
クエリコンソール上でドキュメントを探すのが大変になってきます。
なので、XQueryで条件指定して検索する必要性が出てきます。

この記事では検索クエリをまとめています。

# 環境

* OS：Windows7 (64bit)
* MarkLogic (9.0-3.1)
* 検索対象は JSONデータ を想定

# XQuery

検索系XQueryをまとめています。

## xdmp:directory で検索

xdmp:directoryの詳しい説明は[公式ドキュメント](https://docs.marklogic.com/xdmp:directory)を参照して下さい。

### ディレクトリを指定して検索

```bash:XQuery
xquery version "1.0-ml";

for $x in xdmp:directory("/xxx/yyy/zzz/", "1")
return xdmp:node-uri($x);
```

### ディレクトリ指定、かつ、条件指定

完全一致

```bash:XQuery
xquery version "1.0-ml";

for $x in xdmp:directory("/xxx/yyy/zzz/", "1")[aaa/bbb = "12345"]
return xdmp:node-uri($x);
```

比較

```bash:XQuery
xquery version "1.0-ml";

for $x in xdmp:directory("/xxx/yyy/zzz/","1")[aaa/ccc < "2018-01-01T00:00:00"]
return xdmp:node-uri($x);
```

## cts:search で検索

cts:searchの詳しい説明は[公式ドキュメント](https://docs.marklogic.com/cts:search)を参照して下さい。

### ディレクトリを指定して検索

```bash:XQuery
xquery version "1.0-ml";

for $x in cts:search(fn:doc(),
            cts:and-query((
              cts:directory-query("/xxx/yyy/", "1")
            ))
          )
return xdmp:node-uri($x)
```

### ディレクトリを指定、かつ、条件指定

しれっとコレクションも指定しています。

```bash:XQuery
xquery version "1.0-ml";

for $x in cts:search(fn:doc(),
            cts:and-query((
              cts:directory-query("/xxx/yyy/", "1")
              ,cts:collection-query("ZZZZZ")
              ,cts:json-property-value-query("aaaaa", "AAAAA")
              ,cts:json-property-value-query("bbbbb", 99999)
            ))
          )
return xdmp:node-uri($x)
```

# 小ネタ

関係が薄い小ネタを少々

## ログ

xdmp:log("xxxxxxxxxx"); ってすると、ErrorLog.txt にログが出力されます。
[公式ドキュメント](https://docs.marklogic.com/xdmp:log)

## 件数

xdmp:directory、cts:searchのどちらも記載したクエリを `fn:count()` で囲ってあげると件数のみ取得できます。クエリコンソール上では役に立ちませんが、
XQueryをサーバ上に配置して Eval とかで利用するときに使用することがあるかもしれません。

以上
Xcodeでprofile doesn't include the beta-reports-active


![スクリーンショット 2018-05-16 14.55.38.png](https://qiita-image-store.s3.amazonaws.com/0/97817/61b83ec4-35f9-93d5-11bd-41e003dde8a5.png "スクリーンショット 2018-05-16 14.55.38.png")

Releaseのビルドを作成しようとした際に以上の"profile doesn't include the beta-reports-active"エラーが出て作成できなかった。

## 原因
どうやらxcode9.3のバグのよう。
アップデートなんて待ってられないので一旦9.2に下げて無事ビルドできました。
授業学習　Ubunts

#授業の学習をメモとして残します。

#Ubuntuでのコマンド試し
今回はviエディタの基本的な使い方を少し覚えました。

#使ったコマンド一覧
:q = セーブせず終了
:q! = 変更した行もセーブせずに終了
:w = セーブするが終了しない
:wq = セーブして終了

i = 現在のカーソル位置から挿入
yy = １行コピー
p = 張り付け
:set number = 行番号表示
あとは/でキーワード検索をよく使いました。
#まとめ
いろいろなコマンドを使っていって覚えていきたいと思います。
Ubuntuでやったこと

###始めに....
---
今日は、授業でいろいろなコマンドを実行させてみました。
授業でやった内容をつらつら書いていきまーす

###種類
---
cal ・・・こいつはカレンダーを表示させます。
　　　　　例）cal 9 1900   ←これは1900年9月のカレンダーを表示
　　　　　例）cal 2100  ←これは2100年のカレンダーを表示
logout・・・これは、ターミナル・エミュレータのウィンドウのみを
　　　　　　ログアウトする時に使用する
echo・・・これは文字列を表示する時に使用する
　　　　　例）echo Hello
　　　　　　　Helloが表示される（はず）
cp・・・フォイルをコピーするために使う
　　　　例）cp[コピー元のファイルパス][コピー先のファイルパス]

###apt get
---
パッケージをアップデートする
sudo apt-get update

###vim
---
下記コマンドでvi(vim)を最新の状態にしておく
~$ sudo apt-get -y install vim

###SSH
---
下記コマンドでインストール後、SSH接続できます。
~$ sudo apt-get -y install ssh

###Apache Ver2.4.18
---
1.Apacheのインストール
~$ sudo apt-get -y install apache2

2.Version確認
~$ apache2 -v

3.Apacheサーバの起動
~$ sudo /etc/init.d/apache2 start

###PHP Ver7.0
---
1.PHPのインストール
~$ sudo apt-get -y install php php-mysql libapache2-mod-php libapache2-mpm-itk

2.PHPの設定
~$ sudo vi /etc/php/7.0/apache2/php.ini
「extension=msql.so」のコメントアウト「;」を削除し、有効化する。

3.Version確認
~$  php -v

4.apacheの再起動
~$ sudo /etc/init.d/apache2 restart

###MySQL Ver5.7.13
---
1.MySQLサーバのインストール
~$ sudo apt-get -y install mysql-server
※インストール中、MySQLのrootパスワードの設定を求められるので、設定する。

2.Version確認
~$ mysqld -V

3.MySQLにログイン
~$ mysql -u root -p

3.データベース作成
WordPressで使用するデータベース(今回は「wordpress」とするが任意で変更可)を作成する。
mysql> create database wordpress;

4.MySQLから切断
mysql> exit;

5.外部から接続させるための設定編集
~$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

6.下記をコメントアウトする
bind-address = 127.0.0.1
↓
bind-address = 127.0.0.1(前にシャープの記号をぶち込む)

7.MySQLの再起動
~$ sudo /etc/init.d/mysql restart
~$ sudo /etc/init.d/mysql start ←起動
~$ sudo /etc/init.d/mysql stop ←停止

####最後に...

ありがとうございました。
■Voice Text Web API を使って音声合成をしてみた件

##**■はじめに**
・音声認識により操作が色々と出来るようになって来ているのに伴い、音声合成による出力も注目が集まって来ている。一昔前の機械的な音声に比べかなり人の音声に近づいて来ている。
・今回、”HOYA Voice Text Web API　詳細は[こちら](https://cloud.voicetext.jp/webapi)”　を使ってWEBサービスの音声合成（無料）を使ってみたところ思った以上に簡単に実現できたので忘れないうちに**備忘録**として残す
※この記載では、APIを叩いて特定のテキスト文章を渡し、リターンとして音声ファイルをダウンロード。再生が正常にできる事を確認

▲初投稿：2018-05-14

##**■用意したもの**
・HOYA Voice Text Web APIキー・・・音声合成クラウドサービスのAPIキーを入手 詳細は[こちら](https://cloud.voicetext.jp/webapi/api_keys/new)　

**！！！注意事項！！！**
・無料版で作成した音声データの商用利用、二次利用及び配布する行為は禁止されております。利用規約をご確認の上、本サービスをご利用ください

##**■やってみよう！**
###**■■とりあえず実行してみよう**
・実際に音声合成クラウドサービスにリクエストを送ってみましょう。ここでは"curl"というコマンドラインツールを使います。別に他のツールでも構いませんので、自分の使い易いツールで実行してみてください

**［例：女の子の声で”おはようございます”］**

```
curl "https://api.voicetext.jp/v1/tts" -o "test.wav" -u "YOUR_API_KEY:" -d "text=おはようございます" -d "speaker=hikari"
```

※YOUR_API_KEY　のところを入手したAPIキーに書き換えて下さい。
　例）APIキーが 12345 だった場合

```
curl "https://api.voicetext.jp/v1/tts" -o "test.wav" -u "12345:" -d "text=おはようございます" -d "speaker=hikari"
```

成功すると、音声ファイル（”test.wav”）がダウンロードされますので、再生してみましょう。

###**■■パラメータ説明**
・”Voice Text Web”では、いくつかのパラメータが用意されており、それを変える事により色々な趣向な音声データを作ることが出来ます。詳細は[こちら](https://cloud.voicetext.jp/webapi/docs/api)　

|パラメータ	|説明	|制限	|初期値|
|:-----------|:------------|:------------|:------------|
|text	|合成するテキスト。エンコーディングは UTF-8	|必須 |Unicode で 200 文字以内|	
|speaker	|話者名。下記の中のいずれかを指定します（全て日本語）	|必須|	|
|| show(男性) |||
|| haruka(女性) |||
|| hikari(女性) |||
|| takeru(男性) |||
|| santa(サンタ) |||
|| bear(凶暴なクマ) |||
|format	|音声ファイルフォーマット。以下のいずれかを指定します||wav|
||wav(圧縮無し)|||
||ogg(Ogg Vorbisフォーマットでの圧縮)|||
||mp3(MP3フォーマットでの圧縮)|||
|emotion	|感情カテゴリの指定 話者 haruka、hikari、takeru、santa、bear にのみ使用できます。 以下のいずれかを指定します|||
||happiness 喜|||
||anger 怒|||
||sadness 悲|||
|emotion_level	|感情レベルの指定。1〜4を指定できます。数値が大きいほど感情が強くなります		||2|
|pitch	|音の高低を数値で指定します。値が小さいほど低い音になります	|50から200(%)まで	|100(%)|
|speed	|話す速度を数値で指定します。値が小さいほど遅い話し方になります	|50から400(%)まで	|100(%)|
|volume	|音量を数値で指定します。値が小さいほど小さい音になります	|50から200(%)まで	|100(%)|

###**■■感情設定を使って実行してみよう**

**［例：元気な女の子の声で”おはようございます”］**

```
curl "https://api.voicetext.jp/v1/tts" -o "test20.mp3" -u "YOUR_API_KEY:" -d "text=おはようございます" -d "speaker=haruka" -d "emotion=happiness" -d "emotion_level=4" -d "pitch=110" -d "speed=125"
```

**［例：気迫がこもった感じで”バナージリンクス。ユニコーンガンダム行きまぁーす！”］**

```
curl "https://api.voicetext.jp/v1/tts" -o "test21.mp3" -u "YOUR_API_KEY:" -d "text=バナージリンクス。ユニコーンガンダム行きまぁーす！" -d "speaker=takeru" -d "format=mp3" -d "emotion=anger" -d "emotion_level=4" -d "pitch=125" -d "speed=135" -d "volume=180"
```

**［例：ドスが効いたヤ●●系のプーさんで”蜂蜜食べたいなぁ”］**

```
curl "https://api.voicetext.jp/v1/tts" -o "test22.wav" -u "YOUR_API_KEY:" -d "text=蜂蜜食べたいなぁ" -d "speaker=bear" -d "emotion=anger" -d "emotion_level=4" -d "pitch=80" -d "speed=80"
```

・簡単に変えた音声を確認出来ますので、色々と試してみて下さい！

##**■参考**
・HOYA Voice Text Web API　・・・　[こちら](https://cloud.voicetext.jp/webapi)　
・Qiita(KSxRDevelop)　・・・　その他の情報は[こちら](https://qiita.com/KSxRDevelop)
Let’s Encryptの使い方。standaloneとwebroot

#Let's encrypt(Let's Encrypt 認証局)とは
まずはここから簡単に解説を。「無料のSSL」です。通常、年間３万円程度費用がかかるイメージでしたが、そのために普及が遅れてしまっては、インターネットの発展がなかなか進まない、ということもあってインターネット界隈の主要な会社たちが集まって、無料の認証局を作ろうということになりました。

**以下、日本語訳抜粋。**
>Let's Encrypt を運営している Internet Security Research Group (略称：ISRG) は、アメリカ合衆国カリフォルニア州にある公益法人で、アメリカ合衆国内国歳入法 Section 501(c)(3) による非課税法人として、アメリカ合衆国内国歳入庁 (IRS) による承認を受けています。
>インターネットを介した安全な通信を行う際の、経済面・技術面・教育面での障壁を減らすことが、ISRG の使命です。

*※ココ最近、２０１８年３月時点で、ワイルドカード証明書が使えるようになりました。１つの証明書で複数のサブドメインを運用可能ということです。この設定方法については、また改めて書きます。*

簡単な使い方については、[Let's Encrypt 総合ポータル](http://...)にあります。
けっこうドキュメント量が多いので、まず設定する前に、大事なポイントがあります。
そこで一番重要になるのは、証明書取得時、および更新時に**サーバーを停止する必要がある**かどうか、という点です。それが、standaloneだったりwebrootとなります。



##standaloneとwebrootとは

Let's Encryptでの証明書はstandaloneとwebrootがあります。
###standalone
standaloneって何なん？ってことで、
[【Let's Encrypt 総合ポータル-ユーザーガイド-Standalone プラグイン】](https://letsencrypt.jp/docs/using.html#standalone)
ここに書いてあります。

これは、Let's Encryptのコマンドであるcertbot-autoがwebserverとしての機能も持っているため、それを使って設定するってことです。standaloneという名前の通り、webserverがなくても証明書の取得設定ができるよ、というものです。



standaloneの場合、このcertbot-autoが持っているweb serverを利用する、つまり、
設定するのに80（HTTP)と443（HTTPS)のポートを使用するので、すでにapacheやngiｎxでWebサーバが動いていると動きません。**←ここ重要**



ということは現在稼働しているウェブサービスを一度停止させる必要があり、停止させるということは、運用上の問題が出る場合があります。
そこでwebrootモードを使うのです。
稼働中のサービスを落とさずにSSL証明書の発行および更新ができるのです。

##webroot

コマンドは、certbot-auto
です。古いドキュメントでは、letyencryptだったりcertbotだったりしますが、最新は、certbot-autoだと思ってくださればOKです。

私の場合は、certbot-autoを実行可能な、/usr/local/sbinに配置してどでも実行できるようにしました。


おっと、その前に、準備が必要です。
今回SSLを設定する必要のある、ドメイン名で（今回はnginx）にhttpでアクセスできる状態としておくことです。
**DNSの設定と、nginx(apache)の設定が終わっていることが条件です。**


コマンド実行の初回のみいろいろきいてくるのですが、コマンドは、新しいものを登録するときも一つだけ。以下。
rootで実行。

```bash:command
certbot-auto certonly --webroot -w /var/www/sample/public -d xxxx.sample.com
```
-w は、webrootのディレクトリを指定。この中にファイルを書き込みます。そのファイルをhttp(80)でアクセスするのでアクセスできる状態としておくこと。

-dは、ドメイン名。複数指定可能。複数指定するときは、-d xxx.sample.com -d xxx2.sample.comと書いていく。

実行するとメッセージがでてきて、FaildやErrorの文字がなくSuccessという文字が見えたら成功です。

以下の２つのファイルができているので、nginxやapacheの設定ファイルで読み込むように設定して、webserverをリスタートすればOKです。

/etc/letsencrypt/live/xxxx.ample.com/fullchain.pem
/etc/letsencrypt/live/xx2.ample.com/privkey.pem
Flutterでのテキストを折り返す

Flutterでなにも指定しなければテキストは突き抜けてしまいます。

例えばこんなコード

```dart
new Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: <Widget>[
      new Container(
           padding: new EdgeInsets.all(5.0),
           child: new Text(
             "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
             style: new TextStyle(fontWeight: FontWeight.bold),
           ),
     ),
     new DefaultTextStyle(
       style: new TextStyle(color: Colors.black),
       overflow: TextOverflow.ellipsis,
       child: new Padding(
            child: new Text("ああああああああああああああああああああああああああああああ"),
            padding: new EdgeInsets.only(top: 10.0),
       )),
  ],
)
```

<img width="368" alt="スクリーンショット 2018-05-16 14.34.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/82f01425-727d-f754-c6e4-12622d9ed332.png">

## Flexibleを使う

`Flexible` を使うと中のテキストをその中のWidgetをラップするのでテキストが改行されずに表示されるようになります。


```dart

new Flexible(
   child: new Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
              new Container(
                   padding: new EdgeInsets.all(5.0),
                   child: new Text(
                      document["title"],
                      softWrap: true,
                      style: new TextStyle(fontWeight: FontWeight.bold),
                      ),
                   ),
              　new DefaultTextStyle(
                 style: new TextStyle(color: Colors.black),
                 overflow: TextOverflow.ellipsis,
                 maxLines: 3,
                 child: new Padding(
                     child: new Text(document["description"]),
                     padding: new EdgeInsets.only(top: 10.0),
                 )),
         ],
   ),
)
```

<img width="365" alt="スクリーンショット 2018-05-16 14.39.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/139360/425273d6-8e66-0992-a021-0f0ff52dfec3.png">


`maxLines: 3,` みたいな指定もすると3行だけ表示して残りは `...` みたいなこともしてくれます。
FTPサーバとのやりとりをcurlコマンドで行う

いままではCyberDuckを使っていたのですが、curlコマンドも便利らしいということで使ってみました。
curlというとhttpで使うイメージが強いですが、ftpにも対応しています。

## ファイル一覧を見る
ftp://と続けてディレクトリを指定する。
指定したディレクトリ内のファイル一覧が表示される。

```
$ curl -u {user}:{pass} ftp://{host}/{path to directory}
```

## 特定のファイルの内容を表示する
ftp://と続けてファイルパスを指定する。
ファイルの内容が標準出力に表示される。

```
$ curl -u {user}:{pass} ftp://{host}/{path to file}
```

## ファイルをダウンロードする
Oオプションを指定することでカレントディレクトリにファイルをダウンロードできる。

```
$ pwd
~/dev/tmp(一例です）

$ curl -u {user}:{pass} -O ftp://{host}/{file}
```
Slack の XMPP サポート終了で溶鉱炉に沈んでいった ruboty たちを引き上げる手順

2018/05/15 に Slack の XMPP サポートが終了した事により、 
ruboty-slack Adapter で Slack 上の ruboty を動かすことができなくなりました。

* [Slack updates and changes – Slack Help Center](https://get.slack.help/hc/en-us/articles/115004846068-Slack-updates-and-changes)

ruboty の Adapter を [ruboty-slack](https://github.com/r7kamura/ruboty-slack) から [ruboty-slack_rtm](https://github.com/rosylilly/ruboty-slack_rtm) に変更することで、
引き続き ruboty を利用することができます。

## 手順
* Bots から bot ユーザーを追加する
* 環境変数 SLACK_TOKEN にトークンを設定する
* ruboty-slack で利用していた環境変数を削除する
  * [r7kamura/ruboty-slack: Slack adapter for Ruboty.](https://github.com/r7kamura/ruboty-slack)
* Gemfile の `ruboty-slack` を `ruboty-slack_rtm` に変更
* デプロイ先に最新コードを反映する
* デプロイする
* もとの ruboty 用 user を非アクティブ化する
* 必要な channel に新しい bot user を Invite する

## 注意事項
* Redis に保存してある情報はそのまま残っているので特に対応不要
* Bot user名依存の情報を job などに登録している場合
    * 古い user 名依存の情報を削除
    * 新しい user 名で再登録

## まとめ
ruboty おかえりなさい

## 感謝
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ruboty の XMPP 終了対応のために Adapter を ruboty-slack_rtm にした。すんなり動いた。ruboty の設計と ruboty-slack_rtm の作者である rosylilly さんのおかげだ<a href="https://t.co/18hFEvwb6z">https://t.co/18hFEvwb6z</a></p>&mdash; てぃーびー 📺 (@tbpgr) <a href="https://twitter.com/tbpgr/status/996336481923776512?ref_src=twsrc%5Etfw">2018年5月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ruboty-slack_rtm を利用する際に Star をつけていくとよいと思います

## 補足
* 各自の環境の gem のバージョンの関係でエラーなど出るかもしれませんが、それは各自で解決するということで、ここではそういった問い合わせに対して特に調査は行いません
ask-sdk(v2)のスロット、attribute


# 前提

`fruit`スロットというものがあって、値は以下の通り

```
みかん
[類義語]
オレンジ
[id]
mikann
```

`drink`スロットがあって以下の通り

```
お茶
[類義語]
茶
紅茶
[id]
otya
```

`sampleIntent`というものがあって、サンプル発話は以下の通り

```
{fruit} と {drink} が飲みたい
// 例 みかんとお茶が飲みたい
```

# スロット

ユーザーが以下のように発話をしたとする

```
アップルと紅茶が飲みたい
```

## そのまま取得

アップルと、紅茶を取得

```js
var request = handlerInput.requestEnvelope.request;
var fruit = request.intent.slots.fruit.value;
var drink = request.intent.slots.drink.value;
console.log(fruit, drink); // アップル 紅茶
```

## 類義語ではなく大元の単語で取得

りんごと、お茶で取得

```js
var request = handlerInput.requestEnvelope.request;

if(request.intent.slots["fruit"].resolutions.resolutionsPerAuthority[0].values){
  var fruit = request.intent.slots["fruit"].resolutions.resolutionsPerAuthority[0].values[0].value.name;
}

if(request.intent.slots["drink"].resolutions.resolutionsPerAuthority[0].values){
  var drink = request.intent.slots["drink"].resolutions.resolutionsPerAuthority[0].values[0].value.name;
}
console.log(fruit, drink); // りんご お茶
```

## id取得

```js
var request = handlerInput.requestEnvelope.request;

if(request.intent.slots["fruit"].resolutions.resolutionsPerAuthority[0].values){
  var fruit = request.intent.slots["fruit"].resolutions.resolutionsPerAuthority[0].values[0].value.id;
}

if(request.intent.slots["drink"].resolutions.resolutionsPerAuthority[0].values){
  var drink = request.intent.slots["drink"].resolutions.resolutionsPerAuthority[0].values[0].value.id;
}
console.log(fruit, drink); // ringo otya
```

# セッションAttribute

## 保存

```js
var attributes = {
  "key": "value"
}
handlerInput.attributesManager.setSessionAttributes(attributes);
```

## 取得

```js
var attributes = handlerInput.attributesManager.getSessionAttributes();
console.log(attributes.key); // value
```
EC2 に MariaDB をインストール

```:リポジトリ設定
$ sudo vi /etc/yum.repos.d/MariaDB.repo

# MariaDB 10.1 CentOS repository list - created 2016-03-13 07:22 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

```:インストール
$ sudo yum install -y MariaDB-server MariaDB-client mysql-devel
```

```:起動
$ sudo service mysql start
Starting MariaDB.180516 14:32:36 mysqld_safe Logging to '/var/lib/mysql/YOURHOSTNAME.err'.
180516 14:32:36 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
 SUCCESS! 
```

```:基本設定
$ mysql_secure_installation

Enter current password for root (enter for none): エンター （rootパスワードなしでOK）

Remove anonymous users? [Y/n] エンター （他ユーザのログインは許さない）

Disallow root login remotely? [Y/n] エンター （リモートログインは許さない）

Remove test database and access to it? [Y/n] エンター （テストDBは削除）

Reload privilege tables now? [Y/n] エンター（特権テーブルリロード）

...

Thanks for using MariaDB!

```
ReactのPromiseって何?

## 1. Promiseとは？

Promiseとはその名の通り**約束**のことです。
Promiseを使う場合は何かの処理を施して、その結果が戻ってくることが約束されています。

結果は**成功(Resolve)**もしくは**失敗(Reject)**のどちらかの方法で帰って来ます。

```.js

const iceCreams = ["strawberry", "chocolate", "vanilla"];
const iceCreamType = "lemon";

getIceCream = (iceCreamType) => {
  return new Promise((resolve, reject) => {
    if(iceCreams.indexOf(iceCreamType) > -1){
      resolve(iceCreamType);
    } else {
      reject("There is no ice cream");
    }
    
  };
}

```

ここの関数では、アイスクリームがあるかどうか確認しています。この場合、配列の中に"lemon"がなかったので、Reject()が帰ってきます。

エラーハンドリングする時に超便利です。


## 2. Promiseの同期処理

Promiseの良いところは非同期処理ができるところです。例えば、上記のように同時処理を行いたいときは、以下の様に書ける.

```.js

const getIceCream = () => new Promise((resolve, reject) => { ... });
const getFood = () => new Promise((resolve, reject) => { ... });
const getDrink = () => new Promise((resolve, reject) => { ... });

const [ iceCream, food, drink ] = await Promise.all([ 
  getIceCream(),
  getFood(),
  getDrink(),
]);

return { iceCream, money, food };
```

**await**を前に置くと、処理が終わるまで待ってくれます。
ただし、Promise.all()の中は同時処理されているので、それぞれの関数が同じタイミングで処理されています。結果は関数の順番どおりです。getIceCream()の結果はiceCreamで、以下同文。

**awaitとthenは同じ**なので、以下の様な書き方もできます。

```.js

return Promise.all([ 
  getIceCream(),
  getFood(),
  getDrink(),
]).then([ iceCream, food, drink ]) => ({ iceCream, food, drink });

```

もちろん、この処理は簡単なので同期処理する必要もないのですが、apiコールや大きいデータを呼ぶ時はとても役に立ちます。


## Promiseのtry & catch

リアルなアプリでは、エラーハンドリングを必ずしなければいけないのと、その結果を表示させなければいけないので、try / catchと一緒にPromiseを使います。

```
const getAllFood = async () => {
  try {
    const [iceCream, food, drink] = await Promise.all([
      getIceCream(),
      getFood(),
      getDrink(),
    ]);

    const allFoods = {
      iceCream,
      food,
      drink
    };
    return allFoods;

  } catch (error) {
    return Promise.reject(error);
  }
};

getAllFood()
  .then(allFoods => console.log(allFoods))
  .catch(error => console.log(error));

```

try / catchの中で、Promiseの同期処理を行い、エラーが出た場合は、コールバックでキャッチしていて、必ず何かを返す様にしています。



ここに良記事があるのでよろしければ
https://dev.to/mrm8488/using-es6-array-destructing-with-promises-cco
EC2のCPUの数を変えたり、Hyper Threadingオフったり

https://aws.amazon.com/about-aws/whats-new/2018/05/introducing-optimize-cpus-for-amazon-ec2-instances/?nc1=h_ls

2018年５月８日にリリースされたEC2に対する新しい機能。"Introducing Optimize CPUs for Amazon EC2 Instances"とありますが、平たく言えばEC2起動時にCPUの数を調整したり、Hyper Threadingをオフにしたりできます。

HPC/CAE/EDA屋さんは、すごく嬉しい機能。全てのリージョン、t2以外のすべてのインスタンスですでに有効。EDAのライセンスで言えば、マシンのもつコア数で費用払ってるので、ライセンス節約になる非常に重要な機能だと思います。

2018年5月16日現在、この機能はAWSCLIのみで利用可能になっています。やっててよかったAWSCLI。こういった新機能だと3rd party toolsやGUIの対応は少し遅れるのでAWSCLIのありがたみを感じます。

まずは普通にrun-instances。r4.xlarge(デフォルトで、2 CPU core - 4 vCPU)で検証してみます。インスタンスのオプションはjsonで記述しておきます。

AWSCLIのバージョンはこの時点で最新のもの(v1.15.20)を使いました。古いv1.11.13をつかっていたのですが、それだと古すぎて”--cpu-options”の機能が使えませんでした。

```bash:bash
$ aws --version
aws-cli/1.15.20 Python/2.7.10 Darwin/17.5.0 botocore/1.10.20
```

```AWSCLI:AWSCLI
aws ec2 run-instances --count 1 --cli-input-json file://r4.xlarge.json
```

ログインしてlscpu、普通に2CPU core, 4vCPU見えます。

```bash:bash
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               2300.066
BogoMIPS:              4600.13
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0-3
```

次にHTをオフって、CPU coreを2->1にしてみます。run-instancesコマンドに--cpu-optionsを足すだけです。簡単です。

```AWSCLI:AWSCLI
aws ec2 run-instances --count 1 --cli-input-json file://r4.xlarge.json --cpu-options "CoreCount=1,ThreadsPerCore=1"
```

coreが1になって、HTもオフになってるのがわかりますね。

```bash:bash
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               2300.054
BogoMIPS:              4600.10
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0
```

変更できるCPUの数はなんでもOKというわけでなく、ある程度数字が決め打ちされていますのでご注意ください。詳細は公式ドキュメント参照。
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html
Windows10 Homeでも有線と無線を同時に使える

#Windows10 Homeは有線が大好き
サーバのbondingのように，自宅PCで有線LANと無線LANを併用したかった．

片方の調子が悪くても，もう片方に頑張ってもらうという狙いだ．

有線と言ってもPLC(コンセントLAN)なので，それなりに不安なのである．

ところがWindows10 Homeの既定では無線よりも有線が優先され，<b>有線が繋がっている間は無線接続できない</b>．

有線で不具合が起きても物理的には繋がっている扱いらしく，無線は永遠に接続できないままとなっていた．

#Windows10 Homeは無線に厳しい
Windows10 ProやEducationなど高機能版にはグループポリシー設定があり，ここから接続数の設定を行うことで同時接続が可能となる．

しかしHome版にはグループポリシー管理機能が入っていない．

[Easily Install Group Policy Editor (GPEdit.msc) In Windows 10 Home Edition](https://www.itechtics.com/easily-enable-group-policy-editor-gpedit-msc-in-windows-10-home-edition/)でゴリ押しするも，[ここ](https://jyn.jp/windows-multiple-nic/#i-4)にあるようなWindows接続マネージャが無く轟沈．

[サポート回答](https://support.microsoft.com/ja-jp/help/2835190)にあるようなレジストリエディタ編集も試したが，[HKEY_LOCAL_MACHINE] -> [Software] -> [Policies] -> [Microsoft] -> [Windows] -> [WcmSvc] -> [Local]と来たところで肝心のfMinimizeConnectionsが存在せず爆散．

上記の方法で何とかなる人は，そっちのほうが早い．

ここでは上記の方法でどうにもならなかった場合を書く．

#自動メトリックを操作したらいけた
webの海をさまよい続けて見つけた参考
"[How to use Wireless and Wired Connection both at a same time in Windows 7?](https://superuser.com/questions/479654/how-to-use-wireless-and-wired-connection-both-at-a-same-time-in-windows-7)"

ひたすら文章で回答されていたので，こちらで実際にやった例を示す．

1. まず[コントロールパネル]->[ネットワークとインターネット]->[ネットワークと共有センター]->左側にある[アダプター設定の変更]でいつものネットワークアダプタ一覧を出す．

<br>
2. Wi-Fiアダプタを右クリック->[プロパティ]
![ネットワーク接続.jpg](https://qiita-image-store.s3.amazonaws.com/0/201962/9c145376-ea85-5776-2499-d6f68d2e7fe9.jpeg)

<br>
3. インターネットプロトコルバージョン4(IPv4)のプロパティを開く（IPv6も有効にしているので，後で同じことをする）

![wifiプロパティ.jpg](https://qiita-image-store.s3.amazonaws.com/0/201962/5fa08389-7624-04e4-b2dc-de33e087818c.jpeg)

<br>
4. さらに詳細設定を開く
![ipv4プロパティ.jpg](https://qiita-image-store.s3.amazonaws.com/0/201962/09ce1885-1068-65af-2f6b-943329a841cd.jpeg)

<br>
5. 自動メトリックのチェックを外して手入力．<b>メトリック値は1より大きい必要がある</b>．とりあえず3にした．
![ipv4プロパティ詳細設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/201962/f9986eb4-2f87-dfe7-317e-4ec527505bcd.jpeg)

<br>
6. イーサネット（有線）もWi-Fiと同様にメトリック値を手入力する．このとき有線のメトリック値は「<b>1より大きい＆無線より小さい値</b>」にしなければならない．Wi-Fiのメトリック値を3にしていたので，イーサネットのメトリック値は2にした．

# 同時接続完了？
以前は有線が繋がっていると，無線は接続試行を繰り返しては弾かれる無限ループだった．

設定を終えると，なんと無線が弾かれない．Pingのスピードテスト中に有線を抜き差ししてみたが，できてるっぽい．

同時接続できてるのか，はたまた無線の優先順位を上げて「無線が切れるまで有線は使われてない」のか判断しにくいが，目的は果たせたとしよう．

Windowsは人の貴重な時間を食い潰す悪魔だった．
HomesteadにAsgardCmsをインストールしてみた

# 前置き

Laravel製のCMSとしてはOctoberCMSが有名かと思いますが、ディレクトリ構成がLaravelのデフォルトとは違ったりしてちょっと気に入らなかったので使ってませんでした。

そんな中、偶然AsgardCmsの存在を知ったので、ちょっと使ってみたいと思います。

# AsgardCmsとは

[本家](https://asgardcms.com/)

Laravel5でつくられた多言語対応のCMSだそうです。

# インストール

Homesteadを利用して動かします。Homesteadの環境構築方法などは割愛します。
知りたい方は[このへん](https://readouble.com/laravel/5.6/ja/homestead.html)を参考にしてください。（私が試したHomesteadは7.5.0でした。）

基本的には[公式の導入方法解説ページ](https://asgardcms.com/install)のまま実行していきます。
以下の作業内容はHomestead環境での操作になります。適宜ご自身の環境に合わせて読み替えてください。

## AsgardCMSインストーラー経由

###  AsgardCMSインストーラーをインストール

公式にある通りcomposerを使ってインストール。

```
composer global require asgardcms/asgardcms-installer
```

すんなりいくかとおもいきや、ものすごい長いエラーがでました。以下、抜粋。

> Problem 1
    - Installation request for asgardcms/asgardcms-installer ^0.6.0 -> satisfiable by asgardcms/asgardcms-installer[0.6].
    - Conclusion: remove symfony/console v4.0.6
    - Conclusion: don't install symfony/console v4.0.6
    - asgardcms/asgardcms-installer 0.6 requires symfony/console ~2.7|~3.0

symfony/consoleのversion不整合みたいです。
どうやら、Laravel5.6からsymfony/console v4.0.6になったようです。
今回はlaravel5.6とついでにglobalにデフォルトで入っていたライブラリのすべてをアンインストールして対処します。

```
composer global remove laravel/laravel
composer global remove laravel/envoy
composer global remove laravel/installer
composer global remove laravel/lumen-installer
composer global remove laravel/spark-installer
composer global remove drush/drush
```

不整合を起こしていたsymfony/consoleもアンインストールされたはずです。
では気を取り直して、再度AsgardCmsインストーラーをインストール。

```
composer global require asgardcms/asgardcms-installer
```

うまくいきました。最後に慣例に則ってvesrionを出力しておきましょう。

```
vagrant@homestead:~$ asgardcms -V
AsgardCms Installer 1.0.0
```

### プロジェクト作成

インストーラーをつかってプロジェクトを作ります。
Homesteadをデフォルトで動かしてる場合はnginxのドキュメントルートが/home/vagrant/code/publicになってるはずなので、プロジェクト名はcodeにしておいた方が面倒がございませぬ。

```
asgardcms new code
```

結構時間がかかりましたが、無事インストール完了。

### AsgardCMSのインストール

作成したプロジェクトのディレクトリ（=記事の例だとcodeディレクトリ）に移動して、以下のコマンドを実行します。

```
php artisan asgard:install
```

envファイルを作成するために色々聞かれるので好みで答える。
Homesteadのデフォルトがデフォルトの選択肢になっているっぽい。

> Enter your database driver (e.g. mysql, pgsql) [mysql]:
> Enter your database host [127.0.0.1]:
> Enter your database port [3306]:
> Enter your database name [homestead]:
> Enter your database username [homestead]:
> Enter your database password (leave <none> for no password) [secret]:
> Enter you application url (e.g. http://localhost, http://dev.example.com) [http://localhost]:

以下、管理用のアカウント情報を聞かれるので答えていく。

> Enter your first name:
> Enter your last name:
> Enter your email address:
> Enter a password:
> Please confirm your password:

最後、gitignoreについても聞かれるので好みで答える。

> Do you want to remove composer.lock from .gitignore ? (yes/no) [yes]:
> Do you want to remove package-lock.json from .gitignore ? (yes/no) [yes]:

ここまで終わったらブラウザでアクセス確認。

フロントエンド側は http://localhost
![asgard-front.png](https://qiita-image-store.s3.amazonaws.com/0/69727/e5127e9f-dd63-0d5b-5f06-4177081a085b.png)

バックエンド側は http://localhost/backend
![asgard-back.png](https://qiita-image-store.s3.amazonaws.com/0/69727/99f796d0-98e5-17c5-dd1b-6db42361d28b.png)

# まとめ & 感想

インストールはとても楽でした。これから機能の精査などをしてみたいと思います。Wordpressあたりと比較とかしてみ鯛。
メモアプリを本気で選んでみた

## 結論
### BoostnoteとDropbox Paperの併用

Boostnote: コードを含む内容
Dropbox Paper: それ以外

### 採用理由

#### Boostnote
- 用途をコードスニペットに限定すると最強
- URLを貼り付けると自動でタイトルを補完してくれるのが地味に便利

#### Dropbox Paper
- アイディアをまとめるのに良さそう
- 全メモを横断したTodo管理機能が便利そう

## そもそもメモアプリいらないんじゃないか問題

手元に溜めずにどんどん共有スペースに書いていけばよいのでは？

Qiitaに投稿できる内容 -> Qiitaに下書き
社外に公開できない内容 -> esa.ioに下書き
ごくごく個人的な内容 -> 個人ブログに下書き？

### ブログの下書きは情報ストックとしては機能不足

ブログは当然情報を溜めて整理することには特化していないので、

- 分類機能がない
- 検索機能が足りない

などの問題がある。
なので、ごくごく個人的な内容をメモする場所は最低限確保したい。

### メモを起こす時点でどこに書くか考えたくない
個人的にはこれが大きい。

思いついたことは消えやすいので、余計なことは考えずに書きたい。
メモしたいときに反射的に開くメモアプリが欲しい。

### イメージ

脳内 -> メモアプリ -> Qiita, esa.io, 個人ブログ

## メモアプリに求めること

- Markdownで書けること
- Markdownのまま保存されること
- Syntax Highlightがあること
- クラウドに保存されること
- 非公開が選べること

あったらいいな

- 手書きの内容を簡単に取り込みたい
- スクショや動画も簡単に取り込みたい
- 利用料は月額500円以下だと嬉しい
- Todo管理があったら嬉しい

たぶんいらない

- 共有機能（Qiitaなりesa.ioなりに移す）

## 用途

- サンプルコードやハンズオンをメモする（これが一番多い）
- イベントの内容をメモしながら聞く（月に1~3回くらい）
- 考えを整理する時に雑にメモする（月1~2くらい）

用途でみるとコードスニペットに特化したものがよいか

## 使ってみた感想とか

いろいろ試したが、使ってみてよかったのは以下の３つ

- Dropbox Paper
- Boostnote
- Inkdrop

### Dropbox Paper
気軽に書いて、綺麗に残せる。

#### 感想
- UIがシンプルでオシャレ。
- デザイナーさんに人気のあるのがよくわかる機能群。
- アイディアを整理して残しておくのに良さそう。
- コードスニペットを管理するのには向かないかも。

#### マッチ
- Markdownで書けること：◯
- Markdownのまま保存されること：☓ 独自形式で保存
- Syntax Highlightがあること：△ あることはある
- クラウドに保存されること：◯
- 非公開が選べること：◯

あったらいいな

- 手書きの内容を簡単に取り込みたい：◯
- スクショや動画も簡単に取り込みたい：◯
- 利用料は月額500円以下だと嬉しい：◯ 無料
- Todo管理があったら嬉しい：◯ メモを横断してTodoが一覧できるのはかなり便利

### Boostnote
コードスニペット用途なら最強

#### 感想
- UIは割りと好き（エンジニア好み？）
- シンタックスハイライトが強力
- 書いたものをそのままQiitaなどにコピペできるのが便利
- 特化している分、汎用性は低め

#### マッチ
- Markdownで書けること：◯
- Markdownのまま保存されること：◯
- Syntax Highlightがあること：◯ つよい
- クラウドに保存されること：◯ Dropbox連携
- 非公開が選べること：◯ 基本非公開のみ

あったらいいな

- 手書きの内容を簡単に取り込みたい：☓
- スクショや動画も簡単に取り込みたい：☓
- 利用料は月額500円以下だと嬉しい：◯ 無料
- Todo管理があったら嬉しい：◯ メモごとに進捗が％表示できる

### Inkdrop
有料版Boostnoteな印象

#### 感想
- 機能やUIはBoostnoteに似ている
- Boostnoteより便利！という決定打が見つからず
- Boostnoteに慣れているからかコードブロックが上手く書けず…

#### マッチ
- Markdownで書けること：◯
- Markdownのまま保存されること：◯
- Syntax Highlightがあること：△ うまくできなかった
- クラウドに保存されること：◯
- 非公開が選べること：◯

あったらいいな

- 手書きの内容を簡単に取り込みたい：☓
- スクショや動画も簡単に取り込みたい：☓
- 利用料は月額500円以下だと嬉しい：◯ 月額500円
- Todo管理があったら嬉しい：☓

## 参考にした記事とか
[メモアプリの決定版はこれだ！ - Qiita](https://qiita.com/sygw/items/df4202a089a6a82847da)
[ノートアプリ探しの旅 - Qiita](https://qiita.com/yokota1990/items/1a7f6a5fd2a5aae249d4)
[仕事で使えるメモアプリ 2017 - ほとラボ](http://blog.hotolab.net/entry/memoapp)
[エンジニアにお勧めしたいメモアプリ5選 | geechs magazine](https://geechs-magazine.com/tag/lifehack/20160113/2)
[ハッカー向けノートアプリ「Inkdrop」は最高に使いやすいメモ帳ツールだった | Web Design Trends](https://webdesign-trends.net/entry/4163#Inkdrop-3)

## おまけ：Todo管理
Todoアプリは使わず、やることはGoogleカレンダーに予定として組み込んでいる。
理由は、いつやるか決めていないタスクは溜まりやすく腐りやすいと思っているから。

ただ、どうしても「いつでもいい」タスクを溜めておく場所は欲しくて、Slackに専用のチャンネルを作って溜めている。

勉強会などに参加したときにメモを取って、その中にTodoを書くことがあるが、そのまま忘れ去られることが多い。なので、メモ中のTodoが一覧で見られるDropbox Paperはとても魅力的。
Firebase Authで新規ユーザを作らせたくない！

# 問題意識
Twitter連携などのOAuthでユーザ登録をできるようにしたり、メールアドレス/パスワードでユーザ登録をさせたりするようにすると、本当に誰でも自分のプロジェクトに新規ユーザ登録できてしまう。ECサイトとかSNSとかではこれは望ましい動作だろうが、サークルや研究室のサイト構築などではこれは望ましい動作ではない。**ホワイトリスト形式でユーザを登録させる方法はあるだろうか？**


# 世の中の見解


## 見解1: 登録/認証は好きにさせて、認可ではじけば？

[Is there a way to restrict registrations in firebase - Stack Overflow](https://stackoverflow.com/questions/21815229/is-there-a-way-to-restrict-registrations-in-firebase)

[How do I restrict signup to a product in Firebase - Stack Overflow](https://stackoverflow.com/questions/17719703/how-do-i-restrict-signup-to-a-product-in-firebase)

[Restrict Google Auth to specific users - Google グループ](https://groups.google.com/forum/#!topic/firebase-talk/rRLWoWXJuEY)

ひとこと: 認可の設定に穴があったらどうする？未来の実装にもコストがのしかかる。リスク高め。

## 見解2: 独自認証プロバイダを作って移譲させればできるよ

[Restrict google auth with firebase for some emails : javascript - reddit](https://www.reddit.com/r/javascript/comments/4orbj7/restrict_google_auth_with_firebase_for_some_emails/)

ひとこと: めんどくさいし、他のプロバイダ経由で登録されたらバイパスされる。

## 見解3: custom claims っていう機能使えばできるんじゃないかな多分

これは見解1 をスマートにした感じ。このスレッドは結構突っ込んでいるのでしっかり読む価値あり

[Disable new user signups · Issue #99 · firebase/firebaseui-web](https://github.com/firebase/firebaseui-web/issues/99)

ひとこと: 結局見解1 と一緒かな

# 私の試した方法

Functions の機能で、ユーザが新規登録された瞬間にそのユーザを disable にする。上記の見解3 のスレッドの中で紹介されていたけどみんなからスルーされていた方法。

```js
exports.noMoreUser = functions.auth.user().onCreate(record =>
  admin.auth().updateUser(record.uid, { disabled: true })
    .then(r => console.log(`Disabled New user ${r.uid}`))
    .catch(error => console.log("Error Disabling New User", error))
);
```

本当に登録したければ、管理者に言って disable を解除してもらう。管理者は定期的に disable となっているユーザを削除する、という運用でよさそう。

ただ、**問題がある**。登録と同時に自動的にログインするという仕様なのだが、その時のトークンで色々操作できてしまう。トークンは 1時間でリフレッシュされるので、1時間は好き放題されてしまう可能性があることを示唆している。

強制的にトークンを無効化する `revokeRefreshTokens` を呼び出すということも考えられるが、既存のトークンはアクティブになる可能性があるとドキュメントで指摘があったし、`verifyIdToken` の第二引数を `true` にしなければいけないという、コードベースでの対策が必要となりうるのが頭が痛いところ。

そもそも、少し試してみたところ、Functions がトリガされるのが非同期なので、この方法も見解3も穴があるといわざるを得ない。登録と同時にユーザを削除するという方針も同様に穴がある。

# 結局
厳密に運用したいなら、現状ではたぶん見解1のように認可の段階で 実行できる IDをホワイトリストにするしかない。緩くていいなら、見解3 や私の方法でいいかも。
PythonのlambdaとreduceのList処理

#PythonであるByte中「1」のBit数を計算する
##1. Lambda

```py
get_bits = lambda value: get_bits(value>>1) +  (0x01&(value))  if  value.bit_length() > 0 else 0
get_bits(0x15)
```
```py
get_bits = lambda bits, value:  get_bits(bits -1, value) +  (0x01&(value >> bits-1))  if bits > 0 else 0
get_bits(8, 0x70)
```

##2.Reduce
```py
import functools
f = lambda value: functools.reduce(lambda x, y: x + y, [ 0x01&value>>i for i in range(value.bit_length())])
OR
def f(value):
    return functools.reduce(lambda x, y: x + y, [ 0x01&value>>i for i in range(value.bit_length())])
f(0x12)
Mavenでwarファイルを生成すると不要なJarファイルが入るのはmaven-war-pluginの古いバグ

# 事象
mvnコマンドにてwarファイルを生成すると、WEB-INF/libの中に同じ内容のJarが2つ入ってしまう。

```folder:WEB-INF/lib
slim3-1.0.18-20180504.201437-1.jar
slim3-1.0.18-SNAPSHOT.jar
```

POMはこう。

```xml:pom.xml
<repositories>
	<repository>
		<id>slim3-repo</id>
		<url>http://slim3.github.com/slim3/</url>
    	</repository>
</repositories>

<dependencies>
	<dependency>
		<groupId>org.slim3</groupId>
		<artifactId>slim3</artifactId>
		<version>1.0.18-SNAPSHOT</version>
	</dependency>
</dependencies>
```

Jarの取得元はココ。
https://github.com/Slim3/slim3/tree/gh-pages/org/slim3/slim3
バージョンは 1.0.18-SNAPSHOT。
1.0.18-SNAPSHOT フォルダの maven-metadata.xml を見てみると versioning に 20180504.201437-1 が登場している。

# 期待結果
dependencyで指定したバージョンのJarファイルのみが含まれてほしい。

```folder:WEB-INF/lib
slim3-1.0.18-SNAPSHOT.jar
```

# 問題だった箇所
maven-war-pluginのバージョンを指定せずに使っていた。ログを見たところバージョン2.2が使われていた。

```xml:pom.xml
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-war-plugin</artifactId>
</plugin>
```
バージョンを変えて試したところ、2.4以降を指定すると期待結果になった。

# 解決方法
maven-war-pluginをバージョン指定して使う。バージョンは 2.4 以降を指定する。
なお投稿時点での最新バージョンは 3.2.1 。

```xml:pom.xml
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-war-plugin</artifactId>
	<version>2.4</version>
</plugin>
```

# 参考
issue
[maven-war-plugin can cause multiple dependent lib files with same snapshot version.](https://issues.apache.org/jira/browse/MWAR-296)
「自作Python100本ノック」10日目（63本〜70本目）

「自作Python100本ノック」10日目です。

今日は大学の情報科学のテストが40分近く早く終わった（解けたとは言ってない）ので、昼に記事作成をしています。
前回の最後に言った通り、今回は日付とデータフレームの扱いをざっくりやって行きます。
それで、いよいよ次回から文章題に入るという流れです。

ところで、iOSアプリ開発ができる方を現在割と本気で探しているので、どなたかいましたら連絡をくださると嬉しいです。よろしくお願いします。

さて、
「自作Python100本ノック」とはそもそも何ぞや？
どの程度のレベル感なのか？
どのように進めて行くのか？
など気になる方は詳しくは[こちら](https://qiita.com/ahpjop/items/373f807d68044cda1c9b#%E8%87%AA%E4%BD%9Cpython100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF1%E6%9C%AC5%E6%9C%AC%E7%9B%AE)に整理してありますのでまずはそちらを確認するようお願いします。
それでは始めていきます。

##Q63: 現在の日付をtoday.txtというテキストファイルに文字列の形で書き込みなさい
　　　　

```q63.py
from datetime import date

now = date.today()
now_str = now.isoformat() #文字列の形にする
with open("today.txt", "wt") as outfile:
    outfile.write(now_str)

now_str
```

##Q64:today.textから日付を解析し取り出しなさい
　　　

```q64.py
import time
fmt = '%Y-%m-%d'
time.strptime(today_string, fmt)
```

##Q65:ディレクトリの扱いの練習
問題： カレントディレクトリと親ディレクトリのファイルのリストをそれぞれ表示せよ。
　　　　

```q65.py
# カレントディレクトリのファイルのリストを作ろう
import os
os.listdir('.')

# 親ディレクトリのファイルのリストを作ろう
os.listdir('..')
```

##Q66:自分の誕生日が何曜日だったか確認
`weekday()`で簡単に特定できるとは驚きました。
自分は何曜日に生まれたのかという長年の謎がこれで解決されました。
　　　

```q66.py
from datetime import date
my_time = date(1998, 5, 11)

my_time.weekday() #月曜が0、日曜が6
```

##Q67:自分が生まれてから10,000日になるのはいつか確認
忘れないようにします！
　　　　

```q67.py
from datetime import timedelta
my_future = my_time + timedelta(days=10000)
my_future
```

##Q68:以下のデータフレームを作成せよ。
![スクリーンショット 2018-05-16 13.37.52.png](https://qiita-image-store.s3.amazonaws.com/0/200298/fca74550-0154-ab57-74f3-d4102f71ff9c.png)

　　　　
```q68.py
df = pd.DataFrame(
    {'名前': ['朝倉', '鈴木', '山中', '田中', '山本'],
     '年齢': [17, 43, 40, 12, 62],
     '性別':['男', '男', '女', '男', '女']})
df
```

##Q69:年齢が35歳よりも下の人だけを表から取り出しなさい
```q69.py
df_1 = df[df['年齢'] < 35]
df_1
```

##Q70: 内容の追加
問題：なんか適当に新しい行と新しい列を追加してみましょう
例：新たに「池田」を追加すし、新たに「居住地」と言う　　　列を追加する
  
　　　
　　　


```q70.py
# 行の追加
row = pd.DataFrame({'名前': ['池田'],
                    '年齢': [1989],
                    '性別': '男'})
# 行の追加（行: axis=0, 列: axis=1）
df_2 = pd.concat([df,row], axis=0)
df_2

# indexを変更
# np.agrangeで0〜6の数字が並んだ配列を生成
df_2.index = np.arange(len(df_2))
df_2


# 列の追加
# 新たな列を代入
df_2['居住地'] = ['東京', '大阪', '北海道', '宮城', '富山', '大分']
df_2
```
 

##Q71:内容の削除
問題：「性別」の列を削除せよ
   　　　

```q71.py
# 列を削除（行: axis=0, 列: axis=1）
df_3 = df_2.drop('性別', axis=1)
df_3
```

##Q72: 列名を変更
問題：「名前」を「name」、「年齢」を「age」、「居住地」を「residence」に変更せよ
　　　

```q72.py
df_4.columns = ['name', 'age', 'residence']
df_4
```

##感想
もう開始してから10日も経ったのかと焦っています。
そして、基本問題のネタがなくなったので、いよいよ次回から文章問題を解かないといけないのかあ、っていうかどこから問題あつめてこようか、、とビビっております。。

まあ、とりあえず今回はここまでです。
それでは！

-> [11日目](https://qiita.com/ahpjop/items/199d3a204f47588b40b8)
Vuex で modules を利用した際の getters の使い方

vuex 1ファイルの行数が増えすぎたのでリファクタついでにmodules 使い始めたら少しひっかかったので書き溜め。

## 構成
```vuejs:components/record.vue
<template>
  <div>
    {{record.length}}
  </div>
</template>
<script>
  import { mapGetters } from 'vuex'
  export default {
    computed: {
      ...mapGetters(['record']) // NG
    },
    record_count() {
      return this.$store.getters.record.length; // NG
    }
  }
</script>
```

```js:vuex/modules/Record/index.js
export default {
  state: {},
  getters: {record: []},
  mutations: {},
  actions: {},
}
```

```js:vuex/index.js
import Record from './modules/Record'

export default new Vuex.Store({
  modules: {
    Record,
  }
})
```

## this.$store.getters の呼び出し

```js
    record_count() {
      return this.$store.getters.record.length; // NG
    }
```
### 解決策
getters にはただのオブジェクトなので、当たり前だけど一応。

```js
    record_count() {
      return this.$store.getters['Record/record'].length; // OK
    }
```

## `<template>` 使いたい場合の mapGetters 指定
```js
    computed: {
      ...mapGetters(['record']) // NG
    },
```
### 解決1
```js
    computed: {
      ...mapGetters({ record: 'Record/record'}) // OK
    }
```

### 解決2
```js
    computed: {
      ...mapGetters('Record', ['record']), // OK
    }
```

こっちの書き方が出来るとは思わなかった。

# 参考
https://alligator.io/vuejs/intro-to-vuex/

Vueたのしいよ