OmniAICreator/Qiita-1.07M huggingface dataset:
PRML 演習問題 2.6 （基本）

## はじめに
本記事は, 機械学習の教科書の決定版ともいえる, **Christopher Bishop先生**による[**『Pattern Recognition and Machine Learning （パターン認識と機械学習）』**](https://www.microsoft.com/en-us/research/people/cmbishop/prml-book/), 通称**PRMLの演習問題の解答**を記したものです. これは, [**生物測定学研究室**](https://www.ut-biomet.org/)の輪読会でPRMLを取り扱っており, その勉強の一環として演習問題を解いたときのもので, **匿名の有志の学生による解答をこちらのアカウントから代わりに投稿**させていただいています.　（なお一部数式の表現などを修正してあります.）




## 問題
>**2.6**（基本）（2.265）の結果を用いて、ベータ分布（2.13）の平均、分散、およびモードがそれぞれ
$$
\begin{align*}
\mathbb{E}[\mu] = \frac{a}{a+b} \tag {2.267} ,
\end{align*}
$$
$$
\begin{align*}
\operatorname {var}[\mu] = \frac{ab}{(a+b) ^ 2 ( a + b + 1)}\tag {2.268},
\end{align*}
$$
$$
\begin{align*}
\operatorname {mode}[\mu] = \frac{a-1}{a + b -2}\tag {2.269}
\end{align*}
$$
>になることを示せ.
（モードとは、最頻値のこと）

## 解法
まず、

```math
  \int_0^1 \mu^{a - 1}(1 - \mu)^{b - 1} d\mu =  \frac{\Gamma(a)\Gamma(b)}{\Gamma(a + b )}  \quad(2,265)\\
```

を前提とする。
また、簡便のため

```math
K = \frac{\Gamma(a)\Gamma(b)}{\Gamma(a + b )} 
```

とする。
期待値は確率分布$\mu \times p(x)$の積分で求められるため、(2.267)は(2.265)より

```math
  \frac{1}{K}\int_0^1 \mu^{a}(1 - \mu)^{b - 1} d\mu = \frac{1}{K}\frac{\Gamma(a+ 1)\Gamma(b)}{\Gamma(a + b + 1)} \\
= \frac{1}{K}\frac{a}{a+b}\frac{\Gamma(a)\Gamma(b)}{\Gamma(a + b)} = \frac{K}{K}\times\frac{a}{a+b} \\
 = \frac{a}{a+b}
```

よって、(2.267)を示すことができた。
(2.268)については、確率変数の2乗の期待値を用いて計算する。

```math
\mathbb{E}[\mu^2] = \frac{1}{K}\int_0^1 \mu^{a+1}(1 - \mu)^{b - 1} d\mu \\
= \frac{1}{K}\frac{a+1}{a+b+1}\frac{\Gamma(a+1)\Gamma(b)}{\Gamma(a + b+1)} \\
= \frac{1}{K}\frac{a(a+1)}{(a+b+1)(a+b)}\frac{\Gamma(a)\Gamma(b)}{\Gamma(a + b)}  \\
= \frac{a(a+1)}{(a+b+1)(a+b)}
```

この式と、分散の公式

```math
\operatorname {var}[\mu] = \mathbb{E}[\mu]^2 - {\mathbb{E}[\mu]^2}
```

より、

```math
\operatorname {var}[\mu] = \mathbb{E}[\mu^2] - \{\mathbb{E}[\mu]\}^2 \\
= \frac{a(a+1)}{(a+b+1)(a+b)} - \frac{a^2}{(a+b)^2} \\
= \frac{a(a+1)(a+b)-a^2(a+b+1)}{(a+b+1)(a+b)^2} \\
```

```math
= \frac{(a^{3} + a^{2}b+a^{2}+ab-a^{3}-a^{2}b-a^2 )}{(a+b+1)(a+b)^2}  \\
= \frac{ab}{(a+b+1)(a+b)^2} 
```

最後に、ベータ関数の最頻値の式（2.269）を求める。
(2.265)は上に凸であること、Kが正であることから、

```math
f(x) = x^{a-1}(1 - x)^{b - 1} \\
```

とおき、微分係数が $0 < x < 1$ で最大になる$x$を求める。

```math
f'(x) = \{(a-1)(1-x)-(b-1)x\}x^{a-2}(1 - x)^{b - 2} \\
= (a-ax-1+x-bx+x)x^{a-2}(1 - x)^{b - 2} = 0
```

このとき、$0 < x < 1$では$x$と$(1-x)$はそれぞれ正のため、最初の係数を考えると

```math
(a+b-1)x = a-1 \\
x = \frac{a-1}{a+b-1}
```

また、この値を$p$とすると、$0 < x < 1$において

```math
  \left\{
    \begin{array}{l}
      f'(x) > 0 \quad(0 < x < p) \\
      f'(x) = 0 \quad (x=p)\\
      f'(x) < 0 \quad(p < x < 1)\\
    \end{array}
  \right.
```

となるため、$f(x)$を最大とする$x$は$p$である。
よって、ベータ関数の最頻値は$x = \frac{a-1}{a + b -2}$の時であることが示された。 ■
UE4の勉強をこれから更にがんばる。インストール方法とか。勉強方法とか。

※はじめに
これを書いてる時の最新バージョンは4.25.1です。


#UE4の公式サイト等

（公式サイト）
・https://www.unrealengine.com/ja/

（YouTube）
・https://www.youtube.com/user/unrealenginejapan

（Twitter）
・https://twitter.com/UnrealEngineJP
・https://twitter.com/UnrealEngine


##UnityではなくUnrealEngine(現UE4）を選んだ理由
単純に　<font color="DeepPink">
**・操作画面がカッコいい
・グラフィックがきれい**</font>

次世代ゲーム機のPS5にもUnrealEngineが使用されています。

#インストール方法

公式が分かりやすく説明してくれてるのでここ見るのが早いと思う。
・https://docs.unrealengine.com/ja/GettingStarted/Installation/index.html

#UnrealEngineの勉強について
日本語部分も多いけど英語のままのところあるから読めない人はDeepL翻訳使いながら勉強するのがおススメ！

・翻訳サイト
https://www.deepl.com/ja/translator
（デスクトップアプリもあるよ）

・UE4触ったことがなくて無料でゆっくり進めるならYouTubeでやってるオンラインラーニングがいいと思います！

猫でも分かる UE4を使ったゲーム開発 超初級編
（https://www.youtube.com/watch?v=ztv4OPc_o6g）


有料動画だと
Udemy（https://www.udemy.com/）
がよかった。

自分はセール中に（約1500円くらい）これを購入しました。
（https://www.udemy.com/course/unreal-engine-4-award/）
4.17.1で進みますが、DLできなかったので（する方法が見つけられなかっただけならごめんなさい）4.17.2で進めましたが一応最後まで進めれました。

動画のレクチャー部分ごとに質問がわかれてるので困ったときに同じ質問内容のものを見つけやすかったです。


普段は数万したりと高いのでお金に余裕がない人はたまにやってるセール中に買うのがいいです。

でも元の値段が高いだけあって品質はしっかりしてると思いました！（個人的な意見）

質問してアンサーまでのレスポンスも速かったです！！

#他色々

・ランチャーからマーケットプレイス（Unityでいうアセットストア）で毎月無料で配布されたりしてるので（環境とかブループリントとかアニメーションとかエフェクトとかモデルとか）慣れてきたらそれらをつかってゲーム作るのもいいと思います！

自分は今Niagaraシステム（エフェクト作るやつ）の講座をいろいろ探しながら試行錯誤中です！（まだ全然分かってない）

次からはいろいろ自分用のメモとか書いていこうと思います！

【#魔物の個人的UE4メモ】っていうハッシュタグ使ってちょくちょくツイートしてるのでよかったらフォロー｛@ma_mo_no_da｝してください（切実）
javascriptのオブジェクトをループさせる

javascriptで結構需要がある処理だと思われるオブジェクトのループについてです。 

## オブジェクトは`forEach`できない
`forEach`は配列に対して動作するので

``` js
let obj = {
  name: 'Jhon',
  age: 20,
  message: 'Hello'
}
```
上記のようなオブジェクトは
`obj.forEach(e => {})`とするとエラーになります。

## どうするか
`Object.keys()`ってのを使います。

``` js
let obj = {
  name: 'Jhon',
  age: 20,
  message: 'Hello'
}

Object.keys(obj).forEach((e) => {
  console.log(e)
  console.log(obj[e])
})
```

こうすることで`e`に`name`、`age`、`message`とキーが入ってきます。  
なので`obj[e]`としてやれば値が取得できます。  
また`forEach`の第二引数を使って

``` js
Object.keys(obj).forEach((e) => {
  console.log(e)
  console.log(this[e])
}, obj)
```
のようにするとループ内の`this`で`obj`が扱えます。  
ループ内の関数で外の変数参照させたくないって思う方はこちらを使いましょう。

## まとめ
オブジェクトをループで処理したいなら`Object.keys()`を使いましょう。  
オブジェクトをループで回すこと自体が設計ミスなのかもしれませんが、共通処理であったりはループでちゃちゃっと書きたかったりするので利用シーンは結構あると思います。
GUIが使えない環境でghコマンドを使えるようにする方法

# 1行で
personal access tokenを作成して、config.ymlを手動で作成する

# 詳しく

## repositoryとgistの権限のあるpersonal access tokenを作成

1. https://github.com/settings/tokens/ にアクセスする
1. repositoryとgistの権限を選択する（下記の画像参照）
<img width="395" alt="スクリーンショット 2020-06-07 16.42.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49498/f3541714-ae6a-2e6f-f8d5-1440c8495f1a.png">
1. generate token ボタンを押下する
1. 生成される token をコピーしておく。 config.yml を作成するときに使います。

## config.ymlを [gh repository](https://github.com/cli/cli/blob/103666626630c8a689c3ae38689285e4e8040574/command/config_test.go#L12-L16)を参考に手動で作成する

1. フォルダを作成する

    ```sh
    mkdir -p ~/.config/gh/
    ```

1. config.yml のフォーマットを [gh のレポジトリ](https://github.com/cli/cli/blob/103666626630c8a689c3ae38689285e4e8040574/command/config_test.go#L12-L16)で確認する
<img width="430" alt="スクリーンショット 2020-06-07 16.47.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49498/a44335fe-12b0-adc8-ca94-be34e719601b.png">
1. config.yml をeditorで開く

    ```sh
    vi ~/.config/gh/config.yml
    ```

1. config.yml を上記のフォーマットを参考に作成する

    ```yaml
    hosts:
      github.com:
        user: your_github_username
        oauth_token: your_token # (直前の手順で生成した personal access token を貼ってください)
    ```

2. 適当なディレクトリで動作確認（エラーが出なければOK）

    ```sh
    gh pr status
    ```

# どうやってこの方法に至ったか

1. guiが使えない環境で認証しようとすると以下のようなメッセージが表示された。

    ```sh
    If you are on a server or other headless system, use this workaround instead:  1. Complete authentication on a GUI system  2. Copy the c
ontents of ~/.config/gh/config.yml to this systemthe access token could not be read from HTTP response
    ```

1. なるほど。なんかわからんが、 `~/.config/gh/config.yml` をうまく生成してやればいいのねとわかった。

1. あとはそのフォーマットと内容が判断できれば良い。
フォーマットは [gh のレポジトリ](https://github.com/cli/cli/blob/103666626630c8a689c3ae38689285e4e8040574/command/config_test.go#L12-L16) を見に行くと、めっちゃテストしてあってすぐわかった。(githubの人たちちゃんとしてるなー。)

1. 最後に権限は[これまたテスト内容](https://github.com/cli/cli/blob/103666626630c8a689c3ae38689285e4e8040574/command/config_test.go)を見に行くとrepositoryとgistの権限をテストしているので、この2種類さえあれば良いとわかる。
1. 今回の手順が判明。（若干パズル説いてる感があって面白かったのと、エンジニアだからソース読みに行ったらちゃんと分かるんだなと言う気持ちになった。）

# 謝辞

[GUIが使えない環境でのghコマンドの認証方法](https://qiita.com/sameyasu/items/48f7f214ff7724330699) も参照させてもらった。
ただ、私の手元ではうまくいかなかった。より確実な方法を見つけたので載せる。
Ubuntu20.04LTS日本語を入れました。

#Ubuntu20.04とは
- セキュリティとパフォーマンスの向上
- MicroK8sを用いて攻撃の拡散を阻止
- Fast ID Onlineの導入
- 多要素認証

[参考](https://ubuntu.com/blog/ubuntu-20-04-lts-arrives)

#環境
- パソコン工房で購入したOSなしのパソコンにUbuntuを入れます。
- [AMD Ryzen 7 3700X[8コア]とGeForce RTX 2060 SUPER搭載・クリエイター向けミニタワーパソコン](https://www.pc-koubou.jp/products/detail.php?product_id=709425)

#ライブUSBメモリの作成

- balenaEtcherを用いてUbuntu20.04LTSをUSBに書き込む。


[参考](https://linuxfan.info/make-linux-install-usb-on-windows)

#ubuntuの起動 
1. usbをPCにさす。
2. パソコンを起動する。
3. パソコンの起動時にF2を押す
4. UEFI BIOSに入る。
5. AHCHIモード、SecureBootモードの解除,CSMモードを有効にする
3. ubuntuの指示に従ってボタンを押す。

[参考1](https://ubuntu.com/tutorials/tutorial-install-ubuntu-desktop#11-installation-complete)
[参考2](https://www.archlinux.site/2018/03/usbuefiubuntu.html)

#エラー
`initramfs unpacking failed: Decoding failed`
ログインループ
ubuntuが起動しない。

#原因
usbをパーテーション分けをしていたため。
「コンピュータの管理」からパーテイションを変更できます。
[Flutter]リストを作成

`ListView`,`ListTile`を用いることでリストが作成できる

ex.

```
      body: Container(
        child: Container(
          width: double.infinity,
          child: ListView(
            children: <Widget>[
              ListTile(
                leading: Icon(Icons.map),
                title: Text('Map'),
              ),
              ListTile(
                leading: Icon(Icons.photo_album),
                title: Text('Album'),
              ),
              ListTile(
                leading: Icon(Icons.phone),
                title: Text('Phone'),
              ),
            ],
          ),
        ),
      ),
```

<img width="334" alt="スクリーンショット 2020-06-07 16.41.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/f2931f5b-cab9-5c8e-cd83-12bc3bdc6564.png">

---

`GridView`で１行に複数のリストを並べることができる

ex.

```
      body: Container(
        child: Container(
          width: double.infinity,
          child: GridView.count(
            // Create a grid with 2 columns. If you change the scrollDirection to
            // horizontal, this produces 2 rows.
            crossAxisCount: 2,
            // Generate 100 widgets that display their index in the List.
            children: List.generate(100, (index) {
              return Center(
                child: Text(
                  'Item $index',
                  style: Theme.of(context).textTheme.headline5,
                ),
              );
            }),
          ),
        ),
      ),
```

<img width="329" alt="スクリーンショット 2020-06-07 17.05.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/3696f439-5cee-a786-a02f-4be8a0d086d7.png">
個人的に勉強になったHTMLマークアップ

HTML、CSSを書いていて実務に入った時に、フロントエンドエンジニアにレビューで指摘されたことなどとかをまとめていく（ほぼ自分用）

##前提条件
・HTML、CSSの技術書勉強はやった人向け
・script(vanilla javasccript)は書かない
・なるべくSCSSでかこう

現役のフロントエンジニアからの指摘が怖い...





##IDは使わない
よく詰まった時に見る記事とか`HTML`,`CSS`の技術書を見ている時に
idが多用されていることがある。

```html
<div id="hogehoge__1">
  <div id="hogehoge__2">
    <p id="hogehoge__3">pタグの中身</p>
  </div>
</div>
```

結局実務に入らないと分からなかったし、これはチームのコーディング規則（こーゆーふうに書こうよ！）的なところに依存するかもですけど、僕の師匠はidは指定しないを徹底していて、それに合わせて僕もコーディングしています。

`id`でできることは`class`でできるし、`id`で指定してしまうと優先度（詳細度）が高すぎて
`CSS`であとでスタイルを当てた際にスタイルが適用されないです。

まぁそもそもid自体が一つのHTMLに一つしか設定してはいけないというのが鉄則なのですが、
実装方法に迷って記事とかを見た時などにこのパターンがあり、
困ってる人他にいないか？と思って参考にこれを書きました。

##CSSよりSCSS（SASS）を使おう

WEBの勉強をし始めた頃はあまり可読性や再利用可能なコンポーネント思考というものを考えていなかったのですが、基本的にプログラミングをしていくに当たって以下のことはすごく大切なことです。

・再利用
・可読性（わかりやすいコード）
・メンテナンス性
・共通化


そこでのSCSSなのですが、
基本的な書き方はCSSと同様にできて、＋で変数や関数、ネストや、`import`,`mixin`,`extend`とかいろいろあります。
CSSで書くよりSCSSで書いた方がコードの量も少なくなりますし、見やすくなります。

めちゃくちゃ便利なのですが、あまりSCSSの機能全快で頑張ると可読性がガタ落ちするので、便利なところだけ使うと個人的にはいい気がします。どうですかね...？

簡単な例として

```html
<div class="content">
    <div class="main__wrap">
      <p class="main__text">hogehoge</p>
    </div>
    <div class="secondary__wrap">
      <p class="secondary__text">hogehoge</p>
    </div>
  </div>

```



```css
.main__wrap {
 background-color: red;
}
.secondary__wrap {
 background-color: red;
}

```


こうゆう風に`main__wrap`,`secondary__wrap`というクラスを持った要素に対して
背景色を赤にしていた場合、赤を青にしたくなったら、

```css
.main__wrap {
 background-color: blue;
}
.secondary__wrap {
 background-color: blue;
}

```

こうなると思います。

2箇所の修正くらいなら簡単だし漏れがなく修正可能だと思いますが、
プロダクト全体に関わるような修正だとめんどいよねって感じになります。

ここでSCSSを使うと以下のようになります。

```scss:main.scss
$primary-color: blue;

.main__wrap {
 background-color: $primary-color;
}
.secondary__wrap {
 background-color: $primary-color;
}
```

これは`$primary-color`という変数に使用する色を定義して(ここではblue)、
`background-color`の指定時に定義した色を使用しています。
`$primary-color`の色を変更するだけで変更が意図した箇所に反映されます。

もっというと、

```scss:_color.scss
$primary-color: blue;
```

```scss:main.scss
@import "./color.scss";

.main__wrap,
.secondary__wrap {
 background-color: $primary-color;
}

```

こうゆう感じで短く書くことも可能です。



##divを使って文章構造体を意識する

HTMLのタグはめちゃくちゃ多くて、例えば、

これはテスト用の文章です。

↑これを書く時に

```html
<p>これはテスト用の文章です。</p>
<p>これはテスト用の文章です。</p>
<p>これはテスト用の文章です。</p>
<ul>
  <li>これはテスト用の文章です。</li>
  <li>これはテスト用の文章です。</li>
  <li>これはテスト用の文章です。</li>
</ul>
```

こんな感じでかけます。
何が違うかの話になると、
`pタグ`はパラグラフの意味で、段落を指します。
対して`liタグ`はリストの意味で、こんな感じで親の文があって使います。


【以下のルールを守る】
・Twitterは開かない
・席は立たない
・私語は慎む


要約するとタグの使い分けは明確に自分で作りたい文章に則ってやろうという話。
別にリストじゃないところで`<li></li>`を使う必要はないし、逆も然り。
たまに`<h1>`が並んでることがあって戦慄しそうになるのはよくある話。



##まとめ



いかがでしたでしょうか。
比較的初学者に向けたものになっているかと思います。
かくいう自分も最近勉強を始めたものですが、
如何せん調べても載ってなかったり、個人や、界隈の闇が垣間見える箇所になるかなと思います。
諸説あるような話が多いですが、何かの参考になればと思います。
Dockerノート


# Docker 基本コマンド

```bash
docker run <コンテナ名>[:version | :latest]

# run は以下のコマンド1-3を順に実行している
# 1. イメージ取得
docker pull <コンテナ名>

# 2. コンテナ作成
docker create <コンテナ名>

# 3. コンテナ起動
docker start <コンテナ名>

# コンテナ停止
docker stop <コンテナ名>

# コンテナのディレクトリをホストにコピー
docker cp <コンテナID>:<コンテナのディレクトリ＞ <ホストのディレクトリ>

# ホストのディレクトリをコンテナのディレクトリにコピー
docker cp <ホストのディレクトリ> <コンテナID>:<コンテナのディレクトリ>

# コンテナへのシェル接続(PID 1プロセスへの接続)
# exitで抜けるとコンテナが停止する。Ctr + p + q でコンテナは起動したまま抜けられる
docker attache <コンテナID>

# コンテナへのシェル接続(新しいプロセスへの接続)
# exitで抜けてもコンテナは起動したまま
docker exec <コンテナID>

```

## docker run オプション

```bash
-p <ホストのポート>:<コンテナのポート>　：ポートフォワーディング
    docker run -p 8080:80 nginx

-d：detachedモード、バックグラウンド実行みたいなこと。ターミナル終了してもプロセスは生きたまま

--name：コンテナ名指定

-v <ホストのディレクトリ>:<コンテナのマウントポイント>:<オプション>
    docker run --name sample -v /usr/local/html:/usr/share/nginx/html:ro -d -p 8080:80 nginx

-t：pseudo-TTYを割り当てる

-i：標準入力を保持する

```



```bash
# ダウンロード済みDockerイメージ一覧
docker images

# Dockerイメージの削除コマンド
docker rmi <コンテナ名>

-f : 強制削除

# 実行中のコンテナのリスト表示
docker ps

# 停止中のコンテナを含めて表示
docker ps -a

# コンテナ削除コマンド
docker rm <コンテナ名>

# イメージ詳細
docker inspect <コンテナ名>

# イマージのビルド
#  -t <イメージ名>：イメージ名、タグ名の指定
#  <ビルドコンテキスト>：ここで指定したディレクトリがDockerデーモンに転送される。
#    ドットを指定すると、コマンド実行したディレクトリがビルドコンテキストとなる。
#    ビルドコンテキスト上にあるファイルのみがDockerイメージに取り込み可能。
docker build -t <イメージ名> <ビルドコンテキスト>


```

# Dockerfile

Dockerイメージは、Dockerfile を元に作成される

1. Dockerfile：イメージ作成の定義ファイル
2. Dockerイメージ：コンテナ作成のためのテンプレート
3. コンテナ：アプリケーション実行環境

Docker Hub: https://hub.docker.com

## 命令

### FROM
新しいDockerイメージのベースとするイメージを指定する。（ベースイメージ）

### RUN
イメージ作成時に実行するコマンドを指定する。

### CMD
コンテナを実行した際に、デフォルトで実行されるコマンドを指定する。
docker run コマンドのイメージ名の後にコマンドを指定した場合は、CMD命令を上書きして実行される。

### ENTRYPOINT
CMDと異なり、docker run コマンドのイメージ名の後にコマンドを指定した場合は、ENTRYPOINTのコマンド引数に docker run で指定したコマンドが渡されてコマンドが実行される。

### ENV
イメージに設定する環境変数を定義する。

### ARG
イメージのビルド時に一時的に使用する環境変数。EVNとは異なり、イメージ上には環境変数は保持されない。

### USER
コンテナ内のコマンドを実行するユーザを指定する。省略時は、rootユーザで実行する。

### WORKDIR
作業ディレクトリを移動するために使用する。

### ADD
ローカルファイルをイメージにコピーする指定。
tarファイルやURLも指定可能。

### COPY
ローカルファイルをイメージにコピーする指定。
tarファイルやURLは指定できない。


# References
* 『ITエンジニアになる！チャレンジDocker仮想環境構築入門』秀和システム
docker-composeでサクッとpython環境を

# はじめに
ちょっとpythonコンパイルしたいけど、macの環境はデフォルトの場合インストールはめんどいよね。コンテナで環境作っちゃおう。

# 完成品

```docker-compose.yml
version: "3"
services: 
  py38:
    image: python:3.8
    container_name: py38
    volumes:
      - ./code:/code
    working_dir: /code
    tty: true
```

## 下準備

```
# 適当にディレクトリ作って
$ mkdir py38 && cd py38
# docker-compose ファイル作成して
$ touch docker-compose.yml
# 上のコードをコピペ
```

## 動かし方

```
# ビルドしながら動かす
$ docker-compose up -d --build
# コンテナへの入り方
$ docker exec -it py38 bash
# コンテナからの出かた
$ exit
# コンテナの止め方
$ docker-compose stop
# コンテナの終わらせ方
$ docker-compose down --volumes
```

特にマウントしていないから大丈夫だと思うけど、一応ボリュームも消しておくとPCは汚れないと思います。

# 使い方

コンテナをたてた時点で、`docker-compose.yml`があるディレクトリに`code`というディレクトリが作成されると思います。そのディレクトリの中にコードを追加していきましょう。
コンパイルしたい時は、コンテナの中から`python test.py`的な感じで動かしてもらえばできると思います。

# おわりに

前にこんなのもやってので、よければ見てみてください。
[jupyternotebookでselenium(with docker-compose)](https://qiita.com/yCroma/items/6ba471bc5fa7eb7dfa53)
AWS CloudFormationでテンプレートのアップロードに失敗する

AWSのcloudFormationでテンプレート(YAML)をアップロードしようとすると、アップロードエラーになり次に進めない。

原因
Chromeブラウザだとキャッシュの削除等をしないと失敗する場合があるようです。
FireFoxで試してみたところ無事アップロードできました。

![スクリーンショット 2020-06-07 16.45.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297660/d3451277-236d-8192-e565-8ec03ccfdae2.png)


参考記事
https://stackoverflow.com/questions/58125181/cloud-formation-cant-upload-template-file
JavaScriptでNumberの違いについて

#はじめに
私は<font color="Teal">**parseIntとNumberの性質の違い**</font>についてあまり理解せずに使っていました。JavaScriptのアルゴリズムを立てる時に躓いてしまい違いについてて詳しく調べたのでアウトプットとして書きます。

##そもそもparseIntとNumberとは
###Numberについて
- Numberオブジェクトは、JavaScriptで扱う<font color="OrangeRed">**「数値」の整形や定数など**</font>を利用するために使うのが一般的です。主に、「プロパティ」と「メソッド」の2つに分かれているのは一般的なオブジェクトと同じです。
- Numberオブジェクトを活用すれば、<font color="OrangeRed">値が数値であるかを検証したり文字列を数値に変換する</font>など多彩なことが実現できます。

###parseIntについて
- parseIntとは、<font color="OrangeRed">**文字列を整数に変換する**</font>JavaScriptのグローバル関数です。(グローバル関数とは、JavaScriptのプログラムのどこからでもアクセスし、使用可能である関数です。)
- parseIntの正式な使い方
parseIntはparseInt("123")のように使われることが多いものの、本来は`parseInt( 変換したい文字列 , 何進数かを明示 );`で使用可能です。

#違いについての具体例 

`ケース1：「5日」 （ 半角数字 + 漢字 ）`
`ケース2：「0.３」 （ 小数 )`

でparseIntとNumberの違いを比べて見ます
###Numberの場合
```javascript:hello.js
Number("5日") // NaN
Number("0.3") // 0.3
```
###parseIntの場合
```javascript:hello.js
parseInt("5日") // 5
parseInt("0.3") // 0
```

となります。
##比較結果
####ケース1
- parseIntは数字だけ解析して取り出すことが可能です。
- Numberは数字と文字が混ざってしまっていると取り出せないのでNaNと表示されています。

####ケース2
- parseIntでは情報が欠落してます。parseIntは整数専用です。この場合はparseFloat()を使いましょう。

####結果
- 役割の違いを考えて使うのがいいと思いました。
- <font color="OrangeRed">**通常の10進数の取り扱いに関して**</font>は、Numberを使うことをオススメらしいです。
- しかし、<font color="OrangeRed">**2進数や8進数などの特殊な計算**</font>においては、parseIntの利用を検討すると良いでしょう。

#最後に
parseIntとNumberにはそれぞれ便利な役割があるので使い分けられ流ようになりたいと思いました!

#参考リンク
[JavaScriptでNumberオブジェクトの使い方](https://techacademy.jp/magazine/153350"JavaScriptでNumberオブジェクトの使い方")
Chrome拡張でJSを注入する際、DOM構築完了を待たないための手法

## 前提知識
### Content Scriptとは
Chrome拡張において、webページとDOMを共有しているファイルのこと。ただし、JavaScriptが実行される環境は、webページのそれと独立である。つまり、一方の環境内で定義された変数および関数は、もう一方からは触ることができない。
### "run_at" : "document_start"
とにかく最速でContent Scriptを走らせるための設定。まだDOM構築もされていないし、他のscriptも読み込まれていないタイミングである。普通選ぶ必要がないが、この記事ではこの設定が前提。
### webページのJS環境を触るには
webページのJS環境で実行したいスクリプトを別ファイル（あるいは文字列リテラル）で用意しておき、DOMに`<script>`タグとして注入することで解決する。
（https://qiita.com/suin/items/5e1aa942e654bce442f7 および https://stackoverflow.com/questions/20499994/access-window-variable-from-content-script を参考）

## 問題
上記手法では`getElementsByTagName()`でheadなりbodyなりを取得し、そこに注入したいscriptをぶら下げる方法を取っている。普通これで問題ないが、スクリプト実行をDOM構築まで待てない場合には使えない。
## 解決法
```content-script.js
function injectScript(file) {
    const s = document.createElement('script');
    s.setAttribute('type', 'text/javascript');
    s.setAttribute('src', file);
    return (document.head||document.documentElement).appendChild(s);
};

injectScript(chrome.runtime.getURL('/embedded-script.js'));
```
`document.documentElement`はheadとは違い、`"run_at" : "document_start"`のタイミングで呼び出しても存在している。
デベロッパーツールのSourceタブを見ると、埋め込んだ`<script>`タグが、`<head>`タグよりも前にあるのが確認できる。
## 参考
- https://developer.chrome.com/extensions/content_scripts
- https://qiita.com/suin/items/5e1aa942e654bce442f7
- https://stackoverflow.com/questions/20499994/access-window-variable-from-content-script
- https://stackoverflow.com/questions/9515704/insert-code-into-the-page-context-using-a-content-script
- http://www.jspatterns.com/the-ridiculous-case-of-adding-a-script-element/
今度はAlertmanagerからTypetalkに通知するためWebhookしたというだけ

[GrafanaからTypetalkに通知したいのでWebhookした \- Qiita](https://qiita.com/ckit_idle/items/01462c3e90884f8b6d1d)

今度はAlertManagerから送信したくなったが、

[Support notification for Typetalk? · Issue \#1669 · prometheus/alertmanager](https://github.com/prometheus/alertmanager/issues/1669)
とのことで、Webhookを作るしかない

→[ckitidle/alertmanager\_to\_typetalk: Webhook for transferring notification from Alertmanager to Typetalk\.](https://github.com/ckitidle/alertmanager_to_typetalk)
TechAcademyが無料公開している「HTML・CSS入門講座」を受講する～HTML第2-3回～

# アジェンダ
* HTMLのタグ
 * blockquote
 * q
* HTMLの属性
 * cite
* 実践

# HTMLのタグ
## blockquote
引用された文書であることを示すタグ。
文書全体が引用である際に用いる。

## q
引用された文章であることを示すタグ。
文書中の一部が引用である際に用いる。

# HTMLの属性
HTMLの属性とは、タグの補足情報を示すものである。
タグの\<>内に記載する。

## cite
引用元を示す属性。値にはURLを記載する。
cite属性を付加させても、Webページの表示は変化しない。

# 実践
上記のタグ・属性を用いて、以下のindex.htmlを作成した。

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

<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>引用の使い方</title>
  </head>
  <body>
    <h1>Lorem Ipsumとは</h1>
    <p>
      Wikipediaによると、Lorem Ipsumは<q>出版、ウェブデザイン、グラフィックデザインなどの諸分野において使用されている典型的なダミーテキスト</q>である。
      以下が、Wikipediaの本文である。
      <blockquote cite="https://ja.wikipedia.org/wiki/Lorem_ipsum">
        lorem ipsum（ロレム・イプサム、略してリプサム lipsum ともいう）とは、出版、ウェブデザイン、グラフィックデザインなどの
        諸分野において使用されている典型的なダミーテキスト。
        書籍やウェブページや広告などのデザインのプロトタイプを制作したり顧客にプレゼンテーションしたりする際に、
        まだ正式な文章の出来上がっていないテキスト部分の書体（フォント）、タイポグラフィ、レイアウトなどといった
        視覚的なデザインを調整したりわかりやすく見せるために用いられる。
      </blockquote>
    </p>
  </body>
</html>
```
> 引用 : [Wikipedia](https://ja.wikipedia.org/wiki/Lorem_ipsum)

これをWebブラウザで表示させるとこんな感じ。
![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648214/d86012e9-092f-1fb1-076f-7ef545ddf860.png)

\<p>タグを使用した引用箇所は、自動で「」で囲われている。
\<blockquote>タグを使用した引用箇所は、新たなブロック要素として表示され、インデントが深くなっている。

# おわりに
今回は、引用に関する内容だった。
ブログを書く際には、必要になってきそうだ。

次回 >> ☆まだ☆

## 参考
[2-3 引用（HTMLのテキスト）](https://www.youtube.com/watch?v=aprp-WLaxws&list=PLjw-30bsJNVU87F5iCPAW9kB4QDUGQxUG&index=7)

[htmlの属性 - とほほのWWW入門](http://www.tohoho-web.com/html/memo/attr.htm)
WindowsでNICの優先度を変更して参照するDNSを変える

## 背景
社内で使っているPC（Windows10）はDNSとしてADサーバを参照するようにしているが、別システムにVPNで接続する際にOutlook(Office365)との接続が切れる事象が発生。

DNSがどちらに向いているかはnslookupで調べることができる。

```
C:\Users\User> nslookup
既定のサーバー:  UnKnown
Address:  192.168.1.1
```
この結果、VPN接続時はADサーバではなく、別システムが参照しているDNSを見ていることが判明。

## 解決策
NICの優先度を調整してDNSサーバをローカルで使用しているDNSに向くようにする。
優先度はメトリック値が低い方が優先されるので、今回はVPNのNICのメトリック（インターフェースメトリック）をLANより高くする。
現状のインターフェースメトリック値を確認するにはPowershellでGet-NetIPInterfaceコマンドで確認可能。

## インターフェースメトリックの変更方法

1. "コントロール パネル\すべてのコントロール パネル項目\ネットワーク接続" を開く
2. 当該VPN接続を右クリックし、プロパティを表示
3. ネットワークタブを開き、TCP/IPv4のプロパティを表示
4. 詳細設定ボタンをクリック
5. IP設定タブを開き、自動メトリックのチェックを外す
6. インターフェースメトリック欄にメトリック値を入力する
【IT初心者向け】Git Bashでrevコマンドが使えないときの対処法

## イントロダクション
WindowsでGit Bashを使っていて、
######　　**<font color=red>「このコマンド実装されてないじゃん！」</font>**
と思うことありませんか？
私の場合は、**rev**というコマンドを使いたかったのですが、Git Bashに実装されていなくて困っていました。

ネットで調べててもなんか難しいこと書いててよくわからないし、そもそも**rev**がどういうパッケージやライブラリーに入っているのかもよくわからなかったです。。。
（ちなみに**Chocolatey**とかいうやつが何やら便利らしいのですが、うまく実装できなかったので諦めました、、、）

## たどり着いた対処法
いろいろ悩みながら調べた結果、
####「busyboxにrevコマンドが実装されている」
ということに気が付きました。
![rev command.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650537/cd3fffd8-d2bc-7263-3feb-df75f9028487.png)
引用：[インストール不要！WindowsでLinuxコマンドを使う](https://qiita.com/tetsuy/items/22cba0bc2048967b270a)

**busybox**というのは、**Git Bashの親戚（というかライバル？）**みたいなもので、Git Bashと同じくWindowsにLinuxを実装するためのソフトです。詳しくは後述のリンクに任せますが、非常に簡単にインストールできます！

つまり私がたどり着いた結論は、
####  <font color=red>「busyboxのrevを利用すればいい」</font>
ということです。
以下、その手順を具体的に紹介します！

## 具体的な手順
#### ①. busyboxのインストール
まず以下の記事の手順に従って、<font color=red>busyboxを自分のPCにインストール</font>します。
[【IT初心者向け】Windowsでbusyboxを利用できるようにする](https://qiita.com/tamcchi103/items/ef2315ce9ab872e7a746)

上のリンクに従って「システム環境変数の追加」まで行えば、もう**Git Bash上でrevコマンドが使えるようになっています！**

---
#### ②. Git Bashで<font color=red>rev</font>コマンドが実行できるようになっている

実際にGit Bash上で確認してみると、今まで見れなかったrevコマンドのヘルプが見えるようになっているはずです。
以上が**rev**コマンドがない時の対処法となります。
お疲れ様でした！
![rev command.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650537/b3a050fe-06aa-93dd-ef1b-686b35c116ed.png)

## rev以外のコマンドに関して

最後に今回の方法によって、**rev**以外にも利用できるようになるコマンドがどのくらいあるかを調べてみました。

その結果、**busybox**で使用できる全153種類のコマンドのうち、**50種類**(`busybox`も入れれば51種類)のコマンドがそれに該当したので、列挙します！
他にも使用できなくて困っているコマンドがあればぜひご参照ください！

|           |          |          |          |           |
|:----------|----------|----------|----------|----------:|
|[[         |ar        |ash       |cal       |cpio       |
|dc         |dpkg      |dpkg-deb  |ed        |fsync      |
|ftpget	    |ftpput    |hd        |hexdump   |httpd      |
|inotifyd   |ipcalc    |killall   |lzcat     |lzma       |
|lzop       |lzopcat   |man       |nc        |pgrep      |
|pidof      |pipe_progress|pkill  |**rev**   |rpm        |
|rpm2cpio   |sha3sum   |sha512sum |ssl_client|strings    |
|su         |time      |ts        |ttysize   |unlzma     |
|unlzop     |unxz      |usleep    |uudecode  |uuencode   |
|watch      |wget      |whois     |xz        |xzcat      |

<font color=Silver>※busyboxで使用できるコマンドは`busybox`で、Git Bashで使用できるコマンドは`ls /bin`で取得して、Git Bashでは使用できないが**busybox**では使用できるコマンドをリストアップしたもの</font>


## 最後に
本稿の内容は以上となります。いかがだったでしょうか？
とりあえずの応急処置的な内容ですが、お役に立てば幸いです。

もっと簡単で汎用性のある方法がわかれば（chocolateyの実装方法など）改めて紹介できればと思います！🙇‍♂️
Ubuntu で Node の最新版を使う (apt-get 編)

Ubuntu に Node の最新版を入れる方法です。 WSL2 の Ubuntu 20.04 で試しました。

### PPA の追加、nodejs / npm のインストール

[NodeSource Node.js Binary Distributions](https://github.com/nodesource/distributions) のインストール手順に従って、PPAを追加します。
apt-get コマンドで nodejs を入れます。 npm コマンドも入るみたいです。

```bash
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt install -y nodejs
```

npmモジュールでnative ビルドが必要なケースに備え、あらかじめビルドツールも入れておくと良いでしょう。

```bash
$ sudo apt install -y build-essential
```

### 確認
シェルを再起動します。

```
$ exec $SHELL -l
```

最新が入りました。

```bash
❯ node -v
v14.4.0

❯ npm -v
6.14.5
```

![2020-06-07_16h10_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1982/ccf9efe7-ba60-c367-7004-9a71a0443c2e.png)
PYNQ-Z1 > AxiGPIOを使ったButtonの押下検知とLED点灯

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

### 概要

- VivadoにてLEDとButtonを設定してbitstream作成
- AxiGPIOを使ったButtonの押下検知

### Block Design

![コメント 2020-06-07 160435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/ac36b7e6-804c-c31d-9ab4-d1fa72cae3c3.png)

### AxiGPIO

- [AxiGPIO](https://pynq.readthedocs.io/en/v2.5.1/pynq_libraries/axigpio.html)

switchesの部分をbuttonに読み替えた。


### AxiGPIOを使ったButtonの押下検知とLED点灯

```py
from pynq import Overlay
from pynq import PL
OL = Overlay("/home/xilinx/pynq/overlays/base/2020-06-07_LED_SW.bit")
OL.download()
from pynq.lib import AxiGPIO
led_ip = OL.ip_dict['leds']
buttons_ip = OL.ip_dict['buttons']
leds = AxiGPIO(led_ip).channel1
buttons = AxiGPIO(buttons_ip).channel1
```

```py
buttons.read()
```

ボタンを押しながら実行すると[8]や[1]などになる。

LEDの点灯は下記でできる。2つ目と4つ目が点灯する。

```py
mask = 0xffffffff
leds.write(10, mask)
```
Windowsからファイルサーバでサイズの大きなファイルを扱うときのタイムアウト対策

Windowsではファイルアクセスのタイムアウトが初期設定が45秒になっているため、ファイルサーバで大きなファイルを扱うとタイムアウトでエラーになってしまいます。

## 対策
レジストリを変更しタイムアウトまでの時間を大きくする事でエラーを防げます。
レジストリエディタで
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters`に`SessTimeout`をDWORDで作成し値に10進数で秒数を入力します。
今回は600(10分)を入力します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/9d83a336-7631-01b2-1559-59708e0fea54.png" width="50%"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263584/fb3ecfae-e146-0711-eba5-c2828a40b93a.png" width="50%">


以下のbatファイルを実行しても可能です。

```bat
@echo off
REM ファイルアクセスのタイムアウトを45秒から10分に変更
REM value名がない場合は作成して、ある場合は上書きされる

set key="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters"
set name="SessTimeout"
set regType="REG_DWORD"
set data="600"

set regCmd="add %key% /v %name% /t %regType% /d %data% /f"

REM powershellから管理者権限でregコマンドを実行
PowerShell Start-Process reg -ArgumentLis '"%regCmd%"' -Verb RunAs
```

[zipファイルダウンロード](https://github.com/mao2009/fix_win_fileaccess_timeout/archive/v1.0.zip)
## 関連記事

- [RaspberryPiにSambaをイントールしてファイルサーバを作成](https://qiita.com/loach/items/36825623bc9277b08b71?utm_source=Qiita&utm_medium=referral&utm_campaign=analytics)


## My Accounts
<a href="https://github.com/mao2009"><img src="https://mao2009.github.io/qiita_template/GitHub-Mark-64px.png" width="50px"></a><a href="https://twitter.com/loach_mao"> <img src="https://mao2009.github.io/qiita_template/Twitter_Social_Icon_Circle_Color.png" width="50px"></a>
- - -
【GAS】複数セルの文字列を別シートの1セルにコピーするスクリプト

# はじめに
職場でGAS(GoogleAppsScript)を作成する機会がありました。
今回は、スプレッドシートの**「複数セルの文字列」**を**「別シートの1セル」**にコピーするスクリプトを公開したいと思います。

# 今回やりたいこと

「copy_m」シートから「copy_s」シートにデータコピーしたい。

![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/0d798b09-fdd4-728e-b354-c52502572479.jpeg)



- コピー元(「copy_m」シート)

![1_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/27e9010f-1838-8aa9-e7c2-3a24285922fc.jpeg)

※コピー元は、A2-A23の間の文字列

- コピー先(「copy_s」シート)

![3-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/37c98f90-1fa0-5978-1a68-d33d73d5c1a8.jpeg)

※コピー先は、A2の1セル

# スクリプトの動作手順

## 「copy_m」シート

![copy_m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/5849a576-4d2c-6b6e-b843-59199a45cd2c.jpeg)


①「copy_m」シートのセルA2-A23の間に、コピーしたい文字列を入れる。

![1_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/e890fc88-03a6-cd86-3fb7-bee0b1632804.jpeg)

②「copy_m」シートの「セルコピー」というボタンをクリック

![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/6bee6985-1e12-24f0-01ec-aafcb2a8a74a.jpeg)

## 「copy_s」シート

セルA2にデータがコピーされていることを確認。

![6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/3898c0b7-9773-a8bd-bee3-86ac9aba8720.jpeg)

#　スクリプトの内容

## 記載しているコード

```code.gs
function selcopy(){
  
  // スプレッドシート上「copy_m」の値を二次元配列の形で取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const copy_m =  ss.getSheetByName('copy_m');
  const values = copy_m.getRange("A2:A23").getValues();
  
  // 取得した値を変数に代入
  const value = values.join("\n");

  // スプレッドシート「copy_s」に取得した値を挿入
  var copy_s = ss.getSheetByName('copy_s');
  copy_s.getRange("A2").setValue(value);
}
```

## 「セルコピー」ボタンに設定しているスクリプト

![button.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/5c18e34d-1d74-05a7-a987-6cbbc0ddc36d.jpeg)


# スクリプトの実行フロー

![フロー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/db0deaf2-5e1f-45e5-d3a1-10f6b4943e8e.jpeg)


# 参考記事

[【GoogleAppsScript】スプレッドシート操作(セルへのデータ書き込み偏)](https://qiita.com/chihiro/items/20a54865c15966e807ee)
[【JavaScript入門】joinで配列を連結する方法(改行/置換)](https://www.sejuku.net/blog/23137)
WordPressをHTTPS通信にする方法

# WordPressをHTTPS通信にする方法
# 環境
Conoha VPS
Ubuntu 18.04 LTS

UbuntuにWordPressをインストールするためには、以下の記事を参考にしてください。
[WordPressをUbuntuサーバーにインストールする](https://qiita.com/sknjpn/items/1f049c234d844aceb8f0)

# はじめに
Let's Encryptを用いてSSL化を行いますが、この際に独自ドメインが必要です。  
以下、`sylife.jp`というドメインを取得していることで書いていきます。

# ApacheにSSLモジュールのインストール

``` sh
# Apache2のsslモジュールの有効化
sudo a2enmod ssl

# Apache2の再起動
systemctl restart apache2
```

参考:[How to install Let’s Encrypt on Apache2](https://upcloud.com/community/tutorials/install-lets-encrypt-apache/)

# Certbotのインストール

``` sh
#Certbotのインストール
sudo apt install certbot python-certbot-apache -y

# 実行
sudo certbot --apache -d sylife.jp
# メール受け取り用のメールアドレスを入力
# 規約への同意
# メールアドレス公開の可否(Nでもよい)
# httpでアクセスした際にhttpsにリダイレクトするか？(する場合は2)

# Apache2の再起動
systemctl restart apache2
```
参考:[7時間目 SSL証明書をインストールしてサイトをSSL化する](https://support.conoha.jp/v/hellovps-w-07/)

# サイトに接続してみる
これで、うまく設定できたはずです。
早速、sylife.jp(もちろん、貴方の作ったサイトのほうです！)に接続してください。
URL欄が`https`となっていることが分かると思います。
また、`http`で接続すると、`https`になることが確認できます。

# Let's Encryptを自動更新するようにする
Let's Encryptは3か月ごとに更新する必要があり、その際に以下のコマンド入力が必要です。

``` sh
sudo certbot renew
```
これを毎回入力するのは*たぶん忘れる*ので、自動更新されるようにします。

``` sh
sudo vim /etc/crontab
# 以下の内容を追記
0 0 * * * root /usr/bin/certbot renew
# これは、毎朝0時に実行することを意味します。

# Cronが動いているのかの確認
/etc/init.d/cron status
# Activeと出てくれば大丈夫です。

```

参考:[7時間目 SSL証明書をインストールしてサイトをSSL化する](https://support.conoha.jp/v/hellovps-w-07/)
参考:[ubuntuでcrontabに設定した反映が実行されない](https://teratail.com/questions/62291)

# さいごに
環境等によっては、上記の通りにやってもうまくいかない場合がございます。  
その場合は、最初からやり直すか、環境に合わせた調整をお願い致します。  
何かご意見ご感想等ありましたら、お気軽にコメントして頂けると幸いです。  

以上で解説を終わります。
kotlinのエルビス演算子


# kotlinのエルビス演算子

### 書き方

-　val c = a :? ""
 - もしaはnullじゃないならc = a
 - もしaはnullならc = ""

### 例

- エルビス演算子使用しない例

```kotlin
fun converterToHistory(items: List<HomeworkQuery.History_commit>?): String? {
    var jsonArray = JSONArray()
    items?.map {
        var jsonObject = JSONObject()
        jsonObject.put("content", if (it.content().isNullOrEmpty()) "" else it.content())
        jsonObject.put("finish_at", if (it.finished_at().isNullOrEmpty()) "" else it.finished_at())
        jsonObject.put("type", if (it.type().isNullOrEmpty()) "" else it.type())    
        jsonArray.put(jsonObject)
    }
    return jsonArray.toString()
}
```
* エルビス演算子使用する例

```kotlin
fun converterToHistory(items: List<HomeworkQuery.History_commit>?): String? {
    var jsonArray = JSONArray()
    items?.map {
        var jsonObject = JSONObject()
        jsonObject.put("content", it.content() ?: "")
        jsonObject.put("finish_at", it.finished_at() ?: "")
        jsonObject.put("type", it.type() ?: "" )
        jsonArray.put(jsonObject)
    }
    return jsonArray.toString()
}
```
クラウド・インフラ技術を学んでいくためにAWSを始めてみた（その１：ＶＰＣ設定編）

#はじめに

　インフラ・クラウド関連の勉強を兼ねて`AWS`を使ってみたのでまとめます。下記、`udemy`のレッスンを元に作りました。

　私が所属する会社は**製造業**ですが、所謂歴史ある昔からの企業でもある影響か**漏れなくオンプレミス(いわゆる自社サーバー）**です。クラウド型の良さを実感することが目標です。

>AWS：ゼロから実践するAmazon Web Services。
https://www.udemy.com/course/aws-and-infra/

##AWSとは
　
　**AWS(Amazon Web Services)**はAmazonが提供するクラウドサービスです。AWS上にサービスをデプロイしたり、機械学習で計算させたり等多くの用途に使えるサービスです。

　
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/6c8dcfac-8776-4381-f66b-6c362923a436.png)

　自社のサーバーでサービスを構築していくことをオンプレミス型と呼びます。弊社ももれなくこのオンプレミスです。
　
　クラウド型の場合はサーバーの初期投資が抑えられることや気軽にサービスを始められることがメリットのようです。
　


##IPアドレスの表記範囲について

　IPアドレス（Ineternet Protcol address）は、**WikipediaによるとIPにおいてパケットを送受信する装置を識別するための番号である、**と定義されています。

　IPアドレスは、**IPv4**と**IPv6**があります。今回はIPv4について取り扱います。
　IPv4においてIPアドレスは32bit(0か1が32個並んだ数値）で表記します。このうち、最上位に近いビット（左側の数値）をネットワーク部、最下位に近いビットをホスト部として区別します。
　
　ネットワーク部はネットワークを指定し、ホスト部がそのネットワーク内の機器をしています。このネットワーク部とホスト部を区別する表し方にＣＩＤＲ法とサブネットマスクがあります。
　
###ＣＩＤＲ法とサブネットマスク
　
　ＣＩＤＲ(Classless InterDomain Routing)法はスラッシュを用いてネットワーク部とホスト部を区別する位置を示します。下記図のように、ネットワーク部が前から何ビットあるかをスラッシュ後の値で示しています。
　
　サブネットマスクはネットワーク部は１、ホスト部は０として表す表記方法です。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/c4a32706-a1e6-1420-18c2-70063ff34eff.png)

##VPCを構築する


　最初はVPC(Virtual Private Cloud)を構築します。VPCとは、AWS上の仮想ネットワークのことです。このVPCを構築した中で行いたいサービスを実行していくことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/887dcd97-bf1f-5656-af2c-5f35bd0a5c91.png)


　
上記のようなイメージになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/4e698073-a0c0-e471-7121-f6a4632c6da6.png)

このＶＰＣ自体のIPアドレスは`10.0.0.0/16`としています。


　ここで、ＶＰＣを構築した中で二つのサブネットを構築します。サブネットとは、ネットワークを細分化したネットワークのことです。目的としては、インターネットから直接アクセスすることができるサブネットや、直接アクセスさせたくない（≒秘匿性の高い情報が含まれている）サブネットとして分割したい動機からです。
　
　今回、パブリックサブネットのIPアドレスとして`10.0.10.0/24`、プライベートサブネットのIPアドレスとして`10.0.20.0/24`と設定しました。



##ルーティングを設定する

　ルーティングとは、ネットワーク上でデータを送信・転送する際に宛先アドレスの情報を基に最適な転送経路を割り出すことです。
　
　AWSにおいては、通常localと呼ばれる自身のＶＰＣ上に送信元（ここでは10.0.0.0/16）だけ設定されています。このままではインターネットを通じて情報がやり取りできないため、インターネットゲートウェイとして設定します。
　
　インターネットゲートウェイとは、VPCとインターネットとの間の通信を可能にするVPCコンポーネントのことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/fbda4446-b752-8466-0f46-1b2245521115.png)





　設定後下記のように、`0.0.0.0`にてインターネットゲートウェイとしてルートテーブルに持つことができました。

　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/79351f47-ad39-c576-8072-c8a00a6e3e87.png)


　


#終わりに

　インフラ・クラウド関連について疎いので用語が一つ一つ分からない点がありました。引き続き吸収していきます。

　次回はEC2関連をまとめたいと思います。
[cx_Oracle入門](第3回) テーブルの参照の基本

# 検証環境
- Oracle Cloud利用
- Oracle Linux 7.7 (VM.Standard2.1)
- Python 3.6
- cx_Oracle 7.3
- Oracle Database 19.5 (ATP, 1OCPU)
- Oracle Instant Client 18.5

# SELECT処理の基本
SELECTに限らず、SQL文を発行するためには、まず、以下のような形でCurosrオブジェクトを作成する必要があります。
`cursor = connection.cursor()`
続けて、例えば
`cursor.execute("select sysdate from dual")`
と、引数にSELECT文を指定して、Curosrオブジェクトのexecute()メソッドをコールします。コール結果をfor文でループさせることにより、レコードがタプルの形で取り出されます。最後はCurosrオブジェクトを
`cursor.close()`
でクローズさせます。以下実行サンプルです。ALL_OBJECTSビューをOBJECT_ID順に5件取り出す形なので、何等かcx_Oracleアプリケーションを動かした実績があるなら、特段の事前準備なしで動くと思います。

```python:sample03a.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cx_Oracle

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
        select object_id, owner, object_name, object_type
          from all_objects
         order by object_id
         fetch first 5 rows only
"""

with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
        cursor = connection.cursor()
        cursor.execute(SQL)
        for row in cursor:
                print(row)
        cursor.close()
```

筆者環境では、以下のような出力になります。

```
$ python sample03a.py
(2, 'SYS', 'C_OBJ#', 'CLUSTER')
(3, 'SYS', 'I_OBJ#', 'INDEX')
(4, 'SYS', 'TAB$', 'TABLE')
(5, 'SYS', 'CLU$', 'TABLE')
(6, 'SYS', 'C_TS#', 'CLUSTER')
```

# Curosrオブジェクトとwith構文
上記サンプルではConnectionオブジェクトに対してのみwith構文を使用していますが、Curosrオブジェクトもwith構文に対応しています。ですので、上記サンプルの最後の6行を以下のよう書き換えると、より簡素な記述量でカーソル数不足(ORA-1000)のようなトラブルが発生しにくい、より安全なコーディングとなります。おまけでSQL発行部分も短縮してみました。

```python:sample03b.py(抜粋)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
        with connection.cursor() as cursor:
                for row in cursor.execute(SQL):
                        print(row)
```


# リスト内包表記
結果セットをリストでまとめて扱いたい場合は、以下のように、リスト内包表記の利用も可能です。なお、環境次第ですが、下記サンプルの実行のためには、pprintモジュールの事前インストールが必要です。

```python:sample03c.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cx_Oracle
import pprint

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL = """
        select object_id, owner, object_name, object_type
          from all_objects
         order by object_id
         fetch first 5 rows only
"""

with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection:
        with connection.cursor() as cursor:
                pprint.pprint([f"{r[1]}.{r[2]}は{r[3]}(ID:{r[0]})です" for r in cursor.execute(SQL)])
```

```
$ python sample03c.py
['SYS.C_OBJ#はCLUSTER(ID:2)です',
 'SYS.I_OBJ#はINDEX(ID:3)です',
 'SYS.TAB$はTABLE(ID:4)です',
 'SYS.CLU$はTABLE(ID:5)です',
 'SYS.C_TS#はCLUSTER(ID:6)です']
```
マウスストーカーの作成



マウスカーソルを追いかけてくる、マウスストーカー(赤色、直径16pxの円形)作成してみました

```JavaScript:JS
<div id = 'stalker'>
  <script>
  var mX = 0; // マウスカーソルの座標
  var mY = 0; // マウスカーソルの座標
  var nX = 0; // ストーカーの座標
  var nY = 0; // ストーカーの座標
  // document.getElementById('stalker');
```


まず、マウスカーソルとストーカーの座標を設定。
（getElementByIdは必要ないのかな…？）


次にmousemoveイベントを用いて、マウスカーソルが動いた際の座標を取得

```javascript:JS
  function getMouseXY(e){
   mX = e.pageX;
   mY = e.pageY;
  }
  document.onmousemove = getMouseXY;
```


addEventListenerを用いるより、この書き方のほうが現代っぽいらしい




今度はストーカーがマウスカーソルを追っかけてくれるようにします

今回は200ミリ毎秒ごとに、ストーカーがマウスカーソルを3pxずつ追いかけるようにする

```javascript:JS
setInterval(function(){
  if(mX > nX){
    nX += 3;
  } else {
    nX -= 3;
  }
  if(mY > nY){
    nY += 3;
  } else {
    nY -= 3;
  }
  stalker.style.left = nX + 'px';
  stalker.style.top = nY + 'px';
}, 200);
```

setIntervalを使用

マウスカーソルの座標とストーカーの座標の位置関係に応じて3pxずつ動くように指示


最後にCSSを添付します

```css:css
#stalker {
  position: fixed;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background-color: red;
}
```


これにて完成しました

動き自体は遅いですが、追いかけてくるストーカーは出来上がります


これ以外の別の作り方や、間違いがありましたらご指摘いただければと思います
【DB設計】No.2「超簡単に正規化を説明してみた」

本記事では正規化を超簡単にシンプルに説明します。
他の記事では学術的にDB設計を書きましたが、それを抜きにしてシンプルな説明のみを使っています！
##正規化とは
正規化とは、**「データの繰り返しを無くす」**ことです。

具体的に見てみると、以下のようなテーブルが存在したとき、「商品C」という商品名が繰り返していることがわかります。
この繰り返しを無くすために、2枚目の画像のように、商品テーブルを作成して、**1：nの関係を構築**していくのが正規化です。
<img width="487" alt="スクリーンショット 2020-06-07 14.57.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618902/73d02ff0-b299-14bd-6fcf-789d7866c5cf.png">
<img width="217" alt="スクリーンショット 2020-06-07 14.59.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618902/3ee39190-93cc-0dfa-7235-7158c1e7f00d.png">

##正規化のやり方
正規化のやり方は一般的に「第1正規形」→「第2正規形」→「第3正規形」という順序で行っていきます。
これを超簡単に説明すると、以下のように言い換えられます。

**1.横方向の繰り返しを無くす
2.縦方向の繰り返しを無くす**

##横方向の繰り返しを無くす（＝第1正規形）
まず横方向の繰り返しを無くしていきます。
以下のようなテーブルが存在したとき、**横方向に商品A・商品C・商品Dのように商品が繰り返し並んでいる**ことがわかります。
<img width="731" alt="スクリーンショット 2020-06-07 15.04.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618902/d2a44324-8f69-93de-a3ca-92729a316e54.png">
これを下の図のように**縦方向に伸びるように**並び替えます。
<img width="600" alt="スクリーンショット 2020-06-07 15.06.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618902/b84025d9-5273-9236-4a86-610517b1d49a.png">

##縦方向の繰り返しを無くす（＝第2正規形＆第3正規形）
次に縦の繰り返しについて見ていきましょう。
注文番号0001に注目してみると、**縦方向に繰り返しているのはカラム名が灰色になっている部分**です。
そして、**青色の部分はバラバラ**になっています。
よって縦方向の繰り返しを無くすには、**青色の部分を「商品テーブル」として分離**させる必要があります。
<img width="598" alt="スクリーンショット 2020-06-07 15.11.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618902/6bec3d5d-f89e-ceeb-7cba-109141d187ef.png">
そうすると以下のように、注文番号で紐付けられた2つのテーブルが作成できます。
<img width="728" alt="スクリーンショット 2020-06-07 15.16.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618902/0b103fa8-53b3-33df-12cc-1ed422f40b5d.png">
しかしまだ縦方向の繰り返しが存在していることにお気づきでしょうか？
それは**カラム名が青色の部分と赤色の部分**です。
これを別のテーブルとして作成して、1：nの関係を作っていきます。
<img width="721" alt="スクリーンショット 2020-06-07 15.33.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618902/b9156f3a-9702-486e-659f-4bacb3276966.png">
最後に、まだユーザーテーブルの送料区分が繰り返しとなっているので別のテーブルを作成します。
<img width="689" alt="スクリーンショット 2020-06-07 15.36.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618902/0b53a999-62a1-b01d-cd47-dd11382114be.png">
##まとめ
正規化は難しく言葉で説明すると、「第1正規形」「推移従属」などの言葉が出てきます。
しかし、正規化で行っていることは以下の2点であることを理解しておいておください。

**1.横の繰り返しを無くす
2.縦の繰り返しを無くす**

このシンプルなことを理解しておけば正規化はOKなのです！

##参考サイト
[リレーショナルデータベース正規形の種類と正規化手順](https://proengineer.internous.co.jp/content/columnfeature/6480)
rails と比べて laravel は、、、（雑感）

#はじめに
udemy で laravel のコースを一つやってみただけなのですが、それまで勉強してきた ruby on rails を書くくときと比べて感じたことを書き残す。



# テーブル内の要素(カラム・オプション等)の変更がしやすい
 laravel は、データベースの内容を変更するのが、rails と比べてかなり楽です。migration ファイルにデフォルトで、up と down のメソッドが記述されているのもかなり助かります。


railsを使っているときにめんどくさいなあと思っていたのが、テーブルにカラムを追加したり削除したり、オプションを追加したりするとき、いちいち rollback したり新しく migration ファイルを作らなきゃいけなかったりしなきゃいけないことです。

さらには、オプションを追加する際、自分で up, down のメソッドを記述しないと、後で migration ファイルを削除したくなって、rollback を使って遡ることができなくなるんです( migrate:status を down にできなくなる)。このことを全く知らずにやってしまい、かなり痛い目にあったのを覚えています。

#validation の書き方が若干違う
## 記述場所
rails では model に validation の記述するのに対して、
 
laravel では、controller または **FormRequest** という rails にはなかったファイルに記述します。

## validation 実行のタイミング
rails では Model の create や save,update の実行時に validation が実行されていましたが、

laravel は controller のメソッド内です。また、**FormRequest** に記述すれば、controller のメソッドに入ったタイミングで validation が終わっているという状態にできます。




#謎のDI ( Dependency Injection ) という考え方
これが今のところ一番理解できていない部分。railsではなかった考え方だ。(自前で実装することはできるらしい)。詳しくは、この記事の最後にある参考文献のページを読んで欲しい。なんとなくは理解できるのだが、実際に使えと言われると難しい。

なのでここでは詳しい説明はできない。

簡単にいうと、**クラス内でインスタンスの生成をすることはやめましょう**、ってことです。


#記述量が多い
railsと比べるとlaravelはコマンドラインにしろコーディングにしろ、長くて書きにくいです。

###rails

```ruby
items = Item.all
item = Item.find(1)
name = item.name 

#コマンドライン
rails s

rails db:migrate

```

###laravel

```php
$items = Item::all();
$item = Item::find(1);
$name = $item->name;

//コマンドライン
php artisan serve

php artisan db:migrate
```


ご覧の通りです。


#ユーザー認証系の機能がデフォルトで備わっている
railsには、ユーザー認証系の機能を追加するためには、devise という gem をインストールする必要がありましたが、laravel の場合はデフォルトで備わっています。そんなに大きな違いではないのですが、参考までに。

#おわりに


まだまだlaravel始めたてで、理解が浅い部分がありますが、まとめてみました。もし記述に間違いがご指摘いただけると幸いです。


# 参考資料

LaravelとRailsの機能を比較！ルーティング・ORM・DIなどをまとめてみました
https://techblog.raccoon.ne.jp/archives/1550033605.html

Laravelの依存性の注入（DI）を具体的にどう使うのか
https://qiita.com/ishiitakeru/items/e47dbb3e5b07078cc9b5

依存性の注入について
https://laraweb.net/surrounding/2001/
Swiftのfor文に色々あった...

# 動機

5年くらいSwiftやってるのに知らない文法に遭遇して愕然とした...
しかも導入されたの Swift 2.0 からだった...
もうSwiftﾁｮｯﾄﾃﾞｷﾙって言えない...

となったので、まとめておきます。

## `for` + `where `

`for` の内側の `if` で判定する代わりに、`where` を使ってフィルタできます。

```swift
for i in 0...4 where i % 2 == 0 {
	print(i) // 0, 2, 4
}
```



## `for` + `case`

```swift
enum Result {
    case success(Int)
    case error
}

let results = [Result.success(10), .success(2), .error, .success(100)]

for case .success(let value) in results {
    print(value) // 10, 2, 100
}
```



## パターンマッチ

```swift
let results = [("OK", 200), ("Not found", 404), ("Bad request", 400), ("OK", 200)]

for case (let message, 200) in results {
    print(message) // "OK", "OK"
}
```



## 範囲マッチ

```swift
let results = [("OK", 200), ("Not found", 404), ("Bad request", 400), ("OK", 200), ("Created", 201)]

for case (let message, 200..<300) in results {
    print(message) // "OK", "OK"
}
```



## 何のためにやってるの？



```swift
for case 0...5 in -10...10 {
    print("Hi!")
}
```



どうも `~=` 演算が定義されているものでは何でも使えるっぽいです。

驚いた...
RailsのTimeWithZoneで時間操作するときによく使うメソッド集

Railsのアプリで特定の期間の料金計算をしたり、そのテストをする際に時間をいじって検証することが多かったのですが、かなり簡単に欲しい時刻を取得できることに感動したので、そのとき使った時間操作系のメソッドを備忘録代わりにまとめました。

## そもそもTimeとかTimeWithZoneとか何なのか?
下記の記事に詳しく書かれていたので紹介させていただきます。結論、Railsで使うときはTimeWithZoneを使うと色々捗ります。この記事ではこのクラスを使うことを前提に書かせていただきます。
[RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い \- Qiita](https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c)

## 現在時刻の取得する
超基本の時刻取得系。とりあえず基本ということで。これをベースにいろんな形に変換したりしていくことが多いかと思います。

```ruby
# 現在時刻を取得する
Time.current
=> Wed, 15 Jan 2020 13:18:07 UTC +00:00

# classを確認する
Time.current.class
=> ActiveSupport::TimeWithZone

# string型に変換
Time.current.strftime("%F")
=> "2020-01-15"
```

### Tips: Time.nowとの違い
`Time.now`を使っても現在時刻は取得できますが、こちらの場合は下記のような違いがあります。

+ Timeクラスなので、TimeWithZoneのメソッド（今回紹介しているものなど）が使えない。
+ TimeWithZoneは`config/application.rb`に設定しているタイムゾーンをもとに取得してくるのに対して、環境変数、もしくはシステムのタイムゾーンをもとに現在時刻を取得するため、**時刻が大きくずれてしまう**という懸念がある。


TimeWizhZoneクラスのメソッドが使えることからも、こちらで取得するのが良さそうです。

## 前日や翌日を取得する
昨日のデータ、翌月のデータを取得したい〜と思うのですがこのレベルであれば下記のように一発で持ってこれるので便利です。

```ruby
# 昨日
Time.current.yesterday

# 翌日
Time.current.tomorrow

# 前月
Time.current.prev_month

# 翌月
Time.current.next_month

# 月初 
Time.current.beginning_of_month

# 月末
Time.current.end_of_month

# 前年
Time.current.prev_year

# 翌年
Time.current.next_year

```
## N日、Nヶ月、N年前の時刻を取得する
任意の日付や月で変更したい場合は下記のように書くことで取得することが可能です。

```ruby
# 3日前 / 3日後
Time.current.ago(3.days)
Time.current.since(3.days)

# ３ヶ月前 / ３ヶ月後
Time.current.ago(3.month)
Time.current.since(3.month)

# 3年前 / 3年後
Time.current.ago(3.years)
Time.current.since(3.years)
```

## 年月日や曜日を取得する
日数の計算などする際は下記のように書くことでそれぞれの数字が持ってこられます。この時の型は基本int型です。

```ruby
# 年
Time.current.year
=> 2020

# 月
Time.current.month
=> 6

# 日付
Time.current.day
=> 7
```

## 時刻の差分
TimeWithZoneを引算すると、UNIXTIME(秒数)が返ってきます。これをTime.zone.atを使って変換することで、2つの日時の差分から日付などを取得したいときに使えます。

```ruby
# 時刻を設定からTimeWithZoneに変換する
time1 = Time.zone.parse('2020-01-05 12:00:00')
time2 = Time.zone.parse('2020-01-01 10:00:00')

# 引算してUNIXTIME（秒数） を取得する
time1 - time2
=> 352800.0

# 秒数をTimeWithZoneに変換する
Time.zone.at(time1 - time2)
```

## 任意の時間を取得する
テストなどで特定の日付に生成したデータなどを取得したい場合などに使います。

```ruby
Time.zone.parse('2020-01-01')
=> Wed, 01 Jan 2020 00:00:00 UTC +00:00

Time.zone.parse('2020-01-01 12:00:00')
=> Wed, 01 Jan 2020 12:00:00 UTC +00:00

# 現在時刻をもとに新しいTimeWithZoneを作成する
Time.zone.parse("#{Time.current.strftime('%F')} #{Time.current.hour}:00:00")
=> Wed, 15 Jan 2020 13:00:00 UTC +00:00
```

## まとめ
時刻操作などは触る前は少し苦手意識がありましたが、こうして触ってみて学びも増えました。他にもできることが便利な操作法があれば追加していこうと思います。

## 参考にさせていただいた記事
+ [ActiveSupport::TimeWithZone](https://api.rubyonrails.org/v6.0.2.1/classes/ActiveSupport/TimeWithZone.html)
+ [RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い \- Qiita](https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c)
+ [Ruby on Rails \- ActiveSupport::TimeWithZoneの引き算がうまくいかない｜teratail](https://teratail.com/questions/58357)
作成してみたSeriese一覧

#Seriese一覧
* [Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/yuta-sasaki/items/3151b3faf2303fe78312)
* [Visual StudioのASP.NET Core MVC で Web アプリを作成してみた（記事一覧）](https://qiita.com/yuta-sasaki/items/31307b88f7234b92f728)
Visual StudioのASP.NET Core MVC で Web アプリを作成してみた（記事一覧）

#記事一覧
* [Visual Studio for MacでMVCを体験してみた](https://qiita.com/yuta-sasaki/items/fc3b20e7356828b03260)
* [Windows10にIISサーバを設定する](https://qiita.com/yuta-sasaki/items/8bcdb1e1ea3d68a0f59e)
* [IISサーバにドメインを設定する](https://qiita.com/yuta-sasaki/items/c68fb5682bcc4b1d85ea)
* [IISサーバのlocalhostにディレクトリを追加する](https://qiita.com/yuta-sasaki/items/e0578bbbd95a19a8c005)
* [IISサーバにアクセスした時に初めに表示するファイルを設定する](https://qiita.com/yuta-sasaki/items/3f4751807041f9ed532a)
* [IISサーバにサイトを追加する](https://qiita.com/yuta-sasaki/items/7c73c9214fa04df7452e)
* [VisualStudioで配置したWebアプリをIISサーバに公開する](https://qiita.com/yuta-sasaki/items/e547111f16ee4b124122)


#Seriese
* [作成してみたSeriese一覧](https://qiita.com/yuta-sasaki/items/a033edc84bb023eea39b)
[Flutter]入力フォームを作成

`TextField()`で入力フォームが作成できる

ex.

```
TextField(
    decoration: InputDecoration(
        border: InputBorder.none, // 下線を非表示
        hintText: 'Enter a search term'// 未入力時に表示されるテキスト
    ),
)
```

`autofocus: true`で画面の初期表示時、入力フォームが選択状態になる