OmniAICreator/Qiita-1.07M huggingface dataset:
Workato×RPAで簡易的に反社チェック！iPaaSでアプリ間の連携！

## はじめに

取引をする前に反社チェックすることは重要です。
その企業が実在しているのかなどを確認をしないと取引のリスクが高まる可能性があります。今回はWorkatoを中心として、RPAと各アプリケーションを連携させて反社チェックをする業務フローを紹介します。簡易的な業務フローではありますが、参考にしてみてください。
## 反社チェックの業務フロー

「担当者がGmailを確認し、GoogleForm経由の資料請求お問い合わせが来ていたら、Googleで簡易的に企業の実在性の確認を行い、Salesforceに登録します。その後、社内コミュニケーションツールのSlackで法務へSalesforceの登録情報を連絡します。」

業務フローを箇条書きにすると以下のようになってきます。
①GoogleFormで資料請求お問い合わせを受付
②Gmailで受付通知 
③担当者が受付内容の会社名でGoogle検索
④検索結果一覧から企業の実在性を確認し一次チェック完了
⑤salesforceで取引先登録
⑥法務へSlackで連絡
⑥法務チームが信頼性などの最終チェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570089/8d5007af-2fda-b692-e569-15f39fca60a8.png)

業務フローの中で、担当者による作業が複数発生します。
Gmailの新着メールにGoogleForm経由の問い合わせが来ているか確認し、簡易的にGoogle検索で実在性の確認、salesforceへの登録を行い、最後に法務チームへの報告をしてやっと業務が終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570089/4c8f7e12-879f-4cf9-e68e-a6858bfb2507.png)

担当者が使用するアプリケーションと、業務上の目的は以下の通りとなります。
(Googleformは問い合わせを受け付けたらGmailに通知が来るため省略)

|apps  |目的  |人手作業  |
|---|---|---|
|Gmail|お問い合わせの通知を受け取る |確認する作業  |
|Google(検索)|企業の実在性を確認する  |検索する作業  |
|Salesforce|顧客情報に登録する  |登録する作業  |
|Slack|経理へ連絡する  |連携する作業  |

簡単な業務フローではありますが、担当者による作業に多くの手間がかかります。この業務フローをWorkatoとRPAで自動化すると、担当者に易しい新しい業務フローが設計することができます。

## Workatoでアプリの連携

担当者が各アプリで行っていた作業を、全てWorkatoで繋ぐことで新しい業務フローとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570089/136329a1-7cfe-6bad-1462-21878259d55f.png)

人手作業で行っていたところを全て自動化することができ、担当者はSlackを見ていれば完結してしまう業務フローとなりました。
Gmailから法務チームに連絡するまでの一連の流れは全てWorkato内に収めることが出来ました。

|apps  |目的  |~~人手作業~~ 自動化  |
|---|---|---|
|Gmail|お問い合わせの通知を受け取る |確認する作業  |
|Google(検索)|企業の実在性を確認する  |検索する作業  |
|Salesforce|顧客情報に登録する  |登録する作業  |
|Slack|経理へ連絡する  |連携する作業  |


今回、RPAでは「企業名をGoogleで検索して検索一覧の画像を取得」と、とても簡易的な情報を取得しています。
**RPAを使用することで、API連携が出来ない反社チェックツールを操作することも可能です。（API連携が出来るのであれば、RPAを使わずにWorkatoのみでも対応できる)**

Workatoでは以下のような処理を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570089/2b085c89-16b9-8f34-3ca2-c4b5c2c57642.png)

WorkatoはGmailの新着メールを監視して、Googleformからの通知があったらRPAに検索指示を与えます。
RPAが検索を終えたらWorkatoは結果をSlackで通知し、担当者による簡易的な確認を待ちます。
担当者がSlack上のボタンを押すことで、Workatoはsalesforceの登録処理を行います。登録処理が済んだら法務チームへ通知します。
簡易的な確認以外は全てWorkatoで行えます。

## おわりに
アプリ間をWorkatoで連携することで、業務フローを自動化できることを紹介しました。Google検索で検索する作業は、クラウドベースで起動指示が出せるRPAを用いています。

RPAで簡易的なGoogle検索を行いましたが、既にRPAを業務上に取り入れている方は、自身のRPA処理に置き換えて、Workatoと連携するイメージをして頂ければと思います。

弊社では、クラウドベースで起動指示が出せるRPAとして、UiPathを使用しました。次回はWorkatoとUiPathを連携するための設定方法などを紹介させて頂きます。

