OmniAICreator/Qiita-1.07M huggingface dataset:
Excelファイルの内容をJUnitでテスト

POIライブラリを用いてHttpServletResponseに出力したExcelファイルの内容をJUnitでテストする方法。
responseからの読込にハマったので備忘として残します。

testクラスではMockHttpServletResponseを用いてresponseを生成する。

```
//テスト対象クラスへ渡すresponse
MockHttpServletResponse response = new MockHttpServletResponse();

//テスト対象クラスで処理したresponseから出力するExcelファイルをInputStreamで読込
InputStream inputStream = new ByteArrayInputStream(response.getContentAsByteArray());
```

xlsx形式はバイナリファイルなので、
`HttpServletResponse`の`getContentAsByteArray()`を用いて`InputStream`で読み込む事ができる。

後は

```
Workbook workbook = WorkbookFactory.create(inputStream);
```

でExcelファイルを開いて内容を1セルずつtestしていけばOK。
Node.js Gmail送信

#はじめに
Gmailアカウントでメール送信をしたい場合があります。
gmail-sendを利用すると便利です。

#gmail-sendをインストール
`npm install --save gmail-send`

#送信アカウントの設定
```javascript
const send = require('gmail-send')({
  user: 'xxx@gmail.com',
  pass: 'xxxアカウントのパスワード',
  to:   'taro@yahoo.co.jp',
  subject: 'Gmailからのメール送信確認の件',
});
```

#テキストメールを送信する
```javascript
send({
  text:    '●●様 \n こちらは２行目です。\n',  
}, (error, result, fullResult) => {
  if (error) console.error(error);
  console.log(result);
})
```

#HTML形式メールを送信する
```javascript
send({
  html:    '●●様 <br/> こちらは２行目です。<br/>',  
}, (error, result, fullResult) => {
  if (error) console.error(error);
  console.log(result);
})
```

ファイル添付などの書き方はGithubのサイトで確認できます。
https://github.com/alykoshin/gmail-send

#Gmailのセキュリティ変更
Gmailのアカウントはソースからの送信は許可しないと、エラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/acdcd282-3a2b-d475-17ff-33e9225c843e.png)

安全性の低いアプリのアクセスにオフの場合はオンにする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/17629a89-99f2-ca14-02a3-ba844884a361.png)

これでエラーが回避できますので、パスワードの管理は十分注意が必要です。
またGmail送信アカウントのパスワードを変更した場合、ソース側のパスワードも忘れずに設定する必要があります。

#AWSの場合セキュリティグループの設定
Gmailアカウントで送信したい場合、456ポートを許可する必要があります。


参考URL：https://github.com/alykoshin/gmail-send

以上
WordPressで最初から入れておくとよいプラグイン

久々にWordPressでサイトを構築したのですが、その際に最初から導入したプラグインを紹介します。

## フォームを作る

* Contact Form 7
  * お問合わせフォームを簡単に作れる
* Contact Form 7 Conditional Fields
  * Contact Formの入力項目の値によって関連する項目の表示・非表示を切り替える
* Contact Form 7 Serial Numbers
  * Contact Formの入力内容をメールで送信する際に、タイトルや本文などに連番やタイムスタンプを挿入する
* Flamingo
  * Contact Formのメール送信に失敗したときに備えて、データベースにも同じ内容を格納する

## 画像関連

* WP Offload Media Lite
  * デフォルトでは画像はWebサーバの中にそのまま置かれるが、これをクラウドストレージなどにオフロードできる。例えばS3に保存してCloudFrontで配信すればWebサーバーの負荷を低減できる
  * そもそもWebサーバの冗長化を考えるとデータを腹持ちするのはまずいので、大規模なら必須
* EWWW Image Optimizer
  * アップロードした画像を最適化する
  * APIキーを購入すると最適化の度合いを上げられる
* Enable Media Replace
  * 一旦アップロードした画像を差し替える

## 認証関連

* Force Login
  * どの画面でもログインを強要する。開発中に役に立つ
* Limit Login Attempts Reloaded
  * 複数回ログインに失敗した場合に、一定期間ログインを無効化する
* Login rebuilder
  * デフォルトのログインURLを無効にして、別のログインURLを作る

## バックアップ

* UpdraftPlus - Backup/Restore
  * データベース、プラグイン、テーマ、アップロードなどをローカルやクラウドストレージにバックアップする
  * S3にバックアップを転送しておけば色々安心

## メール

* WP Mail SMTP
  * SESなど外部のメールサーバを利用できるようにする
  * パブリッククラウドの場合サーバに自前でSMTP立てるのが面倒(申請がいる)なので

## その他

* ARI Adminer
  * データベースを直接編集できる。さすがにphpMyAdminとかは入れたくない
* Classic Editor
  * 投稿画面のエディターを旧バージョンのものに変更する
* Duplicate Post
  * 既存の投稿を複製して新しい投稿を簡単に作れる
* Public Post Preview
  * 未公開の投稿にURLを振って直接リンクだけ見えるようにする
* Zen Menu Logic
  * 画面によってメインメニューを切換える
* Google XML Sitemaps
  * Googleにサイトのページ情報を知らせる

## 敢えて入れなかったもの

* All in One SEO Pack
    * 重すぎる。ogpなどは自前でfunctions.phpに実装すれば問題ない
初学者によるプログラミングMemo　#13 Ruby計算

# はじめに
今回は計算のプログラムのお話です
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

# 目次
- 問題
- 回答
- 解説

## 問題
3桁の整数を入力すると、百の位と百の位と十の位と一の位の数字に対して、加算・乗算を行う
それぞれの計算結果を足し合わせるプログラムを記述せよ

### ヒント

- Rubyでは整数 / 整数 = 整数（小数点以下を返さない）という性質がある
- %は割り算のあまりを計算結果として返す
- 足し算と掛け算のメソッドをそれぞれ定義しておく
- 入力には"gets.to_i"を使う


## 回答

```.rb
def addition(a, b, c)
  a + b + c
end

def multiplication(a, b, c)
  a * b * c
end

def slice_num(num)
  # 100の位
  hundreds_place = (num / 100) % 10 # hundreds_place = num / 100 と同義
  # 10の位
  tens_place = (num / 10) % 10
  # 1の位
  ones_place = (num / 1) % 10 # ones_place = num % 10 と同義
  return hundreds_place, tens_place, ones_place
end

puts "3桁の整数を入力してやー"
input = gets.to_i
X, Y, Z= slice_num(input)
add_result = addition(X, Y, Z)
multiple_result = multiplication(X, Y, Z)
puts "足したんと掛けたん合わせたら#{add_result + multiple_result}やで"
```

```
-----------入力結果---------------
=> 3桁の整数を入力してやー
=> 543
=> 足したんと掛けたん合わせたら72やで
```

## 解説
まず問題は「どうやって各位の値を整数として取り出すか」ということです
ここで一つ目と二つ目のヒントが活きてきます
まず、百の位を取り出すためには、3桁の整数を100で割り、さらにそれを10で割ったあまりを出してやれば求められます

＊例えば521の十の位を求めたいとする
521をまず10で割ると結果は52（Rubyの性質上、整数 / 整数 = 整数）
そして次に"2"を求めたい訳なので、"52 % 10"をしてやるとあまりが算出されるため"2"を取り出すことができる
回答は演算の理解のために同じ書き方をしているが、先頭の位（今回なら百）と一の位はコメントアウトしている計算方法でも同じ結果が得られる

そして、"slice_num(num)"の返り値を決めなくてはなリマセン
"return"を使わないと、このメソッドの返り値は"ones_place"の計算結果のみとなってしまいます
各計算結果を"X,Y,Z"にそれぞれ代入してやります
それを元に定義しておいた"addition","multiplication"メソッドを使って計算をし、最後に表示させれば完了です

おそらく難しい点としては"X, Y, Z= slice_num(input)"この辺りでしょうか
"return"で３つの結果を返しそれを、それぞれに代入させる方法は、覚えておいて損はないと思います
もし難しければ、分解して、一つのメソッドに一つの計算ということで定義してやればさほど難しくはないかと思います
DBのインデックスについてまとめてみた

# インデックスとは
テーブルからデータを検索する際に使用する、特定のカラムだけを取り出してそれを並び替えたもの。

# インデックスのメリット
インデックスを張ることで、データ検索時に通常よりも効率よく検索できる。
例えば以下の4カラムからなるテーブルを考える。

| id | name | address | old |
|--:|:--|:--|--:|
| 1 | Suzuki | Tokyo | 24 |
| 2 | Yamada | Osaka | 18 |
| 3 | Takahashi | Nagoya | 32 |
| 4 | Honda | Tokyo | 16 |
| 5 | Endou | Tokyo | 41 |
| 6 | Morita | Sapporo | 27 |
| 7 | Fukuda | Osaka | 26 |
| 8 | Sano | Tokyo | 19 |
| 9 | Kondou | Nagoya | 38 |
| 10 | Imai | Osaka | 30 |

このテーブルでnameのカラムを対象としたインデックスを作成すると以下のようになる。

