OmniAICreator/Qiita-1.07M huggingface dataset:
[Laravel]OAuthによるログイン時に前画面からパラメータを引き継ぐ方法

![laravel-v6.18.40](https://img.shields.io/badge/Laravel-v6.18.40-default) ![socialite-v5.0.1](https://img.shields.io/badge/socialite-v5.0.1-default)

# はじめに
OAuthによるログインの実装は、一度外部サービスへリダイレクトを行って、外部サービスから自サービスのコールバックエンドポイントにリダイレクトを受けるという流れになります。
ログイン時には、「どの画面からログインを試みたのか？」 「どういう登録導線からログインされたのか？」 といったログイン処理前の情報を受け取りたいニーズがある場合があります。

このとき、ログイン画面からコールバックエンドポイントに情報を伝達したい場合どうしたらいいかという話です。
ログインに限らず、登録のケースでも同じようにできます。


# セッションを利用する

https://readouble.com/laravel/7.x/ja/session.html

HTTPはステートレスなので、リクエストをまたがって情報を保持するには以下のいずれか対応をする必要があります。

1. POSTパラメータまたはGETパラメータを次ページに引回す
2. セッションにデータを紐づけて一時的に保持する
3. クッキーにユーザを特定するキーを仕込んで、DBに保存した値と紐づける

1の方法はFacebook認証では実現できませんでした。[^1]
[^1]: GETクエリは設定でき、OAuthの連携先であるFacebookにGETパラメータが送られるが、コールバック時にGETパラメータを返してくれなかったので、自サービスが受けるコールバックまでデータを伝搬できなかった。
3の方法でも実現できますが、２の方がお手軽なので選択しませんでした。


OAuthによるログインはSocialiteというOAuthパッケージを利用する前提です。

```php:FacebookAuthController.php

    // OAuth先サービスにリダイレクト
    public function redirectToProvider(Request $request)
    {
        // どのページからログインを試みたのかセッションに保持する
        $request->session()->push('loggedin-from','register-page-01');


        return Socialite::driver('facebook')->redirect();
    }

    // OAuth先サービスからのリダイレクトを受けるエンドポイント
    public function handleProviderCallback(Request $request) {
        // セッションから情報を取得する
        $loggedInFrom = $request->session()->get('loggedin-from', ’no-data’);

        // 略) OAuth先から情報を取得してログインする処理
    }
````
【VMware】vmdkリネーム・SCSI修正

本来、仮想ディスクを複数追加すると、仮想マシン.vmdk , 仮想マシン_1.vmdkと連番が付きますが、仮想マシンをデータストアまたぎで移行したりすると、この連番とかハードディスク番号が変わってしまうことがあります。
そのままでも稼働には影響ないですが、スクリプト組んだりするときにややこしいことになりますね。

![WS20200612_104154000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/6a119358-8e2b-4441-f09f-ce04c14c59e6.jpeg)

こんな感じ。scsi番号でいうと(0:0)なので1つめですが、ハードディスク番号が2になっているので、ハードディスク2の方が上にきてしまっています。
また、本来つかないvmdkファイル名に連番_1がついています。

これらを綺麗な順番に直していきます。
<br>
ちなみに、同じデータストアに配置された仮想ディスクのVM名フォルダに(1)とかがついていて分散されてしまっている場合↓
`[DATASTORE]仮想マシンフォルダ/仮想マシン名.vmdk
[DATASTORE]仮想マシンフォルダ(1)/仮想マシン名_1.vmdk
`はStoragevMotionで一時的に別データストアに移すと自動で統合してくれます。

バージョンはESXi6.5。
<br>
#vmdkファイル名を修正する
対象の仮想マシンを停止して、ESXiホストにSSH接続し以下コマンドを実行

```
cd vmfs/volumes
cd DATASTORE_NAME
```
で対象データストアに移動し、

```
vmkfstools -E VMNAME_2.vmdk VMNAME.vmdk
```
のように` vmkfstools -E 変更前 変更後 `で修正します。

lsで確認すると名前が変わっているのでこれでOKです。
<br>
#SCSI番号を修正する
vmx構成ファイルを直接修正でもできますが、vCenter上からやる方が安心です。

停止させた仮想マシン右クリック→「設定の編集」より、
ついているハードディスクの右端Xをクリックして削除します。
<font color="Red">(※"データストアからファイルを削除します"にはチェックを入れないこと!)</font>
![WS20200612_114330000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673840/250bf28d-5432-547e-7462-92dba67a1787.jpeg)
その状態のまま、新規デバイスメニューから「既存のハ―ドディスク」を選び、先ほど修正したvmdkファイルを順に追加していきます。
この時、"仮想デバイスノード"の項目が`SCSI(0:0)ハードディスク1`から順番になることを確認します。
(2つめは`SCSI(0:1)ハードディスク2`)

OKをクリックし、パワーオンすると綺麗な状態になっているはずです。
ハードディスク番号は変わりましたが、SCSI番号は変わっていないので、OS上で認識させたドライブも変わりありません。

<br>
以上。
UE4のTEXTマクロ多重定義回避

#先行記事

UnrealC++のマクロ多重定義の回避方法
https://qiita.com/Naotsun/items/a97af1e0ff22a75ce4d9

#背景
UE4のC++で某ライブラリを使おうとしたらTEXT多重定義でハマって、日本語の記事が上記のしかなったので補足。

UE4フォーラムの#5コメントにすべてが書いてあった。
https://forums.unrealengine.com/development-discussion/c-gameplay-programming/1446900-issue-with-macro-redefinition

#回避方法1

先行記事にも書いてある方法。`AllowWindowsPlatformTypes.h`と`HideWindowsPlatformTypes.h`
でインクルードしているヘッダーを囲む。

この方法ではWindows特有の定義のエラーを回避できるらしいが、使おうとしたライブラリでWinnt.hで定義されている関数が使われていたのでビルド通らず。

```
#include "AllowWindowsPlatformTypes.h"

//あなたが使っているヘッダーファイル

#include "HideWindowsPlatformTypes.h"

```

#回避方法2
上記のフォーラムのコメント#5では回避方法1, 2の両方を使っていたがこちらだけにしたらビルドが通った。


```
#include "PreWindowsApi.h"

//あなたが使っているヘッダーファイル

#include "PostWindowsApi.h"

```

#回避方法3
根本的解決。C++での多重定義回避の方法らしい。
https://docs.microsoft.com/ja-jp/cpp/preprocessor/hash-ifdef-and-hash-ifndef-directives-c-cpp?view=vs-2019

TEXTマクロを該当のcppでだけ宣言を宣言解除する。

```
#ifdef TEXT //TEXTマクロが宣言されているときだけ通る
#undef TEXT //TEXTマクロを宣言解除する

//使いたいTEXTマクロが多重定義されていると言われるヘッダーファイル

#endif
```
Prometheus vs. Splunk　〜監視ツールの比較とその使用機会〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/57359edc-0b2e-5986-00e9-81312b0d5594.png)

#Prometheusとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/d0c90f38-e82a-14d5-e037-4346d28398c0.png)

Prometheusは、時系列データベースを中心に構築されたオープンソースのサービス監視システムであり、クエリ、グラフ、組み込みのアラートに加えて、データを受信して保存できます。 ターゲットエンドポイントに接続してHTTP経由でメトリックを要求するPrometheusは、メトリックを一つの時系列の一部として識別する名前やタグによってメトリックを定義できる多次元データモデルを提供しています。 MetricFireが提供するマネージドサービス”Hosted Prometheus”では、データを１年間保存できますが、オープンソースのPrometheusメトリックのデフォルトの保持期間は15日です。 その後、Prometheusクエリ言語（PromQL）を使用して、メトリックを探索し、単純なグラフを描画できます。

Promethuesの使用をが適しているかなど、ご不明な点がございましたら、いつでも[デモを予約](https://www.metricfire.com/demo/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Prometheus%20vs.%20Splunk)して直接お問い合わせください(日本語可）。無料トライアルも提供しております。

#Splunkとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/2e0c3bfb-42eb-acbc-4686-dcab9e2553c4.png)

Splunkは、IoT、セキュリティ、IT、およびビジネス分析を専門とする有料のデータ監視および視覚化サービスです。 Splunkは主にログを処理しますが、ログをメトリックに変更する際にも役立ちます。 データストレージもサポートし、オンプレミスセットアップとクラウドセットアップの両方を備えています。 Splunkの最大の強みの1つは、リアルタイムの可視化です。 最も一般的な入力データ形式は.csvとjsonですが、どの形式でも使用でき、あらゆる種類のデータ生成からデータ入力ソースを作成できます。 また、Splunkは顧客サポートも提供しています。


#MetricFireのHosted Prometheusの使用が適している時は？

次の場合はHosted Prometheusを使用してみてください。

- 時系列データベース監視ソリューションが必要
- Prometheusメトリックの長期ストレージが必要
- メトリクスにはタグ/ラベルを使用したい
- 異なるデータソース間でアラートを実行したい
- 同じサービスの一部としてすべてPrometheusとGraphiteの両方を使用してクエリを実行したい

#Splunkの使用が適している時は？

次の場合はSplunkを使用してみてください。

- ホストされたデータの収集、監視、視覚化、分析、およびストレージサービスをすべて1か所にしたい
- リアルタイムのデータを視覚化したい
- 重要な機械生成情報の保存データベースを作成したい
- 監視および視覚化できる検索可能なデータベースを作成したい

#価格の比較‍

- Prometheusはオープンソースであり、無料です。
- MetricFireのHosted Prometheus、Hosted Graphite ＆ Grafanaを含む、ビジネス対応のPrometheusは、月額99米ドルから始まります。
- Splunk Enterpriseは月額225米ドルです。
- Splunk Freeは1人のユーザーが利用でき、1か月あたり最大500 MBのデータを利用できます。
- Splunkには、ボリュームベースの価格と、他の価格で購入できるさまざまな特定の製品もあります。

#重要なポイント

Prometheusは、組み込みのストレージ、グラフ、アラートを備えたメトリック名とタグによってメトリックが識別される次元データモデルを提供できます。また、Prometheusはオープンソースであり、無料です。
Splunkは、データ管理に関連するすべての情報を1か所で提供し、幅広い分野（IoT、IT、セキュリティ、ビジネスメトリックス）で使用できますが、Splunkは無料で使用できない独自のサービスです。

MetricFireの提供するHosted Prometheusをよく理解し、MetricFireがモニタリング環境にどのように適合するかを是非サポートチームに連絡して、ご確認してください！ [デモの予約はこちら](https://www.metricfire.com/demo/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Prometheus%20vs.%20Splunk)から。

それでは、またの記事で！
PowerApps スピナー数値入力のやり方 

#スピナー数値入力とは
HTMLだと以下のように上下ボタンがついているもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/770232c0-d846-9540-70d7-df367af7ffe1.png)

#PowerAppsでの実現方法
概念だけ説明。0～99まで入力するようなイメージ。

・画面で変数を作成する

```画面:OnVisible
UpdateContext({num:0})
```


	
・加算ボタン

```加算ボタン:OnSelect
If(num < 99, UpdateContext({num:num + 1}))
```


・減算ボタン

```減算ボタン:OnSelect
If(num > 0, UpdateContext({num:num - 1}))
```

・入力テキストインプット

```入力テキストインプット:DelayOutput
false
```


#要点
データカードでDelayOutputがtrueになっていて
動作がもっさりしてげんなりしていた。
falseでサクサク機敏に反応してくれるようになった。
PHPでShift_JISのcsvファイルをパースするとcsvが壊れる

PHPでcsvファイルをパースしようと思ったのですが、文字列にカンマが混入しているところがうまくパースできませんでした。`"文字列,文字列"`となっている部分のカンマが項目の区切りのカンマと認識されてしまいます。

# 解決方法
"文字列,文字列"という部分は通常文字列リテラルの`"`で囲われているので文字列として認識されるはずなのですが、Shift_JISのファイルについてはうまくいきません。

一旦ファイルの中身をUTF-8に変換して、tmpファイルに保存した後に、csvファイルとして読み込むとうまく認識することができます。

```php

$sJisFile = file_get_contents($file->path());
$utf8File = mb_convert_encoding($sJisFile, 'UTF-8', 'SJIS');
$fp = tmpfile();
$meta = stream_get_meta_data($fp);
fwrite($fp, $utf8File);
rewind($fp);

$file = new \SplFileObject($meta['uri']);
$file->setFlags(\SplFileObject::READ_CSV);

foreach($file as $line) {
    var_dump($line);
}

```
最後に任意の文字があるかのメソッドを作る

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのようにコーディングするか</b>

<b>3.開発環境</b>



1.結論
----------------------------------------
<b>downcaseメソッド、lengthメソッドと、sliceメソッド</b>の<b>3種類</b>を使う！
<br>

2.どのようにコーディングするか
----------------------------------------


```ruby
def str_discrimination(str_a, str_b)
  a_down_str = str_a.downcase #---❶
  b_down_str = str_b.downcase
  a_len_str = a_down_str.length #---❷
  b_len_str = b_down_str.length
  if b_down_str.slice(-(a_len_str)..- 1) == a_down_str || a_down_str.slice(-(b_len_str)..- 1) == b_len_str　#---❸
    puts "True"
  else
    puts "False"
  end
end
```

❶：大文字小文字で区別しないためです。任意の2種類の文字列(str_a,str_b)を<b>downcaseメソッド</b>で全てを小文字にしました。

```ruby
変数(文字列).downcase
```

❷：❶で小文字に変換した変数を<b>lengthメソッド</b>で文字数を返しています。これは❸で使うためにコーディングしています。

❸：ここで最後に任意の文字があるかを判別しています。str_aやstr_bのどちらに探されたい文字列、探したい文字が来てもいいようにOR条件にしています。また<b>sliceメソッド</b>を使用し、❷で使用した<b>lengthメソッド</b>で代入された変数を入れることで最後から任意の文字を探しています。(-(a_len_str)..- 1)は、最後から(-1)から-(a_len_str)の文字数までを示しています。
<br>

参考にしたURL:
<a href="https://www.sejuku.net/blog/60402">はじめてのRuby！文字列を大文字⇔小文字に変換する方法まとめ</a>
<a href="https://qiita.com/motoki4917/items/ffc89d955e20b91d1014">length、size、count メソッドの違いまとめ【Ruby】</a>

3.開発環境
----------------------------------------
Ruby 2.6.5
Rails 6.0.3.3
Visual Studio Code
<br>
webアプリをネイティブアプリっぽく表示する

今度自社でwebアプリを作成することになったのですが、
どうせならネイティブアプリっぽくできたらなって思って調べたらいい方法があったので覚書として書きます。


やり方は至って簡単で、以下のmetaタグをhead内に追加するだけです。

```html
<meta name="apple-mobile-web-app-capable" content="yes" />
```

ちなみにこのmetaタグを書くとURLバーを非表示にするだけですが、
気持ち見た目をネイティブアプリっぽく表示することができます。


またiphoneでショートカットをホーム画面上に追加した時のアイコンの設定は以下でできます。

```html
<link rel="apple-touch-icon" href="">
```
href=""にはアイコン画像のURLを入れてください。
サイズはまあ180x180pxあれば十分かと。
CodeWarでの勉強（ruby）④　case~when



#この記事について
最近始めたCodewarを通じて学べたことを少しずつアウトプット



##問題
>You probably know the "like" system from Facebook and other pages. People can "like" blog posts, pictures or other items. We want to create the text that should be displayed next to such an item.
Implement a function likes :: [String] -> String, which must take in input array, containing the names of people who like an item. It must return the display text as shown in the examples:

引数で配列を受け取るlikesメソッドを実装して、配列に含まれる情報から誰がイイねをしたか表示させるようにさせる。


```ruby
likes [] -- must be "no one likes this"
likes ["Peter"] -- must be "Peter likes this"
likes ["Jacob", "Alex"] -- must be "Jacob and Alex like this"
likes ["Max", "John", "Mark"] -- must be "Max, John and Mark like this"
likes ["Alex", "Jacob", "Mark", "Max"] -- must be "Alex, Jacob and 2 others like this"
```

##僕の回答

```ruby
def likes(names)
  return "no one likes this" if names.empty?
  
  if names.count == 1
    "#{names[0]} likes this"
  elsif names.count == 2
    names.each { |n| }.join(" and ") << " like this"
  elsif names.count == 3
    "#{names[0]}, #{names[1]} and #{names[2]} like this"
  else
　　　others_count = names.count -2
    "#{names[0]}, #{names[1]} and #{others_count} others like this"   
  end
end
```

配列の長さによって返す情報を変えていくシンプルのやり方だと思う。
強調しておきたいのが、` return "no one likes this" if names.empty?`というように人生で初めて１行完結のif文を書けたことだ！！！！！



##ベストプラクティス

めっちゃ見やすい。。。
複数の条件でやる場合は`case~when`の方が読みやすくてイイね。


```ruby
def likes(names)
  case names.size
  when 0 
    "no one likes this"
  when 1 
    "#{names[0]} likes this"
  when 2
    "#{names[0]} and #{names[1]} like this"
  when 3
    "#{names[0]}, #{names[1]} and #{names[2]} like this"
  else
    "#{names[0]}, #{names[1]} and #{names.size - 2} others like this"
  end
end
```
[Javascript] Const, Let, Varの違い（ES6関連）

## Javascriptの変数

Javascriptには、変数を宣言するキーワードの`const`、`let`、`var`があります。
これらのキーワードは以下について違いがあります。

・初期値
・重複した値割り当て
・呼び出し範囲

まずconst, let, var すべての変数は下記のように
、コンマで区切って複数の変数を定義することができます。

``` javascript
const category= "header",
      key= "content-Type",
      value= "application/json";
```

##  Constについて

`const`は値が変わらない変数を宣言するキーワードです。
`const`は必ず初期値を設定しなければならず、
宣言した変数に対して、あとで値を割り当てることはできません。

`const` で宣言した変数に値を再度割り当てる場合には、
次のようなエラー(TypeError)が発生します。

``` javascript
const key = "content-Type";
key = "appId"; 
// Result => TypeError: invalid assignment to const 'key'
```
変数に値を割り付ける必要がない場合には、
`const` キーワードで変数宣言することを推奨します。

ループなどの繰り返しの途中で特定変数が参照する値を変えなければならないときがあります。
その場合は変数に再割り当てできる`let`キーワードで宣言します。


##  Letについて

`let`は初期値を指定しなくても大丈夫です。
初期値を指定しない場合、undefined 値に初期化されます。

``` javascript
let key;
// `key` is initialized `undefined`
```

`let`が宣言された`key`という変数に`"content-Type"`という文字列を代入しています。

``` javascript
let key;
key = "content-type";
```


##  Varについて

`var` キーワードは初期値を宣言しなくてもよく、
値を再割り当てしても良いという点で`let`に似ています。
しかし、`var`キーワードは同じ名前の変数を定義し直すことができます。

`let`と`const`は同じ名前の変数を定義することができず、
次のような構文エラー(`Syntax Error`)が発生します。
したがって、ミスとして変数を二重に定義するミスを防ぐことができます。

``` javascript
let key;
let key; // => SyntaxError: redeclaration of let key
```

`var`の場合には、同じ名前の変数を定義し直すことができます。
これは間違いで同じ変数の名前で定義しても間違いはなく、
以前に宣言した値を閉じてしまいます。

``` javascript
var x = 1;
var x = 2;
// x is 2
```

`let`は、変数を宣言する前にその変数を参照すると`ReferenceError`が発生します。

``` javascript
console.log(x); 
//ReferenceError: can't access lexical declaration `x' 
before initialization
let x = 1;
```

`var`は変数を宣言する前に、その変数を参照しても`undefined`値が割り当てられます。

``` javascript
console.log(x); // => undefined
var x = 1;
```

##  まとめ

JavaScriptは変数を宣言するキーワードとして、`const`、`let`、`var`についてまとめました。

・`const`は値を再割り当てできない変数を宣言する時に使用されます。
・`let`、`var`は再割り当てできる変数を宣言することができ、
初期値を宣言しなくてもかまいません。
・`var` の場合のみ、同じ値を重複宣言することができます。

`const` は再割り当て不可能な変数を定義するキーワードです。
再割り当てを禁止することで、誤って他の値を割り当てることで発生するバグを減らすことができます。

したがって、変数を宣言する場合には、まず`const`で定義できないかを検討の上、
不可能な場合は`let`の使用をお勧めします。
入門GoogleAppsScript 就活のスケジュールを漏れなくカレンダーに反映させたい(前半)

#就活あるある言いたい
大学生にとって突然現れる大きな壁。そうスケジュール管理。
今まさに就活生の支援をしていることも有るのですが、肌感1割程度の方がスケジュールミスで選考棒に振るんですよね…。

####新しく手帳買いがち
・形から！と意気込んでいい手帳買う
・でもあんまり活用できない
・メモ帳でよかったのでは…？とあとから気がつく

####予定が多すぎて手帳に予定が入り切らない
・面談場所、時間、持ち物が書ききれない
・もういいから後で書こうって永遠に書かれない

####面接場所間違えがち
・あるあるってほどじゃないけどあるある
・説明会や一次選考は本社だったりそうじゃなかったり
・最悪のケース、場所間違えて第一志望の企業の選考に遅れることも…
つまり就活ってスケジュール管理が<b>命綱</b>だけど<b>めちゃくちゃめんどくさい</b>んですよね。

そこで今回は絶対にスケジュール管理をミスらない<b>最強のスケジューラー</b>をGoogleAppScriptを使って実装していこうと思います。

#今回の成果物のイメージ


####1.記入用のスプレッドシート
![sss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/750506/f720d5d0-4ebc-822d-8c5a-d816134c9f44.jpeg)
ダウンロードは<a href = https://docs.google.com/spreadsheets/d/1hkRf5cAZmaJCwwqGXmBreDDburOwvlgjzUClIiDcnO0/edit?usp=sharing>こちら</a>から
※表示されたスプレッドシートを*必ず*コピーして使ってください

####2.表示されるカレンダーの画面
![cal.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/750506/d7275a03-92c2-41f3-2184-e61fc46b4d6e.jpeg)
・スプレッドシートに記載されたものが自動的に反映されるようになっています
・選考前の予定が記載され、選考結果待ち、終了状況のものはカレンダーへの反映がされないようになっています

# GAS(Google Apps Script)とは
![gas.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/750506/13001cc5-1adf-988c-ace6-74bc4ff94183.jpeg)
・基本的にはJavaScriptに則ってコードを書き進めていくことが可能
・Googleの各種アプリと連携ができ、いろんなライフハックが可能に
・慣れれば営業職や文系を言い訳することなく使える
・（フロントエンドだけの）HP制作など、プログラミング？を学ぶくらいならGASがオススメ

# 完成物
```javascript:ss2cal.js
function ss2cal() {

  const calendar = CalendarApp.getDefaultCalendar();
  const spreadSheetId = ''
  const spreadSheet = SpreadsheetApp.openById(spreadSheetId);
  const sheet = spreadSheet.getSheetByName('Master');
  const lastRow = sheet.getLastRow();

  //---ここまででカレンダーとスプレッドシートの定義は完了---
  //---以下では重複を防ぐために既にタイトルに【就活】と記載のあるイベントを削除する
  const today = new Date();
  const schedules = calendar.getEvents(today, new Date(today.getFullYear(), today.getMonth(), today.getDate() + 90));

  for (var i = 0; i < schedules.length; i++) {
    const eventName = schedules[i].getTitle();
    if (eventName.indexOf("【就活】") != -1) {
      schedules[i].deleteEvent();
      //---indexOf()文字列の検索が可能。今回はタイトルに【就活】と付くものを探して自動で削除している
    };
  };

  for (var i = 2; i <= lastRow; i++) {
    const status = sheet.getRange(i, 1).getValue();
    const title = '【就活】' + sheet.getRange(i, 2).getValue() + sheet.getRange(i, 3).getValue();
    const time = new Date(sheet.getRange(i, 5).getValue());
    const delta = new Date(sheet.getRange(i, 6).getValue());
    const startTime = new Date(sheet.getRange(i, 4).getValue())
    startTime.setHours(time.getHours())
    startTime.setMinutes(time.getMinutes())
    const endTime = new Date(startTime)
    endTime.setHours(endTime.getHours() + delta.getHours());
    endTime.setMinutes(endTime.getMinutes() + delta.getMinutes());
    const option = {
      location: sheet.getRange(i, 7).getValue()
    };
    
    if (status == "選考前") {
      calendar.createEvent(title, startTime, endTime, option);
    }
  };
};
```

プログラミング興味はないけどスケジュール管理気をつけたいって人はここまででも結構。
仕組みまで気になるよ！って人は[こちら](https://qiita.com/sadasue/private/1212a001f6943e5f2c2e)から
Laravelでクリーンアーキテクチャを実装するときに参考にしたいリンク集

- DDDとかクリーンアーキテクチャについて調べるにあたって参考にした記事一覧です
- Laravelで実装することを目的として調べたので、ほぼPHP/Laravel系の記事です
- いいのがあれば随時追加予定

---
## "Laravelでクリーンアーキテクチャ" の実装サンプルが見たい場合
実際のコードを見たい人向け

- [Laravelで実践クリーンアーキテクチャ](https://qiita.com/nrslib/items/aa49d10dd2bcb3110f22)

- [Laravel5.6とVue.jsでクリーンアーキテクチャを目指す](https://aimstogeek.hatenablog.com/entry/2018/10/05/151123)

- [Laravel でやってみるクリーンアーキテクチャ(動画)](https://youtu.be/9IuDucqAuM0)

## Entityとは何かわからなくなった場合
正直わからないです

- [ドメイン駆動設計のエンティティとクリーンアーキテクチャのエンティティ](https://nrslib.com/clean-ddd-entity/)
- [お前らがModelと呼ぶアレをなんと呼ぶべきか。近辺の用語(EntityとかVOとかDTOとか)について整理しつつ考える](https://qiita.com/takasek/items/70ab5a61756ee620aee6)
- [Entity in DDD ≠ Entity in Clean Architecture](https://qiita.com/yosshi4486/items/b01a89bbb1728c94cd9d)

## Eloquentをクリーンアーキテクチャで使いたくなった場合
「フレームワークに依存しない」の正義に疑問を抱いた人向け

- [Laravel におけるリポジトリ実装のポイント](https://blog.shin1x1.com/entry/laravel-repository)

## 参照系の実装でつらみを感じた場合
一覧表示画面などの実装中に不穏な空気を感じ取った人向け

- [CQRS実践入門 [ドメイン駆動設計]](https://little-hands.hatenablog.com/entry/2019/12/02/cqrs)

## うっかり "is not instantiable" エラーに出くわした場合
bindし忘れた人向け

- [【Laravel】リポジトリパターン実装におけるエラー Target [App\Repositories\UserRepositoryInterface] is not instantiable while building](https://qiita.com/antk/items/38971fba1de4e6872b82)

## (おまけ) シリコンバレーではどうなのか知りたい場合
井の中の蛙は嫌な人向け

- [シリコンバレーでクリーンアーキテクチャーは流行っているのか(動画)](https://youtu.be/A1aSOhsEh58)
Laravelでneo4jを使ってみる。プッシュ通知メモ


push通知のライブラリ入れる細かい設定は他サイト参照
```
composer require laravel-notification-channels/webpush
```

※以下neo4jで注意する点

デフォルトのモデルはNeoEloquentを使っていないので変更

```config/webpush.php
'model' => \App\Models\PushSubscription::class,
```

モデル

```app/Models/PushSubscription.php

<?php

namespace App\Models;


use Vinelab\NeoEloquent\Eloquent\Model as NeoEloquent;

/**
 * @property string $endpoint
 * @property string|null $public_key
 * @property string|null $auth_token
 * @property string|null $content_encoding
 * @property \Illuminate\Database\Eloquent\Model $subscribable
 */
class PushSubscription extends NeoEloquent
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
     protected $label = 'PushSubscriptions'; 
    protected $fillable = [
        'endpoint',
        'public_key',
        'auth_token',
        'content_encoding',
    ];

    /**
     * Create a new model instance.
     *
     * @param  array $attributes
     * @return void
     */
    public function __construct(array $attributes = [])
    {
        if (! isset($this->connection)) {
            $this->setConnection(config('webpush.database_connection'));
        }

        if (! isset($this->table)) {
            $this->setTable(config('webpush.table_name'));
        }

        parent::__construct($attributes);
    }

    /**
     * Get the model related to the subscription.
     *
     * @return \Illuminate\Database\Eloquent\Relations\MorphTo
     */
    public function subscribable()
    {
        return $this->morphTo();
    }

    /**
     * Find a subscription by the given endpint.
     *
     * @param  string $endpoint
     * @return static|null
     */
    public static function findByEndpoint($endpoint)
    {
        return static::where('endpoint', $endpoint)->first();
    }
}