[弊社の概要と記事一覧はこちらからどうぞ](https://qiita.com/organizations/bstylevt/profile)
Dockerイメージをtarファイルで渡して起動する

# はじめに
dockerが入っているインターネットに出られないマシンで、新たに外からイメージを取得してコンテナを起動したいときに手っ取り早くtarファイルでイメージを渡してそのファイルからイメージを読み込みコンテナを起動する方法を紹介します。
LAN内に外に出られるコンテナイメージリポジトリがあれば良いですが、リポジトリの管理も手間ではあるためコンテナを起動したいマシンが少ない場合はこちらの方法の方が楽かもしれません。

# 必要なもの
- gzip
- docker
- ファイルをマシンへ送信する手段(scpなど) 

# Imageをtarファイルにする
こちらは外(インターネット)に抜けられるマシンで作業します。  
必要なイメージを外からPullし、tarファイルにします。
```sh
# コンテナイメージをPull
$ docker pull ubuntu:22.04

# Pullしたイメージをtarファイルに
$ docker save ubuntu:22.04 | gzip > ubuntu_22.04.tar.gz
```


# tarファイルからImageを読み込み、コンテナを起動
こちらは外に抜けられないマシンで作業します。事前に先ほど作成したtarファイルをマシンに配置しておいてください。  
```sh
# イメージの読み込み
$ docker load < ubuntu_22.04.tar.gz

# Imageの確認
$ docker image ls
REPOSITORY   TAG      IMAGE ID       CREATED         SIZE
ubuntu       22.04    e4c58958181a   11 days ago     77.8MB

# 読み込んだイメージからコンテナ起動
$ docker run -i -d ubuntu:22.04
```

以上がコンテナイメージをtarファイルにし、そのtarファイルからイメージを読み込み起動する方法となります。  
試した後は必要に合わせてコンテナやイメージの削除など片付けを行って下さい。
Flutter: `<class:Array>': undefined method `deprecator' for ActiveSupport:Module (NoMethodError)

## 環境

- Flutter: 3.13.2
- Cocoapods: 1.13.0
- activesupport: 7.1.1

## 問題

Flutterのバージョンをあげようとしたらエラーが出た。

```
$ pod --version
/Users/ucan/.asdf/installs/ruby/3.2.0/lib/ruby/gems/3.2.0/gems/activesupport-7.1.1/lib/active_support/core_ext/array/conversions.rb:108:in `<class:Array>': undefined method `deprecator' for ActiveSupport:Module (NoMethodError)

  deprecate to_default_s: :to_s, deprecator: ActiveSupport.deprecator
                                                          ^^^^^^^^^^^
Did you mean?  deprecate_constant
	from /Users/ucan/.asdf/installs/ruby/3.2.0/lib/ruby/gems/3.2.0/gems/activesupport-7.1.1/lib/active_support/core_ext/array/conversions.rb:8:in `<top (required)>'
	from <internal:/Users/ucan/.asdf/installs/ruby/3.2.0/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
	from <internal:/Users/ucan/.asdf/installs/ruby/3.2.0/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
	from /Users/ucan/.asdf/installs/ruby/3.2.0/lib/ruby/gems/3.2.0/gems/cocoapods-1.12.1/lib/cocoapods.rb:9:in `<top (required)>'
	from <internal:/Users/ucan/.asdf/installs/ruby/3.2.0/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
	from <internal:/Users/ucan/.asdf/installs/ruby/3.2.0/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:86:in `require'
	from /Users/ucan/.asdf/installs/ruby/3.2.0/lib/ruby/gems/3.2.0/gems/cocoapods-1.12.1/bin/pod:36:in `<top (required)>'
	from /Users/ucan/.asdf/installs/ruby/3.2.0/bin/pod:25:in `load'
	from /Users/ucan/.asdf/installs/ruby/3.2.0/bin/pod:25:in `<main>'
```

- https://github.com/CocoaPods/CocoaPods/issues/12081
- https://github.com/CocoaPods/CocoaPods/pull/12082

IssueやPRを見るとバグを踏んだらしい。
まだリリースされてないけどPRはマージされてるのでCocoapodsｎ次のバージョンで解決しそう。

## 対策

```
$ gem install cocoapods -v 1.12.1
$ gem install activesupport -v 7.0.8
$ gem uninstall activesupport -v 7.1.1
$ pod --version
1.12.1
```

## 参考

https://zenn.dev/kuno/articles/05aa36bf0a79a7
ITのビジネス用語を学びます。

# 初めに
こんにちはiwanagaです。
基本的に現場仕事になれば色々な技術が必要になります。Office系からプログラミング言語等、でも職場で必要な事といえばまずはコミュニケーションです。

なので今まで職場で聞いたワードや色々な人に教えてもらったワードなどまとめてみましたのでご覧ください。よろしくお願いいたします。

# 最近よく聞く用語編
まあまずは最近巷でも聞くような用語をいくつかまとめます。

・AWS
AWSとは『Amazon Web Services（アマゾン ウェブ サービス）』の略称で、名前の通りAmazonが提供しているクラウドのことを指します。

クラウドとは、インターネットを通してサーバーやソフトウエアなどのサービスを使うこと。AWSは世界でもっとも広く使われていると言われ、世界中にあるデータセンターから 175個 以上のサービスが提供されています。

なのでご覧いただいている方々の中にも現場や、あるいはプライベートで使われている方、または気付いたら使っている方もいるかもしれませんので暇があれば調べてみるのもいいかもしれません。

・クラウド
クラウドとは「クラウドコンピューティング」のことで、ユーザーがハードウエアやソフトウエアを購入したり、インストールしたりしなくても、インターネットを通じて受けたいサービスを必要な時に利用できる仕組みを指します。

クラウドサービスのアカウントさえ持っていれば、パソコンやスマートフォンなどのどの端末からでもアクセスでき、利便性に優れています。

最近は物理的にサーバーを保有するより、クラウドを使用しているところも増えているそうです。毎月お金を払えば勝手に最善の環境で最新の状態で使えるのであれば良いですよね。

・SaaS/PaaS/IaaS
SaaS/ IaaS/PaaSとは、クラウドサービスの提供形態を表す言葉です。SaaSはパッケージで発売されるソフトウエアをインターネットを介して利用できるようなサービスで、PaaSはアプリケーションを動かすためのプラットフォームが提供されるサービス。IaaSは情報システムが動くために必要なインフラ（ハードディスクや仮想サーバなど）が提供されるサービスです。

先程からAWSやクラウドで話している事はIaaSの話になります。

# 自分が教えてもらった用語
続いて自分の職場の人や友達に教えてもらった必要であると同時によく聞く用語をまとめます。

・フレームワーク
システム開発をする上で必要な機能がまとまったもの（骨組み）を意味します。
意外とよく聞くので注意です。

・リリース（ローンチ）
リリースとは、新しい商品やサービスの開始を発表することを指します。また、リリースと同じ意味で「ローンチ」という言葉が使われることもあります。ローンチは、その中でも新しいWEBサービスやアプリケーションなど発表する時に使われることが多いです。

場所や人によってはごっちゃになっている人もいますし、ローンチの方がかっこいいと思って使っている人もいますのでローンチは覚えていた方が色々と良いです。

・クライアント
クライアントとはビジネス用語では「顧客」、つまり取引相手のことを意味しますが、IT分野では情報を受け取るコンピューターやソフトウエアのことを表します。

例えばパソコンを使って何か情報を調べるとき、サーバーにアクセスして情報を受けとります。この場合、パソコンがクライアントとなります。

でも人によっては両方の意味でクライアントという言葉を使う人が意外と多く、文脈で察しないといけない時もありますのでご注意ください。

ギャルがどんな時でもマジや、ヤバいって言うくらいは汎用性が地味にあるのでそこはもう察してください。ファイトです。

・キッティング
キッティングとは簡単に言うと「会社が業務に必要な設定をしたPCを社員に提供すること」です。社内でキッティングをするところもあれば、アウトソーシング(外部委託)する会社もあります。

もしこのブログを見ている駆け出しのエンジニアの方々がいらっしゃいましたら、いきなりプログラミングに携わるのは難しいかもしれません。最初に任される仕事は案外こういった作業になることもありますので、用語として覚えとくと良いです。

・コンソール
コンソールとは、ザックリいうと「コンピュータへ指示するための道具」です。
私たちが言葉で「あれして」「これして」と言って通じるのは基本的に人間だけです。ですが、コンピュータにも指示を送って操作できます。その際に用いるのが「コンソール」です。キーボードやディスプレイなどを操作することでコンピュータに指示を伝え、操作することができます。人間の意志をコンピュータに伝えるための入出力装置と覚えてください。

ただこんなまどろっこしく考えなくてもほっとんどの意味でマウスやキーボードです。でもたまに何でもかんでもコンソールという人は事実世の中にいます。揚げ足を取られないように皆様ご注意ください。

・冗長化
冗長化とは、システムや設備について、性能や構成・データの内容などが同一のスペアを準備しておくことです。 冗長化しておくことで、システムや設備に不測の事態があっても、運用や業務を止めることなく復旧や対応をすることができるので、損失などの影響を最小限に抑えることができます。

余談ではありますが昔ソフトバンクの携帯が一時期通信障害で使えなくなったことがありますが、あれは通信局のバックアップがなかったからです。ドコモやauは２つありましたが、」ソフトバンクは一つだけだったのであのような事が起こりました。(今はソフトバンクも2つあるそうです。)

結論、冗長化は必要ですね。

・オフショア
ビジネスにおいて「海外」という意味で使われることが一般的ですが、IT業界においては情報システムやソフトウェアの開発を海外企業や海外支社に委託することを「オフショア開発」と言います。

これを日本人だけの会議で乱発する人もかなりいますのでご注意ください。

# 最後に
ここまで若干愚痴っぽくなりましたがIT用語は本来業務において必要なものです。なぜなら円滑なコミュニケーションは作業の効率性をあげるからです。

しかし相手に伝わらなければ意味はなく、決して知らない人をこき下ろすための道具ではありません。

いつ、どの様に、相手にどう伝わるか、そして本来の意味とITとしての意味がごっちゃになっていないかを考え使用する事がベストかと思います。


参照
https://type.jp/et/feature/15949/
https://ex-ture.com/blog/2018/08/28/mach-it-words/

エンジニアファーストの会社 株式会社CRE-CO　iwanaga
SQLを学びます。②

# 初めに
こんにちはiwanagaです。
今回は前回に引き続きSQLの学習をしていきます。

今回はSQLについて具体的な使用方法や、管理ツールにも触れていきたいと思いますのでよろしくお願いいたします。

# pgAdminについて
前回のブログでSQLはデータベース言語であることは説明させていただきましたが、それをどこで使うか、自分は以前PostgreSQLを使っていたのでPostgreSQLに沿った内容で説明させていただきます。

それではpgAdminは何かというと、PostgreSQL 用の GUI 管理ツールです。pgAdmin 4 を利用すれば、テーブル作成やデータ編集など、PostgreSQL の操作を GUI で行えます。とくにコマンド操作に不慣れなユーザには便利なツールです。

※それでもコマンドを使うときは使うのでご注意ください。

pgAdminのおもな機能は以下のとおりです。

SQL 実行機能
データグリッド表示・編集機能
実行計画グラフィカル表示機能
アクセス権限対話型設定機能
手続き言語 PL/pgSQL デバッグ機能
スキーマ差分管理機能
自動 VACUUM 管理機能
監視ダッシュボード機能
メンテナンス実行機能
ジョブスケジュール実行機能
データベースオブジェクト管理機能

調べただけでもこんなにありますがまだありそうです。
色々考えると混乱するので今回は一番上のSQL実行機能だけ覚えといてください。

なお、pgAdminを使用するにあたって、pgAdminはサーバーなどからデータを抽出し、上書きやデータを閲覧するものになります。なので最新の情報を全体に反映させてたりは出来ず、あくまでローカルでの作業になりますのでご注意ください。

あと余談ですが、pgAdminの強みは色々ありますがオープンソースな事です。
無料なのでSQLやデータベースの勉強をしたいのであればお勧めなので是非とも使ってみてください。

# SQLを実行してみよう
とは言ったものの申し訳ございませんが現在使用しているPCでDLエラーが出てしまったのでまた後日やります💦

ただ以前紹介した4大命令文をテーブル上で実行すれば大体のことはできますのでそのうちやります。

# ACCESSについて
ACCESSとはなにかと言うと、Microsoftが提供するデータベース管理ソフトです。データベース管理ソフトには、いくつか種類がありますが、Accessの場合はデータを表（テーブル）として管理する「リレーショナルデータベース」方式のひとつです。Accessでは、データベースの作成からデータの追加、更新、削除などの機能も備えているので、大規模なデータも取得しやすくデータ分析にも活用できます。

正直言うと自分自身使ってみてpgAdminと利用目的は変わりませんが、メリット、デメリットはあります。

メリット
・Microsoft製品なので汎用性が高く、使っている人が多いので知らない事を聞きやすい。
・元からデータベースのフォーマットがあり、1から作成しやすい。
・レイアウトもリスト形式や帳票形式など色々作りやすい。

デメリット
・操作性はpgAdminの方が分かりやすい。
・開発・運用にプログラミング知識がかなり必要、正直分かりにくい所も多々ある。
・データ容量が少ない(1テーブル2GBまで)
・スマホ利用ができない。

個人的にはpgAdminの方が使いやすいですが、やはりMicrosoft社の製品なのでExcelとの互換性なども考えると一長一短です。用途に合わせて使用する事をお勧めします。

# Oracleについて
Oracle（オラクル）とは、データベース管理システムを中心に業務用のパッケージソフトウェアを開発・販売している企業、また、同社が販売するリレーショナルデータベース管理システム（RDBMS）、「Oracle Database」を指します。

強みとしては有料な分サポートも手厚いですし、LInux、Windows、Macと幅広く対応しているので、お勧めです。

あと何と言っても堅牢性が高いです。災害やシステムトラブルの発生によってデータベースが破損してしまう場合に備え、遠隔地で複製したデータベースを稼働させる「Data Guard」や複数サーバを同時に稼働することでサーバの稼働停止を防ぐ「Real Application Cluster（RAD）」といったあらゆる障害からデータを保護する機能が揃っています。

自分は実は使った事がありませんが割と耳にしますし、シェア率も高いので今度使ってみたいと考えています。



# 最後に
SQLは様々な用途で使われますがあくまでも管理ツールがあってのものです。
今後SQLをどんなに学習してもその知識を活かすためにはツールの操作などをしっかりと覚えていく事が大切になると自分は考えています。

次回は実際に構文を学習していきたいですね。
個人的にはまずは仕事でも任されるであろう基礎中の基礎、SELECT文を学習していきたいと考えていますのでもし宜しければご覧ください。

以上です。

参照
https://hnavi.co.jp/knowledge/blog/access/
https://techmania.jp/blog/oracle0001


エンジニアファーストの会社 株式会社CRE-CO　iwanaga
【PowerAutomateDesktop】SharePointのドキュメントライブラリにファイルをアップロードする



SharePointにはファイルの管理に最適なドキュメントライブラリがあります。

今回はPowerAutomateforDesktopを利用してSharePointのドキュメントライブラリにファイルをアップロードする方法をまとめます。

## 事前準備

SharePoint上で[サイト]を作成してください。

チームサイトとコミュニケーションサイトの違いについては以下を参照してください。
* [SharePoint でチーム サイトを作成する](https://support.microsoft.com/ja-jp/office/sharepoint-%E3%81%A7%E3%83%81%E3%83%BC%E3%83%A0-%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-ef10c1e7-15f3-42a3-98aa-b5972711777d)
* [SharePoint でコミュニケーション サイトを作成する](https://support.microsoft.com/ja-jp/office/sharepoint-%E3%81%A7%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-7fb44b20-a72f-4d2c-9173-fc8f59ba50eb)

また、PowerAutomateforDesktopもインストールしてください。

## PADでファイルをアップロードする

#### 手順①

SharePointにファイルをアップロードするには、ファイルをバイナリデータに変換する必要があります。

[ファイルをバイナリデータに変換]アクションを利用します。

今回はデスクトップに置いたQiita用.xlsxファイルをアップロードしたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/336ccea6-fdc9-2539-c67f-f0ab21eee616.png)

変換されたデータは、`BinaryData`という変数に自動的に格納されます。

#### 手順②

SharePointにアップロードしていきます。

SharePoint>[ファイルの作成]を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/f439c145-9b53-6de1-304a-d2586273e8ed.png)


**サイトのアドレス**：サイトのホームのURLを指定します。∨マークをクリックしてみてプルダウンメニューにサイトが表示されていればそこから選択も可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/d547cda9-41f0-8551-2d73-34c608b8c370.png)

**フォルダーのパス**：サイト上のどこにファイルを作成するかを指定します。今回はドキュメントライブラリにアップロードしたいので、右端のボタンからShared Documentsフォルダを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/0bb1e3b4-079d-1c6d-5dc8-9f19b28caaa1.png)

※今回はExcelファイルのアップロードのため、ドキュメントライブラリ直下に置くことができますが、画像データの場合は置くことができません。画像データをアップロードするためには、事前にドキュメントライブラリの下にサブフォルダを作成し、作成場所にそのフォルダを指定する必要があります。
<br>

**ファイル名**：アップロードするファイルの名前を指定します。ファイル名は拡張子を含めて指定してください。
例)Qiita.xlsx

変数で指定する方法↓
[ファイルパス部分を取得]アクションを利用すると、パスやファイル名、拡張子等をそれぞれ自動的に分類し変数に格納してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/9873c874-71c9-6c51-62dd-c4fa63b9f126.png)

右端の変数ボタンから、`FileName`変数を選択すればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/b8b346ba-3bcb-d7af-f17a-1220e5d342eb.png)



**ファイルコンテンツ**：手順①で生成したバイナリデータが格納されている変数`BinaryData`を指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/d2ef97e5-9a7d-8b44-6eb5-704efd6fb75b.png)


このように設定できれば準備OKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/f86d1c75-e19a-e980-1dd5-2f4e5d913f6d.png)

フローを保存して、[実行]してみましょう。

## 実行結果

ドキュメントライブラリ直下に、ファイルがアップロードされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3069823/c17fc46e-e940-f9d6-198c-e2f34a8355d1.png)


## おわりに

読んでいただきありがとうございました。
お役に立てれば幸いです。
AZ-104試験対策のまとめ「ネットワーク編③」

## はじめに
Microsoft Azure Administrator(AZ-104)合格に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AZ-104取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください

## 試験対策のまとめ
### **Azure Private Link**
VNet内のプライベートエンドポイント経由でAzure PaaSサービスなどと下記がプライベート接続可能
* ExpressRouteプライベートピアリングでオンプレミス
* VPNトンネル経由でオンプレミス
* ピアリングされたVNet

VNetとサービス間のトラフィックはMicrosoftのバックボーンネットワークを通る  
プライベート接続によりデータ漏洩のリスクを防止しデータを保護  
* 参考
    - https://learn.microsoft.com/ja-jp/azure/private-link/private-link-overview
    - https://learn.microsoft.com/ja-jp/azure/expressroute/expressroute-circuit-peerings


## 次の試験対策のまとめ
* **AZ-104試験対策のまとめ「コマンド編」**

https://qiita.com/fsd-jume/items/1b3be351f30df190d1f2

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
アウトプットをたくさんする

## きっかけ
### 転職活動中、個人開発していてなにかアウトプットはありますか？という質問を受ける
しかし、デプロイやリリースしているものは少なくなかなか見せれなかった。

Githubはあるが、何個かリポジトリを作成し個人で開発していたことはあったものの
個人で開発している目的として「勉強し、理解すること」だったため
最終的にリリースはしなかったり、保守しないまま放置してしまい
見せる形になっているアプリがほとんどなかった。

### 以下の記事に出会う

https://zine.qiita.com/interview/interview_udemy_20170906/

他の人に見せる形でのアウトプットの大切さを改めて実感
私もUdemyで学習するが、それに対してのアウトプットができていない。

https://qiita.com/Yametaro/items/a40ffcd65d77ed8b29a0

自分にあった形で自由に書いていくのも大事ではある

## 結

他人に見せることを意識
自分らしく書く
限定共有でも可
学んだことや思ったこと、あとで見返したいことなど

## 今後

週1ペースくらいでなにか書く
自己紹介？
これまでやったことの整理？
【React】React.memo useMemoについて

## コンポーネントのメモ化　memo
親コンポーネントの状態変数である`text`が更新されることで、何も変化が起きていない`Child1`まで余分にレンダリングされてしまう。

```react
const Child1 = () => {
  return (
    <div>
      <p>子コンポーネント1</p>
    </div>
  );
};

export const Parent = () => {
  // 状態変数textが更新される度にParentがレンダリングされる
  // Child1の中身に変化はないが、Child1まで再レンダリングされてしまう
  const [text, setText] = React.useState(''); 

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setText(e.target.value);
  };

  return (
    <div>
      <p>親コンポーネント</p>
      <input type="text" onChange={handleChange} />
      <Child1 />
    </div>
  );
};
```
:::note
React.memoは等価性（値が等価であること）をチェックして再レンダリングの判断をする。前後の値に変化がない場合は再レンダリングされない。
:::
以下の場合、`memo`化している`Child1`はレンダリングされない。
`Child2`は`memo`化していないので、レンダリングされてしまう。
```react
const Child1 = React.memo(() => {
  return (
    <>
      <p>子コンポーネント1</p>
    </>
  );
});

