OmniAICreator/Qiita-1.07M huggingface dataset:
レンタルサーバーで Active Directory とリモートデスクトップ

Azure AD の練習のための環境構築のときのメモ

## VPS

- 1strentalserverが申し込んで数日無反応で、多分金だけ取られる。
- なのでWebARENAを契約したら、ちゃんと金確認したのかってくらいすぐ使えるようになった。
    - Windows Server 2019 64bit を使用。
- 黙ってさくらを使えば良いのではないか。

[WebARENA](https://compas.arena.ne.jp/dashboard)
[Indigo](https://indigo.arena.ne.jp/dashboard)
リモートデスクトップのライセンスを「インスタンス管理＞ライセンス」から買っておくと、インスタンス作成時に「RDS-enabled」を選択でき、リモートデスクトップできるようになる。

提供されているリモートデスクトップツール(Web)ではキーボード配列が英語配列？で打ちにくい記号がある。 Windows の RDP が整うまではパスワードには `!#.,` くらいしか使わないほうが良いんじゃないか

ログインユーザー名は `Administrator`。

## Active Directory

[Windows Server 2019 で Active Directory をインストールする手順 - レムシステム エンジニアブログ](https://www.rem-system.com/win2019-adsetup/)
Azure AD との連携の練習なのでちゃんと作る。
※手順を確認せずに「はい」「はい」しないこと
自分用カスタマイズ：

- ドメインの構成：新規にフォレストとドメインを追加する（最初のフォレスト/ドメイン）
- ルートドメイン名(DNS)： `ad.rensyu-sys.com` とします。
- ドメイン名(NetBIOS 名)：本環境では `RENSYU-SYS` を利用します。古い OS で利用されるドメインの NetBIOS 名です。通常は DNS 名のサブドメイン部分が自動的に設定されます。本環境ではサブドメイン部分が `AD` という汎用的な名前になりますので、別の名前を明示的に設定します。
- フォレストモード：WindowsServer2016 とします。Active Directory の全ての機能を利用できます。※2
- ドメインモード：WindowsServer2016 とします。※2
- Active Directory 復元モードのパスワード：忘れないものを設定します。Active Directory の復旧時に利用します。
- グローバルカタログ：ドメイン内の最初のドメインコントローラーはデフォルトで GC になります。

### テスト

ログイン時のサインイン先にドメイン名が表示されていることを確認する。

## リモートデスクトップ

純正リモートツールだとローカルからのコピペが効かないのでRDPに乗り換える。

前提： Active Directory の設定完了

Administrator ならすでにできるはず

### 他のユーザーの許可

1. ローカルサーバー > リモートデスクトップ「有効」 > ユーザーの選択 > 追加

[リモートデスクトップ接続を利用するためのWindowsサーバーの手順を教えてください。 – お客さまサポート](https://help.arena.ne.jp/hc/ja/articles/360058151974-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E6%8E%A5%E7%B6%9A%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEWindows%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E6%89%8B%E9%A0%86%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84-) にはグループポリシーを云々せよと書いてあるが、しなくても動いた。

## ユーザー追加

1. ツール > Active Directory ユーザーとコンピューター
2. (ドメイン名) > Users
3. 頭で何かが爆ぜている人のアイコンボタン

### ログインの許可

ユーザー追加しただけではまだログインできない。

1. ツール > グループポリシーの管理
2. フォレスト > ドメイン > (ドメイン名) > Domain Controllers > Default Domain Controllers Policy を右クリック > 編集
3. ポリシー > Windows の設定 > セキュリティの設定 > ローカルポリシー > ユーザー権利の割り当て > ローカルログオンを許可
4. ユーザーまたはグループの追加
草野球の出欠確認Webアプリを作ろう！　part.5

これから作っていく簡単なWebアプリの作成メモ（自分の備忘）です。
自分用なのであまり凝りすぎないように書いていきたい。

[<<前回の記事](https://qiita.com/tomodachi_uec/items/558c48acf7ffc2efeefe)

##今回やったこと

###Rspecの導入
ようやく重い腰を上げてRspecを導入する。
以下の記事を参考にした（基本的に記事の通りにした）。
[RailsアプリへのRspecとFactory_botの導入手順](https://qiita.com/Ushinji/items/522ed01c9c14b680222c)

```rb:Gemfile
group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]   （既存のgem）
  gem "rspec-rails"
  gem "factory_bot_rails"
end
```

```bash
$ bundle
$ bundle exec rails generate rspec:install
```

```rb:config/application.rb
config.generators do |g|
  g.test_framework :rspec, 
        view_specs: false, 
        helper_specs: false, 
        routing_specs: false
end
```

```rb:spec/rails_helper.rb
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
（略）
end
```

```rb:spec/rails_helper.rb
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
```

↑`rails_helper.rb`の記述は私の環境ではコメントアウトを解除すればよかった（最初に生成した時からコメントアウトで書いてあった）。

###Rspecの動作確認

まず参考記事の内容をなぞって、FactoryBotに新規フォルダ・ファイルを作成して定義をする。

```bash
$ mkdir ./spec/factories/
$ touch ./spec/factories/users.rb
```

```rb:spec/factories/users.rb
FactoryBot.define do
  factory :user do
    sequence(:name) { |n| "TEST_NAME#{n}"}
    sequence(:email) { |n| "TEST#{n}@example.com"}
    sequence(:password) { |n| "TESTpassword"}
    sequence(:password_confirmation) { |n| "TESTpassword"}
  end
end
```

FactoryBotのほうを整えたら、テストコードを作成する。

```bash
$ mkdir ./spec/models/
$ touch ./spec/models/users_spec.rb
```

```rb:/spec/models/users_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  before do 
    @user = build(:user)
  end

  describe 'バリデーション' do
    it 'nameが空だとNG' do
      @user.name = ''
      expect(@user.valid?).to eq(false)
    end

    it 'emailが空だとNG' do
      @user.email = ''
      expect(@user.valid?).to eq(false)
    end

    it 'password_digestがfalseだとNG' do
      @user.password_confirmation = ''
      expect(@user.valid?).to eq(false)
    end

    it 'nameとemailどちらも値が設定されていれば、OK' do
      expect(@user.valid?).to eq(true)
    end
  end
end
```

テストコードを実行する。

```bash
$ bundle exec rspec spec/models/users_spec.rb
```

きちんと動作したのでハッピー。

```bash:実行結果
....

Finished in 0.07136 seconds (files took 1.74 seconds to load)
4 examples, 0 failures
```

短いけど今回はここまで。
次回からようやく[TDD](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA "テスト駆動開発-Wikipedia")の真似事ができるようになる（つもりでいますが、挫折する可能性も...）。

[次回の記事>>](https://qiita.com/tomodachi_uec/items/b1b72b30713e97443230)
設定しておきたい Git Aliases

これはQiitaで開催されている「新人プログラマ応援 - みんなで新人を育てよう！」イベントの投稿記事です。

https://qiita.com/official-events/63aa63fd921659fb3b5d

## Git Aliases について

Git の設定で Git command の alias の設定が可能です。
これにより、よく使う操作を短いコマンドで実行ができます。

https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases

Qiita では多くの方が Git Aliases に関する記事を書いていて参考になる記事がたくさんあります。

https://qiita.com/search?sort=like&q=title%3Aalias+title%3Agit+OR+title%3A%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9+title%3Agit

私がよく使う alias しているコマンドもいくつか紹介しようと思います。
単純な短縮のための alias は省きます。

## force push は `push --force-with-lease` を使うようにする
これはド定番ですが必須で登録しておきたい alias です。

```:.gitconfig
  pf = push --force-with-lease
```

Ref:

https://qiita.com/wMETAw/items/5f47dcc7cf57af8e449f


## 最新の main branch を参照する

ローカルで main branch は作成しない運用にしているので、最新の main を参照するときは fetch して remote の main を detach するようにしています。

```:.gitconfig
  om = !"git fetch --prune && git switch -d origin/HEAD"
```

ローカルのmainブランチを使わない運用については下記記事を参照ください。

https://qiita.com/ucan-lab/items/0bbf07daa58959c1010a

## 最新の main branch を元に rebase する

上述の操作とほぼ同じです。

```:.gitconfig
  ro = !"git fetch --prune && git rebase origin/HEAD"
```

## 作業途中の編集を記録する
作業途中でブランチを変更するときに git stash は便利ですが、stash していることを忘れたり、stash しすぎると取り出すのに苦労したりします。
そのため、作業途中の変更は基本的に commit するようにしています。
また、stash list とちがって git log は参照頻度が高いため、忘れ去られるなんてこともなくなるとおもいます。

```:.gitconfig
  cw = !"git add . && git commit --no-verify --allow-empty -m '[ci skip] wip'"
```

## マージ済みブランチを削除する
ローカルにマージ済みのブランチが溜まっていってしまうので一括で削除できるようにしています。

```:.gitconfig
  bc = !"git branch --merged origin/HEAD | grep -vE 'HEAD' | xargs git branch -d"
```

## ブランチを push する
新しくローカルでブランチを作成したときに `--set-upstream` オプションを使って毎回 `origin [branch名]` と記述するのが面倒です。下記の記事のように現在のいるブランチ名を参照して push するようにしておくと楽です。

https://qiita.com/kawanet/items/a57e9ff21a205a45ce8a

```:.gitconfig
  pu = !"git push -u origin $(git branch --format='%(refname:short)' --contains)"
```

というのを最近までずっと使っていたのですが、現在参照しているブランチしかpush することないし `HEAD` でいいじゃんとなっています。

```:.gitconfig
  pu = !"git push -u origin HEAD"
```
WEBスクレイピングする～テレ〇限定・今日のドラマ再放送は何やるの？LineBotを作ろうと思う

[前回の続き](https://qiita.com/grayhamchan/items/dede161eb4f1355b4227)です
いつも大変お世話になっているテレ朝さんの番組情報を取得したかったのですが、程よいWEBAPIは見当たらなかったのでスクレイピングで取得してみたいと思います。

#ターゲットとなる情報の在処を探る
テレ朝の公式ホームページにずばり「番組表」というページがありました。
ここから取得してみようと思います。
よく見ると、当日のヘッダー（ここでは4月２９日（木））の色が変わっているので当日を特定しやすそうな感じです。
<img width="500" alt="番組表" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365273/898b86d8-bc76-b37d-28ac-aec69f4bdca0.png">

* Chromeのデベロッパーツールを使ってソースを確認します
<img width="500" alt="ツール" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365273/d4ab638c-6f7c-46d7-ab42-6ad8efd313dc.png">

* ページのソースが表示されるので、マウス操作でソースを展開していきます。

タグを選択すると、「そのタグはページのこの部分ですよ」とハイライトを当ててくれるので、あちこち触ってみて目当ての情報を探し出します。ぐりぐり探していくと、当日の番組列に当たりました。「今日」は「today」で指定されていました。これはいけそうです。
<img width="500" alt="ターゲット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365273/9216e35f-51c9-0ed5-849e-6c4dfc0297ec.png">
14:47科捜研の女を発見しました！　科捜研大好き。何度見ても楽しめる。いつもありがとう！
開始時刻はclass=min　番組タイトルはbangumiDetailOpenで設定されているようです。
<img width="500" alt="ターゲット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365273/419b5855-fbca-db3a-161b-8c8ed35a1d30.png">
#cheerio-httpcliを使ってスクレイピングする
前回発見したNode.js用の素敵なスクレイピングモジュール（[cheerio-httpcli](https://qiita.com/ktty1220/items/e9e42247ede476d04ce2)）をつかって再放送ゴールデンタイムの情報を取得します。
こんなコードにしてみました。

```javaScript:scraping.js
//スーパー再放送タイムの設定
const ssstarttime = '13:46';
const ssendtime = '16:30';

let client = require('cheerio-httpcli');

client.fetch('https://www.tv-asahi.co.jp/bangumi/', {}, function (err, $, res) {

    //当日の番組一覧を取得して配列に入れる
    let tvinfo = [];
    let r = 0;

    //bangumiDetailOpenを指定して番組タイトルを取得する
    $('.new_table .today .new_day .prog_name .bangumiDetailOpen').each(function () {

        tvinfo[r] = [];
        tvinfo[r][0] = $(this).text();
        tvinfo[r][1] = "";
        r = r + 1;

    });

    //開始時間を配列に格納する
    let c = 0;
    //minを指定して放送開始時刻を取得する
    $('.new_table .today .new_day .min').each(function () {

        let title = $(this).text();
        tvinfo[c][1] = title.trim();    //空白が入っているので削除する
        c = c + 1;

    });

    //スーパー再放送タイムか確認
    let conststr = '2000/01/01 ';

    let starttime = new Date(conststr + ssstarttime);
    let endtime = new Date(conststr + ssendtime);
    let tempdatestr;
    let targettime;


    for (let t = 0; t < tvinfo.length; t++) {

        //判定
        tempdatestr = conststr + tvinfo[t][1];   //番組表から取得した各番組の開始時刻で日付の文字列を生成
        targettime = Date.parse(tempdatestr);

        //スーパー再放送タイムであるか判定
        if (targettime > starttime && targettime < endtime) {

            console.log(tvinfo[t][0]);
        }


    }


});
```
今日は、科捜研、科捜研、相棒だったようです。いいね！

```
PS C:\project\homework02> node scraping.js
科捜研の女13　#1
科捜研の女13　#2
相棒15　#11
```
個人的スーパー再放送タイムが変わってしまったり、そもそもページ構成が変わってしまったら、使いものにならなくなるのはWEBスクレイピングを使った仕掛けの仕方ないところ、、、でしょうか。。
とりあえず「テレ〇限定・今日の。。。。。LineBot」の一部ができました。

今日はここまで　おつかれさまでしたー
VisualStudioでVSCodeのショートカットキーを使用する

今までVSCodeを使っていたのに突然VisualStudioを使わなきゃいけなくなる時があるのが社会人です。
けれど、VSCodeとVisualStudioではコメントアウトするショートカットキーすら違う・・・覚え直しは嫌だ。
そんな時はVisualStudioの設定を変更するだけでVSCodeのショートカットキーが使えます。
私のVisualStudio2017では設定できました。

# 方法
VisualStudioを開きます。
"ツール" バーをクリックして "オプション" を選択します。
![スクリーンショット_2021-04-02_130922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568190/4808ae72-99a6-8bd6-5899-fcae43f853f1.png)

左側の "環境" 項目から "キーボード" を選択し、右側の次のキーボードマップスキームを適用に "Visual Studio Code" を選択し、"OK" ボタンを押します。
![スクリーンショット_2021-04-02_130910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568190/ce839efe-cf67-ab64-6cac-b772bd01a60c.png)


# 英語はできた方がよい
日本語ではVSCodeの話が多くて私は見つけられなかったが、Googleの検索範囲をアメリカにして英語で "visual studio shortcuts like vscode" とググると今回の参考記事がすぐに出てきた。
綺麗な英文にできなくてもGoogleが勝手にサジェストしてくれるので、知ってる単語をなるべく多く入れて候補の中から選べば大丈夫。
Google翻訳もあるけど英語で検索できたら、もっとかっこいい。

# 参考
[stack overflow: Make Visual Studio use VS code shortcut keys / key bindings
](https://stackoverflow.com/questions/62050877/make-visual-studio-use-vs-code-shortcut-keys-key-bindings)
laravel Docker 環境構築 「File Not Found」 エラー解決メモ

https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4#%E7%9B%AE%E7%9A%84

この記事の中盤辺りの「Laravel ウェルカム画面の表示」のところで
File Not Found
とエラーが出てしまいページが表示されなかったのですが、いろいろ調べてとりあえず動くようにはなったのでその解決メモを残しておきます。

---

結論としては、`default.conf`のroot設定を`root /work/public;`から
`root /work/laravel/public;` に書き換えました。

```default.conf
server {
    listen 80;
    server_name example.com;
    root /work/public;     <---この行を書き換える

    ...
```
---

これで僕はとりあえず動くようにはなりましたが、これが正しい治し方かどうかはわかりませんのであくまでも応急処置という認識でよろしくお願いします。
robocopyのミラーリング用テンプレート

# 前置き

ミラーリングに robocopy コマンドが便利ですが、多機能なので毎回ヘルプ見てオプション組み立てるのめんどくさいので、ミラーリングに特化したテンプレートです。
なお、Windowsなので、バッチファイルは `文字コード:Shift-JIS、改行コード:CRLF` で保存しておかないと動かない可能性ありです。
また、ミラーリングは間違うと危険な操作なので、仮環境で試してから使ってください。責任は取れません。
いずれも、/NPと/LOG+ によって、画面に出さず(＆ファイル数多いと高速化)、ログを出力するようにしています。
ログは、デスクトップに出力されます。また、ファイル名の末尾に現在時刻の「分」が付与されます。

また・・・ set /p を使うやり方だと、ドライブ直下と半角スペース混じりパスを混在させて指定すると、うまく行きませんでした。
（ダブルクォーテーションでエスケープしたり色々試したんですが、うまく行かず。諦めて注意を表示する事にしました。）

``` うまく行かない指定例.
コピー元：C:\
コピー先：C:\F older
```

なお、pause で止まっているのをキャンセルするには、ウィンドウを閉じれば良いです。コマンドラインから実行しているなら、Ctrl+C (→ y → Enter)。

# ミラーリング (コマンド事前確認＆実行)
コピー元、コピー先を入力すると、/QUIT により解釈結果を確認し、続けて何かキーを押すとミラーリング実行するバッチファイル。

``` mirror_verify_and_run.bat
@echo off
set MIR_SRC=
set MIR_DEST=
echo コピー元と先を入力します(ドライブ直下を""付きで指定しないこと)
set /P MIR_SRC="コピー元: "
set /P MIR_DEST="コピー先: "
robocopy "%MIR_SRC%" "%MIR_DEST%" /DCOPY:DAT /NP /MIR /FFT /R:3 /W:3 /QUIT
echo.
echo これで良ければ実行します
pause
robocopy "%MIR_SRC%" "%MIR_DEST%" /DCOPY:DAT /NP /MIR /FFT /R:3 /W:3 /LOG+:"%USERPROFILE%\Desktop\ミラーリング%time:~3,2%.txt"
```

# ミラーリング (事前シミュレーション実行＆実行)
手作業で管理していると、コピー元に保存したつもりが、間違えてコピー先に保存していて、ミラーリングすると消えちゃった！という不幸を起こすことがあります。
/L により、それを予防するため一旦シミュレーション実行し、ログを出力します。その後、実行確認を出します（この時、手動でログを確認し、`EXTRA`辺りでファイル内を検索して、消しちゃいけないファイルが無いか確認する）。良ければ続けて何かキーを押すと実際にミラーリングを実行します。

``` mirror_simulation_and_run.bat
@echo off
set MIR_SRC=
set MIR_DEST=
echo コピープレビューを行います(ドライブ直下を""付きで指定しないこと)
set /P MIR_SRC="コピー元: "
set /P MIR_DEST="コピー先: "
echo.
echo プレビュー中...
robocopy "%MIR_SRC%" "%MIR_DEST%" /DCOPY:DAT /NP /MIR /FFT /R:3 /W:3 /L /LOG+:"%USERPROFILE%\Desktop\シミュレーション%time:~3,2%.txt"
echo.
echo 良ければコピーします
pause
robocopy "%MIR_SRC%" "%MIR_DEST%" /DCOPY:DAT /NP /MIR /FFT /R:3 /W:3 /LOG+:"%USERPROFILE%\Desktop\ミラーリング%time:~3,2%.txt"

```

# オプション解説
/L と /QUIT の違い。/QUIT はミラーリング処理を全く行わずコマンドがどう解釈したのかを表示するだけ。/L はミラーリング処理に入るが、実際のファイル操作は行わず、あたかも処理を行ったかのように表示するシミュレーション実行。

##### /DCOPY:DAT
デフォルトでは、フォルダのタイムスタンプがコピーされないため指定（ファイルはデフォルトでDAT）

##### /FFT
ファイルシステムが FAT 系の場合、タイムスタンプが最大2秒ほどずれることがあり、更新してないのにコピーされる問題への対処（タイムスタンプのずれ2秒以内は許容し、更新したとみなさない）。
FATを使わない場合、このオプションはオフにする方が更新検出が精密になります。

##### /MIR
ミラーリングします（/E /PURGE と同義）

##### /R:3 /W:3
デフォルトでは、リトライ回数多すぎ、タイムアウト長すぎるので、適切に変更。
すごく回線環境悪い場合は、調整した方がいいかもしれません。

##### /L
実際にはファイル処理を実行せず、リスト表示のみ行う（あたかも実行したように表示する、シミュレーション実行）

##### /NP
「コピー中 ○○%」を表示しない。ログ出力ありの場合、大きなファイルをコピーするとこの進捗％で埋め尽くされる事に対応。処理速度も向上。

##### /LOG+
ログ出力（「+」有りなので追記モード）

##### /QUIT
ミラーリング処理を実行せず、robocopy コマンドがどう解釈したかのみを表示。
バッチファイルでファイルを結合する

Y子です。
今回は、ファイルを結合する方法を考えます。

難しいバッチファイルは作りません。
このバッチファイルは、簡単なコマンドを使って、現場でその場で作れることが大事です。
_【[確認環境：Windows 10 Home (Bld. 19042.928)](https://qiita.com/koiwaiwaiko/items/ef2d457ae1e1a7c8b698 "Windows10のバージョンを確認・表記する")】_

# 概要・用途
ファイルを結合します。
バイナリファイルでもテキストファイルでも、同じように結合できます。

わたしは下記のようなことがあり、必要に迫られて覚えました。

|用途（例）|
|:-|
|1時間区切りのバイナリログを出力する機器がある。<br>これを1週間程度動作させておき、ログを解析する。<br>1日の中でどのような傾向を示すのか知りたいため、1日単位のログにしたい。<br>ログを24時間単位で結合してから変換ツールにかけると、見やすくなる。|

まったく同じ需要はなかなかないと思いますが（笑）、まあそこはそれ。

# コード
## (1) コマンド例（最初の既存ファイルに追記）

```bat
> copy /b 01a.log + 01b.log + 01c.log + 01d.log
```

ファイルを`+`でつなげて書くと、1番目のファイルに2番目以降の内容が追記されます。
既存のファイルが更新されてしまうので、注意が必要です。
この例では、`01a.log`が更新されて、4ファイル分がまとまります。

## (2) コマンド例（最後の新規ファイルに結合）

```bat
> copy /b 01a.log + 01b.log + 01c.log + 01d.log 01.log
```

ファイルを`+`でつなげ、最後に`+`無しでファイル名を書くと、最後のファイルが結合後のファイルになります。
この例では、`01.log`が新しくできて、4ファイル分がまとまります。

## (3) コマンド例（ワイルドカード）

```bat
> copy /b 01*.log 01.log
```

ワイルドカードも使えます。
`01*.log`に該当するファイルがすべて結合され、`01.log`にまとまります。

## (4) バッチファイル例（指定した日付のファイルを結合）
`RcvLog_20210430_00.log`～`RcvLog_20210430_23.log`のファイルが1フォルダ（`C:\log dir`）に格納されているような場合を想定したバッチファイルです。
引数に日付を与えることで、繰り返し使えるようにしました。

```bat:merge_logfile.bat
@echo off

rem 引数がない場合は終了する
if "%~1"=="" (echo 引数がありません & pause & exit /b)

set str_date=%~1

cd "C:\log dir"
copy /b RcvLog_%str_date%_*.log RcvLog_%str_date%.log
```

```:実行結果
> merge_logfile.bat 20210430
RcvLog_20210430_00.log
RcvLog_20210430_01.log
RcvLog_20210430_02.log
RcvLog_20210430_03.log
※中略※
RcvLog_20210430_23.log
        1 個のファイルをコピーしました。
```

# おわりに
最初(1)の書き方しか知らず、1番目のファイルが書き換えられて焦りました。
(3)のワイルドカードを使う場合、似た名前のファイルをうっかり置いてしまうと一緒に結合されてしまいます。
愚直に(2)のような書き方をした方が、期限が迫った現場にいらぬ混乱を与えることもなくて良いと思います。
上記バッチファイルはワイルドカードを使っちゃいましたが！（だって楽だし…）

ではでは！
yukicoder contest 293 参戦記

# yukicoder contest 293 参戦記

## [A 1491 銀将](https://yukicoder.me/problems/no/1491)

さっぱり分からないので、まずはナイーブなコードを書いてみる.

```python
from itertools import product

def f(n):
    a = [(-1, -1), (0, -1), (1, -1), (-1, 1), (1, 1)]
    result = set()
    for i in range(n + 1):
        for p in product(a, repeat=i):
            x, y = 0, 0
            for xx, yy in p:
                x += xx
                y += yy
            result.add((x, y))
    return len(result)
```

実際に実行してみる.

```
>>> f(0)
1
>>> f(1)
6
>>> f(2)
18
>>> f(3)
38
>>> f(4)
66
>>> f(5)
102
>>> f(6)
146
>>> f(7)
198
>>> f(8)
258
>>> f(9)
326
```

どうやら *f*(*n*) = *f*(*n*-1) + (*f*(*n*-1) - *f*(*n*-2) + 8) になっているように見える. [Wolfram|Alpha](https://ja.wolframalpha.com/) に `f(n)=f(n-1)+(f(n-1)-f(n-2)+8), f(2)=18, f(3)=38` を入力したら *f*(*n*) = 4*n*<sup>2</sup>+2 と教えてくれたので解けた.

```python
K = int(input())

if K == 0:
    print(1)
else:
    print(4 * K * K + 2)
```
LeetCode日本語修行17日目- [137-一回だけ現れった数字II]

###Single Number II
参考：https://leetcode.com/problems/single-number-ii/
###問題の内容:
整数配列nums,1つの要素が1回現れる、それ以外、すべての要素が3回現れる、1回現れる1つの要素を除いて 
その要素を見つけ、それを返す。
###例:
例1:
Input: nums = [2,2,3,2]
Output: 3
例2:
Input: nums = [0,1,0,1,0,1,99]
Output: 99
###ヒント:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
numsの中、1回だけ現れる要素を除いて、各要素はちょうど3回現れます。

---

この問題の回答は、2進数変換を使うなら、解決できます。
**var cnt = IntArray(32)**をつくて、nums中の数字を2進数に変換して、入ります。
例1:
Input: nums = [2,2,3,2]
00...10
00...10
00...11
00...10
cntに入れった後、
cntは
00...41
そのあと、mod3を計算して、結果は
00...11,この結果を10進数に変換、結果は3です。

```Kotlin

class Solution {
    fun singleNumber(nums: IntArray): Int {
        var cnt = IntArray(32)
        for(num in nums){
            for(i in 0 until 32){
                if(((num.shr(i)) and 1) == 1){
                    cnt[i]++
                }
            }
        }

        var ans = 0
        for(i in 0 until 32){
            if((cnt[i] % 3 and 1) == 1){
                ans += (1.shl(i))
            }
        }
        return ans
    }
}

```
[OAuth2.0]PKCEのフロー

以前 [こちら](https://qiita.com/nobuo_hirai/items/f69f4781a0fe50e4cbf8) の記事でOAuth2.0について記載したのですが、今回は拡張機能である`PKCE`について記載したいと思います。

## PKCE(ピクシー)とは

Authorization Code FlowでClientがモバイルアプリを使用した場合、callbackURLを不正利用して認可コードを横取りしアクセストークンを取ることができてしまうという問題があったのですが、これを解決したのがPKCE(Proof Key for Code Exchange)フローです。

## フローの確認

Authorization Code FlowでcallbackURLを不正利用して認可コードを横取りした場合以下のようなフローでアクセストークンが取られてしまいます。
![Authorization Code Flow(認可コード横取り).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67654/a1762b88-1bb0-3f77-9a12-7f952fb80e99.jpeg)


続いてPKCE Flowは以下のようなフローになります。
![PKCE Flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67654/04fd5384-7abb-51cc-47b6-bf0e3b87d80e.jpeg)


このフローがなぜアクセストークンを取られないかを表したのが以下の図です。
![PKCE Flowが認可コードを横取りされてもトークンを取れれない確認.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67654/5757f620-38da-2348-41b4-98748aae6e2f.jpeg)


`code_challenge`は`code_verifier`を使って生成されるため`code_verifier`が分からないとエラーになります。`code_verifier`を割り出すには認可コードの有効期間内では無理なためアクセストークンが取られることはないという設計になっています。

## 最後に
今回はPKCEのフローの確認まででしたが次の投稿では`PKCE`の実装をおこないたいと思います。
docker pull を並列実行して高速化する

たくさんDockerイメージをpullしたい時ってネットワーク速度にもよりますが、わりと時間がかかってしまいます。
少しでも高速化できないかなと思い並列して `docker pull` を実行する方法を調べました。

## 回線速度

- https://fast.com/ja

`80 Mbps` の環境で調査してます。

## docker pull を直列実行

```
docker pull debian
docker pull ubuntu
docker pull alpine
docker pull fedora
docker pull centos
```

まとめて実行すると約70秒かかりました。

```
$ docker image prune -af
```

一旦pullしたイメージを削除します。

## docker pull を並列実行

```
docker pull debian &
docker pull ubuntu &
docker pull alpine &
docker pull fedora &
docker pull centos &
wait
```

約35秒かかりました。

## 結果

- 70秒 => 35秒

35秒の高速化に成功しました！！！
倍の速さです！！

CIでdocker pullする時も先に並列でdocker pullでダウンロードしておくといいかもしれないです。

## 補足

- `&` を付けてコマンドを実行するとバックグラウンドで実行されます
- `wait` 現在のシェルが実行しているジョブが終了するのを待つ

## 参考

- [シェルスクリプトで単純に並列実行・直列実行を行う](https://qiita.com/nyango/items/7b6b719f248b2ee8d379)
Flaskでブラウザ上にHello,World.を表示するまで

PythonのWebアプリ開発用フレームワーク「Flask」の初歩の初歩、Hello, Worldをブラウザで表示するまでをまとめました。

#Flaskクラスのインスタンスを作成
まずFlaskでアプリケーションを作る際にはFlaskクラスのインスタンスを作成します。

```Python
from flask import Flask

app = Flask(__name__)
```
Flaskクラスは変数にこのインスタンスがあるモジュールの名前をとります。
シンプルな（.pyファイルが１つしかないような）アプリケーションの場合は上記で良いのですが、
そうでない場合はモジュール名を渡す必要があるので、

```Python
app = Flask(__name__.split('.')[0])
```

などとすることがドキュメントでは奨励されています。
いくつかの拡張ライブラリではデバック時にappの正しい場所を変数として渡していないとライブラリ側で検知されず、デバックに苦労するみたいです。
（ドキュメントではFlask_SQLAlchemyなどが拡張パッケージの例として挙げられています）


#ルーティングとView Function
通常のWebアプリケーションではクライアントサイド（主にブラウザ）とサーバーがリクエスト/レスポンスのやりとりをしますが、Flaskではサーバー側を前項で作ったappが担います。
そのため、作成したappに何のリクエストが来た場合にどんな処理をするのか、を明示する必要があります。
このうち、「何のリクエスト」を示すのがルーティング、「どんな処理」を示すのがview functionです。

ルーティングはappのrouteメソッドを使って、デコレータとして記述し、View Functionはその名の通り関数として定義します。

```Python
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello, World.</h1>'
```

routeメソッドは引数にURLを取り、マッピングを行います。
上記ではルート（'/'）にアクセスした際にhtmlのh1タグをつけてHello, World.と表示するように処理してます。
※リクエストのメソッドを指定できたり、URLにクエリパラメータを想定したりもできるのですが、一旦ここでは割愛します。

#ローカル環境でFlaskアプリを起動し、Webブラウザで表示する
Flaskでの処理は以上で、最後にローカル環境でアプリを起動すればOKです。
※今更ですがFlaskはすでにインストール済みの想定です。

先ほど記述した.pyファイルをapp.pyとし、そのディレクトリで環境変数にてアプリファイル名を指定し、
flask runでアプリを起動します。

```
$ export FLASK_APP=app.py
$ flask run
 * Serving Flask app "app.py"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

```
上記の場合はhttp://127.0.0.1:5000/で起動しているので、ブラウザからアクセスすればきっとHello, World.と表示されていることでしょう。
【バッチ】拡張子をJPG→jpgに一括変更したい！

初バッチの記録。

# はじめに
とあるメーカー。
上司　「ここにある商品全部、デジカメで写真撮影して、Web上の自社システムに画像登録して！」
うめ　「了解です！」
・・・（撮影）・・・
うめ　「撮影完了。PCに画像データを取り込もう！」
・・・（PCにSDカード入れて、PCにファイルコピペ）・・・
うめ　「まずはシステム中の登録済画像のファイル形式を確認...jpg！」
うめ　「デジカメ画像データの拡張子は...JPG！」
うめ　「これjpgに直した方が良いよね??一括でやる方法は無いかなあ。」
・・・（検索検索）・・・
うめ　「あった！バッチファイルを作る？？よし、やってみよ！」

見つけた記事＝[JPG→jpg 大文字拡張子を一気に小文字へ変換する方法](https://live-pix.com/blog/archives/222)

# 1.変換したいファイルを一つのフォルダにまとめる

# 2.バッチファイルを作成
(1)Windowsのメモ帳を開く
(2)「ren *.JPG *.jpg」と入力

```:Windowsのメモ帳
ren *.JPG *.jpg
```
(3)「任意のファイル名.bat」と名前を付け、「1.」のファイル内に保存。

・バッチファイル=
Windows環境で実行できるコマンド列を記述したテキストファイル。拡張子は「.bat」。

・バッチ処理=
複数のコマンドを順次実行すること。つまり、バッチファイルに上からコマンドを書いていけば、その順番で実行されるということ。頻繁に実行する処理の一連の流れをバッチファイルに記述しておけば、いつでもまとめてその処理を実行できる。
（参考：[バッチファイル(BATファイル)とは？作り方や書き方を初心者向けに解説！](https://it-trend.jp/development_tools/article/32-0040)）

# 3.バッチファイルの実行
作成したバッチファイルをダブルクリックすると、命令が実行される。
（この時点ではファイルの拡張子は「JPG」のまま。）
一旦フォルダを閉じるか、別のフォルダに移動した後、
再度、該当フォルダに戻ると、拡張子が変更されていることが確認できる。
完了！！
batファイルはそのまま削除してOK。

# 参考
・[JPG→jpg 大文字拡張子を一気に小文字へ変換する方法](https://live-pix.com/blog/archives/222)-Live Pixel Blog 2018.06.17記事
・[バッチファイル(BATファイル)とは？作り方や書き方を初心者向けに解説！](https://it-trend.jp/development_tools/article/32-0040)）-ITトレンド 2020.10.19記事
【初心者でもわかる】レンガのように1段ごとに半分ズレる積み方をCSSで再現

# どうも7noteです。奇数段と偶数段でずれる組み方の作り方

こういうやつですね。
![スクリーンショット 2021-04-30 22.51.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/11a88f64-4bd8-5913-fd04-eaea5301a0a6.png)

奇数段と偶数段で半分ずれているのが分かると思います。

appストアなんかでもアプリのアイコンを並べるのに使われてました。

![スクリーンショット 2021-04-30 22.32.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/c1473a71-412a-69ce-86d6-d2c7435c5cca.png)


それでは背景画像を使った方法と、複数枚の画像をレンガ風に並べる2つの方法を解説していきます。

## ソース

### 方法１：「背景画像を使う方法」

まず画像で2段分作成します。1つのパーツでみるとこんな感じ。これをリピートさせることで再現が可能になります。

![parts.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/c08ff61b-faa4-63df-8a4f-59faaec81132.jpeg)

```index.html
<div class="bg"></div>
```

```style.css
.bg {
  width: 150px;   /* 幅を指定 */
  height: 100px;  /* 高さを指定 */
  background-image: url(parts.jpg); /* 背景画像でパーツを指定 */
  background-size: 40px 32px;       /* 1パーツの大きさを指定 */
}
```

**完成例**
![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/8b4c2f5c-7eef-c48c-c067-e8dcb0f37d25.png)

### 方法２：「複数画像を並べる方法」

```index.html
<div class="box">
  <ul class="blocks">
    <li><img src="A.png"></li>
    <li><img src="B.png"></li>
    <li><img src="C.png"></li>
  </ul>
  <ul class="blocks">
    <li><img src="B.png"></li>
    <li><img src="C.png"></li>
    <li><img src="A.png"></li>
    <li><img src="B.png"></li>
  </ul>
  <ul class="blocks">
    <li><img src="A.png"></li>
    <li><img src="B.png"></li>
    <li><img src="C.png"></li>
  </ul>
</div>

```

```style.css
.box {
  width: 170px;     /* 幅を指定 */
  overflow: hidden; /* はみ出た部分を非表示にする */
}

.blocks {
  margin-bottom: 10px; /* 適度な余白を指定 */
  white-space: nowrap; /* 改行を禁止する */
  line-height: 0;      /* 謎の余白があれば指定 */
}

.blocks:nth-child(even) {
  margin-left: -30px; /* 偶数行を左にずらす */
}

.blocks li {
  width: 50px;           /* 幅を指定 */
  display: inline-block; /* インラインブロック要素にして横並びにする */
  margin-right: 10px;    /* 適度な余白を指定 */
}
```

**完成例**
![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/f7a00099-9b1b-cfc1-3813-de76e8a55490.png)



##まとめ

CSSだけで、レンガ積みのような段ごとに半分ズレるデザインを作りました。

この積み方の名前を調べたのですが、わからなかったのでこういうのを何て言うのか知ってる人がいたら教えてください。

**半分ズレるので、見切れても問題ないような画像を使うか、見切れる場合でも自動でゆっくりスライドするアニメーションなどと組み合わせる必要がありそうです。**

用途に合わせてうまく利用してみてください。


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
AWS日記26 (AWS Fargate)

# はじめに
今回は AWS Fargate を試します。
スケジュールでタスクを実行する機能を作ります。


[今回作成した SAMテンプレート]
(https://github.com/tanaka-takurou/serverless-fargate-go)



# 準備
[AWS SAM の準備をします](https://qiita.com/tanaka_takurou/items/cae7c19fc3aaf0031abb)

AWS Fargateの資料
[Fargate を使用した Amazon ECS の開始方法](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/getting-started-fargate.html)

Dockerの資料
[Docker ドキュメント](https://docs.docker.jp/index.html)

# 作業手順の概略
 - Dockerfile作成
 - 管理コンソールの[Amazon ECR リポジトリ](https://ap-northeast-1.console.aws.amazon.com/ecr/repositories?region=ap-northeast-1)からイメージリポジトリの作成
 - 「プッシュコマンドの表示」の手順に従い Docker Image を作成、プッシュ
 - AWS SAM アプリケーションをデプロイ

# Dockerfile作成

### 
```dockerfile  
FROM golang:alpine
COPY main.go /go/
```

# AWS SAM テンプレート作成

AWS SAM テンプレートで ECS , CloudWatch の設定をします。

[参考資料]
[AWS SAM テンプレートを作成する](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorial-lambda-sam-template.html)

### AWS ECSの設定は以下の部分
```yaml
  Cluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterName: !Ref ProjectName

  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Ref ProjectName
      RequiresCompatibilities:
        - FARGATE
      Cpu: !Ref TaskCpu
      Memory: !Ref TaskMemory
      NetworkMode: awsvpc
      ExecutionRoleArn: !GetAtt EcsTaskExecutionRole.Arn
      TaskRoleArn: !GetAtt EcsTaskRole.Arn
      ContainerDefinitions:
        - Name: app
          Image: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${ProjectName}
          EntryPoint:
            - 'sh'
            - '-c'
          Environment:
            - Name: TZ
              Value: Asia/Tokyo
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-region: !Ref 'AWS::Region'
              awslogs-group: !Ref LogGroup
              awslogs-stream-prefix: app
          Essential: true

```

# 終わりに
AWS Fargate を使用し、スケジュールでタスクを実行する機能を作りました。
[ECS Exec を利用したコンテナへのアクセス](https://aws.amazon.com/jp/blogs/news/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/)も行える為、今後試そうと思います。

<details><summary>参考資料</summary><div>

[CloudFormationを使ってAWS Fargateの環境を構築する](https://qiita.com/okubot55/items/02911f81fec614255f90)

[ECS Fargate 楽々構築テンプレート](https://note.com/dd_techblog/n/n109b59faa5f5)

[CloudformationでFargateを構築する](https://dev.classmethod.jp/articles/cloudformation-fargate/)
【Ruby初心者向け】　if文とCase文を使い分けよう！



##はじめに 
この記事は、Ruby/Railsの学習期間約1ヶ月の著者が書いた初投稿ものです。
謝った解釈があるかもしれませんので、その際は修正コメント等いただけると幸いです。

今回の記事は、条件分岐を学習している際に、`if`と`case`のどちらを使えばいいか悩んだため、これから学習を始める方々に少しでもお力になれればと思い書きました。

(※一部訂正致しました)

##環境
- `macOS Big Sur 11.3`
- Rubyバージョン:`2.7.2`

##if文について
if文は、「もし〜だったら〜の処理をする」といいった条件に一致(true)した時に処理を実行します。
イメージは`複数`です。
メリットは3つ
  - `書きやすい`
  - `複数の比較対象を組み合わせることができる`
  - `複雑な条件を扱うのに適している`

```rb
if "条件"
  p "true"
else
  p "false"
end
```

`else`は省略可で、なくても大丈夫です。


`elsif`を使用して、複数の条件を書くこともできます。

```rb
if "条件"
  p "条件1がtrueの時"
elsif "条件2"
  p "条件2がtrueの時"
elsif "条件3"
  p "条件3がtrueの時"
else
  p "上記の条件に該当しないfalseの時"
end
```

##case文について
case文は、1つの比較対象に対して複数の条件を判定する時に実行します。
イメージは`単体`です。　
メリットは2つ
  - `シンプルなコードを実現できる`
  - `可読性の高い書き方ができる`

```rb
case "1つの比較対象"
when "値1"
  p "値1に一致"
when "値2"
  p "値2に一致"
wehn "値3"
  p "値3に一致"
else
  p "一致しない時"
end
```

## if文とcase文の比較
ここで3つの例を比較してみましょう。

1、まずは`年齢`です 
if文の場合

```rb
age = 20

if age >= 65
  p "高齢者です"
elsif age >= 20
  p "成人です"
elsif age >= 2
  p "子供です"
else
  p "幼児です"
end
```


caseの場合

```rb
age = 20

case age 
when 65..100
  p "高齢者です"
when 20..64
  p "成人です"
when 2..19
  p "子供です"
else
  p "幼児です"
end
```
その年齢1つに絞ることで、シンプルで可読性がありますね。

2、次に`信号の色`を例にしてみます。
if文の場合

```rb
color = "red"

if color == "red"
  p "止まれ"
elsif color == "yellow"
  p "注意して進むか止まれ"
elsif color == "blue"
  p "進め"
else
  "該当しません"
end
```

case文の場合

```rb
color = "red"

case color
when "red"
  p "止まれ"
when "yellow"
  p "注意して進むか止まれ"
when "blue"
  p "進め"
else
  p "該当なし"
end
```

if文はコードの量が多いですが、case文はシンプルですね。

3、`時間(24時間)`を例にすると...
if文の場合(訂正致しまいた)

```rb
time = 7

if (0..5) === time
  p "深夜です"
elsif (6..11) === time
  p "午前中です"
elsif (12..18) === time
  p "午後です"
elsif (9..23) === time
  p "夜です"
else
  p "そんな時間ありません"
end
```

case文の場合

```rb
time = 7

case time
when 0..5
  p "深夜です"
when 6..11
  p "午前中です"
when 12..18
  p "午後です"
when 19..23
  p "夜です"
else
  p  "そんな時間ありません"
end
```
こちらは、1つの比較対象（ここでは6という時間）に対して判定しているcase文の方がシンプルですね！

##結論
if文とcase文にはどっちが正しいと言った明確なルールはなく、どちらでも使うことができます。
ただし、今回の3つの例からもわかる通り、条件によっては可読性が変わっていきます。
けれども、おおよそは比較対象の数`複数（if）or単体（case）`で判別することができると思います。

また、現職のエンジニアの人の話によると、`使い分けは人それぞれの好みで、書きやすい方で書くのが良い`とのことでした。

基本的には`可読性を重視して書く事を意識する`が大事だと思いました。

## さいごに

今後もRuby/Railsを学習する過程で、理解を深めていき、有益な情報を発信できればと思いますので、良ければLGTMお願いします！
格安SIMならぬ格安VPSを使ってみた with Ubuntu20

## ぼく「VPSのメモリが足りん！」

### 元々使っていサーバーのスペック

さくらVPS 2G

- 3Core CPU
- 2GB MEM
- HDD 200GB

ぼく「そういえば年間契約の更新通知きてたな」

ぼく「最近メモリカツカツなので足したいなぁ」

ぼく「確かスペックアップは料金かからんはず」

ぼく「どれどれ」

さくらたそ「3,520円やぞ」

ぼく「高いお・・・」

ぼく「とりあえず別なの探すか」

## CONTABOとの出会い

ぼく「なんか安いのないかなぁ」

G先生「あるよ」

https://contabo.com/en/vps/

夜中のテンションのぼく「4C8Gで$7？ふざけてんのか？？？契約するわ」

### そして契約へ

ぼく「どれどれ。」

ぼく「とりあえず必要な情報を入れてPaypalで支払い、っと」

ぼく「だいたい9600円くらいの決済だった」

ぼく「さくらたその半額以下やんけ」

ぼく「OSはUbuntuで。」

### 即座に来るメール

ぼく「お、なんか連絡きた」

スッタフ「住所＆氏名が分かるやつ送れ。免許証とか」

スッタフ「送らんと作れんからな」

ぼく「不正利用防止のためか。しゃーなし。」

ぼく「メールで免許証のコピーを送信・・・っと。」

ぼく「とりあえず寝るか」

### そして朝を迎える

スッタフ「VPSできたで（免許証送って10分後）」

朝起きたぼく「マ？」

めでたくVPSが出来上がりました。

ぼく「ちょうど月末やし、さくらVPSは解約したれ」

ぼく「何かあったらAzureあるしなんとかなるやろ」

## 初期設定

開通メールに以下の情報が載っているので、それを利用して進める

- IP
- VNCの設定
- rootパスワード

ぼく「とりあえず、rootのログインだけは即座に制限しないとアカンな」

ぼく「まっさらなUbuntuセットアップ手順と思ってやってみよう」

### ログイン

```shell
ssh root@wwww.xxx.yyyy.zzzz
```

Puttyなどを使ってもOKです。

### とりあえずアップデート

```shell
apt update
apt upgrade
```

特にアップグレードする内容はなかった。

### ユーザーの追加

```shell:ユーザーの追加
adduser taro
```

※実際のユーザー名は自分が好きなものに変えてください。

```shell:sudoを使えるように
usermod -G sudo taro
```

この状態で、一度作成したユーザーでログインしてsudoが動くか確認します。

```shell
taro@vmixxxxx:~$ sudo su -
[sudo] password for taro:
root@vmixxxxx:~#
```

rootになれさえすれば、あとはなんとでもなります。
セキュリティを高めていきましょう。

### SSHの変更を変える

```shell
$ cd /etc/sshd
$ sudo vim sshd_config
```

#### 変更点

接続ポートを変更。
※番号は任意のものにしましょう。

```config:sshd_config
#Port 22
↓
Port 19922
```

パスワードを無効なままでもいいですが、
そもそもログインさせない方が良いので消しちゃいましょう。

```config:sshd_config
PermitRootLogin prohibit-password
↓
PermitRootLogin no
```

#### SSHデーモンの再起動

```shell
$ sudo systemctl restart sshd
```

ここまで終わったら、rootではなく作成した自身のユーザーでログインします。


```shell:クライアント
ssh taro@www.xxx.yyy.zzzz -p 19922
```

これでログインが成功すればOKです。

うまく行かない場合には、VNCでアクセスするかサーバーの再インストールを試しましょう。

### ファイアウォールの設定

ぼく「次はファイアウォールだな」

#### ufwの有効化

```shell
$ sudo ufw enable
```

#### 現状を確認

```shell
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
```

#### 必要なポートを開けていく

最低限SSHのみ開ける。
VNCは必要に応じて開ける

```shell
$ sudo ufw allow 19922
```

## その他設定

Timezoneの設定

```shell
$ sudo timedatectl set-timezone Asia/Tokyo
```

## さいごに

ぼく「とりあえず問題なく使えそうやな」

ぼく「デスクトップも入れてみたけどやっぱり遅いな。使えんこともないがまあ要らんか」

ぼく「そんなことより早くサーバーの中身うつさないと・・・」
ふと塾について考えてみた

ふと、子供が生まれるタイミングで「高槻にある塾でおすすめのところはなんだろう」と考えた。
そもそも大学受験は、大きな人生の帰路であるため、先にはなるが大学受験でおすすめの塾は何かを調べてみた。

結論から言うと「マナビズム」（https://manaviism.com/）
が良さそう。
理由としては、自己学習のコンサルティングに力を入れているから。

授業をすることは一般的で、そこはどこも変わらないと思っている。
だからこそ「授業以外の時間」をどう過ごすかが大切。

ライザップなども、トレーニングだけでなく、私生活での食事管理もあるから価値がある。
それと同じような良い取り組みをしている塾。

そこにフォーカスして取り組んでいるので、なかなか良さそうだなと正直に感じた。
スマートコントラクトを使ったサンプルWeb3.0アプリケーションを開発する

<h1>
 solidityを使ったWeb3.0アプリケーションをコーデイングしてみた
</h1>

ネット上でも、solidityを使ったweb3.0アプリケーションを使って開発した本や記事がまだまだ少ないので記事を投稿してみました。

下記書籍を参考に今回は、Web3.0アプリケーションを作ってみました。
<a href="https://www.amazon.co.jp/Solidity%E3%81%A8Ethereum%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%B3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E9%96%8B%E7%99%BA-%E2%80%95Truffle-Suite%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E9%96%8B%E7%99%BA%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%BE%E3%81%A7-Kevin-Solorio/dp/4873119340">
実践スマートコントラクト開発
</a>

ソースコードは、GitHub上で公開しています。
<a href="https://github.com/mashharuki/fundraiser-dapp">
  fundraiser-dapp
</a>

いきなり、メインネットやテストネットで試すのはハードルが高いため、Ganacheを使って、プライベートネット上にスマートコントラクトを
デプロイしてWeb3.0アプリケーションを体感してみました。

なお、このリポジトリを動かすには、事前に下記が必要となります。

1. node.jsをインストールしておくこと
2. ganacheをインストールして事前に起動しておくこと
3. ganacheを使ってプライベートネット上にスマートコントラクトをデプロイすること
４. MetaMaskをインストールしておくこと
5. プライベートネットの秘密鍵をMetaMaskにインポートしておくこと

以上となります。

まず、コーディングして感じたのが、フレームワーク「truffle」と「React」の凄さ！！
Reactはフロントエンド側開発用のJavaScriptのフレームワークとなりますが、JSXを使って、要素をコンポーネントとして扱うところが面白い！
ぜひ、習得して実際の業務でも使用してみたいと思いました！！

そして、何より、コマンド「truffle unbox react」でテンプレートファイルが作成されて土台部分がすぐに出来上がるのが便利すぎる！！
最初は、何書いてあるかチンプンカンプンだったが、段々と勉強していくうちに分かったので、特に問題なし！

MetaMaskと組み合わせて、実際に動かしてみるとブロックチェーンがデータベースの一種であるという説明にも納得がいく。
今までは、本の中に書いてあるだけでなんとなくでしか理解していなかったが、やはり自分でコーディングしてみると理解度にも天と地の差がある。

これで、Web3.0アプリケーションの土台部分ができたわけで、色々と試していきたいと考えている。

EIP712のデモサンプルやマルチシグコントラクトと合わせて、マルチシグウォレットアプリなんかを作ってみると面白いかも。。。
ブロックチェーンエンジニアになりたいと思ってきた！！

今は、コロナ禍で色々と制約があって大変だけど、アフターコロナに備えて自分の技術力をさらに高めていきたいと考えている。  

【2021年5月15日追記】

上記に挙げているソースコードについてうまく動かない部分があったため、修正いたしました。

実際に動かしてみることで、ブロックチェーンとは何か？スマートコントラクトとは何か？を体系的に学び感じることができるはずです！！(筆者も実際に動かしてみて感動しました。)

次世代の標準となるであろうWeb3.0アプリケーションのフレームワークにして行こうと思います！！
ラズパイで屋外の土壌温度を確認する（その1）

#はじめに
ある日、兼業農家の友人から「土の中の温度を定期的に観測したいんやが」との相談が。
どうやら__種を植える時期を決めるためには土の中の温度が重要__らしい。

ということで__ラズパイを使って自宅から屋外の畑の土壌温度を可視化してみよう！__に取り組んでみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422558/956fe8d8-455a-8d59-a7cd-def2781082c2.png)


#想定したシステム
最初は自宅ベランダの家庭菜園で使用できればOKとのことだったので、ネットワークは自宅のWiFiを使用。屋外で使用するので防水ボックスの中に電装部品を納める構成としました。

バッテリーを長持ちさせるためESP8266のdeepsleepを利用して一定周期でラズパイをON/OFFするシステムとしています。

###構成部品
+ [タカチ防水ボックス：BCAPシリーズ](https://www.takachi-el.co.jp/products/BCAP)
+ 防水センサー　DS18B20
+ Raspberry Pi Zero WH
+ ESP8266 開発ボード
+ WayInTop リレーモジュール 1チャンネルDC5V
+ ケーブルグランド
+ ブレッドボード、ジャンパワイヤーなど
+ USBケーブルなど

![想定システム図.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422558/695b9fbf-7ad6-076e-1a25-8f97c25defa5.png)
こんな感じにしたいです。果たしてうまくいくのか・・・

#1.ラズパイと温度センサーを繋ぐ
以下を参考にしました。特に問題なくDS18B20から温度データを取得できました。

__Raspberry Piで水温を取得する。(DS18B20)__
https://www.taneyats.com/entry/raspi-smart-aquarium-2




#2.温度データをAWS IoTに送信する
AWSを触るのがかなり久しぶりでしたが、ちょうどよいハンズオン資料がAmazonにありました。

__AWS IOT CORE 初級ハンズオン__
https://aws-iot-core-for-beginners.workshop.aws/


こちらの__phase3. AWS IoT Core のセットアップ__を参考に、DS18B20から取得した温度データをAWS IoTへ送信します。AWS IoTのテストから送信したtopicを指定してデータを確認、問題なく送信できていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422558/139baa2b-4299-7d11-0c78-cd0ac7f8f297.png)




#3.送信されたデータをDynamoDBに格納する

続いて以下を参考に、DynamoDBでテーブルを作成しAWS IoTに送られたデータを格納します。

__データをAWS IoT経由でDynamoDBへ保存する__
https://qiita.com/0_1geek311/items/93ac822b8561c6dbce3c

パーティションキーに【DEVICE_NAME】、ソートキーに【TIMESTAMP】を指定しテーブルを作成。DS18B20で取得した温度データが無事DynamoDBに格納されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422558/01256297-6120-46ef-7ce6-dff8833c1f34.png)


#4.DynamoDBのデータをグラフ化（IoT.Tokyo VISの利用）
DS18B20の温度データがラズパイを経由してAWS IoTへ送信され、DynamoDBに格納される所まで実現できたので、次にDynamoDBの温度データのグラフ化を行います。いろいろ調べたところ、IoT.tokyo VISというサービスが簡単でかつやりたいことに近かったためこちらを利用することにしました。

__IoT.tokyo VIS__
https://iot.kyoto/

>Amazon DynamoDBに保存したストリームデータからリアルタイムでグラフを描画
インターネットに接続できるIoTデバイスとAWS環境を用意すれば、簡単設定でWebブラウザにリアルタイムグラフを表示できます。

DynamoDBに格納されたデータをグラフ化してくれるというサービス。
登録するだけで無料で利用できるのでちょうどよさそうです。マニュアルに沿ってIAM AccessKeyの取得、アカウントを作成し、DynamoDBのデータをグラフ化してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422558/47d37a51-4ec4-4e2c-d4a8-f282b3c1dd6f.png)

・・・めちゃくちゃ簡単にグラフ化できてしまった。最高すぎる。
我が家の室温を10分ごとに取得しているだけなのでグラフは横一直線ですが、ちゃんとDynamoDBの値をグラフ化してくれています。



ここまでで屋外に設置した温度センサ(DS18B20)の値をいつでも自宅から確認できるようになりました。


ただしこのままではラズパイを常時ONで運転する必要がありバッテリーが長持ちしませんので、次の記事ではESP8266のdeep sleepを用いたラズパイの定期起動に取り組んでみます。
Raspberrypi + Pythonで、今日のゴミの日を取得して、LINE通知とアレクサにお知らせしてもらう

ゴミ出しを忘れないよう、とりあえず:smiley:作ってみた。
cron で1日1回一ヶ月間動かしてみて様子見。
※url、token は伏せています。

```
#!/usr/bin/python3
# 市ゴミの日カレンダーの HTML を解析して
# 今日が何のゴミの日かを LINE Notify に通知する
# 該当なしの場合何もしない
#
import subprocess as sp
import re
import requests
import datetime
from bs4 import BeautifulSoup
import urllib.request as req
from string import digits

SECRET = XXX
def send_line_notify(notification_message):
    line_notify_token = 'yXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'message: {notification_message}'}
    requests.post(line_notify_api, headers = headers, data = data)

yyyymm = str(datetime.datetime.today().strftime("%Y-%m"))
url = "http://www.hoge.city.jp/gomical/calendar.html?date=" + yyyymm + "&id=" + str(SECRET) + "#gaba
ge-calendar"
response = req.urlopen(url)
parse_html = BeautifulSoup(response,"html.parser")
print (parse_html.title.string)

table = parse_html.findAll("table",{"class":"calendar"})[0]     # calendar class を探す
rows = table.findAll("tr")

dd = str(datetime.datetime.today().strftime("%d"))
for row in rows:
    for cell in row.findAll(['td','th']): # カレンダーテーブルを読み込む
        if len(cell.get_text()) > 3:    # ゴミの日以外は日付2文字しかない
            cal_dd = cell.get_text()
            m = re.search(r'\d+', cal_dd)  # 1日はもやすごみ  の1 を取得する
            if dd == m.group(): # dd (Today) と、カレンダーの日付が同じ（今日がゴミの日なら）
                tbl = str.maketrans('','', digits) # カレンダーから取得した日付を除去する
                str = cal_dd.translate(tbl)
                msg = "今日は" + str + "の日です"
                rc = sp.run("/var/www/html/alexa.sh -e 'speak:" + msg + "'", shell=True, stdout=True, stderr=sp.PIPE, text=True).returncode
                send_line_notify(msg)
#end of Gabage.py
```
findコマンド

# 古い日付のファイルを探して消したい
※「シス環系女子 season2 第10~11話」の備忘録です。

## findコマンド

- -ctime

以下は「/backup/daily」ディレクトリ配下の30日以上前のファイル一覧を表示するコマンド

```
find /backup/daily -ctime +30
```

※-ctimeは「+」で指定日より昔を表、「-」で指定日より現在寄の時系列を表す。

以上より、30日以上前のファイルを削除するシェルスクリプトを書くとすると以下のようになる。

```
#!/bin/bash

remove_files = $(find /backup/daily -ctime +30)
for file in $remove_files
  rm "$file"
done
```

またrmコマンド（削除コマンド）を伴う処理を実行する場合は、以下のようにパイプラインでlessにつなげて、一度確認してみた方が良い。

```
$ find /backup/daily -ctime +30 | less
```

- -and

以下は、1ヶ月前から2ヶ月前までの間のファイルで、ファイル名に「report」か「error」を含む文字列。

```
$ find /logs/ -ctime +30 -and -ctime -60 -and \( -name "*report*" -or -name "*error*" \)
```
LPIC201かいつまんだチートシート

####htop
Cpuコア、メモリ、swapの使用率

####iostat
システムCPU、Disk IO

####カーネルイメージ
/boot/vmlinuz-2.6.3

####初期RAMディスクイメージ
/boot/initrd.img-2.6.3

####カーネルアドレスマップ
/boot/System.map-2.6.3

####カーネルコンフィギュ
/boot/config-2.6.3

####カーネルに必要なファイル
/usr/src/linux/

####カーネル各種設定
/usr/src/linux/.config

####カーネル本体
/usr/src/linux/kernel/

####カーネルのビルド時に参照する資料
/usr/src/linux/Documentation/

####makeやカーネルのver情報
/usr/src/linux/Makefile

####make modules_installインストール後
/lib/modules/2.6.3/

####カーネルパラメータを恒久的に変更dir
/etc/sysctl.d/

####Red Hatのcrondの自動起動調べる
chkconfig --list crond

####カーネルイメージにルートファイル位置を書き込み
rdev

####xfs情報
xfs_info

####作成済XFSに対して様々な設定
xfs_setup

####mke2fs実際には実行しない
-n

####ext2/ext3/ext4ファイルシステムのチェック
e2fsck

####作成済extに対して設定
tune2fs

####ブロックデバイス全体の暗号化
dm-crypt

####ext対話的デバッグ
debugfs

####レイドの情報を表示
-Q   --query

####レイドの詳細情報
-D   --detail

####RAID を構築
0xfd

####RAID管理・操作
/etc/mdadm.conf
/etc/mdadm/mdadm.conf

####RAID アレイの状態
/proc/mdstat

####iscsiadm接続先
-p   --portal

####SCSIターゲットを指定
-T   --targetname

####SSD最適化
fstrim

####iSCSIターゲットを一意に識別
IQN

####共有ライブラリの検索パス
LD_LIBRARY_PATH
GASの新しいエディタでS3ライブラリを使用する方法

ついこの前、久しぶりにGASを触ってみたのだが、GASに新しいエディタが登場していた。
そこで、S3ライブラリの使用方法が変更されていたので載せておこうと思う。

## TL;DR
- GASでS3ライブラリを使用するとき、スクリプトIDが変わったよ
- 新しいエディタで使用できるスクリプトID：`1Qx-smYQLJ2B6ae7Pncbf_8QdFaNm0f-br4pbDg0DXsJ9mZJPdFcIEkw_`

## S3ライブラリの追加方法

スプレッドシートからGASで値を取得し、S3にアップロードしたりする場合、以前のエディタでは`スクリプトID`を貼り付けていた。

以前のS3ライブラリのスクリプトID：`MB4837UymyETXyn8cv3fNXZc9ncYTrHL9`
GASのS3ライブラリについて：[Amazon S3 API Binding for Google Apps Script](https://engetc.com/projects/amazon-s3-api-binding-for-google-apps-script/)

だが、新しいエディタでは左側のメニューにライブラリ追加欄ができている。
![スクリーンショット 2021-04-30 21.48.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593705/4edf6bb5-4f33-6f31-149b-f4ac41bf2682.png)


「ライブラリ　＋」の＋をクリックすると、ライブラリの追加画面が表示される。
ここにスクリプトIDを入力し検索をかけることで、該当するライブラリを使用することができる。
![スクリーンショット 2021-04-30 21.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593705/d9f38770-e059-3c5d-5be5-2323e0b682b2.png)


ここで困ったのが、以前まで使用していたS3ライブラリのスクリプトIDが検索に引っかからないことだ。
![スクリーンショット 2021-04-30 21.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593705/ce122c23-d7a2-e563-8068-d975394b0459.png)


一度、以前のエディタでS3ライブラリを追加してみる。
![スクリーンショット 2021-04-30 21.57.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593705/abf3ce6f-27e6-dea3-3ea9-b60f5f915d69.png)


正常に追加することができた。
新しいエディタに再び切り替えても、S3ライブラリは正常に追加されている。
![スクリーンショット 2021-04-30 21.58.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593705/849a1642-2fa3-94ab-d782-ba59b81a5c43.png)


そこで、GASの設定ファイルである`appsscript.json`ファイルを見てみる。
新しいエディタでのappscript.jsonの表示方法：[Google Apps Scriptの開発画面が新しくなりました officeの杜](https://officeforest.org/wp/2021/01/12/google-apps-script%E3%81%AE%E9%96%8B%E7%99%BA%E7%94%BB%E9%9D%A2%E3%81%8C%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F/#:~:text=以前のプロジェクトキーはもう使えない-,appsscript.jsonを表示する,-Google)

ライブラリIDなるものが追加されていた。

```appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "libraries": [{
      "userSymbol": "S3",
      "libraryId": "1Qx-smYQLJ2B6ae7Pncbf_8QdFaNm0f-br4pbDg0DXsJ9mZJPdFcIEkw_",
      "version": "4"
    }]
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
```

このライブラリIDを、新しいエディタのライブラリ検索欄に入力してみた。
![スクリーンショット 2021-04-30 22.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593705/b5bd01f7-e328-1673-6725-825a2f72d2dd.png)


S3ライブラリにヒット！
やったね！
![スクリーンショット 2021-04-30 22.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593705/bbb24814-5f90-a95f-7f6d-28543e721d52.png)


## まとめ

久しぶりにGASを使ってみたらエディタが一新されていて見やすくなっていた。
ただ、今回みたいにスクリプトIDが変わっていたり、以前と同様に使えるというわけではなさそう。

GASはスプレッドシート以外にも使用でき、色々効率化できるので、これからも積極的に利用していきたい。
LPIC102個人的なチートシート

#lpic 102 個人的なチートシート
----
#####自分用に環境変数を設定
~/.bash_profile

#####特殊変数、実行したシェルスクリプト名
$0

#####現在のシェルのプロセス番号
$$

#####許可リストへ追加
xhost +172.16.0.4

#####環境変数によるXサーバの指定
export DISPLAY=172.16.0.1:0

#####X Window Systemのエラー
.xsession-errors

#####MonitorセクションとDeviceセクションの組み合わせ
Screen

#####「XDM」の設定ファイル
/etc/X11/xdm/xdm-config

#####ランレベル3からX Window Systemを起動
startx
xinit
~/.xinitrc
/etc/X11/xinit/xinitrc

#####グラフィカルログイン使用プロトコル
XDMCP

#####useraddデフォルトの値
/etc/default/useradd

#####user1を削除ホームディレクトリも一緒に削除
userdel -r user1


#####グループアカウント「GA」のグループ名を「GB」へ変更
groupmod -n GB GA

##### 一般ユーザのログインを禁止したい場合
/etc/nologin

#####パスワード無効化
!
*

#####グループのパスワードやメンバーを設定
gpasswd

#####一時的なtimerユニット作成
systemd-run

#####ユーザーのcron設定ファイル
/var/spool/cron/

#####systemdにおいてtimerユニットを表示
systemctl list-timers

#####1回限りのジョブを削除
at -d
atrm

#####/etc/crontabスクリプトファイルを置くDir
/etc/cron.d/

#####1回限りのジョブの一覧
atq
at -l

#####ロケール
通貨：LC_MONETARY
数値書式：LC_NUMERIC
文字分類：LC_CTYPE
日付時刻：LC_TIME
言語：LC_MESSAGES
アドレス：LC_ADDRESS
名前：LC_NAME

#####環境変数を設定してAsia/Tokyoを使用
export TZ=Asia/Tokyo

#####/etc/timezoneで使用できるタイムゾーンの値を表示
tzselect

#####ロケール設定ファイル
/etc/locale.conf

#####タイムゾーンの情報ががあるDir
/usr/share/zoneinfo/

#####システム時刻や時刻同期の状態を表示
timedatectl
TZ設定：set-timezone
TZ表示：list-timezones
ntp同期：set-ntp
時刻設定(HWとSY)：set-time

#####HW→SYS反映
hwclock --hctosys

#####SYS→HW反映
hwclock --systohc

#####HWkクロック時刻を表示
hwclock -r

#####chronyc
ズレ具合：difile
時刻ソース：sources

#####ログローテーションの設定
/etc/logrotate.conf

#####ジャーナルファイルに書き込む
systemd-cat

#####journalctl
最新：-r、--reverse
Dir：-D、--directory
古い削除：--vacuum-time
表示可能：-l、--full
サイズ削除：--vacuum-size
行表示：-n、--lines

#####ローテーション機能
logrotate

#####ホスト名やネットワークを設定
/etc/sysconfig/network

#####レガシーで印刷ジョブを削除
lprm
AWSとWordPressを使ってWebサイトを構築しよう②

前回はWebサイトを構築していくために必要な「サーバー構築の考え方」と「ネットワーク構築の考え方」を学びました。

今回は<b>どんなサーバー構成とネットワーク構成でWebサイト環境を構築するか</b>について解説していきます。

#目次
[1.全体の設計図](#1-全体の設計図)
[2.NATゲートウェイとは](#2-natゲートウェイとは)
[3.インターネットゲートウェイとは](#3-インターネットゲートウェイとは)

#1. 全体の設計図
まずはこれから構築していくWebサイト環境の全体設計図を見ていきましょう。
![キャプチャ7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159544/511235e3-5b3e-60de-dbc6-30d9da26f418.jpeg)

上記の画像が今回構築していくサーバーとネットワークの全体図となります。

<b>・サーバー：「Webサーバー」と「DBサーバー」、この２つのサーバーを構築します。</b>
<b>・ネットワーク：「VPC」、「Public subnet」、「Private subnet」を構築。</b>
「VPC」→灰色のアイコンで「VPC」と書かれたネットワーク領域のこと。
「Public subnet」→緑色のアイコンで「Public subnet」と書かれたネットワーク領域のこと。こちらはインターネットに公開するネットワークとなります。
「Private subnet」→青色のアイコンで「Private subnet」と書かれたネットワークのこと。こちらはインターネットからは接続できないネットワークとなります。
※subnetというのはVPCのネットワーク領域を分割して構築されたネットワークのことを言います。

そしてオレンジ色のアイコンがある「NATゲートウェイ」「インターネットゲートウェイ」も必要なので各種設定します。

#2. NATゲートウェイとは
NATゲートウェイとは「片方向からの通信のみ接続可能にする機能」です。NATゲートウェイを設定する理由として、DBサーバーはPrivate subnetのネットワーク内に配置するのでインターネットと接続することができません。
あえてDBサーバーがインターネットと接続できなくしている理由は外部から接続してデータが改ざんされるのを防ぐためです。

しかしインターネットと接続しインターネット上にあるソフトウェアをダウンロードしてきて、DBサーバーへインストールする必要があります。
この時にDBサーバーからインターネットへの通信のみ可能にする機能が<b>NATゲートウェイ</b>なのです（DBサーバーからインターネットへ通信した時にインターネット側から返ってくる情報は通してくれます）。

#3. インターネットゲートウェイとは
インターネットと接続するために必要な機能です。
インターネットゲートウェイを設定することでインターネットと接続ができるようになります。

</br>
</br>
さて全体の設計図がわかったところで次回はネットワークの構築に必要なIPアドレスについて学びましょう！

</br>

次の記事はこちらから
<a href="https://qiita.com/uchino_infra/private/3d274fd7fbbd381646f0">AWSとWordPressを使ってWebサイトを構築しよう③</a>
ランチにPicoはいかがでしょうか～第7.5話　IDE「コンパイルと書き込みは出来る、でも動くとは言っていない」～

ごきげんよう、ちゃまおです。今回は、簡単な報告記事なので、第7.5話としました。

[前回の記事](https://qiita.com/Chamaotaku/items/ee31d91531f0a447677b)では、Arduinoで使用出来るLiquidCrystalライブラリをRaspberry Pi Picoに書き込み、8x2行キャラクタLCDが動く事を確認しました。

その後、作りたい物があって、I2C接続タイプの16x2行キャラクタLCDを購入しました。ArduinoではWireライブラリを用いる事で、I2C接続タイプのキャラクタLCDを簡単に制御出来ますので、Raspberry Pi Picoでも動くか試してみました。

[こちらのサンプルコード](https://playground.arduino.cc/Main/I2cScanner/)を参考に、キャラクタLCDのアドレスをスキャンしようとした所、<font color=red>ソースコードのコンパイルと書き込みは出来たものの、スキャンしてもアドレスを見つけられませんでした。</font>

ちなみに、Arduino互換機を用いて同じソースコードを動かした場合、問題なくアドレスを取得する事が出来ました。その為、購入したキャラクタLCDの初期不良ではありません。

この事から、WireライブラリをRaspberry Pi Pico用に書き直す必要があるように感じました。これ以外にもArduino用のライブラリは、コンパイルと書き込みが出来ても思ったように動かない可能性があります。何が動いて何が動かないのかと言う情報共有が、これから進んでいく事を期待しています。