```
データ構造とアルゴリズム Vol.3

#Vol.3: Doubly Linked List
この版ではDoubly Linked Listの必要性とその使い方について学びます。

#Doubly Linked Listとは？
👌 Doubly Linked Listは頭（Head）と尻尾（Tail）を両方持っているという特徴があります。
👌 Doubly Linked Listの各ノードは、前ノードと後ろノードの情報を両方とも保存しています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/e829ab59-145c-50bf-f7a6-d968d0be7b4d.png)


#Doubly Linked Listの挿入プロセス
具現するイメージ
![doublyLinkedList2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/52bae434-7d7d-dcf6-8813-a1f9be2eacbb.png)

####例）実行するコードの例
```C
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int data;
  struct Node *prev;
  struct Node *next;
} Node;

//前方でも後方でもアクセス可能
Node *head, *tail;

//挿入関数
void insert(int data){
  Node* node = (Node*)malloc(sizeOf(Node));
  node->data = data;
  Node* cur;
  //最初の元素
  cur = head->next;
  //我々が入れようとするデータより、見ているポインタノードのデータが小さいときに限って右に移動し続けるようにするため、昇順を維持可能
  while (cur->data < data && cur ! = tail) {
  cur = cur-> next;
  }
  Node* prev = cur->prev;
  prev->next = node;
  node->prev = prev;
  cur->prev = node;
  node->next = cur;

}