const Child2 = () => {
  return (
    <>
      <p>子コンポーネント2</p>
    </>
  );
};

export const Parent = () => {
  const [text, setText] = React.useState('');

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setText(e.target.value);
  };

  return (
    <div>
      <p>親コンポーネント</p>
      <input type="text" onChange={handleChange} />
      <Child1 />
      <Child2 />
    </div>
  );
};
```

## 複雑な計算処理のメモ化 useMemo
複雑な思い処理をしている場合、親コンポーネントがレンダリングされる度に、計算結果に変化がないにも関わらず、子コンポーネントの重い計算処理を行ってしまうのは無駄なレンダリングになってしまう。

下記の場合
* フォームに入力すると状態変数のtextが変化する。
* すると親コンポーネントがレンダリングされる。
* `doubleCount`という計算処理が再度走る。
* `text`を更新しただけでは、`doubleCount`の計算処理結果は変わらないので、余分な処理になってしまう。

```react
export const Parent = () => {
  const [text, setText] = React.useState('');

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setText(e.target.value);
  };

  const [count, setCount] = React.useState(0);

  // 重い計算処理
  const double = (count: number) => {
    let i = 0;
    while (i < 100000000) i++;
    return count * 2;
  };

  const doubleCount = double(count);

  return (
    <div>
      <p>親コンポーネント</p>
      <input type="text" onChange={handleChange} />
      <p>重い計算処理</p>
      <p>{doubleCount}</p>
      <button onClick={() => setCount(count + 1)}>カウントアップ</button>
    </div>
  );
};
```
:::note
`useMemo`を使用することで、不要な再計算をスキップする。依存配列が更新された場合のみ再計算が実行される。
:::
countが変更される時だけ計算処理が走るようにする、
※軽い処理でメモ化するのは返って悪化するので注意
```react
export const Parent = () => {
  const [text, setText] = React.useState('');

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setText(e.target.value);
  };

  const [count, setCount] = React.useState(0);

  const double = (count: number) => {
    let i = 0;
    while (i < 100000000) i++;
    return count * 2;
  };

  // useMemoを使用することで、依存配列が更新された場合のみ再計算が実行される
  const doubleCount = React.useMemo(() => double(count), [count]);

  return (
    <div>
      <p>親コンポーネント</p>
      <input type="text" onChange={handleChange} />
      <p>重い計算処理</p>
      <p>
        {count}
        {doubleCount}
      </p>
      <button onClick={() => setCount(count + 1)}>カウントアップ</button>
    </div>
  );
};
```


---

参考

https://youtu.be/GvPBr43lJk0?feature=shared
欲しいものを欲しいままに創っている個人開発

私は、自分好みのタスク管理ツールが欲しいと思い、個人開発でタスク管理ツールを開発しています。
今回は、そのアプリに関する話やその経験を通して得た学びを記事にしたいと思います。

### 目次
- [作成したアプリ](#作成したアプリ)
    - [使用技術](#使用技術)
    - [こだわりポイント](#こだわりポイント)
    - [創ってみて](#創ってみて)
- [得られた学び](#得られた学び)
    - [テストの重要性](#テストの重要性)
    - [ブランチ運用の大切さ](#ブランチ運用の大切さ)
    - [ディレクトリ構造の大切さ](#ディレクトリ構造の大切さ)


## 作成したアプリ
今回作成したアプリは、タスクの追加・確認のサポートとタイマー機能がついているアプリです。
私は普段、Notion を使ってタスク管理を行なっています。

https://www.notion.so/ja-jp/

Notion でデータベース機能を使用していますが、基本 PC を用いて操作をしています。
モバイルアプリもありますが、個人的には簡単にタスクを追加するという点では少しハードルがあると感じています。(個人差あります。)
そこで、タスクを追加したい時にサッと追加でき、また、今日のタスクもスマホでサッと確認したいという思いから、Notion API を使用して、スマホからの操作をサポートできるアプリの開発を始めました。
また、私は何か作業をする時は基本ポモドーロテクニックを使用するため、アプリの中にポモドーロタイマー機能も付けました。

以下、このアプリを通してできることです。
- Notion の DB に素早くデータの追加
- Notion の DB で、Date が今日になっているデータの確認
- ポモドーロタイマー
- ポモドーロの時間と内容のログが Google Calendar に残る

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688697/0bcc9942-d064-7097-6d13-a275e01dd785.png" width="240x" />  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688697/29a2ead0-46df-b76e-a3d7-5b4f122117d5.png" width="240x" />


#### 使用技術
このアプリで使用している技術は以下の通りです。
- Next.js
- Chakra UI
- Recoil
- Firebase (Authentication, firesotre)
- Notion API, Google Calendar API
- Vercel
- PWA

このアプリは基本スマートフォンから操作したいので、モバイルネイティブアプリの開発の方が良かったかもしれませんが、自分のスキルスタックと開発スピードを鑑みて、Web で作り、PWA 化することで、スマートフォンからの操作を違和感なく行える様にしました。

#### こだわりポイント
創っていく中で、ポモドーロタイマーの機能を共存させたのがすごく良かったと感じています。
ポモドーロタイマーを使った際は、集中する時間が終わると Google Calendar に作業内容と時間が追加されるようにしました。これで、ある日に何をどれだけ行なったかを後から簡単に確認できます。

また、その作業内容は、タイマーを始める前に自分で入力するか、Notion の DB から取得してきたタスクの中から選ぶか、のどちらかで決めることができます。

<div style="margin: 0 auto;">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688697/cd52bbb2-f14b-0626-1979-76a7757f00be.png" width="240x" /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688697/c8b62eab-66d1-361c-13ca-53057668dbb2.png" width="240x" />
</div>


これが個人的には良い仕組み化になっていて、タスクの中から選ばずに始めようとしているその作業は、本当に優先度高いのか？と一度考えるきっかけになっています。(今日やるべきなら、すでに今日のタスクに入っているのでは？という問いが生まれます。)
何も考えずに好奇心でやりたいことだけ先にやり始めてしまう自分にとってはすごく助かっています。

#### 創ってみて
実際創ってみて、毎日のように使っていて、創って良かったと感じています。
創る前よりは、タスクの管理や消化が効率良くできていると感じています。

## 得られた学び
基本的には自分自身が欲しいアプリを作成しただけですが、その中でも学びがありました。

#### テストの重要性
基本自分しか使わないから... という理由からテストを書くのを少し手を抜きました。
（原因はそれだけではありませんが）その結果、機能を追加すると影響が出て、実際にリリースした後に気付く、といったことが何度かありました。
しっかりと、機能追加の度にテストを書いて、CI で自動化するなど、テスト環境を整えることが大事だと学びました。

#### ブランチ運用の大切さ
この個人開発ではざっくり GitHub-flow をベースに、自分が運用しやすいかたちに変えて開発を行いました。
その結果、後からコードの変更を追いたいときに、機能単位で追うことができて読みやすかったです。
また、開発をする際に出来る限りドキュメントを残しながら開発をしているのですが、こちらも、（ブランチ運用の本質的なメリットではないかもしれませんが）、 1 機能 1 ページで残していくことができ、整理しやすいというメリットもありました。

#### ディレクトリ構造の大切さ
個人開発をしていると、プライベートの時間の都合から開発期間がある程度空いてしまう時があります。
この時にディレクトリを意味のある分け方をしていないと、思い出すのがかなり大変になります。
そのため、ディレクトリ構造は、正しくしておくのが大事だと改めて感じました。


## 最後に
これからも自分が欲しいと思う機能を中心に機能追加していきたいと思っています。
まだまだ、改善すべきところ、追加したい機能がたくさんあるので、引き続き開発していきます。
エンジニア不要時代到来！？ ColabがAIで勝手にコードを書いてくれるようになった

# 文章を打てば勝手にプログラミングしてくれる
日本語や英語の文章でプログラムを生成して実行できるようになった。

<img src=https://user-images.githubusercontent.com/23278992/275662654-fd8e82b5-14a9-46e2-9b48-a0180f5b3e4c.gif>

以下が生成されたコード

```python
# prompt: ２枚の画像をクロスディゾルブで遷移させる動画を作る

