OmniAICreator/Qiita-1.07M huggingface dataset:
一週間分のpsd

#使い方
`python psd_1week.py 2001/200106_N.MWDH_U.s 2001/200107_N.MWDH_U.s 2001/200108_N.MWDH_U.s 2001/200109_N.MWDH_U.s 2001/200110_N.MWDH_U.s 2001/200111_N.MWDH_U.s 2001/200112_N.MWDH_U.s`

#コード
```psd_1week.py
import obspy
from obspy import read
from matplotlib import pylab as plt
import numpy as np
import sys
import matplotlib.ticker as tick

#コマンドラインから引数
file1 = sys.argv[1]
file2 = sys.argv[2]
file3 = sys.argv[3]
file4 = sys.argv[4]
file5 = sys.argv[5]
file6 = sys.argv[6]
file7 = sys.argv[7]

samplerate = 100 #サンプリング周波数

st01 = read(file1, debug_headers=True)
data01 = st01[0].data

st02 = read(file2, debug_headers=True)
data02 = st02[0].data

st03 = read(file3, debug_headers=True)
data03 = st03[0].data

st04 = read(file4, debug_headers=True)
data04 = st04[0].data

st05 = read(file5, debug_headers=True)
data05 = st05[0].data

st06 = read(file6, debug_headers=True)
data06 = st06[0].data

st07 = read(file7, debug_headers=True)
data07 = st07[0].data



##tは時間方向での離散値．stの長さをサンプルレートで切っているので，サンプル数分の配列になってます．
#t = np.arange(0, len(data))/samplerate


#data.np.extend(dataa)
y = np.append(data01, data02)
y = np.append(y, data03)
y = np.append(y, data04)
y = np.append(y, data05)
y = np.append(y, data06)
y = np.append(y, data07)

#tは時間方向での離散値．stの長さをサンプルレートで切っているので，サンプル数分の配列になってます．
time = np.arange(0, len(y))/samplerate


#スペクトログラム
plt.specgram(y, Fs=samplerate,scale='dB', vmin = -200, vmax = -150, cmap = 'jet',NFFT = 4096, noverlap = 2048)
plt.ylabel("Frequency [Hz]")
plt.xlabel("Time [day]")

plt.xticks(np.arange(0, 604800, step=86400))
plt.tick_params(labelbottom=False)

#plt.gca().xaxis.set_minor_locator(tick.MultipleLocator(86400))
plt.gca().yaxis.set_minor_locator(tick.MultipleLocator(2))
plt.xticks(color="None")
#カラーバー
ax=plt.colorbar()
ax.set_label('Intensity [dB]')

plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101426/788676b7-006d-c26e-5b9e-143d71a49326.png)
2020年1月6〜12日
古物商取引でのマイナンバーカードによる eKYC (非対面取引) のメモ

ちょっとした古物取引をしたい. そんなに頻繁に(多数に)行うわけではない.

相手方はマイナンバーカードを保有する個人とします.
マイナンバーカードの電子署名 or IC チップ情報で KYC したい.

## 方法

### 相手から電子署名を行ったメールの送信を受けること。

https://www.pref.niigata.lg.jp/site/kenkei/osirase-anzen-ansin-kobutusyou-kakuninsochi.html

https://www.police.pref.osaka.lg.jp/tetsuduki/ninkyoka/1/1/3673.html

相手から電子署名を行ったメールの送信を受けること, だとざっくりしてよくわかりませんが, 結局のところマイナンバーカードで電子署名してもらったとしても, 古物商が署名検証業者(or 署名検証を委託)でないといけません.

https://biz.trustdock.io/column/kobutsu

eKYC 代行(署名検証業者へ委託)は固定費用高いっぽいので, たま〜に古物を取引したり(数人程度の KYC) やるような用途には向かず選択外となります.

また, 電子署名されたファイルはその後改ざんされていないことが求められます. PDF では DocMDP(Acrobat でいう Certificate signature)形式で電子署名してもらうことになるでしょう.

## NFC でマイナンバーカードの情報読み出し + 風貌の撮影

したがって, 可能性としては上記 URL にある eKYCによる確認② あたりになるでしょうか.
eKYCによる確認① はいくつかやっているところありますが, せっかくのマイナンバーカードですから IC チップ読み取りのほうをやりたいですね.

撮影画像が加工されていないのを保証するのとして, iOS ですと AppleRAW 形式で撮影という手がありそうです.

EXIF には GPS での位置情報と時間が記録されます(有効にしている場合)

カメラメーカーによっては RAW ファイルにハッシュ値も含んでくれたはずなので, ハッシュ値も iOS 側から提供してくれると本当はよいのですけどね.
 
### NFC でマイナンバーカードの情報読み出し + 銀行振込

eKYC の頻度高くない場合は, IC チップの情報読み出し + 銀行振込という手もあるでしょうか.
顔撮影アプリ開発するのがめんどい場合は, 銀行振込で確認という手もありそうです(たぶん一回 200 円くらいのコスト(銀行振込手数料 + 1 円とか)でいけそう. 郵送で書留送るよりは安いはず)

## その他参考

古物営業法施行規則の一部を改正する規則案」に対する御意見及びこれに対する警察庁の考え方について
https://public-comment.e-gov.go.jp/servlet/PcmFileDownload?seqNo=0000177764

## TODO

* [ ] 個人情報保護法との関連を考える
* [ ] 相手方が法人の場合を考える. 法人の場合は商業登記に基づく電子証明書の電子署名もらえれば OK そう...?
スケジュール帳(手帳)の書き方に改めて悩み始めたときに出会った『バレットジャーナル』

# はじめに
スマホが当たり前になってもう何年も経っていますが、
私はいまだに「スケジュール帳(手帳)」も使っています。
長年、スケジュール帳で仕事やプライベートのスケジュールを管理していました。
また、時にはタスクを付箋に書き出したり、
英文の技術書を読んでいて知らない単語を調べたときに空いたページに
書き出したりもしています。
最近では仕事(会社)とかでスケジュールを社内で共有するために
Googleカレンダーのようなスケジュールアプリも当たり前のように使っていて、
どんどん管理方法が煩雑になっている気がして、頭の整理がつかなくなる時も。

そんな従来通りの使い方をしてる中で、感じ始めていた悩みが以下のようなものでした。

 * スケジュールの管理が2重管理が面倒 + 効率悪い
 * 〆切書類などの記入、タスクの管理の切り分けもしたい
 * プライベートの出来事の記入も簡単にできるとGood！
 * 会社帰りにスーパー寄るときの買い物リストも記入できるとGood！
 * 書いておきたいことがたくさんある、頭の中を整理するためにも書きたい
 * でも、何冊にも分けずに1冊でまとめたい

などなど。

今回、StayHome期間中の図書館で出会った本がきっかけで
内容が目からうろこだったので、自分の備忘録として記事にすることとしました。

__『「箇条書き手帳」でうまくいく　はじめてのバレットジャーナル』
（Marie著,ディスカヴァー・トゥエンティワン,2017年）__

※実践はこれからですが、きっと自分なりの管理方法ができると
　感じたので、特に取り入れたかった点をまとめます。

# バレットジャーナルとは
　好きなノート1冊とペン一本を用意して、
　箇条書きと記号を活用して、タスクやスケジュール、
　メモなどを効率的に管理できる手帳のこと。

　バレットジャーナルの名前の由来は、英語で中点(・)を表すBulletを使い、記録する。
　「Bullet Journal」をそのまま日本語にしたもの。

# バレットジャーナルの構成
  バレットジャーナルの構成は以下の4つの構成から成り立つ
 
 1. インデックス(目次)
 2. フューチャーログ(半年分の予定を書く)
 3. マンスリーログ(月間予定を管理)
 4. デイリーログ(日の予定・予定を管理)

※特にここでは「4. デイリーログ」の部分を書くことについて
　まとめておきたいと思います。

# デイリーログを書く時のルール
デイリーログを書く時のルールとしては、以下の点を守ります。

 * タイトルに新しい日付を書く
 * 箇条書きの前に書く記号を決めておく(次に記載あり)
 * ページ番号を振っておく
 * その日の予定、タスク、アイデアなどをできる限り簡潔に箇条書きする
 * 感じたこと、買い物、読書メモなども箇条書きで書きこんでOK

# 箇条書きの前に書く記号を決める
前述した「・（バレット）」と呼ばれる記号をはじめとする、「ラピッドロギング（迅速な記録法）」で記述していくための記号を使います。
箇条書きの前に書く記号のことをKEYと呼ばれており、このKEYは自分でルールとして決めておきます。
各参考文献を見ながら私だったらひとまずこんな感じで分類してみようと書き出してみました。

 * □ ：未実施のタスク
 * ■ ：タスク完了
 * ◫：タスク着手
 * →□：タスク持ち越し
 * ○：イベント予定
 * ●：イベント完了
 * ♡：感じたこと
 * ☆：アイデア
 * ・：メモ
 * ⓦ：英語の単語や用語などを書き出す

# 自分なりにまずは取り入れてみようと思った点
 * マンスリーの予定は、Googleスケジュールなどにまとめる(プライベートはもしかしたらマンスリーログを取り入れていくかも)
 * デイリーログはノートにまとめる(バレットジャーナルを使う)
 * デイリーログの書き出しは、朝決めた時間に書く(その後は、書くことができた都度)
 * 仕事のある日は、朝一メールチェックとともに実施する
 * 持ち越ししたタスクは、次の日のデイリーログに書き写す
 * 持ち越しが長くなる場合は、タスク自体を見直す
 * 食料品、日用品の買い物リストは付箋に書き出して、その日の記載欄に貼っておく
 * (実際に始めてみて少しずつ使いやすいように改善をしていく)

# 最後に
今回出会ったバレットジャーナルは、ベースとなるルールがあるものの、
どんなふうにまとめていくかは各個人で異なるものになるとわかりました。
これから私自身がバレットジャーナルを使ってみて、より簡単に、
迅速に頭を整理、確認ができるものを作ることができれば、
仕事や作業の効率化、物事の整理につながるのかもしれないと思いました。
もちろん、プライベートスケジュールとのバランスも取りやすくなるのではないかと期待しています。

# 参考文献
 -『「箇条書き手帳」でうまくいく　はじめてのバレットジャーナル』
（Marie著,ディスカヴァー・トゥエンティワン,2017年）
 - KOKUYO MAGAZINE

https://www.kokuyo-st.co.jp/mag/Life-and-Work/2020/07/000140.html
【AWS 認定】クラウドプラクティショナー（AWS CLF-C01）合格備忘録

## はじめに

先日，AWS 認定クラウドプラクティショナー（AWS CLF-C01）に合格したので何をしたのか備忘録として残します．

https://aws.amazon.com/jp/certification/certified-cloud-practitioner/

## プロフィール

- 新卒 1 年目のエンジニアで，研修中です．
- クラウドは何もわからんです．
- SAA を取りたいなあと思い，その前段階として CLF を受験しようとした次第です．

## 結果

![AWS_CLF-C01_試験結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207113/7bfb16f6-627e-f564-60f1-0aa272fc8db0.png)

## やったこと

私が行ったことは主に３つです．

1. [AWS Cloud Practitioner Essentials](#1-aws-cloud-practitioner-essentials)
2. [模擬試験](#2-模擬試験)
3. [各サービスの概要まとめ](#3-各サービスの概要まとめ)

### 1. AWS Cloud Practitioner Essentials

https://www.aws.training/Details/eLearning?id=66479

これで十分でした．特徴としては，

- 公式の動画中心の教材
- 各章のミニテストと最終確認テストがある

となっており，無料で受けられるコースです．
様々な箇所に知識確認があるので，各選択肢がなぜ正解/不正解なのか分かるまでやりました．
また各章のミニテストや最終確認テストは試験日直前に復習するのにも活用しました．

### 2. 模擬試験

試験終了後に模擬試験の問題を見られないのでただのスコアレポートとしてしか使っていないです．
結果は下の通りで，テクノロジーが対策優先といった感じでした．

![AWS_CLF-P01_試験結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207113/4693a1e8-0014-136e-b20e-14460d6eaf98.png)

### 3. 各サービスの概要まとめ

模擬試験の結果を受けて，テクノロジーがまずいということがわかりました．
とはいっても，公式教材をやっただけなので知らないサービスはあるだろ！って思っていました．
特にいい方法はわからず試験日前夜に[AWS サービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)から下の様にサービス名とサービスの内容を簡単にまとめてみました．
効果はあったと思いますが，コスパが良かったか？と聞かれると微妙です．
受験してみてわかったのは，CLF はサービス名とサービス内容がざっくりにわかれば大丈夫だったということです．

![AWS_サービス概略_Notion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207113/7ac059fb-a3d5-1c38-b555-4ff37202ba67.png)

## 試験

ピアソン VUE でのオンライン試験で日本語選択，自宅受験しました
試験時間は見直しを含めても余ります．

## かかった金額

| 項目                              | 金額(円) |
| --------------------------------- | -------: |
| AWS Cloud Practitioner Essentials |        0 |
| 模擬試験                          |     2200 |
| 本試験                            |    12100 |
| 合計                              |    14300 |

## CLF って受ける必要ある？

**結論: お金に余裕があるなら受けてみてもよいのでは？**
今回受験しようと思ったときに一番気になった点です．
SAA 取るぞって人は受ける必要がない気もしますが，基礎的な知識を学べるのでそれに 14300 円出せるか？といった感じです．

## 最後に

CLF 受験を検討されている方の参考になれば幸いです．
SAA も受ける予定なので，合格したらまた投稿しようと思いますー
ClickOnceのプログラム内更新の問題点について

#概要
大分前に「ClickOnceの起動時の挙動について」という記事を書きました。
いろいろな方に見ていただき多少はお役に立つことができたでしょうか？
しかし、証明書を更新するとエラーが発生し、更新処理が行えなくなる場合があることがわかりました。
#エラー内容
ClickOnceの自動更新機能を使用することにより、特定環境下でアプリケーションの
起動が遅くなるということでプログラム側からClickOneceのバージョンチェックを行い、
新バージョンがある場合更新を行うようにしましたが、以下の条件の場合、エラーになります。

・Microsoft.NET Framework3.5と4.8が同居している。
・署名した証明書がSHA-2（SHA256）

この条件がそろった場合、ClickOnceの更新チェックの動作がExceptionを吐きます。
原因としてはMicrosoft.NET Framework3.5でSHA-2証明書で署名した場合、ClickOneceの配布ができない
ということになります。

なので死ぬほどテストした結果

証明書がSHA-2でも.NET Frameworkが4.8だけであれば問題ない
（VisualStudioのターゲットFrameworkが3.5でも問題ない）
OSに依存しない（Frameworkが問題）

ということになります。（これ以外でもエラーになるパターンはあるかもしれません。）

#対策
１．現バージョンをアンインストールし、新バージョンを再インストールする。
２．新しい証明書をSHA-1で作成して署名する。
３．新しいClickOnceサイトを作成し、そこから配布を行う。
４，更新時にエラーした際、自分で自分をアンインストールするプログラムを作成し、再インストールする。
　　（この方法はMicrosoft公式回答に書いてあります。）
ただし、４の場合その後のバージョンアップについては保証しないとも書いてあります。

#まとめ
この条件になる場合はかなりのレアケースとなると思います。
ただ、自社のシステム以外で動作するものが入っている場合、.NET Framework3.5が入っている可能性は捨てきれないので
対応を入れるべきかは迷うところです。

こういった症状が出る場合は大体古いOS（サーバも含め）なのでお察し案件ではありますが、参考になる事例が基本的に海外の
情報しかありませんので、もし困っている方の参考になればと思います。

質問などあれば追記します。
【Vue + Typescript】親コンポーネントとのやりとりには@VModelを使おう

###はじめに

v-modelの親子間伝達は[vue-property-decorator](https://github.com/kaorun343/vue-property-decorator)の`@VModel`を使うと簡単だよ、というお話です。
例がネット上に転がってなかったので、メモ程度に残しておきます。

###前提
@vue/cliの初期化時にtypescriptを指定していれば新しく追加するものはありません。

- typescript
- vue-class-component
- vue-property-decorator

###よくあるやり方



###例

```vuejs:ChildComponent
<template>
    <div>
        <input type="text" v-model="text"/>
    </div>
