OmniAICreator/Qiita-1.07M huggingface dataset:
Spark Dataframe を投げるとヒートマップを出力する関数 

## はじめに
Spark df でヒートマップを作るたびに何度も同じことを調べてるので、備忘録がてら関数にしておきます。

## 関数
Spark dfと、相関を調べるカラムを入れたリスト、2つを引数に取ります。

```python

def sparkdf_to_heatmap(spark_df, col_lis):
  import matplotlib.pyplot as plt
  import numpy as np
  import pandas as pd
  import seaborn as sns
  
  # 図の見た目指定
  # 見た目を逐一変えたい場合は引数に入れ込む
  # style_option from: 'paper', 'notebook', 'talk', 'poster'
  style = 'poster'
  color = 'Blues'
  fig_width = 30
  fig_height = 15
  linewidth = .5
  fmt = '.2f'

  sns.set_context(style)
  df_pd = spark_df.select('*').toPandas()
  df_pick = df_pd.loc[:, col_lis]
  fig, ax = plt.subplots(figsize=(fig_width, fig_height))
  ax =  sns.heatmap(df_pick.corr(), annot=True, cmap=color, linewidth=linewidth, fmt=fmt)
  display(fig)
```

## 使用例
iris で試してみます。

```python
from sklearn.datasets import load_iris
import numpy as np
import pandas as pd

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.enabled", "true")

col_lis = iris.feature_names
iris_pd_df = pd.DataFrame(iris.data, columns=col_lis)
iris_spark_df = spark.createDataFrame(iris_pd_df)

sparkdf_to_heatmap(iris_spark_df, col_lis)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/b8db9682-69bf-baf7-a846-b8423b15200f.png)

## さいごに
Pandas df にするときにクラスタが走っちゃってるので頻繁に行う場合には要注意。小規模データでさっとカラムの相関を見たいときに。

## 参考リンク
[seabornの細かい見た目調整をあきらめない](https://qiita.com/skotaro/items/7fee4dd35c6d42e0ebae)
[]()
自己証明書(オレオレ証明書)を使うとPostmanで接続エラーとなる問題への対応

# 概要

HTTPの接続テストをするときは [Postman](https://www.postman.com/) が便利ですが、自己証明書(オレオレ証明書)を使った接続テストでは接続エラーとなってしまいました。ちなみに、Postman を使わずに Web ブラウザーからアクセスした場合は問題なく接続テストができています。
調べたところ、Postman のSSL証明書の検証によって接続エラーが発生していましたので対応方法について記載します。

# 対応方法

1. Postman の `File` -> `Settings` を開きます。

2. General タブにある `SSL certificate verification` を `OFF` にします。

これでSSL証明書の検証が行われなくなります。

![postman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278145/2ab2a679-5f75-dc2b-5528-f39e163d17ba.png)

Postman のデフォルト設定ではSSL証明書の検証が行われるため、自己証明書はブロックされてしまうようです。
自己証明書で接続エラーとなる場合は設定を確認してみてください。
CakePHP4のasciiAlphaNumericについて

CakePHP2,3系では、**alphaNumeric**が、日本語を通してしまう問題がありました。

CakePHP4では、**asciiAlphaNumeric**が用意されたため、半角英数字のみを受け入れるバリデーションが出来ます。

##ここまでの過程

【参考】

- CakePHP2のalphaNumeric
  - https://github.com/cakephp/cakephp/blob/2.x/lib/Cake/Utility/Validation.php#L91
- CakePHP3のalphaNumeric
  - https://github.com/cakephp/cakephp/blob/3.x/src/Validation/Validation.php#L145
- CakePHP4現行のalphaNumeric
  - https://github.com/cakephp/cakephp/blob/master/src/Validation/Validation.php#L131 

英数字のみを受け入れるフォームを作りたいときに、CakePHPの**alphaNumericバリデーション**を使って実装すれば簡単だと思っていました。

しかし・・

日本語がバリデーションをスルスル通過する（泣）

調査していくと、CakePHP2,3系も同様の問題を抱えていて、例えば、2,3系では、カスタムバリデーションを自分で書いて日本語などの全角文字を防いでいたりと、他のアプローチで対応する必要がありました。


alphaNumericは、CakePHP2,3では以下のようになっています。


```php:Validation.php
    public static function alphaNumeric($check)
    {
        if (empty($check) && $check !== '0') {
            return false;
        }

        return self::_check($check, '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du');
    }
```
以下が4系のalphaNumericです。

4系でもalphaNumericバリデーションは、日本語を通す挙動になっていました。


```php:Validation.php 
    public static function alphaNumeric($check): bool
    {
        if ((empty($check) && $check !== '0') || !is_scalar($check)) {
            return false;
        }

        return self::_check($check, '/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du');
    }
```
4系のalphaNumericには、!is_scalar($check)が追加されています。

!is_scalar($check)は、値がスカラー値かどうかをチェックするメソッドです。スカラーに関しては、下記の記事が分かりやすいです。

[スカラーについての記事](https://webkaru.net/php/function-is-scalar/)

スカラー値の判定をすることで、配列などもチェックされるようになりました。



##alphaNumericとasciiAlphaNumericの違いは？

こちらがasciiAlphaNumericバリデーションです。

```php:Validation.php
     public static function asciiAlphaNumeric($check): bool 
     { 
         if ((empty($check) && $check !== '0') || !is_scalar($check)) { 
             return false; 
         } 
         return self::_check($check, '/^[[:alnum:]]+$/'); 
     } 
```

なぜalphaNumericは、日本語が通過してしまうのだろうと思い調査してみました。

alphaNumericは内部で、`/^[\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]+$/Du`という正規表現を通しています。

この正規表現は、日本語を通過してしまいます。

それに対して、asciiAlphaNumericは内部で `/^[[:alnum:]]+$/`という正規表現を通しています。

これにより、日本語が通過しなくなりました。

最後まで読んでくださり、ありがとうございました。
【DS】エクセルの列をループで取得する

https://knowledge.bizrobo.com/hc/ja/articles/360030432512-DS%E3%81%A7%E5%A4%89%E6%95%B0%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6Excel%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%82%BB%E3%83%AB%E4%BD%8D%E7%BD%AE%E3%82%92%E5%8B%95%E7%9A%84%E3%81%AB%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

excelでは列が英語になっていて指定するのが難しいので、
上記の方法を使う
COTOHA API で品詞分類

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

>次の記事に触発されて書きました。
>[【Qiita x COTOHA APIプレゼント企画】COTOHA APIで、テキスト解析をしてみよう！](https://zine.qiita.com/event/collaboration-cotoha-api/)

cotoha_api.py　は次のページの　python3 の　CotohaApi　をそのまま使っています。

>[自然言語処理を簡単に扱えると噂のCOTOHA APIをPythonで使ってみた](https://api.ce-cotoha.com/contents/index.html)

```py:cotoha01.py
#! /usr/bin/python
# -*- coding:utf-8 -*-
#
# cotoha01.py
#
# ----------------------------------------------------------------------
import sys
import os
import json
from dotenv import load_dotenv

from cotoha_api import CotohaApi
# ----------------------------------------------------------------------
if __name__ == '__main__':

	dotenv_path = '.env'
	load_dotenv(dotenv_path)
	CLIENT_ID = os.environ.get("CLIENT_ID")
	CLIENT_SECRET = os.environ.get("CLIENT_SECRET")
	DEVELOPER_API_BASE_URL = os.environ.get("DEVELOPER_API_BASE_URL")
	ACCESS_TOKEN_PUBLISH_URL = os.environ.get("ACCESS_TOKEN_PUBLISH_URL")
# ----------------------------------------------------------------------
	# COTOHA APIインスタンス生成
	cotoha_api = CotohaApi(CLIENT_ID, CLIENT_SECRET, DEVELOPER_API_BASE_URL, ACCESS_TOKEN_PUBLISH_URL)

	# 解析対象文
	sentence = "特急はくたか"

	# 構文解析API実行
	result = cotoha_api.parse(sentence)

#	sys.stderr.write("len = %d\n" % len(result["result"]))

#	for unit in result["result"]:
#		llx = len(unit['tokens'])
#		sys.stderr.write("llx(tokens) = %d\n" % llx)

	for unit in result["result"]:
		for token in unit['tokens']:
			print(token['form'],token['pos'])
