OmniAICreator/Qiita-1.07M huggingface dataset:
PortfolioMasterでいじるべき場所

# Ranking options の上の方
C:\QuantAnalyzer4\extend\Snippets\com\strategyquant\extend\FitnessFunctions
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/f8e876f3-2c07-9c1f-6064-b931d44eadf9.png)

###フォルダのキャプチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/b70b1d67-02ec-2182-7e8b-89c251151a35.png)

### いじってみた結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/f4cb97fc-bbfc-0012-1c72-d50533c535b5.png)

# Ranking optionsの下の方
C:\QuantAnalyzer4\extend\Snippets\com\strategyquant\extend\CorrelationOf

### QAのキャプチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/8126697e-7d4d-a6f7-0065-94836fa445b6.png)
### フォルダのキャプチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/ab983c33-e9a3-046e-0c3e-99ea54a60f90.png)

### いじってみた結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/8751660e-710d-7b85-2dc7-c18ebffccd07.png)




# 中身を見ての雑感

絶対にいじらないといけない場所は

- ファイル名
- クラス名
- コンストラクタ

の３つみたい。ついでに言えば説明を日本語で記述すると文字化けする。（上の画像で言うとzzzってなってるところ）
並び順は設定したファイル名（クラス名順）みたい。説明のところは関係なし。

やっぱMITライセンスなんですねー。
独自関数・変数が結構あるから、そこらへんの解析も必要かもしれない。
SQSStatsの使い方とかよくわかんないしー。

それよりなんで宣言して速攻でreturnしてるんだろ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/3d6bec33-8463-e954-6e95-a08f269db428.png)
あ、編集はVSCodeでやってます。
めっちゃハイライトされてるのはbackground phi colorsって拡張機能のせいです。
選択行にある単語が他の行にもある場合にハイライトしてくれるっていうスグレモノ。
pythonでOSのコマンドを実行して標準出力、標準エラー出力、リターンコードを取得する

python3系で動作確認しました。

```python
import subprocess


def exec_subprocess(cmd: str) -> (str, str, int):
    """
    OSコマンドを実行し結果を返す
    :param cmd: コマンド文字列
    :return: 標準出力、標準エラー出力、リターンコードのタプル
    """
    child = subprocess.Popen(cmd, shell=True,
                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = child.communicate()
    rt = child.returncode
    return stdout.decode(), stderr.decode(), rt

```

実行例１

```python
stdout, stderr, rt = exec_subprocess("echo hello")

print(f"stdout={stdout}")
print(f"stderr={stderr}")
print(f"rt={rt}")
```

出力

```
stdout=hello

stderr=
rt=0
```

実行例２

```python
stdout, stderr, rt = exec_subprocess("ls /hoge")

print(f"stdout={stdout}")
print(f"stderr={stderr}")
print(f"rt={rt}")
```

出力

```
stdout=
stderr=ls: /hoge: No such file or directory

rt=1
```
Debian 10.2 buster を入れたときのメモ

# インストール対象

+ Debian 10.2 (buster)

# 環境
+ B350 TOMAHAWK
+ Ryzen 1700X
+ GEFORCE GTX 1060 (msi ARMOR)
+ マルチブート環境
  + ディスクごとに別々のOSが入っていて、別のディスクにはWindows10が入っている
  + 起動画面の途中でF11を押してDebianの入っているディスクを指定し、grub経由で起動する必要あり

# インストール後

+ 下記のブログがとても役に立った。エラーへの対処 + α をやった
  + https://debimate.jp/2019/09/29/debian10をryzen-3800x環境で動かそうとしてハマった内容グラボ/

## kvm: disabled by bios が出る

+ 筆者の環境だとこのメッセージが出ても停止はしなかったが、放置は気持ち悪いのでSVM=trueとBIOSで変更

## sev command 0x4 timed out, disabling PSPエラーで停止

+ 筆者の環境ではこのエラーは起きなかった

## ログイン画面(GUI)が出てこない問題

+ 筆者の環境ではこのエラーは起きなかったものの、nvidiaのドライバー自体は`nvidia-detect`と`nvidia-driver`経由で入れた

## (+α) 自身に管理者権限を付与

+ 必ずsuのあとにハイフンが必要:

```
$ su -
# visudo
```

+ rootの下の行にユーザーを追加(e.g., john):

```
root ALL=(ALL:ALL) ALL
john ALL=(ALL:ALL) ALL
```

## (+α) キーボードのcaps lockをctrlに

+ 設定ファイルを開く:

```
$ sudo nano /etc/default/keyboard
```

+ XKBOPTIONSを次のように書き換える:

```
XKBOPTIONS=",ctrl:nocaps"
```

+ 設定反映には再起動が必要

# その他

+ 残りの上述のブログで発生しているエラーについては筆者の環境では発生しなかった
【サルが書く】はんだごてもまともに触ったことのない 初心者エンジニアが、HHKB風自作キーボードを10000円以内で作ってみた つくる編

わっきゃう！

今回は実際にキーボードを作っていきます！

## 買ったもの
| 名称 | 価格 |  購入先 | 届くまで |
|---|---|---|---|
| PCBセット | 4752円 | AliExpress | 10日 |
| gateron 黄軸 ×70 | 1750円 | AliExpress | 20日 |
| gateron 黒軸 ×10 | 250円 | AliExpress | 20日 |
| FILCO キーキャップセット | 2709円 | Amazon | 10日 |

**合計　9461円**
(※2020年1月現在だと材料費の高騰により10000円を超えてしまいます......)

今回のテーマとしてははんだごても使ったことない初心者へ！なので、なるべく簡単にお金をかけずにをテーマに制作を行いました。
自作キーボードはパーツ代が既成品よりもかかってしまうので、なるべくセットになっているものを選定し、海外通販を使用することで費用を抑えました。
はんだごてを持っていなかったので、はんだごてセットの値段も入っていますが、はんだごてをすでに持っている方は10000円を切る値段で制作が可能です。
PCB セットはホットスワップ仕様のものを購入しました。
ホットスワップとは、キースイッチとPCBをハンダ付けすることなく、キースイッチを差し込むだけでスイッチが使えるようになるというものです。
そうなんです！今回ははんだ付けをすることなく、自作キーボードを作成できてしまいます！（それを知らずに私は、はんだごてセットを購入してしまいました！！）


## 作っていく！
<img width="319" alt="スクリーンショット 2020-01-26 17.39.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177293/18db160f-c775-43d4-c94b-ee0f22ad1e38.png">


PCB セットは届いた時点で、PCBにホットスワップ、LED、プレート、スタビライザがすでについている状態になっています。
キーボード側はUSB-Cになっていて、 PC側はUSB-Aとなっています。このPCBにキースイッチを差し込んでいきます。
キースイッチを差し込み終わったものが下の画像になります。

<img width="370" alt="スクリーンショット 2020-01-26 17.39.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177293/2d83459e-dd0f-af42-fbee-3acab0e18830.png">


向きさえ間違わなければ、簡単に刺さると思います。黄軸のキースイッチと、黒軸のキースイッチを使用しました。

<img width="310" alt="スクリーンショット 2020-01-26 17.39.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177293/10ad5e30-a9a6-97d5-a58d-365f42d9d2d4.png">


挿し込むときに気をつけることとしては、キースイッチの裏をみて、ちゃんとピンが出きっているか、曲がっていないかを確認すること。
出きっていない場合は挿しても反応がしづらかったりします。曲がっている場合、そのまま挿すとピンが曲がってしまいます。
前後も間違えやすいので、注意してください！その後にキーキャップをぽこぽことはめていきます。ここはそんなに気にせずにはめていっても大丈夫です。

<img width="295" alt="スクリーンショット 2020-01-26 17.39.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177293/958ddc3d-959f-9f84-64f8-be2c4d2c5c66.png">

**完成！**

## まとめ
初心者でも簡単にをテーマに作成しただけあって、本当に簡単に作成できちゃいました。
意気込んで買ったはんだごても無用の長物となってしまいましたが、次はホットスワップのものではなく、はんだでキースイッチを付けてみたいと思います。
作ったキーボードを触ってみて、キースイッチがリニアということもあって、なめらかにキーが落ちてくれます。
幸いすべてのキーが反応してくれています。そして、自分が作ったってこともあり、愛着は人一倍高いものが作れました。
手軽さも、値段的にも初心者に優しいものが作れたと思います。こっから40％キーボードやErgoDoxの自作や完全自作のキーボードにも挑戦していきたいと思います！

## 参考文献
「キーボード - クレープ屋まとめ wiki」 
https://wiki.akaren.club/wiki/%E8%87%AA%E4%BD%9C%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89

 「アスキーYoutubeチャンネル」 
https://www.youtube.com/user/wamweb
モンティ・ホール問題の数式に頼らない直感的な解説と、Pythonによるシミュレーション

モンティ・ホール問題は、確率のパラドックスとして有名な問題です。本記事では、私が考えて最も納得できた数式に頼らない直感的な説明をしてみます。

# モンティ・ホール問題
[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C)より引用
>プレーヤーの前に閉じた3つのドアがあって、1つのドアの後ろには景品の新車が、2つのドアの後ろには、はずれを意味するヤギがいる。プレーヤーは新車のドアを当てると新車がもらえる。プレーヤーが1つのドアを選択した後、司会のモンティが残りのドアのうちヤギがいるドアを開けてヤギを見せる。ここでプレーヤーは、最初に選んだドアを、残っている開けられていないドアに変更してもよいと言われる。
ここでプレーヤーはドアを変更すべきだろうか？

答「プレーヤーはドアを変更すべきである。なぜなら変更しなかった場合の当たる確率が$\frac{1}{3}$なのに対し、変更した場合の当たる確率は$\frac{2}{3}$だからだ。」

