OmniAICreator/Qiita-1.07M huggingface dataset:
IFTTTを使用したLine bot→Slackの連携方法 

この記事は[株式会社パーソンリンクアドベントカレンダー](https://qiita.com/advent-calendar/2020/personlink-new)22日目の記事です。
弊社では社内活動の一環として、新しい技術や知見を得るために技術研究を行っております。今回は私の携わったチームで行った「IFTTTを使用したLinebot→Slackの連携方法」について書きます。

## はじめに
下記の要件で構成します。

- Linebotでメッセージの受信を検知した後、Slackに受信の通知を行う。
- フローは、LINE → IFTTT → Slackとする。
- Slackへのメッセージ内容はIFTTTで設定し、定型文とする。（Lineからの値は取得しない）

![flow_linebot_w.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314996/de794274-b110-17ab-6109-c7ec6a762355.png)

## 構築手順
### IFTTTとSlackの設定
1.[IFTTT](https://ifttt.com/)にログインし、右上メニューの「Create」から連携の仕組み（Applets）を作成する。
2.「If This」にトリガーとなる「Webhooks」を検索して選択する。設定の中の「Event Name」に任意の名前をつけ、Create triggerをクリックする。
3.SlackとIFTTTのアカウントを連携する。連携手順は下記の公式サイトの通り行う。
　[Slack 対応 IFTTT \| Slack](https://slack.com/intl/ja-jp/help/articles/360002091107-Slack-%E5%AF%BE%E5%BF%9C-IFTTT)
4.Appletsの「Then That」にSlackを検索し、選択する。Slackの設定内容は以下の通り行う。
   「Which channnel?」：通知を送信したいSlackのチャンネルを指定
   「Message」：送信メッセージの内容を記述
   「Title」：送信メッセージのタイトル名(オプション)
＊送信するチャンネルは、自分のアカウントの権限で許可されたチャンネルのみ選択が可能。
＊その他オプションは必要に応じて設定する。
5.上記の設定を完了後、「Create action」をクリックし、Appletsが作成される。

### Lineの設定
1.IFTTTで作成した「My Applets」を開き、Webhooksの「Documentation」を開く。下記のリンクに表示される。
　[Webhooks works better with IFTTT](https://ifttt.com/maker_webhooks)
2.Webhooksの「Documentation」を開き、{event}にIFTTTのWebhookで設定した「Event Name」を入力し(下記では、linebot)、WebhookのURLをコピーする。下記画像参照。
![IFTTT_webhook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314996/3cdbc170-e462-2167-d1a0-e338a6b736a5.png)
3.LineのOfficial Account Managerにアクセスし、設定>応答設定を開く。
応答モード：Bot、Webhook：オンに設定する。下記の画像を参照。
＊応答モードは、Botに設定する必要があり、チャットの場合Webhookが利用できない。
![Line_official_account_manager_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314996/d6313217-a86c-019a-d7a0-ec58d82be0f9.png)
4.設定>Messaging APIを開く。Webhook URLにIFTTTのWebhooksで取得したURLを貼り付け、保存する。
![MessagingAPI_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314996/2288630e-e3fd-3919-ab6f-662d41824777.png)
5.以上でLine側の設定は完了。

## 動作確認
Linebotに対して、Lineからメッセージを送信すると、Slackに通知があったことを知らせるメッセージが送信されます。

1.Linebotにメッセージを送信する。
![lineスクショ_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314996/b5a799cd-bedb-d742-2830-728345e5972d.png)
2.Slackに通知のメッセージが届く。
![slackスクショ_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314996/4b13599e-b98d-2f59-f70f-0123e6b9fede.png)

### 設定で確認するところ
- Slackで受信するメッセージの内容は、IFTTTのMy Applets>Settingsから変更ができる。
- Slackで通知が受信できない場合は、下記の点を確認する。
 - IFTTTのThisで設定したWebhookのEvent NameとWebhooks URLのevent部分が一致している。
 - SlackのAppの中にIFTTTか表示されている（正しくインストールされている）。

「IFTTTを使用したLinebot→Slackの連携方法」は以上となります。

### 参考
構築を行うに当たり、下記の記事を参考にさせて頂きました。
[LINEにメッセージが届いたら指定のメアドに通知する（その2） – チラシの裏](https://www.takosuke.net/line%E3%81%AB%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%8C%E5%B1%8A%E3%81%84%E3%81%9F%E3%82%89%E6%8C%87%E5%AE%9A%E3%81%AE%E3%83%A1%E3%82%A2%E3%83%89%E3%81%AB%E9%80%9A%E7%9F%A52/)
[LINEをトリガーに家のGoogleHomeを喋らせる \- Qiita](https://qiita.com/ktetsuo/items/5cd3cc72f18fa885affd)
【Rails6】form_withについて

#はじめに

Railsにてポートフォリオ作成中です。今回は何かしらのフォーム（投稿やログイン）で使用している、form_withについて、改めて復習をしたいと思います。

#環境

Ruby 0n Rails '6.0.0'
Ruby '2.6.5'

#form_withとは？

アプリケーションを使用するクライアントがリクエストを送るために使用するヘルパーメソッド。form_withを使うことにより、簡単に入力フォームに必要なHTMLを作成することができる。
Rails5以前では、rails_forやrails_tagなどもあったみたいですが、現在はform_withの使用が推奨されているみたいです。

#使用方法

大きく分けて2つの使用方法があります。

```ruby:①hoge.html.erb
<%= form_with url: posts_path, method: :post, local: true do |form| %>
  <%# フォームの内部 %>
<% end %>
```

```ruby:②hoge.html.erb
<%= form_with(model: @tweet, local: true) do |form| %>
  <%# フォームの内部 %>
<% end %>
```

違いは、URLを指定しているか、モデルを指定しているかの違いです。対応するモデルがあり、データベースに保存する場合は②の「model」を使用し、モデルクラスのインスタンスを指定することで、送信された情報がデータベースに保存できます。
また、対応するモデルがない場合は①「url」を使用することで、指定したパスに情報を送信することができます（データベースへの保存はされない）。

#local_trueってなに？？

先ほどの例でも記載していますが、form_withの中に「local_true」の記述があります。記述があるときとないときの違いがわかっていなかったので、記載します。

**local: trueの役割**
👉form_withではデフォルトでajax通信が行われる仕様のため、「local: true」を使用し、ajax通信をキャンセルしている。

つまり、非同期通信でコメント機能などを作成するときには投稿フォームには「local: true」を付けずに、HTML通信を使用してフォームの内容を送信する場合には「local: true」を付けるということですね！！！

#おわりに

今回はこちらの記事を参考にしました。
https://pikawaka.com/rails/form_with
ありがとうございました。
①ECサイト用にDB構築とフォルダ作成

2020/12/22

ECサイトの構築、ようやく着手をはじめました。
自戒も込めて日付を明記して投稿することにします。


①サイトの完成形イメージ：
・サイトとしての体裁をHTML, CSSで整えて
・自分が登録した商品(まずは10商品くらい)
・に対して新規登録 / ログインしたユーザーが
・買い物カゴに商品を入れて
(↓　ここからのイベントはログイン状態でないとできない)
・決済方法を選択して
・購入完了する
・購入ありがとうございましたメッセージが表示される
・商品によって「〜日ほどで到着予定です」というのを
　購入時点の日付から計算し表示する


こんなイメージかなと。



②DBのテーブル作成
データを格納するために必要なテーブルを、
ネットショッピングが行われる際に作られる情報を全て網羅する形で
箱を用意しておいてあげる必要があります。

以下3つが必要になる予定。

・ユーザーテーブル(いわゆる会員情報)
・商品テーブル(JANコードや価格、カテゴリなど商品情報が格納される)
・取引(決済)管理テーブル(誰(ユーザー / 未ログインユーザー)が、
　何(商品)を、いつ(TIMESTAMP)、
　何の決済方法(credit or banking)で購入したか)
↑　これについては正直必要か自信がないので
　今後進めていく中でいらないかもと判断したら後ほど削除します。


一旦これで進めていこうと思います。
意識することはMECE。
PHPでユーザー情報などのやりとりをDBと接続して行う予定

ログインユーザーはもちろん購入できますが、
未ログインユーザーでも購入できるようにするところとか、
意外と細かく実装する必要がある点が多そうw

作成したテーブルも挙げておきます

ユーザーテーブル(会員情報)
![スクリーンショット 2020-12-22 8.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527518/79ac57dd-ed81-a1a8-8d27-f0066bcb3834.png)
商品情報テーブル
![スクリーンショット 2020-12-22 9.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527518/e42d215f-3e3d-93d0-0e43-e48c48945b46.png)
取引情報管理テーブル
![スクリーンショット 2020-12-22 9.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527518/bafe99d3-8317-756c-c06b-d9559ac30427.png)






決済管理に関してはチラッと調べただけでも、
直接クレジットカード番号を登録してはいけないとか
色んなルールがあるみたいですがこの辺もちゃんと実装します。

session id(ユーザーログイン情報をファイルが変わっても引き継げる実装)
が特に重要かなと思っているので 授業内容を振り返りながら
作成しようと思います。

ログインユーザーの購入金額が現在合計いくらで
総額何円以上買ってくれたらランクアップ！みたいなこともやりたいんですが
一旦はシンプルにここまでにして余裕があればやってみます。


本日はとりあえずここまで。
Windowsにおけるpython仮想環境作成

Anacondaを使用しない仮想環境作成をWindowsにて実施。

####環境
Windows10 home 64bit
python:3.7.9

---

####①Windowsへのpythonインストール

Python公式サイト
[公式サイト](https://www.python.org/)

Microsoft Storeにもpythonがありインストールが簡単に出来るのですが
細かいバージョン指定がやりやすいので基本公式を選択。

1)Downloadsをクリック
![スクリーンショット (316).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/176577ba-8cc1-bc1a-d740-1141f69d28ec.png)

2)使用したいVerを選択
![スクリーンショット (317).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/e667545b-c17c-31ec-5e22-f2c702835be9.png)

3)Windows x86-64 executable installerを選択
![スクリーンショット (319).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/2641a179-19ed-3664-5c2a-7fc196252f56.png)
後はダウンロードしたexeファイルをクリックしてインストールして下さい。

インストール開始画面で『App Python ※.※ to PATH』にチェックを入れてインストール開始すると
環境変数にPATHが自動的に追加されます。

インストール完了後、Windowsのコマンドプロンプトを立ち上げて
プロンプトに`python`と入力するしてpythonが起動すればOK

![スクリーンショット (324).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/e0290e38-4b5f-7e72-22e9-39e744de2e96.png)

これでwindowsへのpythonのインストール完了です。

---
####②ソフトウェアのインストール

今までAnacondaを介して使用していたソフトウェア関係をインストールする。

```
#Jupyter Lab
pip install jupyterlab

#Jupyter Notebook
pip install Jupyter

#Spyder
pip install spyder
```
別に全部インストールする必要は無し。
VScodeを使用するのであれば別に入れなくても問題なし。

```
#Jupyter Lab
jupyter lab

#Jupyter Notebook
jupyter notebook

#Spyder
spyder
```
これでAnacondaを介さなくても各アプリが起動する様になります。

---
####③仮想環境構築

Ipython kernelのインストール

```
pip install ipykernel
```

仮想環境を作る

```
python -m venv .test
```
このコマンドを入力する事で仮想環境用のフォルダが作成されます。

フォルダ名はご自身で好きに設定してください。

上記のやり方ではフォルダはCドライブ → User → User 以下に出現します。(私の場合)
![スクリーンショット (326).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/0b124532-8bad-b22a-8912-1b955e4c06d4.png)

フォルダの中身
![スクリーンショット (329).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/98c3677a-8408-d29e-42f7-3d1846eb7221.png)

作った仮想環境に入る

```
C:Users¥ユーザー名>.test¥Scripts¥activate
　　　↓
(.test)C:Users¥ユーザー名>
```


jupyterでkernelを使える様にする為に

```
pip install jupyter ipykernel
```
これを忘れるとkernelがjupyter上から選択出来ても
仮想内にインストールしたモジュールがないってエラーが出ます(出た)


仮想環境内で使用したいモジュールをインストールしていく。

```
例)
pip install numpy
```

ご自身の環境を構築して下さい。

仮想環境の設定

```
ipython kernel install --user --name=test
```
これで作った仮想環境がJupyter LabやJupyter Notebookで選択可能になります。

仮想環境からは`deactivate`で抜ける事が出来ます。

---

####④まとめ
pythonインストール後にpipを使うとVerが古いってアラーム出る時もあるので
その際はアラーム内にインストールコマンドが乗っているので
その通りに入力すればアップデートされました。

以上です。
オブジェクト指向UIデザインのワークアウトをするための環境構築

個人アプリの画面設計をする前に、デザインの勉強を軽くしておこうかと、
オブジェクト指向UIデザインの本を読んでいます。
その中のワークアウトで、図を書いたり字を書く必要があるのですが、
絵を描くと[スプー](https://ja.wikipedia.org/wiki/%E3%81%AF%E3%81%84%E3%81%A0%E3%81%97%E3%82%87%E3%81%86%E3%81%93)が出現し、書けばミミズが這っていくのでなかなか厳しそう。
ので、ツールの力に頼ることにしたので、作業用環境構築のメモを記載しようと思います。

## 作業環境構築

### PlantUML

#### インストール

※依存しているgraphvizやopenjdkもインストールされる。

```shell
$ brew install plantuml
```

#### Javaの設定

```shell
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    15.0.1, x86_64:	"OpenJDK 15.0.1"	/Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/openjdk.jdk/Contents/Home
```

```shell
$ sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
$ echo 'export JAVA_HOME=`/usr/libexec/java_home -v "15"`' >> ~/.bash_profile
$ source ~/.bash_profile
```

#### エディタの設定

1. Visual Studio Codeを起動する。
2. EXTENSIONSから、[PlantUML](https://github.com/qjebbs/vscode-plantuml)をインストールする。

### Figma

画面遷移を描くために、Figmaをインストールする。

```shell
$ brew cask install figma
```

会員登録後、適当にコピペで使えそうなアセットをダウンロードしてくる。

- スマートフォン向け
    - [Material Design 1.0](https://www.figma.com/resources/assets/material-design-ui-kit/)
- PC向け
    - [UX Flow 2.0](https://www.figma.com/resources/assets/ux-flow-2/)

### Git

作業記録を残すため、Gitを作成する。

Gitをインストールする。

```
$ brew install git
```

Gitリポジトリの初期化。

```
$ mkdir OOUIWorkout
$ cd OOUIWorkout
$ git init
$ git commit --allow-empty -m "first commit"
```

### ディレクトリの作成

ワークアウトごとに作成したファイルを保存するディレクトリを作成する。
※ワークアウトの途中などで、空のディレクトリをGitに保存したい場合は、.gitkeepをする必要があります

```shell
$ cd OOUIWorkout
$ seq 18 | xargs -I var mkdir -p dock/level/var
$ pwd;find . | sort | sed '1d;s/^\.//;s/\/\([^/]*\)$/|--\1/;s/\/[^/|]*/|  /g'
OOUIWorkout
|--dock
|  |--level
|  |  |--1
|  |  |--10
|  |  |--11
|  |  |--12
|  |  |--13
|  |  |--14
|  |  |--15
|  |  |--16
|  |  |--17
|  |  |--18
|  |  |--2
|  |  |--3
|  |  |--4
|  |  |--5
|  |  |--6
|  |  |--7
|  |  |--8
|  |  |--9
```

## 使い方

1. ワークアウトのレベルに合わせたディレクトリにファイルを作って、ワークアウトをやる。
    `$ cd OOUIWorkout/dock/level/1`
    `$ touch main.pu`

1. gitにコミットする。
    `$ git add .`
    `$ git commit -m "Level 1."`

1. 答えを読んで、修正した内容をコミットし、差分を眺める。

## 画像サンプル

PlantUMLはクラス図とユースケース図を駆使すれば行けるかも？

![Screen Shot 2020-12-22 at 8.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25578/4b4e7a14-8c55-4859-92c5-0f434aad3acf.png)

![Screen Shot 2020-12-22 at 8.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25578/c578d428-9880-d031-3b52-8dfd7a363f14.png)

Figmaは適当にアセットをコピペしてやってます。コメント機能も便利。

![Screen Shot 2020-12-22 at 8.50.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25578/b5054213-d769-452e-7489-76c7b7fabc47.png)


## 参考

* [PlantUML](https://plantuml.com/ja/)
* [tree コマンドが無い環境で tree コマンドを実現](https://qiita.com/yone098@github/items/bba8a42de6b06e40983b)


## 補足

* まだすべてのレベルのワークアウトを消化してないため、これらの作業用構築だけで出来るかは検証できてません(汗
* Figmaは初めて使いましたが、アセットを駆使する場合は、Affinity DesignerよりFigmaの方が気軽に使えて良さそうです。
* 自分のワークアウト用リポジトリ
   - https://github.com/mitsuaki1229/OOUIWorkout
VisualforceページをWord文書に変える

質問の中にVisualforceページを使ってWordを表示すると特定の文字が化ける（？になる）というのがありました。

Visualforceページを使ってPDFを作成できるのは知っていましたが、Wordもできたのですね。知らなかったです。

ヘルプ

https://help.salesforce.com/articleView?id=000314591&type=1&mode=1

ただし、
注： Wordで表示されるドキュメントに表示される特定の結果を達成するためにMicrosoft Wordで必要なHTMLおよびCSSマークアップを提供することは、Salesforceサポートの範囲外です。

やっぱりねぇ。

元の質問
https://trailblazers.salesforce.com/answers?id=9064S000000DS5vQAG
DosでOfficeのインストール場所を取得してselfcert.exeを起動する

社員に自己署名入りデジタル証明書を発行させたくて作りました。
（メール誤送信防止用にoutlookのVBAコードを仕込むため）

VBEのイミディエイトウィンドウから`shell "selfcert.exe"`と打たせてもよいのですが、もっと簡単な手順にしたくて<オフィスのインストール場所>\selfcert.exeをたたくバッチファイルを作成しました。

```
echo off
for /f "usebackq" %%t in (`assoc .xlsx`) do set work=%%t
set work1=%work:~6%
for /f "usebackq delims=" %%a in (`ftype %work1%`) do set work2=%%a
call :edit_filename %work2%
exit /b
:edit_filename
for /f "usebackq delims=" %%a in (`"%~dp2\selfcert.exe"`) do echo %a

```
コマンドの解説）
`assoc .xlsx`で`.xlsx=Excel.Sheet.12`のようにエクセルのタイプが返ってくるので、`:~6%`で`Excel.Sheet.12`を取得

`ftype Excel.Sheet.12`とやると
`Excel.Sheet.12="C:\Program Files (x86)\Microsoft Office\Office16\EXCEL.EXE" /dde`
のように返ってきます。

スペースで結果が区切られないようにデリミタの指定は`delims=`のように無しにしています。

この結果をサブルーチンで受け取って
`"%~dp2\selfcert.exe"`
で第2引数からドライブレターとパスを取ることで”オフィスのインストール場所にあるselfcert.exe”をキックする仕組みです。
【Unity】マルチディスプレイ・マルチタッチでハマった話（Windows）

# 概要
Unity 2Dで、タッチパネルを使ったマルチディスプレイ対応アプリを作ることになったのですが、
実機で動かした際にハマってしまったので、記録しておきます。

# 環境
- Windows 10
- Unity 2019.2.19f1
- Visual Studio 2019

# 発生した現象（１） どちらの画面をタッチしても同じ座標になってしまう
## 課題
今回はディスプレイを左右に2台並べて、左をメインディスプレイにしていたのですが、
右の画面をタッチしても左の画面と同じ座標になってしまいました。
（マウスクリックの場合は正常な座標が取得できました。）

## 解決策：WindowsでタブレットPCの設定を行う
コントロールパネル > タブレットPCの設定にて、「セットアップ」を行うことにより解決しました。

# 発生した現象（２） 2画面の同時タッチができない / サブ画面の同時タッチができない
## 課題
メイン画面タッチ操作中にサブ画面をタッチしても反応がありませんでした。
また、サブ画面タッチ操作中にメイン画面をタッチするとサブ画面のタッチがキャンセルされているようでした。
さらに、サブ画面で複数の指の同時タッチができませんでした。（メイン画面で複数の指の同時タッチはOK）

## 原因
サブ画面はそもそもタッチイベントが取得できていませんでした。
タッチ非対応PCでの動作確認用にマウスイベントも拾うようにしていたのですが、
サブ画面にタッチするとタッチイベントは発生せず、マウスイベントが発生していました。

※ ちなみにタッチイベントが発生した際はマウスイベントも発生します。

## 解決策：Windows API（Win32 API）の利用
Unity側でなんとかしようとするも全く解決策が見当たらず、結局 Win32 APIを使って
Windowsメッセージからタッチイベントを取得するようにしました。

処理の流れとしては、ざっくりですが以下のようになります。
1. FindWindowで、対象のウインドウを取得
2. RegisterTouchWindowで、取得したウインドウをタッチイベント取得対象として登録
3. SetWindowLongPtrで、ウインドウプロシージャを書き換え
4. 3で設定したプロシージャ内で、Windowsメッセージからタッチイベントを取得して処理する

このあたりの処理については、また別途記事を書きたいと思います。。。（気が向いたら）

# まとめ
Windowsアプリは、Win32 APIを利用するといろいろできる。（語彙力）
Windowsアプリ初めてだったので、勉強になりました。

割と実装が進んだ段階で初めて実機で動かしてみてこのような状況になったので、
めちゃくちゃ焦りました。
ニッチな情報だと思いますがどなたかの参考になれば幸いです。
GitHub Actions でブランチ名を取得する

# 概要
GitHub Actions でいろいろなタイミングでトピックブランチ名を取得したかったので調べてみました。

# 挙動
## トピックブランチに Push 時にトピックブランチ名を取得
次のコマンドで取得可能です。

```
on:
  push:

jobs:
  sample:
    runs-on: ubuntu-latest
    steps:
      - run: echo "${GITHUB_REF#refs/heads/}"
      - run: echo "${GITHUB_REF_CONTEXT#refs/heads/}"
    env:
      GITHUB_REF_CONTEXT: ${{ github.ref }}
```



## PRが作成されている場合にトピックブランチ名を取得
次のコマンドで取得可能です。

```
on:
  push:

jobs:
  sample:
    runs-on: ubuntu-latest
    if: github.event.pull_request
    steps:
      - run: echo "${GITHUB_REF#refs/heads/}" # PRの番号が取得されてしまいます
      - run: echo "${GITHUB_HEAD_REF}"
      - run: echo "${{ github.ref }}"
```

## PRをマージ時にトピックブランチ名を取得
できないです。

ちなみにPRをマージ時に発火させる場合には、

```
on:
  pull_request:

jobs:
  sample:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true
    steps:
      - run: #command
```

で可能です。

# tips
## github のコンテキストや環境変数を実際に確認したい
次のコマンドで取得可能です。

```
- run: echo '${{ toJson(github) }}'
- run: env
```

# まとめ
以下の関係になっていることがわかりました。

|  | GITHUB_REF | GITHUB_HEAD_REF | GITHUB_BASE_REF |
|---|---|---|---|
|push  | refs/heads/${branch_name} | "(empty)"  | "(empty)"
|PR  | refs/pull/${PR_number}/merge  | ${branch_name} | main

context の一部は環境変数として事前に定義されていて環境変数として渡せることもわかりました。その場合は大文字で `.` が `_` になった値が設定されています。
また、context は文字列加工ができないので、いったん env を利用してjob 内の環境変数として定義した上で利用すると取り回しがしやすいです。

普段はプライベートでしかGHAを触ることはありませんが、yml を定義するだけでCIを回せるようになってとても楽な時代になりました。

# 参考
[GitHub Actions のコンテキストおよび式の構文](https://docs.github.com/ja/free-pro-team@latest/actions/reference/context-and-expression-syntax-for-github-actions)
[環境変数](https://docs.github.com/ja/free-pro-team@latest/actions/reference/environment-variables)
[Github Actionsの個人的ユースケース備忘録](https://dev.classmethod.jp/articles/github-actions-usecase-myself/)
Microsoft SurfaceでBitlockerを使用する場合の認証方法をPINにする方法

Windows10に実装されているドライブ暗号化の機能として、Bitlockerがある。

このBitlockerについてはそのPCにTPM（Trusted Platform Module)が実装されているかどうかで設定方法が異なる。
今回TPMの実装、未実装に関わらず、認証方法をPINにするための設定を記す。

＜TPM未実装の場合＞
　コントロールパネルから”Bitlocker暗号化を有効ににする”としても”このデバイスではTPMが使用できない”旨表示され、Bitlockerを有効にできない。しかしTPM未実装でもBitlockerは使用できる。
　この場合、まずグループポリシーの設定を以下のように２点変更する。

検索窓からqpedit.mscを検索し起動後、以下の変更を行う
（１）
「コンピュータの構成」→「管理用テンプレート」→「Windowsコンポーネント」→「Bitlockerドライブ暗号化」→「オペレーティングシステムのドライブ」を選択し、その中の「スタートアップ時に追加の認証を要求する」の状態が初期状態では「未構成」となっているのでそれを「有効」に変更する。

（２）
「コンピュータの構成」→「管理用テンプレート」→「Windowsコンポーネント」→「Bitlockerドライブ暗号化」→「オペレーティングシステムのドライブ」を選択し、その中の「スレートでプリブートキーボード入力が必要なBitlocker認証を使用できるようにする」の状態が初期状態では「未構成」となっているのでそれを「有効」に変更する。

＜TPM実装の場合＞
　Surfaceの場合は「VolumeUPボタン＋電源ボタン」を押して起動し「Surface　UEFI」の画面を表示させ、その中の「Security」の項目を選択し、下方のTPMをONに設定する。

その後上記の（１）（２）と同様の設定を行うが、（１）ではただ有効にするだけではなくオプションを変更する必要がある。
TPMスタートアップPINの構成：
　→TPMでスタートアップPINを許可する。
TPMスタートアップキーの構成：
　→TPMでスタートアップキーを許可しない。
TPMスタートアップキーとPINの構成：
　→TPMでスタートアップキーとPINを許可しない。

と設定することで、コントロールパネルからBitlocker暗号化を有効にすることができるようになりPCの起動時の認証でPINを聞いてくるようになる。

・・・数種のSurfaceのBitlockerの設定を行ったがインターネット上に情報があまりなく悩んだため、調査結果をシェアさせていただいた。
django-allauthで、既存のプレースホルダーやラベルを変更する

# 概要
- django-allauthで、自作のテンプレートを作る際に既存のlabelやplaceholderが英語なので日本語に書き換えたい
- テンプレートでフィールドを出力する際は、直書きせずにfor文で回して取得している場合を想定

# 対応
- formクラスの`__init__`で、`self.field`の辞書を上書きする


# ソースコード

## forms.py
```python
from allauth.account.forms import SignupForm

class MyBaseUserSignupForm(SignupForm):
    def __init__(self, *args, **kwargs):
        super(MyBaseUserSignupForm, self).__init__(*args, **kwargs)
        # django-allauthのフィールドを上書き
        self.fields['email'].label = 'メールアドレス'
        self.fields['email'].widget.attrs['placeholder'] = 'メールアドレス'
        self.fields['password1'].label = 'パスワード'
        self.fields['password1'].widget.attrs['placeholder'] = 'パスワード'
```


# 注意
- パスワード欄は`password1`で、数字が付く(確認用パスワード入力欄と区別するため)


# 参考

- [Djangoで入力フィールドにプレースホルダ(placeholder)を設定する](https://qiita.com/nakkun/items/271998ccce976d8b9c21)
- [How do I remove a placeholder on an EmailField in Django?](https://stackoverflow.com/questions/33650657/how-do-i-remove-a-placeholder-on-an-emailfield-in-django)

- [How do I add a placeholder on a CharField in Django?](https://stackoverflow.com/questions/4101258/how-do-i-add-a-placeholder-on-a-charfield-in-django)
Djangoで指定したfieldだけ表示する(クラスベース汎用ビューのDetailViewを使う)

# 概要
- Djangoのテンプレートで、あらかじめ指定したフィールドだけ表示したい
    - Userモデルで、is_activeなど不要なフィールドは見せたくない
    - `django.views.generic.DetailView` で表示する想定
- フィールドを後から増減させたときに、なるべく一箇所だけの変更で済ませたい

# 対応
- modelクラスに、指定したフィールドだけを抽出する関数を追加する
    - viewごとに表示するフィールドを変えたい場合は、下記の`viewable_field_list`を上書きする


# ソースコード

## modelｓ.py
```python

class CustomUser(AbstractUser):

    # get viewable fields with order.
    viewable_field_list = ('userType', 'username', 'email', 'companyName', 'nearestStation')
    editable_field_list = ('username', 'companyName', 'nearestStation')
    def get_selected_fields(self):
        """Returns a list of selected field names on the instance."""
        fields = []
        for vf in self.viewable_field_list:
            for f in self._meta.fields:
                fname = f.name
                if vf != fname:
                    continue
                # resolve picklists/choices, with get_xyz_display() function
                get_choice = 'get_'+fname+'_display'
                if hasattr(self, get_choice):
                    value = getattr(self, get_choice)()
                else:
                    try:
                        value = getattr(self, fname)
                    except AttributeError:
                        value = None

                # only display fields with values and skip some fields entirely
                if f.editable:  # and value:
                    fields.append(
                    {
                    'label':f.verbose_name,
                    'name':f.name,
                    'value':value,
                    'is_editable': f.name in self.editable_field_list
                    }
                    )
        return fields
```


## template
```html
<ul>
  {% for f in object.get_selected_fields %}
    <li>{{ f.label|capfirst }} ( {{ f.name }} ) : {{ f.value|escape|urlize }} (editable={{ f.is_editable }})</li>
  {% endfor %}
</ul>
```


# 必要に応じて、viewの記述も変更
## views.py

```python
class UserDetailView(OnlyYouMixin, DetailView):
    model = CustomUser

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if int(context["object"].userType.id) == USERTYPE_SUPPLIER:
            self.model.viewable_field_list = ('userType', 'username', 'email', 'companyName',)
        elif int(context["object"].userType.id) == USERTYPE_BUYER:
            self.model.viewable_field_list = ('userType', 'username', 'email', 'nearestStation')
        return context
```



# 参考

- [Iterate over model instance field names and values in template](https://stackoverflow.com/questions/2170228/iterate-over-model-instance-field-names-and-values-in-template/3431104#3431104)
Djangoでhidden属性でテンプレート出力する

# 概要
- Djangoのテンプレートで、hiddenのフィールドは項目名も表示しないようにしたい
- 入力欄を`as_hidden`で出力すると、項目名は出てしまう。
    - テンプレートでフィールドを出力する際、直書きせずにfor文で回して取得している場合を想定
- `is_hidden`メソッドを使って判定する


# forms.py
```python
class BuyerUserSignupForm(SignupForm):
    userType = forms.IntegerField(initial="1", widget=forms.HiddenInput)
```

# template
```html
  {% for field in form %}
      <div class="field">
          {% if not field.is_hidden %}
            {# 通常フィールドはラベルと入力枠を出力 #}
            {{ field.label_tag }}
            {{ field }}
            {% if field.help_text %}
                <span class="helptext">{{ field.help_text }}</span>
            {% endif %}
          {% else %}
            {# hidden属性で出力 #}
            {{ field.as_hidden }}
          {% endif %}
          {% for error in field.errors %}
            {{error}}
          {% endfor %}
          </div>
  {% endfor %}
```





# 参考

- [Django のテンプレートでフォームの要素が hidden かどうかを調べる](https://metareal.blog/2008/05/12/checking-whether-field-has-a-hidden-widget-in-django-template/)

- [Djangoのフォームに入力した値を隠しパラメータで引き継ぐ](http://imagawa.hatenadiary.jp/entry/20120520/1337431689)
オンプレミス、レンタルサーバー、クラウドの違いを1分で紹介

作ったwebシステム(サービス)を世の中に公開するにはサーバーを用意しなければなりません。
サーバーとはサービスや機能を提供する側のコンピュータだと思ってください。
用意する方法は自分で機器を購入するか誰かから借りるかの2択になります。

# レンタルサーバー
他の人が構築したサーバーを借りる手法。
WordPressの運用を始める時にお世話になるのがこのレンタルサーバーです。
有名な所だとエックスサーバー、さくらレンタルサーバーがあります。
最大のメリットは費用が安く運用の手間がかからない事です。
1年で1,000円切る事も珍しくありません。
![スクリーンショット 2020-12-18 9.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/98236198-1202-0da2-5500-4d7873a8bbe6.png)


# クラウド
クラウドとは他の人が提供する仮想のサーバーの事。
機器の購入や設置場所の確保が不要でありながらレンタルサーバーと違い自分専用のサーバーとして自由な構築が可能です。
有名な所だとAWSやherokuがあります。
個人開発したものを世の中に公開するならクラウドがおすすめでしょう。
なぜなら費用は利用時間によって決まるため1人で使う分には無料〜月1,000円以下で収まるからです。
これをレンタルサーバーで行うと1万円を超える事は珍しくありません(年間契約のため)
しかし、セキュリティ設定を自分で行う必要があるため万が一悪い人に悪用されたら数十万円の請求されるリスクは覚悟しなければなりません。

![スクリーンショット 2020-12-18 9.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/0d55cd6e-8d42-b29f-a2c3-b4447cef7f70.png)


# オンプレミス
自社運用という意味で自分で機器を購入してサーバーを構築する方法です。
上記2つと違いアクセス方法も自分で決められ、サーバー構築の自由度も非常に高いです。
また、システムデータも自分の敷地内に存在するため個人情報を他人に預けないという安心感があります。
(自分の財布を他人に預けたら不安ですよね？)
その変わり機器を自分で管理するので運用に手間がかかります。
その上サーバー機器は高価でかつ置き場所の確保も必要なので始めにくいというデメリットがあります。


![スクリーンショット 2020-12-18 9.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/48492c9f-7ebf-9044-34dc-874e5e052e3f.png)

さて、続きまして、アルサーガパートナーズ Advent Calendar 2020 23日目の記事は @miumi さんのvue学習ロードマップです。:tada:
pythonでのアーキテクチャを考える

## はじめに

この記事は2020年の RevComm アドベントカレンダー24日目の記事です。
前日は @zoetaka38 さんの「[Serverless/FlaskでSwagger付きサーバレスAPIを作る](https://qiita.com/zoetaka38/items/5ec8343f02ababa9b44f)」でした。

RevComm でリードエンジニアをしています @qii-purine です。
普段はちょっとした機能を作るところからコードレビュー、プロダクトマネジメントまで幅広く MiiTel の開発に携わっています。

さて、みなさんは開発においてどういうアーキテクチャを使っていますか？
その選択においてどんなことを考えましたか？

今回はとある場面におけるアプリケーションアーキテクチャを考えていけたらと思います。

## アーキテクチャって？

アーキテクチャと言われてどんなものを連想しますか？
MVC やレイヤードアーキテクチャ、クリーンアーキテクチャ、VIPER色々ありますね。
広義にすると DDD や DI、CQRS、オブジェクト指向、アスペクト指向、デザインパターンまで広がります。

どれにしても、開発運用時の課題を楽に解決するために考案され様々なシステムで利用されています。
※この記事では各アーキテクチャに関する具体的な説明は行いません。

## 選択における条件は

さて、さっとアーキテクチャを考えるとはいいましたが、プロダクトに応じて様々に条件があると思います。

今回の条件はこんな感じ。

- 言語は python。
- フレームワークは django (drf)。
- 作成するのは Restful API で、html を返すようなものはない。
- UnitTest はやる。
- 10人以上が変更を加える。

## 候補

今回は大枠の候補として
drf の ModelViewSet を使うパターン、レイヤードアーキテクチャ、クリーンアーキテクチャの３つを考えてみましょう。

### drf の ModelViewSet

参考にするのはここ。
<https://www.django-rest-framework.org/api-guide/viewsets/#modelviewset>

複雑なロジックを組む場合は次の レイヤードアーキテクチャ の仕組みを部分的に導入する形になるでしょう。

- 作成するコード
  - ViewSet
  - Serializer
  - Model
- メリット
  - コード量は少なくて済む。
- デメリット
  - ロジック部分を drf が隠蔽しすぎて処理順が一見してわからない。
  - 複雑なロジックが増えると Fat Controller, Fat Model で苦しむことが予想できる。

### レイヤードアーキテクチャ

ModelViewSet の Base Class となる ViewSet を使います。
<https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions>

- 作成するコード
  - ViewSet (Application層)
  - Serializer (Application層)
  - UseCase (Domain層)
  - Model (Infrastructure層)
- メリット
  - レイヤごとに疎結合に実装できる。
- デメリット
  - UseCase が肥大化する。(行数ではなくクラス数的な意味で)
  - テストがしづらい。

### クリーンアーキテクチャ

ここ数年よく耳にするアーキテクチャですね。
DI をうまく使うことでインフラ部分の依存関係を逆転させることができます。

- 作成するコード
  - ViewSet
  - Serializer
  - Entity
  - UseCase
  - Repository
  - Model
- メリット
  - テスタブル。
  - インフラの変更にも耐えられる。
- デメリット
  - UseCase が肥大化する。(行数ではなくクラス数的な意味で)
  - コード量多すぎ。

## mock によって解決すること

python の mock はそこそこ強力で、グローバルな変数のモックができます。
これはクリーンアーキテクチャのように依存関係を逆転させずとも DB などのインフラ部分に依存させずテストができるようになります。

## 考えないこと

遭遇確率の低そうなフレームワークやインフラの変更は考えなくていいでしょう。
また、チーム内で共通の認識を作るのは何をするにしても必要なことです。難解過ぎなければ払うコストはほとんど同じです。

## Minimum Viable

いずれを選ぶにしても一長一短ありますが、コード量的にはレイヤードアーキテクチャが良さそうです。
テストがしづらいというデメリットも mock によって解決できます。
それから DI は実装箇所によっては欲しい機構なので使えるようにしておきましょう。

まとめると、こんなでしょうか。

- 作成するコード
  - ViewSet
  - Serializer
  - UseCase
  - Model
- メリット
  - レイヤごとに疎結合に実装できる。
  - テスタブル。(mock の恩恵)
- デメリット
  - UseCase が肥大化する。(行数ではなくクラス数的な意味で)

## おわりに

いかがでしょうか。
今回は レイヤードアーキテクチャ + DI の形に収まりましたが、プロダクトの規模やチーム体制、開発期間によっても取捨選択が変わると思います。
少数精鋭で全員が drf に精通している場合は ModelViewSet で必要十分かもしれません。あるいは、十分に時間があり長期に渡り運用していく場合にはクリーンアーキテクチャが適しているかもしれません。

自分たちにあったアーキテクチャの選択をおこないましょう。

明日は最終日。@zomaphoneさんの記事です。
よろしくおねがいします。
17日目：気球で学ぶState(マルチ環境での変数同期)

この記事はアドベントカレンダー「[【VCI】テーマパーク を作ろう](https://adventar.org/calendars/5855) 」の17日目の記事です。

# 今回の内容
今回は前回作成した気球のボタンを複数人で扱っても速度が維持されるように変更していきます

今回は学ぶ技術は以下となります。
　・Stateによる変数の共有


# State概要
前回複数人でボタンをいじったときに速度情報が維持されなかったのは、各自で速度の情報を持っていたためでした。
そのため、全員で1つの速度情報を持ち、それを参照・変更するようにすれば速度情報を維持することができます。
Vキャスには全員で共通の変数を使える「**State**」という機能があるため、そちらを使用します。詳細は以下の公式ページを御覧ください
　・[State概要](https://virtualcast.jp/wiki/vci/script/reference/exportstate) 

Stateは以下の3つの関数しかありません。
　・Set(name,value)：nameという名前でvalueを保存する。
　・Get(name)：nameという名前で保存されている値を取得する
　・Add(name,value)：nameという名前で保存されてる値にvalueを加算する
valueには文字列も設定可能ですが、Addが使用できるのは数値で保存されている場合のみです。

# コードの作成
Stateを使用してコードを修正すると以下のようになります

スピード変更部分

``` lua
-- 初期化処理。あとから入ってきた人に上書きされないように、VCIを出した人のみ実行するようにする。
if vci.assets.IsMine then
  vci.state.Set("BalloonSpeed",0)
end

function onUse(use)
  if use == "Button_Balloon_Up" then
    vci.state.Add("BalloonSpeed",1)
  end
  if use == "Button_Balloon_Down" then
    vci.state.Add("BalloonSpeed",-1)
  end
end
```

気球の位置を変える部分
Stateの初期化処理反映前にupdateAllが呼ばれる可能性があり、その場合はvci.state.Getはnilを返します。
そのため、nilのときは処理をしないようにしています。

``` lua
function updateAll()
  local balloon = vci.assets.GetTransform("HotAirBalloon")
  --バルーンの所有権を持っていたら
  if balloon.IsMine then
    local BalloonSpeed = vci.state.Get("BalloonSpeed")
    
    --ちゃんと値が設定されているときのみ実行する。
    if BalloonSpeed ~= nil then
      local nextPos = balloon.GetPosition()+Vector3.up*BalloonSpeed*0.01
      
      --移動先の座標が地中(y<0)ならy=0にする。(地中に埋まらないようにする処理)
      if nextPos.y < 0 then
        nextPos.y = 0
        BalloonSpeed = 0
      end
      balloon.SetPosition(nextPos)
    end
  end
end
```
以上で作成完了です。

# Stateの注意点
Stateは設定後すぐには反映されません。
そのため、以下のように同じフレーム内で設定＆参照しても設定された値を取得することはできません。

コード

``` lua
-- 初期化処理。あとから入ってきた人に上書きされないように、VCIを出した人のみ実行するようにする。
count = 0
function updateAll()
  print("設定値："..count)
  vci.state.Set("Count",count )
  --ここでGetしてもSetした値が取得できない。
  print("参照値："..vci.state.Get("Count"))
  count = count + 1
end
```

結果(Stateに関係ないものが設定されてますが無視してください)
![2020122201391286.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64877/256c7b0e-c4e2-aaad-f55a-49bc78217a17.jpeg)


# 終わりに 
いかがでしたでしょうか？
Stateは便利ですが、値が反映されるまで少しラグがあるため、注意して使いましょう。
次回の内容は未定です。
[Tips] Hugo で外部リンクを target="_blank" で開く方法

# はじめに

Hugo で設定した外部リンクを開くときは別ウィンドウで開けるようにしたかったので、Hugo のテーマファイルをオーバーライドして対応しました。外部リンクが設定されているときのみ `a` タグに `target="_blank" rel="noopener noreferrer"` が追加されるようにしました。

テンプレートファイルは GO の HTML テンプレートで書かれているので、その書式にしたがって `a` タグの属性を書き換えることで、外部リンクの場合は `target="_blank" rel="noopener noreferrer"` を追加します。

# `a` タグに外部リンクが設定されていた場合は `target="_blank"` を付与する

下記は [hugo-PaperMod](https://github.com/adityatelange/hugo-PaperMod) で、メインメニューの `a` タグに `target="_blank" rel="noopener noreferrer"` を追加するときのサンプルになります。

```html:layouts/partials/header.html
<ul class="menu" id="menu" onscroll="menu_on_scroll()">
    <!-- `.Site.Menues.main` の要素数 (メニュー数) ループします -->
    {{- range .Site.Menus.main }}

    <!--
        要素内の .URL にアクセスすることで設定されているリンクにアクセスする。
        設定されている URL のプレフィクスが https:// or http:// であれば、
        絶対リンクが設定されているはずなため、外部リンクが設定されているとみなす。
    -->
    {{- $is_abs_url := or (strings.HasPrefix .URL "https://") (strings.HasPrefix .URL "http://") }}

    <!--
        もし外部リンクが設定されていれば、そのまま .URL の内容を出力する。
        そうでなければ、内部リンクを language プレフィクスを付与した形で出力する。
    -->
    {{- $menu_item_url := (cond $is_abs_url .URL (printf "%s/" .URL) ) | absLangURL }}
    <li>
        <!--
            外部リンクが設定されていたら ($is_abs_url が true なら)
            a タグに target="_blank" rel="noopener noreferrer" を設定する
        -->
        <a href="{{ $menu_item_url }}" {{- if $is_abs_url }} target="_blank" rel="noopener noreferrer" {{- end}}>
            <span {{- if eq $menu_item_url $page_url }} class="active" {{- end }}>
                {{ .Name }}
            </span>
        </a>
    </li>
    {{- end -}}
</ul>
```

# おわりに

Hugo でページを自分の思い通りカスタマイズするためには、ある程度は Go の HTML テンプレートの知識も必要になりそうです... :boy: :writing_hand: 

# 参考リンク

- [Functions Quick Reference \| Hugo](https://gohugo.io/functions/)
GitHub Actions の CI が使いやすくて見やすい

私はいままで CI には Jenkins を使うことが多かったです。

CI でやることは色々あります

* ユニットテスト
* コーディングスタイルのチェック
* ビルド・開発環境のデプロイ

この中で、「ユニットテスト」や「コーディングスタイルのチェック」は、結果のXMLを綺麗に表示してくれることが重要でした。とくにコーディングスタイルです。

これまではずっと Jenkins や CircleCI を使っていました。仕事ではずっと Jenkins を使っていましたが、とくに Jenkins で困っておらず、むしろ Jenkins は CI の結果が見やすいと思っていました。

近年、 GitHub Actions が登場し、人開発で GitHub Actions を使ってみたのですが、思ったより簡単で、結果も見やすかったので紹介します。

# GitHub Actions でコーディングスタイルのチェック

今回は PHPCS という、PHP のコーディングスタイルのチェックを取り上げますが、 PHP 以外でもほぼ同じです。

GitHub Actions だとこういう感じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29024/6c0b1569-4345-fc0c-9623-64ddc686bbfe.png)

Jenkins だとこういう感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29024/0eb51c0d-1885-6bc0-75ce-2818ae48c8e9.png)

今までは、 Jenkins の表示が良いなと思っていたのですが、 GitHub Actions を使うと、見慣れた画面にコメントがされるので非常に見やすいです。

# 導入方法

導入はめちゃめや簡単で、ワークフローの設定はこれだけです。

```yaml
name: PHPCS
on: [push]
jobs:
  phpcs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: chekalsky/phpcs-action@v1
```

この GitHub Actions を使っています。
https://github.com/chekalsky/phpcs-action



# まとめ

GitHub Actions 、以前は ECS のデプロイなどに使ったことがあったのですが、今回の PHPCS のような表示ができるのは驚きました。

個人が作ってる Actions も増えてきましたし（この辺が GitHub の強みですよね）、結構いろんなことができるので、かなり便利な印象です。Jenkins, CircleCI, GitHub Actions と使ってきましたが、 GitHub Actions が一番簡単で一番使いやすいかもしれません。

僕は以前ブログで、 PHP のスタイルチェックについて書きました。記事の中 Jenkins や IntelliJ を使って、 PHP のスタイルチェックをしています。興味があればこちらも見てみてください。

PSR-2 に変わって新しく制定された PSR-12 のチェックを PHP_CodeSniffer で行う - 猫でもわかるWebプログラミング
https://www.utakata.work/entry/php/phpcs-psr12-intellij-jenkins
CloudFormationをゼロから勉強する。（その10：ファイル呼び出し方法使い分け）

# はじめに
[その６](https://qiita.com/sakai00kou/items/57019ef4b3b6b7d61251)で`Transform`によるインクルード、[その８](https://qiita.com/sakai00kou/items/553aba6cc924aff3c9b8)でスタックの`ネスト構成`、[その９](https://qiita.com/sakai00kou/items/9512a8a271d19dad5886)で`クロススタックリファレンス`と、過去3回にわたり、別ファイル・別テンプレートを呼び出す方法を紹介してきました。

今回は今まで紹介した3つの呼び出し方法の使い分けを考察してみようと思います。


- 【前】[CloudFormationをゼロから勉強する。（その９：クロススタックリファレンス）](https://qiita.com/sakai00kou/items/9512a8a271d19dad5886)

# ３つの方法のおさらい
以下で３つの方法をおさらいします。

## Transformによるインクルード
どちらかというと`Lambda`関数を呼び出したりするときに使うのが主なのかもしれませんが、`Location`で指定したファイルを読み込み、ファイルに書かれた内容を実行できます。

テンプレート内の同じインデントレベルで複数記載はできませんが、インデントレベルが違えば複数ファイルを読み込むことができます。

## スタックのネスト構成
親子関係を持ち、親テンプレートから子テンプレートを呼び出して使います。

親子間の値の引き渡しは、`Parameters`セクション、`Outputs`セクションで引き渡すことができるので、親スタックでの入力結果を子に渡したり、子スタックでの処理結果を親に渡すことが可能です。

## クロススタックリファレンス
`Outputs`セクションの`Export`で記載した値を複数のスタックで共有することができます。

共有したい値だけ`Export`で指定するので、テンプレート内・テンプレート間の構造はシンプルになります。

# ３つの方法の使い分け
３つのファイル呼び出し方法の特徴と、私なりの使い分け方法を以下にまとめてみました。

|方法|特徴|
|:--|:--|
|Transformによるインクルード|セクション内の設定単位で呼び出し可能|
|スタックのネスト構成|親スタックでまとめて管理が可能|
|クロススタックリファレンス|スタック間の繋がりをあまり意識する必要がない|

## Transformによるインクルードの使い分け
`Transform`によるインクルードは細かい設定項目単位に記載したファイルも呼び出すことができるので、例えば案件ごと、組織ごとに共通で設定しているタグを付与したりするのに便利かと思います。

が、私が試してみた限り、**ネスト構成の子スタックでインクルードするとどうしてもうまくいかなかった**のでテンプレートを`ネスト構成`で作る場合は気を付けてください。

![Include.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/65fd3c91-ae75-cb9b-d302-1693d1699736.png)

ネスト構成の制約以外でも、リソース単位に分割するような場合は`Transform`だと同インデントレベルで複数ファイルをインクルードできなかったり制約があるので、`Transform`によるインクルードは行わずに`ネスト構成`とするか、共有する値だけ`Export`して`クロススタックリファレンス`で組んだほうが良いと思います。

## ネスト構成の使い分け
`ネスト構成`は親子関係があり、ネストするテンプレートは明示的に指定する必要があるので全体構成が把握しやすいです。

ただ、親で全体を管理するような形であるため、複数あるうちの1つの子スタックで変更する場合も全体が更新されるので、利用する組織が大きくなると難しいかと感じます。

## クロススタックリファレンスの使い分け
`クロススタックリファレンス`は共有する値だけ`Export`で記載して、使う場合も`ImportValue`で名前を指定するだけなので、例えば元々1テンプレートで管理していたテンプレートを分割する場合など、あまり書式を変えずに簡単に分割できます。

`ネスト構成`とは逆に、各テンプレートはそれぞれ独立に管理することができる反面、スタック間は疎結合なので、思いがけないところで`Export`した値が使われていて削除できない等、発生するかもしれません。

# まとめ
それぞれメリット、デメリットがあるので、例えば会社などの組織で使用する場合、組織や環境（開発環境、テスト環境など）単位でネスト構成にして、共有したい値（VPCIDやSubnetIDなど）だけクロススタックリファレンスで値を参照させるような使い方が良いかと感じます。

また、**ネスト構成にしない**のであれば、Transformのインクルードで各グループや案件ごとの共通タグを用意しておくのも良いかと感じます。

# おわりに
それぞれの特徴を理解して使えば、使いまわししやすく構造も把握しやすいテンプレートが作成できそうだと感じました。

次回は未定ですが、いくつかあるネタを試してみたら記事にしたいと思います。
firebase学習中の備忘録

## firebase勉強中のメモ

```javascript
//   追加されたドキュメントのIDを知る方法
const res =　await db.collection("コレクション名").add({
     //追加するフィールドの内容を記載
   });
//  ドキュメントのIDの表示
console.log(res.id);
```

```javascript
//   IDを指定して情報を取得する
const Id = '';
const userData = await db.collection("コレクション名").doc('Id').get();
console.log(userData.data());
```


```javascript
// idを指定してデータを更新
await db.collection("コレクション名").doc('Idの指定').set({
    //更新したいフィールドの内容を記載
    });
``
クライアント側の新規リポジトリのデフォルトブランチ名変更 (master -> main)

<!-- title: クライアント側の新規リポジトリのデフォルトブランチ名変更 (master -> main) -->

# はじめに
GitHubのデフォルトブランチ名がmasterからmainに変更になってからしばらく経ちますが、
GitHub側でのデフォルトブランチの変更は直ぐに実施していた一方で、
まだローカルでの設定変更をしていなかったので設定変更してみました。


# 既存プロジェクトに対するデフォルトブランチ名変更
既存プロジェクトでのmasterブランチからmainブランチへの名称変更は以下のコマンドで行えます。

```bash
git branch --move master main
```

# 新規プロジェクトに対するデフォルトブランチ名変更
本題です。デフォルトブランチ名の変更は以下で行います。

```zsh
git config --global init.defaultBranch main
```

`git config --list` を実行すると以下のような行が追加されています。

```
init.defaultbranch=main
```

## 反映されない場合
上記設定を行なった後に新規ローカルリポジトリを作成した際、
***master*** という名称のまま作られるのであれば、Gitのバージョンが古い可能性があります。
（※init.defaultBranchはversion 2.28で導入されました。）

参考情報: 
- GitHub Blog:[Highlights from Git 2.28](https://github.blog/2020-07-27-highlights-from-git-2-28/)


### バージョン確認

以下、Mac(zsh)での確認です。

```zsh
% git --version
git version 2.24.3 (Apple Git-128)

% which git
/usr/bin/git
```

デフォルトで入っているCLIでは、バージョンが低いのでbrewでインストールします。

```zsh
% brew install git

% which git
/usr/local/bin/git

% git --version
git version 2.29.2
```

※もし、`which git` で /usr/bin/git と出力された場合は、
PATH設定を見直し、/usr/local/bin の優先順位を上げて下さい。


# おわりに
今回の変更で、brewにgitインストールしていなかったことに気づきました。
頻繁に brew list も確認すべきですね。


では、よい　Git Lifeを！
Windowsクライアントから他のサーバー上のDockerへVSCodeで接続


#0.Intro
ググってやり方探したのですがなかなか上手くいきませんでした。
remote-containers extentionsをVSCodeへ追加し、setting.jsonにdocker.host追記。
でもREMOTE EXPLORERで[Containers]設定しても一切Container表示されず。

具体的な方法はこちらの記事がとても参考になります
【docker context】〜VScodeからリモート環境のdocker内にアクセスする方法〜
https://qiita.com/s-inoue-git/items/e157c03c125d6a637180

#1.やっと出てきました。
https://code.visualstudio.com/docs/containers/ssh
公式サイトの冒頭の一文。


>Use ssh-keygen or similar to get and configure a public/private key pair for SSH authentication. Password authentication is not supported by Docker and not possible with a DOCKER_HOST-based configuration. If a key pair has already been set up, it can be used.

ということでした。
WindowsマシンとLinuxとのssh接続を公開鍵認証にしたら無事にContainerが表示されました。
そして稼働しているContainerにアタッチして作業出来ています。

#2.教訓
今回やりたかったことについてはdocker.host追加するだけで可能です、というような記事も在りましたが、大前提までは書いてくれてなかったりしますね。
やはりある程度詰まったら、多少長くて読みにくくても、本家のドキュメントに戻ることは大事だなと痛感した次第です。
Ruby勉強開始

Ruby勉強開始

本日からRubyの勉強を開始することとした。

理由は下記のとおり

- 自分で魅力的なWebサービスを作れるようになりたい。
- サービスを作りたい経営者や事業者に、Webのプラットフォームを提供できるようになりたい。

Rubyを選択したのは、今一番市場規模がでかそう。という理由。（メンテナンスのしやすさ、学習コストの低さ）


良いサービスを頭の中で思い描くことはできても、ビジネスモデル的に、WEB上で完結する仕組みを作り込めず、魅力的な商品が埋没しているケースが多くあると思う。

そこで、Webプラットフォームの側面から経営者をサポートできるようになりたいと思った。
現状だと、開発に人件費が多く必要となるため、簡易的な仕組みを自装し、サービスを提供できるようになり、企業の利益率をあげてもらうことが目的だ。

そのためにも少しばかり勉強し、皆の役にたてるようにしていきたい。

学習用素材として、Giraffe　Academy　のRuby講座などを利用し、学習経緯をQiitaに残そうと思う。

学習環境は下記のとおり

●学習時間帯
　起床後〜　６：３０

●作業用音楽
Tropical　House　２０２０　ー　２０２１　Hits

●学習箇所
２F書斎

●ガジェット
Macbook、TV（Youtubeキャスト用）、iPhone(tropical house 2020 -2021聞く用）

●最優先
・無理しない（継続しなければ意味がない）
・学習環境の整備（朝起きたら、既にマックが開いてあり、TVにyoutube画面が表示され、それを見てQiitaへ記事掲載するだけ）

まずは、楽しく続けること。学習の仲間を作り、地域に良いサービスを提供できるエンジニアを目指す。
each_with_indexとeach.with_indexの違いを理解する


◆each_with_indexの場合

```rb
array = ["Ruby", "PHP", "Python"]
array.each_with_index do |element, index|
  p "#{index}：#{element}"
end

#以下の様に出力されます
# 0：Ruby
# 1：PHP
# 2：Python
```
◆each.with_indexの場合

```rb
array = ["Ruby", "PHP", "Python"]
array.each.with_index(1) do |element, index|
  p "#{index}：#{element}"
end

# 1：Ruby
# 2：PHP
# 3：Python
```

今までeach_with_indexを使って、わざわざ"index+1"として1から表示してたけど、
each.with_indexは1以外でも指定の数字から始められるので便利！
AIIT(産業技術大学院大学)で学ぶnlコマンド


この記事は[AIIT(産業技術大学院大学) Advent Calendar 2020](https://qiita.com/advent-calendar/2020/aiit)、23日目の記事です。
[nlコマンド Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nl)も開催中です。よろしくおねがいします。

私がnlコマンドに関わることになったきっかけについて書いてみたいと思います。AIITにはとてもお世話になりました。

# システムソフトウェア特論
この科目は、システムソフトウェアの代表としてUnix互換OSを取り上げ、情報の処理・蓄積・通信する仕組みとその利用方法を習得する科目です。現在は[柴田先生](https://aiit.ac.jp/master_program/professor/a_shibata.html)が担当されていますが、私が履修した2014年度は「[シェル芸](https://b.ueda.tech/?page=01434)」の提唱者でもある[上田先生（現・千葉工大）](https://www.robotics.it-chiba.ac.jp/j/?page_id=335)が担当されていました。内容は比較的初学者向けにOSの仕組みなど幅広い内容を扱いますが、「シェル芸」的な課題もあり脳内のシェルインタープリタがかなり鍛えられたと思います。

講義は基本的に端末を触りながらでしたが、試験はふつうのペーパーテストだったので脳内シェルインタープリタの実装が不十分だと、stderrに`xxxx: コマンドが見つかりません`を吐いて戻り値`127`で落ちます。

# システムプログラミング特論
この科目は、プログラミング言語と開発環境に関する講義と演習からプログラミング技術を修得する科目です。データ構造、アルゴリズム、計算量や、APIを用いた効率的な開発方法について学びます。こちらは[小山先生](https://aiit.ac.jp/master_program/professor/h_koyama.html)が担当されています。

この科目では、課題の一つにスクラッチでコマンドを実装するというものがあり、評価方法は「どれだけ忠実に実装できたか」です。そして私が履修した2015年度は実装したコマンド（自分で選んだのかもしれません）が**nlコマンド**でした。

このときは忙しくてあまり課題に時間をかけられなかったのですが、BSD系とGNU coreutilsの実装を比べたりして、課題はなんだかんだ楽しめた記憶があります。このときに`nl`の多彩なオプションに驚きました。

# シェル芸勉強会

直接AIITとは関係ないですが、先述のAIITの教員だった上田先生が開催している勉強会です。私は2013年12月に開催された[第8回クリスマスって何だっけシェル芸なら知ってる勉強会](https://www.slideshare.net/ryuichiueda/20131222-8)が初参加なので、時系列的にはシステムソフトウェア特論よりシェル芸が先です。しかし、当時はあまりシェル芸もできなかった（けど問題は今よりずっと簡単だった）のを覚えています。

自分のTwitterを振り返ってみると、2014年の8月くらいから勉強会で使用しはじめて、2015年の10月には勉強会のLTで`nl`の話をしていたようです。システムプログラミング特論が終わった頃です。~~しかし一体何が楽しくてそんな話をしていたんだ。~~

いまや開催回数が50回を超えるシェル芸勉強会ですが、`nl`的に大きかった出来事は2016年2月に開催された[第21回未経験者大歓迎！誰でも働けるアットホームな職場ですシェル芸勉強会](https://b.ueda.tech/?post=07655)の第7問です。

> Q7
[GitHubのvol.21/Q7にあるテキスト](https://github.com/ryuichiueda/ShellGeiData/blob/master/vol.21/Q7/text)について、各段落の文字数を数えてください。

私は手元のMacbookで`nl`の論理ページを使い以下のような回答を作成しました。

```
$ cat text | grep -o . | sed 's/　/\\:\\:/g' | nl -nln | cat - <(echo '')  | sed -e 's/^1 .*//g' | cut -d' ' -f1  | grep -v '[0-9]' -B1


--
15


--
353


--
103

```

ところがLinuxだとうまく動かない。「なんで？」となりました。段落内の文字数ではなく、積算された文字数が出力されました。

```console
$ cat text | grep -o . | sed 's/　/\\:\\:/g' | nl -nln | cat - <(echo '')  | sed -e 's/^1 .*//g' | cut -d' ' -f1  | grep -v '[0-9]' -B1


--
15

--
368

--
471
```

後日気になってcoreutilsのソースを調べてみたところ、プログラムのバグだということがわかりました。そしてこの機会に初めてメーリングリストにパッチを投稿しました。[初版からの不具合](https://qiita.com/Carol_815/items/ac3efeb363c6edb32bba#%E5%8F%A4%E3%81%84coreutils%E3%81%AEnlv825%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)ということで、論理ページがほとんど使われていない機能だということを実感しました。~~そりゃ誰も使わないよねこんな機能。~~

これ以降も勉強会で見つけた改良点についてはパッチを投稿するようにしています。次が[-iオプションのデクリメント対応](https://qiita.com/Carol_815/items/9e912946d4db1f22ce20#coreutils%E3%81%AEnl%E3%81%AE%E6%96%B0%E6%A9%9F%E8%83%BD)で、2020年8月に開催された[jus共催 第49回ボンバイエシェル芸勉強会](https://b.ueda.tech/?post=20200815_shellgei_49_links)で参加者から「-iでデクリメントできない」という声があり対応に至りました。しかし、それ以外に`nl`の機能修正はほとんどありません。おそらく世界で最も`nl`の機能を使いこなす場がシェル芸勉強会ということなんでしょう。すごいぞシェル芸勉強会。


#さいごに

AIIT（東京都立産業技術大学院大学）について記載した科目名などは当時のものです。現在では研究科・コース再編などの影響もあり、変更になっている内容もあると思います。詳しくは[AIIT公式](https://aiit.ac.jp/)の情報をご確認ください。

そしてAIITで「nlコマンド特論」を開講の際はぜひ声をおかけください。
Ruby の puts と print の違いは改行の有無，だけじゃない

Ruby の初心者向けの記事の定番テーマの一つが「`puts`，`print`，`p` の違い」です。
しかし，

* `puts` は改行付きで出力
* `print` は改行無しで出力
* `p` はオブジェクトをそのまま表示
* `p` は `" "` 付きで表示

のような記述（にとどまっているもの）が多く，残念です。
「`" "` 付き」は恐らく String オブジェクトの話でしょうね。
「オブジェクトをそのまま」とはどういう意味でしょう？？？

公式リファレンスを見れば違いがはっきり分かるのにリンクが無い記事が多いのも残念です。（`pp` のリンクも挙げておきます）

* [Kernel.#puts (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/2.7.0/method/Kernel/m/puts.html)
* [Kernel.#print (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/2.7.0/method/Kernel/m/print.html)
* [Kernel.#p (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/2.7.0/method/Kernel/m/p.html)
* [Kernel.#pp (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/2.7.0/method/Kernel/m/pp.html)

ここでは押さえてほしいポイントを少しだけ挙げておきます。
出力するためにはオブジェクトを文字列化しなければなりませんが，どのように文字列化するかが大事です。

まず，`p` について。

* 主にデバッグ用
* なるべくクラスの違いが出やすいように文字列化
* リテラルをもつクラスはリテラルの形だったりする
* 文字列化は `inspect` メソッドで行う

次に，`print` について。

* 文字列化は `to_s` メソッドで行う

最後に `puts` について。

* 引数ごとに改行
* 配列の場合，要素ごとに改行（要素についても同じ処理）
* 文字列化は `to_s` で行う
* 文字列が末尾に改行を含んでいたら改めて改行しない

`puts` はちょっと複雑です。
「`to_ary` に反応するオブジェクトは，最初にこれで配列化する」という処理も入るのですが，`to_ary`（`to_a` と混同しないこと）をもつクラスは稀なので最初は知らなくてもいいかと思います。

ともかく，これらのメソッドを理解するためには `inspect` や `to_s` について知ることが重要です。

* [Object#inspect (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/2.7.0/method/Object/i/inspect.html)
* [Object#to_s (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/2.7.0/method/Object/i/to_s.html)
* [Object#to_ary (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/2.7.0/method/Object/i/to_ary.html)

上のリンクは `Object` クラスの各メソッドへのリンクですが，`inspect` や `to_s` は多くのクラスでオーバーライドされており，その場合，実際に使われるのはオーバーライドしたほうのメソッドです。
ですから，例えば配列が `p` メソッドでどのように表示されるかを知るには，[Array#inspect](https://docs.ruby-lang.org/ja/2.7.0/method/Array/i/inspect.html) を見なければなりません。
世界で最も強力な九つのアルゴリズム　デジタル著名

内容が複雑なのでWikiも引用しながら解説します。
####0.はじめに
>デジタル署名（デジタルしょめい）とは、書面上の手書き署名のセキュリティ特性を模倣するために用いられる公開鍵暗号技術の一種である。

今回取り上げるのはRSAデジタル著名とゆうものです。

本書とは説明や、例が長く読みづらく感じたのでWikiからの引用で説明します。

#####1.RSA暗号とは
ロナルド・リベスト、アディ・シャミア、レオナルド・エーデルマン
この三人のイニシャルをとってRSAとゆう名前になっています。
RSA暗号の原理は　フェルマーの小定理　+ 中国人剰余定理

RSA暗号は鍵生成、暗号化、復号の三つのアルゴリズムを用います。
数学的な話になってくるとオイラーのトーシェント関数や拡張されたユークリッド互除法や剰余計算など複雑な計算が必要になってくるのである程度を難しいですが説明いたします。

RSA暗号（RSAあんごう）とは、桁数が大きい合成数の素因数分解問題が困難であることを安全性の根拠とした公開鍵暗号の一つである。 暗号とデジタル署名を実現できる方式として最初に公開されたものである。

桁数の大きい合成数の素因数分解が困難とゆう性質を利用した暗号化なので、素因数分解ができる数値を全部公開してしまうと、簡単に解かれ安全性がなくなるので、秘密にする数値、公開する数値などを用いて、アルゴリズムが公開されています。

#####2.鍵生成、暗号化、、復号の三つのアルゴリズム

鍵生成の条件として、１セットの南京錠と鍵をそして署名を入れる箱を用意します。南京錠は専用の鍵がないと開けれません。

鍵は公開します。誰でも開けれるのです。その代わりに南京錠は本人しかロックできないようにします。ここが署名のポイントになります。
鍵を公開しないとロックだけして鍵を渡さないとゆうパターンがあるので鍵は公開します。
本人以外がロックできるようにすると。永遠に開けられない南京錠になる可能性もできますよね。
このアルゴリズムを数値化するとデジタル署名として利用ができます

復号は、鍵を使い南京錠を開けるとゆう過程ですね。公開された鍵を使って開けます。

ここからは計算
--------
#####鍵生成
1素数p,qを選ぶ。
2n=p*q ||　f = (p-1)*(q-1) を計算
3素数eを選ぶ
4d = 1/e mod(f)

(e,n)が公開鍵　(d,n)が復号鍵になります

#####暗号化
１文をn以下の数Mに変換（公開）
２C=M^e mod(n)で暗号Cを作成

#####復号化
1M = c^d mod(n)でもとの数Mに変換
2数Mを分に変換する

#####例
素数p、qを選ぶp = 239 , q = 547 ：　選定
n=p*q = 130733,f = (p-1)*(q-1) = 129948

暗号鍵を選定する　e = 43291
(e,n) = (43291,130733)を公開

復号鍵(秘密鍵、d)の作成
d = 1/e = 1/43291 = 105691 mod f
(f,e)=(129948,43291)にユークリッド互除法
129948 = 3×43291 + 75  
43291 = 577×75 + 16  
75 = 4×16 + 11  
16 = 1×11 + 5  5 = 16 - 1×11
11 = 2 ×5 + 1  1 = 11 - 2 ×5 

互除法の結果(逆順)からe,fの一次式を作成
1 = 11 - 2 ×5 = 11 – 2 ×(16 - 1×11)
= 3×11 - 2 ×16 = 3×(75 - 4×16) - 2 ×16
= 3×75 - 14 ×16
= 3×75 - 14 ×(43291 – 577 ×75)
= 8081×75 - 14 ×43291
= 8081×(f - 3×e) - 14 ×e
= 8081×f - 24257×e

1 = 8081×f - 24257×e のmod f の計算
1 = 8081×f - 24257×e mod f
= -24257×e mod f
= (f – 24257)×e mod f
= (129948 – 24257)×e mod 129948
= 105691×e mod 129948
従って複合鍵(d)は
d =1/e = 105691 mod 129948


#####3.最後に
このようにしてRSA暗号化は成り立っています。安全性の確保は前述した通り素因数分解の困難さです。現在は2020年2月に250桁の素因数分解が世界記録ですのでRSA 鍵を作るときはこの桁数以上に大きな桁で鍵を生成しないといけないですね。
詳しく知りたい方はRSA暗号の数理など検索していただけれなと思います。
Windowsで固まったりしたソフトをbatで再起動した際のメモ

<h1>はじめに

自宅で使用しているドライブ ファイル ストリームの更新が入り
アップデートされたがタスクバーのアイコンが黒くなっていたり
クリックしても反応しないことが多かったのでbatで再起動するようにした際のメモ。

GDFS = Google Drive File Stream

<h1>使用コマンド
<h5>

```
#実行中のプロセスのプロセスIDを検索・表示する(GDFSの場合)
C:\Users\user>tasklist /fi "IMAGENAME eq GoogleDriveFS.exe"

#プロセスを強制終了する(GDFSの場合)
C:\Users\user>taskkill /im GoogleDriveFS.exe /f

#アプリケーションを起動する
C:\Users\user>start "" "C:\Program Files\Google\Drive File Stream\44.0.14.0\GoogleDriveFS.exe"
```

<h1>問題発生

GDFSの場合、フォルダ名にバージョンが使用されていて更新された場合に古いバージョンが起動するか
ファイルが存在しないと言われる可能性がある。

普通はアプリケーションが更新されてもフォルダ名等はかわらないと思うので
フォルダ名にバージョンが入るアプリケーション特有の問題。
<h1>解決法

GDFSの場合、更新がかかるとスタートメニューにショートカットが作成されるので
ショートカットから起動するようする。

```
#ショートカットから起動(GDFSの場合)
C:\Users\user>start " " "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Drive File Stream.lnk"
```

<h1>参考

https://commandprompt.noyokan.com/command/start.html
https://commandprompt.noyokan.com/command/taskkill.html
https://commandprompt.noyokan.com/command/run_shortcut.html
pBibtexのコンパイルエラー

卒論の時は、thebibliographyで列挙していたがそろそろBibtexを使ってみようと思い、試したがちゃんとコンパイルできるまでに小一時間かかったので、記録しておく。


#Bibtexについて
Referenceを逐一thebibliographyに追加していてはキリがないので、まとめてかつ再利用できる便利なもの。あんまり詳しくわかっていないが、使っていくうちに色々便利な点が分かっていくと思う。

#Bibtexの使い方
導入の仕方は、Google先生に聞けばすぐに出てくるので割愛。

#Bibtex導入時の諸問題
私が導入した際に起こした問題は

```
I couldn't open database file file.bib
I couldn't open style file file.bst
```

である。簡単に言うと各ファイルが見つからんと仰せである。

bibファイルとbstファイルは環境によるのかもしれないが.texはファイルと同じディレクトリにあれば
コンパイルがうまくいくはずである。
また他の記事に書いてある通り、

```
kpsewhich -var-value BIBINPUTS.pbibtex
kpsewhich -var-value BSTINPUTS.pbibtex
```
をコマンドプロントに打ち込めば出てくるフォルダにそれぞれが入っていればコンパイルできるはずである。

上記の方法で基本的には解決できると思うのだが、なぜかわからんが私の場合うまくいかなかった。

#解決策
これも元々他の記事に書いてあった方法だが、最後に少し異なる。
➀まず自身で環境変数を指定する。コントロールパネル⇒システムとセキュリティ⇒システム⇒システムの詳細設定⇒環境変数を辿ってお好きなところに設定できる。私は、自宅と研究室の両方からアクセス可能なDropboxに入れておきたかったので、そのように設定した。
➁各フォルダにbib,bstファイルを入れる。
➂<font color="red">コマンドプロンプトで mktexlsrを実行する。</font>

もしかしたら、環境変数を設定したらmktexlsrを実行するのはセットで当たり前なのかもしれないが
tex弱者の私にはそれが分かっていなかったのが原因かもしれない。

ちなみに環境変数を自ら設定した後に上記のコマンドでBIBINPUTSが参照する場所を探しても
設定した場所が出てこない。これもよくわからんので有識者は教えてほしい。

#最後に
こういっては本末転倒なのだが、私にとってTexはあくまで道具の一つなので中身がどうなっているかを理解するよりも使えることが大事なのである。理系の研究室では代々Texの使い方なんかが資料として受け継がれているなんて話を聞く。一方、（私の研究室だけかもしれないが）経済系の研究室だとそういった蓄積がないようなので1から自分でなんとかしないといけないのは少し大変である。同じ内容でお悩みの方の少しでも助けになれればと思う。

#経済系向け
jecon.bstを使う際は``` \usepackage{natbib} ```を忘れずに。



#追記(2020/12/22)
<font color="red">その後自宅で再度設定をした時に気づいたのだが、環境変数設定後はPC再起動が必要かもしれない。
もしかしたらエディタの再起動だけでも行けるかもしれないが。
</font>
Notionでアカウントを削除する

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 21日目のエントリです。
20日目は[Notionで全てのデバイスからログアウトする](https://qiita.com/pictiny/items/700ad875999cdc02a5da)でした。

# アカウント削除
Google連携のサインインで選択するアカウントを間違えるなど、誤って作成したNotionのアカウントを削除したいことがあるかと思います。

左のメニューバーの `Settings & Members` からモーダルを開き、 `My account` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/81c7b657-9d1e-50e7-0259-859e5469b4a4.png)

`Danger zone` の `Delete account` ボタンを押すと、アカウントを削除することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/7a4643c2-fe74-ad49-c85b-e090e72ee3dd.png)

# まとめ
アカウントを簡単に削除できると助かりますね。

公式ドキュメントは[Delete your account](https://www.notion.so/Update-log-in-passwords-account-information-87076204f7f5480db33c35e85c46968b#b94048f3e2b94152b8175eba16cc9b63)にありますのでそちらもご覧ください。