OmniAICreator/Qiita-1.07M huggingface dataset:
vue2-google-mapsでロングタップイベントを実装

## ロングタップは`mousedown`と`mouseup`で検知する

参考 https://maps.multisoup.co.jp/blog/294/

## vue2-google-mapsの`GmapMap`コンポーネントで実現できない

以下はclickは動作するがmousedownは動作しない。

```js
    <GmapMap
        ref="gmap"
        :center="latLng"
        :zoom="16"
        :options="options"
        style="width: 600px; height: 450px"
        @click="place($event)"
        @mousedown="place($event)"
    >
```
vue2-google-mapsの[Mapクラスイベント一覧](https://github.com/Jeson-gk/vue2-google-maps/blob/master/API.md#events)に`mousedown|mouseup`イベントは存在しないため、GmapMapにイベントを設定しても動作しない。

## Google Maps APIオブジェクトにバインドする

これで動く。

```js
  data() {
    return {
      start: null,
      long_tap: 0.5 * 1000, // 0.5秒
      selected_latlng: null
    };
  },
  mounted() {
    let that = this;
    this.$refs.gmap.$mapPromise.then(() => {
      // mousedownとmouseupでロングタップを検知
      google.maps.event.addListener(this.$refs.gmap.$mapObject, 'mousedown', function () {
        that.start = moment();
      });
      google.maps.event.addListener(this.$refs.gmap.$mapObject, 'mouseup', function (event) {
        if (moment().diff(that.start) > that.long_tap) {
          // 緯度経度を設定
          that.selected_latlng = event.latLng;
        }
      });
    });
  },
```

Google Maps APIオブジェクトがロードされたあとにイベントリスナーに追加する必要があるため、
`this.$refs.gmap.$mapPromise.then`の中に処理を書かないと動かない。
PPAPの作業が面倒なのでiPhoneでカンタンに済ませたい


# Overview
ファイルをメール添付で送る時、

* ファイルをパスワード付きzipファイルに圧縮し
* メールに添付し、
* パスワードを別メールで送付します

という一連の作業が面倒くさいので、なんとかこれをやらずに済ませたい。

# 作っちゃいました

これらの一連の作業をほとんど手間かけずに行うことができるiOS向けのアプリ「PPAP Mailer」を公開しています。

アプリURL
[PPAP Mailer](https://apps.apple.com/ph/app/ppap-mailer/id1537350532?ign-mpt=uo%3D2)

# 使い方
## zipファイルに格納したいファイル選択
アプリを起動します。「ファイルを選択」ボタンを押すと、ファイル選択画面が表示されます。「ファイル」に格納されているファイルだけでなく、OneDriveやDropboxに入っているファイルも選ぶことができます。選択できるファイルは1つです。

![IMG_9878.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137274/c340992f-f3b9-5334-a5a9-e880a14c9b14.png)![IMG_9879.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137274/b8bbde0b-b55a-3d0e-5460-170ec5fa1430.png)![IMG_9880.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137274/f1ffd019-497a-fe6d-197a-f83bec88d48c.png)



## zipファイルのパスワード設定
「パスワードの設定」ボタンを押すと、zipファイルにセットするパスワードを選択できます。自分で好きなパスワードを入力できる他、アプリにランダムなパスワードを生成させることもできます。
![IMG_9881.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137274/9d016c59-e2e8-8a91-e26b-e8029638c32e.png)



## あとは送信するだけ
最後に「送信」ボタンを押すと、アプリがパスワード付きzipファイルを自動で生成します。しばらくすると、メーラーにzipファイルが添付された状態になるので、宛先や件名などを入力して送信してください。

送信すると、またメーラーが起動し、本文には先ほど送ったzipファイルのパスワードが自動的に設定されているので改めて宛先や件名を入力して送信できます。

![IMG_9882.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137274/c1e2ab42-1576-1b28-24e1-4064651e32d8.png)![IMG_9883.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137274/74a75d1b-f393-cc68-1d8f-1056d5c801aa.png)

# 終わりに
このように、ファイルをパスワード付きzipファイルに固め、メールに添付、パスワードを改めて送信という一連の面倒くさい作業を自動でやってくれる便利なアプリなのでぜひ使ってみてください。
感想、改善案などもあればお待ちしています。
ちょっと待って！HHKBのキーボードを買う前に

# キーキャップの問題

もし、あなたがキーボードの左上に

![il_1588xN.2601987911_cwdk.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/bbae4988-6ce1-cb70-f704-8fb40a0b49af.jpeg)
**Etsy**
<https://tinyurl.com/y694yo48>

こういったゴージャスなキーキャップでデコレーションしたい（あるいはインスタグラムのために）と考えているなら、打ち心地は最高でも購入を待ったほうがいい。
HHKBのキーボードは**東プレ軸**と呼ばれるもので、こういったキーキャップで東プレ軸に対応しているものは非常に少なく、取り付けるためには**加工が必要でポン付けすることができない**（しかも結構手間がかかる）。

[Cherry MX用のキーキャップをHHKB（東プレ軸）につけてみる①]
(https://keyboard.tokyo/cherry-hhkb2/)

キーキャップのカスタムを考えているのであれば**Cherry軸**が使われたキーボードを選びたい。もっとこだわるのであれば自作キーボードという選択肢もあるだろう。
キーキャップは "**artisan keycap**" とか "**figure keycap**" などで検索すればいろんなものが出てくる。
あなた好みのキーキャップとキーボードが見つかりますように。チャオ！
3分アジャイル スプリントレビュー

- スプリントレビューとは、スプリントの終了時にインクリメントの検査と、必要であればプロダクトバック
ログの適応を行うものである。
- スプリントレビューでは、スクラムチームとステークホルダーがスプリントの成果をレビューする。

---

- スプリントの成果とプロダクトバックログの変更を参考にして、価値を最適化するために次に何ができるかを参加者全員で話し合う。
- これはステータスミーティングではなく、略式のミーティングである。
- インクリメントを提示することで、フィードバックや協力を引き出すことを目的とする。

--- 

- プロダクトオーナーは、プロダクトバックログアイテムの「完成」したものと「完成」していないも
のについて説明する。
- 開発チームは、スプリントでうまくいったこと、直面した問題点、それをどのように解決したかを
議論する。
- 開発チームは、「完成」したものをデモして、インクリメントに対する質問に答える。「完成」の定
義にプロダクト機能のリリースが含まれていれば、それらを表示してレビューしてもらう。

---

- プロダクトオーナーは、現在のプロダクトバックログの状況を説明する。（必要であれば）現在
の進捗から、可能性のある目標とデリバリーの日程を予測する。
- グループ全体で次に何をするべきかを議論し、次のスプリントプランニングに価値のあるイン
プットを提供できるようにする。
- 市場やプロダクトの利用状況によって、次に行うべき最も価値の高いことが変更される可能性
をレビューする。
- 次にリリースするプロダクトの機能や性能のスケジュール・予算・可能性・市場をレビューする。

---

## デイリー

開発チームがスプリントゴールを達成するために、私が昨日やったことは何か？
開発チームがスプリントゴールを達成するために、私が今日やることは何か？
私や開発チームがスプリントゴールを達成する上で、障害となる物を目撃したか？


---

https://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf
alpineでmssql-toolsを使う方法

仕事でDockerImageのサイズダウンを行っていた時、alpineでmssql-toolsがインストールできなくて困ってしまった。
方法を調べる中でGitにソリューションを上げている人がいたので参考にして解決した。
その時の手順を備忘録として残す。

## パッケージが公式提供されてないのだ
https://packages.microsoft.com/config/
![スクリーンショット 2020-11-06 10.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31734/7045f0aa-8438-01e3-149f-4168189de2ab.png)

## 方法をぐぐる
[githubのissues](https://github.com/microsoft/mssql-docker/issues/405)に現時点（2020/11/6）だとクローズされないけど、[Install the Microsoft ODBC driver for SQL Server (Linux)](https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017#alpine-linux)にサンプルがあるので参考にしてねとのこと。
![スクリーンショット 2020-11-06 10.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31734/2aabb388-6277-0e9f-06c8-d709e9107337.png)

## 結局どうしたか
issues読み進めるとdbamasterさんがDockerFileのサンプルをgithubに上げてくださっている！素敵
https://github.com/dbamaster/mssql-tools-alpine
![スクリーンショット 2020-11-06 10.29.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31734/eb0a18dc-dadb-b8df-6545-043d1505f22a.png)

以下のインストールコマンド部分を自分のDockerFileの参考にさせてもらった。

<details><summary>インストールしてるコマンド部分抜粋</summary><div>

```DockerFile
# Installing system utilities
RUN apk add --no-cache curl gnupg --virtual .build-dependencies -- && \
    # Adding custom MS repository for mssql-tools and msodbcsql
    curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_${MSSQL_VERSION}_amd64.apk && \
    curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/mssql-tools_${MSSQL_VERSION}_amd64.apk && \
    # Verifying signature
    curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_${MSSQL_VERSION}_amd64.sig && \
    curl -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/mssql-tools_${MSSQL_VERSION}_amd64.sig && \
    # Importing gpg key
    curl https://packages.microsoft.com/keys/microsoft.asc  | gpg --import - && \
    gpg --verify msodbcsql17_${MSSQL_VERSION}_amd64.sig msodbcsql17_${MSSQL_VERSION}_amd64.apk && \
    gpg --verify mssql-tools_${MSSQL_VERSION}_amd64.sig mssql-tools_${MSSQL_VERSION}_amd64.apk && \
    # Installing packages
    echo y | apk add --allow-untrusted msodbcsql17_${MSSQL_VERSION}_amd64.apk mssql-tools_${MSSQL_VERSION}_amd64.apk && \
    # Deleting packages
    apk del .build-dependencies && rm -f msodbcsql*.sig mssql-tools*.apk

```
</div></details>

## 終わり
【StereoDepth】 SADかMSEどっち派？

<h1>背景</h1>
Stereo MachingでなんとなくSADを使っていたのだがMSEの方が良いのではと思い、とりあえず実験の記録を残して置く。

<h2>left image</h2>
![left.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/aceab6ef-9791-719b-d6c4-b064b712b395.png)

<h2>left estimated</h2>
![estLeft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/bd53573d-2d46-129c-63ae-649e3789ddd7.png)

<h2>SAD</h2>
![SAD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/9de19bb4-9b74-4143-0fff-9e0c5d83f067.png)

```
        SAD_left = torch.mean(torch.abs(left - estLeft))
        SAD_right = torch.mean(torch.abs(right - estRight))
```


<h2>MSE</h2>
![MSE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/c59104c6-d40e-7377-de00-a0283e313332.png)

```
        SAD_left = torch.mean((left - estLeft)**2)
        SAD_right = torch.mean((right - estRight)**2)
```

<h1>結論</h1>
理論的に当然なのだが、MSEの方がよりErrorに対して反応が強くなるので、MSEを使って行きたいと思う

SADの方がいいよ〜っていう意見あったら教えてください！
SQL Server シーケンス番号（連番）をINSERTする方法



SQL Serverにてシーケンス番号（連番）をINSERTする方法のメモ書きです。


```sql:
CREATE SEQUENCE [schema_name . ] sequence_name
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]
    [ START WITH value ]
    [ INCREMENT BY value ]
    [ { MINVALUE value } | { NO MINVALUE } ]
    [ { MAXVALUE value } | { NO MAXVALUE } ]
    [ CYCLE | { NO CYCLE } ]
    [ { CACHE value } | { NO CACHE } ]
```

```sql:
CREATE SEQUENCE dbo.number_sequence
START WITH 1
INCREMENT BY 1;
```

number_sequenceという連番を作成
1から始まる
増分は1



SQL Server Management Studioのエクスプローラー内にシーケンスが作成されている 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617767/f9ebb911-a785-ef16-536a-3c4d084c26dc.png)


```sql:
INSERT INTO dbo.テーブル名(シーケンス番号)
VALUES(NEXT VALUE FOR number_sequence);
```

上記SQLでシーケンスをINSERTできます。
Ubuntu上でRaspberry Pi Zero向けクロスコンパイル事始め

# 概要
UbuntuでコンパイルしたC言語のプログラムをRaspberry Pi Zeroで動かす。
それだけです。

# 環境
ホスト： Ubuntu 20.04.1 < Virtual Box 6.1 < WIndows10
ターゲット： Raspberry Pi Zero WH

# 手順
## ARM向けコンパイラのインストール

```shell
$ sudo apt install g++-arm-linux-gnueabi
```

今回必要なのは gcc なんですけど、今後使うかもしれないので g++ をインストール。gcc とか必要なものも一緒にインストールしてくれます。

Raspberry Pi 向けのクロスコンパイラとして `g++-arm-linux-gnueabihf` をインストールする記事もありますが、こちらでは Zero の CPU（ARMv6系）には対応していません。

## ビルド
の前に今回ビルドするプログラムを、、

```C:hogehoge.c
#include <stdio.h>

int main()
{
	printf("Hogehoge Cross!!\n");
	return 0;
}
```

最初なのでこんなもんで。
こちらをこのようにビルド。

```shell
$ arm-linux-gnueabi-gcc -march=armv6 hogehoge.c -o hogehoge_armv6
```

`-march=` で ARMアーキテクチャを指定。
Raspberry Pi Zero が ARMv6系なので、そのように指定しましたが、今回のプログラムでは
`armv4`, `armv5t`, `armv5te`, `armv5tej`, `armv6` の指定でどれも動きました。
`armv7` を指定したものは "Segmentation fault" って出て動きませんでしたね。

# 動かします
上で「動きました」とか書いちゃいましたが、ビルドしてできた hogehoge_armv6 ファイルを Raspberry Pi Zero の適当なディレクトリにコピーして、、

```shell
$ ./hogehoge_armv6
Hogehoge Cross!!
```

こんな感じで動きました。

# まとめ
簡単なプログラムなのもありますが意外と簡単に動きました。

# 追記

続きの記事を書きました

* [Debian上でRaspberry Pi Zero向けクロスコンパイル ～共有ライブラリを使ってみる](https://qiita.com/manontroppo1974/items/4805047ccc186d729b3b)
* [Debian上でRaspberry Pi Zero向けクロスコンパイル ～自作の共有ライブラリを作ってみる](https://qiita.com/manontroppo1974/items/652d92bad76aaa75e7d9)
C言語　インライン関数

# インライン展開

関数にはインライン展開を指定することができます。
inlineが指定されている関数は、｢インライン関数｣と呼ばれ、コンパイラーは｢インライン展開｣を行う場合があります。

## 関数呼び出しコードをその場に展開する｢インライン展開｣

インライン展開は、関数呼び出しのコードをその場に展開する機能です。
コンパイラーは関数呼び出しのコストをなくすことができるので、コードを読みやすくしたまま、生成されるプログラムの実行速度を上げることができます。

## マクロとインライン関数の違い

[翻訳フェーズ - cppreference.com](https://ja.cppreference.com/w/c/language/translation_phases)

マクロ関数の定義と展開はフェーズ4、インライン関数の展開はフェーズ7で行われます。

マクロ関数の展開は、概念的にテキストとしての(最高でも字句レベルでの)切り貼り操作に近いものになります。それにより、たとえば展開結果のかっこの対応のチェックや識別子のスコープチェックなどはマクロの段階では行なえません。

インライン関数の解釈や展開は、構文解析後に、言語構文を壊すことなく、つまり展開後の小0度が構文エラーをこすことなく、構文の型やチェックの元で行われます。

## FreeBSDでの実装例

```stand.h
/* min/max (undocumented) */
static __inline int imax(int a, int b) { return (a > b ? a : b); }
static __inline int imin(int a, int b) { return (a < b ? a : b); }
static __inline long lmax(long a, long b) { return (a > b ? a : b); }
static __inline long lmin(long a, long b) { return (a < b ? a : b); }
static __inline u_int max(u_int a, u_int b) { return (a > b ? a : b); }
static __inline u_int min(u_int a, u_int b) { return (a < b ? a : b); }
static __inline quad_t qmax(quad_t a, quad_t b) { return (a > b ? a : b); }
static __inline quad_t qmin(quad_t a, quad_t b) { return (a < b ? a : b); }
static __inline u_long ulmax(u_long a, u_long b) { return (a > b ? a : b); }
static __inline u_long ulmin(u_long a, u_long b) { return (a < b ? a : b); }
```

## 参考

[C初心者が知っておきたいヘッダーファイルとリンクの基礎知識 (3/4)：目指せ！ Cプログラマ（終） - ＠IT](https://www.atmarkit.co.jp/ait/articles/1404/11/news045_3.html)

[C言語でマクロ関数とインライン関数の違いはなんですか？ - Quora](https://jp.quora.com/C-gengo-de-makuro-kansuu-to-inrain-kansuu-no-chigai-ha-nande-suka)
bcryptでのhash

#bcryptのhash
非同期でhashを行う。

``` javascript:hash.js
const bcrypt = require('bcrypt');     //bcryptの読み込み
const saltRounds = 10;                //hashする回数
const pass = XXXXXXXXXXX;             //hashしたいパスワード

function passWordHash(pass){
  var salt = bcrypt.genSaltSync(saltRounds); //saltを生成している
  var passHash = bcrypt.hashSync(pass,salt);     //passとsaltを利用してhash
  return passHash;
}

console.log(passWordHash(pass)); //hashされたパスワードが出力される
```

```console:pass
$2b$10$PXGSNfywWeedDsq10zX8vuPXkJQ6ZjqU9HKSjGZ8XnojEwM9lFOky
```

今回はコンソールに出しているが本来はDBなどに保存して利用する。
saltRoundsは何回hashをするかを2のn乗で指定できる、今回は10に指定しているが現在では10では保守性が低いらしいので実際に使う場合はスペックと相談しつつできる限りしたほうがよい。

ちなみに
salt単体を出力すると、

```console:salt
$2b$10$PXGSNfywWeedDsq10zX8vu
```
先頭の$2bの部分がbcryptのアルゴリズムを10saltRoundsで指定した数字が入る。
それ以降の数字がsaltということになる。
#一致しているかどうかの判断
私が詰まったのはこの部分だ、saltを生成して利用するわけだからsaltを自分で保存するものだと思っていた。saltを別個に保存して参照する時にパスワードに対して同じ処理をして、一致するかどうかを判断ししようと思っていたが、saltはbcryptが生成したものでしか扱えず既にできたsaltを使うことができなかった。
saltはhashしたパスワードと一緒に保存されており、hash前のパスワードとhashした後のパスワードだけで参照ができる機能が存在していた。この仕組みがなかなか公式ドキュメントからはわかりづらく(英語だった影響もあるが)詰まった原因にもなった。

```javascript:login.js
const bcrypt = require('bcrypt');
const pass = XXXXXXXXXXX;  //hashする前のパスワード
//保存しておいたパスワード
const passHash = $2b$10$PXGSNfywWeedDsq10zX8vuPXkJQ6ZjqU9HKSjGZ8XnojEwM9lFOky;
bcrypt.compareSync(pass, passHash);  //true 
```

#終わりに
今回の記事が初投稿です。おかしな点や解釈違いなどありましたらご指摘お願いいたします。
私は本気でsaltがどこに保存されているのかわからず自分で保存して参照しようとまでしました。
調べている過程で日本語で解説している記事があまり見当たらなかったので（検索が下手なだけかもしれませんが）備忘録として書かせていただきました。
震源データ3D展開の改良【地球儀版】

この記事は[気象庁の震源データを3Dで展開](https://qiita.com/UsagiLabo/items/14c503b817791ac722f9)で開発したモデルを仮想の地球儀上に展開するように改修したアプリケーションである。

#はじめに

前回作成したバージョン（以下、平面版という）は球面メルカトル図法で展開された平面地図上で震源を3D表示させていた。投影座標系における表示となるため、緯度が異なると、本来震源の密集度が同じであっても違って見える。また震源と特定位置の距離感も掴みにくかった。今回は仮想的な地球儀内に震源をプロットし、それらの問題を解消することを試みた。

#開発したアプリケーション

![スクリーンショット 2020-11-06 10.01.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731876/9cd14470-7607-67c0-ae57-c9635c213825.png)

* [気象庁震源データ3Dプロット（地球儀版）](https://kitao.net/works/earthquake/spherical.html)

##機能

基本的に前述の平面版と同等であるが、地球表面の凹凸を表現することが難しいため、標高誇張機能を除外した。

#注意

* 自分が所持するスマホ、タブレットでは動作しなかった。
* 地球儀は回転楕円体ではなく、真球として計算した（地球儀の表現は厳密には多面体である）。
* 本来全ての震源は地球儀内（地下）に配置されるはずであるが、地球儀外（空中）に位置する震源があるため多少調整している。

#データ

* 震源データは前回同様[気象庁](https://www.data.jma.go.jp/svd/eqev/data/bulletin/hypo.html)のデータ1980年から2018年までのデータ（3,688,834件）。これを点群PNG化して使用している。前回と同じデータをそのまま使い、表示位置を求める計算式を変更した。
* 地球儀に貼り付けた画像はNASAの[BlueMarble](https://visibleearth.nasa.gov/collection/1484/blue-marble)。

#プログラム詳細

プログラムは3D描画ライブラリであるThree.jsを用いて開発している。Three.jsには独自のシェーダを容易に適用可能なShaderMaterialが用意されており、震源の描画にはこれを使用した（ジオメトリはBufferGeometryでメッシュはPoints）。地球儀の描画にはSphereBufferGeometryとMeshPhongMaterialを使用した。

```
実際のプログラムについてはおいおい記載する予定。
```

#興味深く感じた点

* 気象庁のデータには日本から遥か遠くの震源も含まれるが、それらの震源がプレートに沿って位置しているらしいことがよく見てとれる。

#参考文献

* 気象庁 (2020) 気象庁 | 震源データ. [https://www.data.jma.go.jp/svd/eqev/data/bulletin/hypo.html](https://www.data.jma.go.jp/svd/eqev/data/bulletin/hypo.html) (確認日：2020.10.30).
* シームレス地質図ラボ (2020) 点群PNG. [https://gsj-seamless.jp/labs/pcpng/](https://gsj-seamless.jp/labs/pcpng/) (確認日：2020.10.30).
GitLabでIssueに紐付けるbranchの派生元が強制的にデフォルトブランチ（masterなど）になってしまう

![截圖 2020-11-06 10.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392332/598329a8-4ff5-a60e-731c-bea63dc504c3.png)


### 回避策

下から順に
「Source(branch or tag)」「Branch name」を編集する癖があるのだが、その後「create branch」を押すと99%くらいの確率で作ったブランチがデフォルトブランチ（masterなど）から伸びてしまっていた（ブラウザはGoogle Chrome、最新版のはず）。

「Source(branch or tag)」「Branch name」を編集した後、もう一回「Source(branch or tag)」欄を編集（１文字消して、もう一回同じ字を入力するなど何でも良い）し、その後「create branch」ボタンを押すと、正常に目的のブランチから派生するブランチが作れるようになった。
Mendix でバッチジョブを実行する

# バッチ処理

Mendixで [バッチ処理](https://ja.wikipedia.org/wiki/バッチ処理) を行うケースもあると思います。Mendixで作成したアプリケーションを単体で利用する場合はあまり関係ないですが、Mendix外の既存システムと連携する場合などでは、外部システムと連携タイミングを協調させる必要があったりします。特定の日時にバッチ処理を実行したい、ファイルを受信したらジョブを実行したいなどです。特に日本の場合まだまだバッチ処理が大きなウェートを持っていたりします。

MendixのAppStoreには、Microflow SchedulerやMicroflow Scheduled Event Managerなど定期的にマイクロフローを実行するアプリが公開されていて、時間を指定してマイクロフローを実行したり、繰り返し実行したりすることができます。

そもそもローコード開発ツールのMendixを使って、バッチ処理を行うということがアンチパターンだと思っていますが、バッチ処理の実行タイミングをもっと詳細にコントロールしたいことがあるかもしれません。そのような場合に [ジョブ管理システム](https://ja.wikipedia.org/wiki/ジョブ管理システム) を使用してバッチ処理を実行させる方法を検討してみます。

# Hinemos

[Hinemos](https://ja.wikipedia.org/wiki/Hinemos) は [NTTデータ](https://ja.wikipedia.org/wiki/NTTデータ) が公開しているオープンソースの [ジョブ管理システム](https://ja.wikipedia.org/wiki/ジョブ管理システム) です。類似の製品には [JobScheduler](https://ja.wikipedia.org/wiki/JobScheduler) などがあります。[Hinemos](https://ja.wikipedia.org/wiki/Hinemos) は無償で利用することができ、有償のサブスクリプションも提供されていてサポートを受けることができます。

# 連携方法

イントラネットのオンプレミスあるいはクラウドの専用環境に、HinemosサーバーとMendixサーバーが構築された環境を想定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/751319/b8e559b8-0e56-6cce-2906-97eb80464ebf.png)

- マイクロフローの実行開始： REST APIからマイクロフローを呼び出した場合、マイクロフローの実行可能時間はhttpセッションのタイムアウトで制限されます。CommunityCommonsアプリから非同期でマイクロフローを呼び出す機能を用いて、REST APIの呼び出しをトリガーにして非同期でマイクロフローを実行します。これにより長時間のバッチ処理を行うことができます。
- マイクロフロー実行終了の検知：実行対象のマイクロフローが終了した時に、Hinemosサーバー宛にカスタムトラップを送信することで、非同期で実行したマイクロフローの終了をHinemosに通知します。Hinemosはモニタージョブでカスタムトラップ待ちの状態で止まっていて、Hinemosが受信したカスタムトラップを契機にバッチ処理の後続が実行されます。

![architecture](https://github.com/naofum/Mendix-HinemosConnector/blob/master/Screenshots/HinemosConnector_2.png?raw=true)

# HinemosConnectorについて

[こちら](https://github.com/naofum/Mendix-HinemosConnector/releases/download/v2.0.0/HinemosConnector.mpk) からHinemosConnector.mpkをダウンロードして、Mendix Studio Proでパッケージをインポートして利用します。 [ソースはこちら](https://github.com/naofum/Mendix-HinemosConnector)。適宜カスタマイズしてください。
JavaScript 超基礎 処理を外部ファイルに記載する

# 目的

- JavaScriptの処理をHTMLに記載するのではなく別のファイルに記載する方法をまとめる

# 実施条件

- 下記の手順でダイアログボックスを表示するソースが手元にあること。
    - [JavaScript 超基礎 ダイアログボックスを表示する](https://qiita.com/miriwo/items/588c318740a9b169044f)

# 概要

1. 準備
1. JavaScriptの記載場所変更
1. 確認

# 詳細

1. 準備
    1. index.htmlが設置してあるディレクトリに移動する。
    1. 下記コマンドを実行してJavaScriptのファイルを作成する。

        ```terminal
        $ touch daialog_box.js
        ```
    1. index.htmlとdaialog_box.jsが同じディレクトリ内にあることを確認する。
1. JavaScriptの記載場所変更
    1. 下記コマンドを実行してhtmlファイルを開く。

        ```terminal
        $ vi index.html
        ```
    1. script要素の中に記載されている処理を削除しJavaScriptのファイルを指定する。
        - 修正前

            ```index.html
            <!DOCTYPE html>
            <html lang="ja">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <title>Document</title>
            </head>
            <body>
                <h1>JavaScript</h1>
            
                <script>
                    window.alert('ダウンロードを開始します！');
                </script>
            </body>
            </html>
            ```
        - 修正後

            ```index.html
            <!DOCTYPE html>
            <html lang="ja">
            <head>
                <meta charset="UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <title>Document</title>
            </head>
            <body>
                <h1>JavaScript</h1>
            
                <script src="daialog_box.js">
                </script>
            </body>
            </html>
            ```
    1. 下記コマンドを実行してJavaScriptのファイルを開く。

        ```terminal
        $ vi daialog_box.js
        ```
    1. 下記の内容を記載する。

        ```daialog_box.js
        window.alert('ダウンロードを開始します！');
        ```
1. 確認
    1. フォルダからindex.htmlを探しダブルクリックで開く。

        ![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/eeaea532-b67f-eb7d-7073-a7c072964c7c.png)

    1. ブラウザが起動し下記のようなダイアログボックスが表示されることを確認する。

        ![このページの内容_と_Document.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/96231137-c672-f0b3-04a1-4eebca5dfc7a.png)
AまたはBという要件のときは列挙型 (enum)、AかつBという要件の時は構造体(struct)などを用いよう

### AまたはB

ある同じ画面Cが、画面Aまたは画面Bから遷移しうるとする。

Aから呼ばれたのかBから呼ばれたのかどちらかだが、これを判断する時に例えば何らかのフラグ用のデータが保存してあったらAから呼ばれた、されていなければBから呼ばれている「はずだ」などと判断しているとする。

そうすると、そのデータのあるなしについて齟齬が生じないよう「運用でカバー」しなければいけなくなり、間違いが発生する可能性がある。例えば、そのデータを今後違う画面でも活用したい、という時、画面Cの判断にとって不都合が生じないよう考慮しなければならず面倒くさい上、いつか誤りが発生してしまう可能性がある。

Aから呼ばれている「はずだ」という不確実な方法ではなく、列挙型などを用いて、「AかBかのどちらかしかありえない」ということを人間の運用ではなくコンパイラにチェックさせると良い。

```
enum CScreenCaller {
   case AScreen
   case BScreen
}
```

列挙型というのは全ケースのうちどれかというのが保証される。これを画面Cを生成する時に渡してあげれば、AかBかどちらから呼ばれたのか確実に判定できることになる。

もし、「画面Aから呼ばれた時だけあるデータを画面Cに渡したい！」ということがあれば、列挙型に関連する値を付けられるような言語であれば、以下のように書くことができる。

```
enum CScreenCaller {
   case ASCreen(string: SomeData)
   case Screen
}
```

### AかつB

「このデータAとこのデータBの両方が必ず必要である！」という場面では、クラス・構造体などにそれらのデータを変数として持たせれば良い。

```
struct Hoge {
   var dataA
   var dataB
}
```

こうすれば、AとBを両方持つということがコンパイラによって保証される。

### まとめ

以上のような「または」「かつ」の事例で用いた列挙型と構造体等を組み合わせていけば、複雑なロジックを必要とする場面でも誤りがないことが保証できる。
windowsバッチで変数の空チェック。

昔は、引数をさらにダブルクォーテーションで囲む
（例えば　IF "%PATH%" == ""）
が正解だと思ってました。

でも、%PATH%に入っている文字列にスペースがあると、
（例えば　"C:\Program Files\"）
IF文は"Program"の後のスペースで比較構文の区切りだと勘違いし、
"Files"なんて演算子は知らないと怒ります。

では、更なる正解は、これらしいです。
　IF [%PATH%] == []

以上。ご確認くださいますようお願いいたします。
mysqlのデフォルトパスワードを変更

Amazon Linux AMI の使用を試みたが、選択できなくなっており
Amazon Linux2 AMI を使用しました。

その際に躓いたmysqlのパスワード設定方法などの覚書です。

## sudo cat /var/log/mysqld.log | grep password
sshでログイン後、

```
sudo cat /var/log/mysqld.log | grep password
```
を実行すると

```
[Note] A temporary password is generated for root@localhost: **********
[Note] Access denied for user 'root'@'localhost' (using password: YES)
......
```
こんな感じの表示が帰ってきます。
これの******の部分が初期パスワードです。
command+Cでコピーしときます。

## mysql -u root -p
次に

```
mysql -u root -p
```
を実行すると

```
Enter password:
```
となるので、command+Vで先程のパスワードをペーストしてエンターです。
この際、ペーストしても何も見えません。
上手くいくと

```
Welcome to the MySQL monitor.
```
と表示されました。

## set password for root@localhost=password('******');

次にパスワードを変更しましたが、初期設定では
validate_password_policyがMEDIUMのため
大文字、小文字、記号、数字を含まなければなりません。

```
mysql> set password for root@localhost=password('HogehogeN@1');
```
などにします。

もし、hogehoge1などにしたい場合は

```
mysql> SET GLOBAL validate_password_policy=LOW;
```
を実行して、validate_password_policyをLOWにした後、

```
mysql> set password for root@localhost=password('hogehoge1');
```
で変更できるかと思います。

なお変更したvalidate_passwordの確認は

```
SHOW VARIABLES LIKE 'validate_password%';
```
になります。
Scratchでスプライトに「カタコトの日本語」を喋らせる

最近Scratchでこんなアプリを作りました。

猫をクリックすると喋りますが、片言です。


[猫がカタコトの日本語でしゃべる](https://scratch.mit.edu/projects/445514482)
[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/d30b0034-0b37-b460-dba8-48ed05df0188.png">](https://scratch.mit.edu/projects/445514482)

# 言語を英語にしてローマ字？で書く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/ceef1e5b-c75d-7b19-d082-3b2b0f9e61a3.png)


本来は言語を日本語にして、「こんにちは」としゃべる・・・・

とするのですが、

言語を「英語」にして「こんにちは」をローマ字にします

「こんにちは」の場合は
「konnitiha」だと「コニチハ」となるのでちょっと試行錯誤して
「kon ni chiwa」
としました（他のやり方もあるかも。）

# セリフ表示
字幕がないと何言ってるのかわからないので、タイミングを合わせてセリフも表示してあげましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/9990d083-f9e4-b663-bdb6-5b1229c6a812.png)


というわけで、みなさんもカタコトで喋らせて遊んでみてね！
TCPについて小学生でもわかるように説明してみた

##前提知識:通信プロトコルとは?
○○通信をするときは××なルールに従ってやり取りしようねという事。
プロトコルを日本人に例えると「会話する時は日本語使いましょう」みたいな感じ。
いきなり宇宙語で話されても99%の人が理解できないですよね?
会話1つとってもルールが自然と出来上がるものです。
![スクリーンショット 2020-11-06 9.11.23（3）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/89230991-3b3a-69a8-fce8-e0b12fd59f68.png)


## TCPとは?
通信するときに使うルールのひとつ。主なルールは「安全重視で通信しましょう」
TCPを使った通信では、

1. 送信者がデータ送信
2. 受信者は受け取った!と伝えます。
3. 送信者は受け取った!の返事がくれば「ちゃんと送信された!」と安心できる。
4. 受け取った!の返答が来なければ、もう1回データを送信すればいい

## TCPの特徴
ポイントはちゃんと届いたか確認しながらやり取りをするので下記の特徴があります。

- 漏れなく伝わる可能性は高い
- スピードは遅くなる

## TCPは何をしてくれるの?
クライアント(ユーザー)とサーバー(提供者)がお互いに通信ができる状態なのか確認し、
コネクションと呼ばれるネットの道路的なものを作った上でデータのやり取りを行います。
コネクションの確立は次の3種類のやり取りにより行われる。

### データ送っていい?(SYN)
クライアントからサーバーに対して、接続を要求するためのSYNパケットと呼ばれるデータを送る。
ざっくり説明するとクライアントが「データを送っていいですか?」という質問をサーバーにする感じ。
※パケットは通信用に細切れしたデータのこと。

### データ送っていいよ!(ACK)
TCPでは安全な通信を実現するためにデータを送信した後、必ず相手からの返答を確認してからデータを送信します。この確認方法がACKパケットです。ざっくり説明すると「送信してOK!」という返答する感じ。

### データ送っていいよ!こっちも送っていい?(ACK+SYN)
上記2つを一気に行う行為。
クライアントが最初にSYN(送っていい?)に対してサーバーが
OKだよ!(ACK)こっちもデータ送っていい?(SYN)を行う。
![スクリーンショット 2020-11-06 9.13.53（3）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/9e93d702-5998-0d0d-59c3-626294d7d49a.png)
Cloud9でRailsサーバーが起動出来ない

#問題
AWS Cloud9 に初めてRailsをインストール後、新規アプリを作成してサーバーを立ち上げようとした時にターミナルにエラーが出た。

#開発環境
* AWS Cloud9
* Rails -v 5

#発生したエラー
* **webpacker** がインストールされていない
* **yarn** がインストールされていない

#エラー発生までの時系列
Cloud9にRails-v5をインストール

```
$ gem install rails -v 5
```
新規〇〇アプリを作成する

```
$ rails new 〇〇
```
〇〇アプリのディレクトリに移動する

```
$ cd ~/environment/〇〇
```
サーバーを立ち上げる

```
$ rails s -b $IP -p $PORT
```

:warning: **エラーの発生** :warning:
<br>
ターミナルのエラー文を見てみると以下のようなエラー内容でした。

```
Please run rails webpacker:install Error: No such file or directory
```
エラーは**webpacker**がインストールされていませんよ。
という内容です。

#解決 webpackerとyarnのインストール
webpackerがインストールされていない事が原因だと分かったので、

```
$ rails webpacker install
```
**webpacker**をインストールします。
この時、**yarn**がインストールされていない状態だったので以下のエラーが発生しました。

```
Yarn not installed. 
Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
```
エラーは**yarn**がインストールされていませんよ。
という内容です。
**webpacker**をインストールする為には**yarn**が必要なので、先に**yarn**をインストールします。

```
$ npm install -g yarn
```
コマンドで**yarn**をインストールします。
**yarn**をインストールしたら、次に**webpacker**をインストールします。

```
$ rails webpacker install
```
**webpacker**がインストール出来たらOKです。

**yarn**と**webpacker**をインストールしたら、再度サーバーを立ち上げます。

```
$ rails s -b $IP -p $PORT
```
無事にサーバーが立ち上がりました:thumbsup:

#補足
**webpacker：**Railsでwebpackを使えるようにするGemファイル。JavaScriptやCSSなどをひとつにまとめてくれて、通信速度を向上させるためのもの

**yarn：**JavaScriptのパッケージマネージャ。JavaScriptを管理する仕組み
[iOS] UIWebViewを使用するアプリのアップデート期限が延長されました

新規アプリはUIWebView APIが含まれているとApp Store Connectへのアップロードでエラーになります。

一方、既存アプリのアップデート期限に関しては「2020年12月」とアナウンスされていました。

参考リンク：
[[iOS] UIWebViewがいよいよヤバいらしい（"ITMS-90809: Deprecated API Usage"メールが届いた件）](https://qiita.com/y-some/items/1f9baeedd160f2d0fcbb)
[[速報] [iOS] UIWebViewが使えなくなる最終期限が告知されました](https://qiita.com/y-some/items/060492caa8a74db8107a)
[[iOS] UIWebView APIが含まれているライブラリを調べる方法](https://qiita.com/y-some/items/b1ea6eb37bd129d7aa8d)

これについて、[Apple Developer News](https://developer.apple.com/jp/news/?id=edwud51q)にて、

> アップデートの期限を2020年末以降に延長します。正式な期限が決まり次第お知らせします。

とアナウンスされました。

どの程度延長になるのかはまだ（2020/11/06時点）では分かりませんが、早めに対応しておいた方が良いのは間違い無いですね。。。
ベクトルスマートオブジェクトの使い方

#ベクトルスマートオブジェクト
ベクトルスマートオブジェクトを使って、Illustratorのスマートオブジェクトをphotoshopと連動させることができます。

###Illustratorファイル
![スクリーンショット 2020-11-06 8.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633943/2328f1f3-0e03-2a14-457c-a471994346c2.png)

まずはIllustratorで作った素材をphotoshopにスマートオブジェクトで貼り付けます。

###photoshopファイル
![photoshopファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633943/6a925235-ccf4-ee55-6b23-9a53ca94764c.png)

photoshopのベクトルスマートオブジェクトのサムネイルをダブルクリックすると、Illustratorが開かれて、編集できます。

「Illustratorとphotoshopの連携」の詳しい内容はこちら
https://helpx.adobe.com/jp/photoshop/how-to/design-workflow-illustrator-photoshop.html
【React】 useEffectの引数について

#概要
Reactの勉強を始めるにあたってつまずいたので書き出してアウトプットすることにしました。

#useEffectとは
useEffectはReact clasのライフサイクルcomponentDidMount,componentDidUpdateとcomponentWillUnmountの３つと同様な処理を行うことができるHookです。

#第一引数

第二引数をからにすると、Render毎に実行される関数を取ります。

```
useEffect(() => {
   console.log("Render毎に実行")
})

```
基本空にしない

#第二引数

・第二引数は、第一引数で指定した関数の実行タイミングを調整する
・空配列で指定した場合[]は初回レンダー時と毎回の更新の際に実行される。

```
useEffect(() => {
   console.log('初回レンダー時と毎回の更新の際に実行される')
}, [])

```
Kotlin + Spring bootで @Service に @Transactional した時の @Autowired がnullになる時の対処方法

Kotlin + Spring bootのサーバサイドKotlinで@Transactionalを付与したときに@Autowired がnullになってエラーが発生したときの対応方法です。

ここでの問題は、Kotlinではメソッドがデフォルトでfinalであるため、Springがクラスのプロキシを作成できないことです。

```
o.s.aop.framework.CglibAopProxy: Unable to proxy method [public final int org.mycompany.MyDAO.update(...
```

classとメソッドに「open」を追記することで問題が解決されます。


```kotlin
@Service
@Transactional  
open class MyDAO(val jdbcTemplate: JdbcTemplate) {

   open fun update(sql: String): Int {
       return jdbcTemplate.update(sql)
   }

} 
```

これで自分のシステムもうまく動きました。
マスアサインメントの脆弱性とは？

<h2>概要</h2>
<p>railsの勉強をしている際に出てくるマスアサインメントの脆弱性という言葉、正直何を言っているかよくわからなかったので調べて自分の言葉でまとめてみました。</p>

<h2>マスアサインメントとは？</h2>
<p>RailsのDBを更新する際などに複数のカラムを一括で指定できる事。<br>複数のカラムを同時に更新できるのはとても便利ですね。</p>

<h2>注意点</h2>
<p>便利な反面マスアサインメントには危険な部分もあります。それは、不正リクエストによって管理者権限などをいじられてしまう事です。</p>

<h2>なぜ管理者権限などがいじられてしまうのか？</h2>
<p>Chormeのディベロッパーツールなどを使用してフォームへの投稿内容を編集できてしまうためです。<br>例えばUserモデルにWebサイトの管理者であるかどうかを示す、admin属性というものがあるとします。<br>ディベロッパーツールのEdit as HTMLを使用してadmin属性を追加して値を入力して送信をするとそのままDBが更新されてしまいます。<br>こうなると、管理者でもないのにWebサイトに忍び込んでいたずらが出来てしまうのでとても危険な状態です。<br>※Rails4からはストロングパラメーターにしないとDBへの保存や更新ができなくなりました。</p>

<h2>ストロングパラメーターとは？</h2>
<p>マスアサインメントの脆弱性を防止するためにストロングパラメーターというものがあります。</p>
<p>ストロングパラメーターを使用することでディベロッパーツールなどを用いた不正リクエストを防ぐ事ができます。</p>

<h2>ストロングパラメーターの使い方</h2>
<p>params.require(:user).permit(:name, :email, :password, :password_confirmation)</p>
<p>requireメソッドで引数に設定したキーの値を取得して、permitメソッドで許可したいパラメーターだけをフィルタリングします。</p>
【初学者向け】インライン要素とブロック要素を理解して、綺麗なナビゲーションバーを作成する。

ナビゲーションバーを作成する際、各要素の種類を理解してなかったため作成に手こずったので初学者向けにちょっとまとめてみました。恐らくここらへんでつまずく人もいるかと思うので、助力になれば幸いです。

※なにか本とかを元に作ったわけではないので間違ってる可能性もあります。経験に基づきまとめているところはあるのでそこらへんはご了承願います。


## 完成イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/11233145-cbce-8a6e-8709-b407cc1292da.png)
￼

## マークアップ

```html:html
<nav>
  <ul>
    <li>
      <a href="">menu1</a>
    </li>
    <li>
      <a href="">menu2</a>
    </li>
    <li>
      <a href="">menu3</a>
    </li>
  </ul>
</nav>
```

```css:css
nav{
  background-color: gray;
  text-align: center;
  border: 2px solid black;
}

/* navの中の全てのliタグ */
nav li{
  padding: 10px;
}
nav li:not(:last-child){
  border-bottom: 2px solid black;
}

/* liのhoverアクション */
nav li:hover{
  background-color: orange;
}

/* navの中の全てのaタグ */
nav a{
  color: white;
}
```
ブラウザを確認してみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/ca11c791-e07f-ca37-5a2e-c1d1c0798980.png)
￼
liのホバーアクション自体はできたが、肝心のリンクが出ない・・・
はい、これはaタグのインライン要素が関係しています。

#### そもそもインライン要素って？

HTMLにはブロック要素とインライン要素があります。
詳しくは自分で調べて納得して欲しいのですが、簡単に言ってしまうと以下のようになります。

・ブロック要素・・・<font color="red">「改行」と「高さ」がある要素。「幅」は「親要素に対して100%」。

・インライン要素・・・<font color="red">「高さ」がなく、横並び（改行」がない）になる要素。「幅」は「子要素に対して100%」。<font color="red">

となり、今回の問題児、aタグは「インライン要素」となります。
インライン要素は「幅」は「子要素に対して100%」なので、今回の場合「menuX」というテキストの幅になります。

ではやることは簡単。aタグをブロック要素に変える。

```css:css
nav{
  background-color: gray;
  text-align: center;
  border: 2px solid black;
}

/* navの中のliタグ */
nav li{
  padding: 10px;
}
nav li:not(:last-child){
  border-bottom: 2px solid black;
}

/* liのhoverアクション */
nav li:hover{
  background-color: orange;
}

/* navの中のaタグ */
nav a{
  color: white;
  display: block;
}
```

ブラウザを確認してみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/5668d19a-1da1-b45d-d253-a801d9d5e645.png)
￼

これで、できたかと思いきやカーソルがテキストの高さ外に来るとリンクが表示されなくなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/330600c0-5dd7-977d-8869-8cdf80d9c67f.png)
￼

いろいろ試して、aタグにheight:100%;を指定しても無理・・・

#### じゃ、結局どうするか。

<font color=“red”>このナビゲーションバーにおいて一番優先しなきゃいけない要素は何か？</font>

今回はリンクをつなげる事が目的なので「aタグを中心にコーティングをする」が正解。

で、最終的なコードは以下。

```css:css
nav{
  background-color: gray;
  text-align: center;
  border: 2px solid black;
}

/* navの中の全てのaタグ */
nav a{
  color: white;
  display: block;
  padding: 10px;
}

/* navの中の最後のliの中のaタグ以外のaタグ */
nav li:not(:last-child) a{
  border-bottom: 2px solid black;
} 

/* navの中の全てのaタグのホバーアクション */
nav a:hover{
  background-color: orange;
}
```

これでリスト内のどの位置でホバーしてもリンクが表示される。

#### 何をどう変えたか

最初はnav liを中心に考えていたため、cssもnav liの記述が多くなっていた。
ただそれだと肝心のaタグ(リンク)の範囲がliタグの高さいっぱいにまで広げる事ができない。
なのでliに当てていたcssを今回のナビゲーションの中心人物であるaタグに置き換えた。
<font color=“red”>こうすることでliのサイズを気にすることなくaタグのサイズを自由に変えられるので後で改造する時も楽である。</font>
単純に結果論だがコード量も減っているためいい結果になったのではないかと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/dc139d01-ed04-69f2-ed68-b7f14bb2f17d.png)

## 最後に


今回はかなり初学者向けに書かせていただいたので少しでも助力に慣れればいいと思います！

￼
Git LFSに「素人でも理解できる」脆弱性発見。(CVE-2020-27955)

# TL;DR
もしあなたが**Windowsユーザー**で、**Git LFS**を使っているなら、いますぐ**バージョン2.12.1**にアップデートすること。

# 脆弱性の概要
Git LFSに脆弱性が発見され、約1日前(2020年11月5日)にバージョン2.12.1で修正、そして数時間前にCVE(CVE-2020-27955)が公表されました。影響を受けるプラットフォームはWindowsのみのようです。(理由は下)

発見者による情報によると、脆弱性の攻略は極めて簡単です:

* 攻撃者がリポジトリを用意し、
* `git.bat`という名のファイルを作る。中身はご自由に。
* 適当なファイルを作成し、Git LFSでトラックする。
* これらをコミットし、pushする。
* 被害者がこのリポジトリを`git clone`すると、`git.bat`内のコードが実行される。

# 原因
攻略法からもわかる通り、これは「カレントディレクトリから実行ファイルを実行する」という、[Uncontrolled Search Path Element](https://cwe.mitre.org/data/definitions/427.html)の問題です。「DLLハイジャッキング」と原理は同じです。

Go言語は書いたことがありませんが、以下の説明でだいたい理解できます (リリースノートより):

> This occurs because on Windows, Go includes (and prefers) the current directory when the name of a command run does not contain a directory separator. This has been solved by always using PATH to pre-resolve paths before handing them to Go.

> この問題は、Windowsにて、ディレクトリの区切り文字が含まれないコマンド名を実行するときに、(実行ファイルの検索場所に)カレントディレクトリを含め、そして優先するからです。この問題は、Goにコマンドを渡す前に、いつも環境変数PATHを使って事前に実行ファイルを検索することによって修正されました。

# 分析
私の分析では以下の通りです:

- CVSSv3.1: 8.8(High) (CVSS3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H)
- CVSSv2: 6.8(High) (CVSSv2/AV:N/AC:M/Au:N/C:P/I:P/A:P)

# 参考資料

* 発見者が詳細な情報を書いています: https://legalhackers.com/advisories/Git-LFS-RCE-Exploit-CVE-2020-27955.html
* リリースノート: https://github.com/git-lfs/git-lfs/releases/tag/v2.12.1
* NVD: https://nvd.nist.gov/vuln/detail/CVE-2020-27955
【Widget】JavaScriptでページャーの裏側を作る【Pagination】


[![MIT License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/heppokofrontend/pager/blob/HEAD/LICENSE) [![Published on NPM](https://img.shields.io/npm/v/@heppokofrontend/pager.svg)](https://www.npmjs.com/package/@heppokofrontend/pager)

ページャを作るときのコアロジックをnpmに公開しました。
TSに書き直して一部変数名等々を書き換えています👀🥒

そのうち`Pager`を使ったWeb Componentを作るのもいいかもしれない…( ˘ω˘ )

<https://www.npmjs.com/package/@heppokofrontend/pager>

<https://github.com/heppokofrontend/pager>

追記：2021/07/23 

----

ページャー（Pager, Pagination）を実装する時にコアになる部分をまとめておきたかったので忘備録。

## 配列で項目を管理する

```js
const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
```

## 配列から、任意の量だけ項目を抽出する

```js
const index = 0; // 現在のページ
const limit = 3; // 3個ずつ表示 

items.slice(index * limit, (index * limit) + limit); // => [1, 2, 3]
```

```js
const index = 2; // 現在のページ
const limit = 2; // 2個ずつ表示 

items.slice(index * limit, (index * limit) + limit); // => [5, 6]
```

## 最大何ページあるか調べる

```js
Math.ceil(items.length / limit); // => 4
```

## Pagerコンストラクタを作る

```js
class Pager {
    limit = 5; // １ページあたり何項目表示するか
    index = 0; // 何ページ目か
    #items = []; // 保持する情報のリスト

    // 最大何ページか
    get max() {
        return Math.ceil(this.#items.length / this.limit);
    }

    // 現在のページ内容
    get page() {
        const {limit, index} = this;

        return this.#items.slice(index * limit, (index * limit) + limit);
    }

    /**
     * current
     * @param {number} _index 欲しいページ数
     * @returns {any[]} 表示させたい項目のリスト
     */
    current(_index) {
        this.index = _index;

        if (this.index < 0) {
            this.index = 0;
        }

        if (this.max <= this.index) {
            this.index = this.max - 1;
        }

        return this.page;
    }

    /**
     * @param {Iterable} items - リスト化したいイテラブルな値
     */
    constructor(items) {
        this.#items = [...items]; // sliceのためにArray化
    }
}
```

### 使ってみる

```js
const pager = new Pager([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);

pager.current(1); // => [6, 7, 8, 9, 10]
pager.current(-1); // => [1, 2, 3, 4, 5]
pager.current(pager.max); // => [6, 7, 8, 9, 10]
pager.current(100); // => [6, 7, 8, 9, 10]
pager.max // => 2

pager.limit = 2; // 表示数を変更

pager.max // => 5
pager.current(1); // => [3, 4]
pager.current(200); // => [9, 10]
pager.page // => [9, 10]

pager.index = 3; // 現在のページ番号を変更

pager.page // => [7, 8]
pager.current(7); // => [7, 8]
```

`index`とか`limit`もアクセサー（`get`,`set`）にしてもいいかもしれないし、`constructor`のなかで一部の値をイミュータブルにしてもいいかもしれない👀
perlワンライナーでAAAAからTTTTまでの塩基配列を全部リストアップする


# 課題

AAAA, AAAC, AAAG, AAAT, AACA, AACC, ..., TTTTと、4塩基からなるDNA塩基配列を全て列挙する。
これを1行1配列の形式でテキストファイルにセーブする。

# 検討

文字列をいじるんだから、そりゃ使うツールはperlだろう。

単純に考えれば4重forループを作ってその中で文字列を連結して出力すればよい。

だが、幾らなんでも安直というか。第一、4ぐらいならいいがこれを10とか20とかに拡張する必要が生じたとしたらどうする？

# 解決

標準ではないモジュールに頼っているのが癪ではあるが、思いつく限りではこれが一番簡単だった。

```
perl -MMath::BaseCalc -le '$n=4; $x=new Math::BaseCalc(digits=>[qw/A C G T/]); map {print substr('A' x $n.$x->to_base($_), -$n)} 0..4**$n-1' > output.txt
```

塩基配列を4進数の数字と捉えて処理している。先頭の$nの定義を変更してやれば、塩基数が10でも200でも1000でも問題なく処理できるはずだ、多分。

# おわりに

もっとクールな方法をご存じの方はコメントで教えてください。

# 追記

私が書いたものより遥かにクールなコードを書いた方がさっそく現れた。

[組み合わせを生成する - Perl - ルモーリン](https://www.lemorin.jp/perl/3p_combination.html)

それによれば、以下でいける。

```
perl -E "say for <@{['{A,C,G,T}' x 4]}>"
```

ふつうはファイル名の展開に使うglobをこう云うふうに使うアイディア、`@{[]}`記法の応用など、いずれも私の引き出しにはないものだった。

perlを使いはじめて何年もたつが、本当に奥が深い。いまだ深淵を見通すこと叶わず。
EXCELのシートを目次順に並べる

あまり使う機会はないのだけど、EXCELで設計書などを記述する場合、シート順が決められているケースがあって、結構手間がかかるのでＶＢＡにしました。
実はネットに色々サンプルあるんですが、ダミーのシートを作成して最後に消す、みたいなサンプルばかりで、シートを並べ替えるのに大げさ感あるのと、エラーが起きたらダミーシート残っちゃうので、もっと単純なロジックを書きました。

ロジックは、なんのことはない、シート名を書いた目次セルをう読み込んで一番最後に移動します。

```
Public Sub 目次頁にいたら順にシートを並べる()
    Const LIST_SHEET_NAME = "目次"  'シート一覧の物理的なシート名
    
    '目次にいななら処理中断
    If ActiveSheet.Name <> LIST_SHEET_NAME Then
        MsgBox "シート並べ替えは目次ページで実行してください"
        Exit Sub
    End If
    Dim ListSheet
    Set ListSheet = ActiveSheet
    '
    '目次を最後に
    Worksheets(LIST_SHEET_NAME).Move After:=Worksheets(Worksheets.Count)
     
    Dim i As Long
    For i = 1 To Worksheets.Count
        If Trim(ListSheet.Cells(i, 2).Value) = "" Then
            Exit For
        End If
        Worksheets(ListSheet.Cells(i, 2).Value).Move After:=Worksheets(Worksheets.Count)
    Next i
    Worksheets(LIST_SHEET_NAME).Select
    MsgBox "シートの並べ替えが終わりました。"
End Sub

```

ついでに一覧も（汚いソースで恥ずかしいけど）

```
Public Sub シート一覧作成()
    Const LIST_SHEET_NAME = "目次"
    Const LIST_NO_COLIDX = 1
    Const LIST_NAME_COLIDX = 2
    Dim intIdx As Integer
    Dim intWksCnt As Integer
    Dim objWks As Object
    Dim strWks() As String
    Dim intLstShtIdx As Integer
    Dim intLstIdx As Integer
    Dim strSubAdr As String
    intLstShtIdx = -1
    intWksCnt = Excel.ActiveWorkbook.Worksheets.Count
    ReDim strWks(intWksCnt)
    For intIdx = 1 To intWksCnt
        strWks(intIdx) = Worksheets(intIdx).Name
        If strWks(intIdx) = LIST_SHEET_NAME Then
            intLstShtIdx = intIdx
        End If
    Next
    If intLstShtIdx < 0 Then
        Set objWks = ActiveWorkbook.Worksheets.Add(Before:=Worksheets(1))
        objWks.Name = LIST_SHEET_NAME
    Else
        Set objWks = Worksheets(LIST_SHEET_NAME)
    End If
    objWks.Select
    Range("A1:B999").ClearContents
    intLstIdx = 0
    For intIdx = 1 To intWksCnt
        If intLstShtIdx <> intIdx Then
            intLstIdx = intLstIdx + 1
            Cells(intLstIdx, LIST_NO_COLIDX) = intLstIdx
            Cells(intLstIdx, LIST_NAME_COLIDX) = "
            strSubAdr = "
            ActiveSheet.Hyperlinks.Add _
                Anchor:=Cells(intLstIdx, LIST_NAME_COLIDX), _
                Address:="", SubAddress:=strSubAdr, TextToDisplay:=strWks(intIdx)
        End If
    Next
End Sub

```
【Unity】Animatorからステート（AnimatorState）の一覧を取得する

# バージョン
Unity 2019.4.13f1

# はじめに
Unity で Mecanim のチェックをするのにこういうのを作りたいと思いました。
![animator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/e47c00ee-6999-fb8c-9e88-997f1bf7c549.png)
![goal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/955cab18-f9c9-c25f-aba6-17bbf4dac9e6.png)

一応、アニメーションクリップのインスペクタの下側で Animator の付いたモデルをぶち込めばモーション単体のチェックはできます（画像参照）が、
いずれレイヤーのブレンドやらアバターマスクやら IK やらを含めて確認したくなるだろうことを考えると、やっぱりシーン上で見たいなぁとなります。
![clip_preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/65cb8dd5-4c45-0004-5917-cd764751ebca.png)


さて実現方法ですが、各ステート間の遷移は [CrossFade](https://docs.unity3d.com/ja/current/ScriptReference/Animator.CrossFade.html)（もしくは [CrossFadeInFixedTime](https://docs.unity3d.com/ja/current/ScriptReference/Animator.CrossFadeInFixedTime.html)）でやればいいとして、問題は「あらかじめ全てのステート名を知っていなければならない」ことです。
Animator ウインドウを眺めながら手作業でステート名を入力してもいいのですが、どう考えても面倒…。

そこで、今回は **Animator から全てのステートを取得することはできないのか？**というお話。

# 方法
結論から言うと**エディタでなら可能**でした。

そもそも Animator クラスに AnimatorController 型のプロパティがないなぁ…と思ってたんですが、AnimatorController クラスは UnityEditor 名前空間の所属になっており、アセットとして扱うためのクラスのようです。

代わりっぽいもので RuntimeAnimatorController 型の [runtimeAnimatorController とかいうプロパティ](https://docs.unity3d.com/ja/current/ScriptReference/Animator-runtimeAnimatorController.html)がありますが、リファレンスを見る限りこいつからはステート情報には辿り着けなさそうに思えます。

で、色々調べていたところ、[まさにやりたいことをやっている方](https://kandycodings.jp/2019/03/17/unidev-animatorcontroller/)がおられました。

なるほど、RuntimeAnimatorController を AnimatorController にキャストできたんですね…。[^1]
で、そこから layers でレイヤーを取得し、stateMachine → states とたどれば望みのステート情報が取得できると。

[^1]: よくリファレンス見ると [AnimatorController が RuntimeAnimatorController を継承している](https://docs.unity3d.com/ja/current/ScriptReference/Animations.AnimatorController.html)じゃん…。ということで普通の（？）ダウンキャストになりますね。

ということで、前述の方が掲載しているソースを参考に自分用にカスタマイズしてこんな感じになりました。

[ソースコード（gist）](https://gist.github.com/neuneu9/bab1fd19de7bd7ba6cbc3cc463ba0040)

![result.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/87c62bb9-112a-2de3-479f-47afc1f66cf2.gif)


# 注意点
前述した通り、AnimatorController が UnityEditor 名前空間にあるので残念ながらビルドでは使えません。
とはいえチェックなどの用途で、エディタ上に限られていても役に立つ場面はあるかなと思います。

なお、ビルドでも実現する案としては、あらかじめ上の手段でステート情報を取って、SerializeField として埋め込んでおくなどの工夫でいけそうです。
ですが、それはまた別の機会に…。

# クレジット
本記事のキャプチャイメージでは下記の素材を使わせて頂きました。

- [ニコニ立体ちゃん 3Dモデル](https://3d.nicovideo.jp/alicia/)
- [Anime Girl Idle Animations Free（Asset Store）](https://assetstore.unity.com/packages/3d/animations/anime-girl-idle-animations-free-150406)
shellでファイルが存在しない場合だけコピーを実行する書き方 

ポイントは[]の中に半角スペースを入れること。
たとえば以下の場合、カレントディレクトリに.envが存在しない場合、.env.exampleを.envにリネームしてコピーする。

```shell
if [ ! -e .env ]; then cp -n .env.example .env; fi
```
M5StackからLINE Notify発信  M5 UI Flow 編

#この記事でやったこと
* M5Stackのボタンを押すと、LINEにメッセージ発信される
* 発信メッセージに時刻を入れる
* 以上をM5 UI Flowで構築

非常にシンプルですが、メモ代わりの記録として。

#M5 UI Flowを使う
M5 UI FlowはWebベースでM5シリーズをブロックプログラミングできるプラットフォームです。ブラウザから利用できるので、例えばリビングのソファーからiPadだけでM5Stackのプログラミングを気軽に楽しむこともできます。

準備としてM5StackにUI Flow対応のファームウェアを書き込みます。Macでのやり方として下記を参考にしました。
[M5Stack UIFlowのファームウェア更新手順](https://mag.switch-science.com/2019/10/18/uiflowupdate/)

#処理の流れ
![6D91756A-5D8A-48CF-8731-9E459C8389C5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/02a8d884-c76b-6655-da90-063d8bd7ad49.jpeg)

わざわざ図にするほどでもないほどシンプルですが、アイコン収集がてら。

#IFTTTの設定
IFTTTのWebhookからLINE Notifyへの通知を設定します。定番なので事例はWeb上にたくさん転がっています。
ちなみに10月のIFTTT有料化の時にProアップデートしてしまっていたので活用しない手はありません。やってることは無課金でできる範囲の事ですが。
![1FC559C4-9106-4504-B520-C2923C71C2A9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/8c538c28-c561-4e80-ac45-db170a009ba3.jpeg)
Event NameはM5Buttonとしました。

#M5 UI Flowのブロック構成
Aボタンを押す→NTP時刻取得→IFTTT Webhookに発信
時刻をValue1に入れてIFTTT側に受け渡しています。
変数IftttKeyには自分のIFTTTのKeyを設定します。
![F954F948-68E9-4DCD-8754-D5FB12D09E85.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/f13488dc-291a-166f-fd4f-c53573bda49e.jpeg)

#完成
M5 UI Flow 画面右上の再生アイコンでM5 Stackにプログラムを転送します。

Aボタンを押すと時刻つきでLINE発信できました。
![3776DC37-5BA6-41A0-9F49-69B16D9DCFCA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/370c7a56-aedb-ed12-639e-b5b95f5afdcd.jpeg)
あとは各ボタンでメッセージ変えたりとか、色々使えそうですね。

#参考にした記事 
[M5StackのUIFlowからLINEに通知を送れるようにする方法](https://qiita.com/twtjudy1128/items/e4980be7ffd1b465144a)
[LINE Notify を利用して UIFlow のプログラムで LINE に通知を送る] (https://qiita.com/youtoy/items/76586479c2d4c5893c5b)

#追記 NTPブロックの使用(2021.9.11)
HTTPSで時間取得を行なっていましたが、M5Flow(1.8.4)でNTPブロックが使用可能になっていたので、そちらを使うように変更しました。NICTの「http/httpsを利用した時刻配信」は2022年3月で終了します。それまでの間にも、周知のための時限停止が行われています。
![スクリーンショット 2021-09-11 17.47.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641828/3dfdd414-e5c2-3f0b-5ba3-57802e0139c0.png)
非常にスッキリしましたね。

###参考
[ネットワークを利用した時刻配信におけるNTPへの一元化について
～ http/httpsを利用した時刻配信の終了に向けて～]
(https://jjy.nict.go.jp/httphttps-index.html)
初心者がプログラミングを学ぶ計画と進捗

# 自己紹介と目的
こんにちは

来春から駆け出しエンジニアになるPon-Yoichiです。
こんな名前ですが、本名はYoichiではないです笑
来年から大手SIerへの就職が決まっており、プログラミングに触れておこうかなと思ったのでQiitaのアカウントを取りました。

計画表兼、備忘録兼、これからプログラミングを学ぶ同志の道標になればと思って、
定期的に記事を書いていこうかなと思っています。

計画表も兼ねているので、この記事は定期的に編集されると思います。
ちょくちょく覗いてみてね。



# 現状把握
とりあえず、僕の現在(2020/11/6)の状況をまとめておこうと思います。

ProgateでPythonを一周。

以上です。

ほぼ何もやってないですね笑

ちなみに、Progateをやるまでは、高校の情報の授業でHTMLに触れた程度なので全くの初心者です。

Progateも一周しただけなので、「へぇ、プログラミングってこんな感じなんだぁ」という理解度です。

# なぜPythonか
最初の言語にPythonを選んだ1番の理由は、「名前がかっこいいから」です笑

SIerに勤めるならJavaとかがいいのかもしれませんが、ちらっと見た感じプログラミング言語感が強かったのでパスしました笑

(とっつきやすさが大事なはず、、、)

使う単語に違いはあれど、構造や論理構成自体は大きく変わらないだろうと踏んで、ほぼ英語なPythonで一通りをこなそうと思います。

この決断が吉と出るか、凶と出るか。。。


# 学習方法について
自分のことは一通り書いたので、今後の学習方法について書こうと思います。

まず、大前提として僕は「完全に独学」で挑もうと思います。

指示されたものをこなすだけになるのが嫌なのと、何を学べばいいか考えるのも勉強のうちだと思うからです。

(あと、お金がない、、、)

基本的には、インターネット(ブログ、YouTube、Qiita)で情報を集めて、レベルに応じて書籍やProgateなど最少額の投資で学ぶ予定です。

だから、僕が書く記事はだいたい引用元があると思うので、詳しくはそちらを見てもらうことになると思います笑

##具体的な予定

1. 環境を整える
2. 初心者の登竜門「リバーシ」
3. ブロック崩し

4. Pythonで作る対話システム　オーム社　著:東中,稲葉,水上（敬称略）
　　　　　　　　　　"↑現在進行中"
5. 未定
6. web上で動くアプリ作成

こんな感じですかね

なんにも具体的じゃないですが笑

まあ、行き当たり場たり、気の赴くままにって感じです。

入社までに、webアプリを作れたらなと思ってます。　←　そんなにうまくいくのか、、、

後日、時間ができたら、写経の内容もまとめて別で投稿しようと思ってます。。。。。

#まとめ
まとめと言っても、今回は情報を伝えただけですが笑

プログラミング学習は挫折する人が多いそうですね（汗）

僕は挫折すると入社後えらいことになるので、挫折しないと信じています笑

卒論とTOEICとその他いろいろやることも普通にあるので、ずっとプログラミングに集中するのは難しいかもしれませんが

ぼちぼち、頑張っていきますよ
【Vue】 TypeScript 「Property ‘XXX’ has no initializer and is not definitely assigned in the constructor.」の対処法

## エラー内容
```terminal
Property ‘XXX’ has no initializer and is not definitely assigned in the constructor.
```

__piyoプロパティが初期化されていないよ。コンストラクターで明確に割り当てられていないよ。__
とのこと。
## 解消法

```typescript:hoge.vue
@Component
export default class hoge extends Vue {
  @Prop()
  private piyo: hogehoge[];
```

こうなっているのを

```typescript:hoge.vue
@Component
export default class hoge extends Vue {
  @Prop()
  private piyo!: hogehoge[];
```

こうする。
__piyoプロパティに型アサーション「！」を付けることで解決する。__

## 原因
親コンポーネントで値が割り当てられた事を、明示的に宣言していないから。
TypeScriptは静的に割当済みかどうか判断することができないため、エラーを返してしまう。
__感嘆符(!)__を付けることで、TypeScriptに値が確実に割り当てられいる事を伝えられる。
devise導入からusersテーブルの作成まで

<br>
## deviseをインストールする

`Gemfileの一番下に記述`

```
gem 'devise'
```
<br>
`コマンドを実行`

```
% bundle install
```

```
サーバーの再起動
% rails s
```

```
deviseの設定ファイルをrailsアプリケーションにインストール
	
% rails g devise:install
```
`実行後`
以下の2つのファイルを作成することができる。

config/initializers/devise.rb
config/locales/devise.en.yml

## Userモデルを作成する

`コマンドを実行してUserモデルを作成`

```
	
% rails g devise user
```
`実行後`
以下のように、メッセージが表示される。

```
# 中略
create    db/migrate/20200523092621_devise_create_users.rb
create    app/models/user.rb
```
<br>
### usersテーブルに追加するカラムを記述

`必要なカラム(今回はnameカラム)を記述し、マイグレーションを実行`
・空の値を許可しないNOT NULL制約で作成

```db/migrate/20XXXXXXXXXXXX_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name,               null: false
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      # 〜省略〜
    end
```
`マイグレーションを実行`

```
% rails db:migrate
```
テーブル・カラム情報を変更後、ローカルサーバーを再起動
<br>
<br>