OmniAICreator/Qiita-1.07M huggingface dataset:
S&P 500のDaily値を取得する

# [Financial Modeling Prep](https://financialmodelingprep.com/developer/docs)
米国株の株価、会社情報を取得するAPIを提供している

# ソースコード
## URL作成

```python
url = f"https://financialmodelingprep.com/api/v3/historical-price-full/%5EGSPC?serietype=line&apikey={apikey}"
```

### f文字列
フォーマット済み文字列リテラル
変数をそのまま指定できて便利

### S&P 500のsymbol
S&P 500のsymbolは^GSPC

### serietype
serietype=lineを付けないとより詳細な情報を取得できるが(volumeやvmapなど)5年分しか取得できない
serietype=lineを付けるとpriceしか情報はないが、全期間取得できる

## DatetimeIndexのDataFrame作成

```python
response = requests.get(url)
content = response.content.decode()
json_content = json.load(StringIO(content))
df = pd.DataFrame(json_content["historical"])
df.date = pd.to_datetime(df.date)
df = df.set_index("date")
```

### requestsとStringIO
requestsとStringIOを使っているのは
[pandasでread_jsonするときにキャッシュでアクセスする方法](https://qiita.com/n119281656/items/73acbd8b8f033b490372)
のため

### historical
APIで取得できるフォーマットはhistoricalキーに配列形式で与えられているので、historicalをDataFrameにする

### DatetimeIndex化
df.dateをDatetimeIndex化する
pd.to_datetimeに渡せばいい
その後、set_indexでdateをindexにする
apgで覚えやすいパスワードを生成する

普段パスワードはパスワードマネージャに覚えてもらっており（自分はkeepassxで管理している）パスワードはランダムな文字列であれば何でも問題ないのですが、たまにランダムだけど覚えておきたいパスワードが作りたくなる場面があります。例えば、チーム内で共有したいパスワードを生成しなければいけないときです。パスワードのポリシーは結構個人差が出るところで、ランダム過ぎても覚えられないと苦情がくるし、覚えやす過ぎても苦情がくる結構面倒な作業です。

linuxにはパスワード生成用にapgというコマンドがあり、これのデフォルトパスワードアルゴリズムがMorrie Gasser氏によって考案された、発音可能なランダム文字列を生成するアルゴリズムを使ってるようなので、このコマンドにランダムかつ、覚えやすそうなパスワードを生成してもらいます。

## 使用例

```sh
$ apg -m12 -t
idIpwikFiut: (id-Ip-wik-Fi-ut-COLON)
VuHanErtecGa (Vu-Han-Ert-ec-Ga)                                             
nufazVohujIm (nuf-az-Vo-huj-Im)
IbreksOvDafs (Ibr-eks-Ov-Dafs)
yeimFekejquo (yeim-Fek-ej-quo)
ricsobhawoj9 (rics-ob-haw-oj-NINE)
```

何個か候補を出してくます。`-t`で読み方を教えてくれるので、覚えやすそうなパスワードを選びましょう。
Raspberry Pi で MPI3508 タッチスクリーンディプレイの設定

押し入れに入っていた Raspberry Pi をひっぱり出してきてなにかやろうと思ったんだけど取り付けてあるディプレイの種類が分からない。ネジ外して見てみるしか無いかなと思ってたが電源を入れてみたら MPI3508 と出てきた。なんて親切なんだろう。

確かタッチスクリーンなんだけど設定の仕方も分からないがググったら出てきました。

sudo rm -rf LCD-show
git clone https://github.com/goodtft/LCD-show.git
chmod -R 755 LCD-show
cd LCD-show/
sudo ./MPI3508-show

ただそれだけの記事ですw

参照: http://www.lcdwiki.com/3.5inch_HDMI_Display-B
GoでEC2describeinstanceをする


- リージョンを指定しないとだめだった（awsのdefaultのcredentialにセットされていても）
- DescribeInstancesは`err`にあたる部分のエラーハンドリング用の引数を指定しないと怒られた（そういうものなんですか）
    - `./describe.go:32:33: multiple-value svc.DescribeInstances() in single-value context`

```golang

package main

import (
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/awserr"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/ec2"
)

func main() {
	svc := ec2.New(
		session.New(),
		&aws.Config{
			Region: aws.String("ap-northeast-1"),
		})
	input := &ec2.DescribeInstancesInput{
		InstanceIds: []*string{
			aws.String("i-xxxxxxxxxxxxxxxx"),
		},
	}

	result, err := svc.DescribeInstances(input)
	if err != nil {
		if aerr, ok := err.(awserr.Error); ok {
			switch aerr.Code() {
			default:
				fmt.Println(aerr.Error())
			}
		} else {
			// Print the error, cast err to awserr.Error to get the Code and
			// Message from an error.
			fmt.Println(err.Error())
		}
		return
	}
	fmt.Println(result)
}
```
筆ポリゴンデータ（農林水産省）のベクトルタイル化

「筆ポリゴンデータ」（農林水産省）について、小縮尺で概要表示がされるような形でベクトルタイル化をしてみました。

<img width="857" alt="screenshot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102082/25a891c9-8fe0-e207-3bd8-d51492c3527b.jpeg">

- [テストサイト](https://optgeo.github.io/ag)(現在のところ、小縮尺タイルが入っているのは北海道と東北の北側のみです。数日のうちに全国分を入れられると思います。)
- [レポジトリ](https://github.com/optgeo/ag)

# 課題1: ポリゴンをまとめる
国有林野データと異なり、筆ポリゴンデータの場合には筆と筆の間に隙間があり、これをそのままにすると、小縮尺にしたときにデータが大きくなりすぎます。そこで、次の手順で処理をすることにしました。

1. ジオメトリをディゾルブする
2. 一定の幅(D)だけバッファを加えて大きくする
3. 一定の幅(D)だけバッファを戻して小さくする

一度バッファしておいて、同じ量だけ戻すことをすると、小さな隙間は消えてくれます。

なお、 D = 10 で処理をしています。

この処理は、[Rakefile に次の通り実装](https://github.com/optgeo/ag/blob/5dbd826b2235c7160ff0bff9c6b7a8c2ceb07179/Rakefile#L13)しています。

```SQL
SELECT ST_Buffer(ST_Buffer(ST_Union(Geometry), #{D}), -#{D})
```

さらに、 ogr2ogr に次のオプションをつけて、ジオメトリを単純化しています。

```bash
-simplify #{S}
```

なお、 S =5 で処理をしています。

# 課題2: ポリゴンを適宜単純化する
普通にベクトルタイルを生産すると、ベクトルタイルのサイズが大きくなりすぎてしまいます。Tippecanoe のオプションを次のように設定して、単純化やスキップを促しています。

```bash
--drop-polygons --simplification=#{SIMPLIFICATION} -as -ad -an -aN -aD -aS
```

最初、SIMPLIFICATION の値を 10 にして処理をしてみましたが、短冊状の筆が三角形に変換されてしまうことになったので、3 にしています。
Windows Application Driverでsessionを作成時に発生するWindowsDriver<WindowsElement>の引数エラーを回避する方法

#はじめに
WinAppDriverの[公式GitHub](https://github.com/microsoft/WinAppDriver/blob/master/Docs/AuthoringTestScripts.md#testing-a-universal-windows-platform-application)でテストスクリプトの書き方が公開されていますが、公式通りに書いたら引数エラーが発生したので回避方法を書き留めます。

#公式ページ通りにテストスクリプトを書いてみる
[参照](https://github.com/microsoft/WinAppDriver/blob/master/Docs/AuthoringTestScripts.md#testing-a-universal-windows-platform-application)

```c#:UnitTest1.cs
public void TestMethod1()
        {
            DesiredCapabilities appCapabilities = new DesiredCapabilities();
            appCapabilities.SetCapability("app", "Microsoft.WindowsAlarms_8wekyb3d8bbwe!App");
            AlarmClockSession = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), appCapabilities);

            AlarmClockSession.FindElementByAccessibilityId("AddAlarmButton").Click();
            AlarmClockSession.FindElementByAccessibilityId("AlarmNameTextBox").Clear();
        }
```

##new WindowsDriver\<WindowsElement>の引数で下記エラーが発生
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295193/c2d548a9-0040-96fd-2f0f-32e7e62628e4.png)

> 引数 1: は 'System.Uri' から 'OpenQA.Selenium.Appium.AppiumOptions' へ変換することはできません。
引数 2: は 'OpenQA.Selenium.Remote.DesiredCapabilities' から 'System.TimeSpan' へ変換することはできません。

# 解決方法
DesiredCapabilities を　AppiumOptions で代替することができる。

## 修正後コード
```c#:UnitTest1.cs
public void TestMethod1()
        {
            // DesiredCapabilities appCapabilities = new DesiredCapabilities();
            AppiumOptions appCapabilities = new AppiumOptions();
            // appCapabilities.SetCapability("app", "Microsoft.WindowsAlarms_8wekyb3d8bbwe!App");
            appCapabilities.AddAdditionalCapability("app", "Microsoft.WindowsAlarms_8wekyb3d8bbwe!App");
            AlarmClockSession = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), appCapabilities);

            AlarmClockSession.FindElementByAccessibilityId("AddAlarmButton").Click();
            AlarmClockSession.FindElementByAccessibilityId("AlarmNameTextBox").Clear();
        }
```

参考
https://github.com/microsoft/WinAppDriver/issues/529#issuecomment-482426016
解法メモ AtCoder Beginner Contest 027 C - 倍々ゲーム

問題文：[AtCoder Beginner Contest 027 C - 倍々ゲーム](https://atcoder.jp/contests/abc027/tasks/abc027_c)

# 解法

勝敗が決着するところ（$N$近辺）から巻き戻すように考えると分かりやすい。自分の番になった時に$N+1$（以上）だったら勝ち。$N$なら負け。$N-1$より下は、大ざっぱに考えると、2倍して$N$を超えるような範囲なら負ける、それより下の範囲なら勝つ、というように、勝ちゾーンと負けゾーンが交互に存在すると考えられる。自分の番に回ってきた時の$x$を横軸に、最終的な勝敗を縦軸に取ると、下図のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605081/366128dc-1df4-268b-354c-105f076bae09.png)

勝ちゾーンと負けゾーンの下限を求めることを考える。勝ちゾーンの下限を$y_i$、負けゾーンの下限を$z_i$とする（図参照）。まず、$y_0=N+1$。

勝ちゾーンの下限$y_i$から、一つ左の負けゾーンの下限$z_i$を求めることを考える。一手進めると勝ちゾーンに入ってしまう（＝相手が勝つ、自分が負ける）条件は、$2x, 2x+1$のどちらを選んでも、勝ちゾーンの下限$y_i$以上の値になってしまうこと。なるべく$y_i$以上になりたくないので、小さい方の手＝$2x$を選ぶべき。よって、

```math
\begin{align}
2x &\ge y_i \\
x  &\ge \frac{y_i}{2}
\end{align}
```

よって下限$z_i$は以下のとおり（$\lceil \ \  \rceil$は切り上げを表す）。

```math
z_i=\Bigl\lceil \frac{y_i}{2} \Bigr\rceil
```


（切り上げなのか切り捨てなのか+1するのか-1するのか、など混乱しやすいので、式変形だけでここまで導いておくと楽になる、と現在のところ思っています）

次に、負けゾーンの下限$z_i$から、一つ左の勝ちゾーンの下限$y_{i+1}$を求めることを考える。一手進めると負けゾーンに入ることができる（＝相手が負ける、自分が勝つ）条件は、$2x, 2x+1$のどちらかを選べば、負けゾーンの下限$z_i$以上の値になれること。なるべく$z_i$以上になりたいので、大きい方の手＝$2x+1$を選ぶべき。よって、

```math
\begin{align}
2x+1 &\ge z_i \\
x    &\ge \frac{z_i-1}{2}
\end{align}
```

よって下限$y_{i+1}$は以下のとおり。

```math
y_{i+1}=\Bigl\lceil \frac{z_i-1}{2} \Bigr\rceil
```

これで、$y_0$→$z_0$→$y_1$→$z_1$→$y_2$→$z_2$→… と順に計算できるようになった。

後は、スタート時点の値である $1$ が、勝ちゾーンに入っていれば先手の勝ち、負けゾーンに入っていれば後手の勝ちと判定できる。$y_i, z_i$を順に計算するループで、初めて1以下になるのが$y_i$なら先手勝ち、$z_i$なら後手勝ち、とすればよい。

# 感想

切り上げ$\lceil \ \  \rceil$なのか切り捨て$\lfloor \ \  \rfloor$なのか、-1するのか+1するのかしないのか、のあたりで混乱した。解を不等式で求め、それを最後に$\lceil \ \  \rceil$や$\lfloor \ \  \rfloor$などに変換すると混乱しにくいかもしれないと思った。
docker上のDBコンテナからダンプ / リストアする方法

dockerでDBサーバーを2つ建ててレプリケーションの設定をしていました。
で、masterからslaveにDBをダンプして移したかったのですが、調べてもなかなかうまくいかなかったので。


1.ダンプする方法

```shell
docker exec <db_container_id> mysqldump -u root -p<password> <dbname> > dump.sql
```

ダンプって失敗しても特に音沙汰なしと言いますか、エラーがでなくて「できた」と思ったら空っぽだったりします。


```shell
less dump.sql
```

これでそれっぽいデータが入っているか確認したらちょっと安心です。


2.リストアする方法
scpでdump.sqlを一方のサーバーから他方のサーバーに移動させました。
で、他方のサーバーにてリストアをします

```shell
docker exec -i <container_id> mysql -u root -p<password> <dbname> < dump.sql
```


障害対応時にもこういうことをやることって沢山ありそうなのでスムーズにできるようになったら焦らずに済むかなと思います。
DBの復旧ってだいぶやばい事故な気がするのでできればやる機会は訪れないでほしいですが。。。

今度レプリケーションや自動フェイルオーバーについても書きたいです。
Rails Simple Calendarで記事投稿後、カレンダーに反映させたい。

Simple Calendarにて
記事投稿→カレンダー投稿画面(create)→カレンダーに反映という事を行いたいのですが、
現状、記事投稿は出来ていて、そこから記事投稿のタイトルデータを抜き出してカレンダー投稿画面にタイトルのみデータを表示取得させたいです。
<img width="1204" alt="540d264cf48615032c7353a06dffbdf6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662326/e83afb88-370b-9c5d-9856-729f445cfd33.png">
※こちらの画面ではTitleが入力フォームになっていますがこのTitleを、記事のTitleを取得したいです。

試した事ですが
<img width="975" alt="5336e6a17d83d2db786feb63021d995c.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662326/317993c4-0315-4692-2a92-80b72bea40e1.png">

１、 
- @tweets.each do |tweet|
      = @tweet.title
を入力しましたが
<img width="608" alt="d2cf2caa748b7b3ad991e29b02e302bb.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662326/7db8871f-808b-4027-4e40-4c22d815d41f.png">

このようなエラーが出ました。

blog(カレンダー)とtweet(記事)のアソシエーションとして
<img width="424" alt="4c606c184b85049ae3185dc556a08022.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662326/4cd294b9-40c8-a379-fbc6-0847c888306b.png">
<img width="419" alt="025a6b6e9003a3707599aa75945c6d5e.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662326/8cbfdbb1-8f52-c0d7-bbe0-91e255785f24.png">

はこのように組んでいます。

blogのｄｂ(データベース)はこちらになります。

    create_table :blogs do |t|
      t.string :title
      t.text :content
      t.datetime :start_time
 
      t.references :user, foreign_key: true
      t.references :tweet, foreign_key: true
      t.string :tweet_title
      t.timestamps
    end

blog_controllerはこちらになります。

<img width="668" alt="19b8126718b90974d1a4db94d7d11982.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662326/ee115129-1f4d-dfcf-73cc-8ed2d71f6508.png">


記事投稿の際に他のページだとビューの表示は出来ました。
<img width="273" alt="52b32613dc3a1aa18170323ae8d61abe.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662326/af34d8fd-ad55-7aff-2811-2996584d8d9b.png">
<img width="580" alt="db9032b4f568d364a6a228d3c5415f0b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662326/47d736bb-8bbd-5793-0ed6-6a71a6c232b2.png">


ご回答いただければ幸いです。
未熟者ですがよろしくお願いします。
GKEの料金についてのメモ

# GKEの料金についての個人メモ

Number of Zonal clustersとNumber of Regional clustersがよくわからなかったので、備忘録です。

# 料金計算ツール
https://cloud.google.com/products/calculator
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65377/f1c75401-e30c-7054-7950-cd233ffbcff2.png)

## Total # of nodes across all specified clusters
クラスターの数

## Number of Zonal clusters
ロケーションタイプをゾーンにした場合のクラスターの数
ちなみに1クラスターまでは無料みたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65377/2e090197-7637-3a52-e17b-8acc7edf30cb.png)

どこのゾーンにクラスターを展開するかを選ぶ必要があります。

## Number of Regional clusters
ロケーションタイプをリージョンにした場合のクラスターの数
要するにマルチA-Z環境ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65377/13bf0459-2207-55d6-5111-979ceb035581.png)

どこのリージョンにクラスターを展開するか選ぶ必要があります。

## What are these nodes for?
単なるメモ、用途とかを書いとく場所っぽいかな？

## Machine Class
普通にマシンを借りるか、プリエンプティブなマシンを借りるか
プリエンプティブとは使ってないマシンを間借りするようなもので、かなり安いが色々条件がある。
https://cloud.google.com/compute/docs/instances/preemptible

## Machine Family
GCEインスタンスのマシンタイプ
* General purpose / 一般的なやつ
* Compute-optimized / CPU多め
* Memory-optimized / メモリ多め

## Series
GCEインスタンスのシリーズ(CPUの世代)

## Machine type
CPUとメモリの構成
Homebrewのアップデート方法

#はじめに

当方，初めてのQiita記事作成にあたって，練習用にHomebrewのアップデート方法を記載する．

#アップデート方法

ターミナル上で

```
$ brew update
```

と叩けば，アップデートが開始される．

```
$ brew upgrade
```

とすれば，Homebrewとpackageを同時にアップデートしてくれてそう．

#Homebrewのクリーンアップ

```
$ brew cleanup
```

で，使われていないファイルを削除することができる．

#Homebrewの動作確認

Homebrewが正常に動作するかを

```
$ brew doctor
```

で確認することができる．
AZ-103体験記（2020/7/26）

# はじめに
AZ-103（Microsoft Azure Administrator）に合格したため、参考までに合格までのプロセスについてこちらに記しておこうと思います。なお、公式でもアナウンス済みですがAZ-103は今年度（2020年8月31日付）で終了となっており、後継の試験AZ-104が既にリリースされています。試験内容については、ほぼほぼ前身のAZ-103を踏襲した形となっているようです。

# 前提
## 対象読者
・これから新たにAzureの勉強をされる方
・短期間での資格取得をもってクラウドならびにAzureの基礎的な知識を習得し、その先のステップとして実務での経験を見据えている方

## 留意事項
・試験形式や内容等の情報は適宜公式のソースを確認されてください。
・本記事で紹介する外部リソース（特に、「４．過去問対策」で紹介する外部サイト）に関して、情報の信頼性については担保できかねます。参考までに留め、自己の責任の下で利用を検討されてください。

# 学習ステップ
## 概要
１．Azureの概念理解
２．自習環境の構築
３．試験概要の把握
４．過去問対策

## ステップ
### １．Azureの概念理解
私自身は、クラウドの予備知識がほぼ皆無であったため入門版であるAZ-103の下位試験AZ-900を先に受験しました。前提となる概念の理解（クラウドの利用形態、デプロイメントモデル、サブスクリプション、リソースの種類など）がなければ、AZ-103で取り扱う内容のキャッチアップは困難であると考えます。そのため、私同様にこれからクラウドの勉強を開始される方は、まずはAZ-900の取得をターゲットに学習されることを推奨します。

なお、現在MSにて無償のセミナーを開催しており、受講者には通常有償のAZ-900用の無償バウチャーが配布されます。参考までに下記リンクを掲載します。
Microsoft Azure Virtual Training Day:Fundamentals
https://mktoevents.com/Microsoft+Event/186691/157-GQE-382

### ２．自習環境の構築
私もそうでしたが、学習を進める過程で細かな機能や設定内容の確認にあたり、二次資料の内容のみで理解を深めることが困難になるタイミングが訪れると思います。（要は、「習うより慣れろ」ということです。）そのため、無料アカウントを取得して自身の無料サブスクリプションにてIaaS環境を作ってくことをお勧めします。
一か月間のみしかトライアルクレジットが利用できないので、AZ-900の取得が終わってある程度の知識が定着したタイミングの方が、コストが発生するサービスを有意義に活用できると思います。
無料アカウントの詳細や取得方法については割愛しますが、下記に公式のリンクを記します。

Azure の無料アカウントを今すぐ作成しましょう
https://azure.microsoft.com/ja-jp/free/

### ３．試験概要の把握
どういった範囲が取り扱われるかを把握しないまま試験対策に突き進むのは、あまりに無計画で膨大な労力や時間を喪失するリスクが大きいので、出題範囲や割合について確認されることは強くお勧めします。
公式で展開しているSkill Measuredというドキュメントがありますので、こちらに記載されている内容を理解しましょう。

Exam AZ-103: Microsoft Azure Administrator – Skills Measured
https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RE3VwUR

### ４．過去問対策
前段のステップまでで、Azureの概要や試験概要も理解したと想定します。しかしながら、実際にどういう問題が取り扱われるかは学習を進める中で非常に気になるポイントだと思います。いわゆるExam Dumpといった類の情報ソースになります。こちらに関して、本質的な理解が伴わないと思われる方も多くいらっしゃるかと推察します。ただ、先に記している通り、短期間での資格取得をもって必要な基礎的知識を身に着けることをターゲットにしている方には使い方によっては有用な方法の一つであると考えております。加えて、掲載されている問題と解答を照らし合わせながら、求められる根拠を自身で調べることにより、知識の習得が促進されると思います。
繰り返しになりますが、情報の信頼性や利用については、ご自身の責任の下で判断されてください。

EXAMTOPICS
https://www.examtopics.com/exams/microsoft/az-103/view/

# 学習リソース
・Microsoft Learn
https://docs.microsoft.com/en-us/learn/
体系的・網羅的に勉強ができる公式のドキュメントです。

# 所感
私自身の反省にもなりますが、「分厚い参考書を一ページ目から細部にこだわって読み解く」ようなやり方は個人的にはお勧めしません。なぜなら、本業と並行して学習を進める方がほとんどだと思われますが、投資する時間の割にあまり効果が望めないからです。資格取得など二の次で実環境に触れてガシガシ手を使って学習される方々はこの限りではないと思いますが、本記事で対象となるようなあくまで資格取得はファーストステップで細かなサービスや機能についてはおいおい実務で学習する方は、「手っ取り早く試験に合格するために何が求められる」かを主眼に置いて試験に臨んだ方が効率的であると思っております。
Docker Hub1つのリポジトリで複数のimageを管理


## この記事について
個人開発でDocker hubで複数のimageの管理を行おうとしたが、複数のDockerfileの場所を指定する方法がよくわからなかったのでメモ
##ディレクトリ構造
```
.
└── infrastructure
    └── docker
        ├── mysql
        │    └──Dockerfile
        ├── nginx
        │    └──Dockerfile
        └── php
            └──Dockerfile
```

###1.Buildsページを開く
<img width="1253" alt="スクリーンショット 2020-07-26 0.47.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321368/54a8cdfb-e64b-cbe6-163a-da53600ad988.png">

###2.ビルド構成を設定画面を開く
事前にgit hubとの連携をしておきます。
Buildsページの【Configure Automated Builds】ボタンから設定画面に遷移できます。


###３.Dockerfileが設置されているgit hubのリポジトリを設定
git hubの連携をすましているとプルダウンにリポジトリ名が出てきます
<img width="1224" alt="スクリーンショット 2020-07-26 0.54.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321368/58893e81-c6a2-bc2f-c560-19d9a4caeb8f.png">

###4.Dockerfileの場所を指定

Dockerfileのパスを指定。
デフォルトでは1つしか表示されていませんが、BUILD RULESの【+】ボタンを押すことで追加できます。
パスの指定にはDockerfileの存在するディレクトリーではなく、Dockerfileのパスを指定します。
:no_good:　infrastructure/docker/mysql/
:ok_woman:　infrastructure/docker/mysql/Dockerfile

<img width="1210" alt="スクリーンショット 2020-07-26 1.07.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321368/a325a4e5-05c2-118f-0c12-c87af19a92e1.png">
【PHP】aタグで作ったボタンでPOST送信する

##はじめに
PHPのフォームで値を送信する際、aタグで作ったボタンでも送信する方法です。
自分が実装する際に困った箇所もまとめます。

### aタグで送信するメリット
・inputタグにtype="submit"よりデザインの幅が広がる
・他の箇所でも使われているボタンデザインと合わせたいとき。サイト・システム全体でボタンのスタイルや挙動を統一できる。

##ソースコード
**名前**と**メールアドレス**を送信するフォームを例に。

```form.html
<!-- input[type="submit"]で送信-->
<form method="POST" name="input_form" action="">
  <input type="text" name="name" value="">
  <input type="text" name="mail" value="">
  <input type="submit" value="送信する">
</form>

<!-- aタグで送信する-->
<form method="POST" name="a_form" action="">
  <input type="text" name="name" value="">
  <input type="text" name="mail" value="">
  <a href="#" onclick="document.a_form.submit();">送信する</a>
</form>
```
##説明
・aタグに**onclick="document.<font color="Crimson">送信したいフォームのname属性</font>.submit()"**と加えて、submitイベントを実行させる。例だと送信したいフォームのname属性はa_form。

##注意点
・name属性が同じ値のformが存在するときの場合、formのが正しく動かない。（値が送信できない）
Python Set型について

#set型とは？

複数の値を格納できる型のこと。

リスト型との違いは
・重複した要素がない
・明確な順番がない

#使い方

"""
myset1 = set([1,2,3])

print(myset1)

出力
{1, 2, 3}

"""

要素を追加するにはaddを使用します。

myset.add(4)

出力
{1, 2, 3, 4}

削除はremoveを使用します

myset.remove(3)

出力
{1, 2, 4}

すべてを削除するにはclear()を使います

myset.clear()

setが使えると、集合計算が簡単にできます。

・和集合（intersection）
2つのset型オブジェクトの要素を全て持った新しいset型オブジェクトのことを、和集合といいます。

・積集合（difference）
2つのset型オブジェクトの要素で、どちらの集合にも存在している要素のみを持った新しいset型オブジェクトのことを、積集合といいます。

・差集合
2つのset型オブジェクトA,Bの要素で、AからAとBの積集合を削除した要素のみを持った新しいset型オブジェクトを、差集合と呼びます。

・排他的論理和集合
２つのset型オブジェクトA,Bの要素で、AとBで共通した要素以外を足し合わせた新しいset型オブジェクトを、排他的論理和集合と呼びます。
element-uiで特定のコンポーネントが表示されない

どういうわけかrails webpackerではel-table-columnが表示されなかったのですが、ElementUIのバージョンを下げたら動くこと確認。

とはいえ、最新版のElementUIじゃないと動かないコンポーネントもあるので、yarnで複数のバージョンをインストールする荒業でしのぎました。

```
yarn remove element-ui;
```
した後に


```
yarn add element-ui
```

これで最新版がインストールされる
んで、ダウングレード版は

```
yarn add element-ui-2.6.3@npm:element-ui@2.6.3
```

でインストールできた。
使うときは

```
import ElementUI     from 'element-ui-2.6.3'
```
こんな感じ。


8時間くらいハマりました。
D言語+Windows環境で日本語（Shift-JIS）を使ってエラーや文字化けが起きた場合の対処方法

# はじめに

D言語を学び始めた頃に、文字化けでハマったことを思い出しながら、記事にしようと思います。

当時、私は**D言語** に関する記事を読んで **私が求めていた言語仕様はこれかもしれない**、`"Hello World!"`のサンプルを読んで **よし、やってみよう** とチャレンジするものの、すぐに小石につまづくのでした。

# 環境情報

- Windows 10
- dmd v2.099.0

# ソースコードの文字コードについて

`"Hello World!"`はわかったので、次に日本語を表示してみようと思い、次のソースコードを書きました。

```d:sample1.d
import std.stdio;

void main()
{
  writeln("Ｄ言語の世界へようこそ");
}
```

```text:コマンドプロンプト
D:\Dev>dmd sample1.d
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Invalid trailing code unit
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
sample1.d(5): Error: Outside Unicode code space
```

コンパイルすると、めっちゃエラー出るんですけど・・・。

ソースコードの文字コードが`Shift-JIS`だと、このようなエラーが出力されます。
対処方法としては、ソースコードを`UTF-8`で保存すればよいだけです。

# 実行結果の文字化けについて
ソースコードを`UTF-8`にすることでコンパイルエラーはなくなりましたが、コマンドプロンプトで実行すると、文字化けが起きます。
当時、解決方法がわからず、ハマりました。

```text:コマンドプロンプト
D:\Dev>dmd sample1.d

D:\Dev>sample1.exe
・､險隱槭・荳也阜縺ｸ繧医≧縺薙◎
```

# 文字化けの対処方法

## その１ UTF-8→Shift-JISコード変換
`sample2.d`のように実装すれば、`UTF-8`から`Shift-JIS`へのコード変換が可能です。

```d:sample2.d
import std.stdio;

string toSjis(string s)
{
  import std.conv;
  import std.utf;
  import std.windows.charset;
  
  return ( to!string(toMBSz(s)) );
}

void main()
{
  writeln("Ｄ言語の世界へようこそ".toSjis);
}
```
文字コード変換用関数`toSjis`を用意することで、正しく表示されました。

```text:コマンドプロンプト
D:\Dev>dmd sample2.d

D:\Dev>sample2.exe
Ｄ言語の世界へようこそ
```

## その２ コマンドプロンプトの文字コードを変更する
[こちら](https://qiita.com/user0/items/a9116acc7bd7b70ecfb0)の方法で文字化けを回避する手もあります。コマンドプロンプトの文字コードを`UTF-8`に設定するという逆転の発想となります。先ほど文字化けしていた `sample1.exe`が正しく表示されました。
`Shift-JIS`でファイル出力したい等の要望がなければ、この方法もありだと思います。

```text:コマンドプロンプト
D:\Dev>chcp 65001
Active code page: 65001

D:\Dev>sample1.exe
Ｄ言語の世界へようこそ
```

## その３ Windows Terminalを使う
ここまでの対処方法は、当時も思いつきましたが、実はまだ問題があります。
以下のソースコード中の𝓓は `unicode`追加多言語面の文字、あと顔文字もあります。
これらの文字は、通常コマンドプロンプトでは表示できません。

```d:sample3.d
import std.stdio;

void main()
{
  writeln("\x1b[31m𝓓\x1b[37m言語の世界へようこそ😏");
}
```

[Windows Terminal](https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab)を導入することで、これらの問題も解消できます。[エスケープシーケンス](https://qiita.com/PruneMazui/items/8a023347772620025ad6)で文字色も変えられます。

![qiita5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/11b4ebee-b58e-e1bf-9a79-87db617e204d.png)

## その４（番外編）
[オンライン環境](https://qiita.com/devmynote/items/e9d6020fa55a1ac984dd)であれば、特に悩むこともなく表示可能です。
![qiita7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/e4b920ac-3d55-8ff1-2431-efabffe0cea5.png)

# 参考情報

文字コード変換について記事を書きましたので、紹介します。

https://qiita.com/devmynote/items/5bf6b866dc83ca13a33a

https://qiita.com/___uhu/items/9fc09e6aea9939395d74
TkinterのWidget(guiオブジェクト)について -その１.Widget一覧-

##Pythonでwindowsアプリケーション作成したい
Pythonで使いたいモジュールがあって、windowsアプリケーション化しようと色々とguiモジュールを探しておりまして。

色々と調べてみたのですが、HTML+JSで実装するか、VBとかと同じようにWidgetを貼り付けて実装するか。
馴染みのあるVB方式を選択し、実装しました！

※ちなみに、ExcelをGrepするやつを作りました。
→別途、記事書きます。

##TkinterのWidgetについて

参考サイト:
https://docs.python.org/ja/3/library/tkinter.ttk.html#ttk-widget

まず、参考サイトにオブジェクト一覧のドキュメントはあるのですが、画像が少ない・・・。
画像が少ないと、どんな感じで画面を構成できるのかをイメージしにくいんですよね。。。

ってことで、ドキュメントのオブジェクトを実際に並べてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249830/af5fea62-1482-afa5-43d1-2a17bccd1472.png)

並べてみたものの、まだ良く分からないですね。
これから、各Widgetがどんな感じで表現できるかを検証しておきます。


##ソースコード
GitHubで公開しているので、お試しくださいませ。
レイアウトを簡単に配置できる独自フレームワーク「TKinterK」も配布しております。


https://github.com/kinjoarata/python_projects
CentOS 7 selinuxを無効化する

# 目的

- CnetOS7のselinuxを無効化する方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | CentOS 7 (7.8.2003) |
| ハードウェア | Dell Studio 1537 |
| プロセッサ | Intel(R) Core(TM)2 Duo CPU     P8400  @ 2.26GHz |
| メモリ | 4 GB DDR3 |
| グラフィックス | 不明 |

# 前提条件

- 下記、または下記に準ずる方法でCentOS7のPCが構築されていること。
    - [Cent0S7をPCにインストールする](https://miriwo.hatenablog.com/entry/2020/08/09/144030)

# 前提情報

- 特になし

# 読後感

- CentOS7のマシンのselinuxを無効化することができる。

# 詳細

1. 下記コマンドを実行してselinuxの設定ファイルのバックアップを作る。

    ```terminal
    $ sudo cp /etc/selinux/config /etc/selinux/config_org
    ```
1. 下記コマンドを実行してselinuxの設定ファイルを開く。

    ```terminal
    $ sudo vi /etc/selinux/config
    ```
1. 開いたファイル内のSELINUXの部分を下記の様に修正する。(typoするとCentOSのPCが起動しなくなる恐れがあるので注意する)

    ```terminal
    SELINUX=disabled
    ```
1. 保存して閉じる。
1. CentOS7のPCを再起動する
1. 下記コマンドを実行してselinuxの設定値を出力する。

    ```terminal
    $ getenforce
    ```
1. 下記の様に出力されれば設定が完了している。

    ```terminal
    Disabled
    ```
Ethereum Remix IDEのDesktop Appがあるよ！という話

# はじめに
Remix IDEのDesktop Appあるの知らなかった。
そもそも検索して出てくる結果で
「Remix IDEをlocalにinstall & localと同期する方法」
が出てきたけど、立ち上げるのに3コマンドくらい打たなきゃいけないしめんどいな〜

って思ってたら英語のサイトで「Desktop版が発表されたよ！　使って見てね！！！」

みたいな記事があって
やってみたら簡単に入れられたし使いやすそうなので共有

# 動機
ブラウザ版のremixは途中書いてるとブラウザが重くなって止まってしまうことが多くなったので
ローカルに入れようと思った

# Docker, npm, gitで入れようとしたとき
## git
入れようとしたときにaudit fix(?)しろみたいなのたくさん出てきて
怖かったからそっ閉じ


## npm
なんか実行して http://127.0.0.1 でアクセスしても白紙
どうやらバージョンがアレらしい
めんどい

## Docker

入れられたんだけど、
ローカルと同期させたいときにremixdをターミナルで立ち上げないといけないし
Dockerのコマンドいちいち打つの面倒　コンテナ落とし忘れとかいやだし、、、



# remix-desktop
あったこと知らなかった！
これなら標準でremixdが入っていてローカルと同期できてる！
最高！！！！

<img width="1792" alt="スクリーンショット 2020-07-26 0.12.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382669/b0dab8ed-ba1a-843c-f41c-a5ab42fb1618.png">
 

[ethereum/remix-desktop](https://github.com/ethereum/remix-desktop)

ここから最新をダウンロード
↓
[ダウンロードページ](https://github.com/ethereum/remix-desktop/releases/)
自宅でAWS SysOps アドミニストレーター アソシエイト認定試験を受験しました

## 概要
　2020/07/24 AWSのSysOpsアドミニストレータ アソシエイトを受験した。もともとAWSの認定試験は決められた受験会場で受験するのが基本で、自分は島根県松江市在住なのだが県内に受験可能な所はなく、１年半前にソリューション アーキテクト アソシエイトを受験したときには広島市まで受験しに行くために前日入りして受験した。受験費用は１万５千円ほどだったが、交通費宿泊費諸々で合計3万円ぐらいかかったと記憶している。

しかし新型コロナウイルス感染症の影響もあってか、最近になってピアソンVUEでは自宅で受験することも可能になった。辺境の地に住む私にとっては交通費が浮いて助かるし、7月23日から４連休ということもあって、１週間前から準備して受験してみることにした。

## 認定試験を受ける意義

　自分はもともとあまり資格や認定試験に関心が薄い方だと思う。基礎情報も応用情報ももってない。ただ、それらが意味がないと思っているわけではなく、対象分野を全体的に網羅する理解を得るには意味があると思っている。とりわけAWSはIaaSの中でも機能が多く全体像が把握しづらく、把握していれば便利な十徳ナイフのようだが、把握していなければ思わぬところで足をすくわれるリスクもある諸刃の剣と感じており、AWSの認定試験はまさにそういうところを出してくることがあるので、全体像を把握するため、および「思わぬ落とし穴」をできるだけ事前に把握しておきたいという想いがあって受験した。

　ただ、それだけで十分な技術力の証明というわけではなく、最終的には難解な現実の要件に対して最適な設計・運用プロセスを考案し、手を動かせるかどうかがエンジニアとして大切だと思う。あくまで全体像の把握のための受験。

## 受験申請

[AWS認定](https://aws.amazon.com/jp/certification/)のサイトから、「新しい試験の準備」をクリック、「AWS Certified SysOps Administrator - Associate」の「ピアソンVUE」を選択し、試験場所に自宅を選択した。この辺は他の場所での受験と同じ。

## 受験勉強

試験勉強は[AWS Web問題集で学習しよう](https://aws.koiwaclub.com/)で試験勉強した。SOAにも無料で挑戦できる問題がいくつか用意されており、けっこう解きごたえがあったので5000円ほど払って有料会員登録してSOAを全部やった。そのなかで理解していない部分や知らなかった部分はAWSのサイトを読んだ。

## 事前の準備

事前に受験のためのアプリをダウンロードし、動作テストまでは行っておいた。アプリのテストを実行すれば自動的にマイクやカメラなどの動作状況をチェックしてくれる。

## 試験当日

試験を受けるに当たって、まずは外部ディスプレイが禁止されているということで外部ディスプレイを別の部屋にうつした。また、自宅のPCはOSがLinuxだったけど受験できるのはWindowsとMacだけのようだったので、Linuxのパソコンは別の部屋に移動してMacBookProで受験することにした。

あと、念の為に本棚のIT関連の書籍は全て別の部屋にうつしておいた。

時間が来てログインすると、キー番号を要求された。これはピアソンから受信した受験メールのリンクからWebサイトを通してアプリを起動すると自動的に渡されるようだが、自分は直接アプリを立ち上げたために入力を促されて軽く焦った。

続いてスマートフォンでで指定のリンクを開くように指示が書いてあるためそれに従い、iPhoneのSafariでリンクを開く。再び受験キー番号を求められるのでこれを入力し、免許証の裏表の写真を撮影、登録した。この間に何回かはじめの画面に戻って受験番号を入力するように求められたが、入力するとそれまでに登録した写真等は記憶しているようなので最初からやり直しということはない。
画像を撮影・登録したのは運転免許証だけだった。念の為パスポートも用意していたのだが特に求められることはなかった。

## 試験官とのやりとり

　すべて終わって次の手順に進むと、自動的にチャットが立ち上がって英語の挨拶が表示され、そこからは英語の音声でのやり取りになる。自分は英語はからっきしだが、まあなんとなかるでしょと楽観的に構えてたら試験官は結構長い英語をペラペラと喋ってくるのでこれはまずいと思い「Can I use chat?」と渾身のイングリッシュをかましたところ快く「OK！」と返してくれた。チャットももちろん英語だが、ヒアリングよりはよっぽど（自分にとっては）理解しやすいので安心した。
　
　試験官からの要求は２つで、PCのカメラで受験する環境（パソコンデスク）をうつしてくれ、ということと、両手をカメラに移してくれ、ということの２つ。前者はPCを持ち上げてカメラがパソコンデスクに映るようにすればよく、両手はたぶんスマートウォッチをつけていないかのチェックだろうと何処かのサイトに書いてあった。

## 受験後

試験が終わるといくつかのアンケートがあり、終了と同時にあっけないぐらいにすぐ結果が表示される。ただ、この時は結果だけで点数や各分野の正解率などは後日わかる。

ただ、バッジは割と早くから使えるようになった。私のは以下（クリックでAcclaimにジャンプ）
[![AWS-SysOpAdmin-Associate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13835/2d285f01-fa2b-ee77-dea1-e60952792cd8.png)
](https://www.youracclaim.com/badges/2fb33f3e-ebc7-4f42-b795-4a543d9485e1)

## 感想

受験当日の試験官の英語はもうちょっとシンプルかと思ってたけど、（人によるかもだけど）けっこうペラペラと長く喋っておられて、受験者が英語がわかること前提という感じだった。けどチャットにしてくれ〜とお願いすればやってくれるので、私同様英語がダメな人はそうするのがいいかも。
Power Automateで階層が深く同じキーがたくさんあるJSONをなるべく楽に処理する 

Power Automateで、次のように**階層が深く、同じキーがたくさんある**JSONを処理したいとします。※サンプルは[コラボフローのWebhook](https://collaboflow.zendesk.com/hc/ja/articles/360001531055)で送信されるJSONを簡略化したもの。

```json
{
  "contents": {
    "fidCustomerCode": {
      "label": "01",
      "value": "01",
      "type": "text"
    },
    "fidCustomerName": {
      "label": "コラボ建設株式会社",
      "value": "コラボ建設株式会社",
      "type": "text"
    },
  },
  "request_date": "2020-07-25T14:22:51Z",
  "document_id": 1,
}
```

よしっ！とこれを「JSONの解析」にかけると、こんな感じで同じ変数が大量にできてしまいます。
![変数がたくさんできる.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/5886300f-8132-2020-37f7-b826b94ed5a6.png)
使いづらい！てゆうかわからん。
そんな時は、[triggerBody()](https://docs.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#triggerbody)を使って自力でJSONの階層を指定します。

triggerBodyは実行時のトリガーの出力（他システムからWebhookで送信されたデータを「HTTP要求の受信時」で受け取ったとすると、Webhookから送信されたJSON）を返すので、triggerBody()に続けてJSONの階層を指定します。

```
triggerBody()?['contents']?['fidCustomerName']?['value']
```

※JSONにキーが存在しない場合のエラー回避のため、`？`演算子を使ってNULLを返すようにしています。キーが無い場合にアクションをエラーにしたい場合は`？`演算子を使わずにキーを指定します。

実際にフローの設計画面でセットする際は、下記のように「動的なコンテンツの追加」から「式」パネルを選択してtriggerBody()に続くJSON階層を指定します。
![2020-07-27_21h36_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/387e7924-a066-d371-0955-25250f0e4473.png)
これで最初のサンプル内にある「contents.fidCustomerName.value」の値「コラボ建設株式会社」を取得する事ができます。

ちなみに式パネルでtriggerBody()をセットした後の画面ではこんな感じで関数「triggerBody()」が表示されますが・・
![2020-07-25_23h38_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/c86f688b-4133-8530-1e08-ddec4ee63b6c.png)
フローを保存した後再度開くと、このように表記が変わります。
これは表記が変わっただけで、特に動作への影響は無いようです。
![2020-07-25_23h41_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679672/e464f983-cad9-3d94-5582-7ed577e4c429.png)

当方、Power Automate初心者なので、もっといい方法があるのを知らないだけかもしれません。もしいい方法があればどなたか教えてくださると喜びます。
ディレクトリを指定してターミナルを開く方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/df82b903-a1d3-7a12-b991-5b31b7d76d2d.png)

`フォルダに新規ターミナルタブ`

というのがでてくるのでそれをクリック。

そしたら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/7f43b627-8c5a-4373-7242-0bb45a336d44.png)

こうなった！

ちゃんとblogディレクトリ移動してます。
Navigator operation requested with a context that does not include a Navigator.エラーの原因

#はじめに
ページ遷移を実装したかったのですが、以下のエラーに遭遇
原因がcontextの理解にも役立つ内容だったためメモとして残す

Navigator operation requested with a context that does not include a Navigator.

#原因の解明
[参照した記事](https://stackoverflow.com/questions/44004451/navigator-operation-requested-with-a-context-that-does-not-include-a-navigator)
###エラーは何を言ってるか
Navigator operation requested with a context that does not include a Navigator.
直訳：Navigatorを実行する際にNavigatorを含まないcontextを要求しました。

要は、「context内に必要なNavigatorウィジェットがないよ」と言っている

###エラーの原因は何か
Navigator.of(context)が発動すると、対象のcontextからさかのぼって、Navigatorウィジェットを探す

Navigatorウィジェットを含むウィジェットは以下、
MaterialApp
WidgetApp

つまり、Navigator.of(context)の現在地より上にNavigatorウィジェットをもったウィジェットが存在していないとエラーが出る

ちなみに、Navigator.of(context)は「引数に与えた文脈におけるNavigator」の意味
よって、その文脈の中からNavigatorを探さなくてはいけない

#そもそもcontextとは何か
「BuildContext context」と書くことから明らかな通り、contextはBuildContextである
builderで使われるこのcontextにはそれ以前に生成されたウィジェットの情報が入っている（正式にはcontextはElementでWidgetツリーを参照している、という状態らしい）
あるbuilder内で使われるcontextには、そのbuilder以前に作られたWidgetツリーの情報が入っており、そのツリー内の情報にはアクセスできる

#改めて原因を整理
- Navigator.of(context)は、すでに作成されているWidgetツリーの中からNavigatorを探してね、という指示である
- contextはすでに生成されているWidgetツリーの情報である
- すでに生成されているWidgetツリーの中にNavigatorを含むMaterialAppまたはWidgetAppがなかったため、エラーとなった
- 自分の場合、contextには、StatelessWidgetしか含まれていない状態であった

#解決方法
builderを一段階増やして、WidgetツリーがNavigator持つようにすればよい
【Rails】命名規約について

Railsの原則として、**「設定より規約」**がある。モデル、コントローラ、ビューに関するクラス名やファイル名には命名規約(つまり名前の付け方)に決まりごとがある。

コントローラ名を「comments」とした場合のコントローラやビューに関する名前は以下の通りである。

#コントローラの命名規約
|名前       　　　　 |例                 |ルール               |
|:-----------------|:------------------|:-------------------|
|コントローラクラス名    |CommentsController |〇〇Controller、先頭は大文字|
|コントローラファイル名   |comments_controller.rb|〇〇_controller.rb  |
|テンプレートのディレクトリ名|app/views/commnents |app/views/〇〇  |


モデル名を「comment」とした場合の名前は以下の通りである。

#モデルの命名規約
|名前       　　　　 |例                 |ルール               |
|:-----------------|:------------------|:-------------------|
|データベーステーブル名 |comments           |先頭は小文字、複数形にする |
|モデルクラス名　　　　|Comment             |先頭は大文字　　　　　 |
|モデルクラスのファイル名|comment.rb         |〇〇.rb              |


#####※データベーステーブル名に2つの単語からなる名前を付けたいときは、`「shopping_carts」`のようにアンダースコアで単語と単語を結ぶ。この場合、
- コントローラクラス名：ShoppingCartsController
- モデルクラス名：ShoppingCart

#####となる。
SQLiteでReadWrite設定にしてあるのに書き込みに失敗する

タイトルのような問題が発生し、解決したので備忘録として残しておく。

##問題
`Microsoft.Data.Sqlite`を使ってSQLiteの対象のテーブルに書き込みを行う際に、以下のようなExceptionが発生していた。

```
sqlite attempt to write a readonly database
```

データベースのMode設定(`SqliteConnectionStringBuilder.Mode`)は**ReadWrite**に設定済である。

##原因
原因としては、Cacheの設定(`SqliteConnectionStringBuilder.Cache`)の設定が**Shared**になっていたこと。
Microsoftの[Document](https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.data.sqlite.sqlitecachemode?view=msdata-sqlite-3.1.0)をみると以下のような記載がある。

```
Shared : Shared-cache mode. Connections share a cache. This mode can change the behavior of transaction and table locking.
```


おそらく、タスクがこのDatabaseを書き込みしている間はテーブルがロックされてしまう。
そのため、別のタスクが書き込みをしようとした場合に**ReadOnly**とみなされてしまい、上記のようなExceptionが発生したと思われる。

##解決策
Cacheの設定(`SqliteConnectionStringBuilder.Cache`)の設定を**private**にする。
こうするごとにCacheがタスクごとに作成され、テーブルのロックが発生しない。(今のところ)

`Cache=Default`でもよいかもしれないが、Defaultがどのような動作を行うかDocumentに記載がないためひとまずPrivateに設定しておく。
C言語 と Dart で CGI   : はじめに (1)

# C言語 と Dart で CGI

昨今は動的なホームページを作成する場合には、「VPS で Linux インスタンスを立ち上げたり」、「Serverless の フレームワークを利用してコンテンツを配信したり」、「K8Sなどを利用してContainer に落としたり」するのが最近のトレンドだと思います。

が、つい最近まで、レンタルサーバーを借りてCGIを利用して動的コンテンツを配信するのが一般的でした。
この、CGIについて解説して行きます。

## C言語とDart言語からCGIを利用

また、CGIと言えば、Perl や PHP などが、良く使われますが、
ここでは、C言語とDart言語を対象とします。

Dart言語 で CGI に利用した話が、DuckDuckGoしてもGoogleしても皆無だったからです。
※ 訂正: C言語はあります!! Dartが皆無

もちろん、皆無だった理由はクラシックな技術で、
今後、利用される事もなかったからでしょう

## CGIはシンプルで容易

2004-2006年くらいでしょうか? PHP が 広まり、多くのサービスがCGIで作られました。
非エンジニアの人も多く。そんな非エンジニアの方々でも
全体像を把握出来、お金を稼ぐようなサービスが作られて行きました。

昨今の、React Vue Flutter や Firebase た Lambda など　Serverless と比較して
習得が容易だったからだと考えています。


# CGI とは

CGIは、Common Gateway Interface の略です。
https://en.wikipedia.org/wiki/Common_Gateway_Interface
https://tools.ietf.org/html/rfc3875

特にサーバーと外部のプログラムの間での、やりとり方法を決めたものです。
今時のInterface と違い 超シンプルです。


## サーバーからアプリを起動して、実行結果をもらう

CGIでは、サーバーからパラメータを指定してアプリを起動します。
そのアプリが出力する標準出力をを返り値としてもらう。

具体的に見てみましょう。



### Hello,World!! と表示するアプリ
```:hello.c
// hello.c
// gcc hello.c -o hello.cgi
#include<stdio.h>

int main(int argc, char* argv[]) {
    printf("Content-type: text/html\n\n");
    printf("Hello,World!!\n");
    return 0;
}

```

という、hello.cgi という名前のアプリがあるとします。
このアプリは、`./hello.cgi`  とコマンドを入力すると、
"""
Content-type: text/html

Hello,World!!
"""
と、コンソールにも文字列を表示するだけのアプリです。

### Hello,World!! と表示するページになる

ブラウザーから、 "http://example.com/hello.cgi" を呼び出すと、
"Hello,World!!" とブラウザーに表示されます。

このように、サーバーからアプリを呼び出して
アプリからの出力をユーザーに返すという事がCGIでは出来ます

## 実際に動かしてみよう

Docker 環境を用意しました。
細かな設定とかはDockerファイルを参照してください!!


### Container を起動
```
$ git clone https://github.com/kyorohiro/dartlang_cgi.git
$ cd ./dartlang_cgi/001
$ docker-compose build
$ docker-compose up -d
```

#### VSCodeを起動

ブラウザーでDocker Container の 中の VSCode を開く
http://127.0.0.1:8443 
※ 127.0.0.1 は　Dockerの環境依存です。


#### vscode の中で、Apacheサーバーの立ち上げ

```
$ apache2
```


#### cgiをビルド

```
$ cd /app/www/cgi
$ gcc hello.c -o hello.cgi
$ dart2native hello_dart.dart -o hello_daet.cgi
```

#### 動作確認

http://127.0.0.1:8080/ を開くと、 ./app/www/index.html　が表示されます

http://127.0.0.1:8080/cgi-bin/hello.cgi を開くと。./app/cgi/hello.cgi の実行結果が返ります

http://127.0.0.1:8080/cgi-bin/hello_dart.cgi を開くと、 ./app/cgi/hello_dart.cgi の実行結果が返ります


# 補足
Dart は dart2native を利用する事で、Nativeにコンパイル出来ます。
今回はそれを使用しています。

```
main(List<String> args) {
  print("Content-type: text/html\n\n");
  print("Hello,World From Dart!!\n");
  return 0;
}
```

## コード
https://github.com/kyorohiro/dartlang_cgi


# 次回

GET や POST や Cookie や
DB を扱ってみます。
PythonでJPG/PNG→PDF変換

## お題

オタ活に勤しんでいる娘がダウンロードした推しの画像をローソン等でプリントしてポスターやらウチワやら缶バ[^1]やら作るのにいちいち変換してくれるサイト[^4]でPDFに変換しているようです。そんな面倒なことをせずとも[前回](https://qiita.com/Since1967/items/71ec8ecbd7a41ed86f14)のように自分のPCだけで完結するやんという話をしましてまた別のコンバータを作ることになりました。
今回はJPG/PNG→PDF変換になります。
尤もわざわざPDFに変換したものをマルチコピー機で[PDFプリント](https://www.lawson.co.jp/service/others/multicopy/#pdf)しなくても自宅PCから[ネットワークプリント](https://www.lawson.co.jp/service/others/multicopy/#network)で先にアップロードだけしておけばいいようなものですが、PDFプリントのA3カラーは80円でネットワークプリントのA3カラーは100円なのです。また、ネットワークプリントではJPGとPDFは印刷可能ですがPNGはダメなようです。

## 開発環境

- OS:Windows10Home(1903)
- Editor:Visual Studio Code
- Python:3.8.3

## 調べてみた

「python jpg pdf」でググるとどうやらimg2pdfというライブラリを使えば変換できるらしいので早速導入。

```Text
> pip install img2pdf
```

また、画像を扱うためPIL(Python Imaging Library)も必要なので調達。

```Text
> pip install pillow
```

なぜpillow(枕)なのかは不明。

## コード

```Python:Image2PDF.py
import sys
import os
import img2pdf
from PIL import Image

def RemoveAlpha(src):
    dstPath = os.path.dirname(src)
    dstName = os.path.basename(src)
    dstPNG = os.path.join(dstPath, "_" + dstName)
    img = Image.open(src)
    img = img.convert("RGB")
    img.save(dstPNG)

    return dstPNG

if __name__ == "__main__":
    srcOrgImage = sys.argv[1]
    print(f"IN:{srcOrgImage}")

    srcExt = os.path.splitext(os.path.basename(srcOrgImage))[1]
    dstPath = os.path.dirname(srcOrgImage)
    dstName = os.path.splitext(os.path.basename(srcOrgImage))[0]
    dstPdf = os.path.join(dstPath, f"{dstName}.pdf")
    print(f"OUT:{dstPdf}")

    if srcExt.upper() == ".PNG":
        srcImage = RemoveAlpha(srcOrgImage)
    else:
        srcImage = srcOrgImage

    with open(dstPdf, 'wb') as f:
        f.write(img2pdf.convert(srcImage))

    if srcOrgImage != srcImage:
        os.remove(srcImage)
```

構想としては前回と同じようにデスクトップ上のショートカットに変換したいファイルをD&Dすると同じフォルダに.pdfを生成するものです。今回もパス周りの処理が延々とあってヤボったいですが。
いくつかの画像ファイルの変換を試していると.jpgでは問題ありませんでしたが.pngファイルの場合にアルファチャンネルを含んでいるPNGはPDFに変換できないとエラーになったのでRemoveAlpha()でRGBA→RGBとして一時ファイルに保存、それを入力ファイルとしてPDF変換させています。

## 運用

で、今回も起動用のバッチファイルを用意してめでたし。

```:Image2PDF.bat
@echo off
py Image2PDF.py %1
```

## だがしかし・・・

前回の続きになりますがフォルダ名・ファイル名に全角スペースが含まれている場合にD&Dで正しいフルパスが取得できない問題。調べてみると全角スペース以外にもアウト判定な文字があるようです。例えばちょっと細工して

```Shell:argvTest.bat
@echo off
py argvTest.py %1 %2 %3 %4 %5 %6 %7 %8 %9
```

```Python:argvTest.py
import sys

if __name__ == "__main__":
    len = len(sys.argv)
    print(f"len={len}")

    for i in range(len):
        print(sys.argv[i])
```

これに「C:\Tmp\aaa　bbb　ccc.txt」(全角スペース入り)を喰わせると

```Shell
len=3
argvTest.py
C:\Tmp\aaa
bbb
ccc.txt
```

となるのでぶった切られた文字が全角スペースとわかっているのであればargv[1]以降を最後まで全角スペースを挟んでjoinしてやればなんとかできそうですが、ぶった切られる文字の候補が複数あってしかもその情報はもう失われているので復元は無理かなと。
でもこれが今回のようにバッチファイル経由で動かすPythonではなく.exeのショートカットに対してD&Dすると特にぶった切られることなく一つの文字列として取得できます[^2]。
つまりWindowsのコマンドプロンプト[^3]がイケてない？ですかね。

[^1]: 缶バッジ
[^2]: .exeと言えど上記Python版と同様にバッチファイルから呼び出すと同じ結果になります
[^3]: cmd.exe
[^4]: [Canva](https://www.canva.com/ja_jp/)とか
centosでマウントエラー(mount error(13): Permission denied)

# centosでマウントエラー(mount error(13): Permission denied)

今まで問題なくmountできていたが、何かをきっかけにエラーに。

```bash
$ sudo mount -t cifs -o 'username=apuser@example.com ....(以降、略)
mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
```

今まで、usernameにMicrosotアカウント（メールアドレス）を指定していたが、このドメイン部が、どうもdomain=で指定しなくてはいけなくなったらしい。

修正前

```bash
$ sudo mount -t cifs -o 'username=apuser@example.com ....(以降、略)
```

修正後

```bash
$ sudo mount -t cifs -o 'username=apuser,domain=example.com ....(以降、略)
```
Scrapy で画像ファイルをダウンロードする方法

# 目的
Scrapyで画像ファイルをダウンロードする方法を最低限の実装で実現する方法を記載する。

# 使用する言語、ソフトウェア
* Python3系
* Scrapy 1.73
* pillow
* boto3 ※ファイルをS3に保存する場合のみ必要

# 処理概要
ダウンロード対象が、画像か画像以外で使用する機能（Item）が異なるが、大筋は同じ。
また、ファイル保存先をローカルはもちろん、FTP、S3、Google Cloud Storageも指定が可能。

# 残課題
画像ファイル名がURLのハッシュ値（sha1）であるため、
ページごとに画像をまとめたいなどは下記ソースコードのみではできない。

# ソースコード

画像ダウンロードにつかうItemsを作成。

```python:items.py
class ScrapyImageItem(scrapy.Item):
    image_urls = scrapy.Field()
```

クローリング用Spiderを作成。
クローリングしたページ上にあるJPG画像URLを抽出し、Itemに画像URLを設定する。

```python:spiders/image_dl.py
class ImageDlSpider(scrapy.Spider):
    name = 'image_dl'
    allowed_domains = ['exmaple.com']
    start_urls = ['https://exmaple.com/']

    def parse(self, response):
        image_url = [x for x in response.xpath('//img/@src').extract() if x[-4:] == '.jpg']

        item = ScrapyImageItem()
        item['image_urls'] = image_url

        yield item
```

画像ダウンロードするためのPipeline、画像を保存するためのディレクトリを設定する。

```python:settings.py
# パイプライン
ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 1
   # 'ScrapySample.pipelines.ScrapysamplePipeline': 300,
}

# 保存ディレクトリ
IMAGES_STORE = "/tmp/img/"

# ダウンロードする画像のサムネイル設定
IMAGES_THUMBS = {
   'small': (100, 100),
   'big': (200, 200),
}
```

以上の設定後、Spiderを実行することでクローリング先にあるJPG画像を **IMAGES_STORE** ディレクトリに格納される。
【GAS初心者】macth関数である文字を含んでいるかを調べる(GAS)


　データを取得した後に、「XXXという文字列を含んでいるか？」で分岐をさせることがあったので、メモとして残します。

結論
-------------
**文字列.match( /"text"/ )**を使う。

実際には、このように使用します。

```
function myFunction() {

　var text = ‘柴犬’

　if ( text.match(/"検索したい単語"/)) {
　　Logger.log("検索したい単語が含まれています：" + "text");
　} else {
　　Logger.log("検索したい単語が含まれていませんでした：" + "text");
　}
}
```
Spring Boot で TextWebSocketHandler を継承したクラスで Autowired したフィールドが NULL になる

#1.環境

Spring Boot：v2.2.5

#2.困ったこと

Spring Boot でチャット機能を作成するため、WebSocket を利用。

TextWebSocketHandler を継承したクラスを作成し、その中で DB にアクセスするためにリポジトリクラスを Autowired しようとしたが、フィールドに宣言したリポジトリクラスの変数が NULL。

以下が TextWebSocketHandler を継承した WebSocketChatEndpoint クラス。


```java:WebSocketChatEndpoint.java
@ServerEndpoint("/api/chat")
@Component
public class WebSocketChatEndpoint extends TextWebSocketHandler {

  @Autowired
  private ChatRepository chatRepository; //NULL

  @OnOpen
  public void onOpen(Session session) {
  …略
```


実行時、chatRepository が NULL。

#3.対応

フィールドインジェクションをセッターインジェクションに変更。

```java:WebSocketChatEndpoint.java
@ServerEndpoint("/api/chat")
@Component
public class WebSocketChatEndpoint extends TextWebSocketHandler {

  private static ChatRepository chatRepository; //Autowiredされてる

  @Autowired
  public void setChatRepository (ChatRepository chatRepository ) {
        WebSocketChatEndpoint.chatRepository = chatRepository;
  }

  @OnOpen
  public void onOpen(Session session) {
  …略
```

コンストラクタインジェクションは試してません。
＜ドキュメント基礎編＞ドキュメントを生成/取得/編集(GAS)

本記事では、googleドキュメントで使用できるコマンドの基礎編として、
ドキュメントの生成、取得、編集などのコードを記載する。


1. ドキュメントの新規作成、取得
-------------


ドキュメントを作成する(.create)
-------------

       DocumentApp.create(ファイル名)


ドキュメントを指定して取得する(.openByID)
-------------

       DocumentApp.openByID(ドキュメントID)

このIDは、ドキュメントのURLの末尾部分に当たる英数字です。

具体的には、
「https://docs.google.com/document/d/XXXXXXXX(/edit)」
のXXXXXXXX部分がドキュメントIDになります。


指定のフォルダに新規Googleドキュメントを作成する
-------------

```
  var folder = DriveApp.getFolderById("folderId");  //フォルダIDを指定
  var doc = DocumentApp.create("新規ドキュメント名"); //ドキュメントを新規作成
  var docFile = DriveApp.getFileById(doc.getId()); //ドキュメントIDを取得
  folder.addFile(docFile); //フォルダーにファイルを追加する
```

2. ドキュメントの編集
-------------

ページ区切りを入れる(.appendPageBreak)
-------------
```
Document =  DocumentApp.openByID(ドキュメントID)  //ドキュメントをID指定（前述）
Document.appendPageBreak();//ページ区切りを入れる
```

ドキュメントの末尾に段落を追加する(.appendParagraph)
-------------

```
Document =  DocumentApp.openByID(ドキュメントID)  //ドキュメントをID指定（前述）
Document.getBody()appendParagraph("text");//段落を追加する
```

現在のカーソル部分にテキストを挿入する(.insertText)
-------------
```
Document =  DocumentApp.openByID(ドキュメントID)  //ドキュメントをID指定（前述）
Document.getCursor().insertText(text);
```


#＜番外編＞
ここからは、もっと便利になりそうな機能をメモとして記載します。
メニュータブを作る(onOpen())
-------------

以下の記事が参考になります。
[「Google Apps Scriptで議事録テンプレ作成を楽にした」](https://qiita.com/wiroha/items/5ce99d7bfc56e3270be6#document%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)
（「Documentに実行メニューを追加する」）
ボイス・コッド正規形（BCNF)について

#この記事について
BCNFをちょっと勉強したので、自分のためにもまとめます。

#ボイス・コッド正規形（Boyce–Codd normal form）を使う理由
稀に第３正規形まで正規化しても更新異常が起こる場合がある。

#BCNFを使う例
例えばこう云う第３正規化までされた表があるとする。

| 学生ID | 教科 | 先生 |
|:-:|:-:|:-:|
|100|Java|高橋|
|100|Python3|田中|
|101|Java|伊藤|
|102|C#|鈴木|

ただし、

- 一人の学生は複数の教科を受講できる
- 各先生は一つの教科を担当する
- 同じ教科を複数の先生が教えることがある

とします。この条件下では、以下のような時に更新異常にぶつかります。
**学生ID = 100 の学生がJavaの履修をやめた時、高橋教授がJavaを担当しているという情報が失われる。**

#BCNFを使う
前述の表では

- 主キーの{学生ID, 教科}の組み合わせで先生が一つに決まり、
- 先生が決まれば教科が決まります。

この２つ目の
先生→教科
ですが、これが更新異常を起こしている原因です。

なので、

| 学生ID  | 先生ID |
|:-:|:-:|
|100|1|
|100|2|
|101|3|
|102|4|

と

| 先生ID | 先生 | 教科 |
|:-:|:-:|:-:|
|１|高橋|Java|
|２|田中|Python3|
|３|伊藤|Java|
|４|鈴木|C#|

に表を分ければ大丈夫です。

#BCNFの定義
BCNFの定義は以下の通りです。

>A→Bを表の任意の関数従属性としたとき、次のいずれかが成立する。

>- A→Bは, 自明な関数従属性である。
>- 決定項のAは, スーパーキーである。

（データベーススペシャリストより）
つまり先生→教科について、
この関数従属性は自明でない（教科は先生の部分集合じゃない）し、
先生はスーパーキーではないことからも、BCNFでないことはわかります。

#第３正規形の定義
一方で、第３正規形の定義は以下の通りです。

>A→Bを表の任意の関数従属性としたとき、次のいずれかが成立する。

>- A→Bは, 自明な関数従属性である。
>- 決定項のAは, スーパーキーである。
>- Bが候補キーの一部である。

（データベーススペシャリストより）
先生→教科を見ると、教科はキー属性なので、第３正規形であることがわかります。

#BCNFと第３正規形の違い
それは**関数従属性が保存されない**ことです。

上で表を分けた際、
{学生ID, 教科}の組み合わせで先生が一つに決まる
という関数従属性が消えました。

#参考文献

- 山本森樹『2020 データベーススペシャリスト「専門知識+午後問題」の重点対策』株式会社アイテック, 2019年
- Boyce-Codd Normal Form (BCNF) | Database Normalization | DBMS（https://youtu.be/NNjUhvvwOrk）
Railsのdatabase.ymlの見慣れない記号について調べた

###postgreSQLの設定したが何を書いてるかわからなかった
postgreSQLの環境設定を行う際に何を書いているのかわからなかったので
解説していきます。
実際のコードがこちらです

```database.yml
default: &default 
  adapter: postgresql
  encoding: unicode
  # 追記部分（postgresqlイメージで設定されているdefault）
  host: kensuke_db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default 
  database: app_name_development

test:
  <<: *default 
  database: app_name_test

production:
  <<: *default 
  database: app_name_production
  username: app_name
  password: <%= ENV['APP_NAME_DATABASE_PASSWORD'] %>
```

&default はアンカーと呼ばれ
*default というエイリアスが使えるようになるらしい。
<<: この記号で呼び出している。

つまり最初のdefaultに書くことでほかの部分にも反映されるということ！

####こちらの記事を参考にさせていただきました！
https://qiita.com/terufumi1122/items/b5678bae891ba9cf1e57
テキストレイヤーの改行をカウントする

##テキストレイヤーの中身の改行コードが違った
`\n`で改行をカウントしようとしたところ全然判定されず、小一時間悩んで調べまくった結果、環境によって改行コードが混在している事が判明。
試しに`\r`で判定してみたところ無事カウントされたので、参考になれば。
環境：Windows10, AE2019
[参考サイト](https://sites.google.com/site/aescriptingreference/home/tips/tekisutofairu-chu-li-shino-gai-xingkodo)
##サンプルコード
```JavaScript:
var myComp = app.project.activeItem;
var myLayer = myComp.selectedLayers[0];
var myText = myLayer.property("ADBE Text Properties").property("ADBE Text Document").value;
var Text = myText.toString(myText);
var result = Text.match(/\r/g);
if (!(result === null)) {
  alert(result.length);
} else {
  alert("Nothing");
}
```
![AE_Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680671/848b7645-8b7b-ac3e-015e-295143fc2cc3.png)
##注意点
スクリプトからエクスプレッションを書き込むなら判定のための改行コードは`\\r`で記述する。
（バックスラッシュ1回だとエクスプレッション中の改行として認識されるため）
PythonでM-SOLUTIONS プロコンオープン 2020のCを解く

### はじめに
おひさしぶりです。今回はA,Cの二完でした。
今回はC問題の解説を書きます。

### [C - Marks](https://atcoder.jp/contests/m-solutions2020/tasks/m_solutions2020_c)

**考えたこと**
最初はふつうに評点を計算していましたが、さすがに数が大きくなりすぎてTLEしました。
ですので少し頭を使います。

この問題で聞かれているのは各学期間の大小だけです。また、学期ごとの評点の計算方法は直近$K$回の積なので、i学期の成績は$a_{(i-k)}*a_{(i-k+1)},\cdots,a_{i-1}$と書けます($i\geq k$)。ここで、$i+1$学期の評点は$i$学期の評点を$a_{(i-k)}$で割って$a_i$を掛けた値です。つまり、各学期間の大小を比べるだけなら、全ての積を計算しなくても各学期の最初と最後の大小関係を比べればよいことになります

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

f = 0
for _ in range(n-k):
    if a[f] < a[f+k]:
        print('Yes')
    else:
        print('No')
    f += 1
```

### まとめ
自分の力不足を感じました。もっと精進しなければ。ではまた、おやすみなさい。
[Rails][IRB][Pry]SourceAnnotationExtractor is deprecated 解決法



# 起こったこと

`Rails6` で `binding.pry` など`IRB` で `Tab` 補完しようとすると

以下のようなエラーが出る。
(Warining だけど見づらい。)

```

[WARN ] DEPRECATION WARNING: SourceAnnotationExtractor is deprecated! 
Use Rails::SourceAnnotationExtractor instead. 
(called from new_card at /home/user/dev/rails/test-proj/app/controllers/app_controller.rb:36)

```



# 解決法

とりあえず
以下のパッチを `config/initializers` に置く。


``` config/initializers/active_support_backports.rb
# Fix IRB deprecation warning on tab-completion.
#
# Backports the fix for https://github.com/rails/rails/issues/37097
# from https://github.com/rails/rails/pull/37100
#
# Backports proposed fix for https://github.com/rails/rails/pull/37468
# from https://github.com/rails/rails/pull/37468
module ActiveSupportBackports

  warn "[DEPRECATED] #{self} should no longer be needed. Please remove!" if Rails.version >= '6.1'

  def self.prepended(base)
    base.class_eval do
      delegate :hash, :instance_methods, :respond_to?, to: :target
    end
  end
end

module ActiveSupport
  class Deprecation
    class DeprecatedConstantProxy
      prepend ActiveSupportBackports
    end
  end
end
```


# 参考

https://github.com/rails/rails/issues/37775