# ----------------------------------------------------------------------
```

```text:.env
LIENT_ID = AAAAAAAAAAAAAAAAAAAAAAAAAA
CLIENT_SECRET = aaaaaaaaaaaaaaaaaaaaaaaaaa
DEVELOPER_API_BASE_URL = https://api.ce-cotoha.com/api/dev/nlp/
ACCESS_TOKEN_PUBLISH_URL = https://api.ce-cotoha.com/v1/oauth/accesstokens
```

実行結果

```text
$ ./cotoha01.py 
特急 名詞
は 動詞語幹
く 動詞接尾辞
たか 名詞
```

Mecab　を使っての実行例はこちら
>[ubuntu 18.10 に mecab をインストール](https://qiita.com/ekzemplaro/items/c98c7f6698f130b55d53)
#Rails の ActiveRecord で DBの値が nil / NULL かどうかを モデルのインスタンスに問うメソッド

Uder#name が nil かどうかを聞くには User#name? メソッドを使えば良いっぽい

```rb
user = User.first

# When presence
user.update!(name: "xxx")
# user.name?
=> true

# When blank
user.update!(name: "")
user.name?
# => true

# When nil
User.first.name?
user.name?
# => false

```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2995








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Rails ActiveRecord aks instance to column presence or nil ? merthod / Model#name?


```rb
user = User.first

# When presence
user.update!(name: "xxx")
# user.name?
=> true

# When blank
user.update!(name: "")
user.name?
# => true

# When nil
User.first.name?
user.name?
# => false

```

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2996








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ZFSでraidzからmirrorに変更

以前からviで保存しようとするとなかなか終わらないことがあり、ディスクがだめだったようなのですが、案の定zfs statusで見るとDEGRADEDになっています。/var/log/messageにもada1のエラーが出ています。再起動するとONLINEに戻ったりするのですが、諦めて対応することにしました。

自宅のMicroserver gen7には元から入っていた250Gがufsでシステムが入っていて、2Tx3でraidzを組んでいました。ネットのページを参考にzfsとjailの組み合わせで使っていました。ZRouter.orgのビルド用のjailとmruby on YABMの開発用のjailなどを作ってあります。

通常であれば、ディスクを購入してreplaceするのでしょうが、貧乏でお金がないので、新たに購入せずに対応できる方法を考えてみました。そもそもあまり容量を使ってなかったので、3発のraidzから2発のmirrorに変更することにしました。

![ZFS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/91b30343-1da2-ed98-d651-92d3913de71d.png)

まずバックアップを取るために、各ボリュームにスナップショットを設定します。

```
% zfs snapshot storage/zrouter@20200220
```
次にada0の/var/tmpなどでsendしてバックアップを作ります。

```
% zfs send storage/zrouter@20200220 > zrouter.bin
```

幸いあまり使っていなかったので250Gで収まりました。バックアップを作ったらボリュームをdestroyしてzpoolもdestroyします。

壊れたディスクを抜いて、zpool create mirrorでプールを作ります。

これにバックアップしたボリュームをrecvで戻せば元通りです。

```
% zfs recv storage/zrouter < zrouter.bin
```

ざっくり200Gくらいのデータ量で、2時間くらいで上記の作業が終わりました。ミスオペがないように慎重に作業しました。

昔はtarコマンドでバックアップを取っていました。対象の容量が大きくなりtarコマンドでは遅かったり失敗したりすることがありますが、zfsは安定して操作できて素晴らしいです。

結構長いこと不調だったと思うのですが、今後は早めに対応できるように.loginにzpool status -xを入れてみました。
EC2の本番環境DBをMySQLで削除する方法

###本番環境のDBをいじる方法を紹介します。

まず、サーバーサイドにつなぎましょう。
<img width="293" alt="スクリーンショット 2020-02-20 11.34.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480998/2d4b92c2-bd90-85dd-301d-8ac5bda9033c.png">

次にmysqlにログインしましょう。

```
mysql -u root -p
```

ログイン時はパスワードを求められるので入力しましょう。

この画面が出たら成功です！

```
mysql> 
```
まず、データベースの中をみてみましょう。

```
mysql> show databases;
```
<img width="261" alt="スクリーンショット 2020-02-20 11.43.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480998/f985c6a7-b44c-cd67-99c4-01bd68e6b2a6.png">

データベースを選択します。

```
mysql> use freemarket_sample_60b_production;
```

データベースの中にあるテーブルをみてみましょう。

```
mysql> show tables;
```

<img width="333" alt="スクリーンショット 2020-02-20 12.43.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480998/b73e26de-d168-2a4b-d43e-00fbe21c47ec.png">

次は削除したいテーブルを選びましょう。

```
mysql> select * from items;
```

<img width="688" alt="スクリーンショット 2020-02-20 12.57.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480998/9465aac8-056c-ecac-2463-8e7d637d1377.png">


今回は、itemsテーブルの　ID＝４　を消したいと思います。

```
mysql> delete from items where id='4';
```

もう一度確認して見ましょう。

```
mysql> select * from items;
```

<img width="688" alt="スクリーンショット 2020-02-20 12.57.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480998/0a75522d-9c69-773d-d1fb-435ab0111f1f.png">

これで完了です！

##おまけ

typeカラムのテキストタイプを削除

```
mysql> delete from items where type='text';
```
全テーブル削除

```
mysql> delete form items;
```
python モジュールのインポートがVSCODEではできなくて、jupyterlab上で,できたため原因を探る話(2)

他の情報を求めてネットを検索していたところ、どうやらpython環境が複数あると
意図しないpythonバージョンをVSCODEが選択して実行してしまうことがあるらしい。

そこで、VSCODE上のpythonを調べてみることに。VSCODEを開いてshift+ctrl+pを押し「select interpreter」で
ぐぐる。すると。

![VSCODE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589591/b1d5d0a9-4594-d377-bfea-6a6e5cb7621d.png)


どうやらanacondaのpythonと無印のpythonがあり、これまでanacondaベースのpyhonを選択していたようだ。
これを最新の無印のpython3.8.1を選択したら無事にpyquery等のモジュールが利用できるようになった。
原因はやはりVSCODE上の設定にあったようだ。
TCP/IPについて

## TCP/IPとは？
- **コンピューターネットワーク**やインターネットを動かしている通信技術を一式として総称したもの。
- ネットワーク越しに何かを送るときに必要なプロトコルのこと。

インターネットへのアクセスが可能なスマホやパソコン、サーバーは全てTCP/IPに対応していて、一昔前までは、コンピューターに搭載されたOSや機種ごとに独自の**プロトコル**が利用されていて、同じ機種同士でしか通信が行えなかった。

※**コンピューターネットワーク**とは、複数のコンピューターを接続して、情報のやりとりをすること。

### プロトコルとは？
- ネットワークに接続された機器同士が通信をするときの、あらかじめ決められた共通のルールや手順のこと。お互いに同じプロトコルを利用することによって、データのやりとりが可能となる。

ようは、共通ルールのこと！

主なプロトコル

| プロトコル名      |       説明 　　　　|    ポート番号   　　 |
|:-----------------|:------------------|:------------------:|
| HTTP(HyperText Transfer Protocol)|Webページの転送に利用するプロトコル |80|
| FTP(File Transfer Protocol) | ファイル転送サービスに利用するプロトコル。ネット上へのファイルのアップロードやダウンロードに使う |20（制御用）、21（転送用）   |
| Telnet|他のコンピューターにログインして、遠隔操作を行う際に使うプロトコル|23|
| SMTP(Simple Mail Transfer Protocol)|電子メールの配送部分を担当するプロトコル。メールサーバ間での送受信に使う |25 |
| POP(Post Office Protocol)| 電子メールの受信部分を担当するプロトコル。メールサーバ上から受信したメールを取りだすために使う |100|
| NTP(Network Time Protocol)|コンピューターの時刻合わせを行うプロトコル|123 |

### IPアドレスとは？
- インターネット上の住所のこと。
- データの行き先を管理するために使われる。

### ポート番号とは？
- コンピューターが提供するサービスを指定するための番号。

例えばIPアドレスが住所と例えると、IPアドレスでマンション名までがわかるが、部屋番号がわからない。その部屋番号がポート番号にあたる。
docker-compose.yml → Dockerfile 変数渡し ＆ 複数FROM構成での注意点

# docker-compose.yml → Dockerfile に変数を渡す方法

↓この記事で使ったネタです:smiley:
* syslog受信 → S3保存 してくれるDockerコンテナ お手軽セット https://qiita.com/yagrush/items/2fbff71c1c2bf12f7d71

## 1/2 docker-compose.yml側

`build`キーの子要素として`args`キーを追加し、
その下に配列として、渡したい変数名と値を書いていきます。

```
services:
  my-s3access-app:
    build:
      context: ./app
      dockerfile: Dockerfile
      args:
        - GITHUB_ACC=hogehige
        - GITHUB_ACC_PASSWORD=agd82gfo3gfagkaf