# 解説
プレーヤーが最初に1つドアを選んだ段階では、どのドアも当たりである確率は$\frac{1}{3}$であるはずだ。それがなぜ、司会者が外れのドアを1つ見せた後では変わってしまうのだろうか？

これを理解するために、モンティ・ホール問題に似た以下のような問題を考えてみる。
>
1. プレーヤーはドアを1つ選択する
2. プレーヤーは、「選択しているドア」か、「残り2つのドア」のどちらに当たりがあるか選択を促される。

この場合、誰もが後者の「残り2つのドア」を選択するだろう。なぜなら、当たる確率が前者は$\frac{1}{3}$なのに対し、後者は$\frac{2}{3}$だからだ。

この問題とモンティ・ホール問題の決定的な違いは、「選択していないドアのうち、外れのドアを1つ見せる」という行為の有無である。
モンティ・ホール問題では、この行為により「残り2つのドア」のうちの1つが当たり確率0として確定する。これを整理すると、

- 「残り2つのドア」に当たりがある確率は$\frac{2}{3}$,
- 「残り2つのドア」の一方の当たり確率が0に確定

以上より、最後に残った今選択していないドアが当たりである確率が$\frac{2}{3}$となる。

*司会者がドアを開示する前後での当たり確率の変化:*
<img width="802" alt="Screen Shot 2020-01-26 at 23.30.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285435/7c66e57f-ac79-708f-4e3d-6ef1ada97052.png">




# よくある誤解
どのドアも当たる確率は同じであるはずだ。よって、一つ外れのドアが確定したのならば、残り2つのドアが当たりである確率はそれぞれ$\frac{1}{2}$である。

この考えは、以下のような問題であれば正しい。
>
1. プレーヤーはドアを1つ選択する
2. 司会者は、（プレーヤーが選択中のものも含め）3つのドアのうち外れのドアを1つランダムに見せる
3. プレーヤーは、残った2つのドアのうち1つを選択する

この問題とモンティ・ホール問題の決定的な違いは、**「司会者が、プレーヤーが選択中のドアを見せることができるか否か」**である。
モンティ・ホール問題では、上記はできないことになっている。プレーヤーが選択しているドアが当たりだった場合はこの違いは関係ないが、外れだった場合に大いに影響する。
プレーヤーが選択しているドアが外れであった場合、モンティ・ホール問題では、必ずもう一方の外れのドアが開示される。対して上記の問題では、どの外れのドアが選ばれるかは完全にランダムで、当たりのドアを当てるための何のヒントも得られない。

以上、直感的な説明ではあるが、とりあえず当たる確率がそれぞれ$\frac{1}{2}$にはならないということには納得できるのではないだろうか。

# Pythonによるシミュレーション
Python によるシミュレーション例を載せておく。
1万回ゲームを行い、ドアを変更する場合と変更しない場合の勝率をそれぞれ計算した。

```python
import random
random.seed(1)
doors = ["当たり", "ヤギ", "ヤギ"]
stay_wins, change_wins = 0, 0

# 十分な試行回数繰り返す
loop = 10000
for _ in range(loop):
    # 最初にドアを選ぶ
    choose = random.choice(doors)
    # ドアを変更しない場合と変更する場合で、当たりを引いた方に勝数+1
    if choose == "当たり":
        stay_wins += 1
    else:
        change_wins += 1

print("--- 勝率 ---")
print(f"ドアを変更しない場合: {stay_wins / loop}")
print(f"ドアを変更する場合　: {change_wins / loop}")
```
```:出力結果
--- 勝率 ---
ドアを変更しない場合: 0.3323
ドアを変更する場合　: 0.6677
```

# 最後に
Qiita初投稿です。
どんなコメントでもお待ちしています！！
GKEにクラスタ作成から削除するまで

GKEの入門として、クラスタの作成から削除までの作業を実際にやったのでその際の覚書です。

