OmniAICreator/Qiita-1.07M huggingface dataset:
VScodeでGoをいい感じに設定する


## Golangのインストール

[【Go】MacにGoをインストールする](https://qiita.com/tktktktk/items/7f284132ab4b080526b8)

まずは上記から、golangをインストールします。


## VScodeの設定
VScodeをインストール
[MacOSでVisual Studio Codeをインストールする手順](https://qiita.com/watamura/items/51c70fbb848e5f956fd6)


VScodeを開きます。
左側のタブの一番下、プラグインタブの検索窓に「go」と打ち”Go”をインストール
<img width="1552" alt="スクリーンショット 2019-11-26 18.12.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436904/3acd4a14-6da0-44ee-d742-8b8663672848.png">



Command+Shift+Pでコマンドパレットを表示。
`>Go:Install/Update Tools`と打って出てくるツール群を最新にします。
入力の左側のセレクターで全て選択肢、OKで自動インストールが始まります。
<img width="1552" alt="スクリーンショット 2019-11-26 18.16.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436904/b0cef5fb-1dfa-3112-de3e-965b86dfbab4.png">


インストールが終わったら、`Command + , `で設定を開きます。

'setting.json'に以下の設定を追加します。

```:setting.json
settings.json
{
    "go.toolsEnvVars": {"GO111MODULE": "on"},
}
```

## まとめ
VScodeでGoを書いていたら、パッケージが見つからないとと出たので、備忘録として書きました。

## Happy Hacking :sunglasses: !
【最速メモシリーズ】Vagrantで仮想環境をサクッと作る！

## 前置き
とりあえず早く仮想環境を準備したい！という方に。細かい説明は入れてません。
解説は後々に記載したいと思います。

## 前提条件
* ホストはWindows10（未検証ですがおそらくMacもできます）
* Vagrant 2.2.6
* VirtualBox 6.0.14
* 仮想環境のOSはCentOS7を導入するとします
* ターミナルはGitBash使いました（Windowsの方はコマンドプロンプトやPowershellでも大丈夫です、macはターミナルで）

## 方法
### 下準備
#### １．pluginを更新
```
vagrant plugin update
```
#### ２．hostsupdaterを入れる
```
vagrant plugin install vagrant-hostsupdater
```

#### ３．適当にディレクトリを準備してVagrantfileを生成
```
vagrant init --minimal centos/7
```

#### ４．Vagrantfileを下記に修正
```
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.provider "virtualbox" do |v|
   v.customize ["modifyvm", :id, "--ostype", "RedHat_64"]
  end
end
```

#### ５．vagrantを立ち上げる
```
vagrant up
```

#### ６．sshでゲストOSへ
```
vagrant ssh
```

これでひとまずは仮想環境の準備はできる（汗）
【Salesforce】項目の表示ラベルを一括で取得する

今回はApexで項目の表示ラベルを汎用的に一括で取得する方法をご紹介します。

#よく見かける項目の表示ラベル取得の方法

```java:example
String accNameLabel = Schema.SObjectType.Account.fields.Name.label;
```
この書き方でも問題なく取得することはできますが、
例えばLightningComponent等で作成したTableのcolumnが10列以上ある場合...

```java:example
String accNameLabel = Schema.SObjectType.Account.fields.Name.label;
String accPhoneLabel = Schema.SObjectType.Account.fields.Phone.label;
String accFaxLabel = Schema.SObjectType.Account.fields.Fax.label;
String accCustomLabel = Schema.SObjectType.Account.fields.CustomField__c.label;
etc...
```
上記のように同じようなコードを何回も記述する必要があります...

#サンプルコード
まず、上記で紹介した書き方のようにオブジェクトタイプを書かずに汎用的に使えるメソッドにしたいと考えました。また、"Key:API名,Value:表示ラベル"のようなMapがあれば使いやすいだろうとと思い、作成したのが下記のコードになります。

```java:example
public static Map<String,String> getFieldLabelMap(String sObjectName){
    Map<String,String> fieldLabelMap = new Map<String,String>();

    for(Schema.SObjectField field : Schema.getGlobalDescribe().get(sObjectName).getDescribe().fields.getMap().values()){
        fieldLabelMap.put(field.getDescribe().getName(), field.getDescribe().getLabel());
    }

    return fieldLabelMap;
}
```
上記のメソッドを一つ用意しておけば標準オブジェクトでもカスタムオブジェクトでも問題なく取得することができます。

####ちょっとしたデメリット
項目を指定せず一括で取得しているため、項目の削除やAPI名の変更時などにSalesforceがチェックするApex使用箇所には該当しません。(動的SOQLの利用でも同じことが言えますね)
あたりまえですが、項目の削除やAPI名の変更等を行うときはきちんと影響調査してから行いましょう。

#おまけ SOQLでの"SELECT * "としての利用法
上記コードを少し書き換えるだけで、"SELECT * "の動きも実現することができます。

```java:example
public static List<sObject> getAllFieldRecords(String sObjectName){
    List<String> fieldNameList = new List<String>();

    for(Schema.SObjectField field : Schema.getGlobalDescribe().get(sObjectName).getDescribe().fields.getMap().values()){
        fieldNameList.add(field.getDescribe().getName());
    }
    String fieldQuery = String.join(fieldNameList, ',');
    List<sObject> sObjects = Database.query('SELECT ' + fieldQuery + ' FROM ' + sObjectName);

    return sObjects;
}
```

カスタム項目のみを取得したい場合、リスト格納前に下記のifを書きます。

```java:example
if(field.getDescribe().getName().endsWith('__c')){

}
```
９午後


レイルズの基礎に戻ってみると
自分が理解していなかった部分がわかったのでよかった。

本当にプログラミングは
点を勉強していて、ある時急にそれが繋がるのが
楽しいし、そこでぐんと成長する実感が得られる。

頑張っていこーーーー
MySQLで照合順序の確認と変更


# データベース単位
```
SELECT @@character_set_database, @@collation_database;
ALTER DATABASE COLLATE 'utf8_general_ci'
```

# テーブル単位
```
show table status from データベース名;
ALTER TABLE テーブル名 COLLATE 'utf8_general_ci';
```


# カラム単位
```
use information_schema;
select table_name, column_name, collation_name from columns  where table_schema="データベース名" and collation_name is not null

use データベース名
ALTER TABLE テーブル名 MODIFY COLUMN カラム名 varchar (255) COLLATE 'utf8_general_ci';
```
Salesforce 数式 うるう年のロジック　

#**SFDCの数式：うるう年の計算ロジック**

#####【使用方法】ある日付を基準に、n年後の日付を自動算出する時に使用。
ex) 契約開始日(`ContractDate`)を入力したら、自動的にn年後(`addYear`)の契約更新日を算出する。
うるう年の2月29日が入力されたとき、n年後が平年である場合は3月1日を算出する。


| 変数 | データ型|内容 |
|:-----------------|:------------------|:------------------|
| `ContractDate`             |             日付型 |        基準日の項目       |
| `addYear  `         |            数値型 |       基準日からプラスする年数      |


```
IF(
  AND(
    MONTH(ContractDate) = 2,
    DAY(ContractDate) = 29,
    OR( 
      MOD( YEAR(ContractDate), 400 ) = 0, 
      AND( 
        MOD( YEAR(ContractDate), 4 ) = 0,
        MOD( YEAR(ContractDate), 100 ) != 0
      )
    )
  ),
  DATE( YEAR(ContractDate) + addYear,3,1),
  DATE( YEAR(ContractDate) + addYear, MONTH(ContractDate), DAY(ContractDate))
)
```

#####【memo】

うるう年のルール
①.　4の倍数になる年＝うるう年
②.　100の倍数になる年で400で割り切れない年＝**うるう年でない**

つまり、
「400で割り切れる年」
または
「4で割り切れる年　かつ　100で割り切れない年」
は、うるう年になります。
<br>

うるう年を考慮せず、日付算出ロジック
`DATE( YEAR(ContractDate) + addYear, MONTH(ContractDate), DAY(ContractDate)`
だけを数式に書くと、
入力した日付がうるう年であり、算出した日付がうるう年でない場合、存在しない日付となり、
「数式なのに日付が出力されない！」となりますのでご注意。(⌒∇⌒)


<br>
以上

<br>
追記：
更新日とかって大体、契約日-1　なんですよね。。
その場合はIF文の分岐結果部分を以下のように書き換えるだけ。

```
  DATE( YEAR(ContractDate) + addYear,3,1) -1,
  DATE( YEAR(ContractDate) + addYear, MONTH(ContractDate), DAY(ContractDate)) -1
```
CentOS8インストール用ディスク作成

会社に要らないパソコンがあったので、サーバー構築勉強の為にCentOS8インストールし、サーバー用のパソコンとして利用することに。

インストールディスクからCentOS8インストールは、下記の記事をどうぞ！！
https://qiita.com/kerry/items/31964382c87ae65ab046

## 用意するもの
空のDVD-R(容量:8.5GB)
CentOS8の.isoファイル
ライティングソフト(InfraRecorderを使用)

## CentOS8のISOファイルのダウンロード
まずは下記のダウンロードページからディスクに焼くISOファイルをダウンロードします！
https://www.centos.org/download/
![OS8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274686/35292a76-1dde-11a8-6034-e587adbc1724.png)


CetOS Linux DVD ISO をクリックすると下記のISOファイルがウンロードされる。
CentOS-8-x86_64-1905-dvd1.iso　（ファイルサイズは7.14G）

## ディスク作成失敗（何故？？失望）
会社のPCにはDVDドライブがついてないので自宅のWindowsで右クリックからファイルをディスクに焼いて会社に持参。
でもサーバー用のパソコンにセットしてもなんの反応も無くて上手くいかなかった（何故？？？）
ぐぐったらフリーのライティングソフトを使用したら上手く行ったとことだった（良し、やってみよう！）

## ライティングソフトを利用
下記のリンクから"InfraRecorder"というソフトをダウンロードして利用
https://forest.watch.impress.co.jp/library/software/infrarecord/
"IfraRecorder"というソフトを開くと下記が表示される
![soft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274686/8d7fd63c-a1cb-14ac-379c-33588f7a6929.png)

上記の画面で"Write Image"と書かれた左下のイメージをクリックすると下記の画面が表示される。
![File.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274686/cb1fa3c8-6e54-9df1-b429-3a918dd56352.png)

ファイル名には、ダウンロードした.isoファイル(CentOS-8-x86_64-1905-dvd1.iso)を選択し
ファイルの種類が"Disc Images(*.iso,*.cue,*.img)"になっていることを確認して開くを押す。
書き込み用のディスクドライブに空のDVDディスクを入れてOKを押すと書き込みが開始される。

## インストールディスク確認
サーバー用のパソコンでBIOSの設定後、無事CentOS8のインストール画面が起動された！！
これで次のインストールに進めそう〜〜

## 参考サイト
http://souma-ism.xyz/archives/90
実機iPhoneのSafariでWebインスペクタを使ってデバッグする方法

# 要望
実機のiPhoneで特定のWebページに対し、Webインスペクタで中身を書き換えたり、コンソール経由でスクリプトを叩いて実行した結果を見たい。

-> [Android版](https://qiita.com/unsoluble_sugar/items/981adda77b731d5d94ab)

# iPhoneのSafariにもWebインスペクタがある
iPhone単体では[View Source](https://apps.apple.com/jp/app/view-source/id1041817284)などのアプリを使うことで、Webページのソース確認はできるものの、Webインスペクタやコンソールによるスクリプト実行が出来ない。

<img width="234" alt="スクリーンショット 2019-11-26 16.23.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/ef1987f0-4d4c-9a6a-2725-b826052b2cef.png">

また、MacのSafariやiOSエミュレーターでもある程度の表示確認はできるが、やはり実機での操作感や見た目の確認は重要である。

<img width="420" alt="スクリーンショット 2019-11-26 16.25.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/38b20a0c-fda2-2bd2-98b2-d3c728b0d24a.png">


少し調べてみたところ、MacとiPhoneを接続することで、PCと同様に実機での動作確認が可能なことが判明したため、実際に試してみた。

## iPhone Safariの設定
事前準備としてiPhone側の設定を行う。「設定」-「アプリ」から「Safari」をタップ。

![2025-02-17 21.23.36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/3a6a8b42-648c-440d-bffb-bfe42acd0d8b.jpeg)


画面一番下の「詳細」をタップ。

![2025-02-17 21.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/81549e92-5a75-4389-8c61-9081ccfccb71.png)

「Webインスペクタ」をONにする。

![2025-02-17 21.24.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/e02629c6-b154-4c18-8fb1-cfbbe2f05ba6.png)

iPhone側の設定はこれで完了。

## Mac Safariの設定
Safariの「設定」を開き、「詳細」タブの「Webデベロッパ用の機能を表示」にチェックを入れる。

![スクリーンショット 2025-02-17 21.26.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/8a14ee35-dfb1-4bc5-bd3f-8ff3876df3b9.png)

MacとiPhoneをケーブル接続。Safariのメニュー「開発」から、接続したiPhoneを選択し、開発に使用をクリック。対象サイトを選択。

![スクリーンショット 2025-02-17 21.27.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/a306a5b5-8825-48a3-a15c-a3ee6a942e0e.png)

うまくいけばMac上でWebインスペクタが開く。

![スクリーンショット 2025-02-17 21.32.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/e2294a46-82ee-452a-88a2-e98ad572f805.png)

通常と同じ操作感で要素検証や書き換えが可能。

![2025-02-17 21.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/2f9d817a-0680-42db-b225-9ce97a1f0088.png)

もちろんコンソールも使えるので、スクリプトを叩いて実行することもできる。

![スクリーンショット 2025-02-17 21.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/b77821be-e069-4ab7-9822-1e29be9782fd.png)

いえーい


![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_6380_0c8a22ea-818a-858e-970b-5472d5bfaa97.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/66eb9b00-349e-4c4a-afa8-d875e4c5f78d.png)
Macに接続したiPhoneが認識されないことがあるけど、ケーブル抜き差ししてると出てくる。
実機Android端末のChromeでデベロッパーツールを使ってデバッグする方法

# 要望
実機のAndroid端末で特定のWebページに対し、Webインスペクタで中身を書き換えたり、コンソール経由でスクリプトを叩いて実行した結果を見たい。

-> [iPhone版](https://qiita.com/unsoluble_sugar/items/2a3d06631a6b8259dc44)

# Android 端末のリモート デバッグを行う
MacのChromeやAndroidエミュレーターでもある程度の表示確認はできるが、やはり実機での操作感や見た目の確認は重要である。

<img width="429" alt="スクリーンショット 2019-11-26 16.46.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/9ece7941-d12f-be58-402f-6b2cb8ec540c.png">

少し調べてみたところ、MacとAndroid端末を接続することで、PCと同様に実機での動作確認が可能なことが判明したため、実際に試してみた。

[Android 端末のリモート デバッグを行う | Tools for Web Developers](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/?hl=ja)

## Developer ToolsのRemote devicesを使う

MacとAndroid端末をケーブル接続。Chromeのデベロッパーツールを開き、[Main Menu] > [More tools] > [Remote devices] を選択。
<img width="530" alt="スクリーンショット 2019-11-26 16.36.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/6e2dbf58-9af0-6235-6e9d-6ee3c4434e0e.png">

[Remote Device] タブの [Settings] で [Discover USB devices] のチェックボックスがオンになっていることを確認。

<img width="530" alt="スクリーンショット 2019-11-26 16.38.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/31fa48ad-8231-301f-4cc4-745742751738.png">

[Devices] から対象のAndroid端末を選択。
<img width="111" alt="スクリーンショット 2019-11-26 16.38.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/fc7ee6ce-7b02-203a-8417-932fc2af8663.png">

[New tab] テキストボックスで、URL を入力して [Open] ボタンをクリック。
<img width="375" alt="スクリーンショット 2019-11-26 16.39.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/9fffbd6a-5479-4b9b-3615-8cc63acd1675.png">

Android端末のChromeで対象ページが開くので [Inspect] をクリックすると、デベロッパーツールが立ち上がる。
<img width="848" alt="スクリーンショット 2019-11-26 16.39.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/540eb8d0-4177-00e7-ca74-6d18e7c161a2.png">
スクリーンキャストで実機Android端末と同期。要素検証や書き換えもでき、コンソールでスクリプト叩いて実行することも可能。


便利。
分類モデルの評価指標について

#分類モデル
分類モデルとは, 入力がどのクラスに属するのかを予測するためのモデルです. 
<img width="400" alt="図1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/4896c871-d399-d559-cdb8-a3a7fbca6c12.png">

#混同行列
分類モデルの評価でよく用いられるのが**混同行列**です. 
混同行列の例を以下に示しておきます. 
例では, クラスAのデータが500個, クラスBのデータが500個, 合計1000個の検証用データがあるものとします. 
その検証用データに対して, 分類モデルによるクラス予測を行った結果についてまとめたものが混同行列になります. 
<img width="400" alt="混同行列.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/ca6a8794-a461-3d73-e9a2-2cc3032c7eb5.png">

もし, 分類モデルの精度が100%だったとしたら混同モデルは以下のようになります. 
<img width="400" alt="100%.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/81154947-e9b0-b8dc-dfe1-11724f86f7dc.png">

もう少し一般化して表現すると以下のようになります. 
TA:モデルは**クラスA**と予測し, **正解(True)**である
FA:モデルは**クラスB**と予測し, **不正解(False)**である
TB:モデルは**クラスB**と予測し, **正解(True)**である
FB:モデルは**クラスB**と予測し, **不正解(False)**である
<img width="400" alt="generalization.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/5f4503da-94c0-70ba-cb97-270f75836a8a.png">

#評価指標
それでは分類モデルの評価指標についていくつかまとめていきます. 

##精度
精度は, データを正しく予測できた割合を示します. 
<img width="200" alt="精度.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/858ebc4d-d253-3e69-6a14-f94ad5cd1b6c.png">
精度はよく使う評価指標だと思いますが, クラスごとのデータ数に大きな差があるとあまり機能しません. 

上手く機能しない例としては, 以下のような場合です. 
<img width="400" alt="精度_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/72f41990-6e02-62ee-1f6f-042b9c0fbdcb.png">
クラスAのデータが極端に多すぎるので, 全てのデータに対してクラスAと予測すれば精度99%を達成してしまいます. 
正しくラベル予測をして99%を達成した場合といい加減にラベル予測をして99%を達成した場合を見分けることができないのが問題ですね. 

均衡なデータセットであれば, 精度を用いるのに問題はないと思います. 

##適合率
適合率は, クラスAと予測したものの中で, 実際に正しく予測できた割合を示します. 
間違ってクラスAと予測するのを防ぎたい場合に使います. 
<img width="200" alt="適合率.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/9481ccf9-b42f-bc7b-d3da-aae6905382b4.png">
例をあげるなら, 商品の出荷において良品(=A)と悪品(=B)を分類する場合, 悪品(=B)を間違って良品(=A)と予測することを避けたいですよね. そういった場合に有効です. 

##再現度
再現度は, 実際のクラスAのデータのうち, 正しくクラスAと予測された割合を示します. 
間違ってクラスBと予測するのを防ぎたい場合に使います. 
<img width="200" alt="再現度fig.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/d01423f0-fa3f-f377-e5ea-59d0131c4545.png">

例をあげるなら, 健康診断で陰性(=A)と陽性(=B)を判断する場合, 本当は陰性(=A)なのに陽性(=B)と診断されてしまうと大問題になります. 健康診断では陰性の疑いがある人をすべて見つける必要があります. 間違って陰性と診断されたなら再診断をすれば済むのでまだ大丈夫ですが...

##F値
F値は適合度と再現率の調和平均です. 
適合度と再現率はトレードオフの関係にあります. しかし, 片方だけではモデルを全体的に評価することができません. 
そこで, F値はその2つをまとめた指標になります. 
<img width="200" alt="再現度.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319132/1e6e7f7f-9e1e-e016-f601-a8a611355b14.png">

F値は適合率と再現度の両方を取り込んでいるため, 偏ったデータに対しては精度よりも有効な評価指標になりうるみたいです.
AppStoreやAppleDeveloperProgramまわりの忘れがちなこと

## 対象
iOS開発に慣れて来た頃に、証明書の更新などたまにしかやらない故に忘れがちなことをまとめていきます。
一度は、`証明書は完全に理解した！`と思った方向けです。

仕様が頻繁に変わるので各項目ごとに最終確認日を掲載しています。

Apple Developer Programの場合です。Apple Enterprise Developer Programでは違う箇所があるのでご注意下さい。



## iOS Distributionの期限が切れたときの心配事
確認日2019/05/07

 - Adhoc/Productionでのビルドができなくなる
 - ストア公開中のアプリには影響ない
 - Adhoc配信したアプリは起動できなくなる
 - Push通知は届く



## 証明書って何個まで作れる？
確認日2019/05/07

上限まで作成すると以下の文言が表示されます
(Maximum number of certificates generated)

- Entity Typeが「Individual」 (個人または個人事業主／個人経営者)の場合

 - iOS Distribution：2
 - iOS Development：3

- Entity Typeが「Company / Organization」(組織) の場合

 - iOS Distribution：3
 - iOS Development：6

- Entity Typeが「In-House / Enterprise」の場合

 - iOS Distribution：未確認
 - iOS Development：未確認だが100くらいいけそう (情報求む)


## Apple Developer Programの有効期限は？
確認日2019/06/04

- iOS Developer University Program
 - 有効期限なし

## 証明書の有効期限は？ 
確認日2019/06/04

- Entity Typeが「Individual」 (個人または個人事業主／個人経営者)の場合

 - iOS Distribution：2
 - iOS Development：3

- Entity Typeが「Company / Organization」(組織) の場合

 - iOS Distribution：3
 - iOS Development：6

- Entity Typeが「In-House / Enterprise」の場合

 - iOS Distribution：未確認
 - iOS Development：未確認だが100くらいいけそう (情報求む)




## Push通知が届かない期間は？

- Push通知証明書を別途作成してAppIDに設定 〜 外部サービスに登録、までは届かなくなる？
 - Development / Production共に2つずつPush通知証明書を設定可能なのでスキマはない

- AppIDsにはPush証明書Production/Development2つずつ割り当て可能
 - とはいえ、Push通知の外部サービスに証明書を登録するので同時に使える証明書は1つ



## Provisioning Profile

Provisioning Profileはアプリ内包なので、インストール済アプリには変更が効かない
ただ、基本、Distribution/Development証明書より1ヶ月期限が長いはず


## おわり

変更や間違っている箇所があればコメントお願いします！
年1の作業とか毎年忘れますね。
Django基本

# 作業ディレクトリを作成
```bash
$ mkdir mysite
```

# 仮想環境を構築
```bash
$ cd mysite
$ python3 -m venv venv
```

# 仮想環境を有効化
```bash
$ venv/bin/activate
```

# djangoのインストール
```bash
(venv)$ pip install django
```

# プロジェクト作成
```bash
(venv)$ django-admin startproject config .
```

# サーバを起動して動作確認
```bash
(venv)$ python manage.py runserver
```

ブラウザで`127.0.0.1:8000`へアクセス
ZEIT NowでNode.jsのバージョン指定をする

## NowへのデプロイでNodeのバージョンに起因するエラーが起きた
```
Error: @grpc/grpc-js only works on Node ^8.13.0 || >=10.10.0
```
上記のエラーが起きて困った。

## :bomb: 原因
要するに8.13.0 から 10.10.0 の間のバージョンじゃないと動かないよということだと思う。

## :star: 解決策
じゃあNodeのバージョンをこっちで指定してあげようということになる。  

英語の情報しか出てこないが漁っていると、「now.json」で「engine」という項目を指定するみたいな情報が出てくるがこれが罠である。

***ZEIT NowのNode.jsバージョン指定は「now.json」ではなく「package.json」で指定する***

```package.json
"engines": {
  "node": "10.x"
}
```

これでOK。

ただし、バージョンは何でもかんでも指定出来る訳ではなく提供されているものだけ。
[UE4]カメラ設定交換を楽にする。

開発とデバッグの作業で、カメラをいじるだけでいろんな情報を取得することが出来ます。
そういう作業をもっと楽するためには、

「ALT + G」で透視投影に設定、
![2019-11-26_17h45_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/d87f89ba-b8ee-c129-3495-ab7fc59b96cd.png)
「ALT + K」で横からに設定、
![2019-11-26_17h46_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/5d7eceb0-4cb3-877d-5daa-d2d35840c218.png)
「ALT + H」で上からに設定、
![2019-11-26_17h48_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/d0ffd596-4864-c969-a02f-7e5c7b1e9863.png)
「ALT + J」で前からに設定することができます。
![2019-11-26_17h49_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/1d4ee6ba-f9cd-d1d0-0896-8ad6e387114b.png)
オフラインでパッケージをインストールする

##オフラインでインストールするには？
###yumコマンドの利用
Linuxにてインストールする際、利用するコマンドはyumです。
yumと聞くとオンラインでのインストールをイメージするかもしれませんが、オフラインでもインストール出来ます。

```
# mount -t iso9660 /dev/cdrom /media
```


```
[定型文]
# yum --disablerepo=* --enablerepo=local_dvd install <インストールしたいもの> 
```

##引用

CentOSオフライン環境でパッケージグループのyumインストール
>https://densan-hoshigumi.com/server/centos-offlineinstall-package#DVDyum
Power Automate（旧:Microsoft Flow）を使ったTeamsへの通知をBot化する

#困っていたこと
以前にまとめた
[Power Automate（旧:Microsoft Flow）を使ってカウントダウンタイマーを作ってTeamsに通知する](https://qiita.com/yukimatsu/items/b2e2b67a625fdfbcc347)のやり方。

実は不満があって、自分のアカウントでカウントダウンされるので、
なんか **自分が納期にうるさい人みたいに見えて、** 
さらに、専用チャンネルでカウントダウンするので自分の顔ばっかり（あんまり気分良くない）。。。
![007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/f9b7bd19-96bf-4f89-708c-a8fe212cde03.jpeg)

#良い方法を発見
こっちを使えば良かったらしい。
![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/7ad74f7e-ebb3-baf9-a8f3-5403e8bd5227.jpeg)

ちなみに、前の記事で使ってたやつ
![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/6dd4aec3-fbac-1814-564b-48afb59010bb.jpeg)

#改善後
![006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/54ebe3ff-2e01-f28d-a1fd-6a6893fa567f.jpeg)
こんな感じでFlowが呟いているように見えるので、
これで **言いにくいことも通知しやすく** なりました。
人間は感情的な生き物なので、
納期のカウントダウンのようなものは機械に言ってもらうってのはホント大切だと思う。

#参考
HTMLで記述できるので、こんな感じで記述してあげると、表現の幅も広がるよ！
![005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/505c3304-1ab5-de59-a914-b284cdda5df6.jpeg)

あとは、
[FlowからMicrosoft TeamsへBotで投稿する方法3種をまとめてみた](https://qiita.com/tfunakoshi/items/76029bcc8ac1d4d9bd71) 
の記事が良く纏まってるので参考になります（もっと早く気が付けば良かった）。
MaterializeのParallaxとかsidenavをRailsで使うときの注意点

# はじめに
RailsでMaterializeのParallaxとかsidenavとかとか使おうと
意気揚々とgem入れてサンプルコードをコピペして動かなかった人へ。
私も同じことをしたので、これ読んで速攻解決して次に進みましょう！
一応、jQueryを使います。

# Railsで使うには初期化が必要
javascriptファイル作って中身をコピペしましょう。
私はわかりやすく「materialize-jquery.js」としました。

```javascript:materialize-jquery.js

$(document).on('turbolinks:load', function () {
  // 各項目を初期化
  $('.sidenav').sidenav();
  $('.parallax').parallax();
  $('.dropdown-trigger').dropdown();
  $('.modal').modal();
});

// sidenavだけは、進む/戻るで動かなくなるので都度destroyが必要
$(document).on("turbolinks:before-cache", function () {
  $('.sidenav').sidenav('destroy');
  $('.dropdown-trigger').dropdown('destroy');
  $('.modal').modal('destroy');
});

```
これで問題なく動きます。

# ついでに
こんな風にすると、sidenavが右から開きます。

```javascript

  $('.sidenav').sidenav({
     edge: "right"
   });
```
Materializeのページではオプションの使い方の例すら書いておらず
~~非常に不親切~~ 自走力が試されます。
他のオプションも同様なので、色々試してみましょう！

# それでも動かない人
もしかしたら、jqueryとかを読み込む順番が間違っているかもしれないので
下記を参考に並び替えてみてください。

```javascript:app/assets/javascripts/application.js

//= require rails-ujs
//= require jquery
//= require materialize
//= require activestorage
//= require turbolinks
//= require_tree .
```
GCP - GAE, GCE, GKEの決定木

# はじめに
Google Compute Platformに限らず、パブリッククラウドで提供されているPaaS、IaaSサービス。なんとなくは理解しているつもりだけど、実際どれを使った方が良いのか整理できておらず、割となんとなく決めてしまっている気がします。できること、できないことを把握してないとサービスの規模や状況に対して過剰なインフラ環境を構築してしまったり、リソースを割きすぎてるケースもあるんじゃないかと思います。:confounded:

初学者のため体験的な比較ができませんが、公式ドキュメントなどを参考に自分なりの判断基準をまとめてみようと思います。

# 概要

## GAE（Google App Engine）
Google App Engine は、Google のインフラストラクチャ上でアプリケーションを作り、実行できるようにする PaaS （ Platform as a Service : サービスとしてのプラットフォーム）です。

Google App Engine にはスタンダード環境（Standard Environment）とフレキシブル環境（Flexible Environment）があります。どちらの環境を選択するべきかは以下の公式ドキュメントを参考にすると良さそうです。

-  [App Engine 環境の選択](https://cloud.google.com/appengine/docs/the-appengine-environments?hl=ja)
-  [App Engine スタンダード環境ユーザーのための App Engine フレキシブル環境](https://cloud.google.com/appengine/docs/flexible/go/flexible-for-standard-users?hl=ja)

**ただし、以下にもあるように、どちらかの環境のみを使用する必要はなく、メインアプリケーションは、スタンダード環境で構築し、スタンダード環境では不可能な動作を必要とする部分をフレキシブル環境でマイクロサービスとして作成して呼び出すような構成が推奨されています。**

>フレキシブル環境は、スタンダード環境を補完することを目的としています。既存のアプリケーションをスタンダード環境で実行している場合、通常、アプリケーション全体をフレキシブル環境に移行する必要はありません。


## GCE（Google Computer Engine）
Google Computer Engine は、Google のインフラストラクチャ上で仮想マシンを作成して実行できるようにする IaaS（  Infrastructure as a Service : サービスとしてのインフラストラクチャ）です。

Compute Engine インスタンスでは、Google が提供する Linux 用または Windows Server 用の公開イメージだけでなく、独自に作成したか既存のシステムからインポートした非公開のカスタム イメージも実行できます。Docker コンテナをデプロイすることもできます。

#### GAEフレキシブル環境のVMとComputeEngineのVMの違い

- フレキシブル環境の VM インスタンスは毎週再起動します。再起動中に、Google の管理サービスがオペレーティング システムとセキュリティの更新を適用します。
- Compute Engine VM インスタンスにはルート権限でアクセスできます。デフォルトでは、フレキシブル環境の VM インスタンスへの SSH アクセスは無効になっています。アプリの VM インスタンスに対するルートアクセスを有効にすることもできます。
- Cloud Build サービスを使用してコンテナ イメージを構築すると、コードのデプロイに時間がかかる可能性があります。
- フレキシブル環境の VM インスタンスの地理的なリージョンは、GCP プロジェクトの App Engine アプリケーションに対して指定した場所によって決まります。Google の管理サービスは、VM インスタンスを同じ場所に配置して最適なパフォーマンスを得られるようにします。


## GKE（Google Kubernetes Engine）
Google Kubernetes Engine は、Google のインフラストラクチャを使用して、コンテナ化されたアプリケーションのデプロイ、管理、スケーリングを行うマネージド環境です。GKE 環境は複数のマシン（具体的には、Google Compute Engine インスタンス）で構成され、これらのマシンがグループ化されてクラスタを形成します。

Kubernetesの詳細については[こちら](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/)を参照してください。

公式ドキュメントで挙げられていた利点の中で、個人的に気になった点は以下の通りです。

- **継続的な開発、インテグレーション、デプロイ**
- **開発、テスト、本番環境に跨った環境の一貫性**
- **疎結合で、分散された、伸縮自在の遊離したマイクロサービス**
- **クラウドとOSディストリビューションの移植性**

# 判断基準
以下の基本的な基準をケースにあてて判断ができそうです。

- アプリケーション（規模、アーキテクチャ、更新頻度）
- リソース（インフラ担当者の有無、導入コスト）
- 状況（開発フェイズ、将来的な見込み）
- 費用

## インフラを自前で構築、管理する必要があるか

**必要がある → GCE or GKE**
**必要がない → GAE**

- GAE制限外の環境を構築する必要があるか
- インフラ面にリソースを割けるか

## Kubernetesを利用する必要があるか

**必要がある → GKE**
**必要がない → GCE**

- 採用するメリットが、導入コストよりも多いか

## おわりに
自分なりの基準なので、基本的には以下の公式ドキュメントを参考に使用するサービスを決めていきたいです。

[どの GCP サービスを選ぶ？ 正しい選択のための決定木](https://cloud.google.com/blog/ja/products/gcp/choosing-the-right-compute-option-in-gcp-a-decision-tree)

# 参考
[Google App Engine のドキュメント](https://cloud.google.com/appengine/docs/?hl=ja)
[Compute Engine ドキュメント](https://cloud.google.com/compute/docs/?hl=ja)
[Google Kubernetes Engine のドキュメント](https://cloud.google.com/kubernetes-engine/docs/?hl=ja)
[GCEとGAE、どっち使えばいいの？という人のためのGCP運用診断](https://qiita.com/defunty/items/f837c9e09c8ccc6033b3)
conda と pip でのパッケージ管理について

[Anaconda](https://www.anaconda.com/) は一言でいうと Python 本体に加え科学計算のライブラリ等が最初から付属されているものです。またパッケージ管理とデプロイを簡略化するための工夫がなされており conda というパッケージ管理コマンドが付属しています。

## conda と pip について

Python の世界ではかなり昔からそれ自体にパッケージ管理ツールというのが付属していて、昔は EasyInstall なるものを使っており [pip](https://pypi.org/) を使うためにはあとからセットアップしなければならなかった。いちいち面倒であった。最近の Python ではすっかりデフォルトで pip が付属していて最高の時代になっている。このコマンドを使うと PyPI というサイトに公開しているパッケージをコマンドによりインターネット経由でインストールできる。最高の時代である。

さて、よくある話が conda と pip を併用すると「壊れる」という言説。なにをもって壊れると主張しているのかよくわかりませんが、そもそも同じパッケージに対し conda で入れたり pip で入れたりしている状況が異常なわけです。壊れているのはパッケージ管理システムではなくむしろ支離滅裂なことをやろうとしているあなたの頭ではないかと。

誤解を招かないように言っておきますが Anaconda では基本 conda というコマンドを打ってパッケージを入れるが pip を使うこともできる。前者の conda は Anaconda 社のリポジトリから入れる。後者の pip は PyPI から入れる。当然、後者のほうがたくさんパッケージがある。また PyPI は審査とかあるわけではないので、誰でもパッケージ作者になれる。極端な話、変なソースコードを書いて PyPI で公開しても、誰もチェックしていないのが現状である。自分のプロジェクトにしか使わないようなソースコードをパッケージ化して PyPI に置いても誰にも何とも言われない。

一方 Anaconda 社のリポジトリは一応会社が管理しているものなので、それなりにはチェックしているとは思うが別に自分は中の人ではないので「チェックしてます！」と保証するつもりはない。

またコミュニティが運営する conda-forge というリポジトリもあり、こちらから conda で入れることもできる。でもそれを使う時点で結局コミュニティの成果物じゃないか、とまあそんな感じです。

ぶっちゃけて言えば、パッケージとパッケージ間の依存関係なんて、作者の都合で依存しているものなので、 Python の世界全体を見渡してそれらの関係性を厳密に検証している人間なんていない。使うあなた次第ってことですね。

こういう議論は Python に限らずたとえば Ruby のパッケージ管理システムでも昔から議論になっていて、結局みんな好き勝手にパッケージを作っているのだからフリーダム。オープンソースなんてそんなもの。使う人が検証すればよろしいみたいな雰囲気になっているものと思う。

パッケージ間の依存関係を徹底的に検証して品質を維持しているのって Debian 安定版くらいのものじゃないか、と個人的には思っている。

## pip での依存情報の表示

パッケージメンテナや作者は知っていると思いますが PyPI に登録するときにはパッケージの配布ファイルに色々メタ情報を書きます。

で、依存情報はどうやって調べるかというと、以下のコマンドで表示できます。

```bash
pip install pipdeptree # pip で入れる
pipdeptree -p <パッケージ名>
```

例えば pandas というパッケージについてバージョンごとにいくつか例を挙げるとこんな感じ。

```
pandas==0.16.2
  - numpy [required: >=1.7.0, installed: 1.11.2]
  - python-dateutil [required: >=2, installed: 2.6.0]
    - six [required: >=1.5, installed: 1.10.0]
  - pytz [required: >=2011k, installed: 2016.7]

pandas==0.22.0
  - numpy [required: >=1.9.0, installed: 1.13.3]
  - python-dateutil [required: >=2, installed: 2.6.1]
  - six [required: >=1.5, installed: 1.11.0]
  - pytz [required: >=2011k, installed: 2017.2]
```

これを見ればどのパッケージがどのパッケージのどのバージョンに依存しているのか把握できる。

## conda と pip の両方で重複しているパッケージの表示

よくあるのが conda で管理しているのに、意図せず pip でも入れてしまうという事故。というわけで重複しているパッケージは以下のワンライナーで表示できます。

```bash
conda list | cut -d ' ' -f 1 | sort | uniq -d
```

たまにチェックして重複していないか確認しておくと良いです。

## まとめ

というわけで長くなりましたが、まとめると

・Anaconda のパッケージ管理には conda と pip コマンドが付属している。
・基本は conda を利用して Anaconda のリポジトリを参照する。
・conda に無いものは pip で入れる。
・たまに重複していないかチェックして、重複しているなら conda を優先する。

これらを参考に、目的となる環境を構築すればよろしい。

こんな感じかと思います。異論は認めるので各位ご意見をいただければと。雑ですが以上です。
Oracle Bronze SQL基礎I -結合-

#結合
全然頭に入らないので、整理。
表の結合を行う際に、表接頭辞として「表名」や「表別名」表別名を、
指定することによりパフォーマンスが向上する。
但し、同じ表の表接頭辞として「表名」と「表別名」は混在できない。
##等価結合
2つの表の特定の列の値が必しいデータだけを取り出す結合
##非等価結合
等号(=)以外の演算子を使用した結合
##自然結合
自然結合は、2つの表に共通して存在する同名で同じデータ型の列に基づいて結合。
- 結合列に表接頭辞の使用不可
- 2つの表に共通して存在する列に基づいて結合を行う
- データ型の異なる同名の列がある場合はエラーとなる
- 結合条件は指定する必要なし(WHERE書き)
- 2つの表に同名で同じデータ型の列が複数ある場合はその組合せで結合
###●NATURAL JOIN
自然結合のデフォルト。
結合条件が必要ない分、同じ名前の列名を無条件に結合させてしまうため、
希望通りの結合ができない場合がある。

また、NATURAL JOINとUSINGは一度の結合に同時に使用できない。
× FROM A NATURAL JOIN B USING(a_id);
〇 FROM A NATURAL JOIN B JOIN C USING(c_id);

```SQL:anzuame1.sql
FROM '表名1' NATURAL JOIN '表名2';
```
###●USING
自然結合では、同名でデータ型が異なる列を結合してしまい
エラーが起きるので、USINGを使用する。USINGは、
等価結合の1つなので、結合列を明示的に指定することができる。

USING句を使用する場合、結合列に表接頭辞は記述できない。
逆に、結合列以外の列名に表接頭辞を記述できる。

◎USINGを使う場合
- 結合する2つの表に同じ列名でデータ型の異なる列がある場合
- 結合する2つの表の一部の列を結合列として使用する場合
- 等価結合を行う場合

```SQL:anzuame1.sql
FROM '表名1' JOIN '表名2' USING('結合列名1'[,'結合列名2',...]);
```

##内部結合
###JOIN ON (内部結合)
ON句を使用した結合では、自然結合やUSING句での結合とは、
異なり、列名が違っていいても結合列として指定することが可能。

```SQL:anzuame2.sql
'表名1' JOIN '表名2' ON '結合条件';
```

####3つ以上の表を結合する場合
```SQL:anzuame2.sql
'表名1' JOIN '表名2' ON '結合条件'
JOIN '表名3' ON '結合条件' ... ;
```
###CROSS JOIN (クロス結合)
クロス結合は、指定されている2つの表に登録されている行の
すべての組合せ(≒デカルト積)を返す。

同等データの取得には結合条件を指定しない結合結果が◎

```SQL:anzuame1.sql
FROM '表名1' CROSS JOIN '表名2';
-- ▽置換
FROM '表名1', '表名2';
```

##自己結合
己の表を己の条件式に用いて結合する。
NATURAL JOINとか内部結合とかいろいろやり方あるので割愛。

##外部結合
結合条件を満たしたデータのみだけではなく、
条件を満たしていないデータも一緒に取り出す方法を外部結合という。

```SQL:anzuame1.sql
FROM '表名1' [LEFT|RIGHT|FULL] [OUTER] JOIN '表名2' ON '条件式';
```
下記は、Oracle独特の書き方。
結合側に(+)を記述する。
※(+)...外部結合演算子

```SQL:anzuame1.sql
FROM '表名1','表名2' 
WHERE ['表接頭辞1'.]'列名'[(+)] = ['表接頭辞2'.]'列名'[(+)]
[AND '結合条件以外の条件'];
```
なお、外部結合演算子は両側に指定することはできず、
指定された場合はエラーを返す。

###LEFT [OUTER] JOIN
JOIN句の左側の表のデータをすべて取り出す
###RIGHT [OUTER] JOIN
JOIN句の右側の表のデータをすべて取り出す
###FULL [OUTER] JOIN
2つの表のデータをすべて取り出す
Materializeのドロップダウンが閉じたり閉じなかったりする時

# はじめに
Materializeはとても便利ですね。少ない記述でシンプルで動きのある
モーダルやドロップダウンとかを追加できます。
ただ、使うには微妙に一癖も二癖もあるので、慣れるまでに時間がかかりました。
今回は、
#### ドロップダウンを開いた後、別の場所をクリックした時にドロップダウンが閉じたり閉じなかったりする場合の対処
を記事にしています。


# Materializeのドロップダウン
手前味噌ですが、自作アプリの「[CheckMe!](https://check-me-share.herokuapp.com)」ではシートの操作に
ドロップダウンを使っています。
![dropdown](https://gyazo.com/d33287ec28145cefd49ac11951368d3e.gif)

ドロップダウンの外のどこかをクリックすると本来ならドロップダウンが閉じるはずなのですが
なぜか閉じないと時がありました。

# 閉じない原因
### Bodyの外をクリックしていた
当時は、ヘッダーがあって、シートをDBから引っ張ってきて順次表示させていく実装だったため
シート数が少ないと画面の縦幅よりもBodyの高さが短くなることが起きていました。
そして、Bodyの外をクリックするとドロップダウンを閉じず、Bodyの中をクリックすると
ドロップダウンが閉じるという症状になっていました。

# 対策
見た目上は何の問題もありませんが、明らかにUXを損なうので
hamlの一番上に.wrapperを追加し、SCSSで最小高さを画面の高さとしました。

```html:適当なビューファイル
.wrapper
  以下、ビューの記述を始める

```

```css:適当なSCSSファイル
.wrapper{
  min-height: 100vh;
}
```

これで、Bodyの高さが最低限画面の縦幅となりましたので問題解決です。
QualityForward APIでGoogleスプレッドシートに一日の作業件数を記録する

[QualityForward](http://bit.ly/2tHnMJI)はクラウドベースのテスト管理サービスです。Web APIを提供しています。そのWeb APIを使いやすくするため、Google Apps Script用ライブラリを開発中です。

今回はそのGoogle Apps Scriptライブラリを使って、Googleスプレッドシートに一日の作業件数を集計します。

## インストール

Google Apps ScriptでのプロジェクトIDは `1ppRPLjuClG0MhtnXYbskdZ8uYGbyCFHv7MFhr0GYa-3IAKEh8B7lmTMb` になります。これを取り込んでください。以下はデフォルトの `QualityForward` として取り込んだ場合の書き方です。

<img width="703" alt="Screenshot_ 2019-11-26 16.54.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/a34afc65-d4d7-37bb-7464-af53186842fd.png">

## 初期化

初期化はAPIキーを適用して行います。

```js
var apiKey = 'aaa';
var qf = new QualityForward.Client(apiKey);
```

## テストフェーズの取得

最初にテストフェーズをすべて取得します。

```js
var testPhases = qf.getTestPhases();
```

次にすべてのテストフェーズについて、テストサイクルを取得します。

```js
for (var i in testPhases) {
  for (var j in testPhases[i].test_suite_assignments) {
    var testSuiteAssignment = testPhases[i].test_suite_assignments[j];
    var testCycles = testSuiteAssignment.getTestCycles();
    // : 次の処理はこの中に記述
  }
}
```

## テスト結果の取得

すべてのテストサイクルについて、テスト結果を取得します。テスト結果の中で本日作業分をフィルタリングします。

```js
for (var k in testCycles) {
  var testCycle = testCycles[k];
  var results = testCycle.getTestResults();
  for (var l in results) {
    var testResult = results[l];
    var d = testResult.executed_at;
    if (d.getFullYear() === today.getFullYear() && 
      d.getMonth() === today.getMonth() &&
      d.getDate() === today.getDate()) {
      ary.push(testResult);
    }
  }
}
```

## テスト結果ごとにグルーピングする

TestResultが取得できたら、例えばテスト結果ごとにグルーピングしてみます。

```js
var group = {};
for (var key in ary) {
  var testResult = ary[key];
  if (!group[testResult.result]) group[testResult.result] = 0;
  group[testResult.result]++;
}
```

後はスプレッドシートへの出力です。

```js
var resultSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('TestResult')
var lastRow = resultSheet.getRange(resultSheet.getMaxRows(), 1).getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
resultSheet.getRange(lastRow + 1, 1).setValue(today);
resultSheet.getRange(lastRow + 1, 2).setValue(group.pass || 0);
resultSheet.getRange(lastRow + 1, 3).setValue(group.fail || 0);
resultSheet.getRange(lastRow + 1, 4).setValue(group.skip || 0);
resultSheet.getRange(lastRow + 1, 5).setValue(group.cut || 0);
resultSheet.getRange(lastRow + 1, 6).setValue(group.block || 0);
resultSheet.getRange(lastRow + 1, 7).setValue(group.na || 0);
resultSheet.getRange(lastRow + 1, 8).setValue(group.qa || 0);
```

これを実行すると、スプレッドシートに日付ごとにテスト結果が一覧で記録されます。

<img width="1084" alt="Screenshot_ 2019-11-26 17.14.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/825aeb94-117e-972c-6200-bdea52063e39.png">


## まとめ

QualityForwardを使えばExcelなどで行っていた煩雑なテスト管理がクラウドベースでできるようになります。ライブラリを使うことで既存システムとの連携も用意です。ぜひお試しください！

[QualityForward](http://bit.ly/2tHnMJI)
[Vue.js]フォームからデータ登録後にフォームを初期化する

データをフォームから送信後データが残っていると、同じデータを登録してしまう再度可能性が
あるため登録後はフォームを初期化する実装をしました。

***コードは非同期でレスポンスが帰ってきた箇所のみしてあります。***

```vue.js
...
<script>

methods:

.....
save() {
this.save
response => {
this.dataReset() //レスポンスが返ってきたらデータを初期化
}

//初期化のデータを呼び出すメソッド
dataReset() {
 this.save.title = null,
 this.save.body = null
}

</script>

```

空のデータがセットされたメソッドを呼び出すことで登録後はフォームが初期化するようになります。
Windowsでローマ字入力／かな入力を切り替えるショートカット

最近、かな入力にハマっています。
日本語入力では押すキーの数も少ないのでいい感じ。

でも全角記号はかなり入力しづらいです。全角コロンとか全角びっくりマークとか。。
かな入力のまま全角にするなら「F9」を押すと記号に変換されます。

* ```け```と入力したまま「F9」を押すと```：```
* Shift + ```け```と入力したまま「F9」を押すと```＊```

仕様書書いてたら記号頻繁に出てくるんだけど。。
ということで、ローマ字入力したいときもあります。
いつも忘れるショートカットキー。

# ローマ字入力／かな入力を切り替え

```
「Alt」 + 「カナ／かな／ローマ字」
```

![切り替え.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/87aed4c9-7640-30a6-682a-1f5449049b3f.jpeg)

押すとこんな確認アラートが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/e1ce4e56-1217-c955-d4d0-fb026419758f.png)
IBM Cloud functions(node.js)からDB2 on Cloudへ接続する方法

#1. はじめに

IBM Cloud functionsでは、以下リンクのpackageが標準で利用できるようになっています。
https://cloud.ibm.com/docs/openwhisk?topic=cloud-functions-runtimes#node-js-packages

例えばDb2にアクセスしたい場合には`ibm_db`というモジュールが存在するので、これを利用すると簡単にDb2 on CloudなどのDb2環境にアクセスすることができます。この記事ではIBM Cloud functionsの実行言語としてnode.jsを選択しています。python版は[こちら](https://qiita.com/testnin2/items/afbe5d151fdb0f6a73e0#_reference-7babed50a2f0f2baf9e7)です。
https://www.npmjs.com/package/ibm_db

#2. サンプルコード

以下のサンプルコードでは、Db2 on Cloudに対して、`select * from SYSIBMADM.SNAPDBM`を実行するコードを記載しています。

```javascript:サンプルコード
var ibmdb = require('ibm_db');
function main(params) {
  
var ssldsn = 'DATABASE=xxxxx;HOSTNAME=dashdb-txn-flex-yp-xxxxx.xxxxxx.xxxxx.bluemix.net;PORT=xxxxx;PROTOCOL=TCPIP;UID=xxxxx;PWD=xxxxx;Security=SSL;';
var sql = 'select * from SYSIBMADM.SNAPDBM';

ibmdb.open(ssldsn, function (err,conn) {
  if (err) return console.log(err);
  
  conn.query(sql, function (err, data) {
    if (err) console.log(err);
    else console.log(data);
 
    conn.close(function () {
      console.log('connection closed');
    });
  });
});


};

```

接続情報である`ssldsn`は、DB2 on Cloudの以下のcredential情報から入手することができます。
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e96fbf16-c0b3-7568-3fbc-ea05c76adf0e.png">





#3. サンプルコードの利用方法

IBM Cloud functionsで以下のように`アクション`を作成します。

<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/6e37b61d-0384-f75e-ed3f-232a091266b8.png">
<img width="1277" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5a3d0529-bb53-549b-ba32-0b1f4f9a9814.png">
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/83d71436-7b91-1232-7045-68213dee93f4.png">

コードを貼り付けて、`Invoke`で実行すると、右画面に結果が出力されます。
<img width="960" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/0cb01c61-7a80-52ce-9817-8339120e0dc1.png">
Longan nanoでマンデルブロ集合描画

SipeedのLongan nanoには160x80のフルカラーLCDがついてるので、少し遊んでみます。

マンデルブロの前にすこしだけ、懐かしいものを。

#ランダム四角塗りつぶし
ランダムで四角を書いて、ランダムで色を塗っていきます。

```c:
#include "lcd/lcd.h"
#include <string.h>
#include <stdlib.h>

int main(void)
{
	Lcd_Init();	
	LCD_Clear(BLACK);
	BACK_COLOR=BLACK;

	while(1)
	{
		LCD_Fill(rand()%160,rand()%80,rand()%160,rand()%80,rand()%65536);
	}
}
```

BadApple!!のmain.cを書き換えると楽です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Longan nano でランダムFill <a href="https://t.co/9I3iShHKFT">pic.twitter.com/9I3iShHKFT</a></p>&mdash; 大沼　功(Shigezoneﾃﾝｲﾝｻﾝｼﾞｬﾅｲ 求職中なのよ) (@myston) <a href="https://twitter.com/myston/status/1198514089640640512?ref_src=twsrc%5Etfw">November 24, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

昔懐かしい感じ。
PC-8001とか、PC-8801とかのBASICでよくやりましたよね。

これ眺めてるだけでも結構楽しいです。

ちなみに、LCD_FILLのところを

```
LCD_DrawPoint(rand()%160,rand()%80,rand()%65536);
```

にすると、ランダムにランダムな色な点が打たれますので、ちょっと気持ち悪いかもしれませんｗ

#マンデルブロ描画
フラクタルで有名なマンデルブロは、なかなか目を引きますので題材としてはいいかなと思いました。
よくわからないので、下記を参考にしています。

[マンデルブロ集合を描く](http://azisava.sakura.ne.jp/mandelbrot/algorithm.html)

これをLongan nano用にします。
そんなに変わりません。

```c:
#include "lcd/lcd.h"
#include <string.h>
#include <stdlib.h>

int main(void)
{

    Lcd_Init();
    LCD_Clear(BLACK);
    BACK_COLOR=BLACK;

    int pixel,size,k;
    float i,j,x,y,a,b,_a,_b;


    size = 4;
    pixel = 120;
    for (i = 0; i < pixel; i++) {
        x = i * size/pixel -size/2;
        for(j = 0; j < pixel;j++) {
            y = j *size/pixel - size/2;
            a = 0;
            b = 0;
            for(k = 0;k < 500;k++){
                _a = a * a - b * b + x;
                _b = 2 * a * b + y;
                a = _a;
                b = _b;
                if(a * a + b * b > 4.0) {
                    LCD_DrawPoint(i,j,WHITE);
                    break;
                }
            }
        }
    }

}
```

実行結果がこちら。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Longan nanoでマンデルブロ描画 <a href="https://t.co/kCxp30ahRb">pic.twitter.com/kCxp30ahRb</a></p>&mdash; 大沼　功(Shigezoneﾃﾝｲﾝｻﾝｼﾞｬﾅｲ 求職中なのよ) (@myston) <a href="https://twitter.com/myston/status/1199233155254771712?ref_src=twsrc%5Etfw">November 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

120x120で各点最大500回の計算です。
10秒かからないくらいですかね。

ドットはWHITEで打ってるので、条件で色を変えるようにすると、きれいなマンデルブロ集合が描画されるはずです。
[UE4] Androidで、大きいタイトルの起動を早くする

Google Playでは、ユーザーがダウンロードする圧縮APKが100MB以下である必要があります。 ほとんどのアプリでは、これはアプリのすべてのコードとアセットのための十分なスペースですが、UE4のゲームだと、超える場合が多いです。
そのために、グーグルさんが[Expansion Files (OBB)](https://developer.android.com/google/play/expansion-files.html)というファイルシステムを提供します。最大2つのファイルで、一つごとに2GBまで追加できます。

OBBファイルのホスティングがGoogle Play側で行っていて、節約で大規模のAndroidゲームの作成の味方です。

ただ、ゲームを起動する時に、OBBのファイルのチェックが行っていて、起動時間が延長する場合があります。
DefaultEngine.iniの中でこの次のフラグをTrueにすると、

`Project/Config/DefaultEngine.ini
[/Script/AndroidRuntimeSettings.AndroidRuntimeSettings]
bDisableVerifyOBBOnStartUp=True `

起動時の確認を無視することができて、カットシーンやローディング画面中などの好きな時に行うことが可能になります。

ただしかし、「大いなる力には、大いなる責任が伴う」であり、自分で上手いタイミング（タイトル画面など）にDowloaderActivity.java.templateのvalidateXAPKZipFilesのメソッドで確認してください！

Joyeux Noël !
icrawlerを使用して画像を収集する

```python:
pip install icrawler
```


```python:main.py
from icrawler.builtin import GoogleImageCrawler

# 車の画像取得
crawler = GoogleImageCrawler(storage={"root_dir": "car"})
crawler.crawl(keyword="車", max_num=100) #最大100枚の画像を取得
```
CodeSandboxからZEIT Nowへのデプロイが「An unknown error occurred when connecting to ZEIT」で失敗する

## :bomb: 原因
CodeSandboxからNowへはいかにもワンクリックでデプロイ出来るような雰囲気が出ているが、***「now.json」という設定ファイルを作ってあげる必要がある***。

昔は本当にワンクリックで出来ていた気がするけど、NowのVersion2が登場したことで設定ファイルの用意が必須になったようだ。

## :star: 解決策
「now.json」は自分で作成しても良いし、歯車マークの「Configuration」から作成することも出来る。

場所は普通にディレクトリのルートに置けば良い。
設定内容はそれぞれのアプリによって少し異なる。

注意点は、CodesandboxからのデプロイはVersion1だと動かない。

```Node.jsアプリの例
{
  "version": 2,
  "builds": [{ "src": "src/index.js", "use": "@now/node" }],
  "routes": [{ "src": "(.*)", "dest": "src/index.js" }]
}
```

### 詳しい設定内容は以下のリンクを参考に
[公式](https://zeit.co/docs/configuration/)
[now.shのデプロイ設定ファイル「now.json」の使い方まとめ](https://www.serversus.work/topics/t4bp8t8y6c8k2mcm6cq0/)
HTMLでJSファイルが読み込めなかった時に行った対処<Mac>

ストップウォッチをブラウザで動かすプログラム(stopwatch.js)を組んだ時にhtmlがjsファイルを読み込んでくれないエラーが発生しました。


まず、html上にて動作が行われなかったのでGoogle Chromeにてディベロッパーツールを起動。


その際に出たエラー表示は

*'Uncaught SyntaxError: Invalid or unexpected token'*

このエラー表示を調べてみると
主に文法上の間違いが原因らしいので文法を一つ一つ確認。ですが、文法の間違いは無かったです。

あれこれ調べていると読み込んだjsファイルの結果が文字化けしていることに気づいたので文字コードが原因かなと思いましたが
```html:index.html <meta charset="UTF-8"> ```
でhtmlのheadに書いているので理由がわからず...


他にも「javascript 文字化け」や「jsファイル　読み込めない」などで検索しましたがそれっぽい記事が出てきませんでした。


困ったな〜と思ってなんとなく画面を見ていたら



読み込もうとしたjsファイルだけ他のファイルと形式がなんだか違うことに気づきました。


他のjsファイルは「PlainTextFile」とFinderでは表示されていましたが読み込めなかったファイルだけ**「エイリアス」**と表示されていました。

なんだこれは、と思いエイリアスとはなんぞやと調べたところ

いわゆるショートカットらしいです。複製とは違うみたいで。
（このサイトを参考にしました！　[エイリアスってなに？](https://ringosuki.hateblo.jp/entry/2017/04/29/%E3%80%90Mac%E3%81%AE%E8%B1%86%E3%80%91%E7%AC%AC26%E5%9B%9E%EF%BC%9A%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%AB%EF%BC%9F))

*確かに、複製では無いならエラーが起きてしまうわ！*


早速そのjsファイルのオリジナルを移動させました。
（ちなみにオリジナルはDocumentsにありました。）


そしたらなんと、jsファイルが読み込めて無事ストップウォッチが起動！


なんという初歩的なミスで時間を食っていたんだろう（笑）


これから気をつけたいと思います。
Herokuでカスタムbuildpackを使う方法

# 概要
Herokuで通常のbuildpackに加え、customのbuildpackを加えたい時があると思います。
その時のやり方です。

# やり方
- `heroku buildpacks:add URL_TO_THE_REPO`
- 例：`heroku buildpacks:add https://github.com/elishaterada/heroku-google-application-credentials-buildpack.git`
- その後再ビルド

# 参考
https://devcenter.heroku.com/articles/using-multiple-buildpacks-for-an-app#adding-a-buildpack
https://elements.heroku.com/buildpacks/elishaterada/heroku-google-application-credentials-buildpack
https://stackoverflow.com/questions/58499435/create-json-file-out-of-env-credentials-to-authenticate-google-cloud-on-heroku
Rails link_toでアンカーを設定する

#背景
スタッフの詳細ページにそのスタッフが作成したメニューの一覧を表示したいが、ただリンクさせるだけだと
スクロールをしなくてはならないためあまりつかいやすいとは思わなかったため



＊個人の備忘録のために記載


#環境
Rails 5.2.3
ruby 2.6.3


#まずリンク先の飛びたい場所にidを指定

```
<div class="mi-contents2" id="staff_menu">
```

#link_toにanchorを指定する

```
<%= link_to 'テキスト', リンク先のpath(anchor: 'リンク先のid', ~~~ %>
```



下記が実際の設定した例

```
<li class="usi-menu"><%= link_to 'このスタッフのメニューへ', staff_path(staff.id, anchor: 'staff_menu'), class: 'btn btn-primary' %></li>
```

上記のような記述をすると

```
<a href="/staffs/1#staff_menu">
```

のようなリンクが生成される




参考にしたサイト
[kzy52's blog](https://kzy52.com/entry/2014/11/28/210211)
[Rails アンカーリンクを使い遷移先ページの場所(位置)を指定する](https://qiita.com/hellhellmymy/items/37ce7197c8f206715af2)
StudioZ AdventCalendarの開催にあたって

# はじめに
StudioZ Advent Calenter 1日目の記事となります
最初の記事かつStudioZ株式会社としては初の試みとなるので、
今回は技術ネタではなく経緯や目的などを。

# そもそもStuzioZって何やってるの？
StuidioZは「メチャクチャオモシロイをツクる」をビジョンとしたCROOZグループ内のゲーム開発会社です
https://studioz.co.jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54063/f175dc15-df6f-927f-36a4-9cf41407bb73.png)

2010年頃、CROOZがブラウザゲームで急成長した時のメンバーを中心に在籍し、
「エレメンタルストーリー」や「HUNTERxHUNTER バトルコレクション」を運営しています

# なぜアドベントカレンダー？
今回、技術チームとして外に発信をしようと考え技術チーム発信でこの取組みを開始しました。
外部PRやそれに伴う採用助力の一環という側面もありますが、
大きいのはエンジニア陣の意識改善になってほしいと考えたからです。

# 記事を書くメリット

## もう一歩技術を理解する為
良いアウトプットを書く為には良いインプットが必要不可欠です。

エンジニアの仕事は「技術で問題を解決すること」が命題で日々開発や運用業務に勤しんでいますが、
おそらくそこにはエンジニアごとに試行錯誤したノウハウや努力が必ずあり、
記事を書くという行為は、それを頭の中で体系付け、説明の為にもう一歩掘った情報を得ることです。

## IT業界への貢献
Web業界のエンジニアは、ggr(ぐぐる)という行為はまるで息を吸うようなもの。
普段どれだけインターネットに助けられていることか。
実は僕らも「誰かが困っていること」を解決できるノウハウを抱えている可能性があります。
「こんなこと書いて恥ずかしいかも」と思った記事を読んで助かる誰かがいるかもしれない。

## 反応があると結構ウレシイ
Qiitaには[contribution](https://help.qiita.com/ja/articles/qiita-contribution)という"貢献度"を示す指標があり、
いいねされたり、編集リクエストが受け入れられることで数値が増えます。
自身も最近記事を投稿し出しましたが、以外な記事にいいねがついたりすると、
「おお、誰かが参考にしてくれた！」と書いて良かったと思います

# この手の文化を導入するにあたって気をつけること
## まずは自分から
「絶対やった方がいい」「やるべきだ」と思うことでも、絵に書いた餅になっては意味がありません。
言い出しっぺはまず自分で動く。これ大事。
周りからあーだこーだ言われるかもしれないけど、行動した人が一番エラい。

## 目的をちゃんと説明する
今回、技術チームにはスライドを作って「なぜやりたいか」を熱弁しました。
業務の片手間にやるには手間でしかないので100%理解はされないと思いますが情熱が大事ですね
（♪ 情熱大陸のテーマまたはS南美容外科のテーマ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54063/59e6e114-88d1-fa62-5b0f-33b5483c5c2b.png)

## リスクを考慮する
自由にやっていいとはいえ会社としてのアクション。気をつけるべきポイントがあります
- 大事なエンジニアの時間を使うことへの理解
- 公開される情報の内容とリスク
- この取り組みでメンバーのモチベが下がらないか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54063/3b952352-40a3-ca80-2d61-30af7be38c03.png)


## 推進する
目的だけ伝えてもダメ。うまくいくように動く。
エンジニアは基本面倒くさがりなので一押しして流れになると手がかからない
Qiitaだと仕組み化もされていて簡単なのでコーポレートサイトにデプロイ考えるとかも無くていいので楽。ありがたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54063/32e35259-0416-65b1-d37a-974faa2b4b97.png)


## やりきる
今回の目標。ちゃんとやりきるのが大事。できるかなぁ・・・
他社さんのカレンダーも参考に24日まで記事がしっかり並ぶようにしていければと思います！
[バッチ] bitsadminでファイルをダウンロードする

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

**ビルドの自動化関連**

- [【VisualStudio】ビルドをバッチで行う](https://qiita.com/tera1707/items/018e8390207c5b2212b2)
- [[バッチ] bitsadminでファイルをダウンロードする](https://qiita.com/tera1707/items/78c2a4d1fb175a8f8b8d)



# やりたいこと
バッチで、ファイルをダウンロードしてきて好きなパスに配置する、ということをしたい。


# バッチでnuget.exeをダウンロード
今回、いろいろなパッケージを管理するための`nuget.exe`を`https://dist.nuget.org/win-x86-commandline/latest/nuget.exe`からダウンロードしてきて、バッチファイルと同じ階層に保存する、ということをした。

その時のサンプルは下記の通り。


```
set FILENAME="%~dp0\nuget.exe"
if not exist %FILENAME% (
bitsadmin /transfer "nuget" https://dist.nuget.org/win-x86-commandline/latest/nuget.exe "%FILENAME%"
)
```

書き方は、

```
bitsadmin /transfer ＜ジョブ名＞ ＜URL＞ ＜保存先ファイル名＞
```

- ジョブ名は何でもよい。
- URLは、ダウンロード先。
- 保存先ファイル名は、保存したいファイルのパス。

[参考](https://maku77.github.io/windows/cmd/download.html)

# 発展形
このコマンドを使ってnuget.exeをダウンロードするようにしてやることで、以前メモした[[ビルドをバッチで行う]](https://qiita.com/tera1707/items/018e8390207c5b2212b2#%E3%81%8A%E3%81%BE%E3%81%91nuget%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E5%BE%A9%E5%85%83%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96)方法の中の`nuget.exe`を置いたフォルダで

```
.\NuGet restore <slnファイルのパス>
```
を行う、というところのnuget.exeを置くという行為が自動化できる。

# なんの役に立つか？
ソースコードの管理にgit等を使っているときに、容量削減のためバイナリファイル(exeやdllファイル等)を上げてはいけない、というルールがある場合がある。
そういう場合に、nuget.exeをリポジトリに上げて容量を無駄に増やさず、バッチファイルを1つ上げるだけで済むようにできる。


# 参考

【VisualStudio】ビルドをバッチで行う
https://qiita.com/tera1707/items/018e8390207c5b2212b2

コマンドプロンプトからインターネット上のファイルをダウンロードする (bitsadmin)
https://maku77.github.io/windows/cmd/download.html

nuget.exe CLIを使用してパッケージを管理する
https://docs.microsoft.com/ja-jp/nuget/install-nuget-client-tools#windows
リファクタリング　コードを書く上で気を付ける事！！

#はじめに

この記事は、2019/11/1からプログラミング学習を始めた学生がプロのプログラマーになるまでのアウトプットする為の書き込みの場である。

#リファクタリングとは
- 処理の内容を変えずに修正ができる
- 後で見返した時修正がしやすいから
- 読み手が最短でコードを理解できる

#コードをきれいに書くには
- 制御フロー
- 簡単な説明文を書こう
- 変数
- メソッドの抽象化

##制御フロー
条件式文などコードがバラバラにならないようにコードの順番やできる限りコードを短縮して書く

##簡単な説明文を書こう
後から見返すときや、他人が見るときに簡単な説明文があると理解しやすくなる為

##変数
変数を書く量は極力をさえる
あっちこっちで変数が変わると見にくい為

##メソッドの抽出化
定義したい関数とは関係の無い処理は、別で定義する
後で見たときに、見にくい

##終わりに

もっとこうした方が良いよなどご指摘頂けると幸いです
project-scratch-def.jsonのorgPreferenceSettingsが非推奨となりました

今日、Salesforce CLIよりスクラッチ組織を作成した際に以下が表示された。

```console
WARNING: We're deprecating OrgPreferenceSettings. We've added the settings to other metadata types in Winter '20. You can continue to use OrgPreferenceSettings until they are replaced by their corresponding settings in Spring '20. But why wait? Here's exactly what you need to update in the scratch org definition file.

Replace the orgPreferenceSettings section:
{
    "settings": {
        "orgPreferenceSettings": {
            "s1DesktopEnabled": true
        }
    }
}
With their updated settings:
{
    "settings": {
        "lightningExperienceSettings": {
            "enableS1DesktopEnabled": true
        }
    }
}
For more info on configuring settings in a scratch org definition file see:
https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_scratch_orgs.htm
```
OrgPreferenceSettingsが非推奨となり、Winter '20には別のmetadata typesになる予定。変更されるまでにOrgPreferenceSettingsを継続して利用可能とのこと。

**私は画像の指摘内容通りjsonファイルを変更した。**

###project-scratch-def.jsonの場所

プロジェクトフォルダー> config> project-scratch-def.json
Google Chromeが外部モニターに接続するとフリーズする

Ubuntu 18.04でGoogle Chromeを使っていて、外部モニターを接続したり、接続を切ったりするとフリーズする事象が発生していた。
[Stack Exchange](https://superuser.com/questions/803242/google-chrome-freezing-in-external-monitor)を参考に、`設定 > 詳細設定 > ハードウェア アクセラレーションが使用可能な場合は使用する`のチェックを外すとなんか直った。
MacとかWindowsでもこの方法で直ってるっぽいです。

# 参考
https://superuser.com/questions/803242/google-chrome-freezing-in-external-monitor