OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub Actionsによって生成されたものはGitHub Actionsのトリガーにはならない

例えばGitHub Actionsでtagをつけ、その生成されたtagをトリガーにGitHub ActionsでなにかしようとしてもGitHub Actionsは動きませんん。

GitHub Actionsによって生成されたもの（つまりsecret.GITHUB_TOKENを使ったcommitなど)はGitHub Actionsのトリガーにはならないようになっているからです。たぶん、無限ループになったりするのを避けるためかと思われます。

## 回避方法
これを回避方法はGITHUB_TOKENを使わないことです。

まず、GitHubのPersonal Access Tokenを取得します。

そして、[こちら](https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets)にあるように、RepositoryのSettingのSecretsに追加します。

そしてGITHUB_TOKENの代わりに設定したsecretを使います。`${{ secrets.XXX }}`

注意する点は、無限ループに陥ることはないかチェックすることです。

## 参考資料
https://github.community/t/github-actions-workflow-not-triggering-with-tag-push/17053
Kaggleのメダルとかティアー(GrandmasterとかMasterとかの称号とかランクのこと)とかについてまとめる

Kaggleのメダルの取得条件とかティアー(GrandmasterとかMasterとかの称号とかランクのこと)についてまとまってるところが軽く探した感じ見つからなかったので、メモがてらまとめときます。