| id | name |
|--:|:--|
| 5 | Endou |
| 7 | Fukuda |
| 4 | Honda |
| 10 | Imai |
| 9 | Kondou |
| 6 | Morita |
| 8 | Sano |
| 1 | Suzuki |
| 3 | Takahashi |
| 2 | Yamada |

idとnameだけのカラムでかつ、nameが昇順に並び替えて保存されることでnameで検索したときに容易にそのデータのidを取得できる。

# インデックスのデメリット
- テーブルのデータとは別に独自にデータを保持するので、データが追加されたときにはインデックスにもデータが保存される。
- データ追加時に並べ替えが行われる。
Xmingを利用して、UbuntuのGUIアプリケーションをWindows上で起動する。

# はじめに
WindowsからLinux上のGUIアプリケーションを起動する場合、
単にTera-termからスタートコマンドやバッチを実行するだけでは起動しない。

LinuxやUnix系OSはそのウィンドウシステムに、「X Window System」を採用している。
「X Window System」は、クライアントサーバ方式でありシステム間の通信には「Xプロトコル」を
採用している。

すなわち、LinuxのGUIアプリケーションをWindowsで表示したい場合、Windows側に「Xプロトコル」で
通信できるサーバーを設定する必要がある。

今回は、フリーのWindows用Xサーバー「Xming」をWindowsにインストールして、Ubuntu上の
「IntelliJ IDEA」を起動してみる。

# Xmingのインストール
1.setupのダウンロード
　公式サイトからXmingをインストールする。
　https://ja.osdn.net/projects/sfnet_xming/
　※ページの中断にある「ダウンロード」から、最適なものを選択しダウンロードする。
　(今回は、「Xming-6-9-0-31-setup.exe 」を選択)

2.setupの起動
  2-1.最初の画面では特に変更せず、「Next」を押下する。
![Setup2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/e4257a83-a026-cc91-8ee1-dd6fe8e361a3.png)


　2-2.次の画面でも特に変更せず、「Next」を押下する。
![Setup3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/d1c7287f-7f7d-ac86-f03e-6695e9a8cc92.png)


  2-3.スタートメニューにフォルダを作るか選択できるが、今回はデフォルトにするため、「Next」を押下する。
![Setup4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/6080ef93-cb5a-f3b9-062a-ab5571a8227e.png)

  2-4.「何かほかにタスクを追加しますか？」と聞かれるのでデフォルトで設定している「XLaunch」を設定したまま、「Next」を押下する。
![Setup5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/36f823bc-3c47-3663-19ab-f36efedd9748.png)

  2-5.「Install」を実行
![Setup6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/21d3e552-74dd-8662-072b-6f4868318858.png)

  2-6.無事にインストールできたら、以下のような画面が表示されるので「Finish」を押下する。
![Setup7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/a88b3c8f-a773-2cab-ecc5-d294fcadd53c.png)

# Tera-termにてXクライアントのアプリケーションの転送を設定する。
Tera-termの「設定」→「SSHポート転送」にて、「リモートのXアプリケーションをローカルのXサーバに表示する」にチェックを設定し、「OK」を押下する。
![tera-term1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/ecd04a2f-629e-2c5c-d795-ebf1dcd36139.png)


# クライアントのIPアドレスをhosts.0に設定する。
インストールしたXmingのフォルダにコンフィグファイル「X0.hosts」があるので、
ここにLinux側のIPアドレスを設定する。

# Xmingを起動する。
「Xming.exe」を起動する。これで準備完了。
後はLinuxにてアプリケーションを起動するとWindowsにXmingに連携される。

# 参考：IntelliJ IDEAを起動し、Windowsにて表示する。
参考として、Linux側で「IntelliJ IDEA」を起動し、Windows側にてアプリケーションが表示されることを
確認する。

``` 
# IntelliJ IDEA起動
./idea.sh
```

Windowsにアプリケーションが表示された。
![sampleoutput.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157382/c656c3be-f4fe-3ba9-6d72-960f4e121015.png)

# おわりに
XLaunchの設定により、画面のサイズなど細かい設定をすることができる。
それについては、また別の記事で書く。かも。
Flutter Blocライブラリ　メモ

Flutterでblocパターンを実装する際に便利な blocライブラリの自分用メモ
まだ実装はしてないので、間違っているところが多いと思います。

Blocライブラリ → https://bloclibrary.dev/#/
Blocパターンとは → https://qiita.com/kabochapo/items/8738223894fb74f952d3

flutter_bloc 3.0.0 → https://pub.dev/packages/flutter_bloc

# BlocProvider
### 基本
複数のサブツリーに指定したblocを提供する。
widget内で使用する場合は、`BlocProvider.of<T>(context)`でblocを利用する。ただこのままblocの値をwidgetに使っても、値が変更された時にwidgetはリビルドされないので注意する。値の変更をwidgetに反映するには、BlocBuilderを使用する。

```dart
BlocProvider(
  create: (BuildContext context) => BlocA(),
  child: ChildA(),
);
```
上記はBlocAを新しく作成し、childAのツリー内に渡している。
新しいblocではなく、既存のBlocをwidgetツリーの新しいルートで利用するには以下のようにする。

```dart
BlocProvider.value(
  value: BlocProvider.of<BlocA>(context),
  child: ScreenA(),
);
```


### MultiBlocProvider
上で述べた方法だと、Blocが複数あるときに複雑なネストが生じる。

```dart
BlocProvider<BlocA>(
  create: (BuildContext context) => BlocA(),
  child: BlocProvider<BlocB>(
    create: (BuildContext context) => BlocB(),
    child: BlocProvider<BlocC>(
      create: (BuildContext context) => BlocC(),
      child: ChildA(),
    )
  )
)
```
これでは読みにくいので、`MultiProvider`を使う。`MultiProvider`は上のような複数の`BlocProvider`を１つにまとめてくれる。

```dart
MultiBlocProvider(
  providers: [
    BlocProvider<BlocA>(
      create: (BuildContext context) => BlocA(),
    ),
    BlocProvider<BlocB>(
      create: (BuildContext context) => BlocB(),
    ),
    BlocProvider<BlocC>(
      create: (BuildContext context) => BlocC(),
    ),
  ],
  child: ChildA(),
)
```

### ブロックアクセス
widgetツリー全体でブロックにアクセスする方法 →
https://bloclibrary.dev/#/recipesflutterblocaccess
ローカルアクセス、ルートアクセス、グローバルアクセスの３つのシナリオについて記載されている。
ここでは、ユーザー情報の共有に使えそうなグローバルアクセスについて見ていく。

```dart
void main() => runApp(App());

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (BuildContext context) => Bloc(), //グローバルに使いたいBloc
      child: MaterialApp(
        title: 'demo',
        home: Page(), 
      ),
    );
  }
}
```
MaterialAppをラップすることで、Blocのインスタンスをグローバルにアクセス可能にする。
widget全体で使いそうなユーザー情報やログイン情報のblocはここで作成する。

# BlocBuilder
blocの状態が変わったら、widgetをリビルドする。



# BlocLister
Blocの状態が変わったら、Blocを呼び出す。widgetはリビルドされない。

```dart
body: Center(
        child: BlocListener<WeatherBloc, WeatherState>(
          listener: (context, state) {
            if (state is WeatherLoaded) {
              BlocProvider.of<ThemeBloc>(context).add(
                WeatherChanged(condition: state.weather.condition),
              );
              _refreshCompleter?.complete();
              _refreshCompleter = Completer();
            }
          }
       )
```
「Flutter Weather Tutorial」: https://bloclibrary.dev/#/flutterweathertutorial
上のコードは「Flutter Weather Tutorial」からの引用である。
`BlocBuilder`と異なり、変更されたstateの値を処理に利用するだけで、widgetのリビルドは行わない。
【NeosVR LogiX】作成したノードをパッキングする方法

#はじめに
LogiXでノードを組んだ時の保存方法や取り出し方についてのメモ書きです。

#参考
公式チュートリアル動画
https://www.youtube.com/watch?v=U68hjR43noI&list=PLoAvz0_U4_3zkwJQWd8eD8TWyQ0_0JWnw&index=6

##LogiXをオブジェクトにパッキングする

###パッキングする場所の作成
ゲームオブジェクトのインスペクターを開きます。
☆の部分をクリックすると子オブジェクトが作成されます。
![2019-12-28 15.47.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558347/4f276fb1-27d6-0ddc-b16e-20d33373914e.jpeg)

新しく作られたオブジェクトをダブルクリックで選択しNameの項目からリネームします。
今回は「LogiX」にリネームしています。


###パッキング先の指定
ロジックスチップを装備した状態で、先ほど作成した「LogiX」にビームを当ててグラブします。
グラブした状態でコントロールメニューを開き、Set Packing Rootを選択します。
![2019-12-28 15.50.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558347/6e06b600-91e6-f0b7-a9f4-b029abb398f2.jpeg)


選択後はロジックスチップに先ほど名前を付けたオブジェクト名が表示されます。
![2019-12-28 15.50.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558347/73876f30-35bb-0ad1-41fa-08be50cf1144.jpeg)