　　　　　・
　　　　　・
　　　　　・
```

## 2/2 Dockerfile側

`ARG`コマンドで宣言（キャッチ）すると、それ以降`$HOGE`で利用可能になります。

```
FROM golang:1.13
ARG GITHUB_ACC
ARG GITHUB_ACC_PASSWORD
RUN echo -e "machine github.com\nlogin $GITHUB_ACC\npassword $GITHUB_ACC_PASSWORD" > ~/.netrc
RUN go mod download
　・
　・
　・
```

# Dockerfileが複数FROM構成のときの注意点

次の`FROM`コマンドに処理が移るとき引き継がれないので、`ARG`しなおさないといけません。

ちなみに複数`FROM`が必要となるのは
［ソースコードをビルドするイメージ］
と
［ビルド結果の実行体だけを配備して実行するためのイメージ］
を分けたい時などですね。

```
FROM golang:1.13 as base

FROM base as builder
ARG GITHUB_ACC
ARG GITHUB_ACC_PASSWORD
RUN echo -e "machine github.com\nlogin $GITHUB_ACC\npassword $GITHUB_ACC_PASSWORD" > ~/.netrc
RUN go mod download
　・
　・
　・
FROM base as scratch
ARG GITHUB_ACC
ARG GITHUB_ACC_PASSWORD
　・
　・
　・
```
phpstormで辞書登録すればプロジェクト固有でスペルチェックをスルーできる

phpstormのインテリジェンスはすごく便利ですが、
その反面でスペルチェックもしっかりやってくれるので逆に不便な時があります。

![スクリーンショット 2020-02-20 12.44.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/9ba52cae-2bb6-a1b3-fd0b-5d65a7ff72b3.png)

上記の例でいうと、
``gacha``っていうのが辞書的にないみたいなのでスペルチェックに引っかかってます。

ただ、プロジェクトの用語としては使いたいって時があると思います。

そんな時は辞書登録しちゃえば便利です。

![スクリーンショット 2020-02-20 12.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/eadd8e61-6a3c-662e-a8d7-b86ae90e32dd.png)

右クリックから`'XXX'をプロジェクト・レベルの辞書に保存`で登録できます。
すると、スペルチェックのWarningが消えます。

![スクリーンショット 2020-02-20 12.55.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/fc4eefb5-e175-4909-7ff4-7bb50b80a9e4.png)

登録した単語は
``環境設定``→``エディター``→``スペル``
で確認できます。


https://pleiades.io/help/phpstorm/spellchecking.html
Node.js + Expressの環境構築をしてみた

#1.はじめに
先日Node.js + Expressの環境を構築する機会がありました。せっかくなので、学んだことをOUTPUTしたいと思ってまとめることにしました。


##1-1.Node.jsとExpress
- Node.js：サーバーサイドのjavascript実行環境：https://nodejs.org/ja/
- Express：高速で動作するミニマルなNode.jsフレームワーク：https://expressjs.com/ja/api.html

![](https://cdn-ak.f.st-hatena.com/images/fotolife/k/karoten512/20180322/20180322123340.jpg)

#1-2.PCの環境
- Windows10 Version 1909
- Node.js v12.13.1
- npm v6.12.1


#2.環境構築
##2-1.Node.jsのインストール
まず、最初にNode.jsをインストールします。
▼Node.jsリンク
https://nodejs.org/ja/

Node.jsには、偶数系統と奇数系統があります。偶数系統がLTS(Long Term Support)版となるので、特に必要がない場合は、偶数系統のインストーラをダウンロードしてインストールすれば良いと思います。

インストールが完了したら、cmdを開いて次のコマンドを実行してください。Node.jsのバージョンを確認することができます。

```
node -v
```

##2-2.Expressのインストール
node.jsがインストールできたら、次に__Express-generator__を利用してアプリケーションのひな型を生成します。

```cmd:1.アプリケーションを作成したいディレクトリに移動
cd [アプリケーションを作成したいディレクトリ]
```

```cmd:2.express-generatorのインストール
npm install -g express-generator
```



```cmd:3.アプリケーションの生成
express [生成したいアプリケーション名]
```

上記コマンドを実行すると、カレントディレクトリ配下にアプリケーションのひな型が生成されます。
次のコマンドを実行すると、ファイルまで含めて生成された内容を確認できます。

```
tree /f
```

```cmd:実行結果
└─api_app
    │  app.js　：アプリケーション本体、最初に呼び出される。
    │  package.json　：アプリケーションの環境設定　
    │
    ├─bin
    │      www ：アプリケーションのエンドポイント
    │
    ├─public　：フロントエンドで利用する画像やjs, cssを保管する場所
    │  ├─images
    │  ├─javascripts
    │  └─stylesheets
    │          style.css
    │
    ├─routes　：ルーティングを行っている
    │      index.js
    │      users.js
    │
    └─views　：jadeファイル
            error.jade
            index.jade
            layout.jade
```

##2-3.express-generatorでアプリケーションのひな型を生成
node.jsがインストールできたら、次に__Express-generator__を利用してアプリケーションのひな型を生成します。

```cmd:1.アプリケーションを作成したいディレクトリに移動
cd [アプリケーションを作成したいディレクトリ]
```

```cmd:2.express-generatorのインストール
npm install -g express-generator
```


```cmd:3.アプリケーションの生成
express api_app
```

api_appの部分は生成したいアプリケーション名を指定してください。
上記コマンドを実行すると、カレントディレクトリ配下にアプリケーションのひな型が生成されます。
次のコマンドを実行すると、カレントディレクトリ配下のファイルが確認できるので、生成された内容を確認します。

```
tree /f
```

```cmd:実行結果
└─api_app
    │  app.js　：アプリケーション本体、最初に呼び出される。
    │  package.json　：アプリケーションの環境設定　
    │
    ├─bin
    │      www ：アプリケーションのエンドポイント
    │
    ├─public　：フロントエンドで利用する画像やjs, cssを保管する場所
    │  ├─images
    │  ├─javascripts
    │  └─stylesheets
    │          style.css
    │
    ├─routes　：ルーティングを行っている
    │      index.js
    │      users.js
    │
    └─views　：jadeファイル
            error.jade
            index.jade
            layout.jade
```


##2-4.画面表示
アプリケーションのひな型が作成できたら、作成したアプリケーションを起動してみます。
まず、作成したアプリケーションにディレクトリを移動してから、npm installでpackage.jsonに記載されたパッケージがインストールされます。


```cmd:1.install
cd api_app
npm install
```


npm installができたら、ブラウザから[http://localhost:3000/](http://localhost:3000/)にアクセスしてください。

```cmd:2.アプリケーションの起動
npm start
```

正しくアプリケーションが起動できていると、次のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329171/93b17199-c498-2c2e-414f-b1f98c2af178.png)

アプリケーションを終了したい場合は、cmd上で「ctrl + C」を実行します。「バッチ ジョブを終了しますか (Y/N)?」と求めてきますので、yを選択すれば抜けることができます。


#3.所感
とりあえず環境構築をすることろまではできました。次はAPI構築あたりの内容を書きたいです。



#参考リンク
https://qiita.com/nkjm/items/723990c518acfee6e473
https://qiita.com/maitake9116/items/7825d90c09f3e2f87dea
Github ActionsでAssumeRoleする方法


### はじめに
ローカル端末にて実施していたServerless FrameworkによるLambda環境のdeployを、GitHubActionsに移行したけど、AssumeRoleの処理で詰まったので備忘録です。

### ローカルでのデプロイ方法
複数のAWSアカウントを持ってるので、以下を参考にIAMユーザーには権限を持たせず、`AssumeRole`を利用して各AWS環境のRoleにスイッチロールしてアクセスをしてます。

https://dev.classmethod.jp/cloud/aws/aggregate-login-aws-account/

その為、デプロイする時は対象のAWSアカウント用のProfileを指定してデプロイを実行しています。

```bash
$ AWS_PROFILE=aws-test sls deploy --verbose
```

#### ~/.aws/credentials 
```
 [default]
