OmniAICreator/Qiita-1.07M huggingface dataset:
Unityでオブジェクトの色味が暗くなる

#Qiita始めました
　ドツボにはまったり、マウス投げそうになった時のことを書いていきます。
　解決も未解決も書いていくのでコメントいただけると幸いです。

#Unityでオブジェクトの色味が暗くなる
　今回の本題です。
　Unityで3Dオブジェクトを作って適当な原色materialを作成してくっつけたんですがどうも暗い。
　materialのAlbedoはHSVで表現されているので明度はすでに入ってるしなんで…？

#Lightがなかった
　UnityのDocumentation (https://docs.unity3d.com/jp/current/Manual/Lighting.html) によればディレクショナルライトはシーンを作成したら常にあるよ！みたいなことが書いてあるんですけど、誤って消してしまったのか、元からなかったのか、きちんとシーン内に作成しないと光源が無い状態になってたらしい。

#解決？
　ドキュメントとデフォルトの仕様が違うのがどうも気になりました。ライトオブジェクト消した記憶はないんだけど…。
　詳細を知っている方がいらっしゃったら教えてくださいお願いします。

#(4/6追記）
>moru-san 2019-04-01 09:46
>新規プロジェクトを作成する時に、2Dと3Dの選択が出来ますが、そこで2Dを選んでプロジェクトを作成すると、新規シーンにはライトが無い状態になります。また、カメラも平行投影になっていたりと、他にも2Dと3Dで初期設定が異なっています。
>
>プロジェクト作成後であっても、メニューのEditor -> Project Settings -> Editor -> Default Behavior Modeで2Dと3Dを切替えることができます。

moru-sanさんから詳しいコメントを頂きました！ありがとうございます！勉強になります！
2Dと3Dでデフォルトの設定が違うということでした…オブジェクトに触った記憶がないわけだ…。
テストで使うサーバが立ち上がるのを待つ方法

# 概要

テスト自動化において、テスト対象のWebサーバや、バックエンドのDBサーバを一時的に立てて利用することがあります。例えばDockerコンテナとしてサーバプロセスを起動し、リクエストを送信してテストを実行するといった場合です。

サーバプロセス起動を指示してから、サーバプロセスがTCP Portで待ち受けリクエストを処理できるようになるまでにはタイムラグがあり、即座にリクエストを送信すると接続失敗してしまいます。

本稿ではそのような場合にサーバプロセスが待ち受け開始するまでを待つ方法を紹介します。

# MySQLサーバを待つ

MySQLの場合は mysqladmin ping を使うとサーバへの接続確認ができるので、それを使います。

```shell-session
$ mysqladmin ping -hホスト名 --silent
mysqladmin: connect to server at 'ホスト名' failed
error: 'Access denied for user 'root'@'接続元IPアドレス' (using password: NO)'
$ echo $?
0
```

このように戻り値が0であることを確認すれば待ち受けをしていると判定できます（認証エラーが表示されていても、TCP接続ができていれば0が返ります）。

シェルスクリプトのワンライナーでポーリングして待つなら、

```shell
while ! mysqladmin ping -hホスト名 --silent; do sleep 1; done
```

のようにするとよいでしょう。mysqladminコマンドはMySQLの公式のDockerコンテナにも同梱されているので手軽に使えます。

Jenkinsでの利用例を [Advanced Usage with Scripted Pipeline > Running "sidecar" containers](https://jenkins.io/doc/book/pipeline/docker/#running-sidecar-containers) に記載しているので興味ある方は参照して下さい。

# PostgreSQLサーバを待つ

PostgreSQLの場合はpg_isreadyコマンドが利用できます。使い方は簡単です：

```shell-session
$ pg_isready -h ホスト名
ホスト名:5432 - accepting connections
$ echo $?
0
```

戻り値が0であれば接続成功しています。シェルスクリプトでポーリングして待つ方法は MySQL の場合と同様なので省略します。

# 一般のTCPサーバを待つ

netcat utilityのポートスキャンの機能を利用できます。

```
nc -z ホスト名 ポート番号
```

例えば

```shell-session
$ nc -z qiita.com 443
Connection to qiita.com port 443 [tcp/https] succeeded!
$ echo $?
0
```

のように戻り値が0であれば接続成功しています。

# まとめ

テスト自動化においては、事前条件の保証ができていないと安定的にテストを実行し続けることができません。本稿ではサーバの待ち受けが開始されていることを保証する方法を紹介しました。
[小ネタ]C#には8進数リテラルはない

最近知ったのだが、C言語の流れを汲んだ C++,Javaには8進数リテラルがあるが、C#にはない。
8進数リテラルは滅多に使用しない(というか避ける)ので、全く気づかなった。

> JIS X3015 9.4.4.2 整数リテラル より引用
>
>     ≪整数リテラル≫::
>         ≪10進整数リテラル≫
>         ≪16進整数リテラル≫
>     ≪10進整数リテラル≫::
>         ≪10進数字群≫≪整数型接尾辞≫opt
>     ≪10進数字群≫::
>         ≪10進数字≫
>         ≪10進数字群≫≪10進数字≫
>     ≪10進数字≫:: 次のいずれか
>         0 1 2 3 4 5 6 7 8 9
>     ≪整数型接尾辞≫:: 次のいずれか
>         U u L l UL Ul uL ul LU Lu lU lu
>     ≪16進整数リテラル≫::
>         0x≪16進数字群≫≪整数型接尾辞≫opt
>         0x≪16進数字群≫≪整数型接尾辞≫opt
>     ≪16進数字群≫::
>         ≪16進数字≫
>         ≪16進数字群≫≪16進数字≫
>     ≪16進数字≫:: 次のいずれか
>         0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f

C# 7.0 で2進数リテラルが追加されているので更新されていると思うが、変わらず8進数リテラルはない。
Laravel 5.5 から 5.8 にバージョンアップ

Laravel の 5.5 から Larave 5.8 にバージョンアップする手順です。同時に PHP 7.0 から 7.1 に更新します。新しいバージョンが出たら放置せずになるべく早く更新しましょう:sweat_smile:

## 更新後のバージョン
- Laravel 5.8
- PHP 7.1+ 
- PHPUnit 7+
- barryvdh/laravel-debugbar 3.2+

Laravel 5.8 は PHP 7.1 以降を要求するので事前にアップデートしておきましょう。PHPUnit も PHP 7.1 に対応するため 7 以降が必要になります。
Laravel DebugBar を使っているときは合わせてバージョンアップが必要です。

## 更新作業

1. 事前準備
1. Laravel のバージョンアップ
1. PHPUnit のバージョンアップ
1. DebugBar のインストール
1. テストの実行

### 事前準備
テストがある場合は事前に実行してエラーが無いことを確認してください。アップデート後に再実行して影響がある箇所を特定します。
続いて PHP 7.1 以降をインストールします。`phpenv` を使うとかんたんにインストールできます。
DebugBar `barryvdh/laravel-debugbar` は Laravel アップデート時にエラーになるので `composer.json` から削除しておきます。`config/app.php` に ServiceProvider と Facade を登録している場合は一緒に削除してください。

### Laravel のバージョンアップ
`composer.json` を開いて `require` の中から `laravel/framework` を探します。バージョンが `5.5` になっていたらひとつ次のバージョン `5.6` に変更して保存します。
保存したら `composer update` を実行してください。
エラーが出なければバージョンを `5.6` から `5.7` に変更して `composer update` を再実行します。これを `5.8` まで繰り返してください。

#### バージョンアップ中にエラーが出る場合
`composer update` を実行すると、パッケージのアップデート完了後に `php artisan optimize` が実行されます。`optimize` の実行中にエラーが発生してもパッケージのアップデートは完了しているので無視するか、エラーメッセージを参照して修正してください。

### PHPUnit のバージョンアップ
Laravel のバージョンアップが完了したら PHPUnit のバージョンを更新してください。`composer.json` の `phpunit/phpunit` を `~7.0` に変更して `composer update` を実行します。

### Laravel DebugBar のインストール
削除した DebugBar を再インストールします。最新のバージョンを取得するため `composer require --dev barryvdh/laravel-debugbar` を実行します。

### テストの実行
全ての更新が完了したらテストを再実行してください。発生したエラーと対処方法は以下のとおりです。

#### Dotenv の仕様変更
##### エラーメッセージ

```
PHP Fatal error:  Uncaught TypeError: Argument 1 passed to Dotenv\Dotenv::__construct() must be an instance of Dotenv\Loader, string given, called in /app/tests/autoload.php on line 8 and defined in /app/vendor/vlucas/phpdotenv/src/Dotenv.php:31
```

##### 対応方法
Laravel で使用している Dotenv の初期方法が変わっています。独自に使っている場合は初期化メソッドを以下のように変更します。

```php
// 旧
(new Dotenv\Dotenv(dirname(__DIR__), $filename))->load();
// 新
(\Dotenv\Dotenv::create(dirname(__DIR__), $filename))->load();
```

#### PHPUnit のメソッドシグネチャ変更

##### エラーメッセージ

```
PHP Fatal error:  Declaration of Tests\TestCase::setUp() must be compatible with Illuminate\Foundation\Testing\TestCase::setUp(): void in /app/tests/TestCase.php on line 17
```

##### 対応方法

`TestCase::setUp` のメソッドシグネチャが変更されています。また PHP 7.1 に対応した戻り値の type hinting も追加されています。
テストクラスで `setUp()` をオーバーライドしている場合は新しいシグネチャに変更します。

```php
// 旧 Laravel 5.5
public void setUp() {...}
// 新 Laravel 5.8
protected void setUp(): void {...}
```

#### 互換性のない PHP 7.1 の変更

##### エラーメッセージ

```
Failed asserting that exception of type "ArgumentCountError" matches expected exception "\Exception". Message was: "Too few arguments to function App\Hoge::__construct(), 1 passed in /app/tests/Unit/App/HogeTest.php on line 112 and exactly 2 expected" at
```

##### 対応方法

PHP 7.1 からユーザ定義関数の呼び出し引数が不足していると `Error` 例外がスローされるようになりました。テストを実行してエラーになる箇所があれば修正します。
その他の変更点は [PHP: 下位互換性のない変更点 - Manual](https://www.php.net/manual/ja/migration71.incompatible.php) にまとめられています。

## 追記

Laravel 5.8 では新しい設定ファイルが追加されているので適当な場所に `laravel new` で新しいアプリケーションを作成してから `config/*` のファイルをコピーしてきましょう。

対象ファイル

- `config/logging.php`
MySQL + Sequelize コマンド　メモ

# MySQL

### ログイン

~~~
mysql -u root -p
~~~

### DBを確認し、選択

~~~
show databases;
use [database名];
~~~

### テーブルを確認し、テーブルのカラムを確認

~~~
show tables;
show columns from [table名];
~~~

### テーブルにデータを作成

~~~
INSERT INTO [table名] (col_name1, col_name2, ...)
  VALUES (value1, value2, ...);

INSERT INTO [table名] VALUES (value1, value2, ...);　　// 全てのカラムを使用する場合、カラム名を省略できる
~~~

### テーブルを削除

~~~
DROP TABLE [table名];
~~~

### データを削除

~~~
DELETE FROM [table名] WHERE id = 10;
~~~

### テーブルの中身を確認

~~~
select * from [table名]
~~~

# Sequelize-cli

### インストール

~~~
npm install --save sequelize
npm install --save sequelize-cli
~~~

### 初期化

~~~
node_modules/.bin/sequelize init
~~~

config, models, migrations, seedersディレクトリが作成される。
config/config.jsonにMySQLで作成したDB情報、ユーザ情報を記入する。

### モデル作成

~~~
node_modules/.bin/sequelize model:create --name users --underscored --attributes name:string,email:string
~~~
config, models, seedersディレクトリがあるフォルダで行うこと
このコマンドでmigrationsフォルダにファイルが作成される

モデル名はデフォルトで複数形にされるので、複数形で書くこと。

### MySQLに反映

~~~
node_modules/.bin/sequelize db:migrate --env development
~~~

MySQLでテーブルを確認すること。usersテーブルがあれば良い。

### カラムの追加、削除

~~~
../node_modules/.bin/sequelize migration:generate --name [table名]
~~~

migrationファイルに書く
before, after はカラムの場所を指定できる。
promiseにしないといけない

~~~
'use strict';

module.exports = {
  up: function (queryInterface, Sequelize) {
    return (
      queryInterface.addColumn('users', 'email', {
        type: Sequelize.STRING,
      }))
    .then(()=>{
      queryInterface.addColumn('users', 'prefecture_code', {
        type: Sequelize.INTEGER,
        allowNull: false,
        defaultValue: 0,
        after: 'email' // PostgreSQLでは無効なオプションです
      })
    })
  },

  down: function (queryInterface, Sequelize) {
    return (
      queryInterface.removeColumn('users', 'email')
    ).then(()=>{
      queryInterface.removeColumn('users', 'prefecture_code')
    })
  }
};
~~~

### migration実行（変更の適用とやり直し）

~~~
node_modules/.bin/sequelize db:migrate --env development
node_modules/.bin/sequelize db:migrate:undo --env development
~~~

### アソシエーション、リレーション

### 参考
https://qiita.com/cobot00/items/0bc0da1095e09bcd0d5f
http://vistylee.com/sequelize/
https://polidog.jp/2015/12/19/sequelizejs/
⬇︎アソシエーションでとても参考になる
https://blog.kozakana.net/2018/03/sequelize_hasmany/
https://pepese.github.io/blog/express-rdb-sequelize/
# sequelize

### create

~~~

~~~

### 

~~~

~~~

## アソシエーション

~~~

~~~

### 

~~~

~~~

### 

~~~

~~~
【Rails】rake seedコマンドでCSVファイルからDBに読み込ませる方法

サービスを作っていく際にCSVファイルをseedコマンドで読み込ませたかったので後で自分でも見返せるよう書いていきます。


### CSVファイルとは
CSV = Comma-Separated Values
見辛いかもしれませんがカラムのデータがカンマ(,)で区切られたテキストファイルまたはデータのことです。
詳しくは分からないので深く知りたい方は調べてみてください。

<img width="921" alt="スクリーンショット 2019-03-29 18.19.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/351739/b59a1c9b-80a8-1dce-a10c-9e7feb4e529c.png">

ちなみにVsCodeを使っているかたはExcel viwerという便利な拡張機能があるのでインストールしてみるとCSVファイルが見えやすくなります。
https://marketplace.visualstudio.com/items?itemName=GrapeCity.gc-excelviewer
こんな感じです↓
<img width="921" alt="スクリーンショット 2019-03-29 18.19.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/351739/b03329ed-d3c7-8f14-3a1e-6101c3c1b4c5.png">


本題から少し脱線してしまいましたが順を追って説明していきます。


## CSVファイルを作成

macを使っている方ならnumbersというアプリでcsvファイルを簡単に作成する事が出来ます。

Excelでもメモ帳でもテキストエディタと呼ばれるものならなんでも作成可能みたいです

自分はMacを使っているのでnumbersを使った作成方法を紹介していきます。

まずエディタを開きます
<img width="989" alt="スクリーンショット 2019-03-29 18.41.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/351739/1b4da619-d823-e3b0-c262-c63d66e71635.png">

自分の入れたいデータを打ち込んで行きましょう。
私はサンプルCSVを拾ってきたもので編集をしていないですがファイルの一番上の行ではカラム名を入れましょう。
例えば都道府県コードはただのidに都道府県名はprefectureなどにしてカラム名は任意に入れましょう。
<img width="989" alt="スクリーンショット 2019-03-29 18.46.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/351739/a51a3051-1abd-560c-739e-d0e33fad5bfc.png">

データの入力が終わったらcsv形式にして保存しましょう。
画像のように「ファイル」→「書き出す」→「CSV」と選択していくだけです！
<img width="989" alt="スクリーンショット 2019-03-29 18.47.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/351739/78c29d03-c1eb-8aaa-4d52-733e49a6cf5e.png">



## seedファイルの用意

作成したCSVファイルをrailsアプリのdbディレクトリに入れましょう。
ここで入れ込んだCSVファイルを確認しこの記事の一番最初にある画像のようにカンマで区切られているテキストファイルになっているか確認しましょう。



## db/seedファイルの編集

```ruby:seeds.rb
require "csv"

CSV.foreach('db/seeds/csv/content.csv', headers: true) do |row|
  Content.create(
    title: row['title'],
    image_url :row['image_url'],
    director: row['director'],
    description: row['description'],
    open_date: row['open_date']
  )
end
```
私はseedsフォルダを別で作りその中にcontent.csvファイルを入れているので'db/seeds/csv/content.csv'のような記述をしていますが'db/〇〇.csv'と書いても大丈夫です。
キーの部分にはテーブルのカラム名を、バリューにはCSVファイルの列を記入していきます。
それを可能にしているのが"headers: true"になります。
<img width="839" alt="スクリーンショット 2019-03-31 8.30.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/351739/3f1e2a65-392d-3837-8b96-8522e6868ed0.png">



## rake db:seedコマンドを入力

CSVファイルを作成しseeds.rbファイルに記述ができたらターミナルでコマンドを入力するだけです。

seedsファイルにコードを書いていればターミナルで**rake db:seeds**
自分のようにseedデータを分割して実行できるようにするには**rake db:seed:xxx.rb**を打てば実行されるはず。

[seedデータを分割する方法はこちらのサイトがわかりやすいです。](http://yu0105teshi.hateblo.jp/entry/2016/08/03/180603)

コマンドを実行したらrail cでコンソールでDB情報を確認してみましょう！



**以上となりますが何か間違った情報など提供してましたらコメント欄でお伝えください！**
Raspberryで子供が帰宅したことを知らせる仕組みを考える

## 使用機器やバージョン

- ラズパイ：Raspberry Pi3 Model B
- カメラ　：ロジクール Webcam C270
- Motion　：バージョン4.0

## きっかけ
　この４月からから子供が小学生になるのですが
　我が家は共働きで、子供が帰宅したことを確認する術がありません。
　つい先日まで保育所から親が連れて帰っていたのに
　４月から一人でできるのか不安です。

　ビーコンを携帯させて、メールで通知してくれるような
　サービスもあるのですが、どうせなら自分で作ってみようと思い
　ラズパイで何とか出来ないか検討中です。

## やりたいこと
1. 玄関のドアが開いたことを検知
2. ドア付近の写真を撮影
3. 撮影結果を通知（メールもしくはLine）

## 今で出来ている事
- RaspberryへのOSのインストール
- WEBカメラの接続と撮影
- Motionのインストール

Motionによる動体検知を行い撮影まではできていますが
思ったようなタイミングで静止画の撮影ができず調整中。
いっそのこと、動画に使用かと。。。
React Hooksのdispatchにイベントオブジェクトを投げて失敗

React Hooksを活用していたところ、ちょっと手抜きしようとして失敗してしまいました。

## React Hooksのreducer

React Hooksには`useReducer`という関数があります。詳細は[リファレンス](https://reactjs.org/docs/hooks-reference.html#usereducer)を参照していただきたいのですが、ここに`reducer`として渡す関数は、「1つ目の引数に前の`state`、2つ目に変更内容を取って、次の`state`を返す」ということだけ決まっていて、「変更内容」としてReduxのような特定の形をしたオブジェクトを要求するわけではない、ということがあります。

## 手抜き…に失敗

それなら、「変更内容として、イベントオブジェクトをそのまま渡してしまって、`e.target.name`や`e.target.value`を読み取ってそこから値を取れば、`onChange={dispatch}`とできるんじゃないか」ということで、そのように実装してみました（動かないのでコード略）。

結果は、エラーとなりました。

## `SyntheticEvent`

実は、Reactのイベントでは本物のイベントオブジェクトではなく、`SyntheticEvent`というReact独自のイベントオブジェクトを投げてきます。そして、これは効率化のため**イベントが終われば再利用されます**（[リファレンス](https://reactjs.org/docs/events.html)）。結果、`dispatch`などの非同期更新に投げてしまうと、うまく動かなくなります。

イベントオブジェクトから値を抽出したい場合、イベントハンドラ内で同期的に行っておきましょう。
Record of the study(Ruby2)


##Rubyの実行方法

- Rubyプログラムを実行するには、主に**2種類**を使う

①rubyコマンド
②irbコマンド

※どちらものコマンドも**コンソール**から実行を行う
※UNIX系(Mac OS)では**『ターミナル』**、windows系では**『コマンド プロンプト』**がコンソールに該当
***
①②の違いは**書いたプログラムのファイルを必要とするか、しないか。**

①は実行するには、エディタで記述した**プログラムファイル**が必要
→長いプログラムに適している

②はコンソールに**直接プログラムを記述、実行**が可能
→簡単or短いプログラムに適している
***
【①例】
エディタにてプログラムを記述
`puts "Hello World"`
プログラムを保存
`hello world.rb` ←rubyプログラムファイル

コンソールにて
`ruby hello world.rb`を入力→実行
出力結果
`Hello World`

【②例】
コンソールにて `irb` コマンドを入力
入力プロンプトが立ち上がるので、そこに直接プログラムを記述
`irb(main)001:0>puts "Hello World"`
出力結果
`Hello World`
`nil (putsメソッド自身の戻り値)`

※irbコマンドに関しては、うまく日本語が正しく入力できない場合は
コンソールにて `irb --noreadline` コマンドを入力する
***
今回はここまで。次回からは変数やメソッドなどのアウトプットを実施していきます:bow_tone1:
認識違い、間違いなどありましたら、ご指摘頂けますと幸いでございます。宜しくお願い申し上げます:bow_tone1:
DateTimeの扱い方の備忘録

## 日時を操作したいのです

イベントなどを組み込むために、日時の処理をいじりたいことが多く、よくDateTimeを扱うのですが、他の言語を触っていてこちらに戻ってくると、その言語では出来るけど、C#では出来ないんだったというのがちらほらあるので備忘録的に。というか、今日気がついたよ、これダメなの（月末じゃないとわからないこともあるのさ）。

## 明日の指定時間の値を返す

```C#
// 例外が出るよ
var res = new DateTime( DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day + 1, hour, mini, sec );

// こっちならOK
var res = new DateTime( DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, hour, mini, sec).AddDays(1);
```

上記だと、月末で例外が出てしまいます。これは、日でなくても同様なので、チェインさせるのが一番ですね。今回は、時間を指定させるために上記の書き方にしてますが、他にも良い書き方あるのかな...。（PHPか何かは、上のような書き方が可能だったはずだけど...）
chrome 73でブラウザがリフレッシュされる

#問題

chrome 73で一定時間毎にブラウザがリフレッシュされる
仮想デスクトップに振り分けてある画面がまとめられてしまうので困る

- Windows限定？
- 背景が切り替わるタイミングで起こる？

#解決編

色の設定 -> 背景から自動的にアクセントカラーを選ぶのチェックを外す。

- Windowsの色を変更する事でchromeがリフレッシュされる事を確認
- 壁紙等の背景を自動的に切り替えるアプリや設定をしていると、Windowsの色が変更されていた


#参考

https://support.google.com/chrome/thread/2345533?hl=ja
JavaScriptでトランプ遊び part 1

ある日、男は`Unicode`に`Playing Cards`というブロックを[見つける](https://en.wikipedia.org/wiki/Playing_cards_in_Unicode)。

```JavaScript
"ABCD".split("").forEach((u)=>{console.log("123456789ABDE".split("").map((l)=>String.fromCodePoint(`0x1F0${u}${l}`)).join(""))})
```
※↑ブラウザ(chromeで確認済み)のConsoleでやってみてください。
※ダイヤとハートも黒く表示されてしまうのは、一旦納得してください。

、、、というわけで、Unicodeのトランプと、ブラウザのJavaScript Consoleで遊べる遊びを考えていきたいと思います。目標は、ネットワークに繋がっていないPCでも、ブラウザがあれば遊べるようになることです。

# 遊んでみる
 まず、さっきのスクリプトを実行したあなたの「表示小さすぎるな！？これトランプなの！？」という心の声が私に聞こえてきましたので、先になるべく大きく表示する関数 `clog` を先に作っておきます。また、カードも一通り変数 `cards` に入れておきましょう。ここで、ジョーカーも2つ加えておきます。

```JavaScript
const clog = (t)=>{console.log("%c"+t, "font-size:xx-large")};
let cards={};
"ABCD".split("").forEach((u,i)=>{"123456789ABDE".split("").forEach((l,j)=>{cards["SHDC"[i]+"1234567890JQK"[j]]=String.fromCodePoint(`0x1F0${u}${l}`)})});
cards.J0 = String.fromCodePoint(0x1F0BF); // Red joker
cards.J1 = String.fromCodePoint(0x1F0DF); // White joker
clog(cards.S1);
```

スペードのAが表示されましたか？では、カードをシャッフルしたのち(シャッフルの精度が雑ですが、それも現実っぽくて良いでしょう)、デッキから5枚引いて、表示してみましょう。

```JavaScript
clog(Object.keys(cards).sort(()=>{return Math.random()-.5 }).slice(-5).map((c)=>cards[c]).join(""))
```

これで、ポーカーっぽいことが出来そうですね。
、、今日はここまで。このあと、どう進めるか何も決めていませんので、コメントなど頂けたら幸いです。

ちなみにUnicodeには[麻雀牌もある](https://en.wikipedia.org/wiki/Mahjong_Tiles_(Unicode_block))ので、興味ある方はそちらで遊んでみてはいかがでしょうか。しかも、(私の環境では)麻雀牌は色が付いており、トランプよりも視認性が高いです。残念ながら私は麻雀のルールを知りませんが。
RESTまとめ

Railsチュートリアル内での説明をまとめました。

# REST
## RESTとは
REpresentational State Transferの略です。RESTは、インターネットそのものやWebアプリケーションなどの、分散・ネットワーク化されたシステムやアプリケーションを構築するためのアーキテクチャのスタイルの1つです。REST理論そのものはかなり抽象的ですが、RailsアプリケーションにおけるRESTとは、アプリケーションを構成するコンポーネント (ユーザーやマイクロポストなど) を「リソース」としてモデル化することを指します。これらのリソースは、リレーショナルデータベースの作成/取得/更新/削除 (Create/Read/Update/Delete: CRUD) 操作と、4つの基本的なHTTP requestメソッド (POST/GET/PATCH/DELETE) の両方に対応しています

## RESTの利点
Rails開発者にとっては、RESTfulなスタイルを採用することで、作成すべきコントローラやアクションの決定が楽になります。作成(C)・取得(R)・更新(U)・削除(D)を行うリソースだけでアプリケーション全体を構成してしまうことすら可能です。ユーザーやマイクロポストなどに関しては自然にリソース化できるので問題ありません。

## RESTとRailsにおけるアクション
RESTの原則に従う場合、リソースへの参照はリソース名とユニークなIDを使うのが普通です。ユーザーをリソースとみなす場合、id=1のユーザーを参照するということは、/users/1というURLに対してGETリクエストを発行するということを意味します。ここでshowというアクションの種類は、暗黙のリクエストになります。RailsのREST機能が有効になっていると、GETリクエストは自動的にshowアクションとして扱われます

## HTTP request メソッド
クライアント (例えばFirefoxやSafariなどのWebブラウザ) とサーバー (ApacheやNginxなどのWebサーバー) は、上で述べた4つの基本操作を互いに認識できるようになっています

### GET
GETは最も頻繁に使われるHTTPリクエストで、主にWeb上のデータを読み取る (get) ときに使われます。「ページを取得する (get a page)」という意味のとおり、ブラウザは[http://www.google.com/](http://www.google.com/)や[http://www.wikipedia.org/](http://www.wikipedia.org/)などのWebサイトを開くたびにGETリクエストをサイトに送信します。

### POST
POSTは、GETの次によく使用されるリクエストで、ページ上のフォームに入力した値を、ブラウザから送信する時に使われます。例えばRailsアプリケーションでは、POSTリクエストは何かを作成するときによく使われます (なお本来のHTTPでは、POSTを更新に使ってもよいとしています)。例えばユーザー登録フォームで新しいユーザーを作成するときは、POSTリクエストを送信します。

### PATCH、DELETE
他にも、PATCHと DELETEという2つの操作があり、それぞれサーバー上の何かを更新したり削除したりするときに使われます。これら2つの操作は、GETやPOSTほどは使われていません。これは、ブラウザがPATCHとDELETEをネイティブでは送信しないからです。しかし、Ruby on Railsなどの多くのWebフレームワークは、ブラウザがこれらの操作のリクエストを送信しているかのように見せかける技術 (偽装) を駆使して、PATCHとDELETEという操作を実現しています。

# 参考になったリンク
- [HTTPとPOSTとGET](https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf)
Prometheus & Grafanaつかってみた

# 起動

docker-composeでかんたん実行。

```bash
docker-compose up
```

```yaml:docker-compose.yml
version: '3.1'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    ports:
      - 9090:9090
    networks:
      - public
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

  pushgateway:
    image: prom/pushgateway
    container_name: pushgateway
    ports:
      - 9091:9091
    networks:
      - public

  grafana:
    image: kannkyo/grafana
    container_name: grafana
    ports:
      - 3000:3000
    networks:
      - public

networks:
  public:
```

```yaml:./prometheus/prometheus.yml
scrape_configs:
  - job_name: 'pushgateway'
    scrape_interval: 1s
    static_configs:
      - targets: ['pushgateway:9091']
        labels:
          environment: "hoge"
          category: "pushgateway"
```

# 表示

## prometheus

http://localhost:9090

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114392/ed761420-36c3-ff6a-3cb5-6457aeae5874.png)

## pushgateway

http://localhost:9091

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114392/86f47893-11d8-fd77-b58e-714e98e30a1c.png)

## grafana

http://localhost:3000

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114392/7e938393-700a-5c5e-02e7-09d06fabcfac.png)

# メトリクスを操作する

docker-compose.yml のnetworksの設定により、pushgateway -> prometheus -> grafana にメトリクスを送信できるようになっている。

以下のスクリプトでメトリクスをプッシュしたりクリアしたりできる。

## メトリクスをプッシュする

```bash:push.sh
#!/bin/bash

JOB=pushgateway

MAX_VAL=100
DATA=$(($RANDOM % $MAX_VAL))
METRICS="some_metric $DATA"

echo $METRICS
echo $METRICS | curl --data-binary @- http://localhost:9091/metrics/job/$JOB
```

## メトリクスをクリアする

```bash:clear.sh
#!/bin/bash

JOB=pushgateway
curl -X DELETE http://localhost:9091/metrics/job/$JOB
```
.NET Core SDKでAzure App ServiceのWebJobsで使うC#プロジェクトを作る

Azure App ServiceでWebJobsを書く用事があり、C#でやりたいということで[.NET Core SDK](https://dotnet.microsoft.com/)というMicrosoft謹製のクロスプラットフォームな開発ツールを試した。

C#というとVisualStudioを入れないといけなくて（主に事務作業が）嫌だったのだが、今回の開発なら.NET Core SDKで全部出来るんじゃないか？というモチベーションです。

WebJobs周りの作業を書いていますが、全く難しくありません。
またC#コードは出てきません。テンプレートにより作られたコードをそのまま動かすだけ。


### 前提

.Net Core SDK(2.2)を導入しており、dotnetコマンドが使えること。

https://dotnet.microsoft.com/download

後はメモ帳があればできます。本格的な開発になってきたらVSCodeでC#機能拡張をいれるのも良いです。


### プロジェクトを作る

以下の手順を踏む。

- ソリューションファイルを作る
- プロジェクトを作る（今回はconsoleテンプレートを使う。）
- ソリューションファイルにプロジェクトを含める

単一プロジェクトならソリューションファイルは無くても良いけども、`.sln`ファイルがあるとそれっぽくなると思うので作っておく。

```
dotnet new sln --name HelloWebJobs
dotnet new console --name HelloWebJobs
dotnet sln add HelloWebJobs
```

consoleテンプレートにはHello Worldなコードも封入されているので、まずはそのまま実行する。

```
dotnet run --project HelloWebJobs
```

うまくいくと以下のように出力される。

> Hello World!


### WebJobsの定期実行設定

WebJobsでcronっぽく定期実行するようにするには、`Setting.job`(JSON形式)ファイルを用意する。
（WebJobs登録時にも設定できるが、設定ミスすると辛いので、ファイルで管理したほうが良いと思う）

とりあえず5分間隔実行。

``` HelloWebJobs/Setting.job
{
    "schedule": "*/5 * * * * *"
}
```

### WebJobs実行のトリガー用のファイル

WebJobsは実行に`run.*`というファイルを探して実行するので、`run.cmd`を作成し、その中で`dotnet HelloWebJob.dll`を実行するようにする。

``` HelloWebJobs/run.cmd
dotnet HelloWebJobs.dll
```

これを実際に実行する環境はApp Service上だが、dotnetコマンドは使えるので、環境整備で何かするということはない。


### パッケージング時に管理外ファイルも含めたい

ここでは「パッケージング」というのはただの「散らばったファイルを公開用にまとめる作業」を指す。（なんていえば良いか分からない）

作った2つのファイルはC#プロジェクト的にはただのファイルという認識らしく、このままではパッケージング時に含まれない。
なので、`HelloWebJobs/HelloWebJobs.csproj` にこのファイルも出力先にコピーしてくれ、とお願いするXMLを書く必要がある。

``` HelloWebJobs.csproj
  <ItemGroup>
    <None Update="run.cmd">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Update="Settings.job">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
```


### パッケージング

後はアップロードのためにzip圧縮するだけだが、このままではどれをまとめれば良いかわからない。

そんな時は、以下のコマンドで、所定の場所にまとめてくれるようだ。

```
dotnet publish -c Release
```

これで `プロジェクト/bin/Release/netcoreapp2.2/publish` にまとまる。このまま配布すればdotnetコマンドがあれば動く。

Webjobsはzipファイルで扱う必要があるため、これらをZip形式に圧縮して1ファイルにする
**※publishディレクトリではなく、ディレクトリ内のファイルを全て圧縮する形にする**

出来ればオプションかなにかでzip圧縮までやってほしいがわからなかった（PowerShellは書きたくない）


### アップロード

WebJobsにアップロードする。Azure WebAppのWebJobsのところから「追加」で出来る。


### 確認

管理コンソール上から動作していることを確認する。うまくいくと以下のような感じで`Hello World!`が出力される。

```
[02/07/2019 14:35:47 > 3cdc1a: INFO] 
[02/07/2019 14:35:47 > 3cdc1a: INFO] D:\local\Temp\jobs\continuous\HelloWebJobs\i4cyes4m.cwg>dotnet HelloWebJobs.dll 
[02/07/2019 14:35:47 > 3cdc1a: INFO] Hello World!
```

以上。
後は実際は公開されているパッケージを使ったりして開発を進める感じ。


おまけ
-------------

### .gitignore は何が良いのか

build関連のコマンドを叩くと結構ファイルが作られるので、`.gitignore` は[gitignoreリポジトリのもの](https://raw.githubusercontent.com/github/gitignore/master/VisualStudio.gitignore)を使うと良いでしょう。

```
curl https://raw.githubusercontent.com/github/gitignore/master/VisualStudio.gitignore > .gitignore
```
Pandocで日本語のMarkdownからTeX形式のPdfファイルを生成する方法

# 導入方法

理学書や工学書，論文といった出版物には広くTeXが定着している．それは容易に洗練された組版で美しい文書が作成できるためであるが，TeXのマークアップはMarkdownと比較すると可読性に劣る（その代わり，複雑な，拡張性の点ではTeXが遙かに長けている）．

ここでは，Pandocの拡張Markdownの範囲内で作成可能な文書に限定して，TeX日本語文書からPdfを生成する方法を説明する（半ば備忘録として）．

本記事では以下の環境を準備しておく．

- Pandoc：本日の主役
- （pandoc-citeproc：参考文献リストの相互参照を利用する場合は導入する）
- （pandoc-crossref：数式や図表の相互参照を利用する場合は導入する）
- texlive：Pdfの組版に必要

# TeX日本語文書の生成方法

次のコマンドを実行する．

```sh
$ pandoc -f markdown test.md -s -o test.pdf --latex-engine=lualatex -V documentclass=ltjsarticle
```

よくXelatexのほうがコンパイル速度が速くなる記事を見たが，私の環境ではコンパイル実行したままでプロンプトが返ってこなかった．何がおかしいのか原因は見つけられていない．

※ コンパイルがうまくいかず，`Text line contains an invalid character.`と表示される場合は，markdownファイルの文字コードを**utf-8**に指定しておく（出力フォーマットの部分を`test.pdf`から`test.tex`に変えておき，実際にTeXファイルの日本語部分が正常に出力されていれば，文字コードによるコンパイルエラーの可能性は排除されると思われる）．

# 所感

- コンパイルスピードが遅いので，コーヒーでも飲んで一息つく時間として有効利用する．
- 正直，文字コードに気をつけるということを自分に向けた備忘録として書いた感がある．
RNotebookのテーブルに日本語があるときの不具合について 

<style type="text/css">
    img{ border: 5px #ff0000 solid; }
</style>

# キーワード
RNotebook, R Notebook, Windows
RMarkdown, R Markdown,
paged.print=FALSE,
jsonlite::toJSON, 
jsonlite:::C_escape_chars
rmarkdown:::paged_table_html,
base::format


# 内容
RNotebookでdata.frameを表示する際，一部の日本語が含まれていると不具合が生じることがある．
例えば，"可能"というセルがあるとテーブルが表示されない．そのテーブルだけでなく，以降のチャンクでのテーブルも表示されなくなる．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/34549/ecee3301-f174-5cdf-062d-34d9ac8577c8.png)


詳細な原因は不明だが，
rmarkdownパッケージ内でテーブル表示用htmlを作成する関数に不都合がある．
jsonliteパッケージのtoJSON関数が使われているが，その内部で使われるjsonlite:::C_escape_chars関数では，一部の日本語のエスケープがうまくいっていないようである．
"可能"という文字を
"\"可能\""に変換できればよいようであるが，
"\"可能\\\\\"に変換してしまっている．

jsonlite:::C_escape_chars関数については，iconvを使うことで突破できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34549/e7b9453f-eccc-e3ca-f214-936f1db7026a.png)



しかし，rmarkdownパッケージ側での不都合により，data.frame内の文字列にiconvをかけても，テーブルが表示されない不具合は解決できない．
rmarkdown:::paged_table_htmlという内部の関数では，
data.frameの全ての列にbase::format関数を適用しており，この際にiconvをかけたことで，utf8化がリセット?されてしまっている??．


assignInNamespace関数を用いて，paged_table_html関数を書き換えようと試したが，
どうもうまくいかなかったので，この試みは保留
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34549/059e67f9-3249-c569-3877-557e6c50f019.png)


# 妥協の対処法
RNotebookでは表示されるテーブルは，行が多すぎる場合に表示数を小分けにする機能がついているが，この機能をオフにすれば，上記の日本語が表示できない場合でも表示できるようである（今回の例で試した限りでは）．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34549/1aa99b9e-d9e8-db2b-35ca-98b90028b92b.png)

この機能をオフにするには，チャンクにオプションとしてpaged.print=FALSEを加える．
テーブルの表示が，通常のRStudioコンソールと同様になる．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34549/b0e377ec-2ff8-2d5e-4acc-1be69ab483b3.png)


例の"可能"も表示出来た．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34549/888a18d6-b304-03ce-b0fc-ed7775cc29fa.png)
はじめてのC++ 【30日目】

#はじめに
７章終わったらクラス終わってしまうのやけどやっぱ読むだけじゃわからん

##Stock List
皆様のおかげで基本的なポインタを理解できたと思います。ありがとうございます。
今日は、スマートポインタの使い方を学ぼうとおもいます。
ロベールのC++で、クラスの動的確保の単元をやっていますが、 `new` `delete`が使われているので、スマートポインタを使って `delete` を使わないようにしようと思います。
###未解決
・スマートポインタの使い方　`std::unique_ptr` や` std::shared_ptr`　←今日はここやる
・静的メンバ [参照](https://qiita.com/yumetodo/items/b0ff58617f2733d4ffa1#%E9%9D%9Estatic%E3%81%A7%E9%9D%9Evirtual%E3%81%AA%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A6%E3%82%8B)
・`std::string`
・`i++`と`++i`の違い
・`nullptr`
・`std::vector`
・`std::array`
・`enum class`
・メモリ  [メモリの話](https://qiita.com/yumetodo/items/067b2db266ae0779f030)
・`std::quick_exit` [あとで読む](https://qiita.com/yumetodo/items/ba5bef7f64636ed2f439)
・初期化子
・みえる・みえない
・this
###解決
・`int const * const * const ** const * p`

##スマートポインタ
[C++日本語リファレンス](https://cpprefjp.github.io/reference/memory/shared_ptr.html)
[C++11スマートポインタ入門](https://qiita.com/hmito/items/db3b14917120b285112f)
###スマートポインタとは
クラスのオブジェクトを動的確保するときに `delete` 忘れを防ぐための機能である。 `delete` を忘れるとメモリリークが発生する。メモリリークとは、簡単に言うと使えるメモリが減っていくって感じかな。
###使い方

```日本語リファレンス.cpp
#include <iostream>
#include <memory>

int main()
{
  // newしたポインタをshared_ptrオブジェクトに管理させる
  // 所有者は1人。
  std::shared_ptr<int> p1(new int(3));

  {
    // shared_ptrオブジェクトをコピーすることで、
    // 複数のオブジェクトが一つのリソースを共有できる。
    // 所有者が2人になる。
    std::shared_ptr<int> p2 = p1;

    // 共有しているリソースにアクセスする
    std::cout << *p2 << std::endl;
  } // p2のデストラクタが実行される。
    // リソースの所有者が1人になる。
    // ここではまだ、リソースは解放されない。

  std::cout << *p1 << std::endl;
} // p1のデストラクタが実行される。
  // リソースの所有者が0人になる。
  // 誰もリソースを参照しなくなったので、リソースが解放される。
```
一見意味の無いような`{}`がデストラクタを呼ぶためのトリガーになっているとは面白い。

##ロベールのC++
###07-11 オブジェクトを動的に作ろう
まずは、ロベールをそのまま写経

```arraystream.h
#ifndef ARRAYSTREAM_H_
#define ARRAYSTREAM_H_

#include "Stream.h"

class ArrayStream :
  public Stream
{
public:
  ArrayStream(const double* array, int size);
  ~ArrayStream();
protected:
  virtual void SetBase();//値を設定する基本関数
private:
  const double* m_array;//配列
  int m_i; //現在のインデックス
};

#endif
```

```arraystream.cpp
#include "arraystream.h"
#include <iostream>
#include <algorithm>

ArrayStream::ArrayStream(const double* array) {
  m_array = array;
  m_i = 0;
}
ArrayStream::~ArrayStream() {
  std::cout << "~ArrayStream" << std::endl;
  delete[] m_array;
}

void ArrayStream::SetBase() {
  m_n = m_array[m_i];
  if(m_n >= 0) {
    ++m_i;
  }
}
```

```new.cpp
#include "ArrayStream.h"
#include <iostream>

int main() {
  static const double ARRAY[] = { 1, 2, 3, -1};
  static const int SIZE = sizeof ARRAY / sizeof * ARRAY;
  ArrayStream stream(ARRAY, SIZE);
  while(stream.Set()) {
    std::cout << stream.Get() << ' ';
  }
  std::cout << std::endl;
}
```
ここのコードではデストラクタで `delete` を実行してメモリリークを防いでいる。

オブジェクトを動的に生成して返すクラスをよく使うみたい。ファクトリークラスとも呼ぶらしい。
ファクトリークラスを純粋仮想関数にしておけば便利になる。

###07-12 仮想デストラクタ
デストラクタは必ず仮想にしておけば間違いない。
#終わりに
ロベールの `new` `delete`　の単元はあまり参考にしてはいけなさそうなので、軽く流しておく。
クラスの単元が終わったので、Black Jack Classを作ろうと思う。
プログラミングなしでAlexa用QAチャットボットを作る

Alexaのスキルを簡単に作れるツールAlexa Skill Blueprintsが2019/3/26に日本版で公開されましたので使ってみました。

# 手順

1. [blueprints](https://blueprints.amazon.co.jp/)にアクセス 
![capt1.png](https://qiita-image-store.s3.amazonaws.com/0/271751/c2937086-49d8-86a5-29d8-467c7a8ca20c.png)
2. **カスタムQ&A**をクリック
![capt2.png](https://qiita-image-store.s3.amazonaws.com/0/271751/7cd68ad0-8539-b464-84bc-5f14afa97c4b.png)
3. **作成する**をクリック
![capt3.png](https://qiita-image-store.s3.amazonaws.com/0/271751/6d0b0647-9a1d-d128-febd-f3f3ee377375.png)
4. 質問と回答を準備
   
    想定される質問と回答を入力します。
    QAが思いつかないので、今回はまとめサイト[【爆笑】本当に面白いYahoo知恵袋の質問＆回答集](https://matome.naver.jp/odai/2138192323013832001)、[Yahoo知恵袋のおもしろ質問と回答100選](https://www.iwako-light.com/entry/diary/post-515/)の力を借りて50QA登録しました。
    一つの質問に対して言い方を変えたものも入力します。
![capt4.png](https://qiita-image-store.s3.amazonaws.com/0/271751/748bfe48-4d39-7fa0-5c92-ef0d9151cf9c.png)
5. **次へ：スキルを作成**をクリック
![capt5.png](https://qiita-image-store.s3.amazonaws.com/0/271751/dc66d2cd-066e-4f1c-182c-500812c00708.png)
6. アカウントを更新する
![capt6.png](https://qiita-image-store.s3.amazonaws.com/0/271751/822d1c25-1e53-15ea-d8a6-62e1b6703dda.png)
7. 待つ
![スクリーンショット 2019-03-31 0.02.39.png](https://qiita-image-store.s3.amazonaws.com/0/271751/16dd849e-eaa3-38e8-5bda-2d5ef56fddc7.png)
8. 完成
しばらくすると私の質問というスキルが完成します。
![capt8.png](https://qiita-image-store.s3.amazonaws.com/0/271751/6de17bcf-3d77-c7ec-209c-1bd3dd6c9f87.png)

# 結果

### 使いかた
[ここ](https://blueprints.amazon.co.jp/bp/amzn.ask.bp.9ed9e4f7-b8bb-4cd5-b1db-57c5aa3e1092?ref_=ask_bp_home_0)には<font color="Indigo">*入力したとおり正確にAlexaに質問してください。(このBlueprintを使用した場合、スキルを名前で開く必要はありません。)* </font>と書いてありますが、使えませんでしたので以下のように使いました。登録したQAが多かったのかなあ。。。

```
私　「アレクサ、私の質問」
アレクサ　「私の質問リストの質問に何でもお答えします。質問をどうぞ。」
私　「(登録した質問)」
```

### 回答精度
まあまあ良い感じでした。

- 登録した質問と同じ文言を質問した場合の回答
    - 質問が長過ぎなければ<font color="Blue">回答可能</font>
        - だめだったもの
            - 以前、知恵袋で質問したら、それくらい、ググレカスって言われました。ところで、ググレカスって、どういう意味ですか
- 登録した文言と少し異なる文言で質問した場合の回答
    - ものによっては<font color="Blue">回答可能</font>

| 登録した質問                  |ユーザ発話|回答可否                   |
|:-----------------------------|:---------------------------|:-------------------------:|
| タバコ吸う人ってバカなんですか？|タバコ吸う人って<font color="Red">アホ</font>なんですか？|○|
| うちのおかんに文句を言ったら「ふざけろ！」と言いました。ふざけても良いのでしょうか？|<font color="Red">お母さん</font>に文句を言ったら「ふざけろ」と言いました。|○|
|鼻の穴にミニトマトが入ってしまい、取れないんですけど。。もうすぐ出かけなきゃいけないし。困ってます。|鼻の穴にミニトマトが入っ<font color="Red">た</font>|○|
- 回答の発音
    - イントネーションが少し自然でないときがある
    - 読めない漢字がある
        - 「土」→「ド」

### QA登録の制約
- 登録できる質問回答は50個
- 登録できないもの
    - 空のスペースや記号、英字などは許可されていません。
    - 特定の成人向け言語は許可されていません。「死ね」という語を削除してください。
    - 項目を重複させることはできません。各項目はリスト内で一意にしてください。
- 一つの質問に対する言い換え表現の登録は3つまで
- 質問は100文字まで
- 回答は750文字まで

### スキルの公開範囲

基本的にはプライベート用のスキルのようです。自分や家族のためだけにスキルが作れます。
詳細は[こちら](https://blueprints.amazon.co.jp/help/share-your-skill#help-content)にありますが、特定の相手に共有することはできるようです。

# まとめ

とても簡単に音声対応のQAチャットボットが作れて、使えるようになるってとてもすばらしいのではないでしょうか。発音や登録できる数の制限の課題はあるものの、現状でも言葉の表現のゆらぎは吸収してくれるようですし、今ある課題も近い将来解消されることでしょう。
またblue printsは米国ではストアに公開できたり、オーディオ再生や記事の読み上げのテンプレートなども追加されているようですので、活用される範囲が増えるのではないでしょうか。
スピル時代のExcel VBA(3)

# カルテ情報の検索参照関数

前回に定義した関数を使って、NC旋盤で製品を作成する時の、ツール情報を検索参照
する関数を定義します。
情報テーブル(KJ_)には、３桁のツール番号(TNO=01,31,02,～,08,38)毎に、ツールチップ番号(L)が
格納されています。ツールチップ番号(TNO)に、機械番号(K)を加算したのが、
機械ツールチップツールチップ番号(SNO)で４桁のキー(K + L)となっています。
工具テーブル(KZT_)と、工具データ(KDA_)は、機械ツールチップ番号(SNO)で検索可能であり、
最初にMATCHした行番号を各々、KZT列、KDA列に格納します。
その行番号を元に、工材名,N,LAST,分数のデータを引っ張ってきます。

```vb
Function L_KRT(J, Optional K = 2000, Optional S = "")
    Call START_MANUAL
    
    Const T = "T,TNO,KZT,工材名,KDA,N,LAST,分数"
    Const T__ = 1, TNO__ = 2, KZT__ = 3, 工材名__ = 4, KDA__ = 5, _
          N__ = 6, LAST__ = 7, 分数__ = 8

    S1 = RMT(Range("KJ_[[#Headers],[01]:[38]]"))
    S2 = RMT(Range("KJ_[[01]:[38]]"), J)
    
    S = L_PAIR(S1, S2, T)
    
    Call L_MI("KZT_[SNO]", S, KZT__, TNO__, K)
    Call L_MI("KDA_[SNO]", S, KDA__, TNO__, K)
    Call L_IFZS(S, TNO__)
    Call L_DI("KZT_[工材名]", S, 工材名__, KZT__)
    Call L_DI("KDA_[N]", S, N__, KDA__)
    Call L_DI("KDA_[LAST]", S, LAST__, KDA__)
    Call L_DI("KDA_[分数]", S, 分数__, KDA__)
    
    L_KRT = S
    
    Call START_AUTO
End Function

Sub L_MI(RN, S, J, P, Optional K = 0)
    Set R = Range(RN)
    For I = 1 To UBound(S, 1)
        L = S(I, P)
        If L > 0 Then S(I, J) = MI(R, K + L)
    Next I
    Set R = Nothing
End Sub

Sub L_IFZS(S, J)
    For I = 1 To UBound(S, 1)
        If S(I, J) = 0 Then S(I, J) = ""
    Next I
End Sub

Sub L_DI(RN, S, J, P)
    Set R = Range(RN)
    For I = 1 To UBound(S, 1)
        S(I, J) = DI(R, S(I, P))
    Next I
    Set R = Nothing
End Sub
```
作成した表はこのようになります。

(BC26) =L_KRT(15)  ' 情報テーブルの１５行目のデータを抽出します。

![テーブル1.png](https://qiita-image-store.s3.amazonaws.com/0/184069/dddd8f8d-3e65-4f73-b652-956e83936828.png)

# 列を並び替えて編集する関数

上の表は、KZT列,KDA列は不要です。加えて列の並びも変えることにします。



```vb
Function L_SELECT(R, T, Optional S = "")
    Call START_MANUAL

    R = R: TA = Split(T, ",")
    M = UBound(R, 1) - LBound(R, 1): N = UBound(TA) - LBound(TA) + 1
    S = L_INIT(M, T)
    
    For I = 0 To UBound(TA)
        For J = 1 To UBound(R, 2)
            If TA(I) = DI(R, 1, J) Then
                S(1, I + 1) = J
                Exit For
            End If
        Next J
    Next I
    For J = 1 To N
       L = Val(S(1, J))
    
       If 0 < L And L <= UBound(R, 2) Then
           For I = 1 To M
              S(I, J) = DI(R, I + 1, L)
           Next I
       End If
    Next J
    
    Call START_AUTO
    
    L_SELECT = S
End Function
```

(AV26) =L_SELECT(L_KRT(15),"T,工材名,TNO,N,LAST,分数")
![テーブル2.png](https://qiita-image-store.s3.amazonaws.com/0/184069/9b5489fe-2e2b-8fc3-d609-f76876e204ed.png)
【PostgreSQL】WSH/VBScriptでpsqlを使用する

# はじめに
Windowsサーバーリプレース作業にて、データベースを Oracle 11g から PostgreSQL 9.6 に移行作業をしています。
OracleのSQLPlusと違って、psqlだとパスワードを指定するオプションがないので不便ですね。

# パスワード認証を省略
2通りの方法があります。

## pgpass.conf
パスワード入力なしでpsqlを実行するには、下記フォルダの「pgpass.conf」にパスワードを設定しておく。
%APPDATA%\postgresql\pgpass.conf
※pgpass.confは、postgresのdataフォルダに置くものではありません。
※pgpass.confは、UTF-8（BOM無し）で保存・作成してください。 

```bash:pgpass.conf
#hostname:port:database:username:password
localhost:5432:*:postgres:(パスワード)
```

## 環境変数(PGPASSWORD)
セキュリティ上は非推奨であるがバッチ内に環境変数(PGPASSWORD)を設定した上で実行する。

```bash
SET PGPASSWORD=(パスワード)
psql -U (ユーザー) -f xxxxx.sql 
```

# WSH/VBScriptで実行
pgpass.conf のユーザーであればパスワードを省略できるので、SET PGPASSWORDは不要ですが、指定以外のユーザーではパスワードを要求されます。

VBS上でSET変数を入れて実行するには、"CMD /C SET "を使用するのですが、PGPASSWORDに関しては簡単に行かなかった。
試行錯誤してコマンドプロンプトにてワンライナーで下記のようにすると実行できるようになりました。

```bash
CMD /C SET "PGPASSWORD=fuga" ^& "C:\PostgreSQL\9.6\bin\psql.exe" -h localhost -U test -d postgres -c "SELECT now()"
```

これならVBSで実行できるのではないかと組んだわけですが、結果は何も出力されない。

```vb
Option Explicit
Dim objShell, cmd

Set objShell = CreateObject("WScript.Shell")

cmd = "CMD /C SET ""PGPASSWORD=fuga"" ^& ""C:\PostgreSQL\9.6\bin\psql.exe"""
cmd = cmd & " -h localhost"
cmd = cmd & " -U test"
cmd = cmd & " -d postgres"
cmd = cmd & " -c ""SELECT now()"""

WScript.Echo objShell.Exec(cmd).StdOut.ReadAll
Set objShell = Nothing
```

無理矢理、なんとかしてみようと考えました。
バッチファイルを一時的に生成して実行することで、結果が表示されるようになります。

```vb
Option Explicit
Dim objShell, fso, cmd, objFile

const BAT_NAME = "tmp.bat"

Set objShell = CreateObject("WScript.Shell")
Set fso = WScript.CreateObject("Scripting.FileSystemObject")

cmd = "SET PGPASSWORD=fuga" & vbCrlf
cmd = cmd & """C:\PostgreSQL\9.6\bin\psql.exe"""
cmd = cmd & " -h localhost"
cmd = cmd & " -U test"
cmd = cmd & " -d postgres"
cmd = cmd & " -c ""SELECT now()"""
Set objFile = fso.OpenTextFile(BAT_NAME, 2, True)
objFile.WriteLine cmd
objFile.Close

WScript.Echo objShell.Exec(BAT_NAME).StdOut.ReadAll
fso.DeleteFile BAT_NAME, True

' オブジェクトを開放する
Set fso = Nothing
Set objFile = Nothing
Set objShell = Nothing
```

## SQLの実行方法
psqlのcオプションで指定する。

```vb
cmd = cmd & " -c ""SELECT now()"""
```

psqlのfオプションで外部スクリーンを指定する。

```vb
cmd = cmd & " -f test.sql"
```

StdIn.Writeでsqlを指定する。

```vb
sql = "SELECT now()"

Set objShell = CreateObject("WScript.Shell")
With objShell.Exec(cmd)
	.StdIn.Write sql
	.StdIn.Close
	WScript.Echo .StdOut.ReadAll
End With
```

# psqlを使わない
VBScriptを使うならADOが使えます。これなら普通にパスワードを指定できるよね。
ODBCデータソースアドミニストレーターの設定で"PostgreSQL35W"をしておく。

PostgreSQLの接続確認

```vb
'初期化処理
Option Explicit
On Error Resume Next
Dim Conn, RS

'DB接続
Set Conn = WScript.CreateObject("ADODB.Connection")
Conn.Open "DSN=PostgreSQL35W;UID=test;PWD=fuga"
Set RS = Conn.Execute("SELECT 'Connect OK'")

If RS.Eof Then
    WScript.Echo 1    '接続エラ－
Else
    WScript.Echo 0    '接続OK
End If

RS.Close
Conn.Close
Set RS = Nothing
Set Conn = Nothing
```

# 最後に
監視用にOracleのSQLPlusを使用していたプログラムの移植ってことでpsqlの使用を考えていたのですが、ものによってはADOを使用しても問題ないわけです。
ここらへんは柔軟に変更していくことも考えてみる。
【講演内容まとめ】【まつもとゆきひろ氏　特別講演】20代エンジニアのためのプログラマー勉強法

#まつもとゆきひろさん講演会

2019/03/30　
Rubyの生みの親、まつもとゆきひろさんの20代エンジニア向け講演会があったので、行ってきました。
以下に箇条書きで内容をまとめます。

■開催概要
https://supporterzcolab.com/event/731/

■当日実況TLハッシュタグ
(シャープ)spzcolab

##勉強するのは「死なないため」

####現代は罠が多く、テクノロジーが人を幸せにしない。
　・例：エントリーシート
　・就活生にとっても、人事にとってもいい事はない。
　・たやすく絡みつく「死の連鎖」
　・体を壊しても、誰も責任を取らない。
　・本当は色んな事に「No」と言ってもいい。
			
####こんな時代にモラトリアムはもったいない。
　・偉人も若い時に偉業を達成している。
　・若い時の柔軟な思考によるもの。
　・アインシュタイン、マーク・ザッカーバーグなど
　・松本さんがRubyを作り始めたのも27歳の時
　・若いということはアドバンテージ。
　・体力がある、発想も柔軟、大学で学んだことが鮮明。
				
　・若い時期は社会的地位がない。
　・上司の言うことを聞くだけではなく、自分のことも大事にする。
　・自分の面倒を一生見てくれる会社はない。

####流されないために「戦略」が必要
　・「自分がどうしたいのか」
　・「何をしたいのか」
　・「これから何を目標とするのか」
　・「若い時期」＝「自分の人生に大きな影響を与える時期」に決めましょう


##学生の時との勉強の違い

###期待される答えと言うものがなくなる

・満点を取るという概念がないので、得意なことを1000点まで伸ばすこともできる。
・苦手な事を頑張るより、それが得意な人と組むのもあり。

###「知識」と「インデックス」

・学生時代は記憶がメインで、大概の場合、試験が本番
・社会人は常在戦場
・社会人は定番がどんどん変化するため、分からないことは調べる。
・どう調べればいいのか、知っていればいい。
→知識へのインデックスを持つ。

###抽象化について

####メリット

　・理解しやすい。
　・類似性からパターンを抽出できる。
　・プログラムも抽象化の塊。

####デメリット
　・抽象化して、物事を単純にすると、「漏れ」が生じる。
　・例：二元化　→「善」と「悪」など
　・「漏れ」は現実世界とのズレであり、大きな影響を生むこともある。
　・人間は「シンプルに理解したい」欲求があるので、単純化された概念を好みがち。
　・だが過剰な単純化は危険

##何を学ぶか

###差別化を意識しよう

・苦手克服は社会ではあまり意味がない。
・学校っぽい勉強はもったいない。

・得意なことはモチベーションにつながる
→好きこそものの上手なれ。

・自分は何が得意で、何が好きなのか、考えましょう。
・得意な事を伸ばしましょう。それが生活に結びつくとなおよし。

・何を学ぶかは自分で決めよう。他人は教えてくれない。
・自分で線引して、妥協点を自分で決める。
・人間の判断を信用しない(他人自分関係なく)
・時々振り返って、自分はどこまでできるか考える。

・お金のことだけ考えると、判断が鈍る。
・これやっとけばOKというものはない。


##どこで学ぶか

###ポジティブループを目指そう

・大事なのは周囲との関係。
・勉強するということは、高評価を受けるためと考えてもいい。
・ポジティブフィードバックで成長できる。

・ポジティブループは簡単に壊れる。
・搾取する人からは逃げる。
・持続可能な関係は「Win-Win」か「No Deal」のみ。
・損をしてはいけない。逃げることは悪くない。
・自分を追い込むのはよくない。
・いい環境で学びましょう。

##いつ学ぶか

###ヒマを撲滅する

・仕事を早く終わらせて余った時間や、細切れの時間を使う
・プライベートは犠牲にしなくていい。
・睡眠時間は減らすと、脳が疲れる。
・優先順位をはっきりさせる。
　−惰性でやっているものを減らす(ゲームなど)
　−情報収集の視点を変える

##どう学ぶか

###好奇心を育てる

・概要を把握する
・知らないことを知るのは楽しい

###アウトプットしよう

・とにかくやってみよう。
・自分の内面を知ってもらうためにアウトプットする。
・伝えないと伝わらない
・ブログ、Qiita、Twitter、etc…
・クオリティは重要ではない。間違っていたら後で謝って、訂正すればいい。

・アウトプットすると、自分が最適化される。(楽になる。)
・最初は時間がかかるが、繰り返せば短縮できる。
・自分の考えは他人にアウトプットしてもらえない。

####マタイの法則
「おおよそ、持っている人は与えられて、いよいよ豊かになるが、持っていない人は、持っているものまでも取り上げられるであろう。」（マタイ福音書13章12節）

・成功するためには、成功する必要がある。
・まず成功するためには、知られる必要がある。
→そのためのアウトプット
・アウトプットする時は、ユニークなもの、埋没しないものが良い。
→多くの人がいる分野は、上位に行くのが難しい。

##大事なこと

###基礎を抑える
・コンピュータサイエンスなど、大学で学ぶ知識

###英語
・新しい技術にいち早くコミットできる
・英語で探し方を知っておくと、アドバンテージになる。

###コンフォートゾーン
・居心地のいい場所にいると、成長が鈍る。
・人に言われて出ていくのは駄目。
・自分で決めて、自分で出ていく。


##執筆後記

以下は講演会に参加した私の感想です。

講演会で松本さんが「アウトプットが大事」と仰っていたので、早速この記事を書いてみました。
この記事は記録と共有を目的とし、本文に関しては箇条書きで、極力私の主観を交えない書き方を取りました。ただ、他の方のまとめたかを見ていると、もっとシンプルに要点をまとめることはできたのではないかと反省しています。。。

講演された内容に関して、私は自分のキャリアに照らし合わせながら聞いていました。28にもなってキャリアプランに具体性がかけると感じており、モヤモヤしていましたが、こうして松本さんがお話してくださることで少し整理がついて、楽になりました。

またお話を聞く中で、以下の2点は非常に重要な点だと感じました。
「苦手を克服するより、得意分野を伸ばす」「苦手なことは「それが得意な人」に任せるのもあり」
このポイントは自分やチーム全体を守ることに繋がりますし、世代関係なく意識しておくべき考え方なのではないかなと思います。

執筆にあたっては、自分のメモ書きだけでなく、Twitter上の実況TLのツイートを参考にさせていただきました。
当分はこちらのハッシュタグで、流れが追えます。
paddingとmarginの違い

###paddingとmarginの違い
paddingとはいわゆる内側の余白ことを示しています。
つまり要素内の余白をいじる際にはpaddingを使用することになります。
marginとはpaddingとは違い外側の余白のことを意味しています。
つまり要素間の距離、余白を調整するときに使用します。

###影の微調整の仕方
box-shadowを使用すると影を付けることができますが、微調整といったものが難しくなります。
そこで使用するのがfilter: drop-shadowです。
これを利用することで影の薄さや色を微調整できるので一工夫したいときにおすすめです。
CloudFormationでDynamoDB作成時にハマったこと

AWSのリファレンスを読みながら作成したのに、少しハマったので・・

### 最初に書いたコード
- 実行してもDynamoDBが作成されません

```ruby:yaml
---
AWSTemplateFormatVersion: 2010-09-09
Description: DynamoDB Crete
Parameters:
  TableName:
    Type: String
    Description: DDB Table Name
Resources:
  DDBTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: !Ref TableName
      AttributeDefinitions:
        -
          AttributeName: CreatedId
          AttributeType: S
      KeySchema:
        -
          AttributeName: CreatedId
          KeyType: HASH
Outputs:
  DynamoDBTableName:
    Value:
      !Ref DDBTable
    Description: DynamoDB Table Name
```

- プロパティで「必須：はい」のものを全て指定してもうまく実行されない
- ![スクリーンショット 2019-03-31 0.45.58.png](https://qiita-image-store.s3.amazonaws.com/0/77327/0f9288c4-7ca5-3021-8e8f-ce0eb1fed696.png)

### よく読んだら、デフォルトで入る値によって、必須となるパラメータがあった
- BillingModeがデフォルトでPROVISIONEDに設定され、その設定の場合、ProvisionedThroughtputの記述が必須になる
- ![スクリーンショット 2019-03-31 0.48.29.png](https://qiita-image-store.s3.amazonaws.com/0/77327/5d4d20ba-ec48-dd70-2c94-1488f0ad10af.png)
- ![スクリーンショット 2019-03-31 0.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/77327/4a7bb3c3-011d-8c37-ad7b-3083c426e77d.png)

### 正しいコード
- うまくいった

```ruby:yaml
---
AWSTemplateFormatVersion: 2010-09-09
Description: DynamoDB Crete
Parameters:
  TableName:
    Type: String
    Description: DDB Table Name
Resources:
  DDBTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: !Ref TableName
      AttributeDefinitions:
        -
          AttributeName: CreatedId
          AttributeType: S
      KeySchema:
        -
          AttributeName: CreatedId
          KeyType: HASH
      ProvisionedThroughput:
        ReadCapacityUnits: 3
        WriteCapacityUnits: 3
Outputs:
  DynamoDBTableName:
    Value:
      !Ref DDBTable
    Description: DynamoDB Table Name
```
macOS MojaveにpostgreSQLをインストールして設定まで

postgreSQLをwindows環境下で勉強していたのですが、macにも導入する必要が発生したのでその際の試行錯誤を記録。
windows環境では下記の本を参考に導入しました。
【参考元】SQL 第2版 ゼロからはじめるデータベース操作

環境

- macOS Mojave 10.14.2
- postgreSQL 11.2

### postgreSQLのインストール
ターミナルを起動してコマンド入力

```console
$ brew install postgresql
```
インストール先
` /usr/local/var/postgres `

### ロケールを変更

```console
$ initdb /usr/local/var/postgres --locale ja_JP.UTF-8
```

###インストールできているかバージョン確認してみる

```console
$ postgres --version
postgres (PostgreSQL) 11.2
```

### 設定ファイルの書き換え
ローカルマシンからのみpostgreSQLに接続可能な設定にしておきます。
まずフォルダへ移動

```console
$ cd /usr/local/var/postgres
```

設定ファイルを開きます。vimはまだ使いこなせないのでnanoを使用。

```console
$ nano postgresql.conf
```
エディタが開くので
` #listen_addresses = 'localhost' `
とコメントアウトされている一文の#を削除
→　` listen_addresses = 'localhost' `

後々データーベース接続ソフトを使用したいので、portも設定しておきます。

` #port = 5432 `
とコメントアウトされている一文の#を削除
→　` port = 5432 `

### postgreSQLサーバーを起動
```console
$ postgres -D /usr/local/var/postgres
```
※ 終了するには `control+c`

###postgreSQLへの接続（ログイン）
先程起動したサーバーとは別画面でターミナルを起動して接続

```console
$ psql -d postgres
psql (11.2)
Type "help" for help.

postgres=# 
```

完了!

---
参考にさせて頂いた記事

- MacにPostgreSQLをインストール
https://qiita.com/_daisuke/items/13996621cf51f835494b#homebrew%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
- macOs Sierra + homebrewな環境でPostgresqlを導入する備忘録
https://qiita.com/gooddoog/items/1f986c1a6c0f253bd4e2
Adobe XDの基本の使い方

AdobeXDの使い方メモ

### Adobe XDをまずは無料版を入手してみる
- https://www.adobe.com/jp/products/xd.html
- <img src="https://qiita-image-store.s3.amazonaws.com/0/77327/ab8b6599-1b90-1ea6-d760-9b03e87076c1.png" width="500">

### チュートリアルを見ると、やることのイメージが湧く
- <img src="https://qiita-image-store.s3.amazonaws.com/0/77327/3db86cc4-4483-6622-4f81-36a680f5f88f.png" width= "500">

### プラットフォームを選択する
- <img src="https://qiita-image-store.s3.amazonaws.com/0/77327/8fa791c0-b9b2-2a0f-1e88-ae68215573eb.png" width= "500">

### 新しいページを追加する
- 左のメニューから追加のアイコンを選択
- プラットフォームは右のメニューで再度選択することができる
- 真ん中のフィールドをクリックすると、自動的に追加される
- ![スクリーンショット 2019-03-30 23.49.56.png](https://qiita-image-store.s3.amazonaws.com/0/77327/a4fbbd90-2476-f5a1-2be8-1361335496d0.png)

### 四角など図形を追加する
- 左メニューから四角のアイコンを選択した時に追加できる
- 図形内の◉で角を調整できる
- ![スクリーンショット 2019-03-30 23.58.20.png](https://qiita-image-store.s3.amazonaws.com/0/77327/b61b783d-8a56-0307-e4e2-6e1799f96f57.png)
- 同様に丸や直線も四角の下のメニューから作成できる

### テキストを追加する
- 左メニューからTアイコンを選択した時に追加できる
- <img width="1233" alt="スクリーンショット 2019-03-31 0.06.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/77327/8df400b8-0044-c26d-777c-a0799fa931c8.png">
- 右のメニューのテキストで文字サイズやテキストボックス内の位置を変更できる
- 右メニューのアピアランスの色で文字の色を変更できる

### 要素の位置を移動する
- 左メニューの一番上のアイコンを選択した時に要素を移動したり、要素の操作したりできる
- ![スクリーンショット 2019-03-31 0.32.35.png](https://qiita-image-store.s3.amazonaws.com/0/77327/8d3a5bd6-561f-b709-d498-2dc849d88df5.png)

### ページ遷移の設定をする
- プロトタイプタブを選択
- 何らかのトリガーでページ遷移する設定を指定することができる
- ![スクリーンショット 2019-03-31 0.35.53.png](https://qiita-image-store.s3.amazonaws.com/0/77327/2f257dab-78a5-5759-b169-64402a3b9427.png)
SignInHubActivity does not implement interface 'androidx.lifecycle.LifecycleOwner' というエラーを解決した

AndroidXに移行して喜んでいたつかの間、エラーに苦しめられた。
どうにか解決したので記録しておく。

## 現象

1. SuportLibrary28 から AndroidX に移行した。（Android StudioのMigrateで）
- Google SignInさせる画面があり、ダイアログでGoogleアカウントを選択する
- アカウント選択するとエラーでアプリが落ちる。

### エラーメッセージ
```
'com.google.android.gms.auth.api.signin.internal.SignInHubActivity' does not implement interface 'androidx.lifecycle.LifecycleOwner' in call to 'androidx.lifecycle.Lifecycle androidx.lifecycle.LifecycleOwner.getLifecycle()' 
(declaration of 'androidx.lifecycle.LiveData' appears in /data/app/パッケージ名-vMvkbDRCPbVgROuCpJ301g==/base.apk!classes2.dex)
```
`SignInHubActivity` に `LifecycleOwner`が実装されていない、という内容？

### エラーが発生する箇所のコード

Google SignInさせる画面をひらいた後でエラーで落ちてる

```java
GoogleSignInOptions options = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestEmail()
    .build();

GoogleApiClient client = new GoogleApiClient.Builder(this)
    .enableAutoManage(this, this)
    .addApi(Auth.GOOGLE_SIGN_IN_API, options)
    .build();

Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(client);
startActivityForResult(signInIntent, SIGN_IN); //この後のアカウント選択で落ちてる
```

### app/build.gradleの構成

```gradle:app/build.gradle
android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'

//〜省略〜
    implementation "androidx.appcompat:appcompat:1.0.2"
    implementation "androidx.legacy:legacy-support-v4:1.0.0"
    implementation "com.google.android.gms:play-services-auth:16.0.1"
//〜省略〜
```

## 解決策
build.gradelの `androidx.appcompat:appcompat`のバージョンを上げて`1.1.x`系にすると発生しなくなった。

`1.0.x`系では絶対にエラーになるようだ。

```gradle:app/build.gradle
//    implementation "androidx.appcompat:appcompat:1.0.2" <= エラーになる
    implementation "androidx.appcompat:appcompat:1.1.0-alpha03" // <= 修正後、エラーにならない
```

## 参考リンク
android - Google Auth migrating to androidx: SignInHubActivity does not implement Lifecycle - Stack Overflow 
https://stackoverflow.com/questions/53899751/google-auth-migrating-to-androidx-signinhubactivity-does-not-implement-lifecycl

いやー解決してよかった
日本語の方法はあまりないみたい