###ノードをパッキング
オブジェクト名が紫色で表示された状態でノードに光線を当てた状態でセカンダリボタンを長押しします。
(長押し中はツールチップの周りに丸いゲージが表示されます)
ボタンを離すと、「LogiX]オブジェクトの子階層にノードが格納されます。
![2019-12-28 15.50.57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558347/33314a83-5020-3af2-b8c4-142188c700ec.jpeg)



#LogiXをオブジェクトから取り出す
パッキングされたノードを取り出す方法は、「LogiX」をグラブした状態でコントロールメニューの
Reveal LogiX nodes in children & connectedを選択すると取り出すことができます。
![2019-12-28 15.52.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558347/7f4dfd3f-9fad-27bc-abb9-3b0cfcdec8d4.jpeg)


#最後に
チュートリアル的な記事がまだ少ない状態ですのでどんどん更新していけたらと思います。
スペースあるパスのJAVA_HOMEの設定

#はじめに
JAVAは広く使っており、JAVA_HOMEの設定も開発者としてよくある作業です。
Windows上の設定手順はいっぱい記事があります。今回はスペースあるパスの設定を説明します。

#JAVA_HOMEの設定手順
##コントロールパネルを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/f51551b0-96ab-1297-2d9e-9771dc4ac4a4.png)

##システムとセキュリティを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/db62419b-ddcb-374c-1295-1888b1b97080.png)


##システムを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/ffe49ae7-5947-6874-c29c-a26e5a7079e5.png)


##システムの詳細設定を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/814b0f83-33d4-c0b4-8f4c-28b9a752fcdd.png)

##環境変数を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/ea96ab42-9bc0-eacb-34d8-fea6d15abd17.png)

##新規を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/ad786c7c-38a6-5f7c-59d2-da52a6146932.png)

##変数設定
変数名：JAVA_HOME
パス：C:\Program Files\Java\jdk1.8.0_201

JAVAインストールする際にパスを変更しないと、「C:\Program Files\Java」にインストールされます。
「Program Files」フォルダーにスペースがあるので、コマンドで実行する際にパスの関係でおかしくなる場合があります。
エラー例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/be30ce0d-c1eb-460d-de19-c72623701c3a.png)


一番良いやり方はインストールする際にスペースがないフォルダーかつ日本語がないフォルダーを選択します。

「Program Files」の場合は下記の案があります。
###パスをダブルクォーテーションで囲む
「"C:\Program Files\Java\jdk1.8.0_201"」この感じでパスを設定

これで解決する場合が多いですが、使えない場合もあります。

###短いフォルダー名を利用する
dir /x　コマンドで実行すると、短いフォルダー名が見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/33c8173d-54ca-0b9f-9cc6-de81497b251d.png)

上記のパスのところ、下記のパスを設定すると、スベースあるパスの影響は回避できました。
C:\Program Files\Java\jdk1.8.0_201」
⇒
C:\Progra~1\Java\jdk1.8.0_201


#path変数にJAVAのbinフォルダーを追加する
「%JAVA_HOME%¥bin」をpath変数に追加でjavac,javaコマンドを使えるようになります。

以上
Common Data Service の日付型列を使いこなす

Common Data Service (CDS) でカスタムフィールドを追加する際、日付型がオプション含めて数パターンあります。この記事ではそれぞれの違いを説明します。

# 日付型のパターン

以下の 5 パターンです。

- ユーザーローカル
    - 日付のみ
    - 日付と時間
- 日付のみ
- タイムゾーン非依存
    - 日付のみ
    - 日付と時間

データベースレベルでは日付型は日付と時間の両方を保持しているため、日付のみと日付と時間は表示の違いのみです。

# ユーザーのタイムゾーン

CDS はマルチ言語、マルチ通貨対応であり、グローバルで使えるように設計されています。その一環でユーザーは自分のタイムゾーンを持ちます。

- レコード保存時は自動計算した UTC 時刻で保存される
- レコードを開く際、ユーザーのタイムゾーンを考慮して時間が計算される

# 動作確認

5 つのパターン全てのカスタムフィールドを作成し、フォームに配置しました。
レコード作成時は UTC+9 の日本時間です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/cdab2bd2-62c5-2960-d857-4c6c94409409.png)

このレコードをタイムゾーン UTC-10 に設定したユーザーで開きます。尚、UTC-10 はハワイです。

- ユーザーローカルの場合は 19 時間前となり、日付が変わる
- 日付のみの場合は影響なし
- タイムゾーン非依存も影響なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/aff8dc2b-8913-462e-039e-66e0069668cb.png)

# 日付のみとタイムゾーン非依存の日付のみ

この 2 つは一瞬同じに見えますが、時間の部分が変わります。

- 日付のみ: 常に 12:00 AM が入ります
- タイムゾーン非依存: 指定した時間が入ります

尚、画面からデータを入力した場合は時間を入れることができないため、同じ動作に見えます。

# まとめ

誕生日や記念日のように、世界中どこから見ても日付も時間も変えたくない場合、タイムゾーン非依存または日付のみ―日付のみを使います。ユーザーによって動的に変えたい場合はユーザーローカルを使ってください。

ちなみにタイムゾーン非依存は後から追加された機能で、日付のみでは対応できなかった、時間までグルーバルで同じように表示したいという要望に応えたものとなります。

# 参考

[日時フィールドの動作と形式](https://docs.microsoft.com/ja-jp/powerapps/maker/portals/configure/behavior-format-date-time-field)
Yumemi.vue #4 の報告アプリを作ってみた - 後編 -

こんにちは、カメドットです。

## 今日のテーマ
Yumemi.vue ( https://yumemi.connpass.com/event/157720/ ) 勉強会に参加してきて、宴でアプリ報告の後編です。

## 開発構成
Excel+Unity 2018.4 で作成しました。

## ゆめみちゃん公開
今まで秘密にしていましたが、勝手に考えたゆめみちゃんを公開です。

![20191228_114522.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45396/242f4363-f41f-ea59-847e-ea05ec871e5d.jpeg)


## 後半のアプリ
unityroomにアップしました
https://unityroom.com/games/report_second


## 今回報告アプリを作っての感想と課題

### 感想
改めて、スライドを見直すので知識的に頭に定着しやすくなった

### 課題
背景画像について、用意しないと寂しい
手書きから色抜きをしないとお絵描きがメインになってしまう
Etcherでパテ分けされてるSDを使うとコケる



# 概略
Raspberry Piに使うSDにRaspianを書き込みたい。
公式推奨のEtherというツールではパテ1つになってるSDを使わないと失敗する。
過去にRaspianを入れてたりなどがあったSDはパテが分かれてるので1つにしておくこと。


# 経緯

公式ではBalenaEtcherというツールが推奨されていたのでそれを使ったが、Startingのまま止まってしまった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28988/b6d77d96-61ff-ed58-9935-a0b95f4be6c6.png)


さらに、中止しようとしたらOSの挙動が怪しくなり、アプリケーションがどんどんフリーズしていったので、再起動するはめになった。


その後、試行錯誤していた時にRufusでイメージを書こうとしたりしていた。
その時にパーティションが1つになっていたっぽい。

再度Etcherで書き込んだら成功した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28988/a377fe5e-a091-e689-ea46-1f19b4723137.png)
Chromeの拡張機能を作っていたら、原因不明のバグ（？）に苛まれた話

#作りたかったもの
特定のページのdocumentを一定時間ごとに取得して、指定したキーワードが入っていれば、通知を出すという拡張機能。ソースコードじゃなくてdocumentとというところがミソで、そのページは一定時間ごとにサーバーと通信をして、動的に内容を書き換えているため、拡張機能で作ろうという発想に至りました。

#開発環境
Google Chrome : 79.0.3945.88（64ビット）
Windows10

#ソースコード
```javascript:background.js
function init(){
	chrome.tabs.query({url:myURL},function(tabs){
		if(tabs.length!=0){
			chrome.tabs.sendMessage(tabs[0].id,{text:"message"},function(callback){
				check(callback);
			});
		}else{
			noti2();//エラー処理
		}
	});
}

function check(callback){
	if(callback==myURL){
		console.log("タブを検出しました。監視モードに移行します");
		chrome.alarms.create("alarms", {periodInMinutes:time});
	}
}
chrome.alarms.onAlarm.addListener(function(request, sender, callback) {
	if(request.name=="alarms"){
		main();//ここにプログラム本体
	}
});
chrome.alarms.create("start/alarms", {delayInMinutes:3});
chrome.alarms.onAlarm.addListener(function(request, sender, callback) {
	if(request.name=="start/alarms"){
		console.log("起動しました");
		init();
	}
});
```

本来ならページを開いていなくても裏でアクセスし、ドキュメントを取ってきたいところなんですが、どうやってするのか、よく分からなかった（background.jsからリクエストを非同期的に生成している？）ので、せめても、ということで、どこかのタブで開かれていたら、動作するようにしました。