aws_access_key_id = ****************
aws_secret_access_key = *****************************************
[aws-test]
role_arn = arn:aws:iam::<AcountID>:role/assume-role
source_profile = default
```

### AssumeRoleの実行方法
AWSのブログ「[GitHub Actions と AWS CodeBuild テストを使用して Amazon ECS の CI/CD パイプラインを作成する](https://aws.amazon.com/jp/blogs/news/create-a-ci-cd-pipeline-for-amazon-ecs-with-github-actions-and-aws-codebuild-tests/)」にも紹介されている、以下の公式のActionを利用してAsume Roleを実行します。

https://github.com/aws-actions/configure-aws-credentials

### GitHub Actionsの設定
READMEの記載を参考に以下を定義します。  
AssumeRoleのARNもsecretsから取得するようにしてます。

```yaml
- name: Configure AWS Credentials
  uses: aws-actions/configure-aws-credentials@v1
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: ap-northeast-1
    role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN }}
    role-duration-seconds: 1200
```
secretsには`~/.aws/credentials`と同じ値を設定します。

#### workflowの全文はこちら
https://gist.github.com/dehio3/7f41754e50a39914b01a831383d9a677

### GitHub Actionsの実行
そのまま実行すると`Configure AWS Credentials`のステップにて以下のエラーで失敗します。

```bash
##[error]User: arn:aws:iam::<AcountID>:user/<IAM User Name> is not authorized to perform: sts:TagSession on resource: ***
##[error]Node run failed with exit code 1
```

### 原因
Actionの処理を確認すると以下の様にAssumeRoleする際にセッションタグを渡していました。  
（普段使ってないのでセッションタグの存在を初めて知りました。）

https://github.com/aws-actions/configure-aws-credentials/blob/master/index.js#L38-L46

セッションタグについては以下を参照  
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_session-tags.html

### 対応
セッションタグの説明の[セッションタグの追加に必要なアクセス許可](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_permissions-required)に記載の通り、接続先のロールの信頼ポリシーにセッションタグへのアクセスを許可する必要があります。

```yaml
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AcountID>:root"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"  #　"sts:TagSession"をActionに追加する
      ],
      "Condition": {}
    }
  ]
}
```

ロールを作成する時に、コンソールから「信頼されたエンティティの種類」で「別のAWSアカウント」を指定して作成すると、`sts:AssumeRole`しか許可しない為、一旦作成後に信頼ポリシーを編集して追加する必要があります。

接続元のアカウントではなく、接続先のアカウントのロールに設定が必要なので注意です。  
(接続元のアカウント側で対応してて、小一時間ハマってしまいました・・・)
【Nuxt.js】共通stylusを使用できる方法

Nuxt.jsでcssを書くときにデフォルトではSassを使うことが多いと思いますが、
もう一歩踏み込んでStylusでやってみたいと思いました。

## Stylusとは？
ざっくりStylusの特徴といえば、{}や「 : 」,「 ; 」を使わずにかけることです。
Sassの後発でもあるのでSassの書き方も使えるみたいです。(どこまでかは今お試し中です。)
ソースをコピペするときはそのまま使えたりするので便利ですよね。

## Stylusを使えるようにする

ますは必要なモジュールを入れます。

```
$ yarn add stylus stylus-loader  
```

vueファイルのstyleタグにlang設定します。

```
<style lang="stylus">  
.section
  color red
  font-size 1.6rem  
  border 1px solid #000000
  .innner-section
    padding 2em
</style>  
```

## サイトで共通の変数やclassを使いたい
vueファイル内であれば下記のような書き方で変数を使えます。

```
<style lang="stylus">  
$red #ff0000
.section
  color $red
  font-size 1.6rem  
  border 1px solid $red
</style>  
```

しかし、別のvueファイルでの変数は使えません。
共通用のファイルを作成する必要があります。

```
assets
 -variables.scss
```
このままだSassのままなので下記のコマンドを叩き、追加してください。

```
$yarn add @nuxtjs/style-resources
```

さらに下記にファイル構成を変更（こんな感じのほうがまとまりがいいと思います。）

```
assets
 -stylus
  -_variables.styl 
