OmniAICreator/Qiita-1.07M huggingface dataset:
LinuxMint VSCodeとgithubを連携

# はじめに
VSCodeからgithubにpushするところまでやります。
一応[前回](https://qiita.com/pieceofwonder/items/0dff2963e3ff2f7cd216)からの続きとしてやってますが.NET Coreを使っているくらいしか繋がりはありません。

# 環境

- LinuxMint 19.1
- VSCode 1.33

# gitのインストール
gitが入ってない場合はインストールします。

```shell-session
$ sudo apt-get install git
```

ユーザー設定

```shell-session
$ git config --global user.name "username"
$ git config --global user.email xxxxxx@example.com
```

# githubにリポジトリを作成
githubで新規にリポジトリを作成し、developブランチを作成しました。

# ローカルリポジトリの作成
VSCodeで空のフォルダを開いてソース管理からリポジトリの初期化を行います。

# プッシュ先を設定
作成したgithubのリポジトリのURLをコピーしてプッシュ先を設定します。
VSCodeのターミナルで以下のコマンドを実行

```shell-session
$ git remote add origin <githubリポジトリのURL>
```

# developブランチをチェックアウト
まず`git fetch`でリモートリポジトリの情報を取得します。
ユーザー名とパスワードの入力を求められるので入力するとmasterとdevelopの2つのブランチが表示されました。

```shell-session
$ git fetch
Username for 'https://github.com': <githubのユーザー名>
Password for '<githubリポジトリのURL>': 
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From <githubリポジトリのURL>/HelloWorld
 * [new branch]      develop    -> origin/develop
 * [new branch]      master     -> origin/master
```

次に`git checkout develop`でチェックアウトします。
ローカルリポジトリにdevelopブランチが作成されて自動で切り替わります。

```shell-session
$ git checkout develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/277868/c8f5e10c-0b8a-4b38-1b38-3a0405f72565.png)

# ソースを追加してpush
とりあえず.NET Coreのコンソールアプリを作成してpushしてみました。

`dotnet new console`でコンソールアプリを作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277868/0b6c9687-9801-fa82-4a92-994b52567d3c.png)
コンソールに`Hello World!`と表示するだけのアプリが作成されます。

- .vscode
- bin
- obj

はコミットする必要がないので.gitignoreを作成しておきます。

```config:.gitignore
.vscode/
bin/
obj/
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/277868/8df9ba36-682d-a571-9a40-c15756c128be.png)
画像の3ファイルのみになるのでコミットします。

コミットしたらプッシュをクリックします。
githubのユーザー名とパスワードの入力を求められるので入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277868/b8acea80-6faf-f34d-3e92-4a27e135c696.png)
githubのほうにもファイルが追加されているのが確認できました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277868/5ef108a8-087f-0192-ca96-ee6b3282e9cb.png)

# 追記
毎回パスワード入れるのは面倒なのでこの後ssh接続に変えてますが記事にはしません。
sshへの変更についてはこちらを参考にさせていただきました。
[git パスワード を毎回聞かれる問題の解決方法](https://qiita.com/rorensu2236/items/df7d4c2cf621eeddd468)
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
WebKit View(WKWebView) を実装

#はじめに
本日から、メモの代わりに勉強した内容を投稿していこうと思います。

#内容
WKWebViewを使用してGoogleのトップページを表示する。

#流れ
1. プロジェクトの作成
2. Storyboardを編集
3. ViewContollerに追記
4. ビルド

##1.プロジェクトの作成
・"Create a new Xcode project"を選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/d9b041de-ecbe-8c35-0a22-ecdaec96da25.png" width=80% height=80%>

・"Single View App"を選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/e0c0b729-bdc8-4dc1-b085-964911a5eb00.png" width=80% height=80%>

・プロジェクトの情報を入力
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/bac73af1-b1fd-8a73-184c-b40715ec7fa1.png" width=80% height=80%>

・"Nest"→プロジェクトを保存するフォルダを選択して"Create"

##2. Storyboardを編集
###WebKit Viewを追加
・"Library"を選択した後、"WebKit View"を選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/fea81c18-ba22-95b4-2976-8bb5c8f4213e.png" width=80% height=80%>

###AutoLayout
・ドラッグ&ドロップで"View Contoroller"に追加

・"Web View"を選択して、"AutoLayout"を設定
・上、下、右、左の空白を0に設定し、"Add 4 Constraints"を選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/04890fbe-ac93-d58d-f034-c61f5111bd20.png" width=80% height=80%>

##3.ViewContollerに追記
###Outlet接続
・"Show the Assistant editor"を選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/b083b21a-14ed-a791-51be-6bfef07818c8.png" width=80% height=80%>

・"Web View"を選択し、controlキーを押しながら任意の場所にドラッグ&ドロップ
・変数名を入力し、"Connect"を押す

<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/d0872d9a-9a17-470b-0899-d5ed886fb5cf.png" width=80% height=80%>

###URLの取得＆Webページの表示
・URLがnilだった時の対策として、if文を使用
・loadリクエストでURLを表示

```swift
class ViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let url = NSURL(string: "https://www.google.com") {
            let request = NSURLRequest(url: url as URL)
            webView.load(request as URLRequest)
        }
    }
}
```

#4.ビルド
・ビルドボタンを押す
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/c285fccf-6846-bfdd-96d6-5b8e11cdecb9.png" width=80% height=80%>

・この状態でビルドすると、"Thread 1: signal SIGABRT"というエラーが出る
・これは"WebKit"のフレームワークが無いために発生するので、プロジェクト→"General"→"Linked Frameworks and Libraries"内の＋を選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/d3205990-b62b-7caa-da41-792460d191a5.png" width=80% height=80%>

・"WebKit.framework"を選択し、"Add"を押す
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/bc9d1736-3f74-a264-a350-8f1ed3f2f991.png" width=50% height=50%>

・そして、もう一度ビルドボタンを押す
<img src="https://qiita-image-store.s3.amazonaws.com/0/388925/dfd0eb38-d495-4735-be2d-48824e5cc33b.png" width=30% height=30%>

できた！

#参考URL
📱SwiftでTableViewを使ってみよう
https://qiita.com/TD3P/items/cafa8e20029047993025
↑初めてだったので書き方を参考にさせて頂きました。
Terraformを使ってLambdaLayerをデプロイしてみる。

Terraformを使って、Lambdalayer(Python3.6)のデプロイを行いました。

# 出来上がったのがこちら

## ファイル構成

```
├── main.tf
└── requirements
    └── commonlib.txt
```

## main.tf

```
provider "aws" {
    region = "ap-northeast-1"
}
resource "null_resource" "pip_install" {
    provisioner "local-exec" {
        command = "pip2 install -r requirements/commonlib.txt -t ./python"
    }
}

data "archive_file" "libs" {
    depends_on = ["null_resource.pip_install"]
    type        = "zip"
    source_dir = "./python"
    output_path = "./common-lib.zip"
}

resource "aws_lambda_layer_version" "lambda_layer" {
    filename = "${data.archive_file.libs.output_path}"
    layer_name = "common-lib"

    compatible_runtimes = ["python3.6"]
}
```



## commonlib.txt

```
boto3
```

# 解説

`provisioner "local-exec"` を用いて、事前にローカル環境に`"pip2 install -r requirements/commonlib.txt -t ./python"`をコマンドの実行を行い`commonlib.txt`に書かれた内容をインストールします。

ただし`provisioner "local-exec"` はリソース内に記載しないと動作しません。
そこで`resource "null_resource"`を用いて空のリソース内でローカルコマンドの実行をします。

次に`data "archive_file"`にてLambdaLayerにアップロードするため対象ディレクトリをZIP圧縮します。
その際`depends_on = ["null_resource.pip_install"]`を用いて、PIP Installコマンドの実行後にZIP圧縮が行われるように調整します。

`resource "aws_lambda_layer_version" `にて対象ZIPファイルがアップロードされ、LambdaLayerが作成されます。

# まとめ
Terraformを用いると、1コマンド`terraform apply`にて、pip install から、LabmdaLayerの作成までが行えます。
大規模日本語ビジネスニュースコーパスを学習したBERT事前学習済（MeCab利用）モデルの紹介 

#はじめに
昨年、Google社から自然言語汎用言語モデル「BERT」が公開(※1)されてから、自然言語処理分野でのさらなる盛り上がりを感じているストックマークの森長です。
※1) https://github.com/google-research/bert

上記ページでは、BERTの事前学習済モデルやサンプルスクリプトが公開されていますので、気軽にBERTを利用することができ、大変ありがたいです！
しかし、日本語で利用してみたい場合、以下のハードルがあります。

- Google社から公開されている事前学習済モデルには、日本語専用モデルがなく、104言語で学習されたMultilingual(多言語)モデルを利用しなければならない。
- Multilingualモデルは、多言語対応のためかtokenizerがあまり日本語に適しているとは言えず、日本語文をトークン化した場合、トークンが文字単位ぐらいまで分割されてしまう。