#発生したトラブル
上記ソースコードでは、拡張機能を読み込んで3分後に起動するようになっています。この間に特定ページの再読み込みを行う手はずなのですが、この3分の間にも `main()` が1分ごとに呼ばれ続けていました。

#やってみたこと
- この拡張機能のリロード
- この拡張機能を停止して再開
- 他の拡張機能の停止
- ブラウザの再起動（ chrome://restart ）
- 全ての`chrome.alarms.create`のコメントアウト+拡張機能のリロード

これらを行ってもバグは一向に解消しませんでした。

#原因と対策
バグなのか仕様なのかは分かりませんが、拡張機能をリロードしたり、無効化したり、ブラウザを再起動したりしても、`chrome.alarms.create`で`{delayInMinutes:1}`と指定した時限アラートは残り続けるようです。
解決策としては、

- 拡張機能を一度削除した上で、もう一度読み込み直す
- background.jsの先頭で`chrome.alarms.clearAll();`を呼び出して、今残っている全てのアラートを消す

あたりが考えられます。

#最後に
ネットで調べても、古い情報だったり、何故かエラーが出てしまっていたり、セキュリティー上の権限規制が強かったり、謎の挙動を起こしたりする、Google Chromeの拡張機能。もう、私は2度と作りたくないのですが、なかなか優秀な一面もあり、必要に迫られるまで、作りたくないです。
これがバグなのか仕様なのかご存じの方はコメント頂けたら幸いです。


以上。
Cloud Functions for Firebaseで関数毎にファイルを分割する方法