# GKEクラスタの作成
コンソールに沿って操作します。
試しに作るなら一番小さい`f1-micro`でも大丈夫かと思いますが、podの作成、削除などかなり時間がかかります。。
料金が気になる方は[こちら](https://cloud.google.com/products/calculator?hl=ja)で計算できます

# GCPにアクセスする
https://cloud.google.com/sdk/docs/authorizing?hl=ja
https://cloud.google.com/kubernetes-engine/docs/quickstart?hl=ja

- `$ gcloud auth login`
- `$ gcloud config set project sample-111111`
- `$ gcloud config set compute/zone asia-northeast1`
- `$ gcloud container clusters get-credentials standard-cluster-1`

```
$ gcloud config list
[component_manager]
disable_update_check = True
[compute]
gce_metadata_read_timeout_sec = 5
zone = asia-northeast1
[core]
account = xxxxx@gmail.com
disable_usage_reporting = False
project = sample-111111
[metrics]
environment = devshell
```

# 実際にデプロイする
https://cloud.google.com/kubernetes-engine/docs/how-to/load-balance-ingress?hl=ja

今回はサンプルを私用しました。
実際のコードはgithubを参照ください。
https://github.com/shigeru10/k8s_template

# 余分な課金がされないように削除
作成したものを削除しないと課金されてしまうので注意です。

`$ kubectl delete pod --all`
`$ kubectl delete svc --all`
`$ kubectl delete ingress --all`

# まとめ
今回は実際にクラスタの作成から、削除のところまでをやっていきました。
次回はもう少し、アプリケーションの実装をして、マニフェストファイルをアップデートしていきたいと思います
AWS CDK+React+TypeScriptでLIFF開発

# はじめに
最近案件で[AWS CDK](https://github.com/aws/aws-cdk)を触ることになりましたのでこの記事を思いつきました。このCDKはAWSのコンソールを触ることなくクラウド環境を構築することができるので大変便利です（私はコンソール触りたくないマンなので）。
CDKについては[過去の記事](https://qiita.com/ufoo68/items/884b9767deb35f64b882)で触ったことがあるのでそちらを参考に、また**React**＋**TypeScript**で[**LIFF**](https://developers.line.biz/ja/reference/liff/)を開発してみたことも[過去の記事](https://qiita.com/ufoo68/items/3e6ff0613ebd87a8edd9)でやったのでそちらを参考にしてみてください。今回はその２つを組み合わせてAWSのコンソールを触らずにLIFFを開発してみました。

# 今回の内容
[クラスメソッドさんの記事](https://dev.classmethod.jp/cloud/aws/aws-cdk-deploy-react/)を参考にしました。この記事でやってることとしては、**S3**と**CloudFront**でReactで作ったページを静的にホスティングしているという感じですね。今回はそれにプラスして、LIFF環境を構築してみました。
構成（というものでもありませんが）は以下のような感じになります。
![CloudFront+S3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/344c40cd-9478-33fd-47d8-b0b5056788ff.jpeg)
つまりS3の中にある静的サイト（今回はLIFFアプリ）をCloudFrontを介してアクセスさせる形で構成します。

# 実装
今回は自分の過去の記事とクラスメソッドさんの記事からサンプルコードを引用しながら実装を行ったので、CDKに関するソースコードはここでは載せません。一応全体のコードは[こちら](https://github.com/ufoo68/aws-cdk-deploy-react)で公開しているので参照ください。
LIFFの部分では、最初にユーザーのログインを確認して（してなければログイン画面に遷移）ユーザープロフィールを取得するといった感じのものです。

```tsx
import React, { FC, useState, useEffect } from 'react'
import { Profile } from '@line/bot-sdk'
import './App.scss'

const App: FC = () => {
  const [profile, setProfile] = useState<Profile>({
    displayName: '',
    userId: '',
    pictureUrl: '',
    statusMessage: '',
  })

  useEffect(() => {
    liff.init({ liffId: process.env.REACT_APP_LIFF_ID as string }).then(() => {
      if (!liff.isLoggedIn()) {
        liff.login()
      }
      liff.getProfile()
        .then(profile => {
          setProfile(profile)
        })
        .catch((err) => {
          console.log('error', err)
        })
    })
  }, [])

  return (
    <div className="App">
      <div>
        {profile.displayName}
      </div>
      <div>
        {profile.pictureUrl}
      </div>
      <div>
        {profile.statusMessage}
      </div>
      <div>
        {profile.userId}
      </div>
    </div>
  );
}

export default App;
```

べつ大したコードではありませんが、前回`liff-type`を

```js
const liff = window.liff
```

という形で最初に宣言する必要があると勘違いしていたのですが、それは不要みたいだったのでそこだけ注意しました。

# メリット
内容はこんだけなのですが、これだけで記事を終えるのはよろしくないので、ここではCDKで書けることで嬉しいことについて書こうかなと思います。
まあ、静的なサイトを立てるだけなら別に[GitHub Pages](https://help.github.com/ja/github/working-with-github-pages/about-github-pages)を使っても良い気がしますが、キャッシュやらアクセス制限などの細かい設定はさすがに[CloudFront](https://aws.amazon.com/jp/cloudfront/)などといったCDN（コンテンツ配信ネットワーク）を使わないとさすがにできないので今回のような実装になるかと思います。このときにAWSのコンソールを直接触るのも一つの手だと思うのですが、手作業でやってしまうと再現手順をどこかにメモをしないと再現が難しくなります。
そういったときに[CloudFormation](https://aws.amazon.com/jp/cloudformation/)を書いたりしますが、書いたことある方ならわかるかと思いますが、あれは**json**とか**yaml**で設定ファイルを書く形なのでリソースの数が多くなるととてもつらくなります（あと、構文エラーも見つけにくいです）。こういうときにCDKをつかうとものすごく快適にAWSの開発ができるのでオススメです。

# さいごに
今回はCDKでLIFFアプリができるかを試してみました。案の定簡単にできてしまったのでもう少し他のサービス連携とかをやってみようかと思います。
WSLにtesseractをインストールする

# tesseractとは
OCRライブラリ。画像中の文字列を読みだすことができる。

https://github.com/UB-Mannheim/tesseract

# インストール
Windowsネイティブのインストーラもあるが、WSLの場合はLinux同様の手順でaptを使ってインストールできる。

手順にある```tesseract-ocr```と```libtesseract-dev```のほかに、日本語を使う場合は```tesseract-ocr-jpn```も必要。

```
sudo apt install tesseract-ocr libtesseract-dev tesseract-ocr-jpn
```

# 実行手順
これは手順通り。日本語を使う場合は```-l jpn```とオプションを付ける。

```
tesseract input.png output -l jpn
```
Lua 

# Lua言語とは
Lua という名前は、ポルトガル語の「月」に由来する。おしゃれ。
スクリプト言語。

## install

brewで入る。

```
$ brew install lua
```

```
$ lua
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
> 
```

https://www.lua.org/manual/5.3/manual.html

# 1.introduction

# 2.Basic Concepts

## 2.1 Values and Types

Lua で用意されているのは, 以下の８つの基本型

- nil
- boolean
- number
- string
- function
- userdata
- thread
- table
ROS2をwindows10にインストールしようとしたら詰まった

#はじめに
ROS2がwindowsでも動くと聞いて、手持ちのwindowsPC(surface pro3)にインストールしようとしたらハマったところがあったので共有化します。

#インストール手順
[公式](https://index.ros.org/doc/ros2/Installation/Dashing/Windows-Install-Binary/)が非常に分かりやすい。
[この記事](https://qiita.com/matryorobotics/items/beab21d4cf3199b1f6ff)も参考になります。

#詰まったところ
サンプルプログラムで
`ros2 run demo_nodes_cpp talker`
を実行したところ、
"failed to create process"
と言われてしまった。

いろいろ調べた結果、ROS2のフォルダの
ros2_dashing/Scripts
の中にあるpythonスクリプトの一行目のShebangが
`#!C:\Python37\python.exe`
となっていて、実際のpython実行ファイルがある場所ではなかった。
なので、全部で19個あるpyファイルを実際にpython.exeがある場所(*1)のパスに書き換えて実行したところ、うまく動いた。

ところが、今度は次のサンプルプログラムで、
`ros2 run demo_nodes_py listener`
と実行したところ、また
"failed to create process"
と言われてしまった。

小一時間調査した結果、上記同様にスクリプトの一行目を書き換えるとうまく動いた。書き換えたのはros2_dashing/Libフォルダ内の下記フォルダのpyスクリプト。

- demo_nodes_py
- examples_rclpy_executors
- examples_rclpy_minimal_action_client
- examples_rclpy_minimal_action_server
- examples_rclpy_minimal_client
- examples_rclpy_minimal_publisher
- examples_rclpy_minimal_service
- examples_rclpy_minimal_subscriber
- quality_of_service_demo_py

#作業に使用したコード
下記コードはfor_replaceフォルダに一度pyスクリプトをコピーしてから書き換えることを想定したコードです。
<<>>の中はご自身のpython.exeのパスを記入ください。

```python:file_change.py
# -*- coding: utf-8 -*-

import glob

file_name_list = glob.glob("for_replace/*.py")
first_line_list = []

for file_name in file_name_list:
    with open(file_name) as f:
        line_list = f.readlines()
        line = line_list[0]

    first_line_list.append(line)

print(first_line_list)#'#!c:\\python37\\python.exe\n' が並んだリスト

replace_shebang = "#!<<python.exeのあるパス>>\n"

first_line_list2=[]

for file_name in file_name_list:
    with open(file_name) as f:
        l = f.readlines()
    #insert new_name in first line
    l.insert(0,replace_shebang)
    #delete seconde line
    del l[1]

    ##ファイル書き込み
    with open(file_name, mode='w') as f:
        f.writelines(l)

    #書き込んだファイルの中身確認
    with open(file_name) as f:
        temp = f.readlines()

    line = temp[0]
    first_line_list2.append(line)

print(first_line_list2)

```




*1 スタートメニュからpythonを探して、右クリックで「ファイルの場所を開く」としてから、もう一度右クリックで「ファイルの場所を開く」とすると、大元のexeファイルの場所がわかる
AtCoder Beginner Contest 153 参戦記

# AtCoder Beginner Contest 153 参戦記

## [ABC153A - Serval vs Monster](https://atcoder.jp/contests/abc153/tasks/abc153_a)

1分半で突破. 書くだけ.

```python
H, A = map(int, input().split())

print((H + (A - 1)) // A)
```

## [ABC153B - Common Raccoon vs Monster](https://atcoder.jp/contests/abc153/tasks/abc153_b)

2分半で突破. 書くだけ. 必殺技の合計ダメージがモンスターの体力を上回っているか、それだけ.

```python
H, N = map(int, input().split())
A = list(map(int, input().split()))

if sum(A) >= H:
    print('Yes')
else:
    print('No')
```

## [ABC153C - Fennec vs Monster](https://atcoder.jp/contests/abc153/tasks/abc153_c)

2分半で突破. 書くだけ. できるだけ体力が多いやつを必殺技で倒したいので、ソートして先頭K匹以降を攻撃で倒すものとして集計すればいいだけ.

```python
N, K = map(int, input().split())
A = list(map(int, input().split()))

A.sort(reverse=True)
print(sum(A[K:]))
```

## [ABC153D - Caracal vs Monster](https://atcoder.jp/contests/abc153/tasks/abc153_d)

7分半で突破. log なので TLE にはならないので、再帰関数で定義通りカウントしていくだけで OK.

```python
from sys import setrecursionlimit

setrecursionlimit(1000000)

H = int(input())


def f(n):
    if n == 1:
        return 1
    else:
        return 1 + f(n // 2) * 2


print(f(H))
```

## [ABC153E - Crested Ibis vs Monster](https://atcoder.jp/contests/abc153/tasks/abc153_e)

55分半で突破. DP で総当り.

```go
package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
	"strconv"
)

func main() {
	AMax := 10000

	H := readInt()
	N := readInt()
	AB := make([]struct{ A, B int }, N)
	for i := 0; i < N; i++ {
		AB[i].A = readInt()
		AB[i].B = readInt()
	}

	dpLen := H + AMax + 1
	dp := make([]int, dpLen)
	for i := 0; i < dpLen; i++ {
		dp[i] = math.MaxInt64
	}

	dp[0] = 0
	for i := 0; i < H; i++ {
		if dp[i] == math.MaxInt64 {
			continue
		}
		for j := 0; j < N; j++ {
			a := AB[j].A
			b := AB[j].B
			if dp[i]+b < dp[i+a] {
				dp[i+a] = dp[i] + b
			}
		}
	}

	result := math.MaxInt64
	for i := H; i < dpLen; i++ {
		if dp[i] < result {
			result = dp[i]
		}
	}
	fmt.Println(result)
}

const (
	ioBufferSize = 1 * 1024 * 1024 // 1 MB
)

var stdinScanner = func() *bufio.Scanner {
	result := bufio.NewScanner(os.Stdin)
	result.Buffer(make([]byte, ioBufferSize), ioBufferSize)
	result.Split(bufio.ScanWords)
	return result
}()

func readString() string {
	stdinScanner.Scan()
	return stdinScanner.Text()
}

func readInt() int {
	result, err := strconv.Atoi(readString())
	if err != nil {
		panic(err)
	}
	return result
}
```

## [ABC153F - Silver Fox vs Monster](https://atcoder.jp/contests/abc153/tasks/abc153_e)

敗退. AtCoder の Go のバージョンがもっと新しくて、スライスのソートができたら突破していたと思う. そうでなくてももう少し時間が残っていたら C# で書き直したのだが…….

追記: 勘違い. 全然理解できていなかった. 爆弾範囲内のモンスターへのダメージの処理を *O*(*N*) より低いオーダーで処理できるかが問題の肝だった. 解説動画通り、爆弾のダメージと有効範囲をキューに入れて、範囲外にでたらリタイアさせることで *O*(1) で実装して AC.

```python
from collections import deque

N, D, A = map(int, input().split())
XH = [list(map(int, input().split())) for _ in range(N)]

XH.sort()
q = deque()
t = 0
result = 0
for x, h in XH:
    while q:
        if x <= q[0][0]:
            break
        t -= q[0][1]
        q.popleft()
    h -= t
    if h <= 0:
        continue
    c = (h + A - 1) // A
    result += c
    t += c * A
    q.append((x + 2 * D, c * A))
print(result)
```
入社１年目から始める Qiitaへの投稿

#概要
最も効果的な学習方法は、アウトプットすること。だったら書けばいいじゃん、くらいの気持ちで投稿し始めたが、ちゃんと順を追って説明してみる。

#準備

まずは気持ちの部分。とはいえここが一番大事なところでもあると思っている。

###投稿する目的を決める
やる以上は、**明確な目的意識を持つ**べき。なんだっていい。業界全体の働き方改革でもよし、ネタに走って人を笑わせるでもよし、会社からの評価のための定量的な指標にするでもよし。

私の場合、目的は３つ。

1. **自分の理解を深めたい（Output For Input）**<BR>
例えば、わかりにくい概念をどうやって理解したか、それを再構築して言語化することで、その概念を自分の中にさらに定着させることができる。
1. **誰かを助けたい（Output For Somebody）**<BR>検索したけど記事がわかりくにい・そもそもヒットしない、という情報は、「ありそうでなかった」情報である。同じ境遇の誰かを助けることにつながる可能性が高い。
1. **あとで見返せるようにしたい（Output For Someday）**<BR>
学んだことを今の職場のナレッジとして蓄積していると、そこを離れるときに持ち出せない。また、自宅で書いた関数・マクロを技術サイトに投稿しておいて、それを職場でコピペして使ったり、他メンバーにサジェストしたり、ということもできる。

#環境構築

###記事のジャンルを決める

自分のやっていることで、アウトプットしたいこと・ジャンルをざっくり決める。この時点では、**記事の内容とかまで細かく考えすぎない方がいい**と思う。

私の場合、とある試験について職場内で情報をまとめようと思ったが、だったらパブリックに閲覧できるように技術サイトに投稿すれば、いつか誰かの助けになるかもしれないと考えたのがきっかけ。で、それ以降はほぼExcelネタしか書いてない。

###適した技術サイトを見つける

いくつか技術サイトを検索して巡ってみて、自分のやりたいジャンルに**適していそうなサイトを選ぶ**。
私の場合は、業務上の調べもの(Excel、Redmine、Network)でたびたびお世話になっていたQiitaを選択。

###アカウントを作る
Qiitaの場合、「いいね」や「ストック」ができるようになったり、記事にコメントしたりできるようになる。もし**今すぐに投稿する気がなくても、アカウントを作る**べし。また、書いてみよう、といざ思ったときに、そこからアカウントを新規作成しなきゃいけないとなると、それだけでやる気を削がれる恐れがある。

###下書きを触ってみる

記事の新規作成ボタンを押して、とりあえず何か書いてみる（公開はしない）。たくさんの機能を理解する必要はなく、**使い勝手を体験してみる**ことが大事。

Qiitaの場合は「マークダウン」という記法が使われている。文例などを参照して、主要と思われる下記の書き方を理解しておく。この５つだけわかっていれば、ひとまず記事は書ける。

|内容|実例|
|:-:|:-:|
|見出しのつけ方|`文頭に#を複数`|
|強調表示|`**強調したい文字**`|
|特殊文字のエスケープ方法|`\` `<pre>本文</pre>`|
|表の作り方|下書きの？マーク参照|
|画像の貼り付け方|下書きの写真マーク参照|

#記事作成

ここまでは初回のための準備。
ここからは記事を作っていく工程だが、以下の順序はあくまで一例である。
最適な順序は、人によって・記事によって異なる。タイトル(テーマ)、章立て(構成)、コード(読者が知りたいこと)、オチ(一番伝えたいこと)、どこから手をつけても不正解ではない。

###タイトルを決める

私の場合、まずは記事のタイトルを決めることから始める。
書きたいことを最初にタイトルで宣言しておくことで、話題が散漫にならず、文章全体の背骨がしっかりすると考えているため。

読んでほしい相手・レベルを想定した上で、**伝えたいことの骨子がわかるように**。
タグ機能などがあったとしても、どの技術を扱うかはタイトルに書いた方がいい。PCで見えてるタグがスマホやタブレットでも見えるとは限らない。
ものごとを端的に伝えるには、20文字がいいと浅田すぐる氏が提唱している。ちなみに、Yahooトピックスは字で13文字、俳句は音で17文字。

###記事の構成を決める

記事の内容を**どのように展開していくか**を考える。他の記事でわかりやすい構成のものがあれば、それを拝借するのもあり。下記あたりが必須だと思う。

- 概要(背景)
- 実現したいこと
- 実現方法
- 検証
- まとめ

###文章を書く・画像を貼る

構成が決まったら、ようやく文章を書いて画像を貼る。作文に苦手意識を持っている人がIT業界には多いように感じるが、「文章から書き始めようとしているから」というのがひとつの理由ではないだろうか。構成を先に考えておいて、**その段落で何を伝えればいいかが明確**になっていれば、格段に文章が書きやすくなるはず。

文章の書き方(国語的な意味で)については…誰かが書いてくれているはず。繰り返し書いてフィードバックをもらうのが習熟の近道かもしれない。
画像は、シンプルなものを自作するべき。私はPowerPointで図を作っている。

他サイトや書籍から引用する場合は、著作権を十分に考慮する必要がある。著作権がわからない場合は、フェイルセーフで考えて、引用しない方が無難。

#確認

###情報の裏を取る

記載したことが本当に正しいのか、確認する。
かつては、ネットの情報は眉唾モノと言われていたが、令和の時代においては、**ネットに載っている情報が常識だと認識される**だろう。だから、ネット上にアウトプットする以上は、それなりの責任感を持たなければならない。
もし裏が取れず、自信が持てない・推測の範囲であるなら、いっそ記載しないか、あくまで推測であることを断っておくべき。

###作った記事を見直す

頭から通しで読んでみて、わかりにくいところがないか、ワンワード・ワンミーニングになっているか、などを確認する。**先入観のない状態でイチから再読する**のがベストなので、朝の電車とかちょうどいい。

*<pre>「夜は悪魔の時間だから、夜に書いた原稿は、翌朝太陽の下で読み直すこと（意訳）」
　　　────────ドイツの神学者　ディートリヒ・ボンヘッファー</pre>*

###投稿する

確認が済んだらあとは投稿ボタンを押すだけ。
**はじめから完璧を目指す必要はない**。失敗なくして成長なし。

ネット上にパブリックに公開すると、誰かが反応してくれることがある。間違いの指摘かもしれないし、真意のわからない「いいね」かもしれない。それらに一喜一憂しつつ、記事を修正することも必要である。

#まとめ

無知から来る恐れが行動を妨げる。**やり方・流れを決めておくこと**で、アウトプットのハードルは下げられる。
[Golang]redigoでデータベース番号を指定する

# 方法

[redigo](https://github.com/gomodule/redigo)でデータベース番号を指定するには、オプションを追加する。

```golang
db := 1
opt := redis.DialDatabase(db)
conn, err := redis.Dial("tcp", "localhost:6379", opt)
```

# 参考
[redis - GoDoc](https://godoc.org/github.com/garyburd/redigo/redis#DialDatabase)
[machinery/redis.go at 84f17e8ec73bbec34184beb067f22301ffa5263b · RichardKnop/machinery](https://github.com/RichardKnop/machinery/blob/84f17e8ec73bbec34184beb067f22301ffa5263b/v1/common/redis.go#L65)
基本情報技術者　テクノロジ系　第7章 セキュリティ⑥

今日も続いて書いて行きます。


# マルウェア、様々な攻撃
ウイルスなどの悪意あるプログラムのこと


## 種類と動機

### ダークウェブ
通信の匿名化で使えるサイト
犯罪など御用達のアンダーグラウンドサイト

### サイバーキルチェーン
サイバー攻撃の段階を7段階で区分すること
見通しをよくして攻撃対策をとる

### サイバーテロリズム
情報システムを対象としたテロ

### ハクティズム
政治がらみのハッキング活動思想

## 不正のトライアングル
組織内部で不正行為の3要素

### 動機、プレッシャ
金銭、評価

### 機会
メールが確認されてないなど
魔が刺す機会

### 正当化
不幸があったから
自分はこれやったから、この権利がある

## マルウェア

###コンピューターウイルス
下記のような機能を持ったプログラムのこと

#### 自己伝染機能
他コンピューターに伝染

#### 潜伏機能
条件成立まで身を隠す

#### 発病機能
不正処理を実行

### トロイの木馬
プログラム中にウイルスを密に忍ばせておく

### スパイウェア
ユーザー情報を盗み出す

#### キーロガー
キーボードで入力した情報を盗むだす

### ボット
指令サーバから指示を受け取り
不正を行う

### ランサムウェア
データを人質にして、代金など請求するソフトウェア

### ルートキット
不正進入したコンピューター内で隠蔽工作を行う
バックドアなど

## ウイルス対策ソフトウェア

### パターンマッチング方式
定義ファイルと合致するウイルスを検出

### ヒューリスティックスキャン方式
不正処理から検出

## 攻撃の種類

### パスワード解読(パスワードクラッキング)
基本総当たりで行う
辞書だったり、他の手口で得たパスワードリストだったり

### フィッシング
偽メールや、偽ウェブサイトなど

### ソーシャルエンジニアリング
上司や管理部門になりすましてアドレスを入手

### サラミ法
わからないとうに少しずつ盗みとる方法

### スキャベンジング
ゴミ箱あさり

### ポートスキャン
前ポートに順番に接続を試みる

### DoS(denial of servise)攻撃
サーブス不能攻撃

サーバに大して大量のメールを送るなど

### バッファオーバフロー
大きなトロイの木馬

### DNSキャッシュポイズニング
DNSキャッシュサーバに偽のドメイン情報を入力する

### SQLインジェクション
入力データとして、SQL文の一部をいれる

### クロスサイトスクリプティング(XSS)
標的サイトに不正javascriptプログラムを送信するやり方

#### サニタイジング処理
XSS対策

### クロスサイトリクエストフォージェリ(CSRF)
ハイパーリンクなどの悪用
意図せずに商品の購入などさせるなど

### ディレクトリトラバーサル
相対パスでファイル名を入力することで、非公開のファイルを盗む出す

###標準型攻撃
電子メールを用いた方法

### ドライブバイダウンロード
webサイトの閲覧などで
ユーザに気づかせないようにPCにマルウェアをダウンロードする方法

### 水飲み場型攻撃
日常利用サイトを改竄してマルウェアを仕掛ける方法

### 電子メールの第三者中継
メール送信を中継するのを
オープンリレーといいます。
javaでAtCoder Beginner Contest 153を解く

AtCoder Beginner Contest 153お疲れ様でした！
[公式ページ](https://atcoder.jp/contests/abc153)

今回の自分の書いたコードは[こちら](https://github.com/ko-flavor/atcoder-java/tree/master/atcoder/src/abc/abc153)
結果はA-DまでAC、FがTLEでした。

以下簡単に解説します。

##[問題A](https://atcoder.jp/contests/abc153/tasks/abc153_a)

HPがHのモンスターを攻撃力Aで攻撃して、何回で倒せるかを求める問題。
H/Aがちょうど割り切れるときの処理に注意すれば大丈夫なはずです。

##[問題B](https://atcoder.jp/contests/abc153/tasks/abc153_b)

数字(必殺技の攻撃力)を足し合わせて、相手のHPに届くかどうかを求める問題。
シンプルな足し算でいけるはずです。

##[問題C](https://atcoder.jp/contests/abc153/tasks/abc153_c)

モンスターがN体いて、必殺技がK回使えます。
この必殺技でモンスターを瞬殺できるので、この必殺技を誰に使うかが求められれば、あとは残った敵の体力を足し合わせれば大丈夫です。

当然、体力が高い順にK体必殺技を使いたいので、それをコードで頑張って表現しましょう。

##[問題D](https://atcoder.jp/contests/abc153/tasks/abc153_d)

1度攻撃を行うと、モンスターが体力H/2になって分裂し、体力が1の場合には倒せる。
これは**敵の数**と**敵の体力**をもっておくと比較的シンプルにできました。

1回の操作で
**敵の数**分だけ、攻撃を行った回数を加算し、
**敵の体力**を半分にし、
**敵の数**を2倍にする

この操作を体力が0になるまで繰り返せばOKです。

##[問題E](https://atcoder.jp/contests/abc153/tasks/abc153_e)

なんだかアルゴリズムの定番問題っぽいなぁと思いつつ分からず。

##[問題F](https://atcoder.jp/contests/abc153/tasks/abc153_f)

2ケースTLEでした・・・
自分の考え方は
①座標を小さい順にソートする
②敵の体力を何回の攻撃で倒せるかに換算する
を下処理として行い、

①座標を小さい順にひとつ取得する
②その点の敵があと何回で倒せるかを取得
③そこから、爆弾の範囲ぶんだけの点を取得
④その範囲の敵について、②で取得したぶん攻撃する。

実装きちんとできればACなると思うのですが、、基本的な考え方は間違っていない気がします。

----

レーティングは956→944。

D問題までは17分とサクサクできて、成長も感じれたのですが
E問題以降解けるようにならないとここからはレートなかなか伸びなそうです。。

今回のE問題もF問題もきちんと復習します！！:cry:
denoからMochaとChaiを使用する

## 概要

denoから[Mocha](https://mochajs.org/)と[Chai](https://www.chaijs.com/)を使用する必要が生じたため、使い方を記載します。

denoのバージョンはv0.31.0を想定しています。

#### 注意

諸事情あって筆者はdenoからMocha/Chaiを利用していますが、基本的にはそうする必要はありません。
denoの標準モジュールにはテストライブラリが付属しているためです。
あくまで、denoからJavaScriptモジュールを使用する際の参考になれば幸いです。

## 準備

```typescript:global.ts
window['global'] = window;
```

```typescript:mocha.ts
// @deno-types="https://unpkg.com/@types/mocha@5.2.7/index.d.ts"
import "https://unpkg.com/mocha@7.0.0/mocha.js";

mocha.setup({ ui: 'bdd', reporter: 'spec' });

export function runTests(): void {
  mocha.run();
}

export function runIfMain(meta: ImportMeta): void {
  if (meta.main) { 
    mocha.run();
  }
}
```

```typescript:chai.ts
import "./global.ts";
// @deno-types="https://unpkg.com/@types/chai@4.2.7/index.d.ts"
import "https://unpkg.com/chai@4.2.0/chai.js";

chai.should();
export const expect = chai.expect;
export const should = chai.should;
```

## 使い方

テストを書きます。

```typescript:sum_test.ts
import {runIfMain} from "./mocha.ts";
import {expect} from "./chai.ts";

function sum(...numbers: number[]): number {
  return numbers.reduce((sum, x) => sum + x, 0);
}

describe("sum()", () => {
  it("should return sum of numbers", () => {
    expect(sum(1, 2)).to.equal(3);
  });

  it("should return zero when called with no arguments", () => {
    expect(sum()).to.equal(0);
  });
});

runIfMain(import.meta);
```

下記のようにテストファイルを直接実行すると、Mochaによってテストが実行されます。

```sh
$ deno run ./sum_test.s
```

## 複数のテストファイルを実行したい

下記のように複数のファイルを読み込み、`runTests`を呼ぶと、複数のテストファイルをまとめて実行できます。

```test.ts
import {runTests} from "./mocha.ts";
import "./sum_test.ts";
import "./max_test.ts";

runTests();
```

## 解説

```typescript:mocha.ts
// @deno-types="https://unpkg.com/@types/mocha@5.2.7/index.d.ts"
import "https://unpkg.com/mocha@7.0.0/mocha.js";
```

```typescript:chai.ts
// @deno-types="https://unpkg.com/@types/chai@4.2.7/index.d.ts"
import "https://unpkg.com/chai@4.2.0/chai.js";
```

上記コードはunpkgからMochaやChaiのブラウザビルドを読み込んでいます。

`@deno-types`はdeno固有の機能で、JavaScriptファイルをimportする際にそのモジュールに対して型付けを行うことができます。

これによって、denoからJavaScriptモジュールを利用する際にも適切に型付けが行われます。

## 参考

https://deno.land/std@v0.31.0/manual.md#using-external-type-definitions
Django htmlをエスケープせずに表示させる

#djangoのtemplateでは自動的にhtmlescapeされる

例えば

```python

#value = "<div> a </div>"
<html>
<body>
{{ value }}
</body>
</html>
#結果
#"<div> a </div>"が文字列として表示される
```

#対策:templatesのbuildinsを参考として|safeを入れる

```
#value = "<div> a </div>"
<html>
<body>
{{ value }}
</body>
</html>
#結果
#"a"のみ表示される！
```

※buildinsは使えるので詳細を追加していきます。


#参考
<a href="https://docs.djangoproject.com/en/3.0/ref/templates/builtins/">https://docs.djangoproject.com/en/3.0/ref/templates/builtins/</a>
【初心者向け】Rubyの引数についてまとめてみました。

#Rubyで使われている引数についてまとめてみました。

参考記事
https://qiita.com/rtoya/items/33617078501776fdcad7
http://techracho.bpsinc.jp/baba/2013_12_26/15026


#初心者の方がおそらく最初に習う引数


```ruby

#hogeという命令はmsgを出力する
def morning(msg)
  puts msg
end
#msgはおはーという文章を出力する
morning = "おはよー"
#hogeを実行する
morning(morning)
```

仮引数と実引数（本引数）は一緒じゃなくてよかったですもんね。
morning(morning)のカッコでくくってるところのmorningが実引数で
msgが仮引数

私は頭の中でこう考えてます。間違ってましたらご指摘いただけると幸いです・・・・

```ruby
#仮引数領域がここから〜〜〜
def morning(msg)
  puts msg
end
#〜〜〜ここまで

#実引数領域がここから〜〜〜
morning = "おはよー"
morning(morning)
#〜〜〜ここまで
```

何をいいたいのか？というと、

def morning(msg)で宣言しているのに
 puts morning
end
っとしてしまうとエラーが起きてしまいますよ〜っということです。

<b>間違っている例

```ruby

def morning(msg)
  puts morning
end

morning = "おはよー"
morning(morning)
```

エラーが出ます。
↓

```
wrong number of arguments (given 0, expected 1) (ArgumentError)
```

実引数で使用するものがmsgならmsgを中身でも使わないといけないということですね。
最初は自分も割と混乱してました・・・・。

#デフォルト引数

```ruby

def hello(hello = "こんにちは")
  puts hello
end
hello
```

def外に宣言せずに、直接仮引数側で引数を設定するやり方みたいですね。

#デフォルト値をつけないキーワード引数

```ruby

def hello(hello: )
  puts hello
end
hello(hello: "こんにちは") 
```
こんなふうに、デフォルトで引数を定めなくても利用できるみたいですね。


#ハッシュを使って引数指定

```ruby
def evening(evening: "こんばんは")
  puts evening
end
evening
```
ハッシュで使用できるので、データの取り出しに便利ですね。

#ハッシュを使って引数指定②

```ruby
def morning_hello(morning:"おはー", hello:"こんにちは")
  puts "#{morning}、そして#{hello}"
end
morning_hello
```
こんなふうに、ハッシュなら順番をきにせずデータを自由に取り出せるみたいです。

#可変引数

```ruby

def morning_hello_evening(*msg)
  puts msg
end
morning_hello_evening('morning','hello','evening')
```

こちらの記事を参照いたしました。わかりやすいです。
https://shinkufencer.hateblo.jp/entry/2018/09/15/230150

どうやら配列でデータを格納しているみたいですね。

# 可変長引数 2（配列で格納されているものをそれぞれ出力してみる）

本当に配列で格納されているのか？疑い深い私は実際に試しました。

```ruby
def morning_hello_evening(*msg)
  puts "配列に格納されている#{msg[0]}"
  puts "配列に格納されている#{msg[1]}"
  puts "配列に格納されている#{msg[2]}"
end
morning_hello_evening('morning','hello','evening')
```

↓
解説

```
morning_hello_evening('morning','hello','evening')
```

が

```

# msg = ['morning','hello','evening']
っとなっており、0がmorning、1がhello、2がeveningとなっている
```

#オプション引数

```ruby

def morning_hello_evening(**msg)
  puts msg
end
morning_hello_evening(morning: 'morning',hello: 'hello',evening: 'evening')
```
こんな感じで
ちょっと、可変長引数と、オプション引数がわかりずらかったので調べました・・・・

<b>可変長引数が配列

なのに対して

<b>オプション引数はハッシュ

で複数の引数を受け取れる
っという違いであってますでしょうか？
間違ってたらすいません。。


#ブロック引数

```ruby

def morning(&block)
  block.call
end
morning{ p 'おはー' }
```

知識不足でブロック引数を使うメリットがよくわかりませんでした・・・
追々勉強しなおしていこうかと・・・


#ブロック引数（yield使用ver）

```ruby
def morning(&block)
 yield
end
morning{ p 'おはー' }
```

こちらも同上です、追々使用メリットがわかるよう日々学習していきます。


以上です。
もし、これは違う、これはこうしたほうが良い等々ございましたらご指摘いただけますと幸いです。

最後までみていただき、ありがとうございます。
Djangoで簡単OR検索

# 経緯
POSTリクエストからOR検索のクエリをつくりたい！
DjangoでOR検索をするのにQオブジェクトをパイプで繋いでクエリを作るのはマニュアルなどでパッとわかるが、POSTリクエストの内容からループで回したりして動的にQオブジェクトを作る方法が分らなかったので調査。

# よくあるサンプルで目的に近いもの[1]

```
from functools import reduce
import operator
options = ['1', '2', '3', '4']

# uses operator or to combine the Q objects with the particular option filter
query = reduce(operator.or_, (Q(value__icontains=option) for option in options))

polls = Poll.objects.get(query)
```

これだと```Q(value__icontains=option)```の```value```が固定になってしまう。。。

# 今回作ったやつ

```  
from functools import reduce
import operator

        queries = []
        for key_name, value in request.POST.dict().items():
            if not value and key_name != 'csrfmiddlewaretoken':
                queries += [Q((key_name+"__icontains", value))]
        res = Your_Model.objects.filter(reduce(operator.or_, queries))
```
※CSRF対策ちゃんとしてね

下から２行目の```queries +=```の行の書式がパッと分らず苦労したわ。。。
同じことやりたい人が苦労しません様に( ˘ω˘)

参考:
[1] https://stackoverflow.com/questions/46970160/django-correct-way-to-convert-list-to-combined-or-for-q-object/46970411
【体験記】AWS認定クラウドプラクティショナーを受験した

AWS認定クラウドプラクティショナーに合格したので、勉強方法や感想をかんたんにまとめます。

###受験結果
***合格（755/1000）***


###事前知識
およそ1ヵ月前にMicrosoftのAzure Fundamentals試験(AZ-900)に合格していました。

###使用した教材
①[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3ERB303UT76DT&keywords=aws%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC&qid=1578744077&sprefix=AWS%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%2Caps%2C266&sr=8-1)
②[Udemy この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/course/aws-4260/)

###勉強期間
・およそ1ヵ月（時間にすると35～40時間くらい）

###勉強方法
まずは①のテキストを2周読みました。
1週目は流し読み。2周目はアウトプットとしてQiitaに自分用メモとしてテキストの内容をまとめながら読みました。
その後、もう1つのアウトプットとして②の模試を解きました。
②の模試は最初買うつもりがなかったんですが、①のテキストだけでは学習した内容に自信が持てなかったことと、定価3,600円が割引で1,400円くらいになっていたので買いました。
②の模試は合計7回分（基礎2回、応用3回、難易度高2回）あるのですが基礎と応用を解きました。
1周目はどれもこれも4～5割くらいしか正解しなくて「これはヤバい」と焦りました（このとき試験の1週間前）。
けっきょく②の模試を正解した問題も含めて解説をしっかり読みながら3周して最終的には7割～9割正解するようになりました（この時点で試験1日前（汗））。
②の模試は受講生からのレビューでは「問題が難しすぎる」という声が散見しますが、自分が実際に試験を受けた感想としてはこれくらいの問題でちょうどよかったと思います。
解説も丁寧で詳しいのでこの模試を解いておいてよかったです。
①のテキストだけだと危なかったかも・・・。

###感想
試験の問題の当たりはずれはあるでしょうが、思っていたよりも相当難しかったです。MicrosoftのAZ-900試験よりも難しかったんじゃないかなと思います。受けながら途中で「あー、やっちまったかも」と思いました。
②の模試の応用レベルの問題も普通にでていました。逆に言うと、②の模試の問題とよく似た問題も数問でていました。
①のテキストだけだったら厳しかったかもしれないです、
①のテキストを章立てとか太文字とか関係なく隅から隅までばっちり覚えていて7割とれるかどうかという感じだと思いました。
試験の内容は完全な知識問題。「AWSのサービスの名前とその特徴」だとか「こういうことをしたいときAWSのどのサービスを使うか」という感じで。覚えていたら解けるし、覚えていなかったらまったく解けない。
AZ-900のときは実際にAzureを動かして試験にのぞんでその内容が問われたりとかありましたが、今回はAWSのアカウントは作りましたがほぼ触っていませんでした。
試験の合否には関係ありませんが、AWSをほぼ触っていないというのが今回の反省点です。
（試験に受かるための勉強に終始してしまった。）

###おまけ
試験が終わったあと合否結果を見る前に9問のアンケートに答える時間が非常にもどかしかったです。
早く結果知りたいのにー、と思いながら焦りながらアンケートに答えていました。
あとブラウザで「合格」って見ていても試験が終わった後レポートをもらえるわけじゃないし、受験結果がAWSのサイトの受験履歴に表示されるまでに時間差があったんで「え？ほんまに受かったん？あれ？見間違い！？」っていささか不安になりました（笑）
PythonでABC153のA~Dを解く

### はじめに
こんばんは。tax_freeです。午前中は英検を受けて来て、午後はABCを解くという日でした。英検を受験したせいで、日曜日感がゼロで疲れがmax。[前回](https://qiita.com/taxfree_python/items/4c75ff6cf9edc679a020)からレートが17上がりました。
今回のABCは簡単だったのでは。でもできなかった。言い訳させてください。コンテスト中にお腹を壊してトイレに入ってました。みんなは、コンテスト前にヨーグルト食べたり、豚骨ラーメン食べたり、体冷したりしないように気を付けてください。

### A問題
[問題](https://atcoder.jp/contests/abc153/tasks/abc153_a)

**考えたこと**
HをAで割っていって0より小さくすればいいので、Hが何回Aで割り切れるかを計算すればよい。割り切れない時の場合分けに注意。

```python
h, a = map(int,input().split())
if h % a != 0:
    print(int(h/a)+1)
else:
    print(int(h/a))
```

###B問題
[問題](https://atcoder.jp/contests/abc153/tasks/abc153_b)

**考えたこと**
使える魔法を全て足した威力が、モンスターの体力をこえていればいい。

```python
h, n = map(int,input().split())
a = list(map(int,input().split()))
damage = 0
for i in range(0,n):
    damage += a[i]
if damage < h:
    print('No')
else:
    print('Yes')
```

###C問題
[問題](https://atcoder.jp/contests/abc153/tasks/abc153_c)

**考えたこと**
必殺技は確定でモンスターの体力を0にできるので、体力が多いモンスターに打ったほうが効果的。
なので、モンスターの体力順にsortして必殺技を打てる回数分、先頭から0にしている。
そのあとは、0ではないモンスターの体力の合計を計算すればよい。

```python
n, k = map(int,input().split())
h = list(map(int,input().split()))

h.sort(reverse=True)
for i in range(0,min(k,len(h))):
    h[i] = 0
hp = 0
for j in range(k,n):
    hp += h[j]

print(hp)
```

### D問題
[問題](https://atcoder.jp/contests/abc153/tasks/abc153_d)

Cが終わった後にトイレに行っていたので、ここで大幅タイムロスが生れました()
それに加えて普通に考えるのに時間がかかった。

**考えたこと**
モンスターの体力Hが何回2で割ることができるかを計算しました。
Hを2で割るとHの個数は2倍に増えるということを考えると、n回目は$2^{n-1}$です。後は実装するだけです。

```python
import math
h = int(input())
hp = h
c = 0
ans = 0

while hp > 1:
    hp = math.floor(hp/2)
    c += 1
for i in range(0,c+1):
    ans += 2 ** i
print(ans)
```
math.floorはフロアー関数のことで、ガウス記号と同じ意味です。

###まとめ
体調には気をつけようね。悔しいのが、A~D完の人で提出が40分遅れると同じ点数でも2000位くらい差がついていたことです。次回のABCもA~C、A~Dを目指してがんばります。
では、おやすみなさい。
ABC153 解説

[ABC153](https://atcoder.jp/contests/abc153) の解説です。
今回はかなり典型的なセットだったので、速く全完できると吉です。
# [A問題](https://atcoder.jp/contests/abc153/tasks/abc153_a)
割り算の切り上げ処理がしたいです。
あまりで場合分けしても良いですが、$A/B$ の切り上げは、 $(A+B-1)/B$ で計算できることを知っておくと便利です。
# [B問題](https://atcoder.jp/contests/abc153/tasks/abc153_b)
$A_i$ の総和と $H$ を比較するだけです。for文で回しましょう。
# [C問題](https://atcoder.jp/contests/abc153/tasks/abc153_c)
必殺技は、体力の高いモンスターに対して使ったほうがよいです。
体力の高い順に $K$ 個のモンスターに対して必殺技を使い、残りを攻撃で倒すようにします。
# [D問題](https://atcoder.jp/contests/abc153/tasks/abc153_d)
すべてのモンスターをまとめて攻撃すれば、体力の値は一定になるので、個数だけ考えればよくなります。
モンスターはだいたい $\log H$ 回攻撃すればなくなるので、これを愚直にシミュレーションすれば通ります。
オーバーフローには気を付けましょう。
# [E問題](https://atcoder.jp/contests/abc153/tasks/abc153_e)
典型的な動的計画法の問題です。
このタイプは、「個数制限なしナップザック問題」として有名です。蟻本にも載っています。
ただ、蟻本に載っているタイプとは少し異なり、添字に持つのがトキの魔力ではなく、モンスターの体力なので注意してください。
# [F問題](https://atcoder.jp/contests/abc153/tasks/abc153_f)
まず、一番左のモンスターについて考えると、爆弾は、ダメージがこのモンスターに入る中で一番右に設置するのが最適です。これは、他のモンスターに攻撃が入ることを考えれば明らかです。
そこで、今体力が残っている中で一番左にいるモンスターに注目し、その位置 $+D$ の座標に爆弾を設置して、そのモンスターが倒れるまで爆破します。
この処理をすべてのモンスターが倒れるまでシミュレーションすればよいです。
区間のモンスターの体力を減少させる処理をしたいので、遅延セグメントツリーを使えば簡単に実装できます。
座標の値域が大きいので、座標圧縮をして処理を遅延セグメントツリーに載せると $O(N\log N)$ になります。
当然ですが、一度ずつ爆破するのでなく、注目しているモンスターが倒れるまでまとめて爆破するようにしましょう。
どうでもいいですが、僕は座標のソートを忘れて1WAを出しました。
# おわりに
この記事は20分で書いたクオリティです、ごめんなさい…
今回のような典型問題が多いセットだとスピードが重要になるので、典型をよく知っておくことは大事です。
分散分析のF値はF分布なのか検証【未解決編】



#分散分析のF値についての疑問

導入は端折る。
分散分析は群間で差があるかを検定している。
群間の差はサンプルサイズによって変化するし、
分散分析で使用する統計量はF分布に従う。

#ホンマか？？

正規分布やカイ二乗分布は理解しやすい。
F分布ってあんま使わんし、理解していない部分が多い。
なのでホントにF分布に従うのか試してみる。


```r
n <- 10000
m <- 100
s <- 30
hist(rnorm(n,m,s))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/10fdb3c4-a2c1-bfa9-082c-0d256878c75b.png)


まず同じ正規分布(平均100,標準偏差30)の母集団から得られた、サンプルサイズ5のデータ間の統計量はF分布に近似するのか？




例えばサイズ5のサンプルをランダムで選び、4群とってくるとこんな図ができるはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/1b181373-71b5-2284-0ca3-c9995ed20e41.png)



もともとの母集団を後ろに書き込むと


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/70971077-20e8-0b3a-eae2-689c42a50a2a.png)


たしかにそんな母集団から抽出されたデータっぽくは見える。
各郡の平均値を引いてやる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/e151ef70-a0e8-e30f-18b4-cf265fb542b4.png)


pinkの群だけが多少中心から離れている気がするが、同じ母集団から抽出されたデータのためそんなに離れることもないだろう。
複数回試行を繰り返すと今回のピンク以上に離れた標本平均が得られることもある。
そんな時はF分布の0から離れた部分にF値が来ることだろう。

ということで10万回くらい試行を繰り返してもらって、統計量FがF分布に従うのかを確認する。


#いけ！ポンコツコード！君に決めた！

```r
norm_data <- rnorm(n,m,s)

bind <- NULL

for(i in 1:100000){

set_number <- sample(n)
group_1 <- norm_data[set_number[1:5]]
group_2 <- norm_data[set_number[11:15]]
group_3 <- norm_data[set_number[21:25]]
group_4 <- norm_data[set_number[31:35]]

y <- c(group_1,group_2,group_3,group_4)
x <- c(rep(1,length(group_1)),rep(2,length(group_2)),
     rep(3,length(group_3)),rep(4,length(group_4)))

#上の母集団と4群を書くためのコード
#curve(dnorm(x,m,s),0,200,yaxt="n",ylab="",xlab="")
#par(new=T)
#plot(y,x,ylab="group",yaxt="n",xlab="",main="black=mean red=1 blue=2 green=3 pink=4",xlim=c(0,200))
#axis(2,at=c(1,2,3,4),las=1)
#abline(v=mean(norm_data))
#abline(v=mean(group_1),col="red")
#abline(v=mean(group_2),col="blue")
#abline(v=mean(group_3),col="green")
#abline(v=mean(group_4),col="pink")

#データ全体の平均値からの因子の各水準の平均値のズレ
all_mean <- c(rep(mean(group_1),length(group_1)),
              rep(mean(group_2),length(group_2)),
              rep(mean(group_3),length(group_3)),
              rep(mean(group_4),length(group_4)))

#残差
data_residuals <- sum((y - mean(y))**2) - sum((all_mean - mean(y))**2)

#残差自由度
free_residuals <- (length(y) - 1)-(length(unique(x)) - 1)

f_val <- (sum((y - mean(y))**2) / (length(y) - 1)) / (data_residuals / free_residuals)

bind <- c(bind,f_val)

}

```

PC落ちるかとヒヤヒヤした。

#ほんでF分布と比較してやる


**作成データをhistにする**

```r
dat<-hist(bind,breaks=1000,xlim=c(0,6))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/5ac13e7d-79c4-5998-3b7f-9bff0cd7aa8d.png)

**F分布から乱数を取り出す**


```r
dat2<-hist(rf(100000,free_residuals,(length(y) - 1)),breaks=1000,xlim=c(0,6))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/7c38dc1b-4189-4288-d3a6-5545337c65de.png)


#一致してるとは言えないでしょ

なにか間違ったかなぁ・・・
教えてわかる人！


そもそもdf(x,16,19)ってこうじゃない？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/65438c54-a799-4de5-3b0d-87d9b8299603.png)


どこで間違えたのか
go+gin+nginx環境をec2にデプロイ

## はじめに
web初心者が簡単なgoアプリケーションをec2にデプロイしてみました。
色々おかしなところがあると思いますので、何かありましたら、ご指摘いただけると幸いです。

githubを介してEC2インスタンスにプロジェクトファイルをあげるので、ローカルで開発したgoアプリケーションはgithubのリポジトリに上げておいてください。

## EC2インスタンス作成
AWSコンソール画面から EC2 > サービス > インスタンス > インスタンスの作成の手順でインスタンスを作成していきます。
今回はAMIにubuntuを選択して、そのほかの設定はデフォルトです。

インスタンスの接続に必要なキーペアも新規に作成してダウンロードします。名前はわかりやすいものにしてください。
キーペアのダウンロードが終わったら、キーペアがあるディレクトリに移動し、パーミッションを設定します。

```
$ chmod 400 [キーペアの名前].pem
```

## EC2インスタンスにssh接続
インスタンスが起動できたら、キーペアがあるディレクトリに移動して以下のコマンドでインスタンスにssh接続します。

```
$ ssh -i "[キーペアの名前].pem" ubuntu@[インスタンスのパブリックDNS]
```

## 必要なパッケージのインストール
### go
https://golang.org/dl/ から、Linux用のtar.gzのURLをコピーし、以下のコマンドを実行。
今回はgo1.13.6をダウンロード。

```
$ wget https://dl.google.com/go/go1.13.6.linux-amd64.tar.gz
```

ダウンロードできたら展開して配置し、パスを通します。

```
$ sudo tar -C /usr/local -xzf go1.13.6.linux-amd64.tar.gz
$ export PATH=$PATH:/usr/local/go/bin
$ exec $SHELL -l   #shellの再起動
```

パスが通っているか確認します

```
$ go version
go version go1.13.6 linux/amd64
```

### nginx, sqlite3
次にnginxとsqlite3をダウンロードします。

```
$ sudo apt-get install nginx
$ sudo apt-get install sqlite3
$ which nginx   # 確認
$ which sqlite3   # 確認
```

## プロジェクトファイルをクローン
あらかじめgithubのリポジトリに上げておいたgoアプリケーションをクローンします。

```
$ git clone 'gitリポジトリのパス'
```

### gccのインストール
go-sqlite3でgccがいるっぽいんでインストール

```
$ sudo apt install gcc
```

### 必要なパッケージをインストール
```
$ go get "github.com/gin-gonic/gin"
$ go get "github.com/jinzhu/gorm"
$ go get "github.com/mattn/go-sqlite3"
```

## build
buildする前にアプリケーションがきちんと動くか確認。
きちんと動くことが確認できたらビルド。

```
$ go build main.go
```

## nginxの設定
/etc/nginx/conf.d/にgin.confを作成

```gin.conf
server {
    listen       80;
    server_name  13.231.121.27;

    location ~ / {
        proxy_pass      http://127.0.0.1:8080;
    }
}
```

nignxを起動

```
$ sudo systemctl start nginx
```

## EC2のセキュリティグループの設定
EC2のコンソールの左側メニューからセキュリティーグループを選択し、セキュリティグループを以下のように作成します。
<img width="1127" alt="スクリーンショット 2020-01-26 12.10.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78102/dae6ff4e-22e6-da67-007e-25fc29fd2083.png">
※ sshのソースは自分のグローバルIPアドレスです。マイIPを選択すると自動で入力されます。

次に、インスタンス一覧から実行中のインスタンスを右クリック > ネットワーキング > セキュリティグループの変更 で先ほど作成したものを選択してください。

## ブラウザで確認
EC2インスタンスのパブリックIPをブラウザに入力してアクセスします。
確認できてたらokです。


## 参考
https://qiita.com/Dragon-taro/items/09a67b93093770348ce5
https://qiita.com/notchi/items/5f76b2f77cff39eca4d8
https://qiita.com/Utr/items/9469c1611abe8a0a3486
Rails Minitest こんな時どうする？テストクラス毎にfixureを分けたい

# 概要
テストクラス毎にfixureを分けたい。


# 詳細

Minitestではテストデータをfixtureフォルダにyaml形式のファイルで配置しておかなければならない。yamlファイル名はモデル名であり、アプリケーション全体で1モデル=1fixutureファイルが基本である。

しかし、アプリケーションが複雑になってくると1モデル=1ファイルですべてのテストケースを網羅するようなテストデータを用意するのが難しくなることがある。そこでテストクラス毎にfixureファイルを分けることでテストケースを網羅するテストデータを用意し易くする。

# 対応

アプリケーション全体で1モデル=1ファイルを一度に読み込むようになっているのを止める。
それぞれのテストクラスで任意のfixtureを読み込むようにする。

# サンプルコード

サンプルでは２つのテストクラス book_test.rb と user_test.rb があり、それぞれのテストクラスでBookモデルのテストデータを別々のfixtureから読み込む。


アプリケーション全体で1モデル=1ファイルを一度に読み込むようになっているのを止める。
通常はtest/fixuresフォルダ以下のfixureファイルを読み込む。

```test/test_helper.r
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'

class ActiveSupport::TestCase
  # ここでfixtureを一度に読み込むようになっているのでコメントアウトする
  # fixtures :all
end
```

このテストクラスでは test/fixtures/book_test フォルダにある books.yaml をBookモデルに読み込むようにする。

``` test/book_test.rb
require 'test_helper'

class BookTest < ActiveSupport::TestCase

  fixture_directory = Rails.root.join("test", "fixtures", "book_test")
  fixture_files = [:books]
  fixture_models = {:book => Book}
  ActiveRecord::FixtureSet.create_fixtures(fixture_directory, fixture_files, fixture_models, ActiveRecord::Base)

  test "テスト" do
    # テストコード
  end

end
```

こちらのテストクラスでは test/fixtures/user_test フォルダにある books.yaml をBookモデルに読み込むようにする。このサンプルでは別のモデルであるUserのfixureも読み込んでいる。

``` test/user_test.rb
require 'test_helper'

class UserTest < ActiveSupport::TestCase

  fixture_directory = Rails.root.join("test", "fixtures", "user_test")
  fixture_files = [:books, :users]
  fixture_models = {:book => Book, :user => User}
  ActiveRecord::FixtureSet.create_fixtures(fixture_directory, fixture_files, fixture_models, ActiveRecord::Base)

  test "テスト" do
    # テストコード
  end

end
```
初めてSlackでBotを作ったので流れを書いておく

##発端
よく「Slackを使って家事を楽にする」という記事をよく見るので、
日々の生活を少しでも楽にしようと思い、この度Slackを始めました。
そこで最初に取り組んだのが、「明日○○のゴミの日だよ」と通知するBotの作成です。
大多数の人は普通にできてしまうと思いますが、自分用のメモとして覚えているうちに流れを書きます。
覚書なのもあり間違いもあると思います。初めての投稿です。よろしくお願いします。
##流れ
1.Slack apiで作業
2.Incoming WeWbhookをインストール
3.googleドライブでスプレッドシートを開いてプログラムを書く
***

####1.Slack api
・「Create New App」を押してアプリ名入力・ワークスペース選択で作成
・「Add Bot User」があると聞いたんですがありませんでした！！
・「https://api.slack.com/docs/oauth 」をひたすら読んだんですが、今見たらBasic Infomationに全部書いてあるんですね。
・「permission pcorpe」を行う
　・Googleカレンダーを見て「明日だよ！」と言うためにはsendだけで十分みたいです。
　・IPアドレス、リダイレクトURLはそれぞれ参考にしたものの通りにしましたが、よく分かっていません！！
・「Install App」が緑になるので押す。slack上にbotが出てくる。
・参考：[「dkrkのブログ　Slack APIでbotを作る1: 設定編」](https://www.dkrk-blog.net/slack/slack_api01)
***
####2.Incoming WeWbhook
・参考：[「Slack Bot：毎朝Googleカレンダーの予定を通知してくる秘書ねこBotの作り方」]
(https://designmemo.jp/creative/bot-googlecalendar-slack.html)
　↑コードもほぼこの通りに書かせていただきました。ありがとうございます。
・Webhook URLを控えておく。
***
####3．スクリプトエディタ編集
``` JavaScript
function myFunction() {
  var list = "";
  var s;

  s = listupEvent("***.google.com"); // a.GoogleカレンダーのID
  if (s != "")  list += "\n■ゴミを出そう！\n" + s; // b.メッセージの見出し
  Logger.log(list);

  if (list != "") {
    var payload = {
      "text" : "こんばんは。明日は、" + list + "を捨てる日だよ。", // c.メッセージの本文
      "channel" : "#ゴミの日", // d.チャンネルの指定
      "username" : "***bot", // f.Botの名前
    }
    postSlack(payload);
  }
}
function listupEvent(cal_id)
{
  var list = "";
  var cal = CalendarApp.getCalendarById(cal_id);
  var events = cal.getEventsForDay(new Date());
  for(var i=0; i < events.length; i++){
    s = "";
    s += events[i].getTitle();
    Logger.log(s);
    list += s + "\n";
  }
  return list;
}
function postSlack(payload)
{
  var options = {
    "method" : "POST",
    "payload" : JSON.stringify(payload)
  }
  var url = "https://****"; // g. Webhook URL
  var response = UrlFetchApp.fetch(url, options);
  var content = response.getContentText("UTF-8");
}
```
・前日夜通知されたかったので、水曜がゴミの日の場合火曜に予定を入れ、予定の設定日が表示されると混乱するため削った。だけであとはコピペです。
・Webhook URL,Googleカレンダーと連携するならカレンダーのIDが必要。
・編集→トリガーの設定で「毎日午後7～8時」とかに設定する。

完成したらGoogleカレンダーに予定入れて実行してみる。
自分が最初間違えていたのは
・bot名が「○○bot」なのに「○○Bot」にしてた
・GoogleカレンダーのIDではなくgmailのメールアドレスを書いてしまった
##やってみた感想
・プログラムの意味を全て理解できていないので、Botができることを増やしていく過程で分かるようにする。
・作っているうちに、Googleカレンダー連携で直接通知する方が楽では？と思ったけどBotに応援されたかった。
・正しくゴミの日登録して前日に調べて「明日です！」と通知するのできるはずだよなーと思いつつ諦めてしまった。
Auto ScalingとOpsWorksの統合

## 参考
https://aws.amazon.com/jp/blogs/devops/auto-scaling-aws-opsworks-instances/

### AWS OpsWorksインスタンスの自動スケーリング

- AWS OpsWorksは、アプリケーションの構成と管理に役立ちます。 EC2インスタンスのグループ（スタックおよびレイヤーと呼ばれる）を作成し、マウントするボリュームや、ライフサイクルイベント（起動/シャットダウンなど）に応じて実行するChefレシピなどの構成に関連付けます。このサービスは、インスタンスのプロビジョニングと管理プロセスを合理化し、ChefとEC2を使用してユニフォームフリートを簡単に起動できるようにします。

#### Auto ScalingとOpsWorksの統合

- Auto Scalingグループ
：このグループは、EC2インスタンスのプロビジョニングとリリースを担当します。

- 起動設定
：Auto Scalingグループがインスタンスを起動するために使用する設定テンプレート。

- OpsWorksスタック
：Auto Scalingグループによってプロビジョニングされたインスタンスは、このスタックに登録されます。

- IAMインスタンスプロファイル
：このプロファイルは、OpsWorksに登録する許可をインスタンスに付与します。

- Lambda関数
：この関数は、OpsWorksスタックからのインスタンスの登録解除を処理します。

- SNSトピック
：このトピックは、Auto Scalingがインスタンスを終了した後に登録解除Lambda関数をトリガーします。

#### 手順
Step 1: Create an IAM instance profile
Step 2: Create an OpsWorks stack
Step 3: Create a Lambda function
Step 4: Create an SNS topic
Step 5: Create a launch configuration
Step 6. Create an Auto Scaling group
Golangのパッケージ周りを整理する

以下のキーワードをあんまり理解できていなかったので調べてまとめた。(随時調べて更新していく)

* コンパイルとビルドの違い
* Golangのパッケージとモジュールとライブラリの違い
* $GOPATH/go/配下のsrc,pkg,binの違い()


# コンパイルとビルドの違い

[ここ](https://qiita.com/tomokichi_ruby/items/e1d52d3f34877389f905)によると

* `コンパイル` = ソースコードをオブジェクトコードに変換すること
* `リンク` = オブジェクトコードをくっつけて一つのバイナリコードにする
* `ビルド` = コンパイル + リンク

# パッケージとモジュールとライブラリの違い

* 同一パッケージのファイルは同一フォルダ`$GOPATH/src/(package名)/`などに含める(1つのディレクトリには1種類のパッケージ定義のみ許容される)。
* 同じパッケージに属するファイルは互いに丸見え。これらはまとめてコンパイルされる。
* main packageに属するファイルに関しては`$GOPATH/src/`配下に直置き。複数ある場合は `go build *.go`でビルド
* 自分のアプリを作る場合は`go mod init (モジュール名)`で始める。



* ライブラリは(main packageを含まない)packageの集まり。ビルドして一つのバイナリになる。

# パッケージのインポート

* $GOPATH/src/配下のパッケージは`import (package名)`で。
* 同プロジェクト内のパッケージは`import (module名).(package名)`で。
* スクリプト内でパッケージ名を省略して関数や構造体を呼び出すには`. import (package名)`で。