(2020/06/06現在)
[公式サイト](https://www.kaggle.com/progression)からの要約です。

## カテゴリ
Kaggleには専門性毎で以下のような4つのカテゴリが存在しており、それぞれのカテゴリでティアーが独立して付与される。

### カテゴリの種類
- コンペティション
- ノートブック
- データセット
- ディスカッション

## ティアー
それぞれのカテゴリにおいて、成果の質と量に応じて5つのティアーが与えられる。
自分のティアーを知りたかったらプロフィール画面から各カテゴリのティアーが確認できる。
また、Kaggleにログインした状態で[公式サイト](https://www.kaggle.com/progression)のページへ行き、各ティアーの条件の箇所を見ると満たしている条件にはチェックが付いている。

### ティアーの種類
- Novice
- Contributor
- Expert
- Master
- Grandmaster

### ティアーの取得条件
#### Novice
Kaggleに登録した時は皆これ。

#### Contributor
Kaggleプラットフォームを触ってみたり、プロフィール充実させたり、コミュニティへ貢献したらこのティアーになります。具体的には以下の全ての条件を満たす。
- プロフィール画面下部のBioを追加
- プロフィールに場所、職業、組織の追加
- アカウントのSMS認証
- 1スクリプトの実行
- 1つのコンペサブミッションの作成
- 1コメントの作成
- 1賛成票(イイネのやつ)の投票

#### Expert
Kaggle上で多くの成果を達成するとこのティアーになる。1度このティアーになるとそのカテゴリにおけるランキングに載るらしい。条件はカテゴリ毎で異なり、具体的には以下の条件
- コンペティション: 銅2
- データセット: 銅3
- ノートブック: 銅5
- ディスカッション: 銅50

#### Master
素晴らしい成果をあげるとこのティアーになる。条件はカテゴリ毎で異なり、具体的には以下の条件
- コンペ: 金1、銀2
- データセット: 金1、銀4
- ノートブック: 銀10
- ディスカッション: 銀50、トータル取得メダル数200

#### Grandmaster
継続的に突出した成果をあげるとこの頂点のティアーになる。
- コンペ: 金5、ソロ金1
- データセット: 金5、銀5
- ノートブック: 金15
- ディスカッション: 金50、トータル取得メダル数500

## メダル
メダルはカテゴリにおいて良い成果をあげたことが認められたことを表している。
それぞれのメダルは偉大なコンペ結果、人気のノートブック、便利なデータセットまたは知に富んだコメントで得られる。

### メダルの取得条件
メダルの取得条件はカテゴリによって異なる。

#### コンペティションにおけるメダル取得条件
コンペティションの参加チーム数によって取得条件が異なる。

| |0-99チーム参加|100-249チーム参加|250-999チーム参加|1000チーム以上参加|
|:---|:---:|:---:|:---:|:---:|
|銅|上位40%|上位40%|上位100チーム|上位10%|
|銀|上位20%|上位20%|上位50チーム|上位5%|
|金|上位10%|上位10チーム|上位10チーム + 0.2%*|上位10チーム + 0.2%*|

#### データセットにおけるメダル取得条件
投票数によってメダルが取得できる。

|銅|5票|
|:---|:---|
|銀|２０票|
|金|50票|

#### ノートブックにおけるメダル取得条件
投票数によってメダルが取得できる。

|銅|5票|
|:---|:---|
|銀|２０票|
|金|50票|

#### ディスカッションにおけるメダル取得条件
投票数によってメダルが取得できる。

|銅|1票|
|:---|:---|
|銀|5票|
|金|10票|
最多勝取りそうな投手を予想する

import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression,LinearRegression
from sklearn.ensemble import RandomForestClassifier
​
from sklearn.preprocessing import StandardScaler
import warnings
​
warnings.simplefilter('ignore')
​
player_data=[]
​
#最多勝取りそうな投手を予想するタスク
​
#2009~から
mvp_player_central = {2009:['吉見　一起','館山　昌平'],2010:['前田　健太'],2011:['吉見　一起','内海　哲也'],
                      2012:['内海　哲也'],2013:['小川　泰弘'],2014:['メッセンジャー','山井　大介'],2015:['前田　健太'],
                      2016:['野村　祐輔'],2017:['菅野　智之'],2018:['菅野　智之','大瀬良　大地'],2019:['山口　俊']}
​
base_url = "https://baseball-data.com/{}/stats/pitcher-ce/"
​
for year in range(9,20):
    year_name = int(str(20)+str(year).zfill(2))
    
    year_data = []
    url = base_url.format(year)
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "lxml")
    tbody = soup.find('tbody')
    rows = tbody.find_all('tr')
    
    
    #データ追加
    #year_data.append([row.find_all('td')[3].text for row in rows])#防御率
    year_data.append([row.find_all('td')[5].text for row in rows])#勝利数
    year_data.append([row.find_all('td')[11].text for row in rows])#投球回数
    year_data.append([row.find_all('td')[16].text for row in rows])#奪三振
    #year_data.append([row.find_all('td')[19].text for row in rows])#WHIP
    year_data.append([1 if row.find_all('td')[1].text in mvp_player_central[year_name] 
                     else 0 in mvp_player_central[year_name] for row in rows])#最多勝をとった(正解ラベル)
    
    df = pd.DataFrame(year_data).T.astype(float)
    
    df.index = [row.find_all('td')[1].text for row in rows]
    
    #df.columns = ["ERA","WINS","IP","SO","WHIP","WINNING_PITCHER"]# winningest pitcher
    df.columns = ["WINS","IP","SO","WINNING_PITCHER"]# winningest pitcher
    
    player_data.append(df)
    
    
whole_year_array = np.concatenate((player_data[:-1]), axis = 0)
df_whole_year = pd.DataFrame(data = whole_year_array, columns = player_data[0].columns)
​
​
train_column = ["WINS","IP","SO"]
#train_column = ["ERA","WINS","IP","SO","WHIP"]
​
test_column = ['WINNING_PITCHER']
​
X_train = df_whole_year[train_column]
Y_train = df_whole_year[test_column]
Y_train = Y_train.astype('int')
​
X_test = player_data[-1][train_column]
Y_test = player_data[-1][test_column]
Y_test = Y_test.astype('int')
​
​
#標準化処理 
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
​
#ロジスティック回帰クラスの初期化と学習
model1 = LogisticRegression()
model1.fit(X_train_std, Y_train)
​
#予測の結果
score1 = model1.predict(X_test_std)
​
#予測の正解率
print('正解率(train):{:.3f}'.format(model1.score(X_train_std, Y_train)))
print('正解率(test):{:.3f}'.format(model1.score(X_test_std, Y_test)))
​
​
model2 = RandomForestClassifier()
model2.fit(X_train_std, Y_train)
​
#予測の結果
score2 = model2.predict(X_test_std)
​
#予測の正解率
print('正解率(train):{:.3f}'.format(model2.score(X_train_std, Y_train)))
print('正解率(test):{:.3f}'.format(model2.score(X_test_std, Y_test)))
​
​
​
Azure SDK for GoのGitHubのREADMEの日本語訳をv43.0.0に最新化

Azure SDK for GoのGitHubのREADMEを日本語訳していたものを2020年6月2日にリリースされた[v43.0.0](https://github.com/Azure/azure-sdk-for-go/tree/v43.0.0)の内容で最新化しました。

- [GitHub - qt-luigi/azure-sdk-for-go-docs-jp: Microsoft Azure SDK for Goの日本語訳 (original: https://github.com/Azure/azure-sdk-for-go)](https://github.com/qt-luigi/azure-sdk-for-go-docs-jp)

初回の v8.0.1-beta 以来、今回で2回目の更新です。

この活動には元ネタがあって、以前 @ayatokura さんがVSCodeがリリースされる都度、リリースノートの日本語訳をGitHubに公開されていたのを見て「これはよいかも！」と私も始めてみたものです。

- [GitHub - ayatokura/JP-VSCode-Docs: Visual Studio Code Documentation in Japanese](https://github.com/ayatokura/JP-VSCode-Docs)

今回更新した理由は、次の通りです。

- 私自身がこれからAzure SDK for Goを触り始めるため、最新の内容を知っておきたかった。
- Google検索にて「Azure SDK for Go」で検索すると上位に表示され、情報が古いままだとダメだと思ったため。（2020年6月7日時点：少なくとも私の環境からは公式の次に表示されています）

<img width="1440" alt="search_azuresdkforgo_20200607.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31857/5fec1806-50d2-87e1-44ba-cc6e7acaea6b.png">

引き続き、まったりと。
業務で役立つスクショにまつわる良い感じのtips たち

こんにちは。ディレクター業務をやっているとPC もスマホもスクリーンショットでいっぱいになることありますよね。
きっとみんなそうだと信じて書いていきます。

...書いてみたらスマホの話only となりました。ちなみにOS はiOS です。

## スマホでスクショをとると全画面おさまらない問題

- web ページの場合

ios 13 から追加された[神機能](https://dekiru.net/article/18900/
)が話題になりましたね。

手順

1. 全画面スクショを撮りたいweb ページに移動 > デバイスの操作でスクショを撮る
2. 画面上部のトグルにて "フルページ" を指定
3. 保存したいフォルダを指定して完了（iCloud やGoogleドライブなど）
    4. pdf で出力される [^1]

- モバイルアプリの場合

[Taior](https://apps.apple.com/jp/app/tailor-screenshot-stitching/id926653095)なるアプリがおすすめです。

操作はとても直感的で、

1. スクショを撮りたいアプリの画面で、範囲内のスクショを一枚ずつ撮る
    2. この時、各画面が少しづつ被さるように撮る
3. Tailor を起動 > デバイスのカメラロールにアクセスして自動的に判定してくれる
4. 判定に通ったものは合成され、シェアして完了（端末保存もできるし、AirDrop がすぐにできるのも素敵）
    5. png で出力される

という感じ。

被さった部分のテキストが何らかの理由で変化していたりすると、仕上がりが悪くなるので注意。

## スマホでキャプチャを撮るときの挙動が直感的じゃない問題

iPhone でスクリーンキャプチャ（スクショの動画版）を撮る時の挙動が個人的に直感的じゃなくていつも困るので、個人用メモ。

1. コントロールセンター > 録画ボタンをタップ
    2. カウントダウンが始まる (3 -> 1) この際コントロールセンターを閉じても問題ない
    3. image <img width="443" alt="ss.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/81bf0de2-4250-6c16-d4b6-13be73a8c694.png">
4. 画面左上の時刻をタップ > ダイアログが出るので"停止" で完了
    5. image <img width="375" alt="IMG_0392.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317327/6292820d-ffbd-f604-2a8f-bcdc00d2ce55.png">

### ⬆️をissue に貼り付けたい

mp4 でやたら重たいので、[ffmpeg](https://qiita.com/yusuga/items/ba7b5c2cac3f2928f040) でクオリティコントロールしつつgif にするのがおすすめ。

## LINEのスクショを撮ると個人情報がダダ漏れ問題

[LINE 周りの開発](https://developers.line.biz/ja/docs/messaging-api/using-flex-messages/)をしていてスクショ撮りたい時や、メッセージの内容が重要でそのままシェアしたい時向けのニッチなtips
後者は、LINE のログを何らかの参照先やエビデンスとして使いたい時に便利です（Slack だとリンクURL を生成できるから便利ですよね）

1. 記録したいメッセージをロングタップ
2. スクショを選択
    3. 範囲を広げたい場合さらにスクショを選択
4. 情報を隠すをタップ
5. "スクショ" をタップして完了

## そうこうして集まったスクショがカメラロールを汚す問題

わたしは自分しかいないLINEグループを作成し、メモがわりに使っています。
そこにスクショを送付して、アルバムにする運用をしています。
この辺のベストプラクティス知りたいな。。

---
この記事は[note](https://note.com/subliminal01/n/n9252752b309f) と同時に公開しています。

[^1]: 出力したpdf は[こちら](https://drive.google.com/file/d/1KlicIx56ZxIU7ITUXfJxh8BE3g7G72aw/view?usp=sharing) （前職のesa が生きてるうちに魚拓したもの。都合上pdf -> png してます。）
[Flutter]テキストを装飾

テキストのサイズを変える
→ style: TextStyle(fontSize: 40)

ex. 

```
Text('テキスト',
    style: TextStyle(
        fontSize: 40,
    ),
)
```

テキストの色を変える
→ style: TextStyle(color: Colors.green)

ex.

```
Text('テキスト',
    style: TextStyle(
        color: Colors.green,
    ),
)
```

テキストの太さを変える
→ style: TextStyle(fontWeight: FontWeight.bold)

ex.

```
Text('テキスト',
    style: TextStyle(
        fontWeight: FontWeight.bold,
    ),
)
```

テキストに下線を加える
→ style: TextStyle(decoration: TextDecoration.underline)

ex.

```
Text('テキスト',
    style: TextStyle(
        decoration: TextDecoration.underline,
    ),
)
```
[Go] ファイルの読み込み方法

ファイルの読み込む方法が色々あったので、まとめる

## 前準備: `sample.txt` の作成
https://www.lipsum.com/feed/html から:

* 5 paragraphs
* 417 words
* 2777 byte

の Lorem Ipsum 文字を取得し保存しておく。
この `sample.txt` を読み込んでいく

## `ioutil.ReadFile` で一括読み込み

* シグネチャ: `func ReadFile(filename string) ([]byte, error)`

一番簡単に読み込める。
ただ、一度に全部読み込んでメモリに入れるので、ファイルが大きい場合にはお勧めしない。

```go
func main() {
	data, err := ioutil.ReadFile("./sample.txt")
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(string(data))
}
```

## `os.Open` 後に `ioutil.ReadAll` で一括読み込み
* シグネチャ: `func Open(name string) (*File, error)`
* シグネチャ: `func ReadAll(r io.Reader) ([]byte, error)`

```go
func main() {
	file, err := os.Open("./sample.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	data, err := ioutil.ReadAll(file)
	fmt.Printf("Data: %s", data)
}
```

## `io.Copy` で読み込む
シグネチャ: `func Copy(dst Writer, src Reader) (written int64, err error)`

[こちらの記事 (英文)](https://haisum.github.io/2017/09/11/golang-ioutil-readall/) では、一括すべてを読み込む `ioutil.ReadAll` より 32kb づつしか読み込まないこっちをお勧めしている。

```go
func main() {
	file, err := os.Open("./sample.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	if _, err := io.Copy(os.Stdout, file); err != nil {
		log.Fatal(err)
	}
}
```


## `os.Open` 後に指定 `byte` 分をループで読み込む

シグネチャ: `func (f *File) Read(b []byte) (n int, err error)`

```go
func main() {

	const BUFFSIZE = 10

	file, err := os.Open("./sample.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	r := make([]byte, BUFFSIZE)

	for {
		n, err := file.Read(r)
		fmt.Printf("%d bytes: %s\n", n, string(r[:n]))
		if err == io.EOF {
			break
		}
	}
}
```
ファイル最後は `err == io.EOF` となる。それまでループすれば、全部読めることになる。

## `bufio.Reader` で読み込む

シグネチャ: `func NewReader(rd io.Reader) *Reader`

バッファ IO を使うので、パフォーマンスよく読み込めるらしい。。

```go
func main() {

	const BUFFSIZE = 10

	file, err := os.Open("./sample.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	r := bufio.NewReader(file)
	b, err := r.Peek(BUFFSIZE)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("%s bytes: %s\n", strconv.Itoa(BUFFSIZE), string(b))
}

```
[Flutter]画像の配置

## ネットワーク上の画像を表示
Image.network(画像のパス)で画像を配置できる

ex.

```
Image.network('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg')
```

＊以下でも画像を配置できる
const Image(
  image: NetworkImage(画像のパス),
)

ex.

```
const Image(
  image: NetworkImage('https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg'),
)
```

## ローカルの画像を表示
`pubspec.yaml`のflutter:→assetes:内に表示する画像のパスを記載

ex.

```
flutter:
  assets:
    - images/flutter.png
```

Image.asset(画像のパス)を配置

ex.

```
Image.asset('images/flutter.png')
```

## アイコンを表示

```
Icon(
    Icons.beach_access,
    color: Colors.blue,
    size: 36.0,
),
```
PYNQ-Z1 > はまった > 自作のbitstreamでLEDを点灯できない > VivadoがRun Connection AutomationのときにLEDのGPIOをOutportからInportに変更する

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
Vivado v2019.1 (64-bit)
```


### 概要

- Vivadoでbitstreamを作成
- LEDを点灯するだけのもの
    - AXI-GPIOで作成
- Outportにしていたが、VivadoがInportに変更をしていたため失敗していた

### Block Designとポート設定

Block Design
![コメント 2020-06-07 122846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/b18eda91-01ae-16c1-b242-07c24a5c9249.png)

ポート設定。ここがAll Inputsとなっていたため、失敗していた。
<font color=red>Run Connection Automationを実行したときにAll Inputsに強制的に変更される。</font>

Clear Board Parameterを実行して、All InputsからAll Outputsに再設定した。
![コメント 2020-06-07 122846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/50a9b9fb-9d5b-3044-5946-f2c5efab483f.png)


### I/Oポート設定

I/O Ports設定。

![コメント 2020-06-07 122846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/5e2f197e-8e02-a688-9991-f17159fea60a.png)

https://reference.digilentinc.com/reference/programmable-logic/pynq-z1/reference-manual
の12 Basic I/Oを参考にした。


### Jupyter Notebook

Block DesignのtclファイルとBitstreamファイルをアップロードした。
下記でLEDが点灯することを確認した。

```py
#from pynq.overlays.base import BaseOverlay
from pynq import Overlay
from pynq import PL

OL = Overlay("/home/xilinx/pynq/overlays/base/LEDs_2020-06-07_1351.bit")
OL.download()

from pynq import MMIO
mmio=MMIO(int(PL.ip_dict["leds"]["phys_addr"]), 4, True)
mmio.write(0,10)
```

### LED点灯の別の方法

下記のようにしてLEDを点灯できるようだ。

```py
leds = [OL.leds[index] for index in range(4)]
leds[0].off()
leds[1].on()
leds[2].on()
```

- [チラ裏PYNQ 1.Ｌチカ*](https://qiita.com/romuta/items/fda031f5d85fb8cf9073)

情報感謝です。
Djangoのadminサイトへログイン可能なユーザ権限を変更する

## 背景
仕事でadminサイトへのへログイン可能なユーザ権限を変更する必要があった。
通常だと、Djangoが認証で利用するユーザーモデルのis_staffを利用するが、今回はis_staffを利用しない方法で行う。
あまり良い記事が見つからなかったため執筆。

## 環境
Django==3.0.6

## 内容
Djangoのadminサイトへのアクセス権限は以下のメソッドで行われているよう。
通常だとis_activeとis_staffがTrueのユーザを認証していますね。

```python:django/contrib/admin/sites.py
class AdminSite:
    ...
    def has_permission(self, request):
        """
        Return True if the given HttpRequest has permission to view
        *at least one* page in the admin site.
        """
        return request.user.is_active and request.user.is_staff
    ...
```

adminサイトへのアクセス権限を変更するためにはhas_permission()をオーバーライドします。has_permisson()内で独自の認証ロジックを作成し、戻り値としてTrue or Falseを返します。作成したMyAdminSiteを管理サイトとして設定します。(MyAdminConfig)
※今回はプロジェクトの設定ディレクトリにadmin.pyとして配置しましたが、どこでも構いません。

```python
from django.contrib.admin.sites import AdminSite
from django.contrib.admin.apps import AdminConfig


class MyAdminSite(AdminSite):
    def has_permission(self, request):
        return "custom permission logic here"


class MyAdminConfig(AdminConfig):
    default_site = 'config.admin.MyAdminSite'
```

settings.INSTALLED_APPSのadminを作成したMyAdminConfigに変更するのも忘れずに

```python
INSTALLED_APPS = [
#   'django.contrib.admin'
    'config.admin.MyAdminConfig',
    ...
]
```
Difference between trigger.new and trigger.newmap

Apex トリガー覚え


Suppose you have a custom object Custom_obj__c

Trigger.New means it is a List<Custom_obj__c>

and

Trigger.NewMap means it is a map<Id, Custom_obj__c>

順序があるか、無いか。
ループでidの一致を判定するか、idで直接読むか
https://salesforce.stackexchange.com/questions/104274/difference-between-trigger-new-and-trigger-newmap

https://developer.salesforce.com/forums/?id=906F00000008unBIAQ

What to use depends on what you're doing - if you have an ID of an object you need to do something with, using the map makes more sense as you can use newMap.get(). Otherwise you'd have to loop over all the elements in Trigger.new and look for a matching ID. Similarly, if you have multiple loops over each item the trigger is operating on, the list returned by Trigger.new may be the better bet.
アルコールかどうかを判定するAIを作ってみた！

## 目的
マテリアルズインフォマティクスの勉強をしたいと思います。
今回は、有機化合物をベクトルに変換するツールであるRDKitを使って、データとして与えられた有機化合物がアルコールかどうかを判定するAIを作っていこうと思います。

## 動作環境
Python: 3.6.5
scikit-learn: 0.20.3
rdkit: 2019.03.1.0

＊ 動作環境については、Anacondaをインストールして、仮想環境を作成して構築してます。
Anacondaのインストールは、以前書いた[こちら](https://qiita.com/toshinori622/items/638e2474a2e5b1341a9a)を参照していただけると幸いです。
また、RDKitのインストールは[こちら](https://www.rdkit.org/docs/Install.html)を参照して下さい。

## ソースコード
```
# 必要なライブラリーを読み出し
from rdkit import Chem
from rdkit.Chem import AllChem
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.externals import joblib
import numpy as np

# データを準備する。
# 今回は、アルコールかどうかを判定するためにアルコール(＝1)とそれ以外(＝0)を判定します。
# 化学式は、SMILES記法で表現します。
smiles = ['CO', 'C(=O)O', 'CCO', 'C=O', 'CCCO', 'CCC', 'C(C)CO', 'C(=O)', 'CC(=O)', 'CC(=O)', 'C', 'CC(=O)C', 'CCCCO', 'C(C)CO']
ans = [1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1]

# 化学式をベクトル変換します。
mols = [Chem.MolFromSmiles(smile) for smile in smiles]
finger_print = [AllChem.GetMorganFingerprintAsBitVect(mol, 2, 1024) for mol in mols]

# データを学習データとテストデータに分割
X = np.array(finger_print)
y = ans
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 機械学習アルゴリズムのランダムフォレストでモデルの作成
forest = RandomForestClassifier()
forest.fit(X_train, y_train)

# モデルの精度を確認
forest.score(X_train, y_train)
forest.score(X_test, y_test)
```

流れとしては、以下の通りになります。
1．データの準備
2．RDKitを用いて、データをベクトル化
3．SKLearnの関数を用いてデータを分割
4．SKLearnのアルゴリズムクラスを用いてモデルの作成
5．作成したモデルの精度のチェック

GitHubの[こちら](https://github.com/ToshinoriIzumi/Mi_test_1)にjupyternotebookのファイルをUPしています。


## 参照文献
[RDKit公式ページ](https://www.rdkit.org/docs/Install.html)
TechAcademyが無料公開している「HTML・CSS入門講座」を受講する～HTML第2-2回～

# アジェンダ
* HTMLのタグ
 * em
 * strong
 * hr
* 実践

# HTMLのタグ
## em
強調を示すタグ。\<em>\</em>の内側の文書が強調される。
どのように表現されるかはWebブラウザによって異なるが、一般的には\<em>\</em>の内側の文書が斜体になる。
なお、__斜体を表現するためにemタグを使用してはいけない。__

emphasizeのem。

## strong
重要性を示すタグ。\<strong>\</strong>の内側の文書が重要であることを示す。
どのように表現されるかはWebブラウザによって異なるが、一般的には\<strong>\</strong>の内側の文書が太字になる。
なお、__太字を表現するためにstrongタグを使用してはいけない。__

## hr
文書の区切りであることを示すタグ。
\</hr>は使用しない。

horizontal ruleのhr。

# 実践
上記のタグを使用して、今回は以下のindex.htmlを作成。

```html:index.html
<!DOCTYPE html>

<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>ローレン イプサム</title>
  </head>
  <body>
    <h1>Lorem Ipsum</h1>
    <p>
      <em>Lorem ipsum</em> dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
      Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
    </p>
    <hr>
    <p>
      <strong>Duis aute irure dolor</strong> in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
      Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </p>
  </body>
</html>
```

これをWebブラウザで表示させるとこんな感じ。
![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648214/19d531a7-f4ab-644e-bcb0-1464fc733619.png)

emタグで囲った文書は斜体、strongタグで囲った文書は太字となっている。
また、hrタグを書いた箇所に罫線が引かれている。

# おわりに
今回は、文書内の特定箇所に意味合いを持たせるタグを学んだ。

さて、ここで一つ疑問がある。

## Q. \<em>を使用して強調させたとき、\<strong>を使用して重要性を表した時、見た目以外で何が変わるのか。
A. 何も変わらない。

検索に影響を与える、みたいな見えない部分で変化があるかと思ったが、無いようだ。
\<strong>タグも同様に、見た目が変化するだけである。

HTMLには、文書を斜体にするタグ\<i>と文書を太文字にするタグ\<b>がある。
\<em>と\<i>、\<storng>と\<b>、それぞれどちらを使っても何も変わらないらしい。
>参考 : [Is there a difference between the "strong" and "b" tags in terms of SEO?](https://www.youtube.com/watch?v=awto_wCeOJ4)

ふーん。見た目を変えることじゃなくて、文書に意味を持たせることが大事だと思うので、\<em>\<strong>を使うようにしよっと。

次回 >> [ここ](https://qiita.com/MakoMakoMakotsu/items/f45ac30cd96a2892f948)

## 参考
[2-2 強調・区切り線（HTMLのテキスト）]()
Rails Tutorial　第2章の続き～第3章完了

#2020/6/4 2時間
6/1-3は会社なのでこの勉強はお休みです。6/4は有休をとったので、できました。

前回を思い出すのに10分かかりました。間が数日あると忘れています。

2.3.4-2.4 を1時間で終わり、これで第2章は完了です。
所要時間は3.5時間です。

環境が整っていたので、すいすい進みました。

第3章　3.2の途中まで1時間で終わりました。

##つまづいた点　リポジトリーを作るのを忘れてpushしてエラー

```bash
ubuntu:~/environment/sample_app (master) $ git push -u origin --all
Repository kerochan2/sample_app not found
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

pushで何故エラーなのかを、前のほうに戻って読み返してたら、リポジトリーを先に作っていたことを思い出しました。

bitbucketにブラウザからアクセスして、作ろうとしたところ、選択肢で何を選ぶか思い出せませんでした。tutorialをやった方のブログ記事をググり解決しました。

・[これは非公開リポジトリです] のチェックボックスが「オン」になっていること
・[READMEを含めますか？] が「No」

#2020/6/5 0.5時間
日が空くと忘れるので、毎日少しだけでもやろうと、朝30分だけ進めました。やはり前日やっているので思い出す時間が短縮されました。

演習 3.2.1 まで完了しました。

#2020/6/6 2時間
3.4.3まで進めました。
##つまづいた点　testでdb:migrateが必要
3.2.2でtestをしようとしてエラーになりました。

```bash
ubuntu:~/environment/sample_app (static-pages) $ rails test
Running via Spring preloader in process 4589
/home/ubuntu/environment/sample_app/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /home/ubuntu/environment/sample_app/config/application.rb to limit the frameworks that will be loaded.
```

エラーメッセージを読むと、migrateをせよとのことなので、試しにやってみたら解決しました。

#2020/6/7 2時間
3.6まで2時間で終わり、これで第3章は完了です。
所要時間は5.5時間です。

testのGuardは一回やって動きましたが、今後もちゃんと動くのか不安が少しあります。

##つまづいた点　tmuxのインストールでyumがnot foundエラー

cloud9ではtmuxが必要なのでインストールする際に、エラーがでました。

```bash
$ sudo yum install -y tmux
sudo: yum: command not found
```

ググったところ、cloud9の設定時にAmazon LinuxではなくUbuntuを選んでいる場合は、yumではなくapt-getを使えばよいと分かり解決しました。

```bash
ubuntu:~/environment/sample_app (master) $ sudo apt-get install -y tmux
Reading package lists... Done
Building dependency tree       
Reading state information... Done
tmux is already the newest version (2.6-3ubuntu0.2).
The following package was automatically installed and is no longer required:
  linux-aws-headers-4.15.0-1065
Use 'sudo apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 31 not upgraded.
```

やってみたところ、既に最新バージョンがインストール済みでした。
仕事で使うバージョン管理サービスオススメは？

#はじめに
投稿するか悩みましたが自分だったら知りたいと思い投稿しました。
以下ランキングはあくまで目安的なものです！！

#そもそも多くの方は主にどんなものを利用しているのでしょうか？

気になったのでアンケートをとってみました。
結果と実際に偏りはあるかと思います。
ただ『github』使っていたら文句言われなさそう、、、って言う気持ちです！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今現在仕事で使っているバージョン管理サービス教えてください🙇‍♀️</p>&mdash; sachiko_アルパカ (@854729) <a href="https://twitter.com/854729/status/1266748970551750656?ref_src=twsrc%5Etfw">May 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#勝手に順位付けしてみた！
コメントや投票などを参考に勝手に順位付けしてみました！
いつかこの特徴などもみていきたい気持ちです、、、

| 順位       |    サービス名  | 
|:-----------------|:------------------|
| 1             |              Github |    
| 2           |            GitLab |      
| 3             |              Bitbucket|            
| 4             |             backlog |     
| 5          |           CodeCommit |    


#ちなみに他にはどんなものがあるの？
ざっくりみたり教えてもらったりで以下のようなものが存在するようです。

[ASSEMBLA](https://assembla.com) ※Git,SVN,Perforce　全対応とのことです！
gitblit
Gogs
Phabricator
Azure Repos
GitBucket

#他の調査結果などのリンク集
流石に私のアンケートだと物足りない気がしたのでこう言うのも追加していきます！

[8割超の開発者がGitHubを使っている - Stack Overflow調査](https://news.mynavi.jp/article/20200601-1045371/)
[gitのホスティングサービスで実際オススメなのってどれ？オススメ5選！](https://itpropartners.com/blog/8570/)

#最後に
案外探せば結構あったりするものですね、、、
codecommitはAWSと言うのもあり需要が高まってきそうな気がしたりしなかったりしています。
特徴とか調べて良い選択ができるようにしたい願望あります。

もしよろしければ、
コメントなどで『これにはこの機能があるからオススメ！だよ』など教えて頂けると嬉しいです！

メモ:GitHub Enterprise
CentOS7にjdkをインストールしたあとにjavaコマンドの実行パスを変更する方法

初投稿で備忘録

本日CentOS7にjdk-14をインストール。
javaの実行ファイルは

```
/opt/jdk-14/bin/java
```
となりました。環境変数の設定も

```
# tee /etc/profile.d/jdk14.sh <<EOF
> export JAVA_HOME=/opt/jdk-14
> export PATH=\$PATH:\$JAVA_HOME/bin
> EOF
```

でOK。参考: [Install Oracle Java 14 (OpenJDK 14) on CentOS 7/8 & Fedora 32/31/30/29](https://computingforgeeks.com/install-oracle-java-openjdk-14-on-centosfedora-linux/)

私の環境にはもともとjava 1.8.0とjava 1.7.0が入っていて、

```
# java -version
```

で確認してもjavaコマンドのバージョンは1.8.0のまま。バージョンを切り替えようと

```
# alternatives --config java
```

と打ってみても、切り替えられるのはjava 1.8.0かjava 1.7.0の二択。
どうすればバージョン14のjavaコマンドを扱えるのか？？


解決方法↓

```
# alternatives --install /usr/bin/java java /opt/jdk-14/bin/java 16021
```

を実行すればOK。参考: [CentOSでJAVAのバージョン切り替え](https://qiita.com/nagomu1985/items/2b9a7b2c48a07187cf0f)
あとは ＃ alternatives --config java でどのバージョンを使うか選択すればOK。

うまくいったか確認してみると

```
# java -version
openjdk version "14" 2020-03-17
```

以上。
競技プログラミング練習記 No.2【ABC154練習】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

ABC154を解きました。
4完です。
E問題は自力で解けず、解説等を見て解きました。

|問題|時間|アルゴリズム|
|:-:|:-:|:-:|
| A |  1min |-|
| B |  1min |-|
| C | 10min |集合|
| D | 25min |尺取り法|
| E | - |桁DP|



## A
```c++
	string s, t, u;
	int a, b;
	cin >> s >> t >> a >> b >> u;

	if (s == u)
	{
		a--;
	}
	else if (t ==  u)
	{
		b--;
	}

	cout << a << " " << b;
```
やるだけ

## B
``` c++
	string s;
	cin >> s;

	for(int i = 0; i < s.length(); ++i)
	{
		cout << "x";
	}
```
やるだけ

## C
``` c++
	int n, a;
	cin >> n;

	set<int> st;
	for(int i = 0; i < n; ++i)
	{
		cin >> a;
		st.insert(a);
	}

	cout << (st.size() == n ? "YES" : "NO");
```
重複しているかどうかを判定するため、`std::set`の`size()`を使いました。
重複していたら`size()`が`n`よりも小さくなります。

## D
``` c++
	int n, k;
	cin >> n >> k;

	vector<ll> p(n + 2, 0);

	for(int i = 0; i < n; ++i)
	{
		cin >> p[i];
	}

	ll val = 0;
	for(int i = 0; i < k; ++i)
	{
		val += p[i];
	}

	ll ans = val;
 	for(int i = 0; i < n - k; ++i)
	{
		val = val - p[i] + p[i + k];
		ans = max(ans, val);
	}
```

尺取り法です。
以下の部分がキモ。

``` c++
 	for(int i = 0; i < n - k; ++i)
	{
		val = val - p[i] + p[i + k];
		ans = max(ans, val);
	}
```
そのままやるとO(NK)なのでTLEになるかと思います。
尺取り法でO(N)です。

## E
桁DPという問題。知らなかった。
自力では解けず、解説に加えてこちらを参考に解きました。
-> [桁DPの痒いところに手が届く解説](https://qiita.com/pinokions009/items/1e98252718eeeeb5c9ab)

```c++
	string s;
	cin >> s;

	int k;
	cin >> k;

	// 桁数
   int log = s.size();

	// dp0[i][j] : 上からi桁まで決めて、0でない桁がj個あり、Nより小さいことが確定している
	// dp1[i][j] : 上からi桁まで決めて、0でない桁がj個あり、Nより小さいことが確定していない
    vector< vector<ll> > dp0(log + 1, vector<ll>(k + 1, 0));
    vector< vector<ll> > dp1(log + 1, vector<ll>(k + 1, 0));

    dp0[0][0] = 1;
    dp1[1][1] = 1;
	
	for(int i = 0; i < log; ++i)
	{
		int num = s[i] - '0';

		for(int j = 0; j <= k; ++j)
		{
			if (num == 0)
			{
				dp0[i + 1][j] += dp0[i][j];
				if (j + 1 <= k)
				{
					dp0[i + 1][j + 1] += dp0[i][j] * 9;
				}
				if (j != 0)
				{
					dp1[i + 1][j] += dp1[i][j];
				}
			}
			else
			{
				dp0[i + 1][j] += dp0[i][j] + dp1[i][j];
				if(i == 0 && j == 0)
				{
					dp0[i + 1][j + 1] += dp0[i][j] * (num - 1);
				}
				else if (j + 1 <= k)
				{
					dp0[i + 1][j + 1] += dp0[i][j] * 9 + dp1[i][j] * (num - 1);
				}
				if(j != 0 && j + 1 <= k)
				{
					dp1[i + 1][j + 1] += dp1[i][j];
				}
			}
		}
	}

	cout << dp0[log][k] + dp1[log][k];
```
Microsoft Azure(クラウド）のコンテナでKnowledge（Qiita風Wiki)を動かす方法

#### はじめに ####
クラウドサービスに仮想Linuxマシンを立ててKnowlegeをインストールすることもできますが、Azureのコンテナを使えばもっと早くできます。その手順を紹介します。

#### 事前作業 ####
Azureにログインします。
リソースグループの作成
　　　メインメニュー⇒リソースグループ
　　　サブスクリプション：[無料試用版]の下にリソースグループを作成します。
　　　リソースグループの名前は何でも構いません。（ここではmyresourceとします）
　　　リージョン：「（Asia Pasific）西日本」か「（Asia pasific）東日本」を選択します。
　　　他の項目はデフォルトのままで構いません。「作成」ボタンをクリックします。

#### Webアプリの作成 ####
　　メインメニューから「App Service」を選択します。
　　App Serviceの画面が開いたら、左上[＋追加]をクリック
　　「Webアプリ」の画面が開きます。
　　リソースグループは、上記で作成したリソース(myresource)を選択します。

　　インスタンスの詳細
　　　　名前：任意の名前を付けます。
　　　　**<<重要>>ここで付けた名前が公開URLの一部になります。
　　　　　　　　　 また、すでに他の人が使っている名前だとエラーになります。**
　　　　公開：Dockerコンテナー
　　　　オペレーティングシステム：Linux
　　　　地域：Japan East かJapan West を選択
　　　　「次：Docker＞」ボタンをクリック

　　Docker画面
　　　　オプション：単一コンテナ
　　　　イメージソース：Docker Hub
　　　　Docker Hub オプション：パブリック
　　　　イメージとタグ：koda/docker-knowledge　
　　　　**<<重要>>導入するDocker-Hubから導入するイメージの名前です。**　
　　　　「確認および作成」ボタン
　　　　確認画面が表示されたら
　　　　「作成」ボタンをクリック　　　　

#### デプロイ ####
「デプロイが進行中です。」が数分間表示されます。
　終了すると、「デプロイが完了しました。」に表示が変わります。
「リソースに移動」ボタンをクリック

#### アクセス確認 ####
作成したアプリケーション画面の上の右上のURLに表示された部分をクリックする
ブラウザが起動しKnowledge画面が表示されます。
 　右上の「サインイン」をクリック
　　ユーザID：admin
 　　パスワード:admin123

以上
(続)Controllerからs3に保存されている画像を削除する(Laravel)

#はじめに
前記事「チャットアプリで、1グループのメッセージ数上限を50件にする(Laravel)」の続きです。
前回の内容はメッセージが50件を超えた場合自動で古いメッセージを削除するコードです。削除するのは古いメッセージレコード(messagesテーブルのデータ)です。
#画像の送受信の仕組み
画面としては下図です。
<img width="1440" alt="スクリーンショット 2020-06-07 12.37.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487894/54a7cabd-977d-30e0-0ec6-2e4e8e33c4e0.png">
「ファイルを選択」で画像を選択し、「送信」をクリックすると画像はcontrollerでs3に保存します。
画像が保存されたs3のリンクをimage_pathカラムに保存します。ファイル名の前にpathをつけて保存します。``` https://バケット名.s3.us-east-2.amazonaws.com/ファイルハッシュ名.jpeg```のような要領です。
画像を表示する際は、blade.phpに```<img>```タグで呼び出します。
「s3への保存の仕方」など細かい部分は飛ばして書きました。需要があるなら追々別記事で書こうと思います。

#コード
早速コードを載せます。いわゆる結論ファーストです。
動くまでにいろいろエラーがありましたが、ほぼ凡ミスだったので書きません。

```php:GroupController.php@send
$count = $message->where('group_id',$_POST['group_id'])->count();
          if ($count > 50) {
            $message50 = DB::table('messages')
            ->where('group_id', $_POST['group_id'])
            ->orderBy('id','desc')
            ->take(50);
            $deleteid = $message50->pluck('id')->min();
            $messageins = message::where('group_id',$_POST['group_id']);
            $deletemessage = $messageins->where('id','<',$deleteid);            
            $image = $deletemessage->pluck('image_path');            
            foreach($image as $item){
              if($item !== null){
                $item = basename($item);
                $disk = Storage::disk('s3');
                $disk->delete('/', $item);
              }
            }          
            $deletemessage->delete();
          }
```
#解説
前記事と異なる部分は```foreach```以降ですね。
```$image = $deletemessage->pluck('image_path');```によってimage_pathのみで構成された配列$imageを作ります。もちろん画像なしメッセージであれば、image_pathカラムにはnullで保存されますね。
「BppGmL1UlOZ28bkpEKmX4ik0LoK45FcEuIzJQgcP.jpeg」というキー名でs3に保存されたファイルを削除したいのなら、
```$disk = Storage::disk('s3');```
```$disk->delete('/BppGmL1UlOZ28bkpEKmX4ik0LoK45FcEuIzJQgcP.jpeg');```と書きます。
これのキー名を変数に置き換えるだけです。foreachとifを使って、imageカラムのファイルを次々削除していきます。
GAS スプレッドシートをPDFに変換してGoogleDriveに保存する(シート単位)

# この記事の説明
GASを使って、スプレッドシートをPDFに変換する処理を記述する際の手順です。


#PDF化してDriveに保存する

スプレッドシートでファイルをエクスポートするには、下記のURLにアクセスすることで出来ます。
URLに、クエリストリングでパラメータを渡すことで、変換フォーマットや変換するシートを指定します。

変換には認証が必要です。


#1. エクスポートURL
`"https://docs.google.com/spreadsheets/d/[スプレッドシートID]/export"`

- クエリストリング
    - `?exportFormat=pdf`

- シートを指定するには？
    - クエリストリングgidにシートIDを渡します。
    - `?gid=[シートID]`

- シートIDとは？
    - スプレッドシートの各シートには固有のidが振られています。下図のようにURLから取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/44b391f8-f74d-b3df-a907-d367dbe23d4e.png)


#2. 認証
ファイルへのアクセス権を証明するために、`ScriptApp.getOAuthToken();`でトークンを取得して、そのトークンを使って認証します。
今回はBearer認証を使います。


```javascript

  var url = "https://docs.google.com/spreadsheets/d/" + QuoteStId + "/export?exportFormat=pdf&gid=SID".replace("SID",stId);
  var token = ScriptApp.getOAuthToken();
  var response = UrlFetchApp.fetch(url,{
    headers:{
      "Authorization" : "Bearer "+ token
    }
  });
```

#3. PDFをGoogleDriveに保存する。
urlfetchの戻り値の中のblobを使って、DriveAppのcreateFileメソッドを使ってドライブに保存します。

```javascript
  var filename = "ファイル名"
  var blob = response.getBlob().setName(filename);
  var folder = DriveApp.getFolderById("GoogleDriveに作成した保存フォルダのID");
  var file = folder.createFile(blob);
```

#4. GASコードまとめ

```javascript

//PDF化
  var url = "https://docs.google.com/spreadsheets/d/" + QuoteStId + "/export?exportFormat=pdf&gid=SID".replace("SID",stId);
  var token = ScriptApp.getOAuthToken();
  var response = UrlFetchApp.fetch(url,{
    headers:{
      "Authorization" : "Bearer "+ token
    }

  //PDFファイルをGoogleドライブに保存する処理
  var filename = "ファイルネーム"
  var blob = response.getBlob().setName(filename);
  var folder = DriveApp.getFolderById("GoogleDriveに作成した保存フォルダのID");
  var file = folder.createFile(blob);
   
```



### 参考

> GASを使った認可パターン
> https://medium.com/@gw_cule/gas%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E8%AA%8D%E5%8F%AF%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-67f195d7a425

> Bearer認証について
> https://qiita.com/h_tyokinuhata/items/ab8e0337085997be04b1

> [Google Apps Script]認証が必要なウェブアプリケーションを外部から実行する
>https://www.ka-net.org/blog/?p=12258

> GASを使ってGoogle Drive内にあるファイルのダウンロードURLからコンテンツを取得したい
> https://qiita.com/tanaike/items/9fd1294647e2181c7765


# 注意
- PDF化したときに空白ページが紛れてしまう
    - スプレッドシートのPDF化は何故か未使用セルの部分までPDF化されてしまい、PDFの最終ページに空白ページが紛れてしまうことがある。この場合は元となるスプレッドシートの未使用領域のセルを削除しておくと良いです。
Macでパスワード付きZIPファイルをつくる



1. 指定のファイルを右クリックとかでZIPで圧縮する
2. ターミナルを開いて zipcloak コマンドを入力し↑のZIPのパスを入力する
3. Enter押す
4. パスワード入れる
5. 完成！

※Local Entry CRC does not match CDってやつは無視でOK。ZIPコマンドで圧縮すると出ないらしい

```

$ zipcloak /Users/XXXXXX/Downloads/xxx.xlsx.zip
Enter password: 
Verify password: 
encrypting: xxx.xlsx
zipcloak warning: Local Entry CRC does not match CD: xxx.xlsx
encrypting: __MACOSX/
encrypting: __MACOSX/._xxx.xlsx
zipcloak warning: Local Entry CRC does not match CD: __MACOSX/._xxx.xlsx

```
AWS Certified Solutions Architect - Associate 試験に出てくるサービスを覚えよう！

# AWS Certified Solutions Architect - Associate 試験に出てくるサービスを覚えよう！

- [S3 に関するメモ]()  ※追記中
- [Snowball に関するメモ]() ※追記中
- [VPC Endpoints に関するメモ]() ※追記中
- [VPC Flow Logs に関するメモ]() ※追記中
- [NACL に関するメモ]() ※追記中
- [Security Groups に関するメモ]() ※追記中
- [NAT に関するメモ]() ※追記中
- [IAM に関するメモ]() ※追記中
- [Cognito に関するメモ]() ※追記中
- [CLI & SDK に関するメモ]() ※追記中
- [DNS に関するメモ]() ※追記中
- [Route 53 に関するメモ]() ※追記中
- [EC2 に関するメモ]() ※追記中
- [EC2 Pricing に関するメモ]() ※追記中
- [AMI に関するメモ]() ※追記中
- [Autoscaling Groups に関するメモ]()  ※追記中
- [ELB に関するメモ]() ※追記中
- [EFS に関するメモ]() ※追記中
- [EBS に関するメモ]() ※追記中
- [CloudFront に関するメモ]() ※追記中
- [RDS に関するメモ]() ※追記中
- [Aurora に関するメモ]() ※追記中
- [DynamoDB に関するメモ]() ※追記中
- [CloudFormation に関するメモ]() ※追記中
- [CloudWatch に関するメモ]() ※追記中
- [CloudTrail に関するメモ]() ※追記中
- [Lambda に関するメモ]() ※追記中
- [SQS に関するメモ]() ※追記中
- [SNS に関するメモ]() ※追記中
- [ElastiCache に関するメモ]() ※追記中
- [Elastic Beanstalk に関するメモ]() ※追記中
- [API Gateway に関するメモ]() ※追記中
- [Storage Gateway に関するメモ]() ※追記中

----

以上
競技プログラミング練習記 No.1

# はじめに

シンプルでスマートなコードを目指して書いています。参考になれば幸いです！

競技プログラミングをやっているので、コンテストへの練習や参加で解いた問題を書きます。
[AtCoder](https://atcoder.jp/)がほとんどで、ときどき[AOJ](http://judge.u-aizu.ac.jp/onlinejudge/)を解きます。

AtCoder
https://atcoder.jp/users/gummy

AOJ
http://judge.u-aizu.ac.jp/onlinejudge/user.jsp?id=choco

主に自分の復習が目的で、気が向いたときに記事を書くことにしています。
`問題を解く = 記事の投稿` となってしまうと、問題を解くことへのハードルが上がってしまうからです。

コンテストの問題を全て解くわけではなく、解けたところまでを記事にします。

ABC172で緑コーダーにあがりました！
水色コーダーを目指しています。

ARC106で水コーダーにあがりました！ (2020/10/24)
次は青コーダーを目指します。

c++で、以下のプログラムを共通で使っています。

``` c++
#include <bits/stdc++.h>

#define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define endl "\n"
#define rep(i,n) repi(i,0,n)
#define repi(i,a,n) for(ll i=a;i<(ll)n;++i)
#define repe(i,n) repie(i,0,n)
#define repie(i,a,n) for(ll i=a;i<=(ll)n;++i)
#define ALL(a) (a).begin(),(a).end()
#define RALL(a) (a).rbegin(),(a).rend()

using namespace std;
using ll = long long;
using P = pair<ll, ll>;
void YN(bool a) { cout << (a ? "Yes" : "No") << endl; }
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }
void show(){ cout << endl; }
template <class Head, class... Tail>
void show(Head&& head, Tail&&... tail){ cout << head << " "; show(std::forward<Tail>(tail)...); }
template<class T> inline void show(T& begin, T& end) { for(auto itr = begin; itr != end; ++itr) cout<<(*itr)<<" "; cout<<endl; }
template<class T> inline void showall(T& a) { for(auto v:a) cout<<v<<" "; cout<<endl; }

void solve()
{

}

int main()
{
  fastio;
  solve();

  return 0;
}
```

初回はここまで。
ありがとうございます。
2020-06-07 > PYNQ-Z1 > Vivadoにボードファイルを追加する

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
Vivado v2019.1 (64-bit)
```

### PYNQ-Z1のボードファイル追加

https://discuss.pynq.io/t/tutorial-creating-a-hardware-design-for-pynq/145

> If you are using the PYNQ-Z1 or PYNQ-Z2, first make sure the board files have been installed. Download the PYNQ-Z1 board files 60 or the PYNQ-Z2 board files 75, extract and copy to your Vivado installation, in the ./data/boards/board_files directory.

PYNQ-Z1は以下のファイルにリンクされている。
https://github.com/cathalmccabe/pynq-z1_board_files/raw/master/pynq-z1.zip

```
C:\Xilinx\Vivado\2019.1\data\boards\board_files
```

上記にzipファイルのpynq-z1フォルダをコピーした。

board選択画面にてPYNQ-Z1を選択できるようになった。

![コメント 2020-06-07 122846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/15b73cd2-85b4-f2dc-f454-b50e8c66a65e.png)
PRML 演習問題3.20 解答

##問題
>(3.86)の$\mathbf{\alpha}$に関する最大化が再推定方程式(3.92)に帰着されることを示すのに必要なすべての段階を(3.86)から始めて確かめよ

```math
\begin{align*}
\mathrm{lnp(t|\alpha,\beta)=\frac{M}{2}ln{\alpha}+\frac{N}{2}ln{\beta}-E(m_N)-\frac{1}{2}ln|A|-\frac{N}{2}ln(2\pi)}
\tag{3.86}\\
\mathrm{{\alpha}=\frac{\gamma}{m_N^Tm_N}}
\tag{3.92}
\end{align*}
```
##方針
PRML本文の3.5.2にしたがって式変形を行う。まずは(3.86)の項の内$\mathbf{\alpha}$に関する項に着目し取り組んでいく。

##解答

```math
\begin{align*}
\mathrm{A={\alpha}I+{\beta\Phi\Phi^T}}
\tag{3.81}\\
\mathrm{E(m_N)=\frac{\beta}{2}{\parallel}t-{\Phi}^Tm_N{\parallel}^2+\frac{\alpha}{2}m_N^Tm_N}
\tag{3.82}
\end{align*}
```

はじめに(3.87)の固有ベクトル方程式を考える

```math
\begin{align*}
\mathrm{\Big({\beta\Phi\Phi^T}\big)u_i=\lambda_iu_i}
\tag{3.87}
\end{align*}
```

(3.81)よりAは固有値$\mathrm{{\alpha}+\lambda_i}$をもつ
したがって(3.86)の第4項の$\mathbf{\alpha}$に関する導関数を考えると以下のようになる

```math
\begin{align*}
\mathrm{\frac{d}{d{\alpha}}ln|A|=\frac{d}{d{\alpha}}ln{\prod_i}(\lambda_i+\alpha)=\frac{d}{d{\alpha}}{\sum_i}ln(\lambda_i+\alpha)}
\tag{3.88}
\end{align*}
```

よって(3.86)の$\mathbf{\alpha}$に関する導関数は以下で与えられる

```math
\begin{align*}
\mathrm{\frac{d}{d\alpha}lnp(t|{\alpha},{\beta})}=\mathrm{\frac{1}{2}\Big(\frac{M}{\alpha}-m_N^Tm_N-\sum_i\frac{1}{\lambda_i+\alpha}\Big)}
\end{align*}
```

導関数=0とおくと(3.86)の$\mathbf{\alpha}$に関する停留点は以下の(3.89.a)を満たす

```math
\begin{align*}
\mathrm{\frac{1}{2}\Big(\frac{M}{\alpha}-m_N^Tm_N-\sum_i\frac{1}{\lambda_i+\alpha}\Big)}=0
\tag{3.89.a}
\end{align*}
```

整理すると

```math
\begin{align*}
\mathrm{{\alpha}m_N^Tm_N=M-\alpha\sum_i\frac{1}{\lambda_i+\alpha}}
\tag{3.90.a}
\end{align*}
```

Mは以下で示すことができるので

```math
\begin{align*}
\mathrm{M=\sum_i^M\frac{\lambda_i+\alpha}{\lambda_i+\alpha}}
\end{align*}
```

(3.90.a)を変形し$\mathbf{\gamma}$とおく

```math
\begin{align*}
\mathrm{{\alpha}m_N^Tm_N=\sum_i\frac{\lambda_i}{\lambda_i+\alpha}=\gamma}
\end{align*}
```

したがって周辺尤度を最大化する$\mathbf{\alpha}$の値は以下の(3.92)を満たす

```math
\begin{align*}
\mathrm{{\alpha}=\frac{\gamma}{m_N^Tm_N}}
\tag{3.92}
\end{align*}
```

よって題意は示された
validate関数の返り値

# 前提
- nuxt: ^2.12.2

# validate関数
asyncDataメソッドの前に呼ばれる．
[公式ドキュメント(日本語)](https://ja.nuxtjs.org/api/pages-validate/)

#ハマったこと
正しいパスなのにページがよみこまれず，エラーページに飛ばされる

```Typescript:test.vue

validate (context : Context) {
      if (context.params.test.includes('test')){
        return false;
      }

  }

```


# 原因
返り値trueを返していなかったため，常にfalseが返っていた．

ちゃんとドキュメントにはこう書いてあります．
>バリデーションメソッドが true を返さないときは Nuxt.js は自動的に 404 エラーページをロードします。


# 解決策
条件を満たす場合は必ずtrueを返すようにする.



```Typescript:test.vue

validate (context : Context) {
      if (context.params.test.includes('test')){
        return false;
      }
+      return true;

  }

```

# 所感
Vue初心者の自分は3回くらいこれでハマりました．．．．
ドキュメント読み込むのは大事というのが身にしみました．
Ubuntu 18.04 で PostgreSQL12 のドキュメントを作成してFessで検索してみる

Ubuntu 18.04 で PostgreSQL12 のドキュメントを作成してFessで検索してみる
#目的
Ubuntu 18.04 で PostgreSQL12のドキュメントを作成する
nginxで表示できるようにする
Fessでウェブクロール後検索できることを確認する
##必要なパッケージのインストール
<pre>
$ sudo apt install -y libreadline6-dev \
 zlib1g-dev \
 flex \
 bison \
 libxslt-dev \
 docbook \
 docbook-dsssl \
 docbook-xml \
 docbook-xsl \
 gettext \
 libxml2-utils \
 xsltproc

$ which collateindex.pl
/usr/bin/collateindex.pl
</pre>
##gitのインストール＆githubへアクセスできるように設定する
<pre>
$ sudo apt install git 
$ sudo ssh-keygen -t rsa
</pre>
$ cat ~/.ssh/id_rsa.pub
で表示された内容を以下に登録
github の
edit profile
　-> SSH and GPG keys
　　-> New SSH key
　　　-> title：適当な名前
　　　　 Key：cat id_rsa.pubで表示された内容

$ ssh -T git@github.com
##nginxのインストール
<pre>
$ sudo apt install nginx
</pre>
###confファイルの編集
/etc/nginx/nginx.conf
デフォルトのまま実行
##PostgreSQL12のドキュメントのビルド
<pre>
$ git clone git@github.com:pgsql-jp/jpug-doc
$ ./configure --enable-nls --with-libxml --with-libxslt
</pre>
・トップディレクトリで以下を実行すると、doc/src/sgml/html に html が生成される
<pre>
$ make html
</pre>
再度、全ビルドをしたい場合
・一度 make html をすると移行差分だけの更新になります。再度全ドキュメントを更新したい場合は、
<pre>
$ make clean
$ make html
</pre>
としても、更新がおこなわれないので(生成されたhtmlフォルダを削除してもダメです)
一度sgmlのファイルを更新してから再生成する
<pre>
$ touch ./doc/src/sgml/*.sgml
$ make html
</pre>
##Fess用dirの作成＆ファイルのコピー
[Ubuntu 18.04 に Fess 13.7 をインストールしてみる](https://qiita.com/tabizou/items/73ec6f868b16ca30aed5)
で設定したFessで検索できるように設定する
<pre>
$ sudo mkdir /var/www/html/pgsql12
$ sudo cp -r * /var/www/html/pgsql12
</pre>
##Fessで検索可能にする
http://localhost:8080/admin/ にアクセスする
###クローラーメニュー
　->ファイルシステム
　　->+新規作成 ボタン
　　　名前：Postgres12
　　　URL：http://xxx.xxx.xxx.xxx/pgsql12/
　　　クロール対象とするURL：http://xxx.xxx.xxx.xxx/pgsql12/.*
　　　+作成 ボタン
###システムメニュー
　->スケジューラ
　　->Default Crawler をクリック
　　　->今すぐ開始 ボタンをクリック
<pre>
$ sudo tail -f /var/log/fess/fess-crawler.log
※以下で終了している(localで3h強？？)
[main] INFO  Disconnected to http://localhost:9200
[main] INFO  Destroyed LaContainer.
</pre>
TOPの画面から Postgres で検索してみる
#参考にしたのは以下のサイト
[PostgreSQL日本語マニュアルについて](https://lets.postgresql.jp/node/205)
[pgsql-jp/jpug-doc](https://github.com/pgsql-jp/jpug-doc)
[ドキュメントビルド手順](https://github.com/pgsql-jp/jpug-doc/wiki/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%83%93%E3%83%AB%E3%83%89%E6%89%8B%E9%A0%86)
[PostgreSQL日本語マニュアルについて](https://qiita.com/noborus/items/03f98e43c216d7e23767)
[Ubuntuのポート開放方法（ファイアウォールを設定する）](https://qiita.com/toujika/items/be21d361cf80d664859c)
[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
[Ubuntu 16.04 x64 で PostgreSQL11のドキュメントを作成してFessで検索してみる](https://qiita.com/tabizou/items/b687e02bad188b032306)
[nginx 起動ポートの変更](https://qiita.com/Watercat3/items/38b2bac5fa70b232bee3)
WDC-433SU2M2をManjaroLinuxで使用する

#WDC-433SU2M2をManjaroLinuxで使用する

## はじめに
自作機用にELECOMのWIFI用USB子機を買ったので、挿してみたら動かなかったので対応についてまとめる。
基本自分のメモ用

## 手順
### driver
 githubからソースを取得する。

```zsh
# git clone https://github.com/gnab/rtl8812au/
```
### patch
 以下のソースにパッチをあてる。1行追加。

```c:./rtl18812au/os_dep/linux/usb_intf.c
#ifdef CONFIG_RTL8821A
	・・・(省略)・・・
	{USB_DEVICE(0x056e, 0x400e),.driver_info = RTL8821}, /* WDC-433SU2M2 */
#endif
```
### make~install
```zsh
# make
# sudo cp 8812au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless
# sudo depmod
```

## はまった点

### ヘッダがなかった
　こんな人少ないだろうけど、最初にパッチ当てるときにカーネルヘッダが無かった。
　pacmanでヘッダをインストールしようとしたら、pacmanに最適なヘッダがなくて困った。
　単純にpacmanの更新をしていなかっただけだった…Ω＼ζ°)ﾁｰﾝ

### カーネルの更新
　カーネルの更新のたびにドライバを再インストールしている。
　dkmsについてもREADME.mdをたよりにやってみたけど、うまくいってないっぽい？
　そのうち対応するかも。

## お約束
　初心者なので間違いがあるかもしれないので指摘があればお願いします。
QEMUでraspberrypi busterを起動した際の備忘録

# 目的
QEMUでraspberrypi busterを起動した際の備忘録です

# QEMUとは

> QEMU is a generic and open source machine emulator and virtualizer.
> [https://www.qemu.org](https://www.qemu.org)

# 準備

必要なイメージをダウンロードする

```
### Download raspbian-buster
curl http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2020-02-14/2020-02-13-raspbian-buster.zip -o raspbian-buster.zip
unzip raspbian-buster.zip
rm raspbian-buster.zip

### Download kernel-qemu
curl https://raw.githubusercontent.com/dhruvvyas90/qemu-rpi-kernel/master/kernel-qemu-4.19.50-buster -o kernel-qemu-4.19.50-buster

### Download versatile-pb.dtb
curl https://raw.githubusercontent.com/dhruvvyas90/qemu-rpi-kernel/master/versatile-pb.dtb -o versatile-pb.dtb
```

# 起動

```
$ qemu-system-arm -kernel kernel-qemu-4.19.50-buster -dtb versatile-pb.dtb -m 256 -M versatilepb -cpu arm1176 -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -drive file=2020-02-13-raspbian-buster.img,format=raw -no-reboot
...
...
[  OK  ] Started Authorization Manager.
[  OK  ] Started LSB: Resize the ro… filesystem to fill partition.
[  OK  ] Started Hold until boot process finishes up.
[FAILED] Failed to start Light Display Manager.
See 'systemctl status lightdm.service' for details.

Raspbian GNU/Linux 10 raspberrypi ttyAMA0

raspberrypi login: pi
Password: 
Last login: Sat Jun  6 10:48:24 BST 2020 on tty1
Linux raspberrypi 4.19.50+ #1 Tue Nov 26 01:49:16 CET 2019 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 10 (buster)
Release:	10
Codename:	buster
```

ID:pi
PASS:raspberry

でログインできればOK

<img width="425" alt="スクリーンショット 2020-06-06 18.50.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/19a51c73-ebc0-4cd2-18dd-76541d25b884.png">


# 参考
[https://github.com/dhruvvyas90/qemu-rpi-kernel](https://github.com/dhruvvyas90/qemu-rpi-kernel/)
[MacでQEMUを使ってRaspberry Piの仮想環境を構築する方法](https://qiita.com/karaage0703/items/366eb17906a3341f1999)
[ARM環境のRaspbianイメージをx86上のDockerで動かす](https://qiita.com/hishi/items/61652e2d9755e17630de)
[MacでQEMUを使ってRaspberry Piの仮想環境を構築する方法](https://qiita.com/karaage0703/items/366eb17906a3341f1999)
[Boot: 'Failed to start Light Display Manager.'](https://www.raspberrypi.org/forums/viewtopic.php?t=137239)
Swift 数学関数まとめ

##はじめに
**Swift**で数学関数とありますが、UIKitをimportすることでC言語の標準ライブラリであるmath.hが使えるようになるため、Swift独特の書き方というのは無いと思います。
Swiftからプログラミングを始めたり、Playgroundで遊びたい中高生やその指導者の参考になればと思います。
なお`import UIKit`、`import Foundation`は割愛しております。コンパイルエラーが出たらそこを見直して下さい。
Double -> Intへの変換は`Double(変換したいInt型の数)`のようにします。
###乱数
```Swift
print(Int.random(in: 1...100)) //１から１００までの整数をランダムに出力
print(Float.random(in: 1..<10))//１以上１０未満の小数をランダムに出力
```

###絶対値
```Swift
print(abs(-10)) //10
print(fabs(-9.1)) //9
```

###切り上げ
```Swift
print(ceil(2.5)) //3.0
```

###切り捨て
```Swift
print(floor(3.5))//3.0
```

###累乗
```Swift
print(pow(2,10)) //1024
```

###平方根
```Swift
print(sort(121))//11.0
```

###立方根
```Swift
print(cart(216))//6.0
```

###三角関数
```Swift
print(sin(3.14))//0.0015926529164868282
print(cos(3.14))//-0.9999987317275395
print(tan(3.14))//-0.0015926549364072232
```

###対数関数
```Swift
print(log(148.4126599508417))//4.99999663673641
print(log10(100.0))//2.0
```
[Flutter]画面遷移のやり方

## 「Navigate to a new screen and back」を使った画面遷移
(1). ボタンを作成

```
      body: Center(
        child: RaisedButton(
          child: Text('次へ'),
          onPressed: (){
            // 押したら反応するコードを書く
            // 画面遷移のコード
          },
        ),
      ),
```

(2). 遷移先のページを作成

```
import 'package:flutter/material.dart';

class NextPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("次のページ"),
      ),
      body: Container(
        height: double.infinity,
        color: Colors.red,
      ),
    );
  }
}
```

(3). (1)で作成したボタンに「押下したらページ遷移」の処理を追加
*「NextPage()」の部分に次ページのclassを書く

```
      body: Center(
        child: RaisedButton(
          child: Text('次へ'),
          onPressed: (){
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => NextPage(),
              )
            )
          },
        ),
      ),
```

(4). (2)で作成したクラスに「1つ前のページに戻る」処理を加えたボタンを作成

```
      body: Container(
        height: double.infinity,
        color: Colors.red,
        child: Center(
          child: RaisedButton(
            child: Text('戻る'),
            onPressed: (){
              // 1つ前に戻る
              Navigator.pop(context);
            },
          ),
        ),
      ),
```

## 「Navigate with named routes」を使った画面遷移
(1). 初期画面にinitialRoute, routesを設定
*homeを指定してはいけない
*initialRouteに指定しているものが初期画面となる

```
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      initialRoute: '/',
      routes: {
        // 初期画面のclassを指定
        '/': (context) => MyHomePage(),
        // 次ページのclassを指定
        '/next': (context) => NextPage(),
      },
    );
  }
}
```

(2). 「押下したらページ遷移」の処理を追加

```
      body: Center(
        child: RaisedButton(
          child: Text('次へ'),
          onPressed: (){
            Navigator.pushNamed(context, '/next');
          },
        ),
      ),
```