OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon RDS

#RDSとは？
**・フルマネージドなリレーショナルデータベース
・高速、安定したパフォーマンス
・低コスト、従量課金**

##①シンプルな構築
 選択するだけで高度な機能を実装
##②高い可用性
**(1)マルチAZデプロイメント**
**(2)同期レプリケーション**
マスターへの変更の後にスレーブを変更し確定してから応答すること
**(3)自動フェイルオーバー**
マスターへの書き込みが止まり、IPアドレスの付け替えによってスレーブがマスターに昇格
**フェイルオーバーの発生タイミング**
・インスタンスやハードウェア障害
・バッチ適用などのメンテナンス時間
##③パフォーマンスの向上
**(1) リードレプリカ**
・レプリカのデータベースで読み取り処理を行う
・リードレプリカは５台まで増設できる
・マルチAZ、クロスリージョンにも対応している
・インスタンスタイプやストレージをマスターと異なるものにできる
・MySQL、MarinaDB、PostgreSQL、Auroraに対応

**(2) スケールアップ**
ストレージサイズは拡張できるが縮小はできない

##④バックアップ
**(1) 自動バックアップ(RDS標準機能)**
スナップショットとトランザクションログをS3に保存する。

**(2) スナップショット**
1日1回自動取得、保存期間最大35日分(設定可能)、手動スナップショットは任意の時間に可能
自動スナップショットは、DBインスタンス削除と同時に削除

**(3) リストア**
スナップショットを元にDBインスタンス作成

**(4) リネーム**
RDSに接続する際にエンドポイントを切り替える機能

**(5) CloudWatchに対応**
各種のメトリクスを60秒間隔で取得・確認可能

**(6) 拡張モニタリング**
50種類以上のOSメトリクス、特定のメトリクスへアラーム、CloudWatch Logsへの出力、1秒〜60秒間隔で取得

**(7) イベント通知**
RDSで発生したイベントをAmazon SNS経由でPush通知

 **(8) 各種制限と緩和申請**
初期では制限がある
・RDSインスタンス数：40
・１マスターあたりのリードレプリカ数：5
・手動スナップショット数：100
・全てのDBインスタンスの合計ストレージ：100TB　など

必要に応じて**上限緩和申請**ができる。


#⑤セキュリティ
**(1) アクセス制御**
　デフォルトではインスタンスに対するネットワークアクセスはオフになっている。セキュリティグループ変更によりアクセス可能になる

**(2) インスタンスの暗号化**
　・保管時にインスタンスとスナップショットの暗号化可能
　・DBインスタンス、自動バックアップ、リードレプリカ、スナップショットが対象
　・AES-256アルゴリズム使用
　・インスタンス作成時にのみ設定可能
　・スナップショットのコピーを暗号化してリストアすることは可能
【Chrome】Google検索時に見つかったpdfファイルがなぜかダウンロードできない

# 問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/c6909f70-096e-595a-1606-8430547c5f62.png)
Google検索でpdfファイルを開こうとしても、無反応
リンク先の保存は警告が出てしまいます。

# 解決法
httpsなサイトを閲覧中にhttpからのファイルダウンロードは防がれてしまうという仕様のせいでした。

```
chrome://flags/#treat-unsafe-downloads-as-active-content
```

をDisabledして、Choromeを再起動すればよい（セキュアではないが)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/aad26a8f-7993-53f0-dd17-e04dc3d1d41d.png)


# 参考
https://developers-jp.googleblog.com/2020/02/google-chrome.html
コネクションプーリングとは。

#【コネクションプーリングとは。】

業務でコネクションプーリングという用語が出てきました。
恥ずかしながら、初めて聞いたものだったので簡単に学びました。

##コネクションプーリング

DBMSへのアクセス要求に応じて、接続や切断を繰り返すのではなくて、DBのコネクションを一定数確立しておいてそれらを使い回す。
　→　接続情報を保持して、コネクションを再利用する。

##メリット

<strong>Webアプリケーションの全体的なスループットの向上になる。</strong>

DBへの接続へのオーバーヘッドをカットして、Web/DBの双方の負荷を削減すると共に同時接続数を削減する。

　→　接続時間の短縮が可能になる。（キャッシュのような感じ？？）

##マイナス要素
 
アイドル状態のコネクションは、メモリリソースを無駄に消費する事になる。
[Drupal]自サイト用にコントリビュートモジュールのパッチを作成する

## やりたいこと

- コントリビュートモジュールのパッチを作成する
- 自サイトにパッチを適用する

## パッチを作成する前に確認すること

- コントリビュートモジュールでなんとかならないか考える
- UIで見落としてる設定が無いか確認する
- hook、プラグイン、サービス書き換え等、正式な方法で平和解決できないか考える

パッチはモジュールアップデートで合わなくなる可能性があるからできるだけ避けたい :no_entry_sign: 

## なんでわざわざパッチを作るのか（直接書き換えちゃ駄目なの？）
- 直接書き換えると、モジュールをアップデートするときに変更箇所が消えてしまうのでNG :no_good_tone1: 
- モジュールをComposer管理してる & コントリビュートモジュールディレクトリをGit管理から外してる場合は直接書き換えてもgitに反映されないのでそもそも無理

## パッチの作成方法
- パッチを適用したいモジュールのルートディレクトリに行く

```
cd [Drupalルート]/web/modules/contrib/paragraphs
```

- Gitをinit & 全てのファイルをコミット

```
git init
```

- `git status`するとモジュール内の全てのファイルがUntracked filesとして出るので、追跡対象にするためコミット

```
git add .
git commit -m "適当なメッセージ"
```
- 変更したい部分を修正する
- 差分をテキストファイルに保存

```
// パスは適当でいい
git diff > [Drupalルート]/patches/paragraphs_fix_something.patch
```

（パッチの中身はこんな感じ）

```
diff --git a/src/ParagraphAccessControlHandler.php b/src/ParagraphAccessControlHandler.php
index 2946808..820091d 100644
--- a/src/ParagraphAccessControlHandler.php
+++ b/src/ParagraphAccessControlHandler.php
@@ -71,6 +71,7 @@ class ParagraphAccessControlHandler extends EntityAccessControlHandler implement
         $access_result = $access_result->andIf($parent_access);
       }
     }
+    // 処理を追加.
     return $access_result;
   }
 
```
- Drupalルートのcomposer.jsonにパッチの情報を書く

```
 "extra": {
      "patches": {
          "drupal/paragraphs": {
              "Fix something": "./patches/paragraphs_fix_something.patch"
          }
      }
  }
```
- composer installする

```
cd [Drupalルート]
composer install
```

こんなメッセージが表示される & 自動的にパッチが貼られる。

```
 - Applying patches for drupal/paragraphs
    ./patches/paragraphs_fix_something.patch (Expired message can translated.)
```

これならモジュールがアップデートされてもcomposer.jsonさえ無くさなければcomposer installで貼り直し可能 :ok_woman_tone1: やったね
【Rails】Rails起動時のエラー対処法：Your Ruby version is 3.0.0, but your Gemfile specified 2.7.0

`rails s`でサーバーを起動するとRubyのGemfileのバージョンと指定しているRubyのバージョンが異なるというエラーが表示されたので、
この対処法。


##症状

>$ rails -s
Your Ruby version is 3.0.0, but your Gemfile specified 2.7.0


**▼rubyとrbenvのバージョン**
どちらも同じバージョンを指している。

```
$ ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin19]

$ rbenv version
3.0.0 (set by /Users/***/projects/my-pj/demo-rails/.ruby-version)
```


<br>
##対処法
GemfileのRubyのバージョンを変更（シンプル。）

```Gemfile:Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '3.0.0' #修正
```

```:修正を反映
$ bundle install
```

