OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてのMarkdown②

##Markdown記法を解説
とにかくMarkdown記法という書き方に慣れる目的で実際に作りながら解説します。
今回の解説範囲は見出しの付け方から、コードブロックの書き方までを扱います。

##見出しの書き方①

見出しをつけるには見出しとしたい文字の株下部にイコール（＝）を付けます。
こんな感じ。
見出し（H1サイズ）
\===============
これが…
見出し（H1サイズ）
===============
こうなります。早速見出しが作れるようになりました。
ノートに板書を取る時に、見出しを目立たせる目的で二重線とか引いて目立たせるようなイメージです。

イコールの数はいくつ打っても問題ありません。

##見出しの書き方②

ちなみに、最初にこういった見出しの書き方の紹介をしましたが、私はシャープ（＃）を使って見出しを書いています。
＃をいくつ打つかで見出しの大きさが変えられるので、個人的にはこっちの方が好みです。

\##見出し2（H2サイズ）
これが…
##見出し2（H2サイズ）
こんな感じです。

##見出しについてのまとめ
 見出しの大きさについては2通りあって

* ＝や‐を見出しにしたい文字の下に付けるんだな～
* ＃の数で大きさを変えるんだな～

と覚えていれば問題ないと思います。

##改行について

さて、見出しについてわかったところで、改行の解説に移りたいと思います。
改行については改行キーで改行を付けたところがそのまま改行となりますが、
HTMLで言うところの<ｂｒ>のような「強制的に改行を行う」書き方があります。
それは「文末に二個空白を入れる」というものです。

### 実際にやってみる

例えば、以下のような文章を改行するとします。
>はじめてマークダウン記法について記事を書きます。日々躓くこともあるけれど私は元気です。

＜改行後＞

はじめてマークダウン記法について記事を書きます。  
日々躓くこともあるけれど私は元気です。

読点の後に2個空白を入れて、強制的に改行を挟みました。
通常の改行とは異なり、一行空行が入って表示されるみたいですね。
編集画面ではこのようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1846796/1c048420-4a73-c346-62b1-dc99a4b4a1e3.png)


##字下げを行う
次に、字下げの書き方を説明します。
字下げを行うときは文頭に「〈」をつけると
字下げとして扱ってくれます。
字下げするのは文献を引用するときなどに使うといいと思います。

\>これは引用した文章です
これは…

>これは引用した文章です

このように表示されます。
字下げを複数行にわたって行う場合は、可読性のために字下げしたい全文の頭に「>」をつけると字下げされていることが分かりやすいです。
（つけなくても字下げはされますが、可読性のために付けるほうがベターかと思います）

### 字下げを入れ子にする

字下げも、#による見出しの書き方と同じく、>を重ねることで入れ子にすることができます。

>これは引用した文章です。これも引用した文章です。


>これは引用した文章です。

>>これも引用した文章です。

字下げから脱出するには字下げした行から二回改行を行うことで脱出できます。

##コードを記載する

コードブロックを記載するには、文頭を4文字空白を空けます。
空白は1行ごとに入れなければなりません。（入れなかった箇所は通常の記述として扱われます。

    aaa
    aaa

## 次回予告
勉強がてらこうしてMarkdown記法についてまとめていましたが、以前よりもすんなり記事もかけるようになってきた（当人比）と思うので、いったんMarkdownについての記事はここまでとします。

次回はUiPathについて記事が書こうかなあと考えています。

何か自分の中でこれは！と思ったものがあればその時改めて記事にします。
ここまで見てくださり、ありがとうございました。

## 参考文献

前回と同じく、下記の2点を参考文献としています。

https://qiita.com/Qiita/items/c686397e4a0f4f11683d

清水　美樹　「はじめてのMarkdown」…自分の備忘録を残すのにも使えそうだなと思ったので、現在チートシートと合わせて勉強中です。

https://www.kohgakusha.co.jp/books/detail/978-4-7775-1832-6
患者(ユーザー)ごとにindex表示したい　whereを使う

<h2>１)患者(ユーザー)ごとにindex表示したい</h2>
<p></p>

```

患者１　ーーー患者３の記録　患者２の記録のようになってしまった

```
```html:staff/record/index.html.erb
def index
    @records = Record.all(params[:patient_id]).page(params[:page]).per(7).reverse_order
end
  ↓↓↓↓↓↓
def index
    @records = Record.where(patient_id: params[:patient_id]).page(params[:page]).per(7).reverse_order
end
```

<h2>ユーザーごとに投稿&自分の投稿一覧indexしか見えないのが正しい、　でも見えちゃう問題</h2>
```
def index
    @dialies = Dialy.all 　　　　　
end
としていた。他のユーザー記録が見える....
```
<h2>current_ whereを用いる</h2>

```html:
 def index
    @dialies = current_patient.dialies.all
    あるいは
   　@dialies = Dialy.where( parient.id: current_patient.id)
  #全体の中から絞って持ってくる   　　
  end
```
ほぼコードを書かない並行タイルダウンローダ

地理院地図 Vector タイルをダウンロードしようと思って、今持っているスキルを使ってタイルの並行ダウンローダを書いたところ、ほとんどコードを書かなくて済んだので共有します。

# [Rakefile](https://github.com/optgeo/bv/blob/main/Rakefile)
```ruby
require './constants'

task :mokuroku do
  sh "curl -O #{MOKUROKU_URL}"
end

task :download do
  MINZOOM.upto(MAXZOOM) {|z|
    sh <<-EOS
zcat mokuroku.csv.gz | grep ^#{z}/ | \
parallel -j 3 --line-buffer ruby download.rb {}
    EOS
  }
end
```

`grep ^#{z}` を入れているのは、タイルはズームレベルの小さい順にダウンロードした方が後続の作業をパイプライン的に実施しやすいためです。