```

先ほど作成したファイルに変数などをまとめます。

```assets/stylus/_variables.styl  
$white = #ffffff  
$black = #000000
$display01 = 600px
```

nuxt.config.jsの設定を行います。

```nuxt.config.js  
export default {  
    // 中略  
    modules: [ '@nuxtjs/style-resources' ],  
    styleResources: {  
        stylus: [  
            '~/assets/stylus/_variables.styl'  
        ]  
    }  
}  
```

これで各vueファイルに変数の使用や共通styleを使うことができます。
preventDefault, stopPropagation, stopImmediatePropagationまとめ


## はじめに

Javascriptでアプリ開発していると、なんとなく"予防的"に、`preventDefault`と`stopImmediatePropagation`をコード中で併記する変な癖がついてしまっていました。（違いは理解しているつもりだったのですが、IME関連の処理を書いている時から`preventDefault`が効かなくなったりして混乱してしまったみたい。）

確認用として、これらでキャンセルできるイベントについて整理します。

## テスト条件

次のようなHTMLで、`contentEditable`な要素を含むアプリを想定します。


```html
<html>
<body>
<div id="div0" contentEditable="true">入力欄</div>
</body>
</html>
```

このHTMLに対して、Javascriptでは次のイベントリスナーを登録しておきます。

```javascript
const div0 = document.getElementById("div0");
div0.addEventListener("keydown", OnKeydown1, false);
div0.addEventListener("keydown", OnKeydown2, false);
div0.addEventListener("input", OnInput, false);
div0.addEventListener("keyup", OnKeyup, false);
window.addEventListener("keydown", OnKeydownWin, false);
window.addEventListener("keyup", OnKeyupWin, false);
```
 addEventListenerの登録順序も表記の順とします。

さて、これを実行し、要素`div0`の中でキー入力を行うと、次の順でイベントが発火します。

1. OnKeydown1
1. OnKeydown2
1. OnKeydownWin
1. OnInput
1. OnKeyup
1. OnKeyupWin

これがデフォルトの状況となります。OnKeydownWinとOnKeyupWinはバブリングにあたります。

## 発火を抑制できるイベント

上記の条件下において、`OnKeydown1` イベントの中で`preventDefault`、`stopPropagation`、`stopImmediatePropagation`のいずれかをcallした場合、2～6のイベントでキャンセルされるものを以下の表記に記載します。×印のついたイベントはキャンセルされ、なにも記述の場合は発火することを意味します。

|イベント名|preventDefault|stopPropagation|stopImmediatePropagation|
|---|:---:|:---:|:---:|
|OnKeydown2|||×|
|OnKeydownWin||×|×|
|OnInput|×|||
|OnKeyup||||
|OnKeyupWin||||

 `preventDefault`と`stopPropagation`もしくは`stopImmediatePropagation`を併記した場合は、どちらかで×印が付いているイベントはキャンセルされます。

簡単に挙動を纏めると、次のようになります。`preventDefault`でキャンセルできるのはデフォルト処理であり、今回の`contentEditable`な要素に対してのキー入力では、文字入力がキャンセルされます。よって`OnInput`がキャンセルされます。 一方で、もう一つ登録された`Onkeydown2`やバブリングである`OnkeydownWin`はキャンセルされずに発火します。また、`OnKeyup`はkeydownとは独立したイベントとみなされ、キャンセルできません。

`stopPropagation`はバブリングだけをキャンセルします。よって、`OnkeydownWin`がキャンセルされます。しかし、 `Onkeydown2`は同じ要素の同じイベントに登録されたリスナーであってバブリングではないのでキャンセルできません。

`Onkeydown2`もキャンセルしたい場合には`stopImmediatePropagation`を使います。これはバブリングに加えて、同じ要素の同じイベントに**続けて**登録されたリスナーもキャンセルします。

## 例外

IME制御は上記が当てはまらない場合があります。詳しくは以前のまとめへ

- [モダンブラウザにおけるキー入力のキャンセル](https://qiita.com/pochman/items/b99c835bf598810d3c18)
- [モダンブラウザにおけるIME入力検知](https://qiita.com/pochman/items/5b69ebedf4465f93c2f1)

## さいごに

まとめて思うのは、`OnKeydown2`だけをキャンセルして、バブルリングの`OnKeydownWin`は発火させることはできないのだろうか。私の場合は、それがやりたかった為に無意識にコードをこじらせている部分があります。。。
detekt(Kotlinの静的コード解析ツール)をコマンドラインで使ってみた

swiftlintみたいなのをkotlin言語でもやってみたい！
なので、似たようなのを探したところdetektが良さげ。
[Kotlinでdetektを使って複雑度を測る](https://qiita.com/n_morioka/items/d9786869f1e42eaea1cf)の記事が大変わかりやすかったです。

#インストール
まずは[公式サイト](https://github.com/arturbosch/detekt#with-the-command-line-interface)を確認。


```
git clone https://github.com/arturbosch/detekt
cd detekt
./gradlew build shadowJar
java -jar detekt-cli/build/libs/detekt-cli-[version]-all.jar --help
```

<img width="1079" alt="スクリーンショット 2020-02-13 16.51.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/6d62a376-a11d-e29d-5bb2-330dc42e92bd.png">

※javaが入ってないと、もちろんエラーがでます。
でも最近どっからjavaとって来たらいいかよくわからないんですよね…。
oracleがライセンス買い取ったみたいで無償で使えるのかよくわからない…。
自分は、[AdoptOpenJDK](https://adoptopenjdk.net/)を入れました。

#コード解析ルール
コード解析ルールは、以下の公式サイトにわかりやすくまとまっていますね。
https://arturbosch.github.io/detekt/comments.html
…さっぱり読めないです。はい。

#コード解析ルールの定義
解析ルールの定義ファイルは、以下に存在しています。

```
<git clone　したディレクトリ>/detekt/detekt-cli/build/resources/main
```

<img width="1009" alt="スクリーンショット 2020-02-14 15.38.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/73faf58f-0c7c-29a1-d1d4-3d82f528a33f.png">

こいつをコピーして新しいファイルを作れば、オリジナルの定義ファイルになります。

自分はcomplexity_ComplexMethod（循環的複雑度）の数値を
15(デフォルト)から10に変えたかったので以下の通り変更しています。

<img width="912" alt="スクリーンショット 2020-02-14 15.43.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/3f0ce0eb-f14e-400b-e2c0-ac0a1194a875.png">

#解析実行
あとは以下コマンドを実行すれば解析できます。

```
java -jar <./gradlew build shadowJarで固めたjarのパス> -c <ルールを記載したファイルのパス> -i <解析したいファイルのパス>
```

<img width="836" alt="スクリーンショット 2020-02-20 12.35.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/cddbab94-2ec0-b87c-2c7a-13d82992e1d9.png">

解析できた！

`java -jar <./gradlew build shadowJarで固めたjarのパス> -c <ルールを記載したファイルのパス>`をエイリアスに設定しておくと、実行するコマンドが少なくなって便利かもしれないです。
[【Mac】エイリアス（ターミナルコマンドのショートカット）の設定](https://qiita.com/bonny_d/items/c5f0b0c2d2fdac8734f6)
コマンドラインだけでswiftlintする

タイトルの通り、コマンドラインだけでswiftlintの静的コード解析する方法です。
Xcodeに組み込む方法は色々と見つかったのですが、
Xcodeに組み込むにはビルドのシェルを変えたりとなんやかんやする必要があり...。
仕事の現場によってはgitで管理するファイルを増やしたくないので、
あくまでも静的コード解析だけができる方法として
コマンドラインだけのSwiftlint実行をまとめました。

#インストール
まずは、[公式サイト](https://github.com/realm/SwiftLint)を確認ですね。

インストールだけなら、コマンドラインにて、以下コマンドを実行するだけでインストールできます。簡単ですね。

```
brew install swiftlint
```

※上記方法でインストールしても、端末によってはswiftlint実行時にエラーになります。
エラーの原因にもよりますが、私の環境では
[macOS CatalinaでSwiftLintが"zsh: illegal hardware instruction"というエラーで利用できない場合の対処法](https://qiita.com/colomney/items/c2b11c9f4934a96f4900)
を参考にしたら正常に動作しました。


#コード解析ルール
コード解析ルール（方法・法則）ですが、たくさんあります。
コマンドラインにて、以下コマンドを実行すると解析のルール一覧がみれます。

```
swiftlint rules
```

<img width="1354" alt="スクリーンショット 2020-02-14 11.24.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/9a4558c6-d2fd-079e-b0b9-92af4279d3fe.png">

わー多い…

一応、以下コマンドでそれぞれのルールが何をチェックするのかわかります。

```
swiftlint rules <確認したいidentifie>
```

<img width="724" alt="スクリーンショット 2020-02-14 11.35.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/d42c40cc-ba0e-67c0-8816-7bd545e6415a.png">
※上記は、nestingの場合。


以下、公式サイトにどのようなルールがあるのか一覧があります。
https://realm.github.io/SwiftLint/rule-directory.html

Qiitaにも内容をまとめてくださった方がいらっしゃいますね。
[SwiftLintの全ルール一覧(Swift 4.2版)](https://qiita.com/uhooi/items/7f5d6cf2b240f60ba1ed)

cyclomatic_complexity(循環的複雑度)を確認したかったんですけど、
デフォルトではオフ（opt-inがno）なので、こちらをオンにしたいです。


#コード解析ルールの定義
コード解析ルールは、オリジナルの定義を別ファイルで持つことができます。
XcodeにSwiftlintを組み込む場合は、「.swiftlint.yml」って名称にするらしいですが、
コマンドラインから実行するときは定義ファイルパスを指定できるのでなんでもいいです。

「.」から始まると隠しファイルになってしまうので、自分は「swiftlint.yml」て名称で
swiftlintのインストールディスクに配置しました。

<img width="869" alt="スクリーンショット 2020-02-14 11.52.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/92c2f37d-e744-70f5-e9e4-cafd068d6a7f.png">

ファイルの中身は以下の通りです。

```
# document: https://github.com/realm/SwiftLint

# 無効にするルール
disabled_rules:
- anyobject_protocol
- array_init
・
・
・


# 有効にするルール
opt_in_rules:
- cyclomatic_complexity
- nesting
- function_body_length
・
・
・

# 循環的複雑度
cyclomatic_complexity:
  warning: 10
  error: 20
・
・
・
```

disabled_rules:の次の行から、
無効にしたいルールを記載していきます。
「- 」(スペースも必要)の後ろに無効にするルール(identifier)を記載します。

opt_in_rules:の次の行から、
有効にしたいルールを記載していきます。

そして、有効にしたいルール(identifier)を「:」つきで記載し、
次の行からそのルールのオプションを記載します。
[公式サイト](https://realm.github.io/SwiftLint/rule-directory.html)を見れば、
どんなオプションがあるかわかります。


#解析実行
あとは以下コマンドを実行すれば解析できます。

```
swiftlint --config <ルールを記載したファイルのパス> --quiet --path <解析したいファイルのパス>
```

※--quietは、実行ログを出力させないオプションです。
<img width="836" alt="スクリーンショット 2020-02-20 12.37.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/b118f518-8b70-f540-2853-96342f1d58f2.png">
解析できた！

`swiftlint --config <ルールを記載したファイルのパス> --quiet`をエイリアスに設定しておくと、実行するコマンドが少なくなって便利かもしれないです。
[【Mac】エイリアス（ターミナルコマンドのショートカット）の設定](https://qiita.com/bonny_d/items/c5f0b0c2d2fdac8734f6)
Laravel-SnappyでPDFを出力する際のページ番号の表示を制御する

##はじめに
この記事では[Laravel-Snappy](https://github.com/barryvdh/laravel-snappy)を利用してPDF出力処理を既に実装されていることを前提にしています。
Laravel-Snappyの導入方法については触れません。


##ページ番号の表示方法
#### オプションで表示する方法
Laravel-Snappyを使ってPDFにページ番号を表示したい場合、以下のようにPDFインスタンスを作成する際のオプションを指定することで簡単に実装することができます。

```php
$pdf = PDF::loadView('pdf')
    ->setOption('footer-center', '[page] ページ')); // フッター中央 [page]でページ番号が自動で入ります