int main(void) {
  system("pause");
  return 0;
}
```

#Doubly Linked Listの削除プロセス

具現するイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619479/3c9564dc-29a1-c412-4d7f-c32bdb1d8647.png)
deleteDoubly.png

####例）実行するコードの例
``  上記のコードに以下のコードを追加
``


```C
void removeFront() {
  Node* node = head->next;
  head->next = node->next;
  Node* next = node->next;
  next->prev = head;
  free(node);
}

void show() {
  Node* cur = head->next;
  while (cur != tail) {
    printf("%d", cur->data);
    cur = cur->next;
 }
}

```

#完成したDoubly Linked Listの使用
####例）実行するコードの例
``  上記のmainに以下のコードで修正
``

```C
int main(void) {
  head = (Node*) malloc(sizeof(Node));
  tail = (Node*) malloc(sizeof(Node));
  head->next = tail;
  head->prev = head;
  tail->next = tail;
  tail->prev = head;
  insert(2);
  insert(1);
  insert(3);
  insert(9);
  insert(7);
  removeFront();
  show();
  system("pause");
  return 0;
}

```


🤔　結果は？
``  result-> 2 3 7 9
``

#Doubly Linked List実装における注意点
❗上記のソースコードに加えて挿入および削除機能からの例外事項を処理する必要があります。
❗例として、これ以上削除する元素がないのに、削除する場合などをチェックする必要があります。

#まとめ
👌 Doubly Linked Listは、各ノードが前ノード(Prev)と後ろノード(Next)の情報を保存しています。
👌 Doubly Linked Listを利用すると、リストの前から若しくは後ろからすべてアクセスできます。

📚参考講義：コンピューター工学専攻必須オールインワンパッケージOnline
👆 上記の講義はCとC++を言語を前提に説明しています。
型の間の関係  - Typescript & Angular 勉強会 #8


## 型のサブタイプとスーパータイプ
- **サブタイプ**とは、派生型のこと。サブタイプから見た派生元を**スーパークラス**と言う
- オブジェクト指向言語では、一般的には継承によって表現される

![](https://plantuml-server.kkeisuke.app/svg/POux3i8m40NxFSLsLBa1HH17I47js0-yYkErraiG4eVdKqMYd3UlcB5xCB-lXUZ0MHBOCxWtTVfH58i5NnasbSJDT2vOEp_4CuTwAqWSJH-Thu1JNwIsO67b8XN-R60rpqfqpi4ds2OHV7mD0v-QxBP_Vy4yQLpW-nVHY9e-lMy0.svg)

上記において、ChatServiceがスーパータイプ、ApiChatService / WebSocketChatService がサブタイプになる

- 一般的に、サブタイプはスーパータイプに割当が可能である
    - これを型の共変性という。

---

## 型の共変性を活用した設計
- 前回話したデザインパターンの多くは、この型の共変性を活かした設計をしている
- スーパータイプを利用するようにしておくことで、型の共変性により任意のサブタイプを実際には代入されてもよくなる
    - 機能追加によるコードの変更範囲を絞ることができる

![](https://plantuml-server.kkeisuke.app/svg/POyn3i8m40Hxl-8wgl02X8BoX1JKZhtWKsoVPH-9a7Wya2g8ScUcsRwfhVf8qPW31VOW3Q1MHCss75SNyPLs4VPKgamHgT7A6iZcUuGdLsLjT0FKj9bpiTKcYfoXpmAIga6C6OBL4NLX1pgzkeukXNVitrynZU9cwBxQia5IaOoiT3pJZpKzil-yUGC0.svg)

上記例で言えば、仮にChatサービスの実装方法がWebSocketからAPIに変わったとしても、上位のクラスへの影響がない、という状態にできる。

---
## 型の反変性
- 反変性とは、共変性の反対の性質、すなわち サブタイプにスーパータイプが割り当て可能な場合をいう
- 代表的なものとして、 **関数オブジェクトにおけるメソッドの引数** がある。

```ts
type ElementClickEvent = ElementEvent & {
  position: {x: number, y:number}
}

