OmniAICreator/Qiita-1.07M huggingface dataset:
javascriptを使って簡単な計算機を作る 入門者向け

#計算機を作る

##きっかけ
Udemyで学んだばかりの知識をアウトプットするため

###Udemy
Udemy
ウェブ開発入門完全攻略コース - プログラミング をはじめて学び創れる人へ！未経験から現場で使える開発スキルを習得！
https://www.udemy.com/course/web-application-development/

主にセクション9(Javascript入門)及びセクション10(Javascript DOM操作)の知識

##ざっくりとした構想
テキスト入力計算機（今回は足し算のみ）を作る
２つの数値入力欄を作成し、入力された値を取得
取得したのちに、足し算を行う処理を書き
結果をli要素としてul要素に追加していく

##完成物(スクリーンショット)
<img width="548" alt="スクリーンショット 2020-07-14 21.46.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662094/68a1944a-57d7-f200-9aec-8e329cb4a8b2.png">

二つのテキストボックスに数値を入力し、計算ボタンを押すと足し算が行われ、上のスペースに計算結果を表示している。

##サンプルコード
```html:addtion.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>jsを使って足し算</title>
  </head>
  <body>
    <ul id="lists"></ul>
    <input id="number1" type="text">
    <span>+</span>
    <input id="number2" type="text">
    <input id="calculate" type="button" value="計算">

    <script src="js/addtion.js"></script>
  </body>
</html>
```

```js:addtion.js
document.getElementById('calculate').onclick = function () {
  var li = document.createElement('li');
  var number1 = parseFloat(document.getElementById('number1').value);
  var number2 = parseFloat(document.getElementById('number2').value);

  var result = document.getElementById('calculate').textContent = number1 + number2;
  var number = document.createTextNode(result);

  li.appendChild(number);

  var lists = document.getElementById('lists');
  lists.appendChild(li);
};
```

##参考サイト
[\<input type="text">で数値のみ入力する方法](https://confrage.jp/input-typetext%E3%81%A7%E6%95%B0%E5%80%A4%E3%81%AE%E3%81%BF%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)

[Javascriptの積の計算結果が出て来ません](https://teratail.com/questions/99443)

[Javascript MDN:parseFloat()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseFloat)

##今後の構想
０〜９までの数字ボタンで数値を入力する機能と四則計算が行える計算機を作る
一気に作ると大変なので、次回は引き算機能追加など、少しずつ機能を追加していく。
DBeaver 設定のバックアップ（Mac）

接続情報とパスワード情報のファイル
DBeaver 7.1.2

フォルダ

```bash
/Users/[ユーザ名]/Library/DBeaverData/workspace6/General/.dbeaver
```

ファイル

```bash
credentials-config.json
data-sources.json
```
簡単レシート印刷 receiptline で文字装飾してみた

日本発のオープンソース receiptline でレシート印刷に少しずつトライしています。
まだレシートプリンターがないので、[前回](https://qiita.com/dopperi46/items/aa866955d24cd9d723b3)セットアップした開発ツールを引き続き使います。
今回は文字装飾です。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/5c0e411b-7fe2-ead0-7612-4d34cae7d498.png)

# 文字装飾の種類

文字装飾は 4 種類。
アイコンは左から、アンダーライン、強調、白黒反転、拡大です。
クリックすると文字装飾記号を挿入します。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/36a4e560-7dc4-e794-5011-d5034af78ece.png)

キーボードで文字装飾記号を直接入力しても OK。
`_` はアンダーライン、`"` は強調、`` ` `` は白黒反転、`^` は拡大です。

# 装飾の開始

文字装飾記号を挿入すると、それ以降の文字が装飾されます。

```text:ReceiptLine
_hello, world!
"hello, world!
`hello, world!
^hello, world!
```

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/8acd32d3-6598-f1c2-a802-eb32a2a5f060.png)

# 装飾の範囲

同じ文字装飾記号で囲むと、その範囲にある文字が装飾されます。

```text:ReceiptLine
_hello_, world!
"hello", world!
`hello`, world!
^hello^, world!
```

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/23be9197-d44b-c75d-da87-448cb59e0709.png)

# 装飾の組み合わせ

文字装飾を組み合わせることができます。
範囲を入れ子にしなくても大丈夫。

```text:ReceiptLine
"`hello", world!`
```

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/5cc32003-5d51-9f3e-ee38-b9b7b07ab73c.png)

# 拡大いろいろ

拡大文字装飾記号を重ねると、さらに大きな文字になります。

```text:ReceiptLine
hello
^hello
^^hello
^^^hello
^^^^hello
^^^^^hello
^^^^^^hello
^^^^^^^hello
```

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/c1143a38-fdf8-920b-fbd2-b9da7644473a.png)


# 装飾記号の出力

文字装飾記号の前に `\` を付けると、普通の文字になります。

```text:ReceiptLine
\"hello, world!\"
```

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/75014dd8-a95e-20ab-5aa5-c2ba130bda3b.png)

# 水平線と用紙カット

普通の文字装飾とは少し違うものもあります。
アイコンは左が水平線、右が用紙カットです。クリックすると記号を挿入します。

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/1bac8f15-0027-d8cf-ff09-37adedc66aed.png)

`-` は水平線、`=` は用紙カットです。キーボードからの直接入力もできます。
これらの特殊記号は、1 行に他の文字と混在しないときに有効です。

```text:ReceiptLine
hello, world!
---
hello, world!
===
hello, world!
```

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/e9ed87f5-6ea2-29bb-67b1-e3d460b7e8d4.png)

次回は位置揃えを試してみようと思います。
Kinx ライブラリ - JIT コンパイラ・ライブラリ（番外編）

# Kinx ライブラリ - JIT ライブラリ（番外編）

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。今回は JIT ライブラリ番外編です。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。  

[ここ](https://qiita.com/Kray-G/items/a237f195630f3f0a91df) で紹介した JIT ライブラリに新規追加した機能です。

[JIT ライブラリ](https://qiita.com/Kray-G/items/a237f195630f3f0a91df) に任意のバイナリコードを実行できる機能を追加してみました。本気で細かく制御したい人向けです。こちらはがっつりアーキテクチャ依存です。そして、クラッシュさせるのも簡単です。

## サンプル

まずはサンプルです。

```javascript:okay.kx
using Jit;

var code
    = System.PLATFORM == "X86_64-WIN" ? <0x48, 0x89, 0xc8, 0xc3>    // mov rax, rcx | ret
    : System.PLATFORM == "X86_64"     ? <0x48, 0x89, 0xf8, 0xc3>    // mov rax, rdi | ret
    : null;
if (code.isBinary) {
    Jit.dump(code);
    var runner = new Jit.Runner(code);
    System.println(runner.run(100));
}
```
```
$ ./kinx okay.kx
       0:   48 89 f8                                    mov rax, rdi
       3:   c3                                          ret
100
```

さて、引数で与えた数値を単に返すだけの関数で、破壊するレジスタも無いのでプロローグもエピローグもなく、第一引数に来た値を復帰値（`rax`）に設定して `ret` するだけのものです。

### `System.PLATFORM`

`System.PLATFORM` で x64 でかつ Windows か Windows ではないかを切り分けてます。生のアセンブラだとこうやって切り分けないといけないのが面倒ですね。しかし、**何でもできる** という危険で甘い香りのするメリットを存分に享受できます。

Windows だと Microsoft 呼び出し規約に基づくので第一引数は `rcx` レジスタに入ってきます。それに対し、ほぼほぼマイクロソフト以外が採用している System V 呼び出し規約では `rdi` レジスタに第一引数が入ってきます。

`System.PLATFORM` で具体的には何が返るかというと...

|       Value        | Window? |
| ------------------ | :-----: |
| `"X86_32-WIN"`     |    O    |
| `"X86_64-WIN"`     |    O    |
| `"ARM_THUMB2-WIN"` |    O    |
| `"ARM_V7-WIN"`     |    O    |
| `"ARM_V5-WIN"`     |    O    |
| `"ARM_64-WIN"`     |    O    |
| `"X86_32"`         |         |
| `"X86_64"`         |         |
| `"ARM_THUMB2"`     |         |
| `"ARM_V7"`         |         |
| `"ARM_V5"`         |         |
| `"ARM_64"`         |         |
| `"PPC_64"`         |         |
| `"PPC_32"`         |         |
| `"MIPS_32"`        |         |
| `"MIPS_64"`        |         |
| `"SPARC_32"`       |         |
| `"TILEGX"`         |         |
| `"UNSUPPORTED"`    |         |

です。

## やってはいけないこと

```javascript:crash.kx
using Jit;
var code = <0x48, 0x31, 0xc0,   // xor rax, rax
            0x48, 0x8b, 0x00>   // mov rax, [rax]
            ;
