OmniAICreator/Qiita-1.07M huggingface dataset:
Homebrew導入

# はじめに
Macで開発するならとりあえず導入するパッケージマネージャー
[Homebrew](https://brew.sh/index_ja)

yarnとか、ちょっとしたパッケージインストールの公式手順でもHomebrewの`brew`で入れてねって記載が多いイメージ
入れておくと、開発する時には環境構築しやすくなると。。思う。。

基本的には、公式サイトの通りだけど、事前にちょいとやる事あるので、メモメモ

# 導入環境
- macOS Catalina (v10.15.3)

# Xcodeインストール
App Storeからxcodeをインストールする
 -> この作業が地味に時間かかる。。。ほぼ8GBのDLがあるので、終わるまで気長に待つべし。。。

インストールが完了したら、Xcodeを起動してライセンスに同意。
パスワードを要求されるので、パスワード入れて続行

**割と忘れがち。。。**
Xcodeインストールまたは、アップデートしたら、ライセンスにAgreeしておいてください。
ライセンスに同意してないと、以下のようなメッセージが出て、インストールできないです。。。

```
You have not agreed to the Xcode license.
Before running the installer again please agree to the license by opening
Xcode.app or running:
  sudo xcodebuild -license
```

試してないけど、忘れてたらメッセージの通り、`sudo xcodebuild -license`すればライセンス同意できるかも。。。

# Xcodeのコマンドライン・デベロッパー・ツール インストール
細かい事調べてないけど、gitをターミナルで使う時にこのツールが必要になる。
Homebrewでも同じで、パッケージインストールとかの時に必要になるので、事前にインストールが必要

ターミナルを起動して、以下のコマンドを実行

```terminal:ターミナル
~ % xcode-select --install
```

インストールを確認するポップアップが表示されるので、インストールを選択
その後、使用許諾契約の確認を求められるので、同意
<img width="468" alt="スクリーンショット 2020-03-10 13.11.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459638/6416459a-6c53-6a4d-5411-b56a5c6e4860.png">
 -> これも地味に時間かかるよ。。。

インストールできたら、以下のコマンドでバージョンが表示されるか確認

```terminal:ターミナル
~ % xcode-select -v
```

結果はこんな感じ

```
xcode-select version 2373.
```

### 小言
ちなみに、Xcodeのアップデートとかした時には、使用許諾契約などの内容が変わってる影響か、
`xcode-select --install`をやり直さないと、Homebrewとかが正常動作しなくなる事あるので、
Xcodeのアップデートあった時には、確かめてね！

# Homebrewインストール
[Homebrew](https://brew.sh/index_ja)からインストールコマンドをコピーしてきて、ターミナルにペースト
![スクリーンショット 2020-03-10 12.15.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459638/49c65d6e-f8bf-7866-4bba-adcafc241004.png)
たぶんコマンドが変わる事ないと思うけど、本記事からコピーせずに、公式サイトからコピーしてください。

```terminal:ターミナル
~ % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

コマンドが正しければ、途中で以下のメッセージが出るので、適当なキーを押して、続行
パスワードを聞かれたら、パスワード入力

```
Press RETURN to continue or any other key to abort
Password:
```

なんだかんだ、色々メッセージが表示されて

```
==> Installation successful!
```

って表示されれば、インストール完了
念のため、動作確認
以下のコマンドを実行

```terminal:ターミナル
~ % brew doctor
```

以下の通り、メッセージが表示されたら、全て完了

```
Your system is ready to brew.
```

お疲れ様でした。
良きMac開発ライフをこれからお過ごしくださいな。

# 参考記事
以下の記事を参考にさせていただきました。ありがとうございました。
[macOSにHomebrewをインストール @pypypyo14](https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9)
[ざっくり、Homebrew導入 @nemui_](https://qiita.com/nemui_/items/286e8f6c4d78270ce8c7)
Alloyでパズル (10) 帽子の色

[こちら](https://github.com/kencoba/alloy-introduction/blob/master/src/03_examples/Hat.als) で見かけた問題、[様相論理](https://ja.wikipedia.org/wiki/%E6%A7%98%E7%9B%B8%E8%AB%96%E7%90%86)というものを使うべきものであることは理解した。
けど..

# 問題
> AさんとBさんがいて、少なくとも一人は赤い帽子を被っていて、赤い帽子を被っていない人は白い帽子を被っている。
ただし、二人とも他人の帽子の色は分かるが、自分の被っている帽子の色は分からない。そして、Aさんが「自分の帽子の色が分からない」と発言した。
このとき、Bさんの被っている帽子の色は何か?　
そして、Bさんは自分の被っている帽子の色が分かるか?

# リスト

参照先のリストでなんとなく理解はしたけれど、これを使って書いてもきっとすぐわからなくなる。
数週間後の自分が理解しており、さらにそれを他人に説明できる自信がない。
仕様記述としては難解と言わざるを得ないだろう（様相論理を理解している層に向けたものなら可）

この問題のように、表を目視チェックできる程度の組み合わせしかない場合に限れば、全パターンを普通にリストアップした方がわかりやすいだろう。

```alloy
// ふたりとも赤い帽子か、ひとりが赤い帽子でもうひとりが白い帽子

enum Hat {Red, White}
enum Knows {Know, DontKnow}
enum Valid {O, X}
sig Pattern {
    aHat, bHat: Hat,			// それぞれの帽子の色
    aKnows, bKnows: Knows,		// 自分の帽子の色がわかるか
	valid: Valid				// この組み合わせは有効か
} {
	aKnows = knows[bHat]
	bKnows = knows[aHat]
	valid = (Red in aHat+bHat => O else X)
}
fun knows[others:set Hat] : Knows {		// 一応多人数対応
	// 赤い帽子を被っている人がいなければ、自分は赤だとわかる
	Red in others => DontKnow else Know
}
fact 全パターン網羅 {
	all a,b:Hat | one p:Pattern | p.aHat=a && p.bHat=b
}
run {} for 4

let validPattern = valid.O

// Bさんの被っている帽子の色
let b_hat = (validPattern & aKnows.DontKnow).bHat

// Bさんは自分の被っている帽子の色が分かるか
let b_know = { (validPattern & aKnows.DontKnow).bKnows = Know }
```

# 結果

<img width="811" alt="hat.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20005/a4d44a08-505d-856e-926e-5abc0b88c093.png">

# 追記：反例がないことを確認する形で書き直し

問題通り２人だけなら、Aさんがわかった場合もわからなかった場合もBさんの色は確定する。
３人以上いてそのうち２人を抽出した場合なら、Aさんがわからなかった場合だけ確定する。

```alloy
enum Hat {Red,White}
sig Person { hat:Hat }
one sig A,B extends Person {}
fact { some hat.Red }

// 赤い帽子が見えないなら自分の帽子は赤
pred knowsOwnColor[person:Person] { no Red & (Person-person).hat }

run {}
AさんがわかるならBさんは白: check {A.knowsOwnColor => B.hat=White}
AさんがわからないならBさんは赤: check {!A.knowsOwnColor => B.hat=Red}
```

ただ、なぜこれらの`check`を書けたかというところが問題になるかもしれない。
書いた自分が考えてしまっているという点が..
言い方を変えると、「仮説を思いついたので、Alloy で検証したんですよ」と言うことだ（範囲限定で検証しているので証明にはならない）


# 参考

- github.com/kencoba : [Hat.als](https://github.com/kencoba/alloy-introduction/blob/master/src/03_examples/Hat.als)
- Wikipedia : [様相論理](https://ja.wikipedia.org/wiki/%E6%A7%98%E7%9B%B8%E8%AB%96%E7%90%86)
良いチームを作りたいと思ったきっかけ

## フリーランスになって感じた孤独
2019年はフリーランスとして活動した一年でした。（エンジニアやったりウェブマーケティングやったりしました。）
入った案件はこんな感じ。
・2019年1月 ~ 2019年3月：社内常駐
・2019年3月 ~ 2019年10月：フルリモートのエンジニアチームにジョイン
・2019年3月 ~ 2019年10月：SEOの会社にジョイン（エンジニアは自分だけ）

どこのタイミングでも、プロとしての実力を問われてたと感じました。
実力を問われていると感じすぎて、人と人が一緒に働いているというよりは、スキルとスキルが働いているように感じました。
働く仲間との接点は、唯一現在のスキルのみのような感覚です。
自分にとっては、点と点でのみ繋がっているという儚い人間関係があまりしっくりきませんでした。

そこから、自分は仕事においてもっと多面的な人間関係を求めているんだなと思い始めました。
仲間と接する時に、「相手がどんな人間で、どういうことが得意で、どういうことしたら将来的に良いよね」ということを考えあえる関係性を求めているんだなと。

## 正社員に戻ってみて感じた違和感

> 多面的な人間関係
> 「相手がどんな人間で、どういうことが得意で、どういうことしたら将来的に良いよね」ということを考えあえる関係性

こんなことを求めていたけど、実は正社員でもそういうことを実感することってないなと思いました。
具体的には、こんなことで違和感を感じました。
・タスクは気づいたらアサインされている
・チームメンバーが何を目標に仕事をしているのかわからない
・チームに目標は特にない
・チームのMTGでは経営からの判断を伝達されるだけで、チームの状態については話し合われない

そこから、自分の理想とするチーム状態を実現する方法を模索し始めました。
自分が求めていたのは、こんなチームの状態だったんだろうと思っています。
・タスクはチームメンバーで誰が適任か話し合って決める
・メンバー同士がどんな想いで働いているのか理解しあっている
・チームに目標があって、毎週改善を回している

理想のチーム状態を実現するために模索した内容をアウトプットしていこうと思ってます！
Theme.MaterialComponents の カラーテーマ


カラーコードの表記の横に実際の色を入れておきます。あと簡潔な日本語に。

### カラーテーマを使え

|属性|説明|デフォルト値|
|:--|:--|:-:|
|colorPrimary| アプリで最も使われる色。表面色、背景色より上に描画されます。|`#6200EE`|
|colorPrimaryVariant|colorPrimary のバリエーション。|`#3700B3`|
|colorOnPrimary|colorPrimary 上のテキスト/画像の色。|`#FFFFFF`|
|colorSecondary|セカンダリブランディング色。通常は colorPrimary を強調した補色。|`#03DAC6`|
|colorSecondaryVariant|colorSecondary のバリエーション。|`#018786`|
|colorOnSecondary|colorSecondary 上のテキスト/画像の色。|`#000000`|
|android:colorBackground|スクロール可能なコンテンツの背景色。|`#FFFFFF`|
|colorOnBackground|android:colorBackground の上に描画されたテキスト/画像の色。|`#000000`|
|colorSurface|カード、シート、メニューなどのコンポーネントの表面色。|`#FFFFFF`|
|colorOnSurface|colorSurface の上に描画されたテキスト/画像の色。|`#000000`|
|colorError|テキストフィールドなどのコンポーネントのエラー状態の色。|`#B00020`|
|colorOnError|colorError の上に描画されたテキスト/画像の色。|`#FFFFFF`|

最大でこれだけセットすれば良い。

セットしていなくてもデフォルト値の色をテーマ経由`?attr/`で参照できるし、そのままダークモードにも突入可能。

[👉 テーマデフォルトの色 (baseline palette) を確認する【AndroidStudio】](https://android.benigumo.com/20220711/default-theme-color/)

[👉すべてのAPIレベルで使用できる ?attr/ 属性を使うべし](https://qiita.com/chanzmao/items/fd714de3df8055fa6d4c)
PHPとは？　[初心者向けに]

# PHPとは何か:beginner:
動的なWebページを作成することができるサーバーサイドのプログラム言語のこと。

#### 動的とは？:runner_tone5::runner_tone4::runner_tone3::runner_tone2:
通常のHTMLは静的なWebページで、
制作者が内容を書き換えない限りはいつアクセスしても同じものが表示される。
そのページにプログラムを記述し、ユーザーがボタンを押したりアクセスした際に
表示内容を変えることができるのが**動的**なページ。
#### サーバーサイドとは？:gear:
サーバー側(サービスを提供する側のコンピュータ)でプログラムを動かすこと。
##PHPを使うと出来ること例
- **ECサイトの構築**  :computer::high_heel:
 - ショッピングカート
　(商品をいくつ入れたのか、その商品の金額はいくらなのか、<br>
   自動的にカウント・計算することもPHPで実装可能)
 - 検索エンジン
　(人気順や、新着順、条件によって表示する項目を変えることも可能)
 - オンライン上での決済処理、予約機能

- **SNSサイトの作成** :speech_left:
 - ユーザー登録や削除、ログイン(ログアウト)機能を作る
 - 投稿の作成、更新、削除
 - SNS上でのチャット機能

- **WordPressを使ってブログを簡単に作る** :pencil2:
　WordPressとはPHPとMySQL（データベース）を利用している
　ブログ作成ソフトで、PHPプログラミングのスキルを持っていれば
　WordPressをカスタマイズすることができる。

##PHPを使うには
PHPはWebサーバで実行するため、
通常のHTMLを公開するWEBサーバを準備する必要がある。
（このように、プログラムを動かす準備をすることを**環境構築**という。）

###環境構築 :house::pick:
Webアプリケーションを作成するには、
Webサーバ(ex Apache)やDB(ex MySQL)、プログラミング言語（ex PHP）が必要。
普通は、これらを個別にそれぞれインストールをする必要があるが、
**XAMPP**というアプリケーションをインストールして使うと、
PHPやApache、データベースであるMySQL、などを一括インストールして簡単に環境構築ができる。
（他にも環境構築の方法やアプリケーションはありますが、XAMPPは最も人気のある PHP開発環境だそう。）



##Javascriptとの違い

PHPとJavaScriptの大きな違いは、そのコードがどこで実行されるか。

JavaScriptは、クライアントサイド（Webサイトを閲覧しているブラウザ）
がコードを受け取り、そこで動作します。
そのため、どのようなコードが書かれているのか、誰でも見ることができてしまいます。
一方、PHPはサーバーサイドでコードを実行します。
クライアントサイドはその結果のみを受け取るため、
どのようなコードで出された結果なのか見ることができません。
PHPでMySQLに接続する

## はじめに
学校の作品展でPHPとMySQLを利用してSNSを作ったのでその時に使ったPHPでMySQLに接続する方法を（できる限り）分かりやすく紹介していこうと思います。

※PHPをぼんやりと理解した状態で書いているので間違った説明もあるかもしれません。ご了承ください_(._.)_

### 環境
PHP 7.3.4
MySQL 5.7.20
Apache Server Version 2.4
## 接続/Connect
MySQLには接続に必要な情報が四つります。
それぞれの説明についてはこの記事では割愛させていただきます。

- ユーザー名
- パスワード
- データベース名
- ホスト名


```PHP
$db_username = "root";
//MySQLのユーザー名
$db_password = "root";
//MySQLのパスワード
$db_setting = "mysql:dbname=TestDB;host=localhost";
//接続するデータベースの名前とホスト名
$mysql_connecter = new PDO($db_setting,$db_username,$db_password);
```
接続はこれだけでできます。

## SQLの実行

### パターン1 実行結果が必要ないSQL
```PHP
$sql = "select count(*) from test";
$stmt = $mysql_connecter->prepare($sql);
$stmt->execute();
```
executeするだけ特に難しいことはありません。
### パターン2 実行結果が一行のSQL
```PHP
$sql = "select count(*) from test";
$stmt = $mysql_connecter->prepare($sql);
$stmt->execute();
$result = $stmt->fetch();
echo $result["キー"];
```
SQLの実行結果が一行とかだと変数$resultにキーを指定するだけで取得可能

### パターン3 実行結果が複数行のSQL
```PHP
$sql = "select * from test";
$stmt = $mysql_connecter->prepare($sql);
$stmt->execute();
while($result = $stmt->fetch()){
    echo $result["キー"];
}
```
複数行の場合はWhile文で回すかForeach文で回そう
個人的にはwhileのほうをよく使う気がします。

### 応用編　変数等でSQLの内容を変える場合
```PHP
$sql = "select count(*) from test where id = :id";
$stmt = $mysql_connecter->prepare($sql);
$stmt->bindParam(":id",$id,PDO::PARAM_STR);
//要は上の$sqlの中の:idという部分を変数$idに置き換えてる
//PDO::PARAM_STRは文字列用。数値を扱いたい場合はPDO::PARAM_INTを使う。
$stmt->execute();
```
bindParamは使ってみるとわかるけどめっちゃ便利
文字列に置き換えるとダブルコーテーションとかも付けてくれるので 
`"~SQL文\"".$id."\"SQL文~"`
みたいなクソコード書かなくてもいいんですよね（最初こんな感じの書いてました）

## おわり
サンプルコードではSELECT文しか実行していませんがこのやり方でUpdateもDeleteもInsertも問題なく実行可能です。
ただ、ちょっとめんどくさい点としてどうもエラーが発生するSQLを実行してもPHPは問題なく動くんですよね。
このせいでデバッグに時間がかかったりします。最近はこれにめちゃくちゃ苦しめられました。


いいね押していってくれるとモチベの維持にもつながるのでよかったらお願いします。_(._.)_
credential.ymlの設定方法使い方など

久しぶりにrails記事書きます。

credential.ymlのことです。
version 5.2~実装されたsecrets.ymlの後継に当たるものですね。

理解が曖昧だったのでまとめました。

##credential.ymlの作成

作成されるタイミングは `rails new`した時。
`create config/master.key`と出てました。
しかし、create credential.ymlのような記述は探してもなかったですけどrails newしたら作られてましたので同じタイミングですね。
* create master.keyしたすぐに.gitignoreにappend処理が行われるので、gitの管轄から自動的に外されます。


もしも、どちらかもしくはどっちのfileも削除してしまった際には
`$EDITOR='vi' rails credentials:edit` コマンドで再作成できます。
このコマンドは主に、credentialsを編集するときに使います。
(おそらく、fileがなければ、作成しあれば編集するような条件をかけているのかな？)

## credentials.ymlの編集
編集は`$EDITOR='vi' rails credentials:edit`のコマンドを使います。

```
aws:
   access_key_id: 123
   secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
```

初期はこんな画面です。おそらく、初期では全てコメントアウト扱いです。
使いたい値を組み込んでみましょう。

```
Google:
  google_spred_key_id: AAABBBCCC

```
気をつけるのは、`google:`の前の空欄を空けること。空けないと値がnilになりました。

設定できているかを確認するときには、
rails cで `Rails.application.credentials.awsやRails.application.credentials.google`などで取れます。(ハッシュ)
さらに、googleの中のgoogle_spred_key_idを取得したい時`Rails.application.credentials.google[:google_spred_key_id]`と記述します。


##削除してしまった際

` ActiveSupport::MessageEncryptor::InvalidMessage`
こんなエラーが出るときがあります。credential.yml or master.keyがない。それか、整合性が合わない時に起こりうるので、そんな時は再発行などを試してみてはいかがでしょうか。
`$EDITOR='vi' rails credentials:edit`



##最後に感想

最後に、運用方法ですが
credentialはmasterkeyとニコイチです。一緒にないと動きません。
credentialがなくてもrails cなどは動きますがmasterkeyがなくなれば何もできなくなります。
なので、大人しく`$EDITOR='vi' rails credentials:edit`して作成してあげましょう。
credentialを他の人が作成して、自分が編集したい時には作成した時点のmasterkeyが必要です。
なので、gitなどにはあげずに全員に配ってあげてください。(多分)

credentialが公開鍵
mastekeyが秘密鍵の役割かな？

なので秘密鍵は絶対に後悔しないようにしましょう。
雰囲気で量子コンピュータについて書く

#前提
まず私は理解できている訳ではないので
雰囲気でこの記事は書いています。
そして詳しいことは書いていないです。
ご了承ください。

#量子ビット
従来のコンピュータに使われていたのが古典ビット。
量子コンピュータに使われるのが量子ビット。

<b>特徴</b>
量子ビットは0でも1でもある。
それを証明した有名な実験が二重スリット実験。
わかりやすくいうと、0になったり1になったり勝手に変化する。
瞬間的に止めればどっちかだよね的な感じ。

<b>流れ</b>
量子コンピュータに量子回路があってそこを量子ビットが通る。
マイクロ波を当てて量子状態を変化させる。

#量子ゲート
量子ゲートは、論理回路的なもので量子ビットを操作する。
だけど、量子ゲートは仮想的なものでQPU(CPU的なもの)の中には
量子ビットと配線しか存在しない。

量子ゲートはマイクロ波の種類を表す。
種類は色々ある
1.パウリゲート
2.アダマールゲート
3.CNOT(シーノット)ゲート

詳細は難しい。。

#量子アルゴリズム
量子アルゴリズムには2種類存在する。
万能型とNISQ型がある。

万能型
ショアのアルゴリズム
素因数分解が解けて、暗号解読に使える。

NISQ型
VQEアルゴリズム
組み合わせ最適化問題が解けて、組み合わせ問題に使える。


#量子コンピュータが使える分野
量子コンピュータが使える用途と分野は、結構ある。
1.AI
2.セキュリティ
3.高速検索
4.量子科学計算

1.AI
画像認識や、音声認識で
たくさんのデータからたくさんのパターンが扱えるようになる。

2.セキュリティ
暗号解読など従来のコンピュータでは現実的な時間で行えなかった
計算が可能になる。

3.高速検索
計算が早いということで、検索を量子コンピュータに置き換えて
行うことで膨大なデータから超高速に検索ができるようになる。

4.量子科学計算
工業製品や医薬品など原子レベルの考慮が必要な
ものが量子コンピュータを使うことで新たな製品が生まれる可能性がある。

#量子コンピュータを作るには
pythonのライブラリとしてBlueqat(ブルーキャット)を使う。
無償で使えて、macやwindowsでも使用できる。

上記は、量子ゲート型だが量子アニーリング型を作るには
PythonのライブラリWildqat(ワイルドキャット)が使える。

今回の記事は、触れるどころかかすってすらいないけど
とりあえず雰囲気で書いてみました。
#終わり
<b>Youtube</b>でも量子コンピュータのことを
少しだけ雰囲気で話しているので
よかったらみてください。
チャンネル登録もしてください。
https://www.youtube.com/channel/UCRsZ6L8ra2Yzx0eiJ_4gzuA


[参考文献](https://www.amazon.co.jp/gp/product/B07RY7CFTF/ref=as_li_tl?ie=UTF8&tag=ajikitaito-22&camp=247&creative=1211&linkCode=as2&creativeASIN=B07RY7CFTF&linkId=14b9f0328522782662aff60d65aedec2)
Django 3.0 でDjango REST Swaggerを使用すると発生するエラーの解消

# 概要
Django 3.0 で、Django REST Swaggerを使用すると発生するエラーの解消

# 環境
- AWS EC2
- Python 3.6.10
- Django 3.0.4
- Django REST framework (https://www.django-rest-framework.org/)
- Django REST Swagger (https://django-rest-swagger.readthedocs.io/en/latest/)

# エラーメッセージ

http://localhost:8000/swagger/ にアクセスすると下記のエラーが発生する

```
django.template.exceptions.TemplateSyntaxError: 'staticfiles' is not a registered tag library. Must be one of:
admin_list
admin_modify
admin_urls
cache
i18n
l10n
log
rest_framework
static
tz
```

# 解消方法

```
# swagger のhtmlファイルを編集
$ sudo vim /usr/local/lib/python3.6/site-packages/rest_framework_swagger/templates/rest_framework_swagger/index.html

もしswaggerのファイルパスがわからない場合は、grepで調べる
$ sudo grep -rl "staticfiles" /usr/local/lib
```

Before:

```
{% load staticfiles %}
```

After:
2行目を下記の内容に編集

```
{% load static %}
```

再度、 http://localhost:8000/swagger/ にアクセスするとつながる。
Django3.0では、'staticfiles' が削除されていることが原因。

公式ドキュメント
https://docs.djangoproject.com/en/dev/releases/3.0/#features-removed-in-3-0
APIについてまとめてみた

#はじめに
こんばんは。
プログラミングスクールにてPHP学習中の Haruka です。
現在、卒業制作として、介護の相談窓口を紹介してくれるWebサービスを開発中なのですが、最近よく聞く「API」なるものが気になって仕方ないので、調べてまとめてみました。


#APIとは？
ざっくり説明すると以下のような内容です。

- Application Programming Interface の略
- アプリケーションとプログラムをつなぐもの
- アプリケーションに窓口を作り、外部の別のアプリケーションと連携できるようにする
- 例えて言うなら、長崎の出島


#何で連携する必要があるの？
簡単に言うと「便利だから」です。
例えば、Twitterのような短文投稿アプリを作りたいと思った場合、ゼロから作り上げるとなるとゲンナリしますよね。
すでに道具や部品を入れた箱があって、私たちは中身の部品を組み立てるだけ、という状態だったら、とてもラクですよね。
それを実現するのがAPIで、前述の「箱」に当たります。
APIを使うことにより、従来よりも早く簡単に開発ができるようになります。
他にも、セキュリティの優れたAPIと連携することで自サイトのセキュリティ向上も期待できたり、自サイトで販売していてAmazonでも取り扱っている商品の価格変更があってもすぐに反映される、といった利点もあります。


#長崎の出島に例えてるのは何で？
2つ前の章で出てきた「長崎の出島」についてですが、私が考えたわけではなく、[参考記事](https://data.wingarc.com/what-is-api-16084)内で使われている例えです。
記事内では、以下のように使われています。

> 日本を一つのソフトウェア、諸外国をまた別のソフトウェアと考えると、出島が司っていたのが言ってみればその二つを繋げるAPI機能です。

上記の例えに沿って考えると、APIはアプリケーションとプログラムをつなぐ仲介人または翻訳者と解釈することもできるでしょう。
ちなみに、出島を知らない人のために説明すると「日本が外国との貿易を制限していた時代に作られた場所で、日本と外国を結ぶ窓口」です。
出島についてもっと知りたい方は、[こちら](https://www.at-nagasaki.jp/dejima/dejima/top/)をご覧ください。


#まとめ
APIとは、異なるアプリケーション（プログラム、ソフトウェア）同士をつなぐもの。
開発スピードを早めたり、セキュリティの向上や最新情報の反映が期待できるといった、メリットがあります。
アプリケーションとアプリケーションをつなぐ仲介人と考えてよいでしょう。


#参考記事
- [今さら聞けないIT用語：やたらと耳にするけど「API」って何？](https://data.wingarc.com/what-is-api-16084)

#余談
冒頭で触れた「介護の相談窓口を紹介するWebサービス」ですが、チャットボットとWikiを組み合わせる予定です。
そんな状況なので、チャットボットAPIを開発したという以下の記事が気になったのですが、今回開発するのは雑談ボットではないので、別の機会にお世話になることになりそうですね。

- [Botが雑談に応えられるようにするWEB APIを公開してみた話【個人開発】](https://qiita.com/maKunugi/items/b1afb6441571119729a7)

ちなみに、何で介護なのかと言うと、私が5年半ほど介護の仕事をしていて、現在進行形で続けているからです。
Django環境のdocker-composeでハマった話

[このタイプ](https://medium.com/@michealjroberts/using-docker-compose-to-setup-a-simple-django-postgresql-application-46cb22521286)の構成での開発環境を作る時に自分はこんなエラーに捕まった。

```
$ docker-compose run サービス名 django-admin.py startproject アプリ名 .
Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"django-admin.py\": executable file not found in $PATH": unknown
```

`sudo`をしても通らないし、おそらくこれはpythonのPATHがうまくいってないんだなということから、`Dockerfile`関連を疑った。

落ちとしては予想通りpython関連の`build`がうまくいっていなかった。
以下で解決

```
$ docker-compose build # 一旦たてて、Dockerfile内のpythonを備える
$ docker-compose run web django-admin.py startproject webpj .
```
Javaの開発環境をDockerを活用して構築してみる

# はじめに
- Java開発を行うにあたり、環境依存の少なく移行性、再現性の高い開発環境を作りたかった
- 時代はContainerでしょ。と言う事で、手元のMACにDockerで開発環境を構築してみた

# 環境概要
- Java実行環境はもちろん、DBも、ビルド環境もコンテナ化して、いつでもどこでも誰でも同じ環境を実現
- お試し開発なので、IDEは使わず慣れているVScodeを使う
![my_java_devenv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245534/33d57c0a-8793-549c-488e-12386742a912.png)
GUIの無いVPSでGoogleのAPIのOAuth認証をする(SSHポートフォワーディング)

#まえがき
VPS上でGoogle SeetsAPIと叩こうとしたら認証に詰まったので個人的なメモ

# 背景
google SpreadsheetsのAPIを使うには、ダッシュボードで鍵を生成するなどした後、スクリプトの初回実行時に認証ページにアクセスしアクセス許可の操作をする必要がある。

この際最後にVPS側のlocalhost上のページにアクセスする必要があるが、ローカルPCからアクセスしようとしても当然当該ページは出てこない（この時点では認証は完了していない）。![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218242/412b1c74-ea97-2d56-843d-b80e8a3eca01.png)


私のVPSにはGUI環境がなく、またjsの動作しないCLIブラウザではGoogleへのログインすらできなかった。

このため、SSHポートフォワーディングを使ってローカルPC上のブラウザからVPSのローカルホストにアクセスし、認証処理をした。

#操作
[SSHポートフォワーディングを知った話](https://qiita.com/Ayaka14/items/449e2236af4b8c2beb81)を参考に、 ターミナルで
`ssh -L 33476:localhost:33476 user@example.com`
を実行。

VPS上にあるSheetsAPIを使うスクリプト(Python)を実行すると認証ページのURLが
`Please visit this URL to authorize this application: `
に続いて標準出力に流れてくるので、ローカルPCのブラウザでアクセスする。

あとは画面に従って認証処理をし、Localhostにリダイレクトされて認証が完了した旨のメッセージが出れば完了。これでVPSからAPIが使えるようになった。
PostgreSQLソースファイルの行数カウント

PostgreSQLのソースディレクトリ配下にあるC言語ソースファイルについて、以下の条件で合計行数をカウントします。

- カウント対象のソースファイルは、拡張子が **.c**、**.h**、**.y** のもの
- 「**/\*** と **\*/** で囲まれるコメント行」と「空行」を除いて行数をカウントする

行数は以下のコマンドでカウントします。

```bash
$ wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.bz2
$ tar jxf postgresql-12.2.tar.bz2
$ find postgresql-12.2 -name "*.[chy]" -type f | xargs cat | sed -e "/\/\*/,/\*\//d" | grep -v -E "^$" | wc -l
  732610
```
sshの秘密鍵と公開鍵がペアになっているのかどうかを判別するスクリプト

このスクリプトでokがでたら、ペアになってます。

```
% if [[ `ssh-keygen -y -f ~/.ssh/id_rsa | cut -d " " -f 2` == `cat ~/.ssh/id_rsa.pub | cut -d " " -f 2` ]]; then echo ok; fi
ok
```

※ 参考文献
- https://qiita.com/ironsand/items/27170fb73971b0522cbf
Pythonの二次元配列の罠【配列のコピー】

基本的なことなんだろうけど、理解してないせいで詰まったのでメモ。

# まえがき


pythonで配列を作るのは簡単でいいですね。

```python
a = [0] * 2
print(a) # [0, 0]
```

二次元配列も作ってみましょう。

```python
b = [[0] * 2] * 2
print(b) # [[0, 0], [0, 0]]
```

あら便利。じゃあ操作してみましょう。

```python
b[0][1] = 1
```
printしてみましょう。

```python
print(b) #[[0, 1], [0, 1]]
```
んん？？？？？？
# 結論
こう書きましょう。

```python
c = [[0] * 2 for i in range(2)]
print(c) # [[0, 0], [0, 0]]
c[0][1] = 1
print(c) # [[0, 1], [0, 0]]
```

# なんでダメなの？
id()関数を使ってみましょう。

```python
b = [[0] * 2] * 2
print(id(b[0])) # 1835216839944
print(id(b[1])) # 1835216839944 アドレスが同じ
c = [[0] * 2 for i in range(2)]
print(id(c[0])) # 1835216058120
print(id(c[1])) # 1835216840392 アドレスが違う
```

*2でコピーすると同じアドレスを参照することになります。

b[0][1] = 1、という形でアドレスの参照している「中身」を変更すると、アドレスを共有する全ての配列に反映されるんですね。

# なんで1次元配列だとこうならないの？
1次元配列だとこの現象は発生しませんね？

```python
a = [0] * 2
a[0] = 1
print(a) # [1, 0]
```
アドレスを見てみましょう。

```python
a = [0] * 2
print(a[0] == a[1]) # True
a[0] = 1
print(a[0] == a[1]) # False
print(a) # [1, 0]
```
最初にコピーした時点では同じアドレスを持っていますが、a[0]=1を代入するとアドレスが変化しました。

これは参照先がイミュータブル(変更不能体)かミュータブル(変更可能体)かの違いです。

1次元配列を操作する時は「整数を持つ参照先の中身を変更することはできない」(イミュータブル)ので、別のアドレスを与えることで実質的に値を変更しています。

2次元配列を操作する時は「配列を持つ参照先の中身は変更できる」のでアドレスは固定したまま値を変更することができます。

# ちなみに
こんな代入だとどうでしょう？

```python
# さっきまでのパターン
b = [[0] * 2] * 2
b[0][1] = 1
print(b) # [[0, 1], [0, 1]]
print(id(b[0]) == id(b[1])) #True

# 変化させたバージョン
b = [[0] * 2] * 2
b[0] = [0, 1]
print(b) # [[0, 1], [0, 0]]
print(id(b[0]) == id(b[1])) #False
```
新たにアドレスが生成されます。
この場合は「中身の操作」ではなく「再定義」という扱いになり、参照先が変更されます。

```python
b = [[0] * 2] * 2
b[0] = [0, 0]
print(b) # [[0, 0], [0, 0]]
print(id(b[0]) == id(b[1])) #False
```

# 参考など

参考: http://delta114514.hatenablog.jp/entry/2018/01/02/233002

追記:
コメントの指摘を元に内容を修正しました。「Pythonは全て参照渡し」「イミュータブル(変更不能体)とミュータブル(変更可能体)」あたりの概念を理解してませんでした。
参考: https://snowtree-injune.com/2019/09/16/shallow-copy/
ReadyNAS RN212から取り出したHDDからデータを救出する

# まえがき
NetGear製のNASキット「ReadyNAS RN212」において、JBODモードで利用していたドライブを本体から取り出しました。

後になって、USB変換ケーブルなどで接続してデータを取り出そうとした際に、何故かソフトウェアRAID (mdadm) と格闘する羽目になったため、同様のシチュエーションに陥った方向けに解決法を記録します。

## 前提
- 作業環境: ReadyNAS 212本体
    - フロントのUSB端子にHDDを接続
    - SSHを有功にしてrootでログイン可能
- 取り出したディスク: `/dev/sdc`
- 取り出したい領域: `/dev/sdc3`
- マウントポイント: `/mnt/test`

# 結論
JBODで構築したドライブであっても、ReadyNASでは **1台構成のRAID1** としてビルドされます。
したがって、別のマシンでマウントする場合はRAID1の再構成が必要となります。

```shell-session
~# fdisk -l /dev/sdc

Disk /dev/sdc: 2.7 TiB, 3000558944256 bytes, 5860466688 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: ***************************************

Device       Start        End    Sectors  Size Type
/dev/sdc1       64    8380487    8380424    4G Linux RAID
/dev/sdc2  8388672    9435207    1046536  511M Linux RAID
/dev/sdc3  9437248 5860270919 5850833672  2.7T Linux RAID  <- データ領域

~# mdadm -v --assemble --force --update=devicesize --run /dev/md13 /dev/sdc3
mdadm: looking for devices for /dev/md13
mdadm: /dev/sdc3 is identified as a member of /dev/md13, slot 0.
mdadm: added /dev/sdc3 to /dev/md13 as 0
mdadm: /dev/md13 has been started with 1 drive.

~# mkdir /mnt/test
~# mount /dev/md13 /mnt/test
~# ls /mnt/test
home  Music  Photo  Temp  Videos
```

# 蛇足
Windowsに接続すると、パーティション情報が消えます。
[TestDisk](https://www.cgsecurity.org/wiki/TestDisk_JP)でパーティションを再スキャンした上でWriteして無理やり直しました。

# あとがき
Twitterでmdadm絡みの情報を教えてくれた @TAKUMA327 さん、ありがとうございます。
[Linuxで既存の単一ドライブを新しいドライブとミラーリングする](https://qiita.com/TAKUMA327/items/2249c33e37b9b1d54e3f) も大変参考になりました。
C++ __VA_ARGS__ のメモ

https://cpprefjp.github.io/lang/cpp11/variadic_macros.html


マクロで可変引数を扱うので使う

```
#define MYFUNC(s, ...) printf(s, __VA_ARGS__)
```

など.

## 問題: 空の `__VA_ARGS__`

MYFUNC("bora")

みたいに, `__VA_ARGS__` が空になるのは本来は error になる.
(clang `-Weverything` にすると, `-Wgnu-zero-variadic-macro-arguments` warning が出る)

### ダブルハッシュ(GNU 拡張)

`##__VA_ARGS__` という表記で, 空の引数を扱える.

https://ja.wikipedia.org/wiki/%E5%8F%AF%E5%A4%89%E9%95%B7%E5%BC%95%E6%95%B0

gcc 独自構文でした.

### C++20

C++20 からは `__VA_OPT__` が導入されひとまず解決

https://cpprefjp.github.io/lang/cpp20/va_opt.html

### C++11 orlater

C++11 or later では, 可変引数テンプレートで対応できないか検討してみる.
たとえば, ロギングとかで `__LINE__` などを使いたいときはどうしてもマクロ経由になるが, 実装をなるべくテンプレート関数で置き換える.
[Ruby]使えるようにしておくと便利な記法

### はじめに
ずっとC言語使ってきたせいか、書き方もついついC言語で出来る書き方に寄ってきてしまう。
さすがに慣れてはきたものの、たまに忘れてしまうため備忘録として残しておく。

Rubyをちょっと勉強していれば知っていて当たり前のものではあるが。。。

### ||=
一般的には`nilガード`と呼ばれているもの。

```:nilガードの例
def users
  @users ||= []
end
```
```:nilガードを使わなかった場合
def users
  @users || (@users = [])
end
```
※上記のようなゲッターメソッドの書き方は良く使われるらしい。

### &.
正式名称は`Safe navigation operator`、通称`ぼっち演算子`とのこと。
レシーバの後に付けることで、レシーバがnilの場合でもエラーを吐かずにnilを返す。

RailsではActiveSupportに`try!`という似たメソッドがあるため、あまり使われないかも。
<strong>ただし、速度的にはこちらの方が有利</strong>

```:&.の例
# objectがnilの場合：nilを返す
# objectがnilでない場合：emailメソッドの結果を返す
object&.email
```
※emailが実装されていない場合、エラーを吐く。

### %記法
代表的なものとして、`%w`と`%i`について記載する

```:%w：文字列配列
# %wを使う場合
%w(tokyo kanagawa saitama)

# %wを使わない場合
["tokyo", "kanagawa", "saitama"]
```
```:%i：シンボルの配列
# %iを使う場合
%i(tokyo kanagawa saitama)

# %wを使わない場合
[:tokyo, :kanagawa, :saitama]
```


ブロック関係など、他にも色々あるので、後々追記していくかもしれません。
もっとこういうのも覚えておくと良いというものがあればお願いします！
bitFlyer ccxtライブラリ 

[ccxtライブラリGithub](https://github.com/ccxt/ccxt)
## 初期設定
```python:init
import ccxt
from pprint import pprint


bitflyer = ccxt.bitflyer()
bitflyer.apiKey = '**********'
bitflyer.secret = '**********'
```

## CCXT⇄公式対応済み関数一覧 
```python:ccxt-public
"""
CCXT経由(public)
対応している共通の関数（メソッド）の一覧
"""
pprint(bitflyer.has)

"""
CCXT経由(public)
Ticker情報を取得する
fetch_ticker(self, symbol, params={})
"""
ticker = bitflyer.fetch_ticker(symbol='BTC/JPY', params = { "product_code" : "FX_BTC_JPY" })
pprint(ticker)
```

```python:ccxt-private
"""
CCXT経由(private)
新規の注文を行う
create_order(self, symbol, type, side, amount, price=None, params={})
"""
order = bitflyer.create_order(
    symbol = 'BTC/JPY',
    type='limit or market',
    side='buy or sell',
    amount='0.01',
    price='800000',
    params = { "product_code" : "FX_BTC_JPY" }
)
pprint( order )

"""
CCXT経由(private)
注文中一覧情報を取得する(未約定)
fetch_open_orders(self, symbol=None, since=None, limit=100, params={})
"""
orders = bitflyer.fetch_open_orders(
    symbol = "BTC/JPY",
    params = { "product_code" : "FX_BTC_JPY" }
)
pprint( orders )

"""
CCXT経由(private)
すべての注文を取得する(未約定/約定済)
fetch_orders(self, symbol=None, since=None, limit=100, params={})
"""
orders = bitflyer.fetch_orders(
    symbol = "BTC/JPY",
    params = { "product_code" : "FX_BTC_JPY" }
)
pprint( orders )

"""
CCXT経由(private)
注文をキャンセルする
cancel_order(self, id, symbol=None, params={})
"""
bitflyer.cancel_order(
    id = "**********-******-******",
    symbol = "BTC/JPY",
    params = { "product_code" : "FX_BTC_JPY" }
)
```

## CCXT経由で各取引所のAPIを直接使う方法
**関数名 ： bitFlyer.A_B_C()**

A）APIの種類が`private`か`public`
B）APIのメソッドは`GET`か`POST`
C）APIの`リクエストURL（パス）`



> 例）Bitflyerの証拠金の状態を取得するAPIの場合
> APIの種類 ： プライベートAPI
> APIのメソッド ： GET方式
> APIのパス ： /v1/me/getcollateral

例）CCXTの内部で実装されている関数名

```python:bitFlyer-private
"""
bitFlyer(private)
証拠金の状態を取得
"""
collateral = bitflyer.private_get_getcollateral()
pprint( collateral )
```
Pandasでよく使うコードをまとめてみた

kaggleを始めてデータサイエンスに触れる機会が増えてきたため、pythonを使う私は必然的にpandasを用いてデータの処理をすることになりました。
今回は個人的によく使うコードをまとめています。ほぼ自分用のメモになりますが、誰かのお役に立つこともあるだろうかと思いqiitaにまとめて投稿することにしました。
他にもっと良い記法があるなど、何かしらのアドバイスや感想がございましたらコメントで教えていただけると幸いです。また、汎用的なコードはあれば随時更新していきたいと思います。

# DataFrame
データの作り方。特にどれが良いということは無いですが、2通りで同じデータを作ります。自分がやりやすい方を場合によって使い分けてください。出力は同じです。
## method 1
```python
index = ['a','b','c']
columns = ['A','B','C']
inputs = [[1,2,1],[3,4,3],[5,6,5]]
df = pd.DataFrame(columns = columns,index = index)
for i,columns in enumerate(columns):
    df[columns] = inputs[i]
df
```
|   | A | B | C |
|:-:|:-:|:-:|:-:|
| a | 1 | 3 | 5 |
| b | 2 | 4 | 6 |
| c | 1 | 3 | 5 |

## method 2
```python
index = ['a','b','c']
df = pd.DataFrame({
    'A':[1,2,1],
    'B':[3,4,3],
    'C':[5,6,5]},
    index=index)
df
```
|   | A | B | C |
|:-:|:-:|:-:|:-:|
| a | 1 | 3 | 5 |
| b | 2 | 4 | 6 |
| c | 1 | 3 | 5 |

今回はindexといして適当なアルファベット(a,b,c)を入れていますが、indexを指定しなければ0から数字を割り振ってくれます。

# Feature Encoding
特徴量の変換に関していくつかまとめ。
## One-Hot Encoding
データをいじっているとonehot vectorに変換したくなる場面は少なく無いと思います。sklearnのOne-Hot Encodingを用いることもできますが、pandasでデータを管理しているのであればget_dummesを使う方が効率がいいと思います。

```python
pd.get_dummies(df['A'])
```

|   | 1 | 2 |
|:-:|:-:|:-:|
| a | 1 | 0 |
| b | 0 | 1 |
| c | 1 | 0 |

## Frequency Encoding
これは完全に個人的なコードです。また使うこともあるだろうと思ったのでメモしておきます。処理としては,値を出現回数のラベルに変換して返すというものです。

```python
df.groupby('B')[['B']].transform('count')
```
|   | B | 
|:-:|:-:|
| a | 2 | 
| b | 1 | 
| c | 2 | 

Bのcolumnsで3が出現する回数が2回,4が出現する回数が1回ということですね。

まだ全然まとめ切れていないのですが、ひとまずこれにて。またコードを追加していこうと思います。
property フィールドでデシリアライズする（問題未解決）

次の用なモデルを定義する:

    class Drink(models.Model):
        name = models.CharField()

        def get_volumes(self):
            return [int(dc.volume) for dc in self.drinkcontainer_set.all()]

        def set_volumes(self. volumes_list):
            for vol in volumes_list:
                dc = DrinkContainer(drink=self, volume=vol)
                dc.save()

        volumes = property(get_volumes, set_volumes)

    class DrinkContainer(models.Model):
        drink = models.ForeignKey(Drink)
        volume = models.IntegerField()
    
そして DRF serializer

    class DrinkSerializer(serializers.ModelSerializer):
        volumes = serializers.StringRelatedField(many=True, read_only=True)

        class Meta:
            model = Drink
            fields = ('name', 'volumes')

manage.py dumpdata --natural-foreign で、このように JSON にシリアライズできる:
	
    {
	"name":["Orangina"],
	"volumes":["250", "400"]
    }


これをデシリアライズ(なんて単語なんだ、これ)し、"Orangina" の Drink オブジェクトそして二つの DrinkContainer オブジェクトを生成したい。

manage.py loaddata をすると、FieldDoesNotExist: Drink has no field named 'volumes'　の例外が飛ぶ。
Python手遊び(ifの1行表記)

#この記事、何?
いまだにPython書き慣れない。。。
表題の1行表記で「？？？」ってなって詰まったので備忘録を少々。。。

#つまり何?
Pythonで1行でif文書けるじゃないですか。こんなの。


```python
# (こんなの)
>>> print('True') if True else print('False')
True
```

それを使ってこれが書きたかった。


```python
# (これ)
>>> if True:
...     para = 'True'
... else:
...     para = 'False'
...
>>> para
'True'
>>>                                                                                                    
```

で、書いてみたらエラーになった。

```python
>>> para = 'True' if True else para = 'False'
  File "<stdin>", line 1
SyntaxError: can't assign to conditional expression
>>>
```

正しくはこう書くらしい。

```python
>>> para = 'True' if True else 'False'
>>> para
'True'
```

なるほど。

左辺の「para」という変数に右辺を代入する。
その右辺として何を書くかという話。
そう考えると、「'True' if True else 'False'」という値は成立するけど、
「'True' if True else para = 'False'」という値は不自然。
ちょっと納得しました。

```python
>>> 'True' if True else 'False'
'True'
>>> 'True' if True else para = 'False'
  File "<stdin>", line 1
SyntaxError: can't assign to conditional expression
```


# 参考にしたサイト

■Pythonの三項演算子（条件演算子）でif文を一行で書く
https://note.nkmk.me/python-if-conditional-expressions/

■Why is this simple conditional expression not working? [duplicate]
https://stackoverflow.com/questions/32954481/why-is-this-simple-conditional-expression-not-working


#ちょっとだけ深掘り...
いや、平日だから寝ないの?という気はしてきたけど気になったので。

最初に誤解したのはこうだと思っていたから。

(Trueのときに実行される命令) if (条件) else (Falseのときに実行される命令)

でもこれはちょっと違う。(ある意味あってるといえばあっているかもだけど。。)
あくまでif文は条件をもとに値を返すもの。
こんな。

(TrueのときにReturnされる値) if (条件) else (FalseのときにReturnされる値)

あれっ?だったら最初のprint文はなに、と気になった。

```python
>>> a = print(3)
3
>>> a
>>> type(a)
<class 'NoneType'>
>>> a
>>> a is None
True
```

なるほど。
printはC#とかでいうところのvoid型なのかな?
違うな。Object型でNoneを返すということかな。

なので、「print('True')」という値を得るために処理が実行された過程で文字がprintされるのね。

納得です。
kerasのインストール

ちょっと気になった機械学習のソフトウェア
kerasをインストールして見ようと思います。

# Keras
Kerasは、Pythonで書かれたオープンソースニューラルネットワークライブラリです。
MXNet、Deeplearning4j、TensorFlow、CNTK、Theanoの上部で動作することができます。
今回はTensorFlowを使います。

## 1,TensorFlowのインストール
TensorFlowとは、Googleが開発しオープンソースで公開している
機械学習に用いるためのソフトウェアライブラリです。

まずこれをインストールします。

```bash:ターミナル
pip3 install tensorflow
```

## 2,kerasのインストール
肝心のkerasをインストールします。

```bash:ターミナル
pip3 install keras
```

# pip

pipはPythonで書かれたパッケージソフトウェアをインストール・管理するためのパッケージ管理システムです。
多くのPythonパッケージは、Python Package Index 上にあります。 
pipはPython 2.7.9以降、Python 3.4以降からデフォルトで付属するようになった。


# 軽い忠告

下記のようなエラーがでましたが、最新のpipが使えますよという忠告なだけでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430767/77d74ab6-fdde-982f-9d02-aa344ef2139c.png)
Progate始めたてのあなたが読む記事①

プログラミングを学び始めてprgateを使っての学習のまとめです。



<p>
<p>
prgateを始めたての初心者の方要所要所で
概念がわからない事があると思うのでこちらの記事も参考にしてください。

<p>
<p>
<h1>HTMLとCSSとは</h1>
<p>
<p>

この2つはwebページを作成するにあたってパソコンに司令を出す言語です。

日本人には日本語で話しますし英語圏に人には英語で話しますよね。

それと同じようにパソコンにはパソコン語で司令を出します。

いくつか種類がありますがその中で最も基本的なものがこの

HTML/CSSだと思ってください。



<p>
<p>
このHTML/CSSを学べば基本的なwebページは作れるようになります。

prgateを実際にやりながら復習として見てくださいね。


<p>
<p>

まずHTML/CSSを作成するにあたってテキストエディターという

ノートのようなものを用意します。


<p>
<p>
このエディターに実際にHTML/CSS言語を入力し最終的にパソコンに

命令を出す文章を作成していくというわけです。

<p>
<p>

エディターも豊富にありますがおすすめは【Visual Studio Code】

豊富なプラグインもあり僕も愛用しております。


<p>
<p>
progateでは用意する必要はありませんが

実際にweb制作に取り掛かるとなると必ず必要になりますので

今のうちにダウンロードしておきましょう。


<p>
<p>

※Visual Studio Codeはこちらから↓

https://azure.microsoft.com/ja-jp/products/visual-studio-code/



それではここからHTMLについて勉強していきましょう


<p>
<p>


<h2>【タグ】</h2>

HTMLを入力する際にテキストにタグと言う印を付けていきます。

このタグをつける事によって文章に能力を与えることになります

例えば文字を大きくするタグの代表例の h1

というものがあります。これを使用すると



<h1> お肉大好き　</h1>


となるわけです。


このようにタグをつかって言葉に意味をもたせて

自分好みのwebサイトを作っていくのがHTML/CSSというわけです。

<p>
<p>
<p>



次回はprogateを進めていくにあたって登場する様々なタグをご紹介します！
ActiveRecordで使っているDBの接続情報を調べる

## 手順

1. サーバーが動いていることを確認する
2. `rails c`をする
3. irbの中で下記のActiveRecord〜を実行する

### Rails 6.1以降

```sh
irb(main):001:0> ActiveRecord::Base.connection_db_config
# => #<ActiveRecord::DatabaseConfigurations::HashConfig:0x000000000 ...
```

### Rails 6.0以前

```sh
irb(main):001:0> ActiveRecord::Base.connection_config
# => {:pool=>5, :timeout=>5000, :database=>"db/development.sqlite3", :adapter=>"sqlite3"}
```

## 参考リンク

- https://apidock.com/rails/ActiveRecord/Base/connection_config/class
- https://github.com/rails/rails/pull/38005
COTOHA API の英語力に勝てるか？？

# COTOHA API での英語の解析
COTOHA APIを使えば日本語の解析ができる。
だが、COTOHA API なら、日本語の解析だけでなく、英語の解析もできる。

例えば、COTOHA API で "something just like this" を解析してみると、"サムシング ジャスト ライク ディス" というカタカナ読みが得られるのだ。

# 未登録語の解析
しかし、COTOHA API では、辞書にない単語はアルファベット1文字の読みを連結した読みになってしまうようだ。

```javascript
{"form": "london", "kana": "エルオーエヌディーオーエヌ"}
{"form": "english", "kana": "イーエヌジーエルアイエスエッチ"}
{"form": "sunday", "kana": "エスユーエヌディーエーワイ"}
```
※必要な要素のみ

# 英単語をカタカナ読みに変換
英単語をカタカナに変換するのは、まさに「翻訳」だ。

英単語をアルファベット文字の系列とみなし、カタカナ読みをカタカナ文字の系列とみなせば、アルファベットの系列をカタカナの系列に変換する encoder-decoder の問題とみなせる。

そして、学習データさえあれば、deep learning で学習して、英単語をカタカナに翻訳することができる。
※すでに誰かがやっているはずだと思うが。。。


# 学習データの作成
[『詳解 ディープラーニング 第2版』](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-TensorFlow-Keras%E3%83%BBPyTorch%E3%81%AB%E3%82%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-%E5%B7%A3%E7%B1%A0/dp/4839969515)をで紹介されている英文の学習データを COTOHA API で解析する。
そして、英単語がアルファベット読みになっていないものを抽出して、英語⇒カタカナの学習データとする。

実際の学習データの作成手順は以下のとおりだ。

[1] アルファベットからカタカナ読みに変換する変換表を作成する。
具体的には、"a" => "エー"、"b" => "ビー"、 ...、"z" => "ゼット" という変換表を作成する。

[2] 英単語を [1] の変換表を使って、アルファベット読みを生成する。
例えば、"pen" から "ピーイーエヌ" を生成する。

[3] COTOHA API の解析結果の kana とアルファベット読みを比較して、アルファベット読みと一致していないものを出力する。
例えば、"pen" の kana は "ペン" となるため、学習データとするが、"ok" の kana は "オーケー" というアルファベット読みと一致するため、学習データとはしない。


# 学習してみる
[『詳解 ディープラーニング 第2版』](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-TensorFlow-Keras%E3%83%BBPyTorch%E3%81%AB%E3%82%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%87%A6%E7%90%86-%E5%B7%A3%E7%B1%A0/dp/4839969515)を参考にして、入力：英単語 ⇒ 出力：カタカナ読み を ニューラルネットワーク（Bidirectional LSTM）で学習してみた。

学習データに含まれる英単語については、うまく学習できているようだ。

入力: city
出力: シティ

入力: answer
出力: アンサー

入力: question
出力: クエスチョン

入力: beautiful
出力: ビューティフル

入力: station
出力: ステーション


# 学習していない英単語で試してみる
学習していない英単語で、ニューラルネットワークの学習成果を見てみた。

入力: natural
出力: ナチュラル
自然な感じだ。

入力: language
出力: ラングエッジ
忠実なカタカナ読みだと、こんな感じになるのだろう。

入力: scientist
出力: サイエンティスト
意外にも、うまくいっている。

入力: sunday
出力: サンディ
いい感じだ。


# さらに試してみる
[前回の投稿](https://qiita.com/dakikd/items/f15d4814a52ef17670cd)で、"COTOHA" を COTOHA API で解析した結果では、"COTOHA" は辞書に登録されていないためか、読みは "シーオーティーオーエッチエー" だった。

今回、COTOHA API の解析結果を学習することで、"COTOHA" を正しく読めるようになったのだろうか？

まずは、こちらから。
入力: qiita
出力: クイット
"quit" は学習データにはないのだが。。。

さぁ、どうだろう。
入力: cotoha
出力: コール
あぁ、だめだ。。。

# おわりに
最新技術の deep learning を使って、COTOHA API の解析結果を学習して、英単語をカタカナ読みに翻訳してみた。

ある程度うまくいったものの、"COTOHA" を正しく翻訳することはできなかった。

"COTOHA" に追いつくのは、まだまだ先のようだ。
クリーンアーキテクチャーのQ&A

## まとめ
- クリーンアーキテクチャーは、
    - UIやツール、データの保存方法などを「変化が起きやすいもの」、ビジネスのコアなルール（ロジック）をそれと比べて「変化が起きにくいも」のとして住み分けをしている
    - 変化が起きにくいものは、変化が起きやすいものに依存しないように、順番に並べて依存の方向を大事にしている
    - 結果的にテストしやすく、新陳代謝もしやすい、柔軟なシステムが構築できる
<img width="502" alt="スクリーンショット 2020-03-11 10.10.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5514/32f56809-c269-be1d-8fc3-5bb8da6b323e.png">

## Q&A
### なんでこんなに何層ものレイヤーに分けるの？
- ロジックを関心によってグループ化することで下記のメリットがある
    - 修正の目的や頻度もグループ化され、良くいじるところとそんなにいじらないところが分かれる
        - (e.g.) UI層は更新頻度が高く、刷新機会も多い
    - 良くいじられる層を外側にし、依存方向を内側向きの一方向にすることで、外側を捨てやすくなる
        - (e.g.) ReactをVueにする
        - (e.g.) 自前DBを外部APIにごっそり差し替える
    - サービス（プロダクト）にとって大事な部分が中心に集まり、webでもアプリでもCUIでもヘッドレスでも使えるようになる
    - その関心に着目したテストが描きやすくなる
        - (e.g.) UIを意識せずにユースケースをテストすることができる
        - (e.g.) ATMでもネットでも窓口でも関係なく、銀行では残高以上のお金を引き出せないテストができる
- 「not for ロジックの共通化や流用」、「for 保守性や変更容易性」
    - 例え他で流用できない常に1:1のような分離でも、保守性や変更容易性が上がるのであれば分離する

### 層がありすぎて違いがわからない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5514/a44b6208-eb2f-01d7-0c4b-bf685603d44f.png)
[ボブおじさんのブログより](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)

- 黄：Enterprise Business Rules
    - 一番のコアロジック
    - ここが変わると全ての層に影響がある
    - アプリケーションに依存しない
        - (e.g.) 会計ソフトは様々なものがあるが、それらの計算の元となる法律は一緒（法律がコア）
        - (e.g.) webでもアプリでもCUIでも共通のルール
- 赤：Application Business Rules
    - アプリケーションに固有のルール
    - アプリケーションが何をできるのかを書いていく
    - 基本的にはコアロジックを順番に呼び、ユーザーのやりたいことを実現する形になる（ユースケース）
        - (e.g.) うちの会計ソフトは、この法律をこういう手順で処理していくよ
        - (e.g.) webユーザーは情報を一括で見せる、スマホアプリユーザーには少数精鋭で見せる
- 緑：Interface Adapters
    - 青と赤の架け橋となり、データの変換を行う
        - (e.g.) DBが処理できるようにSQLに変換する
        - (e.g.) viewが使いやすいオブジェクト形式に変換する
- 青：Frameworks & Drivers
    - DBやwebフレームワークなど
    - 逆に緑より内側ではフレームワークなどの影響を排除する

### このレイヤー構造を徹底しないとだめなの？
- 飽くまでコンセプトを伝えるために書き出されたものなので、カスタマイズはOK
- 次の点は守りたい
    - 依存方向は内側に向かって一方向
    - 内側が抽象度が高く、外に行くにつれて具体的（詳細）になって行く

## 参照
- [The Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)（本家ブログ）
- [Clean Architecture](https://www.amazon.co.jp/dp/4048930656)（本家書籍）
- [クリーンアーキテクチャ(The Clean Architecture翻訳)](https://blog.tai2.net/the_clean_architecture.html)
- [実装クリーンアーキテクチャ](https://qiita.com/nrslib/items/a5f902c4defc83bd46b8)
- [持続可能な開発を目指す ~ ドメイン・ユースケース駆動（クリーンアーキテクチャ） + 単方向に制限した処理 + FRP](https://qiita.com/kondei/items/41c28674c1bfd4156186)
JGitで"git log --follow <path>"を実現

Gitの再実装である`JGit`は，JavaのAPIとして利用できることから開発や研究などの幅広い分野で用いられている．
一方非常に癖があることで知られており，良く知られているコマンドを実行するのにも苦労することがある．
今回は，ファイル名の変更を考慮したうえでファイル単位のログを取得する`git log --follow <path>`をJGitを用いてJavaプロジェクト内で実行する方法をメモとして書き残しておく．

## 方法
実は過去に似たような質問がStack Overflowでされていて，それに対する解答もある．
https://stackoverflow.com/questions/11471836/how-to-git-log-follow-path-in-jgit-to-retrieve-the-full-history-includi

一方，この実装はかなりイケてないらしい（https://www.eclipse.org/lists/jgit-dev/msg03286.html ）．
JGitの開発者曰く，用意されている`FollowFilter`を使えば良いらしい．

## 実装
`FollowFilter`はインスタンスを`RevWalk`に食わせて使うらしいので，`call()`の返り値をダウンキャストして食わせれば良さそう．

```kotlin
class LogCommand(projectPath: Path) {
    private val repository: Repository = FileRepository(projectPath.resolve(".git").toFile())
    private val git: Git = Git(repository)

    fun execute(filePath: Path): List<RevCommit> {
        val followFilter: FollowFilter = FollowFilter.create(filePath.toString(), Config().get(DiffConfig.KEY))
        followFilter.renameCallback = DiffCollector()

        val walk = git.log().addPath(filePath.toString()).call() as RevWalk
        walk.treeFilter = followFilter
        return walk.toList()
    }

    private static class DiffCollector : RenameCallback() {
        val diffs: MutableList<DiffEntry> = mutableListOf()
        override fun renamed(diff: DiffEntry) {
            diffs.add(diff)
        }
    }
}
```

実行した感じちゃんと動いてそう．
Githubでのプログラム修正の流れ　その1

##はじめに
この記事ではGitを用いてプログラムの新規作成→コミット→ブランチの作成→プログラム修正→プルリクエスト→マージまでの流れを解説しようと思います。
3/18更新 [Githubでのプログラム修正の流れ その2](https://qiita.com/ysda/items/61318db52b45da31eaf2)を書きました。
3/25更新 [Githubでのプログラム修正の流れ その3](https://qiita.com/ysda/items/b08098aa55db7e2d0fae)を書きました。

##Git用語
Gitで使われる用語でこの記事内に出てくる言葉は以下の通りです。

| 用語       |       意味 |
|:-----------------|------------------:
| リポジトリ             |ファイルやディレクトリの<br>変更履歴を保管しておくもの|
| ローカルリポジトリ        |自分のPC上にあるリポジトリ|
| リモートリポジトリ        |インターネット上に存在するリポジトリ<br>GitHubやbitbucket等|

##事前準備
適当なディレクトリに適当なファイルを作りましょう！（私は ~/projects/gittest/git_test.html　を作りました。）

##リポジトリの作成
事前準備で作成したディレクトリの中身を確認してみましょう。

```
% ls -a
.		..		git_test.html
```
先程私が作成したファイルしかありませんね。(lsコマンドのオプションに-aを付けると隠しファイル、ディレクトリも表示されます。)それでは、リポジトリを作成するために以下のコマンドを実行しましょう。

```
% git init
Initialized empty Git repository in /hoge/fuga/projects/gittest/.git/
```
こんな感じの結果が表示されると思います。それでは再度「ls -a」を実行しましょう。

```
% ls -a
.		..		.git		git_test.html
```
.gitディレクトリが作成されました！これで.gitディレクトリが作成されて、gittestディレクトリ以下のファイルはGitで管理できます！

##ローカルリポジトリの作成
ここからGitHubDesktopというアプリを使います(インストール手順は割愛)。これを使えばGUIでGitの操作ができるので楽です！
まずは画像のCurrentRepositoryをクリック。
![スクリーンショット 2020-03-04 20.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/a728f311-702c-77db-45e2-38546756f018.png)
するとこんな感じになるので、Add→Add Existing Repositoryをクリック。
![kpx7Oxv3f61OgBT1583323874_1583324031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/4687dfd8-ad32-0138-4258-4384951db4f2.png)
![UHsCMUdEDDynOvA1583851477_1583851517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/672f5d32-0ce6-b9a3-4d27-af3b8f8be9a3.png)
ここで先ほど作成した「gittest」ディレクトリを選択します。
![スクリーンショット 2020-03-04 21.18.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/7bff0b1c-281a-b5b0-8f88-0562ed9e4dd8.png)
これでGitHubDesktopで「gittest」を扱えるようになりました！
![wqTFOQnZuIaqe2U1583852996_1583853046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/11bce53e-572a-3e54-d8fc-aaa8a5aa558f.png)

##中断
筆者の体力の問題で、この記事は一旦ここまでです。その2、その3も近日中に執筆します。(場合によってはその4、その5と続くかも)
↓その２を書きました
https://qiita.com/ysda/items/61318db52b45da31eaf2
Wordpressでページネーション実装する一番簡単な方法

Wordpressの一覧ページでプラグインを使わずにページネーションを実装する方法。

具体的なパラメータなどはcodex参照。
[paginate_links()](https://developer.wordpress.org/reference/functions/paginate_links/)


## 一覧ページでページネーション

### リストを出力する
- funciotns.phpに以下の関数を追記し、テンプレートで呼び出し
- 関数の部分を直接テンプレート側に記述してもOK

```php
// functions.php
function the_pagination() {
  // 一覧ページのクエリ
  global $wp_query;
  // ありそうもない数字をセット
  $big = 999999999;
  // １ページ以下なら非表示
  if ( $wp_query->max_num_pages <= 1 ) return;
  echo paginate_links( array(
    'base'         => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format'       => '?paged=%#%',
    'current'      => max( 1, get_query_var('paged') ),
    'total'        => $wp_query->max_num_pages,
    'type'         => 'list',
    'end_size'     => 2,
    'mid_size'     => 2
  ) );
}

// index.php
<?php if( function_exists("the_pagination") ) the_pagination(); ?>
```

### ページネーションでulやliタグをカスタマイズする

- 上の方法だとHTMLタグ変えられないのでClassの変更とかしたい場合はこちら
- `type`をarrayにするとaタグの配列を取得できるのでPHPで表示する

```php
// functions.php
function the_pagination() {
  // 一覧ページのクエリ
  global $wp_query;
  // ありそうもない数字をセット
  $big = 999999999;
  // １ページ以下なら非表示
  if ( $wp_query->max_num_pages <= 1 ) return;
  return paginate_links( array(
    'base'         => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
    'format'       => '?paged=%#%',
    'current'      => max( 1, get_query_var('paged') ),
    'total'        => $wp_query->max_num_pages,
    'type'         => 'array',  // arrayに変更
    'end_size'     => 2,
    'mid_size'     => 2
  ) );
}
```

```php
// index.php
<?php 
if( function_exists("the_pagination") ) {
  $pagination_array = the_pagination();
  // 配列じゃないなら非表示
  if ( !is_array($pagination_array) ) return;
  echo '<ul class="nav pagination">';
  foreach($pagination_array as $key => $val) {
    echo '<li class="item">'.$pagination_array[$key].'</li>';
  }
  echo '</ul>';
}

?>
```
AWSのMFA有効化を例にTOTPをざっくり説明

AWSのルートアカウントのMFA(多要素認証)を有効化しました。
MFAにはTOTPという仕組みが使われているようですが、この仕組みがよくわからず初めてサインインする時に戸惑ってしまったので調べてみました。
※認証素人が調べた結果ですので誤りがあるかもしれません。ご指摘頂けると嬉しいです。

##MFA有効化の流れ

仕組みの前にまずはAWSの有効化の手順を記します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308422/6a4aec6d-a436-3b4e-2698-ed1dca2c83aa.png)


①AWSコンソールからMFAを有効化するためにブラウザ上にQRコードを表示
②スマホでGoogle Authenticatorアプリをインストールして①のQRコードを読み取る
③アプリ上に6桁の数字が表示されるのでこの数字を[MFAコード1]に入力。30秒経過すると数字が切り替わるので切り替わった後の数字を[MFAコード2]に入力
④今後AWSにサインインする時はMFAコードの入力を求められるのでスマホでGoogle Authenticatorを起動し表示されている数字を入力してサインインする

※アプリの名称ですがiOSではGoogle Authenticator、AndroidではGoogle 認証システムとになっています


##ざっくり仕組み

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308422/e36cc2f2-e76a-8213-9c1a-aee4a420b0a6.png)

AWSでMFA設定をするときにQRコードを表示しますが、この時に秘密鍵が生成されています。これをGoogle Authenticatorで読み取るとサーバーとクライアントに秘密鍵が保存されます。

QRコードを読み取るとアプリ上では6桁の数字が表示されます。この数字はワンタイムパスワードとなっており30秒ごとに違う数字に切り替わります。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308422/1e79e718-5ee5-27c4-c194-476330568352.png)

この数字を生成しているアルゴリズムが**TOTP**(Time-Based One-Time Password Algorithm)です。

TOTPとは
>ある時刻においてカウンターがサーバーとクライアントで等しければ、サーバーとクライアントで秘密鍵を共有しているため同じ確認コードが計算されるはずであるから、サーバーとクライアントで確認コードの計算結果が一致するかどうかで認証ができるとするのが TOTP アルゴリズムである。
※『Google 認証システムの仕組み』より引用




30秒毎に数字が切り替わっているのにこの数字を入力するとAWSにサインインできるのが不思議でした。しかしTOTPの仕組みがわかってみると納得することができました。
セキュリティ強化のため多要素認証や二段階認証が注目されているのでざっくりでも仕組みを理解できるといつか役に立ちそうです。



####参考にさせて頂いた記事
https://sekika.github.io/2016/03/26/GoogleAuthenticator/
https://dev.classmethod.jp/etc/totp-implementation-pure-python/
Pythonでファイルに書き込まれたJSON文字列をパースする

Pythonでファイルに書き込まれたJSON文字列をパースする方法を確認したのでメモ。

## 方法（`json.load()`）

このようなファイルなら、

```data.json
{
    "data":{
        "a": "こんにちは",
        "b": 123
    },
    "c": true
}
```

`open()`で取得したデータに対し**`json.load()`**を利用すればJSONパースできる。

```python
import json

raw = open('data.json', 'r')
type(raw)
# <class '_io.TextIOWrapper'>

parsed = json.load(raw)
type(parsed)
# <class 'dict'>

parsed
# {'data': {'a': 'こんにちは', 'b': 123}, 'c': True}

print(json.dumps(parsed, ensure_ascii=False, indent=4))
#{
#    "data":{
#        "a": "こんにちは",
#        "b": 123
#    },
#    "c": true
#}
```

## 駄目な方法（`json.loads`）

- `json.loads`は、TextIOWrapperタイプのデータはパースできない。

```py
json.loads(raw)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/usr/lib64/python3.6/json/__init__.py", line 348, in loads
#     'not {!r}'.format(s.__class__.__name__))
# TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
```

以上
Angularでの品質分析

# 品質分析メモ
※とりあえず忘れないうちに書いといて、後で整形や記載見直し...

| 利用目的？ | ツール名？ | 効果？ |
|:---------------------------|:--------------------------:|:--------------------------|
| コード自動整形 | VSCode？ | 可読性向上 |
| ビルド(コンパイルエラー除去) | ng build | タイプ/コーディングミス防止 |
| 静的分析 | TSLint | コーディングミス防止 |
| 単体テスト | Jasmine＋Karma(ng test) | 実装誤り防止/カバレッジ測定 |
| E2Eテスト | Selenium | ワークフロー誤り防止 |
| 統合分析 | SonarQube | ★ |

# 参考サイト
◆Documentation | SonarQube Docs
　https://docs.sonarqube.org/latest/
　　※後でチューニングする際に参考にする!!利用バージョン押さえとかないと...
◆Vue + TypeScript のプロジェクトを SonarQubeで品質管理する
　https://qiita.com/sterashima78/items/fbb906ac21325bea2173
　　※ベースの設定値はこれを参考にすればよいか...!?
GitHubに掲載しているwikipediaのiOSアプリをXcodeシミュレーターで起動する方法


# 1.はじめに

　商用レベルで**一般公開されているiOSソースコード**を見てみたいと考えて、いざ[wikipedia-ios](https://github.com/wikimedia/wikipedia-ios)をダウンロードしたは良いものの、そのままXcodeでビルド＋シミュレーター起動するとエラーが出てしまいます。

さらに公式のREADMEの記事を読んでもわからずに、導入に苦労したので備忘録として投稿します。



# 2.環境
Xcode Version 11.3.1
Wikipedia 6.5.1(投稿時点でAppStoreでの最新バージョン)
<img width="553" alt="スクリーンショット 2020-03-10 23.20.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471470/e927cc8d-37e1-7dc7-963e-e472d61e2a2c.png">

[参考記事　
[商用レベルなiOSオープンソースアプリ集 (Macアプリも追加)](https://qiita.com/KKKKKAAAAANNNNNMMMMMOOOOO/items/cb08a47a0e4d41c7f609)
[Wikipedia iOS App: Run scripts/setup before building and running in Xcode to install all of the required dependencies.](https://www.reddit.com/r/iOSProgramming/comments/91cgi2/wikipedia_ios_app_run_scriptssetup_before/)



# 3.導入方法

結論から言うと、

1. homebrew, CarthageをMacにインストール(こちらの記事"[iOS初心者がCarthage導入する💪"](https://qiita.com/tsuzuki817/items/8f6e2e0c2b3f9d197097)が参考になります)
2. ターミナルを起動
3. `cd wikipedia-ios-6.5.1`(←ダウンロードしたファイル)を入力して、enterキー
<img width="521" alt="スクリーンショット 2020-03-10 23.19.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471470/df39898a-2159-8175-1dfe-cb27ceaec003.png">
4. `./scripts/setup`を入力して、enterキー

という順序で処理を行うだけです。
（赤いエラーが２つ出ていますが、問題なくシミュレーターが起動できます）



# 4.シミュレーター起動画面

ビルド後に

下記ボタンをクリックすると
<img width="475" alt="スクリーンショット 2020-03-10 23.41.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471470/30d5d3db-ab9b-1f4d-0225-a4ca7b7b6853.png">

こんな感じで見ることが出来ます
<img width="1792" alt="スクリーンショット 2020-02-25 22.58.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471470/5d4033aa-db97-6de3-9474-dc3e8ac1f519.png">


ざっと見た感じ、こんな感じのインターフェースになっています。
![Wikipedia_check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471470/59c59504-d56d-d22e-c64b-676c213050b0.png)


# 余談

このredittの記事を見る前は、シミュレーター起動をすることさえ思いつかず、AppDelegate.swiftのdidFinishLaunchingWithOptionsなどから、イニシャルのビューコントローラーを見つけて、一つ一つ追って行こうと考えていました・・・。
(今思うと、泥沼にハマるところでした・・・)