import cv2
import numpy as np
import time

# 画像の読み込み
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# 画像のサイズを揃える
img1 = cv2.resize(img1, (img2.shape[1], img2.shape[0]))

# クロスディゾルブのフレーム数を設定
num_frames = 100

# クロスディゾルブの動画を作成
video = cv2.VideoWriter('cross_dissolve.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, (img1.shape[1], img1.shape[0]))

# クロスディゾルブの処理
for i in range(num_frames):
  # アルファ値を計算
  alpha = i / num_frames

  # クロスディゾルブの画像を作成
  cross_dissolve = cv2.addWeighted(img1, alpha, img2, 1 - alpha, 0)

  # 動画に書き込む
  video.write(cross_dissolve)

# 動画を保存
video.release()

# 終了
cv2.destroyAllWindows()
```

以下が生成されたコードを実行してできた動画。
![Oct-17-2023 07-24-55.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/fe54a907-da12-de49-772b-6c74fc333c82.gif)

無料で使えます。

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
改行コードとタイプライターとOSの関係性

業務でたまにこのOSはどの改行コードだったか、わからなくなることがあったので
備忘録作成もかねて少し調べてみました。
# 改行コードとは
改行を示す文字コード、特殊文字のこと。
種類として```CR```、```LF```、```CR+LF```の3つがある。
### CRとLFの意味
```CR```はCarriage Returnを、
```LF```はLine Feedを表す。

それぞれの用語はタイプライターが由来になっていて、
Carriage Returnはキャリッジ(carriage)とよばれる、
紙を固定するシリンダーを先頭に移動させることを意味します。（次の行への移動はしない）

↓左のレバーがCarriage Returnを行うレバー
![Underwoodfive.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2540965/99fe4165-2731-dd6b-06a0-dcc57f9c81a8.jpeg)

Line Feedは印字する紙を１行分送ることを意味します。（文頭への移動はしない）

# OSと改行コード
以下の表のように、OSによってどの改行コードを使用するか決まっています。
| OS | 改行コード |
|:-:|:-:|
|Mac OS (classic)  |CR   |
|Unix, Mac OS X  |LF   |
|Windows   |CRLF   |

なぜOS間で改行コードに違いがあるのか、気になったので調べてみました。
:construction: 　作成中　（調べてもあまりよくわからなかった）
### Mac OS (classic)
### Unix, Mac OS X
### Windows

# 参考文献
https://www.granfairs.com/blog/staff/trivial-of-linefeed-code

https://blog.tokor.org/2015/12/02/%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%AD%B4%E5%8F%B2%E7%9A%84%E8%83%8C%E6%99%AF/
SDメモリカードフォーマッターのインストール

SD メモリカードフォーマッター（以下、SDカードフォーマッター）は、SDカードや microSD カードを初期化するための無料のツールです。この記事では 16 歳の高校生向けに SDカードフォーマッターのインストール手順を説明します。

## SDカードフォーマッターを使う目的
SD カードフォーマッターは以下のような用途で使われます。

### ファイルシステムの修復
SD カードがファイルシステムのエラーや破損によって正しく動作しない場合、SD カードフォーマッタを使用してフォーマットし、ファイルシステムを修復し再構築することができます。

### カードの互換性確認
特定のデバイスやアプリケーションでSDカードを使用する前に、SDカードフォーマッタを使用して適切なファイルシステム（例：FAT32、exFAT）およびクラス（例：SDHC、SDXC）にフォーマットし、互換性を確認することがあります。

### カードの再利用
古いSDカードを再利用する場合、SDカードフォーマッタを使用してカードをクリーンスレートに戻し、新しいデータを保存できるようにします。

## SD カードフォーマッターのシステム要件
SD カードフォーマッターのシステム要件は以下の通りです。

- オペレーティングシステム: Windows（7,8,8.1,10,11）、Mac、Linux
- SDインタフェースデバイス：PCのSDカードスロットまたはUSB SDカードリーダーを使用することができます。

ここでは  SD カードフォーマッター 5.0.2 を例にして Windows 11 へのインストール方法を紹介します。

## SD カードフォーマッターのインストール手順
### ダウンロード
SDアソシエーションの SD カードフォーマッターのページにアクセスします。

[SDメモリカードフォーマッター Windows用](https://www.sdcard.org/ja/downloads-2/formatter-2/sd-memory-card-formatter-for-windows-download/)

![01_officialsite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/e83c4b7e-4f75-76ae-5487-6a062460277b.png)

使用許諾契約の内容を確認して、「**同意します**」をクリックし、ZIPファイルをダウンロードします。

![03_officialsite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/f701ab8c-2378-e247-a734-ef2dc2fc1e9e.png)

### ファイルの展開
ダウンロードが完了したら、ZIP ファイルを適当なフォルダに展開します。

![13_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/06f80afd-c9e4-e144-a472-7972e570aba2.png)

### インストーラの起動
展開したフォルダの中にあるインストーラをダブルクリックします。

![17_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/c6aa1784-9c31-c2bc-89b3-fa0d5fdfd59d.png)

### セットアップ画面の確認
インストーラが起動したら、「**Next**」をクリックします。

![21_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/1afd3f96-c2dc-d77d-fd06-0ccec99262c6.png)

### ライセンスの確認
使用許諾契約の内容を確認して、「**I accept the terms in the license agreement**」を選択し、「**Next**」をクリックします。

![23_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/038789ab-5427-b64b-2241-fdab154e913c.png)

### インストール先の指定
インストール先の指定が表示されたら、「**Next**」をクリックします

![25_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/0fef8e04-346e-b994-d986-4daba51ae0a0.png)

### インストールの確認
インストール準備完了が表示されたら、「**Install**」をクリックします。

![27_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/63f25915-f49a-84e8-9993-427e4490ca47.png)

### ユーザーアカウント制御の確認
ユーザーアカウント制御が表示されたら、「**はい**」をクリックします。

![29_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/e1065e45-fd55-298c-d121-841696ca109a.png)

### インストール終了
インストールが完了したら、「**Finish**」をクリックします。

![31_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/c94ef388-c682-e728-aaa5-ab39ba7ddac8.png)

## SD カードフォーマッターの起動
### ユーザーアカウント制御の確認
ユーザーアカウント制御が表示されたら、「はい」をクリックします。

![33_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/92e21224-eed3-a3b7-eae9-7cd640da31c7.png)

SD カードフォーマッターの画面が表示されたら、インストール作業の完了です。

![41_appli.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/0876ae68-05eb-2482-8434-ee913b8ae040.png)
(デカ文字)ESP32でカラー液晶、温度計を作って遊ぶ4(46を表示の修正箇所)


デカ文字表示を改造する　改造箇所は、こんな感じ
(ソフトウエアシリアルポートの初期設定忘れずに)


参考


https://qiita.com/caa45040/items/2c559267ed93bcd1833c



プログラムは、こんな感じ


```c++


  int d10 = 4;
  int d1  = 6;

//0 0
//1 1
//2 23
//3 4
//4 5
//5 6
//6 7
//7 89
 //             0 1 2 3 4 5 6 7 8 9
 int d_top[] = {0,1,2,2,3,4,5,6,7,7};

//0 0
//1 17
//2 2
//3 35
//4 49
//5 68
 //             0 1 2 3 4 5 6 7 8 9
 int d_bot[] = {0,1,2,3,4,3,5,1,5,4};


//start----------------------------------------------


    //                 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
    //                 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
    //                 -------------------------------
    int henkan1[16] = {0,1,2,3,4,5,6,7,8,9,9,9,9,9,9,9};


    //char ch = pc_getc();
    char ch=0x46;



    d10 = henkan1[   (ch>>4) & 0x0f ];

    d1 = henkan1[    ch     & 0x0f ];


//end----------------------------------------------


  //1文字目の表示
  unsigned char databytesTT_BLACK[(64/8)*64];
  for(int ii=0;ii<((64/8)*64);ii++){
    databytesTT_BLACK[ii] = ~(databytes_top[ ((64/8)* 64 * d_top[d10] )  +ii]);
  }
  display.drawBitmap( 0, 0, databytesTT_BLACK , 64, 64, WHITE);


  for(int ii=0;ii<((64/8)*64);ii++){
    databytesTT_BLACK[ii] = ~(databytes_bot[ ((64/8)* 64 * d_bot[d10] )  +ii]);
  }
  display.drawBitmap( 0, 64, databytesTT_BLACK , 64, 64, WHITE);



  //2文字目の表示
  for(int ii=0;ii<((64/8)*64);ii++){
    databytesTT_BLACK[ii] = ~(databytes_top[ ((64/8)* 64 * d_top[d1] )  +ii]);
  }
  display.drawBitmap( 64+8, 0, databytesTT_BLACK , 64, 64, WHITE);


  for(int ii=0;ii<((64/8)*64);ii++){
    databytesTT_BLACK[ii] = ~(databytes_bot[ ((64/8)* 64 * d_bot[d1] )  +ii]);
  }
  display.drawBitmap( 64+8, 64, databytesTT_BLACK , 64, 64, WHITE);


```
ターミナルエミュレータ Tera Term のインストール

:::note info
ポータブル版 Tera Term のインストール記事はこちらです。
[「ターミナルエミュレータ Tera Term v5 のインストール」](https://qiita.com/mmake/items/f1d7740219ae420b5965)
:::

Tera Term は Windows 用の無料のターミナルエミュレータソフトウェアです。遠隔にあるサーバへのTelnet、SSHなどを介したリモート接続などに使用されます。この記事では 18 歳の新入社員向けに Tera Term のインストール手順を説明します。

## Tera Term を使う目的
Tera Term は以下のような用途で使われます。

### 遠隔にあるサーバーへのアクセス
サーバーやネットワークデバイスにTelnetを介してリモートアクセスするためにTera Termを使用します。

### シリアル通信
シリアルポートを介して組み込みシステムのデバッグやプログラムのアップロード/ダウンロードなどに使用されます。

### セキュアなアクセス
Tera TermはSSHプロトコルをサポートしており、セキュアなリモートアクセスを提供します。パスワードや認証情報の安全性が重要な場面で利用されます。

## Tera Term のシステム要件

Tera Term は Windows 2000 以降の OS で動作します。
ここでは Tera Term v 4.106 を例にして Windows 11 へのインストール方法を紹介します。

## Tera Term のインストール手順
### ダウンロード
窓の杜の Tera Term の紹介ページにアクセスし、「**窓の杜からダウンロード**」をクリックします。
[https://forest.watch.impress.co.jp/library/software/utf8teraterm/](https://forest.watch.impress.co.jp/library/software/utf8teraterm/)

![03_officialsite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/29d0fd67-22dc-edd4-b4f8-c0c234e79068.png)

### インストーラの起動
ダウンロードが完了したら、ファイルをダブルクリックし、インストーラを実行します。

![11_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/93a58eaa-3d3c-ea6b-aa1c-4f6e82076b3f.png)

### ユーザーアカウント制御の確認
ユーザーアカウント制御が表示されたら、「**はい**」をクリックします。

![21_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/6f11a47b-924f-c1ea-d509-8d0da8520068.png)

### セットアップに使用する言語の確認
言語の選択が表示されたら、「**OK**」をクリックします。

![23_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/0c1fe804-393c-13f0-ce30-058f12bdef37.png)

### ライセンスの同意
使用許諾契約の内容を確認して、「**同意する**」を選択し、「**次へ**」をクリックします。

![25_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/e7500a50-7196-0209-8236-fb4b2397cd9f.png)

### インストール先の選択
インストール先の指定が表示されたら、「**次へ**」をクリックします

![27_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/ca536e05-3b0b-65eb-5bbf-7fb8cdff8c53.png)

### インストールする機能の選択
コンポーネントの選択が表示されたら、「**次へ**」をクリックします。

![29_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/a47f9a96-82cb-4ea7-226a-e251fd34f8b2.png)

### 表示言語の選択
言語の選択が表示されたら、「**次へ**」をクリックします。

![31_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/8c6bdcad-621b-d813-fa54-0da940404adf.png)

### プログラムグループの選択
プログラムグループの指定が表示されたら、「**次へ**」をクリックします。

![33_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/c07fa4ed-3d22-8cf5-def2-6f6c4495e161.png)

### 追加タスクの選択
追加タスクの選択が表示されたら、「**次へ**」をクリックします。

![35_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/b5fdc872-d8db-353e-449c-ea8def00a73d.png)

### インストールの確認
インストール準備完了が表示されたら、「**インストール**」をクリックします。

![37_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/bea07efd-92d7-6c36-02d2-d3f685e13ed8.png)

### インストール終了
Tera Term のインストール完了画面が表示されたら、「**完了**」をクリックします。

![41_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3160433/d4538cd6-b63a-bd98-08c2-919666c13688.png)

これでインストール作業の完了です。
2023/10/17主にITとかセキュリティの記事

クラウドに関する記事のまとめ(2023.10.9～2023.10.14）
https://blogs.itmedia.co.jp/business20/2023/10/202310920231014.html?ref=rss

Fortinetの複数製品に緊急の脆弱性、アップデートを(10/15)
https://news.mynavi.jp/techplus/article/20231015-2791390/

「Windows 11」の最新パソコンでもセキュリティソフトは絶対に入れないとダメ？【専門家が解説】(10/14)
https://news.yahoo.co.jp/articles/64e1761d1935bb1165d06bf87df50a0afe821d88?source=rss

枯れた技術を廃止するWindowsはどこへ向かうか - 阿久津良和のWindows Weekly Report(10/15)
https://news.mynavi.jp/article/20231015-windows_report/

新たなサイバー攻撃に注意、Webサイトの404エラーページ使う芸術的な隠蔽工作(10/15)
https://news.mynavi.jp/techplus/article/20231015-2791152/

サンリオで利用者の情報漏えい オンラインショップ(10/14)
https://www.gifu-np.co.jp/articles/-/300503

サンリオで利用者の情報漏えい　オンラインショップ(10/14)
https://news.livedoor.com/article/detail/25167109/

9月のランサムウェア被害、最多はLockBitの72件 - 新たな攻撃グループも登場(10/15)
https://news.mynavi.jp/techplus/article/20231015-2792039/

サイト運営者ができるWordPress保守管理費用の抑え方(10/15)
https://qiita.com/skillsharejp/items/b1930efe4530b5ec0fec

Xの新しい「広告」フォーマットは違法？ 米国で波紋を呼んでいる理由(10/15)
https://wired.jp/article/xs-sneaky-new-ads-might-be-illegal/

ブロックチェーン産業の育成図る日本、吸い込まれる韓国企業(10/15)
https://www.chosunonline.com/site/data/html_dir/2023/10/12/2023101280141.html

分散型金融（DeFi）は「未来の金融」レースに敗れつつある(10/15)
https://www.coindeskjapan.com/204573/

台湾有事のサイバー防衛　官民で脅威除去の体制を
論説主幹　原田亮介(10/15)
https://www.nikkei.com/article/DGXZQOFK081SO0Y3A001C2000000/

中・大型軍艦建造試みる北朝鮮、韓国造船会社にハッキング攻撃集中(10/15)
https://www.afpbb.com/articles/-/3486243?cx_part=top_category&cx_position=3

サイバー空間でも応酬、ハマス対イスラエル戦闘激化　アプリを乗っ取り「核攻撃が来る」と偽警報か　電力公社を攻撃も(10/15)
https://www.zakzak.co.jp/article/20231015-I5LL2MWFPVONRJQQR7TF6TTEQQ/

業務系SaaSへの生成AI組み込みが相次ぐ、大量の学習データで精度向上(10/16)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/08513/

手数料が高過ぎる？　公平・公正な競争環境を目指すスマホの「アプリストア規制」(10/16)
https://xtech.nikkei.com/atcl/nxt/column/18/01679/090700129/
Macの「メモ」アプリのデータを丸ごと移動させる (iCouldや社外アプリを使わない方法)

会社PCの交換時期が来たため、データ引き継ぎ作業関連で、毎回忘れてしまうメモデータの移行方法に関する備忘録

## 背景
- 会社貸与Macのため、iCouldでの共有設定を使うことができない
- 社外ソフトを使うことによる、Confidential情報漏洩の危険性

## やり方
`~/Library/Group Containers/group.com.apple.notes` から
- `NoteStore.sqlite`
- `NoteStore.sqlite-shm`
- `NoteStore.sqlite-wal` 

この3つのファイルを抜き出して、新しいMacに移動させれば、完了

### 補足
もし、メモに画像を含んでいる場合は、`group.com.apple.notes/Accounts/LocalAccount`から`Media`と`Preview`フォルダもコピーする必要があるとのこと。（当方では未検証）

## Reference
https://apple.stackexchange.com/questions/357495/how-to-export-backup-notes-in-macos-in-one-go
ICML2023の量子化論文

# 概要

この記事では、[ICML2023](https://icml.cc/Conferences/2023)の量子化論文を紹介します。[^1]

[^1]: 画像や数式は論文から引用しています。


# Oscillation-free Quantization for Low-bit Vision Transformers

https://proceedings.mlr.press/v202/liu23w.html

- 概要：OFQ. QATにおける重みの振動現象をViTで調べた。
- 研究機関：Meta
- 新規性：Scaling factorの学習が重みの振動を悪化させることを示した。重みのロバスト性の指標StatsQを提案した。
- 評価：DeiT 2bitでSOTA


# SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models

https://proceedings.mlr.press/v202/xiao23c.html

- 概要：SmoothQuant. LLM向け 重み・Activationともに8bitの量子化。
- 研究機関：MIT HanLab
- 新規性：Per-tensorで完全にINT8のみの方法。(Per-channelはハード実装が難しい)
- キモ：Fig. 2と(3)式


# FlexRound: Learnable Rounding based on Element-wise Division for Post-Training Quantization

https://proceedings.mlr.press/v202/lee23h.html

- 概要：PTQにおける丸め学習方法。
- 研究機関：NAVER
- 新規性：画像だけでなく、LLMでもうまく量子化できることを示した。従来のBRECQはスケーリングが固定だったのを可変にした。


# Understanding Int4 Quantization for Language Models: Latency Speedup, Composability, and Failure Cases

https://proceedings.mlr.press/v202/wu23k.html

- 概要：言語モデルのW4A4量子化の成否を調べた。
- 研究機関：Microsoft
- 新規性：Encoderのみ・Encoder-decoderでは精度悪化しないがDecoderのみだと悪くなるなどW4A4量子化の性質を調べた。
- キモ：LayerNormの位置やAttentionの性質ごとに精度悪化を調査した。
TypeError: SaveConfigCallback.__init__() got an unexpected keyword argument 'save_to_log_dir'

# save_to_log_dirがない？？？
SaveConfigCallbackの[ドキュメント](https://lightning.ai/docs/pytorch/2.1.0/api/lightning.pytorch.cli.SaveConfigCallback.html#)を見ると、log_dirに保存するか否かの設定する引数があると書かれているが、なぜかプログラムを実行すると引数がないといわれる。地味にはまったので備忘録として残しておく。

# 解決策
自分が使っているlightningのバージョンが低かっただけだった。
自分が見ていたドキュメントはlightningのバージョンが2.1.0の時のもの。自分が使っていたのはlightningのバージョン2.0.8だった。バージョン2.1.0から新しく追加された引数のようである。lightningのバージョンをアップデートすることで解決できた。
Jetson NanoでF710のジョイスティックをpygameで使う=>pygame==1.9.6

# Jetson NanoでF710のジョイスティックをpygameで使う
## 背景
JetRacerをDonkeycar方式でデータ取れるようにプログラムを作ったが、ある日突然F710のジョイスティックが急にpygameから読み込めなり、デバイス0が読み込めなくなった。
``` python 
import pygame
# pygameの初期化
pygame.init()
# ジョイスティックの初期化
pygame.joystick.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()
```
ちなみに、システムからは読み込めている
``` shell 
ls -l /dev/input/js0
crw-rw-r-- 1 root input 13, 0 10月 17 01:03 /dev/input/js0
```
## 問題
- いつの間にかバージョンアップしてしまったpygameが2.5.0のバージョンになっていた。下記では現時点でpygameは2.5.0が入る。
``` shell
pip install pygame
```

## 解決策
pygameのバージョンを1.9.6に戻す。
仮想環境等に入っている場合は抜けてから実行。
```
pip uninstall pygame
pip install pygame==1.9.6
```
エラーが出る場合は公式からとってきて、ビルドしインストールする。
 https://www.pygame.org/ftp/pygame-1.9.6.tar.gz
```shell
tar zxf pygame-1.9.6.tar.gz
pygame-1.9.6/
python setup.py build
sudo python setup.py install
```

## ジョイスティックインスタンスのinit()が通ればOK！
``` python
import pygame
# pygameの初期化
pygame.init()
# ジョイスティックの初期化
pygame.joystick.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()
```
【Rails】WebアプリにPWAを導入してネイティブアプリっぽくしてみた！

# はじめに
お疲れさまです！
おおくまです！

今回は``Rails``で実装した``Webアプリ``に``PWA``を導入して``ネイティブアプリ``っぽくしてみました！
その際の備忘録になります！

# 環境
:::note
Ruby 3.2.2
Rails 7.0.8
:::

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::


# PWAとは？
``PWA``とは、``「Progressive Web Apps」``の略称で、PCやスマホで``Webアプリ``を表示する際に、``ネイティブアプリ``のような動作を可能にする仕組みのことです！
``PWA``を導入するメリットとして

- ``OS``による制限がないこと
- ``プッシュ通知``を送ることができること
- ホーム画面に``アイコン``を設置できること
- ``Webアプリ``上で``キャッシュ``を使用でき、ローカルの``キャッシュ``に保存できるため、再びアプリを開いた際の読み込みのスピードが従来よりも速くなること

などが挙げられます！

# 実装

まずは、``app/views/layouts/application.html.erb``に以下のように2箇所追記します！

```diff_ruby:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Example</title>
    <%= favicon_link_tag('favicon.ico') %>
+   <link rel="manifest" href="/manifest.json">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag "tailwind", "inter-font", "data-turbo-track": "reload" %>
    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
    <%= javascript_importmap_tags %>
  </head>
  <body>
    <%= render 'shared/header' %>
    <%= yield %>
    <%= render 'shared/footer' %>
  </body>
+ <script>
+   if ('serviceWorker' in navigator) {
+     window.addEventListener('load', () => {
+       navigator.serviceWorker.register('/service_worker.js')
+         .then((registration) => {
+           console.log('Service Worker registered:', registration);
+         })
+         .catch((error) => {
+           console.error('Service Worker registration failed:', error);
+         });
+     });
+   }
+ </script>
</html>
```

<br>

次に``public``下に``manifest.json``というファイルを作成し、以下のように記載します！
アプリ名やカラーなどは自由に変更できます！

```diff_json:public/manifest.json
{
  "name": "Example",
  "short_name": "Example",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#ffffff",
  "icons": [
    {
      "src": "/logo.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/logo.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}
```

<br>

次に``public``下に``service_worker.js``というファイルを作成し、以下のように記載します！

```diff_javascript:public/service_worker.js
const CACHE_NAME = 'example_cache';
const urlsToCache = [
  '/',
];

self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then((cache) => cache.addAll(urlsToCache))
  );
});

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request)
      .then((response) => response || fetch(event.request))
  );
});
```

<br>

最後に``public``下にアイコンに設定したい画像を``logo.png``というファイル名で配置します！

<br>

実装は以上になります！
お疲れさまでした！

# 動作確認

``Webアプリ``にアクセスしてみます！

![スクリーンショット 2023-10-07 5.20.22（2）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3348444/d382a745-58eb-bb26-85ec-cc06885af30e.jpeg)

<br>

``アドレスバー``に``インストールマーク``が出ればOKです！
``インストール``して、使ってみましょう！

<br>

最後まで読んでいただきありがとうございました！
【Linux】/etc/hostsでローカルのDNS設定

# 状況
ローカル環境において、ホスト名（VIP）とIPアドレスの紐付けを行いたい

# 手順
```bash
$ sudo vim /etc/hosts
```
で
```
[紐付けたいIP] [VIP]
```
を追加するだけ。


具体例
```
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost
123.456.789.000 qiita.com
```
これだけ

あとは
```
$ ping [ホスト名]
```
を実行して

```
PING [ホスト名] ([紐付けたIPアドレス]): 56 data bytes