Jit.dump(code);
var runner = new Jit.Runner(code);
System.println(runner.run());
```
```
$ ./kinx crash.kx
       0:   48 31 c0                                    xor rax, rax
       3:   48 8b 00                                    mov rax, [rax]
Segmentation fault (core dumped)
```

ふふふ...。危ないなぁ。

## おわりに

一言でいうと、**"Take your own risk."** といったところですね。しかし、こういうところに踏み込むスクリプト言語はなかなか無いと思うので、それなりの価値はあるのではないでしょうか。例えば、このライブラリがあれば [Xbyak](https://github.com/herumi/xbyak) なんかも移植できそうですね！ Kinx には演算子オーバーライド（オーバーロードとは呼ばない）もありますし。

ますます JIT が身近になりますね。

ではまた。
Vimでファイルを編集して保存する為に必要な最低限の知識

# はじめに

私が初めてVimに触れたのは大学生の頃です。学科の講義で情報系のものがあると聞いて、興味があったので受けることにしました。その中で(詳細は忘れてしまったのですが何かの設定の)ファイルをVimで編集するという作業があったのですが、初めて扱うソフトウェア、しかも操作方法が直感に反していると言っても良い代物だとしか当時思えなかったものなので、相当に苦戦した覚えがあります。今でこそVSCodeにVimキーバインドを導入して脱初心者を目指している身ではありますが、当時最低限必要だった知識は何だっただろうかということを書いてみたいと思います。

# 対象読者

少しでもVimを扱う必要があると言わたら:scream:となる未経験者・超初心者で、日常的にVimを使うことを特に目指していない人を想定しています。

# Vimのモード

Vimにはモードという概念があります。起動時はノーマルモードで、キー操作により入力モード・ビジュアルモード・コマンドラインモード等と切り替えることができます。
この辺りを上手く使えるようになると面白くなってくるのですが、今回のテーマ的には

- モードという概念がある
- 入力モードで文字を入力できる
- ミスタイプでよく分からないモードになっても`Esc`キーでノーマルモードに戻ることができる

ということを覚えておけば十分でしょう。

# カーソルの移動

Vimmerを目指すならばhjklでの移動に慣れると一歩先に進めると思いますが、特にVimmerを目指していないのならば矢印キーで移動しても良いと思います。
(聞いた話によると矢印キーを使えない環境もあるようです。もしそういった環境で作業しなければならないという時は頑張って慣れてください。)

# 編集する

ノーマルモードの時に`i`を押すことで入力モードに移ることができます。insertということで覚えてください。
入力モードの時はキー入力が文字として反映されます。また`Enter`キーで改行、`Backspace`キーで前の文字を削除、`Delete`キーで選択している文字の削除、また恐らく矢印キーで移動と、普段慣れ親しんでいる操作で使うことができます。
編集を終えたら`Esc`キーを押してノーマルモードに戻ってください。

# 保存して閉じる

ノーマルモードの時に`:w`を入力して`Enter`で保存できます。writeということで覚えてください。
また、`:q`を入力して`Enter`で終了できます。quitということで覚えてください。
2つを合わせて`:wq`を入力して`Enter`とすると、保存してから終了することができます。
以上で作業完了です。お疲れさまでした。

# よくありそうな質問

Vimをもっと便利に使う系統のコマンドについては他の記事にお任せして、ここでは初心者が緊急性の高そうな状況に陥った時にどうするべきかを書きたいと思います。
(この他にも緊急の状況とその対処法があるという場合は編集リクエストをお願いできればと思います。)

## 編集した箇所を戻したい

ミスタイプで想定していない編集をしてしまうということもあると思います。
ノーマルモードの時、`u`でアンドゥできます。戻しすぎた時は`Ctrl+r`でリドゥできます。

## 編集を全てなかったことにしたい

保存する前にノーマルモードに移り`:q!`と入力して`Enter`で編集を反映せず強制終了できます。

# おわりに

どうしてもVimでファイルを編集しなければならなくて困ったというときにこの記事を役立てて頂ければ幸いです。
ゼロから始めるLeetCode Day86 「33. Search in Rotated Sorted Array」

# 概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

Python3で解いています。

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day85 「6. ZigZag Conversion」](https://qiita.com/KueharX/items/777868c9914317a65cd2)

[Twitter](https://twitter.com/kueharx)やってます。

**[技術ブログ](https://kueharx.blogspot.com/)始めました！！**
技術はLeetCode、Django、Nuxt、あたりについて書くと思います。**こちらの方が更新は早いので**、よければブクマよろしくお願いいたします！

# 問題
[33. Search in Rotated Sorted Array](https://leetcode.com/problems/search-in-rotated-sorted-array/)

難易度はMedium。
問題としては、昇順にソートされた配列を，あらかじめ知らないピボットで回転させたとします（`[0,1,2,4,5,6,7]`が`[4,5,6,7,0,1,2]`になるかもしれません。）
(例えば，`[0,1,2,4,5,6,7]`は`[4,5,6,7,0,1,2]`になるかもしれません。)
検索対象の値が与えられます。配列の中に見つかった場合はそのインデックスを返し、そうでない場合は`-1`を返します。
配列の中に重複したものが存在しないと仮定してください。

>Example 1:

>Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

>Example 2:

>Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

# 解法


```python
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if nums.count(target) == 0:
            return -1
        else:
            ans = nums.index(target)
        return ans
# Runtime: 36 ms, faster than 92.59% of Python3 online submissions for Search in Rotated Sorted Array.
# Memory Usage: 14 MB, less than 61.16% of Python3 online submissions for Search in Rotated Sorted Array.
```

仮に`count`が`0`ならば`-1`を返し、そうでない場合に`index`を返します。

・・・
~~書くことがなぁい！！！~~

では今回はここまで。
お疲れ様でした。
【AWS】EBSのボリュームタイプの特徴とは？(備忘録)

# はじめに
現在、AWSSAAの学習をしています。
EBSのボリュームタイプの問題に戸惑うことが多いので、備忘録としてアウトプットします。

# EBSボリュームタイプ

|  ボリュームタイプの種類  |  ディスクタイプ  |  説明  |
| ---- | ---- | ---- |
|  汎用SSD(gp2)  |  SSD  |  **特徴**<br>・1GB当たり3IOPSのベースラインパフォーマンスが設定されている。<br><br>・ベースラインパフォーマンスを下回る利用の場合<br>→性能がクレジットとして貯蓄され、突発的なピーク時にそのクレジットが使われてベースラインパフォーマンスを超えるI/Oパフォーマンスを発揮できる。<br><br>**用途**<br>・ほとんどのワークロードに使用される<br>・システムブートボリューム<br>・仮想デスクトップ<br>・中小規模のデータベース<br>・開発・テスト環境  |
|  プロビジョンドIOPS SSD(io1)  |  SSD  |   **特徴**<br>・汎用SSDでは処理しきれないI/O性能が要求される場合に利用。<br><br>**用途**<br>・主に大規模なデータベースで使用される。<br>例)MongoDB、MySQL、PostgreSQL  |
|  スループット最適化HDD(st1)  |  HDD  |  **特徴**<br>高いスループットを必要とするアクセス頻度の高いワークロード向けの低コストのHDDボリューム<br><br>**用途**<br>ビッグデータ、データウェアハウス、ログ処理に使用される。<br>**※ブートボリュームには使用できない** |
|  コールドHDD(sc1)  |  HDD  |  **特徴**<br>・アクセス頻度の低いワークロード用に設計された低コストのHDDボリューム<br>・高い性能が不要な場合に使用<br><br>**用途**<br>・ログファイルやバックアップのアーカイブ先<br>・アクセス頻度の低い大量データ用のスループット指向ストレージ <br>**※ブートボリュームには使用できない**|
|  マグネティック(standard)  |  HDD  |  **特徴**<br>・旧世代のボリュームタイプ<br>・データのアクセス頻度が低い場合やコストを最重要視する場合に利用<br><br>**用途**<br>データへのアクセス頻度が低いワークロード  |
<br>

## 備考
※スループットとは、**「処理能力」**のことです。
詳しくは[こちら](https://wa3.i-3-i.info/word12830.html)

※ワークロードとは、**「仕事量、作業負荷」**のことです。
詳しくは[こちら](http://e-words.jp/w/%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%89.html)

# 実際のEC2インスタンスの作成ではどうなっている？？

EC2インスタンスの作成画面より調べてみました。

![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/c3a9c590-c15d-7a48-3eb6-8973b22f953c.jpeg)

確かに、下記ボリュームのみ存在しますね。

- 汎用SSD(gp2)
- プロビジョンドIOPS SSD(io1)
- マグネティック(standard)

# 参考
[Amazon EBS ボリュームの種類](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html)
[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集 Kindle版](https://www.amazon.co.jp/gp/product/B07VFFX6V1/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
modelの作成

#modelの作成方法

##model作成のコマンド

```
$ rails g model モデル名
```
###model名のところは単数系でなければならない
###model作成時のルールなので気をつけましょう。

```
boardsテーブルを作りたい時は
例) $ rails g model board
```
###と実行する

###マイグレーションファイルなどが生成される。
###マイグレーションファイルを編集します
###編集し終わったら以下のコマンドでテーブルを作成します。
```
$ rails db:maigrate
Google Apps Scriptを使って、Googleドライブ内のスプレッドシートの一覧をスプレッドシートに書き出す