```:起動
$ rails s
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/92a3a53f-6cee-5079-f803-8f1a8117e640.png)


指定したrubyのバージョンで起動完了。
【Firebase / Nuxt.js】プログラミング学習時のメモを記録・共有するサービスを作ってみた

こんにちは、[@kenji7157](https://twitter.com/kenji7157)です。

私はプラグラミング学習をしていると、色々なところにメモを記録していくので、大量のメモを点在させてしまいます。

そのため「プログラミング学習のメモを**気兼ねなく投稿できるサービス**が欲しい」と思い、以下のサービスを作りました。

本記事では、こちらのサービスの使用技術やシステム構成について簡易的ですが書いていきます。**個人開発の技術選定の参考**になれば嬉しいです。
（開発経緯が気になる方は以下をご覧ください。）

https://note.com/kenji7157/n/n3c77ef9b3374

# 作ったサービス

![Kapture 2021-03-26 at 00.56.27.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397734/d65ce276-6841-d673-b8f5-f8b9e3b7eee9.gif)

プログラミング学習時のメモを記録して投稿・共有することができるサービスです。  



https://ticketnote.dev



# 使用技術

使用技術は以下の通りです。

- nuxt.js
  - Vue.jsベースのJavaScriptフレームワーク
  - https://ja.nuxtjs.org/ 
- TypeScript
  - コンパイル結果がJavaScriptコードになる、「AltJS」と呼ばれる種類の言語
  - https://www.typescriptlang.org/
- Vuetify
  - Vue.jsで使用できるマテリアルデザインのUIフレームワーク
  - https://vuetifyjs.com/en/
- Firebase
  - モバイル・Webアプリケーション開発プラットフォーム
  - https://firebase.google.com/
- GAE
  - Google Cloud Platform（GCP）のPaaS
  - https://cloud.google.com/appengine/docs

---

※ Firebaseの内、本サービスでは以下を使用しています

- Authentication(Googleアカウント)
- Firestore
- Storage
- Functions

---
他にも特筆して上げておくと[emoji-mart-vue](https://github.com/jm-david/emoji-mart-vue)というライブラリを使用しています。

（絵文字リストの動作が遅いので、改善方法がありましたらご教授お願いします。）
![スクリーンショット 2021-03-26 0.35.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397734/de1b6872-f43e-6cd0-9336-49afd0092c6c.png)



# Firebaseによるサーバレスアーキテクチャ

> 現在（2021年11月)はGAEにホスティングしているため、構成図・後述の「それぞれの役割」は追って修正します。:bow: 

システムの構成図は以下のように、**Firebaseによるサーバレスアーキテクチャ**になっています。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397734/ff070a2e-5e46-da8f-98e5-40a479dac3d4.png)

## それぞれの役割

- Hosting
  - ブラウザからのHTTPリクエスト時は**Cloud Functions** にリライト
  - 参考記事：https://qiita.com/isatan@github/items/c1ad0eeee5d118ebc1e8
  - OGP画像、faviconなどの静的リソースのみをhostingにデプロイ
- Cloud Functions
  - Hostingからのリライト時にFunctionsが起動
  - `SSRモードのnuxt.js`でHTMLが生成されブラウザにレスポンスする
- nuxt.js
  - `TypeScript`を用いて型付け
  - デザインフレームワーク`Vuetify`を使用
- Authentification
  - `Googleアカウント`でログイン可能
  - 他にもTwiiter,facebookなどのアカウントでも認証機能は実装可能
- Firestore
  - `NoSQL`データベース
  - 参考記事：https://qiita.com/1amageek/items/d606dcee9fbcf21eeec6

---

このように、Functionsを使ったSSRを実装しています。リージョンの制限の関係でFunctionsは`us-central1`を指定する必要があります。

https://qiita.com/qoAop/items/249c1f60b4ec2dd286b9

そのため、東京リージョンを指定してSSRが実現できる`Cloud Run`にアプリケーションを移行するかは検討中です。（改善されるよ or あまり変わらないよ　っていう情報があれば是非教えて下さい。)

# まとめ

本記事をお読みいただきありがとうございました。少しでも興味を持って頂ければ嬉しいです、暇な時に覗いてみてください。

https://ticketnote.dev
[Rust] const-genericsがやって来たのでHilbertの空間充填曲線を実装した

Rust 1.51 で const-generics が stable に降ってきたので, これを記念して D 次元Hilbert 曲線を Rust で実装しました.

https://crates.io/crates/hilbert_index

[Hilbert 曲線](ヒルベルト曲線)はフラクタル曲線の一種 ([空間充填曲線](https://ja.wikipedia.org/wiki/%E7%A9%BA%E9%96%93%E5%85%85%E5%A1%AB%E6%9B%B2%E7%B7%9A)) で, 立方体のなかのすべての格子点を重複なく辿る効率的な経路を与えてくれます. この種のもので最も有名なのは [Peano 曲線](https://ja.wikipedia.org/wiki/%E3%83%9A%E3%82%A2%E3%83%8E%E6%9B%B2%E7%B7%9A)だと思いますが, Peano 曲線が三進数に基づいているのに対して Hilbert 曲線は二進数で, 計算機とより親和性が高いです. そのため高次元データを扱うために用いられたりします. 既に Rust クレートは存在するのですが, 任意の空間次元で使えて手に馴染むクレートがなかったため自作しました. これまでは D 次元で実装しようと思うとマクロで頑張るかヒープを使うかしかなかったのですが, const-generics のおかげで `[T; D]` がとても使いやすくなりました.

# 参考文献
* https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.133.7490&rep=rep1&type=pdf
Windows10-64 Cygwin64 ddrescue

備忘ログ（2021/3/26）

☆Windowsで実行
◎Cygwinで実行

☆Cygwin本体のダウンロード、インストール
　　・https://cygwin.com/install.html
　　　[setup-x86_64.exe]をクリック

☆パッケージのインストール
　　・tar
　　・lzip
　　・gcc-g++

☆windowsでDdrescueのダウンロード
　　・http://ftp.jaist.ac.jp/pub/GNU/ddrescue/
　　　[ddrescue-1.25.tar.lz]
　　・cygwin内に渡す

◎ddrescueのインストール
　　・tar -xvf ddrescue-1.25.tar.lz
　　・cd ddrescue-1.25/
　　・./configure
　　・make
　　・make install

◎ddrescueの実行
　　・https://minasesango.hatenablog.com/entry/2019/07/09/224633
　　・https://qiita.com/ryuichi1208/items/76806a1547fb94da2bca#%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3
　　・など参考に
Salesforceでスケジュールの作成処理を直列化したかった話


初めまして。
とあるIT企業でSFDCをイジイジしている村松と申します。
SFDC歴は1年半くらい。

今回は一通り探してもどこにも書いてねぇ！となった。
スケジュールオブジェクト作成時の排他処理のかけ方についてです。

##事前知識

弊社では、SFDCのシステムを使用して、お客様から弊社社員へのアポの予約ができるようなシステムを構築しています。

機能としてはこんな感じ




webサイトでプランと予約したい社員と時間を選択。
↓
APIでapexクラスを呼び出す。
↓
apexクラスにて社員のスケジュールを確認、空いていたらスケジュールを作成。

この仕組み、ぱっと見大丈夫に見えるのですが、
ほぼ同時（約2秒間隔以内）に処理が走ってしまった場合

1.処理Aがスケジュール確認（被りなし）　
2.処理Bがスケジュール確認（まだAのスケジュールが作成されてないため処理続行）
3.処理Aがスケジュール作成
4.処理Bがスケジュール作成　（ダブルブッキング！！！）

ということが発生してしまいます。
レアケースとはいえ、お客様の予約でダブルブッキングは論外です。


##先に結論
スケジュールオブジェクト作成を直列化することは<font color="Red">不可能</font>。
だが、スケジュールに紐づけるレコードに直列化処理を挟むことで間接的な実現は可能。です。

##不可能と結論付けた根拠

まず、ApexクラスにはFOR　UPDATEというロックステートメントがあります。
ですが、こちらはSOQLでひっかかったレコードを排他ロックするというもので、
新規作成の処理を直列化する処理は出来ません。

社員Aのスケジュール（期間全部）というレコードは残念ながら存在していないため、
スケジュールオブジェクトの予約の直列化は出来ませんでした。

##ではどうしたか。

スケジュールを作成する際に必ず紐づけされるレコードに直列処理を挟むことにしました。
弊社の予約サービスでは、
スケジュールには予約プラン　というカスタムオブジェクトが関連先に必ず紐づきます。

書いたコード

``` Java
//半角スペースでインデントを整えているため、改変して使用するときにはSOQLの行を結合して使用して下さい。
try{
    List<予約プラン__c> reservationList = [SELECT Id FROM 予約プラン__c WHERE 検索したい項目__c 
    =:example.検索したい値 FOR UPDATE];
    予約プラン__c reservation = reservationList.get(0) 
}catch(QueryException e){
    //ロックによるタイムアウトエラーをキャッチ
    result.put('code','1');
    return result;
}

Event newEv = new Event();
newEv.Subject = '予約';
newEv.WhatId = reservation.Id;


insert newEv;
```

事前に予約プランに直列処理を挟むことによって、
同一予約プランの予約がほぼ同時に走っても
2番目の予約はロックが解除されるまで滞留してくれるようになりました。


##注意事項
#####1.ユーザオブジェクトはロックできない
ユーザレコードはロックができません。
なので、変に遠回りしないでユーザオブジェクトロックで社員ごとに直列化！
みたいなことはできません。
悲しい

#####2.SFDCの機能上10秒でタイムアウトが発生します。
SFDCでは、ロックステートメントによるタイムアウトは10秒と定められています。
処理の量にもよりますが、あまり大きな件数同時に同じプランで予約することは出来ないので、
予約が殺到するテナントには向きません。
（別プランであればロックされていないのでそこまで影響なし）
弊社のSandbox環境であれば、およそ7・8件同じプランでの予約がほぼ同時に走るとタイムアウトが発生しました。

#####3.ロックステートメントの仕様が今後変わる可能性がある。
今回の機能は、「ロックステートメントでロックしたレコードに変更のUPDATEを走らせなかったとしても、apexクラスの処理が終了するとロックが解除される。」というSFDCの仕様を使っていますが、
ここの仕様、私たちはテストで確かめただけでドキュメントに明記されている仕様ではありません。
そのため、今後も同手法を使い続けられるかというと、そこの保証はしかねます。

##最後に
正直、かなり回りくどい実装＆今後も動作を保証し続けられるわけではないので、
あまりお勧めできる実装手法ではありません。

基本は無理、どうしてもやりたいなら一応こんな回避方法がなくはない、
位にとどめておいてもらえればなと思います。

他に何かこういう実装方法があるといった方はぜひ教えてほしいです。

それでは。
rubyのバージョンを2.6.5から3.0.0にバージョンアップ。その際にrails newが出来ない場合の対処方法【メモ書き】

#背景
2020年12月20日に「Ruby 3.0.0」がリリースされた
https://www.ruby-lang.org/en/news/
ターミナルでrubyのバージョンを確認を下記を実施

```
$ rbenv versions
  system
＊ 2.6.5(set by /Users/user_name/.rbenv/version)
  2.7.2