64 bytes from [紐付けたIPアドレス]: icmp_seq=0 ttl=55 time=37.822 ms

64 bytes from [紐付けたIPアドレス]: icmp_seq=1 ttl=55 time=33.661 ms

64 bytes from [紐付けたIPアドレス]: icmp_seq=2 ttl=55 time=29.932 ms

64 bytes from [紐付けたIPアドレス]: icmp_seq=3 ttl=55 time=30.933 ms
```
のような出力を得られればグッド👍疎通確認成功。


最後にホスト名を含んだURLを叩いてページが開けるのを確認しておしまい。

ローカル確認後、`/etc/hosts`の変更を元に戻すのをお忘れなく。




参考　https://wa3.i-3-i.info/word11760.html
初めてのゲームアプリ開発でやってよかったこと・ダメだったこと集

# はじめに
＊元記事は[僕のブログ](https://ducker-tech.com/first-game-dev/)にあります！

こんにちは！
友だちと二人で作ったゲーム「Knowee!」の宣伝も兼ねて、開発の中でやってよかったこと・ダメだったことを書き起こして皆さんに共有できればと思います。


# どんなゲーム？
一言でまとめると、**みんなで遊べるクイズゲーム**です。
ゲームの流れをざっくり説明すると、

1. 各プレイヤーがあらかじめ用意された質問に回答（質問例：あなたの座右の銘は？）
2. 各回答が匿名で表示されるので、誰のものか推測
3. 1と2を何回か繰り返す
4. 自分に対するみんなの理解度が表示される

といった感じです！

待ち時間や、飲み会などでぜひ友だちとプレイしてみてください！
**まだ知らない友だちの一面**が見えるかもしれませんよ！

https://apps.apple.com/jp/app/knowee-みんなの違いが答えのクイズ/id6451428568

宣伝はここまでにして、開発でやってよかったこと・ダメだったことを
まとめていきます。

# やってよかったこと
## デザイン先行の開発
今回の開発では、デザインをある程度固めてからコードを書くようにしました。
そうすることで、**UI関係のコードの修正が少なく済んだ**と思います。
ボタン１つの有無でコードが変わってくるケースもあると思うので、
基本的にはデザインが先にしたほうが良いと思います。

## Firestoreの採用
質問データはFirestoreに格納するようにしました。
**Unity用のFirebase SDKがあり、サンプルコードも充実していたので**採用しました。
普通のSQLデータベースに接続することも可能ではあるのですが、
コードが面倒くさそうだったので、やめておきました。
サンプルコードのコピペだけでいい感じに動いてくれるので、Firestoreオススメです。

https://firebase.google.com/docs/unity/setup?hl=ja

## バックエンドサーバーの構築
課金のレシート検証のためにバックエンドサーバーを構築しました。
これによって、課金処理の安全性が上がり、かつ取引に関するデータをFirestoreに保存できるようになりました。
Unityではクライアント側でレシート検証を完結することもできるのですが、
先述したメリットを考えると、バックエンドサーバーを構築して正解だったと思います。
（だいぶ手間はかかりますが、、）

一応、参考にした記事のURLを載せておきます。

https://qiita.com/mogmet/items/c6f8f4485e4c354a170c

https://developer.apple.com/documentation/appstoreserverapi/get_transaction_info

## 自分のインスタで告知
インスタアカのフォロワーは3桁しか無いのですが、効果はありました。
僕とデザイン担当の友だちがストーリーで告知したところ、
「トリビア」のカテゴリで**120位**になりました。
プライベートアカであっても、効果はあるようなので告知していきましょう！


# ダメだったこと
## iOSのみのリリース
特にマルチプレイゲームで言えることですが、
片方のOSのみでリリースすると、**グループ内で何人か遊べない人がいる状態**になってしまいます。
遊ぼうとしてくれる初期ユーザーがプレイできないのは致命的です。
また、遊べない人に疎外感を与えてしまうので、**とても後悔しています、、**
次からは、何としてでもiOS・Android同時リリースを目指そうと思います。

## 開発前のゲーム設計が甘かった
開発に着手する前、Knowee!の質問はユーザーに作ってもらおうと思っていました。
どういうことかというと、
1. ユーザーの1人に質問を入力してもらう
2. 全員が回答
3. 各回答を匿名で表示して、誰のものか推測してもらう

という流れにしようとしていました。

しかし、このシステムには以下の**弱点がありました。**

- 質問を考える時間のせいで、テンポが悪くなる
- 面白さがユーザーの質問の質に依存する

これに気づいたときには、時すでに遅し。
開発がある程度進んでいたため、**大幅に修正する羽目になりました。**

ゲーム設計をしっかりやってから開発に着手するべきでした。
反面教師として役立てたらうれしいです笑

## 初手でオンラインゲーム
初心者がオンラインゲームを開発するのは、なるべく避けたほうが良いかもしれません。
オンラインゲーム開発は、データのやりとりが一段と難しくなり、バグとの長い闘いになります。
（僕がポンコツ過ぎたのかも）

更に、通信用のサーバーのお金もかかります。
Unityでオンラインといえば、Photonというツールなのですが、
最安プランでも**年間２万円ほど**かかります。
Playfabなど無料のツールもあるにはあるのですが、
**情報量は圧倒的にPhotonの方が多いので**、泣く泣くPhotonにしました。

とはいえ、Photonを使えばかなり快適にオンラインゲームの開発ができるので
満足しています。

https://www.photonengine.com/ja-jp/pun

ゲームアプリをリリースしたことが無い場合は、オフラインのカジュアルゲームを開発することをオススメします。コストがかからないので、コスパ良さそう。

## コード・フォルダなどが整理されていない
個人開発だとテキトーになりがちなコードやフォルダ。
放っておくと大変な目に遭います。

久々にコードを見ると、「何だこれ。」ってなります。
他人のコードを見ると、「何だこれ。」ってなります。

それぞれのコードやフォルダなどに明確な責務がないと、
どんどん生産性が下がります。

Unityで開発していると、オブジェクトも大量に作成するため、
カオスと化します。

開発と整理整頓は同時にコツコツ行うべきでした、、

## タスクの書き起こしをサボった
開発をしていると、開発環境と本番環境で異なるセッティングをする必要が出てきます。
リリース直前のタスクは、気づいたときにすぐToDoリストに書き起こしましょう。

実は、リリース前にApp Store Sever APIのURLの切り替えをやり忘れてしまい、
リリース後に購入エラーを発生させてしまいました、、
切り替えタスクをToDoリストに入れておけば、防げるものでした。

タスク管理はTrelloでやってました。リンク貼っておきます。

https://trello.com/

# まとめ
次の開発からは、タスクの書き起こし、ゲームの設計、整理整頓をもっとしっかりやっていこうと思いました。何か少しでも参考になっていればうれしいです。ここまで読んで頂きありがとうございました！
【AWS SAA-C03】合格したので振り返り

2023年10月14日AWS SAA(C03)を受験して合格したので個人的振り返りを書きます。

## AWS利用状況

データアナリストとして働いています。
AWSを用いてBIツール用DWH/データマートのETLジョブ、AWSアカウント管理等も行っています。
AWS使用歴は2~3年程度です。

主な使用サービスは、頻度順で

- Amazon Athena
- Amazon S3
- AWS Lambda
- AWS IAM
- AWS StepFunctions
- Amazon EventBridge
- AWS CloudFormation
- Amazon SNS
- AWS Glue
- Amazon EC2
- Amazon CodePipeline


な感じです。

## 結果
720点が合格ラインですが、745点で合格しました。ギリギリでした！

![](https://storage.googleapis.com/zenn-user-upload/f63d67b9dc6f-20231016.png)

[AWS Training & Certification](https://www.aws.training/certification)からリンクされている[Credly](https://info.credly.com/)に登録してでかいバッチを画面越しに貰いました。
![](https://storage.googleapis.com/zenn-user-upload/0e0e3045eef3-20231016.png)


## 勉強時間

![](https://storage.googleapis.com/zenn-user-upload/527c4b241675-20231016.png)

[Studyplus](https://www.studyplus.jp/)でメモしています。合計で約47時間でした。
2023年2月~5月がピーク→9月~10月で少しやっていますが、顔写真付きの身分証明書を紛失しており、受験資格が無かったため再発行してから少し勉強しなおして受験しました。

[Peason VUEでは厳しく持ち物や身分証明書をチェックされます](https://www.pearsonvue.co.jp/Test-takers/Tutorial/Identification-1S.aspx)ので、確認したほうが良いと思いました。

### 勉強教材

以下の2点を使いました。

https://book.mynavi.jp/ec/products/detail/id=135344

https://mondai.ping-t.com/g

まずは1点目の本を2週程読んでから、練習問題→Ping-tのAWS SAA向け問題をやりこむといった形です。

Ping-tは無料で数百問の練習問題を解けるのでとてもいいと思いました！解説も丁寧なのでお得！

![](https://storage.googleapis.com/zenn-user-upload/d6e3a29e4f7b-20231016.png)
やりこみとしてはそこそこ。

[本試験の問題に触れることはできません](https://aws.amazon.com/jp/certification/certification-agreement/)がただ、**Ping-tでは長文問題を重点的に問いたほうが良い**です。

## 良かったこと
- ネットワーク周り少しだけ分かった
	- VPC/DNS/データ通信規格など疎いので、この試験を通じてちょっとだけ分かるようになりました。
- 知らないサービスの存在を知ることができた
	- 普段使わないサービスで何ができるかを知ることができました。仕事においても選択肢が増えると思います。
- 自信がつく
	- AWSサービスに対して「とりあえずできるやろ」の精神になりやすくなります。


## その他
- [定期的に受験料が半額になる](https://nokonokonetwork.com/certificate/aws/aws-certified-associate-challenge-description.html)ようで、半額で受験しました。挑戦する方はチェックすると良いと思いました。
- リモートでも受けられますが、[起動しているソフトウェアのチェックや要件がめちゃくちゃ厳しい](https://blog.serverworks.co.jp/aws-certification-remote)です。
  - 私の普段使いのPCだと8つくらいプロセスが引っ掛かりました。諦めて受験会場に赴きました。
- 受験後5営業日以内に結果が届くとありましたが、私は6時間程度で届きました。
DateTime.now!/2を利用して現在時刻を取得する

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回は[DateTime.now!/2](https://hexdocs.pm/elixir/1.15.7/DateTime.html#now!/2)を利用して東京の現在時刻を取得する方法をまとめます。

# 目的
[DateTime.now!/2](https://hexdocs.pm/elixir/1.15.7/DateTime.html#now!/2)を利用して東京の現在時刻を取得します。

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.14.3
Erlang v26.0.2
Phoenix v1.7.3

# DateTime関数群について
Elixirで日付+時間を扱う関数群です。

https://hexdocs.pm/elixir/1.14.3/DateTime.html#content


# 事前準備
ElixirはそのままではUTC以外のタイムゾーンを使用できませんので、新しいElixirプロジェクトを作成し、下記で依存モジュールを追加します。
```diff_elixir:oct16/lib/mix.exs
   defp deps do
     [
+      {:tzdata, "~> 1.1"},
+      {:timex, "~> 3.7"}
     ]
   end