[GNU Parallel](https://www.gnu.org/software/parallel/) を使って、カジュアルに 3 並列でプロセスを流しているところが気に入っています。昔は自分でキューを書いていましたが、GNU Parallel を使うと、そういったところは捨象できます。

# [download.rb](https://github.com/optgeo/bv/blob/main/download.rb)
mokuroku の各行をコマンドライン引数にとって、タイルをダウンロードするプログラムです。

```ruby
require './constants'

zxy = ARGV[0].split(',')[0].split('/').map {|v| v.to_i}
(z, x, y) = zxy

dir = "#{DST_DIR}/#{z}/#{x}"
system "mkdir -p #{dir}"
path = "#{dir}/#{y}.pbf"
url = "#{BASE_URL}/#{z}/#{x}/#{y}.pbf"
status = `curl -o #{path} #{url} -w '%{http_code}' -s`
if status == '200'
  print "hit  #{url}\n"
else
  print "miss #{url}\n"
  system "rm #{path}"
end
```

ほとんど構造のない、ただのバッチファイルに近い形になっています。パイプと GNU Parallel を上手に使えていると感じています。

# 感想
やはり　Unix は素晴らしいと思います。
9.15振り返り　　パスが飛ばせない、ユーザーごとの一覧表示できない問題

<h2>1)pathを確認して書いたのに動かない</h2>

<p>=link_to "詳細",staff_patient_record_path(patient_id,record.id)"%>でエラー</p>
<p></p>

```html:staff/record/index.html.erb
<%@records.each do |record|%>　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　エラー
:　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 ↓↓↓
# =link_to "詳細を見る",staff_patient_record_path(patient_id,　record.id)"%>でエラー                                            
:
<%end%>
```

```ターミナル
 staff_patient_record GET    /staff/patients/:patient_id/records/:id(.:format)                                        staff/records#show
```
<p>patients/:patient_idとrecords/:idが必要なのはわかった　　指定しても動かない</p>

<h2>patient_id→→record.patient_idモデルで持ってくる</h2>



```html:staff/record/index.html.erb
<%@records.each do |record|%>の中にあるためrecordがない、急にpatientは使えない
:
# =link_to "詳細を見る",staff_patient_record_path(patient_id,　record.id)"%>でエラー
                                                  ↓↓↓　model：recordで持ってくる
<%=link_to "詳細を見る",staff_patient_record_path(record.patient_id,　record.id)"%>
:
<%end%>
```

```ruby:model/record.rb
class Record < ApplicationRecord
:　　　#recordモデルで紐づけているため明示すれば持ってこれる
   belongs_to :patient
:
end
```
AngularとFirebaseをとりあえず動かす

# はじめに
2021/9/15時点で `ng new` コマンドや `ng add @angular/fire@next` でエラーが起きた。
色々いじってなんとか入れたので、一応メモ。
nodeのバージョンが16なのがいけなかったんじゃないかと今になっては思います。
無理してライブラリ突っ込んだりするよりも、Angularのバージョン下げた方が良さそう。

# 環境
グローバルのnode_modulesは`sudo npm ls -g`とか使うと一気にみれる。

- M1チップ
	- インストールできるnodeのバージョンが少ねぇ
- nodebrew 1.0.0
- node 16.0.0
	- Angularは15と16はサポートしてないっぽい(2021/9/15時点)
- npm 7.19.1
- Angular CLI 12.1.4
- Angular 12.1.5
- firebase-tools@9.17.0

# 以下エラーでたところ

## ng new ng-myapp

```
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: ng-myapp@0.0.0
npm ERR! Found: jasmine-core@3.7.1
npm ERR! node_modules/jasmine-core
npm ERR!   dev jasmine-core@"~3.7.0" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer jasmine-core@">=3.8" from karma-jasmine-html-reporter@1.7.0
npm ERR! node_modules/karma-jasmine-html-reporter
npm ERR!   dev karma-jasmine-html-reporter@"^1.5.0" from the root project
```

package.jsonの`jasmine-core`を以下のように修正して`npm i`を実行

```
  "devDependencies": {
    "jasmine-core": "3.8.0",
  }
```

## ng add @angular/fire@next

```
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: ng-myapp@0.0.0
npm ERR! Found: firebase@9.0.1
npm ERR! node_modules/firebase
npm ERR!   firebase@"^9.0.1" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer firebase@"9.0.0-202171919375" from @angular/fire@7.0.0-rc.0
npm ERR! node_modules/@angular/fire
npm ERR!   @angular/fire@"7.0.0-rc.0" from the root project
```

`npm i firebase@"9.0.0-202171919375" --save`を行ってから`ng add @angular/fire`を実行し、プロダクトを選択。

```
The package @angular/fire@7.0.3 will be installed and executed.
Would you like to proceed? Yes
? Please select a project: ng-myapp (ng-myapp-7e42a)
```

## `@angular/fire` の後ろに `/compat` を追加する
パスが変わったみたいなので、 `@angular/fire`　とつくimportにはその後に `/compat`　を追加します。

```
import { AngularFireModule } from '@angular/fire/'; // ダメなパターン
import { AngularFireModule } from '@angular/fire/compat'; // "compat"つける
```

## AngularFireAuth
[こちら](https://qiita.com/Yamamoto0525/items/054b28e8b34135399237)の通り、`auth` いらなくなる

```typescript
  login() {
    //this.afAuth.auth.signInWithEmailAndPassword(this.email, this.password).then(res => {
    this.afAuth.signInWithEmailAndPassword(this.email, this.password).then(res => {
      alert('ログイン成功しました。');
    }).catch(res => {
      alert('ログインできません。');
    });
  }

```
非同期いいね

```osotmy.rb
class Ostomy < ApplicationRecord
 has_many :favorites, dependent: :destroy

def favorited_by?(staff)
  favorites.where(staff_id: staff.id).exists?
end
```
```fovorite.rb
class Favorite < ApplicationRecord
  belongs_to :staff
  belongs_to :ostomy
end
```
```staff.rb
class Staff < ApplicationRecord
  has_many :favorites
end
```

```ruby:fovorite.contoroller
class Staff::FavoritesController < ApplicationController
   #医療staffが患者さん記録にいいねつける
   before_action :authenticate_staff!
  def create
    @ostomy = Ostomy.find(params[:ostomy_id])
    favorite = @ostomy.favorites.new(staff_id: current_staff.id)
    favorite.save
  end

  def destroy
    @ostomy = Ostomy.find(params[:ostomy_id])
    favorite = @ostomy.favorites.find_by(staff_id: current_staff.id)
    favorite.destroy
  end

  private
  def ostomy_params
      params.require(:ostomy).permit(:color,:edema,:skin,:h_size,:w_size,:comment,:image)
  end

end

```
```html:/_fovorite.html.erb
<% if ostomy.favorited_by?(current_staff) %>
  <%= link_to staff_ostomy_favorites_path(ostomy), method: :delete,remote: true do%>
   <%= ostomy.favorites.count%>❤︎よいいね
  <%end%>
<% else %>
  <%= link_to staff_ostomy_favorites_path(ostomy), method: :post,remote: true do %>
   <%= ostomy.favorites.count%>♡︎いいね
  <%end%>
<% end %>
```

```html:staff/ostomy/show.html.erb
<div class="favorite"><%= render 'staff/favorites/favorite',ostomy: @ostomy %></div>
```

```ruby:create.js.erbとdestroy.js.erb
$(".favorite").html("<%= j(render'staff/favorites/favorite', ostomy: @ostomy) %>");
```
コントローラの使われ方がわかんない

MVCのことはちゃんと理解した方がいいから備忘録。

#1.コントローラとは
MVCモデルのC。ユーザーからのリクエストを受け取り、モデルを介してデータを授受したり、ビューを用いてHTML出力を生成するもの。
見方を変えると、コントローラはモデルとビューの仲介をしているとも取れる。モデルのデータをビューで使えるようにすることで、データをビューで表示したり、入力されたデータでモデルを更新したりする。

#2.コントローラの作り方
ターミナルにおいて下記のように入力して生成する。

```ruby
% rails g controller (コントローラ名)
```

コントローラの名前は複数形を使うことが一般となっている。
絶対ではないが遵守することで、既存のルーティングジェネレータがそのまま使えたり、名前付きのルーティングヘルパーの用法がアプリケーション全体で一貫する。

#3.メソッドとアクション
railsのコントローラは全てApplicationControllerを継承したRubyのクラスとなっている。例えば、SamplesControllerというコントローラがあったとして下記のような記述が冒頭にあることから左記のようなことがわかる。

```ruby
class SamplesController < ApplicationController #継承を示している
```

###記述の凡例

```ruby
class SamplesController < ApplicationController
 def new
 end
end
```
このような記述の場合、`/samples/new`にアクセスをするとSamplesControllerのインスタンスを作成してnewメソッドを呼び出す。ここでnewメソッドは内容が空でも、railsではアクションで特に指定がない場合はnew.html.erbというビューを返すことになっている。

##4.パラメータ
コントローラのアクションではユーザーから送られてきたパラメータにアクセスをして何かの作業を行う。
パラメータのは２種類あって、一つはURLの一部として送られる「クエリ文字列（URL）パラメータ」もう一つはフォームから受け取る「POSTパラメータ」がある。いずれも`params`というハッシュでアクセスできる

###クエリパラメータ例
https://hogehoge.jp/fugafuga?id=1
上記の`?id=1`の部分がクエリ文字列（URL）パラメータにあたる。
GCC と Clang で仕様が違う __builtin_ia32_palignr 関数

GCC と Clang にあるビルトイン関数

　　\__builtin_ia32_palignr
　　\__builtin_ia32_palignr128

を以下のプログラムで試します。

```C:sample.c
#include <inttypes.h>
#include <stdio.h>
#include <tmmintrin.h>

static void test_palignr()
{
    __v1di a = { 0x0102030405060708ULL };
    a = __builtin_ia32_palignr(a, a, 8);
    printf("%#018"PRIx64"\n", a[0]);
}

static void test_palignr128()
{
    __v2di a = { 0x0102030405060708ULL, 0x090a0b0c0d0e0f10ULL };
    a = __builtin_ia32_palignr128(a, a, 8);
    printf("%#018"PRIx64",%#018"PRIx64"\n", a[0], a[1]);
}

int main()
{
    test_palignr();
    test_palignr128();
    return 0;
}
```

### GCC Version 11.2.0

```console:
$ gcc -mssse3 palignr.c && ./a.out 
0x0801020304050607
0x1001020304050607,0x08090a0b0c0d0e0f
```

### Clang Version 12.0.5

```console:
$ clang -mssse3 palignr.c && ./a.out 
0x0102030405060708
0x090a0b0c0d0e0f10,0x0102030405060708
```
Windows10でマウスホバーでウィンドウをアクティブにする

- コントロールパネルから「 コンピューターの簡単操作センター 」 →「マウスの動作の変更」 →「ウィンドウの管理を簡単にします」→「マウスポインターをウィンドウ上に合わせたときにウィンドウを選択します」で実現できる。
- しかし新型のコントロールパネルにはその項目がない。
- だから**旧型のコントロールパネルを表示する**必要がある。
- 旧型のコントロールパネルは、スタート→Windowsシステムツール→コントロールパネル で開くことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1160489/57e7a2b8-ae7d-ec46-2cff-84df0a67e4c2.png)

- 完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1160489/67f19c50-534d-5a95-1c85-4ccb017a8a8f.png)
他の人のローカルフォルダを覗き見る方法

# 同ドメインの別のADユーザーのローカルを覗く
ADの知識がある人からすると常識だと思うが、知った時に感動したのでメモ。

エクスプローラーを起動して、

//[ホスト名]or[IPアドレス]/c$


↑これでそのホストのcドライブへアクセスできる。

外付けストレージなど、アクセスしたい先が別のドライブの場合は、上記cの箇所を別のドライブに書き換えでok。
BIOSの power-on パスワード がわからないときのPC起動手段

# BIOSパスワードを忘れてしまった！！！

PC起動後、OSの起動前に出てくるPC起動パスワード（Power-on Password）を忘れて、BIOSに入ることも、起動も、クリーンセットアップも何もできなくなってしまっても、業者に持っていかずとも解決します！！！
（supervisorやHDDパスワードをかけていない場合のみ）


# バッテリー＆バックアップバッテリーを外すだけ！！！
電力を溜めているものをすべて外して、少しの間放電します。（1分程の放電でも成功）
ノートパソコンの場合、バックアップバッテリーは大抵ドライバー使って中開けないと外せないので、メーカーサイトで調べながらの作業を推奨。

放電後は元に戻して電源起動すると、BIOSパスワードを聞かれなくなります。

それだけ！！


BIOSのdatetimeまでリセットされてしまうと別のエラーが出るので、
そのときはBIOSメニューから再設定することで通常起動できるようになります。


こんなに簡単に解決するとは…
コルセアの永久保証メモリを交換してみた顛末

## はじめに
2年前少し前に組み上げた自作PCが急に動かなくなった。
色々試しても画面出力が出ないので、これはM/Bが故障だなと思って交換したら動くようになったが……

### Windows上、BIOS上ではメモリが認識されてはいる
気付いたのは修理して数日後、タスクマネージャを見ているとメモリが半分しか認識していない。
(搭載していたのは16Gの2枚組メモリ、合計32G)
よくよく見ると、搭載メモリは32Gとなっているが `ハードウエアで予約されているメモリ16.1G`
となっていて、タスクマネージャ上では15.9Gしか認識されていない状態だった。

BIOS（UEFI)で見ると、きちんと16Gが2枚見えているのでWindows側の問題かな？と疑う

### Windowsのメモリ設定
ぐぐると同症状の人がいて、Windowsの起動設定でメモリの使用制限をしてたりすることがあり
そこをイジると治るというのがあったので試すが改善せず。[[参考](https://memo.itsysgroup.com/?p=1609)]

### M/Bの仕様を確認する
確かに4slot,64Gまで搭載できるM/Bを購入したはずだが無知ゆえに使えないのかもと疑う。

- メモリにはシングルランクメモリとデュアルランクメモリというのがある
- ざっくりいうと、シングルランクメモリというのは片面実装のメモリ、デュアルランクは両面実装（なことが多いだけで厳密には違う）
- 両面実装だとデュアルチャネルで動いているので、M/Bによってランクの上限があり、その上限までしか使えない

ということはわかり、ウチのはデュアルランクなので、もしかしたらM/Bのスロット位置替えないとだめなのかもしれない？
となって試してみるも症状は変わらず。

### もしかしたらメモリ不具合？
Memtest86を実行してみると、ちゃんとメモリは16G*2枚 見えている。
が、テストを走らせると、どうしても1枚目のメモリをすっ飛ばす。エラーも出ずに。

### M/Bか?
メモリ1枚ずつ刺して起動を試すと、起動するメモリと起動しないメモリが。
メモリが犯人なのが濃厚。
ちなみにM/BのBIOSを上げることも考えたが、M/BのBIOSをアップデートして動かない場合は
M/Bの保証はなくなるということだったのでやめた。


## 永久保証を行使する
自分のメモリの型番を調べるべく置いてあった購入時の箱を確認すると `永久保証` と書いてある。やったぜ
https://www.links.co.jp/support/corsair/

### サポート会社が変わっていた
購入先は `株式会社リンクスインターナショナル` なのだが、サポートは2021/02 より `株式会社アスク` に
変わったらしい。最近購入された場合は、そもそもメモリの箱に書いてあるサポート先がアスクに
なっているのかもしれない。
https://otoiawase.jp/do/public/form/links55/1/

### 早速電話で問い合わせる
問い合わせると、永久保証が無事使えるということで品物を送ることになった。
送料は両持ち（送付はユーザー負担、返送はメーカー負担）だったが、
商品の追跡と保証は付けてほしいと言われたので `宅急便コンパクト` で送ることに
詳細はメールで送りたいということでメールアドレスを伝える。助かる

現行品なので通常は1週間程度で交換対応になるが、在庫などの問題で
時間がかかりそうならば改めて連絡いただけるとのこと。
昨今、半導体不足とかいう話も聞くので少しビビる。

#### 宅急便コンパクトについて（蛇足）
結論： 持ち込み + スマホで宛名を作ると送料が250円安くなる。

- 宅急便コンパクトは送料とは別に専用の箱が必要(+70円必須)
- スマホで宛名を作れるが、作ったQRコードは30分しか使えないらしい  
    - 店でQRコードを読み込ませようとしたらうまく行かなかった
    - 店員さんがそう言ってたがそれならかなり辛い仕様

### 発送
営業所に持ち込む。同梱するものは以下の通り。

- 購入時と同じ状態にしたメモリ
    - （ヒートシンクなどは外せと書いてあったが、箱までが必要かどうかはわからない）
- 症状を記したメモ
- 返送先
- 購入がわかるもの（購入時のメールを印刷して入れた）


### アスクから連絡
- 発送したのが水曜日で、翌日にはクロネコから到着した旨のメール
- 翌週月曜日にアスクより受領した旨の連絡
- 他になにか確認したいことがあれば連絡するとのこと

### 交換対応品到着
ちょうど発送から1週間、（おそらく）新品メモリが到着。
納品書には交換対応した旨が書いてあったが箱には元々あった「永久保証」のラベルが無い。
よくよく見ると、交換対応したメモリは購入時のメモリの保証に準じますと記載があり、
継続して永久保証が受けれそうだった。もちろんメモリを交換してPCもバッチリ32G認識し、全てが使えてる。

## 結論
永久保証を謳っているので、それを受けるためには相当大変なのかなと思ったが
実際のところは、普通の製品保証を受けることと何ら変わらなかった。
今回は現行品での故障、保証対応なのでさっと部品が出てきたが、古いメモリなどであれば
修理対応などになりもっと時間がかかったかもしれない。
AWS Cost ExplorerのAPIとGUIで額が違う？と思って調べた記録


# 目的
AWS Cost ExplorerのAPIを利用して月ごとの額を確認しようと思ったとき、
APIで出た額とGUI (コンソールのCost Explorer) の額がずれていたため、その原因を探りました。
結果、私の単純なミスであり、単純であるがゆえに調べてもなかなかヒットしなかったため記録として残します。


同じ状況に遭遇し、無駄撃ちはしたくない場合(AWS Cost Explorer APIは2021年現在[1回あたり0.01 USD](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/ce-what-is.html)のため)、こちらの記録を参考としてください。



# 結論
悪い例：
`start_date = "2021-08-01"`
`end_date = "2021-08-31"`

正しい例：
`start_date = "2021-08-01"`
`end_date = "2021-09-01"`

と「1ヶ月分」を指定する際は、end_dateは31日ではなく翌月の1日を指定する。

# 背景
AWSの各サービス(S3やEC2など)でかかるコストは[AWS Cost Explorer](https://aws.amazon.com/jp/aws-cost-management/aws-cost-explorer/)で確認することができます。
このAWS Cost Explorerはコンソールから確認することができるのですが、それ以外にもAPIを利用して、pythonで確認することができます。

今回、AWS以外のサービスのコストもまとめて算出するシステムを作成するためにAPIを用いました。


しかし、
AWS Cost ExplorerのAPIをpythonで利用して月ごとの算出を行った結果(以下API)の額
と
AWSコンソールからのCost Explorer(以下GUI)の同期間での額
が異なりました。
APIで算出した額がGUIの額より少なかったです。
この差分の原因を調査しました。

実際にAPI利用のために用いた関数は以下です。


※「tag_name」部分は[AWS リソースのタグ付け](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws_tagging.html)によりつけたタグごとにコスト算出を目的としたためついていますが、人によっては不要と思いますので、不要な場合削除してください。




```python
def get_all_cost_by_api(start_date,end_date,tag_name):

  response = client.get_cost_and_usage(
      TimePeriod={
          'Start': start_date,
          'End': end_date
      },
      Granularity='MONTHLY',
      GroupBy=[
      {
        "Type":"DIMENSION",
        "Key":"SERVICE"
      },
      {
        "Type":"TAG",
        "Key":tag_name
      }
    ],
     Metrics=["UnblendedCost"]
  )
  return response

start_date = "2021-08-01"
end_date = "2021-08-31" ### 悪い例。1ヶ月分を算出したい場合は"2021-09-01"
tag_name = "hoge"
response = get_all_cost_by_api(start_date,end_date,tag_name)
```

# 行った調査

### Metrics
まず、Metricsに着目しました。
APIでは、[こちらの記事：AWS Cost Explorerに渡す、Metricsの値の意味](https://qiita.com/tamura_CD/items/4a9a412faf379b334986)
を参考に、とりあえず`UnblendedCost`で算出しました。

GUIでは右下の方に「コストの表示方法」という項目があり、「非ブレンドコスト」となっておりました。
言語が日本語だったので英語に変えたところ、`UnblendedCost`でした。
よって、Metricsの問題ではなさそうでした。


### 算出期間の変更
1月分の算出から1日分の算出に変更したところ、額が一致しました。

### 仮設構築&確認
「1日分の算出だと値が一致する」
「APIの額がGUIの額より少ない」
ということから
「期間の指定方法が適切ではないのでは？」
という仮設を立てて確認を行いました。
Before

```python
start_date = "2021-08-01"
end_date = "2021-08-31"
tag_name = "hoge"
response = get_all_cost_by_api(start_date,end_date,tag_name)
```

After

```python
start_date = "2021-08-01"
end_date = "2021-09-01"
tag_name = "hoge"
response = get_all_cost_by_api(start_date,end_date,tag_name)
```

Afterで算出した額とGUIで表示された額が(四捨五入の有無はあれど)無事一致しました。

# 感想
APIとGUIで額が違うという事象に遭遇し、
「aws cost explorer api gui 額 違う」
や
「different results cost explorer api gui」
などで検索しても該当の事象に遭遇した人の記事がなかなかヒットせず、
1回あたり0.01USDのコストがかかるということで検証のための実行もやりづらかったです。
こちらの記事を書くことで、今後は同様の事象に遭遇した人の検索に引っかかると良いなと思います。


# 参考
https://aws.amazon.com/jp/aws-cost-management/aws-cost-explorer/

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/ce-what-is.html

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ce.html

https://qiita.com/tamura_CD/items/4a9a412faf379b334986
iPhone13を発表したAppleEventメモ

本日（2021/09/15）の Apple Event（iPhone13発表）のメモになります。

https://www.apple.com/jp/apple-events/september-2021/


---
# Apple TV+
Apple TV+ でのコンテンツ紹介

# iPad（第9世代）
iPadOS15搭載
A13Bionic
CPUやカメラがアップグレード
**センターフレームに対応（今回発表した全機種）**
329ドル（64GB）から
色はシルバーとグレイ
**本日受付開始**
**販売は来週**

# iPad mini（第6世代）
色：パープル、ピンク、スターライト、スペースグレイ
画面は8.3インチに拡大
**Touch IDが画面上部の電源ボタンに移動**
物理的なホームボタンは廃止
コネクタはUSB-C
カメラやオーディオもアップグレード
4K, 12MP, センターフレームに対応
横向きでのスピーカーに対応
Apple Pencilにも対応
**本日受付開始**
**販売は来週**
全てのラインナップで100%再生アルミニウムの筐体を使用

# Apple Watch Series7
外枠が狭くなることでディスプレイサイズが20%広くなった
曲面ディスプレイのためにUIを更新して、**新しい画面領域が用意された（※アプリ開発者には影響ありそう）**
耐久性もアップ
アップグレードされた充電アーキテクチャと高速充電USB-Cケーブル
**今秋後半リリース**

# Apple Fitness+
これまで6ヶ国に対応していたが、**今後+15ヶ国追加**される（日本はまだ未対応）
新しいワークアウトの紹介
SharePlayを使い Fitness+ の GroupWorkouts でグループ共有可能

# iPhone13
色：ピンク、プルー、ミッドナイト、スターライト、Product RED
**ノッチが20%縮小**
**※わずかにノッチの高さが増えている情報もあるが、少なくともセーフエリアの高さは44point以下にはなってないだろう。（アプリ開発者としては重要な時がある）**
**→Xcode13RC のシミュレータで試したら、iPhone13, Pro 共に safeAreaInsets.top は iPhone12 と同じ 47 point でした**
A15Bionic
6コア（2高性能 + 4高効率）
GPUは4コア
Neural Engineは16コア
カメラもアップグレード
**シネマティックモード**
動画撮影でプロ並みのピント送りが可能
被写体が向いている方向に自動でピントが合う
バッテリーはiPhone12よりも 2.5h 長持ち
Smart Data mode で5Gが不要な時はLTEを使う
プライバシーに配慮して、Siriはローカルでのみ使用
インテリジェントトラッキング防止機能
メールのプライバシー保護機能

# iPhone13Pro
**新色：シエラブルー**
**フロントのTrueDepthカメラが20%縮小し、ノッチも縮小**
A15Bionic
**GPUは5コア**
**ProMotion**
状況に合わせてリフレッシュレートを10Hz~120Hzまで自動調整
スクロールなどの動きに合わせて自動でリフレッシュレートが調整される
各カメラ性能も大幅アップ
天体撮影などにも利用可能
**マクロ写真撮影で2cmまで接近して撮影が可能**
Photographic style で自分の好みを画像パイプラインに取り込める
撮影前に４つのデフォルトから選べる
ビデオには Cinematic mode 追加され、ピント送りが可能
**年末までにProResビデオに対応予定**
バッテリーはiPhone12Proよりも 1.5h 長持ち
**9/17 受付開始**
**9/24 販売**

# iOS15リリース日
**iOS15のリリースは日本時間9月21日**
ただし、私はビデオの中でその情報を見つけられなかった。（単純に見過ごしたのかもしれない）
[アップル、iOS 15を9月21日に配信　iPadOS 15 / watchOS 8も同日 - Engadget 日本版](https://japanese.engadget.com/apple-ios15-205928966.html)

ちなみに私はiPadにベータ版のiPadOS15を入れているが、9/15時点では iPadOS 15.0 RC（19A344）となる。
「システムバージョン」には「15.0」としか表示されないので正式版かと焦ったがRCだった。
playwrightでブラウジングの自動化

[前回puppeteerの記事を書いて](https://qiita.com/bellx2/items/4904c8a3aa13c6242d1c)、使っていたら[playwright](https://playwright.dev)を見つけました。コマンドも同じで、こちらの方が複数ブラウザー対応など便利そうだったのでサクッと切り替えました。python用などもあるようです。

https://playwright.dev

## Dockerファイル

```docker:DockerFile
FROM mcr.microsoft.com/playwright:focal

WORKDIR /app
```

...ubuntuベースなので少し大きいですが、公式docker対応は楽ですね。日本語も問題ありませんでした。

## サンプル

```js:yahoo.js
const playwright = require('playwright')

;(async () => {
  const browser = await playwright.chromium.launch()
  const context = await browser.newContext()
  const page = await context.newPage()
  await page.goto('https://www.yahoo.co.jp/')
  await page.screenshot({ path: `yahoo.png` })
  await browser.close()
})()
```

# 参考

https://playwright.dev/docs/intro/
draw.ioで画面レイアウト図を描く（GUI・HTMLで表の作成）

Draw.ioは、フローチャートやクラス図、シーケンス図などをGUIで作図できるツール。
ブラウザ上で起動でき、GoogleドライブやGithubに連携できる。
デスクトップ版もあるのでローカルで作業も可能。拡張機能でVS Code上でも利用可能。

## 画面レイアウト、ワイヤーフレームのツールとしての選択肢
UIデザインツールはAdobe XDやInVision Studioなどがあるが、今回は社内システムの管理画面の開発に際してのUIデザインなので、リッチな機能よりもサクっと作れることを重視。
無料で誰でも使えること、HTMLでの編集も可能なこと、VS Code上でも使えることからDraw.ioを選定。

### デザイン制作の流れ
"Layout"テンプレートの中に、UIデザインに必要そうなパーツを含んだものがあるので、それを選択。
![drawio1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027088/5fdba933-5ec8-4528-75ee-32ab2fac2161.png)

基本的な流れとしては、左側のパネルから使う図形を選んで、右側のパネルやツールバーでスタイルやプロパティの編集を行うというシンプルな流れ。

![drawio3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027088/794efc09-9bd9-a83d-09b5-6df301d53e4f.png)


## 表の作成
基本的な図形の作成はパワポみたいなもので、特段ハマったポイントはないが、表の作り方は少しい厄介な点あり。

表のテンプレートはMisc（miscellaneous：その他）の中にある。
![drawio2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027088/7925bafe-dd62-c932-6ce3-ca5ffb18ecfb.png)


大きく分けて、下記の2種類に大別できる。

- **GUIでのみ編集可能な項目を持つ表**
- **HTMLでのみ編集可能な項目を持つ表**

一度作成した表の種類をあとから変更することはできないため、どのように編集していくのかを最初に決める必要がある。

### GUIでのみ編集可能な項目を持つ表
"Table 1"や"Table 2"など、『table』を接頭語に持つものはGUIでのみ編集可能な項目を持つ表。

下記の操作がドラッグアンドドロップで可能（HTMLによる編集は不可）

- 列の幅、行の高さの設定
- 行の入れ替え
- 他の表からの行の移動
- 罫線のオンオフやスタイルの変更
    - "Table 1"はLineのチェックボックスで罫線のオンオフができる
    - "Table 2"はもともと罫線がなく、あとから罫線を追加はできない

![drawio4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027088/2aab5926-a4a4-5ff7-3e54-e17b3bf21ace.png)


### HTMLでのみ編集可能な項目を持つ表
"HTML Table 1"や"HTML Table 2"のように、『HTML Table』を接頭語に持つものはHTMLでのみ編集可能な項目を持つ表。

テーブルをダブルクリックで選択し、『</>』アイコンでHTMLでの編集が可能。
画像は"HTML Table3"。
![drawio8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027088/0c94921c-15b1-3404-a672-7c19199d1536.png)
![drawio7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2027088/d14ee505-0eb5-74eb-b561-b8f6dcdc5127.png)

"HTML Table 3"は下記のような記述となっている。

```
<table border="1" width="100%" style="width: 100% ; height: 100% ; border-collapse: collapse">
    <tbody>
        <tr>
            <td align="center">Value 1</td>
            <td align="center">Value 2</td>
            <td align="center">Value 3</td>
        </tr>
        <tr>
            <td align="center">Value 4</td>
            <td align="center">Value 5</td>
            <td align="center">Value 6</td>
        </tr>
        <tr>
            <td align="center">Value 7</td>
            <td align="center">Value 8</td>
            <td align="center">Value 9</td>
        </tr>
    </tbody>
</table>
```

適宜スタイルを記述したり、行追加など行う。
上記の"HTML Table 3"には、見やすくするためインデントをいれているが、**HTMLは圧縮して記述**する必要あり。

---

> - 列の幅、行の高さの設定
> - 行の入れ替え
> - 他の表からの行の移動
> - 罫線のオンオフやスタイルの変更

上記の「GUIでのみ編集可能な項目を持つ表」で編集可能だった項目は、HTMLテーブルではGUIでは編集不可。HTMLで直接スタイルを記述する必要がある。
プログラムでOSはHarmony（HarmonyOS）かAndroidか判断する方法

ファーウェイは2021年7月23日に[HUAWEI MatePad 11](https://consumer.huawei.com/jp/press/news/2021/news-210713/)をリリースしました。このタブレットはHarmonyOSを搭載しています。AndroidのアプリもHarmonyOSのアプリも正常動作します。

アプリの中でOSがHarmonyOSかAndroidか判断する場面があるかもしれないので、その方法を公開します。

```java
public boolean isHarmonyOS() {
    try {
        Class classType = Class.forName("com.huawei.system.BuildEx");
        Method method = classType.getMethod("getOsBrand");
        ClassLoader classLoader = classType.getClassLoader();
        if (classLoader != null && classLoader.getParent() == null) {
            return "harmony".equals(method.invoke(classType));
        }
    } catch (ClassNotFoundException e) {
    } catch (NoSuchMethodException e) {
    } catch (Exception e) {
    }
    return false;
}
```
[Ruby] AtCoder過去問 A - Candy Distribution Again 

##はじめに
AtCoder過去問A問題をRubyで解いてみました。
よろしくお願いします。

問題はこちらから確認お願いします。↓

https://atcoder.jp/contests/agc027/tasks/agc027_a

##A - Candy Distribution Again 

まずは入力を受け取ります。

```ruby
n, x = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort
```

配列の中は昇順に並び替えてaに代入しています。

後ほど繰り返し処理を行なって、繰り返した回数が答えとなるため、変数countを用意して、0を代入します。

```ruby
n, x = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort

count = 0
```

while文で繰り返し処理をしていきます。
条件は配列の中身がなくなるまで行うようにします。

```ruby
n, x = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort

count = 0

while a[0] != nil
```

お菓子を最小の数で喜ぶ子供から分け与えていきます。
配列の中は昇順になっているのでshiftメソッドで手前から取り出して削除していきます。
そして処理したらcountに＋１します。

さらに全ての子供たちにお菓子を分け与える前に、お菓子が無くなったら、処理を抜け出すように記述します。

```ruby
n, x = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort

count = 0

while a[0] != nil
  x -= a.shift
  count += 1
  if x < 0
    break
  end
end
```

ここで私がめちゃめちゃハマったんですが、この問題の子供達、自分が要求するお菓子の数ぴったしじゃないと、満足しないらしいです。
つまり10個あげると喜ぶ子供に20個あげると喜ばないんですww

んなことあるかと思いながら、コードを書き直しましたが、、、
常識にとらわれず、ちゃんと問題を読みましょうw

ですので、もし子供が満足する数よりも少なかったり、多かったりした時はcountから-1してあげます。

```ruby
n, x = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort

count = 0

while a[0] != nil
  x -= a.shift
  count += 1
  if x < 0
    break
  end
end

if x != 0
  count -= 1
end

puts count
```

これで完成です。
Unityでキーボードによるゲーム操作

##Input.GetKey
ほとんどのプログラミング例にはこのInput.GetKeyが使われてます。
たとえばこんな感じ。

```
float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical");
```

WASDと↑←↓→キー両方どちらの入力も取得してくれてます。
これはHorizontalが水平、つまり左右。
Verticalが上下の入力ですね。

###問題点
２DSTGを作ろうとしてて気づいたのが、入力が貯まるということ。
テストプレイをして、自機が滑るような、あるいは慣性がついているような？キーを離したのにまだ少し動くという現象がありました。
Rigidbodyのせいかとも思ったのですが、最終的にRigidbodyを外してもやはり滑る。
そこでキー入力自体を検証していたら、キーボードの入力がある程度貯まるということに気が付きました。
キーボードを押しっぱなしにしている間に連射のように入力が蓄積されていくんですね。

###解決
キーが下がった時とキーが上がった時をきちんと判定したら問題なく滑らなくなりました。

```
        if((Input.GetKeyDown(KeyCode.A)) || (Input.GetKeyDown(KeyCode.LeftArrow)))
        {
            x1 =  -1;
        }
        if ((Input.GetKeyDown(KeyCode.D)) || (Input.GetKeyDown(KeyCode.RightArrow)))
        {
            x2 =  1;
        }
        if ((Input.GetKeyDown(KeyCode.W)) || (Input.GetKeyDown(KeyCode.UpArrow)))
        {
            y1 = 1;
        }
        if ((Input.GetKeyDown(KeyCode.S)) || (Input.GetKeyDown(KeyCode.DownArrow)))
        {
            y2 = -1;
        }

        if ((Input.GetKeyUp(KeyCode.A)) || (Input.GetKeyUp(KeyCode.LeftArrow)))
        {
            x1 = 0;
        }
        if ((Input.GetKeyUp(KeyCode.D)) || (Input.GetKeyUp(KeyCode.RightArrow)))
        {
            x2 = 0;
        }
        if ((Input.GetKeyUp(KeyCode.W)) || (Input.GetKeyUp(KeyCode.UpArrow)))
        {
            y1 = 0;
        }
        if ((Input.GetKeyUp(KeyCode.S)) || (Input.GetKeyUp(KeyCode.DownArrow)))
        {
            y2 = 0;
        }


        float x = x1 + x2;
        float y = y1 + y2;

```

もっとうまい書き方もあるかと思いますが、こういう理屈なのだということが参考になればと思います。
（移動の左右切り替えのときに引っかかるような感じがした（おそらく右キーを離すのと左キーを押すのがほぼ同時の時に判定がおかしくなる）ので、コードの例を修正しました。
）
Fedora の GNOME で、変換キーを Ctrl にする方法 (Linux でも 親指Ctrl を！)

最近の GNOME では、`xmodmap`によるキーボードのリマップが使えなくなっているので、設定方法を覚書しておきます。
確認したディストリビューションは Fedora ですが、Ubuntu でもほぼ同じだと思われます。

参考にしたページ→[XKBでCapsLockをEscに割り当てる(Ubuntuでキーマッピング変更)](https://qiita.com/oyas/items/a39baab89908294516a7)

```shell-session
$ cat <<EOF > rctrl
partial hidden modifier_keys
xkb_symbols "henkan_rctrl" {
    replace key <HENK> { [ Control_R ] };
};
EOF
```

```shell-session
$ sudo cp rctrl /usr/share/X11/xkb/symbols/
```

```text:/usr/share/X11/xkb/rules/evdev
...

! option	=	symbols
  grp:shift_toggle	=	+group(shifts_toggle)
  altwin:menu		=	+altwin(menu)
  ...
  parens:swap_brackets   =   +parens(swap_brackets)
  rctrl:henkan_rctrl =  +rctrl(henkan_rctrl) # ← この行を追加

...
```

```shell-session
$ gsettings set org.gnome.desktop.input-sources xkb-options "['rctrl:henkan_rctrl']"
```

で、念の為再起動すると[変換]キーが、右Ctrlになってるはずです。
`evdev`の書き換えを`awk`なんかで出来れば、全部をシェルスクリプトに出来るでしょう。
もし、出来たらコメントなんかで教えてください。

それでは、親指Ctrlを楽しんでください！
オンラインサロンで初めてチーム開発をしてみた

この記事は我々のチーム活動の概要を書いた記事になります。自身が非エンジニアの初学者なので、用語の間違い等はご容赦下さいm(__)m

## どんなチーム
全員オンラインサロン[「IT KINGDOM」](https://it-kingdom.com/)のメンバー(兵士)です。サロン内で行われている朝活終了後の雑談で、「農業に役立つプロダクト開発をしたい」と話したメンバーの言葉に、他数人が乗っかり、「チーム開発やろう！」となったのが始まりでした。

メンバー構成：当初は７名でスタートしました。途中、追加募集・卒業等で変更がありましたが、現在も７名で活動中。現役エンジニア、非エンジニア、学生の方等、幅のある経歴・年齢層の方が集まるチームです。


## チームの目的
**・農家の課題を（アプリ等のITスキルを用いて）解決したい**
**・チーム開発を通して各個人のスキルを向上させたい**
「農業に役立つプロダクト開発をしたい」と話から始まったチームであった事と、そもそも全員がオンラインサロンのメンバーなので、この２つは全員の最大公約数的に決定しました。


## 開発方針
開発手法としてはアジャイルを採用しました。
[⇒アジャイル開発とは](https://hnavi.co.jp/knowledge/blog/agile_software_development/)
従来型のウォーターフォールモデルは、最初に決めた機能設計・計画を段階的に遂行していく開発で、実際に開発に着手するまでに時間が掛かる傾向があります。一方アジャイルは、『計画→設計→実装→テスト』といった開発工程の機能単位を小さいサイクルで繰り返しながら細かく開発を進めていくスタイルになので、実績・経験ゼロのメンバーも普通にいるチームにとっては、比較的に開発開始のハードルは低いと判断しました。


プロジェクト管理ツールとしては[jira](https://www.atlassian.com/ja/software/jira)を活用し、チケット管理によるタスクの分割と、そのタスクのポイント（ストーリーポイントといって、「時間見積」でなく、基準となるタスクを基に相対的な難易度をメンバー共通で決める）による進捗管理を行っております。
後は各自タスクの作成したコードをgithubにプルリクをあげ、別のメンバーがレビュー⇒マージするといった流れです。

## チームのルーティーン
活動場所は[「oVice」](https://ovice.in/ja/)をサロン側が専用のコアキングスペースとして用意してくれているいるので、全てオンライン上での活動になります。

月～金曜日：[「デイリースクラム」](https://ssaits.jp/promapedia/method/daily-scram.html)
スクラム開発における各自のアクションの結果・予定の報告、詰まっている箇所の相談、情報共有を行うショートミーティングです。

土曜日：[「レトロスペクティブ」](https://ssaits.jp/promapedia/method/looking-back.html)
初めに１週間のスプリントの振り返りを行いつつ、我らのチームにおいては、個人の話等をしながらのコミュニケーションタイムになったりしてます。

日曜日：[「スプリントプランニング」](https://ssaits.jp/promapedia/method/sprint-planning.html)
前週のスプリント（消化したタスク）の結果の確認と、バックログ（アクション内容は決まっているが実施予定日が未定のタスク）を検討し、今週消化するスプリントに選出する作業を行います。
選出する数量の基準となるのはタスクのストーリーポイントで、メンバー全員で確定させます。手法としてプランニングポーカーといって、全員で同時にポイントを出し合います。
タスク内容の再確認等も行うので、週の活動の中で最もボリューミーな日になりますｗｗ


## チーム開発履歴
**３月：チーム方針決定期間**
　・代表的なアジャイル開の手法に従いフレームワークと、各個人の役割を決定、チーム名の決定等
　・現役のエンジニアの方がホストとなって勉強会（基本的なgithubの使い方）

**４月：各自活動開始＆スキル向上期間**
　・農業に関する情報収集（市場にある農業アプリの調査）
　・ユーザーヒアリングの実施
　・Todoアプリを作成しながらReactの学習

**５月：プロダクトの決定＆開発事前準備期間**
　・ユーザーストーリーマッピングから、解決すべき課題の可視化と抽出
　・プロダクトの要件定義、issu毎にタスクを作成、デザイン作成(figma)
　・作成したTodoアプリのTodoをfirestoreに保存するまでの学習

**６月：プロダクト開発開始**
　・全員でタスクを処理
　・フロント(Next.js)以外の設計に悩む⇒最終的にfirebaseでホスティングに決定

**７月：引き続き開発期間**
　・ひたすらタスクを処理
　・機能テスト実施
　・他アプリとの連携（会計ソフトfreee、運送会社クロネコヤマト）に苦戦

### ８月：無事ファーストリリース!!

　現在は、クライアントのフィードバックを基に機能を修正し、１０月を目標にセカンドリリースを目指して活動継続中です。
★現状の残っているjiraのタスクポイントからリリース時期を推定したところ、年末になる見込みとの結果となった為、現在サロンにて追加メンバーを募集しておりますｗｗ



## 最後に
目標（クライアント）が存在し、実際に使用して頂けるのは非常に大きいです。ポートフォリオ作成においても目的や目標が無いと挫折するのが良く解ります。適度なプレッシャーが、チーム活の最大のモチベーションになっているのは間違いないです。
また自身が、チーム開発に経験なんて出来ると思っておらず（それどころか個人開発も完成してない！）、怖さ半分で始めたかたちなのですが、他メンバーの協力や、学びが頂けるのがとても有難いです。
プロジェクトの完成と、更なるスキルの向上を目指し、残り期間を精進して参ります。

最後まで読んで頂き、ありがとうございます。
ディジタルデータの表し方　[ビットとバイト]

#そもそもディジタルとは

区切りがあるもの

　　　　　**データに対し区切りを持たせ数値化すること**

###バイト（B）

１ビット（b）だけでは表現できる情報として少なすぎるので、
<font color="red">８ビットをひとまとめにし１バイト（B）</font>として情報を
表現することが基本となっている

####１バイトについて
・表現できる数値はアルファベット１文字のサイズ

・１バイトでは２の８乗、つまり２５６通りの数値を表現できる

・符号が付くと８桁目は正負の符号になるので、７桁で表現することになる
　つまり　−１２８〜１２７まで表現できる

###文字を表現する

**コンピュータは文字に数値を割り当てて表現する**

　もっともポピュラーなのは<font color="red">ASCⅡ（アスキー）</font>というもの
　　　　　

　例）Aのコード

　AをASCⅡのコード表に当てはめ数値を取り出すと、
![スクリーンショット 2021-09-08 0.35.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/da491bd7-4cd1-0bc2-591a-5470e72d0b2c.png)





　Aのコードは２進数で01000001

**つまりAには,１０進数に直すと６５という数値が割り当てられ、１バイトの中に入っている**


>参考書籍
>>きたみりゅうじ　『キタミ式　イラストIT塾　基本情報技術者　令和０３年』 技術評論社 2020年
マジックナンバーは使うな

あまりにも見ていてポエってきたのでポエります。

https://qiita.com/masakura/items/aee7a01ccaacb2b92c2a

バズり狙いのためだけに無責任なタイトルを書かれるのは悲しい事です。

## 9/17 追記
私の記事を含めた内容で記事を頂きました。

https://qiita.com/Nabetani/items/8b7555581914d5f2ce0f

参考になり考えさせられましたので文末に追記します。

## 本編感想

```
const decimal ランク1上限 = 1_625_000;
const decimal ランク1控除額 = 650_000;
const decimal ランク2上限 = 1_800_000;
const decimal ランク2控除率 = 0.40m;
```
>
>これをわかりやすいという人はいないと思います。
>わかりにくいだけならまだしも、タイプミスを防げません。
>ランク3上限 のところを ランク2上限 とタイプミスしても気が付かないでしょう。

定数内の数字とマジックナンバーの数字を打ち間違える確率はマジックナンバーの方が高いでしょう。
私はうっかりやなので入力ミスしないよう出来る限り変数なり定数なりに入れます。
記事内の変数名が全て日本語なのでVBAだと思いますが、インテリセンスが使用しにくいと思うので私なら下記にします。

```
MaximumRankOne
MaximumRankTwo
DeductionRankOne
DeductionRankTwo
```

英語赤点なのでWeblio直訳名です。
インテリセンスを使用すれば
mro
mrt
dro
drt の3入力で概ね打ち込めます。
名前の順番や意味合い、理解度が気になる場合はRank_One_MaximumでもランクThree上限でも大丈夫だと思います。
ランク一上限とかランク壱上限でもいいような気がしてきました。

>現実には定数の値の修正では足りない変更が入る確率のほうが高いでしょう。
>ほとんどの処理には名前があります。
>「消費税額」や「所得控除額」という仕様にある名前をそのまま関数にして、仕様と同じになるように実装を書きます。
>それをすれば、定数化はほとんど必要ないでしょう。

修正が足りないだけで増える要因にはなっていません。
マジックナンバー「1_625_000」を入力するよりもインテリセンスを活用した方が入力速度が速く確実に記述出来ます。

## Comment感想

>私はマジックナンバーを使うほうがいいと思っています。
>というのも、数には業務にディペンドしてその業務では自明なものと思っています。
>つまり、業務の理解ができていれば数は頭に入っている。
>マジックナンバーをみてピンとこない人はプログラムをメンテすべきではない。
>むしろ、それがわかるまで業務理解を進めたほうがいい、と思ってます。

私が感じた印象を例えます。
Excelのマクロで数時間の作業を一瞬で終わらせた時に上司に言われる一言。
「プログラムには温かみがないし確実ではないから電卓を使ってちゃんと計算しなさい」

クライアントが何か設定を変更したい時、option項目を変更するだけで問題ないようにプログラムを組みます。
ささいな変更まで中身の理解は必須ですか？
必要だったとして消費税として使われている0.1という数字を確認のためだけにプログラム内から全て探す労力と時間を想像するとげんなりします。

>static final int ONE = 1;
>こういう何の意味もない定数化はNG。

私も経験があります。

```
ONE * ONE
int[ONE]
ONE.ToString() + "回目"
```

まだまだ羅列する事が出来ますが狂気の沙汰です。
いちからか？　いちからせつめいしないとだめか？

>消費税を計算するというコンテキストで、0.08とか0.1という数値を見れば、それが消費税率であるとほぼ全員がわかるでしょう。

概ね分かると思いますがひとつ問題があります。
2014年から消費税率は一律8％です。
2019年から消費税は10%かつ軽減税率8%です

0.08という数字は未修正の消費税なのか、修正済みの軽減税率の8%なのかかこの数字だけでは確定できません。
顧客が軽減税率適用商品しか扱っていないからと前任者が勝手に判断して修正したにも関わらずこの数値かもしれません。
後から意味合いが増えた形ですが意地悪な発想でしょうか。
私としては名前が付けられるのなら全て名前を付けてほしいです。
関数処理でも定数処理でもかまいません。
本来不要な推測を求められてミスした時はこちらの責任になる事が多々あります。
プログラムの挙動どころか制作者の腕すら推測しながら作業するのは苦しいんです。

>定数化かどうかは置いといて、その数値が何なのかを説明するために定数でも変数でも良いので
>入れておいて名付けをして欲しいというのが「マジックナンバー使うな」という事の本当の意味じゃないかな。

本当に同意しますし私もこの気持ちです。

マジックナンバーや数字リテラルをどんどん使って困るのは現在のあなたではありません。
そのプログラムの改修を命じられた後任者だったり、遠い過去に作られた手抜きプログラムの改修を命じられたあなたです。
その過去にプログラムを作ったのもあなたかもしれません。

## マジックナンバー（数字リテラル？）を使っていい場合

https://qiita.com/Nabetani/items/8b7555581914d5f2ce0f

上記の記事では公式に当てはまる数字は直接入力してよいとされています。
これに関しては同意します。
錐の体積や角度の変換に使用する不変の数字をあえて命名して使用しなければならない理由がありません。
三角形の面積を求める際、底辺×高さ÷2で÷2をリテラルで使用してはならないと言われれば違和感があります。
呼び出し関数名等で三角形の計算などと命名すべき場面であり、÷2に全ての責任を任せるべきではありません。
（三角形の底辺等の助長な名前も排除されるべきです）
私の参照元記事commentにもありますが

>いや、でも変更されることのない数学の定理と変更の可能性のあるビジネスロジックを比較するのも違うか…難しいですね。

という点を考慮出来るかが重要だと考えます。

此処から先は蛇足です。
色空間の変換に関して簡単な調査をしましたが、RGBへの変換方式だけでも多数の変換方式がありました。
その中にAdobe RGBがあるため、私の記事は怪しくなります。
数学の公式であればロジックが変更される可能性は限りなく低いと主張出来ます。
しかしながらAdobeRGBは一企業が制定したロジックを使用しています。
変換方式を容易に変更する訳がないと言いたくなりますが、文字コードでハングルの大移動という前例がある以上は唐突に変換式が変更になる可能性もあります。
それを消費税の計算とどこまで違うのかという話となるとすぐに答えを出せません。
勿論、ランク1上限や消費税に関してリテラルで打ち込む事は今後もありません。
私には上記のような少数の例外とその理由について自身で納得出来る程度の理由をもう一度考える時間が必要です。
本番環境でgoogle認証ログインができない時の解決方法

#はじめに
本番環境にて、google認証ログインを行った時以下のようなエラーが発生した。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1599988/fb5431d9-7749-02f6-e31e-c251782193fe.png" width=50%>

#結論
原因としては、本番環境にclient_idが記述された.envが存在していないことだった。
本番環境にも.envを作成すると、google認証することができた。

しかし、自分は.envはgithubに上げないようにしているため、デプロイすると再び.envが読めなくなり、google認証できなくなってしまう。
そのため、デプロイ時に毎回.envを本番環境に作成しなくてもいいようタスクを作成した。

```
#capfile
namespace :deploy do
  desc "upload env"
  task :sync_env do
    on roles(:app) do |host|
      upload! ".env","#{shared_path}/.env" #デプロイ時、shereフォルダへローカルの.envをコピー(※大切な情報のためcurrentよりもsharedに入れたほうがいいらしいので)
      execute "ln -s #{shared_path}/.env #{current_path}/.env" #currentではなく、sharedの.envを参照させる
    end
  end
end
```
IBM Cloud クラシック・インフラストラクチャーにおけるIaaSにて、terraformからOSイメージを詳細に指定する

備忘

# 課題: os_reference_code = "REDHAT_8_64" といった指定ではRHEL 8.2など詳細な指定ができない。

IBM Cloud クラシック・インフラストラクチャーにおけるIaaSにて、RHEL 8.2のイメージを作成する必要があった。
リファレンスには以下の様な例が載っていて、os_reference_codeにてOSイメージを指定できる。

https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/compute_vm_instance

```tf
resource "ibm_compute_vm_instance" "vm1" {
  # Mandatory fields
  hostname             = "terraformquote"
  domain               = "IBM.cloud"
  quote_id             = "2877000"

  # Optional fields
  os_reference_code    = "DEBIAN_9_64"
  datacenter           = "dal06"
  network_speed        = 100
  hourly_billing       = false
  private_network_only = false
  flavor_key_name      = "B1_2X8X100"
  local_disk           = true
}
```

しかし、RHEL 8系は、os_reference_code    = "REDHAT_8_64" などとなり、詳細なバージョンの指定ができなかった。(この文書作成時点では、RHEL 8.4がデプロイされた。)

# ソリューション: image_idを利用

ドキュメントをよく読むと、os_reference_code とは異なる、image_idというものでも指定できるとのこと。

https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/compute_vm_instance#image_id

しかしWeb上のIBM Cloudコンソールでもimage_idなるものは見た事がないな〜と思いつつ更に読むと、

__To retrieve the image template ID from the IBM Cloud infrastructure customer portal, navigate to Devices > Manage > Images, click the image that you want, and note the ID number in the resulting URL.__


ということで、IBM Cloudコンソールで、クラシック・インフラストラクチャーでimageの画面から、パブリック・イメージ（全てのイメージ）指定、かつRed Hat Enterprise Linuxにて検索すると、RHEL 8.2のイメージが幾つか見つかったので、それらの__URL__を参照することでイメージのID numberを入手する事ができました。
日付のテストは午後にやろう

`SimpleDateFormat` の `HH` と `hh` は結構な確率で間違えます。
結合テストが軌道に乗ってきた頃に、午後にならないと再現しない謎の不具合が発生します。

```java:
// 現在日時: 2021-09-15 13:24:56

DateFormat df1 = new SimpleDateFormat("yyyyMMddHHmmss");
// => 20210915 *13* 2456

DateFormat df2 = new SimpleDateFormat("yyyyMMddhhmmss");
// => 20210915 *01* 2456
```

面倒なので単体テストでちゃんと検知しましょう。
ということで、午後の日付を入力値にするのがポイントです。

以下はdjUnitでやるときの例。

```java:
// 現在日時を固定（超てきとう）
MockObjectManager.addReturnValue(Calendar.class, "getTime", Timestamp.valueOf("2021-09-15 13:24:56"));

// テスト実行＆結果の検証
String result = testObj.test();
assertEquals("20210915132456", result);
```
serverless frameworkを試した

# 背景
* AWS上にlambda関数を開発した
* codecommitから各環境にlambda関数をデプロイする
* DBやS3と接続するのでローカルで開発してテストしにくい

# serverless frameworkとは
* サーバーレス開発ツーるである 
    * https://github.com/serverless/serverless  


## メリット 
* インフラ自動構築 
    * Cloudformationのstackを自動的に作れる  
* デプロイ簡単 
    * Lambda関数を１コマンドでデプロイできる 
    * 複数functionを管理とデプロイできる   
* 環境と環境変数の管理 
    * 環境を分けることが簡単  
        * Dev, stg, pro  
    * 環境変数を簡単に定義  
* IAMロールの定義も簡単  
    * Functionよりroleを定義できる  


# 簡単な使い方
* serverless frameworkのインストール 

```
npm install -g serverless 
```
 
* 初期化 

```
serverless create --template aws-nodejs --name my-service --path my-special-service 
```

* 要素説明 
    * serverless.yml: serverless.ymlは各サービス全体の設定を行うためのファイル 
    * handler.js: これはファンクションを定義するためのスケルトンとして生成されるファイル 

* インフラ構築 

```
sls deploy -v 
```
 
* Lambda関数をデプロイ 

```
sls deploy function -f hello 
```
 

* ローカル実行 

```
 sls invoke local -f hello -l 
```
 
* インフラ削除 

```
sls remove -v 
```
【Laravel】apiで一覧取得結果のjsonを返したら、ダブルクォーテーションがエスケープされた

## 事象
Eloquentを使い検索結果のリストをjsonに変換後、`return response()->json`で返却したところvalue部分のダブルクォーテーションがエスケープされました。
>"result": "[{\"id\":2,\"status_type\":-10,\"name\":\"aaaaa\"…]"

本当はこんな風に返してほしいのですが
>"result": "[{"id":2,"status_type":-10,"name":"aaaaa"…]"


## 環境
Laravel Framework 8.43.0
PHP 7.3.24-(to be removed in future macOS) (cli) (built: May  8 2021 09:40:34) ( NTS )

## 解決策

一覧取得時に->toJson()を使ったのが駄目?だったようです
こんな感じで書いていました。
`$items = Hoge::select()->orderBy('created_at', 'desc')->get()->toJson();`

下の書き方で上手く行きました。
`$items = Hoge::select()->orderBy('created_at', 'desc')->get();
json_encode($items);`

理由はよくわかりません。
PHP初心者に超オススメのUdemy講座6つを厳選！web入門者必見

この記事では、Udemyのオススメ初心者向けPHP講座を紹介します。

・未経験でもwebアプリケーションを作れるようになりたい
・将来的にサーバーサイドエンジニアになりたい
・自分でコードを書くかは未定だけど、ウェブサービスを作って起業したい

といった人にオススメできるものをチョイスしました。

## ちゃんと学ぶ、PHP+MySQL（MariaDB）入門講座
おすすめ度：★★★
・[ちゃんと学ぶ、PHP+MySQL（MariaDB）入門講座](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fphp7basic%2F)
### この講座で学べる内容
・PHPの基礎知識とMySQL（MariaDB）の基礎が修得できる
・SQLの基礎が修得でき、データベースを利用したプログラムを作成できる
・PHPを利用したプログラムを作成でき、サーバーサイドのWebサービスを開発できる
・データベースと連携した、Webサービスを開発・カスタマイズできるようになる
## 【PHP, MYSQL, Apache】ガチで学びたい人のためのWEB開発の基礎(バックエンド編)
おすすめ度：★★★★★
・[【PHP, MYSQL, Apache】ガチで学びたい人のためのWEB開発の基礎(バックエンド編)](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fbackend-tutorial%2F)
### この講座で学べる内容
・どのような技術が組み合わさってWEBシステムが動いているのか、その基礎を体系的に学びます。
・開発に欠かせないWEBの基礎知識について学びます。
・PHPの基本的な文法について学びます。
・開発で頻出する正規表現の使い方について学びます。
・PHPの名前空間、クラスを使った記法について学びます。
・データベースの実践的な設計手法について学びます。
・SQLを使ったデータベースの操作方法について学びます。
・Apacheの設定方法について学びます。
・サーバーとブラウザのやり取りを可視化し、その仕組みを学びます。
・Apacheの設定を通してパフォーマンス改善の基礎を学びます。

## 【HTML,CSS,JS,PHP,Git,Docker】✅ プログラミング初心者OK！ ゼロからわかるWebシステム開発
おすすめ度：★★★★
・[【HTML,CSS,JS,PHP,Git,Docker】✅ プログラミング初心者OK！ ゼロからわかるWebシステム開発](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fweb-app-development%2F)
### この講座で学べる内容
・Webアプリケーションの基礎
・HTML / CSSを用いた静的なWebページの構築
・JavaScript を用いたプログラミング入門
・PHPを用いた動的なWebページの構築
・ターミナル / コマンド操作の基礎
・AWS（クラウドコンピューティングサービス）を活用したWebサーバーの構築
・独自ドメインやSSL/TLSの設定
・Gitを活用した開発フローの学習
・Dockerを活用した開発環境の構築
・プログラミング設計（MVC）/ UnitTest の基礎

## ちゃんと学ぶ、PHP 7/8入門講座
おすすめ度：★★★
・[ちゃんと学ぶ、PHP 7/8入門講座](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fphp-master%2F)
### この講座で学べる内容
・PHPを利用したプログラミング開発手法
・PHP 7以降の新しい言語仕様
・MAMPを利用したウェブサーバーでの PHP開発手法
・データベース（MySQL/MariaDB）との連携方法
## 基礎だけ学ぶ PHPプログラミング講座
おすすめ度：★★★★★
・[基礎だけ学ぶ PHPプログラミング講座](https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fcode-php%2F)
### この講座で学べる内容
・PHPプログラミングの基礎が学べます。
・Webアプリケーション開発の基礎が学べます。
・ターミナルでのコマンド操作を学べます。
・開発環境の作り方など、プログラミングの流れを理解できます。
## 【3日でできる】はじめてのLinuxサーバー構築入門（CentOS 7・PHP 7・Docker対応）
おすすめ度：★★★★★
・[【3日でできる】はじめてのLinuxサーバー構築入門（CentOS 7・PHP 7・Docker対応）](	https://click.linksynergy.com/deeplink?id=Qw*xM8wv/u4&mid=47984&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Flinux_vps_3days%2F)
### この講座で学べる内容
・さくらのVPS上にCentOS 7をインストールできる
・PHP7で、LAMP環境（Webサーバー）を構築できる
・LAMP環境にWordPressをインストールできる
・DockerでWordPressサイトを作れる

## Udemy関連記事
・[SQL未経験者にオススメのユーデミー動画講座6選!データ分析したい人向け](https://qiita.com/ykimura517/items/24a5ba6cb742b4872640)
・[【Python】サーバーサイド初心者にオススメのUdemyのDjango動画講座5選](https://qiita.com/ykimura517/items/322fa40c6a4bac0bc111)
・[iPhoneアプリ作成入門に最適なUdemyのオススメSwift講座5選](https://qiita.com/ykimura517/items/55530f508dddb56ce20d)
・[【学習効果・高】ブロックチェーン入門に最適なUdemy講座おすすめ6選](https://qiita.com/ykimura517/items/4ed720420fbab536a628)
・[Typescript入門におすすめのユーデミー講座5選。JS未経験者も可](https://qiita.com/ykimura517/items/1f3f59f64193a495542f)
Rustのパブリックなコンストラクタメソッドを持つ構造体とは

##はじめに
私はオブジェクト指向言語の経験者なのですが、
オブジェクト指向でいうところのクラスはRustの構造体という記事を見てから積極的に構造体が使えるようになってきました。

https://qiita.com/nacika_ins/items/cf3782bd371da79def74

コーディングを進める中で、モジュールの構造体のフィールドをPrivateにしたい場合が出てきました。
しかし外部から利用するにはPublicにせざるを得ません。
解決方法は、日本語ドキュメントにありました。（おわり）

この記事は、基本的に以下ページに書いてあることのままですが、ドキュメントを一読しただけでは利用場面が想像しづらかったので整理しました。

https://doc.rust-jp.rs/rust-by-example-ja/mod/struct_visibility.html


##PublicとPrivateを考慮できていないパターン
まずは、コンパイルエラーになる書き方から見ていきます。
`CatData`はPublicですが、`name`, `returnCode`はPrivateなのでコンパイルエラーになります。

```rust:lib
// 構造体
pub struct CatData {
    name: String,
    return_code: String
}
```
```rust:main
// 何らかの処理
let name = "Tama";
let tama_rescode = getCatData(name);

// インスタンス化
let cat = CatData　{
　　　　name: name.to_string(), // field `name` of struct `xxx::CatData` is private
  return_code: tama_rescode // field `return_code` of struct `xxx::CatData` is private
};

// 利用
println!("returnCode: {}", cat.return_code); // field `return_code` of struct `xxx::CatData` is private
```
##解決方法①：Publicなフィールドを持つPublicな構造体にする
フィールドの前に`pub`をつけるだけでコンパイルがとおります。

```rust:lib
// 構造体
pub struct CatData {
    pub name: String,
    pub return_code: String
}
```
問題は、フィールドを公開したくない場合です。
例の場合、`name`は外部参照される予定がありませんが、`pub`にせざるを得ない状況です。

##解決方法②：PrivateなフィールドとPublicなコンストラクタメソッドを持つ構造体にする

```rust:lib
// 構造体
pub struct CatData {
    kind: String, // 外部から更新されないフィールドも使える
    name: String,
    return_code: String
}
// 構造体CatDataのメソッド（メソッドとはオブジェクトに付属した関数）を定義
impl CatData {
    // Publicなコンストラクタメソッド
    pub fn new(name: &str, response_code: String) -> CatData {
        CatData {
            kind: "Animal".to_string(),
            name: name.to_string(),
            response_code: response_code
        }
    }
    
    // response_codeを外部から利用するためのPublicメソッド
    pub fn get_code(&self) -> String {
        self.response_code.clone()
    }
```
```rust:main
// 何らかの処理
let name = "Tama";
let tama_rescode = getCatData(name);

// インスタンス化
let cat = CatData::new(name, tama_rescode);

// 利用
println!("returnCode: {}", cat.get_code());
```
##おわりに
ありがとうございました。
ほぼオブジェクト指向の設計で進められているのですが、Rustにクラスがないことの意味をちゃんと考えたほうがいいかもしれません。

なおWikipediaには、`マルチパラダイムプログラミング言語`と書かれていました。

> Rustはマルチパラダイムプログラミング言語であり、手続き型プログラミング、オブジェクト指向プログラミング、関数型プログラミングなどの実装手法をサポートしている。

すごい。
AWS Certificate ManagerでEメール認証からDNS認証に切り替え

# メール連絡
AWSより以下のメール連絡がありました。
Changes to AWS Certificate Manager (ACM) email validated certificate renewal workflow

これはaws acmで管理しているSSL/TSL証明書の認証方法が変わりましたよ
という案内で、要はEメール認証は今後自動更新に対応しないので
DNS認証に切り替えをおすすめしますという内容のメールでした。

# 現在のドメイン設定を確認
ドメインレジストラ　｜　お名前ドットコム

# AWS構成
Route 53 → CloudFront → Elastic Beanstalk(ALB → EC2） → RDS
↑この構成の場合SSL/TSL証明書は
CloudFront（バージニアリージョン）
ALB（東京リージョン）
と2箇所に設置されているケースが多いと思います。
これはCloudFrontのリージョンがグローバルでかつ
すべてのエッジロケーションに反映されるのに時間がかかる場合があることが理由です。
このように証明書を分けておくことでCloudFrontでトラブルが起こった際にも
Route53 → Elastic Beanstalk(ALB → EC2） → RDSのように
切り替えたり、CloudFrontのディストリビューションを
新たに作ったりする事によって柔軟に対応ができるメリットがあります。
逆に証明書を共通にしてしまうと逃れられないダウンタイムが発生するリスクが想定できます。

# 現在の認証方法
Email認証

# 証明書の認証方法の切り替えはできない
現在のEmail認証で使用している証明書をCDN認証に切り替えることは出来ないため、新しくCDN認証の証明書を作る形で申請をする。

# 新規CDN認証をCertificate Managerから申請する作業手順
１．リージョンを確認し、Certificate Managerコンソール画面の証明書リクエストをクリック
２．パブリック証明書のリクエストにチェックが入っていることを確認し【証明書のリクエスト】をクリック
３．*.example.comで設定し【次へ】をクリック
(当方の環境ではhttp、wwwなしのネイキッドドメインへのアクセスはすべて https\://www\.example\.com へ301しているという環境のためこの設定ですがサブドメイン運用や細く設定する必要があれば適宜ここで設定できると思います。）
４．DNSの検証にチェックを入れて【確認】をクリック
５．内容を確認して【確認とリクエスト】をクリック
６．DNS検証の為のネームサーバへ設定する値が表示されますのでネームサーバへ設定します。Route53を使用している場合は【Route53でのレコードの作成】ボタンを押すと、Route53コンソールにCNAMEレコードが設定されます。ここで場合によっては反映されるまでには時間がかかります。30分くらいは時間を置くのが良さそうです。
※ここでいうネームサーバとはRoute53のようなDNSサービス内の設定項目のことです。

# 証明書を割り当てる
私の環境の場合CloudFrontとALBの2箇所に割り当てます。

## CloudFrontへの設定
CloudFrontのコンソール画面からディストリビューションを選び【一般】→【編集】から
【SSL Certificate】 → 【Custom SSL Certificate】 → 【今回作成した証明書】を選び設定します。

### 注意点｜CloudFront設定時
CloudFrontはエッジロケーションと呼ばれるサーバを複数持っており、約24時間は証明書が古いものと
新しいものを使用しているサーバが混在する状況となるようです。したがって旧証明書も約24時間以降に
削除したほうが安全とのことです。
ちなみにCertificate Managerのコンソール画面では証明書が使用中という項目がありますが
新しい証明書を適用後ここを見ていましたがすぐにはいいえになりませんでした。

## ALB( Beanstalk内)への設定
【Beanstalkコンソール】 → 【ロードバランサー】 → 【編集】 → 
【該当するリスナーを選択してアクション→編集】 → 【SSL証明書を選択】 → 
最後忘れずに画面最下部の 【オレンジの適用ボタン】をクリックすると反映が始まります。
自分の環境ではおそらく10分もかからずに反映されました。
反映中も該当のURLをリロードしてみましたがダウンタイムは確認できませんでした。
Certificate Managerのコンソール画面、証明書が使用中の項目はすぐにいいえになりました。
（確認できておらず恐縮ですがおそらく即時反映）

# 作業前、作業中に起こった疑問
Eメール認証している証明書を使用している状態でDNS認証用の証明書を発行することになるわけですが、運用中のドメインで複数証明書を発行することは運用中のサイト表示、メール受信などに影響を与えることはあるのか？という疑問が生まれました。

### 回答
同ドメインに対する新規証明書を発行すること（2枚の証明書が存在する状態）ではサイト表示、メール送受信には影響が出ない。

# 余談
今後ACMでSSLサイト公開用の証明書申請するならDNSが良いと個人的には思います。
(AWSのマニュアルでもおすすめされていました。)
Eメール認証だと年1で更新手続きの作業が発生するので面倒＆忘れるリスクも０ではありません。

# DNS認証の運用で注意したいこと
Route53にCNAMEが設定されているのでこれを削除してしまうと認証が失敗してしまいサイトが表示されないなどの事故が想定できます。Route53のCNAMEに設定されたことは忘れずに＆情報共有などをしっかりめにやったほうが良さそうです。

# 参考ページ
[E メールで検証済みの AWS Certificate Manager（ACM）証明書の更新ワークフローの変更](https://www.sunnycloud.jp/column/20210725-01/)
[ACMの証明書をDNS検証にする](https://blog.kozakana.net/2019/03/aws-dns-validate/)
postgres DateBaseの初期設定（ユーザ設定まで）

# 1.DataBaseの作成
## 1.1.psqlを起動する
今回はWindowsServer2012R2で実施する。
WindowsPowerShellを起動する（powershellは二重引用符で囲む）
>PS C:\>`cd "C:\Program Files\PostgreSQL\11\bin"`


psqlを起動してpostgresでログインする
>PS C:\Program Files\PostgreSQL\11\bin>`.\psql -U postgres`

##1.2. DateBaseを作成する
データベース"xxx_123"を作成する。\l で作成されていることを確認する。
>postgres=# `CREATE DATABASE "xxx_123";`
>postgres=# `\l`


#2.ユーザの設定
##2.1 ユーザの作成
ログインユーザ xxx_user　パスワード zzz_pass を設定する。
設定されていることを確認する
>postgres=# `CREATE ROLE "xxx_user" LOGIN PASSWORD 'zzz_pass';`
>postgres=# `select usename from pg_user;`

##2.2 権限付与
DB xxx_123 に対して、スキーマやテーブルの作成権限をxxx_userに付与する
>postgres-# `GRANT CREATE ON DATABASE xxx_123 To xxx_user;`
【TypeScript】配列から undefined を取り除く

使う時忘れる時が多いから、記録しておきます。

```ts
// undefined を含む配列
const array: (number | undefined)[] = [1, 2, undefined, 3 , 4];

// データは除外したが、型には undefined が残ったまま
array.filter(item => item !== undefined); // [number | undefined]

// データ、型ともに undefined を除外した
array.filter((item): item is Exclude<typeof item, undefined> => item !== undefined); // [number]
```
応用情報技術者試験　対策　＜改＞

|優先度|相性| 内容 | 分野 | 問題 | 範囲 | 正答率 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|1| ◎  |プログラミング   | テクノロジ  | 知識  | -  |高|
|2| ◎  | システム監査  | マネジメント  |国語   | 狭  |高|
|3| ◎  | 組込システム  | テクノロジ  |国語計算   | 狭  |高|
|4| ◎  | 情報セキュリティ  |テクノロジ   | -   |-    ||
|5| 〇  | データベース  | テクノロジ  | 知識国語  | 狭  |低|
|6|  △ | ネットワーク  |テクノロジ  | 知識  | 狭  |高|
|7| △  | 情報システム  | テクノロジ  | 国語  | 広  ||
|8|  △ |システムアーキテクチャ   | テクノロジ  |  計算 | -   ||
|| ×  |サービスマネジメント   | マネジメント  |国語   |  -   |低|
|| ×   |経営戦略   |マネジメント   | 国語  | 広  ||
||   × |プロジェクトマネジメント   | マネジメント  | 知識国語  | 広  |低|


1. 重点対策：１日１分野（１～８）
    1. 対策する分野を絞る（８→７分野）？？
1. 優先度順に分野ごとに過去問１０年分する＜７日間＞
1. 午前問題対策する＜３日＞