```
「ruby 2.6.5」が適用されているご様子
最新のものにバージョンアップをしたことがなかったので今回挑んでみました

#作業工程
下記のyuusaitoさんの投稿を参考にしました
[【Ruby】最新バージョンにしようとしてハマったこと](https://qiita.com/yuusaito/items/d971bae6f156307f7b15)
まずはHomebrewのアップデートを実施
その後にrbenvのバージョン一覧の確認

```
$ brew update
$ rbenv install -l
  2.6.5
  2.7.2
  jruby-9.2.16.0
  mruby-2.1.2
  rbx-5.0
  truffleruby-21.0.0
  truffleruby+graalvm-21.0.0
```
あれ？なくない？
調べてみたら「brew update」と「brew upgrade」は違うみたいでした・・・
[brewのupdateとupgradeの違い](https://qiita.com/okhrn/items/aa71b066a525456550c0)
今度は「brew upgrade」を実施

```
$ brew upgrade rbenv ruby-build
$ rbenv install -l
  2.5.8
  2.6.6
  2.7.2
  3.0.0
  jruby-9.2.16.0
  mruby-2.1.2
  rbx-5.0
  truffleruby-21.0.0
  truffleruby+graalvm-21.0.0
```
「ruby 3.0.0」がインストール可能になった!!
(他のもバージョンアップされてるけど今回は置いておこう・・・・)
では、インストールを行い確認したところ案の定反映はされていなかった

```
$ rbenv install 3.0.0
$ rbenv versions      
  system
＊ 2.6.5(set by /Users/user_name/.rbenv/version)
  2.7.2
  3.0.0
```
全体に反映させたいのでglobalを実施しても反映されなかった
**しかし、ターミナルを再起動させたら適応されていた!!**

```
$ rbenv versions      
  system
  2.6.5
  2.7.2
