OmniAICreator/Qiita-1.07M huggingface dataset:
cscの作法 その222

# 概要
cscの作法、調べてみた。
秘密鍵xmlファイルを読み込んで、平文を暗号化、復号してみた。

# サンプルコード

```
using System;
using System.IO;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Text;

	class test0 {
		static void Main() {
			string encryptWord = "hogehoge2";
			var encByte = Encoding.Unicode.GetBytes(encryptWord);
			Console.WriteLine("original: " + Encoding.Unicode.GetString(encByte));
			var privateKey = File.ReadAllText("privatekey0.xml");
			byte[] encryptedByte;
			using (RSA encRsa = RSA.Create())
			{
				encRsa.FromXmlString(privateKey);
				//encryptedByte = encRsa.Encrypt(encByte, RSAEncryptionPadding.Pkcs1);
				encryptedByte = encRsa.Encrypt(encByte, RSAEncryptionPadding.OaepSHA1);
			}
			Console.WriteLine("encrypted: " + Convert.ToBase64String(encryptedByte));
			byte[] decryptedByte;
			using (RSA decRsa = RSA.Create())
			{
				decRsa.FromXmlString(privateKey);
				//decryptedByte = decRsa.Decrypt(encryptedByte, RSAEncryptionPadding.Pkcs1);
				decryptedByte = decRsa.Decrypt(encryptedByte, RSAEncryptionPadding.OaepSHA1);
			}
			var decryptedString = Encoding.Unicode.GetString(decryptedByte);
			Console.WriteLine("Decrypt: " + decryptedString);
			Console.WriteLine("ok");
		}
	}

```

# 実行結果

```
>ras1
original: hogehoge2
encrypted: jTADHI2k148RoYao7JyPRJ9rHanrbPskm1pHx9Vt6iTfVq5xfvzwmCzDKMvMgiRBS+7UONWo+fywnX4pjMYvBmRMQWJ0mpJOCCqRluSynqDUT5hWlMnZs9ozTyOnHYcO64Epu/R4TScUffa3ySifdpK8IsEbPp+Ae5npWgr6oL1Uhh9sMiamDRBxuXcn7X51TorUpgat/hWNwxe0XPh8eJqVedmQjsFVng7lapg5lbgPL04XRboVZMhupZeq+510b6hro3auotqoKQ/N7+eSdgz7Uh3+zBn9L3J5xmTqwCSCq0b/crg1egHqholFOWzbTD0xgSAgOEs9d0c498HCzK+i64Q3G1GTKZbxfNm6QYvzthYmAXJ5ed4LynTg3zYyn+1/jMUC5j2ZbI2DmNgTW3nGgwr2erRf2hA36hWT4PqBVtm8EqT/9CElf/8riY0Dkl/H0w58a0KG81U5kpsOJ2CQsIg2b9ltWZf9vmbYG5lkOyMXD4F4xjWc5PchmLIiH+bxdvO8Hmbej+fcOt8TsjZufuX8SzFMlMJJUyMhwbbhL+kG8Nd5X0lMPjw3uKmnYymxYXS2DLGFI2bzRpSlT8fTGqCk2FWg1X5q5dzmu5xJeZIZ1Ib6riWEq2mMIRE8HDFMAqnt0bwXqNoZ+GhqnGwpv1WzKYwubbQDHGzMirk=
Decrypt: hogehoge2
ok

```


以上。
Databricks SQLサーバレスがAWSで利用できるようになりました