いろいろなやり方ができると思いますが、いま１つベストプラクティスがわからない。
[こちら](https://qiita.com/sono8/items/5499b2eacfe73ab633dd)の記事が参考になりました。

今回のサンプルでは下記のようなファイル構造にしました。
index.jsにはファイル分割のためだけの内容を記述し、具体的な機能はsrc以下に書きます。

```bash
.
├── index.js
├── package-lock.json
├── package.json
└── src
    ├── byeWorld.js
    └── helloWorld.js
```

### index.js


funcの中で各種関数群の情報を定義、loadFunctionsで具体的読み込む。


```index.js
//関数群定義
const funcs = {
    helloWorld: './src/helloWorld',
    byeWorld: './src/byeWorld',
}

//loadFunctions関数定義
loadFunctions = (funcs) => {
    for (let name in funcs) {
        if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === name) {
            exports[name] = require(funcs[name]);
        }
    }
}

//locadFunction実行
loadFunctions(funcs);
```

### helloWorld.js

大したコードじゃないけどいちおう。

```js:HelloWorld.js
const functions = require('firebase-functions');

//helloWorld
module.exports = functions.https.onCall(async (data, context) => {
    return "Hello World";
});
```

### byeWorld.js

同じく。

```js:byeWorld.js
const functions = require('firebase-functions');

//byeWorld
module.exports = functions.https.onCall(async (data, context) => {
    return "Bye World";
});
```

### いちおう呼び出しサンプル

helloWorldだけ。byeWorldは割愛。node.jsスクリプトとして実装してる。

```js
const firebase = require('firebase');

const firebaseConfig = {
    apiKey: "xxxxxxxxxxxxxxxxxxxxxx",
    authDomain: "xxxxxxxxxxxxxxxxxxxxxx",
    databaseURL: "xxxxxxxxxxxxxxxxxxxxxx",
    projectId: "xxxxxxxxxxxxxxxxxxxxxx",
    storageBucket: "xxxxxxxxxxxxxxxxxxxxxx",
    messagingSenderId: "xxxxxxxxxxxxxxxxxxxxxx",
    appId: "xxxxxxxxxxxxxxxxxxxxxx"
};

firebase.initializeApp(firebaseConfig);
const functions = firebase.functions();

(async () => {

    const helloWorld = functions.httpsCallable("helloWorld");
    const res = await helloWorld();
    console.log(res);

})()
```

実行結果。

```bash
{ data: 'Hello World' }
```
Rustでメディアアーティストに！！！おれはなるっ！！！

Rust製のメディア・アート的なコードを書くためのnannouというフレームワークの使い方を簡単に紹介する記事です

# メディア・アート関連の話

メディア・アート系のフレームワークだとProcessingやもっと低レイヤなものだとopenFrameworksが有名でしょう
Rustだとメモリ周りがC++よりもセキュアにかけるので個人的な見解ではopenFrameworksの代替として作られたのではないかと考えています
nannouの詳しい日本語の記事については[こちら](https://qiita.com/applejam/items/322d72decc0b6b067dc5)

さっそくどんなものか見ていきたいのですが[sampleコード](https://github.com/nannou-org/nannou/tree/f2de4f8321127cb57bc9fd5f1a187a9e50a95c79/examples)を見ると2つのテンプレートが存在しています

- [template_sketch.rs](https://github.com/nannou-org/nannou/blob/f2de4f8321127cb57bc9fd5f1a187a9e50a95c79/examples/template_sketch.rs) ... オブジェクトをいい感じに取り回すテンプレ
- [template_app.rs](https://github.com/nannou-org/nannou/blob/f2de4f8321127cb57bc9fd5f1a187a9e50a95c79/examples/template_app.rs) ... イベントハンドラをいい感じに取り回すテンプレ

これらを自由自在に扱えるとメディアアーティストになれるのかもしれない
最初の実行については[本家の説明](https://guide.nannou.cc/getting_started/create_a_project.html)を見ればできそうなので割愛しておきます

## オブジェクトをいい感じに取り回すテンプレを使う

もともとのテンプレのコードがこんな感じになります。

```Rust:template_sketch.rs
use nannou::prelude::*;

fn main() {
    nannou::sketch(view);
}

fn view(app: &App, frame: &Frame) {
    // Prepare to draw.
    let draw = app.draw();

    // Clear the background to purple.
    draw.background().color(PLUM);

    // Draw a blue ellipse with default size and position.
    draw.ellipse().color(STEELBLUE);

    // Write to the window frame.
    draw.to_frame(app, &frame).unwrap();
}
```

サンプルを少し見ればわかるのですが、viewメソッドの引数になっているAppクラスが肝でこちらに必要な情報が入ってきます。時計のような動きをするサンプルを書いてみました。キーを押下すると白黒が逆転します。

![sample.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8350/da2875de-1cf7-6e64-4dd3-0a1c7d41413d.gif)


```Rust:like_a_watch.rs
use nannou::prelude::*;

fn main() {
    nannou::sketch(view);
}

fn view(app: &App, frame: &Frame) {
    let draw = app.draw();
    let win = app.window_rect();
    let t = app.time; // 起動してからの経過時間(秒)
    let o = Vector2{ x : 0.0, y : 0.0 };
    let exists = app.keys.down.len() > 0; // app.keys.downで押下しているキー情報が取れる
    let (_1, _2) = if exists { (WHITE, BLACK) } else { (BLACK, WHITE) };
    draw.background().color(_1);

    draw.ellipse()
        .color(_2)
        .radius(win.top());

    // 長針
    let l = Vector2{ x : win.top() * t.sin(), y: win.top() * t.cos()};
    draw.line()
        .color(_1)
        .points(o, l);

    // 短針
    let s = Vector2{ x : win.top() / 2.0 * (t / 12.0).sin(), y: win.top() / 2.0 * (t / 12.0).cos()};
    draw.line()
        .color(_1)
        .points(o, s);

    draw.to_frame(app, &frame).unwrap();
}
```

書いていて気づいたのですがf32型にcosやsin関数が定義されているので数値から直接呼び出せます。
メディア・アート系のコーディングでは割と使う関数なので、結構使い勝手がいいのかな、という印象です。
Rustで書くのは全然ありな気がしてきましたね！

このテンプレの書き方だと押下しているキー情報しか取れなかったりそこまで融通が効かないので、細かいことをしたいとなるとイベントハンドラを取り回した方が良さそうです。しかし、そこまで凝ったことをしなければ強力な数値計算系の関数を使ってかっこいいアニメーションは組めそうです。
Slackの全チャンネルから投稿順に1000件を取得して絵文字リアクションをランキング化する

## なぜそれをやろうと思ったのか
楽しそうだからやった。しかたなかった。

## 手順
まずはslackのTokenを取得してください。
こちらの記事などが参考になると思います。
https://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb

## コード
githubにまとまっているので基本はこちらを見ていただいてpullして必要ライブラリをインストールして実行していただければ問題ありません。まとまったoutput.txtが出てきます。
https://github.com/hiwatee/slack-reaction-ranking-python

## output方式
output.txtにダンプされたjsonデータが格納されます。
リアクション名: カウントで格納されています。
```
[["hoge", 2123], ["fuga", 1654], ["hunya", 1483]]
```
PythonでPDFをまとめて画像に変換する

# この記事でやりたいこと
PDFファイルを1ページ1ファイルで画像(PNG)に変換します。
業務用帳票出力の検証作業前処理を想定しているので複数のPDFファイルをまとめて処理できるようにしました。

# 準備するもの
- Python3が動く環境。この記事ではPython3.8.1(Windows 64bit)を使っています
- Poppler。PDFを操作できるオープンソースのコマンドラインツール群
- pdf2image。PopplerをPythonから使えるようにするラッパーモジュール

## Popplerのインストール
本家(ソース)
https://poppler.freedesktop.org/

Windows用のバイナリがこちらで公開されています。
http://blog.alivate.com.au/poppler-windows/

インストール手順についてはこちらのサイトにまとまっています。
http://pdf-file.nnn2.com/?p=863
説明後半にある言語ファイルを入れておかないと日本語のファイル名が化け化けになるので忘れずに入れておきましょう。

### 2020年1月6日追記
imread()やimwrite()がascii以外のファイル名を扱えないので、openCV-Pythonを使って後処理をするときはファイル名をascii文字に変える必要があります。
`base = urllib.parse.quote(pdf_file.stem)`みたいな感じでURLエンコードしちゃってもいいけど人が読めないですね。

元データの改名が難しいときは、こういう対応方法もあります。
[Python OpenCV の cv2.imread 及び cv2.imwrite で日本語を含むファイルパスを取り扱う際の問題への対処について](https://qiita.com/SKYS/items/cbde3775e2143cad7455)
https://qiita.com/SKYS/items/cbde3775e2143cad745

## pdf2imageのインストール

`pip install pdf2image`

Githubはこちら
https://github.com/Belval/pdf2image

# Pythonのコード

```python:pdf2img.py
import pathlib
import pdf2image

pdf_files = pathlib.Path('in_pdf').glob('*.pdf')
img_dir = pathlib.Path('out_img')

for pdf_file in pdf_files:
    base = pdf_file.stem
    images = pdf2image.convert_from_path(pdf_file, grayscale=True, size=640)
    for index, image in enumerate(images):
        image.save(img_dir/pathlib.Path(base + '-{}.png'.format(index + 1)),
                   'png')
```

やっていることは単純で、カレントディレクトリのin_pdfフォルダにあるPDFファイルを読み込んで、out_imgフォルダに{PDFのファイル名}-{ページ}.pngを出力しています。

例）なにかの帳票.pdf → なにかの帳票-1.png なにかの帳票-2.png

画像変換のパラメータは
`images = pdf2image.convert_from_path(pdf_file, grayscale=True, size=640)`
のところで設定できます。

- `grayscale=True`でグレースケール。`grayscale=False`にするか指定を略するとカラー
- `size=n`でnピクセル四方に収まるように出力。指定がなければDPI値で計算したサイズ
- `dpi=n`でDPI値指定(既定値は200DPI)。サイズ指定があるときはそちらが優先

ほかにもいろいろ設定できますがとりあえずこれだけでも十分でしょう。

画像フォーマットは
`image.save(img_dir/pathlib.Path(base + '-{}.png'.format(index + 1)), 'png')`
のところを
`image.save(img_dir/pathlib.Path(base + '-{}.jpg'.format(index + 1)), 'jpeg')`
とするとJPEG形式で出力になります。
【初歩的から説明。】gem/gemfileって？

#gemとは？
**Rubyのライブラリのことです。**

 そもそも、ライブラリとは、『汎用性の高いプログラムの集合体』
つまり、『便利な物を集めたファイリングした物』→**『道具箱』**みたいな物でしょうか。
 便利なものが簡単に取り出せます。

gemは、RubyGems（gemを管理する仕組み）と呼ばれる、パッケージ管理システムで管理されていいます。

そして、Rubyにインストールしてこないと使えません。
gemコマンドを通じてインストールが可能です。

⬇️gemをインストールする際のコマンド

```ruby:filename.rb
bundle install
```

＜コマンド実行後に起こること＞
①bundlerがgemfileを参照
（bundlerとは？）gemのバージョン管理を行うプログラム。
→複数人での開発やgemのバージョンが上がってもエラーを避けて開発できます。
②Gemfileにある、gemの中でインストールされていないものを探す
③インストールを実行

#gemfileとは

**gemが記述されているファイルのことです。gemのバージョン管理を行うものです。**

gemのバージョンが違うと思わぬエラーが発生してしまいます。
gemのバージョン違いが起こらないようにしてくれるのがGemfileの役割です。

Gemfileを見れば、Railsアプリを動作させるためにはどのgemをインストールすればいいのかがわかります。

#終わりに
Ruby,Rails勉強中です。間違いがあればご指摘お願いします。
Gitについてのメモ

Gitについてなんとなくしか知らなかったので、少し調べてアウトプット練習と自分用のメモもかねて投稿します！
今回は、[サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/)を参考にさせていただきました。
このサイトすごくわかりやすい。
## Gitとは
そもそも、Gitってなんなんだろうと思ってました。
サイトを色々読んでわかったことは、あ、一人で色々コード書いてたりする人の場合あまり必要ではないから今まで深く知る必要なかったのかなと。

要は、Gitというのは、ソースのバージョン管理機能のことです。

でもね、このバージョン管理っていう言葉が経験の浅い僕には全然しっくりこなくて、なんのバージョン？そもそも何かにバージョン１とかついてたっけなってなってました笑（多分僕だけ笑）

でも、チーム開発を初めてするってなった時に、あ、これどこでこのエラー起きてるとか、誰がコードのどこの部分をどれくらい変更したの？とか、出てくるわけですよね。
そしたら、あ、自分で開発してる時もどのファイルが最新版だっけ？とかってなると面倒だな。最新バージョン管理したい。。。あれ、バージョン？
あ、バージョンてこういうことね、となりました笑（無知識すぎる・・・)
変更前がバージョン１なら変更後はバージョン２だよと。バージョン２でおかしな挙動が発見されればバージョン１まで戻って見てみようとできるわけですね。

## Gitの目的
・どのファイルが最新か区別する
・変更した部分を明確化させれる
・ファイルを編集前の状態に戻せる
いろいろなことができて便利なわけです。

## リポジトリとは
リポジトリとは、ファイルやディレクトリの状態を記録する場所

## リモートリポジトリとローカルリポジトリ
リポジトリには種類があって、
リモートリポジトリ：専用のサーバに配置し、複数人でバージョン管理を行うもの
ローカルリポジトリ：個人で持てる保管場所（自分のパソコンで色々いじってリモートリポジトリにアップロードする）

## プッシュ
ローカルリポジトリからリモートリポジトリにアップロードすることをプッシュという。

## プルとは
リモートリポジトリからローカルリポジトリに内容を取り込む。
クローンというコマンドもありますが、これはリモートリポジトリの内容をそのままコピーするコマンドです。
[@matumotoshintaroさん](https://qiita.com/matsumotoshintaro)の記事で少し解説が載ってましたので是非みてみてください。シンプルでわかりやすいです。

## マージとは
他の人が行った変更を取り込むこと。

もし間違っていたり、勘違いしている内容を発見しましたらお知らせいただけますと幸いです。
もう少し、深くGitについて学んでいこうと思います。

お読みいただきありがとうございました。
毎日のごはんを楽に記録する Part1

#はじめに
Qiita初投稿です。お手柔らかに見てください。

#経緯
記憶力がなさ過ぎて、昨日何を食べたのかすら覚えていない。
なので今まではスマホのメモに、晩御飯のメニュー（メインだけ）を簡単に記録していた。こんな感じで。

- 10/1　カレー
- 10/2　焼肉
- 10/3　野菜炒め

しかしながら毎回日付を打つのも面倒だし、そもそも記録することを忘れる。
そして思い出そうとしても覚えてない・・・。
でも、できれば忘れずに記録はしていきたい。

また、奥さんに不定期に聞かれる「今日何食べたい？」との質問に対し、最近食べてないものなんだっけ？　
と思い出すときに活用したい。

#目的
今日何を食べたのかを、***毎日忘れず***に かつ ***楽に*** 記録すること。

#できるようになったこと
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545683/b7c833ab-5d8f-4303-770c-d633e71c40f1.png)


1. 家のGoogle homeに、「記録　〇〇」（〇〇はご飯のメニュー）と言うと、スプレッドシートに記録してくれる。
2. 家庭用Slackに、「ご飯　〇〇」と書くと、スプレッドシートに記録してくれる。
3. 22時になっても記入がないと、「ごはんのメニューを記録してね！」と通知してくれる。

#詳細
手法はWebにある記事を参考にさせてもらいつつ、以下の手段で実装した。

1. Google Home → スプレッドシートへ記録
    IFTTTのAdd row機能を使用

2. Slack → スプレッドシートへ記録
    SlackのOutgoing Webhookを使用

3. スプレッドシート → Slackへ通知
    GASとSlackのincomming Webhookを使用

#今後
入力/記録の仕組みはできたので、ある程度食べたごはんのリストができたら、こんな機能も追加していきたい。
 1. 「最近何食べた？」と聞くと、直近一週間の晩御飯リストをslackでbotが教えてくれる。
 2. 「最近何食べてない？」と聞くと、（例えば）1カ月以上食べてないものをbotが教えてくれる。
 3. 「ランキング教えて」というと、過去の食べたものランキングをbotが教えてくれる。

などなどを考えています。

#追記
[Part2](https://qiita.com/kaji-tan/items/0abefd64410396dd7eec)はこちら。
Common Data Service で自動的に作られるエンティティについて

Common Data Service (CDS) を作ると自動的にエンティティが作成されます。消したい！という声も聞こえますが、今回はこれらのエンティティについて紹介します。エンティティとはデータベースでいうところのテーブルに相当するものです。

# Common Data Model (CDM)

ビジネスアプリで使うデータのモデルってほぼ一緒なんですが、これまで統一規格がなく、微妙にスキーマ名が違ったり、サイズが違ったり、型が違ったりと課題になってきました。そんな中 2018 年 9 月に Adobe、Microsoft、SAP が共同で「Open Data Initiative」を発表しました。

[Adobe, Microsoft and SAP announce the Open Data Initiative to empower a new generation of customer experiences](https://news.microsoft.com/2018/09/24/adobe-microsoft-and-sap-announce-the-open-data-initiative-to-empower-a-new-generation-of-customer-experiences/)

これを受けて Microsoft は長年 Dynamics や Office で得た知見を元に、以下のような Common Data Model を公開。スキーマも GitHub で公開されています。
![](https://docs.microsoft.com/ja-jp/common-data-model/media/cdm-entities.png)
[GitHub: Common Data Model](https://github.com/Microsoft/CDM)

## Core

全てのアプリケーションで必要になるであろうモデルは、Core レイヤーに定義されます。

- 取引先企業、取引先担当者
- 活動 (Activity, Email, Letter, Phone, Fax, Task, etc)
- 部署、チーム、組織、ユーザー、ポジション
- 通貨
- 添付ファイルやメモ

## CRM、Web、Talent など

アプリケーション固有で必要となるモデルが定義されます。

# Common Data Service (CDS)

CDS は CDM を実装するデータプラットフォームサービスです。つまり CDM を使った開発が前提にあり、必然的に Core となるエンティティがどんな環境にも提供されるわけです。

## 既定

既定のフィルターを使うと Core に相当するエンティティとカスタムエンティティが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c513a191-5859-51f8-5d4b-30e47299ba96.png)

## すべて

Core やカスタムエンティティだけでなく、内部的に使われるエンティティもすべて表示されます。それぞれに意味があり、開発者が使うものもありますが、あくまで内部システムのデータストアであり、モデルとして利用する必要はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/7ee912ce-d0b8-a398-8d1d-bb638a34c346.png)

## グループ化表示

グループか表示を使うと、分かりやすく表示できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/892222c8-1681-c183-817d-0d36097775f2.png)

# まとめ

今回はなぜ CDS を作成すると既にエンティティができるのかを説明してみました。例えば、取引先企業を使わないことはあるかもしれませんが、セキュリティに関わるものを使わないことはありませんし、エンティティで自動的に追加されるシステムフィールドが利用するものもあります。

既に実装されている機能であるため、有効活用してください。不明点があれば遠慮なくコメントに質問してください。
競合の解決

# 前提

リモートマスターのあるファイルが以下のようになっている

```hogehoge.txt
1
2
3
```

これを以下のように変更したかった。

```hogehoge.txt
1
1.5
2
3
```

ローカルブランチを新しく切って

```
gir checkout -b add_1.5
```

上記のようにファイルを変更し、push。

# ところが

自分のローカルで新ブランチを切った後で、先に別の人に以下のように
ファイルを変更されてしまって競合が起きた。

```hogehoge.txt
1
2
2.5
3
```

なのでこれを以下のように変更させたい。

```hogehoge.txt
1
1.5
2
2.5
3
```

これまでは
自分の変更箇所だけをメモ帳かなんかにコピっておいて
自分のローカルブランチ(add_1.5)を削除し、
ローカルのマスターブランチでgit pull origin masterをし、
新たにgit checkout -b add_1.5とし、
変更してpushとしていたが、
いい加減ちゃんとgitの使い方をしようと思う。

# やり方

1 ローカルで当該ブランチに移動

```
git checkout add_1.5
```

2 pull
ここで競合のエラーによりno branchに飛ばされる

```
git pull origin master
```

3 問題のファイルを編集し、no branchのままコミットする

```
git add .
git commit
```

4 新しくブランチを作り遷移
これによりno branchが消える

```
git checkout -b add_1.5_2
```

5 元のブランチを削除

```
git branch -D add_1.5
```

6 元のブランチ名に変更する

```
git branch -m add_1.5_2 add_1.5
```

7 pull rebase
ここでリベース関連のエラーメッセージが表示される場合がある
その時は画面にrm -frのようなコマンドが出ているのでそれも打つ

```
git pull --rebase origin master
```

8 push -f

```
git push -f origin add_1.5
```

これでOK
Nuxt TypeScriptでオリジナルPluginを作る方法

# TypeScriptでNuxtプラグインを書くけども
今回はVueインスタンスにインジェクトしないようなプラグインの方法です(ほとんどMiddlewareと大差ないように思えますが)
Vueインスタンスにインジェクトするパターン(this.$myPluginみたいなの)は[公式サイトで説明](https://typescript.nuxtjs.org/ja/cookbook/plugins.html#i-vue-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%99%E3%82%8B)があるので、そちらを参照してください。


## プラグイン本体を書く
今回は単にrouteを表示するpluginを作る場合

`plugins`ディリクトリ以下に`MyRoute.ts`(お好きな名前で)などという名前をつけて以下のように書く

```TypeScript
import { Plugin } from '@nuxt/types'

const myPlugin: Plugin = ctx => {
  console.log(ctx.route.path)
}
export default myPlugin
```

機能的には同じですが、
以下のようにContext型で書くこともでき、こちらの方がよりシンプルになります。

```TypeScript

import { Context } from '@nuxt/types'

export default ({ route }: Context) => {
  console.log(route.path)
}

```

## configを書き換える
`nuxt.config.js`のpluginsプロパティを書き換える。これは通常通りです。

```javascript:nuxt.config.js
plugins: [{ src: '~/plugins/MyRoute' }],
```


# 終わりに
ちょっと型注釈で困ったので備忘録に。
【Kotlin/JVM】AutoCloseable な CoroutineScope

あるオブジェクトが所有する `CoroutineScope` を、そのオブジェクトが破棄されるときにキャンセルしたい。
このようなことは少なからずあると思う。
毎回実装してもそれほどの手間ではないが、
`AutoCloseable` インターフェイスを実装していて `close()` でキャンセルできる `CoroutineScope` オブジェクトを簡単に生成できるようにしておくと便利ではないかと思い、実装した。

```Kotlin
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext

/**
 * [close] でキャンセルできる [CoroutineScope]。
 */
class AutoCloseableCoroutineScope private constructor(
    private val coroutineScope: CoroutineScope
) : AutoCloseable, CoroutineScope by coroutineScope {

    override fun close() {
        coroutineScope.coroutineContext[Job]?.cancel()
    }

    companion object {
        /**
         * [AutoCloseableCoroutineScope] を生成して返す。
         *
         * @param coroutineContext 生成するスコープのコンテキスト。
         */
        operator fun invoke(
            coroutineContext: CoroutineContext = EmptyCoroutineContext
        ): AutoCloseableCoroutineScope =
            SupervisorJob().let {
                CoroutineScope(coroutineContext + it)
            }.let {
                AutoCloseableCoroutineScope(it)
            }
    }
}
```

`AutoCloseable` である必要性はあまりないが、
他に破棄を表すインターフェイスがないためこのようにした。

利用例：

```Kotlin
import kotlinx.coroutines.*

fun main() {
    val countDown = CountDown()

    countDown.countDownAsync(from = 10, interval = 100)

    runBlocking {
        delay(500)
        countDown.release()
        delay(500)
    }

    println("finish")
}

class CountDown {
    private val coroutineScope =
        AutoCloseableCoroutineScope(Dispatchers.Default)

    fun release() {
        coroutineScope.close()
    }

    fun countDownAsync(from: Int, interval: Long) {
        coroutineScope.launch {
            for (count in from downTo 0) {
                println(count)

                try {
                    delay(interval)
                } catch (e: CancellationException) {
                    println("cancelled")
                    throw e
                }
            }
        }
    }
}
```

上記利用例での出力：

```
10
9
8
7
6
cancelled
finish
```
「CSS完全に理解した」に見るposition: absoluteの考え方


こちらは2[019 あなたが学んだ「ﾁｮｯﾄﾃﾞｷﾙ」を発信する Advent Calendar](https://adventar.org/calendars/4610)の記事です。
あれ？何日遅れてるのかなぁ？？？

Twitterで以前バズっていた「CSS完全に理解したTシャツ」というものがあります。
知らないって方はこちら：「[CSS完全に理解した」Tシャツが完全にツッコミ待ち　なぜこのデザインに？作者に聞いた](https://j-town.net/tokyo/column/allprefcolumn/294912.html?p=all)

あれを実際にCSSで再現してみました。
再現して分かったのですが、この課題はHTML,CSSの基礎を学んで実際にページを作ろう！ってくらいの初心者にはよい課題になるのではと思いました。


## 要素を作成する

```html:html  
<div id="content">
	<p>CSS<br>完全に理解した</p>
</div>
```

```css:css  
#content {
	border: 2px solid #000000;
	width: 380px;
	height: 160px;
	border-radius: 16px;
}
#content p {
	font-size: 40px;
	line-height: 1.3;
	font-weight: 500;
}
```
なにも難しいことはしていません。大枠はボックスに枠線をつけて`border-radius`で角丸にしています。
大きさはお好みのサイズで作成してください。

ここまで作成したら、こんなかんじになっているはずです。
<img width="331" alt="CSSちょっと理解している" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165868/bf72a9d4-b047-8bdd-3598-91df27394297.png">
ここから、正しい位置にテキストを移動させます。

## positionを使用し位置を移動
元画像のように真ん中より少し左の位置からテキストが開始されるように調整します。
いろいろなやり方がありますが、今回は**position**を使用して位置を調整します。

### 基準となる要素にposition: relative;
まず基準となる要素（今回でいうと`#content`）に`position: relative;`という記述を書きます。
※relativeは相対的という意味です。

```css:css  
#content {
	border: 2px solid #000000;
	width: 380px;
	height: 160px;
	border-radius: 16px;
	position: relative; /* 追記 */
}
```
###動かしたい要素にposition: absolute;
そして動かしたい要素(今回でいうと`p`)に`position: absolute;`という記述を追記します。
これにより**relativeを指定した要素の範囲内で、自由な位置に配置できます**。
今回はだいたい上から10%、左から40%くらいの位置なので、`top`,`left`を使用して位置を調整します。

```css:css  
#content p {
	font-size: 40px;
	line-height: 1.3;
	position: absolute;  /* relativeの範囲内で好きな位置に配置 */
	top: 1%;  /* 上から1%の場所に配置 */
	left: 42%;  /* 左から42%の位置に配置 */
	font-weight: 500;
}
```
ここまで作成したら、こんなかんじになっているはずです。
<img width="318" alt="CSSちょっと理解している" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165868/95f13375-7cbf-1f1e-c6f6-60777d5dc349.png">
あれ？はみ出ませんね？

## テキストの改行を防ぐ
テキストが枠内で折り返されてしまっています。
ここでは改行を防ぐために`word-break`を使用します。
`word-break`を使用することで、コンテンツからテキストがあふれそうなときでも、強制的に改行します。

##完成！

<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="seahorse-design" data-slug-hash="oNgwZgp" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Kanzen-Rikai">
  <span>See the Pen <a href="https://codepen.io/seahorse-design/pen/oNgwZgp">
  CSS Kanzen-Rikai</a> by saki matsushita (<a href="https://codepen.io/seahorse-design">@seahorse-design</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

position要素は初心者が躓きやすいポイント（私調べ）なので、
簡単な課題としては良い難易度かと思いました。
枠からはみ出させるレイアウトもたびたび遭遇するので、ほかにも色々な方法を試してみるといいかもしれませんね:)
【Oracle Cloud Infrastructure】AlwaysFreeを使ってわかったことメモ

- 仮想マシン１台構築するとブート・ボリュームに47G持ってかれる、変更できない
- ボリューム・ブートは最低50Gからしか作成できない
- 仮想マシン、ボリューム・ブート合わせて100Gまでしか使えないから、仮想マシン２台構築したらボリューム・ブートは作成できない。
- AlwaysFreeは一部のリージョンでしか使えない
- ファイルストレージサービス（FSS）は使用できない
- データベースはシングルノードでしか作成できない
【Smarty】配列の中身を確認する方法

# 【Smarty】配列の中身を確認する方法
最近、Smarty案件に携わる機会があり、配列の中身を確認する方法を忘れがちなのでメモ。

```php
{$array|@debug_print_var}
```

上記でエラーになる場合は、↓をやってみてください。

```php
{$array|@var_dump}
```
gitを始める際に必要なglobal設定

# 基本
まずは、名前とメールの設定です。
これを設定しないで```git commit```してしまうと、誰がコミットしたのかが分からなくなるので、最初に設定しておきましょう。

```
git config global user.name "name"
git config global user.email "email"
```
# 発展
## git push をシンプルにする設定
ローカル環境でブランチを作成して```git push```をする際に、 リモートリポジトリのどのブランチに紐付けるかを毎回聞かれます。
[Gitドキュメント](https://git-scm.com/docs/git-push#_description)を参照すると、デフォルトの設定では、```push.default = simple```になっているからです。

結構うざいので、ローカル環境とリモートで同じブランチ名にする場合は、デフォルト設定を変えたほうが作業が捗ります。

```
git config --global push.default current
```

これを設定すると、「現在のブランチをリモートリポジトリに同名でpushする」設定になります。

## git merge をする際に、merge commit を生成する設定
git デフォルト設定では、merge する際にマージコミットを発生させる必要がない場合は、マージコミットを発生させません。
都度、マージコミットを発生させる設定が下記になります。

```
git config --global --add merge.ff false
git config --global --add pull.ff only
```
参考

https://qiita.com/nog/items/c79469afbf3e632f10a1
Common Data Service で自動的に作られるフィールドについて

Power Platform の勉強会で最近話題に出る、Common Data Service (CDS) に自動で作られるフィールドについてです。

# 自動生成されるフィールド

新規にカスタムエンティティを作ると、以下のようなフィールドが自動で作成されます。こちらのフィールドについて説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/600b92d6-b49e-99af-210f-f732d604f98a.png)

# 一意識別子

全てのレコードは内部的に区別するよう、Guid 列が作成されます。これにより各レコードの一意性が保証されます。またレコードを特定する際に使います。

# 状態 (statecode) とステータス (statuscode)

レコードの状況を指定するために使い、各状態に対して複数のステータスを作成できます。

既定では以下のような状態のためイメージが沸かないかもしれません。

|状態|ステータス|
|:--|:--|
|アクティブ|アクティブ|
|非アクティブ|非アクティブ|

しかしより細かくステータスを管理したい場合、以下のようにカスタマイズできます。ここでは登壇用プレゼン資料の管理を考えます。

|状態|ステータス|
|:--|:--|
|アクティブ|資料テーマ検討中|
||資料ドラフト作成中|
||資料レビュー中|
||資料レビュー完了|
|非アクティブ|公開済|
||非公開|

尚、編集は現時点でクラシックエクスペリエンスのみでサポートされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c0587de5-8cca-f074-6225-96d38bd4cd4e.png)

# 作成日 (createdon)、修正日 (modifiedon)、レコード作成日 (overriddencreatedon)

レコードは作成された日や最終更新日が自動で管理されます。

- 作成日: レコードが作成された時点の UTC 時間が入ります
- 修正日: レコードに変更があった時点の UTC 時間が入ります
- レコード作成日: データインポートなどでレコードを作成する場合、明示的に作成日を指定できます

# UTC 変換タイムゾーンコード (utcconversiontimezonecode)、タイムゾーン規則のバージョン番号 (timezoneruleversionnumber)

レコードが作成された際、作成者のタイムゾーンと時刻を使って UTC 時間を計算しますが、その際に利用した情報が残ります。

# バージョン番号 (versionnumber)

各レコードの変更管理につかわれ、更新がある度に更新されます。バージョン番号はシステム全体で管理されるため、前回同期を実行した以降に作成、更新さえたレコードの一覧が取得できるようになっています。

[参照: 変更の追跡を使用してデータを外部システムに同期](https://docs.microsoft.com/ja-jp/powerapps/developer/common-data-service/use-change-tracking-synchronize-data-external-systems)

# 作成者(createdby)、作成者代理 (createdonbehalfby)、修正者 (modifiedby)、修正者代理 (modifiedonbehalfby)

レコードを作成または修正したユーザーの GUID を格納します。
またインポートや SDK 経由などで作成、修正した場合に使ったアカウントも代理者に格納します。

# 所有者 (ownerid)、所有チーム (owningteam)、所属部署 (owningbusinessunit)

CDS ではレコードのセキュリティとして以下の 5 段階を用意しています。

- グローバル (組織全体): すべてのレコードにアクセスできます
- ディープ (部署配下): 所属する部署とその配下のすべての部署のレコードにアクセスできます
- ローカル (部署): 所属する部署のレコードにアクセスできます
- ベーシック (ユーザー): 自分が所有しているレコード、ユーザーが共有しているオブジェクト、ユーザーがメンバーになっているチームが共有しているオブジェクトにアクセスできます
- なし: アクセスは許可されません

上記のモデルを効率よく適用するため、各レコードは所有者、所有チーム、所属部署があり、所属部署は所有者が設定された時点で、そのユーザーの部署が自動的に入ります。

尚、エンティティは個人とチームが所有するモデルと組織が所有するモデルがあり、組織が所有する場合はこれらのフィールドは不要なため追加されません。

# インポート シーケンス番号 (importsequencenumber)

データのインポートを使用した場合、インポートのソースとレコードをマップするために保持するフィールドです。

# まとめ

CDS を使うと、以下の機能が自動的に使えます。

- レコードの状態管理
- 所有者や部署など、階層的なセキュリティ + 共有などより柔軟なセキュリティ
- レコードの作成日や修正日の自動付与
- レコードの作成者や編集者の自動付与
- 複数タイムゾーンのサポート
- 複数言語、通貨のサポート

上記の機能を満たすため、多くのフィールドが自動で追加されるのです。これらのフィールドはシステムフィールドであり削除できませんが、便利な者なので、邪魔者扱いせず活用してください。
初学者によるプログラミングMemo　#12 クラスとインスタンス

# はじめに
今回はクラスとインスタンスについてすこしお話しします
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

# 目次

- クラスとは
- インスタンスとは
- インスタンス変数とは
- 実践編


## クラスとは
設計図のことです
もしくは、その実体を生成するために設定された概念のこと

よく車で例えられますが、車の設計図がクラスです
と言っても、プリウスのとかワーゲンのとかではなく、タイヤが４輪で、エンジンが搭載されて、ハンドルがあり、アクセルとブレーキがあり…と言った、全車種に共通している部分です

## インスタンスとは
クラスという設計図を元に作成された実態のこと
つまりそれぞれの車一台一台のことです
これは、外観が白かったり、ワゴン車やスポーツカーと言った、それぞれ個々の特徴を持ちます

## インスタンス変数とは
インスタンス変数というものを語らずにはクラスとインスタンスの話は終われません
インスタンス変数とは、そのクラス内の全メソッドで共通して使うことができる変数のことです
変数の頭に"@"がついていることが特徴です
後述する実践編でインスタンス変数を使ってみます

## 実践編

では実際にクラスとインスタンスを使ってみましょう
車の話は飽きたので、本にします
まずはクラスを定義します

```.rb
class Book
end
```
これでクラスの定義ができました
では中身を決めていきましょう
著者とタイトルと値段でしてみましょう

```.rb
class Book
  def initialize(author, title, price)
    @auther = auther
    @title = title
    @price = price
  end
end
```
できました
"@ author"は先ほど述べたインスタンス変数です
しれっと"initialize"メソッドを使っています
これは何か新しく登録をする際に必ず呼びざされるメソッドです
せっかくなので、ここへ何か登録する記述を加えましょう

```.rb
class Book
  def initialize(author, title, price)
    @author = author
    @title = title
    @price = price
  end
end

book = Book.new("ナガノ","MOGUMOGU食べ歩きくま","1100")
```
できました
さて、ここで、タイトルを表示させたいのですが、このままではタイトルが表示できません
そこで、インスタンス変数を使って、新たに"title"メソッドを定義し、表示させてみましょう

```.rb
class Book
  def initialize(author, title, price)
    @author = author
    @title = title
    @price = price
  end

  def title
    @title
  end
end

book = Book.new("ナガノ","MOGUMOGU食べ歩きくま","1100")

puts "タイトル: #{book.title}"
```
"initialize"メソッドを使用しているので、登録のタイミングで、"@ title"に"title"が代入されています
"@ title"はインスタンス変数なので、"title"メソッド内でも使うことができます
なので、"title"メソッドの返り値は"MOGUMOGU食べ歩きくま"となり、これで無事表示させることができました
VB.netのTagプロパティについて

Tag プロパティの初期値は null 。 
何も設定しない状態で Tag を参照しても結果は何も入っていない状態ですので、 
プログラム的には IsNothing か何かで判定して処理を分ける必要があります。 

参考URL
http://www.mitene.or.jp/~rnk/vbdotnet/ctrl_tag.html
RaspberryPIでDocker環境構築

# RaspberryPIでDocker環境構築
Raspberry Pi4を利用して、Dockerの稼働環境を構築します。

## 前提
HW：Raspberry PI 4 Model B (4GB)
OS：Raspbian 10.2

## インストール

下記コマンドを実行することで、環境に合わせたdockerをインストールしてくれます。

```
$ curl -sSL https://get.docker.com/ | sh
```

下記コマンドで、インストールが完了したかを確認をする。

```
$ docker --version
Docker version 19.03.5, build 633a0ea
```

## Dockerのユーザ実行権限の設定
初期設定では、dockerコマンドを使用できるのはrootのみのため、root以外のユーザーがdockerコマンドを使用するためには、対象ユーザーをdockerというグループに追加する必要があります。

以下コマンドを実行することにより、piという名前のユーザが、dockerコマンドを使用することができます。

```
$ sudo usermod -aG docker pi
```

また、Raspberry Piを起動した際に、自動的にdockerのデーモンも立ち上がってほしいので、以下コマンドで自動起動設定を行います。

```
$ sudo systemctl enable docker
```

以上の設定が完了したら、再起動をしてください。

```
$ sudo reboot
```

## docker-composeのインストール
下記記事の手順でインストールする。

* [Raspberry Pi用docker-composeの構築 （1.25.0以降）](https://qiita.com/tkyonezu/items/912fb7cfaab2f59276dd)

github.com から docker-compose をクローンします。

```
$ git clone https://github.com/docker/compose.git
$ cd compose
```

ビルド用のスクリプトで docker-compose をビルドします。

```
$ ./script/build/linux
```

これでRasberryPi用のバイナリをビルドすることができます。

ビルドに成功していれば、dist ディレクトリに docker-compose のバイナリができているので、実行してバージョンを確認してみます。

```
$ cd dist
$ ./docker-compose-Linux-armv7l  version
docker-compose version 1.25.0, build 4038169d
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
```

 docker-compose のバイナリをコピー

```
$ sudo cp docker-compose-Linux-armv7l /usr/local/bin/docker-compose
$ cd /usr/local/bin
$ sudo chown root:root docker-compose
$ sudo chmod 755 docker-compose
```

これでdocker-composeが使えるようになります。

```
$ which docker-compose
/usr/local/bin/docker-compose
```

# 参考文献

* [RaspbianにDockerをインストールする](https://qiita.com/musaprg/items/fe614083124c44a7d5e9)
* [dockerとdocker-composeのインストール(Linux編)](https://qiita.com/youtangai/items/ff67ceff5497a0e0b1af)
* [Raspberry Pi用docker-composeの構築 （1.25.0以降）](https://qiita.com/tkyonezu/items/912fb7cfaab2f59276dd)
【Rails】Deviseのエラーを突破する　〜NoMethodError in Devise

何度かDeviseを使用しているもののまだまだ初心者。基本的なことなのかもしれませんが、初心者のわたしは解決法さがしに手間どってしまいました…。同じエラーで検索していらした方の解決の糸口になれば幸いです。

# 環境
- Ruby 2.5.1
- Rails 5.2.3
- （Gem）Devise 4.7.0

# エラー内容
ユーザーログアウトを行おうとしたところ`NoMethodError in Devise::SessionsController#destroy`という表示。
![user_logout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410392/c1298634-b49b-c430-2f72-cd4a2ad7f258.png)
上記のように、わたしの場合はログアウト機能（SessionsController#destroy）を実行した際に発覚したエラーですが、同様のエラーにも対応できるかもしれません。

これまでDeviseの機能を使ってきてこのような表示に遭遇したことがなかった分、Devise導入と同時に作成したカラムそのものに問題があるのでは、となかなか見当をつけることができませんでした。

# なぜエラーになったのか？
エラーに表記されている`remember_created_at`という名称のカラムがusersテーブルに含まれていなかったことが原因でした。

# 解決法
ここからは通常の手順で該当のカラムを追加していきましょう。わたしの場合は`remember_created_at`がない、と怒られているようなので、これをusersテーブルに追加するためのマイグレーションファイルを作成します。まずは、ターミナルで以下を打ち込みます。

```ターミナル
$ rails g migration AddRemember_created_atToUsers
```

そして、作成されたマイグレーションファイルに`add_column〜`以下を追加します。

```2019xxxxxxxx_add_remember_created_at_to_users.rb
class AddRememberCreatedAtToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :remember_created_at, :datetime
  end
end
```
追加しなくてはならないカラムの型が何に該当するのかさえわからなかったため、Devise導入時usersテーブルを作成した際のマイグレーションファイル（この時点ではコメントアウトになっていた！）を参考に`:datetime`であることを確認して入力。

あとは、テーブルに反映させるだけです。忘れずにターミナルで以下を実行します。

```
$ rake db:migrate
```

こうして無事ログアウトができるようになりました！　作成したカラムがnilで怒られる場合は、適当な値を入力したうえで動作確認をしてみると良いと思います。
手順としてはかんたんですが、なかなか見当がつかず、ずっとアカウント切り替えられなかったらどうしよう、とすら思いました。良かったです。

# 参考
- teratail 「[Ruby on Rails : NoMethodError in Devise::RegistrationsController#create]
(https://teratail.com/questions/87061)」
- ISSUS 「[Deviseのログインを維持する設定](https://issus.me/projects/34/issues/12)」

上記を参考に解決することができました。ありがとうございます。