</template>

<script lang="ts">
import {Vue, Component, VModel} from 'vue-property-decorator'

@Component
export default class ChildComponent extends Vue{
    @VModel({type:String})
    text!:string
}
</script>
```

```vuejs:ParentComponent
<template>
    <div>
        <child-component v-model="text" />
    </div>
</template>

<script lang="ts">
import { Component, Vue} from 'vue-property-decorator'
import ChildComponent from 'ChildComponent.vue'

@Component({
        components: {
            ChildComponent
        }
    })
export default class ParentComponent extends Vue{
    private text: string = 'aaa'
}
</script>
```

###注意点
通常の`props`と異なり、親も`v-model`でバインドする必要があります。

```vuejs
<!--下の書き方はOK-->
<input type="text" v-model="text"/>
<!--下の書き方はNG-->
<input type="text" :text="text"/>
```
以上。
【React】ComponetとConponet間データの受け渡し

# Componentとは
Reactで作られるアプリ・ページの見た目と機能を持つ「UI」部品
Reactでは、複数のコンポーネントを組み合わせてページを作るのが一般的

# 記述方法
二種類書き方がある
### クラスコンポーネント←現在は一般的ではない
* JavaScriptのクラスの書き方とほぼ同じ
* componentを継承する
* React 16.8で追加されたReactHooksが現れるまでは、ライフサイクル機能はclassで記述しないと実現できなかった<br>
※関数コンポーネントでライフサイクル機能はuseEffectを使用することで実現する。

### 関数コンポーネント
* classコンポーネントと比較すると記述量が少なく、可読性が高い
* こちらで記述するのが一般的

# コンポーネントを使用する理由
* 部品として再利用をすることができる
* コードの可読性が上がる
* 保守性が高い

# 記述ルール
* 1ファイル1コンポーネント
→この点は可読性の向上にも寄与している。
* ファイル名は大文字で記述する（アッパーキャメルケース、パスカルケース）
* 子コンポーネントでは、exportを記述して、外部からimportできるようにしておくる
* 親コンポーネントは子コンポーネントのimportをコードの上部に記述する

# Componentの再利用
* 同じコンポーネントを何回でも呼び出すことができる<br>
  関数と同じ感覚で使用できる
* 配列データをmap()メソッドを処理するのが一般的
 ※map()メソッド：配列の各要素に対して()内の処理を実行する
	
# Component間のデータ受け渡し
propsを用いて親コンポーネントから子コンポーネントにデータを渡すことができる。

## propsとは
* 親コンポーネントから子コンポーネントにデータを受け渡す概念
* 子コンポーネントの引数にpropsを記述すると、親コンポーネントから値を渡すことができる
		
### propsで受け渡せるデータ
* propsのデータは親コンポーネントから子コンポーネントを呼び出す際にタグ内の{}に変数名と値を記述する。
* string,number, bool,array,object,date等あらゆるデータ型で渡すことができる。
* 変数をそのまま渡すこともできる。
* 文字列の時だけは{}なしで渡すことができる。

# 参考

https://www.youtube.com/watch?v=Q-df0QgZuhE
【Ruby on Rails】db:createができない

<h1>背景</h1>

・RoRでアプリ作成時、データベースをPostgreSQLにして、データベースを作成するために下記コマンドを実行

```
$ rails db:create
```

<h1>エラー内容</h1>

```
could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Couldn't create 'memo_app_development' database. Please check your configuration.
rails aborted!
PG::ConnectionBad: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
/Users/xxx/C/ruby/xxx/memo-app/bin/rails:9:in `<top (required)>'
/Users/xxx/C/ruby/xxx/memo-app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)
```