type ButtonClickEventHandler = (e: ElementClickEvent) => void

let handler: ButtonClickEventHandler

handler = (e: ElementEvent) => {console.log(e.message)} //反変性

type ElementMultiClickEvent = ElementClickEvent & {
  clickCount: number
}

handler = (e: ElementMultiClickEvent) => {} //共変性をサポートしない
```
GitLab13.3から13.4への更新時にトラブった話と解決策

# GitLab 13.4更新後にいくつかのリポジトリでエラー発生
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403260/0440f042-f3d4-68a1-c6b4-69594fd1f476.png)
発生する環境と発生しない環境があるみたいですが、原因はわかっていません。
2環境中、1つでは発生しましたが、もう１つでは問題なくアップデートができていました。

# 解決策

GitLab Runnerのトークンリセット
https://docs.gitlab.com/ce/raketasks/backup_restore.html#reset-runner-registration-tokens

```
# gitlab-rails dbconsole

gitlabhq_production=> UPDATE projects SET runners_token = null, runners_token_encrypted = null;
gitlabhq_production=> UPDATE namespaces SET runners_token = null, runners_token_encrypted = null;
gitlabhq_production=> UPDATE application_settings SET runners_registration_token_encrypted = null;
gitlabhq_production=> UPDATE ci_runners SET token = null, token_encrypted = null;
gitlabhq_production=> exit
```

Migrationの実行

```
# gitlab-rake gitlab:storage:migrate_to_hashed
```

フォーラムでも同様の議論がされていた。
https://forum.gitlab.com/t/upgrade-to-gitlab-13-4-0-b0481767fe4-killed-all-repositories/43038
Djangoを使ったWEBアプリケーションの開発【テンプレート追加編】

[リクエスト処理編の続き](https://qiita.com/tesla1017/items/7da9dca7528797b98b68)

テンプレート
-
現状、/posts/へアクセスするとurls.pyが呼び出され、views.pyから「Hello, World!」を直接返して表示する処理を記載しています。ここでテンプレートを作成し、それを表示させるようにします。

テンプレートを追加
-
これからテンプレートを作成しviews.pyを書き換え、ルーティング→ビュー→テンプレートという処理に変更していきます。

まずは、アプリケーションフォルダ（今回は「posts」フォルダ）に「templates」フォルダを作成し、さらにその中にアプリケーションフォルダと同じ名前のフォルダを作成します。
※Djangoのルールとしてtemplatesフォルダ内にアプリケーションフォルダと同じ名前のフォルダが必要。

次にtemplates内のpostsフォルダにHTMLファイルを作成します。

```index.html
<!DOCTYPE html>
<html lang="ja-jp" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <h2>テストページです。</h2>
  </body>