```

ただし、出力されるPDFの総ページ数が1ページの場合でも表示されてしまいます。
１ページの時はページ数を非表示にする場合、ページの表示箇所を自前で実装する必要があるようです。
オプション指定の方法でどうにかできないか調べましたが見つかりませんでした。

#### 自前で表示する方法
ページ数の情報はPDFに読み込ませるHTMLのLocationオブジェクトから取得することができます。
Location.hrefには以下が格納されています。
`page`が現在のページ番号
`topage`が総ページ数

```
file:///tmp/knp_snappy5e3b69aa559ad4.24507587.html?page=1&section=&sitepage=1&title=&subsection=&frompage=1&subsubsection=&isodate=2020-02-06&topage=2&doctitle=&sitepages=2&webpage=&time=&date=
```

この情報を用いて、ページ番号を表示する為にフッターを用意します。


```html:footer.blade.php
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body class="bg-white">
<div class="text-center">
    <span id="pdfkit_page_current"></span>
</div>
<script type="text/javascript">
    (function () {
        var pdfInfo = {};
        var x = document.location.search.substring(1).split('&');
        for (var i in x) {
            var z = x[i].split('=', 2);
            pdfInfo[z[0]] = unescape(z[1]);
        }
        var page = pdfInfo.page || 1; // ページ番号
        var pageCount = pdfInfo.topage || 1; // 総ページ数
        // 改ページがある場合のみページ番号を表示します
        if (pageCount > 1) {
            document.getElementById('pdfkit_page_current').textContent = page;
        }
    })();
</script>
</body>
</html>
```

用意したフッターをPDFに設定するにはオプションで指定します。

```php
$pdf = PDF::loadView('pdf')
    ->setOption('footer-html', \View::make('footer')->render() // 用意したフッターを設定
    ->setOption('margin-bottom', 10)); // フッターの余白を設定します
```

以上になります。
BigQueryで累積値を求める

[Window関数](https://cloud.google.com/bigquery/docs/reference/standard-sql/analytic-function-concepts?hl=ja) を使う。

# データ
| 日付 | アイテム | 売上 |
|:--|:--|--:|
| 2020-02-18 | COMPグミ | 100 |
| 2020-02-19 | COMPグミ | 100 |
| 2020-02-19 | COMPグミ | 100 |

# 上記データから特定の日付までの累積売上を求める
## 理想
| 日付 | 売上 | 累積売上 |
|:--|--:|--:|
| 2020-02-18 | 100 | 100 |
| 2020-02-19 | 100 | 200 |
| 2020-02-19 | 100 | 300 |

## SQL
```sql

#standardSQL
WITH SAMPLE_DATA AS(
SELECT * FROM UNNEST(ARRAY<STRUCT<time TIMESTAMP, item STRING, sales INT64>>
[
  ("2020-02-18 00:00:00+00", "COMPグミ", 100)
  , ("2020-02-19 00:00:00+00", "COMPグミ", 100)
  , ("2020-02-20 00:00:00+00", "COMPグミ", 100)
])
)

SELECT DATE(time) AS date
, sales
, SUM(sales) OVER (ORDER BY time ASC) AS sales_running
FROM SAMPLE_DATA
```

## 結果
| 日付 | 売上 | 累積売上 |
|:--|--:|--:|
| 2020-02-18 | 100 | 100 |
| 2020-02-19 | 100 | 200 |
| 2020-02-19 | 100 | 300 |


# 解説
* `SUM()` で合計するカラムを指定する
* `OVER()` でどういうまとまりで、どういう順序で計算するか指定する
  * ここでは、  `ORDER BY time ASC` で順番しか指定していない
  * ここではやっていないが、  `PARTITION BY` を用いるとまとまりを指定できる

# 参考資料
* https://codingsight.com/calculating-running-total-with-over-clause-and-partition-by-clause-in-sql-server/
Automation Anywhere A2019 - クラウド体験版とCommunity EditionのUIの違い メモ

# 概要

Automation Anywhere A2019 - クラウド体験版とCommunity Editionは、一見画面とできることが同じように見えますが、微妙に違うところがあります。

# 違う内容

* 左上のロゴ (Automation Anywhere Enterprise vs Automation Anywhere Community Edition)
* Community Editionにはログイン後の特別なページ「ホーム」があり、そこから始まる。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/921a3b4d-230a-abf6-7065-272cd432b075.png)
* クラウド体験版 (Enterprise) には「ワークロード」-「キュー」というメニューがある。キューを利用したBotの実行が可能。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/fa0ac5e2-7d56-e2c5-9e5e-e921eb6cdf9f.png)
* <font color="Red">2020年4月リリースのA2019.11以降のCommunity Editionでは、マイBot画面で「Botをインポート」のメニューがめでたくつきました！ただしエクスポートの機能は相変わらずありません。また、無料体験版には引き続きUIを通した機能はありません。ただしAPI経由ではエクスポートできるようです。</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6d71f406-24d9-91a6-0f78-1d47d71e8766.png)

>公式ブログ『[Enterprise A2019 Update: Clone Bots, Bot Import/Export, and More](https://www.automationanywhere.com/company/blog/product-insights/enterprise-a2019-update-clone-bots-bot-import-export-and-more)』より引用
>
>**Bot Import/Export — CI/CD foundation**
With the Bot Import/Export feature, Enterprise users are now able to execute export/import functionality via API. This is key for continuous integration/continuous deployment (CI/CD) pipeline integration. Users are also able to import bots into Test/Prod environments without bot editor licenses in these environments. 
>
>Note: This also allows Community Edition users the ability to export bots so they can be imported into their Enterprise environments (see Figure 2).
>
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c8a0af98-794e-24f3-e9bc-d299ad034d66.png)
>**Figure 2.** The Bot Import/Export feature in Enterprise A2019 ensures continuous integration/continuous deployment by letting users export and import bot functionality.
 


# 参考

* [Automation Anywhere A2019のユーザーインターフェイスの呼び方 まとめ](https://qiita.com/RPAbot/items/bcf3917b4a77791b14b4)
Jupyter notebookのショートカットキー　ひとまずこれだけ

Jupyter notebookのショートカットキーを書いてある記事がいくつかあったが、紹介されているショートカットキーが多くてこんなに普段使わなくね？と思ったので普段使いそうなものだけメモ。*使用しているPCはMacです

コマンドモードに切り替え:esc
編集モードに切り替え:enter

コマンドモードのショートカットキー
　新しいセルの追加:B
　セルの上下移動:↑↓
　ショートカットキーの一覧を表示:H

編集モードのショートカットキー
　セル内の上下移動:Command+↑↓
　実行:Ctrl+Enter
　停止:Esc

これだけでも作業がかなり捗るようになった。
XmlSerializerで複数種類のエレメントのListを定義したい

# XmlSerializerで複数種類のエレメントのListを定義したい

設定ファイルなんかで List<T>を使うんだけど、設定内容はほとんど一緒なのに動作がちょっとだけ違うみたいな場合

![PlantUML Web Server](http://www.plantuml.com/plantuml/png/bP1DQiCm48NNrYcqR0kwWIaKTsCe_QbFC5XZPK2MdD4u49BSFJZ2Ii2hhFJU4_gUPdeFAUacXe7SILL9c89RVC1UA8Ok1whweYHrDq-J9-HtlQgaBafbo1hTCTymOZ5_C_Ank0zhQU63_mM64GMvt3cKLd1SNhzqU_y90ly85bdpxNXzw4JmJPo3RCj_finlmn1L5G_8J1RrCnrvBVhDCBcTc3AXMeMkpyPiFt45)

```plantuml:plantuml

class Config{
	string ConnectionString 
	List<Supplier> Suppliers
}

class Supplier{
	string Name
	string Query
	string AdditionalParameter
	string getItemName(SqlDataReader reader)
}

class SealCountSupplier{
	string OptionalInfo
	override string getItemName(SqlDataReader reader)
}