# Googleドライブ内のスプレッドシートの一覧が欲しい

というニーズが一部にありましたので、作ってみました。

# ボタンにGASを割り当てる手順

スプレッドシートを作ります。
下記のようなボタンを「挿入」⇒「図形描画」から作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31413/5c3c8131-8992-79e5-3948-831791a12e9b.png)

ボタンを右クリックし、縦の「…」から「スクリプトを割り当て」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31413/4e231cfb-6c4f-182b-a9d0-a9b7817eabca.png)

これから作成するGASのfunction名（デフォルトならmyFunction）を割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31413/d5ae9259-53e4-4ecf-6b55-4db4daf13a0b.png)

# Script

「ツール」から「スクリプトエディタ」を開き、以下のような感じでスクリプトを作ります。

```JavaScript
function myFunction() {
  var iter = DriveApp.getFilesByType('application/vnd.google-apps.spreadsheet')
  // 上のかわりに下のようにすれば、スプレッドシートだけでなくすべてのファイルの一覧ができます
  // var iter = DriveApp.getFiles();
  var list = [];
  while(iter.hasNext()) 
  {
    var f = iter.next();
    list.push([f.getName(), f.getUrl()]);
  }
  writeToSheet(list);
}

function writeToSheet(list)
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // ボタンとかぶらないように4行目から書き始めます
  var range = sheet.getRange(4, 1, list.length, 2);
  range.setValues(list);
}
```

あとは、スプレッドシートに戻って、ボタンをポチっとな！
ファイル名とURLの一覧が作成されます。

# 雑感

ちょこちょこっと書くだけで、いろいろ操作できるのでGoogle Apps Scriptは楽しいですね。
LogisticRegressionを使った超基本的な教師あり学習(多クラス分類)



Pythonを使った超基本的な教師あり学習のコードを書いていきます。

---

ある学校では、年間の総合成績を前期の中間試験と期末試験、後期の中間試験と期末試験、そして平常点を加えて総合的につけているとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/4e1b7e3d-8e6e-9ef3-4fe1-e49c690b3bc4.png)

ある年のある科目の前期の中間試験と前期の期末試験、そしてその年の年間総合成績が記載されたCSVファイルは以下の様な内容になっていたとします。（勿論、架空のデータです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/0906c544-a27a-df45-a8fa-cd210b69189e.png)

そして、別の年の前期の中間試験と期末試験の結果が以下の様になっていたとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/5653b88b-061a-f806-58f1-d13ee733c6d2.png)

この時、この年の年間総合成績がどうなるか予測してみましょう。

まずは教師データを読み込みます。

```python:
import pandas as pd

#CSVファイル読み込み。
train_df = pd.read_csv('data/seiseki_sample.csv')
display(train_df)


# X_trainに年間総合成績を除いたtrain_dfを代入。
X_train = train_df.drop("年間総合成績", axis=1)

# Y_trainに年間総合成績のみが入ったtrain_dfを代入。
Y_train = train_df["年間総合成績"]
```

次にテストデータを読み込みます。

```python:
X_test = pd.read_csv('data/test_result.csv')
```

そして、外部ライブラリと教師データを使って分類モデルを作り、結果を予測させます。ここでは試しにロジスティック回帰による分類モデルを作成します。

:::note info
ロジスティック回帰は回帰という名前がついていますが分類に用いられる手法で、線形回帰ではないですが何故かsklearnではlinear modelに含まれます。
:::

```python:
from sklearn.linear_model import LogisticRegression

#教師データX_trainとY_trainを使いロジスティック回帰による分類モデルを作成。
lg = LogisticRegression()
lg.fit(X_train, Y_train)

Y_pred = lg.predict(X_test)

Predict = pd.DataFrame({
        "前期中間試験": X_test["前期中間試験"],
        "前期期末試験": X_test["前期期末試験"],
        "年間総合成績": Y_pred
    })

Predict.to_csv('data/lg.predict.csv', index=False, encoding="SHIFT-JISx0213")
```

結果のcsvファイルを見てみると、下のような感じになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/a3e0e7bd-9453-46fc-7f71-f54abefdf6fe.png)


教師データと全く同じ値をテストデータとして使った場合でも、元々の結果(この場合は年間総合成績)と全く同じ結果になるとは限りません。

さて、実際の結果が以下のようになっていたとしましょう。

```python:
X_answer = pd.read_csv('data/test_answer.csv')
X_answer
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359600/99a83842-84a7-3842-d693-b83048db0174.png)

このとき、予測の精度を評価するには以下のように書きます。

```python:
from sklearn.metrics import accuracy_score

accuracy = accuracy_score(X_answer["年間総合成績"], Predict["年間総合成績"])
print('Accuracy:', accuracy)
```

### ハイパーパラメータ

[sklearn.linear_model.LogisticRegressionの公式サイト](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)を参照。

### Kaggleでも使ってみました。

[Spaceship_Titanic](https://www.kaggle.com/code/yakinoki/spaceship-titanic)というコンペで同様のコードを書いてみました。

### シグモイド関数

ロジスティック回帰には以下のシグモイド関数が用いられます。
```math:
\sigma(x) = \frac{1}{1 + e^{-x}}
```

この関数は、以下の微分方程式を満たします。

```math:
\frac{d}{dx} \sigma(x) = \sigma(x) \cdot (1 - \sigma(x))

```

因みに、将棋ソフトの評価値と勝率の関係はシグモイド関数に似ていることが実験的に知られています。
【Flutter】何もしていないのにAndroid StudioでFlutterプロジェクトをRunすると、「前に使っていたtoolと違うよ」とWarningが出るようになった時の解決方法

## 概要

いつの日からかRunするときに下記の警告が出るようになり解決方法を調べました。

```
Warning! The 'flutter' tool you are currently running is from a different Flutter repository than the one last used by this package. The repository from which the 'flutter' tool is currently executing will be used instead.
  running Flutter tool: C:\flutter
  previous reference  : C:\src\flutter
This can happen when you have multiple copies of flutter installed. Please check your system path to verify that you are running the expected version (run 'flutter --version' to see which flutter is on your path).
```

## 原因
Flutter SDKへのPathが変わってしまったことが原因でした。

## 解決方法
Android Studioを起動し、以下の設定を変更します。

`File > Settings > Languages & Frameworks > Flutter`
の中の`Flutter SDK Path`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230436/e70ced8b-cccb-8d83-a89e-b65f1bc1a0d4.png)
GreatestCommonMultiple

#これは何か？
人類が求めた最大公倍数です。(ほんまかいな？？)

#解説
アルゴリズム自体は、2変数を割れる数の最大値を構築しているだけです。
通分するときは、ユークリッドの互除法して共通が無くなるまで割り続けるのですが、その共通をため込んで大きな数を作ろうという話です。

#code.
```C++:code.cpp
#include <iostream>
#include <cstdint>
#include <numeric>

template<class R=std::uintmax_t,class T=std::uintmax_t,class Y=std::uintmax_t>
R GreatestCommonMultiple(T A, Y B) {

	R C = 1;
	std::common_type_t<T,Y> V = 0;

	while ((V=std::gcd(A, B)) != 1) {
		A /= V;
		B /= V;
		C *= V;
	}

	return C;
}