[Databricks SQL Serverless Now Available on AWS \- The Databricks Blog](https://databricks.com/blog/2022/06/28/databricks-sql-serverless-now-available-on-aws.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# インフラストラクチャではなくインサイトにフォーカス

本日のData + AIサミットにおいて、[Databricks SQL](https://databricks.com/jp/product/databricks-sql)(DBSQL)のサーバレスコンピュートがAWSでパブリックプレビューになったことを発表できて嬉しく思っています。DB SQLサーバレスを用いることで、レイクハウスでデータウェアハウスの作業を容易にスタートできるようになります。サーバレスを用いることで、時間を解放し、コストを引き下げ、そして、インフラストラクチャの管理ではなくあなたのビジネスに最大の価値をもたらすことにフォーカスできるようになります。

# 低コスト、パフォーマンスの改善のためのDatabricks SQLサーバレス

[Databricks SQL Serverless](https://qiita.com/taka_yayoi/items/2aef9099adcf146def91)は、お客さまが直面している計算資源、管理、インフラストラクチャのコストに関する課題の解決に役立ちます。

- **インスタントかつ柔軟**: サーバレスコンピュートは、あなたのニーズに合わせてすぐに利用できスケールする、真に弾力性のある常時稼働の環境を提供します。アイドル時間の課金を心配することなしに、シンプルな使用量ベースの課金によるメリットを得ることができます。クエリーを実行できるようになるまでクラスターを待つ必要がなくなることや、使用量のスパイクに対応するためにリソースを過剰に配備することがなくなることを想像してみてください。Databricks SQLサーバレスは、あなたが実行するいかなるワークロードに対応するために動的に拡大、縮退します。
- **管理のオーバーヘッドの削減**: サーバレスはDBSQLを完全なマネージドサービスにし、キャパシティ管理、クラスターのパッチ、アップグレード、パフォーマンスの最適化が不要となります。あなたはデータとデータに含まれる洞察にのみフォーカスできるようになります。 さらに、シンプルな課金モデルは、使用量に基づくコストを確認するための請求書が一つのみであることを意味します。
- **インフラストラクチャコストの低減**: あなたがリソースを必要とした際、内部ではサーバレスコンピュートプラットフォームは適切な計算リソースを提供し、スケールさせるために機械学習アルゴリズムを活用します。これによって、手動でクラスターをシャットダウンすることなしに、劇的にコストを削減することが可能となります。Scribdのようなお客様は、サーバレスを導入することで自身のSQLウェアハウスの利用率を向上し、インフラストラクチャのコストを劇的に削減できることを発見しました。

> *「我々のアナリストによって使用されるBIツールを強化するためにDatabicks SQLを活用しています。Databricks SQLサーバレスを用いることで、我々のインフラストラクチャをより効率的なものにするとともに、Databricks SQLのパワーを活用できています。サーバレスを確認してみると、インフラストラクチャのコストを3倍削減できていることがわかったので、さらに多くのデータパイプラインにDatabricks SQLサーバレスをインテグレーションしています。」– R Tyler Croy, Director of Platform Engineering, Scribd*

実際、我々の内部テストにおいて、Databricks SQLサーバレスが従来のデータウェアハウスと比較してベストなコストパフォーマンスを示していることがわかりました。
![](https://databricks.com/wp-content/uploads/2022/06/image3.png)
*ソース - 2022 Cloud Data Warehouse Benchmark Report; Databricks research*

サーバレスプラットフォームにおいては、blobストレージに対する[プライベートネットワーク接続](https://qiita.com/taka_yayoi/items/c6bdbb6452f6a0895961)、皆様の組織のガバナンスコントロールを維持しつつ、機微あるいはプロダクションのワークロードを実行できるようにする、格納データの暗号化のための[顧客管理キー](https://qiita.com/taka_yayoi/items/a93cc81ed0c803401bb7)のようなエンタープライズレベルのセキュリティをサポートしています。

# 使い始める

AWSをご利用なのであれば、アカウントコンソールからサーバレスを有効化するように管理者に依頼して、SQLウェアハウス(以前のSQLエンドポイント)を作成してください。また、ウェアハウス設定ページでサーバレスオプションをオンにすることで、既存のSQLウェアハウスでサーバレスを使用するように切り替えることができます。詳細は[サーバレスコンピュート](https://qiita.com/taka_yayoi/items/685a11ea726b2b34a174)のドキュメントを参照ください。

Azureを利用されている場合には、リクエストを[送信](http://bit.ly/DBSQLServerless-Azure)していただければ、Azure DatabricksでDatabricks SQLサーバレスが利用できるようになったら皆様をオンボードいたします。

![](https://databricks.com/wp-content/uploads/2022/06/image1.png)
*アカウントコンソールでサーバレスコンピュートを有効化*

![](https://databricks.com/wp-content/uploads/2022/06/image2.png)
*Databricks SQLにおけるサーバレスウェアハウスの作成および管理*

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Perlを使い始める最も簡単な方法

Perlを使い始める最も簡単な方法は、PerlBanjo.comを使用することです。

続きを読む

<a href="https://perlzemi.com/blog/20220702062032.html">Perlを使い始める最も簡単な方法 - Perlゼミ</a>
transformersのAutoTokenizerのuse_fastのデフォルト値がバージョンによって異なっていた

# 要約
transformersライブラリのバージョンを上げるときは、AutoTokenizer.from_pretrained で use_fastを指定しましょうという話

---

Huggingfaceのtransformersライブラリを使っていると、古いバージョンから新しいバージョンに切り替えたい時があると思います。

自分は3.5.0から4.18.0に切り替えようとした時、実際は単純だったのに謎にハマったエラーがあったので備忘録も兼ねて共有します。

問題があったのは以下のコードです。

```
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("roberta-base")
```

これを実行して得られるtokenizerが、transformersのバージョンによって異なるという話です。

具体的には、以下のようになります。

<details><summary>3.5.0</summary>

```
>>> tokenizer
PreTrainedTokenizer(name_or_path='roberta-base', vocab_size=50265, model_max_len=512, is_fast=False, padding_side='right', special_tokens={'bos_token': AddedToken("
", rstrip=False, lstrip=False, single_word=False, normalized=True), 'eos_token': AddedToken("
", rstrip=False, lstrip=False, single_word=False, normalized=True), 'unk_token': AddedToken("<unk>", rstrip=False, lstrip=False, single_word=False, normalized=True), 'sep_token': AddedToken("
", rstrip=False, lstrip=False, single_word=False, normalized=True), 'pad_token': AddedToken("<pad>", rstrip=False, lstrip=False, single_word=False, normalized=True), 'cls_token': AddedToken("
", rstrip=False, lstrip=False, single_word=False, normalized=True), 'mask_token': AddedToken("<mask>", rstrip=False, lstrip=True, single_word=False, normalized=True)})
```

</details>

<details><summary>4.18.0</summary>

```
>>> tokenizer
PreTrainedTokenizerFast(name_or_path='roberta-base', vocab_size=50265, model_max_len=512, is_fast=True, padding_side='right', truncation_side='right', special_tokens={'bos_token': '
', 'eos_token': '
', 'unk_token': '<unk>', 'sep_token': '
', 'pad_token': '<pad>', 'cls_token': '
', 'mask_token': AddedToken("<mask>", rstrip=False, lstrip=True, single_word=False, normalized=False)})
```

</details>

このように、得られるtokenizerのクラス自体がFastかそうでないかという違いがありました。

怖いですね。



自分の場合はこの違いによって、文を入れたときのtokenizerの出力が両者で異なることがバージョンをあげた時に起こるエラーの原因になっていました。

バージョンによって異なる理由は、バージョンによってAutoTokenizerのuse_fastのデフォルト値が異なるためでした。（TrueかFalseか）

解決策は、明示的にuse_fastを指定するだけです。

```
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("roberta-base", use_fast=False)
```

これで一安心です。


### 参考リンク
* https://huggingface.co/transformers/v3.5.1/model_doc/auto.html#autotokenizer
* https://huggingface.co/docs/transformers/model_doc/auto#autotokenizer
駆け出しエンジニアが調子こいてOracle Bronzeを45日でとります

<h1>28歳の駆け出しエンジニアのおっさんがOracle Bronze を45日で取得を目指す</h1>

SQL基礎は
<ul>
<li>第1章　：　リレーショナルデータベースとSQL</li>
<li>第2章　：　SELECT文を使用したデータの取得</li>
<li>第3章　：　データの制限およびソート</li>
<li>第4章　：　単一行関数</li>
<li>第5章　：　変換関数・汎用関数と条件式の指定</li>
<li>第6章　：　グループ関数とデータの集計</li>
<li>第7章　：　複数の表からのデータの取り出し</li>
<li>第8章　：　副問合せによる問合せの解決方法</li>
<li>第9章　：　集合演算子の使用方法</li>
<li>第10章　：　データ操作とトランザクション制御</li>
<li>第11章　：　DDL文を使用した表の作成と管理</li>
</ul>

DBA12cは
<ul>
<li>第1章　：　データベースの概要</li>
<li>第2章　：　データベースの概要</li>
<li>第3章　：　スキーマオブジェクト</li>
<li>第4章　：　Oracleデータベースの基本構造</li>
<li>第5章　：　データベース記憶域構造の管理</li>
<li>第6章　：　インスタンスの起動/停止とメモリコンポーネントの管理</li>
<li>第7章　：　ユーザおよびセキュリティの管理</li>
<li>第8章　：　データベースの監視とアドバイザの使用</li>
<li>第9章　：　バックアップおよびリカバリの実行</li>
<li>第10章　：　Oracleソフトウェアのインストールとデータベースの作成・アップグレード</li>
<li>第11章　：　Oracleネットワーク環境の構成</li>
</ul>

<h2>どのくらいの時間を確保できるのか</h2>

24h-7h(睡眠時間)-9h(勤務時間)-2h(通勤時間)-1h(朝飯と夕飯)-1h(その他)=多く
見積もって4h 
　→ 平日：2h(4hもできないはずなので)

休日は、7h~8hは確保したいので
24h-8h(勉強時間)-9h(趣味や遊び)-2h(朝飯、昼飯、夕飯)-2h(美容や健康)-3h(ネットサーフィン)

66h（平日：33日*2h）
96h(土日：12日*8h)
164hは確保できる！！

<h2>どのように進めていくのか</h2>

<ol>
<li>受験申込</li>
<li>時間配分を決定する</li>
<li>勉強の進み方を決定する</li>
</ol>

　
　1.7月18日もしくは19日までに申込

　2.SQL基礎は、第6章から難しくなってくるので8割の勉強時間を割く。DBA12cに関しては50hで仕上げる。

　
【DBA12c】
50hなので45h/11章=4h/1章
しかし難易度にバラツキがあるので

易(easy,15%)：第1章、第2章,第10章,第11章 7.5h
中(normal,30%)：第6章,第7章,第8章 15h
難(difficult,55%)：第3章,第4章,第5章,第9章 27.5h

　3.DBA12cについては、下記の順番で行う。
　　　
<ol>
<li>学習チェック(※章末問題)</li>
<li>3~4回ほど流し読み</li>
<li>重要、注意を重点的に読む</li>
<li>試験直前チェックシート</li>
<li>チェックシートで明らかになった自信のない箇所を復習</li>
</ol>

【SQL基礎】
164h-50hなので114h/11章=11h/1章

易(easy,10%)：第1章、第2章 12h
中(normal,30%)：第4章,第5章,第10章,第11章 34h
難(difficult,60%)：第3章,第6章,第7章,第8章,第9章 68h

3.SQL基礎については、下記の順番で行う。

<ol>
<li>バシバシコマンドを打っていく</li>
<li>ノートにまとめる</li>
<li>章末問題</li>
<li>ノートにまとめる</li>
<li>試験直前チェックシート</li>
<li>チェックシートで明らかになった自信のない箇所を復習</li>
</ol>


<h2>備忘録</h2>
DAO（Data Access Object）

### DAO（Data Access Object）

1. **DAO**とは？ 
データにアクセスするためのオブジェクト。DatabaseにセーブされたデータをCRUDするために作られ、使われる。DBテーブルごとに1つのDAOを作成する。


2. **分離**
Controllerが直接DBにアクセスすることもできるが、複数のコントローラがDBに直接アクセスすると重複メソッド作業が何回も行われる可能性が100％に近い。ここで重複メソッドを分離して別途のオブジェクトにしたのがDAOだ。
(1) 階層の分離：DAOは永続階層（Persistance Layer）と言われ、DBに接近する役割をする。それに反してコントローラは表現階層（Presentation Layer）と言われ、データを表示する役割をする。
(2)関心の分離：コードの分離と同時に役割を分離して関心の分離になるとも言える。こう分けられたことで、作業効率が高まり、メインテナンスも容易になる。


```mermaid
graph TD;
    Controller1-->DAO;
    Controller2-->DAO;
    Controller3-->DAO;
    Controller4-->DAO;
    Controller5-->DAO;
    DAO-->Database;
```
指定した値以外のoption setsを表示する方法

【前提】
・Companyタイプを作成。
・fieldにはName(text)とIndustry(list of company selects)がある。
・Industryのフィールドタイプであるcompany selectsはoption setsにて作成。
・それぞれのIndustryには個別で選択するための項目（IT、金融、建築など企業の業種）と全選択するための項目（すべて）が作成済み。

【タイプ作成例】
Companyタイプ
Name　　　　Industry
A    　　　 　　金融、すべて
B　　　　　　IT、すべて
C　　　　　　建築、すべて

【目標】
RepeatingGroup内に配置したテキストエレメントで、「すべて」の項目以外のIndustryを表示したい。

【方法】
①RepeatingGroup内に配置したテキストエレメントをDynamic dataを選択。
②Dynamic dataの値をCurrent cell's Company's Industry:minus item すべて's Display と入力

【minus item】
リストからデータを削除するして返り値を返す
※実際のリストから削除しているわけではない！
Ubuntu 20.04 テーマの変更【Yaru-Colors】

Ubuntu20.04 でのテーマカラー変更方法を紹介します。
今回は [Yaru-Colors](https://github.com/Jannomag/Yaru-Colors) と [Gnome-Shell-Extensions の User Themes](https://extensions.gnome.org/extension/19/user-themes/)を利用してテーマの変更をします。

# 変更した結果
フォルダやアイコンなどを18色の中から変更できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688618/fda0218d-5b8f-fb89-d1e7-1da2a0441f03.png">

# 環境
- Ubuntu 20.04.4 LTS

# Yaru-Colors のインストール
[GitHub のリポジトリ](https://github.com/Jannomag/Yaru-Colors) から Clone または [ZIP ファイル](https://github.com/Jannomag/Yaru-Colors/releases) をダウンロードします。
インストーラの Shell Script を実行します。各項目の設定選択を指示に従って選択します。

```shell
# ダウンロードしたフォルダに入る
$ cd /path/to/Yaru-Colors/

# インストーラの実行
$ ./install.sh
# Shell Script を実行すると、
# テーマをインストールするディレクトリや色の選択、各種設定を聞かれるので指示に従って選択する 
```

# User Themes の変更

Gnome-Tweaks と Gnome-Shell-Extensions をインストールします。
その後、Gnome−Tweaks で User Themes を有効にし、Gnome-Shell を変更します。

## Gnome-Tweaks と Gnome-Shell-Extensions のインストール

```shell
# gnome-tweaks と gnome-shell-extensions のインストール
$ sudo apt install gnome-tweaks gnome-shell-extensions

# gnome-tweaks の起動
$ gnome-tweaks
# GUI が立ち上がる
```

## User Themes を ON

Gnome-Tweaks が立ち上がったら、Extensions > User Themes を ON にします。
![Screenshot from 2022-07-02 01-41-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688618/f232b70d-7dd8-207e-f075-b90bfcc11c39.png)

その後、Appearance > Themes > Shell で Gnome シェルのテーマを変更します。
![Screenshot from 2022-07-02 01-42-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688618/e47f37de-728d-7530-c6ba-de5e8fd4be74.png)

※もし、User Themes の項目がない場合、[User Themes - Gnome Shell Extensions](https://extensions.gnome.org/extension/19/user-themes/) を FireFox からインストールします。

# まとめ
Yaru-Colors を Ubuntu のテーマに設定しました。Yaru-Colors はテーマのファイルを Shell Script で自動的に配置してくれるため、テーマ変更が少し楽かなと個人的に感じました。
他の場合の詳しいテーマの設定方法は、[こちらのサイト](https://blog.mintsu-dev.com/posts/2020-09-02-ubuntu-gtk3-themes/)などを参考にしてください。
Ubuntu のテーマをおしゃれにすると気分も上がるかなと思うので、個人的にはおすすめです。

# 参考文献
- [Jannomag / Yaru-Colors](https://github.com/Jannomag/Yaru-Colors)
- [Relese | Jannomag / Yaru-Colors](https://github.com/Jannomag/Yaru-Colors/releases)
- [User Themes - Gnome Shell Extensions](https://extensions.gnome.org/extension/19/user-themes/)
- [Ubuntu でテーマを変更してUIを使いやすくする方法](https://blog.mintsu-dev.com/posts/2020-09-02-ubuntu-gtk3-themes/)
goで画像の反転処理を行う

# はじめに

こんにちは、icemint0828です。
今回は自作パッケージの紹介も兼ねて、goでの画像の反転処理の方法を紹介します。


## 動作環境
go 1.18.3

## 使用パッケージ

* icemint0828/imgedit
画像の反転処理に使用しています。
画像ファイルの拡張子の変換にも使用しています。

https://github.com/icemint0828/imgedit

## インストール

```shell
$  go get github.com/icemint0828/imgedit@v1.5.0
```

# 画像の反転処理

```main.go
package main

import (
	"github.com/icemint0828/imgedit"
)

func main() {
	// 反転方向の指定
	isHorizon := true

	// FileConverter
	fc, _, err := imgedit.NewFileConverter("srcImage.png")
	if err != nil {
		panic(err)
	}
	// 反転
	fc.Reverse(isHorizon)
	
	// 保存(jpeg, gif形式での保存も可能)
	err = fc.SaveAs("dstImage.png", imgedit.Png)
	if err != nil {
		panic(err)
	}
}

```

水平方向の反転をしたい場合は、`isHorizon = true`を指定し、垂直方向の反転をしたい場合は、`isHorizon = false`を指定します。

`fc.SaveAs`の第二引数では以下の形式で保存するファイルの形式を選択出来ます。
* `imgedit.Png`
* `imgedit.Jpeg`
* `imgedit.Gif`

# 画像の反転処理(image取得)
```main.go
package main

import (
	"image"

	"github.com/icemint0828/imgedit"
)

func main() {
	// 反転方向の指定
	isHorizon := true

	// srcImgを何らかの方法で取得
	var srcImg image.Image

	// FileConverter
	c := imgedit.NewConverter(srcImg)

	// 反転
	c.Reverse(isHorizon)
	dstImg := c.Convert()

	// dstImgを使用
}

```

ファイルを介さずにimageを処理したい場合は、上記のように`imgedit.NewConverter`で直接画像の加工が出来ます。

# パッケージ内の処理の説明

[imgedit](https://github.com/icemint0828/imgedit)パッケージ内の`converter.go`で反転の処理を実施しています。

```converter.go
// Reverse flips the image
func (c *converter) Reverse(isHorizon bool) {
	dst := image.NewRGBA(image.Rect(0, 0, c.Bounds().Dx(), c.Bounds().Dy()))
	srcSize := c.Bounds().Size()
	dstSize := dst.Bounds().Size()
	var f func(int, int) (int, int)
	if isHorizon {
		f = func(x int, y int) (int, int) {
			return srcSize.X - x, y
		}
	} else {
		f = func(x int, y int) (int, int) {
			return x, srcSize.Y - y
		}
	}
	for x := 0; x < dstSize.X; x++ {
		for y := 0; y < dstSize.Y; y++ {
			srcX, srcY := f(x, y)
			dst.Set(x, y, c.Image.At(srcX, srcY))
		}
	}
	c.Image = dst
}
```

元の画像からサイズを取得し、`*image.RGBA`に対して、各ピクセルの色情報の書き込みしています。  
書き込みをする際に水平方向に反転する場合は、元画像の`srcSize.X - x, y`のピクセル情報を参照し、垂直方向に反転する場合は、元画像の`x, srcSize.Y - y`のピクセル情報を参照しています。

# おわりに
簡単な内容とはなりますが、画像の反転処理を紹介させて頂きました。
最後まで読んで頂き、ありがとうございました。

#### 前の記事
[goで画像のトリム処理を行う](https://qiita.com/icemint0828/items/884dce09413bb8d2570d)

#### 次の記事
[goで画像の色調変換の処理を行う](https://qiita.com/icemint0828/items/86d7823ba1228b7f11b6)
[Swift] structのMemberwise Initializerを残しつつカスタムのInitializerも実装する方法

Swiftの構造体（struct）は<u>**Initializerを一つも実装しない場合**</u>にMemberwise Initializerと呼ばれるInitializerが自動で生成されます。

> Structure types automatically receive a memberwise initializer if they don’t define any of their own custom initializers.

https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

<br>
<br>

例えば、以下のUser型にInitializerは定義されていませんが、コンパイラが自動でMemberwise Initializerを与えてくれます。

```swift
struct User {
    let firstName: String
    let lastName: String
}
```

<br>

よってこのような初期化が可能です。

```swift
let user = User(firstName: "Hero", lastName: "Bamboo")
```

<br>

ところで、iOSアプリを実装していると、ドメインを定義したModelから、ビューに表示するためのModelであるViewModelに変換することがあります。

このようなとき、Modelの型をInitializerの引数として受け取るようにすると便利で、以下のような実装をしたりします。


```swift
struct UserViewModel {
    let firstName: String
    let lastName: String

    init(model: User) {
        self.firstName = model.firstName
        self.lastName = model.lastName
    }
}
```

<br>

ただし、Memberwise Initializerも残しておきたいとします。

そんなときは、以下のようにカスタムInitializerをextensionに実装しましょう。  
こうすると、Memberwise Initializerを残しつつ、カスタムInitializerも実装することができます。

```swift
struct UserViewModel {
    let firstName: String
    let lastName: String
}

extension UserViewModel {
    init(model: User) {
        self.firstName = model.firstName
        self.lastName = model.lastName
    }
}
```

<br>

```swift
let user1 = UserViewModel(firstName: "Hero", lastName: "Bamboo")

let user2 = UserViewModel(model: user)
```
Git　→　GitHub　連携のコマンドの覚え方

## はじめに
「わしゃー、もう年だし、新しいこと覚えても、すぐ忘れるんじゃよ、とほほ・・・」
と思っているあなたに朗報です！

- Gitでリポジトリを作成 
- ファイルを作成
- 作成したファイルをリポジトリに登録
- GitリポジトリとGitHubリポジトリとの関連付け
- Git →　GitHubへ連携

これらの手順の簡単な覚え方があるんです。

それは　`インアコラップ`　
そう、今日はこれだけでも覚えて、読み飛ばしてください。

**＜　覚え方の例１　＞**
１に`インアコラップ`
２に`インアコラップ`
３、４がなくて
５に`インアコラップ`

**＜　覚え方の例２　＞**
`インアコラップ`、`インアコラップ`、雨、`インアコラップ`

いや、どれも覚えにくいし、、、
一応、最後に種明かしをしておりますので、興味があればご覧ください。

何はともあれ、手順をみてみましょう

## 前提
- Gitをインストール済
- GitHubのアカウント持ち


## STEP1 : Gitでリポジトリを作成
Gitでtestという名前のリポジトリ（ファイルをバージョン管理する入れ物）を作成

**＜イメージ＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998522/94542b11-d21d-3ed0-c75c-e7321cccce9d.png)




**＜コマンド＞**
ターミナルで任意のフォルダ（test）に移動した上で下記コマンドを実行
```
git init
```

## STEP2 : ファイルを作成
任意のフォルダ（test）内に適当なファイル（test.txt）を新規作成し、一時領域へ追加
※一時領域を経由する必要がある

**＜イメージ＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998522/ce8e20c3-aed8-07a0-77b8-18514253f361.png)

**＜コマンド＞**
```
git add test.txt
```
## STEP3 : 作成したファイルをリポジトリに登録
適当なファイル（test.txt）をリポジトリにコミットする

**＜イメージ＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998522/6536a38e-a026-db23-17ab-154fd29e3e9c.png)



**＜コマンド＞**
```
git commit
```

## STEP4 : GitリポジトリとGitHubリポジトリとの関連付け
GitHubで事前にリモートリポジトリ（名称：test）を作成しておいてください
ローカルリポジトリ（Git）とインターネット上にあるリモートリポジトリ（GitHub）との関連付けをします
※Gitの[test]リポジトリを、GitHub上に無数にあるリポジトリのどれにコピーすればよいのか等、をPCに記憶させるため

**＜イメージ＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998522/e8e75c2b-2c8f-5fd6-9907-68e6fff6c799.png)

**＜コマンド＞**
```
git remote add origin https://github.com/[GitHubのユーザ名]/test.git
```


## STEP5 : Git →　GitHubへ連携
ローカルリポジトリ（Git）とインターネット上にあるリモートリポジトリ（GitHub）との関連付けができているので、プッシュすることで、ローカルリポジトリの内容をリモートリポジトリへコピーします

**＜イメージ＞**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998522/47170970-577f-e09a-a621-26449239db2b.png)


**＜コマンド＞**
```
git push origin master
```

## 種明かし　`インアコラップ`　とは！！
もうお気づきの方も多いでしょう。

gitコマンドを順に並べていくと

- git init
- git add
- git commit
- git remote add
- git push

頭文字を無理やりつなげると

　in + a + co + r + a + p

`インアコラップ`

となるわけです。

最後までお付き合いいただきまして、おありがとうございました！
webpack.config.jsの書き方

# そもそもwebpackとは
複数のjavascriptファイルやcss、画像などを一つのファイルにまとめることができる
（なぜ、そんなことをするのか、理由は以下に記載）
# メリットは何？
昨今、可読性を上げるため、保守がしやすい設計にするためにモジュールごとに分けて**ファイル分割**をして、プロジェクト（アプリ）を作成します。
そうすると、当然、**ファイル数が増え**、**ブラウザ側でのリクエストが増える**ことになり、もっさりとした動きのプロジェクトになります。
そこで、webpackの登場です。
複数のjavascriptファイルやcss、画像などを**一つのファイルにまとめる**ことでブラウザへのリクエストが減り、**非常に高速**に動くプロジェクトへ生まれ変わります。


# webpack.config.jsの基本的な書き方
```js
const path = require('path');

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'index.js',
        publicPath: 'dist/',
    }
};
```
- entry -> **最初に読み込むファイルを指定**
    - ここで指定されたファイルから別のファイルを読み込む処理が書かれていると、webpack はそれらのファイルも自動的に読み込んで、最終的に1つのファイルとして出力してくれます
- output -> 読み込んだファイルを**一つにまとめた（バンドルした）ファイルの出力先を指定**
    - path -> __dirnameは**ルートディレクトリ（webpack.config.jsのあるディレクトリ)を指す**、つまり、**絶対パスで出力するディレクトリを指定**している（以下参照）
    
    - filename -> バンドルした際に出力するファイル名を指定する
    - publicPath -> 出力先のディレクトリがうまく認識できない場合があるため、念の為に出力するファイルの親ディレクトリを指定する


# コラム
## path.resolve()について
引数の絶対パスを返す
なぜ、わざわざ関数を使用して絶対パスを指定するのか
**環境によってパスの表記が違うから**環境に合わせた絶対パスを返してくれるpath.resolve()を使用することが望ましい
```zsh
# /Users/shindo/dev/markdown-editorにいる
# REPLで試す
# path.resolveは指定したファイルやディレクトリの絶対パスを返す

% node
> const path = require('path');
undefined
> path.resolve('README.md')
'/Users/shindo/dev/markdown-editor/README.md'
```

# 参考
[最新版で学ぶwebpack 5入門](https://ics.media/entry/12140/ "最新版で学ぶwebpack 5入門
JavaScriptのモジュールバンドラ")
【VSCode】VSCodeでRailsのデバッグをする【Rails】

## `debug`をインストール
```Gemfile

group :development do
  gem 'debug'
end

```

```:ターミナル
$ bundle install
```

## `launch.json`を作成する
`.vscode/launch.json`を以下のとおり作成します。
```.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "rdbg",
            "name": "Debug current file with rdbg",
            "request": "launch",
            "script": "${file}",
            "args": [],
            "askParameters": true
        },
        {
            "type": "rdbg",
            "name": "Attach with rdbg",
            "request": "attach"
        }
    ]
}
```

## `Rails`を起動
`rdbg`経由で`Rails`を起動します。
```:ターミナル
$ $ rdbg --open --command -- bundle exec rails server
```
【HTML 文字を強調するためには？】

こんにちは。
新卒入社3年目文系出身のエンジニアです。
今回はHTMLでどのようにして文字を強調したらよいか？について語っていきます。

### そもそもなぜこのテーマにしたのか
なぜこのテーマにしたのかといいますと、
案件でちょこちょこありがたいことにコーディングをする機会があるのですが、
なかなか思うようにいかず、いつもコーディングの時BPさんに絞られています。
なので、さすがに本腰を入れて勉強しないといけないと思い(遅い。。笑)、
CODEPREPで今までやってきた開発言語の総復習を行っていました。
HTML入門 HTML5編を取り組んでいたところ、
穴埋め式問題で分からない問題に直面しました！
おそるおそるHINTの内容を見てみると、
文字を強調させるにはどんなタグを使用すればよいかという内容でした。
普段の案件でHTMLを少ししか触ったことがなくましてや文字を強調させるタグについての内容は全く知らなかったため、今回知識の定着として投稿してみようと思いました。

### 文字を強調したいタグの種類
文字を強調したいタグの種類は、大まかに分けて4つあります。

#### markタグ
以下のaaaはmarkタグで囲った結果です。

<mark>aaa</mark>

Qiitaでは分かりにくかったので、画像で確認してみましょう！
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666359/20cec1dc-accb-ca7d-b406-d0e11ab1a976.png)
15行目に重要！と入力し、markタグで囲みました。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666359/998ff782-0252-b3ae-960d-c56628ae9cf4.png)
すると、重要！と書いている箇所だけ黄色いマーカーで引かれていることが分かります。
このように、参照目的のために文字を目立たせたいときに有効です。

#### emタグ
以下のaaaはemタグで囲った結果です。

<em>aaa</em>

emは斜体文字になっていることが分かります。
文字が斜めになることで、テキストを強調させるために使用されることが多いです。
また、emタグを入れ子にして文字を際立たせたい時に有効です。

#### bタグ
以下のaaaはbタグで囲った結果です。

<b>aaa</b>

文字が太くなっていることが分かります。
bタグは目線を引き付けたいタグの一種です。

#### strongタグ
以下のaaaはstrongタグで囲った結果です。

<strong>aaa</strong>

bタグと全く同じ結果になることが分かりました。
bタグとstrongタグはいったい何が違うのでしょうか？

#### bタグとstrongタグの違い
見栄えは一緒なのですが、実は意味と目的が全く違うことがわかりました。
bタグは、テキストに意味を持たさないもので、実用的な目的で目立つようにするための要素です。
例えば、概要説明におけるキーワードをピックアップする時に使われます。
一方、strongタグは要素内容が「重要」「重大」「緊急」「深刻」のいずれかであることを示す要素であり、
意味的に重要なテキストを表しています。
簡単に言えば、strongタグは重要な事柄、言葉で使用されます。
bタグは事柄、言葉に意味はないけど、目立たせたいときに使うと思ったらいいかもしれないです。

#### 最後に
最後まで読んでくださり、ありがとうございました！
自分自身、HTMLのことについてそこまで詳しくなかったので、
なるほど！と思い、記事にさせて頂きました。
案件で使うことはないかもですが、知っておいて損はないなと思いました。
また、HTMLについてもこの投稿をきっかけに詳しくなっていきたいです。

#### 参考URL
https://seolaboratory.jp/52392/

https://seolaboratory.jp/52093/#:~:text=HTML%E3%81%A7%E5%A4%AA%E5%AD%97%E3%81%AB%E3%81%99%E3%82%8Bstrong%E3%82%BF%E3%82%B0%E3%81%A8b%E3%82%BF%E3%82%B0%E3%81%AE%E9%81%95%E3%81%84,-HTML%E3%81%A7%E5%A4%AA%E5%AD%97&text=%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E7%9B%B8%E5%AF%BE%E7%9A%84%E3%81%AB%E9%87%8D%E8%A6%81,%E3%81%93%E3%81%A8%E3%81%8C%E4%B8%BB%E7%9B%AE%E7%9A%84%E3%81%A7%E3%81%99%E3%80%82

#### 参考本
https://www.amazon.co.jp/HTML5%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93-%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-Ver2-0%E5%AF%BE%E5%BF%9C%E7%89%88-Examination-Library/dp/4839962677
【Salesforce】ごみ箱からの復元（Undelete）時に参照関係が保持されるかの検証 

# きっかけ
参照関係レコードの削除時に連動して削除される処理が実装されたレコードがある。
参照元が復元されたときに連動して復元させたいが、その際にリレーションが保持されるのかを確認したい。

# 前提
参照関係項目の「参照レコードが削除された場合の対処方法」が「この項目の値をクリアします。 この項目を必須にした場合、このオプションは選択できません。」に設定されていると、削除時に参照関係項目がクリアされる。
→ 削除時にクリアされてしまうので、復元時に参照元を辿れないのでは？？

# 結論
削除時にはクリアされるが、参照関係レコードの復元時には再設定される。

> undelete 操作を行うと、次のリレーションの種類に関して、レコードの関連付けが復元されます。
> * すべてのカスタム参照関係

[レコードの削除 | Apex 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/langCon_apex_dml_examples_delete.htm)

# 検証
1. 相互参照のレコードを作成
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/129d71ab-b224-da31-a343-b87bd23b9da1.png)
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/3122306c-f47d-c706-9f5a-6669e4fa32e3.png)

2. 一方のレコードを削除
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/04c2a500-18f8-783d-935d-e45226de10ce.png)
参照関係はクリアされている。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/7709a4b5-56a7-00b4-1175-d1c1f5d5e4b2.png)

3. もう一方のレコードを削除
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/f1fd2c63-34e7-0910-87d6-77989a47c1e3.png)

4. 一方のレコードを復元
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/baa970e5-bafd-49c5-38e8-4379c7b8075d.png)
参照関係は（当然）クリアされたまま。
![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/9dc12a16-aa03-5c38-8a67-d9a8ca02933d.png)

5. もう一方のレコードを復元
![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/371f8075-6ed2-7fa5-974d-bf977d1e1c1a.png)
参照関係が再設定されている。
![キャプチャ8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/be67f1e0-25e1-b670-b02b-970a78929e16.png)
![キャプチャ9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728822/1191817b-1e14-6de0-2b92-aee7907617bb.png)

# 参考
[SFDC：参照関係オプションについて](https://tyoshikawa1106.hatenablog.com/entry/2013/11/11/204244)
[レコードの削除 | Apex 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/langCon_apex_dml_examples_delete.htm)
djangoでtemplateのhtmlファイルがUnicodeDecodeErrorになる

# djangoでtemplateのhtmlファイルがUnicode Decode Errorになる


UnicodeDecodeError at ＜htmlのディレクトリ＞
'utf-8' codec can't decode byte ｘｘｘ in position ｘｘ: invalid start byte

該当のhtmlに日本語が入っているとエラーになる。


## 原因

VSCodeで作成したhtmlファイルがなぜか、"Shift JIS"に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245425/b2278710-7260-a29f-d440-0860157098da.png)

## 対処

UTF-8に変更して保存して解決

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245425/f0940fd0-da6e-bc28-bc72-6f8fe8ebb87b.png)
[javascript] forEachとspliceを使う変わりにfilterをつかう

仕事で身に付けた技術や仕事以外で身に付けた知識を、自分用の備忘録として投稿していきたいと思います。

# 今日の内容
会社で先輩方にしていただいた、Vue.jsで書いたコードのフィードバックで、javascriptの関数であるArray.prototype.filter()を初めて使ったので、備忘録として残します。

## 使うきっかけになったコード(サンプル)
vueインスタンスのdata()内で定義された配列型の変数populationがある。
~~~ javascript:変数populationをvueインスタンス内で定義
<script>
export default {
  data() {
    return {
      population: [],
    };
  },
}
~~~
populationには、ユーザーが選択した都道府県ごとの年ごと(year)の総人口(value)と都道府県コード(code)が格納された配列を格納する。
~~~ javascript:格納されている要素のひとつ
{"data": [{ "year": 1980, "value": 12817 }, { "year": 1985, "value": 12707 }, { "year": 1990, "value": 12571 }, { "year": 1995, "value": 12602 }, { "year": 2000, "value": 12199 }, { "year": 2005, "value": 11518 }, { "year": 2010, "value": 10888 }, { "year": 2015, "value": 10133 }, { "year": 2020, "value": 9275 }, { "year": 2025, "value": 8431 }, { "year": 2030, "value": 7610 }, { "year": 2035, "value": 6816 }, { "year": 2040, "value": 6048 }, { "year": 2045, "value": 5324 }], "code":11}
~~~

ここから、選択解除した都道府県の情報が格納されている要素を削除するために下のコードbefore.vueを書いた。
removeCode[]には、選択解除した都道府県コードが1つだけ格納されている。
forEachで与えられた配列の各要素に対して、「選択解除された都道府県コードが含まれている要素を、spliceでpopulationから削除する」処理を繰り返している。
~~~ javascript:before.vue
let i = 0;
this.population.forEach((p) => {
  if (p.code === removeCode[0]) {
    this.population.splice(i, 1);
  }
  i = i + 1;
});
~~~
## forEachの中でspliceをすべきでない理由
forEachの中でspliceをすると、意図しない結果を返してくることがある。

## コードの改善
forestとspliceを使わずにbefore.vueと同じ結果を返す処理を書くには、Array.prototype.filter()を使う。これによってコードを短くすることもできた。

>filter() メソッドは、与えられた関数によって実装されたテストに合格したすべての配列からなる新しい配列を生成します。

引用元

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

改善したコード
~~~ vue:after.vue
this.population = this.population.filter(function (p) {
  return p.code !== removeCode[0];
});
~~~
Cocos Creatorをプログラミング教育に使う！

# Cocos Creatorをご存じでしょうか？
Cocos Creatorとは、ゲームエンジンです。

ゲームエンジンとは何か？
ゲームエンジンとは、ゲーム開発を容易にしてくれるツールのようなものです。
ゲーム業界で、良く知られているゲームエンジンとしては、Unityがありますが、Cocos CreatorはUnityと似たゲームエンジンです。

#### Cocos Creatorのユーザーインターフェース画面
![1-2-1スプライト表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708476/b32d7c65-1485-7b3e-95b3-6e2b08328160.png)

#### Unityのユーザーインターフェース画面
![Unity画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708476/272dd798-f54e-4520-45a8-5e41253d3498.png)
（余談）Unityの画像の戦車のようなものは、素人の私ががんばってモデリングしたものなので、カッコよくありませんが、X68000という昔のパソコンで販売されたゲームでグラナダだというゲームがあり、そのゲームに出てくる主人公が操る設定の戦車をイメージしてモデリングしましたｗ

# Unityとの違い

Unityと違うところは、Unityは三次元のゲームを主として開発（二次元のゲームも開発可能）に使われており、Cocos Creatorは、二次元のゲームを作るのに特化したゲームエンジンです。もともとは、Cocos2d-Xという二次元のゲームを開発するのに特化したC言語、C++ライブラリがゲーム業界で使われていて、そのCocos2d-Xをベースにしてユーザーインターフェースを付けたゲームエンジンがCocos Creatorになります。ただ、Cocos Creatorもバージョン3から、3D対応され三次元のゲームも開発できるように進化しています。

#### 使用できるプログラミング言語

使用できるプログラミング言語は、JavascriptとTypescriptです。
Unityもすばらしいゲームエンジンですが、C#というやや小難しいプログラミング言語を使ってプログラミングするため、入門者には少し敷居が高いと思います。しかし、Cocos Creatorは、JavaScriptかTypescriptというスクリプト言語でプログラミングできるため、Webアプリを作る気軽さでゲームプログラミングができると私は考えており、プログラミングをこれから学びたい人に是非お奨めしたいツールです。

| ゲームエンジン       | 描画タイプ    | プログラミング言語     |
|:--------------------|-------------:|:---------------------:|
| Cocos Creator       | 3D           | JavaScript, Typescript|
| Unity               | 2D(3D)       | C#                    |

## CocosCreatorをプログラミング教育に使ってみませんか？
以下の私のブログで、今後、Cocos Creatorを使ったゲームプログラミング講座を発信していきたいと思いますので、ご興味がある方は覗きに来てみて下さい。

https://panda-ringo.com
【初めてのAndroidアプリ開発】気温変化の通知（暫定版）

<h2>はじめに</h2>
<p>
某所にてJavaプログラミングを学んだので、何か対外的にアピールできる成果があればと思い、ある程度実用的なAndroidアプリ開発を行なった。
</p>
<p>
※内容の不備や著作権上の問題などございましたらコメントなどでご指摘いただけると幸いです。
</p>

<h2>アプリの目的</h2>
<p>
春先から日ごとに気温が不安定で、前日と同じような服装でも暑すぎる・寒すぎると感じることが多かった。一方で天気予報を見る習慣はあまりなく、とりわけ忙しい朝に「予報の確認→服装の調整」の流れを毎日実行するのは難しく感じてしまう。<br>
そこで、スマホに毎朝自動で今日の気温と前日比が通知されれば、さすがに服装調整に意識を向けられるのではと考え、初めての開発としてその目的に適うアプリを作成を目指した。
</p>

<h2>動作の概要</h2>
<ol>
<li>
設定画面(MainActivity)から都道府県・通知時間を設定
</li>
<li>
都道府県(ListView_PrefSetting)、通知時間(ListView_TimeSetting)はそれぞれListViewより選択
</li>
<li>
設定画面の「開始」ボタンを押すと、WorkManagerにNotificationWorkerが登録され、設定した時間に実行される
</li>
<li>
NotificationWorkerは以下の３つの動作からなる
<ul>
<li>
気象庁の全XMLフィードリストより選択地域の「府県天気予報」URLを取得(Stationsetting)→URLに接続し、予想最高・最低気温を取得(ForecastScanner)
</li>
<li>
都道府県名、現在日時より「過去の気象データ」URLを生成し、前日の最高・最低気温を取得(downloadHTML()メソッド)
</li>
<li>
取得した気温から画面を作成し通知を表示(BigTextMainActivity)
</li>
</ul>
</li>
</ol>

<h2>クラスの関係性</h2>
<p>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728805/1a8b5a57-82ef-a70b-e75b-0c4aacb4d3a7.jpeg" alt="クラスの関係性", title="クラスの関係性">
</p>

<h2>コード</h2>
<a href="https://github.com/yamagata1129/FluctuateNotice
">https://github.com/yamagata1129/FluctuateNotice
</a>

<h2>改善点</h2>
<ul>
<li>
セキュリティや通信状況の確認など接続面の主要な設定がなされていない
</li>
<li>
非推奨のメソッドなどを使用している（onClick(), SharedPreferenceなど）
</li>
<li>
delayのあるWorker内での動作（ユーザーから見ればバックグラウンド処理的に振る舞うと認識している）なのでURLからのアクセスをメインスレッド内の処理としているが、適切かどうかわからない
</li>
<li>
XMLフィードの取得メソッドが階層を何個も降りるために見た目が汚い
</li>
</ul>

<h3>AndroidStudioのバージョン</h3>
<p>
Android Studio Chipmunk | 2021.2.1<br>
Runtime version: 11.0.12
</p>

<h2>参考</h2>
<ul>
<li>
ListViewの作成<br>
<a href="https://akira-watson.com/android/listview_1.html">https://akira-watson.com/android/listview_1.html</a>
</li>
<li>
HTMLパーサ(Jsoup)の使用法<br>
<a href="https://jsoup.org/">https://jsoup.org/</a>
<br>
<a href="https://qiita.com/opengl-8080/items/d4864bbc335d1e99a2d7">https://qiita.com/opengl-8080/items/d4864bbc335d1e99a2d7</a>
</li>
<li>
通知の生成<br>
<a href="https://developer.android.com/guide/topics/ui/notifiers/notifications?hl=ja&authuser=1">https://developer.android.com/guide/topics/ui/notifiers/notifications?hl=ja&authuser=1</a>
</li>
<li>
WorkManagerについて<br>
<a href="https://developer.android.com/topic/libraries/architecture/workmanager?hl=ja&authuser=1">https://developer.android.com/topic/libraries/architecture/workmanager?hl=ja&authuser=1</a>
</li>
<li>
XMLフィードの取得<br>
<a href="https://developer.android.com/training/basics/network-ops/xml?hl=ja">https://developer.android.com/training/basics/network-ops/xml?hl=ja</a>
</li>
<li>
SharedPreferenceの使用
<br>
<a href="https://developer.android.com/training/data-storage/shared-preferences?hl=ja&authuser=1">https://developer.android.com/training/data-storage/shared-preferences?hl=ja&authuser=1</a>
</li>
</ul>
[C#] 業務システムにありがちなファイル取り込みして出力する処理を.NET6 でベンチマークしてみた

普段は業務システムを扱うので、ありがちな処理を題材に.NET6の練習もかねて、ベンチマークとってみます。

https://github.com/panda728/ImportingProcess


題材はshift-jis形式で、明細10行を1行で表現するといった業の深い形式のデータを読み込んで、CSVっぽい何かに変換する処理です。（変換先もヘッダとフッタを含む大福帳的なデータを想定しています）
https://github.com/panda728/ImportingProcess/blob/master/ImportingProcess/data01.txt

（指摘を受けてMemoryStream上で読み書きするように変更）

まずは素直にStreamReaderで読み込んで、クラスに展開してから、ファイル出力します。
https://github.com/panda728/ImportingProcess/blob/master/ImportingProcess/Import01.cs


|             Method |     Mean |    Error |  StdDev | Ratio | RatioSD |      Gen 0 |      Gen 1 |     Gen 2 | Allocated |
|------------------- |---------:|---------:|--------:|------:|--------:|-----------:|-----------:|----------:|----------:|
|      BaselineAsync | 733.4 ms | 177.0 ms | 9.70 ms |  1.00 |    0.00 | 51000.0000 | 17000.0000 | 4000.0000 |    375 MB |
|      SpanCharAsync | 727.9 ms | 178.0 ms | 9.76 ms |  0.99 |    0.02 | 50000.0000 | 16000.0000 | 4000.0000 |    370 MB |
|   YieldReturnAsync | 325.7 ms | 160.3 ms | 8.79 ms |  0.44 |    0.01 | 65000.0000 |  2000.0000 | 2000.0000 |    362 MB |
| StringBuilderAsync | 366.8 ms | 124.9 ms | 6.84 ms |  0.50 |    0.01 | 88000.0000 |  2000.0000 | 2000.0000 |    452 MB |

変換結果をListに格納(BaselineAsync)する方式と、yield return する方式(YieldReturnAsync)の差がよく表れていますね。

stringを直接渡さないで済むような引数が増えたので、SpanCharAsync で試してみました。少しの手間でいい感じに効果がでてますね。

StringBuilderAsync では、書き込み前の文字列組立てをStringBuilderに変えてみたのだけど、なぜか無駄に処理が増えただけでした。

今後はバイナリで直接扱ってみたいですね。
[Servlet&JSP]プルダウンで選択した値を表示させる。ArrayList


### プルダウンから小林を選択する
![スクリーンショット 2022-07-01 22.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675188/093c0603-9292-a5fe-546b-a2904a53ae38.png)

### 送信ボタンをクリックすると、小林が表示される
![スクリーンショット 2022-07-01 22.17.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675188/28c34baf-443c-9c54-57e3-3de607cd84f9.png)

```java:purudaun.jsp
<form action="search" method="post">

	<div>
		<select name="miyoji">
		<option value="">選択してください</option>
		<% for(int i = 0; i < userList.size(); i++) { %>
		<option value="<%= userList.get(i).getName()%>"><%= userList.get(i).getName()%></option>
		
	<% } %>
	</select>
	</div>
	<input type="submit" name="submit" value="送信" />
</form>
```

```java:search.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		
		String name= request.getParameter("miyoji");
		//int number = Integer.parseInt(name);
		
		HttpSession session = request.getSession();
		ArrayList<User> userlist = (ArrayList<User>)session.getAttribute("userlist");
		ArrayList<User> searchList = new ArrayList<>();
		for(int i = 0; i < userlist.size(); i++) {
		  if(userlist.get(i).getName().contains(name)) {
			searchList.add(userlist.get(i));	
			}
		  
		}
		 session.setAttribute("userlist",searchList);
		
		RequestDispatcher rd = request.getRequestDispatcher("search.jsp");
		rd.forward(request, response);
```

```java:search.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="beans.User,java.util.ArrayList" %>
    <%ArrayList<User> userList = (ArrayList<User>)session.getAttribute("userlist");%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<p>プルダウンで選んだ値</p>
<% for(int i = 0; i < userList.size(); i++) { %>
<%= userList.get(i).getName()%>

<% } %>
</body>
</html>
```
VS CodeでHTTPリクエスト　試してみました

◆試してみました
サクッとAPIを叩く方法 (VS CodeでHTTPリクエストが送れちゃう拡張機能) - Qiita
https://qiita.com/yoshii0110/items/d40a1c8bcf0353b5bff3


◆Visual Studio Code　導入
Download Visual Studio Code - Mac, Linux, Windows
https://code.visualstudio.com/Download


◆REST Client　導入

REST Client - Visual Studio Marketplace
https://marketplace.visualstudio.com/items?itemName=humao.rest-client


【初心者向け】VBS用にVS Codeをインストールした際に最低限やっておきたい設定項目
文字コードの自動判別有効化
https://www.depthbomb.net/?p=2702


◆REST API　確認

〇新規
コマンドとしては、Windowsの場合は、Ctrl + N

〇MediaWiki APIを使ってWikipediaの情報を取得 - Qiita
https://qiita.com/yubessy/items/16d2a074be84ee67c01f

〇ソース　記事「IBM」の本文を取得
https://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=revisions&titles=IBM&rvprop=content

〇実行
コマンドとしては、Windowsの場合は、Ctrl + Alt + R
又は
Send Request

〇結果
![20220701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145508/37608f5f-d2d0-617d-2b09-0159d7028d8e.png)



◆vbs(VBScript)　確認

ソース
Msgbox "Hello World."

VisualStudioCodeでVBScriptを実行する
https://blog.janjan.net/2020/02/01/vsc-run-exec-vbscript/
基本情報技術者試験対策を振り返る

## はじめに
先日、基本情報技術者試験を受験し合格基準の6割以上を達成しました。
勉強時間は大体2ヶ月程度、業務終了後に３０分~1時間程度勉強を行ってました。（もちろん勉強していない日も多々ありましたが）
自分がどのような勉強をしたのか、また反省点などを振り返っていきたいと思います。

## 基本情報技術者試験の概要
|            |      午前     |      午後        |
|:-----------|:------------:|:------------:|
|    試験時間  | 150分        | 150分         |
|    出題形式  | 多肢選択式（四肢択一）      |　　　多肢選択式　　|
|    出題数    | 80問        | 11問         |
|    回答数    | 80問          | 5問           |

基本情報技術者試験は、経済産業大臣が行う国家試験です。
試験は午前試験と午後試験に分かれており、**両試験6割以上点数を取らないと合格することができません。**
出題範囲は広範囲にわたり、午前試験ではテクノロジ系（アルゴリズム、ネットワーク、セキュリティなど）から５０問、マネジメント系（プロジェクトマネジメント、システム監査など）から１０問、ストラテジ系（システム企画、経営戦略マネジメントなど）から２０問問題が出題されます。
マネジメント系とストラテジ系で合計３０問出題されますので技術一辺倒で試験を突破するのは難しいです。

午後試験では、以下のような構成になっています。

|    問題数　　|     出題分野     | 　　　　必須/選択　　　　| 配点 　　　　|
|:-----------|:------------:|:------------:|:------------:|
|    問1  | 情報セキュリティ        | 解答必須         |20点|
|    問2 ~ 問5  | ソフトウェア・ハードウェア、データベース、ネットワーク、ソフトウェア設計、プロジェクトマネジメント、経営・関連法規など     |　　　４問の中から２問選択　　|各15点 |
|    問6    | データ構造及びアルゴリズム       | 解答必須         |25点         |
|    問7 ~ 問11  | C言語、Java、Python、アセンブラ言語、表計算          | １問を選択          |25点         |

解答必須の問題は問1と問6のみであり、残りの問題は出題から選択します。自分の得意分野に合わせて選択可能です。

## 午前試験対策
1. 参考書を１周
[キタミ式イラストIT塾 基本情報技術者 令和04年](https://www.amazon.co.jp/dp/B09MYGL7B5/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を1ヶ月程度かけてを読みました。
ページ数が**７００ページ以上**あり、途中挫折しそうになりましたが何とか読み切りました。イラストが豊富に使われており、とても理解しやすい内容になっております。こちらすべて読み切っても、問題が全て解けるようになるわけではないので、時間はあまり使わない方が良さそうです。
自分はKindle版を購入しましたが、**単行本をおすすめします。**　なぜなら、過去問を解く際に参考書を見返す機会が多いですが、Kindle版だとかなり検索しにくく、1回1回に時間がかかってしまうからです。

2. ひたすら[過去問道場](https://www.fe-siken.com/fekakomon.php)を解く
「模擬試験形式で出題」の箇所から過去5年分解き、理解できない箇所は参考書で調べたり、ググったりしながら理解できるまで繰り返し解きました。この過去問道場は、ユーザー登録すると問題にチェックをつけることができ後から見返すことができます。わからない問題にチェックをつけ、そのチェックがなくなるまでひたすら復習を行いました。最初の頃は全く解けませんでしたが、徐々に慣れてきますので安心してください。
基本情報の過去問を解けるアプリ[「2022年版 基本情報技術者問題集(全問解説付)」](https://apps.apple.com/jp/app/2022%E5%B9%B4%E7%89%88-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E5%95%8F%E9%A1%8C%E9%9B%86-%E5%85%A8%E5%95%8F%E8%A7%A3%E8%AA%AC%E4%BB%98/id1211959354)もありますのでこちらもおすすめです。

## 午後試験対策
1. [過去問道場](https://www.fe-siken.com/fekakomon_pm.php)過去1年分解く
どのような問題がでるのかが全くわからなかったので、とりあえず全分野1年分解きました。（プログラミング言語はpythonのみ）
ここで自分の得意分野が見えてくると思います。

2. アルゴリズムを過去5年分解く
アルゴリズムは配点２５点あり、解答必須のため避けて通れません。過去問を読み返して理解することが必要と思います。少し日にちが経過した頃に以前解いた過去問に再度チャレンジするようなことも行っておりました。また、擬似言語は事前に把握しておくと当日時間かけずに問題に取り掛かりやすいです。参考にした記事があるので貼っておきます。（擬似言語の説明も記載されています）
https://www.seplus.jp/dokushuzemi/fe/fenavi/gogo_arukikata/guide_algorithm_of_questions_at_pm/


## まとめ
最初は本当に「合格できるのか？」と思いながら勉強していましたが、無事に合格できました。ポイントは、過去問をどれだけ解いて理解ができるかだと思います。自分の試験対策を振り返ってみましたが、誰かのお役に立てれば幸いです。
【#16 エンジニア転職学習】Git/Github　add, commitコマンド

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

昨日に引き続きGit基礎に関して進めていきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
昨日学習したGitの基本動作を実際にハンズオンで学習しました。

* **プロジェクトの開始～変更記録　←Topics!!**
* git status / diff / log

# プロジェクトの開始～変更記録
プロジェクトを立ち上げてからcommitして変更履歴を記録するまでの流れです。

1. 任意のディレクトリで`git init`コマンドを実行　.git Dirが作成される（GitHub上にあるプロジェクトから開始する場合は`git clone URL`）
1. ディレクトリ内のファイルを編集、保存
1. 作業中のディレクトリで`git add .`　インデックスをステージに記録
1. 変更を記録したいディレクトリに移動 `git commit`を実行
1. 登録しているエディタ先でメッセージを入力、保存
1. 閉じるとターミナルにcommit内容が表示されている


使用している教材はこちら↓


https://www.udemy.com/course/unscared_git/


# おわりに
最後までお読みいただきありがとうございました。
しばらくはGit基礎をやっていきます。
アドバイス・応援コメント等いただけますと幸いです。
【Go-sqlx】INSERT、UPDATEなどでプレースフォルダを使う時に、構造体に`db:***`タグを打てばそのまま使える


[前回の記事](https://qiita.com/rikimaru-odd-person/items/4151b6c94c0f48882e9c)では、sqlxライブラリでプレースフォルダを使ったINSERTする際に、
`map[string]interface{}`
を使ってましたが、職場の人から「構造体でもできる」ということを教わりました。

今回はそのメモです。

### まずはおことわり
 - ｢使えればいい｣レベルでの内容ですので、セキュリティやコード品質は無視しております。ご了承ください。

### 結論から
 - INSERT,UPDATEに使用するための構造体を用意する。
 - 構造体に`db:"カラム名"`タグを明記しておく。
 - SQL側でのプレースフォルダの変数名は構造体タグ`db:"カラム名"`の「カラム名」と同じにする。
 - あとは通常通りNamedしたり、NamedExecして実行する。

構造体のタグ`db:"カラム名"`はSELECT文の受け手となる構造体を定義するときに使われますが、INSERT,UPDATEのプレースフォルダにも使えることを今回初めて知りました。

### 例題のソース
https://github.com/rikimaru-tokyo/gin_sqlx_lesson02


### 実例 INSERTの場合

```go
// INSERTに値を入れるための構造体
type HogeTableIn struct {
	ID       int    `db:"id"`
	Name     string `db:"name"`
	Birthday string `db:"birthday"`
}

// INSERT SQLを定義する。
// プレースフォルダの変数名は構造体のタグ`db:"***"`で定義した名称と同じにする。
sql := `INSERT INTO hoge_table (id, name, birthday) VALUES (:id, :name, :birthday);`

// 構造体を宣言し、値を詰めておく。
in := HogeTableIn{
	ID:       1,
	Name:     "alpha",
	Birthday: "2022-01-23",
}

db := {sqlxでDBに接続してハンドルを受け取る}
_, err := db.NamedExec(sql, in)

if err != nil {
	return err
}

```

### 実例 UPDATEの場合

```go

// UPDATEに値を入れるための構造体
type HogeTableIn struct {
	ID       int    `db:"id"`
	Name     string `db:"name"`
}

// UPDATE SQLを定義する。
// プレースフォルダの変数名は構造体のタグ`db:"***"`で定義した名称と同じにする。
sql := `UPDATE hoge_table SET name = :name WHERE id = :id;`

// 構造体を宣言し、値を詰めておく。
in := HogeTableIn{
	ID:   1,
	Name: "bravo",
}

db := {sqlxでDBに接続してハンドルを受け取る}
_, err := db.NamedExec(sql, in)

if err != nil {
	return err
}

```



### 実例 バルクインサートも出来ます。

```go
type HogeTableIn struct {
	ID       int    `db:"id"`
	Name     string `db:"name"`
	Birthday string `db:"birthday"`
}

sql := `INSERT INTO hoge_table (id, name, birthday) VALUES (:id, :name, :birthday);`

// 構造体配列を宣言し、値を詰めておく。
in := []HogeTableIn{
	{
		ID:       2,
		Name:     "charlie",
		Birthday: "2022-04-05",
	},
	{
		ID:       3,
		Name:     "delta",
		Birthday: "2022-06-07",
	},
}

db := {sqlxでDBに接続してハンドルを受け取る}
_, err := db.NamedExec(sql, in)

if err != nil {
	return err
}

```




-----
以上となります。
2022年のPythonの組み込みvenvツールについて


・Pyenv：プロジェクトごとの仮想環境のコンテキスト外で、コマンドラインでさまざまなPythonエディションを使用する場合に便利です。
・Pipenv：Pipenvは、仮想環境とプロジェクトの依存関係管理ツールとして使えます。ただし、Pipenvはどのような形式のパッケージ化についても対応している訳ではないです。そのため、最終的にPyPIにアップロードしたり、他の人と共有したりするプロジェクトには理想的ではありません。
Poetry：Pipenvのツールセットを拡張したPoetryは、プロジェクトと要件を管理するだけでなく、プロジェクトをPyPIに簡単にデプロイする事が可能です。
PDM：最も最先端のプロジェクトです。PoetryやPipenvと同様に、PDMは、プロジェクトをセットアップし、その依存関係を管理し、そこから配布アーティファクトを構築するための単一のインターフェースを提供します。
Windows の Curl で LINE WORKS にメッセージ送信 (LINE WORKS API 2.0)

## Windows の Curl で LINE WORKS にメッセージ送信

Windows の Curl で LINE WORKS のトーク BOT API を用いて、任意のメンバーやトークルームにメッセージを送る方法です。

## 事前作業

LINE WORKS でトークボット API を利用するため、LINE WORKS の Developer Console と管理画面で API 2.0 や Bot の設定を行ってください。

## トーク Bot API によるメッセージ送信

LINE WORKS の API 2.0 の トーク Bot API の解説はこちらのページです。
https://developers.worksmobile.com/jp/reference/bot?lang=ja


{Token} → トークンを入力
{botId} → botId を入力
{userId} → 送信先の userId を入力

```
curl -d "{\"content\" :{\"type\":\"text\",\"text\":\"<メッセージ>\"}}" -H "Content-Type: application/json" -H "Authorization: Bearer <Token>" -X POST https://www.worksapis.com/v1.0/bots/<botId>/users/<userId>/messages
```

以上です。
zsh: command not found: ls　について

# ※あくまで私の場合です。
こちらを参考に自身のメモを加えました。
https://qiita.com/yamauchi_k/items/0f17442bee61b8a921fa

## 何が起こったのか
コマンド設定のため、$PATHを弄ってたら、見たことないエラー文が出てきました。
```
$ ls
zsh: command not found: ls
```
え？
なんですか？
まさか、PC壊れた？？？

そんなことないです。
一旦＄PATHを確認して見ましょう。
```
$ echo $PATH
（$ echo $PATH | sed -e "s/:/\n/g"）
/Users/$HOME/.nodebrew/current/bin
```
明らかにおかしいですね。

Finderでホームディレクトリの下、 ".zshrc"ファイル を確認しましょう。
``` $HOME/.zshrc
...
# nodebrew path
export PATH="$HOME/.nodebrew/current/bin"
...
```
ってなってました。笑

## 解決方法
正しいのは、
``` $HOME/.zshrc
...
# nodebrew path
export PATH="$HOME/.nodebrew/current/bin:$PATH"
...
```
もしくは、
``` $HOME/.zshrc
...
# nodebrew path
export PATH="$PATH:$HOME/.nodebrew/current/bin"
...
```
「$PATH」を書く位置は実行の優先順位によって変えてください。

確認すると、
```
$ source $HOME/.zshrc
$ ls
Applications/
Desktop/
Documents/
Downloads/
...
($ echo $PATH)
$ echo $PATH | sed -e "s/:/\n/g"
/Users/$HOME/.nodebrew/current/bin
/usr/local/bin
/usr/local/sbin
/usr/bin
/bin
/usr/sbin
/sbin
...
```
できました！

## まとめ
今回のミスは直前にzshrcファイルを弄っていて起きた事故です。
気をつけます。。。
terraform moved blockでファクタリングする

下記のように配列で作成したリソースはvariableを変更した際、配列を再作成してしまいます。
これをfor_eachでリファクタリングする際、手作業やterraform state mvで１つづつterraform.tfstateを更新するのですが、moved blockを使用すれば考えることを減らしてリファクタリングできます。


- befor
```route53_record.tf
data "aws_elb_hosted_zone_id" "main" {}

resource "aws_route53_record" "test_record" {
  count   = length(var.test_recors)
  zone_id = data.aws_route53_zone.selected.zone_id
  name    = element(var.test_recors, count.index)
  type    = "A"
  alias {
    name                   = var.test_elb_dns_names
    zone_id                = data.aws_elb_hosted_zone_id.main.id
    evaluate_target_health = true
  }
}
```
```variables.tf
variable "test_recors" {
  type = list(any)

  default = [
    "test1.xxxx.jp",
    "test2.xxxx.jp",
    "test3.xxxx.jp"
  ]
}
variable "test_elb_dns_names" {
  type = list(any)

  default = [
    "awseb-AWSEB-xxxxxxx-xxxxxxx.ap-northeast-1.elb.amazonaws.com"
  ]
}
```

- after
```route53_record.tf
data "aws_elb_hosted_zone_id" "main" {}

moved {
  from = aws_route53_record.test_record[0]
  to   = aws_route53_record.test_newrecord["test1.xxxx.jp"]
}
moved {
  from = aws_route53_record.test_record[1]
  to   = aws_route53_record.test_newrecord["test2.xxxx.jp"]
}
moved {
  from = aws_route53_record.test_record[2]
  to   = aws_route53_record.test_newrecord["test3.xxxx.jp"]
}

resource "aws_route53_record" "test_newrecord" {
  zone_id = data.aws_route53_zone.selected.zone_id

  for_each = var.test_newrecords

  name = each.value.fqdn
  type = "A"

  alias {
    name                   = var.test_elb_dns_names
    zone_id                = data.aws_elb_hosted_zone_id.main.id
    evaluate_target_health = true
  }
}
```

```variables.tf
variable "test_newrecords" {
  type = map(any)

  default = {
    test1 = {
      fqdn = "test1.xxxx.jp"
    }
    test2 = {
      fqdn = "test2.xxxx.jp"
    }
    test3 = {
      fqdn = "test3.xxxx.jp"
    }
  }
}

variable "test_elb_dns_names" {
  type = list(any)

  default = [
    "awseb-AWSEB-xxxxxxx-xxxxxxx.ap-northeast-1.elb.amazonaws.com"
  ]
}
```

- planで変更がされていることを確認し、applyで適用する。

```bash
$ terraform plan
  # aws_route53_record.test_record[0] has moved to aws_route53_record.test_newrecord["test1.xxxx.jp"]
.
.
.
```

- terraform.tfstate更新後はmoved blockは不要なので削除します。
ChefのBerksfile.lockを作成する方法

## はじめに
ChefのBerksfile.lockを作成する方法について備忘録として残しておきます。

## Berksfile/Berksfile.lockについて

|  ファイル  | 説明   |
| ---- | ---- |
|  Berksfile  |  cookbookを使用するために必要なソースと依存関係のセットを記述したファイル  |
|  Berksfile.lock  | cookbookのバージョンを固定するためのファイル  |

## Berksfile.lockの作成方法
※berkshelfがPCにインストール済みであることが前提の内容になります。

### Berksfileの設定
cookbookを配置しているディレクトリに以下のようなファイルを作成する。
※今回はtd-agentのバージョン`3.2.0`のcookbookを設定します。

```ruby:Berksfile
source 'https://supermarket.chef.io'

cookbook 'td-agent', '~> 3.2.0'
```

### berk installの実施
`berks install`を実施する。

```zsh:コマンド
berks install
```

```zsh:実行例
% berks install
Resolving cookbook dependencies...
Fetching cookbook index from https://supermarket.chef.io...
Installing apt (7.4.2)
Installing td-agent (3.2.0)
Installing yum (7.4.0)
%
```

### Berksfile.lockの確認
`Berksfile`を配置しているディレクトリの中に`Berksfile.lock`が存在することを確認。

```zsh:Berksfile.lockの場所
% ls -l
total 40
-rw-r--r--  1 ma-sato  staff    70  7  1 21:05 Berksfile
-rw-------  1 ma-sato  staff   127  7  1 21:06 Berksfile.lock ← これ
-rw-r--r--  1 ma-sato  staff    70  6 25 14:47 LICENSE
-rw-r--r--  1 ma-sato  staff  1349  6 25 14:47 README.md
-rw-r--r--  1 ma-sato  staff  1252  6 25 14:47 chefignore
drwxr-xr-x  4 ma-sato  staff   128  6 25 14:47 cookbooks
drwxr-xr-x  4 ma-sato  staff   128  6 25 14:47 data_bags
drwxr-xr-x  3 ma-sato  staff    96  6 25 14:47 policyfiles
%
```

```ruby:Berksfile.lockの内容
% cat Berksfile.lock
DEPENDENCIES
  td-agent (~> 3.2.0)

GRAPH
  apt (7.4.2)
  td-agent (3.2.0)
    apt (>= 0.0.0)
    yum (>= 0.0.0)
  yum (7.4.0)
%
```

## Berksfile.lockを更新したい場合
`Berksfile`修正後に再度`berks install`を実施すると`Berksfile.lock`を更新することが可能です。

## 参考記事
[About Berkshelf](https://docs.chef.io/workstation/berkshelf/)