OmniAICreator/Qiita-1.07M huggingface dataset:
php-master-changes 2019-03-14

今日はドキュメントの修正、ZTS の高速化、\_\_COMPILER_HALT_OFFSET\_\_　利用時にコンパイラがクラッシュする場合がある問題の修正があった！

# 2019-03-14
## claudepache: test reversed
- https://github.com/php/php-src/commit/37443a6318e04ef0e6cc993aa7ee0bf1afee5394
- UPGRADING で、例示コードの条件判定が誤っていた問題の修正

## petk: Integrate README.EXT_SKEL to help option
- https://github.com/php/php-src/commit/a1b7bc0c8148eaf728fccdffe147e3bc0c03f18e
- [7.4~]
- README.EXT_SKEL を削除し、内容を `ext_skel.php --help` 実行時の出力へ移動

## dstogov: Implemented a faster way to access predefined TSRM resources - CG(), EG(), etc.
- https://github.com/php/php-src/commit/9499484ed2f0377678b2b4d88573327ee0e4ce6d
- [7.4~]
- ZTS 版で、CG や EG 等一部のスレッドローカルなリソースへのアクセスを高速化する修正の実装
- [ZTS improvement idea](https://externals.io/message/104378) で出ていた[修正案](https://wiki.php.net/zts-improvement)が実装された形かな、ZTS での TSRM アクセスで 6 命令が 3 命令になって JIT が入ったら 2 命令とか 1 命令もいけるよってやつ

## laruence: Fixed bug [#77738](https://bugs.php.net/bug.php?id=77738) (Nullptr deref in zend_compile_expr)
- https://github.com/php/php-src/commit/c7920aba3e1892accca7cd13ef5b8a8fbf48b5c2
- [7.2~]
- \_\_COMPILER_HALT_OFFSET\_\_　利用時にコンパイラがクラッシュする場合がある問題の修正

## laruence: updated NEWS
- https://github.com/php/php-src/commit/82174e68b6065e8593c2cf8da86841b36037d166
- [7.3~]
- ↑の NEWS への追記
t2 ファミリーから t3 ファミリーへ

だいぶ久々の投稿。


##  概要
t2 ファミリーで稼働している CentOS7.3 の AMI を t3 ファミリーで動かすまでのプロセス

## やったこと
### NG パターン
1. ENA(Elastic Network Adapter) を利用できる必要があるため、kernel のバージョンアップ
2. EnaSupport の有効化
3. t3 ファミリーインスタンスへの変更
4. 起動 --> NG!!

dracut-initqueue timeout だって(´・ω・｀)

### OK パターン
1. ENA(Elastic Network Adapter) を利用できる必要があるため、kernel のバージョンアップ
2. initramfs に NVMe ドライバを利用できるよう、設定変更  <-- Add!!
3. EnaSupport の有効化
4. t3 ファミリーインスタンスへの変更
5. 起動 --> Completely!!

## 詳細説明
理由は簡単。Nitro System は、NVMe ブロックデバイスを使用する
CentOS(RHELも同じはず)7.3 以前の AMI には、dracut の設定に NVMe ドライバの設定が無い
なので、↓のようなものを準備する必要がある

```bash:/etc/dracut.conf.d/enable_nvme.conf
add_drivers+=" nvme "
```

その後、dracut を実行し、initramfs を作成

```bash:
dracut -v -f
```

再生成した initramfs に NVMe ドライバが追加されているか確認

```bash:
# lsinitrd /boot/initramfs-3.10.0-862.11.6.el7.x86_64.img |grep nvme
drwxr-xr-x   3 root     root            0 Mar 14 18:25 usr/lib/modules/3.10.0-862.11.6.el7.x86_64/kernel/drivers/nvme
drwxr-xr-x   2 root     root            0 Mar 14 18:25 usr/lib/modules/3.10.0-862.11.6.el7.x86_64/kernel/drivers/nvme/host
-rw-r--r--   1 root     root        27036 Aug 15  2018 usr/lib/modules/3.10.0-862.11.6.el7.x86_64/kernel/drivers/nvme/host/nvme-core.ko.xz
-rw-r--r--   1 root     root        16704 Aug 15  2018 usr/lib/modules/3.10.0-862.11.6.el7.x86_64/kernel/drivers/nvme/host/nvme.ko.xz
```

これでOK

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/
Twitterのつぶやき数を数えるPrometheus ExporterのDockerイメージを作りました。

## 概要

こちらのGo製のTwitter用Prometheus ExporterをDockerイメージにしました。
https://github.com/cosmopetrich/twitter_stream_exporter

## 使い方

詳細はこちら
https://github.com/contribu/twitter_stream_exporter_docker
プログラミングとは

- 目次
    - プログラミングとはコンピュータにお願いをすること
    - どのようにお願いするのか？
    - お願いごとを加速させる「フレームワーク」
    - まとめ

#プログラミングとはコンピュータにお願いをすること

プログラミングとはコンピュータにお願いをすることです。

もっと言うと、お願いごとの手順（プログラム）を書くことです。

料理のレシピのようなイメージですね。

まずこれして、次にこれして・・・という手順をまとめて書いておくと、コンピュータがそれを理解してそのとおりに処理してくれます。

たとえばTwitterのように何億ものユーザーがリアルタイムでいいねしたりフォローしたりユーザー登録したりするのを人間だけで処理することは不可能です。

そんな、人間には到底不可能な作業をコンピュータにお願いしてやりたいことを実現（しかも高速で正確に）することができるのがプログラミングです。

このお願いをうまくしていくことでTwitterのようなアプリがつくれたり、人間の生活を豊かにするサービスを生み出すことができます。

つまりプログラマーとは「コンピュータにお願いするのがうまい人」ですね。

コンピュータにうまくお願いして、世の中の困りごとを解決したり生活を豊かにするサービスを作ったりして価値を生み出すことができるから、プログラマーはとても高収入なのですね。


#どのようにお願いするのか？

コンピュータにお願いするときには、プログラミング言語で行う必要があります。

プログラミング言語は一つだけでなく、サイトの見た目をつくる言語、アプリをつくる言語、ゲームをつくる言語など、それぞれ違った特性をもつたくさんの種類の言語があります。

そのプログラミング言語のルールに従って、お願いを順番通りに書いていきます。

人間と違って「大体」で理解してくれないので、正確に、順番通りにお願いしていく必要があります。

例えば、Rubyというwebアプリケーションをつくるのが得意な言語があります。（あのクックパッドもこの言語でつくられています）

この言語の場合は、「エディタ」というお願いごとの手順を書くツールと「ターミナル」というエディタで書いたお願いごとを実行するツールで行います。

Macの場合「ターミナル」は標準装備されてるので、「エディタ」をダウンロードします。（ぼくはAtomというエディタを使っています）

「エディタ」でお願いごとを書いて、「ターミナル」で実行するためのコマンドを打ち込む、という感じです。

▼「エディタ」に入力
```puts "Hello World"```

▼「ターミナル」に入力
```ruby hello.rb```

すると、

Hello World

と表示されます。


#お願いごとを加速させる「フレームワーク」

Twitterのような複雑な仕組みのアプリケーションを上のように一つ一つお願いをして作っていくとしたら気が遠くなりますが、「フレームワーク」という便利なものを使うことで、圧倒的に高速にアプリを開発していくことができます。

「フレームワーク」とは日本語で言うと「枠組み」ですが、用意された枠組みを使うことで一から開発を行うよりも圧倒的に早く進めることができるというわけです。

Rubyでいうと「Ruby on Rails」というフレームワークが用意されています。

これをつかうと、必要なフォルダやファイルが１つのコマンドですべて作れてしまうのです。

Railsの枠組みの中でHTML・CSS・Rubyなどを使用して、そのフォルダやファイルの内容を変更することで、アプリを作っていきます。


#まとめ

・人間には到底不可能な作業をコンピュータにお願いしてやりたいことを実現することができるのがプログラミング

・コンピュータにお願いするときには、プログラミング言語で、そのルールに従ってお願いを順番通りに書いていく

・「フレームワーク」を使うことで、圧倒的に高速にアプリを開発していくことができる
情報処理安全確保支援士 平成30年度春 午後1問3

#設問1
**(1) a：ウ b：エ**
リスクアセスメントは**リスク特定→リスク分析→リスク評価**の順で進められます。
1度[JIS Q 31010 : 2012](https://kikakurui.com/q/Q31010-2012-01.html)を読んでおいた方がいいかもしれません。

**(2) c：ア d：ウ**
リスクが発生しやすいのか、しにくいのか分析することは後のリスク対応時に対応するのか判断するために必要になります。
また、発生した場合の組織に対する影響度というのも分析することも必要です。
他選択肢はリスク対応の時に判断するもので、リスク分析時に行うことではありません。

#設問2
**(1) ファイル転送サーバから研究開発PCへの通信はFW2で禁止されているから**
表3を確認するとFW1,2で許可/拒否する通信が記載されていおり、設問では事務PCからファイル転送サーバにマルウェア感染する可能性はあるが、ファイル転送サーバから研究開発PCにマルウェア感染する可能性は低いとあります。
なぜなら、事務PCからファイル転送サーバへの通信は許可されているため、マルウェアの転送は可能です。
しかし、ファイル転送サーバから研究開発PCへの通信は許可されていないため、マルウェアを転送(感染させる)ことはできません。
(ファイルにマルウェアを感染させればできると思いますが・・・)

**(2) e：利用者ID f：パスワード g：アップロード用URL**
マルウェアβが3つの情報を取得してファイル転送サーバにアクセスしています。
表4項番2を確認すると、**利用者**IDと**パスワード**を入力してファイル転送サーバにアクセスしているためこの情報は必要そうです。
また、想定される被害はファイル転送サーバへのアップロードのため、**アップロード用URL**を取得する必要があります。

**　　方法：事務PCのHTTPリクエストを監視する。**
表4項番1ではHTTPを悪用した脆弱性vがファイル転送サーバにマルウェア感染を行っていました。
そのため通信はHTTPで行われており、ファイル転送サーバにログインする際のID、パスワードは暗号化されていません。
事務PCとファイル転送サーバ間の通信を盗聴すればID、パスワード、アップロード用URLを取得できそうです

**(3)研究開発PCからファイル転送サーバにアクセスして、ファイルをダウンロードする必要があるから**
これはあまり納得がいっていませんが、研究開発員は事務PCと研究開発PCの2台を保有しており、事務PCからファイル転送サーバにファイルをアップロードし、研究開発PCでダウンロードする流れになります。
そのため、身に覚えのない(不正な)ファイルがアップロードされていたとしても自分でアップロードしていないファイルならわざわざそのファイルをダウンロードすることはないから、マルウェアに感染することはないでしょうという答えだと思っています。
感覚的な解答にあまりスッキリしない問題です。

#設問3
**・h：高い i：通信経路上に感染活動を遮断する機器が存在しないから**
**・j：低い k：FW2によって感染活動を遮断できるから**
(あ)に設置した場合、**配信サーバと研究開発PCの間に設置されているのはL2SWのみで不正な通信を制御するような機器は存在しない**ため、感染の可能性は**高い**です。

表6の事務PCから配信サーバへの感染経路について(い)に設置した場合、FW1を間に挟むため不正な通信を遮断してくれそうです。
これと同様で**研究開発PCと配信サーバの間にはFW2を挟む**ため感染の可能性は**低く**なります。

#設問4
**上長による承認**
パスワードの再入力はHTTPリクエストが監視されている可能性があるため、無意味ですね。
候補としてはこの解答位しかないのではないのでしょうか。
話は若干ずれますが、私の会社ではメール誤送信のため一度メールをアップロードして、上長によるチェックでOKをもらえればメールを送信するという形式になっています。メールのWチェックを行っている会社は多いと思われます。
ただ、問題が難しいためこういう問題もあるんだなと暗記して置いた方が良さそうです。
ElixirでElixirインタプリタを作成していく(第2回 基本的な引数の分割)

#ElixirでElixirインタプリタを作成していく
##第2回 基本的な引数の分割
前回に引き続き，今回は文字列として与えられる引数をリストとして返す関数を作成していく．
リストは`apply`関数に渡すものであり，

```elixir
"1, 2.0, \"hello\"" |> function
# [1, 2.0, "hello"]
```
のようになるようにする．
しかし上記のように分割するために初めに文字列のリストとして分割すると変換しやすそうである

```elixir
"1, 2.0, \"hello\"" |> function
# ["1", "2.0", "\"hello\""]
```

ここで関数functionを次のように定義する
###定義
関数名:`arg_convertion`
引数:`String`
返り値:`[String]`

###実装
今回は引数分割の実装を行っていく．
ここで通常`,`で区切れば引数を分割できると考えるだろう．
つまり次のように書くことができる

```elixir
String |> String.split(",")
```
しかしよく考えてほしい，`List`や`Map`,`Tuple`にはそれぞれの中で`,`を使用する
次のような場合を考えてみよう

```elixir
"1, [2, 3, 4]"
```
これは，引数の個数は2であることがわかるであろう.実際に関数を呼び出すとき

```elixir
Example.function 1, [2, 3, 4]
```
となり，呼び出される関数は`Example.function/2`であるべきだ
しかし`String.split`で分割してしまうと

```elixir
["1", " [2", " 3", " 4]"]
```
となり，引数が4つあるように感じてしまう．
この状態から後ろ3つを`List`として抽出することは不可能でないだろう
しかし，理想としては一発で2つに分割できる事が望ましい
そこで正規表現を用いた`Regex.split`関数を用いることとする
次に`Regex.split`を用いたコードを示すが，このコードはすでに`List`や文字列などを考慮して作成したものだということを念頭にいれていてほしい

```elixir
    Regex.split(~r/(\%.*\{.*\}|\[.*\]|\{.*\}|,|\".*?[^\\]\"|\s)/, arg, include_captures: true)
```
この時，`include_captures: true`によって分割の指標となる文字列も`List`として現れることとなる
実際に使用すると次のようになる

```elixir
["1", ",", "", " ", "", "[2, 3, 4]", ""]
```
`,`やスペース，空文字列も分割されていることがわかるだろう，
そこでいらないものを排除する関数を作成する．

```elixir:Core/utils.ex
defmodule ElixirInterpreter.Core.Utils do
  def drop_value(list, [head | tail]) when is_list(list) do
    list
    |> Enum.reject(fn x -> x == head end)
    |> drop_value(tail)
  end
  def drop_value(list, []) when is_list(list), do: list
end
```
上記の関数を作成して次のようにする

```elixir
["1", ",", "", " ", "", "[2, 3, 4]", ""] |> ElixirInterpreter.Core.Utils.drp_value

```
すると結果は

```elixir
["1", "[2, 3, 4]"]
```
となり，2つに分割できていることが確認できる．
これは`List`だけでなく`Map`や`Tuple`,`Struct`においても分割が可能だ

以上の関数を関数として実装しておく，

```elixir:core.ex
defmodule ElixirInterpreter.Core do
   ...
   def arg_split(arg) when is_binary(arg) do
    Regex.split(~r/(\%.*\{.*\}|\[.*\]|\{.*\}|,|\".*?[^\\]\"|\s)/, arg, include_captures: true)
   end
end
```



これで引数を`List`に変換する目途が立ったように思う
今回で`Integer`,`Float`,`nil`の実装も考えたが内容が大きなものだったので次回に持ち越そうと思う

第0回　[目次](https://qiita.com/Sepi110902/items/10e5f0645cacfc322bd4#_reference-08b7184ee12141f375b2)
第1回　[文字列からモジュールと関数を導き出す](https://qiita.com/Sepi110902/items/37bd14721b552a9eb80c)
第3回　[文字列のリストを値として変換していく](https://qiita.com/Sepi110902/items/12a39a44309b318bb025)

以下ソースコード(マスターでゴリゴリ開発してるので悪しからず．）
GitHub: [ElixirInterpreter](https://github.com/SeitaHigashi/elixir_interpreter)
複数人にプッシュメッセージを簡単に送信するツール

#はじめに
2019年春からMessagingAPIの料金プランが改定されてフリープランでもプッシュメッセージが利用出来るようになります。MessagingAPIはRESTAPIなのでcurlで叩けばすぐにプッシュメッセージを送信することは出来るのですが、複数人に送信するとなるとなかなか面倒臭いですし、一度に150人までしか送信することが出来ません。なので、userIdのリスト(CSVファイル)を読み込めば簡単にプッシュメッセージが送信できるツールを作成しました。
#導入方法
1. 任意の場所にフォルダをひとつ作り、そこでターミナル(Windowsの場合はcmd)を開きます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260292/768ba88c-cba0-ba89-28b4-c842270be7a0.png)
2. 以下のコマンドを入力してGitからツールのコードをクローンします

    ```terminal
    git clone https://github.com/shinbunbun/Sending-Push-Message.git
    ```
3. クローンが完了したら以下のコマンドを入力してディレクトリを移動します

    ```terminal
    cd Sending-Push-Message
    ```
4. 以下のコマンドを入力してモジュールをインストールします
 
    ```terminal
    npm i
    ```
5. 以上で環境構築は完了です

#使い方
[導入方法](#導入方法)の時に使ったterminalをそのまま使用します

1. 以下のコマンドを入力してサーバを立ち上げます

    ```terminal
    node app.js
    ```

2. 以下のような表示が出れば成功です

    ```terminal
    Server running at http://localhost:3000
    ```

3. http://localhost:3000 にアクセスして以下の画像のようなページが表示されたらOKです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260292/76acd5ab-b061-737d-9108-940dcbeef757.png)
4. 「AccessToken」という所にBotのアクセストークンを入力します([LINEDevelopers](https://developers.line.biz/ja/)のBotのページから取得出来ます)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260292/c3734e3b-51e8-7809-0302-8fe24c8dfe6c.png)
5. 「Choose File」を押して送信したいuserIdのリスト(CSV)を選択します
※CSVは以下の画像のような（各userIdを改行で区切るような)形式で作成してください

**Excelで開くと**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260292/beafe60f-ad38-66d1-cfc6-23e0f624e001.png)
**テキストエディタで開くと**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260292/92091128-79c0-00da-f6fc-ae76d527fb8d.png)
6. 送信したいメッセージを[MessagingAPIのリファレンス](https://developers.line.biz/ja/reference/messaging-api/#message-objects)に載っているような形式のJSONで入力してください（[こちら](https://github.com/shinbunbun/Sending-Push-Message/blob/master/sampleFile/message.md)にサンプルを載せています）
7. 「submit」を押して送信完了です
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260292/876c6cd1-a447-142f-fe89-46eab7c0ebe3.png)
8. 「result」という所にAPIから返ってきたレスポンスが表示されます。

※プッシュメッセージは一度に150人までしか送信する事が出来ないため、csvに150以上のuserIdが入っていた場合は150人ごとに分割してAPIを叩いています。
例えば500人に送信する場合は、「150人,150人,150人,50人」の4回に分けてAPIを叩くといった具合です。そのため、APIからのレスポンスもAPIを叩いた分だけ配列になって表示されます。先程の例でいうと[1回目のレス,2回目のレス,3回目のレス,4回目のレス]といった感じです。
メッセージ送信処理が正常に完了した場合は以下のようなレスポンスが返ってきます

```
#150人以下の人にメッセージを送信する場合
["{}"]
#150人以上の人にメッセージを送信する場合
["{}","{}","{}" ... "{}","{}"]
```
```"{}"``` ではなく何か文字列が返ってきた場合はエラーとなりますので、入力した情報が正しいかご確認ください。
Debian と Ubuntu のバージョン対応表

# バージョンの対応
docker hub など見てると Ubuntuとdebianのバージョン名が飛び交ってますが、対応が全然、覚えられないのでメモ。

こちらから引用しました。ありがとうございます。
https://okadahiroshi.hatenablog.com/entry/2018/11/20/125335

| Ubuntu 数字 |  Ubuntu 略名 |  Debian 数字 |　　Debian 略名  |
|:-----------|:-----------:|:-------------|:---------------:|
|18.10| Cosmic | 10 | buster |
|18.04 LTS| Bionic | 10 | buster |
|16.04 LTS| Xenial | 9 | stretch |
|14.04 LTS| Trusty | 8 | jessie |
tenacityを使ってretry処理を書く

## 参考
https://githubja.com/jd/tenacity

## サンプルコード
```Python
import logging
from tenacity import retry, stop_after_attempt, wait_fixed, before_log, RetryError
logger = logging.getLogger(__name__)


class MyException(Exception):
        pass


@retry(stop=stop_after_attempt(3), wait=wait_fixed(1))
def raise_my_exception():
    raise MyException("Fail")


try:
    raise_my_exception()
    print("aiueo1")
except MyException:
    print("aiueo2")
except RetryError:
    print("aiueo3")  # output: aiueo3

```

```Python
import logging
from tenacity import retry, stop_after_attempt, wait_fixed, RetryError
logger = logging.getLogger(__name__)


class MyException(Exception):
        pass


@retry(reraise=True, stop=stop_after_attempt(3), wait=wait_fixed(1))
def raise_my_exception():
    print("test")
    raise MyException("Fail")


try:
    raise_my_exception()
    print("aiueo1")
except MyException:
    print("aiueo2")  # output: aiueo2
except RetryError:
    print("aiueo3")

```
PHP: file_existsはE_WARNINGを出すことがある

PHPの`file_exists`関数は、[マニュアル]によれば失敗したときに`E_WARNING`を発生する。

具体的には、[open_basedir]によってアクセスが許可されていない領域のファイルに対して、`file_exists`を実行した場合だ。次のコードで再現できる:

[マニュアル]: http://php.net/manual/ja/function.file-exists.php
[open_basedir]: http://php.net/manual/ja/ini.core.php#ini.open-basedir

```php
error_reporting(-1);

$file = '/tmp/hoge';

touch($file);

ini_set('open_basedir', '/var/www');

var_dump(file_exists($file)); //=> bool(false)
```

実行結果

> Warning: file_exists(): open_basedir restriction in effect. File(/tmp/hoge) is not within the allowed path(s): (/var/www) in
UnityのWindowsアプリでアプリケーションの再起動処理

## 経緯
需要はそんなに多くはないと思うけどメモ
イベント用アプリ等だとオペレータに操作を任せるので何かあったら再起動...の手順があると望ましい。
ただオペレータに再起動のやり方を教えても普段PCを利用していない人の場合だとヒューマンエラーの原因となりかねない( あと見られたくないフォルダがあるとか... )のでゲーム内のUIに再起動ボタンを作成してそれを押下してもらう方法などがよいと思います。

## スクリプト

```csharp
using UnityEngine;

namespace sample
{
    public class Sample : MonoBehaviour
    {

        void Start()
        {
        }
        
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Return))
            {
#if UNITY_STANDALONE_WIN
                System.Diagnostics.Process.Start(Application.dataPath.Replace("_Data", ".exe"));
                Application.Quit();
#endif
            }
        }
        
    }
}

```

## 解説
このサンプルスクリプトではEnterキーを押下した時にアプリケーションを再起動する。

Application.dataPathは ``` [アプリ名]_Data``` フォルダまでのパスであるが [アプリ名] の部分は実際の実行ファイルの名前と同一でないとアプリが起動しない( 実行ファイルの名前のみ変更や_Dataフォルダのアプリ名部分の変更を行うとエラーが出て起動しない )為、このパスから自身のアプリケーション名を取得することが可能、ほかにもAssembly.GetEntryAssembly().Location等があるがこちらはUnityではnullが返されたり動作が安定しないので安牌として Application.dataPath から実行ファイル名を取得する方法で実装するのが一番お手軽だろう。
Capistrano + carrierwaveを使用した際に出るエラー解消


# 解決したいこと
Carrierwaveでfogを用いているときに、
**「Capistranoで自動デプロイしたい」**という欲望をもったときに発生するであろうエラー。
サタンが舞い降りてきて心身ともにボコボコにされます。

```txt:発生エラー
rake aborted!
ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
```

# 解決フロー
### 前提
* carrierwaveでfog用に以下のrails起動時の初期化を行っている

```ruby:initializers/carrierwave.rb
if Rails.env.production?
  CarrierWave.configure do |config|
    config.fog_provider = 'fog/aws'
    config.fog_credentials = {
        provider: 'AWS',
        aws_access_key_id: ENV['fog_api_key'],        # AWSアクセスキー
        aws_secret_access_key: ENV['fog_api_secret'], # AWSシークレットキー
        region: ENV['fog_region'],                    # S3リージョン
        host: ENV['fog_host']                     # S3エンドポイント名(例: s3-us-west-2.amazonaws.com)
    }
  end
end
```

* capistrano起動に必要な設定ファイル（capfile等）がgitにプッシュされている
* capistranoの対象ブランチがmaster
* 以下コマンドで起動

```bash
$ bundle exec cap production deploy
```

### 解決方法
結論から書くと、解決は以下が一番早いです。
**環境変数を.bash_profileではなく.bashrcに記載する。**

```bash:.bashrc
export fog_api_key=*****
export fog_api_secret=*****
```

### 原因
**capistranoのコマンド起動時に環境変数が設定されていない。
もっと言うと、bash_profileを読み込まないため。**
capistrano公式サイトにシェルログイン形式によるファイル読み込みフローがあります。

※capistranoの設定ファイルのdefault_envに記載することでも解決しますが、gitにプッシュする必要があるためセキュリティ上よろしくないです。
publicリポジトリでの公開では特に。

```ruby:config/deploy.rb
set :default_env, {
  fog_api_key: "*****",
  fog_api_secret: "*****"
}
```

### 補足
以下Capfileにモジュールを追加した後に、capコマンドで、capistrano起動環境で動作サーバに入ることができます。

```ruby:Capfile
require 'capistrano/console'
```

```bash
$ bundle exec cap production console
```
その後、`env`コマンドをうつことで実際に設定されている環境情報を確認できます。
設定後、不安な方は出力してみてください。

同じ事象に遭遇した方の解決に寄与することを祈ります。

## 参考
* [【Rails】【Capistrano】Carrierwave (fog)を含んだ形でデプロイするとエラーになってしまう](https://fujiyasu.hatenablog.com/entry/2016/05/29/143742)
* capistrano公式サイト
    * [Which shell startup files do get loaded?（ページ末）](
https://capistranorb.com/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/)
    * [Console](https://capistranorb.com/documentation/advanced-features/console/)
Vue.jsで最新のアプリケーションを開発する

![スクリーンショット 2019-03-15 12.24.54.png](https://qiita-image-store.s3.amazonaws.com/0/189613/03bef463-1928-3ac3-98be-24848e0ac244.png)


本書では、Django、Django REST フレームワーク、Vue.js を使用して、REST API バックエンドと Vue.js フロントエンドでアプリケーションを開発します。API は Axios（HTTP クライアントライブラリ）の助けで Vue.js フロントエンドで消費され、JWT 認証は Auth0 で処理されます。

プロジェクトの要件すべてをインストールしてから、Django と Vue.js をサブプロジェクトとしてブートストラップします。

これから作成するデモプロジェクトの最終ソースコードをこの [GitHub レポジトリ](https://github.com/auth0-blog/django-vue.js) で見つけることができます。

本書は次のセクションに分かれています。

・　Python および Django 入門
・　Vue.js および Vue.js 機能の入門
・　バックエンド プロジェクトをブートストラップする
・　フロントエンド プロジェクトをブートストラップする
・　JSON Web トークン入門
・　Django を Auth0 と統合する
・　Auth0 を Vue.js と統合する
・　結論および次のステップ

#Python および Django 入門
Python は汎用プログラミング言語で、現在最も人気の高いプログラミング言語です。読み取り可能で効率的、簡単に学べる言語です。Python は Linux、Windows、Mac などの主要オペレーティングシステムで利用可能な高移植性言語でもあります。

Python には、Web 開発者の生産性を高め、プロトタイプを瞬時に構築できる開発者にとって素晴らしい多数のツールやフレームワークがあります。Web 開発者にとって最も人気の高い Python ランドスケープは Django です。Django は開発者が瞬時にプロトコルを構築できるため、厳しい締切がある完璧主義者のフレームワーク として告知されています。

Django は Python のパワーを使って SQL の１行.を書かなくてもデータベース要件のモデルを作ることができるクラスベースのビュー、強力な ORM のような素晴らしい機能を開発者に提供します。Django ORM はデータベースで作業するときのあらゆる複雑さを取り除き、最も重要なことはクライアントが使用するデータベースシステムを決定していないときでも対応できることです。SQLite データベース（特別なインストールは必要ありません）を使って開発を始めることができ、クライアントが後で、使用する適切な RDBMS（リレーショナル データベース管理システム）を決定したときに適切なデータベースシステムに変えることができます。

Django も、後でデータベース構造を変更するときにデータを失わずにデータベースを安全に移行できる強力な移行システムが同梱されています。

Django を使用するもうひとつの強みは大きな進化するコミュニティがあることです。このコミュニティは Web 開発者たちのよくある問題を対象にしたオープンソースパッケージを作成したので、プロジェクトを構築するときに車輪を再発明する必要がありません。

Django には、コミュニティが作成したチュートリアルのセットで補足されたフレームワークのすべての機能を説明した優れた総括的なドキュメンテーションがあります。

Django は初心者にも適しており、Web アプリケーションを構築するのにフレームワークの各機能に熟練する必要はありません。
(つづく)

##この続きは、以下のAuth0ブログで解説しております。
[Vue.jsで最新のアプリケーションを構築する](https://auth0.com/blog/jp-building-modern-applications-with-django-and-vuejs/)



# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。


##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したVue.js以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
さくっとGatsbyでポートフォリオサイトを作った話

# はじめに
以前、個人で[Sharevel](https://appadvice.com/app/sharevel/1448076297)というiOSアプリをリリースしたのですが、
当初はサポートサイトでポートフォーリオサイトもなくFacebookのプロフィールページで代用していました。
アプリリリースもでき、せっかくなのでアプリのポートフォーリオを作りました。

どうやって作ろうか考えたときにReact.jsでサイトを作れるGatsbyに
前々から興味もあり実際に使ってみました。

どんなサイトかは作った[GithubPage: winkry-site](https://dyson-yamashita.github.io/winkry-site/)で確認できます。

# デプロイまでの流れ
１. Gatsbyを[クイックスタート](https://www.gatsbyjs.org/docs/quick-start)に従ってインストール

```
npm install -g gatsby-cli
```


２. プロジェクトの作成
今回はwinkry-siteというプロジェクトを作成しました。
テーマは[gatsby-starter-dimension](https://www.gatsbyjs.org/starters/codebushi/gatsby-starter-dimension/)を使用させていただきました。

```
gatsby new winkry-site https://github.com/codebushi/gatsby-starter-dimension
cd winkry-site
gatsby develop
```
で表示確認

３. コンテンツとテンプレートを修正
表示内容の修正は、
src/componentsのHeader.jsとMain.jsを変更

スマホで横幅が合わず表示されなかったので、スタイルを少し修正しました。
src/assets/scss/layout/_main.scss

```
position: relative;
width: 40rem;　←削除
max-width: 100%;
```

４. デプロイの設定
ホスティングはGithub Pagesを利用しました。
収益もないので無料で利用できるのはありがたいです。

デプロの設定は本家に[ドキュメント](https://www.gatsbyjs.org/docs/deploying-to-gitlab-pages/)を参考に設定します。

GithubPagesのドメインをそのまま使用する場合、
gatsby-config.jsにpathPrefixを追加しないと
jsファイルか取得できないので注意が必要です。

```
pathPrefix: "/winkry-site"
```

５. デプロイ

```
npm run-script deploy
```

# 感想
カスタマイズをしなければ、かなり短時間でいい感じのReact.jsのページが作成できます。
用途にあったテンプレートを利用できれば活躍の場面がありそうです。
カスタマイズするならReact.jsのスキルがかなり必要ですが、
ゼロから作るよりはずっと早いのではと思います。

# 参考URL
[GatsbyJS + TypeScriptでポートフォリオをつくった](
https://medium.com/@neetshin/gatsbyjs%E3%81%A6%E3%82%99%E3%83%9B%E3%82%9A%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AA%E3%82%AA%E3%82%92%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%9F-54953daf5387)
[GatsbyJSでgithub user pagesにデプロイするまでの手順](http://makotottn.hatenablog.com/entry/2018/01/04/201752)
Android開発: 使用すべき15のライブラリ

このブログは、Auth0 Inc.が投稿したブログの紹介ページとなります。
日々の Android 開発に役立つ 15 のライブラリを簡単に見ていきます。これらを使って、より良いパフォーマンスとより良いユーザー エクスペリエンスを提供するアプリケーションを作成することができます。



#Android開発: 使用すべき15のライブラリ
![スクリーンショット 2019-03-15 12.05.01.png](https://qiita-image-store.s3.amazonaws.com/0/189613/50cd2f18-c334-8b34-948a-6835b2626d13.png)

本ブログの本編は以下のURLからアクセスすることができます。

[Adoroid開発: 使用すべき15のライブラリ](https://auth0.com/blog/jp-android-development-15-libraries-you-should-be-using/) 

# Auth0 統合認証プラットフォーム
Auth0はWebアプリやモバイル、APIなどに対して認証・認可のサービスをクラウドで提供している、いわゆるIDaaS (Identity as a Service)ベンダーです。企業がもつWebアプリケーションやAPI, Native Mobile Appなどでユーザー認証や認可、セキュリティを組み込みたいけれでも実装が難しい・・・という方にオススメのソリューションを提供しています。

##Githubに様々なプラットフォーム用のサンプルソースを公開
Auth0は今回のチュートリアルで使用したサンプルプログラムをはじめ、様々なプラットフォーム・フレームワーク用のサンプルプログラムをGithubに公開しています。今回紹介したAndroid用のSDK以外にも多数のフレームワーク用のソースを公開していますので、お試ししてはいかがでしょうか。
[Githubリポジトリ - Auth0] (https://github.com/auth0)


##実際にAuth0を利用するには
Auth0のサービスは契約をしなくとも無償で評価(フリートライアル：2２日間)をすることができます。フリートライアルは、[Auth0のホームページ](https://auth0.com/jp "http://auth0.com/jp")にアクセスし、画面右上の<A HREF="https://auth0.com/signup?utm_campaign=qiita_auth0_aspnet_core&utm_source=qiita"><img width="123" alt="スクリーンショット 2017-09-07 21.59.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/189613/c0ffbce4-d802-6fdd-ea2a-aa4a7ccd775b.png"></a>をクリックするとトライアル登録が行うことができます。ユーザー登録にはGitgubやGoogle, Microsoftアカウントを使用してサインアップすることできますので、試してみてはいかがでしょうか？
Flutter StrutStyleで日本語と英語のTextの高さを揃える

Flutterで、日本語を含むTextと、アルファベットのみのTextで高さが異なることがあります。一つのTextに日本語とアルファベットが混在している場合は問題ないのですが、別のWidgetになっていて、並んでいる場合などは差が目立ってしまい違和感があります。

```dart
Row(
  children: <Widget>[
    Container(
      color: Colors.green,
      child: const Text(
        "ABC",
        style: TextStyle(fontSize: 16.0),
      ),
    ),
    Container(
      color: Colors.red,
      child: const Text(
        "あいう",
        style: TextStyle(fontSize: 16.0),
      ),
    ),
  ],
)
```

上記のコードだと、以下のように "ABC" と "あいう" の高さが違います。

<img width="156" alt="スクリーンショット 2019-03-15 12.04.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/21341/5dbb4305-716f-f49b-0870-b560027c5c28.png">

※同じ fontSize を指定しているのに……。

## StrutStyle

いまのリリースバージョンである Flutter v1.2.1 では StrutStyle というオプションがあり、これで高さをコントロールできます。StrutStyleはTextの行の最低限の高さを設定できるためです。

次のように設定してみました。

```dart
Row(
  children: <Widget>[
    Container(
      color: Colors.green,
      child: const Text(
        "ABC",
        style: TextStyle(fontSize: 16.0),
        strutStyle: StrutStyle(
          fontSize: 16.0,
          height: 1.3,
        ),
      ),
    ),
    Container(
      color: Colors.red,
      child: const Text(
        "あいう",
        style: TextStyle(fontSize: 16.0),
        strutStyle: StrutStyle(
          fontSize: 16.0,
          height: 1.3,
        ),
      ),
    ),
  ],
)
```

<img width="159" alt="スクリーンショット 2019-03-15 12.10.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/21341/30613b08-5e4d-46f9-0d9d-0130173618aa.png">

手元の環境だと、height 1.3 以上にすると、高さが揃いました。つまり、この環境では日本語の文字の高さは、アルファベットの約1.3倍の高さということですね。

----

StrutStyle は TextStyle とは独立しているので、TextStyleでは小さい文字 `fontSize: 12.0` にしつつ、行のレイアウトの計算では大きい文字として扱う（StrutStyleで `fontSize: 16.0` にするなど）ということができます。

テキスト関連の調整がやりやすくなりましたね！
OpenAPI Explorerの活用について


## はじめに

ローカル環境からCLIでAlibaba Cloudのリソースを操作したいですので、ローカル環境にAccessKeyをおいて、日々気をつけながらAccessKeyを利用しています。

19年1月に [OpenAPI Explorer](https://jp.alibabacloud.com/products/openapiexplorer)というプロダクトが利用可能になり、これをちゃんと活用すれば、ローカル環境にAccesskeyを置かなくても、簡単にALibaba Cloudのリソースを操作できます。

OpenAPI Explorerはブラウザベースで (Online Linux Shellで)[aliyun-cli](https://github.com/aliyun/aliyun-cli) を実行したり、(Online Debugで)APIをデバッグしたりできるサービスになります。

今日はOpenAPI Explorerの活用について、自分の考えを共有させていただきます。

## OpenAPI Explorerについて

OpenAPI Explorerは 「プロダクトとサービス」の欄に表示されておらず、Alibaba Cloudにログインしてから、直接 [OpenAPI ExplorerのURL](https://api.alibabacloud.com/) にアクセスすれば、下記のようなOpenAPI Explorerの管理画面にたどり着けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/117156/e613cb40-30bc-85d7-00b2-11b0de2161eb.png)

### Online Debug
Alibaba Cloudのプロダクトを選択すれば、選択されたプロダクトのAPIとそのAPIのパラメーターが表示されます。パラメーター欄に入力して、「Submit Request」ボタンをクリックすれば、APIを実行されます。
また、SDK(Java、Node.js、Go、PHP、Python)のサンプルもあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/117156/8ec15143-a330-2cc8-e08d-22a120486848.png)


### Online Linux Shell

裏では(Cloud Shellの)仮想Linuxサーバーが一台立ち上げられます。
aliyun-cliを実行するため、一時的なクレデンシャル情報が必要です。
また、ファイルとか永続的に保存したい場合はNASを利用することも可能です。

このCloud Shell環境にはpython、kubectl、terraform、aliyun-cli、vimとか入っていて、実用は非常に便利です。
Cloud Shellの詳細については、森([@mosuke5](https://twitter.com/mosuke5))が書いた記事 [【Alibaba CloudのCloud Shellでは何ができるか】](https://techblog.sbcloud.co.jp/2019/01/08/cloudshell/)にてご確認ください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/117156/e84c72dd-a41f-1886-8adc-04fdcf4c8897.png)

## OpenAPI Explorerの活用について

OpenAPI ExplorerではRAM Userの一時的な認証情報を利用しているため、権限も利用されるRAM Userの権限と同じです。

Alibaba CloudへログインするIPを制限して、AssumeRoleを利用すれば、下記の図のようなセキュアなクロスアカウントアクセスできる仕組みができます。しかもAccessKeyの発行も必要がありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117156/4c0b02b7-ab63-148d-1e2e-2f2a2bf5abf5.png)

実運用する際に、たとえば、権限管理、データ連携、操作履歴の記録などのセキュリティ管理といったことも考える必要があります。上記の仕組みに関しては、現状あくまでもOpenAPI Explorer活用の案になります。

IP制限、AssuemRole、aliyun-cliの詳細については、下記の記事にてご確認ください。
①　[RAMユーザーのIPアクセス制限について](https://qiita.com/jobbin/items/921ef738572edd6acb2f)
②　[ユーザーロールでの一時的な認証アクセスについて](https://techblog.sbcloud.co.jp/2018/10/10/temporary-authorization-with-assume-role/)
③　[aliyun-cliの各認証メソッドについて](https://qiita.com/jobbin/items/44ea8019839f499006ec)

## OpenAPI Explorerのいいところと改善してほしいところ

## いいところ

①　OpenAPI Explorerはただで使える、NASを利用する場合はNASの料金が発生します。

②　AccessKeを発行しても、ブラウザベースでAPIを試せる

## 改善してほしいところ

①　Cloud Shellの仮想サーバーは現状中国のリージョンに立ち上げられるので、ちゃんとリージョン指定できるようにしたい

②　SDKのサンプルでは、下記のようにAccessKeyのハードコーディングの実装になりますので、**ダサい**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/117156/76716963-ea70-9a07-07df-8444934ea819.png)

## 最後

OpenAPI Explorerはまだプレビュー版のプロダクトで、いろいろ改善すべきところがありますが、わりっと便利なサービスですので、皆さんも是非イジってみてください。そしてAlibaba Cloudにフィードバックすれば、もっと使いやすくなるはずです。
vue.js 要素が見えたら実行 vue-observe-visibility

動かねぇ。
スマホだと、要素が見えても動かねぇ。

# インスコ
https://github.com/Akryum/vue-observe-visibility#example


#これがないとスマホだと動かない
https://github.com/w3c/IntersectionObserver/tree/master/polyfill#intersectionobserver-polyfill

```app.js

window.Vue = require('vue');
require('intersection-observer');//これが大切。。。

import Vue from 'vue'
import VueObserveVisibility from 'vue-observe-visibility'
Vue.use(VueObserveVisibility)

```


早速テストコードね。


```Mugen.vue

<template>


    <div>

        <p>
            高さ違ってくるので、スマホでやってね。
        </p>

        <div v-observe-visibility="visibilityChanged">見えているので、下のは true になる</div>

        <div>
            {{isVisible}}
        </div>

        <div style="height: 1000px;">
            v-observe-visibility が 見えていないので、 下のは false になる
        </div>

        <div>
            {{isVisible}}
        </div>

    </div>

</template>

<script>

    export default {


        data () {
            return {
                isVisible: false,
            }
        },
        methods: {
            visibilityChanged (isVisible, entry) {
                this.isVisible = isVisible;
                console.log(entry);
            },
        },
    };
</script>

```

elementui 使ってるのでバグってんのかなーとか
いろいろ考えたけど。
めっちゃハマった。
設計やコードを書く際に役立つ設計まとめ

## 設計やコードを書く際に役立つ設計の軽いまとめです
### コード辺
SOLID
[YAGNI](https://ja.wikipedia.org/wiki/YAGNI)
[DRY](https://ja.wikipedia.org/wiki/Don%27t_repeat_yourself)

### パッケージ粒度辺
https://qiita.com/NagaokaKenichi/items/65c149ba92580fce5be2
ADP
SDP
SAP

この辺までは[Clean Architecture 達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/Clean-Architecture-%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E8%A8%AD%E8%A8%88-Robert-C-Martin/dp/4048930656)が参考になる

### 戦術レベルに限界を感じて戦略レベルからモデリングしていきたくなったら
[DDD](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9/dp/4798121967/ref=sr_1_1?ie=UTF8&qid=1552618839&sr=8-1&keywords=ddd)
ロバストネス分析
ICONIX
とか色々

[ユースケース駆動開発実践ガイド](https://www.amazon.co.jp/%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-OOP-Foundations-%E3%83%80%E3%82%B0%E3%83%BB%E3%83%AD%E3%83%BC%E3%82%BC%E3%83%B3%E3%83%90%E3%83%BC%E3%82%B0/dp/4798114456/ref=sr_1_1?ie=UTF8&qid=1552618778&sr=8-1&keywords=%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E5%AE%9F%E8%B7%B5)が参考になる
タグの付いていないDockerイメージ を削除する - docker image TAG <none>

Docker を使っていると DockerイメージがMacの容量を圧迫するので、削除コマンドをメモ。

## コンテナが使っていないイメージをすべて削除する

`$ docker images`とコマンド叩いて存在するDockerイメージの一覧を出すことができるので確認。
`$ docker rmi $(docker images -q)`を実行して削除。

## タグの付いていないDockerイメージを削除する
タグのついていないDockerイメージの一覧表示

```terminal
$ docker images --filter "dangling=true"
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              fd68d72b1116        2 weeks ago         1.5GB
<none>              <none>              20d99ba920ac        3 weeks ago         1.49GB
<none>              <none>              0e3710ea2df9        4 weeks ago         1.49GB
```

削除実行

```terminal
$ docker rmi $(docker images -f "dangling=true" -q)
Deleted: sha256:fd68d72b11164cd8c4d9850f722458ee0ee88f7b84e3e818f36fdb232a2e5000
Deleted: sha256:6387313607add33197e7fe7e570bb0481e752ad46b68a36c24cce638d91ade00
Deleted: sha256:20d99ba920acc7c5321c4cb8c251fc39115338e7c4659c02e366c297a73abebc
Deleted: sha256:5fa9b01bf1ea0dbe4cd43f09f7781a43db0d3c5f0376b21561292c005b839a24
Deleted: sha256:c8f469aee63ba89ca95a397769db5924afce60088f80e37f1d139f26d514118b
Deleted: sha256:5ec98679890f97f09150d2f79be3f0ff90760838932c7f2a26746967c965ca4b
Deleted: sha256:fb5f366a2d87a13555089bfad0d8073db70a5ea91047f32736bd8acfa0e3bd39
Deleted: sha256:13ed1d1b8e9880dd85c6ce3d627877e9ee5218211cfe08a634a1f0cab6c2795a
```

これで完了。


＜追記＞
## Docker volumeの削除

```terminal
$ docker volume rm -f $(docker volume ls -q)
```

定期的な削除をお勧めします。
（※いつの間にかDocker for Mac にLocalのストレージを40GBも圧迫されていました。笑）
SQL Server 2017 Express エディションのインストール

# SQL Server 2017 Express エディションのインストール

無償版をインストールします。

『 無料のデータベースで、最大 10 GB サイズの小規模なデータドリブンのWebアプリケーションと
モバイル アプリケーションを構築します。』

## ダウンロード

https://www.microsoft.com/ja-jp/sql-server/sql-server-editions-express

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/09716052-114f-1aa3-316a-964edbca2f94.png)


## インストール

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/73498bbb-d26c-4c6a-1428-d914102b9d56.png)

[基本]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/fd0d953f-a6a8-b939-2240-66346608f4fd.png)

[利用規約同意]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/f4f23049-4bce-ffdd-75d0-f6cc5049ef34.png)

[インストールの場所を設定]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/65d7491b-a285-5084-d1bf-4831fd53a4ef.png)

[インストール完了]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/4c2d418c-0c3a-e649-6d1d-d7640564a21b.png)

## 設定

### インストール完了画面で、[カスタマイズ]ボタン押下。UPDATEしておきましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/6999c8f2-eacb-48e2-bf29-71990e688cce.png)

### UPDATEが終わったら、SSMS-Setup-JPN.exeを起動します。
SQL Server Management Studio (SSMS)

[インストール]押下
![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/228b75e1-2506-96bb-6b59-7d4c2321bf93.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/22b8a80a-ed82-35fe-073a-6456910e6b22.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/eac9ef6c-913a-b0a5-ca2e-63fd7d4b9267.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/6e0d8030-1898-bf4b-ccba-fb99b4ca9ab0.png)

## SQL Server Management Studio (SSMS)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/303278/0d5d0a98-fb79-e4c5-688c-293c6d9af8c0.png)

詳しい設定方法は別で。
concrete5 8.4.5から8.5.0へのアップデートにコケた

/update ディレクトリにソースをアップロードして、管理画面からいつも通りにアップデートしようとしたらコケた。
commmunity-storeのエラーが表示されたので、commmunity-store入れてたのが悪かったのかもしれません。
## コマンドでアップデートして解決
https://documentation.concrete5.org/developers/installation/upgrading-concrete5
ここに記載されているコマンドでのアップデートをしたら正常にアップデートできて難を逃れました。

```bash:update
./concrete/bin/concrete5 c5:config -g set concrete.maintenance_mode true
./concrete/bin/concrete5 c5:update
./concrete/bin/concrete5 c5:config -g set concrete.maintenance_mode false
````

### [concrete5でのWebサイト制作はこちら](https://www.xross-cube.com/service/concrete5)
なんでみんなRunJS使わないのかわからない

※タイトルは煽りです。

## TL;DR
- RunJSは手元で手軽にJSの挙動を試せるアプリ
- めちゃくちゃ便利と思うのに紹介記事もあんまない
- 使ったら捗るからどうぞ

## RunJS
Qiitaでも紹介記事見かけないし、Googleで検索かけても（少なくとも日本語の記事は）見当たらなかったので書く。
使ったら捗るのになー、というお気持ちです。

### RunJS is 何？
簡単に言うと、JavaScriptのサンドボックス（PlayGround？）。
自分の場合、これまでさくっとコード試したいときは、Chromeのdevtoolでコンソールに書くとかnodeのREPL使うかだったんですが、devtoolはブラウザ開いて、devtool開いて、しかもあまり書きやすいとは言えず・・・、だし、nodeのREPLは単行とかならいいけど、複数行に渡ると辛さしかないですし・・・。

そこでお兄さん。 **RunJSですよ。**

というわけで、やっていきます。

### 導入
と言っても、[公式サイト](https://runjs.dev/)からダウンロードして、RunJS-current.app.version.dmgをクリックするだけです。ややこしいことはない。
[![runjs-official.png](https://qiita-image-store.s3.amazonaws.com/0/306575/1567fff8-3a4a-8bcd-dac3-37c85e3cd808.png)](https://runjs.dev/)

### 対応プラットフォーム
https://github.com/lukehaas/RunJS/releases/tag/v1.4.0  
見た感じ、Mac、Win、Linux用に配布されている模様。（記事中の動作はすべてMacで確認したものになります。あしからず）

## 気に入っているところ
### テーマが豊富
カラーテーマがデフォルトでたくさんあって、好きなもの選べます。VSCodeとか、Atomとかそこら辺で使われてる主要なものは大体あるんちゃうかな、という印象。全然満足です。
メニューバーの `Themes` からいつでも変更可。
![runjs-theme.png](https://qiita-image-store.s3.amazonaws.com/0/306575/acc8a9d4-8e7e-afd6-d305-cde7b8f08f32.png)

### Vimキーバインド
個人的にはこれがあったため、常用にいたったと言っても過言ではないです。設定にチェック入れるだけで、普通にVimできます。
![runjs-vim-mode.png](https://qiita-image-store.s3.amazonaws.com/0/306575/5f3b756c-dbbc-85ba-e863-79bfd922a75a.png)

### シンプルな見た目＆機能
本当にシンプルです。左にコード書いたら、右に実行結果が即時反映される感じ。素敵すぎる。
![runjs-code.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/306575/2d5a8792-21b9-1b80-304e-04fc633b997b.gif)

### TypeScriptにも対応しているんだぜ・・・
TypeScriptも書けてしまいます！しかも、依存ライブラリなどの導入無しで！！ （サンプルコードは[TypeScriptの公式リファレンス](https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html)を参考に書きました。 :bow:）
![runjs-ts.png](https://qiita-image-store.s3.amazonaws.com/0/306575/20722ea1-9ff8-6115-591f-8f9ef99b4551.png)


## これあったらもっといいな
Vimモード時のヤンクでクリップボードコピーが効かないため、だーっと選択してCmd+Cしなくちゃいけないんですよね。手癖で、ビジュアルモードで選択→ヤンクして→他のエディタとかにペーストってしようとすると全然違うものが入ってて、「おや・・・？」ってなります。

大した問題ではないですが。

**2019.03.26追記**
[vimrc file? #39](https://github.com/lukehaas/RunJS/issues/39)
vimの設定ファイル使えるようにならんかね、みたいなissueが立てられていたので、将来的にやれるようになりそうですね。

## もっと使っていきましょうぞ
まあ、という感じでほとんど不満はございません。あ、当たり前だけど、ブラウザのAPIは使えないので、その場合はdevtoolで書くしかないかな。

良いアプリケーションなので、ぜひー。
コレクションのなかでGlobalDictionaryはイベントハンドラが使える??

##コレクションのなかでGlobalDictionary（だけ）はイベントハンドラが使える、というがどの程度使えるの？

###collectionsには
elsystem.collections
Dictionaryクラス
Global Dictionaryクラス
Queueクラス
Stackクラス
Vectorクラス
があるのだけれど、Global Dictionaryクラスはイベントハンドラあり。

それが
ItemProcessdEventArgsクラス

###うん、ちゃんと発火するね：当然

###使い方はこんな感じ。

```

using elsystem;	//datetime
using elsystem.collections;	//Dictionary , Vector

var:GlobalDictionary symbolDictionary(null);

method void AT_initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) 
begin

	makeSymbolDictionary();
	
end;

method void makeSymbolDictionary()

begin
	symbolDictionary = GlobalDictionary.Create(true , "myDictionary");
	
	symbolDictionary.ItemAdded +=  self.symbolDictionary_updated;
	symbolDictionary.ItemChanged += self.symbolDictionary_updated;
	symbolDictionary.ItemDeleted += self.symbolDictionary_updated;
	symbolDictionary.Cleared += self.symbolDictionary_updated;
	
end;

//ここがハンドラ
{
ItemProcessedEventArgs
Global Dictionary のアップデートの発生時に情報をレポートするために使用してみる
}
method void symbolDictionary_updated(elsystem.Object sender , elsystem.collections.ItemProcessedEventArgs args)
begin
	print(datetime.now.tostring(), "symbolDictionary_updated");


	print(args.Action.ToString()); //added , changed , cleared , deleted , unknown の4タイプあし
	print("symbolDictionary.Count = ",symbolDictionary.Count);
	
	//delete , clear , unknownのときは終わり
	if(args.Action.ToString() ="cleared" or args.Action.ToString() ="deleted" or args.Action.ToString()="unknown") then return;
	
	print(args.key.ToString());
	print(args.Value.ToString());
	
end;


//発火試験

//add
symbolDictionary.Add("8798","アド栗");
symbolDictionary.add("7203","トヨタ");
//発火OK

//changed
if symbolDictionary.Contains("8798") then begin 
	symbolDictionary.items["8798"] = "hogehoge!";
end;

//remove
symbolDictionary.Remove("7203");

//add
symbolDictionary.Add("7049","識学");

//clear
symbolDictionary.Clear();

//add
symbolDictionary.add("7048","ベルトラ");


```

実行結果は

```
2019/03/15 19:18:54symbolDictionary_updated
added
symbolDictionary.Count =    2.00
8798
アド栗
2019/03/15 19:18:54symbolDictionary_updated
added
symbolDictionary.Count =    3.00
7203
トヨタ
2019/03/15 19:18:54symbolDictionary_updated
changed
symbolDictionary.Count =    3.00
8798
hogehoge!
2019/03/15 19:18:54symbolDictionary_updated
deleted
symbolDictionary.Count =    2.00
2019/03/15 19:18:54symbolDictionary_updated
added
symbolDictionary.Count =    3.00
7049
識学
2019/03/15 19:18:54symbolDictionary_updated
cleared
symbolDictionary.Count =    0.00
2019/03/15 19:18:54symbolDictionary_updated
added
symbolDictionary.Count =    1.00
7048
ベルトラ

```
Android Q まとめ

2019/3/15時点でのAndroid Qのまとめ

主に下記参考
[Android Developer Blog](https://android-developers.googleblog.com/2019/03/introducing-android-q-beta.html)

## ベータ版インストール

Pixelシリーズであればベータ版をインストールすることができます
インストール方法は簡単で、下記サイトにインストール可能な端末が表示されているので、
登録ボタンを押して同意するとインストール可能な状態になります。
登録後は端末の設定->システム->詳細設定からインストールできます。
ちなみに70.9MBのあとに、1304.3MBのダウンロードでした。

[公式](https://www.google.com/android/beta#devices)

## Giving users more control over location
## More privacy protections in Android Q
## New ways to engage users
### Foldables and innovative new screens

最近話題の折り畳みスマホ（フォーダブル、Foldables）にも対応します（Foldablesについては[こちら](https://qiita.com/qjuliar/items/0068c147ad2d7919beda)）
> including changes to onResume and onPause to support multi-resume and notify your app when it has focus.

onResumeやonPauseなどに変更があるみたいです。
恐らく、端末を広げたらonResumeが走ったり、折りたたんだらonPauseが走る仕様なのでしょう。

### Sharing shortcuts

調査中

### Settings Panels

> A settings panel is a floating UI that you invoke from your app to show system settings

共有アイコンを押すと下からフローティング画面が表示されるように、設定画面も表示させることが出来るようになるみたいです。
今までは権限取得等で設定画面に飛ばしていたものをアプリ内に留めることが可能になります。

## Connectivity

### Connectivity permissions, privacy, and security

- 異なるWi-Fi Networkに接続する際、ランダムなMAC ADDRを付与
- WPA3に標準対応
- Wi-Fi CERTIFIED Enhanced Openに標準対応

### Improved peer-to-peer and internet connectivity

IoTデバイスへの接続が容易になるとのこと

### Wi-Fi performance mode

adaptive Wi-Fiというものによって高パフォーマンスや低遅延モードにすることが可能になる。
これによってリアルタイムのゲームなどに恩恵がある。
使うには
WifiManager.WifiLock.createWifiLock()
WIFI_MODE_FULL_LOW_LATENCY or WIFI_MODE_FULL_HIGH_PERF
が必要で、ファームウェアが対応している必要がある

## Camera, media, graphics

### Dynamic depth format for photos

### New audio and video codecs

### Native MIDI API

### ANGLE on Vulkan

### Vulkan everywhere

### Neural Networks API 1.2

## Strengthening Android's Foundations

### ART performance

### Security for apps

### Compatibility through public APIs

### Modern Android

### Get started with Android Q Beta

### Explore the new features and APIs

### How do I get Android Q Beta?
Zshでrmを実行するときの確認が，うるさいときもある

# はじめに
zshでrmを実行すると，"remove hoge.txt? "などと尋ねてくる．取り返しのつかないことにならないための機能であることは理解しているが，いらないときはうるさいだけである．

# 解決方法
以下のページでは，rmを呼び出したときに確認を求めないようにしている．しかし，常に確認しないのでは危険な場合もあると思うため，この方法は避けたい．

[Preztoのおせっかい機能を除去する - Qiita](https://qiita.com/VienosNotes/items/d5447145ff17a69c9f07#いちいち-rm-が削除確認をしてくる)

そこで，zshのrm確認エイリアスは，コマンド名が"rm"であるときにしか発動しないことを利用して，以下のエイリアスを作った．

```sh:.zshrc
alias rm-unsafe='/bin/rm'
```

# 解決
どう考えてもいらないファイルを消すときは，以下のようにすれば快適になる．

```shell:zsh
 $ rm-unsafe hoge.txt
```

追記：コメント欄で教えていただきましたが，以下のようにすることでzshのエイリアスを無視できる．

```shell:zsh
 $ \rm hoge.txt
```

しかし，unsafeであることを自分に意識させるために，あえて上の方法で使うことにした．
Gitのブランチの根をコマンドで探す

# コレは何？
Gitでブランチを始めた根を探したい時にどうするかについて方法をリファレンスにしたサイトから抜き出したメモ。


# どうやる？
## ストーリー
**[ブランチ元]**を**[ブランチ先]**に分岐したと仮定します。

[ブランチ先]が[ブランチ元]のどこから派生したかを知るには。

```shell
$ git show-branch --sha1-name [ブランチ元] [ブランチ先] | tail -1;
-- [x111xx] Merge pull request #21 from abcd/xxxx/yyyy
```

更にどのファイルが更新されたかを出力する。

```shell
$ git diff --stat HEAD x111xx;
```


# リファレンス

- [gitでbranchの派生元確認 - itochin2の日記（仮）](http://itochin2.hatenablog.com/entry/2013/11/12/211130)
- [git rebaseを初めて使った際のまとめ - Qiita](https://qiita.com/panti310/items/e0ec74b47c6c219f2a8b)
Raspberry Piで、autostartが使えなくなったので、Systemdを使ってchromium-browserを自動起動した。

# 概要
Raspberry Piを使って、ブラウザが立ち上がるキオスク端末を制作してます。
トライ・アンド・エラーを繰り返しながら実験機が完成したので、改めてOSをインストールした直後からの綺麗なSDカードを制作しようと思ったのですが、`autostart`ファイルが無くなっていて、実験機と同じ構成にするのは無理って事になりました。
正確には、古いバージョンのRaspbianを使えば、出来ないことはありませんが、最新のOSに追従できないのは痛すぎるので、別な方法を模索することにしました。
使用したのは、2018-11-13-raspbian-stretch.imgです。

## 問題点
Raspberry Piは、少し前からデスクトップ環境をLXDEからPIXELへ変更しています。(PIXELはLXDEをベースに開発)
`~/.config/lxsession/LXDE-pi/autostart`ファイルは、パスから察するに、LXDEの機能だけど互換性確保のために、残されていたんでしょう。
2018-11-13-raspbian-stretchからディレクトリごと無くなっています。
PIXELに代替となるような仕組みがあっても良さそうですが、見つけることはできませんでした。

## 代替手段
幸いなことに、Raspberry Piには、もともと複数の自動起動の手段が用意されています。
### (1)/etc/rc.local
簡単にプログラムを起動したい用途に良さそうです。

```:raspbian
$ nano /etc/rc.local
```
### (2)autostart
これが、今回ダメになった奴です。
### (3)crontab @reboot
ユーザー権限でプログラムが実行されます。
root権限で実行したら困るようなプログラムに使うようです。

```:raspbian
$ crontab -e
```
### (4)/etc/init.d
こちらもJessieからsystemdが推奨されることになっているので使わない方が良さそうです。
### (5)systemd
設定する事が多いため少し複雑ですが、細かな設定ができるので、これを使うのが良さそうです。

## systemdで設定する
### サービスを作成する
```:raspbian
$ sudo nano /etc/systemd/system/open-browser.service
```
```:open-browser.service
[Unit]
Description=launch chromium-browser

[Service]
User=pi
Environment=DISPLAY=:0
ExecStart=chromium-browser --kiosk http://www.youtube.com

[Install]
WantedBy=user@.service
```
### サービスを再読み込み
```:raspbian
$ sudo systemctl daemon-reload
```
### サービスの自動起動を有効化
```:raspbian
$ sudo systemctl enable open-browser.service
```
### サービスを開始(確認)
```:raspbian
$ sudo systemctl start open-browser.service
```
## 終わりに
autostartが使えなくなってからまだ時間が経っていないからか、ネット情報が少なくて難儀しました。
lite(CUI版)にmatchbox-window-managerとchromium-browserをインストールする構成も試してみたのですが、起動時間が通常版よりも長いという予想に反した結果だったので、通常版を使用しています。
URL短縮Webサービスを作ってみた。

こんにちは。
[GoogleのURL短縮サービスが2019/3/30で終了します。](https://developers.googleblog.com/2018/03/transitioning-google-url-shortener.html)

これ代替のサービス作れるんじゃないかと思って、お勉強用として作ってみました。
~~「Firebase Dynamic Links使え」って書いてあるのは一旦無視します。~~

# 作ったもの

[shtnr](https://shtnr.now.sh/)
ショートナーと読みます。読みましょう。
独自ドメインじゃないので、短縮URLサービスと言いながらドメイン名が長いですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/365084/cf1e14e4-7dcd-bb20-bb3e-936c9b7e1c04.png)

短縮したいURLを入れて、変換ボタンをポチると、
短縮されたURLが表示されます。

そのタイミングで、クリップボードに短縮したURLがコピーされます。
（Chromeのみ動作確認）

短縮したURLをブラウザのアドレスバーに貼り付けると、元のURLへリダイレクトします。
そんだけです。簡単ですね。

# つかったもの

- Node.js
- TypeScript
- express
- NOW
- Bulma
- Firebase Realtime Database（ホントはCloud Store使いたかったけど、NOW上で動かなかった）

# Web APIとしてつかう

こんな感じでPOST（Windows版のcurl使用）すると、

```sh
curl -X POST -H "Content-Type: application/json" -d '{\"target_url\":\"https://example.com/\"}" https://shtnr.now.sh/api/urls
```

こんな感じで返ってきます。

```sh
{"shorten_url":"https://shtnr.now.sh/2n2znc"}
```

# 最後に
お勉強用として作ったので、適当なタイミングでサービス消す可能性もあります。
Googleさんも言ってる通り、Firebase Dynamic Linksを使いましょう。
はじめての方のkotlin勉強法 〜その2〜


前の記事
[はじめての方のkotlin勉強法 〜その1〜
](https://qiita.com/miyo1234/items/fee0bb04f5668eaf61ed)

（注：前回も書きましたが、参考時間はちょっと多めに書いています）



`では、いよいよKotlinに入って行きます`



復讐のためにKotlinリファレンスを見てみた
----
所要時間 : 1分

[Kotlin Koans](https://play.kotlinlang.org/koans/overview)

少しわかるようになりましたが、やっぱり全然わかりませんw


師匠のところにもどりました。(ドットインストールさん)
---
所要時間 16時間
ドットインストールで下記を受講
 - Kotlin入門
 - Androidアプリ開発入門 (全11回)

実はここまでくると構文が違うだけなのですぐ終わります。
〜その１〜のメモアプリ以外はすんなりかけるようになっています。


ちょっと寄り道
----
所要時間 80時間
[Kotlin スタートブック](https://www.amazon.co.jp/Kotlin%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF-%E6%96%B0%E3%81%97%E3%81%84Android%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%95%B7%E6%BE%A4-%E5%A4%AA%E9%83%8E/dp/4865940391/ref=sr_1_1?adgrpid=52564297599&hvadid=259132820568&hvdev=c&hvlocphy=1009332&hvnetw=g&hvpos=1t1&hvqmt=e&hvrand=13219668387082692110&hvtargid=kwd-315885033021&jp-ad-ap=0&keywords=kotlin%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF&qid=1552615427&s=gateway&sr=8-1&tag=googhydr-22) を読みました

界隈では登竜門とされている本なのでしょうか？
ここで初心者には難しい記法（ラムダ式とか再帰呼出しとかクロージャとか）や
ライブラリ(Retrofit,RxAndroid,Dagger2)等の紹介があるのでとても勉強になりました。

※Javaやったことなかったし、ライブラリ自体の更新がかかっていたりするので
　少し時間がかかりました。


またしてもオープンソース
---
google様を参考にさせていただきました。

[googlesamples/android-architecture](https://github.com/googlesamples/android-architecture)
[googlesamples/android-architecture-components](https://github.com/googlesamples/android-architecture-components)

ここで最新のトレンドとかがなんとなくつかめます。
その他、適当にググって人気のライブラリとか探してみてください。
ここまでくると気合いれればなんとなくは理解できるようになっています。

実践2
---
では〜その１〜でつくった自分のソースを見てみましょう。
腹を抱えて笑ってください。
これがリファクタリングできれば立派なKotlinプレイヤーとなっているでしょう。


感想
---
テストコードの書き方とかもなんとなくつかめています。
あとはコード書く時間があればなんとでもなるでしょう。
調べる能力もついているはずです。


ここではgoogle playへのアップ方法とかは割愛します。ご了承ください。
ここまで読んでいただきありがとうございました！
windowsでask cli開発(deployができない編)

以下は、ask-cli version 1.6.2の時の話です。

下記の翻訳？転載です。
中々解決策が見つからなくて苦労したので、ここに書いておきたい。
[Ask \- deploy not working after built successfully \- Forums](https://forums.developer.amazon.com/questions/191868/ask-deploy-not-working-after-built-successfully.html?sort=votes)

windowsでASK CLIを使ってアレクサスキル開発をしていて、

```
ask deploy
```
で何も起こらない（処理が帰ってこない）人はまずは、

```
ask deploy --debug
```
をやってみよう。

もしそれで、以下の場所で止まってたら

```
C:\Users\xxx\Documents\git\alexaskill\xxx>ask deploy --debug
###########################
##### pre-deploy hook #####
###########################
Codebase (lambda/custom) built successfully.
###########################

```

上記のURLに書いてある通り、

ask-cliのバージョン1.4.9を入れましょう。

```
npm install -g ask-cli@1.4.9
```

nodeのバージョンは10系で問題なしです。