* 3.0.0 (set by /Users/gai/Desktop/testtest/.ruby-version)
```
よし、これで「ruby 3.0.0」でrailsアプリケーションを作成じゃ!!
「rails new testtest」っと・・・・・

```
rails new testtest              
rbenv: rails: command not found
The `rails' command exists in these Ruby versions:
  2.6.5
  2.7.2
```
へ？「rails」のコマンドが見つかりませんと？
存在するのは「2.6.5」「2.7.2」ですと？ 調べよ・・・
まさにこれですわ、試してみよ!!!
[rbenvでrubyのバージョンを上げたときに The `rails' command exists in these Ruby versions: となる](https://qiita.com/kamillle/items/5a7befd0ebad47378832)
そしてインストールされているか見てみる・・・・

```
$ gem update --system
$ gem install bundler
$ gem install rails
$ cd ~/.rbenv/versions/3.0.0/bin
$ ls
  bundle irb  rails ri typeprof
  bundler nokogiri rake ruby		 
  update_rubygems erb racc rbs sprockets
  gem rackup rdoc thor
```
お、さっきはなかった「rails」がある
「rails new testtest」っと・・・出来た!!
VSCodeでターミナルを開き、バージョン確認したら問題なさそう

```
$ ruby --version
  ruby 3.0.0p0 (2020-12-25 revision 95aff21468)
```
長い道のりでした!
これだけでも学ぶことが多いな

#参考記事
 [【Ruby】最新バージョンにしようとしてハマったこと](https://qiita.com/yuusaito/items/d971bae6f156307f7b15)
 [brewのupdateとupgradeの違い](https://qiita.com/okhrn/items/aa71b066a525456550c0)
[rbenvでrubyのバージョンを上げたときに The `rails' command exists in these Ruby versions: となる](https://qiita.com/kamillle/items/5a7befd0ebad47378832)
複数枚送られてきた画像の保存の仕方

##複数枚送られてきた画像の保存の仕方##

今回はitemに紐付いた画像を複数保存したい時に躓いたのでここに書き残しておこうと思います。


```rails:問題のあったコード
@item = Item.create.params.require(:item).permit(:images, :name)
```

この記述で
送られてきたparamsの中から<font color="Red">images</font>で画像をキャッチしていたのですが、今回は画像が配列形式で複数送られてきているため上手く保存できていませんでした。

```rails:改善後
@item = Item.create.params.require(:item).permit(:name, images: [])
```
とすることで解決できました。
また、<font color="Red">images: [ ]</font>の部分は<font color="Green">permit（）</font>の中の最後に記述しないとエラーになりますのでご注意を。
コマンドを実行する Deb ファイル

こちらのプログラムを参考にしました。
[Debian Packageを作成する](https://qiita.com/ukinau/items/dd6b7ebfcf56f18ff432)
ファイルを配置の前後で、コマンドを実行します。

ファイル構成

```text
$ tree package-test
package-test
├── DEBIAN
│   ├── control
│   ├── postinst
│   └── preinst
└── usr
    └── share
        └── doc
            └── package-test
                └── aa01.txt
```

preinst と postinst のファイル属性は　0755 です。

```text:package-test/DEBIAN/control
Package: package-test
Version: 1.0.1
Architecture: all
Maintainer: ekzemplaro
Section: education
Priority: extra
Description: Packaging test.
```

```text:package-test/DEBIAN/preinst
#! /bin/bash

set -e
#
#        written Tue Jan 20 2015


# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

echo 'preinst' > /tmp/preinst.txt

cd /tmp
git clone https://github.com/ekzemplaro/data_base_language

echo 'preinst *** end ***' >> /tmp/preinst.txt

exit 0
```

```text:package-test/DEBIAN/postinst
#! /bin/bash
# postinst.skeleton
# Skeleton maintainer script showing all the possible cases.
# Written by Charles Briscoe-Smith, March-June 1998.  Public Domain.
# Abort if any command returns an error value
#

set -e

#        written Tue Jan 20 2015

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

echo 'postinst' > /tmp/postinst.txt

cd /tmp
git clone https://github.com/ekzemplaro/storytelling

echo 'postinst *** end ***' >> /tmp/postinst.txt

exit 0
```

```text:package-test/usr/share/doc/package-test/aa01.txt
Mar/26/2021 PM 18:47
```

パッケージの作成

```bash
dpkg-deb --build package-test
```

>package-test.deb が作成されます。

実行

```bash
sudo dpkg -i package-test.deb
```

実行すると次のファイル、フォルダーが作成されます。

>```text
/usr/share/doc/package-test
/usr/share/doc/package-test/aa01.txt
/tmp/preinst.txt
/tmp/postinst.txt
/tmp/data_base_language
/tmp/storytelling
```
nuxtでのリダイレクト設定について

nuxtでリダイレクトを実装する際の選択肢についてまとめます。
nuxt generateとしたとき、挙動が変わりそうです。ぜんぜんリダイレクトが効かなくて疲弊しました。

## redirect-module
nuxtのライブラリ。
リダイレクト処理を書くのがかなり楽になる上に、カスタマイズもしやすい。
https://github.com/nuxt-community/redirect-module#gotchas
gotchasにある通り、nuxt generateでは使えない。

## middlewareで実装する
動きとしてはredirect-moduleに近い。
middlewareなので、ページごとに呼ばれる。
redirect.jsを作成し、そこに処理を書き、middlewareで呼び出す。

```javascript:src/middleware/redirect.js
export default function ({ route, redirect }) {
  if (route.path.slice(-1) !== '/') {
    const search = route.fullPath.match(/\?.*$/)
    // クエリパラメータがあるとき、消さないようにリダイレクトさせる
    if (search) {
      const redirectUrl = route.path + '/' + search[0]
      return redirect(301, redirectUrl)
    } else {
      const redirectUrl = route.path + '/'
      return redirect(301, redirectUrl)
    }
  }
}
```

```javascript:src/nuxt.config.js
router: {
    middleware: 'redirect'
}
```

nuxt generateした際、middlewareは読まれているが上記コードだと動かない。
client側の動きではないため、windowなどの変数が読めていない。
ただredirectするだけであればよいが、色々条件をつけるのであれば動かないこともある。

## trailingSlash設定
カスタマイズは不可能だが、スラッシュあり・なしのリダイレクト設定だけならこれで完結する。
ただし、スラッシュありで設定した場合、スラッシュなしでのアクセスがエラーになるので、避けるためには他のリダイレクト設定と合わせて使う必要がある。

```javascript:src/nuxt.config.js
router: {
    trailingSlash: 'true'
}
```

## htaccess
apacheを使っている場合、.htaccessの設置でリダイレクト設定ができる。
`/src/static/.htaccess`に設置する。

## plugin
pluginにリダイレクト処理を書くことも可能。
pluginであれば、clientに来てからの処理になるのでprocess.clientでチェックすればwindowあたりも使える。

例はIEのときリダイレクトさせる処理。

```javascript:src/plugins/redirect.js
export default ({ route, redirect }) => {
  if (process.client) {
    const ieAvailableRouteNames = [
      'redirect-message'
    ]
    window.onNuxtReady(() => {
      if ((navigator.userAgent.match(/MSIE/) || !!navigator.userAgent.match(/Trident.*rv:11\./)) && !ieAvailableRouteNames.includes(route.name)) {
        redirect('/redirect-message/')
      }
    })
  }
}
```

nuxt generateで使う場合、ssrはfalseに設定する。

```javascript:src/nuxt.config.js
plugins: [
  { src: '~plugins/ie-redirect', ssr: false }
]
```

一瞬リダイレクト前の画面が映るが、一応これでgenerateしても動作する。
iTerm2でAWSのMFAトークンを自動で入力する

# これは何？

iTerm2のTriggers機能を使って、AWS CLIなどのMFA（多要素認証）トークンを自動で入力する方法の紹介です。

# はじめに

AWS CLIを使ったオペレーションや、AWS SDKを使用するアプリケーションを開発する際、組織のポリシーによってはMFA（多要素認証）のトークンの入力が必須であることも少なくないかと思います。

セキュリティはもちろん重要ですが、開発中に何度も入力するのはさすがに億劫なのでMFAトークンを自動で入力する仕組みを考えてみました。

# 必要なもの

- macOS
- [iTerm2](https://iterm2.com)
- [OATH Toolkit](https://www.nongnu.org/oath-toolkit/)
    - `brew install oath-toolkit` でインストールできます

# 設定手順

## 1. AWSのコンソールで仮想MFAデバイスを使用する設定を行う

既にAWSで仮想MFAデバイスの設定をしていて秘密鍵（シークレット設定キー）がわかる場合はこの手順は必要ありません。

秘密鍵がわからない場合は、以下のドキュメントを参考に仮想MFAデバイスを新たに作成し、自身のユーザに割り当てる必要があります。この際に作成した仮想MFAデバイスの秘密鍵（シークレット設定キー）を控えておいてください。

[仮想 Multi-Factor Authentication (MFA) デバイスの有効化 (コンソール) - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html)

## 2. MFAトークンを出力するシェルスクリプトを設置する

OATH Toolkitを使用してMFAトークンを出力するシェルスクリプトを適当なパスに設置して、実行権限を付与しておきます。**実行権限がないと後続の手順で動かないので忘れずに付与してください。**

例

```bash
#!/bin/bash
/usr/local/bin/oathtool --totp --base32 <MFAデバイスのシークレット設定キー>
```

## 3. iTerm2でTriggerの設定をする

iTerm2のプロファイルの設定の Advanced タブに Triggers の項目があるので Edit ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14347/ab36fd91-1055-59ef-7a3a-3b3ebfd0a832.png)

ターミナルの出力が特定の正規表現にマッチしたらCoprocessとして手順2のシェルスクリプトを起動するように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14347/9f629357-ba23-cf5f-945e-2f196a13491a.png)

AWS CLIでMFAトークンを自動入力させる場合の例

- Regular Expression: `Enter MFA code for arn:aws:iam:.*:`
    - AWS CLIのバージョンによって文言が若干異なるかもしれません
    - AWS SDKが表示するプロンプトも多少文言が違うと思います
- Parameters: 手順2で設置したシェルスクリプトのパス
- Instant: 改行が出力されていなくても発動するかのフラグ
    - MFAトークンのプロンプトは改行が出力されないのでチェックしておきます

## 4. 動作確認

以上で設定は完了です。
MFAトークンの入力が求められる適当な操作をしてみて、Triggerが発動するか確認してみてください。

# 改善点

## 秘密鍵の保管方法

この記事では秘密鍵をシェルスクリプトに平文で書く例を記載していますが、秘密鍵はOSのキーチェーンに格納し `security` コマンドを使用して取り出す手法の方がセキュアで良いと思います。

## そもそも他のアプローチにする

この記事では、MFAトークンのプロンプトを正規表現でマッチするという邪道なアプローチをとっていますが、AWS的には多要素認証済みのセッションで発行した一時的な認証情報はそのセッションの間MFAトークンが不要なので、それを使ってAPIにアクセスするのが正攻法ではないかと思います。

軽く調べたところ [aws-mfa-shotgun](https://github.com/ikazoy/aws-mfa-shotgun) というツールがこれを実現しているようなので、こちらを使用するとよいかもしれません。
【webARの王道：8thwall】web版始め方

#環境
ProductName:	macOS
ProductVersion:	11.2
vscode



#1.githubから8thwallのファイルをとってくる
URL:

https://github.com/8thwall/web


```zsh:zsh
#ディレクトリ作る
mkdir 8thwall
#移動
cd 8thwall
#lsやってみた
ls
#cloneする
git clone https://github.com/8thwall/web.git
#コメント出てきた
Cloning into 'web'...
remote: Enumerating objects: 1250, done.
remote: Total 1250 (delta 0), reused 0 (delta 0), pack-reused 1250
Receiving objects: 100% (1250/1250), 77.31 MiB | 8.59 MiB/s, done.
Resolving deltas: 100% (589/589), done.
#vscodeで開く
code .
```

#2.App keyをindex.htmlに入れる
この記事のデモだと、gettingstarted/xaframe/index.htmlのappleyを変更する
入れ方のURL：https://www.8thwall.com/quick-start-web

#3.デバイスの認証をする
意外と面倒なので、うまくいかない場合はこちらで一度認証を削除する
https://apps.8thwall.com/token/remove


#4.serveファイル内でnpm installを実行する。


```zsh:zsh
#ls
web git:(master) ls
README.md      examples       gettingstarted images         serve          xrextras
#serveに移動
cd serve
#npm install
web git:(master) cd serve
serve git:(master) npm install
#1ファイルもどる
serve git:(master) cd ..
#以下のコマンドを実行
#"./serve/bin/serve -d ./gettingstarted/xraframe"
web git:(master) ./serve/bin/serve -d ./gettingstarted/xraframe
#PORTが8080でサーバーが立ち上がった
8888888888888888888888888888888888888888888888888888888888888888
8
8  ./serve/bin/serve [options]
8  -d DIR    path to serve [required]
8  -p PORT   default PORT=8080
8  -h        hot reload on localhost
8  -r        enable hot reload
8  -i IFACE  choose network interface
8  -n        don't print these instructions
8  -- ...    forwarded to serve
8
8888888888888888888888888888888888888888888888888888888888888888
```

その下はこんな感じ
![スクリーンショット 2021-03-26 18.34.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/7e0670d3-a44a-ca81-3d96-11d2c3e0e3b6.png)

QRコードをスマホで読み取るとサンプルプロジェクトが立ち上がる。

![IMG_1960.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/dba85030-8e11-47d6-8754-64077d40fdd3.jpeg)

無駄なファイルがたくさんある、、、、、。

serverを起動するpathを変更してあげると違うプロジェクトも開けます。
![IMG_1961.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/a0b994f8-d699-9887-fe54-2d8f32f46ea7.jpeg)



###参考
https://www.8thwall.com/quick-start-web
AWS Lambdaと開発環境（Eclipse）とでRDSの日時の値が異なる

# 背景

AWS Lambda処理内で、RDSのデータを読み書きする機能を開発していました。
プログラム上で日時を生成してテーブルに格納するのですが、実行環境（ローカル or AWS Lambda）によって日時の値が異なってしまっていました。

# 環境・前提

- Java8
- Eclipse（2020-12 M3）
- RDS（MySQL 8.0）
- AWS Lambda

ローカルで開発中は Eclipse で JUnit を実行し、ローカルから RDS の読み書きを行います。
AWS Lambda へプログラムのデプロイ後は、AWS Lambda を実行し、 RDS の読み書きを行います。

# 検証

## ① ローカル（Eclipse）から、RDSへ

| プログラム上の日時（UTC）[^1] | RDS上の日時       |
| ----------------------------- | ----------------- |
| 2021/3/25 12:00:00            | 2021/3/25 3:00:00 |

[^1]: `Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")))` で生成した日時

この場合、RDSへ登録された時点でソース上の日時から `-9:00` の日時へと自動変換されてしまう。

## ② AWS Lambdaから、RDSへ

| プログラム上の日時（UTC） | RDS上の日時        |
| ------------------------- | ------------------ |
| 2021/3/25 12:00:00        | 2021/3/25 12:00:00 |

この場合、日時の値変更は発生しない。

# 原因

AWS Lambda と RDS のデフォルトのタイムゾーンが `UTC` であることと、以下2点のタイムゾーンの仕様を認知していなかったため、値の差異が発生していました。

  


## MySQLのタイムゾーン

接続先/接続元のタイムゾーンが異なる場合、絶対時刻のカラム（Timestamp型）であれば、自動で日時が変換されます（検証①のパターン）。

[11.2.2 The DATE, DATETIME, and TIMESTAMP Types](https://dev.mysql.com/doc/refman/8.0/en/datetime.html)



## ローカル実行環境のタイムゾーン

JRE の場合、標準では OS のレジストリや環境変数から、デフォルトのタイムゾーンを判別するようです。
今回、私の環境では実行環境のタイムゾーンが `Asia/Tokyo` となっていました。

[8.2 Windowsでのデフォルト・タイムゾーンの判別](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/time-zone002.html#CBBBDIGD)



# 対処方法

対処方法としては以下のように何通りかあります。

1. AWS Lambda の環境変数設定
2. MySQL のタイムゾーン設定
3. ローカル実行環境のタイムゾーン設定

今回は AWS Lambda の設定が複雑化したり、MySQLの設定を変更することを避けたかったため、
3. のローカル実行環境のタイムゾーンを指定する方法を採用します。



## 手段

ローカル実行環境のタイムゾーンを指定する方法も、下記のようにいくつかあります。

- 環境変数`JAVA_OPTIONS`に`-Duser.timezone=UTC`を設定
- プログラム単位で、`実行の構成 -> VM引数`に`-Duser.timezone=UTC`を設定
- ワークスペース単位で、`インストール済みのJRE -> デフォルトのVM引数`に
  `-Duser.timezone=UTC`を設定 



今回は3つ目、「ワークスペース単位での指定」を行います。



## 設定手順：デフォルトVM引数の設定

- `ウィンドウ -> 設定 -> Java -> インストール済みのJRE -> 編集`
![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215832/68bf49ae-23f5-c4c2-2dc2-a0cf3a4835fb.jpeg)


- `デフォルトのVM引数`に`-Duser.timezone=UTC`を設定
- `完了 -> 適用して閉じる`
  ![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215832/60cf278a-2a30-4f24-a819-475a59871131.jpeg)



# 備考


AWS Lambda や、 RDS のタイムゾーンを日本基準にする方法もありましたが、どちらもデフォルトのタイムゾーンが `UTC` だったので、プログラム側も `UTC` に寄せました。

AWS Lambda の環境変数を設定する方法はお手軽そうでした。
しかし、開発で増えゆくはずの Lambda 関数に一つ一つ環境変数を設定するのは手間だなぁというのと、
自由度が低くなりそうだなぁということで、不採用としました。
bigqueryでInvalid timestamp: 'yyyy-mm-dd hh:mm:ss.nnnnnn +00:00'出た時の対処方法


このエラーメッセージを結構見かけるのですが、どの行で発生しているのか？のエラー情報が記載されない為、対処方法にてこづりました。特にググっても対処方法が見つからず困ったので、メモ的に投稿しておきます。

※同じメッセージで別のエラーが出るパターンがあれば適宜追加していきたいと思います。


## エラーメッセージの例と対処方法

```
Query error: Invalid timestamp: '2018-05-09 10:02:52.785000 +00:00' at [7:1]
```

ぱっと見る限り、日付系で何かダメって怒られてる。
ところまではわかるのですが、日付項目をSELECT句や、WHERE句で複数箇所利用している場合、どれだよ？
となると思います。

とりあえず、SELECT句の条件、WHERE句の条件から日付を利用している部分を１個ずつコメントして原因探った結果、

以下コードが問題でした。

```sql

DATE_DIFF( DATE(table1.target_date), DATE(table2.target_date), MONTH) >= 1 
```

どうやら、このtarget_dateの中身が
`'2018-05-09 10:02:52.785000 +00:00'`
になっていて、DATE関数で変換できませんよ。

ということだったようです。

対策として、以下のようにSUBSTR関数を使って日付項目を調整すれば問題なく処理されました。

```SQL
DATE_DIFF( DATE(SUBSTR(table1.target_date, 1, 10)) , DATE(SUBSTR(table2.target_date , 1, 10)), MONTH) >= 1

```

ふたを開けてみればデータの型問題ということで、大した内容ではなかったのですが、この事例の問題点は、

- **標準のデバッカーには引っかからない為、あたかも問題ないように見えた**
- **その状態でSQLを流すと、エラーになる**
- **エラーの発生行数がわからない**

に尽きると思います。
せめてどの項目でエラーになっているのか？だけでもエラーメッセージに追加されるとありがたいところです。
【Laravel】「○○日には、todayより後の日付を指定してください。」...だと？

## 概要

LaravelのフォームリクエストでPOSTした日付情報のバリデーションに
「今日より後の日付になっているかどうか」
のルールを設定したいので、Laravelに用意されている`after`を使って

```php:app/Http/Requests/Front/SampleRequest.php
'sample_date' => 'date|after:today'
```

こう書いたんですけど、バリデーションメッセージは下のように...

![スクリーンショット 2021-03-24 16.35.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512695/15da2d23-c737-8c36-1238-3f6f6db47d47.png)

**"today**より"...（ルー大柴かい🤷‍♂️）

というわけで**today**を**今日**に変えます。

## 環境

```
$ composer -V
Composer version 2.0.8 2020-12-03 17:20:38

$ php artisan --version
Laravel Framework 8.21.0
```
## `after`のバリデーションメッセージ

```php:resources/lang/ja/validation.php
'after'                => ':attributeには、:dateより後の日付を指定してください。'
```

`:attribute`はフォームリクエストの`attributes`メソッドで設定できているけど、`:date`に`today`という文字列が入ってしまっている様子。。

## 「today」を「今日」に変える方法

僕が見つけたのはこの3つの方法です。

1. フォームリクエストで定義
2. 言語ファイルのcustomで定義
3. 言語ファイルのvaluesで定義

### 1.フォームリクエストで定義

まずはバリデーションを定義しているフォームリクエストの`messages`メソッドにこのフォームリクエスト専用のバリデーションメッセージを設定する方法です。

```php:フォームリクエストに定義
public function messages()
{
    return [
        'sample_date.after' => '○○日には、今日より後の日付を指定してください。',
    ];
}
```

### 2.言語ファイルのcustomで定義

次は言語ファイル（`resources/lang/ja/validation.php`）の`custom`で共通して使えるバリデーションメッセージを設定する方法です。

```php:言語ファイルのcustomで定義
'custom' => [
     'sample_date' => [
         'after' => '○○日には、今日より後の日付を指定してください。',
     ],
 ],
```

ちなみに言語ファイルは[こちら](https://readouble.com/laravel/6.x/ja/validation-php.html)

### 3.言語ファイルのvaluesで定義

3つ目は言語ファイル（`resources/lang/ja/validation.php`）の`values`に`:date`に当てはめる文字列を設定する方法です。

```php:言語ファイルのvaluesで定義
'values' => [
     'sample_date' => [
         'today' => '今日'
     ],
 ],
```

## 変更後のバリデーションメッセージ

![スクリーンショット 2021-03-24 22.21.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512695/867c0534-b345-cbd0-eb1b-e8e2a877e51c.png)

できました！！
脱ルー大柴！！

## まとめ

個人的に3の「言語ファイルのvaluesで定義」はパッと見コードを見ても理解しにくいかなと思ったので、1か2が良いかなと思っています。

あとはそのプロジェクトの方針によってカスタムメッセージを

- フォームリクエスト
- 言語ファイル

のどちらに追加していくのかは決めれば良いのかなと思います。

## 参考

- [ReaDouble-バリデーション](https://readouble.com/laravel/6.x/ja/validation.html)
- [Laravelの日本語化ファイルを編集し、バリデーションメッセージの:valueや:dateなどのプレースホルダーを日本語化する](https://qiita.com/MtDeity/items/4536adbf8d9c03e592ab)
【Firebase】CloudFirestoreのcollectionを消去する方法

皆さんこんにちは！

CloudFirestoreを触れて間もない方はこう思ったことはないでしょうか？？

不要なcollectionは消去したい！

結論から言うと、CloudFirestoreにはコレクションを消去するメソッドは**存在しません**！！

公式のドキュメントでも以下のように書いてあります。

>Cloud Firestore でコレクション全体またはサブコレクションを削除するには、コレクションまたはサブコレクション内のすべてのドキュメントを取得して削除します。大きなコレクションがある場合は、メモリ不足エラーを避けるため、小さなバッチに分けてドキュメントを削除することをおすすめします。コレクション全体またはサブコレクションが削除されるまで、このプロセスを繰り返します。

では、どのようにしてコレクションを消去するのか。

それをお教えします！

まず、ドキュメントを消去する方法はこんな感じでやります。

```javascript
db.collection('example').doc('example_1').delete()
```

```javascript
// これはできない
db.collection('example').delete()
```

>コレクションまたはサブコレクション内のすべてのドキュメントを取得して削除します。

公式ドキュメントにも書いてある通り、コレクションを消去するにはドキュメントをすべて消去してあげるしかないんです。

でも``db.collection('example').doc('example_1').delete()``でドキュメントを消去できるなら、ドキュメントをすべて取得して一つ一つ消去してあげればいい話。

```javascript
db.collection('example').get().then((snapshots) => {
  const docs = snapshots.docs
  docs.forEach(async (doc) => {
    // ドキュメントのid（名前）を取得
    const id = doc.id
    await db.collection('example').doc(id).delete()
  })
})
```

``get()``で全てのデータを取得し、``forEach``で一つ一つのドキュメントを回す。

このようにしてコレクションを消去することができます！

ちなみにデータが存在しな場合、処理を行っても無駄なので以下のようにして処理を終了してください。

```javascript
// 空の場合
if(snapshots.empty) {
  return
}
```

いかがだったでしょうか？

CloudFirestoreは汎用性が高いので非常に便利です。

公式のドキュメントも非常に分かりやすいので、誰かが作った記事を見るだけでなくしっかり公式のドキュメントも読みましょう！

以上、「【Firebase】CloudFirestoreのcollectionを消去する方法」でした！

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

あと、最近「ココナラ」で環境構築のお手伝いをするサービスを始めました。

気になる方はぜひ一度ご相談ください！

Thank you for reading
Python の HTTPS リクエストを Fiddler でキャプチャしようとしてエラーになるときの対処法

#何が起きたのか
Python の Requests ライブラリが発行している HTTPS POST リクエストを Fiddler でキャプチャして中身を見ようとしたら "check_hostname requires server_hostname" というエラーで例外を吐いてアプリが落ちてしまった。

#何をしようとしてたのか
Azure の Cognitive Services の Long Audio API の REST API の仕様がイマイチわからなかったので、ドキュメント中にある Python のコードの動きからリバースエンジニアリングを仕掛けようとしてた。

Long Audio API
https://docs.microsoft.com/ja-jp/azure/cognitive-services/speech-service/long-audio-api

#見立て
Fiddler が HTTPS の終端をしたうえで通信内容をキャプチャ、その後再暗号化をして Python に通信を受け渡すという（中間者攻撃的な）プロキシの働きをしているのを、Python の証明書もしくはホスト名の検証機能が検出しているのだろうなぁと考えた。

#対応策検討
"check_hostname requires server_hostname proxy" で検索すると、真っ先に 10 日前に投稿された StackOverflow の以下の回答が見つかった。

Why requests raise this exception “check_hostname requires server_hostname”?
https://stackoverflow.com/questions/66642705/why-requests-raise-this-exception-check-hostname-requires-server-hostname

それによれば、urllib3 ライブラリのバグらしい。
以下コマンドでバグってないバージョンを入れれば直るとのこと。

```shell
pip install urllib3==1.25.8
```

#やってみた
Python 実行時に以下の警告が出るものの、無事に Fiddler で通信内容のキャプチャに成功！

```shell
host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
```

![スクリーンショット 2021-03-26 180637-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199379/937eeb69-0b94-f829-7f7a-5acfd06f24ee.png)

何度やっても上手くいかなかった REST での呼び出し、音声合成用の設定と原文の入力ファイルを multipart で送れば良かったのね、ということが判明。

#まとめ
新しいバグに関しては英語のユーザーフォーラムをあたるのって結構大事。
AWS認定デベロッパーアソシエイト(DVA)に合格するまでの振り返り

# はじめに

2021年2月にAWS実務経験無しで、AWS認定デベロッパーアソシエイトに合格することができました。これまでのCLF・SAAを含むAWS認定資格関連の学習内容について、振り返りの記録を残しておこうと思います。
AWS認定資格の合格体験記系の記事は何番煎じになるか分からないほど多くありますが、自分の記事がこれから受験する方の一人にでも参考になれば幸いです。

※ CLF：AWS認定クラウドプラクティショナー
※ SAA：AWS認定ソリューションアーキテクトアソシエイト

# AWS認定試験の受験動機

- AWSに実務で携わる機会はなかったが、社内でクラウド学習を推奨していた
- AWSがどんなものなのか技術的興味があり、一通り触れてみたいと思った
- Web系エンジニアの転職を検討しており、インフラ系知識を押さえておきたかった

# 資格取得記録
CLF ⇒ SAA ⇒ DVAの順に資格は取得しました。各資格の取得記録を表にまとめます。

| 資格 | 取得年月 | 学習期間(時間) | 点数 |
|:-|:-|:-|:-|
| CLF | 2019年7月 | 10日 (15h)   | 741点 (ギリギリ合格...！) |
| SAA | 2020年9月 | 2ヶ月半 (60h)   | 739点 (ギリギリ合格...！) |
| DVA | 2021年2月 | 1ヶ月半 (50h) | 904点 (＼(^o^)／)|

# 学習教材・方法 / 受験所感・振り返り

### CLF学習教材・方法 / 受験所感・振り返り

<details><summary>**学習教材・方法**</summary><div>

- [【書籍】AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/dp/B07QX45RXM)  
  クラウド基礎概念・AWSサービス基本知識の内容  
- AWSをチュートリアル通りに少し体験  
  アカウント作成・EC2起動・SSH接続といった最低限のレベルを触れた程度
</div></details>

**受験所感・振り返り**
AWSサービスには少し触る程度で、10日程度書籍で学習するのみでしたが、それだけで試験範囲をおおよそカバーできていた。ただ合格ラインぎりぎりだったので、今振り返るとUdemyの模擬試験問題集で試験の雰囲気を掴んでおくと良かったと思う。
→ 参考:[【Udemy】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/course/aws-4260/)

### SAA学習教材・方法 / 受験所感・振り返り

<details><summary>**学習教材・方法**</summary><div>

1. [【書籍】AWS認定資格試験テキスト　AWS認定ソリューションアーキテクト - アソシエイト](https://www.amazon.co.jp/dp/B08MVXRFFN)
2. [【書籍】この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集](https://www.amazon.co.jp/dp/B07VFFX6V1)  
    1・2ともにAWSサービス全般を広く網羅して解説した内容
3. [【書籍】Amazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/dp/4296105442)  
4. [【Udemy】AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)  
    3・4ともにインフラ初心者でも理解できるように、AWS上でのインフラ環境構築(WordPress構築等)を分かりやすく解説していて参考になった。個人的にはUdemyの動画講座の方が頭に入りやすかった。
5. [【Udemy】【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問） ](https://www.udemy.com/course/aws-knan/)  
    Udemyの模擬試験問題集。試験前に2回分解いて、正答率は55%程度だった。本番よりは難しい印象。
</div></details>

**受験所感・振り返り**
学習期間の2ヶ月半の間、だらだらと勉強を進め、また色々な教材に中途半端に手を出してしまった。その結果、十分に準備をできないまま受験日を迎えてしまい、合格ラインぎりぎりでの資格取得となった。合格ラインには一応達していたので、上に挙げた学習教材の1・4・5だけを集中的に進めていれば、余裕をもって合格レベルに達していたと思う。
(今振り返ると、1 ⇔ 2・3 ⇔ 4の学習教材は内容がおおよそ被っていたので、学習効率は悪かったです。)

### DVA学習教材・方法 / 受験所感・振り返り

<details><summary>**学習教材・方法**</summary><div>

1. [【Udemy】Ultimate AWS Certified Developer Associate 2021 - NEW!](https://www.udemy.com/course/aws-certified-developer-associate-dva-c01/)  
    DVA試験対策で有名なUdemy講座(全編英語)。講座は全30時間で、各種サービス説明＋ハンズオン講座により試験範囲を網羅している。字幕ありで発音は聞きやすかったので、英語の苦手意識が強くなければやっていけるレベルかと思います。
2. [【Udemy】AWS 認定デベロッパー アソシエイト模擬試験問題集（5回分325問）](https://www.udemy.com/course/aws-31955/)  
    Udemyの模擬試験問題集。試験前に3回分解いて、正答率は75%程度だった。SAAと同様に本番より難しい印象。
</div></details>

**受験所感・振り返り**
SAA取得済だったこともありますが、Udemy講座が本当に分かりやすく、おかげで904点という高得点で合格することができました。DVA対策は上記のUdemy講座2つ(計3000円程度)に取り組めば、十分だと思いました。

# おわりに

AWS認定資格の取得を通して、AWSサービスの基本的な知識・技術を網羅的に理解することができました。またインフラ系の知識・技術への理解を深めることもできました。今後はAWSを業務で利用することも増えていきそうなので、業務を通してAWSの実践力を身に着けていきたいと思います。
余裕があれば、SysOpsアドミニストレーターやDevOpsエンジニアのAWS資格取得も目指していこうと思います。
【Ruby】ruby --version と rbenv versionで表示されるバージョンが異なる時の対処法（Unknown ruby interpreter version）

rbenvを使ってrubyのバージョンを切り替えたい時に、ruby --version と rbenv versionで表示されるバージョンが異なってしまう時の対処法。

##症状
rubyは2.7.0なのに、rbenvは3.0.0を指している。（3.0.0に合わせたい）

```
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]
```

```
$ rbenv version
3.0.0 (set by /Users/.rbenv/version)
```

<br>
##原因
.bash_profileでrbenvの設定をしている（[設定方法](https://qiita.com/yuta-38/items/00a24e9f5a7b5e421fbb#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%8C%E5%88%87%E3%82%8A%E6%9B%BF%E3%82%8F%E3%82%89%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95
)）が、.bashrcでrubyの設定が残っている。

```:.bashrc
# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
export PATH="$PATH:$HOME/.rvm/bin"
```

↓ RVMのパスをコメントアウトして再度読み込む。

```
#vimで開く
$ vi ~/.bashrc
```

```:.bashrc（コメントアウト）
# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
# export PATH="$PATH:$HOME/.rvm/bin"
```

```
#リロード
$ source ~/.bashrc
```

以上で設定が完了。

```
$ ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin19]
```

`ruby -v`でもrbenvと同じバージョンが指定できた。



<br>
**▼（参考）.bash_profileの記述**

```:.bash_profile
export PATH="$PATH:$HOME/.rbenv/bin"
eval "$(rbenv init -)"
```


<br>
##Unknown ruby interpreter versionの対処法
別のプロジェクトのディレクトリに移動すると以下のようなエラーが出る場合がある。

>$ cd hoge
Unknown ruby interpreter version (do not know how to handle): バージョン

これは、上記処理結果が反映されておらず`ruby -v`と`rbenv version`で指定しているバージョンが違うために発生する。

rbenvの設定をbash_profileに記述しているため、再読み込みが必要。

```
#変更が反映されていない
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]

#再読み込み
$ source ~/.bash_profile

$ ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin19]
```

以上で完了。
Django本番環境(heroku)でcssが文字化けして読み込まれなかったのをなんとか直した

#バグの内容
Djangoで作ったアプリケーションをherokuでデプロイしたらブラウザによってはcssが全く読み込まれなかった。
cssが読み込まれたブラウザ->MacOS版Chrome,Android版Chrome
読み込まれなかったブラウザ->Mac版Safari,ios版Safari,ios版Chrome
#バグの原因
cssが読み込まれなかったブラウザで開発ツールを用い、htmlファイルのlinkタグに貼ってあるcssファイルの中身を見ると文字化けしていた。
heroku run bashで本番環境に入り、collectstaticでできたフォルダ内を覗くとcssファイルが圧縮されたcss.gzファイルがあった。
試しにcss.gzファイルの中身をcatコマンド見てみると文字化けしており、開発ツールで見た文字化けと完全に一致していた。
このことからhtmlファイルのリンクが解凍前のcss.gzファイルにつながっていることが原因だと考えられる。
#対処方法
解凍後のcss.gzファイルにリンクを繋げられたら一番よかったのだがやり方がわからなかったので(知ってる人教えてもらえたら幸いです!)そもそもgzファイルを生成しない設定にした。
コードは

```python:settings.py
django_heroku.settings(locals(),staticfiles=False) 
```

このようにdjango_heroku.settings()関数の第二引数にstaticfiles=Falseを追加するだけでいい。
これでgzファイルが作られなくなります。
そもそもgzファイルがなんのためにあるのかよくわからないのでデメリットは感じられません。
通信速度が早くなるのかな？
とりあえず僕の環境ではこれで改善したので同じバグが起きてる人のお役に立てれば幸いです。
railsのroutingメモ書き

railsのroutingが今までやったことがない系統で戸惑ったのでその時のメモ書きです。

# routingのパス指定
railsのroutingはroutes.rbというファイルに書きます。

具体的には

```ruby
Rails.application.routes.draw do
  namespace :V1 do
    resources :service
  end
end
```

といった形で、構造とAPIのパスを一致させるように書きます。
`resouces`にはコントローラーの名前をシンボル型で渡すことでcontrollerとパスを結びつけます。

今回の場合では パスは `V1/service` と結びつけられAPIが生成されます

## 特定のメソッドのみ適用する
ただ、上記の場合だとパスに GET,POST,DELETEなどrailsがデフォルトで存在するメソッドのものが全て生成されてしまいます。
GET,POSTのみ指定する場合は以下のように書きます。

```ruby
Rails.application.routes.draw do
  namespace :V1 do
    resources :service, only:[:index]
  end
end
```

これでGETのみが生成され、contollerのindexメソッドのみが実際のAPIパスと結びつけられました。

## パスに割り当てらるパラメーターの上書き
例えば以下の書き方だと

```ruby
Rails.application.routes.draw do
  namespace :V1 do
    resources :service, only:[:destroy]
  end
end
```

DELETEメソッドのAPIが生成されて、
`V1/service/:id`
というパスと結びつけられました。

ただ、書き方にはよっては:idはしっくりこないケースがあるのでこれを書き換えたい場合はこう書きます。


```ruby
Rails.application.routes.draw do
  namespace :V1 do
    resources :service, param: :user_id, only:[:destroy]
  end
end
```

これで、
`V1/service/:user_id`
になりました。

#最後に
これらの他にも色々機能はありますが、今回これまで
timeタグのdatatime属性は期間を示すこともできる（公式ドキュメントを確認する大切さを感じた話）

## はじめに
timeタグ使ってますか。
私はブログやコーポレートサイトを作っていた時期は時々使用していましたが、最近では使用頻度が低いタグのひとつです。

MDNには下記の通り記載されています。

>HTML の <time> 要素は、特定の時の区間を表します。 datetime 属性を使用して、機械可読な形式の日付を記述することができ、検索エンジンの結果を改善したりリマインダーなどの独自機能に使用したりすることができます。

「うん、うん、知ってる、知ってる。」と読んでいたら、すぐ下にこんな記述がありました。

>次のうちの一つを表します。

> - 24時間制の時刻
- グレゴリオ暦の正確な日付 (時刻やタイムゾーンを伴うことも可能)
- 妥当な期間

https://developer.mozilla.org/ja/docs/Web/HTML/Element/time

「妥当な期間とは？？？」となりました。

## 知っていたtimeタグ使い方
timeタグを使用して日本語の○年○月○日をマークアップする場合、datatime属性にマシンリーダブルな値を指定する必要があります。
例えばこんな感じです。

```html
<time datatime="2021-03-26">2021年3月26日</time>
```

## timeタグのdatatime属性は期間を示すこともできる
結論から示せば下記のように期間を示すことができます。

```html
<time datatime="P4D">4日間</time>
<time datatime="PT4H18M3S">4時間18分3秒</time>
```
Pは期間を表すために必須で、datatime属性の値の先頭に指定します。
Tはオプショナルで、H、M、Sなどの時間の単位を使用する場合に使用します。
（PはPeriod、Tはtimeの略と思われる）
詳細な仕様は下記にまとめられています。

https://www.w3.org/TR/2014/REC-html5-20141028/infrastructure.html#valid-duration-string

## さいごに
timeタグ自体は使っていましたが、期間を示すこともできるは知りませんでした。
きっと他にもタグ自体は知っているけど、把握できていない使い方があるタグがありそうです。

ライトに読める記事だけでなく**公式やそれに準じたドキュメントを確認する大切さ**を改めて感じました。
色々と学び直していこうと思います。
ActiveRecordで今日以前の日付を弾くバリデーションを簡潔に書く

## 概要
Railsで日付をもったテーブルを追加してそのテーブルに今日以前の日付を入れられないようにしたかったのですが、検索しても専用のメソッドを追加するという記事しか見つからなかっため、それ以外の実装は`validates`で簡潔できないか調べたらできたというお話しです。

※終端のなしRangeを使っているのでバージョン2.6以降ののRubyでないと動作しません。
確認環境はRuby 2.7.2, Ruby on Rails 6.0.3.4です。

## 実装

```ruby
class Hoge < ApplicationRecord
  validates :some_date, inclusion: { in: ->(_record) { Time.current.tomorrow.to_date.. }, message: 'に今日以前の日は登録できません' }
end
```

`RuboCop`を導入している人はコピペすると`Metrics/LineLength`に引っかかる可能性があるのでいい感じに改行して下さい。
## まとめ
`inclusion`で`lambda`使っているあたりが肝でしょうか(`lambda`でないとRangeが動的にできないため)。
是非コピペして使って下さい。
Crystal(1.0.0)をMacにインストールしてみた

## 環境
macOS Catalina 10.15.7
エディタ VScode

## Crystalとは

>Rubyに似た構文を使用し、変数の型やメソッド引数を指定する必要がなく、ネイティブコードへのコンパイルが可能なオープンソースのプログラミング言語

　Crystalの特徴は、Rubyと同じような構文でありながら、コンパイラによって高速なネイティブバイナリを生成出来る点にあるとのことです。これにより、Rubyの課題でもあった「処理速度の遅さ」をカバーすることが可能になります。

https://codezine.jp/article/detail/13820

https://zenn.dev/arcage/articles/crystal_introduce

## Crystalのインストール方法

https://ja.crystal-lang.org/

　上記URLが日本語の公式リファレンスになります。クリックすると下の画像のような画面に遷移するので、「INSTALL」ボタンをクリックします。

[![Image from Gyazo](https://i.gyazo.com/d6c89ad18082dfbb125288c54152ad88.png)](https://gyazo.com/d6c89ad18082dfbb125288c54152ad88)

　すると、下の画像のように使用するプラットフォームが並べられた画面に遷移するので、ここから自身のプラットフォームを選びます。今回はmacOS版を選択します。

[![Image from Gyazo](https://i.gyazo.com/c7e41fb3e714c6dbafe38a8733d009ec.png)](https://gyazo.com/c7e41fb3e714c6dbafe38a8733d009ec)

　すると、インストール方法の説明ページに遷移するので、指定されたコマンドをターミナルで実行します。

[![Image from Gyazo](https://i.gyazo.com/13e7747b8536bd98cf2893f2281cf536.png)](https://gyazo.com/13e7747b8536bd98cf2893f2281cf536)

　CrystalのインストールにはHomebrewを使用します。また、上記2つのコマンドは入力してから完了するまでにどちらも数分かかりましたので、リファレンスを読みながら気長に待ちましょう。

　どちらも完了したらターミナル上で`crystal -v`を実行し、以下のような結果が表示されたら成功です。

[![Image from Gyazo](https://i.gyazo.com/264ba19564ab7cb23095872a718c9461.png)](https://gyazo.com/264ba19564ab7cb23095872a718c9461)

## 結果
　これでCrystalのインストールが完了致しました。
　まだまだこれから発展していく段階の言語かと思いますので、これから少しずつ練習していきたいと思います。
Logic忘備録_if_return


ifがtrueになったら処理を返す（returnによって計算処理を中断して戻ることができる。）

```IfReturn.java
public static void main(String[] args) {
		calculatePrice(3,100);
		System.out.println("計算の終わり");
		calculatePrice(-1,200);
		System.out.println("計算の終わり");

	}
	private static void calculatePrice(int number, int price) {
		if(number < 0) {
			System.out.println("個数の数値:"+number+"がマイナスです");
			return;//ここで処理を終わらせて処理を返している
		}
		System.out.println("果物1つの値段:" + price/number);
	}
```
CSS「>」の意味

#「>」の意味
直接の子要素のみを指定する時に使う

~~~css
.box > h1 {
   color: red;
}
~~~

この例ではboxクラスに含まれるh1要素を指定している。

#参考
[CSSセレクタの種類を理解する。+ (プラス)、> (不等号)、疑似クラス、疑似要素、他。 | WWWクリエイターズ](https://www-creators.com/archives/1356)
CSVファイルから特定列の値だけを抽出したい


業務上、列数が膨大なCSVを扱うことがあり、
そのうちいくつかの列の値だけをちょこっと確認したい・・と思うことが稀によくあります。

必要な列だけを抽出して扱えるようになれば私が喜ぶぞォ～！！と思い、
コマンドラインで動くJavaプログラムを作ってみました。


#やりたいこと
こんなCSVがあった場合、

```TeX:game.csv
1,Splatoon 2,Nintendo,Nintendo Switch,2017年7月21日
2,Yakuza: Like a Dragon,SEGA,PlayStation 4,2020年1月16日
3,Undertale,Toby Fox,PlayStation 4,2015年9月15日
4,Fire Emblem: Three Houses,Nintendo,Nintendo Switch,2019年7月26日
5,Ghost of Tsushima,Sony,PlayStation 4,2020年7月17日
````

ある時は、↓こんな感じで2列目と3列目を取得したい。

```
Splatoon 2,Nintendo
Yakuza: Like a Dragon,SEGA
Undertale,Toby Fox
Fire Emblem: Three Houses,Nintendo
Ghost of Tsushima,Sony
````

でも場合によっては、↓こんな感じに1列目・2列目・5列目を取得したい。

```
1,Splatoon 2,2017年7月21日
2,Yakuza: Like a Dragon,2020年1月16日
3,Undertale,2015年9月15日
4,Fire Emblem: Three Houses,2019年7月26日
5,Ghost of Tsushima,2020年7月17日
````

つまり・・**必要に応じて指定した列の値だけを抽出した～い！**


#つくった
つくりました。

```java:GetSpecifiedColumn.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 指定したCSVから特定列の値のみを抽出します.
 * 抽出結果のファイルは「【抽出済】対象ファイル名」の名前で同階層に出力されます.
 *
 * 引数１：対象ファイル
 * 引数２：取得したい列番号（0始まり、カンマ区切りで複数指定が可能）
 */
public class GetSpecifiedColumn{

	public static void main(String[] args){

		// コマンドライン引数を取得.
		String path = null;
		List<String> colList = new ArrayList<String>();

		if (args.length == 2){
			path = args[0];
			colList = new ArrayList<String>(Arrays.asList(args[1].split(",")));
		} else {
			System.out.println("引数間違ってるよ！");
			return;
		}

		try{
			// 入力ファイル.
			File inFile = new File(path);
			BufferedReader br = new BufferedReader(new FileReader(inFile));

			// 出力ファイル.
			File outFile = new File("【抽出済】"+ path);
			PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(outFile)));

			// 列番号の最大値（最終列の番号）を取得.
			String lastCol = colList.get(colList.size() - 1);

			String line = null;
			// CSVファイルを1行毎に読み込む.
			while( (line = br.readLine()) != null) {
				String[] strList = line.split(",",0); // 行データを配列化.

				// 特定列だけを出力.
				for (String col : colList) {
					if (!col.equals(lastCol)) {
						// 最終列でない場合は、改行なし・カンマありで出力.
						pw.print(strList[Integer.parseInt(col)]);
						pw.print(",");
					} else {
						// 最終列の場合は、改行あり・カンマなしで出力.
						pw.println(strList[Integer.parseInt(col)]);
					}
				}
			}
			br.close();
			pw.close();

		} catch(IOException e) {
			System.out.println(e);
		}

		System.out.println("処理完了！YATTA！");
	}
}

```

#うごかす

コンパイル

```
javac -encoding UTF-8 GetSpecifiedColumn.java
```

実行

```
java GetSpecifiedColumn game.csv 0,1,4
```


実行結果

```TeX:【抽出済】game.csv
1,Splatoon 2,2017年7月21日
2,Yakuza: Like a Dragon,2020年1月16日
3,Undertale,2015年9月15日
4,Fire Emblem: Three Houses,2019年7月26日
5,Ghost of Tsushima,2020年7月17日
````

YATTA！

その後、無事業務データでも問題なく動作することを確認しました。わ～い！

#補足
個人用途のため細々した制御は入れていません！ご注意ください。
※対象CSVのデータ部に「,（カンマ）」が含まれているとうまく動かない。存在しないCSVファイル名や、対象CSVに存在しない列番号を指定すると例外になるなど。
VScodeを入れることに苦闘している人へ

vscodeを入れようと思ったが、なかなかうまくいかないということがあったので、簡単に手順を示します。

（Ubuntu対応）

・その１
　snapパッケージを利用する方法をとります。ということでインストールします。
　
　sudo snap install --classic code

・その２
　起動のためにパスを入れる。
　
　/snap/bin/code

完了

・バージョンを調べるとき

　/snap/bin/code --version
　

以上です。ありがとうございました。
AWS Lambdaのマルチアカウントデプロイ

クマ松です。

「テスト用／本番用とで環境毎にAWSアカウントを分けてはいるけれども、利用しているLambdaは同じ」
という場合、テストしたLambdaをコピペして本番環境にデプロイをしたくはないですよね。

ですので、**テスト環境のCodeCommitへのマージイベント**をトリガーに**本番環境にLambdaをデプロイする**構成のCodePipelineを作りました。
ほぼ全てCloudFormationで実現していますので、お手元のAWSアカウントで試してみてください。

## 想定する環境

- テスト環境用AWSアカウントが1つ
- 本番環境用AWSアカウントが複数
- テスト環境と本番環境とで同じLambdaを使っている


## 実現したいこと
- テスト環境のLambdaを本番環境にもデプロイしたい
- テスト環境のマージイベントをトリガーに、本番環境のCodePipelineを起動したい


## ブログ
設計方針やCloudFormationのテンプレートはブログに掲載しています。
[Lambdaのマルチアカウントデプロイ 設計編](https://cloud.bigtreetc.com/column/cloud-multi-account-lambda-deploy-design/)
[Lambdaのマルチアカウントデプロイ 構築編](https://cloud.bigtreetc.com/column/cloud-multi-account-lambda-deploy-develop/)
【Ansible】自動化2.0セミナーまとめ

<table>
	<tr>
		<th>切り口</th>
		<th>内容</th>
		<th>掲載日</th>
		<th>URL</th>
	</tr>
	<tr>
		<th>Automation aduption programとは</th>
		<td>トレーニングプログラム。企業や組織に「自律的な自動化組織」を立ち上げ、ITインフラ業務の抜本的な効率化を支援するプログラム。技術、プロセス、文化を回し、自動化2.0を実現する。</td>
		<td>2021/3/24</td>
		<td>https://events.redhat.com/profile/form/index.cfm?PKformID=0x342001abcd&amp;sc_cid=7013a000003BkFPAA0#hear-from-the-experts</td>
	</tr>
	<tr>
		<th>開発手法について</th>
		<td>実在する課題をベースに開発と改善のサイクルを小さく回す。課題の抽出→課題の明確化、優先順位付け⇒アプローチする課題の決定⇒実装⇒実装の評価⇒目的・ゴールの整理⇒課題の抽出</td>
		<td>2021/3/24</td>
		<td>https://events.redhat.com/profile/form/index.cfm?PKformID=0x342001abcd&amp;sc_cid=7013a000003BkFPAA0#hear-from-the-experts</td>
	</tr>
	<tr>
		<th>このプログラムに必要なこと</th>
		<td>チームのマインドチェンジ。道の手法への抵抗は多いので、正しい使い方を「みて、学習し、経験し、間違いがあれば指摘してもらえる」状態になれば自律的に利活用を始める。</td>
	</tr>
	<tr>
		<th></th>
		<td>2021/3/24</td>
		<td>https://events.redhat.com/profile/form/index.cfm?PKformID=0x342001abcd&amp;sc_cid=7013a000003BkFPAA0#hear-from-the-experts</td>
	</tr>
	<tr>
		<th>Automation aduption programが目指す自動化2.0の本質</th>
		<td>作業工程において、組織間の流れの改善に取り組んでいる状態。学習する組織への移行。正しいマインドセットをすることで、初期の導入時のインパクトだけでなく、継続して自動化を図れる組織にする。</td>
		<td>2021/3/24</td>
		<td>https://events.redhat.com/profile/form/index.cfm?PKformID=0x342001abcd&amp;sc_cid=7013a000003BkFPAA0#hear-from-the-experts</td>
	</tr>

	<tr>
		<th>自動化を広げる具体的な取り組み</th>
		<td>社内コミュニティを主催。勉強会の開催。Ansibleを使い始める人たちのためのトレーニング素材の提供。少人数から始め、少しずつ普及していく。</td>
		<td>2021/3/24</td>
		<td>https://events.redhat.com/profile/form/index.cfm?PKformID=0x342001abcd&amp;sc_cid=7013a000003BkFPAA0#hear-from-the-experts</td>
	</tr>
</table>
モジュールとは！

基本情報技術者試験の過去問で勉強した内容についてです。

```
<モジュール分割を行うときの方法として，モジュール結合度を最も弱くできるものはどれか。>
①一つのモジュールで，できるだけ多くの機能を実現する。
②二つのモジュール間で必要なデータ項目だけを引数として渡す。
③他のモジュールとデータ項目を共有するためにグローバルな領域を使用する。
④他のモジュールを呼び出すときに，呼び出されたモジュールの論理を制御するための引数を渡す。
```

問題文は上記のようになります。
では、分解して考えていきましょう😉

1)そもそもモジュールとは
これは、交換可能な構成要素のことです。コンポーネントとも言います。
ざっくりしすぎたので、詳しく説明していきます。
主に、モジュールはハードウエアとソフトウェアで使われます。
①ハードウエアとは
目に見える形あるもののことをいいます。主に、パソコン・モニター、キーボード、マウスなどがあります。
パソコンの主要部品がモジュール化されます。あとから部品が交換できるようにされています。

②ソフトウェアとは
目に見えない形のないものです。これは、主にosソフトや、計算ソフト、ゲームソフトを指します。
あとから別の開発者が追加開発できるようにモジュールを組み込めるようになインターフェースが用意されています。

2)モジュール結合度とは
モジュールの独立性を表すものです。モジュールの結合度が低いほどいいとされています。
なぜかというと、他のモジュールの実装を気にせずに開発することができるためです。
1つのモジュールを変更しても他のモジュールに影響がなく、またそれを再利用することができるのが理想的とされています！

モジュール結合度は以下のようになります。

```
①データ結合　▶データ項目を引数として受け渡すモジュール
②スタンプ結合　▶データ構造を引数として受け渡すモジュール
③制御結合　▶他のモジュールを制御するために制御パラメータを受け渡すモジュール
④外部結合　▶外部宣言した共通のデータを受け渡すモジュール
⑤共通結合　▶外部宣言した共通のデータ構造を受け渡すモジュール
⑥内容結合　▶他のモジュールのデータを参照するモジュール
```
上記の中で最も、①と②の独立性が高いのが結合度が弱いとされています。


問題に戻ると、答えは②になるかなと思います！！👍