</html>
```

さらに、作成したHTMLファイルを表示するためviews.pyを修正します。

```views.py
def index(request):
    #return HttpResponse("Hello, World!") ←ここをコメントアウト
    return render(request, 'posts/index.html') #新しく追加した行
```
こうすることで、views.pyが呼び出されたとき直接「Hello, World!」を返さず、templates内にあるpostsフォルダのindex.htmlを参照して返すことができます。
Djangoサーバーを立ち上げて「[http://127.0.0.1:8000/posts/](http://127.0.0.1:8000/posts/)」で表示すると下記のようになります。
![テンプレート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313621/9d65b46e-c6d2-c0bd-113a-16dc0f9d8ec8.png)
【MNIST】データをPNG変換

# はじめに
学習データやテストデータの把握は必要かなと思っています。mnistのデータをPNGに変換するツール(Google Colab用)を作成しました。

# mnist_data2img
mnist_data2imgツールをGithubに公開しており、環境構築手順などはこちらのREADME.mdに記載していますので、こちらを参照してください。

> <img width=64 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/3a342531-d030-6a66-678e-45f328de072f.png'><img width=120 src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/7e2c1f12-f920-922c-81f2-312da1406ad0.png'>
> Github : https://github.com/PoodleMaster/mnist_data2img
> 
> ・[Google Colab：mnist_data2img.ipynb](https://github.com/PoodleMaster/mnist_data2img/blob/master/mnist_data2img.ipynb)


※Google Colabの使用方法が良く分からない方は、[こちらの記事](https://qiita.com/PoodleMaster/items/f6b7205c4c20948e9c0d)を参考にしてください。

# 実行結果
mnistデータからpngへの変換結果です。

## 変換データ格納場所
`Googleドライブ`の以下フォルダに**ラベル毎**に画像が格納されます。

**【mnist_train_data】**
> /content/drive/My Drive/qiita_share/mnist_train_data/0
> 　　　　　　　　　　　　　　　　　　　                 ︙
> /content/drive/My Drive/qiita_share/mnist_train_data/9
> 

**【mnist_test_data】**
> /content/drive/My Drive/qiita_share/mnist_test_data/0
> 　　　　　　　　　　　　　　　　　　　                 ︙
> /content/drive/My Drive/qiita_share/mnist_test_data/9

## Trainデータの一部 (0の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/3083d7ea-3063-3656-e59a-82e9ee870b63.png)
## Trainデータの一部 (1の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/bba007ce-1dda-1ef8-1686-dbdada270e5b.png)
## Trainデータの一部 (2の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/a764f0f6-eb8b-ffe3-c18b-138997ba202e.png)
## Trainデータの一部 (3の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/dba172c5-d8b0-30e4-b978-a2b2037fdd99.png)
## Trainデータの一部 (4の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/15cc0dae-d296-6216-51fa-f308047a59a7.png)
## Trainデータの一部 (5の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/06113fbc-9584-7c48-9c6d-39af14058e88.png)
## Trainデータの一部 (6の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/2f8e4fe9-a62c-c672-c01a-05b7e8cfb7ac.png)
## Trainデータの一部 (7の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/0a8d14c9-8b18-5944-8ed8-15e9c26d713a.png)
## Trainデータの一部 (8の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/ee84f710-0f05-3fcc-41a8-ee3374114387.png)
## Trainデータの一部 (9の場合)
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405376/9104b71c-0302-e13d-ef93-2567b95bf22a.png)

# 以上
お疲れ様でした！
【2020年版】日本の量子コンピュータ・スタートアップの論文一覧

# このページの目的

「会社四季報 業界地図」の2021年版に量子コンピュータ業界が掲載されました。
しかし、「あの会社が載っていない！」という話も聞きますし、私もそう思います。また、掲載された会社も一言説明くらいしかないので、実際どんなことをやっているのか、あまり分からないのではないでしょうか。

そこで、

 - 客観的なデータを元に、
 - どの会社が、何をやっているのか知りたい

という思いで、日本の量子コンピュータ・スタートアップ(といっても、純粋なスタートアップだけでなく「大企業以外」は掲載するつもりです)の論文一覧をまとめました。

海外の量子コンピュータ・スタートアップのWebページを見ると、その会社が出している論文一覧が掲載されているのが一般的です。どんな論文を書いているのか分かれば、その会社がどのあたりに興味があるのか・何をしているのかのヒントになると思います。


**注意点**

 - 社名のアルファベット順に掲載しています。
 - 論文名や掲載誌の情報は、各社のWebページに掲載されている論文一覧を元にしています。
 - **<font color="Red">論文一覧が公開されていない会社は掲載していません。</font>**「ウチが漏れているよ！」とかあれば、私の落ち度です、すみません。その場合はご一報頂ければ追記いたします。
 - 被引用数はGoogle Scholarのデータを利用しています。
 - 論文数や被引用数は、指標のひとつに過ぎません。**<font color="Red">このページを見ただけで「○○社はダメだ」とかは言えないです。そういう目的のページではありません。</font>**
 - たまに更新するつもりです。

以下、各社の詳細情報です。

# Jij

(2020年9月27日時点の情報です)
公式の論文一覧 [https://j-ij.com/ja/publications/](https://j-ij.com/ja/publications/)

| 論文名 | arXiv | 査読付き論文誌 | 被引用数 |
|:-------|:-----:|:--------------:|---------:|
| Griffiths-McCoy singularity on the diluted Chimera graph: Monte Carlo simulations and experiments on the quantum hardware | 〇 | - | 0 |
| Dynamics of reverse annealing for the fully-connected p-spin model | 〇 | Phys. Rev. A | 17 |
| Message-passing algorithm of quantum annealing with nonstoquastic Hamiltonian | 〇 | JPSJ | 2 |

# QunaSys

(2020年9月27日時点の情報です)
公式の論文一覧 [https://qunasys.com/publications](https://qunasys.com/publications)

| 論文名 | arXiv | 査読付き論文誌 | 被引用数 |
|:-------|:-----:|:--------------:|---------:|
| Optimal resource cost for error mitigation | 〇 | - | 1 |
| Calculating nonadiabatic couplings and Berry's phase by variational quantum eigensolvers | 〇 | - | 0 |
| Predicting excited states from ground state wavefunction by supervised quantum machine learning | 〇 | - | 0 |
| Calculating transition amplitudes by variational quantum eigensolvers | 〇 | - | 1 |
| Orbital optimized unitary coupled cluster theory for quantum computer | 〇 | Phys. Rev. Research | 2 |
| Calculation of the Green's function on near-term quantum computers | 〇 | Phys. Rev. Research | 5 |
| Variational Quantum Algorithm for Non-equilibrium Steady States | 〇 | - | 10 |
| Theory of analytical energy derivatives for the variational quantum eigensolver | 〇 | Phys. Rev. Research | 14 |
| Subspace Variational Quantum Simulator | 〇 | - | 10 |
| Subspace-search variational quantum eigensolver for excited states | 〇 | Phys. Rev. Research | 19 |
| Generalization of the output of variational quantum eigensolver by parameter interpolation with low-depth ansatz | 〇 | Phys. Rev. Applied | 6 |
| Quantum Circuit Learning | 〇 | Phys. Rev. A | 196 |
| Boosting computational power through spatial multiplexing in quantum reservoir computing | 〇 | Phys. Rev. Applied | 24 |
| Harnessing disordered ensemble quantum dynamics for machine learning | 〇 | Phys. Rev. Applied | 62 |


# 感想

まとめてみて思ったのですが、日本の量子コンピュータ・スタートアップで論文一覧を公開している所は、ほとんど無いんですね。チョットサビシイデス😢
私のイメージでは10社前後はあると思うので、このページがもう少し活気づくと面白いですね。
MacとSSHでさくっとIPアドレスと国判定を変える

Amazonプライムである作品が「このビデオは、現在、 お住まいの地域では視聴できません」となっていました。ではアメリカからアクセスしたら利用可能になるのか調べてみました。

今回はAWSのLightsailを使い、リージョンをus-east-1にすることで、バージニア州からのアクセスとすることを目標とします。
サーバーと秘密鍵がスタンバイできたら、以下のコマンドでSSHしましょう。ホスト名（IP）と秘密鍵のパス等は置き換えてください。

`ssh ec2-user@10.87.131.119 -i ~/Downloads/LightsailDefaultKey-us-east-1.pem -D 10000`


もしSSHが失敗し、原因がダウンロードしたての秘密鍵を利用して以下のようなWarningが出たことによるものであったら、
`chmod 600 ~/Downloads/LightsailDefaultKey-us-east-1.pem `
で解消します。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/umihico/Downloads/LightsailDefaultKey-us-east-1.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
```