<h1>やったこと</h1>
下のコマンドでポスグレのログが読めるみたいなので確認

```
$ postgres -D /usr/local/var/postgres
```

すると、

```
FATAL:  database files are incompatible with server
DETAIL:  The data directory was initialized by PostgreSQL version 12, which is not compatible with this version 13.3.
```
data dictionaryがなんのことかはよくわからないけど、「data dictionaryの初期化はversion12でされたけど、今インストールされているのはversion13なのでうまくいってません」とのことだった。
いろいろ調べていたらポスグレをアップグレードすれば良いみたいだったので実行

```
$ brew postgresql-upgrade-database
```

<h1>結果</h1>
無事データベースの作成に成功しました。

```
$ rails db:create
Created database 'memo_app_development'
Created database 'memo_app_test'
```
【Composer】PMPMDの導入

## はじめに

## 目次

- PHPMDとは
    - 主な機能

- 導入方法

- Ruleset
    - ルールセットの例

- composer scripts
    - composer.json に追加

- おわりに

- 参考文献

## PHPMDとは

バグやバグの温床になりそうなコードを教えてくれる優れもの。
コマンドを打ったり `Circle CI` などを導入すれば `push` したときに自動でチェックしてくれるようになるので便利です。

#### 主な機能

・バグの検知
・汚いコードの検知
・複雑なコードの検知
・使用していない引数や関数の検知