```

```bash:shell
mix deps.get
```

こうすることでUTC以外のタイムゾーンを使用できるようになります。
```bash:shell
iex -S mix
```

```elixir:iex
iex()> Tzdata.zone_list  
["Africa/Abidjan", "Africa/Accra", "Africa/Addis_Ababa", "Africa/Algiers",
 "Africa/Asmara", "Africa/Asmera", "Africa/Bamako", "Africa/Bangui",
 "Africa/Banjul", "Africa/Bissau", "Africa/Blantyre", "Africa/Brazzaville",
 "Africa/Bujumbura", "Africa/Cairo", "Africa/Casablanca", "Africa/Ceuta",
 "Africa/Conakry", "Africa/Dakar", "Africa/Dar_es_Salaam", "Africa/Djibouti",
 "Africa/Douala", "Africa/El_Aaiun", "Africa/Freetown", "Africa/Gaborone",
 "Africa/Harare", "Africa/Johannesburg", "Africa/Juba", "Africa/Kampala",
 "Africa/Khartoum", "Africa/Kigali", "Africa/Kinshasa", "Africa/Lagos",
 "Africa/Libreville", "Africa/Lome", "Africa/Luanda", "Africa/Lubumbashi",
 "Africa/Lusaka", "Africa/Malabo", "Africa/Maputo", "Africa/Maseru",
 "Africa/Mbabane", "Africa/Mogadishu", "Africa/Monrovia", "Africa/Nairobi",
 "Africa/Ndjamena", "Africa/Niamey", "Africa/Nouakchott", "Africa/Ouagadougou",
 "Africa/Porto-Novo", "Africa/Sao_Tome", ...]
```

上記は途中省略されています。全部を見たい方は下記をどうぞ。IO.inspectの途中省略をなしにするオプションです。
(出力結果は長いので書きません。お手元でお試しください)
```elixir:iex
iex()> Tzdata.zone_list |> IO.inspect(limit: :infinity, printable_limit: :infinit)
```

タイムゾーン一覧に`"Asia/Tokyo"`も入っています。[^0]
```elixir:iex
iex()> Tzdata.zone_list |> Enum.filter(& String.contains?(&1, "Asia/Tokyo"))   
["Asia/Tokyo"]
```

# 日本の現在時刻を取得してみる
```elixir:iex
iex()> DateTime.now!("Asia/Tokyo")
#DateTime<2023-10-17 00:22:57.889440+09:00 JST Asia/Tokyo>
```

ばっちり取得できていますね！[^1]

# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian

[^0]: https://qiita.com/piacerex/items/6479e1b9ba5a6cef55ce
タイムゾーンを検索する方法を参考にさせていただきました。

[^1]:もう一つ、タイムゾーンを持たないNaiveDateTime(~Nシギル)というものがあり、こちらのほうが何かと使いやすいらしいのですが、それは別記事に分けようと思います。

[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！