Config *-right- Supplier
Supplier <|-- SealCountSupplier
```

こんな形にして

```xml
<?xml version="1.0" encoding="utf-8"?>
<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ConnectionString>hogehoge...</ConnectionString>
  <Suppliers>
    <Supplier>
	  <Name>Nissin</Name>
	  <Query>select * from...</Query>
	  <AdditionalParameter />
	</Supplier>
	<SealCountSupplier>
	  <Name>Maruchan</Name>
	  <Query>select * from...</Query>
	  <AdditionalParameter />
	  <OptionalParameter>100</OptionalParameter>
	</SealCountSupplier>
  </Suppliers>
</Config>
```

こんな定義にしたい。

でも普通に`XmlSerialiser.Deserialize()`すると`SealCountSupplier`が復元されない。

## そんなあなたに [XmlArrayItemAttribute](https://docs.microsoft.com/ja-jp/dotnet/api/system.xml.serialization.xmlarrayitemattribute?view=netframework-4.8)

>XmlSerializer がシリアル化された配列で配置できる派生型を指定する属性を表します。
[XmlArrayItemAttribute クラス (System\.Xml\.Serialization) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.xml.serialization.xmlarrayitemattribute?view=netframework-4.8)

```cs
    public class Config {
        public string ConnectionString{get;set;}
        public Config() { }

        [XmlArrayItem(Type = typeof(Supplier))]
        [XmlArrayItem(Type = typeof(SealCountSupplier))]
        public List<Supplier> Suppliers = new List<Supplier>();
	}
```
こうじゃ。
iOSとAndroidのダークモード検証を楽にしよう

## ダークモードの検証忘れて文字が見えない！
はい、これ良くやらかしてませんか？
最近 iOSもAndroidもダークモードが追加され、デフォルトからを背景画像や文字色に使用すると、OSのダークモード設定に合わせて自動でカラーの反転がされますよね。それで、背景は白固定にしてるのに、文字色だけデフォルトにしていて文字が見えない！ということが起きます。


## 開発時・テスト時のダークモード検証を楽にしよう
ダークモードのテストするとき、毎度設定画面を開くのって面倒ですよね。少ないアクションで相互に切り替えれると便利です。実はiOSのAndroidもコントロールセンター（画面上からしたスワイプして出てくる画面）に下記のようにダークモードの切り替えボタンを追加できます！これすごく便利だと思いませんか？

### iOS
<img width="414" alt="IMG_0FD6639A30A5-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51328/82b9614f-c7e5-353e-e8f6-8b9e64f52ffb.png">

### Android
<img width="414" alt="IMG_0FD6639A30A5-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51328/b18ada56-5d50-ec5a-1d3f-d0798c552b3e.png">

## 設定方法
以下、各OSでの設定方法をまとめておきます。OSのバージョンや、Androidだと端末が異なると設定方法も変わるので、環境が違う場合は自身の環境に合わせて調べて見てくださいね。

### iOS (iPhone XR / 13.3.1)
|設定アプリTop|コントロールセンター|カスタマイズ|
|---|---|---|
|![IMG_0244.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51328/a229dd6b-528e-4766-0f9b-c088abe0879a.png)|![IMG_0245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51328/b6bea999-32ea-6211-6f7c-5cb5ef73f575.png)|![IMG_0246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51328/2306785b-d37a-91df-2c8b-6d55d8e452be.png)|

### Android (Pixel 4 XL / Andriod 10)
|クイック設定パネル|カスタマイズ|
|---|---|
|![Screenshot_20200220-115239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51328/451e6d2c-9987-acd6-2f6a-893abbd83528.png)|![Screenshot_20200220-115329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51328/45a5a4f8-7559-3779-7b3d-5a9010382c7e.png)|
DataCore Installation Manager vSphere(DIM-V)をやり直す時

DIM-Vを最初からやり直したいときの環境の最低限のクリーンナップ（ロールバック）。


うちの環境専用


```
Connect-VIServer
#データセンターのカスタム属性を消す
Get-CustomAttribute | where Name -match DATACORE | Remove-CustomAttribute
#データコアサーバーをシャットダウンして削除
Get-VM | where Name -match "HVSAN" | Stop-VMGuest | Remove-VM -DeletePermanently
#iSCSIの動的検出、静的検出を全部削除
Get-VMHostHba -Type IScsi |Get-IScsiHbaTarget|Remove-IScsiHbaTarget
#iSCSI用VMKを削除
##関係ない"10.10.107.31"がいるのでこの環境固有の演算が入っています。
Get-VMHost | where Name -notmatch "10.10.107.31" | Get-VMHostNetwork | ForEach-Object{$_.VirtualNic} | where Name -ne "vmk0" | Remove-VMHostNetworkAdapter
#iSCSI用vSwitchを削除
Get-VirtualSwitch | Where-Object { ($_.VMHost -notmatch "10.10.107.31")  -and ($_.Name -notmatch "0")}|Remove-VirtualSwitch
Disconnect-VIServer
```


一般的な新規環境用

```
Connect-VIServer
#データセンターのカスタム属性を消す
Get-CustomAttribute | where Name -match DATACORE | Remove-CustomAttribute
#データコアサーバーをシャットダウンして削除
Get-VM | where Name -match "HVSAN" | Stop-VMGuest | Remove-VM -DeletePermanently
#iSCSIの動的検出、静的検出を全部削除
Get-VMHostHba -Type IScsi |Get-IScsiHbaTarget|Remove-IScsiHbaTarget
#iSCSI用VMKを削除
Get-VMHost | Get-VMHostNetwork | ForEach-Object{$_.VirtualNic} | where Name -ne "vmk0" | Remove-VMHostNetworkAdapter
#iSCSI用vSwitchを削除
Get-VirtualSwitch | where Name -notmatch "vSwitch0" |Remove-VirtualSwitch
Disconnect-VIServer
```
Qiskit 回路のDepthを知りたいとき

## 結論

`qc.depth()`でOK

##参考
- https://github.com/Qiskit/qiskit-terra/blob/master/qiskit/circuit/quantumcircuit.py
- https://github.com/Qiskit/qiskit-terra/blob/master/qiskit/circuit/quantumcircuit.py

## `qiskit.circuit.quantumcircuit module`に`depth()`の関数がある．
他にも`append()`など，便利な関数が色々ある．

## 使用例 
IBM Quantum Experience上で実行した．

###まずは`import`
```python
%matplotlib inline
# Importing standard Qiskit libraries and configuring account
from qiskit import QuantumCircuit, execute, Aer, IBMQ
from qiskit.compiler import transpile, assemble
from qiskit.tools.jupyter import *
from qiskit.visualization import *
# Loading your IBM Q account(s)
provider = IBMQ.load_account()

from qiskit import *
```

###回路の作成

```python
q = QuantumRegister(3)
c = ClassicalRegister(3)
qc = QuantumCircuit(q, c)
#.draw()で回路を表示
qc.draw()
```
<img width="281" alt="ScreenShot 2020-02-20 11.50.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164411/be0e61e0-04dc-da34-fd7a-242ca71c4ce9.png">

`.depth()`でDepthを測定すると

```python
qc.depth()
>>> 0
```

まだ何もつけていないので0になる．

### 回路にHadamard gateを２つ作用させる．

```python
qc.h(q[0])
qc.h(q[0])
qc.draw()
```
<img width="281" alt="ScreenShot 2020-02-20 11.53.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164411/e3290099-d20d-c2bc-2878-b1f139268143.png">

```python
qc.depth()
>>> 2
```
正しい結果が得られる.

### 3つのqubitに同時にHadamard gateを作用させると

```python
q = QuantumRegister(3)
c = ClassicalRegister(3)
qc = QuantumCircuit(q, c)
qc.h(q[0])
qc.h(q[1])
qc.h(q[2])
qc.draw()
```
<img width="281" alt="ScreenShot 2020-02-20 11.56.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164411/99b6985f-04e7-d0dd-b6e1-3407bb9309b6.png">

```
qc.depth()
>>> 1
```
depthは，一回の操作でいくつのqubitを操作するかには無関係．
【Laravel6】外部キー制約で少し詰まった　General error: 3780 Referencing column.....

[初めてのLARAVEL 5.6 : (31) RELATIONSHIPS](https://laravel10.wordpress.com/2015/03/27/%e5%88%9d%e3%82%81%e3%81%a6%e3%81%aelaravel-5-31-relationships/)で、``Userモデル``と ``Articleモデル``を関連付けするのに少し詰まったのでメモ。
外部キー自体の知識については[外部キーについて（MySQL編）]( https://laraweb.net/surrounding/4267/)この記事が分かりやすかった。

``Userモデル``の初期状態は、

```php:xxx_create_users_table.php