## 導入方法
***composer*** を導入してから **「phpmd」** を導入していきます。([composer 導入方法はこちら](https://qiita.com/suzu12/items/053c8dfe72ccf7c44df3))

```terminal:ターミナル
composer require "phpmd/phpmd=@stable" --dev 
```

これで `phpmd` を使うことができるようになりました。
早速使用してみます。

チェックしたいルールを引数に書きます。

```terminal:ターミナル

./vendor/bin/phpmd [チェックしたいファイル] [フォーマット] [ルール]

# 例えば
./vendor/bin/phpmd sample.php text cleancode,codesize,controversial,design,naming,unusedcode
```

使用はできますが、なんだか長くて使い勝手が悪いですね。

そこでルールを設定ファイルとして定義します。

## Ruleset

自分が決めたルールでコードをチェックできるようになります。
設定ファイルを作成することで毎回ルールをコマンドに入れて打たなくても良いようになります。

ルートディレクトリで設定ファイルを作成します。

```
touch phpmd.xml
```

#### ルールセットの例

```xml:phpmd.xml
<?xml version="1.0"?>
<ruleset name="My first PHPMD rule set"
          xmlns="http://pmd.sf.net/ruleset/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0
                        http://pmd.sf.net/ruleset_xml_schema.xsd"
          xsi:noNamespaceSchemaLocation="
                        http://pmd.sf.net/ruleset_xml_schema.xsd">
  <description>
    My custom rule set that checks my code...
  </description>
  <rule ref="rulesets/codesize.xml" />
  <rule ref="rulesets/cleancode.xml" />
  <rule ref="rulesets/controversial.xml" />
  <rule ref="rulesets/design.xml" />
  <rule ref="rulesets/naming.xml" />
  <rule ref="rulesets/unusedcode.xml" />
</ruleset>
```

これで設定ファイルを作成してチェックしたいルールを定義することができたので使用してみます。

```terminal:ターミナル
./vendor/bin/phpmd . text phpmd.xml --suffixes php --exclude vendor
```

**--suffixes** はどのファイルをチェックするのか。
**--exclude** はどのファイルを除くのか。

というオプションを指定しております。

もっと使いやすくするために `composer` に登録し簡単にコマンドを打てるようにしていきます。

## composer scripts

#### `composer.json` に追加

```json:composer.json
    "scripts": {
        "phpmd": "./vendor/bin/phpmd . text phpmd.xml --suffixes php --exclude vendor"
    }
```

```terminal:ターミナル
composer phpmd
```

簡単にチェックできるようになりました。

## おわりに

一段落するごとにコマンドを打ってチェックしてみると早い段階でバグになりそうなところをチェックすることができるので導入してみてはどうでしょうか。

## 参考文献

- [公式ドキュメント (GitHub)](https://github.com/phpmd/phpmd)
- [公式ドキュメント](https://phpmd.org/)
- [ルール一覧](https://phpmd.org/rules/index.html)
Rubyのハッシュについて

ハッシュは、「データ」とそれに対応する「名前」のセットを要素として持つ値です。
ハッシュにおいては、データをバリュー、それに対応する名前をキーと呼びます。
ハッシュは順番ではなく、キーで管理をし、このようなキーとバリューで管理する方式をキーバリューストアと呼びます。

ハッシュの生成は

`変数 = { キー1 => バリュー1, キー2 => バリュー2, キー3 => バリュー3 }`
のように波括弧で囲い、ハッシュロケットと呼ばれる=>を用いてキーとバリューをセットにして記述します。
またハッシュのキーには、文字列も数値も使用できますが、多くの場合、シンボルという値が使用されます。

例

```ruby
irb(main):004:0> a = {'name' => 'nanashi', 'birthplace' => 'tokyo', 'age' => '20'}
=> {"name"=>"nanashi", "birthplace"=>"tokyo", "age"=>"20"}
irb(main):005:0>  puts a['name']
nanashi
=> nil
```
変数aにハッシュを宣言しキーnameの値を取り出したいときはこのようにputs 変数['キー']で取り出します。

シンボルは、見た目は文字列のようですが、実際の中身は数値になっている値です。
シンボルの宣言は、文字列の先頭にコロン:をつけます。

`# 以下はどちらも同じ要素
hash = { :name => "Taro" }
hash = { name: "Taro" }  # よく使用される`

シンボルを使う理由としてコンピューターは、文字列を扱うよりも、数値を扱うほうが処理速度は速くなります。処理速度を速くすることと、文字列としての役割も果たせることから、ハッシュのキーには、文字列よりもシンボルを用いることが多いです。

例

```ruby
irb(main):006:0> a ={ name: 'nanashi', birthplace: 'tokyo', age: '20'}
=> {:name=>"nanashi", :birthplace=>"tokyo", :age=>"20"}
irb(main):007:0> puts a[:name]
nanashi
=> nil
```

変数aにハッシュを宣言しキーnameの値を取り出したいときはこのようにputs 変数[:キー]で取り出します。
form_withのmodelオプション

※プログラミング学習中の私がアップロードしてます。理解が浅いです。
この記事は厳密な仕様に関するものではなく、考え方理解のまとめとして受け取ってください。

```rb
<%= form_with model: @card, url: new_card_path, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %>
```

###form_withは、modelオプションに指定されたインスタンス変数の状態により、リクエストを送るアクションを判断しています。

###具体的には新規作成（POST)か更新（Patch)かをレコードの有無で見分けている。これはデータベースに存在するレコードかどうか(.saveや.createなどで保存までされているレコード化)によってメソッドが決まる。
aws EC2開始時の設定の簡略化(cli)

aws EC2をEIPつけないで毎日再起動する状況で活躍するshellくんです。
(EIPはお金かかるんで、ケチりたいんです。)

## 挙動
ec2の起動と、ssh/configのIPアドレスの書き換えを行います。
ec2の停止を行います。

(当環境はmacですが、linuxでも動作可かと思います。windowsはパスさえ正しく設定すればいけるのでは無いでしょうか。また、zshrcではコメントアウト処理に特別の設定が必要なので、.shファイルのコメントアウトは取り除いてください。)

---

EC2はEIPをつけないと一日起きにIPアドレスが変わってしまいます。
すると、sshやwebサーバを立てている場合は毎日指定するIPアドレスが変わってしまいます。（ドメインも無い場合）

当環境ではvscodeによるremotesshも行いたいので、~/.ssh/configにて設定をしています。

ここら辺の設定を毎回手動で行うのは面倒くさいので、簡略化させました。以下ソースです。
(事前にaws configureの設定は行ってください。)


### インスタンス設定.sh

```bash:ec2.sh
#!/bin/bash
KEY_NAME="your_key" #  ec2にsshを行う際のkey名を元に開始、停止するインスタンスを指定します。
SSH_AWS_NAME="your_aws" # .ssh/configにおけるHOSTNAMEを記載してください。

EC2_PRIVATE_ADDR=$( \
        aws ec2 describe-instances --filters Name=key-name,Values=${KEY_NAME} \
          --query 'Reservations[].Instances[].PrivateIpAddress' \
          --output text \
)
EC2_INSTANCE_ID=$( \
        aws ec2 describe-instances \
          --filters Name=private-ip-address,Values=${EC2_PRIVATE_ADDR} \
          --query 'Reservations[].Instances[].InstanceId' \
          --output text \
)

EC2_STATE=$( \
        aws ec2 describe-instances --filters Name=key-name,Values=${KEY_NAME} \
          --query 'Reservations[].Instances[].State.Name' \
          --output text \
)

if [ ${EC2_STATE} = "stopped" ]; then
  echo "plz wait, starting ec2"
  aws ec2 start-instances --instance-ids ${EC2_INSTANCE_ID} 1>/dev/null && aws ec2 wait instance-running --instance-ids ${EC2_INSTANCE_ID}

  SSH_IP_BEFORE=$(cat ~/.ssh/config | awk '/'${SSH_AWS_NAME}'/ { getline; print $2}')
  EC2_PUBLIC_ADDR=$(aws ec2 describe-instances --filters Name=key-name,Values=${KEY_NAME} \
          --query 'Reservations[].Instances[].PublicIpAddress' \
          --output text \
  )

  sed -i -e "s/${SSH_IP_BEFORE}/${EC2_PUBLIC_ADDR}/g" ~/.ssh/config

  echo "http://${EC2_PUBLIC_ADDR}/" #URL指定になっているものはcommnad+クリックでブラウザに飛べます。
  echo "ssh aws" #.ssh/configに記載しているためpemファイルを指定しなくてもログインできます。

  echo "running ec2"
elif [ ${EC2_STATE} = "running" ]; then
  echo "plz wait, stopping ec2"
  aws ec2 stop-instances --instance-ids ${EC2_INSTANCE_ID} 1>/dev/null && aws ec2 wait instance-stopped --instance-ids ${EC2_INSTANCE_ID}
  echo "stopped ec2"
fi

```


### 実行結果

```bash
[bash] % bash ec2.sh
plz wait, stopping ec2
stoped ec2
[bash] % bash ec2.sh
plz wait, starting ec2
http://XX.XXX.XXX.XXX/
ssh aws
running ec2
```

## 参考
### ssh.config参考
https://qiita.com/passol78/items/2ad123e39efeb1a5286b

### vscode remote-ssh参考
https://anteku.jp/blog/develop/ssh%E6%8E%A5%E7%B6%9A%E5%85%88%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%8E%A5%E7%B6%9A%E5%85%83%E3%81%AEvisual-studio-code%E3%81%A7%E9%96%8B%E3%81%93%E3%81%86%EF%BC%81/
CIってなんぞやい

#SanSanの募集要項にて
筆者は、企業の募集要項を見るのが趣味なのですが、SanSan様の歓迎条件に
###・CI環境を用いた自動化経験
とありました。
聞いた事はあったのですが、CIがどういうもの掘り下げたいなぁと思いました。
#CIとは？
CI/CDとまとめて呼ばれる事もあるようで、
Continuous Integration / Continuous Deliveryの略です。

何なのかというと、自動でテストとビルド、リリースを自動で行う手法の事です。
###以上です。
まぁ、メリットは言わずもがな。
そのツールに、JenkinsやCircleCIなどがあります。

#簡単に使ってみるか
[CircleCIの公式はんずおん](https://circleci.com/docs/ja/2.0/getting-started/?section=getting-started)

やることは、GithubのリポジトリをCircleCIと共有するみたいです。

Githubがあるとサインイン出来るので、そちらで。
そして、自動化させたいリポジトリのset up projectを押したら、言語の設定をselectしたら、config.ymlというファイルができると思います。

コンソールに戻って、Commit Runボタンを押すcircleci-project-setupというブランチが自動で作成されます。
問題なければ、マージしてセットアップ完了！？みたいです。

#終わり
取り敢えず、自動化してくれる便利な手法であるというのが分かれば取り敢えず、いいかなと。
[CIで用いられる用語をある程度まとめたので、そちらも見るといいかなと（全く参考にならんｗ）](https://qiita.com/LaO/items/f9e9baf275103d0e789c#stepscircleci)
もっと詳しい解説は、また今度！
[ドキュメントを見て出直します](https://circleci.com/docs/ja/)
Vue3 + Typescriptで環境の作成

## 参照

- [Vue3 公式ドキュメント](https://v3.ja.vuejs.org/)
    - 環境構築方法は自分の想定する組合せの解説記事を探すことをおすすめ
- [簡単な例で始めるVue3でTypeScript入門](https://reffect.co.jp/vue/vue3-typescript)
    - Vue3+Typescriptをvue-cliを使って構築※こちらの方が詳細に記載されています
- [[Youtube]Vue 3 with TypeScript Tutorial #1 - Intro & Setup](https://www.youtube.com/watch?v=JfI5PISLr9w)
    - イギリス英語
    - Vue3+Typescriptの環境設定から
    - 同一チャンネルでVue3、Typescriptのチュートリアル動画もある
    - チュートリアル自体はWindowsマシンを使用

## 記事の目的

自身がVue3+Typescriptでアプリを作ろうとしているため、
その環境構築用のメモ

## vue-cliをインストールする

typescriptベースで開発するには、vue-cilでプロジェクト作成し、その際にTypescriptを選択する必要がある

```terminal:
npm install --global @vue/cli
```

## Vueのプロジェクト作成

```terminal:
vue create vue-new-project
```

### 作成時の選択

下のような画面がでてくるので、Typescriptにチェックをいれる(Macの場合はスペースキー)

![スクリーンショット 2021-05-15 17.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336049/451800fa-9ed9-9108-c33c-e647a3f33548.png)

手元で作成した内容は下記
ターミナル上で対話型で選択してく。
3行目にTSと出力されていなかったら、Typescriptベースのプロジェクトとしては作成されないので注意

```terminal:
Vue CLI v4.5.13
? Please pick a preset: Manually select features
? Check the features needed for your project: Choose Vue version, Babel, TS, Linter
? Choose a version of Vue.js that you want to start the project with 3.x
? Use class-style component syntax? No
? Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX)? Yes
? Pick a linter / formatter config: Standard
? Pick additional lint features: Lint on save
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
? Save this as a preset for future projects? No

```


## 一番初めに出力されるファイル

```main.ts``` とエントリーポイントがtsになる

```terminal:
./vue-new-project
├── README.md
├── babel.config.js
├── package-lock.json
├── package.json
├── public
│   ├── favicon.ico
│   └── index.html
├── src
│   ├── App.vue
│   ├── assets
│   │   └── logo.png
│   ├── components
│   │   └── HelloWorld.vue
│   ├── main.ts   #ここがtsになっている
│   └── shims-vue.d.ts
└── tsconfig.json
```

また```App.vue```の中がこのようになっている。
```<script lang="ts">```となっているのがわかる。

```vue:App.vue
<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <HelloWorld msg="Welcome to Your Vue.js + TypeScript App"/>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import HelloWorld from './components/HelloWorld.vue'

export default defineComponent({
  name: 'App',
  components: {
    HelloWorld
  }
})
</script>
```

## VSCODEで使う時の拡張機能

- [Vetur Vue tooling for VS Code](https://vuejs.github.io/vetur/)
    - .vueの拡張子のファイルのシンタックスハイライト、スニペット等
【初心者でもわかる】パラメータ付きのURLをシェアする方法（PHP・JS）

#どうも7noteです。パラメータ付きのURLをシェアする方法をPHPとJavascriptでできる方法

URLをシェアする際にパラメータがついているURLだとうまくシェアできない場合があります。
そのような場合には、

**「パラメータ部分をエンコーディングする必要があります。」**

javascriptでエンコーディングする方法と、phpでエンコーディングする2つの方法があるので両方解説していきます。

## javascriptでエンコーディングしてシェアする方法

すでにQiitaで投稿されたものがあったので以下を参照ください。
丁寧にわかりやすく書かれていますよ。

https://qiita.com/kakuta_yu/items/73fa3e9c27032fa98e44

## PHPでエンコーディングしてシェアする方法

```index.php
<?php
// 現在のurlとパラメータを取得
$url = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://').$_SERVER['HTTP_HOST'];
$param = $_SERVER['REQUEST_URI'];

// パラメータをエンコーディング
$param = urlencode($param);

// urlとパラメータを接続
$href = $url.$param

?>

<!-- ツイッターのシェア -->
<a href="https://twitter.com/share?url=<?php echo $href; ?>" rel="nofollow" target="_blank"><img src="twitter.png" alt="twitterシェア" ></a>
```

## まとめ

URLシェアボタンを動的に作成する場合にも利用できます。
シェアボタンを作るときに陥りやすいトラップかなと思います。

誰かの参考になれば幸いですね。


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【AWS】インスタンスファミリーの種類

#プログラミング勉強日記
2021年5月15日
[昨日の記事](https://qiita.com/mzmz__02/items/b8711c388f29dd547166)の続きで、インスタンスファミリーについて詳細に説明する。

#インスタンスファミリー
　インスタンスの性能を決定するか・どういった目的のインスタンスを決定するかというものはインスタンスファミリーによって決まる。
　インスタンスファミリーは以下の5つの種類から選択する。

##汎用
　バランスが取れたコンピューティングで、様々なものに使うとき、ほかの4つの仕組みでやりたいものがないときなどに使われる一般的なもの。ウェブサーバーやコードレポジトリなど、インスタンスのリソースに同じ割合で使用するアプリに最適なインスタンス。
　ファミリー：A1, M5, T3など

##コンピューティング最適化
　機械学習やハイパフォーマンスコンピューティングなどの高性能なコンピューティングをEC2で実行したいときに使用する。
　ファミリー：C5, C6gなど

##メモリ最適化
　メモリ内の大きなデータセットを処理するワークロードに対して高速なパフォーマンスに最適なインスタンス。インメモリデータベースなどをEC2インスタンスを使って作りたい場合に、メモリ最適化のインスタンスファミリーを選択する。
　ファミリー：X1, R5, ハイメモリ, z1dなど

##ストレージ最適化
　ローカルストレージの大規模なデータセットに対する高いシーケンシャル読み込み・書き込みアクセスを実行できる。
　プロビジョットIOPSといったEBSのタイプと一緒に使う。高速なデータ処理をEC2サーバー上でじっこうしたいときに選択する。EBSを使って高速なシーケンシャルを回したい場合はストレージ最適化のファミリーを選択する。
　ファミリー：H1, D2, I3, I3enなど

##高速コンピューティング
　GPUやFPGAと呼ばれるCPUを使ってサーバーを立ち上げることができる。例えば、ブロックチェーンのアプリはFPGAを使って計算処理を行う、ブロックチェーンのノードを作りたい場合やGPUインスタンスでゲーミングPCみたいなものを作りたいときは高速コンピューティングを選択する。
　ファミリー：P3, Inf1, G4(CPU), F1(FPGA) など
flaskでhello worldができないときの対処

flaskでhello worldするまでのメモです。

#python hello.pyでの実行で不具合

下記のコードが突然動かなくなりました。

```hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return "Hello, World!"

if __name__ == '__main__':
    #app.run(host='0.0.0.0',port=8000)
    app.run(host='0.0.0.0')
    #app.run()
```

実行コマンド

```コマンドライン.
(pyb) $ python hello.py
```

いままで実行すると、ブラウザで見れていたのですが
突然、不具合を起こしました。
まだhelloworldとかコピペしかしてないのに…。

ググりながら、
0.0.0.0を127.0.0.1にしたり
ポートを8000にしましたが、
ダメでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694948/b1d5d971-c161-3414-0649-3c585cb3b5c4.png)

#ただ実行はされているらしい

curlでhtmlの出力を確認できるらしく、
してみるとプログラムは実行されており出力はあるようでした。

```コマンドライン.
(base) wsl_username@DESKTOP-N1RJB3Q:/mnt/c/Users/winUserName$ curl http://localhost:5000/
Hello, World!
```

ポートやアドレスの設定は詳しくないので
そこに異常があると先行きが怪しくなってくる…。

#python -m flask runで実行

マイクロソフトのサイトで確認したコマンド。

適当なディレクトリを作成し、
そのなかにhello.pyを移動させ
名前をapp.pyに変更します。


```ディレクトリ構成.
example(directory)
  |
  |___app.py
```

そのうえで、下記コマンドで実行。

```コマンドライン.
(pyb) $ python3 -m flask run
```

```実行.
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [15/May/2021 21:35:05] "GET / HTTP/1.1" 200 -
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694948/e9ba8d73-0bf0-933e-660b-1bf74e4d0452.png)

きちんと表示されました。

ですが突然、python ファイル名.py
でダメになったのかは不明です。

#FLASK_APP=hello.py FLASK_ENV=development flask runで実行できる

環境変数FLASK_APPにファイル名を指定することで
解決しました。

```コマンドプロンプト.
$ FLASK_APP=hello.py FLASK_ENV=development flask run
```


```コマンドプロンプト.
 * Serving Flask app "hello.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with inotify reloader
 * Debugger is active!
 * Debugger PIN: 169-317-205
127.0.0.1 - - [16/May/2021 12:40:40] "GET / HTTP/1.1" 200 -
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694948/e642a5e1-b59c-89d8-ca3f-96489164d809.png)

参考：

https://qiita.com/miroha-eng/items/cf446a3a012c32a6d03c
マイクロソフト
https://docs.microsoft.com/ja-jp/windows/python/web-frameworks
Powershellを一時的に管理者権限で使用する

# 定常業務の自動化をPowershellに
業務では、客先の環境やテスト環境などで自由にソフトウェアをインストールできないことが多々あると思います。
そこでCUIを使用して定常業務を自動でやってもらおうとしても、bat ではやれることが少なかったり、難しくなったりします。
しかし、最近のWindowsでは Powershell が標準で入っていて、.NETを使用してCUIで高度な処理ができるようになりました。

# Powershellを業務で使用する時の制約
Powershell は高機能故に実行権限に厳しくなっており、標準のまま実行しようとすると管理者権限がないと警告されて実行できないことが多いです。
しかし、業務環境ではシステムの設定を変更するわけにもいかず。。。という時、
実行するものに限り一時的に管理者権限に昇格することが可能です。

# Powershellの実行権限を一時的に管理者にする
```powershell:hello.ps1を管理者権限で実行
powershell -ExecutionPolicy Bypass .\hello.ps1
```

※powershellのパラメータについては、以下が参考になるとおもいます。
[PowerShellのExecutionPolicyのスコープとかについて詳しく](https://qiita.com/kikuchi/items/59f219eae2a172880ba6?utm_source=stock_summary_mail&utm_medium=email&utm_term=hiyono&utm_content=PowerShell%E3%81%AEExecutionPolicy%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%A8%E3%81%8B%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%A9%B3%E3%81%97%E3%81%8F&utm_campaign=stock_summary_mail_2021-05-15)

上記コマンドはbatからも実行可能です。
定常業務などではbatからのほうが扱いやすい場合が多いので、batを予め作成しておくと便利です。
そのテンプレートをアップしましたので、よかったらお使いください。

https://github.com/hiyono/PowershellStartupBat
zxを使いApp engineの古いバージョンを都度削除しつつデプロイする

# 背景
App engineでデプロイしまくると、古いバージョンのサービスが乱立して料金がかかる。なのでデプロイするたびに古いバージョンを削除すると理想的だ。

# 手法
shellで書いたりpythonクライアントを書いたりすればかけるが、shellは柔軟性に乏しく配列とかが書きづらい。pythonは柔軟だが、shellほど簡単にはかけない。
そこで、2021年5月にリリースされた[zx](URL "https://github.com/google/zx")を用いて書く。これによりjavascriptのPromise等を使い、柔軟にshellが書ける。

# コード
`deploy.mjs`

```javascript
#!/usr/bin/env zx

// 最初にデプロイする
await $`gcloud app deploy --quiet --project=XXX`

// 次に最新のデプロイ以外をすべて削除する
let versions = await $`gcloud app versions list --project=XXX | sed 's/  */:/g' | cut -f 2 -d : | tail -n +2 | ghead -n -1`
console.log("---")

versions = versions.toString().split("\n") // makes array
versions.pop() // removes last blank element created by new line
console.log(versions)

await Promise.all(versions.map(version =>
    $`gcloud app versions delete ${version} --project=XXX`
))
console.log("done!")
```
# 実行方法(Mac)
```shell
chmod +x deploy.mjs
./deploy.mjs
```
【ReactNative】multilineを有効にしたTextInputを使うとKeyboardAvoidingViewが無効になる問題

# 事象
- `KeyboardAvoidingView`内の`TextInput`で`multiline`(複数行入力可能)を有効にした場合、iOSでキーボードを表示した時に自動スクロールしてくれない
  - Androidでは期待通り動作している

# 環境
- ReactNative - 0.64.0
- Xcode - 12.4

# 解決策
- `TextInput`に`scrollEnabled={false}`を設定する
  - TextInputのスクロールが親Viewのスクロールに干渉しているため？

## 参考
- [KeyboardAvoidingView has no effect on multiline TextInput](https://github.com/facebook/react-native/issues/16826)
Ubuntu 18 で GitHub Desktop をインストールする

###Ubuntu 18 で GitHub Desktop をインストールする

この[ページ](https://github.com/shiftkey/desktop/releases)にアクセスします

https://github.com/shiftkey/desktop/releases

Assetのところをクリックし、AppImageをダウンロードする
<img width="600" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/15cde49e-8d17-aa83-b540-504bd145248f.png">

AppImageのプロパティからプログラムとして実行可能にチェックを入れる
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/031b10bd-21c3-70bf-9e23-7aebab03523d.png">

AppImageをクリックするとアプリが立ち上がります
<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/8ca9d429-6b9a-79c4-6d27-2a425abbd78c.png">
pyenvが動かなくなった

pyenvをupdateしたら、以下のメッセージが出てsystemのpythonが使われるようになった。

``` bash
WARNING: pyenv init - no longer sets PATH
```

以下のサイトを参考に設定を変更した。

https://github.com/pyenv/pyenv/issues/1915

``` bash:/etc/profile.d/pyenv.sh
eval "$(pyenv init --path --no-rehash)"
# eval "$(pyenv init - --no-rehash)"
```
GAS フォルダの中にあるファイル更新日が特定日以降のZipファイルを解凍する

###Google Apps Scriptでのフォルダ操作やファイル操作についてのTipsです
こんにちは。システムエンジニアのDiavoloです。
現在のお仕事では、様々な機器やサーバ等が出力するログファイルを処理して集計する機会が多いです。
Gooleドライブにログファイルが保存してある場合に作成したGoogleAppsScriptを備忘録として記事にします。



###例として2021年04月01日以降に更新されたファイルを解凍するGASです

```JavaScript
function myFunction() {
  //フォルダの中にあるファイル一覧を取得する
  const files = DriveApp.getFolderById('フォルダid').getFiles();

  while(files.hasNext()){
    const file     = files.next();
    const filename = file.getName();
    const filetimestamp = file.getLastUpdated();
    
    if(fileDateCompare(filetimestamp,new Date('2021/04/01')) == 1 ){
    {
       console.log(filename);
       
       //ファイル名に.zipを含むファイルだけ解凍する
       if(filename.match(/.zip/)){
         var zipblob      = file.getBlob().setContentType("application/zip");
         var unZippedfile = Utilities.unzip(zipblob);
         var folder       = DriveApp.getFolderById(targetId);
         folder.createFile(unZippedfile[0]);
      }
    }
  }
}
function fileDateCompare(date1,date2){
  if(date1 >= date2){
    return 1;
  }
  else{
    return 0;
  }
}
GAS フォルダの中にあるファイル更新日が特定日以降のファイル一覧を取得する

###Google Apps Scriptでのフォルダ操作やファイル操作についてのTipsです
こんにちは。システムエンジニアのDiavoloです。
現在のお仕事では、様々な機器やサーバ等が出力するログファイルを処理して集計する機会が多いです。
Gooleドライブにログファイルが保存してある場合に作成したGoogleAppsScriptを備忘録として記事にします。
###例として2021年04月01日以降に更新されたファイル一覧を取得するGASです

```JavaScript
function myFunction() {
  //フォルダの中にあるファイル一覧を取得する
  //この時点でfilesにファイルリストがセットされり
  const files = DriveApp.getFolderById('フォルダid').getFiles();

  //ファイルリストからファイルオブジェクトを一つずつ取得して処理する
  while(files.hasNext()){
    const file     = files.next();               //ファイルオブジェクト取得
    const filename = file.getName();             //ファイル名取得
    const filetimestamp = file.getLastUpdated()  //ファイルの最終更新日を取得する
    //ファイルのタイムスタンプを比較する
    if(fileDateCompare(filetimestamp,new Date('2021/04/01')) == 1 ){
    {
       console.log(filename);
    }
  }
}
function fileDateCompare(date1,date2){
  //date1：ファイル更新日 date2：比較する特定日
  if(date1 >= date2){
    return 1; // 特定日以降に更新されたファイル
  }
  else{
    return 0; // 特定日よりも前に更新されたファイル
  }
}
GAS フォルダの中にあるファイル一覧を取得する

こんにちは。システムエンジニアのDiavoloです。
現在のお仕事では、様々な機器やサーバ等が出力するログファイルを処理して集計する機会が多いです。
Gooleドライブにログファイルが保存してある場合に作成したGoogleAppsScriptを備忘録として記事にします。

###Google Apps Scriptでのフォルダ操作やファイル操作についてのTipsです

```JavaScript
function myFunction() {
  //フォルダの中にあるファイル一覧を取得する
  //この時点でfilesにファイル一覧がセットされている
  const files = DriveApp.getFolderById('フォルダid').getFiles();

  //ファイル一覧をループする
  while(files.hasNext()){
    const file     = files.next();   //ファイルオブジェクトを取得する
    const filename = file.getName(); //ファイル名を取得する
    console.log(filename);           //コンソールログに出力する
  }
}
Linux で IPv6アドレスのインタフェース部分を任意の値に設定する

# この記事の概要

- フレッツ光のHGW配下に設置したLinuxサーバに、NGN網内からアクセスできるようにIPv6アドレスを以下のように設定したかったが、思った以上に躓いた。その時の解決策のメモ
    - 前半64Bit、プレフィックス部分：フレッツ光でもらえるアドレス（2408:210:XXX・・・）
    - 後半64Bit、インタフェース部分：わかりやすい任意の数字（::100、::2222） 
- 本記事のOSは「Ubuntu 18.04」で実験した

# 試行錯誤の過程

- 筆者の構築したUbuntuサーバは、なぜか```/etc/netplan```などの設定ファイルもそもそも無ければ、無理やりGUI（デスクトップ）で起動・設定しても、NetworkManagerをいじり倒しても、うまくいかなかった
    - 通常、リンクローカルを手動設定すれば、当該IFのプレフィックスが自動で設定されるはずである
    - 例えば、筆者の大好きなCiscoルータであれば、以下のような設定である。
    
```
interface GigabitEthernet0
 ipv6 address autoconfig default
 ipv6 address FE80::100 link-local
```


# 最終的な解決策

- IPv6アドレス設定をNetworkManagerで「自動」に設定した上で、以下のコマンドを打てば設定できた。どうやら、Linuxには「IPv6トークン」なる概念があるようだ
    - Ciscoルータにも、そのような設定が暗黙的にあるのかも。。
    - 入力したいプレフィックスには「::100」のように入れればよい

```
nmcli c m "<IF名>" ipv6.token <入力したいプレフィクス>
```

# エラーが出た場合

- 筆者の環境では、以下のようなエラーが出た

```
# エラー: 接続 '<IF名>' の変更に失敗しました: ipv6.token: EUI64 アドレス生成モード でのみ、意味が通じます
```

- そんなときは、SLAACのモードを変えると解決する

```
nmcli c m "<IF名>" ipv6.addr-gen-mode eui64
```

- IPv6は奥が深い、、


# 参考記事

https://docs.oracle.com/cd/E19253-01/819-0380/gbvsf/index.html
https://manual.sakura.ad.jp/vps/network/ipv6/ubuntu18.html
https://qiita.com/maccadoo/items/84c8ebaa4ad541ccea3b
https://ktaka.blog.ccmp.jp/2020/05/linuxslaac-ipv6.html

以上
【React】next.jsでホームページを設定する方法

# はじめに
ホームページの設定を自由に出来る方法を調べました。

# 方法

#### リダイレクト先を設定する
next.config.jsにて、以下のように設定します。
ホームページにアクセスしたときに、設定したページにリダイレクトされるようになります。

```next.config.js
module.exports = {
  async redirects() {
    return [
      {
        source: '/about', //リダイレクト先
        destination: '/', //リダイレクト元
        permanent: true,
      },
    ]
  },
}
```

#### Reactを再起動
再起動して、ホームページにアクセスすると、
指定したページにリダイレクトされるようになっています。

# 参考文献
https://nextjs-ja-translation-docs.vercel.app/docs/api-reference/next.config.js/redirects
Salesforce_Platform デベロッパー知識点

<B>Platform デベロッパー</B>
　Lightningプラットフォームのプログラミング的機能を使用した基本のビジネスロジックおよびユーザインターフェースの開発とリリースの経験があり、後述の試験範囲に示すスキルおよび概念を実践的に応用したことがある方を対象としています
開発者として1年から2年かつ、Lightningプラットフォームの6ヶ月以上の経験がある人に向けた資格です。
この資格の取得者には以下のスキルや知識や経験があることが認定されます。

<B>スキル</B>

・Lightningプラットフォームの基本的なプログラミング機能を使用してSalesforceの機能を拡張するカスタムインターフェースやカスタムビジネスロジックを開発できる
・ApexとVisualforceを使用してLightningプラットフォームを拡張できる
・プラットフォームの関連する宣言的機能に精通し、必要に応じて活用できる

<B>知識</B>
・Lightningコンポーネントについての知識
・宣言的方法とプログラミング的方法を使用するケースの相違点の知識
・開発からテストまでの開発ライフサイクルの知識
・Salesforceモバイルアプリケーション機能とLightningフレームワークの基礎知識
・LightningプロセスビルダーとApexトリガを使用するケースの相違点の知識

<B>経験</B>
・Java、JavaScript、C#、Ruby、NETなど、オブジェクト指向言語に関する経験
・データ駆動型のアプリケーションとリレーショナルデータベースに関する経験
・MVC(モデルビューコントローラ)アーキテクチャとコンポーネントベースのアーキテクチャに関する経験

<B>認定上級Platform デベロッパー</B>
「Platformデベロッパー」の上位資格です。
開発者として2年から4年、Lightningプラットフォームに1年以上の経験がある人に向けた資格です。
この資格の取得者には以下のスキルや知識があることが認定されます。

<B>スキル</B>
・プラットフォームを拡張/カスタマイズする特定のビジネス課題/プロセス要件を満たす適切なソリューションを定義できる
・カスタムユーザインターフェースの構築ができる
・Lightningコンポーネントフレームワーク、高度なVisualforce、中程度のJavaScriptを使用して、Salesforceデータの操作ができる
・データセットの大きさに合わせて処理するApexコードを開発できる
・カスタムアプリケーションをリリースできる
・Salesforceデータモデリング、インターフェース設計、コード開発、テストの基本指針とベストプラクティスを理解し、これらの指針を実際の開発環境に適用できる
・宣言的およびプログラミング的手法を使用して、複雑な共有モデルを設計して実装できる
・一般的なWebおよびSalesforce固有のセキュリティ上の懸念事項を理解し、ベストプラクティスを適用できる
・アプリケーションコンポーネントについて十分な品質(コードカバー率、アプリケーションの動作、拡張性、環境の独立性など)を保証するテスト計画を設計して実装できる
・一括処理、スケジュール、@futureなどの非同期プログラミングを理解して使用できる
・Apex SOAPおよびREST Webサービス、SOAPおよびRESTを使用したApexからの呼び出し方法を理解して使用できる
・様々なプログラムコンテキストにおけるエラーおよび例外処理の適切な手法を理解して適用できる
・トリガの開発、デザインパターン、その他ロジックの開発と再利用に関するベストプラクティスを実装できる
・LightningページとクイックアクションにLightningコンポーネントを表示する方法を知っている

<B>知識</B>
・Lightningプラットフォームの宣言的およびプログラミング的機能に関する知識
・プラットフォームの動作、制限、パフォーマンスに関する考慮に関する知識
・一般的なWebおよび Salesforce 固有のセキュリティ上の懸念事項に関する知識
・Salesforce 開発ライフサイクルへの幅広い理解
・すべてのリリースツールを理解し、各ツールを適用するケースの把握
・Visualforceページを調整することができ、コントローラ設計のパフォーマンスに与える影響への理解
【Python】膨大な通信ログの調査依頼を自動化してみた

<h2>このプログラムの趣旨</h2>
このプログラムは、膨大なログの中から任意のIPアドレスを探し出すプログラムです。

<h2>プログラム作成の背景</h2>
・お客さんから特定の通信先(複数個)とのログがないか確認して欲しいと依頼を受ける。
・対象のログフォルダを確認してみると、1ファイルあたり数千行のログファイルが数千個存在。
・手作業でのログ調査をあきらめ、空を見上げる。
・Python触ったことあるし、なんとかしてプログラムで出来ないものか考えてみる。
・作ってみた。

<h2>プログラム処理のざっくり概要</h2>
・特定のフォルダ内のファイルを時系列順にソート
・ファイルを1つずつ読み込み、リスト化する
・確認したいIPアドレスと、リストの中身を比較する
・リスト内にあれば、見つかった旨をCSVに書き込む

<h2>プログラムの中身</h2>
```log-finder.py
import glob
import csv
import os
import re

'''
「XXXX」フォルダに入っているログに
任意のIPアドレスとの通信がないか確認するプログラムです。

検索したいIPアドレスリストは、「ipaddress_list.csv」に記載してください。

フォルダ構造は以下の通りです。
--XXXX
    |--検索に使用するログファイルたち
--本プログラム
--ipaddress_list.csv

'''

#ファイルの最終更新時刻順にソートする
files = sorted(glob.glob("XXXX"), key=lambda f: os.stat(f).st_mtime, reverse=False)

# フォルダ内のコンフィグを1個ずつ見ていく
for file in files:
    # result.csvに書き込むための定義
    with open('result.csv','a', newline='') as result_csv:
        
        # 検索しているファイル名の表示
        print(file + 'で検索しています･･･')

        # 検索しているファイル名をCSVに書き込み
        writer = csv.writer(result_csv)

        # コンフィグを読み込んで、スペース区切りでリスト化
        with open(file, mode='r', newline='', encoding='shift-jis', errors="ignore") as config_file:
            lines = [line for line in config_file]
            print('ログファイルを読み込みました')

            # リストを全部結合する
            total_line_list = ''
            for line_list in lines:
                total_line_list += line_list

            # リスト内の要素を区切り文字で区切る
            split_line_list = re.split(' |=|\r\n',total_line_list)
            # print(split_line_list)

        # 検索したいIPリストを記載したCSVファイルを読み込む
        with open('ipaddress_list.csv') as f:
        #csvファイルを2行目から読み込み(ヘッダースキップ)
            reader = csv.reader(f)
            next(reader)
            serch_ipaddress = ''

            for row in reader:
                # 確認したいIPアドレスをリスト化
                serch_ipaddress = row
                
                # リストを文字列に変換
                mapped_ipaddress = map(str, serch_ipaddress)
                string_converted_ipaddress = ','.join(mapped_ipaddress)

                # IPアドレスがコンフィグ内に存在するか確認
                if string_converted_ipaddress in split_line_list:
                    writer.writerow([file + 'で' + string_converted_ipaddress + 'が見つかりました'])
                else:
                    pass
    
        writer.writerow([file + 'での検索が完了しました'])
```
※もっときれいなコードの書き方あるかもしれないけど、部署内にコーディングできる人がいないので完全に自己流です。

```ipaddress_list.csv
探したいIPアドレス(この行の読み込みはスキップされます)
192.168.0.1
192.168.0.2
```

```プロンプト画面.
ログファイルを読み込みました
{ログファイル#1}で検索しています･･･
ログファイルを読み込みました
{ログファイル#2}で検索しています･･･
ログファイルを読み込みました
{ログファイル#3}で検索しています･･･

```

```result.csv
{ログファイル#1}での検索が完了しました
{ログファイル#2}での検索が完了しました
{ログファイル#3}での検索が完了しました
{ログファイル#3}で192.168.0.1が見つかりました
```

あとはこれをpyinstallerでexeファイルにして、1クリックで実行できるようにしたら完了。

同じ依頼が数か月後も来たため、プログラム作成しておいてよかったと心の底から思ったのでした。
Qiita/Githubの画像サイズをワンタッチで変換するアプリ マウス操作不要(mac)

## Qiita/Github記事の画像サイズをワンタッチ変換
####アプリ概要
Qiita/Githubのマークダウンでは
 `![ファイル名](アドレス)`
で画像を埋め込むことができますが，サイズを変更したい場合は
`<img src="ファイル名" width="400">`
といったタグに変換する必要があります．
これが地味にめんどくさいので，この作業をマウス操作不要な簡素なアプリにしました．

[qiitaImgSizeChanger universal(Intel / Apple Silicon)](https://github.com/STrizzle-Naoki/QiitaImgSizeChanger/releases)
※テスト環境はM1 Macbook pro, macOS Big Sur 11.3

####動作見本
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465632/16d9343d-7145-cac6-b0ef-7a9a71f36df1.gif" alt="ezgif-7-651fb09d4b33.gif">

####操作パターン
1. ⌘+C 1回　→ \<img src width> タグを作成してクリップボードにいれます．手動で貼り付けてください
1. ⌘+C 2回　→ \<img src width> タグを作成して自動で貼り付けまで行います
1. (option) ⌘+C 1回で貼り付けまで行うオプションあり

**2.と3.を使用するにはアクセシビリティでアプリを指定する必要があります**
（初回使用時にダイアログが出ます）
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465632/e090d7a3-2290-6750-d420-d201c8adb32a.png" alt="image.png">

コードの変換にマウス操作不要のアプリにしたかったので，widthを画像毎に変更したりはできません．
初期値だけは変更可能です．
コード変換を簡単にすることが目的なので，細かい指定は貼り付けてからタグを変更するので十分だと思っています．
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465632/56730413-b8c9-d295-0354-799c4114c785.png" alt="image.png">

よろしければ使ってみてください．
カスタマイズしたい場合は，以下にソースコードを置いておきますのでご自由にお使いください．

アプリアイコン募集中です．（人任せ）

####ソースコード

https://github.com/STrizzle-Naoki/QiitaImgSizeChanger
winのコマンドプロンプトでlinuxコマンドを使う

コマンドプロンプトでwslとすると
linuxのコマンドが使えます。

```コマンドプロンプト.
C:\Users\UsersName> wsl
wsl_username@DESKTOP-N1RJB3Q:/mnt/c/Users/UserName$

```

dirではなくlsが使えるので楽です。
SwiftUI 金銀銅 をコードで表現する

# はじめに
日本中が東京オリンピック応援ムードで大盛り上がり。
街行く人達の話題も五輪のテーマで持ちきりです。
どの選手がメダルを取るのか、今から超楽しみで夜も眠れません😂
さて, そんな景気の良い日本を後押しすべく **iOSアプリ でも 金色, 銀色, 銅色 を使いたい、** だからこそ **SwiftUI で Gold, Silver, Bronze を使っていきたいんです。**

![GSVImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/53162f75-b423-dc5c-372f-ffda77cbdbac.png)

# 使い方
色を塗りたい **View** に対して  ```.shine(ShineColor)``` を付加します。

- 金色: ```.shine(.gold)```
- 銀色: ```.shine(.silver)```
- 銅色: ```.shine(.bronze)```

```Sample.swift
// 例: 金色のテキスト "GOLD"
Text("GOLD")
    .shine(.gold)

// 例: 銀色の四角形 ■
Rectangle()
    .shine(.silver)
```

# コピペ用コード

丸々コピペして、プロジェクト内のどこかにおいて下さい。

```ShineColor.Swift
import SwiftUI
enum ShineColor {
    case gold
    case silver
    case bronze
    var colors: [Color] {
        switch self {
        case .gold: return [ Color(hex: 0xDBB400),
                             Color(hex: 0xEFAF00),
                             Color(hex: 0xF5D100),
                             Color(hex: 0xE0CA82),
                             Color(hex: 0xD1AE15),
                             Color(hex: 0xDBB400),
        ]
        case .silver: return [ Color(hex: 0x70706F),
                               Color(hex: 0x7D7D7A),
                               Color(hex: 0xB3B6B5),
                               Color(hex: 0x8E8D8D),
                               Color(hex: 0xB3B6B5),
                               Color(hex: 0xA1A2A3),
        ]
        case .bronze: return [ Color(hex: 0x804A00),
                               Color(hex: 0x9C7A3C),
                               Color(hex: 0xB08D57),
                               Color(hex: 0x895E1A),
                               Color(hex: 0x804A00),
                               Color(hex: 0xB08D57),
        ]}
    }
    var linearGradient: LinearGradient
    {
        return LinearGradient(
            gradient: Gradient(colors: self.colors),
            startPoint: .topLeading,
            endPoint: .bottomTrailing
        )
    }
}
extension View {
    func shine(_ color: ShineColor) -> some View {
        ZStack {
            self.opacity(0)
            color.linearGradient.mask(self)
        }.fixedSize()
    }
}
fileprivate extension Color {
    init(hex: UInt, alpha: Double = 1) {
        self.init( .sRGB,
                   red: Double((hex >> 16) & 0xff) / 255,
                   green: Double((hex >> 08) & 0xff) / 255,
                   blue: Double((hex >> 00) & 0xff) / 255,
                   opacity: alpha )
    }
}
```

# さいごに
不要不急の外出は控えましょう。
Optunaで乱数シードを固定する方法

# 概要
Optunaはベイズ最適化を利用した最適化ライブラリで、
その性能とAPIの使い勝手の高さから、機械学習の**パラメータチューニング**等でよく利用されています。

このOptuna、以下の現象に困った経験のある方も多いかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/45fca2e1-6f57-7f18-81b6-c7983430bd86.png)
そう、**繰り返すと結果が変わってしまう**ことです！

繰り返しても同じ結果とするためには、**乱数シードを固定**する必要があります。
本記事ではその方法を解説します

# なぜ結果が変わる？
Optunaでは最適化の過程で乱数を利用しており、
回ごとに乱数がランダムに変わるので、最適化の結果も変わってしまいます。

生成される乱数の値を回によらず同じとするためには、**乱数シード**を固定する必要があります。

# 乱数シードの固定方法
以下のように、
**・create_studyメソッド実行時の引数"sampler"にサンプラーを指定**
**・サンプラーの"seed"引数に、乱数シード（42がよく使われる）を指定**
すれば乱数シードが固定され、繰り返しても同じ結果となることが保証されます。

```python:サポートベクターマシンでの指定例
import optuna
import seaborn as sns
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
iris = sns.load_dataset('iris')
model=SVC()
X = iris[['petal_width', 'petal_length']].values
y = iris['species'].values
# 最適化の目的関数
def objective(trial):
    params = {
        "gamma": trial.suggest_float("gamma", 0.001, 100, log=True),
        "C": trial.suggest_float("C", 0.001, 100, log=True)
    }
    model.set_params(**params)
    scores = cross_val_score(model, X, y, cv=5,
                             scoring='accuracy', n_jobs=-1)
    return scores.mean()
# create_studyメソッドの引数"sampler"にサンプラーと乱数シード42を指定
study = optuna.create_study(direction="maximize",
                            sampler=optuna.samplers.TPESampler(seed=42))
study.optimize(objective, n_trials=40)
```

なお指定するサンプラーですが、[公式ドキュメントを見ると](https://optuna.readthedocs.io/en/stable/reference/generated/optuna.study.create_study.html#optuna.study.create_study)
・目的変数が1次元のとき："optuna.samplers.TPESampler"
・目的変数が2次元以上のとき："optuna.samplers.NSGAIISampler"
をデフォルトのサンプラーとして利用するようです。

特にサンプラーの種類をデフォルトから変える気がなければ、上記のサンプラーを"sampler"引数に指定すれば良いです。

# 注意：optuna.samplers.RandomSamplerを指定したとき
ネットを見ると、

「ランダムシードを固定するにはサンプラーoptuna.samplers.RandomSamplerの引数にseedを指定すれば良い」

という記事がいくつか見付かりましたが、
試してみたところ、下図のように**ランダムサーチが実行されている**可能性が高そうです

**・irisデータでSVMのパラメータをOptunaでチューニングしたときの結果**
（色が濃いほどスコアが良い）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/2c742c3c-7798-471a-347e-645c51d4cd56.png)
少なくとも**RandomSamplerを指定した場合はベイズ最適化とは思えない探索**をしていそうなので、TPESamplerを指定した方が良いかと思います。
Salesforce_ワークフロー業務向け編

<B>ワークフローは何ですか</B>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1479808/d629425a-33e2-560f-0fcc-fb129ca6da40.png)
　<B>プロセス自動化</B>と認識しています。
　ビジネスプロセスを自動化することで、より業務の効率化が図れます。
　たとえば、
　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1479808/4c42c8ea-faec-98cc-e37f-296d326faaca.png)「契約更新の案内」を顧客に送りたいとします。
これを期限の1週間前までに送信したい時、社員がひとりひとりメールを作成するのは非効率的です。
しかしワークフローを使えば「契約更新1週間前にメールを自動送信する」という設定が可能で、自動的に顧客にメールが送られます。ワークフローを使うことで、業務を効率化できるので、Salesforce運用時には必要なスキルといえます。

ここではワークフローを使った<B>事例</B>を紹介します。
・商品の出荷が遅れた場合に出荷ステータスを更新する
　出荷が予定納期を超えているのに顧客に届いていない場合、「遅延」にステータスを変更します。
・新しいユーザーを自動的にアクティブにする
　新しいユーザーがSalesforceにログインする時に、自動的にアクティブ化します
・デフォルトで商談名を設定する
　各商談のデフォルト名を自動化したい場合は、ワークフロールールを作成することで適用されます。
・商談終了日を上書きする
　商談を作成したあと、四半期の終了から6ヶ月までデフォルトの終了日を上書きできます。
・見積もり品目の割引が40％を超えた際に通知する
　営業担当者が40％を超える見積もり品目の割引を適用する場合に、電子メールのアラートを送信するようにできます。
・連絡先の誕生日のリマインダーを設定する
　顧客は誕生日に特別なサービスをされたり、連絡が来たりしたら嬉しく感じることが多いです。
　ワークフローでは、連絡先の誕生日の2日前に連絡先に自動でメールを送信できます。
・アカウント所有者の変更について通知する
　アカウントの所有者が変更された場合、そのことを主要な人物に通知できます。

workflow是什么呢
　就是业务程序自动化,可以提高业务的效率。

　分享几个实例
　　1,发货延迟的时候，货物record得状态更新成延迟
　　2，新的用户有效化
　　3，商谈最新数据得自动命名
　　4，商谈最终确定的时候，日期得更新
　　5，商品超过百分之40的打折率，自动给指定用户送信
　　6，客户的生日设定之后，定期给客户送优惠信息
　　7，数据更新时候，给所有者发通知。
グラフを描画する（Svelte × Chart.js）

# 概要

svelteベースのアプリケーションで、chart.jsを使ってグラフを描画してみたのでメモ

# 依存ライブラリ

ライブラリとそのバージョンです

```json:package.json
{
  ...
  "dependencies": {
    "chart.js": "2.8.0",
    "sirv-cli": "^1.0.0",
    "svelte-spa-router": "^3.1.0"
  }
}
```

chart.jsは3系が最新のようですが、なぜか2系に下げたらうまく動きました…

# 実装

```html
<script>
    import {Chart} from "chart.js";

    // 本来API等で取得したものをデータとして使うが、ここではサンプル値を
    let chartData = {
        labels: ["January", "February", "March", "April", "May", "June", "July"],
        datasets: [
            {
                label: "Sample",
                backgroundColor: "rgb(255, 99, 132)",
                borderColor: "rgb(255, 99, 132)",
                data: [0, 10, 5, 2, 20, 30, 45]
            }
        ]
    }
    import { onMount } from 'svelte';

    let chartCanvas;

    function renderChart() {
        let chart = new Chart(chartCanvas, {
            type: "line",
            data: chartData,
            options: {}
        });
    }

    onMount(renderChart)

</script>

<h3>Chart sample.</h3>

<!-- bind:thinでelementを変数に格納できる（document.getElementByIdをしなくて済む） -->
<canvas bind:this={chartCanvas}></canvas>
```

# 参考

https://svelte.dev/repl/1daa247f8df74c47906e97f7e344a14e?version=3.24.0