そのため、上記ハードルをクリアするため、以下の方々がtokenizerを変更し、日本語に特化したBERTの事前学習モデルを公開してくれています。ありがとうございます！

-  [sentencepieceを用いて日本語Wikipediaで学習](https://yoheikikuta.github.io/bert-japanese/)
-  [sentencepieceを用いて大規模日本語SNSコーパスで学習](https://www.hottolink.co.jp/blog/20190311-2)
-  [Juman++を用いて日本語Wikipediaで学習](http://nlp.ist.i.kyoto-u.ac.jp/index.php?BERT%E6%97%A5%E6%9C%AC%E8%AA%9EPretrained%E3%83%A2%E3%83%87%E3%83%AB)

このように公開していただくことで、日本語自然言語処理の知見が日本全体で高まっていくと思います。そこで、弊社でも日本語向けのBERT事前学習済モデルを作成しておりますので、公開します。

#事前学習済モデルの特徴
弊社の事前学習済モデルの特徴としては、事前学習用データを日本語ビジネスニュース記事としていることがあげられます。そのため、ビジネスニュース特有の文章表現を事前学習しており、本モデルは、主にビジネスに関するドメインで効果を発揮します。

また、弊社では、tokenizerにMeCab + NEologdを利用して、文章をトークン化しています。MeCabを利用することで形態素として正しく分割されますので、単語単位の分析を行う固有表現抽出等のFine-tuning時の学習が容易になります。

事前学習済モデルの詳細は以下の通りです。

| 事前学習用データ | トークナイザー | 語彙数 | 
|:--|:--|:--|
|日本語ビジネスニュース記事(300万記事)| MeCab +  NEologd | 32,000語(CLS、SEP、UNK等除く) | 

#ダウンロード
[公式(TensorFlow)](https://github.com/google-research/bert)と[PyTorch版](https://github.com/huggingface/pytorch-pretrained-BERT)で利用可能なモデルを公開します。

[ダウンロードリンク](https://drive.google.com/drive/folders/1uHMNw8WcmNPK7ERQQ1Jq9-s0HTlm1do7?usp=sharing)
モデルの内訳は以下の通りです。

- TensorFLow版
 - bert_model.ckpt.meta、 bert_model.ckpt.index、 bert_model.ckpt.data-00000-of-00001
 - bert_config.json
 - vocab.txt
- PyTorch版
 - pytorch_model.bin
 - bert_config.json
 - vocab.txt

#利用方法
事前学習済モデルの使用にあたっては、TensorFlow版及びPyTorch版で公開されているサンプルスクリプトをどちらも利用可能ですが、ソースを以下のように修正してください。

- TokenizerのtokenizeメソッドをMeCab+NEologdでわかちした単語リストを返すように修正(もしくはクラスを継承して、tokenizeメソッドをオーバーライド)
- MeCabのみ(subword及びsentencepieceを未利用)のため、convert_tokens_to_ids関数(もしくはメソッド)にて、未知語があった場合は未知語に対して[UNK]のidである1を返すように修正

#まとめ
最後までお読みいただき、ありがとうございました。
公開したビジネスニュース向けのBERT事前学習済モデルが、自然言語処理の盛り上がりに更なる貢献ができると大変嬉しいです。

※弊社ではELMoの日本語事前学習済モデル(50万記事のビジネスニュースで学習)も公開しておりますので、ご興味があれば、以下ページをご覧ください。
https://stockmark.ai/2019/01/25/783
Use an 8px-by-8px grid

### はじめに
AppleのHuman Interface Guidelinesには、["Use an 8px-by-8px grid"](https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/image-size-and-resolution/)という記載がある。
その対応策についての日本語の記事が見つけられなかったので、自分なりに探ってみた。
結果として、大した解決策を提示している訳ではないが、情報がないよりは良いと思う。

### 8px-by-8px gridとは
8の倍数でUIをレイアウトするグリッドを設定すること。以下のサイトがわかりやすい。
[8の倍数でのブレークポイントとGrid Systemsの数学的アプローチ](https://nuconeco.net/8-multiple-grid-systems/)

### iOSのスクリーンサイズ
しかし、現在（2019.4.8）主流のデバイスのスクリーンサイズは@1xで375*667ptである。Xのデバイスもそれぞれ8の倍数のスクリーンサイズとはなっていない。スクリーンサイズを改めて確認すると、iPhone 5までは、8の倍数だった(参考：[The Ultimate Guide To iPhone Resolutions](https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions)）。その名残で、今でも8px-by-8px gridを推奨しているのかもしれない。

### 対応策
対策としては、以下のサイトに記載されているように、基本的に8ptをベースにマージン等を設定して、あとは成り行きで良さそうだ。もっと良い方法があれば、ご教示ください。
> Some screens have apparently difficult sizes to adjust for (the iPhone 6 is 375 x 667 points), but the solution is actually quite simple. Keep your padding and margin dimensions consistent and reduce/increase the size of the block element to fill the remaining space. It’s OK to have an oddly-sized element if it keeps the grid consistent. Keep in mind that your users will likely never see the actual measurements you use.
[The 8-Point Grid](https://spec.fm/specifics/8-pt-grid)
ABC - 044- A&B&C

#AtCoder ABC 044 A&B&C
[AtCoder - 044](https://atcoder.jp/contests/abc044)

#A問題

 - K泊までの金額とK+1泊の金額が違う
 - NがKより小さい場合はK+1白の金額は使わず


```java
	private void solveA() {
		int numN = nextInt();
		int numK = nextInt();
		int numX = nextInt();
		int numY = nextInt();

		long res = 0;
		if (numN < numK) {
			res += numN * numX;
		} else {
			res += numK * numX + (numN - numK) * numY;
		}

		out.println(res);
	}
```

#A問題：ループ

 こちらの方が解法としては奇麗かな。。。

```java
	private void solveA2() {
		int numN = nextInt();
		int numK = nextInt();
		int numX = nextInt();
		int numY = nextInt();

		long res = 0;
		for (int i = 1; i <= Math.min(numN, numK); i++) {
			res += numX;
		}
		for (int i = numK + 1; i <= numN; i++) {
			res += numY;
		}

		out.println(res);
	}
```

#B問題

 - 全ての文字数が偶数回出現していればOK

```java
	private void solveB() {
		String[] wk = next().split("");
		Map<String, Integer> res = Arrays.stream(wk).collect(() -> new HashMap<String, Integer>(),
				(t, i) -> {
					t.merge(i, 1, (oldV, newV) -> oldV + newV);
				},
				(t, u) -> {
					t.putAll(u);
				});

		boolean isJudge = true;
		for (Integer resV : res.values()) {
			if (resV % 2 != 0) {
				isJudge = false;
			}
		}

		out.println(isJudge ? "Yes" : "No");
	}
```

#C問題：部分解法version（満点取れてません）

 - マスクを利用して全探索を行っています
    - resultはTLEだけど、実際にはマスクが桁あふれするためN=50はマスクを生成しても対応できません。。。

```java
	/*
	 * 部分解法バージョン
	 */
	private void solveC2() {
		int numN = nextInt();
		int numA = nextInt();
		int[] wk = IntStream.range(0, numN).map(i -> nextInt()).toArray();
		out.println(chkC2(wk, numA, numN));
	}

	private long chkC2(final int[] wk, final int numA, final int numN) {

		long res = 0;
		/*
		 * このマスクだと2^50対応できないので、最初から部分点狙い。。。
		 */
		int max = (int) Math.pow(2, numN);

		/*
		 * マスク数分ループ
		 */
		for (int i = 1; i < max; i++) {
			int[] mask = new int[numN];
			int bit = i;
			int cnt = 0;
			//マスク生成
			while (bit != 0) {
				mask[cnt] = bit % 2;
				bit /= 2;
				cnt++;
			}
			long temp = 0;
			int maskCnt = 0;
			for (int j = 0; j < numN; j++) {
				//マスク対象の場合はカウントアップ+tempにも足す
				if (mask[j] == 1) {
					maskCnt++;
					temp += wk[j];
				}
			}
			//			if (((temp * 10) / maskCnt) % 10 == 0 && (temp * 10) / (maskCnt * 10) == numA) {
			if (temp == numA * maskCnt) {
				//				System.out.println("temp : " + temp + " / maskCnt : " + maskCnt);
				//				System.out.println(Arrays.toString(mask));
				res++;
			}
		}
		return res;
	}
```
[enebular使ってみた]AlexaとLINE Notifyを使って ヒモ生活をアップデート

＊こちらの記事は3/25のenebular meetupでの発表内容です。

ある日、僕はふと思ったのです。

###「動きたくない」

屋根の上で寝てる猫やソファの上に寝ている犬のようになりたい。
そんなことを夢見る日々ですw

巷では
「AIとかロボティクスとか発展して、人の仕事は無くなる」とよく聞きますね。
働かなくていいのでいいなら働かなくていいじゃないか、と思うわけです。

と、いうことでできるだけ動かなくなってみよう

###ある日の午前10時
![enebular0325.003.jpeg](https://qiita-image-store.s3.amazonaws.com/0/280415/6ffb62cb-b9b9-5f30-80ea-41a9090be4db.jpeg)

###その午後は、、
![enebular0325.004.jpeg](https://qiita-image-store.s3.amazonaws.com/0/280415/f00c8fd9-2715-7dd6-c2ca-9c4c798bcb6e.jpeg)


見事に動かないで生活してやりました!!!
ここまで、何もしないヒモ生活を送ると、あることに気づいたんです。

![enebular0325.005.jpeg](https://qiita-image-store.s3.amazonaws.com/0/280415/f5957a6a-e8ff-863f-9f18-5f5fe73f3687.jpeg)

うん。スマホを持つのってめんどくさい！！！
だって、スマホって意外に重いんですよ！？

ただ、動きたくないからといっても腹は減ります。喉が乾くとコーラも飲みたくなります。
そこで、思いついたのがこのサービス！！


![enebular0325.003.jpeg](https://qiita-image-store.s3.amazonaws.com/0/280415/a3fa268f-4e88-3e58-61c0-34d6c3e8b9f0.jpeg)


実際のデモ動画を見てみましょう。


これで、汎用人型お使い機である彼女に通知が行くんです。（通知画像）
スマホもなく、コーラを注文できるんです。

![enebular0325.006.jpeg](https://qiita-image-store.s3.amazonaws.com/0/280415/5da38502-8dd0-5883-fe53-68276b36d808.jpeg)


Enebulararのフロー図はこんな形です。
![enebular0325.007.jpeg](https://qiita-image-store.s3.amazonaws.com/0/280415/4685b2d3-82d1-a215-bb13-ccc37587b42a.jpeg)


これで完成です。
これで、コーラを頼むときは、スマホなしで頼めます。
また、頼んだ相手は彼女なので自分が寝ているソファまで持ってきてくれます。そしてなんと代金は彼女持ち！
###ここまではamazonもuberにもできません。
正にヒモ生活の第二段階、ヒモのアップデート、HIMO2.0の生き方です。
それが、


![enebular0325.003.jpeg](https://qiita-image-store.s3.amazonaws.com/0/280415/a3fa268f-4e88-3e58-61c0-34d6c3e8b9f0.jpeg)



＊この記事と同じことをやって彼女にフラれても一切責任は負いません。
マイグレーションファイル名を変更したい

#マイグレーションファイル名を変更したい

##手順

1,対象のマイグレーションファイルのバージョンをdown(適用前にする）

```
rails db:migrate:down VERSION=20190323151420
```

2,ファイル名と、ファイル内のクラス名を書き換える

3,再度適用

```
rails db:migrate
```

で出来る。
PHPの共変戻り値と反変パラメーターのRFC

PHPには共変戻り値（返り値）と反変パラメーター（引数）の機能がある。

http://php.net/migration72.new-features

> ```php
> <?php
>
> function test(object $obj) : object
> {
>     return new SplQueue();
> }
> 
> test(new StdClass());
> ```

とは言っても、インターフェースを使ってサブクラスで戻り値を具象化するようなことはできなかった。

https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters

> ```php
> interface Factory {
>     function make(): object;
> }
> 
> class UserFactory implements Factory {
>     function make(): User;
> }
> ```

こういうことを出来るようにするRFC。

新機能に反変とか共変とか書いていたからてっきり出来るものだと思っていたらエラーになった。
Status は Accepted になっているけれど実装はいつだろう。
時々しか使わないけれど、この影響で継承やインターフェースを使うクラスだけ型を書かないというような状況になってしまうんだよね。
インターフェースを使うには型を緩くしないといけないとか本末転倒な感じがある。
pipenv でパッケージを条件つけてインストール

特定の環境下でのみパッケージをインストールしたい

例えば pillow を linux でのみインストールしたいときは下記のように記述する

```
[package]
requests = "*"
pillow = {version = "*", sys_platform = "== 'linux'"}
```

条件は複数指定することができる

```
pillow = {version = "*", markers="sys_platform == 'linux' or python_version > '3.4'"}
```

指定できる項目はこちら
https://www.python.org/dev/peps/pep-0508/#id23

## 参考
https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#specifying-basically-anything
取得 UITextField 預設 placeholder 的顏色 （算是未完成）

從以前開始關於這個 placeholder 的顏色眾說紛紜
雖然說看起來像是「淡灰色」，但是實際上感覺又是有點偏藍的顏色

最近幫 UITextView 加上 placeholder 的 extension
就決定來看看他到底是什麼顏色，
然後幫他寫個擴充

## 網路上說的顏色

- https://stackoverflow.com/q/31057746/1583560

光這一串就超多說法 XDD

裡面有一個算是最接近

``` swift
UIColor(red: 0, green: 0, blue: 0.0980392, alpha: 0.22)
```

恩，果然是藍色！
但是實際用了之後還是有點差別：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/41979/0fe3c0d4-bd5e-ff04-1b99-6c006f7b951d.png)

下面的明顯地稍微深了一點點
果然還是不行

## 那就直接拿 UITextFieldView 的 placeholder 來用吧

很可惜不管怎麼拿無法直接拿到這個值
如果真的有的話請留言告訴我 :pray:

### 先下中斷點看值

``` swift
let textField = UITextField()
textField.placeholder = "dummy"
var range = NSRange(location: 0, length: 1)
let color = textField.attributedPlaceholder?.attribute(.foregroundColor,
                                                       at: 0,
                                                       effectiveRange: &range) as? UIColor
```

在 iOS 12.1 的時候這個 `color` 長這樣：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/41979/112b8011-f35f-8f0f-7603-7c614b98a9b1.png)

holy!! XDD

所以上面提到的 `0.0980392` 其實已經近似值了只是實際上已經到小數點下不知道幾位去了（笑）

這時候就出現兩的選項了

① 把那個小數點以下不知道幾位的數值做成一個 UIColor 常數
② 直接拿這個 UIColor 來用

後來我選了 ② ，原因是不知道哪個版本他的 placeholder 可能又會偷偷改；拿這個顏色需要的初始化成本也不會很高所以就用下去了！

## 成果

於是把它寫成 UITextField 的 extension ，要取用會比較直觀方便

``` swift
//
//  UITextField+Extensions.swift
//  Written in Swift 4.2
//

import UIKit

extension UITextField {
    // 這樣寫的話，整個 app 的生命週期這個方法只會被呼叫到一次而已
    static let defaultPlaceholderColor = fetchPlaceholderColor()
    
    private static func fetchPlaceholderColor() -> UIColor? {
        let textField = UITextField()
        textField.placeholder = "dummy"
        var range = NSRange(location: 0, length: 1)
        let color = textField.attributedPlaceholder?.attribute(.foregroundColor,
                                                               at: 0,
                                                               effectiveRange: &range) as? UIColor
        return color
    }
}
```

### 使用方法

因為我把它宣告成 static 變數 (or say class property) ，在使用的時候就只要這樣即可：

``` swift
let color = UITextField.defaultPlaceholderColor
```

## 成果

| Before | After |
|:---:|:---:|
| ![image.png](https://qiita-image-store.s3.amazonaws.com/0/41979/0fe3c0d4-bd5e-ff04-1b99-6c006f7b951d.png) | ![image.png](https://qiita-image-store.s3.amazonaws.com/0/41979/14a66419-e853-5954-e69e-978ebfefb4ee.png) |

雖然更接近了，但是不知道為什麼拉近仔細看但是還是有點微妙的差別（笑）
感覺還有另外加入其他 attributes ，再繼續挖挖看 XDDDDD
はじめての「Atomic Design」

「Atomic Design」についての備忘録です。
Code Gridの記事を参考にしています。「[Atomic DesignとCSS設計](https://app.codegrid.net/series/2017-atomic-design)」

## 概要

- 100ページ分のコーディングは10ページ分のコーディングに比べて10倍ではない
- 多数の画面で使われるUIを組みわせて作る

## UIの構造

- Atoms(原子)
- Molecules(分子)
- Organisms(組織)
- Templates(テンプレート)
- Pages(ページ)

### 各構造について

- あらゆるものが原子の集まりでできてるように、ページもAtomsの集まりである
- Atomsはこれ以上、分けられない単位のUIである
- Atomsが組み合わさっってMoleculesになる
- Moleculesが組み合わせってOrganismsとなる
- Organismsの集まりでページのフレームであるTemplateを作るが、そこには具体的なコンテンツの入ってない空っぽのページ枠組みである
- 具体的なテキストや画像を入れ込んでPagesを作る

## 導入の利点

- コンポーネント単体でクロスブラウザ対応、パフォーマンス、アクセシビリティをテストすることができる
- サイトに登場するUI群をまとめることで、不要なUI/共通化できるUIを整理することができる


## Vueに導入するときのディレクトリ構成

```
components
  /Atoms
    /A_title.vue
    /A_button.vue
    /A_label.vue
    /A_textField.vue
  /Molecules
    /M_list.vue
    /M_FormInput.vue
  /Organisms
    /O_selectionList.vue
    /O_Form.vue
  /Templates
    /hoge.vue
    /fuga.vue
  /Pages
    /hoge.vue
    /fuga.vue
```

## 参考

- [Atomic DesignとCSS設計](https://app.codegrid.net/series/2017-atomic-design)
- [Pattern Lab](https://patternlab.io/)
- [Chapter 2 Atomic Design Methodology - Atomic design is for user interfaces](http://atomicdesign.bradfrost.com/chapter-2/#atomic-design-is-for-user-interfaces)
- [AtomicDesignをVue.js(Nuxt.js）に使うと最高な開発を体験できた
](https://qiita.com/jakushin/items/e8b19f6a2c7bcd037573)
dockerでrails内に入るコマンド

ターミナルで**docker**下の**rails**のコマンドを打つと、長くなりとっても面倒↓
例：


```
$docker-compose exec rails ~
```

そうゆう時は以下のコマンドでコンテナの中に入ってしまえば上記のコマンドを省略することができる。

```
docker exec -it rails bash
```
Decodableの使い方

この記事ではCodableを使ったことがない人向けに、簡単なJSONをパースするサンプルコードを説明します。

※プロダクションでは`try!`せずに`guard`などで安全に処理してください

### Decodableとは
JSONを対応する型に変換する仕組み

###使い方
```sample.json
{
    "name": "Mario",
    "height": 165
}
```
```swift:Model
struct Model: Decodable {
    let name: String
    let height: Int
}
```
sample.jsonをModel型に変換する場合

```swift
let model = try! JSONDecoder().decode(Model.self, from: json)
```

####配列が含まれている場合
```sample.json
{
    "name": "Mario",
    "height": 165,
    "likes": ["Kinoko", "1UpKinoko", "FireFlower"]
}
```
```swift:Model
struct Model: Decodable {
    let name: String
    let height: Int
    let likes: [String]
}
```

####Enumに変換したい場合
```sample.json
{
    "name": "Mario",
    "height": 165,
    "likes": ["Kinoko", "1UpKinoko", "FireFlower"],
    "bloodType": "B"
}
```
```swift:Model
struct Model: Decodable {
    let name: String
    let height: Int
    let likes: [String]
    let bloodType: BloodType
    
    enum BloodType: String, Decodable {
        case a = "A"
        case b = "B"
        case o = "C"
        case ab = "AB"
    }
}
```

####配列の要素がオブジェクトの場合
```sample.json
{
    "name": "Mario",
    "height": 165,
    "likes": ["Kinoko", "1UpKinoko", "FireFlower"],
    "bloodType": "B",
    "enemy": [
        {
            "name": "Kuribo-"
        },
        {
            "name": "Nokonoko"
        },
        {
            "name": "Patapata"
        }
    ]
}
```
```swift:Model
struct Model: Decodable {
    let name: String
    let height: Int
    let likes: [String]
    let bloodType: BloodType
    let enemy: [Enemy]
    
    enum BloodType: String, Decodable {
        case a = "A"
        case b = "B"
        case o = "C"
        case ab = "AB"
    }
    
    struct Enemy: Decodable {
        let name: String
    }
}
```

####enemyの配列部分だけパース時に取り出して欲しい場合
```sample.json
{
    "name": "Mario",
    "height": 165,
    "likes": ["Kinoko", "1UpKinoko", "FireFlower"],
    "bloodType": "B",
    "enemy": [
        {
            "name": "Kuribo-"
        },
        {
            "name": "Nokonoko"
        },
        {
            "name": "Patapata"
        }
    ]
}
```
```swift:Model
struct Model: Decodable {
    let enemy: [Enemy]
    
    enum BloodType: String, Decodable {
        case a = "A"
        case b = "B"
        case o = "C"
        case ab = "AB"
    }
    
    struct Enemy: Decodable {
        let name: String
    }
    
    enum CodingKeys: CodingKey {
        case name
        case height
        case likes
        case bloodType
        case enemy
    }
    
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        self.enemy = try values.decode([Enemy].self, forKey: .enemy)
    }
}
```
ここの自作`Decoder`の手順です
1, JSONが`CodingKeys`のキー名で全て正常に取り出せるか
2, 取り出せたものに対してキー名`enemy`でアクセスしそのバリューが`[Enemy]`型で取り出せるか
3, 正常に[Enemy]型で取り出せたら自分のプロパティを初期化してパース成功！！
CircleCIで指定したブランチをデプロイする


config.ymlでブランチを指定できます。
config.ymlがmasterに反映されていなくても動作します。
CircleCIに移行するときに移行用のブランチを作って、そのブランチだけビルドしたい時などにも使用できます。

```yaml:config.yml
version: 2
jobs:
  build:
    branches:
      only:
        - circleci // デプロイしたいブランチ
```


参考
https://circleci.com/docs/2.0/configuration-reference/#branches
psycopg2をローカルでもAWS Lambda上でも同じように使う

# psycopg2とは
Python上でのPostgreSQLのクライアントです。

PostgreSQL + Pythonだったらたぶん一番有名なやつ。

Amazon RDSのAmazon Aurora, PostgreSQLを扱うのにも使えたりします。

# 注意
そもそもLambda+RDSの相性はあまりよくないです。

[Lambda+RDSはアンチパターン - Qiita](https://qiita.com/teradonburi/items/86400ea82a65699672ad)

[なぜAWS LambdaとRDBMSの相性が悪いかを簡単に説明する - Sweet Escape](https://www.keisuke69.net/entry/2017/06/21/121501)


仕様的にコネクションを多くとらない場合を想定してます。

# やりたいこと

Pythonを動かすLambda上でpsycopg2を使いたい。

# 問題点

ローカル上ではpsycopg2は普通に`pip install`すれば使えます。
Lambda上で動かすとなると、zipにしてあげるなりいい感じにCodestarとかを使ってPipelineを敷いてあげて普通のPythonのライブラリをLambda上で使うようにすればいいんじゃね？ってなります。

**ただそれだとpsycopg2は動きません**

[python 3\.x \- ImportError: No module named 'psycopg2\.\_psycopg' \- Stack Overflow](https://stackoverflow.com/questions/36103034/importerror-no-module-named-psycopg2-psycopg)


# 対策

そんなことを解決してくれるLambda用のpsycopg2があります。

https://github.com/jkehler/awslambda-psycopg2

Python 3.6でLambdaを動かしている場合はこのリポジトリのpycopg2-3.6の名前を`pycopg2`に変え、プロジェクトにコピーすれば`import pycopg2`したらそっちを見にいってくれます。


# 対策+α ローカルでもLambda上でも動かしたい

ただ以上の対策だと、ローカル上で動かなくなります。

なので環境変数で`EXEC_LOCAL`を用意してあげて、読み込む先を変えてあげるとどっちでも動くようになります。

※ Lambda上では`EXEC_LOCAL = 0`, ローカル上では`EXEC_LOCAL = 1`に設定すること前提です。
※ Lambda用のpsycopg2を`aws_lib`ディレクトリの中に入れてあげてます。

```py
if os.getenv("EXEC_LOCAL") == "0":
    sys.path.append(os.path.join(os.path.dirname(__file__), './aws_lib'))
import psycopg2
```
新機能フォロー（Spring ’19）

[Salesforce Spring ’19 リリース](https://releasenotes.docs.salesforce.com/ja-jp/spring19/release-notes/salesforce_release_notes.htm)に私が気になった新機能をメモしました。
#1.新規Apexクラス(OrgLimit、OrgLimits)
```　確認ソース.
String strTemplate = '制限の名前:{0}, 制限の最大値:{1}, 使用制限値:{2}';
List<System.OrgLimit> orgLimitList = OrgLimits.getAll();
for (System.OrgLimit orgLimit : orgLimitList) {
    List<Object> paramList = new List<Object>();
    paramList.add(orgLimit.getName());
    paramList.add(orgLimit.getLimit());
    paramList.add(orgLimit.getValue());
    system.debug(String.format(strTemplate, paramList));
}
```
**【メモ】**
`・System.OrgLimits：組織制限取得`
`・System.Limits：ガバナー制限取得`

#2.新規Apexメソッド(sObject.isSet)
``` 確認ソース.
// sObjectインスタンスに該当項目が設定されるかどうか判定
// ・設定済の場合、「true」
// ・未設定の場合、「false」

//【new sObject作成】
Contact  c = new Contact(LastName = 'xwz');
System.assertEquals(true, c.isSet('LastName'));
System.assertEquals(false, c.isSet('FirstName'));
c.firstName = null;
System.assertEquals(true, c.isSet('FirstName'));

// 【SOQLからsObject作成】
Contact  newContact = new Contact(LastName = 'xwz');
insert(newContact);
Contact c = [SELECT FirstName FROM Contact WHERE Id = :newContact.Id];
System.assertEquals(true, c.isSet(Contact.FirstName));
System.assertEquals(false, c.isSet(Contact.LastName));
```
**【メモ】**
sObject.isSetを使うと、下記のシステムエラーを退避できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/332907/486e258d-d36f-3529-de8d-63bc1671c22e.png)
#3.以下の新機能は[讃岐さんの記事](https://qiita.com/isanuki/items/e9fcc538b8685f5a417b)をご参照ください。
- カスタムヘルプセクション
- リストビューのデフォルト固定
- レコードの印刷ページ
- データストレージの増加
- 項目履歴の保持期間を厳格化
- 商品追加画面の改善
- 公開カレンダー表示
- カスタマイザブル売上予測の廃止
- レポートのカラム横幅設定
- 12列ダッシュボード
- Chatter投稿にハイパーリンクを追加
- 新しくなったフロービルダー
- 権限セットの入れ子(Pilot)
- Lightning Object Creater
- アプリケーションに基づいたホーム切り替え
- 項目の利用箇所を洗い出す(beta)
- Lightning Web Components
- 項目レベルセキュリティを適用するSOQL(beta)
- Sandboxを基にしたSandbox作成
- 新規Apexメソッド(sObject.isSet(fieldName)、 sObject.isSet(field))
CODE COMPLETE (上) -第1部 基礎を固める ②-

自分の理解を深めるために投稿します。
## 第2章：ソフトウェア開発への理解を深めるメタファ
**メタファ = たとえ**
ソフトウェア開発とは何かをより明確にしたい人はこの章を参考にすると良い

### メタファの重要性
メタファによって科学は発展してきた

[例]

- 気体の力学理論 ←「ビリヤード球」モデル
- 光の波動理論 ←音の特性

知らないものを知っているものから理解しようと試みるやり方
ただし、メタファを広げすぎると失敗する

[例]

- エーテル(光を伝える媒体) ← 空気(音を伝える媒体)

結局エーテルなんてものは発見されなかった

メタファには**良いメタファ**と**悪いメタファ**がある
ソフトウェア開発の理解 = 良いメタファと悪いメタファのきちんとした理解、と言える

### ソフトウェアメタファの使用法
ソフトウェアメタファ = サーチライトのようなもの

- 答えは教えてくれないが、道を照らしてくれる
- どこで答えが見つかるかは教えてくれないが、**どうすれば見つかるかを教えてくれる**

1行1行の間違いやより良い書き方を明確に提示してくれるものではない

ではどうやって使えば良いか?

- プログラミング上の問題やプロセスを見極めるような使い方
- プログラミング上のアクティビティについて考え、**どうすれば物事がもっとうまくできるのか**を考えるのに役立てる


### 一般的なソフトウェアメタファ
- コードを書く
  - 最初から捨てるつもりで書く、という考えは相応しくない


- システムを育てる
  - インクリメンタルな考え方は良いが…
  - 天候が良くて秋が来たら大豊作になる農場のようなモデルでは、ソフトウェア開発方法をうまく説明しきれない


- **システムのアクリーション(蓄積・成長)**
  - インクリメンタル型開発のイメージに合っている


- **ソフトウェアコンストラクション(構築)**
  - 書く・育てるよりもソフトウェア開発に合った表現
  - たとえば建造物の建築に当てはめると、設計の大切さがよく分かるようになる


- **知的道具箱**
  - 全てのプログラマが色々な道具を持ってはいるが、それらは全て万能ではない、ということを指摘できる

### まとめ
- メタファ(たとえ)はうまく使うと物事の理解に役立つ
- ソフトウェアを的確に言い表したメタファで代表的なものは、
  - システムのアクリーション
  - ソフトウェアコンストラクション
  - 知的道具箱
  と言ったところか
- メタファも所詮**道具箱の中身の１つ**なので、使い方を誤らないように、**うまく組み合わせて**使うと良い
pgBadgerを使ってPostgreSQLの遅いクエリーを可視化する

本稿では、PostgreSQLのログファイルを解析して、HTML形式のレポートを出力するCLIツール[pgBadger]を用い、PostgreSQLのスロークエリの分析方法を紹介する。pgBadgerのインストールからレポートの閲覧方法まで手順に説明していくので、上から順に読んでもらえれば思う。

[pgBadger]: http://pgbadger.darold.net/index.html

pgBadgerがどんなレポートを出すのかをまず知りたい人は[レポートのデモ](http://pgbadger.darold.net/samplev7.html#normalized-slowest-queries)を御覧ください。

## pgBadgerのインストール方法

Homebrewで入れる:

```
brew install pgbadger
```

## PostgreSQLの設定

ログを収集するようためにpostgresql.confに次の設定を書く:

```conf:postgresql.conf
log_destination = 'stderr'
logging_collector = on
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d '
log_statement = 'none'
log_duration = off
log_min_duration_statement = 0
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_temp_files = 0
lc_messages = 'C'
```

## Docker Composeの設定

上の設定ファイルを作ったら、postgres自体は、`postgres -c 'config_file=/etc/postgresql/postgresql.conf'`で起動すればいい。これでログが収集されるようになる。

Docker Composeでpostgresを起動している場合は、次のような設定にしておく:

```yaml:docker-compose.yml
  db:
    image: postgres:9.6.4
    command: postgres -c 'config_file=/etc/postgresql/postgresql.conf' # postgresql.confを読み込ませる
    volumes:
      - ./postgresql.conf:/etc/postgresql/postgresql.conf
      - ./postgresql-logs:/var/lib/postgresql/data/pg_log # ログファイルの書き出し先ディレクトリをマウント
```

## アプリを動かしてログをためる

クエリログを集めるために、実際にアプリを動かし、ログを集めていく。しばらくすると、ログファイルがいくつかできる:

```
$ ls -1 ./postgresql-logs/pg_log
postgresql-2019-04-05_082713.log
postgresql-2019-04-05_082801.log
postgresql-2019-04-05_082819.log
postgresql-2019-04-05_082840.log
postgresql-2019-04-05_082900.log
postgresql-2019-04-05_082914.log
```

## pgBadgerにログを食わせる

集められたログファイルを`pgbadger`コマンドの引数に指定して実行する。

```
pgbadger postgresql-logs/pg_log/postgresql-2019-04-05_08*
```

そうすると、`out.html`が生成される。これをブラウザで開く。

## スロークエリーのレポートを開く

out.htmlを開いたら、メニューの「Top」→「Slowest Indivisual queries」を開く。

<img width="1431" alt="Screen_Shot_2019-04-08_at_10_45_56.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/96a128ce-a619-05c3-4f4d-0e7b51f98d1b.png">

ここには、遅い順に個々のクエリが表示される。

値を一般化したクエリで遅いものを知りたいときは「Normalized slowest queries」を見てみると良い。「Normalized slowest queries」は同じ形のクエリが何回発行されたかの回数も分かるようになっている。

## 参考

* [pgBadger Documentation](http://pgbadger.darold.net/documentation.html)
【SQLDeveloper】クエリの出力結果をヘッダーごとコピー

##クエリの出力結果をヘッダーごとコピー
SQLの出力結果を項目名と出力結果まとめてコピーして、Excelなどに貼り付ける方法です。

①SQLを実行
②出力結果画面で「Ctrl + A」
③「Ctrl + Shift + C」でヘッダーごとコピー
④Excelなどで「Ctrl + V」
bundle installでPlease add the following to your Devise initializer: (RuntimeError)と表示されたとき

Deviseを使用しているプロジェクトをcloneしてbundle installを実行した時、以下のようなエラーが表示された。

```
Devise.secret_key was not set. Please add the following to your Devise initializer: (RuntimeError)
```

元々のプロジェクト自体作成したばかりで、イニシャライザーなんて特にいじった記憶ないんだけどな...うーん。
と思ってたら、末尾に以下のような文が。

```
Please ensure you restarted your application after installing Devise or setting the key.
```

Deviseをインストール、もしくはキーを設定した後にアプリ再起動しろと。
キー設定っていうのがよくわからんけど、とりあえずrailsサーバを落としてから再度rails sを実行すると通った。

調べてみるとDeviseの設定はアプリ再起動しないと読み込みが行われないらしく、おそらくそのあたりが原因かもしれない。
Emacs：複数のテーマを切り替えて使う

Emacsを快適に使うためにいろいろ自分好みのテーマを模索しますね。私の場合は、deeper-blue, misterioso, material と変遷し、今は doom-dracula を使っています。

それぞれ特徴があり、コードを書く時、文章を書く時等々、その時々で気分転換を兼ねて切り替えて使えたら面白いと思ってググってみたところ、下記サイトのQ&Aで面白いTipsを見つけたので試して見ました。結構快適で愉しいのでご紹介します。

* [stack-overflow](https://stackoverflow.com/questions/23793288/cycle-custom-themes-w-emacs-24)

## 設定 ##

``` emacs-lisp
(setq my-themes (list 'doom-dracula 'material 'misterioso 'deeper-blue)) 
(setq curr-theme my-themes)
(defun my-theme-cycle ()
  "Cycle custom theme."
    (interactive)
    (disable-theme (car curr-theme)) 
    (setq curr-theme (cdr curr-theme))
    (if (null curr-theme) (setq curr-theme my-themes))
    (load-theme (car curr-theme) t)
    (message "%s" (car curr-theme)))
(global-set-key [f7] 'my-theme-cycle)
(setq curr-theme my-themes)
(load-theme (car curr-theme) t)

```
VL版 Office 2019 をインストールした件

VL版 Office 2019のインストールは今までの方法と異なり，xmlファイルを作成し，DOS窓でコマンドラインを使用する必要がある．[こちら](https://docs.microsoft.com/ja-jp/deployoffice/office2019/deploy)に方法が記述してあったが分かりづらかったので備忘録を兼ねて

#Office Deployment Toolのダウンロード
[Microsoft Download Center](https://www.microsoft.com/en-us/download/details.aspx?id=49117)からダウンロードを行い，適当なフォルダに展開する．

#xmlファイルの作成
メモ帳などを使いxmlファイル(configuration.xml)を作成する．
今回は64bitのOffice Professional Plus 2019をインストールするため，下記のような内容のファイルを作成した．


```XML:configuration.xml
<Configuration>
  <Add OfficeClientEdition="64" Channel="PerpetualVL2019">
    <Product ID="ProPlus2019Volume" >
      <Language ID="ja-jp" />
    </Product>
  </Add>
</Configuration>
```

32bitの場合は，OfficeClientEditionの64を32に変える．
Office Standard 2019の場合は，Product IDをStandard2019Volumeにする．
Office Professional Plus 2019およびOffice Standard 2019のインストールでは，Add要素のChannel属性に`Monthly`や`Broad`は使えない([こちら](https://docs.microsoft.com/ja-jp/deployoffice/office2019/update)に記述あり)．そのため，`PerpetualVL2019`を指定する．

作成したファイルを先ほどOffice Deployment Toolを展開したフォルダに保存する．

#Office 2019のインストール
DOS窓を管理者権限で実行し，作成したxmlファイルなどが存在するフォルダに移動後，以下のコマンドを実行する．

```
setup.exe /configure configuration.xml
```

これでインストールは完了
最後に，ライセンス認証はまだなので忘れずに
Curl: GitHub で GraphQL を使う

GitHub で GraphQL を使う方法です。
次のページを参考にしました。
[GraphQL入門 - 使いたくなるGraphQL](https://qiita.com/bananaumai/items/3eb77a67102f53e8a1ad)

<ol>
<li> GitHub にログインして、アクセストークンを作成します。</li>
方法は次のページで説明されています。
[Creating a personal access token for the command line](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line)

<li> ログインID　からユーザー名を取得します。</li>
　私の ekzemplaro を例に取ります。

```bash:get_name.sh
#! /bin/bash
#
#       get_name.sh
#
#                                               Apr/8/2019
# 
ACCESS_TOKEN="*******your_access_token**********"
#
URL="https://api.github.com/graphql"
#
curl -H "Authorization: bearer "$ACCESS_TOKEN -X POST -d@query.json $URL
#
```

```json:query.json
{
 "query": "query { user(login: \"ekzemplaro\") { name }}"
}
```

実行結果

```text
$ ./get_name.sh 
{"data":{"user":{"name":"Uchida Masatomo"}}}
```

<li> クエリーをもう少し複雑にしてみます。</li>

```json:query02.json
{
 "query": "query { user(login: \"ekzemplaro\") { name location url }}"
}
```

実行結果

```json
{
  "data": {
    "user": {
      "name": "Uchida Masatomo",
      "location": "Tochigi,Japan",
      "url": "https://github.com/ekzemplaro"
    }
  }
}
```

<li> クエリーを変更します。</li>

```json:query03.json
{
 "query": "query {viewer {
    repositories(first: 1) { edges { node { name description } } }
    }
  }"
}
```

実行結果

```json
{
  "data": {
    "viewer": {
      "repositories": {
        "edges": [
          {
            "node": {
              "name": "librivox_catalog",
              "description": "LibriVox's catalog page"
            }
          }
        ]
      }
    }
  }
}
```

<li> 最新２つのリボジトリーを取得してみます。</li>

```json:query04.json
{
 "query": "query {viewer {
repositories(last: 2) { edges { node { name description } } }
    }
  }"
}
```

実行結果

```json
{
  "data": {
    "viewer": {
      "repositories": {
        "edges": [
          {
            "node": {
              "name": "django_plural_table",
              "description": "Django sample"
            }
          },
          {
            "node": {
              "name": "django_member_shozoku",
              "description": "Django Example"
            }
          }
        ]
      }
    }
  }
}
```

</ol>

## 確認したバージョン

```text
$ curl --version
curl 8.0.1 (x86_64-pc-linux-gnu) libcurl/8.0.1 OpenSSL/3.0.8 zlib/1.2.13 brotli/1.0.9 zstd/1.5.4 libidn2/2.3.4 libpsl/0.21.2 (+libidn2/2.3.4) libssh2/1.10.0 nghttp2/1.52.0
Release-Date: [unreleased]
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd
```


## 参考
[GitHub GraphQL API Explorer の使い方](https://qiita.com/ekzemplaro/items/e03d26d0e52480609571)
Azure Blob Storageのlifecycle managementを試してみる

Blob Storageのライフサイクル管理がGAされたので使い方を試してみました。
Blobストレージに保管されたオブジェクトを日数経過に伴って、クール層やアーカイブ層に移したり、削除したりといったことが可能な機能です。

# Blobストレージのアクセス層

ホット層、クール層、アーカイブ層は、オブジェクトの用途によって使い分けます。
アーカイブ層が一番価格が安いですが、その分Read/Writeしたときに発生する料金が高く設定されています。
監査用途などでとりあえず保管しておくものはアーカイブ層で、頻繁にアクセスがあるようなものはホット層という使い分けがよいですね。

それではライフサイクル管理機能をやってみましょー。

# ストレージアカウント作成

ホット層でストレージアカウントを作成します。
手順は割愛します。

# コンテナー作成

* ここでは[lifecycle]という名前でコンテナーを作成してます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6ddf612b-205c-7689-44f8-dfe9ecc1b1b9.png)

# ファイル格納

* [1st.txt]という名前でファイルをアップロードします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/73e85095-846d-aacb-e218-9c7bbd591b11.png)

# ライフサイクル管理設定

* [Blob service]の[ライフサイクル管理]を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e27609bd-64f7-0400-b75a-c8044b3b70aa.png)

* 以下のようにJSONで定義します。
    * prefixMatch   : 対象のコンテナー名を前方一致条件で指定します。
    * tierToCool    : 最後の変更から何日後にクール層に移動するか。今回は1日を設定してます。
    * tierToArchive : 最後の変更から何日後にアーカイブ層に移動するか。今回は2日を設定してます。
    * delete        : 最後の変更から何日後に削除するか。今回は3日を設定してます。

```
{
   "rules": [
     {
       "name": "lifeCycleTest",
       "enabled": true,
       "type": "Lifecycle",
       "definition": {
         "filters": {
           "blobTypes": [ "blockBlob" ],
           "prefixMatch": [ "lifecycle" ]
         },
         "actions": {
           "baseBlob": {
             "tierToCool": { "daysAfterModificationGreaterThan": 1 },
             "tierToArchive": { "daysAfterModificationGreaterThan": 2 },
             "delete": { "daysAfterModificationGreaterThan": 3 }
           }
         }
       }
     }
   ]
}
```

* 今回設定した内容では、1日後にクール層に移動して、2日後にアーカイブ層に移動して、3日後に削除されるはずです。

# テスト

正しく動作するかテストしてみます。

* 1日後。1st.txtがクール層に移ったことが確認できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1d33580e-2214-9e45-8746-53f136c243e4.png)

* 2日後。1st.txtがアーカイブ層に移ったことが確認できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/e05f927f-69c4-da8f-526d-30ced9182ca5.png)

* 3日後。1st.txtが削除されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/723acd98-9b84-bedf-a32c-90fac64690b3.png)

# まとめ
アクセス層の自動管理ができるのでコスト削減に役立ちますね。
移動されるタイミングは指定できないようですが、大体10時くらいに実行されていました。

コンテナー名はプレフィックス指定なので、今回の例でいうと、lifecycletestという名前のコンテナーがあった場合も対象になりますが、testlifecycleという名前のコンテナーは対象外になります。
Outlook > メール返信時にHTML形式を解除する > 手順: 書式設定の表示  | UI > [XXX]をクリックしたら表示されます > [XXX]をクリックしないとわからない + [XXX]が推測できない

```txt:動作環境
Windows 8.1 Pro (64bit) 
Outlook (Office 365)
```

### 書式設定が見つからない

https://support.live-style.jp/?p=3373#c19
> 2．『メッセージ』ウィンドウで、①【書式設定】を選択し、②で変更したい形式を選択します。

HTML形式を解除しようとしても「書式設定」がそもそも見つからない。

### 書式設定の表示

PC内のヘルプを参照(HTMLで検索)

> メッセージ形式を HTML、リッチ テキスト形式、またはテキストに変更する 
...
> 1.メッセージで、[返信]、[全員に返信]、または [転送] をクリックします。
> 2.閲覧ウィンドウで作業している場合は、[ポップアウト] をクリックします

[ポップアウト]をクリックしたら「書式設定」が表示されました。

### UI > 推測できない操作

- [XXX]をクリックしたら表示されます
    - [XXX]をクリックしないとわからない
    - ヘルプを見ないとわからない

**今回の問題は[XXX]の「ポップアウト」が操作の観点から推測できない点。**
「書式設定を表示したい」から「ポップアウトをクリックすればいい」とはならない (記憶していない限り）。

「推測できない操作」は可能な限り「推測できる操作」へ設計変更して実装することを、あらためて心に誓った。
Ruby技術者認定試験の勉強法＜2022年版＞

#はじめに
Ruby技術者認定試験制度は、Rubyベースのシステムを設計、開発、運用するエンジニア、Rubyでシステム提案を行うコンサルタント、Rubyを教える講師及びRubyを学ぶ学生などを対象とした認定試験制度です。認定者は、Ruby技術者としての技術力を公正に評価され、高い水準のRubyによるシステム開発能力を持つことを認定されます。

■公式HP
https://www.ruby.or.jp/ja/certification/examination/

#勉強方法
・古い記事でも紹介されている、書籍（［改訂2版］Ruby技術者認定試験合格教本（Silver/Gold対応）Ruby公式資格教科書）による勉強とあわせて、2022年現在は、下記のiPhoneアプリでの勉強方法がおすすめです。

***■RubyMate - Silver***
https://t.co/MNxpusCNrm

#最後に
この記事がRubyエンジニアを目指す皆様のお役に立てたら幸いです。
LeapMotionに使うのとき必要なもの

この記事は私LeapMotionを使ったの経験についてです。LeapMotionを始めに何か必要のものを共有したいです。
最初から何か必要なものをしなければなりません。
もし、質問とかご意見があったら、是非下にコメントしてください。
と間違えた日本語がある場合は申し訳ございませんでした。

# バックグラウンド
この記事は、LeapMotionでゲームを作りたい人。
LeapMotionのドキュメンテーションを読むすることがちょっと難しいと思います。文字が多いと簡単のガイドはありません。
そして、ドキュメンテーションから全部はVRのことです。もしVRのゲームを作りたいの場合なら、この記事にはそのガイドがありませんでした。
これは全部自分の経験からまとめます。いろいろな他のサイトもう調べました。

# 必要なもの
- LeapMotion (Leap Motion Orion 4.0.0)
- Unity (Unity 5.6.2, 2017.1-4, 2018.1.)

# すること
## 1) インストール
一番最初するのことはUnityインストールするのことです
([unity](https://store.unity.com/download?ref=personal))、このリンクをクリックするは、Unity Installerのダウンロードページです。
![capture.png](https://qiita-image-store.s3.amazonaws.com/0/293079/f03af4dd-f77b-d947-2817-7341e27d21b1.png)
Unityインストールあとは、次インストールしなければなりませんはLeapMotionのソフトウェアです。
([Leap Motion](https://www.leapmotion.com/setup/desktop/))、このリンクをクリックするは、Leap Motionのソフトウェアのダウンロードページです。
![capture.png](https://qiita-image-store.s3.amazonaws.com/0/293079/1f4aa21a-fe72-b105-42dd-b8caec116e70.png)

## 2) インポート
次のステップはUnity Packageのインポートです。でも最初はUnityのプロジェクトが必要ですからUnityプロジェクトを作ります。![capture.png](https://qiita-image-store.s3.amazonaws.com/0/293079/5e80594c-8008-9250-6c87-b30f28bc1165.png)
作ったあとUnityのメニューナビゲーションバーでAssetsというメニューをクリックします。クリックあとDropdownが表示します。そしてImport Packageをhoverする、他のメニューが出てきます。「Custom Package」というメニューがあります。
![capture.png](https://qiita-image-store.s3.amazonaws.com/0/293079/753d1b60-44ce-742c-f0d1-a05f54977c36.png)
([Leap Motion Package](https://developer.leapmotion.com/unity#5436356)),このリングは全部LeapMotionのPackageがあります。
- LeapMotion Core Assets 4.4.0 ->必要
「coreはデバイスから全部手のデータをUnityと繋ぎます。」
- LeapMotion Interaction Engine 1.2.0 ->必要
「Interaction Engineは手とゲーム中にのもののインタラクションです。例えばゲームの中に箱を移動したいの場合はInteraction Engineで使ったらもっと簡単になります。全部のコードも作ってがあります。すぐに使うことができます。」
- LeapMotion Hands Module 2.1.4 -> オプション
- LeapMotion Graphic Renderer -> オプション

インポートのあとは全部のものが「project」中にあります。
![capture.png](https://qiita-image-store.s3.amazonaws.com/0/293079/b9a9a7a5-a184-e49b-7af7-2ae20a701c95.png)



# ドキュメントリンク
- [Unity](https://unity.com/)
- [Leap Motion](https://www.leapmotion.com/)
- [Leap Motion Unity Packages](https://developer.leapmotion.com/unity#5436356)
- [Leap Motion Unity Modules Documentation](https://leapmotion.github.io/UnityModules/core.html)
- [Unreal Engine 4](https://www.unrealengine.com/en-US/) ー＞他のゲームエンジン
【BizRobo!】操作メモ(DesignStudio)

#この記事について
自分が研修で実際にBizRobo!に触れてみて分かったこと、気を付けようと思ったことをメモ帳代わりに記載しています。
(2019/05/10時点、気づき次第更新)

#ステップのエラー処理について
各ステップに設定できるエラー処理は以下の5通り(カッコは日本語版での表記)。

| Then | 処理内容 |
|:--|:-:|
|Skip Following Steps(後続のステップすべてをスキップ)|後続のステップをすべて無視(処理を終了させる)|
|Ignote and Continue(無視して続行)|そのステップを飛ばして次のステップへ進む(値取得だとその値を用いるステップでまたエラーが出る)|
|Try Next Altenative(次の代替手段を試行)|次のトライステップへ進む(処理するトライステップを指定する必要がある)|
|Next Iteration(次のイテレーション)|次のイテレーションへ進む(For Each～系のループ処理の中にいる場合、次のループへジャンプする)|
|Break Loop(ループ終了)|ループを抜ける(ループの回数を変数などで指定する場合に使う)|
※エラーになった理由に関わらず、そのステップが上手く進まなかったときは全て同じ処理を行う
　（というかエラー理由を判断できる方法がない）



#Test Valiables(変数を判定)での条件指定について
　値判定は指定した条件に合致する場合は次のステップへ進み、合致しない場合をエラーとして扱う
　（指定の値になったら異なる処理を行う(ループを抜ける、次のトライステップへ進む等)場合は、指定条件は
　　　現在の値 != 指定の値
　　となる(「!=」は値が等しくない状態を指すため、指定の値でない場合はTrueとなり次のステップへ進む)
　判定条件は複数指定できるが、その場合の条件がどの場合にTrueとするかは以下の4通りから選択する(Ifのボックス)
　　・No Conditions are Satisfied(いずれも条件を満たさない)
　　　→すべての条件に一致しない場合(NAND)
　　・Any Condition is Not Satisfied(いずれかの条件を満たさない)
　　　→一部の条件に一致しない場合(NOR)※デフォルト値
　　・Any Conditions is Satisfied(いずれかの条件を満たす)
　　　→一部の条件に一致する場合(OR)
　　・All Conditions are Satisfied(すべての条件を満たす)
　　　→すべての条件に一致する場合(AND)
　※Ifボックスの下に「Do」ボックスがあり、Trueの場合の処理を選択できるが
　　・エラー処理に指定された通り※デフォルト値
　　・後続のステップ全てをスキップ
　　の2通りとなっており、正直エラー処理タブで編集したほうができることが多いので触るのはあまりお勧めしない

#デザイン・デバッグ時に知っておいたほうがいい操作
#####Return Value(値返却)
　指定したタイミングでの変数(Typeファイル単位でも可)情報をデバッグ画面で表示する
　データ取得のループ等であれば、すべての値を変数に格納した後にこのステップを入れておくと
　上手く取れなかった値などがわかりやすい
#####Disable Step(ステップを無効化)
　値判定系のステップを入れると、その後続ステップは値判定がTrueの場合しか編集できないため
　該当の値判定ステップで右クリックし、「Disable Step(ステップを無効化)」にチェックを入れておくと、
　その処理が無効化されどんな値が入っていてもステップを編集できるようになる
　※ただしデザイン時のみ適用しておき、デバッグや実際に使うときは必ずチェックを外すこと

#Send Mail(メール送信)ステップでの注意点
　GMailアドレスを用いてメール送信を行う場合は以下の通り設定を行うこと
　　①送信するGMail側で、IMAPを有効にする
　　　→GMailを起動し「設定」→「メール転送とPOP/IMAP」→「IMAPアクセス」⇒「IMAPステータス」を有効に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176879/107018ab-1814-0b58-159b-9f301b91c15a.png)

　　②Send Mailステップ内で、以下の通り設定する

#####メッセージタブ
|入力欄|入力内容|
|:--------------------|:---------------------------------------|
|送信元アドレス|用いるGMailのアドレス|
|宛先アドレス|宛先のアドレス※複数の宛先に送る場合は、カンマ(,)で区切る|
|Ccアドレス|Ccのアドレス※複数の宛先に送る場合は、カンマ(,)で区切る|
|件名|メールの件名|
|メッセージ|メールの本文|
|メッセージ　タイプ|テキストタイプかHTMLかを指定|

#####サーバータブ
|入力欄|入力内容|GMailの場合|
|:----|:-------|:---------|
|メールサーバー|SMTPサーバ|smtp.gmail.com|
|ポート|SSLもしくはTLSのポート|587|
|ユーザー|ユーザー名|送信元アドレス(Googleアカウント名)|
|パスワード|メールのパスワード|Googleアカウントのパスワード|
|暗号化|平文、TLS、SMTPのいずれかを指定|TLS|
いずれも変数やエクスプレッション、コンバーターを利用可能なので変数に初期値として入れておくのもあり

#そのほかよく使う設定、機能など
#####グローバル設定
　作成した変数(type)は、ループ処理(For Each~,Repeat)すると中身がリセット(初期化)されてしまうため、
　ループを跨いでも値を保持しておきたい場合は、グローバル設定をオンにしておく
　※抽出したデータをエクセルファイルでの貼り付ける場合の行指定や、指定のデータ内をループし合致した値を
　　変数に格納する場合など
#####タイムスタンプ
　　→Assign(変数の割り当て)ステップ内でコンバーターを活用して取得
　　　～手順～
　　　　①タイムスタンプ情報を格納する変数を作成
　　　　②タイムスタンプを取得したい任意の場所でAssign(変数の割り当て)ステップを作成
　　　　③Value(値)ボックス横のドロップダウンリストからConverter(コンバーター)を選択
　　　　④初期値として入っている「(変数を取得)」を選択し「-」をクリックして削除
　　　　⑤「+」をクリックし「(エクスプレッションを評価)」でnow()を入力※now関数で現在時点の年月日情報を取得
　　　　⑥再度「+」をクリックし「日付処理」→「日付の書式設定」でフォーマットパターンを編集
　　　　⑦編集が完了したらValiables(変数)ボックスに①で作成した変数を指定
Visual Studio Codeで、コマンドラインでExtensionをインストールする

# やりたいこと

Visual Studio CodeのExtensionを、コマンドラインでインストールしたい。

# やり方

Extension管理用のコマンド、`--install-extension`を使います。

たとえば、Python用のExtensionをインストールする場合。

```shell
$ code --install-extension ms-python.python
```

プロキシ環境下にいる場合は、`https_proxy`環境変数を設定しておけばOKです。

# インストールされているExtensionを、一括でアップデートしたいなら

`--list-extensions`でインストールされているExtensionの一覧が取得できるので、こちらを利用しましょう。

```shell
$ code --list-extensions | xargs -I {} code --install-extension {} --force
```

`--force`を付けて、確認をスキップします。

なお、問答無用で新しいバージョンを入れてしまうので、その前提で。

この`--force`オプションは、ヘルプで確認することができます。

```shell
$ code --help

...

Extensions Management
  --extensions-dir <dir>               Set the root path for extensions.
  --list-extensions                    List the installed extensions.
  --show-versions                      Show versions of installed extensions, when using --list-extension.
  --install-extension <extension-id>   Installs or updates the extension. Use `--force` argument to avoid prompts.
  --uninstall-extension <extension-id> Uninstalls an extension.
  --enable-proposed-api <extension-id> Enables proposed API features for extensions. Can receive one or more extension IDs to enable individually.
```
Macのnodebrewで入れたnode, npmをクリーンアップ

nodeの環境がぐちゃぐちゃになってたので一旦綺麗にしようと思い、
以下その手順です。

## まず、npmのuninstall

```
sudo npm uninstall npm -g
```


## node.jsのuninstall

brew経由でインストールしたnodeのアンインストールです。

```shell
brew uninstall node
```

以下のエラーが出た場合は、
素直に言われた通りにする。

```shell
Error: Refusing to uninstall /usr/local/Cellar/node/11.6.0
because it is required by yarn, which is currently installed.
You can override this and force removal with:
  brew uninstall --ignore-dependencies node
```

言われた通りに以下を実行します。

```shell
brew uninstall --ignore-dependencies node
```

それでもなんか言われた場合。

```shell

Uninstalling /usr/local/Cellar/node/11.6.0... (3,938 files, 49.8MB)
node 8.1.3 is still installed.
Remove all versions with `brew uninstall --force node`.
```

言われた通り以下実行します。

```
brew uninstall --force node
```


これでタブを新しく立ち上げて、
nodeとzpmがcommand not foundになったら無事uninstall完了です

```
node -v
zsh: command not found: node

npm
zsh: command not found: npm
```

### 周辺ファイルの削除

```shell

sudo rm -rf ~/.npm
rm -rf ~/node_modules
```

## nodebrew経由でinstallし直す

```shell
nodebrew setup
```

パスがない場合は言われた通りにパスを設定してください。

```shell
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew
========================================
Export a path to nodebrew:
export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

### 安定版のnodeをinstall

```shell
nodebrew install-binary stable
```

### 確認
nodeとnpmコマンドが再び使えるようになっていればokです。

```shell
node -v
v10.15.3
npm -v
6.4.1
```
CSSで早押しクイズのスイッチのようなボタンを作成する

# 実現したいこと
<img width="393" src="https://qiita-image-store.s3.amazonaws.com/0/127338/2eba9335-73b5-d0fa-3e10-a742a6049077.jpeg">


- 上図のようなかわいいボタンを作成したい。
- class=activeを付けるだけで、押した感じにしたい。
- 画像を使いたくない。

# 実装方法

```html
<div class="switch">
    <a href="#"><span>＼ Check In ／</span></a>
</div>
```

```css
/* 1. スイッチの台座にあたる部分 */
.switch {
  background-color: #f9ff6a;
  border-radius: 100%;
  height: 50px;
  margin: 0 auto;
  position: relative;
  width: 200px;
}
/* 2. スイッチ本体 */
.switch a {
  background-color: #dfe74e;
  display: block;
  height: 40px;
  margin: 0 auto;
  position: relative;
  top: -18px;
  width: 160px;
}
/* 押した時にボタンが押し込まれる */
.switch a.active {
  height: 20px;
  top: 2px;
}
/* ボタン本体を円柱に見せるために */
.switch a::before,
.switch a::after {
  border-radius: 100%;
  content: '';
  display: block;
  height: 40px;
  left: 0;
  position: absolute;
  width: 160px;
}
.switch a::before {
  background-color: #dfe74e;
  bottom: -20px;
}
.switch a::after {
  background-color: #f9ff6a;
  top: -20px;
}
/* 3. ラベル */
.switch a span {
  color: #fff;
  display: block;
  font-size: 14px;
  position: absolute;
  text-align: center;
  top: -40px;
  width: 100%;
}
.switch a.active span {
  display: none;
}
```

1. スイッチの台座にあたる部分を作成。
2. before, afterで円柱を作成し、スイッチ本体を作成。
3. Check Inというラベルを作成。

簡単なので、ぜひやってみてください。