int main() {
	std::uintmax_t A = 2*2*3*3*5*5*7;
	std::uintmax_t B = 2*3*3*5*5*7;

	auto R = GreatestCommonMultiple(A, B);

	std::cout << "A:" << A << ",B:" << B << std::endl;
	std::cout << "A:" << A / R << ",B:" << B / R << ",R:" << R << std::endl;
	return 0;
}
```
#終わりに
もうこれで最大公倍数は間違ってるなんて言わせない！

お後がよろしいようで・・・。
AirflowでweeklyやmonthlyのスケジューリングのDAGが動かない

# 背景
`@weekly` や `@monthly` のスケジューラーのDAGがなんか動かない

# 解決法

DAG引数の `start_date` を確認する。
`@weekly` の場合は `start_date` が1週間以上になっているか、 `@monthly` の場合は1ヶ月以上前になっているかを確認する。なっていないとDAGは動かない。

例えば、 `start_date: airflow.utils.dates.days_ago(1)` とかにしてると一生動かない。
days_agoを使いたいなら、 `@weekly` の場合は `start_date: airflow.utils.dates.days_ago(7)` とかにする必要がある。

# 参考
[Airflow doesn't recognize DAG scheduling](https://stackoverflow.com/questions/58207766/airflow-doesnt-recognize-dag-scheduling)
AWS EC2 の golang 開発環境構築 - 2020

## 事前準備
- AWS EC2
- [VSCode](https://code.visualstudio.com/download#)

## Golang インストール
```sh:List
$ amazon-linux-extras | grep golang
29  golang1.11=latest        enabled      \
```

```sh:Install
$ sudo amazon-linux-extras install -y golang1.11
$ go version
go version go1.13.4 linux/amd64
```

## VSCode Plugin Install
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/a002e7f4-844b-563e-8ff9-ac6bcd20371a.png)

### Ctrl + Shift + P で ツールなどインストール
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/c5965533-a2e2-d376-c1d5-292a3d79524d.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/394a8096-9f44-2ab7-93fa-15a8a8c75351.png)

## Hello World!
```sh:NewFile
$ cd $GOPATH
$ mkdir src
$ cd src
$ mkdir hello
$ cd hello
$ touch hello.go
```

### VSCode で開く
Remote Development 機能使ってますが、省略します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/410d1d34-bba5-876f-6bba-592407a87d82.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/75431370-bd6e-f727-c2f0-b04f656a6e65.png)

### Coding
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/e5024b85-d900-2901-96b0-08687c5f4b86.png)

### Execute
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/a59621ff-05cd-c6f4-7cfd-eb59fc74d13e.png)

### Debug
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/e5b66f3a-cbf0-ae66-b21d-8720d3f6361c.png)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/c1b63197-14fd-f51c-3704-1da6251f74fe.png)
オブジェクト指向はゲームづくりに向かない その２


**オブジェクト指向はゲームづくりに向かない** のその２です。


[その１](https://qiita.com/mas-yo/items/43101d2e5ef073a1f3f5)では、クラスの継承構造が、後から変更しにくいという問題点を、例を用いて紹介しました。

今回は「データの依存関係が見えにくい」です。

前回同様、見下ろし視点のアクションゲームで考えてみます。

敵の攻撃がプレイヤーにヒットする部分の実装は、オブジェクト指向で設計すると、例えばこんな感じになると思います。

```C#
class Enemy
{
    //敵の更新処理
    public void Update()
    {
        //攻撃状態なら
        if (IsAttackState())
        {
            var player = GetPlayer();
            //攻撃があたっていたら
            if (IsAttackHit(player))
            {
                //ダメージ計算
                var damage = CalcDamage(this, player);
                //ダメージをプレイヤーに与える
                player.ApplyDamage(damage);
            }
        }
    }
```

つづいて、プレイヤーが毒によるダメージを受ける部分です。

```C#
class Player
{
    //プレイヤーの更新処理
    public void Update()
    {
        //毒状態だったら
        if (IsPoisonState())
        {
            var damage = CalcPoisonDamage();
            this.ApplyDamage(damage);
        }
    }
}
```

では次に、ダメージ床がプレイヤーに攻撃する処理です。

```C#
class DamageFloor
{
    //ダメージ床の更新処理
    public void Update()
    {
        var player = GetPlayer();
        if (IsAttackHit(player))
        {
                //ダメージ計算
                var damage = CalcDamage(this, player);
                //ダメージをプレイヤーに与える
                player.ApplyDamage(damage);
            }
        }
    }
```

では次に、回復アイテムを取得したらHPが回復する処理です。

```C#
class RecoverItem
{
    //回復アイテムの更新処理
    public void Update()
    {
        var player = GetPlayer();
        //プレイヤーが触ったら
        if (IsTouch(player))
        {
            //プレイヤーを回復
            player.Recover(GetRecoverHp());
        }
    }
}
```

ダメージを受ける処理能力 Player.ApplyDamage()と、回復処理 Player.Recover()を見てみましょう。

```C#
class Player
{
    public void ApplyDamage(int damage)
    {
        this.hp -= damage;
        if (this.hp <= 0) {
            Dead();
        }
    }
    public void Recover(int recover)
    {
        this.hp += recover;
    }
}
```

オブジェクト指向の一般的な考え方で実装すると、大体上記のようなコードになると思います。

さて、あるフレーム（ゲームループ１回分の処理）で、プレイヤーのHPが変化するシチュエーションは、何パターンあるでしょうか？

- Enemy.Update() から Player.ApplyDamage()が呼ばれる
- Player.Update() から Player.ApplyDamage()が呼ばれる
- DamageFloor.Update() から Player.ApplyDamage()が呼ばれる
- RecoverItem.Update() から Player.Recover()が呼ばれる

これらが１フレーム内で１つだけ起こる、もしくは同時に２つ、３つ起こる事もあります。
また、呼ばれる順番も、その時々で様々です。
（オブジェクトの管理方法によりますが、生成された順番に依存することが多い）

そう考えると、プレイヤーのHPが何に依存して変化するかは、プログラマーが把握しきれない程、多くのパターンが存在することになります。
しかもその複雑さは、開発が進んで機能が追加されればされる程、増していきます。

そして、どこかのタイミングで、「○○と✕✕が同時に起こる」などのレアなシチュエーションでしか起こらないバグが発生します。

例えば、上記のコードでは、HP0になる攻撃を受けた後、同じフレームで回復されると、HPが1以上にも関わらず、Dead()が呼ばれてプレイヤーが死んでいる状態になりそうですね。

HPなどは簡単な方ですが、状態異常やスキルなどは複雑化する傾向にあり、プログラマーは常にいろいろな可能性を考慮しながらコードを書かなければなりません。

このようなバグが発生した場合、調査は困難ですし、治すと言っても根本対処しようとするとシステムの土台から修正することになり、エンバグのリスクが高くなります。
仕方なく、無理やり不具合を塞ぐ様な実装をすることになり、ツギハギだらけのプログラムになっていってしまいます。


一般に、オブジェクト指向言語では、ある機能は外から見れば公開（public）か非公開（private）しかありません。
そして公開されている機能は、どこからでも呼べてしまいます。よって依存関係も際限なく増えてしまうんですね。

このような複雑さを回避する方法はないでしょうか？

それについては、次回、解説してみたいと思います。
【初心者でもわかる】ファビコン（タブにあるアイコン）の簡単な作り方・設定方法

# どうも、7noteです。今回はファビコン（favicon）の作り方を初心者でもわかりやすく説明します！
どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/favicon/
初心者によるプログラミング学習ログ 370日目

#100日チャレンジの370日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
370日目は
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br><br>●寝る直前の筋トレ5分、kindle読書 10分<br>●ブログ記事1記事作成<br>●プログラミング学習370日目 2h<br>・メンターの課題<br>・架空LP(<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a> )のpc版作成<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1282769960129814528?ref_src=twsrc%5Etfw">July 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【小ネタ】あなたの平均値の計算、本当にできていますか？

## 免責事項

本記事で扱っているのはあくまでかなり極端的なケースであって、普段の開発ではそこまで神経質になる必要はないと思います；そのため「こう言うこともあるね」とどこか頭の中に入れて、実際このようなバグが発生したとき思い出していただければと思いますので「小ネタ」として書かせていただきます。

## うわっ…私の平均値、膨らみすぎ…？

安心してください、私は別にこの記事で平均値と中央値の違いとかみたいなセコいことを言うつもりはありません、あくまで我々が日常で使ってる「平均値」のことです。$(x + y) \div 2$ のことです。

ところで上記の数式の通り、我々は平均値の定義[^average]を、二つの数字を足して 2 で割る、という風に教わったはずかと思います。そのため我々は基本このように平均値メソッドを書くことがほとんどかと思いますね。筆者は iOS エンジニアなので、ここは Swift のプログラム[^type]を書きますが他の言語も似たような実装になるかと思います：

[^average]: 数字が三つ以上出ると話がややこしくなるので、ここはひとまず二つの数字の平均値を扱います。

[^type]: 本当は割り算があるので整数はあまりよくないですが、本記事もひとまず理解がしやすいためにあえて整数を選びました

```swift
func average(x: Int, y: Int) -> Int {
    return (x + y) / 2
}
```

実際このプログラムを回してみて、例えば `1` と `3` の平均値をこれで回してみれば、確かに正しい平均値の `2` が得られます：

```swift
average(x: 1, y: 3) // 2
```

何も問題ないじゃん？と思いますよね。

では、`4611686018427387903` と `4611686018427387905` の平均値はどうでしょう？実際回してみましょうか

```swift
average(x: 4611686018427387903, y: 4611686018427387905) // ???
```

さて、ここは言語や処理系によって違いが出るところですかね？例えば Swift ならここではプログラムが `EXC_BAD_INSTRUCTION` エラーで落ちます；C ならここで `0` が出るかもしれませんし、他に `-4611686018427387904` が出る言語もあるかもしれません。どのみち、64 bit の処理系なら、おそらくここで正解の `4611686018427387904` が出る言語はそうそうないでしょう。

お気づきでしょうか？そうです。プログラミングの計算と、実際の数学の計算と大きな違いがあります：数字自体の制限です。

64 bit の処理系なら、`Int` の最大値は `9223372036854775807` です。ところで `4611686018427387903` と `4611686018427387905` を愚直に足してしまうと `9223372036854775808` になり、`Int` の極限を超えちゃってオーバーフローになります。そのため結果が `Int` で正しく表現できず、Swift ならここで落ちますし、C 言語ならここで `0` になってしまいます。

ちなみに記憶が曖昧ですが、確か Java が長い間このバグが潜んでいたことがあったはずです[^java]。

[^java]: ~~以前どこかで Java かなんかのシステムがずっとこの実装で平均値を求めていて、どこかでバグって多くのデバイスに影響を及ぼした的な記事を読んだ記憶がありますが、はっきりと出自が思い出せないので、知ってる方がいらっしゃいましたら補足できると嬉しいです。~~ @naskya さんと @fujitanozomu さんのおかげで、そのバグは Java の二分探索の実装にあったことが判明しました。詳しくはコメント欄をご参照ください。

## では平均値をどう求めればいいか

平均値をグラフの考え方で考えてみれば、低い方の数字に、両方の数字の差の半分を足す、という考え方もできます。つまりコードにするとこんな感じです：

```swift
func average(x: Int, y: Int) -> Int {
    return x + ((y - x) / 2)
}
```

上記のコードは暗黙的に `x` が `y` より小さい、という前提条件が入ってるように見えますが、実際は符号が着くおかげで、`y` の方が小さかったら `y - x` もマイナスになって結果正しい平均値が得られます[^order]。

[^order]: 正確には、`x + ((y - x) / 2)` の足し算基準値に使われる `x` が大きい方か小さい方かによって、演算精度の影響による誤差が出て違う結果になることがあり得ます。詳しくはコメント欄をご参照ください。

```swift
average(x: 3, y: 1) // 2
```

そしてこの方法の一番のメリットは、途中の計算結果が `x` と `y` を超えることがないので、`x` と `y` さえ制限を超えなければ正しい平均値が求められます。実際先ほどの Java のバグの件も、このように修正を入れてたはずです。ですので今後は平均値を求めるときは

```math
(x + y) \div 2
```

ではなく、

```math
x + ((y - x) \div 2)
```

で求めましょう！

## ちょっと待って…本当にそれでいいの？？

先ほど私

> 途中の計算結果が `x` と `y` を超えることがない

と言いましたよね？あれは嘘です。超えることがあるんです。

これまで私が挙げてきた例は全て符号付き整数型を使っていましいたが、具体的な数字は全て正数です。ところが負数が入ってきたらどうなるのかな？

答えは、両方とも正数もしくは両方とも負数の場合、確かに $x - y$ の差（の絶対値）が `x` と `y` を超えることはないが、逆に片方が正数で片方が負数の場合、その差は逆に `x` と `y` を超えます。例えば：

```swift
average(a: 4611686018427387905, b: -4611686018427387905) // ???
```

上記の場合、逆に $x + ((y - x) \div 2)$ で計算するとオーバーフローが発生します。この場合、むしろ普通の和を 2 で割る方法で求めれば正しい結果が得られます。

まとめると：

|                    |         平均値          |
|-------------------:|:----------------------:|
| $x$ と $y$ が同じ符号| $x + ((y - x) \div 2)$ |
| $x$ と $y$ が違う符号| $(x + y) \div 2$ |

です。

## 後書き

免責事項で書きましたとおり、本記事はあくまでかなり極端的なケースであって、普段の開発ではそこまで神経質になる必要はないと思います。
[Rails]EC2にデプロイ後、jQuery/JavaScriptが動かない

#前提

``Rails 6.0.3.1``
``ruby 2.6.3``
``unicorn-5.5.5``
`` nginx/1.16.1 ``

#　EC2にデプロイしたら、jQueryがお仕事をサボっていた

デプロイ後に、ブラウザでトップページを確認すると ``jQuery``が動いておらず、トップページのfade inがいつまでたってもなされない状態でした。

#結論


```:app/views/layouts/_default.html.erb
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
<%= stylesheet_pack_tag 'application', 'data-turbolinks-track': 'reload' %>

#以下を追加
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
````

ローカルでは、

```
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
```
なしでも動いていましたが、どうやら本番環境では追加しないとうまく動かない場合があるみたいです。

ちなみに
``https``ではなく、``http``でも動くようですが、``SSL化``したアプリケーションでは大体のアプリケーションは、セキュリティの面で``SSL化``すると思うので、``https``でしてあげた方が良さそうです。

　> [railsでjQuery/JavaScriptがうまく動かない時の対処法](https://qiita.com/keiy121/items/d1880ff2d0de444458c7)
Codeforces #653 (Div. 3) A. Required Remainder

https://codeforces.com/contest/1374/problem/A

# 概要
- $x, y, n$が与えられる
- $0 \leq k \leq n$としたとき、$ k$  $mod$  $x = y $となる最大のkを求めよ
- 制約: $0 \leq y \lt x$ である $y \leq n \leq 10^{9}$

# 例
$10, 5, 187$のとき$k=185$である。187以下で10で割って5になる最大の数は185である。

$5, 0, 4$のとき$k=0$である。4以下で5で割って0になる最大の数は0である。

# こう考えた
上の例を考察すると、
- $10, 5, 187$のとき$k=185$である。
- $10, 5, 182$のとき$k=175$である。
ことが分かる。

$x * floor(n / x)$ は$n$を超えない`xで割ったときの余りが0`の整数だから、
$x * floor(n / x) + y$を計算すると`xで割ったときの余りがy`の整数なので、答えの１つになりうる。

上記の場合、185がそれに該当する。$n$が185未満の場合、185は許容されないので、それより１つ小さい、`10で割ってあまり5`が候補になる。
これを考えると、$185 - x = 185 - 10 = 175$である、何故なら、
$x * (floor(n / x) - 1) + y$だからである。

# コード
```Python
from pprint import pprint
import sys
import math
def do():
    x, y, k = map(int, input().split())
    a = x * (math.floor(k / x))
    a += y
    if a > k:
        a -= x
    print(a)
q = int(input())
for _ in range(q):
    do()
```
https://codeforces.com/contest/1374/submission/85449747
【Rails】チーム開発している時の頻出DB系コマンド


### 【こんな人に読んで欲しい】
### チーム開発やってるけど、DB系コマンドが全然わからない。なんかマイグレーション系のエラーが起きる。どうなってるの？


### 【この記事を立ち上げた経緯】
ブランチを切ってチーム開発をしている時、（特に初期段階）、各自が各々のブランチでDBを作ってマイグレーションしてしまうので、
マイグレーションファイルやデータベース（テーブル）の状態がバラバラ。
そんな時にブランチを移動してしまうとエラーが起きる原因となります。それをどうやって修正するか？の記事です。かなりよく使うコマンドだと思うので、私もまだまだ勉強中ですが、少しでもご参考になれば幸いです。

後半に、本番環境のDBコマンドも載せてあります。

<br>
#### 【バージョンやら環境】
Rails 5.2.4.3
Ruby 2.5.1
macOS Catalina 10.15.4
AWS


#### 【開発環境（ローカル）】

まずは、現在のマイグレーションファイルの状態から確認。
マイグレーションファイルがデータベース（テーブル）に適用されているかどうかを調べるコマンドです。

```ruby:ターミナル
rails db:migrate:status　
```
例えばこんな感じ
<img width="470" alt="DB1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603198/760a2bba-2027-7f0d-215e-c801ebfa6bf7.png">
Migration　IDとMigration Nameは、db/migrateの中のファイルとリンクしています。
<br>

■Status
・「up」　▶︎　適用されている
・「down」 ▶︎　適用されていない（削除や修正が可能）

<br>
ちなみに、
・「********** NO FILE **********」　と表示される場合があります。これは、マイグレーションファイル一回作ったことあるけど、いまはdb/migrate/ディレクトリの下に見当たらないよって場合に表示されるらしいです。

<br>


状態もわかったので、ロールバックします。

```ruby:ターミナル
rails db:rollback STEP=X
```
ロールバック、とは「一度データベースからマイグレーションファイルを差し戻す」こと。
「X」には戻したいファイルの数を入れます。4つ戻したければ4。下のファイルからdownになっていきます。
ロールバックすることで、ファイルをupからdown(＊＊＊＊＊）の状態にします。

参考画像では６つファイルありますが、Xに4を入れましてすロールバックするとこんな感じ
<img width="452" alt="DB3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603198/a65ce7cd-76d7-8b01-0074-2c1b7a8df69d.png">

さらに2つロールバックすると全部downになります。
<img width="416" alt="DB2_down.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603198/d2e7a77b-30c9-9ce8-2848-3f8c5b8bcacf.png">




<br>
全部　downになったので、再度マイグレーションしてテーブルを再作成していきます。

```ruby:ターミナル
rails db:migrate
```
なれない時は都度rails db:migrate:statusで状態を確認してみるといいと思います！！


<br>
ちなみに、うまくいかない場合はrails db:migrate:resetという、リセットしてマイグレーションするコマンドもあります。


```ruby:ターミナル　（リセットとマイグレーションを同時に行う）
rails db:migrate:reset
```


どちらにしても、にローカルで保存していた画像やら登録したユーザーやらも消えてしまいますが・・・まあ、やむなしですね。

ちなみに、私の場合は、基本元のブランチで全てdownにしてから、作業するブランチに行ってrails db:migrateをしていました。

<br>
<br>

#### 【参考までに本番環境】
なお、本番環境でのDBコマンドは下記の通りです。
（デプロイ担当者に捧げます、がんばれ）


```ruby:ステータス確認
rails db:migrate:status RAILS_ENV=production
```

```ruby:データベース完全リセット（currentで行いました）
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset
```

※私は本番環境で上記の方法しか使ったことがないですが、他に方法があるんでしょうか？
<br>

```ruby:マイグレーション
rails db:migrate RAILS_ENV=production
```

```ruby:Seed
rake db:seed RAILS_ENV=production
```

以上になります！！！


#### 【一部参考にさせていただいたサイト】
[Railsガイド　Active Record マイグレーション](https://railsguides.jp/active_record_migrations.html)
※ver6.0のページを見ています。


#### 【あとがき】
うちのチームにはDB系のコマンドを交通整理してくれたDB担当メンバーがいるのですが、本当に感謝しかありません。おかげさまでうちのチームはマイグレーションパニックがほとんど起きませんでした。最終課題後少し（多分）

（この記事、大丈夫かな、役に立つかなってドキドキしてます・・・）
Pythonで回文出力プログラム

# 回文とは
左から読んでも右から読んでも同じ文字列のこと。それに意味があるかどうかは今回の場合は問わない。
文字列$ p = p_1... p_n$について
$p_i = p_{n + 1 -i}  (i\le 1 \le n)  $
が成り立つものと定義する。
例えば、文字列'abcba'の回文は'abcba'、'bcb、'a'、'b'、'c'となる。

## 問題
入力されたテキストから回文となる文字列を全て出力する。
##プログラム
findAllParindrome
入力： 文字列s、文字列の長さlen_s
出力: 回文を含む集合par

内部関数seek
入力： 文字列s, 着目位置index, 着目位置からの距離diff, 集合par
出力: なし

```python 
def findAllParindrome(s, len_s):
    par = set() # 集合のビルトインクラス
    new_str = "*|" # “*”は文字列の始端末端につけておく。 “|”は回文を奇数偶数関係なく判断するために文字同士間に挿入しておくe.g.) abc -> *|a|b|c|*
    for i in range(len_s ):
        tmp =  s[i] + "|" # “|”の挿入
        new_str += tmp 
    new_str += "*" # 末端識別子としてつけておく
    
    for i in range(2, 2 * len_s + 2): # 新たな文字列の記号以外の開始部分から終了部分まで
    
        seek(new_str, i, 0, par)# 探査をして回文を探査する
        
    return par

def seek(s, index, diff, par):
    """ check left letters and right letters iteratively """
    left = index - diff # 末端に到達した場合探査を終了
    right = index + diff
    if s[left] == "*" or s[right] == "*":
        return
    # print(s[left], s[right], end="")
    if s[left] != s[right]: # 左右が一致しない場合探査を終了
        return 
    else: # 左右が一致した場合 
        seek(s, index, diff + 1, par)# 次の左右の文字列探索をする
        if s[index + diff] != "|":  # 参照している右の文字列が”|”でない時
            tmp = s[index - diff: index + diff + 1: 2]  # “|”を飛ばして文字列をtmpに代入
            print(s[index - diff: index + diff + 1: 2], end=" ")
            par.add(tmp)

def test_par():
    assert findAllParindrome("たけやぶやけた", 7) == {'け', 'けやぶやけ', 'た', 'たけやぶやけた', 'ぶ', 'や', 'やぶや'}
    assert findAllParindrome("abcba", 5) == {'a', 'abcba', 'b', 'bcb', 'c'}
```


## プログラムのポイント
* 1文字の回文や文字列の奇数偶数の場合の処理をまとめるために、文字列間に"|"と末端文字"*"を入れてみた
* 線形探索で文字列を左から右へ読み込む
* 左右の文字列が一致したら一つ先の左右の文字列へ再帰的に進めていく

## 処理時間
a-zまでの小文字のランダムの繰り返し文字列を入力して処理した場合
![process_par_b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236977/b31ec265-3c2d-2e56-5cbe-38a85196e050.png)
abab...の繰り返し文字列を入力した場合
![process_par_ab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236977/6be275af-2527-1a3d-7534-f17f89efe3d9.png)
繰り返し文字列"ab"を入力文字列としてログラムを実行した時の処理時間。abという文字列を繰り返すことでseek関数の処理数が増加するので、処理時間が指数関数的に増加すると考えられる。
Dockerを再起動するとwebアプリで保存した画像が消えるのを解決した

## 環境
- Docker version 19.03.8, build afacb8b
- docker-compose version 1.25.5, build 8a1c60f6
- Java 1.8
- SpringBoot 2.2.5.RELEASE

## 事象
Dockerに載せたWebアプリで画像を保存してから、
Dockerを再起動すると保存した画像ファイルが消えてしまう。


## 原因
名前付きボリュームのパス指定とアプリ側で画像保存するパスが異なっていた。なので、保存した画像は名前付きボリュームには保存されず、コンテナを停止したら消えてしまっていたというオチ。

DBとかのパス指定を参考に設定していたけど、アプリ側が登録する場所に
合わせないとそりゃだめだよね・・・

アプリが画像を保存する先

```
/static/images/xx/xxx.png
```

docker-compose.ymlを以下のように修正

```
# 修正前
volumes:
  - images:/var/itetenosuke/images

# 修正後
volumes:
  - images:/static/images

```

これでDocker再起動しても画像消えなくなった。
【NATインスタンス（AWS）】基本構築（iptables利用）

##目標
AWSネットワーク上にNATインスタンスを構築し、プライベートインスタンスからのインターネット接続を可能にする。
NATインスタンス構築時のツールはiptablesを利用する。

##前提
・パブリックサブネット及びプライベートサブネットにEC2インスタンスが構築済みであること。
・プライベートインスタンス接続用の踏み台サーバが構築済みであること。

##完成フロー
①プライベートインスタンスからNATインスタンスへ接続する。
②NATインスタンスが送信元IPアドレスをグローバルIPアドレスへNAT変換し、インターネット接続する。
③インターネット側からのレスポンスがNATインスタンスへ返る。
④送信先IPアドレスをプライベートインスタンスのIPアドレスにNAT変換しレスポンスを届ける。

![nat (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/aaaa384e-db70-12df-9160-5b025b85d011.png)


##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [NATインスタンスのセットアップ](#1natインスタンスのセットアップ) |
| 2 | [プライベートサブネットのルートテーブル修正](#2プライベートサブネットのルートテーブル修正)|
| 3 | [接続検証](#3接続検証)|

##手順
###1.NATインスタンスのセットアップ
パブリックサブネットに作成済みのEC2インスタンスをNATインスタンス化させます。

**①NATインスタンスのセキュリティグループ確認**
22番ポートに加え、`443番ポート（https）`が開いていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/1d06699d-7f4f-b658-ec2d-a8ca22c768f7.png)


**②送信元/送信先の変更チェック無効化（※）**
EC2コンソールの`アクション`⇒`ネットワーキング`⇒`送信元/送信先の変更チェック`⇒`はい、無効化する`をクリック

※送信元/送信先の変更チェック無効化とは
EC2インスタンスはデフォルトで送信元/送信先チェックを有効化しています。つまり、対象のEC2インスタンス宛てでないパケットはデフォルトで弾く仕様ということです。
今回はインターネット宛てのパケットをEC2で経由させる必要があるためこの機能を無効化し、パケットを弾かせないように変更する必要があります。

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/f5f69977-3987-a51b-6cbd-82751f6f50eb.png)

**③OSログインし、ルートユーザへスイッチ**

```bash

sudo su -
```

**④ip_forwardの有効化**
異なるネットワークへのパケット転送を有効化するため、`ip_forward`を有効化させます。

```bash

vi /etc/sysctl.conf

# 以下のエントリを追加する
net.ipv4.ip_forward=1
```

ネットワークを再起動してsysctl.confでの編集を有効化させます。

```bash

systemctl restart network
```

**⑤NAT（IPマスカレード）の有効化**
iptablesを利用してNAT（IPマスカレード）を有効化させます。

```bash

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```

###2プライベートサブネットのルートテーブル修正
デフォルトゲートウェイをNATインスタンスに向けるようにプライベートサブネットのルートテーブルを修正します。

まず、VPCコンソールから対象のプライベートサブネットにアタッチされているルートテーブルを確認します。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/0d514e53-284b-b905-595c-5ceba9ea9cb5.png)

`ルートの編集`をクリック
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/d10f5086-532b-4126-9cb2-a75049dcc537.png)

デフォルトゲートウェイをNATインスタンスに向けるようにルートを追加します。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/a6e1c587-1b5c-ca4d-d062-529801eb69b6.png)

###3.接続検証
**①踏み台サーバから手順2でセットアップしたプライベートインスタンスへ接続**

```bash

ssh -i <keypairfile_pass> <private_ip>
```

**②任意のインターネットサイトへcurl接続**
接続先サイトからレスポンスが返ってきたらOKです！

```bash

curl "<URL>"
```
FizzBuzz問題

#概要
fizzBuzz問題について、問題を作成して解いてみました。

#前提条件
- ruby2.6.5

#問題
1〜100までの数字をターミナルに出力して
- 「5の倍数」のときはFizzと出力
- 「7の倍数」のときはBuzzと出力
- 両方の倍数である「35の倍数」のときはFizzBuzzと出力

#回答
```
def fizz_buzz
  num = 1
  while(num <= 100) do
    if (num % 5 == 0)&& (num % 7 == 0)
      puts 'FizzBuzz'
    elsif (num % 5) == 0
      puts 'Fizz'
    elsif (num % ') == 0
      puts 'Buzz'
    else
      puts num
    end
    
    num = num + 1
 end
end

fizz_buzz
```

#解説
この問題は条件分岐と条件の組み合わせを利用しています。
まずは、1~100までの数字を出力するための記述です。
指定した条件式がtrueの間、繰り返し実行してくれるwhile文を使用してます。


```
def fizz_buzz
  num = 1
  while (num <= 100) do
    puts num
    num = num + 1
  end
end

fizz_buzz
```
次は５の倍数の時と7の倍数の時の出力です。
if文を使用して条件分岐します。

```
def fizz_buzz
  num = 1
  while (num <= 100) do
    if (num % 5) == 0    # 5の倍数のとき
      puts "Fizz"
    elsif (num % 7) == 0 # 7の倍数のとき
      puts "Buzz"
    else                 # それ以外のとき
      puts num
    end

    num = num + 1
  end
end

fizz_buzz
```

最後に35の倍数の時の出力です。
注意点は、35の倍数の条件式をif文の一番上に書くことです。
これは、if文の「上から順に条件式を判定し、trueを返した時点でtrueより下の条件式はスルーされる」という性質を考慮したものです。なので条件が緩いものから上に書いていきます。

```
def fizz_buzz
  num = 1
  while (num <= 100) do
    if (num % 5 == 0) && (num % 7 == 0) # 5の倍数かつ7の倍数のとき
      puts "FizzBuzz"
    elsif (num % 5) == 0                # 5の倍数のとき
      puts "Fizz"
    elsif (num % 7) == 0                # 7の倍数のとき
      puts "Buzz"
    else                                # それ以外のとき
      puts num
    end

    num = num + 1
  end
end

fizz_buzz
```
これで完成です。
ちなみに、

```
if (num % 5 == 0) && (num % 7 == 0) # 5の倍数かつ7の倍数のとき
```

を

```
if (num % 35 == 0) # 5の倍数かつ7の倍数のとき=35の倍数のとき
```
と記述しても問題なしです。
文字列の間を正規表現で抜き出したい

文字列の間の抜き出しに手間取ったので、メモ。

## 経緯
文字列の前後が固定で、間にある文字を抜き出す

```
例:
下記を連結したファイル名や定数からサービス名部分を抜き出したい

COMPANY_SERVICE_OPTION
※命名規則がサービス会社_サービス名_OPTION
```

## パターン1
[こちらを参考](http://sugamasao.hatenablog.com/entry/20080403/1207243666)にして取得

```ruby

"COMPANY_SERVICE_OPTION".slice(/COMPANY_(.+)_OPTION/)
puts $+

SERVICE
```

｢$+｣はRubyの組み込み変数で他にもいろいろと[ある模様](https://techracho.bpsinc.jp/hachi8833/2017_01_31/33351)。
しかしながら、非推奨との記載もちらほら見かけたため下記パターン2を使用した。

## パターン2
[こちらのgsub記載を参考](http://ruby.kyoto-wu.ac.jp/documents/ruby-man-ja/String.html)にして取得

```ruby

puts "COMPANY_SERVICE_OPTION".gsub(/COMPANY_(.+)_OPTION/,'\+')

SERVICE
```

## パターン3(追記)
[scivolaさんからコメントいただいた方法](https://qiita.com/sakuraniumarete/items/ebf3e24161f62209a1bd#comment-56363e0fc20b8fe73c97)

```ruby

"COMPANY_SERVICE_OPTION".match(/COMPANY_(.+?)_OPTION/)[1]

SERVICE
```

以上です。
いいねやQiitaやTwitterのフォローいただけると励みになります！
他にも方法がありましたら、コメントお待ちしております。
宜しくお願いします〜

## 参考
[正規表現で間の文字列を抜き出したい](http://sugamasao.hatenablog.com/entry/20080403/1207243666)
[[Ruby] Kernelの特殊変数をできるだけ$記号なしで書いてみる](https://techracho.bpsinc.jp/hachi8833/2017_01_31/33351)
[String - Rubyリファレンスマニュアル](http://ruby.kyoto-wu.ac.jp/documents/ruby-man-ja/String.html)
Vuexの名前空間を使ったactionsをJestでMockする

## はじめに
[公式](https://vue-test-utils.vuejs.org/ja/guides/using-with-vuex.html)に名前空間を使わないactionsをMockする方法は記載されていますが、名前空間を使ったactionsのMock方法が見当たらなかったので、試してみてできた方法をここに記載します。

## やり方
### 対象のコンポーネント
こんなmethodsを持っているコンポーネントを想定します。

```vuejs
  methods: {
    ...mapActions('namespaceA', ['hoge']),
    ...mapActions('namespaceB', ['fuga']),
}
```
## Mock
こんな感じでMockできます。

```javascript
const localVue = createLocalVue()
localVue.use(Vuex)
const actions = {
  'namespaceA/hoge': jest.fn(),
  'namespaceB/fuga': jest.fn()
}

const wrapper = shallowMount(Component, {
    store: new Vuex.Store({
      actions,
      mutations: {},
      state: {},
    }),
    localVue
})
```

## テスト
こんな感じでテストできます。

```javascript
expect(actions['namespaceA/hoge']).toHaveBeenCalled()
expect(actions['namespaceB/fuga']).toHaveBeenCalled()
```

もしかしたら、もっとスマートな方法があるかもしれませんが、こういう方法もあるということで。。
Jest で テストをテスト仕様書っぽく書いてみよう

# jest-simple-template
いきなりですが、Jestの機能の一つ、describe.each を利用して、テストドキュメントっぽく テストを書く ライブラリを作りました。

https://www.npmjs.com/package/jest-simple-template

このパッケージを使うと、テストがこんな感じで書けます。

```javascript
import handler from '../src/target'
import mocks from './mocks'

/* data input */
let request = {}

/**
 * Test Case Definition
 *
 * [0]: test description
 * [1]: request(input)
 * [2]: expect(output)
 */
const testCase = [
    [
        // [0]: description
        {
            name: 'OK',
            description: 'should return succeeded response'
        },
        // [1]: request
        request,
        // [2]: expected
        (result: {}) => {
            expect(result).toBe(1)
        }
    ],
    [
        // [0]: description
        {
            name: 'Duplicated',
            description: 'should return duplicate something error'
        },
        // [1]: request
        request,
        // [2]: expected
        (result: {}) => {
            expect(result).toBe('error')
        }
    ]
    /* ここに、テストブロックをどんどん足していく */

]
 
describe.each(testCase)('Test Category1', (d, r, e) => {
    beforeEach(() => {
        jest.resetAllMocks()
    })
    const testMeta = d as TestCaseMetaData
    it(`${testMeta.name}:${testMeta.description}`, async () => {
        if (mocks.hasOwnProperty(testMeta.name)) {
            mocks[testMeta.name]()
        }
 
        // @ts-ignore
        const result = await handler(r)
        const expected = e as (result: any) => void
        expected(result)
    })
})
```
このテンプレートパッケージで、私的にはそこそこ快適にテストが書けていると感じたので、共有することにします。

# コンセプト
コンセプトとしては、Jest の describe.each は、引数に input、outputもまぜまぜにした Array を取り、ぐるぐる回す方式なので、配列の各 Index にこちらで意味を与えてやれば、テスト仕様書っぽく書けるのでは？ という発想が発端です。

describe.each に渡す配列のindexに以下のような意味を持たせます。

- index[0] - テストの説明
- index[1] - テストへの入力
- index[2] - 出力の検証

この発想は Rails の CoC(Convention Over Configuration) が元になっていて、ある程度名前付けなどを規約として決めてしまったほうがコードが読みやすく、短くなるのではないか？ というところから来ています。

# mocking
上の方法だけだと、Mockを書くのにテストが大きくなってしまい、せっかくのドキュメントが見づらいことになってしまったので、mockは別のファイルにしました。 ここでも CoC の考えかたを取り入れて、 先ほどの説明で、index[0] で定義したnameと一致するものを探して取ってくるようにしました。


```javascript

const mocks: Mocks = {
    OK: () => {
      // write the code of mocking some objects
    },
    Duplicated: () => {
      // write the code of mocking some objects
    }
}
 
export default mocks
```

結果、テストファイルは、describe.each が一つだけ。
テストの内容は、jest.describe の Arrayで表現した形が整いました。

みなさんのテストコードを書くのが少し楽になってくれたらよいなと思います。
Dockerの開発環境でGitHubを使用する方法

# 環境
macOS 10.15.5

# コンテナの中に入る
コンテナを起動し指定のコンテナの中に入ります。

```ruby:terminal
$ docker ps
$ docker exec -i -t コンテナ名 bash
```

# Gitをインストール
```ruby:terminal
apt-get update && apt-get install -y git
```
# ソースコードのダウンロード

```ruby:terminal
git clone https://github.com/〇〇/〇〇.git
```

# (必要に応じて）vimのインストール 

```ruby:terminal
apt-get install –y vim
```

# 例に倣いGitHubと連動
わたしが以前にブログをあげていますのでこちらを参照ください！
[GitHubの大まかな全体的な操作方法](https://qiita.com/chisaki0606/items/f4149259fc27a33f5f83)


**pushの際にUsenameとPasswordが求められますので下記の内容を入力します。**
Username for 'https://github.com': (GitHubのユーザー名)
Password for 'https://〇〇@github.com': (GitHubアカウントのパスワード)

**これで完成になります！Dockerの開発環境の構築のやり方も紹介していますので下記をご覧ください^_^**

[DockerでRuby on Railsの環境開発を構築](https://qiita.com/chisaki0606/items/a4b42af5c4735c94057a)
ubuntuアップデート(July 14th, 2020)

ubuntu16.04からubuntu20.00へ
#やったこと

```
sudo apt update
sudo apt install update-manager
sudo apt dist-upgrade
sudo do-release-upgrade -d
```

最後のコマンドを打った時点でrebootを要求された。
正味１時間くらいかかってインストール完了。

参考記事
https://qiita.com/hitobb/items/2ee9b1c2c49760976e0f

#インストール後やったこと
https://qiita.com/outou_hakutou/items/ce06cb3c8c355d5fd87c
ESP32用のArduino IDEインストールについて


https://dl.espressif.com/dl/package_esp32_index.json
を追加のボードマネージャに設定したが
そこが見えないらしい。
![2020-07-06 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/849cff07-873d-e817-64cc-a56589e377c6.png)

![2020-07-06 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/755c9ab6-13fb-633f-e916-1f610f040bdf.png)

数日後、再度アクセスしたら見れるようになったらしい。

で、ボードマネージャから esp32 を選んで 1.0.4 をインストールしようとしたら…

![2020-07-10 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/75fce87b-de7c-5c17-11e8-cb002035692b.png)

ダウンロード中にエラーが発生したらしい↓

![2020-07-10 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/d25249cf-8c56-82d6-623c-53bb305d2b5f.png)

２回目でダウンロード成功して↓の画面に。
![2020-07-10 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/5cce105e-f905-233c-f248-56b58ceff275.png)

以上でーす。
AブランチからBブランチまでの差分をリセット（同期する）

staging ブランチにをパブリッシュブランチとして使用していて
検証が終わったら、masterブランチと同じ状態に戻すのですが、毎回やり方忘れるので残しておきます:santa:


# TL;DR

- A ブランチから B ブランチまでの差分をリセット（同期）
- ```git diff branchB..branchA > ファイル名```(B を A に同期するファイルを作成)
- ```git apply ファイル名``` (B を A に同期する)

# 結論

```bash

git diff branchB..branchA > git.patch
git apply git.patch
```

# 例

stagingブランチ => masterブランチに合わせる場合

```bash

git diff staging..master > git.patch
git apply git.patch
```

# 導入例

上記に```rm -rf git.patch```と```git push```を```.circleci/config.yml```に追加して、定期的にstagingのお掃除させる(月曜AM9時)

```sync-master-with-staging.sh
#!/bin/bash -eu

git diff staging..master > git.patch
git apply git.patch
rm -rf git.patch
git push
```


```.circleci/config.yml

version: 2.1

jobs:
   sync-master:
    executor: container
    steps:
      - checkout
      - attach_workspace:
          at: .
      - run: ./scripts/sync-staging-with-master.sh

workflows:
   sync-master-every-monday:
    triggers:
      - schedule:
          cron: '0 0 * * 1' # 月曜日 AM9時
          filters:
            branches:
              only:
                - staging
    jobs:
      - sync-master
```
【HTTPメソッドのPATCH】

##PATCHとは
ブラウザからサーバーに情報を送信して、サーバー内の情報を書き換えることができるメソッドであり、登録情報の更新をする際などに利用される。

railsでeditアクションをして編集画面に遷移した後に実際に元あるデータを編集するときは
updateアクションを実行することになるが、その際のルーティングとしてHTTPメソッドのPATCHを利用することでupdateアクションを起動させてデータを更新することができる。
flutter-webを起動する

## channelをbetaに切り替える
[flutter-web](https://flutter.dev/web)はbetaで提供されているので、channelを切り替える。
※ channelとはブランチみたいな認識で多分良い。

```
flutter channel beta
```

## 切り替えたchannel先でupgradeをする
channelごとにソースが別で管理されているので、都度ソースを更新してあげる必要がある。
そのためのコマンドが以下の通り

```
flutter upgrade
```

## flutter-webが使えるようになっているか確認する
chromeを使っていれば以下のように表示された。

```
flutter devices
2 connected devices:

Web Server • web-server • web-javascript • Flutter Tools
Chrome     • chrome     • web-javascript • Google Chrome 83.0.4103.116

```

上記の状態で以下コマンドを実行すればflutter-webが起動する。
もしくは、AndroidStudioのデバイスを選択して起動してみよう。

<img width="484" alt="6783539c00530c1d51eebbd133daeb21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126370/b3f4a708-6536-02ad-ab05-72195fee06b0.png">

起動後にlocalhostのアドレスが表示されるのでアクセスしてみよう。

```
flutter run -d chrome
```