$table->bigIncrements('id'); 
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
```

``Articleモデル``の初期状態は、

```php:xxx_create_articles_table.php
$table->bigIncrements('id');
$table->string('title');
$table->text('body');
$table->timestamps();
```

``User`` : ``Article`` = 1 : n の関連付けをするので、``User``は``Article``をたくさん持つ(**hasMany**)、``Article``は1人の``User``に帰属する(**belongsTo**)である。

```php:Article.php

public function user(){
        return $this->belongsTo('App\User');
    }
```

```php:User.php

public function articles()
    {
        return $this->hasMany('App\Article');
    }
```

``Userモデル``と ``Articleモデル``を関連付けるため、``Articleモデル``に **user_id** を追加し、``Userモデル``の **id** と紐づける。
また、紐づけられた``Userモデル``のデータが削除されたら、紐づいている``Articleモデル``のデータも削除するようにする。

```php:xxx_create_articles_table.php
$table->bigIncrements('id');
$table->unsignedInteger('user_id'); //追加
$table->string('title');
$table->text('body');
$table->timestamps();

$table->foreign('user_id') //外部キーの宣言
    ->references('id') //参照先
    ->on('users') //参照テーブル
    ->onDelete('cascade'); //参照テーブルカラムが消えたら同時に消す
```

DBを全てロールバックし、再度全マイグレーションを実行するため、``php artisan migrate:refresh``を実行。

しかし、このままでは以下のようなエラーが出てしまう。
<img width="717" alt="スクリーンショット 2020-02-20 11.36.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/78be41aa-c466-858f-10b0-46f8ee230123.png">


よく見てみると、紐づけられている``Userモデル``の**id**の型は**bigIncrements**、紐づけるために追加した``Articleモデル``の**user_id**の型は**unsignedInteger**となっており、型が違う。

- **bigIncrements** => **BIGINT**を使用した自動増分(*INCREMENT*) ID
- **unsignedInteger** => 符号なし(*UNSIGED*)の**INT**を使用したID

よって、``Articleモデル``の**user_id**の型を**unsignedBigInteger**にすると良い。
migrateする際は、テーブルを捨てて作り直したいので、 ``php artisan migrate:fresh``を実行する。

符号なし(*UNSIGNED*)との型の整合性が気になるが、自動増分(*INCREMENT*)はもともと符号なしだから不整合は起きない！！

初めてのLARAVEL 5.6 は laravel6に対応しておらず、laravel6の``Userモデル``の**id**が**bigint**になっていたからこの問題が起こったのだろうーーー。
【分報】Togglで現在進行中のタスクをGASで取得してSlackに送信する

# 何をやるか
在宅勤務で何してるかわからないってならないために、Slackで分報を始めてみました。

どうせやるなら振り返りがやりやすいようにしたいのでTogglでレコーディングしながら
その内容をSlackに流すようにします。

Slackの分報についてはこちらを
[社内にSlack上での分報を導入しないかと提案してみた](https://qiita.com/tamoryo37/items/79be470ab12358311b95)

Togglはタイムトラッキングツールですが、概要はこちらを見てみてください。
[時間管理が苦手な人にもおすすめ！「Toggl」の使い方まとめ。チームの状況把握にも活用！](https://webkikaku.co.jp/blog/webservices/toggl/)


# 概要
1. Togglにて今やってる事を計測
2. GASからスケジュール機能でToggl APIを利用して現在進行中のタスクを取得
3. Spreadsheetの`Current`シートから前回取得したタスクのIDを比較する
4. 前回と変わってたらSlackのincoming webhookで自分の分報チャンネルに投稿

# 準備
1. TogglからAPIキーを取得
2. Slackから自分の分報チャンネルのincoming webhookのURLを取得
3. 新しくSpreadsheetを作成し `Current` という名前のシートを作成
4. スクリプトエディタを開き、以下のソースコードを貼り、APIキーとWebHookを適時変更
5. タイマーアイコンから適切な時間を選んで`current`を実行

# ソースコード

```javascript

var Toggl = {
  BASIC_AUTH: '【ご自身のAPIキー】:api_token',

  get: function(path){
    var url = 'https://www.toggl.com/api/v8' + path;
    var options = {
      'method' : 'GET',
      'headers': {"Authorization" : "Basic " + Utilities.base64Encode(this.BASIC_AUTH)}
    }
    var response = UrlFetchApp.fetch(url, options);
    return JSON.parse(response);
  },
  getTimeEntries: function(){
    var path = '/time_entries'
    return this.get(path)
  },
  getTimeEntry: function(id) {
    var path = '/time_entries/' + id
    return this.get(path);
  },
  getTimeEntryCurrent: function(id) {
    var path = '/time_entries/current'
    return this.get(path);
  },
  getProject: function(id) {
    var path = '/projects/' + id
    return this.get(path);
  }
}

var Slack = {  
  post: function(message){
    var url = '【ご自身の分報チャンネルのincoming webhookのURL】';
    var options = {
      'method': 'POST',
      'contentType': 'application/json',
      'payload': JSON.stringify({'text': message})
    }
    var response = UrlFetchApp.fetch(url, options);
    return response;
  },
}

function current() {
  var currentSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Current");
  var current = Toggl.getTimeEntryCurrent()['data']
  if (current == null) {
    return
  }

  var currentId = currentSheet.getRange(2, 1).getValue()
  var projectName = current.pid ? Toggl.getProject(current.pid).data.name : "未分類"
  
  if (currentId != current['id']) {
    currentSheet.getRange(2, 1, 1, 2)
      .setValues([[current['id'], current['description']]])
    Slack.post(formatTextCurrent(projectName, current))
  }
}


function formatTextCurrent(projectName, timeEntry) {
  return '【' + projectName + '】 *' + timeEntry.description + '*'
}
```

# 参考にしたQiita
[時間管理ツール【Toggl】を【GAS】と連携して【Slack】に分報を通知してみた。](https://qiita.com/yokozawa0701/items/e4c392bd0afe9902e51d)
SparkSQL で時系列仮想データテーブルを作る関数

## はじめに
タイトル通り、SparkSQL で時系列仮想データテーブルを作る関数です。以下のような方を想定。

- 最近 Spark さわり始めた
- 時系列データで Window 処理をバッチ的に行いたい
- SparkSQL で普通にクエリが書けると聞いたけど、
    - MySQL でのいつものメソッドは使えなさそう
    - PostgreSQL の Generate Series が使えればいいのに

    


## 関数
こんな感じで書きました。開始日、終了日、秒単位のインターバル、テーブルの行名を引数にしています。

```python
def generate_series(day_start, day_end, sec_interval, col_name):
  # day type: str
  # day format: 'yyyy/MM/dd'
  from pyspark.sql.functions import col
  from pyspark.sql import SparkSession
  spark = SparkSession.builder.getOrCreate()
  
  # day_start から day_end までのタイムスタンプ df 作成
  start, stop = spark\
  .createDataFrame([(day_start, day_end)], ("start", "stop"))\
  .select([col(c).cast("timestamp").cast("long") for c in ("start", "stop")])\
  .first()
  
  # 指定したインターバルで select
  calendar_table = spark\
  .range(start, stop, sec_interval)\
  .select(col("id").cast("timestamp")\
  .alias(col_name))
    
  return calendar_table
```

## 使用例

#### 1秒ごと

```python
start_date = '2020/01/01'
end_date = '2020/01/31'

# #1秒毎のテーブル
cal = generate_series(start_date, end_date, 1, 'time_stamp') 
display(cal)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/8cb461d9-80ac-44a2-0ff4-f359b2bc6da1.png)

#### 1時間ごと

```python
start_date = '2020/01/01'
end_date = '2020/01/31'

# #1時間毎のテーブル
cal = generate_series(start_date, end_date, 60*60, 'time_stamp') 
display(cal)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/cbda428b-a5b5-fd2d-fe09-f4a0a89ce2f6.png)



## おわりに
とりあえずは動作しますが、、

- この関数使えば一発じゃん
- こんな非効率なことして…

という方、情報いただけると大変うれしいです。

## 参考リンク
[Spark Programming Guide](https://spark.apache.org/docs/2.2.0/rdd-programming-guide.html)