無事SSHが成功している間に、別のターミナルを開いて以下を実行します。
`networksetup -setsocksfirewallproxy Wi-fi localhost 10000`
このコマンドはMacでWi-Fiを利用中の場合の設定になります。もとに戻したいときは以下のコマンドです。インスタンスの削除も忘れずに。
`networksetup -setsocksfirewallproxystate Wi-fi off`

[ipinfo.io](https://ipinfo.io/)でも無事に変更が確認できました。
しかし、Amazonプライムの該当作品は引き続き同じ文言で視聴できませんでした＼(^o^)／
IP以前にamazon.co.**jp**である時点で弾くのが正しいですよね。多分そうなっているんでしょう。
Rのgtsummaryで集計のデフォルトを平均（標準偏差）にする方法

2020/09/30更新
gtsummaryのバージョンが1.3.5となったため修正

# 質問
Rで手軽にきれいな集計表（医療統計では表１やtable1と呼ばれる）をつくるgtsummaryというパッケージがあります。

ただgtsummaryはデフォルトの集計が中央値（IQR）で、群間比較がWilcoxonの順位和検定やクラスカル・ウォリス検定とノンパラメトリックな手法となっています。

個別に平均（標準偏差）やt検定、分散分析に設定することもできますが、デフォルトにする設定はありますか？

# 解決策
バージョン1.3.4.9008以降で使えるtheme_gtsummary_mean_sd()で一発です。

~~記事執筆時はCRANに登録されていないのでgithubからインストールする必要があります。~~
バージョン1.3.5となりCRANに登録されました。

```
install.packages("gtsummary")
```

ライブラリでgtsummaryを読み込んだ後、'theme_gtsummary_mean_sd()'を使います。

```
library(gtsummary)
theme_gtsummary_mean_sd()
```

あとは`reset_gtsummary_theme()`で設定を戻すまではデフォルトが変わります。

# 詳しくはこちら
[【1-11-2】医療統計で必要なtable1、集計からofficeに貼り付けるまでをgtsummaryパッケージで一気に行う](http://www.restorative-pt.tokyo/archives/gtsummary_table1.html)
HasuraにおけるGraphQLのメモ

# はじめに

[前回](https://qiita.com/TakaoNarikawa/items/38089c61eff71e085182) Heroku + Hasura で GraphQL を使うためのセットアップをしましたが、
色々クエリを試しているとこれってどうやるのっていう部分がいくつかあったので備忘録として残します。

今後もクエリに関して発見があったら追記していく予定です。

サンプルとして使用したデータは次の 2 つのテーブルです。

<img width="800" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588399/72ccd2de-783c-0e42-b9bc-764c75bb6ef3.png">
<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588399/d252aeb1-7ae8-3c63-35cd-87aecfd0fb55.png">

## カウント

`XXX_aggregate.aggregate.count` を使うことで数を調べることができます。

<img width="1000" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588399/d9e7d3a0-20ea-914a-4154-578d521f5a42.png">

## 平均・最小値・最大値・分散などの統計演算

カウントと同様に `XXX_aggregate.aggregate` で用意されています。

<img width="1000" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588399/69cf3e61-201b-e61c-54ea-02ba7128c8a9.png">

## Join

### `employees` -> `salaries`

employees 1 つにたいして 複数の salaries が存在しうるため、`employees` -> `salaries` の Array リレーションを作成します。

![スクリーンショット 2020-09-28 5.52.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588399/df29f633-27a6-0e92-6509-21b49bc14b1d.png)

GraphQL のクエリ画面から employee.salaries が呼び出せるようになっています。
これが `employees` -> `salaries` の JOIN に対応する機能となっています。

<img width="1000" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588399/15b286d8-0ea6-b971-e3c8-7ea8d20b8efa.png">

### `salaries` -> `employees`

salaries 1 つにたいして 1 つの salaries が存在しうるため、`salaries` -> `employees` の Object リレーションを作成します。


![スクリーンショット 2020-09-28 5.52.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588399/88e93703-60aa-d32a-3694-8e9607136f99.png)

GraphQL のクエリ画面から employee.salaries が呼び出せるようになっています。
これが `salaries` -> `employees` の JOIN に対応する機能となっています。

<img width="1000" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588399/f7ac7372-1535-931e-59f2-8868625244e4.png">

# おわりに

GraphQL では JOIN や COUNT などの処理はバックエンド側がリゾルバーというものを作成して機能のひとつとして実装する必要があるみたいです。
ですが、Hasura を使うとコードを書くことなくこれらの機能が使えてしまうので、恐ろしや・・・という感じでした。
MS932 CP943C 変換問題

Shift_JIS の文字を Unicode に変換する際、文字エンコーディング（＝変換テーブル）が異なると問題になることがある。

# Shift_JIS
Shift_JIS では「あ」を「0x82A0」、「い」を「0x82A2」、「う」を「0x82A4」で表すように決められている。
Shift_JIS のテキストファイルで「あいう」と書いて、バイナリエディタで開くと確認できる。

あ 0x82A0 (Shift_JIS)
い 0x82A2 (Shift_JIS)
う 0x02A4 (Shift_JIS)

図．バイナリエディタでShift_JISのテキストファイルを開いたところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/4aa3237f-a948-cbc9-615d-13836b388218.png)



# Shift_JIS -> Unicode 変換 (MS932)

Shift_JIS と Unicode では文字（上の例では「あ」）とコード（上の例では「0x82A0」）の割り当てが異なっているので、変換ルール（文字エンコーディング）が決められている。Windows Java での標準文字エンコーディングである MS932 を使うと、Shift_JIS の「あいう」は以下のように変換される。

あ 0x82A0 (Shift_JIS) -> U+3042 (Unicode) MS932で変換した結果
い 0x82A2 (Shift_JIS) -> U+3044 (Unicode) MS932で変換した結果
う 0x02A4 (Shift_JIS) -> U+3046 (Unicode) MS932で変換した結果

MS932で変換した結果はJava のツールである native2ascii を使っても確認できる。

>native2ascii -encoding MS932 sjis_abc.txt
\u3042\u3044\u3046

日本語文字列で ~~よく~~ 使われる文字エンコーディングには MS932C だけでなく Cp943C というのも存在する。
Cp943C を使って「あいう」をUnicodeに変換しても結果は同じである。

あ 0x82A0 (Shift_JIS) -> U+3042 (Unicode) Cp943Cで変換した結果
い 0x82A2 (Shift_JIS) -> U+3044 (Unicode) Cp943Cで変換した結果
う 0x02A4 (Shift_JIS) -> U+3046 (Unicode) Cp943Cで変換した結果

native2ascii でも以下の通り。

>native2ascii -encoding Cp943C sjis_abc.txt
\u3042\u3044\u3046


ところが一部の文字

－ 0x817C (Shift_JIS)
― 0x815C (Shift_JIS)
～ 0x8160 (Shift_JIS)
∥ 0x8161 (Shift_JIS)
￤ 0xFA55 (Shift_JIS)

などについては、MS932とCP943C のそれぞれでUnicodeに変換されたとき、割り当てられるUnicode 文字が異なってしまう。これはバグではなくエンコーディングの仕様です。
↓
**バグではなく、エンコーディングの仕様**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/8aade7a4-c417-a172-e3fc-21adadacc2c1.png)



表にすると以下のようになる。

| 文字 | Shift_JIS | MS932でのUnicode変換結果 | Cp943CでのUnicode変換結果 |
|:-:|:-:|:-:|:-:|
| － | 0x817C | u+FF0D | u+2212 |
| ― | 0x815C | u+2015 | u+2014 |
| ～ | 0x8160 | u+FF5E | u+301C |
| ∥ | 0x8161 | u+2225 | u+2016 |
| ￤ | 0xFA55 | u+FFE4 | u+00A6 |

「ユニコード名」を表に加えると以下の通り。

| 文字 | Shift_JIS | MS932でのUnicode変換結果 | Cp943CでのUnicode変換結果 |
|:-:|:-:|:-:|:-:|
| － | 0x817C | － u+FF0D (FULLWIDTH HYPHEN-MINUS) | − u+2212 (MINUS SIGN) |
| ― | 0x815C | ― u+2015 (HORIZONTAL BAR) | — u+2014 (EM DASH) |
| ～ | 0x8160 | ～ u+FF5E (FULLWIDTH TILDE) | 〜 u+301C (WAVE DASH) |
| ∥ | 0x8161 | ∥ u+2225 (PARALLEL TO) | ‖ u+2016 (DOUBLE VERTICAL LINE) |
| ￤ | 0xFA55 | ￤ u+FFE4 (FULLWIDTH BROKEN BAR) | ¦ u+00A6 (BROKEN BAR) |

以下は native2ascii での結果。

>native2ascii -encoding MS932 sjis.txt
\uff0d\u2015\uff5e\u2225\uffe4

>native2ascii -encoding Cp943C sjis.txt
\u2212\u2014\u301c\u2016\u00a6


---


以下リンクからの転載記事です。
https://sites.google.com/site/myitmemo/java-kanren/unicode/ms932-vs-cp943c
Vim基本


#ウィンドウ分割
Vim のウィンドウ関連でノーマルモードで利用できるコマンドは、すべて <c-w> から始まる２ストロークのコマンドです。
`:h ctrl-w`からすべてを網羅した一覧を確認することも出来ます。
`:h window`にウィンドウ分割の詳細な説明があります。

|コマンド|動作|備考|
|:--|:--|:--|
|`<c-w>s`<br><b>:sp</b>lit (ファイル名)|ウィンドウの上下分割|split|
|`<c-w>v`<br><b>:vs</b>plit (ファイル名)|ウィンドウの左右分割|vertical split|
|`<c-w>w`<br>|次のウィンドウに移動する|w 二回で手軽に移動|
|`<c-w>c`<br><b>:clo</b>se|現在のウィンドウを閉じる|close|
|`<c-w>o`<br><b>:on</b>ly|現在のウィンドウ以外のウィンドウを閉じる|only|
|<br><b>:qa</b>ll|全てのウィンドウを閉じる|quit all|
|`<c-w>h`<br>|ウィンドウを左に移動|カーソル移動と同じ|
|`<c-w>j`<br>|ウィンドウを下に移動|カーソル移動と同じ|
|`<c-w>k`<br>|ウィンドウを上に移動|カーソル移動と同じ|
|`<c-w>l`<br>|ウィンドウを右に移動|カーソル移動と同じ|
|`<c-w>x`<br>|現在のウィンドウと次のウィンドウを入れ替える|eXchange|
|`<c-w>+`<br>|現在のウィンドウを１文字分高くする|高さ + 1|
|`<c-w>-`<br>|現在のウィンドウを１文字分低くする|高さ - 1|
|`<c-w><`<br>|現在のウィンドウの横幅を１文字分狭くする|幅 <|
|`<c-w>>`<br>|現在のウィンドウの横幅を１文字分広くする|幅 >|
- 引用元：
    - [Vim のウィンドウ分割機能](http://vimblog.hatenablog.com/entry/vim_window)

#クリップボード関連
##コマンドモード時のペースト方法
ヤンクバッファの内容をペーストするのは、<C-R>"

##ペースト時に&lt;S-Insert&gt;と入力されてしまう場合の対処
`Shift`+`Insert`でペーストすると \<S-Insert\> と入力されてしまう。

```vimscript:.vimrc
noremap! <S-Insert> <C-R>+
```

- 引用元：
    - [にわかVimmerがNeovimに乗り換えたら戸惑ったという話](https://arimasou16.com/blog/2018/05/04/00256/)

##ペースト時に自動インデントされてしまう場合の対処
コマンドモードで `:a!`（追加）または `:i!`（挿入）してからペーストすると自動インデントされない。
または
コマンドモードで `:paste!` するとペーストモードがトグルでON/OFFが切り替わる。

- 引用元：
    - [Vimメモ : ペーストするときにインデントされないようにする](https://wonderwall.hatenablog.com/entry/2016/03/20/233018)
    - [ペーストしたらインデントがずれてしまった時の対処法](https://qiita.com/yukofeb/items/1706ce18b5a21031d266)
    - [vimでペーストするときインデントさせない](https://qiita.com/quwa/items/019250dbca167985fe32)
    - [vimでペーストする際に、自動でpaste modeにする方法のメモ](https://qiita.com/ryoff/items/ad34584e41425362453e)

#全角スペースを強調表示する
```vimscript:.vim.rc
autocmd ColorScheme * highlight UnicodeSpaces  ctermbg=131  guibg=#af5f5f
autocmd BufRead,BufNewFile * call matchadd(
      \ 'UnicodeSpaces', '\v' .
      \ '%u180E|%u2028|%u2029|%u00A0|%u2000|%u2001|' .
      \ '%u2002|%u2003|%u2004|%u2005|%u2006|%u2007|' .
      \ '%u2008|%u2009|%u200A|%u202F|%u205F|%u3000'
      \ )
colorscheme desert
```

- 引用元：
 - [vimrcのcolorグループ一覧](http://tech.alters.co.jp/vimrc/vimrc%E3%81%AEcolor%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E4%B8%80%E8%A6%A7/)
 - [（ Vim ）全角スペースを表示、全角スペースを半角スペースに変換、文末の全角スペースを削除する](https://qiita.com/callmekohei/items/765c2fe9fd7fc2834193)

#検索ハイライトを解除する
##直近の検索ハイライトのみ解除する
コマンドモードで `:nohlsearch` で直近の検索ハイライトが解除されます。
※次回の検索実行時からはハイライトされます。

キーマップ設定を行う場合の例：<F3>押下ごとに検索時ハイライトの設定を切り替える

```vimscript:.vim.rc
nnoremap <F3> :noh<CR>
```

##検索時にハイライトをしない設定にする
コマンドモードで `:set nohlsearch` で検索しても一切ハイライトしない設定になります。

キーマップ設定を行う場合の例：<F3>押下ごとに検索時ハイライトの設定を切り替える

```vimscript:.vim.rc
set hlsearch!
nnoremap <F3> :set hlsearch!<CR>
```
Rails6 OmniAuth activestorage ユーザー画像を取得する　追記あり

永遠の初心者による自分のためのメモ。
Rails学習開始３ヶ月。
とりあえずこれで動きました程度に考えていただければ幸いです。
こうした方がええやんと言うご意見がある方は優しいコメント頂けると嬉しいです。
<h1>この記事の目的</h1>

active storageにユーザーのプロフィール画像を保存する。
ググってみてもcarrierwaveばかりでactive storageの記事をあまり見かけなかったので、同じ境遇の人がいればと思い投稿ました。

<h2>環境</h2>
Ruby 2.7.1p83 
Rails 6.0.3.3
<h2>前提条件</h2>
<p>deviseによるログイン機能実装済み。</p>
<p>OmniAuthによるTwitter、google、facebookなどのログイン認証機能実装済み。
</p>
<p>私は、以下の記事を参考にさせて頂きました</p>
・手続き関連
https://qiita.com/kazuooooo/items/47e7d426cbb33355590e
・OmniAuth導入
https://qiita.com/LuckHackMahiro/items/9dfca6e67777a2161240

<h2>参考</h2>
・active storageに画像URLを保存する方法
https://qiita.com/gomasio1010/items/09c6ee58ed4c95f109ff

とても助かりました！ありがとうございます。

<h2>active storageに画像urlを保存する</h2>
機能実装できている前提で、



```user.rb

require "open-uri"  #ここ
class User < ApplicationRecord

  #省略

  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.password = Devise.friendly_token[0, 20]
      user.email = auth.info.email    
      user.email = User.dummy_email(auth) if user.provider == "twitter" 
      avatar = open("#{auth.info.image}")　#ここ
      user.image.attach(io: avatar, filename: "user_avatar.jpg")　#ここ
    end
  end

　#省略

end
```


記事を参考に画像を取得する事ができました。
active storageでの記事はあまり見かけなかったので、とても助かりました。

画像が小さくて、荒くなるとの噂でしたので、サイズが大きくなりそうな感じにしてみました。
色々見ているとモデル側で指定している方もいらっしゃいました。

config/initializers/devise.rb

```devise.rb

  config.omniauth :facebook, ENV['FACEBOOK_ID'], ENV['FACEBOOK_SECRET_KEY'], :image_size => 'large'#これ
  config.omniauth :google_oauth2, ENV['GOOGLE_CLIENT_ID'], ENV['GOOGLE_CLIENT_SECRET']
  config.omniauth :twitter, ENV['TWITTER_API_KEY'], ENV['TWITTER_API_SECRET_KEY'], callback_url: "http://localhost:3000/users/auth/twitter/callback", :image_size => 'original'#これ
```
ログイン認証関連の実装は、時間帯によってうまくいかなかったり、ブラウザにcookieが残っていると正しく動かない時がありましたので気長にやると良さそうです。

<h2>その後、、、。</h2>
RSpecで警告がでてたので、

```
warning: calling URI.open via Kernel#open is deprecated, call URI.open directly or use URI#open

#google翻訳
# 警告：Kernel＃openを介したURI.openの呼び出しは非推奨です。URI.openを直接呼び出すか、URI＃openを使用してください。
```
下記のように修正。

```user.rb
  # require "open-uri" を消す
  def self.first_or_create_from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.password = Devise.friendly_token[0, 20]
      user.email = auth.info.email
      user.email = User.dummy_email(auth) if user.provider == "twitter"
      url = URI.parse("#{auth.info.image}")  #imageのURL
      avatar = url.open  #警告に従う
      user.image.attach(io: avatar, filename: "user_avatar.jpg")
    end
  end
```



こちらの質問がドンピシャでした！ありがとうございます！
<a href="https://stackoverflow.com/questions/51027995/how-to-save-an-image-from-a-url-with-rails-active-storage">Railsアクティブストレージを使用してURLから画像を保存するにはどうすればよいですか？</a>

テストも無事に通ったので、一件落着。。。
ColabでKaggleAPIを使うまで

# はじめに

なんだかいろんな記事がありましたが，
この方法がうまくいったので備忘録がてら誰かの役に立てばと思います．

## 誰向け？

Colabは触ったことあるけど，Kaggleにまだ馴染みのない人（わたし）とかです．

## 手順
- KaggleのAPIキー取得
- Colabにアップロード
- Colabでコマンド実行

## KaggleのAPIキー取得

1. Kaggleに登録：Googleアカウントで登録できます
2. My Accountに移動：右上のアイコンタップするとモーダルメニューでます
3. APIキーの作成：My Accountのページ下部に「API」というセルがあり「Create New API Token」というボタンがあるのでクリック→kaggle.jsonがダウンロードされる

## Colabにアップロード

1. 適当にColabファイルを開きます
2. 左のペインのファイルをアップロードかドラッグアンドドロップでkaggle.jsonをアップロードします
3. 左側のペイン内にkaggle.jsonと表示される（はずです）

## Colabでコマンド実行
 
次のコマンドを実行します．

```
!mkdir ~/.kaggle
!cp /content/kaggle.json ~/.kaggle/kaggle.json
!chmod 600 ~/.kaggle/kaggle.json
```

下記，ファイルが移動できたか確認するコマンドです．
これを打って```kaggle.json```が出てくればほぼ勝ちです．

```
!ls ~/.kaggle
```

下記，有効になっているか確認するためのコマンドです．
これを打って何かいろいろファイルのリストが出てくれば勝ちです．

```
!kaggle competitions list
```


# おわりに

[よく紹介されているこの方法](https://colab.research.google.com/drive/1eufc8aNCdjHbrBhuy7M7X6BGyzAyRbrF#scrollTo=y5_288BYp6H1&forceEdit=true&offline=true&sandboxMode=true)は，あくまでGoogleDriveのどこにkaggle.jsonをアップしても大丈夫なように色々探しますよ的なコード（のように感じた）ので「ちゃんとアップする場所を心の中で指定すればいいのでは」ということで，自分はここで書いた形を採用することにしました．

勢いに任せてざっくり書いたので何かあればご指摘ください！
Rails6 OmniAuth twitter認証 emailの条件分岐

永遠の初心者による自分のためのメモ。
Rails学習開始３ヶ月。
とりあえずこれで動きました程度に考えていただければ幸いです。
こうした方がええやんと言うご意見がある方は優しいコメント頂けると嬉しいです。
<h1>この記事の目的</h1>

twitter認証はメールアドレスを取得しないので、ランダムメールアドレスを生成する。
google、facebook認証は、正規のメールアドレスを取得する。
twitterはランダムアドレス。他は、正規のアドレスで条件分岐させる。

<h2>環境</h2>
Ruby 2.7.1p83 
Rails 6.0.3.3
<h2>前提条件</h2>
<p>deviseによるログイン機能実装済み。</p>
<p>OmniAuthによるTwitter、google、facebookなどのログイン認証機能実装済み。
</p>
<p>私は、以下の記事を参考にさせて頂きました</p>
・手続き関連
https://qiita.com/kazuooooo/items/47e7d426cbb33355590e
・OmniAuth導入
https://qiita.com/LuckHackMahiro/items/9dfca6e67777a2161240



<h2>条件分岐 ： TwitterかTwitter以外</h2>
機能実装できている前提で、



```user.rb

  def self.first_or_create_from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.name = auth.info.name
      user.password = Devise.friendly_token[0, 20]
      user.email = auth.info.email
      user.email = User.dummy_email(auth) if user.provider == "twitter"#ここ
      url = URI.parse("#{auth.info.image}") 
      avatar = url.open 
      user.image.attach(io: avatar, filename: "user_avatar.jpg")
    end
  end
```

としたら、twitterではランダムアドレス。
google、facebookでは正規のアドレスが取得する事ができました。

条件分岐がうまくいって嬉しかったです。
[Android] Realtime Databaseを使ってみる

[前回](https://qiita.com/karass/items/052b7cc038b517169ded)はFirebase Authenticationを触りましたが、今回はRealtime Databaseを使ってみたい思います。

# Firebase設定
Realtime Databeseを使用するには、Databaseルールというものを記述しなければならない。

```json
{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}
```
上記のルールは、あらゆるユーザーが`/foo/`以下の読み取りを許可するというものになります。`/foo/`以下というのは、

```json
{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false,
      "hoo": {
        ".read": false,
        ".write": false
      }
    }
  }
}
```

この場合、`/hoo/`の読み取りを許可しない設定にしていても、権限はデータベース内の浅いパスの方が優先されるため、`/hoo/`以下の読み取りが可能になります。

[前回](https://qiita.com/karass/items/052b7cc038b517169ded)、Authenticationの設定をしてのでユーザごとにアクセス制御ができるみたいです。実際に設定したルールは以下です。

```json
{
  "rules": {
    "foo": {
      "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}
```

ログインしたユーザーだけが自分だけのデータを閲覧できるルールを記述しました。

# 実装
## Gradle
```gradle
implementation 'com.google.firebase:firebase-database-ktx:19.4.0'
```
## 書き込み
データの読み書きを行うには、`DatabaseReference`インスタンスを使用します。

```kotlin
class LogoutActivity : AppCompatActivity() {

    private lateinit var auth: FirebaseAuth
    private lateinit var database: DatabaseReference

    override fun onCreate(savedInstanceState: Bundle?) {
        // ...
        auth = Firebase.auth
        // インスタンス生成
        databaseRef = Firebase.database.reference
        // (ログインしていれば）データ追加
        // root/foo/auth.uid/
        button.setOnClickListener {
            auth.uid?.let {
                database.child("foo").child(it).setValue(User("hoge", "12"))
            }
        }
        // ...
    }
```

`setValue()`で、データを追加したいパスにデータを追加します。今回は、`/foo/auth.uid/`にユーザー情報（name, age)を追加してみました。パスの指定は`.child()`で指定します。（他の方法知りません）

Firebaseコンソールで確認
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289190/70d468d5-2c79-0b3d-f43d-7203b6d51741.png  width=200>

## 読み取り
データ読み取りを行うには、作成した`database.reference`に`ValueEventListener`を追加する必要があります。[公式](https://firebase.google.com/docs/database/android/start?authuser=0#read_from_your_database)から抜粋

```kotlin
        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                // Get Post object and use the values to update the UI
                val post = dataSnapshot.value
                Log.d("TAG", post.toString())
                // ...
            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
                // ...
            }
        }
        // ...
        database.child("foo").child(auth.uid!!).addValueEventListener(postListener)
        // ...

```

`onDataChage()`メソッドはリスナーがアタッチされた時に1回トリガーされ、データが変更されるたびにトリガーされます。読み取りができない場合（権限がないなど）は、`onCancelled()`が呼び出される。