OmniAICreator/Qiita-1.07M huggingface dataset:
Github ActionsでCDK diff走らせると永遠に失敗する

# なんか失敗する

![コメント 2020-05-14 112617.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116428/77184b8e-5aca-0fc3-96ac-400e327ad2b7.jpeg)

# どうして

終了コードが1だからじゃないですかね

とっくにISSUE上がってクローズされてましたね
https://github.com/aws/aws-cdk/issues/5885

# 解決方法

### コマンドにオプション付ける

差分があるときエラーになって欲しいケースの方が多くて、GithubActionsだけ0になってほしい人はこれ

```bash
cdk diff -c aws-cdk:enableDiffNoFail=true
```

### cdk.jsonに書く

永遠に0しか出すなって人はこれ
今使ってるcdk.jsonに`context`を追記すると終了コード0がデフォルトになる

```json
{
    "app": "python3 app.py",
    "context": {
      "aws-cdk:enableDiffNoFail": "true"
    }
}
```
Zabbix 5.0 LTS Docker版 起動からログインまで

# 概要

[Zabbix 5.0紹介ページ](https://www.zabbix.com/jp/whats_new_5_0)

**大項目だけ（Home Pageより）**

- 新しいプラットフォームとクラウド対応
- SAML認証を利用したシングルサインオン(SSO)
- より安全で信頼性の高い監視
- 機密情報の保護
- スケーラビリティとパフォーマンス
- 次世代のZabbixエージェントを公式サポート
- 監視設定と設定管理をより容易に
- より柔軟な監視機能と監視設定
- 自動監視設定とローレベルディスカバリの改善
- Webインターフェースの改善
- ITSMシステムとの統合
- 障害通知とサービスの連携
- テンプレートとプラグインの追加と改善

# Docker版 起動からログインまで

## 使用するコンテナ

zabbix-appliance
[Docker Hub](https://hub.docker.com/r/zabbix/zabbix-appliance)

全部入りのコンテナです

- MySQL database server
- Zabbix server
- Zabbix Java Gateway
- Zabbix frontend based on Nginx web-server

他のコンテナの場合は組み合わせて使用します。
例えば

- mysql-serverコンテナ
- zabbix-java-gatewayコンテナ
- zabbix-server-mysqlコンテナ
- zabbix-web-nginx-mysqlコンテナ

Docker Hubだけだと分かりづらいのですが、下記ドキュメントに記載されております。
[Zabbix Documentation 5.0 5 Installation from containers](https://www.zabbix.com/documentation/current/manual/installation/containers)

## Pull

```shell
docker pull zabbix/zabbix-appliance
```

## 起動

```shell
docker run --name zabbix-appliance -t -p 10051:10051 -p 80:80 -d zabbix/zabbix-appliance
```

## ログイン画面

http://localhost

![alt](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/05/Zabbix_5_01.png)

## ログイン

初期ユーザとパスワード
Admin
zabbix

![alt](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/05/Zabbix_5_02.png)

## 日本語

User ProfileのLanguageをjpに変更

![alt](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/05/Zabbix_5_03.png)

![alt](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/05/Zabbix_5_04.png)
matplotlibによるグラフ描画方法

```python

import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'IPAexGothic'
plt.figure(figsize=(1.5, 1.5))

fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(1, 1, 1)

#散布図
plt.scatter(x, y)

#ヒストグラム
plt.hist(y, bins=5)

#棒グラフ
plt.bar(x, y)

#折れ線グラフ
plt.plot(x, y)

#箱ひげ図
plt.boxplot(y)


#xラベルを回転
plt.xticks(rotation= )

#積み上げグラフ
bottom=で指定してやれば良い

#テキストの入力
plt.text(x座標,y座標,文字)
#ここでの座標は、グラフの軸の数値

```

https://qiita.com/katuemon/items/5c4db01997ad9dc343e0
文字化け対策の記事

https://qiita.com/skytomo221/items/8f07734a63a3e7c15860
Jupyter関係
Railsでgoogleapisを使い、gmailでメール送信

# 事前準備

https://developers.google.com/gmail/api/quickstart/ruby
とりあえずこの通りにして、ラベルが表示されるまでやってみる


# スコープの変更
サンプルコードだとreadonlyだけなので、メール送信出来るように[スコープを変える][1]

```rb
SCOPE = Google::Apis::GmailV1::AUTH_GMAIL_READONLY
```

```rb
SCOPE = [
  Google::Apis::GmailV1::AUTH_GMAIL_READONLY,
  Google::Apis::GmailV1::AUTH_GMAIL_SEND
]
```

\* ただメールを送るだけなら`AUTH_GMAIL_READONLY`は要らないが、後に説明するプロファイルの参照時に[必要][2]

既に出来上がっているtoken.ymlはスコープが最初のままなので、このファイルを消す

# メールの作成

メールは素のテキストで書くか、何らかのライブラリを使って組み立てるかする。
APIとしては[Base64でエンコードしたもの][3]を渡す必要があるが、`google/apis/gmail_v1`で[勝手にやってくれる][4]ので、素のテキストのままで渡せば問題ない。



```rb
# Railsに標準で入っている[mail gem][5]
mail = Mail.new do
  from    "from@domain.local" # credentialsを取ったgmailのアカウントから送るなら、多分必要ない get_user_profile("me") で確定するっぽい
  to      "to@domain.local"
  subject "test"
  body    "body"
end

message_object = Google::Apis::GmailV1::Message.new
message_object.raw = mail.to_s

GoogleApi.gmail_service.send_user_message("me", message_object)

```

# 自分のメールアドレスを[動的に取る][6]
fromアドレスをハードコードしたくない場合

```rb
response = GoogleApi.gmail_service.get_user_profile("me")
data = { "from" => response.email_address }
Rails.root.join("tmp/gmail_profile.yml").write YAML.dump(data)
```

[1]: https://developers.google.com/gmail/api/auth/scopes
[2]: https://developers.google.com/gmail/api/v1/reference/users/getProfile
[3]: https://developers.google.com/gmail/api/v1/reference/users/messages/send
[4]: https://github.com/googleapis/google-api-ruby-client/blob/0.39.2/generated/google/apis/gmail_v1/classes.rb#L996
[5]: https://github.com/mikel/mail
[6]: https://developers.google.com/gmail/api/v1/reference/users/getProfile
【丁寧解説】Slackでワークスペースを作成してチームのメンバーを追加する方法

#1.用語解説

[Slack はじめてガイド](https://slack.com/intl/ja-jp/help/articles/115004071768-Slack-%E3%81%A3%E3%81%A6%E4%BD%95%EF%BC%9F-)より

### Slackとは

>チームのメンバーが連携しながらシームレスに仕事を進める場。それがメールに代わるビジネスコラボレーションハブの「Slack」です。Slack はメンバーが自然に集まり一緒に働くスタイルをサポートするために設計されたソリューションで、対面しながらの作業と同じくらい効率的に、オンラインでコラボレーションを進められるようになります。

### ワークスペースとは
>Slack ワークスペースは、チャンネルで構成されるハブです。チームのメンバーはここでお互いにやり取りしながら仕事を進めていきます。以下では、Slack の主な機能について紹介しています。

### チャンネルとは
>Slack では、チームの仕事もコミュニケーションもチャンネル上で行います。チャンネルは、メッセージ、ツール、ファイルを一つに集めてチームで共有する場所です。

## 2.Slack無料プランでできること
[参照元](https://slack.com/intl/ja-jp/help/articles/115002422943-Slack-フリープランでのメッセージ、ファイルやアプリの制限)

- **メッセージの表示**
閲覧と検索の範囲が、直近のメッセージ 10,000 件に制限されます。

- **ファイルのストレージ**
ワークスペースに最大 5 GB のファイルを追加できます。

- **アプリ**
インストールできる サードパーティ製アプリやカスタムアプリ は最大 10 件です。

## 3.Slackでワークスペースを作成してチームのメンバーを追加する方法

### [Slackワークスペースを作成する]にいき「Slackをはじめる」ボタンを押下する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/54e11afe-206b-cb0e-3e98-38347a0c8a37.png)

### 「Slackワークスペースを作成する」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/fdf3e682-0014-2ff6-bfaa-92a09ad72652.png)

### メールアドレスを入力し「確認する」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/7995bfaa-4b14-45c9-2c14-31fb8b85b841.png)

### メールアドレスに届いた6桁の番号を入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/4f8f22a4-c9dd-f7bc-ab24-1d3c41a6f183.png)

### 社名またはチーム名を入力し「次へ」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/28759f2a-eaf7-9c9d-f852-a37a9190f903.png)

### 今チームで取り組んでいるプロジェクト名を入力し「次へ」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/67eab8c4-bddb-2758-05c7-e49059465bfb.png)

### こちらは後でも追加できるので後でを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/5aea35e3-107a-3a60-8689-dcb6ec2a12cc.png)

### 「Slackでチャンネルを表示する」ボタンを押下する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/9b5251df-5bde-1cec-8f83-5c253d19e998.png)

### ワークスペース内で下図のようにメンバーを招待することができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/ab6ab693-5bcf-cbb0-0879-7946627fa6c8.png)


## 改訂履歴

- 2020/5/14 新規作成
テスト駆動開発とは？ 2

#はじめに
「テスト駆動開発」という言葉を教えて頂く機会があったので、調べてみました。
様々な記事を参考に、自分なりの解釈・言葉に置き換えました。
間違った認識をしていましたら、ご教授頂けますと幸いです。

前回記事　→　[テスト駆動開発とは？ 1](https://qiita.com/raigakun/items/915fb47424a30c46e900)


## テスト駆動開発(TDD)の流れ
- 「レッド」　→　「グリーン」　→　「リファクタリング」　のサイクルを繰り返す。

*~心の声~*
*特撮系の発進前みたいだ😄（伝わりにくいかも）*
*それぞれの役割は何？*


### 「 レッド 」　さん　いっきま〜す！

**「必ず失敗するテストコード」から書き出す。**
なかなかのパワーワードですが、以下理由です。

- [テスト駆動開発とは？ 1](https://qiita.com/raigakun/items/915fb47424a30c46e900) でも触れたとおり、TDDは**テストファースト**です。
- 実装したい機能を実現するコードが書かれていない場合でも、まずはその機能のテストコードから先に書くということが基本。
- そして、機能を実現するコードを書いていない状態で、テストツールを使い、テストが失敗すると**赤色**でエラー表示されるので、**「レッド」**と呼ばれます。
- また、書いたテストコードは実行して失敗することも確かめています。

この段階では、実装したい機能の要件を**適切な粒度**に分けて、リストアップしておくことが重要のようです！


### 「 グリーン 」　さん　お願いします！

**「最小限・最低限のパスするテストコード」を書く。**

- テストをパスするコードを書く段階ですが、**完璧なコードは必要ない。**
- 「レッド」と「グリーン」の段階を何度か繰り返しごとに、徐々にロジックを追加していく。


### 「 リファクタリング 」　さん　やっと出番です！

**「テストをパスしたコード」を 綺麗 にする。**

- 全てのテストをパスしたコードの可読性を上げるのです。
- テスト対象とするプログラムコードの規模が小さいうちに行うのがbetter
- 「グリーン」の段階で、「テストをクリアしているから、リファるのは後ででいいや〜」としてしまうと・・・
- プログラムの規模が大きくなるにつれて修正負担が増え、手がつけられなくなります。怖い・・・

**ざっくりとこんな流れです！**

## 注意点

- テスト実行時間はなるべく短く！（毎回長いと開発期間がえらいことに・・・）
- 各テストに依存関係は持たせない。（1つ修正すると依存先も修正するという辛い目にあいそう・・・）


#さいごに
やっぱり新しいことを学ぶのは楽しいですね！
簡易アプリを作るときにTDDでやってみようと思えました！ぜひ初学者の皆さんも！

日々勉強中ですので、随時更新します。ご覧いただきありがとうございました！
EC2のhost名でSSM経由なSSH接続をしたい

AWS SSMって便利ですよね
SSHのポートを開ける必要無し・踏み台不要でec2に接続できるという神ツールです

_SSMの手順についてはAWSのドキュメント([Session Managerの開始方法](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started.html))・他の方が書かれているのでそちらを見てください


ですが、個人的に１点不満が・・・
**Instance IDを指定しないといけない！**

```profile:.ssh/config
Host i-*
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```
上の設定だとInstanceIDをawscliで確認して・・・と、かなりメンドクセ

host名で接続できるようにするために以下のように書くというのもできますが、

```profile:.ssh/config
Host dev01
  HostName i-xxxxxxxxxxxxxxxxx
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

Host web01
  HostName i-xxxxxxxxxxxxxxxxx
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```
インスタンスが増えた or インスタンスを作り直したら `.ssh/config` を修正と正直これもメンドクセ

そこで、ssmのコマンドのwrapperを作成しました
コードはこんな感じ

```python:ssm_proxy.py
#!/usr/bin/python

import sys
import subprocess
import argparse

from boto3.session import Session


def start_session(profile, hostname, port):
    session = Session(profile_name = profile)
    client = session.client('ec2')
    try:
        response = client.describe_instances(
            Filters = [
                {
                    'Name':   'tag:Name',
                    'Values': [hostname]
                }
            ]
        )
    except:
        return

    subprocess.call([
        'aws',
        '--profile',
        profile,
        'ssm',
        'start-session',
        '--target',
        response['Reservations'][0]['Instances'][0]['InstanceId'],
        '--document-name',
        'AWS-StartSSHSession',
        '--parameters',
        'portNumber={0}'.format(port),
    ])


def main():
    parser = argparse.ArgumentParser(
        formatter_class = argparse.RawTextHelpFormatter
    )
    parser.add_argument('--profile')
    parser.add_argument('--host')
    parser.add_argument('--port')
    args = parser.parse_args()

    start_session(args.profile, args.host, args.port)

    sys.exit(0)


if __name__ == '__main__':
    main()
```

tagのNameとしてhost名を設定しておき、tagからInstanceIDを取得してawscliでssmのsessionを開始するという単純なものです
これを `.ssh/config` のProxyCommandとして設定します

```profile:.ssh/config
Host *
  ProxyCommand sh -c "ssm_proxy.py --host %h --port %p"
```

実際には複数アカウントがあるのでhost名のprefixに各profileの名前を付けて置き、下のように設定しています

```profile:.ssh/config
Host yzrh-*
  ProxyCommand sh -c "ssm_proxy.py --profile yuzuriha --host %h --port %p"

Host acc1-*
  ProxyCommand sh -c "ssm_proxy.py --profile account1 --host %h --port %p"
```

最初に `describe_instances` を実行するのでsshが接続されるまで若干遅いですが、今までのメンドクサさからすると許容範囲かな・・・
Postgreのシーケンス値リセット

`select setval('XXX_id_seq', (select coalesce(max(id), 0) + 1 from XXX), false)`

```PostgreSeqReset.java
public class PostgreSeqReset {
    private static final String[] TABLES = {
            "user_master",
            "company_master"
    };

    public static void main(String[] args) {
        String[] seqs = new String[TABLES.length];
        int maxTableLen = 0;
        int maxSeqLen = 0;
        for (int i = 0; i < TABLES.length; i++) {
            seqs[i] = TABLES[i] + "_id_seq";
            maxTableLen = TABLES[i].length() > maxTableLen ? TABLES[i].length() : maxTableLen;
            maxSeqLen = seqs[i].length() > maxSeqLen ? seqs[i].length() : maxSeqLen;
        }

        System.out.println("select");
        for (int i = 0; i < seqs.length; i++) {
            System.out.printf("  setval('%s',%" + (maxSeqLen - seqs[i].length() + 1) + "s(select coalesce(max(id), 0) + 1 from %s),%" + (maxTableLen - TABLES[i].length() + 1) + "sfalse)%s%n",
                    seqs[i], "", TABLES[i], "", i + 1 < seqs.length ? "," : ";");
        }
    }
}
```

```
select
  setval('user_master_id_seq',    (select coalesce(max(id), 0) + 1 from user_master),    false),
  setval('company_master_id_seq', (select coalesce(max(id), 0) + 1 from company_master), false);
```
【超初心者向け】github-pagesで公開したSPAサイト、アプリの更新方法

##はじめに

この記事はReactで制作したSPAサイトをgithub-pagesに初めて公開した超初心者向けの記事になっています。

github-pagesの公開までは、React公式の[こちら](https://create-react-app.dev/docs/deployment/#github-pages "create react app")の手順通りに進めていけば出来ます。

問題は、**公開後**です。いざ公開したら修正箇所が見つかることはよくあると思います。というより、そういうことだらけです。そんな時に慌てて修正しても更新方法がわかっていなければどうしようもありません。

公開までは丁寧に解説する記事があっても、更新する方法の記事が全然載っていなかったのでここに記します。

##更新する

結論から先に言うと、

```
npm run deploy
```


これでOKです。

エディタ上で修正して、保存したら、公開時最後に行ったnpmコマンドを再度実行することで公開したサイトも更新されます。

こんな単純なことなので、誰も記事にしないわけですね。

※　私がここでつまった言い訳として、github-pagesでのサイト公開前にFirebase Hostingを用いてアプリを公開・更新していたので、頭の中でごちゃまぜになった結果長時間悩むことになりました。ちなみにReactとFirebase Hostingでの更新は、

```
npm run build
```

の後に、

```
firebase deploy
```

です。

このbuild、deployのコマンド実行場所を各サービスで使い分けることを意識しておかないと私のように時間を浪費してしまうので要注意です。

##少し時間をおく

更新方法は上記方法で大丈夫なはずですが、それでも更新されない時があるかもしれません。そんな時に一番シンプルな方法は**少し時間をおくこと**です。

更新しても反映までに時間がかかることがあるので、10分程度何も触らずに待ってからもう一度公開されたサイトのリンクへ飛んでみてください。意外とこれで解決することもあります。

修正箇所がある場合、たいてい急いで更新が反映されるのを確認したくなりがちで、上手く反映されていないとまた修正してすぐに確認してと負のループに陥ることがあります。その結果、本当は最初の修正で上手くいっていたのに、無駄に時間を使ってしまうことになりかねないです。なので、**待ちましょう**。

ただし、もし30分以上待ったのに何も更新されていない場合、それはgithub側の問題ではなくあなた自身の問題（記述ミス、コマンドミス、修正箇所の誤り）の可能性が高いです。今一度コードを見直しましょう。

##終わりに

はじめにで言った通り、超初心者向けの解決策です。ですが、初心者は本当に単純な見落としでつまづいて、時間を浪費してしまうものなのです。そう言った人達と自分のために、この記事を残します。少しでも役に立てたなら幸いです。
Kubernetes基礎(1)：Why Kubernetes

#Kubernetes Introduction
###1. Kubernetes関心度
最近5年間の傾向をみるとKubernetesの関心度が高まっていることがわかります。
<img width="770" alt="kubernetes_trand.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/74ecd27b-9830-df06-6294-4ff7bef7206c.png">

###2. Kubernetes History
企業がKubernetesに注目している理由は、システムリソースを効率的に使う（＝コスト削減）ことができるからです。
Kubernetesをもっとよく理解するには、仮想化技術の歴史を把握する必要があります。
<img width="960" alt="kubernetes_history.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/3f384149-05ac-5790-7a28-db7a0e8843c2.png">

<b>Linux(1991年)：resource compartment（資源隔離）</b>
　Linuxのリソースを隔離して、プロセスが独立した環境で実行可能にする技術はありましたが、使うのにはハドルが高かったのです。
<b>VM(2010年)：仮想化技術</b>
　複数の企業が仮想化技術を利用して、独自の運用環境の自動化には成功したが、システム性能は良くなりませんでした。
　最も大きな原因は仮想化をするために、重いOS（Guest）を起動することが原因でした。
<b>Container(2014年～2015年)：Container仮想化技術</b>
　dotCloudという会社がLinuxの資源隔離技術をContainerという概念で簡単に使用できるようにしました。
　会社名をDockerに変えて、この技術をOpen sourceとして公開しました。
　Container仮想化技術は、サービス間でリソースを分離するが、別途OSを稼働する必要がないため、高速で
　資源活用効率も非常によい技術です。
　Dockerは、単一のサービスをContainerに仮想化させて配置をするもので、多数のサービスを運営する際に、
　それをいちいち配布して運営するものではない。
　多数のサービスを管理してくれるContainer Orchestrationというものがあります。
　複数Containerを管理してくれるソリューションです。
<b>Kubernetes</b>
　DockerのContainer技術がオープンソースであるため、多くの企業が各自のContainer Orchestratorを
　発表することになりました。
　KubernetesはGoogleで主導したが、そのプロジェクトに複数の企業が参加して多様なKnow-Howが
　詰め込められていることで、多くの企業はKubernetesを使った後の満足度が非常に高かったのです。
　Kubernetesへの関心は、他のContainer Orchestratorに比べ飛躍的に増加することになりました。



ITにおける標準という概念はある機関に認められて獲得するものではなく、最も使われているものが標準だと思います。
現在Kubernetesがサービスの展開の標準になりつつあり、この技術を基に、多くのクラウドサービスを提供する企業はKubernetes環境がインストールされているInfrastructureをサービスしています。


#Why Kubernetes
<img width="960" alt="why_kubernetes.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/f8bf15f6-5045-015a-a216-cf314c3e669e.png">
<b>As-is</b>
　A、B、Cそれぞれのサービスを提供するためには9つのサーバーが必要になります。
　さらにサーバー障害等のことを考えると、BackUpとしても3つのサーバーが必要になります。	
<b>To-be</b>
　A、B、Cの平均リソースを計算すると1日4つのサーバーと障害対応1つのサーバーが必要になります。
　・Auto Scaling：trafficの状況によって自動にサービスにリソースを割り当ててくれる。
　・Auto Healing：障害を起こしたサーバー上のサービスを自動に他のサーバーに移行してくれる。

Kubernetesは運用の自動化をサポートしています。
Kubernetesを使うと運用環境のメインテナンスが簡単にできるので、サービスの効率がよくなります。
サービスの効率向上のため、サーバーが少なくなるとメインテナンス費用の削減になり、大規模の運用環境こそ効果が多くなるので多くの企業がKubernetes環境への移行に興味を持ち始めています。
フリーランスエンジニアになるのに必要な情報


## 目的

フリーになった場合に支払うべきもの、デメリットは何かを確認する
特に年金周りはきになる




社会人は支払うべきもの
https://www.re-ism.jp/reismstyle/okane/okane008/

https://biz.moneyforward.com/blog/12349/


- 所得税
 => 所得に応じて増える

http://tool.yurikago.net/321/kaikei-hiroba/

- 健康保険料
=> 病院に行くときに安くなる

- 厚生年金保険料   => 国民年金
=> 年金

厚生年金　国民年金の違い
https://airregi.jp/magazine/guide/1194/


- 雇用保険
=>  失業補償などのやつか
- 住民税
=> 住む地域に使われるのか

https://money.rakuten.co.jp/woman/article/2019/article_0485/
Chartkickで入力していない日付の表示をしたくない

#今回実装したいこと
Chartkickで入力していない日付の表示をしたくない。
以下のように入力していない日付のX軸の表示を消したい。

![スクリーンショット 2020-05-14 10.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626160/5926dc44-2d39-6da4-6716-e93e7803344e.png)


#結論

discrete: trueを追加する。

↓変更前

```ruby
<%= line_chart @data, xtitle: "Day", ytitle: "Number", curve: false %>
```

↓変更後

```ruby
<%= line_chart @data, xtitle: "Day", ytitle: "Number", curve: false %>
```

↓解決

![スクリーンショット 2020-05-14 10.58.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626160/fb4109c2-14d3-9261-2969-6639258688d0.png)
pod installで「No `Podfile' found in the project directory.」エラーが出る

Podfileもちゃんとしてるのになんで〜〜！？！？！？！？？！？！？！
とお悩みのあなた…

パスの中に全角の記号が入っていませんか…

<img width="361" alt="install失敗.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95144/4aeb8ee1-f770-4fdd-bd4a-8aaae6512045.png">

以下がだめなやつ
`￥（）｛｝％＃＄＆！＝｀＠＋＜＞？＿；：`

フォルダには日本語は使わないでおこう！
都市伝説 3階層セレクトアーキテクチャ

# はじまり
業務の中で1つのトランザクションデータを複数に分割されているテーブル構成があり、3階層セレクトというアーキテクチャがあるそうなので調べてみた。

# 結果
そのようなアーキテクチャはない…？

# 説明を受けたアーキテクチャ構成
受注テーブルがあったとして、テーブル名を受注としたとき、以下の3つのテーブルに分割する。

* 受注R
* 受注S
* 受注W

それぞれのアルファベットと意味は以下を表す。

|アルファベット |英語表記        |用途            |
|--------------|---------------|----------------|
|R|Real|直近データの保持に使用
|S|Stock|ちょっと古いデータの保持に使用|
|W|Warehouse|古いデータの保持に使用|

この構成をとることにより、直近データを全表走査しても高速に対象データを取り出すことができ、かつ古いデータを結果から省くことが出来る。

# 足を引っ張るだけのような…？
この構想には以下の問題があると考えます。

* 保持期間(直近、ちょっと古い、古い)の判断基準
* 保持期間の判断基準がデータの用途によって異なる
* 保持期間ごとにどのテーブルへのクエリなのかアプリケーション側で判断する必要性が増える
* 同様にバッチ処理などで保持期間ごとの適切なテーブルへのデータ移行の必要性が増える

かなり現実的ではないことだらけのような気がします。

#解決策
日付などの基準でパーティションテーブルを使ったほうがいいと思います。
まさにパーティションテーブルの得意分野！という感じがします。
パーティショニングの運用は追加されますが、全表操作しても範囲を限定できますし、テーブルとしては1つになるので保持期間の概念の考慮がシンプルになります。

#最後に
この説明を受けた際に「3階層セレクトアーキテクチャをご存知ないんですか？ｗ」と嘲笑されるように指摘され、結構カチンときました。
ですが、私がDB2を知らないだけで、これが常識かも知れません。
また、DB2のバージョンが古いためパーティションテーブルなどがなく、プロジェクトとしてこのようなアーキテクチャを設計し、採用したのかもしれません。

「常識」ってやつはほんとに厄介なやつです。
AWSのEC2(CentOS 7)でTimezoneの変更でミスった・・・

# 事象
CentOS7なEC2のサーバ上のPHPで、TimeZoneにUTCを指定して時刻を取得したのにJSTな時刻が取得された。

なお、OSのタイムゾーンは一応JSTです。

# 原因
タイムゾーンがおかしなことになってました。

```
 $ timedatectl

      Local time: Wed 2020-05-13 14:14:59 JST
  Universal time: Wed 2020-05-13 05:14:59 UTC
        RTC time: Wed 2020-05-13 05:13:52
       Time zone: UTC (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```
って感じで、TimezoneがUTC (JST, +0900)と不思議な値になってました。

# どうしてこうなった
EC2は初期ではタイムゾーンがUTCになってます。
これをJSTに変更する方法はぐぐるといっぱい出てきますが、大きく2種類出てきます。

1. /etc/localtimeを変更する方法
2. timedatectlを使う方法

CentOS7の場合は、「timedatectlを使う方法」なんですが、「/etc/localtimeを変更する方法」をやってしまいました。

## やったこと
1. sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
2. vi /etc/sysconfig/clock →　そんなファイルないぞ？
ここで気づくべきでした(まぁ、ここできづいても遅いんですが・・・)

しかし、２をやらすにとりあえず、dateしてみると、JSTになってるからまぁいいかってことでタイムゾーンの変更完了！ってしちゃいました。

## なにが起きたのか
実は、 /ect/localtime が /usr/share/zoneinfo/UTC のシンボリックリンクになってました。

つまり、
```
sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
```
で/usr/share/zoneinfo/UTCが/usr/share/zoneinfo/Japanで上書きされてしまいました。
結果、UTCの内容がJSTで+0900になってしまったということでした。

さらに、UCTとかUniversalとかZuluとかがUTCのハードリンクだったらしく、これらもJSTになっちゃってました・・・
【初級編】JavaScript　if文について

## 📗 if文

まずJavaScriptのif文の基本形を知りましょう♪

```javascript
if(条件){
　条件が真なら実行
}
```
ifとは日本語で　もし　という訳をされます。
***"もし条件が正しければ実行する"***という感じの認識でいていただければOKです。

では試しに、***もしheightが180なら、身長は180ｃｍです***という文章が出力されるコードを書いてみます。

```javascript
const height = 180;

if (height == 180){
  console.log('身長は'+ height + 'cmです。');
}
```
これで、コンソール上には、身長は180cmです。と出力されると思います。
楽勝ですね！
## 📗 【余談というか補足】

ちょっと話はそれますが、***上記はあまり推奨されない記入例となっています。***
どの部分かわかりますか？
正解は***条件の部分***にあります。
==　←この部分ですね。解説していきます。


```javascript
const height = 180;

if (height == 180){
  console.log('身長は'+ height + 'cmです。');
}
//　==　この記載は、文字と数値を識別せずに値が一致していれば。tureを返します。どういうことかと言うと

const height = '180';  //string型
このように記載してもtureを返してしまうのです。
// 非常に気づきにくいバグを仕込んでしまうことがあるので、このように書くことは推奨されていません
//ではどうしたら良いのでしょうか？

if(height === 180){　//省略

このように,===　とすることで　型と値が一致したらtureを返すといったようになります。
//つまり、上記の条件だったとすると

const height = 180 ; //こっちなら型と値が一致しているので、console.logに出力される
const height = '180' //条件はnumber型の180を求めるのに対して、値はstring型の180となり、条件に反しているのでプログラムは実行されません。
```

ですので、基本的に条件が一致したらとする時は ===　このように書くと良いかと思います。
## 📗 条件分岐【else,else if ,if文のネスト】
これまでは、条件が一致したら出力するというようなコードを書きましたが、
一致したら条件１を出力、一致しなければ条件２を出力といったような書き方をするにはどうすればよいでしょうか？
こちらは ***else***という物を使います。

```javascript
基本形
if(条件){
//tureだったときの処理
}else{
false(偽)だったら実行
}
//このように、if文のあとにelseと書いて値が違ったら実行するコードをかけばいいです。

const height = 180;

if (height === 180){
  console.log('身長は'+ height + 'cmです。');
}else{       //条件が一致してなかったら。
  console.log('身長は'+height+'cmではありません'); //この処理を行う。
}
```
このような形になります。elseはそうでなければこうする！みたいなイメージを持つと良いかもしれません。

####複数の条件をつけたい場合【else if】
コレまでは真か偽かの２択でしたが、この条件、あるいはこの条件、そうでなければこの条件のように何パターンか条件を用意したいことが出てくると思います。
そんなときは***else if***を使用します。感覚としては、***あるいは〜***という感じでOKかと思います。
実際にコードを書いてみましょう。

```javascript

基本形
if(条件){
//tureだったときの処理
}else if (新しい条件){
 //新しい条件がtureだったら実行
} else{
//false　だったら実行
}
実際にコードで見てみましょう。

const coler = 'red'

if (color === 'red'){
 console.log('赤りんごです');
}else if (color === 'green'){
 console.log('青りんごです');
}else{
 console.log('やばいりんごです');
}
```
上記のコードであれば、redと打ち込まれれば、赤りんごです、greenと打ち込まれれば　青りんごですと返し。
その他は　やばいりんごです　といったように値が帰ってきます。
非常に簡単なコードですね。
####if文のネスト
また、if文の中にif文を作ることも出来ます。それをネストといいます。
コードで書くとこのようになります。

```javascript
const color = 'red'
const size = 'small'

if (color === 'red'){
  if( size ==='small'){
    console.log('そりゃイチゴです。');
 }
} 
```
２つの条件が一致したらそりゃイチゴです　と出力されます。
しかし、このネストはどんどん重ねていくたびに条件が複雑になり、読み手がわかりにくいコードになっていくので
できるだけシンプルに書くことが推奨されます。
またelse ifも同様に増えれば増えるだけ分かりにくくなりますので出来るだけシンプルにif文で書くとよいです。

長くなるので、パート１はこの辺で終了したいと思います！　

## 📗 【まとめ】
- if文は　条件が　真　なら実行
- 条件外なら else　条件を追加するなら else if
- 一致の条件をつけるなら ==　ではなく　===　で書くと型も判別できる！
- if文はネストできる!

## 📗 【次回予告】

if文パート２になります！


***記事を見ていただいてありがとうございます。
ご指摘有りましたら編集リクエストまでドシドシお願いいたします!***
WordPressの公式にあるdocker-entrypoint.shが読めなかった->なんとか読めるようになるまで

## Shell ゼンゼン ヨメナイ
Docker-composeがうまくいかないときに、「とりあえずdocker-entrypoint.shでも読んでみるかー」と思ったけど、全然読めなかった。なんやこれ。

https://github.com/docker-library/wordpress/tree/master/php7.4/cli

```shell:docker-entrypoint.sh
#!/bin/sh
set -euo pipefail

# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
	set -- wp "$@"
fi

# if our command is a valid wp-cli subcommand, let's invoke it through wp-cli instead
# (this allows for "docker run wordpress:cli help", etc)
if wp --path=/dev/null help "$1" > /dev/null 2>&1; then
	set -- wp "$@"
fi

exec "$@"
```
特にわからなかったところをメモで残す。

```
set -euo pipefail
```

setでshellのオプションを色々設定しているらしい
[参考]https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d

eオプションはエラーが発生したら中断
uオプションは未定義の変数をエラーにするもの
oオプションはpipefailとセットで使っていて、パイプの左側のコマンドが死んだときに止まってくれるというもの
https://qiita.com/progrhyme/items/6e522d83de3c94aadec9

```
if [ "${1#-}" != "$1" ]; then
	set -- wp "$@"
fi
```
これが全然わからなかったので実際に手元で動かして見ると以下のようなことがわかった。
`${1#-}`は引数の1番目の文字からハイフンを一つ取り除いたもの。例えば`. hoge.sh -a test`と実行したら`${1#-}`はaを返す。

なのでif文の意味は「ハイフンが付いていたら」という意味になる。わかりづれぇ。

```
set -- wp "$@"
```
これも全然わからなかった。
[参考]https://yash.osdn.jp/doc/ja/_set.html
>Set コマンドにオペランドが与えられている場合またはオプションとオペランドを区切るハイフン二つ (--, コマンドの引数の構文参照) がコマンドライン引数に入っている場合は、現在の​位置パラメータは削除され、与えられたオペランドがそれぞれ新しく位置パラメータになります。ハイフン二つが与えられていてかつオペランドがない場合は位置パラメータはなくなります。

この文章を5分くらい見つめてようやく理解した。

つまり`. hoge.sh -a test`を実行すると`$@`は`-a test`となるが、 `set -- wp "$@"`を実行すると`$@`は`wp -a test`となるわけだ。

wpコマンドそのものに対してオプションを与えたい場合を想定していて、その他は普通にDockerfileのCMDコマンドを受け取っているのだな、と理解した。

たったこれだけの話なのに理解するのにものすごい時間を要してしまったので記録として残しておきます。
作成済みのEC2インスタンスにセキュリティグループを追加する

## はじめに
本記事は「割り当て済みのセキュリティグループにルールを追加」ではなく、「割り当てるセキュリティグループを追加」したい場合のメモです。
複数割り当てることは可能とされていますが、現在コンソールからは1つしか設定できません。
下記注記の通り、ルールはできるだけ絞ることを推奨しているようなので注意してください。

> 複数のセキュリティグループをインスタンスに関連付けると、各セキュリティグループのルールが効率的に集約され、1 つのルールセットが作成されます。このルールセットを使用して、アクセスを許可するかどうかを判断します。
注記
複数のセキュリティグループを 1 つのインスタンスに割り当てることができるため、インスタンスには数百単位のルールを適用できます。結果として、インスタンスにアクセスするときに問題が発生する可能性があります。そのため、ルールは可能な限り要約することをお勧めします。
[Linux インスタンスの Amazon EC2 セキュリティグループ \- Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-security-groups.html)

## 追加する方法
AWS CLI を利用すると追加できます。

### 前提
- EC2インスタンスが作成済みであること
- 対象のEC2インスタンスとセキュリティグループがすべて同一のVPC上にあること

### コマンド
```
aws ec2 modify-instance-attribute --instance-id "インスタンスID" --groups "セキュリティグループID1" "セキュリティグループID2" ...
```
※設定を追加ではなく変更するためのコマンドなので、すでに割り当て済みのIDを含めて指定しないと消えます。

### 参考
[modify\-instance\-attribute — AWS CLI 1\.18\.59 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html)
モチベーションをコントロールするために

## 課題

モチベーションが乱高下する。
レビューとかもビビってしまう。

## 解決策

### モチベーションをあげる仕組みを作る

- モチベーション材料
  - youtube サラタメの嫌われる勇気。課題の分離
    - https://www.youtube.com/watch?v=rZBeETz8YSw
  - バイトダンスエンジニアの記事
    - https://type.jp/et/feature/11459
  - 武井壮 自信　イチローも同じ事を言っていた
    - https://www.youtube.com/watch?v=XAOJPvQj4b4

- 努力を可視化する
  - twitter && qiitaでアウトプットする
    - twitterに#opタグをつける
      - opの数をつける  => opを【積み上げ】に変更。おっぱいに見えるから
      - タイトルつける
      - qiitaで連動させれば比較的記事が検索しやすくなるかも
  - オリアプリ作成
    - rials webookを作成する

- 中間地点を明確に
  - 転職ドラフトの年収査定をあげる
  - レバテックフリーランスで現在のマーケット調査を定期的に
  - 独立に必要なモノを明確にする


- 頑張りすぎない為のあえての制限
  - 運動
     - ジョギング10分
     - 軽い筋トレ5分
  - 仕事の時間を決める
     - 平日
         - 会社　振り返りの時間を30分~1時間入れようかな 
         - 21-22,23は業務委託
         - 勉強する時間 朝1時間
     - 土日
         - 業務委託 5時間
         - 勉強 2時間
         - 会社のキャッチアップ1時間づつ

- 作業効率
  - スティッキーズでタスクを管理する
WindowsユーザがMacに入門した時のTIPS集 

大きな話はWeb上に記事がゴロゴロ転がっているので、非常に細かい「痒いところ」をなんとかするために自分がやったことを備忘録代わりにメモる。

# ウィンドウをフルスクリーンではなく最大化する
ウィンドウ最上部をダブルクリックすればいい。
それが厳しい人は、Optionキーを押しながら最大化ボタンを押すことでもできる。
https://aprico-media.com/posts/2774#head-56a55dcc81fc255823f276cf615fe898

# Capslockを別のキーに割り当てる
システム環境設定から キーボード > [キーボード]タブにある[修飾キー] > CapsLock。
個人的に、Commandが死ぬほど打ちにくい位置にあるので、CommandをCapsLockにも割り当てた。（親指で押せ、という人がいるが、親指でも押し辛い。変換までが限界。CapsLockの位置も小指が死にそうになるけれど）

# バックスラッシュを入力する
Windowsでは¥と\を特に区別なく使っていたが、Macでは完全に別の文字になる。
正規表現とかでバックスラッシュ(\)を使いたい時はOption+¥を使う。
https://14code.com/blog/20170810_1282/

# パスバー（Windowsで言うアドレスバー）を表示する。
Finderを開いた状態で表示 > パスバーを表示

# Finderから今いる場所をTerminalで起動
Windowsの場合、アドレスバーにコマンドを打てたので、それと同じことをやりたい。
Finderの上部にある歯車マークから、サービス > 新規ターミナル or 新規ターミナルタブ、でターミナルが開く。
https://qiita.com/yamagh/items/02608e97be22c85cefaa

# Finderでフォルダを上書き保存する方法
Macの場合、単にフォルダをD&Dすると「置き換え」になるらしい。
なのでOptionを押しながらD&Dする。
既存ファイルが全て吹っ飛ぶ可能性すらあるので、事前に知っておいたほうがいい。
http://babyp.blog55.fc2.com/blog-entry-911.html

# キーボードショートカットを覚える
これを見ておく。 https://haniwaman.com/windows-to-mac/
いきなり暗記するのはしんどいので、ブックマークしておいて、ほしいときに都度確認して徐々に慣れる、と言う感じ。

# サッとカレンダーを表示する
Windowsではタスクバーの時計を押せばカレンダーが出てくる。「第3月曜って何日だっけ？」みたいなときに便利だった。
Macではこういう機能が標準ではないっぽい。なのでアプリを入れる。
https://www.outoutput.com/mac-app-monthlycal/
https://weekly.ascii.jp/elem/000/002/620/2620087/

# キーボードで画面をロック
WindowsではCrtl+Lで画面ロックができるので、それと同じことをMacでもやりたい。
Macの場合はCtrl+Command+Qでできる。
が、三つもボタンを押すのはメンドイと感じたので、画面ロックをTouch Barに追加した。
  https://qiita.com/n_sekiya/items/a51102e0ba10fb915c42

# Touchbarに変換候補を出さなくする
パスワードを入力する際に、誤ってかな入力モードでいれてしまうと、画面上では***みたいにマスクされる一方、Touchbarには非常に見易くパスワードを晒してくれるので、心臓に悪い。OFFにする。
https://pc-karuma.net/mac-touch-bar-ime/
【備忘録】ブランチ間の作業を git stash を上手く使ってスムーズに行う。 



#ブランチを切り替えて作業するとき


今やっている作業を中断して、別ブランチで作業したい時。
ブランチを切り替えると、以下のようなエラーが出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580800/fe6ab95b-2049-aef5-3923-92c9be5de7db.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580800/e9050898-cbf4-bff6-60ac-37980f84a2ce.png)


>Please clean your repository working tree before checkout.
「ワークツリーを整理してから別ブランチにcheckoutしてね」

>error: Please commit your changes or stash them before you switch branches.
「ブランチを切り替える前に、変更をcommitするかstashしてね。」


とのこと。

編集内容が確定しておらず、まだcommitしたくない場合は、 `git stash`  を行うことで、変更内容を一時的に保存することができる。
一次保存された内容はこのブランチに格納され、別ブランチには影響を与えない。

これでブランチを切り替えることができ、別ブランチでの作業が可能になる！

再度このブランチに戻り、修正を再開したい場合は `git stash pop` で一時保存した内容を呼び戻すことができる。


#コンフリクトが起こるとき

別ブランチとマージする際に、コンフリクトエラーが起こる時。
`git merge ブランチ名` というコマンドを実行すると、以下のようなエラーが出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580800/e4e77d4f-3832-9eeb-bedf-1c7ac268c7f7.png)


>error: Your local changes to the following files will be overwritten by merge.
「あなたが以下のファイルに加えた変更は、mergeによって上書きされます。」

とのこと。

`git stash`で一時的に自分が加えた差分を待避させることで、別ブランチの差分をマージすることができる。

マージ後に `git stash pop` を行い、コンフリクトを解消することも忘れずに。
SwiftUIでQRコードを表示してみる

# はじめに
QRコードを生成するアプリを作ろうと思い、せっかくなのでSwiftUIで作成しました。

# コードの解説
## QRコードの生成
こちらは、よく検索すると出てくるコードです。いくつか検索していて気付いたのですが、`CIContext().createCGImage()`を実行していないコードがあります。
`outputImage`でciImageが生成されているのでGPUによるレンダリングする必要があるので、長いですが実装が必要なのではないかと思います。

あとハマったのは、謝り訂正レベルを指定するパラメーター"inputCorrectionLevel"には、"L"/"M"/"Q"/"H" いずれかを指定する必要があります。（数字だと思い込んでしまった・・・）

```swift:QRCodeMaker.swift
    func make(message:String , level:Int) -> UIImage? {
        guard let data = message.data(using: .utf8) else { return nil }

        guard let qr = CIFilter(name: "CIQRCodeGenerator", parameters: ["inputMessage": data, "inputCorrectionLevel": getCorrectionText(index: level)]) else { return nil }
        
        let sizeTransform = CGAffineTransform(scaleX: 10, y: 10)
        
        guard let ciImage = qr.outputImage?.transformed(by: sizeTransform) else { return nil }
        
        guard let cgImage = CIContext().createCGImage(ciImage, from: ciImage.extent) else { return nil }
        
        let image = UIImage(cgImage: cgImage)
        
        return image
    }
```

QRコード生成するコードは`QRCodeMaker.swift`として別ファイルに分離しました。

## SwiftUI
基本は、VStackを用いて縦にパーツを配置しています。
QRコードの画像は中央、テキスト入力と誤り訂正レベルの選択肢は上部、生成ボタンは下部にしたいので、赤枠の箇所を`Spacer()`を入れることによって実現しています。
●画面レイアウト（赤枠が`Spacer()`)
<img width="200" alt="スクリーンショット 2020-05-14 9.59.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/ca9c520d-aada-7175-b6c4-1c761d44c875.png">

`Spacer()`を用いないと中央によってしまいます。
●Spacer()を用いていない画面
<img width="200" alt="スクリーンショット 2020-05-14 10.03.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/5ef79800-ea69-e9d4-45b9-52f88bb4a90a.png"> <img width="200" alt="スクリーンショット 2020-05-14 10.03.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/3b7238ea-7c69-69a6-2507-51b2e06c1e6f.png">

また、起動時はQRコード画像がありません。これは`if`文で`Image`を表示非表示を切り替えています。

```Swift:ContentView.swift
            if qrImage != nil {
                Image(uiImage: qrImage!)
            }
```

# 終わりに
サンプルコードは、[github](https://github.com/FromF/QR_Display_SwiftUI)にアップしています。
参考にどうぞ。
Xplentyと他のETLツールを徹底比較!!

こんにちは。今回のテーマはETLツールの比較です。

と言っても、私はXplentyという会社に勤めているため、Xplenty側からみた他社製品との比較を行っているブログについて紹介します。

- [TalendとXplentyに関する比較]
(https://www.xplenty.com/jp/blog/talend-vs-xplenty-overview-comparison-and-review-ja/)

- [MulesoftとXplentyに関する比較]
(https://www.xplenty.com/jp/blog/mulesoft-vs-xplenty-comparison-and-review-ja/)

- [StichとXplentyに関する比較]
(https://www.xplenty.com/jp/blog/stitch-vs-xplenty-a-comprehensive-comparison-ja/)

- [InformaticaとXplentyに関する比較]
(https://www.xplenty.com/jp/blog/informatica-vs-xplenty-comparison-and-review-ja/)

- [Dell BoomiとXplentyに関する比較]
(https://www.xplenty.com/jp/blog/dell-boomi-vs-xplenty-ja/)

- [AlteryxとXplentyに関する比較]
(https://www.xplenty.com/jp/blog/alteryx-vs-xplenty-ja/)

#まとめ
当然ですが、ETL製品に何を求めるかによって、選択する製品は変わってきます。
接続できるデータソースの多さや加工やワークフロー機能、ユーザーフレンドリーなインターフェース、当然価格面やサポート体制も重要です。

自社にあった製品を選択することも重要ですが、[DX(デジタルトランスフォーメーション)](https://www.xplenty.com/jp/blog/low-code-digital-transformation-ja/)の観点から今後のデータ活用プラットフォームがどうあるべきかという視点も踏まえて検討してみてはいかがでしょうか？

今回紹介した比較ブログに書かれている内容を自分の目で確かめたいという方は、こちらの[無償トライアル](https://try.xplenty.com/jp/)で体験してみてください。
Gradleのロギング入門

# Gradleのロギング

GradleはSLF4Jを拡張したロガーを内包しており、
```gradle〜```を実行した時に出力されるログはこれによる出力である。
以下は、Gradleのロガーの6つのログレベルを詳細度が低い順に並べたものである。

|ログレベル|オプション|説明|
|:--|:--|:--|
|ERROR|なし|ビルドエラー発生時に、標準エラー、エラーメッセージを出力|
|WARNING|なし|警告がある場合に警告メッセージを出力|
|QUIET|-q(--quiet)|標準出力、重要な情報のみを出力|
|LIFECYCLE|なし(デフォルト)|タスク名、ビルド結果、実行時間など進行状況を出力|
|INFO|-i(--info)|Gradle内部の処理のログなど、詳細な情報を出力|
|DEBUG|-d(--debug)|INFOよりも詳細な情報を出力|

# ロガーの使い方

ビルドスクリプトでのロガーの使用方法は簡単で、loggerプロパティを利用するだけでいい。

```gradle:ロガーの実装方法
logger.error 'エラーメッセージ'
logger.warn '警告メッセージ'
logger.quiet '重要なメッセージ'
logger.lifecycle '進行状況を示すメッセージ'
logger.info 'インフォメーションメッセージ'
logger.debug 'デバッグメッセージ'
```

# 外部ロギングフレームワークとのマッピング

ビルドスクリプト上で、外部ロギングフレームワークのクラスをimportして使用した場合、
それらのロガーが出力した内容はGradleのロガーにリダイレクトされる。
この際、あらかじめ外部のログレベルがGradleのログレベルにマッピングされているので、
特に設定なしに、各ログレベルに対応した出力を得ることができる。

## 各ロギングフレームワークとのマッピング

### Apache log4j / Log4j 2

|Gradleのログレベル|Log4jのログレベル|
|:--|:--|
|ERROR|FATAL/ERROR|
|WARNING|WARN|
|QUIET|なし|
|LIFECYCLE|なし|
|INFO|INFO|
|DEBUG|DEBUG|

> 〜Apache Log4j 2 使用時の注意点〜
Apache Log4j 2は他のロギングフレームワークとの連携のための
ブリッジライブラリが用意されている。
Gradleとの連携には、「log4j-to-slf4j.jar」というライブラリが必須で、これがないと
FATALとERROR以外の出力はマッピングされないのである。

### Apache Commons Logging

内容はLog4jと全く同じ。

|Gradleのログレベル|Commonsのログレベル|
|:--|:--|
|ERROR|FATAL/ERROR|
|WARNING|WARN|
|QUIET|なし|
|LIFECYCLE|なし|
|INFO|INFO|
|DEBUG|DEBUG|

### JDK標準ロギングAPI

FINEの上には、FINER、FINESTというログレベルが存在するが、
Gradleにおいて出力できるのはFINEまでとなっている。

|Gradleのログレベル|JDKのログレベル|
|:--|:--|
|ERROR|SERVER|
|WARNING|WARNING|
|QUIET|なし|
|LIFECYCLE|なし|
|INFO|INFO/CONFIG|
|DEBUG|FINE|

# ログレベルマッピングの変更

通常、Gradleの標準出力と標準エラーはそれぞれ、QUIETとERRORにリダイレクトされている。
Gradleでは、loggingプロパティを使用することで
各出力のリダイレクト先のログレベルを変更することができる。

```gradle
// 標準出力のリダイレクト先の変更
logging.captureStandardOutput LogLevel.INFO
// 標準エラーのリダイレクト先の変更
logging.captureStandardError LogLevel.INFO
```

# 参照

この記事は以下の書籍を参考に執筆しています。

参考書籍：[Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築](https://www.shoeisha.co.jp/book/detail/9784798136431)
[javascript]困ったときに使う技術的検索サービスとか公式ドキュメント(メモ)

## 検索サービスや公式ドキュメントを探すのが面倒なのでまとめてみた
私のデスクトップは結構キレイに整頓されているのですがどうしても色んなアプリやらゲームやらで埋められてしまいリンクがどっか行ってしまうのでまとめてみました。

## 一覧

- [Google検索(JP)](https://www.google.com/)
- [Google検索(EN)](https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0/)
- [Qiita(ここ)](https://qiita.com/)
- [Stack Overflow](https://stackoverflow.com/)
- [Amazon Kindle](https://www.amazon.co.jp/Kindle-%E3%82%AD%E3%83%B3%E3%83%89%E3%83%AB-%E9%9B%BB%E5%AD%90%E6%9B%B8%E7%B1%8D/b?ie=UTF8&node=2275256051/)
- [BOOTH(技術書)](https://booth.pm/ja/browse/%E6%8A%80%E8%A1%93%E6%9B%B8/)
- [Github(検索機能)](https://github.com/)
- [MDN Web Api](https://developer.mozilla.org/en-US/docs/Web/API/)
- [React Docs](https://reactjs.org/docs/getting-started.html/)
- [React Native Api](https://reactnative.dev/docs/activityindicator/)
【JavaScript】ダイアログの表示いろいろ

##`alert( )を使う`##

```javascript

alert('hello!');  
```
<img width="400"alt="スクリーンショット (28)_LI.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574195/64c2e9d1-120b-d974-c9b1-e472c73352f6.png">

- 計算式を表示する

```javascript
  //alert()の引数に「計算式」を指定すると計算結果が表示される
alert(100 + 200);
```

<img width="400"alt="スクリーンショット (32)_LI.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574195/298d5c17-1694-bbc8-fc47-81bbb08d7510.png">

-  変数を表示する

```javascript
  //現在の日時を取得してdという定数に代入
const d = new Date();
  // d から年だけ取得してyearという変数に代入
var year = d.getFullYear();
  //文字列と変数を結合
alert("今は" + year + "年です。");
```
<img width="400"alt="スクリーンショット(34)_LI.jpg" src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574195/d248a6fa-8d3d-e7cb-fdb1-791c8d5ca844.png">



##`confirm( )を使う`##

```javascript
confirm('削除しますか？');
```
キャンセルとOKが表示される。この場合OKならtrue、キャンセルならfalseが返される。

<img width="400"alt="スクリーンショット (28)_LI.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574195/ad5bfc01-c3d8-54d5-b7c2-9ea5db536f99.png">
これをふまえて応用

```javascript
const answer = confirm('削除しますか？');
  //confirmの返り値をanswerという定数に入れて条件分岐する
if(answer){
  console.log('削除しました！')
else{
  console.log('キャンセルしました！')
}
}
```
plunkerでmermaid

#概要

plunkerでmermaidやってみた。

#参考にしたページ。

https://qiita.com/caesar_cat/items/e8a116a585863633d15a


#サンプルコード


```
<h3>sequence</h3>
<div class="mermaid">
sequenceDiagram
  ユーザ    ->> +Vue         : ログインボタンクリック
  Vue      ->> +Laravel     : ログインAPI
  Laravel  ->> +Database    : SQL
    Note right of Database  : 認証テーブル参照
  Database ->> -Laravel     : Result
  alt ログイン成功
    Laravel ->> Vue         : success
  else 失敗
    Laravel ->> -Vue        : failure
  end
  Vue       ->> -ユーザ      : 結果表示
</div>
<h3>graph tb diagram</h3>
<div class="mermaid">
graph TB
  Macの選び方 --> 持ち歩く
  持ち歩く -->|はい| スペック
  持ち歩く -->|いいえ| 予算
  スペック -->|必要| R1[MacBook Pro]
  スペック -->|低くても良い| R2[MacBook Air]
  予算 --> |いくらでもある| R3[Mac Pro]
  予算 --> |できれば抑えたい| R4[Mac mini / iMac]
</div>
<h3>class diagram</h3>
<div class="mermaid">
classDiagram
  class ジョブ {
    -int HP
    -int MP
    -たたかう()
    -どうぐ(item)
  }
  class 黒魔術師 {
    -ファイア()
  }
  class 黒魔道師 {
    -ファイガ()
    -メテオ()
  }
  class 白魔術師 {
    -ケアル()
  }
  class 白魔道師 {
    -ケアルガ()
    -レイズ()
  }
  黒魔術師 <|-- 黒魔道師
  白魔術師 <|-- 白魔道師
  ジョブ <|-- 黒魔術師
  ジョブ <|-- 白魔術師
</div>

<h3>Gantt diagram</h3>
<div class="mermaid">
gantt
  title PHPのライフサイクル
  section PHP 7.2
    アクティブサポート      : done, 2017-11-30, 2019-11-30
    セキュリティサポート     : crit, 2020-11-30
  section PHP7.3
    アクティブサポート      : 2018-12-06, 2020-12-06
    セキュリティサポート     : crit, 2021-12-06
  section PHP7.4
    アクティブサポート      : 2019-11-28, 2021-11-28
    セキュリティサポート     : crit, 2022-11-28
</div>
<h3>pie</h3>
<div class="mermaid">
pie
  "iOS": 45.2
  "iPhone": 17.2
  "PHP": 8.6
  "Objective-C": 6.5
  "Swift": 6.5
  "Xcode": 4
  "Laravel": 3
  "Realm": 3
  "Android": 3
  "Others": 2    
</div>

<h3>state diagram</h3>
<div class="mermaid">
stateDiagram
  [*] --> 待機
  待機 --> [*]
  待機 --> 索敵
  索敵 --> 待機
  索敵 --> 威嚇射撃
  威嚇射撃 --> [*]
</div>
```

#成果物

https://embed.plnkr.co/plunk/8TjvD7vvPCZLm8KK

以上。
テレワークの為のVPN調査

#はじめに
コロナ禍の影響で外出自粛になり、テレワークが増加している昨今、
自宅と会社を繋ぐ際にVPNを使用しているケースが増えている。
今回は簡単に構築できる方法を調査してみた。

#VPNとは
VPNとはVirtual Private Network(仮想専用線)の頭文字を取った用語
離れた場所の間を直接つないでいるかのように、安全にデータ通信を実現する仕組み。
以前は自社用のセキュアなネットワークを構築するためには、企業ごと・拠点ごとに専用の通信回線（専用線）を敷設する必要があり費用が高額であることがネックになっていた。そこで通信事業者の提供する公衆回線(インターネット)上に、仮想の専用線を構築して利用するVPNが登場した。
![ＶＰＮ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570011/f800f3cc-e5a5-7373-a383-daec21cef7cc.png)
【▲VPNの仕組み】

#VPNの種類
大きく分けるとインターネットVPNとIP-VPNに分類される。

**インターネットVPN**
インターネット回線を使ったVPNのこと。光回線などの一般的に利用されるインターネット回線を利用して、IPSecやSSLといった技術を利用し仮想的な専用ネットワークを構築している。不特定多数の利用者が存在するため、トラフィック増大による通信の遅延や、通信途中でのデータ盗聴や改ざんのリスクがある。

**IP-VPN**
インターネットVPNに対して、IP-VPNとは通信事業者ごとに単独で構築・運用される閉じられた回線網で利用するVPN。トラフィック混雑時も一定の帯域が保障され、盗聴や改ざんのリスクが低いなど、コストよりも安定性や信頼性を重視している。

#VPNのメリットとデメリット
**メリット**
・一般のインターネット回線より安全な通信ができる
・離れた場所から特定のネットワークへの接続ができる
・専用線を使うのと比べコストを削減できる

**デメリット**
・専用線と比べると情報漏えいの可能性がゼロではない
・通信速度が遅くなることもある

#主なインターネットVPNについて
**IPsec-VPN**
IPsec（Security Architecture for Internet Protocol）VPNとは通信内容を暗号化するためのプロトコルの1つです。IPsecによるリモートアクセスVPNの場合、クライアントPCに必ずVPN Clientのソフトウェアをインストールする必要がある

**SSL-VPN**　
SSL（Secure Sockets Layer）VPNとは、暗号化にSSL技術を使用したリモートアクセスVPNのこと。SSLによるリモートアクセスVPNの場合はWebブラウザさえあれば通信可能。

#企業でのVPN使用方法
企業で使用されているVPNは「拠点間接続」と「リモート接続」の2つに分けられ、VPN装置の使用方法に差がある。

**拠点間接続**
拠点Aと拠点Bが同じネットワークにいるかのように接続が可能。VPN装置をそれぞれの拠点に設置する必要がある。

**リモート接続**
リモートワークや出張、外出時に使用。IPsec-VPNやSSL-VPN接続をすることで拠点のネットワークに接続することが可能。コロナ禍で在宅勤務が増えている今ではリモート接続をする人が増えているのではないだろうか。
![ＶＰＮ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570011/bbe68c04-01b1-6025-6a35-108dd924da30.png)
【▲VPNの使用方法】

#リモート接続をするためには
初めての導入の場合、簡単に始められるのはVPNルータだ。
VPNルータを設置することで社外にいながら社内のネットワークにアクセスすることが可能。
ただ注意しておきたいのはVPNルータにも種類があり、機器によっては最大同時接続数が5人で、最大登録ユーザ数が10人というのもある。使用環境に合わせてサイジングをする必要がある。

**運用開始後の負荷を考える必要も・・**
VPN接続自体は簡単にできるが、外部から接続できる状態になるので管理は徹底しなければならない。企業で導入する場合、VPN対応ルーターを管理できるスキルを持った人材が必要になる。また、機器に何かしらの異常が発生した場合、使えなくなる可能性がある為、直ぐに対応できるよう監視環境を整える必要や、冗長化構成とすることが必要。

#おわりに
通信の傍受を防ぐために、VPNは有効な方法であり、専用線を使うよりもコストを抑えることができる。ただし、使用している回線の契約や機器の接続構成によっては、VPN使用時に回線速度が遅くなり仕事にならないケースがある場合や、導入後の管理が必要になるので一度社内の環境を見直してみることも大事である。

#参考文献
[SSL-VPN](https://www.infraexpert.com/study/security8.html)
[VPNのメリット・デメリットはどんなものがある？各利用シーンから解説](https://www.itscom.co.jp/forbiz/column/vpn/124/)
[パソコン初心者講座 VPN](https://www.pc-master.jp/internet/vpn.html)
[VPN接続とは？VPNの基本とメリット・デメリットを紹介](https://www.nttpc.co.jp/column/network/whats_vpn.html)
【CSS】親要素無視してwidth100%に

#①親要素無視してwidth100%に
![スクリーンショット 2020-05-14 9.28.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/93f8bdac-a99b-dd1e-a568-a3330c9acfbb.png)


![スクリーンショット 2020-05-14 9.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/651042c0-1596-9a64-bc17-838dd2195741.png)
↑
この部分だけをどうにかしてウィンドウの幅と同じにしたい。

しかし、例えばbodyの```width: 80%;```に指定すると、全ての要素が```width: 80%;```のなってしまう。

一つの要素だけ親要素を無視してwidthを広げたい。

そんな時に使えるのが

#width: 100vw;
これは、**ウィンドウに合わせてwidth調節できる**
（vwは「viewport width」でウィンドウの幅を意味する）

そして、bodyを```margin: 0 auto;```で完成。

と思いきやこれは間違いで、そうしてしまうと『トップのシマシマ画像』も開始位置が親要素に依存してしまいます。

![スクリーンショット 2020-05-14 9.35.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/44c4cc17-9315-a4b6-5762-e79a5a6b7efd.png)

#ではどうする？

```sample.css
.header-top{
  width: 100vw;
  position: relative;
  left: 50%;
  transform: translateX(-50%);
}
```

```left: 50%;```で真ん中に配置させて、

```transform: translateX(-50%);```で左に50%移動させなければなりません。

これで完成です。

![スクリーンショット 2020-05-14 9.28.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/93f8bdac-a99b-dd1e-a568-a3330c9acfbb.png)


#②疑似要素に背景をあてる場合
先ほどは、

```sample.css
.header-top{
  width: 100vw;
  position: relative;
  left: 50%;
  transform: translateX(-50%);
}
```

疑似要素にあてる場合は、

```sample.css
.header {
  position: relative;
}

.header::before{
  width: 100vw;
  left: 50%;
  transform: translateX(-50%);

/*ここまでは同じ*/

  position: absolute;
  content: '';
  height: 100%;
  z-index: -1;
}
```
Gdalのインストールとコマンドによる利用例

## はじめに
　conda環境でのGdalのインストールに戸惑ったのでメモします。


## 環境
OS: Ubuntu 18.04.4 LTS
python: 3.7 (conda)

##インストール方法
検索すると多くの方法がありますが、色々試した結果、　公式ページの[こちら](https://anaconda.org/conda-forge/gdal)が確実でした。(当たり前ですが。)

```python
conda install -c conda-forge gdal
```
動作確認。

```python
(py37) :~$ python
Python 3.7.7 (default, Mar 26 2020, 15:48:22) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from osgeo import gdal
>>> 

```

## gdalのコマンド利用
gdalのコマンド(ここではgdal_mergeを例としています)は、jupyter notebookでは、以下で呼び出すことができますが、Scriptで動かすときは以下で動作できる。

jupyter notebookの場合

```python
!gdal_merge.py *****
```

Scriptの場合

```python
 (py37) :~$ which gdal_merge.py
/home/username/anaconda3/envs/py37/bin/gdal_merge.py
(py37) :~$ python
Python 3.7.7 (default, Mar 26 2020, 15:48:22) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('/home/username/anaconda3/envs/py37/bin/')
>>> import gdal_merge as gm
>>> gm.main([***]) #***には対象のGdalのコマンドを入力

```
##おわりに
gdalのインストール、およびコマンドの利用方法の確認に時間がかかったので、備忘録として記録しました。
react-navigationのページ遷移先でパラメーターを取得できない問題

#サマリー
<dl>
<dt>FW</dt>
<dd>React Native</dd>
</dl>
<dl>
<dt>パッケージ</dt>
<dd>react-navigation v5</dd>
</dl>
<dl>
<dt>問題</dt>
<dd>ページ遷移先にパラメーターを渡しているのに、遷移先のページでパラメーターを取得しようとするとエラーがおきる</dd>
</dl>
<dl>
<dt>原因</dt>
<dd>
react-navigationのバージョンによってパラメーターの取得方法が異なり、使用しているバージョンとは違うやり方をしていたこと。
</dd>
</dl>
ネットだとバージョン４系に対応した書き方が沢山出てくるかと思いますが、最新は5系になりますので書き方が違います。
もし、”undefined"だったり、"...is not a function"みたいなエラーが出ていたら、バージョンにあった書き方をしているかどうか確認してみてください！
以下より詳細に解説していきます。
#コード
##問題のコード
パラメーターの取得方法がネットでは２種類のやり方がありましたが、両方ダメでした。

```javascript:IndexScreen.js
// 遷移元（これは問題ない）
// navigate()の第２引数に、渡したいパラメーターをセットしている
<Button
 title="詳細を見る"
 onPress={() => this.props.navigation.navigate('DetailScreen', { id: 'hogehoge' })
/>
```

```javascript:DetailScreen.js
// 遷移先（問題あり）
// 渡されたパラメーターを取得しようとしているがエラーが出る

// エラーがでる取得方法1
<Text>
  {this.props.navigation.getParam('id')}
</Text>
// エラー文 => "TypeError: this.props.navigation.getParam is not a function..."

// エラーがでる取得方法2
<Text>
  {this.props.navigation.state.params.id}
</Text>
// エラー文 => "Cannot read property params of undefined"
```
##成功したコード

```javascript:DetailScreen.js
// 遷移先
// パラメーターの取得に成功した方法
<Text>
  {this.props.route.params.id}
</Text>
```

#まとめ
<ul>
<li>初歩的なエラーが出たら、バージョンに合った書き方ができてない可能性アリ</li>
<li>4系と5系では取得する書き方違うよ！</li>
<li>てかドキュメントに書いてあったわ...公式のドキュメントちゃんと読みます😭</li>
</ul>

#参考ページ
Stack Overflow
https://stackoverflow.com/questions/61126610/typeerror-this-props-navigation-getparam-is-not-a-function-while-passing-parame  

React Navigation 公式ドキュメント
https://reactnavigation.org/docs/params
GoでDeque(両端キュー)

- Golangの標準ライブラリにDeque両端キューが見つからなかったので自作した
- sliceの先頭に追加する処理は（実装によるだろうが）遅かったので採用していない

```golang
package main

import (
	"fmt"
)

func newDeque() *deque {
	return &deque{}
}

type deque struct {
	prep []interface{}
	ap   []interface{}
}

func (d *deque) push(item interface{}) {
	d.ap = append(d.ap, item)
}

func (d *deque) unshift(item interface{}) {
	d.prep = append(d.prep, item)
}

func (d *deque) empty() bool {
	return len(d.ap) == 0 && len(d.prep) == 0
}

func (d *deque) pop() interface{} {
	lenap := len(d.ap)
	if lenap != 0 {
		v := d.ap[lenap-1]
		d.ap = d.ap[:lenap-1]
		return v
	}
	v := d.prep[0]
	d.prep = d.prep[1:]
	return v
}

func (d *deque) shift() interface{} {
	lenprep := len(d.prep)
	if lenprep != 0 {
		v := d.prep[lenprep-1]
		d.prep = d.prep[:lenprep-1]
		return v
	}
	v := d.ap[0]
	d.ap = d.ap[1:]
	return v
}

func main() {

	q := newDeque()

	for i := 1; i < 10; i++ {
		q.push(i)
	}
	for i := 1; i < 10; i++ {
		q.unshift(i)
	}
	q.push(-999)

	for !q.empty() {
		fmt.Println(q.pop())
	}

	for i := 1; i < 10; i++ {
		q.push(i)
	}
	for i := 1; i < 10; i++ {
		q.unshift(i)
	}
	q.push(-999)

	for !q.empty() {
		fmt.Println(q.shift())
	}
}
```
Pardot Training Environment FAQ

#Pardotトレーニング環境
テストとトレーニングの2つのアカウントがお客様に無料で提供されます。テストアカウントでは一括メール送信が無効になっていますが、他のすべてのPardot機能を使用できるようですね。

https://help.salesforce.com/articleView?id=000320785&language=en_US&type=1&mode=1


#Pardot に関するよくある質問のリンク集
https://help.salesforce.com/articleView?id=000353695&type=1&mode=1
[baserCMS]サイト基本設定に設定されているメールアドレス宛にメールが飛ぶタイミング


まとめてみました。


## 想定している対象者
- baserCMSでウェブサイトを制作をしている方


### 環境
- baserCMS 4.3.5-dev
    - sendMail で片っ端から検索して処理辿った


## 以下でした

- baserCMSのインストールを完了したとき
- サイト基本設定内のテスト送信ボタンを押したとき
	- ※「メール送信テスト」と載る
- ブログ機能でコメント機能を有効可していてコメントがついたとき
- メールフォームで送信されたとき
    - ※宛先設定による
選択リストのデフォルト値を動的にセットする（ただし項目が多いので数式はNG）

#質問
面白うそうな質問があがっていました。
I need to set a check box ON for certain list of values of another field . I have almost 60 values for that field and if I hard code it will be too big. Want to know if I can store all these values in a list somewhere and pass this list here in a Formula, that way formula doesn't look huge.

確かに60項目あるので、数式でハードコーディングすると大きいってエラーになりそうですね。

#解決案

Step 1:- create custom settings type list and define the values of your custom settings( your text values).
Step 2:- write a trigger for your object where you want to update checkbox.

insert前トリガーを使って実装するようですね。
何かの参考に...

https://success.salesforce.com/answers?id=9063A000000ecuK
【JavaScript】日付の操作いろいろ

##`日時を取得`##

```javascript
  //現在日時を取得
const d = new Date();

  //西暦を取得
d.getFullYear(); //2020

  //現在の月を取得(0から始まるので注意。１月は0になる)
d.getMonth(); //5

  //現在の日を取得
d.getDate(); //13

  //現在の曜日を取得
d.getDay();

  //時間を取得
d.getHours(); //0~23

  //分を取得
d.getMinutes(); //0~59

  //秒を取得
d.getSeconds(); //0~59

  //現在の日時を取得して何月何日と表示
const d = new Date();
  //getMonth()は0から始まるので+1する
console.log(`${d.getMonth() + 1}月 ${d.getDate()}日`)
// 実行結果
// 5月13日
```

##`特定の日時を扱う`##
```javascript
  //引数に年月日などを渡す。年と月は必須であとは省略すると日付に関しては 1 、時刻は 0 としてデータを作ってくれる
  //下記のようにすると、月は 0 から始まるので 2020 (年) 5 (月) 01 (日) 00 (時) 00 (分) 00 (秒)になる。
const birthday = new Date(2020,4);

 //指定された月の日を設定
birthday.setDate(31);  //2020 (年) 5 (月) 31 (日) 00 (時) 00 (分) 00 (秒)

  //指定された日の「時」を設定
birthday.setHours(10,20,30); //2020 (年) 5 (月) 31 (日) 10 (時) 20 (分) 30 (秒)

  //指定された日時の7日前を設定して定数に代入
const countdown = birthday.setDate(birthday.getDate() - 7);  //2020 (年) 5 (月) 24 (日) 10 (時) 20 (分) 30 (秒)

```
CSSファイルが読み込めない原因。パスにあります。（Refused to apply style from 'https~' because its MIME type~）

#CSSが読み込めない
ディベロッパーツールで確認すると、

```
Refused to apply style from 'http://localhost:9000/css/reset.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
```

のエラー。

読んでみると、『MIMEタイプがサポートされていない』と書かれていますが、問題はそこではなくて。

**cssのパスの違い**にありました。

#パスを変える

```
├── dist
│   ├── index.html *
│   ├── main.js
│   ├── style.css
└── css
```

```index.html（修正前）
<link rel="stylesheet" href="./css/style.css">
```

```index.html（修正後）
<link rel="stylesheet" href="style.css">
```

原因は**相対パスの起点**にありました。

起点は、

**現在ブラウザで実行されているファイル**で、そこからの相対パスを書かなければいけません。